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;