You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

343 lines
12 KiB

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;