}
// ////////////////////////////////////////////////////////////////////////////////////////////////////
// Supprimer des comptes
// ////////////////////////////////////////////////////////////////////////////////////////////////////
if ($action == 'supprimer') {
    // Récupérer le profil des utilisateurs indiqués, vérifier qu'ils sont déjà sortis et qu'on y a pas glissé l'id d'un administrateur
    $DB_TAB = DB_STRUCTURE_ADMINISTRATEUR::DB_lister_users_cibles(implode(',', $tab_user_id), 'user_id,user_nom,user_prenom,user_profil_sigle,user_sortie_date', '');
    $tab_user_id = array();
    $notification_contenu = '';
    $notification_intro = date('d-m-Y H:i:s') . ' ' . $_SESSION['USER_PRENOM'] . ' ' . $_SESSION['USER_NOM'];
    foreach ($DB_TAB as $DB_ROW) {
        if ($DB_ROW['user_sortie_date'] <= TODAY_MYSQL && $DB_ROW['user_profil_sigle'] != 'ADM') {
            DB_STRUCTURE_ADMINISTRATEUR::DB_supprimer_utilisateur($DB_ROW['user_id'], $DB_ROW['user_profil_sigle']);
            $tab_user_id[] = $DB_ROW['user_id'];
            // Log de l'action
            SACocheLog::ajouter('Suppression de l\'utilisateur ' . $DB_ROW['user_nom'] . ' ' . $DB_ROW['user_prenom'] . ' (' . $DB_ROW['user_profil_sigle'] . ' ' . $DB_ROW['user_id'] . ').');
            $notification_contenu .= $notification_intro . ' a supprimé l\'utilisateur ' . $DB_ROW['user_nom'] . ' ' . $DB_ROW['user_prenom'] . ' (' . $DB_ROW['user_profil_sigle'] . ' ' . $DB_ROW['user_id'] . ').' . "\r\n";
        }
    }
    // Notifications (rendues visibles ultérieurement)
    if ($notification_contenu) {
        DB_STRUCTURE_NOTIFICATION::enregistrer_action_admin($notification_contenu, $_SESSION['USER_ID']);
    }
    // Retour
    $retour = count($tab_user_id) ? 'ok,' . implode(',', $tab_user_id) : 'Aucun compte coché n\'est supprimable ! Il faut d\'abord les retirer pour leur affecter une date de sortie...';
    exit($retour);
}
// ////////////////////////////////////////////////////////////////////////////////////////////////////
// On ne devrait pas en arriver là...
// ////////////////////////////////////////////////////////////////////////////////////////////////////
exit('Erreur avec les données transmises !');
            $nb_add++;
            $tab_i_classe_TO_id_base[$i] = (int) $classe_id;
        }
    }
}
// Supprimer des classes éventuelles
$nb_del = 0;
$notification_contenu = '';
if (count($tab_del)) {
    $notification_intro = date('d-m-Y H:i:s') . ' ' . $_SESSION['USER_PRENOM'] . ' ' . $_SESSION['USER_NOM'];
    foreach ($tab_del as $groupe_id) {
        if ($groupe_id) {
            DB_STRUCTURE_ADMINISTRATEUR::DB_supprimer_groupe_par_admin($groupe_id, 'classe', TRUE);
            $nb_del++;
            // Log de l'action
            SACocheLog::ajouter('Suppression d\'une classe (n°' . $groupe_id . ') lors d\'un import de fichier, et donc des devoirs associés.');
            $notification_contenu .= $notification_intro . ' a supprimé une classe (n°' . $groupe_id . ') lors d\'un import de fichier, et donc les devoirs associés.' . "\r\n";
        }
    }
}
// Notifications (rendues visibles ultérieurement)
if ($notification_contenu) {
    DB_STRUCTURE_NOTIFICATION::enregistrer_action_admin($notification_contenu, $_SESSION['USER_ID']);
}
// On enregistre (tableau mis à jour)
$tab_liens_id_base = array('classes' => $tab_i_classe_TO_id_base, 'groupes' => $tab_i_groupe_TO_id_base, 'users' => $tab_i_fichier_TO_id_base);
FileSystem::ecrire_fichier(CHEMIN_DOSSIER_IMPORT . 'import_' . $import_origine . '_' . $import_profil . '_' . $_SESSION['BASE'] . '_' . session_id() . '_liens_id_base.txt', serialize($tab_liens_id_base));
// Afficher le bilan
$lignes = '';
$DB_TAB = DB_STRUCTURE_ADMINISTRATEUR::DB_lister_classes_avec_niveaux();
if ($mode == 'complet') {
       DB::query(SACOCHE_STRUCTURE_BD_NAME, 'ALTER TABLE sacoche_matiere_famille CHANGE matiere_famille_nom matiere_famille_nom VARCHAR(55) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT "" ');
       DB::query(SACOCHE_STRUCTURE_BD_NAME, 'INSERT INTO sacoche_matiere_famille VALUES ( 46, 3, "Métiers d\'art (suite)") ');
       DB::query(SACOCHE_STRUCTURE_BD_NAME, 'INSERT INTO sacoche_matiere_famille VALUES ( 65, 3, "Disciplines professionnelles de l\'enseignement agricole") ');
       // réordonner la table sacoche_matiere_famille (ligne à déplacer vers la dernière MAJ lors d'ajouts dans sacoche_matiere_famille)
       DB::query(SACOCHE_STRUCTURE_BD_NAME, 'ALTER TABLE sacoche_matiere_famille ORDER BY matiere_famille_id');
   }
   // Intégration de nouvelles matières 2013 / 2014 / 2015.
   if (empty($reload_sacoche_matiere)) {
       // Problème de la matière 601, EIST ("Enseignement intégré de science et technologie"),
       // qui en juillet 2012 avait été créée en attendant (en vain) que la matière apparaisse officiellement,
       // et maintenant on a besoin de son id (alors on lui attribue l'id 600).
       $id_avant = 601;
       $id_apres = 600;
       DB::query(SACOCHE_STRUCTURE_BD_NAME, 'UPDATE sacoche_matiere SET matiere_id = ' . $id_apres . ' WHERE matiere_id = ' . $id_avant . ' ');
       DB_STRUCTURE_ADMINISTRATEUR::DB_deplacer_referentiel_matiere($id_avant, $id_apres);
       SACocheLog::ajouter('Déplacement des référentiels d\'une matière (' . $id_avant . ' to ' . $id_apres . ').');
       // nouvelles matières
       $insert = '
 (  75, 0, 0, 100, 0, 255, "ACIND", "Activités inter-disciplinaires"),
 (  76, 0, 0, 100, 0, 255, "ACTPR", "Activités de projet"),
 (  77, 0, 0, 100, 0, 255, "CERPR", "Certification professionnelle"),
 (  78, 0, 0, 100, 0, 255, "AAEPR", "Accès autonomie équipements professionnels"),
 (  79, 0, 0, 100, 0, 255, "APDPR", "Approche pluridisciplinaire & dimension professionnelle"),
 (  96, 0, 0, 100, 0, 255, "COMPR", "Connaissance des milieux professionnels"),
 (  97, 0, 0, 100, 0, 255, "PROPR", "Projet professionnel"),
 ( 203, 0, 0,   2, 0, 255, "LCALA", "Langues et cultures de l\'antiquité latine"),
 ( 204, 0, 0,   2, 0, 255, "LCAGR", "Langues et cultures de l\'antiquité grecque"),
 ( 436, 0, 0,   4, 0, 255, "HGGMC", "Histoire, géographie & géopolitique du monde contemporain"),
 ( 437, 0, 0,   4, 0, 255, "HI-GE", "Histoire-géographie"),
 ( 438, 0, 1,   4, 0, 255, "EMC"  , "Enseignement moral et civique"),
 ( 523, 0, 0,   5, 0, 255, "ESHMC", "Économie, sociologie & histoire du monde contemporain"),
 SACocheLog::ajouter('Suppression de tous les groupes, hors classes, sans les devoirs associés.');
 // Supprimer les jointures classes/périodes, et donc les états des bilans officiels
 DB_STRUCTURE_ADMINISTRATEUR::DB_modifier_liaison_groupe_periode( TRUE /*groupe_id*/ , TRUE /*periode_id*/ , FALSE /*etat*/ , '' /*date_debut_mysql*/ ,'' /*date_fin_mysql*/ );
 // Supprimer les saisies & les archives des bilans officiels
 DB_STRUCTURE_ADMINISTRATEUR::DB_supprimer_bilans_officiels();
 // Supprimer les saisies brevet & les archives (Notanet & fiches brevet)
 DB_STRUCTURE_ADMINISTRATEUR::DB_supprimer_bilans_brevet();
 // Supprimer les comptes utilisateurs désactivés depuis plus de 3 ans
 $DB_TAB = DB_STRUCTURE_ADMINISTRATEUR::DB_lister_users_desactives_obsoletes();
 if(!empty($DB_TAB))
 {
   foreach($DB_TAB as $DB_ROW)
   {
     DB_STRUCTURE_ADMINISTRATEUR::DB_supprimer_utilisateur($DB_ROW['user_id'],$DB_ROW['user_profil_sigle']);
     // Log de l'action
     SACocheLog::ajouter('Suppression d\'un utilisateur au compte désactivé depuis plus de 3 ans ('.$DB_ROW['user_profil_sigle'].' '.$DB_ROW['user_id'].').');
   }
 }
 // Retirer, dans les liaisons entre comptes, ceux qui sont désactivés ou supprimés
 DB_STRUCTURE_SWITCH::DB_supprimer_liaisons_obsoletes();
 // Retirer, dans les sélections d'items, les items supprimés
 DB_STRUCTURE_SELECTION_ITEM::DB_supprimer_jointures_items_obsoletes();
 // Retirer les sélections d'items sans item
 DB_STRUCTURE_SELECTION_ITEM::DB_supprimer_selections_items_obsoletes();
 // Supprimer les demandes d'évaluations, ainsi que les reliquats de notes 'REQ'
 DB_STRUCTURE_ADMINISTRATEUR::DB_supprimer_demandes_evaluation();
 DB_STRUCTURE_ADMINISTRATEUR::DB_supprimer_saisies_REQ();
 // En profiter pour optimiser les tables (une fois par an, ça ne peut pas faire de mal)
 DB_STRUCTURE_ADMINISTRATEUR::DB_optimiser_tables_structure();
 // Débloquer l'application
 LockAcces::debloquer_application('automate',$_SESSION['BASE']);
Пример #5
0
 /**
  * Supprimer une structure (mode multi-structures)
  *
  * @param int    $BASE 
  * @return void
  */
 public static function supprimer_multi_structure($BASE)
 {
     // Paramètres de connexion à la base de données
     $BD_name = 'sac_base_' . $BASE;
     $BD_user = '******' . $BASE;
     // Limité à 16 caractères
     // Supprimer la base de données d'une structure, et son utilisateur MySQL une fois défait de ses droits.
     DB_WEBMESTRE_WEBMESTRE::DB_supprimer_base_structure_et_user_mysql($BD_name, $BD_user);
     // Supprimer le fichier de connexion
     FileSystem::supprimer_fichier(CHEMIN_DOSSIER_MYSQL . 'serveur_sacoche_structure_' . $BASE . '.php');
     // Retirer l'enregistrement d'une structure dans la base du webmestre
     DB_WEBMESTRE_WEBMESTRE::DB_supprimer_structure($BASE);
     // Supprimer les dossiers de fichiers temporaires par établissement
     foreach (FileSystem::$tab_dossier_tmp_structure as $dossier) {
         FileSystem::supprimer_dossier($dossier . $BASE);
     }
     // Supprimer les éventuels fichiers de blocage
     LockAcces::supprimer_fichiers_blocage($BASE);
     // Log de l'action
     SACocheLog::ajouter('Suppression de la structure n°' . $BASE . '.');
 }
  echo'<td>{{NIVEAU_NOM}}</td>';
  echo'<td>'.html($ref).'</td>';
  echo'<td>'.html($nom).'</td>';
  echo'<td class="nu">';
  echo  '<q class="modifier" title="Modifier cette classe."></q>';
  echo  '<q class="supprimer" title="Supprimer cette classe."></q>';
  echo'</td>';
}

// ////////////////////////////////////////////////////////////////////////////////////////////////////
// Supprimer une classe existante
// ////////////////////////////////////////////////////////////////////////////////////////////////////
else if( ($action=='supprimer') && $id && $nom )
{
  // Effacer l'enregistrement
  DB_STRUCTURE_ADMINISTRATEUR::DB_supprimer_groupe_par_admin( $id , 'classe' , TRUE /*with_devoir*/ );
  // Log de l'action
  SACocheLog::ajouter('Suppression de la classe "'.$nom.'" (n°'.$id.'), et donc des devoirs associés.');
  // Notifications (rendues visibles ultérieurement)
  $notification_contenu = date('d-m-Y H:i:s').' '.$_SESSION['USER_PRENOM'].' '.$_SESSION['USER_NOM'].' a supprimé la classe "'.$nom.'" (n°'.$id.'), et donc les devoirs associés.'."\r\n";
  DB_STRUCTURE_NOTIFICATION::enregistrer_action_admin( $notification_contenu , $_SESSION['USER_ID'] );
  // Afficher le retour
  echo'<td>ok</td>';
}

else
{
  echo'Erreur avec les données transmises !';
}
?>
// Supprimer un référentiel
// ////////////////////////////////////////////////////////////////////////////////////////////////////
if ($action == 'supprimer' && $matiere_id && $niveau_id && $partage && $matiere_nom && $niveau_nom) {
    // S'il était partagé, il faut le retirer du serveur communautaire
    if ($partage == 'oui') {
        if (!$_SESSION['SESAMATH_ID'] || !$_SESSION['SESAMATH_KEY']) {
            exit('Pour échanger avec le serveur communautaire, un administrateur doit identifier l\'établissement dans la base Sésamath.');
        }
        $reponse = ServeurCommunautaire::envoyer_arborescence_XML($_SESSION['SESAMATH_ID'], $_SESSION['SESAMATH_KEY'], $matiere_id, $niveau_id, '', $information);
        if ($reponse != 'ok') {
            exit($reponse);
        }
    }
    DB_STRUCTURE_REFERENTIEL::DB_supprimer_referentiel_matiere_niveau($matiere_id, $niveau_id);
    // Log de l'action
    SACocheLog::ajouter('Suppression du référentiel [' . $matiere_nom . '] [' . $niveau_nom . '].');
    // Notifications (rendues visibles ultérieurement)
    $notification_contenu = date('d-m-Y H:i:s') . ' ' . $_SESSION['USER_PRENOM'] . ' ' . $_SESSION['USER_NOM'] . ' a supprimé le référentiel [' . $matiere_nom . '] [' . $niveau_nom . '].' . "\r\n";
    notifications_referentiel_edition($matiere_id, $notification_contenu);
    DB_STRUCTURE_NOTIFICATION::enregistrer_action_sensible($notification_contenu);
    // Retour
    exit('ok');
}
// ////////////////////////////////////////////////////////////////////////////////////////////////////
// Modifier le mode de calcul d'un référentiel
// ////////////////////////////////////////////////////////////////////////////////////////////////////
if ($action == 'calculer' && $matiere_id && $niveau_id && $matiere_nom && $niveau_nom) {
    if (is_null($methode) || is_null($limite) || is_null($retroactif)) {
        exit('Erreur avec les données transmises !');
    }
    $is_modif = DB_STRUCTURE_REFERENTIEL::DB_modifier_referentiel($matiere_id, $niveau_id, array(':calcul_methode' => $methode, ':calcul_limite' => $limite, ':calcul_retroactif' => $retroactif));
    echo '<td>{{NIVEAU_NOM}}</td>';
    echo '<td>' . html($groupe_nom) . '</td>';
    echo '<td>' . $eleves_texte . '</td>';
    echo '<td>' . $profs_texte . '</td>';
    echo '<td class="nu">';
    echo '<q class="modifier" title="Modifier ce groupe de besoin."></q>';
    echo '<q class="supprimer" title="Supprimer ce groupe de besoin."></q>';
    echo '</td>';
    echo '<SCRIPT>';
    echo 'tab_eleves["' . $groupe_id . '"]="' . implode('_', $tab_eleves) . '";';
    echo 'tab_profs["' . $groupe_id . '"]="' . implode('_', $tab_profs) . '";';
    exit;
}
// ////////////////////////////////////////////////////////////////////////////////////////////////////
// Supprimer un groupe de besoin existant
// ////////////////////////////////////////////////////////////////////////////////////////////////////
if ($action == 'supprimer' && $groupe_id && $groupe_nom) {
    // Effacer l'enregistrement
    DB_STRUCTURE_PROFESSEUR::DB_supprimer_groupe_par_prof($groupe_id, 'besoin', TRUE);
    // Log de l'action
    SACocheLog::ajouter('Suppression du regroupement "' . $groupe_nom . '" (besoin n°' . $groupe_id . '), et donc des devoirs associés.');
    // Notifications (rendues visibles ultérieurement)
    $notification_contenu = date('d-m-Y H:i:s') . ' ' . $_SESSION['USER_PRENOM'] . ' ' . $_SESSION['USER_NOM'] . ' a supprimé son regroupement "' . $groupe_nom . '" (besoin n°' . $groupe_id . '), et donc les devoirs associés.' . "\r\n";
    DB_STRUCTURE_NOTIFICATION::enregistrer_action_sensible($notification_contenu);
    // Afficher le retour
    exit('<td>ok</td>');
}
// ////////////////////////////////////////////////////////////////////////////////////////////////////
// On ne devrait pas en arriver là !
// ////////////////////////////////////////////////////////////////////////////////////////////////////
exit('Erreur avec les données transmises !');
    echo '<td>' . html($prenom) . '</td>';
    echo '<td>' . html($login) . '</td>';
    echo $box_password ? '<td class="i">champ crypté</td>' : '<td class="new">' . $password . ' <img alt="" src="./_img/bulle_aide.png" width="16" height="16" title="Pensez à noter le mot de passe !" /></td>';
    echo '<td>' . html($courriel) . '</td>';
    echo '<td class="nu">';
    echo '<q class="modifier" title="Modifier ce administrateur."></q>';
    echo $id != $_SESSION['USER_ID'] ? '<q class="supprimer" title="Retirer cet administrateur."></q>' : '<q class="supprimer_non" title="Un administrateur ne peut pas supprimer son propre compte."></q>';
    echo '</td>';
    exit;
}
// ////////////////////////////////////////////////////////////////////////////////////////////////////
// Retirer un administrateur existant
// ////////////////////////////////////////////////////////////////////////////////////////////////////
if ($action == 'supprimer' && $id && $nom && $prenom) {
    if ($id == $_SESSION['USER_ID']) {
        exit('Erreur : un administrateur ne peut pas supprimer son propre compte !');
    }
    // Supprimer l'enregistrement
    DB_STRUCTURE_ADMINISTRATEUR::DB_supprimer_utilisateur($id, $profil);
    // Log de l'action
    SACocheLog::ajouter('Suppression de l\'utilisateur ' . $nom . ' ' . $prenom . ' (' . $profil . ' ' . $id . ').');
    // Notifications (rendues visibles ultérieurement)
    $notification_contenu = date('d-m-Y H:i:s') . ' ' . $_SESSION['USER_PRENOM'] . ' ' . $_SESSION['USER_NOM'] . ' a supprimé l\'utilisateur ' . $nom . ' ' . $prenom . ' (' . $profil . ' ' . $id . ').' . "\r\n";
    DB_STRUCTURE_NOTIFICATION::enregistrer_action_admin($notification_contenu, $_SESSION['USER_ID']);
    // Afficher le retour
    exit('<td>ok</td>');
}
// ////////////////////////////////////////////////////////////////////////////////////////////////////
// On ne devrait pas en arriver là !
// ////////////////////////////////////////////////////////////////////////////////////////////////////
exit('Erreur avec les données transmises !');
        {
          $tab_convert[$id1] = $id2 ;
        }
      }
    }
    // On lance la conversion
    if(!empty($tab_convert))
    {
      foreach($tab_convert as $id_avant => $id_apres)
      {
        DB::query(SACOCHE_STRUCTURE_BD_NAME , 'UPDATE sacoche_matiere SET matiere_active=1 WHERE matiere_id='.$id_apres );
        DB_STRUCTURE_ADMINISTRATEUR::DB_deplacer_referentiel_matiere($id_avant,$id_apres);
        SACocheLog::ajouter('Déplacement des référentiels d\'une matière ('.$id_avant.' to '.$id_apres.').');
        DB_STRUCTURE_ADMINISTRATEUR::DB_supprimer_matiere_specifique($id_avant);
        SACocheLog::ajouter('Suppression d\'une matière spécifique (n°'.$id_avant.').');
        SACocheLog::ajouter('Suppression des référentiels associés (matière '.$id_avant.').');
      }
    }
  }
}

// ////////////////////////////////////////////////////////////////////////////////////////////////////
// MAJ 2014-11-29 => 2014-12-12
// ////////////////////////////////////////////////////////////////////////////////////////////////////

if($version_base_structure_actuelle=='2014-11-29')
{
  if($version_base_structure_actuelle==DB_STRUCTURE_MAJ_BASE::DB_version_base())
  {
    $version_base_structure_actuelle = '2014-12-12';
    DB::query(SACOCHE_STRUCTURE_BD_NAME , 'UPDATE sacoche_parametre SET parametre_valeur="'.$version_base_structure_actuelle.'" WHERE parametre_nom="version_base"' );
Пример #11
0
  // Vérification des droits
  $proprio_id = DB_STRUCTURE_PROFESSEUR::DB_recuperer_devoir_prorietaire_id( $devoir_id );
  if($proprio_id!=$_SESSION['USER_ID'])
  {
    exit('Erreur : vous n\'êtes pas propriétaire du devoir n°'.$devoir_id.' !');
  }
  // On y va
  if($type=='selection')
  {
    // supprimer le groupe spécialement associé (invisible à l'utilisateur) et les entrées dans sacoche_jointure_user_groupe pour une évaluation avec des élèves piochés en dehors de tout groupe prédéfini
    DB_STRUCTURE_PROFESSEUR::DB_supprimer_groupe_par_prof( $groupe_id , $groupe_type , FALSE /*with_devoir*/ );
    SACocheLog::ajouter('Suppression d\'un regroupement ('.$groupe_type.' '.$groupe_id.'), sans les devoirs associés.');
  }
  // on supprime l'évaluation avec ses saisies
  DB_STRUCTURE_PROFESSEUR::DB_supprimer_devoir_et_saisies( $devoir_id );
  SACocheLog::ajouter('Suppression du devoir "'.$description.'" (n°'.$devoir_id.'), et donc aussi des saisies associées.');
  // Notifications (rendues visibles ultérieurement)
  $notification_contenu = date('d-m-Y H:i:s').' '.$_SESSION['USER_PRENOM'].' '.$_SESSION['USER_NOM'].' a supprimé son devoir "'.$description.'" (n°'.$devoir_id.'), et donc aussi les saisies associées.'."\r\n";
  DB_STRUCTURE_NOTIFICATION::enregistrer_action_sensible($notification_contenu);
  DB_STRUCTURE_NOTIFICATION::DB_supprimer_log_attente( $abonnement_ref_edition , $devoir_id );
  // Afficher le retour
  exit('<td>ok</td>');
}

// ////////////////////////////////////////////////////////////////////////////////////////////////////
// Afficher le formulaire pour réordonner les items d'une évaluation
// La vérification de droits suffisants s'effectuera lors de la soumission.
// ////////////////////////////////////////////////////////////////////////////////////////////////////

if( ($action=='ordonner') && $devoir_id )
{
Пример #12
0
  // Afficher le retour
  echo'<td>'.$id.'</td>';
  echo'<td>'.$ordre.'</td>';
  echo'<td>'.html($nom).'</td>';
  echo'<td class="nu">';
  echo  '<q class="modifier" title="Modifier cette zone."></q>';
  echo  '<q class="dupliquer" title="Dupliquer cette zone."></q>';
  // La zone d'id 1 ne peut être supprimée, c'est la zone par défaut.
  echo ($id!=1) ? '<q class="supprimer" title="Supprimer cette zone."></q>' : '<q class="supprimer_non" title="La zone par défaut ne peut pas être supprimée."></q>' ;
  echo'</td>';
}

// ////////////////////////////////////////////////////////////////////////////////////////////////////
// Supprimer une zone existante
// ////////////////////////////////////////////////////////////////////////////////////////////////////
else if( ($action=='supprimer') && ($id>1) && $nom )
{
  // Effacer l'enregistrement
  DB_WEBMESTRE_WEBMESTRE::DB_supprimer_zone($id);
  // Log de l'action
  SACocheLog::ajouter('Suppression de la zone géographique "'.$nom.'" (n°'.$id.').');
  // Afficher le retour
  echo'<td>ok</td>';
}

else
{
  echo'Erreur avec les données transmises !';
}
?>
    if ($action == 'modifier' && $id && $ordre && $nom) {
        // Vérifier que le nom de la période est disponible
        if (DB_STRUCTURE_ADMINISTRATEUR::DB_tester_periode_nom($nom, $id)) {
            exit('Erreur : nom de période déjà existant !');
        }
        // Mettre à jour l'enregistrement
        DB_STRUCTURE_ADMINISTRATEUR::DB_modifier_periode($id, $ordre, $nom);
        // Afficher le retour
        echo '<td>' . $ordre . '</td>';
        echo '<td>' . html($nom) . '</td>';
        echo '<td class="nu">';
        echo '<q class="modifier" title="Modifier cette période."></q>';
        echo '<q class="dupliquer" title="Dupliquer cette période."></q>';
        echo '<q class="supprimer" title="Supprimer cette période."></q>';
        echo '</td>';
    } else {
        if ($action == 'supprimer' && $id && $nom) {
            // Effacer l'enregistrement
            DB_STRUCTURE_ADMINISTRATEUR::DB_supprimer_periode($id);
            // Log de l'action
            SACocheLog::ajouter('Suppression de la période "' . $nom . '" (n°' . $id . '), et donc des bilans officiels associés.');
            // Notifications (rendues visibles ultérieurement)
            $notification_contenu = date('d-m-Y H:i:s') . ' ' . $_SESSION['USER_PRENOM'] . ' ' . $_SESSION['USER_NOM'] . ' a supprimé la période "' . $nom . '" (n°' . $id . '), et donc les bilans officiels associés.' . "\r\n";
            DB_STRUCTURE_NOTIFICATION::enregistrer_action_admin($notification_contenu, $_SESSION['USER_ID']);
            // Afficher le retour
            echo '<td>ok</td>';
        } else {
            echo 'Erreur avec les données transmises !';
        }
    }
}
Пример #14
0
/**
 * Mettre à jour automatiquement la base si besoin ; à effectuer avant toute récupération des données sinon ça peut poser pb...
 * 
 * @param int   $BASE
 * @return void
 */
function maj_base_structure_si_besoin($BASE)
{
  $version_base_structure = DB_STRUCTURE_PUBLIC::DB_version_base();
  if($version_base_structure != VERSION_BASE_STRUCTURE)
  {
    // On ne met pas à jour la base tant que le webmestre bloque l'accès à l'application, car sinon cela pourrait se produire avant le transfert de tous les fichiers.
    if(LockAcces::tester_blocage('webmestre',0)===NULL)
    {
      // Bloquer l'application
      LockAcces::bloquer_application('automate',$BASE,'Mise à jour de la base en cours.');
      // Lancer une mise à jour de la base
      DB_STRUCTURE_MAJ_BASE::DB_maj_base($version_base_structure);
      // Log de l'action
      SACocheLog::ajouter('Mise à jour automatique de la base '.SACOCHE_STRUCTURE_BD_NAME.'.');
      // Débloquer l'application
      LockAcces::debloquer_application('automate',$BASE);
    }
  }
}
Пример #15
0
 /**
  * Débloquer l'accès à SACoche.
  * 
  * @param string $profil_demandeur (webmestre|administrateur|automate)
  * @param int    $base_id   (0 si demande mono-structure ou du webmestre multi-structures de débloquer tous les établissements)
  * @return void
  */
 public static function debloquer_application($profil_demandeur, $base_id)
 {
     FileSystem::supprimer_fichier(LockAcces::chemin_fichier_blocage($profil_demandeur, $base_id), TRUE);
     // Log de l'action
     SACocheLog::ajouter('Déblocage de l\'accès à l\'application.');
 }
    exit(']¤[' . $id);
}
// ////////////////////////////////////////////////////////////////////////////////////////////////////
// Déplacer les référentiels d'une matière vers une autre
// ////////////////////////////////////////////////////////////////////////////////////////////////////
if ($action == 'deplacer_referentiels' && $id_avant && $id_apres && $id_avant != $id_apres && $nom_avant && $nom_apres) {
    // Déplacement après vérification que c'est possible (matière de destination vierge de données)
    //
    $is_ok = DB_STRUCTURE_ADMINISTRATEUR::DB_deplacer_referentiel_matiere($id_avant, $id_apres);
    if (!$is_ok) {
        exit('Erreur : la nouvelle matière contient déjà des données !');
    }
    // Retirer l'ancienne matière partagée || Supprimer l'ancienne matière spécifique existante
    if ($id_avant > ID_MATIERE_PARTAGEE_MAX) {
        DB_STRUCTURE_ADMINISTRATEUR::DB_supprimer_matiere_specifique($id_avant);
        $log_fin = 'avec suppression de la matière spécifique "' . $nom_avant . '"';
    } else {
        DB_STRUCTURE_ADMINISTRATEUR::DB_modifier_matiere_partagee($id_avant, 0);
        $log_fin = 'avec retrait de la matière partagée "' . $nom_avant . '"';
    }
    // Log de l'action
    SACocheLog::ajouter('Déplacement des référentiels de "' . $nom_avant . '" (' . $id_avant . ') vers "' . $nom_apres . '" (' . $id_apres . '), ' . $log_fin . '.');
    // Notifications (rendues visibles ultérieurement)
    $notification_contenu = date('d-m-Y H:i:s') . ' ' . $_SESSION['USER_PRENOM'] . ' ' . $_SESSION['USER_NOM'] . ' a déplacé des référentiels de "' . $nom_avant . '" (' . $id_avant . ') vers "' . $nom_apres . '" (' . $id_apres . '), ' . $log_fin . '.' . "\r\n";
    DB_STRUCTURE_NOTIFICATION::enregistrer_action_admin($notification_contenu, $_SESSION['USER_ID']);
    exit('ok');
}
// ////////////////////////////////////////////////////////////////////////////////////////////////////
// On ne devrait pas en arriver là...
// ////////////////////////////////////////////////////////////////////////////////////////////////////
exit('Erreur avec les données transmises !');
  SACocheLog::ajouter('Retrait du niveau partagé "'.$nom.'" (n°'.$id.').');
  // Notifications (rendues visibles ultérieurement)
  $notification_contenu = date('d-m-Y H:i:s').' '.$_SESSION['USER_PRENOM'].' '.$_SESSION['USER_NOM'].' a retiré le niveau partagé "'.$nom.'" (n°'.$id.').'."\r\n";
  DB_STRUCTURE_NOTIFICATION::enregistrer_action_admin( $notification_contenu , $_SESSION['USER_ID'] );
  // Afficher le retour
  exit(']¤['.$id);
}

// ////////////////////////////////////////////////////////////////////////////////////////////////////
// Supprimer un niveau spécifique existant
// ////////////////////////////////////////////////////////////////////////////////////////////////////

if( ($action=='supprimer') && $id && $nom && ($id>ID_NIVEAU_PARTAGE_MAX) )
{
  DB_STRUCTURE_ADMINISTRATEUR::DB_supprimer_niveau_specifique($id);
  // Log de l'action
  SACocheLog::ajouter('Suppression du niveau spécifique "'.$nom.'" (n°'.$id.') et donc des référentiels associés.');
  // Notifications (rendues visibles ultérieurement)
  $notification_contenu = date('d-m-Y H:i:s').' '.$_SESSION['USER_PRENOM'].' '.$_SESSION['USER_NOM'].' a supprimé le niveau spécifique "'.$nom.'" (n°'.$id.') et donc les référentiels associés.'."\r\n";
  DB_STRUCTURE_NOTIFICATION::enregistrer_action_admin( $notification_contenu , $_SESSION['USER_ID'] );
  // Afficher le retour
  exit(']¤['.$id);
}

// ////////////////////////////////////////////////////////////////////////////////////////////////////
// On ne devrait pas en arriver là...
// ////////////////////////////////////////////////////////////////////////////////////////////////////

exit('Erreur avec les données transmises !');
?>
Пример #18
0
/**
 * restaurer_tables_base_etablissement
 * Restaurer des fichiers de svg et mettre la base à jour si besoin.
 * Pour une restauration individuelle, scindé en plusieurs étapes pour éviter un dépassement du max_execution_time sur de grosses bases.
 * Par contre pour une restauration par un webmestre d'un ensemble de structures, c'était trop compliqué à découper, on fait tout d'un coup.
 *
 * @param string $dossier_temp
 * @param int    $etape   (0 si tout d'un coup)
 * @return string
 */
function restaurer_tables_base_etablissement($dossier_temp, $etape)
{
    // Pour chaque fichier...
    $tab_fichier = FileSystem::lister_contenu_dossier($dossier_temp);
    natsort($tab_fichier);
    // Si plusieurs fichiers correspondent à une table, il faut que la requête de création soit lancée avant les requêtes d'insertion
    $tab_fichier = array_values($tab_fichier);
    // Pour réindexer dans l'ordre et à partir de 0
    $nb_fichiers = count($tab_fichier);
    if ($etape) {
        $nb_par_etape = 10;
        $i_min = ($etape - 1) * $nb_par_etape;
        $i_max = $etape * $nb_par_etape;
        $i_stop = min($i_max, $nb_fichiers);
    } else {
        $i_min = 0;
        $i_stop = $nb_fichiers;
    }
    for ($i = $i_min; $i < $i_stop; $i++) {
        $fichier_nom = $tab_fichier[$i];
        // ... lancer les requêtes
        $requetes = file_get_contents($dossier_temp . $fichier_nom);
        DB_STRUCTURE_COMMUN::DB_executer_requetes_MySQL($requetes);
        // Attention, sur certains LCS ça bloque au dela de 40 instructions MySQL (mais un INSERT multiple avec des milliers de lignes ne pose pas de pb).
        /*
        La classe PDO a un bug. Si on envoie plusieurs requêtes d'un coup ça passe, mais si on recommence juste après alors on récolte : "Cannot execute queries while other unbuffered queries are active.  Consider using PDOStatement::fetchAll().  Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute."
        La seule issue est de fermer la connexion après chaque requête multiple en utilisant exceptionnellement la méthode ajouté par SebR suite à mon signalement : DB::close(nom_de_la_connexion);
        */
        DB::close(SACOCHE_STRUCTURE_BD_NAME);
    }
    if ($i_stop < $nb_fichiers) {
        // Ce n'est pas la dernière étape
        return 'Restauration de la base en cours ; étape n°' . sprintf("%02u", $etape) . ' réalisée';
    } else {
        // Toutes les étapes sont terminées ; tester si la base nécessite une mise à jour, et si oui alors la lancer
        $version_base_restauree = version_base_fichier_svg($dossier_temp);
        if ($version_base_restauree < VERSION_BASE_STRUCTURE) {
            DB_STRUCTURE_MAJ_BASE::DB_maj_base($version_base_restauree);
            // Log de l'action
            SACocheLog::ajouter('Mise à jour automatique de la base ' . SACOCHE_STRUCTURE_BD_NAME . '.');
            return 'Restauration de la base terminée et base mise à jour';
        }
        return 'Restauration de la base terminée';
    }
}
Пример #19
0
 * 
 * Vous devriez avoir reçu une copie de la Licence Publique Générale GNU Affero avec SACoche ;
 * si ce n’est pas le cas, consultez : <http://www.gnu.org/licenses/>.
 * 
 */

if(!defined('SACoche')) {exit('Ce fichier ne peut être appelé directement !');}
$TITRE = html(Lang::_("Log des actions sensibles"));
?>

<p class="astuce">Les actions sensibles sont enregistrées, ce qui permet aux administrateurs de rechercher quel compte est fautif en cas de problème...</p>
<p class="astuce">Ces logs sont enregistrés dans un fichier (pas dans la base) ; ils sont donc propres à un serveur et ne sont pas transférés lors d'une sauvegarde / restauration de base.</p>
<p class="astuce">Concernant la suppression d'un référentiel, suivez ces liens pour savoir à quoi correspondent les identifiants <a target="_blank" href="http://redmine.sesamath.net/projects/sacoche/repository/entry/_sql/structure/sacoche_matiere.sql">de matières</a> et <a target="_blank" href="http://redmine.sesamath.net/projects/sacoche/repository/entry/_sql/structure/sacoche_niveau.sql">de niveaux</a>.</p>

<?php
$fichier_log_contenu = SACocheLog::lire();
if($fichier_log_contenu===NULL)
{
  echo'<p class="danger">Le fichier n\'existe pas : probablement qu\'aucune action sensible n\'a encore été effectuée !</p>'.NL;
}
else
{
  
  // 1 En extraire le plus récent (les 100 derniers enregistrements)
  $table_log_extrait = '<table class="p"><thead><tr><th>Date &amp; Heure</th><th>Utilisateur</th><th>Action</th></tr></thead><tbody>';
  $tab_lignes = extraire_lignes($fichier_log_contenu);
  $indice_ligne_debut = count($tab_lignes)-1 ;
  $indice_ligne_fin   = max(-1 , $indice_ligne_debut-100) ;
  $nb_lignes          = $indice_ligne_debut - $indice_ligne_fin ;
  $s = ($nb_lignes>1) ? 's' : '' ;
  for( $indice_ligne=$indice_ligne_debut ; $indice_ligne>$indice_ligne_fin ; $indice_ligne-- )
}
// ////////////////////////////////////////////////////////////////////////////////////////////////////
// Fusionner un item en l'absorbant par un 2nd item
// ////////////////////////////////////////////////////////////////////////////////////////////////////
if ($action == 'fus' && $element_id && $element2_id && $matiere_id && $matiere_nom && $nom && $nom2) {
    $test_delete = DB_STRUCTURE_REFERENTIEL::DB_supprimer_referentiel_item($element_id, FALSE);
    if (!$test_delete) {
        exit('Élément non trouvé !');
    }
    if (count($tab_id)) {
        DB_STRUCTURE_REFERENTIEL::DB_renumeroter_referentiel_liste_elements('item', $tab_id, '-1');
    }
    // Mettre à jour les références vers l'item absorbant
    DB_STRUCTURE_REFERENTIEL::DB_fusionner_referentiel_items($element_id, $element2_id);
    // Log de l'action
    SACocheLog::ajouter('Fusion d\'éléments de référentiel (item / ' . $element_id . ' / ' . $element2_id . ').');
    // Notifications (rendues visibles ultérieurement)
    $notification_contenu = date('d-m-Y H:i:s') . ' ' . $_SESSION['USER_PRENOM'] . ' ' . $_SESSION['USER_NOM'] . ' a fusionné dans le référentiel [' . $matiere_nom . '] :' . "\r\n" . $nom . ' -> ' . $nom2 . "\r\n";
    notifications_referentiel_edition($matiere_id, $notification_contenu);
    DB_STRUCTURE_NOTIFICATION::enregistrer_action_sensible($notification_contenu);
    // Retour
    exit('ok');
}
// ////////////////////////////////////////////////////////////////////////////////////////////////////
// Actions complémentaires
// ////////////////////////////////////////////////////////////////////////////////////////////////////
if ($action == 'action_complementaire') {
    // Récupération des données
    $action_groupe = isset($_POST['select_action_groupe']) ? Clean::texte($_POST['select_action_groupe']) : '';
    $granulosite = isset($_POST['select_action_groupe_modifier_objet']) ? Clean::texte($_POST['select_action_groupe_modifier_objet']) : '';
    $modifier_id = isset($_POST['select_action_groupe_modifier_id']) ? Clean::texte($_POST['select_action_groupe_modifier_id']) : '';
Пример #21
0
 /**
  * Renvoie le contenu d'un fichier de log si existant, et sinon NULL.
  * Nécessite que la session soit ouverte.
  * 
  * @return string|NULL
  */
 public static function lire()
 {
   return (is_file( SACocheLog::chemin_fichier_log($_SESSION['BASE']) )) ? file_get_contents(SACocheLog::chemin_fichier_log($_SESSION['BASE'])) : NULL ;
 }
    if ($date_debut_mysql > $date_fin_mysql) {
        exit('Erreur : la date de début est postérieure à la date de fin !');
    }
    foreach ($tab_select_periodes as $periode_id) {
        foreach ($tab_select_classes_groupes as $groupe_id) {
            DB_STRUCTURE_ADMINISTRATEUR::DB_modifier_liaison_groupe_periode($groupe_id, $periode_id, TRUE, $date_debut_mysql, $date_fin_mysql);
        }
    }
} elseif ($action == 'retirer') {
    $notification_contenu = '';
    $notification_intro = date('d-m-Y H:i:s') . ' ' . $_SESSION['USER_PRENOM'] . ' ' . $_SESSION['USER_NOM'];
    foreach ($tab_select_periodes as $periode_id) {
        foreach ($tab_select_classes_groupes as $groupe_id) {
            DB_STRUCTURE_ADMINISTRATEUR::DB_modifier_liaison_groupe_periode($groupe_id, $periode_id, FALSE);
            // Log de l'action
            SACocheLog::ajouter('Suppression de l\'association période "' . $tab_periode[$periode_id] . '" (n°' . $periode_id . ') / regroupement "' . $tab_groupe[$groupe_id] . '" (n°' . $groupe_id . '), et donc des bilans officiels associés.');
            $notification_contenu .= $notification_intro . ' a supprimé l\'association période "' . $tab_periode[$periode_id] . '" (n°' . $periode_id . ') / regroupement "' . $tab_groupe[$groupe_id] . '" (n°' . $groupe_id . '), et donc les bilans officiels associés.' . "\r\n";
        }
    }
    // Notifications (rendues visibles ultérieurement)
    if ($notification_contenu) {
        DB_STRUCTURE_NOTIFICATION::enregistrer_action_admin($notification_contenu, $_SESSION['USER_ID']);
    }
}
// ////////////////////////////////////////////////////////////////////////////////////////////////////
// Bilan des affectations des périodes aux classes & groupes ; en plusieurs requêtes pour récupérer les périodes sans classes-groupes et les classes-groupes sans périodes.
// 2/2 - On poursuit avec les requêtes suivantes (associations) et l'affichage.
// ////////////////////////////////////////////////////////////////////////////////////////////////////
echo '<hr />' . NL;
// Récupérer l'amplitude complète sur l'ensemble des périodes
$DB_ROW = DB_STRUCTURE_ADMINISTRATEUR::DB_recuperer_amplitude_periodes();
Пример #23
0
//	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-
//	Supprimer des comptes
//	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-

if($action=='supprimer')
{
	// Récupérer le profil des utilisateurs indiqués, vérifier qu'ils sont déjà sortis et qu'on y a pas glissé l'id d'un administrateur
	$DB_TAB = DB_STRUCTURE_ADMINISTRATEUR::DB_lister_users_cibles( implode(',',$tab_user_id) , 'user_id,user_profil,user_sortie_date' , '' /*avec_info*/ );
	$tab_user_id = array();
	foreach($DB_TAB as $DB_ROW)
	{
		if( ($DB_ROW['user_sortie_date']<=TODAY_MYSQL) && ($DB_ROW['user_profil']!='administrateur') )
		{
			DB_STRUCTURE_ADMINISTRATEUR::DB_supprimer_utilisateur( $DB_ROW['user_id'] , $DB_ROW['user_profil'] );
			$tab_user_id[] = $DB_ROW['user_id'];
			// Log de l'action
			SACocheLog::ajouter('Suppression d\'un utilisateur ('.$DB_ROW['user_profil'].' '.$DB_ROW['user_id'].').');
		}
	}
	$retour = (count($tab_user_id)) ? 'ok,'.implode(',',$tab_user_id) : 'Aucun compte indiqué n\'est supprimable !' ;
	exit($retour);
}

//	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-
//	On ne devrait pas en arriver là...
//	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-

exit('Erreur avec les données transmises !');

?>