return: text lang: plpgsql src: | DECLARE v_montant_limitation numeric := 0; v_ecart_br numeric := 0; v_ecart_br_ht numeric := 0; v_ecart_remb numeric := 0; v_nb_src_factures numeric := 0; v_nb_src_autorises numeric := 0; v_return_string text := ''; BEGIN DROP TABLE IF EXISTS w_imports; CREATE TEMP TABLE w_imports (import_id bigint, mat2a_import_id bigint, mat2a_annee numeric, mat2a_mois numeric, import_finess text); TRUNCATE w_imports; INSERT INTO w_imports SELECT MAX(p_imports.oid) AS import_id, (MAX(Array[p_imports.oid, p_imports.mat2a_import_id]))[2] AS mat2a_import_id, MAX(mat2a_annee) AS mat2a_annee, MAX(mat2a_mois) AS mat2a_mois, MAX(finess) AS import_finess FROM pmsi.p_imports JOIN pmsi.p_mat2a_import ON p_imports.mat2a_import_id = p_mat2a_import.oid WHERE 1=1 AND date_fin BETWEEN '20150101' AND '20201231' AND mat2a_import_id <> 0 AND etat = 'G' AND p_imports.oid IN (SELECT DISTINCT import_id FROM pmsi.p_rss WHERE etat = '') HAVING MAX(p_imports.oid) IS NOT NULL; -- Est-ce qu'il y a une limitation des prestations SC/SI ? SELECT MAX(base.cti_to_number(p_mat2a_data.data_mat2a[3])) FROM pmsi.p_mat2a_data JOIN w_imports ON w_imports.mat2a_import_id = p_mat2a_data.mat2a_import_id WHERE 1=1 AND line_type IN ('D','F') AND file_code = 'T1V1SV' AND data_mat2a[1] LIKE '%suppression des SI/SC en cas de limitation%' INTO v_montant_limitation; IF v_montant_limitation > 0 THEN -- Récuperation des ecarts à ventiler depuis le tableau OVALIDE SELECT base.cti_to_number(p_mat2a_data.data_cti[4]) - base.cti_to_number(p_mat2a_data.data_mat2a[4]) ,base.cti_to_number(p_mat2a_data.data_cti[5]) - base.cti_to_number(p_mat2a_data.data_mat2a[5]) ,base.cti_to_number(p_mat2a_data.data_cti[6]) - base.cti_to_number(p_mat2a_data.data_mat2a[6]) FROM pmsi.p_mat2a_data JOIN w_imports ON w_imports.mat2a_import_id = p_mat2a_data.mat2a_import_id WHERE 1=1 AND line_type IN ('D','F') AND file_code = 'T1V1RAV' AND data_mat2a[1] LIKE '%surveillance continue validés%' INTO v_ecart_br_ht, v_ecart_br, v_ecart_remb; -- Nombre de prestations SRC facturees SELECT SUM(nombre) FROM pmsi.p_rsf_detail JOIN pmsi.p_rss ON p_rss.oid = p_rsf_detail.rss_id JOIN pmsi.t_prestations ON t_prestations.oid = p_rsf_detail.prestation_id JOIN w_imports ON w_imports.import_id = p_rss.import_id WHERE 1=1 AND p_rsf_detail.est_ligne_rss = '1' AND p_rss.traitement_epmsi = '30' AND t_prestations.code = 'SRC' INTO v_nb_src_factures; -- Nombre de SRC autorises SELECT sum(date_part('doy',(((mat2a_annee * 100 + mat2a_mois)::text || '01')::timestamp + interval '1 month' - interval '1 day')::date) * nb_lits)::numeric AS nb_max FROM pmsi.t_unites_medicales JOIN w_imports ON w_imports.import_finess = t_unites_medicales.finess_geographique WHERE type_autorisation LIKE '03%' INTO v_nb_src_autorises; -- Si effectivement plus de SRC factures par rapport aux SRC autorises -- On cree une prestation fictive qui ventilera les decotes sur certains sejours IF v_nb_src_factures > v_nb_src_autorises THEN -- Suppression des prestations de limitation precedemment creees DELETE FROM pmsi.p_rsf_detail USING pmsi.p_rss ,pmsi.t_prestations ,w_imports WHERE 1=1 AND p_rss.oid = p_rsf_detail.rss_id AND t_prestations.oid = p_rsf_detail.prestation_id AND t_prestations.code = 'LIM_SRC' AND p_rss.import_id = w_imports.import_id; -- Ajout des lignes de facture -- Sur les sejours dont le nombre cumule (classe par date de sortie) de prestations -- depasse le maximun autorise INSERT INTO pmsi.p_rsf_detail ( rss_id ,prestation_id ,prix_unitaire ,base_remboursement_sauf_transition ,base_remboursement ,date_debut ,date_fin ,finess ,no_rss ,sejour_facture ,sejour_remboursable ,taux_remboursement ,coefficient_geo ,coefficient_mco ,coefficient_pacte_resp ,coefficient ,nombre ) WITH w_rsf AS ( SELECT p_rsf_detail.rss_id ,p_rss.no_rss ,p_rss.date_entree ,p_rss.date_sortie ,p_rss.finess ,max(coefficient_geo) OVER() AS coefficient_geo ,min(coefficient_mco) OVER() AS coefficient_mco ,min(coefficient_pacte_resp) OVER() AS coefficient_pacte_resp ,sum(nombre) over (PARTITION BY t_prestations.code ORDER BY p_rsf_detail.nombre DESC, p_rsf_detail.date_fin, p_rsf_detail.no_rss, p_rsf_detail.unite_medicale_id) AS cumul FROM temp.p_rsf_detail JOIN temp.p_rss ON p_rss.oid = p_rsf_detail.rss_id JOIN pmsi.t_prestations ON t_prestations.oid = p_rsf_detail.prestation_id JOIN pmsi.t_unites_medicales ON t_unites_medicales.oid = p_rsf_detail.unite_medicale_id JOIN w_imports ON w_imports.import_id = p_rss.import_id WHERE 1=1 AND p_rsf_detail.est_ligne_rss = '1' AND t_prestations.code IN ('SRC') AND p_rss.traitement_epmsi = '30' AND p_rsf_detail.base_remboursement > 0 ), w_select AS ( SELECT w_rsf.rss_id ,w_rsf.date_entree ,w_rsf.date_sortie ,w_rsf.finess ,w_rsf.no_rss ,w_rsf.coefficient_geo ,w_rsf.coefficient_mco ,w_rsf.coefficient_pacte_resp ,count(*) OVER() AS nb_rss FROM w_rsf WHERE 1=1 AND cumul > v_nb_src_autorises ) SELECT w_select.rss_id ,t_prestations.oid AS prestatation_id ,0 - round(v_ecart_br_ht / w_select.nb_rss, 2) AS prix_unitaire ,0 - round(v_ecart_br_ht / w_select.nb_rss, 2) as base_remboursement_sauf_transition ,0 - round(v_ecart_br / w_select.nb_rss, 2) AS base_remboursement ,w_select.date_entree AS date_debut ,w_select.date_sortie AS date_fin ,w_select.finess ,w_select.no_rss ,0 - round(v_ecart_br / w_select.nb_rss, 2) AS sejour_facture ,0 - round(v_ecart_remb / w_select.nb_rss, 2) AS sejour_remboursable ,100 AS taux_remboursement ,w_select.coefficient_geo ,w_select.coefficient_mco ,w_select.coefficient_pacte_resp ,1 AS coefficient ,-1 AS nombre FROM w_select, pmsi.t_prestations WHERE 1=1 AND t_prestations.code = 'LIM_SRC'; -- Mise à jour du tableau OVALIDE 1.V.1.RAV WITH w_update as ( SELECT COALESCE(SUM(p_rsf_detail.base_remboursement), 0) as w_br, COALESCE(SUM(p_rsf_detail.base_remboursement_sauf_transition), 0) as w_brht, COALESCE(SUM(p_rsf_detail.sejour_remboursable), 0) as w_remb FROM pmsi.p_rsf_detail JOIN temp.p_rss ON p_rss.oid = p_rsf_detail.rss_id JOIN w_imports ON w_imports.import_id = p_rss.import_id JOIN pmsi.t_prestations ON t_prestations.oid = p_rsf_detail.prestation_id WHERE t_prestations.code = 'LIM_SRC' ) UPDATE pmsi.p_mat2a_data SET data_cti[4] = base.cti_to_number(data_cti[4]) + w_br ,data_cti[5] = base.cti_to_number(data_cti[5]) + w_brht ,data_cti[6] = base.cti_to_number(data_cti[6]) + w_remb FROM w_imports, w_update WHERE 1=1 AND w_imports.mat2a_import_id = p_mat2a_data.mat2a_import_id AND line_type IN ('D','F') AND file_code = 'T1V1RAV' AND (data_mat2a[1] ILIKE '%surveillance continue validés%'OR data_mat2a[1] ILIKE '%Total valorisation%'); v_return_string = 'OK'; ELSE v_return_string = 'SRC factures inferieurs au Nombre max de SRC autorises'; END IF; ELSE v_return_string = 'Pas de limitation detectee dans le tableau T1V1SV'; END IF; RETURN v_return_string; END;