Skip to content
Snippets Groups Projects
Commit fdac73ea authored by joriot221's avatar joriot221
Browse files

Merge branch 'master' into FJ_ADMIN_PJ

parents 2512c34e d28aa3de
Branches
Tags
No related merge requests found
Showing
with 487 additions and 309 deletions
......@@ -2,11 +2,14 @@
[OSE 17.3](#ose-173-17032022)
# Version de test
[OSE 18.0-beta3](#ose-18-beta-3-06052022)
# OSE 18 (à venir)
# OSE 18 BETA 3 (06/05/2022)
Objectif : Plafonds personnalisables & refonte gestion des statuts
## Nouveautés
......@@ -90,17 +93,28 @@ Objectif : Plafonds personnalisables & refonte gestion des statuts
* Correction sur la suppression de service lorsque la clôture de service a été historisé (#42046)
* Le calcul des choix minimum/maximum est de nouveau fiable (#42080)
* Liens inactifs lors du changement d'année universitaire (#40992)
* Dans certains cas avec des motifs de non paiements, le détail des services n'affichait pas toutes les heures
## Notes de mise à jour
* **ATTENTION : OSE 18** ne pourra être mis à jour **qu'à partir de OSE 17.x**. Si vous utilisez une version plus ancienne de OSE, veuillez **d'abord** mettre à jour en version 17.
* **ATTENTION : PHP 8.0** est requis
* La mise à jour des vues matérialisées MV_EXT_* ne se fait plus à la mise à jour. Il faut maintenant lancer la commande `./bin/ose maj-exports` tous les jours et donc ajouter une ligne à votre _CronTab_ (cf. [Doc INSTALL mise à jour](install.md))
* Pour bénéficier de la ventilation des heures par types d'intervention vous pouvez vous inspirer du [modèle de contrat de Caen](https://git.unicaen.fr/open-source/OSE/-/blob/master/data/modele_contrat_ventile.odt) pour adapter votre propre modèle de contrat.
* Au niveau du fichier de configuration [config.local.php](config.local.php.default), vous pouvez remplir le paramètre (facultatif) ldap>systemeInformationUrl.
* Pour les instances qui utilisent le module Export Siham, vous devez renseigner un nouveau paramètre dans Administration > paramètres généraux > Gestion export RH, il vous faut sélectionner l'étape de la feuille de route franchie à partir de laquelle l'intervenant peut être exporté dans SIHAM.
* La vue source [SRC_INTERVENANT](doc/Connecteurs-Import/Générique/SRC_INTERVENANT.sql) doit être mise à jour.
* Par précaution, la mise à jour désactive la synchronisation sur la table INTERVENANT. Vous devrez manuellement remettre en place cette synchronisation après avoir mis à jour votre vue source SRC_INTERVENANT.
* Les indicateurs portant sur les anciens plafonds ayant été supprimés et remplacés par de tous nouveaux indicateurs, les notifications par mail et abonnements correspondants seront résiliés
* En raison de l'ampleur de la mise à jour, l'opération de maintenance va prendre du temps. Prévoyez une journée d'interruption de service.
## Procédure de mise à jour spécifique à la version 18
1. Mettez l'aplication en maintenance
2. Si votre version de OSE est antérieure à la version 17, mettez **d'abord** à jour en version **17.3**
3. Installez **PHP8.0** sur votre serveur ainsi que [toutes ses dépendances nécessaires](install.md)
4. Dans le répertoire de OSE, lancez `php composer.phar self-update --2`
5. Mettez ensuite OSE à jour en version 18 `./bin/ose update` (attention, ce traitement est long, il pourra prendre plusieurs heures)
6. Recalculez toutes les forules de calcul : `./bin/ose formule-calcul` (attention, ce traitement dure plusieurs heures)
7. Pour votre instance de production, la nouvelle commande `./bin/ose maj-exports` doit être lancée régulièrement (cf. [procédure d'installation](install.md)). Ceci met à jour toutes les vues matérialisées dédiées à l'export MV_EXT_*.
8. Mettez à jour votre vue source [SRC_INTERVENANT](doc/Connecteurs-Import/Générique/SRC_INTERVENANT.sql)
9. Réactivez la synchronisation en import pour la table INTERVENANT, que la mise à jour a volontairement désactivée (en production).
10. Mettez à jour votre [modèle de contrat de travail](data/modele_contrat_ventile.odt) si vous voulez bénéficier de la ventilation par CM/TD/TP/Autres des heures.
11. Si vous utilisez l'export RH Siham, renseignez un nouveau paramètre dans Administration > paramètres généraux > Gestion export RH, en sélectionnant l'étape de la feuille de route franchie à partir de laquelle l'intervenant peut être exporté dans SIHAM.
12. Au niveau du fichier de configuration [config.local.php](config.local.php.default), vous pouvez remplir le paramètre (facultatif) ldap>systemeInformationUrl.
13. Sortez du mode maintenance
# OSE 17.3 (17/03/2022)
......
......@@ -4,7 +4,7 @@ OSE est une application web qui exploite une base de données Oracle.
Il faut donc installer :
* Une base de données Oracle
* Un serveur web Apache + PHP >= 7.4
* Un serveur web Apache + PHP
Le serveur web peut être installé manuellement ou bien déployé via une image Docker.
Le serveur web n'héberge aucune donnée, hormis des fichiers de configuration et de cache. Toutes les données d'explloitation sont donc
......@@ -81,7 +81,7 @@ Dépendances requises :
* git
* wget
* Apache 2 avec le module de réécriture d'URL (*rewrite*) activé
* PHP 7.4 minimum avec les modules suivants :
* PHP 8.0 avec les modules suivants :
* cli
* curl
* intl
......
<?php
// à supprimer pour la v19
\ No newline at end of file
......@@ -26,6 +26,11 @@ class v18Divers extends AbstractMigration
$bdd = $this->manager->getBdd();
$c = $this->manager->getOseAdmin()->getConsole();
// test pour savoir si on est bien en V17 minimum
if (!$this->manager->hasColumn('INTERVENANT', 'EXPORT_DATE')) {
$c->printDie('Attention : vous devez d\'abord mettre à jour en version 17.3 AVANT de mettre à jour en version 18');
}
try {
$c->msg('Coupure forcée de la synchronisation sur la table INTERVENANT');
$bdd->exec("UPDATE IMPORT_TABLES SET SYNC_ENABLED = 0 WHERE TABLE_NAME = 'INTERVENANT'");
......@@ -36,7 +41,7 @@ class v18Divers extends AbstractMigration
$this->sauvegardes();
try {
$c->msg('Suppression de la contrainte TYPE_INTERVENANT_CODE_UN en prévision de sa recréation');
$c->msg('Suppression des affectations de recherche ayant des structures invalides');
$bdd->exec("DELETE FROM AFFECTATION_RECHERCHE WHERE structure_id NOT IN (SELECT ID FROM STRUCTURE)");
} catch (\Exception $e) {
// rien à faire : la contrainte a déjà du être supprimée
......@@ -60,11 +65,11 @@ class v18Divers extends AbstractMigration
$tables = [
'INTERVENANT' => 'SAVE_V18_INTERVENANT',
'INTERVENANT_DOSSIER' => 'SAVE_V18_DOSSIER',
'TYPE_PIECE_JOINTE_STATUT' => 'SAVE_V18_TPJS',
'TYPE_INTERVENTION_STATUT' => 'SAVE_V18_TIS',
'STATUT_INTERVENANT' => 'SAVE_V18_STATUT',
'PRIVILEGE' => 'SAVE_V18_PRIVILEGE',
'ROLE_PRIVILEGE' => 'SAVE_V18_ROLE_PRIVILEGE',
'STATUT_PRIVILEGE' => 'SAVE_V18_STATUT_PRIVILEGE',
'TYPE_AGREMENT_STATUT' => 'SAVE_V18_TA_STATUT',
'DOSSIER_CHAMP_AUTRE_PAR_STATUT' => 'SAVE_V18_DOSSIER_AUTRE_STATUT',
......@@ -82,7 +87,7 @@ class v18Divers extends AbstractMigration
$c->begin('Sauvegarde des anciennes données');
foreach ($tables as $table => $saveTable) {
$c->msg('"' . $table . '" => "' . $saveTable . '".');
$c->msg('Table "' . $table . '" sauvegardée en "' . $saveTable . '".');
$this->manager->sauvegarderTable($table, $saveTable);
}
$c->end();
......
<?php
class v18Indicateurs extends AbstractMigration
{
public function description(): string
{
return "Migration des indicateurs de OSE 17 vers OSE 18";
}
public function utile(): bool
{
return true;
return $this->manager->hasNew('table', 'TYPE_INDICATEUR');
}
public function before()
{
$bdd = $this->manager->getBdd();
$c = $this->manager->getOseAdmin()->getConsole();
$c->begin('Préparation à la mise à jour des indicateurs');
$bdd->exec('ALTER TABLE INDICATEUR ADD (TYPE_INDICATEUR_ID NUMBER)');
$bdd->exec('CREATE TABLE TYPE_INDICATEUR (
ID NUMBER NOT NULL ENABLE,
LIBELLE VARCHAR2(60 CHAR) NOT NULL ENABLE,
ORDRE NUMBER DEFAULT 1 NOT NULL ENABLE
)');
$indicateurs = require $this->manager->getOseAdmin()->getOseDir() . '/data/indicateurs.php';
foreach ($indicateurs as $libelle => $type) {
$data = ['ID' => $type['id'], 'LIBELLE' => $libelle];
$bdd->getTable('TYPE_INDICATEUR')->insert($data);
foreach ($type['indicateurs'] as $numero => $indicateur) {
$bdd->getTable('INDICATEUR')->update(['TYPE_INDICATEUR_ID' => $type['id']], ['NUMERO' => $numero]);
}
}
$bdd->exec('DELETE FROM INDICATEUR WHERE TYPE_INDICATEUR_ID IS NULL');
$c->end('Préparation à la migration des indicateurs terminée');
}
}
\ No newline at end of file
......@@ -58,18 +58,6 @@ class v18Plafonds extends AbstractMigration
public function preMigrationIndicateurs()
{
$bdd = $this->manager->getBdd();
$c = $this->manager->getOseAdmin()->getConsole();
$c->begin('Préparation à la mise à jour des indicateurs');
$c->end('Préparation à la migration des indicateurs terminée');
}
public function migrationParamsStructure()
{
$bdd = $this->manager->getBdd();
......
<?php
class v18Privileges extends AbstractMigration
{
public function description(): string
{
return "Migration des privilèges de OSE 17 vers OSE 18";
}
public function utile(): bool
{
return $this->manager->hasTable('SAVE_V18_PRIVILEGE');
}
public function after()
{
$c = $this->manager->getOseAdmin()->getConsole();
$bdd = $this->manager->getBdd();
$sql = "
INSERT INTO ROLE_PRIVILEGE (privilege_id,role_id)
SELECT
np.id privilege_id, r.id role_id
FROM
save_v18_privilege p
JOIN categorie_privilege cp ON cp.id = p.categorie_id
JOIN save_v18_role_privilege rp ON rp.privilege_id = p.id
JOIN role r ON r.id = rp.role_id AND r.code <> 'administrateur'
JOIN (SELECT 'prevu' code FROM dual UNION ALL SELECT 'realise' code FROM dual) tvh ON 1=1
JOIN privilege np ON np.categorie_id = cp.id AND np.code = tvh.code || '-' || p.code
LEFT JOIN role_privilege nrp ON nrp.privilege_id = np.id AND nrp.role_id = r.id
WHERE
cp.code IN ('enseignement','referentiel')
AND p.code IN ('visualisation','edition', 'validation', 'autovalidation')
AND rp.role_id <> COALESCE(nrp.role_id,0)
";
$bdd->exec($sql);
$c->msg('Transfert d\'anciens privilèges vers le nouveau système');
}
}
\ No newline at end of file
......@@ -26,12 +26,6 @@ class v18Statuts extends AbstractMigration
$bdd = $this->manager->getBdd();
$c = $this->manager->getOseAdmin()->getConsole();
try {
$this->preMigrationIndicateurs();
} catch (\Exception $e) {
$c->println($e->getMessage(), $c::COLOR_RED);
}
try {
$this->preMigrationStatuts();
} catch (\Exception $e) {
......@@ -124,27 +118,6 @@ class v18Statuts extends AbstractMigration
public function preMigrationIndicateurs()
{
$bdd = $this->manager->getBdd();
$c = $this->manager->getOseAdmin()->getConsole();
$c->begin('Préparation à la mise à jour des indicateurs');
if (!$this->manager->hasTable('TYPE_INDICATEUR')) {
$bdd->exec('ALTER TABLE INDICATEUR ADD (TYPE_INDICATEUR_ID NUMBER)');
$bdd->exec('CREATE TABLE TYPE_INDICATEUR (
ID NUMBER NOT NULL ENABLE,
LIBELLE VARCHAR2(60 CHAR) NOT NULL ENABLE,
ORDRE NUMBER DEFAULT 1 NOT NULL ENABLE
)');
$bdd->exec('INSERT INTO TYPE_INDICATEUR (ID, LIBELLE, ORDRE) VALUES (1,\'provisoire\', 1)');
$bdd->exec('UPDATE INDICATEUR SET TYPE_INDICATEUR_ID = 1');
}
$c->end('Préparation à la migration des indicateurs terminée');
}
public function preMigrationStatuts()
{
$bdd = $this->manager->getBdd();
......
......@@ -238,6 +238,8 @@ class OseAdmin
} elseif (is_dir($cible . $action)) {
$sousAction = $this->getConsole()->getArg(2);
$filename = $cible . $action . '/actions/' . $sousAction . '.php';
} else {
$filename = null;
}
if ($filename) {
......
......@@ -114,7 +114,15 @@ if ($intVersion > 0 && $intVersion < 18) {
// Récupération des dépendances
$c->println("\nChargement des dépendances à l'aide de Composer", $c::COLOR_LIGHT_CYAN);
if ($intVersion === 0) {
// à partir d'une branche, on ignore les prérequis pour composer, afin de tester
$c->passthru("cd $osedir;php composer.phar install --optimize-autoloader --ignore-platform-reqs");
} else {
// à partir de la v18, et toutes les branches
$c->passthru("cd $osedir;php composer.phar install --optimize-autoloader");
}
if ($intVersion > 0 && $intVersion < 18) {
// Création des liens symboliques
......
......@@ -30,16 +30,14 @@
"config": {
"allow-plugins": {
"laminas/laminas-dependency-plugin": true,
"composer/package-versions-deprecated": true
"composer/package-versions-deprecated": true,
"dealerdirect/phpcodesniffer-composer-installer": true,
"laminas-api-tools/api-tools-asset-manager": true
}
},
"scripts" : {
"sniffer:php8": "./vendor/bin/phpcs -p ./module --standard=vendor/phpcompatibility/php-compatibility/PHPCompatibility --runtime-set testVersion 8.0",
"phpcs" : "./vendor/bin/phpcs -p ./module --standard=PSR12"
},
"minimum-stability": "dev",
"allow-plugins": {
"dealerdirect/phpcodesniffer-composer-installer": true,
"laminas-api-tools/api-tools-asset-manager": true
}
"minimum-stability": "dev"
}
This diff is collapsed.
CREATE OR REPLACE TRIGGER "INTERVENANT_CK"
BEFORE INSERT OR UPDATE OF source_id, source_code, histo_destruction, code, statut_id, utilisateur_code ON intervenant
CREATE
OR REPLACE TRIGGER "INTERVENANT_CK"
BEFORE INSERT OR
UPDATE of source_id, source_code, histo_destruction, code, statut_id, utilisateur_code
ON intervenant
FOR EACH ROW
DECLARE
pragma autonomous_transaction;
imp NUMERIC;
cs NUMERIC;
imp
NUMERIC;
cs
NUMERIC;
BEGIN
IF :NEW.histo_destruction IS NOT NULL THEN
IF
:NEW.histo_destruction IS NOT NULL THEN
RETURN;
END IF;
SELECT importable INTO imp FROM source WHERE id = :NEW.SOURCE_ID;
IF imp = 1 THEN
SELECT importable
INTO imp
FROM source
WHERE id = :new.source_id;
IF
imp = 1 THEN
-- Contrôle du bon remplissage du source_code
IF :NEW.source_code IS NULL THEN
......@@ -21,25 +31,33 @@ BEGIN
END IF;
-- Contrôle de l'unicité de STATUT_ID
SELECT COUNT(*) INTO cs FROM INTERVENANT WHERE
id <> :NEW.id AND histo_destruction IS NULL
AND code = :NEW.code
AND annee_id = :NEW.annee_id
AND statut_id = :NEW.statut_id
SELECT COUNT(*)
INTO cs
FROM intervenant
WHERE id <> :new.id
AND histo_destruction IS NULL
AND code = :new.code
AND annee_id = :new.annee_id
AND statut_id = :new.statut_id
;
IF cs > 0 THEN
IF
cs > 0 THEN
raise_application_error(-20101, 'Un intervenant ne peut pas avoir deux fois le même statut le même année');
END IF;
-- On ne peut pas assicoer un même login à plusieurs intervenants
SELECT COUNT(*) INTO cs FROM INTERVENANT WHERE
id <> :NEW.id AND histo_destruction IS NULL
AND code <> :NEW.code
AND annee_id = :NEW.annee_id
AND utilisateur_code = :NEW.utilisateur_code
SELECT COUNT(*)
INTO cs
FROM intervenant
WHERE id <> :new.id
AND histo_destruction IS NULL
AND code <> :new.code
AND annee_id = :new.annee_id
AND utilisateur_code = :new.utilisateur_code
;
IF cs > 0 THEN
raise_application_error(-20101, 'L''utilisateur est déjà utilisé pour un autre intervenant. Merci d''en choisir un autre.');
IF
cs > 0 THEN
raise_application_error(-20101, 'L''utilisateur est déjà utilisé pour un autre intervenant. Merci d''en choisir un autre.' || ' Pour le nouveau dossier ID: '|| :NEW.id|| ', Code: '|| :NEW.code || ', utilisateur_code: '||:NEW.utilisateur_code );
END IF;
END;
\ No newline at end of file
......@@ -51,16 +51,16 @@ FROM
)
SELECT
n.annee_id annee_id,
n.noeud_id noeud_id,
n.id noeud_id,
sn.scenario_id scenario_id,
sne.type_heures_id type_heures_id,
ti.id type_intervention_id,
n.element_pedagogique_id element_pedagogique_id,
n.element_pedagogique_etape_id etape_id,
etp.id etape_id,
sne.etape_id etape_ens_id,
n.structure_id structure_id,
n.groupe_type_formation_id groupe_type_formation_id,
tf.groupe_id groupe_type_formation_id,
vhe.heures heures_ens,
vhe.heures * ti.taux_hetd_service hetd,
......@@ -69,8 +69,7 @@ FROM
COALESCE(sep.dedoublement, se.dedoublement, sd.dedoublement,1) dedoublement,
COALESCE(sep.assiduite,1) assiduite,
sne.effectif*COALESCE(sep.assiduite,1) effectif,
SUM(sne.effectif*COALESCE(sep.assiduite,1))
OVER (PARTITION BY n.noeud_id, sn.scenario_id, ti.id) t_effectif
SUM(sne.effectif*COALESCE(sep.assiduite,1)) OVER (PARTITION BY n.id, sn.scenario_id, ti.id) t_effectif
FROM
scenario_noeud_effectif sne
......@@ -79,29 +78,36 @@ FROM
/*@NOEUD_ID=sn.noeud_id*/
/*@SCENARIO_ID=sn.scenario_id*/
JOIN tbl_noeud n ON n.noeud_id = sn.noeud_id
JOIN noeud n ON n.id = sn.noeud_id
AND n.histo_destruction IS NULL
/*@ANNEE_ID=n.annee_id*/
/*@ELEMENT_PEDAGOGIQUE_ID=n.element_pedagogique_id*/
/*@ETAPE_ID=n.element_pedagogique_etape_id*/
JOIN volume_horaire_ens vhe ON vhe.element_pedagogique_id = n.element_pedagogique_id
AND vhe.histo_destruction IS NULL
AND vhe.heures > 0
JOIN type_intervention ti ON ti.id = vhe.type_intervention_id
LEFT JOIN element_pedagogique ep ON ep.id = n.element_pedagogique_id
LEFT JOIN etape etp ON etp.id = COALESCE(n.etape_id,ep.etape_id)
/*@ETAPE_ID=etp.id*/
LEFT JOIN type_formation tf ON tf.id = etp.type_formation_id
LEFT JOIN seuils_perso sep ON sep.element_pedagogique_id = n.element_pedagogique_id
AND sep.scenario_id = sn.scenario_id
AND sep.type_intervention_id = ti.id
LEFT JOIN seuils_perso se ON se.etape_id = n.element_pedagogique_etape_id
LEFT JOIN seuils_perso se ON se.etape_id = etp.id
AND se.scenario_id = sn.scenario_id
AND se.type_intervention_id = ti.id
LEFT JOIN tbl_chargens_seuils_def sd ON sd.annee_id = n.annee_id
AND sd.scenario_id = sn.scenario_id
AND sd.structure_id = n.structure_etape_id
AND sd.groupe_type_formation_id = n.groupe_type_formation_id
AND sd.structure_id = etp.structure_id
AND sd.groupe_type_formation_id = tf.groupe_id
AND sd.type_intervention_id = ti.id
WHERE
1=1
......
......@@ -59,7 +59,7 @@ class OffreFormationController extends AbstractController
$params = [];
if ($structure) $params['structure'] = $structure->getId();
if ($niveau) $params['niveau'] = $niveau->getId();
if ($niveau) $params['niveau'] = ($niveau->getPertinence()) ? $niveau->getId() : $niveau->getLib();
if ($etape) $params['etape'] = $etape->getId();
......@@ -82,7 +82,6 @@ class OffreFormationController extends AbstractController
}
public function exportAction()
{
$this->initFilters();
......@@ -174,14 +173,12 @@ class OffreFormationController extends AbstractController
}
public function administrationOffreAction()
{
return [];
}
public function reconductionAction()
{
$this->initFilterHistorique();
......@@ -238,7 +235,6 @@ class OffreFormationController extends AbstractController
}
public function reconductionCentreCoutAction()
{
$this->initFilterHistorique();
......@@ -290,7 +286,6 @@ class OffreFormationController extends AbstractController
}
public function reconductionModulateurAction()
{
$this->initFilterHistorique();
......@@ -343,7 +338,6 @@ class OffreFormationController extends AbstractController
}
protected function initFilters()
{
$this->initFilterAnnee();
......@@ -351,7 +345,6 @@ class OffreFormationController extends AbstractController
}
protected function initFilterAnnee()
{
$this->em()->getFilters()->enable('annee')->init([
......@@ -362,7 +355,6 @@ class OffreFormationController extends AbstractController
}
protected function initFilterHistorique()
{
/* Mise en place des filtres */
......@@ -377,14 +369,12 @@ class OffreFormationController extends AbstractController
}
protected function disableFilters($name)
{
$this->em()->getFilters()->disable($name);
}
protected function getParams()
{
$structure = $this->context()->structureFromQuery() ?: $this->getServiceContext()->getStructure();
......
......@@ -25,6 +25,8 @@ class NiveauEtape
*/
protected $lib;
protected $pertinence;
/**
*
* @param \Application\Entity\Db\Etape $etape
......@@ -93,6 +95,11 @@ class NiveauEtape
return $this->lib;
}
public function getPertinence()
{
return $this->pertinence;
}
public function setNiv($niv)
{
$this->niv = $niv;
......@@ -105,11 +112,18 @@ class NiveauEtape
return $this;
}
public function setPertinence($pertinence)
{
$this->pertinence = $pertinence;
return $this;
}
public function setEtape(Etape $etape)
{
$this->etape = $etape;
$this->niv = $this->etape->getNiveau();
$this->lib = $this->etape->getTypeFormation()->getGroupe()->getLibelleCourt();
$this->pertinence = $this->etape->getTypeFormation()->getGroupe()->getPertinenceNiveau();
return $this;
}
}
\ No newline at end of file
......@@ -22,8 +22,9 @@ class NiveauEtapeService extends AbstractService
return null;
}
$tiretPos = strrpos($id, '-');
$groupeTypeFormationLibelleCourt = substr( $id, 0, $tiretPos );
$niv = substr( $id, $tiretPos+1 );
$groupeTypeFormationLibelleCourt = (!$tiretPos) ? $id : substr($id, 0, $tiretPos);
$niv = (!$tiretPos) ? false : substr($id, $tiretPos + 1);
if ($niv === false) $niv = null;
$niveau = new NiveauEtape();
......
......@@ -30,13 +30,11 @@ class OffreFormationService extends AbstractEntityService
}
public function getAlias()
{
}
public function getNeep($structure, $niveau, $etape, $annee = null, $source = null)
{
if ($etape) {
......@@ -57,7 +55,7 @@ class OffreFormationService extends AbstractEntityService
$dql = 'SELECT
partial e.{id,code,annee,libelle,sourceCode,niveau,histoDestruction},
partial tf.{id},
partial gtf.{id, libelleCourt, ordre},
partial gtf.{id, libelleCourt, ordre, pertinenceNiveau},
partial ep.{id,code,libelle,sourceCode,etape,periode,tauxFoad,fi,fc,fa,tauxFi,tauxFc,tauxFa},
partial vme.{id,heures, groupes}
FROM
......@@ -92,9 +90,14 @@ class OffreFormationService extends AbstractEntityService
if ($object instanceof Etape) {
$n = NiveauEtape::getInstanceFromEtape($object);
if ($object->estNonHistorise()) {
$gtf = $object->getTypeFormation()->getGroupe()->getPertinenceNiveau();
if ($gtf) {
$niveaux[$n->getId()] = $n;
} else {
$niveaux[$n->getLib()] = $n;
}
if (!$niveau || $niveau->getId() == $n->getId()) {
}
if (!$niveau || ($niveau->getId() == $n->getId() && $n->getPertinence()) || ($niveau->getLib() == $n->getLib() && !$n->getPertinence())) {
if ($object->estNonHistorise() || $object->getElementPedagogique()->count() > 0) {
$etapes[] = $object;
}
......@@ -122,11 +125,11 @@ class OffreFormationService extends AbstractEntityService
return $e1Lib > $e2Lib ? 1 : 0;
});
return [$niveaux, $etapes, $elements];
}
public function getNeepEtape($etape)
{
$niveaux = [];
......@@ -176,7 +179,6 @@ class OffreFormationService extends AbstractEntityService
}
/**
* @return array
*/
......@@ -250,7 +252,6 @@ class OffreFormationService extends AbstractEntityService
}
public function createMappingEtapeNEtapeN1($etapesN, $etapesN1)
{
$codesEtapeN = [];
......
......@@ -158,7 +158,15 @@ class Liste extends AbstractViewHelper
$out .= "</tr>\n";
$periodes = $this->getPeriodes();
foreach ($periodes as $periode) {
$vhl = $this->getVolumeHoraireListe()->setPeriode($periode)->setTypeIntervention(false);
$vhl = $this->getVolumeHoraireListe()->createChild()->setPeriode($periode)->setTypeIntervention(false);
/* Gestion des mauvaises périodes */
$forbiddenPeriode = ($vhl->getService()?->getElementPedagogique()?->getPeriode() ?? $periode) !== $periode;
if ($forbiddenPeriode) {
$this->hasForbiddenPeriodes = true;
}
/*Listage des motifs de non paiement */
$motifsNonPaiement = [];
if ($canViewMNP) { // découpage par motif de non paiement
$motifsNonPaiement = $vhl->getMotifsNonPaiement();
......@@ -169,18 +177,13 @@ class Liste extends AbstractViewHelper
if (empty($motifsNonPaiement)) {
$motifsNonPaiement = [0 => false];
}
/* Affichage par motif de non paiement */
foreach ($motifsNonPaiement as $motifNonPaiement) {
$vhl->setMotifNonPaiement($motifNonPaiement);
if ($vhl->getHeures() == 0) continue; // rien à afficher
$readOnly = $motifNonPaiement instanceof MotifNonPaiement && !$canEditMNP;
$forbiddenPeriode = false;
if (
$this->getVolumeHoraireListe()->getService()
&& $this->getVolumeHoraireListe()->getService()->getElementPedagogique()
&& $this->getVolumeHoraireListe()->getService()->getElementPedagogique()->getPeriode()
&& $this->getVolumeHoraireListe()->getService()->getElementPedagogique()->getPeriode() !== $periode
) {
$forbiddenPeriode = true;
$this->hasForbiddenPeriodes = true;
}
if ($forbiddenPeriode) {
$out .= '<tr class="bg-danger">';
$out .= "<td><abbr title=\"La période n'est pas conforme à l'enseignement\">" . $this->renderPeriode($periode) . "</abbr></td>\n";
......@@ -190,8 +193,7 @@ class Liste extends AbstractViewHelper
}
foreach ($this->typesIntervention as $typeIntervention) {
$vhl->setMotifNonPaiement($motifNonPaiement)
->setTypeIntervention($typeIntervention);
$vhl->setTypeIntervention($typeIntervention);
if ($vhl->getHeures() == 0) {
$class = "heures-empty";
} else {
......
......@@ -24,7 +24,7 @@ function makeQuery($structure = null, $niveau = null, $etape = null)
$params = [];
//@formatter:off
if ($structure) $params['structure'] = $structure->getId();
if ($niveau) $params['niveau'] = $niveau->getId();
if ($niveau) $params['niveau'] = ($niveau->getPertinence()) ? $niveau->getId() : $niveau->getLib();
if ($etape) $params['etape'] = $etape->getId();
//@formatter:on
......@@ -41,9 +41,9 @@ $niveauxItems = [
],
];
foreach ($niveaux as $niv) {
$niveauxItems[$niv->getId()] = [
'label' => (string)$niv,
foreach ($niveaux as $code => $niv) {
$niveauxItems[$code] = [
'label' => ($niv->getPertinence()) ? (string)$niv : $code,
'niveau' => $niv,
'url' => $this->url('of', [], makeQuery($structure, $niv)),
];
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment