Commit 39273c2a authored by Laurent Lécluse's avatar Laurent Lécluse
Browse files

#14367

#14368
parent f4d4ee1b
......@@ -13,6 +13,10 @@ author: Laurent Lécluse - DSI - Unicaen
* Possibilité de définir des volumes horaires enseignement et référentiel comme auto-validés.
* Possibilité de déterminer si les heures de service pour un type de formation donné peuvent être comptées dans le service statutaire ou non.
* Possibilité de déterminer si les heures pour une fonction référentielle donnée peuvent être comptées dans le service statutaire ou non.
## Notes de mise à jour
* Modifiez la structure de votre base de données en exécutant dans SQL developer le script de mise à jour suivant :
......
......@@ -94,7 +94,6 @@ return [
'Application\Entity\Db\Interfaces\DepartementAwareInterface' => __DIR__ . '/src/Application/Entity/Db/Interfaces/DepartementAwareInterface.php',
'Application\Entity\Db\Interfaces\GroupeTypeFormationAwareInterface' => __DIR__ . '/src/Application/Entity/Db/Interfaces/GroupeTypeFormationAwareInterface.php',
'Application\Entity\Db\Interfaces\ElementModulateurAwareInterface' => __DIR__ . '/src/Application/Entity/Db/Interfaces/ElementModulateurAwareInterface.php',
'Application\Entity\Db\Interfaces\FormuleServiceAwareInterface' => __DIR__ . '/src/Application/Entity/Db/Interfaces/FormuleServiceAwareInterface.php',
'Application\Entity\Db\Interfaces\VIndicDiffDossierAwareInterface' => __DIR__ . '/src/Application/Entity/Db/Interfaces/VIndicDiffDossierAwareInterface.php',
'Application\Entity\Db\Interfaces\TypePieceJointeAwareInterface' => __DIR__ . '/src/Application/Entity/Db/Interfaces/TypePieceJointeAwareInterface.php',
'Application\Entity\Db\Interfaces\AdresseIntervenantAwareInterface' => __DIR__ . '/src/Application/Entity/Db/Interfaces/AdresseIntervenantAwareInterface.php',
......
......@@ -127,7 +127,7 @@ class IntervenantController extends AbstractController
$intervenant = $this->getEvent()->getParam('intervenant');
/* @var $intervenant Intervenant */
if (!$intervenant){
if (!$intervenant) {
throw new \LogicException('Intervenant non précisé ou inexistant');
}
......@@ -294,7 +294,7 @@ class IntervenantController extends AbstractController
$intervenant = $this->getEvent()->getParam('intervenant');
/* @var $intervenant \Application\Entity\Db\Intervenant */
if (!$intervenant){
if (!$intervenant) {
throw new \LogicException('Intervenant non précisé ou inexistant');
}
......@@ -339,15 +339,16 @@ class IntervenantController extends AbstractController
if (!isset($data['referentiel'][$referentiel->getStructure()->getId()])) {
$data['referentiel'][$referentiel->getStructure()->getId()] = [
'structure' => $referentiel->getStructure(),
'heures' => 0,
'hetd' => 0,
'hetd-compl' => 0,
'structure' => $referentiel->getStructure(),
'heures' => 0,
'hetd' => 0,
'hetd-compl' => 0,
'service-statutaire' => $referentiel->isServiceStatutaire(),
];
}
$data['referentiel'][$referentiel->getStructure()->getId()]['heures'] += $referentiel->getHeures($typeVolumeHoraire, $etatVolumeHoraire);
$frr = $referentiel->getServiceReferentiel()->getUniqueFormuleResultatServiceReferentiel($typeVolumeHoraire, $etatVolumeHoraire);
$data['referentiel'][$referentiel->getStructure()->getId()]['hetd'] += $frr ? $frr->getHeuresServiceReferentiel() : 0;
$data['referentiel'][$referentiel->getStructure()->getId()]['heures'] += $referentiel->getHeures($typeVolumeHoraire, $etatVolumeHoraire);
$frr = $referentiel->getServiceReferentiel()->getUniqueFormuleResultatServiceReferentiel($typeVolumeHoraire, $etatVolumeHoraire);
$data['referentiel'][$referentiel->getStructure()->getId()]['hetd'] += $frr ? $frr->getHeuresServiceReferentiel() : 0;
$data['referentiel'][$referentiel->getStructure()->getId()]['hetd-compl'] += $frr ? $frr->getHeuresComplReferentiel() : 0;
}
......@@ -372,8 +373,8 @@ class IntervenantController extends AbstractController
];
}
$typesIntervention[$fvh->getTypeIntervention()->getId()]['heures'] += $fvh->getHeures();
$hetd = $fvh->getVolumeHoraire()->getFormuleResultatVolumeHoraire()->first()->getTotal();
$typesIntervention[$fvh->getTypeIntervention()->getId()]['hetd'] += $hetd;
$hetd = $fvh->getVolumeHoraire()->getFormuleResultatVolumeHoraire()->first()->getTotal();
$typesIntervention[$fvh->getTypeIntervention()->getId()]['hetd'] += $hetd;
}
if ($totalHeures > 0) {
......@@ -386,6 +387,7 @@ class IntervenantController extends AbstractController
'taux' => [],
'structure' => $service->getService()->getElementPedagogique() ? $service->getService()->getElementPedagogique()->getStructure() : $service->getService()->getIntervenant()->getStructure(),
'ponderation-service-compl' => $service->getPonderationServiceCompl(),
'service-statutaire' => $service->isServiceStatutaire(),
'heures' => [],
'hetd' => [
'total' => 0,
......@@ -475,30 +477,30 @@ class IntervenantController extends AbstractController
$intervenant = $this->getEvent()->getParam('intervenant');
/* @var $intervenant \Application\Entity\Db\Intervenant */
if ($intervenant){
if ($intervenant) {
$data = $this->getProcessusIntervenant()->getSuppressionData($intervenant);
}else{
} else {
$data = null;
}
$ids = $this->params()->fromPost('ids');
if ($ids){
if ($ids) {
try {
if ($data) $data = $this->getProcessusIntervenant()->deleteRecursive($data, $ids);
if ($intervenant){
if ($intervenant) {
$this->getServiceWorkflow()->calculerTableauxBord(null, $intervenant);
}
if (!$data){
if (!$data) {
$this->flashMessenger()->addSuccessMessage('Fiche intervenant supprimée intégralement. Vous allez être redirigé(e) vers la page de recherche des intervenants.');
}else{
} else {
$this->flashMessenger()->addSuccessMessage('Données bien supprimées');
}
}catch(\Exception $e ){
} catch (\Exception $e) {
$this->flashMessenger()->addErrorMessage(DbException::translate($e)->getMessage());
}
}else{
} else {
$this->flashMessenger()->addWarningMessage(
'Attention : La suppression d\'une fiche entraine la suppression de toutes les données associées pour l\'année en cours'
);
......
......@@ -57,6 +57,13 @@ class FormuleService
*/
private $formuleIntervenant;
/**
* @var bool
*/
private $serviceStatutaire = true;
/**
* Constructor
*/
......@@ -65,100 +72,122 @@ class FormuleService
$this->formuleVolumeHoraire = new \Doctrine\Common\Collections\ArrayCollection();
}
/**
* Get tauxFa
*
* @return float
* @return float
*/
public function getTauxFa()
{
return $this->tauxFa;
}
/**
* Get tauxFc
*
* @return float
* @return float
*/
public function getTauxFc()
{
return $this->tauxFc;
}
/**
* Get tauxFi
*
* @return float
* @return float
*/
public function getTauxFi()
{
return $this->tauxFi;
}
/**
*
* @param TypeHeures $typeHeures
*
* @return float
* @throws \LogicException
*/
public function getTaux(TypeHeures $typeHeures)
{
switch($typeHeures->getCode()){
case TypeHeures::FI: return $this->getTauxFi();
case TypeHeures::FA: return $this->getTauxFa();
case TypeHeures::FC: return $this->getTauxFc();
switch ($typeHeures->getCode()) {
case TypeHeures::FI:
return $this->getTauxFi();
case TypeHeures::FA:
return $this->getTauxFa();
case TypeHeures::FC:
return $this->getTauxFc();
}
throw new \LogicException('Le type d\'heures transmis n\'est pas correct');
}
/**
* Get ponderationServiceDu
*
* @return float
* @return float
*/
public function getPonderationServiceDu()
{
return $this->ponderationServiceDu;
}
/**
* Get ponderationServiceCompl
*
* @return float
* @return float
*/
public function getPonderationServiceCompl()
{
return $this->ponderationServiceCompl;
}
/**
* Get id
*
* @return integer
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Get service
*
* @return \Application\Entity\Db\Service
* @return \Application\Entity\Db\Service
*/
public function getService()
{
return $this->service;
}
/**
* Get formuleVolumeHoraire
*
* @return \Doctrine\Common\Collections\Collection
* @return \Doctrine\Common\Collections\Collection
*/
public function getFormuleVolumeHoraire(TypeVolumeHoraire $typeVolumeHoraire=null, EtatVolumeHoraire $etatVolumeHoraire=null, TypeIntervention $typeIntervention=null)
public function getFormuleVolumeHoraire(TypeVolumeHoraire $typeVolumeHoraire = null, EtatVolumeHoraire $etatVolumeHoraire = null, TypeIntervention $typeIntervention = null)
{
$filter = function( FormuleVolumeHoraire $formuleVolumeHoraire ) use ($typeVolumeHoraire, $etatVolumeHoraire, $typeIntervention) {
$filter = function (FormuleVolumeHoraire $formuleVolumeHoraire) use ($typeVolumeHoraire, $etatVolumeHoraire, $typeIntervention) {
if ($typeVolumeHoraire && $typeVolumeHoraire !== $formuleVolumeHoraire->getTypeVolumeHoraire()) {
return false;
}
......@@ -168,43 +197,77 @@ class FormuleService
if ($typeIntervention && $typeIntervention !== $formuleVolumeHoraire->getTypeIntervention()) {
return false;
}
return true;
};
return $this->formuleVolumeHoraire->filter($filter);
}
public function getHeures(TypeVolumeHoraire $typeVolumeHoraire=null, EtatVolumeHoraire $etatVolumeHoraire=null, TypeIntervention $typeIntervention=null)
public function getHeures(TypeVolumeHoraire $typeVolumeHoraire = null, EtatVolumeHoraire $etatVolumeHoraire = null, TypeIntervention $typeIntervention = null)
{
$heures = 0;
$vhs = $this->getFormuleVolumeHoraire( $typeVolumeHoraire, $etatVolumeHoraire, $typeIntervention );
foreach( $vhs as $vh ){
$vhs = $this->getFormuleVolumeHoraire($typeVolumeHoraire, $etatVolumeHoraire, $typeIntervention);
foreach ($vhs as $vh) {
/* @var $vh FormuleVolumeHoraire */
$ok = true;
if ($ok && $typeVolumeHoraire !== null && $vh->getTypeVolumeHoraire() !== $typeVolumeHoraire) $ok = false;
if ($ok && $etatVolumeHoraire !== null && $vh->getEtatVolumeHoraire() !== $etatVolumeHoraire) $ok = false;
if ($ok && $typeIntervention !== null && $vh->getTypeIntervention() !== $typeIntervention) $ok = false;
if ($ok) $heures += $vh->getHeures ();
if ($ok && $typeIntervention !== null && $vh->getTypeIntervention() !== $typeIntervention) $ok = false;
if ($ok) $heures += $vh->getHeures();
}
return $heures;
}
/**
* Get intervenant
*
* @return \Application\Entity\Db\Intervenant
* @return \Application\Entity\Db\Intervenant
*/
public function getIntervenant()
{
return $this->intervenant;
}
/**
* Get formuleIntervenant
*
* @return \Application\Entity\Db\FormuleIntervenant
* @return \Application\Entity\Db\FormuleIntervenant
*/
public function getFormuleIntervenant()
{
return $this->formuleIntervenant;
}
/**
* @return bool
*/
public function isServiceStatutaire(): bool
{
return $this->serviceStatutaire;
}
/**
* @param bool $serviceStatutaire
*
* @return FormuleService
*/
public function setServiceStatutaire(bool $serviceStatutaire): FormuleService
{
$this->serviceStatutaire = $serviceStatutaire;
return $this;
}
}
......@@ -2,8 +2,6 @@
namespace Application\Entity\Db;
use Doctrine\ORM\Mapping as ORM;
/**
* FormuleServiceReferentiel
*/
......@@ -39,6 +37,13 @@ class FormuleServiceReferentiel
*/
private $formuleIntervenant;
/**
* @var bool
*/
private $serviceStatutaire = true;
/**
* Constructor
*/
......@@ -47,77 +52,117 @@ class FormuleServiceReferentiel
$this->formuleVolumeHoraireReferentiel = new \Doctrine\Common\Collections\ArrayCollection();
}
/**
* Get id
*
* @return integer
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Get serviceReferentiel
*
* @return \Application\Entity\Db\ServiceReferentiel
* @return \Application\Entity\Db\ServiceReferentiel
*/
public function getServiceReferentiel()
{
return $this->serviceReferentiel;
}
/**
* Get formuleVolumeHoraireReferentiel
*
* @return \Doctrine\Common\Collections\Collection
* @return \Doctrine\Common\Collections\Collection
*/
public function getFormuleVolumeHoraireReferentiel()
{
return $this->formuleVolumeHoraireReferentiel;
}
public function getHeures(TypeVolumeHoraire $typeVolumeHoraire=null, EtatVolumeHoraire $etatVolumeHoraire=null)
public function getHeures(TypeVolumeHoraire $typeVolumeHoraire = null, EtatVolumeHoraire $etatVolumeHoraire = null)
{
$heures = 0;
$vhs = $this->getFormuleVolumeHoraireReferentiel();
foreach( $vhs as $vh ){
$vhs = $this->getFormuleVolumeHoraireReferentiel();
foreach ($vhs as $vh) {
/* @var $vh FormuleVolumeHoraire */
$ok = true;
if ($ok && $typeVolumeHoraire !== null && $vh->getTypeVolumeHoraire() !== $typeVolumeHoraire) $ok = false;
if ($ok && $etatVolumeHoraire !== null && $vh->getEtatVolumeHoraire() !== $etatVolumeHoraire) $ok = false;
if ($ok) $heures += $vh->getHeures ();
if ($ok) $heures += $vh->getHeures();
}
return $heures;
}
/**
* Get intervenant
*
* @return \Application\Entity\Db\Intervenant
* @return \Application\Entity\Db\Intervenant
*/
public function getIntervenant()
{
return $this->intervenant;
}
/**
* Get structure
*
* @return \Application\Entity\Db\Structure
* @return \Application\Entity\Db\Structure
*/
public function getStructure()
{
return $this->structure;
}
/**
* Get formuleIntervenant
*
* @return \Application\Entity\Db\FormuleIntervenant
* @return \Application\Entity\Db\FormuleIntervenant
*/
public function getFormuleIntervenant()
{
return $this->formuleIntervenant;
}
/**
* @return bool
*/
public function isServiceStatutaire(): bool
{
return $this->serviceStatutaire;
}
/**
* @param bool $serviceStatutaire
*
* @return FormuleServiceReferentiel
*/
public function setServiceStatutaire(bool $serviceStatutaire): FormuleServiceReferentiel
{
$this->serviceStatutaire = $serviceStatutaire;
return $this;
}
}
<?php
namespace Application\Entity\Db\Interfaces;
use Application\Entity\Db\FormuleService;
/**
* Description of FormuleServiceAwareInterface
*
* @author UnicaenCode
*/
interface FormuleServiceAwareInterface
{
/**
* @param FormuleService $formuleService
* @return self
*/
public function setFormuleService( FormuleService $formuleService = null );
/**
* @return FormuleService
*/
public function getFormuleService();
}
\ No newline at end of file
......@@ -12,7 +12,7 @@
<field name="tauxFi" type="float" column="TAUX_FI" precision="126" scale="0" nullable="false"/>
<field name="ponderationServiceDu" type="float" column="PONDERATION_SERVICE_DU" precision="126" scale="0" nullable="false"/>
<field name="ponderationServiceCompl" type="float" column="PONDERATION_SERVICE_COMPL" precision="126" scale="0" nullable="false"/>
<field name="serviceStatutaire" type="boolean" column="SERVICE_STATUTAIRE" nullable="false"/>
<many-to-one field="formuleIntervenant" target-entity="Application\Entity\Db\FormuleIntervenant">
<join-columns>
<join-column name="INTERVENANT_ID" referenced-column-name="ID"/>
......
......@@ -23,5 +23,6 @@
<join-column name="ID" referenced-column-name="ID"/>
</join-columns>
</one-to-one>
<field name="serviceStatutaire" type="boolean" column="SERVICE_STATUTAIRE" nullable="false"/>
</entity>
</doctrine-mapping>
\ No newline at end of file
......@@ -91,6 +91,14 @@ class FonctionReferentielSaisieForm extends AbstractForm
'type' => 'Checkbox',
]);
$this->add([
'name' => 'service-statutaire',
'options' => [
'label' => 'Les heures peuvent être comptabilisées dans le service statutaire des intervenants',
],
'type' => 'Checkbox',
]);
$this->add(new Csrf('security'));
$this->add([
'name' => 'submit',
......@@ -194,6 +202,7 @@ class FonctionReferentielHydrator implements HydratorInterface
}
$object->setEtapeRequise($data['etape-requise']);
$object->setServiceStatutaire($data['service-statutaire']);
return $object;
}
......@@ -217,7 +226,8 @@ class FonctionReferentielHydrator implements HydratorInterface
'domaine-fonctionnel' => ($s = $object->getDomaineFonctionnel()) ? $s->getId() : null,
'plafond' => $object->getPlafond(),
'structure' => ($s = $object->getStructure()) ? $s->getId() : null,
'etape-requise' => $object->isEtapeRequise(),
'etape-requise' => $object->isEtapeRequise(),
'service-statutaire' => $object->isServiceStatutaire(),
];
return $data;
......
......@@ -22,6 +22,7 @@ $canEdit = $this->isAllowed(Privileges::getResourceId(Privileges::REFERENTIEL_AD
<th>Plafond</th>