Commit 693f4c08 authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

Correction d'un bug dans le package Oracle APP_IMPORT qui ne filtrait pas les...

Correction d'un bug dans le package Oracle APP_IMPORT qui ne filtrait pas les thèses selon l'établissement spécifié.
parent a288d75c
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -12,6 +12,7 @@ Idem pour les attestations et le privilège "Modification des attestations conce
- Optimisation de l'export CSV des thèses
- Pages de téléversement et de recherche des rapports annuels.
- Correction d'un bug dans la recherche de thèses par nom du doctorant.
- Correction d'un bug dans le package Oracle APP_IMPORT qui ne filtrait pas les thèses selon l'établissement spécifié.
- Possibilité d'attribuer un "identifiant permanent" à un fichier (ex: 'RAPPORT_ANNUEL_MODELE') facilitant l'intégration
  de lien de téléchargement de ce fichier dans une page.
- Listes de diffusion dynamique Sympa alimentées par SyGAL : pages de consultation des listes de diffusion déclarées
+103 −0
Original line number Diff line number Diff line
@@ -131,4 +131,107 @@ insert into PRIVILEGE(ID, CATEGORIE_ID, CODE, LIBELLE, ORDRE)
--
-- ATTENTION >>> Dans l'interface graphique, accorder ces nouveaux privilèges aux profils voulus (a minima Doctorant et AdminTech).
--

create or replace PACKAGE BODY "APP_IMPORT"
IS
    PROCEDURE REFRESH_MV( mview_name VARCHAR2 ) IS
    BEGIN
        DBMS_MVIEW.REFRESH(mview_name, 'C');
    EXCEPTION WHEN OTHERS THEN
        UNICAEN_IMPORT.SYNC_LOG( SQLERRM, mview_name );
    END;

    PROCEDURE SYNC_TABLES
        IS
    BEGIN
        -- mise à jour des tables à partir des vues sources
        -- NB: l'ordre importe !
        UNICAEN_IMPORT.MAJ_STRUCTURE();
        UNICAEN_IMPORT.MAJ_ETABLISSEMENT();
        UNICAEN_IMPORT.MAJ_ECOLE_DOCT();
        UNICAEN_IMPORT.MAJ_UNITE_RECH();
        UNICAEN_IMPORT.MAJ_INDIVIDU();
        UNICAEN_IMPORT.MAJ_DOCTORANT();
        UNICAEN_IMPORT.MAJ_THESE();
        UNICAEN_IMPORT.MAJ_THESE_ANNEE_UNIV();
        UNICAEN_IMPORT.MAJ_ROLE();
        UNICAEN_IMPORT.MAJ_ACTEUR();
        UNICAEN_IMPORT.MAJ_VARIABLE();
        UNICAEN_IMPORT.MAJ_FINANCEMENT();
        UNICAEN_IMPORT.MAJ_TITRE_ACCES();
        REFRESH_MV('MV_RECHERCHE_THESE'); -- NB: à faire en dernier
    END;

    --
    -- Recherche des changements de type UPDATE concernant la colonne de table observée et
    -- enregistrement de ces changements dans une table.
    --
    PROCEDURE STORE_UPDATE_OBSERV_RESULT(importObservEtab IMPORT_OBSERV_ETAB%ROWTYPE)
        IS
        u_col_name VARCHAR2(50);
        where_to_value CLOB;
        i_query CLOB;
        importObserv IMPORT_OBSERV%ROWTYPE;

        TYPE r_cursor is REF CURSOR;
        rc r_cursor;
        l_id CLOB;
        l_detail CLOB;
    BEGIN
        select * into importObserv from IMPORT_OBSERV where id = importObservEtab.IMPORT_OBSERV_ID;

        -- Construction du nom de la colonne de la vue V_DIFF_X indiquant un changement de valeur dans la table X.
        -- Ex: 'U_RESULTAT' (dans la vue V_DIFF_THESE, indiquant que la colonne THESE.RESULTAT a changé).
        u_col_name := 'U_' || importObserv.COLUMN_NAME;

        -- Construction de la clause permettant de ne prendre en compte que la prise de valeur qui nous intéresse.
        -- Ex: "v.COLONNE = 'VALEUR'" ou "v.COLONNE IS NULL".
        where_to_value := 'v.' || importObserv.COLUMN_NAME ||
                          case when importObserv.TO_VALUE is null then ' is null' else ' = ''' || importObserv.TO_VALUE || '''' end;

        -- Construction de la requête recherchant dans la vue V_DIFF_X les lignes correspondant à :
        -- une prise de valeur particulière spécifiée par IMPORT_OBSERV.TO_VALUE,
        -- de la colonne spécifiée par IMPORT_OBSERV.COLUMN_NAME,
        -- dans la table spécifiée par IMPORT_OBSERV.TABLE_NAME.
        i_query := 'select v.source_code, t.' || importObserv.COLUMN_NAME || ' || ''>'' || v.' || importObserv.COLUMN_NAME || ' detail ' ||
                   'from V_DIFF_' || importObserv.TABLE_NAME || ' v ' ||
                   'join ' || importObserv.TABLE_NAME || ' t on t.source_code = v.source_code ' ||
                   'join etablissement e on t.etablissement_id = ' || importObservEtab.ETABLISSEMENT_ID || ' ' ||
                   'where ' || u_col_name || ' = 1 and ' || where_to_value || ' ' ||
                   'order by v.source_code';

        --DBMS_OUTPUT.PUT_LINE(i_query);
        OPEN rc FOR i_query;
        LOOP
            FETCH rc INTO l_id, l_detail;
            EXIT WHEN rc%NOTFOUND;
            --DBMS_OUTPUT.PUT_LINE(l_id); DBMS_OUTPUT.PUT_LINE(l_detail);
            insert into IMPORT_OBSERV_ETAB_RESULT(ID, IMPORT_OBSERV_ETAB_ID, DATE_CREATION, SOURCE_CODE, RESULTAT, TOO_OLD)
            values (IMPORT_OBSERV_RESULT_ID_SEQ.nextval, importObservEtab.ID, sysdate, l_id, l_detail, 0);
        END LOOP;
    END;

    PROCEDURE STORE_OBSERV_RESULTS
        IS
    BEGIN
        -- Parcours des IMPORT_OBSERV_ETAB de type UPDATE et non désactivés.
        for importObservEtab in (
            select ioe.*
            from IMPORT_OBSERV_ETAB ioe
                     join IMPORT_OBSERV io on ioe.IMPORT_OBSERV_ID = io.ID and io.OPERATION = 'UPDATE'
            where ioe.ENABLED = 1
            ) loop
                STORE_UPDATE_OBSERV_RESULT(importObservEtab);
            end loop;
    END;

    PROCEDURE SYNCHRONISATION
        IS
    BEGIN
        STORE_OBSERV_RESULTS;
        SYNC_TABLES;
    END;

END APP_IMPORT;
/
```