Commit 6375b200 authored by THEO GUILLON's avatar THEO GUILLON
Browse files

Merge branch '319-ajout-de-champ-en-relation-avec-un-traitement' into '1.2.0'

Resolve "Ajout de champ en relation avec un traitement"

See merge request web-DPO/web-DPO!296
parents 4d8e27bc cd478c87
......@@ -55,4 +55,27 @@ INSERT INTO etats (libelle, value, created, modified) VALUES
ALTER TABLE organisations DROP verrouiller;
--
-- Création de la table baselegales
--
CREATE TABLE baselegales (
id serial NOT NULL PRIMARY KEY,
libelle VARCHAR NOT NULL,
description VARCHAR NOT NULL,
created timestamp without time zone NOT NULL,
modified timestamp without time zone NOT NULL
);
CREATE UNIQUE INDEX baselegales_libelle_idx ON baselegales (libelle);
--
-- Insertion de valeur dans la table baselegales
--
INSERT INTO baselegales (libelle, description, created, modified) VALUES
('Le consentement', 'Article 6 1. a) : La personne concernée a consenti au traitement de ses données à caractère personnel pour une ou plusieurs finalités spécifiques.', NOW(), NOW()),
('Le contrat', 'Article 6 1. b) : Le traitement est nécessaire à l''exécution d''un contrat auquel la personne concernée est partie ou à l''exécution de mesures précontractuelles prises à la demande de celle-ci.', NOW(), NOW()),
('L’obligation légale', 'Article 6 1. c) : Le traitement est nécessaire au respect d''une obligation légale à laquelle le responsable du traitement est soumis.', NOW(), NOW()),
('La sauvegarde des intérêts vitaux', 'Article 6 1. d) : Le traitement est nécessaire à la sauvegarde des intérêts vitaux de la personne concernée ou d''une autre personne physique.', NOW(), NOW()),
('L’intérêt public', 'Article 6 1. e) : Le traitement est nécessaire à l''exécution d''une mission d''intérêt public ou relevant de l''exercice de l''autorité publique dont est investi le responsable du traitement.', NOW(), NOW()),
('Les intérêts légitimes', 'Article 6 1. f) : Le traitement est nécessaire aux fins des intérêts légitimes poursuivis par le responsable du traitement ou par un tiers, à moins que ne prévalent les intérêts ou les libertés et droits fondamentaux de la personne concernée qui exigent une protection des données à caractère personnel, notamment lorsque la personne concernée est un enfant.<br /><br />Le point f) du premier alinéa ne s''applique pas au traitement effectué par les autorités publiques dans l''exécution de leurs missions.', NOW(), NOW());
COMMIT;
......@@ -40,17 +40,17 @@
class EmailConfig {
public $default = [
'transport' => 'Mail',
'transport' => 'Smtp',
'from' => 'you@localhost',
//'charset' => 'utf-8',
//'headerCharset' => 'utf-8',
'charset' => 'utf-8',
'headerCharset' => 'utf-8',
];
public $email = [
'transport' => 'Mail',
'transport' => 'Smtp',
'from' => 'ne-pas-repondre@web-dpo.fr',
//'replyTo' => 'noreply@collectivite',
'host' => 'mail',
'replyTo' => 'ne-pas-repondre@web-dpo.fr',
'host' => 'localhost',
'port' => 25,
'timeout' => 30,
// 'username' => '',
......
......@@ -58,7 +58,8 @@ class FichesController extends AppController
'TraitementRegistre',
'User',
'Valeur',
'WebdpoFiche'
'WebdpoFiche',
'Baselegale'
];
/**
......@@ -242,6 +243,8 @@ class FichesController extends AppController
$this->redirect($this->Referers->get());
}
// debug($this->request->data);die;
$success = true;
$this->Fiche->begin();
......@@ -342,6 +345,8 @@ class FichesController extends AppController
'{n}.Norme.description'
);
$this->getBaseLegales();
$soustraitance = $this->Formulaire->find('first', [
'conditions' => [
'id' => $id
......@@ -586,6 +591,8 @@ class FichesController extends AppController
$this->set(compact('descriptions_normes'));
$this->set('norme_id', $idForm['Fiche']['norme_id']);
$this->getBaseLegales();
$soustraitance = $this->Formulaire->find('first', [
'conditions' => [
'id' => $idForm['Fiche']['form_id']
......@@ -615,6 +622,8 @@ class FichesController extends AppController
$this->redirect($this->Referers->get());
}
// debug($this->request->data);die;
$success = true;
$this->Valeur->begin();
......@@ -826,6 +835,8 @@ class FichesController extends AppController
$responsables = $this->_responsables();
$this->getBaseLegales();
$this->set(compact('soustraitance', 'valeurs', 'champs', 'id', 'filesSave', 'responsables', 'showRegistre'));
}
......@@ -1712,4 +1723,23 @@ class FichesController extends AppController
$this->redirect($this->Referers->get());
}
}
private function getBaseLegales()
{
$baseLegales = $this->Baselegale->find('all');
$options_baseLegales = Hash::combine(
$baseLegales,
'{n}.Baselegale.id',
'{n}.Baselegale.libelle'
);
$descriptions_baseLegale = Hash::combine(
$baseLegales,
'{n}.Baselegale.id',
'{n}.Baselegale.description'
);
$this->set(compact('options_baseLegales', 'descriptions_baseLegale'));
}
}
......@@ -308,6 +308,21 @@ msgstr "Adresse de la structure du co-responsable"
msgid "fiche.champEmailstructure"
msgstr "E-mail de la structure du co-responsable"
msgid "fiche.ongletInformationComplementaire"
msgstr "Information complémentaire"
msgid "fiche.textInfoTraitementComplementaire"
msgstr "Information complémentaire concernant le traitement :"
msgid "fiche.champBaselegale"
msgstr "Base légale"
msgid "fiche.champDecisionAutomatisee"
msgstr "Prise de décision automatisée sur le traitement ?"
msgid "fiche.champDescriptionDecisionAutomatisee"
msgstr "Décrivez la prise de décision automatisée"
###############################################################################
......
......@@ -220,4 +220,7 @@ msgstr "Co-responsable"
msgid "modele.sousTitreSoustraitant"
msgstr "Sous-traitant"
msgid "modele.sousTitreVariableInformationComplementaireTraitement"
msgstr "Information complémentaire du traitement"
###############################################################################
......@@ -96,6 +96,10 @@ class Fiche extends AppModel {
'Champ' => [
'className' => 'Champ',
'foreignKey' => 'formulaires_id'
],
'Baselegale' => [
'className' => 'Baselegale',
'foreignKey' => 'id'
]
];
......@@ -390,7 +394,7 @@ class Fiche extends AppModel {
'fiche_id' => $id
],
'fields' => [
'valeur',
'valeur',
'champ_name'
]
]);
......@@ -401,7 +405,7 @@ class Fiche extends AppModel {
],
'fields' => [
'created',
'modified',
'modified',
'norme_id'
]
]);
......@@ -476,6 +480,11 @@ class Fiche extends AppModel {
}
}
$champsInformationComplementaire = [
'sousFinalite',
'baselegale'
];
/**
* On vérifie que le tableau qu'on a créé juste au dessus existe.
* Si il exite on on prend la valeur de l'id choisit dans le tableau,
......@@ -496,6 +505,40 @@ class Fiche extends AppModel {
'type' => 'text'
];
}
} elseif (in_array($value['Valeur']['champ_name'], $champsInformationComplementaire)) {
if ($value['Valeur']['champ_name'] === 'sousFinalite') {
foreach (json_decode($value['Valeur']['valeur']) as $key => $val) {
$donnees[$value['Valeur']['champ_name']][$key]['valeur_' . $value['Valeur']['champ_name']] = [
'value' => $val,
'type' => 'text'
];
}
}
if ($value['Valeur']['champ_name'] === 'baselegale') {
$baseLegales = $this->Baselegale->find('all', [
'conditions' => [
'id' => json_decode($value['Valeur']['valeur'])
],
'fields' => [
'id',
'libelle',
'description'
]
]);
foreach ($baseLegales as $key => $val) {
$donnees[$value['Valeur']['champ_name']][$key]['valeur_' . $value['Valeur']['champ_name']] = [
'value' => $val['Baselegale']['libelle'],
'type' => 'text'
];
$donnees[$value['Valeur']['champ_name'].'description'][$key]['valeur_' . $value['Valeur']['champ_name'].'description'] = [
'value' => $val['Baselegale']['description'],
'type' => 'text'
];
}
}
} else {
$donnees['valeur_' . $value['Valeur']['champ_name']] = [
'value' => $value['Valeur']['valeur'],
......
......@@ -127,6 +127,12 @@ class WebdpoFiche extends AppModel {
]
],
// ---------------------------------------------------------------------
'descriptionDecisionAutomatisee' => [
'checkNotBlankIf' => [
'rule' => ['checkNotBlankIf', 'decisionAutomatisee', true, ['1']]
]
],
// ---------------------------------------------------------------------
'soustraitantid' => [
'checkNotBlankIf' => [
'rule' => ['checkNotBlankIf', 'soustraitant', true, ['1']]
......
<?php
$idSousFinalite = null;
$afterSousFinalite = '<a href="#" class="removeclass"><span class="fa fa-trash fa-lg fa-danger"><!----></span></a></div>';
$viewBtnAddSousFinalite = true;
if ($this->request->params['action'] === 'show') {
$afterSousFinalite = '</div>';
$viewBtnAddSousFinalite = false;
}
?>
<!-- Onglet Information sur l'entité -->
<div id="information_complementaire" class="tab-pane">
<br/>
<!-- Information concernant le traitement -->
<div class="col-md-12">
<span class='labelFormulaire'>
<?php
echo __d('fiche', 'fiche.textInfoTraitementComplementaire');
?>
</span>
<div class="row row35"></div>
</div>
<div class="row">
<!-- Colonne de gauche -->
<div class="col-md-6">
<div id="InputsWrapper">
<?php
if (isset($this->request->data['Fiche']['sousFinalite'])) {
foreach ($this->request->data['Fiche']['sousFinalite'] as $key => $sousFinalite) {
$idSousFinalite = $key + 1 ;
$label = 'Sous finalité ' . $idSousFinalite;
echo $this->WebcilForm->input('sousFinalite_'.$idSousFinalite, [
'id' => 'sousFinalite_'.$idSousFinalite,
'value' => $sousFinalite,
'name' => 'data[Fiche][sousFinalite][]',
'label' => [
'text' => $label,
'class' => 'col-md-4 control-label'
],
'placeholder' => false,
'after' => $afterSousFinalite
]);
}
}
?>
</div>
<?php
if ($viewBtnAddSousFinalite === true) {
?>
<div id="AddMoreFileId">
<a id="AddMoreFileBox" class="btn btn-info">Ajouter une sous-finalité</a>
<br><br>
</div>
<?php
}
?>
<div id="lineBreak"></div>
</div>
<!-- Colonne de droite -->
<div class="col-md-6">
</div>
</div>
<div class="row">
<!-- Colonne de gauche -->
<div class="col-md-6">
<?php
echo $this->WebcilForm->inputs([
'baselegale' => [
'id' => 'baselegale',
'multiple' => 'checkbox',
'class' => 'checkbox',
'options' => $options_baseLegales,
'div' => "input select"
],
'decisionAutomatisee' => [
'id' => 'decisionAutomatisee',
// 'options' => [
// true => 'Oui',
// false => 'Non'
// ],
'options' => [
'Oui' => 'Oui',
'Non' => 'Non'
],
'class' => 'transformSelect form-control',
'empty' => true,
'placeholder' => false,
'data-placeholder' => ' '
]
]);
?>
</div>
<!-- Colonne de droite -->
<div class="col-md-6">
<?php
echo $this->WebcilForm->inputs([
'descriptionBaseLegale' => [
'id' => 'descriptionBaseLegale',
'type' => 'textarea',
'readonly' => true,
'placeholder' => false
],
'descriptionDecisionAutomatisee' => [
'id' => 'descriptionDecisionAutomatisee',
'type' => 'textarea',
'required' => true,
'placeholder' => false
]
]);
?>
</div>
</div>
</div>
<script type="text/javascript">
$(document).ready(function() {
var actionForm = <?php echo json_encode($this->request->params['action']);?>;
var idField = 1; // to keep track of text box added
if (actionForm === 'edit') {
var key = <?php echo json_encode($idSousFinalite); ?>;
idField = key;
}
//on add input button click
$('#AddMoreFileBox').click(function (e) {
//add input box
$('#InputsWrapper').append('<div class="form-group"><label for="sousfinalite" class="col-md-4 control-label">Sous finalité '+idField+'</label><div class="col-md-8"><input name="data[Fiche][sousFinalite][]" id="sousFinalite_'+ idField +'" class="form-control" type="text"><a href="#" class="removeclass"><span class="fa fa-trash fa-lg fa-danger"><!----></span></a></div></div>');
idField++;
});
//user click on remove text
$("body").on("click",".removeclass", function(e) {
var idInputDelete = $(this).siblings().first().attr('id');
var intIdInputDelete = parseInt(idInputDelete.substr(idInputDelete.indexOf("_") + 1));
var i = intIdInputDelete + 1;
$(this).parent('div').parent('div').remove(); //remove text box
while (i <= idField) {
var newValue = (i - 1);
$('#sousFinalite_'+i).parent('div').siblings().first().text('Sous finalité '+ newValue);
$('#sousFinalite_'+i).attr('id', 'sousFinalite_'+newValue);
i++;
}
idField--;
})
// Partie concernant les champs sur la decision automatisee
displayDescriptionDecisionAutomatisee($('#decisionAutomatisee').val());
var descriptionsBaseLegale = <?php echo json_encode($descriptions_baseLegale); ?>;
$('#decisionAutomatisee').change(function () {
var select = $(this).val();
displayDescriptionDecisionAutomatisee(select);
});
});
function displayDescriptionDecisionAutomatisee(val){
if (val == 'Oui') {
$('#descriptionDecisionAutomatisee').parent().parent().show();
} else {
$('#descriptionDecisionAutomatisee').parent().parent().hide();
$('#descriptionDecisionAutomatisee').val('');
}
}
</script>
\ No newline at end of file
......@@ -55,6 +55,15 @@ echo $this->WebcilForm->create('Fiche', [
</a>
</li>
<li>
<a href="#information_complementaire" role="tab" data-toggle="tab">
<i class="fa fa-pencil fa-fw"><!----></i>
<?php
echo __d('fiche', 'fiche.ongletInformationComplementaire');
?>
</a>
</li>
<?php
if ($soustraitance['Formulaire']['soustraitant'] === true) {
?>
......@@ -334,6 +343,9 @@ echo $this->WebcilForm->create('Fiche', [
<!-- Fin onglet Information concernant le traitement-->
<?php
// Onglet information complémentaire
echo $this->element("Fiches/ongletComplementaire");
// Onglet sous-traitant
echo $this->WebcilForm->input('soustraitantid', [
'id' => 'soustraitantid_hidden',
......
......@@ -55,6 +55,15 @@ echo $this->WebcilForm->create('Fiche', [
</a>
</li>
<li>
<a href="#information_complementaire" role="tab" data-toggle="tab">
<i class="fa fa-pencil fa-fw"><!----></i>
<?php
echo __d('fiche', 'fiche.ongletInformationComplementaire');
?>
</a>
</li>
<?php
if ($soustraitance['Formulaire']['soustraitant'] === true) {
?>
......@@ -307,6 +316,9 @@ echo $this->WebcilForm->create('Fiche', [
<!-- Fin onglet Information concernant le traitement-->
<?php
// Onglet information complémentaire
echo $this->element("Fiches/ongletComplementaire");
// Onglet sous-traitant
echo $this->WebcilForm->input('soustraitantid', [
'id' => 'soustraitantid_hidden',
......
......@@ -23,6 +23,16 @@ echo $this->WebcilForm->create('Fiche', [
</a>
</li>
<li>
<a href="#information_complementaire" role="tab" data-toggle="tab">
<i class="fa fa-eye fa-fw"><!----></i>
<?php
echo __d('fiche', 'fiche.ongletInformationComplementaire');
?>
</a>
</li>
<?php
if ($soustraitance['Formulaire']['soustraitant'] === true) {
?>
......@@ -313,8 +323,11 @@ echo $this->WebcilForm->create('Fiche', [
</div>
<!-- Fin onglet Information concernant le traitement-->
<!-- Onglet sous-traitant -->
<?php
// Onglet information complémentaire
echo $this->element("Fiches/ongletComplementaire");
// Onglet sous-traitant
if ($soustraitance['Formulaire']['soustraitant'] === true) {
?>
<div id="soustraitant" class="tab-pane">
......
......@@ -390,6 +390,173 @@ if (!empty($valeurPropreTraitement['soustraitant'])) {
}
?>
<!-- Tableau des variables du formulaire -->
<table class="table">
<h4>
<?php
echo __d('modele', 'modele.sousTitreVariableInformationComplementaireTraitement');
?>
</h4>
<thead>
<tr>
<th class="thleft col-md-5">
<?php
echo __d('modele', 'modele.titreTableauNomChamp');
?>
</th>
<th class="thleft col-md-2">
<?php
echo "Section";
?>
</th>
<th class="thleft col-md-3">
<?php
echo __d('modele', 'modele.titreTableauNomVariable');
?>
</th>
<th class="thleft col-md-5">
<?php
echo __d('modele', 'modele.titreTableauType');
?>
</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tdleft">
<?php
echo 'Sous finalité';
?>
</td>
<td class="tdleft">
<?php
echo "sousFinalite";
?>
</td>
<td class="tdleft">
<?php
echo "valeur_sousFinalite";
?>
</td>
<td class="tdleft">
<?php
echo __d('modele', 'modele.textPetitChamp');
?>
</td>
</tr>
<tr>
<td class="tdleft">
<?php
echo 'Base légale';
?>
</td>
<td class="tdleft">
<?php
echo "baselegale";
?>
</td>
<td class="tdleft">
<?php
echo "valeur_baselegale";
?>
</td>
<td class="tdleft">
<?php
echo __d('modele', 'modele.textCheckboxChamp');
?>
</td>
</tr>