return: text lang: plpgsql src: | DECLARE result TEXT; BEGIN -- Réplication des médecins dans Base IF EXISTS (SELECT * FROM activite.t_medecins_administratifs WHERE oid <> 0 AND COALESCE(medecin_id,0) = 0) THEN BEGIN PERFORM base.cti_initialize_medecins(); EXCEPTION WHEN others THEN RAISE NOTICE 'Erreur %' , 'base.cti_initialize_medecins'; END; END IF; BEGIN -- Mise à jour code médecin UPDATE base.t_medecins SET code = subview.code FROM ( SELECT medecin_id, (MAX(Array[date_entree::text, t_medecins_administratifs.code]))[2] AS code FROM activite.p_sejours JOIN activite.t_medecins_administratifs ON medecin_sejour_id = t_medecins_administratifs.oid JOIN base.t_medecins ON t_medecins_administratifs.medecin_id = t_medecins.oid AND t_medecins.oid <> 0 AND (t_medecins.code = '' OR t_medecins.code IS NULL) GROUP BY 1 ) subview WHERE t_medecins.oid = subview.medecin_id; UPDATE base.t_medecins SET code = subview.code FROM ( SELECT medecin_id, (MAX(Array[date_debut::text, t_medecins_administratifs.code]))[2] AS code FROM activite.p_factures_lignes_h JOIN activite.t_medecins_administratifs ON p_factures_lignes_h.medecin_facture_id = t_medecins_administratifs.oid JOIN base.t_medecins ON t_medecins_administratifs.medecin_id = t_medecins.oid AND t_medecins.oid <> 0 AND (t_medecins.code = '' OR t_medecins.code IS NULL) GROUP BY 1 ) subview WHERE t_medecins.oid = subview.medecin_id; UPDATE base.t_medecins SET code = subview.code FROM ( SELECT medecin_id, (MAX(Array[date_debut::text, t_medecins_administratifs.code]))[2] AS code FROM activite.p_factures_lignes_non_facturees_h JOIN activite.t_medecins_administratifs ON p_factures_lignes_non_facturees_h.medecin_facture_id = t_medecins_administratifs.oid JOIN base.t_medecins ON t_medecins_administratifs.medecin_id = t_medecins.oid AND t_medecins.oid <> 0 AND (t_medecins.code = '' OR t_medecins.code IS NULL) GROUP BY 1 ) subview WHERE t_medecins.oid = subview.medecin_id; UPDATE base.t_medecins SET code = subview.code FROM ( SELECT medecin_id, (MIN(Array[to_char(t_medecins_administratifs.oid,'FM000000000000000000000000'), t_medecins_administratifs.code]))[2] AS code FROM activite.t_medecins_administratifs JOIN base.t_medecins ON t_medecins_administratifs.medecin_id = t_medecins.oid AND t_medecins.oid <> 0 AND (t_medecins.code = '' OR t_medecins.code IS NULL) GROUP BY 1 ) subview WHERE t_medecins.oid = subview.medecin_id; UPDATE base.t_medecins SET code = subview.code FROM ( SELECT t_medecins_administratifs.medecin_id, MAX(t_medecins_administratifs.code) AS code FROM activite.t_medecins_administratifs JOIN base.t_medecins ON t_medecins_administratifs.medecin_id = t_medecins.oid LEFT JOIN activite.t_budget_cle_rule ON t_medecins.code <> '' AND t_budget_cle_rule.liste_medecin LIKE '(R)%' AND t_budget_cle_rule.liste_medecin LIKE '%'||t_medecins.code||'%' WHERE t_medecins_administratifs.oid <> 0 AND t_medecins_administratifs.medecin_id <> 0 AND t_budget_cle_rule.oid IS NULL GROUP BY 1 HAVING count(*) = 1 AND MAX(t_medecins_administratifs.code) <> MAX(t_medecins.code) ) subview WHERE t_medecins.oid = subview.medecin_id ; EXCEPTION WHEN others THEN RAISE NOTICE 'Erreur %' , '1'; END; BEGIN INSERT INTO base.t_specialites_medecin (code_original, code, texte, texte_court) SELECT t_specialites_internes_pmsi.code, t_specialites_internes_pmsi.code, t_specialites_internes_pmsi.texte, t_specialites_internes_pmsi.texte FROM base.t_medecins JOIN activite.t_medecins_administratifs ON medecin_id = t_medecins.oid JOIN pmsi.t_medecins t_medecins_pmsi ON t_medecins_administratifs.code = t_medecins_pmsi.code JOIN pmsi.t_specialites_internes_medecin t_specialites_internes_pmsi ON t_medecins_pmsi.specialite_interne_id = t_specialites_internes_pmsi.oid WHERE t_medecins.specialite_id = 0 AND t_specialites_internes_pmsi.code NOT IN (SELECT code_original FROM base.t_specialites_medecin) GROUP BY 1,2,3,4; EXCEPTION WHEN others THEN RAISE NOTICE 'Erreur %' , '2'; END; BEGIN UPDATE base.t_medecins SET specialite_id = t_specialites_medecin.oid FROM activite.t_medecins_administratifs JOIN pmsi.t_medecins t_medecins_pmsi ON t_medecins_administratifs.code = t_medecins_pmsi.code JOIN pmsi.t_specialites_internes_medecin t_specialites_internes_pmsi ON t_medecins_pmsi.specialite_interne_id = t_specialites_internes_pmsi.oid JOIN base.t_specialites_medecin ON t_specialites_internes_pmsi.code = t_specialites_medecin.code_original WHERE t_medecins_administratifs.medecin_id = t_medecins.oid AND t_medecins.specialite_id = 0; EXCEPTION WHEN others THEN RAISE NOTICE 'Erreur %' , '3'; END; -- Mise à jour du code rpps médecin des médecins administratifs depuis les données du module base BEGIN UPDATE activite.t_medecins_administratifs SET code_rpps = subview.code_rpps FROM ( SELECT t_medecins.code_rpps, t_medecins.oid FROM base.t_medecins JOIN activite.t_medecins_administratifs ON t_medecins_administratifs.medecin_id = t_medecins.oid WHERE t_medecins.code_rpps <> '' AND medecin_id <> 0 ) subview WHERE t_medecins_administratifs.code_rpps = '' AND t_medecins_administratifs.medecin_id = subview.oid ; EXCEPTION WHEN others THEN RAISE NOTICE 'Erreur %' , 'Mise à jour des code rpps médecins'; END; -- Conditions d'exercice, alimentation automatique d'une classe BEGIN INSERT INTO activite.t_classes( code, texte, table_id, is_cti, sequence, contenu_by_code, contenu_non_replicable_ailleurs ) SELECT 'CTI_MEDLIBSAL'::text AS code, 'Conditions d''exercice'::text AS texte, t_listes_tables.oid AS table_id, '1'::text AS is_cti, (SELECT COALESCE(MAX(sequence),0)+1 FROM activite.t_classes JOIN activite.t_listes_tables ON t_classes.table_id = t_listes_tables.oid AND t_listes_tables.code = 'MEDECIN' WHERE sequence < 30) AS sequence, '0'::text AS contenu_by_code, '1'::text AS contenu_non_replicable_ailleurs FROM activite.t_listes_tables WHERE t_listes_tables.Code = 'MEDECIN' AND 'CTI_MEDLIBSAL'::text NOT IN (SELECT code FROM activite.t_classes) ; INSERT INTO activite.t_classes_sections( code, texte, classe_id, condition, include_code, exclude_code ) SELECT '1'::text AS code, 'Libéraux'::text AS texte, t_classes.oid AS classe_id, ''::text AS condition, ''::text AS include_code, ''::text AS exclude_code FROM activite.t_classes WHERE t_classes.code = 'CTI_MEDLIBSAL' AND (t_classes.oid::text||'-1') NOT IN (SELECT classe_id::text||'-'||code FROM activite.t_classes_sections WHERE code IS NOT NULL) ; INSERT INTO activite.t_classes_sections( code, texte, classe_id, condition, include_code, exclude_code ) SELECT '2'::text AS code, 'Salariés'::text AS texte, t_classes.oid AS classe_id, ''::text AS condition, ''::text AS include_code, ''::text AS exclude_code FROM activite.t_classes WHERE t_classes.code = 'CTI_MEDLIBSAL' AND (t_classes.oid::text||'-2') NOT IN (SELECT classe_id::text||'-'||code FROM activite.t_classes_sections WHERE code IS NOT NULL) ; DROP TABLE IF EXISTS w_classe_CTI_MEDLIBSAL; CREATE TEMP TABLE w_classe_CTI_MEDLIBSAL AS SELECT t_medecins_administratifs.oid AS to_id, MIN(classe_id) AS classe_id, MIN(section_id_1) AS section_id_1, MIN(section_id_2) AS section_id_2, MIN(CASE WHEN est_medecin_salarie = '1' OR t_medecins.numero_ordre = t_finess.code THEN section_id_2 ELSE section_id_1 END) AS section_id FROM activite.t_medecins_administratifs LEFT JOIN base.t_finess ON t_finess.secondaire = '0' LEFT JOIN base.t_medecins ON t_medecins_administratifs.medecin_id = t_medecins.oid JOIN ( SELECT classe_id, MAX(CASE WHEN t_classes_sections.code = '1' THEN t_classes_sections.oid ELSE 0 END) AS section_id_1, MAX(CASE WHEN t_classes_sections.code = '2' THEN t_classes_sections.oid ELSE 0 END) AS section_id_2 FROM activite.t_classes JOIN activite.t_classes_sections ON classe_id = t_classes.oid WHERE t_classes.code = 'CTI_MEDLIBSAL' GROUP BY 1 ) subview ON 1=1 GROUP BY 1 ; DELETE FROM activite.t_classes_sections_elements USING w_classe_CTI_MEDLIBSAL WHERE t_classes_sections_elements.to_id = w_classe_CTI_MEDLIBSAL.to_id AND t_classes_sections_elements.section_id = section_id_2 AND w_classe_CTI_MEDLIBSAL.section_id = section_id_1 ; DELETE FROM activite.t_classes_sections_elements USING w_classe_CTI_MEDLIBSAL WHERE t_classes_sections_elements.to_id = w_classe_CTI_MEDLIBSAL.to_id AND t_classes_sections_elements.section_id = section_id_1 AND w_classe_CTI_MEDLIBSAL.section_id = section_id_2 ; INSERT INTO activite.t_classes_sections_elements(section_id, to_id) SELECT section_id, to_id FROM w_classe_CTI_MEDLIBSAL WHERE (section_id::text||to_id::text) NOT IN (SELECT (section_id::text||to_id::text) FROM activite.t_classes_sections_elements) ; PERFORM activite.cti_update_schema_classes('MEDECIN') ; EXCEPTION WHEN others THEN RAISE NOTICE 'Erreur %' , '4'; END; BEGIN UPDATE activite.t_medecins_administratifs_c SET adm_code = t_medecins_administratifs.code, adm_nom = t_medecins_administratifs.nom, adm_prenom = t_medecins_administratifs.prenom, adm_nom_prenom = (t_medecins_administratifs.nom || ' ') || t_medecins_administratifs.prenom, medecin_id = t_medecins_administratifs.medecin_id, medecin_code = COALESCE(t_medecins.code,''), nom = t_medecins.nom, prenom = t_medecins.prenom, nom_prenom = (t_medecins.nom || ' ') || t_medecins.prenom, specialite_id = t_medecins.specialite_id, specialite_code = t_specialites_medecin.code, specialite_texte = t_specialites_medecin.texte_court FROM activite.t_medecins_administratifs, base.t_medecins, base.t_specialites_medecin WHERE t_medecins_administratifs_c.oid = t_medecins_administratifs.oid AND t_medecins_administratifs.medecin_id = t_medecins.oid AND t_medecins.specialite_id = t_specialites_medecin.oid AND ( t_medecins_administratifs_c.adm_code IS DISTINCT FROM t_medecins_administratifs.code OR t_medecins_administratifs_c.adm_nom IS DISTINCT FROM t_medecins_administratifs.nom OR t_medecins_administratifs_c.adm_prenom IS DISTINCT FROM t_medecins_administratifs.prenom OR t_medecins_administratifs_c.adm_nom_prenom IS DISTINCT FROM (t_medecins_administratifs.nom || ' ' || t_medecins_administratifs.prenom) OR t_medecins_administratifs_c.medecin_id IS DISTINCT FROM t_medecins_administratifs.medecin_id OR t_medecins_administratifs_c.medecin_code IS DISTINCT FROM COALESCE (t_medecins.code,'') OR t_medecins_administratifs_c.nom IS DISTINCT FROM t_medecins.nom OR t_medecins_administratifs_c.prenom IS DISTINCT FROM t_medecins.prenom OR t_medecins_administratifs_c.nom_prenom IS DISTINCT FROM (t_medecins.nom || ' ' || t_medecins.prenom) OR t_medecins_administratifs_c.specialite_id IS DISTINCT FROM t_medecins.specialite_id OR t_medecins_administratifs_c.specialite_code IS DISTINCT FROM t_specialites_medecin.code OR t_medecins_administratifs_c.specialite_texte IS DISTINCT FROM t_specialites_medecin.texte_court ); EXCEPTION WHEN others THEN RAISE NOTICE 'Erreur %' , '5'; END; BEGIN INSERT INTO activite.t_medecins_administratifs_c( oid, adm_code, adm_nom, adm_prenom, adm_nom_prenom, medecin_id, medecin_code, nom, prenom, nom_prenom, specialite_id, specialite_code, specialite_texte) SELECT t_medecins_administratifs.oid, t_medecins_administratifs.code, t_medecins_administratifs.nom, t_medecins_administratifs.prenom, (t_medecins_administratifs.nom::text || ' '::text) || t_medecins_administratifs.prenom::text, t_medecins_administratifs.medecin_id, COALESCE(t_medecins.code,''), t_medecins.nom, t_medecins.prenom, (t_medecins.nom::text || ' '::text) || t_medecins.prenom::text, t_medecins.specialite_id, t_specialites_medecin.code, t_specialites_medecin.texte_court FROM activite.t_medecins_administratifs, base.t_medecins, base.t_specialites_medecin WHERE t_medecins_administratifs.medecin_id = t_medecins.oid AND t_medecins.specialite_id = t_specialites_medecin.oid AND t_medecins_administratifs.oid NOT IN (SELECT oid FROM activite.t_medecins_administratifs_c) ORDER BY t_medecins_administratifs.oid; UPDATE activite.t_medecins_administratifs_c SET medecin_code = subview.code FROM (SELECT subview.medecin_id, t_medecins_administratifs.code FROM activite.t_medecins_administratifs, (SELECT medecin_id, min(oid) AS oid FROM activite.t_medecins_administratifs WHERE medecin_id <> 0 GROUP BY 1) subview WHERE t_medecins_administratifs.oid = subview.oid) subview WHERE t_medecins_administratifs_c.medecin_id = subview.medecin_id AND medecin_code = ''; EXCEPTION WHEN others THEN RAISE NOTICE 'Erreur %' , '6'; END; RETURN 'OK'; END;