return: text lang: plpgsql src: | DECLARE BEGIN -- Ne faire que si un service est concerné IF NOT EXISTS (SELECT * FROM activite.t_services_facturation WHERE COALESCE(prestations_presence,'') <> '') THEN RETURN 'OK. Non concerné' ; END IF; RAISE NOTICE '%' , 'Initialisations. identification journees'; -- Identification des journées selon lignes facturées DROP TABLE IF EXISTS w_mouvements_seances; CREATE TEMP TABLE w_mouvements_seances AS SELECT no_sejour, p_factures_lignes_c.date_debut FROM activite.p_factures_lignes_c JOIN activite.p_factures ON p_factures_lignes_c.no_facture = p_factures.no_facture JOIN activite.t_lieux ON lieu_id = t_lieux.oid JOIN activite.t_services_facturation ON service_facturation_id = t_services_facturation.oid JOIN activite.t_prestations ON prestation_id = t_prestations.oid WHERE t_prestations.code <> '' AND t_services_facturation.prestations_presence <> '' AND t_prestations.code ILIKE ANY (string_to_array(translate(prestations_presence,'*,','% '),' ')) GROUP BY 1,2; CREATE INDEX w_mouvements_seances_i1 ON w_mouvements_seances USING btree (no_sejour); -- Identification des journées selon lignes non facturées INSERT INTO w_mouvements_seances SELECT p_factures.no_sejour, p_factures_lignes_c.date_debut 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_lieux ON lieu_id = t_lieux.oid JOIN activite.t_services_facturation ON service_facturation_id = t_services_facturation.oid JOIN activite.t_prestations ON prestation_id = t_prestations.oid LEFT JOIN w_mouvements_seances ON w_mouvements_seances.no_sejour = p_factures.no_sejour AND w_mouvements_seances.date_debut = p_factures_lignes_c.date_debut WHERE t_prestations.code <> '' AND w_mouvements_seances.no_sejour IS NULL AND t_services_facturation.prestations_presence <> '' AND (t_prestations.code ILIKE ANY (string_to_array(translate(prestations_presence,'*,','% '),' '))) GROUP BY 1,2; -- Détection nouvelles journées pour les services concernés RAISE NOTICE '%' , 'Initialisations. Preparation mouvements'; DROP TABLE IF EXISTS w_mouvements_nouveaux; CREATE TEMP TABLE w_mouvements_nouveaux AS SELECT p_mouvements_sejour.no_sejour, p_mouvements_sejour.date, p_mouvements_sejour.heure_debut, CASE WHEN w_mouvements_seances.no_sejour IS NOT NULL THEN p_mouvements_sejour.nb_jours_js_non_inclus ELSE 0 END AS nb_jours_js_non_inclus, CASE WHEN w_mouvements_seances.no_sejour IS NOT NULL THEN p_mouvements_sejour.nb_jours_js_inclus ELSE 0 END AS nb_jours_js_inclus, CASE WHEN w_mouvements_seances.no_sejour IS NOT NULL THEN p_mouvements_sejour.est_jour_hospitalisation ELSE '0' END AS est_jour_hospitalisation, CASE WHEN w_mouvements_seances.no_sejour IS NOT NULL THEN p_mouvements_sejour.est_chambre_particuliere ELSE '0' END AS est_chambre_particuliere, CASE WHEN w_mouvements_seances.no_sejour IS NOT NULL THEN p_mouvements_sejour.est_chambre_particuliere_facturee ELSE '0' END AS est_chambre_particuliere_facturee, CASE WHEN w_mouvements_seances.no_sejour IS NOT NULL THEN p_mouvements_sejour.est_facture ELSE '0' END AS est_facture, CASE WHEN w_mouvements_seances.no_sejour IS NOT NULL THEN p_mouvements_sejour.nb_jours_d ELSE 0 END AS nb_jours_d, CASE WHEN w_mouvements_seances.no_sejour IS NOT NULL THEN p_mouvements_sejour.nb_jours_f ELSE 0 END AS nb_jours_f, CASE WHEN w_mouvements_seances.no_sejour IS NOT NULL THEN p_mouvements_sejour.nb_jours_12 ELSE 0 END AS nb_jours_12, CASE WHEN w_mouvements_seances.no_sejour IS NOT NULL THEN p_mouvements_sejour.nb_jours_prorata ELSE 0 END AS nb_jours_prorata, CASE WHEN w_mouvements_seances.no_sejour IS NOT NULL THEN p_mouvements_sejour.nb_jours_cp_d ELSE 0 END AS nb_jours_cp_d, CASE WHEN w_mouvements_seances.no_sejour IS NOT NULL THEN p_mouvements_sejour.nb_jours_cp_f ELSE 0 END AS nb_jours_cp_f, CASE WHEN w_mouvements_seances.no_sejour IS NOT NULL THEN p_mouvements_sejour.nb_jours_cp_12 ELSE 0 END AS nb_jours_cp_12 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 LEFT JOIN w_mouvements_seances ON p_mouvements_sejour.no_sejour = w_mouvements_seances.no_sejour AND p_mouvements_sejour.date = w_mouvements_seances.date_debut WHERE t_services_facturation.prestations_presence <> '' AND w_mouvements_seances.no_sejour IS NULL; CREATE INDEX w_mouvements_nouveaux_i1 ON w_mouvements_nouveaux USING btree (no_sejour); -- Modification table des mouvements de séjour RAISE NOTICE '%' , 'Initialisations. Modification mouvements'; UPDATE activite.p_mouvements_sejour SET nb_jours_js_non_inclus = w_mouvements_nouveaux.nb_jours_js_non_inclus, nb_jours_js_inclus = w_mouvements_nouveaux.nb_jours_js_inclus, est_jour_hospitalisation = w_mouvements_nouveaux.est_jour_hospitalisation, est_chambre_particuliere = w_mouvements_nouveaux.est_chambre_particuliere, est_chambre_particuliere_facturee = w_mouvements_nouveaux.est_chambre_particuliere_facturee, est_facture = w_mouvements_nouveaux.est_facture, nb_jours_d = w_mouvements_nouveaux.nb_jours_d , nb_jours_f = w_mouvements_nouveaux.nb_jours_f , nb_jours_12 = w_mouvements_nouveaux.nb_jours_12, nb_jours_prorata = w_mouvements_nouveaux.nb_jours_prorata, nb_jours_cp_d = w_mouvements_nouveaux.nb_jours_cp_d, nb_jours_cp_f = w_mouvements_nouveaux.nb_jours_cp_f, nb_jours_cp_12 = w_mouvements_nouveaux.nb_jours_cp_12 FROM w_mouvements_nouveaux WHERE p_mouvements_sejour.no_sejour = w_mouvements_nouveaux.no_sejour AND p_mouvements_sejour.date = w_mouvements_nouveaux.date AND p_mouvements_sejour.heure_debut = w_mouvements_nouveaux.heure_debut AND ( p_mouvements_sejour.nb_jours_js_non_inclus IS DISTINCT FROM w_mouvements_nouveaux.nb_jours_js_non_inclus OR p_mouvements_sejour.nb_jours_js_inclus IS DISTINCT FROM w_mouvements_nouveaux.nb_jours_js_inclus OR p_mouvements_sejour.est_jour_hospitalisation IS DISTINCT FROM w_mouvements_nouveaux.est_jour_hospitalisation OR p_mouvements_sejour.est_chambre_particuliere IS DISTINCT FROM w_mouvements_nouveaux.est_chambre_particuliere OR p_mouvements_sejour.est_chambre_particuliere_facturee IS DISTINCT FROM w_mouvements_nouveaux.est_chambre_particuliere_facturee OR p_mouvements_sejour.est_facture IS DISTINCT FROM w_mouvements_nouveaux.est_facture OR p_mouvements_sejour.nb_jours_d IS DISTINCT FROM w_mouvements_nouveaux.nb_jours_d OR p_mouvements_sejour.nb_jours_f IS DISTINCT FROM w_mouvements_nouveaux.nb_jours_f OR p_mouvements_sejour.nb_jours_12 IS DISTINCT FROM w_mouvements_nouveaux.nb_jours_12 OR p_mouvements_sejour.nb_jours_prorata IS DISTINCT FROM w_mouvements_nouveaux.nb_jours_prorata OR p_mouvements_sejour.nb_jours_cp_d IS DISTINCT FROM w_mouvements_nouveaux.nb_jours_cp_d OR p_mouvements_sejour.nb_jours_cp_f IS DISTINCT FROM w_mouvements_nouveaux.nb_jours_cp_f OR p_mouvements_sejour.nb_jours_cp_12 IS DISTINCT FROM w_mouvements_nouveaux.nb_jours_cp_12 ); ANALYZE activite.p_mouvements_sejour; RETURN 'OK' ; END;