<?php

class DOA
{

    const id_TAB_MODELE = 'TAB_MODELE';

    const TACHE_CODE_PROPRIETAIRE = 'P';

    const TACHE_CODE_PRESCRIPTEUR = 'S';

    const ACTEUR_TACHE_CODE_PROPRIETAIRE = '1';
 // NE PAS TOUCHER A CETTE VALEUR CAR IL NE FAUT QUE CELA PUISSE ETRE UN LIEN AVEC les type elem des tables CS ou STD
    const ACTEUR_TACHE_CODE_PRESCRIPTEUR = '2';
 // NE PAS TOUCHER A CETTE VALEUR CAR IL NE FAUT QUE CELA PUISSE ETRE UN LIEN AVEC les type elem des tables CS ou STD
    const WSDL_TMP = 'WSDL_DOA_CLOT';

    const XSL_POPUP_VALIDATION = 'application/xsl/popup_doa_validation.xsl';

    /**
     * 0 Sur les dossiers en préparation et les modèles ?<br/>
     * 1 Uniquement sur les modèles<br/>
     * 2 Nulle part<br/>
     * 
     * @var unknown
     */
    const MODE_CONSER_HERITAGE = 'modeConservationHeritage';

    const WIN_POP_MODIF_STRUCT = 'PopupModificationDonnee';

    /**
     */
    public static function afficheOngletDonnee()
    {
        $cl = DoaBibSession::getSession();
        $TYPE_OBJET = $cl->getTypeObject();
        $ID_OBJET = $cl->getIdObject();
        
        $idDoaExecution = DOA_Referentiel::iSDoaEnExecution($TYPE_OBJET, $ID_OBJET);
        
        if ($idDoaExecution)
            echo 'CallUrl(\'DOA_Bibliotheque.php?action=AfficherCategoriesData&ancrage=TreeviewCategories&ID_ONGLET=ONG_DONNEES\');';
        else // Affichage des données juste pour la partie en cours de preparation
            echo 'CallUrl(\'DOA_Bibliotheque.php?action=AfficherCategoriesDonnee&ancrage=TreeviewCategories&ID_ONGLET=ONG_DONNEES\');';
    }

    /**
     * INTERDICTION ABSOLUE DE METTRE DES REFERENCES ICI, car procédure récursive et donc chaque variable doit avoir son scope unique
     *
     * @param unknown $pile
     * @param unknown $arrayMemoire
     *            IMPERATIF PASSAGE en reference car il est obligatoire de completer cette array car en retour il va y avoir tache avant et tache apres
     * @param unknown $oldTypeObject
     * @param unknown $oldIdObject
     * @param unknown $newTypeObject
     * @param unknown $newIdObject
     * @param unknown $idOldParent
     * @param unknown $idNewParent
     * @param unknown $firstTache
     */
    public static function copieDoaTachesH($pile, & $arrayMemoire, $oldTypeObject, $oldIdObject, $newTypeObject, $newIdObject, $idOldParent, $idNewParent, $dateTachesDeb)
    {
        /**
         * ATTENTION ICI LE PARAMETRE DE RECALCUL MANUEL OU AUTO N'EST EN AUCUN CAS A PRENDRE EN COMPTE
         * EN EFFET DANS LES MODELES Y A PAS DE DATES DONC MINIMUM Y A UNE INIT A FAIRE AUTOMATIQUE
         */
        // Obtention ou calcul de la date de la taches
        if ($listeTachesH = SqlDoaTache::rqGetSqlDoaTacheFille($oldTypeObject, $oldIdObject, $idOldParent)->TrouveTous())
            if ($reqDoa = SqlDoa::rqGetInfoSuiviDoa($newIdObject)->Trouve1()) {
                // Obtention du calendrier
                $sql = "select * from DOAR_CAL with (nolock) WHERE ID = " . ReplaceSqlPointeur($reqDoa['ID_CAL']);
                
                if ($reqCalend = (new RequeteSQL($sql, DB_OXASQLDB))->Trouve1())
                    $listJourChome = explode('|', $reqCalend['JOURS_FERMES']);
                else
                    $listJourChome = null;
                
                foreach ($listeTachesH as & $tachesH) {
                    $reqMaj = 'insert into DOA_TACHES_H (TYPE_OBJET,ID_OBJET,ID_PARENT,LIB,DESCR,COLOR,NUM_ORDRE) values' . // Dossier 26849
'(\'' . ReplaceSqlPointeur($newTypeObject) . '\'' . ',' . ReplaceSqlPointeur($newIdObject) . ',' . ReplaceSqlPointeur($idNewParent) . ',\'' . ReplaceSqlPointeur($tachesH['LIB']) . '\'' . ',\'' . ReplaceSqlPointeur($tachesH['DESCR']) . '\'' . ',\'' . ReplaceSqlPointeur($tachesH['COLOR']) . '\'' . ',' . ReplaceSqlPointeur($tachesH['NUM_ORDRE']) . // Dossier 26849
')';
                    
                    if ($pile->AddSql($reqMaj))
                        if ($reqLastId = SqlDoaTache::rqGetSqlDoaTacheHNewId($newTypeObject, $newIdObject)->Trouve1()) {
                            
                            $arrayMemoire[$tachesH['ID_TACHE_H']] = $reqLastId['ID'];
                            
                            $arrayTacheNew = null;
                            
                            if ($listeTaches = SqlDoaTache::rqDOATacheListeArboSansContrainte($oldTypeObject, $oldIdObject, $tachesH['ID_TACHE_H'])->TrouveTous())
                                foreach ($listeTaches as & $taches) {
                                    
                                    if (is_null($dateTachesDeb)) // Si premiere tache alors init de la table à l'entete de la DOA
                                        $dateTachesDeb = $reqDoa['DATE_DEB'];
                                    
                                    // Evaludation de la date de fin à la date de debut + DUREE_PREV
                                    
                                    $objDate = date_create($dateTachesDeb);
                                    
                                    // Recalcul de la date de debut si jour chome ou ferie
                                    while (DOA::isJourChome($listJourChome, $objDate) || DOA::isJourFerie($reqDoa['ID_CAL'], $objDate))
                                        $objDate->modify('+1 day');
                                    $dateTachesDeb = date_format($objDate, 'Ymd');
                                    
                                    $objDate->modify('+' . $taches['DUREE_PREV'] . ' day');
                                    
                                    // Recalcul de la date de find si jour chome ou ferie
                                    while (DOA::isJourChome($listJourChome, $objDate) || DOA::isJourFerie($reqDoa['ID_CAL'], $objDate))
                                        $objDate->modify('+1 day');
                                    $dateTachesFin = date_format($objDate, 'Ymd');
                                    
                                    switch ($taches['RESPONSABLE']) {
                                        case DOA::TACHE_CODE_PROPRIETAIRE:
                                            $responsable = $reqDoa['PROPRIETAIRE'];
                                            break;
                                        case DOA::TACHE_CODE_PRESCRIPTEUR:
                                            $responsable = $reqDoa['PRESCRIPTEUR'];
                                            break;
                                        default:
                                            $responsable = $taches['RESPONSABLE'];
                                            break;
                                    }
                                    
                                    // Test si ce jour fait parti de la liste des jours fériés et si OUI +1
                                    $sql = 'insert into DOA_TACHES ' . '(TYPE_OBJET,ID_OBJET,ID_TACHE_H,LIB,DESCR,RESPONSABLE,DATE_DEB,DATE_FIN,TERMINEE,DUREE_PREV,SOUMISE_ALERTE,DELAI_PREAVIS,TYPE_ALERTE,ID_PROC,CHAP_PROC,ID_ETAT_AV,NUM_ORDRE)' . // Dossier 26849
'values ' . '(\'' . ReplaceSqlPointeur($newTypeObject) . '\'' . ',' . ReplaceSqlPointeur($newIdObject) . ',' . ReplaceSqlPointeur($reqLastId['ID']) . ',\'' . ReplaceSqlPointeur($taches['LIB']) . '\'' . ',\'' . ReplaceSqlPointeur($taches['DESCR']) . '\'' . ',\'' . ReplaceSqlPointeur($responsable) . '\'' . ',\'' . ReplaceSqlPointeur($dateTachesDeb) . '\'' . ',\'' . ReplaceSqlPointeur($dateTachesFin) . '\'' . ',' . BoolMSSql($taches['TERMINEE']) . ',' . ReplaceSqlPointeur($taches['DUREE_PREV']) . ',' . BoolMSSql($taches['SOUMISE_ALERTE']) . ',' . ReplaceSqlPointeur($taches['DELAI_PREAVIS']) . ',\'' . ReplaceSqlPointeur($taches['TYPE_ALERTE']) . '\'' . ',' . ReplaceSqlPointeur($taches['ID_PROC']) . ',\'' . ReplaceSqlPointeur($taches['CHAP_PROC']) . '\'' . ',' . ReplaceSqlPointeur($taches['ID_ETAT_AV']) . ',' . ReplaceSqlPointeur($taches['NUM_ORDRE']) . // Dossier 26849
')';
                                    $pile->AddSql($sql);
                                    
                                    $reqLastIdTache = SqlDoaTache::rqGetSqlDoaTacheNewId($newTypeObject, $newIdObject)->Trouve1();
                                    $arrayTacheNew[$taches['ID_TACHE']] = $reqLastIdTache['ID'];
                                    
                                    // Lecture de toutes les taches qui peuvent être lié à la tache lu en cours sans contrainte
                                    if ($listeTachesContraintes = SqlDoaTache::rqDOA_TacheListeContrainteCible($taches['TYPE_OBJET'], $taches['ID_OBJET'], $taches['ID_TACHE'])->TrouveTous())
                                        foreach ($listeTachesContraintes as & $tachesContraintes) {
                                            switch ($tachesContraintes['RESPONSABLE']) {
                                                case DOA::TACHE_CODE_PROPRIETAIRE:
                                                    $responsable = $reqDoa['PROPRIETAIRE'];
                                                    break;
                                                case DOA::TACHE_CODE_PRESCRIPTEUR:
                                                    $responsable = $reqDoa['PRESCRIPTEUR'];
                                                    break;
                                                default:
                                                    $responsable = $taches['RESPONSABLE'];
                                                    break;
                                            }
                                            
                                            $objDate = date_create($dateTachesDeb);
                                            
                                            // Recalcul de la date de debut si jour chome ou ferie
                                            while (DOA::isJourChome($listJourChome, $objDate) || DOA::isJourFerie($reqDoa['ID_CAL'], $objDate))
                                                $objDate->modify('+1 day');
                                            $dateTachesDeb = date_format($objDate, 'Ymd');
                                            
                                            $objDate->modify('+' . $tachesContraintes['DUREE_PREV'] . ' day');
                                            $dateTachesFinTrt = date_format($objDate, 'Ymd');
                                            
                                            $sql = 'insert into DOA_TACHES ' . '(TYPE_OBJET,ID_OBJET,ID_TACHE_H,LIB,DESCR,RESPONSABLE,DATE_DEB,DATE_FIN,TERMINEE,DUREE_PREV,SOUMISE_ALERTE,DELAI_PREAVIS,TYPE_ALERTE,ID_PROC,CHAP_PROC,ID_ETAT_AV,NUM_ORDRE)' . // Dossier 26849
'values ' . '(\'' . ReplaceSqlPointeur($newTypeObject) . '\'' . ',' . ReplaceSqlPointeur($newIdObject) . ',' . ReplaceSqlPointeur($tachesContraintes['ID_TACHE_H']) . // Volontairement on va mettre l'ID de la tache Origine AVANT : $reqLastId['ID']
',\'' . ReplaceSqlPointeur($tachesContraintes['LIB']) . '\'' . ',\'' . ReplaceSqlPointeur($tachesContraintes['DESCR']) . '\'' . ',\'' . ReplaceSqlPointeur($responsable) . '\'' . ',\'' . ReplaceSqlPointeur($dateTachesDeb) . '\'' . ',\'' . ReplaceSqlPointeur($dateTachesFinTrt) . '\'' . ',' . BoolMSSql($tachesContraintes['TERMINEE']) . ',' . ReplaceSqlPointeur($tachesContraintes['DUREE_PREV']) . ',' . BoolMSSql($tachesContraintes['SOUMISE_ALERTE']) . ',' . ReplaceSqlPointeur($tachesContraintes['DELAI_PREAVIS']) . ',\'' . ReplaceSqlPointeur($tachesContraintes['TYPE_ALERTE']) . '\'' . ',' . ReplaceSqlPointeur($tachesContraintes['ID_PROC']) . ',\'' . ReplaceSqlPointeur($tachesContraintes['CHAP_PROC']) . '\'' . ',' . ReplaceSqlPointeur($tachesContraintes['ID_ETAT_AV']) . ',' . ReplaceSqlPointeur($tachesContraintes['NUM_ORDRE']) . // Dossier 26849
')';
                                            $pile->AddSql($sql);
                                            
                                            $reqLastIdTacheCnt = SqlDoaTache::rqGetSqlDoaTacheNewId($newTypeObject, $newIdObject)->Trouve1();
                                            $arrayTacheNew[$tachesContraintes['ID_TACHE']] = $reqLastIdTacheCnt['ID'];
                                            
                                            // Ajout de la contrainte en copie
                                            $pile->AddRequeteSql(SqlDoaActions::rqInsertDoaTacContr($newTypeObject, $newIdObject, $reqLastIdTacheCnt['ID'], $reqLastIdTache['ID'], $tachesContraintes['TYPE_CONTRAINTE']));
                                            
                                            if ($dateTachesFinTrt > $dateTachesFin)
                                                $dateTachesFin = $dateTachesFinTrt;
                                        }
                                    
                                    // Ne pas oublié de rajouter 1 jour pour le debut de la tache suivantes
                                    $objDate = date_create($dateTachesFin);
                                    $objDate->modify('+1 day');
                                    $dateTachesDeb = date_format($objDate, 'Ymd');
                                }
                            
                            if ($listeTaches = SqlDoaTache::rqDOATacheListeArbo($oldTypeObject, $oldIdObject, $tachesH['ID_TACHE_H'])->TrouveTous())
                                foreach ($listeTaches as & $taches)
                                    if (! is_null($arrayTacheNew) && array_key_exists($taches['ID_TACHE'], $arrayTacheNew)) {
                                        $newIdTaches = $arrayTacheNew[$taches['ID_TACHE']];
                                        
                                        /**
                                         * Copie des actions de la tache
                                         */
                                        
                                        $sql = 'select * from DOA_ACTIONS with (nolock) ' . 'where TYPE_OBJET = \'' . ReplaceSqlPointeur($taches['TYPE_OBJET']) . '\' ' . 'and   ID_OBJET   =   ' . ReplaceSqlPointeur($taches['ID_OBJET']) . ' ' . 'and   ID_TACHE   =   ' . ReplaceSqlPointeur($taches['ID_TACHE']);
                                        
                                        if ($listeAction = (new RequeteSQL($sql, DB_OXASQLDB))->TrouveTous()) {
                                            foreach ($listeAction as & $action) {
                                                $sql = 'insert into DOA_ACTIONS (TYPE_OBJET,ID_OBJET,ID_TACHE,LIB,COMMENTAIRE,NUM_ORDRE,ID_TYPE_ACT,TERMINEE) values ' . '(\'' . ReplaceSqlPointeur($newTypeObject) . '\'' . ',' . ReplaceSqlPointeur($newIdObject) . ',' . ReplaceSqlPointeur($newIdTaches) . ',\'' . ReplaceSqlPointeur($action['LIB']) . '\'' . ',\'' . ReplaceSqlPointeur($action['COMMENTAIRE']) . '\'' . ',' . ReplaceSqlPointeur($action['NUM_ORDRE']) . ',' . ReplaceSqlPointeur($action['ID_TYPE_ACT']) . ',' . BoolMSSql($action['TERMINEE']) . ')';
                                                if ($pile->AddSql($sql)) {
                                                    if ($reqLastIdAction = SqlDoaActions::rqGetActionsNewId($newTypeObject, $newIdObject, $newIdTaches)->Trouve1()) {
                                                        /**
                                                         * Recopie des données lie attention l'information ID_DONNE est a transposé
                                                         * car c'est la donnéee source et pas la donnée du cible de la donnée crée
                                                         */
                                                        $sql = 'select DOA_ACTIONS_DON.*,DOA_STRUCT.NOM_DONNEE from DOA_ACTIONS_DON with (nolock), DOA_STRUCT with (nolock) ' . 'where DOA_ACTIONS_DON.TYPE_OBJET = \'' . ReplaceSqlPointeur($action['TYPE_OBJET']) . '\' ' . 'and   DOA_ACTIONS_DON.ID_OBJET   =   ' . ReplaceSqlPointeur($action['ID_OBJET']) . ' ' . 'and   DOA_ACTIONS_DON.ID_TACHE   =   ' . ReplaceSqlPointeur($action['ID_TACHE']) . ' ' . 'and   DOA_ACTIONS_DON.ID_ACTION  =   ' . ReplaceSqlPointeur($action['ID_ACTION']) . ' ' .
                                                        'and   DOA_STRUCT.TYPE_OBJET = DOA_ACTIONS_DON.TYPE_OBJET ' . 'and   DOA_STRUCT.ID_OBJET   = DOA_ACTIONS_DON.ID_OBJET   ' . 'and   DOA_STRUCT.ID_DONNEE  = DOA_ACTIONS_DON.ID_DONNEE   ';
                                                        
                                                        if ($listeActionDon = (new RequeteSQL($sql, DB_OXASQLDB))->TrouveTous())
                                                            foreach ($listeActionDon as & $actionDon) {
                                                                
                                                                /**
                                                                 * Attention ici le numéro de donnée est celui du modele sauf qu'ensuite cela a été recopie et donc une nouvelle donnée à été crée donc recherche de cette donnée
                                                                 * via l'heritage ID_STUCT sur DOA_STRUCT
                                                                 */
                                                                $sql = "select * from DOA_STRUCT with (nolock) " . 'where TYPE_OBJET = \'' . ReplaceSqlPointeur($newTypeObject) . '\' ' . 'and   ID_OBJET   = ' . ReplaceSqlPointeur($newIdObject) . ' ' . 'and   NOM_DONNEE = \'' . ReplaceSqlPointeur($actionDon['NOM_DONNEE']) . '\' ';
                                                                if ($reqDonneeCible = (new RequeteSQL($sql, DB_OXASQLDB))->Trouve1()) {
                                                                    $sql = 'select * from DOA_ACTIONS_DON with (nolock) ' . 'where TYPE_OBJET = \'' . ReplaceSqlPointeur($newTypeObject) . '\' ' . 'AND   ID_OBJET   =   ' . ReplaceSqlPointeur($newIdObject) . ' ' . 'AND   ID_TACHE   =   ' . ReplaceSqlPointeur($newIdTaches) . ' ' . 'AND   ID_ACTION  =   ' . ReplaceSqlPointeur($reqLastIdAction['ID']) . ' ' . 'AND   ID_DONNEE  =   ' . ReplaceSqlPointeur($reqDonneeCible['ID_DONNEE']) . ' ';
                                                                    if ($reqFind = (new RequeteSQL($sql, DB_OXASQLDB))->Trouve1()) {
                                                                        // DEJA FAITE
                                                                    } else {
                                                                        $sql = 'insert into DOA_ACTIONS_DON (TYPE_OBJET,ID_OBJET,ID_TACHE,ID_ACTION,ID_DONNEE,CRITERE_SEL) values ' . '(\'' . ReplaceSqlPointeur($newTypeObject) . '\'' . ',' . ReplaceSqlPointeur($newIdObject) . ',' . ReplaceSqlPointeur($newIdTaches) . ',' . ReplaceSqlPointeur($reqLastIdAction['ID']) . ',' . ReplaceSqlPointeur($reqDonneeCible['ID_DONNEE']) . ',' . BoolMSSql($actionDon['CRITERE_SEL']) . ')';
                                                                        $pile->addSql($sql);
                                                                        
                                                                        $sql = 'select * from DOA_ACTIONS_DATA with (nolock) ' . 'where TYPE_OBJET = \'' . ReplaceSqlPointeur($actionDon['TYPE_OBJET']) . '\' ' . 'and   ID_OBJET   = ' . ReplaceSqlPointeur($actionDon['ID_OBJET']) . ' ' . 'and   ID_TACHE   = ' . ReplaceSqlPointeur($actionDon['ID_TACHE']) . ' ' . 'and   ID_ACTION  = ' . ReplaceSqlPointeur($actionDon['ID_ACTION']) . ' ' . 'and   ID_DONNEE  = ' . ReplaceSqlPointeur($actionDon['ID_DONNEE']) . ' ';
                                                                        if ($listeActionData = (new RequeteSQL($sql, DB_OXASQLDB))->TrouveTous())
                                                                            foreach ($listeActionData as & $actionData) {
                                                                                $sqlOld = "select * from DOA_DATA with (nolock) " . 'where TYPE_OBJET = \'' . ReplaceSqlPointeur($actionData['TYPE_OBJET']) . '\' ' . 'and   ID_OBJET   =  ' . ReplaceSqlPointeur($actionData['ID_OBJET']) . ' ' . 'and   ID_DONNEE  =  ' . ReplaceSqlPointeur($actionData['ID_DONNEE']) . ' ' . 'and   ID_DATA    =  ' . ReplaceSqlPointeur($actionData['ID_DATA']) . ' ';
                                                                                if ($reqDataOld = (new RequeteSQL($sqlOld, DB_OXASQLDB))->Trouve1()) {
                                                                                    /**
                                                                                     * Meme remarque pour les datas
                                                                                     */
                                                                                    $sql = "select * from DOA_DATA with (nolock) " . 'where TYPE_OBJET = \'' . ReplaceSqlPointeur($newTypeObject) . '\' ' . 'and   ID_OBJET   = ' . ReplaceSqlPointeur($newIdObject) . ' ' . 'and   ID_DONNEE  = ' . ReplaceSqlPointeur($reqDonneeCible['ID_DONNEE']) . ' ' . 'and   NOM_DATA  = \'' . ReplaceSqlPointeur($reqDataOld['NOM_DATA']) . '\' ';
                                                                                    
                                                                                    if ($reqDataCible = (new RequeteSQL($sql, DB_OXASQLDB))->Trouve1()) {
                                                                                        $sql = 'select * from DOA_ACTIONS_DATA with (nolock) ' . 'where TYPE_OBJET = \'' . ReplaceSqlPointeur($newTypeObject) . '\' ' . 'and   ID_OBJET   = ' . ReplaceSqlPointeur($newIdObject) . ' ' . 'and   ID_TACHE   = ' . ReplaceSqlPointeur($newIdTaches) . ' ' . 'and   ID_ACTION  = ' . ReplaceSqlPointeur($reqLastIdAction['ID']) . ' ' . 'and   ID_DONNEE  = ' . ReplaceSqlPointeur($reqDataCible['ID_DONNEE']) . ' ' . 'and   ID_DATA    = ' . ReplaceSqlPointeur($reqDataCible['ID_DATA']) . ' ';
                                                                                        if ($reqDonData = (new RequeteSQL($sql, DB_OXASQLDB))->Trouve1()) {
                                                                                            // DEJA EXISTANT VIA UNE AUTRE TACHE DONC RIEN
                                                                                        } else {
                                                                                            $sql = 'insert into DOA_ACTIONS_DATA (TYPE_OBJET,ID_OBJET,ID_TACHE,ID_ACTION,ID_DONNEE,ID_DATA,AFFICHEE,MODIFIABLE) values ' . '(\'' . ReplaceSqlPointeur($newTypeObject) . '\'' . ',' . ReplaceSqlPointeur($newIdObject) . ',' . ReplaceSqlPointeur($newIdTaches) . ',' . ReplaceSqlPointeur($reqLastIdAction['ID']) . ',' . ReplaceSqlPointeur($reqDataCible['ID_DONNEE']) . ',' . ReplaceSqlPointeur($reqDataCible['ID_DATA']) . ',' . BoolMSSql($actionData['AFFICHEE']) . ',' . BoolMSSql($actionData['MODIFIABLE']) . ')';
                                                                                            $pile->addSql($sql);
                                                                                        }
                                                                                    }
                                                                                } else {
                                                                                    // Dossier 27132 : On peut avoir un DOA_ACTIONS_DATA sans DOA_DATA
                                                                                    // echo 'Cette data aurait du etre trouve :', $sqlOld; exit;
                                                                                }
                                                                            }
                                                                    }
                                                                } else {
                                                                    // SI ON TOMBE ICI C'est un bug dans les affectation de données au début et donc il y corruption du système
                                                                    echo 'BUG', $sql;
                                                                    exit();
                                                                }
                                                            }
                                                        
                                                        $sql = 'select * from DOA_ACTIONS_ACTEURS with (nolock) ' . 'where TYPE_OBJET = \'' . ReplaceSqlPointeur($action['TYPE_OBJET']) . '\' ' . 'and   ID_OBJET   = ' . ReplaceSqlPointeur($action['ID_OBJET']) . ' ' . 'and   ID_TACHE   = ' . ReplaceSqlPointeur($action['ID_TACHE']) . ' ' . 'and   ID_ACTION  = ' . ReplaceSqlPointeur($action['ID_ACTION']) . ' ';
                                                        if ($listeActionActeur = (new RequeteSQL($sql, DB_OXASQLDB))->TrouveTous())
                                                            foreach ($listeActionActeur as & $actionActeur) {
                                                                if ($actionActeur['ROLE'] == 'R') { // Uniquement dans le cas du role responsable il y a un traitement particulier vis à vis des modèles
                                                                    switch ($actionActeur['TYPE_ELEM']) {
                                                                        case DOA::ACTEUR_TACHE_CODE_PROPRIETAIRE:
                                                                            $codeActeur = $reqDoa['PROPRIETAIRE'];
                                                                            $typeElem = '';
                                                                            $idElem = '';
                                                                            $typeActeur = '';
                                                                            break;
                                                                        case DOA::ACTEUR_TACHE_CODE_PRESCRIPTEUR:
                                                                            $codeActeur = $reqDoa['PRESCRIPTEUR'];
                                                                            $typeElem = '';
                                                                            $idElem = '';
                                                                            $typeActeur = '';
                                                                            break;
                                                                        default:
                                                                            $codeActeur = $actionActeur['CODE_ACTEUR'];
                                                                            $typeElem = '';
                                                                            $idElem = '';
                                                                            $typeActeur = '';
                                                                            break;
                                                                    }
                                                                } else {
                                                                    switch ($actionActeur['TYPE_ELEM']) {
                                                                        case DOA::ACTEUR_TACHE_CODE_PROPRIETAIRE:
                                                                            $codeActeur = $reqDoa['PROPRIETAIRE'];
                                                                            $typeElem = '';
                                                                            $idElem = '';
                                                                            $typeActeur = '';
                                                                            break;
                                                                        case DOA::ACTEUR_TACHE_CODE_PRESCRIPTEUR:
                                                                            $codeActeur = $reqDoa['PRESCRIPTEUR'];
                                                                            $typeElem = '';
                                                                            $idElem = '';
                                                                            $typeActeur = '';
                                                                            break;
                                                                        default:
                                                                            $codeActeur = $actionActeur['CODE_ACTEUR'];
                                                                            $idElem = $actionActeur['ID_ELEM'];
                                                                            $typeActeur = $actionActeur['TYPE_ACTEUR'];
                                                                            $typeElem = $actionActeur['TYPE_ELEM'];
                                                                            break;
                                                                    }
                                                                }
                                                                
                                                                $reqSql = SqlDoaTache::rqDOA_AjouterActionActeur($newTypeObject, $newIdObject, $newIdTaches, $reqLastIdAction['ID'], $actionActeur['ROLE'], $codeActeur, $actionActeur['EMAIL'], $typeElem, $idElem, $typeActeur);
                                                                $pile->AddRequeteSql($reqSql);
                                                            }
                                                    }
                                                }
                                            }
                                        }
                                    } else {
                                        // La liaison est certainement faite avec une arborescence DONC NORMAL
                                    }
                        }
                    
                    DOA::copieDoaTachesH($pile, $arrayMemoire, $oldTypeObject, $oldIdObject, $newTypeObject, $newIdObject, $tachesH['ID_TACHE_H'], $reqLastId['ID'], $dateTachesDeb);
                }
            }
    }

    /**
     * Recopie tout ce qui se trouve depuis un parent doar_act => donnee, data, action ....
     *
     * @param unknown $oldTypeObject
     * @param unknown $oldIdObject
     * @param unknown $newTypeObject
     * @param unknown $newIdObject
     * @param number $idParent
     */
    public static function copieDoarCat($pile, $oldTypeObject, $oldIdObject, $newTypeObject, $newIdObject, $idOldParent = 0, $idNewParent = 0)
    {
        if ($listeCatOrigine = (SqlDoaReferentiel::rqGetSqlDoaCategorieFille($oldTypeObject, $oldIdObject, $idOldParent)->TrouveTous()))
            foreach ($listeCatOrigine as & $catOrigine) {
                $reqMaj = SqlDoa::rqInsertDoarCat($newTypeObject, $newIdObject, $idNewParent, $catOrigine['LIB'], $catOrigine['DESCR'], $catOrigine['NUM_ORDRE']);
                if ($pile->AddRequeteSql($reqMaj))
                    if ($reqLastId = (SqlDoaReferentiel::rqGetLastIdFromCateg($newTypeObject, $newIdObject)->Trouve1())) {
                        /**
                         * Copie des données, data
                         */
                        if ($reqDonneeSource = SqlDoaReferentiel::rqGetDonneeCategorie($catOrigine['ID'], $oldTypeObject, $oldIdObject)->TrouveTous())
                            foreach ($reqDonneeSource as & $donneSource)
                                DOA::insertStructureHeritage($pile, $oldTypeObject, $oldIdObject, $newTypeObject, $newIdObject, $reqLastId['ID'], $donneSource['ID_DONNEE'], $donneSource['NOM_DONNEE'], $donneSource['DESCR'], $donneSource['MULTIPLE'], $donneSource['LIE_A_OBJET'], $donneSource['OBJET']);
                        
                        DOA::copieDoarCat($pile, $oldTypeObject, $oldIdObject, $newTypeObject, $newIdObject, $catOrigine['ID'], $reqLastId['ID']);
                    }
            }
    }

    public static function insertStructureHeritage($pile, $oldTypeObject, $oldIdObject, $TYPE_OBJET, $ID_OBJET, $idCatCible, $idDonnee, $NOM_DONNEE, $DESCR, $MULTIPLE, $LIE_A_OBJET, $OBJET)
    {
        $reqSql = SqlDoaReferentiel::rqInsertDoaStruct($TYPE_OBJET, $ID_OBJET, $idCatCible, $idDonnee, $NOM_DONNEE, $DESCR, $MULTIPLE, $LIE_A_OBJET, $OBJET);
        $pile->AddRequeteSql($reqSql);
        if ($retourCreat = SqlDoaReferentiel::rqGetLastIdFromDonne($TYPE_OBJET, $ID_OBJET)->trouve1()) {
            $sql = 'select * from DOA_DATA with (nolock) ' . 'where DOA_DATA.TYPE_OBJET = \'' . ReplaceSqlPointeur($oldTypeObject) . '\' ' . 'and   DOA_DATA.ID_OBJET   = ' . ReplaceSqlPointeur($oldIdObject) . ' ' . 'and   DOA_DATA.ID_DONNEE  = ' . ReplaceSqlPointeur($idDonnee) . ' ' . 'order BY DOA_DATA.ID_DONNEE, DOA_DATA.ID_DATA';
            
            if ($listeData = (new RequeteSQL($sql, DB_OXASQLDB))->TrouveTous())
                foreach ($listeData as & $data)
                    DOA::ajoutDataVersObjet($pile, $data, $TYPE_OBJET, $ID_OBJET, $retourCreat['ID']);
        } else
            $pile->setPileError();
    }

    public static function &BuildXmlResumeDOA()
    {
        $infoDoaAll = null;
        
        // $reqSqlAll = SqlDoa::rqGetInfoSuiviDoaMode(false)->TrouveTous();
        
        if ($reqSqlAll = SqlDoa::rqGetDOATDBOperationnel($_SESSION['Session_Login'])->TrouveTous())
            foreach ($reqSqlAll as & $value) {
                $infoDoaAll[] = array(
                    '!ID' => $value['ID'],
                    '!MODELE' => BoolSql($value['MODELE']),
                    '!REF' => $value['REF'],
                    '!LIB' => $value['LIB'],
                    '!DESCR' => $value['DESCR'],
                    '!TYPE_DOSSIER' => DOA::TypeDossier($value['ID_TYPE']),
                    '!OPERATION' => DOA::Operation($value['CODE_OPE']),
                    '!PROPRIETAIRE' => $value['PROPRIETAIRE'],
                    '!STATUT' => $value['STATUT'],
                    '!ETAT_AV' => DOA::EtatAvancement($value['ID_ETAT_AV']),
                    '!PRESCRIPTEUR' => $value['PRESCRIPTEUR'],
                    '!CTR_EMETT' => $value['CTR_EMETT'],
                    '!DATE_CREAT' => convertDateSqlToFr($value['DATE_CREAT']),
                    '!DATE_DEB' => convertDateSqlToFr($value['DATE_DEB']),
                    '!DATE_FIN' => convertDateSqlToFr($value['DATE_FIN']),
                    '!ID_CAL' => $value['ID_CAL'],
                    '!AFFICHER_DOA' => 'CallUrl(\'DOA.php?action=AfficherDOA&ancrage=men_gene&menu=tdb&ID=' . $value['ID'] . '&est_modele=' . BoolSql($value['MODELE']) . '\');window.scrollTo(0,0);',
                    '!ID_TYPE' => $value['ID_TYPE'],
                    '!CODE_OPE' => $value['CODE_OPE'],
                    '!ID_ETAT_AV' => $value['ID_ETAT_AV']
                    // A refaire au cas ou car affiche une seule tache donc pas correcte ,'!TACHE' => DOA::getLibTache('D',$value['ID'])
                );
            }
        return $infoDoaAll;
    }

    public static function EtatAvancement(& $id)
    {
        $EtatAv = SqlDoaReferentiel::rqGetDoaEtatAv($id)->Trouve1();
        return $EtatAv['LIB'];
    }

    public static function TypeDossier(& $id)
    {
        $TypeDossier = SqlDoaReferentiel::rqGetTypeDossier($id)->Trouve1();
        return $TypeDossier['LIB'];
    }

    public static function Operation(& $code)
    {
        $Operation = SqlDoaReferentiel::rqDOAGetListeOperation($code)->Trouve1();
        return $Operation['LIB'];
    }

    public static function ModeleDoa(& $id)
    {
        $ModeleDoa = SqlDoa::rqGetInfoSuiviDoa($id)->Trouve1();
        return $ModeleDoa['MODELE'];
    }

    public static function GetStatut($id)
    {
        $reqSql = SqlDoa::rqGetInfoSuiviDoa($id)->Trouve1();
        return (is_array($reqSql) ? $reqSql['STATUT'] : '');
    }

    public static function &BuildXmlDOA($menu, $mode, $id)
    {
        $array = array();
        $array['ide']['fiche']['!menu'] = $menu;
        $array['ide']['fiche']['!mode'] = $mode;
        
        $reqSql = SqlDoa::rqGetInfoSuiviDoa($id)->TrouveTous();
        $reqSqlAll = SqlDoa::rqGetInfoSuiviDoaMode(false)->TrouveTous();
        
        if (is_array($reqSql))
            foreach ($reqSql as & $value) {
                $infoDoa[] = array(
                    '!ID' => $value['ID'],
                    '!MODELE' => BoolSql($value['MODELE']),
                    '!REF' => $value['REF'],
                    '!LIB' => $value['LIB'],
                    '!DESCR' => $value['DESCR'],
                    '!TYPE_DOSSIER' => DOA::TypeDossier($value['ID_TYPE']),
                    '!OPERATION' => DOA::Operation($value['CODE_OPE']),
                    '!PROPRIETAIRE' => $value['PROPRIETAIRE'],
                    '!STATUT' => $value['STATUT'],
                    '!ETAT_AV' => DOA::EtatAvancement($value['ID_ETAT_AV']),
                    '!PRESCRIPTEUR' => $value['PRESCRIPTEUR'],
                    '!CTR_EMETT' => $value['CTR_EMETT'],
                    '!DATE_CREAT' => convertDateSqlToFr($value['DATE_CREAT']),
                    '!DATE_DEB' => convertDateSqlToFr($value['DATE_DEB']),
                    '!DATE_FIN' => convertDateSqlToFr($value['DATE_FIN']),
                    '!ID_CAL' => $value['ID_CAL'],
                    '!EDITER_DOA' => 'window.open(\'DOA.php?action=EditerDOA&id=' . $value['ID'] . '\',\'win_pop\',\'width=1000,height=100\');',
                    '!AFFICHER_DOA_DONNEES' => 'CallUrl(\'DOA.php?action=AfficherDOA&ancrage=men_gene&onglet=donnees&menu=' . $menu . '&id=' . $value['ID'] . '\');window.scrollTo(0,0);',
                    '!AFFICHER_DOA_TACHES' => 'CallUrl(\'DOA.php?action=AfficherDOA&ancrage=men_gene&onglet=taches&menu=' . $menu . '&id=' . $value['ID'] . '\');window.scrollTo(0,0);',
                    '!AFFICHER_DOA_PLANNING' => 'CallUrl(\'DOA.php?action=AfficherDOA&ancrage=men_gene&onglet=planning&menu=' . $menu . '&id=' . $value['ID'] . '\');window.scrollTo(0,0);',
                    '!AFFICHER_DOA_DOCUMENTS' => 'CallUrl(\'DOA.php?action=AfficherDOA&ancrage=men_gene&onglet=documents&menu=' . $menu . '&id=' . $value['ID'] . '\');window.scrollTo(0,0);',
                    '!AFFICHER_DOA_SOCIETES' => 'CallUrl(\'DOA.php?action=AfficherDOA&ancrage=men_gene&onglet=societes&menu=' . $menu . '&id=' . $value['ID'] . '\');window.scrollTo(0,0);',
                    '!AFFICHER_DOA_ELEMENTS' => 'CallUrl(\'DOA.php?action=AfficherDOA&ancrage=men_gene&onglet=elements&menu=' . $menu . '&id=' . $value['ID'] . '\');window.scrollTo(0,0);',
                    '!MODELE_DOA' => (DOA::ModeleDoa($value['ID']) == 1) ? 'disabled' : '',
                    '!EST_DATE' => '1',
                    '!CALENDRIER' => 'javascript:alert("Bientôt, un calendrier");'
                );
            }
        
        if (is_array($reqSqlAll))
            foreach ($reqSqlAll as & $value)
                $infoDoaAll[] = array(
                    '!ID' => $value['ID'],
                    '!MODELE' => BoolSql($value['MODELE']),
                    '!REF' => $value['REF'],
                    '!LIB' => $value['LIB'],
                    '!DESCR' => $value['DESCR'],
                    '!TYPE_DOSSIER' => DOA::TypeDossier($value['ID_TYPE']),
                    '!OPERATION' => DOA::Operation($value['CODE_OPE']),
                    '!PROPRIETAIRE' => $value['PROPRIETAIRE'],
                    '!STATUT' => $value['STATUT'],
                    '!ETAT_AV' => DOA::EtatAvancement($value['ID_ETAT_AV']),
                    '!PRESCRIPTEUR' => $value['PRESCRIPTEUR'],
                    '!CTR_EMETT' => $value['CTR_EMETT'],
                    '!DATE_CREAT' => convertDateSqlToFr($value['DATE_CREAT']),
                    '!DATE_DEB' => convertDateSqlToFr($value['DATE_DEB']),
                    '!DATE_FIN' => convertDateSqlToFr($value['DATE_FIN']),
                    '!ID_CAL' => $value['ID_CAL'],
                    '!AFFICHER_DOA' => 'CallUrl(\'DOA.php?action=AfficherDOA&ancrage=men_gene&menu=tdb&id=' . $value['ID'] . '\');window.scrollTo(0,0);',
                    '!ID_TYPE' => $value['ID_TYPE'],
                    '!CODE_OPE' => $value['CODE_OPE'],
                    '!ID_ETAT_AV' => $value['ID_ETAT_AV']
                );
        
        $array['ide']['fiche']['DOA'] = $infoDoa;
        $array['ide']['fiche']['DOA_ALL'] = $infoDoaAll;
        
        $array['ide']['fiche']['!edit_doa'] = "window.open('DOA.php?action=EditerDOA','win_pop','width=1000,height=100');";
        $array['ide']['fiche']['!enregistrer_suivi'] = 'Traite(\'DOA.php?action=ModifierDOA\',document.form_editer_doa.elements[0]);return false;';
        
        $array['ide']['!btn_deplier_familles'] = 'javascript: developCritereRecherche("develop_panel_familles","panel_familles");';
        $array['ide']['!btn_deplier_cadres'] = 'javascript: developCritereRecherche("develop_panel_cadres","panel_cadres");';
        $array['ide']['!btn_deplier_zone_geo'] = 'javascript: developCritereRecherche("develop_panel_zone_geo","panel_zone_geo");';
        
        // gestion onglet DOA
        $array['ide']['fiche']['!afficher_doa_donnees'] = "CallUrl('DOA.php?action=AfficherDOA&ancrage=men_gene&onglet=donnees&menu={$menu}');window.scrollTo(0,0);";
        $array['ide']['fiche']['!afficher_doa_taches'] = "CallUrl('DOA.php?action=AfficherDOA&ancrage=men_gene&onglet=taches&menu={$menu}');window.scrollTo(0,0);";
        $array['ide']['fiche']['!afficher_doa_planning'] = "CallUrl('DOA.php?action=AfficherDOA&ancrage=men_gene&onglet=planning&menu={$menu}');window.scrollTo(0,0);";
        $array['ide']['fiche']['!afficher_doa_documents'] = "CallUrl('DOA.php?action=AfficherDOA&ancrage=men_gene&onglet=documents&menu={$menu}');window.scrollTo(0,0);";
        $array['ide']['fiche']['!afficher_doa_societes'] = "CallUrl('DOA.php?action=AfficherDOA&ancrage=men_gene&onglet=societes&menu={$menu}');window.scrollTo(0,0);";
        $array['ide']['fiche']['!afficher_doa_elements'] = "CallUrl('DOA.php?action=AfficherDOA&ancrage=men_gene&onglet=elements&menu={$menu}');window.scrollTo(0,0);";
        
        $array['fenetre']['!titre'] = trad('DOA');
        
        return $array;
    }

    public static function &BuildXmlDOAModele($ID = '')
    {
        $array = null;
        
        if ($ID == '') {
            if ($reqSql = SqlDoa::rqGetInfoSuiviDoaMode(true)->TrouveTous()) {
                foreach ($reqSql as &$value) {
                    $array[] = array(
                        'ID' => array(
                            '!id' => DOA_Entete::id_ID,
                            '!value' => $value['ID']
                        ),
                        'LIB' => array(
                            '!id' => DOA_Entete::id_LIB,
                            '!value' => $value['LIB']
                        ),
                        'REF' => array(
                            '!id' => DOA_Entete::id_REF,
                            '!value' => $value['REF']
                        ),
                        'MODELE' => array(
                            '!id' => DOA_Entete::id_MODELE,
                            '!value' => $value['MODELE']
                        ),
                        'DESCR' => array(
                            '!id' => DOA_Entete::id_DESCR,
                            '!value' => $value['DESCR']
                        ),
                        'ID_TYPE' => array(
                            '!id' => DOA_Entete::id_ID_TYPE,
                            '!value' => DOA::TypeDossier($value['ID_TYPE'])
                        ),
                        'CODE_OPE' => array(
                            '!id' => DOA_Entete::id_CODE_OPE,
                            '!value' => $value['CODE_OPE']
                        ),
                        'PROPRIETAIRE' => array(
                            '!id' => DOA_Entete::id_PROPRIETAIRE,
                            '!value' => $value['PROPRIETAIRE']
                        ),
                        'STATUT' => array(
                            '!id' => DOA_Entete::id_STATUT,
                            '!value' => $value['STATUT']
                        ),
                        'ID_ETAT_AV' => array(
                            '!id' => DOA_Entete::id_ID_ETAT_AV,
                            '!value' => $value['ID_ETAT_AV']
                        ),
                        'PRESCRIPTEUR' => array(
                            '!id' => DOA_Entete::id_PRESCRIPTEUR,
                            '!value' => $value['PRESCRIPTEUR']
                        ),
                        'CTR_EMETT' => array(
                            '!id' => DOA_Entete::id_CTR_EMETT,
                            '!value' => $value['CTR_EMETT']
                        ),
                        'DATE_CREAT' => array(
                            '!id' => DOA_Entete::id_DATE_CREAT,
                            '!value' => $value['DATE_CREAT']
                        ),
                        'DATE_DEB' => array(
                            '!id' => DOA_Entete::id_DATE_DEB,
                            '!value' => convertDateSqlToFr($value['DATE_DEB'])
                        ),
                        'DATE_FIN' => array(
                            '!id' => DOA_Entete::id_DATE_FIN,
                            '!value' => convertDateSqlToFr($value['DATE_FIN'])
                        ),
                        'ID_CAL' => array(
                            '!id' => DOA_Entete::id_ID_CAL,
                            '!value' => $value['ID_CAL']
                        ),
                        '!CREER_DOA' => 'CallUrl(\'DOA.php?action=CreationDOASimple&ID=' . $value['ID'] . '&est_modele=false&new=0\');window.scrollTo(0,0);'
                    );
                }
            }
        } else {
            if ($reqSql = SqlDoa::rqGetDoaModele(true, $ID)->TrouveTous()) {
                foreach ($reqSql as &$value) {
                    $array[] = array(
                        'ID' => array(
                            '!id' => DOA_Entete::id_ID,
                            '!value' => $value['ID']
                        ),
                        'LIB' => array(
                            '!id' => DOA_Entete::id_LIB,
                            '!value' => $value['LIB']
                        ),
                        'REF' => array(
                            '!id' => DOA_Entete::id_REF,
                            '!value' => $value['REF']
                        ),
                        'MODELE' => array(
                            '!id' => DOA_Entete::id_MODELE,
                            '!value' => $value['MODELE']
                        ),
                        'DESCR' => array(
                            '!id' => DOA_Entete::id_DESCR,
                            '!value' => $value['DESCR']
                        ),
                        'ID_TYPE' => array(
                            '!id' => DOA_Entete::id_ID_TYPE,
                            '!value' => DOA::TypeDossier($value['ID_TYPE'])
                        ),
                        'CODE_OPE' => array(
                            '!id' => DOA_Entete::id_CODE_OPE,
                            '!value' => $value['CODE_OPE']
                        ),
                        'PROPRIETAIRE' => array(
                            '!id' => DOA_Entete::id_PROPRIETAIRE,
                            '!value' => $value['PROPRIETAIRE']
                        ),
                        'STATUT' => array(
                            '!id' => DOA_Entete::id_STATUT,
                            '!value' => $value['STATUT']
                        ),
                        'ID_ETAT_AV' => array(
                            '!id' => DOA_Entete::id_ID_ETAT_AV,
                            '!value' => $value['ID_ETAT_AV']
                        ),
                        'PRESCRIPTEUR' => array(
                            '!id' => DOA_Entete::id_PRESCRIPTEUR,
                            '!value' => $value['PRESCRIPTEUR']
                        ),
                        'CTR_EMETT' => array(
                            '!id' => DOA_Entete::id_CTR_EMETT,
                            '!value' => $value['CTR_EMETT']
                        ),
                        'DATE_CREAT' => array(
                            '!id' => DOA_Entete::id_DATE_CREAT,
                            '!value' => $value['DATE_CREAT']
                        ),
                        'DATE_DEB' => array(
                            '!id' => DOA_Entete::id_DATE_DEB,
                            '!value' => convertDateSqlToFr($value['DATE_DEB'])
                        ),
                        'DATE_FIN' => array(
                            '!id' => DOA_Entete::id_DATE_FIN,
                            '!value' => convertDateSqlToFr($value['DATE_FIN'])
                        ),
                        'ID_CAL' => array(
                            '!id' => DOA_Entete::id_ID_CAL,
                            '!value' => $value['ID_CAL']
                        ),
                        '!CREER_DOA' => 'CallUrl(\'DOA.php?action=CreationDOASimple&ID=' . $value['ID'] . '&est_modele=false&new=0\');window.scrollTo(0,0);'
                    );
                }
            }
        }
        
        $array['ide']['TAB_MODELE']['!id'] = DOA::id_TAB_MODELE;
        $array['ide']['fiche']['!creation_doa'] = 'CallUrl(\'DOA.php?action=CreationDOASimple&est_modele=false&new=1\');';
        
        return $array;
    }

    static function &Javascript_Type_Dossier()
    {
        $js = 'CallUrl(\'DOA.php?action=SelectTypeDossier&ID=\'+this.value+\'&est_modele=true&new=0\');';
        return $js;
    }

    public static function &BuildXmlTypeDossier()
    {
        $array = null;
        
        if ($reqSql = SqlDoaReferentiel::rqDOAGetListeTypeDossierFeuille()->TrouveTous()) {
            foreach ($reqSql as &$value) {
                $array[] = array(
                    '!ID' => $value['ID'],
                    '!ID_PARENT' => $value['ID_PARENT'],
                    '!LIB' => $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']
                );
            }
        }
        $array['ide']['TYPE_DOSSIER']['!onchange'] = DOA::Javascript_Type_Dossier();
        
        return $array;
    }

    public static function &getXMLArrayValidation($action)
    {
        $array = null;
        
        $array['fiche']['!title'] = 'frm_validation';
        $array['form']['name']['!value'] = 'frm_validation';
        $array['wsdl'] = DOA::getWsdlRetour();
        $array['execution']['!value'] = "CallUrl('popup_doa_validation.php','action={$action}F');return false;";
        if ($action == 'ValiderDOA' || $action == 'ValiderDOAF') {
            $array['popup_title'] = trad('Information validation de la DOA');
            $array['execution']['!title'] = trad('Passer le DOA du mode préparation au mode encours');
            $array['execution']['!texte'] = trad('Valider le DOA');
        } else {
            $array['popup_title'] = trad('Information clôture de DOA');
            $array['execution']['!title'] = trad('Clôturer le DOA');
            $array['execution']['!texte'] = trad('Clôturer le DOA');
        }
        
        return $array;
    }

    public static function &getWsdlRetour()
    {
        $client = new SopaClientOxa('//localhost', false);
        return FluxXml::getFlux($client, DOA::WSDL_TMP);
    }

    public static function setForceValidation($action)
    {
        $xml = DOA::getWsdlRetour();
        
        DOA_Entete::ValiderCloturerDOA($xml['ID_DOA'], true, $action);
    }

    /**
     *
     * @param unknown $listJourChome
     * @param unknown $objDate
     * @return boolean
     */
    public static function isJourChome($listJourChome, $objDate)
    {
        if (is_null($listJourChome) || is_null($objDate))
            return false;
        
        $libJourSemaine = OxalysBib::getNomJourFromDateTime($objDate);
        if (is_null($libJourSemaine))
            return false;
        
        foreach ($listJourChome as & $libJour)
            if (strtoupper($libJour) == strtoupper($libJourSemaine))
                return true;
        
        return false;
    }

    /**
     *
     * @param unknown $idCal
     * @param unknown $objDate
     */
    public static function isJourFerie($idCal, $objDate)
    {
        $sql = 'select null from DOAR_JF with (nolock) ' . 'WHERE ID_CAL = ' . ReplaceSqlPointeur($idCal) . ' ' . 'AND   DATE_JOUR = \'' . date_format($objDate, 'Ymd') . '\' ';
        
        if ($reqRetour = (new RequeteSQL($sql, DB_OXASQLDB))->Trouve1())
            return true;
        return false;
    }

    public static function getListeActeurModele()
    {
        $liste = array(
            DOA::TACHE_CODE_PROPRIETAIRE => trad('Propriétaire du DOA'),
            DOA::TACHE_CODE_PRESCRIPTEUR => trad('Prescripteur du DOA'),
            '' => trad('A renseigner dans le DOA')
        );
        return $liste;
    }

    /**
     *
     * @param unknown $pile
     * @param unknown $data
     * @param unknown $TYPE_OBJET
     *            (object cible)
     * @param unknown $ID_OBJET
     *            (object cible)
     * @param unknown $ID_DONNEE
     *            (object cible)
     */
    public static function ajoutDataVersObjet($pile, $data, $TYPE_OBJET, $ID_OBJET, $ID_DONNEE)
    {
        if ($data['ID_DATA_LIEE'] > 0) {
            /**
             * Ce cas est normalement impossible sauf si vu le nombre de bug trouve en fait
             * c'est une grosse boulette entre la notion de lié à un object (au sens donnée /data)
             * et la notion de data lié à un object au sens de data intercomunicante vis à vis d'une donnée
             */
            if ($data['TYPE_OBJET'] == 'B') {
                $sqlRech = 'select * from DOA_DATA with (nolock) ' . 'where TYPE_OBJET = \'' . ReplaceSqlPointeur($TYPE_OBJET) . '\' ' . 'and   ID_OBJET   =   ' . ReplaceSqlPointeur($ID_OBJET) . ' ' . 'and   ID_DONNEE  =   ' . ReplaceSqlPointeur($ID_DONNEE) . ' ' . 'and   ID_STRUCT   =  ' . ReplaceSqlPointeur($data['ID_DATA_LIEE']) . ' ' . 'and   ID_DATA_LIEE = 0 ';
                
                if ($dataLieeCible = (new RequeteSQL($sqlRech, DB_OXASQLDB))->Trouve1())
                    $newIdDataLiee = $dataLieeCible['ID_DATA'];
                else
                    $newIdDataLiee = null;
            } else {
                /**
                 * La il faut remonter sur la bibliotheques pour avoir L'ID de reference et ensuite retouver dans l'enveloppe en cours qui a l'ID_STUCT dessus
                 */
                $sqlRech = 'select * from DOA_DATA with (nolock) ' . 'where TYPE_OBJET = \'B\' ' . 'and   ID_OBJET   = 0 ' . 'and   ID_DATA   =   ' . ReplaceSqlPointeur($data['ID_STRUCT']);
                if ($dataLieeCible = (new RequeteSQL($sqlRech, DB_OXASQLDB))->Trouve1()) {
                    $idDataLiee = $dataLieeCible['ID_DATA_LIEE'];
                    
                    $sqlRech = 'select * from DOA_DATA with (nolock) ' . 'where TYPE_OBJET = \'' . ReplaceSqlPointeur($TYPE_OBJET) . '\' ' . 'and   ID_OBJET   =   ' . ReplaceSqlPointeur($ID_OBJET) . ' ' . 'and   ID_DONNEE  =   ' . ReplaceSqlPointeur($ID_DONNEE) . ' ' . 'and   ID_STRUCT   =  ' . ReplaceSqlPointeur($idDataLiee) . ' ' . 'and   ID_DATA_LIEE = 0 ';
                    
                    if ($dataLieeCible = (new RequeteSQL($sqlRech, DB_OXASQLDB))->Trouve1())
                        $newIdDataLiee = $dataLieeCible['ID_DATA'];
                    else
                        $newIdDataLiee = null;
                } else
                    $newIdDataLiee = null;
            }
        } else
            $newIdDataLiee = 0;
        
        if (! is_null($newIdDataLiee)) {
            /**
             * Attention il faut verifier que la data qui est demandé à ajouter n'est pas déjà existante au niveau du nom pour une data et dans ce cas il faut simplement
             * remettre l'heritage et le tag merge
             */
            $majDb = false;
            if ($data['DATA_LIE_A_OBJ'] && $newIdDataLiee != 0) {
                $where = 'where TYPE_OBJET = \'' . ReplaceSqlPointeur($TYPE_OBJET) . '\' ' . 'and   ID_OBJET   =   ' . ReplaceSqlPointeur($ID_OBJET) . ' ' . 'and   ID_DONNEE  =   ' . ReplaceSqlPointeur($ID_DONNEE) . ' ' . 'and   DATA_LIE_A_OBJ = 0x54 ' . 'and   ID_DATA_LIEE = ' . ReplaceSqlPointeur($newIdDataLiee) . ' ' . 'and   CHAMP_OBJET_DATA = \'' . ReplaceSqlPointeur($data['CHAMP_OBJET_DATA']) . '\' ';
                
                $sql = 'select * from DOA_DATA with (nolock) ' . $where;
                if ($dataRecherche = (new RequeteSQL($sqlRech, DB_OXASQLDB))->Trouve1()) {
                    $sql = 'update DOA_DATA ' . 'set ID_STRUCT = ' . ($data['TYPE_OBJET'] == 'B' ? ReplaceSqlPointeur($data['ID_DATA']) : ReplaceSqlPointeur($data['ID_STRUCT'])) . ' ' . ', TAG_MERGE = \'' . ReplaceSqlPointeur($data['TAG_MERGE']) . '\' ' . $where;
                    if ($pile->AddSql($sql))
                        $majDb = true;
                }
            }
            
            if (! $majDb) {
                $sql = 'insert into DOA_DATA (TYPE_OBJET,ID_OBJET,ID_DONNEE,NUM_ORDRE,NOM_DATA,LIE_A_OBJET,OBJET,FLAG_ID_OBJET,DATA_LIE_A_OBJ,OBJET_DATA,ID_OBJET_DATA,ID_DATA_LIEE,CHAMP_OBJET_DATA,CLE_UNIQUE,TYPE_DATA,A_LONG,N_NEGATIF_AUTO,N_PARTIE_ENT,N_PARTIE_DEC,MNT_DEVISE,FIC_GENERE,ID_FORMAT,TAG_MERGE,ID_STRUCT) values ' . '(\'' . ReplaceSqlPointeur($TYPE_OBJET) . '\'' . ',' . ReplaceSqlPointeur($ID_OBJET) . ',' . ReplaceSqlPointeur($ID_DONNEE) . ',' . ReplaceSqlPointeur($data['NUM_ORDRE']) . ',\'' . ReplaceSqlPointeur($data['NOM_DATA']) . '\'' . ',' . BoolMSSql($data['LIE_A_OBJET']) . '' . ',\'' . ReplaceSqlPointeur($data['OBJET']) . '\'' . ',' . BoolMSSql($data['FLAG_ID_OBJET']) . ',' . BoolMSSql($data['DATA_LIE_A_OBJ']) . ',\'' . ReplaceSqlPointeur($data['OBJET_DATA']) . '\'' . ',' . BoolMSSql($data['ID_OBJET_DATA']) . ',' . ReplaceSqlPointeur($newIdDataLiee) . ',\'' . ReplaceSqlPointeur($data['CHAMP_OBJET_DATA']) . '\'' . ',' . BoolMSSql($data['CLE_UNIQUE']) . ',\'' . ReplaceSqlPointeur($data['TYPE_DATA']) . '\'' . ',' . ReplaceSqlPointeur($data['A_LONG']) . ',' . BoolMSSql($data['N_NEGATIF_AUTO']) . ',' . (isset($data['N_PARTIE_ENT']) ? ReplaceSqlPointeur($data['N_PARTIE_ENT']) : 0) . ',' . (isset($data['N_PARTIE_DEC']) ? ReplaceSqlPointeur($data['N_PARTIE_DEC']) : 0) . ',\'' . ReplaceSqlPointeur($data['MNT_DEVISE']) . '\'' . ',' . BoolMSSql($data['FIC_GENERE']) . ',' . ReplaceSqlPointeur($data['ID_FORMAT']) . ',\'' . ReplaceSqlPointeur($data['TAG_MERGE']) . '\'' . ',' . ($data['TYPE_OBJET'] == 'B' ? ReplaceSqlPointeur($data['ID_DATA']) : ReplaceSqlPointeur($data['ID_STRUCT'])) . // L'heritage est uniquement relatif à la bibliotheque EN AUCUN FAIRE un lien entre DOA et MODELE => ID_STRUCT
')';
                $pile->AddSql($sql);
            }
        } else {
            /**
             * ATTENTION si ce cas de figure existe cela signifie que au seins d'une donnée, les informations de data en base sont corrompu
             * INTERDICTION de changer le code mais comprendre par contre pourquoi les data de données ont été crée anormalement
             */
            $pile->Affiche();
            Affichage::messageJS('PB IDLIEE :' . $sqlRech . '  Object origine ' . $data['ID_OBJET'] . '/' . $data['ID_DONNEE']);
            exit();
        }
    }
    
    //4474
    public static function generateMailDoA($id, $oldProprio,  $newProprio)
    {
        $desintaire = sqldoa::rqGetinfoUser($newProprio)->Trouve1();
        
        $listeCS = sqlCS::getInfoCS('DOA', $id)->TrouveTous();
        
        $infoMail = sqldoa::rqGetInfoForMail($id)->Trouve1();
        $infoProprio = sqldoa::rqGetinfoUser($newProprio)->Trouve1();
        
        $infoMail['NOM_ANCIEN_PROPRIETAIRE']  = sqldoa::rqGetinfoUser($oldProprio)->Trouve1()['NOM'];
        $infoMail['NOM_NOUVEAU_PROPRIETAIRE'] = $infoProprio['NOM'];
        $infoMail['NOM_UTILISATEUR_CONNECTE'] = sqldoa::rqGetinfoUser($_SESSION["Session_Login"])->Trouve1()['NOM'];
        
        $infoMail['DATE_DEB'] = convertDateSqlToFr($infoMail['DATE_DEB']);
        $infoMail['DATE_FIN'] = convertDateSqlToFr($infoMail['DATE_FIN']);
        
        $infoParamMail = sqldoa::rqGetInfoMailInterne('DOA_TRANSMISSION', $infoProprio['COD_LNG']??$_SESSION['Session_Langue'])->Trouve1();
        $infoParamMailGlobal = sqldoa::rqGetInfoMailInterne('DOA_TRANSMISSION')->Trouve1();
        
        if($infoParamMail && $infoParamMail['CONTMEMO'] != '')
        {
            $sujet = wsdl::replaceVariable($infoParamMail['TX_SUJET'], $infoMail);
            $message = wsdl::replaceVariable($infoParamMail['CONTMEMO'], $infoMail, $listeCS);
        }
        elseif($infoParamMailGlobal && $infoParamMailGlobal['CONTMEMO'] != '')
        {
            $sujet = wsdl::replaceVariable($infoParamMailGlobal['TX_SUJET'], $infoMail);
            $message = wsdl::replaceVariable($infoParamMailGlobal['CONTMEMO'], $infoMail, $listeCS);
        }
        else
        {
            $sujet = Trad('DOA').' : '.$infoMail['REF'].' - '.$infoMail['LIB'];
            
            $message = strBuild(trad(
'@1@
@2@
@3@
@4@
Date début @5@ - date fin @6@
Signature : @7@'), $infoMail['REF'],$infoMail['NOM_PRESCRIPTEUR'],$infoMail['LIB'],$infoMail['DESCR'], $infoMail['DATE_DEB'], $infoMail['DATE_FIN'], $infoMail['NOM_UTILISATEUR_CONNECTE']);
            
        }
        
        $sujet = htmlspecialchars($sujet);
        $message = htmlspecialchars($message);
        
        Wsdl::wsdlMail($desintaire['EMAIL'], $sujet, $message);
    }
}