<?php

class DOA_Planning_PopupDefinition
{

    public static $id_FORMULAIRE = 'FORMULAIRE_DEFINITION_PLANNING';

    public static $id_Treeviewtaches = 'Treeviewtaches';

    public static $id_Paneltableau = 'PanelTableau';

    public static $id_ID_TACHE_H = 'ID_TACHE_H';

    public static $id_ROLES = 'ROLES';

    public static $id_STATUT = 'ID_STATUT';

    public static $id_MODE = 'ID_MODE';

    public static function JavascriptRafraichitTableau()
    {
        $js = 'Traite(\'DOA_Planning.php?action=AfficherTableau\', document.FORMULAIRE_DEFINITION_PLANNING.elements[0]);';
        return $js;
    }

    public static function &BuildXml()
    {
        $array = null;
        $clSession = DoaBibSession::getSession();
        if (! is_null($clSession)) {
            $TYPE_OBJET = $clSession->getTypeObject();
            $ID_OBJET = $clSession->getIdObject();
            
            if ($reqDoa = SqlDoa::rqGetInfoSuiviDoa($ID_OBJET)->Trouve1()) {
                $array['ID_TACHE_H'] = array(
                    '!ID' => DOA_Planning_PopupDefinition::$id_ID_TACHE_H
                );
                $array['ROLES'] = array(
                    '!ID' => DOA_Planning_PopupDefinition::$id_ROLES,
                    'listeValeurs' => DOA_Referentiel::BuildXmlRoles(),
                    '!onchange' => DOA_Planning_PopupDefinition::JavascriptRafraichitTableau()
                );
                
                $listeStatuts[] = array(
                    '!CODE' => '',
                    '!LIBELLE' => Trad('Toutes')
                );
                $listeStatuts[] = array(
                    '!CODE' => 'OUV',
                    '!LIBELLE' => Trad('Ouvertes')
                );
                $listeStatuts[] = array(
                    '!CODE' => 'FER',
                    '!LIBELLE' => Trad('Fermées')
                );
                $array['STATUT'] = array(
                    '!ID' => DOA_Planning_PopupDefinition::$id_STATUT,
                    'listeValeurs' => $listeStatuts,
                    '!onchange' => 'Traite(\'DOA_Planning.php?action=AfficherTableau\', document.FORMULAIRE_DEFINITION_PLANNING.elements[0]);'
                );
                
                $array['panelHierarchie'] = array(
                    '!ID' => DOA_Planning_PopupDefinition::$id_Treeviewtaches,
                    '!onclickTout' => 'document.getElementById(\'' . DOA_Planning_PopupDefinition::$id_ID_TACHE_H . '\').value=\'\';' . DOA_Planning_PopupDefinition::JavascriptRafraichitTableau()
                );
                
                $array['panelTableau'] = array(
                    '!ID' => DOA_Planning_PopupDefinition::$id_Paneltableau,
                    'tableau' => DOA_Planning_PopupDefinition::BuildXmlTableau('', '', '', (BoolSql($reqDoa['MODEPLANNING']) ? 'CALC' : 'MAN'))
                );
                
                $array['FORM'] = array(
                    '!ID' => DOA_Planning_PopupDefinition::$id_FORMULAIRE,
                    // '!onclickEnregistrer' => 'TraiteAsync(\'DOA_Planning.php?action=EnregistrerPlanning\',document.'.DOA_Planning_PopupDefinition::$id_FORMULAIRE_VALEURS.'.elements[0],\'\',\'' . cnv_to_javascript(trad('Enregistrement des informations...')) . '\');',
                    '!onclickRafraichir' => DOA_Planning_PopupDefinition::JavascriptRafraichitTableau()
                );
                
                if ($reqDoa = SqlDoa::rqGetInfoSuiviDoa($ID_OBJET)->Trouve1())
                    if ($reqDoa['STATUT'] == DOA_Referentiel::STATUT_ENCOURS)
                        $array['FORM']['!onclickArchiver'] = 'CallUrl(\'DOA_Planning.php?action=ArchiverPlanning\')';
            }
        }
        return $array;
    }

    public static function BuildAccueil()
    {
        $array['ide']['popup'] = DOA_Planning_PopupDefinition::BuildXml();
        $array['ide']['!action'] = 'DefinirPlanning';
        $array['popup_title'] = trad('Définition du planning');
        
        $genXsl = new GenXslt(true);
        echo $genXsl->XslHtml(DOA_Planning::$fichier_xsl, $array);
        
        // Mise en traitement du traitement de refresh pour le close de la popup
        echo '<script type="text/javascript">';
        echo 'Oxa_getDevice().popList["definir_planning"].winEvents.urlcall = "parent.CallUrl(\'DOA.php?action=ChangeOnglet&ancrage=DOA_ONGLET&ID_ONGLET=ONG_PLANNING\');";';
        echo '</script>';
        DOA_Referentiel::AfficherTreeviewTaches(DOA_Planning_PopupDefinition::$id_Treeviewtaches, 'DOA_Planning.php', 'selectTacheH', false, false);
        // Automatisation d'un système en accroche avec le windowClose de la popup
    }

    public static function BuildXmlTableau($ID_TACHE_H, $ROLE, $ID_STATUT, $MODE)
    {
        $clSession = DoaBibSession::getSession();
        $TYPE_OBJET = $clSession->getTypeObject();
        $ID_OBJET = $clSession->getIdObject();
        
        $array['MODE'] = array(
            '!ID' => DOA_Planning_PopupDefinition::$id_MODE,
            '!valueManuel' => 'MAN',
            '!manuelChecked' => ('MAN' == $MODE),
            '!valueRecalcul' => 'CALC',
            '!recalculChecked' => ('CALC' == $MODE),
            '!onchange' => DOA_Planning_PopupDefinition::JavascriptRafraichitTableau()
        );
        
        $array['ID_TACHE_H'] = array(
            '!ID' => DOA_Planning_PopupDefinition::$id_ID_TACHE_H,
            '!value' => $ID_TACHE_H
        );
        
        switch ($ID_STATUT) {
            case '':
                $TERMINEE = '';
                break;
            case 'OUV':
                $TERMINEE = false;
                break;
            case 'FER':
                $TERMINEE = true;
                break;
        }
        
        if ($lignesTmp = SqlDoaPlanning::rqDOA_Planning_GetListeTaches($TYPE_OBJET, $ID_OBJET, $ID_TACHE_H, $TERMINEE)->TrouveTous())
            foreach ($lignesTmp as & $value) {
                
                $reqContainte = SqlDoaActions::rqGetDoaTacContr($TYPE_OBJET, $ID_OBJET, $value['ID_TACHE'])->Trouve1();
                
                $TERMINEE = BoolSql($value['TERMINEE']);
                
                $modifdateDeb = ! $TERMINEE && is_null($reqContainte);
                $modifdateFin = ! $TERMINEE;
                
                $ID_LIB = 'LIB_' . $value['ID_TACHE'];
                $ID_DATE_DEB = 'DATE_DEB_' . $value['ID_TACHE'];
                $ID_DATE_FIN = 'DATE_FIN_' . $value['ID_TACHE'];
                $array['lignes'][] = array(
                    '!LIB' => & $value['LIB'],
                    '!ID_LIB' => $ID_LIB,
                    '!RESPONSABLE_LIB' => & $value['RESPONSABLE_LIB'],
                    '!TERMINEE' => ($TERMINEE) ? Trad('Oui') : Trad('Non'),
                    '!DATE_DEB_P0' => convertDateSqlToFr($value['DATE_DEB_P0']),
                    '!DATE_FIN_P0' => convertDateSqlToFr($value['DATE_FIN_P0']),
                    
                    '!DATE_DEB' => convertDateSqlToFr($value['DATE_DEB']),
                    '!DATE_DEB_ID' => $ID_DATE_DEB,
                    '!DATE_DEB_modifiable' => $modifdateDeb,
                    '!DATE_DEB_onclick' => ($modifdateDeb ? 'CL.show(null,document.getElementById(\'' . $ID_DATE_DEB . '\'),null,-80);' : ''),
                    '!DATE_DEB_onchange' => ($modifdateDeb ? 'Traite(\'DOA_Planning.php?action=VerifieDATE_DEB&ID_TACHE=' . $value['ID_TACHE'] . '\',this);' : ''),
                    
                    '!DATE_FIN' => convertDateSqlToFr($value['DATE_FIN']),
                    '!DATE_FIN_ID' => $ID_DATE_FIN,
                    '!DATE_FIN_modifiable' => $modifdateFin,
                    '!DATE_FIN_onclick' => ($modifdateFin ? 'CL.show(null,document.getElementById(\'' . $ID_DATE_FIN . '\'),null,-80);' : ''),
                    '!DATE_FIN_onchange' => ($modifdateFin ? 'Traite(\'DOA_Planning.php?action=VerifieDATE_FIN&ID_TACHE=' . $value['ID_TACHE'] . '\',this);' : '')
                );
            }
        
        return $array;
    }

    public static function VerifieDATE_DEB($GET)
    {
        $messageErreur = '';
        $javascript = '';
        
        $clSession = DoaBibSession::getSession();
        $TYPE_OBJET = $clSession->getTypeObject();
        $ID_OBJET = $clSession->getIdObject();
        
        $MODE = trim(getValue(DOA_Planning_PopupDefinition::$id_MODE));
        $ID_TACHE = trim(getValue('ID_TACHE'));
        $ID_TACHE_H = trim(getValue('ID_TACHE_H'));
        $DATE_DEB = trim(getValue('DATE_DEB_' . $ID_TACHE));
        $DATE_DEB_SQL = convertDateUserToSql($DATE_DEB);
        
        if ('' === $DATE_DEB_SQL || '00000000' == $DATE_DEB_SQL || ! ControleSaisie::isDateValideFormat($DATE_DEB))
            $messageErreur = Trad('La date de début n\'est pas correcte.');
        else {
            if ($reqSql = SqlDoaTache::rqDOA_Tache_Liste($TYPE_OBJET, $ID_OBJET, null, $ID_TACHE)->Trouve1()) {
                
                $reqDoa = SqlDoa::rqGetInfoSuiviDoa($ID_OBJET)->Trouve1();
                $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;
                
                if (isset($reqSql['TERMINE']) && BoolSql($reqSql['TERMINE'])) {
                    $messageErreur = Trad('Modification impossible, cette tache est terminé');
                } else {
                    $DUREE_PREV = $reqSql['DUREE_PREV'];
                    
                    if (0 == $DUREE_PREV)
                        $DATE_FIN_SQL = $DATE_DEB_SQL;
                    else {
                        $phpDATE_DEB = DateTime::createFromFormat('Ymd h:i:s', $DATE_DEB_SQL . ' 0:00:00');
                        $phpDATE_DEB->add(new DateInterval('P' . $DUREE_PREV . 'D'));
                        $DATE_FIN_SQL = $phpDATE_DEB->format('Ymd');
                    }
                    
                    if ('MAN' == $MODE) {
                        // Mode manuel
                        $objDate = date_create($DATE_FIN_SQL);
                        
                        // 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');
                        $DATE_FIN_SQL = date_format($objDate, 'Ymd');
                        
                        if (! SqlDoaPlanning::rqDOA_Planning_UpdateTache($TYPE_OBJET, $ID_OBJET, $ID_TACHE, $DATE_DEB_SQL, $DATE_FIN_SQL)->ExecuteSql())
                            $messageErreur = Trad('Erreur pendant l\'enregistrement des données');
                        else {
                            $DATE_FIN = convertDateSqlToFr($DATE_FIN_SQL);
                            $ID_DATE_FIN = 'DATE_FIN_' . $ID_TACHE;
                            Affichage::setValue($ID_DATE_FIN, $DATE_FIN);
                        }
                    } else {
                        // Mode recalcul
                        $traitementOk = true;
                        
                        /**
                         * Mise a jour de la tache ainsi que les taches qui y ont liés
                         */
                        if ($reqSqlTache = SqlDoaTache::rqDOA_Tache_Liste($TYPE_OBJET, $ID_OBJET, null, $ID_TACHE)->Trouve1()) {
                            $phpDATE_DEB = DateTime::createFromFormat('Ymd h:i:s', $DATE_DEB_SQL . ' 0:00:00');
                            $phpDATE_DEB->add(new DateInterval('P' . $DUREE_PREV . 'D'));
                            
                            // Recalcul de la date de debut si jour chome ou ferie
                            while (DOA::isJourChome($listJourChome, $phpDATE_DEB) || DOA::isJourFerie($reqDoa['ID_CAL'], $phpDATE_DEB))
                                $phpDATE_DEB->modify('+1 day');
                            $DATE_FIN_SQL = date_format($phpDATE_DEB, 'Ymd');
                            
                            $arrayElt[$ID_TACHE] = array(
                                'DATE_DEB_SQL' => $DATE_DEB_SQL,
                                'DATE_FIN_SQL' => $DATE_FIN_SQL
                            );
                            
                            $LAST_DATE_FIN_SQL = $DATE_FIN_SQL;
                            /**
                             * Recherche des taches non terminé qui pourrait avoir un lien sur cette dernière et dans ce cas, il faut aussi
                             * modifier leur date de debut, et calculer leur dates de fin et c'est la date de fin max qui va être utilisé par la suite.
                             */
                            if ($listeTacheGroupe = SqlDoaPlanning::rqDOA_Planning_GetGroupeTaches($TYPE_OBJET, $ID_OBJET, $ID_TACHE)->TrouveTous()) {
                                foreach ($listeTacheGroupe as & $taches)
                                    if (is_null($arrayElt) || ! array_key_exists($taches['ID_TACHE'], $arrayElt)) {
                                        $phpDATE_DEB = DateTime::createFromFormat('Ymd h:i:s', $DATE_DEB_SQL . ' 0:00:00');
                                        while (DOA::isJourChome($listJourChome, $phpDATE_DEB) || DOA::isJourFerie($reqDoa['ID_CAL'], $phpDATE_DEB))
                                            $phpDATE_DEB->modify('+1 day');
                                        
                                        $phpDATE_DEB->add(new DateInterval('P' . $taches['DUREE_PREV'] . 'D'));
                                        
                                        // Recalcul de la date de debut si jour chome ou ferie
                                        while (DOA::isJourChome($listJourChome, $phpDATE_DEB) || DOA::isJourFerie($reqDoa['ID_CAL'], $phpDATE_DEB))
                                            $phpDATE_DEB->modify('+1 day');
                                        $DATE_FIN_SQL = date_format($phpDATE_DEB, 'Ymd');
                                        
                                        $arrayElt[$taches['ID_TACHE']] = array(
                                            'DATE_DEB_SQL' => $DATE_DEB_SQL,
                                            'DATE_FIN_SQL' => $DATE_FIN_SQL
                                        );
                                        
                                        if ($DATE_FIN_SQL >= $LAST_DATE_FIN_SQL)
                                            $LAST_DATE_FIN_SQL = $DATE_FIN_SQL;
                                    }
                            }
                            
                            DOA_Planning_PopupDefinition::majDatePlanningAuto($arrayElt, $TYPE_OBJET, $ID_OBJET, $ID_TACHE, $LAST_DATE_FIN_SQL);
                            
                            if (is_array($arrayElt)) {
                                $pileSql = new PileSql(DB_OXASQLDB);
                                foreach ($arrayElt as $idTaches => & $value) {
                                    if (! $pileSql->AddRequeteSql(SqlDoaPlanning::rqDOA_Planning_UpdateTache($TYPE_OBJET, $ID_OBJET, $idTaches, $value['DATE_DEB_SQL'], $value['DATE_FIN_SQL'])))
                                        $traitementOk = false;
                                }
                                if ($traitementOk)
                                    $pileSql->Commit();
                            }
                            
                            if (! $traitementOk)
                                $messageErreur = Trad('Erreur pendant l\'enregistrement des données');
                            else {
                                echo DOA_Planning_PopupDefinition::JavascriptRafraichitTableau();
                            }
                        }
                    }
                }
            } else
                $messageErreur = Trad('Anomalie système recherche de la tache');
        }
        
        return array(
            'messageErreur' => $messageErreur
        );
    }

    /**
     * cette fonction met a jour les plannings qui suivent une tache ou un groupe de tache à partir d'un dernière date de fin
     *
     * @param unknown $arrayElt
     * @param unknown $TYPE_OBJET
     * @param unknown $ID_OBJET
     * @param unknown $ID_TACHE
     * @param unknown $LAST_DATE_FIN_SQL
     */
    public static function majDatePlanningAuto(& $arrayElt, & $TYPE_OBJET, & $ID_OBJET, & $ID_TACHE, & $LAST_DATE_FIN_SQL)
    {
        $insertionOk = false;
        // Suppression de la reference à l'arbo des taches, suite echange avec YA, la fonction auto doit agir sur TOUTES LES TACHES de TOUTES LES HIERARCHIE
        $ID_TACHE_H = null;
        // On récupère toutes les actions du périmètre
        $TERMINEE = false;
        if ($reqSql = SqlDoaPlanning::rqDOA_Planning_GetListeTaches($TYPE_OBJET, $ID_OBJET, $ID_TACHE_H, $TERMINEE)->TrouveTous())
            $reqDoa = SqlDoa::rqGetInfoSuiviDoa($ID_OBJET)->Trouve1();
        foreach ($reqSql as & $value)
            if (! BoolSql($value['TERMINE'])) {
                $ID_TACHE_TMP = $value['ID_TACHE'];
                
                // Gestion des taches dont le statut est termine
                if ($ID_TACHE == $ID_TACHE_TMP || $insertionOk) {
                    $DUREE_PREV = $value['DUREE_PREV'];
                    $DATE_DEB_SQL_TMP = $value['DATE_DEB'];
                    // $DATE_FIN_SQL_TMP = $value['DATE_FIN'];
                    
                    if (! $insertionOk) {
                        $insertionOk = true;
                    } else {
                        // La ligne a déjà été insérée, on recalcule les date
                        if (is_null($arrayElt) || ! array_key_exists($ID_TACHE_TMP, $arrayElt)) {
                            $DATE_DEB_SQL_TMP = $LAST_DATE_FIN_SQL;
                            // On ajoute un jour à la date de début
                            
                            $reqDoa = SqlDoa::rqGetInfoSuiviDoa($ID_OBJET)->Trouve1();
                            $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;
                            
                            $phpDATE_DEB = DateTime::createFromFormat('Ymd h:i:s', $DATE_DEB_SQL_TMP . ' 0:00:00');
                            $phpDATE_DEB->add(new DateInterval('P1D'));
                            while (DOA::isJourChome($listJourChome, $phpDATE_DEB) || DOA::isJourFerie($reqDoa['ID_CAL'], $phpDATE_DEB))
                                $phpDATE_DEB->modify('+1 day');
                            $DATE_DEB_SQL_TMP = $phpDATE_DEB->format('Ymd');
                            
                            // Puis on ajoute la durée prévisionnelle pour avoir la date de fin
                            $phpDATE_DEB->add(new DateInterval('P' . $DUREE_PREV . 'D'));
                            while (DOA::isJourChome($listJourChome, $phpDATE_DEB) || DOA::isJourFerie($reqDoa['ID_CAL'], $phpDATE_DEB))
                                $phpDATE_DEB->modify('+1 day');
                            
                            $DATE_FIN_SQL_TMP = $phpDATE_DEB->format('Ymd');
                            
                            $LAST_DATE_FIN_SQL = $DATE_FIN_SQL_TMP;
                            
                            /**
                             * Si la date de fin de l'élément en cours est inférieure à la date de début de l'élément à déplacer, on ne s'occupe pas de la tâche.
                             * if (!($DATE_FIN_SQL_TMP < $DATE_DEB_SQL) && !($value['DATE_DEB']>$DATE_FIN_SQL))
                             */
                            $arrayElt[$ID_TACHE_TMP] = array(
                                'DATE_DEB_SQL' => $DATE_DEB_SQL_TMP,
                                'DATE_FIN_SQL' => $DATE_FIN_SQL_TMP
                            );
                            
                            if ($listeTacheGroupe = SqlDoaPlanning::rqDOA_Planning_GetGroupeTaches($TYPE_OBJET, $ID_OBJET, $ID_TACHE_TMP)->TrouveTous())
                                foreach ($listeTacheGroupe as & $taches)
                                    if (is_null($arrayElt) || ! array_key_exists($taches['ID_TACHE'], $arrayElt)) {
                                        $phpDATE_DEB = DateTime::createFromFormat('Ymd h:i:s', $DATE_DEB_SQL_TMP . ' 0:00:00');
                                        
                                        $phpDATE_DEB->add(new DateInterval('P' . $taches['DUREE_PREV'] . 'D'));
                                        while (DOA::isJourChome($listJourChome, $phpDATE_DEB) || DOA::isJourFerie($reqDoa['ID_CAL'], $phpDATE_DEB))
                                            $phpDATE_DEB->modify('+1 day');
                                        
                                        $DATE_FIN_SQL = date_format($phpDATE_DEB, 'Ymd');
                                        
                                        $arrayElt[$taches['ID_TACHE']] = array(
                                            'DATE_DEB_SQL' => $DATE_DEB_SQL_TMP,
                                            'DATE_FIN_SQL' => $DATE_FIN_SQL
                                        );
                                        
                                        if ($DATE_FIN_SQL >= $LAST_DATE_FIN_SQL)
                                            $LAST_DATE_FIN_SQL = $DATE_FIN_SQL;
                                    }
                        }
                    }
                }
            }
    }

    public static function VerifieDATE_FIN($GET)
    {
        $messageErreur = '';
        
        $clSession = DoaBibSession::getSession();
        $TYPE_OBJET = $clSession->getTypeObject();
        $ID_OBJET = $clSession->getIdObject();
        
        $MODE = trim(getValue(DOA_Planning_PopupDefinition::$id_MODE));
        $ID_TACHE = trim(getValue('ID_TACHE'));
        $DATE_FIN = trim(getValue('DATE_FIN_' . $ID_TACHE));
        $DATE_FIN_SQL = convertDateUserToSql($DATE_FIN);
        
        if ('' === $DATE_FIN_SQL || '00000000' == $DATE_FIN_SQL || ! ControleSaisie::isDateValideFormat($DATE_FIN))
            $messageErreur = Trad('La date de début n\'est pas correcte.');
        else if ($reqSql = SqlDoaTache::rqDOA_Tache_Liste($TYPE_OBJET, $ID_OBJET, null, $ID_TACHE)->Trouve1()) {
            if (isset($reqSql['TERMINE']) && BoolSql($reqSql['TERMINE'])) {
                $messageErreur = Trad('Modification impossible, cette tache est terminé');
            } else {
                $DATE_DEB_SQL = $reqSql['DATE_DEB'];
                if ($DATE_DEB_SQL > $DATE_FIN_SQL)
                    $messageErreur = Trad('La date de fin doit être supérieure ou égale à la date de début.');
                else {
                    $MODE = trim(getValue(DOA_Planning_PopupDefinition::$id_MODE));
                    
                    $arrayElt[$ID_TACHE] = array(
                        'DATE_DEB_SQL' => $DATE_DEB_SQL,
                        'DATE_FIN_SQL' => $DATE_FIN_SQL
                    );
                    
                    if ('MAN' != $MODE) { // Cas du mode automatique
                                          // Recherche de la date de fin du groupe qui est là plus éloigné
                        $LAST_DATE_FIN_SQL = $DATE_FIN_SQL;
                        
                        if ($listeTacheGroupe = SqlDoaPlanning::rqDOA_Planning_GetGroupeTaches($TYPE_OBJET, $ID_OBJET, $ID_TACHE)->TrouveTous())
                            foreach ($listeTacheGroupe as & $taches)
                                if ($taches['DATE_FIN'] > $LAST_DATE_FIN_SQL)
                                    $LAST_DATE_FIN_SQL = $taches['DATE_FIN'];
                        
                        DOA_Planning_PopupDefinition::majDatePlanningAuto($arrayElt, $TYPE_OBJET, $ID_OBJET, $ID_TACHE, $LAST_DATE_FIN_SQL);
                    }
                    
                    $traitementOk = true;
                    $pileSql = new PileSql(DB_OXASQLDB);
                    foreach ($arrayElt as $idTaches => & $value)
                        if (! $pileSql->AddRequeteSql(SqlDoaPlanning::rqDOA_Planning_UpdateTache($TYPE_OBJET, $ID_OBJET, $idTaches, $value['DATE_DEB_SQL'], $value['DATE_FIN_SQL'])))
                            $traitementOk = false;
                    
                    if ($traitementOk) {
                        if ($pileSql->Commit())
                            echo DOA_Planning_PopupDefinition::JavascriptRafraichitTableau();
                        else
                            $messageErreur = Trad('Erreur pendant l\'enregistrement des données');
                    } else
                        $messageErreur = Trad('Erreur pendant l\'enregistrement des données');
                }
            }
        } else
            $messageErreur = Trad('Mise à jour impossible tache non trouvée');
        
        return array(
            'messageErreur' => $messageErreur
        );
    }

    public static function EnregistrerDonnees($GET)
    {
        $messageErreur = '';
        
        $clSession = DoaBibSession::getSession();
        $TYPE_OBJET = $clSession->getTypeObject();
        $ID_OBJET = $clSession->getIdObject();
        
        $MODE = trim(getValue(DOA_Planning_PopupDefinition::$id_MODE));
        
        $tableauDates = array();
        
        foreach ($GET as $key => $value)
            if (false !== strpos($key, 'DATE_DEB_')) {
                $ID_TACHE = substr($key, 9);
                $LIB = $GET['LIB_' . $ID_TACHE];
                $DATE_DEB = $value;
                $DATE_DEB_SQL = convertDateUserToSql($DATE_DEB);
                if ('' === $DATE_DEB_SQL || '00000000' === $DATE_DEB_SQL) {
                    $messageErreur = Trad('La date de début est invalide pour la tâche') . ' : ' . $LIB;
                    break;
                } else {
                    $DATE_FIN = $GET['DATE_FIN_' . $ID_TACHE];
                    $DATE_FIN_SQL = convertDateUserToSql($DATE_FIN);
                    if ('' === $DATE_FIN_SQL || '00000000' === $DATE_FIN_SQL) {
                        $messageErreur = Trad('La date de fin est invalide pour la tâche') . ' : ' . $LIB;
                        break;
                    } else {
                        if ($DATE_DEB_SQL >= $DATE_FIN_SQL)
                            $messageErreur = Trad('La date de fin doit être supérieure ou égale à la date de début pour la tâche') . ' : ' . $LIB;
                        else
                            $tableauDates[$ID_TACHE] = array(
                                'LIB' => $LIB,
                                'DATE_DEB' => $DATE_DEB,
                                'DATE_DEB_SQL' => $DATE_DEB_SQL,
                                'DATE_FIN' => $DATE_FIN,
                                'DATE_FIN_SQL' => $DATE_FIN_SQL
                            );
                    }
                }
            }
        
        if ('' == $messageErreur && count($tableauDates) > 1)
            if ('MAN' == $MODE) {
                // Mode manuel => directement dans la base
                $pileSql = new PileSql(DB_OXASQLDB);
                $transactOk = true;
                foreach ($tableauDates as $ID_TACHE => $value) {
                    if (! $pileSql->AddRequeteSql(SqlDoaPlanning::rqDOA_Planning_UpdateTache($TYPE_OBJET, $ID_OBJET, $ID_TACHE, $value['DATE_DEB_SQL'], $value['DATE_FIN_SQL']))) {
                        $transactOk = false;
                        break;
                    }
                }
                if (! $transactOk) {
                    $messageErreur = Trad('Une erreur a eu lieu pendant l\'enregistrement des données.');
                } else
                    $pileSql->Commit();
            } else {
                // Mode recalcul
            }
        return array(
            'messageErreur' => $messageErreur
        );
    }

    public static function ArchiverPlanning()
    {
        $messageErreur = '';
        
        $clSession = DoaBibSession::getSession();
        $TYPE_OBJET = $clSession->getTypeObject();
        $ID_OBJET = $clSession->getIdObject();
        
        $reqSql = SqlDoaPlanning::rqDOA_Planning_GetMaxVersion($ID_OBJET)->Trouve1();
        $ID_VERSION = $reqSql['max_id'] + 1;
        
        // On écrit l'entête
        $insertOk = false;
        $PileSql = new PileSql(DB_OXASQLDB);
        if ($PileSql->AddRequeteSql(SqlDoaPlanning::rqDOA_Planning_Histo_InsertEntete($ID_OBJET, $ID_VERSION, $COMMENTAIRE)))
            if ($PileSql->AddRequeteSql(SqlDoaPlanning::rqDOA_Planning_Histo_InsertLignes($ID_OBJET, $ID_VERSION)))
                $insertOk = true;
        if ($insertOk)
            $PileSql->Commit();
        else
            $messageErreur = Trad('Erreur pendant l\'insertion des données');
        
        return array(
            'messageErreur' => $messageErreur
        );
    }
}