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.
 
 

2893 lines
103 KiB

<?xml version="1.0" encoding="ISO-8859-1"?>
<ROOT>
<NODE name="PMSICOMPLEMENTS" label="RECUPERATION DES DONNEES COMPLEMENTAIRES PMSI">
<NODE label="Tests initiaux">
<sqlcmd><![CDATA[
CTISELECT_PROPERTY_READ 'WITH_FACTU', count(*)
FROM information_schema.tables
WHERE table_schema = 'prod_web100t' AND table_name = 'fac_fact_ligne' ;
CTISELECT_PROPERTY_READ 'WITH_FACTU_RB2', CASE WHEN count(*) = 2 THEN 1 ELSE 0 END
FROM information_schema.tables
WHERE table_schema = 'prod_web100t' AND
table_name IN ('fac_fact_ligne','rb2_t4m') ;
]]></sqlcmd>
</NODE>
<NODE label="Paramètres">
<sqlcmd><![CDATA[
/**********************************************************************************
* REFERENCEMENT ETABLISSEMENT *
**********************************************************************************/
-- Récupération des paramètres établissement
-- EG utilisée dans les RUM (cas de FECAMP)
DROP TABLE IF EXISTS w_eg;
CREATE TEMP TABLE w_eg AS
SELECT RES_EG
FROM prod_web100t.DAT_RESUME
JOIN prod_web100t.DAT_GROUPAGE ON RES_OID = GRP_RESUME
WHERE GRP_FINESS = '[FINESS]' AND RES_EG <> 0
GROUP BY 1;
-- FINESS
DROP TABLE IF EXISTS w_finess
;
CREATE TEMP TABLE w_finess AS
SELECT
fin.nd_code as finess,
fin.nd_lib as texte,
ets2.nd_code as code,
ets2.nd_oid as oid,
ets.fld_entitefacturation as entite_facturation_id
FROM prod_web100t.sgn_nmcl_data as fin
JOIN prod_web100t.nmcl_etablissement as ets ON ets.fld_finessgeo = fin.nd_oid
JOIN prod_web100t.sgn_nmcl_data as ets2 ON ets2.nd_oid = ets.oid
WHERE fin.nd_code = '[FINESS]' OR ets.oid IN (SELECT RES_EG FROM w_eg)
;
/**********************************************************************************
* MAJ SPECIALITES MEDECIN *
**********************************************************************************/
-- Récupération des spécialites officielles
DROP TABLE IF EXISTS w_specialite
;
CREATE TEMP TABLE w_specialite AS
SELECT
spe.nd_oid as oid,
spe.nd_code as code,
spe.nd_lib as texte
FROM prod_web100t.sgn_nmcls as classe
JOIN prod_web100t.SGN_NMCL_DATA as spe ON spe.ND_NMCL_OID = classe.NMCL_OID
WHERE classe.NMCL_IDENT = 'SPECIALITEAMO'
;
-- Insertion des nouvelles spécialités officielles
INSERT INTO pmsi.t_specialites_medecin(code, texte)
SELECT code,texte
FROM w_specialite
WHERE code NOT IN (SELECT code FROM pmsi.t_specialites_medecin)
;
-- Màj des spécialités officielles créées via import PMSI
UPDATE pmsi.t_specialites_medecin
SET texte = w_specialite.texte
FROM w_specialite
WHERE t_specialites_medecin.code = w_specialite.code
AND t_specialites_medecin.code = t_specialites_medecin.texte
;
-- Récupération des spécialites internes
INSERT INTO pmsi.t_specialites_internes_medecin(code, texte)
SELECT CASE WHEN length(code) = 2 THEN code || '..' ELSE code END,texte
FROM w_specialite
WHERE CASE WHEN length(code) = 2 THEN code || '..' ELSE code END NOT IN (SELECT code FROM pmsi.t_specialites_internes_medecin)
;
/**********************************************************************************
* MAJ MEDECINS *
**********************************************************************************/
-- Récupération des médecins
DROP TABLE IF EXISTS w_medecin
;
CREATE TEMP TABLE w_medecin AS
SELECT
base.cti_group_array3(med.ND_OID) AS oid,
trim(med.ND_CODE) AS code,
max(med.ND_LIB) AS texte,
max(med_detail.FLD_CODEADELI) AS adeli,
max(coalesce(spe.ND_CODE,'')) AS specialite
FROM prod_web100t.SGN_NMCLS AS classe_med
JOIN prod_web100t.SGN_NMCL_DATA AS med ON med.ND_NMCL_OID = classe_med.NMCL_OID
JOIN prod_web100t.NMCL_INTERVENANT AS med_detail ON med_detail.OID = med.ND_OID
LEFT JOIN prod_web100t.SGN_NMCL_DATA AS spe ON spe.ND_OID = med_detail.FLD_SPECIALITE
LEFT JOIN w_finess ON w_finess.oid = med.nd_etablissement
WHERE
classe_med.NMCL_IDENT = 'INTERVENANT'
GROUP BY 2
;
CREATE INDEX w_medecin_i1
ON w_medecin
USING btree
(oid)
;
CREATE INDEX w_medecin_i2
ON w_medecin
USING btree
(code)
;
-- Insertion des nouveaux médecins
-- @TODO Lier les spécialités établissement (= interne)
INSERT INTO pmsi.t_medecins(code, nom, prenom, specialite_id, no_adeli, specialite_interne_id)
SELECT
w_medecin.code,
MAX(w_medecin.texte),
'',
MAX(spe.oid),
MAX(w_medecin.adeli),
0
FROM w_medecin
LEFT JOIN pmsi.t_specialites_medecin AS spe ON (spe.code = w_medecin.specialite)
WHERE w_medecin.code NOT IN (SELECT code FROM pmsi.t_medecins WHERE code IS NOT NULL GROUP BY 1)
GROUP BY 1
ORDER BY 1;
-- Mise à jour des médecins modifiés
UPDATE pmsi.t_medecins
SET nom = w_medecin.texte,
prenom = ''
FROM w_medecin
WHERE
t_medecins.code = w_medecin.code
AND (
t_medecins.nom IS DISTINCT FROM w_medecin.texte
OR t_medecins.prenom IS DISTINCT FROM ''
)
;
-- Spécialité interne par défaut
UPDATE pmsi.t_medecins
SET specialite_interne_id = t_specialites_internes_medecin.oid
FROM pmsi.t_specialites_medecin
JOIN pmsi.t_specialites_internes_medecin ON
CASE WHEN length(t_specialites_medecin.code) = 2 THEN t_specialites_medecin.code || '..' ELSE t_specialites_medecin.code END = t_specialites_internes_medecin.code
WHERE specialite_id = t_specialites_medecin.oid AND specialite_interne_id = 0 and specialite_id <> 0;
SELECT pmsi.cti_reorganize_medecins_c()
;
/**********************************************************************************
* MAJ UNITES MEDICALES *
**********************************************************************************/
-- Récupération données UM
DROP TABLE IF EXISTS w_um
;
CREATE TEMP TABLE w_um AS
SELECT
data_um.ND_OID AS oid,
data_um.ND_CODE AS code,
data_um.ND_LIB AS texte,
substr(CASE WHEN length(auth.ND_CODE) > 0 THEN auth.ND_CODE ELSE ' ' END, 1, 3) as type_autorisation
FROM prod_web100t.sgn_nmcls as classe_um
JOIN prod_web100t.SGN_NMCL_DATA as data_um ON data_um.ND_NMCL_OID = classe_um.NMCL_OID
JOIN prod_web100t.nmcl_unitemedicale as um ON um.oid = data_um.nd_oid
LEFT JOIN prod_web100t.SGN_NMCL_DATA as auth ON auth.nd_oid = um.fld_autorisation
WHERE
data_um.nd_etablissement IN (SELECT oid FROM w_finess)
AND classe_um.NMCL_IDENT = 'UNITEMEDICALE'
;
CREATE INDEX w_um_i1
ON w_um
USING btree
(oid)
;
CREATE INDEX w_um_i2
ON w_um
USING btree
(code)
;
-- Insertion des nouvelles UM
INSERT INTO pmsi.t_unites_medicales(code, texte, type_autorisation)
SELECT
code,
MAX(texte),
MAX(type_autorisation)
FROM w_um
WHERE code NOT IN (SELECT code FROM pmsi.t_unites_medicales)
GROUP BY 1
;
-- Màj libellés UM quand UM créée via import PMSI
UPDATE pmsi.t_unites_medicales
SET texte = w_um.texte
FROM w_um
WHERE
t_unites_medicales.code = w_um.code
AND (t_unites_medicales.texte = 'Unité ' || t_unites_medicales.code
OR t_unites_medicales.texte = t_unites_medicales.code)
;
-- Màj autorisations UM
UPDATE pmsi.t_unites_medicales
SET type_autorisation = w_um.type_autorisation
FROM w_um
WHERE t_unites_medicales.code = w_um.code
;
/**********************************************************************************
* MAJ ETABLISSEMENTS *
**********************************************************************************/
DROP TABLE IF EXISTS w_SGN_NMCL_DATA;
CREATE TEMP TABLE W_SGN_NMCL_DATA AS
SELECT
NMCL_IDENT,
ND_INVARIANT_OID,
(MAX(Array[ND_VALIDE_DE::text,ND_CODE]))[2] AS ND_CODE,
(MAX(Array[ND_VALIDE_DE::text,ND_LIB]))[2] AS ND_LIB
FROM prod_web100t.SGN_NMCL_DATA
JOIN prod_web100t.SGN_NMCLS ON ND_NMCL_OID = NMCL_OID
WHERE NMCL_IDENT = 'FINESS'
GROUP BY 1,2;
UPDATE base.t_etablissements
SET
texte = ND_LIB,
texte_court = ND_LIB
FROM
W_SGN_NMCL_DATA
WHERE 1=1 AND
ND_CODE = t_etablissements.code AND
t_etablissements.code = t_etablissements.texte
]]></sqlcmd>
</NODE>
<NODE label="Identités">
<sqlcmd><![CDATA[
-- Màj du n° administratif de séjour d'après PMSI
UPDATE [SCHEMA].p_rss
SET no_sejour_administratif = RSS_NO_HOSPIT::text
FROM prod_web100t.DAT_RESUME
JOIN prod_web100t.DEF_TYPE_RESUME ON DEF_TYPE_RESUME.TR_OID = DAT_RESUME.RES_TYPE
JOIN prod_web100t.DAT_RSS ON RES_OID = RSS_OID
WHERE p_rss.no_rss = DAT_RESUME.RES_OID
AND date(p_rss.date_sortie) = date(RES_DS_CALC)
AND DEF_TYPE_RESUME.TR_IDENT = 'RSS'
AND no_sejour_administratif IS DISTINCT FROM RSS_NO_HOSPIT::text;
-- Mise à jour n° séjour administratif pour les hors GHM
UPDATE [SCHEMA].p_rss
SET no_sejour_administratif = DA_NUMERO
FROM [SCHEMA].p_rsf_total
JOIN prod_web100t.FAC_FACTURE ON base.cti_to_number(fac_FACTURE.fact_numero) = base.cti_to_number(p_rsf_total.no_facture) AND base.cti_to_number(p_rsf_total.no_facture) <> 0
JOIN prod_web100t.DAT_DA on dat_da.da_oid = fac_FACTURE.fact_da
WHERE import_id = [IMPORT_ID]
AND p_rss.oid = p_rsf_total.rss_id
AND ghm_id = 0
AND date(p_rss.date_sortie) = date(DA_DATE_FIN)
AND no_sejour_administratif IS DISTINCT FROM DA_NUMERO
;
/**********************************************************************************
* MAJ DES PATIENTS *
**********************************************************************************/
DROP TABLE IF EXISTS w_PATIENTS;
CREATE TEMP TABLE w_PATIENTS AS
SELECT
PAT_ID,
REGEXP_REPLACE(PAT_IPP::text, '[,?]', '') AS PAT_IPP,
CASE WHEN base.cti_to_number(REGEXP_REPLACE(PAT_IPP, '[,?]', '')) > 0
THEN REGEXP_REPLACE(PAT_IPP, '[,?]', '')
ELSE to_number('0' || REGEXP_REPLACE(PAT_IPP, '[,?]', ''),'0000000000') || '000' || PAT_ID END::bigint AS PAT_IPP_NUM,
PAT_NOM,
PAT_PRENOM,
PAT_NOMNAISS,
PAT_NAISSANCE,
PAT_SEXE
FROM prod_web100T.PATIENTS
;
CREATE INDEX w_PATIENTS_i1
ON w_PATIENTS
USING btree
(PAT_ID)
;
ANALYSE w_PATIENTS
;
-- Màj du n° de patient RSS AVEC GHM
UPDATE [SCHEMA].p_rss
SET no_patient = PAT_IPP_NUM
FROM prod_web100t.DAT_RESUME
JOIN w_PATIENTS PATIENTS ON PATIENTS.PAT_ID = DAT_RESUME.RES_PATIENT
JOIN prod_web100t.DEF_TYPE_RESUME ON DEF_TYPE_RESUME.TR_OID = DAT_RESUME.RES_TYPE
WHERE
DAT_RESUME.RES_OID = p_rss.no_rss
AND p_rss.import_id = [IMPORT_ID]
AND DEF_TYPE_RESUME.TR_IDENT = 'RSS'
AND PAT_IPP BETWEEN '0' AND '9999999999999999'
AND ghm_id <> 0
AND p_rss.date_sortie = res_ds_calc::date
AND no_patient IS DISTINCT FROM PAT_IPP_NUM
;
-- Màj des n° de patient RSS SANS GHM
UPDATE [SCHEMA].p_rss
SET no_patient = PAT_IPP_NUM
FROM prod_web100t.fac_FACTURE
JOIN prod_web100t.dat_da on dat_da.da_oid = fac_FACTURE.fact_da
JOIN w_PATIENTS PATIENTS ON PATIENTS.PAT_id = dat_da.da_patient
WHERE
dat_da.da_numero = p_rss.no_sejour_administratif
AND base.cti_is_num(fac_FACTURE.fact_numero)
AND p_rss.import_id = [IMPORT_ID]
AND PAT_IPP BETWEEN '0' AND '9999999999999999'
AND ghm_id = 0
--AND FACT_NUMERO NOT LIKE '%.%'
AND position('.' in FACT_NUMERO) = 0
AND p_rss.date_sortie = DA_DATE_FIN::date
AND no_patient IS DISTINCT FROM PAT_IPP_NUM
;
-- Màj des noms, prénoms et nom de naissance des patients RSS AVEC GHM
UPDATE [SCHEMA].p_identites
SET
nom = PAT_NOM,
prenom = PAT_PRENOM,
nom_naissance = PAT_NOMNAISS
FROM [SCHEMA].p_rss
JOIN prod_web100t.DAT_RESUME ON DAT_RESUME.RES_OID = p_rss.no_rss
JOIN prod_web100t.DEF_TYPE_RESUME ON DEF_TYPE_RESUME.TR_OID = DAT_RESUME.RES_TYPE
JOIN w_PATIENTS PATIENTS ON PATIENTS.PAT_ID = DAT_RESUME.RES_PATIENT
WHERE
p_identites.rss_id = p_rss.oid
AND p_rss.import_id = [IMPORT_ID]
AND p_identites.rss_id = p_rss.oid
AND DEF_TYPE_RESUME.TR_IDENT = 'RSS'
AND ghm_id <> 0
AND p_rss.date_sortie = res_ds_calc::date
AND (
nom IS DISTINCT FROM PAT_NOM OR
prenom IS DISTINCT FROM PAT_PRENOM OR
nom_naissance IS DISTINCT FROM PAT_NOMNAISS
)
;
-- Màj des noms, prénoms et nom de naissance des patients RSS SANS GHM
UPDATE [SCHEMA].p_identites
SET
nom = PAT_NOM,
prenom = PAT_PRENOM,
nom_naissance = PAT_NOMNAISS
FROM [SCHEMA].p_rss
JOIN prod_web100t.dat_da ON dat_da.da_numero = p_rss.no_sejour_administratif
JOIN prod_web100t.fac_FACTURE ON dat_da.da_oid = fac_FACTURE.fact_da
JOIN w_PATIENTS PATIENTS ON PATIENTS.PAT_id = dat_da.da_patient
WHERE
p_identites.rss_id = p_rss.oid
AND base.cti_is_num(fac_FACTURE.fact_numero)
AND fac_FACTURE.fact_ef IN (select entite_facturation_id from w_finess)
AND p_rss.import_id = [IMPORT_ID]
AND ghm_id = 0
--AND FACT_NUMERO NOT LIKE '%.%'
AND position('.' in FACT_NUMERO) = 0
AND p_rss.date_sortie = DA_DATE_FIN::date
AND (
nom IS DISTINCT FROM PAT_NOM OR
prenom IS DISTINCT FROM PAT_PRENOM OR
nom_naissance IS DISTINCT FROM PAT_NOMNAISS
)
;
]]></sqlcmd>
</NODE>
<NODE label="Médecins RSS">
<sqlcmd><![CDATA[
/**********************************************************************************
* MAJ DES MEDECINS RSS *
**********************************************************************************/
-- Màj des medecins RSS pour les séjours AVEC GHM
UPDATE [SCHEMA].p_rss
SET medecin_rss_id = t_medecins.oid
FROM prod_web100t.DAT_RESUME
JOIN prod_web100t.DEF_TYPE_RESUME ON DEF_TYPE_RESUME.TR_OID = DAT_RESUME.RES_TYPE
JOIN prod_web100t.SGN_TREE_NODES on SGN_TREE_NODES.node_oid = DAT_RESUME.res_resp
JOIN w_medecin on SGN_TREE_NODES.NODE_INVARIANT_OID = ANY(w_medecin.oid)
JOIN pmsi.t_medecins ON t_medecins.code = w_medecin.code
WHERE
p_rss.no_rss = DAT_RESUME.RES_OID
AND DEF_TYPE_RESUME.TR_IDENT = 'RSS'
AND ghm_id <> 0
AND p_rss.date_sortie = res_ds_calc::date
AND medecin_rss_id IS DISTINCT FROM t_medecins.oid
AND p_rss.import_id = [IMPORT_ID]
;
-- D'après n° séjour
UPDATE [SCHEMA].p_rss
SET medecin_rss_id = t_medecins.oid
FROM prod_web100t.dat_da
JOIN prod_web100t.SGN_TREE_NODES on SGN_TREE_NODES.node_oid = dat_da.da_node_resp
JOIN w_medecin on SGN_TREE_NODES.NODE_INVARIANT_OID = ANY(w_medecin.oid)
JOIN pmsi.t_medecins ON t_medecins.code = w_medecin.code
WHERE
p_rss.no_sejour_administratif = DA_NUMERO
AND DA_EG_ENTREE IN (select oid from w_finess)
AND medecin_rss_id = 0
AND date_part('month',p_rss.date_sortie) = date_part('month',DA_DATE_FIN)
AND medecin_rss_id IS DISTINCT FROM t_medecins.oid
AND p_rss.import_id = [IMPORT_ID]
;
]]></sqlcmd>
</NODE>
<NODE label="Médecins actes externes">
<condition><![CDATA[
"[WITH_FACTU_RB2]" != "0"
]]></condition>
<sqlcmd><![CDATA[
-- Màj médecins actes CCAM RSS HORS GHM
UPDATE [SCHEMA].p_rss_actes
SET medecin_id = t_medecins.oid
FROM [SCHEMA].p_rss
JOIN prod_web100t.dat_sejour on sej_no_entree = p_rss.no_sejour_administratif
JOIN prod_web100t.fac_facture as fact on fact_da = sej_da
JOIN prod_web100t.fac_fact_ligne as li on li.li_facture = fact.fact_oid
JOIN prod_web100t.fac_fact_ligne_tier as flt on flt.flt_ligne_facture = li.li_ligne_maitre
JOIN prod_web100t.rb2_t4m as t4m on t4m.t4m_oid = li.li_oid
JOIN w_medecin ON flt.flt_intervenant = ANY(w_medecin.oid)
JOIN pmsi.t_medecins ON t_medecins.code = w_medecin.code
JOIN pmsi.t_actes ON t_actes.code = substring(t4m.t4m_acteccam, 1, 7)
WHERE
p_rss_actes.rss_id = p_rss.oid
AND p_rss_actes.acte_id = t_actes.oid
AND p_rss.ghm_id = 0
--AND FACT_NUMERO NOT LIKE '%.%'
AND position('.' in FACT_NUMERO) = 0
AND base.cti_is_num(fact.fact_numero)
AND p_rss_actes.activite_ccam = t4m.t4m_activite
AND p_rss_actes.date_acte = flt.flt_date_fin::date
AND p_rss_actes.medecin_id IS DISTINCT FROM t_medecins.oid
AND p_rss.import_id = [IMPORT_ID]
;
]]></sqlcmd>
</NODE>
<NODE label="Médecins actes">
<sqlcmd><![CDATA[
/**********************************************************************************
* MAJ DES MEDECINS ACTES *
**********************************************************************************/
-- Màj médecins actes CCAM RSS AVEC GHM, liaison sur ACT_CODE_PMSI si liaison sur DAT_ACTES.ACT_CODE ne marche pas
UPDATE [SCHEMA].p_rss_actes SET
medecin_id = t_medecins.oid,
extension_ccam = CASE WHEN extension_ccam = '' THEN ACT_EXT_DOC ELSE extension_ccam END
FROM prod_web100t.DAT_RESUME
JOIN [SCHEMA].p_rss ON p_rss.no_rss = DAT_RESUME.RES_PARENT
JOIN prod_web100t.DAT_ACTES ON DAT_RESUME.RES_OID = DAT_ACTES.ACT_RESUME
JOIN pmsi.t_actes ON LEFT(DAT_ACTES.ACT_CODE_PMSI,7) = t_actes.code
JOIN w_medecin ON ACT_EXECUTANT = ANY(w_medecin.oid)
JOIN pmsi.t_medecins ON t_medecins.code = w_medecin.code
WHERE
p_rss_actes.rss_id = p_rss.oid
AND p_rss_actes.acte_id = t_actes.oid
AND p_rss_actes.no_rum = DAT_RESUME.RES_INDEX
AND p_rss_actes.activite_ccam = ACT_CODE_ACTIVITE
AND p_rss_actes.date_acte = ACT_DATE::date
AND (p_rss_actes.medecin_id IS DISTINCT FROM t_medecins.oid OR extension_ccam IS DISTINCT FROM CASE WHEN extension_ccam = '' THEN ACT_EXT_DOC ELSE extension_ccam END)
AND p_rss.import_id = [IMPORT_ID]
;
-- Màj des médecins RSS d'après les médecins actes si pas encore de médecin RSS dans p_rss
-- et qu'il y a des exécutants renseignés dans p_rss_actes
-- On prend l'exécutant de l'acte avec le plus fort ICR
DROP TABLE IF EXISTS w_executants;
CREATE TEMP TABLE w_executants AS
SELECT
p_rss_actes.rss_id,
(MAX(ARRAY[t_actes.icr_1, p_rss_actes.medecin_id]))[2] AS medecin_id
FROM
[SCHEMA].p_rss_actes
JOIN pmsi.t_actes ON t_actes.oid = p_rss_actes.acte_id
JOIN [SCHEMA].p_rss ON p_rss.oid = p_rss_actes.rss_id
WHERE 1=1
AND p_rss.medecin_rss_id = 0
AND p_rss_actes.medecin_id != 0
AND p_rss_actes.activite_ccam = '1'
GROUP BY p_rss_actes.rss_id;
UPDATE [SCHEMA].p_rss SET
medecin_rss_id = w_executants.medecin_id
FROM w_executants
WHERE 1=1
AND w_executants.rss_id = p_rss.oid
AND p_rss.medecin_rss_id = 0;
]]></sqlcmd>
</NODE>
<NODE label="Unités médicales externes">
<sqlcmd><![CDATA[
DROP TABLE IF EXISTS w_ext_um;
CREATE TEMP TABLE w_ext_um AS
SELECT p_rss.oid AS rss_id, MAX(MVT_UF_SOIN) AS MVT_UF_SOIN, MAX(ND_CODE) AS ND_CODE, MAX(ND_LIB) AS ND_LIB, 0::bigint AS unite_medicale_id
FROM [SCHEMA].p_rss
JOIN prod_web100t.dat_da ON p_rss.no_sejour_administratif = DA_NUMERO
JOIN prod_web100t.DAT_SEJOUR ON SEJ_DA = DA_OID
JOIN prod_web100t.REGUL_MOUVEMENTS ON PHASE_OID = MVT_SEJ_OID AND MVT_TYPE = 2
JOIN prod_web100t.SGN_NMCL_DATA ON ND_INVARIANT_OID = MVT_UF_SOIN
WHERE
unite_medicale_principale_id = 0 AND
p_rss.date_sortie = DA_DATE_FIN AND
p_rss.ghm_id = 0
GROUP BY 1;
INSERT INTO pmsi.t_unites_medicales (code, texte)
SELECT ND_CODE, ND_LIB
FROM w_ext_um
WHERE ND_CODE NOT IN (SELECT code FROM pmsi.t_unites_medicales)
GROUP BY 1,2;
UPDATE w_ext_um
SET unite_medicale_id = t_unites_medicales.oid
FROM pmsi.t_unites_medicales
WHERE ND_CODE = t_unites_medicales.code;
UPDATE [SCHEMA].p_rss
SET unite_medicale_principale_id = unite_medicale_id
FROM w_ext_um
WHERE p_rss.oid = w_ext_um.rss_id;
UPDATE [SCHEMA].p_rss_rum
SET unite_medicale_id = w_ext_um.unite_medicale_id
FROM w_ext_um
WHERE p_rss_rum.rss_id = w_ext_um.rss_id;
UPDATE [SCHEMA].p_rss_actes
SET unite_medicale_id = w_ext_um.unite_medicale_id
FROM w_ext_um
WHERE p_rss_actes.rss_id = w_ext_um.rss_id;
UPDATE [SCHEMA].p_rss_diagnostics
SET unite_medicale_id = w_ext_um.unite_medicale_id
FROM w_ext_um
WHERE p_rss_diagnostics.rss_id = w_ext_um.rss_id;
]]></sqlcmd>
</NODE>
</NODE>
<NODE name="PMSIENCOURS" label="RECUPERATION DES DOSSIERS PMSI EN-COURS WEB100T">
<NODE label="Tests initiaux">
<sqlcmd><![CDATA[
CTISELECT_PROPERTY_READ 'WITH_FACTU', count(*)
FROM information_schema.tables
WHERE table_schema = 'prod_web100t' AND table_name = 'fac_fact_ligne' ;
CTISELECT_PROPERTY_READ 'WITH_FACTU_RB2', CASE WHEN count(*) = 2 THEN 1 ELSE 0 END
FROM information_schema.tables
WHERE table_schema = 'prod_web100t' AND
table_name IN ('fac_fact_ligne','rb2_t4m') ;
]]></sqlcmd>
</NODE>
<NODE label="Paramètres">
<sqlcmd><![CDATA[
/**********************************************************************************
* REFERENCEMENT ETABLISSEMENT *
**********************************************************************************/
-- Récupération des paramètres établissement
-- EG utilisée dans les RUM (cas de FECAMP)
DROP TABLE IF EXISTS w_eg;
CREATE TEMP TABLE w_eg AS
SELECT RES_EG
FROM prod_web100t.DAT_RESUME
JOIN prod_web100t.DAT_GROUPAGE ON RES_OID = GRP_RESUME
WHERE GRP_FINESS = '[FINESS]' AND RES_EG <> 0
GROUP BY 1;
-- FINESS
DROP TABLE IF EXISTS w_finess
;
CREATE TEMP TABLE w_finess AS
SELECT
fin.nd_code as finess,
fin.nd_lib as texte,
ets2.nd_code as code,
ets2.nd_oid as oid,
ets.fld_entitefacturation as entite_facturation_id
FROM prod_web100t.sgn_nmcl_data as fin
JOIN prod_web100t.nmcl_etablissement as ets ON ets.fld_finessgeo = fin.nd_oid
JOIN prod_web100t.sgn_nmcl_data as ets2 ON ets2.nd_oid = ets.oid
WHERE fin.nd_code = '[FINESS]' OR ets.oid IN (SELECT RES_EG FROM w_eg)
;
/**********************************************************************************
* MAJ SPECIALITES MEDECIN *
**********************************************************************************/
-- Récupération des spécialites officielles
DROP TABLE IF EXISTS w_specialite
;
CREATE TEMP TABLE w_specialite AS
SELECT
spe.nd_oid as oid,
spe.nd_code as code,
spe.nd_lib as texte
from prod_web100t.sgn_nmcls as classe
JOIN prod_web100t.SGN_NMCL_DATA as spe ON spe.ND_NMCL_OID = classe.NMCL_OID
where classe.NMCL_IDENT = 'SPECIALITEAMO'
;
-- Insertion des nouvelles spécialités officielles
INSERT INTO pmsi.t_specialites_medecin(code, texte)
SELECT code,texte
FROM w_specialite
WHERE code NOT IN (SELECT code FROM pmsi.t_specialites_medecin)
;
-- Màj des spécialités officielles créées via import PMSI
UPDATE pmsi.t_specialites_medecin
SET texte = w_specialite.texte
FROM w_specialite
WHERE t_specialites_medecin.code = w_specialite.code
AND t_specialites_medecin.code = t_specialites_medecin.texte
;
-- Récupération des spécialites internes
INSERT INTO pmsi.t_specialites_internes_medecin(code, texte)
SELECT CASE WHEN length(code) = 2 THEN code || '..' ELSE code END,texte
FROM w_specialite
WHERE CASE WHEN length(code) = 2 THEN code || '..' ELSE code END NOT IN (SELECT code FROM pmsi.t_specialites_internes_medecin)
;
/**********************************************************************************
* MAJ MEDECINS *
**********************************************************************************/
-- Récupération des médecins
DROP TABLE IF EXISTS w_medecin
;
CREATE TEMP TABLE w_medecin AS
SELECT
base.cti_group_array3(med.ND_OID) AS oid,
trim(med.ND_CODE) AS code,
max(med.ND_LIB) AS texte,
max(med_detail.FLD_CODEADELI) AS adeli,
max(coalesce(spe.ND_CODE,'')) AS specialite
FROM prod_web100t.SGN_NMCLS AS classe_med
JOIN prod_web100t.SGN_NMCL_DATA AS med ON med.ND_NMCL_OID = classe_med.NMCL_OID
JOIN prod_web100t.NMCL_INTERVENANT AS med_detail ON med_detail.OID = med.ND_OID
LEFT JOIN prod_web100t.SGN_NMCL_DATA AS spe ON spe.ND_OID = med_detail.FLD_SPECIALITE
LEFT JOIN w_finess ON w_finess.oid = med.nd_etablissement
WHERE (w_finess.oid IS NOT NULL OR med.nd_etablissement = 0) AND
classe_med.NMCL_IDENT = 'INTERVENANT'
GROUP BY 2
;
CREATE INDEX w_medecin_i1
ON w_medecin
USING btree
(oid)
;
CREATE INDEX w_medecin_i2
ON w_medecin
USING btree
(code)
;
-- Insertion des nouveaux médecins
-- @TODO Lier les spécialités établissement (= interne)
INSERT INTO pmsi.t_medecins(code, nom, prenom, specialite_id, no_adeli, specialite_interne_id)
SELECT
w_medecin.code,
w_medecin.texte,
'',
spe.oid,
w_medecin.adeli,
0
FROM w_medecin
LEFT JOIN pmsi.t_specialites_medecin AS spe ON (spe.code = w_medecin.specialite)
WHERE w_medecin.code NOT IN (SELECT code FROM pmsi.t_medecins GROUP BY 1)
;
-- Mise à jour des médecins modifiés
UPDATE pmsi.t_medecins
SET nom = w_medecin.texte,
prenom = ''
FROM w_medecin
WHERE
t_medecins.code = w_medecin.code
AND (
t_medecins.nom IS DISTINCT FROM w_medecin.texte
OR t_medecins.prenom IS DISTINCT FROM ''
)
;
-- Spécialité interne par défaut
UPDATE pmsi.t_medecins
SET specialite_interne_id = t_specialites_internes_medecin.oid
FROM pmsi.t_specialites_medecin
JOIN pmsi.t_specialites_internes_medecin ON
CASE WHEN length(t_specialites_medecin.code) = 2 THEN t_specialites_medecin.code || '..' ELSE t_specialites_medecin.code END = t_specialites_internes_medecin.code
WHERE specialite_id = t_specialites_medecin.oid AND specialite_interne_id = 0 and specialite_id <> 0;
SELECT pmsi.cti_reorganize_medecins_c()
;
/**********************************************************************************
* MAJ DES UNITES MEDICALES *
**********************************************************************************/
-- Récupération données UM
DROP TABLE IF EXISTS w_um
;
CREATE TEMP TABLE w_um AS
SELECT
data_um.ND_OID AS oid,
data_um.ND_CODE AS code,
data_um.ND_LIB AS texte,
substr(CASE WHEN length(auth.ND_CODE) > 0 THEN auth.ND_CODE ELSE ' ' END, 1, 3) as type_autorisation
FROM prod_web100t.sgn_nmcls as classe_um
JOIN prod_web100t.SGN_NMCL_DATA as data_um ON data_um.ND_NMCL_OID = classe_um.NMCL_OID
JOIN prod_web100t.nmcl_unitemedicale as um ON um.oid = data_um.nd_oid
LEFT JOIN prod_web100t.SGN_NMCL_DATA as auth ON auth.nd_oid = um.fld_autorisation
WHERE
data_um.nd_etablissement IN (SELECT oid FROM w_finess)
AND classe_um.NMCL_IDENT = 'UNITEMEDICALE'
;
CREATE INDEX w_um_i1
ON w_um
USING btree
(oid)
;
CREATE INDEX w_um_i2
ON w_um
USING btree
(code)
;
-- Insertion des nouvelles UM
INSERT INTO pmsi.t_unites_medicales(code, texte, type_autorisation)
SELECT
code,
MAX(texte),
MAX(type_autorisation)
FROM w_um
WHERE code NOT IN (SELECT code FROM pmsi.t_unites_medicales)
GROUP BY 1
;
-- Màj libellés UM quand UM créée via import PMSI
UPDATE pmsi.t_unites_medicales
SET texte = w_um.texte
FROM w_um
WHERE
t_unites_medicales.code = w_um.code
AND (t_unites_medicales.texte = 'Unité ' || t_unites_medicales.code
OR t_unites_medicales.texte = t_unites_medicales.code)
;
-- Màj autorisations UM
UPDATE pmsi.t_unites_medicales
SET type_autorisation = w_um.type_autorisation
FROM w_um
WHERE t_unites_medicales.code = w_um.code AND
t_unites_medicales.type_autorisation = ''
;
/**********************************************************************************
* TABLE TEMP GHM *
**********************************************************************************/
DROP TABLE IF EXISTS w_ghm
;
CREATE TEMP TABLE w_ghm AS
SELECT ND_OID AS oid, CASE WHEN MAX(ND_CODE) NOT LIKE '90%' THEN MAX(ND_CODE) ELSE '99Z99Z' END AS code
FROM prod_web100t.SGN_NMCL_DATA
JOIN prod_web100t.SGN_NMCLS ON SGN_NMCLS.NMCL_OID = SGN_NMCL_DATA.ND_NMCL_OID
WHERE SGN_NMCLS.NMCL_IDENT = 'GHM'
GROUP BY ND_OID
;
INSERT INTO w_ghm
SELECT ND_INVARIANT_OID AS oid, MAX(ND_CODE) AS code
FROM prod_web100t.SGN_NMCL_DATA
JOIN prod_web100t.SGN_NMCLS ON SGN_NMCLS.NMCL_OID = SGN_NMCL_DATA.ND_NMCL_OID
WHERE
SGN_NMCLS.NMCL_IDENT = 'GHM'
AND ND_INVARIANT_OID <> ND_OID
AND ND_INVARIANT_OID NOT IN (SELECT oid FROM w_ghm)
GROUP BY ND_INVARIANT_OID
;
CREATE INDEX w_ghm_i1
ON w_ghm
USING btree
(oid)
;
CREATE INDEX w_ghm_i2
ON w_ghm
USING btree
(code)
;
/**********************************************************************************
* TABLE TEMP GHS *
**********************************************************************************/
DROP TABLE IF EXISTS w_ghs
;
CREATE TEMP TABLE w_ghs AS
SELECT ND_OID AS oid, MAX(to_number(ND_CODE,'0000')) AS code
FROM prod_web100t.SGN_NMCL_DATA
JOIN prod_web100t.SGN_NMCLS ON SGN_NMCLS.NMCL_OID = SGN_NMCL_DATA.ND_NMCL_OID
WHERE SGN_NMCLS.NMCL_IDENT = 'GHS'
GROUP BY ND_OID
;
INSERT INTO w_ghs
SELECT ND_INVARIANT_OID AS oid, MAX(to_number(ND_CODE,'0000')) AS code
FROM prod_web100t.SGN_NMCL_DATA
JOIN prod_web100t.SGN_NMCLS ON SGN_NMCLS.NMCL_OID = SGN_NMCL_DATA.ND_NMCL_OID
WHERE
SGN_NMCLS.NMCL_IDENT = 'GHS'
AND ND_INVARIANT_OID <> ND_OID
AND ND_INVARIANT_OID NOT IN (SELECT oid FROM w_ghs)
GROUP BY ND_INVARIANT_OID
;
CREATE INDEX w_ghs_i1
ON w_ghs
USING btree
(oid)
;
CREATE INDEX w_ghs_i2
ON w_ghs
USING btree
(code)
;
]]></sqlcmd>
</NODE>
<NODE label="RSS">
<sqlcmd><![CDATA[
/**********************************************************************************
* PREPARATION TABLE PATIENTS *
**********************************************************************************/
DROP TABLE IF EXISTS w_PATIENTS;
CREATE TEMP TABLE w_PATIENTS AS
SELECT
PAT_ID,
REGEXP_REPLACE(PAT_IPP::text, '[,?]', '') AS PAT_IPP,
CASE WHEN base.cti_to_number(REGEXP_REPLACE(PAT_IPP, '[,?]', '')) > 0
THEN REGEXP_REPLACE(PAT_IPP, '[,?]', '')
ELSE to_number('0' || REGEXP_REPLACE(PAT_IPP, '[,?]', ''),'0000000000') || '000' || PAT_ID END::bigint AS PAT_IPP_NUM,
PAT_NOM,
PAT_PRENOM,
PAT_NOMNAISS,
PAT_NAISSANCE,
PAT_SEXE
FROM prod_web100T.PATIENTS
;
/**********************************************************************************
* REFERENCEMENT DES RSS GROUPES DANS WEB100T *
**********************************************************************************/
DROP TABLE IF EXISTS w_DAT_GROUPAGE
;
CREATE TEMP TABLE w_DAT_GROUPAGE AS
SELECT
GRP_RESUME AS w_GRP_RESUME,
MAX(GRP_OID) AS w_GRP_OID,
MAX(GRP_FINESS) AS w_GRP_FINESS
FROM prod_web100t.DAT_GROUPAGE
GROUP BY 1
;
CREATE INDEX w_DAT_GROUPAGE_i1
ON w_DAT_GROUPAGE
USING btree
(w_GRP_RESUME)
;
CREATE INDEX w_DAT_GROUPAGE_i2
ON w_DAT_GROUPAGE
USING btree
(w_GRP_OID)
;
/**********************************************************************************
* REFERENCEMENT DES RSS DEJA EXISTANTS DANS i-CTI *
**********************************************************************************/
DROP TABLE IF EXISTS w_DAT_RESUME_deja
;
CREATE TEMP TABLE w_DAT_RESUME_deja AS
SELECT
RES_HOSPIT AS w_RES_HOSPIT_deja,
substr(mois_sortie,1,4) as annee
FROM pmsi.p_rss
JOIN prod_web100t.DAT_RESUME ON no_rss = DAT_RESUME.RES_OID AND
date_trunc('month',p_rss.date_sortie) = date_trunc('month',RES_DS_CALC)
GROUP BY 1,2
;
CREATE INDEX w_DAT_RESUME_deja_i1
ON w_DAT_RESUME_deja
USING btree
(w_RES_HOSPIT_deja)
;
INSERT INTO w_DAT_RESUME_deja
SELECT
RES_HOSPIT AS w_RES_HOSPIT_deja,
substr(mois_sortie,1,4) as annee
FROM prod_web100t.DAT_RESUME
JOIN prod_web100t.DAT_HOSPIT ON RES_HOSPIT = HOSP_OID
JOIN prod_web100t.DAT_RSS ON RES_OID = RSS_OID
JOIN pmsi.p_rss ON RSS_NO_HOSPIT = no_sejour_administratif
LEFT JOIN w_DAT_RESUME_deja ON w_RES_HOSPIT_deja = RES_HOSPIT AND
substr(mois_sortie,1,4) = annee
WHERE date_trunc('month',date_sortie) = date_trunc('month',RES_DS_CALC) AND
w_RES_HOSPIT_deja IS NULL
GROUP BY 1,2
;
/**********************************************************************************
* REFERENCEMENT DES RSS A INSERER DANS iCTI *
**********************************************************************************/
DROP TABLE IF EXISTS w_rss
;
CREATE TEMP TABLE w_rss AS
SELECT
DAT_RESUME.RES_HOSPIT,
MAX(DAT_RESUME.RES_OID) AS RES_OID,
MAX(DAT_RESUME.RES_DS_CALC) AS RES_DS,
MAX(DAT_RESUME.RES_DE_CALC) AS RES_DE,
MAX(DAT_RESUME.RES_PATIENT) AS RES_PATIENT,
MAX(w_GRP_FINESS) AS finess,
MAX(w_GRP_OID) AS GRP_OID,
MAX(COALESCE(DA_OID,0)) AS DA_OID,
MAX(DAT_RUM.RUM_AGE_GEST::numeric) AS RUM_AGE_GEST,
MAX(DAT_RUM.RUM_DERNIERES_REGLES::date) AS RUM_DERNIERES_REGLES,
MAX(DAT_DA.DA_DIM_VALID) AS w_DA_DIM_VALID,
MAX(CASE WHEN DAT_RUM.RUM_RESCRIT_TARIFAIRE = 1 THEN 1 WHEN DAT_RUM.RUM_RESCRIT_TARIFAIRE = 0 THEN 2 ELSE 0 END) AS w_rescrit_tarif_id,
MAX(CASE WHEN DAT_RUM.RUM_CONTEXTE_PATIENT_CALC = 1 THEN 1 WHEN DAT_RUM.RUM_CONTEXTE_PATIENT_CALC = 0 THEN 2 ELSE 0 END) AS w_contexte_pat_id,
MAX(CASE WHEN DAT_RUM.RUM_ADMINISTRATION_RH_CALC = 1 THEN 1 WHEN DAT_RUM.RUM_ADMINISTRATION_RH_CALC = 0 THEN 2 ELSE 0 END) AS w_adm_prod_reshospi_id,
MAX(COALESCE(DAT_RUM.RUM_CAT_NB_INTERVENTIONS_CALC,0)) AS w_nb_intervention_id,
MAX(CASE WHEN DAT_RUM.RUM_ADNP_CALC = 1 THEN 1 WHEN DAT_RUM.RUM_ADNP_CALC = 0 THEN 2 ELSE 0 END) AS w_np_id,
MAX(COALESCE(RES_REF.RES_URGENCE_CALC,0)) AS PASSAGE_URGENCES_OID,
MAX(DAT_RUM.RUM_RAAC) AS raac,
nextval('pmsi.s_rss'::regclass) AS rss_id
FROM prod_web100t.DAT_RESUME
JOIN w_DAT_GROUPAGE ON RES_OID = w_GRP_RESUME
JOIN prod_web100t.DEF_TYPE_RESUME ON DEF_TYPE_RESUME.TR_OID = DAT_RESUME.RES_TYPE
JOIN prod_web100t.DAT_HOSPIT ON RES_HOSPIT = HOSP_OID
JOIN prod_web100t.DAT_RSS ON RES_OID = RSS_OID
LEFT JOIN prod_web100t.DAT_RESUME RES_REF ON RES_REF.RES_PARENT = DAT_RESUME.RES_OID
LEFT JOIN prod_web100t.DAT_RUM on DAT_RUM.RUM_OID = RES_REF.RES_OID
LEFT JOIN prod_web100t.DAT_DA ON DA_NUMERO = RSS_NO_HOSPIT
LEFT JOIN w_DAT_RESUME_deja ON 1=1
AND DAT_RESUME.RES_HOSPIT = w_RES_HOSPIT_deja
AND w_DAT_RESUME_deja.annee = to_char(DAT_RESUME.RES_DS_CALC, 'YYYY')
WHERE 1=1
AND DAT_RESUME.RES_DS_CALC BETWEEN '[ANNEE]0101' AND ('[ANNEE]1231'::date + '10 years'::interval)::date
AND DAT_RESUME.RES_OID > 0
AND DEF_TYPE_RESUME.TR_IDENT = 'RSS'
AND w_RES_HOSPIT_deja IS NULL
GROUP BY 1
HAVING MAX(w_GRP_FINESS) = '[FINESS]'
ORDER BY 2
;
CREATE INDEX w_rss_i1
ON w_rss
USING btree
(RES_OID)
;
CREATE INDEX w_rss_i2
ON w_rss
USING btree
(GRP_OID)
;
CREATE INDEX w_rss_i3
ON w_rss
USING btree
(RES_PATIENT)
;
CREATE INDEX w_rss_i4
ON w_rss
USING btree
(DA_OID)
;
DROP TABLE IF EXISTS w_SGN_NMCL_DATA;
CREATE TEMP TABLE W_SGN_NMCL_DATA AS
SELECT
DISTINCT ND_INVARIANT_OID,
first_value(ND_CODE) OVER w as ND_CODE,
first_value(ND_LIB) OVER w as ND_LIB
FROM prod_web100t.SGN_NMCL_DATA
JOIN prod_web100t.SGN_NMCLS ON ND_NMCL_OID = NMCL_OID
WHERE SGN_NMCLS.NMCL_IDENT = 'ERREURMCO'
WINDOW w AS (PARTITION BY ND_INVARIANT_OID ORDER BY ND_VALIDE_DE DESC)
ORDER BY ND_CODE
;
/**********************************************************************************
* INSERTION DES NOUVEAUX RSS *
**********************************************************************************/
INSERT INTO pmsi.p_rss (
finess,
oid,
no_rss,
no_patient,
version_groupage,
date_naissance,
sexe,
date_entree,
date_sortie,
mode_entree,
provenance,
mode_sortie,
destination,
code_postal,
poids_bebe,
igs2,
cma,
groupe_ghm,
duree_sejour,
nb_rsa,
age,
supprime,
date_import,
nb_rum,
secteur,
no_sejour_administratif,
nb_seances,
ghm_fg9,
ghm_id,
medecin_rss_id,
ghs_id,
mois_sortie,
diagnostic_principal_id,
diagnostic_relie_id,
no_rum_principal,
unite_medicale_principale_id,
import_id,
etat,
acte_principal_id,
code_postal_id,
patient_id,
prestation_principale_id,
severite_fg11_simulation_code,
en_cours,
en_cours_etat,
base_remboursement,
sejour_facture,
honoraires_factures,
t2a_facture,
dmi_facture,
phc_facture,
ca_ghs_theorique,
nb_ghs,
ca_ghs,
nb_exb,
ca_exb,
nb_exh,
ca_exh,
nb_si,
ca_si,
nb_sur,
ca_sur,
nb_rea,
ca_rea,
nb_neonat,
ca_neonat,
traitement_epmsi,
code_retour_groupage,
comite_medical_id,
rehosp_meme_ghm,
age_gestationnel,
date_dernieres_regles,
from_oid,
rescrit_tarif_id,
contexte_pat_id,
adm_prod_reshospi_id,
nb_intervention_id,
np_id,
raac_id,
passage_urgences_code
)
SELECT
w_rss.finess AS finess,
w_rss.rss_id AS oid,
w_rss.RES_OID AS no_rss,
PAT_IPP_NUM AS no_patient,
'' AS version_groupage,
PATIENTS.PAT_NAISSANCE AS date_naissance,
PATIENTS.PAT_SEXE AS sexe,
DAT_RESUME.RES_DE_CALC AS date_entree,
DAT_RESUME.RES_DS_CALC AS date_sortie,
substr(DAT_RESUME.RES_ME_PMSI,1,1) AS mode_entree,
substr(DAT_RESUME.RES_ME_PMSI,2,1) AS provenance,
substr(DAT_RESUME.RES_MS_PMSI,1,1) AS mode_sortie,
substr(DAT_RESUME.RES_MS_PMSI,2,1) AS destination,
DAT_INFO_PATIENT.PAT_CODE_POSTAL AS code_postal,
0 AS poids_bebe,
0 AS igs2,
'' AS cma,
substr(w_ghm.code , 3 , 1) AS groupe_ghm,
CASE
WHEN RES_DS_CALC > RES_DE_CALC
THEN date(RES_DS_CALC) - date(RES_DE_CALC)
ELSE 0
END AS duree_sejour,
CASE
WHEN substr(w_ghm.code,1,2) = '28'
THEN RES_SEANCES
ELSE 1
END AS nb_rsa,
CASE
WHEN RES_DS_CALC > PATIENTS.PAT_NAISSANCE
THEN trunc((date(RES_DE_CALC) - date(PATIENTS.PAT_NAISSANCE)) / 365.25,0)
ELSE 0
END AS age,
'' AS supprime,
now() AS date_import,
RSS_NBRE_RUM AS nb_rum,
'' AS secteur,
COALESCE(RSS_NO_HOSPIT::text,''::text) AS no_sejour_administratif,
CASE
WHEN substr(w_ghm.code,1,2) = '28'
THEN RES_SEANCES
ELSE 0
END AS nb_seances,
'' AS ghm_fg9,
COALESCE(t_ghm.oid, 0) AS ghm_id,
COALESCE(t_medecins.oid,0) AS medecin_rss_id,
COALESCE(t_ghs.oid, 0) AS ghs_id,
date_part('year', RES_DS_CALC) * 100 + date_part('month', RES_DS_CALC) AS mois_sortie,
0 AS diagnostic_principal_id,
0 AS diagnostic_relie_id,
1 AS no_rum_principal,
0 AS unite_medicale_principale_id,
-1 AS import_id,
'' AS etat,
0 AS acte_principal_id,
0 AS code_postal_id,
0 AS patient_id,
0 AS prestation_principale_id,
'' AS severite_fg11_simulation_code,
'1' AS en_cours,
CASE
WHEN length(w_ghm.code) = 6 AND substr(w_ghm.code,1,2) <> '90' AND substr(w_ghm.code,1,2) <> '99' AND GRP_CORRECT = 1 AND w_DA_DIM_VALID IS DISTINCT FROM NULL
THEN 'V'
WHEN length(w_ghm.code) = 6 AND substr(w_ghm.code,1,2) <> '90' AND substr(w_ghm.code,1,2) <> '99'
THEN 'G'
ELSE 'S'
END AS en_cours_etat,
0 AS base_remboursement,
0 AS sejour_facture,
0 AS honoraires_factures,
0 AS t2a_facture,
0 AS dmi_facture,
0 AS phc_facture,
0 AS ca_ghs_theorique,
0 AS nb_ghs,
0 AS ca_ghs,
0 AS nb_exb,
0 AS ca_exb,
0 AS nb_exh,
0 AS ca_exh,
0 AS nb_si,
0 AS ca_si,
0 AS nb_sur,
0 AS ca_sur,
0 AS nb_rea,
0 AS ca_rea,
0 AS nb_neonat,
0 AS ca_neonat,
'' AS traitement_epmsi,
COALESCE(CASE WHEN w_SGN_NMCL_DATA.ND_CODE ~'[A-Z][0-9]*' THEN substring(w_SGN_NMCL_DATA.ND_CODE,2) ELSE w_SGN_NMCL_DATA.ND_CODE END,'') AS code_retour_groupage,
0 AS comite_medical_id,
'0' AS rehosp_meme_ghm,
COALESCE(RUM_AGE_GEST, 0),
RUM_DERNIERES_REGLES,
0 AS from_oid,
w_rescrit_tarif_id,
w_contexte_pat_id,
w_adm_prod_reshospi_id,
w_nb_intervention_id,
w_np_id,
COALESCE(t_raac.oid, 0),
COALESCE(t_passage_urgences.code, '')
FROM prod_web100t.DAT_RESUME
JOIN w_rss ON (DAT_RESUME.RES_OID = w_rss.RES_OID)
JOIN w_PATIENTS PATIENTS ON (w_rss.RES_PATIENT = PATIENTS.PAT_ID)
JOIN prod_web100t.DAT_INFO_PATIENT ON (w_rss.RES_PATIENT = DAT_INFO_PATIENT.PAT_OID)
JOIN prod_web100t.DAT_GROUPAGE ON w_rss.GRP_OID = DAT_GROUPAGE.GRP_OID
LEFT JOIN prod_web100t.DAT_RSS ON w_rss.RES_OID = RSS_OID
LEFT JOIN w_ghm ON w_ghm.oid = GRP_GHM
LEFT JOIN w_ghs ON w_ghs.oid = GRP_CODE_GHS
LEFT JOIN pmsi.t_ghm ON (w_ghm.code = t_ghm.code)
LEFT JOIN pmsi.t_ghs ON (w_ghs.code = t_ghs.code)
LEFt JOIN prod_web100t.SGN_TREE_NODES ON NODE_OID = RES_RESP
LEFT JOIN w_medecin ON SGN_TREE_NODES.NODE_INVARIANT_OID = ANY(w_medecin.oid)
LEFT JOIN pmsi.t_medecins ON t_medecins.code = w_medecin.code
LEFT JOIN w_SGN_NMCL_DATA ON w_SGN_NMCL_DATA.ND_INVARIANT_OID = GRP_ERROR
LEFT JOIN pmsi.t_raac ON t_raac.code = w_rss.raac
LEFT JOIN pmsi.t_passage_urgences ON t_passage_urgences.oid = w_rss.PASSAGE_URGENCES_OID
WHERE w_rss.finess = '[FINESS]'
;
UPDATE pmsi.p_rss
SET no_rum_principal = RES_INDEX
FROM prod_web100t.DAT_RSS
JOIN prod_web100t.DAT_RESUME ON RSS_OID_RUM_CLASSANT = RES_OID
WHERE p_rss.no_rss = RSS_OID AND
en_cours = '1' AND
RES_INDEX > 1
;
/**********************************************************************************
* REAFFECTATION DES RSS MERE ASSOCIES AUX BEBES (CMD 14 et 15) *
**********************************************************************************/
-- On récupère les no_rss des bébé et mère qui sont liés ensemble
DROP TABLE IF EXISTS w_BB;
CREATE TEMP TABLE w_BB AS (
SELECT DAT_RESUME.RES_OID AS NO_RSS_BB, DAT_RESUME.RES_NUM AS NO_ADMINISTRATIF_BB, DAT_RUM.RUM_OID AS RUM_OID_BB, DAT_RUM.RUM_MERE_OID
FROM prod_web100t.DAT_RESUME
LEFT JOIN prod_web100t.DAT_RESUME RES_REF ON RES_REF.RES_PARENT = DAT_RESUME.RES_OID
LEFT JOIN prod_web100t.DAT_RUM on DAT_RUM.RUM_OID = RES_REF.RES_OID
WHERE DAT_RUM.RUM_MERE_OID <> 0
AND DAT_RESUME.RES_DS_CALC BETWEEN '[ANNEE]0101' AND ('[ANNEE]1231'::date + '10 years'::interval)::date );
DROP TABLE IF EXISTS w_BB_MERE;
CREATE TEMP TABLE w_BB_MERE AS (
SELECT NO_RSS_BB, NO_ADMINISTRATIF_BB, RES_MERE.RES_OID AS NO_RSS_MERE, RES_MERE.RES_NUM AS NO_ADMINISTRATIF_MERE
FROM w_bb
JOIN prod_web100t.DAT_RUM RUM_MERE ON w_bb.RUM_MERE_OID = RUM_MERE.RUM_OID
JOIN prod_web100t.DAT_RESUME RES_REF_MERE ON RES_REF_MERE.RES_OID = RUM_MERE.RUM_OID
JOIN prod_web100t.DAT_RESUME RES_MERE ON RES_REF_MERE.RES_PARENT = RES_MERE.RES_OID
ORDER BY 1
)
;
-- On assigne le rss_id de la mère dans la ligne rss du bébé
WITH w_ids AS(
SELECT no_rss_bb , oid as w_rss_mere_id
FROM w_BB_MERE
JOIN pmsi.p_rss ON NO_RSS_MERE = no_rss
WHERE import_id = -1
)
UPDATE pmsi.p_rss
SET rss_mere_id = w_rss_mere_id
FROM w_ids
WHERE p_rss.no_rss = w_ids.no_rss_bb
AND w_rss_mere_id IS DISTINCT FROM rss_mere_id
AND import_id = -1
;
INSERT INTO pmsi.p_rss_leg (finess, no_rsa, rss_id, code_retour_id, nombre)
SELECT
finess
, 0 AS no_rsa
, p_rss.oid AS rss_id
, t_codes_retour_groupeur.oid
, 1
FROM prod_web100t.DAT_RESUME
JOIN prod_web100t.DAT_GROUPAGE ON DAT_RESUME.RES_OID = DAT_GROUPAGE.GRP_RESUME
JOIN prod_web100t.DAT_RSS ON DAT_RESUME.RES_OID = RSS_OID
JOIN w_SGN_NMCL_DATA ON w_SGN_NMCL_DATA.ND_INVARIANT_OID = GRP_ERROR
JOIN pmsi.t_codes_retour_groupeur ON t_codes_retour_groupeur.type || t_codes_retour_groupeur.code = w_SGN_NMCL_DATA.ND_CODE
JOIN pmsi.p_rss ON RSS_NO_HOSPIT::text = no_sejour_administratif
WHERE GRP_ERROR IS NOT NULL
AND import_id = -1
AND finess = '[FINESS]'
;
-- transferts d'établissements
DROP TABLE IF EXISTS w_SGN_NMCL_DATA;
CREATE TEMP TABLE W_SGN_NMCL_DATA AS
SELECT
NMCL_IDENT,
ND_INVARIANT_OID,
(MAX(Array[ND_VALIDE_DE::text,ND_CODE]))[2] AS ND_CODE,
(MAX(Array[ND_VALIDE_DE::text,ND_LIB]))[2] AS ND_LIB
FROM prod_web100t.SGN_NMCL_DATA
JOIN prod_web100t.SGN_NMCLS ON ND_NMCL_OID = NMCL_OID
WHERE NMCL_IDENT = 'FINESS'
GROUP BY 1,2;
INSERT INTO base.t_etablissements (code, texte, texte_court)
SELECT
ND_CODE,
ND_LIB,
ND_LIB
FROM
w_SGN_NMCL_DATA
WHERE 1=1 AND
NMCL_IDENT = 'FINESS' AND
ND_INVARIANT_OID IN (SELECT DISTINCT MVT_AUTRE_ETS FROM prod_web100t.REGUL_MOUVEMENTS) AND
ND_CODE NOT IN (SELECT CODE FROM base.t_etablissements)
;
/**********************************************************************************
* ETABLISSEMENT PROVENANCE ET DESTINATION (TRANSFERT) *
**********************************************************************************/
-- Insertion des établissement de provenance et destination dans p_rss_transfert
-- Traitement en commun réalisé dans import_rss_rsf_encours.php (generation_rum_post_traitements())
-- Grâce à la table w_TRANSFERTS
DROP TABLE IF EXISTS temp.w_TRANSFERTS;
CREATE TABLE temp.w_TRANSFERTS AS
SELECT
p_rss.oid AS rss_id,
import_id,
COALESCE(MIN(CASE WHEN MVT_TYPE = 1 THEN t_etablissements.oid ELSE null END),0) AS prov_id,
COALESCE(MIN(CASE WHEN MVT_TYPE = 2 THEN t_etablissements.oid ELSE null END),0) AS dest_id
FROM
pmsi.p_rss
JOIN prod_web100t.DAT_SEJOUR ON SEJ_NO_ENTREE = no_sejour_administratif
JOIN prod_web100t.REGUL_MOUVEMENTS ON MVT_SEJ_OID = PHASE_OID
JOIN w_SGN_NMCL_DATA ON MVT_AUTRE_ETS = ND_INVARIANT_OID AND NMCL_IDENT = 'FINESS'
LEFT JOIN base.t_etablissements ON ND_CODE = code
WHERE 1=1 AND
MVT_AUTRE_ETS != 0 AND
etat != 'S'
GROUP BY 1,2
;
]]></sqlcmd>
</NODE>
<NODE label="Identités">
<sqlcmd><![CDATA[
/**********************************************************************************
* MAJ DES PATIENTS *
**********************************************************************************/
INSERT INTO pmsi.p_identites(
finess,
rss_id,
no_rss,
nom,
prenom,
nom_naissance)
SELECT
w_rss.finess AS finess,
w_rss.rss_id AS rss_id,
w_rss.RES_OID AS no_rss,
PAT_NOM AS nom,
PAT_PRENOM AS prenom,
PAT_NOMNAISS AS nom_naissance
FROM w_rss
JOIN w_PATIENTS PATIENTS ON (w_rss.RES_PATIENT = PATIENTS.PAT_ID)
;
-- Màj du n° de patient RSS AVEC GHM
UPDATE pmsi.p_rss
SET no_patient = PAT_IPP_NUM
FROM prod_web100t.DAT_RESUME
JOIN w_PATIENTS PATIENTS ON PATIENTS.PAT_ID = DAT_RESUME.RES_PATIENT
JOIN prod_web100t.DEF_TYPE_RESUME ON DEF_TYPE_RESUME.TR_OID = DAT_RESUME.RES_TYPE
WHERE
DAT_RESUME.RES_OID = p_rss.no_rss
AND DEF_TYPE_RESUME.TR_IDENT = 'RSS'
AND PAT_IPP BETWEEN '0' AND '9999999999999999'
AND ghm_id <> 0
AND p_rss.date_sortie = res_ds_calc::date
AND no_patient IS DISTINCT FROM PAT_IPP_NUM
;
-- Màj des n° de patient RSS SANS GHM
UPDATE pmsi.p_rss
SET no_patient = PAT_IPP_NUM
FROM prod_web100t.fac_FACTURE
JOIN prod_web100t.dat_da on dat_da.da_oid = fac_FACTURE.fact_da
JOIN w_PATIENTS PATIENTS ON PATIENTS.PAT_id = dat_da.da_patient
WHERE
dat_da.da_numero = p_rss.no_sejour_administratif
AND base.cti_is_num(fac_FACTURE.fact_numero)
AND PAT_IPP BETWEEN '0' AND '9999999999999999'
AND ghm_id = 0
AND position('.' in FACT_NUMERO) = 0
AND p_rss.date_sortie = DA_DATE_FIN::date
AND no_patient IS DISTINCT FROM PAT_IPP_NUM
;
]]></sqlcmd>
</NODE>
<NODE label="Rum">
<sqlcmd><![CDATA[
/**********************************************************************************
* MAJ DES RUMS *
**********************************************************************************/
INSERT INTO pmsi.p_rss_rum(
finess,
rss_id,
no_rss,
no_rum,
date_entree,
date_sortie,
mode_entree,
provenance,
mode_sortie,
destination,
passage_urgences_code,
duree_sejour,
nb_seances,
unite_medicale,
diagnostic_principal_id,
diagnostic_relie_id,
unite_medicale_id,
type_autorisation,
igs2,
type_autorisation_lit_dedie,
supplement_code
)
SELECT
w_rss.finess AS finess,
w_rss.rss_id AS rss_id,
w_rss.RES_OID AS no_rss,
DAT_RESUME.RES_INDEX AS no_rum,
DAT_RESUME.RES_DE_CALC AS date_entree,
DAT_RESUME.RES_DS_CALC AS date_sortie,
substr(DAT_RESUME.RES_ME_PMSI,1,1) AS mode_entree,
substr(DAT_RESUME.RES_ME_PMSI,2,1) AS provenance,
substr(DAT_RESUME.RES_MS_PMSI,1,1) AS mode_sortie,
substr(DAT_RESUME.RES_MS_PMSI,2,1) AS destination,
COALESCE(t_passage_urgences.code, '') AS passage_urgences_code,
CASE WHEN DAT_RESUME.RES_DS_CALC > DAT_RESUME.RES_DE_CALC THEN date(DAT_RESUME.RES_DS_CALC) - date(DAT_RESUME.RES_DE_CALC) ELSE 0 END AS duree_sejour,
RES_SEANCES AS nb_seances,
substr(w_um.code,1,4) AS unite_medicale,
COALESCE(t_diagnostics.oid,0) AS diagnostic_principal_id,
COALESCE(t_diagnostics_relies.oid,0) AS diagnostic_relie_id,
COALESCE(t_unites_medicales.oid,0) AS unite_medicale_id,
'' AS type_autorisation,
RUM_IGS2 AS igs2,
'' AS type_autorisation_lit_dedie,
'' AS supplement_code
FROM prod_web100t.DAT_RESUME
JOIN w_rss ON (DAT_RESUME.RES_PARENT = w_rss.RES_OID)
JOIN prod_web100t.DAT_RUM ON DAT_RESUME.RES_OID = RUM_OID
JOIN prod_web100t.DEF_TYPE_RESUME ON DEF_TYPE_RESUME.TR_OID = DAT_RESUME.RES_TYPE
LEFT JOIN prod_web100t.DAT_DIAGS DAT_DIAGS_p ON RUM_DP = DAT_DIAGS_p.DIAG_OID
LEFT JOIN prod_web100t.SGN_NMCL_DATA SGN_NMCL_DATA_p ON DAT_DIAGS_p.DIAG_CODE = SGN_NMCL_DATA_p.ND_OID
LEFT JOIN prod_web100t.DAT_DIAGS DAT_DIAGS_r ON RUM_DR = DAT_DIAGS_r.DIAG_OID
LEFT JOIN prod_web100t.SGN_NMCL_DATA SGN_NMCL_DATA_r ON DAT_DIAGS_r.DIAG_CODE = SGN_NMCL_DATA_r.ND_OID
LEFT JOIN w_um ON RES_UM = w_um.oid
LEFT JOIN pmsi.t_unites_medicales ON (w_um.code = t_unites_medicales.code)
LEFT JOIN pmsi.t_diagnostics ON (replace(SGN_NMCL_DATA_p.ND_CODE,'.','') = t_diagnostics.code)
LEFT JOIN pmsi.t_diagnostics t_diagnostics_relies ON (replace(SGN_NMCL_DATA_r.ND_CODE,'.','') = t_diagnostics_relies.code)
LEFT JOIN pmsi.t_passage_urgences ON t_passage_urgences.oid = DAT_RESUME.RES_URGENCE_CALC
WHERE DEF_TYPE_RESUME.TR_IDENT = 'RUM'
;
]]></sqlcmd>
</NODE>
<NODE label="Diagnostics">
<sqlcmd><![CDATA[
/**********************************************************************************
* MAJ DES DIAGS *
**********************************************************************************/
INSERT INTO pmsi.p_rss_diagnostics(
finess,
rss_id,
no_rss,
no_rum,
diagnostic_id,
type_diagnostic,
type_diagnostic_rss,
imprecis,
unite_medicale,
unite_medicale_id
)
SELECT
w_rss.finess AS finess,
w_rss.rss_id AS rss_id,
w_rss.RES_OID AS no_rss,
RES_INDEX AS no_rum,
COALESCE(t_diagnostics.oid,0) AS diagnostic_id,
CASE
WHEN DIAG_TYPE = 1 THEN 'DP'
WHEN DIAG_TYPE = 2 THEN 'DR'
WHEN DIAG_TYPE = 7 THEN 'DD'
ELSE 'DA'
END AS type_diagnostic,
CASE
WHEN RSS_OID_RUM_CLASSANT = DAT_RESUME.RES_OID AND DIAG_TYPE = 1 THEN 'DP'
WHEN DIAG_TYPE = 2 THEN 'DR'
WHEN DIAG_TYPE = 7 THEN 'DD'
ELSE 'DA'
END AS type_diagnostic_rss,
'' AS imprecis,
substr(w_um.code,1,4) AS unite_medicale,
COALESCE(t_unites_medicales.oid,0) AS unite_medicale_id
FROM prod_web100t.DAT_RESUME
JOIN w_rss ON (DAT_RESUME.RES_PARENT = w_rss.RES_OID)
JOIN prod_web100t.DEF_TYPE_RESUME ON DEF_TYPE_RESUME.TR_OID = DAT_RESUME.RES_TYPE
JOIN prod_web100t.DAT_RUM ON DAT_RESUME.RES_OID = RUM_OID
JOIN prod_web100t.DAT_DIAGS DAT_DIAGS ON DAT_RESUME.RES_OID = DAT_DIAGS.DIAG_RESUME
JOIN prod_web100t.SGN_NMCL_DATA ON DAT_DIAGS.DIAG_CODE = ND_OID
LEFT JOIN pmsi.t_diagnostics ON (replace(ND_CODE,'.','') = t_diagnostics.code)
LEFT JOIN prod_web100t.DAT_RSS ON w_rss.RES_OID = RSS_OID
LEFT JOIN w_um ON RES_UM = w_um.oid
LEFT JOIN pmsi.t_unites_medicales ON (w_um.code = t_unites_medicales.code)
WHERE DEF_TYPE_RESUME.TR_IDENT = 'RUM'
;
]]></sqlcmd>
</NODE>
<NODE label="Actes">
<sqlcmd><![CDATA[
/**********************************************************************************
* MAJ DES ACTES *
**********************************************************************************/
INSERT INTO pmsi.p_rss_actes(
finess,
rss_id,
no_rss,
no_rum,
unite_medicale,
unite_medicale_id,
date_acte,
medecin_id,
acte_id,
nombre,
phase_ccam,
activite_ccam,
extension_ccam,
modificateur_ccam_1,
modificateur_ccam_2,
modificateur_ccam_3,
modificateur_ccam_4,
remboursement_excp_ccam,
association_nonprevue_ccam
)
SELECT
w_rss.finess AS finess,
w_rss.rss_id AS rss_id,
w_rss.RES_OID AS no_rss,
RES_INDEX AS no_rum,
substr(w_um.code,1,4) AS unite_medicale,
COALESCE(t_unites_medicales.oid,0) AS unite_medicale_id,
date(ACT_DATE) AS date_acte,
COALESCE(t_medecins.oid,0) AS medecin_id,
COALESCE(t_actes.oid,0) AS acte_id,
ACT_QUANTITE AS nombre,
'0' AS phase_ccam,
ACT_CODE_ACTIVITE AS activite_ccam,
substr(ACT_EXT_DOC,1,1) AS extension_ccam,
substr(ACT_MODIFICATEURS,1,1) AS modificateur_ccam_1,
substr(ACT_MODIFICATEURS,2,1) AS modificateur_ccam_2,
substr(ACT_MODIFICATEURS,3,1) AS modificateur_ccam_3,
substr(ACT_MODIFICATEURS,4,1) AS modificateur_ccam_4,
ACT_REMBOURSEMENT AS remboursement_excp_ccam,
ACT_ASSOCIATION AS association_nonprevue_ccam
FROM prod_web100t.DAT_RESUME
JOIN w_rss ON (DAT_RESUME.RES_PARENT = w_rss.RES_OID)
JOIN prod_web100t.DEF_TYPE_RESUME ON DEF_TYPE_RESUME.TR_OID = DAT_RESUME.RES_TYPE
JOIN prod_web100t.DAT_RUM ON DAT_RESUME.RES_OID = RUM_OID
JOIN prod_web100t.DAT_ACTES ON DAT_RESUME.RES_OID = DAT_ACTES.ACT_RESUME
JOIN prod_web100t.SGN_NMCL_DATA ON DAT_ACTES.ACT_CODE = ND_OID
JOIN pmsi.t_actes ON SPLIT_PART(SGN_NMCL_DATA.ND_CODE, '.', 1) = t_actes.code
LEFT JOIN w_um ON RES_UM = w_um.oid
LEFT JOIN pmsi.t_unites_medicales ON (w_um.code = t_unites_medicales.code)
LEFT JOIN w_medecin ON ACT_EXECUTANT = ANY(w_medecin.oid)
LEFt JOIN pmsi.t_medecins ON t_medecins.code = w_medecin.code
WHERE DEF_TYPE_RESUME.TR_IDENT = 'RUM'
;
]]></sqlcmd>
</NODE>
<NODE label="Factures">
<condition><![CDATA[
"[WITH_FACTU]" != "0"
]]></condition>
<sqlcmd><![CDATA[
/**********************************************************************************
* MAJ DES FACTURES *
**********************************************************************************/
DROP TABLE IF EXISTS w_FAC_FACT_TIER;
CREATE TEMP TABLE w_FAC_FACT_TIER AS
SELECT
FT_DA,
MAX(FT_OID) AS FT_OID,
(MAX(Array[FT_OID,FT_FACTURE]))[2] AS FT_FACTURE
FROM prod_web100t.FAC_FACT_TIER
JOIN w_rss ON (FT_DA = w_rss.DA_OID)
WHERE FT_TYPE_TIER = 'AMO' AND
FT_TOTAL_ETS > 0
GROUP BY 1;
ALTER TABLE w_FAC_FACT_TIER ADD CONSTRAINT w_FAC_FACT_TIER_pkey PRIMARY KEY(FT_DA);
DROP TABLE IF EXISTS w_FAC_B2_TIER;
CREATE TEMP TABLE w_FAC_B2_TIER AS
SELECT
w_rss.rss_id,
B2T_LIGNE,
MAX(B2T_QUANTITE) AS B2T_QUANTITE,
base.cti_division(
SUM(B2T_TOTAL_TTC)::numeric - SUM(B2T_DEPASSEMENT)::numeric,
MAX(B2T_QUANTITE)::numeric
) AS B2T_PU,
SUM(B2T_TOTAL_TTC) AS B2T_TOTAL,
round(base.cti_division(
SUM(CASE WHEN B2T_TYPE_TIER = 'AMO' THEN B2T_TOTAL_TTC ELSE 0 END)::numeric - SUM(CASE WHEN B2T_TYPE_TIER = 'AMO' THEN B2T_DEPASSEMENT ELSE 0 END)::numeric,
SUM(B2T_TOTAL_TTC)::numeric - SUM(B2T_DEPASSEMENT)::numeric
) * 100,0) AS B2T_TAUX_AMO
FROM prod_web100t.FAC_B2_TIER
JOIN w_rss ON B2T_DA = w_rss.DA_OID
GROUP BY 1,2
ORDER BY 1;
CREATE INDEX w_FAC_B2_TIER_i1
ON w_FAC_B2_TIER
USING btree
(B2T_LIGNE)
;
INSERT INTO pmsi.p_rsf_total(
finess,
rss_id,
no_rss,
code_pec,
rang_beneficiaire,
regime,
nature_pec,
justificatif_exo,
no_facture,
code_regularisation,
matricule_assure,
cle_matricule_assure,
base_remboursement,
sejour_facture,
sejour_remboursable,
honoraires_factures,
honoraires_remboursable,
t2a_facture,
dmi_facture,
phc_facture,
participation_assure_avant_oc,
sejour_remboursable_2,
honoraires_remboursable_2,
montant_dmi_ghs2006,
nb_si,
ca_si,
nb_sur,
ca_sur,
nb_rea,
ca_rea,
nb_neonat,
ca_neonat,
nb_exh,
ca_exh,
nb_exb,
ca_exb,
nb_ghs,
ca_ghs,
ca_ghs_theorique,
taux_remboursement
)
SELECT
w_rss.finess AS finess,
w_rss.rss_id AS rss_id,
w_rss.RES_OID AS no_rss,
'1' AS code_pec,
'' AS rang_beneficiaire,
'' AS regime,
'' AS nature_pec,
'' AS justificatif_exo,
MAX(FACT_NUMERO) AS no_facture,
'1' AS code_regularisation,
'' AS matricule_assure,
'' AS cle_matricule_assure,
base.cti_sum_distinct_on(ARRAY[LI_OID::numeric,COALESCE(round((B2T_PU * B2T_QUANTITE)::numeric,2),FLT_TOTAL_TTC)]) AS base_remboursement,
base.cti_sum_distinct_on(ARRAY[LI_OID::numeric,FLT_TOTAL_TTC]) AS sejour_facture,
base.cti_sum_distinct_on(ARRAY[LI_OID::numeric,FLT_TOTAL_TTC]) AS sejour_remboursable,
MAX(FACT_TOTAL_HO) AS honoraires_factures,
MAX(FACT_TOTAL_HO) AS honoraires_remboursable,
0 AS t2a_facture,
0 AS dmi_facture,
0 AS phc_facture,
0 AS participation_assure_avant_oc,
0 AS sejour_remboursable_2,
0 AS honoraires_remboursable_2,
0 AS montant_dmi_ghs2006,
0 AS nb_si,
0 AS ca_si,
0 AS nb_sur,
0 AS ca_sur,
0 AS nb_rea,
0 AS ca_rea,
0 AS nb_neonat,
0 AS ca_neonat,
0 AS nb_exh,
0 AS ca_exh,
0 AS nb_exb,
0 AS ca_exb,
0 AS nb_ghs,
0 AS ca_ghs,
0 AS ca_ghs_theorique,
0 AS taux_remboursement
FROM w_FAC_FACT_TIER
JOIN w_rss ON FT_DA = w_rss.DA_OID
JOIN prod_web100t.FAC_FACT_LIGNE_TIER ON FLT_FACTURE_TIER = FT_OID AND FLT_IS_ETS = 1
JOIN prod_web100t.FAC_FACTURE ON w_FAC_FACT_TIER.FT_FACTURE = FACT_OID
JOIN prod_web100t.FAC_FACT_LIGNE ON FLT_LIGNE_FACTURE = LI_OID
JOIN pmsi.t_prestations ON FLT_CODE_PREST = t_prestations.code
LEFT JOIN w_FAC_B2_TIER ON LI_LIGNE_SOURCE = B2T_LIGNE AND w_rss.rss_id = w_FAC_B2_TIER.rss_id
JOIN pmsi.p_rss ON w_rss.rss_id = p_rss.oid
WHERE date(FLT_DATE_DEBUT) BETWEEN p_rss.date_entree AND p_rss.date_sortie
GROUP BY 1,2,3
;
INSERT INTO pmsi.p_rsf_total(
finess, no_rss, code_pec, rang_beneficiaire, regime, nature_pec,
justificatif_exo, no_facture, code_regularisation, base_remboursement,
sejour_facture, sejour_remboursable, honoraires_factures, honoraires_remboursable,
t2a_facture, dmi_facture, phc_facture, participation_assure_avant_oc,
sejour_remboursable_2, honoraires_remboursable_2, montant_dmi_ghs2006,
nb_si, ca_si, nb_sur, ca_sur, nb_rea, ca_rea, nb_neonat, ca_neonat,
nb_exh, ca_exh, nb_exb, ca_exb, nb_ghs, ca_ghs, rss_id, ca_ghs_theorique)
SELECT
p_rss.finess, p_rss.no_rss, '', '', '', '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, p_rss.oid, 0
FROM pmsi.p_rss
LEFT JOIN pmsi.p_rsf_total ON (p_rsf_total.rss_id = p_rss.oid)
WHERE
en_cours = '1'
AND p_rsf_total.rss_id IS NULL
;
]]></sqlcmd>
</NODE>
<NODE label="Factures PMSI">
<condition><![CDATA[
"[WITH_FACTU]" == "0"
]]></condition>
<sqlcmd><![CDATA[
INSERT INTO pmsi.p_rsf_total(
finess, no_rss, code_pec, rang_beneficiaire, regime, nature_pec,
justificatif_exo, no_facture, code_regularisation, base_remboursement,
sejour_facture, sejour_remboursable, honoraires_factures, honoraires_remboursable,
t2a_facture, dmi_facture, phc_facture, participation_assure_avant_oc,
sejour_remboursable_2, honoraires_remboursable_2, montant_dmi_ghs2006,
nb_si, ca_si, nb_sur, ca_sur, nb_rea, ca_rea, nb_neonat, ca_neonat,
nb_exh, ca_exh, nb_exb, ca_exb, nb_ghs, ca_ghs, rss_id, ca_ghs_theorique)
SELECT
p_rss.finess, p_rss.no_rss, '', '', '', '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, p_rss.oid, 0
FROM pmsi.p_rss
LEFT JOIN pmsi.p_rsf_total ON (p_rsf_total.rss_id = p_rss.oid)
WHERE
en_cours = '1'
AND p_rsf_total.rss_id IS NULL
;
]]></sqlcmd>
</NODE>
<NODE label="Prestations">
<condition><![CDATA[
"[WITH_FACTU]" != "0"
]]></condition>
<sqlcmd><![CDATA[
/**********************************************************************************
* MAJ DU DETAIL DES FACTURES *
**********************************************************************************/
DROP TABLE IF EXISTS w_LI;
CREATE TEMP TABLE w_LI AS
SELECT
DISTINCT FLT_LIGNE_FACTURE AS LI_OID
FROM w_FAC_FACT_TIER
JOIN w_rss ON FT_DA = w_rss.DA_OID
JOIN prod_web100t.FAC_FACT_LIGNE_TIER ON FLT_FACTURE_TIER = FT_OID AND FLT_IS_ETS = 1
WHERE FLT_DATE_DEBUT BETWEEN RES_DE AND RES_DS;
INSERT INTO pmsi.p_rsf_detail(
finess,
rss_id,
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,
sejour_rembourse_noemie,
nature_noemie,
prestation_id,
type,
coefficient_geo,
est_ligne_rss,
est_ligne_rum,
no_rum,
unite_medicale_id,
base_remboursement_rum
)
SELECT
w_rss.finess AS finess,
w_rss.rss_id AS rss_id,
w_rss.RES_OID AS no_rss,
'' AS nature,
'' AS mt,
'' AS dmt,
date(FLT_DATE_DEBUT) AS date_debut,
date(FLT_DATE_FIN) AS date_fin,
COALESCE(B2T_QUANTITE,1) AS nombre,
1 AS coefficient,
COALESCE(B2T_PU,FLT_TOTAL_TTC) AS prix_unitaire,
COALESCE(round((B2T_PU * B2T_QUANTITE)::numeric,2),FLT_TOTAL_TTC) AS base_remboursement,
COALESCE(B2T_TAUX_AMO,100) AS taux_remboursement,
FLT_TOTAL_TTC AS sejour_facture,
FLT_TOTAL_TTC AS sejour_remboursable,
0 AS compteur,
'' AS ligne_t2a,
'' AS pec_fj,
1 AS coefficient_mco,
0 AS sejour_remboursable_2,
0 AS ghs_id,
0 AS sejour_rembourse_noemie,
'' AS nature_noemie,
COALESCE(t_prestations.oid, 0) AS prestation_id,
'B' AS type,
0 AS coefficient_geo,
'1' AS est_ligne_rss,
'0' AS est_ligne_rum,
1 AS no_rum,
0 AS unite_medicale_id,
0 AS base_remboursement_rum
FROM w_FAC_FACT_TIER
JOIN w_rss ON FT_DA = w_rss.DA_OID
JOIN prod_web100t.FAC_FACT_LIGNE_TIER ON FLT_FACTURE_TIER = FT_OID AND FLT_IS_ETS = 1
JOIN prod_web100t.FAC_FACT_LIGNE ON FLT_LIGNE_FACTURE = LI_OID
JOIN pmsi.t_prestations ON FLT_CODE_PREST = t_prestations.code
LEFT JOIN w_FAC_B2_TIER ON LI_LIGNE_SOURCE = B2T_LIGNE AND w_rss.rss_id = w_FAC_B2_TIER.rss_id
JOIN pmsi.p_rss ON w_rss.rss_id = p_rss.oid
WHERE date(FLT_DATE_DEBUT) BETWEEN p_rss.date_entree AND p_rss.date_sortie
ORDER BY w_rss.RES_OID
;
INSERT INTO pmsi.p_rsf_detail(
finess,
rss_id,
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,
sejour_rembourse_noemie,
nature_noemie,
prestation_id,
type,
coefficient_geo,
est_ligne_rss,
est_ligne_rum,
no_rum,
unite_medicale_id,
base_remboursement_rum
)
SELECT
w_rss.finess AS finess,
w_rss.rss_id AS rss_id,
w_rss.RES_OID AS no_rss,
'' AS nature,
'' AS mt,
'' AS dmt,
date(FLT_DATE_DEBUT) AS date_debut,
date(FLT_DATE_FIN) AS date_fin,
COALESCE(B2T_QUANTITE,1) AS nombre,
1 AS coefficient,
COALESCE(B2T_PU,FLT_TOTAL_TTC) AS prix_unitaire,
COALESCE(round((B2T_PU * B2T_QUANTITE)::numeric,2),FLT_TOTAL_TTC) AS base_remboursement,
COALESCE(B2T_TAUX_AMO,100) AS taux_remboursement,
FLT_TOTAL_TTC AS sejour_facture,
FLT_TOTAL_TTC AS sejour_remboursable,
0 AS compteur,
'' AS ligne_t2a,
'' AS pec_fj,
1 AS coefficient_mco,
0 AS sejour_remboursable_2,
0 AS ghs_id,
0 AS sejour_rembourse_noemie,
'' AS nature_noemie,
COALESCE(t_prestations.oid, 0) AS prestation_id,
'B' AS type,
0 AS coefficient_geo,
'1' AS est_ligne_rss,
'0' AS est_ligne_rum,
1 AS no_rum,
0 AS unite_medicale_id,
0 AS base_remboursement_rum
FROM w_FAC_FACT_TIER
JOIN w_rss ON FT_DA = w_rss.DA_OID
JOIN prod_web100t.FAC_FACT_LIGNE_TIER ON FLT_FACTURE_TIER = FT_OID AND FLT_IS_ETS = 1
JOIN prod_web100t.FAC_FACT_LIGNE ON FLT_LIGNE_FACTURE = LI_OID
JOIN pmsi.t_prestations ON FLT_CODE_PREST = t_prestations.code
LEFT JOIN w_FAC_B2_TIER ON LI_LIGNE_SOURCE = B2T_LIGNE AND w_rss.rss_id = w_FAC_B2_TIER.rss_id
LEFT JOIN w_LI ON w_LI.LI_OID = FAC_FACT_LIGNE.LI_OID
JOIN pmsi.p_rss ON w_rss.rss_id = p_rss.oid
WHERE date(FLT_DATE_DEBUT) BETWEEN p_rss.date_entree AND p_rss.date_sortie AND
w_LI.LI_OID IS NULL
ORDER BY w_rss.RES_OID
;
---------- CORRECTIF TARIF GHS FACTURE ----------------
-- Tarif GHS = GHS (AMO) + FORFAIT JOURNALIER (PATIENT)
-- Quand le dossier est facturé (non envoyé pmsi), le forfait journalier est compliqué à récupérer
-- Nous ne récupérons seulement le ghs payé par l'AMO
-- On fait en sorte de calculer la bonne base remboursement et le bon prix unitaire pour coller au mieux avec le tarif que l'on récupère quand il sera transmis au pmsi
-- On ne s'occupe pas pour l'instant des bornes hautes et basses
DROP TABLE IF EXISTS w_correction;
CREATE TEMP TABLE w_correction AS
SELECT rss_id,
p_rsf_detail.CTID AS from_ctid,
coefficient_mco,
prix_unitaire AS prix_unitaire_avant,
CASE
WHEN type_etablissement = '1' AND p_rss.date_sortie >= t_ghs.date_debut_prive_1 AND p_rss.date_sortie <= t_ghs.date_fin_prive_1 THEN t_ghs.tarif_ghs_prive_1
WHEN type_etablissement = '1' AND p_rss.date_sortie >= t_ghs.date_debut_prive_2 AND p_rss.date_sortie <= t_ghs.date_fin_prive_2 THEN t_ghs.tarif_ghs_prive_2
WHEN type_etablissement = '1' AND p_rss.date_sortie >= t_ghs.date_debut_prive_3 AND p_rss.date_sortie <= t_ghs.date_fin_prive_3 THEN t_ghs.tarif_ghs_prive_3
WHEN type_etablissement = '1' AND p_rss.date_sortie >= t_ghs.date_debut_prive_4 AND p_rss.date_sortie <= t_ghs.date_fin_prive_4 THEN t_ghs.tarif_ghs_prive_4
WHEN type_etablissement = '1' AND p_rss.date_sortie >= t_ghs.date_debut_prive_5 AND p_rss.date_sortie <= t_ghs.date_fin_prive_5 THEN t_ghs.tarif_ghs_prive_5
WHEN type_etablissement = '1' AND p_rss.date_sortie >= t_ghs.date_debut_prive_6 AND p_rss.date_sortie <= t_ghs.date_fin_prive_6 THEN t_ghs.tarif_ghs_prive_6
WHEN type_etablissement = '1' AND p_rss.date_sortie >= t_ghs.date_debut_prive_7 AND p_rss.date_sortie <= t_ghs.date_fin_prive_7 THEN t_ghs.tarif_ghs_prive_7
WHEN type_etablissement = '1' AND p_rss.date_sortie >= t_ghs.date_debut_prive_8 AND p_rss.date_sortie <= t_ghs.date_fin_prive_8 THEN t_ghs.tarif_ghs_prive_8
WHEN type_etablissement = '1' AND p_rss.date_sortie >= t_ghs.date_debut_prive_9 AND p_rss.date_sortie <= t_ghs.date_fin_prive_9 THEN t_ghs.tarif_ghs_prive_9
WHEN type_etablissement <> '1' AND p_rss.date_sortie >= t_ghs.date_debut_public_1 AND p_rss.date_sortie <= t_ghs.date_fin_public_1 THEN t_ghs.tarif_ghs_public_1
WHEN type_etablissement <> '1' AND p_rss.date_sortie >= t_ghs.date_debut_public_2 AND p_rss.date_sortie <= t_ghs.date_fin_public_2 THEN t_ghs.tarif_ghs_public_2
WHEN type_etablissement <> '1' AND p_rss.date_sortie >= t_ghs.date_debut_public_3 AND p_rss.date_sortie <= t_ghs.date_fin_public_3 THEN t_ghs.tarif_ghs_public_3
WHEN type_etablissement <> '1' AND p_rss.date_sortie >= t_ghs.date_debut_public_4 AND p_rss.date_sortie <= t_ghs.date_fin_public_4 THEN t_ghs.tarif_ghs_public_4
WHEN type_etablissement <> '1' AND p_rss.date_sortie >= t_ghs.date_debut_public_5 AND p_rss.date_sortie <= t_ghs.date_fin_public_5 THEN t_ghs.tarif_ghs_public_5
WHEN type_etablissement <> '1' AND p_rss.date_sortie >= t_ghs.date_debut_public_6 AND p_rss.date_sortie <= t_ghs.date_fin_public_6 THEN t_ghs.tarif_ghs_public_6
WHEN type_etablissement <> '1' AND p_rss.date_sortie >= t_ghs.date_debut_public_7 AND p_rss.date_sortie <= t_ghs.date_fin_public_7 THEN t_ghs.tarif_ghs_public_7
WHEN type_etablissement <> '1' AND p_rss.date_sortie >= t_ghs.date_debut_public_8 AND p_rss.date_sortie <= t_ghs.date_fin_public_8 THEN t_ghs.tarif_ghs_public_8
WHEN type_etablissement <> '1' AND p_rss.date_sortie >= t_ghs.date_debut_public_9 AND p_rss.date_sortie <= t_ghs.date_fin_public_9 THEN t_ghs.tarif_ghs_public_9
ELSE 0::numeric
END AS prix_unitaire_theorique,
p_rsf_detail.base_remboursement AS base_remboursement_avant,
round(CASE
WHEN type_etablissement = '1' AND p_rss.date_sortie >= t_ghs.date_debut_prive_1 AND p_rss.date_sortie <= t_ghs.date_fin_prive_1 THEN t_ghs.tarif_ghs_prive_1
WHEN type_etablissement = '1' AND p_rss.date_sortie >= t_ghs.date_debut_prive_2 AND p_rss.date_sortie <= t_ghs.date_fin_prive_2 THEN t_ghs.tarif_ghs_prive_2
WHEN type_etablissement = '1' AND p_rss.date_sortie >= t_ghs.date_debut_prive_3 AND p_rss.date_sortie <= t_ghs.date_fin_prive_3 THEN t_ghs.tarif_ghs_prive_3
WHEN type_etablissement = '1' AND p_rss.date_sortie >= t_ghs.date_debut_prive_4 AND p_rss.date_sortie <= t_ghs.date_fin_prive_4 THEN t_ghs.tarif_ghs_prive_4
WHEN type_etablissement = '1' AND p_rss.date_sortie >= t_ghs.date_debut_prive_5 AND p_rss.date_sortie <= t_ghs.date_fin_prive_5 THEN t_ghs.tarif_ghs_prive_5
WHEN type_etablissement = '1' AND p_rss.date_sortie >= t_ghs.date_debut_prive_6 AND p_rss.date_sortie <= t_ghs.date_fin_prive_6 THEN t_ghs.tarif_ghs_prive_6
WHEN type_etablissement = '1' AND p_rss.date_sortie >= t_ghs.date_debut_prive_7 AND p_rss.date_sortie <= t_ghs.date_fin_prive_7 THEN t_ghs.tarif_ghs_prive_7
WHEN type_etablissement = '1' AND p_rss.date_sortie >= t_ghs.date_debut_prive_8 AND p_rss.date_sortie <= t_ghs.date_fin_prive_8 THEN t_ghs.tarif_ghs_prive_8
WHEN type_etablissement = '1' AND p_rss.date_sortie >= t_ghs.date_debut_prive_9 AND p_rss.date_sortie <= t_ghs.date_fin_prive_9 THEN t_ghs.tarif_ghs_prive_9
WHEN type_etablissement <> '1' AND p_rss.date_sortie >= t_ghs.date_debut_public_1 AND p_rss.date_sortie <= t_ghs.date_fin_public_1 THEN t_ghs.tarif_ghs_public_1
WHEN type_etablissement <> '1' AND p_rss.date_sortie >= t_ghs.date_debut_public_2 AND p_rss.date_sortie <= t_ghs.date_fin_public_2 THEN t_ghs.tarif_ghs_public_2
WHEN type_etablissement <> '1' AND p_rss.date_sortie >= t_ghs.date_debut_public_3 AND p_rss.date_sortie <= t_ghs.date_fin_public_3 THEN t_ghs.tarif_ghs_public_3
WHEN type_etablissement <> '1' AND p_rss.date_sortie >= t_ghs.date_debut_public_4 AND p_rss.date_sortie <= t_ghs.date_fin_public_4 THEN t_ghs.tarif_ghs_public_4
WHEN type_etablissement <> '1' AND p_rss.date_sortie >= t_ghs.date_debut_public_5 AND p_rss.date_sortie <= t_ghs.date_fin_public_5 THEN t_ghs.tarif_ghs_public_5
WHEN type_etablissement <> '1' AND p_rss.date_sortie >= t_ghs.date_debut_public_6 AND p_rss.date_sortie <= t_ghs.date_fin_public_6 THEN t_ghs.tarif_ghs_public_6
WHEN type_etablissement <> '1' AND p_rss.date_sortie >= t_ghs.date_debut_public_7 AND p_rss.date_sortie <= t_ghs.date_fin_public_7 THEN t_ghs.tarif_ghs_public_7
WHEN type_etablissement <> '1' AND p_rss.date_sortie >= t_ghs.date_debut_public_8 AND p_rss.date_sortie <= t_ghs.date_fin_public_8 THEN t_ghs.tarif_ghs_public_8
WHEN type_etablissement <> '1' AND p_rss.date_sortie >= t_ghs.date_debut_public_9 AND p_rss.date_sortie <= t_ghs.date_fin_public_9 THEN t_ghs.tarif_ghs_public_9
ELSE 0::numeric
END * p_rsf_detail.coefficient_mco,2) AS base_remboursement_theorique,
(p_rss.date_sortie - p_rss.date_entree) * 20 AS montant_forfait_theorique
FROM pmsi.p_rsf_detail
JOIN pmsi.p_rss On rss_id = p_rss.oid
JOIN pmsi.t_prestations ON prestation_id = t_prestations.oid
JOIN pmsi.t_ghs ON p_rss.ghs_id = t_ghs.oid
JOIN base.t_finess ON p_rss.finess = t_finess.code
WHERE en_cours = '1' AND
t_prestations.code = 'GHS' AND
est_ligne_rss = '1' AND
prix_unitaire = p_rsf_detail.base_remboursement
;
ANALYSE w_correction
;
UPDATE pmsi.p_rsf_detail SET
prix_unitaire = prix_unitaire_theorique,
base_remboursement =
CASE WHEN (
(base_remboursement_avant + montant_forfait_theorique) = base_remboursement_theorique OR
(base_remboursement_avant + montant_forfait_theorique + 24) = base_remboursement_theorique OR
base_remboursement_avant = base_remboursement_theorique
) THEN base_remboursement_theorique ELSE p_rsf_detail.base_remboursement END
,
sejour_facture =
CASE WHEN (
(base_remboursement_avant + montant_forfait_theorique) = base_remboursement_theorique OR
(base_remboursement_avant + montant_forfait_theorique + 24) = base_remboursement_theorique OR
base_remboursement_avant = base_remboursement_theorique
) THEN base_remboursement_theorique ELSE p_rsf_detail.base_remboursement END
FROM w_correction
WHERE p_rsf_detail.rss_id = w_correction.rss_id AND
p_rsf_detail.CTID = w_correction.from_CTID
;
]]></sqlcmd>
</NODE>
<NODE label="Prestations PMSI">
<condition><![CDATA[
"[WITH_FACTU]" == "0"
]]></condition>
<sqlcmd><![CDATA[
/**********************************************************************************
* MAJ DU DETAIL DES FACTURES *
**********************************************************************************/
WITH w_prest AS (
SELECT
w_rss.finess as finess,
w_rss.rss_id as rss_id,
w_rss.res_oid as no_rss,
''::text AS nature,
''::text AS mt,
''::text AS dmt,
DAT_PRESTATIONS.PREST_DATE_DEBUT as date_debut,
DAT_PRESTATIONS.PREST_DATE_FIN as date_fin,
COALESCE(DAT_PRESTATIONS.PREST_QUANTITE, 1) as nombre,
COALESCE(DAT_PRESTATIONS.PREST_COEFF, 1) as coefficient,
COALESCE(DAT_PRESTATIONS.PREST_PU, 0) as prix_unitaire,
COALESCE(DAT_PRESTATIONS.PREST_TOTAL, 0) as base_remboursement,
100::integer as taux_remboursement,
COALESCE(DAT_PRESTATIONS.PREST_TOTAL, 0) as sejour_facture,
COALESCE(DAT_PRESTATIONS.PREST_TOTAL, 0) as sejour_remboursable,
0 AS compteur,
'' AS ligne_t2a,
'' AS pec_fj,
1 AS coefficient_mco,
0 AS sejour_remboursable_2,
0 AS ghs_id,
0 AS sejour_rembourse_noemie,
'' AS nature_noemie,
'B' AS type,
0 AS coefficient_geo,
'1' AS est_ligne_rss,
'0' AS est_ligne_rum,
1::integer as no_rum,
0::integer as base_remboursement_rum,
regexp_replace(DAT_PRESTATIONS.PREST_TYPE, 'DIAL.', 'D09') as PREST_TYPE,
w_um.code as um_code
FROM prod_web100T.DAT_PRESTATIONS
JOIN w_rss ON w_rss.RES_OID = DAT_PRESTATIONS.PREST_RESUME
LEFT JOIN w_um ON w_um.oid = DAT_PRESTATIONS.PREST_UM
JOIN pmsi.p_rss ON w_rss.rss_id = p_rss.oid
LEFT JOIN w_um ON w_um.oid = DAT_PRESTATIONS.PREST_UM
WHERE date(DAT_PRESTATIONS.PREST_DATE_DEBUT) BETWEEN p_rss.date_entree AND p_rss.date_sortie
AND DAT_PRESTATIONS.PREST_INDEX > 1
AND DAT_PRESTATIONS.PREST_TYPE NOT IN ('GHS', 'EXH', 'EXB')
)
INSERT INTO pmsi.p_rsf_detail (
finess,
rss_id,
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,
sejour_rembourse_noemie,
nature_noemie,
prestation_id,
type,
coefficient_geo,
est_ligne_rss,
est_ligne_rum,
no_rum,
unite_medicale_id,
base_remboursement_rum
)
SELECT
w_prest.finess,
w_prest.rss_id,
w_prest.no_rss,
w_prest.nature,
w_prest.mt,
w_prest.dmt,
w_prest.date_debut,
w_prest.date_fin,
w_prest.nombre,
w_prest.coefficient,
w_prest.prix_unitaire,
w_prest.base_remboursement,
w_prest.taux_remboursement,
w_prest.sejour_facture,
w_prest.sejour_remboursable,
w_prest.compteur,
w_prest.ligne_t2a,
w_prest.pec_fj,
w_prest.coefficient_mco,
w_prest.sejour_remboursable_2,
w_prest.ghs_id,
w_prest.sejour_rembourse_noemie,
w_prest.nature_noemie,
COALESCE(t_prestations.oid, 0) as prestation_id,
w_prest.type,
w_prest.coefficient_geo,
w_prest.est_ligne_rss,
w_prest.est_ligne_rum,
w_prest.no_rum,
COALESCE(t_unites_medicales.oid, 0) as unite_medicale_id,
0::integer as base_remboursement_rum
FROM
w_prest
LEFT JOIN pmsi.t_prestations ON t_prestations.code = w_prest.PREST_TYPE
LEFT JOIN pmsi.t_unites_medicales ON t_unites_medicales.code = w_prest.um_code
;
UPDATE pmsi.p_rsf_detail SET
no_rum = p_rss_rum.no_rum
FROM
w_rss, pmsi.p_rss_rum
WHERE 1=1
AND w_rss.rss_id = p_rsf_detail.rss_id
AND p_rss_rum.rss_id = w_rss.rss_id
AND p_rsf_detail.unite_medicale_id = p_rss_rum.unite_medicale_id
AND p_rsf_detail.date_debut BETWEEN p_rss_rum.date_entree and p_rss_rum.date_sortie
AND p_rsf_detail.date_fin BETWEEN p_rss_rum.date_entree and p_rss_rum.date_sortie
AND p_rss_rum.no_rum IS DISTINCT FROM p_rsf_detail.no_rum
;
]]></sqlcmd>
</NODE>
<NODE label="LPP">
<condition><![CDATA[
"[WITH_FACTU]" != "0"
]]></condition>
<sqlcmd><![CDATA[
/**********************************************************************************
* MAJ DES LPP *
**********************************************************************************/
INSERT INTO pmsi.p_rss_lpp(
finess,
rss_id,
no_rss,
rang,
date_lpp,
lpp_id,
nombre,
prix_unitaire,
montant_facture,
non_pris_en_compte
)
SELECT
w_rss.finess AS finess,
w_rss.rss_id AS rss_id,
w_rss.RES_OID AS no_rss,
1 AS rang,
date(FLT_DATE_DEBUT) AS date_lpp,
COALESCE(t_lpp.oid, 0) AS lpp_id,
COALESCE(B2T_QUANTITE,1) AS nombre,
COALESCE(B2T_PU,FLT_TOTAL_TTC) AS prix_unitaire,
COALESCE(FLT_TOTAL_TTC) AS montant_facture,
'0' AS non_pris_en_compte
FROM w_FAC_FACT_TIER
JOIN w_rss ON FT_DA = w_rss.DA_OID
JOIN prod_web100t.FAC_FACT_LIGNE_TIER ON FLT_FACTURE_TIER = FT_OID AND FLT_IS_ETS = 1
JOIN prod_web100t.FAC_FACT_LIGNE ON FLT_LIGNE_FACTURE = LI_OID
JOIN prod_web100t.ART_ARTICLES ON FLT_ARTICLE = ART_OID AND ART_CLASS = 'LPP'
JOIN pmsi.t_lpp ON (ART_CODE = t_lpp.code)
LEFT JOIN w_FAC_B2_TIER ON LI_LIGNE_SOURCE = B2T_LIGNE AND w_rss.rss_id = w_FAC_B2_TIER.rss_id
JOIN pmsi.p_rss ON w_rss.rss_id = p_rss.oid
WHERE date(FLT_DATE_DEBUT) BETWEEN p_rss.date_entree AND p_rss.date_sortie;
]]></sqlcmd>
</NODE>
<NODE label="UCD">
<condition><![CDATA[
"[WITH_FACTU]" != "0"
]]></condition>
<sqlcmd><![CDATA[
/**********************************************************************************
* MAJ DES UCD *
**********************************************************************************/
INSERT INTO pmsi.p_rss_ucd(
finess,
rss_id,
no_rss,
rang,
date_ucd,
ucd_id,
nombre,
coefficient_fractionnement,
prix_unitaire_achat,
prix_unitaire_ecart_indemnisable,
montant_ecart_indemnisable,
montant_facture,
non_pris_en_compte
)
SELECT
w_rss.finess AS finess,
w_rss.rss_id AS rss_id,
w_rss.RES_OID AS no_rss,
1 AS rang,
date(FLT_DATE_DEBUT) AS date_ucd,
COALESCE(t_ucd.oid,0) AS ucd_id,
COALESCE(B2T_QUANTITE,1) AS nombre,
0 AS coefficient_fractionnement,
0 AS prix_unitaire_achat,
0 AS prix_unitaire_ecart_indemnisable,
0 AS montant_ecart_indemnisable,
COALESCE(B2T_PU,FLT_TOTAL_TTC) AS montant_facture,
'0' AS non_pris_en_compte
FROM w_FAC_FACT_TIER
JOIN w_rss ON FT_DA = w_rss.DA_OID
JOIN prod_web100t.FAC_FACT_LIGNE_TIER ON FLT_FACTURE_TIER = FT_OID AND FLT_IS_ETS = 1
JOIN prod_web100t.FAC_FACT_LIGNE ON FLT_LIGNE_FACTURE = LI_OID
JOIN prod_web100t.ART_ARTICLES ON FLT_ARTICLE = ART_OID AND ART_CLASS = 'UCD'
JOIN pmsi.t_ucd ON (ART_CODE = t_ucd.code)
LEFT JOIN w_FAC_B2_TIER ON LI_LIGNE_SOURCE = B2T_LIGNE AND w_rss.rss_id = w_FAC_B2_TIER.rss_id
JOIN pmsi.p_rss ON w_rss.rss_id = p_rss.oid
WHERE date(FLT_DATE_DEBUT) BETWEEN p_rss.date_entree AND p_rss.date_sortie
;
]]></sqlcmd>
</NODE>
<NODE label="Facturation SHS">
<condition><![CDATA[
"[ADMPROVIDER]" == "shs" || "[ADMPROVIDER]" == "SHS"
]]></condition>
<sqlcmd><![CDATA[
-- RSF total
DROP TABLE IF EXISTS w_rsf_shs;
CREATE TEMP TABLE w_rsf_shs AS
SELECT
p_rss.oid AS rss_id,
MFDOSS,
MAX(to_char(MFDOSS,'FM00000000')) AS no_facture,
SUM(MFMTFA) AS base_remboursement,
SUM(MFMTFA) AS sejour_facture,
SUM(MFMFA1) AS sejour_remboursable,
SUM(MFMFAM) AS participation_assure_avant_oc
FROM pmsi.p_rss
JOIN pmsi.p_rsf_total ON rss_id = p_rss.oid AND p_rsf_total.base_remboursement = 0
JOIN prod_shs.[ACTIVITESCHEMA]_MFP01CLI ON to_char(MFDOSS,'FM00000000') = p_rss.no_sejour_administratif AND MFDCPL = 0
JOIN prod_shs.[ACTIVITESCHEMA]_TRP01 ON TRCENR = 'A51' AND
TRCSER = MFCSER AND TRCRUB = substr(to_char(MFRUPR,'FM0000'),2,3)
JOIN pmsi.t_prestations ON CASE WHEN MFRUPR IN (111,112) THEN 'GHS' ELSE TRPRSA END = t_prestations.code
WHERE en_cours = '1' AND
(MFMFA1 <> 0 OR t_prestations.code IN ('GHS', 'EXH', 'PII', 'PH1', 'PH8', 'SRC', 'REA', 'ATU', 'FFM', 'SE1', 'SE2', 'SE3', 'SE4', 'SE5', 'SE6', 'SE7', 'APE', 'AP2', 'FPI'))
GROUP BY 1,2;
UPDATE pmsi.p_rsf_total SET
no_facture = w_rsf_shs.no_facture,
base_remboursement = w_rsf_shs.base_remboursement,
sejour_facture = w_rsf_shs.sejour_facture,
sejour_remboursable = w_rsf_shs.sejour_remboursable,
participation_assure_avant_oc = w_rsf_shs.participation_assure_avant_oc
FROM w_rsf_shs
WHERE w_rsf_shs.rss_id = p_rsf_total.rss_id;
-- Hors GHS
INSERT INTO pmsi.p_rsf_detail(
finess,
rss_id,
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,
sejour_rembourse_noemie,
nature_noemie,
prestation_id,
type,
coefficient_geo,
est_ligne_rss,
est_ligne_rum,
no_rum,
unite_medicale_id,
base_remboursement_rum)
SELECT
p_rss.finess,
p_rss.oid AS rss_id,
p_rss.no_rss,
'' AS nature,
'' AS mt,
'' AS dmt,
p_rss.date_entree AS date_debut,
p_rss.date_sortie AS date_fin,
MFNBRE AS nombre,
1 AS coefficient,
MFPRUA AS prix_unitaire,
MFMTFA AS base_remboursement,
MFTFA1 AS taux_remboursement,
MFMTFA AS sejour_facture,
MFMFA1 AS sejour_remboursable,
0 AS compteur,
'' AS ligne_t2a,
'' AS pec_fj,
1 AS coefficient_mco,
0 AS sejour_remboursable_2,
COALESCE(t_ghs.oid, 0) AS ghs_id,
0 AS sejour_rembourse_noemie,
'' AS nature_noemie,
COALESCE(t_prestations.oid, 0) AS prestation_id,
'B' AS type,
0 AS coefficient_geo,
'1' AS est_ligne_rss,
'0' AS est_ligne_rum,
1 AS no_rum,
0 AS unite_medicale_id,
0 AS base_remboursement_rum
FROM prod_shs.[ACTIVITESCHEMA]_MFP01CLI MFP01CLI
JOIN w_rsf_shs ON MFP01CLI.MFDOSS = w_rsf_shs.MFDOSS AND MFDCPL = 0
JOIN pmsi.p_rss ON w_rsf_shs.rss_id = p_rss.oid
JOIN prod_shs.[ACTIVITESCHEMA]_TRP01 ON TRCENR = 'A51' AND
TRCSER = MFCSER AND TRCRUB = substr(to_char(MFRUPR,'FM0000'),2,3)
JOIN pmsi.t_prestations ON CASE WHEN MFRUPR IN (111,112) THEN 'GHS' WHEN TRPRST <> '' THEN TRPRST ELSE TRPRSA END = t_prestations.code
LEFT JOIN pmsi.t_ghs ON to_number(CASE WHEN MFCGHS BETWEEN '0000' AND '9999' THEN MFCGHS ELSE '9999' END,'0000') = t_ghs.code
WHERE (MFMFA1 <> 0 AND t_prestations.code NOT IN ('GHS') OR
t_prestations.code IN ('EXH', 'PII', 'PH1', 'PH8', 'SRC', 'REA', 'ATU', 'FFM', 'SE1', 'SE2', 'SE3', 'SE4', 'SE5', 'SE6', 'SE7', 'APE', 'AP2', 'FPI') OR
t_prestations.code IN ('GHS') AND MFCGHS = 9605
);
-- GHS
INSERT INTO pmsi.p_rsf_detail(
finess,
rss_id,
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,
sejour_rembourse_noemie,
nature_noemie,
prestation_id,
type,
coefficient_geo,
est_ligne_rss,
est_ligne_rum,
no_rum,
unite_medicale_id,
base_remboursement_rum)
SELECT
p_rss.finess,
p_rss.oid AS rss_id,
p_rss.no_rss,
'' AS nature,
'' AS mt,
'' AS dmt,
p_rss.date_entree AS date_debut,
p_rss.date_sortie AS date_fin,
1 AS nombre,
1 AS coefficient,
MAX(MFPRUA) AS prix_unitaire,
SUM(MFMTFA) AS base_remboursement,
MAX(MFTFA1) AS taux_remboursement,
SUM(MFMTFA) AS sejour_facture,
SUM(MFMFA1) AS sejour_remboursable,
0 AS compteur,
'' AS ligne_t2a,
'' AS pec_fj,
1 AS coefficient_mco,
0 AS sejour_remboursable_2,
COALESCE(t_ghs.oid, 0) AS ghs_id,
0 AS sejour_rembourse_noemie,
'' AS nature_noemie,
COALESCE(t_prestations.oid, 0) AS prestation_id,
'B' AS type,
0 AS coefficient_geo,
'1' AS est_ligne_rss,
'0' AS est_ligne_rum,
1 AS no_rum,
0 AS unite_medicale_id,
0 AS base_remboursement_rum
FROM prod_shs.[ACTIVITESCHEMA]_MFP01CLI MFP01CLI
JOIN w_rsf_shs ON MFP01CLI.MFDOSS = w_rsf_shs.MFDOSS AND MFDCPL = 0
JOIN pmsi.p_rss ON w_rsf_shs.rss_id = p_rss.oid
JOIN prod_shs.[ACTIVITESCHEMA]_TRP01 ON TRCENR = 'A51' AND
TRCSER = MFCSER AND TRCRUB = substr(to_char(MFRUPR,'FM0000'),2,3)
JOIN pmsi.t_prestations ON CASE WHEN MFRUPR IN (111,112) THEN 'GHS' WHEN TRPRST <> '' THEN TRPRST ELSE TRPRSA END = t_prestations.code
LEFT JOIN pmsi.t_ghs ON to_number(CASE WHEN MFCGHS BETWEEN '0000' AND '9999' THEN MFCGHS ELSE '9999' END,'0000') = t_ghs.code
WHERE t_prestations.code IN ('GHS') AND MFCGHS <> 9605
GROUP BY 1,2,3,7,8,21,24;
]]></sqlcmd>
</NODE>
<NODE label="Numéro RUM">
<sqlcmd><![CDATA[
/**********************************************************************************
* MAJ DES RUM avec des trous dans les numéros *
**********************************************************************************/
DROP TABLE IF EXISTS w_rum_index;
CREATE TEMP TABLE w_rum_index AS
SELECT *
FROM
(
SELECT rss_id, no_rum, row_number() OVER (PARTITION BY rss_id ORDER BY no_rum) AS no_rum_new
FROM pmsi.p_rss_rum
JOIN pmsi.p_rss ON rss_id = p_rss.oid
WHERE en_cours = '1'
) subview
WHERE no_rum <> no_rum_new
;
ANALYSE w_rum_index
;
UPDATE pmsi.p_rss_actes p_rss_table
SET no_rum = no_rum_new
FROM w_rum_index
WHERE p_rss_table.rss_id = w_rum_index.rss_id AND
p_rss_table.no_rum = w_rum_index.no_rum
;
UPDATE pmsi.p_rss_diagnostics p_rss_table
SET no_rum = no_rum_new
FROM w_rum_index
WHERE p_rss_table.rss_id = w_rum_index.rss_id AND
p_rss_table.no_rum = w_rum_index.no_rum
;
UPDATE pmsi.p_rsf_detail p_rss_table
SET no_rum = no_rum_new
FROM w_rum_index
WHERE p_rss_table.rss_id = w_rum_index.rss_id AND
p_rss_table.no_rum = w_rum_index.no_rum
;
UPDATE pmsi.p_rss p_rss_table
SET no_rum_principal = no_rum_new
FROM w_rum_index
WHERE p_rss_table.oid = w_rum_index.rss_id AND
p_rss_table.no_rum_principal = w_rum_index.no_rum
;
UPDATE pmsi.p_rss_rum p_rss_table
SET no_rum = no_rum_new
FROM w_rum_index
WHERE p_rss_table.rss_id = w_rum_index.rss_id AND
p_rss_table.no_rum = w_rum_index.no_rum
;
]]></sqlcmd>
</NODE>
</NODE>
<NODE name="PMSIETAT" label="RECUPERATION ETAT DES DOSSIERS">
<NODE label="Initialisation">
<sqlcmd><![CDATA[
-- Séjours non groupés
INSERT INTO pmsi.t_ghm(
code,
texte,
mco,
aso,
severite,
cmd_id,
ghm5_id,
ligne_oap_id,
cas_id)
SELECT
'99Z99Z' AS code,
'Séjours sortis non groupés' AS texte,
'?' AS mco,
'?' AS aso,
'Z' AS severite,
COALESCE((SELECT oid FROM pmsi.t_cmd WHERE code = '99'),0) AS cmd_id,
COALESCE((SELECT oid FROM pmsi.t_ghm5 WHERE code = '99Z99'),0) AS ghm5_id,
0 AS ligne_oap_id,
COALESCE((SELECT oid FROM base.t_cas WHERE code = '?'),0) AS cas_id
WHERE '99Z99Z' NOT IN (SELECT code FROM pmsi.t_ghm)
UNION
SELECT
'99Z98Z' AS code,
'GHM indisponible' AS texte,
'?' AS mco,
'?' AS aso,
'Z' AS severite,
COALESCE((SELECT oid FROM pmsi.t_cmd WHERE code = '99'),0) AS cmd_id,
COALESCE((SELECT oid FROM pmsi.t_ghm5 WHERE code = '99Z98'),0) AS ghm5_id,
0 AS ligne_oap_id,
COALESCE((SELECT oid FROM base.t_cas WHERE code = '?'),0) AS cas_id
WHERE '99Z98Z' NOT IN (SELECT code FROM pmsi.t_ghm);
SELECT pmsi.cti_initialize_rss_etat();
]]></sqlcmd>
</NODE>
<NODE label="Etat des dossiers">
<sqlcmd><![CDATA[
DROP TABLE IF EXISTS w_DAT_GROUPAGE;
CREATE TEMP TABLE w_DAT_GROUPAGE AS
SELECT
RES_OID,
date(MAX(DAT_RESUME.RES_DS_CALC)) AS RES_DS,
date(MAX(GRP_DATE)) AS GRP_DATE,
MAX(DAT_RESUME.RES_PATIENT) AS RES_PATIENT,
MAX(DA_OID) AS DA_OID
FROM prod_web100t.DAT_RESUME
JOIN prod_web100t.DAT_GROUPAGE ON RES_OID = GRP_RESUME
JOIN prod_web100t.DEF_TYPE_RESUME ON DEF_TYPE_RESUME.TR_OID = DAT_RESUME.RES_TYPE
JOIN prod_web100t.DAT_HOSPIT ON RES_HOSPIT = HOSP_OID
JOIN prod_web100t.DAT_RSS ON RES_OID = RSS_OID
LEFT JOIN prod_web100t.DAT_DA ON DA_NUMERO = RSS_NO_HOSPIT
WHERE
DAT_RESUME.RES_OID > 0 AND
DEF_TYPE_RESUME.TR_IDENT = 'RSS'
GROUP BY 1;
ALTER TABLE w_DAT_GROUPAGE ADD CONSTRAINT w_DAT_GROUPAGE_pkey PRIMARY KEY(RES_OID);
UPDATE pmsi.p_rss_etat
SET date_groupage = CASE WHEN GRP_DATE >= date_sortie THEN GRP_DATE ELSE '20991231' END
FROM pmsi.p_rss
JOIN w_DAT_GROUPAGE ON no_rss = RES_OID AND date_trunc('month',date_sortie) = date_trunc('month',RES_DS)
WHERE p_rss_etat.rss_id = p_rss.oid AND
date_groupage IS DISTINCT FROM CASE WHEN GRP_DATE >= date_sortie THEN GRP_DATE ELSE '20991231' END;
DROP TABLE IF EXISTS w_FAC_FACTURE;
CREATE TEMP TABLE w_FAC_FACTURE AS
SELECT p_rss.oid AS rss_id, p_rss.date_sortie, date(MAX(FACT_DATE)) AS FACT_DATE
FROM prod_web100t.DAT_DA
JOIN prod_web100t.FAC_FACTURE ON FACT_DA = DA_OID
JOIN pmsi.p_rss ON DA_NUMERO = no_sejour_administratif
WHERE date_trunc('month',date_sortie) = date_trunc('month',DA_DATE_FIN)
GROUP BY 1,2;
ALTER TABLE w_FAC_FACTURE ADD CONSTRAINT w_FAC_FACTURE_pkey PRIMARY KEY(rss_id);
UPDATE pmsi.p_rss_etat
SET date_facture = CASE WHEN FACT_DATE >= date_sortie AND FACT_DATE <> '20991231' THEN FACT_DATE ELSE '20991231' END,
est_facture = CASE WHEN FACT_DATE >= date_sortie AND FACT_DATE <> '20991231' THEN '1' ELSE '0' END
FROM w_FAC_FACTURE
WHERE p_rss_etat.rss_id = w_FAC_FACTURE.rss_id AND
(
date_facture IS DISTINCT FROM CASE WHEN FACT_DATE >= date_sortie AND FACT_DATE <> '20991231' THEN FACT_DATE ELSE '20991231' END
OR
est_facture IS DISTINCT FROM CASE WHEN FACT_DATE >= date_sortie AND FACT_DATE <> '20991231' THEN '1' ELSE '0' END
);
UPDATE pmsi.p_rss_etat
SET est_groupe = '1', est_valide = '1'
WHERE est_facture = '1' AND
(est_groupe = '0' OR est_valide = '0') ;
UPDATE pmsi.p_rss_etat
SET date_groupage = date_facture
WHERE date_facture < date_groupage AND
date_facture <> '20991231' AND
date_groupage <> '20991231';
UPDATE pmsi.p_rss_etat
SET date_groupage = '20991231'
WHERE date_groupage <> '20991231' AND
est_groupe IN ('0','9');
UPDATE pmsi.p_rss
SET ghm_id = t_ghm_99Z98Z.oid
FROM pmsi.p_rss_etat, pmsi.t_ghm, pmsi.t_ghm t_ghm_99Z98Z
WHERE p_rss.oid = p_rss_etat.rss_id AND
p_rss.ghm_id = t_ghm.oid AND
t_ghm_99Z98Z.code = '99Z98Z' AND
est_facture = '1' AND
t_ghm.code = '99Z99Z' AND
p_rss.oid NOT IN (
SELECT rss_id
FROM pmsi.p_rsf_detail
JOIN pmsi.t_prestations ON prestation_id = t_prestations.oid
WHERE t_prestations.code IN ('SE1', 'SE2', 'SE3', 'SE4', 'SE5', 'SE6', 'SE7', 'APE', 'AP2', 'FPI', 'FFM', 'ATU')
);
UPDATE pmsi.p_rss
SET ghm_id = 0
FROM pmsi.p_rss_etat, pmsi.t_ghm, pmsi.t_ghm t_ghm_99Z98Z
WHERE p_rss.oid = p_rss_etat.rss_id AND
p_rss.en_cours = '1' AND
p_rss.ghm_id = t_ghm.oid AND
t_ghm_99Z98Z.code = '99Z98Z' AND
est_facture = '1' AND
t_ghm.code = '99Z99Z' AND
p_rss.oid NOT IN (
SELECT rss_id
FROM pmsi.p_rsf_detail
JOIN pmsi.t_prestations ON prestation_id = t_prestations.oid
WHERE t_prestations.code IN ('SE1', 'SE2', 'SE3', 'SE4', 'SE5', 'SE6', 'SE7', 'APE', 'AP2', 'FPI', 'FFM', 'ATU')
);
UPDATE pmsi.p_rss
SET ghm_id = t_ghm_99Z99Z.oid
FROM pmsi.p_rss_etat, pmsi.t_ghm, pmsi.t_ghm t_ghm_99Z99Z
WHERE p_rss.oid = p_rss_etat.rss_id AND
p_rss.ghm_id = t_ghm.oid AND
t_ghm_99Z99Z.code = '99Z99Z' AND
en_cours = '1' AND
t_ghm.code LIKE '90%';
UPDATE pmsi.p_rss
SET ghm_id = 0
FROM pmsi.p_rss_etat, pmsi.t_ghm
WHERE p_rss.oid = p_rss_etat.rss_id AND
p_rss.en_cours = '1' AND
p_rss.ghm_id = t_ghm.oid AND
est_facture = '1' AND
(t_ghm.code = '99Z99Z' OR ghm_id = 0) AND
p_rss.oid IN (
SELECT rss_id
FROM pmsi.p_rsf_detail
JOIN pmsi.t_prestations ON prestation_id = t_prestations.oid
WHERE t_prestations.code IN ('SE1', 'SE2', 'SE3', 'SE4', 'SE5', 'SE6', 'SE7', 'APE', 'AP2', 'FPI', 'FFM', 'ATU')
);
UPDATE pmsi.p_rss
SET en_cours_etat = 'F'
FROM pmsi.p_rss_etat
WHERE p_rss.oid = p_rss_etat.rss_id AND
en_cours = '1' AND
en_cours_etat IS DISTINCT FROM 'F' AND
est_facture = 1 ;
]]></sqlcmd>
</NODE>
<NODE label="Etat de la facturation SHS">
<condition><![CDATA[
"[ADMPROVIDER]" == "shs" || "[ADMPROVIDER]" == "SHS"
]]></condition>
<sqlcmd><![CDATA[
DROP TABLE IF EXISTS w_ADP01;
CREATE TEMP TABLE w_ADP01 AS
SELECT ADDOSS AS ADDOSS_base,
to_char(ADDOSS,'FM00000000') AS ADDOSS,
CASE WHEN ADDOSS >= 10000000 THEN to_char(ADDOSS,'FM00000000') ELSE to_char(ADDOSS,'FM0000000') END AS ADDOSS2,
MAX(to_date(
CASE
WHEN ADCFAC = '1' AND ADDTFA <> 0 THEN to_char(ADDTFA,'FM00000000')
WHEN ADCFAC = '1' AND ADDTFA = 0 THEN to_char(now(),'YYYYMMDD')
ELSE '20991231' END,'YYYYMMDD')) AS ADDTFA
FROM prod_shs.[ACTIVITESCHEMA]h_ADP01H
WHERE ADADAV IN ('0','3')
GROUP BY 1,2;
ALTER TABLE w_ADP01 ADD CONSTRAINT w_ADP01_pkey PRIMARY KEY(ADDOSS);
INSERT INTO w_ADP01
SELECT ADDOSS AS ADDOSS_base,
to_char(ADDOSS,'FM00000000') AS ADDOSS,
CASE WHEN ADDOSS >= 10000000 THEN to_char(ADDOSS,'FM00000000') ELSE to_char(ADDOSS,'FM0000000') END AS ADDOSS2,
MAX(to_date(
CASE
WHEN ADCFAC = '1' AND ADDTFA <> 0 THEN to_char(ADDTFA,'FM00000000')
WHEN ADCFAC = '1' AND ADDTFA = 0 THEN to_char(now(),'YYYYMMDD')
ELSE '20991231' END,'YYYYMMDD')) AS ADDTFA
FROM prod_shs.[ACTIVITESCHEMA]p_ADP01P
WHERE ADADAV IN ('0','3') AND
ADDOSS NOT IN (SELECT ADDOSS_base FROM w_ADP01)
GROUP BY 1,2;
INSERT INTO w_ADP01
SELECT ADDOSS AS ADDOSS_base,
to_char(ADDOSS,'FM00000000') AS ADDOSS,
CASE WHEN ADDOSS >= 10000000 THEN to_char(ADDOSS,'FM00000000') ELSE to_char(ADDOSS,'FM0000000') END AS ADDOSS2,
MAX(to_date(
CASE
WHEN ADCFAC = '1' AND ADDTFA <> 0 THEN to_char(ADDTFA,'FM00000000')
WHEN ADCFAC = '1' AND ADDTFA = 0 THEN to_char(now(),'YYYYMMDD')
ELSE '20991231' END,'YYYYMMDD')) AS ADDTFA
FROM prod_shs.[ACTIVITESCHEMA]_ADP01
WHERE ADADAV IN ('0','3') AND
ADDOSS NOT IN (SELECT ADDOSS_base FROM w_ADP01)
GROUP BY 1,2;
UPDATE pmsi.p_rss_etat
SET date_facture = CASE WHEN ADDTFA >= date_sortie AND ADDTFA <> '20991231' THEN ADDTFA ELSE '20991231' END,
est_facture = CASE WHEN ADDTFA >= date_sortie AND ADDTFA <> '20991231' THEN '1' ELSE '0' END
FROM pmsi.p_rss
JOIN w_ADP01 ON ADDOSS = no_sejour_administratif
WHERE p_rss_etat.rss_id = p_rss.oid AND
(
date_facture IS DISTINCT FROM CASE WHEN ADDTFA >= date_sortie AND ADDTFA <> '20991231' THEN ADDTFA ELSE '20991231' END
OR
est_facture IS DISTINCT FROM CASE WHEN ADDTFA >= date_sortie AND ADDTFA <> '20991231' THEN '1' ELSE '0' END
);
UPDATE pmsi.p_rss_etat
SET date_facture = CASE WHEN ADDTFA >= date_sortie AND ADDTFA <> '20991231' THEN ADDTFA ELSE '20991231' END,
est_facture = CASE WHEN ADDTFA >= date_sortie AND ADDTFA <> '20991231' THEN '1' ELSE '0' END
FROM pmsi.p_rss
JOIN w_ADP01 ON ADDOSS2 = no_sejour_administratif
WHERE p_rss_etat.rss_id = p_rss.oid AND
(
date_facture IS DISTINCT FROM CASE WHEN ADDTFA >= date_sortie AND ADDTFA <> '20991231' THEN ADDTFA ELSE '20991231' END
OR
est_facture IS DISTINCT FROM CASE WHEN ADDTFA >= date_sortie AND ADDTFA <> '20991231' THEN '1' ELSE '0' END
);
UPDATE pmsi.p_rss_etat
SET est_groupe = '1', est_valide = '1'
WHERE est_facture = '1' AND
(est_groupe = '0' OR est_valide = '0') ;
UPDATE pmsi.p_rss_etat
SET date_groupage = date_facture
WHERE date_facture < date_groupage AND
date_facture <> '20991231' AND
date_groupage <> '20991231';
UPDATE pmsi.p_rss_etat
SET date_groupage = '20991231'
WHERE date_groupage <> '20991231' AND
est_groupe IN ('0','9');
UPDATE pmsi.p_rss
SET en_cours_etat = 'F'
FROM pmsi.p_rss_etat
WHERE p_rss.oid = p_rss_etat.rss_id AND
en_cours = '1' AND
en_cours_etat IS DISTINCT FROM 'F' AND
est_facture = 1 ;
]]></sqlcmd>
</NODE>
</NODE>
</ROOT>