<?php
require_once 'application/helpers/class_supervision.php';

class Tableau_de_bord
{

    public static $fichier_xml = 'application/xsl/tableau_de_bord.xsl';

    public static function AffichePage(& $ancrage, $signatureOnly = false)
    {
        $array = Tableau_de_bord::BuildXml($signatureOnly);
        $genXsl = new GenXslt(true);
        echo 'TraiteUrlAsync("'.Supervision::$page_php.'");';
        Affichage::innerHTMLPointeur($ancrage, $genXsl->XslHtml(Tableau_de_bord::$fichier_xml, $array));
    }

    public static function &BuildXml($signatureOnly = false)
    {
        $result = array();
        
        // Droits sur les affichages
        $modeBackup = DroitAcces::IsModeBackup();
        
        //
        // Documents à signer
        //
        $droitsDA = DroitAcces::GetSignatureDa();
        $droitsCDE = DroitAcces::GetSignatureCde();
        $droitsBAP = DroitAcces::GetSignatureBap();
        $droitsDeleg = DroitAcces::GetSignatureDelegation();


        if($_SESSION['EasyDemat'] == 1){
            if (! $modeBackup && ($droitsBAP || $droitsDeleg)){
                $result['tableaux'][] = Tableau_de_bord::BuildXmlSignatureDocumentsEasyDemat($droitsBAP, $droitsDeleg);
            }
        }else{
            if (! $modeBackup && ($droitsDA || $droitsCDE || $droitsBAP || $droitsDeleg)){
                $result['tableaux'][] = Tableau_de_bord::BuildXmlSignatureDocuments($droitsDA, $droitsCDE, $droitsBAP, $droitsDeleg);
            }
        }
        
        if($signatureOnly){
            return  $result;
        }
                
        //
        // Administration Utilisateurs
        //
        $typeAdmin = DroitAcces::GetTypeAdmin();
        
        $isAdmin = ($typeAdmin != '');
        if (! $modeBackup && $isAdmin)
            $result['tableaux'][] = Tableau_de_bord::BuildXmlAdministrationUtilisateurs($typeAdmin);        
        
        //
        // Gestion fournisseurs
        //
        $droitsGestFourn = DroitAcces::GetBarreFournisseurs();
        // Spec 3700 : on n'affiche le panel que s'il existe un canevas
        //$reqSqlDocsDefaut = SqlGestFourniss::rqGetFournissListeDocsRattaches()->TrouveTous();
        //4414
        
        $reqSqlDocsDefaut = SqlGestFourniss::getCanevasDocRattaches()->TrouveTous();
        
        $r = & SqlParam::rqGetParamParavrac('PARAMFOU', 'FOU_SUIVI_DOC')->Trouve1();
        if ($droitsGestFourn && is_array($reqSqlDocsDefaut) && ($r['LIB01PARV'] != 'N'))
        {
            $result['tableaux'][] = Tableau_de_bord::BuildXmlGestionFournisseurs($reqSqlDocsDefaut);
        }

        if($_SESSION['EasyDemat'] == 0){    
            //
            // DOA
            //
            $droitsAccesDOA = DroitAcces::GetModuleDOA();
            if ($droitsAccesDOA)
                $result['tableaux'][] = Tableau_de_bord::BuildXmlDOA();
            
            //
            // Campagnes de notation
            //
            $droitsAccesCampagne = DroitAcces::GetModuleCampagne();
            if ($droitsAccesCampagne)
                $result['tableaux'][] = Tableau_de_bord::BuildXmlCampagnes();
            
            //
            // Suivi documents
            //
            $droitsCDEEnvoyer = DroitAcces::GetSignatureCdeAEnvoyer();
            $droitsAO = DroitAcces::GetModuleAO() && (DroitAcces::GetAOCreatModif() || DroitAcces::GetAOConsult());
            $droitsBS = DroitAcces::GetModuleStock();
            if ($droitsCDEEnvoyer || $droitsAO || $droitsBS){
                $result['tableaux'][] = Tableau_de_bord::BuildXmlSuiviDocuments($droitsCDEEnvoyer, $droitsAO, $droitsBS);
            }
                
            if(($_SESSION['SIG_REF'] || $droitsDeleg) && !$modeBackup)
            {
                $result['tableaux'][] = Tableau_de_bord::BuildXmlRef($droitsDeleg);
            }
            if($_SESSION['HA_ACD_CM'] || $_SESSION['HA_MAR_CM'] || $_SESSION['HA_TYM_CM']  || DroitAcces::GetALL())
            {
                //CONTRATS
                $result['tableaux'][]  = Tableau_de_bord::buildXmlContrat();
            }
            
        }
        
        // On insère les données pour les favoris et actualités
        $result['actualite_favoris']['multilangue'] = Param::GetNoeudXMLFavoris();
        
        // On initialise l'url de la page actualité
        $url_actualite = trim(Param::getActualite($_SESSION['Session_Langue']));
        if ('' != $url_actualite)
            $result['actualite_favoris']['!actu'] = $url_actualite;
        
        return $result;
    }
    
    public static function buildXmlContrat()
    {
        $countAlert = 0;
        $listeContrat =  SqlUsers::contratAlerte()->TrouveTous();
        $countAlert = count($listeContrat);
        
        $countDepasser = 0;
        $listeContrat =  SqlUsers::contratDepasser()->TrouveTous();
        $countDepasser = count($listeContrat);
        
        $arrayTmp = [
            '!libelle' => Trad('Contrat(s) arrivant à échéance(s)'),
            '!chiffre' => $countAlert,
            '!url' => 'document.location.href="V2/Contrats/accord-cadre/index/ALL/ALL/filterV1/accBientot"',
        ];
        
        $arrayTmp[] = array(
            '!libelle' => Trad('Contrat(s) préavis dépassé'),
            '!chiffre' => $countDepasser,
            '!url' => 'document.location.href="V2/Contrats/accord-cadre/index/ALL/ALL/filterV1/accPerimer"',
        );
        
        $resultatContrat = [
            '!libelle' => Trad('Accords-cadres'),
            '!total' => $countAlert + $countDepasser,
            '!affiche_chiffre' => $arrayTmp? true:false,
            'elements' => $arrayTmp
        ];
        
        return $resultatContrat;
    }

    public static function &BuildXmlSuiviDocuments(& $droitsCDEEnvoyer, & $droitsAO, & $droitsBS)
    {
        echo '';
        if ($droitsCDEEnvoyer)
            // Calcul des CDE à envoyer
            $arrayTmp[] = array(
                '!libelle' => Trad('CDE à envoyer'),
                '!chiffre' => Commande::getNbCdeToPrint($_SESSION['Session_Login']),
                '!url' => Menu::getLienSuiviCdeAEnvoyer()
            );
            
        // SPEC 4374 : S'il existe de types d'achat de type sous traitance, affichage de 2 entrées vers le suivi des commandes avec les filtres SANS_CONTRAT ou CONTRAT_NON_RECEP
        if(SqlInfo::rqPopupGetAllTypesAchat(['SOUS_TRAITANCE' => 1], false)->TrouveTous()[0]['CPTRESTBL']>0){
            // Sous-traitance : contrat non généré  = SANS_CONTRAT
            $arrayTmp[] = array(
                '!libelle' => Trad('Cdes Sous-traitance : contrat non généré'),
                '!chiffre' => Commande::getNbCdeSstraitance('SANS_CONTRAT', true),
                '!url' => 'CallUrl("suivi_doc.php","action=accueil&TypeSuivi=CDE&contexteSuivi=modePersonnel&MODE=httpreq&OBJECT=relance&initData=3&rechercher=1&sousTraitance=SANS_CONTRAT&rechercher=1&Dem_Ach='.$_SESSION['Session_Login'].'");window.scrollTo(0,0);'
            );

            // Sous-traitance : contrat non réceptionné = CONTRAT_NON_RECEP
            $arrayTmp[] = array(
                '!libelle' => Trad('Cdes Sous-traitance : contrat non réceptionné'),
                '!chiffre' => Commande::getNbCdeSstraitance('CONTRAT_NON_RECEP', true),
                '!url' => 'CallUrl("suivi_doc.php","action=accueil&TypeSuivi=CDE&contexteSuivi=modePersonnel&MODE=httpreq&OBJECT=relance&initData=3&sousTraitance=CONTRAT_NON_RECEP&rechercher=1&Dem_Ach='.$_SESSION['Session_Login'].'");window.scrollTo(0,0);'
            );            
        }

        if ($droitsAO) {
            
            $arrayTmp[] = array(
                '!libelle' => Trad('Consultations à envoyer'),
                '!chiffre' => Menu::getNbAOAEnvoyer(),
                '!url' => Menu::getLienAOAEnvoyer()
            );
            
            $arrayTmp[] = array(
                '!libelle' => Trad('Suivi de mes Consultations'),
                '!chiffre' => Menu::GetNbSuiviAO(),
                '!url' => Menu::getLienSuiviAO(true)
            );
        }
        
        if ($droitsBS) {
            // Calcul des BS en cours
            $bs = new BS();
            $arrayTmp[] = array(
                '!libelle' => Trad('BS en cours'),
                '!chiffre' => $bs->getNbArt(),
                '!url' =>  'CallUrl("suivi_doc.php","action=accueil&TypeSuivi=BS&contexteSuivi=modePersonnel&MODE=httpreq&OBJECT=relance&initData=10&initData=10");window.scrollTo(0,0);',
            );
        }
        
        if(DroitAcces::GetModuleReception())
        {
            $info['br_to_do']['login'] = $_SESSION["Session_Login"];
            $info['br_to_do']['filtre'] = 'T';
            $info['br_to_do']['societe'] = $_SESSION["Session_SocUsr"];
            $info['br_to_do']['SI'] = $_SESSION['Session_SectionImputation'];
            $info['br_to_do']['CTR_EMET'] = $_SESSION['Session_CodeCtrEmetteur'];
            
            $countBR = new RequeteSQL(SqlBr::rqGetListeforBRtoDo($info), DB_OXASQLDB);
            // Calcul des BS en cours
            $arrayTmp[] = array(
                '!libelle' => Trad('BR attendus'),
                '!chiffre' => count($countBR->TrouveTous()),
                '!url' => Menu::getLienBrAttendus()
            );
        }
        
        // Calcul de l'entête
        $resultat = array(
            '!libelle' => Trad('Suivi documents'),
            '!chiffre' => 0,
            '!affiche_chiffre' => false,
            // '!url' => '',
            'elements' => $arrayTmp
        );
        return $resultat;
    }

    public static function &BuildXmlCampagnes()
    {
        // Calcul des fournisseurs à évaluer
        $array = null;
        $reqSqlNotation = SuiviRecherche::SearchCampNota($array)->TrouveTous();
        $nb_fournisseur = (is_array($reqSqlNotation)) ? count($reqSqlNotation) : 0;
        $arrayTmp[] = array(
            '!libelle' => Trad('Fournisseurs à évaluer'),
            '!chiffre' => $nb_fournisseur,
            '!url' => Menu::getLienSuiviCampagneFournisseur()
        );
        
        // Calcul de l'entête
        $resultat = array(
            '!libelle' => Trad('Campagnes d\'évaluations'),
            // '!chiffre' => $nbInscr + $nbModif + $nbBloq,
            '!affiche_chiffre' => false,
            // '!url' => '',
            'elements' => $arrayTmp
        );
        return $resultat;
    }

    public static function &BuildXmlDOA()
    {
        $reqSqlActions = SqlDoaActions::rqGetDOAPourTDBOperationnel($_SESSION['Session_Login'])->TrouveTous();
        $nbAction = (is_array($reqSqlActions)) ? count($reqSqlActions) : 0;
        $urlTDBOp = Menu::getLienTableauDeBordOperationnel();
        
        // Calcul des documents à signer
        $arrayTmp[] = array(
            '!libelle' => Trad('Actions à réaliser'),
            '!chiffre' => $nbAction,
            '!url' => $urlTDBOp
        );
        
        if (DroitAcces::GetGestionDoa()) {
            $reqSqlAll = SqlDoa::rqGetDOATDBOperationnel($_SESSION['Session_Login'])->TrouveTous();
            $nbDossier = (is_array($reqSqlAll)) ? count($reqSqlAll) : 0;
            // Calcul des dossiers à suivre
            $arrayTmp[] = array(
                '!libelle' => Trad('Dossiers à suivre'),
                '!chiffre' => $nbDossier,
                '!url' => $urlTDBOp
            );
        }
        
        // Calcul de l'entête
        $resultat = array(
            '!libelle' => Trad('Projets achats'),
            // '!chiffre' => $nbInscr + $nbModif + $nbBloq,
            '!affiche_chiffre' => false,
            '!url' => Menu::getLienTableauDeBordOperationnel(),
            'elements' => $arrayTmp
        );
        return $resultat;
    }

    public static function CalculeInfosDocumentFournisseurs(& $infosCategCritique, & $reqSqlDocsCanevas, & $codePartenaire)
    {
        $popup_id = RechercheAvanceeGestFourniss::$popup_id;
        
        // - nb total fournisseurs
        RechercheAvanceeGene::VideSauvegarde($popup_id);
        $rechAvancee = new RechercheAvanceeGene($popup_id);
        $code_type = 'TYPE_FOUR';
        $oper_type = 'LISTE_TYPE_FOUR';
        $type_four = 'REFERENCE';
        $rechAvancee->MiseAJourValeur($code_type, $oper_type, $type_four);
        
        // les fournisseurs sont VALIDES
        $code_type = 'FOUR_VALIDITE';
        $oper_type = 'LISTE_VALIDITE_FOUR';
        $type_four = 'VALID';
        $rechAvancee->MiseAJourValeur($code_type, $oper_type, $type_four);
        
        if ('' != $codePartenaire) {
            $code_type = 'PARTENAIRE_ALG';
            $oper_type = 'LISTE_PARTENAIRE';
            $rechAvancee->MiseAJourValeur($code_type, $oper_type, $codePartenaire);
        }
        
        $rechAvancee->SetEstInitialise(1);
        $rechAvancee->Sauver();
        $array_filter = array(
            'popup_id' => RechercheAvanceeGestFourniss::$popup_id
        );
        
        $modeData = false;
        $reqSql = SqlGestFourniss::rqPopupGetAllGestionFournisseurs($array_filter, $modeData)->Trouve1();
        $nbFournisseurs = (is_array($reqSql)) ? $reqSql['CPTRESTBL'] : 0;
        
        // - nb total de documents à jour
        // - nb total de documents surveillance à jour
        
        // On commence par bâtir la requête qui donnera la liste des fournisseurs
        $modeData = true;
        $reqSqlFournisseurs = SqlGestFourniss::rqPopupGetAllGestionFournisseurs($array_filter, $modeData, true); // Dossier 27836
        $sqlfournisseur = $reqSqlFournisseurs->TexteSqlTraduit();
        
        // Ensuite les requêtes qui vont envelopper la requête fournisseurs
        $reqSqlDocAJour = SqlGestFourniss::rqGetCountDocumentFournisseursAJour(false, false);
        $reqSqlDocAJourSurv = SqlGestFourniss::rqGetCountDocumentFournisseursAJour(true, false);
        $reqSqlDocAJourCrit = SqlGestFourniss::rqGetCountDocumentFournisseursAJour(false, true);
        
        $sqlDocuments = $reqSqlDocAJour->TexteSqlTraduit();
        $sqlDocumentsSurv = $reqSqlDocAJourSurv->TexteSqlTraduit();
        $sqlDocumentsCrit = $reqSqlDocAJourCrit->TexteSqlTraduit();
        
        $sqlDocsAJour = str_replace('left join FOURNISS as', 'left join (' . $sqlfournisseur . ') as', $sqlDocuments);
        $sqlDocsAJourSurv = str_replace('left join FOURNISS as', 'left join (' . $sqlfournisseur . ') as', $sqlDocumentsSurv);
        $sqlDocsAJourCrit = str_replace('left join FOURNISS as', 'left join (' . $sqlfournisseur . ') as', $sqlDocumentsCrit);
        
        // Les deux morceaux de requêtes sont passées par le traducteur, il est inutile voire dangeureux de les y repasser.
        global $connecteur;
        $cptDocsAJourTmp = $connecteur->CanFind($sqlDocsAJour, $reqSqlDocAJour->GetBase());
        $cptDocsAJour = $cptDocsAJourTmp['CPT'];
        
        $cptDocsAJourTmp = $connecteur->CanFind($sqlDocsAJourSurv, $reqSqlDocAJourSurv->GetBase());
        $cptDocsAJourSurv = $cptDocsAJourTmp['CPT'];
        
        $cptDocsAJourTmp = $connecteur->CanFind($sqlDocsAJourCrit, $reqSqlDocAJourCrit->GetBase());
        $cptDocsAJourCrit = $cptDocsAJourTmp['CPT'];
        
        // - nb total docs canevas
        // - nb total docs canevas avec surveillance
        $nbDocsCanevas = 0;
        $nbDocsSurveillance = 0;
        $nbDocsCritique = 0;
        
        if (is_array($reqSqlDocsCanevas))
            foreach ($reqSqlDocsCanevas as & $values) {
                $nbDocsCanevas ++;
                if ('O' == $values['SURVEILLANCE'])
                    $nbDocsSurveillance ++;
                if (array_key_exists($values['CATEGORIE'], $infosCategCritique))
                    $nbDocsCritique ++;
            }
        
        $nbTotalDocuments = $nbFournisseurs * $nbDocsCanevas;
        $nbTotalDocumentsSurv = $nbFournisseurs * $nbDocsSurveillance;
        $nbTotalDocumentsCrit = $nbFournisseurs * $nbDocsCritique;
        
        $pctDocsAJour = (0 == $nbTotalDocuments) ? Trad('n/a') : FormatageData::formatMontant(100 * $cptDocsAJour / $nbTotalDocuments, 0) . ' %';
        $pctDocsAJourSurv = (0 == $nbTotalDocumentsSurv) ? Trad('n/a') : FormatageData::formatMontant(100 * $cptDocsAJourSurv / $nbTotalDocumentsSurv, 0) . ' %';
        $pctDocsAJourCrit = (0 == $nbTotalDocumentsCrit) ? Trad('n/a') : FormatageData::formatMontant(100 * $cptDocsAJourCrit / $nbTotalDocumentsCrit, 0) . ' %';
        
        // Fournisseurs sans vigilance
        $code_type = 'DOC_FOUR_VALIDITE';
        $oper_type = 'LISTE_VALIDITE_DOC_FOUR';
        $type_four = 'SURV_ABSENT';
        $rechAvancee->MiseAJourValeur($code_type, $oper_type, $type_four);
        $rechAvancee->Sauver();
        $modeData = false;
        $reqSql = SqlGestFourniss::rqPopupGetAllGestionFournisseurs($array_filter, $modeData)->Trouve1();
        $nbFournisseursSansVigi = (is_array($reqSql)) ? $reqSql['CPTRESTBL'] : 0;
        
        // Fournisseur critiques
        $code_type = 'DOC_FOUR_VALIDITE';
        $oper_type = 'LISTE_VALIDITE_DOC_FOUR';
        $type_four = 'CRITIQUE_ABSENT';
        $rechAvancee->MiseAJourValeur($code_type, $oper_type, $type_four);
        $rechAvancee->Sauver();
        $modeData = false;

        $reqSql = SqlGestFourniss::rqPopupGetAllGestionFournisseurs($array_filter, $modeData)->Trouve1();
        $nbFournisseursCritique = (is_array($reqSql)) ? $reqSql['CPTRESTBL'] : 0;
        
        $resultat = array(
            'pctDocsAJour' => $pctDocsAJour,
            'pctDocsAJourSurv' => $pctDocsAJourSurv,
            'pctDocsAJourCrit' => $pctDocsAJourCrit,
            'nbFournisseursSansVigi' => $nbFournisseursSansVigi,
            'nbFournisseursCritique' => $nbFournisseursCritique
        );
        return $resultat;
    }

    public static function calculedocRattache($partenaire = null)
    {
        $popup_id = RechercheAvanceeGestFourniss::$popup_id;
        
        // - nb total fournisseurs
        RechercheAvanceeGene::VideSauvegarde($popup_id);
        $rechAvancee = new RechercheAvanceeGene($popup_id);
        $code_type = 'TYPE_FOUR';
        $oper_type = 'LISTE_TYPE_FOUR';
        $type_four = 'REFERENCE';
        $rechAvancee->MiseAJourValeur($code_type, $oper_type, $type_four);
        
        // les fournisseurs sont VALIDES
        $code_type = 'FOUR_VALIDITE';
        $oper_type = 'LISTE_VALIDITE_FOUR';
        $type_four = 'VALID';
        $rechAvancee->MiseAJourValeur($code_type, $oper_type, $type_four);
        
        $rechAvancee->SetEstInitialise(1);
        $rechAvancee->Sauver();
        $array_filter = array(
            'popup_id' => RechercheAvanceeGestFourniss::$popup_id
        );
        
        $nombreTotal = SqlGestFourniss::nbrDocTotal(null, null , $partenaire)->Trouve1()['NB_DOC'];
        $nombreDocActif = SqlGestFourniss::nbrDocValide(null, null , $partenaire)->Trouve1()['NB_DOC'];
        
        $nombreTotalCritique =  SqlGestFourniss::nbrDocTotal(true, null , $partenaire)->Trouve1()['NB_DOC'];
        $nombreDocActifCritque = SqlGestFourniss::nbrDocValide(true, null , $partenaire)->Trouve1()['NB_DOC'];
        
        $nombreTotalSurv =  SqlGestFourniss::nbrDocTotal(true, true, $partenaire)->Trouve1()['NB_DOC'];
        $nombreDocActifSurv = SqlGestFourniss::nbrDocValide(true, true, $partenaire)->Trouve1()['NB_DOC'];
        
        $rechAvancee = new RechercheAvanceeGene(RechercheAvanceeGestFourniss::$popup_id);
        
        $array_filter['filtre_tableau_bord'] = true;
        $array_filter['popup_id'] = $popup_id;
        
        
        if($partenaire)
        {
            $array_filter['PARTENAIRE'] =  $partenaire;
        }
        
        // Fournisseurs sans vigilance
        $code_type = 'DOC_FOUR_VALIDITE';
        $oper_type = 'LISTE_VALIDITE_DOC_FOUR';
        $type_four = 'SURV_ABSENT';
        $rechAvancee->MiseAJourValeur($code_type, $oper_type, $type_four);
        $rechAvancee->Sauver();

        $modeData = false;
        $reqSql = SqlGestFourniss::rqPopupGetAllGestionFournisseurs($array_filter, $modeData)->Trouve1();
        $nbFournisseursSansVigi = (is_array($reqSql)) ? $reqSql['CPTRESTBL'] : 0;
        
        // Fournisseur critiques
        $code_type = 'DOC_FOUR_VALIDITE';
        $oper_type = 'LISTE_VALIDITE_DOC_FOUR';
        $type_four = 'CRITIQUE_ABSENT';
        $rechAvancee->MiseAJourValeur($code_type, $oper_type, $type_four);
        $rechAvancee->Sauver();
        $modeData = false;
        
        $reqSql = SqlGestFourniss::rqPopupGetAllGestionFournisseurs($array_filter, $modeData)->Trouve1();
        $nbFournisseursCritique = (is_array($reqSql)) ? $reqSql['CPTRESTBL'] : 0;

        $result['pctDocsAJour'] = round(($nombreDocActif * 100) / $nombreTotal, 2);
        $result['pctDocsAJourCrit'] = round(($nombreDocActifCritque * 100) / $nombreTotalCritique, 2);
        $result['pctDocsAJourSurv']= !is_nan(round(($nombreDocActifSurv * 100) / $nombreTotalSurv, 2))??0;
        $result['nbFournisseursSansVigi'] = $nbFournisseursSansVigi;
        $result['nbFournisseursCritique'] = $nbFournisseursCritique;
        
        return $result;
    }
    
    public static function &BuildXmlGestionFournisseurs(& $reqSqlDocsCanevas)
    {
        // On recherche les infos des catégories
        $CODE_TABLE = 'FOURNISS';
        $reqSqlCateg = SqlGestFourniss::rqGetFournissListeCategories($CODE_TABLE)->TrouveTous();
        
        $infosCategCritique = array();
        if (is_array($reqSqlCateg))
        {
            foreach ($reqSqlCateg as & $infosCateg)
            {
                if (BoolSql($infosCateg['CRITIQUE']))
                {
                    $infosCategCritique[$infosCateg['CODE_CAT']] = true;
                }
            }
        }

        $statsDocuments = Tableau_de_bord::calculedocRattache();
        
        $pctDocsAJour = $statsDocuments['pctDocsAJour'];
        $pctDocsAJourSurv = $statsDocuments['pctDocsAJourSurv'];
        $pctDocsAJourCrit = $statsDocuments['pctDocsAJourCrit'];
        $nbFournisseursSansVigi = $statsDocuments['nbFournisseursSansVigi'];
        $nbFournisseursCritique = $statsDocuments['nbFournisseursCritique'];

        $arrayTmp[0] = array(
            '!libelle' => Trad('% des documents critiques à jour'),
            '!chiffre' => $pctDocsAJourCrit,
            //'!url' => 'CallUrl(\'barre_menu.php?action=' . Barre_menu::$act_Barre_Fournisseurs_filtre . '&filtre1=' . RechercheAvanceeGestFourniss::$filtre_fourn_critique_a_jour . '&filtre2=' . RechercheAvanceeGestFourniss::$filtre_part_tous . '&filtre3=' . RechercheAvanceeGestFourniss::$filtre_fourn_type_ref . '\');'
            '!url' => 'document.location.href="V2/Fournisseur/index/CRITIQUE_A_JOUR/ALL"'    
            
        );
        
        $arrayTmp[1] = array(
            '!libelle' => Trad('% des documents à jour'),
            '!chiffre' => $pctDocsAJour,
            //'!url' => 'CallUrl(\'barre_menu.php?action=' . Barre_menu::$act_Barre_Fournisseurs_filtre . '&filtre1=' . RechercheAvanceeGestFourniss::$filtre_fourn_a_jour . '&filtre2=' . RechercheAvanceeGestFourniss::$filtre_part_tous . '&filtre3=' . RechercheAvanceeGestFourniss::$filtre_fourn_type_ref . '\');'
            '!url' => 'document.location.href="V2/Fournisseur/index/A_JOUR/ALL"'    
        );
        
        $arrayTmp[2] = array(
            '!libelle' => Trad('% de documents vigilance à jour'),
            '!chiffre' => $pctDocsAJourSurv,
            //'!url' => 'CallUrl(\'barre_menu.php?action=' . Barre_menu::$act_Barre_Fournisseurs_filtre . '&filtre1=' . RechercheAvanceeGestFourniss::$filtre_fourn_a_jour . '&filtre2=' . RechercheAvanceeGestFourniss::$filtre_part_tous . '&filtre3=' . RechercheAvanceeGestFourniss::$filtre_fourn_type_ref . '\');'
            '!url' => 'document.location.href="V2/Fournisseur/index/A_JOUR/ALL"'    
            
        );
        
        $arrayTmp[3] = array(
            '!libelle' => Trad('Fournisseur sans Vigilance'),
            '!chiffre' => $nbFournisseursSansVigi,
            //'!url' => 'CallUrl(\'barre_menu.php?action=' . Barre_menu::$act_Barre_Fournisseurs_filtre . '&filtre1=' . RechercheAvanceeGestFourniss::$filtre_fourn_surv_relance . '&filtre2=' . RechercheAvanceeGestFourniss::$filtre_part_tous . '&filtre3=' . RechercheAvanceeGestFourniss::$filtre_fourn_type_ref . '\');'
            '!url' => 'document.location.href="V2/Fournisseur/index/SURV_ABSENT/ALL"'    
            
        );
        
        $arrayTmp[4] = array(
            '!libelle' => Trad('Fournisseurs critiques'),
            '!chiffre' => $nbFournisseursCritique,
            //'!url' => 'CallUrl(\'barre_menu.php?action=' . Barre_menu::$act_Barre_Fournisseurs_filtre . '&filtre1=' . RechercheAvanceeGestFourniss::$filtre_fourn_critique_absent . '&filtre2=' . RechercheAvanceeGestFourniss::$filtre_part_tous . '&filtre3=' . RechercheAvanceeGestFourniss::$filtre_fourn_type_ref . '\');'
            '!url' => 'document.location.href="V2/Fournisseur/index/CRITIQUE_ABSENT/ALL"'  
            
        );
        
        // Spec 3700 : colonnes supplémentaires
        // 1. Est-ce que le client est lié à ALG ?
        $extensionTableau = null;
        $licenceALGOk = Param::IsLicenceALGValide();
        
        $partenaireActif = Param::isPartenaireActif();
        
        if ($licenceALGOk) {
            // 2. Est-ce qu'il y a des documents dans le canevas ?
            if (is_array($reqSqlDocsCanevas)) {
                // Il y a des document dans le canevas, on va lister les documents par partenaires
                $docsPartenaireALG = 0;
                $docsSansPartenaire = 0;
                
                // note pour plus tard : il y aura d'auteres partenaires
                foreach ($reqSqlDocsCanevas as & $doc) {
                    
                    if($doc['CODEPARTENAIRE'] != '0')
                    {
                        $docsPartenaireALG ++;
                        break;
                    }
                    
                    /*switch ($doc['CODEPARTENAIRE']) {
                        case 'ALG':
                            $docsPartenaireALG ++;
                            break;
                        default:
                            break;
                    }*/
                }
                
                // note pour plus tard : il y aura d'auteres partenaires
                if (0 < $docsPartenaireALG) {
                    // Il y a au moins un doc partenaire, on va afficher l'extension du tableau
                    $extensionTableau['!extension_existe'] = true;
                    
                    if (0 < $docsPartenaireALG) {
                        $partenaireALG = 'ALG';
                        $statsDocuments = Tableau_de_bord::CalculeInfosDocumentFournisseurs($infosCategCritique, $reqSqlDocsCanevas, $partenaireALG);
                        
                        $statsDocuments = Tableau_de_bord::calculedocRattache('ALL');
                        
                        $pctDocsAJourSurvALG = $statsDocuments['pctDocsAJour'];
                        $pctDocsAJourALG = $statsDocuments['pctDocsAJourSurv'];
                        $pctDocsAJourCritALG = $statsDocuments['pctDocsAJourCrit'];
                        $nbFournisseursSansVigiALG = $statsDocuments['nbFournisseursSansVigi'];
                        $nbFournisseursCritiqueALG = $statsDocuments['nbFournisseursCritique'];
                        
                        $extensionTableau['titres'][]['!libelle'] = SqlGestFourniss::getListePart();
                        
                        $arrayTmp[0]['extension'][0]['!chiffre'] = $pctDocsAJourCritALG;
                        //$arrayTmp[0]['extension'][0]['!url'] = 'CallUrl(\'barre_menu.php?action=' . Barre_menu::$act_Barre_Fournisseurs_filtre . '&filtre1=' . RechercheAvanceeGestFourniss::$filtre_fourn_critique_a_jour . '&filtre2=' . RechercheAvanceeGestFourniss::$filtre_part_alg . '&filtre3=' . RechercheAvanceeGestFourniss::$filtre_fourn_type_ref . '\');';
                        $arrayTmp[0]['extension'][0]['!url'] = 'document.location.href="V2/Fournisseur/index/CRITIQUE_A_JOUR/ALG"';
                        
                        $arrayTmp[1]['extension'][0]['!chiffre'] = $pctDocsAJourSurvALG;
                        //$arrayTmp[1]['extension'][0]['!url'] = 'CallUrl(\'barre_menu.php?action=' . Barre_menu::$act_Barre_Fournisseurs_filtre . '&filtre1=' . RechercheAvanceeGestFourniss::$filtre_fourn_a_jour . '&filtre2=' . RechercheAvanceeGestFourniss::$filtre_part_alg . '&filtre3=' . RechercheAvanceeGestFourniss::$filtre_fourn_type_ref . '\');';
                        $arrayTmp[1]['extension'][0]['!url'] = 'document.location.href="V2/Fournisseur/index/A_JOUR/ALG"';
                        
                        $arrayTmp[2]['extension'][0]['!chiffre'] = $pctDocsAJourALG;
                        //$arrayTmp[2]['extension'][0]['!url'] = 'CallUrl(\'barre_menu.php?action=' . Barre_menu::$act_Barre_Fournisseurs_filtre . '&filtre1=' . RechercheAvanceeGestFourniss::$filtre_fourn_a_jour . '&filtre2=' . RechercheAvanceeGestFourniss::$filtre_part_alg . '&filtre3=' . RechercheAvanceeGestFourniss::$filtre_fourn_type_ref . '\');';
                        $arrayTmp[2]['extension'][0]['!url'] = 'document.location.href="V2/Fournisseur/index/A_JOUR/ALG"';
                        
                        $arrayTmp[3]['extension'][0]['!chiffre'] = $nbFournisseursSansVigiALG;
                        //$arrayTmp[3]['extension'][0]['!url'] = 'CallUrl(\'barre_menu.php?action=' . Barre_menu::$act_Barre_Fournisseurs_filtre . '&filtre1=' . RechercheAvanceeGestFourniss::$filtre_fourn_surv_relance . '&filtre2=' . RechercheAvanceeGestFourniss::$filtre_part_alg . '&filtre3=' . RechercheAvanceeGestFourniss::$filtre_fourn_type_ref . '\');';
                        $arrayTmp[3]['extension'][0]['!url'] = 'document.location.href="V2/Fournisseur/index/SURV_ABSENT/ALG"';
                        
                        $arrayTmp[4]['extension'][0]['!chiffre'] = $nbFournisseursCritiqueALG;
                        //$arrayTmp[4]['extension'][0]['!url'] = 'CallUrl(\'barre_menu.php?action=' . Barre_menu::$act_Barre_Fournisseurs_filtre . '&filtre1=' . RechercheAvanceeGestFourniss::$filtre_fourn_critique_absent . '&filtre2=' . RechercheAvanceeGestFourniss::$filtre_part_alg . '\');';
                        $arrayTmp[4]['extension'][0]['!url'] = 'document.location.href="V2/Fournisseur/index/CRITIQUE_ABSENT/ALG"';
                    }
                    
                    /*$partenaireNone = 'NONE';
                    $statsDocuments = Tableau_de_bord::CalculeInfosDocumentFournisseurs($infosCategCritique, $reqSqlDocsCanevas, $partenaireNone);*/
                    
                    $statsDocuments = Tableau_de_bord::calculedocRattache('NONE');
                    
                    $pctDocsAJourSurvNONE = $statsDocuments['pctDocsAJour'];
                    $pctDocsAJourNONE = $statsDocuments['pctDocsAJourSurv'];
                    $pctDocsAJourCritNONE = $statsDocuments['pctDocsAJourCrit'];
                    $nbFournisseursSansVigiNONE = $statsDocuments['nbFournisseursSansVigi'];
                    $nbFournisseursCritiqueNONE = $statsDocuments['nbFournisseursCritique'];
                    
                    $extensionTableau['titres'][]['!libelle'] = Trad('Internes');
                    
                    $arrayTmp[0]['extension'][1]['!chiffre'] = $pctDocsAJourCritNONE;
                    //$arrayTmp[0]['extension'][1]['!url'] = 'CallUrl(\'barre_menu.php?action=' . Barre_menu::$act_Barre_Fournisseurs_filtre . '&filtre1=' . RechercheAvanceeGestFourniss::$filtre_fourn_critique_a_jour . '&filtre2=' . RechercheAvanceeGestFourniss::$filtre_part_aucun . '&filtre3=' . RechercheAvanceeGestFourniss::$filtre_fourn_type_ref . '\');';
                    $arrayTmp[0]['extension'][1]['!url'] = 'document.location.href="V2/Fournisseur/index/CRITIQUE_A_JOUR/INTERNE"';
                    
                    $arrayTmp[1]['extension'][1]['!chiffre'] = $pctDocsAJourSurvNONE;
                    //$arrayTmp[1]['extension'][1]['!url'] = 'CallUrl(\'barre_menu.php?action=' . Barre_menu::$act_Barre_Fournisseurs_filtre . '&filtre1=' . RechercheAvanceeGestFourniss::$filtre_fourn_a_jour . '&filtre2=' . RechercheAvanceeGestFourniss::$filtre_part_aucun . '&filtre3=' . RechercheAvanceeGestFourniss::$filtre_fourn_type_ref . '\');';
                    $arrayTmp[1]['extension'][1]['!url'] = 'document.location.href="V2/Fournisseur/index/A_JOUR/INTERNE"';
                    
                    $arrayTmp[2]['extension'][1]['!chiffre'] = $pctDocsAJourNONE;
                    //$arrayTmp[2]['extension'][1]['!url'] = 'CallUrl(\'barre_menu.php?action=' . Barre_menu::$act_Barre_Fournisseurs_filtre . '&filtre1=' . RechercheAvanceeGestFourniss::$filtre_fourn_a_jour . '&filtre2=' . RechercheAvanceeGestFourniss::$filtre_part_aucun . '&filtre3=' . RechercheAvanceeGestFourniss::$filtre_fourn_type_ref . '\');';
                    $arrayTmp[2]['extension'][1]['!url'] = 'document.location.href="V2/Fournisseur/index/A_JOUR/INTERNE"';
                    
                    $arrayTmp[3]['extension'][1]['!chiffre'] = $nbFournisseursSansVigiNONE;
                    //$arrayTmp[3]['extension'][1]['!url'] = 'CallUrl(\'barre_menu.php?action=' . Barre_menu::$act_Barre_Fournisseurs_filtre . '&filtre1=' . RechercheAvanceeGestFourniss::$filtre_fourn_surv_relance . '&filtre2=' . RechercheAvanceeGestFourniss::$filtre_part_aucun . '&filtre3=' . RechercheAvanceeGestFourniss::$filtre_fourn_type_ref . '\');';
                    $arrayTmp[3]['extension'][1]['!url'] = 'document.location.href="V2/Fournisseur/index/SURV_ABSENT/INTERNE"';
                    
                    $arrayTmp[4]['extension'][1]['!chiffre'] = $nbFournisseursCritiqueNONE;
//                     $arrayTmp[4]['extension'][1]['!url'] = 'CallUrl(\'barre_menu.php?action=' . Barre_menu::$act_Barre_Fournisseurs_filtre . '&filtre1=' . RechercheAvanceeGestFourniss::$filtre_fourn_critique_absent . '&filtre2=' . RechercheAvanceeGestFourniss::$filtre_part_aucun . '&filtre3=' . RechercheAvanceeGestFourniss::$filtre_fourn_type_ref . '\');';
                    $arrayTmp[4]['extension'][1]['!url'] = 'document.location.href="V2/Fournisseur/index/CRITIQUE_ABSENT/INTERNE"';
                
                }
            }
        }
        
        // Calcul de l'entête
        $resultat = array(
            '!libelle' => Trad('Documents fournisseurs'),
            '!chiffre' => 0,
            '!affiche_chiffre' => false,
            '!url' => Menu::getLienRechercheGestionFournisseurs(),
            'elements' => $arrayTmp,
            'extension' => $extensionTableau
        );
        return $resultat;
    }

    public static function &BuildXmlSignatureDocuments($droitsDA, $droitsCDE, $droitsBAP, $droitsDeleg)
    {
        // On compte les documents à signer
        $sign = new Sign(true);
        $nbDa = ($droitsDA) ? $sign->getTotalNoDaToSign() : 0;
        $nbCde = ($droitsCDE) ? $sign->getTotalNoCdeToSign() : 0;
        $nbBAP = ($droitsBAP) ? $sign->getTotalNoBapToSign() : 0;
        
        // On compte les délégations
        $sign->signIsDelegated();
        $sign->selectListUserDelegateurs();
        $cntSignataire = count($sign->delegateurs);
        $nbDeleg = ($droitsDeleg) ? $sign->getNbItemIndelegationToSign() : 0;
        
        // Calcul des documents à signer
        if ($droitsDA)
            $arrayTmp[] = array(
                '!libelle' => Trad('DA'),
                '!chiffre' => $nbDa,
                '!url' => Menu::getLienSignatureDA()
            );
        
        if ($droitsCDE)
            $arrayTmp[] = array(
                '!libelle' => Trad('CDE'),
                '!chiffre' => $nbCde,
                '!url' => Menu::getLienSignatureCDE()
            );
        
        if ($droitsBAP)
            $arrayTmp[] = array(
                '!libelle' => Trad('BAP'),
                '!chiffre' => $nbBAP,
                '!url' => Menu::getLienSignatureBAP()
            );
        
        if ($droitsDeleg)
            $arrayTmp[] = array(
                '!libelle' => Trad('Délégations'),
                '!chiffre' => $cntSignataire . '/' . $nbDeleg,
                '!url' => Menu::getLienSignatureDelegation()
            );
        
        $resultat = array(
            '!libelle' => Trad('Documents à signer'),
            '!total' => $nbDa + $nbCde + $nbBAP + $nbDeleg,
            '!affiche_chiffre' => true,
            // '!url' => '',
            'elements' => $arrayTmp
        );
        return $resultat;
    }

    public static function &BuildXmlSignatureDocumentsEasyDemat($droitsBAP, $droitsDeleg)
    {
        // On compte les documents à signer
        $sign = new Sign(true);
        $nbBAP = ($droitsBAP) ? $sign->getTotalNoBapToSign() : 0;
        
        // On compte les délégations
        $sign->signIsDelegated();
        $sign->selectListUserDelegateurs();
        $cntSignataire = count($sign->delegateurs);
        $nbDeleg = ($droitsDeleg) ? $sign->getNbItemIndelegationToSign() : 0;
        
        // Calcul des documents à signer
        if ($droitsBAP)
            $arrayTmp[] = array(
                '!libelle' => Trad('BAP'),
                '!chiffre' => $nbBAP,
                '!url' => Menu::getLienSignatureBAP()
            );
        
        if ($droitsDeleg)
            $arrayTmp[] = array(
                '!libelle' => Trad('Délégations'),
                '!chiffre' => $cntSignataire . '/' . $nbDeleg,
                '!url' => Menu::getLienSignatureDelegation()
            );
        
        $resultat = array(
            '!libelle' => Trad('Documents à signer'),
            '!total' => $nbBAP + $nbDeleg,
            '!affiche_chiffre' => true,
            // '!url' => '',
            'elements' => $arrayTmp
        );
        return $resultat;
    }
    
    public static function &BuildXmlRef($droitsDeleg)
    {
        $resultat=[];
        $arrayTmp=[];
        
        if($_SESSION['SIG_REF'])
        {
            // $nbRef = SqlREF::getNbSignat($_SESSION['Session_Login'])->Trouve1()['NBSIGNAT'];
            $signatureFournisseur = SqlFournisseur::getListeDemande('FOURNISS',[], 'CODE', 'RS', true);
            $nbFournisseur = count($signatureFournisseur->trouveTous());
            
            // SPEC 4352 : ajout Délégation Fournisseur
            $listeDelegation = SqlREF::getListeDelegation($_SESSION['Session_Login'])->TrouveTous();
            $cntDeleg = count($listeDelegation);
            $nbDeleg = 0;
            foreach($listeDelegation as $deleg){
                $nbDeleg += intval($deleg['nbSign']);
            }

            $arrayTmp = [
                '!libelle' => Trad('Fournisseur'),
                '!chiffre' => $nbFournisseur,
                '!url' => 'document.location.href="V2/global/Fournisseur/suiviSignature"',
            ];

            if ($nbDeleg){
                $arrayTmp[] = array(
                    '!libelle' => Trad('Délégations'),
                    '!chiffre' => $cntDeleg . '/' . $nbDeleg,
                    '!url' => 'document.location.href="V2/global/Fournisseur/delegationRecue"',
                );
            }
            
            $resultat = [
                '!libelle' => Trad('Réferentiel à signer'),
                '!total' => $nbFournisseur + $nbDeleg,
                '!affiche_chiffre' => $arrayTmp? true:false,
                'elements' => $arrayTmp
            ];
        }
            

        
        
        return $resultat;
    }

    public static function &BuildXmlAdministrationUtilisateurs($typeAdmin)
    {
        $inscript = new CollabManage();
        $inscript->initNbDem($_SESSION['Session_Login'], $typeAdmin);
        $nbInscr = $inscript->getNbInscritionToAdmin();
        $nbModif = $inscript->getNbModifToAdmin();
        $nbBloq = $inscript->getNbBlocagesUtilisateur();
        
        // Calcul des documents à signer
        $arrayTmp[] = array(
            '!libelle' => Trad('Inscript. en attente'),
            '!chiffre' => $nbInscr,
            '!url' => Menu::GetLienInscriptEnAtt($typeAdmin)
        );
        
        $arrayTmp[] = array(
            '!libelle' => Trad('Modif. en attente'),
            '!chiffre' => $nbModif,
            '!url' => Menu::GetLienModifEnAtt($typeAdmin)
        );
        
        $arrayTmp[] = array(
            '!libelle' => Trad('Utilisateurs bloqués'),
            '!chiffre' => $nbBloq,
            '!url' => Menu::GetLienUtilisateurBloques($typeAdmin)
        );
        
        // Calcul de l'entête
        $resultat = array(
            '!libelle' => Trad('Administration'),
            // '!chiffre' => $nbInscr + $nbModif + $nbBloq,
            '!affiche_chiffre' => false,
            // '!url' => '',
            'elements' => $arrayTmp
        );
        return $resultat;
    }
}