total_1ère

This commit is contained in:
2026-07-20 16:33:04 +02:00
parent dd49ba357b
commit d49cf88d99
275 changed files with 63607 additions and 5599 deletions

2
.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,2 @@
{
}

View File

@@ -0,0 +1,9 @@
2026-06-19 16:45:33: == Sync Started by User Command
2026-06-19 16:45:33: Start only 2 threads, limited by tasks to run
2026-06-19 16:45:33: ConnectCloned connected to file:///Users/juliechaumard/Documents/GitHub/Aduzuki_v2
2026-06-19 16:45:33: ConnectCloned connected to file:///Users/juliechaumard/Documents/GitHub/Aduzuki_v2
2026-06-19 16:45:33: GsConnectAndSetRoot1 connected to sftp://vps-923e4630.vps.ovh.net:49170/var/www/aduzuki
2026-06-19 16:45:33: GsConnectAndSetRoot1 connected to sftp://vps-923e4630.vps.ovh.net:49170/var/www/aduzuki
2026-06-19 16:45:34: Ecrasement '/Users/juliechaumard/Documents/GitHub/Aduzuki_v2/public/js/stagenat/stagenational_formulaire_personne.js' -> 'sftp://vps-923e4630.vps.ovh.net:49170/var/www/aduzuki/public/js/stagenat/stagenational_formulaire_personne.js' (45,973)
2026-06-19 16:45:35: Ecrasement '/Users/juliechaumard/Documents/GitHub/Aduzuki_v2/readme.md' -> 'sftp://vps-923e4630.vps.ovh.net:49170/var/www/aduzuki/readme.md' (8,417)
2026-06-19 16:45:38: == Sync Complete. Time: 00:00:06, Speed: 18,13 KB/s, Elements synchronisés : 2, Erreurs : 0

BIN
_gsdata_/_file_state_v4._gs Normal file

Binary file not shown.

2
_gsdata_/_insync_v4.gsl Normal file
View File

@@ -0,0 +1,2 @@
By: S3 BACKUP PWA - Github_local_TO_S3_pariswebart-website_github.juliechaumard@MacBook Pro de Julie at: 2026.07.06 20:07:34 CEST
/Users/juliechaumard/Documents/GitHub/Aduzuki_v2

19
adhesion_envoi_carte.md Normal file
View File

@@ -0,0 +1,19 @@
# DOC ENVOI DES CARTES ADHERENT
1. Récupération de l'identifiant AFPS passé dans l'URL (identifiant_afps)
2. Connexion à Adobe API pour pouvoir générer des PDF
3. Connexion à la DB Aduzuki
1. Récupération des données nécessaires à la création du la carte adhérent, éventuellement au dispositif de don
adherent_nom
adherent_prenom
adherent_mail
adherent_type
adherent_paiement_montant_don
adherent_adresse_rue
adherent_adresse_codepostal
adherent_adresse_ville
adherent_paiement_mode
2. Récupération des données nécessaires à l'envoi par mail
3. Définition des profils à ajouter à la carte adhérent pour les rendre plus lisibles

View File

@@ -58,11 +58,14 @@ app.use(session(session_cookie))
// JSON // JSON
//// Read datas on API //// Read datas on API
//// needed by Express to read post from HTML Form //// needed by Express to read post from HTML Form
// not for STRIPE WEBHOOK
app.use('/wh_stripe', express.raw({ type: 'application/json' }));
// for the others
app.use(express.json()); app.use(express.json());
// BODY-PARSER // BODY-PARSER
//// Pour la méthode post du formulaire //// Pour récupérer les saisies des formulaires des pages via express (req.body)
app.use(bodyparser.urlencoded({ extended: false})); app.use(bodyparser.urlencoded({ extended: true}));
app.use(bodyparser.json()); app.use(bodyparser.json());
@@ -92,27 +95,31 @@ app.set('views', './views')
// avec le répertoire à partir duquel vous lancez votre processus node. // avec le répertoire à partir duquel vous lancez votre processus node.
// Si vous exécutez lapplication express à partir dun autre répertoire, // Si vous exécutez lapplication express à partir dun autre répertoire,
// il est plus sûr dutiliser le chemin daccès absolu que vous voulez servir // il est plus sûr dutiliser le chemin daccès absolu que vous voulez servir
// ex : http://localhost:8080/assets/images/kitten.jpg // ex : DOMAIN/assets/images/kitten.jpg
app.use('/public', express.static('public')); app.use('/public', express.static('public'));
///////////////////////////////////////////////// /////////////////////////////////////////////////
// ROUTES // ROUTES
///////////////////////////////////////////////// /////////////////////////////////////////////////
// APPELER LE FICHIER ROUTE
// Exemple à modifier :
const appRouter = require("./routes/appRouter"); const appRouter = require("./routes/appRouter");
const adhesionRouter = require("./routes/adhesionRouter"); const adhesionRouter = require("./routes/adhesionRouter");
const stagenatRouter = require("./routes/stagenatRouter"); const stagenatRouter = require("./routes/stagenatRouter");
const rassemblementRouter = require("./routes/rassemblementRouter"); const rassemblementRouter = require("./routes/rassemblementRouter");
const rassemblementraRouter = require("./routes/rassemblementraRouter");
const concertRouter = require("./routes/concertRouter");
const donRouter = require("./routes/donRouter");
const ventevideoRouter = require("./routes/ventevideoRouter");
const wuzukiRouter = require("./routes/wuzukiRouter");
// Accueil du site // Accueil du site
// [DOMAIN]/ // [DOMAIN]/
app.use("/", appRouter); app.use("/", appRouter);
// Adhésion // Adhésion
// [DOMAIN]/inscription adhésion // [DOMAIN]/adhésion
app.use("/inscription", adhesionRouter); app.use("/adhesion", adhesionRouter);
// STAGE NATIONAL // STAGE NATIONAL
// [DOMAIN]/stagenational // [DOMAIN]/stagenational
@@ -121,3 +128,23 @@ app.use("/stagenational", stagenatRouter);
// RASSEMBLEMENT IDF // RASSEMBLEMENT IDF
// [DOMAIN]/rassemblementidf // [DOMAIN]/rassemblementidf
app.use("/rassemblementidf", rassemblementRouter); app.use("/rassemblementidf", rassemblementRouter);
// RASSEMBLEMENT IDF
// [DOMAIN]/rassemblementidf
app.use("/rassemblementra", rassemblementraRouter);
// CONCERT ANNUEL
// [DOMAIN]/concert
app.use("/concert", concertRouter);
// DON
// [DOMAIN]/don
app.use("/don", donRouter);
// VENTE VIDEO
// [DOMAIN]/boutique
app.use("/boutique", ventevideoRouter);
// WUZUKI
// [DOMAIN]/wuzuki
app.use("/wuzuki", wuzukiRouter);

580
arborescence.txt Normal file
View File

@@ -0,0 +1,580 @@
app_aduzuki.js
arborescence.txt
code_secret_client_222874178146-m2ul49riou277tjl431nbfdb8ibp2nl5.apps.googleusercontent.com.json
code_secret_client_738202486676-su2vn8602qqfehool3jqkjvdrdlrl1kd.apps.googleusercontent.com.json
controllers
documentation
generatedReceipt.pdf
inscriptionsafps-53b60452f63d.json
juju.pdf
logs
modules
node_modules
package-lock.json
package.json
pdf
pdfservices-api-credentials.json
public
readme.docx
readme.html
readme.md
receipt.json
receiptTemplate.docx
routes
sql.sql
src
testapi336520-3105cc3caa46.json
views
workspaces
./controllers:
adhesionController_20241102.js
adhesionController_20241129.js
adhesionController.js
codesController.js
concert_annuel
donController.js
rassemblementController_OLD.js
rassemblementController.js
rassemblementraController.js
stage_national
test.js
vente_video
webhook_stripe_exemple.js
whstripeController.js
wuzukiController copie.js
wuzukiController.js
./controllers/concert_annuel:
adminController.js
affiche_identiferController.js
ajout_concertController.js
ajout_familleController.js
ajout_payerController.js
identiferController.js
inscrip_spectateur_tousController.js
inscription_familleController.js
inscription_listeattenteController.js
inscription_spectateur_tous_recapController.js
inscription_spectateurController.js
maj_gs_concertController.js
payerController.js
retourStripeController.js
weez_concertController.js
weeztoken_concertController.js
./controllers/stage_national:
stn_formulaireController.js
stn_identifierController.js
stn_payeracompteController.js
stn_retourstripeController.js
./controllers/vente_video:
files
generate_linkController copie.js
generate_linkController.js
vente_videoController.js
./controllers/vente_video/files:
film_suzuki_unesco_2024_test.mp4
film_suzuki_unesco_2024.mp4
yourfile.txt
./logs:
adhesion
concert
lienventetemp
rassemblement
stagenat
whstripe
wuzuki
./logs/adhesion:
./logs/concert:
./logs/lienventetemp:
./logs/rassemblement:
./logs/stagenat:
./logs/whstripe:
./logs/wuzuki:
./modules:
adhesion
db
envoie_mail.js
pdf.js
sleep.js
stripe.js
verif_codesecret.js
./modules/adhesion:
carte_adherent.js
majgs_webhook.js
./modules/db:
checkAdherent.js
databaseconnect.js
sqlqueries.js
./pdf:
adhesion
concert_annuel
don
rassemblement
stage_national
template
./pdf/adhesion:
2223
2324
2425
./pdf/adhesion/2223:
attente
don
payee
./pdf/adhesion/2223/attente:
./pdf/adhesion/2223/don:
./pdf/adhesion/2223/payee:
./pdf/adhesion/2324:
attente
don
paye
./pdf/adhesion/2324/attente:
./pdf/adhesion/2324/don:
./pdf/adhesion/2324/paye:
./pdf/adhesion/2425:
attente
paye
./pdf/adhesion/2425/attente:
./pdf/adhesion/2425/paye:
./pdf/concert_annuel:
don
./pdf/concert_annuel/don:
2324
./pdf/concert_annuel/don/2324:
./pdf/don:
output.pdf
./pdf/rassemblement:
documents
./pdf/rassemblement/documents:
rassemblementidf_plan_lieu.pdf
rassemblementidf_programme_2023.pdf
rassemblementidf_programme.pdf
./pdf/stage_national:
documents
./pdf/stage_national/documents:
stage_national_tarifs_2024.pdf
stage_national_tarifs_2025_old.pdf
stage_national_tarifs_2025.pdf
./pdf/template:
carte_adherent_don.docx
carte_adherent_don.pages
carte_adherent_temp_20240902.docx
carte_adherent_temp.docx
carte_adherent_temp.pages
carte_adherent.docx
carte_adherent.html
carte_adherent.pages
carte_adherent1.docx
carte_adherentold.docx
don_justificatif.docx
don_justificatif.html
don_justificatif.pages
don_wp.html
receiptTemplate.docx
./public:
css
fonts
images
js
./public/css:
app.css
app.css.map
./public/fonts:
cabin_bold.ttf
cabin_bolditalic.ttf
cabin_italic.ttf
cabin_medium.ttf
cabin_mediumitalic.ttf
cabin_regular.ttf
cabin_semibold.ttf
cabin_semibolditalic.ttf
montserrat_black.ttf
montserrat_blackitalic.ttf
montserrat_bold.ttf
montserrat_bolditalic.ttf
montserrat_extrabold.ttf
montserrat_extrabolditalic.ttf
montserrat_extralight.ttf
montserrat_extralightitalic.ttf
montserrat_italic.ttf
montserrat_light.ttf
montserrat_lightitalic.ttf
montserrat_medium.ttf
montserrat_mediumitalic.ttf
montserrat_regular.ttf
montserrat_semibold.ttf
montserrat_semibolditalic.ttf
montserrat_thin.ttf
montserrat_thinitalic.ttf
playfairdisplay_black.ttf
playfairdisplay_blackitalic.ttf
playfairdisplay_bold.ttf
playfairdisplay_bolditalic.ttf
playfairdisplay_italic.ttf
playfairdisplay_regular.ttf
sourceserifpro_black.ttf
sourceserifpro_blackitalic.ttf
sourceserifpro_bold.ttf
sourceserifpro_bolditalic.ttf
sourceserifpro_extralight.ttf
sourceserifpro_extralightitalic.ttf
sourceserifpro_italic.ttf
sourceserifpro_light.ttf
sourceserifpro_lightitalic.ttf
sourceserifpro_regular.ttf
sourceserifpro_semibold.ttf
sourceserifpro_semibolditalic.ttf
ubuntu_bold.ttf
ubuntu_courant.ttf
ubuntu_fin.ttf
ubuntu_leger_italic.ttf
ubuntu_leger.ttf
ubuntu_moyen.ttf
ubuntu-moyen_italique.ttf
./public/images:
icones
logos
rassemblementidf_2023_programme.pdf
rassemblementidf_plan_lieu.pdf
ventevideo
./public/images/icones:
encadrant.webp
favicon.ico
icone_accompagnant.png
icone_bus.png
icone_close.png
icone_compte.png
icone_house.png
icone_infos.png
icone_personne.png
musican.webp
pause.webp
spectator.webp
./public/images/logos:
logosuzukigris.png
./public/images/ventevideo:
concert_unesco_illustration.jpeg
concert_unesco_illustration1.jpeg
./public/js:
adhesion
app
concert
localstore.js
rassemblementidf
rassemblementra
stagenat
./public/js/adhesion:
accueil_modal.js
adhesion_prof copie.js
adhesion_prof.js
eleve.js
form_paiement.js
hidden_visible.js
professeurs.js
./public/js/app:
logger_adhesion.js
logger_concert.js
logger_lienventetemp.js
logger_rassemblement.js
logger_stagenat.js
logger_whstripe.js
logger_wuzuki.js
logger.js
./public/js/concert:
concert_formulaire_famille.js
./public/js/rassemblementidf:
rassemblementidf_formulaire_personne_20250127.js
rassemblementidf_formulaire_personne.js
./public/js/rassemblementra:
rassemblementra_formulaire_personne.js
./public/js/stagenat:
stagenational_formulaire_personne.js
./routes:
adhesionRouter.js
appRouter.js
concertRouter_prod.js
concertRouter_surlafin.js
concertRouter.js
donRouter.js
rassemblementraRouter.js
rassemblementRouter.js
stagenatRouter.js
ventevideoRouter copie 2.js
ventevideoRouter copie.js
ventevideoRouter.js
wuzukiRouter.js
./src:
scss
./src/scss:
app.scss
base
components
global
templates
./src/scss/base:
_colors.scss
_fontawesome.scss
_fonts.scss
_grille.scss
_reset.scss
_space.scss
./src/scss/components:
_check_mail.scss
_fin_inscription.scss
_footer.scss
_header_inscription.scss
_header_tunnel.scss
_inputs.scss
_savoirplus.scss
_titres.scss
_weasyprint.scss
./src/scss/global:
_main.scss
_mediaqueries.scss
./src/scss/templates:
_adhesion_end.scss
_adhesion_mail.scss
_adhesion.scss
_admin.scss
_concert_annuel.scss
_don_form.scss
_maj_manuelle.scss
_paiement.scss
_stageformulaire.scss
_ventevideo copie.scss
_ventevideo.scss
./views:
adhesion
app
concert
don
rassemblementidf
rassemblementra
stagenat
template_parts
ventevideo
wuzuki
./views/adhesion:
page_templates
template_parts
./views/adhesion/page_templates:
adhesion_cartes_manuelles.ejs
adhesion_paiement_annule.ejs
adhesion_paiement_attente.ejs
adhesion_paiement_mode_paiement.ejs
adhesion_paiement_reussi.ejs
adhesion_paiement_total.ejs
formulaire_adhesion_choix.ejs
formulaire_adhesion_famille.ejs
formulaire_adhesion_mail.ejs
formulaire_adhesion_observateur.ejs
formulaire_adhesion_prof.ejs
formulaire_cartemanuelle_mail.ejs
inscription_terminee.ejs
maj_googlesheet_20241026.ejs
maj_googlesheet.ejs
./views/adhesion/template_parts:
adhesion_titrepage.ejs
eleves_famille.ejs
eleves_famille.ejs copie
eleves.ejs
prof_diplome.ejs
prof_formation.ejs
prof_infosgenerale.ejs
./views/app:
page_templates
template_parts
./views/app/page_templates:
inscription_accueil.ejs
./views/app/template_parts:
header_inscription.ejs
./views/concert:
page_templates
template_parts
./views/concert/page_templates:
achat_spectateur_20240406.ejs
achat_spectateur_tous.ejs
achat_spectateur.ejs
admin.ejs
ajout_billet.ejs
ajout_formulaire_famille.ejs
erreur.ejs
inscrip_formulaire_famille.ejs
inscrip_formulaire_identifier.ejs
inscrip_liste_attente.ejs
inscrip_paiement.ejs
inscrip_recap_famille_sanspaiement.ejs
inscrip_recap_famille.ejs
inscrip_termine.ejs
paiement_annule.ejs
paiement_reussi.ejs
./views/concert/template_parts:
concert_titrepage.ejs
./views/don:
page_templates
template_parts
./views/don/page_templates:
don_paiement_annule.ejs
don_paiement_reussi.ejs
formulaire_don.ejs
./views/don/template_parts:
don_titrepage.ejs
./views/rassemblementidf:
page_templates
template_parts
./views/rassemblementidf/page_templates:
fermeture.ejs
inscrip_formulaire_identifier.ejs
inscrip_formulaire.ejs
paiement_annule.ejs
paiement_reussi.ejs
panne.ejs
recap.ejs
./views/rassemblementidf/template_parts:
rassemblementidf_titrepage.ejs
./views/rassemblementra:
page_templates
template_parts
./views/rassemblementra/page_templates:
fermeture.ejs
inscrip_formulaire_identifier.ejs
inscrip_formulaire.ejs
paiement_annule.ejs
paiement_reussi.ejs
panne.ejs
recap.ejs
./views/rassemblementra/template_parts:
rassemblementidf_titrepage.ejs
./views/stagenat:
page_templates
template_parts
./views/stagenat/page_templates:
inscrip_formulaire_identifier.ejs
inscrip_formulaire.ejs
inscription_reussi.ejs
paiement_annule.ejs
paiement_reussi.ejs
recap.ejs
recapssacompte.ejs
./views/stagenat/template_parts:
check_identifiant.ejs
stagenational_titrepage.ejs
./views/template_parts:
footer.ejs
head.ejs
header_tunnel.ejs
./views/ventevideo:
page_templates
template_parts
./views/ventevideo/page_templates:
ventelien_boutonacheter.ejs
ventelien_paiement_echec.ejs
ventelien_paiement_reussi.ejs
ventelien_telechargement_encours.ejs
./views/ventevideo/template_parts:
ventevideo_titrepage.ejs
./views/wuzuki:
page_templates
template_parts
./views/wuzuki/page_templates:
formulaire_envoie_message.ejs
./views/wuzuki/template_parts:
envoie_message_titrepage.ejs
./workspaces:
rassemblement_ra.code-workspace

View File

@@ -1,18 +0,0 @@
2023-02-26 18:25:06 info [undefined] SID[undefined] bonjour Julie
2023-02-26 18:25:06 info [undefined] SID[undefined] process.env.PORT : 8888
2023-02-26 18:25:06 info [undefined] SID[undefined] process.env.ENV : production
2023-02-26 18:25:06 info [undefined] SID[undefined] express-session secured
2023-02-26 18:25:06 info [undefined] SID[undefined] NOUS SOMMES DANS LE FICHIER : /home/jivciei/adusuki/routes/appRouter.js
2023-02-26 18:25:06 info [undefined] SID[undefined] NOUS SOMMES DANS LE FICHIER : /home/jivciei/adusuki/routes/adhesionRouter.js
2023-02-26 18:25:06 info [undefined] SID[undefined] NOUS SOMMES DANS LE FICHIER : /home/jivciei/adusuki/controllers/adhesionController.js
2023-02-26 18:25:06 info [undefined] SID[undefined] NOUS SOMMES DANS LE FICHIER : /home/jivciei/adusuki/routes/stagenatRouter.js
2023-02-26 18:25:06 info [undefined] SID[undefined] NOUS SOMMES DANS LE FICHIER : /home/jivciei/adusuki/controllers/stagenatController.js
2023-02-26 18:36:27 info [undefined] SID[undefined] bonjour Julie
2023-02-26 18:36:27 info [undefined] SID[undefined] process.env.PORT : 8888
2023-02-26 18:36:27 info [undefined] SID[undefined] process.env.ENV : production
2023-02-26 18:36:27 info [undefined] SID[undefined] express-session secured
2023-02-26 18:36:27 info [undefined] SID[undefined] NOUS SOMMES DANS LE FICHIER : /home/jivciei/adusuki/routes/appRouter.js
2023-02-26 18:36:27 info [undefined] SID[undefined] NOUS SOMMES DANS LE FICHIER : /home/jivciei/adusuki/routes/adhesionRouter.js
2023-02-26 18:36:27 info [undefined] SID[undefined] NOUS SOMMES DANS LE FICHIER : /home/jivciei/adusuki/controllers/adhesionController.js
2023-02-26 18:36:28 info [undefined] SID[undefined] NOUS SOMMES DANS LE FICHIER : /home/jivciei/adusuki/routes/stagenatRouter.js
2023-02-26 18:36:28 info [undefined] SID[undefined] NOUS SOMMES DANS LE FICHIER : /home/jivciei/adusuki/controllers/stagenatController.js

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,294 @@
/////////////////////////////////////////////////
// LOGGING
/////////////////////////////////////////////////
const logger = require("../public/js/app/logger_adhesion");
/////////////////////////////////////////////////
// APPELS DES MODULES
/////////////////////////////////////////////////
const moment = require('moment');
const ejs = require('ejs');
const nodemailer = require('nodemailer');
const path = require("path");
const stripe = require('stripe')(process.env.STRIPE_PRIVATE_KEY);
const pdf = require("pdf-creator-node");
const fs = require("fs");
const mysql = require('mysql2');
const mysql_promise = require('mysql2/promise');
// ADOBE PDF
const PDFServicesSdk = require('@adobe/pdfservices-node-sdk');
/////////////////////////////////////////////////
// APPELS DES FONCTIONS
/////////////////////////////////////////////////
// Déterminer les profils de l'adhésion
const carte_adherent = require("./../modules/adhesion/carte_adherent");
// FAIRE UNE PAUSE
const sleep = require("./../modules/sleep");
////////////////////////////////////////////////////
// FILE NAME
////////////////////////////////////////////////////
const filename = path.parse(__filename).base;
/////////////////////////////////////////////////
// GOOGLE SHEET PARAMETERS
/////////////////////////////////////////////////
const { GoogleSpreadsheet } = require('google-spreadsheet');
const GS_creds = require('../inscriptionsafps-53b60452f63d.json');
const { error } = require("console");
// Initialize the sheet - doc ID is the long id in the sheets URL
const GS_adhesion = new GoogleSpreadsheet(process.env.gsheet_adhesion);
/////////////////////////////////////////////////
// VARIABLES GLOBALES
/////////////////////////////////////////////////
let adherent_type, profil1, profil2, profil3;
/////////////////////////////////////////////////
// ASSOCIATIONS LOCACLES
// IMPORTS ADHÉRENTS DANS DB
// CLIC SUR LE BOUTON "Valider" de la page /maj_googlesheet
/////////////////////////////////////////////////
const adhesion_envoi_carte = async function(req, res) {
logger.info("======================================", { label: filename });
logger.info("======== FUNCTION adhesion_envoi_carte (adhesion maj_googlesheet) ==========", { label: filename });
logger.info("======================================", { label: filename });
/////////////////////////////////////////////////
// DATE
let now = moment().format("YYYY-MM-DD HH:mm:ss");
let now_pdf = moment().format("YYYY-MM-DDTHH-mm-ss");
/////////////////////////////////////////////////
// VARIABLE
const identifiant_afps = req.params.identifiant_afps;
console.log('identifiant_afps reçu :', identifiant_afps);
////////////////////////////////////////////////////
// CONNECTION ADOBE API
////////////////////////////////////////////////////
const credentials = PDFServicesSdk.Credentials
.servicePrincipalCredentialsBuilder()
.withClientId(process.env.PDF_SERVICES_CLIENT_ID)
.withClientSecret(process.env.PDF_SERVICES_CLIENT_SECRET)
.build();
//timeout Default: 10000
const clientConfig = PDFServicesSdk.ClientConfig
.clientConfigBuilder()
.withConnectTimeout(40000)
.withReadTimeout(80000)
.build();
// Create an ExecutionContext using credentials
const executionContext = PDFServicesSdk.ExecutionContext.create(credentials);
/////////////////////////////////////////////////
// CONNECTION DB
try {
const pool = mysql.createPool({
host: process.env.db_connection_host,
port: process.env.db_connection_port,
user: process.env.db_connection_user,
password: process.env.db_connection_password,
database: process.env.db_connection_database,
rowsAsArray: false
});
const promisePool = pool.promise();
// Récupération des données nécessaires à la création du la carte adhérent, éventuellement au dispositif de don
// Récupération des données nécessaires à l'envoi par mail
const sql = `
SELECT adherent_nom, adherent_prenom, adherent_mail,
adherent_type, adherent_adresse_rue,
adherent_adresse_codepostal, adherent_adresse_ville
FROM adherent
WHERE identifiant = ?`;
const [results_adherent] = await promisePool.query(sql, [identifiant_afps]);
logger.info("SELECT ADHERENT adherent_nom : " + results_adherent[0].adherent_nom, { numsession: req.session.id, label: filename});
const sql2 = `SELECT montant_don, paiement_mode FROM adherent_finance WHERE identifiant = ?`;
const [results_adherent_finance] = await promisePool.query(sql2, [identifiant_afps]);
if (results_adherent[0].adherent_nom) {
/////////////////////////////////////////////////
// ENVOIE CARTE ADHÉRENT
//////////////////////////////////////////////////////////////////////////////
// ADOBE PDF : CRÉATION DE LA CARTE D'ADHÉSION EN PDF
// + JUSTIFICATIF DE DON
//////////////////////////////////////////////////////////////////////////////
// DÉFINIR LE PROFIL À AJOUTER DANS LA CARTE ADHÉRENT
// La fonction est dans le fichier /modules/adherent_type.js
profils = carte_adherent.profil(results_adherent[0].adherent_type);
profil1 = profils[0];
profil2 = profils[1];
profil3 = profils[2];
let OUTPUT;
let INPUT
// S'il y a un don
if (results_adherent_finance[0].montant_don > 0) {
OUTPUT = path.resolve(__dirname, "../pdf/adhesion/2526/paye/")+"/"+identifiant_afps+"_adhesion_2526_paye_don_"+now_pdf+".pdf";
INPUT = path.resolve(__dirname, "../pdf/template/carte_adherent_don.docx");
} else {
// S'il n'y a pas de don
OUTPUT = path.resolve(__dirname, "../pdf/adhesion/2526/paye/")+"/"+identifiant_afps+"_adhesion_2526_paye_"+now_pdf+".pdf";
INPUT = path.resolve(__dirname, "../pdf/template/carte_adherent.docx");
}
moment.locale('fr');
var date_formattee = moment().format('L')
var today = date_formattee;
var adresse = results_adherent[0].adherent_adresse_rue;
adresse += " ";
adresse += results_adherent[0].adherent_adresse_codepostal;
adresse += " ";
adresse += results_adherent[0].adherent_adresse_ville;
if (profil2 == undefined) {profil2 = " "};
if (profil3 == undefined) {profil3 = ""};
JSON_INPUT =
{
"date": today,
"identifiant": identifiant_afps,
"profil1": profil1,
"profil2": profil2,
"profil3": profil3,
"mode_paiement": results_adherent_finance[0].paiement_mode,
"nom": results_adherent[0].adherent_nom,
"prenom": results_adherent[0].adherent_prenom,
"adresse": adresse,
"montant_don": results_adherent_finance[0].montant_don
};
const documentMerge = PDFServicesSdk.DocumentMerge,
documentMergeOptions = documentMerge.options,
adobe_options = new documentMergeOptions.DocumentMergeOptions(JSON_INPUT, documentMergeOptions.OutputFormat.PDF);
// Create a new operation instance using the options instance.
const documentMergeOperation = documentMerge.Operation.createNew(adobe_options);
// Set operation input document template from a source file.
const input = PDFServicesSdk.FileRef.createFromLocalFile(INPUT);
documentMergeOperation.setInput(input);
// Execute the operation and Save the result to the specified location.
await documentMergeOperation
.execute(executionContext)
.then(result => result.saveAsFile(OUTPUT).then(
)
)
.catch(err => {
if(err instanceof PDFServicesSdk.Error.ServiceApiError
|| err instanceof PDFServicesSdk.Error.ServiceUsageError) {
console.log('Exception encountered while executing ADOBE PDF', err);
} else {
console.log('Exception encountered while executing ADOBE PDF', err);
}
});
//////////////////////////////////////////////////////////////////////////////
// ENVOIE CARTE ADHERENT + JUSTIFICATIF DE DON PAR MAIL
console.log("MAIL ENVOI AVANT");
var transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: process.env.nodemailer_user,
pass: process.env.nodemailer_pass
}
});
var attachment_name = identifiant_afps;
attachment_name += "_adhesion_2526_carteadherent.pdf";
var attachment_don_name = identifiant_afps;
attachment_don_name += "_don.pdf";
var mail_objet = "ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - ADHÉSION 2025/2026 - ";
mail_objet += identifiant_afps;
mail_html = "<p>Cher adhérent,</p><p>Félicitations ! Vous êtes désormais membre de lAssociation Française pour la Pédagogie Suzuki (http://www.afpedagogiesuzuki.fr) et de lEuropean Suzuki Association (https://europeansuzuki.org) pour l'année 2025/2026. Vous pouvez à ce titre participer à tous les événements Suzuki en France et dans le monde.</p><p>Vous trouverez en pièce jointe votre carte d'adhésion annuelle (valable du 1er septembre 2025 au 31 août 2026).</p><p>Votre identifiant (valable pour toute la famille) est ";
mail_html += identifiant_afps;
mail_html += ".</p>";
if (results_adherent_finance[0].montant_don > 0) {
mail_html += "<br><p>Nous vous remercions chaleureusement pour votre don. Votre justificatif est également joint à ce mail</p>";
}
mail_html += "<p><br>Nous vous remercions pour votre intérêt et vous souhaitons une très belle année en musique !</p><p>Association Française pour la pédagogie Suzuki<br>Chez Anne PAGES<br>30 rue des Tattes<br>74500 PUBLIER</p>";
var mailOptions = {
from: 'afps.inscription@gmail.com',
to: results_adherent[0].adherent_mail,
subject: mail_objet,
html: mail_html,
attachments: [{
filename: attachment_name,
path: OUTPUT
}
]
};
transporter.sendMail(mailOptions, function(error, info){
if (error) {
logger.info("error : " + error, { numsession: req.session.id });
} else {
console.log('Email sent: ' + info.response);
}
});
console.log("MAIL ENVOI APRES");
// METTRE À JOUR LE STATUS D'ENVOI DE LA CARTE
let sql10 = 'UPDATE ';
sql10 += 'adherent';
sql10 += ' SET ';
sql10 += 'carte_envoi = "definitive"';
sql10 += ' WHERE identifiant = "' + identifiant_afps + '"';
const [results10, fields10] = await promisePool.query(sql10); // Execution SQL
logger.info("adherent carte envoi Row ID changed : " + results10.changedRows, { numsession: req.session.id, label: filename});
res.json({
success: true,
message: `Email avec carte adhésion envoyé à : ${identifiant_afps}`,
});
} else {
res.status(404).json({
success: false,
message: `Aucun adhérent trouvé pour l'identifiant ${identifiant_afps}`,
});
}
} catch (error) {
// Echec de connection à la BD
logger.error("Il y a un problème avec la connection à la base de données : " + error, { numsession: req.session.id });
res.json({ error });
};
}
/////////////////////////////////////////////////
// EXPORT DE MODULE POUR QU'IL SOIT LU DANS LES AUTRES FICHIERS JS
/////////////////////////////////////////////////
module.exports = {
adhesion_envoi_carte
}

View File

@@ -0,0 +1,396 @@
/////////////////////////////////////////////////
// LOGGING
/////////////////////////////////////////////////
const logger = require("../public/js/app/logger_adhesion");
/////////////////////////////////////////////////
// APPELS DES MODULES
/////////////////////////////////////////////////
const moment = require('moment');
const ejs = require('ejs');
const nodemailer = require('nodemailer');
const path = require("path");
const stripe = require('stripe')(process.env.STRIPE_PRIVATE_KEY);
const pdf = require("pdf-creator-node");
const fs = require("fs");
const mysql = require('mysql2');
const mysql_promise = require('mysql2/promise');
// ADOBE PDF
const PDFServicesSdk = require('@adobe/pdfservices-node-sdk');
/////////////////////////////////////////////////
// APPELS DES FONCTIONS
/////////////////////////////////////////////////
// Déterminer les profils de l'adhésion
const carte_adherent = require("./../modules/adhesion/carte_adherent");
// FAIRE UNE PAUSE
const sleep = require("./../modules/sleep");
////////////////////////////////////////////////////
// FILE NAME
////////////////////////////////////////////////////
const filename = path.parse(__filename).base;
/////////////////////////////////////////////////
// GOOGLE SHEET PARAMETERS
/////////////////////////////////////////////////
const { GoogleSpreadsheet } = require('google-spreadsheet');
const GS_creds = require('../inscriptionsafps-53b60452f63d.json');
const { error } = require("console");
// Initialize the sheet - doc ID is the long id in the sheets URL
const GS_adhesion = new GoogleSpreadsheet(process.env.gsheet_adhesion);
/////////////////////////////////////////////////
// VARIABLES GLOBALES
/////////////////////////////////////////////////
let adherent_type, profil1, profil2, profil3;
/////////////////////////////////////////////////
// ASSOCIATIONS LOCACLES
// IMPORTS ADHÉRENTS DANS DB
// CLIC SUR LE BOUTON "Valider" de la page /maj_googlesheet
/////////////////////////////////////////////////
const import_ass_locales_v2 = async function(req, res) {
logger.info("======================================", { label: filename });
logger.info("======== FUNCTION import_ass_locales_v2 (adhesion maj_googlesheet) ==========", { label: filename });
logger.info("======================================", { label: filename });
/////////////////////////////////////////////////
// DATE
let now = moment().format("YYYY-MM-DD HH:mm:ss");
let now_pdf = moment().format("YYYY-MM-DDTHH-mm-ss");
/////////////////////////////////////////////////
// VARIABLE
let nb_import = 0;
/////////////////////////////////////////////////
// CONNEXION GSHEET
try {
await GS_adhesion.useServiceAccountAuth(GS_creds);
} catch (error) {
// Echec de connection à GS
logger.error("Il y a un problème avec la connection à Google Sheet. : " + error, { numsession: req.session.id });
req.session.message4 = "Il y a un problème système, veuillez recommencer.";
res.redirect('/adhesion/maj_googlesheet');
};
await GS_adhesion.loadInfo();
const GS_asso_locales = GS_adhesion.sheetsByTitle['adhesion_ass_locales'];
const GS_asso_locales_rows = await GS_asso_locales.getRows();
console.log("GS_asso_locales.rowCount = ", GS_asso_locales.rowCount);
//console.log("GS_asso_locales_rows[0].identifiant = ", GS_asso_locales_rows[0].identifiant);
//console.log("GS_asso_locales_rows[1].identifiant = ", GS_asso_locales_rows[1].identifiant);
// NOMBRE DE LIGNE DANS L'ONGLET adhesion_ass_locales
let compteur = GS_asso_locales.rowCount - 1; // POUR DÉCOMPTER LA LIGNE D'EN-TÊTE
console.log("compteur = ", compteur);
////////////////////////////////////////////////////
// CONNECTION ADOBE API
////////////////////////////////////////////////////
const credentials = PDFServicesSdk.Credentials
.servicePrincipalCredentialsBuilder()
.withClientId(process.env.PDF_SERVICES_CLIENT_ID)
.withClientSecret(process.env.PDF_SERVICES_CLIENT_SECRET)
.build();
//timeout Default: 10000
const clientConfig = PDFServicesSdk.ClientConfig
.clientConfigBuilder()
.withConnectTimeout(40000)
.withReadTimeout(80000)
.build();
// Create an ExecutionContext using credentials
const executionContext = PDFServicesSdk.ExecutionContext.create(credentials);
/////////////////////////////////////////////////
// CONNECTION DB
try {
const pool = mysql.createPool({
host: process.env.db_connection_host,
port: process.env.db_connection_port,
user: process.env.db_connection_user,
password: process.env.db_connection_password,
database: process.env.db_connection_database,
rowsAsArray: true
});
const promisePool = pool.promise();
/////////////////////////////////////////////////
// ON LIT TOUTES LES LIGNES DU GOOGLE SHEET LES UNES APRÈS LES AUTRES
for (i=0; i<compteur; i++) {
console.log("i = ", i);
console.log("GS_asso_locales_rows[i].date_export = ", GS_asso_locales_rows[i].date_export);
/////////////////////////////////////////////////
// SI LA LIGNE N'A PAS DÉJÀ ÉTÉ IMPORTÉE ON L'AJOUTE DANS LA BD
// SI DATE EXPORT EST VIDE
if (!GS_asso_locales_rows[i].date_export) {
console.log("GS_asso_locales_rows[i].identifiant NON IMPORTÉ = ", GS_asso_locales_rows[i].identifiant);
// AJOUT DANS LA TABLE adherent
let sql = 'INSERT INTO adherent (association_suzuki, saison, identifiant, date_maj, adherent_type, adherent_nom, adherent_prenom, adherent_adresse_rue, adherent_adresse_complement, adherent_adresse_codepostal, adherent_adresse_ville, adherent_adresse_pays, adherent_telephone_fixe, adherent_telephone_mobile, adherent_mail) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)';
let sql_values = [GS_asso_locales_rows[i].association, GS_asso_locales_rows[i].saison, GS_asso_locales_rows[i].identifiant, now, GS_asso_locales_rows[i].adherent_type, GS_asso_locales_rows[i].adherent_nom, GS_asso_locales_rows[i].adherent_prenom, GS_asso_locales_rows[i].adherent_adresse_rue, GS_asso_locales_rows[i].adherent_adresse_complement, GS_asso_locales_rows[i].adherent_adresse_codepostal, GS_asso_locales_rows[i].adherent_adresse_ville, GS_asso_locales_rows[i].adherent_adresse_pays, GS_asso_locales_rows[i].adherent_telephone_fixe, GS_asso_locales_rows[i].adherent_telephone_mobile, GS_asso_locales_rows[i].adherent_mail];
const [results, fields] = await promisePool.query(sql, sql_values); // Execution SQL
logger.info("INSERT - adherent - Row ID added : " + results.insertId, { numsession: req.session.id, label: filename});
// AJOUT DANS LA TABLE adherent_finance
console.log("GS_asso_locales_rows[i].adherent_paiement_montant_don = ", GS_asso_locales_rows[i].adherent_paiement_montant_don);
if (!GS_asso_locales_rows[i].adherent_paiement_montant_don){GS_asso_locales_rows[i].adherent_paiement_montant_don = 0;}
let sql2 = 'INSERT INTO adherent_finance (date_maj, saison, identifiant, association_suzuki, adherent_type, adherent_nom, adherent_prenom, adherent_telephone_mobile, adherent_mail, statut_paiement, paiement_mode, date_paiement, montant_adhesion, montant_don, montant_total) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)';
let sql_values2 = [now, GS_asso_locales_rows[i].saison, GS_asso_locales_rows[i].identifiant, GS_asso_locales_rows[i].association, GS_asso_locales_rows[i].adherent_type, GS_asso_locales_rows[i].adherent_nom, GS_asso_locales_rows[i].adherent_prenom, GS_asso_locales_rows[i].adherent_telephone_mobile, GS_asso_locales_rows[i].adherent_mail, GS_asso_locales_rows[i].adhesion_paye, GS_asso_locales_rows[i].adherent_paiement_mode, now, GS_asso_locales_rows[i].adherent_paiement_montant_adhesion, GS_asso_locales_rows[i].adherent_paiement_montant_don, GS_asso_locales_rows[i].adherent_paiement_montant_total];
const [results2, fields2] = await promisePool.query(sql2, sql_values2); // Execution SQL
logger.info("INSERT - adherent_finance - Row ID added : " + results2.insertId, { numsession: req.session.id, label: filename});
// AJOUT DANS LA TABLE adherent_professeur
if (GS_asso_locales_rows[i].adherent_prof_instrument1) {
let sql3 = 'INSERT INTO adherent_professeur (date_maj, saison, identifiant, association_suzuki, adherent_nom, adherent_prenom, adherent_telephone_mobile, adherent_mail, adherent_prof_instrument1, adherent_prof_instrument1_esa, adherent_prof_instrument2, adherent_prof_instrument2_esa, adherent_prof_sece, adherent_prof_ecole1, adherent_prof_ecole1_adresse, adherent_prof_ecole1_cp, adherent_prof_ecole1_ville, adherent_prof_ecole1_mail, adherent_prof_ecole1_web, adherent_prof_ecole2, adherent_prof_ecole2_adresse, adherent_prof_ecole2_cp, adherent_prof_ecole2_ville, adherent_prof_ecole2_mail, adherent_prof_ecole2_web, adherent_prof_ecole3, adherent_prof_ecole3_adresse, adherent_prof_ecole3_cp, adherent_prof_ecole3_ville, adherent_prof_ecole3_mail, adherent_prof_ecole3_web) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)';
let sql_values3 = [now, GS_asso_locales_rows[i].saison, GS_asso_locales_rows[i].identifiant, GS_asso_locales_rows[i].association, GS_asso_locales_rows[i].adherent_nom, GS_asso_locales_rows[i].adherent_prenom, GS_asso_locales_rows[i].adherent_telephone_mobile, GS_asso_locales_rows[i].adherent_mail, GS_asso_locales_rows[i].adherent_prof_instrument1, GS_asso_locales_rows[i].adherent_prof_instrument1_esa, GS_asso_locales_rows[i].adherent_prof_instrument2, GS_asso_locales_rows[i].adherent_prof_instrument2_esa, GS_asso_locales_rows[i].adherent_prof_sece, GS_asso_locales_rows[i].adherent_prof_ecole1, GS_asso_locales_rows[i].adherent_prof_ecole1_adresse, GS_asso_locales_rows[i].adherent_prof_ecole1_cp, GS_asso_locales_rows[i].adherent_prof_ecole1_ville, GS_asso_locales_rows[i].adherent_prof_ecole1_mail, GS_asso_locales_rows[i].adherent_prof_ecole1_web, GS_asso_locales_rows[i].adherent_prof_ecole2, GS_asso_locales_rows[i].adherent_prof_ecole2_adresse, GS_asso_locales_rows[i].adherent_prof_ecole2_cp, GS_asso_locales_rows[i].adherent_prof_ecole2_ville, GS_asso_locales_rows[i].adherent_prof_ecole2_mail, GS_asso_locales_rows[i].adherent_prof_ecole2_web, GS_asso_locales_rows[i].adherent_prof_ecole3, GS_asso_locales_rows[i].adherent_prof_ecole3_adresse, GS_asso_locales_rows[i].adherent_prof_ecole3_cp, GS_asso_locales_rows[i].adherent_prof_ecole3_ville, GS_asso_locales_rows[i].adherent_prof_ecole3_mail, GS_asso_locales_rows[i].adherent_prof_ecole3_web];
const [results3, fields3] = await promisePool.query(sql3, sql_values3); // Execution SQL
logger.info("INSERT - adherent_professeur - Row ID added : " + results3.insertId, { numsession: req.session.id, label: filename});
}
// AJOUT DANS LA TABLE adherent_formation_prof
if (GS_asso_locales_rows[i].adherent_prof_stagiaire_instrument1) {
let sql4 = 'INSERT INTO adherent_formation_prof (date_maj, saison, identifiant, association_suzuki, adherent_nom, adherent_prenom, adherent_telephone_mobile, adherent_mail, adherent_prof_stagiaire_instrument1, adherent_prof_stagiaire_instrument1_prof, adherent_prof_stagiaire_instrument1_esa, adherent_prof_stagiaire_instrument2, adherent_prof_stagiaire_instrument2_prof, adherent_prof_stagiaire_instrument2_esa) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)';
let sql_values4 = [now, GS_asso_locales_rows[i].saison, GS_asso_locales_rows[i].identifiant, GS_asso_locales_rows[i].association, GS_asso_locales_rows[i].adherent_nom, GS_asso_locales_rows[i].adherent_prenom, GS_asso_locales_rows[i].adherent_telephone_mobile, GS_asso_locales_rows[i].adherent_mail, GS_asso_locales_rows[i].adherent_prof_stagiaire_instrument1, GS_asso_locales_rows[i].adherent_prof_stagiaire_instrument1_prof, GS_asso_locales_rows[i].adherent_prof_stagiaire_instrument1_esa, GS_asso_locales_rows[i].adherent_prof_stagiaire_instrument2, GS_asso_locales_rows[i].adherent_prof_stagiaire_instrument2_prof, GS_asso_locales_rows[i].adherent_prof_stagiaire_instrument2_esa];
const [results4, fields4] = await promisePool.query(sql4, sql_values4); // Execution SQL
logger.info("INSERT - adherent_formation_prof - Row ID added : " + results4.insertId, { numsession: req.session.id, label: filename});
}
// AJOUT DANS LA TABLE adherent_eleve 1
if (GS_asso_locales_rows[i].adherent_eleve1_nom) {
let sql5 = 'INSERT INTO adherent_eleve (date_maj, saison, identifiant, association_suzuki, adherent_telephone_mobile, adherent_mail, eleve_nom, eleve_prenom, eleve_datenaissance, eleve_contactsup_nom, eleve_contactsup_prenom, eleve_contactsup_mail, eleve_instrumentA, eleve_instrumentA_prof, eleve_instrumentA_cahier, eleve_instrumentB, eleve_instrumentB_prof, eleve_instrumentB_cahier, eleve_droitimage) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)';
let sql_values5 = [now, GS_asso_locales_rows[i].saison, GS_asso_locales_rows[i].identifiant, GS_asso_locales_rows[i].association, GS_asso_locales_rows[i].adherent_telephone_mobile, GS_asso_locales_rows[i].adherent_mail, GS_asso_locales_rows[i].adherent_eleve1_nom, GS_asso_locales_rows[i].adherent_eleve1_prenom, GS_asso_locales_rows[i].adherent_eleve1_datenaissance, GS_asso_locales_rows[i].adherent_eleve1_contactsup_nom, GS_asso_locales_rows[i].adherent_eleve1_contactsup_prenom, GS_asso_locales_rows[i].adherent_eleve1_contactsup_mail, GS_asso_locales_rows[i].adherent_eleve1_InstrumentA, GS_asso_locales_rows[i].adherent_eleve1_InstrumentA_prof, GS_asso_locales_rows[i].adherent_eleve1_InstrumentA_cahier, GS_asso_locales_rows[i].adherent_eleve1_InstrumentB, GS_asso_locales_rows[i].adherent_eleve1_InstrumentB_prof, GS_asso_locales_rows[i].adherent_eleve1_InstrumentB_cahier, GS_asso_locales_rows[i].adherent_eleve1_droitimage];
const [results5, fields5] = await promisePool.query(sql5, sql_values5); // Execution SQL
logger.info("INSERT - adherent_eleve 1 - Row ID added : " + results5.insertId, { numsession: req.session.id, label: filename});
}
// AJOUT DANS LA TABLE adherent_eleve 2
if (GS_asso_locales_rows[i].adherent_eleve2_nom) {
let sql6 = 'INSERT INTO adherent_eleve (date_maj, saison, identifiant, association_suzuki, adherent_telephone_mobile, adherent_mail, eleve_nom, eleve_prenom, eleve_datenaissance, eleve_contactsup_nom, eleve_contactsup_prenom, eleve_contactsup_mail, eleve_instrumentA, eleve_instrumentA_prof, eleve_instrumentA_cahier, eleve_instrumentB, eleve_instrumentB_prof, eleve_instrumentB_cahier, eleve_droitimage) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)';
let sql_values6 = [now, GS_asso_locales_rows[i].saison, GS_asso_locales_rows[i].identifiant, GS_asso_locales_rows[i].association, GS_asso_locales_rows[i].adherent_telephone_mobile, GS_asso_locales_rows[i].adherent_mail, GS_asso_locales_rows[i].adherent_eleve2_nom, GS_asso_locales_rows[i].adherent_eleve2_prenom, GS_asso_locales_rows[i].adherent_eleve2_datenaissance, GS_asso_locales_rows[i].adherent_eleve2_contactsup_nom, GS_asso_locales_rows[i].adherent_eleve2_contactsup_prenom, GS_asso_locales_rows[i].adherent_eleve2_contactsup_mail, GS_asso_locales_rows[i].adherent_eleve2_InstrumentA, GS_asso_locales_rows[i].adherent_eleve2_InstrumentA_prof, GS_asso_locales_rows[i].adherent_eleve2_InstrumentA_cahier, GS_asso_locales_rows[i].adherent_eleve2_InstrumentB, GS_asso_locales_rows[i].adherent_eleve2_InstrumentB_prof, GS_asso_locales_rows[i].adherent_eleve2_InstrumentB_cahier, GS_asso_locales_rows[i].adherent_eleve2_droitimage];
const [results6, fields6] = await promisePool.query(sql6, sql_values6); // Execution SQL
logger.info("INSERT - adherent_eleve 2 - Row ID added : " + results6.insertId, { numsession: req.session.id, label: filename});
}
// AJOUT DANS LA TABLE adherent_eleve 3
if (GS_asso_locales_rows[i].adherent_eleve3_nom) {
let sql7 = 'INSERT INTO adherent_eleve (date_maj, saison, identifiant, association_suzuki, adherent_telephone_mobile, adherent_mail, eleve_nom, eleve_prenom, eleve_datenaissance, eleve_contactsup_nom, eleve_contactsup_prenom, eleve_contactsup_mail, eleve_instrumentA, eleve_instrumentA_prof, eleve_instrumentA_cahier, eleve_instrumentB, eleve_instrumentB_prof, eleve_instrumentB_cahier, eleve_droitimage) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)';
let sql_values7 = [now, GS_asso_locales_rows[i].saison, GS_asso_locales_rows[i].identifiant, GS_asso_locales_rows[i].association, GS_asso_locales_rows[i].adherent_telephone_mobile, GS_asso_locales_rows[i].adherent_mail, GS_asso_locales_rows[i].adherent_eleve3_nom, GS_asso_locales_rows[i].adherent_eleve3_prenom, GS_asso_locales_rows[i].adherent_eleve3_datenaissance, GS_asso_locales_rows[i].adherent_eleve3_contactsup_nom, GS_asso_locales_rows[i].adherent_eleve3_contactsup_prenom, GS_asso_locales_rows[i].adherent_eleve3_contactsup_mail, GS_asso_locales_rows[i].adherent_eleve3_InstrumentA, GS_asso_locales_rows[i].adherent_eleve3_InstrumentA_prof, GS_asso_locales_rows[i].adherent_eleve3_InstrumentA_cahier, GS_asso_locales_rows[i].adherent_eleve3_InstrumentB, GS_asso_locales_rows[i].adherent_eleve3_InstrumentB_prof, GS_asso_locales_rows[i].adherent_eleve3_InstrumentB_cahier, GS_asso_locales_rows[i].adherent_eleve3_droitimage];
const [results7, fields7] = await promisePool.query(sql7, sql_values7); // Execution SQL
logger.info("INSERT - adherent_eleve 3 - Row ID added : " + results7.insertId, { numsession: req.session.id, label: filename});
}
// AJOUT DANS LA TABLE adherent_eleve 4
if (GS_asso_locales_rows[i].adherent_eleve4_nom) {
let sql8 = 'INSERT INTO adherent_eleve (date_maj, saison, identifiant, association_suzuki, adherent_telephone_mobile, adherent_mail, eleve_nom, eleve_prenom, eleve_datenaissance, eleve_contactsup_nom, eleve_contactsup_prenom, eleve_contactsup_mail, eleve_instrumentA, eleve_instrumentA_prof, eleve_instrumentA_cahier, eleve_instrumentB, eleve_instrumentB_prof, eleve_instrumentB_cahier, eleve_droitimage) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)';
let sql_values8 = [now, GS_asso_locales_rows[i].saison, GS_asso_locales_rows[i].identifiant, GS_asso_locales_rows[i].association, GS_asso_locales_rows[i].adherent_telephone_mobile, GS_asso_locales_rows[i].adherent_mail, GS_asso_locales_rows[i].adherent_eleve4_nom, GS_asso_locales_rows[i].adherent_eleve4_prenom, GS_asso_locales_rows[i].adherent_eleve4_datenaissance, GS_asso_locales_rows[i].adherent_eleve4_contactsup_nom, GS_asso_locales_rows[i].adherent_eleve4_contactsup_prenom, GS_asso_locales_rows[i].adherent_eleve4_contactsup_mail, GS_asso_locales_rows[i].adherent_eleve4_InstrumentA, GS_asso_locales_rows[i].adherent_eleve4_InstrumentA_prof, GS_asso_locales_rows[i].adherent_eleve4_InstrumentA_cahier, GS_asso_locales_rows[i].adherent_eleve4_InstrumentB, GS_asso_locales_rows[i].adherent_eleve4_InstrumentB_prof, GS_asso_locales_rows[i].adherent_eleve4_InstrumentB_cahier, GS_asso_locales_rows[i].adherent_eleve4_droitimage];
const [results8, fields8] = await promisePool.query(sql8, sql_values8); // Execution SQL
logger.info("INSERT - adherent_eleve 4 - Row ID added : " + results8.insertId, { numsession: req.session.id, label: filename});
}
// AJOUT DANS LA TABLE adherent_eleve 5
if (GS_asso_locales_rows[i].adherent_eleve5_nom) {
let sql9 = 'INSERT INTO adherent_eleve (date_maj, saison, identifiant, association_suzuki, adherent_telephone_mobile, adherent_mail, eleve_nom, eleve_prenom, eleve_datenaissance, eleve_contactsup_nom, eleve_contactsup_prenom, eleve_contactsup_mail, eleve_instrumentA, eleve_instrumentA_prof, eleve_instrumentA_cahier, eleve_instrumentB, eleve_instrumentB_prof, eleve_instrumentB_cahier, eleve_droitimage) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)';
let sql_values9 = [now, GS_asso_locales_rows[i].saison, GS_asso_locales_rows[i].identifiant, GS_asso_locales_rows[i].association, GS_asso_locales_rows[i].adherent_telephone_mobile, GS_asso_locales_rows[i].adherent_mail, GS_asso_locales_rows[i].adherent_eleve5_nom, GS_asso_locales_rows[i].adherent_eleve5_prenom, GS_asso_locales_rows[i].adherent_eleve5_datenaissance, GS_asso_locales_rows[i].adherent_eleve5_contactsup_nom, GS_asso_locales_rows[i].adherent_eleve5_contactsup_prenom, GS_asso_locales_rows[i].adherent_eleve5_contactsup_mail, GS_asso_locales_rows[i].adherent_eleve5_InstrumentA, GS_asso_locales_rows[i].adherent_eleve5_InstrumentA_prof, GS_asso_locales_rows[i].adherent_eleve5_InstrumentA_cahier, GS_asso_locales_rows[i].adherent_eleve5_InstrumentB, GS_asso_locales_rows[i].adherent_eleve5_InstrumentB_prof, GS_asso_locales_rows[i].adherent_eleve5_InstrumentB_cahier, GS_asso_locales_rows[i].adherent_eleve5_droitimage];
const [results9, fields9] = await promisePool.query(sql9, sql_values9); // Execution SQL
logger.info("INSERT - adherent_eleve 5 - Row ID added : " + results9.insertId, { numsession: req.session.id, label: filename});
}
/////////////////////////////////////////////////
// ENVOIE CARTE ADHÉRENT
//////////////////////////////////////////////////////////////////////////////
// ADOBE PDF : CRÉATION DE LA CARTE D'ADHÉSION EN PDF
// + JUSTIFICATIF DE DON
//////////////////////////////////////////////////////////////////////////////
// DÉFINIR LE PROFIL À AJOUTER DANS LA CARTE ADHÉRENT
// La fonction est dans le fichier /modules/adherent_type.js
profils = carte_adherent.profil(GS_asso_locales_rows[i].adherent_type);
profil1 = profils[0];
profil2 = profils[1];
profil3 = profils[2];
let OUTPUT;
let INPUT
// S'il y a un don
if (GS_asso_locales_rows[i].adherent_paiement_montant_don > 0) {
OUTPUT = path.resolve(__dirname, "../pdf/adhesion/2526/paye/")+"/"+GS_asso_locales_rows[i].identifiant+"_adhesion_2526_paye_don_"+now_pdf+".pdf";
INPUT = path.resolve(__dirname, "../pdf/template/carte_adherent_don.docx");
} else {
// S'il n'y a pas de don
OUTPUT = path.resolve(__dirname, "../pdf/adhesion/2526/paye/")+"/"+GS_asso_locales_rows[i].identifiant+"_adhesion_2526_paye_"+now_pdf+".pdf";
INPUT = path.resolve(__dirname, "../pdf/template/carte_adherent.docx");
}
moment.locale('fr');
var date_formattee = moment().format('L')
var today = date_formattee;
var adresse = GS_asso_locales_rows[i].adherent_adresse_rue;
adresse += " ";
adresse += GS_asso_locales_rows[i].adherent_adresse_codepostal;
adresse += " ";
adresse += GS_asso_locales_rows[i].adherent_adresse_ville;
if (profil2 == undefined) {profil2 = " "};
if (profil3 == undefined) {profil3 = ""};
JSON_INPUT =
{
"date": today,
"identifiant": GS_asso_locales_rows[i].identifiant,
"profil1": profil1,
"profil2": profil2,
"profil3": profil3,
"mode_paiement": GS_asso_locales_rows[i].adherent_paiement_mode,
"nom": GS_asso_locales_rows[i].adherent_nom,
"prenom": GS_asso_locales_rows[i].adherent_prenom,
"adresse": adresse,
"montant_don": GS_asso_locales_rows[i].adherent_paiement_montant_don
};
const documentMerge = PDFServicesSdk.DocumentMerge,
documentMergeOptions = documentMerge.options,
adobe_options = new documentMergeOptions.DocumentMergeOptions(JSON_INPUT, documentMergeOptions.OutputFormat.PDF);
// Create a new operation instance using the options instance.
const documentMergeOperation = documentMerge.Operation.createNew(adobe_options);
// Set operation input document template from a source file.
const input = PDFServicesSdk.FileRef.createFromLocalFile(INPUT);
documentMergeOperation.setInput(input);
// Execute the operation and Save the result to the specified location.
await documentMergeOperation
.execute(executionContext)
.then(result => result.saveAsFile(OUTPUT).then(
)
)
.catch(err => {
if(err instanceof PDFServicesSdk.Error.ServiceApiError
|| err instanceof PDFServicesSdk.Error.ServiceUsageError) {
console.log('Exception encountered while executing ADOBE PDF', err);
} else {
console.log('Exception encountered while executing ADOBE PDF', err);
}
});
//////////////////////////////////////////////////////////////////////////////
// ENVOIE CARTE ADHERENT + JUSTIFICATIF DE DON PAR MAIL
console.log("MAIL ENVOI AVANT");
var transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: process.env.nodemailer_user,
pass: process.env.nodemailer_pass
}
});
var attachment_name = GS_asso_locales_rows[i].identifiant;
attachment_name += "_adhesion_2526_carteadherent.pdf";
var attachment_don_name = GS_asso_locales_rows[i].identifiant;
attachment_don_name += "_don.pdf";
var mail_objet = "ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - ADHÉSION 2025/2026 - ";
mail_objet += GS_asso_locales_rows[i].identifiant;
mail_html = "<p>Cher adhérent,</p><p>Félicitations ! Vous êtes désormais membre de lAssociation Française pour la Pédagogie Suzuki (http://www.afpedagogiesuzuki.fr) et de lEuropean Suzuki Association (https://europeansuzuki.org) pour l'année 2025/2026. Vous pouvez à ce titre participer à tous les événements Suzuki en France et dans le monde.</p><p>Vous trouverez en pièce jointe votre carte d'adhésion annuelle (valable du 1er septembre 2025 au 31 août 2026).</p><p>Votre identifiant (valable pour toute la famille) est ";
mail_html += GS_asso_locales_rows[i].identifiant;
mail_html += ".</p>";
if (GS_asso_locales_rows[i].adherent_paiement_montant_don > 0) {
mail_html += "<br><p>Nous vous remercions chaleureusement pour votre don. Votre justificatif est également joint à ce mail</p>";
}
mail_html += "<p><br>Nous vous remercions pour votre intérêt et vous souhaitons une très belle année en musique !</p><p>Association Française pour la pédagogie Suzuki<br>Chez Anne PAGES<br>30 rue des Tattes<br>74500 PUBLIER</p>";
var mailOptions = {
from: 'afps.inscription@gmail.com',
to: GS_asso_locales_rows[i].adherent_mail,
subject: mail_objet,
html: mail_html,
attachments: [{
filename: attachment_name,
path: OUTPUT
}
]
};
transporter.sendMail(mailOptions, function(error, info){
if (error) {
logger.info("error : " + error, { numsession: req.session.id });
} else {
console.log('Email sent: ' + info.response);
}
});
console.log("MAIL ENVOI APRES");
// METTRE À JOUR LE STATUS D'ENVOI DE LA CARTE
let sql10 = 'UPDATE ';
sql10 += 'adherent';
sql10 += ' SET ';
sql10 += 'carte_envoi = "definitive"';
sql10 += ' WHERE identifiant = "' + GS_asso_locales_rows[i].identifiant + '"';
const [results10, fields10] = await promisePool.query(sql10); // Execution SQL
logger.info("adherent carte envoi Row ID changed : " + results10.changedRows, { numsession: req.session.id, label: filename});
/////////////////////////////////////////////////
// GS - Taguer l'adhérent comme importé dans le tableau Google Sheet
GS_asso_locales_rows[i].date_export = now;
await GS_asso_locales_rows[i].save();
await sleep.wait(2000);
nb_import++;
}
}
/////////////////////////////////////////////////
// ON AFFICHE LE NOMBRE DE LIGNES IMPORTÉES
req.session.message4 = 'Adhérents associations locales importées : ' + nb_import;
res.redirect('/adhesion/maj_googlesheet');
} catch (error) {
// Echec de connection à la BD
logger.error("Il y a un problème avec la connection à la base de données : " + error, { numsession: req.session.id });
req.session.message4 = "Il y a un problème système, veuillez recommencer. " + error;
//pool.end();
res.redirect('/adhesion/maj_googlesheet');
};
}
/////////////////////////////////////////////////
// EXPORT DE MODULE POUR QU'IL SOIT LU DANS LES AUTRES FICHIERS JS
/////////////////////////////////////////////////
module.exports = {
import_ass_locales_v2
}

View File

@@ -0,0 +1,128 @@
/////////////////////////////////////////////////
// APPELS DES MODULES
/////////////////////////////////////////////////
const path = require("path");
// CALCUL DE DATE
const moment = require('moment');
// uuid
const { v4: uuidv4 } = require('uuid');
/////////////////////////////////////////////////
// APPELS DES MODULES PERSOS
/////////////////////////////////////////////////
// loggings
const logger = require("../public/js/app/logger_adhesion");
// DB
const { connect_DB_promise } = require('../modules/db/databaseconnect');
////////////////////////////////////////////////////
// FILE NAME
////////////////////////////////////////////////////
const filename = path.parse(__filename).base;
// GOOGLE SHEET PARAMETERS
/////////////////////////////////////////////////
const { GoogleSpreadsheet } = require('google-spreadsheet');
const GS_creds = require('../inscriptionsafps-53b60452f63d.json');
const GS_codes_secrets = new GoogleSpreadsheet(process.env.gsheet_codes_secrets);
const { error } = require("console");
/////////////////////////////////////////////////
// FONCTIONS
/////////////////////////////////////////////////
const generer_codes = async function(req, res) {
logger.info("======================================", { label: filename });
logger.info("======== FUNCTION generer_codes ==========", { label: filename });
logger.info("======================================", { label: filename });
moment.locale('fr');
let now = moment().format("YYYY-MM-DD HH:mm:ss");
// Récupérer le nombre de code désiré
nb_codes_a_generer = req.body.nb_code;
// Si il y a des codes à ajouter on fait le traitement
if (nb_codes_a_generer > 0) {
logger.info("Nombre de codes à générer = " + nb_codes_a_generer, { numsession: req.session.id });
// Initier un tableau pour mettre les codes générés
let tab_codes = [];
// Boucle sur le nombre de codes à générer
for (i=0; i<nb_codes_a_generer; i++) {
// Générer un code unique
let uniqueCode = uuidv4();
// remplir le tableau avec le code généré
tab_codes.push({['code'] : uniqueCode,'statut': "actif" });
console.log("tab_codes = ", tab_codes);
}
// Copier les codes générés dans la base de données
let table = "code";
const sql = 'INSERT INTO code (code, statut) VALUES ?';
const values = tab_codes.map(item => [item.code, item.statut]);
logger.info("sql = " + sql, { numsession: req.session.id });
logger.info("values = " + values, { numsession: req.session.id });
// lancement de la requête
let db_connection_promise = await connect_DB_promise();
const [result_sql, fields] = await db_connection_promise.query(sql, [values]);
logger.info("#1 result_sql Row ID added : " + result_sql.insertId, { numsession: req.session.id, label: filename});
console.log("result_sql = ",result_sql)
// GOOGLE SHEET - COPIER LES CODES DANS LA GOOGLE SHEET
try {
await GS_codes_secrets.useServiceAccountAuth(GS_creds);
await GS_codes_secrets.loadInfo();
let GS_codes_secrets_codes_secrets = GS_codes_secrets.sheetsByTitle['codes_secrets'];
let ajout_codes = [];
for (let i = 0; i < nb_codes_a_generer; i++) {
ajout_codes.push({
code: tab_codes[i].code,
date_creation: now,
statut: tab_codes[i].statut
});
}
await GS_codes_secrets_codes_secrets.addRows(ajout_codes);
logger.info("AJOUT GOOGLESHEET FIN", { numsession: req.session.id, label: filename});
} catch (error) {
// Echec de connection à la GOOGLE SHEET
logger.error("Il y a un problème avec la connection à Google sheet (TRY 7) : " + error, { numsession: req.session.id, label: filename});
req.session.message5 = '"Il y a un problème système, "' + error;
res.redirect('/adhesion/maj_googlesheet');
}
// A LA FIN DU TRAITEMENT ON AFFICHE LA PAGE AVEC LE RÉSULTAT
if (result_sql.affectedRows > 0) {
req.session.message5 = 'Nombre de codes ajoutés = '+result_sql.affectedRows;
} else {
req.session.message5 = 'Aucun code ajouté';
}
logger.info("req.session.message5 : " + req.session.message5, { numsession: req.session.id, label: filename});
} else {
req.session.message5 = 'Veuillez renseigner le nombre de codes à générer';
logger.info("req.session.message5 : " + req.session.message5, { numsession: req.session.id, label: filename});
}
res.redirect('/adhesion/maj_googlesheet');
}
/////////////////////////////////////////////////
// EXPORT DE MODULE POUR QU'IL SOIT LU DANS LES AUTRES FICHIERS JS
/////////////////////////////////////////////////
module.exports = {
generer_codes
}

View File

@@ -0,0 +1,186 @@
/////////////////////////////////////////////////
// LOGGING
/////////////////////////////////////////////////
const logger = require("../../public/js/app/logger_concert");
/////////////////////////////////////////////////
// APPELS DES MODULES
/////////////////////////////////////////////////
const path = require("path");
const fs = require("fs");
// CALCUL DE DATE
const moment = require('moment');
// ENVOIE MAIL GOOGLE MAIL
const nodemailer = require('nodemailer');
// CONNECTION BASE DE DONNÉES
const mysql = require('mysql2');
const mysql_promise = require('mysql2/promise');
////////////////////////////////////////////////////
// FILE NAME
////////////////////////////////////////////////////
const filename = path.parse(__filename).base;
/////////////////////////////////////////////////
// APPELS DES FONCTIONS
/////////////////////////////////////////////////
const sleep = require("./../../modules/sleep");
////////////////////////////////////////////////////
// CONNECTION DB
////////////////////////////////////////////////////
async function connect_DB_promise() {
return db_connection_promise = await mysql_promise.createConnection({
host: process.env.db_connection_host,
port: process.env.db_connection_port,
user: process.env.db_connection_user,
password: process.env.db_connection_password,
database: process.env.db_connection_database
});
}
/////////////////////////////////////////////////
// PAGE 1
// DOMAIN/concert/identifier
// 2. SAISIE DU L'IDENTIFIANT
// VÉRIFICATION SI L'IDENTIFIANT EST ADHÉRENT
/////////////////////////////////////////////////
const adminController = async function (req, res) {
logger.info("======================================", { label: filename });
logger.info("======== FUNCTION adminController ==========", { label: filename });
logger.info("======================================", { label: filename });
function affiche_page_admin() {
////////////////////////////////////////////////////
// AFFIHER LA PAGE /identifier
// AFFICHAGE DES ERREURS
// EN CAS DE RETOUR SUR LA PAGE AVEC ERREUR :
// - SI IDENTIFIANT NON ADHÉRENT
// - SI RIEN SAISIE
////////////////////////////////////////////////////
if (req.session.err_mail_form_adhesion_1) {
res.locals.err_mail_form_adhesion_1 = req.session.err_mail_form_adhesion_1;
res.locals.err_mail_form_adhesion_2 = req.session.err_mail_form_adhesion_2;
res.locals.err_mail_form_adhesion_3 = req.session.err_mail_form_adhesion_3;
// on supprime le contenu après affichage
req.session.err_mail_form_adhesion_1 = undefined;
req.session.err_mail_form_adhesion_2 = undefined;
req.session.err_mail_form_adhesion_3 = undefined;
}
res.render('concert/page_templates/admin');
};
if (req.session.err_mail_form_adhesion_1) {
res.locals.err_mail_form_adhesion_1 = req.session.err_mail_form_adhesion_1;
res.locals.err_mail_form_adhesion_2 = req.session.err_mail_form_adhesion_2;
res.locals.err_mail_form_adhesion_3 = req.session.err_mail_form_adhesion_3;
// on supprime le contenu après affichage
req.session.err_mail_form_adhesion_1 = undefined;
req.session.err_mail_form_adhesion_2 = undefined;
req.session.err_mail_form_adhesion_3 = undefined;
}
// CONNECTION DB PROMISE
try {
//Connexion
let db_connection_promise = await connect_DB_promise();
let sql_count_instruments = 'SELECT count(ca_concertiste.concertiste_intrument) AS concertistes_total FROM ca_concertiste LEFT JOIN ca_adherent ON ca_concertiste.identifiant = ca_adherent.identifiant WHERE ca_adherent.stripe_statut_paiement = "paye"';
var [results_count_instruments, fields_count_instruments] = await db_connection_promise.execute(sql_count_instruments);
console.log("results_count_instruments = ",results_count_instruments);
let sql_count_piano = 'SELECT count(ca_concertiste.concertiste_intrument) AS piano FROM ca_concertiste LEFT JOIN ca_adherent ON ca_concertiste.identifiant = ca_adherent.identifiant WHERE ca_concertiste.concertiste_intrument = "Piano" AND ca_adherent.stripe_statut_paiement = "paye"';
var [results_count_piano, fields_count_piano] = await db_connection_promise.execute(sql_count_piano);
console.log("results_count_piano = ",results_count_piano);
let sql_count_violon_1 = 'SELECT count(ca_concertiste.concertiste_intrument) AS violon_1 FROM ca_concertiste LEFT JOIN ca_adherent ON ca_concertiste.identifiant = ca_adherent.identifiant WHERE ca_concertiste.concertiste_intrument = "Violon" AND (ca_concertiste.concertiste_cahier = "Cahier 1" OR ca_concertiste.concertiste_cahier = "Cahier 2" OR ca_concertiste.concertiste_cahier = "Cahier 3" OR ca_concertiste.concertiste_cahier = "Cahier 4" OR ca_concertiste.concertiste_cahier = "Cahier 5") AND ca_adherent.stripe_statut_paiement = "paye"';
var [results_count_violon_1, fields_count_violon_1] = await db_connection_promise.execute(sql_count_violon_1);
console.log("results_count_violon_1 = ",results_count_violon_1);
let sql_count_violon_2 = 'SELECT count(ca_concertiste.concertiste_intrument) AS violon_2 FROM ca_concertiste LEFT JOIN ca_adherent ON ca_concertiste.identifiant = ca_adherent.identifiant WHERE ca_concertiste.concertiste_intrument = "Violon" AND (ca_concertiste.concertiste_cahier = "Cahier 6" OR ca_concertiste.concertiste_cahier = "Cahier 7" OR ca_concertiste.concertiste_cahier = "Cahier 8" OR ca_concertiste.concertiste_cahier = "Cahier 9" OR ca_concertiste.concertiste_cahier = "Cahier 10") AND ca_adherent.stripe_statut_paiement = "paye"';
var [results_count_violon_2, fields_count_violon_2] = await db_connection_promise.execute(sql_count_violon_2);
console.log("results_count_violon_2 = ",results_count_violon_2);
let sql_count_alto = 'SELECT count(ca_concertiste.concertiste_intrument) AS alto FROM ca_concertiste LEFT JOIN ca_adherent ON ca_concertiste.identifiant = ca_adherent.identifiant WHERE ca_concertiste.concertiste_intrument = "Alto" AND ca_adherent.stripe_statut_paiement = "paye"';
var [results_count_alto, fields_count_alto] = await db_connection_promise.execute(sql_count_alto);
console.log("results_count_alto = ",results_count_alto);
let sql_count_violoncelle_1 = 'SELECT count(ca_concertiste.concertiste_intrument) AS violoncelle_1 FROM ca_concertiste LEFT JOIN ca_adherent ON ca_concertiste.identifiant = ca_adherent.identifiant WHERE ca_concertiste.concertiste_intrument = "Violoncelle" AND (ca_concertiste.concertiste_cahier = "Cahier 1" OR ca_concertiste.concertiste_cahier = "Cahier 2" OR ca_concertiste.concertiste_cahier = "Cahier 3" OR ca_concertiste.concertiste_cahier = "Cahier 4") AND ca_adherent.stripe_statut_paiement = "paye"';
var [results_count_violoncelle_1, fields_count_violoncelle_1] = await db_connection_promise.execute(sql_count_violoncelle_1);
console.log("results_count_violoncelle_1 = ",results_count_violoncelle_1);
let sql_count_violoncelle_2 = 'SELECT count(ca_concertiste.concertiste_intrument) AS violoncelle_2 FROM ca_concertiste LEFT JOIN ca_adherent ON ca_concertiste.identifiant = ca_adherent.identifiant WHERE ca_concertiste.concertiste_intrument = "Violoncelle" AND (ca_concertiste.concertiste_cahier = "Cahier 5" OR ca_concertiste.concertiste_cahier = "Cahier 6" OR ca_concertiste.concertiste_cahier = "Cahier 7" OR ca_concertiste.concertiste_cahier = "Cahier 8" OR ca_concertiste.concertiste_cahier = "Cahier 9" OR ca_concertiste.concertiste_cahier = "Cahier 10") AND ca_adherent.stripe_statut_paiement = "paye"';
var [results_count_violoncelle_2, fields_count_violoncelle_2] = await db_connection_promise.execute(sql_count_violoncelle_2);
console.log("results_count_violoncelle_2 = ",results_count_violoncelle_2);
let sql_count_trompette = 'SELECT count(ca_concertiste.concertiste_intrument) AS trompette FROM ca_concertiste LEFT JOIN ca_adherent ON ca_concertiste.identifiant = ca_adherent.identifiant WHERE ca_concertiste.concertiste_intrument = "Trompette" AND ca_adherent.stripe_statut_paiement = "paye"';
var [results_count_trompette, fields_count_trompette] = await db_connection_promise.execute(sql_count_trompette);
console.log("results_count_trompette = ",results_count_trompette);
let sql_count_flute = 'SELECT count(ca_concertiste.concertiste_intrument) AS flute FROM ca_concertiste LEFT JOIN ca_adherent ON ca_concertiste.identifiant = ca_adherent.identifiant WHERE ca_concertiste.concertiste_intrument = "Flute" AND ca_adherent.stripe_statut_paiement = "paye"';
var [results_count_flute, fields_count_flute] = await db_connection_promise.execute(sql_count_flute);
console.log("results_count_flute = ",results_count_flute);
let sql_count_harpe = 'SELECT count(ca_concertiste.concertiste_intrument) AS harpe FROM ca_concertiste LEFT JOIN ca_adherent ON ca_concertiste.identifiant = ca_adherent.identifiant WHERE ca_concertiste.concertiste_intrument = "Harpe" AND ca_adherent.stripe_statut_paiement = "paye"';
var [results_count_harpe, fields_count_harpe] = await db_connection_promise.execute(sql_count_harpe);
console.log("results_count_harpe = ",results_count_harpe);
let sql_count_encadrant_prof = 'SELECT count(ca_encadrant.identifiant) AS encadrant_prof FROM ca_encadrant WHERE ca_encadrant.encadrant_type="Professeur"';
var [results_count_encadrant_prof, fields_count_encadrant_prof] = await db_connection_promise.execute(sql_count_encadrant_prof);
console.log("results_count_encadrant_prof = ",results_count_encadrant_prof);
let sql_count_encadrant_parent = 'SELECT count(ca_encadrant.identifiant) AS encadrant_parent FROM ca_encadrant WHERE ca_encadrant.encadrant_type="Parent"';
var [results_count_encadrant_parent, fields_count_encadrant_parent] = await db_connection_promise.execute(sql_count_encadrant_parent);
console.log("results_count_encadrant_parent = ",results_count_encadrant_parent);
let sql_count_spectateurs = 'SELECT sum(ca_adherent.commande_nb_spectateur) AS spectateurs FROM `ca_adherent`';
var [results_count_spectateurs, fields_count_spectateurs] = await db_connection_promise.execute(sql_count_spectateurs);
console.log("results_count_spectateurs = ",results_count_spectateurs);
} catch (error) {
// Echec de connection à la BD
logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id });
req.session.err_mail_form_adhesion_1 = '"Il y a un problème système connexion base de données, veuillez recommencer, "' + error;
//await db_connection_promise.end();
affiche_page_identifier();
}
// affichage du template ejs /views/page_templates/inscription_accueil.ejs
// results_count_instruments = { name: 'John', age: 30, job: 'Developer' };
res.render('concert/page_templates/admin', {
results_count_instruments: results_count_instruments[0],
results_count_piano: results_count_piano[0],
results_count_violon_1: results_count_violon_1[0],
results_count_violon_2: results_count_violon_2[0],
results_count_violoncelle_1: results_count_violoncelle_1[0],
results_count_violoncelle_2: results_count_violoncelle_2[0],
results_count_trompette: results_count_trompette[0],
results_count_alto: results_count_alto[0],
results_count_flute: results_count_flute[0],
results_count_harpe: results_count_harpe[0],
results_count_encadrant_prof: results_count_encadrant_prof[0],
results_count_encadrant_parent: results_count_encadrant_parent[0],
results_count_spectateurs: results_count_spectateurs[0]
});
}
/////////////////////////////////////////////////
// EXPORT DES MODULES POUR QU'ILS PUISSENT LUS PAR LES AUTRES FICHIERS JS
/////////////////////////////////////////////////
module.exports = {
adminController
}

View File

@@ -0,0 +1,143 @@
/////////////////////////////////////////////////
// LOGGING
/////////////////////////////////////////////////
const logger = require("../../public/js/app/logger_concert");
/////////////////////////////////////////////////
// APPELS DES MODULES
/////////////////////////////////////////////////
const path = require("path");
const fs = require("fs");
// CALCUL DE DATE
const moment = require('moment');
// ENVOIE MAIL GOOGLE MAIL
const nodemailer = require('nodemailer');
// CONNECTION BASE DE DONNÉES
const mysql = require('mysql2');
const mysql_promise = require('mysql2/promise');
/////////////////////////////////////////////////
// APPELS DES FONCTIONS
/////////////////////////////////////////////////
const sleep = require("./../../modules/sleep");
////////////////////////////////////////////////////
// FILE NAME
////////////////////////////////////////////////////
const filename = path.parse(__filename).base;
////////////////////////////////////////////////////
// CONNECTION DB
////////////////////////////////////////////////////
async function connect_DB_promise() {
return db_connection_promise = await mysql_promise.createConnection({
host: process.env.db_connection_host,
port: process.env.db_connection_port,
user: process.env.db_connection_user,
password: process.env.db_connection_password,
database: process.env.db_connection_database
});
}
/////////////////////////////////////////////////
// PAGE 1
// DOMAIN/concert/identifier
// AFFICHAGE DE LA PAGE DE SAISIE DE L'IDENTIFIANT
// AFFICHAGE DU NOMBRE DE PLACES RESTANTES
/////////////////////////////////////////////////
const openidentifiant = async function (req, res) {
logger.info("======================================", { label: filename });
logger.info("======== FUNCTION openidentifiant ==========", { label: filename });
logger.info("======================================", { label: filename });
function affiche_page_identifier() {
////////////////////////////////////////////////////
// AFFIHER LA PAGE /identifier
// AFFICHAGE DES ERREURS
// EN CAS DE RETOUR SUR LA PAGE AVEC ERREUR :
// - SI IDENTIFIANT NON ADHÉRENT
// - SI RIEN SAISIE
////////////////////////////////////////////////////
if (req.session.err_mail_form_adhesion_1) {
res.locals.err_mail_form_adhesion_1 = req.session.err_mail_form_adhesion_1;
res.locals.err_mail_form_adhesion_2 = req.session.err_mail_form_adhesion_2;
res.locals.err_mail_form_adhesion_3 = req.session.err_mail_form_adhesion_3;
// on supprime le contenu après affichage
req.session.err_mail_form_adhesion_1 = undefined;
req.session.err_mail_form_adhesion_2 = undefined;
req.session.err_mail_form_adhesion_3 = undefined;
}
res.render('concert/page_templates/inscrip_formulaire_identifier');
};
////////////////////////////////////////////////////
// ON RÉCUPÈRE LE NOMBRE DE PLACES DÉJA COMMANDÉES DANS LA BASE DE DONNÉES
// !!! ATTENTION IL FAUT QUE LES NOMBRES SOIENT A ZÉRO AU DÉMMARAGE dans la table ca_decompte_place
////////////////////////////////////////////////////
async function recup_nb_places () {
logger.info("==================================================================", { label: filename });
logger.info("======== ON RÉCUPÈRE LE NOMBRE DE PLACES DÉJA COMMANDÉES DANS LA BASE DE DONNÉES ==========", { label: filename });
// CONNECTION DB PROMISE
try {
//Connexion
let db_connection_promise = await connect_DB_promise();
//Query
let sql = 'select spectateur_commandes,encadr_parent_commandes,piano_commandes,alto_commandes,flute_commandes,trompette_commandes,harpe_commandes,violon1_commandes,violon2_commandes,violoncelle1_commandes,violoncelle2_commandes from ca_decompte_place';
const [results, fields] = await db_connection_promise.execute(sql);
req.session.spectateur_nb_restantes = process.env.spectateur_nb_places - results[0].spectateur_commandes;
req.session.encadr_parent_nb_restantes = process.env.encadr_parent_nb_places - results[0].encadr_parent_commandes;
req.session.piano_nb_restantes = process.env.piano_nb_places - results[0].piano_commandes;
req.session.alto_nb_restantes = process.env.alto_nb_places - results[0].alto_commandes;
req.session.flute_nb_restantes = process.env.flute_nb_places - results[0].flute_commandes;
req.session.trompette_nb_restantes = process.env.trompette_nb_places - results[0].trompette_commandes;
req.session.harpe_nb_restantes = process.env.harpe_nb_places - results[0].harpe_commandes;
req.session.violon1_nb_restantes = process.env.violon1_nb_places - results[0].violon1_commandes;
req.session.violon2_nb_restantes = process.env.violon2_nb_places - results[0].violon2_commandes;
req.session.violoncelle1_nb_restantes = process.env.violoncelle1_nb_places - results[0].violoncelle1_commandes;
req.session.violoncelle2_nb_restantes = process.env.violoncelle2_nb_places - results[0].violoncelle2_commandes;
res.locals.spectateur_nb_restantes = req.session.spectateur_nb_restantes;
res.locals.encadr_parent_nb_restantes = req.session.encadr_parent_nb_restantes;
logger.info("res.locals.encadr_parent_nb_restantes : " + res.locals.encadr_parent_nb_restantes, { numsession: req.session.id, label: filename });
res.locals.piano_nb_restantes = req.session.piano_nb_restantes;
res.locals.alto_nb_restantes = req.session.alto_nb_restantes;
res.locals.flute_nb_restantes = req.session.flute_nb_restantes;
res.locals.trompette_nb_restantes = req.session.trompette_nb_restantes;
res.locals.harpe_nb_restantes = req.session.harpe_nb_restantes;
res.locals.violon1_nb_restantes = req.session.violon1_nb_restantes;
res.locals.violon2_nb_restantes = req.session.violon2_nb_restantes;
res.locals.violoncelle1_nb_restantes = req.session.violoncelle1_nb_restantes;
res.locals.violoncelle2_nb_restantes = req.session.violoncelle2_nb_restantes;
affiche_page_identifier();
} catch (error) {
// Echec de connection à la BD
logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id, label: filename });
req.session.err_mail_form_adhesion_1 = "Il y a un problème système connexion base de données, veuillez recommencer.";
//await db_connection_promise.end();
affiche_page_identifier();
}
}
recup_nb_places();
}
/////////////////////////////////////////////////
// EXPORT DES MODULES POUR QU'ILS PUISSENT LUS PAR LES AUTRES FICHIERS JS
/////////////////////////////////////////////////
module.exports = {
openidentifiant
}

View File

@@ -0,0 +1,285 @@
/////////////////////////////////////////////////
// LOGGING
/////////////////////////////////////////////////
const logger = require("../../public/js/app/logger_concert");
/////////////////////////////////////////////////
// APPELS DES MODULES
/////////////////////////////////////////////////
const path = require("path");
const fs = require("fs");
// CALCUL DE DATE
const moment = require('moment');
// ENVOIE MAIL GOOGLE MAIL
const nodemailer = require('nodemailer');
// CONNECTION BASE DE DONNÉES
const mysql = require('mysql2');
const mysql_promise = require('mysql2/promise');
/////////////////////////////////////////////////
// APPELS DES FONCTIONS
/////////////////////////////////////////////////
const sleep = require("./../../modules/sleep");
////////////////////////////////////////////////////
// FILE NAME
////////////////////////////////////////////////////
const filename = path.parse(__filename).base;
////////////////////////////////////////////////////
// CONNECTION DB
////////////////////////////////////////////////////
async function connect_DB_promise() {
return db_connection_promise = await mysql_promise.createConnection({
host: process.env.db_connection_host,
port: process.env.db_connection_port,
user: process.env.db_connection_user,
password: process.env.db_connection_password,
database: process.env.db_connection_database
});
}
/////////////////////////////////////////////////
// PAGE 1
// DOMAINconcert/identifier
// 2. SAISIE DU L'IDENTIFIANT
// VÉRIFICATION SI L'IDENTIFIANT EST ADHÉRENT
/////////////////////////////////////////////////
const checkidentifiant = async function (req, res) {
logger.info("======================================", { label: filename });
logger.info("======== FUNCTION checkidentifiant ==========", { label: filename });
logger.info("======================================", { label: filename });
function affiche_page_admin() {
////////////////////////////////////////////////////
// AFFIHER LA PAGE /identifier
// AFFICHAGE DES ERREURS
// EN CAS DE RETOUR SUR LA PAGE AVEC ERREUR :
// - SI IDENTIFIANT NON ADHÉRENT
// - SI RIEN SAISIE
////////////////////////////////////////////////////
if (req.session.err_mail_form_adhesion_1) {
res.locals.err_mail_form_adhesion_1 = req.session.err_mail_form_adhesion_1;
res.locals.err_mail_form_adhesion_2 = req.session.err_mail_form_adhesion_2;
res.locals.err_mail_form_adhesion_3 = req.session.err_mail_form_adhesion_3;
// on supprime le contenu après affichage
req.session.err_mail_form_adhesion_1 = undefined;
req.session.err_mail_form_adhesion_2 = undefined;
req.session.err_mail_form_adhesion_3 = undefined;
}
res.render('concert/page_templates/admin');
};
// VARIABLES
req.session.quota_spectateur = "nondepasse";
req.session.quota_concertiste = "nondepasse";
////////////////////////////////////////////////////
// ON RÉCUPÈRE LE NOMBRE DE PLACES DÉJA COMMANDÉES DANS LA BASE DE DONNÉES
// !!! ATTENTION IL FAUT QUE LES NOMBRES SOIENT A ZÉRO AU DÉMMARAGE dans la table ca_decompte_place
////////////////////////////////////////////////////
async function recup_nb_places () {
logger.info("==================================================================", { label: filename });
logger.info("======== ON RÉCUPÈRE LE NOMBRE DE PLACES DÉJA COMMANDÉES DANS LA BASE DE DONNÉES ==========", { label: filename });
// CONNECTION DB PROMISE
try {
//Connexion
let db_connection_promise = await connect_DB_promise();
//Query
let sql = 'select spectateur_commandes,encadr_parent_commandes,piano_commandes,alto_commandes,flute_commandes,trompette_commandes,harpe_commandes,violon1_commandes,violon2_commandes,violoncelle1_commandes,violoncelle2_commandes from ca_decompte_place';
const [results, fields] = await db_connection_promise.execute(sql);
req.session.spectateur_nb_restantes = process.env.spectateur_nb_places - results[0].spectateur_commandes;
req.session.encadr_parent_nb_restantes = process.env.encadr_parent_nb_places - results[0].encadr_parent_commandes;
req.session.piano_nb_restantes = process.env.piano_nb_places - results[0].piano_commandes;
req.session.alto_nb_restantes = process.env.alto_nb_places - results[0].alto_commandes;
req.session.flute_nb_restantes = process.env.flute_nb_places - results[0].flute_commandes;
req.session.trompette_nb_restantes = process.env.trompette_nb_places - results[0].trompette_commandes;
req.session.harpe_nb_restantes = process.env.harpe_nb_places - results[0].harpe_commandes;
req.session.violon1_nb_restantes = process.env.violon1_nb_places - results[0].violon1_commandes;
req.session.violon2_nb_restantes = process.env.violon2_nb_places - results[0].violon2_commandes;
req.session.violoncelle1_nb_restantes = process.env.violoncelle1_nb_places - results[0].violoncelle1_commandes;
req.session.violoncelle2_nb_restantes = process.env.violoncelle2_nb_places - results[0].violoncelle2_commandes;
res.locals.spectateur_nb_restantes = req.session.spectateur_nb_restantes;
res.locals.encadr_parent_nb_restantes = req.session.encadr_parent_nb_restantes;
res.locals.piano_nb_restantes = req.session.piano_nb_restantes;
res.locals.alto_nb_restantes = req.session.alto_nb_restantes;
res.locals.flute_nb_restantes = req.session.flute_nb_restantes;
res.locals.trompette_nb_restantes = req.session.trompette_nb_restantes;
res.locals.harpe_nb_restantes = req.session.harpe_nb_restantes;
res.locals.violon1_nb_restantes = req.session.violon1_nb_restantes;
res.locals.violon2_nb_restantes = req.session.violon2_nb_restantes;
res.locals.violoncelle1_nb_restantes = req.session.violoncelle1_nb_restantes;
res.locals.violoncelle2_nb_restantes = req.session.violoncelle2_nb_restantes;
} catch (error) {
// Echec de connection à la BD
logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id });
req.session.err_mail_form_adhesion_1 = "Il y a un problème système connexion base de données, veuillez recommencer.";
//await db_connection_promise.end();
}
}
recup_nb_places();
/////////////////////////////////////////////////
// RECHERCHE DANS DB
// - SI IDENTIFIANT SAISIE EST DÉJÀ INSCRIT AU CONCERT
/////////////////////////////////////////////////
// ON RÉCUPÈRE L'IDENTIFIANT SAISIE DANS LE FORMULAIRE
// ON REGARDE S'il à bien rempli l'identifiant et s'il a coché la case "je ne suis pas adhérent"
logger.info("identifiant saisi : " + req.body.identifiant, { numsession: req.session.id, label: filename});
if (req.body.identifiant && req.body.check_nonadherent) {
req.session.err_mail_form_adhesion_1 = "Pour vous inscrire au concert, vous devez au préalable être adhérent à l'Association Française pour la Pédagogie Suzuki (AFPS).";
req.session.err_mail_form_adhesion_2 = 'Pour adhérer <a target="_blank" href="https://www.inscription.afpedagogiesuzuki.fr/adhesion/"><span class="souligne">Cliquez ici</span></a>';
req.session.err_mail_form_adhesion_3 = '';
affiche_page_admin();
}
if (!req.body.identifiant && req.body.check_nonadherent) {
req.session.err_mail_form_adhesion_1 = "Pour vous inscrire au concert, vous devez au préalable être adhérent à l'Association Française pour la Pédagogie Suzuki (AFPS).";
req.session.err_mail_form_adhesion_2 = 'Pour adhérer <a target="_blank" href="https://www.inscription.afpedagogiesuzuki.fr/adhesion/"><span class="souligne">Cliquez ici</span></a>';
req.session.err_mail_form_adhesion_3 = '';
affiche_page_admin();
}
if (!req.body.identifiant && !req.body.check_nonadherent) {
req.session.err_mail_form_adhesion_1 = "Veuillez entrer votre identifiant AFPS<br>(Association Française pour la Pédagogie Suzuki).";
req.session.err_mail_form_adhesion_2 = "Si vous n'êtes pas encore adhérent, vous pouvez adhérer en";
req.session.err_mail_form_adhesion_3 = '<a target="_blank" href="https://www.inscription.afpedagogiesuzuki.fr/adhesion/"><span class="souligne">Cliquez ici</span></a>';
affiche_page_admin();
}
if (req.body.identifiant && !req.body.check_nonadherent) {
// SAISIE OK
req.session.identifiant = req.body.identifiant;
// EST-CE QUE L'IDENTIFIANT SAISI EST DÉJA INSCRIT AU CONCERT TABLE ca_adherent
// CONNECTION DB PROMISE
try {
//Connexion
let db_connection_promise = await connect_DB_promise();
//Query
let sql = 'select identifiant, association_suzuki, adherent_mail, commande_nb_spectateur, commande_nb_concertiste from ca_adherent where identifiant = "' + req.session.identifiant + '"';
const [results, fields] = await db_connection_promise.execute(sql);
logger.info("Row ca_adherent : " + results.length, { numsession: req.session.id, label: filename});
if (results.length) {
// DÉJA INSCRIT AU CONCERT
logger.info("Identifant déjà inscrit au concert.", { numsession: req.session.id, label: filename});
// TAG ADHÉRENT DÉJÀ INSCRIT
req.session.deja_inscrit_concert = "oui";
// QUOTA GÉNÉRAL DE PLACES TOTALES
let sql_ca_decompte_place = 'select spectateur_commandes from ca_decompte_place';
const [results_ca_decompte_place, fields_ca_decompte_place] = await db_connection_promise.execute(sql_ca_decompte_place);
logger.info("SQL nombre de places spectateurs déjà commandées : " + results_ca_decompte_place[0].spectateur_commandes, { numsession: req.session.id, label: filename});
// ON REGARDE LE NOMBRE DE SPECTATEURS DÉJÀ INSCRITS
// QUOTA GÉNÉRAL ATTEINT
if (results_ca_decompte_place[0].spectateur_commandes >= process.env.spectateur_nb_places){
// QUOTA DÉPASSÉ
logger.info("Quota spectateur TOTAL dépassé : " + results[0].commande_nb_spectateur, { numsession: req.session.id, label: filename});
req.session.err_mail_form_adhesion_1 = "Le nombre total de spectateurs a été atteint.";
req.session.err_mail_form_adhesion_2 = "Vous ne pouvez plus commander de places";
affiche_page_identifier();
}
// NOMBRE DE PLACES TOTALES RESTANTES
req.session.quota_total_spectateur = process.env.spectateur_nb_places - results_ca_decompte_place[0].spectateur_commandes;
logger.info("NOMBRE DE PLACES TOTALES RESTANTES : " + req.session.quota_total_spectateur, { numsession: req.session.id, label: filename});
// ON REGARDE LE NOMBRE DE PARTICIPANTS DÉJÀ INSCRITS
if (results[0].commande_nb_spectateur > 6){
req.session.quota_spectateur = "depasse";
}
if (results[0].commande_nb_concertiste > 3){
req.session.quota_concertiste = "depasse";
}
logger.info("req.session.quota_spectateur = " + req.session.quota_spectateur , { numsession: req.session.id, label: filename});
logger.info("req.session.quota_concertiste = " + req.session.quota_concertiste , { numsession: req.session.id, label: filename});
// On calcule le nombre de places concertistes restantes (tous instruments)
req.session.tout_instrument_nb_restantes = req.session.piano_nb_restantes + req.session.alto_nb_restantes + req.session.flute_nb_restantes + req.session.trompette_nb_restantes + req.session.harpe_nb_restantes + req.session.violon1_nb_restantes + req.session.violon2_nb_restantes + req.session.violoncelle1_nb_restantes + req.session.violoncelle2_nb_restantes;
logger.info("NOMBRE DE PLACES TOUT INSTRUMENTS (session) = " + req.session.tout_instrument_nb_restantes, { numsession: req.session.id, label: filename});
// On récupère le nom de l'association Suzuki et le mail de l'adhérent
req.session.adherent_mail = results[0].adherent_mail;
logger.info("req.session.adherent_mail = " + req.session.adherent_mail , { numsession: req.session.id, label: filename});
req.session.association_suzuki = results[0].association_suzuki;
// ON AFFICHE LA PAGE DU FORMULAIRE DE SAISIE DES INFORMATIONS DE L'INSCRIPTION
res.redirect('/concert/admin/inscription_famille');
//req.session.err_mail_form_adhesion_1 = "Vous êtes déjà inscrit au Concert national Unesco.";
//affiche_page_admin();
} else {
// NON INSCRIT AU CONCERT
logger.info("Identifant non inscrit au concert.", { numsession: req.session.id, label: filename});
// TAG ADHÉRENT DÉJÀ INSCRIT
req.session.deja_inscrit_concert = "non";
/////////////////////////////////////////////////
// RECHERCHE SI PERSONNE EST ADHÉRENTE À L'AFPS
// DANS BD ADHESION adherent
sql = 'select identifiant,association_suzuki from adherent where identifiant = "' + req.session.identifiant + '"';
//Query
const [results, fields] = await db_connection_promise.execute(sql);
logger.info("Row adherent : " + results.length, { numsession: req.session.id, label: filename});
if (results.length === 1) {
// LA PERSONNE EST BIEN ADHÉRENTE
logger.info("identifiant BD adhérent : " + results[0].identifiant, { numsession: req.session.id, label: filename});
req.session.association_suzuki = results[0].association_suzuki;
// On calcule le nombre de places concertistes restantes (tous instruments)
req.session.tout_instrument_nb_restantes = req.session.piano_nb_restantes + req.session.alto_nb_restantes + req.session.flute_nb_restantes + req.session.trompette_nb_restantes + req.session.harpe_nb_restantes + req.session.violon1_nb_restantes + req.session.violon2_nb_restantes + req.session.violoncelle1_nb_restantes + req.session.violoncelle2_nb_restantes;
logger.info("NOMBRE DE PLACES TOUT INSTRUMENTS (session) = " + req.session.tout_instrument_nb_restantes, { numsession: req.session.id, label: filename});
// ON AFFICHE LA PAGE DU FORMULAIRE DE SAISIE DES INFORMATIONS DE L'INSCRIPTION
res.redirect('/concert/admin/inscription_famille');
} else {
// LA PERSONNE N'EST PAS ADHÉRENTE
logger.info("Identifant NON adhérent.", { numsession: req.session.id, label: filename});
req.session.err_mail_form_adhesion_1 = "Cet identifiant N'EST PAS adhérent de l'Association Française pour la Pédagogie Suzuki (AFPS) pour 2025/2026.";
req.session.err_mail_form_adhesion_2 = "Vous devez adhérer avant de vous inscrire au concert.";
req.session.err_mail_form_adhesion_3 = 'Pour adhérer à l\'Association Française pour la Pédagogie Suzuki <a target="_blank" href="https://www.inscription.afpedagogiesuzuki.fr/adhesion/"><span class="souligne">Cliquez ici</span></a>';
affiche_page_admin();
}
}
} catch (error) {
// Echec de connection à la BD
logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id });
req.session.err_mail_form_adhesion_1 = "Il y a un problème système connexion base de données, veuillez recommencer.";
//await db_connection_promise.end();
affiche_page_admin();
}
}
}
/////////////////////////////////////////////////
// EXPORT DES MODULES POUR QU'ILS PUISSENT LUS PAR LES AUTRES FICHIERS JS
/////////////////////////////////////////////////
module.exports = {
checkidentifiant
}

View File

@@ -0,0 +1,204 @@
/////////////////////////////////////////////////
// LOGGING
/////////////////////////////////////////////////
const logger = require("../../public/js/app/logger_concert");
/////////////////////////////////////////////////
// APPELS DES MODULES
/////////////////////////////////////////////////
const path = require("path");
const fs = require("fs");
// CALCUL DE DATE
const moment = require('moment');
// ENVOIE MAIL GOOGLE MAIL
const nodemailer = require('nodemailer');
// CONNECTION BASE DE DONNÉES
const mysql = require('mysql2');
const mysql_promise = require('mysql2/promise');
/////////////////////////////////////////////////
// APPELS DES FONCTIONS
/////////////////////////////////////////////////
const sleep = require("./../../modules/sleep");
////////////////////////////////////////////////////
// FILE NAME
////////////////////////////////////////////////////
const filename = path.parse(__filename).base;
////////////////////////////////////////////////////
// CONNECTION DB
////////////////////////////////////////////////////
async function connect_DB_promise() {
return db_connection_promise = await mysql_promise.createConnection({
host: process.env.db_connection_host,
port: process.env.db_connection_port,
user: process.env.db_connection_user,
password: process.env.db_connection_password,
database: process.env.db_connection_database
});
}
/////////////////////////////////////////////////
// 3 - PAGE INSCRIPTION FAMILLE
/////////////////////////////////////////////////
const inscription_famille = async function (req, res) {
logger.info("======================================", { label: filename });
logger.info("======== FUNCTION inscription_famille ==========", { label: filename });
logger.info("======================================", { label: filename });
// VARIABLES
let cout_concertiste = 0;
let cout_spectateur = 0;
let montant_total = 0;
let montant_commande = 0;
let don = 0;
let encadrant_compteur = 0;
let piano_compteur = 0;
let alto_compteur = 0;
let flute_compteur = 0;
let trompette_compteur = 0;
let harpe_compteur = 0;
let violon1_compteur = 0;
let violon2_compteur = 0;
let violoncelle1_compteur = 0;
let violoncelle2_compteur = 0;
function affiche_page_admin() {
////////////////////////////////////////////////////
// AFFIHER LA PAGE /identifier
// AFFICHAGE DES ERREURS
// EN CAS DE RETOUR SUR LA PAGE AVEC ERREUR :
// - SI IDENTIFIANT NON ADHÉRENT
// - SI RIEN SAISIE
////////////////////////////////////////////////////
if (req.session.err_mail_form_adhesion_1) {
res.locals.err_mail_form_adhesion_1 = req.session.err_mail_form_adhesion_1;
res.locals.err_mail_form_adhesion_2 = req.session.err_mail_form_adhesion_2;
res.locals.err_mail_form_adhesion_3 = req.session.err_mail_form_adhesion_3;
// on supprime le contenu après affichage
req.session.err_mail_form_adhesion_1 = undefined;
req.session.err_mail_form_adhesion_2 = undefined;
req.session.err_mail_form_adhesion_3 = undefined;
}
res.render('concert/page_templates/admin');
};
/////////////////////////////////////////////////
// RÉCUPÉRER LES INFORMATIONS SAISIES DANS LE FORMULAIRE
/////////////////////////////////////////////////
req.session.association_suzuki = req.body.association_suzuki;
req.session.adherent_nom = req.body.adherent_nom;
req.session.adherent_prenom = req.body.adherent_prenom;
req.session.adherent_telephone_mobile = req.body.adherent_telephone_mobile;
if (req.session.deja_inscrit_concert == "non") {
req.session.adherent_mail = req.body.adherent_mail;
}
req.session.hebergement_ville = req.body.hebergement_ville;
if (req.body.hebergement_nb > 0) {
req.session.hebergement_nb = req.body.hebergement_nb;
} else {
req.session.hebergement_nb = 0;
}
if (req.body.spectateur_nb_place > 0) {
req.session.spectateur_nb_place = req.body.spectateur_nb_place;
cout_spectateur = 20 * req.session.spectateur_nb_place;
} else {
req.session.spectateur_nb_place = 0;
}
req.session.commentaire_adherent = req.body.commentaire_adherent;
for (let toto = 1; toto < 5; toto++) {
if (req.body["eleve_"+toto+"_nom"]){
req.session["eleve_"+toto+"_nom"] = req.body["eleve_"+toto+"_nom"];
req.session["eleve_"+toto+"_prenom"] = req.body["eleve_"+toto+"_prenom"];
req.session["eleve_"+toto+"_age"] = req.body["eleve_"+toto+"_age"];
req.session["eleve_"+toto+"_instrument"] = req.body["eleve_"+toto+"_instrument"];
req.session["eleve_"+toto+"_cahier"] = req.body["eleve_"+toto+"_cahier"];
req.session["eleve_"+toto+"_piece"] = req.body["eleve_"+toto+"_piece"];
req.session["eleve_"+toto+"_prof_nom"] = req.body["eleve_"+toto+"_prof_nom"];
req.session["eleve_"+toto+"_prof_mail"] = req.body["eleve_"+toto+"_prof_mail"];
cout_concertiste += 23;
if (req.session["eleve_"+toto+"_instrument"] == "Piano") {piano_compteur++}
if (req.session["eleve_"+toto+"_instrument"] == "Alto") {alto_compteur++}
if (req.session["eleve_"+toto+"_instrument"] == "Flute") {flute_compteur++}
if (req.session["eleve_"+toto+"_instrument"] == "Trompette") {trompette_compteur++}
if (req.session["eleve_"+toto+"_instrument"] == "Harpe") {harpe_compteur++}
if (req.session["eleve_"+toto+"_instrument"] == "Violon" && (req.session["eleve_"+toto+"_cahier"]=="Cahier 1" || req.session["eleve_"+toto+"_cahier"]=="Cahier 2" || req.session["eleve_"+toto+"_cahier"]=="Cahier 3" || req.session["eleve_"+toto+"_cahier"]=="Cahier 4" || req.session["eleve_"+toto+"_cahier"]=="Cahier 5")) {violon1_compteur++}
if (req.session["eleve_"+toto+"_instrument"] == "Violon" && (req.session["eleve_"+toto+"_cahier"]=="Cahier 6" || req.session["eleve_"+toto+"_cahier"]=="Cahier 7" || req.session["eleve_"+toto+"_cahier"]=="Cahier 8" || req.session["eleve_"+toto+"_cahier"]=="Cahier 9" || req.session["eleve_"+toto+"_cahier"]=="Cahier 10")) {violon2_compteur++}
if (req.session["eleve_"+toto+"_instrument"] == "Violoncelle" && (req.session["eleve_"+toto+"_cahier"]=="Cahier 1" || req.session["eleve_"+toto+"_cahier"]=="Cahier 2" || req.session["eleve_"+toto+"_cahier"]=="Cahier 3" || req.session["eleve_"+toto+"_cahier"]=="Cahier 4")) {violoncelle1_compteur++}
if (req.session["eleve_"+toto+"_instrument"] == "Violoncelle" && (req.session["eleve_"+toto+"_cahier"]=="Cahier 5" || req.session["eleve_"+toto+"_cahier"]=="Cahier 6" || req.session["eleve_"+toto+"_cahier"]=="Cahier 7" || req.session["eleve_"+toto+"_cahier"]=="Cahier 8" || req.session["eleve_"+toto+"_cahier"]=="Cahier 9" || req.session["eleve_"+toto+"_cahier"]=="Cahier 10")) {violoncelle2_compteur++}
} else {
req.session["eleve_"+toto+"_nom"] = undefined;
req.session["eleve_"+toto+"_prenom"] = undefined;
req.session["eleve_"+toto+"_age"] = undefined;
req.session["eleve_"+toto+"_instrument"] = undefined;
req.session["eleve_"+toto+"_cahier"] = undefined;
req.session["eleve_"+toto+"_piece"] = undefined;
req.session["eleve_"+toto+"_prof_nom"] = undefined;
req.session["eleve_"+toto+"_prof_mail"] = undefined;
}
}
for (let toto = 1; toto < 5; toto++) {
if (req.body["encadrant_"+toto+"_nom"]){
req.session["encadrant_"+toto+"_type"] = req.body["encadrant_"+toto+"_type"];
req.session["encadrant_"+toto+"_nom"] = req.body["encadrant_"+toto+"_nom"];
req.session["encadrant_"+toto+"_prenom"] = req.body["encadrant_"+toto+"_prenom"];
req.session["encadrant_"+toto+"_telephone_mobile"] = req.body["encadrant_"+toto+"_telephone_mobile"];
req.session["encadrant_"+toto+"_mail"] = req.body["encadrant_"+toto+"_mail"];
req.session["encadrant_"+toto+"_prof_instrument"] = req.body["encadrant_"+toto+"_prof_instrument"];
encadrant_compteur++;
} else {
req.session["encadrant_"+toto+"_type"] = undefined;
req.session["encadrant_"+toto+"_nom"] = undefined;
req.session["encadrant_"+toto+"_prenom"] = undefined;
req.session["encadrant_"+toto+"_telephone_mobile"] = undefined;
req.session["encadrant_"+toto+"_mail"] = undefined;
req.session["encadrant_"+toto+"_prof_instrument"] = undefined;
}
}
if (req.body.don && req.body.don > 0) {req.session.don = req.body.don;} else {req.session.don = 0;}
/////////////////////////////////////////////////
// RÉCAP TARIF
/////////////////////////////////////////////////
req.session.cout_concertiste = cout_concertiste;
req.session.cout_spectateur = cout_spectateur;
req.session.montant_commande = cout_concertiste + cout_spectateur;
req.session.montant_total = cout_concertiste + cout_spectateur + parseInt(req.session.don);
/////////////////////////////////////////////////
// ENVOIE VERS PAGE SUIVANTE
/////////////////////////////////////////////////
res.redirect('/concert/admin/inscription_recap');
}
/////////////////////////////////////////////////
// EXPORT DES MODULES POUR QU'ILS PUISSENT LUS PAR LES AUTRES FICHIERS JS
/////////////////////////////////////////////////
module.exports = {
inscription_famille
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,370 @@
/////////////////////////////////////////////////
// LOGGING
/////////////////////////////////////////////////
const logger = require("../../public/js/app/logger_concert");
/////////////////////////////////////////////////
// APPELS DES MODULES
/////////////////////////////////////////////////
const path = require("path");
const fs = require("fs");
// CALCUL DE DATE
const moment = require('moment');
// ENVOIE MAIL GOOGLE MAIL
const nodemailer = require('nodemailer');
// CONNECTION BASE DE DONNÉES
const mysql = require('mysql2');
const mysql_promise = require('mysql2/promise');
/////////////////////////////////////////////////
// APPELS DES FONCTIONS
/////////////////////////////////////////////////
const sleep = require("./../../modules/sleep");
////////////////////////////////////////////////////
// FILE NAME
////////////////////////////////////////////////////
const filename = path.parse(__filename).base;
////////////////////////////////////////////////////
// CONNECTION DB
////////////////////////////////////////////////////
async function connect_DB_promise() {
return db_connection_promise = await mysql_promise.createConnection({
host: process.env.db_connection_host,
port: process.env.db_connection_port,
user: process.env.db_connection_user,
password: process.env.db_connection_password,
database: process.env.db_connection_database
});
}
/////////////////////////////////////////////////
// PAGE 1
// DOMAIN/concert/identifier
// 2. SAISIE DU L'IDENTIFIANT
// VÉRIFICATION SI L'IDENTIFIANT EST ADHÉRENT
/////////////////////////////////////////////////
const checkidentifiant = async function (req, res) {
/////////////////////////////////////////////////
// RECHERCHE DANS DB
// - SI IDENTIFIANT SAISIE EST DÉJÀ INSCRIT AU CONCERT
logger.info("======================================", { label: filename });
logger.info("======== FUNCTION checkidentifiant ==========", { label: filename });
logger.info("======================================", { label: filename });
function affiche_page_identifier() {
////////////////////////////////////////////////////
// AFFIHER LA PAGE /identifier
// AFFICHAGE DES ERREURS
// EN CAS DE RETOUR SUR LA PAGE AVEC ERREUR :
// - SI IDENTIFIANT NON ADHÉRENT
// - SI RIEN SAISIE
////////////////////////////////////////////////////
if (req.session.err_mail_form_adhesion_1) {
res.locals.err_mail_form_adhesion_1 = req.session.err_mail_form_adhesion_1;
res.locals.err_mail_form_adhesion_2 = req.session.err_mail_form_adhesion_2;
res.locals.err_mail_form_adhesion_3 = req.session.err_mail_form_adhesion_3;
// on supprime le contenu après affichage
req.session.err_mail_form_adhesion_1 = undefined;
req.session.err_mail_form_adhesion_2 = undefined;
req.session.err_mail_form_adhesion_3 = undefined;
}
res.render('concert/page_templates/inscrip_formulaire_identifier');
};
// VARIABLES
req.session.quota_spectateur = "nondepasse";
req.session.quota_concertiste = "nondepasse";
/////////////////////////////////////////////////
// ON RÉCUPÈRE L'IDENTIFIANT SAISIE DANS LE FORMULAIRE
// ON REGARDE S'il à bien rempli l'identifiant et s'il a coché la case "je ne suis pas adhérent"
logger.info("identifiant saisi : " + req.body.identifiant, { numsession: req.session.id, label: filename});
if (req.body.identifiant && req.body.check_nonadherent) {
req.session.err_mail_form_adhesion_1 = "Pour vous inscrire au concert, vous devez au préalable être adhérent à l'Association Française pour la Pédagogie Suzuki (AFPS).";
req.session.err_mail_form_adhesion_2 = 'Pour adhérer <a target="_blank" href="https://www.inscription.afpedagogiesuzuki.fr/adhesion/"><span class="souligne">Cliquez ici</span></a>';
req.session.err_mail_form_adhesion_3 = '';
affiche_page_identifier();
}
if (!req.body.identifiant && req.body.check_nonadherent) {
req.session.err_mail_form_adhesion_1 = "Pour vous inscrire au concert, vous devez au préalable être adhérent à l'Association Française pour la Pédagogie Suzuki (AFPS).";
req.session.err_mail_form_adhesion_2 = 'Pour adhérer <a target="_blank" href="https://www.inscription.afpedagogiesuzuki.fr/adhesion/"><span class="souligne">Cliquez ici</span></a>';
req.session.err_mail_form_adhesion_3 = '';
affiche_page_identifier();
}
if (!req.body.identifiant && !req.body.check_nonadherent) {
req.session.err_mail_form_adhesion_1 = "Veuillez entrer votre identifiant AFPS<br>(Association Française pour la Pédagogie Suzuki).";
req.session.err_mail_form_adhesion_2 = "Si vous n'êtes pas encore adhérent, vous pouvez adhérer en";
req.session.err_mail_form_adhesion_3 = '<a target="_blank" href="https://www.inscription.afpedagogiesuzuki.fr/adhesion/"><span class="souligne">Cliquez ici</span></a>';
affiche_page_identifier();
}
if (req.body.identifiant && !req.body.check_nonadherent) {
// SAISIE OK
req.session.identifiant = req.body.identifiant;
// EST-CE QUE L'IDENTIFIANT SAISI EST DÉJA INSCRIT AU CONCERT TABLE ca_adherent
// CONNECTION DB PROMISE
try {
//Connexion
let db_connection_promise = await connect_DB_promise();
//Query
let sql = 'select identifiant, association_suzuki, adherent_mail, commande_nb_spectateur, commande_nb_concertiste from ca_adherent where identifiant = "' + req.session.identifiant + '"';
const [results, fields] = await db_connection_promise.execute(sql);
logger.info("Row ca_adherent : " + results.length, { numsession: req.session.id, label: filename});
if (results.length) {
// DÉJA INSCRIT AU CONCERT
logger.info("Identifant déjà inscrit au concert.", { numsession: req.session.id, label: filename});
// TAG ADHÉRENT DÉJÀ INSCRIT
req.session.deja_inscrit_concert = "oui";
// ON REGARDE LE NOMBRE DE PARTICIPANTS DÉJÀ INSCRITS
if (results[0].commande_nb_spectateur > 2){
req.session.quota_spectateur = "depasse";
}
if (results[0].commande_nb_concertiste > 3){
req.session.quota_concertiste = "depasse";
}
logger.info("req.session.quota_spectateur = " + req.session.quota_spectateur , { numsession: req.session.id, label: filename});
logger.info("req.session.quota_concertiste = " + req.session.quota_concertiste , { numsession: req.session.id, label: filename});
// On calcule le nombre de places concertistes restantes (tous instruments)
req.session.tout_instrument_nb_restantes = req.session.piano_nb_restantes + req.session.alto_nb_restantes + req.session.flute_nb_restantes + req.session.trompette_nb_restantes + req.session.harpe_nb_restantes + req.session.violon1_nb_restantes + req.session.violon2_nb_restantes + req.session.violoncelle1_nb_restantes + req.session.violoncelle2_nb_restantes;
logger.info("NOMBRE DE PLACES TOUT INSTRUMENTS (session) = " + req.session.tout_instrument_nb_restantes, { numsession: req.session.id, label: filename});
// On récupère le nom de l'association Suzuki et le mail de l'adhérent
req.session.adherent_mail = results[0].adherent_mail;
logger.info("req.session.adherent_mail = " + req.session.adherent_mail , { numsession: req.session.id, label: filename});
req.session.association_suzuki = results[0].association_suzuki;
// ON AFFICHE LA PAGE DU FORMULAIRE DE SAISIE DES INFORMATIONS DE L'INSCRIPTION
res.redirect('/concert/inscription_famille');
//req.session.err_mail_form_adhesion_1 = "Vous êtes déjà inscrit au Concert national Unesco 2024.";
//affiche_page_identifier();
} else {
// NON INSCRIT AU CONCERT
logger.info("Identifant non inscrit au concert.", { numsession: req.session.id, label: filename});
// TAG ADHÉRENT DÉJÀ INSCRIT
req.session.deja_inscrit_concert = "non";
/////////////////////////////////////////////////
// RECHERCHE SI PERSONNE EST ADHÉRENTE À L'AFPS
// DANS BD ADHESION adherent
sql = 'select identifiant,association_suzuki from adherent where identifiant = "' + req.session.identifiant + '"';
//Query
const [results, fields] = await db_connection_promise.execute(sql);
logger.info("Row adherent : " + results.length, { numsession: req.session.id, label: filename});
if (results.length === 1) {
// LA PERSONNE EST BIEN ADHÉRENTE
logger.info("identifiant BD adhérent : " + results[0].identifiant, { numsession: req.session.id, label: filename});
req.session.association_suzuki = results[0].association_suzuki;
// On calcule le nombre de places concertistes restantes (tous instruments)
req.session.tout_instrument_nb_restantes = req.session.piano_nb_restantes + req.session.alto_nb_restantes + req.session.flute_nb_restantes + req.session.trompette_nb_restantes + req.session.harpe_nb_restantes + req.session.violon1_nb_restantes + req.session.violon2_nb_restantes + req.session.violoncelle1_nb_restantes + req.session.violoncelle2_nb_restantes;
logger.info("NOMBRE DE PLACES TOUT INSTRUMENTS (session) = " + req.session.tout_instrument_nb_restantes, { numsession: req.session.id, label: filename});
// ON AFFICHE LA PAGE DU FORMULAIRE DE SAISIE DES INFORMATIONS DE L'INSCRIPTION
res.redirect('/concert/inscription_famille');
} else {
// LA PERSONNE N'EST PAS ADHÉRENTE
logger.info("Identifant NON adhérent.", { numsession: req.session.id, label: filename});
req.session.err_mail_form_adhesion_1 = "Cet identifiant N'EST PAS adhérent de l'Association Française pour la Pédagogie Suzuki (AFPS) pour 2025/2026.";
req.session.err_mail_form_adhesion_2 = "Vous devez adhérer avant de vous inscrire au concert.";
req.session.err_mail_form_adhesion_3 = 'Pour adhérer à l\'Association Française pour la Pédagogie Suzuki <a target="_blank" href="https://www.inscription.afpedagogiesuzuki.fr/adhesion/"><span class="souligne">Cliquez ici</span></a>';
affiche_page_identifier();
}
}
} catch (error) {
// Echec de connection à la BD
logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id });
req.session.err_mail_form_adhesion_1 = "Il y a un problème système connexion base de données, veuillez recommencer.";
//await db_connection_promise.end();
affiche_page_identifier();
}
}
}
/////////////////////////////////////////////////
//
// !!!! ACHAT UNIQUEMENT DE SPECTATEUR
//
// PAGE 1
// DOMAIN/concert/identifier
// 2. SAISIE DU L'IDENTIFIANT
// VÉRIFICATION SI L'IDENTIFIANT EST ADHÉRENT
/////////////////////////////////////////////////
const checkidentifiant_spectateur = async function (req, res) {
/////////////////////////////////////////////////
// RECHERCHE DANS DB
// - SI IDENTIFIANT SAISIE EST DÉJÀ INSCRIT AU CONCERT
logger.info("======================================", { label: filename });
logger.info("======== FUNCTION checkidentifiant ==========", { label: filename });
logger.info("======================================", { label: filename });
function affiche_page_identifier() {
////////////////////////////////////////////////////
// AFFIHER LA PAGE /identifier
// AFFICHAGE DES ERREURS
// EN CAS DE RETOUR SUR LA PAGE AVEC ERREUR :
// - SI IDENTIFIANT NON ADHÉRENT
// - SI RIEN SAISIE
////////////////////////////////////////////////////
if (req.session.err_mail_form_adhesion_1) {
res.locals.err_mail_form_adhesion_1 = req.session.err_mail_form_adhesion_1;
res.locals.err_mail_form_adhesion_2 = req.session.err_mail_form_adhesion_2;
res.locals.err_mail_form_adhesion_3 = req.session.err_mail_form_adhesion_3;
// on supprime le contenu après affichage
req.session.err_mail_form_adhesion_1 = undefined;
req.session.err_mail_form_adhesion_2 = undefined;
req.session.err_mail_form_adhesion_3 = undefined;
}
res.render('concert/page_templates/inscrip_formulaire_identifier');
};
// VARIABLES
req.session.quota_spectateur = "nondepasse";
/////////////////////////////////////////////////
// ON RÉCUPÈRE L'IDENTIFIANT SAISIE DANS LE FORMULAIRE
// ON REGARDE S'il à bien rempli l'identifiant et/ou s'il a coché la case "je ne suis pas adhérent"
logger.info("identifiant saisi : " + req.body.identifiant, { numsession: req.session.id, label: filename});
if (req.body.identifiant && req.body.check_nonadherent) {
req.session.err_mail_form_adhesion_1 = "Pour vous inscrire au concert, vous devez au préalable être adhérent à l'Association Française pour la Pédagogie Suzuki (AFPS).";
req.session.err_mail_form_adhesion_2 = 'Pour adhérer <a target="_blank" href="https://www.inscription.afpedagogiesuzuki.fr/adhesion/"><span class="souligne">Cliquez ici</span></a>';
req.session.err_mail_form_adhesion_3 = '';
affiche_page_identifier();
}
if (!req.body.identifiant && req.body.check_nonadherent) {
req.session.err_mail_form_adhesion_1 = "Pour vous inscrire au concert, vous devez au préalable être adhérent à l'Association Française pour la Pédagogie Suzuki (AFPS).";
req.session.err_mail_form_adhesion_2 = 'Pour adhérer <a target="_blank" href="https://www.inscription.afpedagogiesuzuki.fr/adhesion/"><span class="souligne">Cliquez ici</span></a>';
req.session.err_mail_form_adhesion_3 = '';
affiche_page_identifier();
}
if (!req.body.identifiant && !req.body.check_nonadherent) {
req.session.err_mail_form_adhesion_1 = "Veuillez entrer votre identifiant AFPS<br>(Association Française pour la Pédagogie Suzuki).";
req.session.err_mail_form_adhesion_2 = "Si vous n'êtes pas encore adhérent, vous pouvez adhérer en";
req.session.err_mail_form_adhesion_3 = '<a target="_blank" href="https://www.inscription.afpedagogiesuzuki.fr/adhesion/"><span class="souligne">Cliquez ici</span></a>';
affiche_page_identifier();
}
if (req.body.identifiant && !req.body.check_nonadherent) {
// SAISIE OK
req.session.identifiant = req.body.identifiant;
// EST-CE QUE L'IDENTIFIANT SAISI EST DÉJA INSCRIT AU CONCERT TABLE ca_adherent
// CONNECTION DB PROMISE
try {
//Connexion
let db_connection_promise = await connect_DB_promise();
//Query
let sql = 'select identifiant, association_suzuki, adherent_mail, commande_nb_spectateur, commande_nb_concertiste from ca_adherent where identifiant = "' + req.session.identifiant + '"';
const [results, fields] = await db_connection_promise.execute(sql);
logger.info("Row ca_adherent : " + results.length, { numsession: req.session.id, label: filename});
if (results.length) {
// DÉJA INSCRIT AU CONCERT
logger.info("Identifant déjà inscrit au concert.", { numsession: req.session.id, label: filename});
// TAG ADHÉRENT DÉJÀ INSCRIT
req.session.deja_inscrit_concert = "oui";
// QUOTA GÉNÉRAL DE PLACES TOTALES
let sql_ca_decompte_place = 'select spectateur_commandes from ca_decompte_place';
const [results_ca_decompte_place, fields_ca_decompte_place] = await db_connection_promise.execute(sql_ca_decompte_place);
logger.info("SQL nombre de places spectateurs déjà commandées : " + results_ca_decompte_place[0].spectateur_commandes, { numsession: req.session.id, label: filename});
// ON REGARDE LE NOMBRE DE SPECTATEURS DÉJÀ INSCRITS
// QUOTA GÉNÉRAL ATTEINT
if (results_ca_decompte_place[0].spectateur_commandes >= process.env.spectateur_nb_places){
// QUOTA DÉPASSÉ
logger.info("Quota spectateur TOTAL dépassé : " + results[0].commande_nb_spectateur, { numsession: req.session.id, label: filename});
req.session.err_mail_form_adhesion_1 = "Le nombre total de spectateurs a été atteint.";
req.session.err_mail_form_adhesion_2 = "Vous ne pouvez plus commander de places";
affiche_page_identifier();
}
// NOMBRE DE PLACES TOTALES RESTANTES
req.session.quota_total_spectateur = process.env.spectateur_nb_places - results_ca_decompte_place[0].spectateur_commandes;
logger.info("NOMBRE DE PLACES TOTALES RESTANTES : " + req.session.quota_total_spectateur, { numsession: req.session.id, label: filename});
// QUOTA DE 12 PLACES PAR ADHÉRENT
// ON REGARDE LE NOMBRE DE SPECTATEURS DÉJÀ INSCRITS
if (results[0].commande_nb_spectateur > 12){
req.session.quota_spectateur = "depasse";
// QUOTA DÉPASSÉ
logger.info("Quota spectateur dépassé : " + results[0].commande_nb_spectateur, { numsession: req.session.id, label: filename});
req.session.err_mail_form_adhesion_1 = "Cet identifiant "+req.session.identifiant+" a dépassé le quota du nombre de place spectateurs par adhérent";
req.session.err_mail_form_adhesion_2 = "Vous avez déjà "+results[0].commande_nb_spectateur+" places spectateurs";
affiche_page_identifier();
}
logger.info("Quota spectateur non dépassé : " + results[0].commande_nb_spectateur, { numsession: req.session.id, label: filename});
logger.info("req.session.quota_spectateur = " + req.session.quota_spectateur , { numsession: req.session.id, label: filename});
req.session.spectateur_nb_restantes = 12 - results[0].commande_nb_spectateur;
// On récupère le mail de l'adhérent
req.session.adherent_mail = results[0].adherent_mail;
// ON AFFICHE LA PAGE D'ACHAT DES PLACES SPECTATEURS
res.redirect('/concert/inscription_spectateur');
//req.session.err_mail_form_adhesion_1 = "Vous êtes déjà inscrit au Concert national Unesco 2024.";
//affiche_page_identifier();
} else {
// NON INSCRIT AU CONCERT
logger.info("Identifant non inscrit au concert.", { numsession: req.session.id, label: filename});
req.session.deja_inscrit_concert = "non";
req.session.err_mail_form_adhesion_1 = "Cet identifiant "+req.session.identifiant+" N'EST PAS inscrit au concert";
req.session.err_mail_form_adhesion_2 = "Vous ne pouvez pas acheter de place spectateur.";
affiche_page_identifier();
}
} catch (error) {
// Echec de connection à la BD
logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id, label: filename });
req.session.err_mail_form_adhesion_1 = "Il y a un problème système connexion base de données, veuillez recommencer.";
//await db_connection_promise.end();
affiche_page_identifier();
}
}
}
/////////////////////////////////////////////////
// EXPORT DES MODULES POUR QU'ILS PUISSENT LUS PAR LES AUTRES FICHIERS JS
/////////////////////////////////////////////////
module.exports = {
checkidentifiant,
checkidentifiant_spectateur
}

View File

@@ -0,0 +1,148 @@
/////////////////////////////////////////////////
// LOGGING
/////////////////////////////////////////////////
const logger = require("../../public/js/app/logger_concert");
/////////////////////////////////////////////////
// APPELS DES MODULES
/////////////////////////////////////////////////
const path = require("path");
const fs = require("fs");
// CALCUL DE DATE
const moment = require('moment');
// ENVOIE MAIL GOOGLE MAIL
const nodemailer = require('nodemailer');
// CONNECTION BASE DE DONNÉES
const mysql = require('mysql2');
const mysql_promise = require('mysql2/promise');
/////////////////////////////////////////////////
// APPELS DES FONCTIONS
/////////////////////////////////////////////////
const sleep = require("./../../modules/sleep");
////////////////////////////////////////////////////
// FILE NAME
////////////////////////////////////////////////////
const filename = path.parse(__filename).base;
////////////////////////////////////////////////////
// CONNECTION DB
////////////////////////////////////////////////////
async function connect_DB_promise() {
return db_connection_promise = await mysql_promise.createConnection({
host: process.env.db_connection_host,
port: process.env.db_connection_port,
user: process.env.db_connection_user,
password: process.env.db_connection_password,
database: process.env.db_connection_database
});
}
/////////////////////////////////////////////////
//
// !!!! ACHAT UNIQUEMENT DE SPECTATEUR
//
// PAGE 1
// DOMAIN/concert/identifier
// 2. SAISIE DU L'IDENTIFIANT
// VÉRIFICATION SI L'IDENTIFIANT EST ADHÉRENT
/////////////////////////////////////////////////
const inscription_spectateur_tous = async function (req, res) {
/////////////////////////////////////////////////
// RECHERCHE DANS DB
// - SI IDENTIFIANT SAISIE EST DÉJÀ INSCRIT AU CONCERT
logger.info("======================================", { label: filename });
logger.info("======== FUNCTION inscription_spectateur_tous ==========", { label: filename });
logger.info("======================================", { label: filename });
function affiche_page_identifier() {
////////////////////////////////////////////////////
// AFFIHER LA PAGE /identifier
// AFFICHAGE DES ERREURS
// EN CAS DE RETOUR SUR LA PAGE AVEC ERREUR :
// - SI IDENTIFIANT NON ADHÉRENT
// - SI RIEN SAISIE
////////////////////////////////////////////////////
if (req.session.err_mail_form_adhesion_1) {
res.locals.err_mail_form_adhesion_1 = req.session.err_mail_form_adhesion_1;
res.locals.err_mail_form_adhesion_2 = req.session.err_mail_form_adhesion_2;
res.locals.err_mail_form_adhesion_3 = req.session.err_mail_form_adhesion_3;
// on supprime le contenu après affichage
req.session.err_mail_form_adhesion_1 = undefined;
req.session.err_mail_form_adhesion_2 = undefined;
req.session.err_mail_form_adhesion_3 = undefined;
}
res.render('concert/page_templates/achat_spectateur_tous');
};
// VARIABLES
req.session.quota_spectateur = "nondepasse";
// CONNECTION DB PROMISE
try {
//Connexion
let db_connection_promise = await connect_DB_promise();
// QUOTA GÉNÉRAL DE PLACES TOTALES
let sql_ca_decompte_place = 'select spectateur_commandes from ca_decompte_place';
const [results_ca_decompte_place, fields_ca_decompte_place] = await db_connection_promise.execute(sql_ca_decompte_place);
logger.info("SQL nombre de places spectateurs déjà commandées : " + results_ca_decompte_place[0].spectateur_commandes, { numsession: req.session.id, label: filename});
// QUOTA GÉNÉRAL ATTEINT
if (results_ca_decompte_place[0].spectateur_commandes >= process.env.spectateur_nb_places){
// QUOTA DÉPASSÉ
req.session.quota_spectateur = "depasse";
logger.info("Quota spectateur TOTAL dépassé : " + results_ca_decompte_place[0].spectateur_commandes, { numsession: req.session.id, label: filename});
req.session.err_mail_form_adhesion_1 = "Le nombre total de spectateurs a été atteint.";
req.session.err_mail_form_adhesion_2 = "Vous ne pouvez plus commander de places";
affiche_page_identifier();
}
// NOMBRE DE PLACES TOTALES RESTANTES
req.session.quota_total_spectateur = process.env.spectateur_nb_places - results_ca_decompte_place[0].spectateur_commandes;
logger.info("NOMBRE DE PLACES TOTALES RESTANTES : " + req.session.quota_total_spectateur, { numsession: req.session.id, label: filename});
// ON AFFICHE LA PAGE D'ACHAT DES PLACES SPECTATEURS
res.locals.quota_spectateur = req.session.quota_spectateur;
res.locals.quota_total_spectateur = req.session.quota_total_spectateur;
res.render('concert/page_templates/achat_spectateur_tous');
} catch (error) {
// Echec de connection à la BD
logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id });
req.session.err_mail_form_adhesion_1 = "Il y a un problème système connexion base de données, veuillez recommencer.";
//await db_connection_promise.end();
affiche_page_identifier();
}
}
/////////////////////////////////////////////////
// EXPORT DES MODULES POUR QU'ILS PUISSENT LUS PAR LES AUTRES FICHIERS JS
/////////////////////////////////////////////////
module.exports = {
inscription_spectateur_tous
}

View File

@@ -0,0 +1,218 @@
/////////////////////////////////////////////////
// LOGGING
/////////////////////////////////////////////////
const logger = require("../../public/js/app/logger_concert");
/////////////////////////////////////////////////
// APPELS DES MODULES
/////////////////////////////////////////////////
const path = require("path");
const fs = require("fs");
// CALCUL DE DATE
const moment = require('moment');
// ENVOIE MAIL GOOGLE MAIL
const nodemailer = require('nodemailer');
// CONNECTION BASE DE DONNÉES
const mysql = require('mysql2');
const mysql_promise = require('mysql2/promise');
/////////////////////////////////////////////////
// APPELS DES FONCTIONS
/////////////////////////////////////////////////
const sleep = require("./../../modules/sleep");
////////////////////////////////////////////////////
// FILE NAME
////////////////////////////////////////////////////
const filename = path.parse(__filename).base;
////////////////////////////////////////////////////
// CONNECTION DB
////////////////////////////////////////////////////
async function connect_DB_promise() {
return db_connection_promise = await mysql_promise.createConnection({
host: process.env.db_connection_host,
port: process.env.db_connection_port,
user: process.env.db_connection_user,
password: process.env.db_connection_password,
database: process.env.db_connection_database
});
}
/////////////////////////////////////////////////
// 3 - PAGE INSCRIPTION FAMILLE
/////////////////////////////////////////////////
const inscription_famille = async function (req, res) {
logger.info("======================================", { label: filename });
logger.info("======== FUNCTION inscription_famille ==========", { label: filename });
logger.info("======================================", { label: filename });
// VARIABLES
let cout_concertiste = 0;
let cout_spectateur = 0;
let montant_total = 0;
let montant_commande = 0;
let don = 0;
let encadrant_compteur = 0;
let piano_compteur = 0;
let alto_compteur = 0;
let flute_compteur = 0;
let trompette_compteur = 0;
let harpe_compteur = 0;
let violon1_compteur = 0;
let violon2_compteur = 0;
let violoncelle1_compteur = 0;
let violoncelle2_compteur = 0;
function affiche_page_identifier() {
////////////////////////////////////////////////////
// AFFIHER LA PAGE /identifier
// AFFICHAGE DES ERREURS
// EN CAS DE RETOUR SUR LA PAGE AVEC ERREUR :
// - SI IDENTIFIANT NON ADHÉRENT
// - SI RIEN SAISIE
////////////////////////////////////////////////////
if (req.session.err_mail_form_adhesion_1) {
res.locals.err_mail_form_adhesion_1 = req.session.err_mail_form_adhesion_1;
res.locals.err_mail_form_adhesion_2 = req.session.err_mail_form_adhesion_2;
res.locals.err_mail_form_adhesion_3 = req.session.err_mail_form_adhesion_3;
// on supprime le contenu après affichage
req.session.err_mail_form_adhesion_1 = undefined;
req.session.err_mail_form_adhesion_2 = undefined;
req.session.err_mail_form_adhesion_3 = undefined;
}
res.render('concert/page_templates/erreur');
};
/////////////////////////////////////////////////
// RÉCUPÉRER LES INFORMATIONS SAISIES DANS LE FORMULAIRE
/////////////////////////////////////////////////
// EST_CE QUE LA PERSONNE VIENT DE AJOUT BILLET
//req.session.ajout_billet = req.body.ajout_billet;
//logger.info("////// AJOUT BILLET req.session.ajout_billet = " + req.session.ajout_billet, { numsession: req.session.id, label: filename});
req.session.association_suzuki = req.body.association_suzuki;
req.session.adherent_nom = req.body.adherent_nom;
req.session.adherent_prenom = req.body.adherent_prenom;
req.session.adherent_telephone_mobile = req.body.adherent_telephone_mobile;
if (req.session.deja_inscrit_concert == "non") {
req.session.adherent_mail = req.body.adherent_mail;
}
req.session.hebergement_ville = req.body.hebergement_ville;
if (req.body.hebergement_nb > 0) {
req.session.hebergement_nb = req.body.hebergement_nb;
} else {
req.session.hebergement_nb = 0;
}
if (req.body.spectateur_nb_place > 0) {
req.session.spectateur_nb_place = req.body.spectateur_nb_place;
cout_spectateur = 20 * req.session.spectateur_nb_place;
} else {
req.session.spectateur_nb_place = 0;
}
req.session.commentaire_adherent = req.body.commentaire_adherent;
for (let toto = 1; toto < 5; toto++) {
if (req.body["eleve_"+toto+"_nom"]){
req.session["eleve_"+toto+"_nom"] = req.body["eleve_"+toto+"_nom"];
req.session["eleve_"+toto+"_prenom"] = req.body["eleve_"+toto+"_prenom"];
req.session["eleve_"+toto+"_age"] = req.body["eleve_"+toto+"_age"];
req.session["eleve_"+toto+"_instrument"] = req.body["eleve_"+toto+"_instrument"];
req.session["eleve_"+toto+"_cahier"] = req.body["eleve_"+toto+"_cahier"];
req.session["eleve_"+toto+"_piece"] = req.body["eleve_"+toto+"_piece"];
req.session["eleve_"+toto+"_prof_nom"] = req.body["eleve_"+toto+"_prof_nom"];
req.session["eleve_"+toto+"_prof_mail"] = req.body["eleve_"+toto+"_prof_mail"];
cout_concertiste += 23;
if (req.session["eleve_"+toto+"_instrument"] == "Piano") {piano_compteur++}
if (req.session["eleve_"+toto+"_instrument"] == "Alto") {alto_compteur++}
if (req.session["eleve_"+toto+"_instrument"] == "Flute") {flute_compteur++}
if (req.session["eleve_"+toto+"_instrument"] == "Trompette") {trompette_compteur++}
if (req.session["eleve_"+toto+"_instrument"] == "Harpe") {harpe_compteur++}
if (req.session["eleve_"+toto+"_instrument"] == "Violon" && (req.session["eleve_"+toto+"_cahier"]=="Cahier 1" || req.session["eleve_"+toto+"_cahier"]=="Cahier 2" || req.session["eleve_"+toto+"_cahier"]=="Cahier 3" || req.session["eleve_"+toto+"_cahier"]=="Cahier 4" || req.session["eleve_"+toto+"_cahier"]=="Cahier 5")) {violon1_compteur++}
if (req.session["eleve_"+toto+"_instrument"] == "Violon" && (req.session["eleve_"+toto+"_cahier"]=="Cahier 6" || req.session["eleve_"+toto+"_cahier"]=="Cahier 7" || req.session["eleve_"+toto+"_cahier"]=="Cahier 8" || req.session["eleve_"+toto+"_cahier"]=="Cahier 9" || req.session["eleve_"+toto+"_cahier"]=="Cahier 10")) {violon2_compteur++}
if (req.session["eleve_"+toto+"_instrument"] == "Violoncelle" && (req.session["eleve_"+toto+"_cahier"]=="Cahier 1" || req.session["eleve_"+toto+"_cahier"]=="Cahier 2" || req.session["eleve_"+toto+"_cahier"]=="Cahier 3" || req.session["eleve_"+toto+"_cahier"]=="Cahier 4")) {violoncelle1_compteur++}
if (req.session["eleve_"+toto+"_instrument"] == "Violoncelle" && (req.session["eleve_"+toto+"_cahier"]=="Cahier 5" || req.session["eleve_"+toto+"_cahier"]=="Cahier 6" || req.session["eleve_"+toto+"_cahier"]=="Cahier 7" || req.session["eleve_"+toto+"_cahier"]=="Cahier 8" || req.session["eleve_"+toto+"_cahier"]=="Cahier 9" || req.session["eleve_"+toto+"_cahier"]=="Cahier 10")) {violoncelle2_compteur++}
} else {
req.session["eleve_"+toto+"_nom"] = undefined;
req.session["eleve_"+toto+"_prenom"] = undefined;
req.session["eleve_"+toto+"_age"] = undefined;
req.session["eleve_"+toto+"_instrument"] = undefined;
req.session["eleve_"+toto+"_cahier"] = undefined;
req.session["eleve_"+toto+"_piece"] = undefined;
req.session["eleve_"+toto+"_prof_nom"] = undefined;
req.session["eleve_"+toto+"_prof_mail"] = undefined;
}
}
for (let toto = 1; toto < 5; toto++) {
if (req.body["encadrant_"+toto+"_nom"]){
req.session["encadrant_"+toto+"_type"] = req.body["encadrant_"+toto+"_type"];
req.session["encadrant_"+toto+"_nom"] = req.body["encadrant_"+toto+"_nom"];
req.session["encadrant_"+toto+"_prenom"] = req.body["encadrant_"+toto+"_prenom"];
req.session["encadrant_"+toto+"_telephone_mobile"] = req.body["encadrant_"+toto+"_telephone_mobile"];
req.session["encadrant_"+toto+"_mail"] = req.body["encadrant_"+toto+"_mail"];
req.session["encadrant_"+toto+"_prof_instrument"] = req.body["encadrant_"+toto+"_prof_instrument"];
encadrant_compteur++;
} else {
req.session["encadrant_"+toto+"_type"] = undefined;
req.session["encadrant_"+toto+"_nom"] = undefined;
req.session["encadrant_"+toto+"_prenom"] = undefined;
req.session["encadrant_"+toto+"_telephone_mobile"] = undefined;
req.session["encadrant_"+toto+"_mail"] = undefined;
req.session["encadrant_"+toto+"_prof_instrument"] = undefined;
}
}
if (req.body.don && req.body.don > 0) {req.session.don = req.body.don;} else {req.session.don = 0;}
/////////////////////////////////////////////////
// RÉCAP TARIF
/////////////////////////////////////////////////
req.session.cout_concertiste = cout_concertiste;
req.session.cout_spectateur = cout_spectateur;
req.session.montant_commande = cout_concertiste + cout_spectateur;
req.session.montant_total = cout_concertiste + cout_spectateur + parseInt(req.session.don);
/////////////////////////////////////////////////
// ENVOIE VERS PAGE SUIVANTE
// SI PAS DE CONCERTISTE OU PAS D'ENCADRANT ON NE PEUT PAS AVANCER
// Par ex si on n'inscrit que des spectateurs
/////////////////////////////////////////////////
if (piano_compteur > req.session.piano_nb_restantes || alto_compteur > req.session.alto_nb_restantes || flute_compteur > req.session.flute_nb_restantes || trompette_compteur > req.session.trompette_nb_restantes || harpe_compteur > req.session.harpe_nb_restantes || violon1_compteur > req.session.violon1_nb_restantes || violon2_compteur > req.session.violon2_nb_restantes || violoncelle1_compteur > req.session.violoncelle1_nb_restantes || violoncelle2_compteur > req.session.violoncelle2_nb_restantes) {
logger.info("Plus de parent encadrant demandé que de restant", { numsession: req.session.id, label: filename});
req.session.err_mail_form_adhesion_1 = 'Vous avez réservé plus de places élève concertiste que de places restantes. Veuillez recommencer.';
affiche_page_identifier();
} else {
if (encadrant_compteur < 1 && cout_concertiste < 1 && req.session.deja_inscrit_concert == "non") {
logger.info("pas d'encadrant ni de concertiste", { numsession: req.session.id, label: filename});
req.session.err_mail_form_adhesion_1 = "Veuillez réserver au moins un élève concertiste ou une personne encadrante";
affiche_page_identifier();
} else {
res.redirect('/concert/inscription_recap');
}
}
}
/////////////////////////////////////////////////
// EXPORT DES MODULES POUR QU'ILS PUISSENT LUS PAR LES AUTRES FICHIERS JS
/////////////////////////////////////////////////
module.exports = {
inscription_famille
}

View File

@@ -0,0 +1,229 @@
/////////////////////////////////////////////////
// LOGGING
/////////////////////////////////////////////////
const logger = require("../../public/js/app/logger_concert");
/////////////////////////////////////////////////
// APPELS DES MODULES
/////////////////////////////////////////////////
const path = require("path");
const fs = require("fs");
// CALCUL DE DATE
const moment = require('moment');
// ENVOIE MAIL GOOGLE MAIL
const nodemailer = require('nodemailer');
// CONNECTION BASE DE DONNÉES
const mysql = require('mysql2');
const mysql_promise = require('mysql2/promise');
/////////////////////////////////////////////////
// GOOGLE SHEET PARAMETERS
/////////////////////////////////////////////////
const { GoogleSpreadsheet } = require('google-spreadsheet');
const GS_creds = require('../../inscriptionsafps-53b60452f63d.json');
const { error } = require("console");
// Fichier Google Sheet "afps_concert_annuel" (Mon Drive/inscriptions/base_donees)
// doc ID is the long id in the sheets URL
const GS_concert = new GoogleSpreadsheet(process.env.gsheet_concertannuel);
/////////////////////////////////////////////////
// APPELS DES FONCTIONS
/////////////////////////////////////////////////
const sleep = require("./../../modules/sleep");
const envoie_mail = require("./../../modules/envoie_mail");
////////////////////////////////////////////////////
// FILE NAME
////////////////////////////////////////////////////
const filename = path.parse(__filename).base;
////////////////////////////////////////////////////
// CONNECTION DB
////////////////////////////////////////////////////
async function connect_DB_promise() {
return db_connection_promise = await mysql_promise.createConnection({
host: process.env.db_connection_host,
port: process.env.db_connection_port,
user: process.env.db_connection_user,
password: process.env.db_connection_password,
database: process.env.db_connection_database
});
}
/////////////////////////////////////////////////
// PAGE 3 ter
// DOMAIN/concert/listeattente
// AFFICHAGE DE LA PAGE DE SAISIE POUR LA LISTE D'ATTENTE
// D'UN CONCERTISTE
/////////////////////////////////////////////////
const inscription_listeattente = async function (req, res) {
logger.info("======================================", { label: filename });
logger.info("======== FUNCTION inscription_listeattente ==========", { label: filename });
logger.info("======================================", { label: filename });
// VARIABLES
moment.locale('fr');
let now = moment().format("YYYY-MM-DD HH:mm:ss");
function affiche_page_erreur() {
////////////////////////////////////////////////////
// AFFIHER LA PAGE ERREUR
// AFFICHAGE DES ERREURS
////////////////////////////////////////////////////
if (req.session.err_mail_form_adhesion_1) {
res.locals.err_mail_form_adhesion_1 = req.session.err_mail_form_adhesion_1;
res.locals.err_mail_form_adhesion_2 = req.session.err_mail_form_adhesion_2;
res.locals.err_mail_form_adhesion_3 = req.session.err_mail_form_adhesion_3;
// on supprime le contenu après affichage
req.session.err_mail_form_adhesion_1 = undefined;
req.session.err_mail_form_adhesion_2 = undefined;
req.session.err_mail_form_adhesion_3 = undefined;
}
res.render('concert/page_templates/erreur');
};
/////////////////////////////////////////////////
// SI IDENTIFIANT PERDU
if (req.session.identifiant === undefined) {
logger.info("IDENTIFIANT PERDU", { numsession: req.session.id });
req.session.err_mail_form_adhesion_1 = "Session expirée, veuillez recommencer";
affiche_page_erreur();
} else {
///////////////////////////////////////////////////
// ON RÉCUPÈRE LES INFOS SAISIE DANS LE FORMULAIRE
req.session.association_suzuki = req.body.association_suzuki;
req.session.adherent_nom = req.body.adherent_nom;
req.session.adherent_prenom = req.body.adherent_prenom;
req.session.adherent_telephone_mobile = req.body.adherent_telephone_mobile;
req.session.adherent_mail = req.body.adherent_mail;
req.session.eleve_nom = req.body.eleve_nom;
req.session.eleve_prenom = req.body.eleve_prenom;
req.session.eleve_age = req.body.eleve_age;
req.session.eleve_instrument = req.body.eleve_instrument;
req.session.eleve_cahier = req.body.eleve_cahier;
req.session.eleve_piece = req.body.eleve_piece;
req.session.eleve_prof_nom = req.body.eleve_prof_nom;
req.session.eleve_prof_mail = req.body.eleve_prof_mail;
logger.info("AJOUT DE L'ÉLÈVE IDENTIFIANT : " + req.session.identifiant, { numsession: req.session.id, label: filename});
logger.info("AJOUT DE L'ÉLÈVE NOM PRENOM : " + req.session["eleve_nom"] + " " + req.session["eleve_prenom"], { numsession: req.session.id, label: filename});
// AJOUT CONCERTISTE DANS LA BASE DE DONNÉES
try {
//Connexion
let db_connection_promise = await connect_DB_promise();
// AJOUT CONCERTISTE
champs = "date_inscription, saison, identifiant, association_suzuki, adherent_nom, adherent_prenom, adherent_telephone_mobile, adherent_mail, concertiste_nom, concertiste_prenom, concertiste_age, concertiste_intrument, concertiste_cahier, concertiste_piece, concertiste_prof_nom, concertiste_prof_mail";
values = '"'+ now + '","2025/2026"' + ',"' + req.session.identifiant + '","' + req.session.association_suzuki + '","' + req.session.adherent_nom + '","' + req.session.adherent_prenom + '","' + req.session.adherent_telephone_mobile + '","' + req.session.adherent_mail + '","' + req.session.eleve_nom + '","' + req.session.eleve_prenom + '","' + req.session.eleve_age + '","' + req.session.eleve_instrument + '","' + req.session.eleve_cahier + '","' + req.session.eleve_piece + '","' + req.session.eleve_prof_nom + '","' + req.session.eleve_prof_mail + '"';
sql = 'INSERT INTO ca_liste_attente (' + champs + ') VALUES (' + values + ')';
logger.info("REQUETE SQL ca_liste_attente : " + sql , { numsession: req.session.id, label: filename});
const [results, fields] = await db_connection_promise.execute(sql);
logger.info("LISTE ATTENTE Row ID added : " + results.insertId, { numsession: req.session.id, label: filename});
} catch (error) {
// Echec de connection à la BD
logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id });
req.session.err_mail_form_adhesion_1 = '"Il y a un problème système connexion base de données, veuillez recommencer, "' + error;
affiche_page_erreur();
}
// AJOUT CONCERTISTE DANS LA GOOGLE SHEET
try {
await GS_concert.useServiceAccountAuth(GS_creds);
await GS_concert.loadInfo();
//console.log("GS_concert = ", GS_concert);
const GS_concert_liste_attente = GS_concert.sheetsByTitle['liste_attente'];
//console.log("GS_concert_liste_attente = ", GS_concert_liste_attente);
const ajout_gs_adherent = await GS_concert_liste_attente.addRows (
[
{
saison: "2025/2026",
identifiant: req.session.identifiant,
association_suzuki: req.session.association_suzuki,
date_inscription: now,
adherent_nom: req.session.adherent_nom,
adherent_prenom: req.session.adherent_prenom,
adherent_telephone_mobile: "'" + req.session.adherent_telephone_mobile,
adherent_mail: req.session.adherent_mail,
concertiste_nom: req.session.eleve_nom,
concertiste_prenom: req.session.eleve_prenom,
concertiste_age: req.session.eleve_age,
concertiste_intrument: req.session.eleve_instrument,
concertiste_cahier: req.session.eleve_cahier,
concertiste_piece: req.session.eleve_piece,
concertiste_prof_nom: req.session.eleve_prof_nom,
concertiste_prof_mail: req.session.eleve_prof_mail,
date_maj_gsheet: now
}
]
);
//////////////////////////
// ENVOI MAIL À L'ADHÉRENT
mail_objet = 'AFPS - CONCERT UNESCO 2024 - AJOUT LISTE ATTENTE - ' + req.session.identifiant;
mail_html = "<p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'>Cher(e) adhérent(e),<br></p><p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'>L'élève est inscrit en liste d'attente pour le Concert national Unesco 2024 organisé par l'Association Française pour la Pédagogie Suzuki.";
mail_html += "<br>";
mail_html += '<p style="color:#E73058;font-size: 13pt; font-family: Arial; text-decoration: none;"><strong>RÉCAPITULATIF</strong></p>';
mail_html += "<p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Identifiant Suzuki : </strong>" + req.session.identifiant;
mail_html += "<p style='font-size: 9pt; font-family: Arial; font-style: italic; color: #454343; text-decoration: none;'>Les concertistes s'engagent à être présents les 2 journées du 20 et 21 avril 2024.</p>";
mail_html += "<p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'>Nom : " + req.session.eleve_nom + " " + req.session.eleve_prenom + " - " + req.session.eleve_age + " ans,<br>";
mail_html += "instrument : " + req.session.eleve_instrument + " - " + req.session.eleve_cahier + " - " + req.session.eleve_piece + "<br>";
mail_html += "professeur : " + req.session.eleve_prof_nom + " - " + req.session.eleve_prof_mail + "</p>";
mail_html += '<br><br><p style="font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;">Association Française pour la pédagogie Suzuki<br>Marie Rossot - Pôle organisation du Concert national Unesco 2024</p><p><img src="cid:logo" alt="Logo" width="200" height="73"/></p>';
// ajout du logo
let dossier_image = path.resolve(__dirname, "../../public/images/logos/")+"/logosuzukigris.png";
// VARIABLE POUR LE MAIL
var mailOptions = {
from: 'afps.inscription@gmail.com',
to: req.session.adherent_mail,
subject: mail_objet,
html: mail_html,
attachments: [{
filename: 'logosuzukigris.png',
path: dossier_image,
cid: 'logo'
}]
};
envoie_mail.envoie_mail(mailOptions);
} catch (error) {
// Echec de connection à la GOOGLE SHEET
logger.error("Erreur système : " + error, { numsession: req.session.id });
req.session.err_mail_form_adhesion_1 = '"Il y a un problème système, "' + error;
affiche_page_erreur();
};
req.session.err_mail_form_adhesion_1 = "Inscription dans la liste d'attente réussie";
affiche_page_erreur();
}
}
/////////////////////////////////////////////////
// EXPORT DES MODULES POUR QU'ILS PUISSENT LUS PAR LES AUTRES FICHIERS JS
/////////////////////////////////////////////////
module.exports = {
inscription_listeattente
}

View File

@@ -0,0 +1,218 @@
/////////////////////////////////////////////////
// LOGGING
/////////////////////////////////////////////////
const logger = require("../../public/js/app/logger_concert");
/////////////////////////////////////////////////
// APPELS DES MODULES
/////////////////////////////////////////////////
const path = require("path");
const fs = require("fs");
// CALCUL DE DATE
const moment = require('moment');
// ENVOIE MAIL GOOGLE MAIL
const nodemailer = require('nodemailer');
// CONNECTION BASE DE DONNÉES
const mysql = require('mysql2');
const mysql_promise = require('mysql2/promise');
/////////////////////////////////////////////////
// APPELS DES FONCTIONS
/////////////////////////////////////////////////
const sleep = require("./../../modules/sleep");
////////////////////////////////////////////////////
// FILE NAME
////////////////////////////////////////////////////
const filename = path.parse(__filename).base;
////////////////////////////////////////////////////
// CONNECTION DB
////////////////////////////////////////////////////
async function connect_DB_promise() {
return db_connection_promise = await mysql_promise.createConnection({
host: process.env.db_connection_host,
port: process.env.db_connection_port,
user: process.env.db_connection_user,
password: process.env.db_connection_password,
database: process.env.db_connection_database
});
}
/////////////////////////////////////////////////
// 3 - PAGE INSCRIPTION FAMILLE
/////////////////////////////////////////////////
const inscription_spectateur = async function (req, res) {
logger.info("======================================", { label: filename });
logger.info("======== FUNCTION inscription_spectateur ==========", { label: filename });
logger.info("======================================", { label: filename });
// VARIABLES
let cout_concertiste = 0;
let cout_spectateur = 0;
let montant_total = 0;
let montant_commande = 0;
let don = 0;
let encadrant_compteur = 0;
let piano_compteur = 0;
let alto_compteur = 0;
let flute_compteur = 0;
let trompette_compteur = 0;
let harpe_compteur = 0;
let violon1_compteur = 0;
let violon2_compteur = 0;
let violoncelle1_compteur = 0;
let violoncelle2_compteur = 0;
function affiche_page_identifier() {
////////////////////////////////////////////////////
// AFFIHER LA PAGE /identifier
// AFFICHAGE DES ERREURS
// EN CAS DE RETOUR SUR LA PAGE AVEC ERREUR :
// - SI IDENTIFIANT NON ADHÉRENT
// - SI RIEN SAISIE
////////////////////////////////////////////////////
if (req.session.err_mail_form_adhesion_1) {
res.locals.err_mail_form_adhesion_1 = req.session.err_mail_form_adhesion_1;
res.locals.err_mail_form_adhesion_2 = req.session.err_mail_form_adhesion_2;
res.locals.err_mail_form_adhesion_3 = req.session.err_mail_form_adhesion_3;
// on supprime le contenu après affichage
req.session.err_mail_form_adhesion_1 = undefined;
req.session.err_mail_form_adhesion_2 = undefined;
req.session.err_mail_form_adhesion_3 = undefined;
}
res.render('concert/page_templates/erreur');
};
/////////////////////////////////////////////////
// RÉCUPÉRER LES INFORMATIONS SAISIES DANS LE FORMULAIRE
/////////////////////////////////////////////////
// EST_CE QUE LA PERSONNE VIENT DE AJOUT BILLET
//req.session.ajout_billet = req.body.ajout_billet;
//logger.info("////// AJOUT BILLET req.session.ajout_billet = " + req.session.ajout_billet, { numsession: req.session.id, label: filename});
req.session.association_suzuki = req.body.association_suzuki;
req.session.adherent_nom = req.body.adherent_nom;
req.session.adherent_prenom = req.body.adherent_prenom;
req.session.adherent_telephone_mobile = req.body.adherent_telephone_mobile;
if (req.session.deja_inscrit_concert == "non") {
req.session.adherent_mail = req.body.adherent_mail;
}
req.session.hebergement_ville = req.body.hebergement_ville;
if (req.body.hebergement_nb > 0) {
req.session.hebergement_nb = req.body.hebergement_nb;
} else {
req.session.hebergement_nb = 0;
}
if (req.body.spectateur_nb_place > 0) {
req.session.spectateur_nb_place = req.body.spectateur_nb_place;
cout_spectateur = 20 * req.session.spectateur_nb_place;
} else {
req.session.spectateur_nb_place = 0;
}
req.session.commentaire_adherent = req.body.commentaire_adherent;
for (let toto = 1; toto < 5; toto++) {
if (req.body["eleve_"+toto+"_nom"]){
req.session["eleve_"+toto+"_nom"] = req.body["eleve_"+toto+"_nom"];
req.session["eleve_"+toto+"_prenom"] = req.body["eleve_"+toto+"_prenom"];
req.session["eleve_"+toto+"_age"] = req.body["eleve_"+toto+"_age"];
req.session["eleve_"+toto+"_instrument"] = req.body["eleve_"+toto+"_instrument"];
req.session["eleve_"+toto+"_cahier"] = req.body["eleve_"+toto+"_cahier"];
req.session["eleve_"+toto+"_piece"] = req.body["eleve_"+toto+"_piece"];
req.session["eleve_"+toto+"_prof_nom"] = req.body["eleve_"+toto+"_prof_nom"];
req.session["eleve_"+toto+"_prof_mail"] = req.body["eleve_"+toto+"_prof_mail"];
cout_concertiste += 23;
if (req.session["eleve_"+toto+"_instrument"] == "Piano") {piano_compteur++}
if (req.session["eleve_"+toto+"_instrument"] == "Alto") {alto_compteur++}
if (req.session["eleve_"+toto+"_instrument"] == "Flute") {flute_compteur++}
if (req.session["eleve_"+toto+"_instrument"] == "Trompette") {trompette_compteur++}
if (req.session["eleve_"+toto+"_instrument"] == "Harpe") {harpe_compteur++}
if (req.session["eleve_"+toto+"_instrument"] == "Violon" && (req.session["eleve_"+toto+"_cahier"]=="Cahier 1" || req.session["eleve_"+toto+"_cahier"]=="Cahier 2" || req.session["eleve_"+toto+"_cahier"]=="Cahier 3" || req.session["eleve_"+toto+"_cahier"]=="Cahier 4" || req.session["eleve_"+toto+"_cahier"]=="Cahier 5")) {violon1_compteur++}
if (req.session["eleve_"+toto+"_instrument"] == "Violon" && (req.session["eleve_"+toto+"_cahier"]=="Cahier 6" || req.session["eleve_"+toto+"_cahier"]=="Cahier 7" || req.session["eleve_"+toto+"_cahier"]=="Cahier 8" || req.session["eleve_"+toto+"_cahier"]=="Cahier 9" || req.session["eleve_"+toto+"_cahier"]=="Cahier 10")) {violon2_compteur++}
if (req.session["eleve_"+toto+"_instrument"] == "Violoncelle" && (req.session["eleve_"+toto+"_cahier"]=="Cahier 1" || req.session["eleve_"+toto+"_cahier"]=="Cahier 2" || req.session["eleve_"+toto+"_cahier"]=="Cahier 3" || req.session["eleve_"+toto+"_cahier"]=="Cahier 4")) {violoncelle1_compteur++}
if (req.session["eleve_"+toto+"_instrument"] == "Violoncelle" && (req.session["eleve_"+toto+"_cahier"]=="Cahier 5" || req.session["eleve_"+toto+"_cahier"]=="Cahier 6" || req.session["eleve_"+toto+"_cahier"]=="Cahier 7" || req.session["eleve_"+toto+"_cahier"]=="Cahier 8" || req.session["eleve_"+toto+"_cahier"]=="Cahier 9" || req.session["eleve_"+toto+"_cahier"]=="Cahier 10")) {violoncelle2_compteur++}
} else {
req.session["eleve_"+toto+"_nom"] = undefined;
req.session["eleve_"+toto+"_prenom"] = undefined;
req.session["eleve_"+toto+"_age"] = undefined;
req.session["eleve_"+toto+"_instrument"] = undefined;
req.session["eleve_"+toto+"_cahier"] = undefined;
req.session["eleve_"+toto+"_piece"] = undefined;
req.session["eleve_"+toto+"_prof_nom"] = undefined;
req.session["eleve_"+toto+"_prof_mail"] = undefined;
}
}
for (let toto = 1; toto < 5; toto++) {
if (req.body["encadrant_"+toto+"_nom"]){
req.session["encadrant_"+toto+"_type"] = req.body["encadrant_"+toto+"_type"];
req.session["encadrant_"+toto+"_nom"] = req.body["encadrant_"+toto+"_nom"];
req.session["encadrant_"+toto+"_prenom"] = req.body["encadrant_"+toto+"_prenom"];
req.session["encadrant_"+toto+"_telephone_mobile"] = req.body["encadrant_"+toto+"_telephone_mobile"];
req.session["encadrant_"+toto+"_mail"] = req.body["encadrant_"+toto+"_mail"];
req.session["encadrant_"+toto+"_prof_instrument"] = req.body["encadrant_"+toto+"_prof_instrument"];
encadrant_compteur++;
} else {
req.session["encadrant_"+toto+"_type"] = undefined;
req.session["encadrant_"+toto+"_nom"] = undefined;
req.session["encadrant_"+toto+"_prenom"] = undefined;
req.session["encadrant_"+toto+"_telephone_mobile"] = undefined;
req.session["encadrant_"+toto+"_mail"] = undefined;
req.session["encadrant_"+toto+"_prof_instrument"] = undefined;
}
}
if (req.body.don && req.body.don > 0) {req.session.don = req.body.don;} else {req.session.don = 0;}
/////////////////////////////////////////////////
// RÉCAP TARIF
/////////////////////////////////////////////////
req.session.cout_concertiste = cout_concertiste;
req.session.cout_spectateur = cout_spectateur;
req.session.montant_commande = cout_concertiste + cout_spectateur;
req.session.montant_total = cout_concertiste + cout_spectateur + parseInt(req.session.don);
/////////////////////////////////////////////////
// ENVOIE VERS PAGE SUIVANTE
// SI PAS DE CONCERTISTE OU PAS D'ENCADRANT ON NE PEUT PAS AVANCER
// Par ex si on n'inscrit que des spectateurs
/////////////////////////////////////////////////
if (piano_compteur > req.session.piano_nb_restantes || alto_compteur > req.session.alto_nb_restantes || flute_compteur > req.session.flute_nb_restantes || trompette_compteur > req.session.trompette_nb_restantes || harpe_compteur > req.session.harpe_nb_restantes || violon1_compteur > req.session.violon1_nb_restantes || violon2_compteur > req.session.violon2_nb_restantes || violoncelle1_compteur > req.session.violoncelle1_nb_restantes || violoncelle2_compteur > req.session.violoncelle2_nb_restantes) {
logger.info("Plus de parent encadrant demandé que de restant", { numsession: req.session.id, label: filename});
req.session.err_mail_form_adhesion_1 = 'Vous avez réservé plus de places élève concertiste que de places restantes. Veuillez recommencer.';
affiche_page_identifier();
} else {
if (encadrant_compteur < 1 && cout_concertiste < 1 && req.session.deja_inscrit_concert == "non") {
logger.info("pas d'encadrant ni de concertiste", { numsession: req.session.id, label: filename});
req.session.err_mail_form_adhesion_1 = "Veuillez réserver au moins un élève concertiste ou une personne encadrante";
affiche_page_identifier();
} else {
res.redirect('/concert/inscription_recap');
}
}
}
/////////////////////////////////////////////////
// EXPORT DES MODULES POUR QU'ILS PUISSENT LUS PAR LES AUTRES FICHIERS JS
/////////////////////////////////////////////////
module.exports = {
inscription_spectateur
}

View File

@@ -0,0 +1,162 @@
/////////////////////////////////////////////////
// LOGGING
/////////////////////////////////////////////////
const logger = require("../../public/js/app/logger_concert");
/////////////////////////////////////////////////
// APPELS DES MODULES
/////////////////////////////////////////////////
const path = require("path");
const fs = require("fs");
// CALCUL DE DATE
const moment = require('moment');
// ENVOIE MAIL GOOGLE MAIL
const nodemailer = require('nodemailer');
// CONNECTION BASE DE DONNÉES
const mysql = require('mysql2');
const mysql_promise = require('mysql2/promise');
/////////////////////////////////////////////////
// APPELS DES FONCTIONS
/////////////////////////////////////////////////
const sleep = require("./../../modules/sleep");
////////////////////////////////////////////////////
// FILE NAME
////////////////////////////////////////////////////
const filename = path.parse(__filename).base;
////////////////////////////////////////////////////
// CONNECTION DB
////////////////////////////////////////////////////
async function connect_DB_promise() {
return db_connection_promise = await mysql_promise.createConnection({
host: process.env.db_connection_host,
port: process.env.db_connection_port,
user: process.env.db_connection_user,
password: process.env.db_connection_password,
database: process.env.db_connection_database
});
}
/////////////////////////////////////////////////
// 3 - PAGE INSCRIPTION FAMILLE
/////////////////////////////////////////////////
const inscription_spectateur_tous_recap = async function (req, res) {
logger.info("======================================", { label: filename });
logger.info("======== FUNCTION inscription_spectateur_tous_recap ==========", { label: filename });
logger.info("======================================", { label: filename });
// VARIABLES
let cout_concertiste = 0;
let cout_spectateur = 0;
let montant_total = 0;
let montant_commande = 0;
let don = 0;
let encadrant_compteur = 0;
let piano_compteur = 0;
let alto_compteur = 0;
let flute_compteur = 0;
let trompette_compteur = 0;
let harpe_compteur = 0;
let violon1_compteur = 0;
let violon2_compteur = 0;
let violoncelle1_compteur = 0;
let violoncelle2_compteur = 0;
function affiche_page_identifier() {
////////////////////////////////////////////////////
// AFFIHER LA PAGE /identifier
// AFFICHAGE DES ERREURS
// EN CAS DE RETOUR SUR LA PAGE AVEC ERREUR :
// - SI IDENTIFIANT NON ADHÉRENT
// - SI RIEN SAISIE
////////////////////////////////////////////////////
if (req.session.err_mail_form_adhesion_1) {
res.locals.err_mail_form_adhesion_1 = req.session.err_mail_form_adhesion_1;
res.locals.err_mail_form_adhesion_2 = req.session.err_mail_form_adhesion_2;
res.locals.err_mail_form_adhesion_3 = req.session.err_mail_form_adhesion_3;
// on supprime le contenu après affichage
req.session.err_mail_form_adhesion_1 = undefined;
req.session.err_mail_form_adhesion_2 = undefined;
req.session.err_mail_form_adhesion_3 = undefined;
}
res.render('concert/page_templates/erreur');
};
/////////////////////////////////////////////////
// RÉCUPÉRER LES INFORMATIONS SAISIES DANS LE FORMULAIRE
/////////////////////////////////////////////////
req.session.identifiant = req.body.identifiant_adherent;
req.session.association_suzuki = req.body.association_suzuki;
req.session.adherent_nom = req.body.adherent_nom;
req.session.adherent_prenom = req.body.adherent_prenom;
req.session.adherent_telephone_mobile = req.body.adherent_telephone_mobile;
req.session.adherent_mail = req.body.adherent_mail;
if (req.body.spectateur_nb_place > 0) {
req.session.spectateur_nb_place = req.body.spectateur_nb_place;
cout_spectateur = 20 * req.session.spectateur_nb_place;
} else {
req.session.spectateur_nb_place = 0;
}
for (let toto = 1; toto < 5; toto++) {
if (req.body["encadrant_"+toto+"_nom"]){
req.session["encadrant_"+toto+"_type"] = req.body["encadrant_"+toto+"_type"];
req.session["encadrant_"+toto+"_nom"] = req.body["encadrant_"+toto+"_nom"];
req.session["encadrant_"+toto+"_prenom"] = req.body["encadrant_"+toto+"_prenom"];
req.session["encadrant_"+toto+"_telephone_mobile"] = req.body["encadrant_"+toto+"_telephone_mobile"];
req.session["encadrant_"+toto+"_mail"] = req.body["encadrant_"+toto+"_mail"];
req.session["encadrant_"+toto+"_prof_instrument"] = req.body["encadrant_"+toto+"_prof_instrument"];
encadrant_compteur++;
} else {
req.session["encadrant_"+toto+"_type"] = undefined;
req.session["encadrant_"+toto+"_nom"] = undefined;
req.session["encadrant_"+toto+"_prenom"] = undefined;
req.session["encadrant_"+toto+"_telephone_mobile"] = undefined;
req.session["encadrant_"+toto+"_mail"] = undefined;
req.session["encadrant_"+toto+"_prof_instrument"] = undefined;
}
}
if (req.body.don && req.body.don > 0) {req.session.don = req.body.don;} else {req.session.don = 0;}
/////////////////////////////////////////////////
// RÉCAP TARIF
/////////////////////////////////////////////////
req.session.montant_commande = cout_spectateur;
req.session.montant_total = cout_spectateur + parseInt(req.session.don);
/////////////////////////////////////////////////
// ENVOIE VERS PAGE SUIVANTE
// SI PAS DE CONCERTISTE OU PAS D'ENCADRANT ON NE PEUT PAS AVANCER
// Par ex si on n'inscrit que des spectateurs
/////////////////////////////////////////////////
if (req.session.montant_total > 0 || encadrant_compteur > 0) {
req.session.deja_inscrit_concert = "oui";
res.redirect('/concert/inscription_recap');
} else {
logger.info("montant de la commande inférieur à 0 OU 0 encadrant", { numsession: req.session.id, label: filename});
req.session.err_mail_form_adhesion_1 = "Veuillez réserver au moins un élève concertiste ou une personne encadrante";
affiche_page_identifier();
}
}
/////////////////////////////////////////////////
// EXPORT DES MODULES POUR QU'ILS PUISSENT LUS PAR LES AUTRES FICHIERS JS
/////////////////////////////////////////////////
module.exports = {
inscription_spectateur_tous_recap
}

View File

@@ -0,0 +1,97 @@
/////////////////////////////////////////////////
// LOGGING
/////////////////////////////////////////////////
const logger = require("../../public/js/app/logger_concert");
/////////////////////////////////////////////////
// APPELS DES MODULES
/////////////////////////////////////////////////
const path = require("path");
const fs = require("fs");
// CALCUL DE DATE
const moment = require('moment');
// ENVOIE MAIL GOOGLE MAIL
const nodemailer = require('nodemailer');
// CONNECTION BASE DE DONNÉES
const mysql = require('mysql2');
const mysql_promise = require('mysql2/promise');
// ADOBE PDF
const PDFServicesSdk = require('@adobe/pdfservices-node-sdk');
/////////////////////////////////////////////////
// APPELS DES FONCTIONS
/////////////////////////////////////////////////
const sleep = require("./../../modules/sleep");
////////////////////////////////////////////////////
// FILE NAME
////////////////////////////////////////////////////
const filename = path.parse(__filename).base;
////////////////////////////////////////////////////
// CONNECTION DB
////////////////////////////////////////////////////
/////////////////////////////////////////////////
// GOOGLE SHEET PARAMETERS
/////////////////////////////////////////////////
const { GoogleSpreadsheet } = require('google-spreadsheet');
const GS_creds = require('../../inscriptionsafps-53b60452f63d.json');
const { error } = require("console");
// Fichier Google Sheet "afps_concert_annuel" (Mon Drive/inscriptions/base_donees)
// doc ID is the long id in the sheets URL
const GS_concert = new GoogleSpreadsheet(process.env.gsheet_concertannuel);
/////////////////////////////////////////////////
// ENVOIE DES INFOS DANS LA GOOGLESHEET
/////////////////////////////////////////////////
const recup_gs = async function(req, res) {
logger.info("======================================", { label: filename });
logger.info("======== FUNCTION recup_gs ==========", { label: filename });
logger.info("======================================", { label: filename });
/////////////////////////////////////////////////
// CONNEXION GSHEET
try {
await GS_concert.useServiceAccountAuth(GS_creds);
await GS_concert.loadInfo();
const GS_concert_adherent = GS_concert.sheetsByTitle['adherents'];
const ajout_gs_adherent = await GS_concert_adherent.addRows(
[
{
saison: "tutu"
}
]
);
await sleep.wait(5000);
req.session.message = "fonction terminée";
res.redirect('/concert/maj_googlesheet');
} catch (error) {
// Echec de connection à la GOOGLE SHEET
logger.error("Il y a un problème avec la connection à Google sheet : " + error, { numsession: req.session.id });
req.session.message = "Il y a un problème système avec la Google Sheet, veuillez recommencer.";
res.redirect('/concert/maj_googlesheet');
};
}
/////////////////////////////////////////////////
// EXPORT DES MODULES POUR QU'ILS PUISSENT LUS PAR LES AUTRES FICHIERS JS
/////////////////////////////////////////////////
module.exports = {
recup_gs
}

View File

@@ -0,0 +1,721 @@
/////////////////////////////////////////////////
// LOGGING
/////////////////////////////////////////////////
const logger = require("../../public/js/app/logger_concert");
/////////////////////////////////////////////////
// APPELS DES MODULES
/////////////////////////////////////////////////
const path = require("path");
const fs = require("fs");
// CALCUL DE DATE
const moment = require('moment');
// ENVOIE MAIL GOOGLE MAIL
const nodemailer = require('nodemailer');
// CONNECTION BASE DE DONNÉES
const mysql = require('mysql2');
const mysql_promise = require('mysql2/promise');
// STRIPE
const stripe = require('stripe')(process.env.STRIPE_PRIVATE_KEY);
// FETCH (utile pour nodejs version < 18)
const fetch = require("node-fetch");
/////////////////////////////////////////////////
// GOOGLE SHEET PARAMETERS
/////////////////////////////////////////////////
const { GoogleSpreadsheet } = require('google-spreadsheet');
const GS_creds = require('../../inscriptionsafps-53b60452f63d.json');
const { error } = require("console");
// Fichier Google Sheet "afps_concert_annuel" (Mon Drive/inscriptions/base_donees)
// doc ID is the long id in the sheets URL
const GS_concert = new GoogleSpreadsheet(process.env.gsheet_concertannuel);
/////////////////////////////////////////////////
// APPELS DES FONCTIONS
/////////////////////////////////////////////////
const sleep = require("./../../modules/sleep");
const envoie_mail = require("./../../modules/envoie_mail");
////////////////////////////////////////////////////
// FILE NAME
////////////////////////////////////////////////////
const filename = path.parse(__filename).base;
////////////////////////////////////////////////////
// CONNECTION DB
////////////////////////////////////////////////////
async function connect_DB_promise() {
return db_connection_promise = await mysql_promise.createConnection({
host: process.env.db_connection_host,
port: process.env.db_connection_port,
user: process.env.db_connection_user,
password: process.env.db_connection_password,
database: process.env.db_connection_database
});
}
/////////////////////////////////////////////////
// 4 - PAGE RECAP
// CLIC sur PAYER
// enregistrement dans la BD des participants
// Envoie vers Stripe
/////////////////////////////////////////////////
const payer = async function (req, res) {
logger.info("======================================", { label: filename });
logger.info("======== FUNCTION payer (enregistrement BD + envoie vers Stripe) ==========", { label: filename });
logger.info("======================================", { label: filename });
logger.info("req.session.adherent_mail = " + req.session.adherent_mail , { numsession: req.session.id, label: filename});
logger.info("req.session.deja_inscrit_concert = " + req.session.deja_inscrit_concert , { numsession: req.session.id, label: filename});
let sql;
let table;
let champs;
let values;
let saison = "2025/2026";
moment.locale('fr');
let now = moment().format("YYYY-MM-DD HH:mm:ss");
var today = moment().format('L');
let commande_nbr_places_concertiste = 0;
let commande_nbr_places_encadrant_parent = 0;
let commande_nbr_places_encadrant_prof = 0;
let piano_commandes = 0;
let alto_commandes = 0;
let flute_commandes = 0;
let trompette_commandes = 0;
let harpe_commandes = 0;
let violon1_commandes = 0;
let violon2_commandes = 0;
let violoncelle1_commandes = 0;
let violoncelle2_commandes = 0;
var mail_objet;
var mail_html;
function affiche_page_identifier() {
////////////////////////////////////////////////////
// AFFIHER LA PAGE /identifier
// AFFICHAGE DES ERREURS
// EN CAS DE RETOUR SUR LA PAGE AVEC ERREUR :
// - SI IDENTIFIANT NON ADHÉRENT
// - SI RIEN SAISIE
////////////////////////////////////////////////////
if (req.session.err_mail_form_adhesion_1) {
res.locals.err_mail_form_adhesion_1 = req.session.err_mail_form_adhesion_1;
res.locals.err_mail_form_adhesion_2 = req.session.err_mail_form_adhesion_2;
res.locals.err_mail_form_adhesion_3 = req.session.err_mail_form_adhesion_3;
// on supprime le contenu après affichage
req.session.err_mail_form_adhesion_1 = undefined;
req.session.err_mail_form_adhesion_2 = undefined;
req.session.err_mail_form_adhesion_3 = undefined;
}
res.render('concert/page_templates/erreur');
};
/////////////////////////////////////////////////
// SI IDENTIFIANT PERDU
/////////////////////////////////////////////////
logger.info("req.session.identifiant : " + req.session.identifiant , { numsession: req.session.id, label: filename});
if (req.session.identifiant === undefined) {
logger.info("IDENTIFIANT PERDU", { numsession: req.session.id });
req.session.err_mail_form_adhesion_1 = "Session expirée, veuillez recommencer";
affiche_page_identifier();
} else {
/////////////////////////////////////////////////
// AJOUT DANS LA BASE DE DONNÉES
/////////////////////////////////////////////////
if (req.session.deja_inscrit_concert == "non") {
logger.info("NOUVELLE INSCRIPTION AU CONCERT", { numsession: req.session.id, label: filename});
} else if (req.session.deja_inscrit_concert == "oui") {
logger.info("AJOUT DE BILLETS POUR UN ADHÉRENT DÉJÀ INSCRIT AU CONCERT", { numsession: req.session.id, label: filename});
}
// CONNECTION DB PROMISE
try {
//Connexion
let db_connection_promise = await connect_DB_promise();
//Queries
/////////////////////////////////////////////////
// AJOUT CONCERTISTES
for (let toto = 1; toto < 5; toto++) {
if (req.session["eleve_"+toto+"_nom"]) {
table = "ca_concertiste";
if (req.session.deja_inscrit_concert == "non") {
champs = "date_maj,saison,identifiant,concertiste_nom,concertiste_prenom,concertiste_age,concertiste_intrument,concertiste_cahier,concertiste_piece,concertiste_prof_nom,concertiste_prof_mail";
values = '"'+ now + '","' + saison + '"' + ',"' + req.session.identifiant + '","' + req.session["eleve_"+toto+"_nom"] + '","' + req.session["eleve_"+toto+"_prenom"] + '",' + req.session["eleve_"+toto+"_age"] + ',"' + req.session["eleve_"+toto+"_instrument"] + '","' + req.session["eleve_"+toto+"_cahier"] + '","' + req.session["eleve_"+toto+"_piece"] + '","' + req.session["eleve_"+toto+"_prof_nom"] + '","' + req.session["eleve_"+toto+"_prof_mail"] + '"';
} else if (req.session.deja_inscrit_concert == "oui") {
champs = "date_maj,saison,identifiant,concertiste_nom,concertiste_prenom,concertiste_age,concertiste_intrument,concertiste_cahier,concertiste_piece,concertiste_prof_nom,concertiste_prof_mail,ajout";
values = '"'+ now + '","' + saison + '"' + ',"' + req.session.identifiant + '","' + req.session["eleve_"+toto+"_nom"] + '","' + req.session["eleve_"+toto+"_prenom"] + '",' + req.session["eleve_"+toto+"_age"] + ',"' + req.session["eleve_"+toto+"_instrument"] + '","' + req.session["eleve_"+toto+"_cahier"] + '","' + req.session["eleve_"+toto+"_piece"] + '","' + req.session["eleve_"+toto+"_prof_nom"] + '","' + req.session["eleve_"+toto+"_prof_mail"] + '","' + now + '"';
}
sql = 'INSERT INTO ' + table + ' (' + champs + ') VALUES (' + values + ')';
logger.info("REQUETE SQL ca_concertiste : " + sql , { numsession: req.session.id, label: filename});
const [results, fields] = await db_connection_promise.execute(sql);
logger.info("CONCERTISTES Row ID added : " + results.insertId, { numsession: req.session.id, label: filename});
// COMPTEUR DE PLACES
commande_nbr_places_concertiste += 1;
if (req.session["eleve_"+toto+"_instrument"] == "Piano") {
piano_commandes += 1;
}
if (req.session["eleve_"+toto+"_instrument"] == "Alto") {
alto_commandes += 1;
}
if (req.session["eleve_"+toto+"_instrument"] == "Flute") {
flute_commandes += 1;
}
if (req.session["eleve_"+toto+"_instrument"] == "Trompette") {
trompette_commandes += 1;
}
if (req.session["eleve_"+toto+"_instrument"] == "Harpe") {
harpe_commandes += 1;
}
if (req.session["eleve_"+toto+"_instrument"] == "Violon") {
switch (req.session["eleve_"+toto+"_cahier"]) {
case 'Cahier 1':
violon1_commandes += 1;
break;
case 'Cahier 2':
violon1_commandes += 1;
break;
case 'Cahier 3':
violon1_commandes += 1;
break;
case 'Cahier 4':
violon1_commandes += 1;
break;
case 'Cahier 5':
violon1_commandes += 1;
break;
case 'Cahier 6':
violon2_commandes += 1;
break;
case 'Cahier 7':
violon2_commandes += 1;
break;
case 'Cahier 8':
violon2_commandes += 1;
break;
case 'Cahier 9':
violon2_commandes += 1;
break;
case 'Cahier 10':
violon2_commandes += 1;
break;
default:
logger.info("Erreur détecté dans le switch req.session[eleve_+toto+_instrument] == Violon", { numsession: req.session.id, label: filename});
}
}
if (req.session["eleve_"+toto+"_instrument"] == "Violoncelle") {
switch (req.session["eleve_"+toto+"_cahier"]) {
case 'Cahier 1':
violoncelle1_commandes += 1;
break;
case 'Cahier 2':
violoncelle1_commandes += 1;
break;
case 'Cahier 3':
violoncelle1_commandes += 1;
break;
case 'Cahier 4':
violoncelle1_commandes += 1;
break;
case 'Cahier 5':
violoncelle2_commandes += 1;
break;
case 'Cahier 6':
violoncelle2_commandes += 1;
break;
case 'Cahier 7':
violoncelle2_commandes += 1;
break;
case 'Cahier 8':
violoncelle2_commandes += 1;
break;
case 'Cahier 9':
violoncelle2_commandes += 1;
break;
case 'Cahier 10':
violoncelle2_commandes += 1;
break;
default:
logger.info("Erreur détecté dans le switch req.session[eleve_+toto+_instrument] == Violoncelle", { numsession: req.session.id, label: filename});
}
}
}
}
/////////////////////////////////////////////////
// AJOUT ENCADRANTS
let compteur_encadrants = 0;
for (let toto = 1; toto < 5; toto++) {
if (req.session["encadrant_"+toto+"_nom"]) {
// SI PARENT, ne rien mettre dans instrument (évite qu'il y ait "undefined")
if (!req.session["encadrant_"+toto+"_prof_instrument"]) {req.session["encadrant_"+toto+"_prof_instrument"] = ''};
table = "ca_encadrant";
if (req.session.deja_inscrit_concert == "non") {
champs = "date_maj,saison,identifiant,encadrant_type,encadrant_nom,encadrant_prenom,encadrant_telephone_mobile,encadrant_mail,encadrant__prof_instrument";
values = '"'+ now + '","' + saison + '"' + ',"' + req.session.identifiant + '","' + req.session["encadrant_"+toto+"_type"] + '","' + req.session["encadrant_"+toto+"_nom"] + '","' + req.session["encadrant_"+toto+"_prenom"] + '","' + req.session["encadrant_"+toto+"_telephone_mobile"] + '","' + req.session["encadrant_"+toto+"_mail"] + '","' + req.session["encadrant_"+toto+"_prof_instrument"] + '"';
} else if (req.session.deja_inscrit_concert == "oui") {
champs = "date_maj,saison,identifiant,encadrant_type,encadrant_nom,encadrant_prenom,encadrant_telephone_mobile,encadrant_mail,encadrant__prof_instrument, ajout";
values = '"'+ now + '","' + saison + '"' + ',"' + req.session.identifiant + '","' + req.session["encadrant_"+toto+"_type"] + '","' + req.session["encadrant_"+toto+"_nom"] + '","' + req.session["encadrant_"+toto+"_prenom"] + '","' + req.session["encadrant_"+toto+"_telephone_mobile"] + '","' + req.session["encadrant_"+toto+"_mail"] + '","' + req.session["encadrant_"+toto+"_prof_instrument"] + '","' + now + '"';
}
sql = 'INSERT INTO ' + table + ' (' + champs + ') VALUES (' + values + ')';
logger.info("REQUETE SQL ca_encadrant : " + sql , { numsession: req.session.id, label: filename});
const [results, fields] = await db_connection_promise.execute(sql);
// COMPTEUR DE PLACES
if (req.session["encadrant_"+toto+"_type"]=="Professeur") {
commande_nbr_places_encadrant_prof += 1;
};
if (req.session["encadrant_"+toto+"_type"]=="Parent") {
commande_nbr_places_encadrant_parent += 1;
};
compteur_encadrants++;
}
}
/////////////////////////////////////////////////
// AJOUT DB INFORMATIONS ADHÉRENTS
// SI C'EST SA PREMIÈRE INSCRIPTION
if (req.session.deja_inscrit_concert == "non") {
table = "ca_adherent";
sql = 'INSERT INTO ';
sql += table;
sql += ' (';
sql += 'date_inscription, ';
sql += 'date_maj, ';
sql += 'saison, ';
sql += 'identifiant, ';
sql += 'association_suzuki, ';
sql += 'adherent_nom, ';
sql += 'adherent_prenom, ';
sql += 'adherent_telephone_mobile, ';
sql += 'adherent_mail, ';
sql += 'hebergement_ville, ';
sql += 'hebergement_places, ';
sql += 'commande_nb_spectateur, ';
sql += 'comment, ';
sql += 'commande_nb_concertiste, ';
sql += 'commande_nb_encadr_prof, ';
sql += 'commande_nb_encadr_par, ';
sql += 'commande_cout_concertiste, ';
sql += 'commande_cout_spectateur, ';
sql += 'don, ';
sql += 'stripe_statut_paiement, ';
sql += 'montant_total';
sql += ') VALUES (';
sql += '"'+ now +'",';
sql += '"'+ now +'",';
sql += '"'+ saison +'",';
sql += '"'+ req.session.identifiant +'",';
sql += '"'+ req.session.association_suzuki +'",';
sql += '"'+ req.session.adherent_nom +'",';
sql += '"'+ req.session.adherent_prenom +'",';
sql += '"'+ req.session.adherent_telephone_mobile +'",';
sql += '"'+ req.session.adherent_mail +'",';
sql += '"'+ req.session.hebergement_ville +'",';
sql += ''+ req.session.hebergement_nb +',';
sql += ''+ req.session.spectateur_nb_place +',';
sql += '"'+ req.session.commentaire_adherent +'",';
sql += ''+ commande_nbr_places_concertiste +',';
sql += ''+ commande_nbr_places_encadrant_prof +',';
sql += ''+ commande_nbr_places_encadrant_parent +',';
sql += ''+ req.session.cout_concertiste +',';
sql += ''+ req.session.cout_spectateur +',';
sql += ''+ parseInt(req.session.don) +',';
if (req.session.montant_total > 0) {
sql += '"attente",';
} else {
sql += '"gratuit",';
}
sql += ''+ req.session.montant_total;
sql += ')';
logger.info("REQUETE SQL ca_adherent : " + sql , { numsession: req.session.id, label: filename});
const [results_insert_ca_adherent, fields_insert_ca_adherent] = await db_connection_promise.execute(sql);
logger.info("ADHÉRENTS Row ID added : " + results_insert_ca_adherent.insertId, { numsession: req.session.id, label: filename});
} else if (req.session.deja_inscrit_concert == "oui") {
// SI C'EST UN AJOUT DE BILLET
table = "ca_ajout";
sql = 'INSERT INTO ';
sql += table;
sql += ' (';
sql += 'date_maj, ';
sql += 'saison, ';
sql += 'identifiant, ';
sql += 'commande_nb_spectateur, ';
sql += 'commande_nb_concertiste, ';
sql += 'commande_nb_encadr_prof, ';
sql += 'commande_nb_encadr_par, ';
sql += 'commande_cout_concertiste, ';
sql += 'commande_cout_spectateur, ';
sql += 'don, ';
sql += 'stripe_statut_paiement, ';
sql += 'montant_total';
sql += ') VALUES (';
sql += '"'+ now +'",';
sql += '"'+ saison +'",';
sql += '"'+ req.session.identifiant +'",';
sql += ''+ req.session.spectateur_nb_place +',';
sql += ''+ commande_nbr_places_concertiste +',';
sql += ''+ commande_nbr_places_encadrant_prof +',';
sql += ''+ commande_nbr_places_encadrant_parent +',';
sql += ''+ req.session.cout_concertiste +',';
sql += ''+ req.session.cout_spectateur +',';
sql += ''+ parseInt(req.session.don) +',';
if (req.session.montant_total > 0) {
sql += '"attente",';
} else {
sql += '"gratuit",';
}
sql += ''+ req.session.montant_total;
sql += ')';
logger.info("REQUETE SQL ca_ajout : " + sql , { numsession: req.session.id, label: filename});
const [results_insert_ca_adherent, fields_insert_ca_adherent] = await db_connection_promise.execute(sql);
logger.info("ca_ajout Row ID added : " + results_insert_ca_adherent.insertId, { numsession: req.session.id, label: filename});
}
/////////////////////////////////////////////////
// ENVOIE VERS STRIPE
// SI MONTANT TOTAL > 0
/////////////////////////////////////////////////
if (req.session.montant_total > 0) {
logger.info("======================================", { label: filename });
logger.info("======== ENVOIE VERS STRIPE ==========", { label: filename });
logger.info("======================================", { label: filename });
/////////////////////////////////////////////////
// STRIPE - ETAPE 1 - CREER l'INTENTION DE PAIEMENT
logger.info("req.session.adherent_mail = " + req.session.adherent_mail , { numsession: req.session.id, label: filename});
const session_stripe = await stripe.checkout.sessions.create({
metadata: {identifiant: req.session.identifiant, ajoutbillet:req.session.deja_inscrit_concert},
customer_email: req.session.adherent_mail,
submit_type: 'pay',
success_url: process.env.STRIPE_CONCERT_SUCCESSURL,
cancel_url: process.env.STRIPE_CONCERT_CANCELURL,
payment_method_types: ['card'],
line_items: [{
price_data: {
currency: 'eur',
product_data: {
name: 'Billets Concert UNESCO',
},
unit_amount: req.session.montant_commande * 100,
},
quantity: 1,
},
{
price_data: {
currency: 'eur',
product_data: {
name: 'Don',
},
unit_amount: parseInt(req.session.don) * 100,
},
quantity: 1,
}],
//Checkout has three modes: payment, subscription, or setup.
mode: 'payment'
});
logger.info("session_stripe.id : " + session_stripe.id , { numsession: req.session.id, label: filename});
/////////////////////////////////////////////////
// REDIRECTION VERS LA PAGE DE PAIEMENT STRIPE
logger.info("Stripe session_stripe.url : " + session_stripe.url, { numsession: req.session.id, label: filename});
res.redirect(session_stripe.url);
} else {
// AJOUT DÉCOMPTE DES PLACES
// !!! Au démarrage de la campagne les champs de la table doivent être à 0 (zéro) et non vide ou null
table = "ca_decompte_place";
sql = 'UPDATE ';
sql += table;
sql += ' SET ';
sql += 'date_maj = "' + now + '", ';
sql += 'encadr_prof_commandes = encadr_prof_commandes + ' + commande_nbr_places_encadrant_prof + ', ';
sql += 'encadr_parent_commandes = encadr_parent_commandes + ' + commande_nbr_places_encadrant_parent;
logger.info("REQUETE SQL UPDATE ca_decompte_place : " + sql , { numsession: req.session.id, label: filename});
const [results, fields] = await db_connection_promise.execute(sql);
logger.info("REQUETE SQL UPDATE ca_decompte_place TERMINÉE ", { numsession: req.session.id, label: filename});
/////////////////////////////////////////////////
// SI PAS DE PAIEMENT À FAIRE CAR MONTANT < 0
// ON CONTINUE ET ON ENVOIE LES BILLETS
logger.info("Montant à payer inférieur à zéro, on ne passe pas par stripe", { numsession: req.session.id, label: filename});
//////////////////////////
// ENVOI MAIL À L'ADHÉRENT
mail_objet = 'AFPS - CONCERT UNESCO 2024 - INSCRIPTION - ' + req.session.identifiant;
mail_html = "<p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'>Cher(e) adhérent(e),<br></p><p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'>Félicitations ! Vous êtes inscrit au Concert national Unesco 2024 organisé par l'Association Française pour la Pédagogie Suzuki.";
mail_html += "<br>Vous allez recevoir vos billets par mail de la part de la plateforme de Billetterie WEEZEVENT.</p>";
mail_html += "<br>";
mail_html += '<p style="color:#E73058;font-size: 13pt; font-family: Arial; text-decoration: none;"><strong>RÉCAPITULATIF</strong></p>';
mail_html += "<p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Identifiant Suzuki : </strong>" + req.session.identifiant;
if (req.session.hebergement_nb > 0) {mail_html += "</p><br><p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>HÉBERGEMENT PROPOSÉ : </strong><br> Ville : " + req.session.hebergement_ville + ", nombre de personnes : " + req.session.hebergement_nb > 0 + "</p><br>";}
mail_html += "<br><p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong><span style='color: #E73058'>" + compteur_encadrants + "</span> ENCADRANT(S) :</strong></p>";
mail_html += "<p style='font-size: 9pt; font-family: Arial; font-style: italic; color: #454343; text-decoration: none;'>Les encadrants s'engagent à être présents les 2 journées du 20 et 21 avril 2024.</p>";
for (let toto = 1; toto < 5; toto++) {
if (req.session["encadrant_"+toto+"_nom"]) {
mail_html += "<p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'>Nom : " + req.session["encadrant_"+toto+"_nom"] + " " + req.session["encadrant_"+toto+"_prenom"] + " - " + req.session["encadrant_"+toto+"_type"] + "<br>";
mail_html += "coordonnées : " + req.session["encadrant_"+toto+"_telephone_mobile"] + " - " + req.session["encadrant_"+toto+"_mail"] + "<br>";
if (req.session["encadrant_"+toto+"_prof_instrument"]) {mail_html += "instrument : " + req.session["encadrant_"+toto+"_prof_instrument"]};
mail_html += "</p>";
}
}
mail_html += '<br><br><p style="font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;">Association Française pour la pédagogie Suzuki<br>Marie Rossot - Pôle organisation du Concert national Unesco 2024</p><p><img src="cid:logo" alt="Logo" width="200" height="73"/></p>';
// ajout du logo
let dossier_image = path.resolve(__dirname, "../../public/images/logos/")+"/logosuzukigris.png";
// VARIABLE POUR LE MAIL
var mailOptions = {
from: 'afps.inscription@gmail.com',
to: req.session.adherent_mail,
subject: mail_objet,
html: mail_html,
attachments: [{
filename: 'logosuzukigris.png',
path: dossier_image,
cid: 'logo'
}]
};
envoie_mail.envoie_mail(mailOptions);
/////////////////////////////////////
// ENVOI BILLETS VERS WEEZEVENT
/////////////////////////////////////
let weez_id_evenement_concertiste = process.env.weezevent_id_event_concertiste;
let weez_id_evenement_encadrant = process.env.weezevent_id_event_encacrant;
let weez_id_evenement_spectateur = process.env.weezevent_id_event_spect;
let weez_id_billet_concertiste = process.env.weez_id_billet_concertiste;
let weez_id_billet_spectateur = process.env.weez_id_billet_spectateur;
let weez_id_billet_encadrant_parent = process.env.weez_id_billet_encadrant_parent;
let weez_id_billet_encadrant_prof = process.env.weez_id_billet_encadrant_prof;
let weez_id_billet;
let weez_email = req.session.adherent_mail;
//let weez_nom = results_ca_adherent[0].adherent_nom;
let participants = {
"participants": [],
"return_ticket_url": true
};
let weez_prenom;
let TICKETING_API_BASE_URL = "https://api.weezevent.com/v3/participants?";
let url = TICKETING_API_BASE_URL;
body = '&api_key=' + process.env.weezevent_API_KEY;
body += '&access_token=' + process.env.weezevent_TOKEN;
async function envoi_weez_api(url,body) {
logger.info("url = " + url , { numsession: req.session.id, label: filename});
logger.info("body = " + body , { numsession: req.session.id, label: filename});
let headers = {'content-type':'application/x-www-form-urlencoded;charset=utf-8'};
let premise_post_token = await fetch(url, {
method: 'POST',
headers: headers,
body: body
});
let response_post_token = await premise_post_token.json();
console.log("response_post_token = ", response_post_token);
logger.info("response_post_token = " + response_post_token , { numsession: req.session.id, label: filename});
}
// LISTING DES PARTICIPANTS
// BILLETS ENCADRANT
for (let toto = 1; toto < 5; toto++) {
if (req.session["encadrant_"+toto+"_nom"]) {
if (req.session["encadrant_"+toto+"_type"]=="Parent") {weez_id_billet = weez_id_billet_encadrant_parent}
if (req.session["encadrant_"+toto+"_type"]=="Professeur") {weez_id_billet = weez_id_billet_encadrant_prof}
participants.participants.push({ "id_evenement": weez_id_evenement_encadrant, "id_billet": weez_id_billet, "email": weez_email, "nom": req.session["encadrant_"+toto+"_nom"], "prenom": req.session["encadrant_"+toto+"_prenom"], "form": {"adresse": req.session.identifiant}, "notify": true });
}
}
// ENVOIE DE TOUS LES BILLETS PAR 1 REQUÈTE API
body += '&data=' + JSON.stringify(participants);
envoi_weez_api(url,body);
/////////////////////////////////////
// COPIE VERS GOOGLE SHEET
/////////////////////////////////////
try {
await GS_concert.useServiceAccountAuth(GS_creds);
await GS_concert.loadInfo();
const GS_concert_adherent = GS_concert.sheetsByTitle['adherents'];
const GS_concert_hebergements = GS_concert.sheetsByTitle['hebergements'];
const GS_concert_spectateurs = GS_concert.sheetsByTitle['spectateurs'];
const GS_concert_concertistes = GS_concert.sheetsByTitle['concertistes'];
const GS_concert_encadrants = GS_concert.sheetsByTitle['encadrants'];
const GS_concert_nombre_places = GS_concert.sheetsByTitle['nombre_places'];
const GS_concert_finance = GS_concert.sheetsByTitle['finance'];
const GS_concert_inscription_en_attente = GS_concert.sheetsByTitle['inscription_en_attente'];
const ajout_gs_adherent = await GS_concert_adherent.addRows (
[
{
saison: saison,
identifiant: req.session.identifiant,
association_suzuki: req.session.association_suzuki,
date_inscription: now,
date_inscription_maj: now,
paiement: "gratuit",
adherent_nom: req.session.adherent_nom,
adherent_prenom: req.session.adherent_prenom,
adherent_telephone_mobile: "'" + req.session.adherent_telephone_mobile,
adherent_mail: req.session.adherent_mail,
nb_encadr_prof: commande_nbr_places_encadrant_prof,
nb_encadr_par: commande_nbr_places_encadrant_parent,
commentaire: req.session.commentaire_adherent,
date_maj_gsheet: now
}
]
);
if (req.session.hebergement_nb > 0){
const ajout_gs_hebergements = await GS_concert_hebergements.addRows (
[
{
saison: saison,
identifiant: req.session.identifiant,
hebergement_ville: req.session.hebergement_ville,
hebergement_places: req.session.hebergement_nb,
date_maj_gsheet: now
}
]
);
}
let ajout_gs_encadrants = [];
for (let toto = 1; toto < 5; toto++) {
if (req.session["encadrant_"+toto+"_nom"]) {
ajout_gs_encadrants.push({
saison: saison,
identifiant: req.session.identifiant,
encadrant_type: req.session["encadrant_"+toto+"_type"],
encadrant_nom: req.session["encadrant_"+toto+"_nom"],
encadrant_prenom: req.session["encadrant_"+toto+"_prenom"],
encadrant_telephone_mobile: "'" + req.session["encadrant_"+toto+"_telephone_mobile"],
encadrant_mail: req.session["encadrant_"+toto+"_mail"],
encadrant_prof_instrument: req.session["encadrant_"+toto+"_prof_instrument"],
date_maj_gsheet: now
})
}
}
await GS_concert_encadrants.addRows (ajout_gs_encadrants);
// ONGLET nombre_places
// récup nombre de places dans DBca_decompte_place
sql = 'SELECT spectateur_commandes, concertiste_commandes, encadr_prof_commandes, encadr_parent_commandes, piano_commandes, alto_commandes, flute_commandes, trompette_commandes, harpe_commandes, violon1_commandes, violon2_commandes, violoncelle1_commandes, violoncelle2_commandes FROM ca_decompte_place';
const [results_ca_decompte_place, fields_ca_decompte_place] = await db_connection_promise.execute(sql);
await GS_concert_nombre_places.loadCells('A1:O2');
GS_concert_nombre_places.getCellByA1('C2').value = results_ca_decompte_place[0].encadr_prof_commandes;
GS_concert_nombre_places.getCellByA1('D2').value = results_ca_decompte_place[0].encadr_parent_commandes;
GS_concert_nombre_places.getCellByA1('O2').value = now;
await GS_concert_nombre_places.saveUpdatedCells();
/////////////////////////////////////
// AFFICHAGE DE LA PAGE
res.locals.identifiant = req.session.identifiant;
res.locals.today = today;
res.locals.amount_total = 0;
res.render('concert/page_templates/paiement_reussi');
} catch (error) {
// Echec de connection à la GOOGLE SHEET
logger.error("Il y a un problème avec la connection à Google sheet : " + error, { numsession: req.session.id });
req.session.err_mail_form_adhesion_1 = '"Il y a un problème système connexion base de données, veuillez recommencer, "' + error;
};
}
} catch (error) {
// Echec de connection à la BD
logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id });
req.session.err_mail_form_adhesion_1 = '"Il y a un problème système connexion base de données, veuillez recommencer, "' + error;
//await db_connection_promise.end();
affiche_page_identifier();
}
}
}
/////////////////////////////////////////////////
// EXPORT DES MODULES POUR QU'ILS PUISSENT LUS PAR LES AUTRES FICHIERS JS
/////////////////////////////////////////////////
module.exports = {
payer
}

View File

@@ -0,0 +1,874 @@
/////////////////////////////////////////////////
// LOGGING
/////////////////////////////////////////////////
const logger = require("../../public/js/app/logger_concert");
/////////////////////////////////////////////////
// APPELS DES MODULES
/////////////////////////////////////////////////
const path = require("path");
const fs = require("fs");
// CALCUL DE DATE
const moment = require('moment');
// ENVOIE MAIL GOOGLE MAIL
const nodemailer = require('nodemailer');
// CONNECTION BASE DE DONNÉES
const mysql = require('mysql2');
const mysql_promise = require('mysql2/promise');
// STRIPE
const stripe = require('stripe')(process.env.STRIPE_PRIVATE_KEY);
// ADOBE PDF
const PDFServicesSdk = require('@adobe/pdfservices-node-sdk');
// FETCH (utile pour nodejs version < 18)
const fetch = require("node-fetch");
/////////////////////////////////////////////////
// GOOGLE SHEET PARAMETERS
/////////////////////////////////////////////////
const { GoogleSpreadsheet } = require('google-spreadsheet');
const GS_creds = require('../../inscriptionsafps-53b60452f63d.json');
const { error } = require("console");
// Fichier Google Sheet "afps_concert_annuel" (Mon Drive/inscriptions/base_donees)
// doc ID is the long id in the sheets URL
const GS_concert = new GoogleSpreadsheet(process.env.gsheet_concertannuel);
/////////////////////////////////////////////////
// APPELS DES FONCTIONS
/////////////////////////////////////////////////
const sleep = require("./../../modules/sleep");
const envoie_mail = require("./../../modules/envoie_mail");
const pdf = require("./../../modules/pdf");
////////////////////////////////////////////////////
// FILE NAME
////////////////////////////////////////////////////
const filename = path.parse(__filename).base;
////////////////////////////////////////////////////
// CONNECTION DB
////////////////////////////////////////////////////
async function connect_DB_promise() {
return db_connection_promise = await mysql_promise.createConnection({
host: process.env.db_connection_host,
port: process.env.db_connection_port,
user: process.env.db_connection_user,
password: process.env.db_connection_password,
database: process.env.db_connection_database
});
}
/////////////////////////////////////////////////
// 5 - RETOUR STRIPE
/////////////////////////////////////////////////
const retour_bank = async function (req, res) {
logger.info("======================================");
logger.info("======== retour_bank ==========");
logger.info("======================================");
let sql;
let sql11;
let sql12;
let sql13;
let sql14;
var mail_objet;
var mail_html;
moment.locale('fr');
let now = moment().format("YYYY-MM-DD HH:mm:ss");
var today = moment().format('L');
var identifiant;
let compteur_piano = 0
let compteur_harpe = 0
let compteur_trompette = 0
let compteur_flute = 0
let compteur_alto = 0
let compteur_violon1 = 0
let compteur_violon2 = 0
let compteur_violoncelle1 = 0
let compteur_violoncelle2 = 0
// FONCTION POUR AFFICHER LA PAGE EN CAS D'ERREUR
function affiche_page_identifier() {
////////////////////////////////////////////////////
// AFFIHER LA PAGE /identifier
// AFFICHAGE DES ERREURS
// EN CAS DE RETOUR SUR LA PAGE AVEC ERREUR :
// - SI IDENTIFIANT NON ADHÉRENT
// - SI RIEN SAISIE
////////////////////////////////////////////////////
if (req.session.err_mail_form_adhesion_1) {
res.locals.err_mail_form_adhesion_1 = req.session.err_mail_form_adhesion_1;
res.locals.err_mail_form_adhesion_2 = req.session.err_mail_form_adhesion_2;
res.locals.err_mail_form_adhesion_3 = req.session.err_mail_form_adhesion_3;
// on supprime le contenu après affichage
req.session.err_mail_form_adhesion_1 = undefined;
req.session.err_mail_form_adhesion_2 = undefined;
req.session.err_mail_form_adhesion_3 = undefined;
}
res.render('concert/page_templates/erreur');
};
/////////////////////////////////////////////////
// Si la personne rafraîchit la page
// On arrête
/////////////////////////////////////////////////
if (req.session.idstripe) {
req.session.err_mail_form_adhesion_1 = "Votre session est terminée, veuiller redémarrer votre navigateur.";
affiche_page_identifier();
} else {
/////////////////////////////////////////////////
// REUSSI ou ANNULÉ ?
/////////////////////////////////////////////////
let retour_stripe;
logger.info("req.url : " + req.url, { numsession: req.session.id, label: filename });
if (req.url.indexOf('concert_paiement/annule') !== -1) {
retour_stripe= "annule";
} else if (req.url.indexOf('concert_paiement/reussi') !== -1) {
retour_stripe= "reussi";
} else {
logger.info("Il y a un problème avec l'URL : " + req.url, { numsession: req.session.id, label: filename });
req.session.err_mail_form_adhesion_1 = "Il y a un problème système";
affiche_page_identifier();
}
logger.info("retour_stripe : " + retour_stripe, { numsession: req.session.id, label: filename });
var id = req.query.id;
logger.info("id : " + id, { numsession: req.session.id, label: filename });
req.session.idstripe = id;
const session_stripe = await stripe.checkout.sessions.retrieve(id);
var customer_email = session_stripe.customer_email;
var payment_status = session_stripe.payment_status;
var amount_total = session_stripe.amount_total/100;
var stripe_customer = session_stripe.customer;
var stripe_payment_intent = session_stripe.payment_intent;
var payment_method_types = session_stripe.payment_method_types;
var stripe_status = session_stripe.status;
identifiant = session_stripe.metadata.identifiant;
logger.info("customer_email : " + customer_email, { numsession: req.session.id, label: filename });
logger.info("identifiant : " + identifiant, { numsession: req.session.id, label: filename });
logger.info("payment_status : " + payment_status, { numsession: req.session.id, label: filename });
logger.info("amount_total : " + amount_total, { numsession: req.session.id, label: filename });
logger.info("stripe_status : " + stripe_status, { numsession: req.session.id, label: filename });
logger.info("session_stripe.metadata.ajoutbillet : " + session_stripe.metadata.ajoutbillet, { numsession: req.session.id, label: filename });
let stripe_retour = session_stripe.id;
try {
// MAJ STATUS DU PAIEMENT SI MONTANT A PAYER
//Connexion
let db_connection_promise = await connect_DB_promise();
/// Vérifier que le paiement n'existe pas déjà
/// pour ne pas faire le traitement 2 fois en cas de rafraichissement de la page
let sql0 = 'select identifiant from ca_adherent where stripe_retour = "' + stripe_retour + '"';
const [results0, fields0] = await db_connection_promise.execute(sql0);
logger.info("Row ca_adherent stripe_retour : " + results0.length, { numsession: req.session.id, label: filename});
if (results0.length < 1) {
// SI MODE INSCRIPTION INITIALE
if (session_stripe.metadata.ajoutbillet == "non") {
//Query
sql = 'UPDATE ';
sql += 'ca_adherent';
sql += ' SET ';
sql += 'stripe_retour = "' + stripe_retour + '", ';
sql += 'stripe_date = "' + now + '", ';
if(retour_stripe === "annule") {sql += 'stripe_statut_paiement = "impaye"';}
if(retour_stripe === "reussi") {sql += 'stripe_statut_paiement = "paye"';}
sql += ' WHERE identifiant = "' + identifiant + '"';
const [results, fields] = await db_connection_promise.execute(sql);
logger.info("Row ca_adherent UPDATE STRIPE: " + results.changedRows, { numsession: req.session.id, label: filename});
//ca_concertiste
sql11 = 'SELECT saison, concertiste_nom, concertiste_prenom, concertiste_age, concertiste_intrument, concertiste_cahier, concertiste_piece, concertiste_prof_nom, concertiste_prof_mail, ajout FROM ca_concertiste where identifiant = "' + identifiant + '"';
//ca_encadrant
sql12 = 'SELECT saison, encadrant_type, encadrant_nom, encadrant_prenom, encadrant_telephone_mobile, encadrant_mail, encadrant__prof_instrument, ajout FROM ca_encadrant where identifiant = "' + identifiant + '"';
//Nombre de place commandées
sql13 = 'SELECT commande_nb_spectateur, commande_nb_concertiste, commande_nb_encadr_prof, commande_nb_encadr_par, commande_cout_concertiste, commande_cout_spectateur, don, montant_total, stripe_retour FROM ca_adherent where identifiant = "' + identifiant + '"';
//ca_adherent
sql14 = 'SELECT saison, date_inscription, date_maj, association_suzuki, adherent_nom, adherent_prenom, adherent_telephone_mobile, adherent_mail, hebergement_ville, hebergement_places, comment FROM ca_adherent where identifiant = "' + identifiant + '"';
}
// SI MODE INSCRIPTION AJOUT DE BILLET
// ON SÉLECTIONNE LES CONCERTISTES ET LES ENCADRANTS QUI ONT QUELQUE CHOSE DANS LA CHAMP "AJOUT"
if (session_stripe.metadata.ajoutbillet == "oui") {
//Query
sql = 'UPDATE ';
sql += 'ca_ajout';
sql += ' SET ';
sql += 'stripe_retour = "' + stripe_retour + '", ';
if(retour_stripe === "annule") {sql += 'stripe_statut_paiement = "impaye"';}
if(retour_stripe === "reussi") {sql += 'stripe_statut_paiement = "paye"';}
sql += ' WHERE identifiant = "' + identifiant + '"';
const [results, fields] = await db_connection_promise.execute(sql);
logger.info("Row ca_adherent UPDATE STRIPE: " + results.changedRows, { numsession: req.session.id, label: filename});
//ca_concertiste
sql11 = 'SELECT saison, concertiste_nom, concertiste_prenom, concertiste_age, concertiste_intrument, concertiste_cahier, concertiste_piece, concertiste_prof_nom, concertiste_prof_mail, ajout FROM ca_concertiste where identifiant = "' + identifiant + '" AND ajout IS NOT NULL';
//ca_encadrant
sql12 = 'SELECT saison, encadrant_type, encadrant_nom, encadrant_prenom, encadrant_telephone_mobile, encadrant_mail, encadrant__prof_instrument, ajout FROM ca_encadrant where identifiant = "' + identifiant + '" AND ajout IS NOT NULL';
//Nombre de place commandées
sql13 = 'SELECT commande_nb_spectateur, commande_nb_concertiste, commande_nb_encadr_prof, commande_nb_encadr_par, commande_cout_concertiste, commande_cout_spectateur, don, montant_total, stripe_retour FROM ca_ajout where identifiant = "' + identifiant + '"';
//ca_adherent
sql14 = 'SELECT saison, date_inscription, date_maj, association_suzuki, adherent_nom, adherent_prenom, adherent_telephone_mobile, adherent_mail FROM ca_adherent where identifiant = "' + identifiant + '"';
}
//ca_concertiste
const [results_ca_concertiste, fields_ca_concertiste] = await db_connection_promise.execute(sql11);
logger.info("Row ca_concertiste RECUP INFOS : " + results_ca_concertiste.length, { numsession: req.session.id, label: filename});
//ca_encadrant
const [results_ca_encadrant, fields_ca_encadrant] = await db_connection_promise.execute(sql12);
logger.info("Row ca_encadrant RECUP INFOS : " + results_ca_encadrant.length, { numsession: req.session.id, label: filename});
//Nombre de place commandées
const [results_nb_commande, fields_nb_commande] = await db_connection_promise.execute(sql13);
logger.info("Row results_nb_commande RECUP INFOS : " + results_nb_commande.length, { numsession: req.session.id, label: filename});
// RÉCUPÉRATION DES INFORMATIONS PARTICIPANTS POUR ENVOIE MAIL AVEC RÉCAP
//ca_adherent
const [results_ca_adherent, fields_ca_adherent] = await db_connection_promise.execute(sql14);
logger.info("Row ca_adherent RECUP INFOS: " + results_ca_adherent.length, { numsession: req.session.id, label: filename});
// ADRESSE ADHÉRENT adherent
sql = 'SELECT adherent_adresse_rue, adherent_adresse_codepostal, adherent_adresse_ville FROM adherent where identifiant = "' + identifiant + '"';
const [results_adherent, fields_adherent] = await db_connection_promise.execute(sql);
logger.info("Row adherent RECUP INFOS: " + results_adherent.length, { numsession: req.session.id, label: filename});
// AJOUT DÉCOMPTE DES PLACES
// SI PAIEMENT REUSSI
// !!! Au démarrage de la campagne les champs de la table doivent être à 0 (zéro) et non vide ou null
if(retour_stripe === "reussi") {
sql = 'UPDATE ';
sql += 'ca_decompte_place';
sql += ' SET ';
sql += 'date_maj = "' + now + '", ';
if (results_nb_commande[0].commande_nb_spectateur > 0) { sql += 'spectateur_commandes = spectateur_commandes + ' + results_nb_commande[0].commande_nb_spectateur + ', '; }
if (results_nb_commande[0].commande_nb_concertiste > 0) { sql += 'concertiste_commandes = concertiste_commandes + ' + results_nb_commande[0].commande_nb_concertiste + ', '; }
if (results_nb_commande[0].commande_nb_encadr_prof > 0) { sql += 'encadr_prof_commandes = encadr_prof_commandes + ' + results_nb_commande[0].commande_nb_encadr_prof + ', '; }
if (results_nb_commande[0].commande_nb_encadr_par > 0) { sql += 'encadr_parent_commandes = encadr_parent_commandes + ' + results_nb_commande[0].commande_nb_encadr_par + ', '; }
logger.info("A3 VANT LE IF results_ca_concertiste.length: ", { numsession: req.session.id, label: filename});
logger.info("results_ca_concertiste.length: " + results_ca_concertiste.length, { numsession: req.session.id, label: filename});
if (results_ca_concertiste.length > 0) {
for (let i = 0; i<results_ca_concertiste.length; i++) {
if (results_ca_concertiste[i].concertiste_intrument == "Piano") { compteur_piano++ };
if (results_ca_concertiste[i].concertiste_intrument == "Harpe") { compteur_harpe++ };
if (results_ca_concertiste[i].concertiste_intrument == "Trompette") { compteur_trompette++ };
if (results_ca_concertiste[i].concertiste_intrument == "Flute") { compteur_flute++ };
if (results_ca_concertiste[i].concertiste_intrument == "Alto") { compteur_alto++ };
if (results_ca_concertiste[i].concertiste_intrument == "Violon" && (results_ca_concertiste[i].concertiste_cahier == "Cahier 1" || results_ca_concertiste[i].concertiste_cahier == "Cahier 2" || results_ca_concertiste[i].concertiste_cahier == "Cahier 3" || results_ca_concertiste[i].concertiste_cahier == "Cahier 4" || results_ca_concertiste[i].concertiste_cahier == "Cahier 5")) { compteur_violon1++ };
if (results_ca_concertiste[i].concertiste_intrument == "Violon" && (results_ca_concertiste[i].concertiste_cahier == "Cahier 6" || results_ca_concertiste[i].concertiste_cahier == "Cahier 7" || results_ca_concertiste[i].concertiste_cahier == "Cahier 8" || results_ca_concertiste[i].concertiste_cahier == "Cahier 9" || results_ca_concertiste[i].concertiste_cahier == "Cahier 10")) { compteur_violon2++ };
if (results_ca_concertiste[i].concertiste_intrument == "Violoncelle" && (results_ca_concertiste[i].concertiste_cahier == "Cahier 1" || results_ca_concertiste[i].concertiste_cahier == "Cahier 2" || results_ca_concertiste[i].concertiste_cahier == "Cahier 3" || results_ca_concertiste[i].concertiste_cahier == "Cahier 4")) { compteur_violoncelle1++ };
if (results_ca_concertiste[i].concertiste_intrument == "Violoncelle" && (results_ca_concertiste[i].concertiste_cahier == "Cahier 5" || results_ca_concertiste[i].concertiste_cahier == "Cahier 6" || results_ca_concertiste[i].concertiste_cahier == "Cahier 7" || results_ca_concertiste[i].concertiste_cahier == "Cahier 8" || results_ca_concertiste[i].concertiste_cahier == "Cahier 9" || results_ca_concertiste[i].concertiste_cahier == "Cahier 10")) { compteur_violoncelle2++ };
}
}
sql += 'piano_commandes = piano_commandes + ' + compteur_piano + ', ';
sql += 'alto_commandes = alto_commandes + ' + compteur_alto + ', ';
sql += 'flute_commandes = flute_commandes + ' + compteur_flute + ', ';
sql += 'trompette_commandes = trompette_commandes + ' + compteur_trompette + ', ';
sql += 'harpe_commandes = harpe_commandes + ' + compteur_harpe + ', ';
sql += 'violon1_commandes = violon1_commandes + ' + compteur_violon1 + ', ';
sql += 'violon2_commandes = violon2_commandes + ' + compteur_violon2 + ', ';
sql += 'violoncelle1_commandes = violoncelle1_commandes + ' + compteur_violoncelle1 + ', ';
sql += 'violoncelle2_commandes = violoncelle2_commandes + ' + compteur_violoncelle2;
logger.info("REQUETE SQL UPDATE ca_decompte_place : " + sql , { numsession: req.session.id, label: filename});
const [results_maj_compteur_places, fields_maj_compteur_places] = await db_connection_promise.execute(sql);
}
// ca_decompte_place
sql = 'SELECT spectateur_commandes, concertiste_commandes, encadr_prof_commandes, encadr_parent_commandes, piano_commandes, alto_commandes, flute_commandes, trompette_commandes, harpe_commandes, violon1_commandes, violon2_commandes, violoncelle1_commandes, violoncelle2_commandes FROM ca_decompte_place';
const [results_ca_decompte_place, fields_ca_decompte_place] = await db_connection_promise.execute(sql);
logger.info("Row decompte RECUP INFOS : " + results_ca_decompte_place.length, { numsession: req.session.id, label: filename});
//////////////////////////
// ENVOI MAIL À L'ADHÉRENT
if(retour_stripe === "annule") {mail_objet = 'AFPS - CONCERT UNESCO 2024 - ÉCHEC DU PAIEMENT - ' + identifiant;}
if(retour_stripe === "reussi") {mail_objet = 'AFPS - CONCERT UNESCO 2024 - INSCRIPTION - ' + identifiant;}
if(retour_stripe === "annule") {
mail_html = "<p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'>Cher(e) adhérent(e),<br></p><p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'>Suite à votre inscription au Concert national Unesco 2024 organisé par l'Association Française pour la Pédagogie Suzuki, votre paiement de " + amount_total;
mail_html += "€ est en échec.<br>Vous pouvez contacter l'Association par mail à l'adresse afps.inscription@gmail.com pour effectuer un autre paiement et ainsi valider votre inscription.</p>";
}
if(retour_stripe === "reussi") {
mail_html = "<p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'>Cher(e) adhérent(e),<br></p><p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'>Félicitations ! Vous êtes inscrit au Concert national Unesco 2024 organisé par l'Association Française pour la Pédagogie Suzuki.";
mail_html += "<br>Vous allez recevoir vos billets par mail de la part de la plateforme de Billetterie WEEZEVENT.</p>";
}
logger.info("DON : " + results_nb_commande[0].don, { numsession: req.session.id, label: filename});
console.log("ligne 195");
if (results_nb_commande[0].don > 0) {
mail_html += "<p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'>Nous vous remercions chaleureusement pour votre don. Votre justificatif est joint à ce mail.</p>";
}
mail_html += "<br>";
mail_html += '<p style="color:#E73058;font-size: 13pt; font-family: Arial; text-decoration: none;"><strong>RÉCAPITULATIF</strong></p>';
mail_html += "<p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Identifiant Suzuki : </strong>" + identifiant;
if (results_ca_adherent[0].hebergement_places > 0) {mail_html += "</p><br><p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>HÉBERGEMENT PROPOSÉ : </strong><br> Ville : " + results_ca_adherent[0].hebergement_ville + ", nombre de personnes : " + results_ca_adherent[0].hebergement_places + "</p><br>";}
if (results_ca_concertiste.length > 0) {
mail_html += "<p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong><span style='color: #E73058'>" + results_ca_concertiste.length + "</span> CONCERTISTE(S) :</strong></p>";
mail_html += "<p style='font-size: 9pt; font-family: Arial; font-style: italic; color: #454343; text-decoration: none;'>Les concertistes s'engagent à être présents les 2 journées du 20 et 21 avril 2024.</p>";
for (let i = 0; i<results_ca_concertiste.length; i++) {
mail_html += "<p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'>Nom : " + results_ca_concertiste[i].concertiste_nom + " " + results_ca_concertiste[i].concertiste_prenom + " - " + results_ca_concertiste[i].concertiste_age + " ans,<br>";
mail_html += "instrument : " + results_ca_concertiste[i].concertiste_intrument + " - " + results_ca_concertiste[i].concertiste_cahier + " - " + results_ca_concertiste[i].concertiste_piece + "<br>";
if (results_ca_concertiste[i].concertiste_intrument == "Piano") {mail_html += "<span style='font-size: 9pt; font-family: Arial; font-style: italic; color: #E73058; text-decoration: none;'>Pour le piano linscription doit être validée par le comité.</span><br>"};
mail_html += "professeur : " + results_ca_concertiste[i].concertiste_prof_nom + " - " + results_ca_concertiste[i].concertiste_prof_mail + "</p>";
}
}
if (results_ca_encadrant.length > 0) {
mail_html += "<br><p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong><span style='color: #E73058'>" + results_ca_encadrant.length + "</span> ENCADRANT(S) :</strong></p>";
mail_html += "<p style='font-size: 9pt; font-family: Arial; font-style: italic; color: #454343; text-decoration: none;'>Les encadrants s'engagent à être présents les 2 journées du 20 et 21 avril 2024.</p>";
for (let i = 0; i<results_ca_encadrant.length; i++) {
mail_html += "<p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'>Nom : " + results_ca_encadrant[i].encadrant_nom + " " + results_ca_encadrant[i].encadrant_prenom + " - " + results_ca_encadrant[i].encadrant_type + "<br>";
mail_html += "coordonnées : " + results_ca_encadrant[i].encadrant_telephone_mobile + " - " + results_ca_encadrant[i].encadrant_mail + "<br>";
if (results_ca_encadrant[i].encadrant__prof_instrument) {mail_html += "instrument : " + results_ca_encadrant[i].encadrant__prof_instrument};
mail_html += "</p>";
}
}
if (results_nb_commande[0].commande_nb_spectateur > 0) {
mail_html += "<br><p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong><span style='color: #E73058'>" + results_nb_commande[0].commande_nb_spectateur + "</span> SPECTATEUR(S) RÉSERVÉ(S) :</strong><br>"
mail_html += "<span style='font-size: 9pt; font-family: Arial; font-style: italic; color: #454343; text-decoration: none;'>Les billets spectateurs sont valables pour la date du 21 avril 2024.</span></p>";
}
mail_html += "<br><p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>TARIFS :</strong><br> ";
if (results_ca_concertiste.length > 0) {mail_html += "- concertiste(s) : " + results_nb_commande[0].commande_cout_concertiste + "€<br>"};
if (results_nb_commande[0].commande_nb_spectateur > 0) {mail_html += "- spectateur(s) : " + results_nb_commande[0].commande_cout_spectateur + "€"};
if (results_nb_commande[0].don > 0) {mail_html += "<br><br>- Votre don : " + results_nb_commande[0].don + "€"};
mail_html += "<br><br>Montant total : " + results_nb_commande[0].montant_total + "€";
mail_html += '<br><br><p style="font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;">Association Française pour la pédagogie Suzuki<br>Marie Rossot - Pôle organisation du Concert national Unesco 2024</p><p><img src="cid:logo" alt="Logo" width="200" height="73"/></p>';
// ajout du logo
let dossier_image = path.resolve(__dirname, "../../public/images/logos/")+"/logosuzukigris.png";
if (results_nb_commande[0].don > 0 && retour_stripe === "reussi") {
//////////////////////////////////////////////////////////////////////////////
// ADOBE PDF : JUSTIFICATIF DE DON
// VARIABLES POUR LE PDF
let OUTPUT;
let INPUT;
let now_pdf = moment().format("YYYY-MM-DDTHH-mm-ss");
var adresse = results_adherent[0].adherent_adresse_rue;
adresse += " ";
adresse += results_adherent[0].adherent_adresse_codepostal;
adresse += " ";
adresse += results_adherent[0].adherent_adresse_ville;
OUTPUT = path.resolve(__dirname, "../../pdf/concert_annuel/don/2425/")+"/"+identifiant+"_don_"+now_pdf+".pdf";
INPUT = path.resolve(__dirname, "../../pdf/template/don_justificatif.docx");
JSON_INPUT =
{
"date": today,
"identifiant": identifiant,
"mode_paiement": "carte bancaire",
"adherent_nom": results_ca_adherent[0].adherent_nom,
"adherent_prenom": results_ca_adherent[0].adherent_prenom,
"adresse": adresse,
"adherent_paiement_montant_don": results_nb_commande[0].don
};
await pdf.pdfgo(OUTPUT, INPUT, JSON_INPUT);
// VARIABLE POUR LE MAIL
var attachment_name = identifiant + "_don_" + now_pdf + ".pdf";
var mailOptions = {
from: 'afps.inscription@gmail.com',
to: customer_email,
subject: mail_objet,
html: mail_html,
attachments: [
{
filename: 'logosuzukigris.png',
path: dossier_image,
cid: 'logo'
},
{
filename: attachment_name,
path: OUTPUT
},
]
};
} else {
// SANS JUSTIFICATIF DE DON
// VARIABLE POUR LE MAIL
var mailOptions = {
from: 'afps.inscription@gmail.com',
to: customer_email,
subject: mail_objet,
html: mail_html,
attachments: [{
filename: 'logosuzukigris.png',
path: dossier_image,
cid: 'logo'
}]
};
}
envoie_mail.envoie_mail(mailOptions);
/////////////////////////////////////
// ENVOI MAIL AU PROF SI PAIEMENT REUSSI & SI CONCERTISTES
if(retour_stripe === "reussi" && results_ca_concertiste.length > 0) {
logger.info("ENVOIE MAILS AU PROF", { numsession: req.session.id, label: filename});
for (let i = 0; i<results_ca_concertiste.length; i++) {
var mail_objet = 'AFPS - CONCERT UNESCO 2024 - VOTRE ÉLÈVE CONCERTISTE - ' + results_ca_concertiste[i].concertiste_nom + ' ' + results_ca_concertiste[i].concertiste_prenom;
var mail_html = "<p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'>Cher(e) professeur(e),<br></p><p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'>Votre élève est inscrit au Concert national Unesco 2024 de lAssociation Française pour la Pédagogie Suzuki qui aura lieu en avril 2024 à l'UNESCO de Paris.</p>";
mail_html += '<p style="font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;">Identifiant adhérent de l\'élève : ' + identifiant + '<br>';
mail_html += 'Nom de l\'élève : ' + results_ca_concertiste[i].concertiste_nom + ' ' + results_ca_concertiste[i].concertiste_prenom + '<br>';
mail_html += 'Âge de l\'élève : ' + results_ca_concertiste[i].concertiste_age + '<br>';
mail_html += 'Instrument de l\'élève : ' + results_ca_concertiste[i].concertiste_intrument + '<br>';
mail_html += 'Niveau (cahier) : ' + results_ca_concertiste[i].concertiste_cahier + '<br>';
mail_html += 'Pièce : ' + results_ca_concertiste[i].concertiste_piece + '</p>';
mail_html += "<br><p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'>Association Française pour la Pédagogie Suzuki<br>Marie Rossot - Pôle organisation du Concert national Unesco 2024</p><img src='cid:logo' alt='Logo' width='200' height='73'/>";
var mailOptions = {
from: 'afps.inscription@gmail.com',
to: results_ca_concertiste[i].concertiste_prof_mail,
subject: mail_objet,
html: mail_html,
attachments: [{
filename: 'logosuzukigris.png',
path: dossier_image,
cid: 'logo'
}]
};
envoie_mail.envoie_mail(mailOptions);
}
}
/////////////////////////////////////
// ENVOI BILLETS VERS WEEZEVENT
/////////////////////////////////////
if(retour_stripe === "reussi" && (results_ca_concertiste.length > 0 || results_ca_encadrant.length > 0 || results_nb_commande[0].commande_nb_spectateur > 0)) {
logger.info("ENVOIE BILLET WEEZEVENT", { numsession: req.session.id, label: filename});
// WEEZEVENT test compte de Julie
// EVENT
// id: 1012995, name: 'ADUZUKI UNESCO Concertistes Encadrants',
// id: 1013004, name: 'ADUZUKI UNESCO Spectateur',
// id: 1042983, name: 'ADUZUKI UNESCO Encadrants',
// id billet: '3742964', name: 'Spectateur',
// id billet : '3863469', name: 'Concertiste'
// id billet: '3863496', name: 'Encadrant professeur',
// id billet: '3863495', name: 'Encadrant parent',
// WEEZEVENT Compte AFPS
// EVENT
// id: 1043198 ADUZUKI UNESCO Encadrants
// id: 1043199 ADUZUKI UNESCO Élèves musiciens
// id: 1043050 ADUZUKI UNESCO Spectateur
// id billet: '3874933', name: 'Spectateur',
// id billet : '3875316', name: 'Élève musicien'
// id billet: '3875315', name: 'Encadrant professeur',
// id billet: '3875313', name: 'Encadrant parent',
let weez_id_evenement_concertiste = process.env.weezevent_id_event_concertiste;
let weez_id_evenement_encadrant = process.env.weezevent_id_event_encacrant;
let weez_id_evenement_spectateur = process.env.weezevent_id_event_spect;
let weez_id_billet_concertiste = process.env.weez_id_billet_concertiste;
let weez_id_billet_spectateur = process.env.weez_id_billet_spectateur;
let weez_id_billet_encadrant_parent = process.env.weez_id_billet_encadrant_parent;
let weez_id_billet_encadrant_prof = process.env.weez_id_billet_encadrant_prof;
//let weez_id_evenement_concertiste = "1043199";
//let weez_id_evenement_encadrant = "1043198";
//let weez_id_evenement_spectateur = "1043050";
//
//
//let weez_id_billet_concertiste = "3875316";
//let weez_id_billet_spectateur = "3874933";
//let weez_id_billet_encadrant_parent = "3875313";
//let weez_id_billet_encadrant_prof = "3875315";
let weez_id_billet;
let weez_email = customer_email;
//let weez_nom = results_ca_adherent[0].adherent_nom;
let participants = {
"participants": [],
"return_ticket_url": true
};
let weez_prenom;
let TICKETING_API_BASE_URL = "https://api.weezevent.com/v3/participants?";
let url = TICKETING_API_BASE_URL;
body = '&api_key=' + process.env.weezevent_API_KEY;
body += '&access_token=' + process.env.weezevent_TOKEN;
async function envoi_weez_api(url,body) {
logger.info("url = " + url , { numsession: req.session.id, label: filename});
logger.info("body = " + body , { numsession: req.session.id, label: filename});
let headers = {'content-type':'application/x-www-form-urlencoded;charset=utf-8'};
let premise_post_token = await fetch(url, {
method: 'POST',
headers: headers,
body: body
});
let response_post_token = await premise_post_token.json();
console.log("response_post_token = ", response_post_token);
logger.info("response_post_token = " + response_post_token , { numsession: req.session.id, label: filename});
}
// LISTING DES PARTICIPANTS
// BILLETS SPECTATEUR
if (results_nb_commande[0].commande_nb_spectateur > 0) {
logger.info("results_nb_commande[0].commande_nb_spectateur = " + results_nb_commande[0].commande_nb_spectateur , { numsession: req.session.id, label: filename});
for (let i = 0; i<results_nb_commande[0].commande_nb_spectateur; i++) {
weez_prenom = "Spectateur "+(i+1);
participants.participants.push({ "id_evenement": weez_id_evenement_spectateur, "id_billet": weez_id_billet_spectateur, "email": weez_email, "nom": identifiant, "prenom": weez_prenom, "form": {"adresse": identifiant},"notify": true });
}
}
// BILLETS ENCADRANT
if (results_ca_encadrant.length > 0) {
logger.info("results_ca_encadrant.length = " + results_ca_encadrant.length , { numsession: req.session.id, label: filename});
for (let i = 0; i<results_ca_encadrant.length; i++) {
if (results_ca_encadrant[i].encadrant_type === 'Parent') {weez_id_billet = weez_id_billet_encadrant_parent}
if (results_ca_encadrant[i].encadrant_type === 'Professeur') {weez_id_billet = weez_id_billet_encadrant_prof}
participants.participants.push({ "id_evenement": weez_id_evenement_encadrant, "id_billet": weez_id_billet, "email": weez_email, "nom": results_ca_encadrant[i].encadrant_nom, "prenom": results_ca_encadrant[i].encadrant_prenom, "form": {"adresse": identifiant}, "notify": true });
}
}
// BILLETS CONCERTISTE
if (results_ca_concertiste.length > 0) {
logger.info("results_ca_concertiste.length = " + results_ca_concertiste.length , { numsession: req.session.id, label: filename});
for (let i = 0; i<results_ca_concertiste.length; i++) {
participants.participants.push({ "id_evenement": weez_id_evenement_concertiste, "id_billet": weez_id_billet_concertiste, "email": weez_email, "nom": results_ca_concertiste[i].concertiste_nom, "prenom": results_ca_concertiste[i].concertiste_prenom, "form": {"adresse": identifiant}, "notify": true });
}
}
// ENVOIE DE TOUS LES BILLETS PAR 1 REQUÈTE API
body += '&data=' + JSON.stringify(participants);
envoi_weez_api(url,body);
}
/////////////////////////////////////
// COPIE VERS GOOGLE SHEET
/////////////////////////////////////
try {
await GS_concert.useServiceAccountAuth(GS_creds);
await GS_concert.loadInfo();
const GS_concert_adherent = GS_concert.sheetsByTitle['adherents'];
const GS_concert_hebergements = GS_concert.sheetsByTitle['hebergements'];
const GS_concert_spectateurs = GS_concert.sheetsByTitle['spectateurs'];
const GS_concert_concertistes = GS_concert.sheetsByTitle['concertistes'];
const GS_concert_encadrants = GS_concert.sheetsByTitle['encadrants'];
const GS_concert_nombre_places = GS_concert.sheetsByTitle['nombre_places'];
const GS_concert_finance = GS_concert.sheetsByTitle['finance'];
const GS_concert_inscription_en_attente = GS_concert.sheetsByTitle['inscription_en_attente'];
montant_total_concert = results_nb_commande[0].commande_cout_concertiste + results_nb_commande[0].commande_cout_spectateur;
// CAS PAIEMENT OK
if(retour_stripe === "reussi") {
const ajout_gs_adherent = await GS_concert_adherent.addRows (
[
{
saison: results_ca_adherent[0].saison,
identifiant: identifiant,
association_suzuki: results_ca_adherent[0].association_suzuki,
date_inscription: moment(results_ca_adherent[0].date_inscription).format("YYYY-MM-DD HH:mm:ss"),
date_inscription_maj: moment(results_ca_adherent[0].date_maj).format("YYYY-MM-DD HH:mm:ss"),
paiement: "paye",
adherent_nom: results_ca_adherent[0].adherent_nom,
adherent_prenom: results_ca_adherent[0].adherent_prenom,
adherent_telephone_mobile: "'" + results_ca_adherent[0].adherent_telephone_mobile,
adherent_mail: results_ca_adherent[0].adherent_mail,
nb_spectateur: results_nb_commande[0].commande_nb_spectateur,
nb_concertiste: results_nb_commande[0].commande_nb_concertiste,
nb_encadr_prof: results_nb_commande[0].commande_nb_encadr_prof,
nb_encadr_par: results_nb_commande[0].commande_nb_encadr_par,
commentaire: results_ca_adherent[0].comment,
date_maj_gsheet: now
}
]
);
if (results_ca_adherent[0].hebergement_places > 0){
const ajout_gs_hebergements = await GS_concert_hebergements.addRows (
[
{
saison: results_ca_adherent[0].saison,
identifiant: identifiant,
hebergement_ville: results_ca_adherent[0].hebergement_ville,
hebergement_places: results_ca_adherent[0].hebergement_places,
date_maj_gsheet: now
}
]
);
}
if (results_nb_commande[0].commande_nb_spectateur > 0){
const ajout_gs_spectateurs = await GS_concert_spectateurs.addRows (
[
{
saison: results_ca_adherent[0].saison,
identifiant: identifiant,
commande_nb_spectateur: results_nb_commande[0].commande_nb_spectateur,
date_maj_gsheet: now
}
]
);
}
if (results_ca_concertiste.length > 0) {
let ajout_gs_concertistes = [];
for (let i = 0; i < results_ca_concertiste.length; i++) {
ajout_gs_concertistes.push({
saison: results_ca_concertiste[i].saison,
identifiant: identifiant,
concertiste_nom: results_ca_concertiste[i].concertiste_nom,
concertiste_prenom: results_ca_concertiste[i].concertiste_prenom,
adherent_telephone_mobile: "'" + results_ca_adherent[0].adherent_telephone_mobile,
adherent_mail: results_ca_adherent[0].adherent_mail,
concertiste_age: results_ca_concertiste[i].concertiste_age,
concertiste_intrument: results_ca_concertiste[i].concertiste_intrument,
concertiste_cahier: results_ca_concertiste[i].concertiste_cahier,
concertiste_piece: results_ca_concertiste[i].concertiste_piece,
concertiste_prof_nom: results_ca_concertiste[i].concertiste_prof_nom,
concertiste_prof_mail: results_ca_concertiste[i].concertiste_prof_mail,
date_maj_gsheet: now
});
}
await GS_concert_concertistes.addRows (ajout_gs_concertistes);
}
if (results_ca_encadrant.length > 0) {
let ajout_gs_encadrants = [];
for (let i = 0; i<results_ca_encadrant.length; i++) {
ajout_gs_encadrants.push({
saison: results_ca_encadrant[i].saison,
identifiant: identifiant,
encadrant_type: results_ca_encadrant[i].encadrant_type,
encadrant_nom: results_ca_encadrant[i].encadrant_nom,
encadrant_prenom: results_ca_encadrant[i].encadrant_prenom,
encadrant_telephone_mobile: "'" + results_ca_encadrant[i].encadrant_telephone_mobile,
encadrant_mail: results_ca_encadrant[i].encadrant_mail,
encadrant_prof_instrument: results_ca_encadrant[i].encadrant__prof_instrument,
date_maj_gsheet: now
})
}
await GS_concert_encadrants.addRows (ajout_gs_encadrants);
}
// ONGLET nombre_places
await GS_concert_nombre_places.loadCells('A1:O2');
GS_concert_nombre_places.getCellByA1('B2').value = results_ca_decompte_place[0].spectateur_commandes;
GS_concert_nombre_places.getCellByA1('C2').value = results_ca_decompte_place[0].encadr_prof_commandes;
GS_concert_nombre_places.getCellByA1('D2').value = results_ca_decompte_place[0].encadr_parent_commandes;
GS_concert_nombre_places.getCellByA1('E2').value = results_ca_decompte_place[0].concertiste_commandes;
GS_concert_nombre_places.getCellByA1('F2').value = results_ca_decompte_place[0].piano_commandes;
GS_concert_nombre_places.getCellByA1('G2').value = results_ca_decompte_place[0].alto_commandes;
GS_concert_nombre_places.getCellByA1('H2').value = results_ca_decompte_place[0].flute_commandes;
GS_concert_nombre_places.getCellByA1('I2').value = results_ca_decompte_place[0].trompette_commandes;
GS_concert_nombre_places.getCellByA1('J2').value = results_ca_decompte_place[0].harpe_commandes;
GS_concert_nombre_places.getCellByA1('K2').value = results_ca_decompte_place[0].violon1_commandes;
GS_concert_nombre_places.getCellByA1('L2').value = results_ca_decompte_place[0].violon2_commandes;
GS_concert_nombre_places.getCellByA1('M2').value = results_ca_decompte_place[0].violoncelle1_commandes;
GS_concert_nombre_places.getCellByA1('N2').value = results_ca_decompte_place[0].violoncelle2_commandes;
GS_concert_nombre_places.getCellByA1('O2').value = now;
await GS_concert_nombre_places.saveUpdatedCells();
const ajout_gs_finance = await GS_concert_finance.addRows (
[
{
saison: results_ca_adherent[0].saison,
identifiant: identifiant,
adherent_nom: results_ca_adherent[0].adherent_nom,
adherent_prenom: results_ca_adherent[0].adherent_prenom,
adherent_mail: results_ca_adherent[0].adherent_mail,
paiement: "paye",
stripe_retour: results_ca_adherent[0].stripe_retour,
montant_concertiste: results_nb_commande[0].commande_cout_concertiste,
montant_spectateur: results_nb_commande[0].commande_cout_spectateur,
montant_total_concert: montant_total_concert,
montant_don: results_nb_commande[0].don,
montant_total: results_nb_commande[0].montant_total,
date_maj_gsheet: now
}
]
);
}
if(retour_stripe === "annule") {
const ajout_gs_inscription_en_attente = await GS_concert_inscription_en_attente.addRows (
[
{
saison: results_ca_adherent[0].saison,
identifiant: identifiant,
association_suzuki: results_ca_adherent[0].association_suzuki,
date_inscription: moment(results_ca_adherent[0].date_inscription).format("YYYY-MM-DD HH:mm:ss"),
adherent_nom: results_ca_adherent[0].adherent_nom,
adherent_prenom: results_ca_adherent[0].adherent_prenom,
adherent_telephone_mobile: "'" + results_ca_adherent[0].adherent_telephone_mobile,
adherent_mail: results_ca_adherent[0].adherent_mail,
nb_spectateur: results_nb_commande[0].commande_nb_spectateur,
nb_concertiste: results_nb_commande[0].commande_nb_concertiste,
nb_encadr_prof: results_nb_commande[0].commande_nb_encadr_prof,
nb_encadr_par: results_nb_commande[0].commande_nb_encadr_par,
paiement: "impaye",
stripe_retour: results_ca_adherent[0].stripe_retour,
montant_concertiste: results_nb_commande[0].commande_cout_concertiste,
montant_spectateur: results_nb_commande[0].commande_cout_spectateur,
montant_total_concert: montant_total_concert,
montant_don: results_nb_commande[0].don,
montant_total: results_nb_commande[0].montant_total,
commentaire: results_ca_adherent[0].comment,
date_maj_gsheet: now
}
]
);
// ONGLET nombre_places
await GS_concert_nombre_places.loadCells('A1:O2');
GS_concert_nombre_places.getCellByA1('B2').value = results_ca_decompte_place[0].spectateur_commandes;
GS_concert_nombre_places.getCellByA1('C2').value = results_ca_decompte_place[0].encadr_prof_commandes;
GS_concert_nombre_places.getCellByA1('D2').value = results_ca_decompte_place[0].encadr_parent_commandes;
GS_concert_nombre_places.getCellByA1('E2').value = results_ca_decompte_place[0].concertiste_commandes;
GS_concert_nombre_places.getCellByA1('F2').value = results_ca_decompte_place[0].piano_commandes;
GS_concert_nombre_places.getCellByA1('G2').value = results_ca_decompte_place[0].alto_commandes;
GS_concert_nombre_places.getCellByA1('H2').value = results_ca_decompte_place[0].flute_commandes;
GS_concert_nombre_places.getCellByA1('I2').value = results_ca_decompte_place[0].trompette_commandes;
GS_concert_nombre_places.getCellByA1('J2').value = results_ca_decompte_place[0].harpe_commandes;
GS_concert_nombre_places.getCellByA1('K2').value = results_ca_decompte_place[0].violon1_commandes;
GS_concert_nombre_places.getCellByA1('L2').value = results_ca_decompte_place[0].violon2_commandes;
GS_concert_nombre_places.getCellByA1('M2').value = results_ca_decompte_place[0].violoncelle1_commandes;
GS_concert_nombre_places.getCellByA1('N2').value = results_ca_decompte_place[0].violoncelle2_commandes;
GS_concert_nombre_places.getCellByA1('O2').value = now;
await GS_concert_nombre_places.saveUpdatedCells();
}
} catch (error) {
// Echec de connection à la GOOGLE SHEET
logger.error("Il y a un problème avec la connection à Google sheet : " + error, { numsession: req.session.id });
req.session.err_mail_form_adhesion_1 = '"Il y a un problème système, "' + error;
};
/////////////////////////////////////
// REMISE À ZÉRO DE L'AJOUT
if (session_stripe.metadata.ajoutbillet == "oui") {
//Query
sql = 'UPDATE ';
sql += 'ca_ajout';
sql += ' SET ';
sql += 'identifiant = concat(identifiant, ID)';
sql += ' WHERE identifiant = "' + identifiant + '"';
const [results, fields] = await db_connection_promise.execute(sql);
logger.info("Row ca_adherent UPDATE STRIPE: " + results.changedRows, { numsession: req.session.id, label: filename});
//ca_concertiste
sql = 'UPDATE ';
sql += 'ca_concertiste';
sql += ' SET ';
sql += 'ajout = null';
sql += ' WHERE identifiant = "' + identifiant + '" AND ajout IS NOT NULL';
const [results_ca_concertiste, fields_ca_concertiste] = await db_connection_promise.execute(sql);
//ca_encadrant
sql = 'UPDATE ';
sql += 'ca_encadrant';
sql += ' SET ';
sql += 'ajout = null';
sql += ' WHERE identifiant = "' + identifiant + '" AND ajout IS NOT NULL';
const [results_ca_encadrant, fields_ca_encadrant] = await db_connection_promise.execute(sql);
// AJOUT DU NOMBRE DE PLACES SPECTATEUR ET CONCERTISTES COMMANDEES DANS LE COMPTEUR DE L'ADHERENT pour qu'ils ne puissent pas dépasser le quota
if (retour_stripe === "reussi") {
//Query
sql = 'UPDATE ';
sql += 'ca_adherent';
sql += ' SET ';
sql += 'commande_nb_spectateur = commande_nb_spectateur + ' + results_nb_commande[0].commande_nb_spectateur + ', ';
sql += 'commande_nb_concertiste = commande_nb_concertiste + ' + results_nb_commande[0].commande_nb_concertiste;
sql += ' WHERE identifiant = "' + identifiant + '"';
const [results, fields] = await db_connection_promise.execute(sql);
logger.info("Row ca_adherent UPDATE STRIPE: " + results.changedRows, { numsession: req.session.id, label: filename});
}
}
/////////////////////////////////////
// AFFICHAGE DE LA PAGE
res.locals.identifiant = identifiant;
res.locals.today = today;
res.locals.amount_total = amount_total;
if(retour_stripe === "reussi"){
res.render('concert/page_templates/paiement_reussi');
}
if(retour_stripe === "annule"){
res.render('concert/page_templates/paiement_annule');
}
} else {
req.session.err_mail_form_adhesion_1 = "Votre session est terminée, veuiller redémarrer votre navigateur.";
affiche_page_identifier();
}
} catch (error) {
// Echec de connection à la BD
logger.error("Il y a un problème système : " + error, { numsession: req.session.id });
req.session.err_mail_form_adhesion_1 = '"Il y a un problème système, "' + error;
//await db_connection_promise.end();
affiche_page_identifier();
}
}
}
/////////////////////////////////////////////////
// EXPORT DES MODULES POUR QU'ILS PUISSENT LUS PAR LES AUTRES FICHIERS JS
/////////////////////////////////////////////////
module.exports = {
retour_bank
}

View File

@@ -0,0 +1,123 @@
/////////////////////////////////////////////////
// FICHIER DE TEST
/////////////////////////////////////////////////
/////////////////////////////////////////////////
// LOGGING
/////////////////////////////////////////////////
const logger = require("../../public/js/app/logger_concert");
/////////////////////////////////////////////////
// APPELS DES MODULES
/////////////////////////////////////////////////
const path = require("path");
const fs = require("fs");
// CALCUL DE DATE
const moment = require('moment');
// ENVOIE MAIL GOOGLE MAIL
const nodemailer = require('nodemailer');
// CONNECTION BASE DE DONNÉES
const mysql = require('mysql2');
const mysql_promise = require('mysql2/promise');
// ADOBE PDF
const PDFServicesSdk = require('@adobe/pdfservices-node-sdk');
// FETCH (utile pour nodejs version < 18)
const fetch = require("node-fetch");
/////////////////////////////////////////////////
// APPELS DES FONCTIONS
/////////////////////////////////////////////////
const sleep = require("./../../modules/sleep");
////////////////////////////////////////////////////
// FILE NAME
////////////////////////////////////////////////////
const filename = path.parse(__filename).base;
////////////////////////////////////////////////////
// CONNECTION DB
////////////////////////////////////////////////////
/////////////////////////////////////////////////
// ENVOIE DES PARTICIPANTS A WEEZEVENT
/////////////////////////////////////////////////
const weez_envoie = async function(req, res) {
logger.info("======================================", { label: filename });
logger.info("======== FUNCTION weez_envoie ==========", { label: filename });
logger.info("======================================", { label: filename });
/////////////////////////////////////////////////
// CONNEXION WEEZEVENT
/////////////////////////////////////////////////
let participants = {
"participants": [
{
"id_evenement": 1012995,
"id_billet": 3742939,
"email": "julie@parisweb.art",
"nom": "nomjuju",
"prenom": "prenomjuju",
"notify": true
}
],
"return_ticket_url": true
};
// envoyer participant
//let TICKETING_API_BASE_URL = "https://api.weezevent.com/v3/participants?";
//let url = TICKETING_API_BASE_URL;
body = '&api_key=' + process.env.weezevent_API_KEY;
body += '&access_token=' + process.env.weezevent_TOKEN;
body += '&data=' + JSON.stringify(participants);
//logger.info("url = " + url , { numsession: req.session.id, label: filename});
let headers = {'content-type':'application/x-www-form-urlencoded;charset=utf-8'};
//let premise_post_token = await fetch(url, {
// method: 'POST',
// headers: headers,
// body: body
//});
//let response_post_token = await premise_post_token.json();
//console.log("response_post_token = ", response_post_token);
//url = 'https://api.weezevent.com/events?api_key=' + process.env.weezevent_API_KEY + '&access_token=' + process.env.weezevent_TOKEN;
url = 'https://api.weezevent.com/tickets?api_key=' + process.env.weezevent_API_KEY + '&access_token=' + process.env.weezevent_TOKEN + '&id_event[]=1043050';
//url = 'https://api.weezevent.com/participant/list?api_key=' + process.env.weezevent_API_KEY + '&access_token=' + process.env.weezevent_TOKEN + '&id_event[]=1012995';
//url = 'https://api.weezevent.com/participant/286254615/answers?api_key=' + process.env.weezevent_API_KEY + '&access_token=' + process.env.weezevent_TOKEN;
console.log("url = ", url);
let premise_post_ticket = await fetch(url, {
method: 'GET',
headers: headers
});
let response_post_ticket = await premise_post_ticket.json();
console.log("response_post_ticket = ", response_post_ticket);
//console.log("response_post_ticket = ", response_post_ticket.participants[10].owner);
console.log("response_post_ticket = ", response_post_ticket.events[0].tickets);
req.session.message2 = "on est dans fonction weez_envoie ";
res.redirect('/concert/maj_googlesheet');
}
/////////////////////////////////////////////////
// EXPORT DES MODULES POUR QU'ILS PUISSENT LUS PAR LES AUTRES FICHIERS JS
/////////////////////////////////////////////////
module.exports = {
weez_envoie
}

View File

@@ -0,0 +1,93 @@
/////////////////////////////////////////////////
// FICHIER DE TEST
/////////////////////////////////////////////////
/////////////////////////////////////////////////
// LOGGING
/////////////////////////////////////////////////
const logger = require("../../public/js/app/logger_concert");
/////////////////////////////////////////////////
// APPELS DES MODULES
/////////////////////////////////////////////////
const path = require("path");
const fs = require("fs");
// CALCUL DE DATE
const moment = require('moment');
// ENVOIE MAIL GOOGLE MAIL
const nodemailer = require('nodemailer');
// CONNECTION BASE DE DONNÉES
const mysql = require('mysql2');
const mysql_promise = require('mysql2/promise');
// ADOBE PDF
const PDFServicesSdk = require('@adobe/pdfservices-node-sdk');
// FETCH (utile pour nodejs version < 18)
const fetch = require("node-fetch");
/////////////////////////////////////////////////
// APPELS DES FONCTIONS
/////////////////////////////////////////////////
const sleep = require("./../../modules/sleep");
////////////////////////////////////////////////////
// FILE NAME
////////////////////////////////////////////////////
const filename = path.parse(__filename).base;
////////////////////////////////////////////////////
// CONNECTION DB
////////////////////////////////////////////////////
/////////////////////////////////////////////////
// ENVOIE DES PARTICIPANTS A WEEZEVENT
/////////////////////////////////////////////////
const weez_envoie = async function(req, res) {
logger.info("======================================", { label: filename });
logger.info("======== FUNCTION weez_envoie ==========", { label: filename });
logger.info("======================================", { label: filename });
/////////////////////////////////////////////////
// CONNEXION WEEZEVENT
/////////////////////////////////////////////////
// RÉCUPÉRER LE TOKEN
let TICKETING_API_BASE_URL = "https://api.weezevent.com/";
let url = TICKETING_API_BASE_URL;
url += 'auth/access_token';
url += '?username=' + process.env.weezevent_USER;
url += '&password=' + process.env.weezevent_PASSWORD;
url += '&api_key=' + process.env.weezevent_API_KEY;
logger.info("url = " + url , { numsession: req.session.id, label: filename});
let headers = {'content-type':'application/x-www-form-urlencoded;charset=utf-8'};
let premise_post_token = await fetch(url, {
method: 'POST',
headers: headers
});
let response_post_token = await premise_post_token.json();
console.log("response_post_token = ", response_post_token);
let accessToken = response_post_token.accessToken;
logger.info("RÉCUPÉRER LE TOKEN // accessToken = " + accessToken , { numsession: req.session.id, label: filename});
req.session.message2 = "on est dans fonction weez_envoie, accessToken = ", accessToken;
res.redirect('/concert/maj_googlesheet');
}
/////////////////////////////////////////////////
// EXPORT DES MODULES POUR QU'ILS PUISSENT LUS PAR LES AUTRES FICHIERS JS
/////////////////////////////////////////////////
module.exports = {
weez_envoie
}

View File

@@ -0,0 +1,398 @@
/////////////////////////////////////////////////
// APPELS DES MODULES
/////////////////////////////////////////////////
const moment = require('moment');
const ejs = require('ejs');
const nodemailer = require('nodemailer');
const path = require("path");
const stripe = require('stripe')(process.env.STRIPE_PRIVATE_KEY);
const pdf = require("pdf-creator-node");
const fs = require("fs");
const mysql = require('mysql2');
const mysql_promise = require('mysql2/promise');
// Weasyprint
const weasyprint = require("htmltopdf-weasyprint");
/////////////////////////////////////////////////
// APPELS DES MODULES PERSOS
/////////////////////////////////////////////////
// loggings
const logger = require("../public/js/app/logger_wuzuki");
// Envoie mail
const envoie_mail = require("../modules/envoie_mail");
// DB
const { connect_DB_promise } = require('../modules/db/databaseconnect');
const { generateInsertSQL, extractValues } = require('../modules/db/sqlqueries');
/////////////////////////////////////////////////
// APPELS DES FONCTIONS
/////////////////////////////////////////////////
// FAIRE UNE PAUSE
const sleep = require("./../modules/sleep");
////////////////////////////////////////////////////
// FILE NAME
////////////////////////////////////////////////////
const filename = path.parse(__filename).base;
/////////////////////////////////////////////////
// GOOGLE SHEET PARAMETERS
/////////////////////////////////////////////////
const { GoogleSpreadsheet } = require('google-spreadsheet');
const GS_creds = require('../inscriptionsafps-53b60452f63d.json');
const { error } = require("console");
// Initialize the sheet - doc ID is the long id in the sheets URL
const GS_don = new GoogleSpreadsheet(process.env.gsheet_don);
/////////////////////////////////////////////////
// VARIABLES GLOBALES
/////////////////////////////////////////////////
/////////////////////////////////////////////////
// ENREGISTREMENT DES INFORMATIONS SAISIES
// ENVOIE VERS STRIPE POUR PAIEMENT
/////////////////////////////////////////////////
const post_form_don = async function(req, res){
logger.info("======================================");
logger.info("======== FUNCTION post_form_don ==========");
logger.info("======================================");
/////////////////////////////////////////////////
// RÉCUPÉRATION DES DONNÉES DU FORMULAIRE DANS LA SESSION EN COURS et dans la tableau DATA
/////////////////////////////////////////////////
// un tableau : pour récupérer en même temps les informations saisies dans un tableau
let data = [];
// Boucle sur les noms des champs
// ajout des infos dans le tablea
['montant', 'nom', 'prenom', 'adresse_rue', 'adresse_complement', 'adresse_codepostal', 'adresse_ville', 'adresse_pays', 'mail', 'telephone_mobile', 'commentaire'].forEach(field => {
req.session[field] = req.body[field];
data.push({[field] : req.body[field]});
logger.info("#0" + field + " = " + req.body[field], { numsession: req.session.id, label: filename});
});
console.log("data = ", data);
/////////////////////////////////////////////////
// AJOUT DANS LA BASE DE DONNÉES
/////////////////////////////////////////////////
try {
//Connexion
let db_connection_promise = await connect_DB_promise();
// AJOUT DON
if (req.session.montant) {
let table = "don";
// Fusionner les objets du tableau "data" qui contient les infos saisis dans le formulaire en un seul objet pour pouvoir le traiter dans la fonction "generateInsertSQL"
const mergedData = Object.assign({}, ...data);
console.log("mergedData = ", mergedData);
// Appel de la fonction qui génère la requête SQL
const sql = generateInsertSQL(table, mergedData);
console.log("sql = ", sql);
const values = extractValues(mergedData);
console.log("values = ", values);
// lancement de la requête
const [result_sql, fields] = await db_connection_promise.execute(sql, values);
logger.info("#1 result_sql Row ID added : " + result_sql.insertId, { numsession: req.session.id, label: filename});
/////////////////////////////////////////////////
// ENVOIE VERS STRIPE
logger.info("======== ENVOIE VERS STRIPE ==========", { label: filename });
// STRIPE - ETAPE 1 - CREER l'INTENTION DE PAIEMENT
const session_stripe = await stripe.checkout.sessions.create({
metadata: {app: "don", identifiant: result_sql.insertId, montant: req.session.montant, nom: req.session.nom +" "+ req.session.prenom},
customer_email: req.session.mail,
mode: 'payment',
success_url: process.env.STRIPE_DON_SUCCESSURL,
cancel_url: process.env.STRIPE_DON_CANCELURL,
line_items: [{
price_data: {
currency: 'eur',
unit_amount: req.session.montant * 100,
product_data: {
name: 'Don AFPS',
description: 'DON AFPS depuis site AFPS',
},
},
quantity: 1,
}],
success_url: process.env.STRIPE_DON_SUCCESSURL,
cancel_url: process.env.STRIPE_DON_CANCELURL,
});
res.redirect(session_stripe.url)
} else {
// Les informations saisies sont vides
logger.info("Il y a un problème avec la saisie des informations du formulaire", { numsession: req.session.id });
req.session.affiche_err_1 = 'Il y a un problème avec la saisie des informations du formulaire, veuillez recommencer.';
res.redirect('/don');
}
} catch (error) {
// Echec de connection à la BD
logger.error("Il y a un problème avec la connection à la base de données ou Stripe post_form_don : " + error, { numsession: req.session.id });
req.session.affiche_err_1 = '"Il y a un problème système connexion base de données, veuillez recommencer, "' + error;
res.redirect('/don');
}
}
/////////////////////////////////////////////////
// RETOUR STRIPE
/////////////////////////////////////////////////
const don_accompte_reussi = async function(req, res) {
logger.info("======================================");
logger.info("======== FUNCTION don_accompte_reussi ==========");
logger.info("======================================");
//////////////////////////////////////////////////////////////////////////////
// RETOUR STRIPE
let id = req.query.id;
const session_stripe = await stripe.checkout.sessions.retrieve(id);
let customer_email = session_stripe.customer_email;
let payment_status = session_stripe.payment_status;
let amount_total = session_stripe.amount_total/100;
let stripe_customer = session_stripe.customer;
let stripe_payment_intent = session_stripe.payment_intent;
let payment_method_types = session_stripe.payment_method_types;
let stripe_status = session_stripe.status;
console.log("payment_status = ", payment_status);
console.log("stripe_customer = ", stripe_customer);
console.log("stripe_payment_intent = ", stripe_payment_intent);
console.log("payment_method_types = ", payment_method_types);
console.log("stripe_status = ", stripe_status);
//////////////////////////////////////////////////////////////////////////////
// PRÉPARATION PAGE PAIEMENT RÉUSSI
moment.locale('fr');
let now = moment().format("YYYY-MM-DD HH:mm:ss");
res.locals.today = now;
res.locals.montant = amount_total;
res.locals.mail = customer_email;
//////////////////////////////////////////////////////////////////////////////
// AFFICHAGE PAGE PAIEMENT RÉUSSI
res.render('don/page_templates/don_paiement_reussi.ejs');
}
/////////////////////////////////////////////////
// RETOUR STRIPE
/////////////////////////////////////////////////
const don_accompte_annule = async function(req, res) {
logger.info("======================================");
logger.info("======== FUNCTION don_accompte_annule ==========");
logger.info("======================================");
//////////////////////////////////////////////////////////////////////////////
// RETOUR STRIPE
let id = req.query.id;
const session_stripe = await stripe.checkout.sessions.retrieve(id);
let customer_email = session_stripe.customer_email;
let payment_status = session_stripe.payment_status;
let amount_total = session_stripe.amount_total/100;
let stripe_customer = session_stripe.customer;
let stripe_payment_intent = session_stripe.payment_intent;
let payment_method_types = session_stripe.payment_method_types;
let stripe_status = session_stripe.status;
console.log("payment_status = ", payment_status);
console.log("stripe_customer = ", stripe_customer);
console.log("stripe_payment_intent = ", stripe_payment_intent);
console.log("payment_method_types = ", payment_method_types);
console.log("stripe_status = ", stripe_status);
//////////////////////////////////////////////////////////////////////////////
// PRÉPARATION PAGE PAIEMENT RÉUSSI
moment.locale('fr');
let now = moment().format("YYYY-MM-DD HH:mm:ss");
res.locals.today = now;
res.locals.montant = amount_total;
res.locals.mail = customer_email;
//////////////////////////////////////////////////////////////////////////////
// AFFICHAGE PAGE PAIEMENT ANNULÉE
res.render('don/page_templates/don_paiement_annule.ejs');
}
/////////////////////////////////////////////////
// WEBHOOK STRIPE
// BD STATUS PAIEMENT
// ENVOIE PDF JUSTIFICATIF PAR MAIL
// AJOUT DANS LA GOOGLE SHEET
/////////////////////////////////////////////////
async function wh_stripe_don(req, res, event) {
logger.info("======================================");
logger.info("======== FUNCTION wh_stripe_don ==========");
logger.info("======================================");
moment.locale('fr');
let now = moment().format("DD/MM/YYYY");
let dateheure = moment().format("YYYY-MM-DDTHH-mm");
try {
/////////////////////////////////////////////////
// MODIFICATION BD STATUS PAYMENT
//Connexion DB
let db_connection_promise = await connect_DB_promise();
// AJOUT STATUS PAIEMENT
let table = "don";
let sql = 'UPDATE ';
sql += table;
sql += ' SET ';
sql += 'stripe_retour = "' + event.data.object.id + '", ';
sql += 'statut_paiement = "' + event.data.object.payment_status + '" ';
sql += ' WHERE id = ' + event.data.object.metadata.identifiant;
logger.info("#2 sql : " + sql, { numsession: req.session.id, label: filename});
// lancement de la requête
const [result_sql, fields] = await db_connection_promise.execute(sql);
logger.info("#2 result_sql Row ID changed : " + result_sql.changedRows, { numsession: req.session.id, label: filename});
/////////////////////////////////////////////////
// SI PAIEMENT RÉUSSI
if (event.data.object.payment_status === "paid") {
/////////////////////////////////////////////////
// RÉCUPÉRATION DES INFOS DE LA BASE DE DONNÉES
let sql_select = 'SELECT * FROM ';
sql_select += table;
sql_select += ' WHERE id = ' + event.data.object.metadata.identifiant;
logger.info("#3 sql_select : " + sql_select, { numsession: req.session.id, label: filename});
// lancement de la requête
const [result_sql_select, fields_select] = await db_connection_promise.execute(sql_select);
logger.info("REQUETE SQL - result_sql_select = " + result_sql_select.length, { numsession: req.session.id, label: filename});
logger.info("#3 result_sql_select nom : " + result_sql_select[0].nom, { numsession: req.session.id, label: filename});
/////////////////////////////////////////////////
// PDF JUSTIFICATIF DE DON
const data = {
nom: result_sql_select[0].nom + ' ' + result_sql_select[0].prenom,
rue: result_sql_select[0].adresse_rue,
complement: result_sql_select[0].adresse_complement,
ville: result_sql_select[0].adresse_codepostal + ' ' + result_sql_select[0].adresse_ville,
pays: result_sql_select[0].adresse_pays,
montant: result_sql_select[0].montant,
date: now
};
const htmlContent = await ejs.renderFile('./pdf/template/don_wp.html', data);
const buffer = await weasyprint(htmlContent);
const pdfOutputPath = path.join(__dirname, `../pdf/don/don_${result_sql_select[0].nom}_${dateheure}.pdf`);
fs.writeFileSync(pdfOutputPath, buffer);
logger.info("PDF CREATED", { numsession: req.session.id, label: filename});
/////////////////////////////////////////////////
// ENVOIE MAIL CONFIRM + JUSTIF
var attachment_name = `${result_sql_select[0].nom}_justificatif_don_AFPS_${dateheure}.pdf`;
var mail_objet = `ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - VOTRE DON - ${result_sql_select[0].nom}`;
var mail_html = `<p>Bonjour,</p><br><p>Nous vous remercions chaleureusement pour votre don de ${result_sql_select[0].montant}€ à l'Association Française pour le Pédagogie Suzuki.</p><br><p>Veuillez trouver le justificatif en pièce jointe.</p><br><p>Association Française pour la pédagogie Suzuki<br>Chez Anne PAGES<br>30 rue des Tattes<br>74500 PUBLIER</p>`;
var mailOptions = {
from: 'afps.inscription@gmail.com',
to: result_sql_select[0].mail,
subject: mail_objet,
html: mail_html,
attachments: [{
filename: attachment_name,
path: pdfOutputPath
}],
};
envoie_mail.envoie_mail(mailOptions);
/////////////////////////////////////////////////
// AJOUT GOOGLE SHEET
await GS_don.useServiceAccountAuth(GS_creds);
await GS_don.loadInfo();
let GS_sheet_don = GS_don.sheetsByTitle['dons'];
await GS_sheet_don.addRows (
[
{
id: result_sql_select[0].id,
date: result_sql_select[0].date_auto,
montant: result_sql_select[0].montant,
nom: result_sql_select[0].nom,
prenom: result_sql_select[0].prenom,
adresse_rue: result_sql_select[0].adresse_rue,
adresse_complement: result_sql_select[0].adresse_complement,
adresse_codepostal: result_sql_select[0].adresse_codepostal,
adresse_ville: result_sql_select[0].adresse_ville,
adresse_pays: result_sql_select[0].adresse_pays,
mail: result_sql_select[0].mail,
telephone_mobile: result_sql_select[0].telephone_mobile,
commentaire: result_sql_select[0].commentaire,
statut_paiement: result_sql_select[0].statut_paiement,
stripe_retour: result_sql_select[0].stripe_retour
}
]
);
logger.info("AJOUT GOOGLESHEET FIN", { numsession: req.session.id, label: filename});
}
} catch (error) {
// Echec de connection à la BD
logger.error("Il y a un problème avec wh_stripe_don : " + error, { numsession: req.session.id });
return res.status(400).send(`Webhook Error: ${error.message}`);
}
res.json({ received: true });
}
/////////////////////////////////////////////////
// TEST WEASYPRINT
/////////////////////////////////////////////////
async function test_weasyprint(req, res, event) {
try {
const htmlFilePath = path.join(__dirname, '../pdf/template/don_wp.html');
const htmlContent = fs.readFileSync(htmlFilePath, 'utf-8');
const buffer = await weasyprint(htmlContent);
fs.writeFileSync("./pdf/don/output.pdf", buffer);
logger.info("PDF CREATED", { numsession: req.session.id, label: filename});
} catch (error) {
logger.error("Il y a un problème avec WeasyPrint : " + error, { numsession: req.session.id });
}
}
/////////////////////////////////////////////////
// EXPORT DE MODULE POUR QU'IL SOIT LU DANS LES AUTRES FICHIERS JS
/////////////////////////////////////////////////
module.exports = {
post_form_don,
don_accompte_reussi,
don_accompte_annule,
wh_stripe_don,
test_weasyprint
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,847 @@
/////////////////////////////////////////////////
// LOGGING
/////////////////////////////////////////////////
const logger = require("../public/js/app/logger");
/////////////////////////////////////////////////
// APPELS DES MODULES
/////////////////////////////////////////////////
const moment = require('moment');
const ejs = require('ejs');
var nodemailer = require('nodemailer');
const path = require("path");
const stripe = require('stripe')(process.env.STRIPE_RI_PRIVATE_KEY);
var pdf = require("pdf-creator-node");
var fs = require("fs");
////////////////////////////////////////////////////
// FILE NAME
////////////////////////////////////////////////////
const filename = path.parse(__filename).base;
/////////////////////////////////////////////////
// GOOGLE SHEET PARAMETERS
/////////////////////////////////////////////////
const { GoogleSpreadsheet } = require('google-spreadsheet');
const GS_creds_rassemblementidf = require('../inscriptionsafps-53b60452f63d.json');
const GS_rassemblementidf = new GoogleSpreadsheet('19Y1M7mZFSJrycQTtNxV2Cmmyz2OaeXHmwCKVCgy1r7Q');
/////////////////////////////////////////////////
// VARIABLES GLOBALES
/////////////////////////////////////////////////
/////////////////////////////////////////////////
// PAGE 1
// DOAMIN/stagenational/identifier
//
// RECHERCHE SI PERSONNE DÉJA INSCRITE
// SI NON INSCRITE
// RECHERCHE SI ADHÉRENTE DANS BD AFPS
//
/////////////////////////////////////////////////
const RI_checkidentifiant = async function(req, res) {
/////////////////////////////////////////////////
// RECHERCHE SI PERSONNE DÉJA INSCRITE
// DANS BD DU STAGE ANNUEL
logger.info("======================================", { label: filename });
logger.info("======== FUNCTION RI_checkidentifiant ==========", { label: filename });
logger.info("======================================", { label: filename });
await GS_rassemblementidf.useServiceAccountAuth(GS_creds_rassemblementidf);
await GS_rassemblementidf.loadInfo(); // loads document properties and worksheets
logger.info("NOM FICHIER SHEET: " + GS_rassemblementidf.title, { numsession: req.session.id, label: filename });
const GS_RI_sheet = GS_rassemblementidf.sheetsByTitle['inscription_web'];
logger.info("NOM DU TABLEAU (ONGLET): "+GS_RI_sheet.title, { label: filename }); //NOM DU TABLEAU (ONGLET)
const GS_SN_rows = await GS_RI_sheet.getRows();
// mettre les identifiants dans un array
let lesidentifiants = new Array;
let compteur = GS_RI_sheet.rowCount - 1;
console.log("compteur: ",compteur);
for (let i=0; i<compteur; i++) {
lesidentifiants[i] = GS_SN_rows[i].identifiant;
}
// afficher le array
logger.info("VOICI LA LISTE DES IDENTIFIANTS", { label: filename });
logger.info(lesidentifiants);
// recherche l'identifiant saisi dans le array de tous les identifiants de la Google Sheet
// ON RÉCUPÈRE L'IDENTIFIANT SAISIE DANS LE FORMULAIRE
// EST-CE QUE L'IDENTIFIANT EST SAISI ?
logger.info("identifiant saisi : "+req.body.identifiant, { numsession: req.session.id, label: filename});
if (req.body.identifiant) {
// IDENTIFIANT SAISI
req.session.identifiant = req.body.identifiant;
logger.info("req.body.identifiant : " + req.body.identifiant, { numsession: req.session.id, label: filename});
logger.info("req.session.identifiant : " + req.session.identifiant, { numsession: req.session.id, label: filename});
// EST-CE QUE L'IDENTIFIANT SAISI EST DÉJA INSCRIT AU STAGE
if (lesidentifiants.includes(req.body.identifiant) === true) {
// DÉJA INSCRIT AU STAGE
req.session.err_mail_form_adhesion_1 = "Cette identifiant est déjà inscrit pour le Rassemblement IDF 2023.";
req.session.err_mail_form_adhesion_2 = "Pour tout problème veuillez contacter lAssociation.";
req.session.err_mail_form_adhesion_3 = "";
res.redirect('/rassemblementidf/identifier');
} else {
// NON ENCORE INSCRIT AU STAGE
// COCHÉ AUTRE PAYS
logger.info("Etat case à coché autre pays : " + req.body.check_autrepays, { numsession: req.session.id, label: filename});
if (req.body.check_autrepays){
req.session.err_mail_form_adhesion_1 = "Vous n'êtes pas encore inscrit au stage";
req.session.err_mail_form_adhesion_2 = "Vous ètes membre Suzuki d'un autre pays";
req.session.err_mail_form_adhesion_3 = "Nous allons vous diriger vers le formulaire d'inscription";
res.redirect('/rassemblementidf/formulaire');
}
// COCHÉ AUTRE NON ADHÉRENT
logger.info("Etat case à coché non adhérent : " + req.body.check_nonadherent, { numsession: req.session.id, label: filename});
if (req.body.check_nonadherent){
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 <a target="_blank" href="https://www.adhesion.afpedagogiesuzuki.fr/inscription/adhesion"><span class="souligne">Cliquez ici</span></a>';
req.session.err_mail_form_adhesion_3 = 'Vous pouvez également adhérer à l\'association de votre pays. <a target="_blank" href="https://www.europeansuzuki.org/countries/"><span class="souligne">Vous trouverez ici les pays européens</span></a>';
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<compteur_adh; i++) {
lesidentifiants_adh.push({identifiant : GS_adh_rows[i].identifiant, association : "AFPS", Adhesion_paye : GS_adh_rows[i].Adhesion_paye});
}
// RÉCUPÉRER LES IDENTIFIANTS DU TABLEAU adhesion_ass_locales
for (let i=0; i<compteur_adh_asslocales; i++) {
lesidentifiants_adh.push({identifiant : GS_adh_rows_asslocales[i].identifiant, association : GS_adh_rows_asslocales[i].association, Adhesion_paye : GS_adh_rows_asslocales[i].Adhesion_paye });
}
console.log("ARRAY lesidentifiants_adh :");
console.info(lesidentifiants_adh);
// RECHERCHE DE L'IDENTIFIANT SAISI DANS LE ARRAY
const adherent_resultat = lesidentifiants_adh.find( adherent => adherent.identifiant === req.session.identifiant);
if (adherent_resultat){
logger.info("Identifiant trouvé dans la base des adhésions : " + adherent_resultat.identifiant, { numsession: req.session.id, label: filename});
logger.info("Adhésion payé : " + adherent_resultat.Adhesion_paye, { numsession: req.session.id, label: filename});
if (adherent_resultat.Adhesion_paye === "paye" || adherent_resultat.Adhesion_paye === "attente"){
logger.info("Identifiant trouvé et payé dans la base des adhésions", { numsession: req.session.id, label: filename});
req.session.err_mail_form_adhesion_1 = "Cet identifiant est bien inscrit dans les adhésions 2023/2024.";
req.session.err_mail_form_adhesion_2 = "Nous pouvons donc procéder à l'inscription au Rassemblement IDF 2024.";
req.session.err_mail_form_adhesion_3 = "Vous allez être redirigé vers le formulaire.";
req.session.association = adherent_resultat.association;
console.log("NOM FICHIER SHEET: ",adherent_resultat);
console.log("adherent_resultat association : ",adherent_resultat.association);
console.log("adherent_resultat identifiant : ",adherent_resultat.identifiant);
res.redirect('/rassemblementidf/formulaire');
} else {
logger.info("Identifiant trouvé mais NON payé dans la base des adhésions", { numsession: req.session.id, label: filename });
req.session.err_mail_form_adhesion_1 = "Cet identifiant n'a pas payé l'adhésion 2023/2024.";
req.session.err_mail_form_adhesion_2 = "Vous devez adhérer avant de vous inscrire au Rassemblement IDF 2024";
req.session.err_mail_form_adhesion_3 = 'Pour adhérer à l\'association Française pour la Pédagogie Suzuki <a target="_blank" href="https://www.adhesion.afpedagogiesuzuki.fr/inscription/adhesion"><span class="souligne">Cliquez ici</span></a>';
res.redirect('/rassemblementidf/identifier');
}
} else {
logger.info("Identifiant NON trouvé dans la base des adhésions", { numsession: req.session.id, label: filename });
req.session.err_mail_form_adhesion_1 = "Cet identifiant N'EST PAS inscrit dans les adhésions 2023/2024.";
req.session.err_mail_form_adhesion_2 = "Vous devez adhérer avant de vous inscrire au Rassemblement IDF 2024";
req.session.err_mail_form_adhesion_3 = 'Pour adhérer à l\'association Française pour la Pédagogie Suzuki <a target="_blank" href="https://www.adhesion.afpedagogiesuzuki.fr/inscription/adhesion"><span class="souligne">Cliquez ici</span></a>';
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 <a target="_blank" href="https://www.adhesion.afpedagogiesuzuki.fr/inscription/adhesion"><span class="souligne">Cliquez ici</span></a>';
req.session.err_mail_form_adhesion_3 = 'Vous pouvez également adhérer à l\'association de votre pays. <a target="_blank" href="https://www.europeansuzuki.org/countries/"><span class="souligne">Vous trouverez ici les pays européens</span></a>';
res.redirect('/rassemblementidf/identifier');
}
}
/////////////////////////////////////////////////
// PAGE 2
// DOMAIN/stagenational/formulaire
//
// RECUPERATION CHAMPS SAISIS
// CALCUL AGE
// CALCUL DU PRIX
// AFFICHER PAGE RECAP
//
/////////////////////////////////////////////////
const RI_checkinfos = async function(req, res) {
logger.info("======================================");
logger.info("======== FUNCTION RI_checkinfos ==========");
logger.info("======================================");
// RÉCUPÉRATION DES DONNÉES DU FORMULAIRE DANS LA SESSION EN COURS
req.session.association = req.body.association;
logger.info("req.session.association : " + req.session.association, { numsession: req.session.id, label: filename });
req.session.adherent_nom = req.body.adherent_nom;
logger.info("req.session.adherent_nom : " + req.session.adherent_nom, { numsession: req.session.id, label: filename });
req.session.adherent_prenom = req.body.adherent_prenom;
req.session.adherent_adresse_rue = req.body.adherent_adresse_rue;
req.session.adherent_adresse_complement = req.body.adherent_adresse_complement;
req.session.adherent_adresse_codepostal = req.body.adherent_adresse_codepostal;
req.session.adherent_adresse_ville = req.body.adherent_adresse_ville;
req.session.adherent_adresse_pays = req.body.adherent_adresse_pays;
req.session.adherent_telephone_mobile = req.body.adherent_telephone_mobile;
req.session.adherent_telephone_fixe = req.body.adherent_telephone_fixe;
req.session.adherent_mail = req.body.adherent_mail;
req.session.bus_nb = req.body.bus_nb;
req.session.accompagnant_nom = req.body.accompagnant_nom;
logger.info("req.session.accompagnant_nom : " + req.session.accompagnant_nom, { numsession: req.session.id, label: filename });
req.session.accompagnant_prenom = req.body.accompagnant_prenom;
logger.info("req.session.accompagnant_prenom : " + req.session.accompagnant_prenom, { numsession: req.session.id, label: filename });
req.session.commentaire_adherent = req.body.commentaire_adherent;
//// INITIALISATION DES MONTANTS PAR FAMILLE
req.session.cout_rassemblement = 0;
req.session.accompte_frais_bancaire = 0;
req.session.cout_total = 0;
logger.info("req.session.cout_rassemblement = " + req.session.cout_rassemblement, { numsession: req.session.id, label: filename });
logger.info("req.session.accompte_frais_bancaire = " + req.session.accompte_frais_bancaire, { numsession: req.session.id, label: filename });
logger.info("req.session.cout_total = " + req.session.cout_total, { numsession: req.session.id, label: filename });
var nbr_eleve = 0;
for (let toto = 1; toto < 7; toto++) {
req.session["personne_"+toto+"_nom"] = req.body["personne_"+toto+"_nom"];
logger.info('req.session["personne_"'+toto+'"_nom"] = ' + req.session["personne_"+toto+"_nom"], { numsession: req.session.id, label: filename });
req.session["personne_"+toto+"_prenom"] = req.body["personne_"+toto+"_prenom"];
logger.info('req.session["personne_"'+toto+'"_prenom"] = ' + req.session["personne_"+toto+"_prenom"], { numsession: req.session.id, label: filename });
req.session["personne_"+toto+"_datenaissance"] = req.body["personne_"+toto+"_datenaissance"];
logger.info('req.session["personne_"'+toto+'"_datenaissance"] = ' + req.session["personne_"+toto+"_datenaissance"], { numsession: req.session.id, label: filename });
req.session["personne_"+toto+"_instrument"] = req.body["personne_"+toto+"_instrument"];
logger.info('req.session["personne_"'+toto+'"_instrument"] = ' + req.session["personne_"+toto+"_instrument"], { numsession: req.session.id, label: filename });
req.session["personne_"+toto+"_cahier"] = req.body["personne_"+toto+"_cahier"];
logger.info('req.session["personne_"'+toto+'"_cahier"] = ' + req.session["personne_"+toto+"_cahier"], { numsession: req.session.id, label: filename });
req.session["personne_"+toto+"_piece"] = req.body["personne_"+toto+"_piece"];
logger.info('req.session["personne_"'+toto+'"_piece"] = ' + req.session["personne_"+toto+"_piece"], { numsession: req.session.id, label: filename });
req.session["personne_"+toto+"_prof"] = req.body["personne_"+toto+"_prof"];
logger.info('req.session["personne_"'+toto+'"_prof"] = ' + req.session["personne_"+toto+"_prof"], { numsession: req.session.id, label: filename });
// CALCUL ÂGE PERSONNE
if (req.session["personne_"+toto+"_datenaissance"]) {
logger.info('req.session["personne_"'+toto+'"_datenaissance"] : ' + req.session["personne_"+toto+"_datenaissance"], { numsession: req.session.id, label: filename });
let datenaissance_concat = req.session["personne_"+toto+"_datenaissance"];
logger.info("datenaissance_concat : " + datenaissance_concat, { numsession: req.session.id, label: filename });
var an=datenaissance_concat.substr(6,4); // l'année (les quatre premiers caractères de la chaîne à partir de 6)
var mois=datenaissance_concat.substr(3,2);// On selectionne le mois de la date de naissance
var day= datenaissance_concat.substr(0,2); // On selectionne la jour de la date de naissance
var birthDate = new Date(an + "-" + mois + "-" + day);
var debutrassemblement = new Date('2023-05-07');
logger.info("birthDate : " + birthDate, { numsession: req.session.id, label: filename });
logger.info("debutrassemblement : " + debutrassemblement, { numsession: req.session.id, label: filename });
var age = debutrassemblement.getFullYear() - birthDate.getFullYear();
logger.info("age : " + age, { numsession: req.session.id, label: filename });
var m = debutrassemblement.getMonth() - birthDate.getMonth();
if (m < 0 || (m === 0 && debutrassemblement.getDate() < birthDate.getDate())) {
logger.info("debutrassemblement.getDate() = " + debutrassemblement.getDate(), { numsession: req.session.id, label: filename });
age--;
}
req.session["personne_"+toto+"_age"] = age;
logger.info('req.session["personne_"+toto+"_age"] = ' + req.session["personne_"+toto+"_age"], { numsession: req.session.id, label: filename });
//// +1 nombre d'élève
nbr_eleve++;
logger.info('nbr_eleve dans boucle date de naissance : ' + nbr_eleve, { numsession: req.session.id, label: filename });
}
}
///// CALCUL COUT TOTAL
logger.info('nbr_eleve TOTAL : ' + nbr_eleve, { numsession: req.session.id, label: filename });
if (nbr_eleve == 1){
req.session.cout_rassemblement = 31;
req.session.accompte_frais_bancaire = 1;
req.session.cout_total += req.session.cout_rassemblement + req.session.accompte_frais_bancaire;
};
if (nbr_eleve > 1){
req.session.cout_rassemblement = 51;
req.session.accompte_frais_bancaire = 1;
req.session.cout_total += req.session.cout_rassemblement + req.session.accompte_frais_bancaire;
}
if (nbr_eleve < 1){
req.session.err_nbr_eleve = "Vous n'avez pas inscrit d'élève";
logger.info('req.session.err_nbr_eleve : ' + req.session.err_nbr_eleve, { numsession: req.session.id, label: filename });
}
if (req.session.err_nbr_eleve) {
logger.info("existing session_err_nbr_eleve : " + req.session.err_nbr_eleve, { numsession: req.session.id });
res.redirect('/rassemblementidf/formulaire');
} else {
logger.info('req.session.cout_rassemblement : ' + req.session.cout_rassemblement, { numsession: req.session.id, label: filename });
logger.info('req.session.accompte_frais_bancaire : ' + req.session.accompte_frais_bancaire, { numsession: req.session.id, label: filename });
logger.info('req.session.cout_total : ' + req.session.cout_total, { numsession: req.session.id, label: filename });
res.redirect('/rassemblementidf/recap');
}
}
/////////////////////////////////////////////////
// PAGE 3
// DOMAIN/stagenational/recap
//
// Bouton modifier
//
/////////////////////////////////////////////////
// CLICK SUR BOUTON MODIFIER
const post_recap_modifier = async function(req, res) {
res.redirect('/rassemblementidf/identifier');
}
/////////////////////////////////////////////////
// PAYER ACCOMPTE
//
// Enregistrement des infos dans la Google Sheet avant le paiement
// (car le redirect après le paiement vers la page "réussi" ou "annulé" initialise une autre session qui fait perdre le cookie précédent et les infos saisies)
// Payer accompte par carte bancaire
// STIPE
//
/////////////////////////////////////////////////
// CLICK SUR BOUTON PAYER ACCOMPTE PAGE RECAP
const post_payer_ri = async function(req, res, next) {
logger.info("======================================");
logger.info("======== FUNCTION post_payer_ri ==========");
logger.info("======================================");
//////////////////////////////////
// AJOUT INFO DANS LA GOOGLE SHEET
await GS_rassemblementidf.useServiceAccountAuth(GS_creds_rassemblementidf);
await GS_rassemblementidf.loadInfo(); // loads document properties and worksheets
logger.info("NOM FICHIER SHEET : " + GS_rassemblementidf.title, { numsession: req.session.id, label: filename });
const GS_RI_sheet = GS_rassemblementidf.sheetsByTitle['inscription_web'];
logger.info("NOM DU TABLEAU (ONGLET): " + GS_RI_sheet.title, { numsession: req.session.id, label: filename });
// DATE DE L'INSCRIPTION
moment().format();
moment.locale('fr');
var date_formattee = moment().format('L')
console.log("date_formattee:", date_formattee);
// AJOUTER UNE LIGNE DANS LA GOOGLE SHEET
logger.info("/ AJOUTER UNE LIGNE DANS LA GOOGLE SHEET", { numsession: req.session.id, label: filename });
logger.info("req.session.identifiant : " + req.session.identifiant, { numsession: req.session.id, label: filename });
logger.info("req.session.adherent_nom : " + req.session.adherent_nom, { numsession: req.session.id, label: filename });
const moreRows = await GS_RI_sheet.addRows([
{
'saison': "2022/2023",
'identifiant': req.session.identifiant,
'association_suzuki': req.session.association,
'status_inscription': "clic_bouton_payer",
'inscription_date': date_formattee,
'adherent_nom': req.session.adherent_nom,
'adherent_prenom': req.session.adherent_prenom,
'cout_total': req.session.cout_total,
'cout_rassemblement': req.session.cout_rassemblement,
'frais_bancaire': req.session.accompte_frais_bancaire,
'adherent_adresse_rue': req.session.adherent_adresse_rue,
'adherent_adresse_complement': req.session.adherent_adresse_complement,
'adherent_adresse_codepostal': req.session.adherent_adresse_codepostal,
'adherent_adresse_ville': req.session.adherent_adresse_ville,
'adherent_adresse_pays': req.session.adherent_adresse_pays,
'adherent_telephone_fixe': req.session.adherent_telephone_fixe,
'adherent_telephone_mobile': req.session.adherent_telephone_mobile,
'adherent_mail': req.session.adherent_mail,
'bus_nb': req.session.bus_nb,
'accompagnant_nom': req.session.accompagnant_nom,
'accompagnant_prenom': req.session.accompagnant_prenom,
'commentaire_adherent': req.session.commentaire_adherent,
'personne_1_nom': req.session.personne_1_nom,
'personne_1_prenom': req.session.personne_1_prenom,
'personne_1_datenaissance': req.session.personne_1_datenaissance,
'personne_1_age': req.session.personne_1_age,
'personne_1_instrument': req.session.personne_1_instrument,
'personne_1_cahier': req.session.personne_1_cahier,
'personne_1_piece': req.session.personne_1_piece,
'personne_1_prof': req.session.personne_1_prof,
'personne_2_nom': req.session.personne_2_nom,
'personne_2_prenom': req.session.personne_2_prenom,
'personne_2_datenaissance': req.session.personne_2_datenaissance,
'personne_2_age': req.session.personne_2_age,
'personne_2_instrument': req.session.personne_2_instrument,
'personne_2_cahier': req.session.personne_2_cahier,
'personne_2_piece': req.session.personne_2_piece,
'personne_2_prof': req.session.personne_2_prof,
'personne_3_nom': req.session.personne_3_nom,
'personne_3_prenom': req.session.personne_3_prenom,
'personne_3_datenaissance': req.session.personne_3_datenaissance,
'personne_3_age': req.session.personne_3_age,
'personne_3_instrument': req.session.personne_3_instrument,
'personne_3_cahier': req.session.personne_3_cahier,
'personne_3_piece': req.session.personne_3_piece,
'personne_3_prof': req.session.personne_3_prof,
'personne_4_nom': req.session.personne_4_nom,
'personne_4_prenom': req.session.personne_4_prenom,
'personne_4_datenaissance': req.session.personne_4_datenaissance,
'personne_4_age': req.session.personne_4_age,
'personne_4_instrument': req.session.personne_4_instrument,
'personne_4_cahier': req.session.personne_4_cahier,
'personne_4_piece': req.session.personne_4_piece,
'personne_4_prof': req.session.personne_4_prof,
'personne_5_nom': req.session.personne_5_nom,
'personne_5_prenom': req.session.personne_5_prenom,
'personne_5_datenaissance': req.session.personne_5_datenaissance,
'personne_5_age': req.session.personne_5_age,
'personne_5_instrument': req.session.personne_5_instrument,
'personne_5_cahier': req.session.personne_5_cahier,
'personne_5_piece': req.session.personne_5_piece,
'personne_5_prof': req.session.personne_5_prof,
'personne_6_nom': req.session.personne_6_nom,
'personne_6_prenom': req.session.personne_6_prenom,
'personne_6_datenaissance': req.session.personne_6_datenaissance,
'personne_6_age': req.session.personne_6_age,
'personne_6_instrument': req.session.personne_6_instrument,
'personne_6_cahier': req.session.personne_6_cahier,
'personne_6_piece': req.session.personne_6_piece,
'personne_6_prof': req.session.personne_6_prof,
},
]);
//////////////////////////////////
// PAIEMENT STRIPE
// STRIPE - ETAPE 1 - CREER l'INTENTION DE PAIEMENT
logger.info("// STRIPE - ETAPE 1 - CREER l'INTENTION DE PAIEMENT", { numsession: req.session.id, label: filename });
logger.info("stripe.VERSION = " + stripe.VERSION, { numsession: req.session.id, label: filename });
logger.info("stripe._api = " + stripe._api, { numsession: req.session.id, label: filename });
//console.log(stripe);
logger.info("req.session.adherent_mail = " + req.session.adherent_mail, { numsession: req.session.id, label: filename });
logger.info("// STRIPE - AJOUT METADATA", { numsession: req.session.id, label: filename });
logger.info("req.session.identifiant = " + req.session.identifiant, { numsession: req.session.id, label: filename });
logger.info("req.session.cout_rassemblement = " + req.session.cout_rassemblement, { numsession: req.session.id, label: filename });
logger.info("req.session.accompte_frais_bancaire = " + req.session.accompte_frais_bancaire, { numsession: req.session.id, label: filename });
logger.info("STRIPE_RI_SUCCESSURL = " + process.env.STRIPE_RI_SUCCESSURL, { numsession: req.session.id, label: filename });
logger.info("STRIPE_RI_CANCELURL = " + process.env.STRIPE_RI_CANCELURL, { numsession: req.session.id, label: filename });
logger.info("req.session.cout_total = " + req.session.cout_total, { numsession: req.session.id, label: filename });
const session = await stripe.checkout.sessions.create({
metadata: {identifiant: req.session.identifiant, cout_rassemblement: req.session.cout_rassemblement, accompte_frais_bancaire: req.session.accompte_frais_bancaire},
customer_email: req.session.adherent_mail,
//There are four different submit types.
submit_type: 'pay',
success_url: process.env.STRIPE_RI_SUCCESSURL,
cancel_url: process.env.STRIPE_RI_CANCELURL,
payment_method_types: ['card'],
line_items: [{
price_data: {
currency: 'eur',
product_data: {
name: 'Rassemblement IDF',
},
unit_amount: req.session.cout_total * 100,
},
quantity: 1,
},],
//Checkout has three modes: payment, subscription, or setup.
mode: 'payment'
});
logger.info("session: " + session, { numsession: req.session.id, label: filename });
logger.info("session.id: " + session.id, { numsession: req.session.id, label: filename });
logger.info("session.url: " + session.url, { numsession: req.session.id, label: filename });
let url_stripe = session.url
res.redirect(session.url)
}
/////////////////////////////////////////////////
// RETOUR PAIEMENT REUSSI
const RI_accompte_reussi = async function(req, res){
logger.info("======================================");
logger.info("======== FUNCTION RI_accompte_reussi ==========");
logger.info("======================================");
// RETOUR STRIPE
var id = req.query.id;
logger.info("id : " + id, { numsession: req.session.id, label: filename });
const session_stripe = await stripe.checkout.sessions.retrieve(id);
var customer_email = session_stripe.customer_email;
var payment_status = session_stripe.payment_status;
var amount_total = session_stripe.amount_total/100;
var stripe_customer = session_stripe.customer;
var stripe_payment_intent = session_stripe.payment_intent;
var payment_method_types = session_stripe.payment_method_types;
var stripe_status = session_stripe.status;
var identifiant = session_stripe.metadata.identifiant;
var cout_rassemblement = session_stripe.metadata.cout_rassemblement;
var accompte_frais_bancaire = session_stripe.metadata.accompte_frais_bancaire;
var CB_retour = "identifiant_adherent:"+identifiant+",payment_status:"+payment_status+",stripe_customer:"+stripe_customer+",stripe_payment_intent:"+stripe_payment_intent+",sessionID:"+session_stripe.id+",payment_method_types:"+payment_method_types+",amount_total:"+amount_total+",stripe_status:"+stripe_status;
console.log("customer_email: ", customer_email);
logger.info("payment_status : " + payment_status, { numsession: req.session.id, label: filename });
logger.info("cout_rassemblement : " + cout_rassemblement, { numsession: req.session.id, label: filename });
logger.info("accompte_frais_bancaire : " + accompte_frais_bancaire, { numsession: req.session.id, label: filename });
console.log("stripe_customer: ", stripe_customer);
console.log("amount_total: ", amount_total);
console.log("stripe_payment_intent: ", stripe_payment_intent);
console.log("payment_method_types: ", payment_method_types);
console.log("payment_method_types: ", payment_method_types[0]);
console.log("stripe_status: ", stripe_status);
console.log("CB_retour: ", CB_retour);
//////////////////////////////////////////////////////////////////////////////
// RÉCUPÉRATION DES INFOS STAGIAIRES DANS LA GOOGLE SHEET
// MISE À JOUR DES INFORMATIONS SUR LE PAIEMENT DANS LA BASE DE DONNÉES GSHEET
await GS_rassemblementidf.useServiceAccountAuth(GS_creds_rassemblementidf);
await GS_rassemblementidf.loadInfo(); // loads document properties and worksheets
logger.info("NOM FICHIER SHEET: " + GS_rassemblementidf.title, { numsession: req.session.id, label: filename });
const GS_RI_sheet = GS_rassemblementidf.sheetsByTitle['inscription_web'];
logger.info("NOM DU TABLEAU (ONGLET): " + GS_RI_sheet.title, { numsession: req.session.id, label: filename });
// on récupère le contenu de la GSheet dans un array nommé "infos_adherents"
const infos_adherents = await GS_RI_sheet.getRows();
// on récupère quelle ligne contient l'identifiant concerné pour mettre à jour cette ligne
let list_identifiants = new Array;
let compteur = GS_RI_sheet.rowCount - 1;
let rowToBeUpdate;
logger.info("identifiant TRANSMIS PAR STRIPE :" + identifiant, { numsession: req.session.id, label: filename });
for (let i=0; i<compteur; i++) {
list_identifiants[i] = infos_adherents[i].identifiant;
if (infos_adherents[i].identifiant === identifiant){
logger.info("infos_adherents[i].identifiant TROUVE :" + infos_adherents[i].identifiant, { numsession: req.session.id, label: filename });
logger.info("IDENTIFIANT TROUVÉ DANS LE ARRAY 'infos_adherents' à i = " + i, { numsession: req.session.id, label: filename });
logger.info("infos_adherents[i].adherent_nom TROUVE :" + infos_adherents[i].adherent_nom, { numsession: req.session.id, label: filename });
rowToBeUpdate = i;
}
}
logger.info("infos_adherents[i].adherent_nom TROUVE GARDE :" + infos_adherents[rowToBeUpdate].adherent_nom, { numsession: req.session.id, label: filename });
// DATE DE DU PAIEMENT
moment().format();
moment.locale('fr');
var date_formattee = moment().format('L')
console.log("date_formattee:", date_formattee);
// MISE À JOUR DES INFORMATIONS SUR LE PAIEMENT DANS LA BASE DE DONNÉES GSHEET
logger.info("rowToBeUpdate :" + rowToBeUpdate, { numsession: req.session.id, label: filename });
infos_adherents[rowToBeUpdate].inscription_paye = 'paye';
infos_adherents[rowToBeUpdate].status_inscription = 'CB_OK';
infos_adherents[rowToBeUpdate].inscription_paiement_mode = payment_method_types[0];
infos_adherents[rowToBeUpdate].inscription_paiement_CB_retour = CB_retour;
infos_adherents[rowToBeUpdate].inscription_paiement_date = date_formattee;
await infos_adherents[rowToBeUpdate].save(); // save updates
//////////////////////////////////////////////////////////////////////////////
// CONFIRMATION PAR MAIL
logger.info("MAIL ENVOI AVANT", { numsession: req.session.id, label: filename });
var transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
// TEST JULIE
//user: 'juliechaumard@gmail.com',
//pass: 'etfq umof iwbx ltxk'
// SUZUKI
user: 'afps.inscription@gmail.com',
pass: 'vljxrkhwgljjracs'
}
});
var mail_objet = "ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - RASSEMBLEMENT IDF 2026 - ";
mail_objet += infos_adherents[rowToBeUpdate].adherent_nom;
mail_html = "<p>Cher adhérent,</p><p>Félicitations ! Vous êtes désormais inscrit au rassemblement Ile de France du 7 mai 2023 organisé par lassociation La clef du bonheur et lécole de musique de Chambourcy, en partenariat avec l'Association Française pour la Pédagogie Suzuki.</p>";
mail_html += "<p>La journée commence à 10h30 avec le premier atelier, l'accueil est ouvert à partir de 9h30.</p>";
mail_html += "<p>La journée se terminera après le concert vers 16h30 et un goûter sera offert aux enfants.</p>";
mail_html += "<p>Apportez votre pique-nique pour le déjeuner de midi.</p>";
mail_html += "<p>Pour ceux qui viennent en RER à la gare de Poissy, des voitures / navettes attendront entre 9h15 et 9h45 maximum afin de vous conduire sur les lieux du rassemblement.</p>";
mail_html += "<br>";
mail_html += "<p>Vous trouverez en pièce jointe le programme à réviser et le plan d'accès pour le parking.</p>";
mail_html += "<br>";
mail_html += "<p>RÉCAPITULATIF :</p>";
mail_html += "<p>Identifiant Suzuki : ";
mail_html += identifiant;
mail_html += "</p><p>Association Suzuki : ";
mail_html += infos_adherents[rowToBeUpdate].association_suzuki;
mail_html += "</p><p>Navette depuis Poissy RER A : ";
mail_html += infos_adherents[rowToBeUpdate].bus_nb;
mail_html += " personnes";
mail_html += "</p><br>";
mail_html += "</p><p>Accompagnant : ";
mail_html += infos_adherents[rowToBeUpdate].accompagnant_prenom;
mail_html += " ";
mail_html += infos_adherents[rowToBeUpdate].accompagnant_nom;
mail_html += "</p><br>";
for (let toto = 1; toto<7; toto++) {
if (infos_adherents[rowToBeUpdate]["personne_"+toto+"_nom"]) {
mail_html += "<p>Nom : ";
mail_html += infos_adherents[rowToBeUpdate]["personne_"+toto+"_nom"];
mail_html += " ";
mail_html += infos_adherents[rowToBeUpdate]["personne_"+toto+"_prenom"];
mail_html += "</p><p>Date de naissance : ";
mail_html += infos_adherents[rowToBeUpdate]["personne_"+toto+"_datenaissance"];
mail_html += "</p>";
if (infos_adherents[rowToBeUpdate]["personne_"+toto+"_instrument"]) {
mail_html += "<p>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 += "</p>";
}
if (infos_adherents[rowToBeUpdate]["personne_"+toto+"_activite_1"]) {
mail_html += "<p>Activité : ";
mail_html += infos_adherents[rowToBeUpdate]["personne_"+toto+"_activite_1"];
mail_html += " ";
mail_html += infos_adherents[rowToBeUpdate]["personne_"+toto+"_activite_2"];
mail_html += "</p>";
}
mail_html += "<br>";
}
}
mail_html += "<br>";
mail_html += "<p>Tarif rassemblement : ";
mail_html += infos_adherents[rowToBeUpdate].cout_rassemblement;
mail_html += "€</p><p>Frais bancaire : ";
mail_html += infos_adherents[rowToBeUpdate].frais_bancaire;
mail_html += "€</p>Montant total : ";
mail_html += infos_adherents[rowToBeUpdate].cout_total;
mail_html += "€</p>";
mail_html += "<p><br>Nous nous réjouissons de vous accueillir pour cette journée !</p><br><p>LAssociation La clef du bonheur et lécole de musique de Chambourcy<br>Marie Vélu et Philippe Arestan<br>Pôle organisation du rassemblement</p>";
var attachment_name = "rassemblementidf_plan_lieu.pdf";
var pdfname = path.resolve(__dirname, "../public/images/rassemblementidf_plan_lieu.pdf");
var attachment_name_2 = "rassemblementidf_2023_programme.pdf";
var pdfname_2 = path.resolve(__dirname, "../public/images/rassemblementidf_2023_programme.pdf");
var mailOptions = {
from: 'afps.inscription@gmail.com',
to: customer_email,
subject: mail_objet,
html: mail_html,
attachments: [{
filename: attachment_name,
path: pdfname
},{
filename: attachment_name_2,
path: pdfname_2
}],
};
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.bus_nb = infos_adherents[rowToBeUpdate].bus_nb;
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; i<compteur; i++) {
list_identifiants[i] = infos_adherents[i].identifiant;
if (infos_adherents[i].identifiant === identifiant){
logger.info("infos_adherents[i].identifiant TROUVE :" + infos_adherents[i].identifiant, { numsession: req.session.id, label: filename });
logger.info("IDENTIFIANT TROUVÉ DANS LE ARRAY 'infos_adherents' à i = " + i, { numsession: req.session.id, label: filename });
logger.info("infos_adherents[i].adherent_nom TROUVE :" + infos_adherents[i].adherent_nom, { numsession: req.session.id, label: filename });
rowToBeUpdate = i;
}
}
logger.info("infos_adherents[i].adherent_nom TROUVE GARDE :" + infos_adherents[rowToBeUpdate].adherent_nom, { numsession: req.session.id, label: filename });
// ANNULATION INSCRIT DANS LA BASE DE DONNÉES GSHEET
logger.info("rowToBeUpdate :" + rowToBeUpdate, { numsession: req.session.id, label: filename });
infos_adherents[rowToBeUpdate].inscription_paye = 'echec';
infos_adherents[rowToBeUpdate].status_inscription = 'CB_KO';
await infos_adherents[rowToBeUpdate].save(); // save updates
res.render('rassemblementidf/page_templates/paiement_annule');
}
/////////////////////////////////////////////////
// EXPORT DE MODULE POUR QU'IL SOIT LU DANS LES AUTRES FICHIERS JS
/////////////////////////////////////////////////
module.exports = {
RI_checkidentifiant,
RI_checkinfos,
post_recap_modifier,
post_payer_ri,
RI_accompte_reussi,
RI_accompte_annule
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,498 @@
/////////////////////////////////////////////////
// APPELS DES MODULES
/////////////////////////////////////////////////
const path = require("path");
/////////////////////////////////////////////////
// APPELS DES MODULES PERSOS
/////////////////////////////////////////////////
// loggings
const logger = require("../../public/js/app/logger_stagenat");
// DB
const { connect_DB_promise } = require('../../modules/db/databaseconnect');
// VÉRIF CODE SECRET
const { verif_codesecret } = require('../../modules/verif_codesecret');
////////////////////////////////////////////////////
// FILE NAME
////////////////////////////////////////////////////
const filename = path.parse(__filename).base;
/////////////////////////////////////////////////
// PAGE 2
// DOMAIN/stagenational/formulaire
//
// RECUPERATION CHAMPS SAISIS
// CALCUL AGE
// CALCUL DU PRIX
// AFFICHER PAGE RECAP
//
/////////////////////////////////////////////////
const SN_checkinfos = async function(req, res) {
logger.info("======================================", { label: filename });
logger.info("======== FUNCTION post_formulaire_stagenat (STAGE) ==========", { label: filename });
logger.info("======================================", { label: filename });
//Connexion
let db_connection_promise = await connect_DB_promise();
//// INITIALISATION DES MONTANTS PAR FAMILLE
req.session.cout_total = 0;
req.session.frais_dossier = 0;
req.session.cout_total_hebergement = 0;
req.session.cout_total_transport = 0;
req.session.cout_total_dalcroze = 0;
req.session.cout_total_chant = 0;
req.session.cout_total_dalcroze_surplace = 0;
req.session.cout_total_observation = 0;
req.session.cout_total_cours = 0;
req.session.cout_total_coursparticulier = 0;
req.session.cout_total_eveil = 0;
req.session.cout_total_collectif = 0;
req.session.cout_total_ensemble = 0;
req.session.cout_total_particulier = 0;
req.session.cout_total_option_decouvrealto = 0;
req.session.accompte_frais_bancaire = 0;
req.session.remise = "";
req.session.remise_fn_montant = 0;
req.session.montant_accompte = 0;
// Variables
let adulte_trouve = "non";
let nb_instrumentiste = 0;
// RÉCUPÉRATION DES DONNÉES DU FORMULAIRE DE LA SESSION EN COURS
req.session.association_suzuki = req.body.association_suzuki;
req.session.adherent_nom = req.body.adherent_nom;
req.session.adherent_prenom = req.body.adherent_prenom;
req.session.adherent_adresse_rue = req.body.adherent_adresse_rue;
req.session.adherent_adresse_complement = req.body.adherent_adresse_complement;
req.session.adherent_adresse_codepostal = req.body.adherent_adresse_codepostal;
req.session.adherent_adresse_ville = req.body.adherent_adresse_ville;
req.session.adherent_adresse_pays = req.body.adherent_adresse_pays;
req.session.adherent_telephone = req.body.adherent_telephone;
req.session.adherent_mail = req.body.adherent_mail;
req.session.hebergement = req.body.hebergement;
req.session.commentaire_adherent = req.body.commentaire_adherent;
var nb_prof_invite = 0;
var nb_observateur = 0;
var nb_accompagnant = 0;
var nb_instrumentiste_camp = 0;
var nb_personne_hebergement = 0;
req.session.cout_supplement_hebergement = 0;
// SI DATE LIMITE D'INSCRIPTION DÉPASSÉE ON vérifie que le code secret est bien ok
await verif_codesecret(req, res);
logger.info("req.session.onpeutcontinuer : " + req.session.onpeutcontinuer , { numsession: req.session.id, label: filename});
if (req.session.onpeutcontinuer === "oui") {
// TRAITEMENT DES PARTICIPANTS
for (let toto = 1; toto < 7; toto++) {
// RÉCUPÉRATION DES INFORMATIONS SAISIES
if (req.body["personne_"+toto+"_nom"]) {
req.session[`personne_${toto}_nom`] = req.body[`personne_${toto}_nom`];
req.session[`personne_${toto}_prenom`] = req.body[`personne_${toto}_prenom`];
req.session[`personne_${toto}_datenaissance`] = req.body[`personne_${toto}_datenaissance`];
req.session[`personne_${toto}_transport_mode`] = req.body[`personne_${toto}_transport_mode`];
req.session[`personne_${toto}_transport_arret`] = req.body[`personne_${toto}_transport_arret`];
req.session[`personne_${toto}_role`] = req.body[`personne_${toto}_role`];
// PROFIL pour observateur, prof ou non
req.session[`personne_${toto}_profil`] = req.body[`personne_${toto}_profil`];
req.session[`personne_${toto}_prise_charge_nom`] = req.body[`personne_${toto}_prise_charge_nom`];
if (req.session[`personne_${toto}_prise_charge_nom`]) {adulte_trouve = "oui"}
req.session[`personne_${toto}_instrument`] = req.body[`personne_${toto}_instrument`];
req.session[`personne_${toto}_instrument_ensemble`] = req.body[`personne_${toto}_instrument_ensemble`];
req.session[`personne_${toto}_instrument_collectif`] = req.body[`personne_${toto}_instrument_collectif`];
req.session[`personne_${toto}_cahier`] = req.body[`personne_${toto}_cahier`];
req.session[`personne_${toto}_piece`] = req.body[`personne_${toto}_piece`];
req.session[`personne_${toto}_prof`] = req.body[`personne_${toto}_prof`];
req.session[`personne_${toto}_mail_prof`] = req.body[`personne_${toto}_mail_prof`];
req.session[`personne_${toto}_option_coursindividuel`] = req.body[`personne_${toto}_option_coursindividuel`];
req.session[`personne_${toto}_option_decouvrealto`] = req.body[`personne_${toto}_option_decouvrealto`];
req.session[`personne_${toto}_option_concertsolo_cahier`] = req.body[`personne_${toto}_option_concertsolo_cahier`];
req.session[`personne_${toto}_option_concertsolo_piece`] = req.body[`personne_${toto}_option_concertsolo_piece`];
for (let i = 1; i <= 5; i++) {
req.session[`personne_${toto}_activite_${i}`] = req.body[`personne_${toto}_activite_${i}`];
}
// CALCUL ÂGE PERSONNE
// CALCUL PROFIL AGE DE LA PERSONNE
if (req.session["personne_"+toto+"_datenaissance"]) {
let datenaissance_concat = req.session["personne_"+toto+"_datenaissance"];
let an=datenaissance_concat.substr(6,4); // l'année (les quatre premiers caractères de la chaîne à partir de 6)
let mois=datenaissance_concat.substr(3,2);// On selectionne le mois de la date de naissance
let day= datenaissance_concat.substr(0,2); // On selectionne la jour de la date de naissance
let birthDate = new Date(an + "-" + mois + "-" + day);
let debutstage = new Date('2026-08-23');
let age = debutstage.getFullYear() - birthDate.getFullYear();
let m = debutstage.getMonth() - birthDate.getMonth();
if (m < 0 || (m === 0 && debutstage.getDate() < birthDate.getDate())) {
age--;
}
req.session[`personne_${toto}_age`] = age;
//logger.info("Age de " + req.session[`personne_${toto}_prenom`] + " = " + age , { numsession: req.session.id, label: filename});
// CALCUL PROFIL_AGE DE LA PERSONNE
req.session[`personne_${toto}_profilage`] =
(age < 3) ? "moins_3ans" :
(age >= 3 && age <= 5) ? "3-5ans" :
(age >= 6 && age <= 11) ? "6-11ans" :
(age >= 12 && age <= 15) ? "12-15ans" :
(age >= 16 && age <= 17) ? "16-17ans" :
"adulte";
// Pour camp ado : on vérifie s'il y a un adulte ou non
if (req.session[`personne_${toto}_age`] > 17) {
adulte_trouve = "oui";
logger.info("adulte_trouve : " + adulte_trouve, { numsession: req.session.id, label: filename});
};
///////////////////////
// TARIF PAR PERSONNE
//// INITIALISATION DES MONTANTS PAR PERSONNE
req.session[`personne_${toto}_cout_hebergement`] = 0;
req.session[`personne_${toto}_cout_transport`] = 0;
req.session[`personne_${toto}_observation_cout`] = 0;
req.session[`personne_${toto}_cours_cout`] = 0;
req.session[`personne_${toto}_coursindividuel_cout`] = 0;
req.session[`personne_${toto}_option_decouvrealto_cout`] = 0;
req.session[`personne_${toto}_eveil_cout`] = 0;
req.session[`personne_${toto}_dalcroze_cout`] = 0;
req.session[`personne_${toto}_chant_cout`] = 0;
req.session[`personne_${toto}_collectif_cout`] = 0;
req.session[`personne_${toto}_ensemble_cout`] = 0;
req.session[`personne_${toto}_particulier_cout`] = 0;
// FLOCONS VERT COUT PAR PERSONNE
// OBLIGER LES INSTRUMENTISTES CAMP ADO A CHOISIR Hébergement FLOCONS VERTS
if (req.session["personne_"+toto+"_role"] == "instrumentiste_camp") {
req.session.hebergement = "flocons verts partagé";
nb_instrumentiste_camp ++;
}
if ((req.session.hebergement === "flocons verts partagé" || req.session.hebergement === "flocons verts non partagé")
&& req.session[`personne_${toto}_role`] !== "prof_invite") {
logger.info(`HEBERGEMENT : ${req.session.hebergement}`, { numsession: req.session.id, label: filename });
// 11 ans - 17 ans & ADULTE tarif 300€/semaine
if (req.session[`personne_${toto}_age`] > 10) {
req.session[`personne_${toto}_cout_hebergement`] = 300;
req.session.cout_total += 300;
req.session.cout_total_hebergement += 300;
nb_personne_hebergement++;
}
// 3 - 10 ans tarif 250€/semaine
if (req.session[`personne_${toto}_age`] >= 3 && req.session[`personne_${toto}_age`] <= 10) {
req.session[`personne_${toto}_cout_hebergement`] = 250;
req.session.cout_total += 250;
req.session.cout_total_hebergement += 250;
nb_personne_hebergement++;
}
}
// CAR COUT PAR PERSONNE
if (req.session[`personne_${toto}_transport_mode`] === "car" && req.session[`personne_${toto}_role`] !== "prof_invite") {
logger.info(`ON AJOUTE LE COUT DU CAR : ${req.session[`personne_${toto}_role`]}`, { numsession: req.session.id, label: filename });
req.session[`personne_${toto}_cout_transport`] = 65;
req.session.cout_total_transport += 65;
req.session.cout_total += 65;
}
// ACTIVITE COUT PAR PERSONNE
const activiteMapping = {
"dalcroze": { option: "opt_dalcroze", label: "rythmique Dalcroze", cout: 75, labelcout:"dalcroze_cout", totalKey: "cout_total_dalcroze" },
"chant": { option: "opt_chantchoral", label: "chant choral", cout: 75, labelcout:"chant_cout", totalKey: "cout_total_chant", gratuit: 11 },
"eveil": { option: "opt_eveil", label: "éveil musical", cout: 75, labelcout:"eveil_cout", totalKey: "cout_total_eveil" },
"cours_collectif_suzuki_acc": { option: "opt_collectif", label: "Cours collectif Suzuki", cout: 75, labelcout:"collectif_cout", totalKey: "cout_total_collectif" },
"atelier_mus_ens_acc": { option: "opt_ensemble", label: "Atelier musique d'ensemble", cout: 75, labelcout:"ensemble_cout", totalKey: "cout_total_ensemble" },
"cours_particulier": { option: "opt_particulier", label: "Cours particulier", cout: 65, labelcout:"particulier_cout", totalKey: "cout_total_particulier" }
};
for (let i = 1; i <= 5; i++) {
let activiteKey = `personne_${toto}_activite_${i}`;
if (req.session[activiteKey]) {
let activite = req.session[activiteKey];
console.log(`activite = ${req.session[activiteKey]}`);
if (activiteMapping[activite]) {
let { option, label, cout, labelcout, totalKey, gratuit } = activiteMapping[activite];
req.session[`personne_${toto}_${option}`] = label;
console.log(`activite label = ${req.session[`personne_${toto}_${option}`]}`);
if (gratuit !== undefined && req.session[`personne_${toto}_age`] > gratuit) {
req.session[`personne_${toto}_${labelcout}`] = "offert"; // Gratuit pour adultes
} else {
req.session[`personne_${toto}_${labelcout}`] = cout;
req.session[totalKey] += cout;
req.session.cout_total += cout;
}
console.log(`activite cout = ${req.session[`personne_${toto}_${labelcout}`]}`);
}
}
}
// observateur cout par personne
if (req.session["personne_"+toto+"_role"] == "observateur" && req.session["personne_"+toto+"_profil"] == "non_professeur") {
req.session["personne_"+toto+"_observation_cout"] = 30;
req.session.cout_total_observation += 30;
req.session.cout_total += 30;
nb_observateur ++;
}
// INSTRUMENTISTE PAR PERSONNE
// TARIF DIFFÉRENT SI INSCRIPTION AVANT LE 30/04/2026 pour appliquer la réduction voir ligne // REMISE POUR INSCRIPTION AVANT lE 30 AVRIL
let date1 = new Date('2026-05-01');
let date2 = new Date();
if (req.session["personne_"+toto+"_role"] == "instrumentiste" || req.session["personne_"+toto+"_role"] == "instrumentiste_camp") {
if (req.session["personne_"+toto+"_instrument"]== "alto" || req.session["personne_"+toto+"_instrument"]== "violon" || req.session["personne_"+toto+"_instrument"] == "violoncelle" || req.session["personne_"+toto+"_instrument"] == "flute traversière" || req.session["personne_"+toto+"_instrument"] == "trompette" ) {
req.session["personne_"+toto+"_cours_cout"] = 280;
req.session.cout_total_cours += 280;
req.session.cout_total += 280;
if (req.session["personne_"+toto+"_option_coursindividuel"] == "cours individuel") {
if (req.session["personne_"+toto+"_cahier"]=="Cahier 1" || req.session["personne_"+toto+"_cahier"]=="Cahier 2" || req.session["personne_"+toto+"_cahier"]=="Cahier 3") {
req.session["personne_"+toto+"_coursindividuel_cout"] += 45;
req.session.cout_total_coursparticulier += 45;
req.session.cout_total += 45;
} else {
req.session["personne_"+toto+"_coursindividuel_cout"] += 65;
req.session.cout_total_coursparticulier += 65;
req.session.cout_total += 65;
}
}
if (req.session["personne_"+toto+"_option_decouvrealto"] == "decouvertealto") {
req.session["personne_"+toto+"_option_decouvrealto_cout"] += 35;
req.session.cout_total_option_decouvrealto += 35;
req.session.cout_total += 35;
}
// REMISE POUR FAMILLE NOMBREUSE
// ICI ON COMPTE LE NOMBRE D'INSTRUMENTISTE, APRÈS EN DEHORS DE LA BOUCLE PAR PERSONNE ON DÉDUIRA LA REMISE SUR LE TOTAL
nb_instrumentiste ++;
}
if (req.session["personne_"+toto+"_instrument"]== "piano") {
if (req.session["personne_"+toto+"_cahier"]=="Cahier 1") {
req.session["personne_"+toto+"_cours_cout"] = 300;
req.session.cout_total_cours += 300;
req.session.cout_total += 300;
} else if (req.session["personne_"+toto+"_cahier"]=="Cahier 2" || req.session["personne_"+toto+"_cahier"]=="Cahier 3" || req.session["personne_"+toto+"_cahier"]=="Cahier 4") {
req.session["personne_"+toto+"_cours_cout"] = 315;
req.session.cout_total_cours += 315;
req.session.cout_total += 315;
} else {
req.session["personne_"+toto+"_cours_cout"] = 340;
req.session.cout_total_cours += 340;
req.session.cout_total += 340;
}
// REMISE POUR FAMILLE NOMBREUSE
// ICI ON COMPTE LE NOMBRE D'INSTRUMENTISTE, APRÈS EN DEHORS DE LA BOUCLE PAR PERSONNE ON DÉDUIRA LA REMISE SUR LE TOTAL
nb_instrumentiste ++;
}
// REMISE POUR INSCRIPTION AVANT lE 30 AVRIL
if (date2 < date1) {
req.session.cout_total_cours -= 40;
req.session["personne_"+toto+"_cours_cout"] -= 40;
req.session.cout_total -= 40;
req.session.remise = "Remise pour inscription avant le 30 avril";
}
// ACOMPTE + 150 PAR INSTRUMENTISTE
req.session.montant_accompte += 150;
}
// Y-A-T-IL UN PROF INVITÉ
if (req.session["personne_"+toto+"_role"] == "prof_invite") {
nb_prof_invite ++;
}
// COMBIEN D'ACCOMPAGNANT
if (req.session["personne_"+toto+"_role"] == "accompagnant" || req.session["personne_"+toto+"_role"] == "accompagnant_activite") {
nb_accompagnant ++;
}
}
}
}
/////////////////////////////////
// CAMP ADO
let compteur_ado = 0
logger.info("compteur_ado au départ : " + compteur_ado, { numsession: req.session.id, label: filename});
if (adulte_trouve == "non" && req.session.hebergement == "flocons verts partagé") {
for (let toto = 1; toto < 7; toto++) {
if (req.session["personne_"+toto+"_age"] >= 14 && req.session["personne_"+toto+"_age"] < 18) {
req.session["personne_"+toto+"_profil"] = "Camp ado";
compteur_ado ++;
logger.info("compteur_ado incrémenté : " + compteur_ado, { numsession: req.session.id, label: filename});
} else if (req.session["personne_"+toto+"_age"] < 14) {
req.session.err_mineur = "oui";
logger.info("err_mineur " + req.session.err_mineur, { numsession: req.session.id, label: filename});
}
}
//////////////////////////////////
// VÉRIFICATION DU NOMBRE D'ADO ENCORE DISPO DANS DB
try {
//Query
let sql = 'select campado_capacite, campado_nb_reservation from stn_stage';
logger.info("sql stn_stage : " + sql, { numsession: req.session.id, label: filename});
const [results, fields] = await db_connection_promise.execute(sql);
await db_connection_promise.end();
logger.info("TABLE stn_stage nombre de campado_capacite : " + results[0].campado_capacite, { numsession: req.session.id, label: filename});
logger.info("TABLE stn_stage nombre de campado_nb_reservation : " + results[0].campado_nb_reservation, { numsession: req.session.id, label: filename});
logger.info("results[0].campado_capacite - results[0].campado_nb_reservation = " + (results[0].campado_capacite - results[0].campado_nb_reservation), { numsession: req.session.id, label: filename});
if ((results[0].campado_capacite - results[0].campado_nb_reservation) < compteur_ado) {
req.session.err_campado_capa = "oui";
logger.info("Il n'y a plus de place disponible pour inscrire une personne en Camp Ado", { numsession: req.session.id, label: filename});
}
} catch (error) {
// Echec de connection à la BD
logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id, label: filename});
req.session.err_mail_form_adhesion_1 = "Il y a un problème système connexion base de données, veuillez recommencer.";
req.session.err_mail_form_adhesion_ = error;
res.redirect('/stagenational/identifier');
}
}
req.session.compteur_ado = compteur_ado;
/////////////////////////////////
// CALCUL DU TARIF
if (req.session.err_mineur == "oui" || req.session.err_campado_capa == "oui") {
logger.info("existing session_err_mineur OR req.session.err_campado_capa : " + req.session.err_mineur + " | " + req.session.err_campado_capa, { numsession: req.session.id, label: filename});
res.redirect('/stagenational/formulaire');
} else {
//////////////////////////////////
// SUPPLÉMENT TARIF SI HÉBERGEMENT NON PARTAGÉ
if (req.session.hebergement == "flocons verts non partagé") {
logger.info("nb_personne_hebergement : " + nb_personne_hebergement, { numsession: req.session.id, label: filename});
// Pour 1 personne (par exemple observateur)
if (nb_personne_hebergement == 1) {
req.session.cout_total += (143);
req.session.cout_total_hebergement += (143);
req.session.cout_supplement_hebergement = (143);
}
// Famille de 2 personnes
if (nb_personne_hebergement == 2) {
req.session.cout_total += (60*2);
req.session.cout_total_hebergement += (60*2);
req.session.cout_supplement_hebergement = (60*2);
}
// Famille de 3 personnes
if (nb_personne_hebergement == 3) {
req.session.cout_total += (50*3);
req.session.cout_total_hebergement += (50*3);
req.session.cout_supplement_hebergement = (50*3);
}
// Famille de 4 personnes
if (nb_personne_hebergement == 4) {
req.session.cout_total += (20*4);
req.session.cout_total_hebergement += (20*4);
req.session.cout_supplement_hebergement = (20*4);
}
logger.info("cout_supplement_hebergement : " + req.session.cout_supplement_hebergement, { numsession: req.session.id, label: filename});
}
//////////////////////////////////
// REMISE POUR FAMILLE NOMBREUSE
console.log("nb_instrumentiste = ",nb_instrumentiste)
if (nb_instrumentiste == 2) {
logger.info("//REMISE POUR FAMILLE NOMBREUSE");
req.session.cout_total -= 50;
req.session.remise += " - Remise de 50€ pour famille nombreuse (2 enfants)";
req.session.remise_fn_montant = 50;
};
if (nb_instrumentiste > 2) {
logger.info("//REMISE POUR FAMILLE NOMBREUSE");
req.session.cout_total -= 100;
req.session.remise += " - Remise de 100€ pour famille nombreuse (plus de 3 enfants)";
req.session.remise_fn_montant = 100;
};
//////////////////////////////////
// FRAIS DE DOSIER
// pas de frais pour les profs invités
console.log("nb_prof_invite = ",nb_prof_invite)
if (nb_prof_invite > 0) {
req.session.frais_dossier = 0;
} else {
req.session.frais_dossier = 30;
}
req.session.cout_total += req.session.frais_dossier;
req.session.montant_accompte += req.session.frais_dossier;
//////////////////////////////////
// ACOMPTE
// Si acompte est de 0 on lui met 150 (par ex si c'est un observateur)
console.log("req.session.montant_accompte = ",req.session.montant_accompte)
if (req.session.montant_accompte < 150 && req.session.cout_total > 150 ) {
req.session.montant_accompte = 150;
logger.info("req.session.montant_accompte = " + req.session.montant_accompte, { numsession: req.session.id, label: filename});
}
//////////////////////////////////
// FRAIS bancaire
// 1,5 % (carte standard ou 1,9% carte premium du coup moyenne des 2 : 1,7%) + 0,25 € pour l'Espace économique européen (hors UK)
console.log("req.session.montant_accompte = ",req.session.montant_accompte)
console.log("req.session.datelimitedepass = ",req.session.datelimitedepass)
if (req.session.montant_accompte > 149 && req.session.datelimitedepass === "non") {
req.session.accompte_frais_bancaire = 0.25;
req.session.accompte_frais_bancaire += req.session.montant_accompte * 0.015;
//req.session.accompte_frais_bancaire = Math.round(req.session.accompte_frais_bancaire * 100) / 100;
//req.session.accompte_frais_bancaire = Number(req.session.accompte_frais_bancaire.toFixed(2));
req.session.accompte_frais_bancaire = Math.round(req.session.accompte_frais_bancaire);
req.session.cout_total += req.session.accompte_frais_bancaire;
req.session.montant_accompte += req.session.accompte_frais_bancaire;
}
// RECAP SANS ACOMPTE À PAYER
if (req.session.montant_accompte < 150 || req.session.datelimitedepass === "oui") {
logger.info("REDIRECTION VERS RÉCAP SANS ACOMPTE (montant_accompte) = " + req.session.montant_accompte, { numsession: req.session.id, label: filename});
req.session.montant_accompte = 0;
res.redirect('/stagenational/recap');
}
// RECAP AVEC ACOMPTE À PAYER
if (req.session.montant_accompte > 149 && req.session.datelimitedepass === "non") {
logger.info("REDIRECTION VERS RÉCAP AVEC ACOMPTE (montant_accompte) = " + req.session.montant_accompte, { numsession: req.session.id, label: filename});
res.redirect('/stagenational/recap');
}
}
} else {
logger.info("Votre session est terminé 'onpeutcontinuer' : " + req.session.onpeutcontinuer, { numsession: req.session.id });
req.session.err_mail_form_adhesion_1 = 'Votre session est terminée ("onpeutcontinuer" = non), veuillez recommencer.';
res.redirect('/stagenational/identifier');
}
}
/////////////////////////////////////////////////
// EXPORT DE MODULE POUR QU'IL SOIT LU DANS LES AUTRES FICHIERS JS
/////////////////////////////////////////////////
module.exports = {
SN_checkinfos
}

View File

@@ -0,0 +1,169 @@
/////////////////////////////////////////////////
// APPELS DES MODULES
/////////////////////////////////////////////////
const path = require("path");
/////////////////////////////////////////////////
// APPELS DES MODULES PERSOS
/////////////////////////////////////////////////
// loggings
const logger = require("../../public/js/app/logger_stagenat");
// DB
const { connect_DB_promise } = require('../../modules/db/databaseconnect');
// VÉRIF CODE SECRET
const { verif_codesecret } = require('../../modules/verif_codesecret');
// recherche si identifiant saisie est bien dans la base de données des adhérents
const { checkAdherent } = require('./../../modules/db/checkAdherent');
////////////////////////////////////////////////////
// FILE NAME
////////////////////////////////////////////////////
const filename = path.parse(__filename).base;
/////////////////////////////////////////////////
// PAGE 1
// DOMAIN/stagenational/identifier
//
// SAISIE DE L'IDENTIFIANT : ON LE VÉRIFIE :
// - RECHERCHE SI PERSONNE DÉJA INSCRITE
// - SI NON INSCRITE
// -RECHERCHE SI ADHÉRENTE DANS BD AFPS
//
/////////////////////////////////////////////////
async function SN_checkidentifiant(req, res) {
logger.info("======================================", { label: filename });
logger.info("======== FUNCTION SN_checkidentifiant (STAGE) ==========", { label: filename });
logger.info("======================================", { label: filename });
// un tag pour ne pas ajouter plusieurs fois le même participant en cas de rafraîchissement de la page
req.session.participant_ajoute = "non";
/////////////////////////////////////////////////
// ON RÉCUPÈRE L'IDENTIFIANT SAISIE DANS LE FORMULAIRE
req.session.identifiant = req.body.identifiant;
logger.info("identifiant saisi : " + req.body.identifiant, { numsession: req.session.id, label: filename});
req.session.code_secret = req.body.code_secret;
// ON REGARDE S'il à bien rempli l'identifiant et s'il a coché la case "je ne suis pas adhérent"
if (req.body.identifiant && req.body.check_nonadherent) {
req.session.err_mail_form_adhesion_1 = "Pour vous inscrire au stage, vous devez au préalable être adhérent à l'Association Française pour la Pédagogie Suzuki (AFPS).";
req.session.err_mail_form_adhesion_2 = 'Si vous faites partie d\'une association non française veulliez cocher la case "Je suis adhérent à une Association Suzuki dans un autre pays en renseignant votre identifiant ou votre mail.';
req.session.err_mail_form_adhesion_3 = 'Pour adhérer <a target="_blank" href="https://www.inscription.afpedagogiesuzuki.fr/adhesion/"><span class="souligne">Cliquez ici</span></a>';
res.redirect('/stagenational/identifier');
}
if (!req.body.identifiant && req.body.check_nonadherent) {
req.session.err_mail_form_adhesion_1 = "Pour vous inscrire au stage, vous devez au préalable être adhérent à l'Association Française pour la Pédagogie Suzuki (AFPS).";
req.session.err_mail_form_adhesion_2 = 'Si vous faites partie d\'une association non française veulliez cocher la case "Je suis adhérent à une Association Suzuki dans un autre pays en renseignant votre identifiant ou votre mail.';
req.session.err_mail_form_adhesion_3 = 'Pour adhérer <a target="_blank" href="https://www.inscription.afpedagogiesuzuki.fr/adhesion/"><span class="souligne">Cliquez ici</span></a>';
res.redirect('/stagenational/identifier');
}
if (!req.body.identifiant && !req.body.check_nonadherent) {
req.session.err_mail_form_adhesion_1 = "Veuillez entrer votre identifiant AFPS<br>(Association Française pour la Pédagogie Suzuki),<br><br>ou l'identifiant d'adhésion à votre Association Nationale Suzuki.";
req.session.err_mail_form_adhesion_2 = "Si vous n'êtes pas encore adhérent, vous pouvez adhérer en";
req.session.err_mail_form_adhesion_3 = '<a target="_blank" href="https://www.inscription.afpedagogiesuzuki.fr/adhesion/"><span class="souligne">Cliquez ici</span></a>';
res.redirect('/stagenational/identifier');
}
// SAISIE OK ON PEUT CONTINUER
if (req.body.identifiant && !req.body.check_nonadherent) {
// EST-CE QUE L'IDENTIFIANT SAISI EST DÉJA INSCRIT AU STAGE TABLE stn_adherent
// CONNECTION DB PROMISE
try {
//Connexion
const db_connection_promise = await connect_DB_promise();
// DATE LIMITE DEPASSÉE
// on regarde d'abord s'il a le bon code secret
// et ensuite s'il est déjà inscrit au stage ou pas
await verif_codesecret(req, res);
logger.info("req.session.onpeutcontinuer : " + req.session.onpeutcontinuer , { numsession: req.session.id, label: filename});
if (req.session.onpeutcontinuer === "oui") {
// VÉRIFICATION DÉJA INSCRIT AU STAGE OU PAS
let sql = 'select identifiant, association_suzuki, adherent_mail from stn_adherent where identifiant = "' + req.session.identifiant + '" AND statut_suppression = 0';
logger.info("sql stn_adherent : " + sql, { numsession: req.session.id, label: filename});
const [results_checkStagiaire, fields] = await db_connection_promise.execute(sql);
await db_connection_promise.end();
if (results_checkStagiaire.length) {
// DÉJA INSCRIT AU stage
// ON AFFICHE LA PAGE DE SAISIE DE L'IDENTIFIANT AVEC ERREUR "déjà inscrit"
req.session.err_mail_form_adhesion_1 = "L'identifiant <strong>" + req.session.identifiant + "</strong> est déjà inscrit au stage national.";
res.redirect('/stagenational/identifier');
} else {
// NON INSCRIT AU stage
logger.info("Identifant non inscrit au stage : "+req.session.identifiant, { numsession: req.session.id, label: filename});
// IDENTIFIANT SAISIE ET CASE AUTRE PAYS COCHÉ
// ON AFFICHE LA PAGE DU FORMULAIRE DE SAISIE DES INFORMATIONS DE L'INSCRIPTION
if (req.body.identifiant && !req.body.check_nonadherent && req.body.check_autrepays) {
req.session.association_suzuki = "autre pays";
res.redirect('/stagenational/formulaire');
} else {
/////////////////////////////////////////////////
// RECHERCHE SI PERSONNE EST ADHÉRENTE À L'AFPS
// DANS BD ADHESION adherent
sql = 'select identifiant,association_suzuki from adherent where identifiant = "' + req.session.identifiant + '"';
const retour_checkAdherent = await checkAdherent(sql);
if (retour_checkAdherent.error) {
logger.info("Il y a un problème avec la connection à la base de données adherent ! : " + retour_checkAdherent.error, { numsession: req.session.id, label: filename});
req.session.err_mail_form_adhesion_3 = "Il y a un problème système connexion base de données, veuillez recommencer." + retour_checkAdherent.error;
res.redirect('/stagenational/identifier');
} else if (retour_checkAdherent.found) {
// LA PERSONNE EST BIEN ADHÉRENTE
req.session.association_suzuki = retour_checkAdherent.results_checkAdherent.association_suzuki;
logger.info("req.session.association_suzuki : " + retour_checkAdherent.results_checkAdherent.association_suzuki, { numsession: req.session.id, label: filename});
// ON AFFICHE LA PAGE DU FORMULAIRE DE SAISIE DES INFORMATIONS DE L'INSCRIPTION
res.redirect('/stagenational/formulaire');
} else {
// LA PERSONNE N'EST PAS ADHÉRENTE
logger.info("Identifant NON adhérent : " + req.session.identifiant, { numsession: req.session.id, label: filename});
req.session.err_mail_form_adhesion_1 = "L'identifiant saisi n'est pas reconnu comme adhérent de l'Association Française pour la Pédagogie Suzuki (AFPS) pour 2025/2026.";
req.session.err_mail_form_adhesion_2 = 'Vous devez adhérer avant de vous inscrire au stage. Si vous êtes membre d\'une association Suzuki non française, veuillez cocher la case "Je suis adhérent à une Association Suzuki dans un autre pays" et renseigner votre identifiant ou votre adresse e-mail.';
req.session.err_mail_form_adhesion_3 = 'Pour adhérer à l\'Association Française pour la Pédagogie Suzuki, <a target="_blank" href="https://www.inscription.afpedagogiesuzuki.fr/adhesion/"><span class="souligne">cliquez ici</span></a>';
res.redirect('/stagenational/identifier');
}
}
}
} else {
logger.info("Votre session est terminé 'onpeutcontinuer' : " + req.session.onpeutcontinuer, { numsession: req.session.id });
//req.session.err_mail_form_adhesion_3 = 'Votre session est terminée ("onpeutcontinuer" = non), veuillez recommencer.';
res.redirect('/stagenational/identifier');
}
} catch (error) {
// Echec de connection à la BD
logger.error("Il y a un problème avec la connection à la base de données stn_adherent ! : " + error, { numsession: req.session.id });
req.session.err_mail_form_adhesion_3 = "Il y a un problème système connexion base de données, veuillez recommencer.";
res.redirect('/stagenational/identifier');
}
}
}
/////////////////////////////////////////////////
// EXPORT DE MODULE POUR QU'IL SOIT LU DANS LES AUTRES FICHIERS JS
/////////////////////////////////////////////////
module.exports = {
SN_checkidentifiant
}

View File

@@ -0,0 +1,223 @@
/////////////////////////////////////////////////
// APPELS DES MODULES
/////////////////////////////////////////////////
const path = require("path");
// CALCUL DE DATE
const moment = require('moment');
// STRIPE
const stripe = require('stripe')(process.env.STRIPE_STN_PRIVATE_KEY);
/////////////////////////////////////////////////
// APPELS DES MODULES PERSOS
/////////////////////////////////////////////////
// loggings
const logger = require("../../public/js/app/logger_stagenat");
// DB
const { connect_DB_promise } = require('../../modules/db/databaseconnect');
// VÉRIF CODE SECRET
const { verif_codesecret } = require('../../modules/verif_codesecret');
////////////////////////////////////////////////////
// FILE NAME
////////////////////////////////////////////////////
const filename = path.parse(__filename).base;
/////////////////////////////////////////////////
// PAGE 3 - clic sur payer acompte
// DOMAIN/stagenational/recap
//
// Ajout informations base de données
//
/////////////////////////////////////////////////
const post_payer_accompte = async function(req, res, next) {
logger.info("======================================");
logger.info("======== FUNCTION post_payer_acompte (STAGE) ==========");
logger.info("======================================");
/////////////////////////////////////////////////
// VARIABLES
/////////////////////////////////////////////////
let saison = "2025/2026";
moment.locale('fr');
let now = moment().format("YYYY-MM-DD HH:mm:ss");
let sql;
let table;
let champs;
let values;
// SI DATE LIMITE D'INSCRIPTION DÉPASSÉE ON vérifie que le code secret est bien ok
await verif_codesecret(req, res);
logger.info("req.session.onpeutcontinuer : " + req.session.onpeutcontinuer , { numsession: req.session.id, label: filename});
if (req.session.onpeutcontinuer === "oui") {
/////////////////////////////////////////////////
// SI IDENTIFIANT PERDU
/////////////////////////////////////////////////
logger.info("req.session.identifiant : " + req.session.identifiant , { numsession: req.session.id, label: filename});
if (req.session.identifiant === undefined) {
logger.info("IDENTIFIANT PERDU", { numsession: req.session.id });
req.session.err_mail_form_adhesion_1 = "Session expirée, veuillez recommencer";
res.redirect('/stagenational/identifier');
} else {
/////////////////////////////////////////////////
// AJOUT DANS LA BASE DE DONNÉES
/////////////////////////////////////////////////
try {
//Connexion
let db_connection_promise = await connect_DB_promise();
/////////////////////////////////////////////////
// AJOUT PARTICIPANTS
for (let toto = 1; toto < 7; toto++) {
if (req.session["personne_"+toto+"_nom"]) {
// QUERY ADD stn_participant
table = "stn_participant";
champs = `
identifiant, date_maj, stn_part_nom, stn_part_prenom, prise_charge_famille,
stn_part_date_naiss, stn_part_age, stn_part_profilage, stn_role, stn_profil,
stn_transport, stn_arret, instrument, instrument_ensemble, instrument_collectif, cahier, piece,
prof_nom, prof_mail, concert_solo_piece, concert_solo_cahier, cours_individuel,
decouverte_alto, option_choral, option_rythmique, option_eveil, option_collectif,
option_ensemble, option_particulier, cout_hebergement, cout_transport, eveil_cout,
dalcroze_cout, collectif_cout, ensemble_cout, particulier_cout, observation_cout,
cours_cout, coursindividuel_cout, decouvrealto_cout, chant_cout, statut_suppression
`;
values = `
"${req.session.identifiant}", "${now}", "${req.session[`personne_${toto}_nom`]}",
"${req.session[`personne_${toto}_prenom`]}", "${req.session[`personne_${toto}_prise_charge_nom`]}",
"${req.session[`personne_${toto}_datenaissance`]}", "${req.session[`personne_${toto}_age`]}",
"${req.session[`personne_${toto}_profilage`]}", "${req.session[`personne_${toto}_role`]}",
"${req.session[`personne_${toto}_profil`]}", "${req.session[`personne_${toto}_transport_mode`]}",
"${req.session[`personne_${toto}_transport_arret`]}", "${req.session[`personne_${toto}_instrument`]}",
"${req.session[`personne_${toto}_instrument_ensemble`]}", "${req.session[`personne_${toto}_instrument_collectif`]}", "${req.session[`personne_${toto}_cahier`]}",
"${req.session[`personne_${toto}_piece`]}", "${req.session[`personne_${toto}_prof`]}",
"${req.session[`personne_${toto}_mail_prof`]}", "${req.session[`personne_${toto}_option_concertsolo_piece`]}",
"${req.session[`personne_${toto}_option_concertsolo_cahier`]}", "${req.session[`personne_${toto}_option_coursindividuel`]}",
"${req.session[`personne_${toto}_option_decouvrealto`]}", "${req.session[`personne_${toto}_opt_chantchoral`]}",
"${req.session[`personne_${toto}_opt_dalcroze`]}", "${req.session[`personne_${toto}_opt_eveil`]}",
"${req.session[`personne_${toto}_opt_collectif`]}", "${req.session[`personne_${toto}_opt_ensemble`]}",
"${req.session[`personne_${toto}_opt_particulier`]}", "${req.session[`personne_${toto}_cout_hebergement`]}",
"${req.session[`personne_${toto}_cout_transport`]}", "${req.session[`personne_${toto}_eveil_cout`]}",
"${req.session[`personne_${toto}_dalcroze_cout`]}", "${req.session[`personne_${toto}_collectif_cout`]}",
"${req.session[`personne_${toto}_ensemble_cout`]}", "${req.session[`personne_${toto}_particulier_cout`]}",
"${req.session[`personne_${toto}_observation_cout`]}", "${req.session[`personne_${toto}_cours_cout`]}",
"${req.session[`personne_${toto}_coursindividuel_cout`]}", "${req.session[`personne_${toto}_option_decouvrealto_cout`]}",
"${req.session[`personne_${toto}_chant_cout`]}", 0
`;
sql = 'INSERT INTO ' + table + ' (' + champs + ') VALUES (' + values + ')';
const [results_stn_participant, fields] = await db_connection_promise.execute(sql);
logger.info("stn_participant Row ID added : " + results_stn_participant.insertId, { numsession: req.session.id, label: filename});
}
}
/////////////////////////////////////////////////
// AJOUT DB INFORMATIONS ADHÉRENTS
// QUERY ADD stn_adherent
table = "stn_adherent";
champs = `
identifiant, association_suzuki, saison, date_maj, adherent_nom, adherent_prenom,
adherent_telephone, adherent_mail, adherent_adresse_rue, adherent_adresse_complement,
adherent_adresse_codepostal, adherent_adresse_ville, adherent_adresse_pays,
stn_hebergement, stn_commentaire, acompte_initial, cout_hebergement, cout_transport,
cout_cours, cout_coursparticulier, cout_decouvertealto, cout_option_surplace,
cout_chantchoral, cout_dalcroze, cout_total_collectif, cout_total_ensemble,
cout_total_particulier, cout_eveil, cout_observation, frais_dossier, frais_bancaire,
remise_famille_nombreuse, cout_total, statut_reservation, statut_suppression
`;
values = `
"${req.session.identifiant}", "${req.session.association_suzuki}", "${saison}", "${now}",
"${req.session.adherent_nom}", "${req.session.adherent_prenom}", "${req.session.adherent_telephone}",
"${req.session.adherent_mail}", "${req.session.adherent_adresse_rue}", "${req.session.adherent_adresse_complement}",
"${req.session.adherent_adresse_codepostal}", "${req.session.adherent_adresse_ville}", "${req.session.adherent_adresse_pays}",
"${req.session.hebergement}", "${req.session.commentaire_adherent}", ${req.session.montant_accompte},
${req.session.cout_total_hebergement}, ${req.session.cout_total_transport}, ${req.session.cout_total_cours},
${req.session.cout_total_coursparticulier}, ${req.session.cout_total_option_decouvrealto},
${req.session.cout_total_dalcroze_surplace}, ${req.session.cout_total_chant}, ${req.session.cout_total_dalcroze},
${req.session.cout_total_collectif}, ${req.session.cout_total_ensemble}, ${req.session.cout_total_particulier},
${req.session.cout_total_eveil}, ${req.session.cout_total_observation}, ${req.session.frais_dossier},
${req.session.accompte_frais_bancaire}, ${req.session.remise_fn_montant}, ${req.session.cout_total}, "attente", 0
`;
sql = `INSERT INTO ${table} (${champs}) VALUES (${values})`;
const [results_stn_adherent, fields] = await db_connection_promise.execute(sql);
logger.info("stn_adherent Row ID added : " + results_stn_adherent.insertId, { numsession: req.session.id, label: filename});
await db_connection_promise.end();
if (req.session.montant_accompte > 100) {
/////////////////////////////////////////////////
// STRIPE - ETAPE 1 - CREER l'INTENTION DE PAIEMENT
logger.info("======================================", { label: filename });
logger.info("======== ENVOIE VERS STRIPE ==========", { label: filename });
logger.info("======================================", { label: filename });
const session = await stripe.checkout.sessions.create({
metadata: {identifiant: req.session.identifiant, compteur_ado: req.session.compteur_ado, code_secret: req.session.code_secret},
customer_email: req.session.adherent_mail,
submit_type: 'pay',
success_url: process.env.STRIPE_SN_SUCCESSURL,
cancel_url: process.env.STRIPE_SN_CANCELURL,
payment_method_types: ['card'],
line_items: [{
price_data: {
currency: 'eur',
product_data: {
name: 'Stage national AFPS acompte',
},
unit_amount: req.session.montant_accompte * 100,
},
quantity: 1,
},],
//Checkout has three modes: payment, subscription, or setup.
mode: 'payment'
});
res.redirect(session.url)
}
if (req.session.montant_accompte < 100) {
res.redirect('/stagenational/paiement_reussi');
}
} catch (error) {
// Echec de connection à la BD
logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id, label: filename});
req.session.err_mail_form_adhesion_1 = '"Il y a un problème système connexion base de données, veuillez recommencer, "' + error;
res.redirect('/stagenational/identifier');
}
}
} else {
req.session.err_mail_form_adhesion_1 = 'Votre session est terminée ("onpeutcontinuer" = non), veuillez recommencer.';
res.redirect('/stagenational/identifier');
}
}
/////////////////////////////////////////////////
// EXPORT DE MODULE POUR QU'IL SOIT LU DANS LES AUTRES FICHIERS JS
/////////////////////////////////////////////////
module.exports = {
post_payer_accompte
}

View File

@@ -0,0 +1,910 @@
/////////////////////////////////////////////////
// APPELS DES MODULES
/////////////////////////////////////////////////
const path = require("path");
// CALCUL DE DATE
const moment = require('moment');
// CONNECTION BASE DE DONNÉES
const mysql_promise = require('mysql2/promise');
// STRIPE
const stripe = require('stripe')(process.env.STRIPE_STN_PRIVATE_KEY);
/////////////////////////////////////////////////
// APPELS DES MODULES PERSOS
/////////////////////////////////////////////////
// loggings
const logger = require("../../public/js/app/logger_stagenat");
// DB
const { connect_DB_promise } = require('../../modules/db/databaseconnect');
////////////////////////////////////////////////////
// FILE NAME
////////////////////////////////////////////////////
const filename = path.parse(__filename).base;
/////////////////////////////////////////////////
// APPELS DES FONCTIONS
/////////////////////////////////////////////////
const envoie_mail = require("./../../modules/envoie_mail");
/////////////////////////////////////////////////
// GOOGLE SHEET PARAMETERS
/////////////////////////////////////////////////
const { GoogleSpreadsheet } = require('google-spreadsheet');
const GS_creds_stagean = require('../../inscriptionsafps-53b60452f63d.json');
const { error, log } = require("console");
const GS_stagean = new GoogleSpreadsheet(process.env.gsheet_stagenat);
/////////////////////////////////////////////////
// PAGE 4 - RETOUR PAIEMENT REUSSI
// DOMAIN/stagenational/paiement_reussi?id={CHECKOUT_SESSION_ID}
//
//
/////////////////////////////////////////////////
const SN_accompte_reussi = async function(req, res){
logger.info("======================================", { label: filename });
logger.info("======== FUNCTION SN_accompte_reussi (STAGE) ==========", { label: filename });
logger.info("======================================", { label: filename });
// VARIABLES
let compteur_ado;
let CB_retour;
let stripe_retour;
let pasdecodesecret;
// DATE
moment().format();
moment.locale('fr');
let now = moment().format("YYYY-MM-DD HH:mm:ss");
if (req.session.montant_accompte < 100) {
logger.info("req.session.montant_accompte : " + req.session.montant_accompte, { numsession: req.session.id, label: filename});
} else {
//////////////////////////////////////////////////////////////////////////////
// RETOUR STRIPE
let id = req.query.id;
const session_stripe = await stripe.checkout.sessions.retrieve(id);
let customer_email = session_stripe.customer_email;
req.session.adherent_mail = customer_email;
let payment_status = session_stripe.payment_status;
let amount_total = session_stripe.amount_total/100;
let stripe_customer = session_stripe.customer;
let stripe_payment_intent = session_stripe.payment_intent;
let payment_method_types = session_stripe.payment_method_types;
let stripe_status = session_stripe.status;
let identifiant = session_stripe.metadata.identifiant;
if (session_stripe.metadata.code_secret) {
req.session.code_secret = session_stripe.metadata.code_secret;
pasdecodesecret = "non";
} else {
pasdecodesecret = "oui";
}
logger.info("pasdecodesecret : " + pasdecodesecret, { numsession: req.session.id, label: filename});
req.session.identifiant = identifiant;
compteur_ado = session_stripe.metadata.compteur_ado;
CB_retour = "identifiant_adherent:"+identifiant+",payment_status:"+payment_status+",stripe_customer:"+stripe_customer+",stripe_payment_intent:"+stripe_payment_intent+",sessionID:"+session_stripe.id+",payment_method_types:"+payment_method_types+",amount_total:"+amount_total+",stripe_status:"+stripe_status;
stripe_retour = session_stripe.id;
logger.info("customer_email : " + customer_email, { numsession: req.session.id, label: filename});
logger.info("payment_status : " + payment_status, { numsession: req.session.id, label: filename});
}
logger.info("req.session.code_secret : " + req.session.code_secret, { numsession: req.session.id, label: filename});
//////////////////////////////////////////////////////////////////////////////
// MAJ infos paiements DB
// CODE_SECRET MAJ utilisé
/////////////////////////////////////////////////
// une vérification pour ne pas ajouter plusieurs fois le même participant en cas de rafraîchissement de la page
logger.info("req.session.participant_ajoute : " + req.session.participant_ajoute, { numsession: req.session.id, label: filename});
if (req.session.participant_ajoute === "oui") {
req.session.err_mail_form_adhesion_1 = "Votre session est terminée, veuiller redémarrer votre navigateur.";
res.redirect('/stagenational/identifier');
} else {
//Query MAJ infos paiements DB
try {
let db_connection_promise = await connect_DB_promise();
// Query MAJ stn_adherent
let sql = 'UPDATE ';
sql += 'stn_adherent';
sql += ' SET ';
if (req.session.montant_accompte < 100) {
sql += 'statut_paiement_acompte = "sans_acompte", ';
} else {
sql += 'stripe_retour = "' + CB_retour + '", ';
sql += 'statut_paiement_acompte = "paye", ';
}
sql += 'statut_reservation = "confirme"';
sql += ' WHERE identifiant = "' + req.session.identifiant + '" AND statut_suppression = 0';
//logger.info("sql UPDATE stn_adherent : " + sql, { numsession: req.session.id, label: filename});
const [results, fields] = await db_connection_promise.execute(sql);
logger.info("Row stn_adherent UPDATE payé: " + results.changedRows, { numsession: req.session.id, label: filename});
// Query MAJ Compteur ado stn_stage
let sql1 = 'UPDATE ';
sql1 += 'stn_stage';
sql1 += ' SET ';
if (req.session.montant_accompte < 100) {
sql1 += 'campado_nb_reservation = campado_nb_reservation + ' + req.session.compteur_ado + '';
} else {
sql1 += 'campado_nb_reservation = campado_nb_reservation + ' + compteur_ado + '';
}
const [results1, fields1] = await db_connection_promise.execute(sql1);
logger.info("Row stn_stage UPDATE compteur ado: " + results1.changedRows, { numsession: req.session.id, label: filename});
// Query Récupération des infos pour copie dans Google Sheet + envoie du mail
// adhérent
let sql2 = 'select * from ';
sql2 += 'stn_adherent';
sql2 += ' WHERE identifiant = "' + req.session.identifiant + '" AND statut_suppression = 0';
const [results2, fields2] = await db_connection_promise.execute(sql2);
logger.info("Row stn_adherent SELECT : " + results2.length, { numsession: req.session.id, label: filename});
// participants
let sql3 = 'SELECT stn_adherent.identifiant, stn_adherent.association_suzuki, stn_adherent.saison, stn_adherent.date_maj, stn_adherent.adherent_nom, stn_adherent.adherent_prenom, stn_adherent.adherent_telephone, stn_adherent.adherent_mail, stn_adherent.stn_hebergement, stn_adherent.cout_hebergement, stn_participant.ID_participant, stn_participant.stn_part_nom, stn_participant.stn_part_prenom, stn_participant.prise_charge_famille, stn_participant.stn_part_date_naiss, stn_participant.stn_part_age, stn_participant.stn_part_profilage, stn_participant.stn_role, stn_participant.stn_profil, stn_participant.stn_transport, stn_participant.stn_arret, stn_participant.instrument, stn_participant.instrument_ensemble, stn_participant.instrument_collectif, stn_participant.cahier, stn_participant.piece, stn_participant.prof_nom, stn_participant.prof_mail, stn_participant.concert_solo_piece, stn_participant.concert_solo_cahier, stn_participant.cours_individuel, stn_participant.decouverte_alto, stn_participant.option_choral, stn_participant.option_rythmique, stn_participant.option_eveil, stn_participant.option_collectif, stn_participant.option_ensemble, stn_participant.option_particulier, stn_participant.cout_hebergement, stn_participant.cout_transport, stn_participant.cours_cout, stn_participant.eveil_cout, stn_participant.dalcroze_cout, stn_participant.collectif_cout, stn_participant.ensemble_cout, stn_participant.particulier_cout, stn_participant.observation_cout, stn_participant.coursindividuel_cout, stn_participant.decouvrealto_cout, stn_participant.chant_cout FROM stn_participant JOIN stn_adherent ON stn_participant.identifiant = stn_adherent.identifiant WHERE stn_participant.identifiant = "' + req.session.identifiant + '" AND stn_participant.statut_suppression = 0';
const [results3, fields3] = await db_connection_promise.execute(sql3);
logger.info("Row stn_participant SELECT nombre de participants : " + results3.length, { numsession: req.session.id, label: filename});
// QUERY MAJ CODE SECRET = "utilise"
if (pasdecodesecret === "oui") {
logger.info("PAS DE CODE SECRET", { numsession: req.session.id, label: filename});
} else {
let sql_codesecret = 'UPDATE ';
sql_codesecret += 'code';
sql_codesecret += ' SET ';
sql_codesecret += 'date_suppression = "' + now +'", ';
sql_codesecret += 'statut = "utilise"';
sql_codesecret += ' WHERE code = "' + req.session.code_secret + '"';
logger.info("sql_codesecret : " + sql_codesecret, { numsession: req.session.id, label: filename});
const [resultscodesecret, fieldscodesecret] = await db_connection_promise.execute(sql_codesecret);
await db_connection_promise.end();
logger.info("Row code secret update : " + resultscodesecret.changedRows, { numsession: req.session.id, label: filename});
}
//////////////////////////////////////////////////////////////////////////////
// PRÉPARATION PAGE PAIEMENT RÉUSSI
res.locals.identifiant = req.session.identifiant;
res.locals.association_suzuki = results2[0].association_suzuki;
if (results2[0].stn_hebergement == 'flocons verts partagé') {
res.locals.hebergement = "Centre les Flocons Verts - hébergement partagé";
}
if (results2[0].stn_hebergement == 'flocons verts non partagé') {
res.locals.hebergement = "Centre les Flocons Verts - hébergement non partagé";
res.locals.cout_total_hebergement = results2[0].cout_hebergement;
}
if (results2[0].stn_hebergement == 'independant') {
res.locals.hebergement = "indépendant";
}
for (let toto = 0; toto<(results3.length); toto++) {
if (results3[toto].prise_charge_famille === "undefined") {results3[toto].prise_charge_famille = ""};
if (results3[toto].instrument_ensemble === "undefined") {results3[toto].instrument_ensemble = ""};
if (results3[toto].instrument_collectif === "undefined") {results3[toto].instrument_collectif = ""};
res.locals[`personne_${toto}_numero`] = toto + 1;
res.locals[`personne_${toto}_nom`] = results3[toto].stn_part_nom;
if (results3[toto].prise_charge_famille) {
res.locals[`personne_${toto}_prise_charge_nom`] = results3[toto].prise_charge_famille;
}
res.locals[`personne_${toto}_prenom`] = results3[toto].stn_part_prenom;
logger.info(`Participant prénom : ${results3[toto].stn_part_prenom}`, {
numsession: req.session.id,
label: filename
});
res.locals[`personne_${toto}_profilage`] = results3[toto].stn_part_profilage;
// AFFICHER ACTIVITÉ
if (results3[toto].stn_role === 'accompagnant_activite_enfant') {
res.locals[`personne_${toto}_role`] = "Accompagnant enfant avec activité";
} else if (results3[toto].stn_role === 'accompagnant') {
res.locals[`personne_${toto}_role`] = "accompagnant sans activité";
} else if (results3[toto].stn_role === 'accompagnant_activite_adulte') {
res.locals[`personne_${toto}_role`] = "accompagnant adulte avec activité";
} else if (results3[toto].stn_role === 'instrumentiste_camp') {
res.locals[`personne_${toto}_role`] = "instrumentiste";
} else if (results3[toto].stn_role === 'prof_invite') {
res.locals[`personne_${toto}_role`] = "professeur invité";
} else {
res.locals[`personne_${toto}_role`] = results3[toto].stn_role;
}
if (results3[toto].stn_profil === 'professeur') {
res.locals[`personne_${toto}_profil`] = "professeur";
} else if (results3[toto].stn_profil === 'non_professeur') {
res.locals[`personne_${toto}_profil`] = "accompagnant";
} else if (results3[toto].stn_profil === 'Camp ado') {
res.locals[`personne_${toto}_profil`] = "Camp ado";
}
// AFFICHER MODE DE TRANSPORT
if (results3[toto].stn_transport === 'independant') {
res.locals[`personne_${toto}_transport_mode`] = "indépendant";
} else {
res.locals[`personne_${toto}_transport_mode`] = "car";
}
if (results3[toto].stn_arret === 'arret_7_quai_lassagne_lyon') {
res.locals[`personne_${toto}_transport_arret`] = "7 quai Lassagne Lyon";
} else if (results3[toto].stn_arret === 'arret_partdieu_lyon') {
res.locals[`personne_${toto}_transport_arret`] = "Gare Part Dieu Lyon";
}
// AFFICHER INSTRUMENT
res.locals[`personne_${toto}_instrument`] = results3[toto].instrument;
res.locals[`personne_${toto}_instrument_ensemble`] = results3[toto].instrument_ensemble;
res.locals[`personne_${toto}_instrument_collectif`] = results3[toto].instrument_collectif;
res.locals[`personne_${toto}_cahier`] = results3[toto].cahier;
res.locals[`personne_${toto}_option_concertsolo_cahier`] = results3[toto].concert_solo_cahier;
res.locals[`personne_${toto}_option_concertsolo_piece`] = results3[toto].concert_solo_piece;
res.locals[`personne_${toto}_option_decouvrealto`] = results3[toto].decouverte_alto;
// OPTIONS
res.locals[`personne_${toto}_dalcroze`] = results3[toto].option_rythmique;
res.locals[`personne_${toto}_choral`] = results3[toto].option_choral;
res.locals[`personne_${toto}_eveil`] = results3[toto].option_eveil;
res.locals[`personne_${toto}_collectif`] = results3[toto].option_collectif;
res.locals[`personne_${toto}_ensemble`] = results3[toto].option_ensemble;
res.locals[`personne_${toto}_particulier`] = results3[toto].option_particulier;
// AFFICHER COUT
res.locals[`personne_${toto}_cout_hebergement`] = results3[toto].cout_hebergement;
res.locals[`personne_${toto}_cout_transport`] = results3[toto].cout_transport;
res.locals[`personne_${toto}_eveil_cout`] = results3[toto].eveil_cout;
res.locals[`personne_${toto}_collectif_cout`] = results3[toto].collectif_cout;
res.locals[`personne_${toto}_ensemble_cout`] = results3[toto].ensemble_cout;
res.locals[`personne_${toto}_particulier_cout`] = results3[toto].particulier_cout;
res.locals[`personne_${toto}_dalcroze_cout`] = results3[toto].dalcroze_cout;
res.locals[`personne_${toto}_chant_cout`] = results3[toto].chant_cout;
res.locals[`personne_${toto}_observation_cout`] = results3[toto].observation_cout;
res.locals[`personne_${toto}_cours_cout`] = results3[toto].cours_cout;
res.locals[`personne_${toto}_coursindividuel_cout`] = results3[toto].coursindividuel_cout;
res.locals[`personne_${toto}_option_decouvrealto_cout`] = results3[toto].decouvrealto_cout;
}
res.locals.cout_total = results2[0].cout_total;
res.locals.frais_dossier = results2[0].frais_dossier;
res.locals.remise = results2[0].remise_famille_nombreuse;
res.locals.accompte_frais_bancaire = results2[0].frais_bancaire;
res.locals.montant_accompte = results2[0].acompte_initial;
//////////////////////////////////////////////////////////////////////////////
// AJOUT INFOS DANS GOOGLE SHEET
try {
await GS_stagean.useServiceAccountAuth(GS_creds_stagean);
await GS_stagean.loadInfo();
let GS_stagean_Adherents = GS_stagean.sheetsByTitle['Adherents'];
let GS_stagean_Paiements = GS_stagean.sheetsByTitle['Paiements'];
let GS_stagean_Car = GS_stagean.sheetsByTitle['Car'];
let GS_stagean_Flocons_verts = GS_stagean.sheetsByTitle['Flocons_verts'];
let GS_stagean_CampAdo = GS_stagean.sheetsByTitle['CampAdo'];
let GS_stagean_professeurs = GS_stagean.sheetsByTitle['Professeurs'];
let GS_stagean_Inscription_cours = GS_stagean.sheetsByTitle['Inscription_cours'];
logger.info("identifiant stocké from stripe avant insert GS : " + req.session.identifiant, { numsession: req.session.id, label: filename});
await GS_stagean_Adherents.addRows (
[
{
ID_adherent: results2[0].ID_adherent,
saison: results2[0].saison,
date: moment(results2[0].date_maj).format("YYYY-MM-DD HH:mm:ss"),
identifiant: req.session.identifiant,
association_suzuki: results2[0].association_suzuki,
adherent_nom: results2[0].adherent_nom.toUpperCase(),
adherent_prenom: results2[0].adherent_prenom,
adherent_mail: results2[0].adherent_mail,
adherent_telephone: "'" + results2[0].adherent_telephone,
adherent_adresse_rue: results2[0].adherent_adresse_rue,
adherent_adresse_complement: results2[0].adherent_adresse_complement,
adherent_adresse_codepostal: results2[0].adherent_adresse_codepostal,
adherent_adresse_ville: results2[0].adherent_adresse_ville,
adherent_adresse_pays: results2[0].adherent_adresse_pays,
commentaire: results2[0].stn_commentaire
}
]
);
if (results2[0].cout_total > 0) {
await GS_stagean_Paiements.addRows (
[
{
ID_adherent: results2[0].ID_adherent,
date: moment(results2[0].date_maj).format("YYYY-MM-DD HH:mm:ss"),
identifiant: req.session.identifiant,
adherent_nom: results2[0].adherent_nom.toUpperCase(),
adherent_prenom: results2[0].adherent_prenom,
adherent_mail: results2[0].adherent_mail,
cout_hebergement: results2[0].cout_hebergement,
cout_transport: results2[0].cout_transport,
cout_cours: results2[0].cout_cours,
cout_coursparticulier: results2[0].cout_coursparticulier,
cout_decouvertealto: results2[0].cout_decouvertealto,
cout_chantchoral: results2[0].cout_chantchoral,
cout_dalcroze: results2[0].cout_dalcroze,
cout_eveil: results2[0].cout_eveil,
cout_cours_collectif: results2[0].cout_total_collectif,
cout_atelier_ensemble: results2[0].cout_total_ensemble,
cout_cour_part_acc: results2[0].cout_total_particulier,
cout_option_surplace: results2[0].cout_option_surplace,
cout_observation: results2[0].cout_observation,
remise_famille_nombreuse: results2[0].remise_famille_nombreuse,
frais_dossier: results2[0].frais_dossier,
frais_bancaire: parseFloat(results2[0].frais_bancaire),
acompte_initial: parseFloat(results2[0].acompte_initial),
statut_paiement_acompte: results2[0].statut_paiement_acompte,
cout_total: parseFloat(results2[0].cout_total)
}
]
);
}
let ajout_gs_Car = [];
let car_trouve = "";
for (let i = 0; i < results3.length; i++) {
if (results3[i].stn_transport === "car") {
ajout_gs_Car.push({
ID_participant: results3[i].ID_participant,
date: moment(results2[0].date_maj).format("YYYY-MM-DD HH:mm:ss"),
identifiant: req.session.identifiant,
participant_nom: results3[i].stn_part_nom.toUpperCase(),
participant_prenom: results3[i].stn_part_prenom,
participant_profilage: results3[i].stn_part_profilage,
adherent_mail: results3[i].adherent_mail,
adherent_telephone: "'" + results3[i].adherent_telephone,
arret: results3[i].stn_arret
});
car_trouve = "oui";
}
}
if (car_trouve === "oui") { await GS_stagean_Car.addRows(ajout_gs_Car);}
let ajout_gs_Flocons_verts = [];
let fv_trouve = "";
for (let i = 0; i < results3.length; i++) {
if (results3[i].stn_hebergement === "flocons verts partagé" || results3[i].stn_hebergement === "flocons verts non partagé") {
if (results3[i].stn_profil === "undefined") {results3[i].stn_profil = ""};
//calcul tranche âge correspondantes aux pré-requis des Flocons verts
let fv_tranche_age = "";
let fv_type_hebergement = "";
if (results3[i].stn_hebergement === "flocons verts partagé") {fv_type_hebergement = "partagé"};
if (results3[i].stn_hebergement === "flocons verts non partagé") {fv_type_hebergement = "non partagé"};
if (results3[i].stn_part_age < 11) {fv_tranche_age = "- 11 ans"};
if (results3[i].stn_part_age > 10) {fv_tranche_age = "+ 11 ans"};
ajout_gs_Flocons_verts.push({
ID_participant: results3[i].ID_participant,
date: moment(results2[0].date_maj).format("YYYY-MM-DD HH:mm:ss"),
identifiant: req.session.identifiant,
participant_nom: results3[i].stn_part_nom.toUpperCase(),
participant_prenom: results3[i].stn_part_prenom,
participant_age: results3[i].stn_part_age,
participant_tranche_age: "'" + fv_tranche_age,
adherent_mail: results3[i].adherent_mail,
adherent_telephone: "'" + results3[i].adherent_telephone,
role: results3[i].stn_role,
profil: results3[i].stn_profil,
type_hebergement: fv_type_hebergement
});
fv_trouve = "oui";
}
}
if (fv_trouve === "oui") { await GS_stagean_Flocons_verts.addRows(ajout_gs_Flocons_verts);}
let ajout_gs_CampAdo = [];
let campado_trouve;
for (let i = 0; i < results3.length; i++) {
if (results3[i].stn_profil === "Camp ado") {
ajout_gs_CampAdo.push({
ID_participant: results3[i].ID_participant,
date: moment(results2[0].date_maj).format("YYYY-MM-DD HH:mm:ss"),
identifiant: req.session.identifiant,
participant_nom: results3[i].stn_part_nom.toUpperCase(),
participant_prenom: results3[i].stn_part_prenom,
participant_age: results3[i].stn_part_age,
adherent_mail: results3[i].adherent_mail,
adherent_telephone: "'" + results3[i].adherent_telephone
});
campado_trouve = "oui";
}
}
if (campado_trouve === "oui") { await GS_stagean_CampAdo.addRows(ajout_gs_CampAdo);}
let ajout_gs_professeurs = [];
let professeurs_trouve = "";
for (let i = 0; i < results3.length; i++) {
if (results3[i].stn_role === "observateur" || results3[i].stn_role === "prof_invite") {
if (results3[i].stn_profil === "undefined") {results3[i].stn_profil = ""};
ajout_gs_professeurs.push({
ID_participant: results3[i].ID_participant,
date: moment(results2[0].date_maj).format("YYYY-MM-DD HH:mm:ss"),
identifiant: req.session.identifiant,
participant_nom: results3[i].stn_part_nom.toUpperCase(),
participant_prenom: results3[i].stn_part_prenom,
participant_profilage: results3[i].stn_part_profilage,
adherent_mail: results3[i].adherent_mail,
adherent_telephone: "'" + results3[i].adherent_telephone,
role: results3[i].stn_role,
profil: results3[i].stn_profil
});
professeurs_trouve = "oui";
}
}
if (professeurs_trouve === "oui") { await GS_stagean_professeurs.addRows(ajout_gs_professeurs);}
let ajout_gs_Inscription_cours = [];
let cours_trouve = "";
for (let i = 0; i < results3.length; i++) {
if (results3[i].stn_role !== "accompagnant" && results3[i].stn_role !== "observateur" && results3[i].stn_role !== "prof_invite") {
if (results3[i].stn_profil === "undefined") {results3[i].stn_profil = ""};
if (results3[i].instrument === "undefined") {results3[i].instrument = ""};
if (results3[i].instrument_ensemble === "undefined") {results3[i].instrument_ensemble = ""};
if (results3[i].instrument_collectif === "undefined") {results3[i].instrument_collectif = ""};
if (results3[i].cahier === "undefined") {results3[i].cahier = ""};
if (results3[i].piece === "undefined") {results3[i].piece = ""};
if (results3[i].prof_nom === "undefined") {results3[i].prof_nom = ""};
if (results3[i].prof_mail === "undefined") {results3[i].prof_mail = ""};
if (results3[i].concert_solo_piece === "undefined") {results3[i].concert_solo_piece = ""};
if (results3[i].concert_solo_cahier === "undefined") {results3[i].concert_solo_cahier = ""};
if (results3[i].cours_individuel === "undefined") {results3[i].cours_individuel = ""};
if (results3[i].cours_individuel === "non") {results3[i].cours_individuel = ""};
if (results3[i].decouverte_alto === "undefined") {results3[i].decouverte_alto = ""};
if (results3[i].decouverte_alto === "non") {results3[i].decouverte_alto = ""};
if (results3[i].option_choral === "undefined") {results3[i].option_choral = ""};
if (results3[i].option_rythmique === "undefined") {results3[i].option_rythmique = ""};
if (results3[i].option_eveil === "undefined") {results3[i].option_eveil = ""};
if (results3[i].option_collectif === "undefined") {results3[i].option_collectif = ""};
if (results3[i].option_ensemble === "undefined") {results3[i].option_ensemble = ""};
if (results3[i].option_particulier === "undefined") {results3[i].option_particulier = ""};
if (results3[i].prise_charge_famille === "undefined") {results3[i].prise_charge_famille = ""};
logger.info(`option ensemble pour participant ${i} : ${results3[i].option_ensemble}`);
ajout_gs_Inscription_cours.push({
ID_participant: results3[i].ID_participant,
date: moment(results2[0].date_maj).format("YYYY-MM-DD HH:mm:ss"),
identifiant: req.session.identifiant,
participant_nom: results3[i].stn_part_nom.toUpperCase(),
participant_prenom: results3[i].stn_part_prenom,
participant_age: results3[i].stn_part_age,
adherent_mail: results3[i].adherent_mail,
adherent_telephone: "'" + results3[i].adherent_telephone,
prise_charge_famille: results3[i].prise_charge_famille,
role: results3[i].stn_role,
profil: results3[i].stn_profil,
instrument: results3[i].instrument,
instrument_ensemble: results3[i].instrument_ensemble,
instrument_collectif: results3[i].instrument_collectif,
cahier: results3[i].cahier,
piece: results3[i].piece,
prof_nom: results3[i].prof_nom,
prof_mail: results3[i].prof_mail,
concert_solo_piece: results3[i].concert_solo_piece,
concert_solo_cahier: results3[i].concert_solo_cahier,
cours_individuel: results3[i].cours_individuel,
decouverte_alto: results3[i].decouverte_alto,
option_choral: results3[i].option_choral,
option_rythmique: results3[i].option_rythmique,
option_eveil: results3[i].option_eveil,
option_cours_collectif: results3[i].option_collectif,
option_musique_ensemble: results3[i].option_ensemble,
option_cours_particulier: results3[i].option_particulier
});
cours_trouve = "oui";
}
}
if (cours_trouve === "oui") { await GS_stagean_Inscription_cours.addRows(ajout_gs_Inscription_cours);}
logger.info("AJOUT GOOGLESHEET FIN", { numsession: req.session.id, label: filename});
} catch (error) {
// Echec de connection à la GOOGLE SHEET
logger.error("Il y a un problème avec la connection à Google sheet : " + error, { numsession: req.session.id, label: filename});
req.session.err_mail_form_adhesion_1 = '"Il y a un problème système, "' + error;
res.redirect('/stagenational/identifier');
}
//////////////////////////////////////////////////////////////////////////////
// ENVOIE CONFIRMATION PAR MAIL
let mail_objet = "ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - FACTURE STAGE ANNUEL 2026 - ";
mail_objet += results2[0].adherent_nom;
let mail_html = "<p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'>Cher adhérent,</p><p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'>Félicitations ! Vous êtes désormais inscrit au stage national de lAssociation Française pour la Pédagogie Suzuki (http://www.afpedagogiesuzuki.fr) qui se tiendra du 23 au 28 août 2026.<br><br>En validant l'inscription, vous êtes engagé à payer la totalité du stage avant le 30 juin 2026 selon les modes de paiement décrits ci-dessous.</p>";
mail_html += "<br>";
mail_html += '<p style="color:#E73058;font-size: 13pt; font-family: Arial; text-decoration: none;"><strong>FACTURE</strong></p>';
mail_html += "<p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Coût total : </strong>";
mail_html += results2[0].cout_total + "€";
mail_html += "</p><p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Montant de l'acompte versé :</strong> ";
mail_html += results2[0].acompte_initial + "€";
mail_html += "</p>";
mail_html += "<p style='font-size: 11pt; font-family: Arial; color: #E73058; text-decoration: none;'><strong>RESTE À PAYER :</strong> ";
mail_html += (Math.round((results2[0].cout_total - results2[0].acompte_initial) * 100) / 100) + "€";
mail_html += "</p>";
mail_html += `
<ul>
<li style='font-size: 11pt; font-family: Arial; color: #E73058; text-decoration: none;'>
<strong>Modes de paiement :</strong>
<ul style='font-size: 11pt; font-family: Arial; color: #000; margin-top: 5px;'>
<li style='font-size: 11pt; font-family: Arial; color: #000; margin-top: 5px;'>Virement bancaire : en 1 fois uniquement.
<ul style='font-size: 11pt; font-family: Arial; color: #000; margin-top: 5px;'>
<li style='font-size: 11pt; font-family: Arial; color: #000;'>
Références bancaires de l'AFPS : CRÉDIT AGRICOLE DE SAVOIE, IBAN : FR76 1810 6000 4496 7630 3576 718, BIC: AGRIFRPP881
</li>
</ul>
</li>
<li style='font-size: 11pt; font-family: Arial; color: #000; margin-top: 5px;'>Chèque : en 1 à 3 chèques à lordre de lAFPS. A envoyer en 1 seule fois. (encaissement au plus tard: juin, juillet, août)
<ul style='font-size: 11pt; font-family: Arial; color: #000; margin-top: 5px;'>
<li style='font-size: 11pt; font-family: Arial; color: #000;'>
Adresse pour envoyer les chèques : Anne PAGES / AFPS, 30, rue des Tattes, 74 500 PUBLIER
</li>
</ul>
</li>
<li style='font-size: 11pt; font-family: Arial; color: #000; margin-top: 5px;'>Chèques vacances ANCV (papier) : à lordre de “Ternélia, les flocons verts”. Les ANCV dématérialisés ne sont pas acceptés. Veuillez indiquer le montant qui sera payé en ANCV. (Attention : pour que les chèques soient utilisables, il faut aussi joindre la partie détachable du chèque.)
</li>
</ul>
</li>
</ul>`;
mail_html += `<br><p style='font-size: 11pt; font-family: Arial; text-decoration: none;'><strong>DÉTAILS :</strong>`;
mail_html += "<p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Identifiant Suzuki : </strong>";
mail_html += req.session.identifiant;
mail_html += "</p><p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Association Suzuki : </strong>";
mail_html += results2[0].association_suzuki;
mail_html += "</p><p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Mode d'hébergement : </strong>";
mail_html += res.locals.hebergement;
mail_html += "</p><br>";
for (let toto = 0; toto<(results3.length); toto++) {
if (results3[toto].stn_part_nom) {
mail_html += "<p style='font-size: 11pt; font-family: Arial; color: #07475A; text-decoration: underline;'><strong>PARTICIPANT ";
mail_html += toto + 1;
mail_html += "</strong></p>";
mail_html += "<p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong style='color:#0D6A87'>Nom : </strong>";
mail_html += results3[toto].stn_part_nom;
mail_html += " ";
mail_html += results3[toto].stn_part_prenom;
if (results3[toto].prise_charge_famille) {
mail_html += "</p><p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong style='color:#E73058'>Prise en charge par une autre famille : </strong>";
mail_html += results3[toto].prise_charge_famille;
}
mail_html += "</p><p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong style='color:#0D6A87'>Profile âge : </strong>";
mail_html += results3[toto].stn_part_profilage;
mail_html += "</p><p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong style='color:#0D6A87'>Catégorie : </strong>";
if (results3[toto].stn_role == 'accompagnant_activite_adulte') {
mail_html += "accompagnant adulte avec activité";
} else if (results3[toto].stn_role == 'accompagnant') {
mail_html += "accompagnant sans activité";
} else if (results3[toto].stn_role == 'accompagnant_activite_enfant') {
mail_html += "Accompagnant enfant avec activité";
} else if (results3[toto].stn_role == 'instrumentiste_camp') {
mail_html += "instrumentiste";
} else if (results3[toto].stn_role == 'prof_invite') {
mail_html += "professeur invité";
} else {
mail_html += results3[toto].stn_role;
}
if (results3[toto].stn_profil == 'professeur') {
mail_html += " - professeur";
}
if (results3[toto].stn_profil == 'non_professeur') {
mail_html += " - accompagnant";
}
if (results3[toto].stn_profil == 'Camp ado') {
mail_html += " - Camp ado";
}
mail_html += "</p><p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong style='color:#0D6A87'>Mode de transport : </strong>";
mail_html += res.locals["personne_"+toto+"_transport_mode"];
if (results3[toto].stn_arret == 'arret_7_quai_lassagne_lyon') {
mail_html += " - 7 quai Lassagne Lyon";
}
if (results3[toto].stn_arret == 'arret_partdieu_lyon') {
mail_html += " - Gare Part Dieu Lyon";
}
mail_html += "</p>";
if (results3[toto].instrument) {
mail_html += "<p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong style='color:#0D6A87'>Instrument : </strong>";
mail_html += results3[toto].instrument;
mail_html += " ";
mail_html += results3[toto].cahier;
mail_html += "</p>";
}
if (results3[toto].instrument_ensemble) {
mail_html += "<p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong style='color:#0D6A87'>Instrument option atelier musique d'ensemble: </strong>";
mail_html += results3[toto].instrument_ensemble;
mail_html += "</p>";
}
if (results3[toto].instrument_collectif) {
mail_html += "<p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong style='color:#0D6A87'>Instrument option atelier cours collectif: </strong>";
mail_html += results3[toto].instrument_collectif;
mail_html += "</p>";
}
if (results3[toto].cours_individuel === "cours individuel") {
mail_html += "<p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong style='color:#0D6A87'>Option cours particulier :</strong> oui</p>";
}
if (results3[toto].decouverte_alto === "decouvertealto") {
mail_html += "<p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong style='color:#0D6A87'>Option découverte alto : </strong>oui</p>";
}
if (results3[toto].concert_solo_cahier && (results3[toto].concert_solo_cahier.startsWith("Cahier") || results3[toto].concert_solo_cahier.startsWith("Hors"))) {
mail_html += "<p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong style='color:#0D6A87'>Option concert solo :</strong> ";
mail_html += results3[toto].concert_solo_piece;
mail_html += " - ";
mail_html += results3[toto].concert_solo_cahier;
mail_html += "</p>";
}
if (results3[toto].option_choral === "chant choral") {
//mail_html += `<p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Option chant choral :</strong> ${results3[toto].chant_cout} </p>`;
if (results3[toto].chant_cout > 0) {
mail_html += "<p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Coût option chant choral : </strong>";
mail_html += results3[toto].chant_cout;
mail_html += "€</p>";
} else {
mail_html += "<p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Coût option chant choral : </strong> Offert</p>";
}
}
if (results3[toto].option_rythmique === "rythmique Dalcroze") {
mail_html += `<p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Option rythmique Dalcroze :</strong> ${results3[toto].dalcroze_cout}</p>`;
}
if (results3[toto].option_eveil === "éveil musical") {
mail_html += `<p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Option éveil musical :</strong> ${results3[toto].eveil_cout}</p>`;
}
if (results3[toto].option_collectif === "Cours collectif Suzuki") {
mail_html += `<p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Option Cours collectif Suzuki :</strong> ${results3[toto].collectif_cout}</p>`;
}
if (results3[toto].option_ensemble === "Atelier musique d'ensemble") {
mail_html += `<p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Option Atelier musique d'ensemble :</strong> ${results3[toto].ensemble_cout}</p>`;
}
if (results3[toto].option_particulier === "Cours particulier") {
mail_html += `<p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Cours particuliers :</strong> ${results3[toto].particulier_cout}</p>`;
}
if (results3[toto].cout_hebergement > 0 && res.locals.hebergement == "Centre les Flocons Verts - hébergement partagé") {
mail_html += "<p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Coût hébergement :</strong> ";
mail_html += results3[toto].cout_hebergement;
mail_html += "€</p>";
}
if (results3[toto].cout_transport > 0) {
mail_html += "<p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Coût transport :</strong> ";
mail_html += results3[toto].cout_transport;
mail_html += "€</p>";
}
if (results3[toto].cours_cout > 0) {
mail_html += "<p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Coût cours : </strong>";
mail_html += results3[toto].cours_cout;
mail_html += "€</p>";
}
if (results3[toto].coursindividuel_cout > 0) {
mail_html += "<p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Option cours particulier : </strong>";
mail_html += results3[toto].coursindividuel_cout;
mail_html += "€</p>";
}
if (results3[toto].decouvrealto_cout > 0) {
mail_html += "<p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Coût option découverte de l'alto : </strong>";
mail_html += results3[toto].decouvrealto_cout;
mail_html += "€</p>";
}
if (results3[toto].observation_cout > 0) {
mail_html += "</p><p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Coût observation :</strong> ";
mail_html += results3[toto].observation_cout;
mail_html += "€</p>";
}
mail_html += "<br>";
}
}
mail_html += "<br>";
mail_html += "<p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Le coût total comprend : </strong>les frais de dossier, les Frais bancaires de l'acompte, lhébergement, le transport et les cours :</p>";
if (res.locals.hebergement == "Centre les Flocons Verts - hébergement non partagé") {
mail_html += `<p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Coût hébergement avec supplément "non partagé" :</strong> ${results2[0].cout_hebergement}€</p>`;
}
if (results2[0].frais_dossier > 0) {
mail_html += "</p><p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Frais de dossier :</strong> ";
mail_html += results2[0].frais_dossier + "€";
}
mail_html += "</p><p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Frais bancaire de l'acompte :</strong> ";
mail_html += results2[0].frais_bancaire + "€";
if (results2[0].remise_famille_nombreuse > 0) {
mail_html += "</p><p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Remise famille nombreuse :</strong> ";
mail_html += results2[0].remise_famille_nombreuse + "€";
}
mail_html += `<p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Coût total :</strong> ${results2[0].cout_total}€</p>`;
mail_html += "</p><p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Montant de l'acompte versé :</strong> ";
mail_html += results2[0].acompte_initial + "€";
mail_html += "</p>";
mail_html += "<p style='font-size: 11pt; font-family: Arial; color: #E73058; text-decoration: none;'><strong>RESTE À PAYER :</strong> ";
mail_html += (Math.round((results2[0].cout_total - results2[0].acompte_initial) * 100) / 100) + "€";
mail_html += "</p>";
mail_html += "<br><p style='font-size: 11pt; font-family: Arial; text-decoration: none;'>En pièce jointe vous trouverez la brochure détaillée du stage.";
if (results2[0].cout_option_surplace > 0) {
mail_html += "<br><p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Coût activité Dalcroze adulte à payer sur place :</strong> ";
mail_html += results2[0].cout_option_surplace;
mail_html += "€</p>";
}
mail_html += "<p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'><br>Nous vous remercions pour votre intérêt et vous souhaitons un très bon stage !</p><br><p style='font-size: 11pt; font-family: Arial; color: #454343; text-decoration: none;'>Association Française pour la Pédagogie Suzuki<br>Anne-Laure SAUVEGRAIN<br>Pôle organisation du stage<br>Siret association : 507 569 952 00033</p>";
let OUTPUT = path.resolve(__dirname, "../../pdf/stage_national/documents/")+"/stage_national_tarifs_2026.pdf";
let attachment_name = "stage_national_tarifs_2026.pdf"
let mailOptions = {
from: 'afps.inscription@gmail.com',
to: req.session.adherent_mail,
subject: mail_objet,
html: mail_html,
attachments: [{
filename: attachment_name,
path: OUTPUT
}],
};
envoie_mail.envoie_mail(mailOptions);
//////////////////////////////////////////////////////////////////////////////
// un tag pour ne pas ajouter plusieurs fois le même participant en cas de rafraîchissement de la page
//////////////////////////////////////////////////////////////////////////////
req.session.participant_ajoute = "oui";
//////////////////////////////////////////////////////////////////////////////
// AFFICHAGE PAGE PAIEMENT RÉUSSI
//////////////////////////////////////////////////////////////////////////////
res.render('stagenat/page_templates/paiement_reussi.ejs');
} catch (error) {
// Echec de connection à la BD
logger.error("Il y a un problème avec la connection à la base de données : " + error, { numsession: req.session.id, label: filename});
req.session.err_mail_form_adhesion_1 = '"Il y a un problème système, "' + error;
res.redirect('/stagenational/identifier');
}
}
}
/////////////////////////////////////////////////
// RETOUR PAIEMENT ECHOUE
// CLICK SUR BOUTON RECOMMENCER
const SN_accompte_annule = async function(req, res) {
logger.info("======================================");
logger.info("======== FUNCTION SN_acompte_echoue (STAGE) ==========");
logger.info("======================================");
//////////////////////////////////////////////////////////////////////////////
// RETOUR STRIPE
let id = req.query.id;
console.log(`STRIP ID = ${id}`);
const session_stripe = await stripe.checkout.sessions.retrieve(id);
let customer_email = session_stripe.customer_email;
let payment_status = session_stripe.payment_status;
let amount_total = session_stripe.amount_total/100;
let stripe_customer = session_stripe.customer;
let stripe_payment_intent = session_stripe.payment_intent;
let payment_method_types = session_stripe.payment_method_types;
let stripe_status = session_stripe.status;
let identifiant = session_stripe.metadata.identifiant;
let CB_retour = "identifiant_adherent:"+identifiant+",payment_status:"+payment_status+",stripe_customer:"+stripe_customer+",stripe_payment_intent:"+stripe_payment_intent+",sessionID:"+session_stripe.id+",payment_method_types:"+payment_method_types+",amount_total:"+amount_total+",stripe_status:"+stripe_status;
let stripe_retour = session_stripe.id;
logger.info("payment_status : " + payment_status, { numsession: req.session.id });
//////////////////////////////////////////////////////////////////////////////
// MAJ annulé DB
try {
//Connexion
let db_connection_promise = await connect_DB_promise();
/// Vérifier que le paiement n'existe pas déjà
/// pour ne pas faire le traitement 2 fois en cas de rafraichissement de la page
let sql0 = 'select identifiant from ca_adherent where stripe_retour = "' + stripe_retour + '"';
const [results0, fields0] = await db_connection_promise.execute(sql0);
logger.info("Row ca_adherent stripe_retour : " + results0.length, { numsession: req.session.id, label: filename});
if (results0.length < 1) {
//Query MAJ stn_adherent
let sql = 'UPDATE ';
sql += 'stn_adherent';
sql += ' SET ';
sql += 'identifiant = concat(identifiant, ID_adherent), ';
sql += 'stripe_retour = "' + CB_retour + '", ';
sql += 'statut_paiement_acompte = "non paye", ';
sql += 'statut_reservation = "annule", ';
sql += 'statut_suppression = 1';
sql += ' WHERE identifiant = "' + identifiant + '" AND statut_suppression = 0';
logger.info("sql UPDATE stn_adherent : " + sql, { numsession: req.session.id, label: filename});
const [results, fields] = await db_connection_promise.execute(sql);
logger.info("Row stn_adherent UPDATE STRIPE: " + results.changedRows, { numsession: req.session.id, label: filename});
//Query MAJ stn_participant
let sql1 = 'UPDATE ';
sql1 += 'stn_participant';
sql1 += ' SET ';
sql1 += 'identifiant = concat(identifiant, ID_participant), ';
sql1 += 'statut_suppression = 1';
sql1 += ' WHERE identifiant = "' + identifiant + '" AND statut_suppression = 0';
logger.info("sql UPDATE stn_participant : " + sql1, { numsession: req.session.id, label: filename});
const [results1, fields1] = await db_connection_promise.execute(sql1);
logger.info("Row stn_participant UPDATE suppression: " + results1.changedRows, { numsession: req.session.id, label: filename});
//////////////////////////////////////////////////////////////////////////////
// AFFICHAGE DE LA PAGE ANNULÉ
res.locals.identifiant = identifiant;
res.render('stagenat/page_templates/paiement_annule');
}
} catch (error) {
// Echec de connection à la BD
logger.error("Il y a un problème système : " + error, { numsession: req.session.id });
req.session.err_mail_form_adhesion_1 = '"Il y a un problème système, "' + error;
//await db_connection_promise.end();
res.redirect('/stagenational/identifier');
}
}
/////////////////////////////////////////////////
// EXPORT DE MODULE POUR QU'IL SOIT LU DANS LES AUTRES FICHIERS JS
/////////////////////////////////////////////////
module.exports = {
SN_accompte_reussi,
SN_accompte_annule
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,338 @@
/////////////////////////////////////////////////
// APPELS DES MODULES
/////////////////////////////////////////////////
const path = require("path");
// CALCUL DE DATE
const moment = require('moment');
// uuid
const { v4: uuidv4 } = require('uuid');
const mysql = require('mysql2');
const mysql_promise = require('mysql2/promise');
const fetch = require('node-fetch');
const fs = require('fs/promises');
const nodemailer = require('nodemailer');
/////////////////////////////////////////////////
// APPELS DES MODULES PERSOS
/////////////////////////////////////////////////
// loggings
const logger = require("../public/js/app/logger_adhesion");
// DB
const { connect_DB_promise } = require('../modules/db/databaseconnect');
////////////////////////////////////////////////////
// FILE NAME
////////////////////////////////////////////////////
const filename = path.parse(__filename).base;
/////////////////////////////////////////////////
// FONCTIONS
/////////////////////////////////////////////////
const runSync_prof_strapi = async function(req, res) {
logger.info("======================================", { label: filename });
logger.info("======== FUNCTION sync_prof_strapi ==========", { label: filename });
logger.info("======================================", { label: filename });
// en mode CRON il n'y a pas de session web, donc pas de req.session
const sid = req?.session?.id || "cron";
try {
// ENV requis : STRAPI_URL, STRAPI_TOKEN, DB_HOST, DB_USER, DB_PASSWORD, DB_NAME
const {
DOMAIN_STRAPI,
strapi_token,
db_connection_host,
db_connection_user,
db_connection_password,
db_connection_database
} = process.env;
logger.info(`DOMAIN_STRAPI=${DOMAIN_STRAPI}, strapi_token=${strapi_token}`, { numsession: sid });
const db_connection_promise = await mysql_promise.createConnection({
host: process.env.db_connection_host,
port: process.env.db_connection_port,
user: process.env.db_connection_user,
password: process.env.db_connection_password,
database: process.env.db_connection_database
});
// ==== FONCTION D'AJOUT DES PROFS DANS STRAPI ====
const upsert = async (payload) => {
// 1) chercher par legacy_id
const q = new URLSearchParams({ "filters[adherent_mail][$eq]": payload.data.adherent_mail || "" });
const getUrl = `${DOMAIN_STRAPI}/api/adherent-professeurs?${q.toString()}`;
const r0 = await fetch(getUrl, { headers: { Authorization: `Bearer ${strapi_token}` }});
const j0 = await r0.json();
const found = j0?.data?.[0];
if (found?.id) {
// déjà présent → on NE LÈVE PAS derreur, on signale juste un skip
return { action: "skip_existing", id: found.id };
} else {
const postUrl = `${DOMAIN_STRAPI}/api/adherent-professeurs`;
const r = await fetch(postUrl, {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${strapi_token}`
},
body: JSON.stringify(payload)
});
if (!r.ok) {
const txt = await r.text();
throw new Error(`POST ${postUrl} -> ${r.status} ${txt}`);
}
const j = await r.json();
return { action: "create", id: j?.data?.id };
}
};
// ==== RÉCUPÉRATION DES DONNÉES SUR LES PROFS DANS LA DB ====
const [rows] = await db_connection_promise.query(`
SELECT
ID,
association_suzuki,
adherent_nom,
adherent_prenom,
adherent_mail,
adherent_telephone_mobile,
adherent_prof_instrument1,
adherent_prof_instrument1_esa,
adherent_prof_instrument2,
adherent_prof_instrument2_esa,
adherent_prof_sece,
adherent_prof_ecole1,
adherent_prof_ecole1_mail,
adherent_prof_ecole1_web,
adherent_prof_ecole1_cp,
adherent_prof_ecole1_ville,
adherent_prof_ecole2,
adherent_prof_ecole2_mail,
adherent_prof_ecole2_web,
adherent_prof_ecole2_cp,
adherent_prof_ecole2_ville,
adherent_prof_ecole3,
adherent_prof_ecole3_mail,
adherent_prof_ecole3_web,
adherent_prof_ecole3_adresse,
adherent_prof_ecole3_cp,
adherent_prof_ecole3_ville
FROM adherent_professeur
`);
console.log('rows = ', rows);
// ==== GEO helpers ====
// pour l'ajout de la lat, long et region dans les données de strapi pour le prof
let CP_MAP = null;
async function loadCpMap(filePath = "src/data/cp_region_lat_long.json") {
if (CP_MAP) return CP_MAP;
const buf = await fs.readFile(filePath, "utf8");
CP_MAP = JSON.parse(buf);
return CP_MAP;
}
function normalizeCp(cp) {
if (!cp) return null;
const s = String(cp).trim().replace(/\s+/g, "");
return /^\d{5}$/.test(s) ? s : null;
}
function pickProfPostalCode(cp) {
return (
normalizeCp(cp) || null
);
}
// helper pour convertir en number sûr (gère "48,85" et strings)
const toNum = (v) => {
if (v == null) return null;
const n = (typeof v === "number") ? v : parseFloat(String(v).replace(",", "."));
return Number.isFinite(n) ? n : null;
};
const cpMap = await loadCpMap("src/data/cp_region_lat_long.json");
// ==== AJOUT DES PROFS DANS STRAPI ====
let creates = 0, errors = 0;
let attempted = 0, skipped_existing = 0;
for (const r of rows) {
// 3.1 choisir le CP prioritaire
const cp_1 = pickProfPostalCode(r.adherent_prof_ecole1_cp);
const cp_2 = pickProfPostalCode(r.adherent_prof_ecole2_cp);
const cp_3 = pickProfPostalCode(r.adherent_prof_ecole3_cp);
let geo_lat_1 = null, geo_lng_1 = null, geo_region_1 = null;
let geo_lat_2 = null, geo_lng_2 = null, geo_region_2 = null;
let geo_lat_3 = null, geo_lng_3 = null, geo_region_3 = null;
if (cp_1 && cpMap[cp_1]) {
const meta = cpMap[cp_1];
// tolérance: on ne renseigne que si lat/lng sont présents
geo_lat_1 = toNum(meta.lat);
geo_lng_1 = toNum(meta.lng);
geo_region_1 = meta.region ? String(meta.region) : null;
}
if (cp_2 && cpMap[cp_2]) {
const meta = cpMap[cp_2];
// tolérance: on ne renseigne que si lat/lng sont présents
geo_lat_2 = toNum(meta.lat);
geo_lng_2 = toNum(meta.lng);
geo_region_2 = meta.region ? String(meta.region) : null;
}
if (cp_3 && cpMap[cp_2]) {
const meta = cpMap[cp_3];
// tolérance: on ne renseigne que si lat/lng sont présents
geo_lat_3 = toNum(meta.lat);
geo_lng_3 = toNum(meta.lng);
geo_region_3 = meta.region ? String(meta.region) : null;
}
// 3.2 payload de base
const data = {
legacy_id: r.ID.toString().trim(),
association_suzuki: r.association_suzuki?.trim() || null,
adherent_nom: r.adherent_nom?.trim() || null,
adherent_prenom: r.adherent_prenom?.trim() || null,
adherent_mail: r.adherent_mail?.toString().trim().toLowerCase() || null,
adherent_telephone_mobile: r.adherent_telephone_mobile?.trim() || null,
adherent_prof_instrument1: r.adherent_prof_instrument1?.trim() || null,
adherent_prof_instrument1_niveau: r.adherent_prof_instrument1_esa?.trim() || null,
adherent_prof_instrument2: r.adherent_prof_instrument2?.trim() || null,
adherent_prof_instrument2_niveau: r.adherent_prof_instrument2_esa?.trim() || null,
adherent_prof_sece: r.adherent_prof_sece?.trim() || null,
adherent_prof_ecole1: r.adherent_prof_ecole1?.trim() || null,
adherent_prof_ecole1_mail: r.adherent_prof_ecole1_mail?.trim() || null,
adherent_prof_ecole1_web: r.adherent_prof_ecole1_web?.trim() || null,
adherent_prof_ecole1_cp: r.adherent_prof_ecole1_cp?.trim() || null,
adherent_prof_ecole1_ville: r.adherent_prof_ecole1_ville?.trim() || null,
adherent_prof_ecole2: r.adherent_prof_ecole2?.trim() || null,
adherent_prof_ecole2_mail: r.adherent_prof_ecole2_mail?.trim() || null,
adherent_prof_ecole2_web: r.adherent_prof_ecole2_web?.trim() || null,
adherent_prof_ecole2_cp: r.adherent_prof_ecole2_cp?.trim() || null,
adherent_prof_ecole2_ville: r.adherent_prof_ecole2_ville?.trim() || null,
adherent_prof_ecole3: r.adherent_prof_ecole3?.trim() || null,
adherent_prof_ecole3_mail: r.adherent_prof_ecole3_mail?.trim() || null,
adherent_prof_ecole3_web: r.adherent_prof_ecole3_web?.trim() || null,
adherent_prof_ecole3_adresse: r.adherent_prof_ecole3_adresse?.trim() || null,
adherent_prof_ecole3_cp: r.adherent_prof_ecole3_cp?.trim() || null,
adherent_prof_ecole3_ville: r.adherent_prof_ecole3_ville?.trim() || null,
// >>> Injecte UNIQUEMENT des scalaires, si valides
...(geo_region_1 ? { adherent_prof_ecole1_region: geo_region_1 } : {}),
...(geo_lat_1 != null ? { adherent_prof_ecole1_lat: geo_lat_1 } : {}),
...(geo_lng_1 != null ? { adherent_prof_ecole1_long: geo_lng_1 } : {}),
...(geo_region_2 ? { adherent_prof_ecole1_region: geo_region_2 } : {}),
...(geo_lat_2 != null ? { adherent_prof_ecole1_lat: geo_lat_2 } : {}),
...(geo_lng_2 != null ? { adherent_prof_ecole1_long: geo_lng_2 } : {}),
...(geo_region_3 ? { adherent_prof_ecole1_region: geo_region_3 } : {}),
...(geo_lat_3 != null ? { adherent_prof_ecole1_lat: geo_lat_3 } : {}),
...(geo_lng_3 != null ? { adherent_prof_ecole1_long: geo_lng_3 } : {})
};
// champs obligatoires minimum
if (!data.adherent_mail || !data.adherent_nom || !data.adherent_prenom) {
console.warn(`skip: mail/nom/prenom manquants`);
continue;
}
try {
attempted++;
const res = await upsert({ data });
if (res.action === "create") creates++;
else if (res.action === "skip_existing") skipped_existing++;
} catch (e) {
errors++;
console.error(`ETL error ->`, e.message);
}
}
await db_connection_promise.end();
console.log(`Done. attempted=${attempted} skipped_existing=${skipped_existing} created=${creates} errors=${errors}`);
///////////////////////////////////////////////////////////////////////
// ENVOIE MAIL APRES EXECUTION
logger.info("MAIL MAJ ANNUAIRE PROF ENVOI AVANT", { numsession: sid });
var transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: process.env.nodemailer_user,
pass: process.env.nodemailer_pass
}
});
var mail_objet = "ADUZUKI - CRON MAJ ANNUAIRE PROF";
mail_html = "<p>Pour l'administrateur de l'application ADUZUKI,</p><br><p>Ceci est le mail d'envoi pour confirmer l'exécution du Webhook de mise à jour de l'annuaire des profs qui se fait la nuit à 4h.</p>";
mail_html += "<p>- nombre de <strong>professeurs à ajouter</strong> : ";
mail_html += attempted;
mail_html += "</p>";
mail_html += "<p>- nombre de <strong>professeurs créés</strong> : ";
mail_html += creates;
mail_html += "</p>";
mail_html += "<p>- nombre de <strong>professeurs non ajoutés</strong> pour cause probable de doublon : ";
mail_html += skipped_existing;
mail_html += "</p>";
mail_html += "<p>- nombre d'<strong>erreurs</strong> : ";
mail_html += errors;
mail_html += "</p>";
mail_html += "<br><p>Julie Chaumard</p><p>Développeuse web de l'agence Parisweb.art</p>";
var mailOptions = {
from: 'afps.inscription@gmail.com',
to: "projet@parisweb.art",
subject: mail_objet,
html: mail_html
};
transporter.sendMail(mailOptions, function(error, info){
if (error) {
logger.info("error" + error, { numsession: sid });
} else {
logger.info("Email envoyé: " + info.response, { numsession: sid });
}
});
logger.info("MAIL MAJ ANNUAIRE PROF ENVOI APRES", { numsession: sid });
// --- Réponse HTTP IMMÉDIATE
const retour = {
ok: true,
attempted,
creates,
skipped_existing,
errors
};
logger.info("sync_prof_strapi terminé", { label: filename, numsession: sid });
res.status(200).json(retour);
} catch (e) {
logger.error("sync_prof_strapi FAILED", {
label: filename,
numsession: sid,
message: e.message,
stack: e.stack
});
// Réponse derreur JSON claire
return res.status(500).json({ ok: false, error: e.message });
}
//return { attempted, creates, skipped_existing, errors };
}
/////////////////////////////////////////////////
// EXPORT DE MODULE POUR QU'IL SOIT LU DANS LES AUTRES FICHIERS JS
/////////////////////////////////////////////////
module.exports = {
runSync_prof_strapi
}

View File

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

View File

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

158
controllers/test.js Normal file
View File

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

View File

@@ -0,0 +1 @@
test jujue

View File

@@ -0,0 +1,127 @@
/////////////////////////////////////////////////
// LOGGING
/////////////////////////////////////////////////
const logger = require("../../public/js/app/logger_lienventetemp");
/////////////////////////////////////////////////
// APPELS DES MODULES
/////////////////////////////////////////////////
const moment = require('moment');
const ejs = require('ejs');
const nodemailer = require('nodemailer');
const path = require("path");
const fs = require("fs");
const mysql = require('mysql2');
const mysql_promise = require('mysql2/promise');
////////////////////////////////////////////////////
// FILE NAME
////////////////////////////////////////////////////
const filename = path.parse(__filename).base;
// Configuration de la connexion à la base de données
const dbConfig = {
host: process.env.db_connection_host,
port: process.env.db_connection_port,
user: process.env.db_connection_user,
password: process.env.db_connection_password,
database: process.env.db_connection_database
};
// Stockage des fichiers avec une date d'expiration
const fileLinks = {};
// DATE
moment.locale('fr');
var date_formattee = moment().format('L')
var today = date_formattee;
const generate_link = async function(req, res) {
try {
// CONNEXION A LA BD
const db_connection_promise = await mysql_promise.createConnection(dbConfig);
const linkId = Date.now();
const filePath = path.join(__dirname, 'files', 'film_suzuki_unesco_2024.mp4'); // Chemin du fichier
let expiresAt = new Date(Date.now() + 24 * 60 * 60 * 1000); // 24 heures à partir de maintenant
// Format de la date pour MySQL
expiresAt = expiresAt.toISOString().slice(0, 19).replace('T', ' '); // 'YYYY-MM-DD HH:MM:SS'
const link = `${process.env.DOMAIN_EXTERNE}boutique/unesco/download/${linkId}`;
//const linkId = Date.now(); // Un identifiant unique basé sur le timestamp
//fileLinks[linkId] = {
// filePath: filePath,
// expiresAt: Date.now() + 24 * 60 * 60 * 1000 // 24 heures
//};
sql = 'INSERT INTO TemporaryLinks (id, link, filePath, expiresAt) VALUES ('+ linkId +', "'+ link +'", "'+ filePath +'", "'+ expiresAt +'")';
console.log("sql : ", sql);
const [results, fields] = await db_connection_promise.execute(sql);
// L'ID généré par MySQL est accessible ici
console.log("results.affectedRows : ", results.affectedRows);
console.log("link : ", link);
return link;
} catch (error) {
// Echec de connection à la BD
logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id });
await db_connection_promise.end();
return error;
//return res.status(403).send('Il y a un problème avec la connection à la base de données!');
}
}
const download_file = async function(req, res) {
const linkId = req.params.id;
//const fileData = fileLinks[linkId];
console.log("linkId : ",linkId);
try {
// CONNEXION A LA BD
const db_connection_promise = await mysql_promise.createConnection(dbConfig);
const [rows] = await db_connection_promise.execute(
'SELECT filePath, expiresAt FROM TemporaryLinks WHERE id = ?',
[linkId]
);
console.log("rows.length : ",rows.length);
if (rows.length > 0) {
console.log("rows.expiresAt : ",rows[0].expiresAt);
console.log("today : ",today);
console.log("Date.now() : ",Date.now());
const expiresAt = new Date(rows[0].expiresAt);
console.log("expiresAt : ",expiresAt);
console.log("expiresAt.getTime() : ",expiresAt.getTime());
if (Date.now() < expiresAt.getTime()) {
req.session.filePath = rows[0].filePath;
req.session.expiresAt = rows[0].expiresAt;
res.download(rows[0].filePath, (err) => {
if (err) {
res.status(404).send('File not found');
}
});
} else {
res.status(403).send('Link has expired');
}
} else {
res.status(403).send('Link does not exist');
}
} catch (error) {
// Echec de connection à la BD
logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id });
await db_connection_promise.end();
return error;
}
}
/////////////////////////////////////////////////
// EXPORT DE MODULE POUR QU'IL SOIT LU DANS LES AUTRES FICHIERS JS
/////////////////////////////////////////////////
module.exports = {
generate_link,
download_file
}

View File

@@ -0,0 +1,255 @@
/////////////////////////////////////////////////
// LOGGING
/////////////////////////////////////////////////
const logger = require("../../public/js/app/logger_lienventetemp");
/////////////////////////////////////////////////
// APPELS DES MODULES
/////////////////////////////////////////////////
const moment = require('moment');
const ejs = require('ejs');
const nodemailer = require('nodemailer');
const path = require("path");
const fs = require("fs");
const mysql = require('mysql2');
const mysql_promise = require('mysql2/promise');
////////////////////////////////////////////////////
// FILE NAME
////////////////////////////////////////////////////
const filename = path.parse(__filename).base;
// Envoie mail
const envoie_mail = require("../../modules/envoie_mail");
/////////////////////////////////////////////////
// GOOGLE SHEET PARAMETERS
/////////////////////////////////////////////////
const { GoogleSpreadsheet } = require('google-spreadsheet');
const GS_creds = require('../../inscriptionsafps-53b60452f63d.json');
const { error } = require("console");
// Initialize the sheet - doc ID is the long id in the sheets URL
const GS_boutique = new GoogleSpreadsheet(process.env.gsheet_boutique);
////////////////////////////////////////////////////
// Configuration de la connexion à la base de données
////////////////////////////////////////////////////
const dbConfig = {
host: process.env.db_connection_host,
port: process.env.db_connection_port,
user: process.env.db_connection_user,
password: process.env.db_connection_password,
database: process.env.db_connection_database
};
// OU
const { connect_DB_promise } = require('../../modules/db/databaseconnect');
////////////////////////////////////////////////////
// VARIABLES
////////////////////////////////////////////////////
// Stockage des fichiers avec une date d'expiration
const fileLinks = {};
// DATE
moment.locale('fr');
var date_formattee = moment().format('L')
var today = date_formattee;
////////////////////////////////////////////////////
// Générer le lien temporaire
////////////////////////////////////////////////////
const generate_link = async function(req, res) {
logger.info("======================================", { label: filename });
logger.info("generate_link", { label: filename });
logger.info("======================================", { label: filename });
try {
// CONNEXION A LA BD
const db_connection_promise = await mysql_promise.createConnection(dbConfig);
const linkId = Date.now();
const filePath = path.join(__dirname, 'files', 'film_suzuki_unesco_2024.mp4'); // Chemin du fichier
let expiresAt = new Date(Date.now() + 24 * 60 * 60 * 1000); // 24 heures à partir de maintenant
// Format de la date pour MySQL
expiresAt = expiresAt.toISOString().slice(0, 19).replace('T', ' '); // 'YYYY-MM-DD HH:MM:SS'
const link = `${process.env.DOMAIN_EXTERNE}boutique/unesco/download/${linkId}`;
//const linkId = Date.now(); // Un identifiant unique basé sur le timestamp
//fileLinks[linkId] = {
// filePath: filePath,
// expiresAt: Date.now() + 24 * 60 * 60 * 1000 // 24 heures
//};
let sql = 'INSERT INTO TemporaryLinks (id, link, filePath, expiresAt) VALUES ('+ linkId +', "'+ link +'", "'+ filePath +'", "'+ expiresAt +'")';
console.log("sql : ", sql);
const [results, fields] = await db_connection_promise.execute(sql);
// L'ID généré par MySQL est accessible ici
console.log("results.affectedRows : ", results.affectedRows);
console.log("link : ", link);
return link;
} catch (error) {
// Echec de connection à la BD
logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id });
await db_connection_promise.end();
return error;
//return res.status(403).send('Il y a un problème avec la connection à la base de données!');
}
}
/////////////////////////////////////////////////
// WEBHOOK STRIPE
// APRÈS PAIEMENT PAIEMENT
// ENVOIE Lien temporaire par mail
/////////////////////////////////////////////////
async function wh_stripe_vente_video(req, res, event) {
logger.info("======================================");
logger.info("======== FUNCTION wh_stripe_vente_video ==========");
logger.info("======================================");
moment.locale('fr');
var now = moment().format("DD/MM/YYYY");
var dateheure = moment().format("YYYY-MM-DD HH-mm-ss");
//console.log("event.data.object = ", event.data.object);
//console.log("event.data.object.customer_details.email = ", event.data.object.customer_details.email);
//console.log("event.data.object.customer_details.name = ", event.data.object.customer_details.name);
try {
/////////////////////////////////////////////////
// SI PAIEMENT RÉUSSI
if (event.data.object.payment_status === "paid") {
// GÉNÉRATION DU LIEN DE TÉLÉCHARGEMENT TEMPORAIRE
const linkId = Date.now();
const filePath = path.join(__dirname, 'files', 'film_suzuki_unesco_2024.mp4'); // Chemin du fichier
let expiresAt = new Date(Date.now() + 24 * 60 * 60 * 1000); // 2 heures à partir de maintenant
console.log("Date.now() =", Date.now());
console.log("expiresAt brut =", expiresAt);
// Format de la date pour MySQL
expiresAt = expiresAt.toISOString().slice(0, 19).replace('T', ' '); // 'YYYY-MM-DD HH:MM:SS'
console.log("expiresAt formatée =", expiresAt);
const link = `${process.env.DOMAIN_EXTERNE}boutique/unesco/download/${linkId}`;
//Connexion DB
let db_connection_promise = await connect_DB_promise();
// AJOUT DE LA VENTE DANS LA TABLE " VENTE VIDEOS" DE LA BASE DE DONNÉES ADUZUKI
let sql = `INSERT INTO boutique (date, name, email, produit, originPath, link, expiresAt, montant, status_paiement, stripe) VALUES ('${dateheure}', '${event.data.object.customer_details.name}', '${event.data.object.customer_details.email}', 'Film UNESCO 2024', '${filePath}', '${link}', '${expiresAt}', ${event.data.object.amount_total}/100, '${event.data.object.payment_status}', '${event.data.object.id}')`;
logger.info("#2 sql : " + sql, { numsession: req.session.id, label: filename});
// lancement de la requête
const [result_sql, fields] = await db_connection_promise.execute(sql);
logger.info("#2 result_sql Row ID added : " + result_sql.affectedRows, { numsession: req.session.id, label: filename});
/////////////////////////////////////////////////
// ENVOIE MAIL CONFIRM + JUSTIF
var mail_objet = `ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - ACHAT FILM - ${event.data.object.customer_details.name}`;
var mail_html = `<p>Bonjour,</p><br><p>Suite à l'achat du film du Concert National Suzuki du 21 avril 2024 au Palais de l'UNESCO Paris, voici le lien de téléchargement du fichier vidéo. Ce lien est valable jusqu'au ${expiresAt} : <br> Cliquez sur ce lien pour accéder à la page de téléchargement du film : ${link} </p><br><p>Association Française pour la pédagogie Suzuki</p>`;
var mailOptions = {
from: 'afps.inscription@gmail.com',
to: event.data.object.customer_details.email,
subject: mail_objet,
html: mail_html,
};
envoie_mail.envoie_mail(mailOptions);
/////////////////////////////////////////////////
// AJOUT GOOGLE SHEET
await GS_boutique.useServiceAccountAuth(GS_creds);
await GS_boutique.loadInfo();
let GS_sheet_boutique = GS_boutique.sheetsByTitle['achats'];
await GS_sheet_boutique.addRows (
[
{
date: dateheure,
nom: event.data.object.customer_details.name,
email: event.data.object.customer_details.email,
produit: 'Film UNESCO 2024',
lien: link,
lien_expire_le: expiresAt,
montant: event.data.object.amount_total/100,
statut_paiement: event.data.object.payment_status,
stripe: event.data.object.id
}
]
);
logger.info("AJOUT GOOGLESHEET FIN", { numsession: req.session.id, label: filename});
}
} catch (error) {
// Echec de connection à la BD
logger.error("Il y a un problème avec wh_stripe_vente_video : " + error, { numsession: req.session.id });
return res.status(400).send(`Webhook Error: ${error.message}`);
}
res.json({ received: true });
}
////////////////////////////////////////////////////
// Download le fichier
////////////////////////////////////////////////////
const download_file = async function(req, res) {
logger.info("======================================");
logger.info("======== FUNCTION download_file ==========");
logger.info("======================================");
const link = process.env.DOMAIN_EXTERNE_SS_SLASH+req.originalUrl;
logger.info("link : " + link, { numsession: req.session.id });
try {
// CONNEXION A LA BD pour vérifier l'expiration du lien temporaire et récupérer le lien original pour downloader le fichier
const db_connection_promise = await mysql_promise.createConnection(dbConfig);
// Requête pour récupérer les infos d'après le code contenu dans le lien temporaire
let sql = 'SELECT originPath, expiresAt FROM boutique WHERE link = "'+ link+'"';
logger.info("sql FROM boutique : " + sql, { numsession: req.session.id });
const [rows] = await db_connection_promise.execute(sql);
logger.info("rows.length : " + rows.length, { numsession: req.session.id });
req.session.originPath = rows[0].originPath;
// Si le lien temporaire à été trouvé (grâce au code contenu dans le lien qui est l'id)
if (rows.length > 0) {
logger.info("rows.expiresAt : " + rows[0].expiresAt, { numsession: req.session.id });
logger.info("Date.now() : " + Date.now(), { numsession: req.session.id });
const expiresAt = new Date(rows[0].expiresAt);
req.session.expiresAt = rows[0].expiresAt;
logger.info("expiresAt : " + expiresAt, { numsession: req.session.id });
// SI le lien n'a pas expiré on peut télécharger le fichier
if (Date.now() < expiresAt.getTime()) {
return rows[0].originPath;
} else {
return "Lien expiré"
}
} else {
return "Lien non trouvé"
}
} catch (error) {
// Echec de connection à la BD
logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id });
await db_connection_promise.end();
return error;
}
}
/////////////////////////////////////////////////
// EXPORT DE MODULE POUR QU'IL SOIT LU DANS LES AUTRES FICHIERS JS
/////////////////////////////////////////////////
module.exports = {
generate_link,
download_file,
wh_stripe_vente_video
}

View File

@@ -0,0 +1,170 @@
/////////////////////////////////////////////////
// LOGGING
/////////////////////////////////////////////////
const logger = require("../../public/js/app/logger_lienventetemp");
/////////////////////////////////////////////////
// APPELS DES MODULES
/////////////////////////////////////////////////
const moment = require('moment');
const ejs = require('ejs');
const nodemailer = require('nodemailer');
const path = require("path");
const fs = require("fs");
const mysql = require('mysql2');
const mysql_promise = require('mysql2/promise');
const stripe = require('stripe')(process.env.STRIPE_PRIVATE_KEY);
////////////////////////////////////////////////////
// FILE NAME
////////////////////////////////////////////////////
const filename = path.parse(__filename).base;
////////////////////////////////////////////////////
// Configuration de la connexion à la base de données
////////////////////////////////////////////////////
const dbConfig = {
host: process.env.db_connection_host,
port: process.env.db_connection_port,
user: process.env.db_connection_user,
password: process.env.db_connection_password,
database: process.env.db_connection_database
};
////////////////////////////////////////////////////
// ÉCRAN 2 - PAIEMENT AVEC STRIPE
////////////////////////////////////////////////////
const post_req_stripe = async function(req, res) {
logger.info("======================================");
logger.info("======== FUNCTION post_req_stripe (vente vidéo) ==========");
logger.info("======================================");
logger.info("======== ENVOIE VERS STRIPE ==========", { label: filename });
try {
// STRIPE - ETAPE 1 - CREER l'INTENTION DE PAIEMENT
const session_stripe = await stripe.checkout.sessions.create({
metadata: {app: "vente_video"},
mode: 'payment',
success_url: process.env.STRIPE_VENTEVIDEO_SUCCESSURL,
cancel_url: process.env.STRIPE_VENTEVIDEO_CANCELURL,
line_items: [{
price_data: {
currency: 'eur',
unit_amount: 800,
product_data: {
name: 'Film du Concert National Suzuki',
description: "Concert au Palais de l'UNESCO Paris du 21 avril 2024 (fichier vidéo H264/mp4)",
},
},
quantity: 1,
}]
});
res.redirect(session_stripe.url)
} catch (error) {
// Echec de connection à la BD
logger.error("Il y a un problème avec la connection Stripe post_req_stripe : " + error, { numsession: req.session.id });
req.session.affiche_err_1 = '"Il y a un problème système, veuillez recommencer, "' + error;
res.redirect('/boutique/videos');
}
}
/////////////////////////////////////////////////
// ÉCRAN 3 - RETOUR STRIPE RÉUSSI
/////////////////////////////////////////////////
const ventevideo_accompte_reussi = async function(req, res) {
logger.info("======================================");
logger.info("======== FUNCTION ventevideo_accompte_reussi ==========");
logger.info("======================================");
//////////////////////////////////////////////////////////////////////////////
// RETOUR STRIPE
let id = req.query.id;
console.log("id = ", id);
const session_stripe = await stripe.checkout.sessions.retrieve(id);
let customer_email = session_stripe.customer_email;
let payment_status = session_stripe.payment_status;
let amount_total = session_stripe.amount_total/100;
let stripe_customer = session_stripe.customer;
let stripe_payment_intent = session_stripe.payment_intent;
let payment_method_types = session_stripe.payment_method_types;
let stripe_status = session_stripe.status;
console.log("payment_status = ", payment_status);
console.log("stripe_customer = ", stripe_customer);
console.log("stripe_payment_intent = ", stripe_payment_intent);
console.log("payment_method_types = ", payment_method_types);
console.log("stripe_status = ", stripe_status);
console.log("customer_email = ", customer_email);
//////////////////////////////////////////////////////////////////////////////
// PRÉPARATION PAGE PAIEMENT RÉUSSI
moment.locale('fr');
let now = moment().format("YYYY-MM-DD HH:mm:ss");
res.locals.today = now;
res.locals.montant = amount_total;
res.locals.mail = customer_email;
//////////////////////////////////////////////////////////////////////////////
// AFFICHAGE PAGE PAIEMENT RÉUSSI
//res.render('don/page_templates/don_paiement_reussi.ejs');
//res.status(200).json({
// success: true,
// message: "Retour de STRIPE réussi",
// data: payment_status
//});
res.render('ventevideo/page_templates/ventelien_paiement_reussi');
}
/////////////////////////////////////////////////
// ÉCRAN 3 - RETOUR STRIPE ECHEC
/////////////////////////////////////////////////
const ventevideo_accompte_annule = async function(req, res) {
logger.info("======================================");
logger.info("======== FUNCTION ventevideo_accompte_annule ==========");
logger.info("======================================");
//////////////////////////////////////////////////////////////////////////////
// RETOUR STRIPE
let id = req.query.id;
const session_stripe = await stripe.checkout.sessions.retrieve(id);
let customer_email = session_stripe.customer_email;
let payment_status = session_stripe.payment_status;
let amount_total = session_stripe.amount_total/100;
let stripe_customer = session_stripe.customer;
let stripe_payment_intent = session_stripe.payment_intent;
let payment_method_types = session_stripe.payment_method_types;
let stripe_status = session_stripe.status;
console.log("payment_status = ", payment_status);
console.log("stripe_customer = ", stripe_customer);
console.log("stripe_payment_intent = ", stripe_payment_intent);
console.log("payment_method_types = ", payment_method_types);
console.log("stripe_status = ", stripe_status);
console.log("customer_email = ", customer_email);
//////////////////////////////////////////////////////////////////////////////
// AFFICHAGE PAGE PAIEMENT ANNULÉE
// res.render('don/page_templates/don_paiement_annule.ejs');
//res.status(200).json({
// success: true,
// message: "Retour de STRIPE échec",
// data: payment_status
//);
res.render('ventevideo/page_templates/ventelien_paiement_echec');
}
module.exports = {
post_req_stripe,
ventevideo_accompte_reussi,
ventevideo_accompte_annule
}

View File

@@ -0,0 +1,63 @@
// server.js
//
// Use this sample code to handle webhook events in your integration.
//
// 1) Paste this code into a new file (server.js)
//
// 2) Install dependencies
// npm install stripe
// npm install express
//
// 3) Run the server on http://localhost:4242
// node server.js
// The library needs to be configured with your account's secret key.
// Ensure the key is kept out of any version control system you might be using.
const stripe = require('stripe')('sk_test_...');
const express = require('express');
const app = express();
// This is your Stripe CLI webhook secret for testing your endpoint locally.
const endpointSecret = "whsec_fed56735156a81c3ae36f3bb5dbd4dece5412ba299f55702c5cf077c69ce3a11";
app.post('/webhook', express.raw({type: 'application/json'}), (request, response) => {
const sig = request.headers['stripe-signature'];
let event;
try {
event = stripe.webhooks.constructEvent(request.body, sig, endpointSecret);
} catch (err) {
response.status(400).send(`Webhook Error: ${err.message}`);
return;
}
// Handle the event
switch (event.type) {
case 'checkout.session.async_payment_failed':
const checkoutSessionAsyncPaymentFailed = event.data.object;
// Then define and call a function to handle the event checkout.session.async_payment_failed
break;
case 'checkout.session.async_payment_succeeded':
const checkoutSessionAsyncPaymentSucceeded = event.data.object;
// Then define and call a function to handle the event checkout.session.async_payment_succeeded
break;
case 'checkout.session.completed':
const checkoutSessionCompleted = event.data.object;
// Then define and call a function to handle the event checkout.session.completed
break;
case 'checkout.session.expired':
const checkoutSessionExpired = event.data.object;
// Then define and call a function to handle the event checkout.session.expired
break;
// ... handle other event types
default:
console.log(`Unhandled event type ${event.type}`);
}
// Return a 200 response to acknowledge receipt of the event
response.send();
});
app.listen(4242, () => console.log('Running on port 4242'));

View File

@@ -0,0 +1,98 @@
/////////////////////////////////////////////////
// APPELS DES MODULES
/////////////////////////////////////////////////
const path = require("path");
const stripe = require('stripe')(process.env.STRIPE_PRIVATE_KEY);
/////////////////////////////////////////////////
// APPELS DES MODULES PERSOS
/////////////////////////////////////////////////
// loggings
const logger = require("../public/js/app/logger_whstripe");
// DB
const { connect_DB_promise } = require('../modules/db/databaseconnect');
const { generateInsertSQL, extractValues } = require('../modules/db/sqlqueries');
/////////////////////////////////////////////////
// APPELS DES FONCTIONS
/////////////////////////////////////////////////
// FAIRE UNE PAUSE
const sleep = require("./../modules/sleep");
// Controllers
const { wh_stripe_don } = require("./donController");
const { wh_stripe_vente_video } = require("./vente_video/generate_linkController");
////////////////////////////////////////////////////
// FILE NAME
////////////////////////////////////////////////////
const filename = path.parse(__filename).base;
/////////////////////////////////////////////////
// RECEPTION DU WEBHOOK STRIPE wh_stripe
/////////////////////////////////////////////////
const wh_stripe = async function(req, res) {
logger.info("======================================");
logger.info("======== FUNCTION wh_stripe ==========");
logger.info("======================================");
const sig = req.headers['stripe-signature'];
logger.info("sig = " + sig, { numsession: req.session.id, label: filename});
let event;
const endpointSecret = process.env.STRIPE_WEBHOOK_CLE_SIGNATURE_SECRETE;
try {
event = stripe.webhooks.constructEvent(req.body, sig, endpointSecret);
} catch (err) {
logger.error("Webhook Error: " + err.message, { numsession: req.session.id, label: filename});
return res.status(400).send(`Webhook Error: ${err.message}`);
}
// Gérer les événements webhook
logger.info("event.type = " + event.type, { numsession: req.session.id, label: filename});
logger.info("event.data.object.id = " + event.data.object.id, { numsession: req.session.id, label: filename});
logger.info("event.data.object.app = " + event.data.object.metadata.app, { numsession: req.session.id, label: filename});
logger.info("event.data.object.customer_email = " + event.data.object.customer_email, { numsession: req.session.id, label: filename});
logger.info("event.data.object.payment_status = " + event.data.object.payment_status, { numsession: req.session.id, label: filename});
logger.info("event.data.object.metadata.identifiant = " + event.data.object.metadata.identifiant, { numsession: req.session.id, label: filename});
logger.info("event.data.object.metadata.nom = " + event.data.object.metadata.nom, { numsession: req.session.id, label: filename});
logger.info("event.data.object.metadata.montant = " + event.data.object.metadata.montant, { numsession: req.session.id, label: filename});
logger.info("event.data.object.status = " + event.data.object.status, { numsession: req.session.id, label: filename});
/////////////////////////////////////////////////
// DON
/////////////////////////////////////////////////
switch (event.data.object.metadata.app) {
case "don":
logger.info("WEBHOOK wh_stripe => redirection vers DON wh_stripe_don", { numsession: req.session.id, label: filename});
return wh_stripe_don(req, res, event);
case "vente_video":
logger.info("WEBHOOK wh_stripe => redirection vers VENTE VIDEO wh_stripe_vente_video", { numsession: req.session.id, label: filename});
return wh_stripe_vente_video(req, res, event);
default:
// cas undefined, null, ou autre valeur non prévue
return res.json({ received: true });
}
}
/////////////////////////////////////////////////
// EXPORT DE MODULE POUR QU'IL SOIT LU DANS LES AUTRES FICHIERS JS
/////////////////////////////////////////////////
module.exports = {
wh_stripe
}

View File

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

View File

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

BIN
documentation/ROUTAGES.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 232 KiB

BIN
generatedReceipt.pdf Normal file

Binary file not shown.

41
import_ass_locales.md Normal file
View File

@@ -0,0 +1,41 @@
# DOC IMPORT ASSOCATIONS LOCALES
1. Connexion Google Sheet
2. On copie toutes les lignes dans le tableau GS_asso_locales_rows
3. On compte le nombre de lignes récupérées (Une ligne = une adhésion)
4. Connexion à Adobe API pour pouvoir générer des PDF
5. Connexion à la DB Aduzuki
6. Pour chaque ligne du tableau GS_asso_locales_rows (c'est à dire pour chaque adhésion)
1. Si la ligne n'est pas taguée comme déjà importée (date_export est vide)
2. Insertion en DB de l'adhésion
1. table adherent
2. table adherent_finance
1. si adherent_paiement_montant_don est vide, on met 0
3. table adherent_professeur (si adherent_prof_instrument1 est rempli)
4. table adherent_formation_prof (si adherent_prof_stagiaire_instrument1 est rempli)
5. table adherent_eleve / pour élève 1 (si adherent_eleve1_nom est rempli)
6. table adherent_eleve / pour élève 2 (si adherent_eleve2_nom est rempli)
7. table adherent_eleve / pour élève 3 (si adherent_eleve3_nom est rempli)
8. table adherent_eleve / pour élève 4 (si adherent_eleve4_nom est rempli)
9. table adherent_eleve / pour élève 5 (si adherent_eleve5_nom est rempli)
3. Préparation du PDF pour la carte adhésion et le justificatif de don
1. Définition des profils à ajouter à la carte adhérent pour les rendre plus lisibles
2. Choix du template PDF
1. Si don
1. template PDF carte_adherent_don.docx
2. Si pas de don
1. template PDF carte_adherent.docx
3. Netoyage des champs adresse
4. préparation de la date du jour
5. récupération des données de l'adhérent (du tableau GS_asso_locales_rows) nécessaires à la construction du PDF
6. Création du PDF avec la biblio Adobe PDF
1. enregistrement du PDF dans le dossier ../pdf/adhesion/2526/paye/
4. Envoie du PDF par mail à l'adhérent
1. préparation de nodemailer
2. préparation du nom du fichier à joindre
3. préparation des infos du mail : expéditeur, destinataire, objet, corps
4. envoie du mail
5. Mise à jour du tag "carte adhérent envoyé" dans le DB (table adherent, champ carte_envoi = "definitive")
6. Taguer l'adhérent comme importé dans le tableau Google Sheet
1. préparation de la date d'import
2. écriture dans le Google Sheet, colonne date_export

BIN
juju.pdf Normal file

Binary file not shown.

View File

@@ -1,7 +1,8 @@
function profil(adherent_type) { function profil(adherent_type) {
let profil1, profil2, profil3 ; let profil1, profil2, profil3 ;
console.log ("function profil.adherent_type: ", adherent_type) console.log ("function profil.adherent_type: ", adherent_type);
adherent_type = (adherent_type || "").trim().toLowerCase();
if (adherent_type === "famille") { if (adherent_type === "famille") {
profil1 = "Famille"; profil1 = "Famille";
console.log("profil1 : ", profil1); console.log("profil1 : ", profil1);
@@ -22,29 +23,30 @@ function profil(adherent_type) {
} }
if (adherent_type === "prof_stagiaire") { if (adherent_type === "prof_stagiaire") {
profil1 = "Professeur"; profil1 = "Professeur";
profil2 = "Professeur stagiaire"; profil2 = "Stagiaire ESA";
console.log("profil1 : ", profil1); console.log("profil1 : ", profil1);
console.log("profil2 : ", profil2); console.log("profil2 : ", profil2);
} }
if (adherent_type === "prof_stagiaire_famille") { if (adherent_type === "prof_stagiaire_famille") {
profil1 = "Professeur"; profil1 = "Professeur";
profil2 = "Professeur stagiaire"; profil2 = "Stagiaire ESA";
profil3 = "Élève"; profil3 = "Élève";
console.log("profil1 : ", profil1); console.log("profil1 : ", profil1);
console.log("profil2 : ", profil2); console.log("profil2 : ", profil2);
console.log("profil3 : ", profil3); console.log("profil3 : ", profil3);
} }
if (adherent_type === "prof_stagiaire1") { if (adherent_type === "prof_stagiaire1") {
profil1 = "Professeur stagiaire"; profil1 = "Stagiaire ESA";
console.log("profil1 : ", profil1); console.log("profil1 : ", profil1);
} }
if (adherent_type === "prof_stagiaire1_famille") { if (adherent_type === "prof_stagiaire1_famille") {
profil1 = "Professeur stagiaire"; profil1 = "Stagiaire ESA";
profil2 = "Élève"; profil2 = "Élève";
console.log("profil1 : ", profil1); console.log("profil1 : ", profil1);
console.log("profil2 : ", profil2); console.log("profil2 : ", profil2);
} }
console.log("RETURN profil1 : ", profil1); console.log("RETURN profil1 : ", profil1);
//return profil1; //return profil1;
return [profil1, profil2, profil3]; return [profil1, profil2, profil3];

View File

@@ -0,0 +1,35 @@
/////////////////////////////////////////////////
// LOGGING
/////////////////////////////////////////////////
const logger = require("../../public/js/app/logger_adhesion");
const cron = require('node-cron');
const axios = require('axios');
////////////////////////////////////////////////////
// FILE NAME
////////////////////////////////////////////////////
const path = require("path");
const filename = path.parse(__filename).base;
// URL de la page à lancer pour faire la mise à jour
const URL = "https://inscription.afpedagogiesuzuki.fr/adhesion/sync_prof_strapi";
// Fonction pour envoyer la requête POST
const maj_annuaire = async () => {
try {
const response = await axios.get(URL);
logger.info("annuaire maj avec succès: " + response.status, { numsession:"maj_annuaire", label: filename});
} catch (error) {
logger.error("Erreur lors de la maj de l'annuaire: " + error, { numsession:"maj_annuaire", label: filename});
}
};
// Définir la tâche cron : ici, elle s'exécute toutes les 2 minutes
// cron.schedule('*/2 * * * *', () => {
// Définir la tâche cron : ici, elle s'exécute à 4h du matin
// cron.schedule('0 4 * * *', () => {
cron.schedule('0 4 * * *', () => {
logger.info("MAJ annuaire cron lancée (modules/adhesion/maj_annuaire_prof_site_auto.js)", { numsession:"maj_annuaire", label: filename});
maj_annuaire();
});

View File

@@ -0,0 +1,36 @@
/////////////////////////////////////////////////
// LOGGING
/////////////////////////////////////////////////
const logger = require("../../public/js/app/logger_adhesion");
const path = require("path");
const cron = require('node-cron');
const axios = require('axios');
////////////////////////////////////////////////////
// FILE NAME
////////////////////////////////////////////////////
const filename = path.parse(__filename).base;
// URL du webhook
//const WEBHOOK_URL = "http://localhost:8890/adhesion/maj_googlesheet_auto";
const WEBHOOK_URL = "https://inscription.afpedagogiesuzuki.fr/adhesion/maj_googlesheet_auto";
//const WEBHOOK_URL = process.env.adhesion_maj_gs_webhook_url; //cela ne fonctionne pas
// Fonction pour envoyer la requête POST
const envoyerWebhook = async () => {
try {
const response = await axios.get(WEBHOOK_URL, {});
logger.info("Webhook envoyé avec succès: " + response.status, { numsession:"webhook", label: filename});
} catch (error) {
logger.error("Erreur lors de l'envoi du webhook: " + error.message, { numsession:"webhook", label: filename});
}
};
// Définir la tâche cron : ici, elle s'exécute toutes les 2 minutes
// cron.schedule('*/2 * * * *', () => {
// Définir la tâche cron : ici, elle s'exécute à 3h du matin
// cron.schedule('0 3 * * *', () => {
cron.schedule('0 3 * * *', () => {
logger.info("Envoi du webhook (modules/adhesion/majgs_webhook.js) à l'heure prévue", { numsession:"webhook", label: filename});
envoyerWebhook();
});

View File

@@ -0,0 +1,47 @@
// recherche si identifiant saisie est bien dans la base de données des adhérents
/////////////////////////////////////////////////
// APPELS DES MODULES
/////////////////////////////////////////////////
const path = require("path");
/////////////////////////////////////////////////
// APPELS DES MODULES PERSOS
/////////////////////////////////////////////////
// loggings
const logger = require("../../public/js/app/logger");
// DB
const { connect_DB_promise } = require('../db/databaseconnect');
////////////////////////////////////////////////////
// FILE NAME
////////////////////////////////////////////////////
const filename = path.parse(__filename).base;
async function checkAdherent(sql) {
try {
const connection = await connect_DB_promise();
const [results_checkAdherent] = await connection.execute(sql);
await connection.end();
logger.info("checkAdherent results_checkAdherent.length = " + results_checkAdherent.length, {label: filename});
if (results_checkAdherent.length > 0) {
logger.info("Est adhérent", {label: filename});
return {
found: true,
results_checkAdherent: results_checkAdherent[0],
error: false
};
} else {
logger.info("N'est pas adhérent", {label: filename});
return { found: false, error: false };
}
} catch (error) {
// Echec de connection à la BD
logger.error("Il y a un problème avec la connection à la base de données! : " + error, {label: filename});
return { found: false, error: true };
}
}
module.exports = { checkAdherent };

View File

@@ -0,0 +1,19 @@
/////////////////////////////////////////////////
// APPELS DES MODULES
/////////////////////////////////////////////////
const mysql_promise = require('mysql2/promise');
////////////////////////////////////////////////////
// CONNECTION DB
////////////////////////////////////////////////////
async function connect_DB_promise() {
return mysql_promise.createConnection({
host: process.env.db_connection_host,
port: process.env.db_connection_port,
user: process.env.db_connection_user,
password: process.env.db_connection_password,
database: process.env.db_connection_database
});
}
module.exports = { connect_DB_promise };

33
modules/db/sqlqueries.js Normal file
View File

@@ -0,0 +1,33 @@
/////////////////////////////////////////////////
// APPELS DES MODULES
/////////////////////////////////////////////////
const path = require("path");
/////////////////////////////////////////////////
// APPELS DES MODULES PERSOS
/////////////////////////////////////////////////
// loggings
const logger = require("../../public/js/app/logger");
////////////////////////////////////////////////////
// FILE NAME
////////////////////////////////////////////////////
const filename = path.parse(__filename).base;
// Fonction qui construit de la requête SQL
function generateInsertSQL(tableName, data) {
// On récupère les noms des champs
const columns = Object.keys(data).join(', ');
// on ajoute autant de "?" que de champs
const placeholders = Object.keys(data).map(() => '?').join(', ');
return `INSERT INTO ${tableName} (${columns}) VALUES (${placeholders})`;
}
// Fonction qui récupère la liste des valeurs des champs
function extractValues (data) {
return Object.values(data);
}
module.exports = { generateInsertSQL, extractValues };

31
modules/envoie_mail.js Normal file
View File

@@ -0,0 +1,31 @@
/////////////////////////////////////////////////
// LOGGING
/////////////////////////////////////////////////
const logger = require("../public/js/app/logger");
// ENVOIE MAIL GOOGLE MAIL
const nodemailer = require('nodemailer');
function envoie_mail(mailOptions) {
logger.info("MAIL ENVOI AVANT");
var transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: process.env.nodemailer_user,
pass: process.env.nodemailer_pass
}
});
transporter.sendMail(mailOptions, function(error, info){
if (error) {
logger.info("error" + error);
} else {
logger.info("Email envoyé: " + info.response);
}
});
logger.info("MAIL ENVOI APRES");
}
module.exports = {
envoie_mail
}

62
modules/pdf.js Normal file
View File

@@ -0,0 +1,62 @@
/////////////////////////////////////////////////
// LOGGING
/////////////////////////////////////////////////
const logger = require("../public/js/app/logger_concert");
// ADOBE PDF
const PDFServicesSdk = require('@adobe/pdfservices-node-sdk');
////////////////////////////////////////////////////
// CONNECTION ADOBE API
////////////////////////////////////////////////////
async function pdfgo(OUTPUT, INPUT, JSON_INPUT) {
logger.info("AVANT CREATION DU PDF");
const credentials = PDFServicesSdk.Credentials
.servicePrincipalCredentialsBuilder()
.withClientId(process.env.PDF_SERVICES_CLIENT_ID)
.withClientSecret(process.env.PDF_SERVICES_CLIENT_SECRET)
.build();
const clientConfig = PDFServicesSdk.ClientConfig
.clientConfigBuilder()
.withConnectTimeout(20000)
.withReadTimeout(40000)
.build();
const executionContext = PDFServicesSdk.ExecutionContext.create(credentials);
const documentMerge = PDFServicesSdk.DocumentMerge,
documentMergeOptions = documentMerge.options,
adobe_options = new documentMergeOptions.DocumentMergeOptions(JSON_INPUT, documentMergeOptions.OutputFormat.PDF);
// Create a new operation instance using the options instance.
const documentMergeOperation = documentMerge.Operation.createNew(adobe_options);
// Set operation input document template from a source file.
const input = PDFServicesSdk.FileRef.createFromLocalFile(INPUT);
documentMergeOperation.setInput(input);
// Execute the operation and Save the result to the specified location.
await documentMergeOperation
.execute(executionContext)
.then(result => result.saveAsFile(OUTPUT).then(
)
)
.catch(err => {
if(err instanceof PDFServicesSdk.Error.ServiceApiError
|| err instanceof PDFServicesSdk.Error.ServiceUsageError) {
console.log('Exception encountered while executing ADOBE PDF', err);
} else {
console.log('Exception encountered while executing ADOBE PDF', err);
}
});
logger.info("APRES CREATION DU PDF");
}
module.exports = {
pdfgo
}

12
modules/sleep.js Normal file
View File

@@ -0,0 +1,12 @@
// POUR EVITER DE DÉPASSER LE QUOTA DE GOOGLE API REQUEST PER MINUTE
// ON ATTENDS QUELQUES SECONDES
const wait = function wait(milliseconds){
return new Promise(resolve => {
setTimeout(resolve, milliseconds);
console.log('Dans le sleep');
});
};
module.exports = {
wait
}

0
modules/stripe.js Normal file
View File

View File

@@ -0,0 +1,54 @@
// SI DATE LIMITE D'INSCRIPTION DÉPASSÉE ON vérifie que le code secret est bien ok
/////////////////////////////////////////////////
// APPELS DES MODULES
/////////////////////////////////////////////////
const path = require("path");
/////////////////////////////////////////////////
// APPELS DES MODULES PERSOS
/////////////////////////////////////////////////
// loggings
const logger = require("../public/js/app/logger_stagenat");
// DB
const { connect_DB_promise } = require('../modules/db/databaseconnect');
////////////////////////////////////////////////////
// FILE NAME
////////////////////////////////////////////////////
const filename = path.parse(__filename).base;
async function verif_codesecret(req, res) {
logger.info("/// DÉBUT FONCTION verif_codesecret", { numsession: req.session.id, label: filename});
//Connexion
let db_connection_promise = await connect_DB_promise();
if (req.session.datelimitedepass === "oui") {
logger.info("DATE LIMITE DEPASSÉE", { numsession: req.session.id, label: filename});
// Query
let sql_codesecret = 'select code, statut from code where code = "' + req.session.code_secret + '" AND statut = "actif"';
logger.info("sql_codesecret : " + sql_codesecret, { numsession: req.session.id, label: filename});
const [results_codesecret, fields] = await db_connection_promise.execute(sql_codesecret);
await db_connection_promise.end();
logger.info("results_codesecret.length : " + results_codesecret.length, { numsession: req.session.id, label: filename});
if (results_codesecret.length) {
// on peut continuer
req.session.onpeutcontinuer = "oui"
} else {
// CODE SECRET ERRONÉ
req.session.onpeutcontinuer = "non"
logger.info("Code secret erroné : "+req.session.code_secret, { numsession: req.session.id, label: filename});
// ON AFFICHE LA PAGE DE SAISIE DE L'IDENTIFIANT AVEC ERREUR "déjà inscrit"
req.session.err_mail_form_adhesion_1 = "Le code inscription <strong>" + req.session.code_secret + "</strong> est erroné.";
//res.redirect('/stagenational/identifier');
}
} else {
// on peut continuer
req.session.onpeutcontinuer = "oui"
}
logger.info("/// FIN FONCTION verif_codesecret", { numsession: req.session.id, label: filename});
}
module.exports = {
verif_codesecret
}

View File

@@ -5,7 +5,7 @@
"main": "app.js", "main": "app.js",
"scripts": { "scripts": {
"test": "echo \"Error: no test specified\" && exit 1", "test": "echo \"Error: no test specified\" && exit 1",
"app": "nodemon app.js", "app": "nodemon app_aduzuki.js",
"scss": "sass --watch src/scss/app.scss public/css/app.css", "scss": "sass --watch src/scss/app.scss public/css/app.css",
"start": "npm run app & npm run scss" "start": "npm run app & npm run scss"
}, },
@@ -18,6 +18,7 @@
"author": "juliechaumard.paris", "author": "juliechaumard.paris",
"license": "CC-BY-NC-SA-2.0-FR", "license": "CC-BY-NC-SA-2.0-FR",
"dependencies": { "dependencies": {
"@adobe/pdfservices-node-sdk": "^3.4.2",
"axios": "^1.2.4", "axios": "^1.2.4",
"body-parser": "^1.20.1", "body-parser": "^1.20.1",
"dotenv": "^16.0.3", "dotenv": "^16.0.3",
@@ -28,15 +29,20 @@
"fs": "^0.0.1-security", "fs": "^0.0.1-security",
"google-spreadsheet": "^3.3.0", "google-spreadsheet": "^3.3.0",
"googleapis": "^110.0.0", "googleapis": "^110.0.0",
"htmltopdf-weasyprint": "^1.0.8",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"luxon": "^3.2.1", "luxon": "^3.2.1",
"moment": "^2.29.4", "moment": "^2.29.4",
"mysql2": "^3.6.0",
"node-cron": "^3.0.3",
"node-fetch": "2.7.0",
"nodemailer": "^6.9.0", "nodemailer": "^6.9.0",
"path": "^0.12.7", "path": "^0.12.7",
"pdf-creator-node": "^2.3.5", "pdf-creator-node": "^2.3.5",
"printf": "^0.6.1", "printf": "^0.6.1",
"puppeteer": "^19.6.0", "puppeteer": "^19.6.0",
"stripe": "^11.7.0", "stripe": "^11.7.0",
"uuid": "^10.0.0",
"winston": "^3.8.2", "winston": "^3.8.2",
"winston-daily-rotate-file": "^4.7.1" "winston-daily-rotate-file": "^4.7.1"
}, },

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More