<?php

/**
 * Classe dédiée au calcul et à l'affichage de la gestion budgétaire pour le client Galderma (N°55)
 *
 */
class BudgetGalderma
{

    /**
     * Attributs
     */
    
    /**
     * Constructeur
     */
    
    /**
     * Méthodes GET et SET
     */
    
    /**
     * Autres méthodes
     */
    
    /**
     * Fonction permettant de construire un tableau de données xml permettant d'afficher la consommation budgétaire Galderma.
     *
     * @param int $no_da
     *            : Numéro de la DA sur laquelle la consommation budgétaire est appelée.
     */
    function &buildConsoBudget($no_da, $id_user = null, $id_panier = null)
    {
        global $connecteur;
        
        $array_budget_xml = array();
        
        $resSfam = null;
        $liste_couple_SI_CDC_base = null;
        // Si on a passer un numero de document
        if (is_int($no_da)) {
            $info_entete = SqlDa::getInfoOnEnteteDA($no_da)->Trouve1();
            
            $societe = $info_entete['CODE_STE'];
            $devise = $info_entete['DEVISE'];
            $devise_soc = Param::GetDeviseApplication();
            
            $liste_couple_SI_CDC_base = $connecteur->AllFind(SqlConsoBudgetGalderma::rqGetBlocsBudgetDA($no_da), DB_OXASQLDB);
            
            if (is_null($liste_couple_SI_CDC_base))
                $liste_couple_SI_CDC_base = array();
            //
            $anneeReference = mb_substr($info_entete['DTE_EMISS'], 0, 4);
        }        // Sinon on est au niveau du panier
        else {
            $info_entete = SqlPanier::rqGetPanier($id_panier, $id_user)->Trouve1();
            
            $societe = $info_entete['CODE_STE'];
            $devise = $info_entete['COD_DEV'];
            $devise_soc = Param::GetDeviseApplication();
            
            $liste_couple_SI_CDC_base = $connecteur->AllFind(SqlConsoBudgetGalderma::rqGetBlocBudgetPanierSFamDateLiv($id_user, $id_panier), DB_OXASQLDB);
            // ON determine la liste des sous fammilles utilisé pour ensuite faire une seule requete et obtenir la notion d'invest
            $anneeReference = Date("Y");
        }
        $array_ssfam = null;
        if (is_array($liste_couple_SI_CDC_base))
            foreach ($liste_couple_SI_CDC_base as &$info)
                if (! is_array($array_ssfam) || ! array_key_exists($info['COD_SFAM'], $array_ssfam))
                    $array_ssfam[$info['COD_SFAM']] = true;
        
        if (is_array($array_ssfam)) {
            $element = '';
            foreach ($array_ssfam as $index => & $sup)
                $element .= ($element == '' ? '' : ',') . "'{$index}'";
            
            $sql = 'SELECT CODE_SFA,INVEST FROM SSFAMILL WHERE CODE_SFA IN (' . $element . ')';
            $resSfam = $connecteur->AllFind($sql, DB_OXASQLDB);
        }
        
        // On initialise le numéro de lot actif utilisé dans la consommation budget Galderma
        $num_lot = Param::getNumLotActifGalderma();
        
        if ($num_lot == null)
            $num_lot = 1;
        
        // On récupère les informations liées au lot en question : Date et Heure de mise à jour
        $info_num_lot = Param::getInfoNumLotBudgetGalderma($num_lot);
        
        // On initialise la période qui est l'année en cours
        
        $listePeriode = null;
        $resultFam = null;
        
        if (is_array($resSfam))
            foreach ($resSfam as $index => & $invest)
                $resultFam[$invest['CODE_SFA']] = (BoolSql($invest['INVEST']) ? 'O' : 'N');
        
        if (is_array($resSfam))
            foreach ($liste_couple_SI_CDC_base as &$info)
                if (array_key_exists($info['COD_SFAM'], $resultFam) && $resultFam[$info['COD_SFAM']] == 'O') // Sur investissement alors
                    $anneeRef = $anneeReference;
                else // Sur l'année de la date de livraison
                    $anneeRef = mb_substr($info['DATELIVR'], 0, 4);
        
        $liste_couple_SI_CDC = null;
        foreach ($liste_couple_SI_CDC_base as & $ret) {
            $info = array(
                'SI_CODE' => $ret['SI_CODE'],
                'CDC_CODE' => $ret['CDC_CODE']
            );
            if (! is_array($liste_couple_SI_CDC) || ! in_array($info, $liste_couple_SI_CDC))
                $liste_couple_SI_CDC[] = $info;
        }
        
        // Si au moins un couple a été récupéré
        if (is_array($liste_couple_SI_CDC)) {
            foreach ($resultFam as $index => & $info)
                $array_budget_xml['SSFAM'][] = array(
                    '!value' => $index,
                    '!texte' => $info
                );
            
            $array_budget_xml['INFO_GEN']['NUM_LOT'] = $num_lot;
            $array_budget_xml['INFO_GEN']['DATE_NUM_LOT'] = $info_num_lot['DATE'];
            $array_budget_xml['INFO_GEN']['HEURE_NUM_LOT'] = $info_num_lot['HEURE'];
            
            // Pour chacun des couples on construit un bloc principal composé de Nature Description + Global Information + Details
            /*
             * foreach ($listePeriode as $index=> $periode){
             * $array_budget_xml['PERIODE'][$index]['VALEUR'] = $periode;
             *
             * $pointeur = & $array_budget_xml['PERIODE'][$index];
             * foreach ($liste_couple_SI_CDC as $indice_bloc_principal => $couple_SI_CDC){
             */
            
            foreach ($liste_couple_SI_CDC as $indice_bloc_principal => & $couple_SI_CDC) {
                
                // spec 3037 -- iv) Présentation multi-annuelle -- calcul des années budgétaires
                $listePeriode = $connecteur->AllFind(SqlConsoBudgetGalderma::rqGetListeAnneeBudget($couple_SI_CDC['SI_CODE'], $couple_SI_CDC['CDC_CODE'], $societe, $anneeRef), DB_OXASQLDB);
                
                foreach ($listePeriode as $index => & $periodeANNEE) {
                    
                    $periode = $periodeANNEE['ANNEE'];
                    
                    $array_budget_xml['PERIODE'][$indice_bloc_principal][$index]['VALEUR'] = $periode;
                    
                    $pointeur = & $array_budget_xml['PERIODE'][$indice_bloc_principal][$index];
                    
                    $pointeur['BLOC_PRINCIPAL'][$indice_bloc_principal]['SI_CODE'] = $couple_SI_CDC['SI_CODE'];
                    $pointeur['BLOC_PRINCIPAL'][$indice_bloc_principal]['SI_LIBELLE'] = Imputation::getLibelleImput("SI", $societe, $couple_SI_CDC['SI_CODE']);
                    $pointeur['BLOC_PRINCIPAL'][$indice_bloc_principal]['DEVISE'] = $devise_soc;
                    
                    // On construit le premier sous-bloc : Nature dessciption
                    $pointeur['BLOC_PRINCIPAL'][$indice_bloc_principal]['BLOC_NATURE']['NATURE'] = $this->buildBlocNatureDescription($no_da, $id_user, $id_panier, $couple_SI_CDC['SI_CODE'], $couple_SI_CDC['CDC_CODE'], $societe, $num_lot, $anneeReference == $periode, $periode);
                    $pointeur['BLOC_PRINCIPAL'][$indice_bloc_principal]['BLOC_NATURE']['DEVISE'] = $devise;
                    
                    // On construit le deuxième sous-bloc : Global information
                    $pointeur['BLOC_PRINCIPAL'][$indice_bloc_principal]['BLOC_GLOBAL']['GLOBAL'] = $this->buildBlocGlobalInformation($no_da, $id_user, $id_panier, $couple_SI_CDC['SI_CODE'], $couple_SI_CDC['CDC_CODE'], $societe, $num_lot, $anneeReference == $periode, $periode);
                    
                    if (is_int($no_da))
                        $nb_ligne_product_or_project = $connecteur->CanFind(SqlConsoBudgetGalderma::rqIsProductOrProjectOnDA($no_da, $couple_SI_CDC['SI_CODE'], $couple_SI_CDC['CDC_CODE']), DB_OXASQLDB);
                    else
                        $nb_ligne_product_or_project = $connecteur->CanFind(SqlConsoBudgetGalderma::rqIsProductOrProjectOnPanier($id_panier, $id_user, $couple_SI_CDC['SI_CODE'], $couple_SI_CDC['CDC_CODE']), DB_OXASQLDB);
                    
                    $pointeur['BLOC_PRINCIPAL'][$indice_bloc_principal]['BLOC_DETAIL']['IS_VISIBLE'] = 1;
                    $pointeur['BLOC_PRINCIPAL'][$indice_bloc_principal]['BLOC_DETAIL']['DETAIL'] = $this->buildBlocDetails($no_da, $id_user, $id_panier, $couple_SI_CDC['SI_CODE'], $couple_SI_CDC['CDC_CODE'], $societe, $num_lot, $anneeReference == $periode, $periode);
                }
            }
        }
        
        return $array_budget_xml;
    }

    /**
     *
     * Fonction permettant de construire le tableau de donnée XML nécessaire à l'affichage du sous-bloc NATURE
     *
     * @param
     *            $no_da
     * @param
     *            $id_user
     * @param
     *            $id_panier
     * @param
     *            $si
     * @param
     *            $cdc
     * @param
     *            $societe
     * @param
     *            $num_lot
     * @param
     *            $flg_entete
     * @param
     *            $periode
     */
    function &buildBlocNatureDescription($no_da, $id_user, $id_panier, $si, $cdc, $societe, $num_lot, $flg_entete, $periode)
    {
        global $connecteur;
        
        // Tableau de lignes composant le bloc nature description
        $array_lignes_nature = array();
        
        // On liste les lignes composant le bloc nature description avec un calcul du montant. Les lignes sont filtrées sur le SI et le CDC et sont regroupées par SI, CDC, CTA, SFAM, Product(CS) et Project(CS).
        if (is_int($no_da))
            $liste_lignes_nature = $connecteur->AllFind(SqlConsoBudgetGalderma::rqSelectMontantDAForNatureDescription($no_da, $si, $cdc, $flg_entete, $periode), DB_OXASQLDB);
        else
            $liste_lignes_nature = $connecteur->AllFind(SqlConsoBudgetGalderma::rqSelectMontantPanierForNatureDescription($id_user, $id_panier, $si, $cdc, $flg_entete, $periode), DB_OXASQLDB);
        
        if (is_array($liste_lignes_nature)) {
            $indice_ligne_nature = 0;
            
            // Pour chaque groupe de ligne retourné, on complète les informations avec le calcul du budget et du budget consommé
            foreach ($liste_lignes_nature as & $ligne_nature) {
                $array_lignes_nature[$indice_ligne_nature]['MONTANT'] = FormatageData::formatMontant($ligne_nature['MONTANT'], 2, " ");
                $array_lignes_nature[$indice_ligne_nature]['SFAM_CODE'] = $ligne_nature['SFAM_CODE'];
                $array_lignes_nature[$indice_ligne_nature]['CTA_CODE'] = $ligne_nature['CTA_CODE'];
                $array_lignes_nature[$indice_ligne_nature]['CODE_PRODUCT'] = $ligne_nature['CODE_PRODUCT'];
                $array_lignes_nature[$indice_ligne_nature]['CODE_PROJECT'] = $ligne_nature['CODE_PROJECT'];
                $array_lignes_nature[$indice_ligne_nature]['SI_CODE'] = $ligne_nature['SI_CODE'];
                $array_lignes_nature[$indice_ligne_nature]['CDC_CODE'] = $ligne_nature['CDC_CODE'];
                
                $arrayCS = [];
                $CS_product = new CS($arrayCS, 'DA_LIGNE', Param::getNumCSProductGalderma());
                $array_lignes_nature[$indice_ligne_nature]['PRODUCT_LIB'] = $CS_product->getLibelleCS($societe, $ligne_nature['CODE_PRODUCT']);
                
                $arrayCS = [];
                $CS_project = new CS($arrayCS, 'DA_LIGNE', Param::getNumCSProjectGalderma());
                $array_lignes_nature[$indice_ligne_nature]['PROJECT_LIB'] = $CS_project->getLibelleCS($societe, $ligne_nature['CODE_PROJECT']);
                
                $array_lignes_nature[$indice_ligne_nature]['LIB_SFAM'] = Traduction::tradSousFamille($ligne_nature['SFAM_CODE'], $_SESSION['Session_Langue']);
                $array_lignes_nature[$indice_ligne_nature]['CTA_LIB'] = Imputation::getLibelleImput('CTA', $societe, $ligne_nature['CTA_CODE']);
                $array_lignes_nature[$indice_ligne_nature]['SI_LIB'] = Imputation::getLibelleImput('SI', $societe, $ligne_nature['SI_CODE']);
                $array_lignes_nature[$indice_ligne_nature]['CDC_LIB'] = Imputation::getLibelleImput('CDC', $societe, $ligne_nature['CDC_CODE']);
                
                // On calcule le budget consommé
                $budget_consomme = $connecteur->CanFind(SqlConsoBudgetGalderma::rqSelectConsommeForNatureDescription($si, $cdc, $ligne_nature['CTA_CODE'], $ligne_nature['SFAM_CODE'], $ligne_nature['CODE_PRODUCT'], $ligne_nature['CODE_PROJECT'], $societe, $num_lot, $flg_entete, $periode), DB_OXASQLDB);
                $array_lignes_nature[$indice_ligne_nature]['CONSOMME'] = FormatageData::formatMontant($budget_consomme['CONSOMME'], 2, " ");
                
                // On calcule le budget
                $budget = $connecteur->CanFind(SqlConsoBudgetGalderma::rqSelectBudgetForNatureDescription($si, $cdc, $ligne_nature['CTA_CODE'], $ligne_nature['CODE_PRODUCT'], $ligne_nature['CODE_PROJECT'], $societe, $num_lot, $flg_entete, $periode), DB_OXASQLDB);
                $array_lignes_nature[$indice_ligne_nature]['BUDGET'] = FormatageData::formatMontant($budget['BUDGET'], 2, " ");
                
                $indice_ligne_nature ++;
            }
        }
        
        return $array_lignes_nature;
    }

    /**
     * Fonction contruisant le bloc GLOBAL INFORMATION
     *
     * @param int $no_da
     *            : Numéro de la DA
     * @param string $si
     *            : Code de la SI de la rupture
     * @param string $cdc
     *            : Code de CDC de la rupture
     * @param string $societe
     *            : Société de l'utilisateur si l'appel est fait sur le panier ou de la DA si l'appel est fait sur une DA en signature
     * @param int $num_lot
     *            : Numéro de lot actif
     * @param int $periode
     *            : Période active
     *            
     * @return array $array_global_information : Tableau contenant les données constituants le bloc GLOBAL INFORMATION
     */
    function &buildBlocGlobalInformation($no_da, $id_user, $id_panier, $si, $cdc, $societe, $num_lot, $flg_entete, $periode)
    {
        global $connecteur;
        
        // Tableau contenant les données constituant le bloc GLOBAL INFORMATION
        $array_global_information = array();
        
        // Calcul du champ BUDGET du bloc
        $budget = $connecteur->CanFind(SqlConsoBudgetGalderma::rqSelectBudgetGlobalInformation($si, $cdc, $societe, $num_lot, $periode), DB_OXASQLDB);
        $array_global_information['BUDGET'] = $budget['BUDGET'];
        
        if (is_int($no_da)) {
            // Calcul du champ CONSOMME du bloc
            $consomme = $connecteur->CanFind(SqlConsoBudgetGalderma::rqGetGlobalInformationTotalConsummed($no_da, $si, $cdc, $societe, $num_lot, $flg_entete, $periode), DB_OXASQLDB);
            $array_global_information['CONSOMME'] = $consomme['CONSOMME'];
            
            // Calcul du champ MONTANT de la DA du bloc
            $montant = $connecteur->CanFind(SqlConsoBudgetGalderma::rqGetGlobalInformationTotalDA($no_da, $si, $cdc, $flg_entete, $periode), DB_OXASQLDB);
            $array_global_information['MONTANT'] = $montant['TOTAL'];
        } else {
            // Calcul du champ CONSOMME du bloc
            $consomme = $connecteur->CanFind(SqlConsoBudgetGalderma::rqGetGlobalInformationTotalConsummed(null, $si, $cdc, $societe, $num_lot, $flg_entete, $periode), DB_OXASQLDB);
            $array_global_information['CONSOMME'] = $consomme['CONSOMME'];
            
            $montant = $connecteur->CanFind(SqlConsoBudgetGalderma::rqGetGlobalInformationTotalPanier($id_user, $id_panier, $si, $cdc, $flg_entete, $periode), DB_OXASQLDB);
            
            $array_global_information['MONTANT'] = $montant['TOTAL'];
        }
        
        if ($array_global_information['BUDGET'] > 0 && ! is_null($array_global_information['BUDGET'])) {
            // Calcul du champ RESTE_CONSOMME du bloc : Budget - consomme - montant de la DA
            $array_global_information['BUDGET_CONSOMME'] = Floor((double) $array_global_information['CONSOMME'] + (double) $array_global_information['MONTANT']);
            $array_global_information['RESTE_CONSOMME'] = Floor($array_global_information['BUDGET'] - (double) $array_global_information['CONSOMME'] - (double) $array_global_information['MONTANT']);
            
            // On détermine pour chacune des données le pourcentage qu'il représente par rapport au budget total :
            $array_global_information['BUDGET_WIDTH_PERCENT'] = 100;
            $array_global_information['CONSOMME_WIDTH_PERCENT'] = FormatageData::formatMontant(floor(100 * ($array_global_information['CONSOMME'] / $array_global_information['BUDGET'])), 0, ' ');
            $array_global_information['MONTANT_WIDTH_PERCENT'] = FormatageData::formatMontant(floor(100 * ($array_global_information['MONTANT'] / $array_global_information['BUDGET'])), 0, ' ');
            $array_global_information['RESTE_CONSOMME_WIDTH_PERCENT'] = FormatageData::formatMontant(floor(abs(100 * ($array_global_information['RESTE_CONSOMME'] / $array_global_information['BUDGET']))), 0, ' ');
            
            $array_global_information['BUDGET_PERCENT'] = '(100%)';
            $array_global_information['CONSOMME_PERCENT'] = '(' . FormatageData::formatMontant(floor(100 * ($array_global_information['CONSOMME'] / $array_global_information['BUDGET'])), 0, ' ') . '%)';
            $array_global_information['MONTANT_PERCENT'] = '(' . FormatageData::formatMontant(floor(100 * ($array_global_information['MONTANT'] / $array_global_information['BUDGET'])), 0, ' ') . '%)';
            $array_global_information['BUDGET_CONSOMME_PERCENT'] = FormatageData::formatMontant(floor(100 * ($array_global_information['BUDGET_CONSOMME'] / $array_global_information['BUDGET'])), 0, ' ') . '%';
            
            $budget_consomme_percent = 100 * ((double) $array_global_information['BUDGET_CONSOMME'] / (double) $array_global_information['BUDGET']);
        } else {
            $array_global_information['BUDGET_CONSOMME'] = 0;
            $array_global_information['RESTE_CONSOMME'] = 0;
            
            // On détermine pour chacune des données le pourcentage qu'il représente par rapport au budget total :
            $array_global_information['BUDGET_WIDTH_PERCENT'] = 0;
            $array_global_information['CONSOMME_WIDTH_PERCENT'] = 0;
            $array_global_information['MONTANT_WIDTH_PERCENT'] = 0;
            $array_global_information['RESTE_CONSOMME_WIDTH_PERCENT'] = 0;
            
            $array_global_information['CONSOMME_PERCENT'] = "0%";
            $array_global_information['MONTANT_PERCENT'] = "0%";
            $array_global_information['RESTE_CONSOMME_PERCENT'] = "0%";
            $array_global_information['BUDGET_CONSOMME_PERCENT'] = "100%";
            
            $budget_consomme_percent = 100;
        }
        
        // En fonction du pourcentage de budget restant on détermine l'image de la jauge à afficher
        if ($budget_consomme_percent >= 100) {
            $array_global_information['JAUGE'] = 'images/specifiques/compteur_budget_alert.jpg';
        } elseif ($budget_consomme_percent >= 90) {
            $array_global_information['JAUGE'] = 'images/specifiques/compteur_budget_rouge.jpg';
        } elseif ($budget_consomme_percent >= 60) {
            $array_global_information['JAUGE'] = 'images/specifiques/compteur_budget_jaune.jpg';
        } else {
            $array_global_information['JAUGE'] = 'images/specifiques/compteur_budget_vert.jpg';
        }
        
        $array_global_information['IS_DEPASSEMENT'] = 0;
        
        // Si le reste à consommer est négatif alors on recalcule les pourcentage afin que la partie CONSOMME + MONTANT = 100%
        if ($array_global_information['RESTE_CONSOMME'] < 0) {
            
            $array_global_information['IS_DEPASSEMENT'] = 1;
            $array_global_information['BUDGET_WIDTH_PERCENT'] = 100 * $budget['BUDGET'] / ($consomme['CONSOMME'] + $montant['TOTAL']);
            $array_global_information['CONSOMME_WIDTH_PERCENT'] = 100 * $consomme['CONSOMME'] / ($consomme['CONSOMME'] + $montant['TOTAL']);
            $array_global_information['MONTANT_WIDTH_PERCENT'] = 100 * $montant['TOTAL'] / ($consomme['CONSOMME'] + $montant['TOTAL']);
            $array_global_information['DEPASSE_BUDGET_WIDTH_PERCENT'] = 100 * ($consomme['CONSOMME'] + $montant['TOTAL'] - $budget['BUDGET']) / ($consomme['CONSOMME'] + $montant['TOTAL']);
            $array_global_information['RESTE_CONSOMME_WIDTH_PERCENT'] = 0;
        }
        
        // Si le pourcentage des composantes du budget est trop faible alors on les initialise à 1 afin de pouvoir les visualiser
        $array_global_information['BUDGET_WIDTH_PERCENT'] = $array_global_information['BUDGET_WIDTH_PERCENT'] < 1 ? 1 : $array_global_information['BUDGET_WIDTH_PERCENT'];
        $array_global_information['CONSOMME_WIDTH_PERCENT'] = $array_global_information['CONSOMME_WIDTH_PERCENT'] < 1 ? 1 : $array_global_information['CONSOMME_WIDTH_PERCENT'];
        $array_global_information['MONTANT_WIDTH_PERCENT'] = $array_global_information['MONTANT_WIDTH_PERCENT'] < 1 ? 1 : $array_global_information['MONTANT_WIDTH_PERCENT'];
        
        if (array_key_exists('DEPASSE_BUDGET_WIDTH_PERCENT', $array_global_information))
            $array_global_information['DEPASSE_BUDGET_WIDTH_PERCENT'] = $array_global_information['DEPASSE_BUDGET_WIDTH_PERCENT'] < 1 ? 1 : $array_global_information['DEPASSE_BUDGET_WIDTH_PERCENT'];
        if (array_key_exists('RESTE_CONSOMME_WIDTH_PERCENT', $array_global_information))
            $array_global_information['RESTE_CONSOMME_WIDTH_PERCENT'] = $array_global_information['RESTE_CONSOMME_WIDTH_PERCENT'] < 1 ? 1 : $array_global_information['RESTE_CONSOMME_WIDTH_PERCENT'];
        
        $array_global_information['BUDGET'] = FormatageData::formatMontant(floor($array_global_information['BUDGET']), 0, ' ');
        $array_global_information['CONSOMME'] = FormatageData::formatMontant(floor($array_global_information['CONSOMME']), 0, ' ');
        $array_global_information['MONTANT'] = FormatageData::formatMontant(floor($array_global_information['MONTANT']), 0, ' ');
        $array_global_information['BUDGET_CONSOMME'] = FormatageData::formatMontant($array_global_information['BUDGET_CONSOMME'], 0, ' ');
        
        return $array_global_information;
    }

    /**
     * Fonction contruisant le bloc DETAIL
     *
     * @param int $no_da
     *            : Numéro de la DA
     * @param string $si
     *            : Code de la SI de la rupture
     * @param string $cdc
     *            : Code de CDC de la rupture
     * @param string $societe
     *            : Société de l'utilisateur si l'appel est fait sur le panier ou de la DA si l'appel est fait sur une DA en signature
     * @param int $num_lot
     *            : Numéro de lot actif
     * @param int $periode
     *            : Période active
     *            
     * @return array $array_global_information : Tableau contenant les données constituants le bloc GLOBAL INFORMATION
     */
    function &buildBlocDetails($no_da, $id_user, $id_panier, $si, $cdc, $societe, $num_lot, $flg_entete, $periode)
    {
        global $connecteur;
        
        // Tableau contenant les données constituant le bloc DETAIL INFORMATION
        $array_detail_information = array();
        
        // Construction de la ligne de type 1 : SI et CDC de la rupture
        $ok = false;
        if (is_array($ligne_type_1 = $connecteur->CanFind(SqlConsoBudgetGalderma::rqGetBlocDetailsGroupBySiAndCDC($si, $cdc, $societe, $num_lot, $flg_entete, $periode), DB_OXASQLDB)))
            $ok = true;
        // Alors on ne recupère que la valeur du PRECOMMITMENT
        else
            $ligne_type_1 = $connecteur->CanFind(SqlConsoBudgetGalderma::rqGetBlocDetailsGroupBySiAndCDC($si, $cdc, $societe, $num_lot, $flg_entete, $periode, 1), DB_OXASQLDB);
        
        $array_detail_information['TYPE_LIGNE_1'][0] = $ligne_type_1;
        
        $array_detail_information['TYPE_LIGNE_1'][0]['SI_CODE'] = $si;
        $array_detail_information['TYPE_LIGNE_1'][0]['CDC_CODE'] = $cdc;
        
        $array_detail_information['SI_LIB'][0] = Imputation::getLibelleImput("SI", $societe, $si);
        $array_detail_information['CDC_LIB'][0] = Imputation::getLibelleImput('CDC', $societe, $cdc);
        
        if ($ok) {
            $last_trend = $array_detail_information['TYPE_LIGNE_1'][0]['LAST_TREND'];
            $budget = $array_detail_information['TYPE_LIGNE_1'][0]['BUDGET'];
            $commitment = $array_detail_information['TYPE_LIGNE_1'][0]['COMMITMENT'];
        } else {
            $last_trend = 0;
            $budget = 0;
            $commitment = 0;
        }
        
        // On récupère les lignes de la DA ou du panier en cours
        $montant_da = 0;
        if (is_int($no_da))
            $liste_lignes = $connecteur->AllFind(SqlConsoBudgetGalderma::rqSelectMontantDAForNatureDescription($no_da, $si, $cdc, $flg_entete, $periode), DB_OXASQLDB);
        else {
            $liste_lignes = $connecteur->AllFind(SqlConsoBudgetGalderma::rqSelectMontantPanierForNatureDescription($id_user, $id_panier, $si, $cdc, $flg_entete, $periode), DB_OXASQLDB);
            
            foreach ($liste_lignes as & $ligne)
                if ($si == $ligne['SI_CODE'] && $cdc == $ligne['CDC_CODE'])
                    $montant_da += $ligne['MONTANT'];
        }
        
        if ($ok)
            $actual = $array_detail_information['TYPE_LIGNE_1'][0]['ACTUAL'];
        else {
            $actual = 0;
        }
        $precommitment = $array_detail_information['TYPE_LIGNE_1'][0]['PRECOMMITMENT'] + $montant_da;
        
        $array_detail_information['TYPE_LIGNE_1'][0]['PRECOMMITMENT'] = $precommitment;
        $array_detail_information['TYPE_LIGNE_1'][0]['CONSOMME'] = $commitment + $actual + $precommitment;
        $array_detail_information['TYPE_LIGNE_1'][0]['RESTE_CONSOMME'] = $last_trend > 0 ? $last_trend - $array_detail_information['TYPE_LIGNE_1'][0]['CONSOMME'] : $budget - $array_detail_information['TYPE_LIGNE_1'][0]['CONSOMME'];
        
        // On récupère tous les code produits distincts de la DA présents sur les lignes possédants le SI et le CDC donné
        if (is_int($no_da))
            $liste_product = $connecteur->AllFind(SqlConsoBudgetGalderma::rqGetProductOnDABySIandCDC($no_da, $si, $cdc), DB_OXASQLDB);
        else
            $liste_product = $connecteur->AllFind(SqlConsoBudgetGalderma::rqGetProductOnUserPanierBySIandCDC($id_user, $id_panier, $si, $cdc), DB_OXASQLDB);
        
        if (is_array($liste_product)) {
            $ind_type_ligne_2 = 0;
            
            foreach ($liste_product as & $product) {
                // Construction des lignes de type 2 : SI et CDC de la rupture + regroupement sur code produit
                
                if (! is_array($ligne_type_2 = $connecteur->CanFind(SqlConsoBudgetGalderma::rqGetBlocDetailsGroupBySiAndCdcAndProduct($si, $cdc, $product['CODE_PRODUCT'], $societe, $num_lot, $flg_entete, $periode), DB_OXASQLDB))) {
                    // Alors on ne recupère que la valeur du PRECOMMITMENT
                    $ligne_type_2 = $connecteur->CanFind(SqlConsoBudgetGalderma::rqGetBlocDetailsGroupBySiAndCdcAndProduct($si, $cdc, $product['CODE_PRODUCT'], $societe, $num_lot, $flg_entete, $periode, 1), DB_OXASQLDB);
                }
                
                $array_detail_information['TYPE_LIGNE_2'][$ind_type_ligne_2] = $ligne_type_2;
                
                $array_detail_information['TYPE_LIGNE_2'][$ind_type_ligne_2]['SI_CODE'] = $si;
                $array_detail_information['TYPE_LIGNE_2'][$ind_type_ligne_2]['CDC_CODE'] = $cdc;
                $array_detail_information['TYPE_LIGNE_2'][$ind_type_ligne_2]['PRODUCT'] = $product['CODE_PRODUCT'];
                
                $last_trend = $array_detail_information['TYPE_LIGNE_2'][$ind_type_ligne_2]['LAST_TREND'];
                $budget = $array_detail_information['TYPE_LIGNE_2'][$ind_type_ligne_2]['BUDGET'];
                
                // On détermine le montant de la DA ou du panier avec un regroupement sur le SI et le CDC et le code produit
                $montant_da = 0;
                
                if (is_int($no_da)) {} 
                else
                    foreach ($liste_lignes as & $ligne)
                        if ($si == $ligne['SI_CODE'] && $cdc == $ligne['CDC_CODE'] && $product['CODE_PRODUCT'] == $ligne['CODE_PRODUCT'])
                            $montant_da += $ligne['MONTANT'];
                
                $array_detail_information['TYPE_LIGNE_2'][$ind_type_ligne_2]['PRECOMMITMENT'] += $montant_da;
                
                $precommitment = $array_detail_information['TYPE_LIGNE_2'][$ind_type_ligne_2]['PRECOMMITMENT'];
                $commitment = $array_detail_information['TYPE_LIGNE_2'][$ind_type_ligne_2]['COMMITMENT'];
                $actual = $array_detail_information['TYPE_LIGNE_2'][$ind_type_ligne_2]['ACTUAL'];
                
                $arrayCS = [];
                $CS_product = new CS($arrayCS, 'DA_LIGNE', Param::getNumCSProductGalderma());
                $array_detail_information['TYPE_LIGNE_2'][$ind_type_ligne_2]['PRODUCT_LIB'] = $CS_product->getLibelleCS($societe, $product['CODE_PRODUCT']);
                
                $array_detail_information['TYPE_LIGNE_2'][$ind_type_ligne_2]['CONSOMME'] = $commitment + $actual + $precommitment;
                $array_detail_information['TYPE_LIGNE_2'][$ind_type_ligne_2]['RESTE_CONSOMME'] = $last_trend > 0 ? $last_trend - $array_detail_information['TYPE_LIGNE_2'][$ind_type_ligne_2]['CONSOMME'] : $budget - $array_detail_information['TYPE_LIGNE_2'][$ind_type_ligne_2]['CONSOMME'];
                
                $ind_type_ligne_2 ++;
            }
        }
        
        // On récupère tous les code projets distincts de la DA présents sur les lignes possédants le SI et le CDC donné
        if (is_int($no_da))
            $liste_project = $connecteur->AllFind(SqlConsoBudgetGalderma::rqGetProjectOnDABySIandCDC($no_da, $si, $cdc), DB_OXASQLDB);
        else
            $liste_project = $connecteur->AllFind(SqlConsoBudgetGalderma::rqGetProjectOnUserPanierBySIandCDC($id_user, $id_panier, $si, $cdc), DB_OXASQLDB);
        
        if (is_array($liste_project)) {
            $ind_type_ligne_3 = 0;
            
            foreach ($liste_project as & $project) {
                // Construction des lignes de type 3 : SI et CDC de la rupture + regroupement sur code projet
                $ok = false;
                if (is_array($ligne_type_3 = $connecteur->CanFind(SqlConsoBudgetGalderma::rqGetBlocDetailsGroupBySiAndCdcAndProject($si, $cdc, $project['CODE_PROJECT'], $societe, $num_lot, $flg_entete, $periode), DB_OXASQLDB)))
                    $ok = true;
                else {
                    // Alors on ne recupère que la valeur du PRECOMMITMENT
                    $ligne_type_3 = $connecteur->CanFind(SqlConsoBudgetGalderma::rqGetBlocDetailsGroupBySiAndCdcAndProject($si, $cdc, $project['CODE_PROJECT'], $societe, $num_lot, $flg_entete, $periode, 1), DB_OXASQLDB);
                }
                
                $array_detail_information['TYPE_LIGNE_3'][$ind_type_ligne_3] = $ligne_type_3;
                
                $array_detail_information['TYPE_LIGNE_3'][$ind_type_ligne_3]['SI_CODE'] = $si;
                $array_detail_information['TYPE_LIGNE_3'][$ind_type_ligne_3]['CDC_CODE'] = $cdc;
                $array_detail_information['TYPE_LIGNE_3'][$ind_type_ligne_3]['PROJECT'] = $project['CODE_PROJECT'];
                
                if ($ok) {
                    $last_trend = $array_detail_information['TYPE_LIGNE_3'][$ind_type_ligne_3]['LAST_TREND'];
                    $budget = $array_detail_information['TYPE_LIGNE_3'][$ind_type_ligne_3]['BUDGET'];
                } else {
                    $last_trend = 0;
                    $budget = 0;
                }
                
                // On détermine le montant de la DA ou du panier avec un regroupement sur le SI et le CDC et le code projet
                $montant_da = 0;
                if (is_int($no_da)) {} 
                else
                    foreach ($liste_lignes as & $ligne)
                        if ($si == $ligne['SI_CODE'] && $cdc == $ligne['CDC_CODE'] && $project['CODE_PROJECT'] == $ligne['CODE_PROJECT'])
                            $montant_da += $ligne['MONTANT'];
                
                $array_detail_information['TYPE_LIGNE_3'][$ind_type_ligne_3]['PRECOMMITMENT'] += $montant_da;
                
                $precommitment = $array_detail_information['TYPE_LIGNE_3'][$ind_type_ligne_3]['PRECOMMITMENT'];
                $commitment = $array_detail_information['TYPE_LIGNE_3'][$ind_type_ligne_3]['COMMITMENT'];
                if ($ok)
                    $actual = $array_detail_information['TYPE_LIGNE_3'][$ind_type_ligne_3]['ACTUAL'];
                
                $arrayCS = [];
                $CS_project = new CS($arrayCS, 'DA_LIGNE', Param::getNumCSProjectGalderma());
                $array_detail_information['TYPE_LIGNE_3'][$ind_type_ligne_3]['PROJECT_LIB'] = $CS_project->getLibelleCS($societe, $project['CODE_PROJECT']);
                
                $array_detail_information['TYPE_LIGNE_3'][$ind_type_ligne_3]['CONSOMME'] = $commitment + $actual + $precommitment;
                $array_detail_information['TYPE_LIGNE_3'][$ind_type_ligne_3]['RESTE_CONSOMME'] = $last_trend > 0 ? $last_trend - $array_detail_information['TYPE_LIGNE_3'][$ind_type_ligne_3]['CONSOMME'] : $budget - $array_detail_information['TYPE_LIGNE_3'][$ind_type_ligne_3]['CONSOMME'];
                
                $ind_type_ligne_3 ++;
            }
        }
        
        // On formate les données de type montant
        if (is_array($array_detail_information) && 1 == 2)
            foreach ($array_detail_information as &$type_de_ligne)
                if (is_array($type_de_ligne))
                    foreach ($type_de_ligne as &$ligne) {
                        $ligne['BUDGET'] = FormatageData::formatMontant(is_array($ligne) && array_key_exists("BUDGET", $ligne) ? $ligne['BUDGET'] : 0, 2, " ");
                        $ligne['LAST_TREND'] = FormatageData::formatMontant(is_array($ligne) && array_key_exists("LAST_TREND", $ligne) ? $ligne['LAST_TREND'] : 0, 2, " ");
                        $ligne['COMMITMENT'] = FormatageData::formatMontant(is_array($ligne) && array_key_exists("COMMITMENT", $ligne) ? $ligne['COMMITMENT'] : 0, 2, " ");
                        $ligne['ACTUAL'] = FormatageData::formatMontant(is_array($ligne) && array_key_exists("ACTUAL", $ligne) ? $ligne['ACTUAL'] : 0, 2, " ");
                        $ligne['PRECOMMITMENT'] = FormatageData::formatMontant(is_array($ligne) && array_key_exists("PRECOMMITMENT", $ligne) ? $ligne['PRECOMMITMENT'] : 0, 2, " ");
                        $ligne['CONSOMME'] = FormatageData::formatMontant(is_array($ligne) && array_key_exists("CONSOMME", $ligne) ? $ligne['CONSOMME'] : 0, 2, " ");
                        $ligne['RESTE_CONSOMME'] = FormatageData::formatMontant(is_array($ligne) && array_key_exists("RESTE_CONSOMME", $ligne) ? $ligne['RESTE_CONSOMME'] : 0, 2, " ");
                    }
        
        return $array_detail_information;
    }
}