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

Connecteur SIFAC documenté, essais de formatage du tab

parent defaaab1
......@@ -659,236 +659,3 @@ FROM
LEFT JOIN element_pedagogique ep ON ep.source_code = afq.z_element_pedagogique_id
AND ep.annee_id = afq.annee_id
LEFT JOIN type_intervention ti ON ti.code = afq.z_type_intervention_id;
-----------------------------------------------------
-- Pour la comptabilité analytique avec SIFAC
-----------------------------------------------------
-- Table de correspondance entre nos codes SIFAC et les codes de structure Harpège
CREATE TABLE UNICAEN_CORRESP_STRUCTURE_CC(
"ID" NUMBER(*,0) NOT NULL ENABLE,
"CODE_SIFAC" VARCHAR2(15 CHAR) NOT NULL ENABLE,
"CODE_HARPEGE" VARCHAR2(250 CHAR) NOT NULL ENABLE,
CONSTRAINT "UNICAEN_CORRESP_STR_CC_PK" PRIMARY KEY ("ID")
);
Insert into UNICAEN_CORRESP_STRUCTURE_CC (ID,CODE_SIFAC,CODE_HARPEGE) values ('1','901','U01');
Insert into UNICAEN_CORRESP_STRUCTURE_CC (ID,CODE_SIFAC,CODE_HARPEGE) values ('2','902','U02');
Insert into UNICAEN_CORRESP_STRUCTURE_CC (ID,CODE_SIFAC,CODE_HARPEGE) values ('3','903','U03');
Insert into UNICAEN_CORRESP_STRUCTURE_CC (ID,CODE_SIFAC,CODE_HARPEGE) values ('4','904','U04');
Insert into UNICAEN_CORRESP_STRUCTURE_CC (ID,CODE_SIFAC,CODE_HARPEGE) values ('5','907','U07');
Insert into UNICAEN_CORRESP_STRUCTURE_CC (ID,CODE_SIFAC,CODE_HARPEGE) values ('6','908','U08');
Insert into UNICAEN_CORRESP_STRUCTURE_CC (ID,CODE_SIFAC,CODE_HARPEGE) values ('7','909','U09');
Insert into UNICAEN_CORRESP_STRUCTURE_CC (ID,CODE_SIFAC,CODE_HARPEGE) values ('8','910','U10');
Insert into UNICAEN_CORRESP_STRUCTURE_CC (ID,CODE_SIFAC,CODE_HARPEGE) values ('9','911','I11');
Insert into UNICAEN_CORRESP_STRUCTURE_CC (ID,CODE_SIFAC,CODE_HARPEGE) values ('10','912','I12');
Insert into UNICAEN_CORRESP_STRUCTURE_CC (ID,CODE_SIFAC,CODE_HARPEGE) values ('11','913','I13');
Insert into UNICAEN_CORRESP_STRUCTURE_CC (ID,CODE_SIFAC,CODE_HARPEGE) values ('12','914','U14');
Insert into UNICAEN_CORRESP_STRUCTURE_CC (ID,CODE_SIFAC,CODE_HARPEGE) values ('13','917','M17');
Insert into UNICAEN_CORRESP_STRUCTURE_CC (ID,CODE_SIFAC,CODE_HARPEGE) values ('14','920','U36');
Insert into UNICAEN_CORRESP_STRUCTURE_CC (ID,CODE_SIFAC,CODE_HARPEGE) values ('15','924','U24');
Insert into UNICAEN_CORRESP_STRUCTURE_CC (ID,CODE_SIFAC,CODE_HARPEGE) values ('16','925','U25');
Insert into UNICAEN_CORRESP_STRUCTURE_CC (ID,CODE_SIFAC,CODE_HARPEGE) values ('17','926','U26');
Insert into UNICAEN_CORRESP_STRUCTURE_CC (ID,CODE_SIFAC,CODE_HARPEGE) values ('18','945','C45');
Insert into UNICAEN_CORRESP_STRUCTURE_CC (ID,CODE_SIFAC,CODE_HARPEGE) values ('19','950','UNIV');
Insert into UNICAEN_CORRESP_STRUCTURE_CC (ID,CODE_SIFAC,CODE_HARPEGE) values ('20','953','C53');
Insert into UNICAEN_CORRESP_STRUCTURE_CC (ID,CODE_SIFAC,CODE_HARPEGE) values ('21','961','C61');
Insert into UNICAEN_CORRESP_STRUCTURE_CC (ID,CODE_SIFAC,CODE_HARPEGE) values ('22','971','U55');
Insert into UNICAEN_CORRESP_STRUCTURE_CC (ID,CODE_SIFAC,CODE_HARPEGE) values ('23','980','E01');
Insert into UNICAEN_CORRESP_STRUCTURE_CC (ID,CODE_SIFAC,CODE_HARPEGE) values ('24','011','11');
Insert into UNICAEN_CORRESP_STRUCTURE_CC (ID,CODE_SIFAC,CODE_HARPEGE) values ('25','012','12');
Insert into UNICAEN_CORRESP_STRUCTURE_CC (ID,CODE_SIFAC,CODE_HARPEGE) values ('33','911','15');
Insert into UNICAEN_CORRESP_STRUCTURE_CC (ID,CODE_SIFAC,CODE_HARPEGE) values ('34','912','15');
Insert into UNICAEN_CORRESP_STRUCTURE_CC (ID,CODE_SIFAC,CODE_HARPEGE) values ('35','913','15');
Insert into UNICAEN_CORRESP_STRUCTURE_CC (ID,CODE_SIFAC,CODE_HARPEGE) values ('36','015','15');
-- SRC_CENTRE_COUT
-- les EOTP (deuxième partie de requête) sont considérés par OSE comme des centres de coûts dépendant d'un autre centre de coûts (hiérarchie)
-- les règle de gestion (nomenclature en fonction de l'analyse du code du centre de coûts) sont propres à l'université de CAEN et devront être adaptées
CREATE OR REPLACE FORCE VIEW SRC_CENTRE_COUT AS
WITH sifac_query 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 'paie-etat'
WHEN LENGTH(a.kostl) > 5 THEN 'ressources-propres'
END z_type_ressource_id,
substr( A.kostl, 2, 3 ) unite_budgetaire,
NULL z_parent_id,
'SIFAC' z_source_id,
A.kostl source_code
FROM
sapsr3.csks@sifacp A,
sapsr3.cskt@sifacp B
WHERE
A.kostl=B.kostl(+)
and A.kokrs=B.kokrs(+)
and B.mandt(+)='500'
and B.spras(+)='F'
and A.kokrs='1010'
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')
UNION
SELECT
TRIM(A.post1) libelle,
CASE
WHEN a.fkstl 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 'paie-etat'
WHEN LENGTH(a.fkstl) > 5 THEN 'ressources-propres'
END z_type_ressource_id,
substr( A.fkstl, 2, 3 ) unite_budgetaire,
A.fkstl z_parent_id,
'SIFAC' z_source_id,
A.posid source_code
FROM
sapsr3.prps@sifacp A,
sapsr3.prte@sifacp B
WHERE
A.pspnr=B.posnr(+)
AND A.pkokr='1010'
AND B.mandt(+)='500'
AND a.fkstl LIKE 'P%' AND (a.fkstl like '%A' OR a.fkstl 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')
UNION
SELECT
TRIM(A.post1) libelle,
'enseignement' z_activite_id,
'ressources-propres' z_type_ressource_id,
substr( A.fkstl, 2, 3 ) unite_budgetaire,
null z_parent_id,
'SIFAC' z_source_id,
A.posid source_code
FROM
sapsr3.prps@sifacp A,
sapsr3.prte@sifacp B
WHERE
A.pspnr=B.posnr(+)
and A.pkokr='1010'
and B.mandt(+)='500'
AND (
A.posid IN ('P950FCFCR', 'P950FCFFR')
)
AND SYSDATE BETWEEN to_date( NVL(B.pstrt,'10661231'), 'YYYYMMDD') AND to_date( NVL(B.pende,'99991231'), 'YYYYMMDD')
)
SELECT
code,
libelle,
activite_id,
type_ressource_id,
unite_budgetaire,
poids,
parent_id,
source_id,
source_code
FROM
(
SELECT
sq.source_code code,
sq.libelle libelle,
a.id activite_id,
tr.id type_ressource_id,
sq.unite_budgetaire unite_budgetaire,
ROW_NUMBER() OVER (PARTITION BY sq.source_code ORDER BY sq.libelle) poids,
cc.id parent_id,
src.id source_id,
sq.source_code source_code
FROM
sifac_query sq
JOIN source src ON src.code = sq.z_source_id
LEFT JOIN cc_activite a ON a.code = sq.z_activite_id
LEFT JOIN type_ressource tr ON tr.code = sq.z_type_ressource_id
LEFT JOIN centre_cout cc ON cc.source_code = sq.z_parent_id
WHERE
sq.z_activite_id IS NOT NULL
) cc
WHERE
poids = 1;
-- SRC_CENTRE_COUT_STRUCTURE
CREATE OR REPLACE FORCE VIEW SRC_CENTRE_COUT_STRUCTURE AS
WITH cc AS (
SELECT
cc.id id,
cc.source_code source_code,
cc.source_code ori_source_code
FROM
centre_cout cc
LEFT JOIN centre_cout pcc ON pcc.id = cc.parent_id
WHERE
pcc.id IS NULL
UNION ALL
SELECT
cc.id id,
pcc.source_code source_code,
cc.source_code ori_source_code
FROM
centre_cout cc
JOIN centre_cout pcc ON pcc.id = cc.parent_id
)
SELECT
cc.id centre_cout_id,
s.id structure_id,
(SELECT id FROM source WHERE code='Calcul') source_id,
cc.ori_source_code || '_' || s.source_code source_code
FROM
unicaen_corresp_structure_cc ucs
JOIN cc ON substr( cc.source_code, 2, 3 ) = ucs.code_sifac
JOIN structure s ON s.source_code = CASE
WHEN cc.source_code = 'P950DRRA' THEN 'ECODOCT'
WHEN cc.source_code = 'P950FCFCR' THEN 'drh-formation'
WHEN cc.source_code = 'P950FCFFR' THEN 'drh-formation'
ELSE ucs.code_harpege
END;
-- SRC_DOMAINE_FONCTIONNEL
-- (récupération des libellés uniquement, la liste des codes est à adapter)
CREATE OR REPLACE FORCE VIEW SRC_DOMAINE_FONCTIONNEL AS
WITH sifac_query AS (
SELECT
B.fkbtx libelle,
'SIFAC' z_source_id,
A.fkber source_code
FROM
sapsr3.tfkb@sifacp A,
sapsr3.tfkbt@sifacp B
WHERE
A.mandt=B.mandt
AND A.fkber=B.fkber
AND B.SPRAS='F'
AND A.mandt='500'
AND SYSDATE BETWEEN to_date( NVL(A.datab,'10661231'), 'YYYYMMDD') AND to_date( NVL(A.datbis,'99991231'), 'YYYYMMDD')
AND a.fkber IN ('D101', 'D102', 'D103', 'D1053', 'D106', 'D107', 'D108', 'D109', 'D110', 'D111', 'D112', 'D1132', 'D1153')
)
SELECT
sq.libelle libelle,
s.id source_id,
sq.source_code source_code
FROM
sifac_query sq
JOIN source s ON s.code = sq.z_source_id;
......@@ -466,6 +466,11 @@ return [
'LIBELLE' => 'OSE',
'IMPORTABLE' => false,
],
[
'CODE' => 'Calcul',
'LIBELLE' => 'Calculée',
'IMPORTABLE' => true,
],
],
'TAUX_HORAIRE_HETD' => [
......
# Mécanisme
L'import de données se passe au niveau de la base de données.
Toutes les données exploitées par l'application doivent être enregistrées dans sa base de données.
Ceci implique donc d'y importer les données et de les synchroniser à intervalle régulier afin de les maintenir à jour.
Un certain nombre de tables de la base de données sont importables, c'est-à-dire qu'elles possèdent deux colonnes, SOURCE_ID et SOURCE_CODE qui permettent respectivement de
* Savoir quelle est la source de la donnée (SOURCE_ID faisant référence à SOURCE.ID, donc l'identifiant de la source).
* avoir, ligne par ligne, un identifiant **unique** qui permet d'établir la correspondance avec la donnée d'origine.
Les données à importer devront être listées dans des vues écrites au format attendu par OSE.
Le format est disponible directement dans l'application, page Administration / Synchronisation / Tableau de bord principal.
Généralement, les vues accèdent aux données en passant par des DBLinks, mais rien n'empêche de faire autrement.
OSE permet de faire quatre opérations d'importation :
* INSERT : pour ajouter une donnée
* UPDATE : mise à jour d'une donnée
* DELETE : pour supprimer une donnée (sachant que dans OSE les données ne sont pas réellement supprimées, mais historisées avec un horodatage)
* UNDELETE : pour restaurer une donnée qui avait été supprimée
# Sources de données
OSE peut accepter plusieurs sources de données.
Deux d'entres elles, particulières, sont présentes par défaut dans l'application.
La source "OSE" n'est pas vraiment une source de données. Une donnée dont la source est OSE signifie qu'elle a été saisie directement dans l'application.
Cette donnée ne pourra donc pas être récupérée ailleurs et elle ne peut pas être mise à jour de manière automatique.
La source "Calcul", quand à elle, est utilisée pour des données qui n'ont pas été saisies dans l'application, mais calculées et intégrées dans l'application
à partir d'autres données déjà présentes dans OSE en utilisant le mécanisme d'import de données.
Par exemple, dans le tableau ci-dessous nous avons la table TYPE_INTERVENTION_EP. Cette table permet de lister tous les types d'intervention (CM, TD)
pour lesquels il est possible de saisir des heures d'enseignement pour chaque élément pédagogique.
Cette information peut être déduite d'une autre, à savoir la présence de charges d'enseignement.
Donc nous prenons les charges et s'il il y en a par exemple en CM sur un élément de Maths, alors TYPE_INTERVENTION_EP sera peuplé
avec une ligne ("CM", "Maths") ce qui aura pour conséquence de pouvoir saisir des heures de service en CM sur cet élément de maths.
Les autres sources dont vous aurez la nécessité seront créées au besoin par vos soins.
Il est possible, pour une même table, d'intégrer des données provenant de plusieurs sources.
Par exemple à Caen l'offre de formation est à la fois
* importée d'Apogée
* importée de FCA Manager
* saisie directement dans OSE
Chaque élément aura donc comme source soit Apogée, soit FCA Manager, soit OSE.
Il n'existe en revanche qu'une seule vue source par table.
Il vous revient donc de fusionner les données de ces différentes sources au moyen d'un "UNION ALL".
Par ailleurs, OSE ne gère pas le dédoublonnage des données sources. A vous, donc, de gérer cet aspect.
**Pour chaque vue source, la colonne SOURCE_CODE doit avoir des valeurs uniques**.
# Connecteurs Import de OSE
* [Harpège](Harpège/Connecteur.md)
Il existe déjà plusieurs connecteurs. Ceux-ci vous sont fournis à titre d'exemple.
Ils devront être adaptés aux spécifités de votre système d'information.
En voici la liste :
* [Harpège](Harpège/Connecteur.md) pour les données RH et diverses
* [Sifac](Sifac/Connecteur.md) pour les données comptables
* [Apogée](Sifac/Connecteur.md) pour l'offre de formation
Matrice des connecteurs
Et voici la matrice des connecteurs qui reprend, table par table, ce qu'ils peuvent fournir :
| Table | Apogée | FCA Manager | Harpège | Sifac | Calcul | Description |
| --------------------- | ------ | ----------- | ------- | ----- | ------ | ----------- |
| _Données "RH"_ |
| AFFECTATION | | | | | | Affectation des utilisateurs à des rôles |
| AFFECTATION_RECHERCHE | | | Oui | | | Affectations de recherche des intervenants |
| CENTRE_COUT | | | | Oui | | Liste des centres de coûts |
| CENTRE_COUT_EP | | | | | | Relation n <=> nentre les centres de coûts et les éléments pédagogiques |
| CENTRE_COUT_STRUCTURE | | | | Oui | | Relation n <=> nentre les centres de coûts et les structures |
| CHEMIN_PEDAGOGIQUE | Oui | Oui | | | | Relation n <=> n entre les étapes et les éléments pédagogiques |
| GRADE | | | Oui | | | Liste des grades |
| INTERVENANT | | | Oui | | | Intervenants |
| |
| _Nomenclatures diverses_ |
| CORPS | | | Oui | | | Liste des corps |
| DEPARTEMENT | | | Oui | | | Liste des départements |
| DISCIPLINE | | | | | | Liste des disciplines (sections CNU, disc. second degré, etc) |
| EMPLOYEUR | | | | | | Liste des employeurs |
| ETABLISSEMENT | Oui | | | | | Liste des établissements |
| PAYS | | | Oui | | | Liste des pays |
| STRUCTURE | | | Oui | | | Liste des structures |
| VOIRIE | | | Oui | | | Liste des voiries |
| |
| <td colspan=3> _Données comptables_ |
| CENTRE_COUT | | | | Oui | | Liste des centres de coûts |
| CENTRE_COUT_EP | | | | | | Relation n <=> nentre les centres de coûts et les éléments pédagogiques |
| CENTRE_COUT_STRUCTURE | | | | | Oui | Relation n <=> nentre les centres de coûts et les structures |
| DOMAINE_FONCTIONNEL | | | | Oui | | Liste des domaines fonctionnels |
| |
| <td colspan=3>_Données décrivant l'offre de formation_ |
| CHEMIN_PEDAGOGIQUE | Oui | Oui | | | | Relation n <=> n entre les étapes et les éléments pédagogiques |
| EFFECTIFS | Oui | | | | | Effectifs étudiants par élément péagogique |
| EFFECTIFS_ETAPE | | | | | | Effectifs étudiants par étape |
| ELEMENT_PEDAGOGIQUE | Oui | Oui | | | | Liste des éléments pédagogiques |
| ELEMENT_TAUX_REGIMES | | | | | | Taux FI/FC/FA par élément pédagogique |
| EMPLOYEUR | | | | | | Liste des employeurs |
| ETABLISSEMENT | Oui | | | | | Liste des établissements |
| ETAPE | Oui | Oui | | | | Liste des étapes |
| GRADE | | | Oui | | | Liste des grades |
| GROUPE_TYPE_FORMATION | Oui | | | | | Liste des groupes de types de formation (License, Master, DU, etc.) |
| INTERVENANT | | | Oui | | | Intervenants |
| LIEN | Oui | | | | | Liens entre deux noeuds |
| NOEUD | Oui | | | | | Noeuds formant les arbres d'une formation, situés entre les étapes et les éléments pédagogiques |
| PAYS | | | Oui | | | Liste des pays |
| SCENARIO_LIEN | Oui | | | | | Paramétrage des liens |
| SCENARIO_NOEUD | Oui | | | | | Paramétrage des noeuds |
| TYPE_FORMATION | Oui | | | | | Liste des types de formation |
| |
<td colspan=5>_Données liées aux services d'enseignement_ |
| SERVICE | | | | | | Lignes de service intervenant (enseignement) |
| SERVICE_REFERENTIEL | | | | | | Lignes de service intervenant (référentiel) |
| STRUCTURE | | | Oui | | | Liste des structures |
| TYPE_FORMATION | Oui | | | | | Liste des types de formation |
| TYPE_INTERVENTION_EP | | | | | Oui | Relation n <=> n spécifiant quels types d'intervention sont pertinents par élément pédagogique |
| TYPE_MODULATEUR_EP | | | | | Oui | Relation n <=> n spécifiant quels types de modulateurs sont pertinents par élément pédagogique |
| VOIRIE | | | Oui | | | Liste des voiries |
| VOLUME_HORAIRE | | | | | | Volumes horaires (grain fin de la saisie de service : heures d'enseignement) |
| VOLUME_HORAIRE_CHARGE | | | | | | Table non exploitée : à ignorer |
| VOLUME_HORAIRE_ENS | | | | | | Charge d'enseingement |
| VOLUME_HORAIRE_ENS | Oui | | | | | Charge d'enseingement |
| VOLUME_HORAIRE_REF | | | | | | Volumes horaires (grain fin de la saisie de service : heures de référentiel) |
\ No newline at end of file
# Connecteur Sifac
Le connecteur Sifac permet de synchroniser en import :
* les domaines fonctionnels
* les centres de coûts et les EOTP
* les relations entre les centres de coûts et les structures
Les vues qui vont sont fournies ci-dessous ne représentent qu'un exemple. Il vous revient de les adapter à votre contexte afin que vous
retrouviez dans OSE les données dont vous avez besoin.
## Mise en place du DbLink
Le lien avec Sifac se fait au moyen d'un DbLink que vous devrez créer.
Dans cet exemple, le DbLink s'appellera `sifacp`.
## Déclaration du connecteur dans OSE
OSE doit lister toutes ses sources de données.
Il faut donc y ajouter Harpège :
```sql
BEGIN
unicaen_import.add_source('SIFAC', 'SIFAC');
commit;
END;
```
## Récupération des domaines fonctionnels
La liste des domaines fonctionnels est écrite directement dans la requête.
La vue source ne sert ici qu'à en récupérer les libellés de SIFAC.
[SRC_DOMAINE_FONCTIONNEL](SRC_DOMAINE_FONCTIONNEL.sql).
## Import des centres de coûts et des EOTP
Dans OSE, un EOTP est considéré comme un "sous-centre de coûts".
A un EOTP correspond un unique centre de coûts, son parent.
A un centre de coûts peut correspondre de 0 à n EOTP.
Ces deux types de données sont importés dans une même vue.
A chaque centre de coûts sont associés :
* Un type d'activité (pilotage, enseignement ou accueil)
* Un type de ressources (Paie état ou ressources propres)
Ces données sont déduites de l'analyse du code du centre de coûts.
Ces derniers sont en effet nommés en respectant certaines conventions spécifiques à l'Université de Caen.
Vous devrez donc adapter la vue ci-dessous à vos propres conventions.
Du code du centre de coûts nous déduisons également l'unité budgétaire. Cette information nous permettra ensuite
de savoir à quelle composante il peut être associé.
Créez la vue [SRC_CENTRE_COUT](SRC_CENTRE_COUT.sql).
## Import de la relation centres de coûts / structures
Une stucture peut avoir plusieurs centres de coûts.
Un centre de coûts peut être partagé par plusieurs structures.
Avant de pouvoir lier les centres de coûts aux structures, il est nécessaire d'établir la correspondance
entre les unités budgétaires SIFAC et les codes des structures que nous utilisons.
Cette information n'étant pas présente dans le système d'information de l'Université de Caen, nous
avons dû créer une table qui la porte.
En voici la définition à titre d'exemple. A vous d'adapter ce dispositif à votre contexte.
Créez et peuplez la table [UNICAEN_CORRESP_STRUCTURE_CC](UNICAEN_CORRESP_STRUCTURE_CC.sql).
Ensuite, la vue Import ci-dessous va se baser sur cette table.
Notez que dans cette vue import, la source de données n'est pas Sifac puisque l'information n'y est pas présente, mais "Calcul".
"Calcul" est utilisé par convention pour désigner des données calculées à partir d'autres données présentes dans OSE.
Source "Calcul" à bien distinguer de la source "OSE", cette dernière signifiant que la donnée a été directement saisie dans OSE, sans qu'elle ne soit importée.
Créez la vue [SRC_CENTRE_COUT_STRUCTURE](SRC_CENTRE_COUT_STRUCTURE.sql).
\ No newline at end of file
CREATE OR REPLACE FORCE VIEW SRC_CENTRE_COUT AS
WITH sifac_query 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 'paie-etat'
WHEN LENGTH(a.kostl) > 5 THEN 'ressources-propres'
END z_type_ressource_id,
substr( A.kostl, 2, 3 ) unite_budgetaire,
NULL z_parent_id,
'SIFAC' z_source_id,
A.kostl source_code
FROM
sapsr3.csks@sifacp A,
sapsr3.cskt@sifacp B
WHERE
A.kostl=B.kostl(+)
and A.kokrs=B.kokrs(+)
and B.mandt(+)='500'
and B.spras(+)='F'
and A.kokrs='1010'
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')-30 AND to_date( NVL(A.datbi,'99991231'), 'YYYYMMDD')
UNION
SELECT
TRIM(A.post1) libelle,
CASE
WHEN a.fkstl 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 'paie-etat'
WHEN LENGTH(a.fkstl) > 5 THEN 'ressources-propres'
END z_type_ressource_id,
substr( A.fkstl, 2, 3 ) unite_budgetaire,
A.fkstl z_parent_id,
'SIFAC' z_source_id,
A.posid source_code
FROM
sapsr3.prps@sifacp A,
sapsr3.prte@sifacp B
WHERE
A.pspnr=B.posnr(+)
AND A.pkokr='1010'
AND B.mandt(+)='500'
AND a.fkstl LIKE 'P%' AND (a.fkstl like '%A' OR a.fkstl like '%B' OR a.fkstl like '%M')
AND SYSDATE BETWEEN to_date( NVL(B.pstrt,'10661231'), 'YYYYMMDD')-30 AND to_date( NVL(B.pende,'99991231'), 'YYYYMMDD')
UNION
SELECT
TRIM(A.post1) libelle,
'enseignement' z_activite_id,
'ressources-propres' z_type_ressource_id,
substr( A.fkstl, 2, 3 ) unite_budgetaire,
null z_parent_id,
'SIFAC' z_source_id,
A.posid source_code
FROM
sapsr3.prps@sifacp A,
sapsr3.prte@sifacp B
WHERE
A.pspnr=B.posnr(+)
and A.pkokr='1010'
and B.mandt(+)='500'
AND (
A.posid IN ('P950FCFCR', 'P950FCFFR')
)
AND SYSDATE BETWEEN to_date( NVL(B.pstrt,'10661231'), 'YYYYMMDD')-30 AND to_date( NVL(B.pende,'99991231'), 'YYYYMMDD')
)
SELECT
code,
libelle,
activite_id,
type_ressource_id,
unite_budgetaire,
poids,
parent_id,
source_id,
source_code
FROM
(
SELECT
sq.source_code code,
sq.libelle libelle,
a.id activite_id,
tr.id type_ressource_id,
sq.unite_budgetaire unite_budgetaire,
ROW_NUMBER() OVER (PARTITION BY sq.source_code ORDER BY sq.libelle) poids,
cc.id parent_id,
src.id source_id,
sq.source_code source_code
FROM
sifac_query sq
JOIN source src ON src.code = sq.z_source_id
LEFT JOIN cc_activite a ON a.code = sq.z_activite_id
LEFT JOIN type_ressource tr ON tr.code = sq.z_type_ressource_id
LEFT JOIN centre_cout cc ON cc.source_code = sq.z_parent_id
WHERE
sq.z_activite_id IS NOT NULL
) cc
WHERE
poids = 1;
\ No newline at end of file
CREATE OR REPLACE FORCE VIEW SRC_CENTRE_COUT_STRUCTURE AS
WITH cc AS (
SELECT
cc.id id,
cc.source_code source_code,
cc.source_code ori_source_code
FROM
centre_cout cc
LEFT JOIN centre_cout pcc ON pcc.id = cc.parent_id
WHERE
pcc.id IS NULL
UNION ALL
SELECT
cc.id id,
pcc.source_code source_code,