Script shell pour demandes de congés d'anniversaire

Bonjour,

je viens de retrouver un script que j’avais écrit il y a quelques temps pour déterminer lesquels de mes anniversaires tomberaient pendant des jours ouvrés sur les X prochaines années, afin d’envoyer automatiquement (facultativement) une demande de congés pour ces dates.

C’était plus pour faire rire les collègues, mais je le partage ici, on ne sait jamais (j’ai hésité avec la section Pause Café):

#!/bin/bash

# $0 -d AAAA -f AAAA -m manager@domain.com mm/DD

# utilise getopt, date, mail (paquet mailutils)

RETCODE=0

function printhelp {
        echo -e "\tANNIV-CHECK\tVérifier quels jours de la semaine tomberont ses prochaines dates anniversaires"
        echo -e "Usage:\t$(basename $0) [OPTIONS] <date anniversaire (format jj/mm)>"
        echo "OPTIONS:"
        echo -e "-d année\tAnnée de début de vérification, au format aaaa (par défaut: année courante)"
        echo -e "-f année\tAnnée de fin de la vérification, au format aaaa (par défaut: année de début + 10 ans)"
        echo -e "-m email\tAdresse email de la personne à qui envoyer par mail une demande de congés (nécessite /usr/bin/mail avec configuration d'un serveur SMTP)"
        echo -e "-h\t\tAffiche cette aide et quitte le programme."
        echo -e "\nExemples:\n$(basename $0) -d 2019 28/10\nVérifier les jours anniversaires du 28 Octobre entre 2019 et 2029\n$(basename $0) -m manager@travail.com 14/02\nVérifier les jours anniversaires du 14 février pour les 10 prochaines années, et envoyer un mail de demande de congés pour toutes les dates en semaine à manager@travail.com"
        exit $RETCODE
}


# Vérification des binaires
verif="true"
for binaire in getopt date ; do
        which $binaire > /dev/null
        if [ $? -ne 0 ] ; then verif="false" ; echo "Le binaire $binaire n'a pas été trouvé." ; fi
done
if [ "$verif" = "false" ] ; then echo "Sortie." ; exit 1 ; fi

if [ $# -lt 1 ] ; then RETCODE=1 ; printhelp ; fi

# Valeurs par défaut des paramètres
debut=$(date +%Y)
fin=$(date -d "$debut +10 years" +%Y)
mail=""
text="Bonjour,\n\nje souhaite poser commes congés les dates suivantes:\n"

# Evaluation des paramètres
TEMP=$(getopt -o d:f:m:h -n error -- "$@")
if [ $? -ne 0 ] ; then echo "Erreur getopt" >&2 ; exit 1 ; fi
eval set -- "$TEMP"
unset TEMP
while true ; do
        case $1 in
                -d) debut="$2" ; shift 2 ;;
                -f) fin="$2" ; shift 2 ;;
                -m) mail="$2" ; shift 2 ;;
                -h) RETCODE=0 ; printhelp ; shift ;;
                --) shift ; break ;;
                *) echo -e "Option non reconnue: $1\n" ; RETCODE=1 ; printhelp ;;
        esac
done
anniv="$1"
anniv2=$(echo $anniv | awk -F"/" '{print $2"/"$1}')


# Traitement principal
for ((year=$debut;year<=$fin;year++)) ; do
        echo -en "$year\t" ;
        jour=$(date -d "${anniv2}/${year}" +%A)
        echo "Le $anniv est un $jour"
        case $jour in
                lundi|mardi|mercredi|jeudi|vendredi ) text="$text\n$jour $anniv $year" ;;
                * ) ;;
        esac
done

# Envoi de mail (facultatif)
if [ -n "$mail" ] ; then
        text="$text\n\nMerci !"
        echo -e "\nLe texte suivant sera envoyé par email à l'adresse $mail :\n"
        echo -e "$text\n\n"
        read -p "Valider ? (O/N) " answer
        case ${answer^^} in
                O) echo "Envoi..."  ; echo -e "$text" | mail -s 'Demande de congés futurs' "$mail" && echo "OK" ;;
                N) echo "Abandon de l'envoi du mail." ;;
                *) echo "Réponse non comprise (répondre O ou N)" ; exit 1 ;;
        esac
fi

J’aurais pu ajouter une vérification de validité de l’argument (vérifier s’il s’agit bien d’une date valide au format jj/mm), et une coloration de la sortie (lundi -> vendredi: en rouge, samedi - dimanche en vert) mais bon, vu l’utilité :stuck_out_tongue:

Exemple d’utilisation:

Sputnik@debian:~$ ./anniv-check.sh -m ressources_humaines@cogip2000.com 19/02
2020    Le 19/02 est un mercredi
2021    Le 19/02 est un vendredi
2022    Le 19/02 est un samedi
2023    Le 19/02 est un dimanche
2024    Le 19/02 est un lundi
2025    Le 19/02 est un mercredi
2026    Le 19/02 est un jeudi
2027    Le 19/02 est un vendredi
2028    Le 19/02 est un samedi
2029    Le 19/02 est un lundi
2030    Le 19/02 est un mardi

Le texte suivant sera envoyé par email à l'adresse ressources_humaines@cogip2000.com :

Bonjour,

je souhaite poser commes congés les dates suivantes:

mercredi 19/02 2020
vendredi 19/02 2021
lundi 19/02 2024
mercredi 19/02 2025
jeudi 19/02 2026
vendredi 19/02 2027
lundi 19/02 2029
mardi 19/02 2030

Merci !


Valider ? (O/N) O
Envoi...
OK
3 J'aimes

En tous cas bon anniversaire :smiley:

Pas de soucis, tu es au bon endroit.

Bien que je ne l’utiliserais guère, tu m’as fait PTDR avec ton exemple d’utilisation :stuck_out_tongue:

“Alors, oui, nous allons travailler 25 ans ensemble, sachez M/Mme RH, que je pose dès maintenant l’ensemble de ces dates fétichistes par pure convention personnelle !” :XD
“Je vous pries d’agréer (respec)tueusement l’ensemble de la sincérité de ma considération la plus entière et totale.” :smiley:

Haha, tant mieux alors !

On peut même prévoir sur plusieurs dizaines d’années, j’ai sorti la liste jusqu’en 2120 XD
(en y pensant, je pourrais aussi ajouter une vérification pour ne pas demander un congé sur une date passée, va falloir que je le mette sur un dépôt git si ça continue)

1 J'aime