# Générateur de date pour le catalogue adhara

## Explication

Il s'agit d'un code javascript réutilisable dans google sheet. L'objectif du programme et de prendre les dates de formations de l'année en cours (placé au dessus dans un tableur) et de leur trouvé un équivalent sur l'année suivante en comptant les jours ouvré (ne tombe ni un samedi ni un dimanche)

## Code

```js
function getSameWeekdayNextYear(dateString, month, year) {
  if (!dateString.includes("-")) {
    var startDate = new Date(year, month - 1, parseInt(dateString));
    var currentYear = startDate.getFullYear();
    var nextYear = currentYear + 1;

    var newStartDate = new Date(nextYear, month - 1, startDate.getDate());

    var startDateWeekday = newStartDate.getDay();

    if (startDateWeekday === 0) { // Week-end
      newStartDate.setDate(newStartDate.getDate() + 1);
    }else if(startDateWeekday === 6){
      newStartDate.setDate(newStartDate.getDate() + 2);
    }

    return newStartDate.getDate();
  } else {
    var date = dateString.split("-");
    var dateDiff = date[1] - date[0];
    var startDate = new Date(year, month - 1, parseInt(date[0]));
    var endDate = new Date(year, month - 1, parseInt(date[1]));
    var currentYear = startDate.getFullYear();
    var nextYear = currentYear + 1;

    var newStartDate = new Date(nextYear, month - 1, startDate.getDate());
    var newEndDate = new Date(nextYear, month - 1, endDate.getDate());

    var startDateWeekday = newStartDate.getDay();

    // Ajustement pour les jours non ouvrés et week-end
    if (startDateWeekday === 0) { // Dimanche
      newStartDate.setDate(newStartDate.getDate() + 1);
      newEndDate.setDate(newEndDate.getDate() + 1);
    } else if (startDateWeekday === 6) { // Samedi
      newStartDate.setDate(newStartDate.getDate() + 2);
      newEndDate.setDate(newEndDate.getDate() + 2);
    }

    while (newStartDate.getDay() !== 1 && dateDiff >= 2) {
      newStartDate.setDate(newStartDate.getDate() + 1);
    }

    while (newStartDate.getDay() !== 1 && dateDiff === 1) {
      newStartDate.setDate(newStartDate.getDate() - 1);
    }

    newEndDate.setDate(newStartDate.getDate() + dateDiff); // Ajout du nombre de jours de différence
    return newStartDate.getDate() + "-" + newEndDate.getDate();
  }
}

function GET_CLOSEST_DATE(dateString, month, year) {
  var monthIndex = ['Jan.', 'Fév.', 'Mar.', 'Avr.', 'Mai', 'Juin', 'Juil.', 'Août', 'Sept.', 'Oct.', 'Nov.', 'Déc.'].indexOf(month) + 1;
  var result = getSameWeekdayNextYear(dateString, monthIndex, year);
  console.log(result)
  return result;
}

//GET_CLOSEST_DATE("30-31", "Jan.", "2023")
```
Le code ci-dessus récupère la date, le mois et l'année selectionner pour ressortir au travers de quelques calcul le ou les jours de formations pour la dite formation sur l'année N+1. La maintenance du programme est assez simple, tout est en javascript.

## Implémentation

Pour le moment tester uniquement sur google sheet.
Pour implémenter le programme, il suffit de se rendre dans un google sheets et de suivre ces instructions : 

```sh
Extensions > App Scripts
```
Celui-ci ouvrira une nouvelle page où vous pourrez copié collé le code ci-dessus. Et une fois cela fais, vous n'aurais plus qu'a récupérer `GET_CLOSEST_DATE()` et de lui donner les paramètres que vous souhaitez directement dans votre tableur sheet.

[Ici un exemple pour l'année 2023-2024](https://docs.google.com/spreadsheets/d/1pfyTBEIM-VCoi53caHE5UXoXB1egNeiLoJCrpKEyluA/edit#gid=1622037801)

Bien entendu si le code est amené a changé, ce qui a de forte chance, merci de modifié ici aussi son contenu et continuer le suivi et le maintien de cette page en conséquence.