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

Merge branch 'master' of https://git.unicaen.fr/open-source/OSE into plafonds-perso

 Conflicts:
	composer.json
	composer.lock
	data/ddl/table/TYPE_PIECE_JOINTE_STATUT.php
	data/ddl/view/V_INDICATEUR_380.sql
	module/Application/src/Controller/StatutIntervenantController.php
	module/Application/src/Entity/Db/Mapping/Application.Entity.Db.TypePieceJointeStatut.dcm.xml
	module/Application/src/Entity/Db/TypePieceJointeStatut.php
	module/Application/src/Traits/ObligatoireSelonSeuilHeuresTrait.php
	module/Application/view/application/statut-intervenant/index.phtml
parents 2625e1c5 6f3d0488
# Version stable
[OSE 17.1](#ose-171-07122021)
[OSE 17.2](#ose-172-05012022)
......@@ -33,6 +33,10 @@ Objectif : Plafonds personnalisables
* certains statuts pourront être affichés de manière prioritaire pour être traités en premier (#20808)
* Refonte de l'interface d'administration des statuts
* Les paramétrages de statuts sont maintenant annualisés
* Nouveau paramètre dans administration > paramètre généraux permettant de choisir l'étape de la feuille de route à franchir pour pouvoir exporter un intervenant vers le SIRH
* Ajout d'un privilège 'Edition avancée' au niveau de l'intervenant pour donner le droit de modifier manuellement le code intervenant et la source de l'
intervenant
* Vérification de la présence d'au moins un fichier avant de permettre l'enregistrement d'une date de retour signé
## Corrections de bugs
......@@ -40,6 +44,7 @@ Objectif : Plafonds personnalisables
* Adaptation de la commande update-employeur pour assurer la compatibilité avec les différentes versions d'oracle
* Correction sur un problème de route dans l'écran Engagements & Liquidation (#38763)
* Export CSV des agréments : inversion de colonnes (#41513)
* Correction sur la suppression de service lorsque la clôture de service a été historisé (#42046)
## Notes de mise à jour
......
......@@ -94,7 +94,7 @@ $c->exec([
"chmod 777 data/fichiers",
"mkdir log",
"chmod 777 log",
"chmod +7 bin/ose",
"chmod +x bin/ose",
]);
$od->writeVersion($osedir, $version);
$intVersion = (int)substr($version, 0, 2);
......
......@@ -22,13 +22,20 @@
},
"require-dev": {
"squizlabs/php_codesniffer" : "*",
"phpcompatibility/php-compatibility": "*",
"phan/phan" : "^5.3",
"phpmd/phpmd": "*"
},
"prefer-stable" : true,
"config": {
"allow-plugins": {
"laminas/laminas-dependency-plugin": true,
"composer/package-versions-deprecated": 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"
}
......@@ -115,6 +115,9 @@ return [
/* Générer systématiquement les proxies de la base de données (utile uniquement en mode développement) */
'generateProxies' => true,
/* ConnectionString pour Doctrine (équivalent à la ligne dans le fichier tnsnames.ora)*/
'connectstring' => '',
],
......@@ -288,4 +291,4 @@ return [
/* Mot de passe */
'password' => 'password',
],
];
\ No newline at end of file
];
......@@ -136,8 +136,8 @@ class AppConfig
'./vendor',
],
'cache_dir' => 'cache/',
'config_cache_enabled' => ('prod' == $env),
'module_map_cache_enabled' => ('prod' == $env),
'config_cache_enabled' => ('prod' == $env && !self::inConsole()),
'module_map_cache_enabled' => ('prod' == $env && !self::inConsole()),
],
];
}
......@@ -167,4 +167,4 @@ class AppConfig
AppConfig::init();
return AppConfig::getGlobal();
\ No newline at end of file
return AppConfig::getGlobal();
......@@ -11,6 +11,7 @@ return [
'user' => AppConfig::get('bdd', 'username'),
'password' => AppConfig::get('bdd', 'password'),
'charset' => 'AL32UTF8',
'connectstring' => AppConfig::get('bdd', 'connectstring'),
//'persistent' => true,
],
],
......@@ -64,4 +65,4 @@ return [
'tmp-dir' => AppConfig::get('etats-sortie', 'tmp-dir', getcwd() . '/cache/'),
],
],
];
\ No newline at end of file
];
......@@ -1578,6 +1578,19 @@ CREATE OR REPLACE PACKAGE BODY "UNICAEN_TBL" AS
/*@INTERVENANT_ID=s.intervenant_id*/
GROUP BY
s.intervenant_id
),
hetd AS (
SELECT
intervenant_id,
SUM(total) AS total_hetd
from
formule_resultat fr
JOIN type_volume_horaire tvh ON tvh.id = fr.type_volume_horaire_id
JOIN etat_volume_horaire evh ON evh.id = fr.etat_volume_horaire_id
where
tvh.code = ''PREVU''
GROUP BY
intervenant_id
)
SELECT
i.annee_id annee_id,
......@@ -1585,7 +1598,8 @@ CREATE OR REPLACE PACKAGE BODY "UNICAEN_TBL" AS
i.id intervenant_id,
tpj.id type_piece_jointe_id,
MAX(COALESCE(i_h.heures, 0)) heures_pour_seuil,
tpjs.obligatoire obligatoire
tpjs.obligatoire obligatoire,
MAX(COALESCE(hetd.total_hetd, 0)) heures_pour_seuil_hetd
FROM
intervenant i
......@@ -1600,15 +1614,17 @@ CREATE OR REPLACE PACKAGE BODY "UNICAEN_TBL" AS
AND tpj.histo_destruction IS NULL
LEFT JOIN i_h ON i_h.intervenant_id = i.id
LEFT JOIN hetd ON hetd.intervenant_id = i.id
WHERE
-- Gestion de l''historique
i.histo_destruction IS NULL
/*@INTERVENANT_ID=i.id*/
/*@ANNEE_ID=i.annee_id*/
-- Seuil HETD ou PJ obligatoire meme avec des heures non payables
AND (COALESCE(i_h.heures,0) > COALESCE(tpjs.seuil_hetd,-1) OR (COALESCE(i_h.heures_non_payables,0) > 0 AND tpjs.obligatoire_hnp = 1 ))
-- Seuil heure soit en HETD soit en heure ou PJ obligatoire meme avec des heures non payables
AND ((COALESCE(tpjs.type_heure_hetd,0) = 0 AND COALESCE(i_h.heures,0) > COALESCE(tpjs.seuil_hetd,-1))
OR (tpjs.type_heure_hetd = 1 AND COALESCE(hetd.total_hetd,0) > COALESCE(tpjs.seuil_hetd,-1))
OR (COALESCE(i_h.heures_non_payables,0) > 0 AND tpjs.obligatoire_hnp = 1 ))
-- Le RIB n''est demandé QUE s''il est différent!!
AND CASE
......@@ -1634,6 +1650,7 @@ CREATE OR REPLACE PACKAGE BODY "UNICAEN_TBL" AS
AND t.TYPE_PIECE_JOINTE_ID = v.TYPE_PIECE_JOINTE_ID
AND t.HEURES_POUR_SEUIL = v.HEURES_POUR_SEUIL
AND COALESCE(t.OBLIGATOIRE,0) = COALESCE(v.OBLIGATOIRE,0)
AND t.HEURES_POUR_SEUIL_HETD = v.HEURES_POUR_SEUIL_HETD
THEN -1 ELSE t.ID END ID,
v.ANNEE_ID,
v.CODE_INTERVENANT,
......
......@@ -33,18 +33,6 @@ return [
'position' => 14,
'commentaire' => NULL,
],
'ECART_MOIS_PAIEMENT' => [
'name' => 'ECART_MOIS_PAIEMENT',
'type' => 'int',
'bdd-type' => 'NUMBER',
'length' => 0,
'scale' => NULL,
'precision' => NULL,
'nullable' => FALSE,
'default' => NULL,
'position' => 15,
'commentaire' => NULL,
],
'ENSEIGNEMENT' => [
'name' => 'ENSEIGNEMENT',
'type' => 'bool',
......@@ -52,10 +40,10 @@ return [
'length' => 0,
'scale' => '0',
'precision' => 1,
'nullable' => TRUE,
'default' => NULL,
'nullable' => false,
'default' => null,
'position' => 6,
'commentaire' => NULL,
'commentaire' => null,
],
'HISTO_CREATEUR_ID' => [
'name' => 'HISTO_CREATEUR_ID',
......@@ -146,12 +134,12 @@ return [
'type' => 'string',
'bdd-type' => 'VARCHAR2',
'length' => 15,
'scale' => NULL,
'precision' => NULL,
'nullable' => TRUE,
'default' => NULL,
'scale' => null,
'precision' => null,
'nullable' => false,
'default' => null,
'position' => 4,
'commentaire' => NULL,
'commentaire' => null,
],
'LIBELLE_LONG' => [
'name' => 'LIBELLE_LONG',
......@@ -184,10 +172,10 @@ return [
'length' => 0,
'scale' => '0',
'precision' => 1,
'nullable' => TRUE,
'default' => NULL,
'nullable' => false,
'default' => null,
'position' => 7,
'commentaire' => NULL,
'commentaire' => null,
],
],
];
......
......@@ -93,6 +93,18 @@ return [
'position' => 5,
'commentaire' => NULL,
],
'HEURES_POUR_SEUIL_HETD' => [
'name' => 'HEURES_POUR_SEUIL_HETD',
'type' => 'float',
'bdd-type' => 'FLOAT',
'length' => 0,
'scale' => NULL,
'precision' => 126,
'nullable' => FALSE,
'default' => '0',
'position' => 8,
'commentaire' => NULL,
],
],
];
......
......@@ -18,7 +18,7 @@ return [
'precision' => NULL,
'nullable' => TRUE,
'default' => NULL,
'position' => 11,
'position' => 12,
'commentaire' => NULL,
],
'ANNEE_FIN_ID' => [
......@@ -30,7 +30,7 @@ return [
'precision' => NULL,
'nullable' => TRUE,
'default' => NULL,
'position' => 12,
'position' => 13,
'commentaire' => NULL,
],
'CHANGEMENT_RIB' => [
......@@ -42,7 +42,7 @@ return [
'precision' => 1,
'nullable' => FALSE,
'default' => '0',
'position' => 14,
'position' => 15,
'commentaire' => NULL,
],
'DUREE_VIE' => [
......@@ -54,7 +54,7 @@ return [
'precision' => NULL,
'nullable' => FALSE,
'default' => '1',
'position' => 15,
'position' => 16,
'commentaire' => 'Durée de vie de la pièce jointe',
],
'FC' => [
......@@ -66,7 +66,7 @@ return [
'precision' => 1,
'nullable' => FALSE,
'default' => '0',
'position' => 13,
'position' => 14,
'commentaire' => NULL,
],
'HISTO_CREATEUR_ID' => [
......@@ -78,7 +78,7 @@ return [
'precision' => NULL,
'nullable' => FALSE,
'default' => NULL,
'position' => 6,
'position' => 7,
'commentaire' => NULL,
],
'HISTO_CREATION' => [
......@@ -90,7 +90,7 @@ return [
'precision' => NULL,
'nullable' => FALSE,
'default' => 'SYSDATE',
'position' => 5,
'position' => 6,
'commentaire' => NULL,
],
'HISTO_DESTRUCTEUR_ID' => [
......@@ -102,7 +102,7 @@ return [
'precision' => NULL,
'nullable' => TRUE,
'default' => NULL,
'position' => 10,
'position' => 11,
'commentaire' => NULL,
],
'HISTO_DESTRUCTION' => [
......@@ -114,7 +114,7 @@ return [
'precision' => NULL,
'nullable' => TRUE,
'default' => NULL,
'position' => 9,
'position' => 10,
'commentaire' => NULL,
],
'HISTO_MODIFICATEUR_ID' => [
......@@ -126,7 +126,7 @@ return [
'precision' => NULL,
'nullable' => FALSE,
'default' => NULL,
'position' => 8,
'position' => 9,
'commentaire' => NULL,
],
'HISTO_MODIFICATION' => [
......@@ -138,7 +138,7 @@ return [
'precision' => NULL,
'nullable' => FALSE,
'default' => 'SYSDATE',
'position' => 7,
'position' => 8,
'commentaire' => NULL,
],
'ID' => [
......@@ -162,7 +162,7 @@ return [
'precision' => NULL,
'nullable' => FALSE,
'default' => NULL,
'position' => 3,
'position' => 4,
'commentaire' => NULL,
],
'OBLIGATOIRE_HNP' => [
......@@ -174,7 +174,7 @@ return [
'precision' => 1,
'nullable' => TRUE,
'default' => '0',
'position' => 16,
'position' => 17,
'commentaire' => 'Piece jointe obligatoire même si les heures sont non payables',
],
'SEUIL_HETD' => [
......@@ -186,7 +186,7 @@ return [
'precision' => NULL,
'nullable' => TRUE,
'default' => NULL,
'position' => 4,
'position' => 5,
'commentaire' => NULL,
],
'STATUT_ID' => [
......@@ -198,7 +198,19 @@ return [
'precision' => NULL,
'nullable' => FALSE,
'default' => NULL,
'position' => 17,
'position' => 3,
'commentaire' => NULL,
],
'TYPE_HEURE_HETD' => [
'name' => 'TYPE_HEURE_HETD',
'type' => 'bool',
'bdd-type' => 'NUMBER',
'length' => 0,
'scale' => '0',
'precision' => 1,
'nullable' => FALSE,
'default' => '0',
'position' => 18,
'commentaire' => NULL,
],
'TYPE_PIECE_JOINTE_ID' => [
......
......@@ -28,18 +28,18 @@ servicesAutres AS (
FROM (
SELECT DISTINCT
c.id contrat_id,
ti.libelle type_intervention_libelle
FROM
ti.libelle || ' (' || SUM(vh.heures) || ' h)' type_intervention_libelle
FROM
contrat c
JOIN volume_horaire vh ON vh.contrat_id = c.id AND vh.histo_destruction IS NULL
JOIN type_intervention ti ON ti.id = vh.type_intervention_id
WHERE ti.code NOT IN ('CM','TD','TP')
GROUP BY
c.id, ti.libelle
) t
GROUP by
t.contrat_id
)
)
SELECT
s.contrat_id,
......
CREATE OR REPLACE FORCE VIEW V_IMPUTATION_BUDGETAIRE_SIHAM AS
SELECT
'P' Type,
null uo,
intervenant_matricule matricule,
date_debut date_debut,
date_fin date_fin,
CASE WHEN rem_fc_d714 > 0 THEN '1542' ELSE
CASE WHEN type_intervenant_code = 'P' THEN '0204' ELSE '2251' END
END code_indemnite,
eotp_code operation,
centre_cout_code centre_cout,
domaine_fonctionnel_code destination,
NULL fonds,
NULL poste_reservation_credit,
to_char((CASE WHEN pourc_ecart >= 0 THEN
CASE WHEN RANK() OVER (PARTITION BY periode_id, intervenant_id, etat ORDER BY CASE WHEN (pourc_ecart >= 0 AND pourc_diff >= 0) OR (pourc_ecart < 0 AND pourc_diff < 0) THEN pourc_diff ELSE -1 END DESC) <= (ABS(pourc_ecart) / 0.001) THEN hetd_pourc + (pourc_ecart / ABS(pourc_ecart) * 0.001) ELSE hetd_pourc END
ELSE
CASE WHEN RANK() OVER (PARTITION BY periode_id, intervenant_id, etat ORDER BY CASE WHEN (pourc_ecart >= 0 AND pourc_diff >= 0) OR (pourc_ecart < 0 AND pourc_diff < 0) THEN pourc_diff ELSE -1 END) <= (ABS(pourc_ecart) / 0.001) THEN hetd_pourc + (pourc_ecart / ABS(pourc_ecart) * 0.001) ELSE hetd_pourc END
END)) * 100 pourcentage,
-- pourc_ecart,
-- pourc_diff,
NULL nombres_heures,
NULL FLMODI,
NULL NUMORD,
NULL NUMGRP,
annee_id,
periode_id,
intervenant_id,
centre_cout_id,
domaine_fonctionnel_id,
etat,
date_mise_en_paiement,
domaine_fonctionnel_code,
hetd,
hetd_montant,
rem_fc_d714,
type_intervenant_id
FROM
(
SELECT
dep3.*,
1-CASE WHEN hetd > 0 THEN SUM( hetd_pourc ) OVER ( PARTITION BY periode_id, intervenant_id, etat) ELSE 0 END pourc_ecart
FROM (
SELECT
periode_id,
type_intervenant_id,
type_intervenant_code,
intervenant_id,
annee_id,
centre_cout_id,
domaine_fonctionnel_id,
etat,
date_mise_en_paiement,
date_debut,
date_fin,
statut,
intervenant_code,
intervenant_matricule,
intervenant_nom,
intervenant_numero_insee,
centre_cout_code,
centre_cout_libelle,
eotp_code,
eotp_libelle,
domaine_fonctionnel_code,
domaine_fonctionnel_libelle,
hetd,
ROUND( CASE WHEN hetd > 0 THEN hetd / SUM( hetd ) OVER( PARTITION BY periode_id, intervenant_id, etat) ELSE 0 END, 3 ) hetd_pourc,
ROUND( hetd * taux_horaire, 2 ) hetd_montant,
ROUND( fc_majorees * taux_horaire, 2 ) rem_fc_d714,
exercice_aa,
ROUND( exercice_aa * taux_horaire, 2 ) exercice_aa_montant,
exercice_ac,
ROUND( exercice_ac * taux_horaire, 2 ) exercice_ac_montant,
(CASE WHEN hetd > 0 THEN hetd / SUM( hetd ) OVER( PARTITION BY periode_id, intervenant_id, etat) ELSE 0 END)
-
ROUND( CASE WHEN hetd > 0 THEN hetd / SUM( hetd ) OVER( PARTITION BY periode_id, intervenant_id, etat) ELSE 0 END, 3 ) pourc_diff
FROM (
WITH dep AS ( -- détails par état de paiement
SELECT
CASE WHEN th.code = 'fc_majorees' THEN 1 ELSE 0 END is_fc_majoree,
p.id periode_id,
i.id intervenant_id,
i.annee_id annee_id,
cc.id centre_cout_id,
df.id domaine_fonctionnel_id,
ti.id type_intervenant_id,
ti.code type_intervenant_code,
CASE
WHEN mep.date_mise_en_paiement IS NULL THEN 'a-mettre-en-paiement'
ELSE 'mis-en-paiement'
END etat,
TRIM(to_char( add_months( a.date_debut, p.ecart_mois ), 'dd/mm/yyyy' )) date_debut,
TRIM(to_char( last_day(add_months( a.date_debut, p.ecart_mois )), 'dd/mm/yyyy' )) date_fin,
mep.date_mise_en_paiement date_mise_en_paiement,
ti.libelle statut,
i.source_code intervenant_code,
i.code_rh intervenant_matricule,
i.nom_usuel || ' ' || i.prenom intervenant_nom,
i.numero_insee intervenant_numero_insee,
CASE WHEN cc.parent_id IS NULL THEN cc.source_code ELSE cc2.source_code END centre_cout_code,
CASE WHEN cc.parent_id IS NULL THEN cc.libelle ELSE cc2.libelle END centre_cout_libelle,
CASE WHEN cc.parent_id IS NOT NULL THEN cc.source_code ELSE NULL END eotp_code,
CASE WHEN cc.parent_id IS NOT NULL THEN cc.libelle ELSE NULL END eotp_libelle,
df.source_code domaine_fonctionnel_code,
df.libelle domaine_fonctionnel_libelle,
CASE WHEN th.code = 'fc_majorees' THEN mep.heures ELSE mep.heures END hetd,
CASE WHEN th.code = 'fc_majorees' THEN mep.heures ELSE 0 END fc_majorees,
mis.heures_aa exercice_aa,
mis.heures_ac exercice_ac,
OSE_FORMULE.GET_TAUX_HORAIRE_HETD( NVL(mep.date_mise_en_paiement,SYSDATE) ) taux_horaire
FROM
tbl_paiement mis
JOIN mise_en_paiement mep ON mep.id = mis.mise_en_paiement_id AND mep.histo_destruction IS NULL
JOIN type_heures th ON th.id = mep.type_heures_id
JOIN centre_cout cc ON cc.id = mep.centre_cout_id -- pas d'historique pour les centres de coût, qui devront tout de même apparaitre mais en erreur
LEFT JOIN centre_cout cc2 ON cc.parent_id = cc2.id
JOIN intervenant i ON i.id = mis.intervenant_id AND i.histo_destruction IS NULL
JOIN annee a ON a.id = i.annee_id
JOIN statut_intervenant si ON si.id = i.statut_id
JOIN type_intervenant ti ON ti.id = si.type_intervenant_id
LEFT JOIN validation v ON v.id = mep.validation_id AND v.histo_destruction IS NULL
LEFT JOIN domaine_fonctionnel df ON df.id = mis.domaine_fonctionnel_id
LEFT JOIN periode p ON p.id = mep.periode_paiement_id
)
SELECT
periode_id,
type_intervenant_id,
MAX(type_intervenant_code) type_intervenant_code,
intervenant_id,
annee_id,
centre_cout_id,
domaine_fonctionnel_id,
etat,
date_debut,
date_fin,
date_mise_en_paiement,
statut,
intervenant_code,
intervenant_matricule,
intervenant_nom,
intervenant_numero_insee,
centre_cout_code,
centre_cout_libelle,
eotp_code,
eotp_libelle,
domaine_fonctionnel_code,
domaine_fonctionnel_libelle,
SUM( hetd ) hetd,
SUM( fc_majorees ) fc_majorees,
SUM( exercice_aa ) exercice_aa,
SUM( exercice_ac ) exercice_ac,
taux_horaire
FROM
dep
GROUP BY
periode_id,
type_intervenant_id,
intervenant_id,
annee_id,
centre_cout_id,
domaine_fonctionnel_id,
etat,
date_debut,
date_fin,
date_mise_en_paiement,
statut,
intervenant_code,
intervenant_matricule,
intervenant_nom,
intervenant_numero_insee,
centre_cout_code,
centre_cout_libelle,
eotp_code,
eotp_libelle,
domaine_fonctionnel_code,
domaine_fonctionnel_libelle,
taux_horaire,
is_fc_majoree
)
dep2
)