pour déploiement auto v2 via gitlab
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

499 lines
15 KiB

return: text
lang: plpgsql
src: |
DECLARE
ref REFCURSOR;
seq TEXT;
sequence_gm TEXT := '';
request TEXT := '';
resultat TEXT := '';
case_cmd TEXT := '';
gm_classe_code TEXT := 'CTI_GM_MSAP_2015';
BEGIN
RAISE NOTICE '%' , 'Check si pmsi.p_rss_gm existe';
-- Vérifie l'existance de la table pmsi.p_rss_gm
IF NOT EXISTS (SELECT table_name FROM information_schema.tables WHERE table_name = 'p_rss_gm' AND table_schema = 'pmsi') THEN
RAISE NOTICE '%' , 'Création de la table pmsi.p_rss_gm';
CREATE TABLE pmsi.p_rss_gm (finess text, rss_id bigint, gm_principal_id bigint);
CREATE INDEX i_rss_gm_1 ON pmsi.p_rss_gm USING btree (rss_id);
END IF;
-- Présélection des RSS à traiter :
-- RSS post 2011 avec au moins un acte faisant partie des gestes marqueurs
RAISE NOTICE '%' , 'Preselection des donnees';
DROP TABLE IF EXISTS w_actes_c;
CREATE TEMP TABLE w_actes_c AS
SELECT *
FROM pmsi.t_actes_c
WHERE section_id[12] > 0
;
ANALYSE w_actes_c
;
CREATE INDEX w_actes_c_i1 ON w_actes_c USING btree (oid);
DROP TABLE IF EXISTS w_rss_actes;
CREATE TEMP TABLE w_rss_actes (
finess text,
rss_id bigint,
acte_id bigint,
acte_code text,
icr numeric,
gm_2015_id bigint,
gm_2015_code text,
nb_gm_2015 bigint,
nombre bigint);
INSERT INTO w_rss_actes
SELECT
p_rss.finess,
p_rss_actes.rss_id,
p_rss_actes.acte_id,
w_actes_c.code AS acte_code,
w_actes_c.icr_1 AS icr,
w_actes_c.section_id[12] as gm_2015_id,
w_actes_c.section_code[12] as gm_2015_code,
0 as nb_gm_2015,
sum(p_rss_actes.nombre) as nombre
FROM
pmsi.p_rss_actes
JOIN w_actes_c ON p_rss_actes.acte_id = w_actes_c.oid
JOIN pmsi.p_rss ON p_rss.oid = p_rss_actes.rss_id
WHERE 1=1
AND p_rss.date_sortie >= (date_trunc('year', now()) - interval '2 year')::date
AND p_rss_actes.activite_ccam = '1'
--and no_rss = 246789
GROUP BY 1,2,3,4,5,6,7,8
ORDER BY 1,2,4;
ANALYSE w_rss_actes
;
CREATE INDEX w_rss_actes_i1 ON w_rss_actes USING btree (rss_id);
-- Acte spécial BELB001
DROP TABLE IF EXISTS w_rss_actes_belb001;
CREATE TEMP TABLE w_rss_actes_belb001 AS
SELECT rss_id
FROM pmsi.v_rss_actes_3
WHERE acte_code = 'BELB001'
GROUP BY 1
;
ANALYSE w_rss_actes_belb001
;
CREATE INDEX w_rss_actes_belb001_i1 ON w_rss_actes_belb001 USING btree (rss_id);
-- Récupère le numéros de séquence de la classe des gestes marqueurs principaux
request := 'SELECT sequence FROM pmsi.t_classes WHERE t_classes.code = ''' || gm_classe_code || ''' AND t_classes.is_cti = ''1'';';
OPEN ref FOR
EXECUTE request;
-- Construction de la requête qui fait un case when géant sur tous les gestes marqueurs
-- On ne tient pas compte des conditons liées aux gestes marqueurs isolés (conditions sur le champ 'condition_gm_ok')
LOOP
FETCH ref INTO seq;
IF NOT FOUND THEN EXIT; END IF;
sequence_gm = seq;
request := '
SELECT base.cti_group_concat_without_sep(case_when)
FROM
(
SELECT '' CASE'' AS case_when
UNION
(
SELECT
'' WHEN gm_2015_id = '' ||
t_classes_sections.oid ||
CASE WHEN t_classes_sections.condition <> '''' AND strpos(t_classes_sections.condition, ''condition_gm_ok'') = 0 THEN '' AND '' ||
t_classes_sections.condition ELSE '''' END ||
'' THEN 1 ''
FROM pmsi.t_classes, pmsi.t_classes_sections, pmsi.t_listes_tables
WHERE
t_classes_sections.classe_id = t_classes.oid
AND t_classes.table_id = t_listes_tables.oid
AND t_listes_tables.code = ''ACTE''
AND t_classes.sequence = ' || seq || '::numeric
ORDER BY t_classes_sections.oid
)
UNION
SELECT ''ELSE 0 END''
ORDER BY 1
) subview';
FOR resultat IN EXECUTE(request) LOOP
--RAISE NOTICE 'Resultat : %', resultat;
case_cmd := resultat;
END LOOP;
END LOOP;
CLOSE ref;
-- Création d'une table d'actes avec les gestes marqueurs conditionnés
RAISE NOTICE '%' , 'Estampillage des gestes marqueurs (avec condition) sur les RSS';
DROP TABLE IF EXISTS w_actes;
request := '
CREATE TEMP TABLE w_actes AS
SELECT
v_rss_actes_1.finess,
v_rss_actes_1.rss_id,
v_rss_actes_1.acte_id AS acte_id,
v_rss_actes_1.acte_code AS acte_code,
v_rss_actes_1.icr AS icr,
CASE WHEN ' || case_cmd || ' = 1 THEN gm_2015_id ELSE 0 END AS acte_section_id
FROM
w_rss_actes v_rss_actes_1
JOIN pmsi.v_rss_12 v_rss_1 ON v_rss_1.rss_id = v_rss_actes_1.rss_id
ORDER BY 1, 2, 3 DESC
';
-- RAISE NOTICE 'Request : %', request;
EXECUTE (request);
ANALYSE w_actes
;
CREATE INDEX w_actes_i1 ON w_actes USING btree (rss_id)
;
CREATE INDEX w_actes_i2 ON w_actes USING btree (acte_id)
;
-----------------------------------------------------
RAISE NOTICE '%' , 'Traitement des gestes isoles _ 1ere partie';
-- Comptage des gestes marqueurs différents par RSS
DROP TABLE IF EXISTS w_count;
CREATE TEMP TABLE w_count AS
SELECT
finess, rss_id, count(distinct gm_2015_id) as nb_2015
FROM w_rss_actes
GROUP BY 1, 2;
---------------------------------------------------
-- Mise à jour du nombre de GM différents dans la table de travail
UPDATE w_rss_actes SET
nb_gm_2015 = nb_2015
FROM
w_count
WHERE
w_count.rss_id = w_rss_actes.rss_id
AND w_count.finess = w_rss_actes.finess;
DROP TABLE IF EXISTS w_count;
---------------------------------------------------------------------
-- GESTES ISOLES
---------------------------------------------------------------------
-- 1ere partie : Séjour comprenant un ou plusieurs actes du même geste marqueur non associés à un acte d’un autre geste marqueur
DROP TABLE IF EXISTS w_rss_gm_isoles;
CREATE TEMP TABLE w_rss_gm_isoles(finess text, rss_id bigint, gm_2015_id bigint);
-- NFFC002 sur le geste marqueur GM06 doit être un geste isolé
INSERT INTO w_rss_gm_isoles
SELECT
finess,
rss_id,
gm_2015_id
FROM
w_rss_actes
WHERE 1=1
AND nb_gm_2015 > 1
AND gm_2015_code = 'GM06'
AND acte_code ='NFFC002'
GROUP BY 1,2,3;
-- MHFA001 sur le geste marqueur GM10 doit être un geste isolé
INSERT INTO w_rss_gm_isoles
SELECT
finess,
rss_id,
gm_2015_id
FROM
w_rss_actes
WHERE 1=1
AND nb_gm_2015 > 1
AND gm_2015_code = 'GM10'
AND acte_code ='MHFA001'
GROUP BY 1,2,3;
-- le geste marqueur GM19 doit être un geste isolé
INSERT INTO w_rss_gm_isoles
SELECT
finess,
rss_id,
gm_2015_id
FROM
w_rss_actes
WHERE 1=1
AND nb_gm_2015 > 1
AND gm_2015_code = 'GM19'
GROUP BY 1,2,3;
-- MGCC001 sur le geste marqueur GM30 doit être un geste isolé
INSERT INTO w_rss_gm_isoles
SELECT
finess,
rss_id,
gm_2015_id
FROM
w_rss_actes
WHERE 1=1
AND nb_gm_2015 > 1
AND gm_2015_code = 'GM30'
AND acte_code = 'MGCC001'
GROUP BY 1,2,3;
-- le geste marqueur GM39 doit être un geste isolé
INSERT INTO w_rss_gm_isoles
SELECT
finess,
rss_id,
gm_2015_id
FROM
w_rss_actes
WHERE 1=1
AND nb_gm_2015 > 1
AND gm_2015_code = 'GM39'
GROUP BY 1,2,3;
-- HASA013 sur le geste marqueur GM41 doit être un geste isolé
INSERT INTO w_rss_gm_isoles
SELECT
finess,
rss_id,
gm_2015_id
FROM
w_rss_actes
WHERE 1=1
AND nb_gm_2015 > 1
AND gm_2015_code = 'GM41'
AND acte_code = 'HASA013'
GROUP BY 1,2,3;
-- JCAE001 et JCKE002 sur le geste marqueur GM46 doivent être un geste isolé
INSERT INTO w_rss_gm_isoles
SELECT
finess,
rss_id,
gm_2015_id
FROM
w_rss_actes
WHERE 1=1
AND nb_gm_2015 > 1
AND gm_2015_code = 'GM46'
AND acte_code = 'JCAE001'
GROUP BY 1,2,3;
INSERT INTO w_rss_gm_isoles
SELECT
finess,
rss_id,
gm_2015_id
FROM
w_rss_actes
WHERE 1=1
AND nb_gm_2015 > 1
AND gm_2015_code = 'GM46'
AND acte_code = 'JCKE002'
GROUP BY 1,2,3;
-- le geste marqueur GM26 doit être un geste isolé sauf associé à un BELB001
INSERT INTO w_rss_gm_isoles
SELECT
w_rss_actes.finess,
w_rss_actes.rss_id,
w_rss_actes.gm_2015_id
FROM
w_rss_actes
LEFT JOIN w_rss_actes_belb001 ON w_rss_actes.rss_id = w_rss_actes_belb001.rss_id
WHERE 1=1
AND nb_gm_2015 > 1
AND gm_2015_code = 'GM26'
AND w_rss_actes_belb001 IS NULL
GROUP BY 1,2,3;
-- le geste marqueur GM13 doivent être des gestes isolés et rélisés de manière unilatérale
-- ce dernier critère peut s'exprimer par un nombre d'activite 1 pour cet acte = 1
INSERT INTO w_rss_gm_isoles
SELECT
finess,
rss_id,
gm_2015_id
FROM
w_rss_actes
WHERE 1=1
AND nb_gm_2015 > 1
AND gm_2015_code = 'GM13'
AND nombre > 1
GROUP BY 1,2,3;
-- idem pour GM 19
INSERT INTO w_rss_gm_isoles
SELECT
finess,
rss_id,
gm_2015_id
FROM
w_rss_actes
WHERE 1=1
AND nb_gm_2015 > 1
AND gm_2015_code = 'GM19'
AND nombre > 1
GROUP BY 1,2,3;
-- idem pour GM 29
INSERT INTO w_rss_gm_isoles
SELECT
finess,
rss_id,
gm_2015_id
FROM
w_rss_actes
WHERE 1=1
AND nb_gm_2015 > 1
AND gm_2015_code = 'GM29'
AND nombre > 1
GROUP BY 1,2,3;
-- hors associtation avec GM26 pour GM 27, 54 et 55
INSERT INTO w_rss_gm_isoles
SELECT
finess,
rss_id,
gm_2015_id
FROM
w_rss_actes
WHERE 1=1
AND gm_2015_code IN ('GM27','GM54','GM55')
AND rss_id != ALL(Array(SELECT DISTINCT rss_id FROM w_rss_actes WHERE gm_2015_code = 'GM26')::bigint[])
GROUP BY 1,2,3;
-- Suppression des RSS qui ont plusieurs gestes marqueurs (ou plusieurs actes ou une mauvaise association) et dont la condition stipule un geste isolé (ou unilateral ou une bonne association associé)
/*
DELETE FROM w_rss_actes
USING w_rss_gm_isoles
WHERE 1=1
AND w_rss_actes.rss_id = w_rss_gm_isoles.rss_id
AND w_rss_actes.gm_2015_id = w_rss_gm_isoles.gm_2015_id;
*/
DELETE FROM w_actes
USING w_rss_gm_isoles
WHERE 1=1
AND w_actes.finess = w_rss_gm_isoles.finess
AND w_actes.rss_id = w_rss_gm_isoles.rss_id
AND w_actes.acte_section_id = w_rss_gm_isoles.gm_2015_id;
DROP TABLE IF EXISTS w_rss_gm_isoles;
-- 2eme partie : Séjours comprenant un ou plusieurs actes du même geste marqueur non associés à un acte de la liste fermée des «actes classant opératoires »
RAISE NOTICE '%' , 'Traitement des gestes isoles _ 2eme partie';
-- Liste des RSS qui n'ont qu'un geste marqueur faisant partie de la liste des gestes marqueurs devant être isolés
DROP TABLE IF EXISTS w_geste_isole;
CREATE TEMP TABLE w_geste_isole AS
SELECT
w_rss_actes.finess,
w_rss_actes.rss_id,
w_rss_actes.gm_2015_id,
w_rss_actes.gm_2015_code
FROM
w_rss_actes
LEFT JOIN w_rss_actes_belb001 ON w_rss_actes.rss_id = w_rss_actes_belb001.rss_id
WHERE 1=1
AND nb_gm_2015 = 1
AND
(
(gm_2015_code = 'GM06' and acte_code = 'NFFC002') OR
(gm_2015_code = 'GM10' and acte_code = 'MHFA001') OR
(gm_2015_code = 'GM13') OR
(gm_2015_code = 'GM19') OR
(gm_2015_code = 'GM26' AND w_rss_actes_belb001 IS NULL) OR
(gm_2015_code = 'GM29') OR
(gm_2015_code = 'GM30' and acte_code = 'MGCC001') OR
(gm_2015_code = 'GM39') OR
(gm_2015_code = 'GM41' and acte_code = 'HASA013') OR
(gm_2015_code = 'GM46' and acte_code = 'JCAE001') OR
(gm_2015_code = 'GM46' and acte_code = 'JCKE002')
)
GROUP BY 1, 2, 3, 4;
ANALYSE w_geste_isole
;
CREATE INDEX w_geste_isole_i1 ON w_geste_isole USING btree (rss_id);
-- Liste des RSS (avec leurs actes) avec un seul geste marqueur faisant partie de la liste des gestes marqueurs devant être isolés
-- et avec au moins un acte ne faisant pas partie des actes du geste marqueur
DROP TABLE IF EXISTS w_liste_actes;
CREATE TEMP TABLE w_liste_actes (finess text, rss_id bigint, gm_2015_id bigint, gm_2015_code text, liste_actes text[]);
INSERT INTO w_liste_actes
SELECT
v_rss_actes_3.finess,
v_rss_actes_3.rss_id,
w_geste_isole.gm_2015_id,
w_geste_isole.gm_2015_code,
base.cti_array_accum(v_rss_actes_3.acte_code::text) as liste_actes
FROM
pmsi.v_rss_actes_3
JOIN w_geste_isole using (rss_id)
WHERE 1=1
AND (
(w_geste_isole.gm_2015_code = 'GM06' AND v_rss_actes_3.acte_section_code[12] <> 'GM06') OR
(w_geste_isole.gm_2015_code = 'GM10' AND v_rss_actes_3.acte_section_code[12] <> 'GM10') OR
(w_geste_isole.gm_2015_code = 'GM13' AND v_rss_actes_3.acte_section_code[12] <> 'GM13') OR
(w_geste_isole.gm_2015_code = 'GM19' AND v_rss_actes_3.acte_section_code[12] <> 'GM19') OR
(w_geste_isole.gm_2015_code = 'GM26' AND v_rss_actes_3.acte_section_code[12] <> 'GM26') OR
(w_geste_isole.gm_2015_code = 'GM29' AND v_rss_actes_3.acte_section_code[12] <> 'GM29') OR
(w_geste_isole.gm_2015_code = 'GM30' AND v_rss_actes_3.acte_section_code[12] <> 'GM30') OR
(w_geste_isole.gm_2015_code = 'GM39' AND v_rss_actes_3.acte_section_code[12] <> 'GM39') OR
(w_geste_isole.gm_2015_code = 'GM41' AND v_rss_actes_3.acte_section_code[12] <> 'GM41') OR
(w_geste_isole.gm_2015_code = 'GM46' AND v_rss_actes_3.acte_section_code[12] <> 'GM46')
)
GROUP BY 1, 2, 3, 4;
DROP TABLE IF EXISTS w_geste_isole;
-- Suppression des gestes marqueurs pour les séjours qui ont un acte ne faisant pas partie du geste marqueur et faisant partie de la liste des actes opératoires classants
DELETE FROM w_actes
USING w_liste_actes
WHERE 1=1
AND w_actes.finess = w_liste_actes.finess
AND w_actes.rss_id = w_liste_actes.rss_id
AND w_actes.acte_section_id = w_liste_actes.gm_2015_id
AND w_liste_actes.liste_actes && (select array(SELECT t_actes.code FROM pmsi.t_listes_contenu JOIN pmsi.t_listes ON t_listes.oid = t_listes_contenu.liste_id JOIN pmsi.t_actes on t_actes.oid = t_listes_contenu.to_id WHERE t_listes.code = 'CTI_AOP_11F'))::text[];
DROP TABLE IF EXISTS w_liste_actes;
-- Affectation d'un geste marqueur principal au RSS. Si plusieurs gestes marqueurs sur le RSS, le geste marqueur principal est celui de l'acte avec le plus fort ICR
RAISE NOTICE '%' , 'Peuplement de la table p_rss_gm';
TRUNCATE pmsi.p_rss_gm;
EXECUTE
'INSERT INTO pmsi.p_rss_gm
(
finess,
rss_id,
gm_principal_id
)
(
SELECT
finess,
rss_id,
(max(array[icr, acte_section_id]))[2] AS gm_principal_id
FROM w_actes
WHERE w_actes.acte_section_id > 0
GROUP BY 1,2
ORDER BY 1,2
)'
;
-- Mise à jour des Flags gm_condition_ok pour les actes qui doivent être des gestes isolés
RAISE NOTICE '%' , 'Flag actes';
UPDATE pmsi.p_rss_actes
SET condition_gm_ok = '1'
FROM
w_actes
WHERE 1=1
AND p_rss_actes.rss_id = w_actes.rss_id
AND p_rss_actes.finess = w_actes.finess
AND p_rss_actes.acte_id = w_actes.acte_id
AND w_actes.acte_code = any(array['NFFC002', 'MHFA001', 'NDPA004', 'NDPA009', 'NHMA002', 'LMMA006', 'LMMA009','LMMC020', 'BFEA001','BFGA001','BFGA002','BFGA003','BFGA004','BFGA427','BFGA005','BFGA006','BFGA007','BFGA008','BFGA009','BFGA010','BFKA001','BFLA001','BFLA002','BFLA003','BFLA004','MGCC001','NDGA003','NJPA007','NDFA002','NGFA002','HAFA021','HAFA034','HASA013','JCAE001','JCKE002'])
AND COALESCE(condition_gm_ok,'') <> '1'
;
DROP TABLE IF EXISTS w_actes;
RETURN 'OK';
END;