Commit 9651bbd2 authored by Christian BUFFIN's avatar Christian BUFFIN
Browse files

Corrections et améliorations pour les types d'annexes: traductions,...

Corrections et améliorations pour les types d'annexes: traductions, vérifications des accès des utilisateurs, URL d'envoi du formulaire lors d'une modification, à présent on ne peut plus modifier un type d'annexe lorsqu'il est associé à une entité (cmme pour la suppression).
parent fbcb315d
......@@ -25,9 +25,7 @@ App::uses('ListeDroit', 'Model');
class TypagesController extends AppController {
public $uses = [
'Typage',
'TypageOrganisation',
'Organisation'
'Typage'
];
/**
......@@ -49,6 +47,7 @@ class TypagesController extends AppController {
$query = [
'contain' => [
'Organisation' => [
'id',
'raisonsociale',
'order' => ['raisonsociale']
]
......@@ -65,13 +64,13 @@ class TypagesController extends AppController {
}
$success = true;
$this->TypageOrganisation->begin();
$this->Typage->TypageOrganisation->begin();
$organisations_ids = Hash::extract($this->request->data, 'TypageOrganisation.organisation_id');
$typage_ids = Hash::extract($this->request->data, 'TypageOrganisation.typage_id');
foreach ($organisations_ids as $organisation_id) {
$typageEntite = $this->TypageOrganisation->find('list', [
$typageEntite = $this->Typage->TypageOrganisation->find('list', [
'conditions' => [
'organisation_id' => $organisation_id
],
......@@ -91,19 +90,19 @@ class TypagesController extends AppController {
]
];
$this->TypageOrganisation->create($data);
$success = $success && false !== $this->TypageOrganisation->save(null, ['atomic' => false]);
$this->Typage->TypageOrganisation->create($data);
$success = $success && false !== $this->Typage->TypageOrganisation->save(null, ['atomic' => false]);
}
}
if ($success == true) {
$this->Organisation->commit();
$this->Session->setFlash(__d('responsable', 'responsable.flashsuccessSousTraitantAffecterEnregistrer'), 'flashsuccess');
$this->Typage->commit();
$this->Session->setFlash(__d('typage', 'typage.flashsuccessTypageAffecterEnregistrer'), 'flashsuccess');
$this->redirect(['action' => 'index']);
} else {
$this->Organisation->rollback();
$this->Session->setFlash(__d('responsable', 'responsable.flasherrorErreurEnregistrementSousTraitantAffecter'), 'flasherror');
$this->Typage->rollback();
$this->Session->setFlash(__d('typage', 'typage.flasherrorErreurEnregistrementTypageAffecter'), 'flasherror');
}
}
......@@ -136,6 +135,47 @@ class TypagesController extends AppController {
{
return $this->edit();
}
/**
* Récupère et renvoie un type d'annexe en fonction de l'utilisateur connecté (SU ou utilisateur appartenant l'ayant
* créé) et vérifie que celui-ci n'est associé à aucun entité.
*
* Utilisé pour vérification avant modification ou suppression d'un type d'annexe.
*
* @throws NotFoundException
* @throws ForbiddenException
*
* @param int $id L'id du type d'annexe
* @return array
*/
protected function _getAndCheckTypageAccessAndUsage($id)
{
$query = [
'fields' => array_merge(
$this->Typage->fields(),
[$this->Typage->vfLinkedOrganisationsCount()]
),
'conditions' => [
'Typage.id' => $id
]
];
$typage = $this->Typage->find('first', $query);
if (empty($typage) === true) {
throw new NotFoundException();
}
if ($typage['Typage']['organisations_count'] > 0) {
throw new ForbiddenException(__d('default', 'default.flasherrorPasDroitPage'));
}
// A-t-on les droits sur l'enregistrement ?
if ($this->Droits->isSu() === false && $typage['Typage']['createdbyorganisation'] !== null && $typage['Typage']['createdbyorganisation'] !== $this->Session->read('Organisation.id')) {
throw new ForbiddenException(__d('default', 'default.flasherrorPasDroitPage'));
}
return $typage;
}
/**
* Fonction qui permet la modification d'une norme
......@@ -157,11 +197,7 @@ class TypagesController extends AppController {
if ($this->request->params['action'] === 'add') {
$this->set('title', __d('typage', 'typage.titreAddType'));
} else {
if (empty($id)) {
$this->Session->setFlash(__d('typage', 'typage.flasherrorEditTypage'), 'flasherror');
$this->redirect(['action' => 'index']);
}
$typage = $this->_getAndCheckTypageAccessAndUsage($id);
$this->set('title', __d('typage', 'typage.titreeditType'));
}
......@@ -170,38 +206,31 @@ class TypagesController extends AppController {
$this->redirect($this->Referers->get());
}
$success = true;
$this->Typage->begin();
$data = $this->request->data;
if ($this->request->params['action'] === 'edit') {
$data['Typage']['id'] = $id;
}
if ($this->request->params['action'] === 'add') {
$data = $this->request->data;
$data['Typage']['createdbyorganisation'] = $this->Session->read('Organisation.id');
} else {
$data = $typage;
$data['Typage']['libelle'] = Hash::get($this->request->data, 'Typage.libelle');
unset($data['Typage']['created'], $data['Typage']['modified']);
}
$this->Typage->create($data);
$success = $success && false !== $this->Typage->save();
if ($success == true) {
$this->Typage->commit();
if (false !== $this->Typage->save(null, ['atomic' => true])) {
$this->Session->setFlash(__d('typage', 'typage.flashsuccesSaveTypage'), 'flashsuccess');
$this->redirect($this->Referers->get());
} else {
$this->Typage->rollback();
$this->Session->setFlash(__d('typage', 'typage.flasherrorSaveTypage'), 'flasherror');
}
} elseif ($this->request->params['action'] === 'edit') {
$this->request->data = $typage;
}
$this->view = 'edit';
}
/**
* Fonction qui permet de supprimer un responsable liée à l'entité
* Fonction qui permet de supprimer un type d'annexe liée à l'entité
*
* @param int $type_id
* @throws ForbiddenException
......@@ -212,23 +241,22 @@ class TypagesController extends AppController {
* @version V1.2.0
*/
public function dissocier($type_id) {
if (true !== $this->Droits->authorized(ListeDroit::GESTION_CORESPONSABLE)) {
if (true !== $this->Droits->authorized(ListeDroit::GESTION_TYPAGE)) {
throw new ForbiddenException(__d('default', 'default.flasherrorPasDroitPage'));
}
$success = true;
$this->TypageOrganisation->begin();
$this->Typage->TypageOrganisation->begin();
$success = $success && false !== $this->TypageOrganisation->deleteAll([
$success = false !== $this->Typage->TypageOrganisation->deleteAll([
'TypageOrganisation.organisation_id' => $this->Session->read('Organisation.id'),
'TypageOrganisation.typage_id' => $type_id
]);
if ($success == true) {
$this->TypageOrganisation->commit();
$this->Typage->TypageOrganisation->commit();
$this->Session->setFlash(__d('typage', 'typage.flashsuccessDissocier'), 'flashsuccess');
} else {
$this->TypageOrganisation->rollback();
$this->Typage->TypageOrganisation->rollback();
$this->Session->setFlash(__d('typage', 'typage.flasherrorErreurDissocier'), 'flasherror');
}
......@@ -236,9 +264,9 @@ class TypagesController extends AppController {
}
/**
* Permet de supprimer un responsable
* Permet de supprimer un type d'annexe
*
* @param type $id | Id du responsable
* @param int $id | Id du type d'annexe
*
* @author Théo GUILLON <theo.guillon@libriciel.coop>
* @access public
......@@ -246,33 +274,19 @@ class TypagesController extends AppController {
* @version V1.2.0
*/
public function delete($id) {
if (true !== $this->Droits->authorized(ListeDroit::GESTION_CORESPONSABLE)) {
if (true !== $this->Droits->authorized(ListeDroit::GESTION_TYPAGE)) {
throw new ForbiddenException(__d('default', 'default.flasherrorPasDroitPage'));
}
$associationTypage = $this->TypageOrganisation->find('all', [
'conditions' => [
'typage_id' => $id
]
]);
if (empty($associationTypage)) {
$success = true;
$this->Typage->begin();
$success = $success && false !== $this->Typage->deleteAll([
'id' => $id
]);
$this->_getAndCheckTypageAccessAndUsage($id);
if ($success == true) {
$this->Typage->commit();
$this->Session->setFlash(__d('responsable', 'responsable.flashsuccessSuppressionResponsableEntite'), 'flashsuccess');
} else {
$this->Typage->rollback();
$this->Session->setFlash(__d('responsable', 'responsable.flasherrorErreurSuppressionResponsableEntite'), 'flasherror');
}
$this->Typage->begin();
if ($this->Typage->delete($id) === true) {
$this->Typage->commit();
$this->Session->setFlash(__d('typage', 'typage.flashsuccessSuppressionTypage'), 'flashsuccess');
} else {
$this->Session->setFlash(__d('responsable', 'responsable.flasherrorErreurAssociationExistanteResponsableEntite'), 'flasherror');
$this->Typage->rollback();
$this->Session->setFlash(__d('typage', 'typage.flasherrorErreurSuppressionTypage'), 'flasherror');
}
$this->redirect(['action' => 'index']);
......
......@@ -30,8 +30,14 @@ msgstr "Modification d'un type d'annexe"
#### SUCCESS ####
msgid "typage.flashsuccessTypageAffecterEnregistrer"
msgstr "L'association du type d'annexe a été enregistrée"
msgid "typage.flashsuccesSaveTypage"
msgstr "Le type d'annexe a bien été enregistée"
msgstr "Le type d'annexe a bien été enregisté"
msgid "typage.flashsuccessSuppressionTypage"
msgstr "La suppression du type d'annexe a été enregistée"
msgid "typage.flashsuccessDissocier"
msgstr "La dissociation du type d'annexe a été enregistée"
......@@ -40,14 +46,20 @@ msgstr "La dissociation du type d'annexe a été enregistée"
#### ERREUR ####
msgid "typage.flasherrorErreurEnregistrementTypageAffecter"
msgstr "Une erreur est survenue lors de l'association du type d'annexe"
msgid "typage.flasherrorSaveTypage"
msgstr "Une erreur est survenue lors de l'enregistrement du type d'annexe"
msgid "typage.flasherrorEditTypage"
msgstr "Une erreur est survenue lors de la modification du type d'annexe"
msgid "typage.flasherrorSuppressionTypage"
msgstr "Une erreur est survenue lors de la suppression du type d'annexe"
msgid "typage.flasherrorErreurDissocier"
msgstr "Une erreur est survenue lors de la dissociation du responsable de l'entité"
msgstr "Une erreur est survenue lors de la dissociation du type d'annexe"
################
......@@ -70,6 +82,9 @@ msgstr "Actions"
msgid "typage.btnAddType"
msgstr "Ajouter un type"
msgid "typage.commentaireBtnModifierType"
msgstr "Modifier le type d'annexe"
msgid "typage.commentaireBtnDeleteType"
msgstr "Supprimer le type d'annexe"
......@@ -101,4 +116,4 @@ msgstr "Libelle"
msgid "typage.placeholderChampLibelle"
msgstr "Nom du type d'annexe"
###############################################################################
\ No newline at end of file
###############################################################################
......@@ -70,4 +70,24 @@ class Typage extends AppModel {
'with' => 'TypageOrganisation'
]
];
/**
* Retourne un champ virtuel contenant le nombre d'entités liées au @fixme.
*
* @param string $primaryKeyField | 'Typage.id' --> Champ représentant le Typage.id
* @param string $fieldName | 'organisations_count' --> Nom du champ virtuel
* @return string
*/
public function vfLinkedOrganisationsCount($primaryKeyField = 'Typage.id', $fieldName = 'organisations_count') {
$subQuery = [
'alias' => 'typages_organisations',
'fields' => ['COUNT(DISTINCT(typages_organisations.organisation_id))'],
'conditions' => [
"typages_organisations.typage_id = {$primaryKeyField}"
],
'contain' => false
];
$sql = $this->TypageOrganisation->sql($subQuery);
return "( {$sql} ) AS \"{$this->alias}__{$fieldName}\"";
}
}
......@@ -23,7 +23,6 @@
<?php
echo $this->WebcilForm->create('Typage',[
'url' => 'add',
'autocomplete' => 'off',
'inputDefaults' => ['div' => false],
'class' => 'form-horizontal',
......@@ -52,4 +51,4 @@
</div>
<?php
echo $this->WebcilForm->end();
\ No newline at end of file
echo $this->WebcilForm->end();
......@@ -69,9 +69,9 @@ if (!empty($typages)) {
<!-- Entité -->
<td class="tdleft">
<?php
$items = Hash::extract($typage, 'Organisation.{n}.raisonsociale');
if (empty($items) === false) {
echo '<ul><li>' . implode('</li><li>', $items) . '</li></ul>';
$organisations = Hash::extract($typage, 'Organisation.{n}.id');
if (empty($organisations) === false) {
echo '<ul><li>' . implode('</li><li>', Hash::extract($typage, 'Organisation.{n}.raisonsociale')) . '</li></ul>';
}
?>
</td>
......@@ -81,17 +81,17 @@ if (!empty($typages)) {
<div class="btn-group">
<?php
if ($this->Session->read('Su') || $typage['Typage']['createdbyorganisation'] == $this->Session->read('Organisation.id')) {
echo $this->Html->link('<span class="fa fa-pencil fa-lg"><!----></span>', [
'controller' => 'typages',
'action' => 'edit',
$typage['Typage']['id']
], [
'class' => 'btn btn-default-default btn-sm my-tooltip',
'title' => __d('responsable', 'responsable.commentaireBtnModifierResponsable'),
'escape' => false,
]);
if (empty($organisations) === true) {
echo $this->Html->link('<span class="fa fa-pencil fa-lg"><!----></span>', [
'controller' => 'typages',
'action' => 'edit',
$typage['Typage']['id']
], [
'class' => 'btn btn-default-default btn-sm my-tooltip',
'title' => __d('typage', 'typage.commentaireBtnModifierType'),
'escape' => false,
]);
if (empty($typage['Organisation'])) {
echo $this->Html->link('<span class="fa fa-trash fa-lg"><!----></span>', [
'controller' => 'typages',
'action' => 'delete',
......@@ -104,7 +104,7 @@ if (!empty($typages)) {
}
}
if ($this->Session->read('Su') || !empty($typage['Organisation'])) {
if (in_array($this->Session->read('Organisation.id'), $organisations, true) === true) {
echo $this->Html->link('<span class="fa fa-chain-broken fa-lg"><!----></span>', [
'controller' => 'typages',
'action' => 'dissocier',
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment