Commit 49fc4ede authored by tguillon's avatar tguillon
Browse files

Ajout : nouveau modele pour la génération : modele présentation

parent cef5df24
......@@ -34,6 +34,7 @@ Le format est basé sur le modèle [Keep a Changelog](http://keepachangelog.com/
- Ajout du filtre sur l'entité sur la visualisation de toutes les entités en tant que superadmin
- Ajout de nouveaux droits
- Ajout d'une nouvelle page d'accueil pour les utilisateurs qui n'ont pas d'action sur les traitements.
- Ajout d'un modèle de "Presentation", afin de permettre la génération de registre avec une page de sommaire.
### Evolutions
- L'utilisateur ne peut plus changer son identifiant.
......
......@@ -152,4 +152,17 @@ INSERT INTO crons(organisation_id, nom, action, active, lock, created, modified)
AND existant.action = 'syncLdap'
);
--
-- Création de la table modeles presentation
--
CREATE TABLE modele_presentations (
id SERIAL NOT NULL PRIMARY KEY,
organisations_id INTEGER NOT NULL REFERENCES organisations (id) ON DELETE CASCADE ON UPDATE CASCADE,
name_modele VARCHAR(100) NOT NULL,
fichier VARCHAR(100) NOT NULL,
created timestamp without time zone NOT NULL,
modified timestamp without time zone NOT NULL
);
ALTER TABLE organisations ADD COLUMN usemodelepresentation BOOLEAN DEFAULT FALSE;
COMMIT;
......@@ -39,9 +39,14 @@ define('CHEMIN_PIECE_JOINT_CONVERSION', CHEMIN_FICHIER . PIECE_JOINT . PIECE_JOI
define('MODELES', DS . "modeles");
define('CHEMIN_MODELES', CHEMIN_FICHIER . MODELES . DS);
//Dossier qui va contenir tous les modèles pour la génération de l'extrait de registre
define('EXTRAIT_REGISTRE', DS . "extrait_registre");
define('CHEMIN_MODELES_EXTRAIT', CHEMIN_FICHIER . MODELES . EXTRAIT_REGISTRE . DS);
//Dossier qui va contenir tous les modèles pour la présentation
define('MODELES_PRESENTATIONS', DS . "modeles_presentations");
define('CHEMIN_MODELES_PRESENTATIONS', CHEMIN_FICHIER . MODELES . MODELES_PRESENTATIONS . DS);
//Dossier qui va contenir tous les registres imprimer
define('REGISTRE', DS . "registre");
define('CHEMIN_REGISTRE', CHEMIN_FICHIER . REGISTRE . DS);
......
......@@ -49,6 +49,7 @@ class FichesController extends AppController
'Historique',
'Modele',
'ModeleExtraitRegistre',
'ModelePresentation',
'Norme',
'Organisation',
'Service',
......@@ -963,7 +964,7 @@ class FichesController extends AppController
* @version V1.0.0
* @author Christian BUFFIN <christian.buffin@libriciel.coop>
*/
protected function _genereTraitement($tabId)
protected function _genereTraitement($tabId, $outputFormat = 'pdf')
{
$id = json_decode($tabId);
......@@ -1015,7 +1016,8 @@ class FichesController extends AppController
$file,
CHEMIN_MODELES,
$this->Session->read('Organisation.id'),
true
true,
$outputFormat
);
$this->requestAction(array(
......@@ -1035,6 +1037,35 @@ class FichesController extends AppController
}
}
protected function _genereRegistre($urlTraitementODT)
{
$organisation_id = $this->Session->read('Organisation.id');
// On récupére le modèle de présentation
$modele = ClassRegistry::init('ModelePresentation')->find('first', [
'conditions' => [
'organisations_id' => $organisation_id
]
]);
// On vérifie que les infos du modèle existe bien
if (!empty($modele) && file_exists(CHEMIN_MODELES_PRESENTATIONS.$modele['ModelePresentation']['fichier'])) {
$file = $modele['ModelePresentation']['fichier'];
$pdf = $this->Fiche->preparationGenerationRegistre(
$urlTraitementODT,
$file,
CHEMIN_MODELES_PRESENTATIONS,
$organisation_id
);
return $pdf;
} else {
$this->Session->setFlash(__d('fiche', 'fiche.flasherrorRecuperationModele'), 'flasherror');
$this->redirect($this->Referers->get());
}
}
/**
* On récupére le DPO de la collectivité
*
......@@ -1115,6 +1146,16 @@ class FichesController extends AppController
}
if ($tabId != null) {
$modelePresentationOrganisation = $this->Organisation->find('first', [
'conditions' => [
'id' => $this->Session->read('Organisation.id')
],
'fields' => [
'usemodelepresentation'
]
]);
$useModelPresentation = $modelePresentationOrganisation['Organisation']['usemodelepresentation'];
// On verifie si le dossier file existe. Si c'est pas le cas on le cree
create_arborescence_files();
......@@ -1128,33 +1169,55 @@ class FichesController extends AppController
$files_concat = '';
foreach (json_decode($tabId) as $ficheID) {
$pdf = $this->_genereTraitement($ficheID);
if ($useModelPresentation === false) {
$pdf = $this->_genereTraitement($ficheID);
$monPDF = fopen($folder . DS . $ficheID . '.pdf', 'a');
fputs($monPDF, $pdf);
fclose($monPDF);
//file_put_contents($folder. DS . $ficheID . '.pdf ', $pdf);
//On concatene le chemin du fichier .pdf
$files_concat .= $folder . DS . $ficheID . '.pdf ';
} else {
$odt = $this->_genereTraitement($ficheID, 'odt');
$monPDF = fopen($folder . DS . $ficheID . '.pdf', 'a');
fputs($monPDF, $pdf);
fclose($monPDF);
$monODT = fopen($folder . DS . $ficheID . '.odt', 'a');
fputs($monODT, $odt);
fclose($monODT);
//On concatene le chemin du fichier .pdf
$files_concat .= $folder . DS . $ficheID . '.pdf ';
//On concatene le chemin du fichier .pdf
$chemintraitementGenereODT[] = $folder . DS . $ficheID . '.odt';
}
}
/**
* On concatene tout les PDFs qu'on a cree et on enregistre
* la concatenation dans /var/www/webdpo/app/files/registre
*/
shell_exec('pdftk' . ' ' . $files_concat . 'cat output ' . CHEMIN_REGISTRE . 'Registre_' . $date . '.pdf');
if ($useModelPresentation === true) {
$pdf = $this->_genereRegistre($chemintraitementGenereODT);
$this->response->disableCache();
$this->response->body($pdf);
$this->response->type('application/pdf');
$this->response->download('Registre_' . $date . '.pdf');
$monRegistrePDF = fopen(CHEMIN_REGISTRE . 'Registre_' . $date . '.pdf', 'a');
fputs($monRegistrePDF, $this->response);
fclose($monRegistrePDF);
} else {
/**
* On concatene tout les PDFs qu'on a cree et on enregistre
* la concatenation dans /var/www/webdpo/app/files/registre
*/
shell_exec('pdftk' . ' ' . $files_concat . 'cat output ' . CHEMIN_REGISTRE . 'Registre_' . $date . '.pdf');
//On propose le telechargement
$this->response->file(CHEMIN_REGISTRE . 'Registre_' . $date . '.pdf', [
'download' => true,
'name' => 'Registre_' . $date . '.pdf'
]);
}
// On supprime de dossier imprimerRegistreNonVerrouiller dans /tmp
shell_exec('rm -rf ' . realpath($folder));
//On propose le telechargement
$this->response->file(CHEMIN_REGISTRE . 'Registre_' . $date . '.pdf', [
'download' => true,
'name' => 'Registre_' . $date . '.pdf'
]);
return $this->response;
} else {
$this->Session->setFlash(__d('registre', 'registre.flasherrorAucunTraitementSelectionner'), 'flasherror');
......@@ -1190,10 +1253,12 @@ class FichesController extends AppController
$this->redirect($this->Referers->get());
}
$organisation_id = $this->Session->read('Organisation.id');
// On récupére le modèle de l'extrait de registre
$modele = $this->ModeleExtraitRegistre->find('first', [
'conditions' => [
'organisations_id' => $this->Session->read('Organisation.id')
'organisations_id' => $organisation_id
]
]);
......@@ -1217,7 +1282,7 @@ class FichesController extends AppController
$tabId,
$file,
CHEMIN_MODELES_EXTRAIT,
$this->Session->read('Organisation.id')
$organisation_id
);
}
......
<?php
/**
* ModelePresentationController
*
* web-DPO : Outil de gestion de vos traitements dans le cadre de la
* réglementation relative à la protection des données personnelles (RGPD)
*
* Copyright (c) Libriciel SCOP (https://www.libriciel.fr/)
*
* Licensed under The CeCiLL V2 License
* For full copyright and license information, please see the LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @copyright Copyright (c) Libriciel SCOP (https://www.libriciel.fr/)
* @link https://www.libriciel.fr/web-cil/
* @since web-DPO v1.0.0
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.html CeCiLL V2 License
* @version v1.0.0
* @package App.Controller
*/
App::uses('Folder', 'Utility');
App::uses('File', 'Utility');
App::uses('ListeDroit', 'Model');
class ModelePresentationsController extends AppController {
public $uses = [
'ModelePresentation',
];
/**
* @access public
* @created 26/12/2016
* @version V1.0.0
*/
public function add() {
if (true !== $this->Droits->authorized([ListeDroit::CREER_UTILISATEUR, ListeDroit::MODIFIER_UTILISATEUR, ListeDroit::SUPPRIMER_UTILISATEUR, ListeDroit::CREER_ORGANISATION, ListeDroit::MODIFIER_ORGANISATION, ListeDroit::CREER_PROFIL, ListeDroit::MODIFIER_PROFIL, ListeDroit::SUPPRIMER_PROFIL])) {
throw new ForbiddenException(__d('default', 'default.flasherrorPasDroitPage'));
}
// Superadmin non autorisé
if (true == ($this->Droits->authorized($this->Droits->isSu()))) {
throw new ForbiddenException(__d('default', 'default.flasherrorPasDroitPage'));
}
$saveFile = $this->ModelePresentation->saveFile($this->request->data, $this->Session->read('Organisation.id'));
if ($saveFile == 0) {
$this->Session->setFlash(__d('modele_presentation', 'modele_presentation.flashsuccessModeleEnregistrer'), 'flashsuccess');
} elseif ($saveFile == 1) {
$this->Session->setFlash(__d('modele_presentation', 'modele_presentation.flasherrorFicherTropLourd'), 'flasherror');
} elseif ($saveFile == 2) {
$this->Session->setFlash(__d('modele_presentation', 'modele_presentation.flasherrorExtensionNonValide'), 'flasherror');
} elseif ($saveFile == 3) {
$this->Session->setFlash(__d('modele_presentation', 'modele_presentation.flashwarningAucunFichier'), 'flashwarning');
}
$this->redirect($this->Referers->get());
}
/**
* Fonction pour téléchargé le modele de l'extrait de registre
*
* @param type $file
* @return type
*
* @access public
* @created 28/12/2016
* @version V1.0.0
*/
public function download($file, $nameFile) {
$this->response->file(CHEMIN_MODELES_PRESENTATIONS . $file, [
'download' => true,
'name' => $nameFile
]);
return $this->response;
}
/**
* Permet de supprimer en bdd de le model associer par qu'ontre on ne
* supprime dans aucun cas le fichier enregistré
*
* @param type $file --> c'est le nom du model (en générale 15614325.odt)
* qui est enregistré dans app/webroot/files/models
*/
public function delete($file) {
$modeles = $this->ModelePresentation->find('all', [
'conditions' => [
'fichier' => $file
]
]);
if ($modeles) {
$isDeleted = $this->ModelePresentation->deleteAll([
'fichier' => $file
]);
if ($isDeleted) {
$this->Session->setFlash(__d('modele_presentation', 'modele_presentation.flashsuccessModeleSupprimer'), 'flashsuccess');
} else {
$this->Session->setFlash(__d('modele_presentation', 'modele_presentation.flasherrorErreurSupprimerModele'), 'flasherror');
}
} else {
$this->Session->setFlash(__d('modele_presentation', 'modele_presentation.flasherrorModeleInexistant'), 'flasherror');
}
$this->redirect($this->Referers->get());
}
public function index() {
if (true !== $this->Droits->authorized([ListeDroit::CREER_UTILISATEUR, ListeDroit::MODIFIER_UTILISATEUR, ListeDroit::SUPPRIMER_UTILISATEUR, ListeDroit::CREER_ORGANISATION, ListeDroit::MODIFIER_ORGANISATION, ListeDroit::CREER_PROFIL, ListeDroit::MODIFIER_PROFIL, ListeDroit::SUPPRIMER_PROFIL])) {
throw new ForbiddenException(__d('default', 'default.flasherrorPasDroitPage'));
}
// Superadmin non autorisé
if ($this->Droits->isSu() == true) {
throw new ForbiddenException(__d('default', 'default.flasherrorPasDroitPage'));
}
$this->set('title', __d('modele_presentation', 'modele_presentation.titreModelePresentation'));
$modelesPresentation = $this->ModelePresentation->find('first', [
'conditions' => [
'organisations_id' => $this->Session->read('Organisation.id')
]
]);
if (!empty($modelesPresentation)) {
foreach ($modelesPresentation as $modelePresentation) {
if (!file_exists(CHEMIN_MODELES_PRESENTATIONS . $modelePresentation['fichier'])) {
$this->ModelePresentation->delete($modelePresentation['id']);
$modelesPresentation = [];
}
}
}
$this->set(compact('modelesPresentation'));
}
/**
*
* @access public
* @created 26/04/2016
* @version V1.0.2
*/
public function infoVariable()
{
if ($this->Session->read('Organisation.dpo') === null) {
throw new ForbiddenException(__d('default', 'default.flasherrorPasDroitPage'));
}
$this->set('title', __d('modele', 'modele.titreInfoVariableModele'));
//Information sur l'organisation
$organisation = $this->Organisation->find('first', [
'conditions' => [
'id' => $this->Session->read('Organisation.id')
],
'fields' => [
'raisonsociale',
'telephone',
'fax',
'adresse',
'email',
'sigle',
'siret',
'ape',
'dpo',
'numerodpo'
]
]);
// Responsable de l'entité
$responsableEntite = $this->Organisation->find('first', [
'conditions' => [
'id' => $this->Session->read('Organisation.id')
],
'fields' => [
'civiliteresponsable',
'nomresponsable',
'prenomresponsable',
'emailresponsable',
'telephoneresponsable',
'fonctionresponsable',
'responsable_nom_complet',
'responsable_nom_complet_court'
]
]);
// Information sur le DPO de l'organisation
$userDPO = $this->User->find('first', [
'conditions' => [
'id' => $organisation['Organisation']['dpo']
],
'fields' => [
'civilite',
'nom',
'prenom',
'email',
'telephonefixe',
'telephoneportable',
'nom_complet',
'nom_complet_court'
]
]);
if (isset($organisation['Organisation']['dpo']) === true) {
unset($organisation['Organisation']['dpo']);
}
if (isset($organisation['Organisation']['numerodpo']) === true) {
$userDPO['User'] += [
'numerodpo' => $organisation['Organisation']['numerodpo']
];
unset($organisation['Organisation']['numerodpo']);
}
$variablesOrganisation = [];
foreach ($organisation['Organisation'] as $key => $valueOrganisation) {
$variablesOrganisation['Entite'][$key] = [
'organisation_'.$key => $valueOrganisation
];
}
foreach ($responsableEntite['Organisation'] as $key => $valueResponsable) {
$variablesOrganisation['Responsable'][$key] = [
'organisation_'.$key => $valueResponsable
];
}
foreach ($userDPO['User'] as $key => $valueUserDPO) {
$variablesOrganisation['Dpo'][$key] = [
'dpo_'.$key => $valueUserDPO
];
}
$this->set(compact('variablesOrganisation'));
}
}
......@@ -254,6 +254,7 @@ function create_arborescence_files($user_id = null)
CHEMIN_FICHIER . REGISTRE,
CHEMIN_FICHIER . MODELES,
CHEMIN_FICHIER . MODELES . EXTRAIT_REGISTRE,
CHEMIN_MODELES_PRESENTATIONS,
CHEMIN_FICHIER . PIECE_JOINT,
CHEMIN_FICHIER . PIECE_JOINT . PIECE_JOINT_TMP,
CHEMIN_FICHIER . PIECE_JOINT . PIECE_JOINT_CONVERSION,
......
......@@ -76,7 +76,10 @@ msgid "default.sousTitreModeleFormulaire"
msgstr "Modèles pour les formulaires"
msgid "default.sousTitreModeleExtraitRegistre"
msgstr "Modèles pour l'extrait de registre"
msgstr "Modèle pour l'extrait de registre"
msgid "default.sousTitreModelePresentation"
msgstr "Modèle de présentation"
msgid "default.titreAdministrationUser"
msgstr "Utilisateurs"
......
# Locale fra
# modele.po
#
# web-DPO : https://www.libriciel.fr/web-cil/
#
# @author Théo Guillon
# @copyright Libriciel SCOP
# @link https://www.libriciel.fr/
# @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt CeCiLL v2
#
####################### Controller/ModelesController.php ######################
msgid "modele_presentation.titreListeModele"
msgstr "Liste des modèles pour les formulaires"
msgid "modele_presentation.titreModelePresentation"
msgstr "Modèle pour la page de présentation"
msgid "modele_presentation.titreInfoVariableModele"
msgstr "Informations sur les variables utilisables dans le modèle"
###################### Session->setFlash ######################
msgid "modele_presentation.flashsuccessModeleEnregistrer"
msgstr "Le modèle a été enregistré"
msgid "modele_presentation.flashsuccessModeleSupprimer"
msgstr "Le modèle a été supprimé"
msgid "modele_presentation.flasherrorErreurSupprimerModele"
msgstr "Impossible de supprimer le modèle"
msgid "modele_presentation.flasherrorModeleInexistant"
msgstr "Ce modèle n'existe pas"
msgid "modele_presentation.flasherrorFicherTropLourd"
msgstr "Le fichier est trop lourd."
msgid "modele_presentation.flasherrorExtensionNonValide"
msgstr "L'extension de votre fichier n'est pas accepter, il faut un fichier en .odt"
msgid "modele_presentation.flashwarningAucunFichier"
msgstr "Vous avez renseiger aucun fichier"
###############################################################
###############################################################################
######################## View/modelePresentations/index.ctp #########################
msgid "modele_presentation.titreTableauFormulaire"
msgstr "Formulaire"
msgid "modele_presentation.titreTableauFichierModele"
msgstr "Fichier de modèle"
msgid "modele_presentation.titreTableauActions"
msgstr "Actions"
msgid "modele_presentation.commentaireImporterModel"
msgstr "Importer un modèle"
msgid "modele_presentation.commentaireVariableModel"
msgstr "Informations sur les variables utilisables dans le modèle"
msgid "modele_presentation.commentaireTelechargerModel"
msgstr "Télécharger le modèle"
msgid "modele_presentation.commentaireSupprimerModel"
msgstr "Supprimer le modèle"
msgid "modele_presentation.confirmationSupprimerModel"
msgstr "Voulez vous supprimer le modèle ?"
msgid "modele_presentation.textTableauAucunModele"
msgstr "Aucun modèle pour ce formulaire"
msgid "modele_presentation.textTableauPresentationModele"
msgstr "Modèle de présentation"
msgid "modele_presentation.popupEnvoiModele"
msgstr "Envoi d'un modèle"
msgid "modele_presentation.popupChampModele"
msgstr "Modèle"
msgid "modele_presentation.btnEnregistrerModele"
msgstr " Enregistrer ce modèle"
msgid "modele_presentation.textAucunFormulaire"
msgstr "Il n'y a aucun formulaire de créé"
###############################################################################
####################### View/Modeles/info_variabler.ctp #######################
msgid "modele_presentation.titreTableauModele"
msgstr "Modèle"
msgid "modele_presentation.titreTableauNomChamp"
msgstr "Nom du champ"
msgid "modele_presentation.titreTableauNomVariable"
msgstr "Nom de variable"
msgid "modele_presentation.titreTableauType"
msgstr "Type du champ"
msgid "modele_presentation.titreTableauValeur"
msgstr "Valeur"
msgid "modele_presentation.sousTitreVariableFormulaire"
msgstr "Variable dans le traitement"
msgid "modele_presentation.sousTitreEntité"
msgstr "L'entité"
msgid "modele_presentation.textOrganisation"