Loading data/SQL/1.2.0/30_optimis-wf.sql 0 → 100644 +541 −0 Changes for data/SQL/1.2.0/30_optimis-wf.sql: 541 added lines, 0 removed lines. Original line number Diff line number Diff line -- -- Amélioration V_WORKFLOW : il devient inutile d'utiliser APP_WORKFLOW.ATTEIGNABLE() :-) -- create or replace view V_WORKFLOW as SELECT ROWNUM as id, t.THESE_ID, t.ETAPE_ID, t.CODE, t.ORDRE, t.FRANCHIE, t.RESULTAT, t.OBJECTIF, -- NB: dans les 3 lignes suivantes, c'est la même expression 'dense_rank() over(...)' qui est répétée : (dense_rank() over(partition by t.THESE_ID, t.FRANCHIE order by t.ORDRE)) dense_rank, case when t.FRANCHIE = 1 or (dense_rank() over(partition by t.THESE_ID, t.FRANCHIE order by t.ORDRE)) = 1 then 1 else 0 end atteignable, case when (dense_rank() over(partition by t.THESE_ID, t.FRANCHIE order by t.ORDRE)) = 1 and t.FRANCHIE = 0 then 1 else 0 end courante FROM ( -- -- VALIDATION_PAGE_DE_COUVERTURE : franchie si version page de couverture validée -- SELECT t.id AS these_id, e.id AS etape_id, e.code, e.ORDRE, CASE WHEN v.valide IS NULL THEN 0 ELSE 1 END franchie, CASE WHEN v.valide IS NULL THEN 0 ELSE 1 END resultat, 1 objectif FROM these t JOIN WF_ETAPE e ON e.code = 'VALIDATION_PAGE_DE_COUVERTURE' LEFT JOIN V_SITU_VALIDATION_PAGE_COUV v ON v.these_id = t.id UNION ALL -- -- DEPOT_VERSION_ORIGINALE : franchie si version originale déposée -- SELECT t.id AS these_id, e.id AS etape_id, e.code, e.ORDRE, CASE WHEN v.fichier_id IS NULL THEN 0 ELSE 1 END franchie, CASE WHEN v.fichier_id IS NULL THEN 0 ELSE 1 END resultat, 1 objectif FROM these t JOIN WF_ETAPE e ON e.code = 'DEPOT_VERSION_ORIGINALE' LEFT JOIN V_SITU_DEPOT_VO v ON v.these_id = t.id UNION ALL -- -- ATTESTATIONS : franchie si données saisies -- SELECT t.id AS these_id, e.id AS etape_id, e.code, e.ORDRE, CASE WHEN v.attestation_id IS NULL THEN 0 ELSE 1 END franchie, CASE WHEN v.attestation_id IS NULL THEN 0 ELSE 1 END resultat, 1 objectif FROM these t JOIN WF_ETAPE e ON e.code = 'ATTESTATIONS' LEFT JOIN V_SITU_ATTESTATIONS v ON v.these_id = t.id UNION ALL -- -- AUTORISATION_DIFFUSION_THESE : franchie si données saisies -- SELECT t.id AS these_id, e.id AS etape_id, e.code, e.ORDRE, CASE WHEN v.diffusion_id IS NULL THEN 0 ELSE 1 END franchie, CASE WHEN v.diffusion_id IS NULL THEN 0 ELSE 1 END resultat, 1 objectif FROM these t JOIN WF_ETAPE e ON e.code = 'AUTORISATION_DIFFUSION_THESE' LEFT JOIN V_SITU_AUTORIS_DIFF_THESE v ON v.these_id = t.id UNION ALL -- -- SIGNALEMENT_THESE : franchie si données saisies -- SELECT t.id AS these_id, e.id AS etape_id, e.code, e.ORDRE, CASE WHEN v.description_id IS NULL THEN 0 ELSE 1 END franchie, CASE WHEN v.description_id IS NULL THEN 0 ELSE 1 END resultat, 1 objectif FROM these t JOIN WF_ETAPE e ON e.code = 'SIGNALEMENT_THESE' LEFT JOIN V_SITU_SIGNALEMENT_THESE v ON v.these_id = t.id UNION ALL -- -- ARCHIVABILITE_VERSION_ORIGINALE : franchie si l'archivabilité de la version originale a été testée -- SELECT t.id AS these_id, e.id AS etape_id, e.code, e.ORDRE, CASE WHEN v.THESE_ID IS NULL THEN 0 ELSE 1 END franchie, -- CASE WHEN v.THESE_ID IS NULL THEN -- 0 -- test d'archivabilité inexistant -- ELSE -- CASE WHEN v.EST_VALIDE IS NULL THEN -- 1 -- test d'archivabilité existant mais résultat indéterminé (plantage) -- ELSE -- CASE WHEN v.EST_VALIDE = 1 THEN -- 1 -- test d'archivabilité réussi -- ELSE -- 0 -- test d'archivabilité échoué -- END -- END -- END franchie, CASE WHEN v.EST_VALIDE IS NULL OR v.EST_VALIDE = 0 THEN 0 ELSE 1 END resultat, 1 objectif FROM these t JOIN WF_ETAPE e ON e.code = 'ARCHIVABILITE_VERSION_ORIGINALE' LEFT JOIN V_SITU_ARCHIVAB_VO v ON v.these_id = t.id UNION ALL -- -- DEPOT_VERSION_ARCHIVAGE : franchie si version d'archivage déposée -- SELECT t.id AS these_id, e.id AS etape_id, e.code, e.ORDRE, CASE WHEN v.fichier_id IS NULL THEN 0 ELSE 1 END franchie, CASE WHEN v.fichier_id IS NULL THEN 0 ELSE 1 END resultat, 1 objectif FROM these t JOIN WF_ETAPE e ON e.code = 'DEPOT_VERSION_ARCHIVAGE' LEFT JOIN V_SITU_DEPOT_VA v ON v.these_id = t.id LEFT JOIN fichier f ON f.id = v.fichier_id UNION ALL -- -- ARCHIVABILITE_VERSION_ARCHIVAGE : franchie si l'archivabilité de la version d'archivage a été testée -- SELECT t.id AS these_id, e.id AS etape_id, e.code, e.ORDRE, CASE WHEN v.EST_VALIDE IS NULL THEN 0 ELSE 1 END franchie, CASE WHEN v.EST_VALIDE IS NULL OR v.EST_VALIDE = 0 THEN 0 ELSE 1 END resultat, 1 objectif FROM these t JOIN WF_ETAPE e ON e.code = 'ARCHIVABILITE_VERSION_ARCHIVAGE' LEFT JOIN V_SITU_ARCHIVAB_VA v ON v.these_id = t.id UNION ALL -- -- VERIFICATION_VERSION_ARCHIVAGE : franchie si vérification de la version originale effectuée (peu importe la réponse) -- SELECT t.id AS these_id, e.id AS etape_id, e.code, e.ORDRE, CASE WHEN v.EST_CONFORME IS NULL THEN 0 ELSE 1 END franchie, CASE WHEN v.EST_CONFORME IS NULL OR v.EST_CONFORME = 0 THEN 0 ELSE 1 END resultat, 1 objectif FROM these t JOIN WF_ETAPE e ON e.code = 'VERIFICATION_VERSION_ARCHIVAGE' LEFT JOIN V_SITU_VERIF_VA v ON v.these_id = t.id UNION ALL -- -- RDV_BU_SAISIE_DOCTORANT : franchie si données doctorant saisies -- SELECT t.id AS these_id, e.id AS etape_id, e.code, e.ORDRE, coalesce(v.ok, 0) franchie, (CASE WHEN rdv.COORD_DOCTORANT IS NULL THEN 0 ELSE 1 END + CASE WHEN rdv.DISPO_DOCTORANT IS NULL THEN 0 ELSE 1 END) resultat, 2 objectif FROM these t JOIN WF_ETAPE e ON e.code = 'RDV_BU_SAISIE_DOCTORANT' LEFT JOIN V_SITU_RDV_BU_SAISIE_DOCT v ON v.these_id = t.id LEFT JOIN RDV_BU rdv ON rdv.THESE_ID = t.id UNION ALL -- -- -- -- RDV_BU_SAISIE_BU : franchie si données BU saisies -- -- -- SELECT -- t.id AS these_id, -- e.id AS etape_id, -- e.code, -- e.ORDRE, -- coalesce(v.ok, 0) franchie, -- CASE WHEN rdv.MOTS_CLES_RAMEAU IS NULL THEN 0 ELSE 1 END + -- coalesce(rdv.VERSION_ARCHIVABLE_FOURNIE, 0) + -- coalesce(rdv.EXEMPL_PAPIER_FOURNI, 0) + -- coalesce(rdv.CONVENTION_MEL_SIGNEE, 0) resultat, -- 4 objectif -- FROM these t -- JOIN WF_ETAPE e ON e.code = 'RDV_BU_SAISIE_BU' -- LEFT JOIN V_SITU_RDV_BU_SAISIE_BU v ON v.these_id = t.id -- LEFT JOIN RDV_BU rdv ON rdv.THESE_ID = t.id -- -- UNION ALL -- -- RDV_BU_VALIDATION_BU : franchie si données BU saisies ET une validation BU existe -- SELECT t.id AS these_id, e.id AS etape_id, e.code, e.ORDRE, coalesce(vs.ok, 0) * coalesce(v.valide, 0) franchie, coalesce(vs.ok, 0) + coalesce(v.valide, 0) resultat, 2 objectif FROM these t JOIN WF_ETAPE e ON e.code = 'RDV_BU_VALIDATION_BU' LEFT JOIN V_SITU_RDV_BU_SAISIE_BU vs ON vs.these_id = t.id LEFT JOIN V_SITU_RDV_BU_VALIDATION_BU v ON v.these_id = t.id UNION ALL -- -- DEPOT_VERSION_ORIGINALE_CORRIGEE : franchie si version originale corrigée déposée -- SELECT t.id AS these_id, e.id AS etape_id, e.code, e.ORDRE, CASE WHEN v.fichier_id IS NULL THEN 0 ELSE 1 END franchie, CASE WHEN v.fichier_id IS NULL THEN 0 ELSE 1 END resultat, 1 objectif FROM these t JOIN WF_ETAPE e ON e.code = 'DEPOT_VERSION_ORIGINALE_CORRIGEE' LEFT JOIN V_SITU_DEPOT_VOC v ON v.these_id = t.id UNION ALL -- -- ATTESTATIONS_VERSION_CORRIGEE : franchie si données saisies -- SELECT t.id AS these_id, e.id AS etape_id, e.code, e.ORDRE, CASE WHEN v.attestation_id IS NULL THEN 0 ELSE 1 END franchie, CASE WHEN v.attestation_id IS NULL THEN 0 ELSE 1 END resultat, 1 objectif FROM these t JOIN WF_ETAPE e ON e.code = 'ATTESTATIONS_VERSION_CORRIGEE' LEFT JOIN V_SITU_ATTESTATIONS_VOC v ON v.these_id = t.id UNION ALL -- -- AUTORISATION_DIFFUSION_THESE_VERSION_CORRIGEE : franchie si données saisies -- SELECT t.id AS these_id, e.id AS etape_id, e.code, e.ORDRE, CASE WHEN v.diffusion_id IS NULL THEN 0 ELSE 1 END franchie, CASE WHEN v.diffusion_id IS NULL THEN 0 ELSE 1 END resultat, 1 objectif FROM these t JOIN WF_ETAPE e ON e.code = 'AUTORISATION_DIFFUSION_THESE_VERSION_CORRIGEE' LEFT JOIN V_SITU_AUTORIS_DIFF_THESE_VOC v ON v.these_id = t.id UNION ALL -- -- ARCHIVABILITE_VERSION_ORIGINALE_CORRIGEE : franchie si l'archivabilité de la version originale corrigée a été testée -- SELECT t.id AS these_id, e.id AS etape_id, e.code, e.ORDRE, CASE WHEN v.THESE_ID IS NULL THEN 0 ELSE 1 END franchie, CASE WHEN v.EST_VALIDE IS NULL OR v.EST_VALIDE = 0 THEN 0 ELSE 1 END resultat, 1 objectif FROM these t JOIN WF_ETAPE e ON e.code = 'ARCHIVABILITE_VERSION_ORIGINALE_CORRIGEE' LEFT JOIN V_SITU_ARCHIVAB_VOC v ON v.these_id = t.id UNION ALL -- -- DEPOT_VERSION_ARCHIVAGE_CORRIGEE : franchie si version d'archivage corrigée déposée -- SELECT t.id AS these_id, e.id AS etape_id, e.code, e.ORDRE, CASE WHEN v.fichier_id IS NULL THEN 0 ELSE 1 END franchie, CASE WHEN v.fichier_id IS NULL THEN 0 ELSE 1 END resultat, 1 objectif FROM these t JOIN WF_ETAPE e ON e.code = 'DEPOT_VERSION_ARCHIVAGE_CORRIGEE' LEFT JOIN V_SITU_DEPOT_VAC v ON v.these_id = t.id LEFT JOIN fichier f ON f.id = v.fichier_id UNION ALL -- -- ARCHIVABILITE_VERSION_ARCHIVAGE_CORRIGEE : franchie si la version d'archivage corrigée est archivable -- SELECT t.id AS these_id, e.id AS etape_id, e.code, e.ORDRE, CASE WHEN v.EST_VALIDE = 1 THEN 1 ELSE 0 END franchie, CASE WHEN v.EST_VALIDE = 1 THEN 1 ELSE 0 END resultat, 1 objectif FROM these t JOIN WF_ETAPE e ON e.code = 'ARCHIVABILITE_VERSION_ARCHIVAGE_CORRIGEE' LEFT JOIN V_SITU_ARCHIVAB_VAC v ON v.these_id = t.id UNION ALL -- -- VERIFICATION_VERSION_ARCHIVAGE_CORRIGEE : franchie si la version corrigée est certifiée conforme -- SELECT t.id AS these_id, e.id AS etape_id, e.code, e.ORDRE, CASE WHEN v.EST_CONFORME = 1 THEN 1 ELSE 0 END franchie, CASE WHEN v.EST_CONFORME = 1 THEN 1 ELSE 0 END resultat, 1 objectif FROM these t JOIN WF_ETAPE e ON e.code = 'VERIFICATION_VERSION_ARCHIVAGE_CORRIGEE' LEFT JOIN V_SITU_VERIF_VAC v ON v.these_id = t.id UNION ALL -- -- DEPOT_VERSION_CORRIGEE_VALIDATION_DOCTORANT : franchie si la validation attendue existe -- SELECT t.id AS these_id, e.id AS etape_id, e.code, e.ORDRE, coalesce(v.valide, 0) franchie, coalesce(v.valide, 0) resultat, 1 objectif FROM these t JOIN WF_ETAPE e ON e.code = 'DEPOT_VERSION_CORRIGEE_VALIDATION_DOCTORANT' LEFT JOIN V_SITU_DEPOT_VC_VALID_DOCT v ON v.these_id = t.id UNION ALL -- -- DEPOT_VERSION_CORRIGEE_VALIDATION_DIRECTEUR : franchie si toutes les validations attendues existent -- select * from ( WITH tmp AS ( SELECT these_id, sum(valide) AS resultat, count(valide) AS objectif FROM V_SITU_DEPOT_VC_VALID_DIR GROUP BY these_id ) SELECT t.id AS these_id, e.id AS etape_id, e.code, e.ORDRE, case when coalesce(v.resultat, 0) = v.objectif then 1 else 0 end franchie, coalesce(v.resultat, 0) resultat, v.objectif FROM these t JOIN WF_ETAPE e ON e.code = 'DEPOT_VERSION_CORRIGEE_VALIDATION_DIRECTEUR' LEFT JOIN tmp v ON v.these_id = t.id ) UNION ALL -- -- REMISE_EXEMPLAIRE_PAPIER_THESE_CORRIGEE : franchie pas pour le moment -- select * from ( WITH tmp_last AS ( SELECT THESE_ID as these_id, count(THESE_ID) AS resultat FROM V_SITU_VERSION_PAPIER_CORRIGEE GROUP BY THESE_ID ) SELECT t.id AS these_id, e.id AS etape_id, e.code, e.ORDRE, coalesce(tl.resultat, 0) franchie, 0, 1 FROM these t JOIN WF_ETAPE e ON e.code = 'REMISE_EXEMPLAIRE_PAPIER_THESE_CORRIGEE' LEFT JOIN tmp_last tl ON tl.these_id = t.id ) ) t JOIN V_WF_ETAPE_PERTIN v ON t.these_id = v.these_id AND t.etape_id = v.etape_id / -- -- APP_WORKFLOW.ATTEIGNABLE() devient inutile, on le garde quand même un moment en souvenir. -- create or replace PACKAGE APP_WORKFLOW AS /** * @deprecated depuis l'utilisation de 'dense_rank' pour calculer les témoins 'attegnable' et 'courant' * dans la vue V_WORKFLOW. */ function atteignable(p_etape_id NUMERIC, p_these_id NUMERIC) return NUMERIC; END APP_WORKFLOW; / create or replace PACKAGE BODY APP_WORKFLOW AS /** * @deprecated depuis l'utilisation de 'dense_rank' pour calculer les témoins 'attegnable' et 'courant' * dans la vue V_WORKFLOW. */ function atteignable(p_etape_id NUMERIC, p_these_id NUMERIC) return NUMERIC AS v_ordre numeric; BEGIN select ordre into v_ordre from wf_etape where id = p_etape_id; --DBMS_OUTPUT.PUT_LINE('ordre ' || v_ordre); for row in ( select code, ORDRE, franchie, resultat, objectif from V_WORKFLOW v where v.these_id = p_these_id and v.ordre < v_ordre order by v.ordre ) loop --DBMS_OUTPUT.PUT_LINE(rpad(row.ordre, 5) || ' ' || row.code || ' : ' || row.franchie); if row.franchie = 0 then return 0; end if; end loop; RETURN 1; END atteignable; END APP_WORKFLOW; / /* select * from V_WORKFLOW v2_ INNER JOIN THESE t1_ ON v2_.THESE_ID = t1_.ID INNER JOIN WF_ETAPE w0_ ON v2_.ETAPE_ID = w0_.ID where THESE_ID = 38307 order by THESE_ID, v2_.ORDRE / select * from V_WORKFLOW v JOIN THESE t ON v.THESE_ID = t.ID join WF_ETAPE e on v.ETAPE_ID = e.id where e.CODE = 'DEPOT_VERSION_ORIGINALE' and courante = 1 order by THESE_ID, v.ORDRE / */ No newline at end of file module/Application/src/Application/Entity/Db/Mapping/Application.Entity.Db.VWorkflow.dcm.xml +2 −0 Changes for module/Application/src/Application/Entity/Db/Mapping/Application.Entity.Db.VWorkflow.dcm.xml: 2 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -7,6 +7,8 @@ <field name="ordre" type="integer" column="ORDRE" nullable="false" /> <field name="franchie" type="boolean" column="FRANCHIE" nullable="false" /> <field name="atteignable" type="boolean" column="ATTEIGNABLE" nullable="false" /> <field name="courante" type="boolean" column="COURANTE" nullable="false" /> <field name="resultat" type="integer" column="RESULTAT" nullable="false" /> <field name="objectif" type="integer" column="OBJECTIF" nullable="false" /> Loading module/Application/src/Application/Entity/Db/VWorkflow.php +15 −11 Changes for module/Application/src/Application/Entity/Db/VWorkflow.php: 15 added lines, 11 removed lines. Original line number Diff line number Diff line <?php namespace Application\Entity\Db; use Application\Entity\VWorkflowNull; /** Loading Loading @@ -34,10 +35,15 @@ class VWorkflow private $franchie = false; /** * @var integer * @var bool */ private $atteignable = false; /** * @var bool */ private $courante = false; /** * @var integer */ Loading Loading @@ -128,6 +134,14 @@ class VWorkflow return (bool) $this->atteignable; } /** * @return bool */ public function getCourante() { return (bool) $this->courante; } /** * Get resultat * Loading @@ -150,16 +164,6 @@ class VWorkflow /** * @param int $atteignable * @return VWorkflow */ public function setAtteignable($atteignable) { $this->atteignable = $atteignable; return $this; } /** * @return static Loading module/Application/src/Application/Service/Workflow/WorkflowService.php +9 −15 Changes for module/Application/src/Application/Service/Workflow/WorkflowService.php: 9 added lines, 15 removed lines. Original line number Diff line number Diff line Loading @@ -54,7 +54,7 @@ class WorkflowService extends BaseService /** * @param These $these * @return \Application\Entity\Db\VWorkflow[] * @return VWorkflow[] */ public function reloadWorkflow(These $these) { Loading @@ -64,7 +64,7 @@ class WorkflowService extends BaseService /** * @param These $these * @param bool $forceRefresh * @return \Application\Entity\Db\VWorkflow[] * @return VWorkflow[] */ private function loadWorkflow(These $these, $forceRefresh = false) { Loading @@ -75,36 +75,30 @@ class WorkflowService extends BaseService $qb = $this->getRepository()->createQueryBuilder('v'); $qb ->addSelect('e, t') ->addSelect('atteignable(e, t) atteignable') ->join('v.these', 't') ->join('v.etape', 'e') ->orderBy('v.ordre') ->andWhere('v.these = :these') ->setParameter('these', $these); /** @var array $array */ $workflow = []; /** @var WfEtape $prec */ $prec = null; $q = $qb->getQuery()->setHint(Query::HINT_REFRESH, true); // setHint indispensable pour les tests fonctionnels foreach ($q->getResult() as $i => $array) { /** @var VWorkflow $r */ $r = $array[0]; $atteignable = $array['atteignable']; $r->setAtteignable($atteignable); // injection des étapes précédente et suivante $e = $r->getEtape(); /** @var VWorkflow $vwf */ foreach ($q->getResult() as $vwf) { // injection de l'étape précédente $e = $vwf->getEtape(); $e->setPrecedente($prec); $prec = $e; // injection des témoins d'état $e->setAtteignable($r->getAtteignable()); $e->setFranchie($r->getFranchie()); $e->setAtteignable($vwf->getAtteignable()); $e->setFranchie($vwf->getFranchie()); $workflow[] = $r; $workflow[] = $vwf; } $this->loaded[$these->getId()] = $workflow; Loading module/Application/tests/ApplicationFunctionalTest/Service/Workflow/WorkflowServiceAbstractTest.php +4 −3 Changes for module/Application/tests/ApplicationFunctionalTest/Service/Workflow/WorkflowServiceAbstractTest.php: 4 added lines, 3 removed lines. Original line number Diff line number Diff line Loading @@ -3,6 +3,7 @@ namespace ApplicationFunctionalTest\Service\Workflow; use Application\Entity\Db\Fichier; use Application\Entity\Db\FichierThese; use Application\Entity\Db\NatureFichier; use Application\Entity\Db\Role; use Application\Entity\Db\These; Loading Loading @@ -217,7 +218,7 @@ abstract class WorkflowServiceAbstractTest extends AbstractControllerTestCase protected function _deposer_fichier_version_originale($corrigee = false) { $version = $corrigee ? VersionFichier::CODE_ORIG_CORR : VersionFichier::CODE_ORIG; $fichier = $this->ep()->fichier($this->these, NatureFichier::CODE_THESE_PDF, $version); $fichier = $this->ep()->fichierThese($this->these, NatureFichier::CODE_THESE_PDF, $version); $this->em()->flush($fichier); } Loading Loading @@ -289,7 +290,7 @@ abstract class WorkflowServiceAbstractTest extends AbstractControllerTestCase // Seul franchissement possible : // - insertion d'un fichier (version d'archivage) $fichier = $this->ep()->fichier($this->these, NatureFichier::CODE_THESE_PDF, $version); $fichier = $this->ep()->fichierThese($this->these, NatureFichier::CODE_THESE_PDF, $version); $this->em()->flush($fichier); $this->wfs->reloadWorkflow($this->these); } Loading @@ -316,7 +317,7 @@ abstract class WorkflowServiceAbstractTest extends AbstractControllerTestCase { $version = $corrigee ? VersionFichier::CODE_ARCHI_CORR : VersionFichier::CODE_ARCHI; /** @var Fichier $fichier */ /** @var FichierThese $fichier */ $fichier = $this->these->getFichiersByNatureEtVersion(NatureFichier::CODE_THESE_PDF, $version, false)->first(); // Franchissement Loading Loading
data/SQL/1.2.0/30_optimis-wf.sql 0 → 100644 +541 −0 Changes for data/SQL/1.2.0/30_optimis-wf.sql: 541 added lines, 0 removed lines. Original line number Diff line number Diff line -- -- Amélioration V_WORKFLOW : il devient inutile d'utiliser APP_WORKFLOW.ATTEIGNABLE() :-) -- create or replace view V_WORKFLOW as SELECT ROWNUM as id, t.THESE_ID, t.ETAPE_ID, t.CODE, t.ORDRE, t.FRANCHIE, t.RESULTAT, t.OBJECTIF, -- NB: dans les 3 lignes suivantes, c'est la même expression 'dense_rank() over(...)' qui est répétée : (dense_rank() over(partition by t.THESE_ID, t.FRANCHIE order by t.ORDRE)) dense_rank, case when t.FRANCHIE = 1 or (dense_rank() over(partition by t.THESE_ID, t.FRANCHIE order by t.ORDRE)) = 1 then 1 else 0 end atteignable, case when (dense_rank() over(partition by t.THESE_ID, t.FRANCHIE order by t.ORDRE)) = 1 and t.FRANCHIE = 0 then 1 else 0 end courante FROM ( -- -- VALIDATION_PAGE_DE_COUVERTURE : franchie si version page de couverture validée -- SELECT t.id AS these_id, e.id AS etape_id, e.code, e.ORDRE, CASE WHEN v.valide IS NULL THEN 0 ELSE 1 END franchie, CASE WHEN v.valide IS NULL THEN 0 ELSE 1 END resultat, 1 objectif FROM these t JOIN WF_ETAPE e ON e.code = 'VALIDATION_PAGE_DE_COUVERTURE' LEFT JOIN V_SITU_VALIDATION_PAGE_COUV v ON v.these_id = t.id UNION ALL -- -- DEPOT_VERSION_ORIGINALE : franchie si version originale déposée -- SELECT t.id AS these_id, e.id AS etape_id, e.code, e.ORDRE, CASE WHEN v.fichier_id IS NULL THEN 0 ELSE 1 END franchie, CASE WHEN v.fichier_id IS NULL THEN 0 ELSE 1 END resultat, 1 objectif FROM these t JOIN WF_ETAPE e ON e.code = 'DEPOT_VERSION_ORIGINALE' LEFT JOIN V_SITU_DEPOT_VO v ON v.these_id = t.id UNION ALL -- -- ATTESTATIONS : franchie si données saisies -- SELECT t.id AS these_id, e.id AS etape_id, e.code, e.ORDRE, CASE WHEN v.attestation_id IS NULL THEN 0 ELSE 1 END franchie, CASE WHEN v.attestation_id IS NULL THEN 0 ELSE 1 END resultat, 1 objectif FROM these t JOIN WF_ETAPE e ON e.code = 'ATTESTATIONS' LEFT JOIN V_SITU_ATTESTATIONS v ON v.these_id = t.id UNION ALL -- -- AUTORISATION_DIFFUSION_THESE : franchie si données saisies -- SELECT t.id AS these_id, e.id AS etape_id, e.code, e.ORDRE, CASE WHEN v.diffusion_id IS NULL THEN 0 ELSE 1 END franchie, CASE WHEN v.diffusion_id IS NULL THEN 0 ELSE 1 END resultat, 1 objectif FROM these t JOIN WF_ETAPE e ON e.code = 'AUTORISATION_DIFFUSION_THESE' LEFT JOIN V_SITU_AUTORIS_DIFF_THESE v ON v.these_id = t.id UNION ALL -- -- SIGNALEMENT_THESE : franchie si données saisies -- SELECT t.id AS these_id, e.id AS etape_id, e.code, e.ORDRE, CASE WHEN v.description_id IS NULL THEN 0 ELSE 1 END franchie, CASE WHEN v.description_id IS NULL THEN 0 ELSE 1 END resultat, 1 objectif FROM these t JOIN WF_ETAPE e ON e.code = 'SIGNALEMENT_THESE' LEFT JOIN V_SITU_SIGNALEMENT_THESE v ON v.these_id = t.id UNION ALL -- -- ARCHIVABILITE_VERSION_ORIGINALE : franchie si l'archivabilité de la version originale a été testée -- SELECT t.id AS these_id, e.id AS etape_id, e.code, e.ORDRE, CASE WHEN v.THESE_ID IS NULL THEN 0 ELSE 1 END franchie, -- CASE WHEN v.THESE_ID IS NULL THEN -- 0 -- test d'archivabilité inexistant -- ELSE -- CASE WHEN v.EST_VALIDE IS NULL THEN -- 1 -- test d'archivabilité existant mais résultat indéterminé (plantage) -- ELSE -- CASE WHEN v.EST_VALIDE = 1 THEN -- 1 -- test d'archivabilité réussi -- ELSE -- 0 -- test d'archivabilité échoué -- END -- END -- END franchie, CASE WHEN v.EST_VALIDE IS NULL OR v.EST_VALIDE = 0 THEN 0 ELSE 1 END resultat, 1 objectif FROM these t JOIN WF_ETAPE e ON e.code = 'ARCHIVABILITE_VERSION_ORIGINALE' LEFT JOIN V_SITU_ARCHIVAB_VO v ON v.these_id = t.id UNION ALL -- -- DEPOT_VERSION_ARCHIVAGE : franchie si version d'archivage déposée -- SELECT t.id AS these_id, e.id AS etape_id, e.code, e.ORDRE, CASE WHEN v.fichier_id IS NULL THEN 0 ELSE 1 END franchie, CASE WHEN v.fichier_id IS NULL THEN 0 ELSE 1 END resultat, 1 objectif FROM these t JOIN WF_ETAPE e ON e.code = 'DEPOT_VERSION_ARCHIVAGE' LEFT JOIN V_SITU_DEPOT_VA v ON v.these_id = t.id LEFT JOIN fichier f ON f.id = v.fichier_id UNION ALL -- -- ARCHIVABILITE_VERSION_ARCHIVAGE : franchie si l'archivabilité de la version d'archivage a été testée -- SELECT t.id AS these_id, e.id AS etape_id, e.code, e.ORDRE, CASE WHEN v.EST_VALIDE IS NULL THEN 0 ELSE 1 END franchie, CASE WHEN v.EST_VALIDE IS NULL OR v.EST_VALIDE = 0 THEN 0 ELSE 1 END resultat, 1 objectif FROM these t JOIN WF_ETAPE e ON e.code = 'ARCHIVABILITE_VERSION_ARCHIVAGE' LEFT JOIN V_SITU_ARCHIVAB_VA v ON v.these_id = t.id UNION ALL -- -- VERIFICATION_VERSION_ARCHIVAGE : franchie si vérification de la version originale effectuée (peu importe la réponse) -- SELECT t.id AS these_id, e.id AS etape_id, e.code, e.ORDRE, CASE WHEN v.EST_CONFORME IS NULL THEN 0 ELSE 1 END franchie, CASE WHEN v.EST_CONFORME IS NULL OR v.EST_CONFORME = 0 THEN 0 ELSE 1 END resultat, 1 objectif FROM these t JOIN WF_ETAPE e ON e.code = 'VERIFICATION_VERSION_ARCHIVAGE' LEFT JOIN V_SITU_VERIF_VA v ON v.these_id = t.id UNION ALL -- -- RDV_BU_SAISIE_DOCTORANT : franchie si données doctorant saisies -- SELECT t.id AS these_id, e.id AS etape_id, e.code, e.ORDRE, coalesce(v.ok, 0) franchie, (CASE WHEN rdv.COORD_DOCTORANT IS NULL THEN 0 ELSE 1 END + CASE WHEN rdv.DISPO_DOCTORANT IS NULL THEN 0 ELSE 1 END) resultat, 2 objectif FROM these t JOIN WF_ETAPE e ON e.code = 'RDV_BU_SAISIE_DOCTORANT' LEFT JOIN V_SITU_RDV_BU_SAISIE_DOCT v ON v.these_id = t.id LEFT JOIN RDV_BU rdv ON rdv.THESE_ID = t.id UNION ALL -- -- -- -- RDV_BU_SAISIE_BU : franchie si données BU saisies -- -- -- SELECT -- t.id AS these_id, -- e.id AS etape_id, -- e.code, -- e.ORDRE, -- coalesce(v.ok, 0) franchie, -- CASE WHEN rdv.MOTS_CLES_RAMEAU IS NULL THEN 0 ELSE 1 END + -- coalesce(rdv.VERSION_ARCHIVABLE_FOURNIE, 0) + -- coalesce(rdv.EXEMPL_PAPIER_FOURNI, 0) + -- coalesce(rdv.CONVENTION_MEL_SIGNEE, 0) resultat, -- 4 objectif -- FROM these t -- JOIN WF_ETAPE e ON e.code = 'RDV_BU_SAISIE_BU' -- LEFT JOIN V_SITU_RDV_BU_SAISIE_BU v ON v.these_id = t.id -- LEFT JOIN RDV_BU rdv ON rdv.THESE_ID = t.id -- -- UNION ALL -- -- RDV_BU_VALIDATION_BU : franchie si données BU saisies ET une validation BU existe -- SELECT t.id AS these_id, e.id AS etape_id, e.code, e.ORDRE, coalesce(vs.ok, 0) * coalesce(v.valide, 0) franchie, coalesce(vs.ok, 0) + coalesce(v.valide, 0) resultat, 2 objectif FROM these t JOIN WF_ETAPE e ON e.code = 'RDV_BU_VALIDATION_BU' LEFT JOIN V_SITU_RDV_BU_SAISIE_BU vs ON vs.these_id = t.id LEFT JOIN V_SITU_RDV_BU_VALIDATION_BU v ON v.these_id = t.id UNION ALL -- -- DEPOT_VERSION_ORIGINALE_CORRIGEE : franchie si version originale corrigée déposée -- SELECT t.id AS these_id, e.id AS etape_id, e.code, e.ORDRE, CASE WHEN v.fichier_id IS NULL THEN 0 ELSE 1 END franchie, CASE WHEN v.fichier_id IS NULL THEN 0 ELSE 1 END resultat, 1 objectif FROM these t JOIN WF_ETAPE e ON e.code = 'DEPOT_VERSION_ORIGINALE_CORRIGEE' LEFT JOIN V_SITU_DEPOT_VOC v ON v.these_id = t.id UNION ALL -- -- ATTESTATIONS_VERSION_CORRIGEE : franchie si données saisies -- SELECT t.id AS these_id, e.id AS etape_id, e.code, e.ORDRE, CASE WHEN v.attestation_id IS NULL THEN 0 ELSE 1 END franchie, CASE WHEN v.attestation_id IS NULL THEN 0 ELSE 1 END resultat, 1 objectif FROM these t JOIN WF_ETAPE e ON e.code = 'ATTESTATIONS_VERSION_CORRIGEE' LEFT JOIN V_SITU_ATTESTATIONS_VOC v ON v.these_id = t.id UNION ALL -- -- AUTORISATION_DIFFUSION_THESE_VERSION_CORRIGEE : franchie si données saisies -- SELECT t.id AS these_id, e.id AS etape_id, e.code, e.ORDRE, CASE WHEN v.diffusion_id IS NULL THEN 0 ELSE 1 END franchie, CASE WHEN v.diffusion_id IS NULL THEN 0 ELSE 1 END resultat, 1 objectif FROM these t JOIN WF_ETAPE e ON e.code = 'AUTORISATION_DIFFUSION_THESE_VERSION_CORRIGEE' LEFT JOIN V_SITU_AUTORIS_DIFF_THESE_VOC v ON v.these_id = t.id UNION ALL -- -- ARCHIVABILITE_VERSION_ORIGINALE_CORRIGEE : franchie si l'archivabilité de la version originale corrigée a été testée -- SELECT t.id AS these_id, e.id AS etape_id, e.code, e.ORDRE, CASE WHEN v.THESE_ID IS NULL THEN 0 ELSE 1 END franchie, CASE WHEN v.EST_VALIDE IS NULL OR v.EST_VALIDE = 0 THEN 0 ELSE 1 END resultat, 1 objectif FROM these t JOIN WF_ETAPE e ON e.code = 'ARCHIVABILITE_VERSION_ORIGINALE_CORRIGEE' LEFT JOIN V_SITU_ARCHIVAB_VOC v ON v.these_id = t.id UNION ALL -- -- DEPOT_VERSION_ARCHIVAGE_CORRIGEE : franchie si version d'archivage corrigée déposée -- SELECT t.id AS these_id, e.id AS etape_id, e.code, e.ORDRE, CASE WHEN v.fichier_id IS NULL THEN 0 ELSE 1 END franchie, CASE WHEN v.fichier_id IS NULL THEN 0 ELSE 1 END resultat, 1 objectif FROM these t JOIN WF_ETAPE e ON e.code = 'DEPOT_VERSION_ARCHIVAGE_CORRIGEE' LEFT JOIN V_SITU_DEPOT_VAC v ON v.these_id = t.id LEFT JOIN fichier f ON f.id = v.fichier_id UNION ALL -- -- ARCHIVABILITE_VERSION_ARCHIVAGE_CORRIGEE : franchie si la version d'archivage corrigée est archivable -- SELECT t.id AS these_id, e.id AS etape_id, e.code, e.ORDRE, CASE WHEN v.EST_VALIDE = 1 THEN 1 ELSE 0 END franchie, CASE WHEN v.EST_VALIDE = 1 THEN 1 ELSE 0 END resultat, 1 objectif FROM these t JOIN WF_ETAPE e ON e.code = 'ARCHIVABILITE_VERSION_ARCHIVAGE_CORRIGEE' LEFT JOIN V_SITU_ARCHIVAB_VAC v ON v.these_id = t.id UNION ALL -- -- VERIFICATION_VERSION_ARCHIVAGE_CORRIGEE : franchie si la version corrigée est certifiée conforme -- SELECT t.id AS these_id, e.id AS etape_id, e.code, e.ORDRE, CASE WHEN v.EST_CONFORME = 1 THEN 1 ELSE 0 END franchie, CASE WHEN v.EST_CONFORME = 1 THEN 1 ELSE 0 END resultat, 1 objectif FROM these t JOIN WF_ETAPE e ON e.code = 'VERIFICATION_VERSION_ARCHIVAGE_CORRIGEE' LEFT JOIN V_SITU_VERIF_VAC v ON v.these_id = t.id UNION ALL -- -- DEPOT_VERSION_CORRIGEE_VALIDATION_DOCTORANT : franchie si la validation attendue existe -- SELECT t.id AS these_id, e.id AS etape_id, e.code, e.ORDRE, coalesce(v.valide, 0) franchie, coalesce(v.valide, 0) resultat, 1 objectif FROM these t JOIN WF_ETAPE e ON e.code = 'DEPOT_VERSION_CORRIGEE_VALIDATION_DOCTORANT' LEFT JOIN V_SITU_DEPOT_VC_VALID_DOCT v ON v.these_id = t.id UNION ALL -- -- DEPOT_VERSION_CORRIGEE_VALIDATION_DIRECTEUR : franchie si toutes les validations attendues existent -- select * from ( WITH tmp AS ( SELECT these_id, sum(valide) AS resultat, count(valide) AS objectif FROM V_SITU_DEPOT_VC_VALID_DIR GROUP BY these_id ) SELECT t.id AS these_id, e.id AS etape_id, e.code, e.ORDRE, case when coalesce(v.resultat, 0) = v.objectif then 1 else 0 end franchie, coalesce(v.resultat, 0) resultat, v.objectif FROM these t JOIN WF_ETAPE e ON e.code = 'DEPOT_VERSION_CORRIGEE_VALIDATION_DIRECTEUR' LEFT JOIN tmp v ON v.these_id = t.id ) UNION ALL -- -- REMISE_EXEMPLAIRE_PAPIER_THESE_CORRIGEE : franchie pas pour le moment -- select * from ( WITH tmp_last AS ( SELECT THESE_ID as these_id, count(THESE_ID) AS resultat FROM V_SITU_VERSION_PAPIER_CORRIGEE GROUP BY THESE_ID ) SELECT t.id AS these_id, e.id AS etape_id, e.code, e.ORDRE, coalesce(tl.resultat, 0) franchie, 0, 1 FROM these t JOIN WF_ETAPE e ON e.code = 'REMISE_EXEMPLAIRE_PAPIER_THESE_CORRIGEE' LEFT JOIN tmp_last tl ON tl.these_id = t.id ) ) t JOIN V_WF_ETAPE_PERTIN v ON t.these_id = v.these_id AND t.etape_id = v.etape_id / -- -- APP_WORKFLOW.ATTEIGNABLE() devient inutile, on le garde quand même un moment en souvenir. -- create or replace PACKAGE APP_WORKFLOW AS /** * @deprecated depuis l'utilisation de 'dense_rank' pour calculer les témoins 'attegnable' et 'courant' * dans la vue V_WORKFLOW. */ function atteignable(p_etape_id NUMERIC, p_these_id NUMERIC) return NUMERIC; END APP_WORKFLOW; / create or replace PACKAGE BODY APP_WORKFLOW AS /** * @deprecated depuis l'utilisation de 'dense_rank' pour calculer les témoins 'attegnable' et 'courant' * dans la vue V_WORKFLOW. */ function atteignable(p_etape_id NUMERIC, p_these_id NUMERIC) return NUMERIC AS v_ordre numeric; BEGIN select ordre into v_ordre from wf_etape where id = p_etape_id; --DBMS_OUTPUT.PUT_LINE('ordre ' || v_ordre); for row in ( select code, ORDRE, franchie, resultat, objectif from V_WORKFLOW v where v.these_id = p_these_id and v.ordre < v_ordre order by v.ordre ) loop --DBMS_OUTPUT.PUT_LINE(rpad(row.ordre, 5) || ' ' || row.code || ' : ' || row.franchie); if row.franchie = 0 then return 0; end if; end loop; RETURN 1; END atteignable; END APP_WORKFLOW; / /* select * from V_WORKFLOW v2_ INNER JOIN THESE t1_ ON v2_.THESE_ID = t1_.ID INNER JOIN WF_ETAPE w0_ ON v2_.ETAPE_ID = w0_.ID where THESE_ID = 38307 order by THESE_ID, v2_.ORDRE / select * from V_WORKFLOW v JOIN THESE t ON v.THESE_ID = t.ID join WF_ETAPE e on v.ETAPE_ID = e.id where e.CODE = 'DEPOT_VERSION_ORIGINALE' and courante = 1 order by THESE_ID, v.ORDRE / */ No newline at end of file
module/Application/src/Application/Entity/Db/Mapping/Application.Entity.Db.VWorkflow.dcm.xml +2 −0 Changes for module/Application/src/Application/Entity/Db/Mapping/Application.Entity.Db.VWorkflow.dcm.xml: 2 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -7,6 +7,8 @@ <field name="ordre" type="integer" column="ORDRE" nullable="false" /> <field name="franchie" type="boolean" column="FRANCHIE" nullable="false" /> <field name="atteignable" type="boolean" column="ATTEIGNABLE" nullable="false" /> <field name="courante" type="boolean" column="COURANTE" nullable="false" /> <field name="resultat" type="integer" column="RESULTAT" nullable="false" /> <field name="objectif" type="integer" column="OBJECTIF" nullable="false" /> Loading
module/Application/src/Application/Entity/Db/VWorkflow.php +15 −11 Changes for module/Application/src/Application/Entity/Db/VWorkflow.php: 15 added lines, 11 removed lines. Original line number Diff line number Diff line <?php namespace Application\Entity\Db; use Application\Entity\VWorkflowNull; /** Loading Loading @@ -34,10 +35,15 @@ class VWorkflow private $franchie = false; /** * @var integer * @var bool */ private $atteignable = false; /** * @var bool */ private $courante = false; /** * @var integer */ Loading Loading @@ -128,6 +134,14 @@ class VWorkflow return (bool) $this->atteignable; } /** * @return bool */ public function getCourante() { return (bool) $this->courante; } /** * Get resultat * Loading @@ -150,16 +164,6 @@ class VWorkflow /** * @param int $atteignable * @return VWorkflow */ public function setAtteignable($atteignable) { $this->atteignable = $atteignable; return $this; } /** * @return static Loading
module/Application/src/Application/Service/Workflow/WorkflowService.php +9 −15 Changes for module/Application/src/Application/Service/Workflow/WorkflowService.php: 9 added lines, 15 removed lines. Original line number Diff line number Diff line Loading @@ -54,7 +54,7 @@ class WorkflowService extends BaseService /** * @param These $these * @return \Application\Entity\Db\VWorkflow[] * @return VWorkflow[] */ public function reloadWorkflow(These $these) { Loading @@ -64,7 +64,7 @@ class WorkflowService extends BaseService /** * @param These $these * @param bool $forceRefresh * @return \Application\Entity\Db\VWorkflow[] * @return VWorkflow[] */ private function loadWorkflow(These $these, $forceRefresh = false) { Loading @@ -75,36 +75,30 @@ class WorkflowService extends BaseService $qb = $this->getRepository()->createQueryBuilder('v'); $qb ->addSelect('e, t') ->addSelect('atteignable(e, t) atteignable') ->join('v.these', 't') ->join('v.etape', 'e') ->orderBy('v.ordre') ->andWhere('v.these = :these') ->setParameter('these', $these); /** @var array $array */ $workflow = []; /** @var WfEtape $prec */ $prec = null; $q = $qb->getQuery()->setHint(Query::HINT_REFRESH, true); // setHint indispensable pour les tests fonctionnels foreach ($q->getResult() as $i => $array) { /** @var VWorkflow $r */ $r = $array[0]; $atteignable = $array['atteignable']; $r->setAtteignable($atteignable); // injection des étapes précédente et suivante $e = $r->getEtape(); /** @var VWorkflow $vwf */ foreach ($q->getResult() as $vwf) { // injection de l'étape précédente $e = $vwf->getEtape(); $e->setPrecedente($prec); $prec = $e; // injection des témoins d'état $e->setAtteignable($r->getAtteignable()); $e->setFranchie($r->getFranchie()); $e->setAtteignable($vwf->getAtteignable()); $e->setFranchie($vwf->getFranchie()); $workflow[] = $r; $workflow[] = $vwf; } $this->loaded[$these->getId()] = $workflow; Loading
module/Application/tests/ApplicationFunctionalTest/Service/Workflow/WorkflowServiceAbstractTest.php +4 −3 Changes for module/Application/tests/ApplicationFunctionalTest/Service/Workflow/WorkflowServiceAbstractTest.php: 4 added lines, 3 removed lines. Original line number Diff line number Diff line Loading @@ -3,6 +3,7 @@ namespace ApplicationFunctionalTest\Service\Workflow; use Application\Entity\Db\Fichier; use Application\Entity\Db\FichierThese; use Application\Entity\Db\NatureFichier; use Application\Entity\Db\Role; use Application\Entity\Db\These; Loading Loading @@ -217,7 +218,7 @@ abstract class WorkflowServiceAbstractTest extends AbstractControllerTestCase protected function _deposer_fichier_version_originale($corrigee = false) { $version = $corrigee ? VersionFichier::CODE_ORIG_CORR : VersionFichier::CODE_ORIG; $fichier = $this->ep()->fichier($this->these, NatureFichier::CODE_THESE_PDF, $version); $fichier = $this->ep()->fichierThese($this->these, NatureFichier::CODE_THESE_PDF, $version); $this->em()->flush($fichier); } Loading Loading @@ -289,7 +290,7 @@ abstract class WorkflowServiceAbstractTest extends AbstractControllerTestCase // Seul franchissement possible : // - insertion d'un fichier (version d'archivage) $fichier = $this->ep()->fichier($this->these, NatureFichier::CODE_THESE_PDF, $version); $fichier = $this->ep()->fichierThese($this->these, NatureFichier::CODE_THESE_PDF, $version); $this->em()->flush($fichier); $this->wfs->reloadWorkflow($this->these); } Loading @@ -316,7 +317,7 @@ abstract class WorkflowServiceAbstractTest extends AbstractControllerTestCase { $version = $corrigee ? VersionFichier::CODE_ARCHI_CORR : VersionFichier::CODE_ARCHI; /** @var Fichier $fichier */ /** @var FichierThese $fichier */ $fichier = $this->these->getFichiersByNatureEtVersion(NatureFichier::CODE_THESE_PDF, $version, false)->first(); // Franchissement Loading