none
Gerer les dates RRS feed

  • Question

  • Bonjour, 

    Je créer une application c# sous visual studio 2012.

    Mon application s'occupera de gérer lescongés des employés. 

    c'est à dire qu'un employé devra metre la date de début et la date de fin  du congés et le programme devra calculé automatiquement le nombre de congés ouvrable. 

    Il aurait-il un élément pour faire cela de manière simple. merci d'avance 

    mercredi 21 août 2013 08:45

Réponses

  • En premier lieu, il y a le droit du travail , ses modalités d'application, ensuite les conventions collectives, puis les accords d'entreprise, etc ...

    Un exemple concret : si tu as pris la semaine du 12/08/13 au 18/08/13, tu n'as pas pris 7 jours de congés, mais 5 : le 15 août est férié et le 18 étant un dimanche, aussi. Ils ne sont pas comptabilisés. Le premier samedi (ici le 10/08/13) n'est en général pas comptabilisé, ça dépend des entreprises.

    Le nombre de jours fériés, hors dimanche, est fixe. Il n'est pas difficile d'avoir un tableau contenant ces dates, afin de tester si il y en a d'inclus dans la période de congés. Compter le nombre de dimanche dans cette même période n'est pas difficile non plus (si un jour férié tombe un dimanche, ça ne compte pas double).

    Reste à connaitre la date des fêtes mobiles : Pâques, Ascension et Pentecôte. Et là je ne suis pas responsable de la méthode, des religieux, des astronomes, des mathématiciens y ont planché pendant des siècles : Calcul de la date de Pâques

    Je ne peux pas simplifier la fonction, juste te la traduire en C# :

            DateTime Paques, Ascension, Pentecote;
    
            private void button1_Click(object sender, EventArgs e)
            {
                computeEasterDay(DateTime.Now.Year);
                MessageBox.Show ("Pâques    : " + Paques.ToLongDateString() + "\n" +
                                 "Ascension : " + Ascension.ToLongDateString() + "\n" +
                                 "Pentecôte : " + Pentecote.ToLongDateString() + "\n");
            }
    
            private void computeEasterDay(int Y)
            {
                //int Y;                         // Annee
                int golden;                      // Nombre d'or
                int solar;                       // Correction solaire
                int lunar;                       // Correction lunaire
                int pfm;                         // Pleine lune de paques
                int dom;                         // Nombre dominical
                int easter;                      // jour de paques
                int tmp;
             
                // Nombre d'or
                golden = (Y % 19) + 1;
                if (Y <= 1752)            // Calendrier Julien
                {
                    // Nombre dominical
                    dom = (Y +(int) (Y / 4) + 5) % 7;
                    if (dom < 0) dom += 7;
                    // Date non corrigee de la pleine lune de paques
                    pfm = (3 - (11 * golden) - 7) % 30;
                    if (pfm < 0) pfm += 30;
                }
                else                       // Calendrier Gregorien
                {
                  // Nombre dominical
                  dom = (Y + (int)(Y / 4) - (int)(Y / 100) + (int)(Y / 400)) % 7;
                  if (dom < 0) dom += 7;
                  // Correction solaire et lunaire
                  solar = (int)(Y - 1600) / 100 - (int)(Y - 1600) / 400;
                  lunar = (int)(((int)(Y - 1400) / 100) * 8) / 25;
                  // Date non corrigee de la pleine lune de paques
                  pfm = (3 - (11 * golden) + solar - lunar) % 30;
                  if (pfm < 0) pfm += 30;
                }
                // Date corrige de la pleine lune de paques :
                // jours apres le 21 mars (equinoxe de printemps)
                if ((pfm == 29) || (pfm == 28 && golden > 11)) pfm--;
      
                tmp = (4 - pfm - dom) % 7;
                if (tmp < 0) tmp += 7;
      
                // Paques en nombre de jour apres le 21 mars
                easter = pfm + tmp + 1;
      
                if (easter < 11)
                {
                    Paques =DateTime.Parse( (easter + 21) + "/3/" + Y);
                }
                else
                {
                    Paques = DateTime.Parse((easter - 10) + "/4/" + Y);
                }
    
                Ascension = Paques.AddDays(39);
                Pentecote = Paques.AddDays (50);
                // Lundi de paques
                Paques = Paques.AddDays(1);
            }

    Tu peux simplifier un peu en virant la partie calendrier Julien, abandonné en 1752. Une fois ces trois dates connues, tu les ajoutes au tableau qui contient les dates fixes, et le traitement est relativement simple : il est peu probable d'avoir à travailler sur deux années, ce qui impliquerai d'avoir en même temps Noël et Pâques


    Cordialement, Jacques

    • Marqué comme réponse SarahChou lundi 26 août 2013 07:55
    jeudi 22 août 2013 09:05

Toutes les réponses

  • Bonjour,

    A ma connaissance, il n'y a pas de control prévu pour faire cela dans le framework. Mais vous pourriez le faire assez simplement en utilisant 2 DateTimePicker et récupérer leur valeur pour calculer le nombre de jours de congé désiré.

    mercredi 21 août 2013 08:57
  • Bonjour SarahChou,

    Il te faut pour cela connaitre les jours non ouvrables. En France ils sont de deux sortes :

    Les fixes :

    • Dimanches (quoique...)
    • 1er janvier (Jour de l'an)
    • 1er mai (Fête du travail)
    • 8 mai (Victoire 1945)
    • 14 juillet (Fête Nationale)
    • 15 août (Assomption)
    • 1er novembre (Toussaint)
    • 11 novembre (Armistice 1918)
    • 25 décembre (Noël)

    Les mobiles (fêtes religieuses qui changent de place chaque année)

    • Lundi de Pâques (Pâques+1 jour)
    • Jeudi de l’Ascension (Pâques+ 39 jours)
    • Lundi de Pentecôte (Pâques+ 50 jours. Gestion variable depuis 2004 et Mr Raffarin, suite à canicule 2003)

    Ces trois jours sont basés sur la date du dimanche de Pâques. Je peux te fournir le code ... VB6 ;-)

    Ça ne devrait pas être trop difficile à traduire :

    Private Paques As Date, Ascension As Date, Pentecote As Date

    ' Calcul du jour de Paques, de l'Ascension et de la Pentecote ' =========================================================== Private Sub computeEasterDay() Dim Y As Integer ' Annee Dim golden As Integer ' Nombre d'or Dim solar As Integer ' Correction solaire Dim lunar As Integer ' Correction lunaire Dim pfm As Integer ' Pleine lune de paques Dim dom As Integer ' Nombre dominical Dim easter As Integer ' jour de paques Dim tmp As Integer Dim Temp As String Y = Year(Now) ' Nombre d'or golden = (Y Mod 19) + 1 If Y <= 1752 Then ' Calendrier Julien ' Nombre dominical dom = (Y + (Y \ 4) + 5) Mod 7 If dom < 0 Then dom = dom + 7 ' Date non corrigee de la pleine lune de paques pfm = (3 - (11 * golden) - 7) Mod 30 If pfm < 0 Then pfm = pfm + 30 Else ' Calendrier Gregorien ' Nombre dominical dom = (Y + (Y \ 4) - (Y \ 100) + (Y \ 400)) Mod 7 If dom < 0 Then dom = dom + 7 ' Correction solaire et lunaire solar = (Y - 1600) \ 100 - (Y - 1600) \ 400 lunar = (((Y - 1400) \ 100) * 8) \ 25 ' Date non corrigee de la pleine lune de paques pfm = (3 - (11 * golden) + solar - lunar) Mod 30 If pfm < 0 Then pfm = pfm + 30 End If ' Date corrige de la pleine lune de paques : ' jours apres le 21 mars (equinoxe de printemps) If (pfm = 29) Or (pfm = 28 And golden > 11) Then pfm = pfm - 1 End If tmp = (4 - pfm - dom) Mod 7 If tmp < 0 Then tmp = tmp + 7 ' Paques en nombre de jour apres le 21 mars easter = pfm + tmp + 1 If easter < 11 Then Paques = (easter + 21) & "/3/" & Y Else Paques = (easter - 10) & "/4/" & Y End If Ascension = DateAdd("d", 39, Paques) Pentecote = DateAdd("d", 50, Paques) ' Lundi de paques Paques = DateAdd("d", 1, Paques) End Sub

    Bizarrement ça marche et ça tombe dans cette plage


    Cordialement, Jacques



    • Modifié Jacques93 mercredi 21 août 2013 10:31 Commentaire
    mercredi 21 août 2013 10:20
  • Merci pour ces réponses. 

    Alors j'ai fait un mex des deux j'ai mis deux datetime picker  avec l'un correspondant à la date de départ et l'autre à la date de fin. 

    Maintenant le problème du calcul des jours férié ou non  reste un problème. 

    Merci Jacques93 pour ces lignes de codes mais désolé je ne comprend pas cette fonction. je pourrais avoir une explication un peu plus simpliste merciiiiiii beaucoup d'avance .

    jeudi 22 août 2013 07:09
  • Bonjour

    Je dirais qu’il est nécessaire un calendrier ou marquer les jours non ouvrables car il est possible d'avoir des changements, et je ne trouve pas une bonne idée de modifier l’application chaque fois on change quelque chose dans l’économie des jours non ouvrables.

    Cordialement,


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    jeudi 22 août 2013 07:59
  • En premier lieu, il y a le droit du travail , ses modalités d'application, ensuite les conventions collectives, puis les accords d'entreprise, etc ...

    Un exemple concret : si tu as pris la semaine du 12/08/13 au 18/08/13, tu n'as pas pris 7 jours de congés, mais 5 : le 15 août est férié et le 18 étant un dimanche, aussi. Ils ne sont pas comptabilisés. Le premier samedi (ici le 10/08/13) n'est en général pas comptabilisé, ça dépend des entreprises.

    Le nombre de jours fériés, hors dimanche, est fixe. Il n'est pas difficile d'avoir un tableau contenant ces dates, afin de tester si il y en a d'inclus dans la période de congés. Compter le nombre de dimanche dans cette même période n'est pas difficile non plus (si un jour férié tombe un dimanche, ça ne compte pas double).

    Reste à connaitre la date des fêtes mobiles : Pâques, Ascension et Pentecôte. Et là je ne suis pas responsable de la méthode, des religieux, des astronomes, des mathématiciens y ont planché pendant des siècles : Calcul de la date de Pâques

    Je ne peux pas simplifier la fonction, juste te la traduire en C# :

            DateTime Paques, Ascension, Pentecote;
    
            private void button1_Click(object sender, EventArgs e)
            {
                computeEasterDay(DateTime.Now.Year);
                MessageBox.Show ("Pâques    : " + Paques.ToLongDateString() + "\n" +
                                 "Ascension : " + Ascension.ToLongDateString() + "\n" +
                                 "Pentecôte : " + Pentecote.ToLongDateString() + "\n");
            }
    
            private void computeEasterDay(int Y)
            {
                //int Y;                         // Annee
                int golden;                      // Nombre d'or
                int solar;                       // Correction solaire
                int lunar;                       // Correction lunaire
                int pfm;                         // Pleine lune de paques
                int dom;                         // Nombre dominical
                int easter;                      // jour de paques
                int tmp;
             
                // Nombre d'or
                golden = (Y % 19) + 1;
                if (Y <= 1752)            // Calendrier Julien
                {
                    // Nombre dominical
                    dom = (Y +(int) (Y / 4) + 5) % 7;
                    if (dom < 0) dom += 7;
                    // Date non corrigee de la pleine lune de paques
                    pfm = (3 - (11 * golden) - 7) % 30;
                    if (pfm < 0) pfm += 30;
                }
                else                       // Calendrier Gregorien
                {
                  // Nombre dominical
                  dom = (Y + (int)(Y / 4) - (int)(Y / 100) + (int)(Y / 400)) % 7;
                  if (dom < 0) dom += 7;
                  // Correction solaire et lunaire
                  solar = (int)(Y - 1600) / 100 - (int)(Y - 1600) / 400;
                  lunar = (int)(((int)(Y - 1400) / 100) * 8) / 25;
                  // Date non corrigee de la pleine lune de paques
                  pfm = (3 - (11 * golden) + solar - lunar) % 30;
                  if (pfm < 0) pfm += 30;
                }
                // Date corrige de la pleine lune de paques :
                // jours apres le 21 mars (equinoxe de printemps)
                if ((pfm == 29) || (pfm == 28 && golden > 11)) pfm--;
      
                tmp = (4 - pfm - dom) % 7;
                if (tmp < 0) tmp += 7;
      
                // Paques en nombre de jour apres le 21 mars
                easter = pfm + tmp + 1;
      
                if (easter < 11)
                {
                    Paques =DateTime.Parse( (easter + 21) + "/3/" + Y);
                }
                else
                {
                    Paques = DateTime.Parse((easter - 10) + "/4/" + Y);
                }
    
                Ascension = Paques.AddDays(39);
                Pentecote = Paques.AddDays (50);
                // Lundi de paques
                Paques = Paques.AddDays(1);
            }

    Tu peux simplifier un peu en virant la partie calendrier Julien, abandonné en 1752. Une fois ces trois dates connues, tu les ajoutes au tableau qui contient les dates fixes, et le traitement est relativement simple : il est peu probable d'avoir à travailler sur deux années, ce qui impliquerai d'avoir en même temps Noël et Pâques


    Cordialement, Jacques

    • Marqué comme réponse SarahChou lundi 26 août 2013 07:55
    jeudi 22 août 2013 09:05
  • Je vous remercie tous pour ces réponses plus que claire. 

    Je vais voir tous ça dans mon coin et je reviendrais vers vous avec ma solution final . 

    Merci encore 

    lundi 26 août 2013 07:56