diff --git a/data/Sql/Indexes.sql b/data/Sql/Indexes.sql new file mode 100644 index 0000000000000000000000000000000000000000..5e3b47329e5b04023aaa9a1740fb12de1d002441 --- /dev/null +++ b/data/Sql/Indexes.sql @@ -0,0 +1,60 @@ +SELECT + i.* +FROM + all_indexes i + LEFT JOIN all_constraints c ON c.index_name = i.index_name +WHERE + i.owner='OSE' + AND c.constraint_name IS NULL; + + + +-- enlever _IDX des indexes +select + +'ALTER INDEX ' || index_name || ' RENAME TO ' || new_index_name || ';' isql + +from ( +SELECT + index_name, substr( index_name, 1, length(index_name)-4 ) new_index_name +FROM + all_indexes i +WHERE + owner='OSE' + AND substr( index_name, -3 ) = 'IDX') t1; + + + +-- création d'indexes manquants +SELECT + + 'CREATE' || un || ' INDEX ' || constraint_name || ' ON ' || table_name || ' (' || cols || ') LOGGING;' isql + +FROM ( + SELECT + c.constraint_name, + c.constraint_type, + c.table_name, + c.r_constraint_name, + c.index_name, + ose_divers.implode('SELECT column_name FROM all_cons_columns WHERE owner=''OSE'' AND constraint_name=q''[' || c.constraint_name || ']''', ' ASC,') || ' ASC' cols, + CASE WHEN c.constraint_type IN ('P','U') THEN ' UNIQUE' ELSE '' END un + FROM + all_constraints c + LEFT JOIN all_indexes i ON i.index_name = c.constraint_name + WHERE + c.owner = 'OSE' + AND c.constraint_type IN ('P', 'U', 'R') + AND c.table_name NOT LIKE 'BIN$%' + AND c.index_name IS NULL AND i.index_name IS NULL +) t1; + +SELECT * FROM all_tables where owner = 'OSE'; +select * from all_views where owner='OSE'; + + select * from SYS.all_cons_columns; + +-- CREATE INDEX INTERVENANT_HDFK_IDX ON INTERVENANT (HISTO_DESTRUCTEUR_ID ASC) TABLESPACE OSE_TS LOGGING; +-- CREATE UNIQUE INDEX INTERVENANT_SOURCE__UN ON INTERVENANT ( SOURCE_CODE ASC, ANNEE_ID ASC ) LOGGING; + +--SUBSTR(constraint_name,0,26) \ No newline at end of file diff --git a/data/Sql/Pieces justificatives.sql b/data/Sql/Pieces justificatives.sql index 8376fb33f80b5d7ea35a3c9e738edf52530ef96d..ccd02c4b6387d7ff2923c6872f1d91934df26354 100644 --- a/data/Sql/Pieces justificatives.sql +++ b/data/Sql/Pieces justificatives.sql @@ -9,23 +9,40 @@ *******************************************************************************************************/ -select +SELECT + i.prenom || ' ' || i.nom_usuel i_nom, + i.annee_id annee, + pj.histo_creation creation, + --tpj.code, + tpj.libelle, pj.obligatoire, pj.force, + CASE + WHEN f.id IS NULL THEN 'non fourni' + WHEN f.histo_destruction IS NOT NULL THEN 'histo ' || to_char(f.histo_destruction,'dd/mm/yyyy') + ELSE 'fourni le ' || to_char(v.histo_creation,'dd/mm/yyyy') + END fichier, + CASE + WHEN v.id IS NULL THEN 'non validée' + WHEN v.histo_destruction IS NOT NULL THEN 'histo ' || to_char(v.histo_destruction,'dd/mm/yyyy') + ELSE 'validée le ' || to_char(v.histo_creation,'dd/mm/yyyy') + END validation, + + pj.histo_destruction pj_del, i.id i_id, d.id d_id, pj.id pj_id, - pj.histo_destruction pj_del, - i.prenom || ' ' || i.nom_usuel i_nom, - i.annee_id annee, - tpj.code, tpj.libelle, pj.obligatoire, pj.force -from + f.id f_id, + v.id v_id +FROM piece_jointe pj JOIN dossier d ON d.id = pj.dossier_id AND 1 = ose_divers.comprise_entre( d.histo_creation, d.histo_destruction ) JOIN intervenant i ON i.id = d.intervenant_id AND 1 = ose_divers.comprise_entre( i.histo_creation, i.histo_destruction ) JOIN type_piece_jointe tpj ON tpj.id = pj.TYPE_PIECE_JOINTE_ID AND 1 = ose_divers.comprise_entre( tpj.histo_creation, tpj.histo_destruction ) -where - - - i.source_code = 87944; + LEFT JOIN piece_jointe_fichier pjf ON pjf.piece_jointe_id = pj.id + LEFT JOIN fichier f ON f.id = pjf.fichier_id + LEFT JOIN validation v ON v.id = pj.validation_id +WHERE + + i.id = 5573; SELECT * FROM intervenant WHERE source_code = '20259'; diff --git "a/data/Sql/R\303\264les.sql" "b/data/Sql/R\303\264les.sql" index 9626dfd8e3bd5f8790843d14ec9781cdea8e6803..f59ee7fa026566185b0cb3e4f8f7f9cf5a7a68f2 100755 --- "a/data/Sql/R\303\264les.sql" +++ "b/data/Sql/R\303\264les.sql" @@ -16,7 +16,8 @@ from LEFT JOIN structure s ON s.id = a.structure_id AND s.histo_destruction IS NULL WHERE a.histo_destruction IS NULL - AND s.source_code IN ('12') + AND p.id = 219 + --AND s.source_code IN ('12') --AND src.code = 'OSE' ORDER BY structure, nom, source, role; diff --git a/data/Sql/contrat.sql b/data/Sql/contrat.sql new file mode 100644 index 0000000000000000000000000000000000000000..9508d300b2a3f35ef39520c62af37f5297c6c2b7 --- /dev/null +++ b/data/Sql/contrat.sql @@ -0,0 +1,12 @@ +SELECT + c.id c_id, + c.histo_creation, + i.prenom || ' ' || i.nom_usuel intervenant, + s.libelle_court structure +FROM + contrat c + JOIN intervenant i ON i.id = c.intervenant_id + JOIN type_contrat tc ON tc.id = c.type_contrat_id + JOIN structure s ON s.id = c.structure_id +WHERE + i.id = 4554; \ No newline at end of file diff --git a/data/Sql/dossier.sql b/data/Sql/dossier.sql new file mode 100644 index 0000000000000000000000000000000000000000..71f90e7189fbe203ebf59e4c6da737d4010caaad --- /dev/null +++ b/data/Sql/dossier.sql @@ -0,0 +1,19 @@ +SELECT + i.id i_id, + i.nom_usuel || ' ' || i.prenom i_nom, + imd.* +FROM + indic_modif_dossier imd + JOIN intervenant i ON i.id = imd.intervenant_id +WHERE + i.id = 4554; + + +SELECT + * +FROM + dossier d +WHERE + d.intervenant_id = 4554; + + diff --git a/data/Sql/v2.sql b/data/Sql/v2.sql new file mode 100644 index 0000000000000000000000000000000000000000..3a7ac3602d18bacf6e96a79dd429618ea50d3466 --- /dev/null +++ b/data/Sql/v2.sql @@ -0,0 +1,186 @@ +-- ********************************************************************* -- +-- * à faire AVANT avoir mis à jour le code source * -- +-- ********************************************************************* -- + +BEGIN DBMS_SCHEDULER.disable(name=>'"OSE"."OSE_SRC_SYNC"', force => TRUE); END; +/ + + +CREATE INDEX "OSE"."AII_FK_IDX" ON "OSE"."ADRESSE_INTERVENANT" ("INTERVENANT_ID"); + +DROP MATERIALIZED VIEW "OSE"."MV_CENTRE_COUT"; +CREATE MATERIALIZED VIEW "OSE"."MV_CENTRE_COUT" ("LIBELLE","Z_ACTIVITE_ID","Z_TYPE_RESSOURCE_ID","Z_PARENT_ID","Z_STRUCTURE_ID","SOURCE_ID","SOURCE_CODE") + BUILD IMMEDIATE + USING INDEX REFRESH FORCE ON DEMAND + USING DEFAULT LOCAL ROLLBACK SEGMENT USING ENFORCED CONSTRAINTS + DISABLE QUERY REWRITE AS + SELECT DISTINCT + TRIM(B.ktext) libelle, + CASE + WHEN a.kostl like '%A' THEN 'accueil' -- Activité (au sens compta analytique) ne devant pas permettre la saisie de référentiel + WHEN a.kostl like '%B' THEN 'enseignement' + WHEN a.kostl like '%M' THEN 'pilotage' + END z_activite_id, + CASE + WHEN LENGTH(a.kostl) = 5 THEN 'paye-etat' + WHEN LENGTH(a.kostl) > 5 THEN 'ressources-propres' + END z_type_ressource_id, + NULL z_parent_id, + CASE WHEN A.kostl = 'P950DRRA' THEN 'ECODOCT' ELSE STR.CODE_HARPEGE END z_structure_id, + s.id source_id, + A.kostl source_code + +FROM + sapsr3.csks@sifacp A, + sapsr3.cskt@sifacp B, + unicaen_corresp_structure_cc str, + source s +WHERE + s.code = 'SIFAC' + and A.kostl=B.kostl(+) + and A.kokrs=B.kokrs(+) + and substr( a.kostl, 2, 3 ) = str.code_sifac(+) + and B.mandt(+)='500' + and B.spras(+)='F' + and A.kokrs='UCBN' + and A.bkzkp !='X' + and a.kostl LIKE 'P%' AND (a.kostl like '%A' OR a.kostl like '%B' OR a.kostl like '%M') + AND SYSDATE BETWEEN to_date( NVL(A.datab,'10661231'), 'YYYYMMDD') AND to_date( NVL(A.datbi,'99991231'), 'YYYYMMDD') + AND STR.CODE_HARPEGE IS NOT NULL -- à désactiver pour trouver les structures non référencées dans la table de correspondance + +UNION + +SELECT + TRIM(A.post1) libelle, + CASE + WHEN a.kostl like '%A' THEN 'accueil' + WHEN a.fkstl like '%B' THEN 'enseignement' + WHEN a.fkstl like '%M' THEN 'pilotage' + END z_activite_id, + CASE + WHEN LENGTH(a.fkstl) = 5 THEN 'paye-etat' + WHEN LENGTH(a.fkstl) > 5 THEN 'ressources-propres' + END z_type_ressource_id, + A.fkstl z_parent_id, + CASE WHEN A.posid = 'P950DRRA' THEN 'ECODOCT' ELSE STR.CODE_HARPEGE END z_structure_id, + s.id source_id, + A.posid source_code +FROM + sapsr3.prps@sifacp A, + sapsr3.prte@sifacp B, + unicaen_corresp_structure_cc str, + source s +WHERE + s.code = 'SIFAC' + and A.pspnr=B.posnr(+) + and substr( A.fkstl, 2, 3 ) = str.code_sifac(+) + and A.pkokr='UCBN' + and B.mandt(+)='500' + and a.fkstl LIKE 'P%' AND (a.fkstl like '%A' OR a.kostl like '%B' OR a.fkstl like '%M') + AND SYSDATE BETWEEN to_date( NVL(B.pstrt,'10661231'), 'YYYYMMDD') AND to_date( NVL(B.pende,'99991231'), 'YYYYMMDD') + AND STR.CODE_HARPEGE IS NOT NULL; + +CREATE OR REPLACE FORCE VIEW "OSE"."V_ELEMENT_TYPE_MODULATEUR" + ( "ELEMENT_PEDAGOGIQUE_ID", "TYPE_MODULATEUR_ID" + ) AS + SELECT + ep.id element_pedagogique_id, + tms.type_modulateur_id type_modulateur_id +FROM + element_pedagogique ep + JOIN structure s ON s.id = ep.structure_id + AND ose_divers.comprise_entre( s.histo_creation, s.histo_destruction ) = 1 + + JOIN type_modulateur_structure tms ON tms.structure_id = s.id + AND ose_divers.comprise_entre( tms.histo_creation, tms.histo_destruction ) = 1 + AND ep.annee_id BETWEEN GREATEST(NVL(tms.annee_debut_id,0),ep.annee_id) AND LEAST(NVL(tms.annee_fin_id,9999),ep.annee_id) + +UNION + +SELECT + tm_ep.element_pedagogique_id element_pedagogique_id, + tm_ep.type_modulateur_id type_modulateur_id +FROM + type_modulateur_ep tm_ep +WHERE + ose_divers.comprise_entre( tm_ep.histo_creation, tm_ep.histo_destruction ) = 1; + +CREATE OR REPLACE FORCE VIEW "OSE"."V_ELEMENT_TYPE_INTERVENTION" + ( "ELEMENT_PEDAGOGIQUE_ID", "TYPE_INTERVENTION_ID" + ) AS + SELECT + ep.id element_pedagogique_id, + ti.id type_intervention_id +FROM + element_pedagogique ep + JOIN structure s_ep ON s_ep.id = ep.structure_id + JOIN type_intervention ti ON 1=1 + + LEFT JOIN type_intervention_ep ti_ep ON ti_ep.element_pedagogique_id = ep.id + AND ti_ep.type_intervention_id = ti.id + AND 1 = ose_divers.comprise_entre( ti_ep.histo_creation, ti_ep.histo_destruction ) + + LEFT JOIN type_intervention_structure ti_s ON s_ep.structure_niv2_id = ti_s.structure_id + AND ti_s.type_intervention_id = ti.id + AND 1 = ose_divers.comprise_entre( ti_s.histo_creation, ti_s.histo_destruction ) + AND ep.annee_id BETWEEN GREATEST(NVL(ti_s.annee_debut_id,0),ep.annee_id) AND LEAST(NVL(ti_s.annee_fin_id,9999),ep.annee_id) +WHERE + CASE + WHEN TI_EP.VISIBLE IS NULL THEN + CASE + WHEN TI_S.VISIBLE IS NULL THEN TI.VISIBLE + ELSE TI_S.VISIBLE + END + ELSE TI_EP.VISIBLE + END = 1 +ORDER BY + TI.ORDRE; + + +ALTER TABLE "OSE"."TYPE_MODULATEUR_STRUCTURE" ADD ("ANNEE_DEBUT_ID" NUMBER(*,0)); +ALTER TABLE "OSE"."TYPE_MODULATEUR_STRUCTURE" ADD ("ANNEE_FIN_ID" NUMBER(*,0)); +ALTER TABLE "OSE"."TYPE_MODULATEUR_STRUCTURE" ADD CONSTRAINT "TMS_ANNEE_DEBUT_FK" FOREIGN KEY ("ANNEE_DEBUT_ID") REFERENCES "OSE"."ANNEE"("ID") ENABLE; +ALTER TABLE "OSE"."TYPE_MODULATEUR_STRUCTURE" ADD CONSTRAINT "TMS_ANNEE_FIN_FK" FOREIGN KEY ("ANNEE_FIN_ID") REFERENCES "OSE"."ANNEE"("ID") ENABLE; + +ALTER TABLE "OSE"."TYPE_INTERVENTION_STRUCTURE" ADD ("ANNEE_DEBUT_ID" NUMBER(*,0)); +ALTER TABLE "OSE"."TYPE_INTERVENTION_STRUCTURE" ADD ("ANNEE_FIN_ID" NUMBER(*,0)); +ALTER TABLE "OSE"."TYPE_INTERVENTION_STRUCTURE" ADD CONSTRAINT "TIS_ANNEE_DEBUT_FK" FOREIGN KEY ("ANNEE_DEBUT_ID") REFERENCES "OSE"."ANNEE"("ID") ENABLE; +ALTER TABLE "OSE"."TYPE_INTERVENTION_STRUCTURE" ADD CONSTRAINT "TIS_ANNEE_FIN_FK" FOREIGN KEY ("ANNEE_FIN_ID") REFERENCES "OSE"."ANNEE"("ID") ENABLE; + +ALTER TABLE "OSE"."INTERVENANT" ADD ("MONTANT_INDEMNITE_FC" FLOAT(126)); + + +UPDATE "OSE"."TYPE_INTERVENTION_STRUCTURE" SET ANNEE_FIN_ID = 2014 WHERE type_intervention_id = 10; + +INSERT INTO CC_ACTIVITE ( + ID, + CODE, + LIBELLE, + FI, + FA, + FC, + FC_MAJOREES, + REFERENTIEL, + HISTO_CREATION, HISTO_CREATEUR_ID, + HISTO_MODIFICATION, HISTO_MODIFICATEUR_ID +) VALUES ( + CC_ACTIVITE_id_seq.nextval, + 'accueil', + 'Accueil', + 1, + 1, + 1, + 1, + 0, + sysdate, (select id from utilisateur where username='lecluse'), + sysdate, (select id from utilisateur where username='lecluse') +); + +-- ********************************************************************* -- +-- * à faire APRÈS avoir mis à jour le code source * -- +-- ********************************************************************* -- + +BEGIN DBMS_SCHEDULER.enable(name=>'"OSE"."OSE_SRC_SYNC"'); END; +/ +BEGIN OSE_FORMULE.CALCULER_TOUT; END; +/ \ No newline at end of file diff --git a/module/Application/config/intervenant.config.php b/module/Application/config/intervenant.config.php index 6776b4bd1c675c9ff9db04c6e29aef529d509a41..2842fc0990118547237acf1a0e1b27b2620a3d1a 100644 --- a/module/Application/config/intervenant.config.php +++ b/module/Application/config/intervenant.config.php @@ -19,7 +19,7 @@ return [ ], 'may_terminate' => true, 'child_routes' => [ - 'default' => [ + /*'default' => [ 'type' => 'Segment', 'options' => [ 'route' => '/:action[/:intervenant]', @@ -31,19 +31,25 @@ return [ 'action' => 'index', ], ], - ], + ],*/ 'rechercher' => [ - 'type' => 'Segment', + 'type' => 'Literal', 'options' => [ - 'route' => '/rechercher[/:intervenant]', - 'constraints' => [ - 'intervenant' => '[0-9]*', - ], + 'route' => '/rechercher', 'defaults' => [ 'action' => 'rechercher', ], ], ], + 'recherche' => [ + 'type' => 'Literal', + 'options' => [ + 'route' => '/recherche', + 'defaults' => [ + 'action' => 'recherche', + ], + ], + ], 'fiche' => [ 'type' => 'Segment', 'options' => [ @@ -470,7 +476,7 @@ return [ ], 'bjyauthorize' => [ 'guards' => [ - 'Application\Guard\PrivilegeController' => [ + Guard\PrivilegeController::class => [ [ 'controller' => 'Application\Controller\Intervenant', 'action' => ['rechercher'], @@ -505,7 +511,7 @@ return [ [ 'controller' => 'Application\Controller\Intervenant', 'action' => ['formule-totaux-hetd'], - 'roles' => $R_ALL, /** @todo à sécuriser à l'aide d'une assertion pour éviter qu'un intervenant ne puisse voir les HETD des autres */ + 'roles' => $R_ALL, 'assertion' => 'IntervenantAssertion', ], [ @@ -520,7 +526,7 @@ return [ ], [ 'controller' => 'Application\Controller\Intervenant', - 'action' => ['choisir', 'rechercher', 'search'], + 'action' => ['choisir', 'rechercher', 'recherche'], 'roles' => [R_COMPOSANTE, R_ADMINISTRATEUR], ], [ @@ -536,7 +542,7 @@ return [ ], ], 'rule_providers' => [ - 'Application\Provider\Rule\PrivilegeRuleProvider' => [ + Provider\Rule\PrivilegeRuleProvider::class => [ 'allow' => [ [ 'privileges' => Privilege::MODIF_SERVICE_DU_EDITION, @@ -545,7 +551,7 @@ return [ ], ], ], - 'BjyAuthorize\Provider\Rule\Config' => [ + 'BjyAuthorize\Provider\Rule\Config' => [ 'allow' => [ [ $R_ALL, @@ -560,9 +566,9 @@ return [ ], 'controllers' => [ 'invokables' => [ - 'Application\Controller\Intervenant' => 'Application\Controller\IntervenantController', - 'Application\Controller\Dossier' => 'Application\Controller\DossierController', - 'Application\Controller\ModificationServiceDu' => 'Application\Controller\ModificationServiceDuController', + 'Application\Controller\Intervenant' => Controller\IntervenantController::class, + 'Application\Controller\Dossier' => Controller\DossierController::class, + 'Application\Controller\ModificationServiceDu' => Controller\ModificationServiceDuController::class, ], 'aliases' => [ 'IntervenantController' => 'Application\Controller\Intervenant', @@ -570,41 +576,42 @@ return [ ], 'service_manager' => [ 'invokables' => [ - 'ApplicationIntervenant' => 'Application\\Service\\Intervenant', - 'ApplicationMotifModificationServiceDu' => 'Application\\Service\\MotifModificationServiceDu', - 'ApplicationCivilite' => 'Application\\Service\\Civilite', - 'ApplicationStatutIntervenant' => 'Application\\Service\\StatutIntervenant', - 'ApplicationTypeIntervenant' => 'Application\\Service\\TypeIntervenant', - 'ApplicationDossier' => 'Application\\Service\\Dossier', - 'IntervenantAssertion' => 'Application\\Assertion\\IntervenantAssertion', - 'ModificationServiceDuAssertion' => 'Application\\Assertion\\ModificationServiceDuAssertion', - 'PeutSaisirDossierRule' => 'Application\Rule\Intervenant\PeutSaisirDossierRule', - 'PeutSaisirServiceRule' => 'Application\Rule\Intervenant\PeutSaisirServiceRule', - 'PeutSaisirReferentielRule' => 'Application\Rule\Intervenant\PeutSaisirReferentielRule', - 'PossedeDossierRule' => 'Application\Rule\Intervenant\PossedeDossierRule', - 'ServiceValideRule' => 'Application\Rule\Intervenant\ServiceValideRule', - 'PeutValiderServiceRule' => 'Application\Rule\Intervenant\PeutValiderServiceRule', - 'ReferentielValideRule' => 'Application\Rule\Intervenant\ReferentielValideRule', - 'NecessiteAgrementRule' => 'Application\Rule\Intervenant\NecessiteAgrementRule', - 'AgrementFourniRule' => 'Application\Rule\Intervenant\AgrementFourniRule', - 'EstAffecteRule' => 'Application\Rule\Intervenant\EstAffecteRule', + 'ApplicationIntervenant' => Service\Intervenant::class, + 'ApplicationMotifModificationServiceDu' => Service\MotifModificationServiceDu::class, + 'ApplicationCivilite' => Service\Civilite::class, + 'ApplicationStatutIntervenant' => Service\StatutIntervenant::class, + 'ApplicationTypeIntervenant' => Service\TypeIntervenant::class, + 'ApplicationDossier' => Service\Dossier::class, + 'IntervenantAssertion' => Assertion\IntervenantAssertion::class, + 'ModificationServiceDuAssertion' => Assertion\ModificationServiceDuAssertion::class, + 'PeutSaisirDossierRule' => Rule\Intervenant\PeutSaisirDossierRule::class, + 'PeutSaisirServiceRule' => Rule\Intervenant\PeutSaisirServiceRule::class, + 'PeutSaisirReferentielRule' => Rule\Intervenant\PeutSaisirReferentielRule::class, + 'PossedeDossierRule' => Rule\Intervenant\PossedeDossierRule::class, + 'ServiceValideRule' => Rule\Intervenant\ServiceValideRule::class, + 'PeutValiderServiceRule' => Rule\Intervenant\PeutValiderServiceRule::class, + 'ReferentielValideRule' => Rule\Intervenant\ReferentielValideRule::class, + 'NecessiteAgrementRule' => Rule\Intervenant\NecessiteAgrementRule::class, + 'AgrementFourniRule' => Rule\Intervenant\AgrementFourniRule::class, + 'EstAffecteRule' => Rule\Intervenant\EstAffecteRule::class, ], ], 'view_helpers' => [ 'invokables' => [ - 'formuleTotauxHetd' => 'Application\View\Helper\Intervenant\TotauxHetdViewHelper', - 'Intervenant' => 'Application\View\Helper\Intervenant\IntervenantViewHelper', + 'formuleTotauxHetd' => View\Helper\Intervenant\TotauxHetdViewHelper::class, + 'Intervenant' => View\Helper\Intervenant\IntervenantViewHelper::class, ], 'initializers' => [ ], ], 'form_elements' => [ 'invokables' => [ - 'IntervenantDossier' => 'Application\Form\Intervenant\Dossier', - 'IntervenantHeuresCompForm' => 'Application\Form\Intervenant\HeuresCompForm', - 'IntervenantModificationServiceDuForm' => 'Application\Form\Intervenant\ModificationServiceDuForm', - 'IntervenantModificationServiceDuFieldset' => 'Application\Form\Intervenant\ModificationServiceDuFieldset', - 'IntervenantMotifModificationServiceDuFieldset' => 'Application\Form\Intervenant\MotifModificationServiceDuFieldset', + 'intervenantForm' => Form\Intervenant\IntervenantForm::class, + 'IntervenantDossier' => Form\Intervenant\Dossier::class, + 'IntervenantHeuresCompForm' => Form\Intervenant\HeuresCompForm::class, + 'IntervenantModificationServiceDuForm' => Form\Intervenant\ModificationServiceDuForm::class, + 'IntervenantModificationServiceDuFieldset' => Form\Intervenant\ModificationServiceDuFieldset::class, + 'IntervenantMotifModificationServiceDuFieldset' => Form\Intervenant\MotifModificationServiceDuFieldset::class, ], ], ]; diff --git a/module/Application/src/Application/Acl/Role.php b/module/Application/src/Application/Acl/Role.php index ab99f609858f2d96a42b9ca48c59446cf4c17438..b2f0b0808da5c65d02aef3c1d93d37c470f51068 100644 --- a/module/Application/src/Application/Acl/Role.php +++ b/module/Application/src/Application/Acl/Role.php @@ -24,7 +24,7 @@ class Role extends NamedRole - public function __construct($id = self::ROLE_ID, $parent = 'user', $name = 'Rôle', $description = null, $selectable = true) + public function __construct($id = self::ROLE_ID, $parent = 'user', $name = 'Rôle inconnu', $description = null, $selectable = true) { parent::__construct($id, $parent, $name, $description, $selectable); } diff --git a/module/Application/src/Application/Controller/IntervenantController.php b/module/Application/src/Application/Controller/IntervenantController.php index 6005a5000e9f19069f94116231cb55a1a2a5ce32..e9f7b44087a28b437cc6476946f13f14bdc19beb 100644 --- a/module/Application/src/Application/Controller/IntervenantController.php +++ b/module/Application/src/Application/Controller/IntervenantController.php @@ -2,11 +2,16 @@ namespace Application\Controller; +use Application\Form\Intervenant\Traits\HeuresCompFormAwareTrait; +use Application\Traits\SessionContainerTrait; use Zend\Mvc\Controller\AbstractActionController; use Common\Exception\LogicException; use Application\Entity\Db\Intervenant; use Application\Service\Workflow\WorkflowIntervenantAwareInterface; use Application\Service\Workflow\WorkflowIntervenantAwareTrait; +use Application\Service\Traits\ContextAwareTrait; +use Application\Service\Traits\IntervenantAwareTrait; +use Application\Service\Traits\TypeHeuresAwareTrait; /** * Description of IntervenantController @@ -14,170 +19,109 @@ use Application\Service\Workflow\WorkflowIntervenantAwareTrait; * @method \Doctrine\ORM\EntityManager em() * @method \Application\Controller\Plugin\Context context() * - * @author Bertrand GAUTHIER <bertrand.gauthier at unicaen.fr> */ class IntervenantController extends AbstractActionController implements WorkflowIntervenantAwareInterface { - use WorkflowIntervenantAwareTrait, - \Application\Service\Traits\ContextAwareTrait, - \Application\Service\Traits\IntervenantAwareTrait, - \Application\Service\Traits\TypeHeuresAwareTrait - ; + use WorkflowIntervenantAwareTrait; + use ContextAwareTrait; + use IntervenantAwareTrait; + use TypeHeuresAwareTrait; + use HeuresCompFormAwareTrait; + use SessionContainerTrait; + + + - /** - * @var Intervenant - */ - private $intervenant; - /** - * - * @return \Zend\View\Model\ViewModel - */ public function indexAction() { $role = $this->getServiceContext()->getSelectedIdentityRole(); - if ($role instanceof \Application\Acl\IntervenantRole) { + if ($intervenant = $role->getIntervenant()) { // redirection selon le workflow - $intervenant = $role->getIntervenant(); $wf = $this->getWorkflowIntervenant()->setIntervenant($intervenant); $url = $wf->getCurrentStepUrl(); if (!$url) { $url = $wf->getStepUrl($wf->getLastStep()); } + return $this->redirect()->toUrl($url); } return $this->redirect()->toRoute('intervenant/rechercher'); } + + public function rechercherAction() { - $view = $this->choisirAction(); + $recents = $this->getIntervenantsRecents(); + return compact('recents'); + } - if ($this->intervenant) { - $this->addIntervenantChoisiRecent($this->intervenant); - return $this->redirect()->toRoute('intervenant/fiche', ['intervenant' => $this->intervenant->getSourceCode()]); - } - $view->setTemplate('application/intervenant/choisir'); - return $view; - } - - /** - * - * @return \Zend\View\Model\ViewModel - */ - public function choisirAction() + public function rechercheAction() { - $intervenant = $this->context()->intervenantFromQuery(); - - $url = $this->url()->fromRoute('recherche', ['action' => 'intervenantFind']); - $interv = new \UnicaenApp\Form\Element\SearchAndSelect('interv'); - $interv->setAutocompleteSource($url) - ->setRequired(true) - ->setSelectionRequired(true) - ->setLabel("Recherchez l'intervenant concerné :") - ->setAttributes(['title' => "Saisissez le nom suivi éventuellement du prénom (2 lettres au moins)"]); - if ($intervenant) { - $f = new \Common\Filter\IntervenantTrouveFormatter(); - $interv->setValue($f->filter($intervenant)); - } - $form = new \Zend\Form\Form('search'); - $form->setAttributes([ - 'action' => $this->getRequest()->getRequestUri(), - 'class' => 'intervenant-rech']); - $form->add($interv); - - if ($this->getRequest()->isPost()) { - $data = $this->getRequest()->getPost(); - $form->setData($data); - if ($form->isValid()) { - $sourceCode = $form->get('interv')->getValueId(); - $this->getRequest()->getQuery()->set('sourceCode', $sourceCode); - $this->intervenant = $this->importerAction()->getVariable('intervenant'); - if (($redirect = $this->params()->fromQuery('redirect'))) { - $redirect = str_replace('__sourceCode__', $sourceCode, $redirect); - return $this->redirect()->toUrl($redirect); - } - } - } + $this->em()->getFilters()->enable('historique')->init([ + Intervenant::class, + ]); - $viewModel = new \Zend\View\Model\ViewModel(); - $viewModel - ->setTemplate('application/intervenant/choisir') - ->setVariables([ - 'form' => $form, - 'title' => "Rechercher un intervenant", - 'recents' => $this->getIntervenantsChoisisRecents()]); + $critere = $this->params()->fromPost('critere'); + $intervenants = $this->getServiceIntervenant()->recherche($critere, 21); - return $viewModel; + return compact('intervenants'); } - public function importerAction() - { - if (!($sourceCode = $this->params()->fromQuery('sourceCode', $this->params()->fromPost('sourceCode')))) { - throw new LogicException("Aucun code source d'intervenant spécifié."); - } - - $intervenant = $this->getServiceIntervenant()->importer($sourceCode); - $view = new \Zend\View\Model\ViewModel(); - $view->setVariables(['intervenant' => $intervenant]); - return $view; - } public function voirAction() { - $role = $this->getServiceContext()->getSelectedIdentityRole(); + $role = $this->getServiceContext()->getSelectedIdentityRole(); + $intervenant = $role->getIntervenant() ?: $this->getEvent()->getParam('intervenant'); - if ($role instanceof \Application\Acl\IntervenantRole) { - $intervenant = $role->getIntervenant(); - } else { - $intervenant = $this->getEvent()->getParam('intervenant'); + if (! $intervenant){ + throw new \LogicException('Intervenant introuvable'); } - $view = new \Zend\View\Model\ViewModel(); - $view->setVariables(compact('intervenant', 'role')); + $this->addIntervenantRecent($intervenant); - return $view; + return compact('intervenant', 'role'); } + + public function apercevoirAction() { - $intervenant = $this->context()->mandatory()->intervenantFromRoute(); + $role = $this->getServiceContext()->getSelectedIdentityRole(); + $intervenant = $role->getIntervenant() ?: $this->getEvent()->getParam('intervenant'); + $title = "Aperçu d'un intervenant"; - $import = $this->getServiceLocator()->get('ImportProcessusImport'); - $changements = $import->intervenantGetDifferentiel($intervenant); - $title = "Aperçu d'un intervenant"; - $short = $this->params()->fromQuery('short', false); - - $view = new \Zend\View\Model\ViewModel(); - $view->setVariables(compact('intervenant', 'changements', 'title', 'short')); - return $view; + return compact('intervenant', 'title'); } + + public function voirHeuresCompAction() { $this->em()->getFilters()->enable('historique')->init([ - 'Application\Entity\Db\Service', - 'Application\Entity\Db\VolumeHoraire' + \Application\Entity\Db\Service::class, + \Application\Entity\Db\VolumeHoraire::class, ]); - $intervenant = $this->context()->mandatory()->intervenantFromRoute(); + $intervenant = $this->getEvent()->getParam('intervenant'); /* @var $intervenant \Application\Entity\Db\Intervenant */ - $form = $this->getFormHeuresComp(); + $form = $this->getFormIntervenantHeuresComp(); $typeVolumeHoraire = $this->context()->typeVolumeHoraireFromQuery('type-volume-horaire', $form->get('type-volume-horaire')->getValue()); /* @var $typeVolumeHoraire \Application\Entity\Db\TypeVolumeHoraire */ - if (! isset($typeVolumeHoraire)){ + if (!isset($typeVolumeHoraire)) { throw new LogicException('Type de volume horaire erroné'); } $etatVolumeHoraire = $this->context()->etatVolumeHoraireFromQuery('etat-volume-horaire', $form->get('etat-volume-horaire')->getValue()); /* @var $etatVolumeHoraire \Application\Entity\Db\EtatVolumeHoraire */ - if (! isset($etatVolumeHoraire)){ + if (!isset($etatVolumeHoraire)) { throw new LogicException('Etat de volume horaire erroné'); } @@ -202,134 +146,148 @@ class IntervenantController extends AbstractActionController implements Workflow ]; $referentiels = $intervenant->getFormuleIntervenant()->getFormuleServiceReferentiel(); - foreach( $referentiels as $referentiel ){ + foreach ($referentiels as $referentiel) { /* @var $referentiel \Application\Entity\Db\FormuleServiceReferentiel */ - if (! isset($data['referentiel'][$referentiel->getStructure()->getId()])){ + 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, ]; } - $data['referentiel'][$referentiel->getStructure()->getId()]['heures'] += $referentiel->getHeures( $typeVolumeHoraire, $etatVolumeHoraire ); + $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'] += $frr ? $frr->getHeuresServiceReferentiel() : 0; $data['referentiel'][$referentiel->getStructure()->getId()]['hetd-compl'] += $frr ? $frr->getHeuresComplReferentiel() : 0; } $services = $intervenant->getFormuleIntervenant()->getFormuleService(); - foreach( $services as $service ){ + foreach ($services as $service) { $dsId = $service->getId(); - $ds = []; + $ds = []; /* @var $service \Application\Entity\Db\FormuleService */ $typesIntervention = []; - $totalHeures = 0; + $totalHeures = 0; $fvhs = $service->getFormuleVolumeHoraire($typeVolumeHoraire, $etatVolumeHoraire); - foreach( $fvhs as $fvh ){ /* @var $fvh \Application\Entity\Db\FormuleVolumeHoraire */ + foreach ($fvhs as $fvh) { + /* @var $fvh \Application\Entity\Db\FormuleVolumeHoraire */ $totalHeures += $fvh->getHeures(); - if (! isset($typesIntervention[$fvh->getTypeIntervention()->getId()])) $typesIntervention[$fvh->getTypeIntervention()->getId()] = [ - 'type-intervention' => $fvh->getTypeIntervention(), - 'heures' => 0, - 'hetd' => 0, - ]; + if (!isset($typesIntervention[$fvh->getTypeIntervention()->getId()])) { + $typesIntervention[$fvh->getTypeIntervention()->getId()] = [ + 'type-intervention' => $fvh->getTypeIntervention(), + 'heures' => 0, + 'hetd' => 0, + ]; + } $typesIntervention[$fvh->getTypeIntervention()->getId()]['heures'] += $fvh->getHeures(); $hetd = $fvh->getVolumeHoraire()->getFormuleResultatVolumeHoraire()->first()->getTotal(); $typesIntervention[$fvh->getTypeIntervention()->getId()]['hetd'] += $hetd; } - if ($totalHeures > 0){ - $frs = $service->getService()->getUniqueFormuleResultatService( $typeVolumeHoraire, $etatVolumeHoraire ); - if (1.0 !== $service->getPonderationServiceCompl()){ + if ($totalHeures > 0) { + $frs = $service->getService()->getUniqueFormuleResultatService($typeVolumeHoraire, $etatVolumeHoraire); + if (1.0 !== $service->getPonderationServiceCompl()) { $data['has-ponderation-service-compl'] = true; } $ds = [ - 'element-etablissement' => $service->getService()->getElementPedagogique() ? $service->getService()->getElementPedagogique() : $service->getService()->getEtablissement(), - 'taux' => [], - 'structure' => $service->getService()->getElementPedagogique() ? $service->getService()->getElementPedagogique()->getStructure() : $service->getService()->getIntervenant()->getStructure(), - 'ponderation-service-compl' => $service->getPonderationServiceCompl(), - 'heures' => [], - 'hetd' => [ + 'element-etablissement' => $service->getService()->getElementPedagogique() ? $service->getService()->getElementPedagogique() : $service->getService()->getEtablissement(), + 'taux' => [], + 'structure' => $service->getService()->getElementPedagogique() ? $service->getService()->getElementPedagogique()->getStructure() : $service->getService()->getIntervenant()->getStructure(), + 'ponderation-service-compl' => $service->getPonderationServiceCompl(), + 'heures' => [], + 'hetd' => [ 'total' => 0, - ] + ], ]; - foreach( $typesHeures as $typeHeures ){ + foreach ($typesHeures as $typeHeures) { /* @var $typeHeures \Application\Entity\Db\TypeHeures */ // taux - try{ + try { $h = $service->getTaux($typeHeures); } catch (\Exception $ex) { $h = 0.0; } - if ($h > 0){ - $ds['taux'][$typeHeures->getId()] = $h; + if ($h > 0) { + $ds['taux'][$typeHeures->getId()] = $h; $data['th-taux'][$typeHeures->getId()] = $typeHeures; } // HETD service - try{ + try { $h = $frs->getHeuresService($typeHeures); } catch (\Exception $ex) { $h = 0.0; } - if ($h > 0){ + if ($h > 0) { $ds['hetd']['service'][$typeHeures->getId()] = $h; - $data['th-service'][$typeHeures->getId()] = $typeHeures; + $data['th-service'][$typeHeures->getId()] = $typeHeures; } // HETD compl - try{ + try { $h = $frs->getHeuresCompl($typeHeures); } catch (\Exception $ex) { $h = 0.0; } - if ($h > 0){ + if ($h > 0) { $ds['hetd']['compl'][$typeHeures->getId()] = $h; - $data['th-compl'][$typeHeures->getId()] = $typeHeures; + $data['th-compl'][$typeHeures->getId()] = $typeHeures; } } - foreach( $typesIntervention as $ti ){ - if ( $ti['heures'] > 0 ){ + foreach ($typesIntervention as $ti) { + if ($ti['heures'] > 0) { $data['types-intervention'][$ti['type-intervention']->getId()] = $ti['type-intervention']; - $ds['heures'][$ti['type-intervention']->getId()] = $ti['heures']; - $ds['hetd'][$ti['type-intervention']->getId()] = $ti['hetd']; + $ds['heures'][$ti['type-intervention']->getId()] = $ti['heures']; + $ds['hetd'][$ti['type-intervention']->getId()] = $ti['hetd']; } } $data['services'][$dsId] = $ds; } } - usort($data['types-intervention'], function($ti1,$ti2){ return $ti1->getOrdre() > $ti2->getOrdre(); }); - usort($data['th-taux'], function($ti1,$ti2){ return $ti1->getOrdre() > $ti2->getOrdre(); }); - usort($data['th-service'], function($ti1,$ti2){ return $ti1->getOrdre() > $ti2->getOrdre(); }); - usort($data['th-compl'], function($ti1,$ti2){ return $ti1->getOrdre() > $ti2->getOrdre(); }); + usort($data['types-intervention'], function ($ti1, $ti2) { + return $ti1->getOrdre() > $ti2->getOrdre(); + }); + usort($data['th-taux'], function ($ti1, $ti2) { + return $ti1->getOrdre() > $ti2->getOrdre(); + }); + usort($data['th-service'], function ($ti1, $ti2) { + return $ti1->getOrdre() > $ti2->getOrdre(); + }); + usort($data['th-compl'], function ($ti1, $ti2) { + return $ti1->getOrdre() > $ti2->getOrdre(); + }); + return compact('form', 'intervenant', 'typeVolumeHoraire', 'etatVolumeHoraire', 'data'); } + + public function formuleTotauxHetdAction() { - $intervenant = $this->context()->mandatory()->intervenantFromRoute(); /* @var $intervenant Intervenant */ + $intervenant = $this->getEvent()->getParam('intervenant'); + /* @var $intervenant Intervenant */ $typeVolumeHoraire = $this->getEvent()->getParam('typeVolumeHoraire'); $etatVolumeHoraire = $this->getEvent()->getParam('etatVolumeHoraire'); - $formuleResultat = $intervenant->getUniqueFormuleResultat($typeVolumeHoraire, $etatVolumeHoraire); + $formuleResultat = $intervenant->getUniqueFormuleResultat($typeVolumeHoraire, $etatVolumeHoraire); + return compact('formuleResultat'); } + + public function feuilleDeRouteAction() { $role = $this->getServiceContext()->getSelectedIdentityRole(); - if ($role instanceof \Application\Acl\IntervenantRole) { - $intervenant = $role->getIntervenant(); - } - else { - $intervenant = $this->context()->mandatory()->intervenantFromRoute(); - } + $intervenant = $role->getIntervenant() ?: $this->getEvent()->getParam('intervenant'); + /* @var $intervenant Intervenant */ if ($intervenant->estPermanent()) { throw new \Common\Exception\MessageException("Pas encore implémenté pour un permanent"); @@ -337,80 +295,79 @@ class IntervenantController extends AbstractActionController implements Workflow $title = sprintf("Feuille de route <small>%s</small>", $intervenant); - $wf = $this->getWorkflowIntervenant()->setIntervenant($intervenant); /* @var $wf \Application\Service\Workflow\WorkflowIntervenant */ + $wf = $this->getWorkflowIntervenant()->setIntervenant($intervenant); + /* @var $wf \Application\Service\Workflow\WorkflowIntervenant */ $wf->init(); - $view = new \Zend\View\Model\ViewModel(); - $view->setVariables(compact('intervenant', 'title', 'wf', 'role')); - if ($wf->getCurrentStep()) { // var_dump($wf->getStepUrl($wf->getCurrentStep())); } - return $view; + return compact('intervenant', 'title', 'wf', 'role'); } - private $intervenantsChoisisRecentsSessionContainer; - /** - * @return \Zend\Session\Container - */ - protected function getIntervenantsChoisisRecentsSessionContainer() - { - if (null === $this->intervenantsChoisisRecentsSessionContainer) { - $container = new \Zend\Session\Container(get_class() . '_IntervenantsChoisisRecents'); - $container->setExpirationSeconds(3*60*60); // 3 heures - $this->intervenantsChoisisRecentsSessionContainer = $container; - } - return $this->intervenantsChoisisRecentsSessionContainer; - } /** * - * @param bool $clear * @return array */ - protected function getIntervenantsChoisisRecents($clear = false) + protected function getIntervenantsRecents() { - $container = $this->getIntervenantsChoisisRecentsSessionContainer(); - if ($clear) { - unset($container->intervenants); - } - if (!isset($container->intervenants)) { - $container->intervenants = []; + $container = $this->getSessionContainer(); + + if (isset($container->recents)) { + return $container->recents; + } else { + return []; } - return $container->intervenants; } + + /** * * @param \Application\Entity\Db\Intervenant $intervenant + * * @return \Application\Controller\IntervenantController */ - protected function addIntervenantChoisiRecent(Intervenant $intervenant) + protected function addIntervenantRecent(Intervenant $intervenant) { - $container = $this->getIntervenantsChoisisRecentsSessionContainer(); - $intervenants = (array) $container->intervenants; - - if (!array_key_exists($intervenant->getId(), $intervenants)) { - $intervenants["" . $intervenant] = [ - 'id' => $intervenant->getId(), - 'sourceCode' => $intervenant->getSourceCode(), - 'nom' => "" . $intervenant, - ]; - ksort($intervenants); + $container = $this->getSessionContainer(); + if (!isset($container->recents)) { + $container->recents = []; } - $container->intervenants = $intervenants; - return $this; - } + if (count($container->recents) > 4 && !isset($container->recents[$intervenant->getSourceCode()])) { + $prem = (int)date('U'); + foreach ($container->recents as $i) { + $horo = $i['__horo_ajout__']; + if ($horo) { + if ($prem >= $horo) $prem = $horo; + } + } + foreach ($container->recents as $index => $i) { + $horo = $i['__horo_ajout__']; + if ($horo == $prem) { + unset($container->recents[$index]); + } + } + } - /** - * - * @return \Application\Form\Intervenant\HeuresCompForm - */ - protected function getFormHeuresComp() - { - return $this->getServiceLocator()->get('FormElementManager')->get('IntervenantHeuresCompForm'); + $container->recents[$intervenant->getSourceCode()] = [ + 'civilite' => $intervenant->getCivilite()->getLibelleLong(), + 'nom' => $intervenant->getNomUsuel(), + 'prenom' => $intervenant->getPrenom(), + 'date-naissance' => $intervenant->getDateNaissance(), + 'structure' => $intervenant->getStructure()->getLibelleCourt(), + 'numero-personnel' => $intervenant->getSourceCode(), + '__horo_ajout__' => (int)date('U'), + ]; + + uasort($container->recents, function ($a, $b) { + return $a['nom'] . ' ' . $a['prenom'] > $b['nom'] . ' ' . $b['prenom']; + }); + + return $this; } } diff --git a/module/Application/src/Application/Provider/Identity/IdentityProvider.php b/module/Application/src/Application/Provider/Identity/IdentityProvider.php index 1e84a05ebee80290a52ac39fc25f96848a5ffcbe..96e50c2488c4e4be57e95289d36bc11bca011552 100644 --- a/module/Application/src/Application/Provider/Identity/IdentityProvider.php +++ b/module/Application/src/Application/Provider/Identity/IdentityProvider.php @@ -72,7 +72,7 @@ class IdentityProvider implements ServiceLocatorAwareInterface, ChainableProvide /** * @todo attention : plusieurs intervenants pourront remonter si on peut leur donner plusieurs statuts par an!! */ - $intervenant = $this->getServiceIntervenant()->importer($utilisateurCode); + $intervenant = $this->getServiceIntervenant()->getBySourceCode($utilisateurCode); $personnel = $this->getServicePersonnel()->getBySourceCode($utilisateurCode); /** diff --git a/module/Application/src/Application/Provider/Role/RoleProvider.php b/module/Application/src/Application/Provider/Role/RoleProvider.php index 8bec2171c9d28e82476f74b9c68c2620808a9ba9..b80f502e08016a7e1a33b4123870ea5daff6ac5b 100644 --- a/module/Application/src/Application/Provider/Role/RoleProvider.php +++ b/module/Application/src/Application/Provider/Role/RoleProvider.php @@ -97,7 +97,7 @@ class RoleProvider implements ProviderInterface, EntityManagerAwareInterface if ($ldapUser = $serviceAuthUserContext->getLdapUser()) { $numeroPersonnel = (integer)$ldapUser->getSupannEmpId(); - $intervenant = $this->getServiceIntervenant()->importer($numeroPersonnel); + $intervenant = $this->getServiceIntervenant()->getBySourceCode($numeroPersonnel); $personnel = $this->getServicePersonnel()->getBySourceCode($numeroPersonnel); } else { $intervenant = null; diff --git a/module/Application/src/Application/Service/Context.php b/module/Application/src/Application/Service/Context.php index d7f4d9e0020521378928c16901acd3a4258f5a4e..36a79925402f06fa1410416a08183c4a781fbd61 100644 --- a/module/Application/src/Application/Service/Context.php +++ b/module/Application/src/Application/Service/Context.php @@ -4,10 +4,10 @@ namespace Application\Service; use Application\Acl\Role; use Application\Entity\Db\Etablissement as EntityEtablissement; -use Application\Entity\Db\Annee as AnneeEntity; -use Application\Entity\Db\Structure as StructureEntity; +use Application\Entity\Db\Annee as AnneeEntity; +use Application\Entity\Db\Structure as StructureEntity; +use Application\Traits\SessionContainerTrait; use DateTime; -use Zend\Session\Container; /** * Service fournissant les différents contextes de fonctionnement de l'application. @@ -21,7 +21,7 @@ class Context extends AbstractService use Traits\IntervenantAwareTrait; use Traits\ParametresAwareTrait; use Traits\StructureAwareTrait; - + use SessionContainerTrait; /** * selectedIdentityRole @@ -67,12 +67,6 @@ class Context extends AbstractService */ protected $parametres; - /** - * @var Container - */ - protected $sessionContainer; - - @@ -88,77 +82,83 @@ class Context extends AbstractService if ($authUserContext->getIdentity()) { $this->selectedIdentityRole = $authUserContext->getSelectedIdentityRole(); - if ( - $this->selectedIdentityRole instanceof \Application\Acl\IntervenantRole - && ! $this->selectedIdentityRole->getIntervenant() - ){ - // import automatique - $iSourceCode = (int)$authUserContext->getLdapUser()->getSupannEmpId(); - $intervenant = $this->getServiceIntervenant()->importer($iSourceCode); - $this->selectedIdentityRole->setIntervenant( $intervenant ); // injection à la volée de l'intervenant - } + if (! $this->selectedIdentityRole instanceof Role) $this->selectedIdentityRole = new Role(); } } + return $this->selectedIdentityRole; } + + /** * * @return EntityEtablissement */ public function getEtablissement() { - if (! $this->etablissement){ + if (!$this->etablissement) { $sc = $this->getSessionContainer(); - if (! $sc->offsetExists('etablissement')){ + if (!$sc->offsetExists('etablissement')) { $sc->etablissement = (int)$this->getServiceParametres()->etablissement; } - $this->etablissement = $this->getServiceEtablissement()->get( $sc->etablissement); + $this->etablissement = $this->getServiceEtablissement()->get($sc->etablissement); } + return $this->etablissement; } + + /** * * @param EntityEtablissement $etablissement - * @param boolean $updateParametres + * @param boolean $updateParametres + * * @return self */ - public function setEtablissement( EntityEtablissement $etablissement, $updateParametres=false ) + public function setEtablissement(EntityEtablissement $etablissement, $updateParametres = false) { - $this->etablissement = $etablissement; + $this->etablissement = $etablissement; $this->getSessionContainer()->etablissement = $etablissement->getId(); - if ($updateParametres){ + if ($updateParametres) { $this->getServiceParametres()->etablissement = (string)$etablissement->getId(); } + return $this; } + + /** - * Retourne l'année courante. + * Retourne l'année courante. * C'est à dire : - * - celle mémorisée en session (car sélectionnée par l'utilisateur) si elle existe ; + * - celle mémorisée en session (car sélectionnée par l'utilisateur) si elle existe ; * - ou sinon celle spécifiée dans les paramètres de l'appli. * * @return AnneeEntity */ public function getAnnee() { - if (! $this->annee){ + if (!$this->annee) { $sc = $this->getSessionContainer(); - if (! $sc->offsetExists('annee')){ + if (!$sc->offsetExists('annee')) { $sc->annee = (int)$this->getServiceParametres()->annee; } - $this->annee = $this->getServiceAnnee()->get( $sc->annee); + $this->annee = $this->getServiceAnnee()->get($sc->annee); } + return $this->annee; } + + /** * Retourne l'année N - x, N étant l'année courante. * * @param int $x Entier supérieur ou égal à zéro + * * @return AnneeEntity */ public function getAnneeNmoins($x) @@ -166,49 +166,61 @@ class Context extends AbstractService return $this->getServiceAnnee()->getNmoins($this->getAnnee(), $x); } + + /** * * @return AnneeEntity */ public function getAnneePrecedente() { - if (! $this->anneePrecedente){ - $this->anneePrecedente = $this->getServiceAnnee()->getPrecedente( $this->getAnnee() ); + if (!$this->anneePrecedente) { + $this->anneePrecedente = $this->getServiceAnnee()->getPrecedente($this->getAnnee()); } + return $this->anneePrecedente; } + + /** * * @return AnneeEntity */ public function getAnneeSuivante() { - if (! $this->anneeSuivante){ - $this->anneeSuivante = $this->getServiceAnnee()->getSuivante( $this->getAnnee() ); + if (!$this->anneeSuivante) { + $this->anneeSuivante = $this->getServiceAnnee()->getSuivante($this->getAnnee()); } + return $this->anneeSuivante; } + + /** * * @param AnneeEntity $annee - * @param boolean $updateParametres + * @param boolean $updateParametres + * * @return self */ - public function setAnnee( AnneeEntity $annee, $updateParametres=false ) + public function setAnnee(AnneeEntity $annee, $updateParametres = false) { - $this->annee = $annee; + $this->annee = $annee; $this->getSessionContainer()->annee = $annee->getId(); - if ($updateParametres){ + if ($updateParametres) { $this->getServiceParametres()->annee = (string)$annee->getId(); } /* Rafraîchit les années précédentes et suivantes par la même occasion!! */ $this->getAnneePrecedente(); $this->getAnneeSuivante(); + return $this; } + + /** * * @return DateTime @@ -216,122 +228,132 @@ class Context extends AbstractService function getDateObservation() { $sc = $this->getSessionContainer(); - if (! $sc->offsetExists('dateObservation')){ + if (!$sc->offsetExists('dateObservation')) { $sc->dateObservation = null; } + return $sc->dateObservation; } + + /** * * @param DateTime $dateObservation + * * @return self */ - public function setDateObservation( DateTime $dateObservation ) + public function setDateObservation(DateTime $dateObservation) { $sc->dateObservation = $dateObservation; + return $this; } + + /** - * + * * @return DateTime */ function getDateFinSaisiePermanents() { $sc = $this->getSessionContainer(); - if (! $sc->offsetExists('dateFinSaisiePermanents')){ + if (!$sc->offsetExists('dateFinSaisiePermanents')) { $sc->dateFinSaisiePermanents = DateTime::createFromFormat( - 'd/m/Y', - $this->getServiceParametres()->date_fin_saisie_permanents - ); + 'd/m/Y', + $this->getServiceParametres()->date_fin_saisie_permanents + ); } + return $sc->dateFinSaisiePermanents; } + + /** * * @param DateTime $dateFinSaisiePermanents + * * @return self */ - public function setDateFinSaisiePermanents( DateTime $dateFinSaisiePermanents, $updateParametres=false ) + public function setDateFinSaisiePermanents(DateTime $dateFinSaisiePermanents, $updateParametres = false) { $sc->dateFinSaisiePermanents = $dateFinSaisiePermanents; - if ($updateParametres){ + if ($updateParametres) { $this->getServiceParametres()->date_fin_saisie_permanents = $sc->dateFinSaisiePermanents->format('d/m/Y'); } + return $this; } + + /** * * @return StructureEntity */ - public function getStructure($initializing=false) + public function getStructure($initializing = false) { - if (! $this->structure){ + if (!$this->structure) { $sc = $this->getSessionContainer(); - if (! $sc->offsetExists('structure')){ - if ($initializing){ + if (!$sc->offsetExists('structure')) { + if ($initializing) { $sc->structure = null; - }else{ + } else { $role = $this->getSelectedIdentityRole(); - if ($role && $role->getStructure()){ + if ($role && $role->getStructure()) { $sc->structure = $role->getStructure()->getId(); - }else{ + } else { $sc->structure = null; } } } - $this->structure = $this->getServiceStructure()->get( $sc->structure); + $this->structure = $this->getServiceStructure()->get($sc->structure); } + return $this->structure; } + + /** * * @param StructureEntity $structure - * @param boolean $updateParametres + * @param boolean $updateParametres + * * @return self */ - public function setStructure( $structure ) + public function setStructure($structure) { - if ($structure instanceof StructureEntity){ - $this->structure = $structure; + if ($structure instanceof StructureEntity) { + $this->structure = $structure; $this->getSessionContainer()->structure = $structure->getId(); - }else{ - $this->structure = null; + } else { + $this->structure = null; $this->getSessionContainer()->structure = null; } + return $this; } - + + + /** * Détermine si l'application était opérationnelle l'année spécifiée. - * + * * On considère que s'il existe des intervenants pour l'année spécifiée, alors * l'application était opérationnelle. - * + * * @param AnneeEntity $annee + * * @return boolean */ public function applicationExists(AnneeEntity $annee) { $qb = $this->getServiceIntervenant()->finderByAnnee($annee); - $found = (int) $qb->select("COUNT(int)")->getQuery()->getSingleScalarResult(); - - return (bool) $found; - } + $found = (int)$qb->select("COUNT(int)")->getQuery()->getSingleScalarResult(); - /** - * @return Container - */ - protected function getSessionContainer() - { - if (null === $this->sessionContainer) { - $this->sessionContainer = new Container(__CLASS__); - } - return $this->sessionContainer; + return (bool)$found; } - } \ No newline at end of file diff --git a/module/Application/src/Application/Service/Intervenant.php b/module/Application/src/Application/Service/Intervenant.php index 4e3796905cace32826550d13f8dbe60cae90da4e..f9cf59944860b59f12a2681500e767d8eb68afa5 100644 --- a/module/Application/src/Application/Service/Intervenant.php +++ b/module/Application/src/Application/Service/Intervenant.php @@ -11,6 +11,7 @@ use Application\Service\Traits\StatutIntervenantAwareTrait; use Common\Exception\RuntimeException; use Doctrine\ORM\QueryBuilder; use Import\Processus\Import; +use UnicaenApp\Util; /** * Description of Intervenant @@ -23,6 +24,64 @@ class Intervenant extends AbstractEntityService + /** + * @param string $critere + * @param integer $limit + * + * @return array + */ + public function recherche($critere, $limit = 50) + { + if (strlen($critere) < 2) return []; + + $anneeId = (int)$this->getServiceContext()->getAnnee()->getId(); + + $critere = Util::reduce($critere); + $criteres = explode('_', $critere); + + $sql = 'SELECT * FROM V_INTERVENANT_RECHERCHE WHERE rownum <= ' . (int)$limit . ' AND annee_id = ' . $anneeId; + $sqlCri = ''; + $criCode = 0; + + foreach ($criteres as $c) { + $cc = (int)$c; + if (0 === $cc) { + if ($sqlCri != '') $sqlCri .= ' AND '; + $sqlCri .= 'critere LIKE q\'[%' . $c . '%]\''; + } else { + $criCode = $cc; + } + } + $orc = ''; + if ($sqlCri != '') { + $orc[] = '(' . $sqlCri . ')'; + } + if ($criCode) { + $orc[] = 'source_code LIKE \'%' . $criCode . '%\''; + } + $orc = implode(' OR ', $orc); + $sql .= ' AND (' . $orc . ') ORDER BY nom_usuel, prenom'; +// sqlDump($sql); + + $stmt = $this->getEntityManager()->getConnection()->executeQuery($sql); + + $intervenants = []; + while ($r = $stmt->fetch()) { + $intervenants[$r['SOURCE_CODE']] = [ + 'civilite' => $r['CIVILITE'], + 'nom' => $r['NOM_USUEL'], + 'prenom' => $r['PRENOM'], + 'date-naissance' => new \DateTime($r['DATE_NAISSANCE']), + 'structure' => $r['STRUCTURE'], + 'numero-personnel' => $r['SOURCE_CODE'], + ]; + } + + return $intervenants; + } + + + /** * Recherche par : * - id source exact (numéro Harpege ou autre), @@ -98,7 +157,18 @@ class Intervenant extends AbstractEntityService $annee = $this->getServiceContext()->getAnnee(); } - return $this->getRepo()->findOneBy(['sourceCode' => $sourceCode, 'annee' => $annee->getId()]); + $findParams = ['sourceCode' => $sourceCode, 'annee' => $annee->getId()]; + $repo = $this->getRepo(); + + $result = $repo->findOneBy($findParams); + if (!$result) { + $import = $this->getServiceLocator()->get('importProcessusImport'); + /* @var $import Import */ + $import->intervenant($sourceCode); + $result = $repo->findOneBy($findParams); // on retente + } + + return $result; } @@ -226,10 +296,8 @@ class Intervenant extends AbstractEntityService /* @var $import Import */ $import->intervenant($sourceCode); - $repo = $this->getEntityManager()->getRepository($this->getEntityClass()); - - if (!($intervenant = $repo->findOneBySourceCode($sourceCode))) { - throw new RuntimeException("Vous n'êtes pas autorisé à vous connecter à OSE avec ce compte. Vous vous prions de vous rapprocher de votre composante pour en obtenir un valide."); + if (!($intervenant = $this->getRepo()->findOneBySourceCode($sourceCode))) { + // throw new RuntimeException("Vous n'êtes pas autorisé à vous connecter à OSE avec ce compte. Vous vous prions de vous rapprocher de votre composante pour en obtenir un valide."); } return $intervenant; diff --git a/module/Application/view/application/index/index.phtml b/module/Application/view/application/index/index.phtml index 5d826720ff6f75aaf1bf9744abf8ffae80559094..dcb7b2e18d15a04c6604d8c5336324a1baecde0e 100755 --- a/module/Application/view/application/index/index.phtml +++ b/module/Application/view/application/index/index.phtml @@ -11,7 +11,6 @@ echo $this->messenger()->addMessagesFromFlashMessenger(); <small>Organisation des Services d'Enseignement</small> </h1> <p class="lead">Bienvenue dans l'application de saisie des enseignements de l'université de Caen.</p> - <p>Année <?php echo $annee ?>.</p> <?php @@ -44,6 +43,12 @@ echo $this->messenger()->addMessagesFromFlashMessenger(); $label = $this->translate("Tableau synthétique des enseignements concernant ma composante..."); ?><p><a class="btn btn-primary btn-large" href="<?php echo $url ?>"><?php echo $label ?></a></p><?php + }elseif (!$role->getPersonnel()){ + ?> + <div class="alert alert-danger" role="alert"> + Vous n'êtes pas autorisé(e) à vous connecter à OSE avec ce compte. Vous vous prions de vous rapprocher de votre composante pour en obtenir un valide. + </div> + <?php } }else{ diff --git a/module/Application/view/application/intervenant/liste.phtml b/module/Application/view/application/intervenant/liste.phtml new file mode 100644 index 0000000000000000000000000000000000000000..3cdecc31d85c7dfbe47132a988d2a8aaa79d0851 --- /dev/null +++ b/module/Application/view/application/intervenant/liste.phtml @@ -0,0 +1,31 @@ +<?php + /* @var $intervenants array */ +?> +<table class="table table-bordered table-condensed"> + <thead> + <tr> + <th> </th> + <th>Civilité</th> + <th>Nom</th> + <th>Prénom</th> + <th>Structure</th> + <th>Date de naissance</th> + <th>N° personnel</th> + </tr> + </thead> + <tbody class="table-hover"> + <?php foreach($intervenants as $sourceCode => $intervenant): ?> + <tr> + <td><a href="<?php echo $this->url('intervenant/fiche', ['intervenant' => $sourceCode]); ?>"> + <span class="glyphicon glyphicon-eye-open"></span> Fiche + </a></td> + <td><?php echo $intervenant['civilite'] ?></td> + <td><?php echo $intervenant['nom'] ?></td> + <td><?php echo $intervenant['prenom'] ?></td> + <td><?php echo $intervenant['structure'] ?></td> + <td><?php echo $intervenant['date-naissance']->format(\Common\Constants::DATE_FORMAT) ?></td> + <td><?php echo $intervenant['numero-personnel'] ?></td> + </tr> + </tbody> + <?php endforeach; ?> +</table> \ No newline at end of file diff --git a/module/Application/view/application/intervenant/recherche.phtml b/module/Application/view/application/intervenant/recherche.phtml new file mode 100644 index 0000000000000000000000000000000000000000..843d5e116c3d73b6d20bb0e6191c97c0df76db91 --- /dev/null +++ b/module/Application/view/application/intervenant/recherche.phtml @@ -0,0 +1,21 @@ +<?php + +/* @var $intervenants array */ +$nombre = count($intervenants); + +?> +<?php if (empty($intervenants)): ?> + + <div class="alert alert-info">Aucun intervenant trouvé!</div> + +<?php else: ?> + <div class="alert alert-success"><?php + switch($nombre){ + case 1: echo '1 intervenant(e) trouvé(e)'; break; + case 21: echo 'plus de 20 intervenants trouvés. Voici les 20 premiers :'; break; + default: echo $nombre.' intervenants trouvés'; + } + ?></div> + <?php echo $this->partial('liste', compact('intervenants')); ?> + +<?php endif; ?> diff --git a/module/Application/view/application/intervenant/rechercher.phtml b/module/Application/view/application/intervenant/rechercher.phtml index 3ac6594d6fbc9b54588c8dd1addfa80f1a3f2d4b..5490fd434cb9c1633955c4acd57dcde371331b15 100644 --- a/module/Application/view/application/intervenant/rechercher.phtml +++ b/module/Application/view/application/intervenant/rechercher.phtml @@ -1,38 +1,25 @@ -<div class="jumbotron"> - <h1>Rechercher un intervenant</h1> -</div> - -<?php $form->prepare(); ?> +<?php + /* @var $recents [] */ +?> +<h1>Rechercher un intervenant</h1> -<div class="row"> - <div class="col-md-4"> - <?php echo $this->form()->openTag($form) ?> - <?php echo $this->formControlGroup($form->get('interv')); ?> - <input class="btn btn-primary" type="submit" value="Consulter" name="submit"> - <?php echo $this->form()->closeTag() ?> +<div style="padding:1em"> +<div class="intervenant-recherche"> + <div class="critere"> + Saisissez le nom suivi éventuellement du prénom (2 lettres au moins) : + <input id="critere" class="form-control input" type="text" /> </div> - <div class="col-md-8 intervenant-voir"> - <?php if (false !== $intervenant): ?> - <?php echo $intervenant ? $this->intervenant($intervenant) : "Intervenant introuvable dans OSE." ?> - <?php endif ?> - <?php if ($intervenant): ?> - <?php echo $this->navigation('navigation')->menuContextuel()->withTarget($intervenant->getId()) ?> - <?php endif ?> + <div class="recherche" data-url="<?php echo $this->url('intervenant/recherche') ?>"> + </div> </div> -<script> - var url = '<?php echo $this->url('intervenant/default', ['action' => 'voir']) ?>'; - $("body").on("submit", "form.intervenant-rech", function(event) { - var form = $(event.target); - var id = $("input.sas", form).val(); - $.post(url, { 'id': id }, function(data) { - $("div.intervenant-voir").html(data); - }); - event.preventDefault(); - }); +<?php - $(function() { - $(":input").tooltip(); - }); -</script> \ No newline at end of file +if (! empty($recents)){ + echo '<h3>Fiches récemment consultées :</h3>'; + echo $this->partial('liste', ['intervenants' => $recents]); +} + +?> +</div> diff --git a/module/Application/view/application/intervenant/voir.phtml b/module/Application/view/application/intervenant/voir.phtml index 192fc826b191594ef55947ffe906b383d30b6fd3..15fb93c09409c63bc0e80b210cb5dd0945c7a718 100644 --- a/module/Application/view/application/intervenant/voir.phtml +++ b/module/Application/view/application/intervenant/voir.phtml @@ -6,4 +6,4 @@ <hr /> -<?php echo $this->partial('application/intervenant/partial/feuille-de-route.phtml', ['intervenant' => $intervenant, 'role' => $role]); \ No newline at end of file +<?php echo $this->partial('application/intervenant/partial/feuille-de-route.phtml', compact('intervenant','role')); \ No newline at end of file diff --git a/public/css/app.css b/public/css/app.css index eaa456e618c9ff5549b5e429f1daf12695f25a08..fa998858f445200f325c2be653c3dc46110985fc 100755 --- a/public/css/app.css +++ b/public/css/app.css @@ -373,4 +373,12 @@ div#navbar pre { form#dossier .form-control[disabled], form#dossier .form-control[readonly], form#dossier fieldset[disabled] .form-control { cursor: text; +} + + + + + +.intervenant-recherche .critere{ + padding-bottom: 1em; } \ No newline at end of file diff --git a/public/js/app.js b/public/js/app.js index 262f36319d3fddec757666ec50c5406f31d5fa2a..e5951c2e3b75da1d4ec85c6b47875a9c2114a989 100755 --- a/public/js/app.js +++ b/public/js/app.js @@ -102,6 +102,47 @@ function changementAnnee(annee) ); } +/** + * + * @constructor + */ +$.widget("ose.intervenantRecherche", { + rechercher: function( critere ) + { + var that = this; + + + if (critere.length > 1) { + if (that.getElementRecherche().find('.loading').length == 0){ + that.getElementRecherche().prepend('<div class="loading"></div>'); + } + that.getElementRecherche().refresh({critere: critere}, function( response, status, xhr ){ + if ( status == "error" ) { + var msg = "Sorry but there was an error: "; + that.getElementRecherche().html( msg + xhr.status + " " + xhr.statusText + xhr.responseText ); + } + }); + } + }, + + _create: function () + { + var that = this; + this.element.find( "#critere" ).autocomplete({ + source: function( event, ui ) { + that.rechercher(event.term); + return {}; + } + }); + }, + + getElementRecherche : function () { return this.element.find('.recherche'); }, +}); + +$(function () +{ + WidgetInitializer.add('intervenant-recherche', 'intervenantRecherche'); +});