<?php

class DOA_Struct
{

    static function &GetListeObjetsPourData()
    {
        /*
         * ?????? Comprend pas car pourquoi crée un tableau listeObjectXml qui n'est pas renvoyé
         * $listeObjects = DOA_BDD::ListeObjetsPourDonnees();
         * if (is_array($listeObjects))
         * foreach ($listeObjects as &$value) {
         * $listeObjectsXml[] = $value;
         * }
         * return $listeObjects;
         *
         * Donc remplacé par ci-dessou
         */
        return DOA_BDD::ListeObjetsPourDonnees();
    }

    public static function &GetListeObjetsPourObjetData($BDD_TABLE = null)
    {
        return DOA_BDD::ListeObjetsPourObjetData($BDD_TABLE);
    }

    /**
     * On casse le lien d'heritage donc pas d'impacte sur DOA_ACTION_DON ni DOA_ACTION_DATA
     * 
     * @param unknown $newPile
     * @param unknown $data
     */
    public static function supprimeLienIdStruct($newPile, $data)
    {
        $sql = 'update DOA_STRUCT set ID_STRUCT = 0 ' . 'WHERE ID_DONNEE  =   ' . ReplaceSqlPointeur($data['ID_DONNEE']) . ' ' . 'AND   TYPE_OBJET = \'' . ReplaceSqlPointeur($data['TYPE_OBJET']) . '\' ' . 'AND   ID_OBJET   =   ' . ReplaceSqlPointeur($data['ID_OBJET']) . ' ';
        $newPile->AddSql($sql);
        DOA_Struct::supprimeLienIdStructData($newPile, $data);
    }

    public static function supprimeLienIdStructData($newPile, $data)
    {
        /**
         * Attention ici il y des regles si l'on supprime un heritage de data lié sur data interne avec id_data_lie à 0 alors tous les autres doivents etre
         * dé herités
         */
        if (array_key_exists('ID_DATA', $data)) {
            if ($data = SqlDoaBibliotheque::rqDOA_GetInfoData($data['ID_DATA'], $data['TYPE_OBJET'], $data['ID_OBJET'], $data['ID_DONNEE'])->Trouve1()) {
                if (BoolSql($data['DATA_LIE_A_OBJ'])) {
                    if ($data['ID_DATA_LIEE'] == 0) {
                        // La on va automatiquement supprimé tous les heritages des données liés
                        $sql = 'update DOA_DATA set ID_STRUCT = 0 ' . 'WHERE ID_DONNEE  	=   ' . ReplaceSqlPointeur($data['ID_DONNEE']) . ' ' . 'AND   TYPE_OBJET 	= \'' . ReplaceSqlPointeur($data['TYPE_OBJET']) . '\' ' . 'AND   ID_DATA_LIEE =   ' . ReplaceSqlPointeur($data['ID_DATA']) . ' ' . 'AND   ID_OBJET   	=   ' . ReplaceSqlPointeur($data['ID_OBJET']) . ' ';
                        $newPile->AddSql($sql);
                    }
                }
            }
        }
        
        $sql = 'update DOA_DATA set ID_STRUCT = 0 ' . 'WHERE ID_DONNEE  =   ' . ReplaceSqlPointeur($data['ID_DONNEE']) . ' ' . 'AND   TYPE_OBJET = \'' . ReplaceSqlPointeur($data['TYPE_OBJET']) . '\' ' . (array_key_exists('ID_DATA', $data) ? 'AND ID_DATA = ' . ReplaceSqlPointeur($data['ID_DATA']) . ' ' : '') . 'AND   ID_OBJET   =   ' . ReplaceSqlPointeur($data['ID_OBJET']) . ' ';
        $newPile->AddSql($sql);
    }

    /**
     * Suppression d'un record sur DOA_STRUCT
     *
     * @param unknown $newPile
     * @param unknown $data
     */
    public static function supprimeIdStruct($newPile, $data)
    {
        // Suppression de la donnée
        $sql = 'delete from DOA_STRUCT ' . 'WHERE ID_DONNEE  =   ' . ReplaceSqlPointeur($data['ID_DONNEE']) . ' ' . 'AND   TYPE_OBJET = \'' . ReplaceSqlPointeur($data['TYPE_OBJET']) . '\' ' . 'AND   ID_OBJET   =   ' . ReplaceSqlPointeur($data['ID_OBJET']) . '  ' . 'AND   ID_DONNEE  =   ' . ReplaceSqlPointeur($data['ID_DONNEE']) . '  ';
        $newPile->AddSql($sql);
        
        // Suppression de toutes les données mises au travers des actions (PAS d'id_actions ni id_tache et c'est normale
        $sql = 'delete from DOA_ACTIONS_DON ' . 'WHERE ID_DONNEE  =   ' . ReplaceSqlPointeur($data['ID_DONNEE']) . ' ' . 'AND   TYPE_OBJET = \'' . ReplaceSqlPointeur($data['TYPE_OBJET']) . '\' ' . 'AND   ID_OBJET   =   ' . ReplaceSqlPointeur($data['ID_OBJET']) . '  ' . 'AND   ID_DONNEE  =   ' . ReplaceSqlPointeur($data['ID_DONNEE']) . '  ';
        $newPile->AddSql($sql);
        
        $sql = 'delete from DOA_DATA ' . 'WHERE ID_DONNEE  =   ' . ReplaceSqlPointeur($data['ID_DONNEE']) . ' ' . 'AND   TYPE_OBJET = \'' . ReplaceSqlPointeur($data['TYPE_OBJET']) . '\' ' . 'AND   ID_OBJET   =   ' . ReplaceSqlPointeur($data['ID_OBJET']) . '  ' . 'AND   ID_DONNEE  =   ' . ReplaceSqlPointeur($data['ID_DONNEE']) . '  ';
        $newPile->AddSql($sql);
        
        // Suppression de toutes les données mises au travers des actions (PAS d'id_actions ni id_tache et c'est normale
        $sql = 'delete from DOA_ACTIONS_DATA ' . 'WHERE ID_DONNEE  =   ' . ReplaceSqlPointeur($data['ID_DONNEE']) . ' ' . 'AND   TYPE_OBJET = \'' . ReplaceSqlPointeur($data['TYPE_OBJET']) . '\' ' . 'AND   ID_OBJET   =   ' . ReplaceSqlPointeur($data['ID_OBJET']) . '  ' . 'AND   ID_DONNEE  =   ' . ReplaceSqlPointeur($data['ID_DONNEE']) . '  ';
        $newPile->AddSql($sql);
    }

    /**
     * Appel de 1ere niveau pour supprimer une donnée donc suppression reel sauf si DOA active
     *
     * @param unknown $ID_DONNEE
     * @return Ambigous <string, unknown, string, NULL>
     */
    public static function SupprimerDonnee($newPile, & $TYPE_OBJET, & $ID_OBJET, & $ID_DONNEE)
    {
        if ($reqDonnee = SqlDoaBibliotheque::rqDOA_TrouverDonneeWithDoa($ID_DONNEE, $TYPE_OBJET, $ID_OBJET)->Trouve1()) {
            
            if ($listeData = SqlDoaBibliotheque::rqDOA_TrouverDataDeDonneeWithDoa($reqDonnee['TYPE_OBJET'], $reqDonnee['ID_OBJET'], $ID_DONNEE)->TrouveTous())
                foreach ($listeData as & $data)
                    DOA_Struct::SupprimerDataReel($newPile, $data['ID_DATA'], $data['TYPE_OBJET'], $data['ID_OBJET']);
            
            if ($reqDonnee['TYPE_OBJET'] != 'D' || $reqDonnee['STATUT'] == DOA_Referentiel::STATUT_INITIAL) {
                if ($listeData = SqlDoaBibliotheque::rqDOA_TrouverDonneeWithDoaHerite($ID_DONNEE)->TrouveTous()) {
                    foreach ($listeData as & $data) {
                        if ($data['TYPE_OBJET'] != 'D' || $data['STATUT'] == DOA_Referentiel::STATUT_INITIAL)
                            if (DOA_Donnee::getModeConservationHeritage() == 0 || (DOA_Donnee::getModeConservationHeritage() == 1 && $data['TYPE_OBJET'] == 'M'))
                                DOA_Struct::supprimeIdStruct($newPile, $data);
                            else
                                DOA_Struct::supprimeLienIdStruct($newPile, $data);
                        else
                            DOA_Struct::supprimeLienIdStruct($newPile, $data); // De toutes facon DOA encours / termine
                    }
                }
                
                $newPile->AddSql(DOA_Struct::supprimeIdStruct($newPile, $reqDonnee));
            } else // Simplement on enleve l'informations ID_STRUCT sur la donnée
                DOA_Struct::supprimeLienIdStruct($newPile, $reqDonnee);
        }
    }

    /**
     *
     * @param unknown $newPile
     * @param unknown $ID_DATA
     * @param unknown $pere
     */
    public static function supprimeHeritage($newPile, & $TYPE_OBJET, & $ID_OBJET, & $ID_DONNEE, & $ID_DATA)
    {
        if ($dataDoa = SqlDoaBibliotheque::rqDOA_GetInfoData($ID_DATA, $TYPE_OBJET, $ID_OBJET, $ID_DONNEE)->Trouve1()) {
            /**
             * Traitement sur les actions
             */
            if ($TYPE_OBJET != 'D' || $dataDoa['STATUT'] == DOA_Referentiel::STATUT_INITIAL) {
                // Cas du pere on detruit la donnée réellement
                if ($listeAction = SqlDoaBibliotheque::rqDOA_TrouveDataAction($TYPE_OBJET, $ID_OBJET, $ID_DATA)->Trouve1()) {
                    if ($TYPE_OBJET == 'B') {
                        // Pas d'action dans la partie bib
                    } else if ($TYPE_OBJET == 'M') {
                        if (DOA_Donnee::getModeConservationHeritage() != 2) {
                            // on ne fait rien car la data est simplement détopé de la notion d'heritage
                        } else
                            $newPile->AddRequeteSql(SqlDoaBibliotheque::rqDOA_SupprimeDataAction($TYPE_OBJET, $ID_OBJET, $ID_DONNEE, $ID_DATA));
                    } else if ($TYPE_OBJET == 'D') {
                        if ($dataDoa['STATUT'] == DOA_Referentiel::STATUT_INITIAL) {
                            if (DOA_Donnee::getModeConservationHeritage() != 2) {
                                // on ne fait rien car la data est simplement détopé de la notion d'heritage
                            } else
                                $newPile->AddRequeteSql(SqlDoaBibliotheque::rqDOA_SupprimeDataAction($TYPE_OBJET, $ID_OBJET, $ID_DONNEE, $ID_DATA));
                        } else {
                            // NE RIEN FAIRE
                        }
                    }
                }
            }
            
            $newPile->AddRequeteSql(SqlDoaBibliotheque::rqDOA_SupprimeData($TYPE_OBJET, $ID_OBJET, $ID_DONNEE, $ID_DATA));
            
            /**
             * Attention ici NE PAS METTRE type object et id object car on recherhe partout ailleurs notion de l'héritage
             */
            $sql = 'select * from DOA_DATA with(nolock) ' . 'inner join DOA with(nolock) on DOA.ID = DOA_DATA.ID_OBJET ' . 'WHERE DOA_DATA.ID_STRUCT  =   ' . ReplaceSqlPointeur($ID_DATA);
            
            if ($listeData = (new RequeteSQL($sql, DB_OXASQLDB))->TrouveTous()) {
                foreach ($listeData as & $ligne) {
                    /**
                     * Dossier 25770 Mise en commentaire de la ligne suivante car EN AUCUN CAS LIE CELA A LA DONNEE,
                     * DOA_Struct::supprimeHeritage ($newPile ,$ligne['TYPE_OBJET'],$ligne['ID_OBJET'],$ligne['ID_DONNEE'],$ligne['ID_DATA']);
                     */
                    
                    $where = 'where TYPE_OBJET = \'' . ReplaceSqlPointeur($ligne['TYPE_OBJET']) . '\' ' . 'and   ID_OBJET   =   ' . ReplaceSqlPointeur($ligne['ID_OBJET']) . ' ' . 'and   ID_DONNEE  =   ' . ReplaceSqlPointeur($ligne['ID_DONNEE']) . ' ' . 'and   ID_DATA    =   ' . ReplaceSqlPointeur($ligne['ID_DATA']) . ' ';
                    
                    if (($ligne['TYPE_OBJET'] == 'D' && $ligne['STATUT'] != DOA_Referentiel::STATUT_INITIAL) || // Obligatoire SI DOA encours / termine alors obligation juste brisé le lien
($ligne['TYPE_OBJET'] == 'D' && DOA_Donnee::getModeConservationHeritage() == 1) || // si DOA et heritage uniquement modele alors conserve la data donc brisé le lien
DOA_Donnee::getModeConservationHeritage() == 2) // Heritage nulle part = conservation de la data donc brisé le lien
{
                        $sql = 'update DOA_DATA set   ID_STRUCT = 0 ' . $where; // Juste mettre à 0 la référence
                        $newPile->AddSql($sql);
                    } else {
                        $sql = 'delete from DOA_DATA ' . $where; // Suppression de la référence
                        $newPile->AddSql($sql);
                        
                        // Important il faut supprimer les action de données lié à la data de la donnee en questo
                        $sql = 'delete from DOA_ACTIONS_DATA ' . $where; // Suppression de la référence dossier 25402
                        $newPile->AddSql($sql);
                    }
                }
            }
        }
    }

    /**
     *
     * @param unknown $ID_DATA
     *            si present dans modèle alors on supprime juste la référence du lien sinon on supprime le record dans le modèle
     *            si présent dans le DOA alors dans tous les cas on supprime juste la référence mais en aucun on supprime le record du DOA
     *            => false alors
     *            si présent dans modèle alors suppression dans tous les modèles
     *            si présent dans DOA alors on brise l'héritage EN AUCUN on supprime le record du DOA
     * @return string
     */
    public static function &SupprimerData(& $ID_DATA, $TYPE_OBJET, $ID_OBJET)
    {
        $newPile = new PileSql(DB_OXASQLDB);
        
        DOA_Struct::SupprimerDataReel($newPile, $ID_DATA, $TYPE_OBJET, $ID_OBJET);
        
        if ($newPile->Commit())
            $messageErreur = '';
        else
            $messageErreur = Trad('Une erreur a eu lieu pendant la suppression de la data.');
        
        return $messageErreur;
    }

    private static function SupprimerDataReel($newPile, & $ID_DATA, $TYPE_OBJET, $ID_OBJET)
    {
        if ($data = SqlDoaBibliotheque::rqDOA_GetInfoData($ID_DATA, $TYPE_OBJET, $ID_OBJET)->Trouve1()) {
            $TYPE_OBJET = $data['TYPE_OBJET'];
            $ID_OBJET = $data['ID_OBJET'];
            $ID_DONNEE = $data['ID_DONNEE'];
            
            if (BoolSql($data['ID_OBJET_DATA']) && $data['ID_DATA_LIEE'] == 0) {
                /**
                 * Recherche de toutes les datas qui sont lié et suppression de ces dernières
                 */
                $sql = 'select * from DOA_DATA with (nolock) ' . 'WHERE TYPE_OBJET = \'' . ReplaceSqlPointeur($data['TYPE_OBJET']) . '\' ' . 'AND   ID_OBJET   = ' . ReplaceSqlPointeur($data['ID_OBJET']) . ' ' . 'AND   ID_DONNEE  = ' . ReplaceSqlPointeur($data['ID_DONNEE']) . ' ' . 'AND   ID_DATA_LIEE = ' . ReplaceSqlPointeur($ID_DATA);
                if ($listeData = (new RequeteSQL($sql, DB_OXASQLDB))->TrouveTous())
                    foreach ($listeData as & $ligne)
                        DOA_Struct::supprimeHeritage($newPile, $ligne['TYPE_OBJET'], $ligne['ID_OBJET'], $ligne['ID_DONNEE'], $ligne['ID_DATA']);
            }
            DOA_Struct::supprimeHeritage($newPile, $TYPE_OBJET, $ID_OBJET, $ID_DONNEE, $ID_DATA);
        }
    }
}






