Commit 19e55331 authored by tguillon's avatar tguillon
Browse files

Ajout: des options donc la création d'un formulaire

parent 80acfce4
......@@ -78,13 +78,33 @@ INSERT INTO baselegales (libelle, description, created, modified) VALUES
('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());
ALTER TABLE fg_champs ADD COLUMN champ_coresponsable BOOLEAN DEFAULT FALSE;
ALTER TABLE fg_champs ADD COLUMN champ_soustraitant BOOLEAN DEFAULT FALSE;
ALTER TABLE fg_formulaires RENAME TO formulaires;
ALTER SEQUENCE fg_formulaires_id_seq RENAME TO formulaires_id_seq;
ALTER TABLE formulaires ADD COLUMN usesousfinalite BOOLEAN DEFAULT FALSE;
ALTER TABLE formulaires ADD COLUMN usebaselegale BOOLEAN DEFAULT FALSE;
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 ALTER COLUMN soustraitant DROP NOT NULL;
ALTER TABLE formulaires ALTER COLUMN active DROP NOT NULL;
ALTER TABLE formulaires ALTER COLUMN active SET DEFAULT FALSE;
ALTER TABLE fg_formulaires ADD COLUMN useSousFinalite BOOLEAN DEFAULT FALSE;
ALTER TABLE fg_formulaires ADD COLUMN useBaseLegale BOOLEAN DEFAULT FALSE;
ALTER TABLE fg_formulaires ADD COLUMN useDecisionAutomatisee BOOLEAN DEFAULT FALSE;
ALTER TABLE fg_formulaires ADD COLUMN useTransfertHorsUe BOOLEAN DEFAULT FALSE;
ALTER TABLE fg_formulaires ADD COLUMN useDonneesSensible BOOLEAN DEFAULT FALSE;
ALTER TABLE fg_champs RENAME TO champs;
ALTER SEQUENCE fg_champs_id_seq RENAME TO champs_id_seq;
ALTER TABLE champs RENAME COLUMN formulaires_id TO formulaire_id;
ALTER TABLE champs
DROP CONSTRAINT fg_champs_formulaires_id_fkey,
ADD CONSTRAINT fg_champs_formulaire_id_fkey FOREIGN KEY (formulaire_id) REFERENCES formulaires (id) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE champs ADD COLUMN champ_coresponsable BOOLEAN DEFAULT FALSE;
ALTER TABLE champs ADD COLUMN champ_soustraitant BOOLEAN DEFAULT FALSE;
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 modeles
DROP CONSTRAINT modeles_formulaires_id_fkey,
ADD CONSTRAINT modeles_formulaires_id_fkey FOREIGN KEY (formulaires_id) REFERENCES formulaires (id) ON DELETE CASCADE ON UPDATE CASCADE;
COMMIT;
......@@ -37,12 +37,13 @@ class AppController extends Controller
'Notification',
'Pannel',
'Service',
'User'
'User',
'Formulaire'
];
public $components = [
'Session',
'FormGenerator.FormGen',
// 'FormGenerator.FormGen',
'Droits',
'Notifications',
'Auth' => [
......@@ -177,17 +178,24 @@ class AppController extends Controller
public function beforeRender()
{
parent::beforeRender();
$this->set('formulaires_actifs', $this->FormGen->getAll([
'organisations_id' => $this->Session->read('Organisation.id'),
'active' => true,
'soustraitant' => false
]));
$this->set('formulaires_soustraitance', $this->FormGen->getAll([
'organisations_id' => $this->Session->read('Organisation.id'),
'active' => true,
'soustraitant' => true
]));
// $this->set('formulaires_actifs', $this->FormGen->getAll([
// 'organisations_id' => $this->Session->read('Organisation.id'),
// 'active' => true
// ]));
$formulaires_actifs = $this->Formulaire->find('all', [
'conditions' => [
'organisations_id' => $this->Session->read('Organisation.id'),
'active' => true
]
]);
$this->set(compact('formulaires_actifs'));
// $this->set('formulaires_soustraitance', $this->FormGen->getAll([
// 'organisations_id' => $this->Session->read('Organisation.id'),
// 'active' => true,
// 'soustraitant' => true
// ]));
$serviceUser = $this->OrganisationUser->find('all', [
'conditions' => [
......
......@@ -323,4 +323,36 @@ class DroitsComponent extends Component {
return false;
}
/**
* Check si l'organisation en cours à un DPO déclaré
*
* @return bool
*
* @access public
*
* @created 25/02/2020
* @version V1.1.0
*/
public function existDPO()
{
if ($this->Session->read('Organisation.id') != null) {
$Organisation = ClassRegistry::init('Organisation');
$dpo_id = $Organisation->find('first', [
'conditions' => [
'Organisation.id' => $this->Session->read('Organisation.id')
],
'fields' => [
'Organisation.dpo'
]
]);
if (!empty($dpo_id)) {
return true;
}
}
return false;
}
}
......@@ -36,6 +36,7 @@ class FichesController extends AppController
];
public $uses = [
'Champ',
'Responsable',
'ResponsableOrganisation',
'EtatFiche',
......@@ -44,8 +45,6 @@ class FichesController extends AppController
'Fiche',
'Fichier',
'Formulaire',
'FormGeneric',
'FormGenerator.Champ',
'Historique',
'Modele',
'ModeleExtraitRegistre',
......@@ -199,7 +198,7 @@ class FichesController extends AppController
* @version V1.2.0
* @author Théo GUILLON <theo.guillon@libriciel.coop>
*/
public function add($id, $initialisation = false)
public function add($formulaire_id, $initialisation = false)
{
if (true !== $this->Droits->authorized(ListeDroit::REDIGER_TRAITEMENT)) {
throw new ForbiddenException(__d('default', 'default.flasherrorPasDroitPage'));
......@@ -210,30 +209,12 @@ 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'])) {
if ($this->Droits->existDPO() === false) {
throw new ForbiddenException("Aucun DPO n'a été défini pour votre entité. Veuillez contacter votre administrateur.");
}
$this->set('title', __d('fiche', 'fiche.titreCrationFiche'));
$champs = $this->Champ->find('all', [
'conditions' => [
'formulaires_id' => $id
],
'order' => [
'colonne ASC',
'ligne ASC'
]
]);
if ($this->request->is('POST')) {
if ('Cancel' === Hash::get($this->request->data, 'submit')) {
if (!empty($this->Session->read('Auth.User.uuid'))) {
......@@ -248,11 +229,19 @@ class FichesController extends AppController
$data = $this->request->data;
$data['Fiche']['user_id'] = $this->Auth->user('id');
$data['Fiche']['form_id'] = $this->request->data['Fiche']['formulaire_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']);
$champs = $this->Champ->find('all', [
'conditions' => [
'formulaire_id' => $formulaire_id
],
'fields' => [
'details'
]
]);
$success = $this->WebdpoFiche->saveWithVirtualFields($data, $champs);
if ($success == true) {
......@@ -306,58 +295,10 @@ class FichesController extends AppController
}
}
$this->set('formulaireid', $id);
$query = [
'conditions' => [
'abroger' => false
],
'fields' => [
'id',
'norme',
'numero',
'libelle',
'description'
],
'order' => [
'norme',
'numero'
]
];
$normes = $this->Norme->find('all', $query);
$options_normes = Hash::combine(
$normes,
'{n}.Norme.id',
[
'%s-%s : %s',
'{n}.Norme.norme',
'{n}.Norme.numero',
'{n}.Norme.libelle'
]
);
$descriptions_normes = Hash::combine(
$normes,
'{n}.Norme.id',
'{n}.Norme.description'
);
$this->getBaseLegales();
$soustraitance = $this->Formulaire->find('first', [
'conditions' => [
'id' => $id
],
'fields' => [
'soustraitant'
]
]);
$soustraitants = $this->_soustraitants();
$responsables = $this->_responsables();
$useValueDefault = false;
if (empty($this->request->data)) {
$useValueDefault = true;
// User
$userLog = $this->User->find('first', [
'conditions' => [
......@@ -374,18 +315,15 @@ class FichesController extends AppController
$this->request->data['Fiche']['declarantpersonneemail'] = $userLog['User']['email'];
$this->request->data['Fiche']['declarantpersonnefix'] = $userLog['User']['telephonefixe'];
$this->request->data['Fiche']['declarantpersonneportable'] = $userLog['User']['telephoneportable'];
}
$details = Hash::extract($champs, '{n}.Champ.details');
foreach ($details as $detail) {
$detail = (array)json_decode($detail);
$this->getFormulaireFields($formulaire_id, $useValueDefault);
if (!empty($detail['default'])) {
$this->request->data['Fiche'][$detail['name']] = $detail['default'];
}
}
}
// Récupére en BDD les options des champs défini lors de la création du formulaire
$this->getOptionsFields($formulaire_id);
$this->set(compact('champs', 'options_normes', 'descriptions_normes', 'soustraitance', 'soustraitants', 'responsables'));
// Récupère en BDD les normes. Renvoie les normes et les descriptions
$this->getNormes();
}
/**
......@@ -1750,4 +1688,176 @@ class FichesController extends AppController
$this->set(compact('options_baseLegales', 'descriptions_baseLegale'));
}
/**
* Récupére en BDD les normes et les descriptions
*
* @access private
*
* @created 25/02/2020
* @version V1.2.0
* @author Théo GUILLON <theo.guillon@libriciel.coop>
*/
private function getNormes()
{
$query = [
'conditions' => [
'abroger' => false
],
'fields' => [
'id',
'norme',
'numero',
'libelle',
'description'
],
'order' => [
'norme',
'numero'
]
];
$normes = $this->Norme->find('all', $query);
$options_normes = Hash::combine(
$normes,
'{n}.Norme.id',
[
'%s-%s : %s',
'{n}.Norme.norme',
'{n}.Norme.numero',
'{n}.Norme.libelle'
]
);
$descriptions_normes = Hash::combine(
$normes,
'{n}.Norme.id',
'{n}.Norme.description'
);
$this->set(compact('options_normes', 'descriptions_normes'));
}
/**
* Récupére en BDD les options défini dans le formulaire en rapport avec les champs sous-finalité, base légale,
* décision automatique, transfert hors ue, données sensible
*
* @param int $formulaire_id ID du formulaire utilisé
*
* @access private
*
* @created 25/02/2020
* @version V1.2.0
* @author Théo GUILLON <theo.guillon@libriciel.coop>
*/
private function getOptionsFields($formulaire_id)
{
$useFieldsFormulaire = $this->Formulaire->find('first', [
'conditions' => [
'id' => $formulaire_id,
'active' => true
],
'fields' => [
'usesousfinalite',
'usebaselegale',
'usedecisionautomatisee',
'usetransferthorsue',
'usedonneessensible'
]
]);
$this->set(compact('useFieldsFormulaire'));
}
/**
* Récupére en BDD les champs défini dans le formulaire en fonction des différents onglet
* Ajoute les valeurs par défault défini dans le formulaire
*
* @param int $formulaire_id ID du formulaire utilisé
* @param bool $useValueDefault Permet l'utilisation de valeur par défault défini dans le formulaire
*
* @access private
*
* @created 25/02/2020
* @version V1.2.0
* @author Théo GUILLON <theo.guillon@libriciel.coop>
*/
private function getFormulaireFields($formulaire_id, $useValueDefault = false)
{
$formulaireFields = $this->Champ->find('all', [
'conditions' => [
'formulaire_id' => $formulaire_id,
'champ_coresponsable' => false,
'champ_soustraitant' => false,
],
'fields' => [
'type',
'ligne',
'colonne',
'details'
],
'order' => [
'colonne ASC',
'ligne ASC'
]
]);
$coresponsableFields = $this->Champ->find('all', [
'conditions' => [
'formulaire_id' => $formulaire_id,
'champ_coresponsable' => true,
'champ_soustraitant' => false,
],
'fields' => [
'type',
'ligne',
'colonne',
'details'
],
'order' => [
'colonne ASC',
'ligne ASC'
]
]);
$soustraitantFields = $this->Champ->find('all', [
'conditions' => [
'formulaire_id' => $formulaire_id,
'champ_coresponsable' => false,
'champ_soustraitant' => true,
],
'fields' => [
'type',
'ligne',
'colonne',
'details'
],
'order' => [
'colonne ASC',
'ligne ASC'
]
]);
$fields = [
'formulaire' => $formulaireFields,
'coresponsable' => $coresponsableFields,
'soustraitant' => $soustraitantFields,
];
if ($useValueDefault === true) {
foreach ($fields as $field) {
$details = Hash::extract($field, '{n}.Champ.details');
foreach ($details as $detail) {
$detail = (array)json_decode($detail);
if (!empty($detail['default'])) {
$this->request->data['Fiche'][$detail['name']] = $detail['default'];
}
}
}
}
$this->set(compact('fields'));
}
}
......@@ -24,12 +24,8 @@ App::uses('ListeDroit', 'Model');
class FormulairesController extends AppController {
//ATTENTION VOIR app/Plugin/FormGenerator/Model/Formulaire.php
public $uses = [
// 'FormGenerator.Formulaire',
// 'FormGenerator.Champ',
// 'FormGeneric',
'Champ',
'Formulaire',
'Fiche',
'Organisation'
......@@ -52,28 +48,35 @@ class FormulairesController extends AppController {
$this->set('title', __d('formulaire', 'formulaire.titreListeFormulaire') . $this->Session->read('Organisation.raisonsociale'));
$all = $this->FormGen->getAll([
'organisations_id' => $this->Session->read('Organisation.id')
$formulaires = $this->Formulaire->find('all', [
'conditions' => [
'organisations_id' => $this->Session->read('Organisation.id')
],
'fields' => [
'id',
'organisations_id',
'libelle',
'active',
'description',
'created'
]
]);
$valid = [];
foreach ($all as $key => $value) {
foreach ($formulaires as $key => $value) {
$verif = $this->Fiche->find('count', [
'conditions' => [
'form_id' => $value['Formulaire']['id']
]
]);
if ($verif == 0) {
$valid[$value['Formulaire']['id']] = true;
} else {
$valid[$value['Formulaire']['id']] = false;
}
}
$this->set(compact('valid'));
$this->set('formulaires', $all);
$mesOrganisations = [];
$mesOrganisations = $this->WebcilUsers->organisations(
'list',
......@@ -86,7 +89,8 @@ class FormulairesController extends AppController {
: ListeDroit::MODIFIER_UTILISATEUR
]
);
$this->set('mesOrganisations', $mesOrganisations);
$this->set(compact('formulaires', 'mesOrganisations', 'valid'));
}
/**
......@@ -121,7 +125,7 @@ class FormulairesController extends AppController {
'organisations_id' => $organisation['Organisation']['id'],
'libelle' => $this->request->data['Formulaire']['libelle'],
'description' => $this->request->data['Formulaire']['description'],
'soustraitant' => $this->request->data['Formulaire']['soustraitant'],
// 'soustraitant' => $this->request->data['Formulaire']['soustraitant'],
'active' => false
]);
......@@ -196,7 +200,7 @@ class FormulairesController extends AppController {
'organisations_id' => $this->request->data['Formulaire']['organisationCible'],
'libelle' => $this->request->data['Formulaire']['libelle'],
'description' => $this->request->data['Formulaire']['description'],
'soustraitant' => $this->request->data['Formulaire']['soustraitant'],
// 'soustraitant' => $this->request->data['Formulaire']['soustraitant'],
'active' => false
]);
......@@ -263,7 +267,7 @@ class FormulairesController extends AppController {
$success = true;
$this->Formulaire->begin();
$success = $success && false !== $this->FormGen->del($id);
$success = $success && false !== $this->Formulaire->delete($id);
if ($success == true) {
$this->Formulaire->commit();
......@@ -291,28 +295,34 @@ class FormulairesController extends AppController {
if ($this->request->is('POST')) {
$success = true;
$this->Formulaire->begin();
$this->Formulaire->create([
'organisations_id' => $this->Session->read('Organisation.id'),
'libelle' => $this->request->data['Formulaire']['libelle'],
'description' => $this->request->data['Formulaire']['description'],
'soustraitant' => $this->request->data['Formulaire']['soustraitant'],
'active' => 0
]);
$data = $this->request->data;
$data['Formulaire']['organisations_id'] = $this->Session->read('Organisation.id');
$this->Formulaire->create($data);
$success = $success && false !== $this->Formulaire->save();
if ($success == true) {
if ($success === true) {
$formulaire_id = $this->Formulaire->getInsertId();
}
if ($success == true && !empty($formulaire_id)) {
$this->Formulaire->commit();
$this->redirect([
'controller' => 'formulaires',
'action' => 'add',
$this->Formulaire->getInsertId()
'action' => 'new',
$formulaire_id
]);
} else {
$this->Formulaire->rollback();
$this->Session->setFlash(__d('default', 'default.flasherrorEnregistrementErreur'), 'flasherror');
}
}