From dd49ba357bf0c2e2c8710d427b2ce815f9ff5850 Mon Sep 17 00:00:00 2001
From: julliechaumard
Date: Tue, 28 Feb 2023 01:15:30 +0100
Subject: [PATCH] commit
---
.gitignore | 5 +
app.js | 123 +
...db8ibp2nl5.apps.googleusercontent.com.json | 1 +
...vdrdlrl1kd.apps.googleusercontent.com.json | 1 +
combined.log.2023-02-26 | 18 +
controllers/adhesionController.js | 2429 +++++++++++++++++
controllers/rassemblementController.js | 822 ++++++
controllers/stagenatController.js | 1633 +++++++++++
inscriptionsafps-53b60452f63d.json | 12 +
modules/adhesion/carte_adherent.js | 55 +
package.json | 47 +
...iechaumard.paris_adhesion_2223_attente.pdf | Bin 0 -> 15895 bytes
...ishop@icloud.com_adhesion_2223_attente.pdf | Bin 0 -> 15681 bytes
.../lulliabo@icloud.com_adhesion_2223_don.pdf | Bin 0 -> 15020 bytes
...lullishop@icloud.com_adhesion_2223_don.pdf | Bin 0 -> 15057 bytes
...ulliabo@icloud.com_adhesion_2223_payee.pdf | Bin 0 -> 15217 bytes
...llishop@icloud.com_adhesion_2223_payee.pdf | Bin 0 -> 15253 bytes
pdf/template/carte_adherent.html | 344 +++
pdf/template/don_justificatif.html | 316 +++
public/css/app.css | 1450 ++++++++++
public/css/app.css.map | 1 +
public/fonts/cabin_bold.ttf | Bin 0 -> 102476 bytes
public/fonts/cabin_bolditalic.ttf | Bin 0 -> 103948 bytes
public/fonts/cabin_italic.ttf | Bin 0 -> 103544 bytes
public/fonts/cabin_medium.ttf | Bin 0 -> 105060 bytes
public/fonts/cabin_mediumitalic.ttf | Bin 0 -> 104932 bytes
public/fonts/cabin_regular.ttf | Bin 0 -> 104776 bytes
public/fonts/cabin_semibold.ttf | Bin 0 -> 104932 bytes
public/fonts/cabin_semibolditalic.ttf | Bin 0 -> 106184 bytes
public/fonts/montserrat_black.ttf | Bin 0 -> 198416 bytes
public/fonts/montserrat_blackitalic.ttf | Bin 0 -> 202816 bytes
public/fonts/montserrat_bold.ttf | Bin 0 -> 198612 bytes
public/fonts/montserrat_bolditalic.ttf | Bin 0 -> 203024 bytes
public/fonts/montserrat_extrabold.ttf | Bin 0 -> 198688 bytes
public/fonts/montserrat_extrabolditalic.ttf | Bin 0 -> 203000 bytes
public/fonts/montserrat_extralight.ttf | Bin 0 -> 198300 bytes
public/fonts/montserrat_extralightitalic.ttf | Bin 0 -> 202880 bytes
public/fonts/montserrat_italic.ttf | Bin 0 -> 202912 bytes
public/fonts/montserrat_light.ttf | Bin 0 -> 198576 bytes
public/fonts/montserrat_lightitalic.ttf | Bin 0 -> 203032 bytes
public/fonts/montserrat_medium.ttf | Bin 0 -> 198616 bytes
public/fonts/montserrat_mediumitalic.ttf | Bin 0 -> 203024 bytes
public/fonts/montserrat_regular.ttf | Bin 0 -> 198552 bytes
public/fonts/montserrat_semibold.ttf | Bin 0 -> 198720 bytes
public/fonts/montserrat_semibolditalic.ttf | Bin 0 -> 203172 bytes
public/fonts/montserrat_thin.ttf | Bin 0 -> 197968 bytes
public/fonts/montserrat_thinitalic.ttf | Bin 0 -> 202452 bytes
public/fonts/playfairdisplay_black.ttf | Bin 0 -> 211776 bytes
public/fonts/playfairdisplay_blackitalic.ttf | Bin 0 -> 209992 bytes
public/fonts/playfairdisplay_bold.ttf | Bin 0 -> 213592 bytes
public/fonts/playfairdisplay_bolditalic.ttf | Bin 0 -> 215008 bytes
public/fonts/playfairdisplay_italic.ttf | Bin 0 -> 213028 bytes
public/fonts/playfairdisplay_regular.ttf | Bin 0 -> 210208 bytes
public/fonts/sourceserifpro_black.ttf | Bin 0 -> 228660 bytes
public/fonts/sourceserifpro_blackitalic.ttf | Bin 0 -> 169668 bytes
public/fonts/sourceserifpro_bold.ttf | Bin 0 -> 229740 bytes
public/fonts/sourceserifpro_bolditalic.ttf | Bin 0 -> 172748 bytes
public/fonts/sourceserifpro_extralight.ttf | Bin 0 -> 223716 bytes
.../fonts/sourceserifpro_extralightitalic.ttf | Bin 0 -> 168132 bytes
public/fonts/sourceserifpro_italic.ttf | Bin 0 -> 169568 bytes
public/fonts/sourceserifpro_light.ttf | Bin 0 -> 227764 bytes
public/fonts/sourceserifpro_lightitalic.ttf | Bin 0 -> 171544 bytes
public/fonts/sourceserifpro_regular.ttf | Bin 0 -> 226812 bytes
public/fonts/sourceserifpro_semibold.ttf | Bin 0 -> 229596 bytes
.../fonts/sourceserifpro_semibolditalic.ttf | Bin 0 -> 172816 bytes
public/fonts/ubuntu-moyen_italique.ttf | Bin 0 -> 366992 bytes
public/fonts/ubuntu_bold.ttf | Bin 0 -> 333612 bytes
public/fonts/ubuntu_courant.ttf | Bin 0 -> 353824 bytes
public/fonts/ubuntu_fin.ttf | Bin 0 -> 240020 bytes
public/fonts/ubuntu_leger.ttf | Bin 0 -> 415552 bytes
public/fonts/ubuntu_leger_italic.ttf | Bin 0 -> 407728 bytes
public/fonts/ubuntu_moyen.ttf | Bin 0 -> 341324 bytes
public/images/icones/icone_accompagnant.png | Bin 0 -> 19837 bytes
public/images/icones/icone_close.png | Bin 0 -> 7683 bytes
public/images/icones/icone_compte.png | Bin 0 -> 3141 bytes
public/images/icones/icone_house.png | Bin 0 -> 14443 bytes
public/images/icones/icone_infos.png | Bin 0 -> 31142 bytes
public/images/icones/icone_personne.png | Bin 0 -> 1475 bytes
public/images/logos/LogoSuzukiGris.png | Bin 0 -> 11587 bytes
public/js/adhesion/accueil_modal.js | 30 +
public/js/adhesion/adhesion_prof.js | 148 +
public/js/adhesion/form_paiement.js | 73 +
public/js/adhesion/hidden_visible.js | 41 +
public/js/adhesion/professeurs.js | 2176 +++++++++++++++
public/js/app/logger.js | 58 +
.../rassemblementidf_formulaire_personne.js | 142 +
.../stagenational_formulaire_personne.js | 529 ++++
readme.txt | 108 +
routes/adhesionRouter.js | 259 ++
routes/appRouter.js | 30 +
routes/rassemblementRouter.js | 213 ++
routes/stagenatRouter.js | 286 ++
src/scss/app.scss | 36 +
src/scss/base/_colors.scss | 35 +
src/scss/base/_fonts.scss | 171 ++
src/scss/base/_reset.scss | 21 +
src/scss/base/_space.scss | 10 +
src/scss/components/_check_mail.scss | 145 +
src/scss/components/_footer.scss | 23 +
src/scss/components/_header_inscription.scss | 13 +
src/scss/components/_header_tunnel.scss | 13 +
src/scss/components/_inputs.scss | 302 ++
src/scss/components/_savoirplus.scss | 81 +
src/scss/components/_titrepage.scss | 29 +
src/scss/global/_main.scss | 16 +
src/scss/global/_mediaqueries.scss | 23 +
src/scss/templates/_adhesion.scss | 88 +
src/scss/templates/_adhesion_end.scss | 153 ++
src/scss/templates/_adhesion_mail.scss | 12 +
src/scss/templates/_paiement.scss | 237 ++
src/scss/templates/_stageformulaire.scss | 132 +
testapi336520-3105cc3caa46.json | 15 +
.../adhesion_cartes_manuelles.ejs | 79 +
.../adhesion_paiement_annule.ejs | 100 +
.../adhesion_paiement_attente.ejs | 108 +
.../adhesion_paiement_mode_paiement.ejs | 129 +
.../adhesion_paiement_reussi.ejs | 105 +
.../adhesion_paiement_total.ejs | 91 +
.../formulaire_adhesion_choix.ejs | 51 +
.../formulaire_adhesion_famille.ejs | 56 +
.../formulaire_adhesion_mail.ejs | 114 +
.../formulaire_adhesion_observateur.ejs | 70 +
.../formulaire_adhesion_prof.ejs | 94 +
.../formulaire_cartemanuelle_mail.ejs | 95 +
.../template_parts/adhesion_titrepage.ejs | 7 +
views/adhesion/template_parts/check_mail.ejs | 28 +
views/adhesion/template_parts/eleves.ejs | 772 ++++++
.../template_parts/eleves_famille.ejs | 778 ++++++
.../adhesion/template_parts/prof_diplome.ejs | 202 ++
.../template_parts/prof_formation.ejs | 82 +
.../template_parts/prof_infosgenerale.ejs | 87 +
.../page_templates/inscription_accueil.ejs | 77 +
.../app/template_parts/header_inscription.ejs | 20 +
.../page_templates/inscrip_formulaire.ejs | 156 ++
.../inscrip_formulaire_identifier.ejs | 90 +
.../page_templates/paiement_annule.ejs | 61 +
.../page_templates/paiement_reussi.ejs | 115 +
.../rassemblementidf/page_templates/recap.ejs | 155 ++
.../rassemblementidf_titrepage.ejs | 7 +
.../page_templates/inscrip_formulaire.ejs | 177 ++
.../inscrip_formulaire_identifier.ejs | 124 +
.../page_templates/inscription_reussi.ejs | 149 +
.../page_templates/paiement_annule.ejs | 61 +
.../page_templates/paiement_reussi.ejs | 150 +
views/stagenat/page_templates/recap.ejs | 196 ++
.../page_templates/recapssacompte.ejs | 196 ++
.../template_parts/check_identifiant.ejs | 65 +
.../stagenational_titrepage.ejs | 7 +
views/template_parts/footer.ejs | 10 +
views/template_parts/head.ejs | 81 +
views/template_parts/header_tunnel.ejs | 9 +
151 files changed, 17859 insertions(+)
create mode 100644 .gitignore
create mode 100644 app.js
create mode 100644 code_secret_client_222874178146-m2ul49riou277tjl431nbfdb8ibp2nl5.apps.googleusercontent.com.json
create mode 100644 code_secret_client_738202486676-su2vn8602qqfehool3jqkjvdrdlrl1kd.apps.googleusercontent.com.json
create mode 100644 combined.log.2023-02-26
create mode 100644 controllers/adhesionController.js
create mode 100644 controllers/rassemblementController.js
create mode 100644 controllers/stagenatController.js
create mode 100644 inscriptionsafps-53b60452f63d.json
create mode 100644 modules/adhesion/carte_adherent.js
create mode 100644 package.json
create mode 100644 pdf/adhesion/2223/attente/julie@juliechaumard.paris_adhesion_2223_attente.pdf
create mode 100644 pdf/adhesion/2223/attente/lullishop@icloud.com_adhesion_2223_attente.pdf
create mode 100644 pdf/adhesion/2223/don/lulliabo@icloud.com_adhesion_2223_don.pdf
create mode 100644 pdf/adhesion/2223/don/lullishop@icloud.com_adhesion_2223_don.pdf
create mode 100644 pdf/adhesion/2223/payee/lulliabo@icloud.com_adhesion_2223_payee.pdf
create mode 100644 pdf/adhesion/2223/payee/lullishop@icloud.com_adhesion_2223_payee.pdf
create mode 100644 pdf/template/carte_adherent.html
create mode 100644 pdf/template/don_justificatif.html
create mode 100644 public/css/app.css
create mode 100644 public/css/app.css.map
create mode 100755 public/fonts/cabin_bold.ttf
create mode 100755 public/fonts/cabin_bolditalic.ttf
create mode 100755 public/fonts/cabin_italic.ttf
create mode 100755 public/fonts/cabin_medium.ttf
create mode 100755 public/fonts/cabin_mediumitalic.ttf
create mode 100755 public/fonts/cabin_regular.ttf
create mode 100755 public/fonts/cabin_semibold.ttf
create mode 100755 public/fonts/cabin_semibolditalic.ttf
create mode 100644 public/fonts/montserrat_black.ttf
create mode 100644 public/fonts/montserrat_blackitalic.ttf
create mode 100644 public/fonts/montserrat_bold.ttf
create mode 100644 public/fonts/montserrat_bolditalic.ttf
create mode 100644 public/fonts/montserrat_extrabold.ttf
create mode 100644 public/fonts/montserrat_extrabolditalic.ttf
create mode 100644 public/fonts/montserrat_extralight.ttf
create mode 100644 public/fonts/montserrat_extralightitalic.ttf
create mode 100644 public/fonts/montserrat_italic.ttf
create mode 100644 public/fonts/montserrat_light.ttf
create mode 100644 public/fonts/montserrat_lightitalic.ttf
create mode 100644 public/fonts/montserrat_medium.ttf
create mode 100644 public/fonts/montserrat_mediumitalic.ttf
create mode 100644 public/fonts/montserrat_regular.ttf
create mode 100644 public/fonts/montserrat_semibold.ttf
create mode 100644 public/fonts/montserrat_semibolditalic.ttf
create mode 100644 public/fonts/montserrat_thin.ttf
create mode 100644 public/fonts/montserrat_thinitalic.ttf
create mode 100755 public/fonts/playfairdisplay_black.ttf
create mode 100755 public/fonts/playfairdisplay_blackitalic.ttf
create mode 100755 public/fonts/playfairdisplay_bold.ttf
create mode 100755 public/fonts/playfairdisplay_bolditalic.ttf
create mode 100755 public/fonts/playfairdisplay_italic.ttf
create mode 100755 public/fonts/playfairdisplay_regular.ttf
create mode 100644 public/fonts/sourceserifpro_black.ttf
create mode 100644 public/fonts/sourceserifpro_blackitalic.ttf
create mode 100644 public/fonts/sourceserifpro_bold.ttf
create mode 100644 public/fonts/sourceserifpro_bolditalic.ttf
create mode 100644 public/fonts/sourceserifpro_extralight.ttf
create mode 100644 public/fonts/sourceserifpro_extralightitalic.ttf
create mode 100644 public/fonts/sourceserifpro_italic.ttf
create mode 100644 public/fonts/sourceserifpro_light.ttf
create mode 100644 public/fonts/sourceserifpro_lightitalic.ttf
create mode 100644 public/fonts/sourceserifpro_regular.ttf
create mode 100644 public/fonts/sourceserifpro_semibold.ttf
create mode 100644 public/fonts/sourceserifpro_semibolditalic.ttf
create mode 100644 public/fonts/ubuntu-moyen_italique.ttf
create mode 100644 public/fonts/ubuntu_bold.ttf
create mode 100644 public/fonts/ubuntu_courant.ttf
create mode 100644 public/fonts/ubuntu_fin.ttf
create mode 100644 public/fonts/ubuntu_leger.ttf
create mode 100644 public/fonts/ubuntu_leger_italic.ttf
create mode 100644 public/fonts/ubuntu_moyen.ttf
create mode 100644 public/images/icones/icone_accompagnant.png
create mode 100644 public/images/icones/icone_close.png
create mode 100644 public/images/icones/icone_compte.png
create mode 100644 public/images/icones/icone_house.png
create mode 100644 public/images/icones/icone_infos.png
create mode 100644 public/images/icones/icone_personne.png
create mode 100644 public/images/logos/LogoSuzukiGris.png
create mode 100644 public/js/adhesion/accueil_modal.js
create mode 100644 public/js/adhesion/adhesion_prof.js
create mode 100644 public/js/adhesion/form_paiement.js
create mode 100644 public/js/adhesion/hidden_visible.js
create mode 100644 public/js/adhesion/professeurs.js
create mode 100644 public/js/app/logger.js
create mode 100644 public/js/rassemblementidf/rassemblementidf_formulaire_personne.js
create mode 100644 public/js/stagenat/stagenational_formulaire_personne.js
create mode 100644 readme.txt
create mode 100644 routes/adhesionRouter.js
create mode 100644 routes/appRouter.js
create mode 100644 routes/rassemblementRouter.js
create mode 100644 routes/stagenatRouter.js
create mode 100644 src/scss/app.scss
create mode 100644 src/scss/base/_colors.scss
create mode 100644 src/scss/base/_fonts.scss
create mode 100644 src/scss/base/_reset.scss
create mode 100644 src/scss/base/_space.scss
create mode 100644 src/scss/components/_check_mail.scss
create mode 100644 src/scss/components/_footer.scss
create mode 100644 src/scss/components/_header_inscription.scss
create mode 100644 src/scss/components/_header_tunnel.scss
create mode 100644 src/scss/components/_inputs.scss
create mode 100644 src/scss/components/_savoirplus.scss
create mode 100644 src/scss/components/_titrepage.scss
create mode 100644 src/scss/global/_main.scss
create mode 100644 src/scss/global/_mediaqueries.scss
create mode 100644 src/scss/templates/_adhesion.scss
create mode 100644 src/scss/templates/_adhesion_end.scss
create mode 100644 src/scss/templates/_adhesion_mail.scss
create mode 100644 src/scss/templates/_paiement.scss
create mode 100644 src/scss/templates/_stageformulaire.scss
create mode 100644 testapi336520-3105cc3caa46.json
create mode 100644 views/adhesion/page_templates/adhesion_cartes_manuelles.ejs
create mode 100644 views/adhesion/page_templates/adhesion_paiement_annule.ejs
create mode 100644 views/adhesion/page_templates/adhesion_paiement_attente.ejs
create mode 100644 views/adhesion/page_templates/adhesion_paiement_mode_paiement.ejs
create mode 100644 views/adhesion/page_templates/adhesion_paiement_reussi.ejs
create mode 100644 views/adhesion/page_templates/adhesion_paiement_total.ejs
create mode 100644 views/adhesion/page_templates/formulaire_adhesion_choix.ejs
create mode 100644 views/adhesion/page_templates/formulaire_adhesion_famille.ejs
create mode 100644 views/adhesion/page_templates/formulaire_adhesion_mail.ejs
create mode 100644 views/adhesion/page_templates/formulaire_adhesion_observateur.ejs
create mode 100644 views/adhesion/page_templates/formulaire_adhesion_prof.ejs
create mode 100644 views/adhesion/page_templates/formulaire_cartemanuelle_mail.ejs
create mode 100644 views/adhesion/template_parts/adhesion_titrepage.ejs
create mode 100644 views/adhesion/template_parts/check_mail.ejs
create mode 100644 views/adhesion/template_parts/eleves.ejs
create mode 100644 views/adhesion/template_parts/eleves_famille.ejs
create mode 100644 views/adhesion/template_parts/prof_diplome.ejs
create mode 100644 views/adhesion/template_parts/prof_formation.ejs
create mode 100644 views/adhesion/template_parts/prof_infosgenerale.ejs
create mode 100644 views/app/page_templates/inscription_accueil.ejs
create mode 100644 views/app/template_parts/header_inscription.ejs
create mode 100644 views/rassemblementidf/page_templates/inscrip_formulaire.ejs
create mode 100644 views/rassemblementidf/page_templates/inscrip_formulaire_identifier.ejs
create mode 100644 views/rassemblementidf/page_templates/paiement_annule.ejs
create mode 100644 views/rassemblementidf/page_templates/paiement_reussi.ejs
create mode 100644 views/rassemblementidf/page_templates/recap.ejs
create mode 100644 views/rassemblementidf/template_parts/rassemblementidf_titrepage.ejs
create mode 100644 views/stagenat/page_templates/inscrip_formulaire.ejs
create mode 100644 views/stagenat/page_templates/inscrip_formulaire_identifier.ejs
create mode 100644 views/stagenat/page_templates/inscription_reussi.ejs
create mode 100644 views/stagenat/page_templates/paiement_annule.ejs
create mode 100644 views/stagenat/page_templates/paiement_reussi.ejs
create mode 100644 views/stagenat/page_templates/recap.ejs
create mode 100644 views/stagenat/page_templates/recapssacompte.ejs
create mode 100644 views/stagenat/template_parts/check_identifiant.ejs
create mode 100644 views/stagenat/template_parts/stagenational_titrepage.ejs
create mode 100644 views/template_parts/footer.ejs
create mode 100644 views/template_parts/head.ejs
create mode 100644 views/template_parts/header_tunnel.ejs
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..803cfc1
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,5 @@
+node_modules/
+*.env
+logs/
+.DS_Store
+package-lock.json
diff --git a/app.js b/app.js
new file mode 100644
index 0000000..e02b860
--- /dev/null
+++ b/app.js
@@ -0,0 +1,123 @@
+/////////////////////////////////////////////////
+// LOGGING
+/////////////////////////////////////////////////
+const logger = require("./public/js/app/logger");
+
+logger.info('bonjour Julie');
+
+/////////////////////////////////////////////////
+// VARIABLES D'ENVIRONNEMENT
+/////////////////////////////////////////////////
+
+// DOTENV
+// Ne pas utiliser de fichiers .env dans votre environnement de production,
+// mais définir plutôt les valeurs d'environnement sur l'hébergeur
+require('dotenv').config();
+logger.info('process.env.PORT : ' + process.env.PORT);
+
+/////////////////////////////////////////////////
+// APPELS DES MODULES
+/////////////////////////////////////////////////
+
+// EXPRESS
+const express = require('express');
+
+// EXPRESS-SESSION
+const session = require('express-session');
+
+// BODY-PARSER
+//Le package body-parser permet de décomposer les requêtes HTTP POST, PATCH, etc. afin de pouvoir extraire les infoirmations tranmises dans des formulaires. Ces informations apparaissent dans le champ req.body.
+const bodyparser = require('body-parser');
+
+/////////////////////////////////////////////////
+// MIDDLEWARE
+// INITIALISER LES MODULES DANS LE PROJET APP
+/////////////////////////////////////////////////
+
+// EXPRESS
+//// "app" étant la variable qui désigne le projet
+const app = express();
+
+// EXPRESS-SESSION
+var session_cookie = {
+ secret: process.env.COOKIE_SECRET,
+ resave: false,
+ saveUninitialized: false,
+ cookie: {}
+}
+
+logger.info("process.env.ENV : " + process.env.ENV);
+if (process.env.ENV === 'production') {
+ logger.info("express-session secured");
+ app.set('trust proxy', 1); // trust first proxy
+ session_cookie.cookie.secure = true; // serve secure cookies
+}
+
+app.use(session(session_cookie))
+
+// JSON
+//// Read datas on API
+//// needed by Express to read post from HTML Form
+app.use(express.json());
+
+// BODY-PARSER
+//// Pour la méthode post du formulaire
+app.use(bodyparser.urlencoded({ extended: false}));
+app.use(bodyparser.json());
+
+
+
+/////////////////////////////////////////////////
+// PORT D'ÉCOUTE WEB
+/////////////////////////////////////////////////
+
+// port dans variable d'environnement OU (||) par défaut 8888
+const port = process.env.PORT;
+app.listen(port);
+
+/////////////////////////////////////////////////
+// MOTEUR DE TEMPLATE HTML
+/////////////////////////////////////////////////
+
+// appeler le moteur de template html ejs
+app.set('view engine', 'ejs');
+// le répertoire dans lequel se trouvent les fichiers modèles
+app.set('views', './views')
+
+/////////////////////////////////////////////////
+// ASSETS (de Express)
+/////////////////////////////////////////////////
+// donner au programme le nom du dossier où sont les assets (css, image...)
+// Le chemin d’accès que vous fournissez à la fonction express.static est en rapport
+// 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
+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");
+
+// Accueil du site
+// [DOMAIN]/
+app.use("/", appRouter);
+
+// Adhésion
+// [DOMAIN]/inscription adhésion
+app.use("/inscription", adhesionRouter);
+
+// STAGE NATIONAL
+// [DOMAIN]/stagenational
+app.use("/stagenational", stagenatRouter);
+
+// RASSEMBLEMENT IDF
+// [DOMAIN]/rassemblementidf
+app.use("/rassemblementidf", rassemblementRouter);
\ No newline at end of file
diff --git a/code_secret_client_222874178146-m2ul49riou277tjl431nbfdb8ibp2nl5.apps.googleusercontent.com.json b/code_secret_client_222874178146-m2ul49riou277tjl431nbfdb8ibp2nl5.apps.googleusercontent.com.json
new file mode 100644
index 0000000..2ab7570
--- /dev/null
+++ b/code_secret_client_222874178146-m2ul49riou277tjl431nbfdb8ibp2nl5.apps.googleusercontent.com.json
@@ -0,0 +1 @@
+{"web":{"client_id":"222874178146-m2ul49riou277tjl431nbfdb8ibp2nl5.apps.googleusercontent.com","project_id":"testapi336520","auth_uri":"https://accounts.google.com/o/oauth2/auth","token_uri":"https://oauth2.googleapis.com/token","auth_provider_x509_cert_url":"https://www.googleapis.com/oauth2/v1/certs","client_secret":"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","redirect_uris":["https://www.juliechaumard.paris"],"javascript_origins":["https://www.juliechaumard.paris"]}}
\ No newline at end of file
diff --git a/code_secret_client_738202486676-su2vn8602qqfehool3jqkjvdrdlrl1kd.apps.googleusercontent.com.json b/code_secret_client_738202486676-su2vn8602qqfehool3jqkjvdrdlrl1kd.apps.googleusercontent.com.json
new file mode 100644
index 0000000..50491be
--- /dev/null
+++ b/code_secret_client_738202486676-su2vn8602qqfehool3jqkjvdrdlrl1kd.apps.googleusercontent.com.json
@@ -0,0 +1 @@
+{"web":{"client_id":"738202486676-su2vn8602qqfehool3jqkjvdrdlrl1kd.apps.googleusercontent.com","project_id":"inscriptionsafps","auth_uri":"https://accounts.google.com/o/oauth2/auth","token_uri":"https://oauth2.googleapis.com/token","auth_provider_x509_cert_url":"https://www.googleapis.com/oauth2/v1/certs","client_secret":"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","javascript_origins":["https://www.adhesion.afpedagogiesuzuki.fr","http://localhost:8888","https://www.adusuki.juliechaumard.paris"]}}
\ No newline at end of file
diff --git a/combined.log.2023-02-26 b/combined.log.2023-02-26
new file mode 100644
index 0000000..b10a894
--- /dev/null
+++ b/combined.log.2023-02-26
@@ -0,0 +1,18 @@
+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
new file mode 100644
index 0000000..58af46c
--- /dev/null
+++ b/controllers/adhesionController.js
@@ -0,0 +1,2429 @@
+/////////////////////////////////////////////////
+// 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");
+// Déterminer les profils de l'adhésion
+const carte_adherent = require("./../modules/adhesion/carte_adherent");
+
+
+/////////////////////////////////////////////////
+// GOOGLE SHEET PARAMETERS
+/////////////////////////////////////////////////
+const { GoogleSpreadsheet } = require('google-spreadsheet');
+const creds = require('../testapi336520-3105cc3caa46.json');
+// 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');
+
+
+/////////////////////////////////////////////////
+// VARIABLES GLOBALES
+/////////////////////////////////////////////////
+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)
+/////////////////////////////////////////////////
+const checkMail = async function(req, res){
+
+ 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 });
+
+ 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 });
+
+
+
+ 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 });
+
+ // 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;
+
+ 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_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";
+ }
+ }
+
+
+
+ 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
+ moment().format();
+ moment.locale('fr');
+ var date_formattee = moment().format('L');
+ logger.info("date_formattee : " + date_formattee, { numsession: req.session.id });
+
+
+ // CALCUL DU PRIX
+
+ if (adherent_type == "professeur" || adherent_type == "prof_famille" || adherent_type == "prof_stagiaire" || adherent_type == "prof_stagiaire_famille") {
+ adherent_paiement_montant_adhesion = 42;
+ };
+ if (adherent_type == "prof_stagiaire1" || adherent_type == "prof_stagiaire1_famille") {
+ adherent_paiement_montant_adhesion = 22;
+ };
+ if (adherent_type == "famille") {
+ adherent_paiement_montant_adhesion = 22;
+ };
+ if (adherent_type == "observateur") {
+ adherent_paiement_montant_adhesion = 22;
+ };
+ if (adherent_type == "non déterminé" || adherent_type == "") {
+ adherent_paiement_montant_adhesion = 0;
+ };
+ logger.info("CALCUL DU PRIX : " + adherent_paiement_montant_adhesion, { numsession: req.session.id });
+ //passer la variable dans la session pour la récupérer
+ req.session.adherent_paiement_montant_adhesion = adherent_paiement_montant_adhesion;
+
+
+ /////////////////////////////////////////////////
+ // 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 });
+
+
+
+ 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');
+ }
+
+
+}
+
+const post_form_montant_total = async function(req, res){
+
+ logger.info("======================================");
+ logger.info("======== FUNCTION post_form_montant_total ==========");
+ logger.info("======================================");
+
+ // MONTANT TOTAL À PAYER
+
+ //let montant_adhesion = req.session.adherent_paiement_montant_adhesion;
+ req.session.adherent_paiement_montant_don = req.body.adherent_paiement_montant_don;
+ logger.info("req.body.adherent_paiement_montant_don: " + req.body.adherent_paiement_montant_don, { numsession: req.session.id });
+ logger.info("req.session.adherent_paiement_montant_adhesion: " + req.session.adherent_paiement_montant_adhesion, { numsession: req.session.id });
+ // parseInt pour rendre la variable en type interger et faire l'addition
+ let montant_adhesion = parseInt(req.session.adherent_paiement_montant_adhesion);
+ let montant_don = parseInt(req.session.adherent_paiement_montant_don);
+ let montant_apayer;
+ if (montant_don>0){
+ montant_apayer = montant_adhesion + montant_don;
+ logger.info("if (montant_don>0)", { numsession: req.session.id });
+ } else {
+ logger.info("montant_adhesion: " + montant_adhesion, { numsession: req.session.id });
+ montant_apayer = montant_adhesion;
+ logger.info("else (montant_don>0)", { numsession: req.session.id });
+ };
+ req.session.montant_apayer = montant_apayer;
+ logger.info("montant_apayer: " + montant_apayer, { numsession: req.session.id });
+ let montant_apayer_cent;
+ montant_apayer_cent = montant_apayer * 100;
+ req.session.montant_apayer_cent = montant_apayer_cent;
+ logger.info("montant_apayer_cent: " + montant_apayer_cent, { numsession: req.session.id });
+ res.redirect('/inscription/adhesion_paiement_mode_paiement');
+}
+
+/////////////////////////////////////////////////
+// PAGE FINALE PAIEMENT PAR CHÈQUE
+/////////////////////////////////////////////////
+const post_paiement_cheque_save = async function(req, res){
+
+ logger.info("======================================");
+ logger.info("======== FUNCTION post_paiement_cheque_save ==========");
+ 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;
+
+
+ //////////////////////////////////////////////////////////////////////////////
+ // 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: ""
+ };
+
+ 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
+
+ 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'
+ }
+ });
+
+ 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;
+
+ 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
+ }],
+ };
+
+ 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.redirect('/inscription/adhesion_paiement/attente');
+
+}
+
+/////////////////////////////////////////////////
+// PAGE FINALE PAIEMENT PAR VIREMENT
+/////////////////////////////////////////////////
+const post_paiement_virement_save = async function(req, res){
+
+ logger.info("======================================");
+ logger.info("======== FUNCTION post_paiement_virement_save ==========");
+ logger.info("======================================");
+
+
+ //////////////////////////////////////////////////////////////////////////////
+ // 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: ""
+ };
+
+ 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;
+
+ 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
";
+
+ var mailOptions = {
+ from: 'afpedagogiesuzuki@gmail.com',
+ to: req.session.identifiant,
+ subject: mail_objet,
+ html: mail_html,
+ attachments: [{
+ filename: attachment_name,
+ path: pdfname
+ }],
+ };
+
+ transporter.sendMail(mailOptions, function(error, info){
+ if (error) {
+ 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');
+
+}
+
+/////////////////////////////////////////////////
+// REQUÈTE VERS LA SOLUTION DE PAIEMENT STRIPE
+/////////////////////////////////////////////////
+
+const post_req_bank = async function(req, res, next){
+
+ logger.info("======================================");
+ logger.info("======== FUNCTION post_req_bank ==========");
+ logger.info("======================================");
+
+ 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,
+
+ submit_type: 'pay',
+
+ success_url: process.env.STRIPE_SUCCESSURL,
+ cancel_url: process.env.STRIPE_CANCELURL,
+
+
+ payment_method_types: ['card'],
+ line_items: [{
+ price_data: {
+ currency: 'eur',
+ product_data: {
+ name: 'Adhesion annuelle ' + req.session.adherent_type,
+ },
+ unit_amount: req.session.adherent_paiement_montant_adhesion * 100,
+ },
+ quantity: 1,
+ },
+ {
+ price_data: {
+ currency: 'eur',
+ product_data: {
+ name: 'Don',
+ },
+ unit_amount: req.session.adherent_paiement_montant_don * 100,
+ },
+ quantity: 1,
+ }],
+ //Checkout has three modes: payment, subscription, or setup.
+ mode: 'payment'
+
+ });
+
+
+ // STRIPE - ETAPE 2 - RÉCUPÉRATION DES DONNÉES DE LA SESSION ET ENVOYER LE PAIEMENT
+
+ // DANS LES INFOS DE LA SESSION ON A l'URL DE PAIEMENT POUR CETTE SESSION AVEC LE ID DE CE PAIEMENT
+ // 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 });
+
+
+ // 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 {
+ 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');
+ }
+
+ /////////////////////////////////////////////////
+// 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;
+
+ 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'
+ }
+ });
+
+ 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.";
+ }
+ 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');
+ }
+
+
+
+/////////////////////////////////////////////////
+// ENVOI MANUEL CARTE ADHÉSION ET JUSTIFICATIF DE DON (SI DON)
+/////////////////////////////////////////////////
+/////////////////////////////////////////////////
+// SAISIE DU MAIL
+// VÉRIFIER SI DÉJÀ INSCRIT DANS GOOGLE
+/////////////////////////////////////////////////
+const post_cartemanuelle_verifmail_envoicarte = async function(req, res){
+
+ logger.info("======================================");
+ logger.info("======== FUNCTION checkMail ENVOI MANUEL ==========");
+ logger.info("======================================");
+
+ await doc.useServiceAccountAuth(creds);
+ await doc.loadInfo(); // loads document properties and worksheets
+ console.log("NOM FICHIER SHEET: ",doc.title); //nom du fichier
+
+ const sheet = doc.sheetsByTitle['adhesion_annuelle_web'];
+ console.log("NOM DU TABLEAU (ONGLET): ",sheet.title); //NOM DU TABLEAU (ONGLET)
+ console.log("NOMBRE DE LIGNE DU TABLEAU: ",sheet.rowCount); // NOMBRE DE LIGNE DU TABLEAU
+
+ const rows = await sheet.getRows();
+ console.log("rows[0].identifiant: ", rows[0].identifiant);
+
+
+ let compteur = sheet.rowCount - 1;
+ console.log("compteur: ",compteur);
+
+ let rowToBeUpdate = 0;
+
+ // ON RÉCUPÈRE LE MAIL (IDENTIFIANT) SAISIE DANS LE FORMULAIRE
+ req.session.identifiant = req.body.identifiant;
+
+ for (let i=0; i0){
+
+ console.log(rows[rowToBeUpdate].identifiant);
+ console.log(rows[rowToBeUpdate].adherent_type);
+ console.log(rows[rowToBeUpdate].adherent_nom);
+ console.log(rows[rowToBeUpdate].adherent_prenom);
+ console.log(rows[rowToBeUpdate].adherent_paiement_mode);
+ console.log(rows[rowToBeUpdate].adherent_adresse_rue);
+ console.log(rows[rowToBeUpdate].adherent_adresse_codepostal);
+ console.log(rows[rowToBeUpdate].adherent_adresse_ville);
+ console.log(rows[rowToBeUpdate].adherent_paiement_montant_don);
+
+
+ //////////////////////////////////////////////////////////////////////////////
+ // CRÉATION DE LA CARTE D'ADHÉSION EN PDF
+ console.log("PDF CREATION AVANT");
+ var html = fs.readFileSync(path.resolve(__dirname, "../pdf/template/carte_adherent.html"), "utf8");
+ var options = {
+ format: "A4",
+ orientation: "portrait",
+ border: "10mm",
+ };
+ moment().format();
+ moment.locale('fr');
+ var date_formattee = moment().format('L')
+ var today = date_formattee;
+
+ //////////////////////////////////////////////////////////////////////////////
+ // DÉFINIR LE PROFIL À AJOUTER DANS LA CARTE ADHÉRENT
+ // La fonction "profil" est dans le fichier /modules/adherent_type.js
+ let adherent_type = rows[rowToBeUpdate].adherent_type;
+ profils = carte_adherent.profil(adherent_type);
+ profil1 = profils[0];
+ profil2 = profils[1];
+ profil3 = profils[2];
+ console.log("profil1 = ",profil1);
+ mode_paiement = "Adhésion payée par ";
+ mode_paiement += rows[rowToBeUpdate].adherent_paiement_mode;
+ var membres = [
+ {
+ today: today,
+ description: "Votre carte d’adhérent à l’Association Française pour la pédagogie Suzuki",
+ identifiant: rows[rowToBeUpdate].identifiant,
+ profil1: profil1,
+ profil2: profil2,
+ profil3: profil3,
+ type_card: "ADHÉRENT",
+ adherent_paiement_mode: mode_paiement
+ },
+ ];
+
+ var pdfname = path.resolve(__dirname, "../pdf/adhesion/2223/payee/");
+ pdfname += "/";
+ //var pdfname = "/Users/julie/Documents/GitHub/aduzuki/pdf/adhesion/2223/payee/";
+ pdfname += rows[rowToBeUpdate].identifiant;
+ pdfname += "_adhesion_2223_payee.pdf";
+
+ var document = {
+ html: html,
+ data: {
+ membres: membres,
+ },
+ path: pdfname,
+ type: ""
+ };
+
+ await pdf
+ .create(document, options)
+ .then((res) => {
+ console.log(res);
+ })
+ .catch((error) => {
+ console.error(error);
+ });
+ console.log("PDF CREATION APRES");
+
+ //////////////////////////////////////////////////////////////////////////////
+ // CRÉATION DU PDF JUSTIFICATIF DE DON
+
+ if (rows[rowToBeUpdate].adherent_paiement_montant_don > 0) {
+ console.log("IF DON = OUI");
+ var html_don = fs.readFileSync(path.resolve(__dirname, "../pdf/template/don_justificatif.html"), "utf8");
+ //var html_don = fs.readFileSync("/Users/julie/Documents/GitHub/aduzuki/pdf/template/don_justificatif.html", "utf8");
+ var options_don = {
+ format: "A4",
+ orientation: "portrait",
+ border: "10mm",
+ };
+
+ var adresse = rows[rowToBeUpdate].adherent_adresse_rue;
+ adresse += " ";
+ adresse += rows[rowToBeUpdate].adherent_adresse_codepostal;
+ adresse += " ";
+ adresse += rows[rowToBeUpdate].adherent_adresse_ville;
+
+ var donneur = [
+ {
+ today: today,
+ identifiant: rows[rowToBeUpdate].identifiant,
+ nom: rows[rowToBeUpdate].adherent_nom,
+ prenom: rows[rowToBeUpdate].adherent_prenom,
+ adresse: adresse,
+ adherent_paiement_mode: "carte bancaire",
+ montant_don: rows[rowToBeUpdate].adherent_paiement_montant_don
+ },
+ ];
+
+ var pdfname_don = path.resolve(__dirname, "../pdf/adhesion/2223/don/");
+ //var pdfname_don = "/Users/julie/Documents/GitHub/aduzuki/pdf/adhesion/2223/payee/";
+ pdfname_don += "/";
+ pdfname_don += rows[rowToBeUpdate].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) => {
+ console.log(res);
+ })
+ .catch((error) => {
+ console.error(error);
+ });
+
+ }
+
+ //////////////////////////////////////////////////////////////////////////////
+ // ENVOIE CARTE ADHERENT + JUSTIFICATIF DE DON PAR MAIL
+
+ console.log("MAIL ENVOI AVANT");
+ var transporter = nodemailer.createTransport({
+ service: 'gmail',
+ auth: {
+ // TEST JULIE
+ //user: 'juliechaumard@gmail.com',
+ //pass: 'etfq umof iwbx ltxk'
+ // SUZUKI
+ user: 'afpedagogiesuzuki@gmail.com',
+ pass: 'tlxx kjwx ahyx irnl'
+ }
+ });
+
+ var attachment_name = rows[rowToBeUpdate].identifiant;
+ attachment_name += "_adhesion_2223_carteadherent.pdf";
+ var attachment_don_name = rows[rowToBeUpdate].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 += 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 += rows[rowToBeUpdate].identifiant;
+ mail_html += ".
";
+ if (rows[rowToBeUpdate].adherent_paiement_montant_don > 0) {
+ mail_html += "
Nous vous remercions chaleureusement pour votre don. Votre justificatif est également joint à ce mail
";
+ }
+ mail_html += "
Nous vous remercions pour votre intérêt et vous souhaitons une très belle année en musique !
Association Française pour la pédagogie Suzuki
Chez Anne PAGES
30 rue des Tattes
74500 PUBLIER
";
+
+ if (req.session.adherent_paiement_montant_don > 0) {
+ var mailOptions = {
+ from: 'afpedagogiesuzuki@gmail.com',
+ to: req.session.identifiant,
+ subject: mail_objet,
+ html: mail_html,
+ attachments: [{
+ filename: attachment_name,
+ path: pdfname
+ },
+ {
+ filename: attachment_don_name,
+ path: pdfname_don
+ }
+ ],
+ };
+ } else {
+ var mailOptions = {
+ from: 'afpedagogiesuzuki@gmail.com',
+ to: req.session.identifiant,
+ subject: mail_objet,
+ html: mail_html,
+ attachments: [{
+ filename: attachment_name,
+ path: pdfname
+ }
+ ],
+ };
+ }
+
+ transporter.sendMail(mailOptions, function(error, info){
+ if (error) {
+ console.log(error);
+ } else {
+ console.log('Email sent: ' + info.response);
+ }
+ });
+ console.log("MAIL ENVOI APRES");
+
+
+
+ //////////////////////////////////////////////////////////////////////////////
+ // AFFICHAGE DANS LA PAGE WEB QUE LA CARTE EST ENVOYÉE
+ req.session.err_mail_form_adhesion_1 = "Carte adhérent envoyée";
+ } else {
+ req.session.err_mail_form_adhesion_1 = "Cette adresse Email n'est pas inscrite pour les adhésions 2022/2023.";
+ req.session.err_mail_form_adhesion_2 = "Vous ne pouvez pas lui envoyer la carte d'adhérent.";
+ }
+
+ res.redirect('/inscription/adhesion/carte_manuelle');
+
+
+}
+
+
+/////////////////////////////////////////////////
+// ENVOI MANUEL CARTE ADHÉSION ET JUSTIFICATIF DE DON (SI DON)
+// Si "x" dans la colonne "filtre" de la Google Sheet (TABLEAU adhesion_annuelle_web ET adhesion_ass_locales)
+// GET URL https://www.adhesion.afpedagogiesuzuki.fr/inscription/adhesion/carte_manuelle
+/////////////////////////////////////////////////
+const post_cartes_manuelles_envoi = async function(req, res){
+
+ logger.info("======================================");
+ logger.info("======== FUNCTION ENVOI CARTES MANUELLES ==========");
+ logger.info("======================================");
+
+ // RÉCUPÉRATION DU CONTENU DE LA GOOGLE SHEET
+ await doc.useServiceAccountAuth(creds);
+ await doc.loadInfo(); // loads document properties and worksheets
+ console.log("NOM FICHIER SHEET: ",doc.title); //nom du fichier
+ const sheet = doc.sheetsByTitle['adhesion_annuelle_web'];
+ const sheet_asslocales = doc.sheetsByTitle['adhesion_ass_locales'];
+ console.log("NOM DU TABLEAU (ONGLET): ",sheet.title); //NOM DU TABLEAU (ONGLET)
+ console.log("NOMBRE DE LIGNE DU TABLEAU: ",sheet.rowCount); // NOMBRE DE LIGNE DU TABLEAU
+ console.log("NOM DU TABLEAU (ONGLET) ASS LOCALES: ",sheet_asslocales.title); //NOM DU TABLEAU (ONGLET)
+ console.log("NOMBRE DE LIGNE DU TABLEAU ASS LOCALES: ",sheet_asslocales.rowCount); // NOMBRE DE LIGNE DU TABLEAU
+
+ const rows = await sheet.getRows();
+ console.log("rows[0].identifiant: ", rows[0].identifiant);
+ const rows_asslocales = await sheet_asslocales.getRows();
+ console.log("rows[0].identifiant: ", rows_asslocales[0].identifiant);
+
+ // COMBIEN DE LIGNES A LE TABLEAU POUR DÉFINIR LE NOMBRE D'ITÉRATION DE LA BOUCLE
+ // LA GOOGLE SHEET NE DOIT PAS CONTENIR DE LIGNE VIDE
+ let compteur = sheet.rowCount - 1;
+ console.log("compteur: ",compteur);
+ let compteur_asslocales = sheet_asslocales.rowCount - 1;
+ console.log("compteur ASS LOCALES: ",compteur_asslocales);
+
+ // DATE DU JOUR
+ moment().format();
+ moment.locale('fr');
+ var date_formattee = moment().format('L')
+ console.log("date_formattee:", date_formattee);
+ let message_envoye = "carte envoyée le ";
+ message_envoye += date_formattee;
+
+ // BOUCLE D'ENVOI POUR LE TABLEAU GOOGLE SHEET 'adhesion_annuelle_web'
+ // SI LA CELLULE "filtre" CONTIENT un "x" ON ENVOIE LA CARTE
+ let lesmails = new Array;
+ let nbenvoi = 0;
+ for (let i=0; i {
+ console.log(res);
+ })
+ .catch((error) => {
+ console.error(error);
+ });
+ console.log("PDF CREATION APRES");
+
+ //////////////////////////////////////////////////////////////////////////////
+ // CRÉATION DU PDF JUSTIFICATIF DE DON
+
+ if (rows[i].adherent_paiement_montant_don > 0) {
+ console.log("IF DON = OUI");
+ var html_don = fs.readFileSync(path.resolve(__dirname, "../pdf/template/don_justificatif.html"), "utf8");
+ var options_don = {
+ format: "A4",
+ orientation: "portrait",
+ border: "10mm",
+ };
+
+ var adresse = rows[i].adherent_adresse_rue;
+ adresse += " ";
+ adresse += rows[i].adherent_adresse_codepostal;
+ adresse += " ";
+ adresse += rows[i].adherent_adresse_ville;
+
+ var donneur = [
+ {
+ today: date_formattee,
+ identifiant: rows[i].identifiant,
+ nom: rows[i].adherent_nom,
+ prenom: rows[i].adherent_prenom,
+ adresse: adresse,
+ adherent_paiement_mode: rows[i].adherent_paiement_mode,
+ montant_don: rows[i].adherent_paiement_montant_don
+ },
+ ];
+
+ var pdfname_don = path.resolve(__dirname, "../pdf/adhesion/2223/don/");
+ pdfname_don += "/";
+ pdfname_don += rows[i].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) => {
+ console.log(res);
+ })
+ .catch((error) => {
+ console.error(error);
+ });
+ }
+
+ //////////////////////////////////////////////////////////////////////////////
+ // ENVOIE CARTE ADHERENT + JUSTIFICATIF DE DON PAR MAIL
+
+ console.log("MAIL ENVOI AVANT");
+ var transporter = nodemailer.createTransport({
+ service: 'gmail',
+ auth: {
+ // MAIL JULIE
+ //user: 'juliechaumard@gmail.com',
+ //pass: 'etfq umof iwbx ltxk'
+ // SUZUKI
+ user: 'afpedagogiesuzuki@gmail.com',
+ pass: 'tlxx kjwx ahyx irnl'
+ }
+ });
+
+ var attachment_name = rows[i].identifiant;
+ attachment_name += "_adhesion_2223_carteadherent.pdf";
+ var attachment_don_name = rows[i].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 += 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 += rows[i].identifiant;
+ mail_html += ".
";
+ if (rows[i].adherent_paiement_montant_don > 0) {
+ mail_html += "
Nous vous remercions chaleureusement pour votre don. Votre justificatif est également joint à ce mail
";
+ }
+ mail_html += "
Nous vous remercions pour votre intérêt et vous souhaitons une très belle année en musique !
Association Française pour la pédagogie Suzuki
Chez Anne PAGES
30 rue des Tattes
74500 PUBLIER
";
+
+ if (rows[i].adherent_paiement_montant_don > 0) {
+ var mailOptions = {
+ from: 'afpedagogiesuzuki@gmail.com',
+ to: rows[i].identifiant,
+ subject: mail_objet,
+ html: mail_html,
+ attachments: [{
+ filename: attachment_name,
+ path: pdfname
+ },
+ {
+ filename: attachment_don_name,
+ path: pdfname_don
+ }
+ ],
+ };
+ } else {
+ var mailOptions = {
+ from: 'afpedagogiesuzuki@gmail.com',
+ to: rows[i].identifiant,
+ subject: mail_objet,
+ html: mail_html,
+ attachments: [{
+ filename: attachment_name,
+ path: pdfname
+ }
+ ],
+ };
+ }
+
+ transporter.sendMail(mailOptions, function(error, info){
+ if (error) {
+ console.log(error);
+ } else {
+ console.log('Email sent: ' + info.response);
+ }
+ });
+ console.log("MAIL ENVOI APRES");
+
+
+
+
+
+
+
+ rows[i].filtre = message_envoye;
+ await rows[i].save();
+ }
+
+ }
+ console.log("LISTE lesmails :");
+ // Supprimer les items vides de l'array lesmails
+ lesmails = lesmails.filter(Boolean);
+ console.log(lesmails);
+ console.log("nbenvoi :",nbenvoi);
+
+ // BOUCLE D'ENVOI POUR LE TABLEAU GOOGLE SHEET 'adhesion_ass_locales'
+ // SI LA CELLULE "filtre" CONTIENT un "x" ON ENVOIE LA CARTE
+ let nbenvoi2 = 0;
+ let lesmails_asslocales = new Array;
+ for (let i=0; i {
+ console.log(res);
+ })
+ .catch((error) => {
+ console.error(error);
+ });
+ console.log("PDF CREATION APRES");
+
+ //////////////////////////////////////////////////////////////////////////////
+ // CRÉATION DU PDF JUSTIFICATIF DE DON
+
+ if (rows_asslocales[i].adherent_paiement_montant_don > 0) {
+ console.log("IF DON = OUI");
+ var html_don = fs.readFileSync(path.resolve(__dirname, "../pdf/template/don_justificatif.html"), "utf8");
+ var options_don = {
+ format: "A4",
+ orientation: "portrait",
+ border: "10mm",
+ };
+
+ var adresse = rows_asslocales[i].adherent_adresse_rue;
+ adresse += " ";
+ adresse += rows_asslocales[i].adherent_adresse_codepostal;
+ adresse += " ";
+ adresse += rows_asslocales[i].adherent_adresse_ville;
+
+ var donneur = [
+ {
+ today: date_formattee,
+ identifiant: rows_asslocales[i].identifiant,
+ nom: rows_asslocales[i].adherent_nom,
+ prenom: rows_asslocales[i].adherent_prenom,
+ adresse: adresse,
+ adherent_paiement_mode: rows_asslocales[i].adherent_paiement_mode,
+ montant_don: rows_asslocales[i].adherent_paiement_montant_don
+ },
+ ];
+
+ var pdfname_don = path.resolve(__dirname, "../pdf/adhesion/2223/don/");
+ pdfname_don += "/";
+ pdfname_don += rows_asslocales[i].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) => {
+ console.log(res);
+ })
+ .catch((error) => {
+ console.error(error);
+ });
+ }
+
+ //////////////////////////////////////////////////////////////////////////////
+ // ENVOIE CARTE ADHERENT + JUSTIFICATIF DE DON PAR MAIL
+
+ console.log("MAIL ENVOI AVANT");
+ var transporter = nodemailer.createTransport({
+ service: 'gmail',
+ auth: {
+ // MAIL JULIE
+ //user: 'juliechaumard@gmail.com',
+ //pass: 'etfq umof iwbx ltxk'
+ // SUZUKI
+ user: 'afpedagogiesuzuki@gmail.com',
+ pass: 'tlxx kjwx ahyx irnl'
+ }
+ });
+
+ var attachment_name = rows_asslocales[i].identifiant;
+ attachment_name += "_adhesion_2223_carteadherent.pdf";
+ var attachment_don_name = rows_asslocales[i].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 += 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 += rows_asslocales[i].identifiant;
+ mail_html += ".
";
+ if (rows_asslocales[i].adherent_paiement_montant_don > 0) {
+ mail_html += "
Nous vous remercions chaleureusement pour votre don. Votre justificatif est également joint à ce mail
";
+ }
+ mail_html += "
Nous vous remercions pour votre intérêt et vous souhaitons une très belle année en musique !
Association Française pour la pédagogie Suzuki
Chez Anne PAGES
30 rue des Tattes
74500 PUBLIER
";
+
+ if (rows_asslocales[i].adherent_paiement_montant_don > 0) {
+ var mailOptions = {
+ from: 'afpedagogiesuzuki@gmail.com',
+ to: rows_asslocales[i].identifiant,
+ subject: mail_objet,
+ html: mail_html,
+ attachments: [{
+ filename: attachment_name,
+ path: pdfname
+ },
+ {
+ filename: attachment_don_name,
+ path: pdfname_don
+ }
+ ],
+ };
+ } else {
+ var mailOptions = {
+ from: 'afpedagogiesuzuki@gmail.com',
+ to: rows_asslocales[i].identifiant,
+ subject: mail_objet,
+ html: mail_html,
+ attachments: [{
+ filename: attachment_name,
+ path: pdfname
+ }
+ ],
+ };
+ }
+
+ transporter.sendMail(mailOptions, function(error, info){
+ if (error) {
+ console.log(error);
+ } else {
+ console.log('Email sent: ' + info.response);
+ }
+ });
+ console.log("MAIL ENVOI APRES");
+
+
+
+
+
+
+ rows_asslocales[i].filtre = message_envoye;
+ await rows_asslocales[i].save();
+ }
+
+ }
+ console.log("LISTE lesmails_asslocales :");
+ // Supprimer les items vides de l'array lesmails_asslocales
+ lesmails_asslocales = lesmails_asslocales.filter(Boolean);
+ console.log(lesmails_asslocales);
+ console.log("nbenvoi2 :",nbenvoi2);
+
+
+ // TRAITEMENT FINI, ON AFFICHE LA PAGE AVEC LE RESULTAT
+
+ req.session.err_mail_form_adhesion_1 = "Cartes adhérents envoyées";
+ req.session.err_mail_form_adhesion_2 = lesmails;
+ req.session.err_mail_form_adhesion_3 = lesmails_asslocales;
+
+ res.redirect('/inscription/adhesion/cartes_manuelles');
+
+
+}
+
+/////////////////////////////////////////////////
+// EXPORT DE MODULE POUR QU'IL SOIT LU DANS LES AUTRES FICHIERS JS
+/////////////////////////////////////////////////
+module.exports = {
+ checkMail,
+ post_form_adhesion,
+ post_form_montant_total,
+ post_paiement_cheque_save,
+ post_paiement_virement_save,
+ post_req_bank,
+ get_res_bank,
+ get_res_bank_annul,
+ post_cartemanuelle_verifmail_envoicarte,
+ post_cartes_manuelles_envoi
+}
+
+
+
+
+
+
+
+
+
diff --git a/controllers/rassemblementController.js b/controllers/rassemblementController.js
new file mode 100644
index 0000000..b4efa35
--- /dev/null
+++ b/controllers/rassemblementController.js
@@ -0,0 +1,822 @@
+/////////////////////////////////////////////////
+// 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");
+
+/////////////////////////////////////////////////
+// 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
+// http://localhost:8888/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 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';
+ 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("======================================");
+ 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.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
+// 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) {
+
+ 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,
+ '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: '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)
+
+}
+
+
+/////////////////////////////////////////////////
+// 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";
+ 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"];
+ 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 += "
";
+ }
+ 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;
+
+ 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 });
+
+
+ //////////////////////////////////////////////////////////////////////////////
+ // 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_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; 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; 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
literal 0
HcmV?d00001
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
new file mode 100644
index 0000000000000000000000000000000000000000..632fa783d94d399ca6a7dc1bc5db826dd4edd40e
GIT binary patch
literal 15681
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