/**
  * FICHIER - Edition de fichiers
  */
 public function processEditerFichiers()
 {
     _classInclude('sysutils|StatsServices');
     $confirmMessage = '';
     CopixHTMLHeader::addJSLink(_resource('js/uploadify/jquery.uploadify.v2.1.4.min.js'));
     CopixHTMLHeader::addJSLink(_resource('js/uploadify/swfobject.js'));
     $ppo = new CopixPPO();
     $ppo->conf = new CopixPPO();
     $ppo->conf->max_file_size = StatsServices::human2octets(ini_get('upload_max_filesize'));
     if (is_null($ppo->classeurId = _request('classeurId'))) {
         return CopixActionGroup::process('generictools|Messages::getError', array('message' => CopixI18N::get('kernel|kernel.error.errorOccurred'), 'back' => CopixUrl::get('')));
     }
     // Récupération du dossier courant
     $dossierDAO = _ioDAO('classeur|classeurdossier');
     $ppo->dossier = null;
     if (!is_null($ppo->dossierId = _request('dossierId', null)) && $ppo->dossierId != 0) {
         if (!($ppo->dossier = $dossierDAO->get($ppo->dossierId))) {
             return CopixActionGroup::process('generictools|Messages::getError', array('message' => CopixI18N::get('kernel|kernel.error.errorOccurred'), 'back' => CopixUrl::get('')));
         }
     }
     // Contrôle des droits d'accès
     if (Kernel::getLevel('MOD_CLASSEUR', $ppo->classeurId) < PROFILE_CCV_MEMBER && $ppo->dossier->casier && $ppo->dossier->parent_id != 0 || Kernel::getLevel('MOD_CLASSEUR', $ppo->classeurId) < PROFILE_CCV_MEMBER && !$ppo->dossier->casier) {
         return CopixActionGroup::process('genericTools|Messages::getError', array('message' => CopixI18N::get('kernel|kernel.error.noRights'), 'back' => CopixUrl::get('classeur||voirContenu', array('classeurId' => $ppo->classeurId))));
     }
     // Récupération de l'identifiant du fichier (si modification)
     $fichierId = _request('fichierId', null);
     if (!is_null($fichierId)) {
         $fichierDAO = _ioDAO('classeur|classeurfichier');
         $ppo->fichier = $fichierDAO->get($fichierId);
         // Contrôle d'accès
         if (Kernel::getLevel('MOD_CLASSEUR', $ppo->classeurId) < PROFILE_CCV_MEMBER && ($ppo->fichier->user_type != _currentUser()->getExtra('type') || $ppo->fichier->user_id != _currentUser()->getExtra('id'))) {
             return CopixActionGroup::process('genericTools|Messages::getError', array('message' => CopixI18N::get('kernel|kernel.error.noRights'), 'back' => CopixUrl::get('classeur||voirContenu', array('classeurId' => $ppo->classeurId))));
         }
     }
     // Récupération du classeur
     $classeurDAO = _ioDAO('classeur|classeur');
     $classeur = $classeurDAO->get($ppo->classeurId);
     // Récupération du path
     if (!is_null($ppo->dossier)) {
         $ppo->path = $ppo->dossier->getPath();
     } else {
         $ppo->path = '/' . $classeur->titre . '/';
     }
     // Dossier temporaire pour l'upload des fichiers
     _classInclude('classeur|classeurService');
     $dossierTmp = classeurService::getTmpFolder();
     $ppo->dossierTmp = $dossierTmp . classeurService::createKey();
     $ppo->maxSizeLimit = Kernel::return_bytes(ini_get('upload_max_filesize'));
     // Soumission du formulaire
     if (CopixRequest::isMethod('post')) {
         $fichierDAO = _ioDAO('classeur|classeurfichier');
         // S'il s'agit d'une modification de fichier
         if (!is_null(_request('fichierId', null))) {
             $ppo->fichier->titre = _request('fichier_titre', null);
             $ppo->fichier->commentaire = _request('fichier_commentaire', null);
             // Contrôle upload du fichier
             if (!is_null($_FILES['fichier']['tmp_name']) && is_uploaded_file($_FILES['fichier']['tmp_name'])) {
                 $dir = realpath('./static/classeur') . '/' . $classeur->id . '-' . $classeur->cle . '/';
                 $oldExtension = strtolower(strrchr($ppo->fichier->fichier, '.'));
                 $fichierPhysique = $dir . $ppo->fichier->id . '-' . $ppo->fichier->cle . $oldExtension;
                 // Suppression de l'ancien fichier
                 if (file_exists($fichierPhysique)) {
                     unlink($fichierPhysique);
                 }
                 $extension = strtolower(strrchr($_FILES['fichier']['name'], '.'));
                 // Nom particulier dans le cas d'un casier (nom de l'élève présent dans le nom du fichier)
                 if (isset($ppo->dossier) && $ppo->dossier->casier) {
                     $user = Kernel::getUserInfo($ppo->fichier->user_type, $ppo->fichier->user_id);
                     $ppo->fichier->fichier = $ppo->fichier->titre . '_' . $user['prenom'] . '_' . $user['nom'] . $extension;
                 } else {
                     $ppo->fichier->fichier = $_FILES['fichier']['name'];
                 }
                 $ppo->fichier->taille = filesize($_FILES['fichier']['tmp_name']);
                 $ppo->fichier->type = strtoupper(substr(strrchr($_FILES['fichier']['name'], '.'), 1));
                 $fichierPhysique = $dir . $ppo->fichier->id . '-' . $ppo->fichier->cle . $extension;
                 move_uploaded_file($_FILES['fichier']['tmp_name'], $fichierPhysique);
             } else {
                 // Nom particulier dans le cas d'un casier (nom de l'élève présent dans le nom du fichier)
                 if (isset($ppo->dossier) && $ppo->dossier->casier) {
                     $dir = realpath('./static/classeur') . '/' . $classeur->id . '-' . $classeur->cle . '/';
                     $extension = strtolower(strrchr($ppo->fichier->fichier, '.'));
                     $user = Kernel::getUserInfo($ppo->fichier->user_type, $ppo->fichier->user_id);
                     $ppo->fichier->fichier = $ppo->fichier->titre . '_' . $user['prenom'] . '_' . $user['nom'] . $extension;
                 }
             }
             // Mise à jour de l'enregistrement fichier
             $fichierDAO->update($ppo->fichier);
             $confirmMessage = CopixI18N::get('classeur|classeur.message.confirmUpdate');
         } else {
             // Récupération du dossier temporaire
             $ppo->dossierTmp = _request('dossierTmp', null);
             // Traitement des erreurs
             $ppo->erreurs = array();
             // Récupération des fichiers uploadés via uploadify
             $uploadedFiles = array();
             $uploadedFiles = ClasseurService::getFilesInTmpFolder($uploadedFiles, $ppo->dossierTmp);
             if (!is_uploaded_file($_FILES['fichier']['tmp_name']) && empty($uploadedFiles)) {
                 $ppo->erreurs[] = CopixI18N::get('classeur|classeur.error.noFiles');
             }
             if (!is_null(_request('fichier_titre', null)) && strlen(_request('fichier_titre')) > 64) {
                 $ppo->erreurs[] = CopixI18N::get('classeur|classeur.error.titleTooLong', array('size' => 64));
             }
             if (!empty($ppo->erreurs)) {
                 $modParentInfo = Kernel::getModParentInfo('MOD_CLASSEUR', $ppo->classeurId);
                 $ppo->TITLE_PAGE = $modParentInfo['nom'];
                 return _arPPO($ppo, array('template' => 'editer_fichiers.tpl'));
             }
             // Création du répertoire
             $dir = realpath('./static/classeur') . '/' . $classeur->id . '-' . $classeur->cle . '/';
             if (!file_exists($dir)) {
                 mkdir($dir, 0755, true);
             }
             // Traitement de l'upload multiple (prédomine sur l'upload simple)
             if (!empty($uploadedFiles)) {
                 foreach ($uploadedFiles as $folder) {
                     foreach ($folder['files'] as $file) {
                         ClasseurService::uploadFile($ppo->dossierTmp . '/' . $file, $file, $classeur, $ppo->dossier);
                     }
                 }
             } else {
                 // S'il s'agit d'une archive ZIP
                 if (strtolower(strrchr($_FILES['fichier']['name'], '.')) == '.zip' && _request('with_decompress', false)) {
                     $zip = new ZipArchive();
                     if ($zip->open($_FILES['fichier']['tmp_name']) === true) {
                         // Décompression de l'archive dans le dossier temporaire
                         $zip->extractTo($ppo->dossierTmp);
                         $zip->close();
                         // Copie des fichiers provenant de l'archive ZIP
                         $correspondanceDossiers = array();
                         $datas = array();
                         $datas = classeurService::getFilesInTmpFolder($datas, $ppo->dossierTmp);
                         foreach ($datas as $dossierParent => $data) {
                             if (!empty($data['folders'])) {
                                 foreach ($data['folders'] as $folder) {
                                     $dossier = _record('classeur|classeurdossier');
                                     $dossier->nb_dossiers = 0;
                                     $dossier->nb_fichiers = 0;
                                     $dossier->taille = 0;
                                     $dossier->classeur_id = $classeur->id;
                                     $dossier->parent_id = $dossierParent == $ppo->dossierTmp ? $ppo->dossierId : $correspondanceDossiers[$dossierParent]->id;
                                     $dossier->nom = $folder;
                                     $dossier->cle = classeurService::createKey();
                                     $dossier->date_creation = date('Y-m-d H:i:s');
                                     $dossier->user_type = _currentUser()->getExtra('type');
                                     $dossier->user_id = _currentUser()->getExtra('id');
                                     $dossier->casier = 0;
                                     $dossierDAO->insert($dossier);
                                     classeurService::updateFolderInfos($dossier);
                                     $correspondanceDossiers[$dossierParent . '/' . $folder] = $dossier;
                                 }
                             }
                             if (!empty($data['files'])) {
                                 foreach ($data['files'] as $file) {
                                     $fichier = _record('classeur|classeurfichier');
                                     $extension = strtolower(strrchr($file, '.'));
                                     $filename = substr($file, 0, strrpos($file, '.'));
                                     $title = Kernel::stripText($filename) . $extension;
                                     $fichier->classeur_id = $classeur->id;
                                     $fichier->dossier_id = $dossierParent == $ppo->dossierTmp ? $ppo->dossierId : $correspondanceDossiers[$dossierParent]->id;
                                     $fichier->titre = substr($title, 0, 63);
                                     $fichier->commentaire = '';
                                     $fichier->fichier = $title;
                                     $fichier->taille = file_exists($dossierParent . '/' . $file) ? filesize($dossierParent . '/' . $file) : 0;
                                     $fichier->type = strtoupper(substr(strrchr($file, '.'), 1));
                                     $fichier->cle = classeurService::createKey();
                                     $fichier->date_upload = date('Y-m-d H:i:s');
                                     $fichier->user_type = _currentUser()->getExtra('type');
                                     $fichier->user_id = _currentUser()->getExtra('id');
                                     $fichierDAO->insert($fichier);
                                     if (isset($correspondanceDossiers[$dossierParent])) {
                                         classeurService::updateFolderInfos($correspondanceDossiers[$dossierParent]);
                                     }
                                     $nomClasseur = $classeur->id . '-' . $classeur->cle;
                                     $nomFichier = $fichier->id . '-' . $fichier->cle;
                                     // Déplacement du fichier temporaire dans le classeur
                                     copy($dossierParent . '/' . $file, $dir . $fichier->id . '-' . $fichier->cle . $extension);
                                     ClasseurService::doAutoRotateJpegByOrientation($dir . $fichier->id . '-' . $fichier->cle . $extension, $extension);
                                     // Suppression du fichier temporaire
                                     unlink($dossierParent . '/' . $file);
                                 }
                             }
                         }
                     }
                 } else {
                     $fichier = ClasseurService::uploadFile($_FILES['fichier']['tmp_name'], $_FILES['fichier']['name'], $classeur, $ppo->dossier);
                     if (null !== $ppo->dossier && $ppo->dossier->casier) {
                         // Minimail de confirmation dans le cas de l'upload d'un fichier dans un casier
                         classeurService::sendLockerUploadConfirmation($fichier->fichier);
                         $confirmMessage = CopixI18N::get('classeur|classeur.message.confirmUploadLockerMessage', array($fichier->fichier));
                     }
                 }
             }
         }
         // Message de confirmation générique si non déjà défini
         if ('' == $confirmMessage) {
             $confirmMessage = CopixI18N::get('classeur|classeur.message.success');
         }
         // Mise à jour des informations du dossier parent
         if (null !== $ppo->dossier) {
             classeurService::updateFolderInfos($ppo->dossier);
         }
         // Suppression du dossier TMP
         classeurService::rmdir_recursive($ppo->dossierTmp);
         return _arRedirect(CopixUrl::get('classeur||voirContenu', array('classeurId' => $ppo->classeurId, 'dossierId' => $ppo->dossierId, 'confirmMessage' => $confirmMessage)));
     }
     $modParentInfo = Kernel::getModParentInfo('MOD_CLASSEUR', $ppo->classeurId);
     $ppo->TITLE_PAGE = $modParentInfo['nom'];
     return _arPPO($ppo, array('template' => 'editer_fichiers.tpl'));
 }
 public function getStatsRoot()
 {
     _classInclude('systutils|StatsServices');
     $res = array();
     /*
      * Nombre de classeurs
      */
     $sql = '
         SELECT COUNT(id) AS nb
         FROM module_classeur';
     $a = _doQuery($sql);
     $res['nbClasseurs'] = array('name' => CopixI18N::get('classeur|classeur.stats.nbClasseurs', array($a[0]->nb)));
     /*
      * Nombre de dossiers
      */
     $sql = '
         SELECT COUNT(id) AS nb
         FROM module_classeur_dossier';
     $a = _doQuery($sql);
     $res['nbDossiers'] = array('name' => CopixI18N::get('classeur|classeur.stats.nbDossiers', array($a[0]->nb)));
     /*
      * Nombre de documents
      */
     $sql = '
         SELECT COUNT(id) AS nb
         FROM module_classeur_fichier';
     $a = _doQuery($sql);
     $res['nbFichiers'] = array('name' => CopixI18N::get('classeur|classeur.stats.nbFichiers', array($a[0]->nb)));
     $sql = '
         SELECT SUM(taille) AS taille
         FROM module_classeur_fichier';
     $a = _doQuery($sql);
     $res['size'] = array('name' => CopixI18N::get('classeur|classeur.stats.size', array(StatsServices::human_file_size($a[0]->taille))));
     return $res;
 }
 /**
  * Statistiques du module documents
  *
  * Renvoie des �l�ments chiffr�s relatifs aux documents et d�di�s � un utilisateur syst�me : taille occup�e (format "humain"), nombre de zones de documents, nombre de dossiers, nombre de fichiers
  *
  * @author Christophe Beyer <*****@*****.**>
  * @since 2007/03/20
  * @return array Tableau dont les clefs repr�sentent les libell�s des stats et les valeurs les stats chiffr�es. Clefs utilis�es : ["nbMalles"] ["nbFolders"] ["nbFiles"] ["size"]
  */
 public function getStatsRoot()
 {
     _classInclude('systutils|StatsServices');
     $res = array();
     /*
      * Nombre de malles
      */
     $sql = '
         SELECT COUNT(id) AS nb
         FROM module_malle_malles';
     $a = _doQuery($sql);
     $res['nbMalles'] = array('name' => CopixI18N::get('malle|malle.stats.nbMalles', array($a[0]->nb)));
     /*
      * Nombre de dossiers
      */
     $sql = '
         SELECT COUNT(id) AS nb
         FROM module_malle_folders';
     $a = _doQuery($sql);
     $res['nbFolders'] = array('name' => CopixI18N::get('malle|malle.stats.nbFolders', array($a[0]->nb)));
     /*
      * Nombre de fichiers
      */
     $sql = '
         SELECT COUNT(id) AS nb
         FROM module_malle_files';
     $a = _doQuery($sql);
     $res['nbFiles'] = array('name' => CopixI18N::get('malle|malle.stats.nbFiles', array($a[0]->nb)));
     /*
      * Taille
      */
     $sql = '
         SELECT SUM(taille) AS nb
         FROM module_malle_files';
     $a = _doQuery($sql);
     $res['size'] = array('name' => CopixI18N::get('malle|malle.stats.size', array(StatsServices::human_file_size($a[0]->nb))));
     return $res;
 }