From 33f1db8671006b1bbd4c6eb3d6dee815a7d109fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laurent=20L=C3=A9cluse?= <laurent.lecluse@unicaen.fr> Date: Mon, 27 Sep 2021 14:15:01 +0200 Subject: [PATCH] =?UTF-8?q?Possibilit=C3=A9=20d'autovalider=20les=20servic?= =?UTF-8?q?es=20et=20les=20heures=20de=20r=C3=A9f=C3=A9rentiel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 3 + data/privileges.php | 2 + module/Application/config/service.config.php | 20 +++-- .../Assertion/ServiceAssertion.php | 73 +++++++++++++++++-- .../Entity/Db/VolumeHoraireReferentiel.php | 11 ++- .../VolumeHoraire/SaisieMultipleFieldset.php | 50 +++++++------ .../Provider/Privilege/Privileges.php | 2 + .../VolumeHoraireReferentielService.php | 17 +++-- .../Service/VolumeHoraireService.php | 19 +++-- 9 files changed, 146 insertions(+), 51 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 639e927f75..afce10db6b 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,7 +22,10 @@ Objectif : Connecteur Export OSE => Logiciel RH * Au niveau du connecteur Actul+, les formations fermées étaient ignorées, elles sont également synchronisées +## Nouveautés +* Nouvelle vue V_IMPORT_DEPUIS_DOSSIERS pouvant servir pour peupler les données des intervenants à partir des données personnelles +* Possibilité pour un gestionnire de saisir des heures d'enseignement ou de référentiel qui n'auront pas besoin d'être validées par la suite (nouveau privilège d'autovalidation associé) # OSE 16 (14/09/2021) diff --git a/data/privileges.php b/data/privileges.php index d2059363d4..1714682aae 100644 --- a/data/privileges.php +++ b/data/privileges.php @@ -124,6 +124,7 @@ return [ 'edition-masse' => 'Édition en masse', 'exterieur' => 'Saisie de service dans une autre autre université', 'validation' => 'Validation', + 'autovalidation' => 'Validation automatique', 'devalidation' => 'Dévalidation', 'export-pdf' => 'Export PDF', 'export-csv' => 'Export CSV', @@ -146,6 +147,7 @@ return [ 'visualisation' => 'Visualisation', 'edition' => 'Édition', 'validation' => 'Validation', + 'autovalidation' => 'Validation automatique', 'admin-edition' => 'Administration - Édition', 'devalidation' => 'Dévalidation', 'admin-visualisation' => 'Administration - Visualisation', diff --git a/module/Application/config/service.config.php b/module/Application/config/service.config.php index 0d4099f868..9be8e35514 100755 --- a/module/Application/config/service.config.php +++ b/module/Application/config/service.config.php @@ -394,8 +394,10 @@ return [ ], 'resource_providers' => [ \BjyAuthorize\Provider\Resource\Config::class => [ - 'Service' => [], - 'ServiceReferentiel' => [], + 'Service' => [], + 'ServiceReferentiel' => [], + 'VolumeHoraire' => [], + 'VolumeHoraireReferentiel' => [], ], ], 'rule_providers' => [ @@ -411,8 +413,11 @@ return [ 'assertion' => Assertion\ServiceAssertion::class, ], [ - 'privileges' => Privileges::ENSEIGNEMENT_VALIDATION, - 'resources' => 'Validation', + 'privileges' => [ + Privileges::ENSEIGNEMENT_VALIDATION, + Privileges::ENSEIGNEMENT_AUTOVALIDATION, + ], + 'resources' => ['Service', 'VolumeHoraire', 'Validation'], 'assertion' => Assertion\ServiceAssertion::class, ], [ @@ -446,8 +451,11 @@ return [ 'assertion' => Assertion\ServiceAssertion::class, ], [ - 'privileges' => Privileges::REFERENTIEL_VALIDATION, - 'resources' => 'Validation', + 'privileges' => [ + Privileges::REFERENTIEL_VALIDATION, + Privileges::REFERENTIEL_AUTOVALIDATION, + ], + 'resources' => ['ServiceReferentiel', 'VolumeHoraireReferentiel', 'Validation'], 'assertion' => Assertion\ServiceAssertion::class, ], [ diff --git a/module/Application/src/Application/Assertion/ServiceAssertion.php b/module/Application/src/Application/Assertion/ServiceAssertion.php index 2ff2a692a4..ae021a42c0 100755 --- a/module/Application/src/Application/Assertion/ServiceAssertion.php +++ b/module/Application/src/Application/Assertion/ServiceAssertion.php @@ -9,6 +9,8 @@ use Application\Entity\Db\ServiceReferentiel; use Application\Entity\Db\Structure; use Application\Entity\Db\TypeVolumeHoraire; use Application\Entity\Db\Validation; +use Application\Entity\Db\VolumeHoraire; +use Application\Entity\Db\VolumeHoraireReferentiel; use Application\Entity\Db\WfEtape; use Application\Provider\Privilege\Privileges; use Application\Service\Traits\CampagneSaisieServiceAwareTrait; @@ -105,6 +107,14 @@ class ServiceAssertion extends AbstractAssertion return $this->assertServiceEdition($role, $entity); case Privileges::ENSEIGNEMENT_EXTERIEUR: return $this->assertServiceExterieur($role, $entity); + case Privileges::ENSEIGNEMENT_VALIDATION: + return $this->assertServiceValidation($role, $entity); + } + break; + case $entity instanceof VolumeHoraire: + switch ($privilege) { + case Privileges::ENSEIGNEMENT_VALIDATION: + return $this->assertVolumeHoraireValidation($role, $entity); } break; case $entity instanceof ServiceReferentiel: @@ -113,6 +123,14 @@ class ServiceAssertion extends AbstractAssertion return $this->assertServiceReferentielVisualisation($role, $entity); case Privileges::REFERENTIEL_EDITION: return $this->assertServiceReferentielEdition($role, $entity); + case Privileges::REFERENTIEL_VALIDATION: + return $this->assertServiceReferentielValidation($role, $entity); + } + break; + case $entity instanceof VolumeHoraireReferentiel: + switch ($privilege) { + case Privileges::REFERENTIEL_VALIDATION: + return $this->assertVolumeHoraireReferentielValidation($role, $entity); } break; case $entity instanceof Intervenant: @@ -135,10 +153,10 @@ class ServiceAssertion extends AbstractAssertion switch ($privilege) { case Privileges::ENSEIGNEMENT_VALIDATION: case Privileges::REFERENTIEL_VALIDATION: - return $this->assertServiceValidation($role, $entity); + return $this->assertValidationValidation($role, $entity); case Privileges::ENSEIGNEMENT_DEVALIDATION: case Privileges::REFERENTIEL_DEVALIDATION: - return $this->assertServiceDevalidation($role, $entity); + return $this->assertValidationDevalidation($role, $entity); } break; } @@ -373,18 +391,59 @@ class ServiceAssertion extends AbstractAssertion - protected function assertServiceValidation(Role $role, Validation $validation) + protected function assertVolumeHoraireValidation(Role $role, VolumeHoraire $volumeHoraire) + { + $service = $volumeHoraire->getService(); + + return $this->assertServiceValidation($role, $service); + } + + + + protected function assertServiceValidation(Role $role, Service $service) + { + return $this->assertValidation($role, $service->getIntervenant(), $service->getStructure()); + } + + + + protected function assertVolumeHoraireReferentielValidation(Role $role, VolumeHoraireReferentiel $volumeHoraireReferentiel) + { + $serviceReferentiel = $volumeHoraireReferentiel->getServiceReferentiel(); + + return $this->assertServiceReferentielValidation($role, $serviceReferentiel); + } + + + + protected function assertServiceReferentielValidation(Role $role, ServiceReferentiel $serviceReferentiel) + { + return $this->assert($role, $serviceReferentiel->getIntervenant(), $serviceReferentiel->getStructure()); + } + + + + protected function assertValidationValidation(Role $role, Validation $validation) { return $this->asserts([ !$validation->getId(), - $this->assertIntervenant($role, $validation->getIntervenant()), - $this->assertStructure($role, $validation->getStructure()), + $this->assertValidation($role, $validation->getIntervenant(), $validation->getStructure()), + ]); + } + + + + protected function assertValidation(Role $role, Intervenant $intervenant, ?Structure $structure) + { + return $this->asserts([ + $this->assertIntervenant($role, $intervenant), + $this->assertStructure($role, $structure), ]); } - protected function assertServiceDevalidation(Role $role, Validation $validation) + protected function assertValidationDevalidation(Role $role, Validation $validation) { return $this->asserts([ $validation->getId(), @@ -440,7 +499,7 @@ class ServiceAssertion extends AbstractAssertion - protected function assertStructure(Role $role, Structure $structure = null) + protected function assertStructure(Role $role, ?Structure $structure = null) { if ($structure) { if ($ri = $role->getStructure()) { diff --git a/module/Application/src/Application/Entity/Db/VolumeHoraireReferentiel.php b/module/Application/src/Application/Entity/Db/VolumeHoraireReferentiel.php index 552e33d710..0d8bac664b 100755 --- a/module/Application/src/Application/Entity/Db/VolumeHoraireReferentiel.php +++ b/module/Application/src/Application/Entity/Db/VolumeHoraireReferentiel.php @@ -6,11 +6,12 @@ use UnicaenApp\Entity\HistoriqueAwareInterface; use UnicaenApp\Entity\HistoriqueAwareTrait; use UnicaenImport\Entity\Db\Interfaces\ImportAwareInterface; use UnicaenImport\Entity\Db\Traits\ImportAwareTrait; +use Zend\Permissions\Acl\Resource\ResourceInterface; /** * VolumeHoraireReferentiel */ -class VolumeHoraireReferentiel implements HistoriqueAwareInterface, ImportAwareInterface +class VolumeHoraireReferentiel implements HistoriqueAwareInterface, ImportAwareInterface, ResourceInterface { use HistoriqueAwareTrait; use ImportAwareTrait; @@ -354,7 +355,6 @@ class VolumeHoraireReferentiel implements HistoriqueAwareInterface, ImportAwareI - /** * @return \DateTime */ @@ -400,4 +400,11 @@ class VolumeHoraireReferentiel implements HistoriqueAwareInterface, ImportAwareI return $this; } + + + + public function getResourceId() + { + return 'VolumeHoraireReferentiel'; + } } diff --git a/module/Application/src/Application/Form/VolumeHoraire/SaisieMultipleFieldset.php b/module/Application/src/Application/Form/VolumeHoraire/SaisieMultipleFieldset.php index a87b9d15f8..6d2d025163 100755 --- a/module/Application/src/Application/Form/VolumeHoraire/SaisieMultipleFieldset.php +++ b/module/Application/src/Application/Form/VolumeHoraire/SaisieMultipleFieldset.php @@ -34,31 +34,33 @@ class SaisieMultipleFieldset extends AbstractFieldset implements EntityManagerAw { $qb = $this->getServiceTypeIntervention()->finderByContext(); $this->getServiceTypeIntervention()->finderByHistorique($qb); - return $this->getServiceTypeIntervention()->getList( $qb ); + + return $this->getServiceTypeIntervention()->getList($qb); } + + /** * */ public function init() { $hydrator = new SaisieMultipleHydrator; - $hydrator->setServiceTypeIntervention( $this->getServiceTypeIntervention() ); - $hydrator->setEntityManager( $this->getEntityManager() ); + $hydrator->setServiceTypeIntervention($this->getServiceTypeIntervention()); + $hydrator->setEntityManager($this->getEntityManager()); - $this ->setAttribute('method', 'post') - ->setAttribute('class', 'volume-horaire-multiple') - ->setHydrator($hydrator) - ->setAllowedObjectBindingClass(VolumeHoraireListe::class) - ; + $this->setAttribute('method', 'post') + ->setAttribute('class', 'volume-horaire-multiple') + ->setHydrator($hydrator) + ->setAllowedObjectBindingClass(VolumeHoraireListe::class); $tis = $this->getTypesInterventions(); - foreach( $tis as $typeIntervention ){ + foreach ($tis as $typeIntervention) { $this->add([ 'name' => $typeIntervention->getCode(), 'options' => [ - 'label' => '<abbr title="'.$typeIntervention->getLibelle().'">'.$typeIntervention->getCode().'</abbr> :', - 'label_options' => ['disable_html_escape' => true] + 'label' => '<abbr title="' . $typeIntervention->getLibelle() . '">' . $typeIntervention->getCode() . '</abbr> :', + 'label_options' => ['disable_html_escape' => true], ], 'attributes' => [ 'title' => $typeIntervention->getLibelle(), @@ -68,13 +70,14 @@ class SaisieMultipleFieldset extends AbstractFieldset implements EntityManagerAw ], 'type' => 'Text', ]); - } - $this->add( new Hidden('type-volume-horaire') ); - $this->add( new Hidden('service') ); - $this->add( new Hidden('periode') ); + $this->add(new Hidden('type-volume-horaire')); + $this->add(new Hidden('service')); + $this->add(new Hidden('periode')); } + + /** * Should return an array specification compatible with * {@link Zend\InputFilter\Factory::createInputFilter()}. @@ -84,14 +87,15 @@ class SaisieMultipleFieldset extends AbstractFieldset implements EntityManagerAw public function getInputFilterSpecification() { $filters = []; - foreach( $this->getTypesInterventions() as $typeIntervention ){ + foreach ($this->getTypesInterventions() as $typeIntervention) { $filters[$typeIntervention->getCode()] = [ 'required' => false, - 'filters' => [ + 'filters' => [ ['name' => FloatFromString::class], ], ]; } + return $filters; } @@ -112,7 +116,6 @@ class SaisieMultipleHydrator implements HydratorInterface use TypeInterventionServiceAwareTrait; - /** * * @return \Application\Service\TypeInterventionService[] @@ -124,6 +127,7 @@ class SaisieMultipleHydrator implements HydratorInterface } else { $qb = $this->getServiceTypeIntervention()->finderByHistorique(); $this->getServiceTypeIntervention()->finderByContext($qb); + return $this->getServiceTypeIntervention()->getList($qb); } } @@ -133,8 +137,8 @@ class SaisieMultipleHydrator implements HydratorInterface /** * Hydrate $object with the provided $data. * - * @param array $data - * @param \Application\Entity\VolumeHoraireListe $object + * @param array $data + * @param \Application\Entity\VolumeHoraireListe $object * * @return object */ @@ -153,7 +157,7 @@ class SaisieMultipleHydrator implements HydratorInterface } else { $heures = 0; } - $object->setHeures($heures, false); + $object->setHeures($heures); } return $object; @@ -164,7 +168,7 @@ class SaisieMultipleHydrator implements HydratorInterface /** * Extract values from an object * - * @param \Application\Entity\VolumeHoraireListe $object + * @param \Application\Entity\VolumeHoraireListe $object * * @return array */ @@ -176,7 +180,7 @@ class SaisieMultipleHydrator implements HydratorInterface 'service' => $object->getService() ? $object->getService()->getId() : null, 'periode' => $object->getPeriode() ? $object->getPeriode()->getId() : null, ]; - $tis = $this->getTypesInterventions($object->getService()); + $tis = $this->getTypesInterventions($object->getService()); foreach ($tis as $typeIntervention) { $vhl->setTypeIntervention($typeIntervention); $data[$typeIntervention->getCode()] = StringFromFloat::run($vhl->getHeures(), false); diff --git a/module/Application/src/Application/Provider/Privilege/Privileges.php b/module/Application/src/Application/Provider/Privilege/Privileges.php index 887941e2ba..155b489fdf 100755 --- a/module/Application/src/Application/Provider/Privilege/Privileges.php +++ b/module/Application/src/Application/Provider/Privilege/Privileges.php @@ -102,6 +102,7 @@ class Privileges extends \UnicaenAuth\Provider\Privilege\Privileges const DOSSIER_VISUALISATION = 'dossier-visualisation'; const DROIT_AFFECTATION_EDITION = 'droit-affectation-edition'; const DROIT_AFFECTATION_VISUALISATION = 'droit-affectation-visualisation'; + const ENSEIGNEMENT_AUTOVALIDATION = 'enseignement-autovalidation'; const ENSEIGNEMENT_DEVALIDATION = 'enseignement-devalidation'; const ENSEIGNEMENT_EDITION = 'enseignement-edition'; const ENSEIGNEMENT_EDITION_MASSE = 'enseignement-edition-masse'; @@ -201,6 +202,7 @@ class Privileges extends \UnicaenAuth\Provider\Privilege\Privileges const PLAFONDS_GESTION_VISUALISATION = 'plafonds-gestion-visualisation'; const REFERENTIEL_ADMIN_EDITION = 'referentiel-admin-edition'; const REFERENTIEL_ADMIN_VISUALISATION = 'referentiel-admin-visualisation'; + const REFERENTIEL_AUTOVALIDATION = 'referentiel-autovalidation'; const REFERENTIEL_COMMUN_EMPLOYEUR_EDITION = 'referentiel-commun-employeur-edition'; const REFERENTIEL_COMMUN_EMPLOYEUR_VISUALISATION = 'referentiel-commun-employeur-visualisation'; const REFERENTIEL_COMMUN_VOIRIE_EDITION = 'referentiel-commun-voirie-edition'; diff --git a/module/Application/src/Application/Service/VolumeHoraireReferentielService.php b/module/Application/src/Application/Service/VolumeHoraireReferentielService.php index 63f0a1683d..41de70dcf7 100755 --- a/module/Application/src/Application/Service/VolumeHoraireReferentielService.php +++ b/module/Application/src/Application/Service/VolumeHoraireReferentielService.php @@ -2,6 +2,8 @@ namespace Application\Service; +use Application\Entity\Db\VolumeHoraireReferentiel; +use Application\Provider\Privilege\Privileges; use Application\Service\Traits\EtatVolumeHoraireServiceAwareTrait; use Application\Service\Traits\SourceServiceAwareTrait; use Application\Service\Traits\TypeVolumeHoraireServiceAwareTrait; @@ -20,7 +22,6 @@ class VolumeHoraireReferentielService extends AbstractEntityService use SourceServiceAwareTrait; - /** * retourne la classe des entités * @@ -64,10 +65,10 @@ class VolumeHoraireReferentielService extends AbstractEntityService /** * Sauvegarde une entité * - * @param mixed $entity + * @param VolumeHoraireReferentiel $entity * - * @throws \RuntimeException * @return mixed + * @throws \RuntimeException */ public function save($entity) { @@ -77,8 +78,12 @@ class VolumeHoraireReferentielService extends AbstractEntityService if (!$entity->getSourceCode()) { $entity->setSourceCode(uniqid('ose-')); } + if (!$entity->getId()) { + $canAutoValidate = $this->getAuthorize()->isAllowed($entity, Privileges::REFERENTIEL_AUTOVALIDATION); + if ($canAutoValidate) $entity->setAutoValidation(true); + } - return parent::save($entity); // TODO: Change the autogenerated stub + return parent::save($entity); } @@ -93,7 +98,7 @@ class VolumeHoraireReferentielService extends AbstractEntityService */ public function finderByEtatVolumeHoraire(EtatVolumeHoraire $etatVolumeHoraire = null, QueryBuilder $qb = null, $alias = null) { - list($qb, $alias) = $this->initQuery($qb, $alias); + [$qb, $alias] = $this->initQuery($qb, $alias); if ($etatVolumeHoraire) { $sEtatVolumeHoraire = $this->getServiceEtatVolumeHoraire(); @@ -117,7 +122,7 @@ class VolumeHoraireReferentielService extends AbstractEntityService */ public function finderByStrictEtatVolumeHoraire(EtatVolumeHoraire $etatVolumeHoraire = null, QueryBuilder $qb = null, $alias = null) { - list($qb, $alias) = $this->initQuery($qb, $alias); + [$qb, $alias] = $this->initQuery($qb, $alias); if ($etatVolumeHoraire) { $sEtatVolumeHoraire = $this->getServiceEtatVolumeHoraire(); diff --git a/module/Application/src/Application/Service/VolumeHoraireService.php b/module/Application/src/Application/Service/VolumeHoraireService.php index c0a1341830..f96825b9ff 100755 --- a/module/Application/src/Application/Service/VolumeHoraireService.php +++ b/module/Application/src/Application/Service/VolumeHoraireService.php @@ -3,6 +3,7 @@ namespace Application\Service; use Application\Entity\Db\Contrat; +use Application\Provider\Privilege\Privileges; use Application\Service\Traits\ElementPedagogiqueServiceAwareTrait; use Application\Service\Traits\EtatVolumeHoraireServiceAwareTrait; use Application\Service\Traits\ServiceServiceAwareTrait; @@ -27,7 +28,6 @@ class VolumeHoraireService extends AbstractEntityService use SourceServiceAwareTrait; - /** * retourne la classe des entités * @@ -97,8 +97,8 @@ class VolumeHoraireService extends AbstractEntityService * * @param mixed $entity * - * @throws \RuntimeException * @return mixed + * @throws \RuntimeException */ public function save($entity) { @@ -109,6 +109,11 @@ class VolumeHoraireService extends AbstractEntityService $entity->setSourceCode(uniqid('ose-')); } + if (!$entity->getId()) { + $canAutoValidate = $this->getAuthorize()->isAllowed($entity, Privileges::ENSEIGNEMENT_AUTOVALIDATION); + if ($canAutoValidate) $entity->setAutoValidation(true); + } + return parent::save($entity); // TODO: Change the autogenerated stub } @@ -124,7 +129,7 @@ class VolumeHoraireService extends AbstractEntityService */ public function finderByIntervenant(Intervenant $intervenant, QueryBuilder $qb = null, $alias = null) { - list($qb, $alias) = $this->initQuery($qb, $alias); + [$qb, $alias] = $this->initQuery($qb, $alias); $qb ->join("$alias.service", 'vhs2') @@ -147,7 +152,7 @@ class VolumeHoraireService extends AbstractEntityService */ public function finderByEtatVolumeHoraire(EtatVolumeHoraire $etatVolumeHoraire = null, QueryBuilder $qb = null, $alias = null) { - list($qb, $alias) = $this->initQuery($qb, $alias); + [$qb, $alias] = $this->initQuery($qb, $alias); if ($etatVolumeHoraire) { $sEtatVolumeHoraire = $this->getServiceEtatVolumeHoraire(); @@ -171,7 +176,7 @@ class VolumeHoraireService extends AbstractEntityService */ public function finderByStrictEtatVolumeHoraire(EtatVolumeHoraire $etatVolumeHoraire = null, QueryBuilder $qb = null, $alias = null) { - list($qb, $alias) = $this->initQuery($qb, $alias); + [$qb, $alias] = $this->initQuery($qb, $alias); if ($etatVolumeHoraire) { $sEtatVolumeHoraire = $this->getServiceEtatVolumeHoraire(); @@ -196,7 +201,7 @@ class VolumeHoraireService extends AbstractEntityService */ public function finderByContrat($contrat, QueryBuilder $qb = null, $alias = null) { - list($qb, $alias) = $this->initQuery($qb, $alias); + [$qb, $alias] = $this->initQuery($qb, $alias); if ($contrat instanceof \Application\Entity\Db\Contrat) { $qb->addSelect("c") @@ -221,7 +226,7 @@ class VolumeHoraireService extends AbstractEntityService */ public function orderBy(QueryBuilder $qb = null, $alias = null) { - list($qb, $alias) = $this->initQuery($qb, $alias); + [$qb, $alias] = $this->initQuery($qb, $alias); $qb->addOrderBy("$alias.horaireDebut"); $qb->addOrderBy("$alias.horaireFin"); -- GitLab