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.
 
 

12436 lines
491 KiB

<?xml version="1.0" encoding="ISO-8859-1"?>
<ROOT>
<NODE name="INIT" label="INITIALISATIONS">
<NODE label="Corrections diverses">
<sqlcmd><![CDATA[
-- Correction des heures
UPDATE prod_sigems.DOSSIER
SET HEU_DOS = to_char(to_number('00' || HEU_DOS,'0000'),'FM00')
WHERE HEU_DOS <> to_char(to_number('00' || HEU_DOS,'0000'),'FM00');
UPDATE prod_sigems.DOSSIER
SET MIN_DOS = to_char(to_number('00' || MIN_DOS,'0000'),'FM00')
WHERE MIN_DOS <> to_char(to_number('00' || MIN_DOS,'0000'),'FM00');
UPDATE prod_sigems.SEJOUR
SET HEU_SEJ = to_char(to_number('00' || HEU_SEJ,'0000'),'FM00')
WHERE HEU_SEJ <> to_char(to_number('00' || HEU_SEJ,'0000'),'FM00');
UPDATE prod_sigems.SEJOUR
SET MIN_SEJ = to_char(to_number('00' || MIN_SEJ,'0000'),'FM00')
WHERE MIN_SEJ <> to_char(to_number('00' || MIN_SEJ,'0000'),'FM00');
UPDATE prod_sigems.DOSSIER
SET HEU_DOS = MIN_DOS
WHERE DEN_DOS = DSO_DOS AND MIN_DOS > HEU_DOS AND HEU_DOS = '00';
-- Correction médecin séjour pour récupérer médecin à la sortie
INSERT INTO activite.t_divers (code, texte, valeur, description)
SELECT
'SIGEMS_MEDSEJ',
'Transformation code médecin selon historique médecins',
'1',
'1=Récupérer médecin à la sortie, 0=Récupérer uniquement médecin séjour'
WHERE 'SIGEMS_MEDSEJ' NOT IN (SELECT code FROM activite.t_divers);
;
SELECT *
FROM base.cti_execute('
UPDATE prod_sigems.DOSSIER
SET CCH_DOS = CCH_DOS_sortie
FROM
(
SELECT annee, code, (MAX(Array[COALESCE(FIN,''20991231'')::text,SEJOUR_CLINIQUE.PRATICIEN]))[2] AS CCH_DOS_sortie
FROM prod_sigems.SEJOUR_CLINIQUE
JOIN prod_sigems.PRATICIEN ON SEJOUR_CLINIQUE.PRATICIEN = COD_PRA
WHERE praticien <> ''''
GROUP BY 1,2
HAVING count(DISTINCT PRATICIEN) > 1
) subview
WHERE ANN_DOS = ANNEE AND COD_DOS = CODE AND
CCH_DOS <> CCH_DOS_sortie
',1)
WHERE 'SIGEMS_MEDSEJ' IN (SELECT code FROM activite.t_divers WHERE code = 'SIGEMS_MEDSEJ' AND valeur = '1')
;
-- Transformation UF (refonte FICOM GHM Grenoble)
UPDATE prod_SIGEMS.DOSSIER
SET SER_DOS = TO_UF
FROM prod_sigems.DOSSIER_MDT,
activite.t_sigems_transformation_uf
WHERE DOSSIER.ANN_DOS = DOSSIER_MDT.ANN_DOS AND
DOSSIER.COD_DOS = DOSSIER_MDT.COD_DOS AND
SER_DOS = FROM_UF AND
MDT_REEL = FROM_MODE AND
CCH_DOS = FROM_MEDECIN AND
SER_DOS <> TO_UF
;
UPDATE prod_SIGEMS.SEJOUR
SET SER_SEJ = TO_UF
FROM prod_SIGEMS.DOSSIER,
prod_sigems.DOSSIER_MDT,
activite.t_sigems_transformation_uf
WHERE DOSSIER.ANN_DOS = SEJOUR.ANN_SEJ AND
DOSSIER.COD_DOS = SEJOUR.COD_SEJ AND
DOSSIER.ANN_DOS = DOSSIER_MDT.ANN_DOS AND
DOSSIER.COD_DOS = DOSSIER_MDT.COD_DOS AND
SER_SEJ = FROM_UF AND
MDT_REEL = FROM_MODE AND
CCH_DOS = FROM_MEDECIN AND
SER_SEJ <> TO_UF
;
-- Correction etat factures sur factures nulles non éditées -> comptabilisées
UPDATE prod_sigems.dos2
SET ETA_DOS2 = 5
WHERE ETA_DOS2 = 2 AND DFA_DOS2 IS NOT NULL AND
SJ1_DOS2 = 0 AND SJ2_DOS2 = 0 AND SJ3_DOS2 = 0 AND
HO1_DOS2 = 0 AND HO2_DOS2 = 0 AND HO3_DOS2 = 0
;
-- Correction TP1 (99999999 = patient)
UPDATE prod_sigems.DOS2
SET CP1_DOS2 = ''
WHERE CP1_DOS2 = '99999999' AND
SJ1_DOS2 = 0 AND
HO1_DOS2 = 0
;
-- Correction TP2 (99999999 = patient)
UPDATE prod_sigems.DOS2
SET CA2_DOS2 = ''
WHERE CA2_DOS2 = '99999999' AND
SJ2_DOS2 = 0 AND
HO2_DOS2 = 0
;
-- Correction anomalie : séjours en double chez SIGEMS
SELECT base.cti_execute(
'DELETE FROM prod_sigems.DOSSIER
USING
(
SELECT ANN_DOS, COD_DOS, MAX(CTID) AS del_CTID
FROM prod_sigems.DOSSIER
GROUP BY 1,2
HAVING count(*) > 1
) subview
WHERE DOSSIER.CTID = del_CTID',20);
-- Correction anomalie : Factures en double chez SIGEMS
DROP TABLE IF EXISTS w_DOS2_double;
CREATE TEMP TABLE w_DOS2_double AS
SELECT ANN_DOS2,
COD_DOS2,
IND_DOS2
FROM prod_sigems.DOS2
GROUP BY 1,2,3
HAVING count(*) > 1 AND
SUM(CASE WHEN ETA_DOS2 >= 2 THEN 1 ELSE 0 END) = 1;
DELETE FROM prod_sigems.DOS2
USING w_DOS2_double
WHERE DOS2.ANN_DOS2 = w_DOS2_double.ANN_DOS2 AND
DOS2.COD_DOS2 = w_DOS2_double.COD_DOS2 AND
DOS2.IND_DOS2 = w_DOS2_double.IND_DOS2 AND
ETA_DOS2 <= 1;
DELETE FROM prod_sigems.DOS2
USING
(
SELECT ANN_DOS2, COD_DOS2, IND_DOS2, MAX(CTID) AS del_CTID
FROM prod_sigems.dos2
GROUP BY 1,2,3
HAVING count(*) > 1
) subview
WHERE DOS2.CTID = del_CTID;
DELETE FROM prod_sigems.DOS2
USING
(
SELECT ANN_DOS2, COD_DOS2, IND_DOS2, MAX(CTID) AS del_CTID
FROM prod_sigems.dos2
GROUP BY 1,2,3
HAVING count(*) > 1
) subview
WHERE DOS2.CTID = del_CTID;
-- Correction lignes affectée à indice 0 au lieu de 1
UPDATE prod_sigems.LIG_CLINI
SET IND_LCL = 1
FROM
(
SELECT ANN_LCL, COD_LCL
FROM prod_sigems.LIG_CLINI
JOIN prod_sigems.DOS2 ON ANN_LCL = ANN_DOS2 AND COD_LCl = COD_DOS2 AND IND_DOS2 = 1 AND ETA_DOS2 >= 4
WHERE IND_LCL IN (0,1) AND
(ML1_LCL <> 0 OR ML2_LCL <> 0 OR ML3_LCL <> 0)
GROUP BY 1,2
HAVING MIN(IND_LCL) = 0 AND
MAX(SJ1_DOS2) = SUM(ML1_LCL) AND
MAX(SJ2_DOS2) = SUM(ML2_LCL) AND
MAX(SJ3_DOS2) = SUM(ML3_LCL)
) SUBVIEW
WHERE LIG_CLINI.ANN_LCL = subview.ANN_LCL AND
LIG_CLINI.COD_LCL = subview.COD_LCL AND
LIG_CLINI.IND_LCL = 0;
-- Lignes non facturées -> facture non calculée
UPDATE prod_sigems.LIG_CLINI
SET IND_LCL = IND_DOS2
FROM prod_sigems.DOS2
WHERE IND_LCL = 0 AND
ANN_LCL = ANN_DOS2 AND COD_LCL = COD_DOS2 AND
ETA_DOS2 <= 2 AND DDE_LCL BETWEEN DEN_DOS2 AND DSO_DOS2 AND
(ML1_LCL <> 0 OR
ML2_LCL <> 0 OR
ML3_LCL <> 0 OR
PUN_LCL <> 0);
UPDATE prod_sigems.LIG_HONOR
SET IND_LHO = 1
FROM
( SELECT ANN_LHO, COD_LHO
FROM prod_sigems.LIG_HONOR
JOIN prod_sigems.DOS2 ON ANN_LHO = ANN_DOS2 AND COD_LHO = COD_DOS2 AND IND_DOS2 = 1 AND ETA_DOS2 >= 4
WHERE IND_LHO IN (0,1) AND
(ML1_LHO <> 0 OR ML2_LHO <> 0 OR ML3_LHO <> 0)
GROUP BY 1,2
HAVING MIN(IND_LHO) = 0 AND
MAX(HO1_DOS2) >= SUM(ML1_LHO) AND
MAX(HO2_DOS2) >= SUM(ML2_LHO) AND
MAX(HO3_DOS2) >= SUM(ML3_LHO)
) SUBVIEW
WHERE LIG_HONOR.ANN_LHO = subview.ANN_LHO AND
LIG_HONOR.COD_LHO = subview.COD_LHO AND
LIG_HONOR.IND_LHO = 0;
-- Lignes restées avec indice à 0 sur dossier en état 3
UPDATE prod_sigems.LIG_CLINI
SET IND_LCL = subview.IND_DOS2
FROM
(
SELECT
ANN_DOS2,
COD_DOS2,
MAX(IND_DOS2) AS IND_DOS2,
SUM(LIG_CLINI_0.ML1_LCL),
SUM(LIG_CLINI_0.ML2_LCL),
SUM(LIG_CLINI_0.ML3_LCL)
FROM prod_sigems.DOS2
LEFT JOIN prod_sigems.LIG_CLINI ON
LIG_CLINI.ANN_LCL = ANN_DOS2 AND
LIG_CLINI.COD_LCL = COD_DOS2 AND
LIG_CLINI.IND_LCL = IND_DOS2 AND
LIG_CLINI.PRO_LCL <> 'REGC'
JOIN prod_sigems.LIG_CLINI LIG_CLINI_0 ON
LIG_CLINI_0.ANN_LCL = ANN_DOS2 AND
LIG_CLINI_0.COD_LCL = COD_DOS2 AND
LIG_CLINI_0.IND_LCL = 0
WHERE ETA_DOS2 IN (3,4) AND
(
SJ1_DOS2 <> 0 OR
SJ2_DOS2 <> 0 OR
SJ3_DOS2 <> 0
) AND
LIG_CLINI.ANN_LCL IS NULL
GROUP BY 1,2
HAVING
MAX(SJ1_DOS2) = SUM(LIG_CLINI_0.ML1_LCL) AND
MAX(SJ2_DOS2) = SUM(LIG_CLINI_0.ML2_LCL) AND
MAX(SJ3_DOS2) = SUM(LIG_CLINI_0.ML3_LCL) AND
count(DISTINCT IND_DOS2) = 1
) subview
WHERE LIG_CLINI.ANN_LCL = subview.ANN_DOS2 AND
LIG_CLINI.COD_LCL = subview.COD_DOS2 AND
LIG_CLINI.IND_LCL = 0
;
UPDATE prod_sigems.LIG_HONOR
SET IND_LHO = subview.IND_DOS2
FROM
(
SELECT
ANN_DOS2,
COD_DOS2,
MAX(IND_DOS2) AS IND_DOS2,
SUM(LIG_HONOR_0.ML1_LHO),
SUM(LIG_HONOR_0.ML2_LHO),
SUM(LIG_HONOR_0.ML3_LHO)
FROM prod_sigems.DOS2
LEFT JOIN prod_sigems.LIG_HONOR ON
LIG_HONOR.ANN_LHO = ANN_DOS2 AND
LIG_HONOR.COD_LHO = COD_DOS2 AND
LIG_HONOR.IND_LHO = IND_DOS2 AND
LIG_HONOR.CPH_LHO <> 'REGH'
JOIN prod_sigems.LIG_HONOR LIG_HONOR_0 ON
LIG_HONOR_0.ANN_LHO = ANN_DOS2 AND
LIG_HONOR_0.COD_LHO = COD_DOS2 AND
LIG_HONOR_0.IND_LHO = 0
WHERE ETA_DOS2 IN (3,4) AND
(
HO1_DOS2 <> 0 OR
HO2_DOS2 <> 0 OR
HO3_DOS2 <> 0
) AND
LIG_HONOR.ANN_LHO IS NULL
GROUP BY 1,2
HAVING
MAX(HO1_DOS2) = SUM(LIG_HONOR_0.ML1_LHO) AND
MAX(HO2_DOS2) = SUM(LIG_HONOR_0.ML2_LHO) AND
MAX(HO3_DOS2) = SUM(LIG_HONOR_0.ML3_LHO) AND
count(DISTINCT IND_DOS2) = 1
) subview
WHERE LIG_HONOR.ANN_LHO = subview.ANN_DOS2 AND
LIG_HONOR.COD_LHO = subview.COD_DOS2 AND
LIG_HONOR.IND_LHO = 0
;
-- Lignes de factures clinique avec règlements sans facture correspondante
DROP TABLE IF EXISTS w_LIG_CLINI_corr;
CREATE TEMP TABLE w_LIG_CLINI_corr AS
SELECT ANN_LCL, COD_LCL, IND_LCL,
CASE
WHEN IND_LCL > 1 AND right(IND_LCL::text,1) IN ('2','4','6','8','0') THEN IND_LCL - 1
WHEN IND_LCL > 2 THEN IND_LCL - 2
ELSE -1::numeric END AS TO_IND_LCL
FROM prod_sigems.LIG_CLINI
JOIN prod_sigems.REG4 ON NUM_CLI = NUM_LCL
LEFT JOIN prod_sigems.dos2 ON
ANN_LCL = ANN_DOS2 AND
COD_LCL = COD_DOS2 AND
IND_LCL = IND_DOS2
WHERE IND_LCL <> 0 AND
PRO_LCL = 'REGC' AND
ANN_DOS2 IS NULL
GROUP BY 1,2,3,4
;
ANALYSE w_LIG_CLINI_corr
;
UPDATE w_LIG_CLINI_corr
SET TO_IND_LCL = -2
FROM
(
SELECT ANN_LCL, COD_LCL, IND_LCL
FROM w_LIG_CLINI_corr
LEFT JOIN prod_sigems.DOS2 ON
ANN_LCL = ANN_DOS2 AND
COD_LCL = COD_DOS2 AND
TO_IND_LCL = IND_DOS2
WHERE TO_IND_LCL > 0 AND
ANN_DOS2 IS NULL
) subview
WHERE
subview.ANN_LCL = w_LIG_CLINI_corr.ANN_LCL AND
subview.COD_LCL = w_LIG_CLINI_corr.COD_LCL AND
subview.IND_LCL = w_LIG_CLINI_corr.IND_LCL
;
UPDATE w_LIG_CLINI_corr
SET TO_IND_LCL = subview.TO_IND_LCL
FROM
(
SELECT ANN_LCL, COD_LCL, IND_LCL, MAX(IND_DOS2) AS TO_IND_LCL
FROM w_LIG_CLINI_corr
JOIN prod_sigems.DOS2 ON
ANN_LCL = ANN_DOS2 AND
COD_LCL = COD_DOS2 AND
IND_LCL > IND_DOS2
WHERE TO_IND_LCL < 0
GROUP BY 1,2,3
) subview
WHERE
subview.ANN_LCL = w_LIG_CLINI_corr.ANN_LCL AND
subview.COD_LCL = w_LIG_CLINI_corr.COD_LCL AND
subview.IND_LCL = w_LIG_CLINI_corr.IND_LCL
;
UPDATE prod_sigems.LIG_CLINI
SET IND_LCL = w_LIG_CLINI_corr.TO_IND_LCL
FROM w_LIG_CLINI_corr
WHERE LIG_CLINI.ANN_LCL = w_LIG_CLINI_corr.ANN_LCL AND
LIG_CLINI.COD_LCL = w_LIG_CLINI_corr.COD_LCL AND
LIG_CLINI.IND_LCL = w_LIG_CLINI_corr.IND_LCL AND
w_LIG_CLINI_corr.TO_IND_LCL > 0
;
-- Lignes de factures honoraire avec règlements sans facture correspondante
DROP TABLE IF EXISTS w_LIG_HONOR_corr;
CREATE TEMP TABLE w_LIG_HONOR_corr AS
SELECT ANN_LHO, COD_LHO, IND_LHO,
CASE
WHEN IND_LHO > 1 AND right(IND_LHO::text,1) IN ('2','4','6','8','0') THEN IND_LHO - 1
WHEN IND_LHO > 2 THEN IND_LHO - 2
ELSE -1::numeric END AS TO_IND_LHO
FROM prod_sigems.LIG_HONOR
JOIN prod_sigems.REG3 ON LHO_REG3 = NUM_LHO
LEFT JOIN prod_sigems.dos2 ON
ANN_LHO = ANN_DOS2 AND
COD_LHO = COD_DOS2 AND
IND_LHO = IND_DOS2
WHERE IND_LHO <> 0 AND
CPH_LHO = 'REGH' AND
ANN_DOS2 IS NULL
GROUP BY 1,2,3,4
;
UPDATE w_LIG_HONOR_corr
SET TO_IND_LHO = -2
FROM
(
SELECT ANN_LHO, COD_LHO, IND_LHO
FROM w_LIG_HONOR_corr
LEFT JOIN prod_sigems.DOS2 ON
ANN_LHO = ANN_DOS2 AND
COD_LHO = COD_DOS2 AND
TO_IND_LHO = IND_DOS2
WHERE TO_IND_LHO > 0 AND
ANN_DOS2 IS NULL
) subview
WHERE
subview.ANN_LHO = w_LIG_HONOR_corr.ANN_LHO AND
subview.COD_LHO = w_LIG_HONOR_corr.COD_LHO AND
subview.IND_LHO = w_LIG_HONOR_corr.IND_LHO
;
UPDATE w_LIG_HONOR_corr
SET TO_IND_LHO = subview.TO_IND_LHO
FROM
(
SELECT ANN_LHO, COD_LHO, IND_LHO, MAX(IND_DOS2) AS TO_IND_LHO
FROM w_LIG_HONOR_corr
JOIN prod_sigems.DOS2 ON
ANN_LHO = ANN_DOS2 AND
COD_LHO = COD_DOS2 AND
IND_LHO > IND_DOS2
WHERE TO_IND_LHO < 0
GROUP BY 1,2,3
) subview
WHERE
subview.ANN_LHO = w_LIG_HONOR_corr.ANN_LHO AND
subview.COD_LHO = w_LIG_HONOR_corr.COD_LHO AND
subview.IND_LHO = w_LIG_HONOR_corr.IND_LHO
;
UPDATE prod_sigems.LIG_HONOR
SET IND_LHO = w_LIG_HONOR_corr.TO_IND_LHO
FROM w_LIG_HONOR_corr
WHERE LIG_HONOR.ANN_LHO = w_LIG_HONOR_corr.ANN_LHO AND
LIG_HONOR.COD_LHO = w_LIG_HONOR_corr.COD_LHO AND
LIG_HONOR.IND_LHO = w_LIG_HONOR_corr.IND_LHO AND
w_LIG_HONOR_corr.TO_IND_LHO > 0
;
UPDATE prod_sigems.LIG_CLINI
SET SER_LCL = '*CDL'
FROM
(
SELECT ANN_LCL, COD_LCL
FROM prod_sigems.LIG_CLINI
JOIN
(SELECT ANN_DOS2 AS ANN_DOS2_fac,
COD_DOS2 AS COD_DOS2_fac
FROM prod_sigems.DOS2
WHERE ETA_DOS2 >= 4
GROUP BY 1,2
) subview ON
ANN_LCL = ANN_DOS2_fac AND
COD_LCL = COD_DOS2_fac
LEFT JOIN prod_sigems.DOS2 ON
ANN_DOS2 = ANN_LCL AND
COD_DOS2 = COD_LCL AND
IND_DOS2 = IND_LCL
WHERE IND_LCL = 0 AND
COD_DOS2 IS NULL
GROUP BY 1,2
) subview
WHERE LIG_CLINI.ANN_LCL = subview.ANN_LCL AND
LIG_CLINI.COD_LCL = subview.COD_LCL AND
LIG_CLINI.IND_LCL = 0
;
UPDATE prod_sigems.LIG_HONOR
SET SER_LHO = '*CDL'
FROM
(
SELECT ANN_LHO, COD_LHO
FROM prod_sigems.LIG_HONOR
JOIN
(SELECT ANN_DOS2 AS ANN_DOS2_fac,
COD_DOS2 AS COD_DOS2_fac
FROM prod_sigems.DOS2
WHERE ETA_DOS2 >= 4
GROUP BY 1,2
) subview ON
ANN_LHO = ANN_DOS2_fac AND
COD_LHO = COD_DOS2_fac
LEFT JOIN prod_sigems.DOS2 ON
ANN_DOS2 = ANN_LHO AND
COD_DOS2 = COD_LHO AND
IND_DOS2 = IND_LHO
WHERE IND_LHO = 0 AND
COD_DOS2 IS NULL
GROUP BY 1,2
) subview
WHERE LIG_HONOR.ANN_LHO = subview.ANN_LHO AND
LIG_HONOR.COD_LHO = subview.COD_LHO AND
LIG_HONOR.IND_LHO = 0
;
-- Correction doublons
UPDATE prod_sigems.dossier_x
SET ANN_DOX = 'KO'
FROM
(
select ann_dox, cod_dox, min(CTID) AS koctid from prod_sigems.dossier_x
group by 1,2
having count(*) > 1
) subview
where CTID = koctid;
UPDATE prod_sigems.DOSSIER_Y
SET ANNEE = 'KO'
FROM
(
SELECT ANNEE, CODE, min(CTID) AS okctid
FROM prod_sigems.DOSSIER_Y
GROUP BY 1,2
HAVING count(*) > 1
) subview
WHERE DOSSIER_Y.ANNEE = subview.ANNEE AND
DOSSIER_Y.CODE = subview.CODE AND
CTID <> okctid;
UPDATE prod_sigems.DOSSIER_MDT
SET ANN_DOS = 'KO'
FROM
(
SELECT ANN_DOS, COD_DOS, min(CTID) AS koctid
FROM prod_sigems.DOSSIER_MDT
GROUP BY 1,2
HAVING count(*) > 1
) subview
WHERE CTID = koctid;
-- Correction provenance (5) pour les urgences
UPDATE prod_sigems.DOSSIER_X
SET ADM_DOS = CASE WHEN substr(ADM_DOS,1,1) <> '' THEN substr(ADM_DOS,1,1) ELSE '8' END || '5'
FROM prod_sigems.DOSSIER_Y
WHERE DOSSIER_X.ANN_DOX = DOSSIER_Y.ANNEE AND
DOSSIER_X.COD_DOX = DOSSIER_Y.CODE AND
DOSSIER_X.ANN_DOX <> 'KO' AND
DOSSIER_Y.URGENCE = 'U' AND
substr(ADM_DOS,2,1) <> '5'
;
-- Correction de liens avoir farfelus
UPDATE prod_sigems.DOS2_LIEN_AVOIR
SET ANN = 'K'||substr(DOS2_LIEN_AVOIR.ANN,2)
FROM
(
SELECT ANN, COD, IND, MAX(CASE WHEN COP_DOS2 = '4' THEN IND_DOS2 ELSE 0 END) AS IND_AVOIR_OK
FROM prod_sigems.DOS2_LIEN_AVOIR
LEFT JOIN prod_sigems.DOS2 ON
ANN = ANN_DOS2 AND
COD = COD_DOS2 AND
IND_AVOIR = IND_DOS2
GROUP BY 1,2,3
having count(*) > 1
) subview
WHERE DOS2_LIEN_AVOIR.ANN = subview.ANN AND
DOS2_LIEN_AVOIR.COD = subview.COD AND
DOS2_LIEN_AVOIR.IND = subview.IND AND
IND_AVOIR <> IND_AVOIR_OK AND
IND_AVOIR_OK <> 0
;
-- Correction des montants réglés (incohérences base entre factures, lignes et ecritures)
UPDATE prod_sigems.DOS2 SET
SR1_DOS2 = SJ1_DOS2,
SR2_DOS2 = SJ2_DOS2,
SR3_DOS2 = SJ3_DOS2,
HR1_DOS2 = HO1_DOS2,
HR2_DOS2 = HO2_DOS2,
HR3_DOS2 = HO3_DOS2
FROM prod_sigems.DOS2_LIEN_AVOIR
WHERE ANN_DOS2 = ANN AND COD_DOS2 = COD AND IND_DOS2 = IND_AVOIR AND
(
SR1_DOS2 <> SJ1_DOS2 OR
SR2_DOS2 <> SJ2_DOS2 OR
SR3_DOS2 <> SJ3_DOS2 OR
HR1_DOS2 <> HO1_DOS2 OR
HR2_DOS2 <> HO2_DOS2 OR
HR3_DOS2 <> HO3_DOS2
)
;
UPDATE prod_sigems.DOS2 DOS2F SET
HR1_DOS2 = 0-DOS2A.HR1_DOS2,
HR2_DOS2 = 0-DOS2A.HR2_DOS2,
HR3_DOS2 = 0-DOS2A.HR3_DOS2
FROM prod_sigems.DOS2_LIEN_AVOIR
JOIN prod_sigems.DOS2 DOS2A ON DOS2A.ANN_DOS2 = ANN AND DOS2A.COD_DOS2 = COD AND DOS2A.IND_DOS2 = IND_AVOIR
WHERE DOS2F.ANN_DOS2 = ANN AND DOS2F.COD_DOS2 = COD AND DOS2F.IND_DOS2 = IND AND
NOT (DOS2F.HR1_DOS2 = 0-DOS2A.HR1_DOS2 AND DOS2F.HR2_DOS2 = 0-DOS2A.HR2_DOS2 AND DOS2F.HR3_DOS2 = 0-DOS2A.HR3_DOS2) AND
(DOS2A.HR1_DOS2 <> 0 OR DOS2A.HR2_DOS2 <> 0 OR DOS2A.HR3_DOS2 <> 0)
;
UPDATE prod_sigems.DOS2 DOS2F SET
SR1_DOS2 = 0-DOS2A.SR1_DOS2,
SR2_DOS2 = 0-DOS2A.SR2_DOS2,
SR3_DOS2 = 0-DOS2A.SR3_DOS2
FROM prod_sigems.DOS2_LIEN_AVOIR
JOIN prod_sigems.DOS2 DOS2A ON DOS2A.ANN_DOS2 = ANN AND DOS2A.COD_DOS2 = COD AND DOS2A.IND_DOS2 = IND_AVOIR
WHERE DOS2F.ANN_DOS2 = ANN AND DOS2F.COD_DOS2 = COD AND DOS2F.IND_DOS2 = IND AND
NOT (DOS2F.SR1_DOS2 = 0-DOS2A.SR1_DOS2 AND DOS2F.SR2_DOS2 = 0-DOS2A.SR2_DOS2 AND DOS2F.SR3_DOS2 = 0-DOS2A.SR3_DOS2) AND
(DOS2A.SR1_DOS2 <> 0 OR DOS2A.SR2_DOS2 <> 0 OR DOS2A.SR3_DOS2 <> 0)
;
UPDATE prod_sigems.LIG_CLINI SET
MR1_LCL = ML1_LCL
FROM prod_sigems.DOS2
WHERE ANN_DOS2 = ANN_LCL AND
COD_DOS2 = COD_LCL AND
IND_DOS2 = IND_LCL AND
SR1_DOS2 = SJ1_DOS2 AND
SR1_DOS2 <> 0 AND
MR1_LCL <> ML1_LCL
;
UPDATE prod_sigems.LIG_CLINI SET
MR2_LCL = ML2_LCL
FROM prod_sigems.DOS2
WHERE ANN_DOS2 = ANN_LCL AND
COD_DOS2 = COD_LCL AND
IND_DOS2 = IND_LCL AND
SR2_DOS2 = SJ2_DOS2 AND
SR2_DOS2 <> 0 AND
MR2_LCL <> ML2_LCL
;
UPDATE prod_sigems.LIG_CLINI SET
MR3_LCL = ML3_LCL
FROM prod_sigems.DOS2
WHERE ANN_DOS2 = ANN_LCL AND
COD_DOS2 = COD_LCL AND
IND_DOS2 = IND_LCL AND
SR3_DOS2 = SJ3_DOS2 AND
SR3_DOS2 <> 0 AND
MR3_LCL <> ML3_LCL
;
UPDATE prod_sigems.LIG_HONOR SET
MR1_LHO = ML1_LHO
FROM prod_sigems.DOS2
WHERE ANN_DOS2 = ANN_LHO AND
COD_DOS2 = COD_LHO AND
IND_DOS2 = IND_LHO AND
HR1_DOS2 = HO1_DOS2 AND
HR1_DOS2 <> 0 AND
MR1_LHO <> ML1_LHO
;
UPDATE prod_sigems.LIG_HONOR SET
MR2_LHO = ML2_LHO
FROM prod_sigems.DOS2
WHERE ANN_DOS2 = ANN_LHO AND
COD_DOS2 = COD_LHO AND
IND_DOS2 = IND_LHO AND
HR2_DOS2 = HO2_DOS2 AND
HR2_DOS2 <> 0 AND
MR2_LHO <> ML2_LHO
;
UPDATE prod_sigems.LIG_HONOR SET
MR3_LHO = ML3_LHO
FROM prod_sigems.DOS2
WHERE ANN_DOS2 = ANN_LHO AND
COD_DOS2 = COD_LHO AND
IND_DOS2 = IND_LHO AND
HR3_DOS2 = HO3_DOS2 AND
HR3_DOS2 <> 0 AND
MR3_LHO <> ML3_LHO
;
UPDATE prod_sigems.DOS2
SET SR1_DOS2 = MR1_DOS2
FROM
(
SELECT ANN_LCL, COD_LCL, IND_LCL,
SUM(MR1_LCL) AS MR1_DOS2
FROM prod_sigems.DOS2
JOIN prod_sigems.LIG_CLINI ON
ANN_DOS2 = ANN_LCL AND
COD_DOS2 = COD_LCL AND
IND_DOS2 = IND_LCL AND
PRO_LCL <> 'ECAC'
GROUP BY 1,2,3
HAVING MAX(SR1_DOS2) <> SUM(MR1_LCL)
) subview
WHERE ANN_DOS2 = ANN_LCL AND
COD_DOS2 = COD_LCL AND
IND_DOS2 = IND_LCL
;
UPDATE prod_sigems.DOS2
SET SR2_DOS2 = MR2_DOS2
FROM
(
SELECT ANN_LCL, COD_LCL, IND_LCL,
SUM(MR2_LCL) AS MR2_DOS2
FROM prod_sigems.DOS2
JOIN prod_sigems.LIG_CLINI ON
ANN_DOS2 = ANN_LCL AND
COD_DOS2 = COD_LCL AND
IND_DOS2 = IND_LCL AND
PRO_LCL <> 'ECAC'
GROUP BY 1,2,3
HAVING MAX(SR2_DOS2) <> SUM(MR2_LCL)
) subview
WHERE ANN_DOS2 = ANN_LCL AND
COD_DOS2 = COD_LCL AND
IND_DOS2 = IND_LCL
;
UPDATE prod_sigems.DOS2
SET SR3_DOS2 = MR3_DOS2
FROM
(
SELECT ANN_LCL, COD_LCL, IND_LCL,
SUM(MR3_LCL) AS MR3_DOS2
FROM prod_sigems.DOS2
JOIN prod_sigems.LIG_CLINI ON
ANN_DOS2 = ANN_LCL AND
COD_DOS2 = COD_LCL AND
IND_DOS2 = IND_LCL AND
PRO_LCL <> 'ECAC'
GROUP BY 1,2,3
HAVING MAX(SR3_DOS2) <> SUM(MR3_LCL)
) subview
WHERE ANN_DOS2 = ANN_LCL AND
COD_DOS2 = COD_LCL AND
IND_DOS2 = IND_LCL
;
UPDATE prod_sigems.DOS2
SET HR1_DOS2 = MR1_DOS2
FROM
(
SELECT ANN_LHO, COD_LHO, IND_LHO,
SUM(MR1_LHO) AS MR1_DOS2
FROM prod_sigems.DOS2
JOIN prod_sigems.LIG_HONOR ON
ANN_DOS2 = ANN_LHO AND
COD_DOS2 = COD_LHO AND
IND_DOS2 = IND_LHO AND
CPH_LHO <> 'ECAH'
GROUP BY 1,2,3
HAVING MAX(HR1_DOS2) <> SUM(MR1_LHO)
) subview
WHERE ANN_DOS2 = ANN_LHO AND
COD_DOS2 = COD_LHO AND
IND_DOS2 = IND_LHO
;
UPDATE prod_sigems.DOS2
SET HR2_DOS2 = MR2_DOS2
FROM
(
SELECT ANN_LHO, COD_LHO, IND_LHO,
SUM(MR2_LHO) AS MR2_DOS2
FROM prod_sigems.DOS2
JOIN prod_sigems.LIG_HONOR ON
ANN_DOS2 = ANN_LHO AND
COD_DOS2 = COD_LHO AND
IND_DOS2 = IND_LHO AND
CPH_LHO <> 'ECAH'
GROUP BY 1,2,3
HAVING MAX(HR2_DOS2) <> SUM(MR2_LHO)
) subview
WHERE ANN_DOS2 = ANN_LHO AND
COD_DOS2 = COD_LHO AND
IND_DOS2 = IND_LHO
;
UPDATE prod_sigems.DOS2
SET HR3_DOS2 = MR3_DOS2
FROM
(
SELECT ANN_LHO, COD_LHO, IND_LHO,
SUM(MR3_LHO) AS MR3_DOS2
FROM prod_sigems.DOS2
JOIN prod_sigems.LIG_HONOR ON
ANN_DOS2 = ANN_LHO AND
COD_DOS2 = COD_LHO AND
IND_DOS2 = IND_LHO AND
CPH_LHO <> 'ECAH'
GROUP BY 1,2,3
HAVING MAX(HR3_DOS2) <> SUM(MR3_LHO)
) subview
WHERE ANN_DOS2 = ANN_LHO AND
COD_DOS2 = COD_LHO AND
IND_DOS2 = IND_LHO
;
-- Références à des factures inexistantes
DROP TABLE IF EXISTS w_DOS_ECRIT_err;
CREATE TEMP TABLE w_DOS_ECRIT_ERR AS
SELECT DOS_ECRIT.*, NULL::numeric AS IND_DOS2
FROM prod_sigems.DOS_ECRIT
LEFT JOIN prod_sigems.DOS2 ON
ANNEE = DOS2.ANN_DOS2 AND
CODE = DOS2.COD_DOS2 AND
INDICE = DOS2.IND_DOS2
WHERE DOS2.ANN_DOS2 IS NULL
;
UPDATE prod_sigems.DOS_ECRIT
SET INDICE = subview.IND_DOS2
FROM
(
SELECT ANNEE, CODE, INDICE, MAX(DOS2.IND_DOS2) AS IND_DOS2
FROM prod_sigems.DOS2
JOIN w_DOS_ECRIT_err ON
ANNEE = DOS2.ANN_DOS2 AND
CODE = DOS2.COD_DOS2
GROUP BY 1,2,3
) subview
WHERE DOS_ECRIT.ANNEE = subview.ANNEE AND
DOS_ECRIT.CODE = subview.CODE AND
DOS_ECRIT.INDICE = subview.INDICE
;
DROP TABLE IF EXISTS w_REG2_err;
CREATE TEMP TABLE w_REG2_ERR AS
SELECT REG2.*, NULL::numeric AS IND_DOS2
FROM prod_sigems.REG2
LEFT JOIN prod_sigems.DOS2 ON
ANN_REG2 = DOS2.ANN_DOS2 AND
COD_REG2 = DOS2.COD_DOS2 AND
IND_REG2 = DOS2.IND_DOS2
WHERE DOS2.ANN_DOS2 IS NULL AND
ANN_REG2 BETWEEN '00' AND '99'
;
UPDATE prod_sigems.REG2
SET IND_REG2 = subview.IND_DOS2
FROM
(
SELECT ANN_REG2, COD_REG2, IND_REG2, MAX(DOS2.IND_DOS2) AS IND_DOS2
FROM prod_sigems.DOS2
JOIN w_REG2_err ON
ANN_REG2 = DOS2.ANN_DOS2 AND
COD_REG2 = DOS2.COD_DOS2
GROUP BY 1,2,3
) subview
WHERE REG2.ANN_REG2 = subview.ANN_REG2 AND
REG2.COD_REG2 = subview.COD_REG2 AND
REG2.IND_REG2 = subview.IND_REG2
;
]]></sqlcmd>
</NODE>
<NODE label="Préparations encaissements et comptes clients">
<sqlcmd><![CDATA[
-- Table de travail règlements clinique
DROP TABLE IF EXISTS w_REG4;
CREATE TEMP TABLE w_REG4 AS
SELECT *
FROM prod_sigems.REG
JOIN prod_sigems.REG4 ON NUM_REG4 = SER_REG;
CREATE INDEX w_REG4_i1
ON w_REG4
USING btree
(NUM_CLI);
ANALYSE w_REG4;
-- Table de travail règlements honoraires
DROP TABLE IF EXISTS w_REG3;
CREATE TEMP TABLE w_REG3 AS
SELECT *
FROM prod_sigems.REG
JOIN prod_sigems.REG3 ON SER_REG3 = SER_REG;
CREATE INDEX w_REG3_i1
ON w_REG3
USING btree
(LHO_REG3);
ANALYSE w_REG3;
]]></sqlcmd>
</NODE>
<NODE label="Identification des séjours">
<sqlcmd><![CDATA[
-- Période (dernier mouvement pour détection now())
DROP TABLE IF EXISTS w_PERIODE;
CREATE TEMP TABLE w_PERIODE AS
SELECT
0::bigint AS periode_id,
GREATEST(date(DT_MOUV_SIGEMS),CASE WHEN date_part('hour', DT_SIGEMS) < 9 THEN DATE(DT_SIGEMS - INTERVAL '1 day') ELSE date(DT_SIGEMS) END) AS now_sigems,
GREATEST(date(DT_MOUV_SIGEMS),CASE WHEN date_part('hour', DT_SIGEMS) < 9 THEN DATE(DT_SIGEMS) ELSE date(DT_SIGEMS + INTERVAL '1 day') END) AS now_sigems_1
FROM (
SELECT greatest(max(DT_CREATION), max(DT_VALIDATION), max(DT_CALCUL), max(DT_EDITION), max(DT_TELETRANS)) as DT_SIGEMS
FROM prod_sigems.HISTO_DOS
WHERE 1=1
AND (DT_CREATION is null OR DT_CREATION <= now())
AND (DT_VALIDATION is null OR DT_VALIDATION <= now())
AND (DT_CALCUL is null OR DT_CALCUL <= now())
AND (DT_EDITION is null OR DT_EDITION <= now())
AND (DT_TELETRANS is null OR DT_TELETRANS <= now())
HAVING count(*) > 0
) sub,
(
SELECT 1,MAX(DAE_SEJ) as DT_MOUV_SIGEMS
FROM prod_sigems.SEJOUR
WHERE 1=1
AND ANN_SEJ != 'PA'
AND DAE_SEJ <= now()
GROUP BY 1
) sub2;
INSERT INTO w_PERIODE
SELECT
0::bigint AS periode_id,
CASE WHEN date_part('hour', DT_CREATION) < 9 THEN DATE(DT_CREATION - INTERVAL '1 day') ELSE date(DT_CREATION) END AS now_sigems,
CASE WHEN date_part('hour', DT_CREATION) < 9 THEN DATE(DT_CREATION) ELSE date(DT_CREATION + INTERVAL '1 day') END AS now_sigems_1
FROM (
SELECT now() AS DT_CREATION WHERE (SELECT COUNT(*) FROM w_PERIODE) = 0
) subview;
-- Selection
DROP TABLE IF EXISTS w_DOSSIER_SELECT;
CREATE TEMP TABLE w_DOSSIER_SELECT AS
SELECT
ANN_DOS AS ANN_SELECT,
COD_DOS AS COD_SELECT,
ANN_DOS || to_char(COD_DOS,'FM900000') AS no_sejour_SELECT,
0::text AS type_t2a,
0::text AS est_budget_global,
0::text AS avec_facturation_intermediaire,
''::text AS CMD_DOS
FROM prod_sigems.DOSSIER
WHERE DSO_DOS >= '[ENV_ADM_ANNEEDEBUT]0101' OR DSO_DOS IS NULL;
CREATE INDEX w_DOSSIER_SELECT_i1
ON w_DOSSIER_SELECT
USING btree
(COD_SELECT);
DELETE FROM w_DOSSIER_SELECT
USING prod_sigems.SUPPRESSION_DOS
WHERE ANN_SELECT = ANNEE AND
COD_SELECT = CODE;
-- Séances pré saisies à tord
DELETE FROM w_DOSSIER_SELECT
USING
(
SELECT ANN_DOS, COD_DOS
FROM prod_sigems.DOSSIER
JOIN prod_sigems.service ON SER_DOS = COD_SER
LEFT JOIN prod_sigems.SEJOUR ON ANN_SEJ = ANN_DOS AND COD_SEJ = COD_DOS
LEFT JOIN prod_sigems.DOS2 ON ANN_DOS2 = ANN_DOS AND COD_DOS2 = COD_DOS
LEFT JOIN prod_sigems.LIG_CLINI ON ANN_LCL = ANN_DOS AND COD_LCL = COD_DOS
LEFT JOIN prod_sigems.LIG_HONOR ON ANN_LHO = ANN_DOS AND COD_LHO = COD_DOS
WHERE DMT_SER IN ('198','302') AND
ANN_DOS <> 'PA' AND
DSO_DOS IS NULL AND
DEN_DOS <= now() - interval '10 days' AND
ANN_SEJ IS NULL AND
ANN_DOS2 IS NULL AND
ANN_LCL IS NULL AND
ANN_LHO IS NULL
) subview
WHERE ANN_SELECT = ANN_DOS AND
COD_SELECT = COD_DOS
;
INSERT INTO w_DOSSIER_SELECT
SELECT
ANN_DOS2,
COD_DOS2,
ANN_DOS2 || to_char(COD_DOS2,'FM900000'),
0::text AS type_t2a,
0::text AS est_budget_global,
0::text AS avec_facturation_intermediaire,
''::text AS CMD_DOS
FROM prod_sigems.DOS2
LEFT JOIN w_DOSSIER_SELECT ON ANN_DOS2 = ANN_SELECT AND COD_DOS2 = COD_SELECT
WHERE ETA_DOS2 >= 3 AND ANN_SELECT IS NULL
GROUP BY 1,2,3
HAVING (
MAX(COALESCE(DFA_DOS2, '20991231')) >= '[ENV_ADM_ANNEEDEBUT]0101'
)
ORDER BY 1,2;
INSERT INTO w_DOSSIER_SELECT
SELECT
ANN_LCL,
COD_LCL,
ANN_LCL || to_char(COD_LCL,'FM900000'),
0::text AS type_t2a,
0::text AS est_budget_global,
0::text AS avec_facturation_intermediaire,
''::text AS CMD_DOS
FROM
(
SELECT ANN_LCL, COD_LCL FROM prod_sigems.LIG_CLINI
JOIN prod_sigems.REG4 ON NUM_LCL = NUM_CLI
JOIN prod_sigems.REG ON NUM_REG4 = SER_REG
WHERE DAT_REG >= '[ENV_ADM_ANNEEDEBUT]0101'
GROUP BY 1,2
) subview
LEFT JOIN w_DOSSIER_SELECT ON ANN_LCL = ANN_SELECT AND COD_LCL = COD_SELECT
WHERE ANN_SELECT IS NULL;
INSERT INTO w_DOSSIER_SELECT
SELECT
ANN_LHO,
COD_LHO,
ANN_LHO || to_char(COD_LHO,'FM900000')
FROM
(
SELECT ANN_LHO, COD_LHO FROM prod_sigems.LIG_HONOR
JOIN w_REG3 ON NUM_LHO = LHO_REG3
WHERE DAT_REG >= '[ENV_ADM_ANNEEDEBUT]0101'
GROUP BY 1,2
) subview
LEFT JOIN w_DOSSIER_SELECT ON ANN_LHO = ANN_SELECT AND COD_LHO = COD_SELECT
WHERE ANN_SELECT IS NULL;
-- Suppression des dossiers pour les services ignorés
DELETE FROM w_DOSSIER_SELECT
USING prod_sigems.DOSSIER
JOIN activite[PX].t_services_facturation ON (DOSSIER.SER_DOS || '_' || MDT_DOS) = t_services_facturation.code_original
WHERE ANN_SELECT = ANN_DOS AND
COD_SELECT = COD_DOS AND
t_services_facturation.type_sejour = '9'
;
-- Suppression des prévus non rentrés ou prévus dans plus d'un mois
DELETE FROM w_DOSSIER_SELECT
USING prod_sigems.DOSSIER
WHERE ANN_SELECT = 'PA' AND
ANN_SELECT = ANN_DOS AND
COD_SELECT = COD_DOS AND
DEN_DOS <= date(NOW() - interval '1 days');
DELETE FROM w_DOSSIER_SELECT
USING prod_sigems.DOSSIER
WHERE ANN_SELECT = 'PA' AND
ANN_SELECT = ANN_DOS AND
COD_SELECT = COD_DOS AND
DEN_DOS > date(NOW() + interval '1 month');
CREATE INDEX w_DOSSIER_SELECT_i2
ON w_DOSSIER_SELECT
USING btree
(no_sejour_SELECT);
-- Montants 10% SSR sans quantité
UPDATE prod_sigems.LIG_CLINI
SET QTE_LCL = QTE_LCL * (date(DFI_LCL) - date(DDE_LCL) + 1)
WHERE PRO_LCL IN ('MPJ','MPHJ') AND
date(DFI_LCL) > date(DDE_LCL) AND
QTE_LCL IN (1, -1)
;
]]></sqlcmd>
</NODE>
</NODE>
<NODE name="SEJOUR" label="RECUPERATION DES SEJOURS">
<NODE label="Patients">
<sqlcmd><![CDATA[
DROP TABLE IF EXISTS w_PATIENT;
CREATE TEMP TABLE w_PATIENT AS
SELECT
COD_PAT,
COD_PAT AS no_patient,
s_dos.ANN_DOS || to_char(s_dos.COD_DOS,'FM900000') AS SEJ_NUM,
MAX(CASE WHEN NMA_PAT <> '' THEN NMA_PAT ELSE NOM_PAT END) AS NOM_PAT,
MAX(PRE_PAT) AS PRE_PAT,
MAX(NOM_PAT) AS NNA_PAT,
MAX(date(DNA_PAT)) AS DNA_PAT,
MAX(SEX_PAT) AS SEX_PAT,
MAX(AD1_PAT) AS AD1_PAT,
MAX(AD2_PAT) AS AD2_PAT,
MAX(CPO_PAT) AS CPO_PAT,
MAX(VIL_PAT) AS VIL_PAT,
MAX(TEL_PAT) AS TEL_PAT
FROM prod_sigems.PATIENT
JOIN (SELECT CPH_DOS, ANN_DOS, COD_DOS FROM prod_sigems.DOSSIER
JOIN w_DOSSIER_SELECT w_DOSSIER_SELECT ON ANN_DOS = ANN_SELECT AND COD_DOS = COD_SELECT) s_dos ON CPH_DOS = COD_PAT
GROUP BY 1,2,3;
UPDATE w_PATIENT SET
NOM_PAT = pool.NOM_PAT,
PRE_PAT = pool.PRE_PAT,
DNA_PAT = pool.DNA_PAT,
NNA_PAT = pool.NNA_PAT
FROM (
SELECT
DISTINCT no_patient,
last_value(NOM_PAT) OVER (PARTITION BY no_patient ORDER BY SEJ_NUM rows between unbounded preceding and unbounded following) AS NOM_PAT,
last_value(PRE_PAT) OVER (PARTITION BY no_patient ORDER BY SEJ_NUM rows between unbounded preceding and unbounded following) AS PRE_PAT,
last_value(DNA_PAT) OVER (PARTITION BY no_patient ORDER BY SEJ_NUM rows between unbounded preceding and unbounded following) AS DNA_PAT,
last_value(NNA_PAT) OVER (PARTITION BY no_patient ORDER BY SEJ_NUM rows between unbounded preceding and unbounded following) AS NNA_PAT
FROM w_patient) pool
WHERE pool.no_patient = w_PATIENT.no_patient;
CREATE INDEX w_PATIENT_i1
ON w_PATIENT
USING btree
(COD_PAT);
CREATE INDEX w_PATIENT_i2
ON w_PATIENT
USING btree
(no_patient);
UPDATE activite[PX].p_patients
SET nom = NOM_PAT,
nom_naissance = NNA_PAT,
prenom = PRE_PAT,
date_naissance = DNA_PAT,
code_sexe = CASE WHEN SEX_PAT IN ('F') THEN '2' ELSE '1' END
FROM w_PATIENT
WHERE p_patients.no_patient = w_PATIENT.no_patient
AND (
p_patients.nom IS DISTINCT FROM NOM_PAT OR
p_patients.prenom IS DISTINCT FROM PRE_PAT OR
p_patients.nom_naissance IS DISTINCT FROM NNA_PAT OR
p_patients.date_naissance IS DISTINCT FROM date(DNA_PAT) OR
p_patients.code_sexe IS DISTINCT FROM CASE WHEN SEX_PAT IN ('F') THEN '2' ELSE '1' END
);
INSERT INTO activite[PX].p_patients(finess, no_patient, nom, prenom, nom_naissance, date_naissance, code_sexe)
SELECT '', w_PATIENT.no_patient, MAX(NOM_PAT), MAX(PRE_PAT), MAX(NNA_PAT), MAX(DNA_PAT), MAX(CASE WHEN SEX_PAT IN ('F') THEN '2' ELSE '1' END)
FROM w_PATIENT
LEFT JOIN activite[PX].p_patients ON (w_PATIENT.no_patient = p_patients.no_patient)
WHERE p_patients.no_patient IS NULL
GROUP BY 1,2
;
]]></sqlcmd>
</NODE>
<NODE label="Séjours">
<sqlcmd><![CDATA[
-- GHS, GHM, date groupage
DROP TABLE IF EXISTS w_GHS_VALORISE;
CREATE TEMP TABLE w_GHS_VALORISE AS
SELECT
ANNEE AS ANN_GHSV,
CODE AS COD_GHSV,
ANNEE || to_char(CODE, 'FM900000') AS NUM_RSS,
MAX(CASE WHEN ENFANT <= 0 THEN COALESCE(to_number('0' || GHS,'00000'),0) ELSE 0 END) AS GHS,
MAX(CASE WHEN ENFANT > 0 THEN COALESCE(to_number('0' || GHS,'00000'),0) ELSE 0 END) AS GHS_BEBE1,
''::text AS CLE_GHM
FROM prod_sigems.GHS_VALORISE
JOIN w_DOSSIER_SELECT w_DOSSIER_SELECT ON ANNEE = ANN_SELECT AND CODE = COD_SELECT
GROUP BY 1,2,3;
UPDATE w_GHS_VALORISE
SET GHS = 0, GHS_BEBE1 = 0
WHERE (GHS <> 0 OR GHS_BEBE1 <> 0) AND
NUM_RSS IN (
SELECT
NUM_RSS
FROM prod_sigems.UN_RUM
JOIN prod_sigems.PMSI_GHM ON UN_RUM.GHM = PMSI_GHM.CODE_GHM
WHERE NUM_RSS IN (SELECT NUM_RSS FROM w_GHS_VALORISE WHERE GHS = 9999)
GROUP BY 1
HAVING MAX(CLE_GHM) LIKE '90%'
);
UPDATE w_GHS_VALORISE
SET GHS = 0, GHS_BEBE1 = 0
WHERE (GHS <> 0 OR GHS_BEBE1 <> 0) AND
NUM_RSS IN (
SELECT
NUM_RSS
FROM prod_sigems.UN_RUM
LEFT JOIN prod_sigems.PMSI_GHM ON UN_RUM.GHM = PMSI_GHM.CODE_GHM
WHERE NUM_RSS IN (SELECT NUM_RSS FROM w_GHS_VALORISE WHERE GHS = 9999) AND
PMSI_GHM.CODE_GHM IS NULL
GROUP BY 1
);
UPDATE w_GHS_VALORISE
SET CLE_GHM = PMSI_GHM.CLE_GHM
FROM prod_sigems.UN_RUM
JOIN prod_sigems.PMSI_GHM ON UN_RUM.GHM = PMSI_GHM.CODE_GHM
WHERE w_GHS_VALORISE.NUM_RSS = UN_RUM.NUM_RSS AND
UN_RUM.NUM_RUM < 50 AND
PMSI_GHM.CLE_GHM <> '' AND PMSI_GHM.CLE_GHM NOT LIKE '90%'
;
DROP TABLE IF EXISTS w_LIG_CLINI_forfaits;
CREATE TEMP TABLE w_LIG_CLINI_forfaits AS
SELECT
ANN_LCL,
COD_LCL
FROM prod_sigems.LIG_CLINI
WHERE PRO_LCL IN ('SE1', 'SE2', 'SE3', 'SE4','SE5', 'SE6', 'SE7', 'ATU', 'FPU', 'FFM')
GROUP BY 1,2
HAVING SUM(QTE_LCL) > 0;
CREATE INDEX w_LIG_CLINI_forfaits_i1
ON w_LIG_CLINI_forfaits
USING btree
(COD_LCL);
UPDATE w_GHS_VALORISE
SET CLE_GHM = '', GHS = 0, GHS_BEBE1 = 0
FROM w_LIG_CLINI_forfaits
WHERE ANN_GHSV = ANN_LCL AND COD_GHSV = COD_LCL AND
(CLE_GHM <> '' OR GHS <> 0 OR GHS_BEBE1 <> 0) ;
DROP TABLE IF EXISTS w_LIG_CLINI_forfaits;
INSERT INTO activite.t_divers(code, texte, valeur, description)
SELECT 'SIGETAGRP','Prise en compte état groupage','2','2=Ne traiter que les dossiers validés (si pas validé = equivalent pas groupe)'
WHERE 'SIGETAGRP' NOT IN (SELECT code FROM activite.t_divers)
;
DROP TABLE IF EXISTS w_CONTROLE_DIM;
CREATE TEMP TABLE w_CONTROLE_DIM AS
SELECT
ANNEE AS ANN_CTLD,
CODE AS COD_CTLD,
(MAX(Array[to_char(CONTROLE_DIM.NL,'FM0000'), CASE WHEN CONTROLE_DIM.ETAT >= 0 THEN CONTROLE_DIM.DATE_ACTION::text ELSE '00010101' END]))[2]::date AS DATE_GROUPAGE,
(MAX(Array[to_char(CONTROLE_DIM.NL,'FM0000'), CASE WHEN CONTROLE_DIM.ETAT >= 1 THEN CONTROLE_DIM.DATE_ACTION::text ELSE '00010101' END]))[2]::date AS DATE_VALIDATION
FROM prod_sigems.CONTROLE_DIM
WHERE ETAT <> 2
GROUP BY 1,2
ORDER BY 1,2;
UPDATE w_CONTROLE_DIM
SET DATE_VALIDATION = NULL
WHERE DATE_VALIDATION = '00010101'
;
UPDATE w_CONTROLE_DIM
SET DATE_GROUPAGE = NULL
WHERE DATE_GROUPAGE = '00010101'
;
UPDATE w_CONTROLE_DIM
SET DATE_GROUPAGE = DATE_VALIDATION
WHERE DATE_GROUPAGE IS NULL AND DATE_VALIDATION IS NOT NULL;
UPDATE w_CONTROLE_DIM
SET DATE_GROUPAGE = CASE WHEN DATE_VALIDATION >= DATE_GROUPAGE THEN DATE_VALIDATION ELSE NULL END
FROM activite.t_divers
WHERE t_divers.code = 'SIGETAGRP' AND t_divers.valeur = '2' AND
DATE_GROUPAGE IS DISTINCT FROM DATE_VALIDATION;
UPDATE w_GHS_VALORISE
SET CLE_GHM = '', GHS = 0, GHS_BEBE1 = 0
FROM w_CONTROLE_DIM
WHERE ANN_GHSV = ANN_CTLD AND COD_GHSV = COD_CTLD AND DATE_GROUPAGE IS NULL AND
(CLE_GHM <> '' OR GHS <> 0 OR GHS_BEBE1 <> 0) ;
UPDATE w_GHS_VALORISE
SET CLE_GHM = '', GHS = 0, GHS_BEBE1 = 0
WHERE (ANN_GHSV ,COD_GHSV ) NOT IN (SELECT ANN_CTLD,COD_CTLD FROM w_CONTROLE_DIM)
AND GHS != 0
;
-- Séjour
DROP TABLE IF EXISTS w_DOSSIER_SEJOUR;
CREATE TEMP TABLE w_DOSSIER_SEJOUR AS
SELECT
ANN_DOS,
COD_DOS,
MAX(COALESCE(SER_SEJ,SER_DOS,'')) AS SER_DOS,
MAX(COALESCE(NCH_SEJ,NCH_DOS,'')) AS NCH_DOS
FROM prod_sigems.DOSSIER
JOIN w_DOSSIER_SELECT w_DOSSIER_SELECT ON ANN_DOS = ANN_SELECT AND COD_DOS = COD_SELECT
LEFT JOIN prod_sigems.SEJOUR ON ANN_DOS = ANN_SEJ AND COD_DOS = COD_SEJ
GROUP BY 1,2;
CREATE INDEX w_DOSSIER_SEJOUR_i1
ON w_DOSSIER_SEJOUR
USING btree
(COD_DOS);
-- RIS_DOS2 represente le risque d'un dossier. Cette donnee peut varier au fil des refacturations, il faut prendre la derniere utilisee
DROP TABLE IF EXISTS w_DOS2;
CREATE TEMP TABLE w_DOS2 AS
SELECT
ANN_DOS2,
COD_DOS2,
MAX(CP1_DOS2) AS CP1_DOS2,
MAX(CA2_DOS2) AS CA2_DOS2,
(MAX(array[to_char(ind_dos2, 'FM999'), ris_dos2]))[2] as RIS_DOS2,
COUNT(*)
FROM prod_sigems.DOS2
JOIN w_DOSSIER_SELECT w_DOSSIER_SELECT ON ANN_DOS2 = ANN_SELECT AND COD_DOS2 = COD_SELECT
WHERE ETA_DOS2 >= 2
GROUP BY 1,2;
CREATE INDEX w_DOS2_i1
ON w_DOS2
USING btree
(COD_DOS2);
DROP TABLE IF EXISTS w_LIG_CLINI_externes;
CREATE TEMP TABLE w_LIG_CLINI_externes AS
SELECT
ANN_LCL,
COD_LCL,
'07'::text AS MDT_LCL
FROM prod_sigems.LIG_CLINI
JOIN w_DOSSIER_SELECT w_DOSSIER_SELECT ON ANN_LCL = ANN_SELECT AND COD_LCL = COD_SELECT
WHERE pro_lcl IN ('SE1', 'SE2', 'SE3', 'SE4','SE5', 'SE6', 'SE7', 'ATU', 'FPU', 'FFM')
GROUP BY 1,2
HAVING SUM(QTE_LCL) > 0;
CREATE INDEX w_LIG_CLINI_externes_i1
ON w_LIG_CLINI_externes
USING btree
(COD_LCL);
DROP TABLE IF EXISTS w_LIG_CLINI_hospit;
CREATE TEMP TABLE w_LIG_CLINI_hospit AS
SELECT
ANN_LCL,
COD_LCL,
MAX(CASE WHEN w_GHS_VALORISE.GHS IN (SELECT code FROM base.t_ghs WHERE texte like '%séance%') THEN '19'::text ELSE '03'::text END) AS MDT_LCL
FROM prod_sigems.LIG_CLINI
JOIN w_DOSSIER_SELECT w_DOSSIER_SELECT ON ANN_LCL = ANN_SELECT AND COD_LCL = COD_SELECT
LEFT JOIN w_GHS_VALORISE ON ANN_GHSV = ANN_LCL AND COD_GHSV = COD_LCL
WHERE pro_lcl IN ('GHS')
GROUP BY 1,2
HAVING SUM(QTE_LCL) > 0;
CREATE INDEX w_LIG_CLINI_hospit_i1
ON w_LIG_CLINI_hospit
USING btree
(COD_LCL);
-- Concernant le risque du dossier, on privilegie le risque present sur les factures (RIS_DOS2) au risque saisi a l'ouverture du dossier (RIS_DOS)
DROP TABLE IF EXISTS w_DOSSIER;
CREATE TEMP TABLE w_DOSSIER AS
SELECT
DOSSIER.ANN_DOS || to_char(DOSSIER.COD_DOS,'FM900000') AS SEJ_DOS,
DOSSIER.ANN_DOS,
DOSSIER.COD_DOS,
COALESCE(MDT_REEL,MDT_DOS) AS MDT_DOS,
COALESCE(w_LIG_CLINI_externes.MDT_LCL, w_LIG_CLINI_hospit.MDT_LCL, '') AS MDT_LCL,
DMT_SER AS DMT_DOS,
w_DOSSIER_SEJOUR.SER_DOS AS SER_DOS,
w_DOSSIER_SEJOUR.SER_DOS || '_' || COALESCE(MDT_REEL,MDT_DOS) AS SER_DOS_MDT,
COALESCE(SER_CHA,'') AS ETA_DOS,
COALESCE(SER_CHA || '|' || w_DOSSIER_SEJOUR.NCH_DOS, '|') AS NCH_DOS,
CCH_DOS,
CPH_DOS,
COALESCE(CHP_DOX,'') AS CHP_DOX,
DEN_DOS,
to_number('00' || MIN_DOS,'0000')*100 AS MIN_DOS,
to_timestamp(to_char(DEN_DOS,'YYYYMMDD') || MIN_DOS,'YYYYMMDDHH24')::timestamp without time zone AS w_DHEN_DOS,
COALESCE(DSO_DOS,'20991231') AS DSO_DOS,
to_number('00' || HEU_DOS,'0000')*100 AS HEU_DOS,
to_timestamp(to_char(COALESCE(DSO_DOS,'20991231'),'YYYYMMDD') || HEU_DOS,'YYYYMMDDHH24')::timestamp without time zone AS w_DHSO_DOS,
COALESCE(CP1_DOS2,'') AS CP1_DOS2,
COALESCE(CA2_DOS2,'') AS CA2_DOS2,
CASE WHEN LENGTH(MSO_DOS) = 2 THEN MSO_DOS ELSE '80' END AS MSO_DOS,
COALESCE(DATE_GROUPAGE,'20991231'::date) AS DATE_GROUPAGE,
COALESCE(GHS,0) AS GHS,
COALESCE(CLE_GHM,'') AS CLE_GHM,
COALESCE(GHS_BEBE1,0) AS GHS_BEBE1,
COALESCE(w_DOS2.RIS_DOS2, DOSSIER.RIS_DOS) AS RIS_DOS,
w_DOSSIER_SEJOUR.SER_DOS || '|' ||
COALESCE(MDT_REEL,MDT_DOS) || '|' ||
w_DOSSIER_SEJOUR.NCH_DOS || '|' ||
COALESCE(CCH_DOS,'|') || '|' ||
COALESCE(CP1_DOS2,'') || '|' ||
COALESCE(CA2_DOS2,'') || '|' ||
COALESCE(GHS,0) || '|' ||
COALESCE(CLE_GHM,'') || '|' ||
COALESCE(GHS_BEBE1,0) AS key
FROM prod_sigems.DOSSIER
JOIN w_DOSSIER_SELECT w_DOSSIER_SELECT ON ANN_DOS = ANN_SELECT AND COD_DOS = COD_SELECT
LEFT JOIN prod_sigems.DOSSIER_X ON DOSSIER.ANN_DOS = DOSSIER_X.ANN_DOX AND DOSSIER.COD_DOS = DOSSIER_X.COD_DOX AND CHP_DOX <> ''
LEFT JOIN prod_sigems.DOSSIER_MDT ON DOSSIER.ANN_DOS = DOSSIER_MDT.ANN_DOS AND DOSSIER.COD_DOS = DOSSIER_MDT.COD_DOS
LEFT JOIN w_LIG_CLINI_externes ON DOSSIER.ANN_DOS = w_LIG_CLINI_externes.ANN_LCL AND DOSSIER.COD_DOS = w_LIG_CLINI_externes.COD_LCL
LEFT JOIN w_LIG_CLINI_hospit ON DOSSIER.ANN_DOS = w_LIG_CLINI_hospit.ANN_LCL AND DOSSIER.COD_DOS = w_LIG_CLINI_hospit.COD_LCL
LEFT JOIN w_DOSSIER_SEJOUR ON DOSSIER.ANN_DOS = w_DOSSIER_SEJOUR.ANN_DOS AND DOSSIER.COD_DOS = w_DOSSIER_SEJOUR.COD_DOS
LEFT JOIN w_GHS_VALORISE ON ANN_GHSV = DOSSIER.ANN_DOS AND COD_GHSV = DOSSIER.COD_DOS
LEFT JOIN w_CONTROLE_DIM ON ANN_CTLD = DOSSIER.ANN_DOS AND COD_CTLD = DOSSIER.COD_DOS
LEFT JOIN w_DOS2 ON ANN_DOS2 = DOSSIER.ANN_DOS AND COD_DOS2 = DOSSIER.COD_DOS
LEFT JOIN prod_sigems.SERVICE ON w_DOSSIER_SEJOUR.SER_DOS = COD_SER
LEFT JOIN w_CHAMBRE ON w_DOSSIER_SEJOUR.NCH_DOS = COD_CHA AND w_DOSSIER_SEJOUR.NCH_DOS <> '' AND w_DOSSIER_SEJOUR.NCH_DOS <> '0'
WHERE DEN_DOS IS NOT NULL;
-- Code chambre particulière demandée selon historique facturation
UPDATE w_DOSSIER
SET CHP_DOX = 'P*'||CHP_DOX
WHERE CHP_DOX <> '' AND CHP_DOX NOT LIKE 'P%' AND CHP_DOX <> 'CC' AND
CHP_DOX IN
(
SELECT
CHP_DOX
FROM
(
SELECT CHP_DOX,
count(DISTINCT ANN_DOX||to_char(COD_DOX,'FM900000')),
count(DISTINCT CASE WHEN ACT_PRC IS NOT NULL THEN ANN_DOX||to_char(COD_DOX,'FM900000') ELSE NULL END),
base.cti_division(
count(DISTINCT CASE WHEN ACT_PRC IS NOT NULL THEN ANN_DOX||to_char(COD_DOX,'FM900000') ELSE NULL END)::numeric , count(DISTINCT ANN_DOX||to_char(COD_DOX,'FM900000'))) AS pct
FROM prod_sigems.dossier_x
JOIN prod_sigems.dos2 ON ann_dox = ann_dos2 AND cod_dox = COD_DOS2 AND ETA_DOS2 >= 4
LEFT JOIN prod_sigems.lig_clini ON ANN_DOx = ANN_LCL AND COD_LCL = COD_DOX
LEFT JOIN prod_sigems.prod_clini ON PRO_LCL = COD_PRC AND (ACT_PRC LIKE 'CP%' OR ACT_PRC = 'SHO')
WHERE CHP_DOX <> '' AND CHP_DOX NOT LIKE 'P%' AND CHP_DOX <> 'CC'
GROUP BY 1
ORDER BY 1
) subview
WHERE pct >= 0.75
)
;
UPDATE w_DOSSIER SET
HEU_DOS = HEU_DOS + HEU_DOS_MIN,
w_DHSO_DOS = to_timestamp(to_char(COALESCE(DSO_DOS,'20991231'),'YYYYMMDD') || to_char(HEU_DOS+HEU_DOS_MIN,'FM0000'),'YYYYMMDDHH24MI')::timestamp without time zone
FROM
(
SELECT ANN_DOS, COD_DOS, substr(MAX(HEU_SEJ||MIN_SEJ),3,2)::numeric AS HEU_DOS_MIN
FROM prod_sigems.dossier
JOIN prod_sigems.sejour ON
ann_dos = ann_sej AND
COD_DOS = COD_SEJ
WHERE DSO_DOS < now() AND
DSO_DOS = DAS_SEJ AND
DSO_DOS IS NOT NULL AND
ANN_DOS NOT LIKE 'P%'
GROUP BY 1,2
HAVING substr(MAX(HEU_SEJ||MIN_SEJ),3,2) <> '00'
) subview
WHERE w_DOSSIER.ANN_DOS = subview.ANN_DOS AND
w_DOSSIER.COD_DOS = subview.COD_DOS
;
UPDATE w_DOSSIER
SET ETA_DOS = substr(NCH_DOS,2), NCH_DOS = substr(NCH_DOS,2) || NCH_DOS
WHERE ETA_DOS = '' AND NCH_DOS <> '|' AND NCH_DOS LIKE '|%';
CREATE INDEX w_DOSSIER_i1
ON w_DOSSIER
USING btree
(SEJ_DOS);
CREATE INDEX w_DOSSIER_i2
ON w_DOSSIER
USING btree
(COD_DOS);
DROP TABLE IF EXISTS w_DOSSIER_key;
CREATE TEMP TABLE w_DOSSIER_key AS
SELECT
key,
SER_DOS,
SER_DOS_MDT,
ETA_DOS,
NCH_DOS,
CCH_DOS,
CP1_DOS2,
CA2_DOS2,
GHS,
CLE_GHM,
GHS_BEBE1,
0 AS mode_traitement_id,
''::text AS mode_traitement_code,
''::text AS dmt_code,
'0'::text AS type_sejour_force,
0::bigint AS lieu_id,
0::bigint AS unite_fonctionnelle_id,
0::bigint AS medecin_sejour_id,
0::bigint AS ghs_id,
0::bigint AS ghm_id,
0::bigint AS ghs_bebe1_id,
0::bigint AS ghs_bebe2_id,
0::bigint AS ghs_bebe3_id,
0::bigint AS tiers_payant_0_id,
0::bigint AS tiers_payant_1_id,
0::bigint AS tiers_payant_2_id,
0::bigint AS tiers_payant_22_id
FROM w_DOSSIER
GROUP BY 1,2,3,4,5,6,7,8,9,10,11;
UPDATE w_DOSSIER_key SET
mode_traitement_id = t_modes_traitement.oid,
mode_traitement_code = t_modes_traitement.code,
dmt_code = t_dmt.code,
type_sejour_force = CASE WHEN t_services_facturation.type_sejour IN ('1', '2', '3', '4', '5', '9') THEN t_services_facturation.type_sejour ELSE '0' END
FROM activite[PX].t_services_facturation
JOIN base.t_modes_traitement ON t_services_facturation.mode_traitement_id = t_modes_traitement.oid
JOIN base.t_dmt ON t_services_facturation.dmt_id = t_dmt.oid
WHERE t_services_facturation.code_original = SER_DOS_MDT;
UPDATE w_DOSSIER_key
set medecin_sejour_id = t_medecins_administratifs.oid
FROM activite[PX].t_medecins_administratifs
WHERE CCH_DOS <> '' AND code_original = CCH_DOS;
UPDATE w_DOSSIER_key
set tiers_payant_0_id = t_tiers_payant.oid
FROM activite[PX].t_tiers_payant
WHERE code_original = 'PATIENT';
UPDATE w_DOSSIER_key
set tiers_payant_1_id = t_tiers_payant.oid
FROM activite[PX].t_tiers_payant
WHERE CP1_DOS2 <> '' AND code_original = CP1_DOS2 AND type_tiers_payant = '1';
UPDATE w_DOSSIER_key
set tiers_payant_2_id = t_tiers_payant.oid
FROM activite[PX].t_tiers_payant
WHERE CA2_DOS2 <> '' AND code_original = CA2_DOS2 AND type_tiers_payant = '2';
UPDATE w_DOSSIER_key
set ghs_id = t_ghs.oid
FROM base.t_ghs
WHERE GHS <> 0 AND t_ghs.code = GHS;
UPDATE w_DOSSIER_key
set ghm_id = t_ghm.oid
FROM base.t_ghm
WHERE CLE_GHM <> '' AND t_ghm.code = CLE_GHM AND t_ghm.code NOT LIKE '90%';
UPDATE w_DOSSIER_key
set ghs_bebe1_id = t_ghs.oid
FROM base.t_ghs
WHERE GHS_BEBE1 <> 0 AND t_ghs.code = GHS_BEBE1;
INSERT INTO activite[PX].t_lieux(
code_original_1, code_original_2, code_original_3, code_original_4, code_original_6)
SELECT SER_DOS_MDT, '', ETA_DOS, NCH_DOS, SER_DOS
FROM w_DOSSIER_key
LEFT JOIN activite[PX].t_lieux ON (
code_original_1 = SER_DOS_MDT AND
code_original_2 = '' AND
code_original_3 = ETA_DOS AND
code_original_4 = NCH_DOS AND
code_original_6 = SER_DOS
)
WHERE t_lieux.oid IS NULL
GROUP BY 1,2,3,4,5;
UPDATE w_DOSSIER_key
set lieu_id = t_lieux.oid
FROM activite[PX].t_lieux
WHERE code_original_1 = SER_DOS_MDT AND
code_original_2 = '' AND
code_original_3 = ETA_DOS AND
code_original_4 = NCH_DOS AND
code_original_6 = SER_DOS;
UPDATE activite[PX].t_lieux SET
service_facturation_id = COALESCE(t_services_facturation.oid,0),
mode_traitement_id = COALESCE(t_services_facturation.mode_traitement_id,0)
FROM
activite[PX].t_services_facturation
WHERE code_original_1 = t_services_facturation.code_original
AND (t_lieux.service_facturation_id <> COALESCE(t_services_facturation.oid,0) OR
t_lieux.mode_traitement_id <> COALESCE(t_services_facturation.mode_traitement_id,0)
)
;
UPDATE activite[PX].t_lieux SET
unite_fonctionnelle_id = COALESCE(t_unites_fonctionnelles.oid,0)
FROM
activite[PX].t_unites_fonctionnelles
WHERE code_original_6 = t_unites_fonctionnelles.code_original
AND unite_fonctionnelle_id <> COALESCE(t_unites_fonctionnelles.oid,0);
UPDATE activite[PX].t_lieux SET
unite_fonctionnelle_id = COALESCE(t_unites_fonctionnelles.oid,0)
FROM
activite[PX].t_unites_fonctionnelles
WHERE code_original_6 = t_unites_fonctionnelles.code_original
AND unite_fonctionnelle_id <> COALESCE(t_unites_fonctionnelles.oid,0);
UPDATE activite[PX].t_lieux SET
lit_id = COALESCE(t_lits.oid,0)
FROM
activite[PX].t_lits
WHERE code_original_4 = t_lits.code_original AND
t_lieux.lit_id <> COALESCE(t_lits.oid,0)
;
-- Si forcage service séance et groupage dans une autre cmd,
UPDATE w_DOSSIER_key
SET type_sejour_force = '0'
WHERE type_sejour_force = '5' AND
substr(cle_ghm,1,2) BETWEEN '01' AND '27'
;
DROP TABLE IF EXISTS w_sejours;
CREATE TEMP TABLE w_sejours AS
SELECT
''::text AS finess,
SEJ_DOS as no_sejour,
SEJ_DOS as code_original,
CPH_DOS as no_patient,
DEN_DOS as date_entree,
MIN_DOS * 100 as heure_entree,
DSO_DOS as date_sortie,
HEU_DOS * 100 as heure_sortie,
CASE WHEN SEX_PAT IN ('F') THEN '2' ELSE '1' END as code_sexe,
0 AS age,
CASE
WHEN DSO_DOS IS NOT NULL AND DSO_DOS < '20991231' AND SEJ_DOS NOT LIKE 'P%' AND DSO_DOS <= date(now())THEN 1 ELSE 0 END::numeric as code_sorti,
CASE
WHEN SEJ_DOS LIKE 'P%' THEN 1::numeric
WHEN DEN_DOS > date(now()) THEN 1::numeric
ELSE 0::numeric END AS code_prevu,
CASE
WHEN type_sejour_force <> '0' THEN type_sejour_force
WHEN MDT_LCL IN ('03') AND DSO_DOS = DEN_DOS THEN '2'
WHEN MDT_LCL IN ('03') THEN '1'
WHEN MDT_LCL IN ('07') THEN '3'
WHEN mode_traitement_code IN ('07') OR dmt_code IN ('958') THEN '3'
WHEN mode_traitement_code IN ('19', '23') AND DSO_DOS = DEN_DOS THEN '2'
WHEN mode_traitement_code IN ('04') AND DSO_DOS = DEN_DOS THEN '2'
WHEN mode_traitement_code IN ('03') AND DSO_DOS = DEN_DOS THEN '2'
WHEN mode_traitement_code IN ('03') THEN '1'
ELSE '1' END as type_sejour,
lieu_id AS lieu_sortie_id,
unite_fonctionnelle_id,
w_DOSSIER_key.medecin_sejour_id AS medecin_sejour_id,
ghs_id,
ghm_id,
ghs_bebe1_id,
0::numeric AS ghs_bebe2_id,
0::numeric AS ghs_bebe3_id,
DATE_GROUPAGE,
CASE WHEN w_DOSSIER.CHP_DOX LIKE ANY(string_to_array(t_divers.valeur, ',')) THEN '1'::text ELSE '0'::text END AS code_cp_demandee,
mode_traitement_id,
CASE WHEN SUBSTR(ADM_DOS,1,1) <> '' THEN (CASE WHEN ANU_ADM <> '' THEN (CASE WHEN DAF_ADM IS NULL THEN ANU_ADM ELSE (CASE WHEN SUBSTR(ADM_DOS,1,1) IN ('6','7','8') THEN SUBSTR(ADM_DOS,1,1) ELSE '8' END) END) ELSE (CASE WHEN SUBSTR(ADM_DOS,1,1) IN ('6','7','8') THEN SUBSTR(ADM_DOS,1,1) ELSE '8' END) END)::text ELSE '8'::text END as mode_entree,
CASE WHEN SUBSTR(ADM_DOS,2,1) <> '' THEN (CASE WHEN ANU_ADM <> '' AND DAF_ADM IS NULL THEN (CASE WHEN (SUBSTR(ADM_DOS,1,1) = 'S' OR SUBSTR(ADM_DOS,2,1) = 'R') THEN '1' ELSE SUBSTR(ADM_DOS,2,1) END) ELSE SUBSTR(ADM_DOS,2,1) END)::text ELSE '0'::text END as provenance,
COALESCE(SUBSTR(MSO_DOS,1,1)::character(1), '8'::text) as mode_sortie,
COALESCE(SUBSTR(MSO_DOS,2,1)::character(1), '0'::text) as destination,
tiers_payant_0_id,
tiers_payant_1_id,
tiers_payant_2_id,
tiers_payant_22_id,
0 AS est_budget_global,
COALESCE(t_codes_postaux.oid, 0) as code_postal_id,
COALESCE(t_risque.oid, 0) as risque_id
FROM w_DOSSIER
JOIN activite.t_divers ON t_divers.code = 'SIGEMS_CHPDOX'
LEFT JOIN prod_sigems.DOSSIER_X ON w_DOSSIER.ANN_DOS = DOSSIER_X.ANN_DOX AND w_DOSSIER.COD_DOS = DOSSIER_X.COD_DOX
LEFT JOIN prod_sigems.ADMISSION ON COD_ADM = ADM_DOS
JOIN w_DOSSIER_key ON w_DOSSIER.key = w_DOSSIER_key.key
LEFT JOIN w_PATIENT ON CPH_DOS = COD_PAT AND SEJ_DOS = SEJ_NUM
LEFT JOIN base.t_codes_postaux on t_codes_postaux.code = w_PATIENT.CPO_PAT
LEFT JOIN activite.t_risque ON t_risque.code = w_DOSSIER.RIS_DOS
;
--Récupération de l'heure exacte d'entrée via le timestamp du premier mouvement du séjour
UPDATE w_sejours
SET heure_entree = (TO_CHAR(dt_debut, 'HH24MI') || '00')::numeric
FROM prod_sigems.SEJOUR
WHERE dt_debut IS NOT NULL AND
w_sejours.no_sejour = ANN_SEJ || to_char(COD_SEJ, 'FM900000')
;
-- Forcage type selon séjour
UPDATE w_sejours
SET type_sejour = t_sejour.type_sejour
FROM activite.t_sejour
WHERE t_sejour.no_sejour = w_sejours.no_sejour AND
t_sejour.type_sejour IN ('1','2','3','4','5','6','9');
-- Forcage '9' pour Séjours ABANDON (prestation ABAN)
UPDATE w_sejours
SET type_sejour = '9'
WHERE type_sejour <> '9' AND no_sejour IN
(
SELECT ANN_LCL || to_char(COD_LCL,'FM900000')
FROM prod_sigems.DOS2
JOIN
(
SELECT ANN_LCL, COD_LCL
FROM prod_sigems.LIG_CLINI
JOIN prod_sigems.DOS2 ON ANN_DOS2 = ANN_LCL AND COD_DOS2 = COD_LCL AND IND_DOS2 = IND_LCL
WHERE PRO_LCL = 'ABAN' AND ETA_DOS2 >= 4
GROUP BY 1,2
) subview ON ANN_DOS2 = ANN_LCL AND COD_DOS2 = COD_LCL
GROUP BY 1
HAVING SUM(SJ1_DOS2+SJ2_DOS2+SJ2_DOS2+HO1_DOS2+HO2_DOS2+HO3_DOS2) = 0
)
;
-- Calcul dates sortie prévisionnelles
DROP TABLE IF EXISTS w_DOSSIER_DMS;
CREATE TEMP TABLE w_DOSSIER_DMS AS
SELECT SER_DOS, round(AVG(date(DSO_DOS) - date(DEN_DOS)),0) AS dms
FROM prod_sigems.DOSSIER
JOIN w_PERIODE ON periode_id = 0
WHERE DEN_DOS IS NOT NULL AND DSO_DOS >= DEN_DOS AND DSO_DOS <= now_sigems
GROUP BY 1;
UPDATE w_sejours
SET date_sortie = GREATEST(date_entree + (dms || ' days')::interval, now_sigems_1)
FROM w_DOSSIER_select
JOIN w_PERIODE ON periode_id = 0
JOIN prod_sigems.DOSSIER ON ANN_SELECT = ANN_DOS AND COD_SELECT = COD_DOS
JOIN w_DOSSIER_DMS ON DOSSIER.SER_DOS = w_DOSSIER_DMS.SER_DOS
WHERE no_sejour = no_sejour_SELECT AND
date_sortie = '20991231' AND code_sorti <> '1';
DROP TABLE IF EXISTS w_sejours_DMS;
CREATE TEMP TABLE w_sejours_DMS AS
SELECT medecin_sejour_id, unite_fonctionnelle_id, round(AVG(date(date_sortie) - date(date_entree)),0) AS dms
FROM w_sejours
JOIN w_PERIODE ON periode_id = 0
WHERE code_sorti = '1' AND date_sortie >= date_entree AND date_sortie <= now_sigems
GROUP BY 1,2;
UPDATE w_sejours
SET date_sortie = GREATEST(date_entree + (dms || ' days')::interval, now_sigems_1)
FROM w_sejours_DMS
JOIN w_PERIODE ON periode_id = 0
WHERE w_sejours.medecin_sejour_id = w_sejours_DMS.medecin_sejour_id AND
w_sejours.unite_fonctionnelle_id = w_sejours_DMS.unite_fonctionnelle_id AND
date_sortie = '20991231' AND code_sorti <> '1';
DROP TABLE IF EXISTS w_sejours_DMS;
CREATE TEMP TABLE w_sejours_DMS AS
SELECT medecin_sejour_id, round(AVG(date(date_sortie) - date(date_entree)),0) AS dms
FROM w_sejours
JOIN w_PERIODE ON periode_id = 0
WHERE code_sorti = '1' AND date_sortie >= date_entree AND date_sortie <= now_sigems
GROUP BY 1;
UPDATE w_sejours
SET date_sortie = GREATEST(date_entree + (dms || ' days')::interval, now_sigems_1)
FROM w_sejours_DMS
JOIN w_PERIODE ON periode_id = 0
WHERE w_sejours.medecin_sejour_id = w_sejours_DMS.medecin_sejour_id AND
date_sortie = '20991231' AND code_sorti <> '1';
DROP TABLE IF EXISTS w_sejours_DMS;
CREATE TEMP TABLE w_sejours_DMS AS
SELECT round(AVG(date(date_sortie) - date(date_entree)),0) AS dms
FROM w_sejours
JOIN w_PERIODE ON periode_id = 0
WHERE code_sorti = '1' AND date_sortie >= date_entree AND date_sortie <= now_sigems;
UPDATE w_sejours
SET date_sortie = GREATEST(date_entree + (dms || ' days')::interval, now_sigems_1)
FROM w_sejours_DMS
JOIN w_PERIODE ON periode_id = 0
WHERE date_sortie = '20991231' AND code_sorti <> '1';
UPDATE w_sejours SET heure_sortie = heure_entree + 40000
WHERE code_sorti <> '1' AND date_sortie = date_entree AND heure_entree <= 190000;
UPDATE w_sejours SET heure_sortie = 235959
WHERE code_sorti <> '1' AND date_sortie = date_entree AND heure_entree > 190000;
UPDATE w_sejours SET heure_sortie = 130000
WHERE code_sorti <> '1' AND date_sortie > date_entree ;
UPDATE w_DOSSIER
SET w_DHSO_DOS = to_timestamp(to_char(COALESCE(date_sortie,'20991231'),'YYYYMMDD') || to_char(heure_sortie,'FM000000'),'YYYYMMDDHH24')
FROM w_sejours
WHERE SEJ_DOS = no_sejour AND
(code_sorti <> '1' OR code_prevu = '1');
-- Pointage séjours Budget Global
UPDATE w_sejours
SET est_budget_global = 1
FROM activite[PX].t_lieux
JOIN activite[PX].t_services_facturation ON service_facturation_id = t_services_facturation.oid AND t_services_facturation.est_budget_global = '1'
WHERE lieu_sortie_id = t_lieux.oid AND
w_sejours.est_budget_global IS DISTINCT FROM 1;
-- FINESS
UPDATE w_sejours
SET finess = t_finess.code
FROM activite[PX].t_lieux
JOIN activite[PX].t_services_facturation on service_facturation_id = t_services_facturation.oid
JOIN base.t_finess ON finess_id = t_finess.oid
WHERE lieu_sortie_id = t_lieux.oid;
UPDATE w_sejours
SET finess = '000000000'
WHERE finess = '';
-- Validation des séjours
SELECT base.cti_disable_index('activite[PX]', 'i_sejours_2');
SELECT base.cti_disable_index('activite[PX]', 'i_sejours_3');
SELECT base.cti_disable_index('activite[PX]', 'i_sejours_4');
SELECT base.cti_disable_index('activite[PX]', 'i_sejours_5');
SELECT base.cti_disable_index('activite[PX]', 'i_sejours_6');
SELECT base.cti_disable_index('activite[PX]', 'i_sejours_7');
SELECT base.cti_disable_index('activite[PX]', 'i_sejours_8');
SELECT base.cti_disable_index('activite[PX]', 'i_sejours_9');
SELECT base.cti_disable_index('activite[PX]', 'i_sejours_10');
SELECT base.cti_disable_index('activite[PX]', 'i_sejours_11');
SELECT base.cti_disable_index('activite[PX]', 'i_sejours_12');
SELECT base.cti_disable_index('activite[PX]', 'i_sejours_13');
UPDATE activite[PX].p_sejours SET
finess = w_sejours.finess,
code_original = w_sejours.code_original,
no_patient = w_sejours.no_patient,
date_entree = w_sejours.date_entree,
heure_entree = w_sejours.heure_entree,
date_sortie = w_sejours.date_sortie,
heure_sortie = w_sejours.heure_sortie,
code_sexe = w_sejours.code_sexe,
age = w_sejours.age,
code_sorti = w_sejours.code_sorti,
code_prevu = w_sejours.code_prevu,
type_sejour = w_sejours.type_sejour,
lieu_sortie_id = w_sejours.lieu_sortie_id,
medecin_sejour_id = w_sejours.medecin_sejour_id,
code_cp_demandee = w_sejours.code_cp_demandee,
mode_traitement_id = w_sejours.mode_traitement_id,
mode_entree = w_sejours.mode_entree,
provenance = w_sejours.provenance,
mode_sortie = w_sejours.mode_sortie,
destination = w_sejours.destination,
tiers_payant_0_id = w_sejours.tiers_payant_0_id,
tiers_payant_1_id = w_sejours.tiers_payant_1_id,
tiers_payant_2_id = w_sejours.tiers_payant_2_id,
tiers_payant_22_id = w_sejours.tiers_payant_22_id,
est_budget_global = w_sejours.est_budget_global,
date_groupage = w_sejours.date_groupage,
ghs_id = w_sejours.ghs_id,
ghm_id = w_sejours.ghm_id,
ghs_bebe1_id = w_sejours.ghs_bebe1_id,
ghs_bebe2_id = w_sejours.ghs_bebe2_id,
ghs_bebe3_id = w_sejours.ghs_bebe3_id,
code_postal_id = w_sejours.code_postal_id,
risque_id = w_sejours.risque_id
FROM w_sejours
WHERE w_sejours.no_sejour = p_sejours.no_sejour
AND (
w_sejours.finess IS DISTINCT FROM p_sejours.finess OR
w_sejours.code_original IS DISTINCT FROM p_sejours.code_original OR
w_sejours.no_patient IS DISTINCT FROM p_sejours.no_patient OR
w_sejours.date_entree IS DISTINCT FROM p_sejours.date_entree OR
w_sejours.heure_entree IS DISTINCT FROM p_sejours.heure_entree OR
w_sejours.date_sortie IS DISTINCT FROM p_sejours.date_sortie OR
w_sejours.heure_sortie IS DISTINCT FROM p_sejours.heure_sortie OR
w_sejours.code_sexe IS DISTINCT FROM p_sejours.code_sexe OR
w_sejours.age IS DISTINCT FROM p_sejours.age OR
w_sejours.code_sorti IS DISTINCT FROM p_sejours.code_sorti OR
w_sejours.code_prevu IS DISTINCT FROM p_sejours.code_prevu OR
w_sejours.type_sejour IS DISTINCT FROM p_sejours.type_sejour OR
w_sejours.lieu_sortie_id IS DISTINCT FROM p_sejours.lieu_sortie_id OR
w_sejours.medecin_sejour_id IS DISTINCT FROM p_sejours.medecin_sejour_id OR
w_sejours.code_cp_demandee IS DISTINCT FROM p_sejours.code_cp_demandee OR
w_sejours.mode_traitement_id IS DISTINCT FROM p_sejours.mode_traitement_id OR
w_sejours.mode_entree IS DISTINCT FROM p_sejours.mode_entree OR
w_sejours.provenance IS DISTINCT FROM p_sejours.provenance OR
w_sejours.mode_sortie IS DISTINCT FROM p_sejours.mode_sortie OR
w_sejours.destination IS DISTINCT FROM p_sejours.destination OR
w_sejours.tiers_payant_0_id IS DISTINCT FROM p_sejours.tiers_payant_0_id OR
w_sejours.tiers_payant_1_id IS DISTINCT FROM p_sejours.tiers_payant_1_id OR
w_sejours.tiers_payant_2_id IS DISTINCT FROM p_sejours.tiers_payant_2_id OR
w_sejours.tiers_payant_22_id IS DISTINCT FROM p_sejours.tiers_payant_22_id OR
w_sejours.est_budget_global IS DISTINCT FROM p_sejours.est_budget_global OR
w_sejours.date_groupage IS DISTINCT FROM p_sejours.date_groupage OR
w_sejours.ghs_id IS DISTINCT FROM p_sejours.ghs_id OR
w_sejours.ghm_id IS DISTINCT FROM p_sejours.ghm_id OR
w_sejours.ghs_bebe1_id IS DISTINCT FROM p_sejours.ghs_bebe1_id OR
w_sejours.ghs_bebe2_id IS DISTINCT FROM p_sejours.ghs_bebe2_id OR
w_sejours.ghs_bebe3_id IS DISTINCT FROM p_sejours.ghs_bebe3_id OR
w_sejours.code_postal_id IS DISTINCT FROM p_sejours.code_postal_id OR
w_sejours.risque_id IS DISTINCT FROM p_sejours.risque_id
);
INSERT INTO activite[PX].p_sejours (
finess,
no_sejour,
code_original,
no_patient,
date_entree,
heure_entree,
date_sortie,
heure_sortie,
code_sexe,
age,
code_sorti,
code_prevu,
type_sejour,
lieu_sortie_id,
medecin_sejour_id,
ghs_id,
ghm_id,
ghs_bebe1_id,
ghs_bebe2_id,
ghs_bebe3_id,
date_groupage,
code_cp_demandee,
mode_traitement_id,
mode_entree,
provenance,
mode_sortie,
destination,
tiers_payant_0_id,
tiers_payant_1_id,
tiers_payant_2_id,
tiers_payant_22_id,
est_budget_global,
code_postal_id,
risque_id
)
SELECT
w_sejours.finess,
w_sejours.no_sejour,
w_sejours.code_original,
w_sejours.no_patient,
w_sejours.date_entree,
w_sejours.heure_entree,
w_sejours.date_sortie,
w_sejours.heure_sortie,
w_sejours.code_sexe,
w_sejours.age,
w_sejours.code_sorti,
w_sejours.code_prevu,
w_sejours.type_sejour,
w_sejours.lieu_sortie_id,
w_sejours.medecin_sejour_id,
w_sejours.ghs_id,
w_sejours.ghm_id,
w_sejours.ghs_bebe1_id,
w_sejours.ghs_bebe2_id,
w_sejours.ghs_bebe3_id,
w_sejours.date_groupage,
w_sejours.code_cp_demandee,
w_sejours.mode_traitement_id,
w_sejours.mode_entree,
w_sejours.provenance,
w_sejours.mode_sortie,
w_sejours.destination,
w_sejours.tiers_payant_0_id,
w_sejours.tiers_payant_1_id,
w_sejours.tiers_payant_2_id,
w_sejours.tiers_payant_22_id,
w_sejours.est_budget_global,
w_sejours.code_postal_id,
w_sejours.risque_id
FROM w_sejours LEFT JOIN activite[PX].p_sejours ON (w_sejours.no_sejour = p_sejours.no_sejour)
WHERE p_sejours.no_sejour IS NULL;
DELETE FROM activite[PX].p_sejours WHERE no_sejour NOT IN (SELECT no_sejour_SELECT FROM w_DOSSIER_SELECT);
DELETE FROM activite[PX].p_sejours USING
(
SELECT no_sejour, min(CTID) AS koctid
FROM activite[PX].p_sejours
GROUP BY 1
HAVING count(*) > 1
) subview
WHERE CTID = koctid;
-- Séjours ignorés
UPDATE activite[PX].p_sejours
SET etat = 'I'
FROM activite.t_sejour
WHERE t_sejour.no_sejour = p_sejours.no_sejour AND
est_ignore = '1' AND
etat <> 'I' AND
'[PX]' = '';
UPDATE activite[PX].p_sejours
SET etat = ''
WHERE etat = 'I' AND
no_sejour NOT IN (SELECT no_sejour FROM activite.t_sejour WHERE est_ignore = '1') AND
'[PX]' = '';
-- Médecin séjour forcé
UPDATE activite[PX].p_sejours
SET medecin_sejour_id = t_sejour.medecin_sejour_id
FROM activite.t_sejour
WHERE t_sejour.no_sejour = p_sejours.no_sejour AND
t_sejour.medecin_sejour_id <> 0 AND
p_sejours.medecin_sejour_id IS DISTINCT FROM t_sejour.medecin_sejour_id AND
'[PX]' = '';
-- recréation index
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_2');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_3');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_4');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_5');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_6');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_7');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_8');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_9');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_10');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_11');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_12');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_13');
-- transferts d'établissements
INSERT INTO base.t_etablissements (code, texte, texte_court)
SELECT
NUM_FINESS,
NOM,
NOM
FROM
prod_sigems.ETAB_CONV
WHERE 1=1 AND
CODE IN (SELECT DISTINCT ETAB FROM prod_sigems.DOSSIER_Y) AND
NUM_FINESS NOT IN (SELECT code FROM base.t_etablissements)
;
INSERT INTO base.t_etablissements (code, texte, texte_court)
SELECT
NUM_FINESS,
NOM,
NOM
FROM
prod_sigems.ETAB_CONV
WHERE 1=1 AND
CODE IN (SELECT DISTINCT CH2 FROM prod_sigems.DOSSIER_Y) AND
NUM_FINESS NOT IN (SELECT code FROM base.t_etablissements)
;
INSERT INTO activite[PX].p_sejours_transferts (sejour_id, provenance_id, destination_id)
SELECT
p_sejours.oid,
MIN(CASE WHEN mode_entree = 7 THEN provenance.oid ELSE null END) AS provenance_id,
MIN(CASE WHEN mode_sortie = 7 THEN destination.oid ELSE null END) AS destination_id
FROM
activite[PX].p_sejours
JOIN prod_sigems.DOSSIER_Y ON ANNEE || to_char(DOSSIER_Y.CODE,'FM900000') = no_sejour
LEFT JOIN prod_sigems.ETAB_CONV PROV ON CH2 = PROV.CODE
LEFT JOIN prod_sigems.ETAB_CONV DEST ON ETAB = DEST.CODE
LEFT JOIN base.t_etablissements provenance ON PROV.NUM_FINESS = provenance.code
LEFT JOIN base.t_etablissements destination ON DEST.NUM_FINESS = destination.code
WHERE 1!=1 OR
ETAB != '' OR
CH2 != ''
GROUP BY 1
;
-- assurance
INSERT INTO activite[PX].p_sejours_assurance(
sejour_id,
nom_assure,
prenom_assure,
tiers_payant_0_id,
tiers_payant_1_id,
matricule_1,
tiers_payant_2_id,
matricule_2,
tiers_payant_22_id,
matricule_22
)
SELECT
p_sejours.oid AS sejour_id,
''::text AS nom_assure,
''::text prenom_assure,
MAX(p_sejours.tiers_payant_0_id),
MAX(p_sejours.tiers_payant_1_id),
MAX(substr(NC1_DOS,1,13)) AS matricule_1,
MAX(p_sejours.tiers_payant_2_id),
MAX(CASE WHEN NC2_DOS <> '' THEN NC2_DOS ELSE substr(NC1_DOS,1,13) END) AS matricule_2,
MAX(p_sejours.tiers_payant_22_id),
''::text AS matricule_22
FROM prod_sigems.DOSSIER
JOIN activite[PX].p_sejours ON code_original = ANN_DOS || to_char(COD_DOS,'FM900000')
GROUP BY 1
;
]]></sqlcmd>
</NODE>
<NODE label="Mouvements">
<sqlcmd><![CDATA[
DROP TABLE IF EXISTS w_SEJOUR;
CREATE TEMP TABLE w_SEJOUR AS
SELECT
SEJ_DOS,
ANN_DOS,
COD_DOS,
w_DHEN_DOS,
w_DHSO_DOS,
CASE
WHEN DMT_SEJ IN ('401', '402', '403', '404', '405', '406', '407', '408', '409') THEN '1'::text
WHEN DMT_DOS IN ('401', '402', '403', '404', '405', '406', '407', '408', '409') THEN '1'::text
WHEN DOSSIER_Y.URGENCE = 'U' THEN '1'::text
ELSE '0'::text END AS URG,
COALESCE(SER_SEJ, SER_DOS) AS SER_SEJ,
COALESCE(SER_SEJ || '_' || MDT_DOS, SER_DOS_MDT) AS SER_SEJ_MDT,
COALESCE(SER_CHA, ETA_DOS) AS ETA_SEJ,
COALESCE(SER_CHA || '|' || NCH_SEJ, NCH_DOS) AS NCH_SEJ,
COALESCE(DAE_SEJ,DEN_DOS) AS DAE_SEJ,
COALESCE(DT_DEBUT, to_timestamp(to_char(DAE_SEJ,'YYYYMMDD') || to_char(MIN_DOS,'FM0000'),'YYYYMMDDHH24MI'),w_DHSO_DOS)::timestamp without time zone AS w_DHAE_SEJ,
COALESCE(DAS_SEJ,DSO_DOS) AS DAS_SEJ,
COALESCE(to_number('00' || HEU_SEJ || MIN_SEJ,'0000'), HEU_DOS) AS HEU_SEJ,
COALESCE(DT_FIN, to_timestamp(to_char(DAS_SEJ,'YYYYMMDD') || HEU_SEJ || MIN_SEJ,'YYYYMMDDHH24MI'),w_DHSO_DOS)::timestamp without time zone AS w_DHAS_SEJ
FROM w_DOSSIER
LEFT JOIN prod_sigems.SEJOUR ON ANN_SEJ = ANN_DOS AND COD_SEJ = COD_DOS
LEFT JOIN prod_sigems.DOSSIER_Y ON ANNEE = ANN_DOS AND CODE = COD_DOS
LEFT JOIN w_CHAMBRE ON NCH_SEJ = COD_CHA AND NCH_SEJ <> '' AND NCH_SEJ <> '0'
WHERE DAE_SEJ <= DAS_SEJ OR DAS_SEJ IS NULL OR SEJOUR.ANN_SEJ IS NULL
GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
ORDER BY SEJ_DOS
;
UPDATE w_SEJOUR
SET ETA_SEJ = substr(NCH_SEJ,2), NCH_SEJ = substr(NCH_SEJ,2) || NCH_SEJ
WHERE ETA_SEJ = '' AND NCH_SEJ <> '|' AND NCH_SEJ LIKE '|%';
INSERT INTO activite[PX].t_lieux(
code_original_1, code_original_2, code_original_3, code_original_4, code_original_6)
SELECT SER_SEJ_MDT, '', ETA_SEJ, NCH_SEJ, SER_SEJ
FROM w_SEJOUR
LEFT JOIN activite[PX].t_lieux ON (
code_original_1 = SER_SEJ_MDT AND
code_original_2 = '' AND
code_original_3 = ETA_SEJ AND
code_original_4 = NCH_SEJ AND
code_original_6 = SER_SEJ
)
WHERE t_lieux.oid IS NULL
GROUP BY 1,2,3,4,5;
UPDATE activite[PX].t_lieux SET
service_facturation_id = COALESCE(t_services_facturation.oid,0),
mode_traitement_id = COALESCE(t_services_facturation.mode_traitement_id,0)
FROM
activite[PX].t_services_facturation
WHERE code_original_1 = t_services_facturation.code_original
AND (t_lieux.service_facturation_id <> COALESCE(t_services_facturation.oid,0) OR
t_lieux.mode_traitement_id <> COALESCE(t_services_facturation.mode_traitement_id,0)
)
;
UPDATE activite[PX].t_lieux SET
unite_fonctionnelle_id = COALESCE(t_unites_fonctionnelles.oid,0)
FROM
activite[PX].t_unites_fonctionnelles
WHERE code_original_6 = t_unites_fonctionnelles.code_original
AND unite_fonctionnelle_id <> COALESCE(t_unites_fonctionnelles.oid,0);
UPDATE activite[PX].t_lieux SET
lit_id = COALESCE(t_lits.oid,0)
FROM activite[PX].t_lits
WHERE code_original_4 = t_lits.code_original AND
t_lieux.lit_id <> COALESCE(t_lits.oid,0)
;
-- L'étage 'NULL' est faux
UPDATE activite[PX].t_lieux
SET lit_id = 0
WHERE code_original_3 = 'NULL';
-- Le lit 'NULL' est faux
UPDATE activite[PX].t_lieux
SET lit_id = t_lits_g.oid
FROM activite[PX].t_lits
JOIN activite[PX].t_lits t_lits_g ON t_lits.etage_id = t_lits_g.etage_id AND t_lits_g.code_original LIKE '%|0'
WHERE t_lieux.lit_id = t_lits.oid AND
code_original_4 LIKE '%|NULL%' AND
code_original_3 <> '';
DROP TABLE IF EXISTS w_SEJOUR_2;
CREATE TEMP TABLE w_SEJOUR_2 AS
SELECT
SEJ_DOS,
ANN_DOS,
COD_DOS,
w_DHEN_DOS,
w_DHSO_DOS,
URG,
SER_SEJ,
SER_SEJ_MDT,
ETA_SEJ,
NCH_SEJ,
'1'::text AS w_QENTREE,
DAE_SEJ,
w_DHAE_SEJ,
'1'::text AS w_QSORTIE,
DAS_SEJ,
HEU_SEJ,
w_DHAS_SEJ,
''::text AS SER_SEJ_MDT_before,
''::text AS ETA_SEJ_before,
''::text AS SER_SEJ_MDT_next,
''::text AS ETA_SEJ_next,
COALESCE(t_lieux.oid,0) AS lieu_id
FROM w_SEJOUR
LEFT JOIN activite[PX].t_lieux ON (
code_original_1 = SER_SEJ_MDT AND
code_original_2 = '' AND
code_original_3 = ETA_SEJ AND
code_original_4 = NCH_SEJ AND
code_original_6 = SER_SEJ
)
ORDER BY SEJ_DOS, w_DHAS_SEJ;
DROP SEQUENCE IF EXISTS w_SEJOUR_seq;
CREATE TEMP SEQUENCE w_SEJOUR_seq
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 1
CACHE 1;
DROP TABLE IF EXISTS w_SEJOUR;
CREATE TEMP TABLE w_SEJOUR AS
SELECT
nextval('w_SEJOUR_seq'::regclass) AS sequence,
SEJ_DOS,
ANN_DOS,
COD_DOS,
w_DHEN_DOS,
w_DHSO_DOS,
URG,
SER_SEJ,
SER_SEJ_MDT,
ETA_SEJ,
NCH_SEJ,
w_QENTREE,
DAE_SEJ,
w_DHAE_SEJ,
w_QSORTIE,
DAS_SEJ,
HEU_SEJ,
w_DHAS_SEJ,
SER_SEJ_MDT_before,
ETA_SEJ_before,
SER_SEJ_MDT_next,
ETA_SEJ_next,
lieu_id
FROM w_SEJOUR_2
ORDER BY SEJ_DOS, w_DHAS_SEJ;
CREATE INDEX w_SEJOUR_i1
ON w_SEJOUR
USING btree
(SEJ_DOS);
UPDATE w_SEJOUR
SET
w_DHAE_SEJ = w_SEJOUR_before.w_DHAS_SEJ + interval '1 SECOND'
FROM w_SEJOUR w_SEJOUR_before
WHERE w_SEJOUR.SEJ_DOS = w_SEJOUR_before.SEJ_DOS
AND w_SEJOUR.sequence = w_SEJOUR_before.sequence + 1;
DROP TABLE IF EXISTS w_SEJOUR_SEJOUR;
CREATE TEMP TABLE w_SEJOUR_SEJOUR AS
SELECT
SEJ_DOS
FROM w_SEJOUR
GROUP BY 1
HAVING count(*) > 1;
DELETE FROM w_SEJOUR
USING w_SEJOUR_SEJOUR
WHERE w_SEJOUR_SEJOUR.SEJ_DOS = w_SEJOUR.SEJ_DOS AND w_DHAE_SEJ > w_DHSO_DOS;
DELETE FROM w_SEJOUR
USING w_SEJOUR_SEJOUR
WHERE w_SEJOUR_SEJOUR.SEJ_DOS = w_SEJOUR.SEJ_DOS AND w_DHAS_SEJ < w_DHEN_DOS ;
DROP TABLE IF EXISTS w_SEJOUR_SEJOUR;
CREATE TEMP TABLE w_SEJOUR_SEJOUR AS
SELECT
SEJ_DOS,
MIN(sequence) AS sequence_1,
MAX(sequence) AS sequence_9
FROM w_SEJOUR
GROUP BY 1;
UPDATE w_SEJOUR
SET w_DHAS_SEJ = w_DHSO_DOS
FROM w_SEJOUR_SEJOUR
WHERE w_SEJOUR.SEJ_DOS = w_SEJOUR_SEJOUR.SEJ_DOS AND w_SEJOUR.sequence = w_SEJOUR_SEJOUR.sequence_9 AND
w_DHAS_SEJ <> w_DHSO_DOS;
UPDATE w_SEJOUR
SET w_DHAE_SEJ = w_DHEN_DOS
FROM w_SEJOUR_SEJOUR
WHERE w_SEJOUR.SEJ_DOS = w_SEJOUR_SEJOUR.SEJ_DOS AND w_SEJOUR.sequence = w_SEJOUR_SEJOUR.sequence_1 AND
w_DHAE_SEJ <> w_DHEN_DOS;
UPDATE w_SEJOUR
SET
w_QSORTIE = '0',
SER_SEJ_MDT_next = w_SEJOUR_next.SER_SEJ_MDT,
ETA_SEJ_next = w_SEJOUR_next.ETA_SEJ
FROM w_SEJOUR w_SEJOUR_next
WHERE w_SEJOUR.SEJ_DOS = w_SEJOUR_next.SEJ_DOS
AND w_SEJOUR.sequence = w_SEJOUR_next.sequence - 1;
UPDATE w_SEJOUR
SET
w_QENTREE = '0',
w_DHAE_SEJ = w_SEJOUR_before.w_DHAS_SEJ + interval '1 SECOND',
SER_SEJ_MDT_before = w_SEJOUR_before.SER_SEJ_MDT,
ETA_SEJ_before = w_SEJOUR_before.ETA_SEJ
FROM w_SEJOUR w_SEJOUR_before
WHERE w_SEJOUR.SEJ_DOS = w_SEJOUR_before.SEJ_DOS
AND w_SEJOUR.sequence = w_SEJOUR_before.sequence + 1;
DELETE FROM w_SEJOUR WHERE w_DHAE_SEJ > w_DHAS_SEJ;
DROP TABLE IF EXISTS w_mouvements_sejour;
CREATE TEMP TABLE w_mouvements_sejour AS
SELECT
w_SEJOUR.SEJ_DOS,
w_SEJOUR.SEJ_DOS AS no_sejour,
p_sejours.oid AS sejour_id,
sequence,
p_calendrier.date,
p_calendrier.jour_semaine,
p_calendrier.is_weekend,
CASE WHEN p_calendrier.date = date(w_DHAE_SEJ) THEN extract('hour' from w_DHAE_SEJ) * 10000 + extract('minute' from w_DHAE_SEJ) * 100 + extract('second' from w_DHAE_SEJ) ELSE 0 END AS heure_debut,
CASE WHEN p_calendrier.date = date(w_DHAS_SEJ) THEN extract('hour' from w_DHAS_SEJ) * 10000 + extract('minute' from w_DHAS_SEJ) * 100 + extract('second' from w_DHAS_SEJ) ELSE 240000 END AS heure_fin,
CASE WHEN w_QENTREE = '1' AND p_calendrier.date = date(w_DHAE_SEJ) AND p_sejours.type_sejour = '1' THEN 1 ELSE 0 END AS nb_entrees_directes,
CASE WHEN w_QSORTIE = '1' AND p_calendrier.date = date(w_DHAS_SEJ) AND p_sejours.type_sejour = '1' THEN 1 ELSE 0 END AS nb_sorties_directes,
CASE WHEN w_QENTREE = '1' AND p_calendrier.date = date(w_DHAE_SEJ) AND p_sejours.type_sejour = '1' THEN '1' ELSE '0' END AS est_jour_entree,
CASE WHEN w_QSORTIE = '1' AND p_calendrier.date = date(w_DHAS_SEJ) AND p_sejours.type_sejour = '1' THEN '1' ELSE '0' END AS est_jour_sortie,
CASE WHEN p_sejours.type_sejour = '1' THEN '1' ELSE '0' END AS est_jour_hospitalisation,
CASE WHEN w_QENTREE = '1' AND p_calendrier.date = date(w_DHAE_SEJ) AND p_sejours.type_sejour = '2' THEN 1 ELSE 0 END AS nb_ambulatoires,
CASE WHEN w_QENTREE = '1' AND p_calendrier.date = date(w_DHAE_SEJ) AND p_sejours.type_sejour = '3' THEN 1 ELSE 0 END AS nb_externes,
CASE WHEN URG = '1' AND p_calendrier.date = date(w_DHAE_SEJ) AND w_QENTREE = '1' THEN 1 ELSE 0 END AS nb_urgences,
0 as nb_seances,
CASE WHEN p_calendrier.date = date(w_DHAE_SEJ) AND p_sejours.type_sejour = '1' AND w_QENTREE <> '1' AND SER_SEJ_MDT <> SER_SEJ_MDT_before THEN 1 ELSE 0 END AS nb_entrees_mutation_service,
CASE WHEN p_calendrier.date = date(w_DHAS_SEJ) AND p_sejours.type_sejour = '1' AND w_QSORTIE <> '1' AND SER_SEJ_MDT <> SER_SEJ_MDT_next THEN 1 ELSE 0 END AS nb_sorties_mutation_service,
CASE WHEN p_calendrier.date = date(w_DHAE_SEJ) AND p_sejours.type_sejour = '1' AND w_QENTREE <> '1' AND ETA_SEJ <> ETA_SEJ_before THEN 1 ELSE 0 END AS nb_entrees_mutation_etage,
CASE WHEN p_calendrier.date = date(w_DHAS_SEJ) AND p_sejours.type_sejour = '1' AND w_QSORTIE <> '1' AND ETA_SEJ <> ETA_SEJ_next THEN 1 ELSE 0 END AS nb_sorties_mutation_etage,
0 AS nb_entrees_mutation_activite,
0 AS nb_sorties_mutation_activite,
0 AS nb_entrees_mutation_unite_medicale,
0 AS nb_sorties_mutation_unite_medicale,
CASE WHEN p_sejours.type_sejour = '1' THEN 1 ELSE 0 END AS nb_jours_js_inclus,
CASE WHEN p_sejours.type_sejour = '1' AND p_calendrier.date <> date(w_DHAS_SEJ) THEN 1 ELSE 0 END AS nb_jours_js_non_inclus,
CASE WHEN (p_sejours.type_sejour = '1' OR p_sejours.type_sejour = '2') AND t_lits.chambre_particuliere = 'O' THEN '1' ELSE '0' END AS est_chambre_particuliere,
CASE WHEN (p_sejours.type_sejour = '1' OR p_sejours.type_sejour = '2') AND t_lits.chambre_particuliere = 'O' THEN 1 ELSE 0 END AS nb_chambres_particulieres,
0 AS nb_bebes,
lieu_id,
p_sejours.medecin_sejour_id as medecin_sejour_id,
CASE WHEN p_sejours.code_prevu = '1' OR p_calendrier.date > date(now_sigems) THEN '1' ELSE '0' END AS est_mouvement_previsionnel
FROM w_SEJOUR
JOIN w_PERIODE ON periode_id = 0
JOIN activite[PX].p_sejours ON w_SEJOUR.SEJ_DOS = p_sejours.no_sejour AND p_sejours.etat = ''
LEFT JOIN activite[PX].t_lits ON NCH_SEJ = t_lits.code_original
JOIN base.p_calendrier ON (p_calendrier.date BETWEEN date(w_DHAE_SEJ) AND date(w_DHAS_SEJ) AND p_calendrier.date <= now() + interval '1 month' )
ORDER BY sequence, p_calendrier.date;
-- Bébés
DROP TABLE IF EXISTS w_CCAM_RUM_bebes;
CREATE TEMP TABLE w_CCAM_RUM_bebes AS
SELECT jointure AS no_sejour,
MAX(CASE WHEN t_actes.texte ILIKE '%multiple%' THEN 2 ELSE 1 END) AS nb_bebes
FROM prod_sigems.CCAM_RUM
JOIN base.t_actes ON substring(CCAM_RUM.CODE, 1, 7) = t_actes.code AND
CCAM_RUM.CODE LIKE 'JQG%' AND
t_actes.texte ILIKE 'accouchement%'
WHERE ACTIVITE = '1'
GROUP BY 1;
UPDATE w_mouvements_sejour
SET nb_bebes = w_CCAM_RUM_bebes.nb_bebes
FROM w_CCAM_RUM_bebes
WHERE w_CCAM_RUM_bebes.no_sejour = w_mouvements_sejour.no_sejour AND
(nb_entrees_directes = 1 OR nb_externes = 1 OR nb_ambulatoires = 1);
-- Séances
SELECT base.cti_execute('INSERT INTO activite.t_divers (code, description, texte, valeur)
VALUES (''K15_SEANCE'',
''Création de séances pour les actes K coefficient 15 : 0 = Jamais, 1 = Toujours, 2 = Sauf pour les séjours Hospitalisation'',
''Règle de création de séances pour les actes K coefficient 15'',
''1'')',1)
WHERE (SELECT valeur FROM activite.t_divers WHERE code = 'K15_SEANCE') IS NULL;
DROP TABLE IF EXISTS w_LIG_HONOR_seances;
CREATE TEMP TABLE w_LIG_HONOR_seances AS
SELECT
SEJ_DOS,
date(dde_lho) AS date,
1::numeric AS nb_seances
FROM prod_sigems.LIG_HONOR
JOIN w_DOSSIER_SELECT w_DOSSIER_SELECT ON ANN_LHO = ANN_SELECT AND COD_LHO = COD_SELECT
JOIN w_DOSSIER ON ANN_LHO = ANN_DOS AND COD_LHO = COD_DOS
JOIN prod_sigems.PROD_HONOR ON CPH_LHO = COD_PRH
LEFT JOIN prod_sigems.CCAM_RUM ON LIG_HONOR.NUM_LHO = CCAM_RUM.NUM_LHO AND date(DDE_LHO) = date(CCAM_RUM.DAT)
JOIN w_sejours ON SEJ_DOS = no_sejour
JOIN activite.t_divers ON t_divers.code = 'K15_SEANCE'
WHERE
(
ACT_PRH = 'K' AND
(COF_LHO = 30 OR (COF_LHO = 15 AND (valeur = 1 OR (valeur = 2 AND type_sejour != 1)))) AND
(CPH_LHO = 'CHI' OR DMT_LHO = '302')
) OR
CCAM_RUM.CODE = ANY(Array['JVJF003','JVJF004','JVJF008','GLLP006','GLLP007','ZZNL051','ZZNL063','ZZNL065']) OR
DMT_LHO = '796'
GROUP BY 1,2
HAVING SUM(QTE_LHO) > 0;
CREATE INDEX w_LIG_HONOR_seances_i1
ON w_LIG_HONOR_seances
USING btree
(SEJ_DOS);
UPDATE w_mouvements_sejour
SET nb_seances = w_LIG_HONOR_seances.nb_seances
FROM w_LIG_HONOR_seances
WHERE w_LIG_HONOR_seances.SEJ_DOS = w_mouvements_sejour.no_sejour AND
w_LIG_HONOR_seances.date = w_mouvements_sejour.date;
-- Séances chimio ESPIC
DROP TABLE IF EXISTS w_LIG_CLINI_seances302;
CREATE TEMP TABLE w_LIG_CLINI_seances302 AS
SELECT
SEJ_DOS,
p_calendrier.date AS date,
SUM(CASE WHEN QTE_LCL > 0 THEN 1 ELSE -1 END) AS nb_seances
FROM prod_sigems.LIG_CLINI
JOIN w_DOSSIER_SELECT w_DOSSIER_SELECT ON ANN_LCL = ANN_SELECT AND COD_LCL = COD_SELECT
JOIN w_DOSSIER ON ANN_LCL = ANN_DOS AND COD_LCL = COD_DOS
JOIN base.p_calendrier ON p_calendrier.date BETWEEN date(DDE_LCL) AND COALESCE(DFI_LCL,date(DDE_LCL + (abs(QTE_LCL)-1||' days)')::interval))
WHERE PRO_LCL IN ('PJ') AND DMT_LCL = '302' AND QTE_LCL <> 0
GROUP BY 1,2
;
CREATE INDEX w_LIG_CLINI_seances302_i1
ON w_LIG_CLINI_seances302
USING btree
(SEJ_DOS);
UPDATE w_mouvements_sejour
SET nb_seances = w_LIG_CLINI_seances302.nb_seances
FROM w_LIG_CLINI_seances302
WHERE w_LIG_CLINI_seances302.SEJ_DOS = w_mouvements_sejour.no_sejour AND
w_LIG_CLINI_seances302.date = w_mouvements_sejour.date
;
-- Selon PMSI
DROP TABLE IF EXISTS w_ETAT_PMSI_seances;
CREATE TEMP TABLE w_ETAT_PMSI_seances AS
SELECT JOINTURE, date(ETAT_PMSI.ENTREE) AS date
FROM prod_sigems.ETAT_PMSI
JOIN prod_sigems.UN_RUM ON NUM_RSS = JOINTURE
JOIN prod_sigems.PMSI_GHM ON UN_RUM.GHM = PMSI_GHM.CODE_GHM
WHERE CLE_GHM LIKE '28%'
AND JOINTURE NOT IN (SELECT no_sejour FROM w_mouvements_sejour WHERE nb_seances > 0 )
;
UPDATE w_mouvements_sejour
SET nb_seances = 1
FROM w_ETAT_PMSI_seances
WHERE w_ETAT_PMSI_seances.JOINTURE = w_mouvements_sejour.no_sejour AND
w_ETAT_PMSI_seances.date = w_mouvements_sejour.date
;
-- Séances dialyse
DROP TABLE IF EXISTS w_LIG_CLINI_seances;
CREATE TEMP TABLE w_LIG_CLINI_seances AS
SELECT
SEJ_DOS,
date(DDE_LCL) AS date,
SUM(QTE_LCL) AS nb_seances
FROM prod_sigems.LIG_CLINI
JOIN w_DOSSIER_SELECT w_DOSSIER_SELECT ON ANN_LCL = ANN_SELECT AND COD_LCL = COD_SELECT
JOIN w_DOSSIER ON ANN_LCL = ANN_DOS AND COD_LCL = COD_DOS
WHERE PRO_LCL IN ('D01', 'D02', 'D03', 'D04', 'D05', 'D06', 'D07', 'D08', 'D09', 'D10', 'D11', 'D12', 'D13', 'D14', 'D15', 'D16', 'D17', 'D18', 'D19')
GROUP BY 1,2;
CREATE INDEX w_LIG_CLINI_seances_i1
ON w_LIG_CLINI_seances
USING btree
(SEJ_DOS);
UPDATE w_mouvements_sejour
SET nb_seances = w_LIG_CLINI_seances.nb_seances
FROM w_LIG_CLINI_seances
WHERE w_LIG_CLINI_seances.SEJ_DOS = w_mouvements_sejour.no_sejour AND
w_LIG_CLINI_seances.date = w_mouvements_sejour.date;
-- seances selon GHS pmsi
DROP TABLE IF EXISTS w_ghs_seances;
CREATE TEMP TABLE w_ghs_seances AS
SELECT ghs_id AS oid
FROM activite[PX].p_sejours
JOIN base.t_ghm ON p_sejours.ghm_id = t_ghm.oid AND t_ghm.code LIKE '28%'
JOIN base.t_ghs ON p_sejours.ghs_id = t_ghs.oid AND t_ghs.code <> 9999 AND t_ghs.code > 0
WHERE ghs_id <> 0
GROUP BY 1;
DROP TABLE IF EXISTS w_sejours_seances;
CREATE TEMP TABLE w_sejours_seances AS
SELECT
p_sejours.no_sejour,
date_entree AS date,
1 AS nb_seances
FROM activite[PX].p_sejours
JOIN base.t_ghs ON p_sejours.ghs_id = t_ghs.oid
JOIN base.t_ghm ON p_sejours.ghm_id = t_ghm.oid
WHERE date_entree = date_sortie AND type_sejour <> '5' AND
date_groupage < '20991231' AND
(ghs_id IN (SELECT oid FROM w_ghs_seances) OR t_ghm.code LIKE '28%');
CREATE INDEX w_sejours_seances_i1
ON w_sejours_seances
USING btree
(no_sejour);
UPDATE w_mouvements_sejour
SET nb_seances = w_sejours_seances.nb_seances
FROM w_sejours_seances
WHERE w_sejours_seances.no_sejour = w_mouvements_sejour.no_sejour AND
w_sejours_seances.date = w_mouvements_sejour.date AND
w_mouvements_sejour.nb_seances IS DISTINCT FROM w_sejours_seances.nb_seances;
WITH update_sejours as (
SELECT
w_mouvements_sejour.no_sejour,
w_mouvements_sejour.date
FROM w_mouvements_sejour
JOIN activite[PX].p_sejours ON w_mouvements_sejour.no_sejour = p_sejours.no_sejour AND w_mouvements_sejour.date = p_sejours.date_entree AND p_sejours.type_sejour = '5'
WHERE 1=1
AND nb_seances = 0
AND w_mouvements_sejour.no_sejour NOT IN (SELECT no_sejour FROM w_mouvements_sejour WHERE nb_seances > 0 )
)
UPDATE w_mouvements_sejour
SET nb_seances = 1
FROM update_sejours
WHERE 1=1
AND w_mouvements_sejour.no_sejour = update_sejours.no_sejour
AND w_mouvements_sejour.date = update_sejours.date;
-- Génération
DELETE FROM w_mouvements_sejour
WHERE
nb_entrees_directes = 0 AND
nb_sorties_directes = 0 AND
est_jour_hospitalisation <> '1' AND
nb_ambulatoires = 0 AND
nb_externes = 0 AND
nb_urgences = 0 AND
nb_seances = 0 AND
nb_entrees_mutation_service = 0 AND
nb_sorties_mutation_service = 0 AND
nb_entrees_mutation_etage = 0 AND
nb_sorties_mutation_etage = 0 AND
nb_entrees_mutation_activite = 0 AND
nb_sorties_mutation_activite = 0 AND
nb_entrees_mutation_unite_medicale = 0 AND
nb_sorties_mutation_unite_medicale = 0 AND
nb_jours_js_inclus = 0 AND
nb_jours_js_non_inclus = 0 AND
est_chambre_particuliere <> '1' AND
nb_chambres_particulieres = 0 AND
nb_bebes = 0;
SELECT base.cti_disable_index('activite[PX]', 'i_mouvements_sejour_1');
SELECT base.cti_disable_index('activite[PX]', 'i_mouvements_sejour_2');
SELECT base.cti_disable_index('activite[PX]', 'i_mouvements_sejour_3');
SELECT base.cti_disable_index('activite[PX]', 'i_mouvements_sejour_4');
SELECT base.cti_disable_index('activite[PX]', 'i_mouvements_sejour_5');
INSERT INTO activite[PX].p_mouvements_sejour(
sejour_id, no_sejour, date, nb_jours_js_non_inclus,
lieu_id, nb_entrees_directes, nb_sorties_directes,
nb_urgences, nb_externes, nb_ambulatoires, medecin_sejour_id,
nb_jours_js_inclus, nb_seances, nb_entrees_mutation_service,
nb_sorties_mutation_service, nb_entrees_mutation_activite, nb_sorties_mutation_activite,
nb_entrees_mutation_etage, nb_sorties_mutation_etage, nb_chambres_particulieres,
heure_debut, heure_fin, est_jour_entree, est_jour_sortie, est_jour_hospitalisation,
est_chambre_particuliere,
nb_entrees_mutation_unite_medicale, nb_sorties_mutation_unite_medicale,
nb_bebes,est_mouvement_previsionnel, jour_semaine, is_weekend)
SELECT sejour_id, no_sejour, date,nb_jours_js_non_inclus,
lieu_id, nb_entrees_directes, nb_sorties_directes,
nb_urgences, nb_externes, nb_ambulatoires, medecin_sejour_id,
nb_jours_js_inclus, nb_seances, nb_entrees_mutation_service,
nb_sorties_mutation_service, nb_entrees_mutation_activite, nb_sorties_mutation_activite,
nb_entrees_mutation_etage, nb_sorties_mutation_etage, nb_chambres_particulieres,
heure_debut, heure_fin, est_jour_entree, est_jour_sortie, est_jour_hospitalisation,
est_chambre_particuliere,
nb_entrees_mutation_unite_medicale, nb_sorties_mutation_unite_medicale,
nb_bebes,est_mouvement_previsionnel, jour_semaine, is_weekend
FROM w_mouvements_sejour
ORDER BY no_sejour, sequence;
SELECT base.cti_enable_index('activite[PX]', 'i_mouvements_sejour_1');
SELECT base.cti_enable_index('activite[PX]', 'i_mouvements_sejour_2');
SELECT base.cti_enable_index('activite[PX]', 'i_mouvements_sejour_3');
SELECT base.cti_enable_index('activite[PX]', 'i_mouvements_sejour_4');
SELECT base.cti_enable_index('activite[PX]', 'i_mouvements_sejour_5');
UPDATE activite[PX].p_sejours SET lieu_sortie_id = p_mouvements_sejour.lieu_id
FROM activite[PX].p_mouvements_sejour
WHERE p_sejours.no_sejour = p_mouvements_sejour.no_sejour
AND p_mouvements_sejour.date = p_sejours.date_sortie
AND (lieu_sortie_id IS DISTINCT FROM p_mouvements_sejour.lieu_id);
UPDATE activite[PX].p_sejours SET lieu_sortie_id = p_mouvements_sejour.lieu_id
FROM activite[PX].p_mouvements_sejour
WHERE p_sejours.no_sejour = p_mouvements_sejour.no_sejour
AND p_mouvements_sejour.date = p_sejours.date_sortie AND p_mouvements_sejour.nb_sorties_directes = 1
AND (lieu_sortie_id <> p_mouvements_sejour.lieu_id OR lieu_sortie_id IS NULL);
UPDATE activite[PX].p_sejours SET lieu_sortie_id = p_mouvements_sejour.lieu_id
FROM activite[PX].p_mouvements_sejour
WHERE p_sejours.no_sejour = p_mouvements_sejour.no_sejour
AND (p_sejours.lieu_sortie_id = 0 OR lieu_sortie_id IS NULL);
UPDATE activite[PX].p_sejours
SET type_sejour = '5'
WHERE type_sejour <> '5' AND
type_sejour <> '1' AND
no_sejour IN (
SELECT no_sejour
FROM activite[PX].p_mouvements_sejour
WHERE nb_seances > 0);
UPDATE activite[PX].p_mouvements_sejour
SET nb_externes = 0, nb_ambulatoires = 0
FROM activite[PX].p_sejours
WHERE p_mouvements_sejour.no_sejour = p_sejours.no_sejour AND
p_sejours.type_sejour = '5' AND
(
nb_externes <> 0 OR
nb_ambulatoires <> 0
)
]]></sqlcmd>
</NODE>
<NODE label="Lien PMSI">
<condition><![CDATA[
"[TYPE_TRAITEMENT]" == "E" && "[ENV_WITHPMSI]" == "1"
]]></condition>
<sqlcmd><![CDATA[
-- Modification numeros de sejour pmsi selon activite
-- Attention aux rss multiples avec seances, modification no sejour administratif PMSI pour enlever date
UPDATE pmsi.p_rss
SET no_sejour_administratif = trim(substr(trim(no_sejour_administratif),1,length(trim(no_sejour_administratif))-8))
WHERE length(trim(no_sejour_administratif)) > 12 AND
substr(trim(no_sejour_administratif),length(trim(no_sejour_administratif))-7,8) = to_char(date_entree,'YYYYMMDD')
;
UPDATE pmsi.p_rss
SET no_sejour_administratif = trim(substr(trim(no_sejour_administratif),1,length(trim(no_sejour_administratif))-8))
WHERE length(trim(no_sejour_administratif)) > 12 AND
substr(trim(no_sejour_administratif),length(trim(no_sejour_administratif))-7,8) = '00000000'
;
-- CAS des sejours pmsi avec 8 caracteres alors qu'ils sont à 7 dans activite
UPDATE pmsi.p_rss
SET no_sejour_administratif = trim(substr(no_sejour_administratif,1,2) || substr(no_sejour_administratif,4))
FROM activite[PX].p_sejours
WHERE length(trim(no_sejour_administratif)) = 8 AND
length(no_sejour) = 7 AND
substr(no_sejour_administratif,3,1) = '0' AND
trim(substr(no_sejour_administratif,1,2) || substr(no_sejour_administratif,4)) = no_sejour AND
(
p_rss.date_entree BETWEEN p_sejours.date_entree AND p_sejours.date_sortie OR
p_rss.date_sortie BETWEEN p_sejours.date_entree AND p_sejours.date_sortie
)
;
-- Séjours bébés préfixés par 1,2,3
UPDATE pmsi.p_rss
SET no_sejour_administratif = trim(substr(no_sejour_administratif,2))
FROM activite[PX].p_sejours
WHERE substr(no_sejour_administratif,1,1) IN ('1','2','3') AND
p_rss.date_naissance BETWEEN p_rss.date_entree AND p_rss.date_sortie AND
trim(substr(no_sejour_administratif,2)) = no_sejour AND
(
p_rss.date_entree BETWEEN p_sejours.date_entree AND p_sejours.date_sortie OR
p_rss.date_sortie BETWEEN p_sejours.date_entree AND p_sejours.date_sortie
)
;
UPDATE pmsi.p_rss
SET no_sejour_administratif = trim(substr(no_sejour_administratif,2,2)||substr(no_sejour_administratif,5))
FROM activite[PX].p_sejours
WHERE substr(no_sejour_administratif,1,1) IN ('1','2','3') AND
substr(no_sejour_administratif,4,1) = '0' AND
length(trim(no_sejour_administratif)) = 9 AND
length(no_sejour) = 7 AND
p_rss.date_naissance BETWEEN p_rss.date_entree AND p_rss.date_sortie AND
trim(substr(no_sejour_administratif,2,2)||substr(no_sejour_administratif,5)) = no_sejour AND
(
p_rss.date_entree BETWEEN p_sejours.date_entree AND p_sejours.date_sortie OR
p_rss.date_sortie BETWEEN p_sejours.date_entree AND p_sejours.date_sortie
)
;
-- S'il en reste (pb de dates pmsi ou activité discordantes)
UPDATE pmsi.p_rss
SET no_sejour_administratif = trim(substr(no_sejour_administratif,1,2) || substr(no_sejour_administratif,4))
FROM activite[PX].p_sejours
JOIN activite[PX].p_patients ON p_sejours.no_patient = p_patients.no_patient
WHERE length(trim(no_sejour_administratif)) = 8 AND
length(no_sejour) = 7 AND
substr(no_sejour_administratif,3,1) = '0' AND
trim(substr(no_sejour_administratif,1,2) || substr(no_sejour_administratif,4)) = no_sejour AND
p_rss.date_naissance = p_patients.date_naissance AND
trim(no_sejour_administratif) not in (select no_sejour from activite[PX].p_sejours)
;
ANALYSE pmsi.p_rss
;
]]></sqlcmd>
</NODE>
<NODE label="Lien PMSI">
<condition><![CDATA[
"[TYPE_TRAITEMENT]" == "E"
]]></condition>
<sqlcmd><![CDATA[
SELECT activite[PX].cti_reorganize_sejour_pmsi()
]]></sqlcmd>
</NODE>
</NODE>
<NODE name="FACTURE" label="RECUPERATION DES FACTURES">
<NODE label="Correction mouvements">
<sqlcmd><![CDATA[
DROP TABLE IF EXISTS w_DOS2_caisse;
CREATE TEMP TABLE w_DOS2_caisse AS
SELECT ANN_DOS2 AS ANN_DOS2_S, COD_DOS2 AS COD_DOS2_S,
MAX(CP1_DOS2) AS CP1_DOS2_S,
MAX(CA1_DOS2) AS CA1_DOS2_S,
MAX(CA2_DOS2) AS CA2_DOS2_S
FROM prod_sigems.DOS2
GROUP BY 1,2;
CREATE INDEX w_DOS2_caisse_i1
ON w_DOS2_caisse
USING btree
(COD_DOS2_S);
DROP TABLE IF EXISTS w_DOS2_fictif_cli;
CREATE TEMP TABLE w_DOS2_fictif_cli AS
SELECT ANN_LCL AS ANN_DOS2, COD_LCL AS COD_DOS2, IND_LCL AS IND_DOS2, MAX(DAT_REG) AS DAT_REG,
SUM(CASE WHEN CAI_REG = CP1_DOS2_S THEN MONT ELSE 0 END) AS SR1_DOS2,
SUM(CASE WHEN CAI_REG = CA2_DOS2_S THEN MONT ELSE 0 END) AS SR2_DOS2,
SUM(CASE WHEN CAI_REG IS DISTINCT FROM CP1_DOS2_S AND CAI_REG IS DISTINCT FROM CA2_DOS2_S THEN MONT ELSE 0 END) AS SR3_DOS2,
0::numeric AS HR1_DOS2,
0::numeric AS HR2_DOS2,
0::numeric AS HR3_DOS2
FROM prod_sigems.LIG_CLINI
JOIN prod_sigems.REG4 ON NUM_LCL = NUM_CLI
JOIN prod_sigems.REG ON NUM_REG4 = SER_REG
LEFT JOIN w_DOS2_caisse ON ANN_LCL = ANN_DOS2_S AND COD_LCL = COD_DOS2_S
LEFT JOIN prod_sigems.DOS2 ON ANN_LCL = ANN_DOS2 AND COD_LCL = COD_DOS2 AND IND_LCL = IND_DOS2
WHERE ANN_DOS2 IS NULL
GROUP BY 1,2,3
HAVING SUM(MONT) <> 0;
DROP TABLE IF EXISTS w_DOS2_fictif_hon;
CREATE TEMP TABLE w_DOS2_fictif_hon AS
SELECT ANN_LHO AS ANN_DOS2, COD_LHO AS COD_DOS2, IND_LHO AS IND_DOS2, MAX(DAT_REG) AS DAT_REG,
0::numeric AS SR1_DOS2,
0::numeric AS SR2_DOS2,
0::numeric AS SR3_DOS2,
SUM(CASE WHEN CAI_REG = CP1_DOS2_S THEN MON_REG3 ELSE 0 END) AS HR1_DOS2,
SUM(CASE WHEN CAI_REG = CA2_DOS2_S THEN MON_REG3 ELSE 0 END) AS HR2_DOS2,
SUM(CASE WHEN CAI_REG IS DISTINCT FROM CP1_DOS2_S AND CAI_REG IS DISTINCT FROM CA2_DOS2_S THEN MON_REG3 ELSE 0 END) AS HR3_DOS2
FROM prod_sigems.LIG_HONOR
JOIN w_REG3 ON NUM_LHO = LHO_REG3
LEFT JOIN w_DOS2_caisse ON ANN_LHO = ANN_DOS2_S AND COD_LHO = COD_DOS2_S
LEFT JOIN prod_sigems.DOS2 ON ANN_LHO = ANN_DOS2 AND COD_LHO = COD_DOS2 AND IND_LHO = IND_DOS2
WHERE ANN_DOS2 IS NULL
GROUP BY 1,2,3
HAVING SUM(MON_REG3) <> 0;
INSERT INTO prod_sigems.DOS2(
ANN_DOS2,
COD_DOS2,
IND_DOS2,
ETA_DOS2,
DEN_DOS2,
DSO_DOS2,
HEU_DOS2,
RIS_DOS2,
JEX_DOS2,
CFA_DOS2,
COP_DOS2,
DFA_DOS2,
NDK_DOS2,
DDK_DOS2,
NB1_DOS2,
DB1_DOS2,
NB2_DOS2,
DB2_DOS2,
SJ1_DOS2,
HO1_DOS2,
SJ2_DOS2,
HO2_DOS2,
SJ3_DOS2,
HO3_DOS2,
SR1_DOS2,
HR1_DOS2,
SR2_DOS2,
HR2_DOS2,
SR3_DOS2,
HR3_DOS2,
CP1_DOS2,
CA1_DOS2,
CA2_DOS2,
LOT_DOS2,
REG_DOS2)
SELECT
ANN_DOS2,
COD_DOS2,
IND_DOS2,
'9',
DEN_DOS,
DSO_DOS,
HEU_DOS,
'' AS RIS_DOS2,
0 AS JEX_DOS2,
'' AS CFA_DOS2,
'' AS COP_DOS2,
MIN(DAT_REG) AS DFA_DOS2,
'' AS NDK_DOS2,
NULL::date AS DDK_DOS2,
0 AS NB1_DOS2,
NULL::date AS DB1_DOS2,
0 AS NB2_DOS2,
NULL::date AS DB2_DOS2,
0 AS SJ1_DOS2,
0 AS HO1_DOS2,
0 AS SJ2_DOS2,
0 AS HO2_DOS2,
0 AS SJ3_DOS2,
0 AS HO3_DOS2,
SUM(SR1_DOS2) AS SR1_DOS2,
SUM(HR1_DOS2) AS HR1_DOS2,
SUM(SR2_DOS2) AS SR2_DOS2,
SUM(HR2_DOS2) AS HR2_DOS2,
SUM(SR3_DOS2) AS SR3_DOS2,
SUM(HR3_DOS2) AS HR3_DOS2,
CP1_DOS2_S AS CP1_DOS2,
CA1_DOS2_S AS CA1_DOS2,
CA2_DOS2_S AS CA2_DOS2,
'' AS LOT_DOS2,
'' AS REG_DOS2
FROM
(SELECT * FROM w_DOS2_fictif_cli
UNION
SELECt * FROM w_DOS2_fictif_hon
) subview
JOIN prod_sigems.DOSSIER ON ANN_DOS2 = ANN_DOS AND COD_DOS2 = COD_DOS
JOIN w_DOS2_caisse ON ANN_DOS2 = ANN_DOS2_S AND COD_DOS2 = COD_DOS2_S
GROUP BY ANN_DOS2,
COD_DOS2,
IND_DOS2,
DEN_DOS,
DSO_DOS,
HEU_DOS,
CP1_DOS2_S,
CA1_DOS2_S,
CA2_DOS2_S;
]]></sqlcmd>
</NODE>
<NODE label="Entêtes">
<sqlcmd><![CDATA[
DROP TABLE IF EXISTS w_DOS2_eta2;
CREATE TEMP TABLE w_DOS2_eta2 AS
SELECT ANN_DOS2, COD_DOS2,
MAX(IND_DOS2) AS IND_DOS2_ETA2
FROM prod_sigems.DOS2
WHERE ETA_DOS2 = 2
GROUP BY 1,2;
CREATE INDEX w_DOS2_eta2_i1
ON w_DOS2_eta2
USING btree
(COD_DOS2);
-- Type T2A/Budget global, facturation intermediaire par séjour
UPDATE w_DOSSIER_SELECT SET
est_budget_global = p_sejours.est_budget_global,
type_t2a = t_services_facturation.type_t2a,
avec_facturation_intermediaire = t_services_facturation.avec_facturation_intermediaire,
CMD_DOS = CASE WHEN ghm_id > 0 AND substr(t_ghm.code,1,2) <> '90' THEN substr(t_ghm.code,1,2) ELSE '' END
FROM activite[PX].p_sejours
JOIN activite[PX].t_lieux ON lieu_sortie_id = t_lieux.oid
JOIN activite[PX].t_services_facturation on service_facturation_id = t_services_facturation.oid
JOIN base.t_ghm ON ghm_id = t_ghm.oid
WHERE no_sejour = no_sejour_SELECT AND
(
w_DOSSIER_SELECT.est_budget_global IS DISTINCT FROM p_sejours.est_budget_global OR
w_DOSSIER_SELECT.type_t2a IS DISTINCT FROM t_services_facturation.type_t2a OR
w_DOSSIER_SELECT.avec_facturation_intermediaire IS DISTINCT FROM t_services_facturation.avec_facturation_intermediaire
);
-- Préparation lignes clinique (pour budget global SSR)
DROP TABLE IF EXISTS w_ANALYG;
CREATE TEMP TABLE w_ANALYG AS
SELECT PRD_ANA,
CASE WHEN DMT_ANA NOT LIKE '@%' THEN DMT_ANA ELSE '***' END AS DMT_ANA,
CASE WHEN DMT_ANA LIKE '@%' THEN substr(DMT_ANA,2) ELSE '' END AS CMD_ANA,
MDT_ANA,
SER_ANA,
MAX(CPT_ANA) AS CPT_ANA
FROM prod_sigems.ANALYG
WHERE CPT_ANA <> ''
GROUP BY 1,2,3,4,5
ORDER BY 1,2,3,4;
CREATE INDEX w_ANALYG_i1
ON w_ANALYG
USING btree
(PRD_ANA);
DROP TABLE IF EXISTS w_LIG_CLINI;
CREATE TEMP TABLE w_LIG_CLINI AS
SELECT
LIG_CLINI.*,
''::text AS CODE_UCD,
0::bigint AS ucd_id,
''::text AS CODE_LPP,
0::bigint AS lpp_id,
CASE WHEN type_t2a = '2' AND est_budget_global = '1' THEN '1' ELSE '0' END AS BG_SSR,
CASE WHEN TX1_LCL <> 0 AND ML1_LCL = 0 AND type_t2a = '2' AND est_budget_global = '1' THEN TAR_LCL - ML2_LCL - ML3_LCL ELSE 0 END AS ML1_LCL_BG,
ANN_LCL || to_char(COD_LCL,'FM900000') AS SEJ_DOS,
ANN_LCL || to_char(COD_LCL,'FM900000') || '.' || to_char(CASE WHEN IND_LCL <> 0 THEN IND_LCL ELSE COALESCE(IND_DOS2_ETA2, IND_LCL) END,'FM9999900') AS no_facture,
CMD_DOS,
COALESCE(MDT_REEL,MDT_DOS) AS MDT_LCL,
COALESCE(ACT_PRC,PRO_LCL) AS ACT_LCL,
COALESCE(w_ANALYG_SER.CPT_ANA,w_ANALYG.CPT_ANA, AFA_PRC,'') AS CPT_ANA,
PRO_LCL || '|' ||
COALESCE(ACT_PRC,PRO_LCL) ||
COALESCE(w_ANALYG_SER.CPT_ANA,w_ANALYG.CPT_ANA, AFA_PRC,'') AS key,
CASE WHEN CASE WHEN IND_LCL <> 0 THEN IND_LCL ELSE COALESCE(IND_DOS2_ETA2, IND_LCL) END = 0 THEN '1' ELSE '0' END AS non_facturee
FROM prod_sigems.LIG_CLINI
JOIN w_DOSSIER_SELECT w_DOSSIER_SELECT ON ANN_LCL = ANN_SELECT AND COD_LCL = COD_SELECT
JOIN prod_sigems.DOSSIER ON DOSSIER.ANN_DOS = ANN_LCL AND DOSSIER.COD_DOS = COD_LCL
LEFT JOIN prod_sigems.DOSSIER_MDT ON DOSSIER.ANN_DOS = DOSSIER_MDT.ANN_DOS AND DOSSIER.COD_DOS = DOSSIER_MDT.COD_DOS
LEFT JOIN w_DOS2_ETA2 ON ANN_LCL = ANN_DOS2 AND COD_LCL = COD_DOS2
LEFT JOIN prod_sigems.PROD_CLINI ON PRO_LCL = COD_PRC
LEFT JOIN w_ANALYG ON PRO_LCL = w_ANALYG.PRD_ANA AND w_ANALYG.DMT_ANA = '' AND w_ANALYG.MDT_ANA = '' AND w_ANALYG.SER_ANA = ''
LEFT JOIN w_ANALYG w_ANALYG_SER ON PRO_LCL = w_ANALYG_SER.PRD_ANA AND w_ANALYG_SER.DMT_ANA = '' AND w_ANALYG_SER.MDT_ANA = '' AND w_ANALYG_SER.SER_ANA = SER_LCL
WHERE
PRO_LCL <> 'ECAC' AND
PRO_LCL <> 'GMOY' AND
SER_LCL <> '*CDL';
UPDATE w_LIG_CLINI
SET MDT_LCL = '04'
WHERE MDT_LCL = '23';
ANALYSE w_LIG_CLINI;
UPDATE w_LIG_CLINI
SET CODE_UCD = UCD_LCL_HON.CODE_UCD, ucd_id = t_ucd.oid
FROM prod_sigems.UCD_LCL_HON
JOIN base.t_ucd ON UCD_LCL_HON.CODE_UCD = t_ucd.code
WHERE NUM_LIGNE = NUM_LCL AND
UCD_LCL_HON.TYP = 2
;
UPDATE w_LIG_CLINI
SET CODE_LPP = LCL_BIS.COD_LPP, lpp_id = t_lpp.oid
FROM prod_sigems.LCL_BIS
JOIN base.t_lpp ON LCL_BIS.COD_LPP = t_lpp.code
WHERE NUM_LCL = NUM
;
CREATE INDEX w_LIG_CLINI_i1
ON w_LIG_CLINI
USING btree
(COD_LCL);
CREATE INDEX w_LIG_CLINI_i2
ON w_LIG_CLINI
USING btree
(NUM_LCL);
CREATE INDEX w_LIG_CLINI_i3
ON w_LIG_CLINI
USING btree
(PRO_LCL);
CREATE INDEX w_LIG_CLINI_i4
ON w_LIG_CLINI
USING btree
(key);
CREATE INDEX w_LIG_CLINI_i5
ON w_LIG_CLINI
USING btree
(no_facture);
CREATE INDEX w_LIG_CLINI_i6
ON w_LIG_CLINI
USING btree
(SEJ_DOS);
UPDATE w_LIG_CLINI
SET CPT_ANA = w_ANALYG.CPT_ANA,
key = PRO_LCL || '|' ||
ACT_LCL || '|' ||
w_ANALYG.CPT_ANA
FROM w_ANALYG
WHERE PRO_LCL = PRD_ANA AND SER_ANA = '' AND DMT_ANA = DMT_LCL AND MDT_ANA = '' AND
w_LIG_CLINI.CPT_ANA IS DISTINCT FROM w_ANALYG.CPT_ANA;
UPDATE w_LIG_CLINI
SET CPT_ANA = w_ANALYG.CPT_ANA,
key = PRO_LCL || '|' ||
ACT_LCL || '|' ||
w_ANALYG.CPT_ANA
FROM w_ANALYG
WHERE PRO_LCL = PRD_ANA AND SER_ANA = '' AND DMT_ANA = '' AND MDT_ANA = MDT_LCL AND
w_LIG_CLINI.CPT_ANA IS DISTINCT FROM w_ANALYG.CPT_ANA;
UPDATE w_LIG_CLINI
SET CPT_ANA = w_ANALYG.CPT_ANA,
key = PRO_LCL || '|' ||
ACT_LCL || '|' ||
w_ANALYG.CPT_ANA
FROM w_ANALYG
WHERE PRO_LCL = PRD_ANA AND SER_ANA = '' AND DMT_ANA = DMT_LCL AND MDT_ANA = MDT_LCL AND
w_LIG_CLINI.CPT_ANA IS DISTINCT FROM w_ANALYG.CPT_ANA;
UPDATE w_LIG_CLINI
SET CPT_ANA = w_ANALYG.CPT_ANA,
key = PRO_LCL || '|' ||
ACT_LCL || '|' ||
w_ANALYG.CPT_ANA
FROM w_ANALYG
WHERE PRO_LCL = PRD_ANA AND SER_ANA = SER_LCL AND DMT_ANA = '' AND MDT_ANA = '' AND
w_LIG_CLINI.CPT_ANA IS DISTINCT FROM w_ANALYG.CPT_ANA;
UPDATE w_LIG_CLINI
SET CPT_ANA = w_ANALYG.CPT_ANA,
key = PRO_LCL || '|' ||
ACT_LCL || '|' ||
w_ANALYG.CPT_ANA
FROM w_ANALYG
WHERE PRO_LCL = PRD_ANA AND SER_ANA = SER_LCL AND DMT_ANA = DMT_LCL AND MDT_ANA = '' AND
w_LIG_CLINI.CPT_ANA IS DISTINCT FROM w_ANALYG.CPT_ANA;
UPDATE w_LIG_CLINI
SET CPT_ANA = w_ANALYG.CPT_ANA,
key = PRO_LCL || '|' ||
ACT_LCL || '|' ||
w_ANALYG.CPT_ANA
FROM w_ANALYG
WHERE PRO_LCL = PRD_ANA AND SER_ANA = SER_LCL AND DMT_ANA = '' AND MDT_ANA = MDT_LCL AND
w_LIG_CLINI.CPT_ANA IS DISTINCT FROM w_ANALYG.CPT_ANA;
UPDATE w_LIG_CLINI
SET CPT_ANA = w_ANALYG.CPT_ANA,
key = PRO_LCL || '|' ||
ACT_LCL || '|' ||
w_ANALYG.CPT_ANA
FROM w_ANALYG
WHERE PRO_LCL = PRD_ANA AND SER_ANA = SER_LCL AND DMT_ANA = DMT_LCL AND MDT_ANA = MDT_LCL AND
w_LIG_CLINI.CPT_ANA IS DISTINCT FROM w_ANALYG.CPT_ANA;
UPDATE w_LIG_CLINI
SET CPT_ANA = w_ANALYG.CPT_ANA,
key = PRO_LCL || '|' ||
ACT_LCL || '|' ||
w_ANALYG.CPT_ANA
FROM w_ANALYG
WHERE PRO_LCL = PRD_ANA AND CMD_ANA = CMD_DOS AND CMD_ANA <> '' AND MDT_ANA = '' AND SER_ANA = '' AND
w_LIG_CLINI.CPT_ANA IS DISTINCT FROM w_ANALYG.CPT_ANA;
DROP TABLE IF EXISTS w_factures_last;
CREATE TEMP TABLE w_factures_last AS
SELECT no_sejour,
MAX(no_facture) AS no_facture,
MAX(CASE WHEN code_facture <> '1' THEN no_facture ELSE NULL END) AS no_facture_nf
FROM activite[PX].p_factures
GROUP BY 1;
UPDATE w_LIG_CLINI
SET no_facture = CASE WHEN PRO_LCL <> 'ACPT' THEN COALESCE(w_factures_last.no_facture_nf,w_factures_last.no_facture) ELSE w_factures_last.no_facture END
FROM w_factures_last
WHERE w_LIG_CLINI.SEJ_DOS = w_factures_last.no_sejour AND
w_LIG_CLINI.no_facture NOT IN (SELECT no_facture FROM activite[PX].p_factures);
DROP TABLE IF EXISTS w_LIG_CLINI_keys;
CREATE TEMP TABLE w_LIG_CLINI_keys AS
SELECT key,
PRO_LCL,
ACT_LCL,
CPT_ANA,
0::bigint AS rubrique_facturation_id,
0::bigint AS rubrique_comptabilisation_id,
0::bigint AS prestation_id,
0::bigint AS compte_produit_id
FROM w_LIG_CLINI
GROUP BY 1,2,3,4;
INSERT INTO activite[PX].t_rubriques_facturation(code_original, code, texte, texte_court)
SELECT trim(PRO_LCL), trim(PRO_LCL), trim(PRO_LCL), trim(PRO_LCL)
FROM w_LIG_CLINI_keys
WHERE trim(PRO_LCL) <> '' AND
trim(PRO_LCL) NOT IN (SELECT code_original FROM activite[PX].t_rubriques_facturation WHERE code_original IS NOT NULL)
GROUP BY trim(PRO_LCL)
ORDER BY trim(PRO_LCL);
UPDATE activite.t_prestations SET
code_original = ACT_LCL
FROM w_LIG_CLINI_keys
where t_prestations.code_original IS DISTINCT FROM ACT_LCL
AND t_prestations.code = ACT_LCL;
INSERT INTO activite.t_prestations(code_original, code, texte, texte_court)
SELECT ACT_LCL, ACT_LCL, ACT_LCL, ACT_LCL
FROM w_LIG_CLINI_keys
WHERE ACT_LCL <> '' AND
ACT_LCL NOT IN (SELECT code_original FROM activite.t_prestations WHERE code_original IS NOT NULL)
GROUP BY ACT_LCL
ORDER BY ACT_LCL;
UPDATE activite.t_prestations SET
code = ACT_LCL,
texte = ACT_LCL,
texte_court = ACT_LCL
FROM w_LIG_CLINI_keys
WHERE code_original = ACT_LCL AND
(
code IS DISTINCT FROM ACT_LCL OR
texte IS DISTINCT FROM ACT_LCL OR
texte_court IS DISTINCT FROM ACT_LCL
)
;
UPDATE w_LIG_CLINI_keys SET prestation_id = t_prestations.oid
FROM activite.t_prestations
WHERE ACT_LCL = t_prestations.code_original;
UPDATE w_LIG_CLINI_keys SET
rubrique_facturation_id = t_rubriques_facturation.oid,
rubrique_comptabilisation_id = t_rubriques_facturation.oid
FROM activite[PX].t_rubriques_facturation
WHERE PRO_LCL = t_rubriques_facturation.code_original;
UPDATE w_LIG_CLINI_keys SET compte_produit_id = t_compte.oid
FROM activite[PX].t_compte
WHERE CPT_ANA = t_compte.code;
CREATE INDEX w_LIG_CLINI_keys_i1
ON w_LIG_CLINI_keys
USING btree
(key);
-- préparation
DROP TABLE IF EXISTS w_DOS2_TP;
CREATE TEMP TABLE w_DOS2_TP AS
SELECT ANN_DOS2 AS ANN_DOS2_TP,
COD_DOS2 AS COD_DOS2_TP,
base.cti_array_accum(DISTINCT CASE WHEN CP1_DOS2 <> '' THEN CP1_DOS2 ELSE 'ABCDEFG1' END) AS CP1_DOS2_array,
base.cti_array_accum(DISTINCT CASE WHEN CA2_DOS2 <> '' THEN CA2_DOS2 ELSE 'ABCDEFG1' END) AS CA2_DOS2_array
FROM prod_sigems.DOS2
WHERE ANN_DOS2 <> ''
GROUP BY 1,2
HAVING
(
count(DISTINCT CASE WHEN CP1_DOS2 <> '' THEN CP1_DOS2 ELSE NULL END) > 1 OR
count(DISTINCT CASE WHEN CA2_DOS2 <> '' THEN CA2_DOS2 ELSE NULL END) > 1
)
;
DROP TABLE IF EXISTS w_LIG_CLINI_mrx;
CREATE TEMP TABLE w_LIG_CLINI_mrx AS
SELECT
ANN_LCL,
COD_LCL,
IND_LCL,
NUM_LCL,
DAT_REG,
CAI_REG,
MONT + TVA AS MNT_REG,
CASE
WHEN CAI_REG = '99999999' THEN '3'
WHEN CAI_REG = CP1_DOS2 AND (MR1_LCL != 0 OR HR1_DOS2 != 0) THEN '1'
WHEN CAI_REG = CA2_DOS2 THEN '2'
WHEN CAI_REG = ANY(CP1_DOS2_array) AND CP1_DOS2_array IS NOT NULL THEN '1'
WHEN CAI_REG = ANY(CA2_DOS2_array) AND CA2_DOS2_array IS NOT NULL THEN '2'
WHEN CAI_REG = CP1_DOS2 THEN '1'
ELSE '3' END AS TTP_LCL,
CASE WHEN CAI_REG <> '99999999' AND (CAI_REG = CP1_DOS2 OR CAI_REG = ANY(CP1_DOS2_array)) AND (MR1_LCL != 0 OR HR1_DOS2 != 0) THEN DAT_REG ELSE '00010101' END AS DR1_LCL,
CASE WHEN CAI_REG <> '99999999' AND (CAI_REG = CA2_DOS2 OR CAI_REG = ANY(CA2_DOS2_array)) AND (CAI_REG <> CP1_DOS2 OR MR1_LCL = 0) THEN DAT_REG ELSE '00010101' END AS DR2_LCL,
CASE WHEN CAI_REG = '99999999' OR (CAI_REG IS DISTINCT FROM CP1_DOS2 AND CAI_REG IS DISTINCT FROM CA2_DOS2 AND (CAI_REG <> ALL(CP1_DOS2_array) OR CP1_DOS2_array IS NULL) AND (CAI_REG <> ALL(CA2_DOS2_array) OR CA2_DOS2_array IS NULL)) THEN DAT_REG ELSE '00010101' END AS DR3_LCL,
CASE WHEN CAI_REG <> '99999999' AND (CAI_REG = CP1_DOS2 OR CAI_REG = ANY(CP1_DOS2_array)) AND (MR1_LCL != 0 OR HR1_DOS2 != 0) THEN MONT + TVA ELSE 0 END AS MR1_LCL,
CASE WHEN CAI_REG <> '99999999' AND (CAI_REG = CA2_DOS2 OR CAI_REG = ANY(CA2_DOS2_array)) AND (CAI_REG <> CP1_DOS2 OR MR1_LCL = 0) THEN MONT + TVA ELSE 0 END AS MR2_LCL,
CASE WHEN CAI_REG = '99999999' OR (CAI_REG IS DISTINCT FROM CP1_DOS2 AND CAI_REG IS DISTINCT FROM CA2_DOS2 AND (CAI_REG <> ALL(CP1_DOS2_array) OR CP1_DOS2_array IS NULL) AND (CAI_REG <> ALL(CA2_DOS2_array) OR CA2_DOS2_array IS NULL)) THEN MONT + TVA ELSE 0 END AS MR3_LCL
FROM prod_sigems.LIG_CLINI
JOIN w_DOSSIER_SELECT w_DOSSIER_SELECT ON ANN_LCL = ANN_SELECT AND COD_LCL = COD_SELECT
JOIN prod_sigems.DOS2 ON ANN_LCL = ANN_DOS2 AND COD_LCL = COD_DOS2 AND IND_LCL = IND_DOS2 AND ETA_DOS2 >= 1
LEFT JOIN w_DOS2_TP ON ANN_LCL = ANN_DOS2_TP AND COD_LCL = COD_DOS2_TP
JOIN prod_sigems.REG4 ON NUM_LCL = NUM_CLI
JOIN prod_sigems.REG ON NUM_REG4 = SER_REG;
ANALYSE w_LIG_CLINI_mrx
;
-- Si pas de ventilation fine, ventiler selon TP1
UPDATE w_LIG_CLINI_mrx SET
TTP_LCL = '1',
MR1_LCL = MNT_REG
FROM prod_sigems.DOS2
WHERE ANN_LCL = ANN_DOS2 AND
COD_LCL = COD_DOS2 AND
IND_LCL = IND_DOS2 AND
MR1_LCL = 0 AND MR2_LCL = 0 AND MR3_LCL = 0 AND
CAI_REG = CP1_DOS2
;
-- Ajuster montants selon tiers
UPDATE w_lig_clini_mrx SET
MR1_LCL = CASE WHEN TTP_LCL = '1' THEN MNT_REG ELSE 0 END,
MR2_LCL = CASE WHEN TTP_LCL = '2' THEN MNT_REG ELSE 0 END,
MR3_LCL = CASE WHEN TTP_LCL = '3' THEN MNT_REG ELSE 0 END
WHERE
MR1_LCL IS DISTINCT FROM CASE WHEN TTP_LCL = '1' THEN MNT_REG ELSE 0 END OR
MR2_LCL IS DISTINCT FROM CASE WHEN TTP_LCL = '2' THEN MNT_REG ELSE 0 END OR
MR3_LCL IS DISTINCT FROM CASE WHEN TTP_LCL = '3' THEN MNT_REG ELSE 0 END
;
UPDATE w_LIG_CLINI_mrx SET
DR1_LCL = '00010101',
MR1_LCL = 0
WHERE TTP_LCL <> '1' AND
(
DR1_LCL <> '00010101' OR
MR1_LCL <> 0
)
;
UPDATE w_LIG_CLINI_mrx SET
DR2_LCL = '00010101',
MR2_LCL = 0
WHERE TTP_LCL <> '2' AND
(
DR2_LCL <> '00010101' OR
MR2_LCL <> 0
)
;
UPDATE w_LIG_CLINI_mrx SET
DR3_LCL = '00010101',
MR3_LCL = 0
WHERE TTP_LCL <> '3' AND
(
DR3_LCL <> '00010101' OR
MR3_LCL <> 0
)
;
CREATE INDEX w_LIG_CLINI_mrx_i1
ON w_LIG_CLINI_mrx
USING btree
(NUM_LCL);
CREATE INDEX w_LIG_CLINI_mrx_i2
ON w_LIG_CLINI_mrx
USING btree
(COD_LCL);
DROP TABLE IF EXISTS w_LIG_CLINI_tmrx;
CREATE TEMP TABLE w_LIG_CLINI_tmrx AS
SELECT ANN_LCL,
COD_LCL,
IND_LCL,
MAX(DR1_LCL) AS DR1_LCL,
MAX(DR2_LCL) AS DR2_LCL,
MAX(DR3_LCL) AS DR3_LCL,
SUM(MR1_LCL) AS MR1_LCL,
SUM(MR2_LCL) AS MR2_LCL,
SUM(MR3_LCL) AS MR3_LCL
FROM w_LIG_CLINI_mrx
GROUP BY 1,2,3;
CREATE INDEX w_LIG_CLINI_tmrx_i1
ON w_LIG_CLINI_tmrx
USING btree
(COD_LCL);
DROP TABLE IF EXISTS w_LIG_HONOR_mrx;
CREATE TEMP TABLE w_LIG_HONOR_mrx AS
SELECT
ANN_LHO,
COD_LHO,
IND_LHO,
NUM_LHO,
DAT_REG,
CAI_REG,
MON_REG3 AS MNT_REG,
CASE
WHEN CAI_REG = '99999999' THEN '3'
WHEN CAI_REG = CP1_DOS2 AND (MR1_LHO != 0 OR HR1_DOS2 != 0) THEN '1'
WHEN CAI_REG = CA2_DOS2 THEN '2'
WHEN CAI_REG = ANY(CP1_DOS2_array) AND CP1_DOS2_array IS NOT NULL THEN '1'
WHEN CAI_REG = ANY(CA2_DOS2_array) AND CA2_DOS2_array IS NOT NULL THEN '2'
WHEN CAI_REG = CP1_DOS2 THEN '1'
ELSE '3' END AS TTP_LHO,
CASE WHEN CEX_LHO = 'ACOMPT' THEN '1'::text ELSE '0'::text END AS is_acompte,
CASE WHEN CAI_REG <> '99999999' AND (CAI_REG = CP1_DOS2 OR CAI_REG = ANY(CP1_DOS2_array)) AND (MR1_LHO != 0 OR HR1_DOS2 != 0) THEN DAT_REG ELSE '00010101' END AS DR1_LHO,
CASE WHEN CAI_REG <> '99999999' AND (CAI_REG = CA2_DOS2 OR CAI_REG = ANY(CA2_DOS2_array)) AND (CAI_REG <> CP1_DOS2 OR MR1_LHO = 0) THEN DAT_REG ELSE '00010101' END AS DR2_LHO,
CASE WHEN CAI_REG = '99999999' OR (CAI_REG IS DISTINCT FROM CP1_DOS2 AND CAI_REG IS DISTINCT FROM CA2_DOS2 AND (CAI_REG <> ALL(CP1_DOS2_array) OR CP1_DOS2_array IS NULL) AND (CAI_REG <> ALL(CA2_DOS2_array) OR CA2_DOS2_array IS NULL)) THEN DAT_REG ELSE '00010101' END AS DR3_LHO,
CASE WHEN CAI_REG <> '99999999' AND (CAI_REG = CP1_DOS2 OR CAI_REG = ANY(CP1_DOS2_array)) AND (MR1_LHO != 0 OR HR1_DOS2 != 0) THEN MON_REG3 ELSE 0 END AS MR1_LHO,
CASE WHEN CAI_REG <> '99999999' AND (CAI_REG = CA2_DOS2 OR CAI_REG = ANY(CA2_DOS2_array)) AND (CAI_REG <> CP1_DOS2 OR MR1_LHO = 0) THEN MON_REG3 ELSE 0 END AS MR2_LHO,
CASE WHEN CAI_REG = '99999999' OR (CAI_REG IS DISTINCT FROM CP1_DOS2 AND CAI_REG IS DISTINCT FROM CA2_DOS2 AND (CAI_REG <> ALL(CP1_DOS2_array) OR CP1_DOS2_array IS NULL) AND (CAI_REG <> ALL(CA2_DOS2_array) OR CA2_DOS2_array IS NULL)) THEN MON_REG3 ELSE 0 END AS MR3_LHO
FROM prod_sigems.LIG_HONOR
JOIN w_DOSSIER_SELECT w_DOSSIER_SELECT ON ANN_LHO = ANN_SELECT AND COD_LHO = COD_SELECT
JOIN prod_sigems.DOS2 ON ANN_LHO = ANN_DOS2 AND COD_LHO = COD_DOS2 AND IND_LHO = IND_DOS2 AND ETA_DOS2 >= 1
LEFT JOIN w_DOS2_TP ON ANN_LHO = ANN_DOS2_TP AND COD_LHO = COD_DOS2_TP
JOIN w_REG3 ON NUM_LHO = LHO_REG3;
ANALYSE w_LIG_HONOR_mrx
;
-- Si pas de ventilation fine, ventiler selon TP1
UPDATE w_LIG_HONOR_mrx SET
TTP_LHO = '1',
MR1_LHO = MNT_REG
FROM prod_sigems.DOS2
WHERE ANN_LHO = ANN_DOS2 AND
COD_LHO = COD_DOS2 AND
IND_LHO = IND_DOS2 AND
MR1_LHO = 0 AND MR2_LHO = 0 AND MR3_LHO = 0 AND
CAI_REG = CP1_DOS2
;
-- Ajuster montants selon tiers
UPDATE w_LIG_HONOR_mrx SET
MR1_LHO = CASE WHEN TTP_LHO = '1' THEN MNT_REG ELSE 0 END,
MR2_LHO = CASE WHEN TTP_LHO = '2' THEN MNT_REG ELSE 0 END,
MR3_LHO = CASE WHEN TTP_LHO = '3' THEN MNT_REG ELSE 0 END
WHERE
MR1_LHO IS DISTINCT FROM CASE WHEN TTP_LHO = '1' THEN MNT_REG ELSE 0 END OR
MR2_LHO IS DISTINCT FROM CASE WHEN TTP_LHO = '2' THEN MNT_REG ELSE 0 END OR
MR3_LHO IS DISTINCT FROM CASE WHEN TTP_LHO = '3' THEN MNT_REG ELSE 0 END
;
UPDATE w_LIG_HONOR_mrx SET
DR1_LHO = '00010101',
MR1_LHO = 0
WHERE TTP_LHO <> '1' AND
(
DR1_LHO <> '00010101' OR
MR1_LHO <> 0
)
;
UPDATE w_LIG_HONOR_mrx SET
DR2_LHO = '00010101',
MR2_LHO = 0
WHERE TTP_LHO <> '2' AND
(
DR2_LHO <> '00010101' OR
MR2_LHO <> 0
)
;
UPDATE w_LIG_HONOR_mrx SET
DR3_LHO = '00010101',
MR3_LHO = 0
WHERE TTP_LHO <> '3' AND
(
DR3_LHO <> '00010101' OR
MR3_LHO <> 0
)
;
CREATE INDEX w_LIG_HONOR_mrx_i1
ON w_LIG_HONOR_mrx
USING btree
(NUM_LHO);
CREATE INDEX w_LIG_HONOR_mrx_i2
ON w_LIG_HONOR_mrx
USING btree
(COD_LHO);
DROP TABLE IF EXISTS w_LIG_HONOR_tmrx;
CREATE TEMP TABLE w_LIG_HONOR_tmrx AS
SELECT ANN_LHO,
COD_LHO,
IND_LHO,
MAX(DR1_LHO) AS DR1_LHO,
MAX(DR2_LHO) AS DR2_LHO,
MAX(DR3_LHO) AS DR3_LHO,
SUM(MR1_LHO) AS MR1_LHO,
SUM(MR2_LHO) AS MR2_LHO,
SUM(MR3_LHO) AS MR3_LHO
FROM w_LIG_HONOR_mrx
GROUP BY 1,2,3;
CREATE INDEX w_LIG_HONOR_tmrx_i1
ON w_LIG_HONOR_tmrx
USING btree
(COD_LHO);
-- Factures 'normales'
DROP TABLE IF EXISTS w_factures;
CREATE TEMP TABLE w_factures AS
SELECT
nextval('activite[PX].s_factures'::regclass) AS oid,
p_sejours.oid AS sejour_id,
SEJ_DOS AS no_sejour,
ANN_DOS,
COD_DOS,
IND_DOS2,
SEJ_DOS || '.' || to_char(IND_DOS2,'FM9999900') AS no_facture,
CASE WHEN (SJ1_DOS2 < 0 OR HO1_DOS2 < 0 OR SJ2_DOS2 < 0 OR HO2_DOS2 < 0 OR SJ3_DOS2 < 0 OR HO3_DOS2 < 0) THEN SEJ_DOS || '.' || to_char(IND_DOS2,'FM9999900') ELSE SEJ_DOS || '.01' END AS no_facture_reference,
CASE WHEN (SJ1_DOS2 < 0 OR HO1_DOS2 < 0 OR SJ2_DOS2 < 0 OR HO2_DOS2 < 0 OR SJ3_DOS2 < 0 OR HO3_DOS2 < 0) THEN 0 ELSE 0 END AS facture_reference_id,
''::text AS no_facture_od_avoir,
0::bigint AS facture_od_avoir_id,
DEN_DOS2 AS date_debut,
GREATEST(DSO_DOS2,DEN_DOS2) AS date_fin,
p_sejours.ghs_id,
p_sejours.ghs_bebe1_id,
p_sejours.ghs_bebe2_id,
p_sejours.ghs_bebe3_id,
p_sejours.code_cp_demandee AS code_cp_demandee,
CASE WHEN (SJ1_DOS2 < 0 OR HO1_DOS2 < 0 OR SJ2_DOS2 < 0 OR HO2_DOS2 < 0 OR SJ3_DOS2 < 0 OR HO3_DOS2 < 0) THEN '1' WHEN IND_DOS2 > 1 AND avec_facturation_intermediaire IS DISTINCT FROM '1' THEN '2' ELSE '0' END AS type_facture,
CASE WHEN (SJ1_DOS2 < 0 OR HO1_DOS2 < 0 OR SJ2_DOS2 < 0 OR HO2_DOS2 < 0 OR SJ3_DOS2 < 0 OR HO3_DOS2 < 0) THEN 1::numeric ELSE 0::numeric END AS nb_rejets,
CASE WHEN ETA_DOS2 >= 3 THEN 1::numeric ELSE 0::numeric END AS code_facture,
CASE WHEN ETA_DOS2 >= 3 THEN COALESCE(DFA_DOS2, date(now())) ELSE '20991231' END AS date_facture,
CASE WHEN ETA_DOS2 >= 3 AND DFA_DOS2 IS NOT NULL THEN 1::numeric ELSE 0::numeric END AS code_vente,
CASE WHEN ETA_DOS2 >= 3 AND DFA_DOS2 IS NOT NULL THEN date_part('year', DFA_DOS2) * 100 + date_part('month', DFA_DOS2) ELSE 209912 END AS mois_vente,
CASE WHEN ETA_DOS2 >= 3 AND DFA_DOS2 IS NOT NULL THEN DFA_DOS2 ELSE '20991231' END AS date_vente,
''::text AS code_cloture,
CASE WHEN p_sejours.ghs_id > 0 THEN 'GHS' ELSE '' END AS particularite_t2a,
COALESCE(t_tiers_payant_0.oid,0) AS tiers_payant_0_id,
COALESCE(t_tiers_payant_1.oid,0) AS tiers_payant_1_id,
COALESCE(t_tiers_payant_2.oid,0) AS tiers_payant_2_id,
0::bigint AS tiers_payant_22_id,
CASE WHEN ETA_DOS2 >= 3 THEN SJ1_DOS2 + SJ2_DOS2 + SJ3_DOS2 ELSE 0 END AS montant_facture_c,
CASE WHEN ETA_DOS2 >= 3 THEN HO1_DOS2 + HO2_DOS2 + HO3_DOS2 ELSE 0 END AS montant_facture_h,
CASE WHEN ETA_DOS2 >= 3 THEN SJ3_DOS2 ELSE 0 END AS montant_facture_0_c,
CASE WHEN ETA_DOS2 >= 3 THEN HO3_DOS2 ELSE 0 END AS montant_facture_0_h,
CASE WHEN ETA_DOS2 >= 3 THEN SJ1_DOS2 ELSE 0 END AS montant_facture_1_c,
CASE WHEN ETA_DOS2 >= 3 THEN HO1_DOS2 ELSE 0 END AS montant_facture_1_h,
CASE WHEN ETA_DOS2 >= 3 THEN SJ2_DOS2 ELSE 0 END AS montant_facture_2_c,
CASE WHEN ETA_DOS2 >= 3 THEN HO2_DOS2 ELSE 0 END AS montant_facture_2_h,
0::numeric AS montant_facture_22_c,
0::numeric AS montant_facture_22_h,
CASE WHEN ETA_DOS2 >= 3 THEN SJ1_DOS2 + SJ2_DOS2 + SJ3_DOS2 ELSE 0 END AS montant_comptabilise_c,
CASE WHEN ETA_DOS2 >= 3 THEN HO1_DOS2 + HO2_DOS2 + HO3_DOS2 ELSE 0 END AS montant_comptabilise_h,
CASE WHEN ETA_DOS2 >= 3 THEN SJ3_DOS2 ELSE 0 END AS montant_comptabilise_0_c,
CASE WHEN ETA_DOS2 >= 3 THEN HO3_DOS2 ELSE 0 END AS montant_comptabilise_0_h,
CASE WHEN ETA_DOS2 >= 3 THEN SJ1_DOS2 ELSE 0 END AS montant_comptabilise_1_c,
CASE WHEN ETA_DOS2 >= 3 THEN HO1_DOS2 ELSE 0 END AS montant_comptabilise_1_h,
CASE WHEN ETA_DOS2 >= 3 THEN SJ2_DOS2 ELSE 0 END AS montant_comptabilise_2_c,
CASE WHEN ETA_DOS2 >= 3 THEN HO2_DOS2 ELSE 0 END AS montant_comptabilise_2_h,
0::numeric AS montant_comptabilise_22_c,
0::numeric AS montant_comptabilise_22_h,
COALESCE(MR1_LCL,0) + COALESCE(MR2_LCL,0) + COALESCE(MR3_LCL,0) AS montant_regle_c,
COALESCE(MR1_LHO,0) + COALESCE(MR2_LHO,0) + COALESCE(MR3_LHO,0) AS montant_regle_h,
COALESCE(MR3_LCL,0) AS montant_regle_0_c,
COALESCE(MR3_LHO,0) AS montant_regle_0_h,
COALESCE(MR1_LCL,0) AS montant_regle_1_c,
COALESCE(MR1_LHO,0) AS montant_regle_1_h,
COALESCE(MR2_LCL,0) AS montant_regle_2_c,
COALESCE(MR2_LHO,0) AS montant_regle_2_h,
0::numeric AS montant_regle_22_c,
0::numeric AS montant_regle_22_h,
'1'::text AS code_expedie_0,
CASE WHEN COALESCE(DB1_DOS2,'00010101')::date > '00010101'::date THEN '1' ELSE '0' END AS code_expedie_1,
CASE WHEN COALESCE(DB2_DOS2,'00010101')::date > '00010101'::date THEN '1' ELSE '0' END AS code_expedie_2,
0::numeric AS code_expedie_22,
CASE WHEN COALESCE(DB1_DOS2,'00010101')::date > '00010101' THEN COALESCE(DB1_DOS2,'00010101') ELSE COALESCE(DB2_DOS2,'00010101') END AS date_expedition,
DFA_DOS2 AS date_expedition_0,
COALESCE(DB1_DOS2,'00010101') AS date_expedition_1,
COALESCE(DB2_DOS2,'00010101') AS date_expedition_2,
'00010101'::date AS date_expedition_22,
0 AS no_bordereau_0,
NB1_DOS2 AS no_bordereau_1,
NB2_DOS2 AS no_bordereau_2,
0::numeric AS no_bordereau_22,
LEAST(GREATEST(DR1_LCL, DR2_LCL, DR3_LCL, DR1_LHO, DR2_LHO, DR3_LHO), '20991231') AS date_solde,
LEAST(GREATEST(DR1_LCL, DR2_LCL, DR3_LCL), '20991231') AS date_solde_c,
LEAST(GREATEST(DR1_LHO, DR2_LHO, DR3_LHO), '20991231') AS date_solde_h,
LEAST(DR3_LCL, '20991231') AS date_solde_0_c,
LEAST(DR3_LHO, '20991231') AS date_solde_0_h,
LEAST(DR1_LCL, '20991231') AS date_solde_1_c,
LEAST(DR1_LHO, '20991231') AS date_solde_1_h,
LEAST(DR2_LCL, '20991231') AS date_solde_2_c,
LEAST(DR2_LHO, '20991231') AS date_solde_2_h,
'20991231'::date AS date_solde_22_c,
'20991231'::date AS date_solde_22_h,
0::numeric AS montant_encours_c,
0::numeric AS montant_encours_0_c,
0::numeric AS montant_encours_1_c,
0::numeric AS montant_encours_2_c,
0::numeric AS montant_encours_22_c,
0::numeric AS montant_encours_h,
0::numeric AS montant_encours_0_h,
0::numeric AS montant_encours_1_h,
0::numeric AS montant_encours_2_h,
0::numeric AS montant_encours_22_h,
'20991231'::date AS date_solde_reference,
'20991231'::date AS date_solde_reference_c,
'20991231'::date AS date_solde_reference_h,
'20991231'::date AS date_solde_reference_0_c,
'20991231'::date AS date_solde_reference_1_c,
'20991231'::date AS date_solde_reference_2_c,
'20991231'::date AS date_solde_reference_22_c,
'20991231'::date AS date_solde_reference_0_h,
'20991231'::date AS date_solde_reference_1_h,
'20991231'::date AS date_solde_reference_2_h,
'20991231'::date AS date_solde_reference_22_h,
0::numeric AS delai_facture,
0::numeric AS delai_solde,
0::numeric AS delai_expedition,
0::numeric AS delai_expedition_0,
0::numeric AS delai_expedition_1,
0::numeric AS delai_expedition_2,
0::numeric AS delai_expedition_22,
0::numeric AS delai_solde_0_c,
0::numeric AS delai_solde_0_h,
0::numeric AS delai_solde_1_c,
0::numeric AS delai_solde_1_h,
0::numeric AS delai_solde_2_c,
0::numeric AS delai_solde_2_h,
0::numeric AS delai_solde_22_c,
0::numeric AS delai_solde_22_h,
'20991231'::date AS date_encours,
0::numeric AS montant_facture_c_actes_inclus_dans_sejour,
0::numeric AS montant_facture_h_actes_inclus_dans_sejour,
0::numeric AS montant_comptabilise_budget_global_c
FROM prod_sigems.DOS2
JOIN w_DOSSIER ON ANN_DOS2 = ANN_DOS AND COD_DOS2 = COD_DOS
JOIN w_DOSSIER_SELECT w_DOSSIER_SELECT ON ANN_DOS2 = ANN_SELECT AND COD_DOS2 = COD_SELECT
JOIN activite[PX].p_sejours ON SEJ_DOS = p_sejours.code_original AND p_sejours.etat = ''
LEFT JOIN w_LIG_CLINI_tmrx ON ANN_DOS2 = ANN_LCL AND COD_DOS2 = COD_LCL AND IND_DOS2 = IND_LCL
LEFT JOIN w_LIG_HONOR_tmrx ON ANN_DOS2 = ANN_LHO AND COD_DOS2 = COD_LHO AND IND_DOS2 = IND_LHO
LEFT JOIN activite[PX].t_tiers_payant t_tiers_payant_0 ON 'PATIENT' = t_tiers_payant_0.code_original
LEFT JOIN activite[PX].t_tiers_payant t_tiers_payant_1 ON t_tiers_payant_1.type_tiers_payant = 1 AND DOS2.CP1_DOS2 = split_part(t_tiers_payant_1.code_original,'(1)',1)
LEFT JOIN activite[PX].t_tiers_payant t_tiers_payant_2 ON t_tiers_payant_2.type_tiers_payant = 2 AND DOS2.CA2_DOS2 = split_part(t_tiers_payant_2.code_original,'(2)',1)
WHERE ETA_DOS2 >= 1;
-- Factures 'Budget global SSR'
DROP TABLE IF EXISTS w_DOS2_BG;
CREATE TEMP TABLE w_DOS2_BG AS
SELECT
ANN_LCL AS ANN_DOS2_BG,
COD_LCL AS COD_DOS2_BG,
IND_LCL AS IND_DOS2_BG,
SUM(ML1_LCL_BG) AS SJ1_DOS2_BG
FROM w_LIG_CLINI
WHERE ML1_LCL_BG <> 0
GROUP BY 1,2,3;
CREATE INDEX w_DOS2_BG_i1
ON w_DOS2_BG
USING btree
(COD_DOS2_BG);
INSERT INTO w_factures
SELECT
nextval('activite[PX].s_factures'::regclass) AS oid,
p_sejours.oid AS sejour_id,
SEJ_DOS AS no_sejour,
ANN_DOS,
COD_DOS,
IND_DOS2,
SEJ_DOS || '.' || to_char(IND_DOS2,'FM9999900') || '.BG' AS no_facture,
SEJ_DOS || '.' || to_char(IND_DOS2,'FM9999900') || '.BG' AS no_facture_reference,
0 AS facture_reference_id,
''::text AS no_facture_od_avoir,
0::bigint AS facture_od_avoir_id,
DEN_DOS2 AS date_debut,
GREATEST(DSO_DOS2,DEN_DOS2) AS date_fin,
p_sejours.ghs_id,
p_sejours.ghs_bebe1_id,
p_sejours.ghs_bebe2_id,
p_sejours.ghs_bebe3_id,
p_sejours.code_cp_demandee AS code_cp_demandee,
CASE WHEN (SJ1_DOS2 < 0 OR HO1_DOS2 < 0 OR SJ2_DOS2 < 0 OR HO2_DOS2 < 0 OR SJ3_DOS2 < 0 OR HO3_DOS2 < 0) THEN '1' WHEN IND_DOS2 > 1 AND avec_facturation_intermediaire IS DISTINCT FROM '1' THEN '2' ELSE '0' END AS type_facture,
CASE WHEN (SJ1_DOS2_BG < 0 OR SJ1_DOS2 < 0 OR HO1_DOS2 < 0 OR SJ2_DOS2 < 0 OR HO2_DOS2 < 0 OR SJ3_DOS2 < 0 OR HO3_DOS2 < 0) THEN 1::numeric ELSE 0::numeric END AS nb_rejets,
CASE WHEN ETA_DOS2 >= 3 THEN 1::numeric ELSE 0::numeric END AS code_facture,
CASE WHEN ETA_DOS2 >= 3 THEN COALESCE(DFA_DOS2, date(now())) ELSE '20991231' END AS date_facture,
CASE WHEN ETA_DOS2 >= 3 AND DFA_DOS2 IS NOT NULL THEN 1::numeric ELSE 0::numeric END AS code_vente,
CASE WHEN ETA_DOS2 >= 3 AND DFA_DOS2 IS NOT NULL THEN date_part('year', DFA_DOS2) * 100 + date_part('month', DFA_DOS2) ELSE 209912 END AS mois_vente,
CASE WHEN ETA_DOS2 >= 3 AND DFA_DOS2 IS NOT NULL THEN DFA_DOS2 ELSE '20991231' END AS date_vente,
''::text AS code_cloture,
CASE WHEN p_sejours.ghs_id > 0 THEN 'GHS' ELSE '' END AS particularite_t2a,
COALESCE(t_tiers_payant_0.oid,0) AS tiers_payant_0_id,
COALESCE(t_tiers_payant_1.oid,0) AS tiers_payant_1_id,
COALESCE(t_tiers_payant_2.oid,0) AS tiers_payant_2_id,
0::bigint AS tiers_payant_22_id,
CASE WHEN ETA_DOS2 >= 3 THEN SJ1_DOS2_BG ELSE 0 END AS montant_facture_c,
0::numeric AS montant_facture_h,
0::numeric AS montant_facture_0_c,
0::numeric AS montant_facture_0_h,
CASE WHEN ETA_DOS2 >= 3 THEN SJ1_DOS2_BG ELSE 0 END AS montant_facture_1_c,
0::numeric AS montant_facture_1_h,
0::numeric AS montant_facture_2_c,
0::numeric AS montant_facture_2_h,
0::numeric AS montant_facture_22_c,
0::numeric AS montant_facture_22_h,
0::numeric AS montant_comptabilise_c,
0::numeric AS montant_comptabilise_h,
0::numeric AS montant_comptabilise_0_c,
0::numeric AS montant_comptabilise_0_h,
0::numeric AS montant_comptabilise_1_c,
0::numeric AS montant_comptabilise_1_h,
0::numeric AS montant_comptabilise_2_c,
0::numeric AS montant_comptabilise_2_h,
0::numeric AS montant_comptabilise_22_c,
0::numeric AS montant_comptabilise_22_h,
0::numeric AS montant_regle_c,
0::numeric AS montant_regle_h,
0::numeric AS montant_regle_0_c,
0::numeric AS montant_regle_0_h,
0::numeric AS montant_regle_1_c,
COALESCE(MR1_LHO,0) AS montant_regle_1_h,
0::numeric AS montant_regle_2_c,
0::numeric AS montant_regle_2_h,
0::numeric AS montant_regle_22_c,
0::numeric AS montant_regle_22_h,
'0'::text AS code_expedie_0,
CASE WHEN COALESCE(DB1_DOS2,'00010101')::date > '00010101'::date THEN '1' ELSE '0' END AS code_expedie_1,
'0' AS code_expedie_2,
0::numeric AS code_expedie_22,
CASE WHEN COALESCE(DB1_DOS2,'00010101')::date > '00010101' THEN COALESCE(DB1_DOS2,'00010101') ELSE '00010101'::date END AS date_expedition,
'00010101'::date AS date_expedition_0,
COALESCE(DB1_DOS2,'00010101') AS date_expedition_1,
'00010101'::date AS date_expedition_2,
'00010101'::date AS date_expedition_22,
0::numeric AS no_bordereau_0,
NB1_DOS2 AS no_bordereau_1,
0::numeric AS no_bordereau_2,
0::numeric AS no_bordereau_22,
'20991231'::date AS date_solde,
'20991231'::date AS date_solde_c,
'20991231'::date AS date_solde_h,
'20991231'::date AS date_solde_0_c,
'20991231'::date AS date_solde_0_h,
'20991231'::date AS date_solde_1_c,
'20991231'::date AS date_solde_1_h,
'20991231'::date AS date_solde_2_c,
'20991231'::date AS date_solde_2_h,
'20991231'::date AS date_solde_22_c,
'20991231'::date AS date_solde_22_h,
0::numeric AS montant_encours_c,
0::numeric AS montant_encours_0_c,
0::numeric AS montant_encours_1_c,
0::numeric AS montant_encours_2_c,
0::numeric AS montant_encours_22_c,
0::numeric AS montant_encours_h,
0::numeric AS montant_encours_0_h,
0::numeric AS montant_encours_1_h,
0::numeric AS montant_encours_2_h,
0::numeric AS montant_encours_22_h,
'20991231'::date AS date_solde_reference,
'20991231'::date AS date_solde_reference_c,
'20991231'::date AS date_solde_reference_h,
'20991231'::date AS date_solde_reference_0_c,
'20991231'::date AS date_solde_reference_1_c,
'20991231'::date AS date_solde_reference_2_c,
'20991231'::date AS date_solde_reference_22_c,
'20991231'::date AS date_solde_reference_0_h,
'20991231'::date AS date_solde_reference_1_h,
'20991231'::date AS date_solde_reference_2_h,
'20991231'::date AS date_solde_reference_22_h,
0::numeric AS delai_facture,
0::numeric AS delai_solde,
0::numeric AS delai_expedition,
0::numeric AS delai_expedition_0,
0::numeric AS delai_expedition_1,
0::numeric AS delai_expedition_2,
0::numeric AS delai_expedition_22,
0::numeric AS delai_solde_0_c,
0::numeric AS delai_solde_0_h,
0::numeric AS delai_solde_1_c,
0::numeric AS delai_solde_1_h,
0::numeric AS delai_solde_2_c,
0::numeric AS delai_solde_2_h,
0::numeric AS delai_solde_22_c,
0::numeric AS delai_solde_22_h,
'20991231'::date AS date_encours,
0::numeric AS montant_facture_c_actes_inclus_dans_sejour,
0::numeric AS montant_facture_h_actes_inclus_dans_sejour,
SJ1_DOS2_BG AS montant_comptabilise_budget_global_c
FROM prod_sigems.DOS2
JOIN w_DOSSIER ON ANN_DOS2 = ANN_DOS AND COD_DOS2 = COD_DOS
JOIN w_DOSSIER_SELECT w_DOSSIER_SELECT ON ANN_DOS2 = ANN_SELECT AND COD_DOS2 = COD_SELECT
JOIN activite[PX].p_sejours ON SEJ_DOS = p_sejours.code_original AND p_sejours.etat = ''
JOIN w_DOS2_BG ON ANN_DOS2 = ANN_DOS2_BG AND COD_DOS2 = COD_DOS2_BG AND IND_DOS2 = IND_DOS2_BG
LEFT JOIN w_LIG_CLINI_tmrx ON ANN_DOS2 = ANN_LCL AND COD_DOS2 = COD_LCL AND IND_DOS2 = IND_LCL
LEFT JOIN w_LIG_HONOR_tmrx ON ANN_DOS2 = ANN_LHO AND COD_DOS2 = COD_LHO AND IND_DOS2 = IND_LHO
LEFT JOIN activite[PX].t_tiers_payant t_tiers_payant_0 ON 'PATIENT' = t_tiers_payant_0.code_original
LEFT JOIN activite[PX].t_tiers_payant t_tiers_payant_1 ON t_tiers_payant_1.type_tiers_payant = 1 AND DOS2.CP1_DOS2 = split_part(t_tiers_payant_1.code_original,'(1)',1)
LEFT JOIN activite[PX].t_tiers_payant t_tiers_payant_2 ON t_tiers_payant_2.type_tiers_payant = 2 AND DOS2.CA2_DOS2 = split_part(t_tiers_payant_2.code_original,'(2)',1)
WHERE ETA_DOS2 >= 3;
ALTER TABLE w_factures ADD CONSTRAINT w_factures_pkey PRIMARY KEY(no_facture);
CREATE INDEX w_factures_i1
ON w_factures
USING btree
(no_sejour);
CREATE INDEX w_factures_i2
ON w_factures
USING btree
(no_facture_reference);
DROP TABLE IF EXISTS w_factures_od_avoir;
CREATE TEMP TABLE w_factures_od_avoir AS
SELECT
oid AS facture_od_avoir_id,
no_facture AS no_facture_od_avoir,
''::text AS no_facture,
0::bigint AS facture_id,
no_sejour,
IND_DOS2,
montant_facture_c,
montant_facture_0_c,
montant_facture_1_c,
montant_facture_2_c,
montant_facture_22_c,
montant_facture_h,
montant_facture_0_h,
montant_facture_1_h,
montant_facture_2_h,
montant_facture_22_h
FROM w_factures
WHERE type_facture = '1';
ALTER TABLE w_factures_od_avoir ADD CONSTRAINT w_factures_od_avoir_od_pkey PRIMARY KEY(no_facture_od_avoir);
CREATE INDEX w_factures_od_avoir_i1
ON w_factures_od_avoir
USING btree
(no_sejour);
UPDATE w_factures_od_avoir SET no_facture = w_factures.no_facture, facture_id = w_factures.oid
FROM w_factures
WHERE
w_factures_od_avoir.no_sejour = w_factures.no_sejour AND w_factures_od_avoir.IND_DOS2 = w_factures.IND_DOS2 + 1 AND
w_factures_od_avoir.montant_facture_c = 0 - w_factures.montant_facture_c AND
w_factures_od_avoir.montant_facture_0_c = 0 - w_factures.montant_facture_0_c AND
w_factures_od_avoir.montant_facture_1_c = 0 - w_factures.montant_facture_1_c AND
w_factures_od_avoir.montant_facture_2_c = 0 - w_factures.montant_facture_2_c AND
w_factures_od_avoir.montant_facture_22_c = 0 - w_factures.montant_facture_22_c AND
w_factures_od_avoir.montant_facture_h = 0 - w_factures.montant_facture_h AND
w_factures_od_avoir.montant_facture_0_h = 0 - w_factures.montant_facture_0_h AND
w_factures_od_avoir.montant_facture_1_h = 0 - w_factures.montant_facture_1_h AND
w_factures_od_avoir.montant_facture_2_h = 0 - w_factures.montant_facture_2_h AND
w_factures_od_avoir.montant_facture_22_h = 0 - w_factures.montant_facture_22_h;
UPDATE w_factures SET
type_facture = 'X' ,
no_facture_od_avoir = w_factures_od_avoir.no_facture_od_avoir,
facture_od_avoir_id = w_factures_od_avoir.facture_od_avoir_id
FROM w_factures_od_avoir
WHERE w_factures.no_facture = w_factures_od_avoir.no_facture AND w_factures_od_avoir.no_facture <> '' AND w_factures_od_avoir.no_facture_od_avoir <> '';
UPDATE w_factures SET
no_facture_od_avoir = w_factures_od_avoir.no_facture,
facture_od_avoir_id = w_factures_od_avoir.facture_id
FROM w_factures_od_avoir
WHERE w_factures.no_facture = w_factures_od_avoir.no_facture_od_avoir AND w_factures_od_avoir.no_facture <> '' AND w_factures_od_avoir.no_facture_od_avoir <> '';
DROP TABLE IF EXISTS w_factures_references;
CREATE TEMP TABLE w_factures_references AS
SELECT no_sejour, COALESCE(MIN(CASE WHEN type_facture NOT IN ('X', '1') THEN no_facture ELSE NULL END), MIN(no_facture)) AS no_facture_reference
FROM w_factures
GROUP BY 1;
UPDATE w_factures SET
no_facture_reference = w_factures_references.no_facture_reference,
facture_reference_id = 0
FROM w_factures_references
WHERE w_factures.no_sejour = w_factures_references.no_sejour AND
w_factures.no_facture_reference <> w_factures_references.no_facture_reference;
DROP TABLE IF EXISTS w_factures_references_soldes;
CREATE TEMP TABLE w_factures_references_soldes AS
SELECT
no_facture_reference,
MAX(date_solde) AS date_solde_reference,
MAX(date_solde_c) AS date_solde_reference_c,
MAX(date_solde_h) AS date_solde_reference_h,
MAX(date_solde_0_c) AS date_solde_reference_0_c,
MAX(date_solde_0_h) AS date_solde_reference_0_h,
MAX(date_solde_1_c) AS date_solde_reference_1_c,
MAX(date_solde_1_h) AS date_solde_reference_1_h,
MAX(date_solde_2_c) AS date_solde_reference_2_c,
MAX(date_solde_2_h) AS date_solde_reference_2_h,
MAX(date_solde_22_c) AS date_solde_reference_22_c,
MAX(date_solde_22_h) AS date_solde_reference_22_h
FROM w_factures
GROUP BY no_facture_reference;
ALTER TABLE w_factures_references_soldes ADD CONSTRAINT w_factures_references_soldes_pkey PRIMARY KEY(no_facture_reference);
SELECT base.cti_disable_index('activite[PX]', 'i_factures_3');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_4');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_5');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_6');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_7');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_8');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_9');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_10');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_11');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_12');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_13');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_14');
INSERT INTO activite[PX].p_factures (
oid,
sejour_id,
no_sejour,
no_facture,
no_facture_reference,
facture_reference_id,
no_facture_od_avoir,
facture_od_avoir_id,
date_debut,
date_fin,
ghs_id,
ghs_bebe1_id,
ghs_bebe2_id,
ghs_bebe3_id,
code_cp_demandee,
type_facture,
nb_rejets,
code_facture,
date_facture,
code_vente,
mois_vente,
date_vente,
code_cloture,
particularite_t2a,
tiers_payant_0_id,
tiers_payant_1_id,
tiers_payant_2_id,
tiers_payant_22_id,
montant_facture_c,
montant_facture_h,
montant_facture_0_c,
montant_facture_0_h,
montant_facture_1_c,
montant_facture_1_h,
montant_facture_2_c,
montant_facture_2_h,
montant_facture_22_c,
montant_facture_22_h,
montant_comptabilise_c,
montant_comptabilise_h,
montant_comptabilise_0_c,
montant_comptabilise_0_h,
montant_comptabilise_1_c,
montant_comptabilise_1_h,
montant_comptabilise_2_c,
montant_comptabilise_2_h,
montant_comptabilise_22_c,
montant_comptabilise_22_h,
montant_regle_c,
montant_regle_h,
montant_regle_0_c,
montant_regle_0_h,
montant_regle_1_c,
montant_regle_1_h,
montant_regle_2_c,
montant_regle_2_h,
montant_regle_22_c,
montant_regle_22_h,
code_expedie_0,
code_expedie_1,
code_expedie_2,
code_expedie_22,
date_expedition,
date_expedition_0,
date_expedition_1,
date_expedition_2,
date_expedition_22,
no_bordereau_0,
no_bordereau_1,
no_bordereau_2,
no_bordereau_22,
date_solde,
date_solde_c,
date_solde_h,
date_solde_0_c,
date_solde_0_h,
date_solde_1_c,
date_solde_1_h,
date_solde_2_c,
date_solde_2_h,
date_solde_22_c,
date_solde_22_h,
montant_encours_c,
montant_encours_0_c,
montant_encours_1_c,
montant_encours_2_c,
montant_encours_22_c,
montant_encours_h,
montant_encours_0_h,
montant_encours_1_h,
montant_encours_2_h,
montant_encours_22_h,
date_solde_reference,
date_solde_reference_c,
date_solde_reference_h,
date_solde_reference_0_c,
date_solde_reference_1_c,
date_solde_reference_2_c,
date_solde_reference_22_c,
date_solde_reference_0_h,
date_solde_reference_1_h,
date_solde_reference_2_h,
date_solde_reference_22_h,
delai_facture,
delai_solde,
delai_expedition,
delai_expedition_0,
delai_expedition_1,
delai_expedition_2,
delai_expedition_22,
delai_solde_0_c,
delai_solde_0_h,
delai_solde_1_c,
delai_solde_1_h,
delai_solde_2_c,
delai_solde_2_h,
delai_solde_22_c,
delai_solde_22_h,
date_encours,
montant_facture_c_actes_inclus_dans_sejour,
montant_facture_h_actes_inclus_dans_sejour,
montant_comptabilise_budget_global_c
)
SELECT
oid,
sejour_id,
no_sejour,
no_facture,
w_factures.no_facture_reference,
facture_reference_id,
no_facture_od_avoir,
facture_od_avoir_id,
date_debut,
date_fin,
ghs_id,
ghs_bebe1_id,
ghs_bebe2_id,
ghs_bebe3_id,
code_cp_demandee,
type_facture,
nb_rejets,
code_facture,
date_facture,
code_vente,
mois_vente,
date_vente,
code_cloture,
particularite_t2a,
tiers_payant_0_id,
tiers_payant_1_id,
tiers_payant_2_id,
tiers_payant_22_id,
montant_facture_c,
montant_facture_h,
montant_facture_0_c,
montant_facture_0_h,
montant_facture_1_c,
montant_facture_1_h,
montant_facture_2_c,
montant_facture_2_h,
montant_facture_22_c,
montant_facture_22_h,
montant_comptabilise_c,
montant_comptabilise_h,
montant_comptabilise_0_c,
montant_comptabilise_0_h,
montant_comptabilise_1_c,
montant_comptabilise_1_h,
montant_comptabilise_2_c,
montant_comptabilise_2_h,
montant_comptabilise_22_c,
montant_comptabilise_22_h,
montant_regle_c,
montant_regle_h,
montant_regle_0_c,
montant_regle_0_h,
montant_regle_1_c,
montant_regle_1_h,
montant_regle_2_c,
montant_regle_2_h,
montant_regle_22_c,
montant_regle_22_h,
code_expedie_0,
code_expedie_1,
code_expedie_2,
code_expedie_22,
CASE WHEN date_expedition <> '00010101' THEN date_expedition ELSE '20991231' END,
CASE WHEN date_expedition_0 <> '00010101' THEN date_expedition_0 ELSE '20991231' END,
CASE WHEN date_expedition_1 <> '00010101' THEN date_expedition_1 ELSE '20991231' END,
CASE WHEN date_expedition_2 <> '00010101' THEN date_expedition_2 ELSE '20991231' END,
CASE WHEN date_expedition_22 <> '00010101' THEN date_expedition_22 ELSE '20991231' END,
no_bordereau_0,
no_bordereau_1,
no_bordereau_2,
no_bordereau_22,
CASE WHEN date_solde <> '00010101' THEN date_solde ELSE '20991231' END,
CASE WHEN date_solde_c <> '00010101' THEN date_solde_c ELSE '20991231' END,
CASE WHEN date_solde_h <> '00010101' THEN date_solde_h ELSE '20991231' END,
CASE WHEN date_solde_0_c <> '00010101' THEN date_solde_0_c ELSE '20991231' END,
CASE WHEN date_solde_0_h <> '00010101' THEN date_solde_0_h ELSE '20991231' END,
CASE WHEN date_solde_1_c <> '00010101' THEN date_solde_1_c ELSE '20991231' END,
CASE WHEN date_solde_1_h <> '00010101' THEN date_solde_1_h ELSE '20991231' END,
CASE WHEN date_solde_2_c <> '00010101' THEN date_solde_2_c ELSE '20991231' END,
CASE WHEN date_solde_2_h <> '00010101' THEN date_solde_2_h ELSE '20991231' END,
CASE WHEN date_solde_22_c <> '00010101' THEN date_solde_22_c ELSE '20991231' END,
CASE WHEN date_solde_22_h <> '00010101' THEN date_solde_22_h ELSE '20991231' END,
montant_encours_c,
montant_encours_0_c,
montant_encours_1_c,
montant_encours_2_c,
montant_encours_22_c,
montant_encours_h,
montant_encours_0_h,
montant_encours_1_h,
montant_encours_2_h,
montant_encours_22_h,
CASE WHEN w_factures_references_soldes.date_solde_reference <> '00010101' THEN w_factures_references_soldes.date_solde_reference ELSE '20991231' END,
CASE WHEN w_factures_references_soldes.date_solde_reference_c <> '00010101' THEN w_factures_references_soldes.date_solde_reference_c ELSE '20991231' END,
CASE WHEN w_factures_references_soldes.date_solde_reference_h <> '00010101' THEN w_factures_references_soldes.date_solde_reference_h ELSE '20991231' END,
CASE WHEN w_factures_references_soldes.date_solde_reference_0_c <> '00010101' THEN w_factures_references_soldes.date_solde_reference_0_c ELSE '20991231' END,
CASE WHEN w_factures_references_soldes.date_solde_reference_1_c <> '00010101' THEN w_factures_references_soldes.date_solde_reference_1_c ELSE '20991231' END,
CASE WHEN w_factures_references_soldes.date_solde_reference_2_c <> '00010101' THEN w_factures_references_soldes.date_solde_reference_2_c ELSE '20991231' END,
CASE WHEN w_factures_references_soldes.date_solde_reference_22_c <> '00010101' THEN w_factures_references_soldes.date_solde_reference_22_c ELSE '20991231' END,
CASE WHEN w_factures_references_soldes.date_solde_reference_0_h <> '00010101' THEN w_factures_references_soldes.date_solde_reference_0_h ELSE '20991231' END,
CASE WHEN w_factures_references_soldes.date_solde_reference_1_h <> '00010101' THEN w_factures_references_soldes.date_solde_reference_1_h ELSE '20991231' END,
CASE WHEN w_factures_references_soldes.date_solde_reference_2_h <> '00010101' THEN w_factures_references_soldes.date_solde_reference_2_h ELSE '20991231' END,
CASE WHEN w_factures_references_soldes.date_solde_reference_22_h <> '00010101' THEN w_factures_references_soldes.date_solde_reference_22_h ELSE '20991231' END,
delai_facture,
delai_solde,
delai_expedition,
delai_expedition_0,
delai_expedition_1,
delai_expedition_2,
delai_expedition_22,
delai_solde_0_c,
delai_solde_0_h,
delai_solde_1_c,
delai_solde_1_h,
delai_solde_2_c,
delai_solde_2_h,
delai_solde_22_c,
delai_solde_22_h,
date_encours,
montant_facture_c_actes_inclus_dans_sejour,
montant_facture_h_actes_inclus_dans_sejour,
montant_comptabilise_budget_global_c
FROM w_factures
JOIN w_factures_references_soldes ON w_factures.no_facture_reference = w_factures_references_soldes.no_facture_reference
WHERE oid NOT IN (SELECT oid FROM activite[PX].p_factures);
SELECT base.cti_enable_index('activite[PX]', 'i_factures_3');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_4');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_5');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_6');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_7');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_8');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_9');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_10');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_11');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_12');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_13');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_14');
UPDATE activite[PX].p_sejours
SET tiers_payant_2_id = subview.tiers_payant_2_id
FROM
(
SELECT p_sejours.no_sejour,
p_sejours.tiers_payant_1_id,
t_tiers_payant_2.oid AS tiers_payant_2_id
FROM activite[PX].p_sejours
JOIN activite[PX].t_tiers_payant ON p_sejours.tiers_payant_1_id = t_tiers_payant.oid
JOIN activite[PX].t_tiers_payant t_tiers_payant_2 ON t_tiers_payant_2.code_original = (t_tiers_payant.code_original || '(2)')
WHERE est_budget_global = '1' AND
p_sejours.tiers_payant_1_id = p_sejours.tiers_payant_2_id AND
p_sejours.tiers_payant_1_id <> 0
GROUP BY 1,2,3
) subview
WHERE p_sejours.no_sejour = subview.no_sejour;
INSERT INTO activite[PX].t_tiers_payant(code_original, code, type_tiers_payant, texte, texte_court)
SELECT t_tiers_payant.code_original || '(2)',
t_tiers_payant.code,
'2'::text,
t_tiers_payant.texte || ' (AMC)',
t_tiers_payant.texte_court || ' (AMC)'
FROM activite[PX].p_factures
JOIN activite[PX].p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
JOIN activite[PX].t_tiers_payant ON p_factures.tiers_payant_1_id = t_tiers_payant.oid
LEFT JOIN activite[PX].t_tiers_payant t_tiers_payant_2 ON t_tiers_payant_2.code_original = (t_tiers_payant.code_original || '(2)')
WHERE est_budget_global = '1' AND
p_factures.tiers_payant_1_id = p_factures.tiers_payant_2_id AND
p_factures.tiers_payant_1_id <> 0 AND
t_tiers_payant_2.oid IS NULL
GROUP BY 1,2,3,4,5;
UPDATE activite[PX].p_factures
SET tiers_payant_2_id = subview.tiers_payant_2_id
FROM
(
SELECT p_factures.no_facture,
p_factures.tiers_payant_1_id,
t_tiers_payant_2.oid AS tiers_payant_2_id
FROM activite[PX].p_factures
JOIN activite[PX].p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
JOIN activite[PX].t_tiers_payant ON p_factures.tiers_payant_1_id = t_tiers_payant.oid
JOIN activite[PX].t_tiers_payant t_tiers_payant_2 ON t_tiers_payant_2.code_original = (t_tiers_payant.code_original || '(2)')
WHERE est_budget_global = '1' AND
p_factures.tiers_payant_1_id = p_factures.tiers_payant_2_id AND
p_factures.tiers_payant_1_id <> 0
GROUP BY 1,2,3
) subview
WHERE p_factures.no_facture = subview.no_facture;
-- Séjours sans facture
DROP TABLE IF EXISTS w_factures_trous;
CREATE TEMP TABLE w_factures_trous AS
SELECT
p_sejours.finess,
p_sejours.no_sejour,
p_sejours.type_sejour,
p_sejours.date_entree,
p_sejours.tiers_payant_0_id,
p_sejours.tiers_payant_1_id,
p_sejours.tiers_payant_2_id,
p_sejours.tiers_payant_22_id,
p_sejours.code_cp_demandee,
COALESCE(t_services_facturation.avec_facturation_intermediaire,'') AS avec_facturation_intermediaire,
p_sejours.code_sorti,
CASE WHEN code_sorti = '1' THEN date_sortie ELSE date(now()) END AS date_sortie,
MAX(CASE WHEN p_factures.date_fin IS NULL THEN date_sortie ELSE p_factures.date_fin END) AS date_fin_facture_0,
MAX(CASE WHEN p_factures.date_fin IS NOT NULL AND (date_sortie - date_entree < 30 OR p_sejours.type_sejour <> '1') AND t_services_facturation.avec_facturation_intermediaire IS DISTINCT FROM '1' THEN date_sortie ELSE p_factures.date_fin END) AS date_fin_facture,
date(MAX(COALESCE(CASE WHEN p_factures.date_fin IS NOT NULL AND (date_sortie - date_entree < 30 OR p_sejours.type_sejour <> '1') AND t_services_facturation.avec_facturation_intermediaire IS DISTINCT FROM '1' THEN date_sortie ELSE p_factures.date_fin END + interval '1 day', p_sejours.date_entree))) AS date_debut_encours,
CASE WHEN code_sorti = '1' THEN date_sortie ELSE date(now()) END AS date_fin_encours
FROM activite[PX].p_sejours
LEFT JOIN activite[PX].p_factures ON p_sejours.no_sejour = p_factures.no_sejour AND no_facture NOT LIKE 'E%'
JOIN activite[PX].t_lieux ON lieu_sortie_id = t_lieux.oid
JOIN activite[PX].t_services_facturation ON t_lieux.service_facturation_id = t_services_facturation.oid
WHERE p_sejours.etat = '' AND p_sejours.est_sans_facturation IS DISTINCT FROM '1' AND date_entree <= now() AND p_sejours.type_sejour <> '6' AND p_sejours.type_sejour <> '9' AND code_prevu <> 1
GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12;
-- Spécial séances avec facturation multiple
UPDATE w_factures_trous
SET date_fin_facture = date_fin_facture_0,
date_debut_encours = date(date_fin_facture_0+interval '1 day')
WHERE no_sejour IN
(
SELECT no_sejour
FROM prod_sigems.LIG_CLINI
JOIN w_factures_trous ON ANN_LCL || to_char(COD_LCL,'FM900000') = no_sejour AND w_factures_trous.type_sejour = '5'
WHERE PRO_LCL <> 'ACPT' AND PRO_LCL <> 'ECAC' AND PRO_LCL <> 'REGC' AND IND_LCL = 0 AND date(dde_lcl) > date_fin_facture_0
)
;
INSERT INTO activite[PX].p_factures(
finess,
no_sejour,
no_facture,
no_facture_reference,
type_facture,
code_facture,
date_facture,
tiers_payant_0_id, tiers_payant_1_id, tiers_payant_2_id, tiers_payant_22_id,
code_cp_demandee,
date_debut,
date_fin)
SELECT finess,
no_sejour,
no_sejour || '.00' || CASE WHEN avec_facturation_intermediaire = '1' THEN '_' || p_calendrier.mois ELSE '' END,
no_sejour || '.00' || CASE WHEN avec_facturation_intermediaire = '1' THEN '_' || p_calendrier.mois ELSE '' END,
'E',
'0',
'20991231'::date,
tiers_payant_0_id, tiers_payant_1_id, tiers_payant_2_id, tiers_payant_22_id,
code_cp_demandee ,
MIN(GREATEST(date_debut_encours, p_calendrier.date)),
MAX(LEAST(date_fin_encours, p_calendrier.date))
FROM w_factures_trous
JOIN base.p_calendrier ON p_calendrier.date BETWEEN date_debut_encours AND date_fin_encours
WHERE (date_debut_encours <= date_fin_encours or date_fin_facture is null)
GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12;
INSERT INTO activite[PX].p_factures(
finess,
no_sejour,
no_facture,
no_facture_reference,
date_debut,
date_fin,
type_facture,
code_facture,
date_facture,
tiers_payant_0_id,
tiers_payant_1_id,
tiers_payant_2_id,
tiers_payant_22_id,
ghs_id)
SELECT finess,
ANN_LCL || to_char(COD_LCL,'FM900000'),
ANN_LCL || to_char(COD_LCL,'FM900000') || '.00',
ANN_LCL || to_char(COD_LCL,'FM900000') || '.00',
date_entree,
date_sortie,
'0',
'0',
'20991231'::date,
tiers_payant_0_id,
tiers_payant_1_id,
tiers_payant_2_id,
tiers_payant_22_id,
ghs_id
FROM prod_sigems.LIG_CLINI
JOIN w_DOSSIER_SELECT w_DOSSIER_SELECT ON ANN_LCL = ANN_SELECT AND COD_LCL = COD_SELECT
JOIN activite[PX].p_sejours ON ANN_LCL || to_char(COD_LCL,'FM900000') = no_sejour AND p_sejours.etat = ''
WHERE PRO_LCL <> 'ACPT' AND PRO_LCL <> 'ECAC' AND
ANN_LCL || to_char(COD_LCL,'FM900000') || '.' || to_char(IND_LCL,'FM9999900') NOT IN (SELECT no_facture FROM activite[PX].p_factures) AND
ANN_LCL || to_char(COD_LCL,'FM900000') NOT IN (SELECT no_sejour FROM activite[PX].p_factures) AND
SER_LCL <> '*CDL'
GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14;
INSERT INTO activite[PX].p_factures(
finess,
sejour_id,
no_sejour,
no_facture,
no_facture_reference,
date_debut,
date_fin,
type_facture,
code_facture,
date_facture,
tiers_payant_0_id,
tiers_payant_1_id,
tiers_payant_2_id,
tiers_payant_22_id,
ghs_id)
SELECT finess,
p_sejours.oid,
ANN_LHO || to_char(COD_LHO,'FM900000'),
ANN_LHO || to_char(COD_LHO,'FM900000') || '.00',
ANN_LHO || to_char(COD_LHO,'FM900000') || '.00',
date_entree,
date_sortie,
'0',
'0',
'20991231'::date,
tiers_payant_0_id,
tiers_payant_1_id,
tiers_payant_2_id,
tiers_payant_22_id,
ghs_id
FROM prod_sigems.LIG_HONOR
JOIN w_DOSSIER_SELECT w_DOSSIER_SELECT ON ANN_LHO = ANN_SELECT AND COD_LHO = COD_SELECT
JOIN activite[PX].p_sejours ON ANN_LHO || to_char(COD_LHO,'FM900000') = no_sejour AND p_sejours.etat = ''
WHERE CPH_LHO <> 'ACPT' AND CPH_LHO <> 'ECAH' AND CPH_LHO <> 'REGH' AND
ANN_LHO || to_char(COD_LHO,'FM900000') || '.' || to_char(IND_LHO,'FM9999900') NOT IN (SELECT no_facture FROM activite[PX].p_factures) AND
ANN_LHO || to_char(COD_LHO,'FM900000') NOT IN (SELECT no_sejour FROM activite[PX].p_factures) AND
SER_LHO <> '*CDL'
GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15;
UPDATE activite[PX].p_factures SET
date_debut = date_entree,
date_fin = CASE WHEN code_sorti = '1' THEN date_sortie ELSE date_fin END
FROM activite[PX].p_sejours
JOIN activite[PX].t_lieux ON lieu_sortie_id = t_lieux.oid
JOIN activite[PX].t_services_facturation ON t_lieux.service_facturation_id = t_services_facturation.oid AND
avec_facturation_intermediaire IS DISTINCT FROM '1'
WHERE p_factures.no_sejour = p_sejours.no_sejour AND
CASE WHEN code_sorti = '1' THEN date_sortie ELSE date(now()) END - date_entree < 30 AND
(
p_factures.date_debut <> date_entree OR
p_factures.date_fin <> CASE WHEN code_sorti = '1' THEN date_sortie ELSE date_fin END
);
UPDATE activite[PX].p_factures
SET facture_od_avoir_id = p_factures_od_avoir.oid
FROM activite[PX].p_factures p_factures_od_avoir
WHERE p_factures.no_facture_od_avoir = p_factures_od_avoir.no_facture
AND p_factures.facture_od_avoir_id <> p_factures_od_avoir.oid;
-- premiere facture initiale (cas des annulations
UPDATE activite[PX].p_factures
SET type_facture = '0' WHERE no_facture IN
(
SELECT no_facture_0 FROM
(
SELECT no_sejour, MAX(no_facture_reference) AS no_facture_0
FROM activite[PX].p_factures
GROUP BY 1
HAVING SUM(CASE WHEN type_facture = '0' THEN 1 ELSE 0 END) = 0 AND MAX(no_facture_reference) IS NOT NULL
) subview
);
-- Répartition montants comptabilisés tp2 sur tp1 quand tp1 = tp2
UPDATE activite[PX].p_factures SET
montant_comptabilise_1_c = montant_comptabilise_1_c + montant_comptabilise_2_c,
montant_comptabilise_1_h = montant_comptabilise_1_h + montant_comptabilise_2_h,
montant_regle_1_c = montant_regle_1_c + montant_regle_2_c,
montant_regle_1_h = montant_regle_1_h + montant_regle_2_h,
montant_comptabilise_2_c = 0,
montant_comptabilise_2_h = 0,
montant_regle_2_c = 0,
montant_regle_2_h = 0
WHERE tiers_payant_1_id = tiers_payant_2_id AND tiers_payant_1_id <> 0 AND
(montant_comptabilise_2_c <> 0 OR montant_comptabilise_2_h <> 0 OR montant_regle_2_c <> 0 OR montant_regle_2_h <> 0);
]]></sqlcmd>
</NODE>
<NODE label="Lignes non facturées Clinique">
<sqlcmd><![CDATA[
INSERT INTO activite[PX].p_factures_lignes_non_facturees_c(
facture_id,
no_facture,
date_debut,
date_fin,
nb_rubrique,
coefficient,
rubrique_facturation_id,
prestation_id,
prix_unitaire,
lieu_id,
ucd_id,
lpp_id)
SELECT
p_factures.oid AS facture_id,
p_factures.no_facture AS no_facture,
CASE
WHEN split_part(p_factures.no_facture,'_',2) = '' THEN date(DDE_LCL)
WHEN QTE_LCL = 1 THEN date(DDE_LCL)
WHEN date(DDE_LCL) = date(COALESCE(DFI_LCL,DDE_LCL)) THEN date(DDE_LCL)
ELSE GREATEST(p_factures.date_debut, date(DDE_LCL))
END AS date_debut,
CASE
WHEN split_part(p_factures.no_facture,'_',2) = '' THEN date(COALESCE(DFI_LCL,DDE_LCL))
WHEN QTE_LCL = 1 THEN date(COALESCE(DFI_LCL,DDE_LCL))
WHEN date(DDE_LCL) = date(COALESCE(DFI_LCL,DDE_LCL)) THEN date(COALESCE(DFI_LCL,DDE_LCL))
ELSE LEAST(p_factures.date_fin, date(COALESCE(DFI_LCL,DDE_LCL)))
END AS date_fin,
CASE
WHEN split_part(p_factures.no_facture,'_',2) = '' THEN QTE_LCL
WHEN QTE_LCL = 1 THEN QTE_LCL
WHEN date(DDE_LCL) = date(COALESCE(DFI_LCL,DDE_LCL)) THEN QTE_LCL
ELSE LEAST(p_factures.date_fin, date(COALESCE(DFI_LCL,DDE_LCL))) - GREATEST(p_factures.date_debut, date(DDE_LCL)) + 1
END AS nb_rubrique,
CASE WHEN COG_LCL <> 0 THEN COG_LCL ELSE 1 END AS coefficient,
w_LIG_CLINI_keys.rubrique_facturation_id AS rubrique_facturation_id,
w_LIG_CLINI_keys.prestation_id AS prestation_id,
CASE
WHEN w_LIG_CLINI.PRO_LCL = 'PJ' AND QTE_LCL <> 0 AND (ML1_LCL+ML2_LCL+ML3_LCL) <> 0 THEN (ML1_LCL+ML2_LCL+ML3_LCL)/QTE_LCL
WHEN TAR_LCL <> 0 AND QTE_LCL <> 0 THEN TAR_LCL/QTE_LCL
WHEN PUN_LCL <> 0 THEN PUN_LCL
WHEN QTE_LCL <> 0 AND (ML1_LCL+ML2_LCL+ML3_LCL) <> 0 THEN (ML1_LCL+ML2_LCL+ML3_LCL)/QTE_LCL
ELSE PUN_LCL
END AS prix_unitaire,
p_sejours.lieu_sortie_id AS lieu_id,
w_LIG_CLINI.ucd_id,
w_LIG_CLINI.lpp_id
FROM w_LIG_CLINI
JOIN activite[PX].p_factures ON w_LIG_CLINI.no_facture = split_part(p_factures.no_facture,'_',1) AND
(
DDE_LCL BETWEEN p_factures.date_debut AND p_factures.date_fin OR
DFI_LCL BETWEEN p_factures.date_debut AND p_factures.date_fin
)
JOIN activite[PX].p_sejours ON w_LIG_CLINI.SEJ_DOS = p_sejours.code_original AND p_sejours.etat = ''
JOIN w_LIG_CLINI_keys ON w_LIG_CLINI.key = w_LIG_CLINI_keys.key
WHERE p_factures.code_facture <> '1' AND w_LIG_CLINI.PRO_LCL <> 'ACPT'
;
-- Prestations spéciale I01 provenant du PMSI
INSERT INTO activite[PX].p_factures_lignes_non_facturees_c(
facture_id,
no_facture,
date_debut,
date_fin,
nb_rubrique,
coefficient,
coefficient_mco,
rubrique_facturation_id,
prestation_id,
prix_unitaire,
lieu_id)
SELECT
p_factures.oid AS facture_id,
p_factures.no_facture AS no_facture,
p_factures.date_debut AS date_debut,
p_factures.date_debut AS date_fin,
1::numeric AS nb_rubrique,
1::numeric AS coefficient,
0.9935::numeric AS coefficient_mco,
COALESCE(t_rubriques_facturation.oid,0) AS rubrique_facturation_id,
COALESCE(t_prestations.oid,0) AS prestation_id,
6047::numeric AS prix_unitaire,
p_sejours.lieu_sortie_id AS lieu_id
FROM prod_sigems.GHS_VALORISE
JOIN activite[PX].p_factures ON JOINTURE = p_factures.no_sejour
JOIN activite[PX].p_sejours ON JOINTURE = p_sejours.code_original AND p_sejours.etat = ''
JOIN activite[PX].t_rubriques_facturation ON t_rubriques_facturation.code_original = 'I01'
JOIN activite.t_prestations ON t_prestations.code = 'I01'
WHERE p_factures.code_facture <> '1' AND GHS_VALORISE.GHS = 'I01'
;
-- Suppression de lignes en double (cas d'un dossier de tronquiere en SSR)
DELETE FROM activite[PX].p_factures_lignes_non_facturees_c
USING activite[PX].p_factures
JOIN activite[PX].p_sejours ON p_sejours.no_sejour = p_factures.no_sejour AND p_factures.date_debut > p_sejours.date_entree
WHERE p_factures_lignes_non_facturees_c.no_facture = p_factures.no_facture AND
p_factures_lignes_non_facturees_c.date_debut NOT BETWEEN p_factures.date_debut AND p_factures.date_fin
;
DROP TABLE IF EXISTS w_LIG_CLINI_tmrx;
CREATE TEMP TABLE w_LIG_CLINI_tmrx AS
SELECT no_facture,
SUM(MR1_LCL) AS MR1_LCL,
SUM(MR2_LCL) AS MR2_LCL,
SUM(MR3_LCL) AS MR3_LCL
FROM w_LIG_CLINI
LEFT JOIN prod_sigems.DOS2_LIEN_AVOIR DOS2_LIEN_AVOIR_F ON
DOS2_LIEN_AVOIR_F.ANN = ANN_LCL AND
DOS2_LIEN_AVOIR_F.COD = COD_LCL AND
DOS2_LIEN_AVOIR_F.IND = IND_LCL
LEFT JOIN prod_sigems.DOS2_LIEN_AVOIR DOS2_LIEN_AVOIR_A ON
DOS2_LIEN_AVOIR_A.ANN = ANN_LCL AND
DOS2_LIEN_AVOIR_A.COD = COD_LCL AND
DOS2_LIEN_AVOIR_A.IND_AVOIR = IND_LCL
WHERE PRO_LCL <> 'ECAC' AND
DOS2_LIEN_AVOIR_F.COD IS NULL AND
DOS2_LIEN_AVOIR_A.COD IS NULL
GROUP BY 1;
CREATE INDEX w_LIG_CLINI_tmrx_i1
ON w_LIG_CLINI_tmrx
USING btree
(no_facture);
UPDATE activite[PX].p_factures SET
montant_regle_c = w_LIG_CLINI_tmrx.MR1_LCL + w_LIG_CLINI_tmrx.MR2_LCL + w_LIG_CLINI_tmrx.MR3_LCL,
montant_regle_1_c = w_LIG_CLINI_tmrx.MR1_LCL + CASE WHEN tiers_payant_1_id = tiers_payant_2_id AND tiers_payant_1_id <> 0 THEN w_LIG_CLINI_tmrx.MR2_LCL ELSE 0 END,
montant_regle_2_c = CASE WHEN tiers_payant_1_id <> tiers_payant_2_id THEN w_LIG_CLINI_tmrx.MR2_LCL ELSE 0 END,
montant_regle_0_c = w_LIG_CLINI_tmrx.MR3_LCL
FROM w_LIG_CLINI_tmrx
WHERE p_factures.no_facture = w_LIG_CLINI_tmrx.no_facture AND
(
montant_regle_c <> w_LIG_CLINI_tmrx.MR1_LCL + w_LIG_CLINI_tmrx.MR2_LCL + w_LIG_CLINI_tmrx.MR3_LCL OR
montant_regle_1_c <> (w_LIG_CLINI_tmrx.MR1_LCL + CASE WHEN tiers_payant_1_id = tiers_payant_2_id AND tiers_payant_1_id <> 0 THEN w_LIG_CLINI_tmrx.MR2_LCL ELSE 0 END) OR
montant_regle_2_c <> (CASE WHEN tiers_payant_1_id <> tiers_payant_2_id THEN w_LIG_CLINI_tmrx.MR2_LCL ELSE 0 END) OR
montant_regle_0_c <> w_LIG_CLINI_tmrx.MR3_LCL
);
]]></sqlcmd>
</NODE>
<NODE label="Lignes factures Clinique">
<sqlcmd><![CDATA[
DROP TABLE IF EXISTS w_REG4_un;
CREATE TEMP TABLE w_REG4_un AS
SELECT NUM_CLI
FROM prod_sigems.REG4
GROUP BY 1;
ALTER TABLE w_REG4_un ADD CONSTRAINT w_REG4_un_pkey PRIMARY KEY(NUM_CLI);
DROP SEQUENCE IF EXISTS w_factures_lignes_c_seq;
CREATE TEMP SEQUENCE w_factures_lignes_c_seq;
DROP TABLE IF EXISTS w_factures_lignes_c;
CREATE TEMP TABLE w_factures_lignes_c AS
SELECT
nextval('w_factures_lignes_c_seq'::regclass) AS sequence,
p_factures.no_sejour,
NUM_LCL,
p_factures.oid AS facture_id,
w_LIG_CLINI.no_facture AS no_facture,
p_factures.code_facture,
p_factures.date_vente,
CASE WHEN COG_LCL <> 0 THEN COG_LCL ELSE 1 END AS coefficient,
CASE WHEN COO_LCL > 0 THEN COO_LCL / 100 ELSE 1 END AS coefficient_mco,
w_LIG_CLINI.PRO_LCL,
w_LIG_CLINI_keys.rubrique_facturation_id AS rubrique_facturation_id,
w_LIG_CLINI_keys.rubrique_comptabilisation_id AS rubrique_comptabilisation_id,
w_LIG_CLINI_keys.prestation_id AS prestation_id,
w_LIG_CLINI_keys.compte_produit_id AS compte_produit_id,
w_LIG_CLINI.ucd_id,
w_LIG_CLINI.lpp_id,
p_sejours.lieu_sortie_id AS lieu_id,
1::bigint AS origine_facturation_id,
PUN_LCL AS prix_unitaire,
TX3_LCL AS taux_0,
CASE WHEN BG_SSR = '0' AND ML1_LCL <> 0 OR ML1_LCL_BG <> 0 THEN TX1_LCL ELSE 0 END AS taux_1,
TX2_LCL AS taux_2,
0::numeric AS taux_22,
date(DDE_LCL) AS date_debut,
date(COALESCE(DFI_LCL,DDE_LCL)) AS date_fin,
QTE_LCL AS nb_rubrique,
QTE_LCL AS nb_prestation,
w_LIG_CLINI.TVA_LCL AS taux_tva,
ML1_LCL + ML2_LCL + ML3_LCL AS montant_facture,
ML3_LCL AS montant_facture_0,
ML1_LCL AS montant_facture_1,
ML2_LCL AS montant_facture_2,
0::numeric AS montant_facture_22,
ML1_LCL + ML2_LCL + ML3_LCL AS montant_comptabilise,
ML3_LCL AS montant_comptabilise_0,
ML1_LCL + CASE WHEN p_factures.tiers_payant_1_id = p_factures.tiers_payant_2_id AND p_factures.tiers_payant_1_id <> 0 THEN ML2_LCL ELSE 0 END AS montant_comptabilise_1,
CASE WHEN p_factures.tiers_payant_1_id <> p_factures.tiers_payant_2_id THEN ML2_LCL ELSE 0 END AS montant_comptabilise_2,
0::numeric AS montant_comptabilise_22,
MR1_LCL + MR2_LCL + MR3_LCL AS montant_regle,
MR3_LCL AS montant_regle_0,
MR1_LCL + CASE WHEN p_factures.tiers_payant_1_id = p_factures.tiers_payant_2_id AND p_factures.tiers_payant_1_id <> 0 THEN MR2_LCL ELSE 0 END AS montant_regle_1,
CASE WHEN p_factures.tiers_payant_1_id <> p_factures.tiers_payant_2_id THEN MR2_LCL ELSE 0 END AS montant_regle_2,
0::numeric AS montant_regle_22,
0::numeric AS montant_encours,
0::numeric AS montant_encours_0,
0::numeric AS montant_encours_1,
0::numeric AS montant_encours_2,
0::numeric AS montant_encours_22,
0::numeric AS montant_facture_actes_inclus_dans_sejour,
0::numeric AS montant_facture_0_actes_inclus_dans_sejour,
0::numeric AS montant_facture_1_actes_inclus_dans_sejour,
0::numeric AS montant_facture_2_actes_inclus_dans_sejour,
0::numeric AS montant_facture_22_actes_inclus_dans_sejour,
0::numeric AS montant_comptabilise_budget_global_1,
0::numeric AS rubrique_facture_id
FROM w_LIG_CLINI
JOIN activite[PX].p_factures ON w_LIG_CLINI.no_facture = p_factures.no_facture
JOIN activite[PX].p_sejours ON w_LIG_CLINI.SEJ_DOS = p_sejours.code_original AND p_sejours.etat = ''
JOIN w_LIG_CLINI_keys ON w_LIG_CLINI.key = w_LIG_CLINI_keys.key
LEFT JOIN w_REG4_un ON NUM_LCL = NUM_CLI
WHERE (p_factures.code_facture = '1' AND w_LIG_CLINI.non_facturee <> '1') OR w_LIG_CLINI.PRO_LCL = 'ACPT' OR NUM_CLI IS NOT NULL;
-- Lignes Budget global SSR
INSERT INTO w_factures_lignes_c
SELECT
nextval('w_factures_lignes_c_seq'::regclass) AS sequence,
p_factures.no_sejour,
NUM_LCL,
p_factures.oid AS facture_id,
w_LIG_CLINI.no_facture || '.BG' AS no_facture,
p_factures.code_facture,
p_factures.date_vente,
CASE WHEN COG_LCL <> 0 THEN COG_LCL ELSE 1 END AS coefficient,
CASE WHEN COO_LCL > 0 THEN COO_LCL / 100 ELSE 1 END AS coefficient_mco,
w_LIG_CLINI.PRO_LCL,
w_LIG_CLINI_keys.rubrique_facturation_id AS rubrique_facturation_id,
w_LIG_CLINI_keys.rubrique_comptabilisation_id AS rubrique_comptabilisation_id,
w_LIG_CLINI_keys.prestation_id AS prestation_id,
w_LIG_CLINI_keys.compte_produit_id AS compte_produit_id,
w_LIG_CLINI.ucd_id,
w_LIG_CLINI.lpp_id,
p_sejours.lieu_sortie_id AS lieu_id,
1::bigint AS origine_facturation_id,
PUN_LCL AS prix_unitaire,
0::numeric AS taux_0,
TX1_LCL AS taux_1,
0::numeric AS taux_2,
0::numeric AS taux_22,
date(DDE_LCL) AS date_debut,
date(COALESCE(DFI_LCL,DDE_LCL)) AS date_fin,
QTE_LCL AS nb_rubrique,
QTE_LCL AS nb_prestation,
TVA_LCL AS taux_tva,
ML1_LCL_BG AS montant_facture,
0::numeric AS montant_facture_0,
ML1_LCL_BG AS montant_facture_1,
0::numeric AS montant_facture_2,
0::numeric AS montant_facture_22,
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 AS montant_regle,
0::numeric AS montant_regle_0,
0::numeric AS montant_regle_1,
0::numeric AS montant_regle_2,
0::numeric AS montant_regle_22,
0::numeric AS montant_encours,
0::numeric AS montant_encours_0,
0::numeric AS montant_encours_1,
0::numeric AS montant_encours_2,
0::numeric AS montant_encours_22,
0::numeric AS montant_facture_actes_inclus_dans_sejour,
0::numeric AS montant_facture_0_actes_inclus_dans_sejour,
0::numeric AS montant_facture_1_actes_inclus_dans_sejour,
0::numeric AS montant_facture_2_actes_inclus_dans_sejour,
0::numeric AS montant_facture_22_actes_inclus_dans_sejour,
ML1_LCL_BG AS montant_comptabilise_budget_global_1,
0::numeric AS rubrique_facture_id
FROM w_LIG_CLINI
JOIN activite[PX].p_factures ON w_LIG_CLINI.no_facture || '.BG' = p_factures.no_facture
JOIN activite[PX].p_sejours ON w_LIG_CLINI.SEJ_DOS = p_sejours.code_original AND p_sejours.etat = ''
JOIN w_LIG_CLINI_keys ON w_LIG_CLINI.key = w_LIG_CLINI_keys.key
WHERE ML1_LCL_BG <> 0 AND
p_factures.code_facture = '1' AND w_LIG_CLINI.non_facturee <> '1';
CREATE INDEX w_factures_lignes_c_i1
ON w_factures_lignes_c
USING btree
(NUM_LCL);
CREATE INDEX w_factures_lignes_c_i2
ON w_factures_lignes_c
USING btree
(sequence);
CREATE INDEX w_factures_lignes_c_i3
ON w_factures_lignes_c
USING btree
(no_sejour);
-- Remplacement des codes dialyse
INSERT INTO activite.t_divers (code, texte, valeur, description)
SELECT
'TRANSGHSDXX',
'Transformation des GHS en Dxx',
'',
'Transformation des prestations GHS en Dxx selong GHS, la rubrique de facturation prend la valeur du GHS'
WHERE 'TRANSGHSDXX' NOT IN (SELECT code FROM activite.t_divers);
;
INSERT INTO activite[PX].t_rubriques_facturation (code_original, code, texte, texte_court)
WITH w_rub AS
(
SELECT code_original FROM activite[PX].t_rubriques_facturation WHERE code_original IS NOT NULL
)
SELECT t_ghs.code::text, t_ghs.code::text, t_ghs.texte, t_ghs.texte
FROM base.t_ghs
JOIN activite.t_divers ON t_divers.code = 'TRANSGHSDXX' AND t_divers.valeur = '1'
LEFT JOIN w_rub ON w_rub.code_original = t_ghs.code::text
WHERE t_ghs.code IN (9602,9603,9604,9605,9617) AND
w_rub.code_original IS NULL
;
INSERT INTO activite[PX].t_rubriques_facturation (code_original, code, texte, texte_court)
WITH w_rub AS
(
SELECT code_original FROM activite[PX].t_rubriques_facturation WHERE code_original IS NOT NULL
)
SELECT t_prestations.code::text, t_prestations.code::text, t_prestations.texte, t_prestations.texte
FROM activite.t_prestations
JOIN activite.t_divers ON t_divers.code = 'TRANSGHSDXX' AND t_divers.valeur = '1'
LEFT JOIN w_rub ON w_rub.code_original = t_prestations.code::text
WHERE t_prestations.code IN ('D11') AND
w_rub.code_original IS NULL
;
DROP TABLE IF EXISTS w_transform_dxx;
CREATE TEMP TABLE w_transform_dxx AS
SELECT p_factures_lignes_c.no_facture,
p_factures_lignes_c.CTID AS CTID_source,
t_prestations.code,
t_ghs.code AS ghs_code,
CASE t_ghs.code
WHEN 9602 THEN 'D18'
WHEN 9603 THEN 'D19'
WHEN 9604 THEN 'D17'
WHEN 9605 THEN 'D09'
WHEN 9617 THEN 'D10'
ELSE '' END AS dxx_prestation_code
FROM w_factures_lignes_c p_factures_lignes_c
JOIN activite[PX].p_factures ON p_factures_lignes_c.no_facture = p_factures.no_facture
JOIN activite[PX].p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
JOIN base.t_ghs ON p_sejours.ghs_id = t_ghs.oid
JOIN activite.t_prestations ON t_prestations.oid = prestation_id
JOIN activite.t_divers ON t_divers.code = 'TRANSGHSDXX' AND t_divers.valeur = '1'
WHERE t_prestations.code = 'GHS' AND
t_ghs.code IN (9602,9603,9604,9605,9617);
CREATE INDEX w_transform_dxx_i1
ON w_transform_dxx
USING btree
(no_facture)
;
UPDATE w_factures_lignes_c p_factures_lignes_c SET
prestation_id = t_prestations.oid,
rubrique_facturation_id = t_rubriques_facturation.oid
FROM w_transform_dxx
JOIN activite.t_prestations ON dxx_prestation_code = t_prestations.code
JOIN activite[PX].t_rubriques_facturation ON ghs_code = t_rubriques_facturation.code_original
WHERE p_factures_lignes_c.no_facture = w_transform_dxx.no_facture AND
p_factures_lignes_c.CTID = w_transform_dxx.CTID_source
;
-- Eclatement des supplements par jour
DROP TABLE IF EXISTS w_factures_lignes_sup_c;
CREATE TEMP TABLE w_factures_lignes_sup_c AS
SELECT
t_prestations.code AS prestation_code,
date(p_sejours.date_entree) AS date_debut_ghs,
date(p_sejours.date_sortie - interval '1 day') AS date_fin_ghs,
(date(date_sortie) - date(date_entree)) * CASE WHEN nb_prestation < 0 THEN -1 ELSE 1 END AS nb_prestation_ghs,
CASE WHEN t_prestations.code = 'GHS' THEN date(date_entree + interval '1 day') ELSE date(date_debut + interval '1 day') END AS date_debut_det,
CASE WHEN t_prestations.code = 'GHS' THEN date(p_sejours.date_sortie - interval '1 day') ELSE date(date_debut + ABS(nb_prestation)-1) END AS date_fin_det,
ABS(CASE WHEN t_prestations.code = 'GHS' THEN date(date_sortie) - date(date_entree) ELSE nb_prestation END) AS nb_det,
w_factures_lignes_c.*
FROM w_factures_lignes_c
JOIN activite[PX].p_sejours ON w_factures_lignes_c.no_sejour = p_sejours.no_sejour
JOIN activite.t_prestations ON prestation_id = t_prestations.oid AND
(
code IN ('PJ', 'FJ', 'SSM', 'GHS', 'EXH', 'SRC', 'REA', 'STF', 'NN1', 'NN2', 'NN3', 'CP', 'CPC', 'SHO') OR
t_prestations.type_ventilation_jour = '1'
)
WHERE (nb_prestation > 1 or nb_prestation < -1 OR (t_prestations.code = 'GHS' AND p_sejours.type_sejour != '5' AND date(date_sortie) - date(date_entree) > 1))
;
UPDATE w_factures_lignes_sup_c SET
date_fin_ghs = date(date_debut_exh - interval '1 day'),
date_fin_det = date(date_debut_exh - interval '1 day'),
nb_prestation_ghs = date(date_debut_exh - interval '1 day') - date_debut_ghs + 1,
nb_det = date(date_debut_exh - interval '1 day') - date_debut_ghs + 1
FROM (
SELECT no_facture, date(MIN(date_debut)) AS date_debut_exh
FROM w_factures_lignes_c
JOIN activite.t_prestations ON prestation_id = t_prestations.oid AND code = 'EXH'
GROUP BY 1) subview
WHERE w_factures_lignes_sup_c.no_facture = subview.no_facture AND
w_factures_lignes_sup_c.prestation_code = 'GHS';
CREATE INDEX w_factures_lignes_sup_c_i1
ON w_factures_lignes_sup_c
USING btree
(date_debut);
DROP TABLE IF EXISTS w_factures_lignes_sup_c_sup;
CREATE TEMP TABLE w_factures_lignes_sup_c_sup AS
SELECT
sequence,
NUM_LCL,
PRO_LCL,
no_sejour,
no_facture,
code_facture,
date AS date_debut,
date AS date_fin,
date_vente,
CASE WHEN prestation_code = 'GHS' AND date <> date_fin_ghs THEN 0 WHEN nb_prestation < 0 THEN -1 ELSE 1 END AS nb_rubrique,
CASE WHEN prestation_code = 'GHS' AND date <> date_fin_ghs THEN 0 WHEN nb_prestation < 0 THEN -1 ELSE 1 END AS nb_prestation,
coefficient,
coefficient_mco,
rubrique_facturation_id,
prestation_id,
compte_produit_id,
ucd_id,
lpp_id,
taux_tva,
round(montant_facture / ABS(nb_det),2) AS montant_facture,
round(montant_facture_0 / ABS(nb_det),2) AS montant_facture_0,
round(montant_facture_1 / ABS(nb_det),2) AS montant_facture_1,
round(montant_facture_2 / ABS(nb_det),2) AS montant_facture_2,
round(montant_facture_22 / ABS(nb_det),2) AS montant_facture_22,
taux_0,
taux_1,
taux_2,
taux_22,
prix_unitaire,
lieu_id,
round(montant_comptabilise / ABS(nb_det),2) AS montant_comptabilise,
round(montant_comptabilise_0 / ABS(nb_det),2) AS montant_comptabilise_0,
round(montant_comptabilise_1 / ABS(nb_det),2) AS montant_comptabilise_1,
round(montant_comptabilise_2 / ABS(nb_det),2) AS montant_comptabilise_2,
round(montant_comptabilise_22 / ABS(nb_det),2) AS montant_comptabilise_22,
rubrique_comptabilisation_id,
round(montant_encours / ABS(nb_det),2) AS montant_encours,
round(montant_encours_0 / ABS(nb_det),2) AS montant_encours_0,
round(montant_encours_1 / ABS(nb_det),2) AS montant_encours_1,
round(montant_encours_2 / ABS(nb_det),2) AS montant_encours_2,
round(montant_encours_22 / ABS(nb_det),2) AS montant_encours_22,
round(montant_facture_actes_inclus_dans_sejour / ABS(nb_det),2) AS montant_facture_actes_inclus_dans_sejour,
round(montant_facture_0_actes_inclus_dans_sejour / ABS(nb_det),2) AS montant_facture_0_actes_inclus_dans_sejour,
round(montant_facture_1_actes_inclus_dans_sejour / ABS(nb_det),2) AS montant_facture_1_actes_inclus_dans_sejour,
round(montant_facture_2_actes_inclus_dans_sejour / ABS(nb_det),2) AS montant_facture_2_actes_inclus_dans_sejour,
round(montant_facture_22_actes_inclus_dans_sejour / ABS(nb_det),2) AS montant_facture_22_actes_inclus_dans_sejour,
origine_facturation_id,
round(montant_comptabilise_budget_global_1 / ABS(nb_det),2) AS montant_comptabilise_budget_global_1,
facture_id
FROM w_factures_lignes_sup_c
JOIN base.p_calendrier ON p_calendrier.date BETWEEN date_debut_det AND date_fin_det
;
DROP TABLE IF EXISTS w_factures_lignes_sup_c_sup_tot;
CREATE TEMP TABLE w_factures_lignes_sup_c_sup_tot AS
SELECT sequence,
SUM(nb_rubrique) AS nb_rubrique,
SUM(nb_prestation) AS nb_prestation,
SUM(montant_facture) AS montant_facture,
SUM(montant_facture_0) AS montant_facture_0,
SUM(montant_facture_1) AS montant_facture_1,
SUM(montant_facture_2) AS montant_facture_2,
SUM(montant_facture_22) AS montant_facture_22,
SUM(montant_comptabilise) AS montant_comptabilise,
SUM(montant_comptabilise_0) AS montant_comptabilise_0,
SUM(montant_comptabilise_1) AS montant_comptabilise_1,
SUM(montant_comptabilise_2) AS montant_comptabilise_2,
SUM(montant_comptabilise_22) AS montant_comptabilise_22,
SUM(montant_encours) AS montant_encours,
SUM(montant_encours_0) AS montant_encours_0,
SUM(montant_encours_1) AS montant_encours_1,
SUM(montant_encours_2) AS montant_encours_2,
SUM(montant_encours_22) AS montant_encours_22,
SUM(montant_facture_actes_inclus_dans_sejour) AS montant_facture_actes_inclus_dans_sejour,
SUM(montant_facture_0_actes_inclus_dans_sejour) AS montant_facture_0_actes_inclus_dans_sejour,
SUM(montant_facture_1_actes_inclus_dans_sejour) AS montant_facture_1_actes_inclus_dans_sejour,
SUM(montant_facture_2_actes_inclus_dans_sejour) AS montant_facture_2_actes_inclus_dans_sejour,
SUM(montant_facture_22_actes_inclus_dans_sejour) AS montant_facture_22_actes_inclus_dans_sejour,
SUM(montant_comptabilise_budget_global_1) AS montant_comptabilise_budget_global_1
FROM w_factures_lignes_sup_c_sup
GROUP BY 1;
UPDATE w_factures_lignes_c
SET
date_fin = w_factures_lignes_c.date_debut,
nb_rubrique = w_factures_lignes_c.nb_rubrique - w_factures_lignes_sup_c_sup_tot.nb_rubrique,
nb_prestation = w_factures_lignes_c.nb_prestation - w_factures_lignes_sup_c_sup_tot.nb_prestation,
montant_facture = w_factures_lignes_c.montant_facture - w_factures_lignes_sup_c_sup_tot.montant_facture,
montant_facture_0 = w_factures_lignes_c.montant_facture_0 - w_factures_lignes_sup_c_sup_tot.montant_facture_0,
montant_facture_1 = w_factures_lignes_c.montant_facture_1 - w_factures_lignes_sup_c_sup_tot.montant_facture_1,
montant_facture_2 = w_factures_lignes_c.montant_facture_2 - w_factures_lignes_sup_c_sup_tot.montant_facture_2,
montant_facture_22 = w_factures_lignes_c.montant_facture_22 - w_factures_lignes_sup_c_sup_tot.montant_facture_22,
montant_comptabilise = w_factures_lignes_c.montant_comptabilise - w_factures_lignes_sup_c_sup_tot.montant_comptabilise,
montant_comptabilise_0 = w_factures_lignes_c.montant_comptabilise_0 - w_factures_lignes_sup_c_sup_tot.montant_comptabilise_0,
montant_comptabilise_1 = w_factures_lignes_c.montant_comptabilise_1 - w_factures_lignes_sup_c_sup_tot.montant_comptabilise_1,
montant_comptabilise_2 = w_factures_lignes_c.montant_comptabilise_2 - w_factures_lignes_sup_c_sup_tot.montant_comptabilise_2,
montant_comptabilise_22 = w_factures_lignes_c.montant_comptabilise_22 - w_factures_lignes_sup_c_sup_tot.montant_comptabilise_22,
montant_encours = w_factures_lignes_c.montant_encours - w_factures_lignes_sup_c_sup_tot.montant_encours,
montant_encours_0 = w_factures_lignes_c.montant_encours_0 - w_factures_lignes_sup_c_sup_tot.montant_encours_0,
montant_encours_1 = w_factures_lignes_c.montant_encours_1 - w_factures_lignes_sup_c_sup_tot.montant_encours_1,
montant_encours_2 = w_factures_lignes_c.montant_encours_2 - w_factures_lignes_sup_c_sup_tot.montant_encours_2,
montant_encours_22 = w_factures_lignes_c.montant_encours_22 - w_factures_lignes_sup_c_sup_tot.montant_encours_22,
montant_facture_actes_inclus_dans_sejour = w_factures_lignes_c.montant_facture_actes_inclus_dans_sejour - w_factures_lignes_sup_c_sup_tot.montant_facture_actes_inclus_dans_sejour,
montant_facture_0_actes_inclus_dans_sejour = w_factures_lignes_c.montant_facture_0_actes_inclus_dans_sejour - w_factures_lignes_sup_c_sup_tot.montant_facture_0_actes_inclus_dans_sejour,
montant_facture_1_actes_inclus_dans_sejour = w_factures_lignes_c.montant_facture_1_actes_inclus_dans_sejour - w_factures_lignes_sup_c_sup_tot.montant_facture_1_actes_inclus_dans_sejour,
montant_facture_2_actes_inclus_dans_sejour = w_factures_lignes_c.montant_facture_2_actes_inclus_dans_sejour - w_factures_lignes_sup_c_sup_tot.montant_facture_2_actes_inclus_dans_sejour,
montant_facture_22_actes_inclus_dans_sejour = w_factures_lignes_c.montant_facture_22_actes_inclus_dans_sejour - w_factures_lignes_sup_c_sup_tot.montant_facture_22_actes_inclus_dans_sejour,
montant_comptabilise_budget_global_1 = w_factures_lignes_c.montant_comptabilise_budget_global_1 - w_factures_lignes_sup_c_sup_tot.montant_comptabilise_budget_global_1
FROM w_factures_lignes_sup_c_sup_tot
WHERE w_factures_lignes_c.sequence = w_factures_lignes_sup_c_sup_tot.sequence;
INSERT INTO w_factures_lignes_c(
NUM_LCL,
PRO_LCL,
no_facture,
code_facture,
no_sejour,
date_debut,
date_fin,
date_vente,
nb_rubrique,
coefficient,
coefficient_mco,
rubrique_facturation_id,
prestation_id,
compte_produit_id,
ucd_id,
lpp_id,
taux_tva,
montant_facture,
montant_facture_0,
montant_facture_1,
montant_facture_2,
montant_facture_22,
taux_0,
taux_1,
taux_2,
taux_22,
prix_unitaire,
lieu_id,
nb_prestation,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
rubrique_comptabilisation_id,
montant_encours,
montant_encours_0,
montant_encours_1,
montant_encours_2,
montant_encours_22,
montant_facture_actes_inclus_dans_sejour,
montant_facture_0_actes_inclus_dans_sejour,
montant_facture_1_actes_inclus_dans_sejour,
montant_facture_2_actes_inclus_dans_sejour,
montant_facture_22_actes_inclus_dans_sejour,
origine_facturation_id,
montant_comptabilise_budget_global_1,
facture_id)
SELECT
0 - NUM_LCL,
PRO_LCL,
no_facture,
code_facture,
no_sejour,
date_debut,
date_fin,
date_vente,
nb_rubrique,
coefficient,
coefficient_mco,
rubrique_facturation_id,
prestation_id,
compte_produit_id,
ucd_id,
lpp_id,
taux_tva,
montant_facture,
montant_facture_0,
montant_facture_1,
montant_facture_2,
montant_facture_22,
taux_0,
taux_1,
taux_2,
taux_22,
prix_unitaire,
lieu_id,
nb_prestation,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
rubrique_comptabilisation_id,
montant_encours,
montant_encours_0,
montant_encours_1,
montant_encours_2,
montant_encours_22,
montant_facture_actes_inclus_dans_sejour,
montant_facture_0_actes_inclus_dans_sejour,
montant_facture_1_actes_inclus_dans_sejour,
montant_facture_2_actes_inclus_dans_sejour,
montant_facture_22_actes_inclus_dans_sejour,
origine_facturation_id,
montant_comptabilise_budget_global_1,
facture_id
FROM w_factures_lignes_sup_c_sup;
-- Lieu exécution
UPDATE w_factures_lignes_c
SET lieu_id = p_mouvements_sejour.lieu_id
FROM
activite[PX].p_mouvements_sejour
WHERE
w_factures_lignes_c.no_sejour = p_mouvements_sejour.no_sejour AND
w_factures_lignes_c.date_fin = p_mouvements_sejour.date AND
(230000 BETWEEN p_mouvements_sejour.heure_debut AND p_mouvements_sejour.heure_fin OR
nb_entrees_directes = 1 AND heure_fin = 240000 OR
nb_sorties_directes = 1 ) AND
w_factures_lignes_c.lieu_id <> p_mouvements_sejour.lieu_id;
-- Rubriques internes cti
SELECT activite[PX].cti_reorganize_rubrique_facture_c('w_factures_lignes_c');
-- Validation des lignes de facture
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_c_1');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_c_2');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_c_3');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_c_4');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_c_5');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_c_6');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_c_7');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_c_8');
INSERT INTO activite[PX].p_factures_lignes_c (
facture_id,
no_facture,
date_debut,
date_fin,
nb_rubrique,
nb_prestation,
coefficient,
coefficient_mco,
rubrique_facture_id,
rubrique_facturation_id,
rubrique_comptabilisation_id,
prestation_id,
compte_produit_id,
ucd_id,
lpp_id,
taux_tva,
montant_facture,
montant_facture_0,
montant_facture_1,
montant_facture_2,
montant_facture_22,
taux_0,
taux_1,
taux_2,
taux_22,
prix_unitaire,
lieu_id,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
montant_encours,
montant_encours_0,
montant_encours_1,
montant_encours_2,
montant_encours_22,
montant_facture_actes_inclus_dans_sejour,
montant_facture_0_actes_inclus_dans_sejour,
montant_facture_1_actes_inclus_dans_sejour,
montant_facture_2_actes_inclus_dans_sejour,
montant_facture_22_actes_inclus_dans_sejour,
montant_comptabilise_budget_global_1,
origine_facturation_id
)
SELECT
facture_id,
no_facture,
date_debut,
date_fin,
nb_rubrique,
nb_prestation,
coefficient,
coefficient_mco,
rubrique_facture_id,
rubrique_facturation_id,
rubrique_comptabilisation_id,
prestation_id,
compte_produit_id,
ucd_id,
lpp_id,
taux_tva,
montant_facture,
montant_facture_0,
montant_facture_1,
montant_facture_2,
montant_facture_22,
taux_0,
taux_1,
taux_2,
taux_22,
prix_unitaire,
lieu_id,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
montant_encours,
montant_encours_0,
montant_encours_1,
montant_encours_2,
montant_encours_22,
montant_facture_actes_inclus_dans_sejour,
montant_facture_0_actes_inclus_dans_sejour,
montant_facture_1_actes_inclus_dans_sejour,
montant_facture_2_actes_inclus_dans_sejour,
montant_facture_22_actes_inclus_dans_sejour,
montant_comptabilise_budget_global_1,
origine_facturation_id
FROM w_factures_lignes_c
WHERE PRO_LCL <> 'ACPT' AND montant_facture <> 0 AND code_facture >= '1';
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_c_1');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_c_2');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_c_3');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_c_4');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_c_5');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_c_6');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_c_7');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_c_8');
DROP TABLE IF EXISTS w_sejours_facture_reference;
CREATE TEMP TABLE w_sejours_facture_reference AS
SELECT
no_sejour,
COALESCE(
MAX(CASE WHEN type_facture <> '1' AND type_facture <> 'X' AND t_prestations.code = 'GHS' THEN p_factures.no_facture ELSE null END),
MAX(CASE WHEN type_facture <> '1' AND type_facture <> 'X' THEN p_factures.no_facture ELSE null END),
MAX(p_factures.no_facture)
) AS no_facture_reference
FROM activite[PX].p_factures
LEFT JOIN activite[PX].p_factures_lignes_c ON p_factures.no_facture = p_factures_lignes_c.no_facture
LEFT JOIN activite.t_prestations ON p_factures_lignes_c.prestation_id = t_prestations.oid AND t_prestations.code = 'GHS'
GROUP BY no_sejour;
CREATE INDEX w_sejours_facture_reference_i1
ON w_sejours_facture_reference
USING btree
(no_sejour);
CREATE INDEX w_sejours_facture_reference_i2
ON w_sejours_facture_reference
USING btree
(no_facture_reference);
UPDATE activite[PX].p_factures SET
no_facture_reference = w_sejours_facture_reference.no_facture_reference,
facture_reference_id = p_factures_references.oid
FROM w_sejours_facture_reference
JOIN activite[PX].p_factures p_factures_references ON p_factures_references.no_facture = w_sejours_facture_reference.no_facture_reference
WHERE p_factures.no_sejour = w_sejours_facture_reference.no_sejour AND
(p_factures.no_facture_reference IS DISTINCT FROM w_sejours_facture_reference.no_facture_reference OR
p_factures.facture_reference_id IS DISTINCT FROM p_factures_references.oid
)
;
]]></sqlcmd>
</NODE>
<NODE label="Compte client Clinique">
<sqlcmd><![CDATA[
SELECT base.cti_disable_index('activite[PX]', 'i_factures_soldes_c_1');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_soldes_c_2');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_soldes_c_3');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_soldes_c_4');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_soldes_c_8');
INSERT INTO activite[PX].p_factures_soldes_c(
facture_id,
no_facture,
date_comptable,
rubrique_comptabilisee_id,
prestation_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
)
SELECT
facture_id,
no_facture,
date_vente,
rubrique_comptabilisation_id,
prestation_id,
SUM(montant_comptabilise),
SUM(montant_comptabilise_0),
SUM(montant_comptabilise_1),
SUM(montant_comptabilise_2),
SUM(montant_comptabilise_22),
0,
0,
0,
0,
0
FROM w_factures_lignes_c
WHERE date_vente IS NOT NULL AND
(montant_comptabilise <> 0 OR
montant_comptabilise_0 <> 0 OR
montant_comptabilise_1 <> 0 OR
montant_comptabilise_2 <> 0 OR
montant_comptabilise_22 <> 0
)
GROUP BY 1,2,3,4,5;
INSERT INTO activite[PX].p_factures_soldes_c(
facture_id,
no_facture,
date_comptable,
rubrique_comptabilisee_id,
prestation_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
)
SELECT
facture_id,
no_facture,
date(DAT_REG),
rubrique_comptabilisation_id,
prestation_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,
SUM(MR1_LCL + MR2_LCL + MR3_LCL) AS montant_regle,
SUM(MR3_LCL) AS montant_regle_0,
SUM(MR1_LCL) AS montant_regle_1,
SUM(MR2_LCL) AS montant_regle_2,
0 AS montant_regle_22
FROM w_factures_lignes_c
JOIN w_LIG_CLINI_mrx ON w_factures_lignes_c.NUM_LCL = w_LIG_CLINI_mrx.NUM_LCL
WHERE no_facture NOT LIKE '%BG'
GROUP BY 1,2,3,4,5;
-- Acomptes NOEMIE (85%)
INSERT INTO activite[PX].t_rubriques_facturation(code_original, code, texte, texte_court)
SELECT '*CTI_ACO85', 'ACO85', 'Acomptes 85%', 'Acomptes 85%'
WHERE '*CTI_ACO85' NOT IN (SELECT code_original FROM activite[PX].t_rubriques_facturation);
INSERT INTO activite.t_prestations(code_original, code, texte, texte_court)
SELECT '*CTI_ACO85', 'ACO85', 'Acomptes 85%', 'Acomptes 85%'
WHERE '*CTI_ACO85' NOT IN (SELECT code_original FROM activite.t_prestations WHERE code_original IS NOT NULL);
DROP TABLE IF EXISTS w_ACOMPTE_NOEMIE;
CREATE TEMP TABLE w_ACOMPTE_NOEMIE AS
SELECT *,
DATE_CPTA AS ECR_DATE,
CASE
WHEN DATE_CPTA < date(now() - interval '30 days') THEN '1'::text
ELSE '0'::text END AS ACOMPTE_EST_COMPTABILISE,
0::NUMERIC AS MONTANT_REGLE_SI_REPRISE
FROM prod_sigems.ACOMPTE_NOEMIE
;
ANALYSE w_ACOMPTE_NOEMIE
;
CREATE INDEX w_ACOMPTE_NOEMIE_i1
ON w_ACOMPTE_NOEMIE
USING btree
(CODE);
-- Récupérer la vraie date comptable
UPDATE w_ACOMPTE_NOEMIE ACOMPTE_NOEMIE SET
ECR_DATE = ECRIT.ECR_DATE,
ACOMPTE_EST_COMPTABILISE = '1'
FROM prod_sigems.DOS_ECRIT
JOIN prod_sigems.ECRIT ON (SERI = ECR_NUM OR SERI = ECR_LIAIS)
WHERE ACOMPTE_NOEMIE.ANNEE = DOS_ECRIT.ANNEE AND
ACOMPTE_NOEMIE.CODE = DOS_ECRIT.CODE AND
ACOMPTE_NOEMIE.INDICE = DOS_ECRIT.INDICE AND
ECR_CPTE = 'NOEMIE' AND
ECR_JNAL NOT LIKE 'AN%' AND
ECR_CREDIT = ACOMPTE_NOEMIE.MONTANT AND
(
ACOMPTE_NOEMIE.ECR_DATE IS DISTINCT FROM ECRIT.ECR_DATE OR
ACOMPTE_EST_COMPTABILISE = '0'
)
;
-- Retrouver le montant réglé total si reprise d'acompte nom comptabilisée
UPDATE w_ACOMPTE_NOEMIE
SET MONTANT_REGLE_SI_REPRISE = SJ1_DOS2
FROM prod_sigems.DOS2
WHERE ACOMPTE_EST_COMPTABILISE = '0' AND
MONTANT < 0 AND
ANNEE = ANN_DOS2 AND
CODE = COD_DOS2 AND
INDICE = IND_DOS2 AND
SR1_DOS2 = 0 AND
round(base.cti_division(0-MONTANT, SJ1_DOS2)*100.00,0) = 85
;
-- Eliminer les anomalies
DROP TABLE IF EXISTS w_ACOMPTE_NOEMIE_err;
CREATE TEMP TABLE w_ACOMPTE_NOEMIE_err AS
SELECT ANNEE AS ANNEE_err, CODE AS CODE_err, INDICE AS INDICE_err
FROM w_ACOMPTE_NOEMIE ACOMPTE_NOEMIE
JOIN activite[PX].p_factures ON annee || to_char(code,'FM900000') || '.' || to_char(indice,'FM00') = no_facture
WHERE ECR_DATE IS NOT NULL
GROUP BY 1,2,3
HAVING (
SUM(MONTANT) <> 0 AND MAX(ECR_DATE) < (now() - interval '1 year') OR
SUM(MONTANT) <> 0 AND count(*) <> 1 OR
SUM(MONTANT) < 0
)
;
DELETE FROM w_ACOMPTE_NOEMIE
USING w_ACOMPTE_NOEMIE_err
WHERE ANNEE = ANNEE_err AND
CODE = CODE_err AND
INDICE = INDICE_err
;
-- Ecriture d'acompte
INSERT INTO activite[PX].p_factures_soldes_c(
facture_id,
no_facture,
date_comptable,
rubrique_comptabilisee_id,
prestation_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
p_factures.oid AS facture_id,
p_factures.no_facture,
date(ECR_DATE) AS date_comptable,
t_rubriques_facturation.oid AS rubrique_comptabilisation_id,
t_prestations.oid AS prestation_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,
ACOMPTE_NOEMIE.MONTANT AS montant_regle,
0 AS montant_regle_0,
ACOMPTE_NOEMIE.MONTANT AS montant_regle_1,
0 AS montant_regle_2,
0 AS montant_regle_22,
'1' AS od_non_comptabilise
FROM w_ACOMPTE_NOEMIE ACOMPTE_NOEMIE
JOIN activite[PX].p_factures ON annee || to_char(code,'FM900000') || '.' || to_char(indice,'FM00') = no_facture
JOIN activite[PX].t_rubriques_facturation ON t_rubriques_facturation.code_original = '*CTI_ACO85'
JOIN activite.t_prestations ON t_prestations.code_original = '*CTI_ACO85'
WHERE ECR_DATE IS NOT NULL
;
-- Ecriture de règlement si reprise d'acompte non comptabilisée
INSERT INTO activite[PX].p_factures_soldes_c(
facture_id,
no_facture,
date_comptable,
rubrique_comptabilisee_id,
prestation_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
p_factures.oid AS facture_id,
p_factures.no_facture,
date(ECR_DATE) AS date_comptable,
t_rubriques_facturation.oid AS rubrique_comptabilisation_id,
t_prestations.oid AS prestation_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,
ACOMPTE_NOEMIE.MONTANT_REGLE_SI_REPRISE AS montant_regle,
0 AS montant_regle_0,
ACOMPTE_NOEMIE.MONTANT_REGLE_SI_REPRISE AS montant_regle_1,
0 AS montant_regle_2,
0 AS montant_regle_22,
'1' AS od_non_comptabilise
FROM w_ACOMPTE_NOEMIE ACOMPTE_NOEMIE
JOIN activite[PX].p_factures ON annee || to_char(code,'FM900000') || '.' || to_char(indice,'FM00') = no_facture
JOIN activite[PX].t_rubriques_facturation ON t_rubriques_facturation.code_original = '*CTI_ACO85'
JOIN activite.t_prestations ON t_prestations.code_original = '*CTI_ACO85'
WHERE ECR_DATE IS NOT NULL AND
ACOMPTE_NOEMIE.MONTANT_REGLE_SI_REPRISE <> 0
;
UPDATE activite[PX].p_factures SET
montant_regle_c = montant_regle_c + montant_acompte,
montant_regle_1_c = montant_regle_1_c + montant_acompte
FROM
(
SELECT no_facture, SUM(montant_regle_1) AS montant_acompte
FROM activite[PX].p_factures_soldes_c
JOIN activite.t_prestations ON prestation_id = t_prestations.oid AND
t_prestations.code_original = '*CTI_ACO85'
GROUP BY 1
HAVING SUM(montant_regle_1) <> 0
) subview
WHERE p_factures.no_facture = subview.no_facture
;
SELECT base.cti_enable_index('activite[PX]', 'i_factures_soldes_c_1');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_soldes_c_2');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_soldes_c_3');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_soldes_c_4');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_soldes_c_8');
]]></sqlcmd>
</NODE>
<NODE label="Lignes non facturées Honoraires">
<sqlcmd><![CDATA[
DROP TABLE IF EXISTS w_LIG_HONOR;
CREATE TEMP TABLE w_LIG_HONOR AS
SELECT
LIG_HONOR.*,
COALESCE(CCAM_RUM.CODE,ACT_PRH,CPH_LHO) AS CCAM_ACTE,
COALESCE(CCAM_RUM.PHASE,'') AS CCAM_PHASE,
COALESCE(CCAM_RUM.ACTIVITE,'1') AS CCAM_ACTIVITE,
COALESCE(SUBSTR(TRIM(CCAM_RUM.MODIFICATEUR)||TRIM(CCAM_RUM.MODIF2)||TRIM(CCAM_RUM.MODIF3)||TRIM(CCAM_RUM.MODIF4)||TRIM(CCAM_RUM.MODIF5),1,1),'') AS CCAM_MODIF1,
COALESCE(SUBSTR(TRIM(CCAM_RUM.MODIFICATEUR)||TRIM(CCAM_RUM.MODIF2)||TRIM(CCAM_RUM.MODIF3)||TRIM(CCAM_RUM.MODIF4)||TRIM(CCAM_RUM.MODIF5),2,1),'') AS CCAM_MODIF2,
COALESCE(SUBSTR(TRIM(CCAM_RUM.MODIFICATEUR)||TRIM(CCAM_RUM.MODIF2)||TRIM(CCAM_RUM.MODIF3)||TRIM(CCAM_RUM.MODIF4)||TRIM(CCAM_RUM.MODIF5),3,1),'') AS CCAM_MODIF3,
COALESCE(SUBSTR(TRIM(CCAM_RUM.MODIFICATEUR)||TRIM(CCAM_RUM.MODIF2)||TRIM(CCAM_RUM.MODIF3)||TRIM(CCAM_RUM.MODIF4)||TRIM(CCAM_RUM.MODIF5),4,1),'') AS CCAM_MODIF4,
COALESCE(CCAM_RUM.EXT_DOC,'') AS CCAM_EXT_DOC,
COALESCE(ACT_PRH,CPH_LHO) AS ACT_LHO,
ANN_LHO || to_char(COD_LHO,'FM900000') AS SEJ_DOS,
ANN_LHO || to_char(COD_LHO,'FM900000') || '.' || to_char(CASE WHEN IND_LHO <> 0 THEN IND_LHO ELSE COALESCE(IND_DOS2_ETA2, IND_LHO) END,'FM9999900') AS no_facture,
COALESCE(ACT_PRH,CPH_LHO) || '|' ||
CPH_LHO || '|' ||
COALESCE(CCAM_RUM.CODE,ACT_PRH,CPH_LHO) || '|' ||
CEX_LHO AS key,
CASE WHEN CASE WHEN IND_LHO <> 0 THEN IND_LHO ELSE COALESCE(IND_DOS2_ETA2, IND_LHO) END = 0 THEN '1' ELSE '0' END AS non_facturee
FROM prod_sigems.LIG_HONOR
JOIN w_DOSSIER_SELECT w_DOSSIER_SELECT ON ANN_LHO = ANN_SELECT AND COD_LHO = COD_SELECT
LEFT JOIN w_DOS2_ETA2 ON ANN_LHO = ANN_DOS2 AND COD_LHO = COD_DOS2
LEFT JOIN prod_sigems.CCAM_RUM ON LIG_HONOR.NUM_LHO = CCAM_RUM.NUM_LHO AND date(DDE_LHO) = date(CCAM_RUM.DAT)
LEFT JOIN prod_sigems.PROD_HONOR ON CPH_LHO = COD_PRH
WHERE
CPH_LHO <> 'ECAH' AND
SER_LHO <> '*CDL';
CREATE INDEX w_LIG_HONOR_i1
ON w_LIG_HONOR
USING btree
(SEJ_DOS);
CREATE INDEX w_LIG_HONOR_i2
ON w_LIG_HONOR
USING btree
(no_facture);
CREATE INDEX w_LIG_HONOR_i3
ON w_LIG_HONOR
USING btree
(NUM_LHO);
CREATE INDEX w_LIG_HONOR_i4
ON w_LIG_HONOR
USING btree
(key);
DROP TABLE IF EXISTS w_factures_last;
CREATE TEMP TABLE w_factures_last AS
SELECT no_sejour,
MAX(no_facture) AS no_facture,
MAX(CASE WHEN code_facture <> '1' THEN no_facture ELSE NULL END) AS no_facture_nf
FROM activite[PX].p_factures
GROUP BY 1;
WITH update_lig_honor AS (
SELECT
w_LIG_HONOR.no_facture,
CASE WHEN ACT_LHO <> 'ACPT' THEN COALESCE(w_factures_last.no_facture_nf,w_factures_last.no_facture) ELSE w_factures_last.no_facture END as new_no_facture
FROM w_LIG_HONOR
JOIN w_factures_last ON w_factures_last.no_sejour = w_LIG_HONOR.SEJ_DOS
LEFT JOIN activite[PX].p_factures ON p_factures.no_facture = w_LIG_HONOR.no_facture
WHERE p_factures.no_facture IS NULL
)
UPDATE w_LIG_HONOR
SET no_facture = new_no_facture
FROM update_lig_honor
WHERE update_lig_honor.no_facture = w_LIG_HONOR.no_facture;
DROP TABLE IF EXISTS w_LIG_HONOR_keys;
CREATE TEMP TABLE w_LIG_HONOR_keys AS
SELECT key,
ACT_LHO,
CCAM_ACTE,
CEX_LHO,
CPH_LHO,
0::bigint AS prestation_id,
0::bigint AS rubrique_facturation_id,
0::bigint AS medecin_facture_id,
0::bigint AS medecin_comptabilise_id,
0::bigint AS acte_id
FROM w_LIG_HONOR
GROUP BY 1,2,3,4,5;
UPDATE activite.t_prestations SET
code_original = ACT_LHO
FROM w_LIG_HONOR_keys
where t_prestations.code_original IS DISTINCT FROM ACT_LHO
AND t_prestations.code = ACT_LHO;
INSERT INTO activite.t_prestations(code_original, code, texte, texte_court)
SELECT ACT_LHO, ACT_LHO, ACT_LHO, ACT_LHO
FROM w_LIG_HONOR_keys
WHERE ACT_LHO <> '' AND
ACT_LHO NOT IN (SELECT code_original FROM activite.t_prestations WHERE code_original IS NOT NULL)
GROUP BY ACT_LHO
ORDER BY ACT_LHO;
UPDATE activite.t_prestations SET
code = ACT_LHO,
texte = ACT_LHO,
texte_court = ACT_LHO
FROM w_LIG_HONOR_keys
WHERE code_original = ACT_LHO AND
(
code IS DISTINCT FROM ACT_LHO OR
texte IS DISTINCT FROM ACT_LHO OR
texte_court IS DISTINCT FROM ACT_LHO
)
;
INSERT INTO activite[PX].t_rubriques_facturation(code_original, code, texte, texte_court)
SELECT ACT_LHO, ACT_LHO, ACT_LHO, ACT_LHO
FROM w_LIG_HONOR_keys
WHERE ACT_LHO <> '' AND
ACT_LHO NOT IN (SELECT code_original FROM activite[PX].t_rubriques_facturation WHERE code_original IS NOT NULL)
GROUP BY ACT_LHO
ORDER BY ACT_LHO
;
INSERT INTO base.t_actes(code, texte, texte_court, nomenclature, ccam_regroupement_id_1, ccam_regroupement_id_4)
SELECT substring(CCAM_ACTE, 1, 7), substring(CCAM_ACTE, 1, 7), substring(CCAM_ACTE, 1, 7), CASE WHEN length(CCAM_ACTE) >= 7 THEN 'CCAM' ELSE 'NGAP' END,
(SELECT oid FROM base.t_ccam_regroupements WHERE code = 'NGAP'), (SELECt oid FROM base.t_ccam_regroupements WHERE code = 'NGAP')
FROM w_LIG_HONOR_keys
WHERE substring(CCAM_ACTE, 1, 7) NOT IN (SELECT code FROM base.t_actes) AND length(CCAM_ACTE) < 7
GROUP BY substring(CCAM_ACTE, 1, 7) ,CASE WHEN length(CCAM_ACTE) >= 7 THEN 'CCAM' ELSE 'NGAP' END
ORDER BY substring(CCAM_ACTE, 1, 7) ;
UPDATE w_LIG_HONOR_keys SET prestation_id = t_prestations.oid
FROM activite.t_prestations
WHERE ACT_LHO = t_prestations.code_original;
UPDATE w_LIG_HONOR_keys SET rubrique_facturation_id = t_rubriques_facturation.oid
FROM activite[PX].t_rubriques_facturation
WHERE CPH_LHO = t_rubriques_facturation.code_original;
UPDATE w_LIG_HONOR_keys SET
acte_id = t_actes.oid
FROM base.t_actes
WHERE substring(CCAM_ACTE, 1, 7) = t_actes.code;
UPDATE w_LIG_HONOR_keys SET
medecin_facture_id = t_medecins_administratifs.oid,
medecin_comptabilise_id = t_medecins_administratifs.oid
FROM activite[PX].t_medecins_administratifs
WHERE CEX_LHO = t_medecins_administratifs.code_original;
CREATE INDEX w_LIG_HONOR_keys_i1
ON w_LIG_HONOR_keys
USING btree
(key);
TRUNCATE activite[PX].p_factures_lignes_non_facturees_h
;
INSERT INTO activite[PX].p_factures_lignes_non_facturees_h(
no_facture,
facture_id,
date_debut,
date_fin,
heure_debut,
nb_rubrique,
coefficient,
medecin_facture_id,
prestation_id,
rubrique_facturation_id,
prix_unitaire,
montant_depassement,
lieu_id,
acte_id,
phase_ccam,
activite_ccam,
extension_ccam,
modificateur_ccam_1,
modificateur_ccam_2,
modificateur_ccam_3,
modificateur_ccam_4
)
SELECT
p_factures.no_facture,
p_factures.oid AS facture_id,
date(DDE_LHO) AS date_debut,
date(DDE_LHO) AS date_fin,
to_number('00' || HEU_LHO, '0000') * 10000 AS heure_debut,
QTE_LHO AS nb_rubrique,
round(CASE WHEN COF_LHO <> 0 THEN COF_LHO ELSE 1.00 END::numeric,2) AS coefficient,
w_LIG_HONOR_keys.medecin_facture_id AS medecin_facture_id,
w_LIG_HONOR_keys.prestation_id AS prestation_id,
w_LIG_HONOR_keys.rubrique_facturation_id AS rubrique_facturation_id,
CASE WHEN (ML1_LHO + ML2_LHO + ML3_LHO) <> 0 AND (QTE_LHO * COF_LHO <> 0) THEN base.cti_division(ML1_LHO + ML2_LHO + ML3_LHO,QTE_LHO * COF_LHO) ELSE round(base.cti_division(BAR_LHO, QTE_LHO * COF_LHO),2) END AS prix_unitaire,
CASE WHEN DEP_LHO IN ('A', 'B', 'C', 'D', 'E', 'F', 'M', 'N') THEN TAR_LHO - BAR_LHO ELSE 0 END AS montant_depassement,
p_sejours.lieu_sortie_id AS lieu_id,
w_LIG_HONOR_keys.acte_id AS acte_id,
CCAM_PHASE AS phase_ccam,
CCAM_ACTIVITE AS activite_ccam,
CCAM_EXT_DOC AS extension_ccam,
CCAM_MODIF1 AS modificateur_ccam_1,
CCAM_MODIF2 AS modificateur_ccam_2,
CCAM_MODIF3 AS modificateur_ccam_3,
CCAM_MODIF4 AS modificateur_ccam_4
FROM w_LIG_HONOR
JOIN activite[PX].p_factures ON w_LIG_HONOR.no_facture = p_factures.no_facture
JOIN activite[PX].p_sejours ON w_LIG_HONOR.SEJ_DOS = p_sejours.code_original
JOIN w_LIG_HONOR_keys ON w_LIG_HONOR.key = w_LIG_HONOR_keys.key
WHERE p_factures.code_facture <> '1' AND
(CASE WHEN (ML1_LHO + ML2_LHO + ML3_LHO) <> 0 AND (QTE_LHO * COF_LHO <> 0) THEN base.cti_division(ML1_LHO + ML2_LHO + ML3_LHO,QTE_LHO * COF_LHO) ELSE round(base.cti_division(BAR_LHO, QTE_LHO * COF_LHO),2) END) <> 0
;
DROP TABLE IF EXISTS w_LIG_HONOR_tmrx;
CREATE TEMP TABLE w_LIG_HONOR_tmrx AS
SELECT no_facture,
SUM(MR1_LHO) AS MR1_LHO,
SUM(MR2_LHO) AS MR2_LHO,
SUM(MR3_LHO) AS MR3_LHO
FROM w_LIG_HONOR
LEFT JOIN prod_sigems.DOS2_LIEN_AVOIR DOS2_LIEN_AVOIR_F ON
DOS2_LIEN_AVOIR_F.ANN = ANN_LHO AND
DOS2_LIEN_AVOIR_F.COD = COD_LHO AND
DOS2_LIEN_AVOIR_F.IND = IND_LHO
LEFT JOIN prod_sigems.DOS2_LIEN_AVOIR DOS2_LIEN_AVOIR_A ON
DOS2_LIEN_AVOIR_A.ANN = ANN_LHO AND
DOS2_LIEN_AVOIR_A.COD = COD_LHO AND
DOS2_LIEN_AVOIR_A.IND_AVOIR = IND_LHO
WHERE ACT_LHO <> 'ECAC' AND
DOS2_LIEN_AVOIR_F.COD IS NULL AND
DOS2_LIEN_AVOIR_A.COD IS NULL
GROUP BY 1;
CREATE INDEX w_LIG_HONOR_tmrx_i1
ON w_LIG_HONOR_tmrx
USING btree
(no_facture);
UPDATE activite[PX].p_factures SET
montant_regle_h = w_LIG_HONOR_tmrx.MR1_LHO + w_LIG_HONOR_tmrx.MR2_LHO + w_LIG_HONOR_tmrx.MR3_LHO,
montant_regle_1_h = w_LIG_HONOR_tmrx.MR1_LHO + CASE WHEN tiers_payant_1_id = tiers_payant_2_id AND tiers_payant_1_id <> 0 THEN w_LIG_HONOR_tmrx.MR2_LHO ELSE 0 END,
montant_regle_2_h = CASE WHEN tiers_payant_1_id <> tiers_payant_2_id THEN w_LIG_HONOR_tmrx.MR2_LHO ELSE 0 END,
montant_regle_0_h = w_LIG_HONOR_tmrx.MR3_LHO
FROM w_LIG_HONOR_tmrx
WHERE p_factures.no_facture = w_LIG_HONOR_tmrx.no_facture AND
(
montant_regle_h <> w_LIG_HONOR_tmrx.MR1_LHO + w_LIG_HONOR_tmrx.MR2_LHO + w_LIG_HONOR_tmrx.MR3_LHO OR
montant_regle_1_h <> (w_LIG_HONOR_tmrx.MR1_LHO + CASE WHEN tiers_payant_1_id = tiers_payant_2_id AND tiers_payant_1_id <> 0 THEN w_LIG_HONOR_tmrx.MR2_LHO ELSE 0 END) OR
montant_regle_2_h <> (CASE WHEN tiers_payant_1_id <> tiers_payant_2_id THEN w_LIG_HONOR_tmrx.MR2_LHO ELSE 0 END) OR
montant_regle_0_h <> w_LIG_HONOR_tmrx.MR3_LHO
);
]]></sqlcmd>
</NODE>
<NODE label="Lignes factures Honoraires">
<sqlcmd><![CDATA[
DROP TABLE IF EXISTS w_REG3_LHO;
CREATE TEMP TABLE w_REG3_LHO AS
SELECT LHO_REG3
FROM prod_sigems.REG3
GROUP BY 1;
ALTER TABLE w_REG3_LHO ADD CONSTRAINT w_REG3_LHO_pkey PRIMARY KEY(LHO_REG3);
DROP TABLE IF EXISTS w_factures_lignes_h;
CREATE TEMP TABLE w_factures_lignes_h AS
SELECT
NUM_LHO,
p_sejours.no_sejour,
p_factures.oid AS facture_id,
w_LIG_HONOR.no_facture AS no_facture,
p_factures.date_vente,
p_factures.code_facture,
date(DDE_LHO) AS date_debut,
to_number('00' || HEU_LHO, '0000') * 10000 AS heure_debut,
date(DDE_LHO) AS date_fin,
QTE_LHO AS nb_rubrique,
QTE_LHO AS nb_prestation,
round(CASE WHEN COF_LHO <> 0 THEN COF_LHO ELSE 1.00 END::numeric,2) AS coefficient,
1::numeric AS coefficient_mco,
w_LIG_HONOR_keys.medecin_facture_id AS medecin_facture_id,
w_LIG_HONOR_keys.medecin_comptabilise_id AS medecin_comptabilise_id,
w_LIG_HONOR.ACT_LHO,
w_LIG_HONOR_keys.prestation_id AS prestation_id,
w_LIG_HONOR_keys.rubrique_facturation_id AS rubrique_facturation_id,
w_LIG_HONOR_keys.acte_id AS acte_id,
CCAM_ACTIVITE AS activite_ccam,
CCAM_EXT_DOC AS extension_ccam,
CCAM_PHASE AS phase_ccam,
CCAM_MODIF1 AS modificateur_ccam_1,
CCAM_MODIF2 AS modificateur_ccam_2,
CCAM_MODIF3 AS modificateur_ccam_3,
CCAM_MODIF4 AS modificateur_ccam_4,
ML1_LHO + ML2_LHO + ML3_LHO AS montant_facture,
ML3_LHO AS montant_facture_0,
ML1_LHO AS montant_facture_1,
ML2_LHO AS montant_facture_2,
0::numeric AS montant_facture_22,
CASE WHEN DEP_LHO IN ('A', 'B', 'C', 'D', 'E', 'F', 'M', 'N') THEN TAR_LHO - BAR_LHO ELSE 0 END AS montant_depassement,
TX3_LHO AS taux_0,
TX1_LHO AS taux_1,
TX2_LHO AS taux_2,
0::numeric AS taux_22,
round(base.cti_division(BAR_LHO, QTE_LHO * COF_LHO),2) AS prix_unitaire,
p_sejours.lieu_sortie_id AS lieu_id,
ML1_LHO + ML2_LHO + ML3_LHO AS montant_comptabilise,
ML3_LHO AS montant_comptabilise_0,
ML1_LHO + CASE WHEN p_factures.tiers_payant_1_id = p_factures.tiers_payant_2_id AND p_factures.tiers_payant_1_id <> 0 THEN ML2_LHO ELSE 0 END AS montant_comptabilise_1,
CASE WHEN p_factures.tiers_payant_1_id <> p_factures.tiers_payant_2_id THEN ML2_LHO ELSE 0 END AS montant_comptabilise_2,
0::numeric AS montant_comptabilise_22,
MR1_LHO + MR2_LHO + MR3_LHO AS montant_regle,
MR3_LHO AS montant_regle_0,
MR1_LHO + CASE WHEN p_factures.tiers_payant_1_id = p_factures.tiers_payant_2_id AND p_factures.tiers_payant_1_id <> 0 THEN MR2_LHO ELSE 0 END AS montant_regle_1,
CASE WHEN p_factures.tiers_payant_1_id <> p_factures.tiers_payant_2_id THEN MR2_LHO ELSE 0 END AS montant_regle_2,
0::numeric AS montant_regle_22,
0::numeric AS montant_encours,
0::numeric AS montant_encours_0,
0::numeric AS montant_encours_1,
0::numeric AS montant_encours_2,
0::numeric AS montant_encours_22,
0::numeric AS montant_facture_actes_inclus_dans_sejour,
0::numeric AS montant_facture_0_actes_inclus_dans_sejour,
0::numeric AS montant_facture_1_actes_inclus_dans_sejour,
0::numeric AS montant_facture_2_actes_inclus_dans_sejour,
0::numeric AS montant_facture_22_actes_inclus_dans_sejour
FROM w_LIG_HONOR
JOIN activite[PX].p_factures ON w_LIG_HONOR.no_facture = p_factures.no_facture
JOIN activite[PX].p_sejours ON w_LIG_HONOR.SEJ_DOS = p_sejours.code_original
JOIN w_LIG_HONOR_keys ON w_LIG_HONOR.key = w_LIG_HONOR_keys.key
LEFT JOIN w_REG3_LHO ON w_LIG_HONOR.NUM_LHO = w_REG3_LHO.LHO_REG3
WHERE (p_factures.code_facture = '1' AND w_LIG_HONOR.non_facturee <> '1') OR
(w_LIG_HONOR.ACT_LHO <> 'ECAH' AND w_LIG_HONOR.ACT_LHO <> 'REGH') OR
w_REG3_LHO.LHO_REG3 IS NOT NULL;
;
CREATE INDEX w_factures_lignes_h_i1
ON w_factures_lignes_h
USING btree
(NUM_LHO);
CREATE INDEX w_factures_lignes_h_i2
ON w_factures_lignes_h
USING btree
(no_sejour);
-- Lieu exécution
UPDATE w_factures_lignes_h
SET lieu_id = p_mouvements_sejour.lieu_id
FROM
activite[PX].p_mouvements_sejour
WHERE
w_factures_lignes_h.no_sejour = p_mouvements_sejour.no_sejour AND
w_factures_lignes_h.date_fin = p_mouvements_sejour.date AND
(230000 BETWEEN p_mouvements_sejour.heure_debut AND p_mouvements_sejour.heure_fin OR
nb_entrees_directes = 1 AND heure_fin = 240000 OR
nb_sorties_directes = 1 ) AND
w_factures_lignes_h.lieu_id <> p_mouvements_sejour.lieu_id;
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_h_1');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_h_2');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_h_3');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_h_4');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_h_5');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_h_6');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_h_7');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_h_8');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_h_9');
INSERT INTO activite[PX].p_factures_lignes_h (
facture_id,
no_facture,
date_debut,
date_fin,
nb_rubrique,
nb_prestation,
coefficient,
coefficient_mco,
medecin_facture_id,
medecin_comptabilise_id,
prestation_id,
rubrique_facturation_id,
acte_id,
activite_ccam,
extension_ccam,
phase_ccam,
modificateur_ccam_1,
modificateur_ccam_2,
modificateur_ccam_3,
modificateur_ccam_4,
montant_facture,
montant_facture_0,
montant_facture_1,
montant_facture_2,
montant_facture_22,
montant_depassement,
taux_0,
taux_1,
taux_2,
taux_22,
prix_unitaire,
lieu_id,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
montant_encours,
montant_encours_0,
montant_encours_1,
montant_encours_2,
montant_encours_22,
montant_facture_actes_inclus_dans_sejour,
montant_facture_0_actes_inclus_dans_sejour,
montant_facture_1_actes_inclus_dans_sejour,
montant_facture_2_actes_inclus_dans_sejour,
montant_facture_22_actes_inclus_dans_sejour
)
SELECT
facture_id,
no_facture,
date_debut,
date_fin,
nb_rubrique,
nb_prestation,
coefficient,
coefficient_mco,
medecin_facture_id,
medecin_comptabilise_id,
prestation_id,
rubrique_facturation_id,
acte_id,
activite_ccam,
extension_ccam,
phase_ccam,
modificateur_ccam_1,
modificateur_ccam_2,
modificateur_ccam_3,
modificateur_ccam_4,
montant_facture,
montant_facture_0,
montant_facture_1,
montant_facture_2,
montant_facture_22,
montant_depassement,
taux_0,
taux_1,
taux_2,
taux_22,
prix_unitaire,
lieu_id,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
montant_encours,
montant_encours_0,
montant_encours_1,
montant_encours_2,
montant_encours_22,
montant_facture_actes_inclus_dans_sejour,
montant_facture_0_actes_inclus_dans_sejour,
montant_facture_1_actes_inclus_dans_sejour,
montant_facture_2_actes_inclus_dans_sejour,
montant_facture_22_actes_inclus_dans_sejour
FROM w_factures_lignes_h
WHERE code_facture = '1' AND ACT_LHO <> 'ACPT' ;
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_h_1');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_h_2');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_h_3');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_h_4');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_h_5');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_h_6');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_h_7');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_h_8');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_h_9');
]]></sqlcmd>
</NODE>
<NODE label="Transformations honoraires GHM Grenoble">
<condition><![CDATA[
"[ENV_FINESS]" == "380012658"
]]></condition>
<sqlcmd><![CDATA[
-- actes réalisés par des libéraux
-- Transformation de la rubrique en rubrioque-LIB pour isoler du chiffre d'affaires
DROP TABLE IF EXISTS w_transform_ghm_honlib;
CREATE TEMP TABLE w_transform_ghm_honlib AS
SELECT p_factures_lignes_h.no_facture,
medecin_facture_id,
rubrique_facturation_id,
0::bigint AS rubrique_facturation_lib_id
FROM activite[PX].p_factures_lignes_h
JOIN activite[PX].p_factures ON p_factures_lignes_h.no_facture = p_factures.no_facture
JOIN activite[PX].p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
JOIN activite[PX].t_rubriques_facturation ON rubrique_facturation_id = t_rubriques_facturation.oid
JOIN activite[PX].t_medecins_administratifs ON medecin_facture_id = t_medecins_administratifs.oid
WHERE substr(t_medecins_administratifs.code,6,1) = 'L' AND
code_facture >= '1' AND
p_factures.no_facture NOT LIKE '%BG' AND
t_rubriques_facturation.code NOT LIKE '%-TM' AND
t_rubriques_facturation.code NOT LIKE '%-LIB' AND
(montant_comptabilise_1 <> 0 OR montant_comptabilise_2 <> 0 OR montant_comptabilise_0 <> 0)
GROUP BY 1,2,3
;
CREATE INDEX w_transform_ghm_honlib_i1
ON w_transform_ghm_honlib
USING btree
(no_facture)
;
CREATE INDEX w_transform_ghm_honlib_i2
ON w_transform_ghm_honlib
USING btree
(rubrique_facturation_id)
;
INSERT INTO activite[PX].t_rubriques_facturation (code_original, code, texte, texte_court)
SELECT t_rubriques_facturation.code_original || '-LIB', t_rubriques_facturation.code || '-LIB', 'Libéraux ' || t_rubriques_facturation.texte, 'Libéraux ' || t_rubriques_facturation.texte
FROM w_transform_ghm_honlib
JOIN activite[PX].t_rubriques_facturation ON rubrique_facturation_id = t_rubriques_facturation.oid
WHERE (t_rubriques_facturation.code_original || '-LIB') NOT IN (SELECT code_original FROM activite[PX].t_rubriques_facturation WHERE code_original IS NOT NULL)
GROUP BY 1,2,3,4
;
UPDATE w_transform_ghm_honlib
SET rubrique_facturation_lib_id = t_rubriques_facturation_dep.oid
FROM activite[PX].t_rubriques_facturation
JOIN activite[PX].t_rubriques_facturation t_rubriques_facturation_dep ON (t_rubriques_facturation.code_original || '-LIB') = t_rubriques_facturation_dep.code_original
WHERE w_transform_ghm_honlib.rubrique_facturation_id = t_rubriques_facturation.oid
;
UPDATE activite[PX].p_factures_lignes_h SET
rubrique_facturation_id = rubrique_facturation_lib_id,
rubrique_comptabilisation_id = rubrique_facturation_lib_id
FROM w_transform_ghm_honlib
WHERE p_factures_lignes_h.no_facture = w_transform_ghm_honlib.no_facture AND
p_factures_lignes_h.medecin_facture_id = w_transform_ghm_honlib.medecin_facture_id AND
p_factures_lignes_h.rubrique_facturation_id = w_transform_ghm_honlib.rubrique_facturation_id
;
-- ticket modérateur des actes hospitalisés
-- Transformation de la rubrique en rubrioque-TM pour isoler du chiffre d'affaires
DROP TABLE IF EXISTS w_transform_ghm_tmhosp;
CREATE TEMP TABLE w_transform_ghm_tmhosp AS
SELECT p_factures_lignes_h.no_facture,
rubrique_facturation_id,
0::bigint AS rubrique_facturation_tm_id
FROM activite[PX].p_factures_lignes_h
JOIN activite[PX].p_factures ON p_factures_lignes_h.no_facture = p_factures.no_facture
JOIN activite[PX].p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
JOIN activite[PX].t_rubriques_facturation ON rubrique_facturation_id = t_rubriques_facturation.oid
WHERE type_sejour <> '3' AND
type_sejour <> '9' AND
code_facture >= '1' AND
p_factures.no_facture NOT LIKE '%BG' AND
t_rubriques_facturation.code NOT LIKE '%-TM' AND
t_rubriques_facturation.code NOT LIKE '%-LIB' AND
(montant_comptabilise_1 <> 0 OR montant_comptabilise_2 <> 0 OR montant_comptabilise_0 <> 0)
GROUP BY 1,2
;
CREATE INDEX w_transform_ghm_tmhosp_i1
ON w_transform_ghm_tmhosp
USING btree
(no_facture)
;
CREATE INDEX w_transform_ghm_tmhosp_i2
ON w_transform_ghm_tmhosp
USING btree
(rubrique_facturation_id)
;
INSERT INTO activite[PX].t_rubriques_facturation (code_original, code, texte, texte_court)
SELECT t_rubriques_facturation.code_original || '-TM', t_rubriques_facturation.code || '-TM', 'Ticket modérateur ' || t_rubriques_facturation.texte, 'Ticket modérateur ' || t_rubriques_facturation.texte
FROM w_transform_ghm_tmhosp
JOIN activite[PX].t_rubriques_facturation ON rubrique_facturation_id = t_rubriques_facturation.oid
WHERE (t_rubriques_facturation.code_original || '-TM') NOT IN (SELECT code_original FROM activite[PX].t_rubriques_facturation WHERE code_original IS NOT NULL)
GROUP BY 1,2,3,4
;
UPDATE w_transform_ghm_tmhosp
SET rubrique_facturation_tm_id = t_rubriques_facturation_dep.oid
FROM activite[PX].t_rubriques_facturation
JOIN activite[PX].t_rubriques_facturation t_rubriques_facturation_dep ON (t_rubriques_facturation.code_original || '-TM') = t_rubriques_facturation_dep.code_original
WHERE w_transform_ghm_tmhosp.rubrique_facturation_id = t_rubriques_facturation.oid
;
UPDATE activite[PX].p_factures_lignes_h SET
rubrique_facturation_id = rubrique_facturation_tm_id,
rubrique_comptabilisation_id = rubrique_facturation_tm_id
FROM w_transform_ghm_tmhosp
WHERE p_factures_lignes_h.no_facture = w_transform_ghm_tmhosp.no_facture AND
p_factures_lignes_h.rubrique_facturation_id = w_transform_ghm_tmhosp.rubrique_facturation_id
;
]]></sqlcmd>
</NODE>
<NODE label="Compte client Honoraires">
<sqlcmd><![CDATA[
SELECT base.cti_disable_index('activite[PX]', 'i_factures_soldes_h_1');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_soldes_h_3');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_soldes_h_4');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_soldes_h_8');
-- Hors budget global
INSERT INTO activite[PX].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
)
SELECT
facture_id,
no_facture,
date_vente,
medecin_comptabilise_id,
prestation_id,
rubrique_facturation_id,
SUM(montant_comptabilise),
SUM(montant_comptabilise_0),
SUM(montant_comptabilise_1),
SUM(montant_comptabilise_2),
SUM(montant_comptabilise_22),
0,
0,
0,
0,
0
FROM w_factures_lignes_h
JOIN activite[PX].p_sejours ON w_factures_lignes_h.no_sejour = p_sejours.no_sejour AND p_sejours.est_budget_global IS DISTINCT FROM '1'
WHERE date_vente IS NOT NULL AND
code_facture = '1' AND
(montant_comptabilise <> 0 OR
montant_comptabilise_0 <> 0 OR
montant_comptabilise_1 <> 0 OR
montant_comptabilise_2 <> 0 OR
montant_comptabilise_22 <> 0
)
GROUP BY 1,2,3,4,5,6;
INSERT INTO activite[PX].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(DAT_REG),
medecin_comptabilise_id,
prestation_id,
rubrique_facturation_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,
SUM(MR1_LHO + MR2_LHO + MR3_LHO) AS montant_regle,
SUM(MR3_LHO) AS montant_regle_0,
SUM(MR1_LHO) AS montant_regle_1,
SUM(MR2_LHO) AS montant_regle_2,
0 AS montant_regle_22,
CASE WHEN is_acompte = '1' THEN '1' ELSE '0' END AS od_non_comptabilise
FROM w_factures_lignes_h
JOIN activite[PX].p_sejours ON w_factures_lignes_h.no_sejour = p_sejours.no_sejour AND p_sejours.est_budget_global IS DISTINCT FROM '1'
JOIN w_LIG_HONOR_mrx ON w_factures_lignes_h.NUM_LHO = w_LIG_HONOR_mrx.NUM_LHO
GROUP BY 1,2,3,4,5,6, is_acompte;
-- Montants réguls ou depassement non affectés
INSERT INTO activite[PX].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
)
SELECT
p_factures.oid AS facture_id,
p_factures.no_facture,
DAT_REG AS date_comptable,
0::bigint AS medecin_comptabilise_id,
0::bigint AS prestation_id,
0::bigint AS rubrique_comptabilisee_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,
SUM(COALESCE(MON_REG2::numeric,0)) AS montant_regle,
SUM(CASE WHEN CAI_REG IS DISTINCT FROM CP1_DOS2 AND CAI_REG IS DISTINCT FROM CA2_DOS2 AND (CAI_REG <> ALL(CP1_DOS2_array) OR CP1_DOS2_array IS NULL) AND (CAI_REG <> ALL(CA2_DOS2_array) OR CA2_DOS2_array IS NULL) THEN COALESCE(MON_REG2::numeric,0) ELSE 0 END) AS montant_regle_0,
SUM(CASE WHEN CAI_REG = CP1_DOS2 OR CAI_REG = ANY(CP1_DOS2_array) THEN COALESCE(MON_REG2::numeric,0) ELSE 0 END) AS montant_regle_1,
SUM(CASE WHEN (CAI_REG = CA2_DOS2 OR CAI_REG = ANY(CA2_DOS2_array)) AND CAI_REG <> CP1_DOS2 THEN COALESCE(MON_REG2::numeric,0) ELSE 0 END) AS montant_regle_2,
0::numeric AS montant_regle_22
FROM prod_sigems.REG2
JOIN prod_sigems.REG ON SER_REG2 = SER_REG
JOIN prod_sigems.DOS2 ON ANN_REG2 = ANN_DOS2 AND COD_REG2 = COD_DOS2 AND IND_REG2 = IND_DOS2 AND ETA_DOS2 >= 1
JOIN activite[PX].p_factures ON no_facture = ANN_REG2 || to_char(COD_REG2,'FM900000') || '.' || to_char(IND_REG2,'FM00')
LEFT JOIN w_DOS2_TP ON ANN_REG2 = ANN_DOS2_TP AND COD_REG2 = COD_DOS2_TP
WHERE HOC_REG2 = 'a'
GROUP BY 1,2,3
;
-- Budget Global (sur ets)
INSERT INTO activite[PX].p_factures_soldes_c(
facture_id,
no_facture,
date_comptable,
rubrique_comptabilisee_id,
prestation_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
)
SELECT
facture_id,
no_facture,
date_vente,
rubrique_facturation_id,
prestation_id,
SUM(montant_comptabilise),
SUM(montant_comptabilise_0),
SUM(montant_comptabilise_1),
SUM(montant_comptabilise_2),
SUM(montant_comptabilise_22),
0,
0,
0,
0,
0
FROM w_factures_lignes_h
JOIN activite[PX].p_sejours ON w_factures_lignes_h.no_sejour = p_sejours.no_sejour AND p_sejours.est_budget_global = '1'
WHERE date_vente IS NOT NULL AND
code_facture = '1' AND
(montant_comptabilise <> 0 OR
montant_comptabilise_0 <> 0 OR
montant_comptabilise_1 <> 0 OR
montant_comptabilise_2 <> 0 OR
montant_comptabilise_22 <> 0
)
GROUP BY 1,2,3,4,5;
INSERT INTO activite[PX].p_factures_soldes_c(
facture_id,
no_facture,
date_comptable,
rubrique_comptabilisee_id,
prestation_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
)
SELECT
facture_id,
no_facture,
date(DAT_REG),
rubrique_facturation_id,
prestation_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,
SUM(MR1_LHO + MR2_LHO + MR3_LHO) AS montant_regle,
SUM(MR3_LHO) AS montant_regle_0,
SUM(MR1_LHO) AS montant_regle_1,
SUM(MR2_LHO) AS montant_regle_2,
0 AS montant_regle_22
FROM w_factures_lignes_h
JOIN activite[PX].p_sejours ON w_factures_lignes_h.no_sejour = p_sejours.no_sejour AND p_sejours.est_budget_global = '1'
JOIN w_LIG_HONOR_mrx ON w_factures_lignes_h.NUM_LHO = w_LIG_HONOR_mrx.NUM_LHO
GROUP BY 1,2,3,4,5;
SELECT base.cti_enable_index('activite[PX]', 'i_factures_soldes_h_1');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_soldes_h_3');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_soldes_h_4');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_soldes_h_8');
]]></sqlcmd>
</NODE>
<NODE label="Budget global MCO">
<condition><![CDATA[
"[ENV_TYPEETS]" != "1" && "[ENV_WITHPMSI]" == "1"
]]></condition>
<sqlcmd><![CDATA[
-- Correction des GHM/GHS activité selon PMSI
UPDATE activite[PX].p_sejours SET
ghm_id = t_ghm.oid,
ghs_id = t_ghs.oid
FROM activite[PX].p_sejour_pmsi
JOIN pmsi.p_rss ON p_sejour_pmsi.rss_id = p_rss.oid
JOIN pmsi.t_ghm t_ghm_pmsi ON p_rss.ghm_id = t_ghm_pmsi.oid
JOIN pmsi.t_ghs t_ghs_pmsi ON p_rss.ghs_id = t_ghs_pmsi.oid
JOIN base.t_ghm ON t_ghm_pmsi.code = t_ghm.code
JOIN base.t_ghs ON t_ghs_pmsi.code = t_ghs.code
WHERE p_sejour_pmsi.sejour_id = p_sejours.oid AND
p_rss.ghm_id > 0 AND
p_sejours.ghm_id <= 0 AND
t_ghm_pmsi.code NOT LIKE '90%' AND
t_ghm_pmsi.code NOT LIKE '99%'
;
ANALYSE activite[PX].p_sejours;
ANALYSE activite[PX].p_factures;
ANALYSE activite[PX].p_factures_lignes_c;
-- Mise à jour date début PMSI pour EXH
UPDATE pmsi.p_rsf_detail
SET date_debut = date_debut_new
FROM
(
SELECT rss_id, prestation_id, date_debut, date_fin, nombre, date(date_sortie - (nombre||' days')::interval) AS date_debut_new
FROM pmsi.p_rsf_detail
JOIN pmsi.t_prestations on prestation_id = t_prestations.oid
JOIN pmsi.p_rss ON rss_id = p_rss.oid
WHERE t_prestations.code = 'EXH' AND
date_debut = date_entree AND
date(date_sortie - (nombre||' days')::interval) > date_entree
) subview
WHERE p_rsf_detail.rss_id = subview.rss_id AND
p_rsf_detail.prestation_id = subview.prestation_id AND
p_rsf_detail.date_debut = subview.date_debut AND
p_rsf_detail.date_fin = subview.date_fin AND
p_rsf_detail.nombre = subview.nombre
;
-- Ajout des prestations PMSI aux prestations activité
INSERT INTO activite[PX].t_rubriques_facturation(code_original, code, texte, texte_court)
SELECT
t_prestations_pmsi.code,
t_prestations_pmsi.code,
t_prestations_pmsi.texte,
t_prestations_pmsi.texte
FROM pmsi.p_rsf_detail
JOIN pmsi.p_rss ON p_rss.oid = p_rsf_detail.rss_id AND p_rss.etat = '' AND p_rss.en_cours = '0'
JOIN pmsi.t_prestations t_prestations_pmsi ON t_prestations_pmsi.oid = p_rsf_detail.prestation_id
JOIN base.t_finess ON p_rss.finess = t_finess.code AND t_finess.type_etablissement <> '1'
JOIN activite[PX].p_sejours on no_sejour_administratif = p_sejours.no_sejour AND p_sejours.est_budget_global = '1'
LEFT JOIN activite[PX].t_rubriques_facturation ON t_rubriques_facturation.code = t_prestations_pmsi.code
WHERE est_ligne_rss = '1' AND p_rss.en_cours = '0' AND
operation_lamda IS DISTINCT FROM '1' AND
operation_lamda IS DISTINCT FROM '2' AND
t_rubriques_facturation.oid IS NULL
GROUP BY 1,2,3,4;
-- Ajout des prestations PMSI aux rubriques activité
INSERT INTO activite.t_prestations(code_original, code, texte, texte_court)
SELECT
t_prestations_pmsi.code,
t_prestations_pmsi.code,
t_prestations_pmsi.texte,
t_prestations_pmsi.texte
FROM pmsi.p_rsf_detail
JOIN pmsi.p_rss ON p_rss.oid = p_rsf_detail.rss_id AND p_rss.etat = '' AND p_rss.en_cours = '0'
JOIN pmsi.t_prestations t_prestations_pmsi ON t_prestations_pmsi.oid = p_rsf_detail.prestation_id
JOIN base.t_finess ON p_rss.finess = t_finess.code AND t_finess.type_etablissement <> '1'
JOIN activite[PX].p_sejours on no_sejour_administratif = p_sejours.no_sejour AND p_sejours.est_budget_global = '1'
LEFT JOIN activite.t_prestations t_prestations_activite ON t_prestations_activite.code = t_prestations_pmsi.code
WHERE est_ligne_rss = '1' AND p_rss.en_cours = '0' AND
operation_lamda IS DISTINCT FROM '1' AND
operation_lamda IS DISTINCT FROM '2' AND
t_prestations_activite.oid IS NULL
GROUP BY 1,2,3,4;
-- Lignes PMSI à ajouter
DROP TABLE IF EXISTS w_factures_lignes_pmsi;
CREATE TEMP TABLE w_factures_lignes_pmsi AS
SELECT
row_number() OVER() AS sequence,
p_sejours.no_sejour,
p_sejours.oid AS sejour_id,
p_sejours.no_sejour || '.BG' AS no_facture,
0::bigint AS facture_id,
p_rss.traitement_epmsi,
CASE WHEN p_rsf_detail.type = 'C' THEN 'H' ELSE 'C' END AS clinique_honoraire,
p_rsf_detail.date_debut,
CASE WHEN p_sejours.type_sejour <> '5' THEN p_rsf_detail.date_fin ELSE p_rsf_detail.date_debut END AS date_fin,
p_rsf_detail.nombre AS nb_rubrique,
p_rsf_detail.nombre AS nb_prestation,
p_rsf_detail.coefficient AS coefficient,
p_rsf_detail.coefficient_mco,
COALESCE(t_rubriques_facturation.oid,0::bigint) AS rubrique_facturation_id,
COALESCE(t_rubriques_facturation.oid,0::bigint) AS rubrique_comptabilisation_id,
COALESCE(t_prestations_activite.oid,0::bigint) AS prestation_id,
CASE WHEN p_rss.traitement_epmsi IN ('30','31','32','33') THEN p_rsf_detail.sejour_remboursable ELSE 0 END AS montant_facture,
0::numeric AS montant_facture_0,
CASE WHEN p_rss.traitement_epmsi IN ('30','31','32','33') THEN p_rsf_detail.sejour_remboursable ELSE 0 END AS montant_facture_1,
0::numeric AS montant_facture_2,
0::numeric AS montant_facture_22,
0::numeric AS taux_0,
p_rsf_detail.taux_remboursement AS taux_1,
0::numeric AS taux_2,
0::numeric AS taux_22,
p_rsf_detail.prix_unitaire,
p_sejours.lieu_sortie_id AS lieu_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 AS montant_encours,
0::numeric AS montant_encours_0,
0::numeric AS montant_encours_1,
0::numeric AS montant_encours_2,
0::numeric AS montant_encours_22,
0::numeric AS montant_facture_actes_inclus_dans_sejour,
0::numeric AS montant_facture_0_actes_inclus_dans_sejour,
0::numeric AS montant_facture_1_actes_inclus_dans_sejour,
0::numeric AS montant_facture_2_actes_inclus_dans_sejour,
0::numeric AS montant_facture_22_actes_inclus_dans_sejour,
CASE WHEN p_rsf_detail.type = 'C' THEN 2::bigint ELSE 1::bigint END AS origine_facturation_id,
CASE WHEN p_rss.traitement_epmsi IN ('30','31','32','33') THEN p_rsf_detail.sejour_remboursable ELSE 0 END AS montant_comptabilise_budget_global_1,
0::numeric AS protocole_id,
0::numeric AS compte_produit_id,
t_prestations_pmsi.code AS prestation_code,
''::text AS uf_code,
''::text AS dmt_code,
''::text AS mt_code
FROM pmsi.p_rsf_detail
JOIN pmsi.p_rss ON p_rss.oid = p_rsf_detail.rss_id AND p_rss.etat = '' AND p_rss.en_cours = '0'
JOIN pmsi.t_prestations t_prestations_pmsi ON t_prestations_pmsi.oid = p_rsf_detail.prestation_id
JOIN base.t_finess ON p_rss.finess = t_finess.code AND t_finess.type_etablissement <> '1'
JOIN activite[PX].p_sejour_pmsi ON p_rss.oid = p_sejour_pmsi.rss_id
JOIN activite[PX].p_sejours on p_sejour_pmsi.no_sejour = p_sejours.no_sejour AND p_sejours.est_budget_global = '1'
LEFT JOIN activite.t_prestations t_prestations_activite ON t_prestations_activite.code = t_prestations_pmsi.code
LEFT JOIN activite[PX].t_rubriques_facturation ON t_rubriques_facturation.code = t_prestations_pmsi.code
WHERE est_ligne_rss = '1' AND p_rss.en_cours = '0' AND
p_rss.etat = '' AND
operation_lamda IS DISTINCT FROM '1' AND
operation_lamda IS DISTINCT FROM '2' AND
p_rsf_detail.fides_detail = 0
;
-- Eclatement des supplements par jour
DROP TABLE IF EXISTS w_factures_lignes_pmsi_sup_c;
CREATE TEMP TABLE w_factures_lignes_pmsi_sup_c AS
SELECT
date(p_sejours.date_entree) AS date_debut_ghs,
date(p_sejours.date_sortie - interval '1 day') AS date_fin_ghs,
(date(date_sortie) - date(date_entree)) * CASE WHEN nb_prestation < 0 THEN -1 ELSE 1 END AS nb_prestation_ghs,
CASE WHEN t_prestations.code = 'GHS' THEN date(date_entree + interval '1 day') ELSE date(date_debut + interval '1 day') END AS date_debut_det,
CASE WHEN t_prestations.code = 'GHS' THEN date(p_sejours.date_sortie - interval '1 day') ELSE date(date_debut + ((ABS(nb_prestation)-1)||' days')::interval) END AS date_fin_det,
ABS(CASE WHEN t_prestations.code = 'GHS' THEN date(date_sortie) - date(date_entree) ELSE nb_prestation END) AS nb_det,
w_factures_lignes_pmsi.*
FROM w_factures_lignes_pmsi
JOIN activite[PX].p_sejours ON w_factures_lignes_pmsi.no_sejour = p_sejours.no_sejour
JOIN activite.t_prestations ON prestation_id = t_prestations.oid AND
(
code IN ('PJ', 'FJ', 'SSM', 'GHS', 'EXH', 'SRC', 'REA', 'STF', 'NN1', 'NN2', 'NN3', 'CP', 'CPC', 'SHO') OR
t_prestations.type_ventilation_jour = '1'
)
WHERE (nb_prestation > 1 or nb_prestation < -1 OR (t_prestations.code = 'GHS' AND p_sejours.type_sejour != '5' AND date(date_sortie) - date(date_entree) > 1))
;
UPDATE w_factures_lignes_pmsi_sup_c SET
date_fin_ghs = date(date_debut_exh - interval '1 day'),
date_fin_det = date(date_debut_exh - interval '1 day'),
nb_prestation_ghs = date(date_debut_exh - interval '1 day') - date_debut_ghs + 1,
nb_det = date(date_debut_exh - interval '1 day') - date_debut_ghs + 1
FROM (
SELECT no_facture, date(MIN(date_debut)) AS date_debut_exh
FROM w_factures_lignes_pmsi
JOIN activite.t_prestations ON prestation_id = t_prestations.oid AND code = 'EXH'
GROUP BY 1) subview
WHERE w_factures_lignes_pmsi_sup_c.no_facture = subview.no_facture AND
w_factures_lignes_pmsi_sup_c.prestation_code = 'GHS';
CREATE INDEX w_factures_lignes_pmsi_sup_c_i1
ON w_factures_lignes_pmsi_sup_c
USING btree
(date_debut);
DROP TABLE IF EXISTS w_factures_lignes_pmsi_sup_c_sup;
CREATE TEMP TABLE w_factures_lignes_pmsi_sup_c_sup AS
SELECT sequence,
w_factures_lignes_pmsi_sup_c.no_sejour,
w_factures_lignes_pmsi_sup_c.sejour_id,
w_factures_lignes_pmsi_sup_c.no_facture,
w_factures_lignes_pmsi_sup_c.facture_id,
w_factures_lignes_pmsi_sup_c.traitement_epmsi,
w_factures_lignes_pmsi_sup_c.clinique_honoraire,
p_calendrier.date AS date_debut,
p_calendrier.date AS date_fin,
CASE WHEN prestation_code = 'GHS' AND date <> date_fin_ghs THEN 0 WHEN nb_prestation < 0 THEN -1 ELSE 1 END AS nb_rubrique,
CASE WHEN prestation_code = 'GHS' AND date <> date_fin_ghs THEN 0 WHEN nb_prestation < 0 THEN -1 ELSE 1 END AS nb_prestation,
w_factures_lignes_pmsi_sup_c.coefficient,
w_factures_lignes_pmsi_sup_c.coefficient_mco,
w_factures_lignes_pmsi_sup_c.rubrique_facturation_id,
w_factures_lignes_pmsi_sup_c.rubrique_comptabilisation_id,
w_factures_lignes_pmsi_sup_c.prestation_id,
round(montant_facture / ABS(nb_det),2) AS montant_facture,
round(montant_facture_0 / ABS(nb_det),2) AS montant_facture_0,
round(montant_facture_1 / ABS(nb_det),2) AS montant_facture_1,
round(montant_facture_2 / ABS(nb_det),2) AS montant_facture_2,
round(montant_facture_22 / ABS(nb_det),2) AS montant_facture_22,
w_factures_lignes_pmsi_sup_c.taux_0,
w_factures_lignes_pmsi_sup_c.taux_1,
w_factures_lignes_pmsi_sup_c.taux_2,
w_factures_lignes_pmsi_sup_c.taux_22,
w_factures_lignes_pmsi_sup_c.prix_unitaire,
w_factures_lignes_pmsi_sup_c.lieu_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 AS montant_encours,
0::numeric AS montant_encours_0,
0::numeric AS montant_encours_1,
0::numeric AS montant_encours_2,
0::numeric AS montant_encours_22,
0::numeric AS montant_facture_actes_inclus_dans_sejour,
0::numeric AS montant_facture_0_actes_inclus_dans_sejour,
0::numeric AS montant_facture_1_actes_inclus_dans_sejour,
0::numeric AS montant_facture_2_actes_inclus_dans_sejour,
0::numeric AS montant_facture_22_actes_inclus_dans_sejour,
w_factures_lignes_pmsi_sup_c.origine_facturation_id,
round(montant_comptabilise_budget_global_1 / ABS(nb_det),2) AS montant_comptabilise_budget_global_1,
w_factures_lignes_pmsi_sup_c.protocole_id,
w_factures_lignes_pmsi_sup_c.compte_produit_id,
w_factures_lignes_pmsi_sup_c.prestation_code,
w_factures_lignes_pmsi_sup_c.uf_code,
w_factures_lignes_pmsi_sup_c.dmt_code,
w_factures_lignes_pmsi_sup_c.mt_code
FROM w_factures_lignes_pmsi_sup_c
JOIN base.p_calendrier ON p_calendrier.date BETWEEN date_debut_det AND date_fin_det
;
DROP TABLE IF EXISTS w_factures_lignes_pmsi_sup_c_sup_tot;
CREATE TEMP TABLE w_factures_lignes_pmsi_sup_c_sup_tot AS
SELECT sequence,
SUM(nb_rubrique) AS nb_rubrique,
SUM(nb_prestation) AS nb_prestation,
SUM(montant_facture) AS montant_facture,
SUM(montant_facture_0) AS montant_facture_0,
SUM(montant_facture_1) AS montant_facture_1,
SUM(montant_facture_2) AS montant_facture_2,
SUM(montant_facture_22) AS montant_facture_22,
SUM(montant_comptabilise) AS montant_comptabilise,
SUM(montant_comptabilise_0) AS montant_comptabilise_0,
SUM(montant_comptabilise_1) AS montant_comptabilise_1,
SUM(montant_comptabilise_2) AS montant_comptabilise_2,
SUM(montant_comptabilise_22) AS montant_comptabilise_22,
SUM(montant_encours) AS montant_encours,
SUM(montant_encours_0) AS montant_encours_0,
SUM(montant_encours_1) AS montant_encours_1,
SUM(montant_encours_2) AS montant_encours_2,
SUM(montant_encours_22) AS montant_encours_22,
SUM(montant_facture_actes_inclus_dans_sejour) AS montant_facture_actes_inclus_dans_sejour,
SUM(montant_facture_0_actes_inclus_dans_sejour) AS montant_facture_0_actes_inclus_dans_sejour,
SUM(montant_facture_1_actes_inclus_dans_sejour) AS montant_facture_1_actes_inclus_dans_sejour,
SUM(montant_facture_2_actes_inclus_dans_sejour) AS montant_facture_2_actes_inclus_dans_sejour,
SUM(montant_facture_22_actes_inclus_dans_sejour) AS montant_facture_22_actes_inclus_dans_sejour,
SUM(montant_comptabilise_budget_global_1) AS montant_comptabilise_budget_global_1
FROM w_factures_lignes_pmsi_sup_c_sup
GROUP BY 1;
UPDATE w_factures_lignes_pmsi
SET
date_fin = w_factures_lignes_pmsi.date_debut,
nb_rubrique = w_factures_lignes_pmsi.nb_rubrique - w_factures_lignes_pmsi_sup_c_sup_tot.nb_rubrique,
nb_prestation = w_factures_lignes_pmsi.nb_prestation - w_factures_lignes_pmsi_sup_c_sup_tot.nb_prestation,
montant_facture = w_factures_lignes_pmsi.montant_facture - w_factures_lignes_pmsi_sup_c_sup_tot.montant_facture,
montant_facture_0 = w_factures_lignes_pmsi.montant_facture_0 - w_factures_lignes_pmsi_sup_c_sup_tot.montant_facture_0,
montant_facture_1 = w_factures_lignes_pmsi.montant_facture_1 - w_factures_lignes_pmsi_sup_c_sup_tot.montant_facture_1,
montant_facture_2 = w_factures_lignes_pmsi.montant_facture_2 - w_factures_lignes_pmsi_sup_c_sup_tot.montant_facture_2,
montant_facture_22 = w_factures_lignes_pmsi.montant_facture_22 - w_factures_lignes_pmsi_sup_c_sup_tot.montant_facture_22,
montant_comptabilise = w_factures_lignes_pmsi.montant_comptabilise - w_factures_lignes_pmsi_sup_c_sup_tot.montant_comptabilise,
montant_comptabilise_0 = w_factures_lignes_pmsi.montant_comptabilise_0 - w_factures_lignes_pmsi_sup_c_sup_tot.montant_comptabilise_0,
montant_comptabilise_1 = w_factures_lignes_pmsi.montant_comptabilise_1 - w_factures_lignes_pmsi_sup_c_sup_tot.montant_comptabilise_1,
montant_comptabilise_2 = w_factures_lignes_pmsi.montant_comptabilise_2 - w_factures_lignes_pmsi_sup_c_sup_tot.montant_comptabilise_2,
montant_comptabilise_22 = w_factures_lignes_pmsi.montant_comptabilise_22 - w_factures_lignes_pmsi_sup_c_sup_tot.montant_comptabilise_22,
montant_encours = w_factures_lignes_pmsi.montant_encours - w_factures_lignes_pmsi_sup_c_sup_tot.montant_encours,
montant_encours_0 = w_factures_lignes_pmsi.montant_encours_0 - w_factures_lignes_pmsi_sup_c_sup_tot.montant_encours_0,
montant_encours_1 = w_factures_lignes_pmsi.montant_encours_1 - w_factures_lignes_pmsi_sup_c_sup_tot.montant_encours_1,
montant_encours_2 = w_factures_lignes_pmsi.montant_encours_2 - w_factures_lignes_pmsi_sup_c_sup_tot.montant_encours_2,
montant_encours_22 = w_factures_lignes_pmsi.montant_encours_22 - w_factures_lignes_pmsi_sup_c_sup_tot.montant_encours_22,
montant_facture_actes_inclus_dans_sejour = w_factures_lignes_pmsi.montant_facture_actes_inclus_dans_sejour - w_factures_lignes_pmsi_sup_c_sup_tot.montant_facture_actes_inclus_dans_sejour,
montant_facture_0_actes_inclus_dans_sejour = w_factures_lignes_pmsi.montant_facture_0_actes_inclus_dans_sejour - w_factures_lignes_pmsi_sup_c_sup_tot.montant_facture_0_actes_inclus_dans_sejour,
montant_facture_1_actes_inclus_dans_sejour = w_factures_lignes_pmsi.montant_facture_1_actes_inclus_dans_sejour - w_factures_lignes_pmsi_sup_c_sup_tot.montant_facture_1_actes_inclus_dans_sejour,
montant_facture_2_actes_inclus_dans_sejour = w_factures_lignes_pmsi.montant_facture_2_actes_inclus_dans_sejour - w_factures_lignes_pmsi_sup_c_sup_tot.montant_facture_2_actes_inclus_dans_sejour,
montant_facture_22_actes_inclus_dans_sejour = w_factures_lignes_pmsi.montant_facture_22_actes_inclus_dans_sejour - w_factures_lignes_pmsi_sup_c_sup_tot.montant_facture_22_actes_inclus_dans_sejour,
montant_comptabilise_budget_global_1 = w_factures_lignes_pmsi.montant_comptabilise_budget_global_1 - w_factures_lignes_pmsi_sup_c_sup_tot.montant_comptabilise_budget_global_1
FROM w_factures_lignes_pmsi_sup_c_sup_tot
WHERE w_factures_lignes_pmsi.sequence = w_factures_lignes_pmsi_sup_c_sup_tot.sequence;
INSERT INTO w_factures_lignes_pmsi(
sequence,
no_sejour,
sejour_id,
no_facture,
facture_id,
traitement_epmsi,
clinique_honoraire,
date_debut,
date_fin,
nb_rubrique,
nb_prestation,
coefficient,
coefficient_mco,
rubrique_facturation_id,
rubrique_comptabilisation_id,
prestation_id,
montant_facture,
montant_facture_0,
montant_facture_1,
montant_facture_2,
montant_facture_22,
taux_0,
taux_1,
taux_2,
taux_22,
prix_unitaire,
lieu_id,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
montant_encours,
montant_encours_0,
montant_encours_1,
montant_encours_2,
montant_encours_22,
montant_facture_actes_inclus_dans_sejour,
montant_facture_0_actes_inclus_dans_sejour,
montant_facture_1_actes_inclus_dans_sejour,
montant_facture_2_actes_inclus_dans_sejour,
montant_facture_22_actes_inclus_dans_sejour,
origine_facturation_id,
montant_comptabilise_budget_global_1,
protocole_id,
compte_produit_id,
prestation_code,
uf_code,
dmt_code,
mt_code
)
SELECT
sequence,
no_sejour,
sejour_id,
no_facture,
facture_id,
traitement_epmsi,
clinique_honoraire,
date_debut,
date_fin,
nb_rubrique,
nb_prestation,
coefficient,
coefficient_mco,
rubrique_facturation_id,
rubrique_comptabilisation_id,
prestation_id,
montant_facture,
montant_facture_0,
montant_facture_1,
montant_facture_2,
montant_facture_22,
taux_0,
taux_1,
taux_2,
taux_22,
prix_unitaire,
lieu_id,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
montant_encours,
montant_encours_0,
montant_encours_1,
montant_encours_2,
montant_encours_22,
montant_facture_actes_inclus_dans_sejour,
montant_facture_0_actes_inclus_dans_sejour,
montant_facture_1_actes_inclus_dans_sejour,
montant_facture_2_actes_inclus_dans_sejour,
montant_facture_22_actes_inclus_dans_sejour,
origine_facturation_id,
montant_comptabilise_budget_global_1,
protocole_id,
compte_produit_id,
prestation_code,
uf_code,
dmt_code,
mt_code
FROM w_factures_lignes_pmsi_sup_c_sup
;
-- compte
UPDATE w_factures_lignes_pmsi
SET uf_code = t_unites_fonctionnelles.code,
dmt_code = CASE WHEN t_dmt.oid <> 0 THEN t_dmt.code ELSE '' END,
mt_code = CASE WHEN t_modes_traitement.oid <> 0 THEN CASE WHEN t_modes_traitement.code <> '23' THEN t_modes_traitement.code ELSE '04' END ELSE '' END
FROM activite[PX].t_lieux
JOIN activite[PX].t_unites_fonctionnelles ON unite_fonctionnelle_id = t_unites_fonctionnelles.oid
JOIN activite[PX].t_services_facturation On service_facturation_id = t_services_facturation.oid
JOIN base.t_dmt ON dmt_id = t_dmt.oid
JOIN base.t_modes_traitement ON t_services_facturation.mode_traitement_id = t_modes_traitement.oid
WHERE lieu_id = t_lieux.oid;
UPDATE w_factures_lignes_pmsi
SET compte_produit_id = t_compte.oid
FROM prod_sigems.ANALYG
JOIN activite[PX].t_compte ON CPT_ANA = t_compte.code
WHERE compte_produit_id = 0 AND
PRD_ANA = prestation_code AND
SER_ANA = uf_code AND
DMT_ANA = dmt_code AND
MDT_ANA = mt_code AND
CPT_ANA <> '';
UPDATE w_factures_lignes_pmsi
SET compte_produit_id = t_compte.oid
FROM prod_sigems.ANALYG
JOIN activite[PX].t_compte ON CPT_ANA = t_compte.code
WHERE compte_produit_id = 0 AND
PRD_ANA = prestation_code AND
SER_ANA = uf_code AND
DMT_ANA = '' AND
MDT_ANA = mt_code AND
CPT_ANA <> '';
UPDATE w_factures_lignes_pmsi
SET compte_produit_id = t_compte.oid
FROM prod_sigems.ANALYG
JOIN activite[PX].t_compte ON CPT_ANA = t_compte.code
WHERE compte_produit_id = 0 AND
PRD_ANA = prestation_code AND
SER_ANA = uf_code AND
DMT_ANA = dmt_code AND
MDT_ANA = '' AND
CPT_ANA <> '';
UPDATE w_factures_lignes_pmsi
SET compte_produit_id = t_compte.oid
FROM prod_sigems.ANALYG
JOIN activite[PX].t_compte ON CPT_ANA = t_compte.code
WHERE compte_produit_id = 0 AND
PRD_ANA = prestation_code AND
SER_ANA = uf_code AND
DMT_ANA = '' AND
MDT_ANA = '' AND
CPT_ANA <> '';
UPDATE w_factures_lignes_pmsi
SET compte_produit_id = t_compte.oid
FROM prod_sigems.ANALYG
JOIN activite[PX].t_compte ON CPT_ANA = t_compte.code
WHERE compte_produit_id = 0 AND
PRD_ANA = prestation_code AND
SER_ANA = '' AND
DMT_ANA = dmt_code AND
MDT_ANA = mt_code AND
CPT_ANA <> '';
UPDATE w_factures_lignes_pmsi
SET compte_produit_id = t_compte.oid
FROM prod_sigems.ANALYG
JOIN activite[PX].t_compte ON CPT_ANA = t_compte.code
WHERE compte_produit_id = 0 AND
PRD_ANA = prestation_code AND
SER_ANA = '' AND
DMT_ANA = '' AND
MDT_ANA = mt_code AND
CPT_ANA <> '';
UPDATE w_factures_lignes_pmsi
SET compte_produit_id = t_compte.oid
FROM prod_sigems.ANALYG
JOIN activite[PX].t_compte ON CPT_ANA = t_compte.code
WHERE compte_produit_id = 0 AND
PRD_ANA = prestation_code AND
SER_ANA = '' AND
DMT_ANA = dmt_code AND
MDT_ANA = '' AND
CPT_ANA <> '';
UPDATE w_factures_lignes_pmsi
SET compte_produit_id = t_compte.oid
FROM prod_sigems.ANALYG
JOIN activite[PX].t_compte ON CPT_ANA = t_compte.code
WHERE compte_produit_id = 0 AND
PRD_ANA = prestation_code AND
SER_ANA = '' AND
DMT_ANA = '' AND
MDT_ANA = '' AND
CPT_ANA <> '';
UPDATE w_factures_lignes_pmsi
SET compte_produit_id = t_compte.oid
FROM prod_sigems.PROD_CLINI
JOIN activite[PX].t_compte ON AFA_PRC = t_compte.code
WHERE compte_produit_id = 0 AND
COD_PRC = prestation_code;
UPDATE w_factures_lignes_pmsi
SET compte_produit_id = t_compte.oid
FROM prod_sigems.PROD_CLINI
JOIN activite[PX].t_compte ON AFA_PRC = t_compte.code
WHERE compte_produit_id = 0 AND
LIB_PRC = prestation_code;
UPDATE w_factures_lignes_pmsi
SET compte_produit_id = t_compte.oid
FROM prod_sigems.ANALYG
JOIN activite[PX].t_compte ON CPT_ANA = t_compte.code
WHERE compte_produit_id = 0 AND
PRD_ANA = trim(substr(prestation_code,1,4)) AND
SER_ANA = '' AND
DMT_ANA = '' AND
MDT_ANA = '' AND
CPT_ANA <> '';
CREATE INDEX w_factures_lignes_pmsi_i1
ON w_factures_lignes_pmsi
USING btree
(no_sejour);
-- Factures de base
DROP TABLE IF EXISTS w_factures_pmsi_base;
CREATE TEMP TABLE w_factures_pmsi_base AS
SELECT p_factures.no_sejour,
(MAX(Array[CASE WHEN p_factures.code_facture <> '0' THEN p_factures.date_facture ELSE '00010101' END::text,p_factures.no_facture]))[2] AS no_facture_base
FROM pmsi.p_rss
JOIN base.t_finess ON p_rss.finess = t_finess.code AND t_finess.type_etablissement <> '1'
JOIN activite[PX].p_sejour_pmsi ON p_rss.oid = p_sejour_pmsi.rss_id
JOIN activite[PX].p_sejours on p_sejour_pmsi.no_sejour = p_sejours.no_sejour AND p_sejours.est_budget_global = '1'
JOIN activite[PX].p_factures ON p_sejours.no_sejour = p_factures.no_sejour
WHERE p_rss.etat = '' AND
p_rss.en_cours = '0'
GROUP BY 1;
CREATE INDEX w_factures_pmsi_base_i1
ON w_factures_pmsi_base
USING btree
(no_sejour);
CREATE INDEX w_factures_pmsi_base_i2
ON w_factures_pmsi_base
USING btree
(no_facture_base);
-- Factures à créer
DROP TABLE IF EXISTS w_factures_pmsi;
CREATE TEMP TABLE w_factures_pmsi AS
SELECT
w_factures_lignes_pmsi.no_sejour,
w_factures_lignes_pmsi.sejour_id,
w_factures_lignes_pmsi.no_facture,
p_sejours.date_entree AS date_debut,
p_sejours.date_sortie AS date_fin,
'0'::text AS type_facture,
MAX(CASE WHEN w_factures_lignes_pmsi.traitement_epmsi IN ('30','31','32','33') THEN '1'::text ELSE '0' END) AS code_facture,
MAX(CASE
WHEN p_factures_base.date_facture IS NULL THEN p_sejours.date_sortie
WHEN p_factures_base.date_facture <> '20991231' THEN p_factures_base.date_facture
WHEN p_sejours.date_groupage <> '20991231' THEN p_sejours.date_groupage
ELSE p_sejours.date_sortie END)::date AS date_facture,
MAX(COALESCE(p_factures_base.code_vente,'1')) AS code_vente,
MAX(COALESCE(p_factures_base.mois_vente,209912)) AS mois_vente,
MAX(COALESCE(p_factures_base.date_facture,p_sejours.date_sortie)) AS date_solde,
'0'::text AS particularite_t2a,
MAX(COALESCE(p_factures_base.date_vente,p_sejours.date_sortie)) AS date_vente,
''::text AS code_cloture,
MAX(p_sejours.code_cp_demandee) AS code_cp_demandee,
'20991231'::date AS date_encours,
MAX(p_sejours.ghs_id) AS ghs_id,
MAX(p_sejours.ghs_bebe1_id) AS ghs_bebe1_id,
MAX(p_sejours.ghs_bebe2_id) AS ghs_bebe2_id,
MAX(p_sejours.ghs_bebe3_id) AS ghs_bebe3_id,
MAX(p_sejours.ghm_id) AS ghm_id,
SUM(montant_facture) AS montant_facture_c,
0::numeric AS montant_facture_h,
0::numeric AS montant_regle_c,
0::numeric AS montant_regle_h,
0::numeric AS delai_facture,
0::numeric AS delai_solde,
'20991231'::date AS date_expedition,
0::numeric AS delai_expedition,
MAX(p_sejours.tiers_payant_1_id) AS tiers_payant_1_id,
MAX(p_sejours.tiers_payant_2_id) AS tiers_payant_2_id,
MAX(p_sejours.tiers_payant_22_id) AS tiers_payant_22_id,
MAX(p_sejours.tiers_payant_0_id) AS tiers_payant_0_id,
'20991231'::date AS date_solde_0_c,
'20991231'::date AS date_solde_0_h,
'20991231'::date AS date_solde_1_c,
'20991231'::date AS date_solde_1_h,
'20991231'::date AS date_solde_2_c,
'20991231'::date AS date_solde_2_h,
'20991231'::date AS date_solde_22_c,
'20991231'::date AS date_solde_22_h,
'20991231'::date AS date_expedition_0,
'20991231'::date AS date_expedition_1,
'20991231'::date AS date_expedition_2,
'20991231'::date AS date_expedition_22,
'0'::text AS code_expedie_0,
'0'::text AS code_expedie_1,
'0'::text AS code_expedie_2,
'0'::text AS code_expedie_22,
''::text AS no_bordereau_0,
''::text AS no_bordereau_1,
''::text AS no_bordereau_2,
''::text AS no_bordereau_22,
0::numeric AS montant_facture_0_c,
0::numeric AS montant_facture_0_h,
SUM(montant_facture) AS montant_facture_1_c,
0::numeric AS montant_facture_1_h,
0::numeric AS montant_facture_2_c,
0::numeric AS montant_facture_2_h,
0::numeric AS montant_facture_22_c,
0::numeric AS montant_facture_22_h,
0::numeric AS montant_regle_0_c,
0::numeric AS montant_regle_0_h,
0::numeric AS montant_regle_1_c,
0::numeric AS montant_regle_1_h,
0::numeric AS montant_regle_2_c,
0::numeric AS montant_regle_2_h,
0::numeric AS montant_regle_22_c,
0::numeric AS montant_regle_22_h,
0::numeric AS delai_expedition_0,
0::numeric AS delai_expedition_1,
0::numeric AS delai_expedition_2,
0::numeric AS delai_expedition_22,
0::numeric AS delai_solde_0_c,
0::numeric AS delai_solde_0_h,
0::numeric AS delai_solde_1_c,
0::numeric AS delai_solde_1_h,
0::numeric AS delai_solde_2_c,
0::numeric AS delai_solde_2_h,
0::numeric AS delai_solde_22_c,
0::numeric AS delai_solde_22_h,
0::numeric AS montant_encours_c,
0::numeric AS montant_encours_0_c,
0::numeric AS montant_encours_1_c,
0::numeric AS montant_encours_2_c,
0::numeric AS montant_encours_22_c,
0::numeric AS montant_encours_h,
0::numeric AS montant_encours_0_h,
0::numeric AS montant_encours_1_h,
0::numeric AS montant_encours_2_h,
0::numeric AS montant_encours_22_h,
0::numeric AS nb_rejets,
0::numeric AS montant_comptabilise_c,
0::numeric AS montant_comptabilise_h,
0::numeric AS montant_comptabilise_0_c,
0::numeric AS montant_comptabilise_0_h,
0::numeric AS montant_comptabilise_1_c,
0::numeric AS montant_comptabilise_1_h,
0::numeric AS montant_comptabilise_2_c,
0::numeric AS montant_comptabilise_2_h,
0::numeric AS montant_comptabilise_22_c,
0::numeric AS montant_comptabilise_22_h,
w_factures_lignes_pmsi.no_facture AS no_facture_reference,
0::bigint AS facture_reference_id,
'20991231'::date AS date_solde_reference,
'20991231'::date AS date_solde_reference_c,
'20991231'::date AS date_solde_reference_h,
'20991231'::date AS date_solde_reference_0_c,
'20991231'::date AS date_solde_reference_1_c,
'20991231'::date AS date_solde_reference_2_c,
'20991231'::date AS date_solde_reference_22_c,
'20991231'::date AS date_solde_reference_0_h,
'20991231'::date AS date_solde_reference_1_h,
'20991231'::date AS date_solde_reference_2_h,
'20991231'::date AS date_solde_reference_22_h,
'20991231'::date AS date_solde_c,
'20991231'::date AS date_solde_h,
0::numeric AS montant_facture_c_actes_inclus_dans_sejour,
0::numeric AS montant_facture_h_actes_inclus_dans_sejour,
SUM(montant_comptabilise_budget_global_1) AS montant_comptabilise_budget_global_c,
'' AS no_facture_od_avoir,
0::bigint AS facture_od_avoir_id
FROM w_factures_lignes_pmsi
JOIN activite[PX].p_sejours ON w_factures_lignes_pmsi.no_sejour = p_sejours.no_sejour
JOIN w_factures_pmsi_base ON w_factures_lignes_pmsi.no_sejour = w_factures_pmsi_base.no_sejour
LEFT JOIN activite[PX].p_factures p_factures_base ON w_factures_pmsi_base.no_facture_base = p_factures_base.no_facture AND 1 <> 1
GROUP BY 1,2,3,4,5;
INSERT INTO w_factures_pmsi
SELECT
p_sejours.no_sejour,
p_sejours.oid AS sejour_id,
p_sejours.no_sejour || '.BG',
p_sejours.date_entree AS date_debut,
p_sejours.date_sortie AS date_fin,
'0'::text AS type_facture,
'1'::text AS code_facture,
MAX(CASE
WHEN p_sejours.date_groupage <> '20991231' THEN p_sejours.date_groupage
ELSE p_sejours.date_sortie END)::date AS date_facture,
'1' AS code_vente,
209912 AS mois_vente,
'20991231' AS date_solde,
'0'::text AS particularite_t2a,
'20991231' AS date_vente,
''::text AS code_cloture,
MAX(p_sejours.code_cp_demandee) AS code_cp_demandee,
'20991231'::date AS date_encours,
MAX(p_sejours.ghs_id) AS ghs_id,
MAX(p_sejours.ghs_bebe1_id) AS ghs_bebe1_id,
MAX(p_sejours.ghs_bebe2_id) AS ghs_bebe2_id,
MAX(p_sejours.ghs_bebe3_id) AS ghs_bebe3_id,
MAX(p_sejours.ghm_id) AS ghm_id,
0 AS montant_facture_c,
0::numeric AS montant_facture_h,
0::numeric AS montant_regle_c,
0::numeric AS montant_regle_h,
0::numeric AS delai_facture,
0::numeric AS delai_solde,
'20991231'::date AS date_expedition,
0::numeric AS delai_expedition,
MAX(p_sejours.tiers_payant_1_id) AS tiers_payant_1_id,
MAX(p_sejours.tiers_payant_2_id) AS tiers_payant_2_id,
MAX(p_sejours.tiers_payant_22_id) AS tiers_payant_22_id,
MAX(p_sejours.tiers_payant_0_id) AS tiers_payant_0_id,
'20991231'::date AS date_solde_0_c,
'20991231'::date AS date_solde_0_h,
'20991231'::date AS date_solde_1_c,
'20991231'::date AS date_solde_1_h,
'20991231'::date AS date_solde_2_c,
'20991231'::date AS date_solde_2_h,
'20991231'::date AS date_solde_22_c,
'20991231'::date AS date_solde_22_h,
'20991231'::date AS date_expedition_0,
'20991231'::date AS date_expedition_1,
'20991231'::date AS date_expedition_2,
'20991231'::date AS date_expedition_22,
'0'::text AS code_expedie_0,
'0'::text AS code_expedie_1,
'0'::text AS code_expedie_2,
'0'::text AS code_expedie_22,
''::text AS no_bordereau_0,
''::text AS no_bordereau_1,
''::text AS no_bordereau_2,
''::text AS no_bordereau_22,
0::numeric AS montant_facture_0_c,
0::numeric AS montant_facture_0_h,
0::numeric AS montant_facture_1_c,
0::numeric AS montant_facture_1_h,
0::numeric AS montant_facture_2_c,
0::numeric AS montant_facture_2_h,
0::numeric AS montant_facture_22_c,
0::numeric AS montant_facture_22_h,
0::numeric AS montant_regle_0_c,
0::numeric AS montant_regle_0_h,
0::numeric AS montant_regle_1_c,
0::numeric AS montant_regle_1_h,
0::numeric AS montant_regle_2_c,
0::numeric AS montant_regle_2_h,
0::numeric AS montant_regle_22_c,
0::numeric AS montant_regle_22_h,
0::numeric AS delai_expedition_0,
0::numeric AS delai_expedition_1,
0::numeric AS delai_expedition_2,
0::numeric AS delai_expedition_22,
0::numeric AS delai_solde_0_c,
0::numeric AS delai_solde_0_h,
0::numeric AS delai_solde_1_c,
0::numeric AS delai_solde_1_h,
0::numeric AS delai_solde_2_c,
0::numeric AS delai_solde_2_h,
0::numeric AS delai_solde_22_c,
0::numeric AS delai_solde_22_h,
0::numeric AS montant_encours_c,
0::numeric AS montant_encours_0_c,
0::numeric AS montant_encours_1_c,
0::numeric AS montant_encours_2_c,
0::numeric AS montant_encours_22_c,
0::numeric AS montant_encours_h,
0::numeric AS montant_encours_0_h,
0::numeric AS montant_encours_1_h,
0::numeric AS montant_encours_2_h,
0::numeric AS montant_encours_22_h,
0::numeric AS nb_rejets,
0::numeric AS montant_comptabilise_c,
0::numeric AS montant_comptabilise_h,
0::numeric AS montant_comptabilise_0_c,
0::numeric AS montant_comptabilise_0_h,
0::numeric AS montant_comptabilise_1_c,
0::numeric AS montant_comptabilise_1_h,
0::numeric AS montant_comptabilise_2_c,
0::numeric AS montant_comptabilise_2_h,
0::numeric AS montant_comptabilise_22_c,
0::numeric AS montant_comptabilise_22_h,
p_sejours.no_sejour || '.BG' AS no_facture_reference,
0::bigint AS facture_reference_id,
'20991231'::date AS date_solde_reference,
'20991231'::date AS date_solde_reference_c,
'20991231'::date AS date_solde_reference_h,
'20991231'::date AS date_solde_reference_0_c,
'20991231'::date AS date_solde_reference_1_c,
'20991231'::date AS date_solde_reference_2_c,
'20991231'::date AS date_solde_reference_22_c,
'20991231'::date AS date_solde_reference_0_h,
'20991231'::date AS date_solde_reference_1_h,
'20991231'::date AS date_solde_reference_2_h,
'20991231'::date AS date_solde_reference_22_h,
'20991231'::date AS date_solde_c,
'20991231'::date AS date_solde_h,
0::numeric AS montant_facture_c_actes_inclus_dans_sejour,
0::numeric AS montant_facture_h_actes_inclus_dans_sejour,
0::numeric AS montant_comptabilise_budget_global_c,
'' AS no_facture_od_avoir,
0::bigint AS facture_od_avoir_id
FROM pmsi.p_rss
JOIN base.t_finess ON p_rss.finess = t_finess.code AND t_finess.type_etablissement <> '1'
JOIN activite[PX].p_sejours on no_sejour_administratif = p_sejours.no_sejour AND p_sejours.est_budget_global = '1'
LEFT JOIN w_factures_pmsi ON p_sejours.no_sejour = w_factures_pmsi.no_sejour
WHERE p_rss.en_cours = '0' AND
p_rss.etat = '' AND
p_rss.traitement_epmsi IN ('30','31','32','33') AND
w_factures_pmsi.no_facture IS NULL AND
p_sejours.date_sortie >= '[ENV_ADM_ANNEEDEBUT]0101' AND
p_sejours.no_sejour NOT IN
(
SELECT p_factures.no_sejour
FROM activite[PX].p_factures
WHERE montant_facture_1_c <> 0
)
GROUP BY 1,2,3,4,5;
UPDATE w_factures_pmsi
SET date_vente = date_facture, mois_vente = date_part('year',date_facture)*100 + date_part('month',date_facture)
WHERE date_vente = '20991231' AND
code_facture = '1';
UPDATE w_factures_pmsi
SET date_solde = date_facture
WHERE date_vente IS DISTINCT FROM date_facture;
-- Ajout des factures
INSERT INTO activite[PX].p_factures
(no_sejour, no_facture, date_debut, date_fin, type_facture,
code_facture, date_facture, code_vente, mois_vente, date_solde,
montant_facture_c, montant_facture_h, montant_regle_c, montant_regle_h,
delai_facture, delai_solde, date_expedition, delai_expedition,
tiers_payant_1_id, tiers_payant_2_id, tiers_payant_22_id, tiers_payant_0_id,
date_solde_0_c, date_solde_0_h, date_solde_1_c, date_solde_1_h,
date_solde_2_c, date_solde_2_h, date_solde_22_c, date_solde_22_h,
date_expedition_0, date_expedition_1, date_expedition_2, date_expedition_22,
code_expedie_0, code_expedie_1, code_expedie_2, code_expedie_22,
no_bordereau_0, no_bordereau_1, no_bordereau_2, no_bordereau_22,
montant_facture_0_c, montant_facture_0_h, montant_facture_1_c,
montant_facture_1_h, montant_facture_2_c, montant_facture_2_h,
montant_facture_22_c, montant_facture_22_h, montant_regle_0_c,
montant_regle_0_h, montant_regle_1_c, montant_regle_1_h, montant_regle_2_c,
montant_regle_2_h, montant_regle_22_c, montant_regle_22_h, delai_expedition_0,
delai_expedition_1, delai_expedition_2, delai_expedition_22,
delai_solde_0_c, delai_solde_0_h, delai_solde_1_c, delai_solde_1_h,
delai_solde_2_c, delai_solde_2_h, delai_solde_22_c, delai_solde_22_h,
ghs_id, particularite_t2a, date_vente, code_cloture, montant_encours_c,
montant_encours_0_c, montant_encours_1_c, montant_encours_2_c,
montant_encours_22_c, montant_encours_h, montant_encours_0_h,
montant_encours_1_h, montant_encours_2_h, montant_encours_22_h,
code_cp_demandee, date_encours, ghs_bebe1_id, ghs_bebe2_id, ghs_bebe3_id,
nb_rejets, montant_comptabilise_c, montant_comptabilise_h, montant_comptabilise_0_c,
montant_comptabilise_0_h, montant_comptabilise_1_c, montant_comptabilise_1_h,
montant_comptabilise_2_c, montant_comptabilise_2_h, montant_comptabilise_22_c,
montant_comptabilise_22_h, no_facture_reference, date_solde_reference,
date_solde_reference_c, date_solde_reference_h, date_solde_reference_0_c,
date_solde_reference_1_c, date_solde_reference_2_c, date_solde_reference_22_c,
date_solde_reference_0_h, date_solde_reference_1_h, date_solde_reference_2_h,
date_solde_reference_22_h, date_solde_c, date_solde_h, montant_facture_c_actes_inclus_dans_sejour,
montant_facture_h_actes_inclus_dans_sejour, montant_comptabilise_budget_global_c,
no_facture_od_avoir, sejour_id, facture_reference_id, facture_od_avoir_id,
ghm_id)
SELECt no_sejour, no_facture, date_debut, date_fin, type_facture,
code_facture, date_facture, code_vente, mois_vente, date_solde,
montant_facture_c, montant_facture_h, montant_regle_c, montant_regle_h,
delai_facture, delai_solde, date_expedition, delai_expedition,
tiers_payant_1_id, tiers_payant_2_id, tiers_payant_22_id, tiers_payant_0_id,
date_solde_0_c, date_solde_0_h, date_solde_1_c, date_solde_1_h,
date_solde_2_c, date_solde_2_h, date_solde_22_c, date_solde_22_h,
date_expedition_0, date_expedition_1, date_expedition_2, date_expedition_22,
code_expedie_0, code_expedie_1, code_expedie_2, code_expedie_22,
no_bordereau_0, no_bordereau_1, no_bordereau_2, no_bordereau_22,
montant_facture_0_c, montant_facture_0_h, montant_facture_1_c,
montant_facture_1_h, montant_facture_2_c, montant_facture_2_h,
montant_facture_22_c, montant_facture_22_h, montant_regle_0_c,
montant_regle_0_h, montant_regle_1_c, montant_regle_1_h, montant_regle_2_c,
montant_regle_2_h, montant_regle_22_c, montant_regle_22_h, delai_expedition_0,
delai_expedition_1, delai_expedition_2, delai_expedition_22,
delai_solde_0_c, delai_solde_0_h, delai_solde_1_c, delai_solde_1_h,
delai_solde_2_c, delai_solde_2_h, delai_solde_22_c, delai_solde_22_h,
ghs_id, particularite_t2a, date_vente, code_cloture, montant_encours_c,
montant_encours_0_c, montant_encours_1_c, montant_encours_2_c,
montant_encours_22_c, montant_encours_h, montant_encours_0_h,
montant_encours_1_h, montant_encours_2_h, montant_encours_22_h,
code_cp_demandee, date_encours, ghs_bebe1_id, ghs_bebe2_id, ghs_bebe3_id,
nb_rejets, montant_comptabilise_c, montant_comptabilise_h, montant_comptabilise_0_c,
montant_comptabilise_0_h, montant_comptabilise_1_c, montant_comptabilise_1_h,
montant_comptabilise_2_c, montant_comptabilise_2_h, montant_comptabilise_22_c,
montant_comptabilise_22_h, no_facture_reference, date_solde_reference,
date_solde_reference_c, date_solde_reference_h, date_solde_reference_0_c,
date_solde_reference_1_c, date_solde_reference_2_c, date_solde_reference_22_c,
date_solde_reference_0_h, date_solde_reference_1_h, date_solde_reference_2_h,
date_solde_reference_22_h, date_solde_c, date_solde_h, montant_facture_c_actes_inclus_dans_sejour,
montant_facture_h_actes_inclus_dans_sejour, montant_comptabilise_budget_global_c,
no_facture_od_avoir, sejour_id, facture_reference_id, facture_od_avoir_id,
ghm_id
FROM w_factures_pmsi;
-- Ajout des lignes
INSERT INTO activite[PX].p_factures_lignes_c(
no_facture, date_debut, date_fin, nb_rubrique, coefficient, coefficient_mco,
rubrique_facturation_id, prestation_id, montant_facture, montant_facture_0,
montant_facture_1, montant_facture_2, montant_facture_22, taux_0,
taux_1, taux_2, taux_22, finess, prix_unitaire, lieu_id, nb_prestation,
montant_comptabilise, montant_comptabilise_0, montant_comptabilise_1,
montant_comptabilise_2, montant_comptabilise_22, rubrique_comptabilisation_id,
montant_encours, montant_encours_0, montant_encours_1, montant_encours_2,
montant_encours_22, montant_facture_actes_inclus_dans_sejour,
montant_facture_0_actes_inclus_dans_sejour, montant_facture_1_actes_inclus_dans_sejour,
montant_facture_2_actes_inclus_dans_sejour, montant_facture_22_actes_inclus_dans_sejour,
origine_facturation_id, montant_comptabilise_budget_global_1,
facture_id, protocole_id, compte_produit_id)
SELECT
p_factures.no_facture, w_factures_lignes_pmsi.date_debut, w_factures_lignes_pmsi.date_fin, nb_rubrique, coefficient, coefficient_mco,
rubrique_facturation_id, prestation_id, montant_facture, montant_facture_0,
montant_facture_1, montant_facture_2, montant_facture_22, taux_0,
taux_1, taux_2, taux_22, finess, prix_unitaire, lieu_id, nb_prestation,
montant_comptabilise, montant_comptabilise_0, montant_comptabilise_1,
montant_comptabilise_2, montant_comptabilise_22, rubrique_comptabilisation_id,
montant_encours, montant_encours_0, montant_encours_1, montant_encours_2,
montant_encours_22, montant_facture_actes_inclus_dans_sejour,
montant_facture_0_actes_inclus_dans_sejour, montant_facture_1_actes_inclus_dans_sejour,
montant_facture_2_actes_inclus_dans_sejour, montant_facture_22_actes_inclus_dans_sejour,
origine_facturation_id, montant_comptabilise_budget_global_1,
p_factures.oid AS facture_id, protocole_id, compte_produit_id
FROM w_factures_lignes_pmsi
JOIN activite[PX].p_factures ON w_factures_lignes_pmsi.no_facture = p_factures.no_facture ;
-- Lieu exécution
UPDATE activite[PX].p_factures_lignes_c
SET lieu_id = p_mouvements_sejour.lieu_id
FROM
activite[PX].p_factures ,
activite[PX].p_mouvements_sejour
WHERE
p_factures_lignes_c.no_facture = p_factures.no_facture AND
p_factures.no_sejour = p_mouvements_sejour.no_sejour AND
p_factures_lignes_c.date_fin = p_mouvements_sejour.date AND
(230000 BETWEEN p_mouvements_sejour.heure_debut AND p_mouvements_sejour.heure_fin OR
nb_entrees_directes = 1 AND heure_fin = 240000 OR
nb_sorties_directes = 1 ) AND
p_factures_lignes_c.lieu_id <> p_mouvements_sejour.lieu_id;
-- En cours PMSI public
INSERT INTO activite[PX].p_factures(
sejour_id,
no_sejour,
no_facture,
no_facture_reference,
date_debut,
date_fin,
type_facture,
code_facture,
date_facture,
tiers_payant_0_id,
tiers_payant_1_id,
tiers_payant_2_id,
tiers_payant_22_id,
ghs_id,
ghs_bebe1_id,
ghs_bebe2_id,
ghs_bebe3_id)
SELECT
p_sejours.oid,
p_sejours.no_sejour,
MAX(p_sejours.no_sejour || '.BG'),
MAX(p_sejours.no_sejour || '.BG'),
MAX(p_sejours.date_entree),
MAX(p_sejours.date_sortie),
'0',
'0',
'20991231'::date,
MAX(p_sejours.tiers_payant_0_id),
MAX(p_sejours.tiers_payant_1_id),
MAX(p_sejours.tiers_payant_2_id),
MAX(p_sejours.tiers_payant_22_id),
MAX(p_sejours.ghs_id),
MAX(p_sejours.ghs_bebe1_id),
MAX(p_sejours.ghs_bebe2_id),
MAX(p_sejours.ghs_bebe3_id)
FROM pmsi.p_rss
JOIN base.t_finess ON p_rss.finess = t_finess.code AND t_finess.type_etablissement <> '1'
JOIN activite[PX].p_sejours on no_sejour_administratif = p_sejours.no_sejour AND p_sejours.est_budget_global = '1'
JOIN base.t_ghm On p_sejours.ghm_id = t_ghm.oid
LEFT JOIN activite[PX].p_factures ON p_sejours.no_sejour = p_factures.no_sejour AND p_factures.no_facture LIKE '%BG'
WHERE p_rss.en_cours = '1' AND p_factures.no_facture IS NULL AND
p_sejours.type_sejour IN ('1','2','5') AND
t_ghm.code NOT IN ('09Z02A')
GROUP BY 1,2;
-- Sejours BG PMSi qui ne sont pas dans les RSS
INSERT INTO activite[PX].p_factures(
sejour_id,
no_sejour,
no_facture,
no_facture_reference,
date_debut,
date_fin,
type_facture,
code_facture,
date_facture,
tiers_payant_0_id,
tiers_payant_1_id,
tiers_payant_2_id,
tiers_payant_22_id,
ghs_id,
ghs_bebe1_id,
ghs_bebe2_id,
ghs_bebe3_id)
SELECT p_sejours.oid,
p_sejours.no_sejour,
p_sejours.no_sejour || '.BG',
p_sejours.no_sejour || '.BG',
p_sejours.date_entree,
p_sejours.date_sortie,
'0',
'0',
'20991231'::date,
p_sejours.tiers_payant_0_id,
p_sejours.tiers_payant_1_id,
p_sejours.tiers_payant_2_id,
p_sejours.tiers_payant_22_id,
p_sejours.ghs_id,
p_sejours.ghs_bebe1_id,
p_sejours.ghs_bebe2_id,
p_sejours.ghs_bebe3_id
FROM activite[PX].p_sejours
JOIN activite[PX].t_lieux ON lieu_sortie_id = t_lieux.oid
JOIN activite[PX].t_services_facturation ON service_facturation_id = t_services_facturation.oid
JOIN base.t_ghm On p_sejours.ghm_id = t_ghm.oid
WHERE p_sejours.est_budget_global = '1' AND
p_sejours.type_sejour IN ('1','2','5') AND
type_t2a = '1' AND
t_ghm.code NOT IN ('09Z02A') AND
date_sortie between date(date_trunc('year',now() - interval '1 year')) AND now() AND
code_sorti = '1' AND
no_sejour NOT IN (SELECt no_sejour FROm activite[PX].p_factures where no_facture like '%BG') AND
no_sejour NOT IN (
SELECT p_factures.no_sejour
FROM activite[PX].p_factures_lignes_c
JOIN activite[PX].p_factures ON p_factures_lignes_c.no_facture = p_factures.no_facture
JOIN activite[PX].p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
WHERE p_sejours.est_budget_global = '1' AND
p_factures_lignes_c.no_facture NOT LIKE '%BG' AND
code_facture = '1' AND
(t_prestations.code = 'PJ' OR t_prestations.code LIKE 'GHS%') AND
(taux_1 = 100 OR taux_2 = 100 OR taux_0 = 100)
GROUP BY 1
HAVING SUM(montant_facture_1+montant_facture_0+montant_facture_2) > 0
);
-- Séances pour séjour présents
INSERT INTO activite[PX].p_factures(
sejour_id,
no_sejour,
no_facture,
no_facture_reference,
date_debut,
date_fin,
type_facture,
code_facture,
date_facture,
tiers_payant_0_id,
tiers_payant_1_id,
tiers_payant_2_id,
tiers_payant_22_id,
ghs_id,
ghs_bebe1_id,
ghs_bebe2_id,
ghs_bebe3_id)
SELECT p_sejours.oid,
p_sejours.no_sejour,
p_sejours.no_sejour || '.BG',
p_sejours.no_sejour || '.BG',
p_sejours.date_entree,
date(date_trunc('month',now()) + interval '1 month' - interval '1 day'),
'0',
'0',
'20991231'::date,
p_sejours.tiers_payant_0_id,
p_sejours.tiers_payant_1_id,
p_sejours.tiers_payant_2_id,
p_sejours.tiers_payant_22_id,
p_sejours.ghs_id,
p_sejours.ghs_bebe1_id,
p_sejours.ghs_bebe2_id,
p_sejours.ghs_bebe3_id
FROM activite[PX].p_sejours
JOIN activite[PX].t_lieux ON lieu_sortie_id = t_lieux.oid
JOIN activite[PX].t_services_facturation ON service_facturation_id = t_services_facturation.oid
WHERE p_sejours.est_budget_global = '1' AND
type_t2a = '1' AND
date_entree between date(date_trunc('year',now() - interval '1 year')) AND now() AND
p_sejours.type_sejour IN ('5') AND
code_sorti <> '1' AND
no_sejour NOT IN (SELECt no_sejour FROm activite[PX].p_factures where no_facture like '%BG') AND
no_sejour NOT IN (
SELECT p_factures.no_sejour
FROM activite[PX].p_factures_lignes_c
JOIN activite[PX].p_factures ON p_factures_lignes_c.no_facture = p_factures.no_facture
JOIN activite[PX].p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
WHERE p_sejours.est_budget_global = '1' AND
code_facture = '1' AND
t_prestations.code = 'PJ' AND
(taux_2 = 100 OR taux_0 = 100)
GROUP BY 1
HAVING SUM(montant_facture_0+montant_facture_2) > 0
);
-- Factures non assurés ajoutées à tord (on trouve un 100% dans patient ou tp1
DROP TABLE IF EXISTS w_sejours_bg_24;
CREATE TEMP TABLE w_sejours_bg_24 AS
SELECT p_factures.no_sejour, SUM(montant_facture_0+montant_facture_1+montant_facture_2) AS montant_facture_100
FROM activite[PX].p_factures_lignes_c
JOIN activite[PX].p_factures ON p_factures_lignes_c.no_facture = p_factures.no_facture
JOIN activite[PX].p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
JOIN base.t_ghm ON p_sejours.ghm_id = t_ghm.oid
JOIN activite[PX].p_sejour_pmsi ON p_sejour_pmsi.sejour_id = p_sejours.oid
JOIN pmsi.p_rss ON p_sejour_pmsi.rss_id = p_rss.oid
WHERE p_sejours.est_budget_global = '1' AND
code_facture = '1' AND
p_factures_lignes_c.no_facture NOT LIKE '%BG' AND
(
t_prestations.code = 'PJ' OR
t_prestations.code LIKE 'GHS%' OR
t_ghm.code IN ('09Z02A') OR
t_prestations.code IN ('SE1','SE2','SE3','SE4','SE5','SE6','SE7','ATU')
) AND
(taux_1 + taux_2 + taux_0 = 100 OR
taux_0+taux_1+taux_2=0 AND montant_facture_1 = montant_facture
) AND
p_rss.traitement_epmsi NOT IN ('30','31','32','33')
GROUP BY 1
HAVING SUM(montant_facture_0+montant_facture_1+montant_facture_2) > 0
ORDER BY 1;
DELETE FROM activite[PX].p_factures_lignes_c
USING activite[PX].p_factures
WHERE p_factures_lignes_c.no_facture = p_factures.no_facture AND
p_factures.no_sejour IN (SELECT no_sejour FROM w_sejours_bg_24) AND
p_factures_lignes_c.no_facture LIKE '%BG' AND
origine_facturation_id = 1;
UPDATE activite[PX].p_factures SET
code_facture = '1',
date_facture = date_fin,
montant_facture_c = 0,
montant_facture_1_c = 0,
montant_comptabilise_1_c =0,
montant_comptabilise_budget_global_c = 0
WHERE no_sejour IN (SELECT no_sejour FROM w_sejours_bg_24) AND
no_facture LIKE '%BG' AND
montant_comptabilise_budget_global_c = 0;
-- TRansfert de lignes non facturées vers budget global
UPDATE activite[PX].p_factures_lignes_non_facturees_c
SET no_facture = subview.no_facture_bg
FROM
(
SELECT p_sejours.no_sejour, t_prestations.code, t_prestations.texte, p_factures_lignes_non_facturees_c.*,
p_factures_bg.code_facture,p_factures_bg.no_facture AS no_facture_bg
FROM activite[PX].p_factures_lignes_non_facturees_c
JOIN activite[PX].p_factures ON p_factures_lignes_non_facturees_c.no_facture = p_factures.no_facture
JOIN activite[PX].p_sejours ON p_factures.no_sejour = p_sejours.no_sejour AND type_sejour IN ('1','2','5')
JOIN activite[PX].t_lieux ON lieu_sortie_id = t_lieux.oid
JOIN activite.t_services_facturation ON service_facturation_id = t_services_facturation.oid AND type_t2a = '1'
JOIN activite.t_prestations ON p_factures_lignes_non_facturees_c.prestation_id = t_prestations.oid
JOIN activite[PX].p_factures p_factures_bg ON p_factures_bg.no_sejour = p_factures.no_sejour AND p_factures_bg.no_facture LIKE '%BG' AND
p_factures_lignes_non_facturees_c.date_debut BETWEEN p_factures_bg.date_debut AND p_factures_bg.date_fin
WHERE p_factures_lignes_non_facturees_c.no_facture NOT LIKE '%BG' AND
t_prestations.code IN ('EMI','ETI','PII','PME','PH8','PHU') AND
p_factures_bg.code_facture = '0'
) subview
WHERE p_factures_lignes_non_facturees_c.no_facture = subview.no_facture and
p_factures_lignes_non_facturees_c.prestation_id = subview.prestation_id
;
-- factures ajoutées à tord depuis SIGEMS alors que traitées par PMSI BG
DROP TABLE IF EXISTS w_factures_00_bg;
CREATE TEMP TABLE w_factures_00_bg AS
SELECT p_factures.no_facture
FROM activite[PX].p_factures
WHERE p_factures.no_facture LIKE '%.00' AND
p_factures.code_facture = '0' AND
p_factures.no_sejour IN (SELECT p_factures_bg.no_sejour FROM activite[PX].p_factures p_factures_bg WHERE p_factures_bg.no_facture LIKE '%BG' AND p_factures_bg.code_facture = '1')
order by 1
;
DELETE FROM activite[PX].p_factures_lignes_non_facturees_c
WHERE no_facture IN (SELECT * FROM w_factures_00_bg)
;
DELETE FROM activite[PX].p_factures_lignes_non_facturees_h
WHERE no_facture IN (SELECT * FROM w_factures_00_bg)
;
DELETE FROM activite[PX].p_factures
WHERE no_facture IN (SELECT * FROM w_factures_00_bg)
;
]]></sqlcmd>
</NODE>
<NODE label="Budget global Actes">
<condition><![CDATA[
"[ENV_TYPEETS]" != "1"
]]></condition>
<sqlcmd><![CDATA[
-- Valorisation actes
DROP TABLE IF EXISTS w_sejours_hospit_bg;
CREATE TEMP TABLE w_sejours_hospit_bg AS
SELECT p_factures.no_sejour AS no_sejour_bg,
MIN(CASE
WHEN t_prestations.code IN ('GHS', 'PJ') THEN origine_facturation_id
WHEN origine_facturation_id = 2 THEN origine_facturation_id
WHEN type_sejour = '3' THEN 2
ELSE 9 END) AS origine_facturation_id
FROM activite[PX].p_sejours
JOIN activite[PX].p_factures ON p_factures.no_sejour = p_sejours.no_sejour AND p_factures.code_facture = '1'
LEFT JOIN activite[PX].p_factures_lignes_c ON p_factures_lignes_c.no_facture = p_factures.no_facture
LEFT JOIN activite.t_prestations ON prestation_id = t_prestations.oid
WHERE est_budget_global = '1'
GROUP BY 1;
-- actes inclus dans séjour
UPDATE activite[PX].p_factures_lignes_h
SET
montant_facture_actes_inclus_dans_sejour = prix_unitaire * nb_prestation * coefficient,
montant_facture_1_actes_inclus_dans_sejour = (prix_unitaire * nb_prestation * coefficient) * taux_1 / 100.00,
montant_facture_2_actes_inclus_dans_sejour = (prix_unitaire * nb_prestation * coefficient) * taux_2 / 100.00,
montant_facture_0_actes_inclus_dans_sejour = (prix_unitaire * nb_prestation * coefficient) * taux_0 / 100.00
FROM activite[PX].p_factures
JOIN w_sejours_hospit_bg ON p_factures.no_sejour = w_sejours_hospit_bg.no_sejour_bg AND origine_facturation_id = 1
WHERE p_factures_lignes_h.no_facture = p_factures.no_facture AND prix_unitaire <> 0 AND
montant_facture_actes_inclus_dans_sejour = 0 AND
(montant_facture_1 + montant_facture_2 + montant_facture_0) = 0 AND
(taux_0 <> 0 OR taux_1 <> 0 OR taux_2 <> 0 OR taux_22 <> 0);
UPDATE activite[PX].p_factures_lignes_h
SET
montant_facture_actes_inclus_dans_sejour = (prix_unitaire * nb_prestation * coefficient),
montant_facture_1_actes_inclus_dans_sejour = (prix_unitaire * nb_prestation * coefficient)
FROM activite[PX].p_factures
JOIN w_sejours_hospit_bg ON p_factures.no_sejour = w_sejours_hospit_bg.no_sejour_bg AND origine_facturation_id = 1
WHERE p_factures_lignes_h.no_facture = p_factures.no_facture AND prix_unitaire <> 0 AND
montant_facture_actes_inclus_dans_sejour = 0 AND
(montant_facture_1 + montant_facture_2 + montant_facture_0) = 0 AND
taux_1 = 0 AND taux_2 = 0 AND taux_0 = 0;
UPDATE activite[PX].p_factures_lignes_h
SET
montant_facture_actes_inclus_dans_sejour = (prix_unitaire * nb_prestation * coefficient) * taux_1 / 100.00,
montant_facture_1_actes_inclus_dans_sejour = (prix_unitaire * nb_prestation * coefficient) * taux_1 / 100.00
FROM activite[PX].p_factures
JOIN w_sejours_hospit_bg ON p_factures.no_sejour = w_sejours_hospit_bg.no_sejour_bg AND origine_facturation_id = 1
WHERE p_factures_lignes_h.no_facture = p_factures.no_facture AND prix_unitaire <> 0 AND
montant_facture_actes_inclus_dans_sejour = 0 AND
(montant_facture_2 + montant_facture_0) <> 0 AND montant_facture_1 = 0;
--arrondis
UPDATE activite[PX].p_factures_lignes_h
SET montant_facture_1_actes_inclus_dans_sejour = montant_facture_actes_inclus_dans_sejour - (montant_facture_0_actes_inclus_dans_sejour+montant_facture_1_actes_inclus_dans_sejour+montant_facture_2_actes_inclus_dans_sejour+montant_facture_22_actes_inclus_dans_sejour)
WHERE montant_facture_1_actes_inclus_dans_sejour <> 0 AND montant_facture_actes_inclus_dans_sejour <> (montant_facture_0_actes_inclus_dans_sejour+montant_facture_1_actes_inclus_dans_sejour+montant_facture_2_actes_inclus_dans_sejour+montant_facture_22_actes_inclus_dans_sejour);
-- actes externes
UPDATE activite[PX].p_factures_lignes_h
SET
montant_facture = prix_unitaire * nb_prestation * coefficient,
montant_facture_1 = (prix_unitaire * nb_prestation * coefficient) * taux_1 / 100.00,
montant_facture_2 = (prix_unitaire * nb_prestation * coefficient) * taux_2 / 100.00,
montant_facture_0 = (prix_unitaire * nb_prestation * coefficient) * taux_0 / 100.00
FROM activite[PX].p_factures
JOIN w_sejours_hospit_bg ON p_factures.no_sejour = w_sejours_hospit_bg.no_sejour_bg AND origine_facturation_id = 2
WHERE p_factures_lignes_h.no_facture = p_factures.no_facture AND prix_unitaire <> 0 AND
(montant_facture_1 + montant_facture_2 + montant_facture_0) = 0;
UPDATE activite[PX].p_factures_lignes_h
SET
montant_facture = prix_unitaire * nb_prestation * coefficient,
montant_facture_1 = (prix_unitaire * nb_prestation * coefficient) * taux_1 / 100.00
FROM activite[PX].p_factures
JOIN w_sejours_hospit_bg ON p_factures.no_sejour = w_sejours_hospit_bg.no_sejour_bg AND origine_facturation_id = 2
WHERE p_factures_lignes_h.no_facture = p_factures.no_facture AND prix_unitaire <> 0 AND
taux_1 <> 0 AND (montant_facture_2 + montant_facture_0) <> 0 AND montant_facture_1 = 0;
-- Arrondis
UPDATE activite[PX].p_factures_lignes_h
SET montant_facture_1 = montant_facture - (montant_facture_0+montant_facture_1+montant_facture_2+montant_facture_22)
FROM activite[PX].p_factures
JOIN w_sejours_hospit_bg ON p_factures.no_sejour = w_sejours_hospit_bg.no_sejour_bg AND origine_facturation_id = 2
WHERE p_factures_lignes_h.no_facture = p_factures.no_facture AND
montant_facture_1 <> 0 AND
montant_facture <> (montant_facture_0+montant_facture_1+montant_facture_2+montant_facture_22);
-- Ajout des honoraires budget global dans la partie CLINIQUE
INSERT INTO activite[PX].p_factures_lignes_c(
no_facture,
date_debut,
date_fin,
nb_rubrique,
coefficient,
coefficient_mco,
rubrique_facturation_id,
prestation_id,
montant_facture,
montant_facture_0,
montant_facture_1,
montant_facture_2,
montant_facture_22,
taux_0,
taux_1,
taux_2,
taux_22,
prix_unitaire,
lieu_id,
nb_prestation,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
rubrique_comptabilisation_id,
montant_encours,
montant_encours_0,
montant_encours_1,
montant_encours_2,
montant_encours_22,
montant_facture_actes_inclus_dans_sejour,
montant_facture_0_actes_inclus_dans_sejour,
montant_facture_1_actes_inclus_dans_sejour,
montant_facture_2_actes_inclus_dans_sejour,
montant_facture_22_actes_inclus_dans_sejour,
origine_facturation_id,
montant_comptabilise_budget_global_1,
facture_id,
protocole_id,
compte_produit_id)
SELECT
p_factures.no_facture,
p_factures_lignes_h.date_debut,
p_factures_lignes_h.date_fin,
nb_rubrique,
coefficient,
coefficient_mco,
CASE WHEN p_factures_lignes_h.rubrique_facturation_id <> 0 THEN p_factures_lignes_h.rubrique_facturation_id ELSE COALESCE(t_rubriques_facturation.oid,0) END AS rubrique_facturation_id,
prestation_id,
CASE WHEN montant_comptabilise_0 <> 0 THEN montant_facture_0 ELSE 0 END +
CASE WHEN montant_comptabilise_1 <> 0 THEN montant_facture_1 ELSE 0 END +
CASE WHEN montant_comptabilise_2 <> 0 THEN montant_facture_2 ELSE 0 END +
CASE WHEN montant_comptabilise_22 <> 0 THEN montant_facture_22 ELSE 0 END AS montant_facture,
CASE WHEN montant_comptabilise_0 <> 0 THEN montant_facture_0 ELSE 0 END AS montant_facture_0,
CASE WHEN montant_comptabilise_1 <> 0 THEN montant_facture_1 ELSE 0 END AS montant_facture_1,
CASE WHEN montant_comptabilise_2 <> 0 THEN montant_facture_2 ELSE 0 END AS montant_facture_2,
CASE WHEN montant_comptabilise_22 <> 0 THEN montant_facture_22 ELSE 0 END AS montant_facture_22,
taux_0,
taux_1,
taux_2,
taux_22,
prix_unitaire,
lieu_id,
CASE WHEN montant_comptabilise_1 <> 0 THEN nb_prestation ELSE 0 END,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
CASE WHEN p_factures_lignes_h.rubrique_facturation_id <> 0 THEN p_factures_lignes_h.rubrique_facturation_id ELSE COALESCE(t_rubriques_facturation.oid,0) END AS rubrique_comptabilisation_id,
montant_encours,
montant_encours_0,
montant_encours_1,
montant_encours_2,
montant_encours_22,
montant_facture_actes_inclus_dans_sejour,
montant_facture_0_actes_inclus_dans_sejour,
montant_facture_1_actes_inclus_dans_sejour,
montant_facture_2_actes_inclus_dans_sejour,
montant_facture_22_actes_inclus_dans_sejour,
2::bigint AS origine_facturation_id,
0::numeric AS montant_comptabilise_budget_global_1,
p_factures.oid AS facture_id,
protocole_id,
0::bigint AS compte_produit_id
FROM activite[PX].p_factures_lignes_h
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
LEFT JOIN activite[PX].t_rubriques_facturation ON t_prestations.code = t_rubriques_facturation.code
JOIN activite[PX].p_factures ON p_factures_lignes_h.no_facture = p_factures.no_facture
JOIN activite[PX].p_sejours ON p_factures.no_sejour = p_sejours.no_sejour AND est_budget_global = '1'
WHERE p_factures.code_facture = '1' AND
((p_sejours.type_sejour = '3' AND p_factures_lignes_h.no_facture NOT LIKE '%BG') OR
montant_comptabilise <> 0 OR
montant_comptabilise_0 <> 0 OR
montant_comptabilise_1 <> 0 OR
montant_comptabilise_2 <> 0) ;
UPDATE activite[PX].p_factures_lignes_h
SET montant_comptabilise = 0, montant_comptabilise_0 = 0, montant_comptabilise_1 = 0, montant_comptabilise_2 = 0
FROM activite[PX].p_factures
JOIN activite[PX].p_sejours ON p_factures.no_sejour = p_sejours.no_sejour AND est_budget_global = '1'
WHERE p_factures_lignes_h.no_facture = p_factures.no_facture AND
(montant_comptabilise <> 0 OR montant_comptabilise_0 <> 0 OR montant_comptabilise_1 <> 0 OR montant_comptabilise_2 <> 0) ;
-- Ajout des actes inclus dans séjour dans la partie clinique (verrouillé)
DROP TABLE IF EXISTS w_actes_inclus;
CREATE TEMP TABLE w_actes_inclus AS
SELECT
p_factures.no_sejour,
p_factures.no_facture AS no_facture,
p_factures_lignes_h.date_debut,
p_factures_lignes_h.date_fin,
nb_rubrique,
coefficient,
coefficient_mco,
COALESCE(t_rubriques_facturation.oid,0) AS rubrique_facturation_id,
prestation_id,
0::numeric AS montant_facture,
0::numeric AS montant_facture_0,
0::numeric AS montant_facture_1,
0::numeric AS montant_facture_2,
0::numeric AS montant_facture_22,
taux_0,
taux_1,
taux_2,
taux_22,
prix_unitaire,
lieu_id,
nb_prestation,
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,
COALESCE(t_rubriques_facturation.oid,0) AS rubrique_comptabilisation_id,
montant_encours,
montant_encours_0,
montant_encours_1,
montant_encours_2,
montant_encours_22,
montant_facture_actes_inclus_dans_sejour,
montant_facture_0_actes_inclus_dans_sejour,
montant_facture_1_actes_inclus_dans_sejour,
montant_facture_2_actes_inclus_dans_sejour,
montant_facture_22_actes_inclus_dans_sejour,
3::bigint AS origine_facturation_id,
0::numeric AS montant_comptabilise_budget_global_1,
p_factures.oid AS facture_id,
protocole_id,
0::bigint AS compte_produit_id
FROM activite[PX].p_factures_lignes_h
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
LEFT JOIN activite[PX].t_rubriques_facturation ON t_prestations.code = t_rubriques_facturation.code
JOIN activite[PX].p_factures ON p_factures_lignes_h.no_facture = p_factures.no_facture
JOIN activite[PX].p_sejours ON p_factures.no_sejour = p_sejours.no_sejour AND est_budget_global = '1'
WHERE 1<>1 AND
(montant_facture_actes_inclus_dans_sejour <> 0 OR
montant_facture_0_actes_inclus_dans_sejour <> 0 OR
montant_facture_1_actes_inclus_dans_sejour <> 0 OR
montant_facture_2_actes_inclus_dans_sejour <> 0) ;
UPDATE w_actes_inclus
SET no_facture = p_factures.no_facture, facture_id = p_factures.oid
FROM activite[PX].p_factures
WHERE w_actes_inclus.no_sejour = p_factures.no_sejour AND
p_factures.no_facture LIKE '%BG' ;
INSERT INTO activite[PX].p_factures_lignes_c
(
no_facture,
date_debut,
date_fin,
nb_rubrique,
coefficient,
coefficient_mco,
rubrique_facturation_id,
prestation_id,
montant_facture,
montant_facture_0,
montant_facture_1,
montant_facture_2,
montant_facture_22,
taux_0,
taux_1,
taux_2,
taux_22,
prix_unitaire,
lieu_id,
nb_prestation,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
rubrique_comptabilisation_id,
montant_encours,
montant_encours_0,
montant_encours_1,
montant_encours_2,
montant_encours_22,
montant_facture_actes_inclus_dans_sejour,
montant_facture_0_actes_inclus_dans_sejour,
montant_facture_1_actes_inclus_dans_sejour,
montant_facture_2_actes_inclus_dans_sejour,
montant_facture_22_actes_inclus_dans_sejour,
origine_facturation_id,
montant_comptabilise_budget_global_1,
facture_id,
protocole_id,
compte_produit_id
)
SELECT
no_facture,
date_debut,
date_fin,
nb_rubrique,
coefficient,
coefficient_mco,
rubrique_facturation_id,
prestation_id,
0::numeric AS montant_facture,
0::numeric AS montant_facture_0,
0::numeric AS montant_facture_1,
0::numeric AS montant_facture_2,
0::numeric AS montant_facture_22,
taux_0,
taux_1,
taux_2,
taux_22,
prix_unitaire,
lieu_id,
nb_prestation,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
rubrique_comptabilisation_id,
montant_encours,
montant_encours_0,
montant_encours_1,
montant_encours_2,
montant_encours_22,
montant_facture_actes_inclus_dans_sejour,
montant_facture_0_actes_inclus_dans_sejour,
montant_facture_1_actes_inclus_dans_sejour,
montant_facture_2_actes_inclus_dans_sejour,
montant_facture_22_actes_inclus_dans_sejour,
origine_facturation_id,
montant_comptabilise_budget_global_1,
facture_id,
protocole_id,
compte_produit_id
FROM w_actes_inclus;
-- Correction n° facture
UPDATE activite[PX].p_factures_lignes_c
SET no_facture = p_factures.no_facture, facture_id = p_factures.oid
FROM activite[PX].p_factures
WHERE p_factures_lignes_c.montant_facture_actes_inclus_dans_sejour <> 0 AND
split_part(p_factures_lignes_c.no_facture,'.',1) = p_factures.no_sejour AND
p_factures.no_facture LIKE '%BG' AND
p_factures_lignes_c.no_facture NOT LIKE '%BG' AND
p_factures_lignes_c.montant_facture = 0 AND
p_factures_lignes_c.montant_comptabilise = 0;
UPDATE activite[PX].p_factures_lignes_h
SET no_facture = p_factures.no_facture, facture_id = p_factures.oid
FROM activite[PX].p_factures
WHERE p_factures_lignes_h.montant_facture_actes_inclus_dans_sejour <> 0 AND
split_part(p_factures_lignes_h.no_facture,'.',1) = p_factures.no_sejour AND
p_factures.no_facture LIKE '%BG' AND
p_factures_lignes_h.no_facture NOT LIKE '%BG' AND
p_factures_lignes_h.montant_facture = 0 AND
p_factures_lignes_h.montant_comptabilise = 0;
-- Cumuls factures
DROP TABLE IF EXISTS w_factures_corrigees;
CREATE TEMP TABLE w_factures_corrigees AS
SELECT
p_factures_lignes_c.no_facture,
COALESCE(SUM(CASE WHEN origine_facturation_id = 1 THEN montant_facture ELSE 0 END),0) AS ligne_facture_c,
COALESCE(SUM(CASE WHEN origine_facturation_id = 1 THEN montant_facture_0 ELSE 0 END),0) AS ligne_facture_0_c,
COALESCE(SUM(CASE WHEN origine_facturation_id = 1 THEN montant_facture_1 ELSE 0 END),0) AS ligne_facture_1_c,
COALESCE(SUM(CASE WHEN origine_facturation_id = 1 THEN montant_facture_2 ELSE 0 END),0) AS ligne_facture_2_c,
COALESCE(SUM(CASE WHEN origine_facturation_id = 1 THEN montant_facture_22 ELSE 0 END),0) AS ligne_facture_22_c,
COALESCE(SUM(montant_comptabilise),0) AS ligne_comptabilise_c,
COALESCE(SUM(montant_comptabilise_0),0) AS ligne_comptabilise_0_c,
COALESCE(SUM(montant_comptabilise_1),0) AS ligne_comptabilise_1_c,
COALESCE(SUM(montant_comptabilise_2),0) AS ligne_comptabilise_2_c,
COALESCE(SUM(montant_comptabilise_22),0) AS ligne_comptabilise_22_c,
COALESCE(SUM(CASE WHEN origine_facturation_id = 2 THEN montant_facture ELSE 0 END),0) AS ligne_facture_h,
COALESCE(SUM(CASE WHEN origine_facturation_id = 2 THEN montant_facture_0 ELSE 0 END),0) AS ligne_facture_0_h,
COALESCE(SUM(CASE WHEN origine_facturation_id = 2 THEN montant_facture_1 ELSE 0 END),0) AS ligne_facture_1_h,
COALESCE(SUM(CASE WHEN origine_facturation_id = 2 THEN montant_facture_2 ELSE 0 END),0) AS ligne_facture_2_h,
COALESCE(SUM(CASE WHEN origine_facturation_id = 2 THEN montant_facture_22 ELSE 0 END),0) AS ligne_facture_22_h,
0::numeric AS ligne_comptabilise_h,
0::numeric AS ligne_comptabilise_0_h,
0::numeric AS ligne_comptabilise_1_h,
0::numeric AS ligne_comptabilise_2_h,
0::numeric AS ligne_comptabilise_22_h
FROM activite[PX].p_factures
JOIN activite[PX].p_sejours ON p_factures.no_sejour = p_sejours.no_sejour AND est_budget_global = '1'
LEFT JOIN activite[PX].p_factures_lignes_c ON p_factures_lignes_c.no_facture = p_factures.no_facture
GROUP BY 1
HAVING SUM(CASE WHEN origine_facturation_id = 1 THEN montant_facture ELSE 0 END) IS DISTINCT FROM MAX(p_factures.montant_facture_c) OR
SUM(CASE WHEN origine_facturation_id = 1 THEN montant_facture_0 ELSE 0 END) IS DISTINCT FROM MAX(p_factures.montant_facture_0_c) OR
SUM(CASE WHEN origine_facturation_id = 1 THEN montant_facture_1 ELSE 0 END) IS DISTINCT FROM MAX(p_factures.montant_facture_1_c) OR
SUM(CASE WHEN origine_facturation_id = 1 THEN montant_facture_2 ELSE 0 END) IS DISTINCT FROM MAX(p_factures.montant_facture_2_c) OR
SUM(CASE WHEN origine_facturation_id = 1 THEN montant_facture_22 ELSE 0 END) IS DISTINCT FROM MAX(p_factures.montant_facture_22_c) OR
SUM(montant_comptabilise) IS DISTINCT FROM MAX(p_factures.montant_comptabilise_c) OR
SUM(montant_comptabilise_0) IS DISTINCT FROM MAX(p_factures.montant_comptabilise_0_c) OR
SUM(montant_comptabilise_1) IS DISTINCT FROM MAX(p_factures.montant_comptabilise_1_c) OR
SUM(montant_comptabilise_2) IS DISTINCT FROM MAX(p_factures.montant_comptabilise_2_c) OR
SUM(montant_comptabilise_22) IS DISTINCT FROM MAX(p_factures.montant_comptabilise_22_c) OR
SUM(CASE WHEN origine_facturation_id = 2 THEN montant_facture ELSE 0 END) IS DISTINCT FROM MAX(p_factures.montant_facture_h) OR
SUM(CASE WHEN origine_facturation_id = 2 THEN montant_facture_0 ELSE 0 END) IS DISTINCT FROM MAX(p_factures.montant_facture_0_h) OR
SUM(CASE WHEN origine_facturation_id = 2 THEN montant_facture_1 ELSE 0 END) IS DISTINCT FROM MAX(p_factures.montant_facture_1_h) OR
SUM(CASE WHEN origine_facturation_id = 2 THEN montant_facture_2 ELSE 0 END) IS DISTINCT FROM MAX(p_factures.montant_facture_2_h) OR
SUM(CASE WHEN origine_facturation_id = 2 THEN montant_facture_22 ELSE 0 END) IS DISTINCT FROM MAX(p_factures.montant_facture_22_h) OR
0::numeric IS DISTINCT FROM MAX(p_factures.montant_comptabilise_h) OR
0::numeric IS DISTINCT FROM MAX(p_factures.montant_comptabilise_0_h) OR
0::numeric IS DISTINCT FROM MAX(p_factures.montant_comptabilise_1_h) OR
0::numeric IS DISTINCT FROM MAX(p_factures.montant_comptabilise_2_h) OR
0::numeric IS DISTINCT FROM MAX(p_factures.montant_comptabilise_22_h) ;
UPDATE activite[PX].p_factures
SET
montant_facture_c = w_factures_corrigees.ligne_facture_c,
montant_facture_0_c = w_factures_corrigees.ligne_facture_0_c,
montant_facture_1_c = w_factures_corrigees.ligne_facture_1_c,
montant_facture_2_c = w_factures_corrigees.ligne_facture_2_c,
montant_facture_22_c = w_factures_corrigees.ligne_facture_22_c,
montant_comptabilise_c = w_factures_corrigees.ligne_comptabilise_c,
montant_comptabilise_0_c = w_factures_corrigees.ligne_comptabilise_0_c,
montant_comptabilise_1_c = w_factures_corrigees.ligne_comptabilise_1_c,
montant_comptabilise_2_c = w_factures_corrigees.ligne_comptabilise_2_c,
montant_comptabilise_22_c = w_factures_corrigees.ligne_comptabilise_22_c,
montant_facture_h = w_factures_corrigees.ligne_facture_h,
montant_facture_0_h = w_factures_corrigees.ligne_facture_0_h,
montant_facture_1_h = w_factures_corrigees.ligne_facture_1_h,
montant_facture_2_h = w_factures_corrigees.ligne_facture_2_h,
montant_facture_22_h = w_factures_corrigees.ligne_facture_22_h,
montant_comptabilise_h = w_factures_corrigees.ligne_comptabilise_h,
montant_comptabilise_0_h = w_factures_corrigees.ligne_comptabilise_0_h,
montant_comptabilise_1_h = w_factures_corrigees.ligne_comptabilise_1_h,
montant_comptabilise_2_h = w_factures_corrigees.ligne_comptabilise_2_h,
montant_comptabilise_22_h = w_factures_corrigees.ligne_comptabilise_22_h
FROM w_factures_corrigees
WHERE w_factures_corrigees.no_facture = p_factures.no_facture;
-- Report des actes non facturés honoraires budget global pour encours
INSERT INTO activite[PX].p_factures_lignes_non_facturees_c(
facture_id,
no_facture,
date_debut,
date_fin,
nb_rubrique,
coefficient,
rubrique_facturation_id,
prestation_id,
prix_unitaire,
lieu_id)
SELECT
p_factures.oid AS facture_id,
p_factures.no_facture AS no_facture,
p_factures_lignes_h.date_debut,
p_factures_lignes_h.date_fin,
p_factures_lignes_h.nb_rubrique,
p_factures_lignes_h.coefficient,
p_factures_lignes_h.rubrique_facturation_id,
p_factures_lignes_h.prestation_id,
p_factures_lignes_h.prix_unitaire,
p_factures_lignes_h.lieu_id
FROM activite[PX].p_factures_lignes_h
JOIN activite[PX].p_factures on p_factures_lignes_h.no_facture = p_factures.no_facture
JOIN activite[PX].p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
WHERE p_factures.code_facture = '0' AND
p_sejours.est_budget_global = '1' AND
p_sejours.type_sejour = '3' AND
p_factures.no_sejour NOT IN (SELECT no_sejour FROM activite[PX].p_factures WHERE code_facture = '1') AND
p_factures_lignes_h.no_facture NOT IN (SELECT no_facture FROM activite[PX].p_factures_lignes_non_facturees_c)
;
-- Report des actes non facturés honoraires budget global pour encours
INSERT INTO activite[PX].p_factures_lignes_non_facturees_c(
facture_id,
no_facture,
date_debut,
date_fin,
nb_rubrique,
coefficient,
rubrique_facturation_id,
prestation_id,
prix_unitaire,
lieu_id)
SELECT
p_factures.oid AS facture_id,
p_factures.no_facture AS no_facture,
p_factures_lignes_non_facturees_h.date_debut,
p_factures_lignes_non_facturees_h.date_fin,
p_factures_lignes_non_facturees_h.nb_rubrique,
p_factures_lignes_non_facturees_h.coefficient,
p_factures_lignes_non_facturees_h.rubrique_facturation_id,
p_factures_lignes_non_facturees_h.prestation_id,
p_factures_lignes_non_facturees_h.prix_unitaire,
p_factures_lignes_non_facturees_h.lieu_id
FROM activite[PX].p_factures_lignes_non_facturees_h
JOIN activite[PX].p_factures on p_factures_lignes_non_facturees_h.no_facture = p_factures.no_facture
JOIN activite[PX].p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
WHERE p_factures.code_facture = '0' AND
p_sejours.est_budget_global = '1' AND
p_sejours.type_sejour = '3' AND
p_factures.no_sejour NOT IN (SELECT no_sejour FROM activite[PX].p_factures WHERE code_facture = '1') --AND
;
TRUNCATE activite[PX].p_factures_lignes_non_facturees_h
;
]]></sqlcmd>
</NODE>
<NODE label="Budget global Externes">
<condition><![CDATA[
"[ENV_TYPEETS]" != "1" && "[ENV_WITHPMSI]" == "1"
]]></condition>
<sqlcmd><![CDATA[
-- Séjours externes BG qui ne sont pas dans le PMSI
INSERT INTO activite[PX].p_factures(
sejour_id,
no_sejour,
no_facture,
no_facture_reference,
date_debut,
date_fin,
type_facture,
code_facture,
date_facture,
tiers_payant_0_id,
tiers_payant_1_id,
tiers_payant_2_id,
tiers_payant_22_id,
ghs_id)
SELECT p_sejours.oid,
p_sejours.no_sejour,
p_sejours.no_sejour || '.BG',
p_sejours.no_sejour || '.BG',
p_sejours.date_entree,
p_sejours.date_sortie,
'0',
'0',
'20991231'::date,
p_sejours.tiers_payant_0_id,
p_sejours.tiers_payant_1_id,
p_sejours.tiers_payant_2_id,
p_sejours.tiers_payant_22_id,
p_sejours.ghs_id
FROM activite[PX].p_sejours
JOIN activite[PX].t_lieux ON lieu_sortie_id = t_lieux.oid
JOIN activite[PX].t_services_facturation ON service_facturation_id = t_services_facturation.oid
WHERE
p_sejours.est_budget_global = '1' AND
type_t2a <> '1' AND
p_sejours.type_sejour = '3' AND
date_entree between now() - interval '1 year' AND now() AND
code_sorti = '1' AND
no_sejour NOT IN (SELECT no_sejour FROM activite[PX].p_factures WHERE no_facture like '%BG') AND
no_sejour NOT IN
(
SELECT no_sejour
FROM activite[PX].p_factures_lignes_c
JOIN activite[PX].p_factures ON p_factures_lignes_c.no_facture = p_factures.no_facture
WHERE p_factures_lignes_c.no_facture NOT LIKE '%BG' AND montant_comptabilise_1 <> 0
)
;
-- Sur Externes, Récupérer actes facturés partiellement
INSERT INTO activite[PX].p_factures_lignes_non_facturees_c(
facture_id,
no_facture,
date_debut,
rubrique_facturation_id,
prestation_id,
date_fin,
nb_rubrique,
coefficient,
lieu_id,
prix_unitaire
)
SELECT
p_factures_bg.oid AS facture_id,
p_factures_bg.no_facture AS no_facture,
p_factures_lignes_c.date_debut,
p_factures_lignes_c.rubrique_facturation_id,
p_factures_lignes_c.prestation_id,
MAX(p_factures_lignes_c.date_fin),
1,
1,
MAX(p_factures_lignes_c.lieu_id),
(MAX(prix_unitaire) * MAX(coefficient) * SUM(nb_rubrique)) - SUM(montant_facture) AS prix_unitaire
FROM activite[PX].p_factures_lignes_c
JOIN activite[PX].p_factures on p_factures_lignes_c.no_facture = p_factures.no_facture
JOIN activite[PX].p_factures p_factures_bg ON p_factures_bg.no_sejour = p_factures.no_sejour and p_factures_bg.no_facture LIKE '%BG'
JOIN activite[PX].p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
WHERE p_sejours.type_sejour = '3' AND
p_factures_bg.code_facture = '0' AND
p_factures_lignes_c.no_facture nOT LIKE '%BG' AND
montant_encours = 0 AND p_factures_bg.montant_encours_c = 0
GROUP BY 1,2,3,4,5
HAVING
SUM(nb_rubrique) > 0 AND
((MAX(prix_unitaire) * MAX(coefficient) * SUM(nb_rubrique)) - SUM(montant_facture)) > 1
;
]]></sqlcmd>
</NODE>
<NODE label="Avoirs">
<sqlcmd><![CDATA[
-- Le lien entre avoirs et factures vient de la table dos2_lien_avoir
-- Si l'aspirateur n'a pas encore été modifié, il faut la créer pour ne pas avoir d'erreur
SELECT *
FROM base.cti_execute('
CREATE TABLE prod_sigems.dos2_lien_avoir
(
ann character varying(2),
cod integer,
ind integer,
ind_avoir integer
)
',1)
WHERE
(SELECT count(*) FROM pg_tables
WHERE schemaname = 'prod_sigems' AND
tablename = 'dos2_lien_avoir'
) = 0
;
DROP TABLE IF EXISTS w_lien_avoir;
CREATE TEMP TABLE w_lien_avoir AS
SELECT
ANN || to_char(COD,'FM900000') || '.' || to_char(IND,'FM00') AS no_facture_annulee,
ANN || to_char(COD,'FM900000') || '.' || to_char(IND_AVOIR,'FM00') AS no_facture_avoir
FROM prod_sigems.DOS2_LIEN_AVOIR
;
-- Si table vide, déterminer depuis les factures et avoir
-- Cas de l'aspirateur non modifié ou de l'import depuis les fichiers texte
DROP TABLE IF EXISTS w_sans_dos2_lien;
CREATE TEMP TABLE w_sans_dos2_lien AS
SELECT
no_sejour,
date_debut,
date_fin,
''::text AS no_facture_annulee,
no_facture AS no_facture_avoir,
date_facture AS avoir_date_facture,
montant_comptabilise_c AS avoir_montant_comptabilise_c,
montant_comptabilise_h AS avoir_montant_comptabilise_h
FROM activite[PX].p_factures
WHERE type_facture = '1' AND
(
montant_comptabilise_c <> 0 OR
montant_comptabilise_h <> 0
) AND
(SELECT count(*) FROM prod_sigems.dos2_lien_avoir) = 0
;
UPDATE w_sans_dos2_lien
SET no_facture_annulee = subview.no_facture_annulee
FROM
(
SELECT p_factures.no_sejour ,
w_sans_dos2_lien.no_facture_avoir,
MAX(p_factures.no_facture) AS no_facture_annulee
FROM activite[PX].p_factures
JOIN w_sans_dos2_lien ON p_factures.no_sejour = w_sans_dos2_lien.no_sejour
WHERE p_factures.no_facture <> w_sans_dos2_lien.no_facture_avoir AND
p_factures.date_facture <= avoir_date_facture AND
p_factures.date_debut BETWEEN w_sans_dos2_lien.date_debut AND w_sans_dos2_lien.date_fin AND
p_factures.no_facture < w_sans_dos2_lien.no_facture_avoir AND
p_factures.montant_comptabilise_c = 0-avoir_montant_comptabilise_c AND
p_factures.montant_comptabilise_h = 0-avoir_montant_comptabilise_h
GROUP BY 1,2
) subview
WHERE w_sans_dos2_lien.no_facture_avoir = subview.no_facture_avoir
;
INSERT INTO w_lien_avoir
SELECT no_facture_annulee, no_facture_avoir
FROM w_sans_dos2_lien
WHERE no_facture_annulee <> '' AND
no_facture_annulee NOT IN (SELECT no_facture_annulee FROM w_sans_dos2_lien GROUP BY 1 HAVING count(*) > 1)
;
-- Traitement
UPDATE activite[PX].p_factures SET
no_facture_od_avoir = no_facture_avoir,
facture_od_avoir_id = p_factures_od.oid,
montant_regle_c = p_factures.montant_regle_c - p_factures_od.montant_comptabilise_c,
montant_regle_1_c = p_factures.montant_regle_1_c - p_factures_od.montant_comptabilise_1_c,
montant_regle_2_c = p_factures.montant_regle_2_c - p_factures_od.montant_comptabilise_2_c,
montant_regle_22_c = p_factures.montant_regle_22_c - p_factures_od.montant_comptabilise_22_c,
montant_regle_0_c = p_factures.montant_regle_0_c - p_factures_od.montant_comptabilise_0_c,
montant_regle_h = p_factures.montant_regle_h - p_factures_od.montant_comptabilise_h,
montant_regle_1_h = p_factures.montant_regle_1_h - p_factures_od.montant_comptabilise_1_h,
montant_regle_2_h = p_factures.montant_regle_2_h - p_factures_od.montant_comptabilise_2_h,
montant_regle_22_h = p_factures.montant_regle_22_h - p_factures_od.montant_comptabilise_22_h,
montant_regle_0_h = p_factures.montant_regle_0_h - p_factures_od.montant_comptabilise_0_h
FROM w_lien_avoir
JOIN activite[PX].p_factures p_factures_od ON p_factures_od.no_facture = no_facture_avoir
WHERE p_factures.no_facture = no_facture_annulee
;
UPDATE activite[PX].p_factures SET
no_facture_od_avoir = no_facture_annulee,
facture_od_avoir_id = p_factures_od.oid,
montant_regle_c = p_factures.montant_regle_c + p_factures.montant_comptabilise_c,
montant_regle_1_c = p_factures.montant_regle_1_c + p_factures.montant_comptabilise_1_c,
montant_regle_2_c = p_factures.montant_regle_2_c + p_factures.montant_comptabilise_2_c,
montant_regle_22_c = p_factures.montant_regle_22_c + p_factures.montant_comptabilise_22_c,
montant_regle_0_c = p_factures.montant_regle_0_c + p_factures.montant_comptabilise_0_c,
montant_regle_h = p_factures.montant_regle_h + p_factures.montant_comptabilise_h,
montant_regle_1_h = p_factures.montant_regle_1_h + p_factures.montant_comptabilise_1_h,
montant_regle_2_h = p_factures.montant_regle_2_h + p_factures.montant_comptabilise_2_h,
montant_regle_22_h = p_factures.montant_regle_22_h + p_factures.montant_comptabilise_22_h,
montant_regle_0_h = p_factures.montant_regle_0_h + p_factures.montant_comptabilise_0_h
FROM w_lien_avoir
JOIN activite[PX].p_factures p_factures_od ON p_factures_od.no_facture = no_facture_annulee
WHERE p_factures.no_facture = no_facture_avoir
;
INSERT INTO activite[PX].p_factures_soldes_c(
no_facture,
facture_id,
date_comptable,
rubrique_comptabilisee_id,
prestation_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_avoir
)
SELECT
p_factures_annulee.no_facture,
p_factures_annulee.oid AS facture_id,
p_factures_avoir.date_vente AS date_comptable,
p_factures_soldes_od.rubrique_comptabilisee_id,
p_factures_soldes_od.prestation_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-p_factures_soldes_od.montant_comptabilise AS montant_regle,
0-p_factures_soldes_od.montant_comptabilise_0 AS montant_regle_0,
0-p_factures_soldes_od.montant_comptabilise_1 AS montant_regle_1,
0-p_factures_soldes_od.montant_comptabilise_2 AS montant_regle_2,
0-p_factures_soldes_od.montant_comptabilise_22 AS montant_regle_22,
'1'::text AS od_avoir
FROM w_lien_avoir
JOIN activite[PX].p_factures_soldes_c p_factures_soldes_od ON p_factures_soldes_od.no_facture = no_facture_avoir
JOIN activite[PX].p_factures p_factures_avoir ON p_factures_avoir.no_facture = no_facture_avoir
JOIN activite[PX].p_factures p_factures_annulee ON p_factures_annulee.no_facture = no_facture_annulee
WHERE p_factures_soldes_od.montant_comptabilise <> 0
;
INSERT INTO activite[PX].p_factures_soldes_c(
no_facture,
facture_id,
date_comptable,
rubrique_comptabilisee_id,
prestation_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_avoir
)
SELECT
p_factures_avoir.no_facture,
p_factures_avoir.oid AS facture_id,
p_factures_avoir.date_vente AS date_comptable,
p_factures_soldes_od.rubrique_comptabilisee_id,
p_factures_soldes_od.prestation_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,
p_factures_soldes_od.montant_comptabilise AS montant_regle,
p_factures_soldes_od.montant_comptabilise_0 AS montant_regle_0,
p_factures_soldes_od.montant_comptabilise_1 AS montant_regle_1,
p_factures_soldes_od.montant_comptabilise_2 AS montant_regle_2,
p_factures_soldes_od.montant_comptabilise_22 AS montant_regle_22,
'1'::text AS od_avoir
FROM w_lien_avoir
JOIN activite[PX].p_factures_soldes_c p_factures_soldes_od ON p_factures_soldes_od.no_facture = no_facture_avoir
JOIN activite[PX].p_factures p_factures_avoir ON p_factures_avoir.no_facture = no_facture_avoir
JOIN activite[PX].p_factures p_factures_annulee ON p_factures_annulee.no_facture = no_facture_annulee
WHERE p_factures_soldes_od.montant_comptabilise <> 0
;
INSERT INTO activite[PX].p_factures_soldes_h(
no_facture,
facture_id,
date_comptable,
medecin_comptabilise_id,
rubrique_comptabilisee_id,
prestation_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_avoir
)
SELECT
p_factures_annulee.no_facture,
p_factures_annulee.oid AS facture_id,
p_factures_avoir.date_vente AS date_comptable,
p_factures_soldes_od.medecin_comptabilise_id,
p_factures_soldes_od.rubrique_comptabilisee_id,
p_factures_soldes_od.prestation_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-p_factures_soldes_od.montant_comptabilise AS montant_regle,
0-p_factures_soldes_od.montant_comptabilise_0 AS montant_regle_0,
0-p_factures_soldes_od.montant_comptabilise_1 AS montant_regle_1,
0-p_factures_soldes_od.montant_comptabilise_2 AS montant_regle_2,
0-p_factures_soldes_od.montant_comptabilise_22 AS montant_regle_22,
'1'::text AS od_avoir
FROM w_lien_avoir
JOIN activite[PX].p_factures_soldes_h p_factures_soldes_od ON p_factures_soldes_od.no_facture = no_facture_avoir
JOIN activite[PX].p_factures p_factures_avoir ON p_factures_avoir.no_facture = no_facture_avoir
JOIN activite[PX].p_factures p_factures_annulee ON p_factures_annulee.no_facture = no_facture_annulee
WHERE p_factures_soldes_od.montant_comptabilise <> 0
;
INSERT INTO activite[PX].p_factures_soldes_h(
no_facture,
facture_id,
date_comptable,
medecin_comptabilise_id,
rubrique_comptabilisee_id,
prestation_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_avoir
)
SELECT
p_factures_avoir.no_facture,
p_factures_avoir.oid AS facture_id,
p_factures_avoir.date_vente AS date_comptable,
p_factures_soldes_od.medecin_comptabilise_id,
p_factures_soldes_od.rubrique_comptabilisee_id,
p_factures_soldes_od.prestation_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,
p_factures_soldes_od.montant_comptabilise AS montant_regle,
p_factures_soldes_od.montant_comptabilise_0 AS montant_regle_0,
p_factures_soldes_od.montant_comptabilise_1 AS montant_regle_1,
p_factures_soldes_od.montant_comptabilise_2 AS montant_regle_2,
p_factures_soldes_od.montant_comptabilise_22 AS montant_regle_22,
'1'::text AS od_avoir
FROM w_lien_avoir
JOIN activite[PX].p_factures_soldes_h p_factures_soldes_od ON p_factures_soldes_od.no_facture = no_facture_avoir
JOIN activite[PX].p_factures p_factures_avoir ON p_factures_avoir.no_facture = no_facture_avoir
JOIN activite[PX].p_factures p_factures_annulee ON p_factures_annulee.no_facture = no_facture_annulee
WHERE p_factures_soldes_od.montant_comptabilise <> 0
;
-- Ecarts total réglé et detail regle par OD
DROP TABLE IF EXISTS w_factures_solde;
CREATE TEMP TABLE w_factures_solde AS
SELECT
ANN_DOS2|| to_char(COD_DOS2,'FM900000') || '.' || to_char(IND_DOS2,'FM00') AS no_facture,
date(DFA_DOS2) AS DFA_DOS2,
CASE WHEN SJ1_DOS2 = SR1_DOS2 THEN '1' ELSE '0' END AS solde1c,
CASE WHEN SJ2_DOS2 = SR2_DOS2 THEN '1' ELSE '0' END AS solde2c,
CASE WHEN SJ3_DOS2 = SR3_DOS2 THEN '1' ELSE '0' END AS solde0c,
CASE WHEN HO1_DOS2 = HR1_DOS2 THEN '1' ELSE '0' END AS solde1h,
CASE WHEN HO2_DOS2 = HR2_DOS2 THEN '1' ELSE '0' END AS solde2h,
CASE WHEN HO3_DOS2 = HR3_DOS2 THEN '1' ELSE '0' END AS solde0h
FROM prod_sigems.DOS2
;
INSERT INTO activite[PX].p_factures_soldes_c(
facture_id,
no_facture,
date_comptable,
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,
p_factures_soldes_c.no_facture,
MAX(date_comptable),
prestation_id,
rubrique_comptabilisee_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,
SUM(CASE WHEN solde0c = '1' THEN montant_comptabilise_0-montant_regle_0 ELSE 0 END)+
SUM(CASE WHEN solde1c = '1' THEN montant_comptabilise_1-montant_regle_1 ELSE 0 END)+
SUM(CASE WHEN solde2c = '1' THEN montant_comptabilise_2-montant_regle_2 ELSE 0 END) AS montant_regle,
SUM(CASE WHEN solde0c = '1' THEN montant_comptabilise_0-montant_regle_0 ELSE 0 END) AS montant_regle_0,
SUM(CASE WHEN solde1c = '1' THEN montant_comptabilise_1-montant_regle_1 ELSE 0 END) AS montant_regle_1,
SUM(CASE WHEN solde2c = '1' THEN montant_comptabilise_2-montant_regle_2 ELSE 0 END) AS montant_regle_2,
0 AS montant_regle_22,
'1' AS od_non_comptabilise
FROM activite[PX].p_factures_soldes_c
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
JOIN w_factures_solde ON w_factures_solde.no_facture = p_factures_soldes_c.no_facture
WHERE t_prestations.code_original <> '*CTI_ACO85'
GROUP BY 1,2,4,5,6
HAVING SUM(montant_comptabilise-montant_regle) <> 0
;
INSERT INTO activite[PX].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,
p_factures_soldes_h.no_facture,
MAX(date_comptable),
medecin_comptabilise_id,
prestation_id,
rubrique_comptabilisee_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,
SUM(CASE WHEN solde0h = '1' THEN montant_comptabilise_0-montant_regle_0 ELSE 0 END)+
SUM(CASE WHEN solde1h = '1' THEN montant_comptabilise_1-montant_regle_1 ELSE 0 END)+
SUM(CASE WHEN solde2h = '1' THEN montant_comptabilise_2-montant_regle_2 ELSE 0 END) AS montant_regle,
SUM(CASE WHEN solde0h = '1' THEN montant_comptabilise_0-montant_regle_0 ELSE 0 END) AS montant_regle_0,
SUM(CASE WHEN solde1h = '1' THEN montant_comptabilise_1-montant_regle_1 ELSE 0 END) AS montant_regle_1,
SUM(CASE WHEN solde2h = '1' THEN montant_comptabilise_2-montant_regle_2 ELSE 0 END) AS montant_regle_2,
0 AS montant_regle_22,
'1' AS od_non_comptabilise
FROM activite[PX].p_factures_soldes_h
JOIN w_factures_solde ON w_factures_solde.no_facture = p_factures_soldes_h.no_facture
WHERE p_factures_soldes_h.no_facture NOT IN (SELECT no_facture FROM activite[PX].p_factures_soldes_h WHERE medecin_comptabilise_id = 0)
GROUP BY 1,2,4,5,6
HAVING SUM(montant_comptabilise-montant_regle) <> 0 AND
(
SUM(CASE WHEN solde0h = '1' THEN montant_comptabilise_0-montant_regle_0 ELSE 0 END)+
SUM(CASE WHEN solde1h = '1' THEN montant_comptabilise_1-montant_regle_1 ELSE 0 END)+
SUM(CASE WHEN solde2h = '1' THEN montant_comptabilise_2-montant_regle_2 ELSE 0 END)
) <> 0
;
UPDATE activite[PX].p_factures SET
montant_regle_0_c = CASE WHEN solde0c = '1' THEN montant_comptabilise_0_c ELSE p_factures.montant_regle_0_c END,
montant_regle_1_c = CASE WHEN solde1c = '1' THEN montant_comptabilise_1_c ELSE p_factures.montant_regle_1_c END,
montant_regle_2_c = CASE WHEN solde2c = '1' THEN montant_comptabilise_2_c ELSE p_factures.montant_regle_2_c END,
montant_regle_0_h = CASE WHEN solde0h = '1' THEN montant_comptabilise_0_h ELSE p_factures.montant_regle_0_h END,
montant_regle_1_h = CASE WHEN solde1h = '1' THEN montant_comptabilise_1_h ELSE p_factures.montant_regle_1_h END,
montant_regle_2_h = CASE WHEN solde2h = '1' THEN montant_comptabilise_2_h ELSE p_factures.montant_regle_2_h END
FROM w_factures_solde
WHERE w_factures_solde.no_facture = p_factures.no_facture AND
(
montant_regle_0_c IS DIStinct from CASE WHEN solde0c = '1' THEN montant_comptabilise_0_c ELSE p_factures.montant_regle_0_c END OR
montant_regle_1_c IS DIStinct from CASE WHEN solde1c = '1' THEN montant_comptabilise_1_c ELSE p_factures.montant_regle_1_c END OR
montant_regle_2_c IS DIStinct from CASE WHEN solde2c = '1' THEN montant_comptabilise_2_c ELSE p_factures.montant_regle_2_c END OR
montant_regle_0_h IS DIStinct from CASE WHEN solde0h = '1' THEN montant_comptabilise_0_h ELSE p_factures.montant_regle_0_h END OR
montant_regle_1_h IS DIStinct from CASE WHEN solde1h = '1' THEN montant_comptabilise_1_h ELSE p_factures.montant_regle_1_h END OR
montant_regle_2_h IS DIStinct from CASE WHEN solde2h = '1' THEN montant_comptabilise_2_h ELSE p_factures.montant_regle_2_h END
)
;
UPDATE activite[PX].p_factures SET
montant_regle_c = montant_regle_0_c+montant_regle_1_c+montant_regle_2_c,
montant_regle_h = montant_regle_0_h+montant_regle_1_h+montant_regle_2_h
WHERE
(
montant_regle_c IS DISTINCT FROM montant_regle_0_c+montant_regle_1_c+montant_regle_2_c OR
montant_regle_h IS DISTINCT FROM montant_regle_0_h+montant_regle_1_h+montant_regle_2_h
)
;
]]></sqlcmd>
</NODE>
<NODE label="Factures de référence">
<sqlcmd><![CDATA[
-- Correction date de fin facture pour séjours présents si un GHS est dans les lignes 'saisies'
UPDATE activite[PX].p_factures SET
date_fin = subview.DFI_LCL
FROM
(
SELECT p_factures.no_facture, DFI_LCL, type_sejour, date_debut, date_fin, SER_LCL
FROM activite[PX].p_factures
JOIN activite[PX].p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
JOIN
(
SELECT ANN_LCL || to_char(COD_LCL,'FM900000') AS SEJ_LCL,
date(MAX(DFI_LCL)) AS DFI_LCL,
MAX(SER_LCL) AS SER_LCL
FROM prod_sigems.DOSSIER
JOIN prod_sigems.LIG_CLINI ON
ANN_LCL = ANN_DOS AND
COD_LCL = COD_DOS
WHERE DSO_DOS IS NULL AND
DFI_LCL IS NOT NULL AND
PRO_LCL = 'GHS' AND
DDE_LCL = DEN_DOS
GROUP BY 1
) subview
ON p_factures.no_sejour = SEJ_LCL AND
p_factures.code_facture = '0' AND
p_sejours.code_sorti = '0' AND
type_sejour <> '9' AND
p_factures.date_fin >= date(now() - interval '2 days') AND
DFI_LCL <> date_fin
) subview
WHERE p_factures.no_facture = subview.no_facture
;
-- Facture de référence
DROP TABLE IF EXISTS w_factures_reference;
CREATE TEMP TABLE w_factures_reference AS
SELECT
p_factures.no_sejour,
CASE WHEN avec_facturation_intermediaire = '1' THEN date_debut ELSE '00010101' END AS date_debut_reference,
MAX(CASE WHEN avec_facturation_intermediaire = '1' THEN date_fin ELSE '20991231' END) AS date_fin_reference,
(MAX(Array[
CASE WHEN type_facture NOT IN ('1','X') THEN '9' ELSE '0' END ||
CASE WHEN no_facture LIKE '%BG' THEN '9' ELSE '0' END ||
CASE WHEN p_factures.montant_facture_1_c + p_factures.montant_facture_1_h <> 0 OR p_factures.montant_facture_c + p_factures.montant_facture_h = 0 THEN '9' ELSE '0' END ||
p_factures.date_facture::text,no_facture
]))[2] AS no_facture_reference
FROM activite[PX].p_factures
JOIN activite[PX].p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
JOIN activite[PX].t_lieux ON lieu_sortie_id = t_lieux.oid
JOIN activite[PX].t_services_facturation ON service_facturation_id = t_services_facturation.oid
GROUP BY 1,2
ORDER BY 1,2;
CREATE INDEX w_factures_reference_i1
ON w_factures_reference
USING btree
(no_sejour);
CREATE INDEX w_factures_reference_i2
ON w_factures_reference
USING btree
(no_facture_reference);
UPDATE activite[PX].p_factures SET
no_facture_reference = w_factures_reference.no_facture_reference,
facture_reference_id = p_factures_reference.oid
FROM w_factures_reference
JOIN activite[PX].p_factures p_factures_reference ON p_factures_reference.no_facture = w_factures_reference.no_facture_reference
WHERE w_factures_reference.no_sejour = p_factures.no_sejour AND
p_factures.date_debut BETWEEN date_debut_reference AND date_fin_reference AND
(
p_factures.no_facture_reference IS DISTINCT FROM w_factures_reference.no_facture_reference OR
p_factures.facture_reference_id IS DISTINCT FROM p_factures_reference.oid
);
UPDATE activite[PX].p_factures SET
facture_reference_id = p_factures_references.oid
FROM activite[PX].p_factures p_factures_references
WHERE p_factures.no_facture_reference = p_factures_references.no_facture AND
p_factures.facture_reference_id IS DISTINCT FROM p_factures_references.oid
;
]]></sqlcmd>
</NODE>
<NODE label="Réorientation prestations FSD">
<sqlcmd><![CDATA[
-- Les FSD privés doivent être remonté en part établissement
INSERT INTO activite[PX].p_factures_lignes_c
(
no_facture,
facture_id,
date_debut,
date_fin,
nb_rubrique,
coefficient,
coefficient_mco,
rubrique_facturation_id,
prestation_id,
protocole_id,
compte_produit_id,
montant_facture,
montant_facture_0,
montant_facture_1,
montant_facture_2,
montant_facture_22,
taux_0,
taux_1,
taux_2,
taux_22,
prix_unitaire,
lieu_id,
nb_prestation,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
rubrique_comptabilisation_id,
montant_encours,
montant_encours_0,
montant_encours_1,
montant_encours_2,
montant_encours_22,
montant_facture_actes_inclus_dans_sejour,
montant_facture_0_actes_inclus_dans_sejour,
montant_facture_1_actes_inclus_dans_sejour,
montant_facture_2_actes_inclus_dans_sejour,
montant_facture_22_actes_inclus_dans_sejour,
origine_facturation_id,
montant_comptabilise_budget_global_1
)
SELECT
p_factures_lignes_h.no_facture,
p_factures_lignes_h.facture_id,
p_factures_lignes_h.date_debut,
p_factures_lignes_h.date_fin,
p_factures_lignes_h.nb_rubrique,
p_factures_lignes_h.coefficient,
p_factures_lignes_h.coefficient_mco,
p_factures_lignes_h.rubrique_facturation_id,
p_factures_lignes_h.prestation_id,
p_factures_lignes_h.protocole_id,
0::bigint AS compte_produit_id,
p_factures_lignes_h.montant_facture,
p_factures_lignes_h.montant_facture_0,
p_factures_lignes_h.montant_facture_1,
p_factures_lignes_h.montant_facture_2,
p_factures_lignes_h.montant_facture_22,
p_factures_lignes_h.taux_0,
p_factures_lignes_h.taux_1,
p_factures_lignes_h.taux_2,
p_factures_lignes_h.taux_22,
p_factures_lignes_h.prix_unitaire,
p_factures_lignes_h.lieu_id,
p_factures_lignes_h.nb_prestation,
p_factures_lignes_h.montant_comptabilise,
p_factures_lignes_h.montant_comptabilise_0,
p_factures_lignes_h.montant_comptabilise_1,
p_factures_lignes_h.montant_comptabilise_2,
p_factures_lignes_h.montant_comptabilise_22,
p_factures_lignes_h.rubrique_comptabilisation_id,
p_factures_lignes_h.montant_encours,
p_factures_lignes_h.montant_encours_0,
p_factures_lignes_h.montant_encours_1,
p_factures_lignes_h.montant_encours_2,
p_factures_lignes_h.montant_encours_22,
p_factures_lignes_h.montant_facture_actes_inclus_dans_sejour,
p_factures_lignes_h.montant_facture_0_actes_inclus_dans_sejour,
p_factures_lignes_h.montant_facture_1_actes_inclus_dans_sejour,
p_factures_lignes_h.montant_facture_2_actes_inclus_dans_sejour,
p_factures_lignes_h.montant_facture_22_actes_inclus_dans_sejour,
1::bigint AS origine_facturation_id,
0::numeric AS montant_comptabilise_budget_global_1
FROM activite[PX].p_factures_lignes_h
JOIN activite[PX].p_factures ON p_factures_lignes_h.no_facture = p_factures.no_facture
JOIN activite[PX].p_sejours On p_factures.no_sejour = p_sejours.no_sejour
JOIN activite[PX].t_rubriques_facturation ON rubrique_facturation_id = t_rubriques_facturation.oid
WHERE est_budget_global IS DISTINCT FROM '1' AND
est_force_etablissement = '1';
DROP TABLE IF EXISTS w_factures_h_ets;
CREATE TEMP TABLE w_factures_h_ets AS
SELECT
p_factures_lignes_h.no_facture,
SUM(p_factures_lignes_h.montant_facture) AS montant_facture,
SUM(p_factures_lignes_h.montant_facture_0) AS montant_facture_0,
SUM(p_factures_lignes_h.montant_facture_1) AS montant_facture_1,
SUM(p_factures_lignes_h.montant_facture_2) AS montant_facture_2,
SUM(p_factures_lignes_h.montant_facture_22) AS montant_facture_22,
SUM(p_factures_lignes_h.montant_comptabilise) AS montant_comptabilise,
SUM(p_factures_lignes_h.montant_comptabilise_0) AS montant_comptabilise_0,
SUM(p_factures_lignes_h.montant_comptabilise_1) AS montant_comptabilise_1,
SUM(p_factures_lignes_h.montant_comptabilise_2) AS montant_comptabilise_2,
SUM(p_factures_lignes_h.montant_comptabilise_22) AS montant_comptabilise_22
FROM activite[PX].p_factures_lignes_h
JOIN activite[PX].p_factures ON p_factures_lignes_h.no_facture = p_factures.no_facture
JOIN activite[PX].p_sejours On p_factures.no_sejour = p_sejours.no_sejour
JOIN activite[PX].t_rubriques_facturation ON rubrique_facturation_id = t_rubriques_facturation.oid
WHERE est_budget_global IS DISTINCT FROM '1' AND
est_force_etablissement = '1'
GROUP BY 1;
CREATE INDEX w_factures_h_ets_i1 ON w_factures_h_ets USING btree (no_facture);
UPDATE activite[PX].p_factures SET
montant_facture_c = montant_facture_c + montant_facture,
montant_facture_0_c = montant_facture_0_c + montant_facture_0,
montant_facture_1_c = montant_facture_1_c + montant_facture_1,
montant_facture_2_c = montant_facture_2_c + montant_facture_2,
montant_facture_22_c = montant_facture_22_c + montant_facture_22,
montant_comptabilise_c = montant_comptabilise_c + montant_comptabilise,
montant_comptabilise_0_c = montant_comptabilise_0_c + montant_comptabilise_0,
montant_comptabilise_1_c = montant_comptabilise_1_c + montant_comptabilise_1,
montant_comptabilise_2_c = montant_comptabilise_2_c + montant_comptabilise_2,
montant_comptabilise_22_c = montant_comptabilise_22_c + montant_comptabilise_22,
montant_facture_h = montant_facture_h - montant_facture,
montant_facture_0_h = montant_facture_0_h - montant_facture_0,
montant_facture_1_h = montant_facture_1_h - montant_facture_1,
montant_facture_2_h = montant_facture_2_h - montant_facture_2,
montant_facture_22_h = montant_facture_22_h - montant_facture_22,
montant_comptabilise_h = montant_comptabilise_h - montant_comptabilise,
montant_comptabilise_0_h = montant_comptabilise_0_h - montant_comptabilise_0,
montant_comptabilise_1_h = montant_comptabilise_1_h - montant_comptabilise_1,
montant_comptabilise_2_h = montant_comptabilise_2_h - montant_comptabilise_2,
montant_comptabilise_22_h = montant_comptabilise_22_h - montant_comptabilise_22
FROM w_factures_h_ets
WHERE w_factures_h_ets.no_facture = p_factures.no_facture;
DELETE FROM activite[PX].p_factures_lignes_h
USING activite[PX].t_rubriques_facturation
WHERE rubrique_facturation_id = t_rubriques_facturation.oid AND
est_force_etablissement = '1';
-- Les FSD public doivent être transformés en part établissement
DROP TABLE IF EXISTS w_factures_h_ets;
CREATE TEMP TABLE w_factures_h_ets AS
SELECT
p_factures_lignes_c.no_facture,
SUM(p_factures_lignes_c.montant_facture) AS montant_facture,
SUM(p_factures_lignes_c.montant_facture_0) AS montant_facture_0,
SUM(p_factures_lignes_c.montant_facture_1) AS montant_facture_1,
SUM(p_factures_lignes_c.montant_facture_2) AS montant_facture_2,
SUM(p_factures_lignes_c.montant_facture_22) AS montant_facture_22
FROM activite[PX].p_factures_lignes_c
JOIN activite[PX].t_rubriques_facturation ON rubrique_facturation_id = t_rubriques_facturation.oid
WHERE est_force_etablissement = '1' AND origine_facturation_id = 2
GROUP BY 1;
CREATE INDEX w_factures_h_ets_i1 ON w_factures_h_ets USING btree (no_facture);
UPDATE activite[PX].p_factures SET
montant_facture_c = montant_facture_c + montant_facture,
montant_facture_0_c = montant_facture_0_c + montant_facture_0,
montant_facture_1_c = montant_facture_1_c + montant_facture_1,
montant_facture_2_c = montant_facture_2_c + montant_facture_2,
montant_facture_22_c = montant_facture_22_c + montant_facture_22,
montant_facture_h = montant_facture_h - montant_facture,
montant_facture_0_h = montant_facture_0_h - montant_facture_0,
montant_facture_1_h = montant_facture_1_h - montant_facture_1,
montant_facture_2_h = montant_facture_2_h - montant_facture_2,
montant_facture_22_h = montant_facture_22_h - montant_facture_22
FROM w_factures_h_ets
WHERE w_factures_h_ets.no_facture = p_factures.no_facture;
UPDATE activite[PX].p_factures_lignes_c
SET origine_facturation_id = 1
FROM activite[PX].t_rubriques_facturation
WHERE rubrique_facturation_id = t_rubriques_facturation.oid AND
est_force_etablissement = '1' AND
origine_facturation_id = 2;
-- Les FSD comptabilisés doivent être transformés en part établissement
DROP TABLE IF EXISTS w_factures_soldes_h_ets;
CREATE TEMP TABLE w_factures_soldes_h_ets AS
SELECT
p_factures_soldes_h.no_facture,
p_factures_soldes_h.date_comptable,
SUM(p_factures_soldes_h.montant_comptabilise) AS montant_comptabilise,
SUM(p_factures_soldes_h.montant_comptabilise_0) AS montant_comptabilise_0,
SUM(p_factures_soldes_h.montant_comptabilise_1) AS montant_comptabilise_1,
SUM(p_factures_soldes_h.montant_comptabilise_2) AS montant_comptabilise_2,
SUM(p_factures_soldes_h.montant_comptabilise_22) AS montant_comptabilise_22,
SUM(p_factures_soldes_h.montant_regle) AS montant_regle,
SUM(p_factures_soldes_h.montant_regle_0) AS montant_regle_0,
SUM(p_factures_soldes_h.montant_regle_1) AS montant_regle_1,
SUM(p_factures_soldes_h.montant_regle_2) AS montant_regle_2,
SUM(p_factures_soldes_h.montant_regle_22) AS montant_regle_22
FROM activite[PX].p_factures_soldes_h
JOIN activite[PX].t_rubriques_facturation ON rubrique_comptabilisee_id = t_rubriques_facturation.oid
WHERE est_force_etablissement = '1'
GROUP BY 1,2;
DROP TABLE IF EXISTS w_factures_h_ets;
CREATE TEMP TABLE w_factures_h_ets AS
SELECT
no_facture,
SUM(montant_regle) AS montant_regle,
SUM(montant_regle_0) AS montant_regle_0,
SUM(montant_regle_1) AS montant_regle_1,
SUM(montant_regle_2) AS montant_regle_2,
SUM(montant_regle_22) AS montant_regle_22
FROM w_factures_soldes_h_ets
GROUP BY 1;
CREATE INDEX w_factures_h_ets_i1 ON w_factures_h_ets USING btree (no_facture);
UPDATE activite[PX].p_factures SET
montant_regle_c = montant_regle_c + montant_regle,
montant_regle_0_c = montant_regle_0_c + montant_regle_0,
montant_regle_1_c = montant_regle_1_c + montant_regle_1,
montant_regle_2_c = montant_regle_2_c + montant_regle_2,
montant_regle_22_c = montant_regle_22_c + montant_regle_22,
montant_regle_h = montant_regle_h - montant_regle,
montant_regle_0_h = montant_regle_0_h - montant_regle_0,
montant_regle_1_h = montant_regle_1_h - montant_regle_1,
montant_regle_2_h = montant_regle_2_h - montant_regle_2,
montant_regle_22_h = montant_regle_22_h - montant_regle_22
FROM w_factures_h_ets
WHERE w_factures_h_ets.no_facture = p_factures.no_facture;
INSERT INTO activite[PX].p_factures_soldes_c
(
no_facture,
facture_id,
date_comptable,
rubrique_comptabilisee_id,
prestation_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_avoir
)
SELECT
p_factures_soldes_h.no_facture,
p_factures_soldes_h.facture_id,
p_factures_soldes_h.date_comptable,
p_factures_soldes_h.rubrique_comptabilisee_id,
p_factures_soldes_h.prestation_id,
p_factures_soldes_h.montant_comptabilise,
p_factures_soldes_h.montant_comptabilise_0,
p_factures_soldes_h.montant_comptabilise_1,
p_factures_soldes_h.montant_comptabilise_2,
p_factures_soldes_h.montant_comptabilise_22,
p_factures_soldes_h.montant_regle,
p_factures_soldes_h.montant_regle_0,
p_factures_soldes_h.montant_regle_1,
p_factures_soldes_h.montant_regle_2,
p_factures_soldes_h.montant_regle_22,
p_factures_soldes_h.od_avoir
FROM activite[PX].p_factures_soldes_h
JOIN activite[PX].t_rubriques_facturation ON rubrique_comptabilisee_id = t_rubriques_facturation.oid
WHERE est_force_etablissement = '1';
DELETE FROM activite[PX].p_factures_soldes_h
USING activite[PX].t_rubriques_facturation
WHERE rubrique_comptabilisee_id = t_rubriques_facturation.oid AND
est_force_etablissement = '1';
]]></sqlcmd>
</NODE>
<NODE label="Réorientation prestations médecins salariés">
<sqlcmd><![CDATA[
-- Les médecins salariés doivent être remonté en part établissement
INSERT INTO activite[PX].p_factures_lignes_c
(
no_facture,
facture_id,
date_debut,
date_fin,
nb_rubrique,
coefficient,
coefficient_mco,
rubrique_facturation_id,
prestation_id,
protocole_id,
compte_produit_id,
taux_0,
taux_1,
taux_2,
taux_22,
prix_unitaire,
lieu_id,
nb_prestation,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
rubrique_comptabilisation_id,
montant_encours,
montant_encours_0,
montant_encours_1,
montant_encours_2,
montant_encours_22,
montant_facture_actes_inclus_dans_sejour,
montant_facture_0_actes_inclus_dans_sejour,
montant_facture_1_actes_inclus_dans_sejour,
montant_facture_2_actes_inclus_dans_sejour,
montant_facture_22_actes_inclus_dans_sejour,
origine_facturation_id,
montant_comptabilise_budget_global_1
)
SELECT
p_factures_lignes_h.no_facture,
p_factures_lignes_h.facture_id,
p_factures_lignes_h.date_debut,
p_factures_lignes_h.date_fin,
p_factures_lignes_h.nb_rubrique,
p_factures_lignes_h.coefficient,
p_factures_lignes_h.coefficient_mco,
p_factures_lignes_h.rubrique_facturation_id,
p_factures_lignes_h.prestation_id,
p_factures_lignes_h.protocole_id,
0::bigint AS compte_produit_id,
p_factures_lignes_h.taux_0,
p_factures_lignes_h.taux_1,
p_factures_lignes_h.taux_2,
p_factures_lignes_h.taux_22,
p_factures_lignes_h.prix_unitaire,
p_factures_lignes_h.lieu_id,
p_factures_lignes_h.nb_prestation,
p_factures_lignes_h.montant_comptabilise,
p_factures_lignes_h.montant_comptabilise_0,
p_factures_lignes_h.montant_comptabilise_1,
p_factures_lignes_h.montant_comptabilise_2,
p_factures_lignes_h.montant_comptabilise_22,
p_factures_lignes_h.rubrique_comptabilisation_id,
p_factures_lignes_h.montant_encours,
p_factures_lignes_h.montant_encours_0,
p_factures_lignes_h.montant_encours_1,
p_factures_lignes_h.montant_encours_2,
p_factures_lignes_h.montant_encours_22,
p_factures_lignes_h.montant_facture_actes_inclus_dans_sejour,
p_factures_lignes_h.montant_facture_0_actes_inclus_dans_sejour,
p_factures_lignes_h.montant_facture_1_actes_inclus_dans_sejour,
p_factures_lignes_h.montant_facture_2_actes_inclus_dans_sejour,
p_factures_lignes_h.montant_facture_22_actes_inclus_dans_sejour,
1::bigint AS origine_facturation_id,
0::numeric AS montant_comptabilise_budget_global_1
FROM activite[PX].p_factures_lignes_h
JOIN activite[PX].p_factures ON p_factures_lignes_h.no_facture = p_factures.no_facture
JOIN activite[PX].t_medecins_administratifs ON medecin_comptabilise_id = t_medecins_administratifs.oid
JOIN activite[PX].p_sejours On p_factures.no_sejour = p_sejours.no_sejour
--JOIN activite[PX].t_rubriques_facturation ON rubrique_facturation_id = t_rubriques_facturation.oid
WHERE est_budget_global IS DISTINCT FROM '1' AND est_medecin_salarie = 1 AND
p_factures_lignes_h.montant_comptabilise <> 0
;
DROP TABLE IF EXISTS w_factures_h_ets;
CREATE TEMP TABLE w_factures_h_ets AS
SELECT
p_factures_lignes_h.no_facture,
SUM(p_factures_lignes_h.montant_comptabilise) AS montant_comptabilise,
SUM(p_factures_lignes_h.montant_comptabilise_0) AS montant_comptabilise_0,
SUM(p_factures_lignes_h.montant_comptabilise_1) AS montant_comptabilise_1,
SUM(p_factures_lignes_h.montant_comptabilise_2) AS montant_comptabilise_2,
SUM(p_factures_lignes_h.montant_comptabilise_22) AS montant_comptabilise_22
FROM activite[PX].p_factures_lignes_h
JOIN activite[PX].t_medecins_administratifs ON medecin_comptabilise_id = t_medecins_administratifs.oid
JOIN activite[PX].p_factures ON p_factures_lignes_h.no_facture = p_factures.no_facture
JOIN activite[PX].p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
--JOIN activite[PX].t_rubriques_facturation ON rubrique_facturation_id = t_rubriques_facturation.oid
WHERE est_budget_global IS DISTINCT FROM '1' AND
est_medecin_salarie = 1 AND
p_factures_lignes_h.montant_comptabilise <> 0
GROUP BY 1;
CREATE INDEX w_factures_h_ets_i1 ON w_factures_h_ets USING btree (no_facture);
UPDATE activite[PX].p_factures SET
montant_comptabilise_c = montant_comptabilise_c + montant_comptabilise,
montant_comptabilise_0_c = montant_comptabilise_0_c + montant_comptabilise_0,
montant_comptabilise_1_c = montant_comptabilise_1_c + montant_comptabilise_1,
montant_comptabilise_2_c = montant_comptabilise_2_c + montant_comptabilise_2,
montant_comptabilise_22_c = montant_comptabilise_22_c + montant_comptabilise_22,
montant_comptabilise_h = montant_comptabilise_h - montant_comptabilise,
montant_comptabilise_0_h = montant_comptabilise_0_h - montant_comptabilise_0,
montant_comptabilise_1_h = montant_comptabilise_1_h - montant_comptabilise_1,
montant_comptabilise_2_h = montant_comptabilise_2_h - montant_comptabilise_2,
montant_comptabilise_22_h = montant_comptabilise_22_h - montant_comptabilise_22
FROM w_factures_h_ets
WHERE w_factures_h_ets.no_facture = p_factures.no_facture;
UPDATE activite[PX].p_factures_lignes_h
SET
montant_comptabilise = 0,
montant_comptabilise_0 = 0,
montant_comptabilise_1 = 0,
montant_comptabilise_2 = 0,
montant_comptabilise_22 = 0
FROM activite[PX].t_medecins_administratifs
WHERE medecin_comptabilise_id = t_medecins_administratifs.oid AND
est_medecin_salarie = 1 AND
p_factures_lignes_h.montant_comptabilise <> 0;
DROP TABLE IF EXISTS w_factures_soldes_h_ets;
CREATE TEMP TABLE w_factures_soldes_h_ets AS
SELECT
p_factures_soldes_h.no_facture,
p_factures_soldes_h.date_comptable,
SUM(p_factures_soldes_h.montant_comptabilise) AS montant_comptabilise,
SUM(p_factures_soldes_h.montant_comptabilise_0) AS montant_comptabilise_0,
SUM(p_factures_soldes_h.montant_comptabilise_1) AS montant_comptabilise_1,
SUM(p_factures_soldes_h.montant_comptabilise_2) AS montant_comptabilise_2,
SUM(p_factures_soldes_h.montant_comptabilise_22) AS montant_comptabilise_22,
SUM(p_factures_soldes_h.montant_regle) AS montant_regle,
SUM(p_factures_soldes_h.montant_regle_0) AS montant_regle_0,
SUM(p_factures_soldes_h.montant_regle_1) AS montant_regle_1,
SUM(p_factures_soldes_h.montant_regle_2) AS montant_regle_2,
SUM(p_factures_soldes_h.montant_regle_22) AS montant_regle_22
FROM activite[PX].p_factures_soldes_h
JOIN activite[PX].t_medecins_administratifs ON medecin_comptabilise_id = t_medecins_administratifs.oid
WHERE est_medecin_salarie = 1 AND
(
p_factures_soldes_h.montant_comptabilise <> 0 OR
p_factures_soldes_h.montant_regle <> 0
)
GROUP BY 1,2;
DROP TABLE IF EXISTS w_factures_h_ets;
CREATE TEMP TABLE w_factures_h_ets AS
SELECT
no_facture,
SUM(montant_regle) AS montant_regle,
SUM(montant_regle_0) AS montant_regle_0,
SUM(montant_regle_1) AS montant_regle_1,
SUM(montant_regle_2) AS montant_regle_2,
SUM(montant_regle_22) AS montant_regle_22
FROM w_factures_soldes_h_ets
GROUP BY 1;
CREATE INDEX w_factures_h_ets_i1 ON w_factures_h_ets USING btree (no_facture);
UPDATE activite[PX].p_factures SET
montant_regle_c = montant_regle_c + montant_regle,
montant_regle_0_c = montant_regle_0_c + montant_regle_0,
montant_regle_1_c = montant_regle_1_c + montant_regle_1,
montant_regle_2_c = montant_regle_2_c + montant_regle_2,
montant_regle_22_c = montant_regle_22_c + montant_regle_22,
montant_regle_h = montant_regle_h - montant_regle,
montant_regle_0_h = montant_regle_0_h - montant_regle_0,
montant_regle_1_h = montant_regle_1_h - montant_regle_1,
montant_regle_2_h = montant_regle_2_h - montant_regle_2,
montant_regle_22_h = montant_regle_22_h - montant_regle_22
FROM w_factures_h_ets
WHERE w_factures_h_ets.no_facture = p_factures.no_facture;
INSERT INTO activite[PX].p_factures_soldes_c
(
no_facture,
facture_id,
date_comptable,
rubrique_comptabilisee_id,
prestation_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_avoir,
od_non_comptabilise
)
SELECT
p_factures_soldes_h.no_facture,
p_factures_soldes_h.facture_id,
p_factures_soldes_h.date_comptable,
p_factures_soldes_h.rubrique_comptabilisee_id,
p_factures_soldes_h.prestation_id,
p_factures_soldes_h.montant_comptabilise,
p_factures_soldes_h.montant_comptabilise_0,
p_factures_soldes_h.montant_comptabilise_1,
p_factures_soldes_h.montant_comptabilise_2,
p_factures_soldes_h.montant_comptabilise_22,
p_factures_soldes_h.montant_regle,
p_factures_soldes_h.montant_regle_0,
p_factures_soldes_h.montant_regle_1,
p_factures_soldes_h.montant_regle_2,
p_factures_soldes_h.montant_regle_22,
p_factures_soldes_h.od_avoir,
'1'::text AS od_non_comptabilise
FROM activite[PX].p_factures_soldes_h
JOIN activite[PX].t_medecins_administratifs ON medecin_comptabilise_id = t_medecins_administratifs.oid
WHERE est_medecin_salarie = 1 AND
(
p_factures_soldes_h.montant_comptabilise <> 0 OR
p_factures_soldes_h.montant_regle <> 0
);
DELETE FROM activite[PX].p_factures_soldes_h
USING activite[PX].t_medecins_administratifs
WHERE medecin_comptabilise_id = t_medecins_administratifs.oid AND
est_medecin_salarie = 1 AND
(
p_factures_soldes_h.montant_comptabilise <> 0 OR
p_factures_soldes_h.montant_regle <> 0
)
;
]]></sqlcmd>
</NODE>
</NODE>
<NODE name="CHIFFRIER" label="CREATION DU CHIFFRIER">
<NODE label="Ecritures comptables">
<sqlcmd><![CDATA[
-- Ecritures comptables
DROP TABLE IF EXISTS w_STE;
CREATE TEMP TABLE w_STE AS
SELECT (MAX(ARRAY[to_char(nb,'FM000000000000'),ECR_STE]))[2] AS ECR_STE_cli
FROM
(
SELECT ECR_STE, count(*) AS nb
FROM prod_sigems.ecrit
WHERE ECR_DATE >= date_trunc('year',now())-interval '1 year'
GROUP BY 1
) subview
;
DROP TABLE IF EXISTS w_ECRIT_CLI;
CREATE TEMP TABLE w_ECRIT_CLI AS
SELECT ''::text AS ANNEE,
0::numeric AS CODE,
0::numeric AS INDICE,
''::text AS no_sejour,
''::text AS no_facture,
ECRIT.*,
COALESCE(ECR_LIBEL,'') AS ECR_LIBEL,
COALESCE(SER_REG,0) AS SER_REG,
'0'::text AS ECR_ACOMPTE,
0::bigint AS medecin_administratif_id,
0::bigint AS tiers_payant_id,
''::text AS mode_reglement_code
FROM prod_sigems.ECRIT
JOIN w_STE ON ECR_STE = ECR_STE_cli
LEFT JOIN prod_sigems.ECRIT_COMPTALIBEL ON ECRIT.ECR_NUM = ECRIT_COMPTALIBEL.ECR_NUM
LEFT JOIN prod_sigems.MAGIC ON ECRIT.ECR_NUM = MAGIC.NUM_ECR
WHERE ECR_DATE >= '[ENV_ADM_ANNEEDEBUT]0101' AND
ECRIT.ECR_JNAL <> 'AN' AND
ECRIT.ECR_JNAL <> 'ANH' AND
ECRIT.ECR_JNAL <> 'ACHAT' AND
ECRIT.ECR_JNAL <> 'ACHA' AND
ECRIT.ECR_JNAL <> 'SITU' AND
ECRIT.ECR_ANNUL <> 'S' AND
ECRIT.ECR_PIECE <> 'CENTRALI' AND
ECRIT.ECR_PLAN NOT IN ('A','B')
;
UPDATE w_ECRIT_CLI
SET ECR_CEMT = ECR_CPTE
WHERE ECR_CEMT = ''
;
UPDATE w_ECRIT_CLI SET
ANNEE = DOS_ECRIT.ANNEE,
CODE = DOS_ECRIT.CODE,
INDICE = DOS_ECRIT.INDICE,
no_sejour = DOS_ECRIT.ANNEE || to_char(DOS_ECRIT.CODE, 'FM900000'),
no_facture = DOS_ECRIT.ANNEE || to_char(DOS_ECRIT.CODE, 'FM900000') || '.' || to_char(DOS_ECRIT.INDICE,'FM00')
FROM prod_sigems.DOS_ECRIT
WHERE SERI = ECR_NUM
;
UPDATE w_ECRIT_CLI SET
ANNEE = subview.ANNEE,
CODE = subview.CODE,
INDICE = subview.INDICE,
no_sejour = subview.no_sejour,
no_facture = subview.no_facture
FROM
(
SELECT SER_REG, ECR_JNAL, ECR_DATE,
MAX(ANNEE) AS ANNEE,
MAX(CODE) AS CODE,
MAX(INDICE) AS INDICE,
MAX(no_sejour) AS no_sejour,
MAX(no_facture) AS no_facture
FROM w_ECRIT_CLI
GROUP BY 1,2,3
HAVING MAX(CODE) > 0 AND MIN(CODE) = 0 AND
count(DISTINCT CASE WHEN no_facture <> '' THEN no_facture ELSE NULL END) = 1
) subview
WHERE w_ECRIT_CLI.SER_REG = subview.SER_REG AND
w_ECRIT_CLI.ECR_JNAL = subview.ECR_JNAL AND
w_ECRIT_CLI.ECR_DATE = subview.ECR_DATE AND
w_ECRIT_CLI.CODE = 0
;
UPDATE w_ECRIT_CLI SET
ANNEE = subview.ANNEE,
CODE = subview.CODE,
INDICE = subview.INDICE,
no_sejour = subview.no_sejour,
no_facture = subview.no_facture
FROM
(
SELECT ECR_PIECE, ECR_JNAL, ECR_DATE,
MAX(ANNEE) AS ANNEE,
MAX(CODE) AS CODE,
MAX(INDICE) AS INDICE,
MAX(no_sejour) AS no_sejour,
MAX(no_facture) AS no_facture
FROM w_ECRIT_CLI
GROUP BY 1,2,3
HAVING MAX(CODE) > 0 AND MIN(CODE) = 0 AND
count(DISTINCT CASE WHEN no_facture <> '' THEN no_facture ELSE NULL END) = 1
) subview
WHERE w_ECRIT_CLI.ECR_PIECE = subview.ECR_PIECE AND
w_ECRIT_CLI.ECR_JNAL = subview.ECR_JNAL AND
w_ECRIT_CLI.ECR_DATE = subview.ECR_DATE AND
w_ECRIT_CLI.CODE = 0
;
UPDATE w_ECRIT_CLI
SET ECR_ACOMPTE = '1'
WHERE ECR_CEMT LIKE '41%' AND SER_REG IN
(
SELECT SER_REG
FROM w_ECRIT_CLI
WHERE
ecr_jnal NOT LIKE 'VEN%' AND ecr_plan <> 'C' AND ecr_plan <> 'G'
GROUP BY 1
HAVING SUM(CASE WHEN ECR_CEMT LIKE '41%' THEN ECR_CREDIT-ECR_DEBIT ELSE 0 END) =
SUM(CASE WHEN ECR_CPTE = 'ACOMPT' THEN ECR_DEBIT-ECR_CREDIT ELSE 0 END) AND
SUM(CASE WHEN ECR_CPTE = 'ACOMPT' THEN 1 ELSE 0 END) > 0
)
;
UPDATE w_ECRIT_CLI
SET medecin_administratif_id = t_medecins_administratifs.oid
FROM activite[PX].t_medecins_administratifs
WHERE ECR_PLAN = 'M' AND
ECR_CPTE = t_medecins_administratifs.code_original
;
UPDATE w_ECRIT_CLI
SET tiers_payant_id =
CASE substr(ECR_CPTE,4,1)
WHEN '1' THEN tiers_payant_1_id
WHEN '2' THEN tiers_payant_2_id
WHEN '3' THEN tiers_payant_0_id
END
FROM activite[PX].p_factures
WHERE w_ECRIT_CLI.no_facture = p_factures.no_facture AND
tiers_payant_id = 0 AND
ECR_PLAN = ANY(ARRAY['C','P']) AND substr(ECR_CPTE,4,1) IN ('1','2','3')
;
UPDATE w_ECRIT_CLI
SET tiers_payant_id =
CASE substr(ECR_CPTE,4,1)
WHEN '1' THEN tiers_payant_1_id
WHEN '2' THEN tiers_payant_2_id
WHEN '3' THEN tiers_payant_0_id
END
FROM activite[PX].p_sejours
WHERE w_ECRIT_CLI.no_sejour = p_sejours.no_sejour AND
tiers_payant_id = 0 AND
ECR_PLAN = ANY(ARRAY['C','P']) AND substr(ECR_CPTE,4,1) IN ('1','2','3')
;
UPDATE w_ECRIT_CLI
SET tiers_payant_id = tiers_payant_0_id
FROM activite[PX].p_sejours,
prod_sigems.REG
WHERE w_ECRIT_CLI.no_sejour = p_sejours.no_sejour AND
w_ECRIT_CLI.SER_REG = REG.SER_REG AND
CAI_REG = '99999999' AND
tiers_payant_id = 0 AND
ECR_PLAN = ANY(ARRAY['C','P'])
;
UPDATE w_ECRIT_CLI
SET tiers_payant_id = t_tiers_payant.oid
FROM activite[PX].t_tiers_payant
WHERE t_tiers_payant.code_original = 'PATIENT' AND
tiers_payant_id = 0 AND
ECR_PLAN = ANY(ARRAY['C','P']) AND
ANNEE = 'PA'
;
UPDATE w_ECRIT_CLI
SET tiers_payant_id = tiers_payant_1_id
FROM activite[PX].p_factures
WHERE w_ECRIT_CLI.no_facture = p_factures.no_facture AND
tiers_payant_id = 0 AND
ECR_PLAN = ANY(ARRAY['C','P']) AND
ECR_CPTE = 'NOEMIE'
;
-- Journal
INSERT INTO activite[PX].t_journal (code_original, code, texte)
SELECT CODEJ,
CODEJ,
MAX(LIBEL)
FROM prod_sigems.JNAL
WHERE CODEJ NOT IN (SELECT code_original FROM activite[PX].t_journal WHERE code_original IS NOT NULL)
GROUP BY 1,2
;
INSERT INTO activite[PX].t_journal (code_original, code, texte)
SELECT ECR_JNAL, ECR_JNAL, ECR_JNAL
FROM w_ECRIT_cli
WHERE ECR_JNAL NOT IN (SELECT code_original FROM activite[PX].t_journal WHERE code_original IS NOT NULL)
GROUP BY 1
;
INSERT INTO activite[PX].t_compte(code_original, code, texte, texte_court)
SELECT NUM, NUM, (MIN(ARRAY[TYP,INT1]))[2], (MIN(ARRAY[TYP,INT1||INT2]))[2]
FROM prod_sigems.COMPTE
WHERE TYP IN ('G','H') AND
NUM IN (SELECT ECR_CEMT FROM w_ECRIT_cli) AND
NUM <> '' AND
NUM <> '0' AND
NUM NOT LIKE '0' AND
NUM IS NOT NULL AND
NUM NOT IN (SELECT code_original FROM activite[PX].t_compte)
GROUP BY 1
ORDER BY 1
;
WITH comptes AS (
SELECT NUM,
(MIN(ARRAY[TYP,INT1]))[2] AS texte,
(MIN(ARRAY[TYP,INT1||INT2]))[2] AS texte_court
FROM prod_sigems.COMPTE
WHERE TYP IN ('G','H') AND
NUM IN (SELECT ECR_CEMT FROM w_ECRIT_cli) AND
NUM <> '' AND
NUM <> '0' AND
NUM NOT LIKE '0' AND
NUM IS NOT NULL
GROUP BY 1
ORDER BY 1
)
UPDATE activite[PX].t_compte SET
code = comptes.NUM,
texte = comptes.texte,
texte_court = comptes.texte_court
FROM comptes
WHERE NUM = code_original AND
(
t_compte.code IS DISTINCT FROM NUM OR
t_compte.texte IS DISTINCT FROM comptes.texte OR
t_compte.texte_court IS DISTINCT FROM comptes.texte_court
)
;
INSERT INTO activite[PX].t_compte(code_original, code, texte, texte_court)
SELECT ECR_CEMT, ECR_CEMT, ECR_CEMT, ECR_CEMT
FROM w_ECRIT_CLI
WHERE ECR_CEMT <> '' AND
ECR_CEMT NOT LIKE '0' AND
ECR_CEMT IS NOT NULL AND
ECR_CEMT NOT IN (SELECT code_original FROM activite[PX].t_compte)
GROUP BY 1
ORDER BY 1
;
-- Mode règlement
UPDATE w_ECRIT_CLI
SET mode_reglement_code = 'CHQ'
WHERE (ECR_CEMT LIKE '51%' OR ECR_CEMT LIKE '53%') AND
ECR_REDUI = 'c'
;
UPDATE w_ECRIT_CLI
SET mode_reglement_code = 'CB'
WHERE (ECR_CEMT LIKE '51%' OR ECR_CEMT LIKE '53%') AND
ECR_REDUI = 'b'
;
UPDATE w_ECRIT_CLI
SET mode_reglement_code = 'ESP'
WHERE (ECR_CEMT LIKE '51%' OR ECR_CEMT LIKE '53%') AND
ECR_REDUI = 'e'
;
UPDATE w_ECRIT_CLI
SET mode_reglement_code = 'VIR'
WHERE (ECR_CEMT LIKE '51%' OR ECR_CEMT LIKE '53%') AND
ECR_REDUI = 'v'
;
UPDATE w_ECRIT_CLI
SET mode_reglement_code = 'VIR'
WHERE (ECR_CEMT LIKE '51%' OR ECR_CEMT LIKE '53%') AND
mode_reglement_code = '' AND
(ECR_CHEQ ILIKE 'V%' OR ECR_LIBEL ILIKE 'VRT%' OR ECR_PIECE ILIKE 'VRT%' OR ECR_LIBEL ILIKE 'VIREMENT%')
;
UPDATE w_ECRIT_CLI
SET mode_reglement_code = 'CHQ'
WHERE (ECR_CEMT LIKE '51%' OR ECR_CEMT LIKE '53%') AND
mode_reglement_code = '' AND
length(ECR_CHEQ) = 7 AND
to_char(base.cti_to_number(ECR_CHEQ),'FM0000000') = ECR_CHEQ
;
UPDATE w_ECRIT_CLI
SET mode_reglement_code = 'CHQ'
WHERE (ECR_CEMT LIKE '51%' OR ECR_CEMT LIKE '53%') AND
mode_reglement_code = '' AND
(ECR_LIBEL ILIKE 'REMISE CHQ%' OR ECR_PIECE LIKE 'CHQ%')
;
UPDATE w_ECRIT_CLI
SET mode_reglement_code = 'CB'
WHERE (ECR_CEMT LIKE '51%' OR ECR_CEMT LIKE '53%') AND
mode_reglement_code = '' AND
ECR_LIBEL ILIKE 'REMISE C.B%'
;
UPDATE w_ECRIT_CLI
SET mode_reglement_code = 'VIR'
FROM
(
SELECT ECR_DATE, ECR_JNAL, ECR_PIECE
FROM w_ECRIT_CLI
GROUP BY 1,2,3
HAVING MAX(CASE WHEN ECR_CPTE = 'NOEMIE' THEN 1 ELSE 0 END) > 0 AND
MAX(CASE WHEN ECR_CEMT LIKE '51%' OR ECR_CEMT LIKE '53%' THEN 1 ELSE 0 END) > 0
) subview
WHERE w_ECRIT_CLI.ECR_DATE = subview.ECR_DATE AND
w_ECRIT_CLI.ECR_JNAL = subview.ECR_JNAL AND
w_ECRIT_CLI.ECR_PIECE = subview.ECR_PIECE AND
mode_reglement_code = '' AND
(w_ECRIT_CLI.ECR_CEMT LIKE '51%' OR w_ECRIT_CLI.ECR_CEMT LIKE '53%')
;
UPDATE w_ECRIT_CLI
SET mode_reglement_code = 'VIR'
WHERE (ECR_CEMT LIKE '51%' OR ECR_CEMT LIKE '53%') AND
mode_reglement_code = '' AND
ECR_REDUI = '1'
;
UPDATE w_ECRIT_CLI
SET mode_reglement_code = 'ESP'
WHERE (ECR_CEMT LIKE '51%' OR ECR_CEMT LIKE '53%') AND
mode_reglement_code = '' AND
ECR_LIBEL LIKE '%ESPECE%'
;
UPDATE w_ECRIT_CLI
SET mode_reglement_code = 'CHQ'
WHERE (ECR_CEMT LIKE '51%' OR ECR_CEMT LIKE '53%') AND
mode_reglement_code = '' AND
ECR_LIBEL LIKE '%CHEQUE%'
;
UPDATE w_ECRIT_CLI
SET mode_reglement_code = subview.mode_reglement_code
FROM
(
SELECT ECR_DATE, ECR_JNAL, ECR_PIECE, MAX(mode_reglement_code) AS mode_reglement_code
FROM w_ECRIT_CLI
WHERE (ECR_CEMT LIKE '51%' OR ECR_CEMT LIKE '53%')
GROUP BY 1,2,3
HAVING count(DISTINCT CASE WHEN mode_reglement_code <> '' THEN mode_reglement_code ELSE NULL END) = 1 AND
MAX(CASE WHEN mode_reglement_code = '' THEN 1 ELSE 0 END) > 0
) subview
WHERE w_ECRIT_CLI.ECR_DATE = subview.ECR_DATE AND
w_ECRIT_CLI.ECR_JNAL = subview.ECR_JNAL AND
w_ECRIT_CLI.ECR_PIECE = subview.ECR_PIECE AND
w_ECRIT_CLI.mode_reglement_code = '' AND
(w_ECRIT_CLI.ECR_CEMT LIKE '51%' OR w_ECRIT_CLI.ECR_CEMT LIKE '53%')
;
DROP TABLE IF EXISTS w_ecriture_comptable;
CREATE TEMP TABLE w_ecriture_comptable AS
SELECT
ECR_NUM::text AS code_original,
date(ECR_DATE) AS date_comptable,
CASE
WHEN t_journal.type_journal = 'VE' AND ECR_CEMT LIKE '411%' THEN 'VCLI'
WHEN t_journal.type_journal = 'VE' AND ECR_CEMT LIKE '412%' THEN 'VCLI'
WHEN t_journal.type_journal = 'VE' AND ECR_CEMT LIKE '445%' THEN 'VTVA'
WHEN t_journal.type_journal = 'VE' AND ECR_PLAN = 'G' THEN 'VPRD'
WHEN t_journal.type_journal = 'VE' AND ECR_PLAN = 'M' THEN 'VHON'
WHEN ECR_CEMT LIKE '758%' THEN 'PEPR'
WHEN ECR_CEMT LIKE '658%' THEN 'PEPR'
WHEN t_journal.type_journal <> 'VE' AND ECR_CEMT LIKE '468%' THEN 'ATT'
WHEN t_journal.type_journal <> 'VE' AND ECR_CEMT LIKE '471%' THEN 'ATT'
WHEN t_journal.type_journal <> 'VE' AND ECR_CPTE LIKE 'ACOMPT%' THEN 'ACPT'
WHEN t_journal.type_journal <> 'VE' AND ECR_CPTE LIKE 'NOEMIE%' THEN 'RNOE'
WHEN t_journal.type_journal <> 'VE' AND ECR_CEMT LIKE '411%' THEN 'RCLI'
WHEN t_journal.type_journal <> 'VE' AND ECR_CEMT LIKE '412%' THEN 'RCLI'
WHEN t_journal.type_journal <> 'VE' AND ECR_CEMT LIKE '419%' THEN 'ACPT'
WHEN t_journal.type_journal <> 'VE' AND ECR_CEMT LIKE '51%' THEN 'BANQ'
WHEN t_journal.type_journal <> 'VE' AND ECR_CEMT LIKE '531%' THEN 'BANQ'
WHEN t_journal.type_journal <> 'VE' AND ECR_CEMT LIKE '466%' THEN 'PHON'
WHEN t_journal.type_journal <> 'VE' AND ECR_CEMT LIKE '7%' THEN 'XPRD'
WHEN t_journal.type_journal <> 'VE' AND ECR_CEMT LIKE '445%' THEN 'XTVA'
ELSE '?'||ECR_JNAL END AS type_ecriture,
CASE
WHEN t_journal.type_journal = 'VE' THEN 'VENTE'
ELSE t_journal.type_journal END AS type_piece,
ECR_PIECE||'-'||ECR_JNAL||'-'||to_char(ECR_DATE,'YYYYMMDD') AS piece,
CASE WHEN JNAL.REFBASE = 'H' THEN 'H' ELSE 'C' END AS clinique_honoraire,
COALESCE(t_compte.oid,0) AS compte_id,
COALESCE(t_journal.oid,0) AS journal_id,
COALESCE(p_sejours.oid,0::bigint) AS sejour_id,
COALESCE(p_sejours.no_sejour,''::text) AS no_sejour,
COALESCE(p_factures.oid,0::bigint) AS facture_id,
COALESCE(p_factures.no_facture,'')::text AS no_facture,
medecin_administratif_id,
tiers_payant_id,
mode_reglement_code,
ECR_LIBEL AS texte,
ECR_DEBIT AS montant_debit,
ECR_CREDIT AS montant_credit
FROM w_ECRIT_CLI
JOIN prod_sigems.JNAL ON ECR_JNAL = JNAL.CODEJ
JOIN activite[PX].t_journal ON ECR_JNAL = t_journal.code_original
LEFT JOIN activite[PX].t_compte ON ECR_CEMT = t_compte.code
LEFT JOIN activite[PX].p_sejours ON w_ECRIT_CLI.no_sejour = p_sejours.no_sejour AND w_ECRIT_CLI.no_sejour <> ''
LEFT JOIN activite[PX].p_factures ON w_ECRIT_CLI.no_facture = p_factures.no_facture AND w_ECRIT_CLI.no_facture <> ''
WHERE ECR_DATE >= '[ENV_ADM_ANNEEDEBUT]0101'
;
TRUNCATE activite[PX].p_ecriture_comptable;
INSERT INTO activite[PX].p_ecriture_comptable(
code_original,
date_comptable,
type_ecriture,
type_piece,
piece,
mode_reglement_code,
clinique_honoraire,
compte_id,
journal_id,
sejour_id,
no_sejour,
facture_id,
no_facture,
medecin_id,
tiers_payant_id,
texte,
montant_credit,
montant_debit,
est_comptabilise)
SELECT
code_original,
date_comptable,
type_ecriture,
type_piece,
piece,
mode_reglement_code,
clinique_honoraire,
compte_id,
journal_id,
sejour_id,
no_sejour,
facture_id,
no_facture,
medecin_administratif_id,
tiers_payant_id,
texte,
montant_credit,
montant_debit,
'1'::text AS est_comptabilise
FROM w_ecriture_comptable
;
ANALYSE activite[PX].p_ecriture_comptable
;
REINDEX TABLE activite[PX].p_ecriture_comptable
;
UPDATE activite[PX].p_ecriture_comptable
SET code_erreur = 'EQP'
FROM
(
SELECT provider_id, clinique_honoraire, piece
FROM activite[PX].p_ecriture_comptable
GROUP BY 1,2,3
HAVING SUM(montant_debit-montant_credit) <> 0
) subview
WHERE p_ecriture_comptable.provider_id = subview.provider_id AND
p_ecriture_comptable.piece = subview.piece AND
p_ecriture_comptable.clinique_honoraire = subview.clinique_honoraire
;
UPDATE activite[PX].p_ecriture_comptable
SET code_erreur = 'FAC'
FROM
(
SELECT p_ecriture_comptable.provider_id AS provider_id,
p_ecriture_comptable.piece AS piece,
p_ecriture_comptable.clinique_honoraire AS clinique_honoraire
FROM activite[PX].p_ecriture_comptable
JOIN
(
SELECT p_ecriture_comptable.provider_id,
p_ecriture_comptable.no_facture,
CASE WHEN SUM(CASE WHEN type_ecriture IN ('VPRD','VTVA') THEN montant_credit-montant_debit ELSE 0 END) IS DISTINCT FROM MAX(montant_comptabilise_c) THEN '1' ELSE '0' END AS erreur_vente_c,
CASE WHEN SUM(CASE WHEN type_ecriture IN ('VHON') THEN montant_credit-montant_debit ELSE 0 END) IS DISTINCT FROM MAX(montant_comptabilise_h) THEN '1' ELSE '0' END AS erreur_vente_h
FROM activite[PX].p_ecriture_comptable
LEFT JOIN activite[PX].p_factures ON p_factures.no_facture = p_ecriture_comptable.no_facture
WHERE type_ecriture IN ('VPRD','VTVA','VHON')
GROUP BY 1,2
) subview ON
p_ecriture_comptable.provider_id = subview.provider_id AND
p_ecriture_comptable.no_facture = subview.no_facture
WHERE p_ecriture_comptable.type_ecriture IN ('VPRD','VTVA','VHON','VCLI') AND
(
p_ecriture_comptable.clinique_honoraire = 'C' AND erreur_vente_c = '1' OR
p_ecriture_comptable.clinique_honoraire = 'H' AND erreur_vente_h = '1'
)
GROUP BY 1,2,3
) subview
WHERE p_ecriture_comptable.provider_id = subview.provider_id AND
p_ecriture_comptable.piece = subview.piece AND
p_ecriture_comptable.clinique_honoraire = subview.clinique_honoraire
;
-- Recherche taux TVA
-- D'après paramétrage
UPDATE activite[PX].p_ecriture_comptable
SET taux_tva = t_compte.taux_tva
FROM activite[PX].t_compte
WHERE p_ecriture_comptable.compte_id = t_compte.oid AND
t_compte.taux_tva <> 0
;
-- D'abord dans les lignes en 1 pour 1 entre produit et TVA
DROP TABLE IF EXISTS w_ecriture_comptable_tva;
CREATE TEMP TABLE w_ecriture_comptable_tva AS
SELECT p_ecriture_comptable_tva.code_original AS code_original_tva,
p_ecriture_comptable_ht.code_original AS code_original_ht,
p_ecriture_comptable_tva.no_facture,
p_ecriture_comptable_tva.montant_credit-p_ecriture_comptable_tva.montant_debit AS montant_tva,
p_ecriture_comptable_ht.montant_credit-p_ecriture_comptable_ht.montant_debit AS montant_ht,
CASE
WHEN round((p_ecriture_comptable_ht.montant_credit-p_ecriture_comptable_ht.montant_debit)*0.2,2) = p_ecriture_comptable_tva.montant_credit-p_ecriture_comptable_tva.montant_debit THEN 20
WHEN round((p_ecriture_comptable_ht.montant_credit-p_ecriture_comptable_ht.montant_debit)*0.021,2) = p_ecriture_comptable_tva.montant_credit-p_ecriture_comptable_tva.montant_debit THEN 2.1
ELSE 0 END AS taux_tva
FROM activite[PX].p_ecriture_comptable p_ecriture_comptable_tva
JOIN activite[PX].p_ecriture_comptable p_ecriture_comptable_ht ON
p_ecriture_comptable_tva.no_facture = p_ecriture_comptable_ht.no_facture AND
p_ecriture_comptable_tva.piece = p_ecriture_comptable_ht.piece AND
p_ecriture_comptable_tva.journal_id = p_ecriture_comptable_ht.journal_id AND
p_ecriture_comptable_tva.clinique_honoraire = p_ecriture_comptable_ht.clinique_honoraire
WHERE p_ecriture_comptable_tva.type_ecriture IN ('VTVA','XTVA') AND
p_ecriture_comptable_tva.taux_tva = 0 AND
p_ecriture_comptable_ht.taux_tva = 0 AND
p_ecriture_comptable_ht.type_ecriture IN ('VPRD','XPRD') AND
(
round((p_ecriture_comptable_ht.montant_credit-p_ecriture_comptable_ht.montant_debit)*0.2,2) = p_ecriture_comptable_tva.montant_credit-p_ecriture_comptable_tva.montant_debit OR
round((p_ecriture_comptable_ht.montant_credit-p_ecriture_comptable_ht.montant_debit)*0.021,2) = p_ecriture_comptable_tva.montant_credit-p_ecriture_comptable_tva.montant_debit
)
;
DELETE FROM w_ecriture_comptable_tva
USING
(
SELECT code_original_tva, MIN(code_original_ht) AS code_original_ht
FROM w_ecriture_comptable_tva
GROUP BY 1
HAVING count(*) > 1
) subview
WHERE w_ecriture_comptable_tva.code_original_tva = subview.code_original_tva AND
w_ecriture_comptable_tva.code_original_ht <> subview.code_original_ht
;
DELETE FROM w_ecriture_comptable_tva
USING
(
SELECT code_original_ht, MIN(code_original_tva) AS code_original_tva
FROM w_ecriture_comptable_tva
GROUP BY 1
HAVING count(*) > 1
) subview
WHERE w_ecriture_comptable_tva.code_original_ht = subview.code_original_ht AND
w_ecriture_comptable_tva.code_original_tva <> subview.code_original_tva
;
UPDATE activite[PX].p_ecriture_comptable
SET taux_tva = w_ecriture_comptable_tva.taux_tva
FROM w_ecriture_comptable_tva
WHERE p_ecriture_comptable.code_original = w_ecriture_comptable_tva.code_original_tva AND
w_ecriture_comptable_tva.taux_tva <> 0
;
UPDATE activite[PX].p_ecriture_comptable
SET taux_tva = w_ecriture_comptable_tva.taux_tva
FROM w_ecriture_comptable_tva
WHERE p_ecriture_comptable.code_original = w_ecriture_comptable_tva.code_original_ht AND
w_ecriture_comptable_tva.taux_tva <> 0
;
-- Ensuite dans les lignes en 1 pour 1 entre produit et TVA (cas de montants en double)
DROP TABLE IF EXISTS w_ecriture_comptable_tva;
CREATE TEMP TABLE w_ecriture_comptable_tva AS
SELECT p_ecriture_comptable_tva.code_original AS code_original_tva,
p_ecriture_comptable_ht.code_original AS code_original_ht,
p_ecriture_comptable_tva.no_facture,
p_ecriture_comptable_tva.montant_credit-p_ecriture_comptable_tva.montant_debit AS montant_tva,
p_ecriture_comptable_ht.montant_credit-p_ecriture_comptable_ht.montant_debit AS montant_ht,
CASE
WHEN round((p_ecriture_comptable_ht.montant_credit-p_ecriture_comptable_ht.montant_debit)*0.2,2) = p_ecriture_comptable_tva.montant_credit-p_ecriture_comptable_tva.montant_debit THEN 20
WHEN round((p_ecriture_comptable_ht.montant_credit-p_ecriture_comptable_ht.montant_debit)*0.021,2) = p_ecriture_comptable_tva.montant_credit-p_ecriture_comptable_tva.montant_debit THEN 2.1
ELSE 0 END AS taux_tva
FROM activite[PX].p_ecriture_comptable p_ecriture_comptable_tva
JOIN activite[PX].p_ecriture_comptable p_ecriture_comptable_ht ON
p_ecriture_comptable_tva.no_facture = p_ecriture_comptable_ht.no_facture AND
p_ecriture_comptable_tva.piece = p_ecriture_comptable_ht.piece AND
p_ecriture_comptable_tva.journal_id = p_ecriture_comptable_ht.journal_id AND
p_ecriture_comptable_tva.clinique_honoraire = p_ecriture_comptable_ht.clinique_honoraire
WHERE p_ecriture_comptable_tva.type_ecriture IN ('VTVA','XTVA') AND
p_ecriture_comptable_tva.taux_tva = 0 AND
p_ecriture_comptable_ht.taux_tva = 0 AND
p_ecriture_comptable_ht.type_ecriture IN ('VPRD','XPRD') AND
(
round((p_ecriture_comptable_ht.montant_credit-p_ecriture_comptable_ht.montant_debit)*0.2,2) = p_ecriture_comptable_tva.montant_credit-p_ecriture_comptable_tva.montant_debit OR
round((p_ecriture_comptable_ht.montant_credit-p_ecriture_comptable_ht.montant_debit)*0.021,2) = p_ecriture_comptable_tva.montant_credit-p_ecriture_comptable_tva.montant_debit
)
;
DELETE FROM w_ecriture_comptable_tva
USING
(
SELECT code_original_tva, MIN(code_original_ht) AS code_original_ht
FROM w_ecriture_comptable_tva
GROUP BY 1
HAVING count(*) > 1
) subview
WHERE w_ecriture_comptable_tva.code_original_tva = subview.code_original_tva AND
w_ecriture_comptable_tva.code_original_ht <> subview.code_original_ht
;
DELETE FROM w_ecriture_comptable_tva
USING
(
SELECT code_original_ht, MIN(code_original_tva) AS code_original_tva
FROM w_ecriture_comptable_tva
GROUP BY 1
HAVING count(*) > 1
) subview
WHERE w_ecriture_comptable_tva.code_original_ht = subview.code_original_ht AND
w_ecriture_comptable_tva.code_original_tva <> subview.code_original_tva
;
UPDATE activite[PX].p_ecriture_comptable
SET taux_tva = w_ecriture_comptable_tva.taux_tva
FROM w_ecriture_comptable_tva
WHERE p_ecriture_comptable.code_original = w_ecriture_comptable_tva.code_original_tva AND
w_ecriture_comptable_tva.taux_tva <> 0
;
UPDATE activite[PX].p_ecriture_comptable
SET taux_tva = w_ecriture_comptable_tva.taux_tva
FROM w_ecriture_comptable_tva
WHERE p_ecriture_comptable.code_original = w_ecriture_comptable_tva.code_original_ht AND
w_ecriture_comptable_tva.taux_tva <> 0
;
-- Dans les pieces avec plusieurs lignes de TVA pour une seule ligne de produits
DROP TABLE IF EXISTS w_ecriture_comptable_2;
CREATE TEMP TABLE w_ecriture_comptable_2 AS
SELECT clinique_honoraire,
piece,
journal_id,
no_facture,
type_ecriture,
CASE WHEN type_ecriture IN ('VTVA','XTVA') THEN 0 ELSE compte_id END AS compte_id,
taux_tva,
base.cti_array_accum(code_original) AS code_original_array,
SUM(montant_credit) AS montant_credit,
SUM(montant_debit) AS montant_debit
FROM activite[PX].p_ecriture_comptable
WHERE taux_tva = 0 AND type_ecriture IN ('VPRD','VTVA','XPRD','XTVA')
GROUP BY 1,2,3,4,5,6,7
;
ANALYSE w_ecriture_comptable_2
;
DROP TABLE IF EXISTS w_ecriture_comptable_tva;
CREATE TEMP TABLE w_ecriture_comptable_tva AS
SELECT p_ecriture_comptable_tva.code_original_array AS code_original_array_tva,
p_ecriture_comptable_ht.code_original_array AS code_original_array_ht,
p_ecriture_comptable_tva.no_facture,
p_ecriture_comptable_tva.montant_credit-p_ecriture_comptable_tva.montant_debit AS montant_tva,
p_ecriture_comptable_ht.montant_credit-p_ecriture_comptable_ht.montant_debit AS montant_ht,
CASE
WHEN round((p_ecriture_comptable_ht.montant_credit-p_ecriture_comptable_ht.montant_debit)*0.2,0) = round(p_ecriture_comptable_tva.montant_credit-p_ecriture_comptable_tva.montant_debit,0) THEN 20
WHEN floor((p_ecriture_comptable_ht.montant_credit-p_ecriture_comptable_ht.montant_debit)*0.2) = floor(p_ecriture_comptable_tva.montant_credit-p_ecriture_comptable_tva.montant_debit) THEN 20
WHEN round((p_ecriture_comptable_ht.montant_credit-p_ecriture_comptable_ht.montant_debit)*0.021,1) = round(p_ecriture_comptable_tva.montant_credit-p_ecriture_comptable_tva.montant_debit,1) THEN 2.1
ELSE 0 END AS taux_tva
FROM w_ecriture_comptable_2 p_ecriture_comptable_tva
JOIN w_ecriture_comptable_2 p_ecriture_comptable_ht ON
p_ecriture_comptable_tva.no_facture = p_ecriture_comptable_ht.no_facture AND
p_ecriture_comptable_tva.piece = p_ecriture_comptable_ht.piece AND
p_ecriture_comptable_tva.journal_id = p_ecriture_comptable_ht.journal_id AND
p_ecriture_comptable_tva.clinique_honoraire = p_ecriture_comptable_ht.clinique_honoraire
WHERE p_ecriture_comptable_tva.type_ecriture IN ('VTVA','XTVA') AND
p_ecriture_comptable_tva.taux_tva = 0 AND
p_ecriture_comptable_ht.taux_tva = 0 AND
p_ecriture_comptable_ht.type_ecriture IN ('VPRD','XPRD') AND
(
round((p_ecriture_comptable_ht.montant_credit-p_ecriture_comptable_ht.montant_debit)*0.2,0) = round(p_ecriture_comptable_tva.montant_credit-p_ecriture_comptable_tva.montant_debit,0) OR
floor((p_ecriture_comptable_ht.montant_credit-p_ecriture_comptable_ht.montant_debit)*0.2) = floor(p_ecriture_comptable_tva.montant_credit-p_ecriture_comptable_tva.montant_debit) OR
round((p_ecriture_comptable_ht.montant_credit-p_ecriture_comptable_ht.montant_debit)*0.021,1) = round(p_ecriture_comptable_tva.montant_credit-p_ecriture_comptable_tva.montant_debit,1)
)
;
DELETE FROM w_ecriture_comptable_tva
WHERE code_original_array_tva IN
(
SELECT code_original_array_tva
FROM w_ecriture_comptable_tva
GROUP BY 1
HAVING count(*) > 1
)
;
DELETE FROM w_ecriture_comptable_tva
WHERE code_original_array_ht IN
(
SELECT code_original_array_ht
FROM w_ecriture_comptable_tva
GROUP BY 1
HAVING count(*) > 1
)
;
ANALYSE w_ecriture_comptable_tva
;
UPDATE activite[PX].p_ecriture_comptable
SET taux_tva = w_ecriture_comptable_tva.taux_tva
FROM w_ecriture_comptable_tva
WHERE p_ecriture_comptable.code_original = ANY(w_ecriture_comptable_tva.code_original_array_tva) AND
type_ecriture IN ('VTVA','XTVA') AND
w_ecriture_comptable_tva.taux_tva <> 0
;
UPDATE activite[PX].p_ecriture_comptable
SET taux_tva = w_ecriture_comptable_tva.taux_tva
FROM w_ecriture_comptable_tva
WHERE p_ecriture_comptable.code_original = ANY(w_ecriture_comptable_tva.code_original_array_ht) AND
type_ecriture IN ('VPRD','XPRD') AND
w_ecriture_comptable_tva.taux_tva <> 0
;
-- Dans les pieces avec plusieurs lignes de TVA et plusieurs lignes de produit (Avec TVA paramétrée)
DROP TABLE IF EXISTS w_ecriture_comptable_2;
CREATE TEMP TABLE w_ecriture_comptable_2 AS
SELECT clinique_honoraire,
piece,
journal_id,
no_facture,
type_ecriture,
CASE WHEN t_compte.taux_tva <> 0 THEN '1' ELSE '0' END AS has_tva,
p_ecriture_comptable.taux_tva,
base.cti_array_accum(p_ecriture_comptable.code_original) AS code_original_array,
SUM(montant_credit) AS montant_credit,
SUM(montant_debit) AS montant_debit
FROM activite[PX].p_ecriture_comptable
JOIN activite[PX].t_compte ON compte_id = t_compte.oid
WHERE p_ecriture_comptable.taux_tva = 0 AND
(
type_ecriture IN ('VPRD','XPRD') AND t_compte.taux_tva <> 0 OR
type_ecriture IN ('VTVA','XTVA')
)
GROUP BY 1,2,3,4,5,6,7
;
ANALYSE w_ecriture_comptable_2
;
DROP TABLE IF EXISTS w_ecriture_comptable_tva;
CREATE TEMP TABLE w_ecriture_comptable_tva AS
SELECT p_ecriture_comptable_tva.code_original_array AS code_original_array_tva,
p_ecriture_comptable_ht.code_original_array AS code_original_array_ht,
p_ecriture_comptable_tva.no_facture,
p_ecriture_comptable_tva.montant_credit-p_ecriture_comptable_tva.montant_debit AS montant_tva,
p_ecriture_comptable_ht.montant_credit-p_ecriture_comptable_ht.montant_debit AS montant_ht,
CASE
WHEN round((p_ecriture_comptable_ht.montant_credit-p_ecriture_comptable_ht.montant_debit)*0.2,0) = round(p_ecriture_comptable_tva.montant_credit-p_ecriture_comptable_tva.montant_debit,0) THEN 20
WHEN floor((p_ecriture_comptable_ht.montant_credit-p_ecriture_comptable_ht.montant_debit)*0.2) = floor(p_ecriture_comptable_tva.montant_credit-p_ecriture_comptable_tva.montant_debit) THEN 20
WHEN round((p_ecriture_comptable_ht.montant_credit-p_ecriture_comptable_ht.montant_debit)*0.021,1) = round(p_ecriture_comptable_tva.montant_credit-p_ecriture_comptable_tva.montant_debit,1) THEN 2.1
ELSE 0 END AS taux_tva
FROM w_ecriture_comptable_2 p_ecriture_comptable_tva
JOIN w_ecriture_comptable_2 p_ecriture_comptable_ht ON
p_ecriture_comptable_tva.no_facture = p_ecriture_comptable_ht.no_facture AND
p_ecriture_comptable_tva.piece = p_ecriture_comptable_ht.piece AND
p_ecriture_comptable_tva.journal_id = p_ecriture_comptable_ht.journal_id AND
p_ecriture_comptable_tva.clinique_honoraire = p_ecriture_comptable_ht.clinique_honoraire
WHERE p_ecriture_comptable_tva.type_ecriture IN ('VTVA','XTVA') AND
p_ecriture_comptable_tva.taux_tva = 0 AND
p_ecriture_comptable_ht.taux_tva = 0 AND
p_ecriture_comptable_ht.type_ecriture IN ('VPRD','XPRD') AND
(
round((p_ecriture_comptable_ht.montant_credit-p_ecriture_comptable_ht.montant_debit)*0.2,0) = round(p_ecriture_comptable_tva.montant_credit-p_ecriture_comptable_tva.montant_debit,0) OR
floor((p_ecriture_comptable_ht.montant_credit-p_ecriture_comptable_ht.montant_debit)*0.2) = floor(p_ecriture_comptable_tva.montant_credit-p_ecriture_comptable_tva.montant_debit) OR
round((p_ecriture_comptable_ht.montant_credit-p_ecriture_comptable_ht.montant_debit)*0.021,1) = round(p_ecriture_comptable_tva.montant_credit-p_ecriture_comptable_tva.montant_debit,1)
)
;
DELETE FROM w_ecriture_comptable_tva
WHERE code_original_array_tva IN
(
SELECT code_original_array_tva
FROM w_ecriture_comptable_tva
GROUP BY 1
HAVING count(*) > 1
)
;
DELETE FROM w_ecriture_comptable_tva
WHERE code_original_array_ht IN
(
SELECT code_original_array_ht
FROM w_ecriture_comptable_tva
GROUP BY 1
HAVING count(*) > 1
)
;
ANALYSE w_ecriture_comptable_tva
;
UPDATE activite[PX].p_ecriture_comptable
SET taux_tva = w_ecriture_comptable_tva.taux_tva
FROM w_ecriture_comptable_tva
WHERE p_ecriture_comptable.code_original = ANY(w_ecriture_comptable_tva.code_original_array_tva) AND
type_ecriture IN ('VTVA','XTVA') AND
w_ecriture_comptable_tva.taux_tva <> 0
;
UPDATE activite[PX].p_ecriture_comptable
SET taux_tva = w_ecriture_comptable_tva.taux_tva
FROM w_ecriture_comptable_tva
WHERE p_ecriture_comptable.code_original = ANY(w_ecriture_comptable_tva.code_original_array_ht) AND
type_ecriture IN ('VPRD','XPRD') AND
w_ecriture_comptable_tva.taux_tva <> 0
;
-- Dans les pieces avec plusieurs lignes de TVA et plusieurs lignes de produit (avec nombre significatif > 100)
DROP TABLE IF EXISTS w_ecriture_comptable_2;
CREATE TEMP TABLE w_ecriture_comptable_2 AS
SELECT clinique_honoraire,
piece,
journal_id,
no_facture,
type_ecriture,
CASE WHEN t_compte.taux_tva <> 0 THEN '1' ELSE '0' END AS has_tva,
p_ecriture_comptable.taux_tva,
base.cti_array_accum(code_original) AS code_original_array,
SUM(montant_credit) AS montant_credit,
SUM(montant_debit) AS montant_debit
FROM activite[PX].p_ecriture_comptable
JOIN (SELECT compte_id AS oid, MAX(p_ecriture_comptable.taux_tva) AS taux_tva FROm activite[PX].p_ecriture_comptable WHERE p_ecriture_comptable.taux_tva <> 0 GROUP BY 1 HAVING count(*) > 100) t_compte ON p_ecriture_comptable.compte_id = t_compte.oid
WHERE p_ecriture_comptable.taux_tva = 0 AND
(
type_ecriture IN ('VPRD','XPRD') AND t_compte.taux_tva <> 0 OR
type_ecriture IN ('VTVA','XTVA')
)
GROUP BY 1,2,3,4,5,6,7
;
ANALYSE w_ecriture_comptable_2
;
DROP TABLE IF EXISTS w_ecriture_comptable_tva;
CREATE TEMP TABLE w_ecriture_comptable_tva AS
SELECT p_ecriture_comptable_tva.code_original_array AS code_original_array_tva,
p_ecriture_comptable_ht.code_original_array AS code_original_array_ht,
p_ecriture_comptable_tva.no_facture,
p_ecriture_comptable_tva.montant_credit-p_ecriture_comptable_tva.montant_debit AS montant_tva,
p_ecriture_comptable_ht.montant_credit-p_ecriture_comptable_ht.montant_debit AS montant_ht,
CASE
WHEN round((p_ecriture_comptable_ht.montant_credit-p_ecriture_comptable_ht.montant_debit)*0.2,0) = round(p_ecriture_comptable_tva.montant_credit-p_ecriture_comptable_tva.montant_debit,0) THEN 20
WHEN floor((p_ecriture_comptable_ht.montant_credit-p_ecriture_comptable_ht.montant_debit)*0.2) = floor(p_ecriture_comptable_tva.montant_credit-p_ecriture_comptable_tva.montant_debit) THEN 20
ELSE 0 END AS taux_tva
FROM w_ecriture_comptable_2 p_ecriture_comptable_tva
JOIN w_ecriture_comptable_2 p_ecriture_comptable_ht ON
p_ecriture_comptable_tva.no_facture = p_ecriture_comptable_ht.no_facture AND
p_ecriture_comptable_tva.piece = p_ecriture_comptable_ht.piece AND
p_ecriture_comptable_tva.journal_id = p_ecriture_comptable_ht.journal_id AND
p_ecriture_comptable_tva.clinique_honoraire = p_ecriture_comptable_ht.clinique_honoraire
WHERE p_ecriture_comptable_tva.type_ecriture IN ('VTVA','XTVA') AND
p_ecriture_comptable_tva.taux_tva = 0 AND
p_ecriture_comptable_ht.taux_tva = 0 AND
p_ecriture_comptable_ht.type_ecriture IN ('VPRD','XPRD') AND
(
round((p_ecriture_comptable_ht.montant_credit-p_ecriture_comptable_ht.montant_debit)*0.2,0) = round(p_ecriture_comptable_tva.montant_credit-p_ecriture_comptable_tva.montant_debit,0) OR
floor((p_ecriture_comptable_ht.montant_credit-p_ecriture_comptable_ht.montant_debit)*0.2) = floor(p_ecriture_comptable_tva.montant_credit-p_ecriture_comptable_tva.montant_debit)
)
;
DELETE FROM w_ecriture_comptable_tva
WHERE code_original_array_tva IN
(
SELECT code_original_array_tva
FROM w_ecriture_comptable_tva
GROUP BY 1
HAVING count(*) > 1
)
;
DELETE FROM w_ecriture_comptable_tva
WHERE code_original_array_ht IN
(
SELECT code_original_array_ht
FROM w_ecriture_comptable_tva
GROUP BY 1
HAVING count(*) > 1
)
;
ANALYSE w_ecriture_comptable_tva
;
UPDATE activite[PX].p_ecriture_comptable
SET taux_tva = w_ecriture_comptable_tva.taux_tva
FROM w_ecriture_comptable_tva
WHERE p_ecriture_comptable.code_original = ANY(w_ecriture_comptable_tva.code_original_array_tva) AND
type_ecriture IN ('VTVA','XTVA') AND
w_ecriture_comptable_tva.taux_tva <> 0
;
UPDATE activite[PX].p_ecriture_comptable
SET taux_tva = w_ecriture_comptable_tva.taux_tva
FROM w_ecriture_comptable_tva
WHERE p_ecriture_comptable.code_original = ANY(w_ecriture_comptable_tva.code_original_array_ht) AND
type_ecriture IN ('VPRD','XPRD') AND
w_ecriture_comptable_tva.taux_tva <> 0
;
-- Taux par defaut TVA
UPDATE activite[PX].p_ecriture_comptable
SET taux_tva = subview.taux_tva
FROM
(
SELECT compte_id, MAX(taux_tva) AS taux_tva
FROM activite[PX].p_ecriture_comptable
WHERE type_ecriture IN ('VTVA','XTVA') AND taux_tva <> 0
GROUP BY 1
) subview
WHERE type_ecriture IN ('VTVA','XTVA') AND p_ecriture_comptable.taux_tva = 0 AND
p_ecriture_comptable.compte_id = subview.compte_id
;
-- Taux par defaut produits
UPDATE activite[PX].p_ecriture_comptable
SET taux_tva = t_compte.taux_tva
FROM activite[PX].t_compte,
(
SELECT clinique_honoraire, journal_id, piece, no_facture, MAX(taux_tva) AS taux_tva
FROM activite[PX].p_ecriture_comptable
WHERE type_ecriture IN ('VTVA','XTVA')
GROUP BY 1,2,3,4
) subview
WHERE p_ecriture_comptable.compte_id = t_compte.oid AND
t_compte.taux_tva <> 0 AND
p_ecriture_comptable.clinique_honoraire = subview.clinique_honoraire AND
p_ecriture_comptable.journal_id = subview.journal_id AND
p_ecriture_comptable.piece = subview.piece AND
p_ecriture_comptable.no_facture = subview.no_facture AND
p_ecriture_comptable.taux_tva = 0
;
-- Taux de TVA qui ne devraient pas être (pieces sans TVA)
DROP TABLE IF EXISTS w_ecriture_piece_calc_tva;
CREATE TEMP TABLE w_ecriture_piece_calc_tva AS
SELECT clinique_honoraire,
piece,
SUM(COALESCE(total_tva,0)) AS total_tva,
SUM(COALESCE(total_tva_calc,0)) AS total_tva_calc,
SUM(COALESCE(total_tva_calc_021,0)) AS total_tva_calc_021,
SUM(COALESCE(total_tva_calc_20,0)) AS total_tva_calc_20,
SUM(COALESCE(total_tva_calc_10,0)) AS total_tva_calc_10,
SUM(COALESCE(total_tva_calc_55,0)) AS total_tva_calc_55
FROM
(
SELECT clinique_honoraire,
piece,
t_compte.code,
t_compte.texte,
SUM(montant_credit-montant_debit) ,
SUM(CASE WHEN t_compte.code LIKE '445%' THEN montant_credit-montant_debit ELSE NULL END) AS total_tva,
SUM(CASE WHEN t_compte.code NOT LIKE '445%' AND p_ecriture_comptable.taux_tva <> 0 THEN (montant_credit-montant_debit)*p_ecriture_comptable.taux_tva/100 ELSE null END ) AS total_tva_calc,
SUM(CASE WHEN t_compte.code NOT LIKE '445%' AND p_ecriture_comptable.taux_tva = 2.1 THEN (montant_credit-montant_debit)*p_ecriture_comptable.taux_tva/100 ELSE null END ) AS total_tva_calc_021,
SUM(CASE WHEN t_compte.code NOT LIKE '445%' AND p_ecriture_comptable.taux_tva = 20 THEN (montant_credit-montant_debit)*p_ecriture_comptable.taux_tva/100 ELSE null END ) AS total_tva_calc_20,
SUM(CASE WHEN t_compte.code NOT LIKE '445%' AND p_ecriture_comptable.taux_tva = 10 THEN (montant_credit-montant_debit)*p_ecriture_comptable.taux_tva/100 ELSE null END ) AS total_tva_calc_10,
SUM(CASE WHEN t_compte.code NOT LIKE '445%' AND p_ecriture_comptable.taux_tva = 5.5 THEN (montant_credit-montant_debit)*p_ecriture_comptable.taux_tva/100 ELSE null END ) AS total_tva_calc_55
FROM activite[PX].p_ecriture_comptable
JOIN activite[PX].t_compte ON compte_id = t_compte.oid
WHERE type_ecriture IN ('VPRD','VTVA')
GROUP BY 1,2,3,4
ORDER BY 1,2,4
) subview
GROUP BY 1,2
HAVING abs(sum(COALESCE(total_tva,0)) - sum(COALESCE(total_tva_calc,0))) > 1
;
ANALYSE w_ecriture_piece_calc_tva
;
UPDATE activite[PX].p_ecriture_comptable
SET taux_tva = 0
FROM w_ecriture_piece_calc_tva
WHERE p_ecriture_comptable.clinique_honoraire = w_ecriture_piece_calc_tva.clinique_honoraire AND
p_ecriture_comptable.piece = w_ecriture_piece_calc_tva.piece AND
p_ecriture_comptable.taux_tva <> 0 AND
total_tva = 0
;
UPDATE activite[PX].p_ecriture_comptable
SET taux_tva = 0
FROM w_ecriture_piece_calc_tva
WHERE p_ecriture_comptable.clinique_honoraire = w_ecriture_piece_calc_tva.clinique_honoraire AND
p_ecriture_comptable.piece = w_ecriture_piece_calc_tva.piece AND
p_ecriture_comptable.taux_tva = 2.1 AND
(
round(total_tva,0) = round(total_tva_calc_20+total_tva_calc_10+total_tva_calc_55,0) OR
floor(total_tva) = floor(total_tva_calc_20+total_tva_calc_10+total_tva_calc_55)
)
;
]]></sqlcmd>
</NODE>
<NODE label="Récupération chiffrier SIGEMS">
<sqlcmd><![CDATA[
DROP TABLE IF EXISTS w_ECRIT_une;
CREATE TEMP TABLE w_ECRIT_une AS
SELECT
CASE WHEN count(*) > 0 THEN '1' ELSE '0' END AS une_ecriture
FROM prod_sigems.ECRIT;
DROP TABLE IF EXISTS w_ECRIT_comptes_clients;
CREATE TEMP TABLE w_ECRIT_comptes_clients AS
SELECT ECR_PLAN, ECR_CEMT AS ECR_CPTE
FROM w_ECRIT_CLI
JOIN prod_sigems.COMPTE ON COMPTE.NUM = ECR_CPTE AND ECR_PLAN = COMPTE.TYP
WHERE ECR_PLAN IN ('C','P') AND
w_ECRIT_CLI.ECR_AGE <> '*S' -- specifique ELSAN pour ignorer ecritures calabet dans esquirol
GROUP BY 1,2
;
CREATE INDEX w_ECRIT_comptes_clients_i1
ON w_ECRIT_comptes_clients
USING btree
(ECR_CPTE);
DROP TABLE IF EXISTS w_factures_comptables;
CREATE TEMP TABLE w_factures_comptables AS
SELECT
0 AS facture_id,
CASE WHEN ECRIT.ANNEE <> '' THEN ECRIT.ANNEE || to_char(ECRIT.CODE,'FM900000') || '.' || to_char(ECRIT.INDICE,'FM9999900') ELSE NULL END AS no_facture,
date_trunc('month', ECR_DATE) + interval '1 month' - interval '1 day' AS date_comptable,
SUM(CASE WHEN JNAL.REFBASE = 'G' AND ECR_JNAL LIKE 'VEN%' THEN ECR_DEBIT - ECR_CREDIT ELSE 0 END) AS montant_ventes_c,
SUM(CASE WHEN JNAL.REFBASE = 'G' AND ECR_JNAL NOT LIKE 'VEN%' THEN ECR_CREDIT - ECR_DEBIT ELSE 0 END) AS montant_reglements_c,
SUM(CASE WHEN JNAL.REFBASE = 'H' AND ECR_JNAL LIKE 'VEN%' THEN ECR_DEBIT - ECR_CREDIT ELSE 0 END) AS montant_ventes_h,
SUM(CASE WHEN JNAL.REFBASE = 'H' AND ECR_JNAL NOT LIKE 'VEN%' THEN ECR_CREDIT - ECR_DEBIT ELSE 0 END) AS montant_reglements_h
FROM w_ECRIT_cli ECRIT
JOIN prod_sigems.JNAL ON ECR_JNAL = JNAL.CODEJ
JOIN w_ECRIT_comptes_clients ON
ECRIT.ECR_CEMT = w_ECRIT_comptes_clients.ECR_CPTE AND
ECRIT.ECR_PLAN = w_ECRIT_comptes_clients.ECR_PLAN
WHERE
ECR_DATE >= '[ENV_ADM_ANNEEDEBUT]0101' AND
ECRIT.ECR_CPTE <> 'NOEMIE' AND
ECRIT.ECR_CPTE <> 'ANCIEN' AND
ECRIT.ECR_CPTE <> 'ACOMPT' AND
ECRIT.ECR_CPTE NOT LIKE 'ECART%' AND
ECRIT.ECR_CPTE NOT LIKE 'ACPT%' AND
ECRIT.ECR_CPTE <> '411FTN' AND
ECRIT.ECR_JNAL <> 'OD' AND
ECRIT.ECR_PLAN = ANY(ARRAY['C','P']) AND
ECRIT.ECR_AGE <> '*S' -- specifique ELSAN pour ignorer ecritures calabet dans esquirol
GROUP BY 1,2,3;
-- Dans certains cas, les honoraires des médecins salariés ne sont pas dans la comptabilisée
-- On ajoute alors fictivement ces honoraires aux montants retrouvés en compta pour que le chiffrier soit juste
INSERT INTO activite.t_divers (code, texte, valeur, description)
SELECT
'SIGEMS_CPTMEDSAL',
'Comptabilisation honoraires des médecins salariés',
'0',
'1=Honoraires non comptabilisés, ajout fictif dans chiffrier'
WHERE 'SIGEMS_CPTMEDSAL' NOT IN (SELECT code FROM activite.t_divers);
;
INSERT INTO w_factures_comptables
SELECT
0::bigint AS facture_id,
p_factures.no_facture AS no_facture,
p_factures.date_vente AS date_comptable,
SUM(p_factures_lignes_c.montant_comptabilise) AS montant_ventes_c,
0::numeric AS montant_reglements_c,
0::numeric AS montant_ventes_h,
0::numeric AS montant_reglements_h
FROM activite[PX].p_factures_lignes_c
JOIN activite[PX].p_factures ON p_factures_lignes_c.no_facture = p_factures.no_facture
JOIN activite.t_divers ON
t_divers.code = 'SIGEMS_CPTMEDSAL' AND
t_divers.valeur = '1'
WHERE p_factures.date_vente >= '[ENV_ADM_ANNEEDEBUT]0101' AND
p_factures.date_vente <= date(now()) AND
p_factures_lignes_c.montant_comptabilise <> 0 AND
p_factures_lignes_c.montant_facture = 0
GROUP BY 1,2,3
;
TRUNCATE activite[PX].p_chiffrier_comptable;
INSERT INTO activite[PX].p_chiffrier_comptable(
date_comptable,
montant_ventes_c,
montant_reglements_c,
montant_solde_client_c,
montant_ventes_h,
montant_reglements_h,
montant_solde_client_h)
SELECT
date_comptable,
SUM(montant_ventes_c),
SUM(montant_reglements_c),
0 AS montant_solde_client_c,
SUM(montant_ventes_h),
SUM(montant_reglements_h),
0 AS montant_solde_client_h
FROM w_factures_comptables
WHERE no_facture IS NOT NULL AND
date_comptable >= '[ENV_ADM_ANNEEDEBUT]0101'
GROUP BY 1;
TRUNCATE activite[PX].p_factures_comptables;
INSERT INTO activite[PX].p_factures_comptables(
facture_id,
no_facture,
date_comptable,
montant_ventes_c,
montant_reglements_c,
montant_ventes_h,
montant_reglements_h)
SELECT
facture_id,
no_facture,
date_comptable,
SUM(montant_ventes_c),
SUM(montant_reglements_c),
SUM(montant_ventes_h),
SUM(montant_reglements_h)
FROM w_factures_comptables
WHERE no_facture IS NOT NULL AND
date_comptable >= '[ENV_ADM_ANNEEDEBUT]0101'
GROUP BY 1,2,3;
]]></sqlcmd>
</NODE>
</NODE>
<NODE name="PARAM" label="RECUPERATION DES PARAMETRES">
<NODE label="Type d'environnement">
<sqlcmd><![CDATA[
CTISELECT_PROPERTY_READ 'ENV_WITHPMSI', MAX(CASE WHEN schemaname = 'pmsi' AND tablename = 'p_rss' THEN 1 ELSE 0 END)
FROM pg_tables
WHERE schemaname = 'pmsi' AND tablename = 'p_rss'
]]></sqlcmd>
</NODE>
<NODE label="Adaptations base SIGEMS (Multi Sites)">
<condition><![CDATA[
"[ENV_TYPEETS]" != "1"
]]></condition>
<sqlcmd><![CDATA[
DROP TABLE IF EXISTS w_services_type_exception;
CREATE TEMP TABLE w_services_type_exception AS
SELECT SER_DOS AS SER, (MIN(Array[to_char(nb,'FM000000000'),CH1]))[2] AS CH1_exeption
FROM
(
SELECT
SER_DOS, CH1, count(*) AS nb
FROM prod_sigems.DOSSIER
JOIN prod_sigems.DOSSIER_Y ON DOSSIER.COD_DOS = DOSSIER_Y.CODE AND
DOSSIER.ANN_DOS = DOSSIER_Y.ANNEE
WHERE ANN_DOS <> 'PA' AND CH1 <> ''
GROUP BY 1,2
ORDER BY 1,2
) subview
GROUP BY 1
HAVING count(*) > 1;
CREATE INDEX w_services_type_exception_i1
ON w_services_type_exception
USING btree
(SER);
INSERT INTO w_services_type_exception
SELECT SER_SEJ AS SER, (MIN(Array[to_char(nb,'FM000000000'),CH1]))[2] AS CH1_exeption
FROM
(
SELECT
SER_SEJ, CH1, count(*) AS nb
FROM prod_sigems.SEJOUR
JOIN prod_sigems.DOSSIER_Y ON SEJOUR.COD_SEJ = DOSSIER_Y.CODE AND
SEJOUR.ANN_SEJ = DOSSIER_Y.ANNEE
LEFT JOIN w_services_type_exception ON SER_SEJ = SER
WHERE ANN_SEJ <> 'PA' AND CH1 <> '' AND w_services_type_exception.SER IS NULL
GROUP BY 1,2
ORDER BY 1,2
) subview
GROUP BY 1
HAVING count(*) > 1;
DROP TABLE IF EXISTS w_DOSSIER_CH1;
CREATE TEMP TABLE w_DOSSIER_CH1 AS
SELECT
ANN_DOS AS ANN_CH1, COD_DOS AS COD_CH1, SER_DOS AS SER_CH1, trim(SER_DOS) || (CASE WHEN CH1 = 'PSPH' THEN 'E' ELSE 'O' END) AS SER_CH1_NEW
FROM prod_sigems.DOSSIER
JOIN prod_sigems.DOSSIER_Y ON DOSSIER.COD_DOS = DOSSIER_Y.CODE AND
DOSSIER.ANN_DOS = DOSSIER_Y.ANNEE
JOIN w_services_type_exception ON SER_DOS = SER
WHERE ANN_DOS <> 'PA' AND CH1 = CH1_exeption
GROUP BY 1,2,3,4
ORDER BY 1,2,3;
CREATE INDEX w_DOSSIER_CH1_i1
ON w_DOSSIER_CH1
USING btree
(COD_CH1);
INSERT INTO w_DOSSIER_CH1
SELECT
ANN_SEJ AS ANN_CH1, COD_SEJ AS COD_CH1, SER_SEJ AS SER_CH1, trim(SER_SEJ) || (CASE WHEN CH1 = 'PSPH' THEN 'E' ELSE 'O' END) AS SER_CH1_NEW
FROM prod_sigems.SEJOUR
JOIN prod_sigems.DOSSIER_Y ON SEJOUR.COD_SEJ = DOSSIER_Y.CODE AND
SEJOUR.ANN_SEJ = DOSSIER_Y.ANNEE
JOIN w_services_type_exception ON SER_SEJ = SER
LEFT JOIN w_DOSSIER_CH1 ON SEJOUR.COD_SEJ = w_DOSSIER_CH1.COD_CH1 AND
SEJOUR.ANN_SEJ = w_DOSSIER_CH1.ANN_CH1 AND
SEJOUR.SER_SEJ = w_DOSSIER_CH1.SER_CH1
WHERE ANN_SEJ <> 'PA' AND CH1 = CH1_exeption AND
w_DOSSIER_CH1.SER_CH1 IS NULL
GROUP BY 1,2,3,4
ORDER BY 1,2,3;
ALTER TABLE prod_sigems.DOSSIER ALTER COLUMN SER_DOS TYPE text;
UPDATE prod_sigems.DOSSIER
SET SER_DOS = SER_CH1_NEW
FROM w_DOSSIER_CH1
WHERE ANN_CH1 = ANN_DOS AND
COD_CH1 = COD_DOS AND
SER_CH1 = SER_DOS;
ALTER TABLE prod_sigems.SEJOUR ALTER COLUMN SER_SEJ TYPE text;
UPDATE prod_sigems.SEJOUR
SET SER_SEJ = SER_CH1_NEW
FROM w_DOSSIER_CH1
WHERE ANN_CH1 = ANN_SEJ AND
COD_CH1 = COD_SEJ AND
SER_CH1 = SER_SEJ;
ALTER TABLE prod_sigems.LIG_CLINI ALTER COLUMN SER_LCL TYPE text;
UPDATE prod_sigems.LIG_CLINI
SET SER_LCL = SER_CH1_NEW
FROM w_DOSSIER_CH1
WHERE ANN_CH1 = ANN_LCL AND
COD_CH1 = COD_LCL AND
SER_CH1 = SER_LCL;
ALTER TABLE prod_sigems.LIG_HONOR ALTER COLUMN SER_LHO TYPE text;
UPDATE prod_sigems.LIG_HONOR
SET SER_LHO = SER_CH1_NEW
FROM w_DOSSIER_CH1
WHERE ANN_CH1 = ANN_LHO AND
COD_CH1 = COD_LHO AND
SER_CH1 = SER_LHO;
ALTER TABLE prod_sigems.SERVICE
ALTER COLUMN COD_SER TYPE text,
ALTER COLUMN NOM_SER TYPE text;
INSERT INTO prod_sigems.SERVICE (COD_SER, NOM_SER, DMT_SER)
SELECT trim(COD_SER) || (CASE WHEN CH1_exeption = 'PSPH' THEN 'E' ELSE 'O' END),
replace(replace(replace(NOM_SER,'ESPIC',''),'OQN',''),' ',' ') || (CASE WHEN CH1_exeption = 'PSPH' THEN ' ESPIC' ELSE ' OQN' END),
DMT_SER
FROM prod_sigems.SERVICE
JOIN w_services_type_exception ON COD_SER = SER
WHERE (trim(COD_SER) || (CASE WHEN CH1_exeption = 'PSPH' THEN 'E' ELSE 'O' END)) NOT IN
(SELECT COD_SER FROM prod_sigems.SERVICE);
ALTER TABLE prod_sigems.ANALYG ALTER COLUMN SER_ANA TYPE text;
INSERT INTO prod_sigems.ANALYG(PRD_ANA, SER_ANA, DMT_ANA, MDT_ANA, RIS_ANA, ISO_ANA, TAU_ANA, CPT_ANA)
SELECT ANALYG.PRD_ANA, COD_SER, ANALYG.DMT_ANA, ANALYG.MDT_ANA, ANALYG.RIS_ANA, ANALYG.ISO_ANA, ANALYG.TAU_ANA, ANALYG.CPT_ANA
FROM prod_sigems.ANALYG
JOIN prod_sigems.SERVICE ON SER_ANA = substr(COD_SER,1,4) AND
substr(COD_SER,5,1) IN ('E', 'O')
LEFT JOIN prod_sigems.ANALYG ANALYG_deja ON
ANALYG.PRD_ANA = ANALYG_deja.PRD_ANA AND
COD_SER = ANALYG_deja.SER_ANA AND
ANALYG.DMT_ANA = ANALYG_deja.DMT_ANA AND
ANALYG.MDT_ANA = ANALYG_deja.MDT_ANA AND
ANALYG.RIS_ANA = ANALYG_deja.RIS_ANA AND
ANALYG.ISO_ANA = ANALYG_deja.ISO_ANA AND
ANALYG.TAU_ANA = ANALYG_deja.TAU_ANA AND
ANALYG.CPT_ANA = ANALYG_deja.CPT_ANA
WHERE ANALYG_deja.PRD_ANA IS NULL;
]]></sqlcmd>
</NODE>
<NODE label="Tiers payant">
<sqlcmd><![CDATA[
INSERT INTO activite[PX].t_types_tiers_payant(code, texte, texte_court)
SELECT code, texte, texte FROM
(
SELECT '0' AS code, 'Patients' AS texte
UNION ALL
SELECT '1','Régime général'
UNION ALL
SELECT '2','Mutuelles'
) subview
WHERE code NOT IN (SELECT code FROM activite[PX].t_types_tiers_payant);
INSERT INTO activite[PX].t_tiers_payant(oid, code, code_original, type_tiers_payant, texte, texte_court)
SELECT 0, '', '0', '0', 'Non saisi', 'Non saisi'
WHERE 0 NOT IN (SELECT oid FROM activite[PX].t_tiers_payant);
INSERT INTO activite[PX].t_tiers_payant(code, code_original, type_tiers_payant, texte, texte_court)
SELECT 'PATIENT', 'PATIENT', '0', 'PATIENTS', 'PATIENTS'
WHERE 'PATIENT' NOT IN (SELECT code_original FROM activite[PX].t_tiers_payant WHERE code_original IS NOT NULL);
-- Corrections double affectation AMO/AMC suite mauvaise initialisation
UPDATE activite[PX].t_tiers_payant
SET code_original = replace(code_original,'(2)','(1)')
WHERE code_original like '%(2)' AND
type_tiers_payant <> '2' AND
replace(code_original,'(2)','(1)') NOT IN (select code_original FROM activite[PX].t_tiers_payant)
;
UPDATE activite[PX].t_tiers_payant
SET code_original = replace(code_original,'(1)','(2)')
WHERE code_original like '%(1)' AND
type_tiers_payant <> '1' AND
replace(code_original,'(1)','(2)') NOT IN (select code_original FROM activite[PX].t_tiers_payant)
;
INSERT INTO activite[PX].t_tiers_payant(code_original, code, type_tiers_payant, texte, texte_court)
SELECT COD_TPA, COD_TPA,
MAX(CASE WHEN length(COD_TPA) = 8 AND substr(COD_TPA,1,2) BETWEEN '01' AND '99' THEN '1' ELSE '2' END),
MAX(NOM_TPA), MAX(NOM_TPA)
FROM prod_sigems.TIERS_PAYANT
WHERE COD_TPA NOT IN (SELECT code_original FROM activite[PX].t_tiers_payant WHERE code_original IS NOT NULL)
GROUP BY 1,2
HAVING COD_TPA || MAX(CASE WHEN length(COD_TPA) = 8 AND substr(COD_TPA,1,2) BETWEEN '01' AND '99' THEN '(1)' ELSE '(2)' END)
NOT IN (SELECT code_original FROM activite[PX].t_tiers_payant WHERE code_original IS NOT NULL)
;
WITH tiers_payant_sìgems AS (
SELECT COD_TPA,
MAX(NOM_TPA) AS NOM_TPA
FROM prod_sigems.TIERS_PAYANT
GROUP BY 1
)
UPDATE activite[PX].t_tiers_payant SET
code = COD_TPA,
texte = NOM_TPA,
texte_court = NOM_TPA
FROM tiers_payant_sìgems
WHERE COD_TPA = code_original AND
(
code IS DISTINCT FROM COD_TPA OR
texte IS DISTINCT FROM NOM_TPA OR
texte_court IS DISTINCT FROM NOM_TPA
)
;
-- Si tiers payant mutuelle utilisé dans AMO ajout
INSERT INTO activite[PX].t_tiers_payant(code_original, code, type_tiers_payant, texte, texte_court)
SELECT
COD_TPA || '(1)',
COD_TPA,
'1'::text,
MAX(NOM_TPA )|| ' (AMO)',
MAX(NOM_TPA) || ' (AMO)'
FROM prod_sigems.TIERS_PAYANT
JOIN activite[PX].t_tiers_payant current ON current.code = COD_TPA AND current.type_tiers_payant = '2'
WHERE 1=1 AND
COD_TPA IN (SELECT CP1_DOS2 from prod_sigems.DOS2 GROUP BY 1) AND
COD_TPA NOT IN (SELECT code FROM activite[PX].t_tiers_payant WHERE type_tiers_payant = '1')
GROUP BY 1,2
ORDER BY 1
;
-- Si tiers payant amo utilisé dans AMC ajout
INSERT INTO activite[PX].t_tiers_payant(code_original, code, type_tiers_payant, texte, texte_court)
SELECT
COD_TPA || '(2)',
COD_TPA,
'2'::text,
MAX(NOM_TPA )|| ' (AMC)',
MAX(NOM_TPA) || ' (AMC)'
FROM prod_sigems.TIERS_PAYANT
JOIN activite[PX].t_tiers_payant current ON current.code = COD_TPA AND current.type_tiers_payant = '1'
WHERE 1=1 AND
COD_TPA IN (SELECT CA2_DOS2 from prod_sigems.DOS2 GROUP BY 1) AND
COD_TPA NOT IN (SELECT code FROM activite[PX].t_tiers_payant WHERE type_tiers_payant = '2')
GROUP BY 1,2
;
UPDATE activite[PX].t_tiers_payant
SET grand_regime_id = t_grands_regimes.oid
FROM base.t_grands_regimes
WHERE t_grands_regimes.code = substr(t_tiers_payant.code,1,2) AND
t_tiers_payant.code between '01' AND '999' AND
(grand_regime_id = 0 OR grand_regime_id IS NULL)
;
INSERT INTO base.t_codes_postaux(code, texte, texte_court, departement_id)
SELECT CPO_TPA, MAX(VIL_TPA), MAX(VIL_TPA), MAX(t_departements.oid)
FROM prod_SIGEMS.TIERS_PAYANT
LEFT JOIN base.t_codes_postaux ON CPO_TPA = t_codes_postaux.code
JOIN base.t_departements ON
CPO_TPA NOT LIKE '97%' AND substr(CPO_TPA,1,2) = t_departements.code OR
CPO_TPA LIKE '97%' AND substr(CPO_TPA,1,3) = t_departements.code
WHERE CPO_TPA <> '' AND
length(CPO_TPA) = 5 AND
t_codes_postaux.code IS NULL
GROUP BY 1
;
UPDATE activite[PX].t_tiers_payant SET
adresse = AD1_TPA || ' ' || AD2_TPA,
code_postal_id = COALESCE(t_codes_postaux.oid,0),
ville = VIL_TPA,
telephone = AGR_TPA,
fax = COALESCE(TIERS_PAYANT_COMPL.FAX,''),
email = COALESCE(TIERS_PAYANT_COMPL.MAIL,'')
FROM prod_SIGEMS.TIERS_PAYANT
LEFT JOIN prod_SIGEMS.TIERS_PAYANT_COMPL ON TIERS_PAYANT.COD_TPA = TIERS_PAYANT_COMPL.COD_TPA
LEFT JOIN base.t_codes_postaux ON CPO_TPA = t_codes_postaux.code
WHERE (
t_tiers_payant.code_original = TIERS_PAYANT.COD_TPA OR
t_tiers_payant.code_original = TIERS_PAYANT.COD_TPA||'(1)' OR
t_tiers_payant.code_original = TIERS_PAYANT.COD_TPA||'(2)'
) AND
(
t_tiers_payant.adresse IS DISTINCT FROM (AD1_TPA || ' ' || AD2_TPA) OR
t_tiers_payant.code_postal_id IS DISTINCT FROM COALESCE(t_codes_postaux.oid,0) OR
ville IS DISTINCT FROM VIL_TPA OR
t_tiers_payant.telephone IS DISTINCT FROM AGR_TPA OR
t_tiers_payant.fax IS DISTINCT FROM COALESCE(TIERS_PAYANT_COMPL.FAX,'') OR
t_tiers_payant.email IS DISTINCT FROM COALESCE(TIERS_PAYANT_COMPL.MAIL,'')
)
;
]]></sqlcmd>
</NODE>
<NODE label="Médecins">
<sqlcmd><![CDATA[
INSERT INTO base.t_specialites_medecin(code_original, code, texte, texte_court)
SELECT
CSP_PRA,
CSP_PRA,
COALESCE(LIB_SPE, CSP_PRA),
COALESCE(LIB_SPE, CSP_PRA)
FROM
prod_sigems.PRATICIEN
LEFT JOIN prod_sigems.SPECIALITE ON CSP_PRA = COD_SPE
LEFT JOIN base.t_specialites_medecin spe on spe.code::text = CSP_PRA::text
WHERE 1=1
AND spe.code_original IS NULL
AND CSP_PRA IS NOT NULL
AND CSP_PRA::text <> ''::text
GROUP BY 1,2,3,4
ORDER BY 1;
INSERT INTO activite[PX].t_specialites_medecin(oid, code, code_original, texte, texte_court)
SELECT 0, '**', '0', 'Non saisie', 'Non saisie'
WHERE 0 NOT IN (SELECT oid FROM activite[PX].t_specialites_medecin);
INSERT INTO base.t_specialites_medecin(oid, code, code_original, texte, texte_court)
SELECT 0, '', '0', 'Non saisie', 'Non saisie'
WHERE 0 NOT IN (SELECT oid FROM base.t_specialites_medecin);
INSERT INTO base.t_medecins(oid, nom, prenom, numero_ordre, specialite_id )
SELECT 0, 'Non renseigné', '', '', 0 WHERE 0 NOT IN (SELECT oid FROM base.t_medecins);
INSERT INTO activite[PX].t_medecins_administratifs(oid, code_original, code, nom, prenom, specialite_id, medecin_id)
SELECT 0, '0', '****', 'Non renseigné', '', 0, 0 WHERE 0 NOT IN (SELECT oid FROM activite[PX].t_medecins_administratifs);
DROP TABLE IF EXISTS w_medecins;
CREATE TEMP TABLE w_medecins AS
SELECT
COD_PRA AS COD_PRA,
base.cti_soundex_nom(NOM_PRA) AS NOM_PRA_SOUNDEX,
base.cti_soundex_nom(PRE_PRA) AS PRE_PRA_SOUNDEX,
NOM_PRA,
PRE_PRA AS PRE_PRA,
SUBSTR(COALESCE(NID_PRA,''),1,9) AS NID_PRA,
CSP_PRA AS CSP_PRA,
COALESCE(t_medecins_administratifs.medecin_id,0) as medecin_id
FROM prod_sigems.PRATICIEN
LEFT JOIN activite[PX].t_medecins_administratifs ON COD_PRA = t_medecins_administratifs.code_original;
INSERT INTO base.t_medecins(nom, prenom, numero_ordre, specialite_id)
SELECT w_medecins.NOM_PRA, w_medecins.PRE_PRA, w_medecins.NID_PRA, 0 FROM
(SELECT SUBSTR(NOM_PRA_SOUNDEX, 1, 8) AS NOM_PRA_SOUNDEX, SUBSTR(PRE_PRA_SOUNDEX, 1, 8) AS PRE_PRA_SOUNDEX, NID_PRA, MIN(COD_PRA) AS COD_PRA
FROM w_medecins
GROUP BY 1,2,3) subview, w_medecins
WHERE w_medecins.COD_PRA = subview.COD_PRA
AND subview.NOM_PRA_SOUNDEX || ',' || subview.PRE_PRA_SOUNDEX || ',' || subview.NID_PRA NOT IN
(SELECT substr(base.cti_soundex_nom(nom),1,8) || ',' || substr(base.cti_soundex_nom(prenom),1,8) || ',' || numero_ordre FROM base.t_medecins);
INSERT INTO base.t_medecins(nom, prenom, numero_ordre, specialite_id)
SELECT w_medecins.NOM_PRA, w_medecins.PRE_PRA, w_medecins.NID_PRA, 0 FROM
(SELECT NOM_PRA_SOUNDEX, PRE_PRA_SOUNDEX, MIN(COD_PRA) AS COD_PRA
FROM w_medecins
GROUP BY 1,2) subview, w_medecins
WHERE w_medecins.COD_PRA = subview.COD_PRA
AND subview.NOM_PRA_SOUNDEX || ',' || subview.PRE_PRA_SOUNDEX NOT IN
(SELECT base.cti_soundex_nom(nom) || ',' || base.cti_soundex_nom(prenom) FROM base.t_medecins);
UPDATE w_medecins SET medecin_id = subview.medecin_id
FROM
(SELECT substr(base.cti_soundex_nom(nom),1,8) as nom , substr(base.cti_soundex_nom(prenom),1,8) as prenom, numero_ordre, MIN(oid) AS medecin_id FROM base.t_medecins GROUP BY 1,2,3) subview
WHERE SUBSTR(NOM_PRA_SOUNDEX, 1, 8) = subview.nom
AND SUBSTR(PRE_PRA_SOUNDEX, 1, 8) = subview.prenom
AND NID_PRA = subview.numero_ordre
AND w_medecins.medecin_id = 0;
UPDATE w_medecins SET medecin_id = subview.medecin_id
FROM
(SELECT base.cti_soundex_nom(nom) as nom , base.cti_soundex_nom(prenom) as prenom, MIN(oid) AS medecin_id FROM base.t_medecins GROUP BY 1,2) subview
WHERE SUBSTR(NOM_PRA_SOUNDEX, 1, 8) = subview.nom
AND SUBSTR(PRE_PRA_SOUNDEX, 1, 8) = subview.prenom
AND w_medecins.medecin_id = 0;
INSERT INTO activite[PX].t_medecins_administratifs(code_original, code, nom, prenom, specialite_id, medecin_id)
SELECT DISTINCT COD_PRA, COD_PRA, NOM_PRA, PRE_PRA, COALESCE(t_specialites_medecin.oid,0), medecin_id
FROM w_medecins
LEFT JOIN base.t_specialites_medecin ON CSP_PRA = t_specialites_medecin.code_original
WHERE COD_PRA NOT IN (SELECT code_original FROM activite[PX].t_medecins_administratifs);
UPDATE activite[PX].t_medecins_administratifs
SET code = COD_PRA,
nom = NOM_PRA,
prenom = PRE_PRA,
specialite_id = COALESCE(t_specialites_medecin.oid,0),
medecin_id = w_medecins.medecin_id
FROM w_medecins LEFT JOIN base.t_specialites_medecin ON CSP_PRA = t_specialites_medecin.code_original
WHERE w_medecins.COD_PRA = t_medecins_administratifs.code_original
AND (
t_medecins_administratifs.code <> COD_PRA OR
t_medecins_administratifs.nom <> NOM_PRA OR
t_medecins_administratifs.prenom <> PRE_PRA OR
t_medecins_administratifs.specialite_id <> COALESCE(t_specialites_medecin.oid,0) OR
t_medecins_administratifs.medecin_id <> w_medecins.medecin_id
);
UPDATE base.t_medecins SET specialite_id = subview.specialite_id
FROM
(SELECT t_medecins.oid, MIN(t_medecins_administratifs.specialite_id) as specialite_id
FROM base.t_medecins, activite[PX].t_medecins_administratifs , base.t_specialites_medecin
WHERE t_medecins.oid = t_medecins_administratifs.medecin_id
AND t_medecins_administratifs.specialite_id = t_specialites_medecin.oid
GROUP BY t_medecins.oid) subview
WHERE t_medecins.oid = subview.oid AND t_medecins.oid <> 0 AND t_medecins.specialite_id = 0;
-- no_adeli
UPDATE activite[PX].t_medecins_administratifs
SET no_adeli = NID_PRA
FROM prod_sigems.PRATICIEN
WHERE t_medecins_administratifs.code_original = COD_PRA AND
t_medecins_administratifs.NO_ADELI IS DISTINCT FROM NID_PRA
;
-- Code RPPS
UPDATE base.t_medecins
SET code_rpps = subview.RPPS
FROM
(
SELECT medecin_id, count(DISTINCT rpps), MAX(RPPS) AS RPPS
FROM activite[PX].t_medecins_administratifs
JOIN base.t_medecins ON t_medecins_administratifs.medecin_id = t_medecins.oid
JOIN prod_sigems.PRAT_COMPL ON code_original = COD_PRA
WHERE RPPS <> '' AND
t_medecins.code_rpps = '' AND
medecin_id <> 0
GROUP BY 1
HAVING count(DISTINCT rpps) = 1
) subview
WHERE t_medecins.oid = subview.medecin_id
;
-- Adresse
INSERT INTO base.t_codes_postaux(code, texte, texte_court, departement_id)
SELECT CPO_PRA, MAX(VIL_PRA), MAX(VIL_PRA), MAX(t_departements.oid)
FROM prod_sigems.PRATICIEN
LEFT JOIN base.t_codes_postaux ON CPO_PRA = t_codes_postaux.code
JOIN base.t_departements ON
CPO_PRA NOT LIKE '97%' AND substr(CPO_PRA,1,2) = t_departements.code OR
CPO_PRA LIKE '97%' AND substr(CPO_PRA,1,3) = t_departements.code
WHERE CPO_PRA <> '' AND
length(CPO_PRA) = 5 AND
t_codes_postaux.code is NULL
GROUP BY 1
;
UPDATE activite[PX].t_medecins_administratifs SET
adresse = AD1_PRA || ' ' || AD2_PRA,
code_postal_id = COALESCE(t_codes_postaux.oid,0),
ville = VIL_PRA,
telephone = COALESCE(trim(PRAT_COMPL.TEL||' '||PRAT_COMPL.PORTABLE),''),
email = COALESCE(PRAT_COMPL.MAIL,'')
FROM prod_sigems.PRATICIEN
LEFT JOIN prod_sigems.PRAT_COMPL ON PRATICIEN.COD_PRA = PRAT_COMPL.COD_PRA
LEFT JOIN base.t_codes_postaux ON CPO_PRA = t_codes_postaux.code
WHERE t_medecins_administratifs.code_original = PRATICIEN.COD_PRA AND
(
t_medecins_administratifs.adresse IS DISTINCT FROM (AD1_PRA || ' ' || AD2_PRA) OR
t_medecins_administratifs.code_postal_id IS DISTINCT FROM COALESCE(t_codes_postaux.oid,0) OR
t_medecins_administratifs.ville IS DISTINCT FROM VIL_PRA OR
t_medecins_administratifs.telephone IS DISTINCT FROM COALESCE(trim(PRAT_COMPL.TEL||' '||PRAT_COMPL.PORTABLE),'') OR
t_medecins_administratifs.email IS DISTINCT FROM COALESCE(PRAT_COMPL.MAIL,'')
)
;
]]></sqlcmd>
</NODE>
<NODE label="Hébergement">
<sqlcmd><![CDATA[
-- Services
INSERT INTO activite[PX].t_services_facturation(oid, code_original, code, texte, texte_court)
SELECT 0, 0, '****', 'Non renseigné', 'Non renseigné' WHERE 0 NOT IN (SELECt oid FROM activite[PX].t_services_facturation);
DROP TABLE IF EXISTS w_SERVICE;
CREATE TEMP TABLE w_SERVICE AS
SELECT
COD_SER || '_' || COALESCE(MDT_REEL,MDT_DOS) AS COD_SER,
NOM_SER || ' (' || COALESCE(MDT_REEL,MDT_DOS) || ')' AS NOM_SER,
COALESCE(MDT_REEL,MDT_DOS) AS MDT_SER,
DMT_SER
FROM prod_sigems.DOSSIER
JOIN prod_sigems.SERVICE ON SER_DOS = COD_SER
LEFT JOIN prod_sigems.DOSSIER_MDT ON DOSSIER.ANN_DOS = DOSSIER_MDT.ANN_DOS AND DOSSIER.COD_DOS = DOSSIER_MDT.COD_DOS
GROUP BY 1,2,3,4;
INSERT INTO activite[PX].t_services_facturation(code_original, code, texte, texte_court, nb_lits, type_t2a)
SELECT COD_SER, COD_SER, NOM_SER, NOM_SER, 0 AS nb_lits, '0' AS type_t2a
FROM w_SERVICE
WHERE COD_SER NOT IN (SELECT code_original FROM activite[PX].t_services_facturation)
ORDER BY COD_SER;
UPDATE activite[PX].t_services_facturation SET
texte = NOM_SER,
texte_court = CASE WHEN texte_court = texte THEN NOM_SER ELSE texte_court END
FROM w_SERVICE
WHERE COD_SER = code_original AND
(
texte IS DISTINCT FROM NOM_SER OR
texte_court IS DISTINCT FROM CASE WHEN texte_court = texte THEN NOM_SER ELSE texte_court END
);
UPDATE activite[PX].t_services_facturation
SET mode_traitement_id = COALESCE(t_modes_traitement.oid,0)
FROM w_SERVICE
LEFT JOIN base.t_modes_traitement ON MDT_SER = t_modes_traitement.code
WHERE t_services_facturation.code_original = COD_SER AND
COALESCE(mode_traitement_id,0) = 0 AND
COALESCE(mode_traitement_id,0) <> COALESCE(t_modes_traitement.oid,0);
DROP TABLE IF EXISTS w_SERVICE;
CREATE TEMP TABLE w_SERVICE AS
SELECT
SER_SEJ || '_' || COALESCE(MDT_REEL,MDT_DOS) AS COD_SER,
NOM_SER || ' (' || COALESCE(MDT_REEL,MDT_DOS) || ')' AS NOM_SER,
COALESCE(MDT_REEL,MDT_DOS) AS MDT_SER,
DMT_SER
FROM prod_sigems.DOSSIER
JOIN prod_sigems.SEJOUR ON ANN_SEJ = ANN_DOS AND COD_SEJ = COD_DOS
JOIN prod_sigems.SERVICE ON SER_SEJ = COD_SER
LEFT JOIN prod_sigems.DOSSIER_MDT ON DOSSIER.ANN_DOS = DOSSIER_MDT.ANN_DOS AND DOSSIER.COD_DOS = DOSSIER_MDT.COD_DOS
GROUP BY 1,2,3,4;
INSERT INTO activite[PX].t_services_facturation(code_original, code, texte, texte_court, nb_lits, type_t2a)
SELECT COD_SER, COD_SER, NOM_SER, NOM_SER, 0 AS nb_lits, '0' AS type_t2a
FROM w_SERVICE
WHERE COD_SER NOT IN (SELECT code_original FROM activite[PX].t_services_facturation)
ORDER BY COD_SER;
UPDATE activite[PX].t_services_facturation SET
code = COD_SER,
texte = NOM_SER,
texte_court = CASE WHEN texte_court = texte THEN NOM_SER ELSE texte_court END
FROM w_SERVICE
WHERE COD_SER = code_original AND
(
code IS DISTINCT FROM COD_SER OR
texte IS DISTINCT FROM NOM_SER OR
texte_court IS DISTINCT FROM CASE WHEN texte_court = texte THEN NOM_SER ELSE texte_court END
);
UPDATE activite[PX].t_services_facturation
SET mode_traitement_id = COALESCE(t_modes_traitement.oid,0)
FROM w_SERVICE
LEFT JOIN base.t_modes_traitement ON MDT_SER = t_modes_traitement.code
WHERE t_services_facturation.code_original = COD_SER AND
COALESCE(mode_traitement_id,0) = 0 AND
COALESCE(mode_traitement_id,0) <> COALESCE(t_modes_traitement.oid,0);
UPDATE activite[PX].t_services_facturation
SET dmt_id = COALESCE(t_dmt.oid,0)
FROM w_SERVICE
LEFT JOIN base.t_dmt ON DMT_SER = t_dmt.code
WHERE t_services_facturation.code_original = COD_SER AND
COALESCE(dmt_id,0) = 0 AND
COALESCE(dmt_id,0) <> COALESCE(t_dmt.oid,0);
-- Unités fonctionnelles
INSERT INTO activite[PX].t_unites_fonctionnelles(oid, code_original, code, texte, texte_court)
SELECT 0, 0, '', 'Non renseignée', 'Non renseignée' WHERE 0 NOT IN (SELECt oid FROM activite[PX].t_unites_fonctionnelles);
INSERT INTO activite[PX].t_unites_fonctionnelles(code_original, code, texte, texte_court)
SELECT COD_SER, COD_SER, NOM_SER, NOM_SER
FROM prod_sigems.SERVICE
WHERE COD_SER NOT IN (SELECT code_original FROM activite[PX].t_unites_fonctionnelles)
ORDER BY COD_SER;
UPDATE activite[PX].t_unites_fonctionnelles SET
code = COD_SER,
texte = NOM_SER,
texte_court = CASE WHEN texte_court = texte THEN NOM_SER ELSE texte_court END
FROM prod_SIGEMS.SERVICE
WHERE COD_SER = code_original AND
(
code IS DISTINCT FROM COD_SER OR
texte IS DISTINCT FROM NOM_SER OR
texte_court IS DISTINCT FROM CASE WHEN texte_court = texte THEN NOM_SER ELSE texte_court END
);
-- Unités médicales
INSERT INTO activite[PX].t_unites_medicales(oid, code_original, code, texte, texte_court)
SELECT 0, 0, '', 'Non renseignée', 'Non renseignée' WHERE 0 NOT IN (SELECt oid FROM activite[PX].t_unites_medicales);
INSERT INTO activite[PX].t_unites_medicales(code_original, code, texte, texte_court)
SELECT CODE, CODE, LIB, LIB
FROM prod_sigems.UNITE_MEDICALE
WHERE CODE NOT IN (SELECT code_original FROM activite[PX].t_unites_medicales)
ORDER BY CODE;
UPDATE activite[PX].t_unites_medicales SET
code = UM.CODE,
texte = LIB,
texte_court = LIB
FROM prod_SIGEMS.UNITE_MEDICALE UM
WHERE UM.CODE = code_original AND
(
t_unites_medicales.code IS DISTINCT FROM UM.CODE OR
texte IS DISTINCT FROM UM.LIB OR
texte_court IS DISTINCT FROM UM.LIB
);
-- Activités
INSERT INTO activite[PX].t_activites(oid, code_original, code, texte, texte_court)
SELECT 0, 0, '', 'Non renseignée', 'Non renseignée' WHERE 0 NOT IN (SELECt oid FROM activite[PX].t_activites);
-- Etages et lits
DROP TABLE IF EXISTS w_CHAMBRE;
CREATE TEMP TABLE W_CHAMBRE AS
SELECT COD_CHA, NOM_CHA, TYP_CHA, NBL_CHA, SER_CHA::text, CHAMBRE
FROM prod_sigems.CHAMBRE
WHERE COD_CHA <> '' AND
COD_CHA <> '0'
GROUP BY 1,2,3,4,5,6;
CREATE INDEX w_CHAMBRE_i1
ON w_CHAMBRE
USING btree
(COD_CHA);
UPDATE w_CHAMBRE
SET SER_CHA = COD_CHA
WHERE SER_CHA = '';
INSERT INTO w_CHAMBRE
SELECT NCH_DOS, NCH_DOS, '', 0, MAX(SECT_ENTREE), NCH_DOS
FROM prod_sigems.DOSSIER
JOIN prod_sigems.DOSSIER_SUPPL ON DOSSIER_SUPPL.COD_DOS = DOSSIER.COD_DOS AND
DOSSIER_SUPPL.ANN_DOS = DOSSIER.ANN_DOS
WHERE SECT_ENTREE <> '' AND
NCH_DOS NOT IN (SELECT COD_CHA FROM w_CHAMBRE) AND
NCH_DOS NOT IN ('','0','NULL')
GROUP BY 1
ORDER BY 1;
INSERT INTO w_CHAMBRE
SELECT NCH_SEJ, NCH_SEJ, '', 0, MAX(SECT_ENTREE), NCH_SEJ
FROM prod_sigems.SEJOUR
JOIN prod_sigems.DOSSIER_SUPPL ON DOSSIER_SUPPL.COD_DOS = SEJOUR.COD_SEJ AND
DOSSIER_SUPPL.ANN_DOS = SEJOUR.ANN_SEJ
WHERE SECT_ENTREE <> '' AND
NCH_SEJ NOT IN (SELECT COD_CHA FROM w_CHAMBRE) AND
NCH_SEJ NOT IN ('','0','NULL')
GROUP BY 1
ORDER BY 1;
INSERT INTO w_CHAMBRE
SELECT NCH_DOS, NCH_DOS, MAX(TYP_CHA), MAX(NBL_CHA), MAX(SER_CHA), MAX(COD_CHA)
FROM prod_sigems.DOSSIER
JOIN w_CHAMBRE ON SUBSTR(NCH_DOS,1,3) = COD_CHA
WHERE LENGTH(NCH_DOS) > 3 AND LENGTH(COD_CHA) = 3 AND
NCH_DOS NOT IN (SELECT COD_CHA FROM w_CHAMBRE) AND
NCH_DOS NOT IN ('','0','NULL')
GROUP BY 1
ORDER BY 1;
INSERT INTO w_CHAMBRE
SELECT NCH_SEJ, NCH_SEJ, MAX(TYP_CHA), MAX(NBL_CHA), MAX(SER_CHA), MAX(COD_CHA)
FROM prod_sigems.SEJOUR
JOIN w_CHAMBRE ON SUBSTR(NCH_SEJ,1,3) = COD_CHA
WHERE LENGTH(NCH_SEJ) > 3 AND LENGTH(COD_CHA) = 3 AND
NCH_SEJ NOT IN (SELECT COD_CHA FROM w_CHAMBRE) AND
NCH_SEJ NOT IN ('','0','NULL')
GROUP BY 1
ORDER BY 1;
INSERT INTO w_CHAMBRE
SELECT NCH_DOS, NCH_DOS, MAX(TYP_CHA), MAX(NBL_CHA), MAX(SER_CHA), MAX(COD_CHA)
FROM prod_sigems.DOSSIER
JOIN w_CHAMBRE ON SUBSTR(NCH_DOS,1,3) = SUBSTR(COD_CHA,1,3)
WHERE NCH_DOS NOT IN (SELECT COD_CHA FROM w_CHAMBRE) AND
NCH_DOS NOT IN ('','0','NULL')
GROUP BY 1
ORDER BY 1;
INSERT INTO w_CHAMBRE
SELECT NCH_DOS, NCH_DOS, MAX(TYP_CHA), MAX(NBL_CHA), MAX(SER_CHA), MAX(COD_CHA)
FROM prod_sigems.DOSSIER
JOIN w_CHAMBRE ON SUBSTR(NCH_DOS,1,2) = SUBSTR(COD_CHA,1,2)
WHERE NCH_DOS NOT IN (SELECT COD_CHA FROM w_CHAMBRE) AND
NCH_DOS NOT IN ('','0','NULL')
GROUP BY 1
ORDER BY 1;
INSERT INTO w_CHAMBRE
SELECT NCH_DOS, NCH_DOS, MAX(TYP_CHA), MAX(NBL_CHA), MAX(SER_CHA), MAX(COD_CHA)
FROM prod_sigems.DOSSIER
JOIN w_CHAMBRE ON SUBSTR(NCH_DOS,1,1) = SUBSTR(COD_CHA,1,1)
WHERE NCH_DOS NOT IN (SELECT COD_CHA FROM w_CHAMBRE) AND
NCH_DOS NOT IN ('','0','NULL')
GROUP BY 1
ORDER BY 1;
INSERT INTO w_CHAMBRE
SELECT NCH_SEJ, NCH_SEJ, MAX(TYP_CHA), MAX(NBL_CHA), MAX(SER_CHA), MAX(COD_CHA)
FROM prod_sigems.SEJOUR
JOIN w_CHAMBRE ON SUBSTR(NCH_SEJ,1,3) = SUBSTR(COD_CHA,1,3)
WHERE NCH_SEJ NOT IN (SELECT COD_CHA FROM w_CHAMBRE) AND
NCH_SEJ NOT IN ('','0','NULL')
GROUP BY 1
ORDER BY 1;
INSERT INTO w_CHAMBRE
SELECT NCH_SEJ, NCH_SEJ, MAX(TYP_CHA), MAX(NBL_CHA), MAX(SER_CHA), MAX(COD_CHA)
FROM prod_sigems.SEJOUR
JOIN w_CHAMBRE ON SUBSTR(NCH_SEJ,1,2) = SUBSTR(COD_CHA,1,2)
WHERE NCH_SEJ NOT IN (SELECT COD_CHA FROM w_CHAMBRE) AND
NCH_SEJ NOT IN ('','0','NULL')
GROUP BY 1
ORDER BY 1;
INSERT INTO w_CHAMBRE
SELECT NCH_SEJ, NCH_SEJ, MAX(TYP_CHA), MAX(NBL_CHA), MAX(SER_CHA), MAX(COD_CHA)
FROM prod_sigems.SEJOUR
JOIN w_CHAMBRE ON SUBSTR(NCH_SEJ,1,1) = SUBSTR(COD_CHA,1,1)
WHERE NCH_SEJ NOT IN (SELECT COD_CHA FROM w_CHAMBRE) AND
NCH_SEJ NOT IN ('','0','NULL')
GROUP BY 1
ORDER BY 1;
DELETE FROM w_CHAMBRE
USING
(
SELECT COD_CHA, MIN(CTID) AS keep_CTID
FROM w_CHAMBRE
GROUP BY 1
HAVING count(*) > 1
) subview
WHERE w_CHAMBRE.COD_CHA = subview.COD_CHA AND
w_CHAMBRE.CTID <> keep_CTID
;
INSERT INTO activite[PX].t_etages(oid, code_original, code, texte, texte_court, nb_lits)
SELECT 0, 0, '', 'Non renseigné', 'Non renseigné', 0 WHERE 0 NOT IN (SELECT oid FROM activite[PX].t_etages);
INSERT INTO activite[PX].t_etages(code_original, code, texte, texte_court, nb_lits)
SELECT SER_CHA, SER_CHA, SER_CHA, SER_CHA, 0 AS nb_lits
FROM w_CHAMBRE
WHERE SER_CHA <> '' AND SER_CHA NOT IN (SELECT code_original FROM activite[PX].t_etages WHERE code_original IS NOT NULL)
GROUP BY SER_CHA
ORDER BY SER_CHA;
INSERT INTO activite[PX].t_etages(code_original, code, texte, texte_court, nb_lits)
SELECT COD_CHA, COD_CHA, MAX(NOM_CHA), MAX(NOM_CHA), 0 AS nb_lits
FROM w_CHAMBRE
WHERE COD_CHA <> '' AND SER_CHA = '' AND COD_CHA NOT IN (SELECT code_original FROM activite[PX].t_etages WHERE code_original IS NOT NULL)
GROUP BY COD_CHA
ORDER BY COD_CHA;
UPDATE activite[PX].t_etages SET
code = SER_CHA,
texte = SER_CHA,
texte_court = SER_CHA
FROM w_CHAMBRE
WHERE SER_CHA <> '' AND
SER_CHA = code_original AND
(
code IS DISTINCT FROM SER_CHA OR
texte IS DISTINCT FROM SER_CHA OR
texte_court IS DISTINCT FROM SER_CHA
)
;
UPDATE activite[PX].t_etages SET
code = COD_SER,
texte = NOM_SER,
texte_court = NOM_SER
FROM prod_sigems.SERVICE
WHERE COD_SER <> '' AND
NOM_SER <> '' AND
COD_SER = code_original AND
(
code IS DISTINCT FROM COD_SER OR
texte IS DISTINCT FROM NOM_SER OR
texte_court IS DISTINCT FROM NOM_SER
)
;
INSERT INTO activite[PX].t_lits(oid, code_original, code, texte, texte_court, etage_id, chambre_particuliere)
SELECT 0, 0, '', 'Non renseigné', 'Non renseigné', 0, 'N' WHERE 0 NOT IN (SELECT oid FROM activite[PX].t_lits);
INSERT INTO activite[PX].t_lits(code_original, code, texte, texte_court, etage_id, chambre_particuliere)
SELECT SER_CHA || '|' || COD_CHA, COD_CHA, NOM_CHA, NOM_CHA,
t_etages.oid, CASE WHEN TYP_CHA LIKE 'P%' THEN 'O' ELSE 'N' END
FROM w_CHAMBRE
JOIN activite[PX].t_etages ON SER_CHA = t_etages.code_original
WHERE COD_CHA <> '' AND SER_CHA || '|' || COD_CHA NOT IN (SELECT code_original FROM activite[PX].t_lits WHERE code_original IS NOT NULL)
ORDER BY 1;
INSERT INTO activite[PX].t_lits(code_original, code, texte, texte_court, etage_id, chambre_particuliere)
SELECT COD_CHA || '|' || COD_CHA, COD_CHA, NOM_CHA, NOM_CHA,
t_etages.oid, CASE WHEN TYP_CHA LIKE 'P%' THEN 'O' ELSE 'N' END
FROM w_CHAMBRE
JOIN activite[PX].t_etages ON COD_CHA = t_etages.code_original
WHERE COD_CHA <> '' AND SER_CHA = '' AND COD_CHA || '|' || COD_CHA NOT IN (SELECT code_original FROM activite[PX].t_lits WHERE code_original IS NOT NULL)
ORDER BY 1;
INSERT INTO activite[PX].t_lits(code_original, code, texte, texte_court, etage_id, chambre_particuliere)
SELECT code_original || '|0' , '', 'Non renseigné', 'Non renseigné', oid, 'O'
FROM activite[PX].t_etages
WHERE oid > 0 AND
code_original || '|0' NOT IN (SELECT code_original FROM activite[PX].t_lits WHERE code_original IS NOT NULL );
UPDATE activite[PX].t_lits SET
code = COD_CHA,
texte = NOM_CHA,
texte_court = NOM_CHA
FROM w_CHAMBRE
WHERE COD_CHA || '|' || COD_CHA = code_original AND
(
code IS DISTINCT FROM COD_CHA OR
texte IS DISTINCT FROM NOM_CHA OR
texte_court IS DISTINCT FROM NOM_CHA
)
;
]]></sqlcmd>
</NODE>
<NODE label="Facturation">
<sqlcmd><![CDATA[
-- Rubriques et prestations
INSERT INTO activite[PX].t_rubriques_facturation(oid, code_original, code, texte, texte_court)
SELECT 0, 0, '', 'Non renseignée', 'Non renseignée' WHERE 0 NOT IN (SELECT oid FROM activite[PX].t_rubriques_facturation);
INSERT INTO activite[PX].t_rubriques_facturation(code_original, code, texte, texte_court)
SELECT trim(COD_PRC), trim(COD_PRC), MAX(LIB_PRC), MAX(LIB_PRC)
FROM prod_sigems.PROD_CLINI
WHERE trim(COD_PRC) NOT IN (SELECT code_original FROM activite[PX].t_rubriques_facturation)
GROUP BY 1,2
ORDER BY trim(COD_PRC);
INSERT INTO activite[PX].t_rubriques_facturation(code_original, code, texte, texte_court)
SELECT trim(COD_PRH), trim(COD_PRH), MAX(LIB_PRH), MAX(LIB_PRH)
FROM prod_sigems.PROD_HONOR
WHERE trim(COD_PRH) NOT IN (SELECT code_original FROM activite[PX].t_rubriques_facturation)
GROUP BY 1,2
ORDER BY 1;
WITH prod_clini AS (
SELECT trim(COD_PRC) AS COD_PRC,
MAX(LIB_PRC) AS LIB_PRC
FROM prod_sigems.PROD_CLINI
GROUP BY trim(COD_PRC)
)
UPDATE activite[PX].t_rubriques_facturation SET
code = COD_PRC,
texte = LIB_PRC,
texte_court = LIB_PRC
FROM prod_clini
WHERE COD_PRC = code_original AND
(
code IS DISTINCT FROM COD_PRC OR
texte IS DISTINCT FROM LIB_PRC OR
texte_court IS DISTINCT FROM LIB_PRC
)
;
WITH prod_honor AS (
SELECT trim(COD_PRH) AS COD_PRH,
MAX(LIB_PRH) AS LIB_PRH
FROM prod_sigems.PROD_HONOR
GROUP BY trim(COD_PRH)
)
UPDATE activite[PX].t_rubriques_facturation SET
code = COD_PRH,
texte = LIB_PRH,
texte_court = LIB_PRH
FROM prod_honor
WHERE COD_PRH = code_original AND
(
code IS DISTINCT FROM COD_PRH OR
texte IS DISTINCT FROM LIB_PRH OR
texte_court IS DISTINCT FROM LIB_PRH
)
;
INSERT INTO activite.t_prestations(oid, code_original, code, texte, texte_court, clinique_honoraire)
SELECT 0, 0, '', 'Non renseignée', 'Non renseignée', '' WHERE 0 NOT IN (SELECT oid FROM activite.t_prestations);
UPDATE activite.t_prestations
SET code_original = code
WHERE oid > 0
AND code_original NOT LIKE '*CTI%'
AND code_original IS DISTINCT FROM code
;
INSERT INTO activite.t_prestations(code_original, code, texte, texte_court)
SELECT ACT_PRC, ACT_PRC, MAX(ACT_PRC), MAX(ACT_PRC)
FROM prod_sigems.PROD_CLINI
WHERE ACT_PRC NOT IN (SELECT code_original FROM activite.t_prestations)
AND ACT_PRC <> ''
GROUP BY 1,2
ORDER BY ACT_PRC;
WITH prod_clini AS
(
SELECT
ACT_PRC AS code_prod_clini,
MAX(ACT_PRC) AS texte_prod_clini
FROM prod_sigems.PROD_CLINI
WHERE ACT_PRC <> ''
GROUP BY 1
)
UPDATE activite.t_prestations SET
code = code_prod_clini,
texte = texte_prod_clini,
texte_court = texte_prod_clini
FROM prod_clini
WHERE code_original = code_prod_clini AND
(
code IS DISTINCT FROM code_prod_clini OR
texte IS DISTINCT FROM texte_prod_clini OR
texte_court IS DISTINCT FROM texte_prod_clini
)
;
INSERT INTO activite.t_prestations(code_original, code, texte, texte_court)
SELECT CASE WHEN ACT_PRH <> '' THEN ACT_PRH ELSE COD_PRH END ,
CASE WHEN ACT_PRH <> '' THEN ACT_PRH ELSE COD_PRH END,
MAX(CASE WHEN ACT_PRH <> '' THEN ACT_PRH ELSE COD_PRH END),
MAX(CASE WHEN ACT_PRH <> '' THEN ACT_PRH ELSE COD_PRH END)
FROM prod_sigems.PROD_HONOR
WHERE CASE WHEN ACT_PRH <> '' THEN ACT_PRH ELSE COD_PRH END NOT IN (SELECT code_original FROM activite.t_prestations)
GROUP BY 1,2
ORDER BY 1;
WITH prod_honor AS
(
SELECT
CASE WHEN ACT_PRH <> '' THEN ACT_PRH ELSE COD_PRH END AS code_prod_honor,
MAX(CASE WHEN ACT_PRH <> '' THEN ACT_PRH ELSE COD_PRH END) AS texte_prod_honor
FROM prod_sigems.PROD_HONOR
GROUP BY 1
)
UPDATE activite.t_prestations SET
code = code_prod_honor,
texte = texte_prod_honor,
texte_court = texte_prod_honor
FROM prod_honor
WHERE code_prod_honor NOT IN
(
SELECT code
FROM base.t_ccam_regroupements
WHERE code NOT IN ('NGAP','CCAM','CDAM') AND
length(code) = 3 AND
oid IN (SELECT ccam_regroupement_id_1 FROM base.t_actes) AND
code <> ''
) AND
code_original = code_prod_honor AND
(
code IS DISTINCT FROM code_prod_honor OR
texte IS DISTINCT FROM texte_prod_honor OR
texte_court IS DISTINCT FROM texte_prod_honor
)
;
INSERT INTO activite[PX].t_compte(oid, code_original, code, texte, texte_court)
SELECT 0, 0, '', 'Non renseigné', 'Non renseigné' WHERE 0 NOT IN (SELECt oid FROM activite[PX].t_compte);
INSERT INTO activite[PX].t_compte(code_original, code, texte, texte_court)
SELECT AFA_PRC, AFA_PRC, MAX(COALESCE(INT1,AFA_PRC)), MAX(COALESCE(INT1,AFA_PRC))
FROM prod_sigems.PROD_CLINI
LEFT JOIN prod_sigems.COMPTE ON AFA_PRC = NUM
WHERE AFA_PRC <> '' AND AFA_PRC NOT IN (SELECT code_original FROM activite[PX].t_compte)
GROUP BY 1
ORDER BY 1;
INSERT INTO activite[PX].t_compte(code_original, code, texte, texte_court)
SELECT CPT_ANA, CPT_ANA, MAX(COALESCE(INT1,CPT_ANA)), MAX(COALESCE(INT1,CPT_ANA))
FROM prod_sigems.ANALYG
LEFT JOIN prod_sigems.COMPTE ON CPT_ANA = num AND ANALYG.TYP_ANA = COMPTE.TYP
WHERE CPT_ANA NOT IN (SELECT code_original FROM activite[PX].t_compte)
GROUP BY 1
ORDER BY 1;
WITH comptes AS (
SELECT trim(AFA_PRC) AS AFA_PRC,
MAX(COALESCE(INT1,AFA_PRC)) AS INT1
FROM prod_sigems.PROD_CLINI
LEFT JOIN prod_sigems.COMPTE ON AFA_PRC = NUM
GROUP BY trim(AFA_PRC)
)
UPDATE activite[PX].t_compte SET
code = AFA_PRC,
texte = INT1,
texte_court = INT1
FROM comptes
WHERE AFA_PRC = code_original AND
(
code IS DISTINCT FROM AFA_PRC OR
texte IS DISTINCT FROM INT1 OR
texte_court IS DISTINCT FROM INT1
)
;
WITH comptes_analytique AS (
SELECT trim(CPT_ANA) AS CPT_ANA,
MAX(COALESCE(INT1,CPT_ANA)) AS INT1
FROM prod_sigems.ANALYG
LEFT JOIN prod_sigems.COMPTE ON CPT_ANA = num AND ANALYG.TYP_ANA = COMPTE.TYP
GROUP BY trim(CPT_ANA)
)
UPDATE activite[PX].t_compte SET
code = CPT_ANA,
texte = INT1,
texte_court = INT1
FROM comptes_analytique
WHERE CPT_ANA = code_original AND
(
code IS DISTINCT FROM CPT_ANA OR
texte IS DISTINCT FROM INT1 OR
texte_court IS DISTINCT FROM INT1
)
;
-- Codes risques
INSERT INTO activite[PX].t_risque(code, texte)
SELECT
COD_RIS, LIB_RIS
FROM
prod_sigems.RISQUE
LEFT JOIN activite[PX].t_risque ON t_risque.code = COD_RIS
WHERE
t_risque.code IS NULL
;
-- Motifs non facturation
INSERT INTO activite[PX].t_motif_non_facturation(code_original, code, texte, texte_court)
SELECT NUM, NUM, MAX(LIB), MAX(LIB)
FROM prod_sigems.MOTIF_ATTENTE
WHERE NUM <> '' AND NUM NOT IN (SELECT code FROM activite[PX].t_motif_non_facturation)
GROUP BY 1
ORDER BY 1
;
]]></sqlcmd>
</NODE>
</NODE>
<NODE name="POST" label="TRAITEMENTS COMPLEMENTAIRES">
<NODE name="Compléments patients">
<sqlcmd><![CDATA[
DROP TABLE IF EXISTS w_medecins;
CREATE TEMP TABLE w_medecins AS
SELECT
COD_PRA,
MAX(NOM_PRA) as nom_pra,
MAX(PRE_PRA) as pre_pra
FROM prod_sigems.PRATICIEN
GROUP BY 1;
DROP TABLE IF EXISTS w_DOSSIER_SELECT;
CREATE TEMP TABLE w_DOSSIER_SELECT AS
SELECT
ANN_DOS AS ANN_SELECT,
COD_DOS AS COD_SELECT,
ANN_DOS || to_char(COD_DOS,'FM900000') AS no_sejour_SELECT,
CASE WHEN (CMT_DOS IS NULL OR CMT_DOS LIKE 'DIVERS%' OR CMT_DOS = '') AND ME1_DOS <> '' AND ME1_DOS IS NOT NULL THEN ME1_DOS || ' ' || ME2_DOS ELSE COALESCE(CMT_DOS,'') END AS CMT_DOS,
CASE WHEN ME1_DOS <> '' AND ME1_DOS IS NOT NULL THEN ME1_DOS ELSE COALESCE(CMT_DOS,'') END AS nom_med,
CASE WHEN ME2_DOS <> '' AND ME2_DOS IS NOT NULL THEN ME2_DOS ELSE '' END AS pre_med
FROM prod_sigems.dossier
left join prod_sigems.dossier_x on (dossier.ann_dos = dossier_x.ann_dox and dossier.cod_dos = dossier_x.cod_dox)
WHERE DSO_DOS >= '20120101' OR DSO_DOS IS NULL;
UPDATE w_DOSSIER_SELECT SET
nom_med = w_medecins.nom_pra,
pre_med = w_medecins.pre_pra
FROM w_medecins
WHERE
CMT_DOS = w_medecins.COD_PRA
AND (nom_med <> w_medecins.nom_pra OR pre_med <> w_medecins.pre_pra)
;
UPDATE w_DOSSIER_SELECT SET
pre_med = CMT_DOS
WHERE
CMT_DOS IN ('DIVERS', '', '?', '0')
AND nom_med = CMT_DOS
and pre_med != CMT_DOS
;
CREATE INDEX w_DOSSIER_SELECT_i1
ON w_DOSSIER_SELECT
USING btree
(no_sejour_SELECT);
-- Ajout médecins traitants dans ACTIVITE (Ajouter dans BASE)
INSERT INTO activite[PX].t_medecins_traitants_administratifs(code_original, code, nom, prenom, specialite_id, no_rpps)
SELECT trim(CMT_DOS), trim(CMT_DOS), MAX(nom_med), MAX(pre_med), 0, ''
FROM w_DOSSIER_SELECT
WHERE TRUE
AND trim(CMT_DOS) NOT IN (SELECT code_original FROM activite[PX].t_medecins_traitants_administratifs)
AND CMT_DOS <> 0
AND trim(CMT_DOS) <> ''
AND trim(CMT_DOS) <> '0'
AND CMT_DOS IS NOT NULL
GROUP BY trim(CMT_DOS)
;
WITH medecins AS (
SELECT trim(CMT_DOS) AS CMT_DOS,
MAX(nom_med) AS nom_med,
MAX(pre_med) AS pre_med
FROM w_DOSSIER_SELECT
GROUP BY trim(CMT_DOS)
)
UPDATE activite[PX].t_medecins_traitants_administratifs SET
code = CMT_DOS,
nom = nom_med,
prenom = pre_med
FROM medecins
WHERE CMT_DOS = code_original AND
(
code IS DISTINCT FROM CMT_DOS OR
nom IS DISTINCT FROM nom_med OR
prenom IS DISTINCT FROM pre_med
)
;
-- maj code rpps
UPDATE activite[PX].t_medecins_traitants_administratifs
SET no_rpps = rpps
FROM prod_sigems.PRAT_COMPL
WHERE PRAT_COMPL.COD_PRA = t_medecins_traitants_administratifs.code
AND (t_medecins_traitants_administratifs.no_rpps IS NULL OR t_medecins_traitants_administratifs.no_rpps = ''
AND rpps IS not NULL AND rpps <>'' );
-- maj id médecin_traitant dans séjours
UPDATE activite[PX].p_sejours
SET medecin_traitant_id = t_medecins_traitants_administratifs.oid
FROM w_DOSSIER_SELECT, activite[PX].t_medecins_traitants_administratifs
WHERE w_DOSSIER_SELECT.no_sejour_SELECT = p_sejours.no_sejour AND
w_DOSSIER_SELECT.CMT_DOS = t_medecins_traitants_administratifs.code AND
w_DOSSIER_SELECT.CMT_DOS IS NOT NULL AND w_DOSSIER_SELECT.CMT_DOS <> '' AND
medecin_traitant_id IS DISTINCT FROM t_medecins_traitants_administratifs.oid
;
-- ajout des coordonnées par séjour
INSERT INTO activite[PX].p_coordonnees_patient (
sejour_id,
adresse,
code_postal_id,
commune,
telephone_fixe,
telephone_portable,
email
)
SELECT
p_sejours.oid,
AD1_PAT || CASE WHEN AD2_PAT != '' THEN ' - ' || AD2_PAT ELSE '' END,
COALESCE(t_codes_postaux.oid,0),
VIL_PAT,
TEL_PAT,
PORTABLE,
MAIL
FROM w_PATIENT
LEFT JOIN prod_sigems.PAT_COMPL ON w_PATIENT.COD_PAT = PAT_COMPL.COD_PAT
LEFT JOIN base.t_codes_postaux ON CPO_PAT = t_codes_postaux.code
JOIN activite[PX].p_sejours ON no_sejour = SEJ_NUM
;
]]></sqlcmd>
</NODE>
<NODE label="Compléments facture">
<sqlcmd><![CDATA[
-- Motifs non facturation
DROP TABLE IF EXISTS w_DOSSIER_ATTENTE;
CREATE TEMP TABLE w_DOSSIER_ATTENTE AS
SELECT
DOSSIER_ATTENTE.ANNEE || to_char(DOSSIER_ATTENTE.CODE,'FM900000') AS no_sejour,
(MAX(ARRAY[DAT::text, COALESCE(t_motif_non_facturation.oid::text,t_motif_non_facturation_autres.oid::text)]))[2]::bigint AS motif_non_facturation_id,
(MAX(ARRAY[DAT::text, DOSSIER_ATTENTE.LIB::text]))[2] AS motif_non_facturation_comment
FROM prod_sigems.DOSSIER_ATTENTE
LEFT JOIN activite[PX].t_motif_non_facturation ON t_motif_non_facturation.code_original = CODE_MOTIF
JOIN activite[PX].t_motif_non_facturation t_motif_non_facturation_autres ON t_motif_non_facturation_autres.code_original = '*CTIZZZ'
GROUP BY 1
;
UPDATE activite[PX].p_factures
SET motif_non_facturation_id = w_DOSSIER_ATTENTE.motif_non_facturation_id,
motif_non_facturation_comment = w_DOSSIER_ATTENTE.motif_non_facturation_comment
FROM w_DOSSIER_ATTENTE
WHERE p_factures.no_sejour = w_DOSSIER_ATTENTE.no_sejour
;
-- Dates
UPDATE activite[PX].p_factures SET date_expedition_0 = date_facture WHERE date_expedition_0 < date_facture AND date_facture <> '2099-12-31';
]]></sqlcmd>
</NODE>
<NODE label="Compléments séjours">
<sqlcmd><![CDATA[
UPDATE activite[PX].p_sejours
SET date_groupage = date_facture
WHERE (date_groupage IS null OR date_groupage = '20991231') AND
date_facture <> '2099-12-31';
DROP TABLE IF EXISTS w_sejours_total;
CREATE TEMP TABLE w_sejours_total AS
SELECT
p_sejours.no_sejour AS no_sejour,
p_sejours.code_sorti,
p_sejours.date_sortie,
p_sejours.date_groupage,
p_sejours.ghs_id,
MAX(COALESCE(p_factures.date_facture,'20991231')) AS date_facture,
MAX(COALESCE(p_factures.date_expedition,'20991231')) AS date_expedition,
MAX(COALESCE(p_factures.date_solde,'20991231')) AS date_solde,
SUM(COALESCE(p_factures.montant_facture_c,0)) AS montant_facture_c,
SUM(COALESCE(p_factures.montant_facture_h,0)) AS montant_facture_h,
SUM(COALESCE(p_factures.montant_regle_c,0)) AS montant_regle_c,
SUM(COALESCE(p_factures.montant_regle_h,0)) AS montant_regle_h,
SUM(COALESCE(CASE WHEN p_factures.type_facture <> 'P' AND p_factures.type_facture <> 'E' AND p_factures.type_facture <> 'G' THEN 1 ELSE 0 END,0)) AS nb_factures,
SUM(COALESCE(CASE WHEN p_factures.type_facture = '0' THEN 0 ELSE 1 END,0)) AS nb_factures_regularisation,
SUM(COALESCE(p_factures.nb_rejets,0)) AS nb_rejets,
SUM(COALESCE(p_factures.montant_facture_0_c,0)) AS montant_facture_0_c,
SUM(COALESCE(p_factures.montant_facture_0_h,0)) AS montant_facture_0_h,
SUM(COALESCE(p_factures.montant_regle_0_c,0)) AS montant_regle_0_c,
SUM(COALESCE(p_factures.montant_regle_0_h,0)) AS montant_regle_0_h,
MAX(COALESCE(CASE WHEN (p_factures.montant_facture_0_c <> 0 OR p_factures.montant_facture_0_h <> 0) THEN p_factures.date_expedition_0 ELSE '0001-01-01' END,'20991231' )) AS date_expedition_0,
MAX(COALESCE(CASE WHEN p_factures.date_solde_0_c < '2099-12-31' AND p_factures.date_solde_0_c > p_factures.date_solde_0_h THEN p_factures.date_solde_0_c ELSE p_factures.date_solde_0_h END,'20991231' )) AS date_solde_0,
SUM(COALESCE(p_factures.montant_facture_1_c,0)) AS montant_facture_1_c,
SUM(COALESCE(p_factures.montant_facture_1_h,0)) AS montant_facture_1_h,
SUM(COALESCE(p_factures.montant_regle_1_c,0)) AS montant_regle_1_c,
SUM(COALESCE(p_factures.montant_regle_1_h,0)) AS montant_regle_1_h,
MAX(COALESCE(CASE WHEN (p_factures.montant_facture_1_c <> 0 OR p_factures.montant_facture_1_h <> 0) THEN p_factures.date_expedition_1 ELSE '0001-01-01' END,'20991231' )) AS date_expedition_1,
MAX(COALESCE(CASE WHEN p_factures.date_solde_1_c < '2099-12-31' AND p_factures.date_solde_1_c > p_factures.date_solde_1_h THEN p_factures.date_solde_1_c ELSE p_factures.date_solde_1_h END,'20991231' )) AS date_solde_1,
SUM(COALESCE(p_factures.montant_facture_2_c,0)) AS montant_facture_2_c,
SUM(COALESCE(p_factures.montant_facture_2_h,0)) AS montant_facture_2_h,
SUM(COALESCE(p_factures.montant_regle_2_c,0)) AS montant_regle_2_c,
SUM(COALESCE(p_factures.montant_regle_2_h,0)) AS montant_regle_2_h,
MAX(COALESCE(CASE WHEN (p_factures.montant_facture_2_c <> 0 OR p_factures.montant_facture_2_h <> 0) THEN p_factures.date_expedition_2 ELSE '0001-01-01' END,'20991231' )) AS date_expedition_2,
MAX(COALESCE(CASE WHEN p_factures.date_solde_2_c < '2099-12-31' AND p_factures.date_solde_2_c > p_factures.date_solde_2_h THEN p_factures.date_solde_2_c ELSE p_factures.date_solde_2_h END,'20991231' )) AS date_solde_2,
SUM(COALESCE(p_factures.montant_facture_22_c,0)) AS montant_facture_22_c,
SUM(COALESCE(p_factures.montant_facture_22_h,0)) AS montant_facture_22_h,
SUM(COALESCE(p_factures.montant_regle_22_c,0)) AS montant_regle_22_c,
SUM(COALESCE(p_factures.montant_regle_22_h,0)) AS montant_regle_22_h,
MAX(COALESCE(CASE WHEN (p_factures.montant_facture_22_c <> 0 OR p_factures.montant_facture_22_h <> 0) THEN p_factures.date_expedition_22 ELSE '0001-01-01' END,'20991231' )) AS date_expedition_22,
MAX(COALESCE(CASE WHEN p_factures.date_solde_22_c < '2099-12-31' AND p_factures.date_solde_22_c > p_factures.date_solde_22_h THEN p_factures.date_solde_22_c ELSE p_factures.date_solde_22_h END,'20991231' )) AS date_solde_22 ,
SUM(COALESCE(p_factures.montant_comptabilise_c,0)) AS montant_comptabilise_c,
SUM(COALESCE(p_factures.montant_comptabilise_h,0)) AS montant_comptabilise_h,
SUM(COALESCE(p_factures.montant_comptabilise_0_c,0)) AS montant_comptabilise_0_c,
SUM(COALESCE(p_factures.montant_comptabilise_0_h,0)) AS montant_comptabilise_0_h,
SUM(COALESCE(p_factures.montant_comptabilise_1_c,0)) AS montant_comptabilise_1_c,
SUM(COALESCE(p_factures.montant_comptabilise_1_h,0)) AS montant_comptabilise_1_h,
SUM(COALESCE(p_factures.montant_comptabilise_2_c,0)) AS montant_comptabilise_2_c,
SUM(COALESCE(p_factures.montant_comptabilise_2_h,0)) AS montant_comptabilise_2_h,
SUM(COALESCE(p_factures.montant_comptabilise_22_c,0)) AS montant_comptabilise_22_c,
SUM(COALESCE(p_factures.montant_comptabilise_22_h,0)) AS montant_comptabilise_22_h,
SUM(COALESCE(p_factures.montant_comptabilise_budget_global_c,0)) AS montant_comptabilise_budget_global_c,
SUM(COALESCE(p_factures.montant_facture_c_actes_inclus_dans_sejour,0)) AS montant_facture_c_actes_inclus_dans_sejour,
SUM(COALESCE(p_factures.montant_facture_h_actes_inclus_dans_sejour,0)) AS montant_facture_h_actes_inclus_dans_sejour,
0::numeric AS delai_groupage,
0::numeric AS delai_facture,
0::numeric AS delai_expedition,
0::numeric AS delai_solde,
0::numeric AS delai_expedition_0,
0::numeric AS delai_solde_0,
0::numeric AS delai_expedition_1,
0::numeric AS delai_solde_1,
0::numeric AS delai_expedition_2,
0::numeric AS delai_solde_2,
0::numeric AS delai_expedition_22,
0::numeric AS delai_solde_22
FROM activite[PX].p_sejours LEFT JOIN activite[PX].p_factures ON p_sejours.no_sejour = p_factures.no_sejour AND type_facture <> 'P'
GROUP BY 1,2,3,4,5;
UPDATE w_sejours_total
SET date_groupage = date_facture
WHERE (date_groupage IS null OR date_groupage = '20991231' OR date_groupage = '00010101') AND
date_facture <> '2099-12-31';
UPDATE w_sejours_total SET
date_groupage = CASE WHEN date_groupage > '00010101' THEN date_groupage ELSE '20991231' END,
date_facture = CASE WHEN date_facture> '00010101' THEN date_facture ELSE '20991231' END,
date_expedition = CASE WHEN date_expedition > '00010101' THEN date_expedition ELSE '20991231' END,
date_solde = CASE WHEN date_solde > '00010101' THEN date_solde ELSE '20991231' END,
date_expedition_0 = CASE WHEN date_expedition_0 > '00010101' THEN date_expedition_0 ELSE '20991231' END,
date_solde_0 = CASE WHEN date_solde_0 > '00010101' THEN date_solde_0 ELSE '20991231' END,
date_expedition_1 = CASE WHEN date_expedition_1 > '00010101' THEN date_expedition_1 ELSE '20991231' END,
date_solde_1 = CASE WHEN date_solde_1 > '00010101' THEN date_solde_1 ELSE '20991231' END,
date_expedition_2 = CASE WHEN date_expedition_2 > '00010101' THEN date_expedition_2 ELSE '20991231' END,
date_solde_2 = CASE WHEN date_solde_2 > '00010101' THEN date_solde_2 ELSE '20991231' END,
date_expedition_22 = CASE WHEN date_expedition_22 > '00010101' THEN date_expedition_22 ELSE '20991231' END,
date_solde_22 = CASE WHEN date_solde_22 > '00010101' THEN date_solde_22 ELSE '20991231' END;
UPDATE w_sejours_total SET
delai_groupage = CASE WHEN code_sorti = '1' AND date_groupage > date_sortie AND date_groupage < '2099-12-31' AND ghs_id <> 0
THEN date_groupage - date_sortie ELSE 0 END,
delai_facture = CASE WHEN code_sorti = '1' AND date_facture > date_sortie AND date_facture < '2099-12-31' AND date_facture > date_sortie
THEN date_facture - date_sortie ELSE 0 END,
delai_expedition = CASE WHEN code_sorti = '1' AND date_expedition > date_sortie AND date_facture < '2099-12-31' AND date_expedition < '2099-12-31'
THEN date_expedition - date_sortie ELSE 0 END,
delai_solde = CASE WHEN code_sorti = '1' AND date_solde > date_sortie AND date_facture < '2099-12-31' AND date_solde < '2099-12-31'
THEN date_solde - date_sortie ELSE 0 END,
delai_expedition_0 = CASE WHEN code_sorti = '1' AND date_expedition_0 > date_sortie AND date_facture < '2099-12-31' AND date_expedition_0 < '2099-12-31'
THEN date_expedition_0 - date_sortie ELSE 0 END,
delai_solde_0 = CASE WHEN code_sorti = '1'AND date_solde_0 > date_sortie AND date_facture < '2099-12-31' AND date_solde_0 < '2099-12-31'
THEN date_solde_0 - date_sortie ELSE 0 END,
delai_expedition_1 = CASE WHEN code_sorti = '1' AND date_expedition_1 > date_sortie AND date_facture < '2099-12-31' AND date_expedition_1 < '2099-12-31'
THEN date_expedition_1 - date_sortie ELSE 0 END,
delai_solde_1 = CASE WHEN code_sorti = '1' AND date_solde_1 > date_sortie AND date_facture < '2099-12-31' AND date_solde_1 < '2099-12-31'
THEN date_solde_1 - date_sortie ELSE 0 END,
delai_expedition_2 = CASE WHEN code_sorti = '1' AND date_expedition_2 > date_sortie AND date_facture < '2099-12-31' AND date_expedition_2 < '2099-12-31'
THEN date_expedition_2 - date_sortie ELSE 0 END,
delai_solde_2 = CASE WHEN code_sorti = '1' AND date_solde_2 > date_sortie AND date_facture < '2099-12-31' AND date_solde_2 < '2099-12-31'
THEN date_solde_2 - date_sortie ELSE 0 END,
delai_expedition_22 = CASE WHEN code_sorti = '1' AND date_expedition_22 > date_sortie AND date_facture < '2099-12-31' AND date_expedition_22 < '2099-12-31'
THEN date_expedition_22 - date_sortie ELSE 0 END,
delai_solde_22 = CASE WHEN code_sorti = '1' AND date_solde_22 > date_sortie AND date_facture < '2099-12-31' AND date_solde_22 < '2099-12-31'
THEN date_solde_22 - date_sortie ELSE 0 END;
ALTER TABLE w_sejours_total ADD CONSTRAINT w_sejours_total_pkey PRIMARY KEY(no_sejour);
UPDATE activite[PX].p_sejours SET
date_facture = w_sejours_total.date_facture,
date_expedition = w_sejours_total.date_expedition,
date_solde = w_sejours_total.date_solde,
montant_facture_c = w_sejours_total.montant_facture_c,
montant_facture_h = w_sejours_total.montant_facture_h,
montant_regle_c = w_sejours_total.montant_regle_c,
montant_regle_h = w_sejours_total.montant_regle_h,
nb_factures = w_sejours_total.nb_factures,
nb_factures_regularisation = w_sejours_total.nb_factures_regularisation,
nb_factures_rejet = w_sejours_total.nb_rejets,
montant_facture_0_c = w_sejours_total.montant_facture_0_c,
montant_facture_0_h = w_sejours_total.montant_facture_0_h,
montant_regle_0_c = w_sejours_total.montant_regle_0_c,
montant_regle_0_h = w_sejours_total.montant_regle_0_h,
date_expedition_0 = w_sejours_total.date_expedition_0,
date_solde_0 = w_sejours_total.date_solde_0,
montant_facture_1_c = w_sejours_total.montant_facture_1_c,
montant_facture_1_h = w_sejours_total.montant_facture_1_h,
montant_regle_1_c = w_sejours_total.montant_regle_1_c,
montant_regle_1_h = w_sejours_total.montant_regle_1_h,
date_expedition_1 = w_sejours_total.date_expedition_1,
date_solde_1 = w_sejours_total.date_solde_1,
montant_facture_2_c = w_sejours_total.montant_facture_2_c,
montant_facture_2_h = w_sejours_total.montant_facture_2_h,
montant_regle_2_c = w_sejours_total.montant_regle_2_c,
montant_regle_2_h = w_sejours_total.montant_regle_2_h,
date_expedition_2 = w_sejours_total.date_expedition_2,
date_solde_2 = w_sejours_total.date_solde_2,
montant_facture_22_c = w_sejours_total.montant_facture_22_c,
montant_facture_22_h = w_sejours_total.montant_facture_22_h,
montant_regle_22_c = w_sejours_total.montant_regle_22_c,
montant_regle_22_h = w_sejours_total.montant_regle_22_h,
date_expedition_22 = w_sejours_total.date_expedition_22,
date_solde_22 = w_sejours_total.date_solde_22,
montant_comptabilise_c = w_sejours_total.montant_comptabilise_c,
montant_comptabilise_h = w_sejours_total.montant_comptabilise_h,
montant_comptabilise_0_c = w_sejours_total.montant_comptabilise_0_c,
montant_comptabilise_0_h = w_sejours_total.montant_comptabilise_0_h,
montant_comptabilise_1_c = w_sejours_total.montant_comptabilise_1_c,
montant_comptabilise_1_h = w_sejours_total.montant_comptabilise_1_h,
montant_comptabilise_2_c = w_sejours_total.montant_comptabilise_2_c,
montant_comptabilise_2_h = w_sejours_total.montant_comptabilise_2_h,
montant_comptabilise_22_c = w_sejours_total.montant_comptabilise_22_c,
montant_comptabilise_22_h = w_sejours_total.montant_comptabilise_22_h,
montant_comptabilise_budget_global_c = w_sejours_total.montant_comptabilise_budget_global_c,
montant_facture_c_actes_inclus_dans_sejour = w_sejours_total.montant_facture_c_actes_inclus_dans_sejour,
montant_facture_h_actes_inclus_dans_sejour = w_sejours_total.montant_facture_h_actes_inclus_dans_sejour,
delai_groupage = w_sejours_total.delai_groupage,
delai_facture = w_sejours_total.delai_facture,
delai_expedition = w_sejours_total.delai_expedition,
delai_solde = w_sejours_total.delai_solde,
delai_expedition_0 = w_sejours_total.delai_expedition_0,
delai_solde_0 = w_sejours_total.delai_solde_0,
delai_expedition_1 = w_sejours_total.delai_expedition_1,
delai_solde_1 = w_sejours_total.delai_solde_1,
delai_expedition_2 = w_sejours_total.delai_expedition_2,
delai_solde_2 = w_sejours_total.delai_solde_2,
delai_expedition_22 = w_sejours_total.delai_expedition_22,
delai_solde_22 = w_sejours_total.delai_solde_22
FROM w_sejours_total
WHERE w_sejours_total.no_sejour = p_sejours.no_sejour
AND (
p_sejours.date_facture IS DISTINCT FROM w_sejours_total.date_facture OR
p_sejours.date_expedition IS DISTINCT FROM w_sejours_total.date_expedition OR
p_sejours.date_solde IS DISTINCT FROM w_sejours_total.date_solde OR
p_sejours.montant_facture_c IS DISTINCT FROM w_sejours_total.montant_facture_c OR
p_sejours.montant_facture_h IS DISTINCT FROM w_sejours_total.montant_facture_h OR
p_sejours.montant_regle_c IS DISTINCT FROM w_sejours_total.montant_regle_c OR
p_sejours.montant_regle_h IS DISTINCT FROM w_sejours_total.montant_regle_h OR
p_sejours.nb_factures IS DISTINCT FROM w_sejours_total.nb_factures OR
p_sejours.nb_factures_regularisation IS DISTINCT FROM w_sejours_total.nb_factures_regularisation OR
p_sejours.nb_factures_rejet IS DISTINCT FROM w_sejours_total.nb_rejets OR
p_sejours.montant_facture_0_c IS DISTINCT FROM w_sejours_total.montant_facture_0_c OR
p_sejours.montant_facture_0_h IS DISTINCT FROM w_sejours_total.montant_facture_0_h OR
p_sejours.montant_regle_0_c IS DISTINCT FROM w_sejours_total.montant_regle_0_c OR
p_sejours.montant_regle_0_h IS DISTINCT FROM w_sejours_total.montant_regle_0_h OR
p_sejours.date_expedition_0 IS DISTINCT FROM w_sejours_total.date_expedition_0 OR
p_sejours.date_solde_0 IS DISTINCT FROM w_sejours_total.date_solde_0 OR
p_sejours.montant_facture_1_c IS DISTINCT FROM w_sejours_total.montant_facture_1_c OR
p_sejours.montant_facture_1_h IS DISTINCT FROM w_sejours_total.montant_facture_1_h OR
p_sejours.montant_regle_1_c IS DISTINCT FROM w_sejours_total.montant_regle_1_c OR
p_sejours.montant_regle_1_h IS DISTINCT FROM w_sejours_total.montant_regle_1_h OR
p_sejours.date_expedition_1 IS DISTINCT FROM w_sejours_total.date_expedition_1 OR
p_sejours.date_solde_1 IS DISTINCT FROM w_sejours_total.date_solde_1 OR
p_sejours.montant_facture_2_c IS DISTINCT FROM w_sejours_total.montant_facture_2_c OR
p_sejours.montant_facture_2_h IS DISTINCT FROM w_sejours_total.montant_facture_2_h OR
p_sejours.montant_regle_2_c IS DISTINCT FROM w_sejours_total.montant_regle_2_c OR
p_sejours.montant_regle_2_h IS DISTINCT FROM w_sejours_total.montant_regle_2_h OR
p_sejours.date_expedition_2 IS DISTINCT FROM w_sejours_total.date_expedition_2 OR
p_sejours.date_solde_2 IS DISTINCT FROM w_sejours_total.date_solde_2 OR
p_sejours.montant_facture_22_c IS DISTINCT FROM w_sejours_total.montant_facture_22_c OR
p_sejours.montant_facture_22_h IS DISTINCT FROM w_sejours_total.montant_facture_22_h OR
p_sejours.montant_regle_22_c IS DISTINCT FROM w_sejours_total.montant_regle_22_c OR
p_sejours.montant_regle_22_h IS DISTINCT FROM w_sejours_total.montant_regle_22_h OR
p_sejours.date_expedition_22 IS DISTINCT FROM w_sejours_total.date_expedition_22 OR
p_sejours.date_solde_22 IS DISTINCT FROM w_sejours_total.date_solde_22 OR
p_sejours.montant_comptabilise_c IS DISTINCT FROM w_sejours_total.montant_comptabilise_c OR
p_sejours.montant_comptabilise_h IS DISTINCT FROM w_sejours_total.montant_comptabilise_h OR
p_sejours.montant_comptabilise_0_c IS DISTINCT FROM w_sejours_total.montant_comptabilise_0_c OR
p_sejours.montant_comptabilise_0_h IS DISTINCT FROM w_sejours_total.montant_comptabilise_0_h OR
p_sejours.montant_comptabilise_1_c IS DISTINCT FROM w_sejours_total.montant_comptabilise_1_c OR
p_sejours.montant_comptabilise_1_h IS DISTINCT FROM w_sejours_total.montant_comptabilise_1_h OR
p_sejours.montant_comptabilise_2_c IS DISTINCT FROM w_sejours_total.montant_comptabilise_2_c OR
p_sejours.montant_comptabilise_2_h IS DISTINCT FROM w_sejours_total.montant_comptabilise_2_h OR
p_sejours.montant_comptabilise_22_c IS DISTINCT FROM w_sejours_total.montant_comptabilise_22_c OR
p_sejours.montant_comptabilise_22_h IS DISTINCT FROM w_sejours_total.montant_comptabilise_22_h OR
p_sejours.montant_comptabilise_budget_global_c IS DISTINCT FROM w_sejours_total.montant_comptabilise_budget_global_c OR
p_sejours.montant_facture_c_actes_inclus_dans_sejour IS DISTINCT FROM w_sejours_total.montant_facture_c_actes_inclus_dans_sejour OR
p_sejours.montant_facture_h_actes_inclus_dans_sejour IS DISTINCT FROM w_sejours_total.montant_facture_h_actes_inclus_dans_sejour OR
p_sejours.delai_groupage IS DISTINCT FROM w_sejours_total.delai_groupage OR
p_sejours.delai_facture IS DISTINCT FROM w_sejours_total.delai_facture OR
p_sejours.delai_expedition IS DISTINCT FROM w_sejours_total.delai_expedition OR
p_sejours.delai_solde IS DISTINCT FROM w_sejours_total.delai_solde OR
p_sejours.delai_expedition_0 IS DISTINCT FROM w_sejours_total.delai_expedition_0 OR
p_sejours.delai_solde_0 IS DISTINCT FROM w_sejours_total.delai_solde_0 OR
p_sejours.delai_expedition_1 IS DISTINCT FROM w_sejours_total.delai_expedition_1 OR
p_sejours.delai_solde_1 IS DISTINCT FROM w_sejours_total.delai_solde_1 OR
p_sejours.delai_expedition_2 IS DISTINCT FROM w_sejours_total.delai_expedition_2 OR
p_sejours.delai_solde_2 IS DISTINCT FROM w_sejours_total.delai_solde_2 OR
p_sejours.delai_expedition_22 IS DISTINCT FROM w_sejours_total.delai_expedition_22 OR
p_sejours.delai_solde_22 IS DISTINCT FROM w_sejours_total.delai_solde_22
);
]]></sqlcmd>
</NODE>
<NODE label="Réaffectation des règlements si AMO = AMC">
<sqlcmd><![CDATA[
INSERT INTO activite[PX].p_factures_soldes_c(
facture_id,
no_facture,
date_comptable,
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
p_factures_soldes_c.facture_id,
p_factures_soldes_c.no_facture,
MAX(date_comptable) AS date_comptable,
p_factures_soldes_c.prestation_id,
p_factures_soldes_c.rubrique_comptabilisee_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 AS montant_regle,
0::numeric AS montant_regle_0,
SUM(montant_comptabilise_1)-SUM(montant_regle_1),
SUM(montant_comptabilise_2)-SUM(montant_regle_2),
0::numeric AS montant_regle_22,
'1' AS od_non_comptabilise
FROM activite[PX].p_factures_soldes_c
JOIN activite[PX].p_factures ON p_factures_soldes_c.no_facture = p_factures.no_facture
JOIN activite[PX].t_tiers_payant t_tiers_payant_1 ON tiers_payant_1_id = t_tiers_payant_1.oid
JOIN activite[PX].t_tiers_payant t_tiers_payant_2 ON tiers_payant_2_id = t_tiers_payant_2.oid
WHERE t_tiers_payant_1.code = t_tiers_payant_2.code
GROUP BY 1,2,4,5
HAVING SUM(montant_comptabilise_1)+SUM(montant_comptabilise_2)=SUM(montant_regle_1)+SUM(montant_regle_2) AND
SUM(montant_comptabilise_1) <> SUM(montant_regle_1)
;
INSERT INTO activite[PX].p_factures_soldes_h(
facture_id,
no_facture,
date_comptable,
prestation_id,
rubrique_comptabilisee_id,
medecin_comptabilise_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
p_factures_soldes_h.facture_id,
p_factures_soldes_h.no_facture,
MAX(date_comptable) AS date_comptable,
p_factures_soldes_h.prestation_id,
p_factures_soldes_h.rubrique_comptabilisee_id,
p_factures_soldes_h.medecin_comptabilise_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 AS montant_regle,
0::numeric AS montant_regle_0,
SUM(montant_comptabilise_1)-SUM(montant_regle_1),
SUM(montant_comptabilise_2)-SUM(montant_regle_2),
0::numeric AS montant_regle_22,
'1' AS od_non_comptabilise
FROM activite[PX].p_factures_soldes_h
JOIN activite[PX].p_factures ON p_factures_soldes_h.no_facture = p_factures.no_facture
JOIN activite[PX].t_tiers_payant t_tiers_payant_1 ON tiers_payant_1_id = t_tiers_payant_1.oid
JOIN activite[PX].t_tiers_payant t_tiers_payant_2 ON tiers_payant_2_id = t_tiers_payant_2.oid
WHERE t_tiers_payant_1.code = t_tiers_payant_2.code
GROUP BY 1,2,4,5,6
HAVING SUM(montant_comptabilise_1)+SUM(montant_comptabilise_2)=SUM(montant_regle_1)+SUM(montant_regle_2) AND
SUM(montant_comptabilise_1) <> SUM(montant_regle_1)
;
]]></sqlcmd>
</NODE>
<NODE label="Dépassements honoraires">
<NODE label="Report du paramétrage des médecins">
<condition><![CDATA[
"[PX]" != ""
]]></condition>
<sqlcmd><![CDATA[
-- Report du paramétrage des médecins depuis le schéma activite sur le schéma activite du prestataire dans le cas d'une FUSION
UPDATE activite[PX].t_medecins_administratifs AS t_medecins_administratifs_prestataire
SET
KIWEE_SIGEMS_HONPATCPT = t_medecins_administratifs_activite.KIWEE_SIGEMS_HONPATCPT,
KIWEE_SIGEMS_HONPATCPTDEP = t_medecins_administratifs_activite.KIWEE_SIGEMS_HONPATCPTDEP
FROM activite.t_medecins_administratifs AS t_medecins_administratifs_activite
WHERE UPPER('[PX]') || '_' || t_medecins_administratifs_prestataire.code_original = t_medecins_administratifs_activite.code_original
;
]]></sqlcmd>
</NODE>
<NODE label="Suppression des dépassements honoraires">
<condition><![CDATA[
SELECT count(*) > 0
FROM activite[PX].t_medecins_administratifs
WHERE KIWEE_SIGEMS_HONPATCPT = '0' OR
KIWEE_SIGEMS_HONPATCPTDEP = '0' ;
]]></condition>
<sqlcmd><![CDATA[
-- Lancement de la fonction depuis le schéma activite du prestataire
-- Ceci est nécessaire pour réaliser les modifications sur les bonnes tables dans le cas d'une FUSION
SELECT activite[PX].cti_kiwee_sigems_honpatcpt()
;
]]></sqlcmd>
</NODE>
</NODE>
<NODE label="Tables répliquées">
<condition><![CDATA[
"[PX]" == ""
]]></condition>
<sqlcmd><![CDATA[
]]></sqlcmd>
</NODE>
</NODE>
</ROOT>