return: text
lang: plpgsql
src: |
  DECLARE	
  	result TEXT;
  	_module_pmsimco TEXT;
  	_with_acte TEXT;
  BEGIN
  
  		RAISE NOTICE '%' , 'Initialisation';  
  		
  		IF (SELECT count(*) FROM activite.t_compte_produit_analytique_rule) = 0 THEN
  			RETURN 'OK. Aucune regle';
  		END IF;
  		
  		RAISE NOTICE '%' , 'Application des regles'; 
  
  		-- pmsi mco ?
  		_module_pmsimco = '0';
  		IF EXISTS (SELECT * FROM pg_tables WHERE schemaname = 'pmsi' AND tablename = 'p_rss') THEN
  			IF (SELECT count(*)
  				FROM activite.t_compte_produit_analytique_rule
  				WHERE 
  					COALESCE(liste_diagnostic_principal,'') <> '' OR
  					COALESCE(liste_diagnostic_relie,'') <> '' OR
  					COALESCE(liste_diagnostic_associe,'') <> '') > 1 THEN
  				_module_pmsimco = '1';
  				RAISE NOTICE '%' , 'Application des regles. Avec PMSI MCO'; 
  			END IF;
  		END IF;
  
  		-- Rubriques ?
  		_with_acte = '0';
  		IF (SELECT count(*)
  			FROM activite.t_compte_produit_analytique_rule
  			WHERE COALESCE(liste_acte,'') <> ''
  			) > 0 THEN
  			_with_acte = '1';
  		END IF;
  	 
  		-- Sejours et RSS à Traiter
  
  		RAISE NOTICE '%' , 'Application des regles. Identification des sejours'; 
  		DROP SEQUENCE IF EXISTS w_factures_sequence;
  		CREATE SEQUENCE w_factures_sequence;
  		
  		DROP TABLE IF EXISTS w_factures;
  		CREATE TEMP TABLE w_factures AS
  		SELECT
  			nextval('w_factures_sequence'::regclass) AS oid,
  			COALESCE(t_finess.oid,0) AS finess_id,
  			p_sejours.oid AS sejour_id, 
  			p_sejours.no_sejour AS no_sejour, 
  			p_factures.no_facture AS no_facture, 
  			0::bigint AS diagnostic_principal_id,
  			0::bigint AS diagnostic_relie_id,
  			NULL::bigint[] AS diagnostic_associe_liste_rule_id,
  			NULL::bigint[] AS acte_liste_rule_id,
  			p_sejours.ghm_id AS ghm_id,
  			medecin_sejour_id,
  			COALESCE(t_medecins_base.specialite_id,0) AS specialite_sejour_id,
  			p_sejours.type_sejour,
  			p_sejours.lieu_sortie_id,
  			t_lieux.unite_fonctionnelle_id AS unite_fonctionnelle_sortie_id,
  			t_lieux.service_facturation_id AS service_facturation_sortie_id,
  			t_lits.etage_id AS etage_sortie_id,
  			t_lieux.activite_id AS activite_sortie
  		FROM activite.p_sejours
  		JOIN activite.p_factures ON p_sejours.no_sejour = p_factures.no_sejour
  		JOIN activite.t_lieux ON p_sejours.lieu_sortie_id = t_lieux.oid
  		JOIN activite.t_lits ON lit_id =t_lits.oid
  		LEFT JOIN activite.t_medecins_administratifs ON medecin_sejour_id = t_medecins_administratifs.oid
  		LEFT JOIN base.t_medecins t_medecins_base ON t_medecins_administratifs.medecin_id = t_medecins_base.oid
  		LEFT JOIN base.t_finess ON p_sejours.finess = t_finess.code
  		;
  		
  		
  		UPDATE w_factures
  		SET finess_id = (SELECT MAX(finess_id) FROM w_factures WHERE finess_id <> 0)
  		WHERE finess_id = 0 AND (SELECT MAX(finess_id) FROM w_factures WHERE finess_id <> 0) <> 0;
  		UPDATE w_factures
  		SET finess_id = (SELECT MAX(oid) FROM base.t_finess)
  		WHERE finess_id = 0;
  		CREATE INDEX w_factures_i0 ON w_factures USING btree (oid);
  		CREATE INDEX w_factures_i1 ON w_factures USING btree (sejour_id);
  		CREATE INDEX w_factures_i2 ON w_factures USING btree (no_sejour);
  		CREATE INDEX w_factures_i3 ON w_factures USING btree (no_facture);
  
  		ANALYSE w_factures
  		;
  
  
  
  
  		DROP TABLE IF EXISTS w_factures_encours;
  		CREATE TEMP TABLE w_factures_encours AS
  		SELECT
  			nextval('w_factures_sequence'::regclass) AS oid,
  			COALESCE(t_finess.oid,0) AS finess_id,
  			p_sejours.oid AS sejour_id, 
  			p_sejours.no_sejour AS no_sejour, 
  			p_factures_encours.no_facture AS no_facture, 
  			0::bigint AS diagnostic_principal_id,
  			0::bigint AS diagnostic_relie_id,
  			NULL::bigint[] AS diagnostic_associe_liste_rule_id,
  			NULL::bigint[] AS acte_liste_rule_id,
  			p_factures_encours.ghm_id AS ghm_id,
  			p_sejours.medecin_sejour_id,
  			COALESCE(t_medecins_base.specialite_id,0) AS specialite_sejour_id,
  			p_factures_encours.type_sejour,
  			p_factures_encours.lieu_sortie_id,
  			t_lieux.unite_fonctionnelle_id AS unite_fonctionnelle_sortie_id,
  			t_lieux.service_facturation_id AS service_facturation_sortie_id,
  			t_lits.etage_id AS etage_sortie_id,
  			t_lieux.activite_id AS activite_sortie
  		FROM activite.p_sejours
  		JOIN activite.p_factures_encours ON p_sejours.no_sejour = p_factures_encours.no_sejour
  		JOIN activite.t_lieux ON p_factures_encours.lieu_sortie_id = t_lieux.oid
  		JOIN activite.t_lits ON lit_id = t_lits.oid
  		LEFT JOIN activite.t_medecins_administratifs ON p_sejours.medecin_sejour_id = t_medecins_administratifs.oid
  		LEFT JOIN base.t_medecins t_medecins_base ON t_medecins_administratifs.medecin_id = t_medecins_base.oid
  		LEFT JOIN base.t_finess ON p_sejours.finess = t_finess.code
  		;
  		
  		
  		UPDATE w_factures_encours
  		SET finess_id = (SELECT MAX(finess_id) FROM w_factures WHERE finess_id <> 0)
  		WHERE finess_id = 0 AND (SELECT MAX(finess_id) FROM w_factures WHERE finess_id <> 0) <> 0;
  		UPDATE w_factures_encours
  		SET finess_id = (SELECT MAX(oid) FROM base.t_finess)
  		WHERE finess_id = 0;
  		CREATE INDEX w_factures_encours_i0 ON w_factures_encours USING btree (oid);
  		CREATE INDEX w_factures_encours_i1 ON w_factures_encours USING btree (sejour_id);
  		CREATE INDEX w_factures_encours_i2 ON w_factures_encours USING btree (no_sejour);
  		CREATE INDEX w_factures_encours_i3 ON w_factures_encours USING btree (no_facture);
  
  		ANALYSE w_factures_encours
  		;
  			
  		-- Traduction des règles en oid
  		RAISE NOTICE '%' , 'Application des regles. Traduction en oid'; 
  		DROP TABLE IF EXISTS w_execute_compte_produit_analytique_rule;
  		CREATE TEMP TABLE w_execute_compte_produit_analytique_rule AS
  		SELECT
  			t_compte_produit_analytique_rule.oid,
  			compte_produit_analytique_id,
  			CASE WHEN priorite <> 0 THEN priorite WHEN liste_diagnostic_principal <> '' THEN 90000 ELSE 999999 END AS priorite,
  			CASE WHEN liste_finess <> '' THEN '1' ELSE '0' END AS a_liste_finess,
  			string_to_array(translate(liste_finess,'*,','% '),' ') AS liste_finess,
  			NULL::bigint[] AS liste_finess_id ,
  			CASE WHEN liste_diagnostic_principal <> '' THEN '1' ELSE '0' END AS a_liste_diagnostic_principal,
  			string_to_array(translate(liste_diagnostic_principal,'*,','% '),' ') AS liste_diagnostic_principal,
  			NULL::bigint[] AS liste_diagnostic_principal_id ,
  			CASE WHEN liste_diagnostic_relie <> '' THEN '1' ELSE '0' END AS a_liste_diagnostic_relie,
  			string_to_array(translate(liste_diagnostic_relie,'*,','% '),' ') AS liste_diagnostic_relie,
  			NULL::bigint[] AS liste_diagnostic_relie_id ,
  			CASE WHEN liste_diagnostic_associe <> '' THEN '1' ELSE '0' END AS a_liste_diagnostic_associe,
  			string_to_array(translate(liste_diagnostic_associe,'*,','% '),' ') AS liste_diagnostic_associe,
  			NULL::bigint[] AS liste_diagnostic_associe_id ,
  			CASE WHEN liste_acte <> '' THEN '1' ELSE '0' END AS a_liste_acte,
  			string_to_array(translate(liste_acte,'*,','% '),' ') AS liste_acte,
  			NULL::bigint[] AS liste_acte_base_id ,
  			CASE WHEN liste_ghm <> '' THEN '1' ELSE '0' END AS a_liste_ghm,
  			string_to_array(translate(liste_ghm,'*,','% '),' ') AS liste_ghm,
  			NULL::bigint[] AS liste_ghm_id,
  			liste_ghm AS liste_ghm_origine,
  			CASE WHEN liste_sauf_ghm <> '' THEN '1' ELSE '0' END AS a_liste_sauf_ghm,
  			string_to_array(translate(liste_sauf_ghm,'*,','% '),' ') AS liste_sauf_ghm,
  			NULL::bigint[] AS liste_sauf_ghm_id ,
  			liste_sauf_ghm AS liste_sauf_ghm_origine,
  			CASE WHEN liste_type_sejour <> '' THEN '1' ELSE '0' END AS a_liste_type_sejour,
  			string_to_array(translate(liste_type_sejour,'*,','% '),' ') AS liste_type_sejour,
  			NULL::text[] AS liste_type_sejour_id ,
  			CASE WHEN liste_unite_fonctionnelle <> '' THEN '1' ELSE '0' END AS a_liste_unite_fonctionnelle,
  			string_to_array(translate(liste_unite_fonctionnelle,'*,','% '),' ') AS liste_unite_fonctionnelle,
  			NULL::bigint[] AS liste_unite_fonctionnelle_id ,
  			CASE WHEN liste_service <> '' THEN '1' ELSE '0' END AS a_liste_service,
  			string_to_array(translate(liste_service,'*,','% '),' ') AS liste_service,
  			NULL::bigint[] AS liste_service_id ,
  			CASE WHEN liste_etage <> '' THEN '1' ELSE '0' END AS a_liste_etage,
  			string_to_array(translate(liste_etage,'*,','% '),' ') AS liste_etage,
  			NULL::bigint[] AS liste_etage_id ,
  			CASE WHEN liste_activite <> '' THEN '1' ELSE '0' END AS a_liste_activite,
  			string_to_array(translate(liste_activite,'*,','% '),' ') AS liste_activite,
  			NULL::bigint[] AS liste_activite_id ,
  			CASE WHEN liste_medecin <> '' THEN '1' ELSE '0' END AS a_liste_medecin,
  			string_to_array(CASE WHEN liste_medecin NOT LIKE '%**%' THEN translate(liste_medecin,'*,','% ') ELSE liste_medecin END,' ') AS liste_medecin,
  			NULL::bigint[] AS liste_medecin_activite_id ,
  			CASE WHEN liste_specialite <> '' THEN '1' ELSE '0' END AS a_liste_specialite,
  			string_to_array(translate(liste_specialite,'*,','% '),' ') AS liste_specialite,
  			NULL::bigint[] AS liste_specialite_activite_id ,
  			CASE WHEN liste_compte_produit <> '' THEN '1' ELSE '0' END AS a_liste_compte_produit,
  			string_to_array(translate(liste_compte_produit,'*,','% '),' ') AS liste_compte_produit,
  			NULL::bigint[] AS liste_compte_produit_id,
  			CASE WHEN liste_rubrique <> '' THEN '1' ELSE '0' END AS a_liste_rubrique,
  			string_to_array(translate(liste_rubrique,'*,','% '),' ') AS liste_rubrique,
  			NULL::bigint[] AS liste_rubrique_id,
  			CASE WHEN liste_prestation <> '' THEN '1' ELSE '0' END AS a_liste_prestation,
  			string_to_array(translate(liste_prestation,'*,','% '),' ') AS liste_prestation,
  			NULL::bigint[] AS liste_prestation_id
  		FROM activite.t_compte_produit_analytique_rule
  		JOIN activite.t_compte ON compte_produit_analytique_id = t_compte.oid 
  		ORDER BY priorite, compte_produit_analytique_id;
  
  
  		
  		UPDATE w_execute_compte_produit_analytique_rule 
  		SET liste_finess_id = (SELECT base.cti_group_array3(oid) FROM base.t_finess WHERE code LIKE ANY (liste_finess))
  		WHERE a_liste_finess = '1';	
  		
  		IF _module_pmsimco = '1' THEN
  			UPDATE w_execute_compte_produit_analytique_rule 
  			SET liste_diagnostic_principal_id = (SELECT base.cti_group_array3(oid) FROM pmsi.t_diagnostics WHERE code LIKE ANY (liste_diagnostic_principal))
  			WHERE a_liste_diagnostic_principal = '1';
  			UPDATE w_execute_compte_produit_analytique_rule 
  			SET liste_diagnostic_relie_id = (SELECT base.cti_group_array3(oid) FROM pmsi.t_diagnostics WHERE code LIKE ANY (liste_diagnostic_relie))
  			WHERE a_liste_diagnostic_relie = '1';
  			UPDATE w_execute_compte_produit_analytique_rule 
  			SET liste_diagnostic_associe_id = (SELECT base.cti_group_array3(oid) FROM pmsi.t_diagnostics WHERE code LIKE ANY (liste_diagnostic_associe))
  			WHERE a_liste_diagnostic_associe = '1';
  		END IF;
  		
  		
  		DROP TABLE IF EXISTS w_execute_compte_produit_analytique_rule_actes_base;
  		CREATE TEMP TABLE w_execute_compte_produit_analytique_rule_actes_base AS
  		SELECT t_actes.oid AS rule_acte_id, w_execute_compte_produit_analytique_rule.oid AS rule_id
  		FROM base.t_actes
  		JOIN w_execute_compte_produit_analytique_rule ON code LIKE ANY (liste_acte);
  		CREATE INDEX w_execute_compte_produit_analytique_rule_actes_base_i1 ON w_execute_compte_produit_analytique_rule_actes_base USING btree (rule_acte_id);
  		
  		UPDATE w_execute_compte_produit_analytique_rule 
  		SET liste_acte_base_id = (SELECT base.cti_group_array3(oid) FROM base.t_actes WHERE code LIKE ANY (liste_acte))
  		WHERE a_liste_acte = '1'
  		;
  		
  		UPDATE w_execute_compte_produit_analytique_rule 
  		SET liste_ghm_id = (SELECT base.cti_group_array3(oid) FROM base.t_ghm WHERE code LIKE ANY (liste_ghm))
  		WHERE a_liste_ghm = '1'
  		;
  		UPDATE w_execute_compte_produit_analytique_rule 
  		SET liste_ghm_id = 
  			array_cat(liste_ghm_id,
  			(SELECT base.cti_group_array3(t_ghm.oid) FROM base.t_ghm JOIN base.t_cas ON cas_id = t_cas.oid WHERE '[CAS:'||t_cas.code||']' LIKE ANY (liste_ghm))
  			)
  		WHERE a_liste_ghm = '1' AND 
  			liste_ghm_origine LIKE '%[CAS:%'
  		;
  		
  		UPDATE w_execute_compte_produit_analytique_rule 
  		SET liste_sauf_ghm_id = (SELECT base.cti_group_array3(oid) FROM base.t_ghm WHERE code LIKE ANY (liste_sauf_ghm))
  		WHERE a_liste_sauf_ghm = '1'
  		;
  				
  		UPDATE w_execute_compte_produit_analytique_rule 
  		SET liste_medecin_activite_id = (
  			SELECT base.cti_group_array3(t_medecins_administratifs.oid) 
  			FROM activite.t_medecins_administratifs 
  			LEFT JOIN base.t_medecins ON t_medecins_administratifs.medecin_id = t_medecins.oid
  			WHERE 	(
  					t_medecins_administratifs.oid <> 0 AND 
  					t_medecins_administratifs.code <> '' AND 
  					t_medecins_administratifs.code LIKE ANY (liste_medecin) AND liste_medecin[1] <> '(R)'
  				)  OR
  				(
  					t_medecins_administratifs.oid IN 
  					(
  					SELECT
  						to_id
  					FROM activite.t_classes
  					JOIN activite.t_classes_sections ON t_classes_sections.classe_id = t_classes.oid
  					JOIN activite.t_classes_sections_elements ON t_classes_sections_elements.section_id = t_classes_sections.oid
  					WHERE '[CLASSE:'||t_classes.code||':'||t_classes_sections.code||']' = ANY(liste_medecin)
  					)
  				) OR
  				(
  					t_medecins.oid <> 0 AND 
  					t_medecins.code <> '' AND 
  					t_medecins.code LIKE ANY (liste_medecin) AND liste_medecin[1] = '(R)' 
  				)
  			)
  		WHERE a_liste_medecin = '1'
  		;
  		
  		UPDATE w_execute_compte_produit_analytique_rule 
  		SET liste_specialite_activite_id = (SELECT base.cti_group_array3(oid) FROM base.t_specialites_medecin WHERE oid <> 0 AND code LIKE ANY (liste_specialite))
  		WHERE a_liste_specialite = '1'
  		;
  		UPDATE w_execute_compte_produit_analytique_rule 
  		SET liste_type_sejour_id = (SELECT base.cti_group_array3(code) FROM activite.t_type_sejour WHERE oid <> 0 AND code <> '' AND code LIKE ANY (liste_type_sejour))
  		WHERE a_liste_type_sejour = '1'
  		;
  		UPDATE w_execute_compte_produit_analytique_rule 
  		SET liste_unite_fonctionnelle_id = (SELECT base.cti_group_array3(oid) FROM activite.t_unites_fonctionnelles WHERE oid <> 0 AND code LIKE ANY (liste_unite_fonctionnelle))
  		WHERE a_liste_unite_fonctionnelle = '1'
  		;
  		UPDATE w_execute_compte_produit_analytique_rule 
  		SET liste_service_id = (SELECT base.cti_group_array3(oid) FROM activite.t_services_facturation WHERE oid <> 0 AND code LIKE ANY (liste_service))
  		WHERE a_liste_service = '1'
  		;
  		UPDATE w_execute_compte_produit_analytique_rule 
  		SET liste_etage_id = (SELECT base.cti_group_array3(oid) FROM activite.t_etages WHERE oid <> 0 AND code LIKE ANY (liste_etage))
  		WHERE a_liste_etage = '1'
  		;
  		UPDATE w_execute_compte_produit_analytique_rule 
  		SET liste_activite_id = (SELECT base.cti_group_array3(oid) FROM activite.t_activites WHERE oid <> 0 AND code LIKE ANY (liste_activite))
  		WHERE a_liste_activite = '1'
  		;
  		UPDATE w_execute_compte_produit_analytique_rule 
  		SET liste_rubrique_id = (SELECT base.cti_group_array3(oid) FROM activite.t_rubriques_facturation WHERE oid <> 0 AND code LIKE ANY (liste_rubrique))
  		WHERE a_liste_rubrique = '1'
  		;
  		UPDATE w_execute_compte_produit_analytique_rule 
  		SET liste_prestation_id = (SELECT base.cti_group_array3(oid) FROM activite.t_prestations WHERE oid <> 0 AND code LIKE ANY (liste_prestation))
  		WHERE a_liste_prestation = '1'
  		;
  		UPDATE w_execute_compte_produit_analytique_rule 
  		SET liste_compte_produit_id = (SELECT base.cti_group_array3(oid) FROM activite.t_compte WHERE oid <> 0 AND code LIKE ANY (liste_compte_produit))
  		WHERE a_liste_compte_produit = '1'
  		;
  
  		
  		
  		-- Association cles aux actes
  		RAISE NOTICE '%' , 'Application des regles. Traitement des actes'; 
  		DROP TABLE IF EXISTS w_factures_actes;
  		IF _with_acte = '1' THEN
  			CREATE TEMP TABLE w_factures_actes AS
  			SELECT
  					no_facture, rule_id
  				FROM activite.p_factures_lignes_h
  				JOIN w_execute_compte_produit_analytique_rule_actes_base ON p_factures_lignes_h.acte_id = rule_acte_id
  				WHERE activite_ccam <> '4'
  			UNION
  			SELECT
  					no_facture, rule_id
  				FROM activite.p_factures_lignes_non_facturees_h
  				JOIN w_execute_compte_produit_analytique_rule_actes_base ON p_factures_lignes_non_facturees_h.acte_id = rule_acte_id
  				WHERE activite_ccam <> '4';
  		ELSE
  			CREATE TEMP TABLE w_factures_actes (no_facture text, rule_id bigint);
  		END IF;
  		CREATE INDEX  w_factures_actes_i1 ON  w_factures_actes USING btree (no_facture);
  		
  		DROP TABLE IF EXISTS w_compte_acte;
  		CREATE TEMP TABLE w_compte_acte AS
  		SELECT oid, base.cti_group_array3(acte_rule_id) AS acte_liste_rule_id
  		FROM
  		(
  			SELECT
  				w_factures.oid, rule_id AS acte_rule_id
  			FROM w_factures_actes
  			JOIN activite.p_factures ON w_factures_actes.no_facture = p_factures.no_facture
  			JOIN w_factures ON p_factures.no_sejour = w_factures.no_sejour
  			
  		) subview
  		GROUP BY 1;
  
  		ALTER TABLE w_compte_acte ADD CONSTRAINT w_compte_acte_pkey PRIMARY KEY(oid);
  		UPDATE w_factures
  		SET acte_liste_rule_id = w_compte_acte.acte_liste_rule_id
  		FROM w_compte_acte
  		WHERE w_compte_acte.oid = w_factures.oid;
  		
  		-- Diagnostics
  		IF _module_pmsimco = '1' THEN
  			RAISE NOTICE '%' , 'Application des regles. Traitement des diagnostics'; 
  			DROP TABLE IF EXISTS w_compte_diagnostic;
  			CREATE TEMP TABLE w_compte_diagnostic AS
  			SELECT
  				w_factures.oid, base.cti_group_array3(w_execute_compte_produit_analytique_rule.oid) AS diagnostic_associe_liste_rule_id
  			FROM pmsi.p_rss_diagnostics
  			JOIN w_execute_compte_produit_analytique_rule ON type_diagnostic_rss IN ('DA', 'DS') AND diagnostic_id = ANY (liste_diagnostic_associe_id)
  			JOIN w_factures ON p_rss_diagnostics.rss_id = w_factures.rss_id
  			WHERE a_liste_diagnostic_associe <> '0'
  			GROUP BY 1;
  			ALTER TABLE w_compte_diagnostic ADD CONSTRAINT w_compte_diagnostic_pkey PRIMARY KEY(oid);
  			UPDATE w_factures
  			SET diagnostic_associe_liste_rule_id = w_compte_diagnostic.diagnostic_associe_liste_rule_id
  			FROM w_compte_diagnostic
  			WHERE w_compte_diagnostic.oid = w_factures.oid;
  		END IF;
  		
  		
  
  		RAISE NOTICE '%' , 'Application des regles. Validation des regles'; 
  
  		-- Réplication dans tables de prod
  		RAISE NOTICE '%' , 'Application des regles. Validation des regles. p_factures_lignes_c'; 
  		DROP TABLE IF EXISTS w_factures_lignes_c_compte;
  		CREATE TEMP TABLE w_factures_lignes_c_compte AS
  		SELECT p_factures_lignes_c.no_facture, 
  			p_factures_lignes_c.CTID AS fromCTID,
  			COALESCE(
  				(MIN(ARRAY[w_execute_compte_produit_analytique_rule.priorite,w_execute_compte_produit_analytique_rule.compte_produit_analytique_id]))[2],
  				MAX(p_factures_lignes_c.compte_produit_id)) AS compte_produit_analytique_id
  		FROM activite.p_factures_lignes_c
  		JOIN activite.t_lieux ON p_factures_lignes_c.lieu_id = t_lieux.oid
  		JOIN activite.t_lits ON lit_id = t_lits.oid
  		JOIN w_factures ON p_factures_lignes_c.no_facture = w_factures.no_facture
  		LEFT JOIN w_execute_compte_produit_analytique_rule ON 
  			(a_liste_finess = '0' OR finess_id = ANY (liste_finess_id)) AND
  			(a_liste_type_sejour = '0' OR type_sejour = ANY (liste_type_sejour_id)) AND
  			(a_liste_unite_fonctionnelle = '0' OR t_lieux.unite_fonctionnelle_id = ANY (liste_unite_fonctionnelle_id)) AND
  			(a_liste_service = '0' OR t_lieux.service_facturation_id = ANY (liste_service_id)) AND
  			(a_liste_etage = '0' OR t_lits.etage_id = ANY (liste_etage_id)) AND
  			(a_liste_activite = '0' OR t_lieux.activite_id = ANY (liste_activite_id)) AND
  			(a_liste_medecin = '0' OR medecin_sejour_id = ANY (liste_medecin_activite_id)) AND
  			(a_liste_specialite = '0' OR specialite_sejour_id = ANY (liste_specialite_activite_id)) AND
  			(a_liste_ghm = '0' OR ghm_id = ANY (liste_ghm_id)) AND
  			(a_liste_diagnostic_principal = '0' OR diagnostic_principal_id = ANY (liste_diagnostic_principal_id)) AND
  			(a_liste_diagnostic_relie = '0' OR diagnostic_relie_id = ANY (liste_diagnostic_relie_id)) AND
  			(a_liste_diagnostic_associe = '0' OR w_execute_compte_produit_analytique_rule.oid = ANY(diagnostic_associe_liste_rule_id)) AND
  			(a_liste_acte = '0' OR w_execute_compte_produit_analytique_rule.oid = ANY(acte_liste_rule_id))  AND
  			(a_liste_compte_produit = '0' OR compte_produit_id = ANY (liste_compte_produit_id)) 
  		GROUP BY 1,2
  		;
  
  		ANALYSE w_factures_lignes_c_compte
  		;
  
  		CREATE INDEX  w_factures_lignes_c_compte_i1 ON w_factures_lignes_c_compte USING btree (no_facture)
  		;
  		
  		UPDATE activite.p_factures_lignes_c
  		SET compte_produit_analytique_id = w_factures_lignes_c_compte.compte_produit_analytique_id
  		FROM w_factures_lignes_c_compte
  		WHERE p_factures_lignes_c.no_facture = w_factures_lignes_c_compte.no_facture AND
  			p_factures_lignes_c.CTID = w_factures_lignes_c_compte.fromCTID AND
  			p_factures_lignes_c.compte_produit_analytique_id IS DISTINCT FROM w_factures_lignes_c_compte.compte_produit_analytique_id
  		;
  
  		ANALYSE activite.p_factures_lignes_c
  		;
  
  		RAISE NOTICE '%' , 'Application des regles. Validation des poles. p_factures_encours_lignes_c'; 
  
  		DROP TABLE IF EXISTS w_factures_encours_lignes_c_compte;
  		CREATE TEMP TABLE w_factures_encours_lignes_c_compte AS
  		SELECT p_factures_encours_lignes_c.no_facture, 
  			p_factures_encours_lignes_c.CTID AS fromCTID,
  			COALESCE(
  				(MIN(ARRAY[w_execute_compte_produit_analytique_rule.priorite,w_execute_compte_produit_analytique_rule.compte_produit_analytique_id]))[2],
  				MAX(p_factures_encours_lignes_c.compte_produit_id)) AS compte_produit_analytique_id
  		FROM activite.p_factures_encours_lignes_c
  		JOIN activite.t_lieux ON p_factures_encours_lignes_c.lieu_id = t_lieux.oid
  		JOIN activite.t_lits ON lit_id = t_lits.oid
  		JOIN w_factures_encours ON p_factures_encours_lignes_c.no_facture = w_factures_encours.no_facture
  		LEFT JOIN w_execute_compte_produit_analytique_rule ON 
  			(a_liste_finess = '0' OR finess_id = ANY (liste_finess_id)) AND
  			(a_liste_type_sejour = '0' OR type_sejour = ANY (liste_type_sejour_id)) AND
  			(a_liste_unite_fonctionnelle = '0' OR t_lieux.unite_fonctionnelle_id = ANY (liste_unite_fonctionnelle_id)) AND
  			(a_liste_service = '0' OR t_lieux.service_facturation_id = ANY (liste_service_id)) AND
  			(a_liste_etage = '0' OR t_lits.etage_id = ANY (liste_etage_id)) AND
  			(a_liste_activite = '0' OR t_lieux.activite_id = ANY (liste_activite_id)) AND
  			(a_liste_medecin = '0' OR medecin_sejour_id = ANY (liste_medecin_activite_id)) AND
  			(a_liste_specialite = '0' OR specialite_sejour_id = ANY (liste_specialite_activite_id)) AND
  			(a_liste_ghm = '0' OR ghm_id = ANY (liste_ghm_id)) AND
  			(a_liste_diagnostic_principal = '0' OR diagnostic_principal_id = ANY (liste_diagnostic_principal_id)) AND
  			(a_liste_diagnostic_relie = '0' OR diagnostic_relie_id = ANY (liste_diagnostic_relie_id)) AND
  			(a_liste_diagnostic_associe = '0' OR w_execute_compte_produit_analytique_rule.oid = ANY(diagnostic_associe_liste_rule_id)) AND
  			(a_liste_acte = '0' OR w_execute_compte_produit_analytique_rule.oid = ANY(acte_liste_rule_id))  AND
  			(a_liste_compte_produit = '0' OR compte_produit_id = ANY (liste_compte_produit_id)) 
  		WHERE p_factures_encours_lignes_c.compte_produit_analytique_id = 0 
  		GROUP BY 1,2
  		;
  
  		ANALYSE w_factures_encours_lignes_c_compte
  		;
  
  		CREATE INDEX  w_factures_encours_lignes_c_compte_i1 ON w_factures_encours_lignes_c_compte USING btree (no_facture)
  		;
  		
  		UPDATE activite.p_factures_encours_lignes_c
  		SET compte_produit_analytique_id = w_factures_encours_lignes_c_compte.compte_produit_analytique_id
  		FROM w_factures_encours_lignes_c_compte
  		WHERE p_factures_encours_lignes_c.no_facture = w_factures_encours_lignes_c_compte.no_facture AND
  			p_factures_encours_lignes_c.CTID = w_factures_encours_lignes_c_compte.fromCTID AND
  			p_factures_encours_lignes_c.compte_produit_analytique_id IS DISTINCT FROM w_factures_encours_lignes_c_compte.compte_produit_analytique_id
  		;
  
  		ANALYSE activite.p_factures_encours_lignes_c
  		;
  
  
  		
  		INSERT INTO activite.p_oids (code_table, oid) 
                  SELECT 'compte', compte_produit_analytique_id 
                  FROM activite.p_factures_lignes_c
                  WHERE compte_produit_analytique_id NOT IN (SELECT oid FROM activite.p_oids WHERE code_table = 'compte')
                  GROUP BY 2;
  
  
  		INSERT INTO activite.p_oids (code_table, oid) 
                  SELECT 'compte', compte_produit_analytique_id 
                  FROM activite.p_factures_encours_lignes_c
                  WHERE compte_produit_analytique_id NOT IN (SELECT oid FROM activite.p_oids WHERE code_table = 'compte')
                  GROUP BY 2;
  
  
  
  	RETURN 'OK';
  END;