return: text lang: plpgsql src: | DECLARE _nb_services_absence numeric; BEGIN -- Ajout de colonnes dans les tables pour compatibilite descendante IF NOT EXISTS ( SELECT column_name FROM information_schema.columns WHERE table_schema || '.' || table_name = 'activite.p_mouvements_sejour' AND column_name = 'equivalent_malade_complet') THEN ALTER TABLE activite.p_mouvements_sejour ADD COLUMN equivalent_malade_complet numeric DEFAULT 0; END IF; IF NOT EXISTS ( SELECT column_name FROM information_schema.columns WHERE table_schema || '.' || table_name = 'activite.p_mouvements_sejour' AND column_name = 'nb_jour_sejour_sorti') THEN ALTER TABLE activite.p_mouvements_sejour ADD COLUMN nb_jour_sejour_sorti integer DEFAULT 0; END IF; IF NOT EXISTS ( SELECT column_name FROM information_schema.columns WHERE table_schema || '.' || table_name = 'activite.p_mouvements_sejour' AND column_name = 'nb_seances_chimio') THEN ALTER TABLE activite.p_mouvements_sejour ADD COLUMN nb_seances_chimio integer DEFAULT 0; END IF; IF NOT EXISTS ( SELECT column_name FROM information_schema.columns WHERE table_schema || '.' || table_name = 'activite.p_mouvements_sejour' AND column_name = 'nb_seances_dialyse') THEN ALTER TABLE activite.p_mouvements_sejour ADD COLUMN nb_seances_dialyse integer DEFAULT 0; END IF; IF NOT EXISTS ( SELECT column_name FROM information_schema.columns WHERE table_schema || '.' || table_name = 'activite.p_mouvements_sejour' AND column_name = 'nb_seances_autre') THEN ALTER TABLE activite.p_mouvements_sejour ADD COLUMN nb_seances_autre integer DEFAULT 0; END IF; IF NOT EXISTS ( SELECT column_name FROM information_schema.columns WHERE table_schema || '.' || table_name = 'activite.p_mouvements_sejour' AND column_name = 'nb_seances_chimio') THEN ALTER TABLE activite.p_mouvements_sejour ADD COLUMN nb_seances_chimio integer DEFAULT 0; END IF; IF NOT EXISTS ( SELECT column_name FROM information_schema.columns WHERE table_schema || '.' || table_name = 'activite.p_mouvements_sejour' AND column_name = 'nb_deces') THEN ALTER TABLE activite.p_mouvements_sejour ADD COLUMN nb_deces integer DEFAULT 0; END IF; IF NOT EXISTS ( SELECT column_name FROM information_schema.columns WHERE table_schema || '.' || table_name = 'activite.t_etages' AND column_name = 'est_urgence') THEN ALTER TABLE activite.t_etages ADD COLUMN est_urgence text DEFAULT ''; END IF; IF NOT EXISTS ( SELECT column_name FROM information_schema.columns WHERE table_schema || '.' || table_name = 'activite.t_services_facturation' AND column_name = 'mode_calcul_journees') THEN ALTER TABLE activite.t_services_facturation ADD COLUMN mode_calcul_journees text DEFAULT ''; END IF; -- Paramétrage -- Par défaut, On ne compte pas le jour de sortie sauf les hospits où DE = DS INSERT INTO activite.t_divers (code, texte, valeur, description, valeur2) SELECT 'OPTADM_DAYOUT'::text, 'Activite : Comptabilisation du jour de sortie'::text, '0'::text, '0=JS non inclus sauf DE=DS | 1=JS non inclus | 2=JS inclus'::text, 'Jour de sortie non inclus sauf hospitalisés avec DE=DS'::text WHERE 'OPTADM_DAYOUT'::text NOT IN (SELECT code FROM activite.t_divers) ; -- Par défaut, l'hospit complète génère un EMC par séjour INSERT INTO activite.t_divers (code, texte, valeur, description, valeur2) SELECT 'EMCHCSSRPSY'::text, 'Mode génération EMC HC SSR ou PSY'::text, '0'::text, '0=1 EMC par séjour, 1=1 EMC par semaine'::text, 'Jour de sortie non inclus sauf hospitalisés avec DE=DS'::text WHERE 'EMCHCSSRPSY'::text NOT IN (SELECT code FROM activite.t_divers) ; -- Par défaut, On conserve les séances en hospit INSERT INTO activite.t_divers (code, texte, valeur, description, valeur2) SELECT 'SEANCEHOSPIT'::text, 'Traitement des séances en hospit'::text, '1'::text, '1=Conserver les séances en hospit, 2=Ne conserver que les séances de dialyse, 0=Pas de séance en hospit'::text, ''::text WHERE 'SEANCEHOSPIT'::text NOT IN (SELECT code FROM activite.t_divers) ; UPDATE activite.t_divers SET description = '1=Conserver les séances en hospit, 2=Ne conserver que les séances de dialyse, 0=Pas de séance en hospit' WHERE code = 'SEANCEHOSPIT' AND description <> '1=Conserver les séances en hospit, 2=Ne conserver que les séances de dialyse, 0=Pas de séance en hospit' ; -- Désactivation index RAISE NOTICE '%' , 'Desactivation index'; PERFORM base.cti_stash_table_indexes('activite.p_mouvements_sejour'); RAISE NOTICE '%' , 'Extraction des mouvements'; DROP TABLE IF EXISTS w_mvt; CREATE TEMP TABLE w_mvt AS SELECT * FROM activite.p_mouvements_sejour; CREATE INDEX w_mvt_i1 ON w_mvt USING btree (no_sejour); CREATE INDEX w_mvt_i2 ON w_mvt USING btree (lieu_id); -- Table des services associéss aux lieux DROP TABLE IF EXISTS w_lieux_etendus; CREATE TEMP TABLE w_lieux_etendus AS SELECT t_lieux.*, t_lits.etage_id, CASE WHEN COALESCE(t_services_facturation.mode_calcul_journees,'') <> '' THEN t_services_facturation.mode_calcul_journees ELSE t_divers_dayout.valeur END AS service_mode_calcul_journees, t_services_facturation.est_absence AS service_est_absence, t_services_facturation.type_sejour AS service_type_sejour, t_services_facturation.type_t2a AS service_type_t2a, t_lits.chambre_particuliere AS lit_chambre_particuliere, t_etages.est_urgence AS etage_est_urgence, t_modes_traitement.code AS mode_traitement_code, t_dmt.code AS dmt_code FROM activite.t_lieux JOIN activite.t_services_facturation On service_facturation_id = t_services_facturation.oid JOIN activite.t_lits ON lit_id = t_lits.oid JOIN activite.t_etages ON t_lits.etage_id = t_etages.oid JOIN base.t_modes_traitement ON t_modes_traitement.oid = t_services_facturation.mode_traitement_id JOIN base.t_dmt on dmt_id = t_dmt.oid JOIN activite.t_divers t_divers_dayout ON t_divers_dayout.code = 'OPTADM_DAYOUT' ; CREATE INDEX w_lieux_etendus_i1 ON w_lieux_etendus USING btree (oid); ANALYSE w_lieux_etendus ; -- Correction heure sortie dans mouvements UPDATE activite.p_sejours SET heure_sortie = (substr(to_char(heure_sortie,'FM000000'),1,2) || '59' || substr(to_char(heure_sortie,'FM000000'),5,2))::numeric WHERE substr(to_char(heure_sortie,'FM000000'),3,2) > '59' ; UPDATE activite.p_sejours SET heure_sortie = 240000 WHERE heure_sortie > 240000 ; UPDATE w_mvt p_mouvements_sejour SET heure_fin = p_sejours.heure_sortie FROM activite.p_sejours WHERE p_sejours.no_sejour = p_mouvements_sejour.no_sejour AND p_mouvements_sejour.nb_sorties_directes = 1 AND p_mouvements_sejour.date = p_sejours.date_sortie AND p_mouvements_sejour.heure_fin <> p_sejours.heure_sortie AND p_sejours.code_sorti = '1' AND p_sejours.type_sejour = '1' AND p_sejours.heure_sortie >= p_mouvements_sejour.heure_debut ; UPDATE w_mvt p_mouvements_sejour SET heure_fin = p_sejours.heure_sortie FROM activite.p_sejours WHERE p_sejours.no_sejour = p_mouvements_sejour.no_sejour AND p_mouvements_sejour.nb_ambulatoires = 1 AND p_mouvements_sejour.date = p_sejours.date_sortie AND p_mouvements_sejour.heure_fin <> p_sejours.heure_sortie AND p_sejours.code_sorti = '1' AND p_sejours.type_sejour IN ('2') AND p_sejours.heure_sortie >= p_mouvements_sejour.heure_debut ; UPDATE w_mvt p_mouvements_sejour SET heure_fin = p_sejours.heure_sortie FROM activite.p_sejours WHERE p_sejours.no_sejour = p_mouvements_sejour.no_sejour AND p_mouvements_sejour.nb_externes = 1 AND p_mouvements_sejour.date = p_sejours.date_sortie AND p_mouvements_sejour.heure_fin <> p_sejours.heure_sortie AND p_sejours.code_sorti = '1' AND p_sejours.type_sejour IN ('3') AND p_sejours.heure_sortie >= p_mouvements_sejour.heure_debut ; -- Correction mouvements pour jour de sortie HDJ HM UPDATE w_mvt p_mouvements_sejour SET est_jour_sortie = '1' FROM activite.p_sejours WHERE p_mouvements_sejour.no_sejour = p_sejours.no_sejour AND p_sejours.code_sorti = '1' AND p_sejours.type_sejour = '1' AND p_mouvements_sejour.date = p_sejours.date_sortie AND p_mouvements_sejour.est_jour_sortie <> '1' ; DROP TABLE IF EXISTS w_correction_hdj; CREATE TEMP TABLE w_correction_hdj AS SELECT p_mouvements_sejour.no_sejour, p_mouvements_sejour.date, p_mouvements_sejour.heure_debut, p_mouvements_sejour.heure_fin, MAX(p_mouvements_sejour2.heure_debut) AS heure_debut2, (MAX(Array[p_mouvements_sejour2.heure_debut, p_mouvements_sejour2.lieu_id]))[2]::bigint AS lieu_id2 FROM w_mvt p_mouvements_sejour JOIN w_mvt p_mouvements_sejour2 ON p_mouvements_sejour.no_sejour = p_mouvements_sejour2.no_sejour AND p_mouvements_sejour.date = p_mouvements_sejour2.date AND p_mouvements_sejour.heure_debut > p_mouvements_sejour2.heure_fin WHERE p_mouvements_sejour.est_jour_hospitalisation = '0' AND p_mouvements_sejour2.est_jour_hospitalisation = '1' AND p_mouvements_sejour.nb_sorties_directes = 1 AND p_mouvements_sejour2.nb_sorties_directes = 0 GROUP BY 1,2,3,4 HAVING (MAX(Array[p_mouvements_sejour2.heure_debut,p_mouvements_sejour2.lieu_id]))[2]::bigint = MAX(p_mouvements_sejour.lieu_id) ; UPDATE w_mvt p_mouvements_sejour SET est_jour_hospitalisation = '1', est_dernier_mouvement_jour = '1' FROM w_correction_hdj WHERE p_mouvements_sejour.no_sejour = w_correction_hdj.no_sejour AND p_mouvements_sejour.date = w_correction_hdj.date AND p_mouvements_sejour.heure_debut = w_correction_hdj.heure_debut ; UPDATE w_mvt p_mouvements_sejour SET est_dernier_mouvement_jour = '0' FROM w_correction_hdj WHERE p_mouvements_sejour.no_sejour = w_correction_hdj.no_sejour AND p_mouvements_sejour.date = w_correction_hdj.date AND p_mouvements_sejour.heure_debut = w_correction_hdj.heure_debut2 AND est_dernier_mouvement_jour = '1' ; -- Stockage des décés UPDATE w_mvt p_mouvements_sejour SET nb_deces = 1 FROM activite.p_sejours WHERE p_sejours.no_sejour = p_mouvements_sejour.no_sejour AND p_sejours.date_sortie = p_mouvements_sejour.date AND p_sejours.heure_sortie = p_mouvements_sejour.heure_fin AND p_sejours.code_sorti = '1' AND p_sejours.mode_sortie = '9' ; -- Traitement des séances qui n'en sont pas (cas du mode generation service = 0sauf5 UPDATE w_mvt p_mouvements_sejour SET nb_seances = 0, nb_ambulatoires = 1 FROM activite.p_sejours, w_lieux_etendus t_lieux WHERE p_mouvements_sejour.no_sejour = p_sejours.no_sejour AND date_entree = date_sortie AND lieu_id = t_lieux.oid AND p_sejours.type_sejour = '5' AND service_type_sejour = '0sauf5' AND nb_seances <> 0 ; UPDATE activite.p_sejours SET type_sejour = '2' FROM w_lieux_etendus t_lieux WHERE lieu_sortie_id = t_lieux.oid AND date_entree = date_sortie AND p_sejours.type_sejour = '5' AND service_type_sejour = '0sauf5' ; -- Normalement, une seule séance par jour UPDATE w_mvt p_mouvements_sejour SET nb_seances = 1 WHERE nb_seances > 1; UPDATE w_mvt p_mouvements_sejour SET nb_seances = 0 FROM ( SELECT w_mvt.no_sejour, w_mvt.date, min(w_mvt.heure_debut) AS heure_seance FROM w_mvt JOIN activite.p_sejours ON w_mvt.no_sejour = p_sejours.no_sejour JOIN base.t_ghm ON p_sejours.ghm_id = t_ghm.oid WHERE nb_seances > 0 AND t_ghm.code <> '28Z04Z' GROUP BY 1,2 HAVING SUM(nb_seances) > 1 ) subview WHERE p_mouvements_sejour.no_sejour = subview.no_sejour AND p_mouvements_sejour.date = subview.date AND p_mouvements_sejour.heure_debut <> heure_seance ; -- Deux séances de dialyse le même jour, modif selon facturation UPDATE w_mvt p_mouvements_sejour SET nb_seances = 2 FROM ( SELECT no_sejour, p_factures_lignes_h.date_debut, SUM(nb_prestation) FROM activite.p_factures_lignes_h JOIN activite.p_factures ON p_factures_lignes_h.no_facture = p_factures.no_facture JOIN base.t_actes ON acte_id = t_actes.oid WHERE code_facture = '1' AND t_actes.code LIKE 'JVJF%' AND p_factures_lignes_h.date_debut = p_factures_lignes_h.date_fin GROUP BY 1,2 HAVING SUM(nb_prestation) > 1 ) subview WHERE p_mouvements_sejour.no_sejour = subview.no_sejour AND p_mouvements_sejour.date = subview.date_debut AND p_mouvements_sejour.nb_seances = 1 ; -- Correction pour mouvements CEGI qui finissent à 235959 et redémarrent le lendemain à 0h -> Dans ce cas il manque une journée UPDATE w_mvt SET heure_fin = 240000 WHERE heure_fin = 235959 ; -- Recherche date fin journée pour journées avec absence démarrant après midi (dans ce cas la journée doit être imputée) _nb_services_absence = (SELECT count(*) FROM activite.t_services_facturation WHERE est_absence = '1'); IF _nb_services_absence > 0 THEN RAISE NOTICE '%' , 'Traitement special absences'; DROP TABLE IF EXISTS w_absences; CREATE TEMP TABLE w_absences AS SELECT no_sejour, date, MIN(CASE WHEN service_est_absence <> '1' THEN heure_debut ELSE 999999 END) AS heure_debut_journee, MAX(CASE WHEN service_est_absence <> '1' THEN heure_fin ELSE 0 END) AS heure_fin_journee, MIN(CASE WHEN service_est_absence = '1' THEN heure_debut ELSE 999999 END) AS heure_debut_absence, MAX(CASE WHEN service_est_absence = '1' THEN heure_fin ELSE 0 END) AS heure_fin_absence FROM w_mvt JOIN w_lieux_etendus t_lieux ON lieu_id = t_lieux.oid GROUP BY 1,2 HAVING MAX(service_est_absence) = '1' AND MIN(service_est_absence) <> '1' ORDER BY 1,2; UPDATE w_mvt SET est_premier_mouvement_jour = CASE WHEN 120000 BETWEEN heure_debut_journee AND heure_fin_journee AND heure_debut = heure_debut_journee THEN '1' WHEN 120000 BETWEEN heure_debut_absence AND heure_fin_absence AND heure_debut = heure_debut_absence THEN '1' ELSE '9' END, est_dernier_mouvement_jour = CASE WHEN 120000 BETWEEN heure_debut_journee AND heure_fin_journee AND heure_debut = heure_debut_journee THEN '1' WHEN 120000 BETWEEN heure_debut_absence AND heure_fin_absence AND heure_debut = heure_debut_absence THEN '1' ELSE '9' END FROM w_absences WHERE w_absences.no_sejour = w_mvt.no_sejour AND w_absences.date = w_mvt.date ; UPDATE w_mvt SET nb_chambres_particulieres = 0, nb_entrees_mutation_service = 0, nb_entrees_mutation_etage = 0, nb_sorties_mutation_service = 0, nb_sorties_mutation_etage = 0 FROM w_lieux_etendus t_lieux WHERE lieu_id = t_lieux.oid AND service_est_absence = '1' AND ( nb_chambres_particulieres <> 0 OR nb_entrees_mutation_service <> 0 OR nb_entrees_mutation_etage <> 0 OR nb_sorties_mutation_service <> 0 OR nb_sorties_mutation_etage <> 0 ) ; -- enlever mutations absences DROP TABLE IF EXISTS w_mvt_for_mutations; CREATE TEMP TABLE w_mvt_for_mutations AS SELECT no_sejour, date, heure_debut, ROW_NUMBER() OVER (PARTITION BY no_sejour ORDER BY no_sejour, date, heure_debut ) AS rang_mvt, service_facturation_id, etage_id, unite_fonctionnelle_id, unite_medicale_id, nb_entrees_directes, nb_entrees_mutation_service, nb_entrees_mutation_etage, nb_sorties_directes, nb_sorties_mutation_service, nb_sorties_mutation_etage FROM w_mvt p_mouvements_sejour JOIN w_lieux_etendus t_lieux ON lieu_id = t_lieux.oid WHERE service_est_absence <> '1' ORDER BY 1,2,3 ; UPDATE w_mvt p_mouvements_sejour SET nb_entrees_mutation_service = subview.nb_entrees_mutation_service, nb_entrees_mutation_etage = subview.nb_entrees_mutation_etage FROM ( SELECT w_mvt_for_mutations.no_sejour, w_mvt_for_mutations.date, w_mvt_for_mutations.heure_debut, CASE WHEN w_mvt_for_mutations.service_facturation_id = w_mvt_for_mutations_2.service_facturation_id THEN 0 ELSE 1 END AS nb_entrees_mutation_service, CASE WHEN w_mvt_for_mutations.etage_id = w_mvt_for_mutations_2.etage_id THEN 0 ELSE 1 END AS nb_entrees_mutation_etage FROM w_mvt_for_mutations JOIN w_mvt_for_mutations w_mvt_for_mutations_2 ON w_mvt_for_mutations.no_sejour = w_mvt_for_mutations_2.no_sejour AND w_mvt_for_mutations.rang_mvt = w_mvt_for_mutations_2.rang_mvt+ 1 WHERE ( w_mvt_for_mutations.nb_entrees_mutation_service = 1 AND w_mvt_for_mutations.service_facturation_id = w_mvt_for_mutations_2.service_facturation_id OR w_mvt_for_mutations.nb_entrees_mutation_etage = 1 AND w_mvt_for_mutations.etage_id = w_mvt_for_mutations_2.etage_id ) ) subview WHERE p_mouvements_sejour.no_sejour = subview.no_sejour AND p_mouvements_sejour.date = subview.date AND p_mouvements_sejour.heure_debut = subview.heure_debut ; UPDATE w_mvt p_mouvements_sejour SET nb_sorties_mutation_service = subview.nb_sorties_mutation_service, nb_sorties_mutation_etage = subview.nb_sorties_mutation_etage FROM ( SELECT w_mvt_for_mutations.no_sejour, w_mvt_for_mutations.date, w_mvt_for_mutations.heure_debut, CASE WHEN w_mvt_for_mutations.service_facturation_id = w_mvt_for_mutations_2.service_facturation_id AND w_mvt_for_mutations.nb_sorties_directes <> 1 THEN 0 ELSE 1 END AS nb_sorties_mutation_service, CASE WHEN w_mvt_for_mutations.etage_id = w_mvt_for_mutations_2.etage_id AND w_mvt_for_mutations.nb_sorties_directes <> 1 THEN 0 ELSE 1 END AS nb_sorties_mutation_etage FROM w_mvt_for_mutations JOIN w_mvt_for_mutations w_mvt_for_mutations_2 ON w_mvt_for_mutations.no_sejour = w_mvt_for_mutations_2.no_sejour AND w_mvt_for_mutations.rang_mvt = w_mvt_for_mutations_2.rang_mvt- 1 WHERE ( w_mvt_for_mutations.nb_sorties_mutation_service = 1 AND w_mvt_for_mutations.service_facturation_id = w_mvt_for_mutations_2.service_facturation_id OR w_mvt_for_mutations.nb_sorties_mutation_etage = 1 AND w_mvt_for_mutations.etage_id = w_mvt_for_mutations_2.etage_id ) ) subview WHERE p_mouvements_sejour.no_sejour = subview.no_sejour AND p_mouvements_sejour.date = subview.date AND p_mouvements_sejour.heure_debut = subview.heure_debut ; END IF; RAISE NOTICE '%' , 'Seances dans taux occupation'; UPDATE w_mvt p_mouvements_sejour SET nb_seances_dans_taux = CASE WHEN p_sejours.type_sejour = '5' THEN p_mouvements_sejour.nb_seances ELSE 0 END FROM activite.p_sejours WHERE p_mouvements_sejour.no_sejour = p_sejours.no_sejour AND p_mouvements_sejour.nb_seances > 0 AND p_mouvements_sejour.nb_seances_dans_taux <> CASE WHEN p_sejours.type_sejour = '5' THEN p_mouvements_sejour.nb_seances ELSE 0 END ; RAISE NOTICE '%' , 'Chambres particulieres des ambulatoires'; UPDATE w_mvt SET est_chambre_particuliere = '1' WHERE lieu_id = ANY ( SELECT t_lieux.oid FROM w_lieux_etendus t_lieux WHERE lit_id <> 0 AND lit_chambre_particuliere = 'O' ) AND nb_ambulatoires > 0 AND est_chambre_particuliere <> '1' ; RAISE NOTICE '%' , 'Chambres particulieres des hospitalisés'; UPDATE w_mvt SET est_chambre_particuliere = '1' WHERE lieu_id = ANY ( SELECT t_lieux.oid FROM w_lieux_etendus t_lieux WHERE lit_id <> 0 AND lit_chambre_particuliere = 'O' ) AND est_jour_hospitalisation = '1' AND est_chambre_particuliere <> '1' ; RAISE NOTICE '%' , 'Precalcul EMC'; DROP TABLE IF EXISTS w_mvt_emc; CREATE TEMP TABLE w_mvt_emc AS SELECT no_sejour, CASE WHEN service_type_t2a IN ('2','3') AND mode_traitement_code IN ('04','06','19','20','22') THEN to_char(date,'YYYYMMDD') WHEN service_type_t2a IN ('2','3') AND t_divers.valeur = '1' THEN to_char(date,'YYYYIW') ELSE '' END AS week, SUM( CASE WHEN est_jour_hospitalisation = '1' THEN EXTRACT(EPOCH FROM (to_char(heure_fin,'FM000000')::time without time zone - to_char(heure_debut,'FM000000')::time without time zone)) ELSE 0 END )::numeric AS totseconds FROM w_mvt JOIN w_lieux_etendus t_lieux ON lieu_id = t_lieux.oid JOIN activite.t_divers ON t_divers.code = 'EMCHCSSRPSY' GROUP BY 1,2 ; CREATE INDEX w_mvt_emc_i1 ON w_mvt_emc USING btree (no_sejour); RAISE NOTICE '%' , 'Calcul des journees'; UPDATE w_mvt SET nb_jours_d = CASE WHEN service_mode_calcul_journees = '1'::text THEN CASE WHEN 1=1 AND service_est_absence <> '1'::bpchar AND w_mvt.est_jour_hospitalisation = '1'::bpchar AND (1!=1 OR w_mvt.est_jour_sortie <> '1'::bpchar ) AND (1!=1 OR w_mvt.nb_entrees_directes = 1::NUMERIC OR w_mvt.heure_debut = 0::NUMERIC AND w_mvt.est_premier_mouvement_jour IS DISTINCT FROM '9' OR w_mvt.est_premier_mouvement_jour = '1'::bpchar AND w_mvt.heure_debut <= p_sejours.heure_entree ) THEN 1::INTEGER ELSE 0::INTEGER END WHEN service_mode_calcul_journees = '2'::text THEN CASE WHEN 1=1 AND service_est_absence <> '1'::bpchar AND w_mvt.est_jour_hospitalisation = '1'::bpchar AND (1!=1 OR w_mvt.nb_entrees_directes = 1::NUMERIC OR w_mvt.heure_debut = 0::NUMERIC AND w_mvt.est_premier_mouvement_jour IS DISTINCT FROM '9' OR w_mvt.est_premier_mouvement_jour = '1'::bpchar ) THEN 1::INTEGER ELSE 0::INTEGER END ELSE CASE WHEN 1=1 AND service_est_absence <> '1'::bpchar AND w_mvt.est_jour_hospitalisation = '1'::bpchar AND (1!=1 OR w_mvt.est_jour_sortie <> '1'::bpchar OR (mode_traitement_code = ANY (ARRAY ['04'::text, '06'::text, '19'::text, '20'::text, '22'::text])) AND w_mvt.nb_sorties_directes = 1::NUMERIC OR w_mvt.est_jour_entree = '1'::bpchar AND w_mvt.est_jour_sortie = '1'::bpchar ) AND (1!=1 OR w_mvt.nb_entrees_directes = 1::NUMERIC OR w_mvt.heure_debut = 0::NUMERIC AND w_mvt.est_premier_mouvement_jour IS DISTINCT FROM '9' OR w_mvt.est_premier_mouvement_jour = '1'::bpchar ) THEN 1::INTEGER ELSE 0::INTEGER END END , nb_jours_f = CASE WHEN service_mode_calcul_journees = '1' THEN CASE WHEN 1=1 AND service_est_absence <> '1'::bpchar AND w_mvt.est_jour_hospitalisation = '1'::bpchar AND (1!=1 OR w_mvt.est_jour_sortie <> '1'::bpchar ) AND (1!=1 OR w_mvt.heure_fin = 240000::NUMERIC AND w_mvt.est_dernier_mouvement_jour IS DISTINCT FROM '9' OR w_mvt.est_dernier_mouvement_jour = '1'::bpchar ) THEN 1::INTEGER ELSE 0::INTEGER END WHEN service_mode_calcul_journees = '2' THEN CASE WHEN 1=1 AND service_est_absence <> '1'::bpchar AND w_mvt.est_jour_hospitalisation = '1'::bpchar AND (1!=1 OR w_mvt.heure_fin = 240000::NUMERIC AND w_mvt.est_dernier_mouvement_jour IS DISTINCT FROM '9' OR w_mvt.est_dernier_mouvement_jour = '1'::bpchar OR w_mvt.nb_sorties_directes = 1::NUMERIC ) THEN 1::INTEGER ELSE 0::INTEGER END ELSE CASE WHEN 1=1 AND service_est_absence <> '1'::bpchar AND w_mvt.est_jour_hospitalisation = '1'::bpchar AND (1!=1 OR w_mvt.est_jour_sortie <> '1'::bpchar OR (mode_traitement_code = ANY (ARRAY ['04'::text, '06'::text, '19'::text, '20'::text, '22'::text])) AND w_mvt.nb_sorties_directes = 1::NUMERIC OR w_mvt.est_jour_entree = '1'::bpchar AND w_mvt.est_jour_sortie = '1'::bpchar ) AND (1!=1 OR w_mvt.heure_fin = 240000::NUMERIC AND w_mvt.est_dernier_mouvement_jour IS DISTINCT FROM '9' OR w_mvt.est_dernier_mouvement_jour = '1'::bpchar OR w_mvt.nb_sorties_directes = 1::NUMERIC ) THEN 1::INTEGER ELSE 0::INTEGER END END , nb_jours_12 = CASE WHEN service_est_absence <> '1'::bpchar AND w_mvt.est_jour_hospitalisation = '1'::bpchar AND 120000::numeric BETWEEN w_mvt.heure_debut AND w_mvt.heure_fin THEN 1::integer WHEN service_est_absence <> '1'::bpchar AND w_mvt.nb_entrees_directes = 1 AND w_mvt.heure_debut > 120000 THEN 1::integer WHEN service_est_absence <> '1'::bpchar AND service_mode_calcul_journees = '2' AND w_mvt.nb_sorties_directes = 1 AND w_mvt.heure_fin < 120000 THEN 1::integer else 0 ::integer END , nb_jours_prorata = CASE WHEN service_est_absence <> '1'::bpchar THEN (( CASE WHEN heure_debut <> 240000 THEN substr(to_char(heure_fin,'FM000000'),1,2)::numeric * 3600 + substr(to_char(heure_fin,'FM000000'),3,2)::numeric * 60 + substr(to_char(heure_fin,'FM000000'),5,2)::numeric ELSE 86400 END - CASE WHEN heure_debut <> 0 THEN substr(to_char(heure_debut,'FM000000'),1,2)::numeric * 3600 + substr(to_char(heure_debut,'FM000000'),3,2)::numeric * 60 + substr(to_char(heure_debut,'FM000000'),5,2)::numeric ELSE 0 END ) / 86400)::NUMERIC ELSE 0::NUMERIC END , nb_jours_cp_d = CASE WHEN service_mode_calcul_journees = '1' THEN CASE WHEN service_est_absence <> '1'::bpchar AND w_mvt.est_jour_hospitalisation = '1'::bpchar AND w_mvt.est_jour_sortie <> '1'::bpchar AND w_mvt.est_chambre_particuliere = '1'::bpchar AND (1!=1 OR w_mvt.nb_entrees_directes = 1::NUMERIC OR w_mvt.heure_debut = 0::NUMERIC AND w_mvt.est_premier_mouvement_jour IS DISTINCT FROM '9' OR w_mvt.est_premier_mouvement_jour = '1'::bpchar ) THEN 1::INTEGER WHEN 1=1 AND service_est_absence <> '1'::bpchar AND w_mvt.nb_ambulatoires = 1::NUMERIC AND w_mvt.est_chambre_particuliere = '1'::bpchar THEN 1::INTEGER ELSE 0::INTEGER END WHEN service_mode_calcul_journees = '2' THEN CASE WHEN 1=1 AND service_est_absence <> '1'::bpchar AND w_mvt.est_jour_hospitalisation = '1'::bpchar AND w_mvt.est_chambre_particuliere = '1'::bpchar AND (1!=1 OR w_mvt.nb_entrees_directes = 1::NUMERIC OR w_mvt.heure_debut = 0::NUMERIC AND w_mvt.est_premier_mouvement_jour IS DISTINCT FROM '9' OR w_mvt.est_premier_mouvement_jour = '1'::bpchar ) THEN 1::INTEGER WHEN 1=1 AND service_est_absence <> '1'::bpchar AND w_mvt.nb_ambulatoires = 1::NUMERIC AND w_mvt.est_chambre_particuliere = '1'::bpchar THEN 1::INTEGER ELSE 0::INTEGER END ELSE CASE WHEN 1=1 AND service_est_absence <> '1'::bpchar AND w_mvt.est_jour_hospitalisation = '1'::bpchar AND (1!=1 OR w_mvt.est_jour_sortie <> '1'::bpchar OR w_mvt.est_jour_entree = '1'::bpchar AND w_mvt.est_jour_sortie = '1'::bpchar ) AND w_mvt.est_chambre_particuliere = '1'::bpchar AND (1!=1 OR w_mvt.nb_entrees_directes = 1::NUMERIC OR w_mvt.heure_debut = 0::NUMERIC AND w_mvt.est_premier_mouvement_jour IS DISTINCT FROM '9' OR w_mvt.est_premier_mouvement_jour = '1'::bpchar ) THEN 1::INTEGER WHEN 1=1 AND service_est_absence <> '1'::bpchar AND w_mvt.nb_ambulatoires = 1::NUMERIC AND w_mvt.est_chambre_particuliere = '1'::bpchar THEN 1::INTEGER ELSE 0::INTEGER END END , nb_jours_cp_f = CASE WHEN service_mode_calcul_journees = '1' THEN CASE WHEN 1=1 AND service_est_absence <> '1'::bpchar AND w_mvt.est_jour_hospitalisation = '1'::bpchar AND w_mvt.est_jour_sortie <> '1'::bpchar AND w_mvt.est_chambre_particuliere = '1'::bpchar AND (1!=1 OR w_mvt.heure_fin = 240000::NUMERIC AND w_mvt.est_dernier_mouvement_jour IS DISTINCT FROM '9' OR w_mvt.est_dernier_mouvement_jour = '1'::bpchar OR w_mvt.nb_sorties_directes = 1::NUMERIC ) THEN 1::INTEGER WHEN 1=1 AND service_est_absence <> '1'::bpchar AND w_mvt.nb_ambulatoires = 1::NUMERIC AND w_mvt.est_chambre_particuliere = '1'::bpchar THEN 1::INTEGER ELSE 0::INTEGER END WHEN service_mode_calcul_journees = '2' THEN CASE WHEN 1=1 AND service_est_absence <> '1'::bpchar AND w_mvt.est_jour_hospitalisation = '1'::bpchar AND w_mvt.est_chambre_particuliere = '1'::bpchar AND (1!=1 OR w_mvt.heure_fin = 240000::NUMERIC AND w_mvt.est_dernier_mouvement_jour IS DISTINCT FROM '9' OR w_mvt.est_dernier_mouvement_jour = '1'::bpchar OR w_mvt.nb_sorties_directes = 1::NUMERIC ) THEN 1::INTEGER WHEN 1=1 AND service_est_absence <> '1'::bpchar AND w_mvt.nb_ambulatoires = 1::NUMERIC AND w_mvt.est_chambre_particuliere = '1'::bpchar THEN 1::INTEGER ELSE 0::INTEGER END ELSE CASE WHEN 1=1 AND service_est_absence <> '1'::bpchar AND w_mvt.est_jour_hospitalisation = '1'::bpchar AND (1!=1 OR w_mvt.est_jour_sortie <> '1'::bpchar OR w_mvt.est_jour_entree = '1'::bpchar AND w_mvt.est_jour_sortie = '1'::bpchar ) AND w_mvt.est_chambre_particuliere = '1'::bpchar AND (1!=1 OR w_mvt.heure_fin = 240000::NUMERIC AND w_mvt.est_dernier_mouvement_jour IS DISTINCT FROM '9' OR w_mvt.est_dernier_mouvement_jour = '1'::bpchar OR w_mvt.nb_sorties_directes = 1::NUMERIC ) THEN 1::INTEGER WHEN 1=1 AND service_est_absence <> '1'::bpchar AND w_mvt.nb_ambulatoires = 1::NUMERIC AND w_mvt.est_chambre_particuliere = '1'::bpchar THEN 1::INTEGER ELSE 0::INTEGER END END , nb_jours_cp_12 = CASE WHEN 1=1 AND service_est_absence <> '1'::bpchar AND w_mvt.est_jour_hospitalisation = '1'::bpchar AND w_mvt.est_chambre_particuliere = '1'::bpchar AND 120000::NUMERIC >= w_mvt.heure_debut AND 120000::NUMERIC <= w_mvt.heure_fin THEN 1::INTEGER WHEN 1=1 AND service_est_absence <> '1'::bpchar AND w_mvt.nb_ambulatoires = 1::NUMERIC AND w_mvt.est_chambre_particuliere = '1'::bpchar AND 120000::NUMERIC >= w_mvt.heure_debut AND 120000::NUMERIC <= w_mvt.heure_fin THEN 1::INTEGER WHEN service_est_absence <> '1'::bpchar AND w_mvt.est_chambre_particuliere = '1'::bpchar AND w_mvt.nb_entrees_directes = 1 AND w_mvt.heure_debut > 120000 THEN 1::integer WHEN service_est_absence <> '1'::bpchar AND w_mvt.est_chambre_particuliere = '1'::bpchar AND service_mode_calcul_journees = '2' AND w_mvt.nb_sorties_directes = 1 AND w_mvt.heure_fin < 120000 THEN 1::integer ELSE 0::INTEGER END, equivalent_malade_complet = CASE WHEN p_sejours.type_sejour = '1' AND est_jour_hospitalisation = '1' THEN base.cti_division (EXTRACT(EPOCH FROM (to_char(heure_fin,'FM000000')::time without time zone - to_char(heure_debut,'FM000000')::time without time zone))::numeric, totseconds ) WHEN p_sejours.type_sejour = '2' AND nb_ambulatoires = 1 THEN 1 WHEN p_sejours.type_sejour = '3' AND nb_externes = 1 THEN 1 WHEN p_sejours.type_sejour = '5' AND nb_seances >= 1 THEN 1 ELSE 0 END FROM w_lieux_etendus t_lieux, activite.p_sejours, w_mvt_emc, activite.t_divers t_divers_emchcssrpsy WHERE 1=1 AND w_mvt.lieu_id = t_lieux.oid AND w_mvt.no_sejour = p_sejours.no_sejour AND w_mvt.no_sejour = w_mvt_emc.no_sejour AND (CASE WHEN service_type_t2a IN ('2','3') AND mode_traitement_code IN ('04','06','19','20','22') THEN to_char(date,'YYYYMMDD') WHEN service_type_t2a IN ('2','3') AND t_divers_emchcssrpsy.valeur = '1' THEN to_char(date,'YYYYIW') ELSE '' END) = w_mvt_emc.week AND t_divers_emchcssrpsy.code = 'EMCHCSSRPSY'; -- remise en place jours d'absence IF _nb_services_absence > 0 THEN RAISE NOTICE '%' , 'Traitement special absences (2)'; UPDATE w_mvt SET est_premier_mouvement_jour = '0', est_dernier_mouvement_jour = '0' FROM w_absences WHERE w_absences.no_sejour = w_mvt.no_sejour AND w_absences.date = w_mvt.date ; END IF; RAISE NOTICE '%' , 'Entrees en urgence'; -- entrées en urgence selon etage UPDATE w_mvt p_mouvements_sejour SET nb_urgences = 1 FROM w_lieux_etendus t_lieux WHERE lieu_id = t_lieux.oid AND etage_est_urgence = '1' AND nb_urgences = 0 AND (nb_entrees_directes = 1 OR nb_ambulatoires = 1 OR nb_externes = 1 ) ; UPDATE activite.p_sejours SET provenance = '5' FROM w_mvt p_mouvements_sejour WHERE p_sejours.no_sejour = p_mouvements_sejour.no_sejour AND p_mouvements_sejour.nb_urgences = 1 AND p_sejours.provenance <> '5' ; -- entrées en urgence selon dmt UPDATE w_mvt SET nb_urgences = 1 FROM w_lieux_etendus t_lieux WHERE lieu_id = t_lieux.oid AND dmt_code = ANY(ARRAY['303', '307', '308', '401', '402', '403', '404', '405', '406', '407', '408', '409']) AND nb_urgences <> 1 AND ( nb_entrees_directes = 1 OR nb_ambulatoires = 1 OR nb_externes = 1 ) ; UPDATE w_mvt SET nb_urgences = 1 FROM activite.p_sejours WHERE w_mvt.no_sejour = p_sejours.no_sejour AND nb_urgences <> 1 AND provenance = '5' AND ( nb_entrees_directes = 1 OR nb_ambulatoires = 1 OR nb_externes = 1) ; -- Enlever les séances en hospit si paramétrage UPDATE w_mvt SET nb_seances = 0 FROM activite.p_sejours JOIN activite.t_divers ON t_divers.code = 'SEANCEHOSPIT' AND t_divers.valeur = '0' WHERE w_mvt.no_sejour = p_sejours.no_sejour AND type_sejour <> '5' AND nb_seances <> 0 ; -- Enlever les séances (sauf dialyse) en hospit si paramétrage DROP TABLE IF EXISTS w_seances_all; CREATE TEMP TABLE w_seances_all AS SELECT p_sejours.no_sejour, date, '0'::text AS dialyse FROM w_mvt JOIN activite.p_sejours ON w_mvt.no_sejour = p_sejours.no_sejour JOIN activite.t_divers ON t_divers.code = 'SEANCEHOSPIT' AND t_divers.valeur = '2' WHERE type_sejour <> '5' AND nb_seances <> 0 ; UPDATE w_seances_all SET dialyse = '1' FROM activite.p_factures_lignes_h p_factures_lignes JOIN base.t_actes ON acte_id = t_actes.oid AND t_actes.code LIKE 'JVJF%' JOIN activite.p_factures ON p_factures_lignes.no_facture = p_factures.no_facture WHERE p_factures.no_sejour = w_seances_all.no_sejour AND p_factures_lignes.date_debut = w_seances_all.date ; UPDATE w_seances_all SET dialyse = '1' FROM activite.p_factures_lignes_non_facturees_h p_factures_lignes JOIN base.t_actes ON acte_id = t_actes.oid AND t_actes.code LIKE 'JVJF%' JOIN activite.p_factures ON p_factures_lignes.no_facture = p_factures.no_facture WHERE p_factures.no_sejour = w_seances_all.no_sejour AND p_factures_lignes.date_debut = w_seances_all.date ; UPDATE w_seances_all SET dialyse = '1' FROM activite.p_factures_lignes_c p_factures_lignes JOIN activite.t_prestations ON prestation_id = t_prestations.oid AND (t_prestations.code LIKE 'D0%' OR t_prestations.code LIKE 'D1%' ) JOIN activite.p_factures ON p_factures_lignes.no_facture = p_factures.no_facture WHERE p_factures.no_sejour = w_seances_all.no_sejour AND p_factures_lignes.date_debut = w_seances_all.date ; UPDATE w_seances_all SET dialyse = '1' FROM activite.p_factures_lignes_non_facturees_c p_factures_lignes JOIN activite.t_prestations ON prestation_id = t_prestations.oid AND (t_prestations.code LIKE 'D0%' OR t_prestations.code LIKE 'D1%' ) JOIN activite.p_factures ON p_factures_lignes.no_facture = p_factures.no_facture WHERE p_factures.no_sejour = w_seances_all.no_sejour AND p_factures_lignes.date_debut = w_seances_all.date ; UPDATE w_mvt SET nb_seances = 0 FROM w_seances_all WHERE w_mvt.no_sejour = w_seances_all.no_sejour AND w_mvt.date = w_seances_all.date AND dialyse = '0' ; -- Nb jours des sortis pour calcul DMS UPDATE w_mvt SET nb_jour_sejour_sorti = subview.nb_jour_sejour_sorti FROM (SELECT no_sejour, SUM(nb_jours_f) AS nb_jour_sejour_sorti, MAX(CASE WHEN nb_sorties_directes > 0 THEN date ELSE NULL END) AS date, MAX(CASE WHEN nb_sorties_directes > 0 THEN heure_fin ELSE NULL END) AS heure_fin FROM w_mvt WHERE est_mouvement_previsionnel <> '1' GROUP BY 1 HAVING SUM(nb_sorties_directes) > 0 ) subview WHERE w_mvt.no_sejour = subview.no_sejour AND w_mvt.date = subview.date AND w_mvt.heure_fin = subview.heure_fin AND nb_sorties_directes > 0 ; UPDATE w_mvt SET nb_jour_sejour_sorti = nb_ambulatoires WHERE est_mouvement_previsionnel <> '1' AND nb_ambulatoires <> 0 ; UPDATE w_mvt SET nb_jour_sejour_sorti = nb_seances FROM activite.p_sejours WHERE w_mvt.no_sejour = p_sejours.no_sejour AND p_sejours.type_sejour = '5' AND est_mouvement_previsionnel <> '1' AND nb_seances <> 0 ; -- Distinction des types de séances UPDATE w_mvt p_mouvements_sejour SET nb_seances_dialyse = nb_seances FROM activite.p_sejours JOIN base.t_ghm ON ghm_id = t_ghm.oid WHERE p_mouvements_sejour.no_sejour = p_sejours.no_sejour AND p_sejours.type_sejour = '5' AND nb_seances <> 0 AND t_ghm.code = ANY(Array['28Z01Z','28Z02Z','28Z03Z','28Z04Z','28Z05Z','28Z06Z']) AND nb_seances_dialyse IS DISTINCT FROM nb_seances ; UPDATE w_mvt p_mouvements_sejour SET nb_seances_chimio = nb_seances FROM activite.p_sejours JOIN base.t_ghm ON ghm_id = t_ghm.oid WHERE p_mouvements_sejour.no_sejour = p_sejours.no_sejour AND p_sejours.type_sejour = '5' AND nb_seances <> 0 AND t_ghm.code = ANY(Array['28Z07Z','28Z17Z']) AND nb_seances_dialyse IS DISTINCT FROM nb_seances ; UPDATE w_mvt p_mouvements_sejour SET nb_seances_chimio = nb_seances FROM activite.p_sejours JOIN base.t_ghs ON ghs_id = t_ghs.oid WHERE p_mouvements_sejour.no_sejour = p_sejours.no_sejour AND p_sejours.type_sejour = '5' AND nb_seances <> 0 AND t_ghs.code = ANY(Array[9606]) AND nb_seances_chimio = 0 ; DROP TABLE IF EXISTS w_seances_hospit_fac; CREATE TEMP TABLE w_seances_hospit_fac AS SELECT p_factures.no_sejour FROM activite.p_factures_lignes_c JOIN activite.p_factures ON p_factures_lignes_c.no_facture = p_factures.no_facture JOIN activite.t_prestations ON prestation_id = t_prestations.oid JOIN activite.p_sejours ON p_factures.no_sejour = p_sejours.no_sejour WHERE p_sejours.type_sejour <> '5' AND t_prestations.code = ANY(Array['D09','D11','D15','D16','DTP']) GROUP BY 1 ; UPDATE w_mvt p_mouvements_sejour SET nb_seances_dialyse = nb_seances WHERE nb_seances <> 0 AND nb_seances_dialyse IS DISTINCT FROM nb_seances AND no_sejour IN (SELECT no_sejour FROM w_seances_hospit_fac) ; DROP TABLE IF EXISTS w_seances_hospit_nfac; CREATE TEMP TABLE w_seances_hospit_nfac AS SELECT p_factures.no_sejour FROM activite.p_factures_lignes_non_facturees_c p_factures_lignes_c JOIN activite.p_factures ON p_factures_lignes_c.no_facture = p_factures.no_facture JOIN activite.t_prestations ON prestation_id = t_prestations.oid JOIN activite.p_sejours ON p_factures.no_sejour = p_sejours.no_sejour WHERE p_sejours.type_sejour <> '5' AND t_prestations.code = ANY(Array['D09','D11','D15','D16','DTP']) GROUP BY 1 ; UPDATE w_mvt p_mouvements_sejour SET nb_seances_dialyse = nb_seances WHERE nb_seances <> 0 AND nb_seances_dialyse IS DISTINCT FROM nb_seances AND no_sejour IN (SELECT no_sejour FROM w_seances_hospit_nfac) ; DROP TABLE IF EXISTS w_seances_dialyse_dmt; CREATE TEMP TABLE w_seances_dialyse_dmt AS SELECT no_sejour FROM activite.p_mouvements_sejour JOIN activite.t_lieux ON lieu_id = t_lieux.oid JOIN activite.t_services_facturation ON service_facturation_id = t_services_facturation.oid JOIN base.t_dmt ON dmt_id = t_dmt.oid WHERE nb_seances_autre > 0 AND t_dmt.texte ILIKE '%dialyse%' GROUP BY 1 ; UPDATE w_mvt p_mouvements_sejour SET nb_seances_dialyse = nb_seances WHERE nb_seances <> 0 AND nb_seances_dialyse IS DISTINCT FROM nb_seances AND no_sejour IN (SELECT no_sejour FROM w_seances_dialyse_dmt) ; UPDATE w_mvt p_mouvements_sejour SET nb_seances_autre = nb_seances - nb_seances_dialyse - nb_seances_chimio WHERE nb_seances <> 0 AND nb_seances_autre IS DISTINCT FROM (nb_seances - nb_seances_dialyse - nb_seances_chimio) ; UPDATE w_mvt p_mouvements_sejour SET nb_preadmission_validee = 1, nb_preadmission_validee_j1 = subview.preadmission_j1, nb_preadmission_validee_j2 = subview.preadmission_j2 FROM ( SELECT p_sejours_preadmission.no_sejour, p_mouvements_sejour.date, preadmission_j1, preadmission_j2 FROM activite.p_sejours_preadmission JOIN activite.p_sejours on p_sejours_preadmission.no_sejour = p_sejours.no_sejour JOIN w_mvt p_mouvements_sejour on p_sejours_preadmission.no_sejour = p_mouvements_sejour.no_sejour AND date(p_sejours_preadmission.date_entree) = p_mouvements_sejour.date AND ( nb_entrees_directes = 1 OR nb_ambulatoires = 1 OR nb_externes = 1 OR nb_seances > 0 ) WHERE date_validation_preadmission IS NOT NULL AND code_prevu = '0' ) subview WHERE p_mouvements_sejour.no_sejour = subview.no_sejour AND p_mouvements_sejour.date = subview.date AND ( nb_entrees_directes = 1 OR nb_ambulatoires = 1 OR nb_externes = 1 OR nb_seances > 0 ) ; -- Enlever les journées pour les bébés (type séjour 6 - MEDSPHERE, HM) UPDATE w_mvt p_mouvements_sejour SET nb_ambulatoires = 0, nb_chambres_particulieres = 0, nb_entrees_directes = 0, nb_entrees_mutation_activite = 0, nb_entrees_mutation_etage = 0, nb_entrees_mutation_service = 0, nb_entrees_mutation_unite_medicale = 0, nb_entrees_mutations = 0, nb_externes = 0, nb_jour_sejour_sorti = 0, nb_jours_12 = 0, nb_jours_cp_12 = 0, nb_jours_cp_d = 0, nb_jours_cp_f = 0, nb_jours_d = 0, nb_jours_f = 0, nb_jours_js_inclus = 0, nb_jours_js_non_inclus = 0, nb_jours_prorata = 0, nb_passage_externe = 0, nb_seances = 0, nb_seances_autre = 0, nb_seances_chimio = 0, nb_seances_dans_taux = 0, nb_seances_dialyse = 0, nb_sorties_directes = 0, nb_sorties_mutation_activite = 0, nb_sorties_mutation_etage = 0, nb_sorties_mutation_service = 0, nb_sorties_mutation_unite_medicale = 0, nb_sorties_mutations = 0, nb_urgences = 0 FROM activite.p_sejours WHERE p_sejours.no_sejour = p_mouvements_sejour.no_sejour AND p_sejours.type_sejour IN ('6') ; RAISE NOTICE '%' , 'Décomposition par type pmsi'; --Décomposition par type_pmsi et type_sejour DROP TABLE IF EXISTS w_mvt_pmsi; CREATE TEMP TABLE w_mvt_pmsi AS SELECT w_mvt.*, p_sejours.type_pmsi, p_sejours.mode_traitement_id , p_sejours.type_sejour, p_sejours.forme_activite_id FROM w_mvt JOIN activite.p_sejours ON p_sejours.no_sejour = w_mvt.no_sejour JOIN w_lieux_etendus ON w_lieux_etendus.oid = w_mvt.lieu_id; -- MAJ MCO hospi UPDATE activite.p_sejours SET type_hospi_pmsi_id = 11 FROM w_mvt_pmsi WHERE 1=1 AND p_sejours.no_sejour = w_mvt_pmsi.no_sejour AND w_mvt_pmsi.type_pmsi = 1 AND w_mvt_pmsi.type_sejour = 1; -- MAJ MCO ambu UPDATE activite.p_sejours SET type_hospi_pmsi_id = 12 FROM w_mvt_pmsi WHERE 1=1 AND p_sejours.no_sejour = w_mvt_pmsi.no_sejour AND w_mvt_pmsi.type_pmsi = 1 AND w_mvt_pmsi.type_sejour = 2; -- MAJ MCO seances UPDATE activite.p_sejours SET type_hospi_pmsi_id = 15 FROM w_mvt_pmsi WHERE 1=1 AND p_sejours.no_sejour = w_mvt_pmsi.no_sejour AND w_mvt_pmsi.type_pmsi = 1 AND w_mvt_pmsi.type_sejour = 5; -- MAJ SSR hospitalisation complète UPDATE activite.p_sejours SET type_hospi_pmsi_id = 21 FROM w_mvt_pmsi WHERE 1=1 AND p_sejours.no_sejour = w_mvt_pmsi.no_sejour AND w_mvt_pmsi.type_pmsi = 2 AND w_mvt_pmsi.type_sejour = 1; -- MAJ SSR hospitalisation partiel ou HDJ UPDATE activite.p_sejours SET type_hospi_pmsi_id = 22 FROM w_mvt_pmsi WHERE 1=1 AND p_sejours.no_sejour = w_mvt_pmsi.no_sejour AND w_mvt_pmsi.type_pmsi = 2 AND w_mvt_pmsi.type_sejour = 2; -- MAJ SSR Autres UPDATE activite.p_sejours SET type_hospi_pmsi_id = 24 FROM w_mvt_pmsi WHERE 1=1 AND p_sejours.no_sejour = w_mvt_pmsi.no_sejour AND w_mvt_pmsi.type_pmsi = 2 AND w_mvt_pmsi.type_sejour not in ('1','2'); -- MAJ SSR Autres UPDATE activite.p_sejours SET type_hospi_pmsi_id = 24 FROM w_mvt_pmsi WHERE 1=1 AND p_sejours.no_sejour = w_mvt_pmsi.no_sejour AND w_mvt_pmsi.type_pmsi = 2 AND w_mvt_pmsi.type_sejour not in ('1','2'); -- MAJ PSY HC UPDATE activite.p_sejours SET type_hospi_pmsi_id = 31 FROM w_mvt_pmsi WHERE 1=1 AND p_sejours.no_sejour = w_mvt_pmsi.no_sejour AND w_mvt_pmsi.type_pmsi = 3 AND w_mvt_pmsi.type_sejour = 1; -- MAJ PSY HP (HDJ) UPDATE activite.p_sejours SET type_hospi_pmsi_id = 32 FROM w_mvt_pmsi WHERE 1=1 AND p_sejours.no_sejour = w_mvt_pmsi.no_sejour AND w_mvt_pmsi.type_pmsi = 3 AND w_mvt_pmsi.type_sejour = 2; -- MAJ PSY Autres UPDATE activite.p_sejours SET type_hospi_pmsi_id = 33 FROM w_mvt_pmsi WHERE 1=1 AND p_sejours.no_sejour = w_mvt_pmsi.no_sejour AND w_mvt_pmsi.type_pmsi = 3 AND w_mvt_pmsi.type_sejour not in ('1','2'); -- MAJ HAD Hospi UPDATE activite.p_sejours SET type_hospi_pmsi_id = 41 FROM w_mvt_pmsi WHERE 1=1 AND p_sejours.no_sejour = w_mvt_pmsi.no_sejour AND w_mvt_pmsi.type_pmsi = 4 AND w_mvt_pmsi.type_sejour = 1; -- MAJ Externes UPDATE activite.p_sejours SET type_hospi_pmsi_id = 30 FROM w_mvt_pmsi WHERE 1=1 AND p_sejours.no_sejour = w_mvt_pmsi.no_sejour AND w_mvt_pmsi.type_sejour = 3; RAISE NOTICE '%' , 'sequence de changement du lieu'; with clustering as ( select sejour_id, lieu_id, date, case when lag(lieu_id) over w = coalesce(lieu_id) then null else true end as new_cluster from w_mvt window w as (partition by sejour_id order by date, nb_jours_js_non_inclus) ) ,assigned_clustering as ( select sejour_id, lieu_id, date, count(new_cluster) over (order by sejour_id, date rows unbounded preceding) as cluster_id from clustering) UPDATE w_mvt SET sequences = assigned_clustering.cluster_id FROM assigned_clustering WHERE w_mvt.sejour_id = assigned_clustering.sejour_id AND w_mvt.lieu_id = assigned_clustering.lieu_id AND w_mvt.date = assigned_clustering.date ; -- Réécriture des données dans la table de production RAISE NOTICE '%' , 'Ecriture des donnees dans la table de production'; TRUNCATE activite.p_mouvements_sejour; INSERT INTO activite.p_mouvements_sejour SELECT * FROM w_mvt; -- Activation index RAISE NOTICE '%' , 'Reactivation index'; PERFORM base.cti_stash_pop_table_indexes('activite.p_mouvements_sejour'); ANALYZE activite.p_mouvements_sejour; RETURN 'OK' ; END;