Commit 7af537b4 authored by THEO GUILLON's avatar THEO GUILLON
Browse files

Merge branch...

Merge branch '345-ajouter-de-champ-sur-la-coresponsabilite-et-la-soustraitance-dans-un-formulaire' into '1.2.0'

Resolve "Ajouter de champ sur la coresponsabilité et la soustraitance dans un formulaire"

See merge request web-DPO/web-DPO!309
parents be1d517c f1642f24
......@@ -61,7 +61,9 @@ class FichesController extends AppController
'TraitementRegistre',
'User',
'Valeur',
'WebdpoFiche'
'WebdpoFiche',
'WebdpoCoresponsable',
'WebdpoSoustraitance'
];
/**
......@@ -271,6 +273,7 @@ class FichesController extends AppController
'formulaire_id' => $formulaire_id
],
'fields' => [
'type',
'details',
'champ_coresponsable',
'champ_soustraitant'
......@@ -350,7 +353,12 @@ class FichesController extends AppController
}
}
if ($success == true) {
if ($success == true &&
empty($this->Fiche->validationErrors) &&
empty($this->WebdpoFiche->validationErrors) &&
empty($this->WebdpoCoresponsable->validationErrors) &&
empty($this->WebdpoSoustraitance->validationErrors)
) {
$this->Fiche->commit();
$this->Session->setFlash(__d('fiche', 'fiche.flashsuccessTraitementEnregistrer'), 'flashsuccess');
......@@ -652,6 +660,7 @@ class FichesController extends AppController
'formulaire_id' => $form_id['Fiche']['form_id']
],
'fields' => [
'type',
'details',
'champ_coresponsable',
'champ_soustraitant'
......@@ -689,7 +698,12 @@ class FichesController extends AppController
$success = $this->WebdpoFiche->saveWithVirtualFields($data, $formulaireFields, $formulaireOptions, $formulaireOLD['Formulaire']['oldformulaire']);
if ($success == true) {
if ($success == true &&
empty($this->Fiche->validationErrors) &&
empty($this->WebdpoFiche->validationErrors) &&
empty($this->WebdpoCoresponsable->validationErrors) &&
empty($this->WebdpoSoustraitance->validationErrors)
) {
$this->Fiche->commit();
$this->Session->setFlash(__d('fiche', 'fiche.flashsuccessTraitementModifier'), 'flashsuccess');
......@@ -716,12 +730,20 @@ class FichesController extends AppController
]);
// On récupère en BDD les champs tous les champs du formulaire
$this->getFormulaireFields($fiche['Fiche']['form_id']);
$this->getFormulaireFields($fiche['Fiche']['form_id'], false);
// Récupère en BDD les normes. Renvoie les normes et les descriptions
$this->getNormes();
if (empty($this->request->data)) {
$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->request->data['Fiche']['obligation_pia'] = $fiche['Fiche']['obligation_pia'];
$this->request->data['Fiche']['realisation_pia'] = $fiche['Fiche']['realisation_pia'];
$this->request->data['Fiche']['depot_pia'] = $fiche['Fiche']['depot_pia'];
// Récupère les valeurs des champs du traitement
$this->getValueFields($id);
}
......@@ -738,55 +760,23 @@ class FichesController extends AppController
]
]);
// On récupère les responsables
// On récupère les responsables associés à l'entité
$responsables = $this->_responsables();
$this->set(compact('responsables'));
// On récupère les coresponsables
// On récupère les coresponsables associés au traitement
$this->_coresponsables($id);
// On récupère les responsables
// On récupère les soustraitant associés à l'entité
$soustraitants = $this->_soustraitants();
$this->set(compact('soustraitants'));
// On récupère la soustraitance
$this->_soustraitances($id);
// 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->request->data['Fiche']['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'));
// }
// } 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']);
// }
// On récupère la soustraitance associés au traitement
$this->_soustraitances($id);
// 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->request->data['Fiche']['obligation_pia'] = $fiche['Fiche']['obligation_pia'];
$this->request->data['Fiche']['realisation_pia'] = $fiche['Fiche']['realisation_pia'];
$this->request->data['Fiche']['depot_pia'] = $fiche['Fiche']['depot_pia'];
$typages = $this->_typages();
$this->set(compact('formulaireOLD', 'typages'));
......@@ -905,7 +895,6 @@ class FichesController extends AppController
$this->getOptionsFields($fiche['Fiche']['form_id']);
}
$etatTraitement = $this->EtatFiche->find('first', [
'conditions' => [
'fiche_id' => $id,
......@@ -927,8 +916,20 @@ class FichesController extends AppController
$this->request->data['Fiche']['realisation_pia'] = $fiche['Fiche']['realisation_pia'];
$this->request->data['Fiche']['depot_pia'] = $fiche['Fiche']['depot_pia'];
// On récupère les responsable
$responsables = $this->_responsables();
// On récupère les soustraitant
$soustraitants = $this->_soustraitants();
// On récupère les coresponsables associés au traitement
$this->_coresponsables($id);
// On récupère la soustraitance associés au traitement
$this->_soustraitances($id);
$this->set('formulaire_id', $fiche['Fiche']['form_id']); //@TODO
$this->set(compact('valeurs', 'showRegistre', 'formulaireOLD'));
$this->set(compact('valeurs', 'showRegistre', 'formulaireOLD', 'responsables', 'soustraitants'));
}
/**
......@@ -2077,13 +2078,19 @@ class FichesController extends AppController
foreach ($valeurs as $key => $value) {
if ($this->Fiche->isJson($value['Valeur']['valeur'])) {
$valueDecode = json_decode($value['Valeur']['valeur']);
$valueDecode = json_decode($value['Valeur']['valeur'], true);
if (is_object($valueDecode)) {
$valueDecode = json_decode(json_encode($valueDecode), true);
}
// if (is_object($valueDecode)) {
// $valueDecode = json_decode(json_encode($valueDecode), true);
// }
$this->request->data['WebdpoFiche'][$value['Valeur']['champ_name']] = $valueDecode;
if ($value['Valeur']['champ_name'] === 'coresponsabilitefields') {
$this->request->data['WebdpoCoresponsable'] = $valueDecode;
} else if ($value['Valeur']['champ_name'] === 'soustraitancefields') {
$this->request->data['WebdpoSoustraitance'] = $valueDecode;
} else {
$this->request->data['WebdpoFiche'][$value['Valeur']['champ_name']] = $valueDecode;
}
} else {
if (in_array($value['Valeur']['champ_name'], $changeArrayFields) && in_array($this->request->params['action'], ['edit', 'show']) === true ) {
$this->request->data['Trash'][$value['Valeur']['champ_name']] = $value['Valeur']['valeur'];
......@@ -2193,5 +2200,4 @@ class FichesController extends AppController
return $typages;
}
}
......@@ -531,6 +531,12 @@ class FormulairesController extends AppController {
$this->view = 'edit';
}
private function begnWith($str, $begnString)
{
$len = strlen($begnString);
return (substr($str, 0, $len) === $begnString);
}
private function saveFields($formulaire_id, $fields, $ongletChampCoresponsable = false, $ongletChampSoustraitant = false)
{
$success = true;
......@@ -581,7 +587,21 @@ class FormulairesController extends AppController {
break;
case 'name':
$sortie[$clef] = LettercaseFormattableBehavior::formatageVariable($val);
$formatName = LettercaseFormattableBehavior::formatageVariable($val);
if ($ongletChampCoresponsable === true && $ongletChampSoustraitant === false) {
if ($this->begnWith($formatName, 'coresponsable_') === false) {
$formatName = 'coresponsable_'.$formatName;
}
}
if ($ongletChampSoustraitant === true && $ongletChampCoresponsable === false) {
if ($this->begnWith($formatName, 'soustraitant_') === false) {
$formatName = 'soustraitant_'.$formatName;
}
}
$sortie[$clef] = $formatName;
break;
case 'options':
......@@ -812,44 +832,6 @@ class FormulairesController extends AppController {
}
}
// valeur par défault
if ($this->request->params['action'] == 'add' && empty($this->request->data)) {
$fields['coresponsable'] = [
[
'Champ' => [
'type' => 'input',
'ligne' => 1,
'colonne' => 1,
'details' => '{"name":"nom_responsable_conjoint","placeholder":"Nom et prénom","label":"Nom et prénom du responsable conjoint","default":"","obligatoire":true}'
]
],
[
'Champ' => [
'type' => 'input',
'ligne' => 3,
'colonne' => 1,
'details' => '{"name":"structure_responsable_conjointe","placeholder":"Raison sociale","label":"Raison sociale de la structure conjointe","default":"","obligatoire":true}'
]
],
[
'Champ' => [
'type' => 'input',
'ligne' => 1,
'colonne' => 2,
'details' => '{"name":"email_responsable_conjoint","placeholder":"Adresse e-mail","label":"Adresse mail du responsable conjoint","default":"","obligatoire":true}'
]
],
[
'Champ' => [
'type' => 'textarea',
'ligne' => 3,
'colonne' => 2,
'details' => '{"name":"adresse_structure_responsable_conjointe","placeholder":"Adresse postale","label":"Adresse de la structure conjointe","default":"","obligatoire":false}'
]
]
];
}
$this->request->data['Formulaire']['form-container-formulaire'] = $fields['formulaire'];
$this->request->data['Formulaire']['form-container-coresponsable'] = $fields['coresponsable'];
$this->request->data['Formulaire']['form-container-soustraitant'] = $fields['soustraitant'];
......
......@@ -75,6 +75,9 @@ msgstr "Information générale"
msgid "fiche.ongletSousTraitant"
msgstr "Sous-traitance(s)"
msgid "fiche.placeholderChampSoustraitance"
msgstr "Choisir un ou plusieurs sous-traitant(s)"
msgid "fiche.ongletFormulaire"
msgstr "Formulaire"
......@@ -219,6 +222,9 @@ msgstr "Information concernant la sous-traitance :"
msgid "fiche.champSoustraitantid"
msgstr "Sous-traitant"
msgid "fiche.champSoustraitances"
msgstr "Sous-traitance(s)"
msgid "fiche.champSoustraitant"
msgstr "Sous-traitant ?"
......@@ -273,6 +279,9 @@ msgstr "Information concernant la co-responsabilité :"
msgid "fiche.champCoresponsableid"
msgstr "Co-responsable"
msgid "fiche.champCoresponsables"
msgstr "Co-responsable(s)"
msgid "fiche.placeholderChampCoresponsable"
msgstr "Choisir un co-responsable"
......@@ -312,6 +321,9 @@ msgstr "Adresse de la structure du co-responsable"
msgid "fiche.champEmailstructure"
msgstr "E-mail de la structure du co-responsable"
msgid "fiche.placeholderChampMultiCoresponsable"
msgstr "Choisir un ou plusieurs co-responsable(s)"
msgid "fiche.ongletInformationComplementaire"
msgstr "Information complémentaire"
......
......@@ -269,3 +269,9 @@ msgstr "doit être"
msgid "formulaire.champIfNot"
msgstr "sinon il sera"
msgid "formulaire.infoUseFieldsAdditionalCoresponsable"
msgstr "Les champs que vous allez créent en dessous seront répétés pour chacun co-responsable sélectionné"
msgid "formulaire.infoUseFieldsAdditionalSoustraitant"
msgstr "Les champs que vous allez créent en dessous seront répétés pour chacun sous-traitant sélectionné"
<?php
App::uses('AppModel', 'Model');
class WebdpoCoresponsable extends AppModel
{
public $name = 'WebdpoCoresponsable';
public $useTable = false;
protected $_schema = [];
public function coresponsableSave ($fiche_id, $dataCoresponsable, $useCoresponsable)
{
$success = true;
$Coresponsable = ClassRegistry::init('Coresponsable');
if (empty($dataCoresponsable['currentCoresponsable'])
&& empty($dataCoresponsable['coresponsables'])
&& $useCoresponsable == true
) {
$Coresponsable->invalidate('coresponsables', 'Champ obligatoire');
return false;
}
if (empty($fiche_id)) {
return false;
}
if ($useCoresponsable == false) {
$success = $Coresponsable->deleteAll([
'Coresponsable.fiche_id' => $fiche_id
]) && $success;
return true;
}
if (isset($dataCoresponsable['currentCoresponsable']) && !empty($dataCoresponsable['currentCoresponsable']) && !empty($dataCoresponsable['coresponsables'])) {
foreach ($dataCoresponsable['currentCoresponsable'] as $currentCoresponsable) {
if (($key = array_search($currentCoresponsable['responsable_id'], $dataCoresponsable['coresponsables'])) !== false) {
unset($dataCoresponsable['coresponsables'][$key]);
}
}
$noDeleteCoresponsable = Hash::extract($dataCoresponsable['currentCoresponsable'], '{n}.coresponsable_id');
$success = $Coresponsable->deleteAll([
'Coresponsable.id !=' => $noDeleteCoresponsable,
'Coresponsable.fiche_id' => $fiche_id
]) && $success;
} else {
$success = $Coresponsable->deleteAll([
'Coresponsable.fiche_id' => $fiche_id
]) && $success;
}
if ($success === false) {
return $success;
}
if (!empty($dataCoresponsable['coresponsables'])) {
$Responsable = ClassRegistry::init('Responsable');
foreach ($dataCoresponsable['coresponsables'] as $coresponsable_id) {
$responsable = $Responsable->find('first', [
'conditions' => [
'id' => $coresponsable_id
]
]);
$Coresponsable->create([
'fiche_id' => $fiche_id,
'responsable_id' => $responsable['Responsable']['id'],
'nomcoresponsable' => $responsable['Responsable']['nomresponsable'],
'prenomcoresponsable' => $responsable['Responsable']['prenomresponsable'],
'fonctioncoresponsable' => $responsable['Responsable']['fonctionresponsable'],
'emailcoresponsable' => $responsable['Responsable']['emailresponsable'],
'telephonecoresponsable' => $responsable['Responsable']['telephoneresponsable'],
'raisonsocialestructure' => $responsable['Responsable']['raisonsocialestructure'],
'siretstructure' => $responsable['Responsable']['siretstructure'],
'apestructure' => $responsable['Responsable']['apestructure'],
'telephonestructure' => $responsable['Responsable']['telephonestructure'],
'faxstructure' => $responsable['Responsable']['faxstructure'],
'adressestructure' => $responsable['Responsable']['adressestructure'],
'emailstructure' => $responsable['Responsable']['emailstructure']
]);
$success = false !== $Coresponsable->save(null, ['atomic' => false]) && $success;
}
}
return $success;
}
public function cleanAndCheckDataCoresponsable($data, $champs)
{
if ($data['Fiche']['coresponsable'] == false) {
if (isset($data['WebdpoFiche']['coresponsabilitefields'])) {
unset($data['WebdpoFiche']['coresponsabilitefields']);
}
if (isset($data['Coresponsable'])) {
unset($data['Coresponsable']);
}
if (isset($data[$this->alias])) {
unset($data[$this->alias]);
}
return $data;
}
$arrayCoresponsableFields = [];
foreach ($champs as $champ) {
if ($champ['Champ']['champ_coresponsable'] === true && $champ['Champ']['champ_soustraitant'] === false) {
$arrayCoresponsableFields[] = $champ;
}
}
// On vérifie que les champs suplémentaite du formualaire ne soient pas obligatoire
if (isset($data[$this->alias]) && !empty($data[$this->alias])) {
$success = true;
foreach ($data[$this->alias] as $responsable_id => $coresponsabilitefield) {
foreach ($arrayCoresponsableFields as $arrayCoresponsableField) {
$details = json_decode($arrayCoresponsableField['Champ']['details'], true);
if ($details['obligatoire'] === true) {
if (in_array($arrayCoresponsableField['Champ']['type'], ['checkboxes', 'multi-select'])) {
if (empty($coresponsabilitefield[$details['name']])) {
$this->validate[$details['name']]['multiple'] = ['rule' => ['multiple', ['min' => 1]]];
$success = false;
}
} else {
if (empty($coresponsabilitefield[$details['name']])) {
$this->validate[$details['name']]['notBlank'] = ['rule' => ['notBlank']];
$success = false;
}
}
$this->saveAll($data[$this->alias], ['atomic' => false, 'validate' => 'only']);
}
}
}
if ($success === false) {
return $data;
}
$data['WebdpoFiche']['coresponsabilitefields'] = json_encode($data[$this->alias], true);
}
return $data;
}
}
\ No newline at end of file
......@@ -359,10 +359,14 @@ class WebdpoFiche extends AppModel {
$success = false !== $Fiche->save(null, ['atomic' => false]) && $success;
// Co-responsable
$success = false !== $this->coresponsableSave($Fiche->id, $data['Coresponsable'], $data['Fiche']['coresponsable']) && $success;
$WebdpoCoresponsable = ClassRegistry::init('WebdpoCoresponsable');
$success = false !== $WebdpoCoresponsable->coresponsableSave($Fiche->id, $data['Coresponsable'], $data['Fiche']['coresponsable']) && $success;
$data = $WebdpoCoresponsable->cleanAndCheckDataCoresponsable($data, $champs);
// Soustraitance
$success = false !== $this->soustraitanceSave($Fiche->id, $data['Soustraitance'], $data['Fiche']['soustraitance']) && $success;
$WebdpoSoustraitance = ClassRegistry::init('WebdpoSoustraitance');
$success = false !== $WebdpoSoustraitance->soustraitanceSave($Fiche->id, $data['Soustraitance'], $data['Fiche']['soustraitance']) && $success;
$data = $WebdpoSoustraitance->cleanAndCheckDataSoustraitance($data, $champs);
$newDataChamps = $this->checkDataConditons($data, $champs);
$data = Hash::extract($newDataChamps, 'data');
......@@ -728,161 +732,6 @@ class WebdpoFiche extends AppModel {
return ($newDataChamps);
}
private function coresponsableSave ($fiche_id, $dataCoresponsable, $useCoresponsable)
{
$success = true;
$Coresponsable = ClassRegistry::init('Coresponsable');
if (empty($dataCoresponsable['currentCoresponsable'])
&& empty($dataCoresponsable['coresponsables'])
&& $useCoresponsable == true
) {
$Coresponsable->invalidate('coresponsables', 'Champ obligatoire');
return false;
}
if (empty($fiche_id)) {
return false;
}
if ($useCoresponsable == false) {
$success = $Coresponsable->deleteAll([
'Coresponsable.fiche_id' => $fiche_id
]) && $success;
return true;
}
if (isset($dataCoresponsable['currentCoresponsable']) && !empty($dataCoresponsable['currentCoresponsable']) && !empty($dataCoresponsable['coresponsables'])) {
foreach ($dataCoresponsable['currentCoresponsable'] as $currentCoresponsable) {
if (($key = array_search($currentCoresponsable['responsable_id'], $dataCoresponsable['coresponsables'])) !== false) {
unset($dataCoresponsable['coresponsables'][$key]);
}
}
$noDeleteCoresponsable = Hash::extract($dataCoresponsable['currentCoresponsable'], '{n}.coresponsable_id');
$success = $Coresponsable->deleteAll([
'Coresponsable.id !=' => $noDeleteCoresponsable,
'Coresponsable.fiche_id' => $fiche_id
]) && $success;
} else {
$success = $Coresponsable->deleteAll([
'Coresponsable.fiche_id' => $fiche_id
]) && $success;
}
if ($success === false) {
return $success;
}
if (!empty($dataCoresponsable['coresponsables'])) {
$Responsable = ClassRegistry::init('Responsable');
foreach ($dataCoresponsable['coresponsables'] as $coresponsable_id) {
$responsable = $Responsable->find('first', [
'conditions' => [
'id' => $coresponsable_id
]
]);
$Coresponsable->create([
'fiche_id' => $fiche_id,
'responsable_id' => $responsable['Responsable']['id'],
'nomcoresponsable' => $responsable['Responsable']['nomresponsable'],
'prenomcoresponsable' => $responsable['Responsable']['prenomresponsable'],
'fonctioncoresponsable' => $responsable['Responsable']['fonctionresponsable'],
'emailcoresponsable' => $responsable['Responsable']['emailresponsable'],
'telephonecoresponsable' => $responsable['Responsable']['telephoneresponsable'],
'raisonsocialestructure' => $responsable['Responsable']['raisonsocialestructure'],
'siretstructure' => $responsable['Responsable']['siretstructure'],
'apestructure' => $responsable['Responsable']['apestructure'],
'telephonestructure' => $responsable['Responsable']['telephonestructure'],
'faxstructure' => $responsable['Responsable']['faxstructure'],
'adressestructure' => $responsable['Responsable']['adressestructure'],
'emailstructure' => $responsable['Responsable']['emailstructure']
]);
$success = false !== $Coresponsable->save(null, ['atomic' => false]) && $success;
}
}
return $success;
}
private function soustraitanceSave ($fiche_id, $dataSoustraitance, $useSoustraitance)
{
$success = true;
$Soustraitance = ClassRegistry::init('Soustraitance');
if (empty($dataSoustraitance['currentSoustraitance'])
&& empty($dataSoustraitance['soustraitances'])
&& $useSoustraitance == true
) {
$Soustraitance->invalidate('soustraitances', 'Champ obligatoire');
return false;
}
if (empty($fiche_id)) {
return false;
}
if ($useSoustraitance == false) {