Project

General

Profile

Actions

Chamilo 194 assignment tool analysis

Dans le cadre de la migration de Dokeos 1.8.6.1 vers Chamilo 1.9.x, j'ai réalisé un script pour mettre à jour les informations sur les Travaux de Dokeos pour qu'ils soient pleinement compatibles avec Chamilo.

Ce script est une aide pour migrer les travaux de Dokeos vers Chamilo, et peut nécessiter des interventions sur le système de fichier dans le dossier work d'un cours.

Note : vous pouvez vous aider de cet article comme aide de migration des Travaux de Dokeos vers Chamilo. Si c'est possible, il pourra être préférable d'inviter vos enseignants à backeuper les Travaux de leur cours Dokeos, avant de les supprimer. Cela permettra de recommencer d'utiliser les Travaux après la migration sans aucun soucis de migration.

Hormis des valeurs différentes de champs de la base de données, la plus grande différence entre les Travaux de Dokeos et de Chamilo réside dans le fait que dans Chamilo
- un travail doit se rendre dans un dossier de l'outil Travaux, on ne peut remettre un travail à la racine de l'outil
- on ne peut pas (pas encore?) utiliser de sous dossier de Travaux dans Chamilo
Le script de migration de Chamilo met bien à plat les Travaux de Dokeos en consultation, mais ne gère pas la multitude de cas particuliers résultant de la gestion des sous dossier dans les Travaux de Dokeos. Si un apprenant upload un travail dans un dossier de l'outil Travaux de Chamilo, dans un dossier qui était un sous dossier Travaux de Dokeos, ce travail ne sera pas uploadé sur le serveur.

Conditions sur les dossiers des Travaux dans Chamilo
  1. c_student_publication.url de la forme "/mon_dossier" et non "work/mon_dossier"
  2. c_student_publication.active = 1 (ou 2 si le dossier est supprimé)
  3. c_student_publication.accepted = 1 (on ne peut pas fermer l'oeil d'un dossier de Travaux)
  4. c_student_publication.contains_file = 0
  5. c_student_publication.has_properties est l'id de la table c_student_publication_assignement
  6. c_student_publication.id est le champ ref dans la table c_item_property avec tool='work' et visibility=1

Conditions sur les fichiers des Travaux dans Chamilo
  1. c_student_publication.url de la forme "work/FOLDER/nom_de_fichier"
  2. c_student_publication.parent_id est l'id du dossier dans lequel est contenu le fichier
  3. c_student_publication.has_property = 0
  4. c_student_publication.contains_file = 0 ou 1
  5. c_student_publication.active = 1 (ou 2 si le fichier est supprimé)
  6. c_student_publication.accepted = 1 oeil ouvert (ou 0 si l'oeil est fermé)
  7. c_student_publication.id est le champ ref dans la table c_item_property avec tool='work'
  8. dans le c_item_property correspondant, lastedit_type peut être "DocumentAdded", "DocumentDeleted", "WorkVisible", "WorkInvisible"

Le script

Le script appelle la fonction check_travaux_etudiants($in_corriger) avec $in_corriger=1 si on veut corriger les erreurs ou juste les afficher.
Il fait parti d'un outil plus global de passage de script sur mes instances Chamilo et ne pourra être utilisé tel quel.
Il apporte cependant des bouts de codes simples sur les vérification et corrections effectuées.
Le script met à jour dans la BDD tous les travaux qu'il trouve dans le dossier work du cours pour les fichiers et dossiers ne contenant pas la chaine DELETED
Le script ne met pas à plat dans le système de fichier les travaux rangés dans des dossiers. Il vous alerte, et il faut le faire à la main dans le système de fichier, en choisissant un nom de dossier approprié.

Il réalisé une vérification/correction en 4 étapes, la première devant être validée pour pouvoir passer à la suivante.

1.
Vérification des informations du système de fichier (function check_FS_for_course)
On regarde chaque dossier/fichier du système de fichier et on regarde si il existe dans la BDD.
Les réultats peuvent être (FS = FileSystème)
  • (FS1) dossier existe dans FS mais pas dans la BDD.
  • Ce fichier existe dans la bdd mais avec un mauvais URL. (FS1.1) On met le bon URL.
  • Fichier pas trouvé mais dossier trouvé, on ajoute le fichier dans la BDD
  • Sous dossier trouvé, déplacez le et relancer l'outil
2.
On regarde pour chaque élément de la table c_student_publication pour ce cours

  • FOLDER
    (FO1) url de la forme "/mondossier" et non "work/mondossier"
    (FO1.1) dossier contient des sous dossiers
    (FO2) "/mondossier" existe dans le FS dans le dossier course/CODE/work
    (FO3) active=1 (ou 2 si supprimé ou n'existe pas dans le FS)
    (FO4) accepted=1 (c'est ce qui ferme l'oeil pour les fichier alors =0)
    (FO5) bdd_contains_file=0 (peut être à 1 pour un fichier dont le rendu est dans sa description)
    (FO6) le has_properties est un id de la table c_student_publication_assignment
    dans la table student_publication_assignement le champ publication_id est l'id de la table student_publication
    (FO7) son id est le ref dans la table c_item_property avec tool="work" lastedit_type="DirectoryCreated" et visibility=1
    (FO8) si supprimé (accepted=2) il n'existe pas dans le FS
    (FO9) si title est vide, mettre $bdd_url en title
    (FO10) si active=2 (supprimé) vérifier que le dossier n'existe pas dans le FS
    (FO11) Si la date de création du dossier est plus récente que le plus vieux fichier dedans, remplacer la date de création du dossier

  • FILE
    (FI1) url de la forme work/FOLDER/xxxxxxxxxxxx avec FOLDER doit exister comme folder dans la BDD sinon on l'ajoute dans la table c_student_publication et on repasse ce script qui va mettre bien comme il faut les info de ce folder
    L'id de FOLDER doit être le parent_id du document
    (FI2) le fichier existe dans le FS
    (FI3) le champ has_properties = 0
    (FI4) contains_file = 1 (on n'a pas encore ouvert les rendu rédigé)
    (FI5) accepted = 0 (oeil fermé) ou 1 (oeil ouvert)
    (FI6) si supprimé active=2 et n'existe plus dans le FS, sinon active=1
    (FI7) doit être présent dans item_property
    (FI8) le champ author par rapport au lastname+firstname de la table user, si le user est toujours inscrit

  • FILE AND FOLDER
    (FO&FI1) dans la table c_student_publication doit avoir un user_id valide
    (FO&FI2) vérifier que le item_property.insert_user_id = c_student_publication.user_id et que le champ author correspond bien

<style 'type=text/css'>
    .sql {
        display : none;
    }
    .sql_area {
        width: 1181px; 
        height: 22px;
    }
    .mtd {
        width:auto;
        border:none;
    }
</style>
<script type="text/javascript">
    function get_check_value() {
        out_result = 0;
        if ($('#remove13first_char').is(':checked')) {
            out_result = 1;
        }
        return out_result;
    }
</script>
<?php

/*
25/01/2013
vérifie la correspondance BDD disque dur pour l'outil Travaux

*/

function tabcmp($a, $b) {
    $out_result = 0;
    if ($a[id] > $b[id]) {
        $out_result = 1;
    }
    else if ($a[id] < $b[id]) {
        $out_result = -1;
    }
    return $out_result;
}

function check_travaux_etudiants($in_corriger) {
    global $tabU, $univnum;
    echo "<h2>in_corriger=$in_corriger</h2>";
    $stop_after_check_one_course = true;    // on check un cours et on stop
    $tabcourselist = Database::get_course_list();
    $tbl_work = Database::get_course_table(TABLE_STUDENT_PUBLICATION);
    $tbl_item_property = Database::get_course_table(TABLE_ITEM_PROPERTY);
    $tbl_pub_assign = Database::get_course_table(TABLE_STUDENT_PUBLICATION_ASSIGNMENT);
    $tbl_course = Database::get_main_table(TABLE_MAIN_COURSE);
    $maintenant = date('Y-m-d');
    $msg = "";
    $nb_cours_en_erreur = 0;
    usort($tabcourselist, "tabcmp");    
    $univ = $tabU->liste[$univnum]->univ;
    $tab_id_premier_admin = array("ujf"=>6894, "INP"=>11807, "Stendhal"=>2943, "IEP"=>9595, "GU"=>209, "DILIPEM"=>304, "FCStendhal"=>120);
    $tab_id_user_desinscrit = array("ujf"=>86150, "INP"=>28621, "Stendhal"=>19388, "IEP"=>15345, "GU"=>497, "DILIPEM"=>399, "FCStendhal"=>1170);

    $id_premier_admin = $tab_id_premier_admin[$univ];
    $id_user_desinscrit = $tab_id_user_desinscrit[$univ];
    $name_user_desinscrit = "Support SIMSU Utilisateur désinscrit";

    $trouve = false;

    // fichier texte indiquant tous les cours modifiés par le script
    $report_file = "/tmp/inp_rapport_correction_travaux.txt";
    if (!is_file($report_file)) {
        file_put_contents($report_file, "c_id\tcourse_code\tcourse_title\n");
    }

    // option GET pour enlever (ou pas) les 13 premiers caractères pour title des fichiers
    // le path est work/default_task0_0/45772b98715e1Attributs3.zip et le title du fichier=Attributs3.zip
    $remove13first_char = 0;
    $checked = "";
    if (isset($_GET['remove13first_char']) && $_GET['remove13first_char'] != 0) {
        $remove13first_char = 1;
        $checked = "checked=checked";
    }
    $current_url = $_SERVER['SCRIPT_NAME'].'?'.$_SERVER['QUERY_STRING'];
    $current_url = preg_replace("/&corriger=[01]/", "", $current_url);
    $current_url_remove13 = preg_replace("/&remove13first_char=[01]/", "", $current_url);
    echo "<input type='checkbox' id='remove13first_char' $checked /> Supprimer les 13 premiers caractères du titre d'un document.";
    echo "<input type='button' onclick='self.location.href=\"$current_url_remove13&remove13first_char=\"+get_check_value()' value='go' /><br/>";

    // bouton pour corriger et recharger la page
    echo "<div style='margin-bottom:20px; text-align:center;'><input style='height:30px; border:2px solid ; border-radius:10px; box-shadow: 10px 10px 5px #888888;' type='button' value='Corriger' onclick='self.location.href=\"$current_url&corriger=1\"' /></div>";

    // option GET pour reloader seulement ce cours
    $check_only_course_for_i = 0;
    if (isset($_GET['check_only_course_for_i'])) {
        $check_only_course_for_i = intval($_GET['check_only_course_for_i']);
    }
    $current_url_check_i = preg_replace("/&check_only_course_for_i=\d+/", "", $current_url);

    echo "Nombre de cours : ".count($tabcourselist)."<br/>";
    for ($i=$check_only_course_for_i; $i < count($tabcourselist) ; $i++) {
        $trouve = false;
        $erreur = "";
        // pour ce cours
        $c_id = $tabcourselist[$i]['id'];
        $course_code = $tabcourselist[$i]['code'];
        $course_title = $tabcourselist[$i]['title'];
        $course_directory = $tabcourselist[$i]['directory'];
        // dossier work pour le cours
        $course_folder = api_get_path(SYS_PATH)."courses/".api_get_course_path($course_code).'/';
        $work_folder = api_get_path(SYS_PATH)."courses/".api_get_course_path($course_code).'/work/';
        // On regarde pour chaque element de la bdd
        $sql = "SELECT * FROM $tbl_work WHERE c_id=$c_id ORDER BY filetype DESC;";
        $result = Database::query($sql);
        $sql_corrections = "";
        $folder_in_error_found = 0;

        // LE SYSTEME DE FICHIER
        // on a terminé de vérif la BDD, on regarde les fichiers dans le FS
        // si tous les fichiers non _DELETED_ du FS ont bien une entrée dans la BDD
        // ex : cours ADMIN/work/448ecea3490dcson_rollover_mx2004_OK_Franck.fla
        /*
        => déplacer les fichiers à la racine de work dans un dossier task
        */
        list($trouve, $erreur, $sql_corrections) = check_FS_for_course($c_id, $course_code, $work_folder, $in_corriger, $id_premier_admin, $maintenant, $course_folder, $remove13first_char);

        // recherche de doublon dans le champ URL pour active != 2 et url non vide
        if (!$trouve) {
            $sql = "SELECT concat(c_id, '___', active, '___', url) AS valeur, count(*) AS nb, filetype, url
                    FROM $tbl_work 
                    WHERE url != ''
                    AND active != 2
                    AND c_id = $c_id
                    GROUP BY valeur
                    HAVING COUNT(nb) > 1";
            $res = Database::query($sql);
            if (Database::num_rows($res) > 0) {
                $trouve = true;
                while ($data = Database::fetch_array($res)) {
                    $double_url = $data['url'];
                    $double_nb = $data['nb'];
                    $double_filetype = $data['filetype'];
                    $sql2 = "SELECT id FROM $tbl_work WHERE c_id=$c_id AND url='$double_url';";
                    $res2 = Database::query($sql2);
                    while ($data2 = Database::fetch_array($res2)) {
                        if ($double_filetype == "folder") {
                            $sql3 = "SELECT count(*) AS nb FROM $tbl_work WHERE c_id=$c_id AND parent_id=".$data2['id'].";";
                            $res3 = Database::query($sql3);
                            $data3 = Database::fetch_array($res3);
                            if ($data3['nb'] == 0) {
                                $sql_req = "DELETE FROM $tbl_work WHERE c_id=$c_id AND id=".$data2['id'].";";
                                $erreur .= "<div style='color:purple'> [DOUBLON] url=[$double_url] filetype=[$double_filetype] id=[".$data2['id']."] nombre de fils=[".$data3['nb']."] [ <span onclick='$(this).siblings(\":first\").toggle()'>SQL</span> ]<div class='sql'><textarea cols='200' rows='1' class='sql_area' onclick='this.select()'>$sql_req</textarea></div></div>";
                                if ($in_corriger) {
                                    $res_req = Database::query($sql_req);
                                    $erreur .= "Ok, doublon supprimé<br/>";
                                }
                            }
                            else {
                                $erreur .= "<div style='color:purple'> [DOUBLON] url=[$double_url] filetype=[$double_filetype] id=[".$data2['id']."] nombre de fils=[".$data3['nb']."]</div>";                                
                            }
                        }
                        else {
                            $erreur .= "<div style='color:purple'> [DOUBLON] url=[$double_url] filetype=[$double_filetype] id=[".$data2['id']."] </div>";
                        }
                        $sql_corrections .= $sql_req."\n";
                    }
                }
            }
        }

        if (!$trouve) {
            // dans la BDD pour chaque élément de la table work du cours
            while ($data = Database::fetch_array($result)) {
                $red_alert_continue = false;    // on doit faire une action avant de poursuivre les vérif
                $bdd_id = $data['id'];
                $bdd_url = $data['url'];
                $bdd_title = $data['title'];
                $bdd_description = $data['description'];
                $bdd_file_type = $data['filetype'];
                $bdd_parent_id = $data['parent_id'];
                $bdd_active = $data['active'];
                $bdd_accepted = $data['accepted'];
                $bdd_has_properties = $data['has_properties'];
                $bdd_sent_date =  $data['sent_date'];
                $bdd_contains_file =  $data['contains_file'];
                $bdd_user_id =  $data['user_id'];
                $bdd_author =  $data['author'];
                $bdd_post_group_id = $data['post_group_id'];
                $bdd_session_id = $data['session_id'];
                // FOLDER
                /*
                (FO1) url de la forme "/mondossier" et non "work/mondossier" 
                (FO1.1) dossier contient des sous dossiers
                (FO2) "/mondossier" existe dans le FS dans le dossier course/CODE/work
                (FO3) active=1 (ou 2 si supprimé ou n'existe pas dans le FS)
                (FO4) accepted=1 (c'est ce qui ferme l'oeil pour les fichier alors =0)
                (FO5) bdd_contains_file=0 (peut être à 1 pour un fichier dont le rendu est dans sa description)
                (FO6) le has_properties est un id de la table c_student_publication_assignment
                      dans la table student_publication_assignement le champ publication_id est l'id de la table student_publication
                (FO7) son id est le ref dans la table c_item_property avec tool="work" lastedit_type="DirectoryCreated"  et visibility=1
                (FO8) si supprimé (accepted=2) il n'existe pas dans le FS
                (FO9) si title est vide, mettre $bdd_url en title
                (FO10) si active=2 (supprimé) vérifier que le dossier n'existe pas dans le FS
                (FO11) Si la date de création du dossier est plus récente que le plus vieux fichier dedans, remplacer la date de création du dossier
                */
                // FOLDER
                if ($bdd_file_type == 'folder') {
                    // (1) si le dossier est de la forme work/lala dans la bdd on le renomme en lala regarde pour le lala
                    if (preg_match("/^work\//", $bdd_url)) {
                        $trouve = true;
                        $old_name =  $bdd_url;
                        $bdd_url = preg_replace("/^work/", "", $bdd_url);
                        $sql = "UPDATE $tbl_work SET url = '$bdd_url' WHERE c_id=$c_id AND id=$bdd_id;";
                        $erreur .= "<div style='color:#8E1521'>DOSSIER - [$bdd_url] (FO1) On peut renommer le folder [$old_name] dans la bdd sans le work [ <span onclick='$(this).siblings(\":first\").toggle()'>SQL</span> ]<div class='sql'><textarea cols='200' rows='1' class='sql_area' onclick='this.select()'>$sql</textarea></div></div>";
                        if ($in_corriger) {
                            $res = Database::query($sql);
                            $erreur .= "SQL rename enleve work OK<br/>";
                        }   
                        $sql_corrections .= "$sql\n";
                    }
                    // si le dossier de la BDD contient des sous dossiers
                    if (preg_match("|^/?.+/.+|", $bdd_url)) {
                        $trouve = true;
                        $sql = "DELETE FROM $tbl_work WHERE c_id=$c_id AND id=$bdd_id;";
                        $erreur .= "<div style='color:red'>FOLDER - Trouvé dans la BDD dossier avec sous dossier [$bdd_url] id=$bdd_id active=$bdd_active (REDALERT1) à vérifier dans le FS, on le suppr de la bdd [ <span onclick='$(this).siblings(\":first\").toggle()'>SQL</span> ]<div class='sql'><textarea cols='200' rows='1' class='sql_area' onclick='this.select()'>$sql</textarea></div></div>";
                        if ($in_corriger) {
                            $res = Database::query($sql);
                            $erreur .= "Ok, folder del in bdd";
                        }
                        $sql_corrections .= "$sql\n";
                        $red_alert_wait = true;
                    }
                    // (2) on regarde si le dossier existe dans le FS - mettre active=2 si pas dans le FS
                    if (!is_dir($work_folder.$bdd_url) && $bdd_active != 2 && !$red_alert_wait) {
                        $trouve = true;
                        $sql = "UPDATE $tbl_work SET active=2 WHERE c_id=$c_id AND id=$bdd_id;";
                        $erreur .= "<div style='color:blue'>DOSSIER - [$bdd_url] (FO2) ($bdd_sent_date) Folder dans BDD pas dans FS = [ $bdd_url ] On peut le desactiver [ <span onclick='$(this).siblings(\":first\").toggle()'>SQL</span> ]<div class='sql'><textarea cols='200' rows='1' class='sql_area' onclick='this.select()'>$sql</textarea></div></div>";
                        if ($in_corriger) {
                            $res = Database::query($sql);
                            $erreur .= "SQL delete (set active=2) OK<br/>";
                        }                    
                        $sql_corrections .= "$sql\n";                  
                    }
                    // (3) mettre active=1 si active=0
                    if (is_dir($work_folder.$bdd_url)) {
                        if ($bdd_active != 1 && $bdd_active != 2 && !$red_alert_wait) {
                            $trouve = true;
                            $sql = "UPDATE $tbl_work SET active=1 WHERE c_id=$c_id AND id=$bdd_id;";
                            $erreur .= "<div style='color:blue'>DOSSIER - [$bdd_url] (FO3) ($bdd_sent_date) Active = $bdd_active  à mettre à 1 [ <span onclick='$(this).siblings(\":first\").toggle()'>SQL</span> ]<div class='sql'><textarea cols='200' rows='1' class='sql_area' onclick='this.select()'>$sql</textarea></div></div>";
                            if ($in_corriger) {
                                $res = Database::query($sql);
                                $erreur .= "SQL set active=1 OK<br/>";
                            }                    
                            $sql_corrections .= "$sql\n";                  
                        }
                    }
                    // (4) accepted=1 (c'est ce qui ferme l'oeil pour les fichier alors =0)
                    if ($bdd_accepted != 1 && !$red_alert_wait) {
                        $trouve = true;
                        $sql = "UPDATE $tbl_work SET accepted=1 WHERE c_id=$c_id AND id=$bdd_id;";
                        $erreur .= "<div style='color:blue'>DOSSIER - [$bdd_url] (FO4) ($bdd_sent_date) Accepted = $bdd_accepted [ $bdd_url ] A mettre à 1 [ <span onclick='$(this).siblings(\":first\").toggle()'>SQL</span> ]<div class='sql'><textarea cols='200' rows='1' class='sql_area' onclick='this.select()'>$sql</textarea></div></div>";
                        if ($in_corriger) {
                            $res = Database::query($sql);
                            $erreur .= "SQL set accepted=1 OK<br/>";
                        }                    
                        $sql_corrections .= "$sql\n";                  
                    }

                    // (5) mettre bdd_contains_file=0 
                    if ($bdd_contains_file != 0 && !$red_alert_wait) {
                        $trouve = true;
                        $sql = "UPDATE $tbl_work SET contains_file=0 WHERE c_id=$c_id AND id=$bdd_id;";
                        $erreur .= "<div style='color:blue'>DOSSIER - [$bdd_url] (FO5) ($bdd_sent_date) bdd_contains_file = $bdd_contains_file à mettre à 0 [ <span onclick='$(this).siblings(\":first\").toggle()'>SQL</span> ]<div class='sql'><textarea cols='200' rows='1' class='sql_area' onclick='this.select()'>$sql</textarea></div></div>";
                        if ($in_corriger) {
                            $res = Database::query($sql);
                            $erreur .= "SQL set contains_file=0 OK<br/>";
                        }                    
                        $sql_corrections .= "$sql\n";                  
                    }

                    // (6) le has_properties est un id de la table c_student_publication_assignment
                    if (!existe_in_SPA_table($c_id, $bdd_id) && $bdd_active != 2 && !$red_alert_wait) {
                        $trouve = true;
                        $sql = "INSERT INTO $tbl_pub_assign VALUES ($c_id, '', '', '', '', '',$bdd_id );";
                        $erreur .= "<div style='color:#626231'>DOSSIER - [$bdd_url] (FO6) ($bdd_sent_date) à ajouter dans c_student_publication_assignment [ <span onclick='$(this).siblings(\":first\").toggle()'>SQL</span> ]<div class='sql'><textarea cols='200' rows='1' class='sql_area' onclick='this.select()'>#Doit être exécuté en deux fois en utilisant le insert_id dans la table $tbl_work champ has_properties ou faire en deux fois#\n $sql</textarea></div></div>";
                        $sql_corrections .= "$sql\n";                  
                        if ($in_corriger) {
                            $res = Database::query($sql);
                            $erreur .= "Ajout dans $tbl_pub_assign OK<br/>";
                            $SPA_new_id = Database::insert_id();
                            // on met à jour dans la table c_student_publication avec le new id de la table c_student_publication_assignment
                            $sql2 = "UPDATE $tbl_work SET has_properties=$SPA_new_id WHERE c_id=$c_id AND id=$bdd_id;";
                            $res2 = Database::query($sql2);
                            $erreur .= "Maj table student_publication.has_properties avec ID créé dans pub_assign = $SPA_new_id OK<br/>";
                        }
                    }
                    else if (!existe_in_SPA_table($c_id, $bdd_id, $bdd_has_properties) && $bdd_active != 2 && !$red_alert_wait) {
                        $trouve = true;
                        // il existe dans la SPA table mais on vérifie que son has_properties est bien le id de c_student_publication_assignment
                        $student_pub_id = get_student_pub_id($c_id, $bdd_id);
                        $sql = "UPDATE $tbl_work SET has_properties=$student_pub_id WHERE c_id=$c_id AND id=$bdd_id;";
                        $erreur .= "<div style='color:#626231'>DOSSIER - [$bdd_url] (FO6.2) ($bdd_sent_date) Mauvais has_properties dans c_student_publication [ <span onclick='$(this).siblings(\":first\").toggle()'>SQL</span> ]<div class='sql'><textarea cols='200' rows='1' class='sql_area' onclick='this.select()'>$sql</textarea></div></div>";
                        if ($in_corriger) {
                            $res = Database::query($sql);
                            $erreur .= "OK, has_properties dans c_student_publication mis à jour<br/>"; 
                        }
                        $sql_corrections .= "$sql\n";                  
                    }

                    // (7) son id est le ref dans la table c_item_property avec tool="work" lastedit_type="DirectoryCreated"  et visibility=1
                    // on regarde si il existe dans c_item_property avec lastedit_type="DirectoryCreated" 
                    // le has_property est l'id de la table c_student_publication_assignment
                    if (!existe_dans_item_property($c_id, $bdd_id, "AND (lastedit_type='DirectoryCreated' OR lastedit_type='FolderUpdated')") && !$red_alert_wait) {
                        $trouve = true;
                        $sql = "INSERT INTO $tbl_item_property VALUES ($c_id, '', 'work', $id_premier_admin, '$maintenant', '$maintenant', $bdd_id, 'DirectoryCreated', $id_premier_admin,'', '', '', '', '', '');";
                        $erreur .= "<div style='color:#800080'>DOSSIER - [$bdd_url] (FO7) ($bdd_sent_date) Ajouter dans item_property pour folder $bdd_url [ <span onclick='$(this).siblings(\":first\").toggle()'>SQL</span> ]<div class='sql'><textarea cols='200' rows='1' class='sql_area' onclick='this.select()'>$sql</textarea></div></div>";
                        if ($in_corriger) {
                            $res = Database::query($sql);
                            $erreur .= "Corrigé folder dans item_property, ok <br/>";
                        }
                        $sql_corrections .= "$sql\n";                  
                    }
                    // (8) si supprimé (accepted=2) il n'existe pas dans le FS
                    if ($bdd_active == 2 && !$red_alert_wait) {
                        // ne doit pas existé dans FS
                        if (is_dir($work_folder.$bdd_url)) {
                            $trouve = true;
                            $sql = "UPDATE $tbl_work SET active=1 WHERE c_id=$c_id AND id=$bdd_id;";
                            $erreur .= "<div style='color:black'>DOSSIER -  [$bdd_url] (FO8) supprimé dans BDD (active=2) et présent dans FS; On met le active à 1. Vérifier qd même ce dossier pour le supprimer via l'interface Chamilo, afin de supprimer proprement tout son contenu. [<span onclick='$(this).siblings(\":first\").toggle()'>SQL</span> ]<div class='sql'><textarea cols='200' rows='1' class='sql_area' onclick='this.select()'>$sql</textarea></div></div>";
                            if ($in_corriger) {
                                $res = Database::query($sql);
                                $erreur .= "OK, mis dossier active=1<br/>";
                            }                            
                            $sql_corrections .= "$sql\n";     
                        }
                        // ne doit pas existé dans c_student_publication_assignement
                        if (existe_in_SPA_table($c_id, $bdd_id)) {
                            $trouve = true;
                            $sql = "DELETE FROM $tbl_pub_assign WHERE c_id=$c_id AND publication_id=$bdd_id;";
                            $sql_corrections .= "$sql\n";                  
                            $erreur .= "<div style='color:#004A13'>DOSSIER - [$bdd_url] A supprimer de c_student_publication_assignement[ <span onclick='$(this).siblings(\":first\").toggle()'>SQL</span> ]<div class='sql'><textarea cols='200' rows='1' class='sql_area' onclick='this.select()'>$sql</textarea></div></div>";
                            if ($in_corriger) {
                                $res = Database::query($sql);
                                $erreur .= "Suppr de c_student_publication_assignement $bdd_url , ok<br/>";
                            }
                        }
                    }
                    // (9) si title est vide, mettre $bdd_url en title
                    // il faut d'avord avoir corrigé le point (1)
                    if ($bdd_title == "" && !$red_alert_wait) {
                        $trouve = true;
                        $new_title = preg_replace("|/|", "", $bdd_url);
                        $sql = "UPDATE $tbl_work SET title='$new_title' WHERE c_id=$c_id AND id=$bdd_id;";
                        $erreur .= "<div style='color:#004A13'>DOSSIER - [$bdd_url] (FO9) Remplir le champ title avec $new_title [ <span onclick='$(this).siblings(\":first\").toggle()'>SQL</span> ]<div class='sql'><textarea cols='200' rows='1' class='sql_area' onclick='this.select()'>$sql</textarea></div></div>";
                        if ($in_corriger) {
                            $res = Database::query($sql);
                            $erreur .= "Mis champ title a $new_title<br/>";
                        }
                        $sql_corrections .= "$sql\n";                  
                    }
                    // (10) si active=2 (supprimé) vérifier que le dossier n'existe pas dans le FS
                    /*
                    déjà vu dans le FO8
                    if ($bdd_active == 2 && is_dir($work_folder.$bdd_url) && !$red_alert_wait) {
                        $trouve = true;
                        $erreur .= "DOSSIER - [$bdd_url] (FO10) Dossier marqué en supprimé (active=2) et dossier existe dans FS. Vérifier à la main.<br/>";
                    }  
                    */
                    // (FO11) Si la date de création du dossier est plus récente que le plus vieux fichier dedans, remplacer la date de création du dossier
                    if ( (($older_file_date = date_older_file_in_folder($c_id, $bdd_id)) < $bdd_sent_date) || $bdd_sent_date == "1970-01-01 00:00:00") {
                        if ($bdd_sent_date > "2013-01-21"  || $bdd_sent_date == "1970-01-01 00:00:00") {
                            $trouve = true;
                            $sql = "UPDATE $tbl_work SET sent_date='$older_file_date' WHERE c_id=$c_id AND id=$bdd_id;";
                            $sql2 = "UPDATE $tbl_item_property SET insert_date = '$older_file_date' WHERE c_id=$c_id AND tool='work' AND ref=$bdd_id;";
                            $sql3 = "UPDATE $tbl_item_property SET lastedit_date = '$older_file_date' WHERE c_id=$c_id AND tool='work' AND ref=$bdd_id;";
                            $erreur .= "<div style='color:#3C0077'>FOLDER (FO10) - ($bdd_url) Date du folder=$bdd_sent_date > date du plus vieux fichiers=$older_file_date . On la remplace. [ <span onclick='$(this).siblings(\":first\").toggle()'>SQL</span> ]<div class='sql'><textarea cols='200' rows='1' class='sql_area' onclick='this.select()'>$sql\n$sql2\n$sql3</textarea></div></div>";
                            if ($in_corriger) {
                                $res = Database::query($sql);
                                $res2 = Database::query($sql2);
                                $res3 = Database::query($sql3);
                                $erreur .= "Mis a jour les dates, ok<br/>";
                            }
                            $sql_corrections .= "$sql\n$sql2\n$sql3\n";     
                        }             
                    }                    
                    if ($trouve) {
                        $folder_in_error_found = 1;
                    }

                }
                // FILE
                else if ($bdd_file_type == 'file' && !$folder_in_error_found) {
                    /*
                    (FI1) url de la forme work/FOLDER/xxxxxxxxxxxx avec FOLDER doit exister comme folder dans la BDD sinon on l'ajoute dans la table c_student_publication et on repasse ce script qui va mettre bien comme il faut les info de ce folder
                    L'id de FOLDER doit être le parent_id du document
                    (FI2) le fichier existe dans le FS
                    (FI3) le champ has_properties = 0
                    (FI4) contains_file = 1 (on n'a pas encore ouvert les rendu rédigé)
                    (FI5) accepted = 0 (oeil fermé) ou 1 (oeil ouvert)
                    (FI6) si supprimé active=2 et n'existe plus dans le FS, sinon active=1
                    (FI7) doit être présent dans item_property
                    (FI8) le champ author par rapport au lastname+firstname de la table user, si le user est toujours inscrit                
                    */
                    $file_folder = "";
                    $file_name = "";
                    if (preg_match("/^work\/([^\/]+)\/([^\/]+)/", $bdd_url, $tab_match)) {
                        $file_folder = $tab_match[1];
                        $file_name = $tab_match[2];
                    }

                    // (1) url de la forme work/FOLDER/xxxxxxxxxxxx avec FOLDER doit exister comme folder dans la BDD sinon on l'ajoute dans la table c_student_publication et on repasse ce script qui va mettre bien comme il faut les info de ce folder
                    // L'id de FOLDER doit être le parent_id du document, pour un to_group_id et id_session donné
                    if (!preg_match("/^work\/([^\/]+)\/([^\/]+)$/", $bdd_url, $tab_match)) {
                        // dans le cas d'un travail remis par l'éditeur de texte, il faut que contains_file soir à 0
                        if ($bdd_url == "") {
                            if ($bdd_contains_file != 0 && !$red_alert_wait) {
                                $trouve = true;
                                $sql = "UPDATE $tbl_work SET contains_file=0 WHERE c_id=$c_id AND id=$bdd_id;";
                                $erreur .= "<div style='color:#444488'>FILE - [$bdd_url] (FI1.1) URL='' il faut mettre contains_file à 0 [ <span onclick='$(this).siblings(\":first\").toggle()'>SQL</span> ]<div class='sql'><textarea cols='200' rows='1' class='sql_area' onclick='this.select()'>$sql</textarea></div></div>";
                                if ($in_corriger) {
                                    $res = Database::query($sql);
                                    $erreur .= "OK, contains_file mis à 0 pour un work sans URL<br/>";
                                }
                                $sql_corrections .= "$sql\n";                  
                            }
                        }
                        else {
                            $trouve = true;
                            $sql = "DELETE FROM $tbl_work WHERE c_id=$c_id AND id=$bdd_id;";
                            $erreur .= "<div style='color:red'>FILE - /!\ Attention (FI1.2) (REDALERT2) [$bdd_url] id=$bdd_id active=$bdd_active ne match pas work/FOLDER/xxxxxxxxx ; Vérifier dans le FS puis on del dans la BDD[ <span onclick='$(this).siblings(\":first\").toggle()'>SQL</span> ]<div class='sql'><textarea cols='200' rows='1' class='sql_area' onclick='this.select()'>$sql</textarea></div></div>";
                            if ($in_corriger) {
                                $res = Database::query($sql);
                                $erreur .= "Ok, del de la bdd<br/>";
                            }
                            $sql_corrections .= "$sql\n";
                            $red_alert_wait = true;
                        }
                    }
                    else if (!$red_alert_wait) {
                        // on vérifie que $tab_match[1] est bien un folder dans la BDD c_student_publication, sinon on l'ajoute
                        if (!($folder_id = exist_in_student_publication_table($c_id, $tab_match[1]))) {
                            $trouve = true;
                            $sql = "INSERT INTO $tbl_work (c_id, id, url, title, active, accepted, sent_date, filetype, has_properties, parent_id, user_id, contains_file, session_id, post_group_id) VALUES ($c_id, '', '/".$tab_match[1]."', '".$tab_match[1]."', 1, 1, '$maintenant', 'folder', 0, 0, $id_premier_admin, 0, $bdd_session_id, $bdd_post_group_id);";
                            $erreur .= "<div style='color:#444488'>FILE - [$bdd_url] (FI1.3) Dossier ".$tab_match[1]." n'existe pâs dans BDD pour ce document on créé le dossier ".$tab_match[1]."dans la BDD [ <span onclick='$(this).siblings(\":first\").toggle()'>SQL</span> ]<div class='sql'><textarea cols='200' rows='1' class='sql_area' onclick='this.select()'>$sql</textarea></div></div>";
                            if ($in_corriger) {
                                $res = Database::query($sql);
                                $erreur .= "FILE - Ok, création dossier ".$tab_match[1]." dans c_student_publication, relancer l'outil <br/>";
                                $added_id = Database::insert_id();
                                $sql2 = "UPDATE $tbl_work SET parent_id=$added_id WHERE c_id=$c_id AND id=$bdd_id";
                                $res2 = Database::query($sql2);
                                $erreur .= "FILE - On met le parent_id de $bdd_url à l'id du dossier que l'on vient de créer. [ <span onclick='$(this).siblings(\":first\").toggle()'>SQL</span> ]<div class='sql'>$sql2</div> <br/>";
                            }
                            $sql_corrections .= "$sql\n";                  
                        }
                        else {
                            // on verifie que le parent_id du fichier est bien $folder_id
                            if ($bdd_parent_id != $folder_id) {
                                $trouve = true;
                                $sql = "UPDATE $tbl_work SET parent_id=$folder_id WHERE c_id=$c_id AND id=$bdd_id;";
                                $erreur .= "<div style='color:#000071'>FILE - [$bdd_url] (FI1.4) Met a jour le parent_id du fichier ($bdd_parent_id) avec $folder_id [ <span onclick='$(this).siblings(\":first\").toggle()'>SQL</span> ]<div class='sql'><textarea cols='200' rows='1' class='sql_area' onclick='this.select()'>$sql</textarea></div></div>";
                                if ($in_corriger) {
                                    $res = Database::query($sql);
                                    $erreur .= "Ok, Maj du parent_id du fichier<br/>";
                                }
                                $sql_corrections .= "$sql\n";                  
                            }
                        }
                    }
                    // (2) si son dossier existe dans le FS vérifier si le fichier existe dans le FS
                    if (!is_file($course_folder."/".$bdd_url) && $bdd_active != 2 && !$red_alert_wait) {
                        if (!($bdd_url == "" && $bdd_contains_file == 0)) {
                            $trouve = true;
                            $folder_info = get_folder_info_in_table($c_id, $file_folder);
                            $sql = "UPDATE $tbl_work SET active=2 WHERE c_id=$c_id AND id=$bdd_id;";
                            $erreur .= "<div style='color:#00009B'>FILE - [$bdd_url] (FI2) Fichier $bdd_url non trouvé dans le FS. On peut le marquer deleted dans la bdd (active=2). [ <span onclick='$(this).siblings(\":first\").toggle()'>SQL</span> ]<div class='sql'><textarea cols='200' rows='1' class='sql_area' onclick='this.select()'>$sql</textarea></div>$folder_info</div>";
                            if ($in_corriger) {
                                $res = Database::query($sql);
                                $erreur .= "Ok, mis en deleted<br/>";
                            }
                            $sql_corrections .= "$sql\n";   
                        }               
                    }
                    // (3) le champ has_properties = 0
                    if ($bdd_has_properties != 0 && !$red_alert_wait) {
                        $trouve = true;
                        $sql = "UPDATE $tbl_work SET has_properties=0 WHERE c_id=$c_id AND id=$bdd_id;";
                        $erreur .= "<div style='color:#5E5EAE'>FILE - [$bdd_url] (FI3) Mettre le has_properties à 0 [ <span onclick='$(this).siblings(\":first\").toggle()'>SQL</span> ]<div class='sql'><textarea cols='200' rows='1' class='sql_area' onclick='this.select()'>$sql</textarea></div></div>";
                        if ($in_corriger) {
                            $res = Database::query($sql);
                            $erreur .= "Ok, mettre le has_properties à 0<br/>";
                        }
                        $sql_corrections .= "$sql\n"; 
                    }
                    // (4) contains_file = 1 (on n'a pas encore ouvert les rendu rédigé)
                    if ($bdd_contains_file != 1 && $bdd_url != "" && !$red_alert_wait) {
                        $trouve = true;
                        $sql = "UPDATE $tbl_work SET contains_file=1 WHERE c_id=$c_id AND id=$bdd_id;";
                        $erreur .= "<div style='color:#008080'>FILE - [$bdd_url] (FI4) Mettre le contains_file à 1 (ce n'est pas un devoir rédigé) [ <span onclick='$(this).siblings(\":first\").toggle()'>SQL</span> ]<div class='sql'><textarea cols='200' rows='1' class='sql_area' onclick='this.select()'>$sql</textarea></div></div>";
                        if ($in_corriger) {
                            $res = Database::query($sql);
                            $erreur .= "Ok, mettre le contains_file à 1 <br/>";
                        }
                        $sql_corrections .= "$sql\n"; 
                    }
                    // (5) accepted = 0 (oeil fermé) ou 1 (oeil ouvert)
                    // si !=1 l'oeil est fermé
                    if ($bdd_accepted != 0 && $bdd_accepted != 1 && !$red_alert_wait) {
                        $trouve = true;
                        $sql = "UPDATE $tbl_work SET accepted=0 WHERE c_id=$c_id AND id=$bdd_id;";
                        $erreur .= "<div style='color:#B93D00'>FILE - [$bdd_url] (FI5) Accepted=$bdd_accepted !=1 ou 0 , à mettre à 0[ <span onclick='$(this).siblings(\":first\").toggle()'>SQL</span> ]<div class='sql'><textarea cols='200' rows='1' class='sql_area' onclick='this.select()'>$sql</textarea></div></div>";
                        if ($in_corriger) {
                            $res = Database::query($sql);
                            $erreur .= "Ok, mettre le accepted à 0<br/>";
                        }
                        $sql_corrections .= "$sql\n"; 
                    }
                    // (6) si supprimé active=2 et n'existe plus dans le FS, sinon active=1
                    if (is_file($course_folder.'/'.$bdd_url) && !$red_alert_wait) {
                        if ($bdd_active != 1) {
                            $trouve = true;
                            $sql = "UPDATE $tbl_work SET active=1 WHERE c_id=$c_id AND id=$bdd_id;";
                            $erreur .= "<div style='color:#800000'>FILE - [$bdd_url] (FI6.1) Fichier existe dans FS et active=$bdd_active, mettre le active à 1[ <span onclick='$(this).siblings(\":first\").toggle()'>SQL</span> ]<div class='sql'><textarea cols='200' rows='1' class='sql_area' onclick='this.select()'>$sql</textarea></div></div>";
                            if ($in_corriger) {
                                $res = Database::query($sql);
                                $erreur .= "Ok, mettre le active à 1<br/>";
                            }
                            $sql_corrections .= "$sql\n"; 
                        }
                    }
                    /*
                    Cas traité par le FI2
                    else if (!$red_alert_wait) {
                        if ($bdd_active != 2) {
                            $trouve = true;
                            $sql = "UPDATE $tbl_work SET active=2 WHERE c_id=$c_id AND id=$bdd_id;";
                            $erreur .= "<div style='color:#666600'>FILE - [$bdd_url] (FI6.2) Fichier absent du FS et active=$bdd_active, mettre le active à 2[ <span onclick='$(this).siblings(\":first\").toggle()'>SQL</span> ]<div class='sql'><textarea cols='200' rows='1' class='sql_area' onclick='this.select()'>$sql</textarea></div></div>";
                            if ($in_corriger) {
                                $res = Database::query($sql);
                                $erreur .= "Ok, mettre le active à 2<br/>";
                            }
                            $sql_corrections .= "$sql\n"; 
                        }
                    }
                    */
                    // (7) doit être présent dans item_property
                    if (!existe_dans_item_property($c_id, $bdd_id) && !$red_alert_wait) {
                        $libelle = "DocumentDeleted";
                        if ($bdd_active == 1) {
                            $libelle = "DocumentAdded";
                        }
                        $sql = "INSERT INTO $tbl_item_property VALUES ($c_id, '', 'work', $id_premier_admin, '$maintenant', '$maintenant', $bdd_id, '$libelle', $bdd_user_id,'', '', '', '', '', '');";
                        $erreur .= "<div style='color:#620000'>FILE - [$bdd_url] (FI7.1) à ajouter dans le item_property DocumentAdded [ <span onclick='$(this).siblings(\":first\").toggle()'>SQL</span> ]<div class='sql'><textarea cols='200' rows='1' class='sql_area' onclick='this.select()'>$sql</textarea></div></div>";
                        if ($in_corriger) {
                            $res = Database::query($sql);
                            $erreur .= "Ok, ajouté $libelle dans item_property<br/>";
                        }
                        $sql_corrections .= "$sql\n"; 
                    }
                    else if (!$red_alert_wait)  {
                        // on verifie son lastedit_type dans le item_property
                        $lastedit_type = get_lastedit_type_from_item_property($c_id, $bdd_id);
                        switch ($lastedit_type) {
                            case "DocumentUpdated":
                            case "DocumentAdded":
                                // active doit être à 1 si le fichier existe dans la BDD sinon, on met le lastedit_type à DocumentDeleted
                                if (is_file($course_folder.'/'.$bdd_url) && $bdd_active != 1) {
                                    $trouve = true;
                                    $sql = "UPDATE $tbl_work SET active=1 WHERE c_id=$c_id AND id=$bdd_id;";
                                    $erreur .= "<div style='color:#800000'>FILE - [$bdd_url] (FI7.2) Item_property=$lastedit_type => active devrait être à 1 alors que active=$bdd_active, mettre le active à 1[ <span onclick='$(this).siblings(\":first\").toggle()'>SQL</span> ]<div class='sql'><textarea cols='200' rows='1' class='sql_area' onclick='this.select()'>$sql</textarea></div></div>";
                                    if ($in_corriger) {
                                        $res = Database::query($sql);
                                        $erreur .= "Ok, mettre le active à 1<br/>";
                                    }
                                    $sql_corrections .= "$sql\n"; 
                                }
                                else if (!is_file($course_folder.'/'.$bdd_url) && $bdd_active != 2) {
                                    if (!($bdd_url == "" && $bdd_contains_file == 0)) {
                                        $trouve = true;
                                        $sql = "UPDATE $tbl_item_property SET lastedit_type='DocumentDeleted' WHERE c_id=$c_id AND ref=$bdd_id AND tool='work';";
                                        $erreur .= "<div style='color:#004040'>FILE - [$bdd_url] (FI7.3) Item_property=$lastedit_type et fichier absent du FS mettre le lastedit_type à DocumentDeleted[ <span onclick='$(this).siblings(\":first\").toggle()'>SQL</span> ]<div class='sql'><textarea cols='200' rows='1' class='sql_area' onclick='this.select()'>$sql</textarea></div></div>";
                                        if ($in_corriger) {
                                            $res = Database::query($sql);
                                            $erreur .= "Ok, mettre le lastedit_type à DocumentDeleted<br/>";
                                        }
                                        $sql_corrections .= "$sql\n"; 
                                    }
                                }
                                break;
                            case "Document supprimé" : 
                            case "DocumentDeleted":
                                // active doit être à 2
                                if ((!existe_in_FS($bdd_url, $work_folder, $course_code) || preg_match("/_DELETED_/", $bdd_url)) && $bdd_active != 2) {
                                    $trouve = true;
                                    $sql = "UPDATE $tbl_work SET active=2 WHERE c_id=$c_id AND id=$bdd_id;";
                                    $erreur .= "<div style='color:#400080'>FILE - [$bdd_url] (FI7.4) Item_property=[DocumentDeleted] => active=2 alors que active=$bdd_active, mettre le active à 2[ <span onclick='$(this).siblings(\":first\").toggle()'>SQL</span> ]<div class='sql'><textarea cols='200' rows='1' class='sql_area' onclick='this.select()'>$sql</textarea></div></div>";
                                    if ($in_corriger) {
                                        $res = Database::query($sql);
                                        $erreur .= "Ok, mettre le active à 2<br/>";
                                    }
                                    $sql_corrections .= "$sql\n"; 
                                }
                                break;
                            case "WorkInvisible":
                                // invisible donc accepted doit être à 0
                                if ($bdd_accepted != 0) {
                                    $trouve = true;
                                    $sql = "UPDATE $tbl_work SET accepted=0 WHERE c_id=$c_id AND id=$bdd_id;";
                                    $erreur .= "<div style='color:#408080'>FILE - [$bdd_url] (FI7.5) Item_property=[WorkInvisible] => mettre accepted à 0 [ <span onclick='$(this).siblings(\":first\").toggle()'>SQL</span> ]<div class='sql'><textarea cols='200' rows='1' class='sql_area' onclick='this.select()'>$sql</textarea></div></div>";
                                    if ($in_corriger) {
                                        $res = Database::query($sql);
                                        $erreur .= "OK, accepted mis à 0<br/>";
                                    }
                                    $sql_corrections .= "$sql\n"; 
                                }
                                break;
                            case "WorkVisible":
                                // visible donc accepted doit être à 0
                                if ($bdd_accepted != 1) {
                                    $trouve = true;
                                    $sql = "UPDATE $tbl_work SET accepted=1 WHERE c_id=$c_id AND id=$bdd_id;";
                                    $erreur .= "<div style='color:#000080'>FILE - [$bdd_url] (FI7.6) Item_property=[$lastedit_type] => mettre accepted à 1 [ <span onclick='$(this).siblings(\":first\").toggle()'>SQL</span> ]<div class='sql'><textarea cols='200' rows='1' class='sql_area' onclick='this.select()'>$sql</textarea></div></div>";
                                    if ($in_corriger) {
                                        $res = Database::query($sql);
                                        $erreur .= "OK, accepted mis à 0<br/>";
                                    }
                                    $sql_corrections .= "$sql\n"; 
                                }                        
                                break;
                            case "FolderUpdated" :
                            case "Document mis à jour" :                            
                            case "Document ajouté" :
                            case "Document added" :
                                $trouve = true;
                                // des restes de Dokeos, on place à DocumentAdded ou DocumentDeleted selon le active à 1 ou 2
                                $new_lastedit_type = "DocumentAdded";
                                if ($bdd_active == 2) {
                                    $new_lastedit_type = "DocumentDeleted";
                                }
                                $sql = "UPDATE $tbl_item_property SET lastedit_type='$new_lastedit_type' WHERE c_id=$c_id AND tool='work' AND ref='$bdd_id';";
                                $erreur .= "<div style='color:#800040'>FILE - [$bdd_url] (FI7.7) Item_property=[$lastedit_type] mis à [$new_lastedit_type][ <span onclick='$(this).siblings(\":first\").toggle()'>SQL</span> ]<div class='sql'><textarea cols='200' rows='1' class='sql_area' onclick='this.select()'>$sql</textarea></div></div>";
                                if ($in_corriger) {
                                    $res = Database::query($sql);
                                    $erreur .= "Ok, itemp_property.lastedit_type mis à $new_lastedit_type<br/>";
                                }
                                $sql_corrections .= "$sql\n"; 
                                break;
                            default :
                                $trouve = true;
                                $erreur .= "<div style='color:#97004B'>FILE - [$bdd_url] /!\ (FI7.8) lastedit_type=[$lastedit_type] inconnu ? trouvé dans la table item_property</div>";
                        }
                    }
                    // (8) le champ author par rapport au lastname+firstname de la table user, si le user est toujours inscrit
                    $user_name = get_username_from_id($bdd_user_id);
                    if ( $user_name != $bdd_author && !$red_alert_wait) {
                        $trouve = true;
                        $sql = "UPDATE $tbl_work SET author='".Database::escape_string($user_name)."' WHERE c_id=$c_id AND id=$bdd_id;";
                        $erreur .= "<div style='color:#007171'>FILE - [$bdd_url] (FI8) c_student_publication.author=[$bdd_author] != [$user_name] pour user id=$bdd_user_id  [ <span onclick='$(this).siblings(\":first\").toggle()'>SQL</span> ]<div class='sql'><textarea cols='200' rows='1' class='sql_area' onclick='this.select()'>$sql</textarea></div></div>";
                        if ($in_corriger) {
                            $res = Database::query($sql);
                            $erreur .= "Ok, champ author de c_student_publication mis à jour<br/>";
                        }
                        $sql_corrections .= "$sql\n";                     
                    }                       
                    // (9) Si le user est $id_user_desinscrit, on met le acepted à 0 (oeil fermé)
                    if ($bdd_user_id == $id_user_desinscrit || $bdd_user_id == $id_premier_admin) {
                        $sql = "UPDATE $tbl_work SET acepted=0 WHERE c_id=$c_id AND id=$bdd_id;";
                        $erreur .= "<div style='color:#000082'>FILE [$bdd_url] Utilisateur est désinscrit, on ferme l'oeil. [ <span onclick='$(this).siblings(\":first\").toggle()'>SQL</span> ]<div class='sql'><textarea cols='200' rows='1' class='sql_area' onclick='this.select()'>$sql</textarea></div></div>";
                        if ($in_corriger) {
                            $res = Database::query($sql);
                            $erreur .= "Ok, oeil fermé<br/>";
                        }
                        $sql_corrections .= "$sql\n";                     
                    }
                }
                // FOR FILE AND FOLDER
                /*
                (FO&FI1) dans la table c_student_publication doit avoir un user_id valide
                (FO&FI2) vérifier que le item_property.insert_user_id = c_student_publication.user_id et que le champ author correspond bien
                */
                // (1) dans la table c_student_publication doit avoir un user_id valide
                // sinon le fichier n'est pas affiché
                if (!existe_user_id($bdd_user_id) && !$red_alert_wait) {
                    // on met l'id de l'utilisateur désinscrit INP=id 28621 "Utilisateur désinscrit" 
                    // on met à jour dans item_property aussi
                    $trouve = true;
                    $sql = "UPDATE $tbl_work SET user_id=$id_user_desinscrit , author='".Database::escape_string($name_user_desinscrit)."' WHERE c_id=$c_id AND id=$bdd_id;";
                    $sql2 .= "UPDATE $tbl_item_property SET insert_user_id=$id_user_desinscrit WHERE c_id=$c_id AND tool='work' AND ref='$bdd_id';";
                    $erreur .= "<div style='color:#6767B4'>FILE or FOLDER - [$bdd_url] (FO&FI1) user_id=$bdd_user_id inconnu on met $id_user_desinscrit [ <span onclick='$(this).siblings(\":first\").toggle()'>SQL</span> ]<div class='sql'><textarea cols='200' rows='1' class='sql_area' onclick='this.select()'>$sql\n$sql2</textarea></div></div>";
                    if ($in_corriger) {
                        $res = Database::query($sql);
                        $res2 = Database::query($sql2);
                        $erreur .= "Ok, user_id mis à jour avec user desinscrit dans c_student_pub<br/>";
                        $erreur .= "Ok, user_id mis à jour avec user desinscrit dans item_property<br/>";
                    }
                    $sql_corrections .= "$sql\n$sql2\n";   
                }
                // (2) vérifier que le item_property.insert_user_id = c_student_publication.user_id et que le champ author correspond bien
                // sinon le fichier n'est pas affiché pour le user
                if (($item_prop_user_id = get_item_property_insert_user_id($c_id, $bdd_id)) != $bdd_user_id  && !$red_alert_wait) {
                    if ($item_prop_user_id) {
                        $trouve = true;
                        // si dans c_student_publication on a l'id d'un user autre que admin ou utilisateur désinscrit, on met celui là dans item_property
                        // sinon, on met celui de item_propety
                        if (existe_user_id($bdd_user_id) && $bdd_user_id != $id_premier_admin && $bdd_user_id != $id_user_desinscrit) {
                            $sql = "UPDATE $tbl_item_property SET insert_user_id=$bdd_user_id WHERE c_id=$c_id AND tool='work' AND ref=$bdd_id;";
                        }
                        else if (existe_user_id($item_prop_user_id) && $item_prop_user_id != $id_premier_admin && $item_prop_user_id != $id_user_desinscrit) {
                            $sql = "UPDATE $tbl_work SET user_id=$item_prop_user_id WHERE c_id=$c_id AND id=$bdd_id;";
                        }
                        else {
                            $sql = "UPDATE $tbl_item_property SET insert_user_id=$bdd_user_id WHERE c_id=$c_id AND tool='work' AND ref=$bdd_id;";
                        }
                        $erreur .= "<div style='color:#FF0080'>FILE or FOLDER- [$bdd_url] (FO&FI2.1) item_property et c_student_publication n'ont pas le même id de user [ <span onclick='$(this).siblings(\":first\").toggle()'>SQL</span> ]<div class='sql'><textarea cols='200' rows='1' class='sql_area' onclick='this.select()'>$sql</textarea></div></div>";
                        if ($in_corriger) {
                            $res = Database::query($sql);
                            $erreur .= "Ok, item_property.insert_user_id mis à jour<br/>";
                        }
                        $sql_corrections .= "$sql\n";     
                    }                
                }
            }
        }

        // LA TABLE ITEM_PROPERTY
        /*
        (1) on vérifie que chaque ligne de la table item_property correspond à un élément
        */
        // on cherche les élément de item_property ref qui ne correspondent plus à des données id dans student_publication         
        if (!$trouve) {
            $sql_item = "SELECT cip.c_id, cip.id, cip.tool, cip.ref, csp.url FROM $tbl_item_property cip 
                        LEFT JOIN $tbl_work csp ON csp.id=cip.ref AND csp.c_id=cip.c_id
                        WHERE 
                        cip.c_id=$c_id
                        AND tool='work'
                        AND csp.url IS NULL;";
            $res_item = Database::query($sql_item);
            while ($data_item = Database::fetch_array($res_item)) {
                    $trouve = true;
                    $sql_del = "DELETE FROM $tbl_item_property WHERE c_id=$c_id AND tool='work' AND ref=".$data_item['ref'].";";
                    $erreur .= "<div style='color:green'>BDD - Item_property c_id=$c_id AND tool='work' AND ref=".$data_item['ref']." a supprimer. [ <span onclick='$(this).siblings(\":first\").toggle()'>SQL</span> ]<div class='sql'><textarea cols='200' rows='1' class='sql_area' onclick='this.select()'>$sql_del</textarea></div></div>";
                    if ($in_corriger) {
                        $res_del = Database::query($sql_del);
                        $erreur .= "Del item_property useleff element, ok<br/>";
                    }
                    $sql_corrections .= "$sql_del\n"; 
            }
        }

        if ($trouve) {
            file_put_contents($report_file, "$c_id\t$course_code\t$course_title\n", FILE_APPEND);
            $nb_cours_en_erreur++;
            $erreur = "Note : l'analyse des fichiers se fait quand la correction des dossiers est terminée<hr/>".$erreur;
            $erreur .= "<hr/>Toutes les requêtes pour ce cours<br/><textarea style='background-color:#F1F1F8;height:150px; width:1000px;' onclick='this.select()'>$sql_corrections</textarea>";
            $redo_button = "<input type='button' value='redo this course' onclick='self.location.href=\"$current_url_check_i&check_only_course_for_i=$i\"' />";
            $all_button = "<input type='button' value='redo all course' onclick='self.location.href=\"$current_url_check_i\"' />";
            $msg .= "<h2><a target='_blank' href='".api_get_path(WEB_PATH)."courses/".api_get_course_path($course_code)."'>c_id=$c_id</a> <table style='display:inline;font-size:60%'><tr><td class='mtd'>code [$course_code]</td></tr><tr><td class='mtd'>dir [$course_directory]</td></tr></table> Cours ".$tabcourselist[$i]['title']." $redo_button $all_button</h2>";
            $msg .= "<div style='background-color:#F5F5F5'>".get_mail_of_teachers_for_course($course_code)."<br/><br/></div>";
            $msg .= $erreur;
        }

        // si on fait cours par cours, ou tous les cours d'un coup (attention si il y abcp de cours, ça peut ramer)
        if ($trouve && $stop_after_check_one_course) {
            echo $msg;
            echo "<hr/>";
            echo "<input type='button' onclick='$(\"#tabcourse1\").toggle()' value='see tabcourselist'/>";
            echo "&lt;pre style='display:none;background-color:white' id='tabcourse1'&gt;";
            print_r($tabcourselist);
            echo "&lt;/pre&gt;";            
            exit;
        }
    }
    echo "&lt;div style='color:#80abd6'&gt;Nombre de cours en erreur : $nb_cours_en_erreur&lt;/div&gt;";
    echo $msg;
    echo "&lt;hr/&gt;";
    echo "&lt;input type='button' onclick='$(\"#tabcourse2\").toggle()' value='see tabcourselist'/&gt;";
    echo "&lt;pre style='display:none;background-color:white' id='tabcourse2'&gt;";
    print_r($tabcourselist);
    echo "&lt;/pre&gt;";            
}

function get_mail_of_teachers_for_course($in_course_code) {
    $responsable_list = "";
    $sql = "SELECT cru.* , lastname, firstname, username, email
            FROM course_rel_user cru
            LEFT JOIN user u ON u.user_id=cru.user_id
            WHERE 
            cru.status=1
            AND course_code='$in_course_code';";
    $res  = Database::query($sql);
    while ($data = Database::fetch_array($res)) {
        $bdd_lastname = $data['lastname'];
        $bdd_firstname = $data['firstname'];
        $bdd_username = $data['username'];
        $bdd_email = $data['email'];
        $responsable_list .= "$bdd_email, ";
    }    
    return $responsable_list;
}

function date_older_file_in_folder($in_c_id, $in_id) {
    $out_res = Date("Y-m-d G:i:s");
    $tbl_work = Database::get_course_table(TABLE_STUDENT_PUBLICATION);
    $sql = "SELECT min(sent_date) AS mindate FROM $tbl_work WHERE c_id=$in_c_id AND parent_id=$in_id AND filetype='file' AND sent_date &gt; '1971-01-01';";
    $res = Database::query($sql);
    if (Database::num_rows($res) &gt; 0) {
        $data = Database::fetch_array($res);
        if ($data['mindate'] != "") {
            $out_res = $data['mindate'];
        }
    }
    return $out_res;
}

function existe_in_FS($in_filepath, $in_work_folder, $in_course_code) {
    $tab_all_file = array();
    $tab_all_file = list_folder($in_work_folder, $tab_all_file);
    array_walk(&$tab_all_file, 'remove_dir_prefix', $in_course_code);
    return in_array($in_filepath, $tab_all_file);
}

function get_item_property_insert_user_id($in_c_id, $in_bdd_id) {
    $tbl_item_property = Database::get_course_table(TABLE_ITEM_PROPERTY);
    $out_res = 0;
    $sql = "SELECT insert_user_id FROM $tbl_item_property WHERE c_id=$in_c_id AND ref=$in_bdd_id AND tool='work';";
    $res = Database::query($sql);
    if (Database::num_rows($res) &gt; 0) {
        $data = Database::fetch_array($res);
        $out_res = $data['insert_user_id'];
    }
    return $out_res;
}

function get_username_from_id($in_id) {
    $out_res = 0;
    $tbl_user = Database::get_main_table(TABLE_MAIN_USER);
    $sql = "SELECT lastname, firstname FROM $tbl_user WHERE user_id=$in_id;";
    $res = Database::query($sql);
    if (Database::num_rows($res) &gt; 0) {
        $data = Database::fetch_array($res);
        $out_res = $data['lastname']." ".$data['firstname'];
    }
    return $out_res;
}

function remove_dir_prefix(&$in_out_item, $in_key, $in_course_code) {
    $pattern = api_get_path(SYS_PATH)."courses/".api_get_course_path($in_course_code).'/';
    if (is_dir($in_out_item)) {
        $pattern = $pattern.'work';
    }
    $in_out_item = preg_replace("|".$pattern."|", "", $in_out_item);
}

function url_existe_in_work_table($in_c_id, $in_url) {
    $out_result = false;
    $tbl_work = Database::get_course_table(TABLE_STUDENT_PUBLICATION);
    $sql = "SELECT * from $tbl_work WHERE c_id=$in_c_id AND url='$in_url';";
    $res = Database::query($sql);
    if (Database::num_rows($res) &gt; 0) {
        $out_result = true;
    }
    return $out_result;
}

// on a le path d'un fichier, on cherche si le nom de fichier est dans le champ url de la bdd
function just_filename_existe_in_bdd($in_c_id, $in_filename) {
    $out_res = false;
    $tbl_work = Database::get_course_table(TABLE_STUDENT_PUBLICATION);
    $sql = "SELECT * FROM $tbl_work WHERE c_id=$in_c_id AND url LIKE '%/$in_filename';";
    $res = Database::query($sql);
    if (Database::num_rows($res) &gt; 0) {
        $data = Database::fetch_array($res);
        $out_res = $data['id'];
    }
    return $out_res;
}

// return (trouve=boolean, erreur=texte)
function check_FS_for_course($in_c_id, $in_course_code, $in_work_folder, $in_corriger, $in_admin_id, $in_maintenant, $in_course_folder, $in_remove13first_char) {
    $tbl_work = Database::get_course_table(TABLE_STUDENT_PUBLICATION);
    $out_texte = "";
    $out_sql = "";
    $out_trouve = false;
    $tab_all_file = array();
    // On regarde pour chaque element du filesystem
    $tab_all_file = list_folder($in_work_folder, $tab_all_file);
    array_walk(&$tab_all_file, 'remove_dir_prefix', $in_course_code);
    for ($i=0; $i &lt; count($tab_all_file); $i++) {
        if (!(is_folder_start_with_work($in_course_folder,$tab_all_file[$i])) && $tab_all_file[$i] != "work/index.html" && !preg_match("/_DELETED_/", $tab_all_file[$i]) && !url_existe_in_work_table($in_c_id, $tab_all_file[$i])) {
            $out_texte .= "&lt;div style='color:#525236'&gt;FS - [".$tab_all_file[$i]."] (FS1) existe dans FS mais pas dans la BDD.";
            // FILE
            if (is_file($in_course_folder.$tab_all_file[$i])) {
                $out_texte .= " = FILE - ";
                $filedate = date("Y-m-d" ,filemtime($in_course_folder.$tab_all_file[$i]));
                // si le nom dans le FS du fichier (sans aucune indication de dossier) existe dans la BDD mais avec un mauvais chemin
                // on cherche l'id du dossier dans le FS lequel se trouve le fichier
                $out_trouve = true;
                if (preg_match("|work/(.+)/(.*)|", $tab_all_file[$i], $tab_match)) {
                    if ($folder_of_file_id = get_folder_id($in_c_id, $tab_match[1])) {
                        // on a dans le FS le dossier est $tab_match[1] et le fichier est $tab_match[2]
                        // si on trouve ce fichier quel part ailleur dans la BDD
                        if ($bdd_file_id = just_filename_existe_in_bdd($in_c_id, $tab_match[2])) {
                            // on renomme just le path comme il faut dans la BDD pour ce fichier
                            $sql = "UPDATE $tbl_work SET url='".$tab_all_file[$i]."' WHERE c_id=$in_c_id AND id=$bdd_file_id;";
                            $out_texte .= " Ce fichier existe dans la bdd mais avec un mauvais URL. (FS1.1) On met le bon URL. [ &lt;span onclick='$(this).siblings(\":first\").toggle()'&gt;SQL&lt;/span&gt; ]&lt;div class='sql'&gt;&lt;textarea cols='200' rows='1' class='sql_area' onclick='this.select()'&gt;$sql&lt;/textarea&gt;&lt;/div&gt;";
                            if ($in_corriger) {
                                $res = Database::query($sql) ;
                                $out_texte .= "&lt;div style='color:black'&gt;Ok, mis bon url dans la BDD&lt;/div&gt;";
                            }
                            $out_sql .= "$sql\n";
                        }
                        else {
                            $file_title = $tab_match[2];
                            if ($in_remove13first_char) {
                                $file_title = substr($file_title, 13);
                            }
                            $sql = "INSERT INTO $tbl_work (c_id, id, url, title, active, accepted, sent_date, filetype, has_properties, parent_id, user_id, contains_file) VALUES ($in_c_id, '', '".$tab_all_file[$i]."', '".$file_title."', 1, 0, '".$filedate."', 'file', 0, ".$folder_of_file_id.", ".$in_admin_id.", 1);\n\n";
                            $out_texte .= " Dossier contenant le fichier [".$tab_match[1]."] (FS2) trouvé dans la BDD et d'id $folder_of_file_id [ &lt;span onclick='$(this).siblings(\":first\").toggle()'&gt;SQL&lt;/span&gt; ]&lt;div class='sql'&gt;&lt;textarea cols='200' rows='1' class='sql_area' onclick='this.select()'&gt;$sql&lt;/textarea&gt;&lt;/div&gt;";
                            $out_sql .= "$sql\n";
                            if ($in_corriger) {
                                $res = Database::query($sql);
                                $out_texte .= "&lt;div style='color:black'&gt;Ok, doc ajouté dans la bdd, relancer l'outil pour finaliser&lt;/div&gt;";
                            }
                        }
                    }
                    else {
                        if (get_folder_id($in_c_id, "work/".$tab_match[1], false)) {
                            $out_texte .= " &lt;span style='color:green'&gt; Le dossier work/".$tab_match[1]." trouvé dans la bdd&lt;/span&gt;.";
                        }
                        else {
                            $sql = "INSERT INTO $tbl_work (c_id, id, url, title, active, accepted, sent_date, filetype, has_properties, parent_id, user_id, contains_file) VALUES ($in_c_id, '', '/".$tab_match[1]."', '', 1, 1, '".$filedate."', 'folder', 0, 0, ".$in_admin_id.", 0);\n\n";
                            $out_texte .= "&lt;span style='color:red'&gt;Dossier [".$tab_match[1]."] introuvable dans la BDD; Normalement le dossier devrait être créé pas l'outil ci dessus. [ &lt;span onclick='$(this).siblings(\":first\").toggle()'&gt;SQL&lt;/span&gt; ]&lt;div class='sql'&gt;&lt;textarea cols='200' rows='1' class='sql_area' onclick='this.select()'&gt;$sql&lt;/textarea&gt;&lt;/div&gt;&lt;/span&gt;";
                        }
                    }
                }
                else { 
                    $out_texte .= " &lt;span style='color:red'&gt;Déplacez le document dans un dossier dans le FS et relancez l'outil.&lt;/span&gt;.";
                }
            }
            // FOLDER
            // les dossiers commencent avec le /
            else {
                $out_trouve = true;
                $out_texte .= " = FOLDER - ";
                $folder_name = preg_replace("|^/|", "", $tab_all_file[$i]);
                $folderdate = date("Y-m-d" ,filemtime($in_course_folder.$tab_all_file[$i]));
                if (preg_match("|/|", $folder_name)) {
                    $out_texte .= " &lt;span style='color:red'&gt;Dossier est dans un sous-dossier. Déplacez le et relancez l'outil.&lt;/span&gt;";
                }
                else {
                    if (!get_folder_id($in_c_id, "work/".$folder_name, false)) {
                        $sql = "INSERT INTO $tbl_work (c_id, id, url, title, active, accepted, sent_date, filetype, has_properties, parent_id, user_id, contains_file) VALUES ($in_c_id, '', '".$tab_all_file[$i]."', '".$folder_name."', 1, 1, '".$folderdate."', 'folder', 0, 0, ".$in_admin_id.", 0);\n\n";
                        $out_texte .= " (FS3) Création du dossier dans la BDD puis relancez l'outil. [ &lt;span onclick='$(this).siblings(\":first\").toggle()'&gt;SQL&lt;/span&gt; ]&lt;div class='sql'&gt;&lt;textarea cols='200' rows='1' class='sql_area' onclick='this.select()'&gt;$sql&lt;/textarea&gt;&lt;/div&gt;";
                        $out_sql .= "$sql\n";
                        if ($in_corriger) {
                            $res = Database::query($sql);
                            $out_texte .= "&lt;div style='color:black'&gt;Ok, folder ajouté&lt;/div&gt;";
                        }
                    }
                    else {
                        // on le renomme dans le BDD 
                        $sql = "UPDATE $tbl_work SET url ='/$folder_name' WHERE c_id=$in_c_id AND url='work/$folder_name';";
                        $out_texte .= " &lt;span style='color:green'&gt; Mais trouvé dossier work/".$folder_name." dans la bdd&lt;/span&gt;[ &lt;span onclick='$(this).siblings(\":first\").toggle()'&gt;SQL&lt;/span&gt; ]&lt;div class='sql'&gt;&lt;textarea cols='200' rows='1' class='sql_area' onclick='this.select()'&gt;$sql&lt;/textarea&gt;&lt;/div&gt;";
                        if ($in_corriger) {
                            $res = Database::query($sql);
                            $out_texte .= "&lt;div style='color:black'&gt;Ok, renom folder&lt;/div&gt;";
                        }
                        $out_sql .= "$sql\n";
                    }
                }
            }
            $out_texte .= "&lt;/div&gt;";
        }
    }
    if ($out_trouve) {
        // pour ajouter les fichiers dans un dossier dont on connait le parent_id
        $out_texte .= "&lt;div id='php2jstxt' style='display:none'&gt;1. déplacer les fichiers dans le dossier de votre choix existant dans la BDD et le FS&lt;br/&gt;2. relancez l'outil une fois que les fichiers sont dans le bon dossier&lt;br/&gt;3. Entrez l'Id dans la table c_student_publication du dossier où sont les fichiers&lt;/div&gt;";
        $out_texte = "&lt;h3&gt;Vérification FS&lt;/h3&gt;".$out_texte;
    }
    return array($out_trouve, $out_texte, $out_sql);
}

function is_folder_start_with_work($in_course_folder,$in_folder) {
    return (is_dir($in_course_folder.$in_folder) && preg_match("/^work\//", $in_folder));
}

function get_folder_id($in_c_id, $in_folder, $in_add_slash_prefix = true) {
    if ($in_add_slash_prefix) {
        $in_folder = "/$in_folder";
    }
    $out_result = 0;
    $tbl_work = Database::get_course_table(TABLE_STUDENT_PUBLICATION);
    $sql = "SELECT id From $tbl_work WHERE c_id=$in_c_id AND url='$in_folder';";
    $res = Database::query($sql);
    if (Database::num_rows($res) &gt; 0) {
        $data = Database::fetch_array($res);
        $out_result = $data['id'];
    }
    return $out_result;
}

function get_folder_info_in_table($in_c_id, $in_folder) {
    $out_res = "";
    $tbl_item_property = Database::get_course_table(TABLE_ITEM_PROPERTY);
    $tbl_pub_assign = Database::get_course_table(TABLE_STUDENT_PUBLICATION_ASSIGNMENT);
    $tbl_work = Database::get_course_table(TABLE_STUDENT_PUBLICATION);
    $sql = "SELECT * FROM $tbl_work WHERE c_id=$in_c_id AND url='/$in_folder';";
    $res = Database::query($sql);
    if (Database::num_rows($res) &gt; 0) {
        $data = Database::fetch_array($res);
        $bdd_folder_id = $data['id'];
        $sql2 = "SELECT * FROM $tbl_pub_assign WHERE c_id=$in_c_id AND publication_id=$bdd_folder_id;";
        $res2 = Database::query($sql2);
        $data2 = Database::fetch_array($res2);
        $sql3 = "SELECT * FROM $tbl_item_property WHERE c_id=$in_c_id AND ref=$bdd_folder_id AND tool='work';";
        $res3 = Database::query($sql3);
        $data3 = Database::fetch_array($res3);
        $out_res .= "&lt;div style='background-color:#F8F8F8; font-size:80%; font-family:\"Courier new\"'&gt;Folder [$in_folder] properties : &lt;br/&gt;";
        $out_res .= "Student_publication : title=[".$data['title']."] active=[".$data['active']."] accepted=[".$data['accepted']."] filetype=[".$data['filetype']."] has_properties=[".$data['has_properties']."] parent_id=[".$data['parent_id']."] user_id=[".$data['user_id']."] contains_file=[".$data['contains_file=']."]&lt;br/&gt;";
        $out_res .= "Student_publication_assignement : id=[".$data2['id']."]&lt;br/&gt;";
        $out_res .= "Item-property : id=[".$data3['id']."] lastedit_type=[".$data3['lastedit_type']."]&lt;/div&gt;";
    }
    return $out_res;
}

function existe_user_id($in_id) {
    $out_result = false;
    $tbl_user = Database::get_main_table(TABLE_MAIN_USER);
    $sql = "SELECT * FROM user WHERE user_id=$in_id;";
    $res = Database::query($sql);
    if (Database::num_rows($res) &gt; 0) {
        $out_result = true;
    }
    return $out_result;
}

function get_lastedit_type_from_item_property($in_c_id, $in_id) {
    $tbl_item_property = Database::get_course_table(TABLE_ITEM_PROPERTY);
    $out_result = "";
    $sql = "SELECT lastedit_type FROM $tbl_item_property WHERE c_id=$in_c_id AND ref=$in_id AND tool='work';";
    $res = Database::query($sql);
    if (Database::num_rows($res) &gt; 0) {
        $data = Database::fetch_array($res);
        $out_result = $data['lastedit_type'];
    }
    return $out_result;
}

function exist_in_student_publication_table($in_c_id, $in_folder_url) {
    $out_result = 0;
    $tbl_work = Database::get_course_table(TABLE_STUDENT_PUBLICATION);
    $sql = "SELECT id FROM $tbl_work WHERE c_id=$in_c_id AND filetype='folder' AND url='/$in_folder_url'";
    $res = Database::query($sql);
    if (Database::num_rows($res) &gt; 0) {
        $data = Database::fetch_array($res);
        $out_result = $data['id'];
    }
    return $out_result;
}

function get_student_pub_id($in_c_id, $in_id) {
    $tbl_pub_assign = Database::get_course_table(TABLE_STUDENT_PUBLICATION_ASSIGNMENT);
    $sql = "SELECT * FROM $tbl_pub_assign WHERE c_id=$in_c_id AND publication_id=$in_id";
    $res = Database::query($sql);
    $data = Database::fetch_array($res);
    return $data['id'];
}

function existe_in_SPA_table($in_c_id, $in_bdd_id, $in_has_properties="") {
    $out_result = false;
    $tbl_pub_assign = Database::get_course_table(TABLE_STUDENT_PUBLICATION_ASSIGNMENT);
    if ($in_has_properties == "") {
        $sql = "SELECT * FROM $tbl_pub_assign WHERE c_id=$in_c_id AND publication_id=$in_bdd_id";
    }
    else {
        $sql = "SELECT * FROM $tbl_pub_assign WHERE c_id=$in_c_id AND publication_id=$in_bdd_id AND id=$in_has_properties";
    }
    $res = Database::query($sql);
    if (Database::num_rows($res) &gt; 0) {
        $out_result = true;
    }
    return $out_result;
}

function get_id_premier_admin() {
    $out_result = 1;
    $tbl_adm = Database::get_main_table(TABLE_MAIN_ADMIN);
    $sql = "SELECT min(user_id) AS nb FROM $tbl_adm";
    $res = Database::query($sql);
    if (Database::num_rows($res) &gt; 0) {
        $data = Database::fetch_array($res);
        $out_result = $data['nb'];
    }
    return $out_result;
}

function existe_dans_publication_assignment($in_c_id, $in_id) {
    $out_result = 0;
    $tbl_pub_assign = Database::get_course_table(TABLE_STUDENT_PUBLICATION_ASSIGNMENT);
    $sql = "SELECT id FROM $tbl_pub_assign WHERE c_id=$in_c_id AND ref=$in_id";
    $res = Database::query($sql);
    if (Database::num_rows($res) &gt; 0) {
        $out_result = true;
    }
    return $out_result;    
}

function existe_dans_item_property($in_c_id, $in_id, $in_and="") {
    $out_result = false;
    $tbl_item_property = Database::get_course_table(TABLE_ITEM_PROPERTY);
    $sql = "SELECT * FROM $tbl_item_property WHERE c_id=$in_c_id AND tool='work' AND ref=$in_id $in_and";
    $res = Database::query($sql);
    if (Database::num_rows($res) &gt; 0) {
        $out_result = true;
    }
    return $out_result;
}

function list_folder($in_folder, $in_tab_result) {
    $out_tabres = array();
    if (is_array($in_tab_result)) {
        $out_tabres = $in_tab_result;
    }
    $dir = opendir($in_folder);
    while (false !== ($entry = readdir($dir))) {
        if (is_dir($in_folder.$entry) && $entry != "." && $entry != "..") {
            array_push($out_tabres, $in_folder.$entry);
            $out_tabres = array_merge($out_tabres, list_folder($in_folder."$entry/", $in_tab_result));
        }
        else {
            if ($entry != "." && $entry != "..") {
                array_push($out_tabres, $in_folder.$entry);
            }
        }
    }
    return $out_tabres;
}


Updated by Hubert Borderiou about 6 years ago · 14 revisions