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;