/////////////////////////////////////////////////
// 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;

/////////////////////////////////////////////////
// SAISIE DU MAIL
// VÉRIFIER SI DÉJÀ INSCRIT DANS DB
/////////////////////////////////////////////////
const checkMail = async function(req, res){

  logger.info("======================================");
  logger.info("======== FUNCTION checkMail (adhesion) ==========");
  logger.info("======================================");
  logger.info("req.body.identifiant = " + req.body.identifiant, { numsession: req.session.id });
  logger.info("req.session.id = " + req.session.id, { numsession: req.session.id });

  ////////////////////////////////////////////////////
  // CONNECTION DB PROMISE
  ////////////////////////////////////////////////////
  
  // on doit faire le "await mysql_promise.createConnection" ici car c'est un promise et seul le résultat du promise amène la connection
  // on est donc obligé de le faire au moment où l'on a besoin de la connection et avec un await.
  // on essaie de se connecter à la BD (try)

  try {
    const db_connection_promise = await mysql_promise.createConnection({
      host: process.env.db_connection_host,
      port: process.env.db_connection_port,
      user: process.env.db_connection_user,
      password: process.env.db_connection_password,
      database: process.env.db_connection_database
    });

    logger.info("======================================", { label: filename });
    logger.info("Connected TO DATABASE test with mysql2 PREMISE !", { label: filename });
    logger.info("======================================", { label: filename });
    
    
    // Vérification dans la base de données si l'identifiant ne serait pas déjà inscrit

    // ON RÉCUPÈRE LE MAIL (IDENTIFIANT) SAISIE DANS LE FORMULAIRE
    req.session.identifiant = req.body.identifiant;
  
    // Query table adherent
    let sql = 'SELECT identifiant FROM adherent WHERE identifiant = "' + req.session.identifiant + '" AND saison = "2025/2026"';
    logger.info("SQL = " + sql, { numsession: req.session.id });

    try {
      const [results, fields] = await db_connection_promise.execute(sql);
      logger.info("Nombre de lignes trouvées avec cet identifiant = " + results.length, { numsession: req.session.id, label: filename});

      if (results.length < 1) {
        // adhérent non inscrit
        logger.info("identifiant non inscrit, on va procéder à son inscription", { numsession: req.session.id, label: filename});
        logger.info("Etat case à coché : " + req.body.check_prof, { numsession: req.session.id });

        // Prof coché ?
        if (req.body.check_prof) {
            // Prof coché : on va vers inscription prof
            logger.info("CASE A COCHÉ PROF : coché", { numsession: req.session.id });
            await db_connection_promise.end();
            return res.redirect('/adhesion/adhesion_prof');
        } else {
            // prof non coché : on va vers inscription famille
            logger.info("CASE A COCHÉ PROF : NON coché", { numsession: req.session.id });
            await db_connection_promise.end();
            return res.redirect('/adhesion/adhesion_famille');
        }
      } else {
        // adhérent dajà inscrit
        // affichage message erreur
        logger.info("identifiant déjà inscrit", { numsession: req.session.id, label: filename});
        req.session.err_mail_form_adhesion_1 = "Cette adresse Email est déjà inscrite pour les adhésions 2025/2026.";
        req.session.err_mail_form_adhesion_2 = "Si vous n'aviez pas pu finaliser votre paiement veuillez nous envoyer un chèque ou un virement.";
        req.session.err_mail_form_adhesion_3 = "Pour tout problème veuillez contacter l’Association.";
        
        // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur
        await db_connection_promise.end();
        return res.redirect('/adhesion');
      }
    } catch (error) {
      // Echec de la requête
      logger.error("Il y a un problème avec la requête select identifiant from adherent! : " + error, { numsession: req.session.id });
      req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer.";
      // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur
      await db_connection_promise.end();
      return res.redirect('/adhesion');
    }
  } catch (error) {
    // Echec de connection à la BD
    logger.error("Il y a un problème avec la connection à  la base de données! : " + error, { numsession: req.session.id });
    req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer.";
    // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur
    await db_connection_promise.end();
    return res.redirect('/adhesion');
  }

}

/////////////////////////////////////////////////
// ENREGISTREMENT DES INFOS
// DÉTERMINER LE TYPE D'adhérent
// CALCUL DU PRIX
/////////////////////////////////////////////////
const post_form_adhesion = async function(req, res){
  logger.info("======================================");
  logger.info("======== FUNCTION post_form_adhesion  (adhesion) ==========");
  logger.info("======================================");

  // Controle que l'identifiant ne soit pas vide (en cas de rafraîchissement de la page)
  logger.info("req.session.identifiant = " + req.session.identifiant, { numsession: req.session.id });

  if (req.session.identifiant){

    /////////////////////////////////////////////////
    // RÉCUPÉRATION DES DONNÉES DU FORMULAIRE DE LA SESSION EN COURS

    // INFOS GÉNÉRALES ADHÉRENT
    req.session.adherent_nom = req.body.adherent_nom;
    req.session.adherent_prenom = req.body.adherent_prenom;
    req.session.adherent_adresse_rue = req.body.adherent_adresse_rue;
    req.session.adherent_adresse_complement = req.body.adherent_adresse_complement;
    req.session.adherent_adresse_codepostal = req.body.adherent_adresse_codepostal;
    req.session.adherent_adresse_ville = req.body.adherent_adresse_ville;
    req.session.adherent_adresse_pays = req.body.adherent_adresse_pays;
    req.session.adherent_telephone_mobile = req.body.adherent_telephone_mobile;
    req.session.adherent_telephone_fixe = req.body.adherent_telephone_fixe;
    
    // INFOS PROF
    req.session.adherent_prof_instrument1 = req.body.adherent_prof_instrument1;
    req.session.adherent_prof_instrument1_esa = req.body.adherent_prof_instrument1_esa;
    req.session.adherent_prof_instrument2 = req.body.adherent_prof_instrument2;
    req.session.adherent_prof_instrument2_esa = req.body.adherent_prof_instrument2_esa;
    req.session.adherent_prof_sece = req.body.adherent_prof_sece;
    req.session.adherent_prof_ecole1 = req.body.adherent_prof_ecole1;
    req.session.adherent_prof_ecole1_adresse = req.body.adherent_prof_ecole1_adresse;
    req.session.adherent_prof_ecole1_cp = req.body.adherent_prof_ecole1_cp;
    req.session.adherent_prof_ecole1_ville = req.body.adherent_prof_ecole1_ville;
    req.session.adherent_prof_ecole1_region = req.body.adherent_prof_ecole1_region;
    req.session.adherent_prof_ecole1_mail = req.body.adherent_prof_ecole1_mail;
    req.session.adherent_prof_ecole1_web = req.body.adherent_prof_ecole1_web;
    req.session.adherent_prof_ecole2 = req.body.adherent_prof_ecole2;
    req.session.adherent_prof_ecole2_adresse = req.body.adherent_prof_ecole2_adresse;
    req.session.adherent_prof_ecole2_cp = req.body.adherent_prof_ecole2_cp;
    req.session.adherent_prof_ecole2_ville = req.body.adherent_prof_ecole2_ville;
    req.session.adherent_prof_ecole2_region = req.body.adherent_prof_ecole2_region;
    req.session.adherent_prof_ecole2_mail = req.body.adherent_prof_ecole2_mail;
    req.session.adherent_prof_ecole2_web = req.body.adherent_prof_ecole2_web;
    req.session.adherent_prof_ecole3 = req.body.adherent_prof_ecole3;
    req.session.adherent_prof_ecole3_adresse = req.body.adherent_prof_ecole3_adresse;
    req.session.adherent_prof_ecole3_cp = req.body.adherent_prof_ecole3_cp;
    req.session.adherent_prof_ecole3_ville = req.body.adherent_prof_ecole3_ville;
    req.session.adherent_prof_ecole3_region = req.body.adherent_prof_ecole3_region;
    req.session.adherent_prof_ecole3_mail = req.body.adherent_prof_ecole3_mail;
    req.session.adherent_prof_ecole3_web = req.body.adherent_prof_ecole3_web;

    // INFOS FORMATION DU PROF
    req.session.adherent_prof_stagiaire_instrument1 = req.body.adherent_prof_stagiaire_instrument1;
    req.session.adherent_prof_stagiaire_instrument1_esa = req.body.adherent_prof_stagiaire_instrument1_esa;
    req.session.adherent_prof_stagiaire_instrument1_prof = req.body.adherent_prof_stagiaire_instrument1_prof
    req.session.adherent_prof_stagiaire_instrument2 = req.body.adherent_prof_stagiaire_instrument2;
    req.session.adherent_prof_stagiaire_instrument2_esa = req.body.adherent_prof_stagiaire_instrument2_esa;
    req.session.adherent_prof_stagiaire_instrument2_prof = req.body.adherent_prof_stagiaire_instrument2_prof

    // INFO ÉLÈVES
    for (let i=1; i<6; i++) {
      req.session["eleve_"+i+"_nom"] = req.body["eleve_"+i+"_nom"];
      req.session["eleve_"+i+"_prenom"] = req.body["eleve_"+i+"_prenom"];
      moment.locale('fr');
      if (req.body["eleve_"+i+"_datenaissance"]) {req.session["eleve_"+i+"_datenaissance"] = moment(req.body["eleve_"+i+"_datenaissance"]).format('L')};
      req.session["eleve_"+i+"_instrumentA"] = req.body["eleve_"+i+"_instrumentA"];
      req.session["eleve_"+i+"_instrumentA_cahier"] = req.body["eleve_"+i+"_instrumentA_cahier"];
      req.session["eleve_"+i+"_instrumentA_prof"] = req.body["eleve_"+i+"_instrumentA_prof"];
      req.session["eleve_"+i+"_instrumentB"] = req.body["eleve_"+i+"_instrumentB"];
      req.session["eleve_"+i+"_instrumentB_cahier"] = req.body["eleve_"+i+"_instrumentB_cahier"];
      req.session["eleve_"+i+"_instrumentB_prof"] = req.body["eleve_"+i+"_instrumentB_prof"];
      req.session["eleve_"+i+"_droitimage"] = req.body["eleve_"+i+"_droitimage"];
      req.session["eleve_"+i+"_contactsup_nom"] = req.body["eleve_"+i+"_contactsup_nom"];
      req.session["eleve_"+i+"_contactsup_prenom"] = req.body["eleve_"+i+"_contactsup_prenom"];
      req.session["eleve_"+i+"_contactsup_mail"] = req.body["eleve_"+i+"_contactsup_mail"];
    }
    

    /////////////////////////////////////////////////
    // DÉTERMINER LE TYPE D'ADHÉRENT
    logger.info("// DÉTERMINER LE TYPE D'ADHÉRENT");
    logger.info("req.session.adherent_type = " + req.session.adherent_type, { numsession: req.session.id });

    // req.session.adherent_type est inscrit dans adhesionRouter.js
    if (req.session.adherent_type === "famille") {
        adherent_type = "famille";
    } else if (req.session.adherent_type === "observateur") {
      adherent_type = "observateur";
      logger.info("adherent_type in if observateur = " + adherent_type, { numsession: req.session.id });
    } else {
      // req.session.adherent_type n'est pas inscrit dans adhesionRouter.js
        if (req.session.adherent_prof_instrument1 && !req.session.adherent_prof_stagiaire_instrument1 && !req.session.eleve_1_nom) {
          adherent_type = "professeur";
      }

      if (req.session.adherent_prof_instrument1 && !req.session.adherent_prof_stagiaire_instrument1 && req.session.eleve_1_nom) {
          adherent_type = "prof_famille";
      }

      if (req.session.adherent_prof_stagiaire_instrument1 && req.session.adherent_prof_stagiaire_instrument1 && !req.session.eleve_1_nom) {
          adherent_type = "prof_stagiaire";
      }

      if (req.session.adherent_prof_stagiaire_instrument1 && req.session.adherent_prof_stagiaire_instrument1  && req.session.eleve_1_nom) {
          adherent_type = "prof_stagiaire_famille";
      }

      if (!req.session.adherent_prof_instrument1 && req.session.adherent_prof_stagiaire_instrument1_esa == 'Niveau 1' && !req.session.adherent_prof_stagiaire_instrument2 &&  !req.session.eleve_1_nom) {
          adherent_type = "prof_stagiaire1";
      }

      if (!req.session.adherent_prof_instrument1 && req.session.adherent_prof_stagiaire_instrument1_esa == 'Niveau 1' && !req.session.adherent_prof_stagiaire_instrument2 && req.session.eleve_1_nom) {
          adherent_type = "prof_stagiaire1_famille";
      }
    }
    // req.session.adherent_type n'a pas pu être déterminé
    if (!adherent_type) {
        adherent_type = "non déterminé";
    }
    req.session.adherent_type = adherent_type;
    logger.info("adherent_type : " + adherent_type, { numsession: req.session.id });

    /////////////////////////////////////////////////
    // DATE DE L'ADHÉSION
    let now = moment().format("YYYY-MM-DD HH:mm:ss");

    /////////////////////////////////////////////////
    // CALCUL DU PRIX
    
    if (adherent_type == "professeur" || adherent_type == "prof_famille" || adherent_type == "prof_stagiaire" || adherent_type == "prof_stagiaire_famille") {
        adherent_paiement_montant_adhesion = 42;
    };
    if (adherent_type == "prof_stagiaire1" || adherent_type == "prof_stagiaire1_famille") {
        adherent_paiement_montant_adhesion = 22;
    };
    if (adherent_type == "famille") {
        adherent_paiement_montant_adhesion = 22;
    };
    if (adherent_type == "observateur") {
      adherent_paiement_montant_adhesion = 22;
    };
    if (adherent_type == "non déterminé" || adherent_type == "") {
        adherent_paiement_montant_adhesion = 0;
    };
    logger.info("CALCUL DU PRIX : " + adherent_paiement_montant_adhesion, { numsession: req.session.id });
    //passer la variable dans la session pour la récupérer
    req.session.adherent_paiement_montant_adhesion = adherent_paiement_montant_adhesion;



    // REDIRECTION VERS LA PAGE PAIEMENT
    logger.info("REDIRECTION VERS LA PAGE PAIEMENT", { numsession: req.session.id });
    return res.redirect('/adhesion/adhesion_paiement_total');




  } else {
      logger.info("Identifiant vide, retour page accueil", { numsession: req.session.id });
      req.session.err_mail_form_adhesion_1 = "La page a perdu les informations, veuillez les saisir de nouveau.";
      return res.redirect('/adhesion');
  }


}

/////////////////////////////////////////////////
// AJOUR DU DON DANS LE MONTANT À PAYER
/////////////////////////////////////////////////
const post_form_montant_total = async function(req, res){

    logger.info("======================================");
    logger.info("======== FUNCTION post_form_montant_total  (adhesion) ==========");
    logger.info("======================================");

    // MONTANT TOTAL À PAYER

    //let montant_adhesion = req.session.adherent_paiement_montant_adhesion;
    req.session.adherent_paiement_montant_don = req.body.adherent_paiement_montant_don;
    logger.info("req.body.adherent_paiement_montant_don: " + req.body.adherent_paiement_montant_don, { numsession: req.session.id });
    logger.info("req.session.adherent_paiement_montant_adhesion: " + req.session.adherent_paiement_montant_adhesion, { numsession: req.session.id });
    // parseInt pour rendre la variable en type interger et faire l'addition
    let montant_adhesion = parseInt(req.session.adherent_paiement_montant_adhesion);
    let montant_don = parseInt(req.session.adherent_paiement_montant_don);
    let montant_apayer;
    if (montant_don>0){
        montant_apayer = montant_adhesion + montant_don;
        logger.info("if (montant_don>0)", { numsession: req.session.id });
    } else {
        logger.info("montant_adhesion: " + montant_adhesion, { numsession: req.session.id });
        montant_apayer = montant_adhesion;
        logger.info("else (montant_don>0)", { numsession: req.session.id });
    };
    req.session.montant_apayer = montant_apayer;
    logger.info("montant_apayer: " + montant_apayer, { numsession: req.session.id });
    let montant_apayer_cent;
    montant_apayer_cent = montant_apayer * 100;
    req.session.montant_apayer_cent = montant_apayer_cent;
    logger.info("montant_apayer_cent: " + montant_apayer_cent, { numsession: req.session.id });
    res.redirect('/adhesion/adhesion_paiement_mode_paiement');
}

/////////////////////////////////////////////////
// PAGE FINALE PAIEMENT PAR CHÈQUE
/////////////////////////////////////////////////
const post_paiement_cheque_save = async function(req, res){

  logger.info("======================================");
  logger.info("======== FUNCTION post_paiement_cheque_save  (adhesion) ==========");
  logger.info("======================================");

  ////////////////////////////////////////////////////
  // CONNECTION ADOBE API
  ////////////////////////////////////////////////////
  const credentials =  PDFServicesSdk.Credentials
    .servicePrincipalCredentialsBuilder()
    .withClientId(process.env.PDF_SERVICES_CLIENT_ID)
    .withClientSecret(process.env.PDF_SERVICES_CLIENT_SECRET)
    .build();
  //timeout Default: 10000
  const clientConfig = PDFServicesSdk.ClientConfig
    .clientConfigBuilder()
    .withConnectTimeout(20000)
    .withReadTimeout(40000)
    .build();
  // Create an ExecutionContext using credentials
  const executionContext = PDFServicesSdk.ExecutionContext.create(credentials);

  /////////////////////////////////////////////////
  // DATE DE L'ADHÉSION
  let now = moment().format("YYYY-MM-DD HH:mm:ss");
  let now_pdf = moment().format("YYYY-MM-DDTHH-mm-ss");


  //////////////////////////////////////////////////////////////////////////////
  // RÉCUPÉRATION DES DONNÉES DU FORMULAIRE DANS LA SESSION EN COURS
  req.session.adherent_paiement_cheque_banque = req.body.adherent_paiement_cheque_banque;
  req.session.adherent_paiement_cheque_numero = req.body.adherent_paiement_cheque_numero;
  
  //////////////////////////////////////////////////////////////////////////////
  // DÉFINIR LE PROFIL À AJOUTER DANS LA CARTE ADHÉRENT
  // La fonction est dans le fichier /modules/adherent_type.js

  let profils = carte_adherent.profil(adherent_type);
  let profil1 = profils[0];
  let profil2 = profils[1];
  let profil3 = profils[2];
  req.session.profil1 = profil1;
  req.session.profil2 = profil2;
  req.session.profil3 = profil3;

  //////////////////////////////////////////////////////////////////////////////
  // MISE À JOUR DES INFORMATIONS SUR LE PAIEMENT DANS LA BASE DE DONNÉES 

  // Vérifier que la session n'a pas expiré
  if (req.session.identifiant) {
    try {
      const db_connection_promise = await mysql_promise.createConnection({
        host: process.env.db_connection_host,
        port: process.env.db_connection_port,
        user: process.env.db_connection_user,
        password: process.env.db_connection_password,
        database: process.env.db_connection_database
      });
      logger.info("======================================", { label: filename });
      logger.info("Connected TO DATABASE test with mysql2 PREMISE !", { label: filename });
      logger.info("======================================", { label: filename });


      /////////////////////////////////////////////////
      // VÉRIFICATION DANS LA BD SI IDENTIFIANT DÉJÀ INSCRIT OU NON
      let sql = 'select identifiant from adherent where identifiant = "' + req.session.identifiant + '" AND saison = "2025/2026"';
      logger.info("REQUETE SQL SELECT identifiant from adherent : " + sql , { numsession: req.session.id, label: filename});
      try {
        const [results, fields] = await db_connection_promise.execute(sql);
        console.log(results);
        logger.info("Nombre de lignes trouvées avec cet identifiant = " + results.length, { numsession: req.session.id, label: filename});
        if (results.length) {
          // IDENTIFIANT DÉJA INSCRIT
          // METTRE Â JOUR l'EXISTANT au cas où il ait modifié des informations
          logger.info("// IDENTIFIANT DÉJA INSCRIT", { numsession: req.session.id, label: filename});
          // affichage message erreur
          logger.info("identifiant déjà inscrit", { numsession: req.session.id, label: filename});
          req.session.err_mail_form_adhesion_1 = "Cette adresse Email est déjà inscrite pour les adhésions 2025/2026.";
          req.session.err_mail_form_adhesion_2 = "Si vous n'aviez pas pu finaliser votre paiement veuillez nous envoyer un chèque ou un virement.";
          req.session.err_mail_form_adhesion_3 = "Pour tout problème veuillez contacter l’Association.";
          // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur
          await db_connection_promise.end();
          res.redirect('/adhesion');

        } else {
          // IDENTIFIANT NON TROUVÉ 
          // AJOUTER UNE LIGNE DANS LA TABLE adhrent
          logger.info("// NON TROUVÉ => AJOUTER UNE LIGNE DANS LA TABLE", { numsession: req.session.id, label: filename});
          let sql2 = 'INSERT INTO ';
          sql2 += 'adherent';
          sql2 += ' (';
          sql2 += 'date_maj, ';
          sql2 += 'saison, ';
          sql2 += 'identifiant, ';
          sql2 += 'association_suzuki, ';
          sql2 += 'adherent_type, ';
          sql2 += 'adherent_nom, ';
          sql2 += 'adherent_prenom, ';
          sql2 += 'adherent_mail, ';
          sql2 += 'adherent_adresse_rue, ';
          sql2 += 'adherent_adresse_complement, ';
          sql2 += 'adherent_adresse_codepostal, ';
          sql2 += 'adherent_adresse_ville, ';
          sql2 += 'adherent_adresse_pays, ';
          sql2 += 'adherent_telephone_mobile, ';
          sql2 += 'adherent_telephone_fixe, ';
          sql2 += 'carte_envoi';
          sql2 += ') VALUES (';
          sql2 += '"'+ now +'",';
          sql2 += '"2025/2026",';
          sql2 += '"'+ req.session.identifiant +'",';
          sql2 += '"AFPS",';
          sql2 += '"'+ adherent_type +'",';
          sql2 += '"'+ req.session.adherent_nom +'",';
          sql2 += '"'+ req.session.adherent_prenom +'",';
          sql2 += '"'+ req.session.identifiant +'",';
          sql2 += '"'+ req.session.adherent_adresse_rue +'",';
          sql2 += '"'+ req.session.adherent_adresse_complement +'",';
          sql2 += '"'+ req.session.adherent_adresse_codepostal +'",';
          sql2 += '"'+ req.session.adherent_adresse_ville +'",';
          sql2 += '"'+ req.session.adherent_adresse_pays +'",';
          sql2 += '"'+ req.session.adherent_telephone_mobile +'",';
          sql2 += '"'+ req.session.adherent_telephone_fixe +'", ';
          sql2 += '"temporaire"';
          sql2 += ')';
          logger.info("REQUETE SQL INSERT INTO adherent : " + sql2 , { numsession: req.session.id, label: filename});

          // AJOUTER L'ADHÉRENT DANS LA TABLE adherent
          try {
            // AJOUTER UNE LIGNE DANS LA TABLE adhrent
            const [results, fields] = await db_connection_promise.execute(sql2);
            logger.info("ADHÉRENTS Row ID added : " + results.insertId, { numsession: req.session.id, label: filename});

          } catch (error) {
            // Echec de la requête
            console.log(error);
            logger.error("Il y a un problème avec la requête INSERT INTO adherent! : " + error, { numsession: req.session.id });
            req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer.";
            // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur
            await db_connection_promise.end();
            res.redirect('/adhesion');
          }

          // AJOUTER LES ÉLÈVES DANS LA TABLE adherent_eleve
          for (let i=1; i<6; i++) {
            if (req.session["eleve_"+i+"_nom"]) {
              let sql3 = 'INSERT INTO ';
              sql3 += 'adherent_eleve';
              sql3 += ' (';
              sql3 += 'date_maj, ';
              sql3 += 'saison, ';
              sql3 += 'identifiant, ';
              sql3 += 'association_suzuki, ';
              sql3 += 'eleve_nom, ';
              sql3 += 'eleve_prenom, ';
              sql3 += 'adherent_mail, ';
              sql3 += 'adherent_telephone_mobile, ';
              sql3 += 'eleve_datenaissance, ';
              sql3 += 'eleve_instrumentA, ';
              sql3 += 'eleve_instrumentA_cahier, ';
              sql3 += 'eleve_instrumentA_prof, ';
              sql3 += 'eleve_instrumentB, ';
              sql3 += 'eleve_instrumentB_cahier, ';
              sql3 += 'eleve_instrumentB_prof, ';
              sql3 += 'eleve_droitimage, ';
              sql3 += 'eleve_contactsup_nom, ';
              sql3 += 'eleve_contactsup_prenom, ';
              sql3 += 'eleve_contactsup_mail';
              sql3 += ') VALUES (';
              sql3 += '"'+ now +'",';
              sql3 += '"2025/2026",';
              sql3 += '"'+ req.session.identifiant +'",';
              sql3 += '"AFPS",';
              sql3 += '"'+ req.session["eleve_"+i+"_nom"] +'",';
              sql3 += '"'+ req.session["eleve_"+i+"_prenom"] +'",';
              sql3 += '"'+ req.session.identifiant +'",';
              sql3 += '"'+ req.session.adherent_telephone_mobile +'",';
              sql3 += '"'+ req.session["eleve_"+i+"_datenaissance"] +'",';
              sql3 += '"'+ req.session["eleve_"+i+"_instrumentA"] +'",';
              sql3 += '"'+ req.session["eleve_"+i+"_instrumentA_cahier"] +'",';
              sql3 += '"'+ req.session["eleve_"+i+"_instrumentA_prof"] +'",';
              sql3 += '"'+ req.session["eleve_"+i+"_instrumentB"] +'",';
              sql3 += '"'+ req.session["eleve_"+i+"_instrumentB_cahier"] +'",';
              if (req.session["eleve_"+i+"_instrumentB_prof"]==undefined){req.session["eleve_"+i+"_instrumentB_prof"]=""};
              sql3 += '"'+ req.session["eleve_"+i+"_instrumentB_prof"] +'",';
              sql3 += '"'+ req.session["eleve_"+i+"_droitimage"] +'",';
              sql3 += '"'+ req.session["eleve_"+i+"_contactsup_nom"] +'",';
              sql3 += '"'+ req.session["eleve_"+i+"_contactsup_prenom"] +'",';  
              sql3 += '"'+ req.session["eleve_"+i+"_contactsup_mail"] +'"';
              sql3 += ')';
              logger.info("REQUETE SQL INSERT INTO adherent_eleve : " + sql3, { numsession: req.session.id, label: filename});

              try {
                const [results, fields] = await db_connection_promise.execute(sql3);
                logger.info("ADHÉRENTS Row ID added : " + results.insertId, { numsession: req.session.id, label: filename});

              } catch (error) {
                // Echec de la requête
                console.log(error);
                logger.error("Il y a un problème avec la requête INSERT INTO adherent_eleve! : " + error, { numsession: req.session.id });
                req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer.";
                // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur
                await db_connection_promise.end();
                res.redirect('/adhesion');
              }
            }
          }

          // AJOUTER LE PROFESSEUR DANS LA TABLE adherent_professeur
          if (req.session.adherent_prof_instrument1) {
            let sql4 = 'INSERT INTO ';
            sql4 += 'adherent_professeur';
            sql4 += ' (';
            sql4 += 'date_maj, ';
            sql4 += 'saison, ';
            sql4 += 'identifiant, ';
            sql4 += 'association_suzuki, ';
            sql4 += 'adherent_nom, ';
            sql4 += 'adherent_prenom, ';
            sql4 += 'adherent_mail, ';
            sql4 += 'adherent_telephone_mobile, ';
            sql4 += 'adherent_prof_instrument1, ';
            sql4 += 'adherent_prof_instrument1_esa, ';
            sql4 += 'adherent_prof_instrument2, ';
            sql4 += 'adherent_prof_instrument2_esa, ';
            sql4 += 'adherent_prof_sece, ';
            sql4 += 'adherent_prof_ecole1, ';
            sql4 += 'adherent_prof_ecole1_mail, ';
            sql4 += 'adherent_prof_ecole1_web, ';
            sql4 += 'adherent_prof_ecole1_adresse, ';
            sql4 += 'adherent_prof_ecole1_cp, ';
            sql4 += 'adherent_prof_ecole1_ville, ';
            sql4 += 'adherent_prof_ecole1_region, ';
            sql4 += 'adherent_prof_ecole2, ';
            sql4 += 'adherent_prof_ecole2_mail, ';
            sql4 += 'adherent_prof_ecole2_web, ';
            sql4 += 'adherent_prof_ecole2_adresse, ';
            sql4 += 'adherent_prof_ecole2_cp, ';
            sql4 += 'adherent_prof_ecole2_ville, ';
            sql4 += 'adherent_prof_ecole2_region, ';
            sql4 += 'adherent_prof_ecole3, ';
            sql4 += 'adherent_prof_ecole3_mail, ';
            sql4 += 'adherent_prof_ecole3_web, ';
            sql4 += 'adherent_prof_ecole3_adresse, ';
            sql4 += 'adherent_prof_ecole3_cp, ';
            sql4 += 'adherent_prof_ecole3_ville, ';
            sql4 += 'adherent_prof_ecole3_region';
            sql4 += ') VALUES (';
            sql4 += '"'+ now +'",';
            sql4 += '"2025/2026",';
            sql4 += '"'+ req.session.identifiant +'",';
            sql4 += '"AFPS",';
            sql4 += '"'+ req.session.adherent_nom +'",';
            sql4 += '"'+ req.session.adherent_prenom +'",';
            sql4 += '"'+ req.session.identifiant +'",';
            sql4 += '"'+ req.session.adherent_telephone_mobile +'",';
            sql4 += '"'+ req.session.adherent_prof_instrument1 +'",';
            sql4 += '"'+ req.session.adherent_prof_instrument1_esa +'",';
            sql4 += '"'+ req.session.adherent_prof_instrument2 +'",';
            sql4 += '"'+ req.session.adherent_prof_instrument2_esa +'",';
            sql4 += '"'+ req.session.adherent_prof_sece +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole1 +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole1_mail +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole1_web +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole1_adresse +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole1_cp +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole1_ville +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole1_region +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole2 +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole2_mail +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole2_web +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole2_adresse +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole2_cp +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole2_ville +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole2_region +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole3 +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole3_mail +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole3_web +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole3_adresse +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole3_cp +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole3_ville +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole3_region +'"';
            sql4 += ')';
            logger.info("REQUETE SQL INSERT INTO adherent_professeur : " + sql4, { numsession: req.session.id, label: filename});

            try {
              // AJOUTER UNE LIGNE DANS LA TABLE adherent_professeur
              const [results, fields] = await db_connection_promise.execute(sql4);
              logger.info("PROFESSEUR Row ID added : " + results.insertId, { numsession: req.session.id, label: filename});
            } catch (error) {
              // Echec de la requête
              console.log(error);
              logger.error("Il y a un problème avec la requête INSERT INTO adherent_professeur! : " + error, { numsession: req.session.id });
              req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer.";
              // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur
              await db_connection_promise.end();
              res.redirect('/adhesion');
            }
          }

          // AJOUTER LE PROFESSEUR EN FORMATION DANS LA TABLE adherent_formation_prof
          if (req.session.adherent_prof_stagiaire_instrument1) {
            let sql5 = 'INSERT INTO ';
            sql5 += 'adherent_formation_prof';
            sql5 += ' (';
            sql5 += 'date_maj, ';
            sql5 += 'saison, ';
            sql5 += 'identifiant, ';
            sql5 += 'association_suzuki, ';
            sql5 += 'adherent_nom, ';
            sql5 += 'adherent_prenom, ';
            sql5 += 'adherent_mail, ';
            sql5 += 'adherent_telephone_mobile, ';
            sql5 += 'adherent_prof_stagiaire_instrument1, ';
            sql5 += 'adherent_prof_stagiaire_instrument1_esa, ';
            sql5 += 'adherent_prof_stagiaire_instrument1_prof, ';
            sql5 += 'adherent_prof_stagiaire_instrument2, ';
            sql5 += 'adherent_prof_stagiaire_instrument2_esa, ';
            sql5 += 'adherent_prof_stagiaire_instrument2_prof';
            sql5 += ') VALUES (';
            sql5 += '"'+ now +'",';
            sql5 += '"2025/2026",';
            sql5 += '"'+ req.session.identifiant +'",';
            sql5 += '"AFPS",';
            sql5 += '"'+ req.session.adherent_nom +'",';
            sql5 += '"'+ req.session.adherent_prenom +'",';
            sql5 += '"'+ req.session.identifiant +'",';
            sql5 += '"'+ req.session.adherent_telephone_mobile +'",';
            sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument1 +'",';
            sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument1_esa +'",';
            sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument1_prof +'",';
            sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument2 +'",';
            sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument2_esa +'",';
            if (req.session.adherent_prof_stagiaire_instrument2_prof==undefined) {req.session.adherent_prof_stagiaire_instrument2_prof = ""};
            sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument2_prof +'"';
            sql5 += ')';
            logger.info("====== REQUETE SQL INSERT INTO adherent_formation_prof : ", { numsession: req.session.id, label: filename});
            logger.info(sql5, { numsession: req.session.id, label: filename});
            logger.info("=========================================================", { numsession: req.session.id, label: filename});

            try {
              // AJOUTER UNE LIGNE DANS LA TABLE adherent_professeur
              const [results, fields] = await db_connection_promise.execute(sql5);
              logger.info("PROFESSEUR EN FORMATION Row ID added : " + results.insertId, { numsession: req.session.id, label: filename});
            } catch (error) {
              // Echec de la requête
              console.log(error);
              logger.error("Il y a un problème avec la requête INSERT INTO adherent_formation_prof! : " + error, { numsession: req.session.id });
              req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer.";
              // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur
              await db_connection_promise.end();
              res.redirect('/adhesion');
            }
          }



        }

      } catch (error) {
        // Echec de la requête
        console.log(error);
        logger.error("Il y a un problème avec la requête select identifiant from adherent! : " + error, { numsession: req.session.id });
        req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer.";
        // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur
        await db_connection_promise.end();
        res.redirect('/adhesion');
      };


      // METTRE À JOUR LES INFOS DE PAIEMENT DANS  adherent_finance
      let sql6 = 'INSERT INTO ';
      sql6 += 'adherent_finance';
      sql6 += ' (';
      sql6 += 'date_maj, ';
      sql6 += 'saison, ';
      sql6 += 'identifiant, ';
      sql6 += 'association_suzuki, ';
      sql6 += 'adherent_type, ';
      sql6 += 'adherent_nom, ';
      sql6 += 'adherent_prenom, ';
      sql6 += 'adherent_telephone_mobile, ';
      sql6 += 'adherent_mail, ';
      sql6 += 'montant_adhesion, ';
      sql6 += 'montant_don, ';
      sql6 += 'montant_total, ';
      sql6 += 'paiement_mode, ';
      sql6 += 'statut_paiement';
      sql6 += ') VALUES (';
      sql6 += '"'+ now +'",';
      sql6 += '"2025/2026",';
      sql6 += '"'+ req.session.identifiant +'",';
      sql6 += '"AFPS",';
      sql6 += '"'+ adherent_type +'",';
      sql6 += '"'+ req.session.adherent_nom +'",';
      sql6 += '"'+ req.session.adherent_prenom +'",';
      sql6 += '"'+ req.session.adherent_telephone_mobile +'",';
      sql6 += '"'+ req.session.identifiant +'",';
      if (req.session.adherent_paiement_montant_adhesion == "" || req.session.adherent_paiement_montant_adhesion == "undefined" || !req.session.adherent_paiement_montant_adhesion) {req.session.adherent_paiement_montant_adhesion = 0};
      sql6 += '"'+ req.session.adherent_paiement_montant_adhesion +'",';
      if (req.session.adherent_paiement_montant_don == "" || req.session.adherent_paiement_montant_don == "undefined" || !req.session.adherent_paiement_montant_don) {req.session.adherent_paiement_montant_don = 0};
      sql6 += '"'+ req.session.adherent_paiement_montant_don +'",';
      if (req.session.montant_apayer == "" || req.session.montant_apayer == "undefined" || !req.session.montant_apayer) {req.session.montant_apayer = 0};
      sql6 += '"'+ req.session.montant_apayer +'",';
      sql6 += '"cheque",';
      sql6 += '"attente"';
      sql6 += ')';

      logger.info("REQUETE SQL UPDATE adherent_finance : " + sql6 , { numsession: req.session.id, label: filename});

      try {
        // METTRE À JOUR LES INFOS DE PAIEMENT DANS  adherent_finance
        const [results, fields] = await db_connection_promise.execute(sql6);
        logger.info("adherent_finance Row ID added : " + results.insertId, { numsession: req.session.id, label: filename});


      } catch (error) {
        // Echec de la requête
        console.log(error);
        logger.error("Il y a un problème avec la requête INSERT INTO adherent_finance! : " + error, { numsession: req.session.id });
        req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer.";
        // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur
        await db_connection_promise.end();
        res.redirect('/adhesion');
      }

    } catch (error) {
      // Echec de connection à la BD
      logger.error("Il y a un problème avec la connection à  la base de données! : " + error, { numsession: req.session.id });
      req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer.";
      // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur
      await db_connection_promise.end();
      res.redirect('/adhesion');
    };

  } else {
    // les Infos de session ne sont plus dispo
    logger.info("les Infos de session ne sont plus dispo! : ", { numsession: req.session.id });
    req.session.err_mail_form_adhesion_1 = "La session a expiré.";
    req.session.err_mail_form_adhesion_2 = "Si vous n'aviez pas pu finaliser votre paiement veuillez nous envoyer un chèque ou un virement.";
    req.session.err_mail_form_adhesion_3 = "Pour tout problème veuillez contacter l’Association.";
    // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur
    res.redirect('/adhesion');
  }



  //////////////////////////////////////////////////////////////////////////////
  // ADOBE PDF : CRÉATION DE LA CARTE D'ADHÉSION TEMPORAIRE EN PDF

  let OUTPUT = path.resolve(__dirname, "../pdf/adhesion/2526/attente/")+"/"+req.session.identifiant+"_adhesion_2526_attente_"+now_pdf+".pdf";
  let INPUT = path.resolve(__dirname, "../pdf/template/carte_adherent_temp.docx");


  moment.locale('fr');
  var date_formattee = moment().format('L')
  var today = date_formattee;

  if (profil2 == undefined) {profil2 = " "};
  if (profil3 == undefined) {profil3 = " "};

  JSON_INPUT = 
  {
    "date": today,
    "identifiant": req.session.identifiant,
    "profil1": profil1,
    "profil2": profil2,
    "profil3": profil3,
    "montant": req.session.adherent_paiement_montant_adhesion
  };

  const documentMerge = PDFServicesSdk.DocumentMerge,
    documentMergeOptions = documentMerge.options,
    adobe_options = new documentMergeOptions.DocumentMergeOptions(JSON_INPUT, documentMergeOptions.OutputFormat.PDF);

  // Create a new operation instance using the options instance.
  const documentMergeOperation = documentMerge.Operation.createNew(adobe_options);

  // Set operation input document template from a source file.
  const input = PDFServicesSdk.FileRef.createFromLocalFile(INPUT);
  documentMergeOperation.setInput(input);

  // Execute the operation and Save the result to the specified location.
  await documentMergeOperation
  .execute(executionContext)
  .then(result => result.saveAsFile(OUTPUT).then(
  )
  )
  .catch(err => {
      if(err instanceof PDFServicesSdk.Error.ServiceApiError
          || err instanceof PDFServicesSdk.Error.ServiceUsageError) {
          console.log('Exception encountered while executing ADOBE PDF', err);
      } else {
          console.log('Exception encountered while executing ADOBE PDF', err);
      }
  });

  //////////////////////////////////////////////////////////////////////////////
  // ENVOIE CARTE ADHERENT TEMPORAIRE PAR MAIL

  logger.info("MAIL ENVOI AVANT", { numsession: req.session.id });
  var transporter = nodemailer.createTransport({
      service: 'gmail',
      auth: {
        user: process.env.nodemailer_user,
        pass: process.env.nodemailer_pass
      }
  });

  var attachment_name = req.session.identifiant;
  attachment_name += "_adhesion_2526_carteadherent_temporaire.pdf";
  
  var mail_objet = "ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - ADHÉSION 2025/2026 - ";
  mail_objet += req.session.identifiant;

  mail_html = "<p>Cher adhérent,</p><p>Félicitations ! Dès que votre paiement sera validé, vous serez membre de l’Association Française pour la Pédagogie Suzuki (http://www.afpedagogiesuzuki.fr) et de l’European Suzuki Association (https://europeansuzuki.org).<br>Vous pourrez à 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 2025/2026 temporaire.<p>Votre identifiant est ";
  mail_html += req.session.identifiant;
  mail_html += ".</p><p>Veuillez noter que votre adhésion ne sera effective qu'à la réception de votre règlement de ";
  mail_html += req.session.adherent_paiement_montant_adhesion;
  mail_html += " euros.<br>";
  if (req.session.adherent_paiement_montant_don > 0) {
      mail_html += "Nous vous remercions pour votre proposition de don de ";
      mail_html += req.session.adherent_paiement_montant_don;
      mail_html += " euros que vous pouvez ajouter à votre règlement.";
  }
  mail_html += "</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: req.session.identifiant,
      subject: mail_objet,
      html: mail_html,
      attachments: [{
          filename: attachment_name,
          path: OUTPUT
      }],
  };

  transporter.sendMail(mailOptions, function(error, info){
      if (error) {
        logger.info("error" + error, { numsession: req.session.id });
      } else {
        logger.info("Email envoyé: " + info.response, { numsession: req.session.id });
      }
  });
  logger.info("MAIL ENVOI APRES", { numsession: req.session.id });

  // REDIRECTION VERS LA PAGE DE CONFIRMATION PAIEMENT VIREMENT
  res.locals.today = date_formattee;
  res.redirect('/adhesion/adhesion_paiement/attente');

}

/////////////////////////////////////////////////
// PAGE FINALE PAIEMENT PAR VIREMENT
/////////////////////////////////////////////////
const post_paiement_virement_save = async function(req, res){

  logger.info("======================================");
  logger.info("======== FUNCTION post_paiement_virement_save (adhesion)  ==========");
  logger.info("======================================");

  ////////////////////////////////////////////////////
  // CONNECTION ADOBE API
  ////////////////////////////////////////////////////
  const credentials =  PDFServicesSdk.Credentials
    .servicePrincipalCredentialsBuilder()
    .withClientId(process.env.PDF_SERVICES_CLIENT_ID)
    .withClientSecret(process.env.PDF_SERVICES_CLIENT_SECRET)
    .build();
  //timeout Default: 10000
  const clientConfig = PDFServicesSdk.ClientConfig
    .clientConfigBuilder()
    .withConnectTimeout(20000)
    .withReadTimeout(40000)
    .build();
  // Create an ExecutionContext using credentials
  const executionContext = PDFServicesSdk.ExecutionContext.create(credentials);

  req.session.adherent_paiement_mode = "virement";

  /////////////////////////////////////////////////
  // DATE DE L'ADHÉSION
  let now = moment().format("YYYY-MM-DD HH:mm:ss");
  let now_pdf = moment().format("YYYY-MM-DDTHH-mm-ss");

  //////////////////////////////////////////////////////////////////////////////
  // DÉFINIR LE PROFIL À AJOUTER DANS LA CARTE ADHÉRENT
  // La fonction est dans le fichier /modules/adherent_type.js
  let profils = carte_adherent.profil(adherent_type);
  let profil1 = profils[0];
  let profil2 = profils[1];
  let profil3 = profils[2];

  req.session.profil1 = profil1;
  req.session.profil2 = profil2;
  req.session.profil3 = profil3;

  //////////////////////////////////////////////////////////////////////////////
  // MISE À JOUR DES INFORMATIONS SUR LE PAIEMENT DANS LA BASE DE DONNÉES adherent_finance

  // Vérifier que la session n'a pas expiré
  if (req.session.identifiant) {
    try {
      const db_connection_promise = await mysql_promise.createConnection({
        host: process.env.db_connection_host,
        port: process.env.db_connection_port,
        user: process.env.db_connection_user,
        password: process.env.db_connection_password,
        database: process.env.db_connection_database
      });
      logger.info("======================================", { label: filename });
      logger.info("Connected TO DATABASE test with mysql2 PREMISE !", { label: filename });
      logger.info("======================================", { label: filename });

      /////////////////////////////////////////////////
      // VÉRIFICATION DANS LA BD SI IDENTIFIANT DÉJÀ INSCRIT OU NON
      let sql = 'select identifiant from adherent where identifiant = "' + req.session.identifiant + '" AND saison = "2025/2026"';
      logger.info("REQUETE SQL SELECT identifiant from adherent : " + sql , { numsession: req.session.id, label: filename});
      try {
        const [results, fields] = await db_connection_promise.execute(sql);
        console.log(results);
        logger.info("Nombre de lignes trouvées avec cet identifiant = " + results.length, { numsession: req.session.id, label: filename});
        if (results.length) {
          // IDENTIFIANT DÉJA INSCRIT
          // METTRE Â JOUR l'EXISTANT au cas où il ait modifié des informations
          logger.info("// IDENTIFIANT DÉJA INSCRIT", { numsession: req.session.id, label: filename});
          // affichage message erreur
          logger.info("identifiant déjà inscrit", { numsession: req.session.id, label: filename});
          req.session.err_mail_form_adhesion_1 = "Cette adresse Email est déjà inscrite pour les adhésions 2025/2026.";
          req.session.err_mail_form_adhesion_2 = "Si vous n'aviez pas pu finaliser votre paiement veuillez nous envoyer un chèque ou un virement.";
          req.session.err_mail_form_adhesion_3 = "Pour tout problème veuillez contacter l’Association.";
          // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur
          await db_connection_promise.end();
          res.redirect('/adhesion');

        } else {
          // IDENTIFIANT NON TROUVÉ 
          // AJOUTER UNE LIGNE DANS LA TABLE adhrent
          logger.info("// NON TROUVÉ => AJOUTER UNE LIGNE DANS LA TABLE", { numsession: req.session.id, label: filename});
          let sql2 = 'INSERT INTO ';
          sql2 += 'adherent';
          sql2 += ' (';
          sql2 += 'date_maj, ';
          sql2 += 'saison, ';
          sql2 += 'identifiant, ';
          sql2 += 'association_suzuki, ';
          sql2 += 'adherent_type, ';
          sql2 += 'adherent_nom, ';
          sql2 += 'adherent_prenom, ';
          sql2 += 'adherent_mail, ';
          sql2 += 'adherent_adresse_rue, ';
          sql2 += 'adherent_adresse_complement, ';
          sql2 += 'adherent_adresse_codepostal, ';
          sql2 += 'adherent_adresse_ville, ';
          sql2 += 'adherent_adresse_pays, ';
          sql2 += 'adherent_telephone_mobile, ';
          sql2 += 'adherent_telephone_fixe, ';
          sql2 += 'carte_envoi';
          sql2 += ') VALUES (';
          sql2 += '"'+ now +'",';
          sql2 += '"2025/2026",';
          sql2 += '"'+ req.session.identifiant +'",';
          sql2 += '"AFPS",';
          sql2 += '"'+ adherent_type +'",';
          sql2 += '"'+ req.session.adherent_nom +'",';
          sql2 += '"'+ req.session.adherent_prenom +'",';
          sql2 += '"'+ req.session.identifiant +'",';
          sql2 += '"'+ req.session.adherent_adresse_rue +'",';
          sql2 += '"'+ req.session.adherent_adresse_complement +'",';
          sql2 += '"'+ req.session.adherent_adresse_codepostal +'",';
          sql2 += '"'+ req.session.adherent_adresse_ville +'",';
          sql2 += '"'+ req.session.adherent_adresse_pays +'",';
          sql2 += '"'+ req.session.adherent_telephone_mobile +'",';
          sql2 += '"'+ req.session.adherent_telephone_fixe +'", ';
          sql2 += '"temporaire"';
          sql2 += ')';
          logger.info("REQUETE SQL INSERT INTO adherent : " + sql2 , { numsession: req.session.id, label: filename});

          // AJOUTER L'ADHÉRENT DANS LA TABLE adherent
          try {
            // AJOUTER UNE LIGNE DANS LA TABLE adhrent
            const [results, fields] = await db_connection_promise.execute(sql2);
            logger.info("ADHÉRENTS Row ID added : " + results.insertId, { numsession: req.session.id, label: filename});

          } catch (error) {
            // Echec de la requête
            console.log(error);
            logger.error("Il y a un problème avec la requête INSERT INTO adherent! : " + error, { numsession: req.session.id });
            req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer.";
            // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur
            await db_connection_promise.end();
            res.redirect('/adhesion');
          }

          // AJOUTER LES ÉLÈVES DANS LA TABLE adherent_eleve
          for (let i=1; i<6; i++) {
            if (req.session["eleve_"+i+"_nom"]) {
              let sql3 = 'INSERT INTO ';
              sql3 += 'adherent_eleve';
              sql3 += ' (';
              sql3 += 'date_maj, ';
              sql3 += 'saison, ';
              sql3 += 'identifiant, ';
              sql3 += 'association_suzuki, ';
              sql3 += 'eleve_nom, ';
              sql3 += 'eleve_prenom, ';
              sql3 += 'adherent_mail, ';
              sql3 += 'adherent_telephone_mobile, ';
              sql3 += 'eleve_datenaissance, ';
              sql3 += 'eleve_instrumentA, ';
              sql3 += 'eleve_instrumentA_cahier, ';
              sql3 += 'eleve_instrumentA_prof, ';
              sql3 += 'eleve_instrumentB, ';
              sql3 += 'eleve_instrumentB_cahier, ';
              sql3 += 'eleve_instrumentB_prof, ';
              sql3 += 'eleve_droitimage, ';
              sql3 += 'eleve_contactsup_nom, ';
              sql3 += 'eleve_contactsup_prenom, ';
              sql3 += 'eleve_contactsup_mail';
              sql3 += ') VALUES (';
              sql3 += '"'+ now +'",';
              sql3 += '"2025/2026",';
              sql3 += '"'+ req.session.identifiant +'",';
              sql3 += '"AFPS",';
              sql3 += '"'+ req.session["eleve_"+i+"_nom"] +'",';
              sql3 += '"'+ req.session["eleve_"+i+"_prenom"] +'",';
              sql3 += '"'+ req.session.identifiant +'",';
              sql3 += '"'+ req.session.adherent_telephone_mobile +'",';
              sql3 += '"'+ req.session["eleve_"+i+"_datenaissance"] +'",';
              sql3 += '"'+ req.session["eleve_"+i+"_instrumentA"] +'",';
              sql3 += '"'+ req.session["eleve_"+i+"_instrumentA_cahier"] +'",';
              sql3 += '"'+ req.session["eleve_"+i+"_instrumentA_prof"] +'",';
              sql3 += '"'+ req.session["eleve_"+i+"_instrumentB"] +'",';
              sql3 += '"'+ req.session["eleve_"+i+"_instrumentB_cahier"] +'",';
              if (req.session["eleve_"+i+"_instrumentB_prof"]==undefined){req.session["eleve_"+i+"_instrumentB_prof"]=""};
              sql3 += '"'+ req.session["eleve_"+i+"_instrumentB_prof"] +'",';
              sql3 += '"'+ req.session["eleve_"+i+"_droitimage"] +'",';
              sql3 += '"'+ req.session["eleve_"+i+"_contactsup_nom"] +'",';
              sql3 += '"'+ req.session["eleve_"+i+"_contactsup_prenom"] +'",';  
              sql3 += '"'+ req.session["eleve_"+i+"_contactsup_mail"] +'"';
              sql3 += ')';
              logger.info("REQUETE SQL INSERT INTO adherent_eleve : " + sql3, { numsession: req.session.id, label: filename});

              try {
                const [results, fields] = await db_connection_promise.execute(sql3);
                logger.info("ADHÉRENTS Row ID added : " + results.insertId, { numsession: req.session.id, label: filename});

              } catch (error) {
                // Echec de la requête
                console.log(error);
                logger.error("Il y a un problème avec la requête INSERT INTO adherent_eleve! : " + error, { numsession: req.session.id });
                req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer.";
                // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur
                await db_connection_promise.end();
                res.redirect('/adhesion');
              }
            }
          }

          // AJOUTER LE PROFESSEUR DANS LA TABLE adherent_professeur
          if (req.session.adherent_prof_instrument1) {
            let sql4 = 'INSERT INTO ';
            sql4 += 'adherent_professeur';
            sql4 += ' (';
            sql4 += 'date_maj, ';
            sql4 += 'saison, ';
            sql4 += 'identifiant, ';
            sql4 += 'association_suzuki, ';
            sql4 += 'adherent_nom, ';
            sql4 += 'adherent_prenom, ';
            sql4 += 'adherent_mail, ';
            sql4 += 'adherent_telephone_mobile, ';
            sql4 += 'adherent_prof_instrument1, ';
            sql4 += 'adherent_prof_instrument1_esa, ';
            sql4 += 'adherent_prof_instrument2, ';
            sql4 += 'adherent_prof_instrument2_esa, ';
            sql4 += 'adherent_prof_sece, ';
            sql4 += 'adherent_prof_ecole1, ';
            sql4 += 'adherent_prof_ecole1_mail, ';
            sql4 += 'adherent_prof_ecole1_web, ';
            sql4 += 'adherent_prof_ecole1_adresse, ';
            sql4 += 'adherent_prof_ecole1_cp, ';
            sql4 += 'adherent_prof_ecole1_ville, ';
            sql4 += 'adherent_prof_ecole1_region, ';
            sql4 += 'adherent_prof_ecole2, ';
            sql4 += 'adherent_prof_ecole2_mail, ';
            sql4 += 'adherent_prof_ecole2_web, ';
            sql4 += 'adherent_prof_ecole2_adresse, ';
            sql4 += 'adherent_prof_ecole2_cp, ';
            sql4 += 'adherent_prof_ecole2_ville, ';
            sql4 += 'adherent_prof_ecole2_region, ';
            sql4 += 'adherent_prof_ecole3, ';
            sql4 += 'adherent_prof_ecole3_mail, ';
            sql4 += 'adherent_prof_ecole3_web, ';
            sql4 += 'adherent_prof_ecole3_adresse, ';
            sql4 += 'adherent_prof_ecole3_cp, ';
            sql4 += 'adherent_prof_ecole3_ville, ';
            sql4 += 'adherent_prof_ecole3_region';
            sql4 += ') VALUES (';
            sql4 += '"'+ now +'",';
            sql4 += '"2025/2026",';
            sql4 += '"'+ req.session.identifiant +'",';
            sql4 += '"AFPS",';
            sql4 += '"'+ req.session.adherent_nom +'",';
            sql4 += '"'+ req.session.adherent_prenom +'",';
            sql4 += '"'+ req.session.identifiant +'",';
            sql4 += '"'+ req.session.adherent_telephone_mobile +'",';
            sql4 += '"'+ req.session.adherent_prof_instrument1 +'",';
            sql4 += '"'+ req.session.adherent_prof_instrument1_esa +'",';
            sql4 += '"'+ req.session.adherent_prof_instrument2 +'",';
            sql4 += '"'+ req.session.adherent_prof_instrument2_esa +'",';
            sql4 += '"'+ req.session.adherent_prof_sece +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole1 +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole1_mail +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole1_web +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole1_adresse +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole1_cp +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole1_ville +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole1_region +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole2 +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole2_mail +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole2_web +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole2_adresse +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole2_cp +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole2_ville +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole2_region +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole3 +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole3_mail +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole3_web +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole3_adresse +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole3_cp +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole3_ville +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole3_region +'"';
            sql4 += ')';
            logger.info("REQUETE SQL INSERT INTO adherent_professeur : " + sql4, { numsession: req.session.id, label: filename});

            try {
              // AJOUTER UNE LIGNE DANS LA TABLE adherent_professeur
              const [results, fields] = await db_connection_promise.execute(sql4);
              logger.info("PROFESSEUR Row ID added : " + results.insertId, { numsession: req.session.id, label: filename});
            } catch (error) {
              // Echec de la requête
              console.log(error);
              logger.error("Il y a un problème avec la requête INSERT INTO adherent_professeur! : " + error, { numsession: req.session.id });
              req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer.";
              // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur
              await db_connection_promise.end();
              res.redirect('/adhesion');
            }
          }

          // AJOUTER LE PROFESSEUR EN FORMATION DANS LA TABLE adherent_formation_prof
          if (req.session.adherent_prof_stagiaire_instrument1) {
            let sql5 = 'INSERT INTO ';
            sql5 += 'adherent_formation_prof';
            sql5 += ' (';
            sql5 += 'date_maj, ';
            sql5 += 'saison, ';
            sql5 += 'identifiant, ';
            sql5 += 'association_suzuki, ';
            sql5 += 'adherent_nom, ';
            sql5 += 'adherent_prenom, ';
            sql5 += 'adherent_mail, ';
            sql5 += 'adherent_telephone_mobile, ';
            sql5 += 'adherent_prof_stagiaire_instrument1, ';
            sql5 += 'adherent_prof_stagiaire_instrument1_esa, ';
            sql5 += 'adherent_prof_stagiaire_instrument1_prof, ';
            sql5 += 'adherent_prof_stagiaire_instrument2, ';
            sql5 += 'adherent_prof_stagiaire_instrument2_esa, ';
            sql5 += 'adherent_prof_stagiaire_instrument2_prof';
            sql5 += ') VALUES (';
            sql5 += '"'+ now +'",';
            sql5 += '"2025/2026",';
            sql5 += '"'+ req.session.identifiant +'",';
            sql5 += '"AFPS",';
            sql5 += '"'+ req.session.adherent_nom +'",';
            sql5 += '"'+ req.session.adherent_prenom +'",';
            sql5 += '"'+ req.session.identifiant +'",';
            sql5 += '"'+ req.session.adherent_telephone_mobile +'",';
            sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument1 +'",';
            sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument1_esa +'",';
            sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument1_prof +'",';
            sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument2 +'",';
            sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument2_esa +'",';
            if (req.session.adherent_prof_stagiaire_instrument2_prof==undefined) {req.session.adherent_prof_stagiaire_instrument2_prof = ""};
            sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument2_prof +'"';
            sql5 += ')';
            logger.info("====== REQUETE SQL INSERT INTO adherent_formation_prof : ", { numsession: req.session.id, label: filename});
            logger.info(sql5, { numsession: req.session.id, label: filename});
            logger.info("=========================================================", { numsession: req.session.id, label: filename});

            try {
              // AJOUTER UNE LIGNE DANS LA TABLE adherent_professeur
              const [results, fields] = await db_connection_promise.execute(sql5);
              logger.info("PROFESSEUR EN FORMATION Row ID added : " + results.insertId, { numsession: req.session.id, label: filename});
            } catch (error) {
              // Echec de la requête
              console.log(error);
              logger.error("Il y a un problème avec la requête INSERT INTO adherent_formation_prof! : " + error, { numsession: req.session.id });
              req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer.";
              // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur
              await db_connection_promise.end();
              res.redirect('/adhesion');
            }
          }




        }

      } catch (error) {
        // Echec de la requête
        console.log(error);
        logger.error("Il y a un problème avec la requête select identifiant from adherent! : " + error, { numsession: req.session.id });
        req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer.";
        // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur
        await db_connection_promise.end();
        res.redirect('/adhesion');
      };



      // METTRE À JOUR LES INFOS DE PAIEMENT DANS  adherent_finance
      let sql6 = 'INSERT INTO ';
      sql6 += 'adherent_finance';
      sql6 += ' (';
      sql6 += 'date_maj, ';
      sql6 += 'saison, ';
      sql6 += 'identifiant, ';
      sql6 += 'association_suzuki, ';
      sql6 += 'adherent_type, ';
      sql6 += 'adherent_nom, ';
      sql6 += 'adherent_prenom, ';
      sql6 += 'adherent_telephone_mobile, ';
      sql6 += 'adherent_mail, ';
      sql6 += 'montant_adhesion, ';
      sql6 += 'montant_don, ';
      sql6 += 'montant_total, ';
      sql6 += 'paiement_mode, ';
      sql6 += 'statut_paiement';
      sql6 += ') VALUES (';
      sql6 += '"'+ now +'",';
      sql6 += '"2025/2026",';
      sql6 += '"'+ req.session.identifiant +'",';
      sql6 += '"AFPS",';
      sql6 += '"'+ adherent_type +'",';
      sql6 += '"'+ req.session.adherent_nom +'",';
      sql6 += '"'+ req.session.adherent_prenom +'",';
      sql6 += '"'+ req.session.adherent_telephone_mobile +'",';
      sql6 += '"'+ req.session.identifiant +'",';
      if (req.session.adherent_paiement_montant_adhesion == "" || req.session.adherent_paiement_montant_adhesion == "undefined" || !req.session.adherent_paiement_montant_adhesion) {req.session.adherent_paiement_montant_adhesion = 0};
      sql6 += '"'+ req.session.adherent_paiement_montant_adhesion +'",';
      if (req.session.adherent_paiement_montant_don == "" || req.session.adherent_paiement_montant_don == "undefined" || !req.session.adherent_paiement_montant_don) {req.session.adherent_paiement_montant_don = 0};
      sql6 += '"'+ req.session.adherent_paiement_montant_don +'",';
      if (req.session.montant_apayer == "" || req.session.montant_apayer == "undefined" || !req.session.montant_apayer) {req.session.montant_apayer = 0};
      sql6 += '"'+ req.session.montant_apayer +'",';
      sql6 += '"virement",';
      sql6 += '"attente"';
      sql6 += ')';

      logger.info("REQUETE SQL UPDATE adherent_finance : " + sql6 , { numsession: req.session.id, label: filename});

      try {
        // METTRE À JOUR LES INFOS DE PAIEMENT DANS  adherent_finance
        const [results, fields] = await db_connection_promise.execute(sql6);
        logger.info("adherent_finance Row ID added : " + results.insertId, { numsession: req.session.id, label: filename});


      } catch (error) {
        // Echec de la requête
        console.log(error);
        logger.error("Il y a un problème avec la requête INSERT INTO adherent_finance! : " + error, { numsession: req.session.id });
        req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer.";
        // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur
        await db_connection_promise.end();
        res.redirect('/adhesion');
      }

    } catch (error) {
      // Echec de connection à la BD
      logger.error("Il y a un problème avec la connection à  la base de données! : " + error, { numsession: req.session.id });
      req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer.";
      // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur
      await db_connection_promise.end();
      res.redirect('/adhesion');
    };

  } else {
    // les Infos de session ne sont plus dispo
    logger.info("les Infos de session ne sont plus dispo! : ", { numsession: req.session.id });
    req.session.err_mail_form_adhesion_1 = "La session a expiré.";
    req.session.err_mail_form_adhesion_2 = "Si vous n'aviez pas pu finaliser votre paiement veuillez nous envoyer un chèque ou un virement.";
    req.session.err_mail_form_adhesion_3 = "Pour tout problème veuillez contacter l’Association.";
    // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur
    res.redirect('/adhesion');
  }


  //////////////////////////////////////////////////////////////////////////////
  // ADOBE PDF : CRÉATION DE LA CARTE D'ADHÉSION TEMPORAIRE EN PDF

  let OUTPUT = path.resolve(__dirname, "../pdf/adhesion/2526/attente/")+"/"+req.session.identifiant+"_adhesion_2526_attente_"+now_pdf+".pdf";
  let INPUT = path.resolve(__dirname, "../pdf/template/carte_adherent_temp.docx");


  moment.locale('fr');
  var date_formattee = moment().format('L')
  var today = date_formattee;

  if (profil2 == undefined) {profil2 = " "};
  if (profil3 == undefined) {profil3 = " "};

  JSON_INPUT = 
  {
    "date": today,
    "identifiant": req.session.identifiant,
    "profil1": profil1,
    "profil2": profil2,
    "profil3": profil3,
    "montant": req.session.adherent_paiement_montant_adhesion
  };

  const documentMerge = PDFServicesSdk.DocumentMerge,
    documentMergeOptions = documentMerge.options,
    adobe_options = new documentMergeOptions.DocumentMergeOptions(JSON_INPUT, documentMergeOptions.OutputFormat.PDF);

  // Create a new operation instance using the options instance.
  const documentMergeOperation = documentMerge.Operation.createNew(adobe_options);

  // Set operation input document template from a source file.
  const input = PDFServicesSdk.FileRef.createFromLocalFile(INPUT);
  documentMergeOperation.setInput(input);

  // Execute the operation and Save the result to the specified location.
  await documentMergeOperation
  .execute(executionContext)
  .then(result => result.saveAsFile(OUTPUT).then(
  )
  )
  .catch(err => {
      if(err instanceof PDFServicesSdk.Error.ServiceApiError
          || err instanceof PDFServicesSdk.Error.ServiceUsageError) {
          console.log('Exception encountered while executing ADOBE PDF', err);
      } else {
          console.log('Exception encountered while executing ADOBE PDF', err);
      }
  });

  //////////////////////////////////////////////////////////////////////////////
  // ENVOIE CARTE ADHERENT TEMPORAIRE PAR MAIL

  console.log("MAIL ENVOI AVANT");
  var transporter = nodemailer.createTransport({
      service: 'gmail',
      auth: {
        user: process.env.nodemailer_user,
        pass: process.env.nodemailer_pass
      }
  });

  var attachment_name = req.session.identifiant;
  attachment_name += "_adhesion_2526_carteadherent_temporaire.pdf";
  
  var mail_objet = "ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI- ADHÉSION 2025/2026 - ";
  mail_objet += req.session.identifiant;

  mail_html = "<p>Cher adhérent,</p><p>Félicitations ! Dès que votre paiement sera validé, vous serez membre de l’Association Française pour la Pédagogie Suzuki (http://www.afpedagogiesuzuki.fr) et de l’European Suzuki Association (https://europeansuzuki.org).<br>Vous pourrez à 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 2025/2026 temporaire.</p><p>Votre identifiant est ";
  mail_html += req.session.identifiant;
  mail_html += ".</p><p>Veuillez toutefois noter que votre adhésion ne sera effective qu'à la réception de votre règlement de ";
  mail_html += req.session.adherent_paiement_montant_adhesion;
  mail_html += " euros.<br>";
  if (req.session.adherent_paiement_montant_don > 0) {
      mail_html += "Merci pour votre proposition de don de ";
      mail_html += req.session.adherent_paiement_montant_don;
      mail_html += " euros que vous pouvez ajouter à votre règlement.";
  }
  mail_html += "</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: req.session.identifiant,
    subject: mail_objet,
    html: mail_html,
    attachments: [{
        filename: attachment_name,
        path: OUTPUT
    }],
  };

  transporter.sendMail(mailOptions, function(error, info){
      if (error) {
        logger.info("error" + error, { numsession: req.session.id });
      } else {
        console.log('Email sent: ' + info.response);
      }
  });
  console.log("MAIL ENVOI APRES");

  //////////////////////////////////////////////////////////////////////////////
  // REDIRECTION VERS LA PAGE DE CONFIRMATION PAIEMENT VIREMENT
  res.locals.today = date_formattee;
  res.redirect('/adhesion/adhesion_paiement/attente');

}

/////////////////////////////////////////////////
// REQUÈTE VERS LE PAIEMENT STRIPE
// OUVERTURE SESSION STRIPE
/////////////////////////////////////////////////
const post_req_bank = async function(req, res, next) {

  logger.info("======================================");
  logger.info("======== FUNCTION post_req_bank  (adhesion) ==========");
  logger.info("======================================");

  /////////////////////////////////////////////////
  // DATE DE L'ADHÉSION
  let now = moment().format("YYYY-MM-DD HH:mm:ss");
  
  logger.info("req.session.montant_apayer_cent: " + req.session.montant_apayer_cent, { numsession: req.session.id });
  logger.info("req.session.identifiant : " + req.session.identifiant, { numsession: req.session.id });
  logger.info("req.session.adherent_type : " + req.session.adherent_type, { numsession: req.session.id });
  
  /////////////////////////////////////////////////
  // STRIPE - ETAPE 1 - CREER l'INTENTION DE PAIEMENT

  const session = await stripe.checkout.sessions.create({
    metadata: {identifiant: req.session.identifiant, profil:req.session.adherent_type, adherent_paiement_montant_adhesion:adherent_paiement_montant_adhesion, adherent_paiement_montant_don:req.session.adherent_paiement_montant_don, adherent_nom:req.session.adherent_nom, adherent_prenom:req.session.adherent_prenom, adherent_adresse_rue:req.session.adherent_adresse_rue, adherent_adresse_codepostal:req.session.adherent_adresse_codepostal, adherent_adresse_ville:req.session.adherent_adresse_ville,},
    customer_email: req.session.identifiant,

    submit_type: 'pay',

    success_url: process.env.STRIPE_SUCCESSURL,
    cancel_url: process.env.STRIPE_CANCELURL,

    payment_method_types: ['card'],
    line_items: [{
        price_data: {
          currency: 'eur',
          product_data: {
            name: 'Adhesion annuelle ' + req.session.adherent_type,
          },
          unit_amount: req.session.adherent_paiement_montant_adhesion * 100,
        },
        quantity: 1,
      },
      {
        price_data: {
          currency: 'eur',
          product_data: {
            name: 'Don',
          },
          unit_amount: req.session.adherent_paiement_montant_don * 100,
        },
        quantity: 1,
      }],
    //Checkout has three modes: payment, subscription, or setup. 
    mode: 'payment'

  });


  /////////////////////////////////////////////////
  // STRIPE - ETAPE 2 - RÉCUPÉRATION DES DONNÉES DE LA SESSION ET ENVOYER LE PAIEMENT

  // DANS LES INFOS DE LA SESSION ON A l'URL DE PAIEMENT POUR CETTE SESSION AVEC LE ID DE CE PAIEMENT DONNÉE PAR STRIPE EN RETOUR DE L'intention
  // POUR RÉCUPÉRER LES INFOS DE SESSION ON UTILISE "session.[nom de la données]"
  logger.info("session.url: " + session.url, { numsession: req.session.id });


  // ON REDIRIGE L'INTERNAUTE VERS L'URL STRIPE POUR QU'IL FASSE LE PAIEMENT
  // POUR LE RETOUR C'EST DANS LES URL success_url et cancel_url sur lesquelles on fait un get dans le js du router et on fait un script 
  // pour continuer le process et récupérer les infos contenues dans le get et envoyé par Stripe, comme par ex le code retour de la banque

  //////////////////////////////////////////////////////////////////////////////
  // MISE À JOUR DES INFORMATIONS SUR LE PAIEMENT DANS LA BASE DE DONNÉES adherent_finance

  // Vérifier que la session n'a pas expiré
  if (req.session.identifiant) {
    try {
      const db_connection_promise = await mysql_promise.createConnection({
        host: process.env.db_connection_host,
        port: process.env.db_connection_port,
        user: process.env.db_connection_user,
        password: process.env.db_connection_password,
        database: process.env.db_connection_database
      });
      logger.info("======================================", { label: filename });
      logger.info("Connected TO DATABASE test with mysql2 PREMISE !", { label: filename });
      logger.info("======================================", { label: filename });


      /////////////////////////////////////////////////
      // VÉRIFICATION DANS LA BD SI IDENTIFIANT DÉJÀ INSCRIT OU NON
      let sql = 'select identifiant from adherent where identifiant = "' + req.session.identifiant + '" AND saison = "2025/2026"';
      logger.info("REQUETE SQL SELECT identifiant from adherent : " + sql , { numsession: req.session.id, label: filename});
      try {
        const [results, fields] = await db_connection_promise.execute(sql);
        console.log(results);
        logger.info("Nombre de lignes trouvées avec cet identifiant = " + results.length, { numsession: req.session.id, label: filename});
        if (results.length) {
          // IDENTIFIANT DÉJA INSCRIT
          // METTRE Â JOUR l'EXISTANT au cas où il ait modifié des informations
          logger.info("// IDENTIFIANT DÉJA INSCRIT", { numsession: req.session.id, label: filename});
          // affichage message erreur
          logger.info("identifiant déjà inscrit", { numsession: req.session.id, label: filename});
          req.session.err_mail_form_adhesion_1 = "Cette adresse Email est déjà inscrite pour les adhésions 2025/2026.";
          req.session.err_mail_form_adhesion_2 = "Si vous n'aviez pas pu finaliser votre paiement veuillez nous envoyer un chèque ou un virement.";
          req.session.err_mail_form_adhesion_3 = "Pour tout problème veuillez contacter l’Association.";
          // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur
          await db_connection_promise.end();
          res.redirect('/adhesion');

        } else {
          // IDENTIFIANT NON TROUVÉ 
          // AJOUTER UNE LIGNE DANS LA TABLE adhrent
          logger.info("// NON TROUVÉ => AJOUTER UNE LIGNE DANS LA TABLE", { numsession: req.session.id, label: filename});
          let sql2 = 'INSERT INTO ';
          sql2 += 'adherent';
          sql2 += ' (';
          sql2 += 'date_maj, ';
          sql2 += 'saison, ';
          sql2 += 'identifiant, ';
          sql2 += 'association_suzuki, ';
          sql2 += 'adherent_type, ';
          sql2 += 'adherent_nom, ';
          sql2 += 'adherent_prenom, ';
          sql2 += 'adherent_mail, ';
          sql2 += 'adherent_adresse_rue, ';
          sql2 += 'adherent_adresse_complement, ';
          sql2 += 'adherent_adresse_codepostal, ';
          sql2 += 'adherent_adresse_ville, ';
          sql2 += 'adherent_adresse_pays, ';
          sql2 += 'adherent_telephone_mobile, ';
          sql2 += 'adherent_telephone_fixe';
          sql2 += ') VALUES (';
          sql2 += '"'+ now +'",';
          sql2 += '"2025/2026",';
          sql2 += '"'+ req.session.identifiant +'",';
          sql2 += '"AFPS",';
          sql2 += '"'+ adherent_type +'",';
          sql2 += '"'+ req.session.adherent_nom +'",';
          sql2 += '"'+ req.session.adherent_prenom +'",';
          sql2 += '"'+ req.session.identifiant +'",';
          sql2 += '"'+ req.session.adherent_adresse_rue +'",';
          sql2 += '"'+ req.session.adherent_adresse_complement +'",';
          sql2 += '"'+ req.session.adherent_adresse_codepostal +'",';
          sql2 += '"'+ req.session.adherent_adresse_ville +'",';
          sql2 += '"'+ req.session.adherent_adresse_pays +'",';
          sql2 += '"'+ req.session.adherent_telephone_mobile +'",';
          sql2 += '"'+ req.session.adherent_telephone_fixe +'"';
          sql2 += ')';
          logger.info("REQUETE SQL INSERT INTO adherent : " + sql2 , { numsession: req.session.id, label: filename});

          // AJOUTER L'ADHÉRENT DANS LA TABLE adherent
          try {
            // AJOUTER UNE LIGNE DANS LA TABLE adhrent
            const [results, fields] = await db_connection_promise.execute(sql2);
            logger.info("ADHÉRENTS Row ID added : " + results.insertId, { numsession: req.session.id, label: filename});

          } catch (error) {
            // Echec de la requête
            console.log(error);
            logger.error("Il y a un problème avec la requête INSERT INTO adherent! : " + error, { numsession: req.session.id });
            req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer.";
            // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur
            await db_connection_promise.end();
            res.redirect('/adhesion');
          }

          // AJOUTER LES ÉLÈVES DANS LA TABLE adherent_eleve
          for (let i=1; i<6; i++) {
            if (req.session["eleve_"+i+"_nom"]) {
              let sql3 = 'INSERT INTO ';
              sql3 += 'adherent_eleve';
              sql3 += ' (';
              sql3 += 'date_maj, ';
              sql3 += 'saison, ';
              sql3 += 'identifiant, ';
              sql3 += 'association_suzuki, ';
              sql3 += 'eleve_nom, ';
              sql3 += 'eleve_prenom, ';
              sql3 += 'adherent_mail, ';
              sql3 += 'adherent_telephone_mobile, ';
              sql3 += 'eleve_datenaissance, ';
              sql3 += 'eleve_instrumentA, ';
              sql3 += 'eleve_instrumentA_cahier, ';
              sql3 += 'eleve_instrumentA_prof, ';
              sql3 += 'eleve_instrumentB, ';
              sql3 += 'eleve_instrumentB_cahier, ';
              sql3 += 'eleve_instrumentB_prof, ';
              sql3 += 'eleve_droitimage, ';
              sql3 += 'eleve_contactsup_nom, ';
              sql3 += 'eleve_contactsup_prenom, ';
              sql3 += 'eleve_contactsup_mail';
              sql3 += ') VALUES (';
              sql3 += '"'+ now +'",';
              sql3 += '"2025/2026",';
              sql3 += '"'+ req.session.identifiant +'",';
              sql3 += '"AFPS",';
              sql3 += '"'+ req.session["eleve_"+i+"_nom"] +'",';
              sql3 += '"'+ req.session["eleve_"+i+"_prenom"] +'",';
              sql3 += '"'+ req.session.identifiant +'",';
              sql3 += '"'+ req.session.adherent_telephone_mobile +'",';
              sql3 += '"'+ req.session["eleve_"+i+"_datenaissance"] +'",';
              sql3 += '"'+ req.session["eleve_"+i+"_instrumentA"] +'",';
              sql3 += '"'+ req.session["eleve_"+i+"_instrumentA_cahier"] +'",';
              sql3 += '"'+ req.session["eleve_"+i+"_instrumentA_prof"] +'",';
              sql3 += '"'+ req.session["eleve_"+i+"_instrumentB"] +'",';
              sql3 += '"'+ req.session["eleve_"+i+"_instrumentB_cahier"] +'",';
              if (req.session["eleve_"+i+"_instrumentB_prof"]==undefined){req.session["eleve_"+i+"_instrumentB_prof"]=""};
              sql3 += '"'+ req.session["eleve_"+i+"_instrumentB_prof"] +'",';
              sql3 += '"'+ req.session["eleve_"+i+"_droitimage"] +'",';
              sql3 += '"'+ req.session["eleve_"+i+"_contactsup_nom"] +'",';
              sql3 += '"'+ req.session["eleve_"+i+"_contactsup_prenom"] +'",';  
              sql3 += '"'+ req.session["eleve_"+i+"_contactsup_mail"] +'"';
              sql3 += ')';
              logger.info("REQUETE SQL INSERT INTO adherent_eleve : " + sql3, { numsession: req.session.id, label: filename});

              try {
                const [results, fields] = await db_connection_promise.execute(sql3);
                logger.info("ADHÉRENTS Row ID added : " + results.insertId, { numsession: req.session.id, label: filename});

              } catch (error) {
                // Echec de la requête
                console.log(error);
                logger.error("Il y a un problème avec la requête INSERT INTO adherent_eleve! : " + error, { numsession: req.session.id });
                req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer.";
                // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur
                await db_connection_promise.end();
                res.redirect('/adhesion');
              }
            }
          }

          // AJOUTER LE PROFESSEUR DANS LA TABLE adherent_professeur
          if (req.session.adherent_prof_instrument1) {
            let sql4 = 'INSERT INTO ';
            sql4 += 'adherent_professeur';
            sql4 += ' (';
            sql4 += 'date_maj, ';
            sql4 += 'saison, ';
            sql4 += 'identifiant, ';
            sql4 += 'association_suzuki, ';
            sql4 += 'adherent_nom, ';
            sql4 += 'adherent_prenom, ';
            sql4 += 'adherent_mail, ';
            sql4 += 'adherent_telephone_mobile, ';
            sql4 += 'adherent_prof_instrument1, ';
            sql4 += 'adherent_prof_instrument1_esa, ';
            sql4 += 'adherent_prof_instrument2, ';
            sql4 += 'adherent_prof_instrument2_esa, ';
            sql4 += 'adherent_prof_sece, ';
            sql4 += 'adherent_prof_ecole1, ';
            sql4 += 'adherent_prof_ecole1_mail, ';
            sql4 += 'adherent_prof_ecole1_web, ';
            sql4 += 'adherent_prof_ecole1_adresse, ';
            sql4 += 'adherent_prof_ecole1_cp, ';
            sql4 += 'adherent_prof_ecole1_ville, ';
            sql4 += 'adherent_prof_ecole1_region, ';
            sql4 += 'adherent_prof_ecole2, ';
            sql4 += 'adherent_prof_ecole2_mail, ';
            sql4 += 'adherent_prof_ecole2_web, ';
            sql4 += 'adherent_prof_ecole2_adresse, ';
            sql4 += 'adherent_prof_ecole2_cp, ';
            sql4 += 'adherent_prof_ecole2_ville, ';
            sql4 += 'adherent_prof_ecole2_region, ';
            sql4 += 'adherent_prof_ecole3, ';
            sql4 += 'adherent_prof_ecole3_mail, ';
            sql4 += 'adherent_prof_ecole3_web, ';
            sql4 += 'adherent_prof_ecole3_adresse, ';
            sql4 += 'adherent_prof_ecole3_cp, ';
            sql4 += 'adherent_prof_ecole3_ville, ';
            sql4 += 'adherent_prof_ecole3_region';
            sql4 += ') VALUES (';
            sql4 += '"'+ now +'",';
            sql4 += '"2025/2026",';
            sql4 += '"'+ req.session.identifiant +'",';
            sql4 += '"AFPS",';
            sql4 += '"'+ req.session.adherent_nom +'",';
            sql4 += '"'+ req.session.adherent_prenom +'",';
            sql4 += '"'+ req.session.identifiant +'",';
            sql4 += '"'+ req.session.adherent_telephone_mobile +'",';
            sql4 += '"'+ req.session.adherent_prof_instrument1 +'",';
            sql4 += '"'+ req.session.adherent_prof_instrument1_esa +'",';
            sql4 += '"'+ req.session.adherent_prof_instrument2 +'",';
            sql4 += '"'+ req.session.adherent_prof_instrument2_esa +'",';
            sql4 += '"'+ req.session.adherent_prof_sece +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole1 +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole1_mail +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole1_web +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole1_adresse +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole1_cp +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole1_ville +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole1_region +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole2 +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole2_mail +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole2_web +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole2_adresse +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole2_cp +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole2_ville +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole2_region +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole3 +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole3_mail +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole3_web +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole3_adresse +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole3_cp +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole3_ville +'",';
            sql4 += '"'+ req.session.adherent_prof_ecole3_region +'"';
            sql4 += ')';
            logger.info("REQUETE SQL INSERT INTO adherent_professeur : " + sql4, { numsession: req.session.id, label: filename});

            try {
              // AJOUTER UNE LIGNE DANS LA TABLE adherent_professeur
              const [results, fields] = await db_connection_promise.execute(sql4);
              logger.info("PROFESSEUR Row ID added : " + results.insertId, { numsession: req.session.id, label: filename});
            } catch (error) {
              // Echec de la requête
              console.log(error);
              logger.error("Il y a un problème avec la requête INSERT INTO adherent_professeur! : " + error, { numsession: req.session.id });
              req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer.";
              // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur
              await db_connection_promise.end();
              res.redirect('/adhesion');
            }
          }

          // AJOUTER LE PROFESSEUR EN FORMATION DANS LA TABLE adherent_formation_prof
          if (req.session.adherent_prof_stagiaire_instrument1) {
            let sql5 = 'INSERT INTO ';
            sql5 += 'adherent_formation_prof';
            sql5 += ' (';
            sql5 += 'date_maj, ';
            sql5 += 'saison, ';
            sql5 += 'identifiant, ';
            sql5 += 'association_suzuki, ';
            sql5 += 'adherent_nom, ';
            sql5 += 'adherent_prenom, ';
            sql5 += 'adherent_mail, ';
            sql5 += 'adherent_telephone_mobile, ';
            sql5 += 'adherent_prof_stagiaire_instrument1, ';
            sql5 += 'adherent_prof_stagiaire_instrument1_esa, ';
            sql5 += 'adherent_prof_stagiaire_instrument1_prof, ';
            sql5 += 'adherent_prof_stagiaire_instrument2, ';
            sql5 += 'adherent_prof_stagiaire_instrument2_esa, ';
            sql5 += 'adherent_prof_stagiaire_instrument2_prof';
            sql5 += ') VALUES (';
            sql5 += '"'+ now +'",';
            sql5 += '"2025/2026",';
            sql5 += '"'+ req.session.identifiant +'",';
            sql5 += '"AFPS",';
            sql5 += '"'+ req.session.adherent_nom +'",';
            sql5 += '"'+ req.session.adherent_prenom +'",';
            sql5 += '"'+ req.session.identifiant +'",';
            sql5 += '"'+ req.session.adherent_telephone_mobile +'",';
            sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument1 +'",';
            sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument1_esa +'",';
            sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument1_prof +'",';
            sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument2 +'",';
            sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument2_esa +'",';
            if (req.session.adherent_prof_stagiaire_instrument2_prof==undefined) {req.session.adherent_prof_stagiaire_instrument2_prof = ""};
            sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument2_prof +'"';
            sql5 += ')';
            logger.info("====== REQUETE SQL INSERT INTO adherent_formation_prof : ", { numsession: req.session.id, label: filename});
            logger.info(sql5, { numsession: req.session.id, label: filename});
            logger.info("=========================================================", { numsession: req.session.id, label: filename});

            try {
              // AJOUTER UNE LIGNE DANS LA TABLE adherent_professeur
              const [results, fields] = await db_connection_promise.execute(sql5);
              logger.info("PROFESSEUR EN FORMATION Row ID added : " + results.insertId, { numsession: req.session.id, label: filename});
            } catch (error) {
              // Echec de la requête
              console.log(error);
              logger.error("Il y a un problème avec la requête INSERT INTO adherent_formation_prof! : " + error, { numsession: req.session.id });
              req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer.";
              // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur
              await db_connection_promise.end();
              res.redirect('/adhesion');
            }
          }
        }

      } catch (error) {
        // Echec de la requête
        console.log(error);
        logger.error("Il y a un problème avec la requête select identifiant from adherent! : " + error, { numsession: req.session.id });
        req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer.";
        // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur
        await db_connection_promise.end();
        res.redirect('/adhesion');
      };

      // AJOUTER UNE LIGNE DANS LA TABLE adherent_finance
      let sql6 = 'INSERT INTO ';
      sql6 += 'adherent_finance';
      sql6 += ' (';
      sql6 += 'date_maj, ';
      sql6 += 'saison, ';
      sql6 += 'identifiant, ';
      sql6 += 'association_suzuki, ';
      sql6 += 'adherent_type, ';
      sql6 += 'adherent_nom, ';
      sql6 += 'adherent_prenom, ';
      sql6 += 'adherent_telephone_mobile, ';
      sql6 += 'adherent_mail, ';
      sql6 += 'montant_adhesion, ';
      sql6 += 'montant_don, ';
      sql6 += 'montant_total, ';
      sql6 += 'paiement_mode';
      sql6 += ') VALUES (';
      sql6 += '"'+ now +'",';
      sql6 += '"2025/2026",';
      sql6 += '"'+ req.session.identifiant +'",';
      sql6 += '"AFPS",';
      sql6 += '"'+ adherent_type +'",';
      sql6 += '"'+ req.session.adherent_nom +'",';
      sql6 += '"'+ req.session.adherent_prenom +'",';
      sql6 += '"'+ req.session.adherent_telephone_mobile +'",';
      sql6 += '"'+ req.session.identifiant +'",';
      if (req.session.adherent_paiement_montant_adhesion == "" || req.session.adherent_paiement_montant_adhesion == "undefined" || !req.session.adherent_paiement_montant_adhesion) {req.session.adherent_paiement_montant_adhesion = 0};
      sql6 += '"'+ req.session.adherent_paiement_montant_adhesion +'",';
      if (req.session.adherent_paiement_montant_don == "" || req.session.adherent_paiement_montant_don == "undefined" || !req.session.adherent_paiement_montant_don) {req.session.adherent_paiement_montant_don = 0};
      sql6 += '"'+ req.session.adherent_paiement_montant_don +'",';
      if (req.session.montant_apayer == "" || req.session.montant_apayer == "undefined" || !req.session.montant_apayer) {req.session.montant_apayer = 0};
      sql6 += '"'+ req.session.montant_apayer +'",';
      sql6 += '"carte bancaire"';
      sql6 += ')';
      logger.info("REQUETE SQL INSERT INTO adherent : " + sql6, { numsession: req.session.id, label: filename});

      try {
        // AJOUTER UNE LIGNE DANS LA TABLE adherent_finance
        const [results, fields] = await db_connection_promise.execute(sql6);
        logger.info("adherent_finance Row ID added : " + results.insertId, { numsession: req.session.id, label: filename});

        /////////////////////////////////////////////////
        // REDIRECTION VERS LA PAGE DE PAIEMENT STRIPE

        //let url_stripe = session.url
        logger.info("Stripe session.url : " + session.url, { numsession: req.session.id, label: filename});
        await db_connection_promise.end();
        res.redirect(session.url)

      } catch (error) {
        // Echec de la requête
        console.log(error);
        logger.error("Il y a un problème avec la requête INSERT INTO adherent_finance! : " + error, { numsession: req.session.id });
        req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer.";
        // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur
        await db_connection_promise.end();
        res.redirect('/adhesion');
      }

    } catch (error) {
      // Echec de connection à la BD
      logger.error("Il y a un problème avec la connection à  la base de données! : " + error, { numsession: req.session.id });
      req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer.";
      // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur
      res.redirect('/adhesion');
    };

  } else {
    // les Infos de session ne sont plus dispo
    logger.info("les Infos de session ne sont plus dispo! : ", { numsession: req.session.id });
    req.session.err_mail_form_adhesion_1 = "La session a expiré.";
    req.session.err_mail_form_adhesion_2 = "Si vous n'aviez pas pu finaliser votre paiement veuillez nous envoyer un chèque ou un virement.";
    req.session.err_mail_form_adhesion_3 = "Pour tout problème veuillez contacter l’Association.";
    // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur
    res.redirect('/adhesion');
  }
      
}

/////////////////////////////////////////////////
// RETOUR STRIPE CARTE BANCAIRE PAYÉE
/////////////////////////////////////////////////
const get_res_bank = async function(req, res){
  
  logger.info("======================================");
  logger.info("======== FUNCTION get_res_banq  (adhesion) ==========");
  logger.info("======================================");

  ////////////////////////////////////////////////////
  // CONNECTION ADOBE API
  ////////////////////////////////////////////////////
  const credentials =  PDFServicesSdk.Credentials
    .servicePrincipalCredentialsBuilder()
    .withClientId(process.env.PDF_SERVICES_CLIENT_ID)
    .withClientSecret(process.env.PDF_SERVICES_CLIENT_SECRET)
    .build();
  //timeout Default: 10000
  const clientConfig = PDFServicesSdk.ClientConfig
    .clientConfigBuilder()
    .withConnectTimeout(20000)
    .withReadTimeout(40000)
    .build();
  // Create an ExecutionContext using credentials
  const executionContext = PDFServicesSdk.ExecutionContext.create(credentials);

  var id = req.query.id;
  logger.info("id = " + id, { numsession: req.session.id });
  const session = await stripe.checkout.sessions.retrieve(id);

  console.log("======================================");
  console.log("======== SESSION STRIPE ==========");
  console.log("======================================");

  /////////////////////////////////////////////////
  // DATE DE L'ADHÉSION
  let now = moment().format("YYYY-MM-DD HH:mm:ss");
  let now_pdf = moment().format("YYYY-MM-DDTHH-mm-ss");
  
  var customer_email = session.customer_email;
  var payment_status = session.payment_status;
  var amount_total = session.amount_total/100;
  var stripe_customer = session.customer;
  var stripe_payment_intent = session.payment_intent;
  var payment_method_types = session.payment_method_types;
  var stripe_status = session.status;

  var profil = session.metadata.profil;
  var identifiant = session.metadata.identifiant;
  var adherent_paiement_montant_don = session.metadata.adherent_paiement_montant_don;
  var adherent_nom = session.metadata.adherent_nom;
  var adherent_prenom = session.metadata.adherent_prenom;
  var adherent_adresse_rue = session.metadata.adherent_adresse_rue;
  var adherent_adresse_codepostal = session.metadata.adherent_adresse_codepostal;
  var adherent_adresse_ville = session.metadata.adherent_adresse_ville;
  
  logger.info("session.metadata.adherent_nom = " + session.metadata.adherent_nom, { numsession: req.session.id });

  //////////////////////////////////////////////////////////////////////////////
  // DÉFINIR LE PROFIL À AJOUTER DANS LA CARTE ADHÉRENT
  // La fonction est dans le fichier /modules/adherent_type.js
  profils = carte_adherent.profil(adherent_type);
  profil1 = profils[0];
  profil2 = profils[1];
  profil3 = profils[2];


  
  logger.info("customer_email: " + customer_email, { numsession: req.session.id });
  logger.info("payment_status: " + payment_status, { numsession: req.session.id });

  res.locals.customer_email = customer_email;
  res.locals.payment_status = payment_status;
  res.locals.amount_total = amount_total;
  res.locals.stripe_customer = stripe_customer;
  res.locals.stripe_payment_intent = stripe_payment_intent;
  res.locals.payment_method_types = "carte bancaire";
  res.locals.stripe_status = stripe_status;
  res.locals.identifiant = identifiant;
  res.locals.profil1 = profil1;
  res.locals.profil2 = profil2;
  res.locals.profil3 = profil3;

  logger.info("req.session.identifiant: " + req.session.identifiant, { numsession: req.session.id });

  //////////////////////////////////////////////////////////////////////////////
  // MISE À JOUR DES INFORMATIONS SUR LE PAIEMENT DANS LA BASE DE DONNÉES adherent_finance

  let stripe_retour = "payment_status:"+payment_status+",stripe_customer:"+stripe_customer+",stripe_payment_intent:"+stripe_payment_intent+",sessionID:"+session.id+",payment_method_types:"+payment_method_types+",amount_total:"+amount_total+",stripe_status:"+stripe_status;

  // Vérifier que la session n'a pas expiré
  if (identifiant) {
    try {
      const db_connection_promise = await mysql_promise.createConnection({
        host: process.env.db_connection_host,
        port: process.env.db_connection_port,
        user: process.env.db_connection_user,
        password: process.env.db_connection_password,
        database: process.env.db_connection_database
      });
      logger.info("======================================", { label: filename });
      logger.info("Connected TO DATABASE test with mysql2 PREMISE !", { label: filename });
      logger.info("======================================", { label: filename });

      // METTRE À JOUR LES INFOS DE PAIEMENT DANS  adherent_finance
      let sql = 'UPDATE ';
      sql += 'adherent_finance';
      sql += ' SET ';
      sql += 'date_paiement = "' + now + '", ';
      sql += 'stripe_retour = "' + stripe_retour + '", ';
      sql += 'statut_paiement = "paye"';
      sql += ' WHERE identifiant = "' + identifiant + '"';


      logger.info("REQUETE SQL UPDATE adherent_finance : " + sql , { numsession: req.session.id, label: filename});

      try {
        // METTRE À JOUR LES INFOS DE PAIEMENT DANS  adherent_finance
        const [results, fields] = await db_connection_promise.execute(sql);
        logger.info("adherent_finance Row ID changed : " + results.changedRows, { numsession: req.session.id, label: filename});


      } catch (error) {
        // Echec de la requête
        console.log(error);
        logger.error("Il y a un problème avec la requête INSERT INTO adherent_finance! : " + error, { numsession: req.session.id });
        req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer.";
        // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur
        await db_connection_promise.end();
        res.redirect('/adhesion');
      }


      // METTRE À JOUR LE STATUS D'ENVOI DE LA CARTE
      let sql2 = 'UPDATE ';
      sql2 += 'adherent';
      sql2 += ' SET ';
      sql2 += 'carte_envoi = "definitive"';
      sql2 += ' WHERE identifiant = "' + identifiant + '"';

      logger.info("REQUETE SQL UPDATE adherent : " + sql2, { numsession: req.session.id, label: filename});

      try {
        // METTRE À JOUR LES INFOS DE PAIEMENT DANS  adherent
        const [results, fields] = await db_connection_promise.execute(sql2);
        logger.info("adherent carte envoi Row ID changed : " + results.changedRows, { numsession: req.session.id, label: filename});


      } catch (error) {
        // Echec de la requête
        console.log(error);
        logger.error("Il y a un problème avec la requête INSERT INTO adherent_finance! : " + error, { numsession: req.session.id });
        req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer.";
        // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur
        await db_connection_promise.end();
        res.redirect('/adhesion');
      }

    } catch (error) {
      // Echec de connection à la BD
      logger.error("Il y a un problème avec la connection à  la base de données! : " + error, { numsession: req.session.id });
      req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer.";
      // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur
      await db_connection_promise.end();
      res.redirect('/adhesion');
    };

  } else {
    // les Infos de session ne sont plus dispo
    logger.info("les Infos de session ne sont plus dispo! : ", { numsession: req.session.id });
    req.session.err_mail_form_adhesion_1 = "La session a expiré.";
    req.session.err_mail_form_adhesion_2 = "Si vous n'aviez pas pu finaliser votre paiement veuillez nous envoyer un chèque ou un virement.";
    req.session.err_mail_form_adhesion_3 = "Pour tout problème veuillez contacter l’Association.";
    // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur
    res.redirect('/adhesion');
  }

  //////////////////////////////////////////////////////////////////////////////
  // ADOBE PDF : CRÉATION DE LA CARTE D'ADHÉSION EN PDF
  // + JUSTIFICATIF DE DON

  // OUTPUT = /Users/juliechaumard/Documents/GitHub/Aduzuki_v2/pdf/adhesion/2526/payee/lulliabo@icloud.com.pdf

  let OUTPUT;
  let INPUT;

  // S'il y a un don
  if (adherent_paiement_montant_don > 0) {

    OUTPUT = path.resolve(__dirname, "../pdf/adhesion/2526/paye/")+"/"+identifiant+"_adhesion_2526_paye_don_"+now_pdf+".pdf";
    INPUT = path.resolve(__dirname, "../pdf/template/carte_adherent_don.docx");

  } else {

    // S'il n'y a pas de don
    OUTPUT = path.resolve(__dirname, "../pdf/adhesion/2526/paye/")+"/"+identifiant+"_adhesion_2526_paye_"+now_pdf+".pdf";
    INPUT = path.resolve(__dirname, "../pdf/template/carte_adherent.docx");

  }

  moment.locale('fr');
  var date_formattee = moment().format('L')
  var today = date_formattee;

  var adresse = adherent_adresse_rue;
  adresse += " ";
  adresse += adherent_adresse_codepostal;
  adresse += " ";
  adresse += adherent_adresse_ville;

  if (profil2 == undefined) {profil2 = " "};
  if (profil3 == undefined) {profil3 = ""};


  JSON_INPUT = 
  {
    "date": today,
    "identifiant": identifiant,
    "profil1": profil1,
    "profil2": profil2,
    "profil3": profil3,
    "mode_paiement": "carte bancaire",
    "nom": adherent_nom,
    "prenom": adherent_prenom,
    "adresse": adresse,
    "montant_don": adherent_paiement_montant_don
  };

  const documentMerge = PDFServicesSdk.DocumentMerge,
    documentMergeOptions = documentMerge.options,
    adobe_options = new documentMergeOptions.DocumentMergeOptions(JSON_INPUT, documentMergeOptions.OutputFormat.PDF);

  // Create a new operation instance using the options instance.
  const documentMergeOperation = documentMerge.Operation.createNew(adobe_options);

  // Set operation input document template from a source file.
  const input = PDFServicesSdk.FileRef.createFromLocalFile(INPUT);
  documentMergeOperation.setInput(input);

  // Execute the operation and Save the result to the specified location.
  await documentMergeOperation
  .execute(executionContext)
  .then(result => result.saveAsFile(OUTPUT).then(
  )
  )
  .catch(err => {
      if(err instanceof PDFServicesSdk.Error.ServiceApiError
          || err instanceof PDFServicesSdk.Error.ServiceUsageError) {
          console.log('Exception encountered while executing ADOBE PDF', err);
      } else {
          console.log('Exception encountered while executing ADOBE PDF', err);
      }
  });


  //////////////////////////////////////////////////////////////////////////////
  // ENVOIE CARTE ADHERENT + JUSTIFICATIF DE DON PAR MAIL

  console.log("MAIL ENVOI AVANT");
  var transporter = nodemailer.createTransport({
      service: 'gmail',
      auth: {
        user: process.env.nodemailer_user,
        pass: process.env.nodemailer_pass
      }
  });

  var attachment_name = identifiant;
  attachment_name += "_adhesion_2526_carteadherent.pdf";
  var attachment_don_name = identifiant;
  attachment_don_name += "_don.pdf";

  var mail_objet = "ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - ADHÉSION 2025/2026 - ";
  mail_objet += identifiant;
  mail_html = "<p>Cher adhérent,</p><p>Félicitations ! Vous êtes désormais membre de l’Association Française pour la Pédagogie Suzuki (http://www.afpedagogiesuzuki.fr) et de l’European Suzuki Association (https://europeansuzuki.org) pour l'année 2025/2026. Vous pouvez à ce titre participer à tous les événements Suzuki en France et dans le monde.</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;
  mail_html += ".</p>";
  if (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: identifiant,
    subject: mail_objet,
    html: mail_html,
    attachments: [{
        filename: attachment_name,
        path: OUTPUT
      }
    ]
  };

  transporter.sendMail(mailOptions, function(error, info){
      if (error) {
        logger.info("error : " + error, { numsession: req.session.id });
      } else {
        console.log('Email sent: ' + info.response);
      }
  });
  console.log("MAIL ENVOI APRES");

  
  //////////////////////////////////////////////////////////////////////////////
  // REDIRECTION VERS LA PAGE DE CONFIRMATION PAIEMENT CARTE BANCAIRE
  res.locals.today = date_formattee;
  res.render('adhesion/page_templates/adhesion_paiement_reussi.ejs');
}

/////////////////////////////////////////////////
// RETOUR STRIPE CARTE BANCAIRE ANNULÉE OU PROBLÈME
/////////////////////////////////////////////////
const get_res_bank_annul = async function(req, res){

  logger.info("======================================");
  logger.info("======== FUNCTION get_res_bank_annul  (adhesion) ==========");
  logger.info("======================================");

  ////////////////////////////////////////////////////
  // CONNECTION ADOBE API
  ////////////////////////////////////////////////////
  const credentials =  PDFServicesSdk.Credentials
    .servicePrincipalCredentialsBuilder()
    .withClientId(process.env.PDF_SERVICES_CLIENT_ID)
    .withClientSecret(process.env.PDF_SERVICES_CLIENT_SECRET)
    .build();
  //timeout Default: 10000
  const clientConfig = PDFServicesSdk.ClientConfig
    .clientConfigBuilder()
    .withConnectTimeout(20000)
    .withReadTimeout(40000)
    .build();
  // Create an ExecutionContext using credentials
  const executionContext = PDFServicesSdk.ExecutionContext.create(credentials);

  console.log ("on est dans la ROUTE /adhesion_paiement/annule");
  var id = req.query.id;
  //  type = req.params.type;
  logger.info("id : " + id, { numsession: req.session.id });
  const session = await stripe.checkout.sessions.retrieve(id);

  console.log("======================================");
  console.log("======== SESSION STRIPE ==========");
  console.log("======================================");

  /////////////////////////////////////////////////
  // DATE DE L'ADHÉSION
  let now = moment().format("YYYY-MM-DD HH:mm:ss");
  let now_pdf = moment().format("YYYY-MM-DDTHH-mm-ss");

  console.info(session);
  var customer_email = session.customer_email;
  var payment_status = session.payment_status;
  var amount_total = session.amount_total/100;
  var stripe_customer = session.customer;
  var stripe_payment_intent = session.payment_intent;
  var payment_method_types = session.payment_method_types;
  var stripe_status = session.status;
  var profil = session.metadata.profil;
  var identifiant = session.metadata.identifiant;

  var adherent_paiement_montant_don = session.metadata.adherent_paiement_montant_don;
  var adherent_paiement_montant_adhesion = session.metadata.adherent_paiement_montant_adhesion;
  var adherent_nom = session.metadata.adherent_nom;

  //////////////////////////////////////////////////////////////////////////////
  // DÉFINIR LE PROFIL À AJOUTER DANS LA CARTE ADHÉRENT
  // La fonction est dans le fichier /modules/adherent_type.js
  profils = carte_adherent.profil(adherent_type);
  profil1 = profils[0];
  profil2 = profils[1];
  profil3 = profils[2];

  console.log("customer_email: ", customer_email);
  logger.info("payment_status : " + payment_status, { numsession: req.session.id });
  console.log("stripe_customer: ", stripe_customer);
  console.log("amount_total: ", amount_total);
  console.log("stripe_payment_intent: ", stripe_payment_intent);
  console.log("payment_method_types: ", payment_method_types);
  console.log("stripe_status: ", stripe_status);
  console.log("metadata.profil: ", profil);

  res.locals.customer_email = customer_email;
  res.locals.payment_status = payment_status;
  res.locals.amount_total = amount_total;
  res.locals.stripe_customer = stripe_customer;
  res.locals.stripe_payment_intent = stripe_payment_intent;
  res.locals.payment_method_types = payment_method_types;
  res.locals.stripe_status = stripe_status;
  res.locals.identifiant = identifiant;
  res.locals.profil1 = profil1;
  res.locals.profil2 = profil2;
  res.locals.profil3 = profil3;

  logger.info("req.session.identifiant: " + req.session.identifiant, { numsession: req.session.id });

  //////////////////////////////////////////////////////////////////////////////
  // MISE À JOUR DES INFORMATIONS SUR LE PAIEMENT DANS LA BASE DE DONNÉES adherent_finance

  let stripe_retour = "payment_status:"+payment_status+",stripe_customer:"+stripe_customer+",stripe_payment_intent:"+stripe_payment_intent+",sessionID:"+session.id+",payment_method_types:"+payment_method_types+",amount_total:"+amount_total+",stripe_status:"+stripe_status;

  // Vérifier que la session n'a pas expiré
  if (identifiant) {
    try {
      const db_connection_promise = await mysql_promise.createConnection({
        host: process.env.db_connection_host,
        port: process.env.db_connection_port,
        user: process.env.db_connection_user,
        password: process.env.db_connection_password,
        database: process.env.db_connection_database
      });
      logger.info("======================================", { label: filename });
      logger.info("Connected TO DATABASE test with mysql2 PREMISE !", { label: filename });
      logger.info("======================================", { label: filename });

      // METTRE À JOUR LES INFOS DE PAIEMENT DANS  adherent_finance
      let sql = 'UPDATE ';
      sql += 'adherent_finance';
      sql += ' SET ';
      sql += 'date_paiement = "' + now + '", ';
      sql += 'stripe_retour = "' + stripe_retour + '", ';
      sql += 'statut_paiement = "impaye"';
      sql += ' WHERE identifiant = "' + identifiant + '"';

      logger.info("REQUETE SQL UPDATE adherent_finance : " + sql , { numsession: req.session.id, label: filename});

      try {
        // METTRE À JOUR LES INFOS DE PAIEMENT DANS  adherent_finance
        const [results, fields] = await db_connection_promise.execute(sql);
        logger.info("adherent_finance Row ID changed : " + results.changedRows, { numsession: req.session.id, label: filename});


      } catch (error) {
        // Echec de la requête
        console.log(error);
        logger.error("Il y a un problème avec la requête INSERT INTO adherent_finance! : " + error, { numsession: req.session.id });
        req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer.";
        // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur
        await db_connection_promise.end();
        res.redirect('/adhesion');
      }



      // METTRE À JOUR LE STATUS D'ENVOI DE LA CARTE
      let sql2 = 'UPDATE ';
      sql2 += 'adherent';
      sql2 += ' SET ';
      sql2 += 'carte_envoi = "temporaire"';
      sql2 += ' WHERE identifiant = "' + identifiant + '"';

      logger.info("REQUETE SQL UPDATE adherent : " + sql2, { numsession: req.session.id, label: filename});

      try {
        // METTRE À JOUR LES INFOS DE PAIEMENT DANS  adherent
        const [results, fields] = await db_connection_promise.execute(sql2);
        logger.info("adherent_finance Row ID changed : " + results.changedRows, { numsession: req.session.id, label: filename});


      } catch (error) {
        // Echec de la requête
        console.log(error);
        logger.error("Il y a un problème avec la requête INSERT INTO adherent_finance! : " + error, { numsession: req.session.id });
        req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer.";
        // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur
        await db_connection_promise.end();
        res.redirect('/adhesion');
      }




    } catch (error) {
      // Echec de connection à la BD
      logger.error("Il y a un problème avec la connection à  la base de données! : " + error, { numsession: req.session.id });
      req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer.";
      // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur
      await db_connection_promise.end();
      res.redirect('/adhesion');
    };

  } else {
    // les Infos de session ne sont plus dispo
    logger.info("les Infos de session ne sont plus dispo! : ", { numsession: req.session.id });
    req.session.err_mail_form_adhesion_1 = "La session a expiré.";
    req.session.err_mail_form_adhesion_2 = "Si vous n'aviez pas pu finaliser votre paiement veuillez nous envoyer un chèque ou un virement.";
    req.session.err_mail_form_adhesion_3 = "Pour tout problème veuillez contacter l’Association.";
    // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur
    res.redirect('/adhesion');
  }

  //////////////////////////////////////////////////////////////////////////////
  // ADOBE PDF : CRÉATION DE LA CARTE D'ADHÉSION TEMPORAIRE EN PDF

  let OUTPUT = path.resolve(__dirname, "../pdf/adhesion/2526/attente/")+"/"+identifiant+"_adhesion_2526_attente_"+now_pdf+".pdf";
  let INPUT = path.resolve(__dirname, "../pdf/template/carte_adherent_temp.docx");

  moment.locale('fr');
  var date_formattee = moment().format('L')
  var today = date_formattee;

  if (profil2 == undefined) {profil2 = " "};
  if (profil3 == undefined) {profil3 = ""};

  JSON_INPUT = 
  {
    "date": today,
    "identifiant": identifiant,
    "profil1": profil1,
    "profil2": profil2,
    "profil3": profil3,
    "montant": adherent_paiement_montant_adhesion
  };

  const documentMerge = PDFServicesSdk.DocumentMerge,
    documentMergeOptions = documentMerge.options,
    adobe_options = new documentMergeOptions.DocumentMergeOptions(JSON_INPUT, documentMergeOptions.OutputFormat.PDF);

  // Create a new operation instance using the options instance.
  const documentMergeOperation = documentMerge.Operation.createNew(adobe_options);

  // Set operation input document template from a source file.
  const input = PDFServicesSdk.FileRef.createFromLocalFile(INPUT);
  documentMergeOperation.setInput(input);

  // Execute the operation and Save the result to the specified location.
  await documentMergeOperation
  .execute(executionContext)
  .then(result => result.saveAsFile(OUTPUT).then(
  )
  )
  .catch(err => {
      if(err instanceof PDFServicesSdk.Error.ServiceApiError
          || err instanceof PDFServicesSdk.Error.ServiceUsageError) {
          console.log('Exception encountered while executing ADOBE PDF', err);
      } else {
          console.log('Exception encountered while executing ADOBE PDF', err);
      }
  });

  //////////////////////////////////////////////////////////////////////////////
  // ENVOIE CARTE ADHERENT TEMPORAIRE PAR MAIL

  console.log("MAIL ENVOI AVANT");
  var transporter = nodemailer.createTransport({
      service: 'gmail',
      auth: {
        user: process.env.nodemailer_user,
        pass: process.env.nodemailer_pass
      }
  });

  var attachment_name = identifiant;
  attachment_name += "_adhesion_2526_carteadherent.pdf";


  var mail_objet = "ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - ADHÉSION 2025/2026 - ";
  mail_objet += adherent_nom;
  mail_html = "<p>Cher adhérent,</p><p>Félicitations ! Dès que votre paiement sera validé, vous serez membre de l’Association Française pour la Pédagogie Suzuki (http://www.afpedagogiesuzuki.fr) et de l’European Suzuki Association (https://europeansuzuki.org).<br>Vous pourrez à 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 2025/2026 temporaire.</p><p>Votre identifiant est ";
  mail_html += identifiant;
  mail_html += ".</p><p>Veuillez toutefois noter que votre adhésion ne sera effective qu'à la réception de votre règlement de ";
  mail_html += adherent_paiement_montant_adhesion;
  mail_html += " euros.<br>";
  if (adherent_paiement_montant_don > 0) {
      mail_html += "Nous vous remercions pour votre proposition de don de ";
      mail_html += adherent_paiement_montant_don;
      mail_html += " euros que vous pouvez ajouter à votre règlement.";
  }
  mail_html += "</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: identifiant,
  subject: mail_objet,
  html: mail_html,
  attachments: [{
      filename: attachment_name,
      path: OUTPUT
  }],
  };

  transporter.sendMail(mailOptions, function(error, info){
      if (error) {
        logger.info("error : " + error, { numsession: req.session.id });
      } else {
        console.log('Email sent: ' + info.response);
      }
  });
  console.log("MAIL ENVOI APRES");

  //////////////////////////////////////////////////////////////////////////////
  // REDIRECTION VERS LA PAGE DE DE FIN
  res.locals.adherent_paiement_montant_adhesion = adherent_paiement_montant_adhesion;
  res.locals.adherent_paiement_montant_don = adherent_paiement_montant_don;
  res.locals.today = date_formattee;
  res.render('adhesion/page_templates/adhesion_paiement_annule.ejs');
}

  

/////////////////////////////////////////////////
// ENVOI MANUEL CARTE ADHÉSION ET JUSTIFICATIF DE DON (SI DON)
/////////////////////////////////////////////////
/////////////////////////////////////////////////
// SAISIE DU MAIL
// VÉRIFIER SI DÉJÀ INSCRIT DANS GOOGLE
/////////////////////////////////////////////////
const post_cartemanuelle_verifmail_envoicarte = async function(req, res){
    
  logger.info("======================================");
  logger.info("======== FUNCTION checkMail ENVOI MANUEL  (adhesion) ==========");
  logger.info("======================================");

  await doc.useServiceAccountAuth(creds);
  await doc.loadInfo(); // loads document properties and worksheets
  console.log("NOM FICHIER SHEET: ",doc.title); //nom du fichier
  
  const sheet = doc.sheetsByTitle['adhesion_annuelle_web'];
  console.log("NOM DU TABLEAU (ONGLET): ",sheet.title); //NOM DU TABLEAU (ONGLET)
  console.log("NOMBRE DE LIGNE DU TABLEAU: ",sheet.rowCount); // NOMBRE DE LIGNE DU TABLEAU

  const rows = await sheet.getRows();
  console.log("rows[0].identifiant: ", rows[0].identifiant);


  let compteur = sheet.rowCount - 1;
  console.log("compteur: ",compteur);

  let rowToBeUpdate = 0;

  // ON RÉCUPÈRE LE MAIL (IDENTIFIANT) SAISIE DANS LE FORMULAIRE
  req.session.identifiant = req.body.identifiant;

  for (let i=0; i<compteur; i++) {
      if (rows[i].identifiant === req.session.identifiant){
          console.log("rows[",i,"].identifiant: ",rows[i].identifiant);
          console.log("i (dans mail trouvé) = ", i);
          rowToBeUpdate = i;
      }
  }
  console.log("rowToBeUpdate = ", rowToBeUpdate);
  if (rowToBeUpdate>0){

      console.log(rows[rowToBeUpdate].identifiant);
      console.log(rows[rowToBeUpdate].adherent_type);
      console.log(rows[rowToBeUpdate].adherent_nom);
      console.log(rows[rowToBeUpdate].adherent_prenom);
      console.log(rows[rowToBeUpdate].adherent_paiement_mode);
      console.log(rows[rowToBeUpdate].adherent_adresse_rue);
      console.log(rows[rowToBeUpdate].adherent_adresse_codepostal);
      console.log(rows[rowToBeUpdate].adherent_adresse_ville);
      console.log(rows[rowToBeUpdate].adherent_paiement_montant_don);


      //////////////////////////////////////////////////////////////////////////////
      // CRÉATION DE LA CARTE D'ADHÉSION EN PDF
      console.log("PDF CREATION AVANT");
      var html = fs.readFileSync(path.resolve(__dirname, "../pdf/template/carte_adherent.html"), "utf8");
      var options = {
          format: "A4",
          orientation: "portrait",
          border: "10mm",
      };
      moment().format();
      moment.locale('fr');
      var date_formattee = moment().format('L')
      var today = date_formattee;

      //////////////////////////////////////////////////////////////////////////////
      // DÉFINIR LE PROFIL À AJOUTER DANS LA CARTE ADHÉRENT
      // La fonction "profil" est dans le fichier /modules/adherent_type.js
      let adherent_type = rows[rowToBeUpdate].adherent_type;
      profils = carte_adherent.profil(adherent_type);
      profil1 = profils[0];
      profil2 = profils[1];
      profil3 = profils[2];
      console.log("profil1 = ",profil1);
      mode_paiement = "Adhésion payée par ";
      mode_paiement += rows[rowToBeUpdate].adherent_paiement_mode;
      var membres = [
          {
              today: today,
              description: "Votre carte d’adhérent à l’Association Française pour la pédagogie Suzuki",
              identifiant: rows[rowToBeUpdate].identifiant,
              profil1: profil1,
              profil2: profil2,
              profil3: profil3,
              type_card: "ADHÉRENT",
              adherent_paiement_mode: mode_paiement
          },
        ];
      
      var pdfname = path.resolve(__dirname, "../pdf/adhesion/2526/payee/");
      pdfname += "/";

      pdfname += rows[rowToBeUpdate].identifiant;
      pdfname += "_adhesion_2526_payee.pdf";
  
      var document = {
          html: html,
          data: {
              membres: membres,
            },
          path: pdfname,
          type: ""
        };
  
      await pdf
          .create(document, options)
          .then((res) => {
              console.log(res);
          })
          .catch((error) => {
              console.error(error);
          });
      console.log("PDF CREATION APRES");
  
      //////////////////////////////////////////////////////////////////////////////
      // CRÉATION DU PDF JUSTIFICATIF DE DON
  
      if (rows[rowToBeUpdate].adherent_paiement_montant_don > 0) {
        console.log("IF DON = OUI");
        var html_don = fs.readFileSync(path.resolve(__dirname, "../pdf/template/don_justificatif.html"), "utf8");
        //var html_don = fs.readFileSync("/Users/julie/Documents/GitHub/aduzuki/pdf/template/don_justificatif.html", "utf8");
        var options_don = {
            format: "A4",
            orientation: "portrait",
            border: "10mm",
        };
  
        var adresse = rows[rowToBeUpdate].adherent_adresse_rue;
        adresse += " ";
        adresse += rows[rowToBeUpdate].adherent_adresse_codepostal;
        adresse += " ";
        adresse += rows[rowToBeUpdate].adherent_adresse_ville;
  
        var donneur = [
          {
              today: today,
              identifiant: rows[rowToBeUpdate].identifiant,
              nom: rows[rowToBeUpdate].adherent_nom,
              prenom: rows[rowToBeUpdate].adherent_prenom,
              adresse: adresse,
              adherent_paiement_mode: "carte bancaire",
              montant_don: rows[rowToBeUpdate].adherent_paiement_montant_don
          },
        ];
  
        var pdfname_don = path.resolve(__dirname, "../pdf/adhesion/2526/don/");
        
        pdfname_don += "/";
        pdfname_don += rows[rowToBeUpdate].identifiant;
        pdfname_don += "_adhesion_2526_don.pdf";
  
        var document_don = {
            html: html_don,
            data: {
              donneur: donneur,
              },
            path: pdfname_don,
            type: ""
          };
  
        await pdf
            .create(document_don, options_don)
            .then((res) => {
                console.log(res);
            })
            .catch((error) => {
                console.error(error);
            });
  
      }
  
      //////////////////////////////////////////////////////////////////////////////
      // ENVOIE CARTE ADHERENT + JUSTIFICATIF DE DON PAR MAIL
  
      console.log("MAIL ENVOI AVANT");
      var transporter = nodemailer.createTransport({
          service: 'gmail',
          auth: {
              // TEST JULIE
            //user: 'juliechaumard@gmail.com',
            //pass: 'etfq umof iwbx ltxk'
            // SUZUKI
            user: 'afpedagogiesuzuki@gmail.com',
            pass: 'tlxx kjwx ahyx irnl'
          }
      });
  
      var attachment_name = rows[rowToBeUpdate].identifiant;
      attachment_name += "_adhesion_2526_carteadherent.pdf";
      var attachment_don_name = rows[rowToBeUpdate].identifiant;
      attachment_don_name += "_adhesion_2526_don.pdf";
  
      var mail_objet = "ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - ADHÉSION 2025/2026 - ";
      mail_objet += rows[rowToBeUpdate].adherent_nom;
      mail_html = "<p>Cher adhérent,</p><p>Félicitations ! Vous êtes désormais membre de l’Association Française pour la Pédagogie Suzuki (http://www.afpedagogiesuzuki.fr) et de l’European Suzuki Association (https://europeansuzuki.org).<br>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 += rows[rowToBeUpdate].identifiant;
      mail_html += ".</p>";
      if (rows[rowToBeUpdate].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>";
  
      if (req.session.adherent_paiement_montant_don > 0) {
        var mailOptions = {
          from: 'afpedagogiesuzuki@gmail.com',
          to: req.session.identifiant,
          subject: mail_objet,
          html: mail_html,
          attachments: [{
              filename: attachment_name,
              path: pdfname
            },
            {
              filename: attachment_don_name,
              path: pdfname_don
            }
          ],
        };
      } else {
        var mailOptions = {
          from: 'afpedagogiesuzuki@gmail.com',
          to: req.session.identifiant,
          subject: mail_objet,
          html: mail_html,
          attachments: [{
              filename: attachment_name,
              path: pdfname
            }
          ],
        };
      }
  
      transporter.sendMail(mailOptions, function(error, info){
          if (error) {
            console.log(error);
          } else {
            console.log('Email sent: ' + info.response);
          }
      });
      console.log("MAIL ENVOI APRES");



      //////////////////////////////////////////////////////////////////////////////
      // AFFICHAGE DANS LA PAGE WEB QUE LA CARTE EST ENVOYÉE
      req.session.err_mail_form_adhesion_1 = "Carte adhérent envoyée";
  } else {
      req.session.err_mail_form_adhesion_1 = "Cette adresse Email n'est pas inscrite pour les adhésions 2025/2026.";
      req.session.err_mail_form_adhesion_2 = "Vous ne pouvez pas lui envoyer la carte d'adhérent.";
  }
  
  res.redirect('/inscription/adhesion/carte_manuelle');

   
}


/////////////////////////////////////////////////
// ENVOI MANUEL CARTE ADHÉSION ET JUSTIFICATIF DE DON (SI DON)
// Si "x" dans la colonne "filtre" de la Google Sheet (TABLEAU adhesion_annuelle_web ET adhesion_ass_locales)
// GET URL https://www.adhesion.afpedagogiesuzuki.fr/inscription/adhesion/carte_manuelle
/////////////////////////////////////////////////
const post_cartes_manuelles_envoi = async function(req, res){

  logger.info("======================================");
  logger.info("======== FUNCTION ENVOI CARTES MANUELLES  (adhesion) ==========");
  logger.info("======================================");

  // RÉCUPÉRATION DU CONTENU DE LA GOOGLE SHEET
  await doc.useServiceAccountAuth(creds);
  await doc.loadInfo(); // loads document properties and worksheets
  console.log("NOM FICHIER SHEET: ",doc.title); //nom du fichier
  const sheet = doc.sheetsByTitle['adhesion_annuelle_web'];
  const sheet_asslocales = doc.sheetsByTitle['adhesion_ass_locales'];
  console.log("NOM DU TABLEAU (ONGLET): ",sheet.title); //NOM DU TABLEAU (ONGLET)
  console.log("NOMBRE DE LIGNE DU TABLEAU: ",sheet.rowCount); // NOMBRE DE LIGNE DU TABLEAU
  console.log("NOM DU TABLEAU (ONGLET) ASS LOCALES: ",sheet_asslocales.title); //NOM DU TABLEAU (ONGLET)
  console.log("NOMBRE DE LIGNE DU TABLEAU  ASS LOCALES: ",sheet_asslocales.rowCount); // NOMBRE DE LIGNE DU TABLEAU

  const rows = await sheet.getRows();
  console.log("rows[0].identifiant: ", rows[0].identifiant);
  const rows_asslocales = await sheet_asslocales.getRows();
  console.log("rows[0].identifiant: ", rows_asslocales[0].identifiant);

  // COMBIEN DE LIGNES A LE TABLEAU POUR DÉFINIR LE NOMBRE D'ITÉRATION DE LA BOUCLE
  // LA GOOGLE SHEET NE DOIT PAS CONTENIR DE LIGNE VIDE
  let compteur = sheet.rowCount - 1;
  console.log("compteur: ",compteur);
  let compteur_asslocales = sheet_asslocales.rowCount - 1;
  console.log("compteur ASS LOCALES: ",compteur_asslocales);

  // DATE DU JOUR
  moment().format();
  moment.locale('fr');
  var date_formattee = moment().format('L')
  console.log("date_formattee:", date_formattee);
  let message_envoye = "carte envoyée le ";
  message_envoye += date_formattee;

  // BOUCLE D'ENVOI POUR LE TABLEAU GOOGLE SHEET 'adhesion_annuelle_web'
  // SI LA CELLULE "filtre" CONTIENT un "x" ON ENVOIE LA CARTE
  let lesmails = new Array;
  let nbenvoi = 0;
  for (let i=0; i<compteur; i++) {      
    if (rows[i].filtre === "x"){
      lesmails[i] = rows[i].identifiant;
      console.log(lesmails[i]);
      console.log(rows[i].filtre);
      console.log("i = ", i);
      nbenvoi = nbenvoi + 1;

      
      // ENVOI DE LA CARTE ADHÉRENT
      
      //////////////////////////////////////////////////////////////////////////////
      // CRÉATION DE LA CARTE D'ADHÉSION EN PDF
      console.log("PDF CREATION AVANT");
      var html = fs.readFileSync(path.resolve(__dirname, "../pdf/template/carte_adherent.html"), "utf8");
      var options = {
          format: "A4",
          orientation: "portrait",
          border: "10mm",
      };
      //////////////////////////////////////////////////////////////////////////////
      // DÉFINIR LE PROFIL À AJOUTER DANS LA CARTE ADHÉRENT
      // La fonction "profil" est dans le fichier /modules/adherent_type.js
      let adherent_type = rows[i].adherent_type;
      profils = carte_adherent.profil(adherent_type);
      profil1 = profils[0];
      profil2 = profils[1];
      profil3 = profils[2];
      console.log("profil1 = ",profil1);
      mode_paiement = "Adhésion payée par ";
      mode_paiement += rows[i].adherent_paiement_mode;
      var membres = [
        {
            today: date_formattee,
            description: "Votre carte d’adhérent à l’Association Française pour la pédagogie Suzuki",
            identifiant: rows[i].identifiant,
            profil1: profil1,
            profil2: profil2,
            profil3: profil3,
            type_card: "ADHÉRENT",
            adherent_paiement_mode: mode_paiement
        },
      ];
      var pdfname = path.resolve(__dirname, "../pdf/adhesion/2526/payee/");
      pdfname += "/";
      pdfname += rows[i].identifiant;
      pdfname += "_adhesion_2526_payee.pdf";
  
      var document = {
          html: html,
          data: {
              membres: membres,
            },
          path: pdfname,
          type: ""
        };
  
      await pdf
          .create(document, options)
          .then((res) => {
              console.log(res);
          })
          .catch((error) => {
              console.error(error);
          });
      console.log("PDF CREATION APRES");

      //////////////////////////////////////////////////////////////////////////////
      // CRÉATION DU PDF JUSTIFICATIF DE DON
  
      if (rows[i].adherent_paiement_montant_don > 0) {
        console.log("IF DON = OUI");
        var html_don = fs.readFileSync(path.resolve(__dirname, "../pdf/template/don_justificatif.html"), "utf8");
        var options_don = {
            format: "A4",
            orientation: "portrait",
            border: "10mm",
        };
  
        var adresse = rows[i].adherent_adresse_rue;
        adresse += " ";
        adresse += rows[i].adherent_adresse_codepostal;
        adresse += " ";
        adresse += rows[i].adherent_adresse_ville;
  
        var donneur = [
          {
              today: date_formattee,
              identifiant: rows[i].identifiant,
              nom: rows[i].adherent_nom,
              prenom: rows[i].adherent_prenom,
              adresse: adresse,
              adherent_paiement_mode: rows[i].adherent_paiement_mode,
              montant_don: rows[i].adherent_paiement_montant_don
          },
        ];
  
        var pdfname_don = path.resolve(__dirname, "../pdf/adhesion/2526/don/");
        pdfname_don += "/";
        pdfname_don += rows[i].identifiant;
        pdfname_don += "_adhesion_2526_don.pdf";
  
        var document_don = {
            html: html_don,
            data: {
              donneur: donneur,
              },
            path: pdfname_don,
            type: ""
          };
  
        await pdf
            .create(document_don, options_don)
            .then((res) => {
                console.log(res);
            })
            .catch((error) => {
                console.error(error);
            });
      }
  
      //////////////////////////////////////////////////////////////////////////////
      // ENVOIE CARTE ADHERENT + JUSTIFICATIF DE DON PAR MAIL
  
      console.log("MAIL ENVOI AVANT");
      var transporter = nodemailer.createTransport({
          service: 'gmail',
          auth: {
            // MAIL JULIE
            //user: 'juliechaumard@gmail.com',
            //pass: 'etfq umof iwbx ltxk'
            // SUZUKI
            user: 'afpedagogiesuzuki@gmail.com',
            pass: 'tlxx kjwx ahyx irnl'
          }
      });
  
      var attachment_name = rows[i].identifiant;
      attachment_name += "_adhesion_2526_carteadherent.pdf";
      var attachment_don_name = rows[i].identifiant;
      attachment_don_name += "_adhesion_2526_don.pdf";
  
      var mail_objet = "ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - ADHÉSION 2025/2026 - ";
      mail_objet += rows[i].adherent_nom;
      mail_html = "<p>Cher adhérent,</p><p>Félicitations ! Vous êtes désormais membre de l’Association Française pour la Pédagogie Suzuki (http://www.afpedagogiesuzuki.fr) et de l’European Suzuki Association (https://europeansuzuki.org).<br>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 += rows[i].identifiant;
      mail_html += ".</p>";
      if (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>";
  
      if (rows[i].adherent_paiement_montant_don > 0) {
        var mailOptions = {
          from: 'afpedagogiesuzuki@gmail.com',
          to: rows[i].identifiant,
          subject: mail_objet,
          html: mail_html,
          attachments: [{
              filename: attachment_name,
              path: pdfname
            },
            {
              filename: attachment_don_name,
              path: pdfname_don
            }
          ],
        };
      } else {
        var mailOptions = {
          from: 'afpedagogiesuzuki@gmail.com',
          to: rows[i].identifiant,
          subject: mail_objet,
          html: mail_html,
          attachments: [{
              filename: attachment_name,
              path: pdfname
            }
          ],
        };
      }
  
      transporter.sendMail(mailOptions, function(error, info){
          if (error) {
            console.log(error);
          } else {
            console.log('Email sent: ' + info.response);
          }
      });
      console.log("MAIL ENVOI APRES");







      rows[i].filtre = message_envoye;
      await rows[i].save();
    }
    
  }
  console.log("LISTE lesmails :");
  // Supprimer les items vides de l'array lesmails
  lesmails = lesmails.filter(Boolean);
  console.log(lesmails);
  console.log("nbenvoi :",nbenvoi);

  // BOUCLE D'ENVOI POUR LE TABLEAU GOOGLE SHEET 'adhesion_ass_locales'
  // SI LA CELLULE "filtre" CONTIENT un "x" ON ENVOIE LA CARTE
  let nbenvoi2 = 0;
  let lesmails_asslocales = new Array;
  for (let i=0; i<compteur_asslocales; i++) {
    if (rows_asslocales[i].filtre === "x"){
      nbenvoi2 = nbenvoi2 + 1;
      lesmails_asslocales[i] = rows_asslocales[i].identifiant;
      console.log(lesmails_asslocales[i]);
      console.log(rows_asslocales[i].filtre);
      console.log("i = ", i);

      // ENVOI DE LA CARTE ADHÉRENT


      //////////////////////////////////////////////////////////////////////////////
      // CRÉATION DE LA CARTE D'ADHÉSION EN PDF
      console.log("PDF CREATION AVANT");
      var html = fs.readFileSync(path.resolve(__dirname, "../pdf/template/carte_adherent.html"), "utf8");
      var options = {
          format: "A4",
          orientation: "portrait",
          border: "10mm",
      };
      //////////////////////////////////////////////////////////////////////////////
      // DÉFINIR LE PROFIL À AJOUTER DANS LA CARTE ADHÉRENT
      // La fonction "profil" est dans le fichier /modules/adherent_type.js
      let adherent_type = rows_asslocales[i].adherent_type;
      profils = carte_adherent.profil(adherent_type);
      profil1 = profils[0];
      profil2 = profils[1];
      profil3 = profils[2];
      console.log("profil1 = ",profil1);
      mode_paiement = "Adhésion payée par ";
      mode_paiement += rows_asslocales[i].adherent_paiement_mode;
      var membres = [
        {
            today: date_formattee,
            description: "Votre carte d’adhérent à l’Association Française pour la pédagogie Suzuki",
            identifiant: rows_asslocales[i].identifiant,
            profil1: profil1,
            profil2: profil2,
            profil3: profil3,
            type_card: "ADHÉRENT",
            adherent_paiement_mode: mode_paiement
        },
      ];
      var pdfname = path.resolve(__dirname, "../pdf/adhesion/2526/payee/");
      pdfname += "/";
      pdfname += rows_asslocales[i].identifiant;
      pdfname += "_adhesion_2526_payee.pdf";
  
      var document = {
          html: html,
          data: {
              membres: membres,
            },
          path: pdfname,
          type: ""
        };
  
      await pdf
          .create(document, options)
          .then((res) => {
              console.log(res);
          })
          .catch((error) => {
              console.error(error);
          });
      console.log("PDF CREATION APRES");

      //////////////////////////////////////////////////////////////////////////////
      // CRÉATION DU PDF JUSTIFICATIF DE DON
  
      if (rows_asslocales[i].adherent_paiement_montant_don > 0) {
        console.log("IF DON = OUI");
        var html_don = fs.readFileSync(path.resolve(__dirname, "../pdf/template/don_justificatif.html"), "utf8");
        var options_don = {
            format: "A4",
            orientation: "portrait",
            border: "10mm",
        };
  
        var adresse = rows_asslocales[i].adherent_adresse_rue;
        adresse += " ";
        adresse += rows_asslocales[i].adherent_adresse_codepostal;
        adresse += " ";
        adresse += rows_asslocales[i].adherent_adresse_ville;
  
        var donneur = [
          {
              today: date_formattee,
              identifiant: rows_asslocales[i].identifiant,
              nom: rows_asslocales[i].adherent_nom,
              prenom: rows_asslocales[i].adherent_prenom,
              adresse: adresse,
              adherent_paiement_mode: rows_asslocales[i].adherent_paiement_mode,
              montant_don: rows_asslocales[i].adherent_paiement_montant_don
          },
        ];
  
        var pdfname_don = path.resolve(__dirname, "../pdf/adhesion/2526/don/");
        pdfname_don += "/";
        pdfname_don += rows_asslocales[i].identifiant;
        pdfname_don += "_adhesion_2526_don.pdf";
  
        var document_don = {
            html: html_don,
            data: {
              donneur: donneur,
              },
            path: pdfname_don,
            type: ""
          };
  
        await pdf
            .create(document_don, options_don)
            .then((res) => {
                console.log(res);
            })
            .catch((error) => {
                console.error(error);
            });
      }
  
      //////////////////////////////////////////////////////////////////////////////
      // ENVOIE CARTE ADHERENT + JUSTIFICATIF DE DON PAR MAIL
  
      console.log("MAIL ENVOI AVANT");
      var transporter = nodemailer.createTransport({
          service: 'gmail',
          auth: {
            // MAIL JULIE
            //user: 'juliechaumard@gmail.com',
            //pass: 'etfq umof iwbx ltxk'
            // SUZUKI
            user: 'afpedagogiesuzuki@gmail.com',
            pass: 'tlxx kjwx ahyx irnl'
          }
      });
  
      var attachment_name = rows_asslocales[i].identifiant;
      attachment_name += "_adhesion_2526_carteadherent.pdf";
      var attachment_don_name = rows_asslocales[i].identifiant;
      attachment_don_name += "_adhesion_2526_don.pdf";
  
      var mail_objet = "ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - ADHÉSION 2025/2026 - ";
      mail_objet += rows_asslocales[i].adherent_nom;
      mail_html = "<p>Cher adhérent,</p><p>Félicitations ! Vous êtes désormais membre de l’Association Française pour la Pédagogie Suzuki (http://www.afpedagogiesuzuki.fr) et de l’European Suzuki Association (https://europeansuzuki.org).<br>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 += rows_asslocales[i].identifiant;
      mail_html += ".</p>";
      if (rows_asslocales[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>";
  
      if (rows_asslocales[i].adherent_paiement_montant_don > 0) {
        var mailOptions = {
          from: 'afpedagogiesuzuki@gmail.com',
          to: rows_asslocales[i].identifiant,
          subject: mail_objet,
          html: mail_html,
          attachments: [{
              filename: attachment_name,
              path: pdfname
            },
            {
              filename: attachment_don_name,
              path: pdfname_don
            }
          ],
        };
      } else {
        var mailOptions = {
          from: 'afpedagogiesuzuki@gmail.com',
          to: rows_asslocales[i].identifiant,
          subject: mail_objet,
          html: mail_html,
          attachments: [{
              filename: attachment_name,
              path: pdfname
            }
          ],
        };
      }
  
      transporter.sendMail(mailOptions, function(error, info){
          if (error) {
            console.log(error);
          } else {
            console.log('Email sent: ' + info.response);
          }
      });
      console.log("MAIL ENVOI APRES");






      rows_asslocales[i].filtre = message_envoye;
      await rows_asslocales[i].save();
    }
    
  }
  console.log("LISTE lesmails_asslocales :");
  // Supprimer les items vides de l'array lesmails_asslocales
  lesmails_asslocales = lesmails_asslocales.filter(Boolean);
  console.log(lesmails_asslocales);
  console.log("nbenvoi2 :",nbenvoi2);


  // TRAITEMENT FINI, ON AFFICHE LA PAGE AVEC LE RESULTAT

  req.session.err_mail_form_adhesion_1 = "Cartes adhérents envoyées";
  req.session.err_mail_form_adhesion_2 = lesmails;
  req.session.err_mail_form_adhesion_3 = lesmails_asslocales;

  res.redirect('/inscription/adhesion/cartes_manuelles');


}

/////////////////////////////////////////////////
// GOOGLE SHEET
// DÉCHARGEMENT DES DONNÉES DANS GOOGLE SHEET AUTOMATIQUE
// IL NE FAUT PAS DE LIGNE VIDES DANS LE GOOGLE SHEET
//// mysql2 | moment | google-spreadsheet
////
////
/////////////////////////////////////////////////
const maj_googlesheet_auto = async function(req, res) {
  logger.info("======================================", { label: filename });
  logger.info("======== FUNCTION maj_googlesheet_auto  (adhesion maj_googlesheet) ==========", { label: filename });
  logger.info("======================================", { label: filename });

  /////////////////////////////////////////////////
  // CONNEXION GSHEET
  await GS_adhesion.useServiceAccountAuth(GS_creds);
  await GS_adhesion.loadInfo();

  /////////////////////////////////////////////////
  // VARIABLES
  const GS_adhesion_adherent = GS_adhesion.sheetsByTitle['adherent'];
  const GS_adhesion_professeurs = GS_adhesion.sheetsByTitle['professeurs'];
  const GS_adhesion_professeurs_stagiaires = GS_adhesion.sheetsByTitle['professeurs_stagiaires'];
  const GS_adhesion_eleves = GS_adhesion.sheetsByTitle['eleves'];
  const GS_adhesion_finance = GS_adhesion.sheetsByTitle['finance'];
  const GS_adhesion_adherent_en_attente = GS_adhesion.sheetsByTitle['adherent_en_attente'];
  let sql, sql2, sql_recup_prof, sql_update_prof, sql_recup_prof_stagiaires, sql_update_prof_stagiaires, sql_recup_eleves, sql_update_eleves, sql_recup_adh_att, sql_update_adh_att, sql_recup_finance, sql_update_finance;
  let nb_onglet_adherent = 0; 
  let nb_onglet_prof = 0;
  let nb_onglet_stagiaires = 0;
  let nb_onglet_eleves = 0;
  let nb_onglet_adh_att = 0;
  let nb_onglet_finance = 0;

  /////////////////////////////////////////////////
  // DATE
  let now = moment().format("YYYY-MM-DD HH:mm:ss");

  /////////////////////////////////////////////////
  // CONNECTION DB
  try {
    const db_connection_promise = await mysql_promise.createConnection({
      host: process.env.db_connection_host,
      port: process.env.db_connection_port,
      user: process.env.db_connection_user,
      password: process.env.db_connection_password,
      database: process.env.db_connection_database
    });

    ////////////////////////////////////////
    // MAJ ONGLET adherent

    // EXECUTE SQL RÉCUPÉRATION INFORMATIONS
    sql = "SELECT adherent.date_maj, adherent.saison, adherent.identifiant, adherent.association_suzuki, adherent.adherent_type, adherent.adherent_nom, adherent.adherent_prenom, adherent.adherent_telephone_mobile, adherent.adherent_mail, adherent.adherent_adresse_rue, adherent.adherent_adresse_complement, adherent.adherent_adresse_codepostal, adherent.adherent_adresse_ville, adherent.adherent_adresse_pays, adherent.adherent_telephone_fixe, adherent.carte_envoi, adherent_finance.statut_paiement FROM adherent INNER JOIN adherent_finance ON adherent.identifiant = adherent_finance.identifiant WHERE (adherent.gsheet = '' OR adherent.gsheet IS NULL)";
    //logger.info("REQUETE SQL - MAJ ONGLET adherent : " + sql , { numsession: req.session.id, label: filename});

    const [results, fields] = await db_connection_promise.execute(sql); // Execution SQL
    logger.info("REQUETE SQL - SELECT ONGLET adherent - Nombre de lignes = " + results.length, { numsession: req.session.id, label: filename});

    if (results.length > 0) {
      logger.info("ON EST DANS  if (results.length > 0)", { numsession: req.session.id, label: filename});
      // TABLEAU POUR METTRE LES INFORMATIONS
      const rowsToAdd_adherent = [];
      for (let i = 0; i < results.length; i++ ) { // Pour chaque ligne trouvée dans la table, on le met dans le tableau rowsToAdd
        //logger.info("Préparation des données pour injection dans la Google Sheet pour le membre : " + results[i].identifiant, { numsession: req.session.id, label: filename});
        if (results[i].statut_paiement === "paye") {
          nb_onglet_adherent++;
          rowsToAdd_adherent.push({
            'saison': results[i].saison,
            'association': results[i].association_suzuki,
            'identifiant': results[i].identifiant,
            'adhesion_date': results[i].date_maj,
            'adhesion_statut': results[i].statut_paiement,
            'adherent_type': results[i].adherent_type,
            'adherent_nom': results[i].adherent_nom,
            'adherent_prenom': results[i].adherent_prenom,
            'adherent_telephone_mobile': "'" + results[i].adherent_telephone_mobile,
            'adherent_mail': results[i].adherent_mail,
            'adherent_adresse_rue': results[i].adherent_adresse_rue,
            'adherent_adresse_complement': results[i].adherent_adresse_complement,
            'adherent_adresse_codepostal': results[i].adherent_adresse_codepostal,
            'adherent_adresse_ville': results[i].adherent_adresse_ville,
            'adherent_adresse_pays': results[i].adherent_adresse_pays,
            'adherent_telephone_fixe': "'" + results[i].adherent_telephone_fixe,
            'carte_envoi': results[i].carte_envoi,
            'date_maj_gsheet': now
          });
        }
      }

      // AJOUT DES INFOS DANS GOOGLE SHEET
      if (rowsToAdd_adherent.length > 0) {
        
        try {

          const ajout_gs_adherents = await GS_adhesion_adherent.addRows(rowsToAdd_adherent);
          logger.info("Insertion dans Google Sheets adhérents réussie", { numsession: req.session.id, label: filename });

          // EXECUTE SQL UPDATE "gsheet"
          // UNE FOIS LA GOOGLE SHEET MISE A JOUR AVEC LES NOUVEAUX ADHERENTS, ON MODIFIE LE CHAMP "gsheet" de la table dans la BD pour marquer que cette ligne a été importée
          // Construire la partie SQL pour Faire un UPDATE de plusieurs lignes à la fois
          try {
            sql2 = 'UPDATE adherent SET gsheet = CASE ';
            const identifiants = [];
            for (let i = 0; i < results.length; i++) {
              if (results[i].statut_paiement === "paye") {
                // Ajouter une clause `WHEN` pour chaque identifiant
                sql2 += `WHEN identifiant = '${results[i].identifiant}' THEN '${now}' `;
                
                // Collecter les identifiants pour la clause WHERE
                identifiants.push(`'${results[i].identifiant}'`);
              }
            }
            // Ajouter la clause WHERE pour limiter les mises à jour aux identifiants concernés
            sql2 += `END WHERE identifiant IN (${identifiants.join(',')})`;

            //logger.info("REQUETE SQL - sql2 - MAJ gsheet dans adherent : " + sql2 , { numsession: req.session.id, label: filename});
            const [results2, fields2] = await db_connection_promise.execute(sql2);
            logger.info("UPDATE adherent SET gsheet effectué pour plusieurs lignes : " + results2.changedRows, { numsession: req.session.id, label: filename });

          } catch (error) {
              logger.error("Échec de la mise à jour BD adhérents : " + error.message, { numsession: req.session.id, label: filename });
              await db_connection_promise.end();
              return;
          };

        } catch (error) {
            logger.error("Erreur lors de l'ajout des lignes à Google Sheets adhérents : " + error.message, { numsession: req.session.id, label: filename });
            await db_connection_promise.end();
            return;
        };
      }

      ////////////////////////////////////////
      // MAJ ONGLET professeur

      // EXECUTE SQL RÉCUPÉRATION INFORMATIONS
      sql_recup_prof = "SELECT adherent_professeur.date_maj, adherent_professeur.saison, adherent_professeur.identifiant, adherent_professeur.association_suzuki, adherent_professeur.adherent_nom, adherent_professeur.adherent_prenom, adherent_professeur.adherent_mail, adherent_professeur.adherent_telephone_mobile, adherent_professeur.adherent_prof_instrument1, adherent_professeur.adherent_prof_instrument1_esa, adherent_professeur.adherent_prof_instrument2, adherent_professeur.adherent_prof_instrument2_esa, adherent_professeur.adherent_prof_sece, adherent_professeur.adherent_prof_ecole1, adherent_professeur.adherent_prof_ecole1_mail, adherent_professeur.adherent_prof_ecole1_web, adherent_professeur.adherent_prof_ecole1_adresse, adherent_professeur.adherent_prof_ecole1_cp, adherent_professeur.adherent_prof_ecole1_ville, adherent_professeur.adherent_prof_ecole2, adherent_professeur.adherent_prof_ecole2_mail, adherent_professeur.adherent_prof_ecole2_web, adherent_professeur.adherent_prof_ecole2_adresse, adherent_professeur.adherent_prof_ecole2_cp, adherent_professeur.adherent_prof_ecole2_ville, adherent_professeur.adherent_prof_ecole3, adherent_professeur.adherent_prof_ecole3_mail, adherent_professeur.adherent_prof_ecole3_web, adherent_professeur.adherent_prof_ecole3_adresse, adherent_professeur.adherent_prof_ecole3_cp, adherent_professeur.adherent_prof_ecole3_ville, adherent_finance.statut_paiement FROM adherent_professeur INNER JOIN adherent_finance ON adherent_finance.identifiant = adherent_professeur.identifiant WHERE (adherent_professeur.gsheet = '' OR adherent_professeur.gsheet IS NULL) AND adherent_finance.statut_paiement = 'paye'";
      //logger.info("REQUETE SQL - MAJ ONGLET professeur : " + sql_recup_prof , { numsession: req.session.id, label: filename});

      const [results_recup_prof, fields_recup_prof] = await db_connection_promise.execute(sql_recup_prof); // Execution SQL
      logger.info("REQUETE SQL - SELECT ONGLET professeur - Nombre de lignes = " + results_recup_prof.length, { numsession: req.session.id, label: filename});
      nb_onglet_prof = results_recup_prof.length; // Pour afficher le résultat du nombre d'adhérents copiés dans la page web

      if (results_recup_prof.length > 0) {
        
        // TABLEAU POUR METTRE LES INFORMATIONS
        const rowsToAdd_prof = [];
        for (let i = 0; i < results_recup_prof.length; i++ ) { // Pour chaque ligne trouvée dans la table, on le met dans le tableau rowsToAdd
          //logger.info("Préparation des données pour injection dans la Google Sheet pour le membre : " + results_recup_prof[i].identifiant, { numsession: req.session.id, label: filename});
          rowsToAdd_prof.push({
            'saison': results_recup_prof[i].saison,
            'association': results_recup_prof[i].association_suzuki,
            'identifiant': results_recup_prof[i].identifiant,
            'adhesion_date': results_recup_prof[i].date_maj,
            'adherent_nom': results_recup_prof[i].adherent_nom,
            'adherent_prenom': results_recup_prof[i].adherent_prenom,
            'adherent_mail': results_recup_prof[i].adherent_mail,
            'adherent_telephone_mobile': "'" + results_recup_prof[i].adherent_telephone_mobile,
            'adherent_prof_instrument1': results_recup_prof[i].adherent_prof_instrument1,
            'adherent_prof_instrument1_esa': results_recup_prof[i].adherent_prof_instrument1_esa,
            'adherent_prof_instrument2': results_recup_prof[i].adherent_prof_instrument2,
            'adherent_prof_instrument2_esa': results_recup_prof[i].adherent_prof_instrument2_esa,
            'adherent_prof_sece': results_recup_prof[i].adherent_prof_sece,
            'adherent_prof_ecole1': results_recup_prof[i].adherent_prof_ecole1,
            'adherent_prof_ecole1_adresse': results_recup_prof[i].adherent_prof_ecole1_adresse,
            'adherent_prof_ecole1_cp': results_recup_prof[i].adherent_prof_ecole1_cp,
            'adherent_prof_ecole1_ville': results_recup_prof[i].adherent_prof_ecole1_ville,
            'adherent_prof_ecole1_mail': results_recup_prof[i].adherent_prof_ecole1_mail,
            'adherent_prof_ecole1_web': results_recup_prof[i].adherent_prof_ecole1_web,
            'adherent_prof_ecole2': results_recup_prof[i].adherent_prof_ecole2,
            'adherent_prof_ecole2_adresse': results_recup_prof[i].adherent_prof_ecole2_adresse,
            'adherent_prof_ecole2_cp': results_recup_prof[i].adherent_prof_ecole2_cp,
            'adherent_prof_ecole2_ville': results_recup_prof[i].adherent_prof_ecole2_ville,
            'adherent_prof_ecole2_mail': results_recup_prof[i].adherent_prof_ecole2_mail,
            'adherent_prof_ecole2_web': results_recup_prof[i].adherent_prof_ecole2_web,
            'adherent_prof_ecole3': results_recup_prof[i].adherent_prof_ecole3,
            'adherent_prof_ecole3_adresse': results_recup_prof[i].adherent_prof_ecole3_adresse,
            'adherent_prof_ecole3_cp': results_recup_prof[i].adherent_prof_ecole3_cp,
            'adherent_prof_ecole3_ville': results_recup_prof[i].adherent_prof_ecole3_ville,
            'adherent_prof_ecole3_mail': results_recup_prof[i].adherent_prof_ecole3_mail,
            'adherent_prof_ecole3_web': results_recup_prof[i].adherent_prof_ecole3_web,
            'date_maj_gsheet': now
          });
        }

        // AJOUT DES INFOS DANS GOOGLE SHEET
        if (rowsToAdd_prof.length > 0) {
          
          try {
            const ajout_gs_prof = await GS_adhesion_professeurs.addRows(rowsToAdd_prof);
            logger.info("Insertion dans Google Sheets professeur réussie", { numsession: req.session.id, label: filename });

            // EXECUTE SQL UPDATE "gsheet"
            // UNE FOIS LA GOOGLE SHEET MISE A JOUR AVEC LES NOUVEAUX ADHERENTS, ON MODIFIE LE CHAMP "gsheet" de la table dans la BD pour marquer que cette ligne a été importée
            // Construire la partie SQL pour Faire un UPDATE de plusieurs lignes à la fois
            try {
              sql_update_prof = 'UPDATE adherent_professeur SET gsheet = CASE ';
              const identifiants_prof = [];
              for (let i = 0; i < results_recup_prof.length; i++) {
                // Ajouter une clause `WHEN` pour chaque identifiant
                sql_update_prof += `WHEN identifiant = '${results_recup_prof[i].identifiant}' THEN '${now}' `;
                
                // Collecter les identifiants pour la clause WHERE
                identifiants_prof.push(`'${results_recup_prof[i].identifiant}'`);
              }
              // Ajouter la clause WHERE pour limiter les mises à jour aux identifiants concernés
              sql_update_prof += `END WHERE identifiant IN (${identifiants_prof.join(',')})`;

              //logger.info("REQUETE SQL - sql_update_prof - MAJ gsheet dans professeur : " + sql_update_prof , { numsession: req.session.id, label: filename});
              const [results_update_prof, fields_update_prof] = await db_connection_promise.execute(sql_update_prof);
              logger.info("UPDATE professeur SET gsheet effectué pour plusieurs lignes : " + results_update_prof.changedRows, { numsession: req.session.id, label: filename });

            } catch (error) {
                logger.error("Échec de la mise à jour BD prof : " + error.message, { numsession: req.session.id, label: filename });
                await db_connection_promise.end();
                return;
            };

          } catch (error) {
              logger.error("Erreur lors de l'ajout des lignes à Google Sheets prof : " + error.message, { numsession: req.session.id, label: filename });
              await db_connection_promise.end();
              return;
          };


        }
      }

      ////////////////////////////////////////
      // MAJ ONGLET professeurs_stagiaires

      // EXECUTE SQL RÉCUPÉRATION INFORMATIONS
      sql_recup_prof_stagiaires = "SELECT adherent_formation_prof.date_maj, adherent_formation_prof.saison, adherent_formation_prof.identifiant, adherent_formation_prof.association_suzuki, adherent_formation_prof.adherent_nom, adherent_formation_prof.adherent_prenom, adherent_formation_prof.adherent_mail, adherent_formation_prof.adherent_telephone_mobile, adherent_formation_prof.adherent_prof_stagiaire_instrument1, adherent_formation_prof.adherent_prof_stagiaire_instrument1_esa, adherent_formation_prof.adherent_prof_stagiaire_instrument1_prof, adherent_formation_prof.adherent_prof_stagiaire_instrument2, adherent_formation_prof.adherent_prof_stagiaire_instrument2_esa, adherent_formation_prof.adherent_prof_stagiaire_instrument2_prof, adherent_finance.statut_paiement FROM adherent_formation_prof INNER JOIN adherent_finance ON adherent_finance.identifiant = adherent_formation_prof.identifiant WHERE (adherent_formation_prof.gsheet = '' OR adherent_formation_prof.gsheet IS NULL) AND adherent_finance.statut_paiement = 'paye'";
      //logger.info("REQUETE SQL - MAJ ONGLET professeurs_stagiaires : " + sql_recup_prof_stagiaires , { numsession: req.session.id, label: filename});

      const [results_recup_prof_stagiaires, fields_recup_prof_stagiaires] = await db_connection_promise.execute(sql_recup_prof_stagiaires); // Execution SQL
      logger.info("REQUETE SQL - SELECT ONGLET professeurs_stagiaires - Nombre de lignes = " + results_recup_prof_stagiaires.length, { numsession: req.session.id, label: filename});
      nb_onglet_stagiaires = results_recup_prof_stagiaires.length; // Pour afficher le résultat du nombre d'adhérents copiés dans la page web

      if (results_recup_prof_stagiaires.length > 0) {
        
        // TABLEAU POUR METTRE LES INFORMATIONS
        const rowsToAdd_prof_stagiaires = [];
        for (let i = 0; i < results_recup_prof_stagiaires.length; i++ ) { // Pour chaque ligne trouvée dans la table, on le met dans le tableau rowsToAdd
          //logger.info("Préparation des données pour injection dans la Google Sheet pour le membre : " + results_recup_prof_stagiaires[i].identifiant, { numsession: req.session.id, label: filename});
          rowsToAdd_prof_stagiaires.push({
            'saison': results_recup_prof_stagiaires[i].saison,
            'association': results_recup_prof_stagiaires[i].association_suzuki,
            'identifiant': results_recup_prof_stagiaires[i].identifiant,
            'adhesion_date': results_recup_prof_stagiaires[i].date_maj,
            'adherent_nom': results_recup_prof_stagiaires[i].adherent_nom,
            'adherent_prenom': results_recup_prof_stagiaires[i].adherent_prenom,
            'adherent_mail': results_recup_prof_stagiaires[i].adherent_mail,
            'adherent_telephone_mobile': "'" + results_recup_prof_stagiaires[i].adherent_telephone_mobile,
            'adherent_prof_stagiaire_instrument1': results_recup_prof_stagiaires[i].adherent_prof_stagiaire_instrument1,
            'adherent_prof_stagiaire_instrument1_esa': results_recup_prof_stagiaires[i].adherent_prof_stagiaire_instrument1_esa,
            'adherent_prof_stagiaire_instrument1_prof': results_recup_prof_stagiaires[i].adherent_prof_stagiaire_instrument1_prof,
            'adherent_prof_stagiaire_instrument2': results_recup_prof_stagiaires[i].adherent_prof_stagiaire_instrument2,
            'adherent_prof_stagiaire_instrument2_esa': results_recup_prof_stagiaires[i].adherent_prof_stagiaire_instrument2_esa,
            'adherent_prof_stagiaire_instrument2_prof': results_recup_prof_stagiaires[i].adherent_prof_stagiaire_instrument2_prof,
            'date_maj_gsheet': now
          });
        }

        // AJOUT DES INFOS DANS GOOGLE SHEET
        if (rowsToAdd_prof_stagiaires.length > 0) {
          
          try {
            const ajout_gs_prof_stagiaires = await GS_adhesion_professeurs_stagiaires.addRows(rowsToAdd_prof_stagiaires);
            logger.info("Insertion dans Google Sheets professeurs_stagiaires réussie", { numsession: req.session.id, label: filename });

            // EXECUTE SQL UPDATE "gsheet"
            // UNE FOIS LA GOOGLE SHEET MISE A JOUR AVEC LES NOUVEAUX ADHERENTS, ON MODIFIE LE CHAMP "gsheet" de la table dans la BD pour marquer que cette ligne a été importée
            // Construire la partie SQL pour Faire un UPDATE de plusieurs lignes à la fois
            try {
              sql_update_prof_stagiaires = 'UPDATE adherent_formation_prof SET gsheet = CASE ';
              const identifiants_prof_stagiaires = [];
              for (let i = 0; i < results_recup_prof_stagiaires.length; i++) {
                // Ajouter une clause `WHEN` pour chaque identifiant
                sql_update_prof_stagiaires += `WHEN identifiant = '${results_recup_prof_stagiaires[i].identifiant}' THEN '${now}' `;
                
                // Collecter les identifiants pour la clause WHERE
                identifiants_prof_stagiaires.push(`'${results_recup_prof_stagiaires[i].identifiant}'`);
              }
              // Ajouter la clause WHERE pour limiter les mises à jour aux identifiants concernés
              sql_update_prof_stagiaires += `END WHERE identifiant IN (${identifiants_prof_stagiaires.join(',')})`;

              //logger.info("REQUETE SQL - sql_update_prof_stagiaires - MAJ gsheet dans professeurs_stagiaires : " + sql_update_prof_stagiaires , { numsession: req.session.id, label: filename});
              const [results_update_prof_stagiaires, fields_update_prof_stagiaires] = await db_connection_promise.execute(sql_update_prof_stagiaires);
              logger.info("UPDATE professeurs_stagiaires SET gsheet effectué pour plusieurs lignes : " + results_update_prof_stagiaires.changedRows, { numsession: req.session.id, label: filename });

            } catch (error) {
                logger.error("Échec de la mise à jour BD prof stagiaires : " + error.message, { numsession: req.session.id, label: filename });
                await db_connection_promise.end();
                return;
            };

          } catch (error) {
              logger.error("Erreur lors de l'ajout des lignes à Google Sheets prof stagiaires : " + error.message, { numsession: req.session.id, label: filename });
              await db_connection_promise.end();
              return;
          };


        }
      }

      ////////////////////////////////////////
      // MAJ ONGLET eleves

      // EXECUTE SQL RÉCUPÉRATION INFORMATIONS
      sql_recup_eleves = "SELECT adherent_eleve.date_maj, adherent_eleve.saison, adherent_eleve.identifiant, adherent_eleve.association_suzuki, adherent_eleve.eleve_nom, adherent_eleve.eleve_prenom, adherent_eleve.adherent_mail, adherent_eleve.adherent_telephone_mobile, adherent_eleve.eleve_datenaissance, adherent_eleve.eleve_instrumentA, adherent_eleve.eleve_instrumentA_cahier, adherent_eleve.eleve_instrumentA_prof, adherent_eleve.eleve_instrumentB, adherent_eleve.eleve_instrumentB_cahier, adherent_eleve.eleve_instrumentB_prof, adherent_eleve.eleve_droitimage, adherent_eleve.eleve_contactsup_nom, adherent_eleve.eleve_contactsup_prenom, adherent_eleve.eleve_contactsup_mail, adherent_finance.statut_paiement FROM adherent_eleve INNER JOIN adherent_finance ON adherent_finance.identifiant = adherent_eleve.identifiant WHERE (adherent_eleve.gsheet = '' OR adherent_eleve.gsheet IS NULL) AND adherent_finance.statut_paiement = 'paye'";
      //logger.info("REQUETE SQL - MAJ ONGLET eleves : " + sql_recup_eleves , { numsession: req.session.id, label: filename});

      const [results_recup_eleves, fields_recup_eleves] = await db_connection_promise.execute(sql_recup_eleves); // Execution SQL
      logger.info("REQUETE SQL - SELECT ONGLET eleves - Nombre de lignes = " + results_recup_eleves.length, { numsession: req.session.id, label: filename});
      nb_onglet_eleves = results_recup_eleves.length; // Pour afficher le résultat du nombre d'adhérents copiés dans la page web

      if (results_recup_eleves.length > 0) {
        
        // TABLEAU POUR METTRE LES INFORMATIONS
        const rowsToAdd_eleves = [];
        for (let i = 0; i < results_recup_eleves.length; i++ ) { // Pour chaque ligne trouvée dans la table, on le met dans le tableau rowsToAdd
          //logger.info("Préparation des données pour injection dans la Google Sheet pour le membre : " + results_recup_eleves[i].identifiant, { numsession: req.session.id, label: filename});
          rowsToAdd_eleves.push({
            'saison': results_recup_eleves[i].saison,
            'association': results_recup_eleves[i].association_suzuki,
            'identifiant': results_recup_eleves[i].identifiant,
            'adhesion_date': results_recup_eleves[i].date_maj,
            'eleve_nom': results_recup_eleves[i].eleve_nom,
            'eleve_prenom': results_recup_eleves[i].eleve_prenom,
            'eleve_datenaissance': results_recup_eleves[i].eleve_datenaissance,
            'adherent_mail': results_recup_eleves[i].adherent_mail,
            'adherent_telephone_mobile': "'" + results_recup_eleves[i].adherent_telephone_mobile,
            'eleve_instrumentA': results_recup_eleves[i].eleve_instrumentA,
            'eleve_instrumentA_cahier': results_recup_eleves[i].eleve_instrumentA_cahier,
            'eleve_instrumentA_prof': results_recup_eleves[i].eleve_instrumentA_prof,
            'eleve_instrumentB': results_recup_eleves[i].eleve_instrumentB,
            'eleve_instrumentB_cahier': results_recup_eleves[i].eleve_instrumentB_cahier,
            'eleve_instrumentB_prof': results_recup_eleves[i].eleve_instrumentB_prof,
            'eleve_droitimage': results_recup_eleves[i].eleve_droitimage,
            'eleve_contactsup_nom': results_recup_eleves[i].eleve_contactsup_nom,
            'eleve_contactsup_prenom': results_recup_eleves[i].eleve_contactsup_prenom,
            'eleve_contactsup_mail': results_recup_eleves[i].eleve_contactsup_mail,
            'date_maj_gsheet': now
          });
        }

        // AJOUT DES INFOS DANS GOOGLE SHEET
        if (rowsToAdd_eleves.length > 0) {
          
          try {
            const ajout_gs_eleves = await GS_adhesion_eleves.addRows(rowsToAdd_eleves);
            logger.info("Insertion dans Google Sheets eleves réussie", { numsession: req.session.id, label: filename });

            // EXECUTE SQL UPDATE "gsheet"
            // UNE FOIS LA GOOGLE SHEET MISE A JOUR AVEC LES NOUVEAUX ADHERENTS, ON MODIFIE LE CHAMP "gsheet" de la table dans la BD pour marquer que cette ligne a été importée
            // Construire la partie SQL pour Faire un UPDATE de plusieurs lignes à la fois
            try {
              sql_update_eleves = 'UPDATE adherent_eleve SET gsheet = CASE ';
              const identifiants_eleves = [];
              for (let i = 0; i < results_recup_eleves.length; i++) {
                // Ajouter une clause `WHEN` pour chaque identifiant
                sql_update_eleves += `WHEN identifiant = '${results_recup_eleves[i].identifiant}' THEN '${now}' `;
                
                // Collecter les identifiants pour la clause WHERE
                identifiants_eleves.push(`'${results_recup_eleves[i].identifiant}'`);
              }
              // Ajouter la clause WHERE pour limiter les mises à jour aux identifiants concernés
              sql_update_eleves += `END WHERE identifiant IN (${identifiants_eleves.join(',')})`;

              //logger.info("REQUETE SQL - sql_update_eleves - MAJ gsheet dans eleves : " + sql_update_eleves , { numsession: req.session.id, label: filename});
              const [results_update_eleves, fields_update_eleves] = await db_connection_promise.execute(sql_update_eleves);
              logger.info("UPDATE eleves SET gsheet effectué pour plusieurs lignes : " + results_update_eleves.changedRows, { numsession: req.session.id, label: filename });

            } catch (error) {
                logger.error("Échec de la mise à jour BD eleves : " + error.message, { numsession: req.session.id, label: filename });
                await db_connection_promise.end();
                return;
            };

          } catch (error) {
              logger.error("Erreur lors de l'ajout des lignes à Google Sheets eleves : " + error.message, { numsession: req.session.id, label: filename });
              await db_connection_promise.end();
              return;
          };


        }
      }


      ////////////////////////////////////////
      // MAJ ONGLET adherent_en_attente

      // EXECUTE SQL RÉCUPÉRATION INFORMATIONS
      sql_recup_adh_att = "SELECT adherent_finance.date_maj, adherent_finance.saison, adherent_finance.identifiant, adherent_finance.association_suzuki, adherent_finance.adherent_type, adherent_finance.adherent_nom, adherent_finance.adherent_prenom, adherent_finance.adherent_telephone_mobile, adherent_finance.adherent_mail, adherent_finance.montant_adhesion, adherent_finance.montant_don, adherent_finance.montant_total, adherent_finance.paiement_mode, adherent_finance.date_paiement, adherent_finance.stripe_retour, adherent_finance.cheque_banque, adherent_finance.cheque_numero, adherent_finance.statut_paiement FROM adherent_finance WHERE (adherent_finance.gs_adherent_att = '' OR adherent_finance.gs_adherent_att IS NULL) AND (adherent_finance.statut_paiement <> 'paye' OR adherent_finance.statut_paiement IS NULL OR adherent_finance.statut_paiement = '')";
      //logger.info("REQUETE SQL - MAJ ONGLET adherent_en_attente : " + sql_recup_adh_att , { numsession: req.session.id, label: filename});

      const [results_recup_adh_att, fields_recup_adh_att] = await db_connection_promise.execute(sql_recup_adh_att); // Execution SQL
      logger.info("REQUETE SQL - SELECT ONGLET adherent_en_attente - Nombre de lignes = " + results_recup_adh_att.length, { numsession: req.session.id, label: filename});
      nb_onglet_adh_att = results_recup_adh_att.length; // Pour afficher le résultat du nombre d'adhérents copiés dans la page web

      if (results_recup_adh_att.length > 0) {
        
        // TABLEAU POUR METTRE LES INFORMATIONS
        const rowsToAdd_adh_att = [];
        for (let i = 0; i < results_recup_adh_att.length; i++ ) { // Pour chaque ligne trouvée dans la table, on le met dans le tableau rowsToAdd
          //logger.info("Préparation des données pour injection dans la Google Sheet pour le membre : " + results_recup_adh_att[i].identifiant, { numsession: req.session.id, label: filename});
          rowsToAdd_adh_att.push({
            'saison': results_recup_adh_att[i].saison,
            'association': results_recup_adh_att[i].association_suzuki,
            'identifiant': results_recup_adh_att[i].identifiant,
            'adhesion_date': results_recup_adh_att[i].date_maj,
            'adherent_type': results_recup_adh_att[i].adherent_type,
            'adherent_nom': results_recup_adh_att[i].adherent_nom,
            'adherent_prenom': results_recup_adh_att[i].adherent_prenom,
            'adherent_telephone_mobile': "'" + results_recup_adh_att[i].adherent_telephone_mobile,
            'adherent_mail': results_recup_adh_att[i].adherent_mail,
            'montant_adhesion': results_recup_adh_att[i].montant_adhesion,
            'montant_don': results_recup_adh_att[i].montant_don,
            'montant_total': results_recup_adh_att[i].montant_total,
            'paiement_mode': results_recup_adh_att[i].paiement_mode,
            'date_paiement': results_recup_adh_att[i].date_paiement,
            'stripe_retour': results_recup_adh_att[i].stripe_retour,
            'cheque_banque': results_recup_adh_att[i].cheque_banque,
            'cheque_numero': results_recup_adh_att[i].cheque_numero,
            'statut_paiement': results_recup_adh_att[i].statut_paiement,
            'date_maj_gsheet': now
          });
        }

        // AJOUT DES INFOS DANS GOOGLE SHEET
        if (rowsToAdd_adh_att.length > 0) {
          
          try {
            const ajout_gs_adh_att = await GS_adhesion_adherent_en_attente.addRows(rowsToAdd_adh_att);
            logger.info("Insertion dans Google Sheets adhérent en attente réussie", { numsession: req.session.id, label: filename });

            // EXECUTE SQL UPDATE "gsheet"
            // UNE FOIS LA GOOGLE SHEET MISE A JOUR AVEC LES NOUVEAUX ADHERENTS, ON MODIFIE LE CHAMP "gsheet" de la table dans la BD pour marquer que cette ligne a été importée
            // Construire la partie SQL pour Faire un UPDATE de plusieurs lignes à la fois
            try {
              sql_update_adh_att = 'UPDATE adherent_finance SET gs_adherent_att = CASE ';
              const identifiants_adh_att = [];
              for (let i = 0; i < results_recup_adh_att.length; i++) {
                // Ajouter une clause `WHEN` pour chaque identifiant
                sql_update_adh_att += `WHEN identifiant = '${results_recup_adh_att[i].identifiant}' THEN '${now}' `;
                
                // Collecter les identifiants pour la clause WHERE
                identifiants_adh_att.push(`'${results_recup_adh_att[i].identifiant}'`);
              }
              // Ajouter la clause WHERE pour limiter les mises à jour aux identifiants concernés
              sql_update_adh_att += `END WHERE identifiant IN (${identifiants_adh_att.join(',')})`;

              //logger.info("REQUETE SQL - sql_update_adh_att - MAJ gsheet dans adherent_en_attente : " + sql_update_adh_att , { numsession: req.session.id, label: filename});
              const [results_update_adh_att, fields_update_adh_att] = await db_connection_promise.execute(sql_update_adh_att);
              logger.info("UPDATE adherent_finance SET gs_adherent_att effectué pour plusieurs lignes : " + results_update_adh_att.changedRows, { numsession: req.session.id, label: filename });

            } catch (error) {
                logger.error("Échec de la mise à jour BD adherent_finance : " + error.message, { numsession: req.session.id, label: filename });
                await db_connection_promise.end();
                return;
            };

          } catch (error) {
              logger.error("Erreur lors de l'ajout des lignes à Google Sheets adherent_en_attente : " + error.message, { numsession: req.session.id, label: filename });
              await db_connection_promise.end();
              return;
          };


        }
      }

      ////////////////////////////////////////
      // MAJ ONGLET finance

      // EXECUTE SQL RÉCUPÉRATION INFORMATIONS
      sql_recup_finance = "SELECT adherent_finance.date_maj, adherent_finance.saison, adherent_finance.identifiant, adherent_finance.association_suzuki, adherent_finance.adherent_type, adherent_finance.adherent_nom, adherent_finance.adherent_prenom, adherent_finance.adherent_telephone_mobile, adherent_finance.adherent_mail, adherent_finance.montant_adhesion, adherent_finance.montant_don, adherent_finance.montant_total, adherent_finance.paiement_mode, adherent_finance.date_paiement, adherent_finance.stripe_retour, adherent_finance.cheque_banque, adherent_finance.cheque_numero, adherent_finance.statut_paiement FROM adherent_finance WHERE (adherent_finance.gsheet = '' OR adherent_finance.gsheet IS NULL) AND adherent_finance.statut_paiement = 'paye'";
      //logger.info("REQUETE SQL - MAJ ONGLET finances : " + sql_recup_finance , { numsession: req.session.id, label: filename});

      const [results_recup_finance, fields_recup_finance] = await db_connection_promise.execute(sql_recup_finance); // Execution SQL
      logger.info("REQUETE SQL - SELECT ONGLET finance - Nombre de lignes = " + results_recup_finance.length, { numsession: req.session.id, label: filename});
      nb_onglet_finance = results_recup_finance.length; // Pour afficher le résultat du nombre d'adhérents copiés dans la page web

      if (results_recup_finance.length > 0) {
        
        // TABLEAU POUR METTRE LES INFORMATIONS
        const rowsToAdd_finance = [];
        for (let i = 0; i < results_recup_finance.length; i++ ) { // Pour chaque ligne trouvée dans la table, on le met dans le tableau rowsToAdd
          //logger.info("Préparation des données pour injection dans la Google Sheet pour le membre : " + results_recup_finance[i].identifiant, { numsession: req.session.id, label: filename});
          rowsToAdd_finance.push({
            'saison': results_recup_finance[i].saison,
            'association': results_recup_finance[i].association_suzuki,
            'identifiant': results_recup_finance[i].identifiant,
            'adhesion_date': results_recup_finance[i].date_maj,
            'adherent_type': results_recup_finance[i].adherent_type,
            'adherent_nom': results_recup_finance[i].adherent_nom,
            'adherent_prenom': results_recup_finance[i].adherent_prenom,
            'adherent_telephone_mobile': "'" + results_recup_finance[i].adherent_telephone_mobile,
            'adherent_mail': results_recup_finance[i].adherent_mail,
            'montant_adhesion': results_recup_finance[i].montant_adhesion,
            'montant_don': results_recup_finance[i].montant_don,
            'montant_total': results_recup_finance[i].montant_total,
            'paiement_mode': results_recup_finance[i].paiement_mode,
            'date_paiement': results_recup_finance[i].date_paiement,
            'stripe_retour': results_recup_finance[i].stripe_retour,
            'cheque_banque': results_recup_finance[i].cheque_banque,
            'cheque_numero': results_recup_finance[i].cheque_numero,
            'statut_paiement': results_recup_finance[i].statut_paiement,
            'date_maj_gsheet': now
          });
        }

        // AJOUT DES INFOS DANS GOOGLE SHEET
        if (rowsToAdd_finance.length > 0) {
          
          try {
            const ajout_gs_finance = await GS_adhesion_finance.addRows(rowsToAdd_finance);
            logger.info("Insertion dans Google Sheets finance réussie", { numsession: req.session.id, label: filename });

            // EXECUTE SQL UPDATE "gsheet"
            // UNE FOIS LA GOOGLE SHEET MISE A JOUR AVEC LES NOUVEAUX ADHERENTS, ON MODIFIE LE CHAMP "gsheet" de la table dans la BD pour marquer que cette ligne a été importée
            // Construire la partie SQL pour Faire un UPDATE de plusieurs lignes à la fois
            try {
              sql_update_finance = 'UPDATE adherent_finance SET gsheet = CASE ';
              const identifiants_finance = [];
              for (let i = 0; i < results_recup_finance.length; i++) {
                // Ajouter une clause `WHEN` pour chaque identifiant
                sql_update_finance += `WHEN identifiant = '${results_recup_finance[i].identifiant}' THEN '${now}' `;
                
                // Collecter les identifiants pour la clause WHERE
                identifiants_finance.push(`'${results_recup_finance[i].identifiant}'`);
              }
              // Ajouter la clause WHERE pour limiter les mises à jour aux identifiants concernés
              sql_update_finance += `END WHERE identifiant IN (${identifiants_finance.join(',')})`;

              //logger.info("REQUETE SQL - sql_update_finance - MAJ gsheet dans finance : " + sql_update_finance , { numsession: req.session.id, label: filename});
              const [results_update_finance, fields_update_finance] = await db_connection_promise.execute(sql_update_finance);
              logger.info("UPDATE finance SET gsheet effectué pour plusieurs lignes : " + results_update_finance.changedRows, { numsession: req.session.id, label: filename });

            } catch (error) {
                logger.error("Échec de la mise à jour BD finance : " + error.message, { numsession: req.session.id, label: filename });
                await db_connection_promise.end();
                return;
            };

          } catch (error) {
              logger.error("Erreur lors de l'ajout des lignes à Google Sheets finance : " + error.message, { numsession: req.session.id, label: filename });
              await db_connection_promise.end();
              return;
          };


        }
      }



    } else {
      logger.info("PAS D'ADHÉRENTS À METTRE À JOUR", { numsession: req.session.id, label: filename});
    }

    ///////////////////////////////////////////////////////////////////////
    // ENVOIE MAIL APRES EXECUTION
    logger.info("MAIL ENVOI AVANT", { numsession: req.session.id });
    var transporter = nodemailer.createTransport({
        service: 'gmail',
        auth: {
          user: process.env.nodemailer_user,
          pass: process.env.nodemailer_pass
        }
    });
    var mail_objet = "ADUZUKI - CRON WEBHOOK MAJ GS ADHESION";
    mail_html = "<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 la Google Sheet des adhésions qui se fait la nuit à 3h.</p>";
    mail_html += "<p>- nombre d'<strong>adhérents</strong> mis à jour : ";
    mail_html += nb_onglet_adherent;
    mail_html += "</p>";
    mail_html += "<p>- nombre de <strong>professeurs</strong> mis à jour : ";
    mail_html += nb_onglet_prof;
    mail_html += "</p>";
    mail_html += "<p>- nombre de <strong>professeurs stagiaires</strong> mis à jour : ";
    mail_html += nb_onglet_stagiaires;
    mail_html += "</p>";
    mail_html += "<p>- nombre d'<strong>élèves</strong> mis à jour : ";
    mail_html += nb_onglet_eleves;
    mail_html += "</p>";
    mail_html += "<p>- nombre d'<strong>adhésions en attente</strong> mis à jour : ";
    mail_html += nb_onglet_adh_att;
    mail_html += "</p>";
    mail_html += "<p>- nombre de lignes <strong>finance</strong> mis à jour : ";
    mail_html += nb_onglet_finance;
    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: req.session.id });
        } else {
          logger.info("Email envoyé: " + info.response, { numsession: req.session.id });
        }
    });
    logger.info("MAIL ENVOI APRES", { numsession: req.session.id });


    ///////////////////////////////////////////////////////////////////////
    // FERMETURE DU PROGRAMME
    await db_connection_promise.end();
    logger.info("ON EST DANS LA FERMETURE", { numsession: req.session.id, label: filename});
    return { nb_onglet_adherent, nb_onglet_prof, nb_onglet_stagiaires, nb_onglet_eleves,nb_onglet_adh_att, nb_onglet_finance };



  } catch (error) {
    // Echec de connection à la BD
    logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id });
    await db_connection_promise.end(); //Fermeture connexion DB
    return;
  };

}


/////////////////////////////////////////////////
// GOOGLE SHEET
// DÉCHARGEMENT DES DONNÉES DANS GOOGLE SHEET
// IL NE FAUT PAS DE LIGNE VIDES DANS LE GOOGLE SHEET
//// mysql2 | moment | google-spreadsheet
////
////
/////////////////////////////////////////////////
const maj_googlesheet = async function(req, res) {
  logger.info("======================================", { label: filename });
  logger.info("======== FUNCTION maj_googlesheet  (adhesion maj_googlesheet) ==========", { label: filename });
  logger.info("======================================", { label: filename });

  /////////////////////////////////////////////////
  // CONNEXION GSHEET
  await GS_adhesion.useServiceAccountAuth(GS_creds);
  await GS_adhesion.loadInfo();

  /////////////////////////////////////////////////
  // VARIABLES
  const GS_adhesion_adherent = GS_adhesion.sheetsByTitle['adherent'];
  const GS_adhesion_professeurs = GS_adhesion.sheetsByTitle['professeurs'];
  const GS_adhesion_professeurs_stagiaires = GS_adhesion.sheetsByTitle['professeurs_stagiaires'];
  const GS_adhesion_eleves = GS_adhesion.sheetsByTitle['eleves'];
  const GS_adhesion_finance = GS_adhesion.sheetsByTitle['finance'];
  const GS_adhesion_adherent_en_attente = GS_adhesion.sheetsByTitle['adherent_en_attente'];
  let sql, sql2, sql3, sql4, sql5, sql6, sql7, sql8, sql9, sql10, sql11, sql12;

  /////////////////////////////////////////////////
  // DATE
  let now = moment().format("YYYY-MM-DD HH:mm:ss");

  /////////////////////////////////////////////////
  // RÉCUPÉRATION DES DONNÉES DES TABLES DE LA BD

  // CONNECTION DB
  try {
    const db_connection_promise = await mysql_promise.createConnection({
      host: process.env.db_connection_host,
      port: process.env.db_connection_port,
      user: process.env.db_connection_user,
      password: process.env.db_connection_password,
      database: process.env.db_connection_database
    });
    logger.info("======================================", { label: filename });
    logger.info("Connected TO DATABASE test with mysql2 PREMISE !", { label: filename });
    logger.info("======================================", { label: filename });

    // MAJ ONGLET adherent
    sql = "SELECT adherent.date_maj, adherent.saison, adherent.identifiant, adherent.association_suzuki, adherent.adherent_type, adherent.adherent_nom, adherent.adherent_prenom, adherent.adherent_telephone_mobile, adherent.adherent_mail, adherent.adherent_adresse_rue, adherent.adherent_adresse_complement, adherent.adherent_adresse_codepostal, adherent.adherent_adresse_ville, adherent.adherent_adresse_pays, adherent.adherent_telephone_fixe, adherent.carte_envoi, adherent_finance.statut_paiement FROM adherent INNER JOIN adherent_finance ON adherent_finance.identifiant = adherent.identifiant WHERE (adherent.gsheet = '' OR adherent.gsheet IS NULL) AND adherent_finance.statut_paiement = 'paye'";
    logger.info("REQUETE SQL - MAJ ONGLET adherent : " + sql , { numsession: req.session.id, label: filename});

    const [results, fields] = await db_connection_promise.execute(sql); // Execution SQL
    logger.info("REQUETE SQL - MAJ ONGLET adherent - Nombre de lignes = " + results.length, { numsession: req.session.id, label: filename});
    req.session.nb_adherent_maj = results.length; // Pour afficher le résultat du nombre d'adhérents copiés dans la page web

    if (results.length) {
      for (let i = 0; i < results.length; i++ ) { // Pour chaque ligne trouvée dans la table, on l'écrit dans les onglets correspondants
        logger.info("avant const ajout_gs_adherents = await GS_adhesion_adherent.addRows" + results[i].identifiant, { numsession: req.session.id, label: filename});
        const ajout_gs_adherents = await GS_adhesion_adherent.addRows(
          [
            {
              'saison': results[i].saison,
              'association': results[i].association_suzuki,
              'identifiant': results[i].identifiant,
              'adhesion_date': results[i].date_maj,
              'adhesion_statut': results[i].statut_paiement,
              'adherent_type': results[i].adherent_type,
              'adherent_nom': results[i].adherent_nom,
              'adherent_prenom': results[i].adherent_prenom,
              'adherent_telephone_mobile': "'" + results[i].adherent_telephone_mobile,
              'adherent_mail': results[i].adherent_mail,
              'adherent_adresse_rue': results[i].adherent_adresse_rue,
              'adherent_adresse_complement': results[i].adherent_adresse_complement,
              'adherent_adresse_codepostal': results[i].adherent_adresse_codepostal,
              'adherent_adresse_ville': results[i].adherent_adresse_ville,
              'adherent_adresse_pays': results[i].adherent_adresse_pays,
              'adherent_telephone_fixe': results[i].adherent_telephone_fixe,
              'carte_envoi': results[i].carte_envoi,
              'date_maj_gsheet': now
            }
          ]
        );
        // POUR EVITER DE DÉPASSER LE QUOTA DE GOOGLE API REQUEST PER MINUTE
        await sleep.wait(5000);
        logger.info("await delay(15000)", { numsession: req.session.id, label: filename});

        // TAGUER DB COMME DÉCHARGÉE DANS GOOGLE SHEET
        sql2 = 'UPDATE adherent SET gsheet = "' + now + '" WHERE identifiant = "' + results[i].identifiant + '"';
        const [results2, fields2] = await db_connection_promise.execute(sql2);
        logger.info("UPDATE adherent SET gsheet Row ID changed : " + results2.changedRows, { numsession: req.session.id, label: filename});
      }
    }

    // MAJ ONGLET professeurs
    sql3 = "SELECT adherent_professeur.date_maj, adherent_professeur.saison, adherent_professeur.identifiant, adherent_professeur.association_suzuki, adherent_professeur.adherent_nom, adherent_professeur.adherent_prenom, adherent_professeur.adherent_mail, adherent_professeur.adherent_telephone_mobile, adherent_professeur.adherent_prof_instrument1, adherent_professeur.adherent_prof_instrument1_esa, adherent_professeur.adherent_prof_instrument2, adherent_professeur.adherent_prof_instrument2_esa, adherent_professeur.adherent_prof_sece, adherent_professeur.adherent_prof_ecole1, adherent_professeur.adherent_prof_ecole1_mail, adherent_professeur.adherent_prof_ecole1_web, adherent_professeur.adherent_prof_ecole1_adresse, adherent_professeur.adherent_prof_ecole1_cp, adherent_professeur.adherent_prof_ecole1_ville, adherent_professeur.adherent_prof_ecole2, adherent_professeur.adherent_prof_ecole2_mail, adherent_professeur.adherent_prof_ecole2_web, adherent_professeur.adherent_prof_ecole2_adresse, adherent_professeur.adherent_prof_ecole2_cp, adherent_professeur.adherent_prof_ecole2_ville, adherent_professeur.adherent_prof_ecole3, adherent_professeur.adherent_prof_ecole3_mail, adherent_professeur.adherent_prof_ecole3_web, adherent_professeur.adherent_prof_ecole3_adresse, adherent_professeur.adherent_prof_ecole3_cp, adherent_professeur.adherent_prof_ecole3_ville, adherent_finance.statut_paiement FROM adherent_professeur INNER JOIN adherent_finance ON adherent_finance.identifiant = adherent_professeur.identifiant WHERE (adherent_professeur.gsheet = '' OR adherent_professeur.gsheet IS NULL) AND adherent_finance.statut_paiement = 'paye'";
    logger.info("REQUETE SQL - ONGLET professeurs : " + sql3, { numsession: req.session.id, label: filename});

    const [results3, fields3] = await db_connection_promise.execute(sql3);
    logger.info("REQUETE SQL - ONGLET professeurs - Nombre de lignes = " + results3.length, { numsession: req.session.id, label: filename});
    req.session.nb_prof_maj = results3.length; // Pour afficher le résultat du nombre de prof copiés dans la page web

    if (results3.length) {
      for (let i = 0; i < results3.length; i++ ) { // Pour chaque ligne trouvée dans la table, on l'écrit dans les onglets correspondants
        const ajout_gs_prof = await GS_adhesion_professeurs.addRows(
          [
            {
              'saison': results3[i].saison,
              'association': results3[i].association_suzuki,
              'identifiant': results3[i].identifiant,
              'adhesion_date': results3[i].date_maj,
              'adherent_nom': results3[i].adherent_nom,
              'adherent_prenom': results3[i].adherent_prenom,
              'adherent_mail': results3[i].adherent_mail,
              'adherent_telephone_mobile': "'" + results3[i].adherent_telephone_mobile,
              'adherent_prof_instrument1': results3[i].adherent_prof_instrument1,
              'adherent_prof_instrument1_esa': results3[i].adherent_prof_instrument1_esa,
              'adherent_prof_instrument2': results3[i].adherent_prof_instrument2,
              'adherent_prof_instrument2_esa': results3[i].adherent_prof_instrument2_esa,
              'adherent_prof_sece': results3[i].adherent_prof_sece,
              'adherent_prof_ecole1': results3[i].adherent_prof_ecole1,
              'adherent_prof_ecole1_adresse': results3[i].adherent_prof_ecole1_adresse,
              'adherent_prof_ecole1_cp': results3[i].adherent_prof_ecole1_cp,
              'adherent_prof_ecole1_ville': results3[i].adherent_prof_ecole1_ville,
              'adherent_prof_ecole1_mail': results3[i].adherent_prof_ecole1_mail,
              'adherent_prof_ecole1_web': results3[i].adherent_prof_ecole1_web,
              'adherent_prof_ecole2': results3[i].adherent_prof_ecole2,
              'adherent_prof_ecole2_adresse': results3[i].adherent_prof_ecole2_adresse,
              'adherent_prof_ecole2_cp': results3[i].adherent_prof_ecole2_cp,
              'adherent_prof_ecole2_ville': results3[i].adherent_prof_ecole2_ville,
              'adherent_prof_ecole2_mail': results3[i].adherent_prof_ecole2_mail,
              'adherent_prof_ecole2_web': results3[i].adherent_prof_ecole2_web,
              'adherent_prof_ecole3': results3[i].adherent_prof_ecole3,
              'adherent_prof_ecole3_adresse': results3[i].adherent_prof_ecole3_adresse,
              'adherent_prof_ecole3_cp': results3[i].adherent_prof_ecole3_cp,
              'adherent_prof_ecole3_ville': results3[i].adherent_prof_ecole3_ville,
              'adherent_prof_ecole3_mail': results3[i].adherent_prof_ecole3_mail,
              'adherent_prof_ecole3_web': results3[i].adherent_prof_ecole3_web,
              'date_maj_gsheet': now
            }
          ]
        );
        // POUR EVITER DE DÉPASSER LE QUOTA DE GOOGLE API REQUEST PER MINUTE
        await sleep.wait(5000);
        console.log("await delay(15000)");

        // TAGUER DB COMME DÉCHARGÉE DANS GOOGLE SHEET
        sql4 = 'UPDATE adherent_professeur SET gsheet = "' + now + '" WHERE identifiant = "' + results3[i].identifiant + '"';
        const [results4, fields4] = await db_connection_promise.execute(sql4);
        logger.info("UPDATE adherent SET gsheet Row ID changed : " + results4.changedRows, { numsession: req.session.id, label: filename});
      }
    }

    // MAJ ONGLET professeurs_stagiaires
    sql5 = "SELECT adherent_formation_prof.date_maj, adherent_formation_prof.saison, adherent_formation_prof.identifiant, adherent_formation_prof.association_suzuki, adherent_formation_prof.adherent_nom, adherent_formation_prof.adherent_prenom, adherent_formation_prof.adherent_mail, adherent_formation_prof.adherent_telephone_mobile, adherent_formation_prof.adherent_prof_stagiaire_instrument1, adherent_formation_prof.adherent_prof_stagiaire_instrument1_esa, adherent_formation_prof.adherent_prof_stagiaire_instrument1_prof, adherent_formation_prof.adherent_prof_stagiaire_instrument2, adherent_formation_prof.adherent_prof_stagiaire_instrument2_esa, adherent_formation_prof.adherent_prof_stagiaire_instrument2_prof, adherent_finance.statut_paiement FROM adherent_formation_prof INNER JOIN adherent_finance ON adherent_finance.identifiant = adherent_formation_prof.identifiant WHERE (adherent_formation_prof.gsheet = '' OR adherent_formation_prof.gsheet IS NULL) AND adherent_finance.statut_paiement = 'paye'";
    logger.info("REQUETE SQL - MAJ ONGLET professeurs_stagiaires : " + sql5, { numsession: req.session.id, label: filename});

    const [results5, fields5] = await db_connection_promise.execute(sql5);
    logger.info("REQUETE SQL - MAJ ONGLET professeurs_stagiaires - Nombre de lignes = " + results5.length, { numsession: req.session.id, label: filename});
    req.session.nb_prof_form_maj = results5.length; // Pour afficher le résultat du nombre de prof en formation copiés dans la page web

    if (results5.length) {
      for (let i = 0; i < results5.length; i++ ) { // Pour chaque ligne trouvée dans la table, on l'écrit dans les onglets correspondants
        logger.info("i = " + i, { numsession: req.session.id, label: filename});
        logger.info("results5[i].identifiant = " + results5[i].identifiant, { numsession: req.session.id, label: filename});

        const ajout_gs_prof_formation = await GS_adhesion_professeurs_stagiaires.addRows(
          [
            {
              'saison': results5[i].saison,
              'association': results5[i].association_suzuki,
              'identifiant': results5[i].identifiant,
              'adhesion_date': results5[i].date_maj,
              'adherent_nom': results5[i].adherent_nom,
              'adherent_prenom': results5[i].adherent_prenom,
              'adherent_mail': results5[i].adherent_mail,
              'adherent_telephone_mobile': "'" + results5[i].adherent_telephone_mobile,
              'adherent_prof_stagiaire_instrument1': results5[i].adherent_prof_stagiaire_instrument1,
              'adherent_prof_stagiaire_instrument1_esa': results5[i].adherent_prof_stagiaire_instrument1_esa,
              'adherent_prof_stagiaire_instrument1_prof': results5[i].adherent_prof_stagiaire_instrument1_prof,
              'adherent_prof_stagiaire_instrument2': results5[i].adherent_prof_stagiaire_instrument2,
              'adherent_prof_stagiaire_instrument2_esa': results5[i].adherent_prof_stagiaire_instrument2_esa,
              'adherent_prof_stagiaire_instrument2_prof': results5[i].adherent_prof_stagiaire_instrument2_prof,
              'date_maj_gsheet': now
            }
          ]
        );
        // POUR EVITER DE DÉPASSER LE QUOTA DE GOOGLE API REQUEST PER MINUTE
        await sleep.wait(5000);
        console.log("await delay(15000)");

        // TAGUER DB COMME DÉCHARGÉE DANS GOOGLE SHEET
        sql6 = 'UPDATE adherent_formation_prof SET gsheet = "' + now + '" WHERE identifiant = "' + results5[i].identifiant + '"';
        const [results6, fields6] = await db_connection_promise.execute(sql6);
        logger.info("UPDATE adherent_formation_prof SET gsheet Row ID changed : " + results6.changedRows, { numsession: req.session.id, label: filename});
      }
    }

    // MAJ ONGLET élèves
    sql7 = "SELECT adherent_eleve.date_maj, adherent_eleve.saison, adherent_eleve.identifiant, adherent_eleve.association_suzuki, adherent_eleve.eleve_nom, adherent_eleve.eleve_prenom, adherent_eleve.adherent_mail, adherent_eleve.adherent_telephone_mobile, adherent_eleve.eleve_datenaissance, adherent_eleve.eleve_instrumentA, adherent_eleve.eleve_instrumentA_cahier, adherent_eleve.eleve_instrumentA_prof, adherent_eleve.eleve_instrumentB, adherent_eleve.eleve_instrumentB_cahier, adherent_eleve.eleve_instrumentB_prof, adherent_eleve.eleve_droitimage, adherent_eleve.eleve_contactsup_nom, adherent_eleve.eleve_contactsup_prenom, adherent_eleve.eleve_contactsup_mail, adherent_finance.statut_paiement FROM adherent_eleve INNER JOIN adherent_finance ON adherent_finance.identifiant = adherent_eleve.identifiant WHERE (adherent_eleve.gsheet = '' OR adherent_eleve.gsheet IS NULL) AND adherent_finance.statut_paiement = 'paye'";
    logger.info("REQUETE SQL - MAJ ONGLET élèves : " + sql7, { numsession: req.session.id, label: filename});

    const [results7, fields7] = await db_connection_promise.execute(sql7);
    logger.info("REQUETE SQL - MAJ ONGLET élèves - Nombre de lignes = " + results7.length, { numsession: req.session.id, label: filename});
    req.session.nb_eleve_maj = results7.length; // Pour afficher le résultat du nombre d'élèves copiés dans la page web

    if (results7.length) {
      for (let i = 0; i < results7.length; i++ ) { // Pour chaque ligne trouvée dans la table, on l'écrit dans l'onglet GoogleS correspondant
        const ajout_gs_eleves = await GS_adhesion_eleves.addRows(
          [
            {
              'saison': results7[i].saison,
              'association': results7[i].association_suzuki,
              'identifiant': results7[i].identifiant,
              'adhesion_date': results7[i].date_maj,
              'eleve_nom': results7[i].eleve_nom,
              'eleve_prenom': results7[i].eleve_prenom,
              'eleve_datenaissance': results7[i].eleve_datenaissance,
              'adherent_mail': results7[i].adherent_mail,
              'adherent_telephone_mobile': "'" + results7[i].adherent_telephone_mobile,
              'eleve_instrumentA': results7[i].eleve_instrumentA,
              'eleve_instrumentA_cahier': results7[i].eleve_instrumentA_cahier,
              'eleve_instrumentA_prof': results7[i].eleve_instrumentA_prof,
              'eleve_instrumentB': results7[i].eleve_instrumentB,
              'eleve_instrumentB_cahier': results7[i].eleve_instrumentB_cahier,
              'eleve_instrumentB_prof': results7[i].eleve_instrumentB_prof,
              'eleve_droitimage': results7[i].eleve_droitimage,
              'eleve_contactsup_nom': results7[i].eleve_contactsup_nom,
              'eleve_contactsup_prenom': results7[i].eleve_contactsup_prenom,
              'eleve_contactsup_mail': results7[i].eleve_contactsup_mail,
              'date_maj_gsheet': now
            }
          ]
        );
        // POUR EVITER DE DÉPASSER LE QUOTA DE GOOGLE API REQUEST PER MINUTE
        await sleep.wait(5000);
        console.log("await delay(15000)");

        // TAGUER DB COMME DÉCHARGÉE DANS GOOGLE SHEET
        sql8 = 'UPDATE adherent_eleve SET gsheet = "' + now + '" where identifiant = "' + results7[i].identifiant + '"';
        const [results8, fields8] = await db_connection_promise.execute(sql8);
        logger.info("UPDATE adherent_eleve SET gsheet Row ID changed : " + results8.changedRows, { numsession: req.session.id, label: filename});
      }
    }

    // MAJ ONGLET finances
    sql9 = "SELECT adherent_finance.date_maj, adherent_finance.saison, adherent_finance.identifiant, adherent_finance.association_suzuki, adherent_finance.adherent_type, adherent_finance.adherent_nom, adherent_finance.adherent_prenom, adherent_finance.adherent_telephone_mobile, adherent_finance.adherent_mail, adherent_finance.montant_adhesion, adherent_finance.montant_don, adherent_finance.montant_total, adherent_finance.paiement_mode, adherent_finance.date_paiement, adherent_finance.stripe_retour, adherent_finance.cheque_banque, adherent_finance.cheque_numero, adherent_finance.statut_paiement FROM adherent_finance WHERE (adherent_finance.gsheet = '' OR adherent_finance.gsheet IS NULL) AND adherent_finance.statut_paiement = 'paye'";
    logger.info("REQUETE SQL - MAJ ONGLET finances : " + sql9, { numsession: req.session.id, label: filename});

    const [results9, fields9] = await db_connection_promise.execute(sql9);
    logger.info("REQUETE SQL - MAJ ONGLET finances - Nombre de lignes = " + results9.length, { numsession: req.session.id, label: filename});
    req.session.nb_finance_maj = results9.length; // Pour afficher le résultat du nombre d'élèves copiés dans la page web

    if (results9.length) {
      for (let i = 0; i < results9.length; i++ ) { // Pour chaque ligne trouvée dans la table, on l'écrit dans l'onglet GoogleS correspondant
        const ajout_gs_finance = await GS_adhesion_finance.addRows(
          [
            {
              'saison': results9[i].saison,
              'association': results9[i].association_suzuki,
              'identifiant': results9[i].identifiant,
              'adhesion_date': results9[i].date_maj,
              'adherent_type': results9[i].adherent_type,
              'adherent_nom': results9[i].adherent_nom,
              'adherent_prenom': results9[i].adherent_prenom,
              'adherent_telephone_mobile': "'" + results9[i].adherent_telephone_mobile,
              'adherent_mail': results9[i].adherent_mail,
              'montant_adhesion': results9[i].montant_adhesion,
              'montant_don': results9[i].montant_don,
              'montant_total': results9[i].montant_total,
              'paiement_mode': results9[i].paiement_mode,
              'date_paiement': results9[i].date_paiement,
              'stripe_retour': results9[i].stripe_retour,
              'cheque_banque': results9[i].cheque_banque,
              'cheque_numero': results9[i].cheque_numero,
              'statut_paiement': results9[i].statut_paiement,
              'date_maj_gsheet': now
            }
          ]
        );
        // POUR EVITER DE DÉPASSER LE QUOTA DE GOOGLE API REQUEST PER MINUTE
        await sleep.wait(5000);
        console.log("await delay(15000)");

        // TAGUER DB COMME DÉCHARGÉE DANS GOOGLE SHEET
        sql10 = 'UPDATE adherent_finance SET gsheet = "' + now + '" WHERE identifiant = "' + results9[i].identifiant + '"';
        const [results10, fields10] = await db_connection_promise.execute(sql10);
        logger.info("UPDATE adherent_finance SET gsheet Row ID changed : " + results10.changedRows, { numsession: req.session.id, label: filename});
      }
    }



    // MAJ ONGLET adherent_en_attente
    sql11 = "SELECT adherent_finance.date_maj, adherent_finance.saison, adherent_finance.identifiant, adherent_finance.association_suzuki, adherent_finance.adherent_type, adherent_finance.adherent_nom, adherent_finance.adherent_prenom, adherent_finance.adherent_telephone_mobile, adherent_finance.adherent_mail, adherent_finance.montant_adhesion, adherent_finance.montant_don, adherent_finance.montant_total, adherent_finance.paiement_mode, adherent_finance.date_paiement, adherent_finance.stripe_retour, adherent_finance.cheque_banque, adherent_finance.cheque_numero, adherent_finance.statut_paiement FROM adherent_finance WHERE (adherent_finance.gs_adherent_att = '' OR adherent_finance.gs_adherent_att IS NULL) AND (adherent_finance.statut_paiement <> 'paye' OR adherent_finance.statut_paiement IS NULL OR adherent_finance.statut_paiement = '')";
    logger.info("REQUETE SQL - MAJ ONGLET adherent_en_attente : " + sql11, { numsession: req.session.id, label: filename});

    const [results11, fields11] = await db_connection_promise.execute(sql11);
    logger.info("REQUETE SQL - MAJ ONGLET adherent_en_attente - Nombre de lignes = " + results11.length, { numsession: req.session.id, label: filename});
    req.session.nb_adherent_en_attente_maj = results11.length; // Pour afficher le résultat du nombre d'élèves copiés dans la page web

    if (results11.length) {
      for (let i = 0; i < results11.length; i++ ) { // Pour chaque ligne trouvée dans la table, on l'écrit dans l'onglet GoogleS correspondant
        const ajout_gs_adherent_en_attente = await GS_adhesion_adherent_en_attente.addRows(
          [
            {
              'saison': results11[i].saison,
              'association': results11[i].association_suzuki,
              'identifiant': results11[i].identifiant,
              'adhesion_date': results11[i].date_maj,
              'adherent_type': results11[i].adherent_type,
              'adherent_nom': results11[i].adherent_nom,
              'adherent_prenom': results11[i].adherent_prenom,
              'adherent_telephone_mobile': "'" + results11[i].adherent_telephone_mobile,
              'adherent_mail': results11[i].adherent_mail,
              'montant_adhesion': results11[i].montant_adhesion,
              'montant_don': results11[i].montant_don,
              'montant_total': results11[i].montant_total,
              'paiement_mode': results11[i].paiement_mode,
              'date_paiement': results11[i].date_paiement,
              'stripe_retour': results11[i].stripe_retour,
              'cheque_banque': results11[i].cheque_banque,
              'cheque_numero': results11[i].cheque_numero,
              'statut_paiement': results11[i].statut_paiement,
              'date_maj_gsheet': now
            }
          ]
        );
        // POUR EVITER DE DÉPASSER LE QUOTA DE GOOGLE API REQUEST PER MINUTE
        await sleep.wait(5000);
        console.log("await delay(15000)");

        // TAGUER DB COMME DÉCHARGÉE DANS GOOGLE SHEET
        sql12 = 'UPDATE adherent_finance SET gs_adherent_att = "' + now + '" WHERE identifiant = "' + results11[i].identifiant + '"';
        const [results12, fields12] = await db_connection_promise.execute(sql12);
        logger.info("UPDATE adherent_finance SET gs_adherent_att Row ID changed : " + results12.changedRows, { numsession: req.session.id, label: filename});
      }
    }




    ///////////////////////////////////////////////////////////////////////
    // REDIRECTION DE FIN VERS LA PAGE DE RÉSULTATS
    await db_connection_promise.end();
    res.redirect('/adhesion/maj_googlesheet');



  } catch (error) {
    // Echec de connection à la BD
    logger.error("Il y a un problème avec la connection à  la base de données! : " + error, { numsession: req.session.id });
    req.session.message = "Il y a un problème système, veuillez recommencer.";
    
    await db_connection_promise.end(); //Fermeture connexion DB
    res.redirect('/adhesion/maj_googlesheet');
  };

}


/////////////////////////////////////////////////
// METTRE À JOUR LE STATUS DE PAIEMENT
// MANUELLEMENT DANS LA BD
// CLIC SUR LE BOUTON "Valider" de la page /maj_googlesheet
/////////////////////////////////////////////////
const maj_statut_paiement_manuel = async function(req, res) {
  logger.info("======================================");
  logger.info("======== FUNCTION maj_statut_paiement_manuel  (adhesion maj_googlesheet) ==========");
  logger.info("======================================");

  /////////////////////////////////////////////////
  // DATE
  let now = moment().format("YYYY-MM-DD HH:mm:ss");
  let now_pdf = moment().format("YYYY-MM-DDTHH-mm-ss");
  let today = moment().format('L')

  // RÉCUPÉRATION DES DONNÉES DU FORMULAIRE DE LA SESSION EN COURS
  req.session.maj_identifiant = req.body.maj_identifiant;
  req.session.maj_mode_paiement = req.body.maj_mode_paiement;
  req.session.maj_statut_paiement = req.body.maj_statut_paiement;
  req.session.maj_montant_adhesion = req.body.maj_montant_adhesion;
  req.session.maj_montant_don = req.body.maj_montant_don;

  // CONNECTION DB
  try {
    const db_connection_promise = await mysql_promise.createConnection({
      host: process.env.db_connection_host,
      port: process.env.db_connection_port,
      user: process.env.db_connection_user,
      password: process.env.db_connection_password,
      database: process.env.db_connection_database
    });

    if (req.session.maj_identifiant) { // On vérifie que l'identifiant a bien été saisie et conservé dans la session en cours
      ///////////////////////////////////////////////////////////////////////
      // MISE À JOUR DU STATUT DU PAIEMENT
      let sql = 'UPDATE adherent_finance SET date_maj = "' + now + '",statut_paiement = "' + req.session.maj_statut_paiement + '", paiement_mode = "' + req.session.maj_mode_paiement + '", montant_adhesion = "' + req.session.maj_montant_adhesion + '", montant_don = "' + req.session.maj_montant_don + '", gs_adherent_att = "" WHERE identifiant = "' + req.session.maj_identifiant + '"';
      logger.info("REQUETE SQL - MISE À JOUR DU STATUT DU PAIEMENT : " + sql , { numsession: req.session.id, label: filename});
      const [results, fields] = await db_connection_promise.execute(sql); // Execution SQL
      logger.info("UPDATE - MISE À JOUR DU STATUT DU PAIEMENT -  Row ID changed : " + results.changedRows, { numsession: req.session.id, label: filename});

      // UPDATE À ÉTÉ FAIT (IDENTIFIANT BIEN TROUVÉ DANS BD)
      if (results.changedRows > 0) {

        // SI STATUT = PAYE => ON ENVOIE LA CARTE DÉFINITIVE
        if (req.session.maj_mode_paiement = "paye") {
          logger.info("Le statut est bien paye on peut envoyer la carte définitive : " + req.session.maj_mode_paiement , { numsession: req.session.id, label: filename});
        
          ///////////////////////////////////////////////////////////////////////
          // RÉCUPÉRATION DES INFOS NÉCESSAIRES À L'ENVOIE DE LA CARTE ADHÉRENT (+ ÉVENTUEL DON)
          let sql2 = 'SELECT adherent.adherent_type, adherent.adherent_adresse_rue, adherent.adherent_adresse_codepostal, adherent.adherent_adresse_ville, adherent.adherent_nom, adherent.adherent_prenom, adherent.adherent_mail FROM adherent WHERE adherent.identifiant = "' + req.session.maj_identifiant + '"';
          logger.info("REQUETE SQL - RÉCUPÉRATION DES INFOS : " + sql2 , { numsession: req.session.id, label: filename});
          const [results2, fields2] = await db_connection_promise.execute(sql2); // Execution SQL
          logger.info("REQUETE SQL - RÉCUPÉRATION DES INFOS - Nombre de ligne : = " + results2.length, { numsession: req.session.id });

          if (results2.length > 0) {
            ///////////////////////////////////////////////////////////////////////
            // ENVOIE DE LA CARTE ADHÉRENT DÉFINITIVE

            //////////////////////////////////////////////////////////////////////////////
            // TABLE adherent - MISE À JOUR DU STATUT D'ENVOI DE LA CARTE

            let sql3 = 'UPDATE adherent SET date_maj = "' + now + '", carte_envoi = "definitive" WHERE identifiant = "' + req.session.maj_identifiant + '"';
            const [results3, fields3] = await db_connection_promise.execute(sql3);
            logger.info("UPDATE adherent SET carte_envoi - Row ID changed : " + results3.changedRows, { numsession: req.session.id, label: filename});

            // CONNECTION ADOBE API
            const credentials =  PDFServicesSdk.Credentials
              .servicePrincipalCredentialsBuilder()
              .withClientId(process.env.PDF_SERVICES_CLIENT_ID)
              .withClientSecret(process.env.PDF_SERVICES_CLIENT_SECRET)
              .build();
            //timeout Default: 10000
            const clientConfig = PDFServicesSdk.ClientConfig
              .clientConfigBuilder()
              .withConnectTimeout(20000)
              .withReadTimeout(40000)
              .build();

            // Create an ExecutionContext using credentials
            const executionContext = PDFServicesSdk.ExecutionContext.create(credentials);

            let adherent_type = results2[0].adherent_type;
            //////////////////////////////////////////////////////////////////////////////
            // DÉFINIR LE PROFIL À AJOUTER DANS LA CARTE ADHÉRENT
            // La fonction est dans le fichier /modules/adherent_type.js
            profils = carte_adherent.profil(adherent_type);
            profil1 = profils[0];
            profil2 = profils[1];
            profil3 = profils[2];
            if (profil2 == undefined) {profil2 = " "};
            if (profil3 == undefined) {profil3 = ""};


            //////////////////////////////////////////////////////////////////////////////
            // ADOBE PDF : CRÉATION DE LA CARTE D'ADHÉSION EN PDF
            // + JUSTIFICATIF DE DON

            let OUTPUT;
            let INPUT

            // S'il y a un don
            if (req.session.maj_montant_don > 0) {
              OUTPUT = path.resolve(__dirname, "../pdf/adhesion/2526/paye/")+"/"+req.session.maj_identifiant+"_adhesion_2526_paye_don_"+now_pdf+".pdf";
              INPUT = path.resolve(__dirname, "../pdf/template/carte_adherent_don.docx");
            } else {
              // S'il n'y a pas de don
              OUTPUT = path.resolve(__dirname, "../pdf/adhesion/2526/paye/")+"/"+req.session.maj_identifiant+"_adhesion_2526_paye_"+now_pdf+".pdf";
              INPUT = path.resolve(__dirname, "../pdf/template/carte_adherent.docx");
            }

            let adresse = results2[0].adherent_adresse_rue;
            adresse += " ";
            adresse += results2[0].adherent_adresse_codepostal;
            adresse += " ";
            adresse += results2[0].adherent_adresse_ville;

            JSON_INPUT = 
            {
              "date": today,
              "identifiant": req.session.maj_identifiant,
              "profil1": profil1,
              "profil2": profil2,
              "profil3": profil3,
              "mode_paiement": "carte bancaire",
              "nom": results2[0].adherent_nom,
              "prenom": results2[0].adherent_prenom,
              "adresse": adresse,
              "montant_don": req.session.maj_montant_don
            };

            const documentMerge = PDFServicesSdk.DocumentMerge,
              documentMergeOptions = documentMerge.options,
              adobe_options = new documentMergeOptions.DocumentMergeOptions(JSON_INPUT, documentMergeOptions.OutputFormat.PDF);
          
            // Create a new operation instance using the options instance.
            const documentMergeOperation = documentMerge.Operation.createNew(adobe_options);
          
            // Set operation input document template from a source file.
            const input = PDFServicesSdk.FileRef.createFromLocalFile(INPUT);
            documentMergeOperation.setInput(input);
          
            // Execute the operation and Save the result to the specified location.
            await documentMergeOperation
            .execute(executionContext)
            .then(result => result.saveAsFile(OUTPUT).then(
            )
            )
            .catch(err => {
                if(err instanceof PDFServicesSdk.Error.ServiceApiError
                    || err instanceof PDFServicesSdk.Error.ServiceUsageError) {
                    console.log('Exception encountered while executing ADOBE PDF', err);
                } else {
                    console.log('Exception encountered while executing ADOBE PDF', err);
                }
            });

            //////////////////////////////////////////////////////////////////////////////
            // ENVOIE CARTE ADHERENT + JUSTIFICATIF DE DON PAR MAIL

            console.log("MAIL ENVOI AVANT");
            var transporter = nodemailer.createTransport({
                service: 'gmail',
                auth: {
                  user: process.env.nodemailer_user,
                  pass: process.env.nodemailer_pass
                }
            });

            var attachment_name = req.session.maj_identifiant;
            attachment_name += "_adhesion_2526_carteadherent.pdf";

            var mail_objet = "ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - ADHÉSION 2025/2026 - ";
            mail_objet += req.session.maj_identifiant;
            mail_html = "<p>Cher adhérent,</p><p>Félicitations ! Vous êtes désormais membre de l’Association Française pour la Pédagogie Suzuki (http://www.afpedagogiesuzuki.fr) et de l’European Suzuki Association (https://europeansuzuki.org) pour l'année 2025/2026. Vous pouvez à ce titre participer à tous les événements Suzuki en France et dans le monde.</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 += req.session.maj_identifiant;
            mail_html += ".</p>";
            if (req.session.maj_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>";

            await transporter.sendMail({
              from: 'afps.inscription@gmail.com',
              to: results2[0].adherent_mail,
              subject: mail_objet,
              html: mail_html,
              attachments: [{
                  filename: attachment_name,
                  path: OUTPUT
                }
              ]
            });

            console.log("MAIL ENVOI APRES");



            ///////////////////////////////////////////////////////////////////////
            // REDIRECTION DE FIN VERS LA PAGE DE RÉSULTATS
            await db_connection_promise.end();
            req.session.message2 = 'Paiement mis à jour pour ' + req.session.maj_identifiant + '. Carte adhérent définitive envoyée avec justificatif de don le cas échéant';
            res.redirect('/adhesion/maj_googlesheet');

          } else {
            logger.info("Infos Adhérent non trouvées dans la base de données.", { numsession: req.session.id });
            req.session.message2 = "Infos Adhérent non trouvées dans la base de données.";
            await db_connection_promise.end(); //Fermeture connexion DB
            res.redirect('/adhesion/maj_googlesheet');
          }
        }


        // SI STATUT = ON MET À JOUR GOOGLE SHEET

        await db_connection_promise.end();

        ///////////////////////////////////////////////////////////////////////
        // REDIRECTION DE FIN VERS LA PAGE DE RÉSULTATS
        
        req.session.message2 = 'Paiement mis à jour pour ' + req.session.maj_identifiant;
        res.redirect('/adhesion/maj_googlesheet');

      } else {
        logger.info("Adhérent non trouvé dans la base de données.", { numsession: req.session.id });
        req.session.message2 = "Adhérent non trouvé dans la base de données.";
        await db_connection_promise.end(); //Fermeture connexion DB
        res.redirect('/adhesion/maj_googlesheet');
      }


    } else {
      logger.info("Problème de session sur le navigateur.", { numsession: req.session.id });
      req.session.message2 = "Problème de session sur le navigateur, veuillez recommencez.";
      await db_connection_promise.end(); //Fermeture connexion DB
      res.redirect('/adhesion/maj_googlesheet');
    }


  } catch (error) {
    // Echec de connection à la BD
    logger.error("Il y a un problème avec la connection à  la base de données! : " + error, { numsession: req.session.id });
    req.session.message2 = "Il y a un problème système, veuillez recommencer.";
    res.redirect('/adhesion/maj_googlesheet');
  };
  

}

/////////////////////////////////////////////////
// SUPPRIMER UN ADHERENT
// METTRE "supprime" à la place de son identifiant
// CLIC SUR LE BOUTON "Valider" de la page /maj_googlesheet
/////////////////////////////////////////////////
const suppr_adherent = async function(req, res) {
  logger.info("======================================");
  logger.info("======== FUNCTION suppr_adherent  (adhesion maj_googlesheet) ==========");
  logger.info("======================================");

  /////////////////////////////////////////////////
  // DATE
  let now = moment().format("YYYY-MM-DD HH:mm:ss");

  // RÉCUPÉRATION DES DONNÉES DU FORMULAIRE DE LA SESSION EN COURS
  req.session.supp_identifiant = req.body.supp_identifiant;
  
  // CONNECTION DB
  try {
    const pool = mysql.createPool({
      host: process.env.db_connection_host,
      port: process.env.db_connection_port,
      user: process.env.db_connection_user,
      password: process.env.db_connection_password,
      database: process.env.db_connection_database,
      rowsAsArray: true
    });
    const promisePool = pool.promise();

    if (req.session.supp_identifiant) { // On vérifie que l'identifiant a bien été saisie et conservé dans la session en cours

      // SUPPRESSION DE L'ADHÉRENT DANS LES TABLES
      let sql = 'UPDATE adherent SET identifiant = "supprime", date_maj = ?, identifiant_supprime = ? WHERE identifiant = ?';
      let sql2 = 'UPDATE adherent_eleve SET identifiant = "supprime", date_maj = ?, identifiant_supprime = ? WHERE identifiant = ?';
      let sql3 = 'UPDATE adherent_finance SET identifiant = "supprime", date_maj = ?, identifiant_supprime = ? WHERE identifiant = ?';
      let sql4 = 'UPDATE adherent_formation_prof SET identifiant = "supprime", date_maj = ?, identifiant_supprime = ? WHERE identifiant = ?';
      let sql5 = 'UPDATE adherent_professeur SET identifiant = "supprime", date_maj = ?, identifiant_supprime = ? WHERE identifiant = ?';
      let sql_values = [now, req.session.supp_identifiant, req.session.supp_identifiant];
      

      logger.info("REQUETE SQL - SUPPRESSION DE L'ADHÉRENT : " + sql , { numsession: req.session.id, label: filename});

      const [results, fields] = await promisePool.query(sql, sql_values); // Execution SQL
      console.log("results = ", results);
      logger.info("UPDATE - SUPPRESSION DE L'ADHÉRENT -  Row ID changed 1 : " + results.changedRows, { numsession: req.session.id, label: filename});
      const [results2, fields2] = await promisePool.query(sql2, sql_values); // Execution SQL
      logger.info("UPDATE - SUPPRESSION DE L'ADHÉRENT -  Row ID changed 2 : " + results2.changedRows, { numsession: req.session.id, label: filename});
      const [results3, fields3] = await promisePool.query(sql3, sql_values); // Execution SQL
      logger.info("UPDATE - SUPPRESSION DE L'ADHÉRENT -  Row ID changed 3 : " + results3.changedRows, { numsession: req.session.id, label: filename});
      const [results4, fields4] = await promisePool.query(sql4, sql_values); // Execution SQL
      logger.info("UPDATE - SUPPRESSION DE L'ADHÉRENT -  Row ID changed 4 : " + results4.changedRows, { numsession: req.session.id, label: filename});
      const [results5, fields5] = await promisePool.query(sql5, sql_values); // Execution SQL
      logger.info("UPDATE - SUPPRESSION DE L'ADHÉRENT -  Row ID changed 5 : " + results5.changedRows, { numsession: req.session.id, label: filename});
      
      
      await promisePool.end();

      // UPDATE À ÉTÉ FAIT (IDENTIFIANT BIEN TROUVÉ DANS BD)
      if (results.changedRows > 0) {
        req.session.message3 = 'Identifiant supprimé :  '+req.session.supp_identifiant;
      } else {
        req.session.message3 = 'Identifiant non trouvé :  '+req.session.supp_identifiant;
      }
      
      res.redirect('/adhesion/maj_googlesheet');
    }





  } catch (error) {
    // Echec de connection à la BD
    logger.error("Il y a un problème avec la connection à  la base de données! : " + error, { numsession: req.session.id });
    req.session.message3 = "Il y a un problème système, veuillez recommencer.";
    await promisePool.end();
    res.redirect('/adhesion/maj_googlesheet');
  };


}



/////////////////////////////////////////////////
// ASSOCIATIONS LOCACLES
// IMPORTS ADHÉRENTS DANS DB
// CLIC SUR LE BOUTON "Valider" de la page /maj_googlesheet
/////////////////////////////////////////////////
const import_ass_loacles = async function(req, res) {

  logger.info("======================================", { label: filename });
  logger.info("======== FUNCTION import_ass_loacles  (adhesion maj_googlesheet) ==========", { label: filename });
  logger.info("======================================", { label: filename });


    /////////////////////////////////////////////////
    // DATE
    let now = moment().format("YYYY-MM-DD HH:mm:ss");
    let now_pdf = moment().format("YYYY-MM-DDTHH-mm-ss");

    /////////////////////////////////////////////////
    // VARIABLE
    let nb_import = 0;
    
    /////////////////////////////////////////////////
    // CONNEXION GSHEET
    try {
      await GS_adhesion.useServiceAccountAuth(GS_creds);
    }  catch (error) {
      // Echec de connection à GS 
      logger.error("Il y a un problème avec la connection à Google Sheet. : " + error, { numsession: req.session.id });
      req.session.message4 = "Il y a un problème système, veuillez recommencer.";
      res.redirect('/adhesion/maj_googlesheet');
    };
    
    await GS_adhesion.loadInfo();
    const GS_asso_locales = GS_adhesion.sheetsByTitle['adhesion_ass_locales'];
    const GS_asso_locales_rows = await GS_asso_locales.getRows();
    console.log("GS_asso_locales.rowCount = ", GS_asso_locales.rowCount);
    console.log("GS_asso_locales_rows[0].identifiant = ", GS_asso_locales_rows[0].identifiant);
    console.log("GS_asso_locales_rows[1].identifiant = ", GS_asso_locales_rows[1].identifiant);

    // NOMBRE DE LIGNE DANS L'ONGLET adhesion_ass_locales
    let compteur = GS_asso_locales.rowCount - 1; // POUR DÉCOMPTER LA LIGNE D'EN-TÊTE
    console.log("compteur = ", compteur);

    ////////////////////////////////////////////////////
    // CONNECTION ADOBE API
    ////////////////////////////////////////////////////
    const credentials =  PDFServicesSdk.Credentials
    .servicePrincipalCredentialsBuilder()
    .withClientId(process.env.PDF_SERVICES_CLIENT_ID)
    .withClientSecret(process.env.PDF_SERVICES_CLIENT_SECRET)
    .build();
    //timeout Default: 10000
    const clientConfig = PDFServicesSdk.ClientConfig
      .clientConfigBuilder()
      .withConnectTimeout(40000)
      .withReadTimeout(80000)
      .build();
    // Create an ExecutionContext using credentials
    const executionContext = PDFServicesSdk.ExecutionContext.create(credentials);

    /////////////////////////////////////////////////
    // CONNECTION DB
    try {
      const pool = mysql.createPool({
        host: process.env.db_connection_host,
        port: process.env.db_connection_port,
        user: process.env.db_connection_user,
        password: process.env.db_connection_password,
        database: process.env.db_connection_database,
        rowsAsArray: true
      });
      const promisePool = pool.promise();

      /////////////////////////////////////////////////
      // ON LIT TOUTES LES LIGNES DU GOOGLE SHEET LES UNES APRÈS LES AUTRES
      for (i=0; i<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 l’Association Française pour la Pédagogie Suzuki (http://www.afpedagogiesuzuki.fr) et de l’European Suzuki Association (https://europeansuzuki.org) pour l'année 2025/2026. Vous pouvez à ce titre participer à tous les événements Suzuki en France et dans le monde.</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 = {
    checkMail,
    post_form_adhesion,
    post_form_montant_total,
    post_paiement_cheque_save,
    post_paiement_virement_save,
    post_req_bank,
    get_res_bank,
    get_res_bank_annul,
    post_cartemanuelle_verifmail_envoicarte,
    post_cartes_manuelles_envoi,
    maj_googlesheet,
    maj_googlesheet_auto,
    maj_statut_paiement_manuel,
    suppr_adherent,
    import_ass_loacles
}
