return: text
|
|
lang: plpgsql
|
|
parameters:
|
|
p0:
|
|
type: bigint
|
|
name: i_controle_id
|
|
default: "NULL"
|
|
p1:
|
|
type: text
|
|
name: i_use_cache
|
|
default: "0"
|
|
src: |
|
|
DECLARE
|
|
ref refcursor;
|
|
request text := '';
|
|
_use_cache text;
|
|
_controle_id bigint;
|
|
_controle_code text;
|
|
_controle_rule_id bigint;
|
|
_sqlcmd_where text;
|
|
_sqlcmd_justificatif text;
|
|
_sqlcmd_insert text;
|
|
_nb_rules numeric := 0;
|
|
_nb_rules_error numeric := 0;
|
|
_last_execution_ok text;
|
|
_EXPERT_DATE_DEBUT date;
|
|
_c int;
|
|
_d int;
|
|
_p int;
|
|
_f int;
|
|
_l int;
|
|
_x int;
|
|
_x_b int;
|
|
_y int;
|
|
_i int;
|
|
_e int;
|
|
|
|
_ctl_string text;
|
|
_ctl_field text;
|
|
_ctl_field_key text;
|
|
_ctl_fieldType text;
|
|
_ctl_fieldDelimiter text;
|
|
_ctl_rule_i int;
|
|
_ctl_rule_fields_array text[];
|
|
_ctl_rule_operators_array text[];
|
|
_ctl_rule_values_array text[];
|
|
_ctl_operator text;
|
|
_ctl_operator_2 text;
|
|
_ctl_operator_b text;
|
|
_ctl_values text;
|
|
_ctl_values_2 text;
|
|
_ctl_values_array text[];
|
|
_ctl_value text;
|
|
_ctl_list text;
|
|
_ctl_list_array text[];
|
|
_ctl_new_where text;
|
|
_ctl_new_where_un text;
|
|
_sqlcmd_new_where text;
|
|
_ctl_subview_field_key text;
|
|
_ctl_subview_operator text;
|
|
_ctl_subview_value text;
|
|
|
|
|
|
_subviews text[];
|
|
_subviews_key text[];
|
|
_subviews_jfield text[];
|
|
_subviews_count int;
|
|
|
|
BEGIN
|
|
-- Module activé ?
|
|
INSERT INTO pmsi.t_divers (code, texte, valeur, description)
|
|
SELECT
|
|
'EXPERT_ACTIVE',
|
|
'Module EXPERT activé',
|
|
'0',
|
|
'1=Activé'
|
|
WHERE 'EXPERT_ACTIVE' NOT IN (SELECT code FROM pmsi.t_divers);
|
|
INSERT INTO pmsi.t_divers (code, texte, valeur, description, valeur_date)
|
|
SELECT
|
|
'EXPERT_DATE_DEBUT',
|
|
'Date séjours à contrôler',
|
|
'20130101',
|
|
'Date de début des séjours à contrôler',
|
|
'20130101'
|
|
WHERE 'EXPERT_DATE_DEBUT' NOT IN (SELECT code FROM pmsi.t_divers);
|
|
IF NOT EXISTS (SELECT * FROM pmsi.t_divers WHERE code = 'EXPERT_ACTIVE' AND valeur = '1') THEN
|
|
return 'Module inactivé';
|
|
END IF;
|
|
|
|
-- règles ?
|
|
IF NOT EXISTS (SELECT * FROM pmsi.t_expert_controle_rule LIMIT 1) THEN
|
|
return 'Pas de règle';
|
|
END IF;
|
|
|
|
RAISE NOTICE '%','Extraction des RSS à traiter';
|
|
_EXPERT_DATE_DEBUT = (SELECT valeur_date FROM pmsi.t_divers WHERE code = 'EXPERT_DATE_DEBUT');
|
|
if _EXPERT_DATE_DEBUT IS NULL THEN
|
|
_EXPERT_DATE_DEBUT = '2013-01-01';
|
|
END IF;
|
|
|
|
-- Table de travail
|
|
|
|
-- Si pas d'utilisation du cache, recréer les tables
|
|
_use_cache = COALESCE(i_use_cache,'0');
|
|
IF _use_cache = '1' THEN
|
|
IF NOT EXISTS (SELECT * FROM pg_class WHERE relname = 'pmsi_expert_cache_rss') THEN
|
|
_use_cache = '0';
|
|
END IF;
|
|
END IF;
|
|
|
|
|
|
|
|
IF _use_cache IS DISTINCT FROM '1' THEN
|
|
DROP TABLE IF EXISTS w_rss;
|
|
CREATE TEMP TABLE w_rss AS
|
|
SELECT
|
|
v_rss_1.rss_id AS oid,
|
|
v_rss_1.finess,
|
|
finess_id,
|
|
finess_texte,
|
|
finess_section_id,
|
|
finess_section_code,
|
|
finess_section_texte,
|
|
CASE WHEN t_finess.type_etablissement = '1' THEN '1' ELSE '2' END AS type_etablissement,
|
|
CASE WHEN COALESCE(t_finess.datim_categorie,'') <> '' THEN t_finess.datim_categorie
|
|
WHEN t_finess.type_etablissement = '1' THEN '1'
|
|
WHEN t_finess.type_etablissement = '2' THEN '3'
|
|
WHEN t_finess.type_etablissement = '3' THEN '3'
|
|
ELSE '' END AS ets_datim_categorie,
|
|
COALESCE(t_finess.datim_autorisation_cardio,0) AS ets_datim_cardio,
|
|
COALESCE(t_finess.datim_autorisation_neuro,0) AS ets_datim_neuro,
|
|
COALESCE(t_finess.datim_autorisation_rea,0) AS ets_datim_rea,
|
|
COALESCE(t_finess.datim_autorisation_rep,0) AS ets_datim_rep,
|
|
COALESCE(t_finess.datim_autorisation_nn,0) AS ets_datim_nn,
|
|
COALESCE(t_finess.datim_service_urgence,0) AS ets_datim_urgence,
|
|
COALESCE(t_finess.datim_service_ssr,0) AS ets_datim_ssr,
|
|
COALESCE(t_finess.datim_service_sld,0) AS ets_datim_sld,
|
|
COALESCE(t_finess.datim_service_psy,0) AS ets_datim_psy,
|
|
patient_id,
|
|
no_patient,
|
|
v_rss_1.rss_id,
|
|
v_rss_1.no_rss,
|
|
v_rss_1.no_sejour_administratif,
|
|
traitement_epmsi,
|
|
traitement_epmsi_texte,
|
|
code_retour_groupage,
|
|
en_cours,
|
|
en_cours_etat,
|
|
en_cours_texte_tres_court,
|
|
date_part('year',v_rss_1.date_sortie) AS annee_sortie,
|
|
v_rss_1.mois_sortie,
|
|
v_rss_1.mois_sortie_texte,
|
|
v_rss_1.mois_sortie_mm_code,
|
|
v_rss_1.mois_sortie_mm_texte,
|
|
v_rss_1.date_entree,
|
|
v_rss_1.date_sortie,
|
|
|
|
unite_medicale_principale_id,
|
|
unite_medicale_principale_code,
|
|
unite_medicale_principale_texte,
|
|
rehosp_meme_ghm,
|
|
mode_entree,
|
|
mode_entree || provenance AS provenance,
|
|
mode_sortie,
|
|
mode_sortie || destination AS destination,
|
|
0::bigint AS sejour_precedent_rss_id,
|
|
NULL::date AS sejour_precedent_date_entree,
|
|
NULL::date AS sejour_precedent_date_sortie,
|
|
''::text AS sejour_precedent_ghm_code,
|
|
|
|
v_rss_1.sexe,
|
|
sexe_texte_court,
|
|
sexe_texte,
|
|
v_rss_1.date_naissance,
|
|
age,
|
|
code_postal,
|
|
code_postal_id,
|
|
|
|
ghm_id,
|
|
CASE WHEN ghm_id <> 0 THEN ghm_code ELSE '' END AS ghm_code,
|
|
ghm_texte,
|
|
ghm_section_id,
|
|
ghm_section_code,
|
|
ghm_section_texte,
|
|
ghm5_id,
|
|
ghm5_code,
|
|
'0'::text AS ghm5_datim_conf,
|
|
|
|
''::text AS ghm_datim_tghm,
|
|
0::smallint AS ghm_datim_cti_1orj,
|
|
mco,
|
|
mco_texte,
|
|
substr(ghm_code,3,1) AS ghm3,
|
|
severite_ghm_code AS severite,
|
|
CASE
|
|
WHEN severite_ghm_code IN ('1','A') THEN 1
|
|
WHEN severite_ghm_code IN ('2','B') THEN 2
|
|
WHEN severite_ghm_code IN ('3','C') THEN 3
|
|
WHEN severite_ghm_code IN ('4','D') THEN 4
|
|
ELSE 0
|
|
END AS ghm_cma,
|
|
severite_ghm_code,
|
|
severite_ghm_texte,
|
|
cmd_id,
|
|
cmd_code,
|
|
cmd_texte,
|
|
cas_id,
|
|
cas_code,
|
|
cas_texte,
|
|
ghm_id AS ghmrsa_id,
|
|
ghm_code AS ghmrsa_code,
|
|
ghm_id AS ghmrsa_in_id,
|
|
ghm_code AS ghmrsa_in_code,
|
|
ghs_id AS ghsrsa_id,
|
|
ghs_code AS ghsrsa_code,
|
|
ghs_id,
|
|
trim(ghs_code) as ghs_code,
|
|
ghs_texte,
|
|
ghs_borne_basse,
|
|
ghs_borne_haute,
|
|
dms_nationale_ghs,
|
|
ecart_dms_nationale_ghs,
|
|
dms_ghm_1,
|
|
ecart_dms_ghm_1,
|
|
dms_ghm_2,
|
|
ecart_dms_ghm_2,
|
|
dms_ghm_3,
|
|
ecart_dms_ghm_3,
|
|
dms_ghm_hospidiag,
|
|
ecart_dms_ghm_hospidiag,
|
|
nb_rum,
|
|
nb_exh,
|
|
nb_exh as nb_exh_rsa,
|
|
ca_exh,
|
|
nb_exb,
|
|
ca_exb,
|
|
ca_perte_exb,
|
|
nb_ghs,
|
|
ca_ghs,
|
|
ca_ghs_theorique,
|
|
forfait_facture,
|
|
specialite_medecin_rss_id,
|
|
specialite_medecin_rss_code,
|
|
specialite_medecin_rss_texte,
|
|
specialite_interne_medecin_rss_id,
|
|
specialite_interne_medecin_rss_code,
|
|
specialite_interne_medecin_rss_texte,
|
|
medecin_rss_id,
|
|
medecin_rss_code,
|
|
medecin_rss_nom,
|
|
specialite_medecin_reference_rss_id,
|
|
specialite_medecin_reference_rss_code,
|
|
specialite_medecin_reference_rss_texte,
|
|
specialite_interne_medecin_reference_rss_id,
|
|
specialite_interne_medecin_reference_rss_code,
|
|
specialite_interne_medecin_reference_rss_texte,
|
|
medecin_reference_rss_id,
|
|
medecin_reference_rss_code,
|
|
medecin_reference_rss_nom,
|
|
medecin_rss_section_id,
|
|
medecin_rss_section_code,
|
|
medecin_rss_section_texte,
|
|
comite_medical_id,
|
|
prestation_principale_id,
|
|
prestation_principale_code,
|
|
|
|
diagnostic_principal_id,
|
|
CASE WHEN diagnostic_principal_id <> 0 THEN diagnostic_principal_code ELSE '' END AS diagnostic_principal_code,
|
|
diagnostic_principal_texte,
|
|
0::numeric AS diagnostic_principal_datim_rare,
|
|
0::numeric AS diagnostic_principal_datim_dpchir,
|
|
0::numeric AS diagnostic_principal_datim_zinhab,
|
|
0::numeric AS diagnostic_principal_datim_imprecis,
|
|
0::numeric AS diagnostic_principal_datim_zaffchr,
|
|
0::numeric AS diagnostic_principal_datim_timprecis,
|
|
0::numeric AS diagnostic_principal_datim_tintox,
|
|
0::numeric AS diagnostic_principal_datim_cma,
|
|
0::numeric AS diagnostic_principal_datim_cti_cma_fils,
|
|
0::numeric AS diagnostic_principal_datim_cti_cma_frere,
|
|
0::numeric AS diagnostic_principal_datim_dpacte,
|
|
0::numeric AS diagnostic_principal_datim_dgcpt669,
|
|
0::numeric AS diagnostic_principal_datim_brulure,
|
|
0::numeric AS diagnostic_principal_datim_esth,
|
|
0::numeric AS diagnostic_principal_datim_affaig,
|
|
0::numeric AS diagnostic_principal_datim_pbsexe,
|
|
0::numeric AS diagnostic_principal_datim_sexed,
|
|
0::numeric AS diagnostic_principal_datim_pbage,
|
|
0::numeric AS diagnostic_principal_datim_cl1v,
|
|
0::numeric AS diagnostic_principal_datim_cl2v,
|
|
0::numeric AS diagnostic_principal_datim_cl3v,
|
|
0::numeric AS diagnostic_principal_datim_cl4v,
|
|
0::numeric AS diagnostic_principal_datim_cl5v,
|
|
0::numeric AS diagnostic_principal_datim_cl6v,
|
|
0::numeric AS diagnostic_principal_datim_compimprecis,
|
|
0::numeric AS diagnostic_principal_datim_seance,
|
|
|
|
diagnostic_relie_id,
|
|
CASE WHEN diagnostic_relie_id <> 0 THEN diagnostic_relie_code ELSE '' END AS diagnostic_relie_code,
|
|
diagnostic_relie_texte,
|
|
diagnostic_relie_section_id,
|
|
diagnostic_relie_section_code,
|
|
diagnostic_relie_section_texte,
|
|
0::numeric AS diagnostic_relie_datim_rare,
|
|
0::numeric AS diagnostic_relie_datim_dpchir,
|
|
0::numeric AS diagnostic_relie_datim_zinhab,
|
|
0::numeric AS diagnostic_relie_datim_imprecis,
|
|
0::numeric AS diagnostic_relie_datim_zaffchr,
|
|
0::numeric AS diagnostic_relie_datim_timprecis,
|
|
0::numeric AS diagnostic_relie_datim_tintox,
|
|
0::numeric AS diagnostic_relie_datim_cma,
|
|
0::numeric AS diagnostic_relie_datim_cti_cma_fils,
|
|
0::numeric AS diagnostic_relie_datim_cti_cma_frere,
|
|
0::numeric AS diagnostic_relie_datim_dpacte,
|
|
0::numeric AS diagnostic_relie_datim_dgcpt669,
|
|
0::numeric AS diagnostic_relie_datim_brulure,
|
|
0::numeric AS diagnostic_relie_datim_esth,
|
|
0::numeric AS diagnostic_relie_datim_affaig,
|
|
0::numeric AS diagnostic_relie_datim_pbsexe,
|
|
0::numeric AS diagnostic_relie_datim_sexed,
|
|
0::numeric AS diagnostic_relie_datim_pbage,
|
|
0::numeric AS diagnostic_relie_datim_cl1v,
|
|
0::numeric AS diagnostic_relie_datim_cl2v,
|
|
0::numeric AS diagnostic_relie_datim_cl3v,
|
|
0::numeric AS diagnostic_relie_datim_cl4v,
|
|
0::numeric AS diagnostic_relie_datim_cl5v,
|
|
0::numeric AS diagnostic_relie_datim_cl6v,
|
|
0::numeric AS diagnostic_relie_datim_compimprecis,
|
|
NULL::smallint[] AS pathologies_chroniques_non_codees,
|
|
''::text AS diagnostic_double_code,
|
|
|
|
''::text AS liste_diagnostics,
|
|
0::smallint AS diagnostic_associe_brulure,
|
|
NULL::bigint[] as da_array,
|
|
NULL::text[] as diagnostics_documentaires,
|
|
|
|
acte_principal_id,
|
|
acte_principal_code,
|
|
acte_principal_texte,
|
|
NULL::bigint[] as acte_id_array,
|
|
|
|
''::text as type_sejour,
|
|
0::bigint as age_jours,
|
|
|
|
duree_sejour,
|
|
nb_rsa,
|
|
nb_seances,
|
|
nb_rsa_0n,
|
|
nb_rsa_1n,
|
|
nb_rsa_2n,
|
|
nb_rsa_xn,
|
|
nb_factures_nulles,
|
|
v_rss_1.base_remboursement,
|
|
sejour_facture,
|
|
v_rss_1.taux_remboursement,
|
|
v_rsf_total_1.exoneration_tm_code,
|
|
v_rsf_total_1.exoneration_tm_texte,
|
|
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,
|
|
igs2,
|
|
no_oid,
|
|
mcos_code,
|
|
mcos_texte,
|
|
mcos_id,
|
|
rss_mere_id,
|
|
poids_bebe,
|
|
age_gestationnel,
|
|
date_dernieres_regles,
|
|
v_rss_1.confirmation_codage,
|
|
type_machine_rdth,
|
|
type_dosimetrie,
|
|
numero_innovation,
|
|
CASE WHEN p_vidhosp.rss_id IS NOT NULL THEN '1' ELSE '0' END AS vidhosp,
|
|
COALESCE(p_vidhosp.code_pec,'1') AS vidhosp_code_pec,
|
|
COALESCE(p_vidhosp.montant_tm,0) AS vidhosp_montant_tm,
|
|
COALESCE(p_vidhosp.hospit_nouveau_ne, '0'::text) as vidhosp_hospit_nouveau_ne,
|
|
v_rsf_total_1.valorise_fides_code,
|
|
p_rss_maternite.accouchement_hors_img as mat_accouchement_hors_img,
|
|
p_rss_maternite.age_gestationnel_manquant as mat_age_gestationnel_manquant,
|
|
p_rss_maternite.age_gestationnel_inf_22sa as mat_age_gestationnel_inf_22sa,
|
|
p_rss_maternite.avec_acte_accouchement as mat_avec_acte_accouchement,
|
|
p_rss_maternite.confirmation_codage as mat_confirmation_codage,
|
|
p_rss_maternite.ecart_age_gestationnel as mat_ecart_age_gestationnel,
|
|
p_rss_maternite.hors_cmd_14 as mat_hors_cmd_14,
|
|
p_rss_maternite.hors_etablissement as mat_hors_etablissement,
|
|
raac_id
|
|
FROM pmsi.v_rss_1
|
|
JOIN base.t_finess ON t_finess.code = v_rss_1.finess
|
|
JOIN pmsi.v_rsf_total_1 ON (v_rss_1.rss_id = v_rsf_total_1.rss_id)
|
|
LEFT JOIN pmsi.p_vidhosp ON v_rss_1.rss_id = p_vidhosp.rss_id
|
|
LEFT JOIN pmsi.p_rss_maternite ON v_rss_1.rss_id = p_rss_maternite.rss_id
|
|
WHERE v_rss_1.date_sortie >= _EXPERT_DATE_DEBUT
|
|
;
|
|
ALTER TABLE w_rss ADD CONSTRAINT w_rss_pk PRIMARY KEY (oid);
|
|
CREATE INDEX w_rss_i1 ON w_rss USING btree (oid);
|
|
CREATE INDEX w_rss_i2 ON w_rss USING btree (diagnostic_principal_code);
|
|
CREATE INDEX w_rss_i3 ON w_rss USING btree (diagnostic_relie_code);
|
|
CREATE INDEX w_rss_i4 ON w_rss USING btree (acte_principal_code);
|
|
CREATE INDEX w_rss_i5 ON w_rss USING btree (annee_sortie);
|
|
|
|
RAISE NOTICE '%','Association RSA';
|
|
UPDATE w_rss SET
|
|
type_sejour = p_rsa.type_sejour,
|
|
age_jours = p_rsa.age_jours
|
|
FROM
|
|
pmsi.p_rsa
|
|
WHERE
|
|
p_rsa.rss_id = w_rss.rss_id;
|
|
RAISE NOTICE '%','Association DATIM GHM';
|
|
UPDATE w_rss SET
|
|
ghm_datim_tghm = t_datim_ghminfo.tghm,
|
|
ghm_datim_cti_1orj = t_datim_ghminfo.cti_1orj
|
|
FROM pmsi.t_datim_ghminfo
|
|
WHERE t_datim_ghminfo.ghm_id = w_rss.ghm_id AND
|
|
date_sortie BETWEEN date_debut AND date_fin AND
|
|
type_etablissement = t_datim_ghminfo.typets AND
|
|
(
|
|
t_datim_ghminfo.tghm <> '' OR
|
|
t_datim_ghminfo.cti_1orj <> 0
|
|
)
|
|
;
|
|
|
|
RAISE NOTICE '%','Association DATIM RACINE';
|
|
UPDATE w_rss SET
|
|
ghm5_datim_conf = t_datim_racineinfo.conf::text
|
|
FROM pmsi.t_datim_racineinfo
|
|
WHERE t_datim_racineinfo.ghm5_id = w_rss.ghm5_id AND
|
|
w_rss.date_sortie BETWEEN t_datim_racineinfo.date_debut AND t_datim_racineinfo.date_fin AND
|
|
w_rss.type_etablissement = t_datim_racineinfo.typets AND
|
|
t_datim_racineinfo.conf = 1
|
|
;
|
|
|
|
RAISE NOTICE '%','Association DATIM DP';
|
|
|
|
UPDATE w_rss SET
|
|
diagnostic_principal_datim_rare = t_datim_diaginfo.rare,
|
|
diagnostic_principal_datim_dpchir = t_datim_diaginfo.dpchir,
|
|
diagnostic_principal_datim_zinhab = t_datim_diaginfo.zinhab,
|
|
diagnostic_principal_datim_imprecis = t_datim_diaginfo.imprecis,
|
|
diagnostic_principal_datim_zaffchr = t_datim_diaginfo.zaffchr,
|
|
diagnostic_principal_datim_timprecis = t_datim_diaginfo.timprecis,
|
|
diagnostic_principal_datim_tintox = t_datim_diaginfo.tintox,
|
|
diagnostic_principal_datim_cma = t_datim_diaginfo.cma,
|
|
diagnostic_principal_datim_cti_cma_fils = t_datim_diaginfo.cti_cma_fils,
|
|
diagnostic_principal_datim_cti_cma_frere = t_datim_diaginfo.cti_cma_frere,
|
|
diagnostic_principal_datim_dpacte = t_datim_diaginfo.dpacte,
|
|
diagnostic_principal_datim_dgcpt669 = t_datim_diaginfo.dgcpt669,
|
|
diagnostic_principal_datim_brulure = t_datim_diaginfo.brulure,
|
|
diagnostic_principal_datim_esth = t_datim_diaginfo.esth,
|
|
diagnostic_principal_datim_affaig = t_datim_diaginfo.affaig,
|
|
diagnostic_principal_datim_pbsexe = CASE
|
|
WHEN sexe <> 1 AND t_datim_diaginfo.sexed = 1 THEN 1
|
|
WHEN sexe <> 2 AND t_datim_diaginfo.sexed = 2 THEN 1
|
|
ELSE 0 END,
|
|
diagnostic_principal_datim_sexed = t_datim_diaginfo.sexed,
|
|
diagnostic_principal_datim_pbage = CASE
|
|
WHEN t_datim_diaginfo.cl1v > 0 AND date_sortie - date_naissance < 29 THEN 1
|
|
WHEN t_datim_diaginfo.cl2v > 0 AND date_sortie - date_naissance >= 29 AND age = 0 THEN 1
|
|
WHEN t_datim_diaginfo.cl3v > 0 AND age >= 1 AND age < 10 THEN 1
|
|
WHEN t_datim_diaginfo.cl4v > 0 AND age >= 10 AND age < 20 THEN 1
|
|
WHEN t_datim_diaginfo.cl5v > 0 AND age >= 20 AND age < 65 THEN 1
|
|
WHEN t_datim_diaginfo.cl6v > 0 AND age >= 65 THEN 1
|
|
ELSE 0 END,
|
|
diagnostic_principal_datim_cl1v = t_datim_diaginfo.cl1v,
|
|
diagnostic_principal_datim_cl2v = t_datim_diaginfo.cl2v,
|
|
diagnostic_principal_datim_cl3v = t_datim_diaginfo.cl3v,
|
|
diagnostic_principal_datim_cl4v = t_datim_diaginfo.cl4v,
|
|
diagnostic_principal_datim_cl5v = t_datim_diaginfo.cl5v,
|
|
diagnostic_principal_datim_cl6v = t_datim_diaginfo.cl6v,
|
|
diagnostic_principal_datim_compimprecis = t_datim_diaginfo.compimprecis,
|
|
diagnostic_principal_datim_seance = t_datim_diaginfo.seance
|
|
FROM pmsi.t_datim_diaginfo
|
|
WHERE diagnostic_principal_id = t_datim_diaginfo.diagnostic_id AND
|
|
date_sortie BETWEEN date_debut AND date_fin AND
|
|
(
|
|
t_datim_diaginfo.rare <> 0 OR
|
|
t_datim_diaginfo.dpchir <> 0 OR
|
|
t_datim_diaginfo.zinhab <> 0 OR
|
|
t_datim_diaginfo.imprecis <> 0 OR
|
|
t_datim_diaginfo.zaffchr <> 0 OR
|
|
t_datim_diaginfo.timprecis <> 0 OR
|
|
t_datim_diaginfo.tintox <> 0 OR
|
|
t_datim_diaginfo.cma <> 0 OR
|
|
t_datim_diaginfo.cti_cma_fils <> 0 OR
|
|
t_datim_diaginfo.cti_cma_frere <> 0 OR
|
|
t_datim_diaginfo.dpacte <> 0 OR
|
|
t_datim_diaginfo.dgcpt669 <> 0 OR
|
|
t_datim_diaginfo.brulure <> 0 OR
|
|
t_datim_diaginfo.esth <> 0 OR
|
|
t_datim_diaginfo.affaig <> 0 OR
|
|
t_datim_diaginfo.sexed <> 0 OR
|
|
t_datim_diaginfo.cl1v <> 0 OR
|
|
t_datim_diaginfo.cl2v <> 0 OR
|
|
t_datim_diaginfo.cl3v <> 0 OR
|
|
t_datim_diaginfo.cl4v <> 0 OR
|
|
t_datim_diaginfo.cl5v <> 0 OR
|
|
t_datim_diaginfo.cl6v <> 0 OR
|
|
t_datim_diaginfo.compimprecis <> 0 OR
|
|
t_datim_diaginfo.seance <> 0
|
|
)
|
|
;
|
|
RAISE NOTICE '%','Association DATIM DR';
|
|
UPDATE w_rss SET
|
|
diagnostic_relie_datim_rare = t_datim_diaginfo.rare,
|
|
diagnostic_relie_datim_dpchir = t_datim_diaginfo.dpchir,
|
|
diagnostic_relie_datim_zinhab = t_datim_diaginfo.zinhab,
|
|
diagnostic_relie_datim_imprecis = t_datim_diaginfo.imprecis,
|
|
diagnostic_relie_datim_zaffchr = t_datim_diaginfo.zaffchr,
|
|
diagnostic_relie_datim_timprecis = t_datim_diaginfo.timprecis,
|
|
diagnostic_relie_datim_tintox = t_datim_diaginfo.tintox,
|
|
diagnostic_relie_datim_cma = t_datim_diaginfo.cma,
|
|
diagnostic_relie_datim_cti_cma_fils = t_datim_diaginfo.cti_cma_fils,
|
|
diagnostic_relie_datim_cti_cma_frere = t_datim_diaginfo.cti_cma_frere,
|
|
diagnostic_relie_datim_dpacte = t_datim_diaginfo.dpacte,
|
|
diagnostic_relie_datim_dgcpt669 = t_datim_diaginfo.dgcpt669,
|
|
diagnostic_relie_datim_brulure = t_datim_diaginfo.brulure,
|
|
diagnostic_relie_datim_esth = t_datim_diaginfo.esth,
|
|
diagnostic_relie_datim_affaig = t_datim_diaginfo.affaig,
|
|
diagnostic_relie_datim_pbsexe = CASE
|
|
WHEN sexe <> 1 AND t_datim_diaginfo.sexed = 1 THEN 1
|
|
WHEN sexe <> 2 AND t_datim_diaginfo.sexed = 2 THEN 1
|
|
ELSE 0 END,
|
|
diagnostic_relie_datim_sexed = t_datim_diaginfo.sexed,
|
|
diagnostic_relie_datim_pbage = CASE
|
|
WHEN t_datim_diaginfo.cl1v > 0 AND date_sortie - date_naissance < 29 THEN 1
|
|
WHEN t_datim_diaginfo.cl2v > 0 AND date_sortie - date_naissance >= 29 AND age = 0 THEN 1
|
|
WHEN t_datim_diaginfo.cl3v > 0 AND age >= 1 AND age < 10 THEN 1
|
|
WHEN t_datim_diaginfo.cl4v > 0 AND age >= 10 AND age < 20 THEN 1
|
|
WHEN t_datim_diaginfo.cl5v > 0 AND age >= 20 AND age < 65 THEN 1
|
|
WHEN t_datim_diaginfo.cl6v > 0 AND age >= 65 THEN 1
|
|
ELSE 0 END,
|
|
diagnostic_relie_datim_cl1v = t_datim_diaginfo.cl1v,
|
|
diagnostic_relie_datim_cl2v = t_datim_diaginfo.cl2v,
|
|
diagnostic_relie_datim_cl3v = t_datim_diaginfo.cl3v,
|
|
diagnostic_relie_datim_cl4v = t_datim_diaginfo.cl4v,
|
|
diagnostic_relie_datim_cl5v = t_datim_diaginfo.cl5v,
|
|
diagnostic_relie_datim_cl6v = t_datim_diaginfo.cl6v,
|
|
diagnostic_relie_datim_compimprecis = t_datim_diaginfo.compimprecis
|
|
FROM pmsi.t_datim_diaginfo
|
|
WHERE diagnostic_relie_id = t_datim_diaginfo.diagnostic_id AND
|
|
date_sortie BETWEEN date_debut AND date_fin AND
|
|
(
|
|
t_datim_diaginfo.rare <> 0 OR
|
|
t_datim_diaginfo.dpchir <> 0 OR
|
|
t_datim_diaginfo.zinhab <> 0 OR
|
|
t_datim_diaginfo.imprecis <> 0 OR
|
|
t_datim_diaginfo.zaffchr <> 0 OR
|
|
t_datim_diaginfo.timprecis <> 0 OR
|
|
t_datim_diaginfo.tintox <> 0 OR
|
|
t_datim_diaginfo.cma <> 0 OR
|
|
t_datim_diaginfo.cti_cma_fils <> 0 OR
|
|
t_datim_diaginfo.cti_cma_frere <> 0 OR
|
|
t_datim_diaginfo.dpacte <> 0 OR
|
|
t_datim_diaginfo.dgcpt669 <> 0 OR
|
|
t_datim_diaginfo.brulure <> 0 OR
|
|
t_datim_diaginfo.esth <> 0 OR
|
|
t_datim_diaginfo.affaig <> 0 OR
|
|
t_datim_diaginfo.sexed <> 0 OR
|
|
t_datim_diaginfo.cl1v <> 0 OR
|
|
t_datim_diaginfo.cl2v <> 0 OR
|
|
t_datim_diaginfo.cl3v <> 0 OR
|
|
t_datim_diaginfo.cl4v <> 0 OR
|
|
t_datim_diaginfo.cl5v <> 0 OR
|
|
t_datim_diaginfo.cl6v <> 0 OR
|
|
t_datim_diaginfo.compimprecis <> 0
|
|
)
|
|
;
|
|
RAISE NOTICE '%','Association DATIM DA';
|
|
DROP TABLE IF EXISTS w_rss_diagnostics_associes;
|
|
CREATE TEMP TABLE w_rss_diagnostics_associes AS
|
|
SELECT
|
|
w_rss.rss_id,
|
|
COALESCE(t_diagnostics.code,'') AS diagnostic_associe_code,
|
|
COALESCE(t_datim_diaginfo.cma,0) AS diagnostic_associe_datim_cma,
|
|
COALESCE(t_datim_diaginfo.cti_cma_fils,0) AS diagnostic_associe_datim_cti_cma_fils,
|
|
COALESCE(t_datim_diaginfo.cti_cma_frere,0) AS diagnostic_associe_datim_cti_cma_frere,
|
|
COALESCE(t_datim_diaginfo.rare,0) AS diagnostic_associe_datim_rare,
|
|
COALESCE(t_datim_diaginfo.imprecis,0) AS diagnostic_associe_datim_imprecis,
|
|
COALESCE(t_datim_diaginfo.tintox,0) AS diagnostic_associe_datim_tintox,
|
|
COALESCE(t_datim_diaginfo.brulure,0) AS diagnostic_associe_datim_brulure,
|
|
COALESCE(t_datim_diaginfo.brulurebis,0) AS diagnostic_associe_datim_brulurebis,
|
|
COALESCE(t_datim_diaginfo.esth,0) AS diagnostic_associe_datim_esth,
|
|
COALESCE(t_datim_diaginfo.sexed,0) AS diagnostic_associe_datim_sexed,
|
|
CASE
|
|
WHEN sexe <> 1 AND t_datim_diaginfo.sexed = 1 THEN 1
|
|
WHEN sexe <> 2 AND t_datim_diaginfo.sexed = 2 THEN 1
|
|
ELSE 0 END AS diagnostic_associe_datim_pbsexe,
|
|
COALESCE(t_datim_diaginfo.cl1v,0) AS diagnostic_associe_datim_cl1v,
|
|
COALESCE(t_datim_diaginfo.cl2v,0) AS diagnostic_associe_datim_cl2v,
|
|
COALESCE(t_datim_diaginfo.cl3v,0) AS diagnostic_associe_datim_cl3v,
|
|
COALESCE(t_datim_diaginfo.cl4v,0) AS diagnostic_associe_datim_cl4v,
|
|
COALESCE(t_datim_diaginfo.cl5v,0) AS diagnostic_associe_datim_cl5v,
|
|
COALESCE(t_datim_diaginfo.cl6v,0) AS diagnostic_associe_datim_cl6v,
|
|
COALESCE(t_datim_diaginfo.compimprecis,0) AS diagnostic_associe_datim_compimprecis,
|
|
CASE
|
|
WHEN t_datim_diaginfo.cl1v > 0 AND date_sortie - date_naissance < 29 THEN 1
|
|
WHEN t_datim_diaginfo.cl2v > 0 AND date_sortie - date_naissance >= 29 AND age = 0 THEN 1
|
|
WHEN t_datim_diaginfo.cl3v > 0 AND age >= 1 AND age < 10 THEN 1
|
|
WHEN t_datim_diaginfo.cl4v > 0 AND age >= 10 AND age < 20 THEN 1
|
|
WHEN t_datim_diaginfo.cl5v > 0 AND age >= 20 AND age < 65 THEN 1
|
|
WHEN t_datim_diaginfo.cl6v > 0 AND age >= 65 THEN 1
|
|
ELSE 0 END AS diagnostic_associe_datim_pbage
|
|
FROM w_rss
|
|
LEFT JOIN pmsi.p_rss_diagnostics ON w_rss.rss_id = p_rss_diagnostics.rss_id AND type_diagnostic = 'DA'
|
|
LEFT JOIN pmsi.t_diagnostics ON p_rss_diagnostics.diagnostic_id = t_diagnostics.oid
|
|
LEFT JOIN pmsi.t_datim_diaginfo ON p_rss_diagnostics.diagnostic_id = t_datim_diaginfo.diagnostic_id AND date_sortie BETWEEN date_debut AND date_fin
|
|
;
|
|
CREATE INDEX w_rss_diagnostics_associes_i1 ON w_rss_diagnostics_associes USING btree (rss_id);
|
|
CREATE INDEX w_rss_diagnostics_associes_i2 ON w_rss_diagnostics_associes USING btree (diagnostic_associe_code);
|
|
|
|
DROP TABLE IF EXISTS w_brulure;
|
|
CREATE TEMP TABLE w_brulure AS
|
|
SELECT
|
|
rss_id,
|
|
max(w_rss_diagnostics_associes.diagnostic_associe_datim_brulurebis) as brulure
|
|
FROM
|
|
w_rss_diagnostics_associes
|
|
GROUP BY rss_id;
|
|
UPDATE w_rss SET
|
|
diagnostic_associe_brulure = brulure
|
|
FROM
|
|
w_brulure
|
|
WHERE
|
|
w_brulure.rss_id = w_rss.rss_id
|
|
AND diagnostic_associe_brulure <> brulure;
|
|
|
|
RAISE NOTICE '%','Association Diagnostics documentaires';
|
|
DROP TABLE IF EXISTS w_rss_diagnostics_documentaires;
|
|
CREATE TEMP TABLE w_rss_diagnostics_documentaires AS
|
|
SELECT
|
|
w_rss.rss_id,
|
|
COALESCE(t_diagnostics.code,'') AS diagnostic_documentaire_code
|
|
FROM w_rss
|
|
JOIN pmsi.p_rss_diagnostics ON w_rss.rss_id = p_rss_diagnostics.rss_id AND type_diagnostic = 'DD'
|
|
JOIN pmsi.t_diagnostics ON p_rss_diagnostics.diagnostic_id = t_diagnostics.oid
|
|
;
|
|
CREATE INDEX w_rss_diagnostics_documentaires_i1 ON w_rss_diagnostics_documentaires USING btree (rss_id);
|
|
CREATE INDEX w_rss_diagnostics_documentaires_i2 ON w_rss_diagnostics_documentaires USING btree (diagnostic_documentaire_code);
|
|
|
|
RAISE NOTICE '%','Diagnostics en double';
|
|
DROP TABLE IF EXISTS w_rss_diagnostics_doubles;
|
|
CREATE TEMP TABLE w_rss_diagnostics_doubles AS
|
|
SELECT
|
|
w_rss.rss_id, p_rss_diagnostics.no_rum, p_rss_diagnostics.diagnostic_id
|
|
FROM w_rss
|
|
JOIN pmsi.p_rss_diagnostics ON w_rss.rss_id = p_rss_diagnostics.rss_id
|
|
GROUP BY 1,2,3
|
|
HAVING count(*) > 1;
|
|
CREATE INDEX w_rss_diagnostics_doubles_i1 ON w_rss_diagnostics_doubles USING btree (diagnostic_id);
|
|
UPDATE w_rss
|
|
SET diagnostic_double_code = subview.diagnostic_double_code
|
|
FROM (
|
|
SELECT
|
|
rss_id,
|
|
base.cti_group_concat(t_diagnostics.code) AS diagnostic_double_code
|
|
FROM w_rss_diagnostics_doubles
|
|
JOIN pmsi.t_diagnostics ON diagnostic_id = t_diagnostics.oid
|
|
GROUP BY 1
|
|
) subview
|
|
WHERE w_rss.oid = subview.rss_id;
|
|
|
|
RAISE NOTICE '%','Concatenation des codes diagnosticss';
|
|
DROP TABLE IF EXISTS w_diag_list;
|
|
CREATE TEMP TABLE w_diag_list AS
|
|
SELECT
|
|
w_rss.oid as rss_id,
|
|
base.cti_group_concat(t_diagnostics.code) as liste_diag,
|
|
base.cti_array_accum(CASE WHEN p_rss_diagnostics.type_diagnostic_rss = 'DA' THEN t_diagnostics.oid ELSE NULL END) AS da__array
|
|
FROM
|
|
w_rss
|
|
JOIN pmsi.p_rss_diagnostics ON p_rss_diagnostics.rss_id = w_rss.oid
|
|
JOIN pmsi.t_diagnostics ON t_diagnostics.oid = p_rss_diagnostics.diagnostic_id
|
|
GROUP BY w_rss.oid;
|
|
UPDATE w_rss SET
|
|
liste_diagnostics = liste_diag,
|
|
da_array = da_array
|
|
FROM
|
|
w_diag_list
|
|
WHERE
|
|
w_diag_list.rss_id = w_rss.rss_id;
|
|
|
|
RAISE NOTICE '%','Concatenation des codes diagnosticss documentaires';
|
|
DROP TABLE IF EXISTS w_diag_doc_list;
|
|
CREATE TEMP TABLE w_diag_doc_list AS
|
|
SELECT
|
|
w_rss.oid as rss_id,
|
|
array_agg(DISTINCT t_diagnostics.code) AS dd__array
|
|
FROM
|
|
w_rss
|
|
JOIN pmsi.p_rss_diagnostics ON p_rss_diagnostics.rss_id = w_rss.oid
|
|
JOIN pmsi.t_diagnostics ON t_diagnostics.oid = p_rss_diagnostics.diagnostic_id
|
|
WHERE
|
|
p_rss_diagnostics.type_diagnostic = 'DD'
|
|
GROUP BY w_rss.oid;
|
|
|
|
UPDATE w_rss SET
|
|
diagnostics_documentaires = dd__array
|
|
FROM
|
|
w_diag_doc_list
|
|
WHERE
|
|
w_diag_doc_list.rss_id = w_rss.rss_id;
|
|
|
|
RAISE NOTICE '%','Association DATIM Actes';
|
|
DROP TABLE IF EXISTS w_rss_actes;
|
|
CREATE TEMP TABLE w_rss_actes AS
|
|
SELECT
|
|
p_rss_actes.rss_id,
|
|
COALESCE(t_actes_c.code,'') AS acte_code,
|
|
COALESCE(t_actes_c.texte,'') AS acte_texte,
|
|
COALESCE(activite_ccam,'') AS acte_activite,
|
|
COALESCE(phase_ccam,'') AS acte_phase,
|
|
COALESCE(CASE WHEN t_actes_c.classant = 'Y' THEN '1' ELSE '0' END) AS acte_classant,
|
|
CASE WHEN trim(association_nonprevue_ccam) <> ''::text THEN association_nonprevue_ccam else '0'::text END AS acte_assocnonprev,
|
|
MAX(CASE
|
|
WHEN p_rss_actes.rss_id IS NULL THEN ''
|
|
WHEN p_rss_actes.activite_ccam <> '4'::bpchar THEN t_actes_c.ccam_regroupement_code_1
|
|
ELSE t_actes_c.ccam_regroupement_code_4
|
|
END) AS acte_prestation,
|
|
|
|
MAX(COALESCE(t_datim_ccaminfo.ffm,0)) AS acte_datim_ffm,
|
|
MAX(COALESCE(t_datim_ccaminfo.se,0)) AS acte_datim_se,
|
|
MAX(COALESCE(t_datim_ccaminfo.fsd,0)) AS acte_datim_fsd,
|
|
MAX(COALESCE(t_datim_ccaminfo.autre,0)) AS acte_datim_autre,
|
|
MAX(COALESCE(t_datim_ccaminfo.unichir,0)) AS acte_datim_unichir,
|
|
MAX(COALESCE(t_datim_ccaminfo.gestcomp,0)) AS acte_datim_gestcomp,
|
|
MAX(COALESCE(t_datim_ccaminfo.reqz,0)) AS acte_datim_reqz,
|
|
MAX(COALESCE(t_datim_ccaminfo.dialyse,0)) AS acte_datim_dialyse,
|
|
MAX(COALESCE(t_datim_ccaminfo.esthe,0)) AS acte_datim_esth,
|
|
MAX(COALESCE(t_datim_ccaminfo.confort,0)) AS acte_datim_confort,
|
|
MAX(COALESCE(t_datim_ccaminfo.brule,0)) AS acte_datim_brule,
|
|
MAX(COALESCE(t_datim_ccaminfo.neurochir,0)) AS acte_datim_neurochir,
|
|
MAX(COALESCE(t_datim_ccaminfo.ojatypique,0)) AS acte_datim_0jatypique,
|
|
MAX(COALESCE(t_unites_medicales.type_autorisation,''::text)) AS acte_umaut,
|
|
MAX(COALESCE(t_datim_ccaminfo.seance,0)) AS acte_datim_seance,
|
|
MIN(date_acte) as acte_min_date_acte,
|
|
MAX(date_acte) as acte_max_date_acte,
|
|
|
|
SUM(nombre) AS acte_nombre,
|
|
0::integer as acte_nb_meme_jour
|
|
FROM w_rss
|
|
LEFT JOIN pmsi.p_rss_actes ON w_rss.rss_id = p_rss_actes.rss_id
|
|
LEFT JOIN pmsi.t_actes_c ON acte_id = t_actes_c.oid
|
|
LEFT JOIN pmsi.t_datim_ccaminfo ON t_datim_ccaminfo.acte_id = t_actes_c.oid
|
|
AND date_sortie BETWEEN date_debut AND date_fin
|
|
AND p_rss_actes.phase_ccam = substr(t_datim_ccaminfo.acte, 8,1)
|
|
LEFT JOIN pmsi.t_unites_medicales ON t_unites_medicales.oid = p_rss_actes.unite_medicale_id
|
|
GROUP BY 1,2,3,4,5,6,7;
|
|
CREATE INDEX w_rss_actes_i1 ON w_rss_actes USING btree (rss_id);
|
|
CREATE INDEX w_rss_actes_i2 ON w_rss_actes USING btree (acte_code);
|
|
|
|
-- Calcul du nombre d'actes identiques réalisés le même jour
|
|
WITH w_meme_jour AS (
|
|
SELECT
|
|
w_rss.rss_id,
|
|
t_actes.code as acte_code,
|
|
p_rss_actes.date_acte,
|
|
p_rss_actes.activite_ccam,
|
|
p_rss_actes.phase_ccam,
|
|
CASE WHEN trim(p_rss_actes.association_nonprevue_ccam) <> ''::text THEN p_rss_actes.association_nonprevue_ccam else '0'::text END as association_nonprevue_ccam,
|
|
count(*) as combien
|
|
FROM
|
|
w_rss
|
|
JOIN pmsi.p_rss_actes ON w_rss.rss_id = p_rss_actes.rss_id
|
|
JOIN pmsi.t_actes on t_actes.oid = p_rss_actes.acte_id
|
|
GROUP BY 1,2,3,4,5,6
|
|
HAVING count(*) > 1
|
|
)
|
|
UPDATE w_rss_actes SET
|
|
acte_nb_meme_jour = subview.combien_actes
|
|
FROM
|
|
(
|
|
SELECT
|
|
rss_id,
|
|
acte_code,
|
|
activite_ccam,
|
|
phase_ccam,
|
|
association_nonprevue_ccam,
|
|
sum(combien) as combien_actes
|
|
FROM
|
|
w_meme_jour
|
|
GROUP BY 1,2,3,4,5
|
|
) subview
|
|
WHERE 1=1
|
|
AND subview.rss_id = w_rss_actes.rss_id
|
|
AND subview.acte_code = w_rss_actes.acte_code
|
|
AND subview.activite_ccam = w_rss_actes.acte_activite
|
|
AND subview.phase_ccam = w_rss_actes.acte_phase
|
|
AND subview.association_nonprevue_ccam = w_rss_actes.acte_assocnonprev;
|
|
|
|
|
|
RAISE NOTICE '%','Concatenation des codes actes';
|
|
DROP TABLE IF EXISTS w_rss_actes_array;
|
|
CREATE TEMP TABLE w_rss_actes_array AS
|
|
SELECT
|
|
w_rss.rss_id,
|
|
base.cti_array_accum(p_rss_actes.acte_id) as actes_array
|
|
FROM
|
|
w_rss
|
|
JOIN pmsi.p_rss_actes USING (rss_id)
|
|
GROUP BY 1;
|
|
CREATE INDEX w_rss_actes_array_i1 ON w_rss_actes_array USING btree (rss_id);
|
|
|
|
UPDATE w_rss SET
|
|
acte_id_array = actes_array
|
|
FROM
|
|
w_rss_actes_array
|
|
WHERE
|
|
w_rss_actes_array.rss_id = w_rss.rss_id;
|
|
|
|
RAISE NOTICE '%','Association Prestations';
|
|
DROP TABLE IF EXISTS w_rsf_detail;
|
|
CREATE TEMP TABLE w_rsf_detail AS
|
|
SELECT
|
|
p_rsf_detail.rss_id,
|
|
COALESCE(t_prestations.code,'') AS presta_code,
|
|
COALESCE(to_char(t_ghs.code,'FM0000'),'') AS presta_ghs,
|
|
SUM(nombre*coefficient) AS presta_nombre,
|
|
SUM(p_rsf_detail.base_remboursement) AS presta_facture,
|
|
SUM(p_rsf_detail.sejour_remboursable) AS presta_rembourse
|
|
FROM w_rss
|
|
LEFT JOIN pmsi.p_rsf_detail ON w_rss.rss_id = p_rsf_detail.rss_id
|
|
LEFT JOIN pmsi.t_ghs ON p_rsf_detail.ghs_id = t_ghs.oid
|
|
LEFT JOIN pmsi.t_prestations ON prestation_id = t_prestations.oid
|
|
GROUP BY 1,2,3;
|
|
CREATE INDEX w_rsf_detail_i1 ON w_rsf_detail USING btree (rss_id);
|
|
CREATE INDEX w_rsf_detail_i2 ON w_rsf_detail USING btree (presta_code);
|
|
RAISE NOTICE '%','Recuperation pathologies chroniques';
|
|
DROP TABLE IF EXISTS w_patients_pathologies_chroniques;
|
|
CREATE TEMP TABLE w_patients_pathologies_chroniques AS
|
|
SELECT
|
|
patient_id,
|
|
Array[
|
|
MAX(CASE t_listes.code WHEN 'CTI_EXPCHR01_D' THEN 1 ELSE 0 END),
|
|
MAX(CASE t_listes.code WHEN 'CTI_EXPCHR02_D' THEN 1 ELSE 0 END),
|
|
MAX(CASE t_listes.code WHEN 'CTI_EXPCHR03_D' THEN 1 ELSE 0 END),
|
|
MAX(CASE t_listes.code WHEN 'CTI_EXPCHR04_D' THEN 1 ELSE 0 END),
|
|
MAX(CASE t_listes.code WHEN 'CTI_EXPCHR05_D' THEN 1 ELSE 0 END),
|
|
MAX(CASE t_listes.code WHEN 'CTI_EXPCHR06_D' THEN 1 ELSE 0 END),
|
|
MAX(CASE t_listes.code WHEN 'CTI_EXPCHR07_D' THEN 1 ELSE 0 END),
|
|
MAX(CASE t_listes.code WHEN 'CTI_EXPCHR08_D' THEN 1 ELSE 0 END),
|
|
MAX(CASE t_listes.code WHEN 'CTI_EXPCHR09_D' THEN 1 ELSE 0 END),
|
|
MAX(CASE t_listes.code WHEN 'CTI_EXPCHR99_D' THEN 1 ELSE 0 END)
|
|
] AS pathologies_chroniques
|
|
FROM pmsi.p_rss
|
|
LEFT JOIN pmsi.p_rss_diagnostics ON rss_id = p_rss.oid
|
|
LEFT JOIN pmsi.t_listes_contenu ON diagnostic_id = to_id
|
|
LEFT JOIN pmsi.t_listes ON liste_id = t_listes.oid AND
|
|
t_listes.code LIKE 'CTI_EXPCHR%' AND
|
|
t_listes.code LIKE '%D'
|
|
WHERE ghm_id <> 0
|
|
GROUP BY 1
|
|
HAVING count(DISTINCT rss_id) > 1 AND
|
|
count(t_listes.oid) > 0;
|
|
|
|
CREATE INDEX w_patients_pathologies_chroniques_i1 ON w_patients_pathologies_chroniques USING btree (patient_id);
|
|
DROP TABLE IF EXISTS w_rss_pathologies_chroniques;
|
|
CREATE TEMP TABLE w_rss_pathologies_chroniques AS
|
|
SELECT
|
|
w_rss.rss_id, w_rss.no_rss,
|
|
w_rss.patient_id,
|
|
Array[
|
|
CASE WHEN MAX(CASE t_listes.code WHEN 'CTI_EXPCHR01_D' THEN 1 ELSE 0 END) < MAX(pathologies_chroniques[1]) THEN 1 ELSE 0 END,
|
|
CASE WHEN MAX(CASE t_listes.code WHEN 'CTI_EXPCHR02_D' THEN 1 ELSE 0 END) < MAX(pathologies_chroniques[2]) THEN 1 ELSE 0 END,
|
|
CASE WHEN MAX(CASE t_listes.code WHEN 'CTI_EXPCHR03_D' THEN 1 ELSE 0 END) < MAX(pathologies_chroniques[3]) THEN 1 ELSE 0 END,
|
|
CASE WHEN MAX(CASE t_listes.code WHEN 'CTI_EXPCHR04_D' THEN 1 ELSE 0 END) < MAX(pathologies_chroniques[4]) THEN 1 ELSE 0 END,
|
|
CASE WHEN MAX(CASE t_listes.code WHEN 'CTI_EXPCHR05_D' THEN 1 ELSE 0 END) < MAX(pathologies_chroniques[5]) THEN 1 ELSE 0 END,
|
|
CASE WHEN MAX(CASE t_listes.code WHEN 'CTI_EXPCHR06_D' THEN 1 ELSE 0 END) < MAX(pathologies_chroniques[6]) THEN 1 ELSE 0 END,
|
|
CASE WHEN MAX(CASE t_listes.code WHEN 'CTI_EXPCHR07_D' THEN 1 ELSE 0 END) < MAX(pathologies_chroniques[7]) THEN 1 ELSE 0 END,
|
|
CASE WHEN MAX(CASE t_listes.code WHEN 'CTI_EXPCHR08_D' THEN 1 ELSE 0 END) < MAX(pathologies_chroniques[8]) THEN 1 ELSE 0 END,
|
|
CASE WHEN MAX(CASE t_listes.code WHEN 'CTI_EXPCHR09_D' THEN 1 ELSE 0 END) < MAX(pathologies_chroniques[9]) THEN 1 ELSE 0 END,
|
|
CASE WHEN MAX(CASE t_listes.code WHEN 'CTI_EXPCHR99_D' THEN 1 ELSE 0 END) < MAX(pathologies_chroniques[10]) THEN 1 ELSE 0 END
|
|
] AS pathologies_chroniques_non_codees
|
|
FROM w_rss
|
|
JOIN w_patients_pathologies_chroniques ON w_rss.patient_id = w_patients_pathologies_chroniques.patient_id
|
|
LEFT JOIN pmsi.p_rss_diagnostics ON p_rss_diagnostics.rss_id = w_rss.rss_id
|
|
LEFT JOIN pmsi.t_listes_contenu ON diagnostic_id = to_id
|
|
LEFT JOIN pmsi.t_listes ON liste_id = t_listes.oid AND
|
|
t_listes.code LIKE 'CTI_EXPCHR%' AND
|
|
t_listes.code LIKE '%D'
|
|
WHERE ghm_id <> 0
|
|
GROUP BY 1,2,3;
|
|
CREATE INDEX w_rss_pathologies_chroniques_i1 ON w_rss_pathologies_chroniques USING btree (rss_id);
|
|
UPDATE w_rss
|
|
SET pathologies_chroniques_non_codees = w_rss_pathologies_chroniques.pathologies_chroniques_non_codees
|
|
FROM w_rss_pathologies_chroniques
|
|
WHERE w_rss_pathologies_chroniques.rss_id = w_rss.rss_id;
|
|
|
|
|
|
RAISE NOTICE '%','Recuperation sejour precedent';
|
|
DROP TABLE IF EXISTS w_rss_precedent;
|
|
CREATE TEMP TABLE w_rss_precedent AS
|
|
SELECT
|
|
w_rss_rss_id,
|
|
(MAX(Array[p_rss_date_sortie::text, p_rss_rss_id::text]))[2]::bigint AS sejour_precedent_rss_id
|
|
FROM
|
|
(
|
|
SELECT
|
|
w_rss.rss_id AS w_rss_rss_id,
|
|
w_rss.date_entree AS w_rss_date_entree,
|
|
w_rss.date_sortie AS w_rss_date_sortie,
|
|
p_rss.oid AS p_rss_rss_id,
|
|
p_rss.date_entree AS p_rss_date_entree,
|
|
p_rss.date_sortie AS p_rss_date_sortie
|
|
FROM w_rss
|
|
JOIN pmsi.p_rss ON w_rss.patient_id = p_rss.patient_id AND
|
|
w_rss.finess = p_rss.finess
|
|
JOIN pmsi.t_ghm_c ON p_rss.ghm_id = t_ghm_c.oid
|
|
WHERE p_rss.oid <> w_rss.rss_id AND
|
|
w_rss.patient_id <> 0 AND
|
|
w_rss.ghm_id <> 0 AND
|
|
w_rss.cmd_code NOT IN ('28','90','99') AND
|
|
p_rss.ghm_id <> 0 AND
|
|
p_rss.date_entree < w_rss.date_sortie AND
|
|
p_rss.etat = '' AND
|
|
p_rss.ghm_id <> 0 AND
|
|
t_ghm_c.cmd_code NOT IN ('28','90','99')
|
|
) subview
|
|
GROUP BY 1;
|
|
|
|
UPDATE w_rss SET
|
|
sejour_precedent_rss_id = w_rss_precedent.sejour_precedent_rss_id,
|
|
sejour_precedent_date_entree = p_rss.date_entree,
|
|
sejour_precedent_date_sortie = p_rss.date_sortie,
|
|
sejour_precedent_ghm_code = t_ghm.code
|
|
FROM w_rss_precedent
|
|
JOIN pmsi.p_rss ON p_rss.oid = sejour_precedent_rss_id
|
|
JOIN pmsi.t_ghm ON ghm_id = t_ghm.oid
|
|
WHERE w_rss_precedent.w_rss_rss_id = w_rss.rss_id;
|
|
|
|
RAISE NOTICE '%','Recuperation GHM RSA';
|
|
UPDATE w_rss SET
|
|
ghmrsa_id = p_rsa.ghm_id,
|
|
ghmrsa_code = t_ghm.code,
|
|
ghsrsa_id = p_rsa.ghs_genrsa_id,
|
|
ghsrsa_code = t_ghs.code,
|
|
nb_exh_rsa = p_rsa.nb_exh
|
|
FROM pmsi.p_rsa
|
|
LEFT JOIN pmsi.t_ghm ON p_rsa.ghm_genrsa_id = t_ghm.oid
|
|
LEFT JOIN pmsi.t_ghs ON p_rsa.ghs_genrsa_id = t_ghs.oid
|
|
WHERE p_rsa.rss_id = w_rss.oid AND
|
|
(
|
|
ghmrsa_id IS DISTINCT FROM p_rsa.ghm_id OR
|
|
nb_exh_rsa IS DISTINCT FROM p_rsa.nb_exh OR
|
|
ghsrsa_id IS DISTINCT FROM p_rsa.ghs_genrsa_id
|
|
)
|
|
;
|
|
UPDATE w_rss SET
|
|
ghmrsa_in_id = p_rsa.ghm_id,
|
|
ghmrsa_in_code = t_ghm.code
|
|
FROM pmsi.p_rsa
|
|
LEFT JOIN pmsi.t_ghm ON p_rsa.ghm_id = t_ghm.oid
|
|
WHERE p_rsa.rss_id = w_rss.oid AND
|
|
(
|
|
ghmrsa_in_id IS DISTINCT FROM p_rsa.ghm_id
|
|
)
|
|
;
|
|
|
|
UPDATE w_rss SET
|
|
ghmrsa_id = w_rss.ghm_id,
|
|
ghmrsa_code = w_rss.ghm_code,
|
|
ghsrsa_id = w_rss.ghs_id,
|
|
ghsrsa_code = w_rss.ghs_code,
|
|
nb_exh_rsa = w_rss.nb_exh
|
|
WHERE ghsrsa_id = 0
|
|
;
|
|
-- Sauvegarde tables en cache
|
|
RAISE NOTICE '%','Cache tables';
|
|
DROP TABLE IF EXISTS cache.pmsi_expert_cache_rss;
|
|
CREATE TABLE cache.pmsi_expert_cache_rss AS SELECT * FROM w_rss;
|
|
DROP TABLE IF EXISTS cache.pmsi_expert_cache_rss_diagnostics_associes;
|
|
CREATE TABLE cache.pmsi_expert_cache_rss_diagnostics_associes AS SELECT * FROM w_rss_diagnostics_associes;
|
|
DROP TABLE IF EXISTS cache.pmsi_expert_cache_rss_actes;
|
|
CREATE TABLE cache.pmsi_expert_cache_rss_actes AS SELECT * FROM w_rss_actes;
|
|
DROP TABLE IF EXISTS cache.pmsi_expert_cache_rsf_detail;
|
|
CREATE TABLE cache.pmsi_expert_cache_rsf_detail AS SELECT * FROM w_rsf_detail;
|
|
DROP TABLE IF EXISTS cache.pmsi_expert_cache_rss_precedent;
|
|
CREATE TABLE cache.pmsi_expert_cache_rss_precedent AS SELECT * FROM w_rss_precedent;
|
|
|
|
END IF;
|
|
-- Si utilisation du cache, récupérer les caches
|
|
IF _use_cache = '1' THEN
|
|
RAISE NOTICE '%','Recuperation Cache tables';
|
|
|
|
DROP TABLE IF EXISTS w_rss;
|
|
CREATE TEMP TABLE w_rss AS SELECT * FROM cache.pmsi_expert_cache_rss;
|
|
CREATE INDEX w_rss_i1 ON w_rss USING btree (oid);
|
|
CREATE INDEX w_rss_i2 ON w_rss USING btree (diagnostic_principal_code);
|
|
CREATE INDEX w_rss_i3 ON w_rss USING btree (diagnostic_relie_code);
|
|
CREATE INDEX w_rss_i4 ON w_rss USING btree (acte_principal_code);
|
|
CREATE INDEX w_rss_i5 ON w_rss USING btree (annee_sortie);
|
|
DROP TABLE IF EXISTS w_rss_diagnostics_associes;
|
|
CREATE TEMP TABLE w_rss_diagnostics_associes AS SELECT * FROM cache.pmsi_expert_cache_rss_diagnostics_associes;
|
|
CREATE INDEX w_rss_diagnostics_associes_i1 ON w_rss_diagnostics_associes USING btree (rss_id);
|
|
CREATE INDEX w_rss_diagnostics_associes_i2 ON w_rss_diagnostics_associes USING btree (diagnostic_associe_code);
|
|
DROP TABLE IF EXISTS w_rss_actes;
|
|
CREATE TEMP TABLE w_rss_actes AS SELECT * FROM cache.pmsi_expert_cache_rss_actes;
|
|
CREATE INDEX w_rss_actes_i1 ON w_rss_actes USING btree (rss_id);
|
|
CREATE INDEX w_rss_actes_i2 ON w_rss_actes USING btree (acte_code);
|
|
DROP TABLE IF EXISTS w_rsf_detail;
|
|
CREATE TEMP TABLE w_rsf_detail AS SELECT * FROM cache.pmsi_expert_cache_rsf_detail;
|
|
CREATE INDEX w_rsf_detail_i1 ON w_rsf_detail USING btree (rss_id);
|
|
CREATE INDEX w_rsf_detail_i2 ON w_rsf_detail USING btree (presta_code);
|
|
DROP TABLE IF EXISTS w_rss_precedent;
|
|
CREATE TEMP TABLE w_rss_precedent AS SELECT * FROM cache.pmsi_expert_cache_rss_precedent;
|
|
END IF;
|
|
|
|
RAISE NOTICE '%','Tests DATIM';
|
|
|
|
-- Creation table de travail
|
|
DROP TABLE IF EXISTS temp.w_expert_rss_controle;
|
|
PERFORM base.cti_create_table_from('temp', 'w_expert_rss_controle', 'pmsi', 'p_expert_rss_controle');
|
|
CREATE INDEX i_expert_rss_controle_w1 ON temp.w_expert_rss_controle USING btree (rss_id);
|
|
-- Initialisation tables des regles
|
|
INSERT INTO pmsi.t_expert_controle_rule(controle_id, numero, sqlcmd_where, sqlcmd_justificatif)
|
|
SELECT
|
|
t_expert_controle.oid AS controle_id, 1::bigint AS numero, ''::text AS sqlcmd_where, ''::text AS sqlcmd_justificatif
|
|
FROM pmsi.t_expert_controle
|
|
LEFT JOIN pmsi.t_expert_controle_rule ON controle_id = t_expert_controle.oid
|
|
WHERE t_expert_controle_rule IS NULL;
|
|
ANALYSE w_rss;
|
|
|
|
-- Menage dans l'historique
|
|
DELETE FROM pmsi.p_expert_rss_controle
|
|
USING pmsi.t_divers
|
|
WHERE t_divers.code = 'EXPERT_DATE_DEBUT' AND
|
|
date_sortie <= t_divers.valeur_date AND
|
|
date_sortie < (date_trunc('year',now())-interval '1 year')
|
|
;
|
|
|
|
|
|
|
|
-- DEMARRAGE DES TESTS
|
|
RAISE NOTICE '%','Tests';
|
|
TRUNCATE temp.w_expert_rss_controle;
|
|
UPDATE pmsi.t_expert_controle_rule SET
|
|
last_execution_date = NULL,
|
|
last_execution_ok = '1'
|
|
WHERE (oid = i_controle_id OR i_controle_id IS NULL) AND
|
|
(last_execution_date IS DISTINCT FROM NULL OR
|
|
last_execution_ok IS DISTINCT FROM '1');
|
|
|
|
request := 'SELECT t_expert_controle.code, controle_id, t_expert_controle_rule.oid, sqlcmd_where, sqlcmd_justificatif
|
|
FROM pmsi.t_expert_controle_rule
|
|
JOIN pmsi.t_expert_controle ON t_expert_controle_rule.controle_id = t_expert_controle.oid
|
|
WHERE trim(sqlcmd_where) <> '''' AND is_global IS DISTINCT FROM ''1'' AND
|
|
(t_expert_controle.code = ''CTI007'' OR t_expert_controle.code <> ''CTI007'') ';
|
|
if (i_controle_id IS NOT NULL) THEN
|
|
request = request || ' AND t_expert_controle.oid = ' || i_controle_id;
|
|
END IF;
|
|
OPEN ref FOR
|
|
EXECUTE request;
|
|
LOOP
|
|
FETCH ref INTO _controle_code, _controle_id, _controle_rule_id, _sqlcmd_where, _sqlcmd_justificatif;
|
|
|
|
IF NOT FOUND THEN
|
|
EXIT;
|
|
END IF;
|
|
|
|
|
|
IF trim(_sqlcmd_justificatif) = '' THEN
|
|
_sqlcmd_justificatif = '''''';
|
|
END IF;
|
|
_sqlcmd_justificatif = replace(_sqlcmd_justificatif,'][',']||'', ''||[');
|
|
_sqlcmd_justificatif = replace(_sqlcmd_justificatif,'] [',']||'', ''||[');
|
|
|
|
|
|
|
|
_nb_rules = _nb_rules + 1;
|
|
-- Transformation raccourcis
|
|
_sqlcmd_new_where = _sqlcmd_where;
|
|
_subviews_count = 0;
|
|
-- Raccourcis sans valeur
|
|
_sqlcmd_new_where = replace(_sqlcmd_new_where,'[PMSI=0]','w_rss.ghm_id = 0');
|
|
_sqlcmd_new_where = replace(_sqlcmd_new_where,'[PMSI=1]','w_rss.ghm_id <> 0');
|
|
_sqlcmd_new_where = replace(_sqlcmd_new_where,'[ENCOURS=0]','w_rss.en_cours = ''0''');
|
|
_sqlcmd_new_where = replace(_sqlcmd_new_where,'[ENCOURS=1]','w_rss.en_cours <> ''0''');
|
|
-- Raccourcis avec valeurs saisies
|
|
_sqlcmd_new_where = replace(_sqlcmd_new_where,chr(9),' ');
|
|
_sqlcmd_new_where = replace(_sqlcmd_new_where,chr(10),' ');
|
|
_sqlcmd_new_where = replace(_sqlcmd_new_where,chr(13),' ');
|
|
_d = 1;
|
|
|
|
LOOP
|
|
RAISE NOTICE 'DEBUG %' , _sqlcmd_new_where;
|
|
RAISE NOTICE 'DEBUG %' , 'D='||_d::text;
|
|
-- Recherche chaine de controle
|
|
_p = position('[' IN substr(_sqlcmd_new_where,_d));
|
|
IF _p <= 0 THEN
|
|
EXIT;
|
|
END IF;
|
|
RAISE NOTICE 'DEBUG %' , 'P='||_p::text;
|
|
|
|
IF _p > 0 THEN
|
|
_p = _d + _p - 1;
|
|
_i = _p + 1;
|
|
_c = 1;
|
|
_f = 0;
|
|
<<test>>
|
|
LOOP
|
|
IF _i > length(_sqlcmd_new_where) THEN
|
|
EXIT;
|
|
END IF;
|
|
IF substr(_sqlcmd_new_where,_i,1) = '[' THEN
|
|
_c = _c + 1;
|
|
END IF;
|
|
IF substr(_sqlcmd_new_where,_i,1) = ']' THEN
|
|
_c = _c - 1;
|
|
END IF;
|
|
IF _c = 0 THEN
|
|
_f = _i;
|
|
EXIT test;
|
|
END IF;
|
|
_i = _i + 1;
|
|
END LOOP test;
|
|
|
|
|
|
--_f = position(']' IN substr(_sqlcmd_new_where,_p));
|
|
IF _f <= 0 THEN
|
|
EXIT;
|
|
END IF;
|
|
|
|
--_f = _p + _f - 1;
|
|
_l = _f - _p + 1;
|
|
_ctl_string = substr(_sqlcmd_new_where,_p+1,_l-2);
|
|
RAISE NOTICE 'DEBUG %' , _ctl_string;
|
|
_d = _f;
|
|
-- Recherche champ et valeurs
|
|
_ctl_field = '';
|
|
_ctl_operator = '';
|
|
_ctl_values = '';
|
|
_ctl_values_2 = '';
|
|
_x = 0;
|
|
_y = 0;
|
|
|
|
_e = 0;
|
|
_ctl_rule_i = 0;
|
|
|
|
WHILE _x < length(_ctl_string) LOOP
|
|
_x = _x + 1;
|
|
IF substr(_ctl_string,_x,1) ='&' THEN
|
|
_e = 0;
|
|
_ctl_field = '';
|
|
ELSE
|
|
IF substr(_ctl_string,_x,1) IN ('=','<','>') THEN
|
|
_ctl_rule_i = _ctl_rule_i + 1;
|
|
_ctl_rule_fields_array[_ctl_rule_i] = _ctl_field;
|
|
_ctl_rule_operators_array[_ctl_rule_i] = '';
|
|
_ctl_rule_values_array[_ctl_rule_i] = '';
|
|
IF substr(_ctl_string,_x+1,1) IN ('=','<','>') THEN
|
|
_ctl_rule_operators_array[_ctl_rule_i] = substr(_ctl_string,_x,2);
|
|
_x = _x + 1;
|
|
ELSE
|
|
_ctl_rule_operators_array[_ctl_rule_i] = substr(_ctl_string,_x,1);
|
|
END IF;
|
|
|
|
_ctl_values = '';
|
|
_e = 2;
|
|
ELSE
|
|
IF _e = 0 THEN
|
|
_ctl_field = _ctl_field || substr(_ctl_string,_x,1);
|
|
END IF;
|
|
IF _e = 2 THEN
|
|
_ctl_rule_values_array[_ctl_rule_i] = _ctl_rule_values_array[_ctl_rule_i] || substr(_ctl_string,_x,1);
|
|
END IF;
|
|
END IF;
|
|
END IF;
|
|
END LOOP;
|
|
|
|
|
|
_ctl_new_where = '';
|
|
_x = 0;
|
|
WHILE _x < _ctl_rule_i LOOP
|
|
_x = _x + 1;
|
|
_ctl_field = trim(_ctl_rule_fields_array[_x]);
|
|
_ctl_operator = trim(_ctl_rule_operators_array[_x]);
|
|
_ctl_operator_2 = _ctl_operator;
|
|
_ctl_values = trim(_ctl_rule_values_array[_x]);
|
|
_ctl_subview_operator = '>';
|
|
_ctl_subview_value = 0;
|
|
|
|
_ctl_field = trim(_ctl_field);
|
|
_ctl_field_key = '[' || _ctl_field || ']';
|
|
|
|
_ctl_fieldType = '';
|
|
_ctl_fieldDelimiter = '';
|
|
-- Forcer type de champ
|
|
IF _ctl_field IN ('MODENT','PROV', 'DEST','MODSOR', 'DEST', 'RETGRP', 'CMD', 'CCAM:activite', 'CCAM:phase')
|
|
THEN
|
|
_ctl_fieldType = 'text';
|
|
END IF;
|
|
|
|
|
|
IF _ctl_operator <> '' THEN
|
|
_ctl_operator_2 = '>';
|
|
|
|
-- Opérateur Spécial si diag ou actes
|
|
IF _ctl_field ILIKE 'DIAGA' OR _ctl_field ILIKE 'DIAGA:%' OR
|
|
_ctl_field ILIKE 'DIAGD' OR _ctl_field ILIKE 'DIAGD:%' OR
|
|
_ctl_field LIKE 'CCAM' OR _ctl_field LIKE 'CCAM%' THEN
|
|
IF _ctl_operator = '<>' AND _x = 1 THEN
|
|
_ctl_operator = '=';
|
|
_ctl_subview_operator = '=';
|
|
END IF;
|
|
END IF;
|
|
|
|
IF _ctl_values = '' THEN
|
|
_ctl_values = '#blanc';
|
|
END IF;
|
|
|
|
|
|
IF _ctl_values <> '' THEN
|
|
_ctl_values_array = string_to_array(_ctl_values,',');
|
|
-- Values = LISTE de GHM
|
|
_i = 1;
|
|
_ctl_new_where_un = '';
|
|
LOOP
|
|
IF _i > array_upper (_ctl_values_array, 1) THEN
|
|
EXIT;
|
|
END IF;
|
|
_ctl_value = _ctl_values_array[_i];
|
|
IF _ctl_value LIKE '{%' THEN
|
|
_ctl_list = replace(replace(_ctl_value, '{', ''),'}','');
|
|
IF _ctl_field LIKE 'GHM' THEN
|
|
_ctl_list_array =
|
|
(SELECT base.cti_array_accum(t_ghm.code)
|
|
FROM pmsi.t_listes
|
|
JOIN pmsi.t_listes_contenu ON liste_id = t_listes.oid
|
|
JOIN pmsi.t_ghm ON to_id = t_ghm.oid
|
|
WHERE t_listes.code = _ctl_list);
|
|
_ctl_values_array = array_cat(_ctl_values_array, _ctl_list_array);
|
|
ELSIF _ctl_field LIKE 'PRESTA' THEN
|
|
_ctl_list_array =
|
|
(SELECT base.cti_array_accum(t_prestations.code)
|
|
FROM pmsi.t_listes
|
|
JOIN pmsi.t_listes_contenu ON liste_id = t_listes.oid
|
|
JOIN pmsi.t_prestations ON to_id = t_prestations.oid
|
|
WHERE t_listes.code = _ctl_list);
|
|
_ctl_values_array = array_cat(_ctl_values_array, _ctl_list_array);
|
|
ELSIF _ctl_field LIKE 'GHS' THEN
|
|
_ctl_list_array =
|
|
(SELECT base.cti_array_accum(t_ghs.code::text)
|
|
FROM pmsi.t_listes
|
|
JOIN pmsi.t_listes_contenu ON liste_id = t_listes.oid
|
|
JOIN pmsi.t_ghs ON to_id = t_ghs.oid
|
|
WHERE t_listes.code = _ctl_list);
|
|
_ctl_values_array = array_cat(_ctl_values_array, _ctl_list_array);
|
|
ELSIF _ctl_field LIKE 'DIAG%' THEN
|
|
_ctl_list_array =
|
|
(SELECT base.cti_array_accum(t_diagnostics.code::text)
|
|
FROM pmsi.t_listes
|
|
JOIN pmsi.t_listes_contenu ON liste_id = t_listes.oid
|
|
JOIN pmsi.t_diagnostics ON to_id = t_diagnostics.oid
|
|
WHERE t_listes.code = _ctl_list);
|
|
_ctl_values_array = array_cat(_ctl_values_array, _ctl_list_array);
|
|
END IF;
|
|
END IF;
|
|
|
|
_i = _i + 1;
|
|
END LOOP;
|
|
-- Traduction values en LIKE
|
|
_i = 1;
|
|
_ctl_new_where_un = '';
|
|
LOOP
|
|
IF _i > array_upper (_ctl_values_array, 1) THEN
|
|
EXIT;
|
|
END IF;
|
|
_ctl_value = _ctl_values_array[_i];
|
|
|
|
IF _ctl_new_where_un <> '' THEN
|
|
IF _ctl_operator = 'ILIKE' OR _ctl_operator = '=' THEN
|
|
_ctl_new_where_un = _ctl_new_where_un || ' OR ';
|
|
ELSE
|
|
_ctl_new_where_un = _ctl_new_where_un || ' AND ';
|
|
END IF;
|
|
END IF;
|
|
|
|
_ctl_fieldDelimiter = '''';
|
|
|
|
IF (_ctl_value ~ '^([0-9,-,+]+[.]?[0-9]*|[.][0-9]+)$' AND _ctl_fieldType != 'text' OR
|
|
_ctl_value LIKE '[%'
|
|
) THEN
|
|
_ctl_fieldDelimiter = '';
|
|
ELSE
|
|
IF _ctl_operator = '=' THEN
|
|
_ctl_operator = 'ILIKE';
|
|
END IF;
|
|
IF _ctl_operator = '<>' THEN
|
|
_ctl_operator = 'NOT ILIKE';
|
|
END IF;
|
|
END IF;
|
|
IF _ctl_operator = 'ILIKE' OR _ctl_operator = 'NOT ILIKE' THEN
|
|
IF _ctl_value <> '#blanc' THEN
|
|
_ctl_value = replace(_ctl_value,'*','%');
|
|
ELSE
|
|
_ctl_value = '';
|
|
END IF;
|
|
END IF;
|
|
|
|
-- Clause where traduite
|
|
|
|
_ctl_new_where_un = _ctl_new_where_un || _ctl_field_key || ' ' || _ctl_operator || ' ' || _ctl_fieldDelimiter || _ctl_value || _ctl_fieldDelimiter;
|
|
|
|
|
|
_i = _i + 1;
|
|
END LOOP;
|
|
IF _ctl_field ILIKE '%COUNT' THEN
|
|
_ctl_new_where_un = '1 = 1';
|
|
_ctl_subview_operator = _ctl_operator;
|
|
_ctl_subview_value = _ctl_value;
|
|
END IF;
|
|
IF _ctl_new_where_un <> '1 = 1' OR _ctl_new_where = '' THEN
|
|
IF _ctl_new_where <> '' THEN
|
|
_ctl_new_where = _ctl_new_where || ' AND ';
|
|
END IF;
|
|
_ctl_new_where = _ctl_new_where || ' (' || _ctl_new_where_un || ') ';
|
|
END IF;
|
|
|
|
END IF;
|
|
END IF;
|
|
|
|
END LOOP;
|
|
_ctl_field = trim(_ctl_rule_fields_array[_x]);
|
|
_ctl_field_key = '[' || _ctl_field || ']';
|
|
IF _ctl_new_where <> '' THEN
|
|
|
|
-- sous requetes (Diagnostics Associes)
|
|
IF _ctl_field ILIKE 'DIAGA' OR _ctl_field ILIKE 'DIAGA:%' THEN
|
|
_subviews_count = _subviews_count + 1;
|
|
_subviews_key[_subviews_count] = _ctl_field_key;
|
|
_subviews[_subviews_count] =
|
|
'JOIN (SELECT w_rss.rss_id AS subview' || _subviews_count::text || '_rss_id,
|
|
COALESCE(count(w_rss_diagnostics_associes),0) AS subview' || _subviews_count::text || '_count,
|
|
COALESCE(base.cti_group_concat(DISTINCT diagnostic_associe_code),'''') AS subview' || _subviews_count::text || '_code
|
|
FROM w_rss
|
|
LEFT JOIN w_rss_diagnostics_associes ON w_rss.rss_id = w_rss_diagnostics_associes.rss_id AND
|
|
' || _ctl_new_where || '
|
|
GROUP BY 1
|
|
) subview' || _subviews_count::text || '
|
|
ON subview' || _subviews_count::text || '.subview' || _subviews_count::text || '_rss_id = w_rss.rss_id ';
|
|
-- Mots clés dans justificatif issus des sous requetes
|
|
_sqlcmd_justificatif = replace(_sqlcmd_justificatif, _ctl_field_key, '''DA:''||subview' || _subviews_count::text || '_code');
|
|
_sqlcmd_justificatif = replace(_sqlcmd_justificatif, '[' || _ctl_string || ']', '''DA:''||subview' || _subviews_count::text || '_code');
|
|
_sqlcmd_justificatif = replace(_sqlcmd_justificatif, '[DIAGA]', '''DA:''||subview' || _subviews_count::text || '_code');
|
|
_ctl_field_key = 'subview' || _subviews_count::text || '_count';
|
|
_ctl_operator = _ctl_subview_operator;
|
|
_ctl_fieldDelimiter = '';
|
|
_ctl_value = _ctl_subview_value;
|
|
_ctl_new_where = '(' || _ctl_field_key || ' ' || _ctl_operator || ' ' || _ctl_value || ')';
|
|
END IF;
|
|
-- sous requetes (Diagnostics Documentaires)
|
|
IF _ctl_field ILIKE 'DIAGD' OR _ctl_field ILIKE 'DIAGD:%' THEN
|
|
_subviews_count = _subviews_count + 1;
|
|
_subviews_key[_subviews_count] = _ctl_field_key;
|
|
_subviews[_subviews_count] =
|
|
'JOIN (SELECT w_rss.rss_id AS subview' || _subviews_count::text || '_rss_id,
|
|
COALESCE(count(w_rss_diagnostics_documentaires),0) AS subview' || _subviews_count::text || '_count,
|
|
COALESCE(base.cti_group_concat(DISTINCT diagnostic_documentaire_code),'''') AS subview' || _subviews_count::text || '_code
|
|
FROM w_rss
|
|
LEFT JOIN w_rss_diagnostics_documentaires ON w_rss.rss_id = w_rss_diagnostics_documentaires.rss_id AND
|
|
' || _ctl_new_where || '
|
|
GROUP BY 1
|
|
) subview' || _subviews_count::text || '
|
|
ON subview' || _subviews_count::text || '.subview' || _subviews_count::text || '_rss_id = w_rss.rss_id ';
|
|
-- Mots clés dans justificatif issus des sous requetes
|
|
_sqlcmd_justificatif = replace(_sqlcmd_justificatif, _ctl_field_key, '''DD:''||subview' || _subviews_count::text || '_code');
|
|
_sqlcmd_justificatif = replace(_sqlcmd_justificatif, '[' || _ctl_string || ']', '''DD:''||subview' || _subviews_count::text || '_code');
|
|
_sqlcmd_justificatif = replace(_sqlcmd_justificatif, '[DIAGD]', '''DD:''||subview' || _subviews_count::text || '_code');
|
|
_ctl_field_key = 'subview' || _subviews_count::text || '_count';
|
|
_ctl_operator = _ctl_subview_operator;
|
|
_ctl_fieldDelimiter = '';
|
|
_ctl_value = _ctl_subview_value;
|
|
_ctl_new_where = '(' || _ctl_field_key || ' ' || _ctl_operator || ' ' || _ctl_value || ')';
|
|
END IF;
|
|
-- sous requetes (Actes)
|
|
IF _ctl_field LIKE 'CCAM' OR _ctl_field LIKE 'CCAM%' THEN
|
|
_subviews_count = _subviews_count + 1;
|
|
_subviews_key[_subviews_count] = _ctl_field_key;
|
|
_subviews[_subviews_count] =
|
|
'JOIN (SELECT w_rss.rss_id AS subview' || _subviews_count::text || '_rss_id,
|
|
COALESCE(SUM(w_rss_actes.acte_nombre),0) AS subview' || _subviews_count::text || '_count,
|
|
COALESCE(base.cti_group_concat(DISTINCT acte_code),'''') AS subview' || _subviews_count::text || '_code
|
|
FROM w_rss
|
|
LEFT JOIN w_rss_actes ON w_rss.rss_id = w_rss_actes.rss_id WHERE
|
|
' || _ctl_new_where || '
|
|
GROUP BY 1
|
|
) subview' || _subviews_count::text || '
|
|
ON subview' || _subviews_count::text || '.subview' || _subviews_count::text || '_rss_id = w_rss.rss_id ';
|
|
-- Mots clés dans justificatif issus des sous requetes
|
|
_sqlcmd_justificatif = replace(_sqlcmd_justificatif, _ctl_field_key, '''CCAM:''||subview' || _subviews_count::text || '_code');
|
|
_sqlcmd_justificatif = replace(_sqlcmd_justificatif, '[' || _ctl_string || ']', '''CCAM:''||subview' || _subviews_count::text || '_code');
|
|
_sqlcmd_justificatif = replace(_sqlcmd_justificatif, '[CCAM]', '''CCAM:''||subview' || _subviews_count::text || '_code');
|
|
|
|
_ctl_field_key = 'subview' || _subviews_count::text || '_count';
|
|
_ctl_operator = _ctl_subview_operator;
|
|
_ctl_fieldDelimiter = '';
|
|
_ctl_value = _ctl_subview_value;
|
|
_ctl_new_where = '(' || _ctl_field_key || ' ' || _ctl_operator || ' ' || _ctl_value || ')';
|
|
END IF;
|
|
|
|
-- sous requetes (Mères)
|
|
IF _ctl_field ILIKE 'MERE_CCAM' OR _ctl_field ILIKE 'MERE_CCAM:%' THEN
|
|
_subviews_count = _subviews_count + 1;
|
|
_subviews_key[_subviews_count] = _ctl_field_key;
|
|
_subviews[_subviews_count] =
|
|
'JOIN (SELECT w_rss.rss_id AS subview' || _subviews_count::text || '_rss_id,
|
|
COALESCE(SUM(w_rss_actes.acte_nombre),0) AS subview' || _subviews_count::text || '_count,
|
|
COALESCE(base.cti_group_concat(DISTINCT acte_code) || '','','''') AS subview' || _subviews_count::text || '_code
|
|
FROM w_rss
|
|
LEFT JOIN w_rss_actes ON w_rss.rss_id = w_rss_actes.rss_id WHERE
|
|
' || _ctl_new_where || '
|
|
GROUP BY 1
|
|
) subview' || _subviews_count::text || '
|
|
ON w_rss.rss_mere_id <> 0 AND subview' || _subviews_count::text || '.subview' || _subviews_count::text || '_rss_id = w_rss.rss_mere_id ';
|
|
-- Mots clés dans justificatif issus des sous requetes
|
|
_sqlcmd_justificatif = replace(_sqlcmd_justificatif, _ctl_field_key, '''CCAM:''||subview' || _subviews_count::text || '_code');
|
|
_sqlcmd_justificatif = replace(_sqlcmd_justificatif, '[' || _ctl_string || ']', '''CCAM:''||subview' || _subviews_count::text || '_code');
|
|
_sqlcmd_justificatif = replace(_sqlcmd_justificatif, '[MERE_CCAM]', '''CCAM:''||subview' || _subviews_count::text || '_code');
|
|
|
|
_ctl_field_key = 'subview' || _subviews_count::text || '_count';
|
|
_ctl_operator = _ctl_subview_operator;
|
|
_ctl_fieldDelimiter = '';
|
|
_ctl_value = _ctl_subview_value;
|
|
_ctl_new_where = '(' || _ctl_field_key || ' ' || _ctl_operator || ' ' || _ctl_value || ')';
|
|
END IF;
|
|
-- sous requetes (prestations)
|
|
IF _ctl_field ILIKE 'PRESTA' OR _ctl_field ILIKE 'PRESTA:%' THEN
|
|
_subviews_count = _subviews_count + 1;
|
|
_subviews_key[_subviews_count] = _ctl_field_key;
|
|
_subviews[_subviews_count] =
|
|
'JOIN (SELECT w_rss.rss_id AS subview' || _subviews_count::text || '_rss_id,
|
|
COALESCE(SUM(w_rsf_detail.presta_nombre),0) AS subview' || _subviews_count::text || '_count,
|
|
COALESCE(base.cti_group_concat(DISTINCT presta_code),'''') AS subview' || _subviews_count::text || '_code
|
|
FROM w_rss
|
|
LEFT JOIN w_rsf_detail ON w_rss.rss_id = w_rsf_detail.rss_id AND
|
|
' || _ctl_new_where || '
|
|
GROUP BY 1
|
|
) subview' || _subviews_count::text || '
|
|
ON subview' || _subviews_count::text || '.subview' || _subviews_count::text || '_rss_id = w_rss.rss_id ';
|
|
-- Mots clés dans justificatif issus des sous requetes
|
|
_sqlcmd_justificatif = replace(_sqlcmd_justificatif, _ctl_field_key, '''PRESTA:''||subview' || _subviews_count::text || '_code');
|
|
_sqlcmd_justificatif = replace(_sqlcmd_justificatif, '[' || _ctl_string || ']', '''PRESTA''||subview' || _subviews_count::text || '_code');
|
|
_sqlcmd_justificatif = replace(_sqlcmd_justificatif, '[PRESTA]', '''PRESTA:''||subview' || _subviews_count::text || '_code');
|
|
|
|
_ctl_field_key = 'subview' || _subviews_count::text || '_count';
|
|
_ctl_operator = _ctl_subview_operator;
|
|
_ctl_fieldDelimiter = '';
|
|
_ctl_value = _ctl_subview_value;
|
|
_ctl_new_where = '(' || _ctl_field_key || ' ' || _ctl_operator || ' ' || _ctl_value || ')';
|
|
END IF;
|
|
|
|
|
|
|
|
_sqlcmd_new_where = overlay(_sqlcmd_new_where placing _ctl_new_where from _p for _l);
|
|
_d = _p + length(_ctl_new_where);
|
|
|
|
END IF;
|
|
END IF;
|
|
END LOOP;
|
|
-- Sous requete patient précédent
|
|
IF _sqlcmd_new_where ILIKE '%[PREC:%' THEN
|
|
_subviews_count = _subviews_count + 1;
|
|
_subviews[_subviews_count] = 'LEFT JOIN w_rss w_rss_precedent ON w_rss.sejour_precedent_rss_id = w_rss_precedent.oid';
|
|
END IF;
|
|
|
|
-- Remplacement clés dans clause WHERE
|
|
_sqlcmd_new_where = pmsi.cti_expert_execute_rules_keys(_sqlcmd_new_where, 'where');
|
|
|
|
-- Mots clés restant dans justificatif
|
|
_sqlcmd_justificatif = pmsi.cti_expert_execute_rules_keys(_sqlcmd_justificatif, 'justificatif');
|
|
|
|
|
|
|
|
|
|
-- Execution
|
|
_sqlcmd_insert = 'INSERT INTO temp.w_expert_rss_controle(rss_id, controle_id, code_justificatif)
|
|
SELECT
|
|
w_rss.oid,
|
|
' || _controle_id || ', ' ||
|
|
_sqlcmd_justificatif || '
|
|
FROM
|
|
w_rss
|
|
';
|
|
|
|
|
|
IF _subviews_count > 0 THEN
|
|
FOR _i IN 1.._subviews_count LOOP
|
|
_subviews[_i] = pmsi.cti_expert_execute_rules_keys(_subviews[_i], 'where');
|
|
_sqlcmd_insert = _sqlcmd_insert || '
|
|
' || _subviews[_i];
|
|
END LOOP;
|
|
|
|
|
|
END IF;
|
|
|
|
|
|
_sqlcmd_insert = _sqlcmd_insert || ' WHERE ' || _sqlcmd_new_where;
|
|
_last_execution_ok = '1';
|
|
RAISE NOTICE 'DEBUG %' , _sqlcmd_insert;
|
|
BEGIN
|
|
EXECUTE _sqlcmd_insert;
|
|
EXCEPTION
|
|
WHEN others THEN RAISE NOTICE 'Erreur %' , _sqlcmd_insert;
|
|
_nb_rules_error = _nb_rules_error + 1;
|
|
_last_execution_ok = '0';
|
|
END;
|
|
UPDATE pmsi.t_expert_controle_rule SET
|
|
last_execution_date = now(),
|
|
last_execution_ok = _last_execution_ok
|
|
WHERE oid = _controle_rule_id;
|
|
END LOOP;
|
|
CLOSE ref;
|
|
-- VALIDATION
|
|
RAISE NOTICE '%','Validation';
|
|
|
|
-- TRAITEMENTS DE FIN
|
|
-- Génération des controles avec suffixe (désactivé)
|
|
IF 1 <> 1 THEN
|
|
INSERT INTO pmsi.t_expert_controle
|
|
(code,
|
|
texte,
|
|
texte,
|
|
texte_court,
|
|
is_datim,
|
|
code_datim,
|
|
date_validite_debut,
|
|
date_validite_fin,
|
|
section_id,
|
|
section_code,
|
|
section_texte)
|
|
SELECT
|
|
t_expert_controle.code || '_' || code_groupe,
|
|
t_expert_controle.texte || ' (' || code_groupe || ')',
|
|
t_expert_controle.texte_court || ' (' || code_groupe || ')',
|
|
t_expert_controle.is_datim,
|
|
t_expert_controle.code_datim,
|
|
t_expert_controle.date_validite_debut,
|
|
t_expert_controle.date_validite_fin,
|
|
t_expert_controle.section_id,
|
|
t_expert_controle.section_code,
|
|
t_expert_controle.section_texte
|
|
FROM temp.w_expert_rss_controle
|
|
JOIN pmsi.t_expert_controle ON controle_id = t_expert_controle.oid
|
|
LEFT JOIN pmsi.t_expert_controle t_expert_controle_groupe ON t_expert_controle_groupe.code = t_expert_controle.code || '_' || code_groupe
|
|
WHERE code_groupe <> '' AND t_expert_controle_groupe.oid IS NULL
|
|
GROUP BY 1,2,3,4,5,6,7,8,9,10;
|
|
UPDATE temp.w_expert_rss_controle
|
|
SET controle_id = t_expert_controle_groupe.oid
|
|
FROM pmsi.t_expert_controle,
|
|
pmsi.t_expert_controle t_expert_controle_groupe
|
|
WHERE controle_id = t_expert_controle.oid AND
|
|
t_expert_controle_groupe.code = t_expert_controle.code || '_' || code_groupe AND
|
|
code_groupe <> '' AND controle_id IS DISTINCT FROM t_expert_controle_groupe.oid;
|
|
END IF;
|
|
|
|
-- Actualisation rss_id
|
|
UPDATE pmsi.p_expert_rss_controle
|
|
SET rss_id = p_rss.oid
|
|
FROM pmsi.p_rss
|
|
WHERE p_rss.no_rss = p_expert_rss_controle.no_rss AND
|
|
p_rss.date_sortie = p_expert_rss_controle.date_sortie AND
|
|
p_expert_rss_controle.rss_id IS DISTINCT FROM p_rss.oid;
|
|
-- mise à jour justificatif sur atypies déjà signalées
|
|
UPDATE pmsi.p_expert_rss_controle SET
|
|
code_justificatif = w_expert_rss_controle.code_justificatif,
|
|
etat = CASE WHEN p_expert_rss_controle.etat = 'T' THEN '' ELSE p_expert_rss_controle.etat END,
|
|
date_signalement = CASE WHEN p_expert_rss_controle.etat = 'T' THEN date(now()) ELSE p_expert_rss_controle.date_signalement END,
|
|
date_correction = CASE WHEN p_expert_rss_controle.etat = '' THEN '20991231' ELSE p_expert_rss_controle.date_correction END
|
|
FROM temp.w_expert_rss_controle
|
|
WHERE w_expert_rss_controle.rss_id = p_expert_rss_controle.rss_id AND
|
|
w_expert_rss_controle.controle_id = p_expert_rss_controle.controle_id AND
|
|
(
|
|
p_expert_rss_controle.code_justificatif IS DISTINCT FROM w_expert_rss_controle.code_justificatif OR
|
|
p_expert_rss_controle.etat = 'T' OR
|
|
p_expert_rss_controle.date_correction IS DISTINCT FROM '20991231'
|
|
);
|
|
-- Pointage des atypies résolues
|
|
UPDATE pmsi.p_expert_rss_controle
|
|
SET etat = 'T',
|
|
date_correction = date(now())
|
|
FROM
|
|
(
|
|
SELECT
|
|
p_expert_rss_controle.rss_id,
|
|
p_expert_rss_controle.controle_id
|
|
FROM pmsi.p_expert_rss_controle
|
|
LEFT JOIN temp.w_expert_rss_controle ON w_expert_rss_controle.rss_id = p_expert_rss_controle.rss_id AND
|
|
w_expert_rss_controle.controle_id = p_expert_rss_controle.controle_id
|
|
WHERE p_expert_rss_controle.date_sortie >= _EXPERT_DATE_DEBUT AND
|
|
w_expert_rss_controle.rss_id IS NULL
|
|
) subview
|
|
WHERE subview.rss_id = p_expert_rss_controle.rss_id AND
|
|
subview.controle_id = p_expert_rss_controle.controle_id AND
|
|
(p_expert_rss_controle.controle_id = i_controle_id OR i_controle_id IS NULL) AND
|
|
(p_expert_rss_controle.etat IN ('','I') OR
|
|
p_expert_rss_controle.etat IN ('T') AND p_expert_rss_controle.date_correction > date(now()) OR
|
|
p_expert_rss_controle.etat IN ('T') AND p_expert_rss_controle.date_correction IS NULL
|
|
);
|
|
-- Pointage comme ignoré des erreurs non corrigées avant le changement de date début
|
|
UPDATE pmsi.p_expert_rss_controle
|
|
SET etat = 'I',
|
|
date_correction = date(now())
|
|
FROM
|
|
(
|
|
SELECT
|
|
p_expert_rss_controle.rss_id,
|
|
p_expert_rss_controle.controle_id
|
|
FROM pmsi.p_expert_rss_controle
|
|
LEFT JOIN temp.w_expert_rss_controle ON w_expert_rss_controle.rss_id = p_expert_rss_controle.rss_id AND
|
|
w_expert_rss_controle.controle_id = p_expert_rss_controle.controle_id
|
|
WHERE p_expert_rss_controle.date_sortie < _EXPERT_DATE_DEBUT AND
|
|
w_expert_rss_controle.rss_id IS NULL
|
|
) subview
|
|
WHERE subview.rss_id = p_expert_rss_controle.rss_id AND
|
|
subview.controle_id = p_expert_rss_controle.controle_id AND
|
|
(p_expert_rss_controle.controle_id = i_controle_id OR i_controle_id IS NULL) AND
|
|
p_expert_rss_controle.etat = '';
|
|
-- Ajout nouvelles atypies
|
|
INSERT INTO pmsi.p_expert_rss_controle (
|
|
rss_id,
|
|
no_rss,
|
|
date_sortie,
|
|
controle_id,
|
|
date_signalement,
|
|
no_test_datim,
|
|
nb_rss,
|
|
code_groupe,
|
|
code_justificatif,
|
|
cumul_base,
|
|
coefficient_attendu,
|
|
cumul_realise,
|
|
cumul_attendu,
|
|
borne_alerte,
|
|
etat,
|
|
date_correction
|
|
)
|
|
SELECT
|
|
w_expert_rss_controle.rss_id,
|
|
p_rss.no_rss,
|
|
p_rss.date_sortie,
|
|
w_expert_rss_controle.controle_id,
|
|
date(now()) AS date_signalement,
|
|
w_expert_rss_controle.no_test_datim,
|
|
w_expert_rss_controle.nb_rss,
|
|
w_expert_rss_controle.code_groupe,
|
|
w_expert_rss_controle.code_justificatif,
|
|
w_expert_rss_controle.cumul_base,
|
|
w_expert_rss_controle.coefficient_attendu,
|
|
w_expert_rss_controle.cumul_realise,
|
|
w_expert_rss_controle.cumul_attendu,
|
|
w_expert_rss_controle.borne_alerte,
|
|
w_expert_rss_controle.etat,
|
|
'20991231'
|
|
FROM temp.w_expert_rss_controle
|
|
JOIN pmsi.p_rss ON w_expert_rss_controle.rss_id = p_rss.oid
|
|
LEFT JOIN pmsi.p_expert_rss_controle ON w_expert_rss_controle.rss_id = p_expert_rss_controle.rss_id AND
|
|
w_expert_rss_controle.controle_id = p_expert_rss_controle.controle_id
|
|
WHERE p_expert_rss_controle.rss_id IS NULL
|
|
GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15;
|
|
|
|
-- Garde une seule ligne (celle avec la date_signalement la plus ancienne)
|
|
DELETE FROM pmsi.p_expert_rss_controle
|
|
USING
|
|
(
|
|
SELECT rss_id,
|
|
no_rss,
|
|
controle_id,
|
|
etat,
|
|
date_correction,
|
|
(MIN(ARRAY[date_signalement::text,CTID::text]))[2] AS keepCTID
|
|
FROM pmsi.p_expert_rss_controle
|
|
GROUP BY 1,2,3,4,5
|
|
HAVING count(*) > 1
|
|
) subview
|
|
WHERE p_expert_rss_controle.rss_id = subview.rss_id AND
|
|
p_expert_rss_controle.no_rss = subview.no_rss AND
|
|
p_expert_rss_controle.controle_id = subview.controle_id AND
|
|
p_expert_rss_controle.etat = subview.etat AND
|
|
p_expert_rss_controle.date_correction = subview.date_correction AND
|
|
p_expert_rss_controle.CTID::text <> keepCTID;
|
|
|
|
ANALYSE pmsi.p_expert_rss_controle;
|
|
|
|
IF _nb_rules_error > 0 THEN
|
|
RETURN 'KO:' || _nb_rules || ' règles exécutées, ' || _nb_rules_error::text || ' erreur(s) SQL';
|
|
END IF;
|
|
RETURN 'OK:' || _nb_rules || ' règles exécutées sans erreur';
|
|
END;
|