Commit 39320d67 authored by Laurent Lécluse's avatar Laurent Lécluse
Browse files

Mise en place du plafond des types de fonctions référentielles

parent 13941661
......@@ -5822,4 +5822,8 @@ ALTER TABLE fonction_referentiel ADD (
ALTER TABLE fonction_referentiel
ADD CONSTRAINT fr_parent_fk FOREIGN KEY ( parent_id )
REFERENCES fonction_referentiel ( id )
NOT DEFERRABLE;
\ No newline at end of file
NOT DEFERRABLE;
INSERT INTO plafond (ID, CODE, LIBELLE) VALUES (
plafond_id_seq.nextval, 'ref-par-fonction-mere', 'Heures max. de référentiel par intervenant et par type de fonction référentielle'
);
......@@ -1413,16 +1413,16 @@
},
{
"name": "symfony/debug",
"version": "v3.4.23",
"version": "v3.4.24",
"source": {
"type": "git",
"url": "https://github.com/symfony/debug.git",
"reference": "8d8a9e877b3fcdc50ddecf8dcea146059753f782"
"reference": "adbdd5d66342fb0a0bce7422ba68181842b6610d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/debug/zipball/8d8a9e877b3fcdc50ddecf8dcea146059753f782",
"reference": "8d8a9e877b3fcdc50ddecf8dcea146059753f782",
"url": "https://api.github.com/repos/symfony/debug/zipball/adbdd5d66342fb0a0bce7422ba68181842b6610d",
"reference": "adbdd5d66342fb0a0bce7422ba68181842b6610d",
"shasum": ""
},
"require": {
......@@ -1465,7 +1465,7 @@
],
"description": "Symfony Debug Component",
"homepage": "https://symfony.com",
"time": "2019-02-24T15:45:11+00:00"
"time": "2019-03-10T17:07:42+00:00"
},
{
"name": "symfony/polyfill-ctype",
......@@ -1791,11 +1791,11 @@
},
{
"name": "unicaen/oracle",
"version": "1.2.8",
"version": "1.2.11",
"source": {
"type": "git",
"url": "https://git.unicaen.fr/lib/unicaen/oracle.git",
"reference": "026e0ef03dc0326ec1e563774852891c894fa03f"
"reference": "432835499c6de82258d510e8a4856a6e225b38b6"
},
"require": {
"doctrine/dbal": "^2.5",
......@@ -1815,7 +1815,7 @@
]
},
"description": "Bibliothèque utile lorsqu'on utilise un base de données Oracle",
"time": "2019-03-10T20:11:52+00:00"
"time": "2019-04-05T15:04:45+00:00"
},
{
"name": "unicaen/tbl",
......
......@@ -18,7 +18,7 @@ return [
'configuration' => [
'orm_default' => [
'metadata_cache' => 'filesystem',
'query_cache' => 'filesystem',
// 'query_cache' => 'filesystem',
'result_cache' => 'filesystem',
'hydration_cache' => 'array',
'generate_proxies' => AppConfig::get('bdd', 'generateProxies'),
......
......@@ -86,6 +86,46 @@ GROUP BY
UNION
-- Heures max. de référentiel par intervenant et par fonction référentielle mère
SELECT
'ref-par-fonction-mere' plafond_code,
t.type_volume_horaire_id,
i.annee_id,
t.intervenant_id,
AVG(t.plafond) plafond,
AVG(t.heures) heures
FROM
(
SELECT
vhr.type_volume_horaire_id type_volume_horaire_id,
sr.intervenant_id intervenant_id,
fr.plafond plafond,
fr.id fr_id,
SUM(vhr.heures) heures
FROM
service_referentiel sr
JOIN fonction_referentiel frf ON frf.id = sr.fonction_id
JOIN fonction_referentiel fr ON fr.id = frf.parent_id
JOIN volume_horaire_ref vhr ON vhr.service_referentiel_id = sr.id AND vhr.histo_destruction IS NULL
WHERE
sr.histo_destruction IS NULL
GROUP BY
vhr.type_volume_horaire_id,
sr.intervenant_id,
fr.plafond,
fr.id
) t
JOIN intervenant i ON i.id = t.intervenant_id
WHERE
t.heures > t.plafond
/*i.id*/
GROUP BY
t.type_volume_horaire_id,
i.annee_id,
t.intervenant_id
UNION
-- Nombre maximum d'heures équivalent TD par intervenant selon son statut
SELECT
'hetd' plafond_code,
......
......@@ -12,6 +12,11 @@ class FonctionReferentiel implements HistoriqueAwareInterface
{
use HistoriqueAwareTrait;
/**
* @var self
*/
protected $parent;
/**
* @var string
*/
......@@ -59,6 +64,30 @@ class FonctionReferentiel implements HistoriqueAwareInterface
/**
* @return FonctionReferentiel
*/
public function getParent()
{
return $this->parent;
}
/**
* @param FonctionReferentiel|null $parent
*
* @return FonctionReferentiel
*/
public function setParent($parent = null): FonctionReferentiel
{
$this->parent = $parent;
return $this;
}
/**
* Set code
*
......@@ -300,23 +329,4 @@ class FonctionReferentiel implements HistoriqueAwareInterface
return $str;
}
/**
* @since PHP 5.6.0
* This method is called by var_dump() when dumping an object to get the properties that should be shown.
* If the method isn't defined on an object, then all public, protected and private properties will be shown.
*
* @return array
* @link http://php.net/manual/en/language.oop5.magic.php#language.oop5.magic.debuginfo
*/
function __debugInfo()
{
return [
'id' => $this->id,
'libelleCourt' => $this->libelleCourt,
];
}
}
......@@ -18,6 +18,11 @@
<field name="plafond" type="float" column="PLAFOND" precision="126" scale="0" nullable="true"/>
<field name="etapeRequise" type="boolean" column="ETAPE_REQUISE" nullable="false"/>
<field name="serviceStatutaire" type="boolean" column="SERVICE_STATUTAIRE" nullable="false"/>
<many-to-one field="parent" target-entity="Application\Entity\Db\FonctionReferentiel">
<join-columns>
<join-column name="PARENT_ID" referenced-column-name="ID"/>
</join-columns>
</many-to-one>
<many-to-one field="domaineFonctionnel" target-entity="Application\Entity\Db\DomaineFonctionnel">
<join-columns>
<join-column name="DOMAINE_FONCTIONNEL_ID" referenced-column-name="ID"/>
......
......@@ -135,7 +135,7 @@ class PlafondDepassement
*/
public function __toString()
{
$errStr = 'Le plafond suivant %s a été dépassé. Il est en effet de %s heures pour %s heures saisies.';
$errStr = 'Le plafond "%s" a été dépassé. Il est en effet de %s heures pour %s heures saisies.';
return sprintf(
$errStr,
......
......@@ -2,9 +2,12 @@
namespace Application\Form\FonctionReferentiel;
use Application\Entity\Db\FonctionReferentiel;
use Application\Form\AbstractForm;
use Application\Service\Traits\DomaineFonctionnelServiceAwareTrait;
use Application\Service\Traits\FonctionReferentielServiceAwareTrait;
use Application\Service\Traits\StructureServiceAwareTrait;
use UnicaenApp\Util;
use Zend\Form\Element\Csrf;
use Zend\Stdlib\Hydrator\HydratorInterface;
use Application\Service\Traits\ContextServiceAwareTrait;
......@@ -16,6 +19,7 @@ use Application\Service\Traits\ContextServiceAwareTrait;
*/
class FonctionReferentielSaisieForm extends AbstractForm
{
use FonctionReferentielServiceAwareTrait;
use DomaineFonctionnelServiceAwareTrait;
use StructureServiceAwareTrait;
use ContextServiceAwareTrait;
......@@ -29,6 +33,20 @@ class FonctionReferentielSaisieForm extends AbstractForm
$this->setHydrator($hydrator);
$this->setAttribute('action', $this->getCurrentUrl());
$this->add([
'name' => 'parent',
'options' => [
'label' => 'Fonction parente',
'empty_option' => "Pas de fonction parente",
'value_options' => Util::collectionAsOptions($this->getFonctionsReferentiellesParentes()),
],
'attributes' => [
'class' => 'selectpicker',
'data-live-search' => 'true',
],
'type' => 'Select',
]);
$this->add([
'name' => 'code',
'options' => [
......@@ -121,6 +139,18 @@ class FonctionReferentielSaisieForm extends AbstractForm
/**
* @return FonctionReferentiel[]
*/
protected function getFonctionsReferentiellesParentes()
{
$qb = $this->getServiceFonctionReferentiel()->finderByProperty('parent', null);
return $this->getServiceFonctionReferentiel()->getList($qb);
}
public function getStructures()
{
$role = $this->getServiceContext()->getSelectedIdentityRole();
......@@ -146,6 +176,9 @@ class FonctionReferentielSaisieForm extends AbstractForm
public function getInputFilterSpecification()
{
return [
'parent' => [
'required' => false,
],
'code' => [
'required' => false,
],
......@@ -175,6 +208,7 @@ class FonctionReferentielSaisieForm extends AbstractForm
class FonctionReferentielHydrator implements HydratorInterface
{
use FonctionReferentielServiceAwareTrait;
use DomaineFonctionnelServiceAwareTrait;
use StructureServiceAwareTrait;
......@@ -191,6 +225,7 @@ class FonctionReferentielHydrator implements HydratorInterface
public function hydrate(array $data, $object)
{
$object->setCode($data['code']);
$object->setParent($this->getServiceFonctionReferentiel()->get(isset($data['parent']) ? $data['parent'] : null));
$object->setLibelleCourt($data['libelle-court']);
$object->setLibelleLong($data['libelle-long']);
if (array_key_exists('domaine-fonctionnel', $data)) {
......@@ -220,6 +255,7 @@ class FonctionReferentielHydrator implements HydratorInterface
{
$data = [
'id' => $object->getId(),
'parent' => $object->getParent() ? $object->getParent()->getId() : null,
'code' => $object->getCode(),
'libelle-court' => $object->getLibelleCourt(),
'libelle-long' => $object->getLibelleLong(),
......
......@@ -33,7 +33,7 @@ class FonctionReferentielService extends AbstractEntityService
public function getList(QueryBuilder $qb = null, $alias = null)
{
list($qb, $alias) = $this->initQuery();
list($qb, $alias) = $this->initQuery($qb, $alias);
$qb->addOrderBy("$alias.libelleLong");
......
......@@ -4,9 +4,5 @@
* @var $form \Application\Form\FonctionReferentiel\FonctionReferentielSaisieForm
*/
?>
<h1 class="page-header">Saisie d'une fonction référentielle</h1>
<?php
echo $this->messenger()->addCurrentMessagesFromFlashMessenger();
echo $this->form($form);
Supports Markdown
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