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.
 
 

430 lines
19 KiB

return: text
lang: plpgsql
src: |
DECLARE
result TEXT;
BEGIN
RAISE NOTICE '%' , 'Suppression des elements de la table p_rss_rea';
TRUNCATE pmsi.p_rss_rea;
RAISE NOTICE '%' , 'listes utilisees par l''etude REA';
DROP TABLE IF EXISTS w_listes_rea
;
CREATE TEMP TABLE w_listes_rea AS
SELECT liste_code, to_id FROM pmsi.v_listes_3 WHERE v_listes_3.liste_code IN ('CTI_VIT15_10A', 'CTI_VIT15_20A')
;
----------------------- **
RAISE NOTICE '%' , 'Creation table temp_pmsi000378_rss';
--Table temp_pmsi000378_rss :
--
--finess ................................ : Finess du RSS
--no_rss ................................ : Numéro du RSS
--oid ................................... : Id du RSS
--date_sortie ........................... : Date de sortie du RSS
--age ................................... : Age du patient
--rea_facturee_nb_rss ................... : REA facturé (1 ou 0)
--rea_facturee_nb_prestations ........... : Nombre de REA facturés
--rea_facturee_base_remboursement ....... : Montant des REA facturés
--rea_facturable_nb_rss ................. : REA facturable (1 ou 0)
--rea_facturable_nb_prestations ......... : Nombre de REA facturables
--rea_facturable_base_remboursement ..... : Montant des REA facturables
--rea_facturable_regle .................. : Numéro de la règle qui permet de facturer un REA
--rea_facturable_regle_justificatif ..... : Texte de la règle qui permet de facturer un REA
--rea_passage_nb_rss .................... : Passage dans une UM avec autorisation '01' (REA)
--rea_passage_duree_sejour .............. : Nombre de jours dans l'UM avec autorisation '03'
--rea_passage_base_remboursement ........ : S/O
--rea_facturable_sans_rea_ni_igs_nb_rss . :
DROP TABLE IF EXISTS temp_pmsi000378_rss;
CREATE TEMP TABLE temp_pmsi000378_rss(
finess character(9),
no_rss bigint,
oid bigint,
date_sortie date,
age integer,
rea_facturee_nb_rss numeric(5) DEFAULT 0,
rea_facturee_nb_prestations numeric(5) DEFAULT 0,
rea_facturee_base_remboursement numeric(11, 2) DEFAULT 0,
rea_facturable_nb_rss numeric(5) DEFAULT 0,
rea_facturable_nb_prestations numeric(5) DEFAULT 0,
rea_facturable_base_remboursement numeric(11, 2) DEFAULT 0,
rea_facturable_regle character(1) DEFAULT '',
rea_facturable_regle_justificatif character varying(255) DEFAULT '',
rea_passage_nb_rss numeric(5) DEFAULT 0,
rea_passage_duree_sejour numeric(5) DEFAULT 0,
rea_passage_base_remboursement numeric(11, 2) DEFAULT 0,
rea_facturable_sans_rea_ni_igs_nb_rss numeric(5) DEFAULT 0
);
CREATE INDEX temp_pmsi000378_rss_i1
ON temp_pmsi000378_rss
USING btree
(oid);
----------------------- **
RAISE NOTICE '%' , 'Creation table temp_pmsi000367_rsf_detail';
--Table temp_pmsi000367_rsf_detail :
--
--date_debut ............ : Date d'entrée dans le RUM
--date_fin .............. : Date de sortie du RUM
--nombre ................ : Nombre de journées dans le RUM (minimum 1)
--prix_unitaire ......... : Tarif unitaire du supplément juournalier
--base_remboursement .... : Montant total du supplément journalier
--coefficient_mco ....... : Coefficient MCO
--prestation_id ......... : Identifiant de la prestation
--regle ................. : Numéro de la règle d'attribution d'un supplément REA
--rss_id ................ : Identifiant du Séjour
DROP TABLE IF EXISTS temp_pmsi000367_rsf_detail;
CREATE TEMP TABLE temp_pmsi000367_rsf_detail
(
date_debut date,
date_fin date,
nombre numeric(13,2) DEFAULT 1,
prix_unitaire numeric(13,2) DEFAULT 0,
base_remboursement numeric(13,2) DEFAULT 0,
coefficient_mco numeric(5,4) DEFAULT 0,
prestation_id bigint DEFAULT 0,
regle character(1) DEFAULT '',
rss_id bigint DEFAULT 0
);
----------------------- **
RAISE NOTICE '%' , 'Selection de tous les dossiers';
INSERT INTO temp_pmsi000378_rss(finess, no_rss, oid, date_sortie, age)
SELECT
finess,
no_rss,
oid AS rss_id,
date_sortie,
age
FROM
pmsi.p_rss
WHERE p_rss.etat <> 'S';
----------------------- **
RAISE NOTICE '%' , 'Dossiers avec supplement REA facture';
UPDATE temp_pmsi000378_rss SET
rea_facturee_nb_rss = nb_rss,
rea_facturee_nb_prestations = nb_prestations,
rea_facturee_base_remboursement = base_remboursement
FROM
(
SELECT
rss_id,
1 as nb_rss,
SUM(nombre) as nb_prestations,
SUM(base_remboursement) as base_remboursement
FROM
pmsi.p_rsf_detail
JOIN temp_pmsi000378_rss ON temp_pmsi000378_rss.oid = p_rsf_detail.rss_id
JOIN pmsi.t_prestations ON t_prestations.oid = p_rsf_detail.prestation_id
WHERE 1=1
AND est_ligne_rss = '1'
AND t_prestations.code = 'REA'
GROUP BY rss_id
) subview
WHERE subview.rss_id = temp_pmsi000378_rss.oid;
----------------------- **
RAISE NOTICE '%' , 'Dossiers passes dans une UM qui possede une autorisation REA';
UPDATE temp_pmsi000378_rss SET
rea_passage_nb_rss = nb_rss,
rea_passage_duree_sejour = duree_sejour
FROM
( SELECT
rss_id,
1 as nb_rss,
SUM(duree_sejour) as duree_sejour
FROM
pmsi.p_rss_rum
JOIN temp_pmsi000378_rss ON temp_pmsi000378_rss.oid = p_rss_rum.rss_id
JOIN pmsi.t_unites_medicales ON p_rss_rum.unite_medicale_id = t_unites_medicales.oid
WHERE
t_unites_medicales.type_autorisation LIKE '01%'
GROUP BY rss_id
) subview
WHERE subview.rss_id = temp_pmsi000378_rss.oid;
----------------------- **
RAISE NOTICE '%' , 'Reinitialise les codes de supplement dans la table des RUMs';
UPDATE pmsi.p_rss_rum SET
supplement_code = ''
FROM
temp_pmsi000378_rss
WHERE
p_rss_rum.rss_id = temp_pmsi000378_rss.oid
AND (supplement_code IS NULL OR supplement_code <> '');
----------------------- **
RAISE NOTICE '%' , 'Suppression de tables temporaires';
DROP TABLE IF EXISTS w_rss_rea_1;
DROP TABLE IF EXISTS w_rss_rea_2;
----------------------- **
RAISE NOTICE '%' , 'Dossiers avec un acte dans la liste 1 de l''annexe 10 de la norme B2';
CREATE TEMP TABLE w_rss_rea_1 AS
SELECT
rss_id,
no_rum
FROM
pmsi.p_rss_actes
JOIN temp_pmsi000378_rss ON p_rss_actes.rss_id = temp_pmsi000378_rss.oid
JOIN w_listes_rea ON w_listes_rea.to_id = p_rss_actes.acte_id
WHERE 1=1
AND temp_pmsi000378_rss.date_sortie BETWEEN '20120101'::date AND '20990228'::date
AND w_listes_rea.liste_code = 'CTI_VIT15_10A';
----------------------- **
RAISE NOTICE '%' , 'Dossiers avec un acte de la liste 2 de l''annexe 10 realise au moins 3 fois';
CREATE TEMP TABLE w_rss_rea_2 AS
SELECT
rss_id,
no_rum,
acte_id,
count(*)
FROM
pmsi.p_rss_actes
JOIN temp_pmsi000378_rss ON p_rss_actes.rss_id = temp_pmsi000378_rss.oid
JOIN w_listes_rea ON w_listes_rea.to_id = p_rss_actes.acte_id
WHERE 1=1
AND temp_pmsi000378_rss.date_sortie BETWEEN '20120101'::date AND '20990228'::date
AND w_listes_rea.liste_code = 'CTI_VIT15_20A'
GROUP BY rss_id, no_rum, acte_id
HAVING count(*) >= 3;
----------------------- **
----------------------- **
RAISE NOTICE '%' , 'Positionne un supplement REA1 si acte dans liste 1 annexe 10 et ((IGS2 >= 15 et age >= 18) ou (age < 18) et RUM avec autorisation ''01''';
UPDATE pmsi.p_rss_rum SET
supplement_code = 'REA1'
FROM
temp_pmsi000378_rss
, w_rss_rea_1
WHERE
temp_pmsi000378_rss.oid = p_rss_rum.rss_id
AND temp_pmsi000378_rss.date_sortie BETWEEN '20120101'::date AND '20990228'::date
AND supplement_code = ''
AND ((p_rss_rum.igs2 >= 15 AND temp_pmsi000378_rss.age >= 18) OR temp_pmsi000378_rss.age < 18)
AND unite_medicale_id IN (SELECT oid FROM pmsi.t_unites_medicales WHERE type_autorisation LIKE '01%')
AND p_rss_rum.rss_id = w_rss_rea_1.rss_id
AND p_rss_rum.no_rum = w_rss_rea_1.no_rum;
----------------------- **
RAISE NOTICE '%' , 'Positionne un supplement REA2 si acte dans liste 2 annexe 7 realise 3 fois et ((IGS2 >= 15 et age >= 18) ou (age < 18) et RUM avec autorisation ''01''';
UPDATE pmsi.p_rss_rum SET
supplement_code = 'REA2'
FROM
temp_pmsi000378_rss
, w_rss_rea_2
WHERE
temp_pmsi000378_rss.oid = p_rss_rum.rss_id
AND temp_pmsi000378_rss.date_sortie BETWEEN '20120101'::date AND '20990228'::date
AND supplement_code = ''
AND ((p_rss_rum.igs2 >= 15 AND temp_pmsi000378_rss.age >= 18) OR temp_pmsi000378_rss.age < 18)
AND unite_medicale_id IN (SELECT oid FROM pmsi.t_unites_medicales WHERE type_autorisation LIKE '01%')
AND p_rss_rum.rss_id = w_rss_rea_2.rss_id
AND p_rss_rum.no_rum = w_rss_rea_2.no_rum;
----------------------- **
RAISE NOTICE 'Remplit la table avec tous les RUMs precedemment marqués comme facturables (REA1, REA2)';
INSERT INTO temp_pmsi000367_rsf_detail(
date_debut, date_fin, regle, nombre, prix_unitaire, base_remboursement, coefficient_mco, rss_id)
SELECT
p_rss_rum.date_entree,
p_rss_rum.date_sortie,
SUBSTR(supplement_code, 4 , 1),
CASE WHEN p_rss_rum.date_sortie > p_rss_rum.date_entree THEN
CASE WHEN p_rss_rum.mode_sortie <> '9' THEN p_rss_rum.date_sortie - p_rss_rum.date_entree
ELSE p_rss_rum.date_sortie - p_rss_rum.date_entree + 1 END
ELSE 1 END,
CASE
WHEN t_finess.type_etablissement = '1' THEN
CASE
WHEN temp_pmsi000378_rss.date_sortie >= t_prestations.date_debut_prive_1 AND temp_pmsi000378_rss.date_sortie <= t_prestations.date_fin_prive_1 THEN t_prestations.tarif_prive_1
WHEN temp_pmsi000378_rss.date_sortie >= t_prestations.date_debut_prive_2 AND temp_pmsi000378_rss.date_sortie <= t_prestations.date_fin_prive_2 THEN t_prestations.tarif_prive_2
WHEN temp_pmsi000378_rss.date_sortie >= t_prestations.date_debut_prive_3 AND temp_pmsi000378_rss.date_sortie <= t_prestations.date_fin_prive_3 THEN t_prestations.tarif_prive_3
WHEN temp_pmsi000378_rss.date_sortie >= t_prestations.date_debut_prive_4 AND temp_pmsi000378_rss.date_sortie <= t_prestations.date_fin_prive_4 THEN t_prestations.tarif_prive_4
WHEN temp_pmsi000378_rss.date_sortie >= t_prestations.date_debut_prive_5 AND temp_pmsi000378_rss.date_sortie <= t_prestations.date_fin_prive_5 THEN t_prestations.tarif_prive_5
WHEN temp_pmsi000378_rss.date_sortie >= t_prestations.date_debut_prive_6 AND temp_pmsi000378_rss.date_sortie <= t_prestations.date_fin_prive_6 THEN t_prestations.tarif_prive_6
WHEN temp_pmsi000378_rss.date_sortie >= t_prestations.date_debut_prive_7 AND temp_pmsi000378_rss.date_sortie <= t_prestations.date_fin_prive_7 THEN t_prestations.tarif_prive_7
WHEN temp_pmsi000378_rss.date_sortie >= t_prestations.date_debut_prive_8 AND temp_pmsi000378_rss.date_sortie <= t_prestations.date_fin_prive_8 THEN t_prestations.tarif_prive_8
WHEN temp_pmsi000378_rss.date_sortie >= t_prestations.date_debut_prive_9 AND temp_pmsi000378_rss.date_sortie <= t_prestations.date_fin_prive_9 THEN t_prestations.tarif_prive_9
ELSE 0::numeric END
ELSE
CASE
WHEN temp_pmsi000378_rss.date_sortie >= t_prestations.date_debut_public_1 AND temp_pmsi000378_rss.date_sortie <= t_prestations.date_fin_public_1 THEN t_prestations.tarif_public_1
WHEN temp_pmsi000378_rss.date_sortie >= t_prestations.date_debut_public_2 AND temp_pmsi000378_rss.date_sortie <= t_prestations.date_fin_public_2 THEN t_prestations.tarif_public_2
WHEN temp_pmsi000378_rss.date_sortie >= t_prestations.date_debut_public_3 AND temp_pmsi000378_rss.date_sortie <= t_prestations.date_fin_public_3 THEN t_prestations.tarif_public_3
WHEN temp_pmsi000378_rss.date_sortie >= t_prestations.date_debut_public_4 AND temp_pmsi000378_rss.date_sortie <= t_prestations.date_fin_public_4 THEN t_prestations.tarif_public_4
WHEN temp_pmsi000378_rss.date_sortie >= t_prestations.date_debut_public_5 AND temp_pmsi000378_rss.date_sortie <= t_prestations.date_fin_public_5 THEN t_prestations.tarif_public_5
WHEN temp_pmsi000378_rss.date_sortie >= t_prestations.date_debut_public_6 AND temp_pmsi000378_rss.date_sortie <= t_prestations.date_fin_public_6 THEN t_prestations.tarif_public_6
WHEN temp_pmsi000378_rss.date_sortie >= t_prestations.date_debut_public_7 AND temp_pmsi000378_rss.date_sortie <= t_prestations.date_fin_public_7 THEN t_prestations.tarif_public_7
WHEN temp_pmsi000378_rss.date_sortie >= t_prestations.date_debut_public_8 AND temp_pmsi000378_rss.date_sortie <= t_prestations.date_fin_public_8 THEN t_prestations.tarif_public_8
WHEN temp_pmsi000378_rss.date_sortie >= t_prestations.date_debut_public_9 AND temp_pmsi000378_rss.date_sortie <= t_prestations.date_fin_public_9 THEN t_prestations.tarif_public_9
ELSE 0::numeric END
END,
0,
1,
temp_pmsi000378_rss.oid
FROM
pmsi.p_rss_rum
JOIN temp_pmsi000378_rss ON temp_pmsi000378_rss.oid = p_rss_rum.rss_id
JOIN base.t_finess ON t_finess.code = temp_pmsi000378_rss.finess
,pmsi.t_prestations
WHERE 1=1
AND supplement_code <> ''
AND t_prestations.code = 'REA';
----------------------- **
RAISE NOTICE ' ';
UPDATE temp_pmsi000367_rsf_detail SET nombre = temp_pmsi000367_rsf_detail.nombre - 1
FROM temp_pmsi000378_rss, temp_pmsi000367_rsf_detail temp_pmsi000367_rsf_detail2
WHERE
temp_pmsi000367_rsf_detail.rss_id = temp_pmsi000378_rss.oid
AND temp_pmsi000367_rsf_detail.date_debut <> temp_pmsi000367_rsf_detail.date_fin
AND temp_pmsi000367_rsf_detail2.rss_id = temp_pmsi000378_rss.oid
AND temp_pmsi000367_rsf_detail2.date_debut = temp_pmsi000367_rsf_detail.date_debut
AND temp_pmsi000367_rsf_detail2.date_fin = temp_pmsi000367_rsf_detail2.date_debut;
----------------------- **
RAISE NOTICE ' ';
UPDATE temp_pmsi000367_rsf_detail
SET
base_remboursement =
round( CASE
WHEN temp_pmsi000378_rss.date_sortie >= t_finess.date_debut_coefficient_mco_9 THEN t_finess.coefficient_mco_9
WHEN temp_pmsi000378_rss.date_sortie >= t_finess.date_debut_coefficient_mco_8 THEN t_finess.coefficient_mco_8
WHEN temp_pmsi000378_rss.date_sortie >= t_finess.date_debut_coefficient_mco_7 THEN t_finess.coefficient_mco_7
WHEN temp_pmsi000378_rss.date_sortie >= t_finess.date_debut_coefficient_mco_6 THEN t_finess.coefficient_mco_6
WHEN temp_pmsi000378_rss.date_sortie >= t_finess.date_debut_coefficient_mco_5 THEN t_finess.coefficient_mco_5
WHEN temp_pmsi000378_rss.date_sortie >= t_finess.date_debut_coefficient_mco_4 THEN t_finess.coefficient_mco_4
WHEN temp_pmsi000378_rss.date_sortie >= t_finess.date_debut_coefficient_mco_3 THEN t_finess.coefficient_mco_3
WHEN temp_pmsi000378_rss.date_sortie >= t_finess.date_debut_coefficient_mco_2 THEN t_finess.coefficient_mco_2
WHEN temp_pmsi000378_rss.date_sortie >= t_finess.date_debut_coefficient_mco_1 THEN t_finess.coefficient_mco_1
ELSE 1::numeric
END, 2) * prix_unitaire * nombre
FROM
pmsi.t_prestations, base.t_finess, temp_pmsi000378_rss
WHERE temp_pmsi000367_rsf_detail.prestation_id = t_prestations.oid
AND temp_pmsi000367_rsf_detail.rss_id = temp_pmsi000378_rss.oid
AND temp_pmsi000378_rss.finess = t_finess.code;
----------------------- **
RAISE NOTICE 'Ressence tous les REA facturables à partir des regles calculees precedemment';
UPDATE temp_pmsi000378_rss SET
rea_facturable_nb_rss = nb_rss,
rea_facturable_nb_prestations = nb_prestations,
rea_facturable_base_remboursement = base_remboursement,
rea_facturable_regle = regle
FROM
(SELECT rss_id, 1 as nb_rss, SUM(nombre) as nb_prestations, SUM(base_remboursement) as base_remboursement, MAX(regle) as regle
FROM temp_pmsi000367_rsf_detail
GROUP BY rss_id) subview
WHERE subview.rss_id = temp_pmsi000378_rss.oid;
----------------------- **
RAISE NOTICE ' ';
UPDATE temp_pmsi000378_rss SET
rea_facturable_regle_justificatif = 'Passé en REA non facturable ('::text ||' éligible)'::text
FROM w_rss_rea_1
WHERE w_rss_rea_1.rss_id = temp_pmsi000378_rss.oid
AND rea_facturee_nb_rss = 0 AND rea_facturable_nb_rss = 0 AND rea_passage_nb_rss > 0;
UPDATE temp_pmsi000378_rss SET
rea_facturable_regle_justificatif = 'Passé en REA non facturable ('::text || ' éligible)'::text
FROM w_rss_rea_2
WHERE w_rss_rea_2.rss_id = temp_pmsi000378_rss.oid
AND rea_facturee_nb_rss = 0 AND rea_facturable_nb_rss = 0 AND rea_passage_nb_rss > 0;
UPDATE temp_pmsi000378_rss SET
rea_facturable_regle_justificatif = 'Passé en REA non facturable'
WHERE rea_facturee_nb_rss = 0 AND rea_facturable_nb_rss = 0 AND rea_passage_nb_rss > 0 AND rea_facturable_regle_justificatif = '';
UPDATE temp_pmsi000378_rss SET
rea_facturable_regle_justificatif = 'Règle '::text || rea_facturable_regle::text
FROM w_rss_rea_1
WHERE w_rss_rea_1.rss_id = temp_pmsi000378_rss.oid
AND rea_facturable_regle = '1';
UPDATE temp_pmsi000378_rss SET
rea_facturable_regle_justificatif = 'Règle '::text || rea_facturable_regle::text
FROM w_rss_rea_2
WHERE w_rss_rea_2.rss_id = temp_pmsi000378_rss.oid
AND rea_facturable_regle = '2';
----------------------- **
RAISE NOTICE ' ';
UPDATE temp_pmsi000378_rss SET
rea_facturable_sans_rea_ni_igs_nb_rss = 1,
rea_facturable_regle_justificatif = 'Vérifier REA ('::text || ' éligible)'::text
FROM w_rss_rea_1
WHERE w_rss_rea_1.rss_id = temp_pmsi000378_rss.oid
AND rea_passage_nb_rss = 0;
UPDATE temp_pmsi000378_rss SET
rea_facturable_sans_rea_ni_igs_nb_rss = 1,
rea_facturable_regle_justificatif = 'Vérifier REA ('::text || ' éligible)'::text
FROM w_rss_rea_2
WHERE w_rss_rea_2.rss_id = temp_pmsi000378_rss.oid
AND rea_passage_nb_rss = 0;
DELETE FROM temp_pmsi000378_rss
WHERE
rea_facturee_nb_rss = 0
AND rea_facturable_nb_rss = 0
AND rea_passage_nb_rss = 0
AND rea_facturable_sans_rea_ni_igs_nb_rss = 0;
----------------------- **
RAISE NOTICE 'Remplissage table p_rss_rea';
INSERT INTO pmsi.p_rss_rea(
finess, no_rss, oid, date_sortie, age, rea_facturee_nb_rss, rea_facturee_nb_prestations,
rea_facturee_base_remboursement, rea_facturable_nb_rss, rea_facturable_nb_prestations,
rea_facturable_base_remboursement, rea_facturable_regle, rea_facturable_regle_justificatif,
rea_passage_nb_rss, rea_passage_duree_sejour, rea_passage_base_remboursement,
rea_facturable_sans_rea_ni_igs_nb_rss)
SELECT * FROM temp_pmsi000378_rss
;
RETURN 'OK';
END;