<?php

class DOA_Referentiel
{
	//4474
    const STATUT_INITIALISATION = 'I';
    
    const STATUT_INITIAL = 'P';

    const STATUT_ENCOURS = 'E';

    const STATUT_TERMINE = 'T';

    /**
     * Constance fixe indiquant que cette tache comme a la meme date de debut que la tache cible
     * 
     * @var unknown
     */
    const CONTR_DEBUT_IDENT = 'T';

    /**
     *
     * @param unknown $OBJECT_DATA
     * @return string|unknown
     */
    public static function &getObjectDataSysteme($OBJET_DATA)
    {
        $nomRetourTable = $OBJET_DATA;
        if ($OBJET_DATA === 'CENTRE_E' || $OBJET_DATA === 'CENTRE_R' || $OBJET_DATA === 'CENTRE_F' || $OBJET_DATA === 'CENTRE_L') {
            $nomRetourTable = 'CENTRE';
        } else if ($OBJET_DATA == 'ACHETEUR' || $OBJET_DATA == 'DEMANDEU' || $OBJET_DATA == 'SIGDA' || $OBJET_DATA == 'SIGCDE' || $OBJET_DATA == 'SIGBAP') {
            $nomRetourTable = 'HASTUTIL';
        }
        
        return $nomRetourTable;
    }

    /**
     * Mise en cache des informations concernant l'object Bilbliotheque / Modele / DOA
     */
    public static function setSessionObject($typeObject, $idObject)
    {
        $clStore = new DOABibSessioon();
    }

    public static function iSDoaEnExecution($TYPE_OBJET, $ID_OBJET)
    {
        $isNotDoaActive = false;
        if ($TYPE_OBJET == 'D')
            if ($reqDoa = SqlDoa::rqGetInfoSuiviDoa($ID_OBJET)->Trouve1())
                if ($reqDoa['STATUT'] == DOA_Referentiel::STATUT_TERMINE || $reqDoa['STATUT'] == DOA_Referentiel::STATUT_ENCOURS)
                    $isNotDoaActive = true;
        
        return $isNotDoaActive;
    }

    //
    // Gestion des formats de document
    //
    static function &FormatDocumentExiste(& $ID_FORMAT)
    {
        $reqSql = SqlDoaReferentiel::rqDOAGetInfoFormatDocument($ID_FORMAT)->Trouve1();
        return (is_array($reqSql) && count($reqSql) > 0);
    }

    public static function &BuildXmlListeDocuments($idH = null)
    {
        $array = null;
        if ($reqSql = SqlDoaReferentiel::rqDOAGetListeFormatDocument(null, $idH)->TrouveTous())
            foreach ($reqSql as $values) {
                $array[] = array(
                    '!ID' => $values['ID'],
                    '!LIB' => $values['LIB'],
                    '!COMMENTAIRE' => $values['COMMENTAIRE'],
                    '!TYPE_DOC' => $values['TYPE_DOC']
                );
            }
        return $array;
    }

    public static function &BuildXmlListeArboDocumentFille($idParent = 0, $action = '')
    {
        $array = null;
        
        if ($reqSql = SqlDoaReferentiel::rqDOAGetListeArboDocumentFille($idParent)->TrouveTous())
            foreach ($reqSql as $index => & $req) {
                $array['option'][$index] = array(
                    '!texte' => $req['LIB'],
                    '!color' => $req['COLOR'],
                    '!index' => $req['ID'],
                    '!action' => str_replace('(1)', urldecode($req['ID']), $action)
                );
                
                if ($ret = DOA_Referentiel::BuildXmlListeArboDocumentFille($req['ID'], $action))
                    $array['option'][$index]['suite'] = $ret;
            }
        
        return $array;
    }

    /**
     *
     * @param unknown $TYPE_OBJET
     * @param unknown $ID_OBJET
     * @param unknown $ID_CAT
     * @return Ambigous <multitype:, mixed, unknown, NULL>
     */
    public static function &GetInfoCategorie($TYPE_OBJET, $ID_OBJET, & $ID_CAT)
    {
        return SqlDoaReferentiel::rqDOAGetInfosCategorie($ID_CAT, $TYPE_OBJET, $ID_OBJET)->Trouve1();
    }

    /**
     *
     * @param unknown $typeObjet
     * @param unknown $idObjet
     * @param unknown $cl
     * @param unknown $nodeParent
     * @param unknown $idParent
     * @param unknown $activeModifSuppr
     * @param string $okModifBib
     *            Le dernier argument permet d'indiquer que la bibliothèques ne soit pas accessible via l'import fichier
     */
    public static function litArboCategorie($typeObjet, $idObjet, $cl, $nodeParent, $idParent, $activeModifSuppr, $okModifBib = true)
    {
        $idDoaExecution = DOA_Referentiel::iSDoaEnExecution($typeObjet, $idObjet);
        
        if ($req = SqlDoaReferentiel::rqGetSqlDoaCategorieFille($typeObjet, $idObjet, $idParent)->TrouveTous())
            foreach ($req as $index => & $element) {
                
                $pere = $cl->addPere($nodeParent);
                /**
                 * Information pour retoruver l'ID qui sera cliqué par l'utilisateur
                 */
                $pere->setAttribute('uniqId', $element['ID']);
                
                $cl->setTexte($pere, 'info')->setToolTip($pere, (array_key_exists('DESC', $element) ? $element['DESC'] : ''));
                
                $nodeTitre = $cl->getNodeTitre($pere);
                $nodeTitre->setAttribute('texte', $element['LIB']);
                
                /**
                 * EDP j'aimerai bien savoir a quoi cela sert, car le treeview automtise totalement le callback
                 * $infoCat = 'Traite(\'DOA_Bibliotheque.php?action=AfficherInfoCategorie&idCat='.$element['ID'].'\');'; ;
                 * $nodeTitre->setAttribute('infoCat', $infoCat);
                 */
                if ($cl->getActionPhp() == 'selectCategImport') {
                    $nodeTitre->setAttribute('selectItem', 'CallUrlAsync("DOA_Bibliotheque.php","action=selectItem&idCat=' . $element['ID'] . '")');
                    $nodeTitre->setAttribute('selectItemTooltip', trad('Sélection de toutes les données de cette catégorie'));
                }
                
                if ($activeModifSuppr && ! $idDoaExecution || ($typeObjet == 'B' && $okModifBib)) {
                    if (($element['TYPE_OBJET'] == 'B' && Param::canAccessDoaBib()) || (Param::canCreateDoaModele() && $element['TYPE_OBJET'] != 'B')) {
                        $modification = 'window.open(\'DOA_Bibliotheque.php?action=AfficherAjoutCategorie&type=modif&idCat=' . $element['ID'] . '\',\'win_pop\',\'width=500,height=200\');';
                        $nodeTitre->setAttribute('onclickModifier', $modification);
                        $nodeTitre->setAttribute('tooltipModifier', trad('Modifier la catégorie'));
                        
                        if ($typeObjet == 'B' && ($listeDonnee = SqlDoaBibliotheque::rqDOA_GetListeDonnee($typeObjet, $idObjet, $element['ID'])->Trouve1())) {
                            
                            $supression = ' if(window.confirm("' . cnv_to_javascript(trad("Confirmez vous la suppression de cette catégorie avec ses données ?")) . '")) {' . 'CallUrlAsync("DOA_Bibliotheque.php","action=SupprimerCategorie&idCat=' . $element['ID'] . '");' . '}';
                            $nodeTitre->setAttribute('onclickSupprimer', $supression);
                            $nodeTitre->setAttribute('tooltipSupprimer', trad('Supprimer la catégorie'));
                        } else if ($reqNull = SqlDoaReferentiel::rqGetSqlDoaCategorieFille($typeObjet, $idObjet, $element['ID'])->Trouve1()) {
                            
                            // Suppression NON autorisé car cette catégorie à des fils et d'autre part, la procédure de suppression de catégorie ne gère pas la suppression des fils
                        } else {
                            
                            $supression = 'if(window.confirm("' . cnv_to_javascript(trad("Confirmez vous la suppression de cette catégorie ?")) . '")){' . 'CallUrlAsync("DOA_Bibliotheque.php","action=SupprimerCategorie&idCat=' . $element['ID'] . '")' . '};';
                            
                            $nodeTitre->setAttribute('onclickSupprimer', $supression);
                            $nodeTitre->setAttribute('tooltipSupprimer', trad('Supprimer la catégorie'));
                        }
                        
                        if ($index != 0) {
                            $nodeTitre->setAttribute('up', 'CallUrlAsync("DOA_Bibliotheque.php","action=catup&idCat=' . $element['ID'] . '")');
                            $nodeTitre->setAttribute('upTooltip', trad('Monter la catégorie'));
                        }
                        if ($index + 1 != count($req)) {
                            $nodeTitre->setAttribute('down', 'CallUrlAsync("DOA_Bibliotheque.php","action=catdown&idCat=' . $element['ID'] . '")');
                            $nodeTitre->setAttribute('downTooltip', trad('Descendre la catégorie'));
                        }
                    }
                }
                
                DOA_Referentiel::litArboCategorie($typeObjet, $idObjet, $cl, $pere, $element['ID'], $activeModifSuppr, $okModifBib);
            }
    }

    public static function getVueSqlPerimetreDoa($isModele)
    {
        $code_usr = $_SESSION['Session_Login'];
        $requeteDOA = '(';
        
        if ($isModele) {
            $requeteDOA .= 'DOA.PROPRIETAIRE = \'' . ReplaceSqlPointeur($code_usr) . '\'  ';
        } else {
            $requeteDOA .= 'DOA.ID in (select ID_DOA from DOA_ACTIONS_RACI with (nolock) ' . 'where DOA_ACTIONS_RACI.ID_DOA = DOA.ID ' . 'and   DOA_ACTIONS_RACI.CODE_USER = \'' . ReplaceSqlPointeur($code_usr) . '\'  ' . ') ';
            
            $requeteDOA .= ' or DOA.PROPRIETAIRE = \'' . ReplaceSqlPointeur($code_usr) . '\'  ';
            
            $requeteDOA .= ' or DOA.PRESCRIPTEUR = \'' . ReplaceSqlPointeur($code_usr) . '\'  ';
        }
        
        // DOA dont l’utilisateur est responsable de l’UO (ou de l’une de ses mères) du propriétaire ou du prescripteur
        
        $codeSteUO = (Param::IsUOSecto()) ? $_SESSION['Session_SocUsrProfil'] : '';
        $listeUOStr = UO::getListeUOStr($codeSteUO, $code_usr); //
        if ('' !== $listeUOStr)
            $requeteDOA .= ' or propr.CODE_UO in (' . $listeUOStr . ') or prescr.CODE_UO in (' . $listeUOStr . ') ';
        
        $sqlSte = '';
        if ($liste_societes = SqlUsers::rqListSocieteForUser($_SESSION['Session_Login'])->TrouveTous())
            foreach ($liste_societes as $value) {
                if ('' !== $sqlSte)
                    $sqlSte .= ',';
                
                $sqlSte .= '\'' . ReplaceSqlPointeur($value['Code']) . '\'';
            }
        
        if ($isModele) {
            $requeteDOA .= 'or not exists(select null from DOA_SOC with (nolock) where DOA_SOC.ID_DOA = DOA.ID) ' . (Param::canAccessDoaSuiviTous() && $sqlSte != '' ? ' or propr.CODE_STE  IN (' . $sqlSte . ') ' : '') . ($sqlSte != '' ? 'or exists (select null from DOA_SOC with (nolock) ' . 'where DOA_SOC.ID_DOA = DOA.ID ' . 'and ( DOA_SOC.TYPE_GS = \'S\' ' . 'and   DOA_SOC.CODE  IN (' . $sqlSte . ') ' . 'or DOA_SOC.TYPE_GS = \'G\' ' . 'and exists(select null from SOCIETE with (nolock) ' . 'where SOCIETE.GROUPE = DOA_SOC.CODE ' . 'and   SOCIETE.CODE_STE IN (' . $sqlSte . ') ' . ')' . ')' . ')' : '');
        } else {
            // Societe
            $requeteDOA .= ')';
            
            if ($sqlSte != '')
                $requeteDOA .= (Param::canAccessDoaSuiviTous() ? ' or (' : ' and (' . 'DOA.PROPRIETAIRE = \'' . ReplaceSqlPointeur($code_usr) . '\' or ' . 'DOA.PRESCRIPTEUR = \'' . ReplaceSqlPointeur($code_usr) . '\' or ') . ' not exists(select null from DOA_SOC with (nolock) where DOA_SOC.ID_DOA = DOA.ID) ' . 'or exists  (select null from DOA_SOC with (nolock) ' . 'where DOA_SOC.ID_DOA = DOA.ID ' . 'and   ( ' . 'DOA_SOC.TYPE_GS = \'S\' ' . 'and   DOA_SOC.CODE  IN (' . $sqlSte . ') ' . 'or ' . 'DOA_SOC.TYPE_GS = \'G\' ' . 'and exists(select null from SOCIETE with (nolock) ' . 'where SOCIETE.GROUPE = DOA_SOC.CODE ' . 'and   SOCIETE.CODE_STE IN (' . $sqlSte . ') ' . ')' . ')' . ')' . (Param::canAccessDoaSuiviTous() && $sqlSte != '' ? ' or propr.CODE_STE  IN (' . $sqlSte . ') or prescr.CODE_STE  IN (' . $sqlSte . ') ' : '');
        }
        $requeteDOA .= ')';
        return $requeteDOA;
    }

    /**
     * CETTE ROUTINE Est soit utilisé par le système global DOA / Modele
     * SOIT AU NIVEAU DE L'import de donnée qui concerne la bibliotheque => DONC présence de $useBibilotheque car forcage des valeurs B 0
     * 
     * @param unknown $idXml
     * @param unknown $callBack
     * @param unknown $actionPhp
     * @param unknown $activeModifSuppr
     * @param string $useBibilotheque
     */
    public static function AfficherTreeviewCategorie(& $idXml, $callBack, $actionPhp, $activeModifSuppr, $useBibilotheque = null, $okModifBib = true)
    {
        $cl = new TreeView();
        $element = $cl->addRoot('treeview');
        
        $cl->setOpenFolder(true)
            ->setCache(true)
            ->setCallBack($callBack)
            ->setActionPhp($actionPhp);
        
        if (is_null($useBibilotheque)) {
            $clSession = DoaBibSession::getSession();
            $TYPE_OBJET = $clSession->getTypeObject();
            $ID_OBJET = $clSession->getIdObject();
        } else {
            $TYPE_OBJET = 'B';
            $ID_OBJET = 0;
        }
        
        // Indication du class particulier à mettre en place pour un design particulier de l'object
        DOA_Referentiel::litArboCategorie($TYPE_OBJET, $ID_OBJET, $cl, $element, 0, $activeModifSuppr, $okModifBib);
        
        $cl->setSessionObject();
        
        $xslt = new GenXslt();
        $fichier_xsl = 'xsl/treeview.xsl';
        $genXsl = new GenXslt(true);
        
        Affichage::innerHTMLPointeur($idXml, $genXsl->XslHtml($fichier_xsl, $cl));
    }

    //
    // Gestion des hiérarchies de tâches
    //
    public static function litArboTaches($typeObjet, $idObjet, $cl, $nodeParent, $idParent, $activeModifSuppr)
    {
        if ($req = SqlDoaTache::rqGetSqlDoaTacheFille($typeObjet, $idObjet, $idParent)->TrouveTous())
            foreach ($req as $index => & $element) {
                $pere = $cl->addPere($nodeParent);
                /**
                 * Information pour retoruver l'ID qui sera cliqué par l'utilisateur
                 */
                $pere->setAttribute('uniqId', $element['ID_TACHE_H']);
                
                $cl->setTexte($pere, 'info')->setToolTip($pere, $element['DESCR']);
                
                $nodeTitre = $cl->getNodeTitre($pere);
                $nodeTitre->setAttribute('texte', $element['LIB']);
                
                if ($activeModifSuppr) {
                    
                    if ($reqControle = SqlDoaTache::rqGetSqlDoaTacheFille($typeObjet, $idObjet, $element['ID_TACHE_H'])->TrouveTous()) {
                        $supression = '';
                    } else if (($element['TYPE_OBJET'] == 'B' && Param::canAccessDoaBib()) || (Param::canCreateDoaModele() && $element['TYPE_OBJET'] != 'B')) {
                        $supression = 'CallUrlAsync("DOA_Tache.php","action=SupprimerTacheH&ID_TACHE_H=' . $element['ID_TACHE_H'] . '");';
                        $nodeTitre->setAttribute('onclickSupprimer', $supression);
                        $nodeTitre->setAttribute('tooltipSupprimer', trad('Supprimer cette hiérarchie'));
                    }
                    
                    if (($element['TYPE_OBJET'] == 'B' && Param::canAccessDoaBib()) || (Param::canCreateDoaModele() && $element['TYPE_OBJET'] != 'B')) {
                        $modification = 'window.open(\'DOA_Tache.php?action=ModifierTacheH&ID_TACHE_H=' . $element['ID_TACHE_H'] . '\',\'win_pop\',\'width=500,height=200\');';
                        $nodeTitre->setAttribute('onclickModifier', $modification);
                        $nodeTitre->setAttribute('tooltipModifier', trad('Modifier la hiérarchie de tâche'));
                        
                        if ($index != 0) {
                            $nodeTitre->setAttribute('up', 'CallUrl("DOA_Tache.php","action=tacheHup&idTacheH=' . $element['ID_TACHE_H'] . '")');
                            $nodeTitre->setAttribute('upTooltip', trad('Monter la hiérarchie de tache'));
                        }
                        if ($index + 1 != count($req)) {
                            $nodeTitre->setAttribute('down', 'CallUrl("DOA_Tache.php","action=tacheHdown&idTacheH=' . $element['ID_TACHE_H'] . '")');
                            $nodeTitre->setAttribute('downTooltip', trad('Descendre la hiérarchie de tache'));
                        }
                    }
                }
                DOA_Referentiel::litArboTaches($typeObjet, $idObjet, $cl, $pere, $element['ID_TACHE_H'], $activeModifSuppr);
            }
    }

    /**
     *
     * @param unknown $idXml
     * @param unknown $callBack
     * @param unknown $actionPhp
     * @param unknown $activeModifSuppr
     * @param string $mode_ajax
     *            (conditionnel valeur true si non passé)
     */
    public static function AfficherTreeviewTaches(& $idXml, $callBack, $actionPhp, $activeModifSuppr, $mode_ajax = true)
    {
        $cl = new TreeView();
        $element = $cl->addRoot('treeview');
        $clSession = DoaBibSession::getSession();
        
        $TYPE_OBJET = $clSession->getTypeObject();
        $ID_OBJET = $clSession->getIdObject();
        
        $cl->setOpenFolder(true)
            ->setCache(true)
            ->setCallBack($callBack)
            ->setActionPhp($actionPhp);
        
        DOA_Referentiel::litArboTaches($TYPE_OBJET, $ID_OBJET, $cl, $element, 0, $activeModifSuppr);
        
        $cl->setSessionObject();
        
        $xslt = new GenXslt();
        $fichier_xsl = 'xsl/treeview.xsl';
        $genXsl = new GenXslt(true);
        Affichage::innerHTMLPointeur($idXml, $genXsl->XslHtml($fichier_xsl, $cl), $mode_ajax);
    }

    /**
     * Donne la liste des opérations
     * 
     * @return Ambigous <NULL, multitype:NULL >
     */
    public static function &BuildXmlListeOperation()
    {
        $array = null;
        
        if ($reqSql = SqlDoaReferentiel::rqDOAGetListeOperation()->TrouveTous())
            foreach ($reqSql as & $value)
                $array[] = array(
                    '!CODE_OPE' => & $value['CODE_OPE'],
                    '!LIB' => & $value['LIB'],
                    '!DESCR' => & $value['DESCR'],
                    '!DATE_DEB' => & $value['DATE_DEB'],
                    '!DATE_FIN' => & $value['DATE_FIN']
                );
        
        return $array;
    }

    /**
     * Gestion des types de dossiers
     * 
     * @return Ambigous <NULL, multitype:NULL >
     */
    public static function &BuildXmlListeTypeDossier()
    {
        $array = null;
        
        DOA_Referentiel::getListArboDossier(0, 0, $array);
        
        return $array;
    }

    private static function getListArboDossier($decal, $ID_PARENT, & $array)
    {
        if ($reqSql = SqlDoaReferentiel::rqDOAGetListeTypeDossierFeuilleArbo($ID_PARENT)->TrouveTous()) // CODE_OPE, LIB, DESCR, DATE_DEB, DATE_FIN
            foreach ($reqSql as & $value) {
                $array[] = array(
                    '!ID' => & $value['ID'],
                    '!ID_PARENT' => & $value['ID_PARENT'],
                    '!LIB' => str_repeat('- ', $decal) . $value['LIB'],
                    '!LIB_LONG' => & $value['LIB_LONG'],
                    '!DESCR' => & $value['DESCR'],
                    '!PHP_FONT' => & $value['PHP_FONT'],
                    '!PHP_COLOR' => & $value['PHP_COLOR'],
                    '!FIC_ICONE' => & $value['FIC_ICONE'],
                    '!NUM_ORDRE' => & $value['NUM_ORDRE'],
                    '!optionActive' => (! BoolSql($value['HASFILS'])) // Donnée calculé
                );
                DOA_Referentiel::getListArboDossier($decal + 1, $value['ID'], $array);
            }
    }

    //
    // Gestion des centres émetteurs
    //
    public static function CentreEmetteurExiste($CODE, $PROPRIETAIRE, $PRESCRIPTEUR)
    {
        $array_filters['CODE_CTR'] = $CODE;
        $array_filters['DATA_STRICT'] = $CODE;
        
        $doaUser = '';
        if ($PROPRIETAIRE != '')
            $doaUser .= ($doaUser == '' ? '' : '|') . $PROPRIETAIRE;
        if ($PRESCRIPTEUR != '')
            $doaUser .= ($doaUser == '' ? '' : '|') . $PRESCRIPTEUR;
        $array_filters['DOA_USER'] = $doaUser;
        
        $mode = true;
        $reqSql = SqlCentre::rqPopupGetAllCentreEmetteur($array_filters, 'CENTRE_E', $mode)->Trouve1();
        
        return (is_array($reqSql) && $CODE === $reqSql['CODE_CTR']);
    }

    /**
     * Gestion des listes d'utilisateurs
     * Fonctionnalité :
     * Il ne peut être choisi que parmi les utilisateurs ouverts (dates de validité) des sociétés auxquelles a accès l’utilisateur,
     * soit parce que c’est sa société de rattachement, soit parce qu’il est multi-sté ou pluri-sté sur au moins une des stés de l’utilisateur.
     * 
     * @return Ambigous <NULL, multitype:NULL string >
     */
    static function &BuildXmlListeUtilisateurs($codeUtilisateurOrigine, $withOutUser = false)
    {
        $array = null;
        if ($reqSql = SqlUsers::rqGetListUserMultiSoc($codeUtilisateurOrigine)->TrouveTous())
            foreach ($reqSql as & $value)
            {   
                //4474
                if($withOutUser && $value['Code'] == $codeUtilisateurOrigine)
                {
                    
                }
                else
                {
                    $array[] = array(
                        '!CODE' => & $value['Code'],
                        '!LIBELLE' => formatStringToXml($value['Libelle'])
                    );
                }
            }
        return $array;
    }

    static function UtilisateurExiste($CODE)
    {
        $reqSql = & SqlUsers::rqGetInfoUser($CODE)->Trouve1();
        return (is_array($reqSql) && '' !== $reqSql['CODE']);
    }

    //
    // Gestion des calendriers
    //
    static function GetIdCalendrierParDefaut()
    {
        if ($reqSql = SqlDoaReferentiel::rqDOAGetCalendrierPArDefaut()->Trouve1())
            $resultat = & $reqSql['ID'];
        else
            $resultat = '0';
        return $resultat;
    }

    static function &BuildXmlListeCalendrier()
    {
        $array = null;
        if ($reqSql = SqlDoaReferentiel::rqDOAGetListeCalendrier()->TrouveTous())
            foreach ($reqSql as & $value)
                $array[] = array(
                    '!ID' => & $value['ID'],
                    '!LIB' => & $value['LIB'],
                    '!JOURS_FERMES' => & $value['JOURS_FERMES'],
                    '!DEFAUT' => & $value['DEFAUT']
                );
        return $array;
    }

    //
    // Gestion des statuts
    //
    public static function &ListeStatuts()
    {
        //4474
        // AMI : cette liste est porvisaoire en attendant les vraies données
        
        if(SqlParam::isRegleParavracOk('PARAMGEN', 'DOA_STATUT_INIT_ACTIF', 'O'))
        {
            $array[DOA_Referentiel::STATUT_INITIALISATION] = Trad('Initialisation');
        }

        $array[DOA_Referentiel::STATUT_INITIAL] = Trad('Préparation');
        $array[DOA_Referentiel::STATUT_ENCOURS] = Trad('En cours');
        $array[DOA_Referentiel::STATUT_TERMINE] = Trad('Terminé');

        
        return $array;
    }

    public static function &BuildXmlListeStatuts()
    {
        foreach (DOA_Referentiel::ListeStatuts() as $key => $value) {
            $array[] = array(
                '!CODE' => $key,
                '!LIBELLE' => $value
            );
        }
        return $array;
    }

    public static function &GetLibelleStatut(&$CODE)
    {
        $resultat = '';
        foreach (DOA_Referentiel::ListeStatuts() as $key => $value) {
            if ($key == $CODE) {
                $resultat = $value;
                break;
            }
        }
        return $resultat;
    }

    //
    // Gestion des états d'avancement
    //
    public static function &BuildXmlEtatAvancement()
    {
        $array = null;
        if ($reqSql = SqlDoaReferentiel::rqDOAGetListeEtatAvancement()->TrouveTous()) {
            foreach ($reqSql as & $value) {
                $array[] = array(
                    '!ID' => & $value['ID'],
                    '!LIB' => & $value['LIB'],
                    '!NUM_ORDRE' => & $value['NUM_ORDRE']
                );
            }
            return $array;
        }
    }

    //
    // Gestion des types d'alerte pour les tâches
    //
    public static function &ListeTypesAlerte()
    {
        $array = array(
            'M' => Trad('Mail'),
            'T' => Trad('Tableau de bord')
        );
        return $array;
    }

    public static function &BuildXmlTypesAlerte()
    {
        $array = null;
        if ($arrayTmp = DOA_Referentiel::ListeTypesAlerte())
            foreach ($arrayTmp as $key => & $value) {
                $array[] = array(
                    '!CODE' => $key,
                    '!LIBELLE' => $value
                );
            }
        return $array;
    }

    //
    // Gestion des procédures
    //
    public static function &BuildXmlListeProcedures()
    {
        $array = null; // EDP init de la var de retour....
        if ($reqSql = SqlDoaReferentiel::rqDOAGetProcedures()->TrouveTous())
            foreach ($reqSql as $value) {
                $array[] = array(
                    '!ID' => & $value['ID'],
                    '!LIB' => & $value['LIB'],
                    '!DESCR' => & $value['DESCR'],
                    '!TYPE_URL' => & $value['TYPE_URL'],
                    '!NOM_OU_URL' => & $value['NOM_OU_URL'],
                    '!NOM_FIC_INT' => & $value['NOM_FIC_INT'],
                    '!REF_VERSION' => & $value['REF_VERSION'],
                    '!DATE_PROC' => & $value['DATE_PROC']
                );
            }
        return $array;
    }

    public static function &GetInfoProcedure($ID)
    {
        $reqSql = SqlDoaReferentiel::rqDOAGetProcedures($ID)->Trouve1();
        return $reqSql;
    }

    //
    // Gestion des types d'action
    //
    /**
     *
     * @return Ambigous <NULL, multitype:unknown Ambigous <> >
     */
    public static function &BuildXmlListetypesAction()
    {
        $array = null; // EDP init de la var de retour....
        if ($reqSql = SqlDoaReferentiel::rqDOA_ListeTypeAction()->TrouveTous())
            foreach ($reqSql as & $value)
                $array[] = array(
                    '!ID' => & $value['ID'],
                    '!LIB' => & $value['LIB']
                );
        return $array;
    }

    //
    // Gestion des rôle
    //
    public static function &ListeRoles()
    {
        $array = array(
            'R' => Trad('Responsable'),
            'A' => Trad('Acteur'),
            'C' => Trad('Contributeur'),
            'I' => Trad('Informé')
        );
        return $array;
    }

    public static function &BuildXmlRoles()
    {
        $array = null;
        if ($arrayTmp = DOA_Referentiel::ListeRoles())
            foreach ($arrayTmp as $key => & $value)
                $array[] = array(
                    '!CODE' => $key,
                    '!LIBELLE' => $value
                );
        
        return $array;
    }

    /**
     * EDP Cette fonction a pour but de convertir une donnée stocke en valeur Dabase en valeur type CS standard Oxalys
     *
     * @param unknown $NOM_TABLE
     * @param unknown $champ
     * @param unknown $valeurInit
     * @return unknown
     */
    public static function ConvertiChampDbValeurCs($NOM_TABLE, $champ, $valeurInit)
    {
        if ($bddInfo = SqlDoaBdd::rqGetInfoChamp($NOM_TABLE, $champ)->Trouve1()) {
            switch ($bddInfo['BDD_TYPE']) {
                case 'DATEALPHA':
                    $valeur = substr($valeurInit, 6, 2) . '/' . substr($valeurInit, 4, 2) . '/' . substr($valeurInit, 0, 4); // IMPERATIF JJ/MM/AAAA
                    break;
                case 'TIMEALPHA':
                    $valeur = substr($valeurInit, 0, 2) . ':' . substr($valeurInit, 2, 2) . ':' . substr($valeurInit, 4, 2); // IMPERATIF hh:mm:ss
                    break;
                case 'LOGIQUE':
                    $valeur = (BoolSql($valeurInit) ? 'O' : 'N');
                default:
                    $valeur = $valeurInit;
                    break;
            }
        } else
            $valeur = $valeurInit;
        
        return $valeur;
    }

    public static function getModeHeritage()
    {
        $array = array(
            '!name' => 'mode',
            '!size' => 'auto',
            'option' => array(
                array(
                    '!value' => '0',
                    '!libelle' => trad('Sur les dossiers en préparation et les modèles ?')
                ),
                array(
                    '!value' => '1',
                    '!libelle' => trad('Uniquement sur les modèles')
                ),
                array(
                    '!value' => '2',
                    '!libelle' => trad('Nulle part')
                )
            )
        );
        return $array;
    }

    /**
     * * Controle de la data en fonction des que yves va donnée ....
     *
     * @param unknown $TYPE_OBJET
     * @param unknown $ID_OBJET
     * @param unknown $ID_DONNEE
     * @param unknown $ID_DATA
     * @param unknown $nomSqlDw
     * @param unknown $limit
     * @return Ambigous <string, unknown, string, NULL>
     */
    public static function controleSaisieOxaDw($modeModif, $nomOrigine, $TYPE_OBJET, $ID_OBJET, $ID_DONNEE, $ID_DATA, & $nomSqlDw, $limit)
    {
        $message = '';
        if (! Param::IsLicenceOXAETLValide()) {
            $nomSqlDw = null;
            return $message;
        }
        
        if (mb_strlen($nomSqlDw) > 30)
            $messageErreur = Trad('L\'information OXASQLDW doit être inférieur à 30 caractères.');
        else {
            $messageErreur = '';
            
            $nomSqlDw = trim($nomSqlDw);
            if (strlen($nomSqlDw) != 0) {
                
                $ok = true;
                $lastChar = '';
                for ($i = 0; $i < strlen($nomSqlDw); $i ++) {
                    $val = ord(substr($nomSqlDw, $i, 1));
                    if ((48 <= $val && $val <= 57) || (65 <= $val && $val <= 90) || (97 <= $val && $val <= 122) || $val == 95) {
                        // OK
                    } else if (substr($nomSqlDw, $i, 1) == '_') {
                        if ($lastChar == '_') { // Double __ interdit
                            $ok = false;
                            break;
                        }
                    } else {
                        $ok = false;
                        break;
                    }
                    $lastChar = substr($nomSqlDw, $i, 1);
                }
                
                if ($ok) {
                    $sql = '';
                    if ($modeModif) {
                        if (is_null($ID_DATA)) {
                            $sql = 'select * from DOA_STRUCT with (nolock) ' . 'where TYPE_OBJET = \'B\' ' . 'and   ID_OBJET = 0 ' . 'and   NOMSQLDW = \'' . ReplaceSqlPointeur($nomSqlDw) . '\' ' . 'and   ID_DONNEE <> ' . ReplaceSqlPointeur($ID_DONNEE);
                        } else {
                            $sql = 'select * from DOA_DATA with (nolock) ' . 'where TYPE_OBJET = \'B\' ' . 'and   ID_OBJET = 0 ' . 'and   NOMSQLDW = \'' . ReplaceSqlPointeur($nomSqlDw) . '\' ' . 'and   ID_DONNEE = ' . ReplaceSqlPointeur($ID_DONNEE) . ' ' . 'and   ID_DATA <> ' . ReplaceSqlPointeur($ID_DATA);
                        }
                    } else if (is_null($ID_DONNEE)) {
                        $sql = 'select * from DOA_STRUCT with (nolock) ' . 'where TYPE_OBJET = \'B\' ' . 'and   ID_OBJET = 0 ' . 'and   NOMSQLDW = \'' . ReplaceSqlPointeur($nomSqlDw) . '\' ';
                    } else if (is_null($ID_DATA)) {
                        $sql = 'select * from DOA_DATA with (nolock) ' . 'where TYPE_OBJET =  \'B\' ' . 'and   ID_OBJET    =  0 ' . 'and   ID_DONNEE   =  ' . ReplaceSqlPointeur($ID_DONNEE) . ' ' . 'and   NOMSQLDW    = \'' . ReplaceSqlPointeur($nomSqlDw) . '\' ';
                    }
                    if ($sql != '') {
                        $requete = new RequeteSQL($sql, DB_OXASQLDB);
                        if ($requete->Trouve1()) {
                            $messageErreur = trad('Cette valeur d\'OXADW est déjà existante');
                        }
                    }
                } else
                    $messageErreur = trad('Saisie invalide : Caractères autorisés : 0-9, A-Z, et « _ » (underscore).');
            }
        }
        
        return $messageErreur;
    }

    /**
     * Function pour OXADW
     * Caractères autorisés : 0-9, A-Z, et « _ » (underscore).
     * Pas d’espace, pas de double « _ ».
     *
     * @param string $convert
     *            (mot d'origine)
     * @return string
     */
    public static function calculMotOxaDw($convert, $lettreDebut = null)
    {
        $convert = strtoupper(strtoascii($convert));
        if (is_null($lettreDebut))
            $element = '';
        else
            $element = strtoupper($lettreDebut);
        
        $lastChar = '';
        
        for ($i = 0; $i < strlen($convert); $i ++) {
            $val = ord(substr($convert, $i, 1));
            if ((48 <= $val && $val <= 57) || (65 <= $val && $val <= 90) || $val == 95) {
                $lastChar = substr($convert, $i, 1);
                $element .= $lastChar;
            } else {
                if ($lastChar != '_')
                    $element .= '_';
                
                $lastChar = '_';
            }
        }
        return $element;
    }
}