Page 1 sur 1

Calendrier/Planning présence

Posté : 19 avr. 2017, 18:06
par guigui69
Bonjour à tous,

Je dispose d'une base de donnée avec la liste de mes salariées présent sur la société.
Dans cette base je vais mettre :
- une table avec leur jour de conges.
- Une table pour mettre les jours férié

Je voudrais arriver à afficher sur une page web un calendrier

- sur une ligne l'ensemble du mois (le numéro du jour + Nom du jour (lundi/mardi..)
- 1er colonne la liste des salariée.

Au milieu il y a aurait des indications de couleurs pour indiqué si la personne est présente ou pas.

Je bloque sur la méthode pour arriver à afficher le cœur du planning, je sais pas comment je devrait commencer.


Donc si quelqu'un pourrait m’aiguiller sur la manière je devrait coder (comment partir,..)ceci en php je suis preneur :)


merci d'avance

guigui69

Re: Calendrier/Planning présence

Posté : 20 avr. 2017, 10:40
par moogli
salut,

première chose, tu ne met pas les jour férié en base, c'est une grosse connerie, la plus part sont fixe, les autres sont calculable (a partir de pâques) il existe des infos sur les méthodes de calcul sur les web (j'ai fait une version java ici et en plus pour simplifier la chose il existe une fonction php pratique easter_date du reste juste le calcule des jours flottants relatif à pâque ;)).

ensuite pour afficher ton calendrier il te faut
- la liste des CP sur la période que tu affiches (donc sa c'est une requête SQL).
- le nombre de jour sur la période que tu affiches.

vue que ce que tu veux faire il faut afficher dynamiquement les colonnes en plus des lignes (habituellement on connait les colonnes).
pour cela tu boucles sur les jours pour afficher l'entête, puis tu recommences pour les cp de la personne.
Avec l'API de date de php on peu faire cela de manière simple.
Par exemple pur afficher un mois
<table style="width:100%">
  <tr><th></th>
<?php
$start = DateTime::createFromFormat('d-m-Y','1-4-2017');
$end = clone($start);
$end = $end->add(new DateInterval('P1M'));

// intervalle pour l'itération, ici 1 jour
$interval = new DateInterval('P1D');
//objet qui représente la période avec l'intervalle choisit
$daterange = new DatePeriod($start, $interval ,$end);
// itération du 1er jour à l'avant dernier (la borne de fin n'est pas prise en compte, c'est pour ça que $end est le 1er jour du mois suivant)
foreach($daterange as $date){
    echo'<th>', $date->format("d") ,'</th>';
}
?>
</tr></table>
Pour le mois courant php propose une solutin de fou ;)
<table style="width:100%">
  <tr><th></th>
<?php
// ça c'est top :-)
// 1er jour du mois courant
$start = new DateTime('first day of this month');
// 1er jour du mois suivant
$end =new DateTime('first day of next month');

$interval = new DateInterval('P1D');
$daterange = new DatePeriod($start, $interval ,$end);
foreach($daterange as $date){
    echo'<th>', $date->format("d") ,'</th>';
}
?>
</tr></table>
A toi d'adapter à ta période, mais tu eux forcément le faire avec DateTime, et les format relatif http://php.net/manual/fr/datetime.formats.relative.php (le 2ème exemple).

ensuite il te faut les CP des gens. si tu as un tableau qui contient le jour ou la date c'est simple, il suffit de reprendre le foreach et vérifier si le jour courant est dans le tableau des CP in_array est ta meilleure amie pour cela.
il la date courante est dans le tableau utilise une classe css particulière pour changer la couleur de fond de la cellule ;)

et voilà tu as un calendrier qui peut même contenir les CP de toute la boite, d'une équipe etc.

@+

Re: Calendrier/Planning présence

Posté : 28 avr. 2017, 15:14
par guigui69
Bonjour Moogli,

Déjà grand merci pour ce code pour afficher un calendrier :) , je pensais meme pas partir sur cela.

Par contre je bloque sur cette explication:
ensuite il te faut les CP des gens. si tu as un tableau qui contient le jour ou la date c'est simple, il suffit de reprendre le foreach et vérifier si le jour courant est dans le tableau des CP in_array est ta meilleure amie pour cela.
il la date courante est dans le tableau utilise une classe css particulière pour changer la couleur de fond de la cellule ;)
Avec les CP de salarié de la société ça je vais les avoir sous cette forme:

Code : Tout sélectionner

Nom|Date début|Date Fin| toto1|01/04/2017|15/04/2017| yaya2|05/04/2017|07/04/2017| etc..
donc il (si j'ai bien compris) faut que je (en mysql, possible?) liste pour chaque salarié les date entre date début date de fin pour apres utiliser in_array ? c'est bien ca ?

merci de ton aide et de tes explications

guigui69

Re: Calendrier/Planning présence

Posté : 04 mai 2017, 15:20
par moogli
salut,

Avec les dates de débuts et de fins des cp tu peux t'en sortir, il faut juste savoir si la date est comprise dans intervalle (bornes incluses) ;)
du si $debutCP <= $jourCourant <= $finCP

ce qui fait avec le code d'avant
<?php
$debutCP = DateTime::createFromFormat('......','...');
$finCP  = DateTime::createFromFormat('......','...');
foreach($daterange as $date){
    echo '<td';
    if($debutCP <= $data <= finCP {
        echo ' class="laclasse_css_qui_va_bien_pour_indiquer_un_cp"';
    }
    echo '&nbsp;'; // à toi de voir ce que tu affiches). 
    echo '</td>'
}
La c'est un exemple simple mais il te faut la liste des cps sur la période (qui commence, ou qui finissent mais aussi ceux qui couvrent la période) et faire une boucle dessus pour savoir si la personne est en congé ou non. Pour aller plus loin c'est une liste des personnes en CP sur la période qu'il te faut avec les dates de début et de fin. Cela se traduit par une boucle for sur un tableau pour afficher les CP du jour courant.

pour les calculs de jours fériés j'ai fait une version PHP depuis :) https://github.com/tipounet/bankHolidaysPhp

@+

Re: Calendrier/Planning présence

Posté : 17 août 2017, 11:39
par guigui69
Bonjour Moogli,

Grace à précieux conseil j'avance dans ma page php.

Par contre pour indiquer les congés j'ai du réaliser un array pour lister tout les jours de congés car sur 1 mois la personne peut prendre à plusieurs moment des congés. et j'utilise "in_array" pour check.
$start = DateTime::createFromFormat('d-m-Y','1-'.$_POST["mois"].'-'.$_POST["annee"].'');
$end = clone($start);
$end = $end->add(new DateInterval('P1M'));

// intervalle pour l'itération, ici 1 jour
$interval = new DateInterval('P1D');
//objet qui représente la période avec l'intervalle choisit
$daterange = new DatePeriod($start, $interval ,$end);
// itération du 1er jour à l'avant dernier (la borne de fin n'est pas prise en compte, c'est pour ça que $end est le 1er jour du mois suivant)
$count=0;
foreach($daterange as $date){
	$count=$count+1;
    echo'<th>', $date->format("d") ,'</th>';
}
?>
</tr>

<?php
$sql_salarie="SELECT rhp.id_rhp as id_rhp, rhp.nom as nom, rhp.prenom as prenom
FROM `rh_personnel_suivi` rhps
INNER JOIN rh_personnel rhp ON rhp.id_rhp = rhps.id_rhp
WHERE id_concessions = '".$_POST["id_concessions"]."'
AND `date_fin` = '0000-00-00'";


$query_salarie= mysql_query($sql_salarie) or die('erreursql_salarie');
$nb=mysql_num_rows($query_salarie);
if ($nb == null){
echo "Pas type.";
} else {
while ( $list = mysql_fetch_array( $query_salarie ) ){
echo '<tr><td>'.$list["id_rhp"].'-'.$list["nom"].'-'.$list["prenom"].'</td>';

$sql_conges="SELECT id_rhp, debut_conges, fin_conges FROM `rh_personnel_conges`
WHERE `id_rhp`='".$list["id_rhp"]."'
AND (month(`debut_conges`)='".$_POST["mois"]."' OR month(`fin_conges`)=".$_POST["mois"].")
AND (year(`debut_conges`)='".$_POST["annee"]."' OR year(`fin_conges`)='".$_POST["annee"]."')
ORDER BY debut_conges";
//echo '<br/>'.$sql_conges;
$query_conges= mysql_query($sql_conges) or die('erreursql_conges');
$nbconges=mysql_num_rows($query_conges);
if ($nbconges == null)
{
for ($i = 1; $i <= $count; $i++) {
    echo '<td>-</td>';
}	

}
else
{

$listedateperiodeconges = array();	

while ( $listc = mysql_fetch_array( $query_conges ) ){
	
$startperiodeconges = DateTime::createFromFormat('Y-m-d',$listc["debut_conges"]);
$endperiodeconges = DateTime::createFromFormat('Y-m-d',$listc["fin_conges"]);
$endperiodeconges = $endperiodeconges->add(new DateInterval('P1D'));
$intervalperiodeconges = new DateInterval('P1D');
//objet qui représente la période avec l'intervalle choisit
$daterangeperiodeconges = new DatePeriod($startperiodeconges, $intervalperiodeconges ,$endperiodeconges);

foreach($daterangeperiodeconges as $dateperiodeconges){
	$listedateperiodeconges[]= $dateperiodeconges;
    //echo'<th>', $date->format("d") ,'</th>';
}
}	


$daterange2 = new DatePeriod($start, $interval ,$end);
foreach($daterange2 as $data){
    echo '<td ';
	if (in_array($data, $listedateperiodeconges)) 
	{
    echo "class=\"cp\">cp";
	}
	else	
	{
    echo "class=\"travail\">";
	}
    // if($debutCP <= $data && $data <= $finCP ) 
	// {
        // echo 'x';
    // }
    // echo '&nbsp;'; // à toi de voir ce que tu affiches). 
    echo '</td>';
}
}
}
echo '</tr>';
}
	}
//print_r ($listedateperiodeconges);
?>

</table>

Ca à l'air de fonctionner :)

Par contre j'ai du recreer un $daterange2 = new DatePeriod($start, $interval ,$end); est-ce normale? ou pas ?

Question sur le Array est il possible de rajouter une colonne supplémentaire? si oui Comment ? Et est-ce que cela va empêcher de faire fonction le In_array?

merci pour tes conseils

guigui69