return: text
lang: plpgsql
src: |
  DECLARE	
  	result TEXT;
  BEGIN
  
  	-- Non comptabilisation des honoaraires / patients
  	
  	DROP TABLE IF EXISTS w_medecin_non_solde;
  	CREATE TEMP TABLE w_medecin_non_solde AS
  	SELECT no_facture, 
  		facture_id,
  		medecin_comptabilise_id, 
  
  		rubrique_comptabilisee_id, 
  		prestation_id,
  		MIN(date_comptable) AS date_comptable,
  		SUM(montant_comptabilise_0) - SUM(montant_regle_0) AS solde_0
  	FROM activite.p_factures_soldes_h
  	JOIN activite.t_medecins_administratifs ON medecin_comptabilise_id = t_medecins_administratifs.oid
  	WHERE medecin_comptabilise_id <> 0 AND
  		KIWEE_SIGEMS_HONPATCPT = '0'
  	GROUP BY 1,2,3,4,5
  	HAVING SUM(montant_comptabilise_0) <> SUM(montant_regle_0)
  	;
  
  	ANALYSE w_medecin_non_solde
  	;
  
  	-- Deduction du montant depassement dans les lignes comptables
  	INSERT INTO activite.p_factures_soldes_h(
  		facture_id,
  		no_facture, 
  		date_comptable, 
  		medecin_comptabilise_id, 
  		prestation_id,
  		rubrique_comptabilisee_id,
  		montant_comptabilise, 
  		montant_comptabilise_0, 
  		montant_comptabilise_1, 
  		montant_comptabilise_2, 
  		montant_comptabilise_22, 
  		montant_regle, 
  		montant_regle_0, 
  		montant_regle_1, 
  		montant_regle_2, 
  		montant_regle_22,
  		od_non_comptabilise
  
  	)
  	SELECT
  		facture_id,
  		no_facture, 
  		date_comptable,
  		medecin_comptabilise_id, 
  		prestation_id,
  		rubrique_comptabilisee_id,
  		0::numeric - solde_0 AS montant_comptabilise, 
  		0::numeric - solde_0 AS montant_comptabilise_0, 
  		0::numeric AS montant_comptabilise_1, 
  		0::numeric AS montant_comptabilise_2, 
  		0::numeric AS montant_comptabilise_22, 
  		0::numeric AS montant_regle, 
  		0::numeric AS montant_regle_0, 
  		0::numeric AS montant_regle_1, 
  		0::numeric AS montant_regle_2,  
  		0 AS montant_regle_22,
  		'1'::text AS od_non_comptabilise
  	FROM w_medecin_non_solde
  	;
  
  
  	-- Modification montant comptabilise dans les lignes facturees
  	UPDATE activite.p_factures_lignes_h SET
  		montant_comptabilise = montant_comptabilise - montant_comptabilise_0,
  		montant_comptabilise_0 = 0
  	FROM activite.t_medecins_administratifs
  	WHERE medecin_comptabilise_id = t_medecins_administratifs.oid AND
  		KIWEE_SIGEMS_HONPATCPT = '0' AND
  		montant_comptabilise_0 <> 0
  	;
  
  	-- Correction des totaux factures (comptabilise)
  	DROP TABLE IF EXISTS w_depassement_non_compta_corr;
  	CREATE TEMP TABLE w_depassement_non_compta_corr AS
  	SELECT no_facture, SUM(montant_comptabilise) AS montant_comptabilise,
  		SUM(montant_comptabilise_0) AS montant_comptabilise_0
  	FROM activite.p_factures_lignes_h
  	WHERE no_facture IN (SELECT no_facture FROM w_medecin_non_solde)
  	GROUP BY 1
  	;
  
  	ANALYSE w_depassement_non_compta_corr
  	;
  
  	UPDATE activite.p_factures SET
  		montant_comptabilise_h = w_depassement_non_compta_corr.montant_comptabilise,
  		montant_comptabilise_0_h = w_depassement_non_compta_corr.montant_comptabilise_0
  	FROM w_depassement_non_compta_corr
  	WHERE w_depassement_non_compta_corr.no_facture = p_factures.no_facture AND
  		(
  		montant_comptabilise_h IS DISTINCT FROM w_depassement_non_compta_corr.montant_comptabilise OR
  		montant_comptabilise_0_h IS DISTINCT FROM w_depassement_non_compta_corr.montant_comptabilise_0
  		)
  	;
  
  
  	-- Non comptabilisation des dépassements / patients
  	
  	-- Reperage des factures honoraires non soldees (les soldees ne sont pas concernees)
  	DROP TABLE IF EXISTS w_medecin_non_solde;
  	CREATE TEMP TABLE w_medecin_non_solde AS
  	SELECT no_facture, 
  		medecin_comptabilise_id, 
  		rubrique_comptabilisee_id, 
  		prestation_id
  	FROM activite.p_factures_soldes_h
  	JOIN activite.t_medecins_administratifs ON medecin_comptabilise_id = t_medecins_administratifs.oid
  	WHERE medecin_comptabilise_id <> 0 AND
  		KIWEE_SIGEMS_HONPATCPTDEP = '0'
  	GROUP BY 1,2,3,4
  	HAVING SUM(montant_comptabilise_0) <> SUM(montant_regle_0)
  	;
  
  	ANALYSE w_medecin_non_solde
  	;
  
  	-- Lignes honoraires avec depassement honoraire patient (sauf les medecins parametres)
  	DROP TABLE IF EXISTS w_depassement_non_compta;
  	CREATE TEMP TABLE w_depassement_non_compta AS
  	SELECT p_factures_lignes_h.no_facture, 
  		p_factures.oid AS facture_id,
  		p_factures.date_vente, 
  		p_factures_lignes_h.medecin_facture_id, 
  		t_medecins_administratifs.code, 
  		p_factures_lignes_h.montant_comptabilise_0, 
  		p_factures_lignes_h.montant_depassement, 
  		p_factures_lignes_h.rubrique_facturation_id, 
  		p_factures_lignes_h.prestation_id, 
  		p_factures_lignes_h.CTID AS from_CTID
  	FROM activite.p_factures_lignes_h
  	JOIN activite.p_factures ON p_factures_lignes_h.no_facture = p_factures.no_facture
  	JOIN activite.t_medecins_administratifs ON medecin_facture_id = t_medecins_administratifs.oid
  	JOIN w_medecin_non_solde ON
  		p_factures_lignes_h.no_facture = w_medecin_non_solde.no_facture AND
  		p_factures_lignes_h.medecin_facture_id = w_medecin_non_solde.medecin_comptabilise_id AND
  		p_factures_lignes_h.prestation_id = w_medecin_non_solde.prestation_id AND
  		p_factures_lignes_h.rubrique_facturation_id = w_medecin_non_solde.rubrique_comptabilisee_id 
  	WHERE KIWEE_SIGEMS_HONPATCPTDEP = '0' AND
  		montant_depassement <> 0 AND
  		abs(montant_depassement) <= abs(montant_comptabilise_0) AND
  		montant_comptabilise_0 <> 0
  	;
  
  	ANALYSE w_depassement_non_compta
  	;
  
  	-- Total par medecin et prestation 
  	DROP TABLE IF EXISTS w_depassement_non_compta_ven;
  	CREATE TEMP TABLE w_depassement_non_compta_ven AS
  	SELECT no_facture,
  		facture_id,
  		date_vente,
  		medecin_facture_id,
  		prestation_id,
  		rubrique_facturation_id,
  		SUM(montant_comptabilise_0) AS montant_comptabilise_0,
  		SUM(montant_depassement) AS montant_depassement
  	FROM w_depassement_non_compta
  	GROUP BY 1,2,3,4,5,6
  	;
  
  
  	ANALYSE w_depassement_non_compta_ven
  	;
  
  	-- Deduction du montant depassement dans les lignes comptables
  	INSERT INTO activite.p_factures_soldes_h(
  		facture_id,
  		no_facture, 
  		date_comptable, 
  		medecin_comptabilise_id, 
  		prestation_id,
  		rubrique_comptabilisee_id,
  		montant_comptabilise, 
  		montant_comptabilise_0, 
  		montant_comptabilise_1, 
  		montant_comptabilise_2, 
  		montant_comptabilise_22, 
  		montant_regle, 
  		montant_regle_0, 
  		montant_regle_1, 
  		montant_regle_2, 
  		montant_regle_22,
  		od_non_comptabilise
  
  	)
  	SELECT
  		facture_id,
  		no_facture, 
  		date_vente,
  		medecin_facture_id, 
  		prestation_id,
  		rubrique_facturation_id,
  		0::numeric - montant_depassement AS montant_comptabilise, 
  		0::numeric - montant_depassement AS montant_comptabilise_0, 
  		0::numeric AS montant_comptabilise_1, 
  		0::numeric AS montant_comptabilise_2, 
  		0::numeric AS montant_comptabilise_22, 
  		0::numeric AS montant_regle, 
  		0::numeric AS montant_regle_0, 
  		0::numeric AS montant_regle_1, 
  		0::numeric AS montant_regle_2,  
  		0 AS montant_regle_22,
  		'0'::text AS od_non_comptabilise
  	FROM w_depassement_non_compta_ven
  	;
  
  	-- Deduction des depassements dans les lignes de reglements regul
  	INSERT INTO activite.p_factures_soldes_h(
  		facture_id,
  		no_facture, 
  		date_comptable, 
  		medecin_comptabilise_id, 
  		prestation_id,
  		rubrique_comptabilisee_id,
  		montant_comptabilise, 
  		montant_comptabilise_0, 
  		montant_comptabilise_1, 
  		montant_comptabilise_2, 
  		montant_comptabilise_22, 
  		montant_regle, 
  		montant_regle_0, 
  		montant_regle_1, 
  		montant_regle_2, 
  		montant_regle_22,
  		od_non_comptabilise
  
  	)
  	SELECT
  		facture_id,
  		no_facture, 
  		date_vente,
  		0::bigint AS medecin_comptabilise_id, 
  		0::bigint AS prestation_id,
  		0::bigint AS rubrique_comptabiliseen_id,
  		0::numeric AS montant_comptabilise, 
  		0::numeric AS montant_comptabilise_0, 
  		0::numeric AS montant_comptabilise_1, 
  		0::numeric AS montant_comptabilise_2, 
  		0::numeric AS montant_comptabilise_22, 
  		0::numeric - SUM(montant_depassement) AS montant_regle, 
  		0::numeric - SUM(montant_depassement) AS montant_regle_0, 
  		0::numeric AS montant_regle_1, 
  		0::numeric AS montant_regle_2,  
  		0 AS montant_regle_22,
  		'1'::text AS od_non_comptabilise
  	FROM w_depassement_non_compta_ven
  	WHERE no_facture IN (SELECT no_facture FROM activite.p_factures_soldes_h WHERE medecin_comptabilise_id = 0 AND montant_regle_0 <> 0)
  	GROUP BY 1,2,3
  	;
  
  	-- Modification montant comptabilise dans les lignes facturees
  	UPDATE activite.p_factures_lignes_h SET
  		montant_comptabilise = p_factures_lignes_h.montant_comptabilise - w_depassement_non_compta.montant_depassement,
  		montant_comptabilise_0 = p_factures_lignes_h.montant_comptabilise_0 - w_depassement_non_compta.montant_depassement
  	FROM w_depassement_non_compta
  	WHERE p_factures_lignes_h.no_facture = w_depassement_non_compta.no_facture AND
  		p_factures_lignes_h.CTID = w_depassement_non_compta.from_CTID
  	;
  
  	-- Correction des totaux factures (comptabilise)
  	DROP TABLE IF EXISTS w_depassement_non_compta_corr;
  	CREATE TEMP TABLE w_depassement_non_compta_corr AS
  	SELECT no_facture, SUM(montant_comptabilise) AS montant_comptabilise,
  		SUM(montant_comptabilise_0) AS montant_comptabilise_0
  	FROM activite.p_factures_lignes_h
  	WHERE no_facture IN (SELECT no_facture FROM w_depassement_non_compta_ven)
  	GROUP BY 1
  	;
  
  	ANALYSE w_depassement_non_compta_corr
  	;
  
  	UPDATE activite.p_factures SET
  		montant_comptabilise_h = w_depassement_non_compta_corr.montant_comptabilise,
  		montant_comptabilise_0_h = w_depassement_non_compta_corr.montant_comptabilise_0
  	FROM w_depassement_non_compta_corr
  	WHERE w_depassement_non_compta_corr.no_facture = p_factures.no_facture
  	;
  	
  	
  	-- Purge des montants OD regles (annules par negatif)
  	DROP TABLE IF EXISTS w_depassement_non_compta_corr_purge;
  	CREATE TEMP TABLE w_depassement_non_compta_corr_purge AS
  	SELECT p_factures_soldes_h.no_facture,
  		SUM(montant_regle_0) AS montant_regle_0,
  		SUM(montant_regle) AS montant_regle
  	FROM activite.p_factures_soldes_h
  	JOIN activite.p_factures On p_factures_soldes_h.no_facture = p_factures.no_facture
  	WHERE medecin_comptabilise_id = 0 AND
  		montant_regle_0 <> 0
  	GROUP BY 1
  	HAVING SUM(p_factures.montant_facture_h) >= 0 AND SUM(montant_regle_0) <= 0 OR
  		SUM(p_factures.montant_facture_h) < 0 AND SUM(montant_regle_0) > 0
  	;
  
  	ANALYSE w_depassement_non_compta_corr_purge
  	;
  
  	DELETE FROM activite.p_factures_soldes_h
  	USING w_depassement_non_compta_corr_purge
  	WHERE p_factures_soldes_h.no_facture = w_depassement_non_compta_corr_purge.no_facture AND
  		p_factures_soldes_h.medecin_comptabilise_id = 0 AND
  		p_factures_soldes_h.montant_regle_0 <> 0 
  	;
  	
  	-- Correction des totaux factures (regle)
  	DROP TABLE IF EXISTS w_depassement_non_compta_corr;
  	CREATE TEMP TABLE w_depassement_non_compta_corr AS
  	SELECT p_factures_soldes_h.no_facture, 
  		SUM(p_factures_soldes_h.montant_regle) AS montant_regle,
  		SUM(p_factures_soldes_h.montant_regle_0) AS montant_regle_0
  	FROM activite.p_factures_soldes_h
  	JOIN activite.p_factures ON p_factures_soldes_h.no_facture = p_factures.no_facture
  	GROUP BY 1
  	HAVING SUM(p_factures_soldes_h.montant_regle_0) <> MAX(p_factures.montant_regle_0_h)
  	;
  
  	ANALYSE w_depassement_non_compta_corr
  	;
  
  	UPDATE activite.p_factures SET
  		montant_regle_h = w_depassement_non_compta_corr.montant_regle,
  		montant_regle_0_h = w_depassement_non_compta_corr.montant_regle_0
  	FROM w_depassement_non_compta_corr
  	WHERE w_depassement_non_compta_corr.no_facture = p_factures.no_facture
  	;
  		
  		
  	RETURN 'OK';
  END;