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.
@+
Il en faut peu pour être heureux ......