Commit 82dfb13f authored by tguillon's avatar tguillon
Browse files

Mise en place d'un cron pour la conversion des annexes PDF en ODT pour

pouvoir les intégrer lors de la génération du traitement au registre.
Ajout d'une fonction pour vérifier l'arborescence des documents enregistré sur le disque (app/files)
parent a789dd02
BEGIN;
INSERT INTO crons(organisation_id, nom, action, active, lock, created, modified)
SELECT
id,
'Conversion des annexes',
'conversionAnnexes',
'false',
'false',
NOW(),
NOW()
FROM organisations
WHERE NOT EXISTS(
SELECT existant.id
FROM crons AS existant
WHERE
existant.organisation_id = organisations.id
AND existant.action = 'conversionAnnexes'
);
CREATE UNIQUE INDEX fichiers_url_idx ON fichiers (url);
COMMIT;
\ No newline at end of file
......@@ -28,6 +28,10 @@ define('CHEMIN_PIECE_JOINT', APP . FICHIER . PIECE_JOINT . DS);
define('PIECE_JOINT_TMP', DS . "piece_joint_tmp");
define('CHEMIN_PIECE_JOINT_TMP', APP . FICHIER . PIECE_JOINT . PIECE_JOINT_TMP . DS);
//Dossier qui va contenir toutes les pièces jointes PDF converti en ODT
define('PIECE_JOINT_CONVERSION', DS . "piece_joint_conversion");
define('CHEMIN_PIECE_JOINT_CONVERSION', APP . FICHIER . PIECE_JOINT . PIECE_JOINT_CONVERSION . DS);
//Dossier qui va contenir tous les modèles liés à un formulaire
define('MODELES', DS . "modeles");
define('CHEMIN_MODELES', APP . FICHIER . MODELES . DS);
......
......@@ -29,6 +29,10 @@ class CronShell extends Shell {
'Cron',
'ConnecteurLdap'
];
public $tasks = [
'AnnexeTools'
];
/**
* Function main
......@@ -118,7 +122,8 @@ class CronShell extends Shell {
'recursive' => -1,
'conditions' => [
'id' => $id
]]);
]
]);
// Sortie si tâche non trouvée
if (empty($cron)) {
......@@ -153,8 +158,9 @@ class CronShell extends Shell {
// initialisation du rapport d'exécution
$rappExecution = str_replace([Cron::MESSAGE_FIN_EXEC_SUCCES, Cron::MESSAGE_FIN_EXEC_WARNING, Cron::MESSAGE_FIN_EXEC_ERROR], '', $output);
$cron['Cron']['lock'] = 'false';
$cron['Cron']['lock'] = 0;
$cron['Cron']['last_execution_start_time'] = $executionStartTime;
unset($cron['Cron']['created'], $cron['Cron']['modified']);
if (strpos($output, Cron::MESSAGE_FIN_EXEC_SUCCES) !== false) {
$cron['Cron']['last_execution_status'] = Cron::EXECUTION_STATUS_SUCCES;
......@@ -249,11 +255,18 @@ class CronShell extends Shell {
$authentification = $this->Authentification->find('first', [
'conditions' => [
'organisation_id' => $organisation_id['Cron']['organisation_id']
]
]
]);
Configure::write('LdapManager.Ldap', $connecteurLdap['ConnecteurLdap']);
Configure::write('AuthManager.Authentification', $authentification['Authentification']);
}
/**
*
*/
public function conversionAnnexes($id) {
return $this->AnnexeTools->conversion($id);
}
}
<?php
App::uses('Conversion', 'Utility');
/**
* Application Task for Cake
* @version 5.0.1
* @since 4.3.0
* @package app.Console.Command.Task
*/
class AnnexeToolsTask extends Shell
{
public $uses = [
'Cron',
'Fichier'
];
/**
* Fonction de conversion des annexes
*
* @param int $tacheID
* @return type
*
* @version 1.0.1
*/
public function conversion($tacheID) {
$converted = 0;
$errors = [];
$annexes = $this->Fichier->find('all', [
'fields' => [
'Fichier.nom',
'Fichier.url'
],
'joins' => [
$this->Fichier->join('Fiche', ['type' => 'INNER']),
$this->Fichier->Fiche->join('Organisation', ['type' => 'INNER']),
$this->Fichier->Fiche->Organisation->join('Cron', ['type' => 'INNER'])
],
'conditions' => [
'Cron.id' => $tacheID
]
]);
// On verifie si le dossier file existe. Si c'est pas le cas on le cree
create_arborescence_files();
if (!empty($annexes)) {
foreach ($annexes as $annexe) {
$filename = CHEMIN_PIECE_JOINT.$annexe['Fichier']['url'];
if (file_exists($filename) === true) {
$mimeFile = mime_content_type($filename);
if ($mimeFile === 'application/pdf') {
$target = CHEMIN_PIECE_JOINT_CONVERSION . preg_replace('/\.pdf$/i', '.odt', $annexe['Fichier']['url']);
if (file_exists($target) === false) {
try {
$odt = Conversion::pdf2odt($filename);
$written = file_put_contents($target, $odt);
if ($written === false) {
$msgstr = 'Impossible d\'écrire dans le fichier %s';
$message = sprintf($msgstr, $filename);
$errors[] = $message;
$this->log($message, LOG_ERROR);//@fixme: this->log dans un shell ?
} else {
$converted++;
}
} catch(Exception $e) {
$msgstr = 'Erreur lors de la conversion du fichier %s: %s';
$message = sprintf($msgstr, $filename, $e->getMessage());
$errors[] = $message;
$this->log($message, LOG_ERROR);//@fixme: this->log dans un shell ?
}
}
}
} else {
$msgstr = 'Le fichier d\'annexe %s n\'est pas présent sur le système de fichier.';
$message = sprintf($msgstr, $filename);
$errors[] = $message;
$this->log($message, LOG_ERROR);//@fixme: this->log dans un shell ?
}
}
}
if (count($errors) === 0) {
if ($converted === 0) {
$message = 'Aucune annexe à convertir';
} else {
$msgstr = __mn('Annexe convertie: %%d', 'Annexes converties: %%d', $converted);
$message = sprintf($msgstr, $converted);
}
$this->out("<success>{$message}</success>");
return sprintf('%s %s', Cron::MESSAGE_FIN_EXEC_SUCCES, $message);
} else {
$msgstr = __mn('%%d erreur rencontrée: %%s', '%%d erreurs rencontrées: %%s', count($errors));
$message = sprintf($msgstr, count($errors), implode("\n", $errors));
$this->err("<error>{$message}</error>");
return sprintf('%s %s', Cron::MESSAGE_FIN_EXEC_ERROR, $message);
}
}
}
......@@ -80,29 +80,7 @@ class FichesController extends AppController {
$this->autoRender = false;
// On verifie si le dossier file existe. Si c'est pas le cas on le cree
if (!file_exists(APP . FICHIER)) {
mkdir(APP . FICHIER, 0777, true);
mkdir(APP . FICHIER . PIECE_JOINT, 0777, true);
mkdir(APP . FICHIER . MODELES, 0777, true);
mkdir(APP . FICHIER . REGISTRE, 0777, true);
mkdir(APP . FICHIER . PIECE_JOINT . PIECE_JOINT_TMP, 0777, true);
mkdir(APP . FICHIER . PIECE_JOINT . PIECE_JOINT_TMP . DS . $this->Session->read('Auth.User.id'), 0777, true);
} else {
if (!file_exists(APP . FICHIER . PIECE_JOINT)) {
mkdir(APP . FICHIER . PIECE_JOINT, 0777, true);
mkdir(APP . FICHIER . PIECE_JOINT . PIECE_JOINT_TMP, 0777, true);
mkdir(APP . FICHIER . PIECE_JOINT . PIECE_JOINT_TMP . DS . $this->Session->read('Auth.User.id'), 0777, true);
}
if (!file_exists(APP . FICHIER . PIECE_JOINT . PIECE_JOINT_TMP)) {
mkdir(APP . FICHIER . PIECE_JOINT . PIECE_JOINT_TMP, 0777, true);
mkdir(APP . FICHIER . PIECE_JOINT . PIECE_JOINT_TMP . DS . $this->Session->read('Auth.User.id'), 0777, true);
}
if (!file_exists(APP . FICHIER . PIECE_JOINT . PIECE_JOINT_TMP . DS . $this->Session->read('Auth.User.id'))) {
mkdir(APP . FICHIER . PIECE_JOINT . PIECE_JOINT_TMP . DS . $this->Session->read('Auth.User.id'), 0777, true);
}
}
create_arborescence_files($this->Session->read('Auth.User.id'));
$json = [];
foreach ($this->request->params['form']['fichiers']['tmp_name'] as $key => $tmpFile) {
......@@ -114,9 +92,11 @@ class FichesController extends AppController {
$filename = $this->request->params['form']['fichiers']['name'][$key];
$path = $dir.DS.$filename;
$extension = pathinfo($filename, PATHINFO_EXTENSION);
if ($extension == 'odt' || $extension == 'pdf') {
$mime = mime_content_type($tmpFile);
$accepted = ['application/pdf', 'application/vnd.oasis.opendocument.text'];
if (in_array($mime, $accepted) === true) {
move_uploaded_file($tmpFile, $path);
$json[] = [
......@@ -139,7 +119,15 @@ class FichesController extends AppController {
}
public function deleteFileSave() {
/**
* Suppression de l'enregistrement de la présente d'un fichier dans la table
* "fichiers"
*
* @access public
* @created 19/10/2018
* @version V1.0.1²
*/
public function deleteRecordingFile() {
$this->autoRender = false;
$success = true;
......@@ -149,16 +137,42 @@ class FichesController extends AppController {
if ($success == true) {
$this->Fiche->commit();
$this->deleteFileDisk($this->request->data('urlFile'));
$this->Session->setFlash(__d('fiche', 'fiche.flashsuccessTraitementSupprimer'), 'flashsuccess');
} else {
$this->Fiche->rollback();
$this->Session->setFlash(__d('default', 'default.flasherrorPasDroitPage'), 'flasherror');
}
}
/**
* Supprimer physiquement le fichier sur le disque
*
* @param char $urlFile
*
* @access protected
* @created 19/10/2018
* @version V1.0.1
*/
protected function deleteFileDisk($urlFile) {
$targetFileDelete = CHEMIN_PIECE_JOINT . $urlFile;
$file = new File(CHEMIN_PIECE_JOINT . $this->request->data('urlFile') );
$file->delete();
if (file_exists($targetFileDelete) === true) {
$mimeFile = mime_content_type($targetFileDelete);
if ($mimeFile === 'application/pdf') {
$filename = CHEMIN_PIECE_JOINT_CONVERSION . preg_replace('/\.pdf$/i', '.odt', $urlFile);
if (file_exists($filename) === true) {
$filenameConversion = new File($filename);
$filenameConversion->delete();
}
}
$file = new File($targetFileDelete);
$file->delete();
}
}
/**
......@@ -378,6 +392,15 @@ class FichesController extends AppController {
$this->redirect($this->Referers->get());
}
$fichiers = $this->Fichier->find('all', [
'conditions' => [
'fiche_id' => $id
],
'fields' => [
'url'
]
]);
$success = true;
$this->Fiche->begin();
......@@ -385,6 +408,13 @@ class FichesController extends AppController {
if ($success == true) {
$this->Fiche->commit();
if (!empty($fichiers)) {
foreach ($fichiers as $fichier) {
$this->deleteFileDisk($fichier['Fichier']['url']);
}
}
$this->Session->setFlash(__d('fiche', 'fiche.flashsuccessTraitementSupprimer'), 'flashsuccess');
} else {
$this->Fiche->rollback();
......@@ -941,15 +971,8 @@ class FichesController extends AppController {
if ($tabId != null) {
// On verifie si le dossier file existe. Si c'est pas le cas on le cree
if (!file_exists(APP . FICHIER)) {
mkdir(APP . FICHIER, 0777, true);
mkdir(CHEMIN_REGISTRE, 0777, true);
} else {
if (!file_exists(CHEMIN_REGISTRE)) {
mkdir(CHEMIN_REGISTRE, 0777, true);
}
}
create_arborescence_files();
$folder = TMP . "imprimerRegistreNonVerrouiller";
$date = date('d-m-Y_H-i');
......@@ -1274,14 +1297,7 @@ class FichesController extends AppController {
}
// On verifie si le dossier file existe. Si c'est pas le cas on le cree
if (!file_exists(APP . FICHIER)) {
mkdir(APP . FICHIER, 0777, true);
mkdir(APP . FICHIER . EXPORTS, 0777, true);
} else {
if (!file_exists(APP . FICHIER . EXPORTS)) {
mkdir(APP . FICHIER . EXPORTS, 0777, true);
}
}
create_arborescence_files();
$date = date("Y-m-d_H:i:s");
if (!file_exists(CHEMIN_EXPORTS . $date)) {
......
......@@ -773,30 +773,35 @@ class OrganisationsController extends AppController {
}
protected function _insertTacheAuto($id) {
$success = true;
$this->Cron->begin();
$cron = $this->Cron->find('all');
$this->Cron->create([
'Cron' => [
'organisation_id' => $id,
'nom' => 'LDAP : Synchronisation des utilisateurs et groupes',
'action' => 'syncLdap',
'active' => 'false',
'lock' => 'false'
]
]);
$success = $success && false !== $this->Cron->save();
$crons = [
[
'Cron' => [
'organisation_id' => $id,
'nom' => 'LDAP : Synchronisation des utilisateurs et groupes',
'action' => 'syncLdap',
'active' => 'false',
'lock' => 'false'
]
],
[
'Cron' => [
'organisation_id' => $id,
'nom' => 'Conversion des annexes',
'action' => 'conversionAnnexes',
'active' => 'false',
'lock' => 'false'
]
],
];
if ($success == true) {
$this->Cron->commit();
return(true);
} else {
$this->Cron->rollback();
$results = Hash::flatten($this->Cron->saveAll($crons, ['atomic' => false]));
$success = in_array(false, $results, true) === false;
if ($success !== true) {
$this->Session->setFlash(__d('default', 'default.flasherrorEnregistrementErreur'), 'flasherror');
return(false);
}
return $success;
}
/**
......
......@@ -183,5 +183,5 @@ class AppTools {
return $ret;
}
}
......@@ -237,3 +237,45 @@ function url_to_array($url) {
return array_merge($params, $pass, $named);
}
/**
* On verifie si le dossier file existe. Si c'est pas le cas on le cree
*
* @param type $user_id
* @return type
*
* @created 19/10/2018
* @version V1.0.1
*/
function create_arborescence_files($user_id = null)
{
$paths = [
APP . FICHIER,
APP . FICHIER . REGISTRE,
APP . FICHIER . MODELES,
APP . FICHIER . MODELES . EXTRAIT_REGISTRE,
APP . FICHIER . PIECE_JOINT,
APP . FICHIER . PIECE_JOINT . PIECE_JOINT_TMP,
APP . FICHIER . PIECE_JOINT . PIECE_JOINT_CONVERSION,
APP . FICHIER . NORMES,
APP . FICHIER . EXPORTS,
APP . FICHIER . CONNECTEURS
];
if ($user_id !== null) {
$paths = array_merge(
$paths,
[
APP . FICHIER . PIECE_JOINT . PIECE_JOINT_TMP . DS . $user_id,
]
);
}
$success = true;
foreach ($paths as $path) {
if (file_exists($path) === false) {
$success = mkdir($path, 0777, true) && $success;
}
}
return $success;
}
\ No newline at end of file
......@@ -63,14 +63,7 @@ class Authentification extends AppModel {
$this->begin();
// On verifie si le dossier file existe. Si c'est pas le cas on le cree
if (!file_exists(APP . FICHIER)) {
mkdir(APP . FICHIER, 0777, true);
mkdir(APP . FICHIER . CONNECTEURS, 0777, true);
} else {
if (!file_exists(APP . FICHIER . CONNECTEURS)) {
mkdir(APP . FICHIER . CONNECTEURS, 0777, true);
}
}
create_arborescence_files();
if (!empty($file['tmp_name'])) {
$url = time();
......
......@@ -471,12 +471,20 @@ class Fiche extends AppModel {
if (!empty($fileAnnexes)) {
foreach ($fileAnnexes as $key => $fileAnnexe) {
$filename = CHEMIN_PIECE_JOINT . $fileAnnexe['Fichier']['url'];
if (file_exists($filename)) {
$mime = mime_content_type($filename);
switch($mime) {
case 'application/pdf':
$content = Conversion::pdf2odt($filename);
$target = CHEMIN_PIECE_JOINT_CONVERSION . preg_replace('/\.pdf$/i', '.odt', $fileAnnexe['Fichier']['url']);
if (file_exists($target)) {
$content = file_get_contents($target);
} else {
$msgstr = 'Le fichier convertie n\'est pas présent sur le disque : %s';
throw new RuntimeException(sprintf($msgstr, $target));
}
break;
case 'application/vnd.oasis.opendocument.text':
$content = file_get_contents($filename);
......@@ -486,9 +494,6 @@ class Fiche extends AppModel {
throw new RuntimeException(sprintf($msgstr, $mime, $filename));
}
//debug($content);
//print_r($content);die();
$donnees['fichiers'][$key]['valeur_annexe'] = [
'value' => $content,
'type' => 'file'
......
......@@ -93,16 +93,7 @@ class Fichier extends AppModel {
}
// On verifie si le dossier file existe. Si c'est pas le cas on le cree
if (!file_exists(APP . FICHIER)) {
mkdir(APP . FICHIER, 0777, true);
mkdir(APP . FICHIER . PIECE_JOINT, 0777, true);
mkdir(APP . FICHIER . MODELES, 0777, true);
mkdir(APP . FICHIER . REGISTRE, 0777, true);
} else {
if (!file_exists(APP . FICHIER . PIECE_JOINT)) {
mkdir(APP . FICHIER . PIECE_JOINT, 0777, true);
}
}
create_arborescence_files();
$extension = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
$name = $file['name'];
......
......@@ -55,32 +55,27 @@ class Modele extends AppModel {
if (isset($data['Modele']['modele']) && !empty($data['Modele']['modele'])) {
$file = $data['Modele']['modele'];
$success = true;
$extension = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
if ($extension == 'odt') {
if ($file['type'] == 'application/vnd.oasis.opendocument.text') {
if (!empty($file['name'])) {
$extension = '.odt';
$this->begin();
// On verifie si le dossier file existe. Si c'est pas le cas on le cree
if (!file_exists(APP . FICHIER)) {
mkdir(APP . FICHIER, 0777, true);
mkdir(APP . FICHIER . PIECE_JOINT, 0777, true);
mkdir(APP . FICHIER . MODELES, 0777, true);
mkdir(APP . FICHIER . REGISTRE, 0777, true);
} else {
if (!file_exists(APP . FICHIER . MODELES)) {
mkdir(APP . FICHIER . MODELES, 0777, true);
}
}
create_arborescence_files();
if (!empty($file['tmp_name'])) {
$url = time();
$success = $success && move_uploaded_file($file['tmp_name'], CHEMIN_MODELES . $url . '.' . $extension);
$success = $success && move_uploaded_file($file['tmp_name'], CHEMIN_MODELES . $url . $extension);
if ($success) {
$this->deleteAll(array('formulaires_id' => $id));
$this->deleteAll([
'formulaires_id' => $id
]);
$this->create([
'fichier' => $url . '.' . $extension,
'fichier' => $url . $extension,
'formulaires_id' => $id,
'name_modele' => $file['name']
]);
......
......@@ -56,35 +56,25 @@ class ModeleExtraitRegistre extends AppModel {
$file = $data['modeleExtraitRegistre']['modeleExtraitRegistre'];
$success = true;
$extension = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
if ($extension == 'odt') {
if ($file['type'] == 'application/vnd.oasis.opendocument.text') {