Page 1 sur 1

Calcul DIF en SQL

Posté : 13 juin 2013, 20:27
par guigui69
Bonsoir à tous,

Je dois calculer pour notre application le DIF (Droit Individuel à la Formation)

Dans ma base de donnée, je dispose de la date d'entrée de la personne.
Exemple : Personne Embauché le 16/02/2009 et je veux connaitre son dif pour chaque année jusqu'au 31/12/2012

Je voudrais savoir si en SQL je pouvais arriver au Résultat sous cette Forme:
Date
31/12/2009 : 18H
31/12/2010: 20H
31/12/2011:20H
31/12/2012:20H
Le calcul du DIF, c'est 20H par année complet

Je pose la question car je suis dessus depuis des heures et je ne sais pas comment partir pour faire ce calcul. Il est peut etre pas possible de réalisé directement en SQL.

Merci d'avance pour votre aide

guigui69

Re: Calcul DIF en SQL

Posté : 17 juin 2013, 17:13
par sadeq
Bonjour, Voici une piste :
Calcul du Dif global jusqu'au 31/12 de l'année courante:
SELECT Nom_Personne, (DATEDIFF(MAKEDATE(YEAR(NOW()),365), Date_embauche) * 20/365) AS DIF
FROM ...
Dif Par année:
<?php
#requete
mysql_select_db('test', mysql_connect('localhost','root'));
$personnes = array();
$req = mysql_query('SELECT * FROM t_personne ORDER BY date_embauche DESC');
while($req && $row=mysql_fetch_assoc($req)){
	$personnes[$row['nom']] = $row['date_embauche'];
}
#traitement
foreach($personnes as $nom=>$date_embauche){
	$Date_X = $date_embauche;
	$a = date('Y', strtotime($Date_X));
	while( $a<=date('Y'))
	{
	   $SQL = "SELECT (DATEDIFF(MAKEDATE(YEAR('$Date_X'),365), '$Date_X') * 20/365) AS DIF";
	   //echo "<p>$SQL</p>";
	   //exécuter et afficher
		$req = mysql_query($SQL);
		if ($req&& $row=mysql_fetch_assoc($req)){ echo "<li>31/12/$a => ".$row['DIF']." H</li>";}
	   //passer à la date suivante
	   $a++;
	   $Date_X = ($a . '-01-01');
	}
}
?>

Re: Calcul DIF en SQL

Posté : 09 juil. 2013, 14:54
par guigui69
Merci pour ton aide,

je prend note de tes deux exemples.

Je reviens poster mon résultat dans la journée.

guigui69

Re: Calcul DIF en SQL

Posté : 23 août 2013, 15:27
par guigui69
J'ai mise en place ma fonction pour le calcul du DIF et voici ce que cela donne

	$query2 = mysql_query("SELECT date_entree as date_entree,YEAR(date_entree) as annee_entree, date_sortie,MAKEDATE(YEAR(NOW())-1,365) as test,YEAR(NOW())-1 as test
FROM rh_personnel rhp
WHERE rhp.id_rhp='$test'");
$result = mysql_fetch_array($query2);

$a=$result["annee_entree"];
$annee_fin=$result["test"];
$r=0;
$rn1=0;
//echo ">>>>>>>>>>>>>>>>>>>>".$a.">>>>>>>>>>>>>>>>>".$annee_fin."<<<<<<<<<<<<<<<<";
echo '<br/><p>
<table id="tab1">
<tr><td>Heure dif acquis</td><td>Année heure dif acquis 31/12/XX</td><td>Heure dif utilisée</td><td>Année N-1 Dif</td><td>Remarque</td><td>Rwwww</td><td>Final</td></tr>';
 while( $a<=$annee_fin)
        {
           $SQL = "Select (SELECT IF((DATEDIFF(CONCAT('".$a."','-12-31'),date_entree)/365) >1,20,ROUND(((DATEDIFF(CONCAT('".$a."','-12-31'),date_entree)/365) *20),2) ) as tttt
 FROM rh_personnel rhp
 WHERE rhp.id_rhp='$test') as r1, (SELECT IFNULL(SUM(nbre_heure_stage),0) FROM  rh_personnel_stage WHERE dif='1' AND rh_personnel_stage.id_rhp='$test' AND YEAR(date_fin_stage) =(".$a."-1) AND YEAR(date_debut_stage) =(".$a."-1) ) as r2,$a as r3, (".$a."-1) as r4 ";
         // echo "<p>$SQL</p>";
           //exécuter et afficher
                $req = mysql_query($SQL);
                if ($req&& $row=mysql_fetch_assoc($req)){ 
				$t1=$row['r1'];
				$t2=$row['r2'];
				echo "<tr><td>".$row['r1']." </td><td> ".$row['r3']."</td><td> ".$row['r2']." </td><td>".$row['r4']."</td>";
				}
		   if($r+$row['r1']>120)
		   {
		    //echo "<td>$r</td>";
		   $r=120;
		   echo "<td>Plafond atteind</td>";
			 $t=$rn1+$t1;
			  echo "<td>".$t."-".$t2."</td>";
		   }
		   else
		   {
		    $r=$r+$row['r1']-$row['r2'];
			 echo "<td>RAS</td>";
			 $t=$rn1+$t1;
			  echo "<td>".$t."-".$t2."</td>";
		   }
		  // echo "<td>".$t2+$r."</td>";
		  $rn1=$r;
		echo "<td>$r</td></tr>";
		 $a++;
        }
		echo '</table>';
		//echo "<p>$r</p>";
Explication:

- Récupéré date entrée/année entrée du salarié dans ma base.
- réalisation une boucle de l'année d'arrivée jusqu’à année( aujourd'hui)-1 .
- Une requête qui retourne deux résultat:
1- Le nombre d'heure de dif acquis cette "n" année
2- le nombre d'heure utilisée l'année "n"-1.
- On affiche le résultat dans un tableau HTML avec une condition c'est que si au cumul on atteins 120 heures le compteur dif reste bloqué à 120h.

guigui69

Re: [RESOLU] Calcul DIF en SQL

Posté : 29 août 2013, 11:47
par pjl
Ton calcul est bon sur le plan informatique mais n'est pas bon par rapport à la législation.
Un salarié a droit à 20h par an s'il a travaillé toute l'année à temps plein.
S'il a été malade, ça va dépendre de la convention collective.
S'il a été en congés sans solde, c'est au prorata temporis.
S'il est à temps partiel, en dessous de 80%, c'est aussi au prorata. Un salarié à mi-temps n'aura que 10h.
Enfin, le calcul se fait année par année et non sur une durée.
Au final, ce sont les mêmes totaux mais normalement, on doit pouvoir sortir les droits d'un salarié année par année et aussi au niveau de l'ensemble de l'entreprise.
Et il ne faut pas oublier qu'il y a les entrées d'heures mais aussi les sorties (lorsqu'il suit une formation).

Bon courage.

Re: [RESOLU] Calcul DIF en SQL

Posté : 04 sept. 2013, 13:57
par guigui69
Bonjour,

je vais regarder cela :) merci

guigui69