[Résolu] Calendrier perpétuel des jours fériés.

Calendrier perpétuel des jours fériés. [Résolu] - Divers - Programmation

Marsh Posté le 30-01-2014 à 11:08:03    

bonjour,
 
Dans le cadre de la supervision de mon client, je souhaite intégrer un calendrier perpétuel. Ce qui est important dans mon cas, c'est uniquement de connaitre les jours fériés pour la France : la supervision ne sera active qu'en HNO et jours fériés + samedi/dimanche.
 
Le client ne souhaite pas avoir de maintenance de ce calendrier (bin tient!), et donc me demande la solution la plus automatisée possible. (Je ne fais que l'étude et la réal, pas l'exploitation)
 
Quelqu'un a t il été déja confronté à ce problème? Des idées?
 
Pour l'instant j'ai cherché :  
- CPAN : aucune bibli ne permet de faire ça
- Export des jours fériés Outlook sur plusieurs années : semble alambiqué
- Site web qui propose un export accessible avec une commande genre wget : j'ai pas trouvé
- Script de génération de calendriers : pas trouvé de fiable
 
Des idées?

Message cité 1 fois
Message édité par guimo33 le 31-01-2014 à 14:54:44
Reply

Marsh Posté le 30-01-2014 à 11:08:03   

Reply

Marsh Posté le 30-01-2014 à 11:21:05    

c'est parceque c'est la misère à faire  ( surtout le calcul lde paques ) : http://fr.wikipedia.org/wiki/Calcu [...] %C3%A2ques


Message édité par flo850 le 30-01-2014 à 11:21:23

---------------

Reply

Marsh Posté le 30-01-2014 à 11:43:26    

Merci pour cette info! Je crois que je vais essayer de m'en servir pour justifier le fait que c'est impossible à faire, que ca risque de poser des problèmes.
 
Je vais lui proposer une maintenance qui consistera à déposer un csv des jours fériés chaque année, avec un événement généré si ce n'est pas fait.


Message édité par guimo33 le 30-01-2014 à 11:43:54
Reply

Marsh Posté le 30-01-2014 à 11:46:25    

Bonjour,
emacs le fait, dans le calendrier, mais c'est assez limité. . .
 
Vacances:
    h : affiche tout jour férié connu pour cette date
    x : affiche les jours fériés sur le calendrier
    u : désactive l'affichage des jours fériés sur le calendrier
    a : affiche les vacances des trois mois visibles dans un autre buffer
 
Voilà ce que "a" donne aujourd'hui:
 
Wednesday, 1 January 2014: Nouvel an
Friday, 31 January 2014: Chinese New Year (Jia-Wu)
Friday, 14 February 2014: St.Valentin
Wednesday, 5 March 2014: Ash Wednesday
Thursday, 20 March 2014: Vernal Equinox 5:56pm (CET)
Friday, 21 March 2014: Bahá'í New Year (Naw-Ruz) 171
Sunday, 30 March 2014: Daylight Saving Time Begins 2:00am (CET)
 
et pour les trois mois suivants:
 
Tuesday, 1 April 2014: 1° avril
Tuesday, 15 April 2014: Passover
Friday, 18 April 2014: Good Friday
Sunday, 20 April 2014: Easter Sunday
Monday, 21 April 2014: First Day of Ridvan
Tuesday, 29 April 2014: Ninth Day of Ridvan
Thursday, 1 May 2014: Fête du travail
Friday, 2 May 2014: Twelfth Day of Ridvan
Sunday, 11 May 2014: Fête des mères
Friday, 23 May 2014: Declaration of the Bab
Thursday, 29 May 2014: Ascension of Baha'u'llah
Wednesday, 4 June 2014: Shavuot
Sunday, 15 June 2014: Fête des pères
Saturday, 21 June 2014: Summer Solstice 12:51pm (CEST)
Sunday, 29 June 2014: Ramadan Begins
 
Le jour de Pâques n'apparaît pas. . .
 
 
 

Reply

Marsh Posté le 30-01-2014 à 11:46:42    

Impossible ,non,  
Mais que ça va lui coûter plusieurs jours de développement et tests, au lieu de lui prendre 10 minutes par an


---------------

Reply

Marsh Posté le 30-01-2014 à 12:02:26    

Impossible, peut être pas. Le risque étant :  
- Si le calendrier déclare un jour férié alors que s'en est pas un : le dispositif HNO s'activera, et donc le client sera facturé pour la supervision alors qu'il n'en n'aura pas besoin, vu que ces équipes d'exploit seront au taf. ce risque est faible, mais peut se produire en cas de changement législatif par exemple, surtout par les temps qui courent : ex. pentecote.
- Si le calendrier oublie un jour férié, la supervision HNO ne se déclanchera pas. En cas de merde d'un équipement, le client risque d'avoir des clients mécontants. Le risque est plus élevé que pour le premier cas à mon avis.
 
Sinon, merci pour l'astuce emacs, je vais regarder comment ça fonctionne!


Message édité par guimo33 le 30-01-2014 à 12:03:51
Reply

Marsh Posté le 30-01-2014 à 12:09:50    

Effectivement, ça n'a pas l'air simple : http://fr.wikipedia.org/wiki/F%C3% [...] _en_France

Reply

Marsh Posté le 30-01-2014 à 12:13:02    

Pas moyen d'utiliser le calendar des jours fériés fourni par google ?
https://www.google.com/calendar/fee [...] blic/basic
 
Mais impossible de ne prévoir aucune maintenance, quelque soit la solution choisie :o

Reply

Marsh Posté le 31-01-2014 à 09:14:42    

Bonjour,
 
Pour un début de piste,  
Un VbScript (à enregistrer avec l'extension .vbs) :
 
' *******************************************************************
' Calcul du nombre de jours ouvrés entre deux dates
' compte tenu des jours fériés fixes et mobiles
' 19/06/2002
' *******************************************************************
 
Do while true
   NbJours=0
   NbSamedis=0
   NbDimanches=0
   NbFeries=0
   NbOuvres = 0
 
   Debut = InputBox("Entrer la date de début (jj/mm/aaaa)", "Mes vacances !", "" )  
   if Debut = "" then
      WScript.Quit()
   elseif not IsDate(Debut) then
      Resultat = MsgBox ("La date de début est invalide.", vbCritical, "Mes vacances !" )
      OK = false
   end if
 
   Fin = InputBox("Entrer la date de fin (jj/mm/aaaa)", "Mes vacances !", "" )  
   if Fin = "" then
      WScript.Quit()
   elseif not IsDate(Fin) then
      Resultat = MsgBox ("La date de fin est invalide.", vbCritical, "Mes vacances !" )
      OK = false
   end if
 
   OK = true
 
   if OK = true then
      Deb = Debut
       
      Do while DateDiff("d", Deb, Fin) >= 0
         if WeekDay(Deb, vbMonday) = 6 then
               NbSamedis = NbSamedis + 1
         elseif WeekDay(Deb, vbMonday) = 7 then
               NbDimanches = Nbdimanches + 1
         elseif IsFerie(Deb) then 'and WeekDay(Deb, vbMonday) <> 6 and WeekDay(Deb, vbMonday) <> 7 then
            NbFeries = NbFeries + 1
         end if
         NbJours=NbJours+1
         Deb = DateAdd("d", 1, Deb)
      Loop
       
   end if
   NbOuvres =  NbJours - NbFeries - NbSamedis - NbDimanches
   Resultat = MsgBox ("La période du " & Debut & " au " & Fin & " comprend " & NbOuvres _
              & " jours ouvrés." & chr(10) & chr(10) & "(Les éventuels ponts ne sont pas pris en compte.)" _
              & vbcrlf & "Samedis = " & NbSamedis & vbcrlf & "Dimanches = " & NbDimanches, vbInformation, "Mes vacances !" )
loop
 
Function IsFerie(LeJour)
 Annee = Year(LeJour)
 Paques = fPaques(Annee) 'Cherche le jour de Pâques
 
 LunPaq = cStr(DateAdd("d", 1, Paques)) 'En déduit les jours fériés mobiles
 
 Ascension = cStr(DateAdd("d", 39, Paques))
 
 LunPent = cStr(DateAdd("d", 50, Paques))
 
 PremierJanvier = "01/01/" & Annee
 PremierMai = "01/05/" & Annee
 HuitMai = "08/05/" & Annee
 QuatorzeJuillet = "14/07/" & Annee
 QuinzeAout = "15/08/" & Annee
 PremierNovembre = "01/11/" & Annee
 OnzeNovembre = "11/11/" & Annee
 Noel = "25/12/" & Annee
 
 StrJour = cStr(LeJour)
 if StrJour = LunPaq or StrJour = Ascension or (StrJour = LunPent and Year(LunPent) < 2005) _
 or StrJour = PremierJanvier or StrJour = PremierMai or StrJour = HuitMai _
 or StrJour = QuatorzeJuillet or StrJour = QuinzeAout or StrJour = OnzeNovembre _
 or StrJour = PremierNovembre or StrJour = Noel then
  IsFerie = true
 else
  IsFerie = false
 end if
End Function
 
 
 
Function fPaques(An)
 'Calcule le jour de Pâques en fonction de l'année
 
 a  = An  Mod 19
 b  = An  \ 100
 c  = An  Mod 100
 d  = b  \ 4
 e  = b  Mod 4
 f  = (b  + 8) \ 25
 g  = (b  - f  + 1) \ 3
 h  = (19 * a  + b  - d  - g  + 15) Mod 30
 i  = c  \ 4
 k  = c  Mod 4
 l  = (32 + 2 * e  + 2 * i  - h  - k ) Mod 7
 m  = (a  + 11 * h  + 22 * l ) \ 451
 n  = (h  + l  - 7 * m  + 114) \ 31
 p  = (h  + l  - 7 * m  + 114) Mod 31
 fPaques = DateSerial(An , n , p  + 1)
End Function

Reply

Marsh Posté le 31-01-2014 à 10:27:35    

Dans mon soft Astres (cf ma signature), dans /Astres/Common/DateTimeLibrary.php, tu trouveras plusieurs fonctions qui devraient t'aider :
jours_ouvres($mois, $an)
ferie($mois, $an)
jour_ferie($date)
 
Je les utilise depuis 2004, pas eu de pb pour l'instant, sauf avec la Pentecôte où là, les décisions du gouvernement ont tellement changé que j'ai désactivé ce jour comme férié. ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 31-01-2014 à 10:27:35   

Reply

Marsh Posté le 31-01-2014 à 11:32:32    

Ok, merci, vous etes super les gars :)  .pc75, merci d'avoir fait l'effort de copier le script, les calculs du jour de paques vont bine m'aider.  
 
Idem Rufo, ainsi que ton retour d'expérience. Je vais regarder ton script et m'en inspirer. Je les ferai probablement en Perl.
 
Je vous tient au courant.


Message édité par guimo33 le 31-01-2014 à 11:33:12
Reply

Marsh Posté le 31-01-2014 à 12:12:55    

guimo33 a écrit :

Pour l'instant j'ai cherché :  
- CPAN : aucune bibli ne permet de faire ça

Ben une recherche sur "CPAN Hollidays" m'a renvoyé sur Date::Holidays qui a l'air de faire le boulot.
 
Un truc codé à l'arrache (c'est l'heure de bouffer) pour tester:

Code :
  1. # trouvé chez les monks, ça vire un warning issu d'un module qu'on importe
  2. # car sinon on a en premiere ligne en sortie:
  3. # UNIVERSAL->import is deprecated and will be removed in a future perl at ...
  4. BEGIN {
  5.    my $initial_warnings = "";
  6.    {
  7.        local $SIG{__WARN__} = sub{$initial_warnings .= $_[0]};
  8.        require Date::Holidays;
  9.    }
  10.    $initial_warnings =~ s/^.*deprecated.*$ \n?//xmg;
  11.    warn $initial_warnings if $initial_warnings;
  12. }
  13.  
  14. use strict;
  15. use warnings;
  16.  
  17. my $dh = Date::Holidays->new(countrycode => 'fr');
  18. foreach my $month (1..12) {
  19.   foreach my $day (1..31) {  # manifestement les dates fausses ne foutent pas le souk au vu du test
  20.    if ($dh->is_holiday(
  21.                year  => 2014,
  22.                month => $month,
  23.                day   => $day
  24.        )) {
  25.     print "$day/$month/2014\n";
  26.    }
  27.   }
  28. }


 

E:\Gilou>perl holi.pl
1/1/2014
21/4/2014
1/5/2014
8/5/2014
29/5/2014
9/6/2014
14/7/2014
15/8/2014
1/11/2014
11/11/2014
25/12/2014


 
Ça ne liste que les jours fériés ne tombant pas un samedi ou  dimanche mais ça devrait te convenir.
 
EDIT: plus court et rapide:

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use Date::Holidays::FR;
  5.  
  6. foreach my $month (1..12) {
  7.  foreach my $day (1..31) {
  8.    if (my $holi = is_fr_holiday(2014, $month, $day)) {
  9.      printf("%02d/%02d/2014: %s\n",  $day, $month, $holi);
  10.    }
  11.  }
  12. }

(et vu l'implémentation du module, pas de souci avec les dates fausses passées par la double boucle)
ce qui donne en sortie:

01/01/2014: Nouvel an
21/04/2014: Lundi de pâques
01/05/2014: Fête du travail
08/05/2014: Armistice 39-45
29/05/2014: Ascension
09/06/2014: Pentecôte
14/07/2014: Fête nationale
15/08/2014: Assomption
01/11/2014: Toussaint
11/11/2014: Armistice 14-18
25/12/2014: Noël


 
De plus le source de Date::Holidays::FR est court et facilement modifiable pour adapter à ses besoins (par exemple Pentecôte). Au vu du code, il retourne les jours fériés qu'ils soient des dimanches ou pas, sauf ceux dont il sait déjà que ce sont des dimanches, ie Pâques)
(et si ce que tu cherches en fait, c'est les business days, tu peux facilement récupérer la sortie de ce programme, pour faire un sub holiday compatible avec le module Date::Business, en filtrant les jours qui tombent un samedi ou dimanche de la liste des 11)
A+,


Message édité par gilou le 31-01-2014 à 14:37:08

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 31-01-2014 à 14:50:17    

Trop fort, merci!
 
Pour info, j'ai aussi trouvé une CPAN Date::Easter http://search.cpan.org/~rbow/Date- [...] /Easter.pm qui fait la détermination du jour de paques.
 
En fait, des que j'ai su qu'il fallait chercher "easter" ou "holliday", ça m'a ouvert pas mal de résultats :)
 
Donc je vais utiliser soit :  
- easter cpan + script inspiré du calendrier de gestion des cantines de Rufo
- directement holidays, mais après vérif qu'il n'y a pas de problème avec les jours fériés (pentecote etc...).
 
Je met [résolu] dans le titre, en épérant pouvoir en aider d'autres de la même manière (je le fais déja dans discussions et audio lol).


Message édité par guimo33 le 31-01-2014 à 14:57:44
Reply

Marsh Posté le 31-01-2014 à 15:45:57    

Si tu regardes le code de Date::Holidays::FR, tu verras que sur les 11 jours fériés pour la France qu'il calcule, ils sont tous à date fixe, sauf Pâques (qu'il intègre pas dans sa liste, car c'est défini officiellement avec les 11), le Lundi de Pâques (Donc Pâques+1), Le Jeudi de l'Ascension (Pâques + 39) et le Lundi de Pentecôte (Pâques + 50).
Donc en fait, il connait les 8 dates fixes, il calcule Pâques en faisant appel justement a Date::Easter, et à partir de la, il calcule les 3 dates mobiles restantes. C'est  pratiquement à ça que se réduit  le code de Date::Holidays::FR dans http://cpansearch.perl.org/src/FAB [...] days/FR.pm
Donc si par exemple tu veux la liste des jours fériés ne tombant pas un samedi ou dimanche, tu as déjà les 3 dates mobiles, et il te reste à éliminer parmi les 8 restantes celles tombant un samedi ou dimanche (cette année, la Toussaint tombe un Samedi). Par exemple ainsi on peut ainsi coder une version nettement plus réaliste des jours de congé français... :whistle: :
 

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use DateTime;
  5. use Date::Holidays::FR;
  6.  
  7. foreach my $month (1..12) {
  8.  foreach my $day (1..31) {
  9.    if (my $holi = is_fr_holiday(2014, $month, $day)) {
  10.     my $dt = DateTime->new(year => 2014, month => $month, day => $day);
  11.     my $dow = $dt->day_of_week();
  12.     next if ($dow > 5); # 6 = Sa, 7 = Di
  13.     if ($dow == 2) { # 2 = Ma
  14.         printf("%02d/%02d/2014: %s -- Attention, Pont possible la veille\n",  $day, $month, $holi);
  15.     }
  16.     elsif ($dow == 4) { # 4 = Je
  17.         printf("%02d/%02d/2014: %s -- Attention, Pont possible le lendemain\n",  $day, $month, $holi);
  18.     }
  19.     else {
  20.         printf("%02d/%02d/2014: %s\n",  $day, $month, $holi);
  21.     }
  22.    }
  23.  }
  24. }


 

01/01/2014: Nouvel an
21/04/2014: Lundi de pâques
01/05/2014: Fête du travail -- Attention, Pont possible le lendemain
08/05/2014: Armistice 39-45 -- Attention, Pont possible le lendemain
29/05/2014: Ascension -- Attention, Pont possible le lendemain
09/06/2014: Pentecôte
14/07/2014: Fête nationale
15/08/2014: Assomption
11/11/2014: Armistice 14-18 -- Attention, Pont possible la veille
25/12/2014: Noël -- Attention, Pont possible le lendemain


A+,


Message édité par gilou le 31-01-2014 à 16:24:21

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 19-01-2016 à 17:05:24    

Bonjour,
 
 
Meilleur vœux pour 2016
 
 
Ce petit message et déterrage pour remercier pc75
 
Je me suis servi de son code adapté en VB.NET et il fonctionne très bien :)
 
Merci mille fois!

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed