Commit 50719608 authored by tguillon's avatar tguillon
Browse files

Ajout : PIA

parent 7b649dda
......@@ -72,6 +72,7 @@ ALTER TABLE formulaires ADD COLUMN usedecisionautomatisee BOOLEAN DEFAULT FALSE;
ALTER TABLE formulaires ADD COLUMN usetransferthorsue BOOLEAN DEFAULT FALSE;
ALTER TABLE formulaires ADD COLUMN usedonneessensible BOOLEAN DEFAULT FALSE;
ALTER TABLE formulaires ADD COLUMN useallextensionfiles BOOLEAN DEFAULT FALSE;
ALTER TABLE formulaires ADD COLUMN usepia BOOLEAN DEFAULT FALSE;
ALTER TABLE formulaires ADD COLUMN oldformulaire BOOLEAN DEFAULT FALSE;
UPDATE formulaires SET oldformulaire = true;
......@@ -105,7 +106,9 @@ ALTER TABLE fiches
DROP CONSTRAINT fiches_form_id_fkey,
ADD CONSTRAINT fiches_form_id_fkey FOREIGN KEY (form_id) REFERENCES formulaires (id) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE fiches ADD COLUMN soustraitance BOOL NOT NULL DEFAULT FALSE;
ALTER TABLE fiches ADD COLUMN obligation_pia BOOL;
ALTER TABLE fiches ADD COLUMN realisation_pia BOOL NOT NULL DEFAULT FALSE;
ALTER TABLE fiches ADD COLUMN depot_pia BOOL NOT NULL DEFAULT FALSE;
--
-- on passe le champ concernant la soutraitance à true en fonction si la fiche à un soustraitant
......
......@@ -236,8 +236,6 @@ class FichesController extends AppController
$this->redirect($this->Referers->get());
}
// debug($this->request->data);die;
$success = true;
$this->Fiche->begin();
......@@ -245,8 +243,6 @@ class FichesController extends AppController
$data['Fiche']['user_id'] = $this->Auth->user('id');
$data['Fiche']['form_id'] = $formulaire_id;
$data['Fiche']['organisation_id'] = $this->Session->read('Organisation.id');
// $data['Fiche']['norme_id'] = $this->request->data['Fiche']['norme'];
// unset($data['Fiche']['norme'], $data['Fiche']['descriptionNorme']);
$formulaireFields = $this->Champ->find('all', [
'conditions' => [
......@@ -258,7 +254,22 @@ class FichesController extends AppController
'champ_soustraitant'
]
]);
$success = $this->WebdpoFiche->saveWithVirtualFields($data, $formulaireFields, false, true);
$formulaireOptions = $this->Formulaire->find('first', [
'conditions' => [
'id' => $formulaire_id
],
'fields' => [
'usesousfinalite',
'usebaselegale',
'usedecisionautomatisee',
'usetransferthorsue',
'usedonneessensible',
'usepia'
]
]);
$success = $this->WebdpoFiche->saveWithVirtualFields($data, $formulaireFields, $formulaireOptions, false, true);
if ($success == true) {
$last = $this->Fiche->getLastInsertID();
......@@ -544,8 +555,6 @@ class FichesController extends AppController
$this->redirect($this->Referers->get());
}
// debug($this->request->data);die;
$success = true;
$this->Fiche->begin();
......@@ -670,250 +679,6 @@ class FichesController extends AppController
$this->view = 'add';
}
// /**
// * Modification d'un traitement
// *
// * @param int $id
// *
// * @access public
// *
// * @created 17/06/2015
// * @version V1.0.0
// *
// * @modified 27/02/2020
// * @version v1.2.0
// * @author Théo GUILLON <theo.guillon@libriciel.coop>
// */
// public function edit($id)
// {
// if (!$this->Droits->isEditable($id)) {
// $this->Session->setFlash(__d('fiche', 'fiche.flasherrorPasAccesTraitement'), 'flasherror');
// $this->redirect($this->Referers->get());
// }
//
// if (empty($this->Session->read($this->Session->read('Auth.User.uuid')))) {
// $files = array_diff(scandir(CHEMIN_PIECE_JOINT_TMP . $this->Session->read('Auth.User.id') . DS . $this->Session->read('Auth.User.uuid')), array('..', '.'));
// $this->set('files', $files);
// }
//
// if ($this->Droits->existDPO() === false) {
// throw new ForbiddenException("Aucun DPO n'a été défini pour votre entité. Veuillez contacter votre administrateur.");
// }
//
// if (!$id && !$this->request->data['Fiche']['id']) {
// $this->Session->setFlash(__d('default', 'default.flasherrorTraitementInexistant'), 'flasherror');
// $this->redirect($this->Referers->get());
// }
//
// if (!$id) {
// $id = $this->request->data['Fiche']['id'];
// }
//
// $nameTraiment = $this->Valeur->find('first', [
// 'conditions' => [
// 'fiche_id' => $id,
// 'champ_name' => 'outilnom'
// ]
// ]);
// $this->set('title', __d('fiche', 'fiche.titreEditionFiche') . $nameTraiment['Valeur']['valeur']);
//
// if ($this->request->is(['POST', 'PUT'])) {
// if ('Cancel' === Hash::get($this->request->data, 'submit')) {
// if (!empty($this->Session->read('Auth.User.uuid'))) {
// $this->Session->delete('Auth.User.uuid');
// }
//
// $this->redirect($this->Referers->get());
// }
//
//// debug($this->request->data);die;
//
// $success = true;
// $this->Valeur->begin();
//
//// $this->Fiche->id = $id;
//
// $data = $this->request->data;
//
// unset($data['Fiche']['declarantpersonnenom'],
// $data['Fiche']['declarantservice'],
// $data['Fiche']['declarantpersonneportable'],
// $data['Fiche']['declarantpersonneemail'],
// $data['Fiche']['declarantpersonnefix']
// );
//
// if (Hash::check($this->request->data, 'Fiche.formulaire_id')) {
// $data['Fiche']['form_id'] = Hash::get($this->request->data, 'Fiche.formulaire_id');
// }
// $data['Fiche']['id'] = $id;
// $data['Fiche']['organisation_id'] = $this->Session->read('Organisation.id');
// $data['Fiche']['norme_id'] = $this->request->data['Fiche']['norme'];
// unset($data['Fiche']['norme'], $data['Fiche']['descriptionNorme']);
//
// $form_id = $this->Fiche->find('first', [
// 'conditions' => [
// 'id' => $id
// ],
// 'fields' => [
// 'form_id'
// ]
// ]);
//
//// if ($success === true && $this->request->params['action'] === 'edit') {
//// $success = false !== $this->Valeur->deleteAll([
//// 'fiche_id' => $id
//// ]) && $success;
//// }
//
// $champs = $this->Champ->find('all', [
// 'conditions' => [
// 'formulaire_id' => $form_id['Fiche']['form_id']
// ],
// 'fields' => [
// 'details',
// 'champ_coresponsable',
// 'champ_soustraitant'
// ]
// ]);
// $success = $this->WebdpoFiche->saveWithVirtualFields($data, $champs);
//
// if ($success == true) {
// if ($success == true) {
// $etatTraitement = $this->EtatFiche->find('first', [
// 'conditions' => [
// 'fiche_id' => $data['Fiche']['id'],
// 'actif' => true
// ],
// 'fields' => [
// 'etat_id'
// ]
// ]);
//
// if ($etatTraitement['EtatFiche']['etat_id'] === EtatFiche::MODIFICATION_TRAITEMENT_REGISTRE) {
// $texteHistorique = __d('historique', 'historique.modifierTraitementRegistre');
// } else {
// $texteHistorique = __d('historique', 'historique.modifierTraitement');
// }
//
// $this->Historique->create([
// 'Historique' => [
// 'content' => $this->Auth->user('prenom') . ' ' . $this->Auth->user('nom') . ' ' . $texteHistorique,
// 'fiche_id' => $id
// ]
// ]);
// $success = false !== $this->Historique->save(null, ['atomic' => false]) && $success;
//
// if (isset($this->request->data['delfiles']) && !empty($this->request->data['delfiles'])) {
// foreach (array_unique($this->request->data['delfiles']) as $val) {
// $success = $success && $this->Fichier->deleteFichier($val);
// }
// }
//
// if (!empty($this->Session->read('Auth.User.uuid'))) {
// if ($success == true) {
// $useAllExtensionFiles = $this->Formulaire->find('first', [
// 'condititons' => [
// 'id' => $form_id['Fiche']['form_id']
// ],
// 'fields' => [
// 'useallextensionfiles'
// ]
// ]);
//
// $success = $success && false !== $this->Fichier->transfereSave(
// $id,
// $useAllExtensionFiles['Formulaire']['useallextensionfiles'],
// $this->Session->read('Auth.User.uuid'),
// $this->Session->read('Auth.User.id')
// );
// }
// }
// }
// }
//
// if ($success == true) {
// $this->Valeur->commit();
// $this->Session->setFlash(__d('fiche', 'fiche.flashsuccessTraitementModifier'), 'flashsuccess');
//
// $this->redirect($this->Referers->get());
// } else {
// $this->Valeur->rollback();
// $this->Session->setFlash(__d('fiche', 'Une erreur inattendue est survenue...'), 'flasherror');
// }
// }
//
// $fiche = $this->Fiche->find('first', [
// 'conditions' => [
// 'id' => $id
// ],
// 'fields' => [
// 'form_id',
// 'norme_id',
// 'coresponsable',
// 'coresponsableid',
// 'soustraitance',
// 'soustraitantid',
// ]
// ]);
//
// // On récupère en BDD les champs tous les champs du formulaire
// $this->getFormulaireFields($fiche['Fiche']['form_id']);
//
// // Récupère en BDD les normes. Renvoie les normes et les descriptions
// $this->getNormes();
//
// // Récupère les valeurs des champs du traitement
// $this->getValueFields($id);
//
// $this->getFilesSave($id);
//
// $formulaireOLD = $this->Formulaire->find('first', [
// 'conditions' => [
// 'id' => $fiche['Fiche']['form_id']
// ],
// 'fields' => [
// 'oldformulaire',
// 'soustraitant'
// ]
// ]);
//
// if ($formulaireOLD['Formulaire']['oldformulaire'] === true) {
// // Reprise des données de la version v1.1.0 pour la coresponsabilité
// $responsables = $this->_responsables();
// $this->set(compact('responsables'));
// $this->set('coresponsableid', $fiche['Fiche']['coresponsableid']);
//
// // Reprise des données de la version v1.1.0 pour la soustraitance
// if ($formulaireOLD['Formulaire']['soustraitant'] === true && $fiche['Fiche']['soustraitance'] === true) {
// $soustraitance = $this->Formulaire->find('first', [
// 'conditions' => [
// 'id' => $fiche['Fiche']['form_id']
// ],
// 'fields' => [
// 'soustraitant'
// ]
// ]);
//
// $soustraitants = $this->_soustraitants();
//
// $this->set(compact('soustraitance', 'soustraitants'));
// $this->set('soustraitantid', $fiche['Fiche']['soustraitantid']);
// }
// } else {
// // Récupére en BDD les options des champs défini lors de la création du formulaire
// $this->getOptionsFields($fiche['Fiche']['form_id']);
// }
//
// $this->request->data['Fiche']['norme_id'] = $fiche['Fiche']['norme_id'];
// $this->request->data['Fiche']['coresponsable'] = $fiche['Fiche']['coresponsable'];
// $this->request->data['Fiche']['soustraitance'] = $fiche['Fiche']['soustraitance'];
//
// $this->set(compact('formulaireOLD'));
// $this->set('formulaire_id', $fiche['Fiche']['form_id']);
//
// $this->view = 'add';
// }
/**
* Gère l'affichage d'une traitement
*
......@@ -2017,7 +1782,16 @@ class FichesController extends AppController
]
]);
$this->set(compact('useFieldsFormulaire', 'useAllExtensionFiles'));
$usePIA = $this->Formulaire->find('first', [
'conditions' => [
'id' => $formulaire_id
],
'fields' => [
'usepia'
]
]);
$this->set(compact('useFieldsFormulaire', 'useAllExtensionFiles', 'usePIA'));
}
/**
......
......@@ -483,7 +483,8 @@ class FormulairesController extends AppController {
'usedecisionautomatisee' => $data['Formulaire']['usedecisionautomatisee'],
'usetransferthorsue' => $data['Formulaire']['usetransferthorsue'],
'usedonneessensible' => $data['Formulaire']['usedonneessensible'],
'useallextensionfiles' => $data['Formulaire']['useallextensionfiles']
'useallextensionfiles' => $data['Formulaire']['useallextensionfiles'],
'usepia' => $data['Formulaire']['usepia']
]);
$success = false !== $this->Formulaire->save() && $success;
......@@ -681,7 +682,8 @@ class FormulairesController extends AppController {
'usedecisionautomatisee',
'usetransferthorsue',
'usedonneessensible',
'useallextensionfiles'
'useallextensionfiles',
'usepia'
]
]);
}
......
......@@ -342,3 +342,6 @@ msgstr "Champ obligatoire"
msgid "Validate::multiple"
msgstr "Champ obligatoire"
msgid "Validate::checkNotBlankIfAll"
msgstr "Champ obligatoire"
......@@ -368,6 +368,9 @@ msgstr "Information complémentaire concernant la sous-traitance(s) :"
msgid "fiche.champSoustraitance"
msgstr "Le traitement fait l'objet d'une sous-traitance ?"
msgid "fiche.ongletPia"
msgstr "AIPD"
###############################################################################
......@@ -415,3 +418,105 @@ msgid "fiche.champDescriptionDonneSensible"
msgstr "Durée De Conservation 1"
###############################################################################
#################################: onglet PIA #################################
msgid "fiche.champRessourcesHumaines"
msgstr "Traitements, mis en œuvre uniquement à des fins de ressources humaines et dans les conditions prévues par les textes applicables, pour la seule gestion du personnel des organismes qui emploient moins de 250 personnes, à l’exception du recours au profilage."
msgid "fiche.champRelationFournisseurs"
msgstr "Traitements de gestion de la relation fournisseurs."
msgid "fiche.champGestionElectoral"
msgstr "Traitements mis en œuvre dans les conditions prévues par les textes relatifs à la gestion du fichier électoral des communes."
msgid "fiche.champComitesEntreprise"
msgstr "Traitements destinés à la gestion des activités des comités d’entreprise et d’établissement."
msgid "fiche.champAssociation"
msgstr "Traitements mis en œuvre par une association, une fondation ou toute autre institution sans but lucratif pour la gestion de ses membres et de ses donateurs dans le cadre de ses activités habituelles dès lors que les données ne sont pas sensibles."
msgid "fiche.champSantePrisePatient"
msgstr "Traitements de données de santé nécessaires à la prise en charge d’un patient par un professionnel de santé exerçant à titre individuel au sein d’un cabinet médical, d’une officine de pharmacie ou d’un laboratoire de biologie médicale."
msgid "fiche.champAvocats"
msgstr "Traitements mis en œuvre par les avocats dans le cadre de l’exercice de leur profession à titre individuel."
msgid "fiche.champGreffiers"
msgstr "Traitements mis en œuvre par les greffiers des tribunaux de commerce aux fins d’exercice de leur activité."
msgid "fiche.champNotaires"
msgstr "Traitements mis en œuvre par les notaires aux fins d’exercice de leur activité notariale et de rédaction des documents des offices notariaux."
msgid "fiche.champCollectivitesAffairesScolaires"
msgstr "Traitements mis en œuvre par les collectivités territoriales et les personnes morales de droit public et de droit privé aux fins de gérer les services en matière d’affaires scolaires, périscolaires et de la petite enfance."
msgid "fiche.champControlesAcces"
msgstr "Traitements mis en œuvre aux seules fins de gestion des contrôles d’accès physiques et des horaires pour le calcul du temps de travail, en dehors de tout dispositif biométrique. A l’exclusion des traitements des données qui révèlent des données sensibles ou à caractère hautement personnel."
msgid "fiche.champEthylotests"
msgstr "Traitements relatifs aux éthylotests, strictement encadrés par un texte et mis en œuvre dans le cadre d’activités de transport aux seules fins d'empêcher les conducteurs de conduire un véhicule sous l'influence de l'alcool ou de stupéfiants."
#######################
msgid "fiche.champSanteMedicosociaux"
msgstr "Traitements de données de santé mis en œuvre par les établissements de santé ou les établissements médico-sociaux pour la prise en charge des personnes."
msgid "fiche.champDonneesGenetiques"
msgstr "Traitements portant sur des données génétiques de personnes dites « vulnérables » (patients, employés, enfants, etc.). "
msgid "fiche.champProfilsPersonnesGestionRh"
msgstr "Traitements établissant des profils de personnes physiques à des fins de gestion des ressources humaines"
msgid "fiche.champSurveillerConstanteEmployes"
msgstr "Traitements ayant pour finalité de surveiller de manière constante l’activité des employés concernés"
msgid "fiche.champGestionAlertesSocialeSanitaire"
msgstr "Traitements ayant pour finalité la gestion des alertes et des signalements en matière sociale et sanitaire"
msgid "fiche.champGestionAlertesProfessionnelle"
msgstr "Traitements ayant pour finalité la gestion des alertes et des signalements en matière professionnelle"
msgid "fiche.champDonneesSanteRegistre"
msgstr "Traitements des données de santé nécessaires à la constitution d’un entrepôt de données ou d’un registre"
msgid "fiche.champProfilageRuptureContrat"
msgstr "Traitements impliquant le profilage des personnes pouvant aboutir à leur exclusion du bénéfice d’un contrat ou à la suspension voire à la rupture de celui-ci"
msgid "fiche.champMutualisesManquementsRuptureContrat"
msgstr "Traitements mutualisés de manquements contractuels constatés, susceptibles d’aboutir à une décision d’exclusion ou de suspension du bénéfice d’un contrat"
msgid "fiche.champProfilageDonneesExternes"
msgstr "Traitements de profilage faisant appel à des données provenant de sources externes"
msgid "fiche.champBiometriques"
msgstr "Traitements de données biométriques aux fins d'identifierune personne physique de manière unique parmi lesquelles figurent des personnes dites « vulnérables » (élèves, personnes âgées, patients, demandeurs d’asile, etc.)"
msgid "fiche.champGestionLogementsSociaux"
msgstr "Instruction des demandes et gestion des logements sociaux"
msgid "fiche.champAccompagnementSocial"
msgstr "Traitements ayant pour finalité l’accompagnement social ou médico-social des personnes"
msgid "fiche.champLocalisationLargeEchelle"
msgstr "Traitements de données de localisation à large échelle"
#######################
msgid "fiche.champCriteres"
msgstr "Quelle critères le traitement remplit-il parmi les suivants ?"
msgid "fiche.champTraitementConsidereRisque"
msgstr "Considerez-vous que le traitement présente un risque élevé ?"
msgid "fiche.champObligationPia"
msgstr "Le traitement fait l'objet d'une obligation de réalisation d'une analyse d'impact (AIPD) ?"
msgid "fiche.champRealisationPia"
msgstr "Avez-vous réalisé l'analyse d'impact (AIPD) ?"
msgid "fiche.champDepotPia"
msgstr "Avez-vous déposer dans l'onglet annexe l'analyse d'impact (AIPD) ?"
###############################################################################
\ No newline at end of file
......@@ -215,6 +215,9 @@ msgstr "Voulez-vous utiliser les champs concernant le tranfert hors UE ?"
msgid "formulaire.champUsedonneessensible"
msgstr "Voulez-vous utiliser les champs concernant les données sensibles ?"
msgid "formulaire.champUsepia"
msgstr "Voulez-vous utiliser les règles du RGPD pour définir si l'Analyse d'impact sur la Protection des Données (AIPD) est obligatoire ?"
msgid "formulaire.champTypeDonneeSensible"
msgstr "Type de donnée sensible 1"
......
......@@ -252,6 +252,37 @@ class AppModel extends Model
return $success;
}
/**
* Exemple: 'champ' => notEmptyIf( $check, ['reference'], true, array( 'P' ) )
*
* @param array $checks
* @param array $references
* @param boolean $condition
* @param array $values
* @return boolean
*/
public function checkNotBlankIfAll($checks, array $references, $condition, $values)
{
if (!(is_array($checks) && !empty($references))) {
return false;
}
$success = true;
foreach ($references as $reference) {
$referenceValue = Hash::get($this->data, "{$this->alias}.{$reference}");
if (!empty($checks)) {
foreach ($checks as $value) {
if (in_array($referenceValue, $values, true) === $condition) {
$success = Validation::notBlank($value) && $success;
}
}
}
}
return $success;
}
/**
* Règle de validation équivalent à un index unique sur plusieurs colonnes.
*
......
......@@ -275,6 +275,18 @@ class Fiche extends AppModel {
"Données relatives à des condamnations pénales ou infractions" => "Données relatives à des condamnations pénales ou infractions"
];
const LISTE_CRITERES = [
"Évaluation/scoring" => "Évaluation/scoring (y compris le profilage)",
"Décision automatique avec effet légal ou similaire" => "Décision automatique avec effet légal ou similaire",
"Surveillance systématique" => "Surveillance systématique",
"Données sensibles ou hautement personnellles" => "Données sensibles ou hautement personnellles (santé, géolocalisation, etc.)",
"Collecte à large échelle" => "Collecte à large échelle",
"Croisement de données" => "Croisement de données",
"Personnes vulnérables" => "Personnes vulnérables (patients, personnes âgées, enfants, etc.)",
"Usage innovant" => "Usage innovant (utilisation d’une nouvelle technologie)",
"Exclusion du bénéfice d’un droit/contrat" => "Exclusion du bénéfice d’un droit/contrat"
];
public $validate = [
'organisation_id' => [
'areUnique' => [
......
......@@ -78,6 +78,12 @@ class Formulaire extends AppModel {
'rule' => ['notBlank']
]
],
'usepia' => [
'notBlank' => [
'on' => 'update',
'rule' => ['notBlank']
]
],
];
/**
......
This diff is collapsed.
......@@ -11,7 +11,7 @@ if ($this->request->params['action'] === 'show' ) {
}
?>
<!-- Onglet Information sur l'entité -->
<!-- Onglet Information complementaire -->
<div id="information_complementaire" class="tab-pane">
<br/>
......
......@@ -309,6 +309,81 @@ if (in_array($this->request->params['action'], ['edit', 'show']) === true) {
</div>
</div>
<div class="col-md-12">
<span class='labelFormulaire'>
<?php
echo "Analyse d'impact sur la Protection des Données (AIPD) :";
?>
</span>
<div class="row row35"></div>
</div>
<?php
if($usePIA['Formulaire']['usepia'] === true) {
?>
<div class="row">
<div class="col-md-6">
<?php
echo $this->WebcilForm->input('obligation_pia', [
'id' => 'obligation_pia',
'options' => [
true => 'Oui',
false => 'Non'
],
'class' => 'transformSelect form-control',
'required' => true,
'readonly' => true,
'empty' => $empty,
'placeholder' => false,
'data-placeholder' => ' '
]);
?>
</div>
<div class="col-md-6"></div>
</div>
<?php
} else {
echo $this->WebcilForm->hidden('obligation_pia', ['value' => null]);
}