Commit 3825600e authored by tguillon's avatar tguillon
Browse files

Correction de l'enregistrement d'un traitement.

Ajout des règles de validation en fonction de l'utilisation du champ
"co-responsable".
Ajout des règles de validation si on est dans un traitement utilisant
un formulaire de sous-traitance.
parent 2e9022d5
......@@ -48,11 +48,12 @@ class FichesController extends AppController {
'Norme',
'Organisation',
'Service',
'Soustraitant',
'SoustraitantOrganisation',
'TraitementRegistre',
'User',
'Valeur',
'Soustraitant',
'SoustraitantOrganisation'
'WebdpoFiche'
];
/**
......@@ -69,34 +70,6 @@ class FichesController extends AppController {
]);
}
/**
* Champs virtuels obligatoires et non paramétrables du formulaire de fiche.
* @fixme à faire dans l'action edit aussi
*
* @var array
*/
protected $_requiredFicheVirtualFields = array(
'declarantraisonsociale',
'declarantadresse',
'declarantemail',
'declarantsiret',
'declarantape',
'declaranttelephone',
'declarantservice',
'donneesSensible',
'personneresponsable',
'fonctionresponsable',
'emailresponsable',
'telephoneresponsable',
'transfertHorsUe',
'personnecil',
'emailcil',
'declarantpersonnenom',
'declarantpersonneemail',
'outilnom',
'finaliteprincipale'
);
public function saveFileTmp() {
if (!empty($this->request->params['form']['fichiers'])) {
......@@ -224,14 +197,6 @@ class FichesController extends AppController {
]
]);
// @fixme factoriser dans une méthode à utiliser également dans l'édit
foreach ($champs as $champ) {
$details = json_decode(Hash::get($champ, 'Champ.details'));
if ($details->obligatoire == true) {
$this->_requiredFicheVirtualFields[] = $details->name;
}
}
$this->set(compact('champs'));
$this->set('formulaireid', $id);
......@@ -287,85 +252,23 @@ class FichesController extends AppController {
$this->redirect($this->Referers->get());
}
if ($this->request->data['Fiche']['coresponsable'] == false) {
$this->request->data['Fiche']['coresponsableid'] = null;
$this->request->data['Fiche']['nomcoresponsable'] = null;
$this->request->data['Fiche']['prenomcoresponsable'] = null;
$this->request->data['Fiche']['fonctioncoresponsable'] = null;
$this->request->data['Fiche']['emailcoresponsable'] = null;
$this->request->data['Fiche']['telephonecoresponsable'] = null;
$this->request->data['Fiche']['raisonsocialestructure'] = null;
$this->request->data['Fiche']['siretstructure'] = null;
$this->request->data['Fiche']['apestructure'] = null;
$this->request->data['Fiche']['telephonestructure'] = null;
$this->request->data['Fiche']['faxstructure'] = null;
$this->request->data['Fiche']['adressestructure'] = null;
$this->request->data['Fiche']['emailstructure'] = null;
}
$success = true;
$this->Fiche->begin();
$this->Fiche->create([
'user_id' => $this->Auth->user('id'),
'form_id' => $this->request->data['Fiche']['formulaire_id'],
'organisation_id' => $this->Session->read('Organisation.id'),
'norme_id' => $this->request->data['Fiche']['norme'],
'soustraitantid' => $this->request->data['Fiche']['soustraitantid'],
'coresponsable' => $this->request->data['Fiche']['coresponsable'],
'coresponsableid' => $this->request->data['Fiche']['coresponsableid']
]);
$success = $success && false !== $this->Fiche->save();
$data = $this->request->data;
$data['Fiche']['user_id'] = $this->Auth->user('id');
$data['Fiche']['form_id'] = $this->request->data['Fiche']['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']);
if (isset($this->request->data['Fiche']['norme'])) {
unset($this->request->data['Fiche']['norme']);
}
if (isset($this->request->data['Fiche']['descriptionNorme'])) {
unset($this->request->data['Fiche']['descriptionNorme']);
}
if (isset($this->request->data['Fiche']['soustraitantid'])) {
unset($this->request->data['Fiche']['soustraitantid']);
}
if ($this->request->data['Fiche']['coresponsable'] == true) {
$this->request->data['Fiche']['coresponsable'] = 'Oui';
} else {
$this->request->data['Fiche']['coresponsable'] = 'Non';
}
if (isset($this->request->data['Fiche']['coresponsableid'])) {
unset($this->request->data['Fiche']['coresponsableid']);
}
$success = $this->WebdpoFiche->saveWithVirtualFields($data, $champs);
if ($success == true) {
$last = $this->Fiche->getLastInsertID();
// $success = $success && false !== $this->Fichier->saveFichier($this->request->data, $last);
if ($success == true) {
foreach ($this->request->data['Fiche'] as $key => $value) {
if ($key != 'formulaire_id' && ($value != '' || in_array($key, $this->_requiredFicheVirtualFields))) {
if (is_array($value)) {
$value = json_encode($value);
}
$this->Valeur->create([
'champ_name' => $key,
'fiche_id' => $last,
'valeur' => $value
]);
$tmpSave = $this->Valeur->save();
if ($tmpSave == false) {
$this->Fiche->invalidate($key, Hash::get($this->Valeur->validationErrors, 'valeur.0'));
}
$success = $success && false !== $tmpSave;
}
}
$this->Historique->create([
'Historique' => [
'content' => __d('historique', 'historique.creationTraitement') . ' ' . $this->Auth->user('prenom') . ' ' . $this->Auth->user('nom'),
......@@ -377,7 +280,7 @@ class FichesController extends AppController {
$this->EtatFiche->create([
'EtatFiche' => [
'fiche_id' => $last,
'etat_id' => 1,
'etat_id' => EtatFiche::ENCOURS_REDACTION,
'previous_user_id' => $this->Auth->user('id'),
'user_id' => $this->Auth->user('id')
]
......@@ -549,13 +452,6 @@ class FichesController extends AppController {
]
]);
foreach ($champs as $champ) {
$details = json_decode(Hash::get($champ, 'Champ.details'));
if ($details->obligatoire == true) {
$this->_requiredFicheVirtualFields[] = $details->name;
}
}
$this->set(compact('champs'));
$this->set('id', $id);
......@@ -604,6 +500,7 @@ class FichesController extends AppController {
$responsables = $this->_responsables();
$this->set(compact('responsables'));
$this->set('coresponsable', $idForm['Fiche']['coresponsable']);
$this->set('coresponsableid', $idForm['Fiche']['coresponsableid']);
// Si on sauvegarde
......@@ -615,114 +512,24 @@ class FichesController extends AppController {
$this->redirect($this->Referers->get());
}
if ($this->request->data['Fiche']['coresponsable'] == false) {
$this->request->data['Fiche']['coresponsableid'] = null;
$this->request->data['Fiche']['nomcoresponsable'] = null;
$this->request->data['Fiche']['prenomcoresponsable'] = null;
$this->request->data['Fiche']['fonctioncoresponsable'] = null;
$this->request->data['Fiche']['emailcoresponsable'] = null;
$this->request->data['Fiche']['telephonecoresponsable'] = null;
$this->request->data['Fiche']['raisonsocialestructure'] = null;
$this->request->data['Fiche']['siretstructure'] = null;
$this->request->data['Fiche']['apestructure'] = null;
$this->request->data['Fiche']['telephonestructure'] = null;
$this->request->data['Fiche']['faxstructure'] = null;
$this->request->data['Fiche']['adressestructure'] = null;
$this->request->data['Fiche']['emailstructure'] = null;
}
$success = true;
$this->Valeur->begin();
$this->Fiche->id = $id;
$success = $success && $this->Fiche->save([
'norme_id' => $this->request->data['Fiche']['norme'],
'soustraitantid' => $this->request->data['Fiche']['soustraitantid'],
'coresponsable' => $this->request->data['Fiche']['coresponsable'],
'coresponsableid' => $this->request->data['Fiche']['coresponsableid']
]) !== false;
if (isset($this->request->data['Fiche']['norme'])) {
unset($this->request->data['Fiche']['norme']);
}
if (isset($this->request->data['Fiche']['descriptionNorme'])) {
unset($this->request->data['Fiche']['descriptionNorme']);
}
if (isset($this->request->data['Fiche']['soustraitantid'])) {
unset($this->request->data['Fiche']['soustraitantid']);
}
if ($this->request->data['Fiche']['coresponsable'] == true) {
$this->request->data['Fiche']['coresponsable'] = 'Oui';
} else {
$this->request->data['Fiche']['coresponsable'] = 'Non';
}
if (isset($this->request->data['Fiche']['coresponsableid'])) {
unset($this->request->data['Fiche']['coresponsableid']);
$data = $this->request->data;
$data['Fiche']['user_id'] = $this->Auth->user('id');
if (Hash::check($this->request->data, 'Fiche.formulaire_id')) {
$data['Fiche']['form_id'] = Hash::get($this->request->data, 'Fiche.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']);
$success = $this->WebdpoFiche->saveWithVirtualFields($data, $champs);
if ($success == true) {
// On récupère les infos des fichier déjà présent avant de les supprimer
// $files = $this->Valeur->find('first', [
// 'conditions' => [
// 'fiche_id' => $id,
// 'champ_name' => 'fichiers'
// ]
// ]);
// $file = [];
// if (!empty($files)) {
// $file = json_decode($files['Valeur']['valeur']);
// }
// foreach ($this->request->data('Fiche.fichiers') as $newFiles) {
// $file[] = $newFiles;
// }
foreach ($this->request->data['Fiche'] as $key => $value) {
$idsToDelete = array_keys($this->Valeur->find('list', [
'conditions' => [
'champ_name' => $key,
'fiche_id' => $id
],
'contain' => false
]));
if (empty($idsToDelete) == false) {
$success = $this->Valeur->deleteAll([
'Valeur.id' => $idsToDelete
]) && $success;
}
if ($key != 'formulaire_id' && ($value != '' || in_array($key, $this->_requiredFicheVirtualFields))) {
if (is_array($value)) {
// if ($key == 'fichiers') {
// $value = $file;
// }
$value = json_encode($value);
}
$this->Valeur->create([
'champ_name' => $key,
'fiche_id' => $id,
'valeur' => $value
]);
$tmpSave = $this->Valeur->save();
if ($tmpSave == false) {
$this->Fiche->invalidate($key, Hash::get($this->Valeur->validationErrors, 'valeur.0'));
}
$success = false !== $tmpSave && $success;
}
}
//$success = false !== $this->Fichier->saveFichier($this->request->data, $id) && $success;
if ($success == true) {
$etatTraitement = $this->EtatFiche->find('first', [
'conditions' => [
......@@ -746,11 +553,11 @@ class FichesController extends AppController {
'fiche_id' => $id
]
]);
$success = false !== $this->Historique->save() && $success;
$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 = $this->Fichier->deleteFichier($val, false) && $success;
$success = $success && $this->Fichier->deleteFichier($val);
}
}
......@@ -772,13 +579,19 @@ class FichesController extends AppController {
$this->Session->setFlash(__d('fiche', 'Une erreur inattendue est survenue...'), 'flasherror');
}
} else {
$fiche = $this->Fiche->find('first', ['conditions' => ['Fiche.id' => $id]]);
if (empty($fiche)) {
throw new NotFoundException();
}
$valeurs = $this->Valeur->find('all', [
'conditions' => [
'fiche_id' => $id
]
]);
foreach ($valeurs as $key => $value) {
foreach ($valeurs as $value) {
if ($this->Fiche->isJson($value['Valeur']['valeur'])) {
$this->request->data['Fiche'][$value['Valeur']['champ_name']] = json_decode($value['Valeur']['valeur']);
} else {
......@@ -786,6 +599,8 @@ class FichesController extends AppController {
}
}
$this->set(compact('valeurs'));
$this->request->data['Fiche'] = array_merge($this->request->data['Fiche'], $fiche['Fiche']);
}
$filesSave = $this->Fichier->find('all', [
......@@ -883,6 +698,9 @@ class FichesController extends AppController {
$this->set(compact('files'));
$this->set('coresponsable', $idForm['Fiche']['coresponsable']);
$responsables = $this->_responsables();
$this->set(compact('responsables'));
}
/**
......
......@@ -167,6 +167,13 @@ msgstr "Tous les responsables"
msgid "default.sousTitreMesResponsables"
msgstr "Mes responsables"
msgid "default.ongletFormulaireActivite"
msgstr "Formulaire d'activité"
msgid "default.ongletFormulaireSoustraitance"
msgstr "Formulaire de sous-traitance"
###############################################################################
......@@ -279,4 +286,7 @@ msgid "Validate::inclusiveRange"
msgstr "Veuillez entrer un nombre entre %s et %s"
msgid "Validate::checkUnique"
msgstr "Veuillez entrer une norme non existante"
\ No newline at end of file
msgstr "Veuillez entrer une norme non existante"
msgid "Validate::checkNotBlankIf"
msgstr "Champ obligatoire"
\ No newline at end of file
......@@ -62,6 +62,9 @@ msgstr "Une erreur est survenue lors de la création de l'archive. Merci de cont
msgid "fiche.ongletInformationTraitement"
msgstr "Information concernant le traitement"
msgid "fiche.ongletSousTraitant"
msgstr "Sous-traitant"
msgid "fiche.ongletFormulaire"
msgstr "Formulaire"
......
......@@ -22,6 +22,7 @@
App::uses('Model', 'Model');
App::uses('FrValidation', 'Validation');
App::uses('Validation', 'Utility');
class AppModel extends Model {
......@@ -211,4 +212,33 @@ class AppModel extends Model {
$found = $this->find( 'first', $querydata );
return empty($found);
}
/**
* Exemple: 'champ' => notEmptyIf( $check, 'reference', true, array( 'P' ) )
*
* @param array $checks
* @param string $reference
* @param boolean $condition
* @param array $values
* @return boolean
*/
public function checkNotBlankIf($checks, $reference, $condition, $values) {
if (!( is_array( $checks ) && !empty( $reference ) )) {
return false;
}
$success = true;
$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;
}
}
......@@ -42,12 +42,12 @@ class Fiche extends AppModel {
* @version V0.9.0
*/
public $validate = [
'declarantservice' => [
'notBlank' => [
'rule' => ['notBlank'],
'allowEmpty' => false
]
]
// 'declarantservice' => [
// 'notBlank' => [
// 'rule' => ['notBlank'],
// 'allowEmpty' => false
// ]
// ]
];
/**
......
......@@ -69,6 +69,8 @@ class Fichier extends AppModel {
* @param boolean $transaction La méthode doit-elle gérer elle-même une
* transaction (par défaut: true) ?
* @return boolean
*
* @deprecated since ???
*
* @access public
* @created 29/04/2015
......@@ -138,38 +140,42 @@ class Fichier extends AppModel {
}
return true;
}
/**
*
* @param type $data
* @param type $id
* @param type $transaction
* @param type $idFiche
* @param type $uuidDossier
* @param type $idUser
* @param boolean $transaction La méthode doit-elle gérer elle-même une
* transaction (par défaut: false) ?
* @return boolean
*/
public function transfereSave($idFiche, $uuidDossier, $idUser) {
public function transfereSave($idFiche, $uuidDossier, $idUser, $transaction = false) {
if (!empty($uuidDossier)){
$files = array_diff(scandir(CHEMIN_PIECE_JOINT_TMP . $idUser . DS . $uuidDossier), array('..', '.'));
if (isset($files) && !empty($files)) {
$success = true;
if($transaction == true) {
$this->begin();
}
// On verifie si le dossier file existe. Si c'est pas le cas on le cree
if (!file_exists(APP . FICHIER)) {
mkdir(APP . FICHIER, 0777, true);
mkdir(APP . FICHIER . PIECE_JOINT, 0777, true);
mkdir(APP . FICHIER . MODELES, 0777, true);
mkdir(APP . FICHIER . REGISTRE, 0777, true);
} else {
if (!file_exists(APP . FICHIER . PIECE_JOINT)) {
mkdir(APP . FICHIER . PIECE_JOINT, 0777, true);
}
}
foreach ($files as $key => $file) {
$extension = pathinfo($file, PATHINFO_EXTENSION);
if ($extension == 'odt' || $extension == 'pdf') {
$success = true;
$this->begin();
// On verifie si le dossier file existe. Si c'est pas le cas on le cree
if (!file_exists(APP . FICHIER)) {
mkdir(APP . FICHIER, 0777, true);
mkdir(APP . FICHIER . PIECE_JOINT, 0777, true);
mkdir(APP . FICHIER . MODELES, 0777, true);
mkdir(APP . FICHIER . REGISTRE, 0777, true);
} else {
if (!file_exists(APP . FICHIER . PIECE_JOINT)) {
mkdir(APP . FICHIER . PIECE_JOINT, 0777, true);
}
}
if ($extension == 'odt' || $extension == 'pdf') {
$url = time();
$success = $success && rename(CHEMIN_PIECE_JOINT_TMP . $idUser . DS . $uuidDossier . DS . $file, CHEMIN_PIECE_JOINT.$url . $key . '.' . $extension);
......@@ -179,20 +185,24 @@ class Fichier extends AppModel {
'url' => $url . $key . '.' . $extension,
'fiche_id' => $idFiche
]);
$success = $success && $this->save();
$success = $success && $this->save(null, ['atomic' => false]);
}
}
}
if ($success == true) {
$this->commit();
if($transaction == true) {
$this->commit();
}
$folder = new Folder(CHEMIN_PIECE_JOINT_TMP . $idUser . DS . $uuidDossier);
$folder->delete();
return true;
} else {
$this->rollback();
if($transaction == true) {
$this->rollback();
}
return false;
}
}
......@@ -205,14 +215,14 @@ class Fichier extends AppModel {
/**
* @param int $id
* @param boolean $transaction La méthode doit-elle gérer elle-même une
* transaction (par défaut: true) ?
* transaction (par défaut: false) ?
* @return boolean
*
* @access public
* @created 26/06/2015
* @version V1.0.0
*/
public function deleteFichier($id, $transaction = true) {
public function deleteFichier($id, $transaction = false) {
$success = true;
if($transaction == true) {
$this->begin();
......
<?php
/**
* Model WebdpoFiche
*
* 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 AppModel
*/
App::uses('AppModel', 'Model');