Commit 3e7d906d authored by tguillon's avatar tguillon
Browse files

Ajout : Définition de l'entité responsable de la plate forme web-dpo afin...

Ajout : Définition de l'entité responsable de la plate forme web-dpo afin d'afficher les informations de celle-ci dans la politique de confidentialité
parent 2ebfb9bf
......@@ -10,7 +10,8 @@ Le format est basé sur le modèle [Keep a Changelog](http://keepachangelog.com/
- Mise en place d'une FAQ.
- Mise en place de nouveau droits en rapport avec le FAQ.
- Mise en place de la civilité du responsable de l'entité.
- Mise en place de la politique de confidentialité de l'application (A FINIR)
- Mise en place de la politique de confidentialité de l'application.
- Définition de l'entité responsable de la plate forme web-dpo afin d'afficher les informations de celle-ci dans la page de politique de confidentialité.
### Evolutions
- L'utilisateur ne peut plus changer son identifiant.
......
......@@ -57,4 +57,6 @@ INSERT INTO liste_droits (libelle, value, created, modified) VALUES
('Consulter la FAQ', 18, NOW(), NOW()),
('Supprimer un article dans la FAQ', 19, NOW(), NOW());
ALTER TABLE organisations ADD COLUMN rgpd BOOLEAN DEFAULT FALSE;
COMMIT;
......@@ -204,17 +204,17 @@ class FichesController extends AppController
$this->set('files', $files);
}
$ifDPO = $this->Organisation->find('first', [
'conditions' => [
'id' => $this->Session->read('Organisation.id')
],
'fields' => [
'dpo'
]
]);
if (empty($ifDPO['Organisation.dpo'])){
throw new ForbiddenException("Aucun DPO n'a été défini pour votre entité. Veuillez contacter votre administrateur.");
}
// $ifDPO = $this->Organisation->find('first', [
// 'conditions' => [
// 'id' => $this->Session->read('Organisation.id')
// ],
// 'fields' => [
// 'dpo'
// ]
// ]);
// if (empty($ifDPO['Organisation.dpo'])){
// throw new ForbiddenException("Aucun DPO n'a été défini pour votre entité. Veuillez contacter votre administrateur.");
// }
$this->set('title', __d('fiche', 'fiche.titreCrationFiche'));
......
......@@ -3,15 +3,15 @@
/**
* OrganisationsController : Controller des organisations
*
* web-DPO : Outil de gestion de vos traitements dans le cadre de la
* 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
......@@ -23,7 +23,8 @@
App::uses('ListeDroit', 'Model');
App::uses('WebdpoChecks', 'Utility');
class OrganisationsController extends AppController {
class OrganisationsController extends AppController
{
public $uses = [
'Cron',
......@@ -88,13 +89,18 @@ class OrganisationsController extends AppController {
$this->set('title', 'Créer une entité');
if ($this->request->is('post')) {
if('Cancel' === Hash::get($this->request->data, 'submit')) {
if ('Cancel' === Hash::get($this->request->data, 'submit')) {
$this->redirect($this->Referers->get());
}
$success = true;
$this->Organisation->begin();
$noOrganisation = $this->Organisation->find('first');
if (empty($noOrganisation)) {
$this->request->data['Organisation']['rgpd'] = true;
}
$success = false !== $this->Organisation->saveAddEditForm($this->request->data) && $success;
if ($success === true) {
......@@ -179,7 +185,7 @@ class OrganisationsController extends AppController {
}
if ($this->request->is(['post', 'put'])) {
if('Back' === Hash::get($this->request->data, 'submit')) {
if ('Back' === Hash::get($this->request->data, 'submit')) {
$this->redirect($this->Referers->get());
}
}
......@@ -250,7 +256,7 @@ class OrganisationsController extends AppController {
}
if ($this->request->is(['post', 'put'])) {
if('Cancel' === Hash::get($this->request->data, 'submit')) {
if ('Cancel' === Hash::get($this->request->data, 'submit')) {
$this->redirect($this->Referers->get());
}
......@@ -282,7 +288,7 @@ class OrganisationsController extends AppController {
} else {
$this->request->data = $this->Organisation->findById($id);
if(true === empty($this->request->data)) {
if (true === empty($this->request->data)) {
$this->Session->setFlash(__d('organisation', 'organisation.flasherrorEntiteInexistant'), 'flasherror');
$this->redirect([
......@@ -544,7 +550,7 @@ class OrganisationsController extends AppController {
$id = $this->request->data['Organisation']['organisationcible'];
}
if ($id === 'null' ) {
if ($id === 'null') {
$id = trim((string)Hash::get($this->request->data, 'Organisation.organisationcible'));
$id = $id === '' ? null : $id;
}
......@@ -632,7 +638,7 @@ class OrganisationsController extends AppController {
]);
} else {
$this->Session->write('Droit.liste', $result);
if ($controller != null && $action != null) {
$this->redirect([
'controller' => $controller,
......@@ -647,7 +653,7 @@ class OrganisationsController extends AppController {
/**
* Création du responsable lors de la création d'une nouvelle entité
*
*
* @param int $idOrganisation | id de l'organisation créé
* @return type
*/
......@@ -663,7 +669,7 @@ class OrganisationsController extends AppController {
if (empty($responsable)) {
$this->Responsable->create([
'nomresponsable' => $this->request->data('Organisation.nomresponsable') ,
'nomresponsable' => $this->request->data('Organisation.nomresponsable'),
'prenomresponsable' => $this->request->data('Organisation.prenomresponsable'),
'emailresponsable' => $this->request->data('Organisation.emailresponsable'),
'telephoneresponsable' => $this->request->data('Organisation.telephoneresponsable'),
......@@ -678,19 +684,19 @@ class OrganisationsController extends AppController {
'createdbyorganisation' => $idOrganisation
]);
$success = $success && false !== $this->Responsable->save(null, ['atomic' => false]);
if ($success == true) {
$success = $success && $this->Organisation->updateAll([
'responsable_id' => $this->Responsable->id
], [
'id' => $idOrganisation
]) !== false;
'responsable_id' => $this->Responsable->id
], [
'id' => $idOrganisation
]) !== false;
}
}
return $success;
}
/**
* @param int|null $id
*
......@@ -716,7 +722,7 @@ class OrganisationsController extends AppController {
ListeDroit::CONSULTER_ARTICLE_FAQ
]
],
[
[
'Role' => [
'libelle' => 'Valideur',
'organisation_id' => $id
......@@ -728,7 +734,7 @@ class OrganisationsController extends AppController {
ListeDroit::CONSULTER_ARTICLE_FAQ
]
],
[
[
'Role' => [
'libelle' => 'Consultant',
'organisation_id' => $id
......@@ -739,7 +745,7 @@ class OrganisationsController extends AppController {
ListeDroit::CONSULTER_ARTICLE_FAQ
]
],
[
[
'Role' => [
'libelle' => 'Administrateur',
'organisation_id' => $id
......@@ -790,16 +796,16 @@ class OrganisationsController extends AppController {
}
}
}
if ($success == true) {
return(true);
return (true);
} else {
$this->Session->setFlash(__d('default', 'default.flasherrorEnregistrementErreur'), 'flasherror');
return(false);
return (false);
}
}
}
protected function _insertTacheAuto($id)
{
$crons = [
......@@ -825,14 +831,14 @@ class OrganisationsController extends AppController {
$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 $success;
}
/**
* @fixme: dans l'entité/l'organisation
*/
......@@ -841,9 +847,9 @@ class OrganisationsController extends AppController {
if (true !== ($this->Droits->authorized(ListeDroit::CREER_UTILISATEUR) || $this->Droits->isSu())) {
throw new ForbiddenException(__d('default', 'default.flasherrorPasDroitPage'));
}
$this->set('title', __d('organisation', 'organisation.titrePolitiquePassword'));
if ($this->request->is('post') || $this->request->is('put')) {
if ('Cancel' === Hash::get($this->request->data, 'submit')) {
$this->redirect($this->Referers->get());
......@@ -851,8 +857,8 @@ class OrganisationsController extends AppController {
$this->Organisation->id = $this->Session->read('Organisation.id');
$success = $this->Organisation->saveField('force', Hash::get($this->request->data, 'Organisation.force'));
if(false !== $success) {
if (false !== $success) {
$this->Session->setFlash(__d('organisation', 'organisation.flashsuccessForcePasswordEnregistrer'), 'flashsuccess');
$this->redirect($this->Referers->get());
} else {
......@@ -861,7 +867,7 @@ class OrganisationsController extends AppController {
}
if (empty($this->request->data) === true) {
$this->request->data = $this->Organisation->find('first',[
$this->request->data = $this->Organisation->find('first', [
'conditions' => [
'id' => $this->Session->read('Organisation.id')
],
......@@ -870,7 +876,7 @@ class OrganisationsController extends AppController {
]
]);
}
// $genereteAnssiPasswd = PasswordAnssi::generate();
// debug($genereteAnssiPasswd);
//
......@@ -903,9 +909,9 @@ class OrganisationsController extends AppController {
// }
// debug($exemples);
}
/**
*
*
* @param type $id
*/
public function administrer()
......@@ -913,14 +919,12 @@ class OrganisationsController extends AppController {
if ($this->Droits->isSu() !== true) {
throw new ForbiddenException(__d('default', 'default.flasherrorPasDroitPage'));
}
$this->set('title', __d('default', 'default.titreAdministration') . ': ' . $this->Session->read('Organisation.raisonsociale'));
}
/**
* Gère l'édition d'une organisation
*
* @param int $id
* Affichage politique de configentialité
*
* @access public
*
......@@ -928,46 +932,119 @@ class OrganisationsController extends AppController {
* @created 06/03/2019
* @version V1.0.2
*/
public function politiquedeconfidentialite($id)
public function politiquedeconfidentialite()
{
if (true == ($this->Droits->authorized($this->Droits->isSu()))) {
throw new ForbiddenException(__d('default', 'default.flasherrorPasDroitPage'));
}
$organisation = $this->Organisation->find('first', [
$this->set('title', __d('organisation', 'organisation.titrePolitiqueDeConfidentialite'));
$query = [
'conditions' => [
'Organisation.id' => $id
'rgpd' => true
],
'fields' => [
'id',
'raisonsociale',
'adresse',
'siret',
'ape',
'civiliteresponsable',
'nomresponsable',
'prenomresponsable',
'fonctionresponsable',
'numerodpo',
'dpo'
'Organisation.id',
'Organisation.raisonsociale',
'Organisation.telephone',
'Organisation.adresse',
'Organisation.email',
'Organisation.sigle',
'Organisation.siret',
'Organisation.ape',
'Organisation.responsable_nom_complet',
'Organisation.fonctionresponsable',
'Organisation.dpo',
'Organisation.numerodpo',
'Dpo.email'
],
'contain' => [
'Dpo' => [
'fields' => [
'nom_complet' => $this->Organisation->Dpo->getVirtualFieldSql('nom_complet')
]
]
]
]);
// debug($organisation);
];
$organisationResponsableRGPD = $this->Organisation->find('first', $query);
$this->set('title', __d('organisation', 'organisation.titrePolitiqueDeConfidentialite') . $organisation['Organisation']['raisonsociale']);
$this->set(compact('organisationResponsableRGPD'));
}
$userDPO = $this->User->find('first', [
'conditions' => [
'id' => $organisation['Organisation']['dpo']
],
/**
*
*/
public function gestionrgpd()
{
if (false == ($this->Droits->authorized($this->Droits->isSu()))) {
throw new ForbiddenException(__d('default', 'default.flasherrorPasDroitPage'));
}
$this->set('title', __d('organisation', 'organisation.titreEntiteeResponsablePlateForme'));
if ($this->request->is('post') || $this->request->is('put')) {
if ('Cancel' === Hash::get($this->request->data, 'submit')) {
$this->redirect($this->Referers->get());
}
// Tentative de sauvegarde
$this->Organisation->begin();
$success = true;
$idOrganisationRGPDSelect = $this->request->data('Organisation.rgpd');
if (empty($idOrganisationRGPDSelect)) {
$success = false;
}
$rgpdTrue = $this->Organisation->find('all', [
'fields' => [
'Organisation.id'
],
'conditions' => [
'Organisation.rgpd' => true
]
]);
if (!empty($rgpdTrue)) {
foreach ($rgpdTrue as $rgpdTrueEntiteid) {
$this->Organisation->id = $rgpdTrueEntiteid['Organisation']['id'];
$success = false !== $this->Organisation->save(['rgpd' => false]) && $success;
}
}
if ($success === true) {
$this->Organisation->id = $idOrganisationRGPDSelect;
$success = false !== $this->Organisation->save(['rgpd' => true]) && $success;
}
if ($success === true) {
$this->Organisation->commit();
$this->Session->setFlash(__d('organisation', 'organisation.flashsuccessEntiteeResponsablePlateFormeEnregistrer'), 'flashsuccess');
$this->redirect($this->Referers->get());
} else {
$this->Organisation->rollback();
$this->Session->setFlash(__d('organisation', 'organisation.flasherrorErreurEnregistrementSEF'), 'flasherror');
}
}
$listeOrganisations = $this->Organisation->find('list');
$organisationRGPD = $this->Organisation->find('first', [
'fields' => [
'nom_complet',
'email',
'telephonefixe'
'Organisation.id'
],
'conditions' => [
'Organisation.rgpd' => true
]
]);
// debug($userDPO);
$this->set(compact('organisation'));
if (empty($organisationRGPD['Organisation']['id'])) {
$organisationRGPD = null;
}
$this->set(compact('listeOrganisations', 'organisationRGPD'));
}
}
......@@ -198,6 +198,9 @@ msgstr "Gestion de tous les sous-traitants"
msgid "default.sousTitreGestionTousResponsable"
msgstr "Gestion de tous les responsables"
msgid "default.sousTitreGestionPolitiqueConfidentialite"
msgstr "Gestion de la politique de confidentialité"
msgid "default.sousTitreChecksIndex"
msgstr "Vérification de l'application"
......
......@@ -21,7 +21,10 @@ msgid "organisation.titrePolitiquePassword"
msgstr "Politique des mots de passe dans l'entité"
msgid "organisation.titrePolitiqueDeConfidentialite"
msgstr "Politique de confidentialité dans l'entité : "
msgstr "Politique de confidentialité"
msgid "organisation.titreEntiteeResponsablePlateForme"
msgstr "Entité responsable de la plate-forme"
###################### Session->setFlash ######################
......@@ -43,6 +46,9 @@ msgstr "L'entité n'existe pas"
msgid "organisation.flashsuccessEntiteModifier"
msgstr "L'entité a été modifiée"
msgid "organisation.flashsuccessEntiteeResponsablePlateFormeEnregistrer"
msgstr "L'entité responsable de la plate forme a été enregistrée"
msgid "organisation.flasherrorErreurMoficationEntite"
msgstr "Une erreur s'est produite lors de la modification de l'entité"
......@@ -282,10 +288,10 @@ msgstr "Cette difficulté dépend du nombre de caractères et du nombre de symbo
###############################################################################
####################: View/Organisations/politiquedeconfidentialite.ctp ####################
#####################: View/Organisations/gestionrgpd.ctp #####################
msgid "organisation.soustitreArticle6"
msgstr "Article 6 - Liens hypertextes"
msgid "organisation.champEntiteResponsableRGPD"
msgstr "Selectionnez l'entité gestionnaire de la plate-forme"
###############################################################################
......
......@@ -3,15 +3,15 @@
/**
* Model AppModel
*
* web-DPO : Outil de gestion de vos traitements dans le cadre de la
* 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
......@@ -24,13 +24,14 @@ App::uses('Model', 'Model');
App::uses('FrValidation', 'Validation');
App::uses('Validation', 'Utility');
class AppModel extends Model {
class AppModel extends Model
{
public $recursive = -1;
/**
* Behaviors utilisés par le modèle.
*
*
* ATTENTION: les behaviors utilisant le datasource PostgresPostgres sont
* chargés dans le constructeur pour éviter des erreurs avec le datasource
* LDAP.
......@@ -47,13 +48,14 @@ class AppModel extends Model {
protected $_appModelCache = [];
/**
*
*
* @param bool|int|string|array $id Set this ID for this model on startup,
* can also be an array of options, see above.
* @param string $table Name of database table to use.
* @param string $ds DataSource connection name.
*/
public function __construct($id = false, $table = null, $ds = null) {
public function __construct($id = false, $table = null, $ds = null)
{
parent::__construct($id, $table, $ds);
if (get_class($this->getDataSource()) === 'PostgresPostgres') {
$behaviors = [
......@@ -76,7 +78,8 @@ class AppModel extends Model {
*
* @return array
*/
public function enums() {
public function enums()
{
$cacheKey = $this->useDbConfig . '_' . __CLASS__ . '_enums_' . $this->alias;
// Dans le cache "live" ?
......@@ -92,7 +95,7 @@ class AppModel extends Model {
// D'autres champs avec la règle inList ?
foreach ($this->validate as $field => $validate) {
foreach ($validate as $ruleName => $rule) {
if (( $ruleName === 'inList' ) && !isset($this->_appModelCache[$cacheKey][$this->alias][$field])) {
if (($ruleName === 'inList') && !isset($this->_appModelCache[$cacheKey][$this->alias][$field])) {
$fieldNameUpper = strtoupper($field);
$tmp = $rule['rule'][1];
......@@ -111,7 +114,7 @@ class AppModel extends Model {
}
}
return (array) $this->_appModelCache[$cacheKey];
return (array)$this->_appModelCache[$cacheKey];
}
/**
......@@ -119,13 +122,14 @@ class AppModel extends Model {
* colonnes (comme lorsdqu'une table possède un INDEX UNIQUE sur plusieurs
* colonnes).
*
* @deprecated
*
* @param array $data Les données du champ envoyées à la validation
* @param array $fieldNames La liste des champs à contrôler
* @return type
* @deprecated
*
*/
public function isUniqueMultiple(array $data, array $fieldNames) {
public function isUniqueMultiple(array $data, array $fieldNames)
{
$query = [
'fields' => ["{$this->alias}.{$this->primaryKey}"],
'recursive' => -1,
......@@ -150,21 +154,25 @@ class AppModel extends Model {
/**
* "Surcharge" de la méthode Model::updateAll afin de retourner "true"
* lorsqu'il n'existe pas d'enregistrement répondant aux conditions.
*
*
* @param array $fields
* @param mixed $conditions
* @return boolean
*/
public function updateAllIfFound($fields, $conditions = true) {
public function updateAllIfFound($fields, $conditions = true)
{
return (
[] === $this->find('first', compact('conditions'))
|| parent::updateAll($fields, $conditions)