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.
 
 

701 lines
36 KiB

return: text
lang: plpgsql
src: |
DECLARE
result TEXT;
BEGIN
-- Paramétrage
INSERT INTO pmsi.t_divers (code, texte, valeur, description)
SELECT
'VENTILUM_MODE_GHS',
'Mode ventilation GHS par UM',
'PMS',
'DUR = Durée séjour, PMS = Durée séjour pondérée par PMS, PMJ = Durée séjour pondérée par PMJ'
WHERE 'VENTILUM_MODE_GHS' NOT IN (SELECT code FROM pmsi.t_divers);
UPDATE pmsi.t_divers
SET valeur = 'PMS'
WHERE code = 'VENTILUM_MODE_GHS' AND
valeur NOT IN ('DUR', 'PMS', 'PMJ');
-- Suppression génération précédente
DELETE FROM pmsi.p_rsf_detail WHERE est_ligne_rss <> '1' AND operation_lamda NOT IN ('1','2');
UPDATE pmsi.p_rsf_detail
SET
no_rum = 0,
unite_medicale_id = 0,
base_remboursement_rum = 0,
base_remboursement_rum_sauf_transition = 0,
base_remboursement_rum_sauf_transition_sauf_ame = 0,
sejour_remboursable_rum = 0,
est_ligne_rum = '0'
FROM pmsi.p_rss
WHERE
p_rsf_detail.rss_id = p_rss.oid
AND p_rss.nb_rum > 1
AND operation_lamda NOT IN ('1','2')
AND (no_rum IS DISTINCT FROM 0 OR
unite_medicale_id IS DISTINCT FROM 0 OR
base_remboursement_rum IS DISTINCT FROM 0 OR
sejour_remboursable_rum IS DISTINCT FROM 0 OR
base_remboursement_rum_sauf_transition IS DISTINCT FROM 0 OR
base_remboursement_rum_sauf_transition_sauf_ame IS DISTINCT FROM 0 OR
est_ligne_rum <> '0');
-- Mono rum
UPDATE pmsi.p_rsf_detail
SET
no_rum = p_rss_rum.no_rum,
unite_medicale_id = p_rss_rum.unite_medicale_id,
base_remboursement_rum = round(p_rsf_detail.base_remboursement,2),
base_remboursement_rum_sauf_transition = round(p_rsf_detail.base_remboursement_sauf_transition,2),
base_remboursement_rum_sauf_transition_sauf_ame = round(p_rsf_detail.base_remboursement_sauf_transition_sauf_ame,2),
sejour_remboursable_rum = round(p_rsf_detail.sejour_remboursable,2),
est_ligne_rum = '1'
FROM pmsi.p_rss_rum
JOIN pmsi.p_rss ON p_rss.oid = p_rss_rum.rss_id
WHERE
p_rsf_detail.rss_id = p_rss.oid
AND p_rss.nb_rum = 1
AND operation_lamda NOT IN ('1','2')
AND (
p_rsf_detail.no_rum IS DISTINCT FROM p_rss_rum.no_rum OR
p_rsf_detail.unite_medicale_id IS DISTINCT FROM p_rss_rum.unite_medicale_id OR
p_rsf_detail.base_remboursement_rum IS DISTINCT FROM round(p_rsf_detail.base_remboursement,2) OR
p_rsf_detail.base_remboursement_rum_sauf_transition IS DISTINCT FROM round(p_rsf_detail.base_remboursement_sauf_transition,2) OR
p_rsf_detail.base_remboursement_rum_sauf_transition_sauf_ame IS DISTINCT FROM round(p_rsf_detail.base_remboursement_sauf_transition_sauf_ame,2) OR
p_rsf_detail.sejour_remboursable_rum IS DISTINCT FROM round(p_rsf_detail.sejour_remboursable,2) OR
p_rsf_detail.est_ligne_rum <> '1'
);
UPDATE pmsi.p_rsf_detail
SET
date_fin = CASE WHEN date_fin > date_sortie THEN date_sortie WHEN date_fin < date_entree THEN date_entree ELSE date_fin END,
date_debut = CASE WHEN date_debut > date_sortie THEN date_sortie WHEN date_debut < date_entree THEN date_entree ELSE date_debut END
FROM pmsi.p_rss
WHERE
p_rsf_detail.rss_id = p_rss.oid
AND nb_rum > 1
AND operation_lamda NOT IN ('1','2')
AND (date_fin > date_sortie OR date_debut > date_sortie OR date_fin < date_entree OR date_debut < date_entree);
DROP TABLE IF EXISTS w_rsf_detail_rum;
CREATE TEMP TABLE w_rsf_detail_rum AS
SELECT p_rsf_detail.finess,
p_rsf_detail.no_rss,
nature,
mt,
dmt,
date_debut,
date_fin,
nombre,
coefficient,
prix_unitaire,
0::numeric AS base_remboursement,
taux_remboursement,
0::numeric AS sejour_facture,
0::numeric AS sejour_remboursable,
compteur,
ligne_t2a,
pec_fj,
pec_fj_id,
coefficient_mco,
p_rsf_detail.sejour_remboursable AS sejour_remboursable_2,
p_rsf_detail.ghs_id,
p_rsf_detail.base_remboursement AS base_remboursement_total,
COALESCE(p_rsf_detail.base_remboursement_sauf_transition,p_rsf_detail.base_remboursement) AS base_remboursement_total_sauf_transition,
COALESCE(p_rsf_detail.base_remboursement_sauf_transition_sauf_ame,p_rsf_detail.base_remboursement) AS base_remboursement_total_sauf_transition_sauf_ame,
nature_noemie,
prestation_id,
p_rsf_detail.rss_id,
type,
coefficient_geo,
'0'::text AS est_ligne_rss,
'1'::text AS est_ligne_rum,
p_rss_rum.no_rum,
p_rss_rum.unite_medicale_id,
0::numeric AS base_remboursement_rum,
0::numeric AS base_remboursement_rum_sauf_transition,
0::numeric AS base_remboursement_rum_sauf_transition_sauf_ame,
0::numeric AS sejour_remboursable_rum,
montant_supplement_nf,
date_comptable,
operation_lamda,
fides_detail
FROM
pmsi.p_rss_rum, pmsi.p_rsf_detail, pmsi.p_rss
WHERE p_rsf_detail.rss_id = p_rss_rum.rss_id AND
p_rsf_detail.rss_id = p_rss.oid AND p_rss.nb_rum > 1 AND
operation_lamda NOT IN ('1','2');
DROP TABLE IF EXISTS w_rsf_detail_presta;
CREATE TEMP TABLE w_rsf_detail_presta AS
SELECT p_rsf_detail.rss_id,
p_rsf_detail.prestation_id,
SUM(p_rsf_detail.base_remboursement) AS base_remboursement_presta,
SUM(COALESCE(p_rsf_detail.base_remboursement_sauf_transition,p_rsf_detail.base_remboursement)) AS base_remboursement_presta_sauf_transition,
SUM(COALESCE(p_rsf_detail.base_remboursement_sauf_transition_sauf_ame,p_rsf_detail.base_remboursement)) AS base_remboursement_presta_sauf_transition_sauf_ame,
SUM(p_rsf_detail.sejour_remboursable) AS sejour_remboursable_presta
FROM
pmsi.p_rsf_detail
JOIN pmsi.p_rss ON p_rsf_detail.rss_id = p_rss.oid AND p_rss.nb_rum > 1
WHERE est_ligne_rss = '1' AND
operation_lamda NOT IN ('1','2')
GROUP BY 1,2;
TRUNCATE pmsi.p_ventilation_um;
INSERT INTO pmsi.p_ventilation_um(
unite_medicale_id, annee, nb_sejours_monorum, nb_jours_monorum, ca_ghs_monorum, pms, pmj)
SELECT t_unites_medicales.oid AS unite_medicale_id,
round(p_chiffrier.mois / 100,0) AS annee,
0,
0,
0,
0,
0
FROM pmsi.t_unites_medicales, pmsi.p_chiffrier
WHERE t_unites_medicales.oid IN (SELECT DISTINCT unite_medicale_id FROM pmsi.p_rss_rum)
GROUP BY 1,2;
UPDATE pmsi.p_ventilation_um SET
nb_sejours_monorum = subview.nb_rsa,
nb_jours_monorum = subview.duree_sejour
FROM
(
SELECT
date_part('year', p_rss.date_sortie) AS annee,
unite_medicale_principale_id as unite_medicale_id,
SUM(nb_rsa) as nb_rsa,
SUM(duree_sejour+1) as duree_sejour
FROM pmsi.p_rss
WHERE nb_rum = 1 AND
p_rss.ghm_id > 0 AND
p_rss.etat = '' AND p_rss.ca_ghs <> 0
GROUP BY 1,2) subview
WHERE pmsi.p_ventilation_um.unite_medicale_id = subview.unite_medicale_id AND
pmsi.p_ventilation_um.annee = subview.annee;
UPDATE pmsi.p_ventilation_um SET
ca_ghs_monorum = subview.ca_ghs
FROM
(
SELECT
date_part('year', p_rss.date_sortie) AS annee,
unite_medicale_id as unite_medicale_id,
base.cti_division(SUM(p_rsf_detail.base_remboursement), SUM(p_rss.nb_rsa) ) as pms,
COUNT(DISTINCT p_rss.oid) as nb_rsa,
SUM(p_rsf_detail.base_remboursement) as ca_ghs
FROM pmsi.p_rss, pmsi.p_rsf_detail
WHERE p_rss.oid = p_rsf_detail.rss_id AND nb_rum = 1 AND
operation_lamda NOT IN ('1','2') AND p_rss.ghm_id > 0 AND p_rss.etat = '' AND
p_rss.ca_ghs <> 0 AND p_rsf_detail.base_remboursement <> 0 AND
p_rsf_detail.est_ligne_rss = '1' AND prestation_id IN (SELECT oid FROM pmsi.t_prestations WHERE code = 'GHS')
GROUP BY 1,2) subview
WHERE pmsi.p_ventilation_um.unite_medicale_id = subview.unite_medicale_id AND
pmsi.p_ventilation_um.annee = subview.annee;
UPDATE pmsi.p_ventilation_um SET
pms = base.cti_division(ca_ghs_monorum,nb_sejours_monorum),
pmj = base.cti_division(ca_ghs_monorum,nb_jours_monorum);
-- Ajustement PMJ/PMS pour ono rum non significatifs (< 10)
UPDATE pmsi.p_ventilation_um
SET pms = subview.pms, pmj = subview.pmj
FROM (
SELECT annee, AVG(pms) AS pms, AVG(pmj) AS pmj
FROM pmsi.p_ventilation_um
WHERE nb_sejours_monorum >= 10
GROUP BY 1) subview
WHERE p_ventilation_um.annee = subview.annee AND
p_ventilation_um.nb_sejours_monorum < 10;
DROP TABLE IF EXISTS rss_resume;
CREATE TEMP TABLE rss_resume AS
SELECT
rss_id,
date_part('year', p_rss.date_sortie) AS annee,
p_rss.date_sortie,
p_rss.duree_sejour,
p_rss.nb_rum,
SUM(CASE WHEN t_prestations.code = 'GHS' THEN p_rsf_detail.base_remboursement ELSE 0 END) as ca_ghs
FROM pmsi.p_rss, pmsi.p_rsf_detail, pmsi.t_prestations
WHERE p_rss.oid = p_rsf_detail.rss_id
AND nb_rum > 1 AND p_rss.ghm_id > 0 AND p_rss.etat = ''
AND prestation_id = t_prestations.oid
AND p_rsf_detail.est_ligne_rss = '1' AND
operation_lamda NOT IN ('1','2')
GROUP BY 1,2,3,4,5
ORDER BY 1;
DROP TABLE IF EXISTS rum_pmsval;
CREATE TEMP TABLE rum_pmsval AS
SELECT
rss_resume.rss_id ,
rss_resume.ca_ghs as ca_ghs,
v_rss_rum_1.no_rum,
v_rss_rum_1.unite_medicale_id,
t_unites_medicales.type_autorisation,
t_divers.valeur AS type_ventilation_ca_ghs,
type_ventilation_ca AS type_ventilation_ca_special_um,
rss_resume.duree_sejour + rss_resume.nb_rum as duree_sejour,
v_rss_rum_1.duree_sejour_rum + 1 as duree_sejour_rum,
v_rss_rum_1.date_entree_rum, v_rss_rum_1.date_sortie_rum,
(v_rss_rum_1.duree_sejour_rum + 1) / (rss_resume.duree_sejour + rss_resume.nb_rum) as dur_coeff,
pms,
pms * (v_rss_rum_1.duree_sejour_rum + 1) / (rss_resume.duree_sejour + rss_resume.nb_rum) as pms_val,
pmj,
pmj * (v_rss_rum_1.duree_sejour_rum + 1) / (rss_resume.duree_sejour + rss_resume.nb_rum) as pmj_val
FROM pmsi.v_rss_rum_1
JOIN rss_resume ON rss_resume.rss_id = v_rss_rum_1.rss_id
JOIN pmsi.p_ventilation_um ON v_rss_rum_1.unite_medicale_id = p_ventilation_um.unite_medicale_id AND rss_resume.annee = p_ventilation_um.annee
JOIN pmsi.t_unites_medicales ON v_rss_rum_1.unite_medicale_id = t_unites_medicales.oid
JOIN pmsi.t_divers ON t_divers.code = 'VENTILUM_MODE_GHS'
ORDER BY rss_resume.rss_id, v_rss_rum_1.no_rum;
CREATE INDEX rum_pmsval_i1 ON rum_pmsval USING btree (rss_id);
UPDATE rum_pmsval
SET pms_val = ca_ghs, pmj_val = ca_ghs / duree_sejour
WHERE rss_id IN (SELECT rss_id FROM rum_pmsval WHERE pms = 0);
DROP TABLE IF EXISTS rss_pmsval;
CREATE TEMP TABLE rss_pmsval AS
SELECT
rum_pmsval.rss_id,
MIN(rum_pmsval.no_rum) AS premier_rum,
MAX(rum_pmsval.no_rum) AS dernier_rum,
MIN(CASE WHEN type_autorisation LIKE '01%' THEN rum_pmsval.no_rum ELSE 999 END) AS premier_rum_01,
MIN(CASE WHEN type_autorisation LIKE '02%' THEN rum_pmsval.no_rum ELSE 999 END) AS premier_rum_02,
MIN(CASE WHEN type_autorisation LIKE '03%' THEN rum_pmsval.no_rum ELSE 999 END) AS premier_rum_03,
MIN(CASE WHEN type_autorisation LIKE '04%' OR type_autorisation LIKE '05%' OR type_autorisation LIKE '06%' THEN rum_pmsval.no_rum ELSE 999 END) AS premier_rum_04_05_06,
MIN(CASE WHEN type_autorisation LIKE '13%' THEN rum_pmsval.no_rum ELSE 999 END) AS premier_rum_13,
SUM(CASE WHEN type_ventilation_ca_special_um IS DISTINCT FROM '1' THEN pms_val ELSE 0 END) as pms_val,
SUM(CASE WHEN type_ventilation_ca_special_um IS DISTINCT FROM '1' THEN pmj_val ELSE 0 END) as pmj_val,
SUM(CASE WHEN type_ventilation_ca_special_um IS DISTINCT FROM '1' THEN dur_coeff ELSE 0 END) as pms_dur_coeff
FROM rum_pmsval
GROUP BY 1
ORDER BY 1;
CREATE INDEX rss_pmsval_i1 ON rss_pmsval USING btree (rss_id);
UPDATE rss_pmsval SET premier_rum_01 = premier_rum WHERE premier_rum_01 = 999;
UPDATE rss_pmsval SET premier_rum_02 = premier_rum WHERE premier_rum_02 = 999;
UPDATE rss_pmsval SET premier_rum_03 = premier_rum WHERE premier_rum_03 = 999;
UPDATE rss_pmsval SET premier_rum_04_05_06 = premier_rum WHERE premier_rum_04_05_06 = 999;
UPDATE rss_pmsval SET premier_rum_13 = premier_rum WHERE premier_rum_13 = 999;
UPDATE w_rsf_detail_rum p_rsf_detail SET
base_remboursement_rum =
CASE
WHEN type_ventilation_ca_ghs = 'DUR' AND type_ventilation_ca_special_um IS DISTINCT FROM '1' THEN round(base_remboursement_total * dur_coeff,2)
WHEN type_ventilation_ca_ghs = 'PMS' AND type_ventilation_ca_special_um IS DISTINCT FROM '1' THEN round(base.cti_division(base_remboursement_total * pms_dur_coeff * rum_pmsval.pms_val , rss_pmsval.pms_val),2)
WHEN type_ventilation_ca_ghs = 'PMJ' AND type_ventilation_ca_special_um IS DISTINCT FROM '1' THEN round(base.cti_division(base_remboursement_total * pms_dur_coeff * rum_pmsval.pmj_val , rss_pmsval.pmj_val),2)
ELSE round(base_remboursement_total * dur_coeff,2) END,
base_remboursement_rum_sauf_transition =
CASE
WHEN type_ventilation_ca_ghs = 'DUR' AND type_ventilation_ca_special_um IS DISTINCT FROM '1' THEN round(base_remboursement_total_sauf_transition * dur_coeff,2)
WHEN type_ventilation_ca_ghs = 'PMS' AND type_ventilation_ca_special_um IS DISTINCT FROM '1' THEN round(base.cti_division(base_remboursement_total_sauf_transition * pms_dur_coeff * rum_pmsval.pms_val , rss_pmsval.pms_val),2)
WHEN type_ventilation_ca_ghs = 'PMJ' AND type_ventilation_ca_special_um IS DISTINCT FROM '1' THEN round(base.cti_division(base_remboursement_total_sauf_transition * pms_dur_coeff * rum_pmsval.pmj_val , rss_pmsval.pmj_val),2)
ELSE round(base_remboursement_total_sauf_transition * dur_coeff,2) END,
base_remboursement_rum_sauf_transition_sauf_ame =
CASE
WHEN type_ventilation_ca_ghs = 'DUR' AND type_ventilation_ca_special_um IS DISTINCT FROM '1' THEN round(base_remboursement_total_sauf_transition_sauf_ame * dur_coeff,2)
WHEN type_ventilation_ca_ghs = 'PMS' AND type_ventilation_ca_special_um IS DISTINCT FROM '1' THEN round(base.cti_division(base_remboursement_total_sauf_transition_sauf_ame * pms_dur_coeff * rum_pmsval.pms_val , rss_pmsval.pms_val),2)
WHEN type_ventilation_ca_ghs = 'PMJ' AND type_ventilation_ca_special_um IS DISTINCT FROM '1' THEN round(base.cti_division(base_remboursement_total_sauf_transition_sauf_ame * pms_dur_coeff * rum_pmsval.pmj_val , rss_pmsval.pmj_val),2)
ELSE round(base_remboursement_total_sauf_transition_sauf_ame * dur_coeff,2) END,
base_remboursement = 0,
sejour_remboursable_rum =
CASE
WHEN type_ventilation_ca_ghs = 'DUR' AND type_ventilation_ca_special_um IS DISTINCT FROM '1' THEN round(sejour_remboursable_2 * dur_coeff,2)
WHEN type_ventilation_ca_ghs = 'PMS' AND type_ventilation_ca_special_um IS DISTINCT FROM '1' THEN round(base.cti_division(sejour_remboursable_2 * pms_dur_coeff * rum_pmsval.pms_val , rss_pmsval.pms_val),2)
WHEN type_ventilation_ca_ghs = 'PMJ' AND type_ventilation_ca_special_um IS DISTINCT FROM '1' THEN round(base.cti_division(sejour_remboursable_2 * pms_dur_coeff * rum_pmsval.pmj_val , rss_pmsval.pmj_val),2)
ELSE round(sejour_remboursable_2 * dur_coeff,2) END,
sejour_remboursable = 0
FROM rum_pmsval
JOIN rss_pmsval ON rum_pmsval.rss_id = rss_pmsval.rss_id
, pmsi.t_prestations
WHERE
p_rsf_detail.rss_id = rum_pmsval.rss_id
AND prestation_id = t_prestations.oid
AND p_rsf_detail.no_rum = rum_pmsval.no_rum
AND est_ligne_rum = '1'
AND t_prestations.code IN ('GHS', 'EXH')
AND rss_pmsval.pms_val <> 0
AND (
base_remboursement_rum IS DISTINCT FROM
CASE
WHEN type_ventilation_ca_ghs = 'DUR' AND type_ventilation_ca_special_um IS DISTINCT FROM '1' THEN round(base_remboursement_total * dur_coeff,2)
WHEN type_ventilation_ca_ghs = 'PMS' AND type_ventilation_ca_special_um IS DISTINCT FROM '1' THEN round(base.cti_division(base_remboursement_total * pms_dur_coeff * rum_pmsval.pms_val , rss_pmsval.pms_val),2)
WHEN type_ventilation_ca_ghs = 'PMJ' AND type_ventilation_ca_special_um IS DISTINCT FROM '1' THEN round(base.cti_division(base_remboursement_total * pms_dur_coeff * rum_pmsval.pmj_val , rss_pmsval.pmj_val),2)
ELSE round(base_remboursement_total * dur_coeff,2) END
OR
base_remboursement_rum_sauf_transition IS DISTINCT FROM
CASE
WHEN type_ventilation_ca_ghs = 'DUR' AND type_ventilation_ca_special_um IS DISTINCT FROM '1' THEN round(base_remboursement_total_sauf_transition * dur_coeff,2)
WHEN type_ventilation_ca_ghs = 'PMS' AND type_ventilation_ca_special_um IS DISTINCT FROM '1' THEN round(base.cti_division(base_remboursement_total_sauf_transition * pms_dur_coeff * rum_pmsval.pms_val , rss_pmsval.pms_val),2)
WHEN type_ventilation_ca_ghs = 'PMJ' AND type_ventilation_ca_special_um IS DISTINCT FROM '1' THEN round(base.cti_division(base_remboursement_total_sauf_transition * pms_dur_coeff * rum_pmsval.pmj_val , rss_pmsval.pmj_val),2)
ELSE round(base_remboursement_total_sauf_transition * dur_coeff,2) END
OR
base_remboursement_rum_sauf_transition_sauf_ame IS DISTINCT FROM
CASE
WHEN type_ventilation_ca_ghs = 'DUR' AND type_ventilation_ca_special_um IS DISTINCT FROM '1' THEN round(base_remboursement_total_sauf_transition_sauf_ame * dur_coeff,2)
WHEN type_ventilation_ca_ghs = 'PMS' AND type_ventilation_ca_special_um IS DISTINCT FROM '1' THEN round(base.cti_division(base_remboursement_total_sauf_transition_sauf_ame * pms_dur_coeff * rum_pmsval.pms_val , rss_pmsval.pms_val),2)
WHEN type_ventilation_ca_ghs = 'PMJ' AND type_ventilation_ca_special_um IS DISTINCT FROM '1' THEN round(base.cti_division(base_remboursement_total_sauf_transition_sauf_ame * pms_dur_coeff * rum_pmsval.pmj_val , rss_pmsval.pmj_val),2)
ELSE round(base_remboursement_total_sauf_transition_sauf_ame * dur_coeff,2) END
OR
base_remboursement IS DISTINCT FROM 0
OR
sejour_remboursable_rum IS DISTINCT FROM
CASE
WHEN type_ventilation_ca_ghs = 'DUR' AND type_ventilation_ca_special_um IS DISTINCT FROM '1' THEN round(sejour_remboursable_2 * dur_coeff,2)
WHEN type_ventilation_ca_ghs = 'PMS' AND type_ventilation_ca_special_um IS DISTINCT FROM '1' THEN round(base.cti_division(sejour_remboursable_2 * pms_dur_coeff * rum_pmsval.pms_val , rss_pmsval.pms_val),2)
WHEN type_ventilation_ca_ghs = 'PMJ' AND type_ventilation_ca_special_um IS DISTINCT FROM '1' THEN round(base.cti_division(sejour_remboursable_2 * pms_dur_coeff * rum_pmsval.pmj_val , rss_pmsval.pmj_val),2)
ELSE round(sejour_remboursable_2 * dur_coeff,2) END
OR
sejour_remboursable IS DISTINCT FROM 0
);
UPDATE w_rsf_detail_rum p_rsf_detail SET
base_remboursement_rum = CASE WHEN p_rsf_detail.no_rum = rss_pmsval.premier_rum_01 THEN base_remboursement_total ELSE 0 END,
base_remboursement_rum_sauf_transition = CASE WHEN p_rsf_detail.no_rum = rss_pmsval.premier_rum_01 THEN base_remboursement_total_sauf_transition ELSE 0 END,
base_remboursement_rum_sauf_transition_sauf_ame = CASE WHEN p_rsf_detail.no_rum = rss_pmsval.premier_rum_01 THEN base_remboursement_total_sauf_transition_sauf_ame ELSE 0 END,
sejour_remboursable_rum = CASE WHEN p_rsf_detail.no_rum = rss_pmsval.premier_rum_01 THEN sejour_remboursable_2 ELSE 0 END
FROM rum_pmsval, rss_pmsval, pmsi.t_prestations, rss_resume
WHERE
p_rsf_detail.rss_id = rum_pmsval.rss_id
AND rum_pmsval.rss_id = rss_pmsval.rss_id
AND rum_pmsval.rss_id = rss_resume.rss_id
AND prestation_id = t_prestations.oid
AND p_rsf_detail.no_rum = rum_pmsval.no_rum
AND est_ligne_rum = '1'
AND t_prestations.code = 'REA'
AND (
base_remboursement_rum IS DISTINCT FROM CASE WHEN p_rsf_detail.no_rum = rss_pmsval.premier_rum_01 THEN base_remboursement_total ELSE 0 END
OR
base_remboursement_rum_sauf_transition IS DISTINCT FROM CASE WHEN p_rsf_detail.no_rum = rss_pmsval.premier_rum_01 THEN base_remboursement_total_sauf_transition ELSE 0 END
OR
base_remboursement_rum_sauf_transition_sauf_ame IS DISTINCT FROM CASE WHEN p_rsf_detail.no_rum = rss_pmsval.premier_rum_01 THEN base_remboursement_total_sauf_transition_sauf_ame ELSE 0 END
OR
sejour_remboursable_rum IS DISTINCT FROM CASE WHEN p_rsf_detail.no_rum = rss_pmsval.premier_rum_01 THEN sejour_remboursable_2 ELSE 0 END
);
UPDATE w_rsf_detail_rum p_rsf_detail SET
base_remboursement_rum = CASE WHEN p_rsf_detail.no_rum = rss_pmsval.premier_rum_13 THEN base_remboursement_total ELSE 0 END,
base_remboursement_rum_sauf_transition = CASE WHEN p_rsf_detail.no_rum = rss_pmsval.premier_rum_13 THEN base_remboursement_total_sauf_transition ELSE 0 END,
base_remboursement_rum_sauf_transition_sauf_ame = CASE WHEN p_rsf_detail.no_rum = rss_pmsval.premier_rum_13 THEN base_remboursement_total_sauf_transition_sauf_ame ELSE 0 END,
sejour_remboursable_rum = CASE WHEN p_rsf_detail.no_rum = rss_pmsval.premier_rum_13 THEN sejour_remboursable_2 ELSE 0 END
FROM rum_pmsval, rss_pmsval, pmsi.t_prestations, rss_resume
WHERE
p_rsf_detail.rss_id = rum_pmsval.rss_id
AND rum_pmsval.rss_id = rss_pmsval.rss_id
AND rum_pmsval.rss_id = rss_resume.rss_id
AND prestation_id = t_prestations.oid
AND p_rsf_detail.no_rum = rum_pmsval.no_rum
AND est_ligne_rum = '1'
AND t_prestations.code = 'REP'
AND (
base_remboursement_rum IS DISTINCT FROM CASE WHEN p_rsf_detail.no_rum = rss_pmsval.premier_rum_13 THEN base_remboursement_total ELSE 0 END
OR
base_remboursement_rum_sauf_transition IS DISTINCT FROM CASE WHEN p_rsf_detail.no_rum = rss_pmsval.premier_rum_13 THEN base_remboursement_total_sauf_transition ELSE 0 END
OR
base_remboursement_rum_sauf_transition_sauf_ame IS DISTINCT FROM CASE WHEN p_rsf_detail.no_rum = rss_pmsval.premier_rum_13 THEN base_remboursement_total_sauf_transition_sauf_ame ELSE 0 END
OR
sejour_remboursable_rum IS DISTINCT FROM CASE WHEN p_rsf_detail.no_rum = rss_pmsval.premier_rum_13 THEN sejour_remboursable_2 ELSE 0 END
);
UPDATE w_rsf_detail_rum p_rsf_detail SET
base_remboursement_rum = CASE WHEN p_rsf_detail.no_rum = rss_pmsval.premier_rum_02 THEN base_remboursement_total ELSE 0 END,
base_remboursement_rum_sauf_transition = CASE WHEN p_rsf_detail.no_rum = rss_pmsval.premier_rum_02 THEN base_remboursement_total_sauf_transition ELSE 0 END,
base_remboursement_rum_sauf_transition_sauf_ame = CASE WHEN p_rsf_detail.no_rum = rss_pmsval.premier_rum_02 THEN base_remboursement_total_sauf_transition_sauf_ame ELSE 0 END,
sejour_remboursable_rum = CASE WHEN p_rsf_detail.no_rum = rss_pmsval.premier_rum_02 THEN sejour_remboursable_2 ELSE 0 END
FROM rum_pmsval, rss_pmsval, pmsi.t_prestations, rss_resume
WHERE
p_rsf_detail.rss_id = rum_pmsval.rss_id
AND rum_pmsval.rss_id = rss_pmsval.rss_id
AND rum_pmsval.rss_id = rss_resume.rss_id
AND prestation_id = t_prestations.oid
AND p_rsf_detail.no_rum = rum_pmsval.no_rum
AND est_ligne_rum = '1'
AND t_prestations.code = 'STF'
AND (
base_remboursement_rum IS DISTINCT FROM CASE WHEN p_rsf_detail.no_rum = rss_pmsval.premier_rum_02 THEN base_remboursement_total ELSE 0 END
OR
base_remboursement_rum_sauf_transition IS DISTINCT FROM CASE WHEN p_rsf_detail.no_rum = rss_pmsval.premier_rum_02 THEN base_remboursement_total_sauf_transition ELSE 0 END
OR
base_remboursement_rum_sauf_transition_sauf_ame IS DISTINCT FROM CASE WHEN p_rsf_detail.no_rum = rss_pmsval.premier_rum_02 THEN base_remboursement_total_sauf_transition_sauf_ame ELSE 0 END
OR
sejour_remboursable_rum IS DISTINCT FROM CASE WHEN p_rsf_detail.no_rum = rss_pmsval.premier_rum_02 THEN sejour_remboursable_2 ELSE 0 END
);
UPDATE w_rsf_detail_rum p_rsf_detail SET
base_remboursement_rum = CASE WHEN p_rsf_detail.no_rum = rss_pmsval.premier_rum_03 THEN base_remboursement_total ELSE 0 END,
base_remboursement_rum_sauf_transition = CASE WHEN p_rsf_detail.no_rum = rss_pmsval.premier_rum_03 THEN base_remboursement_total_sauf_transition ELSE 0 END,
base_remboursement_rum_sauf_transition_sauf_ame = CASE WHEN p_rsf_detail.no_rum = rss_pmsval.premier_rum_03 THEN base_remboursement_total_sauf_transition_sauf_ame ELSE 0 END,
sejour_remboursable_rum = CASE WHEN p_rsf_detail.no_rum = rss_pmsval.premier_rum_03 THEN sejour_remboursable_2 ELSE 0 END
FROM rum_pmsval, rss_pmsval, pmsi.t_prestations, rss_resume
WHERE
p_rsf_detail.rss_id = rum_pmsval.rss_id
AND rum_pmsval.rss_id = rss_pmsval.rss_id
AND rum_pmsval.rss_id = rss_resume.rss_id
AND prestation_id = t_prestations.oid
AND p_rsf_detail.no_rum = rum_pmsval.no_rum
AND est_ligne_rum = '1'
AND t_prestations.code = 'SRC'
AND (
base_remboursement_rum IS DISTINCT FROM CASE WHEN p_rsf_detail.no_rum = rss_pmsval.premier_rum_03 THEN base_remboursement_total ELSE 0 END
OR
base_remboursement_rum_sauf_transition IS DISTINCT FROM CASE WHEN p_rsf_detail.no_rum = rss_pmsval.premier_rum_03 THEN base_remboursement_total_sauf_transition ELSE 0 END
OR
base_remboursement_rum_sauf_transition_sauf_ame IS DISTINCT FROM CASE WHEN p_rsf_detail.no_rum = rss_pmsval.premier_rum_03 THEN base_remboursement_total_sauf_transition_sauf_ame ELSE 0 END
OR
sejour_remboursable_rum IS DISTINCT FROM CASE WHEN p_rsf_detail.no_rum = rss_pmsval.premier_rum_03 THEN sejour_remboursable_2 ELSE 0 END
);
UPDATE w_rsf_detail_rum p_rsf_detail SET
base_remboursement_rum = CASE WHEN p_rsf_detail.no_rum = rss_pmsval.premier_rum_04_05_06 THEN base_remboursement_total ELSE 0 END,
base_remboursement_rum_sauf_transition = CASE WHEN p_rsf_detail.no_rum = rss_pmsval.premier_rum_04_05_06 THEN base_remboursement_total_sauf_transition ELSE 0 END,
base_remboursement_rum_sauf_transition_sauf_ame = CASE WHEN p_rsf_detail.no_rum = rss_pmsval.premier_rum_04_05_06 THEN base_remboursement_total_sauf_transition_sauf_ame ELSE 0 END,
sejour_remboursable_rum = CASE WHEN p_rsf_detail.no_rum = rss_pmsval.premier_rum_04_05_06 THEN sejour_remboursable_2 ELSE 0 END
FROM rum_pmsval, rss_pmsval, pmsi.t_prestations, rss_resume
WHERE
p_rsf_detail.rss_id = rum_pmsval.rss_id
AND rum_pmsval.rss_id = rss_pmsval.rss_id
AND rum_pmsval.rss_id = rss_resume.rss_id
AND prestation_id = t_prestations.oid
AND p_rsf_detail.no_rum = rum_pmsval.no_rum
AND est_ligne_rum = '1'
AND t_prestations.code IN ('NN1', 'NN2', 'NN3')
AND (
base_remboursement_rum IS DISTINCT FROM CASE WHEN p_rsf_detail.no_rum = rss_pmsval.premier_rum_04_05_06 THEN base_remboursement_total ELSE 0 END
OR
base_remboursement_rum_sauf_transition IS DISTINCT FROM CASE WHEN p_rsf_detail.no_rum = rss_pmsval.premier_rum_04_05_06 THEN base_remboursement_total_sauf_transition ELSE 0 END
OR
base_remboursement_rum_sauf_transition_sauf_ame IS DISTINCT FROM CASE WHEN p_rsf_detail.no_rum = rss_pmsval.premier_rum_04_05_06 THEN base_remboursement_total_sauf_transition_sauf_ame ELSE 0 END
OR
sejour_remboursable_rum IS DISTINCT FROM CASE WHEN p_rsf_detail.no_rum = rss_pmsval.premier_rum_04_05_06 THEN sejour_remboursable_2 ELSE 0 END
);
UPDATE w_rsf_detail_rum p_rsf_detail SET
base_remboursement_rum = CASE WHEN p_rsf_detail.no_rum = rss_pmsval.dernier_rum THEN base_remboursement_total ELSE 0 END,
base_remboursement_rum_sauf_transition = CASE WHEN p_rsf_detail.no_rum = rss_pmsval.dernier_rum THEN base_remboursement_total_sauf_transition ELSE 0 END,
base_remboursement_rum_sauf_transition_sauf_ame = CASE WHEN p_rsf_detail.no_rum = rss_pmsval.dernier_rum THEN base_remboursement_total_sauf_transition_sauf_ame ELSE 0 END,
sejour_remboursable_rum = CASE WHEN p_rsf_detail.no_rum = rss_pmsval.dernier_rum THEN sejour_remboursable_2 ELSE 0 END
FROM rum_pmsval, rss_pmsval, pmsi.t_prestations, rss_resume
WHERE
p_rsf_detail.rss_id = rum_pmsval.rss_id
AND rum_pmsval.rss_id = rss_pmsval.rss_id
AND rum_pmsval.rss_id = rss_resume.rss_id
AND prestation_id = t_prestations.oid
AND p_rsf_detail.no_rum = rum_pmsval.no_rum
AND est_ligne_rum = '1'
AND t_prestations.code IN ('FJA', 'FJR', 'FRL')
AND (
base_remboursement_rum IS DISTINCT FROM CASE WHEN p_rsf_detail.no_rum = rss_pmsval.dernier_rum THEN base_remboursement_total ELSE 0 END
OR
base_remboursement_rum_sauf_transition IS DISTINCT FROM CASE WHEN p_rsf_detail.no_rum = rss_pmsval.dernier_rum THEN base_remboursement_total_sauf_transition ELSE 0 END
OR
base_remboursement_rum_sauf_transition_sauf_ame IS DISTINCT FROM CASE WHEN p_rsf_detail.no_rum = rss_pmsval.dernier_rum THEN base_remboursement_total_sauf_transition_sauf_ame ELSE 0 END
OR
sejour_remboursable_rum IS DISTINCT FROM CASE WHEN p_rsf_detail.no_rum = rss_pmsval.dernier_rum THEN sejour_remboursable_2 ELSE 0 END
);
DROP TABLE IF EXISTS rum_by_date;
CREATE TEMP TABLE rum_by_date AS
SELECT p_rss_rum.rss_id, p_calendrier.date, MIN(p_rss_rum.no_rum) as no_rum
FROM pmsi.p_rss_rum, rss_resume, base.p_calendrier
WHERE p_rss_rum.rss_id = rss_resume.rss_id
AND p_calendrier.date BETWEEN p_rss_rum.date_entree AND p_rss_rum.date_sortie
GROUP BY p_rss_rum.rss_id, p_calendrier.date
ORDER BY p_rss_rum.rss_id, p_calendrier.date;
UPDATE w_rsf_detail_rum p_rsf_detail SET
base_remboursement_rum = CASE WHEN p_rsf_detail.no_rum = rum_by_date.no_rum THEN base_remboursement_total ELSE 0 END,
base_remboursement_rum_sauf_transition = CASE WHEN p_rsf_detail.no_rum = rum_by_date.no_rum THEN base_remboursement_total_sauf_transition ELSE 0 END,
base_remboursement_rum_sauf_transition_sauf_ame = CASE WHEN p_rsf_detail.no_rum = rum_by_date.no_rum THEN base_remboursement_total_sauf_transition_sauf_ame ELSE 0 END,
sejour_remboursable_rum = CASE WHEN p_rsf_detail.no_rum = rum_by_date.no_rum THEN sejour_remboursable_2 ELSE 0 END
FROM pmsi.t_prestations, rss_resume, rum_by_date
WHERE
rss_resume.rss_id = p_rsf_detail.rss_id
AND rum_by_date.rss_id = p_rsf_detail.rss_id
AND rum_by_date.date = p_rsf_detail.date_debut
AND prestation_id = t_prestations.oid
AND est_ligne_rum = '1'
AND t_prestations.code NOT IN ('GHS', 'EXH', 'REA', 'RAP', 'REP', 'SRC', 'STF', 'NN1', 'NN2', 'NN2', 'NN3', 'FJA', 'FJR', 'FRL')
AND (
base_remboursement_rum IS DISTINCT FROM CASE WHEN p_rsf_detail.no_rum = rum_by_date.no_rum THEN base_remboursement_total ELSE 0 END
OR
base_remboursement_rum_sauf_transition IS DISTINCT FROM CASE WHEN p_rsf_detail.no_rum = rum_by_date.no_rum THEN base_remboursement_total_sauf_transition ELSE 0 END
OR
base_remboursement_rum_sauf_transition_sauf_ame IS DISTINCT FROM CASE WHEN p_rsf_detail.no_rum = rum_by_date.no_rum THEN base_remboursement_total_sauf_transition_sauf_ame ELSE 0 END
OR
sejour_remboursable_rum IS DISTINCT FROM CASE WHEN p_rsf_detail.no_rum = rum_by_date.no_rum THEN sejour_remboursable_2 ELSE 0 END
)
;
DROP TABLE IF EXISTS w_rsf_detail_rum_presta;
CREATE TEMP TABLE w_rsf_detail_rum_presta AS
SELECT p_rsf_detail.rss_id,
p_rsf_detail.prestation_id,
MIN(CTID) AS from_CTID,
SUM(p_rsf_detail.base_remboursement_rum) AS base_remboursement_rum_presta,
SUM(p_rsf_detail.base_remboursement_rum_sauf_transition) AS base_remboursement_rum_presta_sauf_transition,
SUM(p_rsf_detail.base_remboursement_rum_sauf_transition_sauf_ame) AS base_remboursement_rum_presta_sauf_transition_sauf_ame,
SUM(p_rsf_detail.sejour_remboursable_rum) AS sejour_remboursable_rum_presta,
MIN(CASE WHEN base_remboursement_rum <> 0 THEN no_rum ELSE 999 END) as premier_rum
FROM
w_rsf_detail_rum p_rsf_detail
GROUP BY 1,2;
UPDATE w_rsf_detail_rum p_rsf_detail SET
base_remboursement_rum = base_remboursement_rum + ecart_arrondi,
base_remboursement_rum_sauf_transition = base_remboursement_rum_sauf_transition + ecart_arrondi_ht,
base_remboursement_rum_sauf_transition_sauf_ame = base_remboursement_rum_sauf_transition_sauf_ame + ecart_arrondi_hthame,
sejour_remboursable_rum = sejour_remboursable_rum + ecart_arrondi_r
FROM pmsi.t_prestations, (
SELECT w_rsf_detail_presta.rss_id, w_rsf_detail_presta.prestation_id, premier_rum,
base_remboursement_presta - COALESCE(base_remboursement_rum_presta) AS ecart_arrondi,
base_remboursement_presta_sauf_transition - COALESCE(base_remboursement_rum_presta_sauf_transition) AS ecart_arrondi_ht,
base_remboursement_presta_sauf_transition_sauf_ame - COALESCE(base_remboursement_rum_presta_sauf_transition_sauf_ame) AS ecart_arrondi_hthame,
sejour_remboursable_presta - COALESCE(sejour_remboursable_rum_presta) AS ecart_arrondi_r
FROM w_rsf_detail_presta
LEFT JOIN w_rsf_detail_rum_presta ON w_rsf_detail_rum_presta.rss_id = w_rsf_detail_presta.rss_id AND
w_rsf_detail_rum_presta.prestation_id = w_rsf_detail_presta.prestation_id
WHERE
base_remboursement_presta IS DISTINCT FROM COALESCE(base_remboursement_rum_presta) OR
base_remboursement_presta_sauf_transition IS DISTINCT FROM COALESCE(base_remboursement_rum_presta_sauf_transition) OR
base_remboursement_presta_sauf_transition_sauf_ame IS DISTINCT FROM COALESCE(base_remboursement_rum_presta_sauf_transition_sauf_ame) OR
sejour_remboursable_presta IS DISTINCT FROM COALESCE(sejour_remboursable_rum_presta)
) subview
WHERE p_rsf_detail.rss_id = subview.rss_id
AND p_rsf_detail.prestation_id = t_prestations.oid
AND p_rsf_detail.prestation_id = subview.prestation_id
AND p_rsf_detail.no_rum = subview.premier_rum
AND (
base_remboursement_rum IS DISTINCT FROM base_remboursement_rum + ecart_arrondi
OR
base_remboursement_rum_sauf_transition IS DISTINCT FROM base_remboursement_rum_sauf_transition + ecart_arrondi_ht
OR
base_remboursement_rum_sauf_transition_sauf_ame IS DISTINCT FROM base_remboursement_rum_sauf_transition_sauf_ame + ecart_arrondi_hthame
OR
sejour_remboursable_rum IS DISTINCT FROM sejour_remboursable_rum + ecart_arrondi_r
);
DELETE FROM w_rsf_detail_rum p_rsf_detail WHERE est_ligne_rss <> '1' AND base_remboursement_rum = 0 AND sejour_remboursable_rum = 0;
-- Validation
INSERT INTO pmsi.p_rsf_detail(
finess,
no_rss,
nature,
mt,
dmt,
date_debut,
date_fin,
nombre,
coefficient,
prix_unitaire,
base_remboursement,
taux_remboursement,
sejour_facture,
sejour_remboursable,
compteur,
ligne_t2a,
pec_fj,
coefficient_mco,
sejour_remboursable_2,
ghs_id,
nature_noemie,
prestation_id,
rss_id,
type,
coefficient_geo,
est_ligne_rss,
est_ligne_rum,
no_rum,
unite_medicale_id,
base_remboursement_rum,
base_remboursement_rum_sauf_transition,
base_remboursement_rum_sauf_transition_sauf_ame,
montant_supplement_nf,
sejour_remboursable_rum,
pec_fj_id,
date_comptable,
operation_lamda,
fides_detail)
SELECT
finess,
no_rss,
nature,
mt,
dmt,
date_debut,
date_fin,
nombre,
coefficient,
prix_unitaire,
base_remboursement,
taux_remboursement,
sejour_facture,
sejour_remboursable,
compteur,
ligne_t2a,
pec_fj,
coefficient_mco,
sejour_remboursable_2,
ghs_id,
nature_noemie,
prestation_id,
rss_id,
type,
coefficient_geo,
est_ligne_rss,
est_ligne_rum,
no_rum,
unite_medicale_id,
base_remboursement_rum,
base_remboursement_rum_sauf_transition,
base_remboursement_rum_sauf_transition_sauf_ame,
montant_supplement_nf,
sejour_remboursable_rum,
pec_fj_id,
date_comptable,
operation_lamda,
fides_detail
FROM w_rsf_detail_rum;
-- Spécial BACLESSE
-- Ventilation suppléments radio à UM SRT
-- Ventilation supplément RAP hors UM 'PRT' dans UM 'SRT' (Tout ce qui n'est pas PRT, on ventile dans SRT)
IF EXISTS (SELECT * FROM base.t_finess WHERE code IN ('140000639', '140000555') LIMIT 1) THEN
UPDATE pmsi.p_rsf_detail SET
unite_medicale_id = (SELECT oid FROM pmsi.t_unites_medicales WHERE code = 'SRT')
WHERE est_ligne_rum = 1 AND prestation_id IN (SELECT oid FROM pmsi.t_prestations WHERE code like 'IRRE%' OR code = 'APHE');
UPDATE pmsi.p_rsf_detail SET
unite_medicale_id = (SELECT oid FROM pmsi.t_unites_medicales WHERE code = 'SRT')
WHERE est_ligne_rum = 1 AND prestation_id IN (SELECT oid FROM pmsi.t_prestations WHERE code = 'RAP') AND
unite_medicale_id <> (SELECT oid FROM pmsi.t_unites_medicales WHERE code = 'PRT') ;
UPDATE pmsi.p_rsf_detail SET
unite_medicale_id = (SELECT oid FROM pmsi.t_unites_medicales WHERE code = 'SRT')
WHERE est_ligne_rum = 1 AND prestation_id IN (SELECT oid FROM pmsi.t_prestations WHERE code = 'RAP') AND
unite_medicale_id <> (SELECT oid FROM pmsi.t_unites_medicales WHERE code = 'PRT');
END IF;
RETURN 'OK';
END;