<?php
/****************************************************************************************
 * SMI (Services Maintenance Interventions) est une gestion libre de maintenance et de SAV
 *
 * Version 1.0.2
 *
 * Copyright (C) 2006-2015  Sylvain FATOME
 * This program is free software; you can redistribute it and/or modify it under the terms
 * of the GNU General Public License as published by the Free Software Foundation;
 * either version 2 of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along with this program
 * (in the directory docs);
 * if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA  02110-1301, USA.
 *
 * Contact : galawa@free.fr
 *
 * Web : http://smi.no-ip.org
 ****************************************************************************************/


// Vérification des tentatives de hack
$pos = strpos($_SERVER['PHP_SELF'], "inc.php");
if ($pos === FALSE)
    $ok_inc = TRUE;
else
    $ok_inc = FALSE;
if ($ok_inc == FALSE) header("Location: ../index.php");

/************************************************************************/
/* Fonctions pour les accès aux fichiers des pénalités de location      */
/************************************************************************/

/**
 * Vérification du nombre de pénalités
 *
 * @param bool $open
 * @return null
 */
function nb_pen($open = TRUE)
{
    global
    $db;

    if ($open == TRUE)
        $db = open_database(DBUSER, DBPASS, DBNAME, DBHOST);
    $rexist = "SELECT COUNT(*) FROM `" . TBPEN . "`";
    $nbexist = $db->get_var($rexist);
    if ($open == TRUE)
        $db->disconnect();

    return $nbexist;
}

/**
 * Lecture d'un enregistrement pénalité
 *
 * @param $code
 * @param bool $open
 * @return array|null
 */
function lit_enr_pen($code, $open = TRUE)
{
    global
    $db;

    if ($open == TRUE)
        $db = open_database(DBUSER, DBPASS, DBNAME, DBHOST);
    $rech2 = "SELECT * FROM `" . TBPEN . "` WHERE pen_code = '" . $db->escape($code) . "'";
    $row2 = $db->get_row($rech2, ARRAY_A);
    if ($open == TRUE)
        $db->disconnect();

    return $row2;
}

/**
 * Vérifie si une pénalité est modifiable
 * Non, si déjà utilisée dans une fiche produit location
 *
 * @param $code
 * @param bool $open
 * @return bool
 */
function pen_modifiable($code, $open = TRUE)
{
    global
    $db;
    $used = FALSE;

    if ($open == TRUE)
        $db = open_database(DBUSER, DBPASS, DBNAME, DBHOST);

    // Dans une fiche produit location
    $rech2 = "SELECT COUNT(*) FROM `" . TBPDTLPL . "` WHERE pdtlpl_codepen = '" . $db->escape($code) . "'";
    $nbres = $db->get_var($rech2);
    if ($nbres > 0)
        $used = TRUE;
    if ($open == TRUE)
        $db->disconnect();


    return !$used;
}


/**
 * Vérifie si une pénalité est désactivable
 * Non, si déjà utilisée dans une fiche produit d'une location non close
 *
 * @param $code
 * @param bool $open
 * @return bool
 */
function pen_desactivable($code, $open = TRUE)
{
    global
    $db;
    $used = FALSE;

    if ($open == TRUE)
        $db = open_database(DBUSER, DBPASS, DBNAME, DBHOST);

    // Dans une fiche produit d'une location non close
    $rech2 = "SELECT * FROM `" . TBCOLOC . "`, `" . TBPDTL . "` WHERE " . TBCOLOC . ".coloc_code = " . TBPDTL . ".pdtl_codecoloc";
    $rech2 .= " AND " . TBCOLOC . ".coloc_datefin = '0000-00-00'";
    $rows2 = $db->get_results($rech2, ARRAY_A);
    if ($rows2) {
        foreach ($rows2 as $row2) {
            extract($row2);
            $rech3 = "SELECT COUNT(*= FROM `" . TBPDTLPL . "` WHERE pdtlpl_codepen = '" . $db->escape($code) . "' AND pdtlpl_idpdtl = '$pdtl_id'";
            $nbres3 = $db->get_var($rech3);
            if ($nbres3 > 0) {
                $used = TRUE;
                break;
            }
        }
    }

    if ($open == TRUE)
        $db->disconnect();

    return !$used;
}

/**
 * Donne le nombre de barèmes pénalités dans une pénalité donnée
 *
 * @param $code
 * @param bool $open
 * @return null
 */
function nb_penbar_in_pen($code, $open = TRUE)
{
    global
    $db;

    if ($open == TRUE)
        $db = open_database(DBUSER, DBPASS, DBNAME, DBHOST);
    $rech2 = "SELECT COUNT(*) FROM `" . TBPENBAR . "` WHERE `penbar_codepen` = '" . $db->escape($code) . "'";
    $nbpenbar = $db->get_var($rech2);
    if ($open == TRUE)
        $db->disconnect();

    return $nbpenbar;
}


/**
 * Retourne le prochain minimum à appliquer sur un barème pénalités
 *
 * @param $code
 * @param bool $open
 * @return int
 */
function next_min_penbar($code, $open = TRUE)
{
    global
    $db;
    $nextmin = 1;
    $maximum = 0;

    if ($open == TRUE)
        $db = open_database(DBUSER, DBPASS, DBNAME, DBHOST);

    $rech2 = "SELECT MAX(" . TBPENBAR . ".penbar_max) AS maximum FROM `" . TBPENBAR . "`";
    $rech2 .= " WHERE " . TBPENBAR . ".penbar_codepen = '" . $db->escape($code) . "'";
    $row2 = $db->get_row($rech2, ARRAY_A);
    if ($row2) {
        extract($row2);
        if ($maximum <> NULL)
            $nextmin = $maximum + 1;
    }
    if ($open == TRUE)
        $db->disconnect();

    return $nextmin;
}

/**
 * Vérifie si une pénalité sur location possède un maximum "infini"
 *
 * @param $code
 * @param bool $open
 * @return bool
 */
function exist_infini_penbar_code($code, $open = TRUE)
{
    global
    $db;
    $exist = FALSE;

    if ($open == TRUE)
        $db = open_database(DBUSER, DBPASS, DBNAME, DBHOST);
    $rech2 = "SELECT COUNT(penbar_id) FROM `" . TBPENBAR . "` WHERE `penbar_max` = '0' AND `penbar_codepen` = '" . $db->escape($code) . "'";
    $nbres2 = $db->get_var($rech2);
    if ($nbres2 > 0)
        $exist = TRUE;
    if ($open == TRUE)
        $db->disconnect();

    return $exist;
}

/**
 * Vérification de la présence d'un barème pénalité location dans une fiche location
 *
 * @param $code
 * @param bool $open
 * @return bool
 */
function exist_pen_in_coloc($code, $open = TRUE)
{
    global
    $db;
    $exist = FALSE;

    if ($open == TRUE)
        $db = open_database(DBUSER, DBPASS, DBNAME, DBHOST);

    $rech2 = "SELECT " . TBPDTL . ".pdtl_codecoloc FROM `" . TBPDTL . "`, `" . TBPDTLPL . "`";
    $rech2 .= " WHERE " . TBPDTLPL . ".pdtlpl_codepen = '" . $db->escape($code) . "'";
    $rech2 .= " AND " . TBPDTLPL . ".pdtlpl_idpdtl = " . TBPDTL . ".pdtl_id";
    $rows2 = $db->get_results($rech2, ARRAY_A);
    if ($rows2) {
        foreach ($rows2 as $row2) {
            extract($row2);
            $rech3 = "SELECT " . TBCOLOC . ".coloc_code FROM `" . TBCOLOC . "`";
            $rech3 .= " WHERE " . TBCOLOC . ".coloc_code = '" . $pdtl_codecoloc . "'";
            $rows3 = $db->get_results($rech3, ARRAY_A);
            if (count($rows3) > 0) {
                $exist = TRUE;
                break;
            }
        }
    }
    if ($open == TRUE)
        $db->disconnect();

    return $exist;
}

/**
 * Vérification de la présence d'un barème pénalité location dans une fiche location non close
 *
 * @param $code
 * @param bool $open
 * @return bool
 */
function exist_pen_in_coloc_ouv($code, $open = TRUE)
{
    global
    $db;
    $exist = FALSE;

    if ($open == TRUE)
        $db = open_database(DBUSER, DBPASS, DBNAME, DBHOST);

    $rech2 = "SELECT " . TBPDTL . ".pdtl_codecoloc FROM `" . TBPDTL . "`, `" . TBPDTLPL . "`";
    $rech2 .= " WHERE " . TBPDTLPL . ".pdtlpl_codepen = '" . $db->escape($code) . "'";
    $rech2 .= " AND " . TBPDTLPL . ".pdtlpl_idpdtl = " . TBPDTL . ".pdtl_id";
    $rows2 = $db->get_results($rech2, ARRAY_A);
    if ($rows2) {
        foreach ($rows2 as $row2) {
            extract($row2);
            $rech3 = "SELECT " . TBCOLOC . ".coloc_code FROM `" . TBCOLOC . "`";
            $rech3 .= " WHERE " . TBCOLOC . ".coloc_code = '" . $pdtl_codecoloc . "'";
            $rech3 .= " AND " . TBCOLOC . ".coloc_datefin = '0000-00-00'";
            $rows3 = $db->get_results($rech3, ARRAY_A);
            if (count($rows3) > 0) {
                $exist = TRUE;
                break;
            }
        }
    }
    if ($open == TRUE)
        $db->disconnect();

    return $exist;
}

/**
 * Création du code Javascript pour affichage de la grille des barèmes dans une fiche pénalité
 *
 * @param $id_html
 * @param $td
 * @param $code
 * @param $pour
 * @param $from
 * @param bool $open
 */
function cre_html_penbar($id_html, $td, $code, $pour, $from, $open = TRUE)
{
    global
    $db,
    $_SESSION;

    // Création de la chaine HTML
    $str_html = '';

    $nb_penbar = nb_penbar_in_pen($code);
    $infini = exist_infini_penbar_code($code, TRUE);


    if ($nb_penbar > 0) {
        if ($open == TRUE)
            $db = open_database(DBUSER, DBPASS, DBNAME, DBHOST);

        $str_html = "<table class=\"Ltable\" border=\"0\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\">";

        // Création entête
        $str_html .= "<th>";
        $str_html .= _("Depuis retard de");
        $str_html .= "</th>";

        $str_html .= "<th>";
        $str_html .= _("A retard de");
        $str_html .= "</th>";

        $str_html .= "<th>";
        $str_html .= _("Pénalité");
        $str_html .= "</th>";

        if ($td == "edit") {
            $str_html .= "<th>";
            $str_html .= _("Cliquer");
            $str_html .= "</th>";
        }

        // Récupération données du barème pénalité
        $rech2 = "SELECT * FROM `" . TBPEN . "` WHERE pen_code='" . $db->escape($code) . "'";
        $row2 = $db->get_row($rech2, ARRAY_A);
        if ($row2)
            extract($row2);
        // Lignes du tableau
        $rech = "SELECT * FROM `" . TBPENBAR . "` WHERE penbar_codepen='" . $db->escape($code) . "' ORDER BY `penbar_min`";
        $rows = $db->get_results($rech, ARRAY_A);

        $i = 0;
        if ($rows) {
            foreach ($rows as $row) {
                extract($row);

                // Couleurs alternées
                if ($i % 2 == 0)
                    $str_html .= "<tr onmouseover=\"this.className='TRsel'\" onmouseout=\"this.className='TRalter1'\" class=\"TRalter1\">";
                else
                    $str_html .= "<tr onmouseover=\"this.className='TRsel'\" onmouseout=\"this.className='TRalter2'\" class=\"TRalter2\">";

                // Depuis
                $str_html .= "<td class=\"tdlst\" valign=\"top\">";
                $str_html .= $penbar_min . " " . $lng_tduree[$pen_udec];
                $str_html .= "</td>";

                // Jusqu'à
                $txt = $penbar_max . " " . $lng_tduree[$pen_udec];
                if (intval($penbar_max) == 0)
                    $txt = "infini";
                $str_html .= "<td class=\"tdlst\" valign=\"top\">";
                $str_html .= $txt;
                $str_html .= "</td>";

                // Valeur
                if ($pour == FALSE)
                    $txt = full_num_format($penbar_valeur, '', '', TRUE,'',FALSE);
                else {
                    $txt = full_num_format($penbar_valeur, '', '', FALSE,'',FALSE);
                    $txt .= "%";
                }
                $str_html .= "<td class=\"TDNumberD\" valign=\"top\" align=\"right\">";
                $str_html .= $txt;
                $str_html .= "</td>";

                if ($td == "edit") {
                    $str_html .= "<td class=\"tdlst\" valign=\"top\" align=\"center\">";
                    if ($nb_penbar == ($i + 1)) {
                        $str_html .= "<a href=\"javascript:;\" onclick=\"fen_penbar_pen('edit','" . $code . "'," . $penbar_id . ")\")>";
                        $str_html .= "<img src=\"../img/edit.png\" border=\"0\" align=\"absmiddle\" title=\""._("Edition")."\"></a>";
                        $str_html .= " ";
                        $str_html .= "<a href=\"javascript:;\" onclick=\"fen_penbar_pen('del','" . $code . "'," . $penbar_id . ")\")>";
                        $str_html .= "<img src=\"../img/del.png\" border=\"0\" align=\"absmiddle\" title=\""._("Suppression")."\"></a>";
                    } else
                        $str_html .= " ";
                    $str_html .= "</td>";
                }

                $str_html .= "</tr>";
                $i++;
            }
        }
        if ($open == TRUE)
            $db->disconnect();

        // Fermeture de la table
        $str_html .= "</table>";

        echo 'function tbpenbar() {';
        echo 'if ((' . $from . '$("#' . $id_html . '").length) > 0) {';
        echo $from . "$('#" . $id_html . "').html('" . str_replace("'", "\'", $str_html) . "');";
        echo '}';
        // Mises à jour boutons & liens
        echo $from . "$('#nextmin').val('".next_min_penbar($code, TRUE)."');";
        if ($infini == TRUE)
            echo $from . "$('#addbp').hide();";
        else
            echo $from . "$('#addbp').show();";
        echo $from . "$('#pour').attr('disabled',true);";
        echo "}";
    } else {
        echo 'function tbpenbar() {';
        echo 'if ((' . $from . '$("#' . $id_html . '").length) > 0) {';
        echo $from . "$('#" . $id_html . "').html('" . str_replace("'", "\'", $str_html) . "');";
        echo '}';
        // Mises à jour boutons & liens
        echo $from . "$('#nextmin').val('".next_min_penbar($code, TRUE)."');";
        echo $from . "$('#addbp').show();";
        echo $from . "$('#pour').attr('disabled',false);";
        echo "}";
    }
}

/**
 * Vérifie si une grille pénalité possède un maximum "infini", pour un code pénalité donné
 *
 * @param $codepen
 * @param bool $open
 * @return bool
 */
function exist_infini_penbar($codepen, $open = TRUE)
{
    global
    $db;
    $exist = FALSE;

    if ($open == TRUE)
        $db = open_database(DBUSER, DBPASS, DBNAME, DBHOST);
    $rech2 = "SELECT COUNT(penbar_id) FROM `" . TBPENBAR . "` WHERE `penbar_max` = '0' AND `penbar_codepen` = '" . $db->escape($codepen) . "'";
    $nbres2 = $db->get_var($rech2);
    if ($nbres2 > 0)
        $exist = TRUE;
    if ($open == TRUE)
        $db->disconnect();

    return $exist;
}

/**
 * Lecture d'un enregistrement pénalité, par son id
 *
 * @param $id
 * @param bool $open
 * @return array|null
 */
function lit_enr_penbar_id($id, $open = TRUE)
{
    global
    $db;

    if ($open == TRUE)
        $db = open_database(DBUSER, DBPASS, DBNAME, DBHOST);
    $rech2 = "SELECT * FROM `" . TBPENBAR . "` WHERE `penbar_id` = '$id'";
    $row2 = $db->get_row($rech2);
    if ($open == TRUE)
        $db->disconnect();

    return $row2;
}

/**
 * Donne le dernier id d'une grille pénalité dans une pénalité donnée
 *
 * @param $codepen
 * @param bool $open
 * @return int
 */
function last_id_penbar_in_pen($codepen, $open = TRUE)
{
    global
    $db;
    $idpb = 0;

    if ($open == TRUE)
        $db = open_database(DBUSER, DBPASS, DBNAME, DBHOST);
    $rech2 = "SELECT penbar_id FROM `" . TBPENBAR . "` WHERE `penbar_codepen` = '" . $db->escape($codepen) . "' ORDER BY `penbar_min` DESC";
    $row2 = $db->get_row($rech2, ARRAY_A);
    if ($row2) {
        extract($row2);
        $idpb = $penbar_id;
    }
    if ($open == TRUE)
        $db->disconnect();

    return $idpb;
}

/**
 * Calcule la pénalité HT en fonction du code pénalité
 * le total ht, le code tva de la location
 *
 * @param $codepen
 * @param $totht
 * @param $diffsec
 * @param bool $open
 * @return float|int
 */
function calcul_penalite($codepen, $totht, $diffsec, $open = TRUE)
{
    global
    $db;
    $penalite = 0;

    if ($open == TRUE)
        $db = open_database(DBUSER, DBPASS, DBNAME, DBHOST);

    // Récupération enregistrement pénalité location
    if (trim($codepen) <> "") {
        $rech2 = "SELECT * FROM `" . TBPEN . "` WHERE pen_code='" . $db->escape($codepen) . "'";
        $row2 = $db->get_row($rech2, ARRAY_A);
        if ($row2)
            extract($row2);
        // C'est une valeur unique
        if ($pen_tbar == 0) {
            // C'est un pourcentage
            if ($pen_pour == 1) {
                $penalite = ($pen_valeur * $totht) / 100;
                $penalite = round(($penalite) * 100) / 100;
            } else // C'est une valeur
            {
                $penalite = $pen_valeur;
                // C'est proportionnel ?
                if ($pen_prop == 1)
                    $penalite = $pen_valeur * ceil($diffsec / $pen_udec);
            }
        } else // C'est une grille de valeur
        {
            // On calcule le nombre d'unités dépassées
            $nbudep = intval(ceil($diffsec / $pen_udec));

            // On recherche dans le barème des pénalités
            $penbar_valeur = 0;
            // ... Il y a une fourchette de valeurs ?
            $rech4 = "SELECT COUNT(*) FROM `" . TBPENBAR . "` WHERE penbar_min<=" . $nbudep . " AND penbar_max<=" . $nbudep;
            $nbres4 = $db->get_var($rech4);
            if ($nbres4 == 1) {
                $rech4 = "SELECT * FROM `" . TBPENBAR . "` WHERE penbar_min<=" . $nbudep . " AND penbar_max<=" . $nbudep;
                $row4 = $db->get_row($rech4, ARRAY_A);
                extract($row4);
                // C'est un pourcentage
                if ($pen_pour == 1) {
                    $penalite = ($penbar_valeur * $totht) / 100;
                    $penalite = round(($penalite) * 100) / 100;
                } else // C'est une valeur
                    $penalite = $penbar_valeur;
            } else // ... Il y a une fourchette "nb unités dépassées - infini" ?
            {
                $rech4 = "SELECT * FROM `" . TBPENBAR . "` WHERE penbar_min<=" . $nbudep . " AND penbar_max=0";
                $row4 = $db->get_row($rech4, ARRAY_A);
                if ($row4) {
                    extract($row4);
                    // C'est un pourcentage
                    if ($pen_pour == 1) {
                        $penalite = ($penbar_valeur * $totht) / 100;
                        $penalite = round(($penalite) * 100) / 100;
                    } else // C'est une valeur
                        $penalite = $penbar_valeur;
                }
            }
        }
    }
    if ($open == TRUE)
        $db->disconnect();

    return $penalite;
}
