Skip to content
Snippets Groups Projects
Commit d60fe630 authored by Laurent Lecluse's avatar Laurent Lecluse
Browse files

Merge branches 'b14' and 'master' of https://git.unicaen.fr/open-source/OSE

 Conflicts:
	CHANGELOG.md
	code/test2.php
	module/Application/view/application/intervenant/voir-heures-comp.phtml
	module/Application/view/application/statut-intervenant/saisie.phtml
parents 39047c4a b4e3b9c9
No related branches found
No related tags found
1 merge request!55Ll bug report services
Showing
with 1042 additions and 114 deletions
...@@ -8,6 +8,7 @@ return [ ...@@ -8,6 +8,7 @@ return [
'table' => 'NOEUD', 'table' => 'NOEUD',
'columns' => [ 'columns' => [
'SOURCE_CODE', 'SOURCE_CODE',
'ANNEE_ID',
'HISTO_DESTRUCTION', 'HISTO_DESTRUCTION',
], ],
]; ];
......
CREATE OR REPLACE PACKAGE BODY FORMULE_POITIERS AS
decalageLigne NUMERIC DEFAULT 20;
/* Stockage des valeurs intermédiaires */
TYPE t_cell IS RECORD (
valeur FLOAT,
enCalcul BOOLEAN DEFAULT FALSE
);
TYPE t_cells IS TABLE OF t_cell INDEX BY PLS_INTEGER;
TYPE t_coll IS RECORD (
cells t_cells
);
TYPE t_colls IS TABLE OF t_coll INDEX BY VARCHAR2(50);
feuille t_colls;
debugLine NUMERIC;
PROCEDURE dbg( val CLOB ) IS
BEGIN
ose_formule.volumes_horaires.items(debugLine).debug_info :=
ose_formule.volumes_horaires.items(debugLine).debug_info || val;
END;
PROCEDURE dbgi( val CLOB ) IS
BEGIN
ose_formule.intervenant.debug_info := ose_formule.intervenant.debug_info || val;
END;
PROCEDURE dbgDump( val CLOB ) IS
BEGIN
dbg('<div class="dbg-dump">' || val || '</div>');
END;
PROCEDURE dbgCell( c VARCHAR2, l NUMERIC, val FLOAT ) IS
ligne NUMERIC;
BEGIN
ligne := l;
IF l <> 0 THEN
ligne := ligne + decalageLigne;
END IF;
dbgi( '[cell|' || c || '|' || ligne || '|' || val );
END;
PROCEDURE dbgCalc( fncName VARCHAR2, c VARCHAR2, res FLOAT ) IS
BEGIN
dbgi( '[calc|' || fncName || '|' || c || '|' || res );
END;
FUNCTION cell( c VARCHAR2, l NUMERIC DEFAULT 0 ) RETURN FLOAT IS
val FLOAT;
BEGIN
IF feuille.exists(c) THEN
IF feuille(c).cells.exists(l) THEN
IF feuille(c).cells(l).enCalcul THEN
raise_application_error( -20001, 'Dépendance cyclique : la cellule [' || c || ';' || l || '] est déjà en cours de calcul');
END IF;
RETURN feuille(c).cells(l).valeur;
END IF;
END IF;
feuille(c).cells(l).enCalcul := true;
val := calcCell( c, l );
IF ose_formule.debug_actif THEN
dbgCell( c, l, val );
END IF;
feuille(c).cells(l).valeur := val;
feuille(c).cells(l).enCalcul := false;
RETURN val;
END;
FUNCTION mainCell( libelle VARCHAR2, c VARCHAR2, l NUMERIC ) RETURN FLOAT IS
val FLOAT;
BEGIN
debugLine := l;
val := cell(c,l);
RETURN val;
END;
FUNCTION calcFnc( fncName VARCHAR2, c VARCHAR2 ) RETURN FLOAT IS
val FLOAT;
cellRes FLOAT;
BEGIN
IF feuille.exists('__' || fncName || '__' || c || '__') THEN
IF feuille('__' || fncName || '__' || c || '__').cells.exists(1) THEN
RETURN feuille('__' || fncName || '__' || c || '__').cells(1).valeur;
END IF;
END IF;
CASE
-- Liste des fonctions supportées
WHEN fncName = 'total' THEN
val := 0;
FOR l IN 1 .. ose_formule.volumes_horaires.length LOOP
val := val + COALESCE(cell(c, l),0);
END LOOP;
WHEN fncName = 'max' THEN
val := NULL;
FOR l IN 1 .. ose_formule.volumes_horaires.length LOOP
cellRes := cell(c,l);
IF val IS NULL OR val < cellRes THEN
val := cellRes;
END IF;
END LOOP;
-- fin de la liste des fonctions supportées
ELSE
raise_application_error( -20001, 'La formule "' || fncName || '" n''existe pas!');
END CASE;
IF ose_formule.debug_actif THEN
dbgCalc(fncName, c, val );
END IF;
feuille('__' || fncName || '__' || c || '__').cells(1).valeur := val;
RETURN val;
END;
FUNCTION calcVersion RETURN NUMERIC IS
BEGIN
RETURN 1;
END;
FUNCTION notInStructs( v VARCHAR2 DEFAULT NULL ) RETURN BOOLEAN IS
BEGIN
RETURN COALESCE(v,' ') NOT IN ('KE8','UP10');
END;
FUNCTION calcCell( c VARCHAR2, l NUMERIC ) RETURN FLOAT IS
vh ose_formule.t_volume_horaire;
i ose_formule.t_intervenant;
v NUMERIC;
val FLOAT;
BEGIN
v := calcVersion;
i := ose_formule.intervenant;
IF l > 0 THEN
vh := ose_formule.volumes_horaires.items(l);
END IF;
CASE
-- T=SI($H20="Référentiel";0;($AW20+$AY20)*E20)
WHEN c = 'T' AND v >= 1 THEN
IF vh.volume_horaire_ref_id IS NOT NULL THEN
RETURN 0;
ELSE
RETURN cell('AW',l) + cell('AY',l);
END IF;
-- U=SI($H20="Référentiel";0;($AW20+$AY20)*F20)
WHEN c = 'U' AND v >= 1 THEN
IF vh.volume_horaire_ref_id IS NOT NULL THEN
RETURN 0;
ELSE
RETURN (cell('AW',l) + cell('AY',l)) * vh.TAUX_FA;
END IF;
-- V=SI($H20="Référentiel";0;($AW20+$AY20)*G20)
WHEN c = 'V' AND v >= 1 THEN
IF vh.volume_horaire_ref_id IS NOT NULL THEN
RETURN 0;
ELSE
RETURN (cell('AW',l) + cell('AY',l)) * vh.TAUX_FC;
END IF;
-- W=SI($H20="Référentiel";$AX20)
WHEN c = 'W' AND v >= 1 THEN
IF vh.volume_horaire_ref_id IS NOT NULL THEN
RETURN cell('AX',l);
ELSE
RETURN 0;
END IF;
-- X=SI($H20="Référentiel";0;$BB20*E20)
WHEN c = 'X' AND v >= 1 THEN
IF vh.volume_horaire_ref_id IS NOT NULL THEN
RETURN 0;
ELSE
RETURN cell('BB',l) * vh.taux_fi;
END IF;
-- Y=SI($H20="Référentiel";0;$BB20*F20)
WHEN c = 'Y' AND v >= 1 THEN
IF vh.volume_horaire_ref_id IS NOT NULL THEN
RETURN 0;
ELSE
RETURN cell('BB',l) * vh.taux_fa;
END IF;
-- Z=SI($H20="Référentiel";0;$BB20*G20)
WHEN c = 'Z' AND v >= 1 THEN
IF vh.volume_horaire_ref_id IS NOT NULL THEN
RETURN 0;
ELSE
RETURN cell('BB',l) * vh.taux_fc;
END IF;
-- AA=0
WHEN c = 'AA' AND v >= 1 THEN
RETURN 0;
-- AB=SI($H20="Référentiel";$BC20;0)
WHEN c = 'AB' AND v >= 1 THEN
IF vh.volume_horaire_ref_id IS NOT NULL THEN
RETURN cell('BC',l);
ELSE
RETURN 0;
END IF;
-- AD=SI($H20="ETD";0;SI($H20="Référentiel";2;SI(ET($F20=1;OU($A20="I2000";$A20="I2300"));3;1)))
WHEN c = 'AD' AND v >= 1 THEN
IF vh.type_intervention_code = 'ETD' THEN
RETURN 0;
ELSE
--SI($H20="Référentiel";2;SI(ET($F20=1;OU($A20="I2000";$A20="I2300"));3;1))
IF vh.volume_horaire_ref_id IS NOT NULL THEN
RETURN 2;
ELSE
--SI(ET($F20=1;OU($A20="I2000";$A20="I2300"));3;1)
IF vh.taux_fa = 1 AND vh.STRUCTURE_CODE IN ('I2000','I2300') THEN
RETURN 3;
ELSE
RETURN 1;
END IF;
END IF;
END IF;
-- AE=SI(OU(ESTERREUR(I20);ESTERREUR(J20));1;SI(AD20=3;J20;I20)*K20)
WHEN c = 'AE' AND v >= 1 THEN
--SI(AD20=3;J20;I20)*K20
IF cell('AD',l) = 3 THEN
RETURN vh.TAUX_SERVICE_COMPL * vh.PONDERATION_SERVICE_DU;
ELSE
RETURN vh.TAUX_SERVICE_DU * vh.PONDERATION_SERVICE_DU;
END IF;
-- AF=SI(OU(ESTERREUR(I20);ESTERREUR(J20));1;J20*K20)
WHEN c = 'AF' AND v >= 1 THEN
RETURN vh.taux_service_compl * vh.ponderation_service_du;
-- AG=SI($D20="Oui";$M20*$AE20;0)
WHEN c = 'AG' AND v >= 1 THEN
IF vh.service_statutaire THEN
RETURN vh.heures * cell('AE',l);
ELSE
RETURN 0;
END IF;
-- AH=SI(ET($AD20>0;$AD20<3;$D20="Oui");$AG20;0)
WHEN c = 'AH' AND v >= 1 THEN
IF cell('AD',l) > 0 AND cell('AD',l) < 3 AND vh.service_statutaire THEN
RETURN cell('AG',l);
ELSE
RETURN 0;
END IF;
-- AI=SI(ET($AD20=2;$D20="Oui");$AG20;0)
WHEN c = 'AI' AND v >= 1 THEN
IF cell('AD',l) = 2 AND vh.service_statutaire THEN
RETURN cell('AG',l);
ELSE
RETURN 0;
END IF;
-- AJ=SI(AI$35<i_param_1;AI20;AI20/AI$35*i_param_1)
WHEN c = 'AJ' AND v >= 1 THEN
IF cell('AI35') < i.param_1 THEN
RETURN cell('AI',l);
ELSE
RETURN cell('AI',l) / cell('AI35') * i.param_1;
END IF;
-- AK=SI(AJ20>0;AJ20;AH20)
WHEN c = 'AK' AND v >= 1 THEN
IF cell('AJ',l) > 0 THEN
RETURN cell('AJ',l);
ELSE
RETURN cell('AH',l);
END IF;
-- AL=SI(AK$35>0;AK20/AK$35;0)
WHEN c = 'AL' AND v >= 1 THEN
IF cell('AK35') > 0 THEN
RETURN cell('AK',l) / cell('AK35');
ELSE
RETURN 0;
END IF;
-- AM=SI($AD20=1;AK20;0)
WHEN c = 'AM' AND v >= 1 THEN
IF cell('AD',l) = 1 THEN
RETURN cell('AK',l);
ELSE
RETURN 0;
END IF;
-- AN=SI(AM$35>0;AM20/AM$35;0)
WHEN c = 'AN' AND v >= 1 THEN
IF cell('AM35') > 0 THEN
RETURN cell('AM',l) / cell('AM35');
ELSE
RETURN 0;
END IF;
-- AO=SI($AD20=2;AL20;0)
WHEN c = 'AO' AND v >= 1 THEN
IF cell('AD',l) = 2 THEN
RETURN cell('AL',l);
ELSE
RETURN 0;
END IF;
-- AP=SI((AJ$35+AM$35)<=i_service_du;AM20;AN20*(i_service_du-AJ$35))
WHEN c = 'AP' AND v >= 1 THEN
IF (cell('AJ35') + cell('AM35')) <= i.service_du THEN
RETURN cell('AM',l);
ELSE
RETURN cell('AN',l) * (i.SERVICE_DU - cell('AJ35'));
END IF;
-- AQ=SI($AD20=2;AK20;0)
WHEN c = 'AQ' AND v >= 1 THEN
IF cell('AD',l) = 2 THEN
RETURN cell('AK',l);
ELSE
RETURN 0;
END IF;
-- AR=AP20+AQ20
WHEN c = 'AR' AND v >= 1 THEN
RETURN cell('AP',l) + cell('AQ',l);
-- AS=SI($AD20=3;AG20;0)
WHEN c = 'AS' AND v >= 1 THEN
IF cell('AD',l) = 3 THEN
RETURN cell('AG',l);
ELSE
RETURN 0;
END IF;
-- AT=SI(OU((AM$35+AJ$35)>=i_service_du;AS$35=0);0;AS20/AS$35*MIN((i_service_du-AM$35-AJ$35);AS$35))
WHEN c = 'AT' AND v >= 1 THEN
--OU((AM$35+AJ$35)>=i_service_du;AS$35=0)
IF (cell('AM35') + cell('AJ35')) >= i.service_du OR cell('AS35') = 0 THEN
RETURN 0;
ELSE
--AS20/AS$35*MIN((i_service_du-AM$35-AJ$35);AS$35)
RETURN cell('AS',l) / cell('AS35') * least(i.SERVICE_DU - cell('AM35') - cell('AJ35'), cell('AS35'));
END IF;
-- AU=SI(AM$35>0;AM20/AM$35)
WHEN c = 'AU' AND v >= 1 THEN
RETURN cell('AM',l) / cell('AM35');
-- AW=AP20
WHEN c = 'AW' AND v >= 1 THEN
RETURN cell('AP',l);
-- AX=AJ20
WHEN c = 'AX' AND v >= 1 THEN
RETURN cell('AJ',l);
-- AY=AT20
WHEN c = 'AY' AND v >= 1 THEN
RETURN cell('AT',l);
-- AZ=SI(AG20=0;0;(AR20+AT20)/AG20)
WHEN c = 'AZ' AND v >= 1 THEN
IF cell('AG',l) = 0 THEN
RETURN 0;
ELSE
RETURN (cell('AR',l) + cell('AT',l)) / cell('AG',l);
END IF;
-- BA=SI(AG$35>i_service_du;1-AZ20;0)
WHEN c = 'BA' AND v >= 1 THEN
IF cell('AG35') > i.service_du THEN
RETURN 1 - cell('AZ',l);
ELSE
RETURN 0;
END IF;
-- BB=SI(i_depassement_service_du_sans_hc="Non";SI($AD20=2;0;$M20*$AF20*$BA20);0)
WHEN c = 'BB' AND v >= 1 THEN
IF NOT i.DEPASSEMENT_SERVICE_DU_SANS_HC THEN
--SI($AD20=2;0;$M20*$AF20*$BA20)
IF cell('AD',l) = 2 THEN
RETURN 0;
ELSE
RETURN vh.heures * cell('AF',l) * cell('BA',l);
END IF;
ELSE
RETURN 0;
END IF;
-- BC=SI(i_depassement_service_du_sans_hc="Non";SI($AD20<>2;0;$M20*$AF20*$BA20);0)
WHEN c = 'BC' AND v >= 1 THEN
IF NOT i.DEPASSEMENT_SERVICE_DU_SANS_HC THEN
--SI($AD20<>2;0;$M20*$AF20*$BA20)
IF cell('AD',l) <> 2 THEN
RETURN 0;
ELSE
RETURN vh.heures * cell('AF',l) * cell('BA',l);
END IF;
ELSE
RETURN 0;
END IF;
-- AG35=SOMME(AG20:AG34)
WHEN c = 'AG35' AND v >= 1 THEN
RETURN calcFnc('total', 'AG');
-- AH35=SOMME(AH20:AH34)
WHEN c = 'AH35' AND v >= 1 THEN
RETURN calcFnc('total', 'AH');
-- AI35=SOMME(AI20:AI34)
WHEN c = 'AI35' AND v >= 1 THEN
RETURN calcFnc('total', 'AI');
-- AJ35=SOMME(AJ20:AJ34)
WHEN c = 'AJ35' AND v >= 1 THEN
RETURN calcFnc('total', 'AJ');
-- AK35=SOMME(AK20:AK34)
WHEN c = 'AK35' AND v >= 1 THEN
RETURN calcFnc('total', 'AK');
-- AM35=SOMME(AM20:AM34)
WHEN c = 'AM35' AND v >= 1 THEN
RETURN calcFnc('total', 'AM');
-- AP35=SOMME(AP20:AP34)
WHEN c = 'AP35' AND v >= 1 THEN
RETURN calcFnc('total', 'AP');
-- AQ35=SOMME(AQ20:AQ34)
WHEN c = 'AQ35' AND v >= 1 THEN
RETURN calcFnc('total', 'AQ');
-- AR35=SOMME(AR20:AR34)
WHEN c = 'AR35' AND v >= 1 THEN
RETURN calcFnc('total', 'AR');
-- AS35=SOMME(AS20:AS34)
WHEN c = 'AS35' AND v >= 1 THEN
RETURN calcFnc('total', 'AS');
-- AT35=SOMME(AT20:AT34)
WHEN c = 'AT35' AND v >= 1 THEN
RETURN calcFnc('total', 'AT');
-- AW35=SOMME(AW20:AW34)
WHEN c = 'AW35' AND v >= 1 THEN
RETURN calcFnc('total', 'AW');
-- AX35=SOMME(AX20:AX34)
WHEN c = 'AX35' AND v >= 1 THEN
RETURN calcFnc('total', 'AX');
-- AY35=SOMME(AY20:AY34)
WHEN c = 'AY35' AND v >= 1 THEN
RETURN calcFnc('total', 'AY');
-- BB35=SOMME(BB20:BB34)
WHEN c = 'BB35' AND v >= 1 THEN
RETURN calcFnc('total', 'BB');
-- BC35=SOMME(BC20:BC34)
WHEN c = 'BC35' AND v >= 1 THEN
RETURN calcFnc('total', 'BC');
-- AW37=AW35
WHEN c = 'AW37' AND v >= 1 THEN
RETURN cell('AW35');
-- AX37=AW37+AX35
WHEN c = 'AX37' AND v >= 1 THEN
RETURN cell('AW37') + cell('AX35');
-- AY37=AX37+AY35
WHEN c = 'AY37' AND v >= 1 THEN
RETURN cell('AX37') + cell('AY35');
-- BC37=BB35+BC35
WHEN c = 'BC37' AND v >= 1 THEN
RETURN cell('BB35') + cell('BC35');
ELSE
OSE_TEST.echo(c);
raise_application_error( -20001, 'La colonne c=' || c || ', l=' || l || ' n''existe pas!');
END CASE; END;
PROCEDURE CALCUL_RESULTAT IS
BEGIN
feuille.delete;
-- transmission des résultats aux volumes horaires et volumes horaires référentiel
FOR l IN 1 .. ose_formule.volumes_horaires.length LOOP
ose_formule.volumes_horaires.items(l).service_fi := mainCell('Service FI', 'T',l);
ose_formule.volumes_horaires.items(l).service_fa := mainCell('Service FA', 'U',l);
ose_formule.volumes_horaires.items(l).service_fc := mainCell('Service FC', 'V',l);
ose_formule.volumes_horaires.items(l).service_referentiel := mainCell('Service référentiel', 'W',l);
ose_formule.volumes_horaires.items(l).heures_compl_fi := mainCell('Heures compl. FI', 'X',l);
ose_formule.volumes_horaires.items(l).heures_compl_fa := mainCell('Heures compl. FA', 'Y',l);
ose_formule.volumes_horaires.items(l).heures_compl_fc := mainCell('Heures compl. FC', 'Z',l);
ose_formule.volumes_horaires.items(l).heures_compl_fc_majorees := mainCell('Heures compl. FC Maj.', 'AA',l);
ose_formule.volumes_horaires.items(l).heures_compl_referentiel := mainCell('Heures compl. référentiel', 'AB',l);
END LOOP;
END;
FUNCTION INTERVENANT_QUERY RETURN CLOB IS
BEGIN
RETURN '
SELECT
fi.*,
si.plafond_referentiel_service param_1,
si.plafond_referentiel_hc param_2,
NULL param_3,
NULL param_4,
NULL param_5
FROM
v_formule_intervenant fi
JOIN intervenant i ON i.id = fi.intervenant_id
JOIN statut_intervenant si ON si.id = fi.statut_id
';
END;
FUNCTION VOLUME_HORAIRE_QUERY RETURN CLOB IS
BEGIN
RETURN '
SELECT
fvh.*,
NULL param_1,
NULL param_2,
NULL param_3,
NULL param_4,
NULL param_5
FROM
v_formule_volume_horaire fvh
ORDER BY
ordre';
END;
END FORMULE_POITIERS;
\ No newline at end of file
CREATE OR REPLACE PACKAGE FORMULE_POITIERS AS
PROCEDURE CALCUL_RESULTAT;
FUNCTION calcCell( c VARCHAR2, l NUMERIC ) RETURN FLOAT;
FUNCTION INTERVENANT_QUERY RETURN CLOB;
FUNCTION VOLUME_HORAIRE_QUERY RETURN CLOB;
END FORMULE_POITIERS;
\ No newline at end of file
...@@ -33,6 +33,17 @@ return [ ...@@ -33,6 +33,17 @@ return [
'position' => 2, 'position' => 2,
'commentaire' => NULL, 'commentaire' => NULL,
], ],
'DATE_ENVOI_EMAIL' => [
'name' => 'DATE_ENVOI_EMAIL',
'type' => 'date',
'bdd-type' => 'DATE',
'length' => 0,
'scale' => NULL,
'precision' => NULL,
'nullable' => TRUE,
'default' => NULL,
'commentaire' => 'Date envoi du contrat par email',
],
'HISTO_CREATEUR_ID' => [ 'HISTO_CREATEUR_ID' => [
'name' => 'HISTO_CREATEUR_ID', 'name' => 'HISTO_CREATEUR_ID',
'type' => 'int', 'type' => 'int',
......
...@@ -381,6 +381,28 @@ return [ ...@@ -381,6 +381,28 @@ return [
'position' => 31, 'position' => 31,
'commentaire' => NULL, 'commentaire' => NULL,
], ],
'PLAFOND_REFERENTIEL_HC' => [
'name' => 'PLAFOND_REFERENTIEL_HC',
'type' => 'float',
'bdd-type' => 'FLOAT',
'length' => 0,
'scale' => NULL,
'precision' => 126,
'nullable' => FALSE,
'default' => '9999',
'commentaire' => NULL,
],
'PLAFOND_REFERENTIEL_SERVICE' => [
'name' => 'PLAFOND_REFERENTIEL_SERVICE',
'type' => 'float',
'bdd-type' => 'FLOAT',
'length' => 0,
'scale' => NULL,
'precision' => 126,
'nullable' => FALSE,
'default' => '9999',
'commentaire' => NULL,
],
'SERVICE_STATUTAIRE' => [ 'SERVICE_STATUTAIRE' => [
'name' => 'SERVICE_STATUTAIRE', 'name' => 'SERVICE_STATUTAIRE',
'type' => 'float', 'type' => 'float',
......
...@@ -8,6 +8,7 @@ return [ ...@@ -8,6 +8,7 @@ return [
'index' => 'NOEUD_SOURCE_UN', 'index' => 'NOEUD_SOURCE_UN',
'columns' => [ 'columns' => [
'SOURCE_CODE', 'SOURCE_CODE',
'ANNEE_ID',
'HISTO_DESTRUCTION', 'HISTO_DESTRUCTION',
], ],
]; ];
......
...@@ -18,7 +18,6 @@ FROM ...@@ -18,7 +18,6 @@ FROM
JOIN statut_intervenant si ON si.id = i.statut_id JOIN statut_intervenant si ON si.id = i.statut_id
JOIN type_intervenant ti ON ti.id = si.type_intervenant_id JOIN type_intervenant ti ON ti.id = si.type_intervenant_id
WHERE WHERE
i.histo_destruction IS NULL i.id = COALESCE( OSE_FORMULE.GET_INTERVENANT_ID, i.id )
AND i.id = COALESCE( OSE_FORMULE.GET_INTERVENANT_ID, i.id )
GROUP BY GROUP BY
i.id, i.annee_id, i.structure_id, ti.code, s.code, si.service_statutaire, si.depassement_service_du_sans_hc i.id, i.annee_id, i.structure_id, ti.code, s.code, si.service_statutaire, si.depassement_service_du_sans_hc
\ No newline at end of file
CREATE OR REPLACE VIEW OSE.V_INDICATEUR_361
(ID,INTERVENANT_ID,ANNEE_ID,STRUCTURE_ID,CONTRAT_ID)
AS
SELECT
rownum id,
t."INTERVENANT_ID",t."ANNEE_ID",t."STRUCTURE_ID",t."CONTRAT_ID"
FROM (
SELECT DISTINCT
i.id intervenant_id,
i.annee_id annee_id,
c.structure_id structure_id,
c.id contrat_id
FROM
contrat c
JOIN intervenant i ON i.id = c.intervenant_id
JOIN tbl_workflow w ON w.intervenant_id = i.id AND w.structure_id = c.structure_id AND w.etape_code = 'CONTRAT' AND w.atteignable = 1
JOIN validation v ON v.id = c.validation_id AND v.histo_destruction IS NULL
LEFT JOIN contrat_fichier cf ON cf.contrat_id = c.id
LEFT JOIN fichier f ON f.id = cf.fichier_id AND f.histo_destruction IS NULL
WHERE
c.histo_destruction IS NULL
AND f.id IS NULL
AND c.date_envoi_email IS NOT NULL
) t
\ No newline at end of file
...@@ -271,6 +271,16 @@ return [ ...@@ -271,6 +271,16 @@ return [
'TEM_DISTINCT' => false, 'TEM_DISTINCT' => false,
'TEM_NOT_STRUCTURE' => false, 'TEM_NOT_STRUCTURE' => false,
], ],
361 => [
'TYPE' => 'Contrat / avenant',
'ENABLED' => true,
'LIBELLE_PLURIEL' => '%s contrats <i>envoyés par e-mail</i> sont en attente de retour',
'LIBELLE_SINGULIER' => '%s contrat <i>envoyé par e-mail</i> est en attente de retour',
'MESSAGE' => null,
'ROUTE' => 'intervenant/contrat',
'TEM_DISTINCT' => false,
'TEM_NOT_STRUCTURE' => false,
],
370 => [ 370 => [
'TYPE' => 'Contrat / avenant', 'TYPE' => 'Contrat / avenant',
'ENABLED' => true, 'ENABLED' => true,
......
...@@ -181,6 +181,12 @@ return [ ...@@ -181,6 +181,12 @@ return [
'LIBELLE' => 'INSA de Lyon', 'LIBELLE' => 'INSA de Lyon',
'PACKAGE_NAME' => 'FORMULE_INSA_LYON', 'PACKAGE_NAME' => 'FORMULE_INSA_LYON',
], ],
12 => [
'LIBELLE' => 'Université de Poitiers',
'PACKAGE_NAME' => 'FORMULE_POITIERS',
'I_PARAM_1_LIBELLE' => 'Heures max. référentiel en service',
'I_PARAM_2_LIBELLE' => 'Heures max. référentiel en HC',
],
], ],
'MODELE_CONTRAT' => [ 'MODELE_CONTRAT' => [
......
...@@ -75,6 +75,20 @@ return [ ...@@ -75,6 +75,20 @@ return [
], ],
'may_terminate' => true, 'may_terminate' => true,
], ],
'creer-from-reel' => [
'type' => 'Segment',
'options' => [
'route' => '/creer-from-reel/:intervenant/:typeVolumeHoraire/:etatVolumeHoraire',
'constraints' => [
'typeVolumeHoraire' => '[0-9]*',
'etatVolumeHoraire' => '[0-9]*',
],
'defaults' => [
'action' => 'test-creer-from-reel',
],
],
'may_terminate' => true,
],
], ],
], ],
], ],
...@@ -124,7 +138,7 @@ return [ ...@@ -124,7 +138,7 @@ return [
PrivilegeController::class => [ PrivilegeController::class => [
[ [
'controller' => 'Application\Controller\Formule', 'controller' => 'Application\Controller\Formule',
'action' => ['test', 'test-saisir', 'test-enregistrement', 'test-supprimer'], 'action' => ['test', 'test-saisir', 'test-enregistrement', 'test-supprimer', 'test-creer-from-reel'],
'privileges' => [Privileges::FORMULE_TESTS], 'privileges' => [Privileges::FORMULE_TESTS],
], ],
], ],
......
...@@ -31,6 +31,7 @@ use Application\Entity\Db\Contrat; ...@@ -31,6 +31,7 @@ use Application\Entity\Db\Contrat;
use Zend\View\Model\JsonModel; use Zend\View\Model\JsonModel;
use BjyAuthorize\Exception\UnAuthorizedException; use BjyAuthorize\Exception\UnAuthorizedException;
use Zend\View\Renderer\PhpRenderer; use Zend\View\Renderer\PhpRenderer;
use DateTime;
/** /**
* Description of ContratController * Description of ContratController
...@@ -341,17 +342,27 @@ class ContratController extends AbstractController ...@@ -341,17 +342,27 @@ class ContratController extends AbstractController
public function envoyerMailAction() public function envoyerMailAction()
{ {
/**
* @var Contrat $contrat
*/
$contrat = $this->getEvent()->getParam('contrat'); $contrat = $this->getEvent()->getParam('contrat');
if (!$this->isAllowed($contrat, ContratAssertion::PRIV_EXPORT)) { if (!$this->isAllowed($contrat, ContratAssertion::PRIV_EXPORT)) {
throw new UnAuthorizedException("Interdiction d'envoyer le contrat par email"); throw new UnAuthorizedException("Interdiction d'envoyer le contrat par email");
} }
if (!empty($contrat->getIntervenant()->getEmail())) { //Récupération email intervenant (Perso puis unicaen)
$intervenant = $contrat->getIntervenant();
$dossierIntervenant = $this->getServiceDossier()->getByIntervenant($intervenant);
$emailDossierPerso = ($dossierIntervenant) ? $dossierIntervenant->getEmailPerso() : '';
$emailIntervenant = (!empty($emailDossierPerso)) ? $emailDossierPerso : $intervenant->getEmail();
if (!empty($emailIntervenant)) {
try {
//Utilisation ici du parametre email //Utilisation ici du parametre email
$html = $this->getServiceParametres()->get('contrat_modele_mail'); $html = $this->getServiceParametres()->get('contrat_modele_mail');
//Ajout pour transformer les sauts de lignes en html <br/> //Ajout pour transformer les sauts de lignes en html <br/>
$html = nl2br($html); $html = nl2br($html);
//Personnalisation des variables //Personnalisation des variables
$vIntervenant = $contrat->getIntervenant()->getCivilite()->getLibelleCourt() . " " . $contrat->getIntervenant()->getNomUsuel(); $vIntervenant = $contrat->getIntervenant()->getCivilite()->getLibelleCourt() . " " . $contrat->getIntervenant()->getNomUsuel();
$vUtilisateur = $this->getServiceContext()->getUtilisateur()->getDisplayName(); $vUtilisateur = $this->getServiceContext()->getUtilisateur()->getDisplayName();
...@@ -360,7 +371,15 @@ class ContratController extends AbstractController ...@@ -360,7 +371,15 @@ class ContratController extends AbstractController
$subject = $this->getServiceParametres()->get('contrat_modele_mail_objet'); $subject = $this->getServiceParametres()->get('contrat_modele_mail_objet');
$subject = str_replace(':intervenant', $vIntervenant, $subject); $subject = str_replace(':intervenant', $vIntervenant, $subject);
$message = $this->getServiceModeleContrat()->prepareMail($contrat, $html, $subject); $message = $this->getServiceModeleContrat()->prepareMail($contrat, $html, $subject);
$mail = $this->mail()->send($message); $mail = $this->mail()->send($message);
$dateEnvoiEmail = new DateTime();
$contrat->setDateEnvoiEmail($dateEnvoiEmail);
$this->getServiceContrat()->save($contrat);
$this->flashMessenger()->addSuccessMessage('Contrat bien envoyé par email à ' . $emailIntervenant);
} catch (\Exception $e) {
$this->flashMessenger()->addErrorMessage($this->translate($e));
}
} }
return $this->getResponse(); return $this->getResponse();
......
...@@ -27,7 +27,6 @@ class FormuleController extends AbstractController ...@@ -27,7 +27,6 @@ class FormuleController extends AbstractController
use ParametresServiceAwareTrait; use ParametresServiceAwareTrait;
public function testAction() public function testAction()
{ {
$fti = $this->getServiceFormuleTestIntervenant()->getList(); $fti = $this->getServiceFormuleTestIntervenant()->getList();
...@@ -147,6 +146,21 @@ class FormuleController extends AbstractController ...@@ -147,6 +146,21 @@ class FormuleController extends AbstractController
public function testCreerFromReelAction()
{
$intervenant = $this->getEvent()->getParam('intervenant');
$typeVolumeHoraire = $this->getEvent()->getParam('typeVolumeHoraire');
$etatVolumeHoraire = $this->getEvent()->getParam('etatVolumeHoraire');
$formuleTestIntervenant = $this->getServiceFormuleTestIntervenant()->creerDepuisIntervenant($intervenant, $typeVolumeHoraire, $etatVolumeHoraire);
$url = $this->url()->fromRoute('formule-calcul/test/saisir', ['formuleTestIntervenant' => $formuleTestIntervenant->getId()]);
return $this->redirect()->toUrl($url);
}
public function calculerToutAction() public function calculerToutAction()
{ {
$this->em()->getConnection()->exec('BEGIN OSE_FORMULE.CALCULER_TOUT; END;'); $this->em()->getConnection()->exec('BEGIN OSE_FORMULE.CALCULER_TOUT; END;');
......
...@@ -53,6 +53,11 @@ class Contrat implements HistoriqueAwareInterface, ResourceInterface ...@@ -53,6 +53,11 @@ class Contrat implements HistoriqueAwareInterface, ResourceInterface
*/ */
private $dateRetourSigne; private $dateRetourSigne;
/**
* @var \DateTime
*/
private $dateEnvoiEmail;
/** /**
* @var \Doctrine\Common\Collections\Collection * @var \Doctrine\Common\Collections\Collection
*/ */
...@@ -358,6 +363,34 @@ class Contrat implements HistoriqueAwareInterface, ResourceInterface ...@@ -358,6 +363,34 @@ class Contrat implements HistoriqueAwareInterface, ResourceInterface
/**
* Set dateEnvoiEmail
*
* @param \DateTime $dateEnvoiEmail
*
* @return Contrat
*/
public function setDateEnvoiEmail($dateEnvoiEmail)
{
$this->dateEnvoiEmail = $dateEnvoiEmail;
return $this;
}
/**
* Get dateEnvoiEmail
*
* @return \DateTime
*/
public function getDateEnvoiEmail()
{
return $this->dateEnvoiEmail;
}
/** /**
* Add fichier * Add fichier
* *
......
<?php
namespace Application\Entity\Db\Indicateur;
class Indicateur361 extends AbstractIndicateur
{
}
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd"> <doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
<entity name="Application\Entity\Db\Contrat" table="CONTRAT"> <entity name="Application\Entity\Db\Contrat" table="CONTRAT">
<indexes> <indexes>
<index name="IDX_5F71678959860CDC" columns="HISTO_CREATEUR_ID"/> <index name="IDX_5F71678959860CDC" columns="HISTO_CREATEUR_ID"/>
...@@ -12,6 +14,7 @@ ...@@ -12,6 +14,7 @@
</id> </id>
<field name="numeroAvenant" type="integer" column="NUMERO_AVENANT" nullable="false"/> <field name="numeroAvenant" type="integer" column="NUMERO_AVENANT" nullable="false"/>
<field name="dateRetourSigne" type="datetime" column="DATE_RETOUR_SIGNE" nullable="true"/> <field name="dateRetourSigne" type="datetime" column="DATE_RETOUR_SIGNE" nullable="true"/>
<field name="dateEnvoiEmail" type="datetime" column="DATE_ENVOI_EMAIL" nullable="true"/>
<field name="totalHetd" type="float" column="TOTAL_HETD" precision="126" scale="0" nullable="true"/> <field name="totalHetd" type="float" column="TOTAL_HETD" precision="126" scale="0" nullable="true"/>
<field name="histoCreation" type="datetime" column="HISTO_CREATION" nullable="false"/> <field name="histoCreation" type="datetime" column="HISTO_CREATION" nullable="false"/>
<field name="histoDestruction" type="datetime" column="HISTO_DESTRUCTION" nullable="true"/> <field name="histoDestruction" type="datetime" column="HISTO_DESTRUCTION" nullable="true"/>
......
<?xml version="1.0" encoding="utf-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
<entity name="Application\Entity\Db\Indicateur\Indicateur361" table="V_INDICATEUR_361" read-only="true">
<id name="id" type="integer" column="ID"/>
<many-to-one field="annee" target-entity="Application\Entity\Db\Annee">
<join-column name="ANNEE_ID" referenced-column-name="ID"/>
</many-to-one>
<many-to-one field="intervenant" target-entity="Application\Entity\Db\Intervenant">
<join-column name="INTERVENANT_ID" referenced-column-name="ID"/>
</many-to-one>
<many-to-one field="structure" target-entity="Application\Entity\Db\Structure">
<join-column name="STRUCTURE_ID" referenced-column-name="ID"/>
</many-to-one>
</entity>
</doctrine-mapping>
...@@ -13,6 +13,8 @@ ...@@ -13,6 +13,8 @@
<field name="libelle" type="string" column="LIBELLE" length="128" nullable="false"/> <field name="libelle" type="string" column="LIBELLE" length="128" nullable="false"/>
<field name="serviceStatutaire" type="float" column="SERVICE_STATUTAIRE" precision="126" scale="0" nullable="false"/> <field name="serviceStatutaire" type="float" column="SERVICE_STATUTAIRE" precision="126" scale="0" nullable="false"/>
<field name="plafondReferentiel" type="float" column="PLAFOND_REFERENTIEL" precision="126" scale="0" nullable="false"/> <field name="plafondReferentiel" type="float" column="PLAFOND_REFERENTIEL" precision="126" scale="0" nullable="false"/>
<field name="plafondReferentielService" type="float" column="PLAFOND_REFERENTIEL_SERVICE" precision="126" scale="0" nullable="false"/>
<field name="plafondReferentielHc" type="float" column="PLAFOND_REFERENTIEL_HC" precision="126" scale="0" nullable="false"/>
<field name="plafondHcHorsRemuFc" type="float" column="PLAFOND_HC_HORS_REMU_FC" precision="126" scale="0" nullable="false"/> <field name="plafondHcHorsRemuFc" type="float" column="PLAFOND_HC_HORS_REMU_FC" precision="126" scale="0" nullable="false"/>
<field name="plafondHcRemuFc" type="float" column="PLAFOND_HC_REMU_FC" precision="126" scale="0" nullable="false"/> <field name="plafondHcRemuFc" type="float" column="PLAFOND_HC_REMU_FC" precision="126" scale="0" nullable="false"/>
<field name="plafondHcFiHorsEad" type="float" column="PLAFOND_HC_FI_HORS_EAD" precision="126" scale="0" nullable="false"/> <field name="plafondHcFiHorsEad" type="float" column="PLAFOND_HC_FI_HORS_EAD" precision="126" scale="0" nullable="false"/>
......
...@@ -20,7 +20,6 @@ class StatutIntervenant implements HistoriqueAwareInterface, RoleInterface ...@@ -20,7 +20,6 @@ class StatutIntervenant implements HistoriqueAwareInterface, RoleInterface
protected $code; protected $code;
/** /**
* *
* @return string * @return string
...@@ -76,6 +75,16 @@ class StatutIntervenant implements HistoriqueAwareInterface, RoleInterface ...@@ -76,6 +75,16 @@ class StatutIntervenant implements HistoriqueAwareInterface, RoleInterface
*/ */
protected $plafondReferentiel; protected $plafondReferentiel;
/**
* @var float
*/
protected $plafondReferentielService = 9999;
/**
* @var float
*/
protected $plafondReferentielHc = 9999;
/** /**
* @var float * @var float
*/ */
...@@ -657,6 +666,54 @@ class StatutIntervenant implements HistoriqueAwareInterface, RoleInterface ...@@ -657,6 +666,54 @@ class StatutIntervenant implements HistoriqueAwareInterface, RoleInterface
/**
* @return float
*/
public function getPlafondReferentielService(): float
{
return $this->plafondReferentielService;
}
/**
* @param float $plafondReferentielService
*
* @return StatutIntervenant
*/
public function setPlafondReferentielService(float $plafondReferentielService): StatutIntervenant
{
$this->plafondReferentielService = $plafondReferentielService;
return $this;
}
/**
* @return float
*/
public function getPlafondReferentielHc(): float
{
return $this->plafondReferentielHc;
}
/**
* @param float $plafondReferentielHc
*
* @return StatutIntervenant
*/
public function setPlafondReferentielHc(float $plafondReferentielHc): StatutIntervenant
{
$this->plafondReferentielHc = $plafondReferentielHc;
return $this;
}
/** /**
* Set maximumHETD * Set maximumHETD
* *
......
...@@ -23,7 +23,6 @@ class ModifierTypePieceJointeStatutForm extends AbstractForm ...@@ -23,7 +23,6 @@ class ModifierTypePieceJointeStatutForm extends AbstractForm
use TypePieceJointeStatutServiceAwareTrait; use TypePieceJointeStatutServiceAwareTrait;
public function init() public function init()
{ {
$hydrator = new TypePieceJointeStatutHydrator(); $hydrator = new TypePieceJointeStatutHydrator();
...@@ -103,6 +102,8 @@ class ModifierTypePieceJointeStatutForm extends AbstractForm ...@@ -103,6 +102,8 @@ class ModifierTypePieceJointeStatutForm extends AbstractForm
'attributes' => [ 'attributes' => [
'min' => '1', 'min' => '1',
'value' => '1', 'value' => '1',
'class' => 'form-control',
'info_icon' => "Si vous avez coché 'Uniquement en cas de changement de RIB', la durée de vie sera automatiquement à 1",
], ],
]); ]);
...@@ -245,7 +246,6 @@ class TypePieceJointeStatutHydrator implements HydratorInterface ...@@ -245,7 +246,6 @@ class TypePieceJointeStatutHydrator implements HydratorInterface
use AnneeServiceAwareTrait; use AnneeServiceAwareTrait;
/** /**
* Hydrate $object with the provided $data. * Hydrate $object with the provided $data.
* *
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment