<?php

class DOA_Action
{

    public static function BuildSaisieImport($titre = null)
    {
        $clSessionAction = DoaDocAction::getSession();
        
        $typeObjet = $clSessionAction->getTypeObjet();
        $idObjet = $clSessionAction->getIdObjet();
        
        $idTache = $clSessionAction->getIdTache();
        $idAction = $clSessionAction->getIdAction();
        
        $idDonnee = $clSessionAction->getIdDonnee();
        $idRecord = $clSessionAction->getIdRecord();
        
        $mode = 'LE';
        $array['ide']['!action'] = 'AjouterDataImport';
        $array['ide']['!mode'] = & $mode;
        
        $array['fenetre']['!titre'] = $titre;
        $array['fiche']['champ']['fichier'] = array(
            '!name' => 'fileImport',
            '!libelle' => trad('Import Fichier')
        );
        $array['fiche']['!enregistrer'] = 'Traite("DOA_Action.php?action=saveImport",this);';
        $array['fiche']['!actionSubmit'] = 'DOA_Action.php?action=enregistrerImport';
        
        return $array;
    }

    public static function &BuildSaisieData($titre = null)
    {
        $clSessionAction = DoaDocAction::getSession();
        
        $typeObjet = $clSessionAction->getTypeObjet();
        $idObjet = $clSessionAction->getIdObjet();
        
        $idTache = $clSessionAction->getIdTache();
        $idAction = $clSessionAction->getIdAction();
        
        $idDonnee = $clSessionAction->getIdDonnee();
        $idRecord = $clSessionAction->getIdRecord();
        
        $mode = 'LE';
        $array['ide']['!action'] = 'ModifierDataMultiple';
        $array['ide']['!mode'] = & $mode;
        $array['fenetre']['!titre'] = $titre;
        $array['ide']['fiche'] = DOA_Action::BuildXmlAjouterDataMultiple($idTache, $idDonnee, $idAction, $idRecord, $mode);
        
        return $array;
    }

    /**
     * Fonction renvoyant le fait que l'utilisateur connecté est acteurs ou pas d'une action
     * 
     * @param unknown $arrayAction
     */
    public static function isActeurRACI($arrayAction, $PROPRIETAIRE, $PRESCRIPTEUR)
    {
        $peutTerminer = false;
        
        $CODE_USER = $_SESSION['Session_Login'];
        if ($CODE_USER == $PROPRIETAIRE || $CODE_USER == $PRESCRIPTEUR)
            $peutTerminer = true;
        else {
            if ($reqSqlRACI = SqlDoaActions::rqGetDOARACIPourAction($arrayAction['ID_OBJET'], $arrayAction['ID_TACHE'], $arrayAction['ID_ACTION'], $CODE_USER)->Trouve1()) {
                $ROLE = $reqSqlRACI['RACI'];
                if ('R' == $ROLE || 'A' == $ROLE)
                    $peutTerminer = true;
            }
        }
        return $peutTerminer;
    }

    public static function existeDonneAction(& $TYPE_OBJET, & $ID_OBJET, & $ID_DONNEE)
    {
        if ($reqExiste = SqlDoaActions::rqGetExisteDonneeAction($TYPE_OBJET, $ID_OBJET, $ID_DONNEE)->Trouve1())
            return true;
        else
            return false;
    }

    public static function existeDataAction(& $TYPE_OBJET, & $ID_OBJET, & $ID_DATA)
    {
        if ($reqExiste = SqlDoaActions::rqGetInfoActionData($TYPE_OBJET, $ID_OBJET, $ID_DATA)->Trouve1())
            return true;
        else
            return false;
    }

    public static function getActionData($TYPE_OBJET, $ID_OBJET, $idAction, $champ)
    {
        $reqSqlActionData = SqlDoaActions::rqGetInfoActionData($TYPE_OBJET, $ID_OBJET, $idAction)->Trouve1();
        return $reqSqlActionData[$champ];
    }

    public static function getDoaStruct($TYPE_OBJET, $ID_OBJET, $idDonnee, $champ)
    {
        $reqSqlDoaStruct = SqlDoaActions::rqGetInfoDoaStruct($TYPE_OBJET, $ID_OBJET, $idDonnee)->Trouve1();
        return $reqSqlDoaStruct[$champ];
    }

    public static function getDoaActionData($TYPE_OBJET, $ID_OBJET, $ID_ACTION, $ID_DONNEE, $ID_DATA, $champ)
    {
        $reqSqlDoaActionData = SqlDoaActions::rqGetInfoDoaActionData($TYPE_OBJET, $ID_OBJET, $ID_ACTION, $ID_DONNEE, $ID_DATA)->Trouve1();
        return $reqSqlDoaActionData[$champ];
    }

    public static function getDoaData($TYPE_OBJET, $ID_OBJET,$ID_DONNEE,$ID_DATA,$champ)
    {
        $reqSqlDoaData = SqlDoaActions::rqGetInfoDoaData($TYPE_OBJET, $ID_OBJET, $ID_DONNEE, $ID_DATA, $idData)->Trouve1();
        return $reqSqlDoaData[$champ];
    }

    public static function getDoaDataDonnee($typeObjet, $idObjet, $idDonnee, $champ)
    {
        $reqSqlDoaDataDonnee = SqlDoaActions::rqGetInfoDoaDataByDonnee($typeObjet, $idObjet, $idDonnee)->TrouveTous();
        return $reqSqlDoaDataDonnee[$champ];
    }

    public static function getDoaRecord($ID_OBJET, $ID_DONNEE, $champ)
    {
        $reqSqlDoaRecord = SqlDoaActions::rqGetInfoDoaRecord($ID_OBJET, $ID_DONNEE)->Trouve1();
        return $reqSqlDoaRecord[$champ];
    }

    /**
     * Ne pas mettre de reference sur id_record en effet un 0 peut etre envoyer en dur
     * 
     * @param unknown $ID_DOA
     * @param unknown $ID_DONNEE
     * @param unknown $ID_DATA
     * @param unknown $ID_RECORD
     * @param unknown $champ
     * @return Ambigous <>
     */
    public static function getDoaRecordVal($ID_DOA, $ID_DONNEE, $ID_DATA, $ID_RECORD, $champ)
    {
        $reqSqlDoaRecordVal = SqlDoaActions::rqGetInfoDoaRecordVal($ID_DOA, $ID_DONNEE, $ID_DATA, $ID_RECORD)->Trouve1();
        return $reqSqlDoaRecordVal[$champ];
    }

    public static function getDoaDataDonneeOne($TYPE_OBJET, $ID_OBJET, $idDonnee, $champ)
    {
        $reqSqlDoaDataDonnee = SqlDoaActions::rqGetInfoDoaDataByDonnee($TYPE_OBJET, $ID_OBJET, $idDonnee)->Trouve1();
        return $reqSqlDoaDataDonnee[$champ];
    }

    public static function getDoaActionDataByIDdAta($idData)
    {
        $reqSqlDoaActionData = SqlDoaActions::rqGetInfoDoaActionData($idData)->Trouve1();
        return $reqSqlDoaActionData['ID_DONNEE'];
    }

    public static function getDoaActionDataByDonneeData($idDonnee, $idData, $champ)
    {
        $reqSqlDoaActionDataByDonneeData = SqlDoaActions::rqGetInfoDoaDataByDonneeData($idDonnee, $idData)->Trouve1();
        return $reqSqlDoaActionDataByDonneeData[$champ];
    }

    public static function &BuildXmlAction($mode, $idAction)
    {
        $array = null;
        $array['ide']['fiche']['!mode'] = $mode;
        
        if ($reqSqlActions = SqlDoaActions::rqGetInfoActions($idAction)->TrouveTous()) {
            $TYPE_OBJET = $value[0]['TYPE_OBJET'];
            $ID_OBJET = $value[0]['ID_OBJET'];
            $ID_TACHE = $value[0]['ID_TACHE'];
            
            $isDoaExec = DOA_Referentiel::iSDoaEnExecution($TYPE_OBJET, $ID_OBJET);
            
            $LIB_PROC = '';
            $DESCR_PROC = '';
            
            if ($reqSqlTache = SqlDoaTache::rqDOA_Tache_Liste($TYPE_OBJET, $ID_OBJET, null, $ID_TACHE)->Trouve1()) {
                $ID_PROC = $reqSqlTache['ID_PROC'];
                
                if ($infoProc = DOA_Referentiel::GetInfoProcedure($ID_PROC)) {
                    $LIB_PROC = $infoProc['LIB'];
                    $DESCR_PROC = $infoProc['DESCR'];
                }
            }
            
            foreach ($reqSqlActions as & $value) {
                $actionData = DOA_Action::getActionData($value['TYPE_OBJET'], $value['ID_OBJET'], $value['ID_ACTION'], 'ID_DONNEE');
                $element = array(
                    '!TYPE_OBJET' => & $value['TYPE_OBJET'],
                    '!ID_OBJET' => & $value['ID_OBJET'],
                    '!ID_TACHE' => & $value['ID_TACHE'],
                    '!ID_ACTION' => & $value['ID_ACTION'],
                    '!LIB' => & $value['LIB'],
                    '!COMMENTAIRE' => & $value['COMMENTAIRE'],
                    '!NUM_ORDRE' => & $value['NUM_ORDRE'],
                    '!ID_TYPE_ACT' => & $value['ID_TYPE_ACT'],
                    '!LIB_PROC' => $LIB_PROC,
                    '!DESCR_PROC' => $DESCR_PROC,
                    '!TACHE' => TDB_Operationnel::getLibTache($value['TYPE_OBJET'], $value['ID_OBJET'], $value['ID_TACHE'], 'LIB'),
                    '!CHAP_PROC' => TDB_Operationnel::getLibTache($value['TYPE_OBJET'], $value['ID_OBJET'], $value['ID_TACHE'], 'CHAP_PROC'),
                    '!ID_DONNEE' => DOA_Action::getActionData($value['TYPE_OBJET'], $value['ID_OBJET'], $value['ID_ACTION'], 'ID_DONNEE'),
                    '!NOM_DONNEE' => DOA_Action::getDoaStruct($value['TYPE_OBJET'], $value['ID_OBJET'], DOA_Action::getActionData($value['TYPE_OBJET'], $value['ID_OBJET'], $value['ID_ACTION'], 'ID_DONNEE'), 'NOM_DONNEE'),
                    '!LIB_DOA' => TDB_Operationnel::getLibDoa($value['ID_OBJET'], 'LIB'),
                    '!ID_DATA' => DOA_Action::getDoaActionData($value['TYPE_OBJET'], $ID_OBJET, $actionData, 'ID_DATA'),
                    '!EST_MULTIPLE' => DOA_Action::getDoaStruct($value['TYPE_OBJET'], $value['ID_OBJET'], DOA_Action::getActionData($value['TYPE_OBJET'], $value['ID_OBJET'], $value['ID_ACTION'], 'ID_DONNEE'), 'MULTIPLE'),
                    '!ID_RECORD' => DOA_Action::getDoaRecord($value['ID_OBJET'], DOA_Action::getActionData($value['TYPE_OBJET'], $value['ID_OBJET'], $value['ID_ACTION'], 'ID_DONNEE'), 'ID_RECORD'),
                    '!VALEUR' => DOA_Action::getDoaRecordVal(DOA_Action::getDoaRecord(DOA_Action::getActionData($value['TYPE_OBJET'], $value['ID_OBJET'], $value['ID_ACTION'], 'ID_DONNEE'), 'ID_RECORD'), 'VALEUR'),
                    '!EST_MODIFIABLE' => DOA_Action::getDoaActionData($value['TYPE_OBJET'], $ID_OBJET, DOA_Action::getActionData($value['TYPE_OBJET'], $value['ID_OBJET'], $value['ID_ACTION'], 'ID_DONNEE'), 'MODIFIABLE'),
                    '!ANNULER' => "CallUrl('TDB_Operationnel.php?action=AfficherTabBordOp&ancrage=men_gene');window.scrollTo(0,0);",
                    '!NOM_DATA' => DOA_Action::getDoaDataDonneeOne($value['TYPE_OBJET'], $ID_OBJET, DOA_Action::getActionData($value['TYPE_OBJET'], $value['ID_OBJET'], $value['ID_ACTION'], 'ID_DONNEE'), 'NOM_DATA')
                );
                if ($isDoaExec)
                    $element['!TERMINEE'] = BoolSql($value['TERMINEE']);
                
                $infoActions[] = $element;
            }
            $array['ide']['fiche']['DOA_ACTIONS'] = & $infoActions;
        }
        
        $array['ide']['fiche']['!enregistrer_donnee_actions_unique'] = 'Traite(\'DOA_Action.php?action=ModifierDonneeActionUnique\',document.form_editer_donnee_action.elements[0],\'\');return false;';
        $array['ide']['fiche']['!enregistrer_donnee_actions_unique_accueil'] = 'Traite(\'DOA_Action.php?action=ModifierDonneeActionUniqueAccueil\',document.form_editer_donnee_action.elements[0],\'\');return false;';
        return $array;
    }

    const id_VALEUR = 'VALEUR';

    const id_TYPE_OBJET = 'TYPE_OBJET';

    const id_hidden_id_donnee = 'hidden_id_donnee';

    const id_hidden_id_data = 'hidden_id_data';

    const id_NUM_ORDRE = 'NUM_ORDRE';

    const id_NOM_DATA = 'NOM_DATA';

    const id_LIE_A_OBJET = 'LIE_A_OBJET';

    const id_OBJET = 'OBJET';

    const id_FLAG_ID_OBJET = 'FLAG_ID_OBJET';

    const id_DATA_LIE_A_OBJ = 'DATA_LIE_A_OBJ';

    const id_OBJET_DATA = 'OBJET_DATA';

    const id_LIE_OBJET_DATA = 'LIE_OBJET_DATA';

    const id_CHAMP_OBJET_DATA = 'CHAMP_OBJET_DATA';

    const id_CLE_UNIQUE = 'CLE_UNIQUE';

    const id_TYPE_DATA = 'TYPE_DATA';

    const id_A_LONG = 'A_LONG';

    const id_N_NEGATIF_AUTO = 'N_NEGATIF_AUTO';

    const id_N_PARTIE_ENT = 'N_PARTIE_ENT';

    const id_N_PARTIE_DEC = 'N_PARTIE_DEC';

    const id_MNT_DEVISE = 'MNT_DEVISE';

    const id_FIC_GENERE = 'FIC_GENERE';

    const id_ID_FORMAT = 'ID_FORMAT';

    const id_TAG_MERGE = 'TAG_MERGE';

    const id_hidden_id_donnee_data = 'hidden_id_donnee_data';

    const id_hidden_nb_donnee = 'hidden_nb_donnee';

    const id_Formulaire = 'form_record_val';

    const id_ID_OBJET = 'ID_OBJET';

    const id_ID_TACHE = 'ID_TACHE';

    const id_ID_ACTION = 'ID_ACTION';

    const id_ID_DATA = 'ID_DATA';

    const id_AFFICHEE = 'AFFICHEE';

    const id_MODIFIABLE = 'MODIFIABLE';

    const TYPE_ALPHA = 'A';

    const TYPE_LOGIQUE = 'L';

    const TYPE_MONTANT = 'T';

    const TYPE_NUMERIQUE = 'N';

    const TYPE_DATE = 'D';

    const TYPE_HEURE = 'H';

    const TYPE_FICHIER = 'F';

    const id_DIV = 'ID_DIV';

    /**
     * Pour information si une fonction ne renvoi pas une variable IL NE FAUT PAS METTRE le '&' en retour car ce n'est pas une référence qui est retourné
     * 
     * @param unknown $GET
     * @return multitype:Ambigous <string, unknown, string, NULL>
     */
    public static function EnregistrerDonneeActionUnique()
    {
        $messageErreur = '';
        
        $clSessionAction = DoaDocAction::getSession();
        if (is_null($clSessionAction)) {
            Affichage::messageJS('getsession retourne null ' . "EnregistrerDonneeActionUnique");
            exit();
        }
        
        $ID_DOA = $clSessionAction->getIdObjet();
        $ID_DATA = $clSessionAction->getIdData();
        $ID_RECORD = $clSessionAction->getIdRecord();
        
        $VALEUR = trim(GetValue(DOA_Action::id_VALEUR));
        $ID_DONNEE = trim(GetValue(DOA_Action::id_hidden_id_donnee));
        
        // verification des champs
        if ('' === $VALEUR)
            $messageErreur = Trad('Vous devez remplir les données de l\'action');
        
        // Enregistrement de l'action
        if ('' === $messageErreur) {
            if (! SqlDoaActions::rqDOA_ModifDonneeActionsUnique($VALEUR, $ID_DOA, $ID_DONNEE, $ID_DATA, $ID_RECORD)->ExecuteSql()) {
                $messageErreur = Trad('Une erreur est survenue pendant l\'enregistrement de la modification.');
            }
        }
        return array(
            'messageErreur' => $messageErreur
        );
    }

    public static function &BuilXmlTableauDonnees($origine, & $TYPE_OBJET, & $ID_OBJET, & $ID_TACHE, & $ID_ACTION, $action = null)
    {
        $array = null;
        if ($reqSqlAction = SqlDoaActions::rqDOA_GetInfoActions($TYPE_OBJET, $ID_OBJET, $ID_TACHE, $ID_ACTION)->Trouve1()) {
            $ID_TACHE = $reqSqlAction['ID_TACHE'];
            $ACTION_LIB = $reqSqlAction['LIB'];
            $ACTION_COMMENTAIRE = $reqSqlAction['COMMENTAIRE'];
            $ACTION_ID_TYPE_ACT = $reqSqlAction['ID_TYPE_ACT'];
            $ACTION_TERMINEE = $reqSqlAction['TERMINEE'];
            
            $array['ACTION'] = array(
                '!LIB' => $ACTION_LIB,
                '!COMMENTAIRE' => $ACTION_COMMENTAIRE
            );
            
            DOA_Donnee::BuilXmlTableauDonnees($array, SqlDoaActions::rqDOA_GetActionStruct($TYPE_OBJET, $ID_OBJET, $ID_TACHE, $ID_ACTION)->TrouveTous(), $ID_TACHE, $ID_ACTION, $action);
            
            /**
             * 2 cas de figure car l'on trouve cette écran avec le bouton via le tableau de bord, ou via l'execution de la tache
             */
            if (! is_null($ID_ACTION) && ($reqSqlDoa = SqlDoa::rqGetInfoSuiviDoa($ID_OBJET)->Trouve1()) && DOA_Action::isActeurRACI($reqSqlAction, $reqSqlDoa['PROPRIETAIRE'], $reqSqlDoa['PRESCRIPTEUR'])) {
                $array['!terminer_action'] = 'Traite(\'DOA_Action.php?action=TerminerAction' . '&typeObjet=' . $TYPE_OBJET . '&idObjet=' . $ID_OBJET . '&idTache=' . $ID_TACHE . '&idAction=' . $ID_ACTION . '&origine=' . $origine . '\',document.form_terminer_action.elements[0]);';
            }
        }
        
        return $array;
    }

    /**
     *
     * @param unknown $origine
     * @param unknown $TYPE_OBJET
     * @param unknown $ID_OBJET
     * @param unknown $ID_TACHE
     * @param unknown $ID_ACTION
     * @return string
     */
    public static function &BuildXmlActionExecuter_v2($origine, & $TYPE_OBJET, & $ID_OBJET, & $ID_TACHE, & $ID_ACTION, $modeRefresh = true, $action = null)
    {
        // On prépare les données pour l'affichage de l'entête
        if ($reqSqlActions = SqlDoaActions::rqDOA_GetInfoActions($TYPE_OBJET, $ID_OBJET, $ID_TACHE, $ID_ACTION)->Trouve1()) {
            
            if ($modeRefresh)
                DOA_Action::saveSessionAction($ID_ACTION, null, $ID_OBJET, null, $ID_TACHE, null);
            
            $TYPE_OBJET = $reqSqlActions['TYPE_OBJET'];
            $ID_OBJET = $reqSqlActions['ID_OBJET'];
            $ID_TACHE = $reqSqlActions['ID_TACHE'];
            $ID_ACTION = $reqSqlActions['ID_ACTION'];
            
            $LIB_PROC = '';
            $DESCR_PROC = '';
            $CHAP_PROC = '';
            $TACHE_LIB = '';
            $infoProc = null;
            
            if ($reqSqlTache = SqlDoaTache::rqDOA_Tache_Liste($TYPE_OBJET, $ID_OBJET, null, $ID_TACHE)->Trouve1()) {
                $ID_PROC = $reqSqlTache['ID_PROC'];
                $TACHE_LIB = $reqSqlTache['LIB'];
                $CHAP_PROC = $reqSqlTache['CHAP_PROC'];
                
                if ($infoProc = DOA_Referentiel::GetInfoProcedure($ID_PROC)) {
                    $LIB_PROC = $infoProc['LIB'];
                    $DESCR_PROC = $infoProc['DESCR'];
                }
                
                //
                // Récupération des infos sur le DOA
                //
                
                //
                // Infos sur l'entête
                //
                $reqSqlDoa = SqlDoa::rqGetInfoSuiviDoa($ID_OBJET)->Trouve1();
                if (is_array($reqSqlDoa)) {
                    if (! isset($array)) {
                        // AMI 20160411 : Si l'array n'est pas initialisé, alors ça peut planter
                        $array = array();
                        $array['entete'] = array();
                    }
                    $array['entete']['!LIB_DOA'] = $reqSqlDoa['LIB'];
                }
                
                $array['entete']['!LIB'] = & $reqSqlActions['LIB'];
                $array['entete']['!COMMENTAIRE'] = & $reqSqlActions['COMMENTAIRE'];
                $array['entete']['!TYPE_OBJET'] = & $reqSqlActions['TYPE_OBJET'];
                $array['entete']['!CHAP_PROC'] = & $CHAP_PROC;
                
                if (! is_null($infoProc)) {
                    $array['entete']['!TACHE'] = & $TACHE_LIB;
                    $array['entete']['!LIB_PROC'] = & $LIB_PROC;
                    $array['entete']['!DESCR_PROC'] = & $DESCR_PROC;
                    
                    $param = '?uniq=' . uniqid();
                    $param .= '&token=' . password_hash($_SESSION['Session_Login'].session_id(), PASSWORD_DEFAULT);
                    
                    if ($infoProc['TYPE_URL'] == 'E') {
                        if ($infoProc['NOM_OU_URL'] != '') {
                            $url = "window.open('" . ReplaceSqlPointeur($infoProc['NOM_OU_URL']) . "','win_pop_lad');";
                            $array['entete']['!LIB_PROC_onclick'] = $url;
                        }
                    } else if ($infoProc['TYPE_URL'] == 'I' && $infoProc['NOM_FIC_INT'] != '') {
                        $url = "charge_document.php" . $param . '&EmplacementFichier=pj&UrlFichier=' . urlencode($infoProc['NOM_FIC_INT']);
                        
                        $url = "window.open('" . ReplaceSqlPointeur($url) . "','win_pop_lad');";
                        
                        $array['entete']['!LIB_PROC_onclick'] = $url;
                    }
                }
                
                // AMI 20160411 : Si l'array n'est pas initialisé, alors ça peut planter
                if (! array_key_exists('fiche', $array))
                    $array['fiche'] = array();
                
                $array['fiche']['fermer'] = 'CallUrl(\'TDB_Operationnel.php?action=AfficherTabBordOp&ancrage=men_gene\');';
                
                // On prépare les données pour l'affichage de la liste des données et valeurs
                $array['tableau'] = DOA_Action::BuilXmlTableauDonnees($origine, $TYPE_OBJET, $ID_OBJET, $ID_TACHE, $ID_ACTION, $action);
                
                $array['tableau']['!typeEcran'] = 'data';
            }
        }
        return $array;
    }

    public static $id_FORMULAIRE_DATA_MULTIPLE = 'FORM_DATA_MULT';

    public static function BuildXmlAjouterDataMultiple(& $ID_TACHE, & $ID_DONNEE, & $ID_ACTION, & $ID_RECORD, & $mode)
    {
        //
        // AMI v2
        //
        $clSession = DoaBibSession::getSession();
        $TYPE_OBJET = $clSession->getTypeObject();
        $ID_OBJET = $clSession->getIdObject();
        $array = null;
        $js = '';
        
        $param = '?uniq=' . uniqid();
        
        
        if (is_null($ID_RECORD)) {
            $ID_RECORD = - 1;
        }
        
        // On récupère la structure de la data
        if ($reqSqlDATA = SqlDoaActions::rqDOA_GetActionDATA($TYPE_OBJET, $ID_OBJET, $ID_DONNEE, $ID_TACHE, $ID_ACTION)->TrouveTous()) {
            // On va éventuellement chercher les valeurs existantes
            $ID_DATA = null; // On veut les valeurs de toutes les DATA
            $reqSqlExistant = SqlDoaActions::rqGetInfoDoaRecordVal($ID_OBJET, $ID_DONNEE, $ID_DATA, $ID_RECORD)->TrouveTous();
            
            // On prépare le noeud de data pour l'affichage
            foreach ($reqSqlDATA as & $valueDATA) {
                $ID_DATA = $valueDATA['ID_DATA'];
                $idHtml = 'VALEUR_' . $ID_DATA;
                $TYPE_DATA = $valueDATA['TYPE_DATA'];
                
                $VALEUR = null;
                $MODIFIABLE = BoolSql($valueDATA['MODIFIABLE']);
                
                if (BoolSql($valueDATA['AFFICHEE'])) {
                    if (is_array($reqSqlExistant))
                    {
                        foreach ($reqSqlExistant as & $valueExistant) {
                            if ($ID_DATA == $valueExistant['ID_DATA']) {
                                $VALEUR = $valueExistant['VALEUR'];
                                break;
                            }
                        }
                    }
                    if ((BoolSql($valueDATA['LIE_A_OBJET']) && BoolSql($valueDATA['CLE_UNIQUE']) || BoolSql($valueDATA['DATA_LIE_A_OBJ']) && BoolSql($valueDATA['ID_OBJET_DATA'])) && $MODIFIABLE) {
                        // Affichage par les CS
                        $OBJET_DATA = $valueDATA['OBJET_DATA'];
                        
                        $tableauCS = DOA_Element::addInfoSaisie($ID_OBJET, $idHtml, $OBJET_DATA, 'gestion_cs_panier.php', DOA_Action::$id_FORMULAIRE_DATA_MULTIPLE, $valueDATA['NOM_DATA']);
                        $tableauCS['!TYPE_DATA'] = 'CS';
                        $tableauCS['actions']['!onblur'] = 'Traite("DOA_Action.php?action=MiseAJourDonneeActionMultiple' . (!isset($idTache) || is_null($idTache) || $idTache == '' ?: '&idTache=' . $ID_TACHE) . '&idDonnee=' . $ID_DONNEE . '&idData=' . $ID_DATA . '&idRecord=' . $ID_RECORD . '&VALEUR="+this.value,this);';
                        
                        $tableauCS['attributs'][] = array(
                            '!name' => 'VALEUR',
                            '!value' => $VALEUR
                        );
                        
                        
                        $array['DATA'][] = $tableauCS;
                    } else {
                        if ('D' == $TYPE_DATA) {
                            $onclickDate = 'CLSuivi.show(null,document.' . DOA_Action::$id_FORMULAIRE_DATA_MULTIPLE . '.' . $idHtml . ',null,-80);';
                            $js .= '<script language="javascript">
									CLSuivi = new GnooCalendar(\'CLSuivi\', 10, 11 ,\'' . $_SESSION['DATE_FORMAT'] . '\');
									CLSuivi.init(\'calend\', document.' . DOA_Action::$id_FORMULAIRE_DATA_MULTIPLE . '.' . $idHtml . ');
									CLSuivi.isDragable(false);
									</script>';
                        } else
                            $onclickDate = '';
                        
                        $element = array(
                            '!id' => $idHtml,
                            '!ID_DATA' => $ID_DATA,
                            '!LIB' => $valueDATA['NOM_DATA'],
                            '!VALEUR' => $VALEUR,
                            '!TYPE_DATA' => $TYPE_DATA,
                            '!AFFICHEE' => isset($AFFICHEE)? $AFFICHEE:'',
                            '!MODIFIABLE' => $MODIFIABLE,
                            '!A_LONG' => $valueDATA['A_LONG'],
                            '!MNT_DEVISE' => $valueDATA['MNT_DEVISE']
                        );
                        
                        if ('F' == $TYPE_DATA) {
                            if (boolsql($valueDATA['FIC_GENERE']))
                                $element['!onclickContratheque'] = 'Traite(\'DOA_Action.php?action=DocumentContratheque&idData=' . $ID_DATA . '&idRecord=' . $ID_RECORD . ',this\');';
                            else
                                $element['!onclickModifier'] = 'window.open(\'DOA_Action.php?action=AjouterDocument&id_bloc=1&idDoa=' . $ID_OBJET . '&idData=' . $ID_DATA . '&idRecord=' . $ID_RECORD . '\',\'win_pop_doc_tache\',\'width=530,height=585\');';
                            
                            if (! is_null($VALEUR)) {
                                if ($reqDocument = SqlDocRattaches::rqGetDocRattcheDoa($ID_OBJET, $VALEUR)->Trouve1()) {
                                    // lien_action
                                    $param .= '&token=' . password_hash($_SESSION['Session_Login'].session_id(), PASSWORD_DEFAULT);

                                    $url = "charge_document.php" . $param . '&EmplacementFichier=pj&UrlFichier=' . urlencode($reqDocument['NOM_FIC']);
                                    
                                    $url = "window.open('" . ReplaceSqlPointeur($url) . "','win_pop_lad');";
                                    $element['!URL_LINK'] = & $url;
                                    $element['!NOM_ORI'] = & $reqDocument['NOM_ORI'];
                                    if (! boolsql($valueDATA['FIC_GENERE']) && $MODIFIABLE) {
                                        $element['!onclickSupprimer'] = 'if(window.confirm("' . cnv_to_javascript(trad("Confirmez vous la suppression de ce document ?")) . '"))' . '{CallUrlAsync("DOA_Action.php","action=SupprimerDonneeDocument' . (is_null($ID_ACTION) || $ID_ACTION == '' ? '' : '&idAction=' . $ID_ACTION) . (is_null($ID_TACHE) || $ID_TACHE == '' ? '' : '&idTache=' . $ID_TACHE) . '&idRecord=' . $ID_RECORD . '&idDonnee=' . $ID_DONNEE . '&idData=' . $ID_DATA . '");};';
                                        $element['!tooltipSupprimer'] = trad('Supprimer');
                                    }
                                }
                            }
                        } else {
                            if ($onclickDate != '')
                                $element['!onclickDate'] = $onclickDate;
                            
                            $element['!onblur'] = 'Traite("DOA_Action.php?action=VerifieValeurDataSimple' . (is_null($ID_ACTION) || $ID_ACTION == '' ? '' : '&idAction=' . $ID_ACTION) . (is_null($ID_TACHE) || $ID_TACHE == '' ? '' : '&idTache=' . $ID_TACHE) . '&idDonnee=' . $ID_DONNEE . '&idData=' . $ID_DATA . '&idRecord=' . $ID_RECORD . '",this);';
                        }
                        $array['DATA'][] = $element;
                    }
                }
            }
        }
        
        $array['FORM'] = array(
            '!ID' => DOA_Action::$id_FORMULAIRE_DATA_MULTIPLE,
            '!ID_TACHE' => $ID_TACHE,
            '!ID_RECORD' => $ID_RECORD,
            '!onclick' => 'Traite(\'DOA_Action.php?action=AjouterDonneeAction' . '&idDonnee=' . $ID_DONNEE . '&idObjet=' . $ID_OBJET . (is_null($ID_TACHE) || $ID_TACHE == '' ? '' : '&idTache=' . $ID_TACHE) . (is_null($ID_ACTION) || $ID_ACTION == '' ? '' : '&idAction=' . $ID_ACTION) . '\',document.' . DOA_Action::$id_FORMULAIRE_DATA_MULTIPLE . '.elements[0]);'
        );        
        return array(
            'array' => $array,
            'js' => $js
        );
    }

    public static function &MiseAJourDonneeActionMultiple($ID_DONNEE, $ID_DATA, $ID_RECORD, $VALEUR)
    {
        $clSession = DoaBibSession::getSession();
        $TYPE_OBJET = $clSession->getTypeObject();
        $ID_OBJET = $clSession->getIdObject();
        
        $resultatTmp = DOA_Action::ReconstruitRecordVal($TYPE_OBJET, $ID_OBJET, $ID_DONNEE, $ID_DATA, $ID_RECORD, $VALEUR);
        $arrayModif = $resultatTmp['arrayModif'];
        if (is_array($arrayModif)) {
            foreach ($arrayModif as & $valueModif) {
                $ID_DATA = $valueModif['ID_DATA'];
                $VALEUR = $valueModif['VALEUR'];
                $idHtml = 'VALEUR_' . $ID_DATA;
                Affichage::setValue($idHtml, $VALEUR);
            }
        }
    }

    /**
     *
     * @param unknown $ID_DONNEE
     * @param unknown $ID_DATA
     * @param unknown $ID_RECORD
     * @param unknown $VALEUR
     * @return multitype:NULL
     */
    public static function VerifieValeurDataSimple(& $ID_DONNEE, & $ID_DATA, & $ID_RECORD, & $VALEUR)
    {
        // Attention : dsi le type data est 'logique', la valeur sera modifié en 'true' / 'false'
        // Ce qui est impératif au moment de l'écriture dans la base
        $messageErreur = '';
        $NePasEnregistrerCS = false;
        $deleteData = false;
        
        $clSession = DoaBibSession::getSession();
        $TYPE_OBJET = $clSession->getTypeObject();
        $ID_OBJET = $clSession->getIdObject();
        
        if ($reqSqlDoaData = SqlDoaActions::rqGetInfoDoaData($TYPE_OBJET, $ID_OBJET, $ID_DONNEE, $ID_DATA)->Trouve1()) {
            $TYPE_DATA = $reqSqlDoaData['TYPE_DATA'];
            $strlen = mb_strlen($VALEUR);
            
            switch ($TYPE_DATA) {
                case 'A': // Alpha
                    $A_LONG = $reqSqlDoaData['A_LONG'];
                    /*
                     * Saisie non obligatoire
                     * if ($strlen == 0)
                     * $messageErreur = Trad('Vous devez renseigner le champ').' "'.$reqSqlDoaData['NOM_DATA'].'"';
                     * else
                     */
                    if ($strlen > $A_LONG)
                        $messageErreur = strBuild(Trad('Le champ @1@ doit faire moins de @2@ caractères.'), $reqSqlDoaData['NOM_DATA'], $A_LONG);
                    break;
                case 'L': // Logique // Select - option // case : vide, non, oui
                    	$VALEUR = BoolSql($VALEUR);
                        $VALEUR = ($VALEUR)?'O':'N'; // Revue : true / false 
                        break;
                case 'T': // Montant
                    $VALEUR = str_replace(',', '.', $VALEUR);
                    
                    if (0 == $strlen)
                        $messageErreur = Trad('Vous devez renseigner le montant') . ' "' . $reqSqlDoaData['NOM_DATA'] . '"';
                    elseif (! ControleSaisie::CtrlFormatNumber($VALEUR, 15, 2))
                        $messageErreur = strBuild(Trad('Le montant @1@ doit être numérique et avoir au plus 15 chiffres et 2 décimales.'), $reqSqlDoaData['NOM_DATA']);
                    
                    break;
                case 'N': // Numérique
                    $N_NEGATIF_AUTO = BoolSql($reqSqlDoaData['N_NEGATIF_AUTO']);
                    $N_PARTIE_ENT = $reqSqlDoaData['N_PARTIE_ENT'];
                    $N_PARTIE_DEC = $reqSqlDoaData['N_PARTIE_DEC'];
                    $VALEUR = str_replace(',', '.', $VALEUR);
                    $VALEUR_NON_SIGNEE = str_replace('-', '', $VALEUR);
                    if (0 == $strlen)
                        $messageErreur = Trad('Vous devez renseigner le numérique') . ' "' . $reqSqlDoaData['NOM_DATA'] . '"';
                    elseif (false !== strpos($VALEUR, '-') && ! $N_NEGATIF_AUTO)
                        $messageErreur = strBuild(Trad('Le numérique @1@ n\'accepte pas les négatifs.'), $reqSqlDoaData['NOM_DATA']);
                    elseif (! ControleSaisie::CtrlFormatNumber($VALEUR_NON_SIGNEE, $N_PARTIE_ENT, $N_PARTIE_DEC))
                        $messageErreur = strBuild(Trad('Le numérique @1@ accepte @2@ chiffres dans sa partie entière et @3@ pour la partie décimale.'), $reqSqlDoaData['NOM_DATA'], $N_PARTIE_DEC, $N_PARTIE_DEC);
                    break;
                case 'D': // Date
                    if (0 == $strlen)
                        $messageErreur = strBuild(('Vous devez renseigner la date "@1@"'), $reqSqlDoaData['NOM_DATA']);
                    else {
                        if (! ControleSaisie::isDateValideFormat($VALEUR)) {
                            $messageErreur = strBuild(Trad('La date "@1@" n\'est pas au bon format.'), $reqSqlDoaData['NOM_DATA']);
                        } else {
                            $tmpDate = convertDateUserToSql($VALEUR);
                            
                            if ('' == $tmpDate || '00000000' == $tmpDate)
                                $messageErreur = strBuild(Trad('La date "@1@" n\'est pas au bon format.'), $reqSqlDoaData['NOM_DATA']);
                            else
                                $VALEUR = convertDateSqlToFr($tmpDate, param::getFormatDateJJMMAAAA()); // Transformation en retour car stockage en format JJ/MM/AAAA obligatoire EDP
                        }
                    }
                    break;
                case 'H': // Heure
                    if (0 == $strlen)
                        $messageErreur = Trad('Vous devez renseigner l\'heure') . ' "' . $reqSqlDoaData['NOM_DATA'] . '"';
                    elseif (! ControleSaisie::IsHour($VALEUR))
                        $messageErreur = strBuild(Trad('L\'heure "@1@" n\'est pas au bon format (HH:MM:SS).'), $reqSqlDoaData['NOM_DATA']);
                    break;
                case 'F': // Fichier
                    break;
                case '': // Nous sommes sur une data liée à une table
                    if ((BoolSql($reqSqlDoaData['DATA_LIE_A_OBJ']) && BoolSql($reqSqlDoaData['ID_OBJET_DATA'])) || (BoolSql($reqSqlDoaData['LIE_A_OBJET']) && BoolSql($reqSqlDoaData['CLE_UNIQUE']))) {
                        // Il s'agit d'une valeur pilotée par une table
                        // On passe par les champs supplémentaires
                        $CS = new CS();
                        $CS->setContexte('DOA');
                        $CS->setUniqueInfo($ID_OBJET);
                        
                        if ($VALEUR == '') {
                            // $NePasEnregistrerCS = true;
                            $messageErreur = '';
                            $deleteData = true;
                        } else if ($result_ctrl = $CS->gereDataDonnee($reqSqlDoaData['OBJET_DATA'], $VALEUR)) {
                            // Si la valeur saisie/sélectionnée par l'utilisateur existe alors on affiche le libéllé correspondant
                            if (1 == $result_ctrl[0]) {
                                // La donnée est ok
                            } else {
                                // Sinon on affiche un message d'avertissement à l'utilisateur et on efface la donnée
                                $messageErreur = CS::alertUser($result_ctrl[1], $CS->getLIBELLE()); // Message d'avertissement pour l'utilisateur
                                break;
                            }
                        }
                    } else {
                        $NePasEnregistrerCS = true;
                    }
                    break;
            }
        } else {
            $messageErreur = Trad('La data à modifier est inconuue dans la base.');
        }
        return array(
            'messageErreur' => & $messageErreur,
            'deleteData' => & $deleteData,
            'NePasEnregistrerCS' => & $NePasEnregistrerCS
        );
    }

    public static $id_form_data_unique = 'form_modifier_donnee_action';

    public static function &BuildXmlModifDataUnique($idObjet, $idDonnee, $idData, $idRecord, $idTache, $idAction)
    {
        //
        // AMI : v2
        //
        $array = null;
        $infoDoaData = null;
        $js = '';
        
        $clSession = DoaBibSession::getSession();
        $TYPE_OBJET = $clSession->getTypeObject();
        
        $array['fenetre']['!titre'] = trad('Modification d\'une data');
        
        if ($reqSqlDoaData = SqlDoaActions::rqGetInfoDoaData($TYPE_OBJET, $idObjet, $idDonnee, $idData)->Trouve1()) {
            $nomZone = 'VALEUR_' . $reqSqlDoaData['ID_DATA'];
            
            if (is_null($idTache)) { // ici c'est l'origine de l'écran c'est l'onglet donnée
                $MODIFIABLE = true;
                $AFFICHEE = true;
            } else if ($reqSqlActionData = SqlDoaActions::rqGetInfoDoaActionData($TYPE_OBJET, $idObjet, $idTache, $idAction, $idDonnee, $idData)->Trouve1()) {
                $MODIFIABLE = BoolSql($reqSqlActionData['MODIFIABLE']);
                $AFFICHEE = BoolSql($reqSqlActionData['AFFICHEE']);
            } else {
                $MODIFIABLE = false;
                $AFFICHEE = false;
            }
            
            // valeur initiale
            $ID_RECORD = 0;
            $reqSqlValue = SqlDoaActions::rqGetInfoDoaRecordVal($idObjet, $idDonnee, $idData, $ID_RECORD)->Trouve1();
            $valeurInitiale = (is_array($reqSqlValue)) ? $reqSqlValue['VALEUR'] : '';
            
            // Dans le cas d'un champ scalaire
            $TYPE_DATA = $reqSqlDoaData['TYPE_DATA'];
            
            $listeH = null;
            $listeM = null;
            if ('D' == $TYPE_DATA)
                // Pour les données de type Date, on prépare le js d'affichage de calendrier
                $js = '<script language="javascript">
					CLSuivi = new GnooCalendar(\'CLSuivi\', 10, 11 ,\'' . $_SESSION['DATE_FORMAT'] . '\');
					CLSuivi.init(\'calend\', document.' . DOA_Action::$id_form_data_unique . '.' . $nomZone . ');
					CLSuivi.isDragable(false);
					</script>';
            
            $infoDoaData = array(
                '!id' => $nomZone,
                '!LIBELLE' => $reqSqlDoaData['NOM_DATA'],
                
                '!TYPE_DATA' => $reqSqlDoaData['TYPE_DATA'],
                
                // Infos particulières :
                
                // Pour les alphas
                '!A_LONG' => $reqSqlDoaData['A_LONG'],
                
                // Pour les montants
                '!MNT_DEVISE' => $reqSqlDoaData['MNT_DEVISE'],
                
                // Pour les dates
                '!onclickDate' => 'CLSuivi.show(null,document.' . DOA_Action::$id_form_data_unique . '.' . $nomZone . ',null,-80);',
                
                '!ID_DONNEE' => $reqSqlDoaData['ID_DONNEE'],
                '!ID_DATA' => $reqSqlDoaData['ID_DATA'],
                '!ID_OBJET' => $reqSqlDoaData['ID_OBJET'],
                '!FLAG_ID_OBJET' => $reqSqlDoaData['FLAG_ID_OBJET'],
                '!DONNEE' => DOA_Action::getDoaStruct($TYPE_OBJET, $idObjet, $idDonnee, 'NOM_DONNEE'),
                '!VALEUR' => $valeurInitiale,
                '!AFFICHEE' => $AFFICHEE,
                '!MODIFIABLE' => $MODIFIABLE
            );
            
            // Dans le cas d'un champ piloté par une table
            $typeElem = $reqSqlDoaData['OBJET_DATA'];
            if ($typeElem != '') {
              //  $array['ide']['fiche']['CS'] = DOA_Element::addInfoSaisie($idObjet, $nomZone, $typeElem, 'gestion_cs_panier.php', DOA_Action::$id_form_data_unique);
                // Valeur par défaut
                if ('' != $valeurInitiale)
                    $array['ide']['fiche']['CS']['attributs'][] = array(
                        '!name' => 'VALEUR',
                        '!value' => $valeurInitiale
                    );
            }
            
            $arrayForm = array(
                '!id' => DOA_Action::$id_form_data_unique,
                '!onclick' => 'Traite(\'DOA_Action.php?action=ModifierDonneeAction' . '&idDonnee=' . $idDonnee . '&idObjet=' . $idObjet . '&idRecord=' . $idRecord . (is_null($idTache) ? '' : '&idTache=' . $idTache) . (is_null($idAction) ? '' : '&idAction=' . $idAction) . '\',document.' . DOA_Action::$id_form_data_unique . '.elements[0]);'
            );
            $infoDoaData['FORM'] = $arrayForm;
            
            $array['ide']['fiche']['DATA_UNIQUE'] = $infoDoaData;
        }
        
        return array(
            'array' => & $array,
            'js' => $js
        );
    }

    /*
     * @todo download du fichier
     * @todo génération du fichier
     */
    public static function &BuildXmlModifDataMultiple($idDonnee, $idTache, $idObjet, $idRecord, $idAction, $idData = '', $upload_ok = '')
    {
        $array = null;
        $infoDoaRecord = null;
        
        $clSession = DoaBibSession::getSession();
        $TYPE_OBJET = $clSession->getTypeObject();
        $ID_OBJET = $clSession->getIdObject();
        
        if ($upload_ok == '') {
            $vide = '';
            if ($reqSqlDoaRecord = SqlDoaActions::rqGetInfoDoaRecordVal($ID_OBJET, $idDonnee, $idRecord, $idData)->TrouveTous()) {
                foreach ($reqSqlDoaRecord as & $valueRecord) {
                    $ID_OBJET = DOA_Action::getDoaActionDataByDonneeData($idDonnee, $valueRecord['ID_DATA'], 'ID_OBJET');
                    $element = array(
                        '!ID_DATA' => $valueRecord['ID_DATA'],
                        '!VALEUR' => $valueRecord['VALEUR'],
                        'NOM_DATA' => array(
                            '!VALUE' => DOA_Action::getDoaActionDataByDonneeData($idDonnee, $valueRecord['ID_DATA'], 'NOM_DATA'),
                            '!id' => 'VALEUR_' . $valueRecord['ID_DATA']
                        ),
                        '!ID_OBJET' => $ID_OBJET,
                        '!FLAG_ID_OBJET' => DOA_Action::getDoaActionDataByDonneeData($idDonnee, $valueRecord['ID_DATA'], 'FLAG_ID_OBJET'),
                        '!DONNEE' => DOA_Action::getDoaStruct($TYPE_OBJET, $ID_OBJET, $idDonnee, 'NOM_DONNEE'),
                        '!AFFICHEE' => BoolSql(DOA_Action::getDoaActionData($TYPE_OBJET, $ID_OBJET, $idDonnee, $valueRecord['ID_DATA'], 'AFFICHEE')),
                        '!MODIFIABLE' => BoolSql(DOA_Action::getDoaActionData($TYPE_OBJET, $ID_OBJET, $idDonnee, $valueRecord['ID_DATA'], 'MODIFIABLE')),
                        '!TYPE_DATA' => DOA_Action::getDoaData($TYPE_OBJET, $ID_OBJET, $idDonnee, $valueRecord['ID_DATA'], 'TYPE_DATA'),
                        '!FIC_GENERE' => DOA_Action::getDoaData($TYPE_OBJET, $ID_OBJET, $idDonnee, $valueRecord['ID_DATA'], 'FIC_GENERE'),
                        '!NOM_ORI' => DOA_Action::getDoaData($TYPE_OBJET, $ID_OBJET, $idDonnee, $valueRecord['ID_DATA'], 'NOM_ORI'),
                        '!NO_ORDRE' => DOA_Action::getDoaData($TYPE_OBJET, $ID_OBJET, $idDonnee, $valueRecord['ID_DATA'], 'NO_ORDRE')
                        // '!ajouter_document' => 'OpenPopup(\'DOA_Action.php?action=AjouterDocument&id_bloc=1&idDoa='.$ID_OBJET.'&idData='.$valueRecord['ID_DATA'].'&idRecord='.$idRecord.'\',\'popup_ajout_doc\',530,585);'
                    );
                    $infoDoaRecord[] = $element;
                }
            }
        } else {
            $clSession = DoaDocSession::getSession();
            $noOrdre = $clSession->getNoOrdre();
            $nomOri = $clSession->getNomOri();
            $vide = '';
            
            if ($reqSqlDoaRecord = SqlDoaActions::rqGetInfoDoaRecordVal($ID_OBJET, $idDonnee, $idData, $idRecord)->TrouveTous()) {
                foreach ($reqSqlDoaRecord as & $valueRecord) {
                    $ID_OBJET = DOA_Action::getDoaActionDataByDonneeData($idDonnee, $valueRecord['ID_DATA'], 'ID_OBJET');
                    $infoDoaRecord[] = array(
                        '!ID_DATA' => $valueRecord['ID_DATA'],
                        '!VALEUR' => $valueRecord['VALEUR'],
                        'NOM_DATA' => array(
                            '!VALUE' => DOA_Action::getDoaActionDataByDonneeData($idDonnee, $valueRecord['ID_DATA'], 'NOM_DATA'),
                            '!id' => 'VALEUR_' . $valueRecord['ID_DATA']
                        ),
                        '!ID_OBJET' => $ID_OBJET,
                        '!FLAG_ID_OBJET' => DOA_Action::getDoaActionDataByDonneeData($idDonnee, $valueRecord['ID_DATA'], 'FLAG_ID_OBJET'),
                        '!DONNEE' => DOA_Action::getDoaStruct($TYPE_OBJET, $ID_OBJET, $idDonnee, 'NOM_DONNEE'),
                        '!AFFICHEE' => BoolSql(DOA_Action::getDoaActionData($TYPE_OBJET, $ID_OBJET, $idDonnee, $valueRecord['ID_DATA'], 'AFFICHEE')),
                        '!MODIFIABLE' => BoolSql(DOA_Action::getDoaActionData($TYPE_OBJET, $ID_OBJET, $idDonnee, $valueRecord['ID_DATA'], 'MODIFIABLE')),
                        '!TYPE_DATA' => DOA_Action::getDoaData($TYPE_OBJET, $ID_OBJET, $idDonnee, $valueRecord['ID_DATA'], 'TYPE_DATA'),
                        '!FIC_GENERE' => DOA_Action::getDoaData($TYPE_OBJET, $ID_OBJET, $idDonnee, $valueRecord['ID_DATA'], 'FIC_GENERE'),
                        '!NOM_ORI' => ($idData == $valueRecord['ID_DATA']) ? $nomOri : '',
                        '!NO_ORDRE' => ($idData == $valueRecord['ID_DATA']) ? $noOrdre : '',
                        '!ajouter_document' => 'OpenPopup(\'DOA_Action.php?action=AjouterDocument&id_bloc=1&idDoa=' . $ID_OBJET . '&idData=' . $valueRecord['ID_DATA'] . '&idRecord=' . $idRecord . '\',\'popup_ajout_doc\',530,585);'
                    );
                }
            }
        }
        $array['ide']['fiche']['!div_id'] = DOA_Action::id_DIV;
        $array['ide']['fiche']['!modifier_donnee_actions_multi'] = 'Traite(\'DOA_Action.php?action=ModifierDonneeAction&idDonnee=' . $idDonnee . '&idTache=' . $idTache . '&idObjet=' . $idObjet . '&idRecord=' . $idRecord . '&idAction=' . $idAction . '\',document.form_modifier_donnee_action_multi.elements[0]);';
        $array['ide']['fiche']['DATA_MULTIPLE'] = $infoDoaRecord;
        $array['fenetre']['!titre'] = trad('Modification d\'une data');
        return $array;
    }

    public static function ReconstruitRecordVal($TYPE_OBJET, $ID_OBJET, $ID_DONNEE, $ID_DATA, $ID_RECORD, $VALEUR, $deleteData = true)
    {
        //
        // AMI : v2
        //
        $arrayReqSql = null;
        $arrayModif = null;
        
        // On récupère la structure de la data
        // ATETENTION AU SEIN DE CETTE PROCEDURE NE PASSE QUE LES DATS AYANT UNE POSSIBILITE D'ETRE MISE A JOUR
        
        if ($DATA_MODIFIEE = SqlDoaActions::rqGetInfoDoaData($TYPE_OBJET, $ID_OBJET, $ID_DONNEE, $ID_DATA)->Trouve1()) {
            
            // 1. Quelle est la data qui a été modifiée ?
            
            // Quels sont les tables et champs concernés pour aller chercher les valeurs ?
            $NOM_TABLE = '';
            $NOM_CHAMPS = '';
            
            /*
             * if (BoolSql($valueDATA['DATA_LIE_A_OBJ']) && BoolSql($valueDATA['ID_OBJET_DATA']) && $MODIFIABLE) {
             * if (BoolSql($valueDATA['LIE_A_OBJET']) && BoolSql($valueDATA['CLE_UNIQUE']) && $MODIFIABLE) {
             */
            
            // Cas de figure concernant la liaison donnée / data
            if (BoolSql($DATA_MODIFIEE['LIE_A_OBJET'])) {
                if (BoolSql($DATA_MODIFIEE['CLE_UNIQUE'])) {
                    $NOM_TABLE = $DATA_MODIFIEE['OBJET_DATA'];
                    $NOM_CHAMPS = $DATA_MODIFIEE['OBJET'];
                } else {
                    // ici on est sur la data de reference servant à contruire cette donnée attentionici on ne devrait jamais y passer
                    print_r($DATA_MODIFIEE);
                    exit();
                }
            } else if (BoolSql($DATA_MODIFIEE['DATA_LIE_A_OBJ'])) {
                if (BoolSql($DATA_MODIFIEE['ID_OBJET_DATA'])) {
                    // ici on est sur l'identifiant unique
                    $NOM_TABLE = $DATA_MODIFIEE['OBJET_DATA'];
                    $NOM_CHAMPS = $DATA_MODIFIEE['CHAMP_OBJET_DATA'];
                } else {
                    // ici on est sur la data de reference servant à contruire cette donnée attentionici on ne devrait jamais y passer
                    print_r($DATA_MODIFIEE);
                    exit();
                }
            }
            
            // On va chercher les valeurs de ces éléments
            if ('' !== $NOM_TABLE && '' !== $NOM_CHAMPS) {
                // Tout d'abord, on vérifie si la clé est simple ou composite
                if (false === strpos($NOM_CHAMPS, '|')) {
                    $NOM_CHAMP1 = $NOM_CHAMPS;
                    $NOM_CHAMP2 = '';
                    $VALEUR1 = $VALEUR;
                    $VALEUR2 = '';
                } else {
                    $TAB_NOM_CHAMPS = explode('|', $NOM_CHAMPS);
                    $NOM_CHAMP1 = $TAB_NOM_CHAMPS[0];
                    $NOM_CHAMP2 = $TAB_NOM_CHAMPS[1];
                    // Pour l'instant, on va considérer le premier champ comme étant le code société de l'utilisateur
                    $VALEUR1 = $_SESSION['Session_SocUsr'];
                    $VALEUR2 = $VALEUR;
                }
                
                // TODO TODO TODO IMPERATIF A REVOIR car ce n'est pas du tout le bon controle
                if (DOA_BDD::IsTableCS($NOM_TABLE)) {
                    $reqSqlDonneesTable = SqlDoaActions::rqDOA_GetDonneePourTableCS($NOM_TABLE, $NOM_CHAMP1, $VALEUR1, $NOM_CHAMP2, $VALEUR2)->Trouve1();
                    $isRelationDb = false;
                } else {
                    if ($reqSqlDonneesTable = SqlDoaActions::rqDOA_GetDonneePourTable($NOM_TABLE, $NOM_CHAMP1, $VALEUR1, $NOM_CHAMP2, $VALEUR2)->Trouve1()) {
                        /**
                         * Analyse du type de donnée car cela peut être une date ou aussi un boolean
                         * format date en stockage devra etre JJ/MM/AAAA
                         * format boolean en stockage devra etre O ou N
                         */
                        // EDP TODO A FINIR echo 'alert("',$NOM_TABLE,' ',$NOM_CHAMP2,'");'; SqlDoaBdd::rqGetInfoChamp($NOM_TABLE, $NOM_CHAMP2);
                        $isRelationDb = true;
                    } else {
                        // La data est vide
                    }
                }
                
                if (is_array($reqSqlDonneesTable)) {
                    $reqSqlDATA = SqlDoaActions::rqGetInfoDoaData($TYPE_OBJET, $ID_OBJET, $ID_DONNEE)->TrouveTous();
                    
                    if (BoolSql($DATA_MODIFIEE['LIE_A_OBJET']) && BoolSql($DATA_MODIFIEE['CLE_UNIQUE'])) {
                        // Il y a en effet des données dans la table, on peut les ajouter
                        // On parcoure le format des data pour savoir quels sont les champs à alimenter
                        foreach ($reqSqlDATA as & $valueDATA)
                            // $ID_DATA!=$valueDATA['ID_DATA'] est présent pour éviter qu'on modifie la valeur en cours
                            // Possiblement à supprimer ?
                            if (BoolSql($valueDATA['LIE_A_OBJET']) && $ID_DATA != $valueDATA['ID_DATA']) {
                                $champ = $valueDATA['OBJET'];
                                
                                if ($isRelationDb)
                                    $valeur = DOA_Referentiel::ConvertiChampDbValeurCs($NOM_TABLE, $champ, $reqSqlDonneesTable[$champ]);
                                else
                                    $valeur = $reqSqlDonneesTable[$champ];
                                
                                $arrayModif[] = array(
                                    'ID_DATA' => $valueDATA['ID_DATA'],
                                    'ID_RECORD' => $ID_RECORD,
                                    'VALEUR' => $valeur
                                );
                            }
                    } 
                    elseif (BoolSql($DATA_MODIFIEE['DATA_LIE_A_OBJ']) && BoolSql($DATA_MODIFIEE['ID_OBJET_DATA'])) {
                        foreach ($reqSqlDATA as & $valueDATA)
                            if (BoolSql($valueDATA['DATA_LIE_A_OBJ']) && $valueDATA['ID_DATA_LIEE'] == $DATA_MODIFIEE['ID_DATA']) {
                                $champ = $valueDATA['CHAMP_OBJET_DATA'];
                                if ($isRelationDb)
                                    $valeur = DOA_Referentiel::ConvertiChampDbValeurCs($NOM_TABLE, $champ, $reqSqlDonneesTable[$champ]);
                                else
                                    $valeur = $reqSqlDonneesTable[$champ];
                                
                                $arrayModif[] = array(
                                    'ID_DATA' => $valueDATA['ID_DATA'],
                                    'ID_RECORD' => $ID_RECORD,
                                    'VALEUR' => $reqSqlDonneesTable[$champ]
                                );
                            }
                    }
                } else if ($deleteData) {
                    if ($reqSqlDATA = SqlDoaActions::rqGetInfoDoaData($TYPE_OBJET, $ID_OBJET, $ID_DONNEE)->TrouveTous())
                        if (BoolSql($DATA_MODIFIEE['LIE_A_OBJET']) && BoolSql($DATA_MODIFIEE['CLE_UNIQUE'])) {
                            foreach ($reqSqlDATA as & $valueDATA)
                                if (BoolSql($valueDATA['LIE_A_OBJET']) && $ID_DATA != $valueDATA['ID_DATA']) {
                                    $arrayModif[] = array(
                                        'ID_DATA' => $valueDATA['ID_DATA'],
                                        'ID_RECORD' => $ID_RECORD,
                                        'VALEUR' => ''
                                    );
                                }
                        } elseif (BoolSql($DATA_MODIFIEE['DATA_LIE_A_OBJ']) && BoolSql($DATA_MODIFIEE['ID_OBJET_DATA'])) {
                            foreach ($reqSqlDATA as & $valueDATA)
                                if (BoolSql($valueDATA['DATA_LIE_A_OBJ']) && $valueDATA['ID_DATA_LIEE'] == $DATA_MODIFIEE['ID_DATA']) {
                                    $arrayModif[] = array(
                                        'ID_DATA' => $valueDATA['ID_DATA'],
                                        'ID_RECORD' => $ID_RECORD,
                                        'VALEUR' => ''
                                    );
                                }
                        }
                }
            }
        }
        
        // Si on a des modification à faire...
        if (is_array($arrayModif)) {
            // On cherche les valeurs existantes
            $ID_DATA = null;
            $reqSqlExistant = SqlDoaActions::rqGetInfoDoaRecordVal($ID_OBJET, $ID_DONNEE, $ID_DATA, $ID_RECORD)->TrouveTous();
            if (is_array($reqSqlExistant))
                foreach ($reqSqlExistant as & $value)
                    $arrayExistant[] = array(
                        'ID_DATA' => $value['ID_DATA'],
                        'ID_RECORD' => $value['ID_RECORD'],
                        'VALEUR' => $value['VALEUR']
                    );
            
            $arrayReqSql = null;
            // On parcoure l'existant pour chacune de modification à appliquer
            foreach ($arrayModif as & $valueModif) {
                $ID_DATA_MODIF = $valueModif['ID_DATA'];
                $ID_DONNEETrouve = false;
                if (is_array($arrayExistant))
                    foreach ($arrayExistant as & $valueExistant)
                        if ($valueExistant['ID_DATA'] == $ID_DATA_MODIF) {
                            $ID_DONNEETrouve = true;
                            // Est-ce que nous avons un record à modifier?
                            // if ($valueExistant['VALEUR'] !== $valueModif['VALEUR'])
                            {
                                // La valeur en base diffère de l'actuelle, on prépare le sql de mise à jour
                                $arrayReqSql[] = SqlDoaActions::rqDOA_UpdateRecordVal($ID_OBJET, $ID_DONNEE, $ID_DATA_MODIF, $valueModif['ID_RECORD'], $valueModif['VALEUR']);
                            }
                            break;
                        }
                // La donnée n'existe pas dans la base, on prépare le sql d'ajout
                if (! $ID_DONNEETrouve)
                    $arrayReqSql[] = SqlDoaActions::rqDOA_InsertRecordVal($ID_OBJET, $ID_DONNEE, $valueModif['ID_DATA'], $valueModif['ID_RECORD'], $valueModif['VALEUR']);
            }
        }
        // On renvoie d'une part les requêtes Sql (pour modifications en bases de données)
        // Et les information de modification brutes (pour modifications html )
        return array(
            'arrayReqSql' => $arrayReqSql,
            'arrayModif' => $arrayModif
        );
    }

    /*
     * @todo enregistrement du numero d'ordre dans DOA_RECORD_VAL lorsque TYPE_PJ=F(donnée multiple)
     * @todo enregistrement de la valeur d'une data lorsque TYPE_PJ=F(donnée unique)
     */
    public static function &AjouterDonneeAction($idDoa, $idDonnee, $GET, $idDataSource, $idRecord)
    {
        //
        // AMI : v2
        //
        $messageErreur = '';
        
        $clSession = DoaBibSession::getSession();
        $TYPE_OBJET = $clSession->getTypeObject();
        $ID_OBJET = $clSession->getIdObject();
        $arrayValeurs = null;
        
        // Quelle sont les valeurs qui ont été modifiée / ajoutée?
        $deleteData = false;
        
        foreach ($GET as $key => $value) {
            $tmp = explode('_', $key);
            if ($tmp[0] == 'VALEUR' && isset($tmp[1])) {
                $VALEUR = trim(GetValue($key));
                $idData = $tmp[1];
                if (is_null($idDataSource) || $idData == $idDataSource) {
                    // On vérifie la valeur entrée (avec une modification de la valeur dans le cas du type data = logique)
                    $verif = DOA_Action::VerifieValeurDataSimple($idDonnee, $idData, $idRecord, $VALEUR);
                    $messageErreur = $verif['messageErreur'];
                    if ('' != $messageErreur)
                        break;
                    else if (! $verif['NePasEnregistrerCS']) {
                        $arrayValeurs[$idData] = $VALEUR;
                        $deleteData = $verif['deleteData'];
                    }
                }
            }
        }
        
        if ('' == $messageErreur) {
            // si l'id record est vide , on en calcule un (donnée multiple)
            $arrayReqSql = array();
            if (is_array($arrayValeurs)) {
                $continue = true;
                if (- 1 == $idRecord) {
                    if ($deleteData) {
                        $continue = false;
                    } else {
                        if ($reqMax = SqlDoaActions::rqDOA_getMaxIdRecord_RecordVal($idDoa, $idDonnee)->Trouve1())
                            $idRecord = $reqMax['ID'];
                        else
                            $idRecord = 0;
                        
                        $idRecord ++;
                        
                        $arrayReqSql[] = SqlDoaActions::rqDOA_InsertRecord($ID_OBJET, $idDonnee, $idRecord);
                    }
                }
                
                if ($continue) {
                    if (is_array($arrayValeurs))
                        foreach ($arrayValeurs as $ID_DATA => & $VALEUR)
                            if (is_null($idDataSource) || $ID_DATA == $idDataSource) {
                                // S'il y a un existant, on vérifie sa présence
                                $reqSqlExistant = SqlDoaActions::rqGetInfoDoaRecordVal($ID_OBJET, $idDonnee, $ID_DATA, $idRecord)->Trouve1();
                                $modeModif = is_array($reqSqlExistant);
                                
                                // Au cas ou la data pilote d'autres valeurs :
                                $arrayRecordval = DOA_Action::ReconstruitRecordVal($TYPE_OBJET, $ID_OBJET, $idDonnee, $ID_DATA, $idRecord, $VALEUR, $deleteData);
                                
                                $arraySqlDataDerivee = $arrayRecordval['arrayReqSql'];
                                if (is_array($arraySqlDataDerivee)) {
                                    $arrayReqSqlTmp = array_merge($arrayReqSql, $arraySqlDataDerivee);
                                    $arrayReqSql = & $arrayReqSqlTmp;
                                }
                                
                                if ($modeModif)
                                    $arrayReqSql[] = SqlDoaActions::rqDOA_UpdateRecordVal($ID_OBJET, $idDonnee, $ID_DATA, $idRecord, $VALEUR);
                                else
                                    $arrayReqSql[] = SqlDoaActions::rqDOA_InsertRecordVal($ID_OBJET, $idDonnee, $ID_DATA, $idRecord, $VALEUR);
                            }
                    
                    if (is_array($arrayReqSql)) {
                        $pileSql = new PileSql(DB_OXASQLDB);
                        foreach ($arrayReqSql as $reqSql) {
                            $sqlOk = $pileSql->AddRequeteSql($reqSql);
                            if (! $sqlOk)
                                break;
                        }
                        
                        if ($sqlOk) {
                            $pileSql->Commit();
                            
                            $clSessionAction = DoaDocAction::getSession();
                            $clSessionAction->setIdRecord($idRecord);
                        } else
                            $messageErreur = Trad('Une erreur s\'est produite pendant l\'enregistrement des données.');
                    }
                } else {
                    // Annuleation de la saisie en mode ajout multiple
                    $messageErreur = '';
                }
            } else {
                // Rien a sauvegarder
                $messageErreur = '';
            }
        }
        
        // return array(
        // 'messageErreur' => $messageErreur
        // );
        return $messageErreur;
    }

    public static function SupprimerDonneeAction($idRecord, $idDonnee, $idDoa, $idData = null)
    {
        $SqlListe = new PileSql(DB_OXASQLDB);
        if ($idRecord != 0 && is_null($idData))
            $SqlListe->AddRequeteSql(SqlDoaActions::rqDOA_DeleteDonneeRecord($idRecord, $idDonnee, $idDoa));
        
        /**
         * Attention a la suppression de data de type F
         */
        if ($reqSql = SqlDoaActions::rqGetInfoDoaRecordVal($idDoa, $idDonnee, $idData, $idRecord)->TrouveTous())
            foreach ($reqSql as & $data)
                if ($reqData = SqlDoaBibliotheque::rqDOA_GetInfoData($data['ID_DATA'], 'D', $data['ID_DOA'], $data['ID_DONNEE'])->Trouve1()) {
                    if ($reqData['TYPE_DATA'] == 'F') {
                        $COD_ENR = str_pad($data['ID_DOA'], 9, 0, STR_PAD_LEFT);
                        
                        $SqlListe->AddRequeteSql(SqlDoaDocument::rqSupprimeDocument('DOA', $COD_ENR, $data['VALEUR']));
                    }
                    
                    $SqlListe->AddRequeteSql(SqlDoaActions::rqDOA_DeleteDonneeRecordVal($data['ID_RECORD'], $data['ID_DONNEE'], $data['ID_DOA'], $data['ID_DATA']));
                }
        return ($SqlListe->Commit());
    }

    public static function TerminerAction($TYPE_OBJET, $ID_OBJET, $ID_TACHE, $ID_ACTION)
    {
        $messageErreur = '';
        
        if (! SqlDoaActions::rqDOA_UpdateAction($TYPE_OBJET, $ID_OBJET, $ID_TACHE, $ID_ACTION)->ExecuteSql())
            $messageErreur = Trad('Une erreur est survenue pendant l\'enregistrement de l\'action.');
        
        return array(
            'messageErreur' => $messageErreur
        );
    }

    static function saveSessionDocument($noDa, $codEnr, $noOrdre, $typePj, $titre, $nomOri, $nomFic, $dtParut, $dtValid, $auteur, $centre)
    {
        $cl = new DoaDocSession();
        $cl->setNoDa($noDa);
        $cl->setCodEnr($codEnr);
        $cl->setNoOrdre($noOrdre);
        $cl->setTypePj($typePj);
        $cl->setTitre($titre);
        $cl->setNomOri($nomOri);
        $cl->setNomFic($nomFic);
        $cl->setDtParut($dtParut);
        $cl->setDtValid($dtValid);
        $cl->setAuteur($auteur);
        $cl->setCentre($centre);
        return $cl;
    }

    /**
     *
     * @param unknown $idAction
     * @param unknown $idDonnee
     * @param unknown $idObjet
     * @param unknown $idRecord
     * @param unknown $idTache
     * @param string $idData
     */
    public static function saveSessionAction($idAction, $idDonnee, $idObjet, $idRecord, $idTache, $idData = '')
    {
        $cl = new DoaDocAction();
        $cl->setIdObjet($idObjet);
        $cl->setIdTache($idTache);
        $cl->setIdAction($idAction);
        $cl->setIdDonnee($idDonnee);
        $cl->setIdData($idData);
        $cl->setIdRecord($idRecord);
    }

    public static function &getXMLArrayAfficheErreur($action)
    {
        $array = null;
        
        $array['popup_title'] = trad('Information sur le traitement');
        $array['fiche']['!title'] = 'frm_validation';
        $array['form']['name']['!value'] = 'frm_validation';
        $array['wsdl'] = DOA_Action::getWsdlRetour();
        
        return $array;
    }

    public static function &getXMLArrayValidation($action, $origine = null)
    {
        $array = null;
        
        $array['popup_title'] = trad('Information validation d\'une action');
        $array['fiche']['!title'] = 'frm_validation';
        $array['form']['name']['!value'] = 'frm_validation';
        $array['wsdl'] = DOA_Action::getWsdlRetour();
        $array['execution']['!value'] = "CallUrl('popup_doa_action_validation.php','action={$action}F" . (is_null($origine) || $origine == '' ? '' : '&origine=' . $origine) . "');return false;";
        if ($action == 'TerminerAction') {
            $array['execution']['!title'] = trad('Valider l\'action');
            $array['execution']['!texte'] = trad('Valider l\'action');
        }
        
        return $array;
    }

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

    public static function setForceTerminerAction($action, $origine = null)
    {
        $xml = DOA_Action::getWsdlRetour();
        
        DOA_Action::TerminerActionDOA($xml['ID_DOA'], $xml['ID_TACHE'], $xml['ID_ACTION'], true, $action);
        echo 'closePopup();';
        
        if (is_null($origine))
            echo 'parent.CallUrl(\'DOA_Action.php?action=TerminerActionRefresh&idObjet=', $xml['ID_DOA'], '\');';
        else { // Ici en theorie origine devrait valoir ENTETE{
            echo 'parent.closePopup("win_pop_exec_tache");';
            echo 'parent.CallUrl(\'DOA_Action.php?action=TerminerActionRefresh&idObjet=', $xml['ID_DOA'], '&origine=', $origine, '\');';
        }
    }

    public static function TerminerActionDOA(&$ID_OBJET, &$ID_TACHE, &$ID_ACTION, $confirmation, $action, $origine = '')
    {
        $messageErreur = '';
        $confirmationOk = '';
        $erreurBloquante = false;
        $jsConfirmation = '';
        
        if ('TerminerActionDOA' == $action || 'TerminerAction' == $action || 'TerminerActionF' == $action) {
            $xml = '<TermineActionDOAIn LngUtilisation="' . $_SESSION['Session_Langue'] . '">' . '<CodeUtilisateur>' . $_SESSION['Session_Login'] . '</CodeUtilisateur>' . '<ID_DOA>' . $ID_OBJET . '</ID_DOA>' . '<ID_TACHE>' . $ID_TACHE . '</ID_TACHE>' . '<ID_ACTION>' . $ID_ACTION . '</ID_ACTION>' . '<Confirmation>' . BoolWsdl($confirmation) . '</Confirmation>' . '</TermineActionDOAIn>';
            $methode = 'OXAPRC_DOA_FERMEACTION';
        }
        
        if(isset($method))
            $client = new SopaClientOxa(Wsdl::WsdlUrl() . $method . '.wsdl', true);
        else
            $client = new SopaClientOxa(Wsdl::WsdlUrl() . '.wsdl', true);
        
        if ($resultat = ($client->call($methode, $xml, 'http://tempuri.org', '', false, null, 'rpc', 'UTF-8'))) {
            switch ($resultat['Statut']) {
                case 'E':
                    $messageErreur = $resultat['MsgErreur'];
                    $confirmationOk = false;
                    break;
                case 'B':
                case 'A':
                    
                    $afficheValidation = false;
                    
                    if (array_key_exists('ListeErreur', $resultat)) {
                        $listeErreur = & $resultat['ListeErreur'];
                        if (array_key_exists('Erreur', $listeErreur))
                            $afficheValidation = true;
                    }
                    
                    if ($afficheValidation) {
                        if (isset($forcage) && $forcage) {
                            // ANORMAL
                        } else {
                            FluxXml::SaveFlux(DOA::WSDL_TMP, $client->responseData);
                            echo "var win_pop = OpenPopup('popup_doa_action_validation.php?action={$action}&origine={$origine}','win_pop','600','500');";
                            exit();
                        }
                    } else if ($statut == 'B') {
                        Affichage::messageJS(Trad('Impossible de valider cette DOA'));
                    } else { // Systeme debug indiquant qu'un traitement est manquant à developper futur
                        echo 'ERREUR en RETOUR WSDL';
                        print_r($resultat);
                        exit();
                    }
                    
                    $confirmationOk = ! $erreurBloquante;
                    break;
                case 'O': // indication que tout est ok sans aucun message du WSDL
                    $confirmationOk = false;
                    break;
            }
        }
        
        return array(
            'messageErreur' => $messageErreur,
            'confirmationOk' => $confirmationOk,
            'jsConfirmation' => $jsConfirmation
        );
    }

    public static function RefreshListDonnees($prefix, $action, $typeObjet, $idObjet, $idTache, $idAction)
    {
        $mode = 'LE';
        
        $array = DOA_Action::BuildXmlActionExecuter_v2('ENTETE', $typeObjet, $idObjet, $idTache, $idAction, false);
        
        // AMI 20160411 : Si l'array n'est pas initialisé, alors ça peut planter
        if (! array_key_exists('ide', $array))
            $array['ide'] = array();
        
        $array['ide']['!action'] = & $action;
        
        // AMI 20160411 : Si l'array n'est pas initialisé, alors ça peut planter
        if (! array_key_exists('fiche', $array['ide']))
            $array['ide']['fiche'] = array();
        
        $array['ide']['fiche']['!mode'] = & $mode;
        
        $genXsl = new GenXslt(true);
        $genXsl->XslHtml('application/xsl/doa/DOA_Action.xsl', $array);
        
        echo $genXsl->echoHtml('ListeDonnees', $prefix);
    }

    public static function refreshPopupModif($TYPE_OBJECT, $ID_OBJECT, $idTache, $idAction)
    {
        $genXsl = new GenXslt(true);
        $genXsl->XslHtml('application/xsl/doa/DOA_Action.xsl', DOA_Action::BuildSaisieData());
        
        $genXsl->echoHtml('ListeDonnees', 'Oxa_getDevice().popList["win_pop_modif"].');
        
        if (is_null($idTache) || $idTache == '') {
            echo 'parent.CallUrl(\'DOA_Bibliotheque.php?action=selectCurrentIdCat\');';
        } else {
            
            echo 'try {';
            DOA_Action::RefreshListDonnees('Oxa_getDevice().popList["win_pop_exec_tache"].', 'RefreshActionExecuter', $TYPE_OBJECT, $ID_OBJECT, $idTache, $idAction);
            echo '} catch (e) {} ';
        }
    }
}