<?php

class DOA_Tache
{

    public static $IdTreeviewCategories = 'TreeviewCategories';

    public static $IdListeTaches = 'Listetaches';

    public static $fichier_xsl = 'application/xsl/doa/DOA_Tache.xsl';

    const PROP_SESS_ID_TACHE_H = 'ID_TACHE_H_COURANT';

    public static function refreshCurrentTache()
    {
        $clSession = DoaBibSession::getSession();
        $ID_TACHE_H = $clSession->getProperties(DOA_Tache::PROP_SESS_ID_TACHE_H);
        
        if (DOA_Tache::TacheHIsOk($clSession->getTypeObject(), $clSession->getIdObject(), $ID_TACHE_H)) {
            $array = DOA_Tache::BuildListeTaches($ID_TACHE_H, $clSession->getTypeObject(), $clSession->getIdObject());
            
            $array['ide']['!action'] = 'ListerTaches';
            $genXsl = new GenXslt(true);
            Affichage::innerHTMLPointeur(DOA_Tache::$IdListeTaches, $genXsl->XslHtml(DOA_Tache::$fichier_xsl, $array));
        }
    }

    public static function JavascriptRafraichirOnglet(& $TYPE_OBJET, &$ID_OBJET, &$ID_TACHE)
    {
        $js = 'CallUrl(\'DOA_Tache.php?action=selectTacheH&TYPE_OBJET=' . $TYPE_OBJET . '&ID_OBJET=' . $ID_OBJET . '&ID_TACHE=' . $ID_TACHE . '\');';
        return $js;
    }

    public static function BuildXml($TYPE_OBJET, $ID_DOA, $statut, $ID_TACHE_H = '')
    {
        $array = array();
        $array['ide']['!action'] = 'accueil';
        
        /**
         * Statut UNIQUEMENT PREPARATION si cela change il faut penser au nouveau de création qui si on s'arrete là ne poura donc pas etre supprimé
         */
        if ('' == $ID_TACHE_H && DOA_Referentiel::STATUT_INITIAL == $statut && Param::canCreateDoaModele()) {
            $array['ide']['!MessageAjouterTache'] = Trad('Veuillez sélectionner un élément dans la hiérarchie pour ajouter des tâches');
            $array['ide']['!onclickAjouter'] = 'window.open(\'DOA_tache.php?action=AjouterTacheH&ID_TACHE_H=' . $ID_TACHE_H . '\',\'win_pop\',\'width=500,height=200\');';
            $array['ide']['!tooltipAjouter'] = trad('Ajouter une hiérarchie de tâche');
        }
        
        return $array;
    }

    public static function TacheHIsOk($TYPE_OBJET, $ID_OBJET, $ID_TACHE_H)
    {
        $reqSql = SqlDoaTache::rqDOA_Tache_IsOkPourAjout($TYPE_OBJET, $ID_OBJET, $ID_TACHE_H)->Trouve1();
        return (0 == $reqSql['nb']);
    }

    public static function BuildAccueil(& $ancrage, $TYPE_OBJET, $ID_DOA)
    {
        // Affichage de l'onglet
        $statut = DOA::GetStatut($ID_DOA);
        $array = DOA_Tache::BuildXml($TYPE_OBJET, $ID_DOA, $statut, '');
        
        $genXsl = new GenXslt(true);
        Affichage::innerHTMLPointeur($ancrage, $genXsl->XslHtml(DOA_Tache::$fichier_xsl, $array));
        
        // Affichage du treeview
        $cl = new DoaBibSession();
        $cl->setTypeObject($TYPE_OBJET);
        $cl->setIdObject($ID_DOA);
        
        $cl->setProperties(DOA_Tache::PROP_SESS_ID_TACHE_H, 0);
        $cl->saveSession();
        
        DOA_Referentiel::AfficherTreeviewTaches(DOA_Tache::$IdTreeviewCategories, 'DOA_Tache.php', 'selectTacheH', (DOA_Referentiel::STATUT_INITIAL == $statut));
    }

    public static function &BuildXmlActionPourListe(& $TYPE_OBJET, & $ID_OBJET, & $ID_TACHE, & $STATUT)
    {
        $array = null;
        $isDoaExec = DOA_Referentiel::iSDoaEnExecution($TYPE_OBJET, $ID_OBJET);
        if ($reqSql = SqlDoaTache::rqDOA_ListeActionsDeTache($TYPE_OBJET, $ID_OBJET, $ID_TACHE)->TrouveTous()) {
            foreach ($reqSql as & $value) {
                $arrayInfo = array(
                    'TYPE_OBJET' => $TYPE_OBJET,
                    'ID_OBJET' => $ID_OBJET,
                    'ID_TACHE' => $ID_TACHE,
                    'ID_ACTION' => $value['ID_ACTION'],
                    'STATUT' => $value['TERMINEE'] // Remarque il est obligatoire de passer l'information de terminée de la tache car c'est la liaison entre action termine, doa qui permettra d'avoir les actions
                );
                
                $actions = new ActionsDocument(TypeSuivi::DOA_Tache_Action, '', '', '', '', $arrayInfo);
                $idBase = 'action_' . $value['ID_TACHE'] . '_' . $value['ID_ACTION'];
                
                $entente = array(
                    '!LIB' => $value['LIB'],
                    '!COMMENTAIRE' => $value['COMMENTAIRE'],
                    'zone_actions' => array(
                        '!value' => $idBase
                    )
                );
                // if ($isDoaExec) // Et oui l'information Termine ou non ne doit etre affiché que DOA encours ou terminé mais pas sur modele ou doa en prepra, aucun sens
                
                $entente['!TERMINEE'] = BoolSql($value['TERMINEE']);
                
                $array[] = array(
                    'entete' => $entente,
                    'actions' => $actions->getTabInfo(),
                    '!id' => $idBase,
                    '!clickOnlign' => "itemSelectedByUser('{$idBase}');"
                );
            }
        }
        
        return $array;
    }

    /**
     * Si modele alors pas affichage des informations de datation
     * 
     * @param unknown $reqSql
     * @param unknown $idBase
     * @param unknown $STATUT
     * @return Ambigous <unknown, string, NULL, multitype:string multitype:unknown NULL multitype:string Ambigous <string, multitype:multitype:number NULL Ambigous <string, unknown> > >
     */
    public static function &BuildXmlTacheEntete(& $reqSql, $idBase, $STATUT)
    {
        $reqDoa = SqlDoa::rqGetInfoSuiviDoa($reqSql['ID_OBJET'])->Trouve1();
        
        $array['TYPE_OBJET']['!value'] = & $reqSql['TYPE_OBJET'];
        $array['ID_OBJET']['!value'] = & $reqSql['ID_OBJET'];
        $array['ID_TACHE']['!value'] = & $reqSql['ID_TACHE'];
        $array['ID_TACHE_H']['!value'] = & $reqSql['ID_TACHE_H'];
        $array['LIB']['!value'] = & $reqSql['LIB'];
        $array['DESCR']['!value'] = & $reqSql['DESCR'];
        $array['RESPONSABLE']['!value'] = & $reqSql['RESPONSABLE'];
        $array['RESPONSABLE_LIB']['!value'] = & $reqSql['RESPONSABLE_LIB'];
        $array['DUREE_PREV']['!value'] = & $reqSql['DUREE_PREV'];
        $array['SOUMISE_ALERTE']['!value'] = & $reqSql['SOUMISE_ALERTE'];
        $array['DELAI_PREAVIS']['!value'] = & $reqSql['DELAI_PREAVIS'];
        $array['TYPE_ALERTE']['!value'] = & $reqSql['TYPE_ALERTE'];
        $array['ID_PROC']['!value'] = & $reqSql['ID_PROC'];
        $array['CHAP_PROC']['!value'] = & $reqSql['CHAP_PROC'];
        $array['ID_ETAT_AV']['!value'] = & $reqSql['ID_ETAT_AV'];
        $array['zone_actions']['!value'] = & $idBase;
        
        if (! BoolSql($reqDoa['MODELE'])) {
            $array['DATE_DEB']['!value'] = convertDateSqlToFr($reqSql['DATE_DEB']);
            $array['DATE_FIN']['!value'] = convertDateSqlToFr($reqSql['DATE_FIN']);
            
            if ($reqDoa['STATUT'] != DOA_Referentiel::STATUT_INITIAL)
                $array['TERMINEE']['!value'] = BoolSql($reqSql['TERMINEE']);
        }
        
        if ($listeActions = DOA_Tache::BuildXmlActionPourListe($reqSql['TYPE_OBJET'], $reqSql['ID_OBJET'], $reqSql['ID_TACHE'], $STATUT))
            $array['listeActions'] = & $listeActions;
        
        return $array;
    }

    public static function &BuildXmlTacheActions(& $TYPE_OBJET, & $ID_OBJET, & $ID_TACHE, & $ID_TACHE_H, & $STATUT)
    {
        $arrayInfo = array(
            'TYPE_OBJET' => $TYPE_OBJET,
            'ID_OBJET' => $ID_OBJET,
            'ID_TACHE' => $ID_TACHE,
            'ID_TACHE_H' => $ID_TACHE_H,
            'STATUT' => $STATUT
        );
        
        $actions = new ActionsDocument(TypeSuivi::DOA_Tache, '', '', '', '', $arrayInfo);
        return $actions->getTabInfo();
    }

    public static function &BuildListeTaches(& $ID_TACHE_H, & $TYPE_OBJET, & $ID_OBJET)
    {
        $statut = DOA::GetStatut($ID_OBJET);
        $array['ide']['!action'] = 'ListerTaches';
        
        $reqSql = SqlDoa::rqGetInfoSuiviDoa($ID_OBJET)->Trouve1();
        $array['ide']['!est_modele'] = $reqSql['MODELE'];
        
        if (DOA_Referentiel::STATUT_INITIAL == $statut && Param::canCreateDoaModele()) {
            $array['ide']['!onclickAjouter'] = 'window.open("DOA_Tache.php?action=AjouterTache&ID_TACHE_H=' . $ID_TACHE_H . '&ID=' . $ID_OBJET . '",\'win_pop\',\'width=800,height=200\');';
            $array['ide']['!tooltipAjouter'] = trad('Ajouter une tâche');
        }
        
        // Gestion de la hiérarchie
        $reqSql = SqlDoaTache::rqDOA_TacheH_getInfo($TYPE_OBJET, $ID_OBJET, $ID_TACHE_H)->Trouve1();
        $array['ide']['!libelle_tache_h'] = $reqSql['LIB'];
        
        // Gestion de la liste des tâches proprement dite
        
        if ($reqSql = SqlDoaTache::rqDOA_Tache_Liste($TYPE_OBJET, $ID_OBJET, $ID_TACHE_H)->TrouveTous()) {
            $cntBase = 0;
            foreach ($reqSql as $index => & $value) {
                $cntBase ++;
                $idBase = 'tache_' . $cntBase;
                $element = array(
                    'entete' => DOA_Tache::BuildXmlTacheEntete($value, $idBase, $statut),
                    'actions' => DOA_Tache::BuildXmlTacheActions($TYPE_OBJET, $ID_OBJET, $value['ID_TACHE'], $ID_TACHE_H, $statut),
                    '!id' => $idBase,
                    '!clickOnlign' => "itemSelectedByUser('{$idBase}');"
                );
                
                // unqiuement en mode modele on doit donner la possibilité de monter et descendre au niveau des taches
                if ($TYPE_OBJET == 'M') {
                    if ($index != 0) {
                        $element['!up'] = 'CallUrl("DOA_Tache.php","action=tache_up&idTache=' . $value['ID_TACHE'] . '")';
                        $element['!upTooltip'] = trad('Monter la tache');
                    }
                    if ($index + 1 != count($reqSql)) {
                        $element['!down'] = 'CallUrl("DOA_Tache.php","action=tache_down&idTache=' . $value['ID_TACHE'] . '")';
                        $element['!downTooltip'] = trad('Descendre la tache');
                    }
                }
                $array['ide']['liste_taches'][] = $element;
            }
        }
        
        return $array;
    }

    public static function LireIdArboTacheH(& $TYPE_OBJET, & $ID_OBJET, & $ID_TACHE_H, & $resultat = null)
    {
        if (is_null($resultat))
            $resultat = array();
        
        if ($reqSql = SqlDoaTache::rqGetSqlDoaTacheFille($TYPE_OBJET, $ID_OBJET, $ID_TACHE_H)->TrouveTous()) {
            $ajout = false;
            foreach ($reqSql as &$value) {
                $ID_COURANT = $value['ID_TACHE_H'];
                if (! array_key_exists($ID_COURANT, $resultat)) {
                    $resultat[$ID_COURANT] = $ID_COURANT;
                    $ajout = true;
                }
            }
            if ($ajout) {
                $resultatTmp = array();
                foreach ($resultat as $value)
                    DOA_Tache::LireIdArboTacheH($TYPE_OBJET, $ID_OBJET, $value, $resultatTmp[]);
                foreach ($resultatTmp as &$value)
                    if (is_array($value))
                        foreach ($value as $id)
                            if (! is_null($id) && ! array_key_exists($id, $resultat))
                                $resultat[$id] = $id;
            }
        }
        if (! array_key_exists($ID_TACHE_H, $resultat))
            $resultat[$ID_TACHE_H] = $ID_TACHE_H;
    }

    public static function SupprimerTacheH(& $TYPE_OBJET, & $ID_OBJET, & $ID_TACHE_H, $mode_confirmation)
    {
        $messageErreur = '';
        $messageConfirmation = '';
        $arrayResultat = null;
        $nbTaches = $nbTachesActions = $nbTachesActionsActeurs = $nbTachesActionsDon = $nbTachesActionsData = 0;
        
        DOA_Tache::LireIdArboTacheH($TYPE_OBJET, $ID_OBJET, $ID_TACHE_H, $arrayResultat);
        if (is_array($arrayResultat)) {
            $sql = '';
            foreach ($arrayResultat as $value) {
                if ('' !== $sql)
                    $sql .= ',';
                $sql .= $value;
            }
        }
        
        if ($mode_confirmation) {
            if ('' != $sql) {
                if ($mode_confirmation) {
                    $reqSqltache = SqlDoaTache::rqDOA_Tache_GetCountTache($TYPE_OBJET, $ID_OBJET, $sql)->Trouve1();
                    $nbTaches = $reqSqltache['nb'];
                    $reqSqltacheActions = SqlDoaTache::rqDOA_Tache_GetCountActions($TYPE_OBJET, $ID_OBJET, $sql)->Trouve1();
                    $nbTachesActions = $reqSqltacheActions['nb'];
                    $reqSqltacheActionsActeurs = SqlDoaTache::rqDOA_Tache_GetCountActionsActeurs($TYPE_OBJET, $ID_OBJET, $sql)->Trouve1();
                    $nbTachesActionsActeurs = $reqSqltacheActionsActeurs['nb'];
                    $reqSqltacheActionsDon = SqlDoaTache::rqDOA_Tache_GetCountActionsDon($TYPE_OBJET, $ID_OBJET, $sql)->Trouve1();
                    $nbTachesActionsDon = $reqSqltacheActionsDon['nb'];
                    $reqSqltacheActionsData = SqlDoaTache::rqDOA_Tache_GetCountActionsData($TYPE_OBJET, $ID_OBJET, $sql)->Trouve1();
                    $nbTachesActionsData = $reqSqltacheActionsData['nb'];
                    
                    $messageConfirmation = Trad('Vous vous apprêtez à supprimer') . ' :' . "\n";
                    if ($nbTaches > 0)
                        $messageConfirmation .= "\t- " . $nbTaches . ' ' . Trad('tâche(s)') . "\n";
                    if ($nbTachesActions > 0)
                        $messageConfirmation .= "\t- " . $nbTachesActions . ' ' . Trad('action(s)') . "\n";
                    if ($nbTachesActionsActeurs > 0)
                        $messageConfirmation .= "\t- " . $nbTachesActionsActeurs . ' ' . Trad('acteur(s)') . "\n";
                    if ($nbTachesActionsDon > 0)
                        $messageConfirmation .= "\t- " . $nbTachesActionsDon . ' ' . Trad('donnée(s)') . "\n";
                    if ($nbTachesActionsData > 0)
                        $messageConfirmation .= "\t- " . $nbTachesActionsData . ' ' . Trad('data') . "\n";
                    $messageConfirmation .= Trad('Confirmez-vous cette suppression ?');
                }
            }
            if (0 == $nbTaches + $nbTachesActions + $nbTachesActionsActeurs + $nbTachesActionsDon + $nbTachesActionsData) {
                $messageConfirmation = cnv_to_javascript(Trad("Confirmez vous la suppression de cette hiérachie de tâches ?"));
            }
        } else {
            $pileSql = new PileSql(DB_OXASQLDB);
            DOA_Tache::supprimerArboTacheH($pileSql, $TYPE_OBJET, $ID_OBJET, $ID_TACHE_H);
            
            if ($pileSql->Commit())
                $erreur = false;
            else
                $erreur = true;
            
            if ($erreur) {
                $messageErreur = Trad('Une erreur est survenue pendant l\'enregistrement des données');
            }
        }
        
        return array(
            'messageErreur' => $messageErreur,
            'messageConfirmation' => $messageConfirmation
        );
    }

    public static function supprimerArboTacheH($pileSql, & $TYPE_OBJET, & $ID_OBJET, & $ID_TACHE_H)
    {
        // Appel au niveau de toutes les abrorsence de taches
        if ($reqSql = SqlDoaTache::rqGetSqlDoaTacheFille($TYPE_OBJET, $ID_OBJET, $ID_TACHE_H)->TrouveTous())
            foreach ($reqSql as & $tacheH)
                DOA_Tache::supprimerArboTacheH($pileSql, $tacheH['TYPE_OBJET'], $tacheH['ID_OBJET'], $tacheH['ID_TACHE_H']);
        
        $pileSql->AddRequeteSql(SqlDoaTache::rqDOA_Tache_DeleteTacheH($TYPE_OBJET, $ID_OBJET, $ID_TACHE_H));
        
        // Suppression au niveau de chaque de tache lie à l'arborsence
        if ($reqSql = SqlDoaTache::rqDOATacheListeArbo($TYPE_OBJET, $ID_OBJET, $ID_TACHE_H)->TrouveTous())
            foreach ($reqSql as & $tache)
                DOA_Tache::supprimeLaTache($pileSql, $tache['TYPE_OBJET'], $tache['ID_OBJET'], $tache['ID_TACHE']);
        
        return true;
    }

    public static function supprimeLaTache($pileSql, & $TYPE_OBJET, & $ID_OBJET, & $ID_TACHE)
    {
        $pileSql->AddRequeteSql(SqlDoaTache::rqDOA_Tache_DeleteActionsActeurs($TYPE_OBJET, $ID_OBJET, $ID_TACHE));
        $pileSql->AddRequeteSql(SqlDoaTache::rqDOA_Tache_DeleteActionsData($TYPE_OBJET, $ID_OBJET, $ID_TACHE));
        $pileSql->AddRequeteSql(SqlDoaTache::rqDOA_Tache_DeleteActionsDon($TYPE_OBJET, $ID_OBJET, $ID_TACHE));
        $pileSql->AddRequeteSql(SqlDoaTache::rqDOA_Tache_DeleteActions($TYPE_OBJET, $ID_OBJET, $ID_TACHE));
        $pileSql->AddRequeteSql(SqlDoaTache::rqDOA_Tache_DeleteTache($TYPE_OBJET, $ID_OBJET, $ID_TACHE));
        
        return true;
    }

    public static function SupprimerTache(& $TYPE_OBJET, & $ID_OBJET, & $ID_TACHE, $mode_confirmation)
    {
        $messageErreur = '';
        $messageConfirmation = '';
        
        $nbTachesActions = $nbTachesActionsActeurs = $nbTachesActionsDon = $nbTachesActionsData = 0;
        $sql = $ID_TACHE;
        if ($mode_confirmation) {
            
            $reqSqltacheActions = SqlDoaTache::rqDOA_Tache_GetCountActions($TYPE_OBJET, $ID_OBJET, $sql)->Trouve1();
            $nbTachesActions = $reqSqltacheActions['nb'];
            $reqSqltacheActionsActeurs = SqlDoaTache::rqDOA_Tache_GetCountActionsActeurs($TYPE_OBJET, $ID_OBJET, $sql)->Trouve1();
            $nbTachesActionsActeurs = $reqSqltacheActionsActeurs['nb'];
            $reqSqltacheActionsDon = SqlDoaTache::rqDOA_Tache_GetCountActionsDon($TYPE_OBJET, $ID_OBJET, $sql)->Trouve1();
            $nbTachesActionsDon = $reqSqltacheActionsDon['nb'];
            $reqSqltacheActionsData = SqlDoaTache::rqDOA_Tache_GetCountActionsData($TYPE_OBJET, $ID_OBJET, $sql)->Trouve1();
            $nbTachesActionsData = $reqSqltacheActionsData['nb'];
            
            $messageConfirmation = Trad('Vous vous apprêtez à supprimer') . ' : ' . "\n";
            if ($nbTachesActions > 0)
                $messageConfirmation .= "\t- " . $nbTachesActions . ' ' . Trad('action(s)') . "\n";
            if ($nbTachesActionsActeurs > 0)
                $messageConfirmation .= "\t- " . $nbTachesActionsActeurs . ' ' . Trad('acteur(s)') . "\n";
            if ($nbTachesActionsDon > 0)
                $messageConfirmation .= "\t- " . $nbTachesActionsDon . ' ' . Trad('donnée(s)') . "\n";
            if ($nbTachesActionsData > 0)
                $messageConfirmation .= "\t- " . $nbTachesActionsData . ' ' . Trad('data') . "\n";
            $messageConfirmation .= Trad('Confirmez-vous cette suppression ?');
            
            if (0 == ($nbTaches ?? 0) + $nbTachesActions + $nbTachesActionsActeurs + $nbTachesActionsDon + $nbTachesActionsData) {
                $messageConfirmation = trad('Est-ce que vous confirmez la suppression de cette tâche ?');
            }
        } else {
            $pileSql = new PileSql(DB_OXASQLDB);
            $erreur = false;
            DOA_Tache::supprimeLaTache($pileSql, $TYPE_OBJET, $ID_OBJET, $ID_TACHE);
            if ($pileSql->Commit())
                $erreur = false;
            else
                $erreur = true;
            if ($erreur) {
                $messageErreur = Trad('Une erreur est survenue pendant l\'enregistrement des données');
            }
        }
        
        return array(
            'messageErreur' => $messageErreur,
            'messageConfirmation' => $messageConfirmation
        );
    }

    public static function SupprimerAction(& $TYPE_OBJET, & $ID_OBJET, & $ID_TACHE, & $ID_ACTION)
    {
        $pileSql = new PileSql(DB_OXASQLDB);
        $pileSql->AddRequeteSql(SqlDoaTache::rqDOA_SupprimerAction($TYPE_OBJET, $ID_OBJET, $ID_TACHE, $ID_ACTION));
        $pileSql->AddRequeteSql(SqlDoaTache::rqDOA_Action_SupprimerActeurs($TYPE_OBJET, $ID_OBJET, $ID_TACHE, $ID_ACTION));
        $pileSql->AddRequeteSql(SqlDoaTache::rqDOA_Action_SupprimerDonnees($TYPE_OBJET, $ID_OBJET, $ID_TACHE, $ID_ACTION));
        // Dossier 27132 : on complète le périmètre de suppression
        $pileSql->AddRequeteSql(SqlDoaTache::rqDOA_Action_SupprimerRACI($ID_OBJET, $ID_TACHE, $ID_ACTION));
        $pileSql->AddRequeteSql(SqlDoaTache::rqDOA_Tache_DeleteActionsData($TYPE_OBJET, $ID_OBJET, $ID_TACHE, $ID_ACTION));
        return $pileSql->Commit();
    }

    public static function MonterAction(& $TYPE_OBJET, & $ID_OBJET, & $ID_TACHE, & $ID_ACTION)
    {
        $null = null;
        //
        // On récupère le num ordre de l'action sélectionnée
        //
        $reqSql1 = SqlDoaTache::rqDOA_ListeActionsDeTache($TYPE_OBJET, $ID_OBJET, $ID_TACHE, $ID_ACTION)->Trouve1();
        $NUM_ORDRE_orig = $reqSql1['NUM_ORDRE'];
        //
        // On récupère le num_ordre le plus haut inférieur à l'objet courant
        //
        $reqSql2 = SqlDoaTache::rqDOA_TacheActionMaxNumOrdre($TYPE_OBJET, $ID_OBJET, $ID_TACHE, $NUM_ORDRE_orig)->Trouve1();
        if (is_array($reqSql2) and is_numeric($reqSql2['NUM_ORDRE'])) {
            $NUM_ORDRE_precedent = $reqSql2['NUM_ORDRE'];
            //
            // On récupère l'id du num_ordre le plus haut inférieur à l'objet courant
            //
            $reqSql2 = SqlDoaTache::rqDOA_ListeActionsDeTache($TYPE_OBJET, $ID_OBJET, $ID_TACHE, $null, $NUM_ORDRE_precedent)->Trouve1();
            $ID_ACTION_PREC = $reqSql2['ID_ACTION'];
            
            //
            // Sauvegarde en base
            //
            $pileSql = new PileSql(DB_OXASQLDB);
            if ($pileSql->AddRequeteSql(SqlDoaTache::rqDOA_ModifAction_NUM_ORDRE($TYPE_OBJET, $ID_OBJET, $ID_TACHE, $ID_ACTION_PREC, $NUM_ORDRE_orig))) {
                if ($pileSql->AddRequeteSql(SqlDoaTache::rqDOA_ModifAction_NUM_ORDRE($TYPE_OBJET, $ID_OBJET, $ID_TACHE, $ID_ACTION, $NUM_ORDRE_precedent))) {
                    $pileSql->Commit();
                }
            }
        }
    }

    public static function DescendreAction(& $TYPE_OBJET, & $ID_OBJET, & $ID_TACHE, & $ID_ACTION)
    {
        $null = null;
        // On récupère le num ordre de l'action sélectionnée
        $reqSql1 = SqlDoaTache::rqDOA_ListeActionsDeTache($TYPE_OBJET, $ID_OBJET, $ID_TACHE, $ID_ACTION)->Trouve1();
        $NUM_ORDRE_orig = $reqSql1['NUM_ORDRE'];
        //
        // On récupère le num_ordre le plus bas supérieur à l'objet courant
        //
        $reqSql2 = SqlDoaTache::rqDOA_TacheActionMinNumOrdre($TYPE_OBJET, $ID_OBJET, $ID_TACHE, $NUM_ORDRE_orig)->Trouve1();
        if (is_array($reqSql2) and is_numeric($reqSql2['NUM_ORDRE'])) {
            $NUM_ORDRE_suivant = $reqSql2['NUM_ORDRE'];
            //
            // On récupère l'id du num_ordre le plus bas supérieur à l'objet courant
            //
            $reqSql2 = SqlDoaTache::rqDOA_ListeActionsDeTache($TYPE_OBJET, $ID_OBJET, $ID_TACHE, $null, $NUM_ORDRE_suivant)->Trouve1();
            $ID_ACTION_SUIV = $reqSql2['ID_ACTION'];
            //
            // Sauvegarde en base
            //
            $pileSql = new PileSql(DB_OXASQLDB);
            if ($pileSql->AddRequeteSql(SqlDoaTache::rqDOA_ModifAction_NUM_ORDRE($TYPE_OBJET, $ID_OBJET, $ID_TACHE, $ID_ACTION_SUIV, $NUM_ORDRE_orig))) {
                if ($pileSql->AddRequeteSql(SqlDoaTache::rqDOA_ModifAction_NUM_ORDRE($TYPE_OBJET, $ID_OBJET, $ID_TACHE, $ID_ACTION, $NUM_ORDRE_suivant))) {
                    $pileSql->Commit();
                }
            }
        }
    }
}