Commit 84fbbbf3 authored by Antony Le Courtes's avatar Antony Le Courtes
Browse files

Refactoring sur fieldset statut pour ne plus utiliser ObjectSelect

Privilege pour validation, dévalidation et suppression dossier
parent ebb2ea1d
......@@ -174,14 +174,14 @@ return [
[//Créer un droit archivage
'controller' => 'Application\Controller\IntervenantDossier',
'action' => ['index'],
'privileges' => [Privileges::DOSSIER_VISUALISATION, Privileges::DOSSIER_IDENTITE_SUITE_EDITION, Privileges::DOSSIER_IDENTITE_SUITE_VISUALISATION],
'privileges' => [Privileges::DOSSIER_VISUALISATION],
'assertion' => IntervenantDossierAssertion::class,
],
[
'controller' => 'Application\Controller\IntervenantDossier',
'action' => ['dossier-autre-info', 'dossier-autre-saisie'],
'privileges' => [Privileges::DOSSIER_VALIDATION],
'privileges' => [Privileges::INTERVENANT_STATUT_EDITION],
'assertion' => IntervenantDossierAssertion::class,
],
......@@ -221,6 +221,8 @@ return [
IntervenantDossierAssertion::PRIV_EDIT_AUTRE5,
IntervenantDossierAssertion::PRIV_CAN_VALIDE,
IntervenantDossierAssertion::PRIV_CAN_DEVALIDE,
IntervenantDossierAssertion::PRIV_CAN_EDIT,
IntervenantDossierAssertion::PRIV_CAN_SUPPRIME,
],
......
......@@ -44,6 +44,8 @@ class IntervenantDossierAssertion extends AbstractAssertion
const PRIV_VIEW_AUTRE5 = 'dossier-voir-autre5';
const PRIV_CAN_VALIDE = 'dossier-peut-valider';
const PRIV_CAN_DEVALIDE = 'dossier-peut-devalider';
const PRIV_CAN_EDIT = 'dossier-peut-editer';
const PRIV_CAN_SUPPRIME = 'dossier-peut-supprimer';
use WorkflowServiceAwareTrait;
use DossierServiceAwareTrait;
......@@ -81,6 +83,8 @@ class IntervenantDossierAssertion extends AbstractAssertion
self::PRIV_EDIT_AUTRE5,
self::PRIV_CAN_VALIDE,
self::PRIV_CAN_DEVALIDE,
self::PRIV_CAN_EDIT,
self::PRIV_CAN_SUPPRIME,
];
$role = $this->getRole();
......@@ -139,6 +143,10 @@ class IntervenantDossierAssertion extends AbstractAssertion
return $this->assertCanValidate($entity);
case self::PRIV_CAN_DEVALIDE:
return $this->assertCanDevalidate($entity);
case self::PRIV_CAN_EDIT:
return $this->assertCanEdit($entity);
case self::PRIV_CAN_SUPPRIME:
return $this->assertCanSupprime();
}
break;
}
......@@ -402,8 +410,6 @@ class IntervenantDossierAssertion extends AbstractAssertion
!$isValidate,
$this->getRole()->hasPrivilege(Privileges::DOSSIER_VALIDATION),
]);
return $isComplete;
}
......@@ -415,10 +421,31 @@ class IntervenantDossierAssertion extends AbstractAssertion
return $this->asserts([
$isValidate,
$this->getRole()->hasPrivilege(Privileges::DOSSIER_VALIDATION),
$this->getRole()->hasPrivilege(Privileges::DOSSIER_DEVALIDATION),
]);
}
return $isComplete;
protected function assertCanEdit(Intervenant $intervenant)
{
$isValidate = $this->getServiceDossier()->getValidation($intervenant);
return $this->asserts([
!$isValidate,
$this->getRole()->hasPrivilege(Privileges::DOSSIER_EDITION),
]);
}
protected function assertCanSupprime()
{
return $this->asserts([
$this->getRole()->hasPrivilege(Privileges::DOSSIER_SUPPRESSION),
]);
}
......
......@@ -76,17 +76,13 @@ class IntervenantDossierController extends AbstractController
throw new \LogicException('Intervenant non précisé ou inexistant');
}
/* Récupération du dossier de l'intervenant */
$service = $this->getServiceDossier();
$intervenantDossier = $this->getServiceDossier()->getByIntervenant($intervenant);
$intervenantDossierValidation = $this->getServiceDossier()->getValidation($intervenant);
$intervenantDossierStatut = $intervenantDossier->getStatut();
$intervenantDossierCompletude = $this->getServiceDossier()->isComplete($intervenant);
/* Initialisation du formulaire */
$form = $this->getIntervenantDossierForm($intervenant);
$champsAutres = $intervenant->getStatut()->getChampsAutres();
$champsAutres = $intervenantDossier->getStatut()->getChampsAutres();
/* Règles pour afficher ou non les fieldsets */
$fieldsetRules = [
$fieldsetRules = [
'fieldset-identite' => $intervenantDossier->getStatut()->getDossierIdentite(),
'fieldset-adresse' => $intervenantDossier->getStatut()->getDossierAdresse(),
'fieldset-contact' => $intervenantDossier->getStatut()->getDossierContact(),
......@@ -94,19 +90,17 @@ class IntervenantDossierController extends AbstractController
'fieldset-insee' => $intervenantDossier->getStatut()->getDossierInsee(),
'fieldset-employeur' => $intervenantDossier->getStatut()->getDossierEmployeur(),
'fieldset-autres' => (!empty($champsAutres)) ? 1 : 0,//Si le statut intervenant a au moins 1 champs autre
];
$privileges['edit'] = $this->isAllowed(Privileges::getResourceId(Privileges::DOSSIER_EDITION));
$privileges['valider'] = $this->isAllowed($intervenant, IntervenantDossierAssertion::PRIV_CAN_VALIDE);
$privileges['devalider'] = $this->isAllowed($intervenant, IntervenantDossierAssertion::PRIV_CAN_DEVALIDE);
$privileges['supprimer'] = $this->isAllowed(Privileges::getResourceId(Privileges::DOSSIER_SUPPRESSION));
/* Initialisation du formulaire */
$form = $this->getIntervenantDossierForm($intervenant);
/* Traitement du formulaire */
$form->bindRequestSave($intervenantDossier, $this->getRequest(), function (\Application\Entity\Db\IntervenantDossier $intervenantDossier) use ($intervenant) {
try {
/* Sauvegarde du dossier de l'intervenant */
$this->getServiceDossier()->save($intervenantDossier);
/* Recalcul des tableaux de bord nécessaires */
$this->updateTableauxBord($intervenant);
$this->flashMessenger()->addSuccessMessage('Enregistrement effectué');
......@@ -115,6 +109,7 @@ class IntervenantDossierController extends AbstractController
}
});
$iPrec = $this->getServiceDossier()->intervenantVacataireAnneesPrecedentes($intervenant, 1);
$lastHETD = $iPrec ? $this->getServiceService()->getTotalHetdIntervenant($iPrec) : 0;
......@@ -129,6 +124,11 @@ class IntervenantDossierController extends AbstractController
: sprintf("L'intervenant a effectué %s HETD en %s.", $hetd, $iPrec->getAnnee())
);
}
//Si on vient de poster le form alors on redirige pour rafraichir le form après le bindRequestSave
/*if ($this->getRequest()->isPost()) {
return $this->redirect()->toUrl($this->url()->fromRoute('intervenant/dossier', [], [], true));
}*/
return compact(
['form',
......@@ -138,7 +138,6 @@ class IntervenantDossierController extends AbstractController
'intervenantDossierValidation',
'intervenantDossierStatut',
'intervenantDossierCompletude',
'privileges',
'champsAutres',
'fieldsetRules']
);
......
......@@ -81,7 +81,5 @@ class DossierInseeFieldset extends AbstractFieldset
];
return $spec;
return [];
}
}
\ No newline at end of file
<?php
namespace Application\Form\Intervenant\Dossier;
use Application\Form\AbstractFieldset;
use Application\Service\Traits\ContextServiceAwareTrait;
use Application\Service\Traits\StatutIntervenantServiceAwareTrait;
use Application\Validator\NumeroINSEEValidator;
/**
* Description of DossierStatutFieldset
*
*/
class DossierStatutFieldset extends AbstractFieldset
{
use ContextServiceAwareTrait;
use StatutIntervenantServiceAwareTrait;
public function init()
{
$this->addElements();
}
private function addElements()
{
/**
* Statut intervenant
*/
$this->add([
'name' => 'statut',
'options' => [
'label' => 'Quel est votre statut ? <span class="text-danger">*</span>',
'label_options' => ['disable_html_escape' => true],
],
'attributes' => [
],
'type' => 'Select',
]);
$statutIntervenant = $this->getOption('statutIntervenant');
$this->get('statut')
->setValueOptions(\UnicaenApp\Util::collectionAsOptions($this->getServiceStatutIntervenant()->getStatutSelectable($statutIntervenant)));
return $this;
}
public function getInputFilterSpecification()
{
return [];
}
}
\ No newline at end of file
......@@ -12,6 +12,7 @@ use Application\Form\Intervenant\Dossier\DossierBancaireFieldset;
use Application\Form\Intervenant\Dossier\DossierContactFieldset;
use Application\Form\Intervenant\Dossier\DossierIdentiteFieldset;
use Application\Form\Intervenant\Dossier\DossierInseeFieldset;
use Application\Form\Intervenant\Dossier\DossierStatutFieldset;
use Application\Hydrator\IntervenantDossierHydrator;
use Application\Provider\Privilege\Privileges;
use Application\Service\Traits\ContextServiceAwareTrait;
......@@ -77,12 +78,12 @@ class IntervenantDossierForm extends AbstractForm
$statutIntervenant = $this->intervenant->getStatut();
$haveContact = $statutIntervenant->getDossierContact();
$serviceAuthorize = $this->getServiceContext()->getAuthorize();
$role = $this->getServiceContext()->getUtilisateur()->getRoles();
$hydrator = new IntervenantDossierHydrator();
$hydrator = new IntervenantDossierHydrator();
$this->setHydrator($hydrator);
$this->dossierStatutFieldset = new DossierStatutFieldset('DossierStatut', ['statutIntervenant' => $statutIntervenant]);
$this->dossierStatutFieldset->init();
$this->dossierIdentiteFieldset = new DossierIdentiteFieldset('DossierIdentite');
$this->dossierIdentiteFieldset->init();
......@@ -104,8 +105,10 @@ class IntervenantDossierForm extends AbstractForm
$this->dossierAutresFiedlset = new DossierAutresFieldset('DossierAutres', ['listChampsAutres' => $statutIntervenant->getChampsAutres()]);
$this->dossierAutresFiedlset->init();
$this->setAttribute('id', 'dossier');
$this->add($this->dossierStatutFieldset);
$this->add($this->dossierIdentiteFieldset);
$this->add($this->dossierAdresseFieldset);
$this->add($this->dossierContactFiedlset);
......@@ -117,32 +120,31 @@ class IntervenantDossierForm extends AbstractForm
/**
* Select pour Statut intervenant customisé
*/
$statut = new StatutIntervenantSelect('statut', [
'label' => "Quel est votre statut ?",
'empty_option' => "(Sélectionnez...)",
'value' => '',
]);
/* $statut = new StatutIntervenantSelect('statut', [
'label' => "Quel est votre statut ?",
'value' => '',
]);
$statut->getProxy()
->setFindMethod([
'name' => 'findBy',
'params' => [
'criteria' => ['peutChoisirDansDossier' => true],
'orderBy' => ['ordre' => 'ASC'],
],
])
->setObjectManager($this->getServiceContext()->getEntityManager())
->setTargetClass(\Application\Entity\Db\StatutIntervenant::class);
$statut->getProxy()
->setFindMethod([
'name' => 'findBy',
'params' => [
'criteria' => ['peutChoisirDansDossier' => true],
'orderBy' => ['ordre' => 'ASC'],
],
])
->setObjectManager($this->getServiceContext()->getEntityManager())
->setTargetClass(\Application\Entity\Db\StatutIntervenant::class);
//Si le statut de l'intervenant n'est pas dans la liste des statuts sélectionnable on le rajoute à la main
//Si le statut de l'intervenant n'est pas dans la liste des statuts sélectionnable on le rajoute à la main
$statutValues = $statut->getValueOptions();
$statut->setOptions([$statutIntervenant]);
$statutValues = $statut->getValueOptions();
$statutValues = $statut->getValueOptions();
$statut->setOptions([$statutIntervenant]);
$statutValues = $statut->getValueOptions();
$this->add($statut);
$this->add($statut);*/
/**
* Csrf
......@@ -176,15 +178,6 @@ class IntervenantDossierForm extends AbstractForm
{
$dossier = $this->getServiceDossier()->getByIntervenant($intervenant);
$dossierFieldset = $this->get('dossier');
/* @var $dossierFieldset DossierFieldset */
if ($lastHETD > 0) {
/**
* Si l'intervenant était un vacataire connu l'année précédente, alors
* la question "Avez-vous exercé une activité..." est retirée puisque la réponse est forcément OUI.
*/
$dossierFieldset->remove('premierRecrutement');
}
/**
* Pas de sélection de la France par défaut si le numéro INSEE correspond à une naissance hors France.
......
......@@ -112,7 +112,7 @@ class IntervenantDossierHydrator implements HydratorInterface
/* Extract statut intervenant */
$data['statut'] = (!empty($object->getStatut())) ? $object->getStatut()->getId() : '';
$data['DossierStatut']['statut'] = (!empty($object->getStatut())) ? $object->getStatut()->getId() : '';
/* Extract Champs autres */
/* Il faudra penser à gérer les champs de type select*/
......@@ -141,7 +141,7 @@ class IntervenantDossierHydrator implements HydratorInterface
{
//Sécurisation de l'hydratation de l'object pour ne pas mettre à jour les valeurs si on a pas le privilege
$var = "";
/* @var $object IntervenantDossier */
//Hydratation de l'indentité
if (isset($data['DossierIdentite'])) {
......@@ -226,8 +226,8 @@ class IntervenantDossierHydrator implements HydratorInterface
}
//Hydratation statut
if (!empty($data['statut'])) {
$statut = $this->getServiceStatutIntervenant()->get($data['statut']);
if (!empty($data['DossierStatut']['statut'])) {
$statut = $this->getServiceStatutIntervenant()->get($data['DossierStatut']['statut']);
$object->setStatut($statut);
} else {
$object->setStatut(null);
......
......@@ -2,7 +2,6 @@
namespace Application\Service;
use Application\Entity\Db\Dossier;
use Application\Entity\Db\Intervenant;
use Application\Entity\Db\IntervenantDossier;
use Application\Entity\Db\Utilisateur;
......@@ -12,7 +11,7 @@ use Application\Service\Traits\IntervenantServiceAwareTrait;
use Application\Service\Traits\ValidationServiceAwareTrait;
/**
* Description of Dossier
* Description of Intervenant Dossier
*
* @author Laurent LÉCLUSE <laurent.lecluse at unicaen.fr>
*
......@@ -60,7 +59,7 @@ class DossierService extends AbstractEntityService
/**
* @param Intervenant $intervenant
*
* @return Dossier|null
* @return IntervenantDossier|null
*/
public function getByIntervenant(Intervenant $intervenant)
{
......@@ -87,9 +86,9 @@ class DossierService extends AbstractEntityService
* NB: tout le travail est déjà fait via un formulaire en fait!
* Cette méthode existe surtout pour déclencher l'événement de workflow.
*
* @param \Application\Entity\Db\Dossier $dossier
* @param \Application\Entity\Db\IntervenantDossier $dossier
*/
public function enregistrerDossier(Dossier $dossier)
public function enregistrerDossier(IntervenantDossier $dossier)
{
$this->getEntityManager()->persist($this->getServiceContext()->getUtilisateur());
$this->getEntityManager()->persist($dossier);
......@@ -185,17 +184,30 @@ class DossierService extends AbstractEntityService
//Complétude de contact
$completudeDossierContact = (($intervenantDossier->getEmailPerso() || $intervenantDossier->getEmailPro()) &&
($intervenantDossier->getTelPerso() || $intervenantDossier->getTelPro)) ? true : false;
($intervenantDossier->getTelPerso() || $intervenantDossier->getTelPro())) ? true : false;
//Complétude Insee
$completudeDossierInsee = ($intervenantDossier->getNumeroInsee()) ? true : false;
//Complétude Iban
$completudeDossierIban = true;
$completudeDossierIban = (($intervenantDossier->getIBAN() && $intervenantDossier->getBIC()) || $intervenantDossier->isRibHorsSepa()) ? true : false;
//Complètude Employeur
$completudeDossierEmployeur = true;
$completudeDossierEmployeur = ($intervenantDossier->getEmployeur()) ? true : false;
//Complétude Autres
$statut = $intervenantDossier->getStatut();
$champsAutres = $intervenantDossier->getStatut()->getChampsAutres();
$statutChampsAutres = ($intervenantDossier->getStatut()) ? $intervenantDossier->getStatut()->getChampsAutres() : [];
$count = count($champsAutres);
$completudeDossierAutre = true;
foreach ($statutChampsAutres as $champ) {
$method = 'getAutre' . $champ->getId();
$obligatoire = $champ->isObligatoire();
if (empty($intervenantDossier->$method()) && $champ->isObligatoire()) {
$completudeDossierAutre = false;
break;
}
}
$completudeDossier = ($completudeDossierIdentie &&
$completudeDossierAdresse &&
......@@ -205,16 +217,14 @@ class DossierService extends AbstractEntityService
$completudeDossierEmployeur &&
$completudeDossierAutre) ? true : false;
$completude = [
'dossier' => $completudeDossier,
'dossierIdentite' => $completudeDossierIdentie,
'dossierAdresse' => $completudeDossierAdresse,
'dossierContact' => $completudeDossierContact,
'dossierInsee' => $completudeDossierInsee,
'dossierIban' => $completudeDossierIban,
'dossierEmployeur' => $completudeDossierEmployeur,
'dossierAutres' => $completudeDossierAutre,
];
$completude = ['dossier' => $completudeDossier,
'dossierIdentite' => $completudeDossierIdentie,
'dossierAdresse' => $completudeDossierAdresse,
'dossierContact' => $completudeDossierContact,
'dossierInsee' => $completudeDossierInsee,
'dossierIban' => $completudeDossierIban,
'dossierEmployeur' => $completudeDossierEmployeur,
'dossierAutres' => $completudeDossierAutre,];
return $completude;
}
......@@ -229,7 +239,8 @@ class DossierService extends AbstractEntityService
*
* @return $this
*/
public function purgerDonneesPersoModif(Intervenant $intervenant, Utilisateur $destructeur)
public
function purgerDonneesPersoModif(Intervenant $intervenant, Utilisateur $destructeur)
{
$qb = $this->getEntityManager()->createQueryBuilder()
->update(\Application\Entity\Db\IndicModifDossier::class, 't')
......
......@@ -5,6 +5,7 @@ namespace Application\Service;
use Application\Entity\Db\StatutIntervenant;
use Application\Service\Traits\SourceServiceAwareTrait;
use Doctrine\ORM\QueryBuilder;
use Zend\Loader\StandardAutoloader;
/**
* Description of StatutIntervenant
......@@ -68,15 +69,27 @@ class StatutIntervenantService extends AbstractEntityService
public function getStatutSelectable($criteria = [])
public function getStatutSelectable(StatutIntervenant $statutIntervenant, QueryBuilder $qb = null, $alias = null)
{
$qb = $this->getEntityManager()->getRepository('Application\Entity\StatutIntervenant')->createQueryBuilder('s');
foreach ($criteria as $key => $value) {
$qb->orWhere($key, $value);
[$qb, $alias] = $this->initQuery($qb, $alias);
$var = '';
$qb->orWhere("$alias.peutChoisirDansDossier = 1");
if ($statutIntervenant instanceof StatutIntervenant) {
$qb->orWhere($alias . ' = :statutIntervenant');
}
$qb->addOrderBy("$alias.ordre");
$qb->setParameter('statutIntervenant', $statutIntervenant);
$entities = $qb->getQuery()->execute();
$result = [];
$entityClass = $this->getEntityClass();
foreach ($entities as $entity) {
if ($entity instanceof $entityClass) {
$result[$entity->getId()] = $entity;
}
}
$qb->orderBy('ordre', 'ASC');
return $qb->getQuery()->getResult();
return $result;
}
......@@ -102,7 +115,7 @@ class StatutIntervenantService extends AbstractEntityService
*/
public function fetchMaxOrdre(): int
{
$sql = 'SELECT MAX(ORDRE) MAX_ORDRE FROM STATUT_INTERVENANT WHERE HISTO_DESTRUCTION IS NULL';
$sql = 'SELECT MAX(ORDRE) MAX_ORDRE FROM STATUT_INTERVENANT WHERE HISTO_DESTRUCTION IS null';
$res = $this->getEntityManager()->getConnection()->fetchColumn($sql, [], 0);
......
......@@ -10,7 +10,9 @@ $editInsee = $this->isAllowed($intervenant, IntervenantDossierAssertion::PRI
$editIban = $this->isAllowed($intervenant, IntervenantDossierAssertion::PRIV_EDIT_IBAN);
$editEmployeur = $this->isAllowed($intervenant, IntervenantDossierAssertion::PRIV_EDIT_EMPLOYEUR);
$canValider = $this->isAllowed($intervenant, IntervenantDossierAssertion::PRIV_CAN_VALIDE);
$canValider = $this->isAllowed($intervenant, IntervenantDossierAssertion::PRIV_CAN_VALIDE);
$canDevalider = $this->isAllowed($intervenant, IntervenantDossierAssertion::PRIV_CAN_DEVALIDE);
$canEdit = $this->isAllowed($intervenant, IntervenantDossierAssertion::PRIV_CAN_EDIT);
$canSupprimer = $this->isAllowed($intervenant, IntervenantDossierAssertion::PRIV_CAN_SUPPRIME);
//$nextEtape = $validation ? WfEtape::CODE_DONNEES_PERSO_VALIDATION : WfEtape::CODE_DONNEES_PERSO_SAISIE;
$nextEtape = '';
......@@ -58,26 +60,9 @@ $fieldsets = $form->getFieldsets();
echo $this->form()->openTag($form);
?>
<div class="row">
<div class="col-md-12">
<div class="panel panel-default">
<div class="panel-heading">
STATUT
<?php if (!$intervenantDossierCompletude['dossierIdentite']): ?>
<small><span class="label label-warning">A compléter</span></small>
<?php else: ?>
<small><span class="label label-success">Complet</span></small>
<?php endif; ?>
</div>
<div class="panel-body">
<?php
echo $this->formControlGroup($form->get('statut'));
?>
</div>
</div>
</div>
<?= $this->partial('application/intervenant-dossier/partial/formStatut', compact('form', 'intervenant', 'intervenantDossier', 'intervenantDossierCompletude')); ?>
</div>
<?php if (empty($intervenantDossierStatut)): ?>
<div class="row display-flex hidden">
<?php else: ?>
......@@ -144,12 +129,12 @@ $fieldsets = $form->getFieldsets();
<div class="col-md-12">
<?php
echo $this->formHidden($this->form->get('security'));
if ($privileges['edit']) {
if ($canEdit) {
echo $this->formSubmit($form->get('submit'));
}
?>
<?php if ($privileges['valider']): ?>
<?php if ($canValider): ?>
<a class="valider-dossier btn btn-success pop-ajax"
href="<?= $this->url('intervenant/dossier/valider', [], [], true) ?>"
title="Valider les données personnelles"
......@@ -163,7 +148,7 @@ $fieldsets = $form->getFieldsets();
</a>
<?php endif ?>