$prev_link = "{$PHP_SELF}?session={$session}&onglet={$onglet}&year=" . ($year - 1) . "&groupe_id={$groupe_id}"; $next_link = "{$PHP_SELF}?session={$session}&onglet={$onglet}&year=" . ($year + 1) . "&groupe_id={$groupe_id}"; echo "<div class=\"onglet calendar-nav\">\n"; echo "<ul>\n"; echo "<li><a href=\"{$prev_link}\" class=\"calendar-prev\"><i class=\"fa fa-chevron-left\"></i><span>année précédente</span></a></li>\n"; echo "<li class=\"current-year\">{$year}</li>\n"; echo "<li><a href=\"{$next_link}\" class=\"calendar-next\"><i class=\"fa fa-chevron-right\"></i><span>année suivante</span></a></li>\n"; echo "</ul>\n"; echo "</div>\n"; } else { echo '<div class="onglet ' . ($onglet == $key ? ' active' : '') . '" ><a href="' . $PHP_SELF . '?session=' . $session . "&year={$year}&onglet=" . $key . '">' . $title . '</a></div>'; } } echo '</div>'; // vérifie si les jours fériés sont saisie pour l'année en cours if (verif_jours_feries_saisis($date_debut_yyyy_mm_dd, $DEBUG) == FALSE && verif_jours_feries_saisis($date_fin_yyyy_mm_dd, $DEBUG) == FALSE) { $code_erreur = 1; // code erreur : jour feriés non saisis $onglet = "calendar"; } //initialisation de l'action demandée : saisie_dates, commit_new_fermeture pour enregistrer une fermeture, annul_fermeture pour confirmer une annulation, commit_annul_fermeture pour annuler une fermeture //en cas de confirmation d'une fermeture : if ($choix_action == "commit_new_fermeture") { // on verifie que $new_date_debut est anterieure a $new_date_fin if ($timestamp_date_debut > $timestamp_date_fin) { $code_erreur = 2; // code erreur : $new_date_debut est posterieure a $new_date_fin $choix_action = "saisie_dates"; } elseif ($timestamp_date_debut < $timestamp_today) { $code_erreur = 3; // code erreur : saisie de date passée
function compter($user, $num_current_periode, $date_debut, $date_fin, $opt_debut, $opt_fin, &$comment, $DEBUG = FALSE, $num_update = null) { // verif si date_debut est bien anterieure à date_fin // ou si meme jour mais debut l'apres midi et fin le matin if (strtotime($date_debut) > strtotime($date_fin) || $date_debut == $date_fin && $opt_debut == "pm" && $opt_fin == "am") { $comment = _('calcul_nb_jours_commentaire_bad_date'); return 0; } if ($date_debut != 0 && $date_fin != 0) { // On ne peut pas calculer si, pour l'année considérée, les jours feries ont ete saisis if (verif_jours_feries_saisis($date_debut, $DEBUG, $num_update) == FALSE || verif_jours_feries_saisis($date_fin, $DEBUG, $num_update) == FALSE) { $comment = _('calcul_impossible') . "<br>\n" . _('jours_feries_non_saisis') . "<br>\n" . _('contacter_admin') . "<br>\n"; return 0; } /************************************************************/ // 1 : on fabrique un tableau de jours (divisé chacun en 2 demi-jour) de la date_debut à la date_fin // 2 : on verifie que le conges demandé ne chevauche pas une periode deja posée // 3 : on affecte à 0 ou 1 chaque demi jour, en fonction de s'il est travaillé ou pas // 4 : à la fin , on parcours le tableau en comptant le nb de demi-jour à 1, on multiplie ce total par 0.5, ça donne le nb de jours du conges ! $nb_jours = 0; /************************************************************/ // 1 : fabrication et initialisation du tableau des demi-jours de la date_debut à la date_fin $tab_periode_calcul = make_tab_demi_jours_periode($date_debut, $date_fin, $opt_debut, $opt_fin, $DEBUG); /************************************************************/ // 2 : on verifie que le conges demandé ne chevauche pas une periode deja posée if (verif_periode_chevauche_periode_user($date_debut, $date_fin, $user, $num_current_periode, $tab_periode_calcul, $comment, $DEBUG, $num_update)) { return 0; } /************************************************************/ // 3 : on affecte à 0 ou 1 chaque demi jour, en fonction de s'il est travaillé ou pas // on initialise le tableau global des jours fériés s'il ne l'est pas déjà : if (!isset($_SESSION["tab_j_feries"])) { init_tab_jours_feries(); //print_r($_SESSION["tab_j_feries"]); // verif DEBUG } // on initialise le tableau global des jours fermés s'il ne l'est pas déjà : if (!isset($_SESSION["tab_j_fermeture"])) { init_tab_jours_fermeture($user, $DEBUG); //print_r($_SESSION["tab_j_fermeture"]); // verif DEBUG } $current_day = $date_debut; $date_limite = jour_suivant($date_fin); // on va avancer jour par jour jusqu'à la date limite et voir si chaque jour est travaillé, férié, rtt, etc ... while ($current_day != $date_limite) { // calcul du timestamp du jour courant $pieces = explode("-", $current_day); // date de la forme yyyy-mm-jj $y = $pieces[0]; $m = $pieces[1]; $j = $pieces[2]; $timestamp_du_jour = mktime(0, 0, 0, $m, $j, $y); // on regarde si le jour est travaillé ou pas dans la config de l'appli $j_name = date("D", $timestamp_du_jour); if ($j_name == "Sat" && $_SESSION['config']['samedi_travail'] == FALSE || $j_name == "Sun" && $_SESSION['config']['dimanche_travail'] == FALSE) { // on ne compte ce jour à 0 $tab_periode_calcul[$current_day]['am'] = 0; $tab_periode_calcul[$current_day]['pm'] = 0; } elseif (est_chome($timestamp_du_jour)) { // on ne compte ce jour à 0 $tab_periode_calcul[$current_day]['am'] = 0; $tab_periode_calcul[$current_day]['pm'] = 0; } else { /***************/ // verif des rtt ou temp partiel (dans la table rtt) $val_matin = "N"; $val_aprem = "N"; recup_infos_artt_du_jour($user, $timestamp_du_jour, $val_matin, $val_aprem); if ($val_matin == "Y") { // rtt le matin $tab_periode_calcul[$current_day]['am'] = 0; } if ($val_aprem == "Y") { // rtt l'après midi $tab_periode_calcul[$current_day]['pm'] = 0; } } $current_day = jour_suivant($current_day); } if ($DEBUG) { echo "tab_periode_calcul :<br>\n"; print_r($tab_periode_calcul); echo "<br>\n"; } /************************************************************/ // 3 : on va avancer jour par jour jusqu'à la date limite pour compter le nb de demi jour à 1 $current_day = $date_debut; $date_limite = jour_suivant($date_fin); while ($current_day != $date_limite) { $nb_jours = $nb_jours + $tab_periode_calcul[$current_day]['am'] + $tab_periode_calcul[$current_day]['pm']; $current_day = jour_suivant($current_day); } $nb_jours = $nb_jours * 0.5; return $nb_jours; } else { return 0; } }
/** * Encapsule le comportement du module de jours de fermeture * * @param string $session * * @return void * @access public * @static */ public static function pageJoursFermetureModule($session) { // verif des droits du user à afficher la page verif_droits_user($session, "is_hr"); $return = ''; /*** initialisation des variables ***/ /*************************************/ // recup des parametres reçus : // SERVER $PHP_SELF = $_SERVER['PHP_SELF']; // GET / POST $choix_action = getpost_variable('choix_action'); $year = getpost_variable('year', 0); $groupe_id = getpost_variable('groupe_id'); $id_type_conges = getpost_variable('id_type_conges'); $new_date_debut = getpost_variable('new_date_debut'); // valeur par dédaut = aujourd'hui $new_date_fin = getpost_variable('new_date_fin'); // valeur par dédaut = aujourd'hui $fermeture_id = getpost_variable('fermeture_id', 0); $fermeture_date_debut = getpost_variable('fermeture_date_debut'); $fermeture_date_fin = getpost_variable('fermeture_date_fin'); $code_erreur = getpost_variable('code_erreur', 0); // si les dates de début ou de fin ne sont pas passé par get/post alors date du jour. if ($new_date_debut == "") { if ($year == 0) { $new_date_debut = date("d/m/Y"); } else { $new_date_debut = date("d/m/Y", mktime(0, 0, 0, date("m"), date("d"), $year)); } } if ($new_date_fin == "") { if ($year == 0) { $new_date_fin = date("d/m/Y"); } else { $new_date_fin = date("d/m/Y", mktime(0, 0, 0, date("m"), date("d"), $year)); } } if ($year == 0) { $year = date("Y"); } /*************************************/ /***********************************/ /* VERIF DES DATES RECUES */ $tab_date_debut = explode("/", $new_date_debut); // date au format d/m/Y $timestamp_date_debut = mktime(0, 0, 0, $tab_date_debut[1], $tab_date_debut[0], $tab_date_debut[2]); $date_debut_yyyy_mm_dd = $tab_date_debut[2] . "-" . $tab_date_debut[1] . "-" . $tab_date_debut[0]; $tab_date_fin = explode("/", $new_date_fin); // date au format d/m/Y $timestamp_date_fin = mktime(0, 0, 0, $tab_date_fin[1], $tab_date_fin[0], $tab_date_fin[2]); $date_fin_yyyy_mm_dd = $tab_date_fin[2] . "-" . $tab_date_fin[1] . "-" . $tab_date_fin[0]; $timestamp_today = mktime(0, 0, 0, date("m"), date("d"), date("Y")); /*********************************/ /* COMPOSITION DES ONGLETS... */ /*********************************/ $onglet = getpost_variable('onglet'); if (!$onglet) { $onglet = 'saisie'; } $onglets = array(); $onglets['saisie'] = _('admin_jours_fermeture_titre') . " " . "<span class=\"current-year\">{$year}</span>"; $onglets['calendar'] = 'Calendrier des fermetures' . " " . "<span class=\"current-year\">{$year}</span>"; $onglets['year_nav'] = NULL; //initialisation de l'action par défaut if ($choix_action == "") { $choix_action = "saisie_groupe"; } /*********************************/ /* COMPOSITION DU HEADER... */ /*********************************/ $add_css = '<style>#onglet_menu .onglet{ width: ' . str_replace(',', '.', 100 / count($onglets)) . '% ;}</style>'; /***********************************/ // AFFICHAGE DE LA PAGE header_menu('', 'Libertempo : ' . _('divers_fermeture'), $add_css); include ROOT_PATH . 'fonctions_javascript.php'; /*********************************/ /* AFFICHAGE DES ONGLETS... */ /*********************************/ $return .= '<div id="onglet_menu">'; foreach ($onglets as $key => $title) { if ($key == 'year_nav') { // navigation $prev_link = "{$PHP_SELF}?session={$session}&onglet={$onglet}&year=" . ($year - 1) . "&groupe_id={$groupe_id}"; $next_link = "{$PHP_SELF}?session={$session}&onglet={$onglet}&year=" . ($year + 1) . "&groupe_id={$groupe_id}"; $return .= '<div class="onglet calendar-nav">'; $return .= '<ul>'; $return .= '<li><a href="' . $prev_link . '" class="calendar-prev"><i class="fa fa-chevron-left"></i><span>année précédente</span></a></li>'; $return .= '<li class="current-year">' . $year . '</li>'; $return .= '<li><a href="' . $next_link . '" class="calendar-next"><i class="fa fa-chevron-right"></i><span>année suivante</span></a></li>'; $return .= '</ul>'; $return .= '</div>'; } else { $return .= '<div class="onglet ' . ($onglet == $key ? ' active' : '') . '" ><a href="' . $PHP_SELF . '?session=' . $session . '&year=' . $year . '&onglet=' . $key . '">' . $title . '</a></div>'; } } $return .= '</div>'; // vérifie si les jours fériés sont saisie pour l'année en cours if (verif_jours_feries_saisis($date_debut_yyyy_mm_dd) == FALSE && verif_jours_feries_saisis($date_fin_yyyy_mm_dd) == FALSE) { $code_erreur = 1; // code erreur : jour feriés non saisis $onglet = "calendar"; } //initialisation de l'action demandée : saisie_dates, commit_new_fermeture pour enregistrer une fermeture, annul_fermeture pour confirmer une annulation, commit_annul_fermeture pour annuler une fermeture //en cas de confirmation d'une fermeture : if ($choix_action == "commit_new_fermeture") { // on verifie que $new_date_debut est anterieure a $new_date_fin if ($timestamp_date_debut > $timestamp_date_fin) { $code_erreur = 2; // code erreur : $new_date_debut est posterieure a $new_date_fin $choix_action = "saisie_dates"; } elseif ($timestamp_date_debut < $timestamp_today) { $code_erreur = 3; // code erreur : saisie de date passée $choix_action = "saisie_dates"; } elseif ($timestamp_date_debut == $timestamp_today || $timestamp_date_fin == $timestamp_today) { $code_erreur = 4; // code erreur : saisie de aujourd'hui $choix_action = "saisie_dates"; } else { // fabrication et initialisation du tableau des demi-jours de la date_debut à la date_fin $tab_periode_calcul = make_tab_demi_jours_periode($date_debut_yyyy_mm_dd, $date_fin_yyyy_mm_dd, "am", "pm"); // on verifie si la periode saisie ne chevauche pas une periode existante if (\hr\Fonctions::verif_periode_chevauche_periode_groupe($date_debut_yyyy_mm_dd, $date_fin_yyyy_mm_dd, '', $tab_periode_calcul, $groupe_id)) { $code_erreur = 5; // code erreur : fermeture chevauche une periode deja saisie $choix_action = "saisie_dates"; } } } if ($onglet == 'calendar') { // les jours fériés de l'annee de la periode saisie ne sont pas enregistrés if ($code_erreur == 1) { $return .= '<div class="alert alert-danger">' . _('admin_jours_fermeture_annee_non_saisie') . '</div>'; } /************************************************/ // CALENDRIER DES FERMETURES $return .= \hr\Fonctions::affiche_calendrier_fermeture($year); } elseif ($choix_action == "saisie_dates") { if ($groupe_id == "") { // choix du groupe n'a pas été fait ($_SESSION['config']['fermeture_par_groupe']==FALSE) $groupe_id = 0; } // $new_date_debut est anterieure a $new_date_fin if ($code_erreur == 2) { $return .= '<div class="alert alert-danger">' . _('admin_jours_fermeture_dates_incompatibles') . '</div>'; } // ce ne sont des dates passées if ($code_erreur == 3) { $return .= '<div class="alert alert-danger">' . _('admin_jours_fermeture_date_passee_error') . '</div>'; } // fermeture le jour même impossible if ($code_erreur == 4) { $return .= '<div class="alert alert-danger">' . _('admin_jours_fermeture_fermeture_aujourd_hui') . '</div>'; } // la periode saisie chevauche une periode existante if ($code_erreur == 5) { $return .= '<div class="alert alert-danger">' . _('admin_jours_fermeture_chevauche_periode') . '</div>'; } $return .= '<div class="wrapper">'; $return .= '<a href="' . ROOT_PATH . 'hr/hr_index.php?session=' . $session . '" class="admin-back"><i class="fa fa-arrow-circle-o-left"></i>Retour mode rh</a>'; if ($onglet == 'saisie') { $return .= \hr\Fonctions::saisie_dates_fermeture($year, $groupe_id, $new_date_debut, $new_date_fin, $code_erreur); } } elseif ($choix_action == "saisie_groupe") { $return .= '<div class="wrapper">'; $return .= '<a href="' . ROOT_PATH . 'hr/hr_index.php?session=' . $session . '" class="admin-back"><i class="fa fa-arrow-circle-o-left"></i>Retour mode rh</a>'; $return .= \hr\Fonctions::saisie_groupe_fermeture(); $return .= '</div>'; } elseif ($choix_action == "commit_new_fermeture") { $return .= $title; $return .= \hr\Fonctions::commit_new_fermeture($new_date_debut, $new_date_fin, $groupe_id, $id_type_conges); } elseif ($choix_action == "annul_fermeture") { $return .= $title; $return .= \hr\Fonctions::confirm_annul_fermeture($fermeture_id, $groupe_id, $fermeture_date_debut, $fermeture_date_fin); } elseif ($choix_action == "commit_annul_fermeture") { $return .= $title; $return .= \hr\Fonctions::commit_annul_fermeture($fermeture_id, $groupe_id); } return $return; }