return: text lang: plpgsql src: | DECLARE BEGIN IF NOT EXISTS (SELECT *FROM information_schema.columns WHERE table_name = 't_unites_fonctionnelles' AND table_schema = 'activite' AND column_name = 'type_eclatement') THEN RETURN 'KO. Pas de colonne type_eclatement'; END IF; PERFORM setval('activite.s_lieux', (SELECT COALESCE(MAX(oid),0) + 1 FROM activite.t_lieux), true); -- Eclatement à la première UF (cas des soins continus) IF EXISTS (SELECT * FROM activite.t_unites_fonctionnelles WHERE type_eclatement = '1') THEN RAISE NOTICE '%' , 'Ventilation premiere UF. Recherche sejours'; DROP TABLE IF EXISTS w_transform_uf_0; CREATE TEMP TABLE w_transform_uf_0 AS SELECT no_sejour, (MIN(CASE WHEN type_eclatement IS DISTINCT FROM '1' THEN ARRAY[to_char(date,'YYYYMMDD')::text||to_char(heure_debut,'FM000000'),unite_fonctionnelle_id::text] ELSE ARRAY['20991231999999'::text,'0'::text] END))[2]::bigint AS first_unite_fonctionnelle_id, ''::text AS first_unite_fonctionnelle_code, ''::text AS first_unite_fonctionnelle_texte FROM activite.p_mouvements_sejour JOIN activite.t_lieux ON lieu_id = t_lieux.oid JOIN activite.t_unites_fonctionnelles ON unite_fonctionnelle_id = t_unites_fonctionnelles.oid GROUP BY 1 HAVING SUM(CASE WHEN type_eclatement = '1' THEN 1 ELSE 0 END)>0 ; -- Au moins un séjour concerné IF EXISTS (SELECT * FROM w_transform_uf_0) THEN UPDATE w_transform_uf_0 SET first_unite_fonctionnelle_code = t_unites_fonctionnelles.code, first_unite_fonctionnelle_texte = t_unites_fonctionnelles.texte FROM activite.t_unites_fonctionnelles WHERE first_unite_fonctionnelle_id = t_unites_fonctionnelles.oid AND first_unite_fonctionnelle_id <> 0; UPDATE w_transform_uf_0 SET first_unite_fonctionnelle_code = 'MONO', first_unite_fonctionnelle_texte = 'MonoRUM' WHERE first_unite_fonctionnelle_id = 0; RAISE NOTICE '%' , 'Ventilation premiere UF. Recherche lieux'; DROP TABLE IF EXISTS w_transform_uf_1; CREATE TEMP TABLE w_transform_uf_1 AS SELECT p_mouvements_sejour.no_sejour, lieu_id, MAX(t_unites_fonctionnelles.code || '-' || first_unite_fonctionnelle_code) AS new_unite_fonctionnelle_code, MAX(t_unites_fonctionnelles.texte || '-' || first_unite_fonctionnelle_texte) AS new_unite_fonctionnelle_texte, MAX(service_facturation_id) AS service_facturation_id, MAX(activite_id) AS activite_id, MAX(lit_id) AS lit_id, MAX(unite_medicale_id) AS unite_medicale_id, MAX(unite_fonctionnelle_id) AS unite_fonctionnelle_id, 0::bigint AS new_unite_fonctionnelle_id, 0::bigint AS new_lieu_id FROM activite.p_mouvements_sejour JOIN w_transform_uf_0 ON w_transform_uf_0.no_sejour = p_mouvements_sejour.no_sejour JOIN activite.t_lieux ON lieu_id = t_lieux.oid JOIN activite.t_unites_fonctionnelles ON unite_fonctionnelle_id = t_unites_fonctionnelles.oid WHERE type_eclatement = '1' GROUP BY 1,2; RAISE NOTICE '%' , 'Ventilation premiere UF. Nouvelles UF'; INSERT INTO activite.t_unites_fonctionnelles(code_original, code, texte, texte_court) SELECT '*'||new_unite_fonctionnelle_code, new_unite_fonctionnelle_code, new_unite_fonctionnelle_texte, new_unite_fonctionnelle_texte FROM w_transform_uf_1 WHERE ('*'||new_unite_fonctionnelle_code) NOT IN (SELECT code_original FROM activite.t_unites_fonctionnelles) GROUP BY 1,2,3,4 ORDER BY 1; UPDATE w_transform_uf_1 SET new_unite_fonctionnelle_id = t_unites_fonctionnelles.oid FROM activite.t_unites_fonctionnelles WHERE ('*'||new_unite_fonctionnelle_code) = code_original; INSERT INTO activite.t_lieux ( oid, code_original_1, code_original_2, code_original_3, code_original_4, code_original_5, code_original_6, code_original_7, service_facturation_id, activite_id, lit_id, unite_medicale_id, unite_fonctionnelle_id, mode_traitement_id ) SELECT nextval('activite.s_lieux'::regclass) AS oid, subview.* FROM ( SELECT t_lieux.code_original_1, t_lieux.code_original_2, t_lieux.code_original_3, t_lieux.code_original_4, t_lieux.code_original_5, ('*'||new_unite_fonctionnelle_code) AS code_original_6, t_lieux.code_original_7, t_lieux.service_facturation_id, t_lieux.activite_id, t_lieux.lit_id, t_lieux.unite_medicale_id, new_unite_fonctionnelle_id AS unite_fonctionnelle_id, t_lieux.mode_traitement_id FROM activite.t_lieux JOIN w_transform_uf_1 ON t_lieux.oid = w_transform_uf_1.lieu_id LEFT JOIN activite.t_lieux t_lieux_deja ON t_lieux.service_facturation_id = t_lieux_deja.service_facturation_id AND t_lieux.activite_id = t_lieux_deja.activite_id AND t_lieux.lit_id = t_lieux_deja.lit_id AND t_lieux.unite_medicale_id = t_lieux_deja.unite_medicale_id AND new_unite_fonctionnelle_id = t_lieux_deja.unite_fonctionnelle_id WHERE t_lieux_deja.oid IS NULL GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13 ) subview; UPDATE w_transform_uf_1 SET new_lieu_id = t_lieux.oid FROM activite.t_lieux WHERE t_lieux.service_facturation_id = w_transform_uf_1.service_facturation_id AND t_lieux.activite_id = w_transform_uf_1.activite_id AND t_lieux.lit_id = w_transform_uf_1.lit_id AND t_lieux.unite_medicale_id = w_transform_uf_1.unite_medicale_id AND t_lieux.unite_fonctionnelle_id = w_transform_uf_1.new_unite_fonctionnelle_id; RAISE NOTICE '%' , 'Ventilation premiere UF. Modification sejours'; UPDATE activite.p_mouvements_sejour SET lieu_id = new_lieu_id FROM w_transform_uf_1 WHERE w_transform_uf_1.no_sejour = p_mouvements_sejour.no_sejour AND w_transform_uf_1.lieu_id = p_mouvements_sejour.lieu_id; UPDATE activite.p_sejours SET lieu_sortie_id = new_lieu_id FROM w_transform_uf_1 WHERE w_transform_uf_1.no_sejour = p_sejours.no_sejour AND w_transform_uf_1.lieu_id = p_sejours.lieu_sortie_id; UPDATE activite.p_factures_lignes_c SET lieu_id = new_lieu_id FROM w_transform_uf_1 JOIN activite.p_factures on p_factures.no_sejour = w_transform_uf_1.no_sejour WHERE p_factures_lignes_c.no_facture = p_factures.no_facture AND w_transform_uf_1.lieu_id = p_factures_lignes_c.lieu_id; UPDATE activite.p_factures_lignes_h SET lieu_id = new_lieu_id FROM w_transform_uf_1 JOIN activite.p_factures on p_factures.no_sejour = w_transform_uf_1.no_sejour WHERE p_factures_lignes_h.no_facture = p_factures.no_facture AND w_transform_uf_1.lieu_id = p_factures_lignes_h.lieu_id; END IF; END IF; -- Eclatement à la spécialité médecin (cas des externes) IF EXISTS (SELECT * FROM activite.t_unites_fonctionnelles WHERE type_eclatement = '2') THEN RAISE NOTICE '%' , 'Ventilation Specialite. Recherche sejours'; DROP TABLE IF EXISTS w_transform_uf_2; CREATE TEMP TABLE w_transform_uf_2 AS SELECT no_sejour, lieu_id, MAX(specialite_code) AS specialite_code, MAX(replace(t_unites_fonctionnelles.code,'-MONO','') || '-' || replace(specialite_code,'.','')) AS new_unite_fonctionnelle_code, MAX(replace(t_unites_fonctionnelles.texte,'-MonoRUM','') || '-' || specialite_texte) AS new_unite_fonctionnelle_texte, MAX(service_facturation_id) AS service_facturation_id, MAX(activite_id) AS activite_id, MAX(lit_id) AS lit_id, MAX(unite_medicale_id) AS unite_medicale_id, MAX(unite_fonctionnelle_id) AS unite_fonctionnelle_id, 0::bigint AS new_unite_fonctionnelle_id, 0::bigint AS new_lieu_id FROM activite.p_mouvements_sejour JOIN activite.t_lieux ON lieu_id = t_lieux.oid JOIN activite.t_unites_fonctionnelles ON unite_fonctionnelle_id = t_unites_fonctionnelles.oid JOIN activite.t_medecins_administratifs_c ON medecin_sejour_id = t_medecins_administratifs_c.oid WHERE type_eclatement = '2' AND specialite_id <> 0 GROUP BY 1,2; -- Au moins un séjour concerné IF EXISTS (SELECT * FROM w_transform_uf_2) THEN RAISE NOTICE '%' , 'Ventilation Specialite. Nouvelles UF'; INSERT INTO activite.t_unites_fonctionnelles(code_original, code, texte, texte_court) SELECT '*'||new_unite_fonctionnelle_code, new_unite_fonctionnelle_code, new_unite_fonctionnelle_texte, new_unite_fonctionnelle_texte FROM w_transform_uf_2 WHERE ('*'||new_unite_fonctionnelle_code) NOT IN (SELECT code_original FROM activite.t_unites_fonctionnelles) GROUP BY 1,2,3,4 ORDER BY 1; UPDATE w_transform_uf_2 SET new_unite_fonctionnelle_id = t_unites_fonctionnelles.oid FROM activite.t_unites_fonctionnelles WHERE ('*'||new_unite_fonctionnelle_code) = code_original; INSERT INTO activite.t_lieux ( oid, code_original_1, code_original_2, code_original_3, code_original_4, code_original_5, code_original_6, code_original_7, service_facturation_id, activite_id, lit_id, unite_medicale_id, unite_fonctionnelle_id, mode_traitement_id ) SELECT nextval('activite.s_lieux'::regclass) AS oid, subview.* FROM ( SELECT t_lieux.code_original_1, t_lieux.code_original_2, t_lieux.code_original_3, t_lieux.code_original_4, t_lieux.code_original_5, ('*'||new_unite_fonctionnelle_code) AS code_original_6, t_lieux.code_original_7, t_lieux.service_facturation_id, t_lieux.activite_id, t_lieux.lit_id, t_lieux.unite_medicale_id, new_unite_fonctionnelle_id AS unite_fonctionnelle_id, t_lieux.mode_traitement_id FROM activite.t_lieux JOIN w_transform_uf_2 ON t_lieux.oid = w_transform_uf_2.lieu_id LEFT JOIN activite.t_lieux t_lieux_deja ON t_lieux.service_facturation_id = t_lieux_deja.service_facturation_id AND t_lieux.activite_id = t_lieux_deja.activite_id AND t_lieux.lit_id = t_lieux_deja.lit_id AND t_lieux.unite_medicale_id = t_lieux_deja.unite_medicale_id AND new_unite_fonctionnelle_id = t_lieux_deja.unite_fonctionnelle_id WHERE t_lieux_deja.oid IS NULL GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13 ) subview; UPDATE w_transform_uf_2 SET new_lieu_id = t_lieux.oid FROM activite.t_lieux WHERE t_lieux.service_facturation_id = w_transform_uf_2.service_facturation_id AND t_lieux.activite_id = w_transform_uf_2.activite_id AND t_lieux.lit_id = w_transform_uf_2.lit_id AND t_lieux.unite_medicale_id = w_transform_uf_2.unite_medicale_id AND t_lieux.unite_fonctionnelle_id = w_transform_uf_2.new_unite_fonctionnelle_id; RAISE NOTICE '%' , 'Ventilation Specialite. Modification séjours'; UPDATE activite.p_mouvements_sejour SET lieu_id = new_lieu_id FROM w_transform_uf_2 WHERE w_transform_uf_2.no_sejour = p_mouvements_sejour.no_sejour AND w_transform_uf_2.lieu_id = p_mouvements_sejour.lieu_id; UPDATE activite.p_sejours SET lieu_sortie_id = new_lieu_id FROM w_transform_uf_2 WHERE w_transform_uf_2.no_sejour = p_sejours.no_sejour AND w_transform_uf_2.lieu_id = p_sejours.lieu_sortie_id; UPDATE activite.p_factures_lignes_c SET lieu_id = new_lieu_id FROM w_transform_uf_2 JOIN activite.p_factures on p_factures.no_sejour = w_transform_uf_2.no_sejour WHERE p_factures_lignes_c.no_facture = p_factures.no_facture AND w_transform_uf_2.lieu_id = p_factures_lignes_c.lieu_id; UPDATE activite.p_factures_lignes_h SET lieu_id = new_lieu_id FROM w_transform_uf_2 JOIN activite.p_factures on p_factures.no_sejour = w_transform_uf_2.no_sejour WHERE p_factures_lignes_h.no_facture = p_factures.no_facture AND w_transform_uf_2.lieu_id = p_factures_lignes_h.lieu_id; END IF; END IF; RETURN 'OK'; END;