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.
 
 

6895 lines
274 KiB

<?xml version="1.0" encoding="ISO-8859-1"?>
<ROOT>
<NODE name="INIT" label="INITIALISATIONS">
<NODE label="Identification des séjours">
<sqlcmd><![CDATA[
DROP TABLE IF EXISTS w_PERIODE;
CREATE TEMP TABLE w_PERIODE AS
SELECT date(MAX(HO_DDEB)) AS now_cerner
FROM prod_cerner.HOSPITALISATION;
DROP TABLE IF EXISTS w_DEFAULT;
CREATE TEMP TABLE w_DEFAULT AS
SELECT
(SELECT oid FROM activite[PX].t_tiers_payant WHERE code_original = '*PATIENT') AS tiers_payant_0_id,
(SELECT oid FROM activite[PX].t_tiers_payant WHERE code_original = '*MUTDIV') AS tiers_payant_2_id
;
DROP TABLE IF EXISTS w_PASSAGE_ACTES;
CREATE TEMP TABLE w_PASSAGE_ACTES AS
SELECT NGAP_HONUM AS ACTE_HONUM,
NGAP_SEANCE AS ACTE_SEANCE,
SEA_ID AS ACTE_SEAID,
date(NGAP_DATE) AS ACTE_DATE,
date(NGAP_DATE) + (NGAP_HEURE - date(NGAP_HEURE)) AS ACTE_HEURE,
NGAP_UFXCODE AS ACTE_UFXCODE
FROM prod_cerner.PASSAGE_NGAP
JOIN prod_cerner.HOSPITALISATION ON NGAP_HONUM = HO_NUM
JOIN prod_cerner.REGROUPEMENT ON HO_RECODE = RE_CODE AND RE_TYPE NOT IN ('H')
;
INSERT INTO w_PASSAGE_ACTES
SELECT CDAM_HONUM AS ACTE_HONUM,
CDAM_SEANCE AS ACTE_SEANCE,
CDAM_SEAID AS ACTE_SEAID,
date(CDAM_DATE) AS ACTE_DATE,
date(CDAM_DATE) + (CDAM_HEURE - date(CDAM_HEURE)) AS ACTE_HEURE,
CDAM_UFXCODE AS ACTE_UFXCODE
FROM prod_cerner.PASSAGE_CDAM
JOIN prod_cerner.HOSPITALISATION ON CDAM_HONUM = HO_NUM
JOIN prod_cerner.REGROUPEMENT ON HO_RECODE = RE_CODE AND RE_TYPE NOT IN ('H')
;
UPDATE w_PASSAGE_ACTES
SET ACTE_UFXCODE = SEA_UFCODE
FROM prod_cerner.PASSAGE
WHERE ACTE_HONUM = SEA_HONUM AND SEA_ID = ACTE_SEAID AND
SEA_UFCODE = 'CS21' AND ACTE_UFXCODE = 'UR21'
;
UPDATE w_PASSAGE_ACTES
SET ACTE_UFXCODE = SEA_UFCODE
FROM prod_cerner.PASSAGE
WHERE ACTE_HONUM = SEA_HONUM AND SEA_ID = ACTE_SEAID AND
SEA_UFCODE = 'UR21' AND ACTE_UFXCODE = 'CS21'
;
DROP TABLE IF EXISTS w_PASSAGE_ACTES_SEANCE;
CREATE TEMP TABLE w_PASSAGE_ACTES_SEANCE AS
SELECT ACTE_HONUM,
ACTE_SEAID,
(MAX(ARRAY[ACTE_HEURE::text,ACTE_UFXCODE]))[2] AS ACTE_UFXCODE,
MIN(ACTE_HEURE) AS ACTE_HEURE_DEB,
MAX(ACTE_HEURE)+ interval '59 seconds' AS ACTE_HEURE_FIN
FROM w_PASSAGE_ACTES
GROUP BY 1,2
;
CREATE INDEX w_PASSAGE_ACTES_SEANCE_i2
ON w_PASSAGE_ACTES_SEANCE
USING btree
(ACTE_SEAID);
DROP TABLE IF EXISTS w_PASSAGE;
CREATE TEMP TABLE w_PASSAGE AS
SELECT
SEA_HONUM,
SEA_SEANCE,
MIN(SEA_ID) AS SEA_ID,
date(MIN(SEA_DATE)) AS SEA_DATE,
date(MIN(SEA_DATE)) AS SEA_DATE_FIN,
MIN(SEA_DATE + (SEA_HEURE - date(SEA_HEURE))) AS SEA_HEURE,
MIN(SEA_DATE + (SEA_HEURE - date(SEA_HEURE))) +interval '59 seconds' AS SEA_HEURE_FIN,
MIN(SEA_INCODE) AS SEA_INCODE,
MIN(SEA_UFCODE) AS SEA_UFCODE,
MIN(SEA_UFCODE) AS SEA_UMCODE,
MIN(SEA_UFCODE) AS SEA_UFCODE_REA
FROM prod_cerner.HOSPITALISATION
JOIN prod_cerner.REGROUPEMENT ON HO_RECODE = RE_CODE
JOIN prod_cerner.PASSAGE ON SEA_HONUM = HO_NUM AND RE_TYPE NOT IN ('H')
GROUP BY 1,2;
CREATE INDEX w_PASSAGE_i1
ON w_PASSAGE
USING btree
(SEA_HONUM);
CREATE INDEX w_PASSAGE_i2
ON w_PASSAGE
USING btree
(SEA_ID);
UPDATE w_PASSAGE
SET SEA_UFCODE_REA = ACTE_UFXCODE,
SEA_DATE_FIN = date(ACTE_HEURE_FIN),
SEA_HEURE_FIN = ACTE_HEURE_FIN
FROM w_PASSAGE_ACTES_SEANCE
WHERE ACTE_SEAID = w_PASSAGE.SEA_ID AND
(
ACTE_UFXCODE <> SEA_UFCODE_REA OR
SEA_HEURE_FIN <> ACTE_HEURE_FIN
)
;
ANALYSE w_PASSAGE;
DROP TABLE IF EXISTS w_HOSPITALISATION_SELECT;
CREATE TEMP TABLE w_HOSPITALISATION_SELECT AS
SELECT HO_NUM,
HO_MANUMDOS,
MA_SEXE,
''::text AS HO_VNCODE,
HO_RECODE,
date(COALESCE(SEA_DATE,HO_DDEB)) AS HO_DDEB,
date(COALESCE(SEA_DATE,HO_DFIN)) AS HO_DFIN,
RE_TYPE,
CASE
WHEN RE_TYPE IN ('H') AND HO_DDEB >= '[ENV_ADM_ANNEEDEBUT]0101' THEN '1'
WHEN RE_TYPE IN ('H') AND HO_DFIN >= '[ENV_ADM_ANNEEDEBUT]0101' THEN '1'
WHEN RE_TYPE IN ('H') AND HO_DFIN IS NULL THEN '1'
WHEN RE_TYPE NOT IN ('H') AND SEA_DATE >= '[ENV_ADM_ANNEEDEBUT]0101' THEN '1'
ELSE '0' END AS HO_OK,
COALESCE(trim(SEA_SEANCE),'') AS HO_SEANCE,
date(CASE WHEN RE_TYPE IN ('H') THEN HO_DDEB ELSE COALESCE(SEA_DATE,HO_DDEB) END) AS HO_DDEBS,
(SEA_HEURE - date(SEA_HEURE))::time without time zone AS HO_HDEBS,
date(CASE WHEN RE_TYPE IN ('H') THEN HO_DFIN ELSE COALESCE(SEA_DATE,HO_DFIN) END) AS HO_DFINS,
(SEA_HEURE - date(SEA_HEURE))::time without time zone AS HO_HFINS,
HO_NUM::text AS HO_NUMSEJ,
'1'::text AS sejour_a_creer,
HO_PREENT,
'8'::text AS mode_entree,
''::text AS provenance,
'0'::text AS urgence,
'8'::text AS mode_sortie,
''::text AS destination,
COALESCE(SEA_INCODE,'') AS HO_INCODE,
COALESCE(SEA_UFCODE_REA,'') AS HO_UFCODE_REA,
COALESCE(SEA_UFCODE,'') AS HO_UFCODE,
COALESCE(SEA_UMCODE,'') AS HO_UMCODE,
''::text AS HO_UFHEBER,
''::text AS HO_SACODE,
''::text AS HO_LICODE,
''::text AS HO_ETCODE_CTI,
''::text AS HO_LICODE_CTI,
''::text AS HO_ELCODE_CTI,
''::text AS mode_traitement_code,
''::text AS dmt_code,
0::bigint AS mode_traitement_id,
0::bigint AS tiers_payant_1_id,
w_DEFAULT.tiers_payant_2_id,
0::bigint AS tiers_payant_22_id,
w_DEFAULT.tiers_payant_0_id,
0::bigint AS code_postal_id,
0::bigint AS medecin_sejour_id,
0::bigint AS lieu_sortie_id,
CASE WHEN HO_VALID IS DISTINCT FROM 'X' AND HO_VALID IS DISTINCT FROM 'U' THEN '0' ELSE '9' END::text AS type_sejour_force,
0::bigint AS sejour_id,
'0'::text AS sans_sejour
FROM prod_cerner.HOSPITALISATION
JOIN prod_cerner.MALADE ON HO_MANUMDOS = MA_NUMDOS
JOIN prod_cerner.REGROUPEMENT ON HO_RECODE = RE_CODE
LEFT JOIN w_PASSAGE ON SEA_HONUM = HO_NUM AND RE_TYPE NOT IN ('H')
JOIN w_DEFAULT ON 1=1
WHERE (RE_TYPE IN ('H') OR SEA_HONUM IS NOT NULL) AND
COALESCE(HO_PREENT,'') = ''
;
UPDATE w_HOSPITALISATION_SELECT SET
HO_DFIN = HO_DDEB,
HO_DFINS = HO_DDEBS,
HO_HFINS = HO_HDEBS
WHERE RE_TYPE NOT IN ('H') AND HO_DFIN IS NULL;
CREATE INDEX w_HOSPITALISATION_SELECT_i1
ON w_HOSPITALISATION_SELECT
USING btree
(HO_NUM);
CREATE INDEX w_HOSPITALISATION_SELECT_i2
ON w_HOSPITALISATION_SELECT
USING btree
(HO_MANUMDOS);
CREATE INDEX w_HOSPITALISATION_SELECT_i_HO_NUMSEJ
ON w_HOSPITALISATION_SELECT
USING btree
(HO_NUMSEJ);
UPDATE w_HOSPITALISATION_SELECT
SET HO_OK = '0'
WHERE HO_OK = '1' AND
HO_DDEB > (SELECT now_cerner FROM w_PERIODE)
;
UPDATE w_HOSPITALISATION_SELECT
SET HO_OK = '0'
WHERE HO_OK = '1' AND
RE_TYPE = 'H' AND
HO_NUM NOT IN (SELECT MH_HONUM FROM w_MOUV_HOSPI_source)
;
UPDATE w_HOSPITALISATION_SELECT
SET HO_OK = '1'
WHERE HO_OK <> '1' AND
HO_NUM IN (SELECT FAC_HONUM FROM prod_cerner.FACTURE WHERE FAC_DATE >= '[ENV_ADM_ANNEEDEBUT]0101' OR FAC_EXER >= [ENV_ADM_ANNEEDEBUT])
;
UPDATE w_HOSPITALISATION_SELECT
SET HO_OK = '1'
WHERE HO_OK <> '1' AND
HO_NUM IN (SELECT MC_HONUM FROM prod_cerner.MOUV_COMPTA WHERE MC_DATECR >= '[ENV_ADM_ANNEEDEBUT]0101' OR MC_EXER >= [ENV_ADM_ANNEEDEBUT])
;
UPDATE w_HOSPITALISATION_SELECT
SET HO_OK = '1'
WHERE HO_OK <> '1' AND
HO_NUM IN (SELECT HO_NUM FROM w_HOSPITALISATION_SELECT WHERE HO_OK = '1')
;
-- Factures et règlements sans référence de séjour
DROP TABLE IF EXISTS w_FACTURE_sans_sejour;
CREATE TEMP TABLE w_FACTURE_sans_sejour AS
SELECT FAC_NUM,
FAC_HONUM,
FAD_SEANCE AS FAC_SEANCE,
MIN(FAD_DEB) AS FAC_DDEB,
MAX(FAD_FIN) AS FAC_DFIN,
0::numeric AS FAC_MANUMDOS
FROM prod_cerner.FACTURE_DET
JOIN prod_cerner.FACTURE ON FAD_NUM = FAC_NUM
LEFT JOIN w_HOSPITALISATION_SELECT ON
FAC_HONUM = HO_NUM AND
FAD_SEANCE = HO_SEANCE
WHERE (FAC_DATE >= '[ENV_ADM_ANNEEDEBUT]0101' OR FAC_EXER >= [ENV_ADM_ANNEEDEBUT]) AND
HO_NUM IS NULL
GROUP BY 1,2,3
;
UPDATE prod_cerner.MOUV_COMPTA
SET MC_HONUM = 999999999
WHERE MC_HONUM = 0 AND MC_MANUMDOS = 0 AND
(MC_COMPTE LIKE '411%' OR MC_COMPTE LIKE '412%' OR MC_COMPTE LIKE '413%' OR MC_COMPTE LIKE '414%' OR MC_COMPTE LIKE '452%' OR MC_COMPTE LIKE '467%')
;
INSERT INTO w_FACTURE_sans_sejour
SELECT MC_NUMFAC_LET AS FAC_NUM,
MC_HONUM AS FAC_HONUM,
''::text AS FAD_SEANCE,
MIN(MC_DATECR) AS FAC_DDEB,
MAX(MC_DATECR) AS FAC_DFIN,
0::numeric AS FAC_MANUMDOS
FROM prod_cerner.MOUV_COMPTA
LEFT JOIN w_HOSPITALISATION_SELECT ON MC_HONUM = HO_NUM
WHERE (MC_DATECR >= '[ENV_ADM_ANNEEDEBUT]0101' OR MC_EXER >= [ENV_ADM_ANNEEDEBUT]) AND
(MC_COMPTE LIKE '411%' OR MC_COMPTE LIKE '412%' OR MC_COMPTE LIKE '413%' OR MC_COMPTE LIKE '414%' OR MC_COMPTE LIKE '452%' OR MC_COMPTE LIKE '467%') AND
HO_NUM IS NULL
GROUP BY 1,2
HAVING SUM(CASE WHEN MC_SENS = 'C' THEN MC_MON ELSE 0-MC_MON END) <> 0
;
UPDATE w_FACTURE_sans_sejour
SET FAC_MANUMDOS = MC_MANUMDOS
FROM prod_cerner.MOUV_COMPTA
WHERE MC_NUMV = FAC_NUM AND
MC_HONUM = FAC_HONUM AND
FAC_MANUMDOS = 0
;
INSERT INTO w_HOSPITALISATION_SELECT
SELECT FAC_HONUM,
MAX(FAC_MANUMDOS),
MAX(COALESCE(MA_SEXE,'1')),
''::text AS HO_VNCODE,
MIN(COALESCE(HOSPITALISATION.HO_RECODE,''::text)) AS HO_RECODE,
MIN(date(FAC_DDEB)) AS HO_DDEB,
MAX(date(FAC_DFIN)) AS HO_DFIN,
MAX(COALESCE(REGROUPEMENT.RE_TYPE,''::text)) AS RE_TYPE,
'1'::text AS HO_OK,
FAC_SEANCE AS HO_SEANCE,
MIN(date(FAC_DDEB)) AS HO_DDEBS,
'11:00:00' AS HO_HDEBS,
MAX(date(FAC_DFIN)) AS HO_DFINS,
'11:00:00' AS HO_HFINS,
MAX(FAC_HONUM) AS HO_NUMSEJ,
'1'::text AS sejour_a_creer,
''::text AS HO_PREENT,
'8'::text AS mode_entree,
''::text AS provenance,
'0'::text AS urgence,
'8'::text AS mode_sortie,
''::text AS destination,
''::text AS HO_INCODE,
''::text AS HO_UFCODE_REA,
''::text AS HO_UFCODE,
''::text AS HO_UMCODE,
''::text AS HO_UFHEBER,
''::text AS HO_SACODE,
''::text AS HO_LICODE,
''::text AS HO_ETCODE_CTI,
''::text AS HO_LICODE_CTI,
''::text AS HO_ELCODE_CTI,
''::text AS mode_traitement_code,
''::text AS dmt_code,
0::bigint AS mode_traitement_id,
0::bigint AS tiers_payant_1_id,
MAX(w_DEFAULT.tiers_payant_2_id),
0::bigint AS tiers_payant_22_id,
MAX(w_DEFAULT.tiers_payant_0_id),
0::bigint AS code_postal_id,
0::bigint AS medecin_sejour_id,
0::bigint AS lieu_sortie_id,
MAX(CASE WHEN FAC_SEANCE = '' OR FAC_HONUM IN (SELECT HO_NUM FROM w_HOSPITALISATION_SELECT ) THEN '0' ELSE '9' END) AS type_sejour_force,
0::bigint AS sejour_id,
'1'::text AS sans_sejour
FROM w_FACTURE_sans_sejour
LEFT JOIN prod_cerner.MALADE ON FAC_MANUMDOS = MA_NUMDOS
LEFT JOIN prod_cerner.HOSPITALISATION ON FAC_HONUM = HOSPITALISATION.HO_NUM
LEFT JOIN prod_cerner.REGROUPEMENT ON HO_RECODE = RE_CODE
JOIN w_DEFAULT ON 1=1
GROUP BY
FAC_HONUM,
FAC_SEANCE
;
-- Supprimer les dossiers à ne pas récupérer
DELETE FROM w_HOSPITALISATION_SELECT
WHERE HO_OK <> '1'
;
-- Numéro de séjour avec séance si séances multiples
UPDATE w_HOSPITALISATION_SELECT
SET HO_NUMSEJ = HO_NUMSEJ::text || '.' || to_char(HO_DFINS,'YYMMDD')
WHERE HO_NUMSEJ IN
(
SELECT HO_NUMSEJ
FROM w_HOSPITALISATION_SELECT
WHERE RE_TYPE NOT IN ('H')
GROUP BY 1
HAVING count(DISTINCT HO_DFINS) > 1
)
;
UPDATE w_HOSPITALISATION_SELECT SET
sejour_a_creer = CASE WHEN w_HOSPITALISATION_SELECT.HO_SEANCE = subview.HO_SEANCE THEN '1' ELSE '0' END,
HO_HDEBS = subview.HO_HDEBS,
HO_HFINS = subview.HO_HFINS
FROM
(
SELECT HO_NUMSEJ, (MIN(Array[sans_sejour,HO_SEANCE::text]))[2] AS HO_SEANCE,
MIN(HO_HDEBS) AS HO_HDEBS,
MAX(HO_HFINS) AS HO_HFINS
FROM w_HOSPITALISATION_SELECT
GROUP BY 1
HAVING count(*) > 1
) subview
WHERE w_HOSPITALISATION_SELECT.HO_NUMSEJ = subview.HO_NUMSEJ
;
ANALYSE w_HOSPITALISATION_SELECT;
UPDATE w_HOSPITALISATION_SELECT
SET HO_NUMSEJ = w_HOSPITALISATION_SELECT.HO_NUMSEJ || '.' || nb
FROM
(
SELECT HO_NUMSEJ, count(*) AS nb, MAX(CTID) AS from_CTID
FROM w_HOSPITALISATION_SELECT
WHERE sejour_a_creer = '1'
GROUP BY 1
HAVING count(*) > 1
) subview
WHERE w_HOSPITALISATION_SELECT.HO_NUMSEJ = subview.HO_NUMSEJ AND
w_HOSPITALISATION_SELECT.CTID = from_CTID
;
DELETE FROM w_HOSPITALISATION_SELECT WHERE HO_NUMSEJ IS NULL
;
]]></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
MA_NUMDOS,
to_char(MA_NUMDOS,'FM0000000000') AS no_patient,
MAX(MA_NOM1) AS MA_NOM1,
MAX(MA_PRENOM) AS MA_PRENOM,
MAX(MA_NOM2) AS MA_NOM2,
MAX(MA_DATENAI) AS MA_DATENAI,
MAX(MA_SEXE) AS MA_SEXE
FROM prod_cerner.MALADE
WHERE MA_NUMDOS IN (SELECT HO_MANUMDOS FROM w_HOSPITALISATION_SELECT WHERE HO_OK = '1')
GROUP BY 1,2;
CREATE INDEX w_PATIENT_i1
ON w_PATIENT
USING btree
(MA_NUMDOS);
INSERT INTO w_PATIENT
SELECT HO_MANUMDOS,
to_char(HO_MANUMDOS,'FM0000000000') AS no_patient,
'Patient ' || HO_MANUMDOS AS MA_NOM1,
'' AS MA_PRENOM,
'' AS MA_NOM2,
'19620418' AS MA_DATENAI,
'1' AS MA_SEXE
FROM w_HOSPITALISATION_SELECT
LEFT JOIN w_PATIENT ON HO_MANUMDOS = MA_NUMDOS
WHERE MA_NUMDOS IS NULL
GROUP BY HO_MANUMDOS
;
CREATE INDEX w_PATIENT_i2
ON w_PATIENT
USING btree
(no_patient);
UPDATE activite[PX].p_patients
SET nom = MA_NOM1,
nom_naissance = MA_NOM2,
prenom = MA_PRENOM,
date_naissance = MA_DATENAI,
code_sexe = MA_SEXE
FROM w_PATIENT
WHERE p_patients.no_patient = w_PATIENT.no_patient
AND (
p_patients.nom IS DISTINCT FROM MA_NOM1 OR
p_patients.prenom IS DISTINCT FROM MA_PRENOM OR
nom_naissance IS DISTINCT FROM MA_NOM2 OR
p_patients.date_naissance IS DISTINCT FROM MA_DATENAI OR
p_patients.code_sexe IS DISTINCT FROM MA_SEXE
);
INSERT INTO activite[PX].p_patients(finess, no_patient, nom, prenom, nom_naissance, date_naissance, code_sexe)
SELECT '', w_PATIENT.no_patient, MA_NOM1, MA_PRENOM, MA_NOM2, MA_DATENAI, MA_SEXE
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;
]]></sqlcmd>
</NODE>
<NODE label="Séjours">
<sqlcmd><![CDATA[
-- Tiers payant
DROP SEQUENCE IF EXISTS w_ADRESSE_tiers_seq;
CREATE TEMP SEQUENCE w_ADRESSE_tiers_seq;
DROP TABLE IF EXISTS w_ADRESSE_tiers;
CREATE TEMP TABLE w_ADRESSE_tiers AS
SELECT
nextval('w_ADRESSE_tiers_seq'::regclass) AS sequence,
subview.*
FROM
(
SELECT
AD_MANUMDOS,
CASE WHEN AD_PYTYPE IN ('1','2') THEN '1' ELSE '2' END AS AD_PYTYPE_CTI,
AD_PYTYPE,
AD_PYCODE,
('C'||AD_PYTYPE||AD_PYCODE) AD_PYCODE_CTI,
date(COALESCE(AD_HDEB,'00010101')) AS AD_HDEB,
'20991231'::date AS AD_DFIN,
AD_CPT
FROM prod_cerner.ADRESSE
WHERE AD_TYP = 'T'
ORDER BY 1,2,6,8
) subview
;
UPDATE w_ADRESSE_tiers
SET AD_DFIN = w_ADRESSE_tiers_a.AD_HDEB - interval '1 day'
FROM w_ADRESSE_tiers w_ADRESSE_tiers_a
WHERE w_ADRESSE_tiers.AD_MANUMDOS = w_ADRESSE_tiers_a.AD_MANUMDOS AND
w_ADRESSE_tiers.AD_PYTYPE_CTI = w_ADRESSE_tiers_a.AD_PYTYPE_CTI AND
w_ADRESSE_tiers.sequence = w_ADRESSE_tiers_a.sequence - 1
;
UPDATE w_ADRESSE_tiers
SET AD_HDEB = '00010101'
WHERE sequence = 1 AND
w_ADRESSE_tiers.AD_HDEB <> '00010101';
UPDATE w_ADRESSE_tiers
SET AD_HDEB = '00010101'
FROM w_ADRESSE_tiers w_ADRESSE_tiers_b
WHERE w_ADRESSE_tiers.sequence = w_ADRESSE_tiers_b.sequence + 1 AND
(
w_ADRESSE_tiers.AD_MANUMDOS <> w_ADRESSE_tiers_b.AD_MANUMDOS OR
w_ADRESSE_tiers.AD_PYTYPE_CTI <> w_ADRESSE_tiers_b.AD_PYTYPE_CTI
) AND
w_ADRESSE_tiers.AD_HDEB <> '00010101'
;
CREATE INDEX w_ADRESSE_tiers_i1
ON w_ADRESSE_tiers
USING btree
(AD_MANUMDOS);
CREATE INDEX w_ADRESSE_tiers_i2
ON w_ADRESSE_tiers
USING btree
(AD_PYCODE_CTI);
UPDATE w_HOSPITALISATION_SELECT
SET tiers_payant_1_id = t_tiers_payant.oid
FROM w_ADRESSE_tiers
JOIN activite[PX].t_tiers_payant ON AD_PYCODE_CTI = t_tiers_payant.code_original
WHERE w_HOSPITALISATION_SELECT.HO_MANUMDOS = w_ADRESSE_tiers.AD_MANUMDOS AND
AD_PYTYPE_CTI = '1' AND
HO_DDEB BETWEEN AD_HDEB AND AD_DFIN
;
UPDATE w_HOSPITALISATION_SELECT
SET tiers_payant_2_id = t_tiers_payant.oid
FROM w_ADRESSE_tiers
JOIN activite[PX].t_tiers_payant ON AD_PYCODE_CTI = t_tiers_payant.code_original
WHERE w_HOSPITALISATION_SELECT.HO_MANUMDOS = w_ADRESSE_tiers.AD_MANUMDOS AND
AD_PYTYPE_CTI = '2' AND
HO_DDEB BETWEEN AD_HDEB AND AD_DFIN
;
-- Mouvement de sortie
DROP TABLE IF EXISTS w_HOSPITALISATION_MOUV_SORTIE;
CREATE TEMP TABLE w_HOSPITALISATION_MOUV_SORTIE AS
SELECT MH_HONUM,
(MIN(ARRAY[lpad(MH_DER,1,' ')||(MH_DDEB + (MH_HDEB - date(MH_HDEB)))::text, (MH_HDEB - date(MH_HDEB))::text]))[2]::time without time zone AS MH_HDEB,
(MAX(ARRAY[lpad(MH_DER,1,' ')||(MH_DDEB + (MH_HDEB - date(MH_HDEB)))::text, (MH_HFIN - date(MH_HFIN))::text]))[2]::time without time zone AS MH_HFIN,
(MAX(ARRAY[lpad(MH_DER,1,' ')||(MH_DDEB + (MH_HDEB - date(MH_HDEB)))::text, MH_INCODE]))[2] AS MH_INCODE,
(MAX(ARRAY[lpad(MH_DER,1,' ')||(MH_DDEB + (MH_HDEB - date(MH_HDEB)))::text, MH_UFCODE]))[2] AS MH_UFCODE,
(MAX(ARRAY[lpad(MH_DER,1,' ')||(MH_DDEB + (MH_HDEB - date(MH_HDEB)))::text, MH_UMCODE]))[2] AS MH_UMCODE,
(MAX(ARRAY[lpad(MH_DER,1,' ')||(MH_DDEB + (MH_HDEB - date(MH_HDEB)))::text, MH_UFHEBER]))[2] AS MH_UFHEBER,
(MAX(ARRAY[lpad(MH_DER,1,' ')||(MH_DDEB + (MH_HDEB - date(MH_HDEB)))::text, MH_SACODE]))[2] AS MH_SACODE,
(MAX(ARRAY[lpad(MH_DER,1,' ')||(MH_DDEB + (MH_HDEB - date(MH_HDEB)))::text, MH_LICODE]))[2] AS MH_LICODE,
(MIN(ARRAY[lpad(MH_DER,1,' ')||(MH_DDEB + (MH_HDEB - date(MH_HDEB)))::text, MH_RSCODENT]))[2] AS MH_RSCODENT,
(MAX(ARRAY[lpad(MH_DER,1,' ')||(MH_DDEB + (MH_HDEB - date(MH_HDEB)))::text, MH_RSCODSOR]))[2] AS MH_RSCODSOR,
(MAX(ARRAY[lpad(MH_DER,1,' ')||(MH_DDEB + (MH_HDEB - date(MH_HDEB)))::text, MH_ETCODE_CTI]))[2] AS MH_ETCODE_CTI,
(MAX(ARRAY[lpad(MH_DER,1,' ')||(MH_DDEB + (MH_HDEB - date(MH_HDEB)))::text, MH_LICODE_CTI]))[2] AS MH_LICODE_CTI,
(MAX(ARRAY[lpad(MH_DER,1,' ')||(MH_DDEB + (MH_HDEB - date(MH_HDEB)))::text, MH_ELCODE_CTI]))[2] AS MH_ELCODE_CTI,
'8'::text AS mode_entree,
''::text AS provenance,
'0'::text AS urgence,
'8'::text AS mode_sortie,
''::text AS destination
FROM w_MOUV_HOSPI_source
JOIN w_HOSPITALISATION_SELECT ON HO_NUM = MH_HONUM
GROUP BY 1
;
-- Modif CLA du 15-09-2017
-- RAISON.RS_TYPESORT peut prendre des valeurs non aurotisées de mode d'entrée. On force donc à 8/0 si la valeur n'est pas standard
UPDATE w_HOSPITALISATION_MOUV_SORTIE SET
mode_entree = CASE WHEN t_modes_entree.code IS NULL THEN '8'::text ELSE RS_TYPESORT::text END,
provenance = CASE WHEN t_modes_entree.code IS NULL THEN '0'::text ELSE RS_PROVDEST::text END,
urgence = CASE WHEN RS_CODE = ANY(string_to_array(t_divers.valeur,',')) THEN '1' ELSE '0' END
FROM prod_cerner.RAISON
JOIN activite.t_divers ON t_divers.code = 'CERNER_RAISONURGENCE'
LEFT JOIN base.t_modes_entree ON t_modes_entree.code = RS_TYPESORT
WHERE MH_RSCODENT = RS_CODE AND
(mode_entree <> CASE WHEN t_modes_entree.code IS NULL THEN '8'::text ELSE RS_TYPESORT::text END OR
provenance <> CASE WHEN t_modes_entree.code IS NULL THEN '0'::text ELSE RS_PROVDEST::text END OR
urgence <> CASE WHEN RS_CODE = ANY(string_to_array(t_divers.valeur,',')) THEN '1' ELSE '0' END)
;
-- Modif CLA du 15-09-2017
-- RAISON.RS_TYPESORT peut prendre des valeurs non aurotisées de mode de sortie. On force donc à 8/0 si la valeur n'est pas standard
UPDATE w_HOSPITALISATION_MOUV_SORTIE SET
mode_sortie = CASE WHEN t_modes_sortie.code IS NULL THEN '8'::text ELSE RS_TYPESORT::text END,
destination = CASE WHEN t_modes_sortie.code IS NULL THEN '0'::text ELSE RS_PROVDEST::text END
FROM prod_cerner.RAISON
LEFT JOIN base.t_modes_sortie ON t_modes_sortie.code = RS_TYPESORT
WHERE MH_RSCODSOR = RS_CODE AND
(mode_sortie <> CASE WHEN t_modes_sortie.code IS NULL THEN '8'::text ELSE RS_TYPESORT::text END OR
destination <> CASE WHEN t_modes_sortie.code IS NULL THEN '0'::text ELSE RS_PROVDEST::text END)
;
CREATE INDEX w_HOSPITALISATION_MOUV_SORTIE_i1
ON w_HOSPITALISATION_MOUV_SORTIE
USING btree
(MH_HONUM);
UPDATE w_HOSPITALISATION_select SET
HO_HDEBS = COALESCE(w_HOSPITALISATION_select.HO_HDEBS,MH_HDEB),
HO_HFINS = COALESCE(w_HOSPITALISATION_select.HO_HFINS,MH_HFIN),
HO_INCODE = CASE
WHEN w_HOSPITALISATION_select.HO_INCODE <> '' THEN w_HOSPITALISATION_select.HO_INCODE
ELSE MH_INCODE END,
HO_UFCODE = CASE
WHEN w_HOSPITALISATION_select.HO_UFCODE <> '' THEN w_HOSPITALISATION_select.HO_UFCODE
ELSE MH_UFCODE END,
HO_UMCODE = CASE
WHEN w_HOSPITALISATION_select.HO_UMCODE <> '' THEN w_HOSPITALISATION_select.HO_UMCODE
ELSE MH_UMCODE END,
HO_UFCODE_REA = CASE
WHEN w_HOSPITALISATION_select.HO_UFCODE_REA <> '' THEN w_HOSPITALISATION_select.HO_UFCODE_REA
ELSE MH_UFCODE END,
HO_UFHEBER = CASE
WHEN w_HOSPITALISATION_select.HO_UFHEBER <> '' THEN w_HOSPITALISATION_select.HO_UFHEBER
WHEN MH_UFHEBER <> '' THEN MH_UFHEBER
WHEN w_HOSPITALISATION_select.HO_UFCODE <> '' THEN w_HOSPITALISATION_select.HO_UFCODE
ELSE MH_UFCODE END,
HO_SACODE = CASE
WHEN w_HOSPITALISATION_select.HO_SACODE <> '' THEN w_HOSPITALISATION_select.HO_SACODE
ELSE MH_SACODE END,
HO_LICODE = CASE
WHEN w_HOSPITALISATION_select.HO_LICODE <> '' THEN w_HOSPITALISATION_select.HO_LICODE
WHEN MH_LICODE <> '' AND MH_LICODE <> MH_UFCODE AND MH_LICODE <> MH_UFHEBER THEN MH_LICODE
WHEN MH_SACODE <> '' AND MH_SACODE <> MH_UFCODE AND MH_SACODE <> MH_UFHEBER THEN MH_SACODE
ELSE '0' END,
HO_ETCODE_CTI = CASE
WHEN w_HOSPITALISATION_select.HO_ETCODE_CTI <> '' THEN w_HOSPITALISATION_select.HO_ETCODE_CTI
ELSE MH_ETCODE_CTI END,
HO_LICODE_CTI = CASE
WHEN w_HOSPITALISATION_select.HO_LICODE_CTI <> '' THEN w_HOSPITALISATION_select.HO_LICODE_CTI
ELSE MH_LICODE_CTI END,
HO_ELCODE_CTI = CASE
WHEN w_HOSPITALISATION_select.HO_ELCODE_CTI <> '' THEN w_HOSPITALISATION_select.HO_ELCODE_CTI
ELSE MH_ELCODE_CTI END,
mode_entree = w_HOSPITALISATION_MOUV_SORTIE.mode_entree,
provenance = w_HOSPITALISATION_MOUV_SORTIE.provenance,
urgence = w_HOSPITALISATION_MOUV_SORTIE.urgence,
mode_sortie = w_HOSPITALISATION_MOUV_SORTIE.mode_sortie,
destination = w_HOSPITALISATION_MOUV_SORTIE.destination
FROM w_HOSPITALISATION_MOUV_SORTIE
WHERE HO_NUM = MH_HONUM AND
(
HO_HDEBS IS NULL OR
HO_HFINS IS NULL OR
HO_INCODE = '' OR
HO_UFCODE = '' OR
HO_UMCODE = '' OR
HO_UFHEBER = '' OR
HO_SACODE = '' OR
HO_LICODE = '' OR
HO_ETCODE_CTI = '' OR
HO_LICODE_CTI = '' OR
HO_ELCODE_CTI = '' OR
w_HOSPITALISATION_MOUV_SORTIE.mode_entree <> '8' OR
w_HOSPITALISATION_MOUV_SORTIE.mode_sortie <> '8' OR
w_HOSPITALISATION_MOUV_SORTIE.urgence <> '0'
)
;
DROP TABLE IF EXISTS w_MALADE_code_postal;
CREATE TEMP TABLE w_MALADE_code_postal AS
SELECT AD_MANUMDOS, (MAX(ARRAY[to_char(AD_CPT,'FM000'),t_codes_postaux.oid::text]))[2]::bigint AS code_postal_id
FROM prod_cerner.ADRESSE
JOIN base.t_codes_postaux ON AD_VNCODE = t_codes_postaux.code
WHERE AD_TYP = 'M'
GROUP BY 1
;
UPDATE w_HOSPITALISATION_select SET
code_postal_id = w_MALADE_code_postal.code_postal_id
FROM w_MALADE_code_postal
WHERE HO_MANUMDOS = AD_MANUMDOS
;
UPDATE w_HOSPITALISATION_select SET
mode_traitement_id = t_services_facturation.mode_traitement_id,
mode_traitement_code = t_modes_traitement.code,
dmt_code = t_dmt.code
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 = HO_UFCODE
;
UPDATE w_HOSPITALISATION_select SET
medecin_sejour_id = t_medecins_administratifs.oid
FROM activite[PX].t_medecins_administratifs
WHERE t_medecins_administratifs.code_original = HO_INCODE
;
CREATE INDEX w_HOSPITALISATION_SELECT_i3
ON w_HOSPITALISATION_SELECT
USING btree
(HO_UFHEBER);
CREATE INDEX w_HOSPITALISATION_SELECT_i4
ON w_HOSPITALISATION_SELECT
USING btree
(HO_LICODE_CTI);
CREATE INDEX w_HOSPITALISATION_SELECT_i5
ON w_HOSPITALISATION_SELECT
USING btree
(HO_UFCODE);
ANALYSE w_HOSPITALISATION_SELECT;
-- Id des Tiers payant
--UPDATE w_HOSPITALISATION_SELECT
--SET tiers_payant_1_id = t_tiers_payant.oid
--FROM activite[PX].t_tiers_payant
--WHERE t_tiers_payant.code_original = ('C'||NOCAIS)
;
INSERT INTO activite[PX].t_lieux(
code_original_1, code_original_2, code_original_3, code_original_4, code_original_5, code_original_6)
SELECT HO_UFCODE,
HO_RECODE,
HO_ETCODE_CTI,
HO_ELCODE_CTI,
HO_UMCODE,
HO_UFCODE_REA
FROM w_HOSPITALISATION_SELECT
LEFT JOIN activite[PX].t_lieux ON (
code_original_1 = HO_UFCODE AND
code_original_2 = HO_RECODE AND
code_original_3 = HO_ETCODE_CTI AND
code_original_4 = HO_ELCODE_CTI AND
code_original_5 = HO_UMCODE AND
code_original_6 = HO_UFCODE_REA
)
WHERE t_lieux.oid IS NULL
GROUP BY 1,2,3,4,5,6;
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
activite_id = COALESCE(t_activites.oid,0)
FROM
activite[PX].t_activites
WHERE code_original_2 = t_activites.code_original
AND activite_id <> COALESCE(t_activites.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
unite_medicale_id = COALESCE(t_unites_medicales.oid,0)
FROM
activite[PX].t_unites_medicales
WHERE code_original_5 = t_unites_medicales.code_original
AND unite_medicale_id <> COALESCE(t_unites_medicales.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)
;
UPDATE w_HOSPITALISATION_SELECT SET
lieu_sortie_id = t_lieux.oid,
type_sejour_force = CASE WHEN w_HOSPITALISATION_SELECT.type_sejour_force <> '9' AND t_services_facturation.type_sejour IN ('1', '2', '3', '4', '5', '6') THEN t_services_facturation.type_sejour ELSE w_HOSPITALISATION_SELECT.type_sejour_force END
FROM activite[PX].t_lieux
JOIN activite[PX].t_services_facturation ON service_facturation_id = t_services_facturation.oid
WHERE code_original_1 = HO_UFCODE AND
code_original_2 = HO_RECODE AND
code_original_3 = HO_ETCODE_CTI AND
code_original_4 = HO_ELCODE_CTI AND
code_original_5 = HO_UMCODE AND
code_original_6 = HO_UFCODE_REA
;
DROP TABLE IF EXISTS w_sejours;
CREATE TEMP TABLE w_sejours AS
SELECT
'000000000'::text AS finess,
w_HOSPITALISATION_SELECT.HO_NUMSEJ as no_sejour,
w_HOSPITALISATION_SELECT.HO_NUMSEJ as code_original,
to_char(HO_MANUMDOS,'FM0000000000') as no_patient,
HO_DDEBS as date_entree,
to_char(HO_HDEBS,'HH24MISS')::numeric as heure_entree,
COALESCE(HO_DFINS,'20991231') as date_sortie,
to_char(HO_HFINS,'HH24MISS')::numeric as heure_sortie,
MA_SEXE as code_sexe,
0 AS age,
CASE WHEN HO_DFINS IS NULL THEN 0 ELSE 1 END::numeric as code_sorti,
CASE WHEN HO_DDEBS > now() THEN 1::numeric ELSE 0::numeric END AS code_prevu,
CASE
WHEN type_sejour_force <> '0' THEN type_sejour_force
WHEN RE_TYPE = 'C' THEN '3'
WHEN RE_TYPE = 'H' AND HO_DFINS = HO_DDEBS THEN '2'
WHEN RE_TYPE = 'H' THEN '1'
WHEN mode_traitement_code IN ('07') OR dmt_code IN ('958') THEN '3'
WHEN mode_traitement_code IN ('03') AND HO_DFINS = HO_DDEBS THEN '2'
WHEN mode_traitement_code IN ('04') AND HO_DFINS = HO_DDEBS THEN '2'
WHEN mode_traitement_code IN ('19', '23') AND HO_DFINS = HO_DDEBS THEN '2'
WHEN mode_traitement_code IN ('03') THEN '1'
WHEN HO_DFINS = HO_DDEBS THEN '2'
ELSE '1' END as type_sejour,
w_HOSPITALISATION_SELECT.lieu_sortie_id AS lieu_sortie_id,
w_HOSPITALISATION_SELECT.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,
'20991231'::date AS DATE_GROUPAGE,
'0'::text AS code_cp_demandee,
w_HOSPITALISATION_SELECT.mode_traitement_id,
w_HOSPITALISATION_SELECT.mode_entree,
w_HOSPITALISATION_SELECT.provenance,
w_HOSPITALISATION_SELECT.mode_sortie,
w_HOSPITALISATION_SELECT.destination,
w_HOSPITALISATION_SELECT.tiers_payant_0_id,
w_HOSPITALISATION_SELECT.tiers_payant_1_id,
w_HOSPITALISATION_SELECT.tiers_payant_2_id,
w_HOSPITALISATION_SELECT.tiers_payant_22_id,
1 AS est_budget_global,
w_HOSPITALISATION_SELECT.code_postal_id
FROM w_HOSPITALISATION_SELECT
WHERE sejour_a_creer = '1'
;
-- 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');
-- 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;
-- GHM et GHS depuis PMSI
UPDATE w_sejours p_sejours
SET ghm_id = subview.ghm_id, ghs_id = subview.ghs_id
FROM
(
SELECT no_sejour, t_ghm_a.oid AS ghm_id, t_ghs_a.oid AS ghs_id
FROM w_sejours p_sejours
JOIN pmsi.p_rss ON p_sejours.no_sejour = p_rss.no_sejour_administratif AND
date_trunc('month',p_sejours.date_sortie) = date_trunc('month',p_rss.date_sortie)
JOIN pmsi.t_ghm t_ghm_p ON p_rss.ghm_id = t_ghm_p.oid
JOIN base.t_ghs t_ghs_p ON p_rss.ghs_id = t_ghs_p.oid
JOIN base.t_ghm t_ghm_a ON t_ghm_p.code = t_ghm_a.code
JOIN base.t_ghs t_ghs_a ON t_ghs_p.code = t_ghs_a.code
WHERE type_sejour IN ('1','2','5') AND
p_rss.ghm_id > 0 AND
p_sejours.ghm_id <> t_ghm_a.oid AND
t_ghm_p.code NOT LIKE '90%' AND t_ghm_p.code NOT LIKE '99%'
) subview
WHERE p_sejours.no_sejour = subview.no_sejour
;
-- Validation des séjours
SELECT base.cti_disable_index('activite', 'i_sejours_2');
SELECT base.cti_disable_index('activite', 'i_sejours_3');
SELECT base.cti_disable_index('activite', 'i_sejours_4');
SELECT base.cti_disable_index('activite', 'i_sejours_5');
SELECT base.cti_disable_index('activite', 'i_sejours_6');
SELECT base.cti_disable_index('activite', 'i_sejours_7');
SELECT base.cti_disable_index('activite', 'i_sejours_8');
SELECT base.cti_disable_index('activite', 'i_sejours_9');
SELECT base.cti_disable_index('activite', 'i_sejours_10');
SELECT base.cti_disable_index('activite', 'i_sejours_11');
SELECT base.cti_disable_index('activite', 'i_sejours_12');
SELECT base.cti_disable_index('activite', '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
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
);
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
)
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
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 FROM w_sejours );
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
'' = '';
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
'' = '';
-- 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
'' = '';
-- recréation index
SELECT base.cti_enable_index('activite', 'i_sejours_2');
SELECT base.cti_enable_index('activite', 'i_sejours_3');
SELECT base.cti_enable_index('activite', 'i_sejours_4');
SELECT base.cti_enable_index('activite', 'i_sejours_5');
SELECT base.cti_enable_index('activite', 'i_sejours_6');
SELECT base.cti_enable_index('activite', 'i_sejours_7');
SELECT base.cti_enable_index('activite', 'i_sejours_8');
SELECT base.cti_enable_index('activite', 'i_sejours_9');
SELECT base.cti_enable_index('activite', 'i_sejours_10');
SELECT base.cti_enable_index('activite', 'i_sejours_11');
SELECT base.cti_enable_index('activite', 'i_sejours_12');
SELECT base.cti_enable_index('activite', 'i_sejours_13');
UPDATE w_HOSPITALISATION_SELECT
SET sejour_id = p_sejours.oid
FROM activite[PX].p_sejours
WHERE HO_NUMSEJ = p_sejours.code_original
;
]]></sqlcmd>
</NODE>
<NODE label="Mouvements">
<sqlcmd><![CDATA[
DROP SEQUENCE IF EXISTS w_MOUV_HOSPI_seq;
CREATE TEMP SEQUENCE w_MOUV_HOSPI_seq;
DROP TABLE IF EXISTS w_MOUV_HOSPI;
CREATE TEMP TABLE w_MOUV_HOSPI AS
SELECT
nextval('w_MOUV_HOSPI_seq'::regclass) AS sequence,
subview.*
FROM
(
SELECT
w_HOSPITALISATION_SELECT.HO_NUMSEJ,
w_HOSPITALISATION_SELECT.HO_NUM,
HO_DDEBS,
HO_HDEBS,
HO_DDEBS + HO_HDEBS AS HO_DHDEBS,
HO_DFINS,
HO_HFINS,
HO_DFINS + HO_HFINS AS HO_DHFINS,
date(MH_DDEB) AS MH_DDEB,
(MH_HDEB - date(MH_HDEB))::time without time zone AS MH_HDEB,
MH_DDEB + ((MH_HDEB - date(MH_HDEB))) AS MH_DHDEB,
date(MH_DFIN) AS MH_DFIN,
(MH_HFIN - date(MH_HFIN))::time without time zone AS MH_HFIN,
MH_DFIN + ((MH_HFIN - date(MH_HFIN))) AS MH_DHFIN,
0::bigint AS lieu_id,
'0'::text AS est_chambre_particuliere,
w_HOSPITALISATION_SELECT.urgence,
MH_UFCODE AS lieu_service_facturation_code_original,
HO_RECODE AS lieu_activite_code_original,
MH_ETCODE_CTI AS lieu_etage_code_original,
MH_LICODE_CTI AS lieu_lit_code,
MH_ELCODE_CTI AS lieu_lit_code_original,
MH_UFCODE AS lieu_unite_fonctionnelle_code_original,
MH_UMCODE AS lieu_unite_medicale_code_original,
''::text AS lieu_service_facturation_before,
''::text AS lieu_activite_before,
''::text AS lieu_etage_before,
''::text AS lieu_lit_before,
''::text AS lieu_unite_fonctionnelle_before,
''::text AS lieu_unite_medicale_before,
''::text AS lieu_service_facturation_after,
''::text AS lieu_activite_after,
''::text AS lieu_etage_after,
''::text AS lieu_lit_after,
''::text AS lieu_unite_fonctionnelle_after,
''::text AS lieu_unite_medicale_after
FROM w_HOSPITALISATION_SELECT
JOIN w_MOUV_HOSPI_source ON w_HOSPITALISATION_SELECT.HO_NUM = w_MOUV_HOSPI_source.MH_HONUM
WHERE RE_TYPE = 'H'
ORDER BY 1,9,10
) subview
;
CREATE INDEX w_MOUV_HOSPI_i1
ON w_MOUV_HOSPI
USING btree
(HO_NUMSEJ);
CREATE INDEX w_MOUV_HOSPI_i2
ON w_MOUV_HOSPI
USING btree
(sequence);
-- Correction des mouvements en désaccord avec séjour (date entrée)
UPDATE w_MOUV_HOSPI SET
MH_DDEB = w_MOUV_HOSPI.HO_DDEBS,
MH_HDEB = w_MOUV_HOSPI.HO_HDEBS,
MH_DHDEB = w_MOUV_HOSPI.HO_DHDEBS
FROM
(
SELECT HO_NUMSEJ,
MIN(sequence) AS sequence_first,
MAX(HO_DDEBS) AS HO_DDEBS,
MAX(HO_HDEBS) AS HO_HDEBS,
MAX(HO_DHDEBS) AS HO_DHDEBS,
(MIN(ARRAY[to_char(sequence,'FM00000000'),MH_DDEB::text]))[2]::date AS MH_DDEB_first,
(MIN(ARRAY[to_char(sequence,'FM00000000'),MH_HDEB::text]))[2]::time without time zone AS MH_HDEB_first,
(MIN(ARRAY[to_char(sequence,'FM00000000'),MH_DHDEB::text]))[2]::timestamp without time zone AS MH_DHDEB_first
FROM w_MOUV_HOSPI
GROUP BY 1
HAVING MAX(HO_DHDEBS) <>
(MIN(ARRAY[to_char(sequence,'FM00000000'),MH_DHDEB::text]))[2]::timestamp without time zone
) subview
WHERE w_MOUV_HOSPI.HO_NUMSEJ = subview.HO_NUMSEJ AND
w_MOUV_HOSPI.sequence = subview.sequence_first
;
-- Correction des mouvements en désaccord avec séjour (date sortie)
UPDATE w_MOUV_HOSPI SET
MH_DFIN = w_MOUV_HOSPI.HO_DFINS,
MH_HFIN = w_MOUV_HOSPI.HO_HFINS,
MH_DHFIN = w_MOUV_HOSPI.HO_DHFINS
FROM
(
SELECT HO_NUMSEJ,
MAX(sequence) AS sequence_last,
MAX(HO_DFINS) AS HO_DFINS,
MAX(HO_HFINS) AS HO_HFINS,
MAX(HO_DHFINS) AS HO_DHFINS,
(MAX(ARRAY[to_char(sequence,'FM00000000'),MH_DFIN::text]))[2]::date AS MH_DFIN_last,
(MAX(ARRAY[to_char(sequence,'FM00000000'),MH_HFIN::text]))[2]::time without time zone AS MH_HFIN_last,
(MAX(ARRAY[to_char(sequence,'FM00000000'),MH_DHFIN::text]))[2]::timestamp without time zone AS MH_DHFIN_last
FROM w_MOUV_HOSPI
GROUP BY 1
HAVING MAX(HO_DHFINS) <>
(MAX(ARRAY[to_char(sequence,'FM00000000'),MH_DHFIN::text]))[2]::timestamp without time zone
) subview
WHERE w_MOUV_HOSPI.HO_NUMSEJ = subview.HO_NUMSEJ AND
w_MOUV_HOSPI.sequence = subview.sequence_last
;
UPDATE w_MOUV_HOSPI SET
MH_DHDEB = MH_DHFIN - interval '1 second',
MH_DDEB = date(MH_DHFIN - interval '1 second'),
MH_HDEB = (MH_DHFIN - interval '1 second')::time without time zone
WHERE MH_DHDEB > MH_DHFIN
;
UPDATE w_MOUV_HOSPI SET
MH_DHFIN = w_MOUV_HOSPI_after.MH_DHDEB - interval '1 second',
MH_DFIN = date(w_MOUV_HOSPI_after.MH_DHDEB - interval '1 second'),
MH_HFIN = (w_MOUV_HOSPI_after.MH_DHDEB - interval '1 second')::time without time zone
FROM w_MOUV_HOSPI w_MOUV_HOSPI_after
WHERE w_MOUV_HOSPI.HO_NUMSEJ = w_MOUV_HOSPI_after.HO_NUMSEJ AND
w_MOUV_HOSPI.sequence = w_MOUV_HOSPI_after.sequence -1
;
DELETE FROM w_MOUV_HOSPI
WHERE MH_DHFIN < HO_DHDEBS
;
INSERT INTO activite[PX].t_lieux(
code_original_1, code_original_2, code_original_3, code_original_4, code_original_5, code_original_6)
SELECT lieu_service_facturation_code_original,
lieu_activite_code_original,
lieu_etage_code_original,
lieu_lit_code_original,
lieu_unite_medicale_code_original,
lieu_unite_fonctionnelle_code_original
FROM w_MOUV_HOSPI
LEFT JOIN activite[PX].t_lieux ON (
code_original_1 = lieu_service_facturation_code_original AND
code_original_2 = lieu_activite_code_original AND
code_original_3 = lieu_etage_code_original AND
code_original_4 = lieu_lit_code_original AND
code_original_5 = lieu_unite_medicale_code_original AND
code_original_6 = lieu_unite_fonctionnelle_code_original
)
WHERE t_lieux.oid IS NULL
GROUP BY 1,2,3,4,5,6;
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
activite_id = COALESCE(t_activites.oid,0)
FROM
activite[PX].t_activites
WHERE code_original_2 = t_activites.code_original
AND activite_id <> COALESCE(t_activites.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
unite_medicale_id = COALESCE(t_unites_medicales.oid,0)
FROM
activite[PX].t_unites_medicales
WHERE code_original_5 = t_unites_medicales.code_original
AND unite_medicale_id <> COALESCE(t_unites_medicales.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)
;
UPDATE w_MOUV_HOSPI SET
lieu_id = t_lieux.oid,
est_chambre_particuliere = CASE WHEN t_lits.chambre_particuliere = 'O' THEN '1' ELSE '0' END
FROM activite[PX].t_lieux
JOIN activite[PX].t_lits ON lit_id = t_lits.oid
WHERE
code_original_1 = lieu_service_facturation_code_original AND
code_original_2 = lieu_activite_code_original AND
code_original_3 = lieu_etage_code_original AND
code_original_4 = lieu_lit_code_original AND
code_original_5 = lieu_unite_medicale_code_original AND
code_original_6 = lieu_unite_fonctionnelle_code_original
;
-- Etat avant
UPDATE w_MOUV_HOSPI SET
lieu_service_facturation_before = w_MOUV_HOSPI_before.lieu_service_facturation_code_original,
lieu_activite_before = w_MOUV_HOSPI_before.lieu_activite_code_original,
lieu_etage_before = w_MOUV_HOSPI_before.lieu_etage_code_original,
lieu_lit_before = w_MOUV_HOSPI_before.lieu_lit_code_original,
lieu_unite_fonctionnelle_before = w_MOUV_HOSPI_before.lieu_unite_fonctionnelle_code_original,
lieu_unite_medicale_before = w_MOUV_HOSPI_before.lieu_unite_medicale_code_original
FROM w_MOUV_HOSPI w_MOUV_HOSPI_before
WHERE w_MOUV_HOSPI.HO_NUMSEJ = w_MOUV_HOSPI_before.HO_NUMSEJ AND
w_MOUV_HOSPI.sequence = w_MOUV_HOSPI_before.sequence +1
;
-- Etat apres
UPDATE w_MOUV_HOSPI SET
lieu_service_facturation_after = w_MOUV_HOSPI_after.lieu_service_facturation_code_original,
lieu_activite_after = w_MOUV_HOSPI_after.lieu_activite_code_original,
lieu_etage_after = w_MOUV_HOSPI_after.lieu_etage_code_original,
lieu_lit_after = w_MOUV_HOSPI_after.lieu_lit_code_original,
lieu_unite_fonctionnelle_after = w_MOUV_HOSPI_after.lieu_unite_fonctionnelle_code_original,
lieu_unite_medicale_after = w_MOUV_HOSPI_after.lieu_unite_medicale_code_original
FROM w_MOUV_HOSPI w_MOUV_HOSPI_after
WHERE w_MOUV_HOSPI.HO_NUMSEJ = w_MOUV_HOSPI_after.HO_NUMSEJ AND
w_MOUV_HOSPI.sequence = w_MOUV_HOSPI_after.sequence -1
;
DROP TABLE IF EXISTS w_mouvements_sejour;
CREATE TEMP TABLE w_mouvements_sejour AS
SELECT
w_MOUV_HOSPI.HO_NUM,
w_MOUV_HOSPI.HO_NUMSEJ 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 = MH_DDEB THEN to_char(MH_HDEB,'HH24MISS')::numeric ELSE 0 END AS heure_debut,
CASE WHEN p_calendrier.date = MH_DFIN THEN to_char(MH_HFIN,'HH24MISS')::numeric ELSE 240000 END AS heure_fin,
CASE WHEN MH_DHDEB = HO_DHDEBS AND p_calendrier.date = MH_DDEB AND p_sejours.type_sejour = '1' THEN 1 ELSE 0 END AS nb_entrees_directes,
CASE WHEN MH_DHFIN = HO_DHFINS AND p_calendrier.date = MH_DFIN AND p_sejours.type_sejour = '1' THEN 1 ELSE 0 END AS nb_sorties_directes,
CASE WHEN MH_DHDEB = HO_DHDEBS AND p_calendrier.date = MH_DDEB AND p_sejours.type_sejour = '1' THEN '1' ELSE '0' END AS est_jour_entree,
CASE WHEN MH_DHFIN = HO_DHFINS AND p_calendrier.date = MH_DFIN 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 MH_DHDEB = HO_DHDEBS AND p_calendrier.date = MH_DDEB AND p_sejours.type_sejour = '2' THEN 1 ELSE 0 END AS nb_ambulatoires,
CASE WHEN MH_DHDEB = HO_DHDEBS AND p_calendrier.date = MH_DDEB AND p_sejours.type_sejour = '3' THEN 1 ELSE 0 END AS nb_externes,
CASE WHEN MH_DHDEB = HO_DHDEBS AND p_calendrier.date = MH_DDEB AND p_sejours.type_sejour = '3' THEN 1 ELSE 0 END AS nb_passage_externe,
CASE WHEN w_MOUV_HOSPI.urgence = '1' AND p_calendrier.date = MH_DDEB AND MH_DHDEB = HO_DHDEBS THEN 1 ELSE 0 END AS nb_urgences,
CASE WHEN MH_DHDEB = HO_DHDEBS AND p_calendrier.date = MH_DDEB AND p_sejours.type_sejour = '5' THEN 1 ELSE 0 END AS nb_seances,
CASE WHEN p_calendrier.date = MH_DDEB AND p_sejours.type_sejour = '1' AND MH_DHDEB <> HO_DHDEBS AND lieu_service_facturation_code_original <> lieu_service_facturation_before THEN 1 ELSE 0 END AS nb_entrees_mutation_service,
CASE WHEN p_calendrier.date = MH_DFIN AND p_sejours.type_sejour = '1' AND MH_DHFIN <> HO_DHFINS AND lieu_service_facturation_code_original <> lieu_service_facturation_after THEN 1 ELSE 0 END AS nb_sorties_mutation_service,
CASE WHEN p_calendrier.date = MH_DDEB AND p_sejours.type_sejour = '1' AND MH_DHDEB <> HO_DHDEBS AND lieu_etage_code_original <> lieu_etage_before THEN 1 ELSE 0 END AS nb_entrees_mutation_etage,
CASE WHEN p_calendrier.date = MH_DFIN AND p_sejours.type_sejour = '1' AND MH_DHFIN <> HO_DHFINS AND lieu_etage_code_original <> lieu_etage_after 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 <> MH_DFIN THEN 1 ELSE 0 END AS nb_jours_js_non_inclus,
CASE WHEN p_sejours.type_sejour IN ('1','2') THEN est_chambre_particuliere ELSE '0' END AS est_chambre_particuliere,
CASE WHEN p_sejours.type_sejour IN ('1','2') AND est_chambre_particuliere = 1 THEN 1 ELSE 0 END AS nb_chambres_particulieres,
CASE WHEN MH_DHDEB = HO_DHDEBS AND p_calendrier.date = MH_DDEB AND p_sejours.type_sejour = '6' THEN 1 ELSE 0 END 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_cerner) THEN '1' ELSE '0' END AS est_mouvement_previsionnel
FROM w_MOUV_HOSPI
JOIN w_PERIODE ON 1=1
JOIN activite[PX].p_sejours ON w_MOUV_HOSPI.HO_NUMSEJ = p_sejours.no_sejour AND p_sejours.etat = ''
JOIN base.p_calendrier ON (p_calendrier.date BETWEEN MH_DDEB AND MH_DFIN AND p_calendrier.date <= now() + interval '1 month' )
ORDER BY sequence, p_calendrier.date;
-- Externes (avec passages donc possibilité d'avoir plusieurs externes pour un séjour)
DROP TABLE IF EXISTS w_mouvements_externes;
CREATE TEMP TABLE w_mouvements_externes AS
SELECT
HO_NUMSEJ,
COALESCE(SEA_DATE,HO_DDEBS) AS HO_DDEBS,
COALESCE((SEA_HEURE - date(SEA_HEURE))::time without time zone,HO_HDEBS) AS HO_HDEBS,
SEA_ID,
COALESCE(ACTE_UFXCODE,SEA_UFCODE_REA,HO_UFCODE_REA) AS ACTE_UFXCODE,
to_char(SEA_ID,'FM000000000000')||COALESCE(ACTE_UFXCODE,SEA_UFCODE_REA,HO_UFCODE_REA) AS ACTE_KEY,
MAX(HO_NUM) AS HO_NUM,
MAX(COALESCE(SEA_DATE_FIN,HO_DFINS)) AS HO_DFINS,
MAX(COALESCE((SEA_HEURE_FIN - date(SEA_HEURE_FIN))::time without time zone,HO_HFINS)) AS HO_HFINS,
MAX(w_HOSPITALISATION_SELECT.medecin_sejour_id) AS medecin_sejour_id,
MAX(w_HOSPITALISATION_SELECT.lieu_sortie_id) AS lieu_id,
MAX(COALESCE(SEA_UFCODE,HO_UFCODE)) AS lieu_service_facturation_code_original,
MAX(HO_RECODE) AS lieu_activite_code_original,
MAX(HO_ETCODE_CTI) AS lieu_etage_code_original,
MAX(HO_ELCODE_CTI) AS lieu_lit_code_original,
''::text AS lieu_unite_medicale_code_original,
MAX(COALESCE(ACTE_UFXCODE,SEA_UFCODE_REA,HO_UFCODE_REA)) AS lieu_unite_fonctionnelle_code_original,
'0'::text AS est_chambre_particuliere,
'1'::text AS est_premier_passage_jour
FROM w_HOSPITALISATION_SELECT
LEFT JOIN w_PASSAGE ON HO_NUM = SEA_HONUM AND HO_SEANCE = SEA_SEANCE
LEFT JOIN w_PASSAGE_ACTES ON HO_NUM = ACTE_HONUM AND
w_PASSAGE.SEA_ID = ACTE_SEAID
JOIN activite[PX].p_sejours ON w_HOSPITALISATION_SELECT.HO_NUMSEJ = p_sejours.no_sejour AND p_sejours.etat = ''
WHERE RE_TYPE <> 'H' AND sejour_a_creer = '1'
GROUP BY 1,2,3,4,5,6
ORDER BY 1,2,3,4
;
CREATE INDEX w_mouvements_externes_i1
ON w_mouvements_externes
USING btree
(HO_NUMSEJ);
SELECT base.cti_execute(
'UPDATE w_mouvements_externes
SET HO_HDEBS = w_mouvements_externes.HO_HDEBS + interval ''1 second''
FROM
(
SELECT HO_NUMSEJ, HO_DDEBS, HO_HDEBS, MIN(ACTE_KEY) AS ACTE_KEY_first
FROM w_mouvements_externes
GROUP BY 1,2,3
HAVING count(*) > 1
) subview
WHERE w_mouvements_externes.HO_NUMSEJ = subview.HO_NUMSEJ AND
w_mouvements_externes.HO_DDEBS = subview.HO_DDEBS AND
w_mouvements_externes.HO_HDEBS = subview.HO_HDEBS AND
w_mouvements_externes.ACTE_KEY <> subview.ACTE_KEY_first
',100)
;
UPDATE w_mouvements_externes
SET est_premier_passage_jour = '0'
FROM
(
SELECT HO_NUMSEJ, HO_DDEBS, (MIN(ARRAY[HO_HDEBS::text,ACTE_KEY::text]))[2]::text AS ACTE_KEY_first
FROM w_mouvements_externes
GROUP BY 1,2
HAVING COUNT(*) > 1
) subview
WHERE w_mouvements_externes.HO_NUMSEJ = subview.HO_NUMSEJ AND
w_mouvements_externes.HO_DDEBS = subview.HO_DDEBS AND
w_mouvements_externes.ACTE_KEY <> subview.ACTE_KEY_first
;
INSERT INTO activite[PX].t_lieux(
code_original_1, code_original_2, code_original_3, code_original_4, code_original_5, code_original_6)
SELECT lieu_service_facturation_code_original,
lieu_activite_code_original,
lieu_etage_code_original,
lieu_lit_code_original,
lieu_unite_medicale_code_original,
lieu_unite_fonctionnelle_code_original
FROM w_mouvements_externes
LEFT JOIN activite[PX].t_lieux ON (
code_original_1 = lieu_service_facturation_code_original AND
code_original_2 = lieu_activite_code_original AND
code_original_3 = lieu_etage_code_original AND
code_original_4 = lieu_lit_code_original AND
code_original_5 = lieu_unite_medicale_code_original AND
code_original_6 = lieu_unite_fonctionnelle_code_original
)
WHERE t_lieux.oid IS NULL
GROUP BY 1,2,3,4,5,6;
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
activite_id = COALESCE(t_activites.oid,0)
FROM
activite[PX].t_activites
WHERE code_original_2 = t_activites.code_original
AND activite_id <> COALESCE(t_activites.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
unite_medicale_id = COALESCE(t_unites_medicales.oid,0)
FROM
activite[PX].t_unites_medicales
WHERE code_original_5 = t_unites_medicales.code_original
AND unite_medicale_id <> COALESCE(t_unites_medicales.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)
;
UPDATE w_mouvements_externes SET
lieu_id = t_lieux.oid,
est_chambre_particuliere = CASE WHEN t_lits.chambre_particuliere = 'O' THEN '1' ELSE '0' END
FROM activite[PX].t_lieux
JOIN activite[PX].t_lits ON lit_id = t_lits.oid
WHERE
code_original_1 = lieu_service_facturation_code_original AND
code_original_2 = lieu_activite_code_original AND
code_original_3 = lieu_etage_code_original AND
code_original_4 = lieu_lit_code_original AND
code_original_5 = lieu_unite_medicale_code_original AND
code_original_6 = lieu_unite_fonctionnelle_code_original AND
(
w_mouvements_externes.lieu_id <> t_lieux.oid OR
w_mouvements_externes.est_chambre_particuliere <> CASE WHEN t_lits.chambre_particuliere = 'O' THEN '1' ELSE '0' END
)
;
DELETE FROM w_mouvements_sejour
USING
(
SELECT no_sejour, date, heure_debut, min(CTID) AS keep_ctid
FROM w_mouvements_sejour
GROUP BY 1,2,3
HAVING count(*) >1
) subview
WHERE w_mouvements_sejour.no_sejour = subview.no_sejour AND
w_mouvements_sejour.date = subview.date AND
w_mouvements_sejour.heure_debut = subview.heure_debut AND
w_mouvements_sejour.CTID <> keep_ctid
;
INSERT INTO w_mouvements_sejour
(
HO_NUM,
no_sejour,
sejour_id,
sequence,
date,
jour_semaine,
is_weekend,
heure_debut,
heure_fin,
nb_entrees_directes,
nb_sorties_directes,
est_jour_entree,
est_jour_sortie,
est_jour_hospitalisation,
nb_ambulatoires,
nb_externes,
nb_passage_externe,
nb_urgences,
nb_seances,
nb_entrees_mutation_service,
nb_sorties_mutation_service,
nb_entrees_mutation_etage,
nb_sorties_mutation_etage,
nb_entrees_mutation_activite,
nb_sorties_mutation_activite,
nb_entrees_mutation_unite_medicale,
nb_sorties_mutation_unite_medicale,
nb_jours_js_inclus,
nb_jours_js_non_inclus,
est_chambre_particuliere,
nb_chambres_particulieres,
nb_bebes,
lieu_id,
medecin_sejour_id,
est_mouvement_previsionnel
)
SELECT
w_mouvements_externes.HO_NUM,
w_mouvements_externes.HO_NUMSEJ AS no_sejour,
p_sejours.oid AS sejour_id,
0::numeric,
p_calendrier.date,
p_calendrier.jour_semaine,
p_calendrier.is_weekend,
CASE WHEN p_calendrier.date = HO_DDEBS THEN to_char(HO_HDEBS,'HH24MISS')::numeric ELSE 0 END AS heure_debut,
CASE WHEN p_calendrier.date = HO_DFINS THEN to_char(HO_HFINS,'HH24MISS')::numeric ELSE 240000 END AS heure_fin,
CASE WHEN p_calendrier.date = HO_DDEBS AND p_sejours.type_sejour = '1' THEN 1 ELSE 0 END AS nb_entrees_directes,
CASE WHEN p_calendrier.date = HO_DFINS AND p_sejours.type_sejour = '1' THEN 1 ELSE 0 END AS nb_sorties_directes,
CASE WHEN p_calendrier.date = HO_DDEBS AND p_sejours.type_sejour = '1' THEN '1' ELSE '0' END AS est_jour_entree,
CASE WHEN p_calendrier.date = HO_DFINS 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 p_calendrier.date = HO_DDEBS AND p_sejours.type_sejour = '2' THEN 1 ELSE 0 END AS nb_ambulatoires,
CASE WHEN p_calendrier.date = HO_DDEBS AND p_sejours.type_sejour = '3' AND est_premier_passage_jour = '1' THEN 1 ELSE 0 END AS nb_externes,
CASE WHEN p_calendrier.date = HO_DDEBS AND p_sejours.type_sejour = '3' THEN 1 ELSE 0 END AS nb_passage_externe,
CASE WHEN '1' <> '1' AND p_calendrier.date = HO_DDEBS THEN 1 ELSE 0 END AS nb_urgences,
CASE WHEN p_calendrier.date = HO_DDEBS AND p_sejours.type_sejour = '5' THEN 1 ELSE 0 END AS nb_seances,
0 AS nb_entrees_mutation_service,
0 AS nb_sorties_mutation_service,
0 AS nb_entrees_mutation_etage,
0 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 <> HO_DFINS THEN 1 ELSE 0 END AS nb_jours_js_non_inclus,
'0'::text AS est_chambre_particuliere,
0::numeric AS nb_chambres_particulieres,
CASE WHEN p_calendrier.date = HO_DDEBS AND p_sejours.type_sejour = '6' THEN 1 ELSE 0 END AS nb_bebes,
w_mouvements_externes.lieu_id AS lieu_id,
w_mouvements_externes.medecin_sejour_id as medecin_sejour_id,
CASE WHEN p_sejours.code_prevu = '1' OR p_calendrier.date > date(now_cerner) THEN '1' ELSE '0' END AS est_mouvement_previsionnel
FROM w_mouvements_externes
JOIN w_PERIODE ON 1=1
JOIN activite[PX].p_sejours ON w_mouvements_externes.HO_NUMSEJ = p_sejours.no_sejour AND p_sejours.etat = ''
JOIN base.p_calendrier ON (p_calendrier.date BETWEEN HO_DDEBS AND HO_DFINS AND p_calendrier.date <= now() + interval '1 month' )
ORDER BY w_mouvements_externes.HO_NUMSEJ, p_calendrier.date;
-- Séances
DROP TABLE IF EXISTS w_MOUV_HOSPI_seances;
CREATE TEMP TABLE w_MOUV_HOSPI_seances AS
SELECT HO_NUMSEJ, date(mh_ddeb) AS date_seance, to_char(MH_HDEB,'HH24MISS')::numeric AS heure_seance
FROM w_HOSPITALISATION_SELECT
JOIN w_MOUV_HOSPI_source ON w_HOSPITALISATION_SELECT.HO_NUM = w_MOUV_HOSPI_source.MH_HONUM
JOIN activite.t_divers On t_divers.code = 'CERNER_RAISONSEANCE'
WHERE MH_RSCODENT = ANY(string_to_array(t_divers.valeur,','))
;
UPDATE w_mouvements_sejour
SET nb_seances = 1
FROM w_MOUV_HOSPI_seances
WHERE w_mouvements_sejour.no_sejour = HO_NUMSEJ AND
w_mouvements_sejour.date = date_seance AND
heure_seance BETWEEN heure_debut AND heure_fin
;
UPDATE activite[PX].p_mouvements_sejour
SET nb_seances = 1, nb_ambulatoires = 0
FROM activite[PX].p_sejours
JOIN base.t_ghs ON ghs_id = t_ghs.oid
WHERE p_mouvements_sejour.no_sejour = p_sejours.no_sejour
AND trim(t_ghs.code) IN (9606,9616,9613,9614)
AND (p_mouvements_sejour.nb_seances = 0 OR nb_ambulatoires = 1)
;
UPDATE activite[PX].p_sejours
SET type_sejour = 5
FROM base.t_ghs
WHERE ghs_id = t_ghs.oid
AND trim(t_ghs.code) IN (9606,9616,9613,9614)
AND type_sejour != 5
;
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_passage_externe = 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', 'i_mouvements_sejour_1');
SELECT base.cti_disable_index('activite', 'i_mouvements_sejour_2');
SELECT base.cti_disable_index('activite', 'i_mouvements_sejour_3');
SELECT base.cti_disable_index('activite', 'i_mouvements_sejour_4');
SELECT base.cti_disable_index('activite', 'i_mouvements_sejour_5');
INSERT INTO activite[PX].p_mouvements_sejour(
no_sejour, date, nb_jours_js_non_inclus,
lieu_id, nb_entrees_directes, nb_sorties_directes,
nb_urgences, nb_externes, nb_passage_externe, 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 no_sejour, date,nb_jours_js_non_inclus,
lieu_id, nb_entrees_directes, nb_sorties_directes,
nb_urgences, nb_externes, nb_passage_externe, 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', 'i_mouvements_sejour_1');
SELECT base.cti_enable_index('activite', 'i_mouvements_sejour_2');
SELECT base.cti_enable_index('activite', 'i_mouvements_sejour_3');
SELECT base.cti_enable_index('activite', 'i_mouvements_sejour_4');
SELECT base.cti_enable_index('activite', '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'
FROM activite[PX].t_lieux
JOIN activite[PX].t_services_facturation ON service_facturation_id = t_services_facturation.oid
WHERE lieu_sortie_id = t_lieux.oid AND
t_services_facturation.type_sejour <> '0sauf5' AND
p_sejours.type_sejour <> '5' AND
p_sejours.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">
<sqlcmd><![CDATA[
SELECT activite[PX].cti_reorganize_sejour_pmsi();
UPDATE activite[PX].p_sejours SET
ghs_id = subview.ghs_id,
ghm_id = subview.ghm_id
FROM
(
SELECT sejour_id,
t_ghs_pmsi.code,
t_ghm_pmsi.code,
COALESCE(t_ghs.oid,0) AS ghs_id,
COALESCE(t_ghm.oid,0) AS ghm_id
FROM activite[PX].p_sejour_pmsi
JOIN pmsi.p_rss ON p_sejour_pmsi.rss_id = p_rss.oid
LEFT JOIN pmsi.t_ghs t_ghs_pmsi ON t_ghs_pmsi.oid = p_rss.ghs_id
LEFT JOIN pmsi.t_ghm t_ghm_pmsi ON t_ghm_pmsi.oid = p_rss.ghm_id
LEFT JOIN base.t_ghs ON t_ghs_pmsi.code = t_ghs.code AND t_ghm_pmsi.code NOT LIKE '99%'
LEFT JOIN base.t_ghm ON t_ghm_pmsi.code = t_ghm.code AND t_ghm_pmsi.code NOT LIKE '99%'
) subview
WHERE p_sejours.oid = subview.sejour_id AND
(
p_sejours.ghs_id <> subview.ghs_id OR
p_sejours.ghm_id <> subview.ghm_id
);
]]></sqlcmd>
</NODE>
</NODE>
<NODE name="FACTURE" label="RECUPERATION DES FACTURES">
<NODE label="Entêtes">
<sqlcmd><![CDATA[
DROP TABLE IF EXISTS w_FACTURE;
CREATE TEMP TABLE w_FACTURE AS
SELECT FAC_NUM::text AS FAC_NUM_CTI,
FAC_NUM,
FAC_HONUM,
HO_MANUMDOS AS FAC_MANUMDOS,
0::numeric AS FAC_ADCPT_BG,
''::text AS FAC_PYTYPE_CTI_BG,
''::text AS FAC_PYCODE_CTI_BG,
FAC_ADCPT AS FAC_ADCPT_HB,
''::text AS FAC_PYTYPE_CTI_HB,
''::text AS FAC_PYCODE_CTI_HB,
FAC_DATE,
FAC_EXER,
FAC_DATE AS FAC_DATE_VENT,
NULL::date AS FAC_DDEB,
NULL::date AS FAC_DFIN,
FAC_MONT,
0::numeric AS FAC_MONT_0,
0::numeric AS FAC_MONT_1,
0::numeric AS FAC_MONT_2,
0::numeric AS FAC_MONT_BG_1,
FAC_REGL,
0::numeric AS FAC_REGL_0,
0::numeric AS FAC_REGL_1,
0::numeric AS FAC_REGL_2,
FAC_ETAT,
FAC_COMM,
FAC_INV,
FAC_ETAB,
FAC_BORD,
FAC_DATE_LOT,
''::text AS FAC_SEANCE,
NULL::text[] AS FAC_SEANCE_array,
1::numeric AS sequence_index
FROM prod_cerner.FACTURE
LEFT JOIN prod_cerner.HOSPITALISATION ON FAC_HONUM = HO_NUM
WHERE FAC_HONUM IN (SELECT HO_NUM FROM w_HOSPITALISATION_SELECT);
UPDATE w_FACTURE
SET FAC_MANUMDOS = w_HOSPITALISATION_SELECT.HO_MANUMDOS
FROM w_HOSPITALISATION_SELECT
WHERE FAC_HONUM = HO_NUM AND
FAC_MANUMDOS IS NULL
;
-- date de vente selon exercice précédent
UPDATE w_FACTURE
SET FAC_DATE_VENT = to_date(FAC_EXER||'-12-31','YYYY-MM-DD')
WHERE date_part('year',FAC_DATE) <> FAC_EXER
;
ANALYSE w_FACTURE;
CREATE INDEX w_FACTURE_i1
ON w_FACTURE
USING btree
(FAC_NUM);
CREATE INDEX w_FACTURE_i2
ON w_FACTURE
USING btree
(FAC_HONUM);
CREATE INDEX w_FACTURE_i_FAC_SEANCE
ON w_FACTURE
USING btree
(FAC_SEANCE);
CREATE INDEX w_FACTURE_FAC_MANUMDOS
ON w_FACTURE
USING btree
(FAC_MANUMDOS);
UPDATE w_FACTURE SET
FAC_PYTYPE_CTI_HB =
CASE
WHEN AD_TYP = 'T' AND AD_PYTYPE IN ('1','2') THEN '1'
WHEN AD_TYP = 'T' AND AD_PYTYPE NOT IN ('1','2') THEN '2'
ELSE '0' END,
FAC_PYCODE_CTI_HB =
CASE
WHEN AD_TYP = 'T' THEN ('C'||AD_PYTYPE||AD_PYCODE)
ELSE '*PATIENT' END
FROM prod_cerner.ADRESSE
WHERE FAC_MANUMDOS = AD_MANUMDOS AND
FAC_ADCPT_HB = AD_CPT
;
DROP TABLE IF EXISTS w_FACTURE_DET;
CREATE TEMP TABLE w_FACTURE_DET AS
SELECT
'FAD'::text AS FAD_SOURCE,
FAD_NUM,
FAD_UFCODE,
FAD_TYPE,
FAD_DEB,
FAD_FIN,
FAD_HEU,
FAD_INCODE,
CASE
WHEN trim(FAD_CCAMREGR) <> '' THEN trim(FAD_CCAMREGR)
ELSE trim(FAD_CTCODE) END AS FAD_CTCODE,
CASE
WHEN trim(FAD_CCAMREGR) <> '' THEN trim(FAD_CCAMREGR)
WHEN trim(FAD_CTNB2) <> '' THEN trim(FAD_CTNB2)
ELSE trim(FAD_CTCODE) END AS FAD_CTNB2,
CASE
WHEN trim(FAD_CCAMREGR) <> '' THEN trim(FAD_CCAMREGR)
ELSE '' END AS FAD_CTACTE,
FAD_UFEXE,
FAD_INEXE,
FAD_COMPTE,
FAD_SEANCE,
FAC_ADCPT_HB AS FAD_CPT,
FAD_TAUDG,
FAD_PUFAC,
CASE WHEN FAD_MON < 0 AND FAD_NBR > 0 THEN 0 - FAD_NBR ELSE FAD_NBR END AS FAD_NBR,
FAD_MON,
CASE WHEN FAC_PYTYPE_CTI_HB NOT IN ('1','2') THEN FAD_MON ELSE 0 END AS FAD_MON_0,
CASE WHEN FAC_PYTYPE_CTI_HB = '1' THEN FAD_MON ELSE 0 END AS FAD_MON_1,
CASE WHEN FAC_PYTYPE_CTI_HB = '2' THEN FAD_MON ELSE 0 END AS FAD_MON_2,
0::numeric AS FAD_MON_BG_1
FROM prod_cerner.FACTURE_DET
JOIN w_FACTURE ON FAC_NUM = FAD_NUM;
INSERT INTO w_FACTURE_DET
SELECT
'FDG'::text AS FAD_SOURCE,
FDG_NUM,
FDG_UFCODE,
FDG_TYPE,
FDG_DEB,
FDG_FIN,
FDG_DEB AS FDG_HEU,
''::text AS FDG_INCODE,
trim(FDG_CTCODE) AS FDG_CTCODE,
trim(FDG_CTCODE) AS FDG_CTNB2,
''::text AS FDG_CTACTE,
''::text AS FDG_UFEXE,
''::text AS FDG_INEXE,
trim(FDG_COMPTE) AS FGD_COMPTE,
''::text AS FDG_SEANCE,
FDG_CPT,
FDG_TAUDG,
FDG_PU AS FDG_PUFAC,
FDG_NBR,
FDG_MON,
0::numeric AS FAD_MON_0,
0::numeric AS FAD_MON_1,
0::numeric AS FAD_MON_2,
FDG_MON AS FAD_MON_BG_1
FROM prod_cerner.FACTURE_DG
JOIN w_FACTURE ON FAC_NUM = FDG_NUM
;
UPDATE w_FACTURE_DET
SET FAD_CTNB2 = CT_LET
FROM prod_cerner.CODE_TARIF
WHERE FAD_CTCODE = CT_CODE AND
FAD_CTNB2 <> CT_LET AND
CT_LET <> ''
;
ANALYSE w_FACTURE_DET;
CREATE INDEX w_FACTURE_DET_i_FAD_NUM
ON w_FACTURE_DET
USING btree
(FAD_NUM);
DROP TABLE IF EXISTS w_FACTURE_DET_seance;
CREATE TEMP TABLE w_FACTURE_DET_seance AS
SELECT
FAD_NUM,
base.cti_array_accum(DISTINCT trim(FAD_SEANCE)) AS FAD_SEANCE_array
FROM w_FACTURE_DET
WHERE FAD_SEANCE <> ''
GROUP BY 1
;
ANALYSE w_FACTURE_DET_seance;
CREATE INDEX w_FACTURE_DET_seance_i1
ON w_FACTURE_DET_seance
USING btree
(FAD_NUM);
UPDATE w_FACTURE
SET FAC_SEANCE_array = FAD_SEANCE_array, FAC_SEANCE = COALESCE(FAD_SEANCE_array[1],'')
FROM w_FACTURE_DET_seance
WHERE w_FACTURE.FAC_NUM = w_FACTURE_DET_seance.FAD_NUM
;
SELECT base.cti_execute('
INSERT INTO w_FACTURE
SELECT
FAC_NUM_CTI,
FAC_NUM,
FAC_HONUM,
FAC_MANUMDOS,
FAC_ADCPT_BG,
FAC_PYTYPE_CTI_BG,
FAC_PYCODE_CTI_BG,
FAC_ADCPT_HB,
FAC_PYTYPE_CTI_HB,
FAC_PYCODE_CTI_HB,
FAC_DATE,
FAC_EXER,
FAC_DATE_VENT,
FAC_DDEB,
FAC_DFIN,
FAC_MONT,
FAC_MONT_0,
FAC_MONT_1,
FAC_MONT_2,
FAC_MONT_BG_1,
FAC_REGL,
FAC_REGL_0,
FAC_REGL_1,
FAC_REGL_2,
FAC_ETAT,
FAC_COMM,
FAC_INV,
FAC_ETAB,
FAC_BORD,
FAC_DATE_LOT,
FAC_SEANCE_array[subview.sequence_index] AS FAC_SEANCE,
NULL::text[] AS FAC_SEANCE_array,
subview.sequence_index
FROM w_FACTURE
JOIN (SELECT MAX(sequence_index)+1 AS sequence_index FROM w_FACTURE) subview ON 1=1
WHERE FAC_SEANCE_array[subview.sequence_index] IS NOT NULL
',50)
;
DROP TABLE IF EXISTS w_FACTURE_DET_fac;
CREATE TEMP TABLE w_FACTURE_DET_fac AS
SELECT
FAD_NUM,
trim(FAD_SEANCE) AS FAD_SEANCE,
SUM(FAD_MON) AS FAD_MON,
SUM(FAD_MON_0) AS FAD_MON_0,
SUM(FAD_MON_1) AS FAD_MON_1,
SUM(FAD_MON_2) AS FAD_MON_2,
SUM(FAD_MON_BG_1) AS FAD_MON_BG_1,
date(MIN(FAD_DEB)) AS FAD_DDEB,
date(MAX(FAD_FIN)) AS FAD_DFIN,
MAX(CASE WHEN FAD_SOURCE = 'FDG' THEN FAD_CPT ELSE 0 END) AS FAD_ADCPT_BG
FROM w_FACTURE_DET
GROUP BY 1,2
;
ANALYSE w_FACTURE_DET_fac;
CREATE INDEX w_FACTURE_DET_fac_i1
ON w_FACTURE_DET_fac
USING btree
(FAD_NUM);
UPDATE w_FACTURE SET
FAC_ADCPT_BG = FAD_ADCPT_BG,
FAC_MONT = w_FACTURE_DET_fac.FAD_MON,
FAC_MONT_0 = w_FACTURE_DET_fac.FAD_MON_0,
FAC_MONT_1 = w_FACTURE_DET_fac.FAD_MON_1,
FAC_MONT_2 = w_FACTURE_DET_fac.FAD_MON_2,
FAC_MONT_BG_1 = w_FACTURE_DET_fac.FAD_MON_BG_1,
FAC_DDEB = w_FACTURE_DET_fac.FAD_DDEB,
FAC_DFIN = w_FACTURE_DET_fac.FAD_DFIN
FROM w_FACTURE_DET_fac
WHERE w_FACTURE.FAC_NUM = w_FACTURE_DET_fac.FAD_NUM AND
w_FACTURE.FAC_SEANCE = w_FACTURE_DET_fac.FAD_SEANCE
;
UPDATE w_FACTURE SET
FAC_PYTYPE_CTI_BG =
CASE
WHEN AD_TYP = 'T' AND AD_PYTYPE IN ('1','2') THEN '1'
WHEN AD_TYP = 'T' AND AD_PYTYPE NOT IN ('1','2') THEN '2'
ELSE '0' END,
FAC_PYCODE_CTI_BG =
CASE
WHEN AD_TYP = 'T' THEN ('C'||AD_PYTYPE||AD_PYCODE)
ELSE '*PATIENT' END
FROM prod_cerner.ADRESSE
WHERE FAC_MANUMDOS = AD_MANUMDOS AND
FAC_ADCPT_BG = AD_CPT
;
UPDATE w_FACTURE
SET FAC_NUM_CTI = FAC_NUM || '.' || FAC_SEANCE
WHERE FAC_SEANCE <> '' AND
FAC_NUM IN
(
SELECT FAC_NUM
FROM w_FACTURE
GROUP BY 1
HAVING COUNT(*) > 1
)
;
-- Récupération des règlements et affectation aux factures
DROP TABLE IF EXISTS w_MOUV_COMPTA_REG;
CREATE TEMP TABLE w_MOUV_COMPTA_REG AS
SELECT MC_EXER,
MC_NUM,
MC_NUMT,
MC_LIGNE,
MC_COMPTE,
CASE
WHEN AD_TYP IS NULL THEN ''
WHEN AD_TYP = 'T' AND AD_PYTYPE IN ('1','2') THEN '1'
WHEN AD_TYP = 'T' AND AD_PYTYPE NOT IN ('1','2') THEN '2'
ELSE '0' END AS MC_PYTYPE_CTI_HB,
MC_DATECR,
MC_HONUM,
MC_MANUMDOS,
''::text AS MC_SEANCE,
MC_NUMFAC_LET,
MC_TYPE,
CASE WHEN MC_SENS = 'C' THEN MC_MON ELSE 0-MC_MON END AS MC_MON_REG,
MC_EXER*100000000000000+MC_NUM*10000000+MC_LIGNE AS MC_KEY,
''::text AS MC_FACNUM_CTI,
'0'::text AS MC_OK
FROM prod_cerner.MOUV_COMPTA
LEFT JOIN prod_cerner.FACTURE ON MC_NUMFAC_LET = FAC_NUM
LEFT JOIN prod_cerner.ADRESSE ON MC_MANUMDOS = AD_MANUMDOS AND
FAC_ADCPT = AD_CPT
WHERE MC_JRN <> 'JV' AND
MC_HONUM <> 0 AND
(MC_COMPTE LIKE '411%' OR MC_COMPTE LIKE '412%' OR MC_COMPTE LIKE '413%' OR MC_COMPTE LIKE '414%' OR MC_COMPTE LIKE '452%' OR MC_COMPTE LIKE '467%') AND
MC_HONUM IN (SELECT HO_NUM FROM w_HOSPITALISATION_SELECT)
;
UPDATE w_MOUV_COMPTA_REG
SET MC_PYTYPE_CTI_HB = subview.MC_PYTYPE_CTI_HB
FROM
(
SELECT MC_COMPTE_racine,
(MAX(ARRAY[to_char(nb,'FM000000000000'),MC_PYTYPE_CTI_HB]))[2] AS MC_PYTYPE_CTI_HB
FROM
(
SELECT
substr(MC_COMPTE,1,4) AS MC_COMPTE_racine, MC_PYTYPE_CTI_HB, count(*) AS nb
FROM w_MOUV_COMPTA_REG
WHERE MC_PYTYPE_CTI_HB <> ''
GROUP BY 1,2
ORDER BY 1,2
) subview
GROUP BY 1
) subview
WHERE substr(w_MOUV_COMPTA_REG.MC_COMPTE,1,4) = MC_COMPTE_racine AND
w_MOUV_COMPTA_REG.MC_PYTYPE_CTI_HB = ''
;
-- Ne pas tenir compte des règlements qui s'annulent
DELETE FROM w_MOUV_COMPTA_REG
USING
(
SELECT MC_HONUM, MC_NUMT, MC_DATECR, SUM(MC_MON_REG)
FROM w_MOUV_COMPTA_REG
GROUP BY 1,2,3
HAVING SUM(MC_MON_REG) = 0
) subview
WHERE w_MOUV_COMPTA_REG.MC_HONUM = subview.MC_HONUM AND
w_MOUV_COMPTA_REG.MC_NUMT = subview.MC_NUMT AND
w_MOUV_COMPTA_REG.MC_DATECR = subview.MC_DATECR
;
-- Ne pas tenir compte des règlements qui s'annulent (n° facture)
DELETE FROM w_MOUV_COMPTA_REG
USING
(
SELECT MC_HONUM, MC_NUMFAC_LET, MC_DATECR, SUM(MC_MON_REG)
FROM w_MOUV_COMPTA_REG
GROUP BY 1,2,3
HAVING SUM(MC_MON_REG) = 0
) subview
WHERE w_MOUV_COMPTA_REG.MC_HONUM = subview.MC_HONUM AND
w_MOUV_COMPTA_REG.MC_NUMFAC_LET = subview.MC_NUMFAC_LET AND
w_MOUV_COMPTA_REG.MC_DATECR = subview.MC_DATECR
;
-- Lettrage des factures. Cas d'une seule facture réglée par séjour
UPDATE w_MOUV_COMPTA_REG
SET MC_NUMFAC_LET = subview.MC_NUMFAC_LET
FROM
(
SELECT MC_HONUM, MAX(MC_NUMFAC_LET) AS MC_NUMFAC_LET
FROM w_MOUV_COMPTA_REG
WHERE MC_NUMT <> 0
GROUP BY 1
HAVING count(DISTINCT CASE WHEN MC_NUMFAC_LET > 0 THEN MC_NUMFAC_LET ELSE NULL END) = 1 AND
MAX(MC_NUMFAC_LET) > 0 AND MIN(MC_NUMFAC_LET) = 0
) subview
WHERE w_MOUV_COMPTA_REG.MC_HONUM = subview.MC_HONUM AND
w_MOUV_COMPTA_REG.MC_NUMFAC_LET = 0
;
-- Lettrage des factures. Cas d'une seule facture réglée par pièce
UPDATE w_MOUV_COMPTA_REG
SET MC_NUMFAC_LET = subview.MC_NUMFAC_LET
FROM
(
SELECT MC_HONUM, MC_NUMT, MAX(MC_NUMFAC_LET) AS MC_NUMFAC_LET
FROM w_MOUV_COMPTA_REG
WHERE MC_NUMT <> 0
GROUP BY 1,2
HAVING count(DISTINCT CASE WHEN MC_NUMFAC_LET > 0 THEN MC_NUMFAC_LET ELSE NULL END) = 1 AND
MAX(MC_NUMFAC_LET) > 0 AND MIN(MC_NUMFAC_LET) = 0
) subview
WHERE w_MOUV_COMPTA_REG.MC_HONUM = subview.MC_HONUM AND
w_MOUV_COMPTA_REG.MC_NUMFAC_LET = 0
;
-- Lettrage des factures. Cas d'une facture seule pour un montant réglé (plusieurs passages)
DROP TABLE IF EXISTS w_FACTURE_LET;
CREATE TEMP TABLE w_FACTURE_LET (
FAC_HONUM numeric,
FAC_REGL numeric,
FAC_DATE date,
FAC_NUM numeric,
FAC_nb numeric
)
;
DROP TABLE IF EXISTS w_MOUV_COMPTA_LET;
CREATE TEMP TABLE w_MOUV_COMPTA_LET (
MC_HONUM numeric,
MC_MON_REG numeric,
MC_DATECR date,
MC_nb numeric,
MC_KEY numeric
)
;
SELECT base.cti_execute(
'TRUNCATE w_FACTURE_LET
.,
INSERT INTO w_FACTURE_LET
SELECT FAC_HONUM, FAC_REGL, MIN(date(FAC_DATE)) AS FAC_DATE, (MIN(ARRAY[FAC_DATE::text,FAC_NUM::text]))[2]::numeric AS FAC_NUM, count(*) AS FAC_nb
FROM prod_cerner.FACTURE
WHERE FAC_INV = 0 AND
FAC_HONUM IN
(SELECT MC_HONUM FROM w_MOUV_COMPTA_REG WHERE MC_NUMFAC_LET = 0) AND
FAC_NUM NOT IN (SELECT MC_NUMFAC_LET FROM w_MOUV_COMPTA_REG WHERE MC_NUMFAC_LET <> 0)
GROUP BY 1,2
.,
TRUNCATE w_MOUV_COMPTA_LET
.,
INSERT INTO w_MOUV_COMPTA_LET
SELECT MC_HONUM, MC_MON_REG, DATE(min(MC_DATECR)) AS MC_DATECR, count(*) AS MC_nb,
MIN(MC_KEY) AS MC_KEY
FROM w_MOUV_COMPTA_REG
WHERE MC_NUMFAC_LET = 0
GROUP BY 1,2
.,
UPDATE w_MOUV_COMPTA_REG
SET MC_NUMFAC_LET = subview.FAC_NUM
FROM
(
SELECT w_MOUV_COMPTA_LET.MC_KEY, w_FACTURE_LET.FAC_NUM
FROM w_MOUV_COMPTA_LET
JOIN w_FACTURE_LET ON w_MOUV_COMPTA_LET.MC_HONUM = w_FACTURE_LET.FAC_HONUM AND
w_MOUV_COMPTA_LET.MC_MON_REG = w_FACTURE_LET.FAC_REGL AND
(FAC_DATE <= MC_DATECR OR FAC_nb = MC_nb)
) subview
WHERE w_MOUV_COMPTA_REG.MC_KEY = subview.MC_KEY
',100)
;
DROP TABLE IF EXISTS w_MOUV_COMPTA_LET;
CREATE TEMP TABLE w_MOUV_COMPTA_LET AS
SELECT MC_HONUM, MC_NUMFAC_LET, SUM(MC_MON_REG) AS MC_MON_REG
FROM w_MOUV_COMPTA_REG
WHERE MC_NUMFAC_LET <> 0
GROUP BY 1,2
;
UPDATE w_MOUV_COMPTA_REG
SET MC_NUMFAC_LET = subview.MC_NUMFAC_LET
FROM
(
SELECT w_MOUV_COMPTA_LET.MC_HONUM, w_MOUV_COMPTA_LET.MC_NUMFAC_LET, FAC_REGL,
w_MOUV_COMPTA_LET.MC_MON_REG,
w_MOUV_COMPTA_REG.MC_MON_REG,
w_MOUV_COMPTA_REG.MC_KEY
FROM w_MOUV_COMPTA_LET
JOIN prod_cerner.FACTURE ON FAC_HONUM = MC_HONUM AND
FAC_NUM = MC_NUMFAC_LET
JOIN w_MOUV_COMPTA_REG ON w_MOUV_COMPTA_REG.MC_HONUM = w_MOUV_COMPTA_LET.MC_HONUM AND w_MOUV_COMPTA_REG.MC_NUMFAC_LET = 0
WHERE FAC_REGL <> w_MOUV_COMPTA_LET.MC_MON_REG AND
w_MOUV_COMPTA_LET.MC_MON_REG + w_MOUV_COMPTA_REG.MC_MON_REG = FAC_REGL
) subview
WHERE w_MOUV_COMPTA_REG.MC_KEY = subview.MC_KEY
;
-- Lettrage des factures. Cas d'une facture seule pour un montant réglé (plusieurs passages)
DROP TABLE IF EXISTS w_FACTURE_LET;
CREATE TEMP TABLE w_FACTURE_LET (
FAC_HONUM numeric,
FAC_REGL numeric,
FAC_DATE date,
FAC_NUM numeric,
FAC_nb numeric
)
;
DROP TABLE IF EXISTS w_MOUV_COMPTA_LET;
CREATE TEMP TABLE w_MOUV_COMPTA_LET (
MC_HONUM numeric,
MC_MON_REG numeric,
MC_DATECR date,
MC_nb numeric,
MC_KEY numeric
)
;
SELECT base.cti_execute(
'TRUNCATE w_FACTURE_LET
.,
INSERT INTO w_FACTURE_LET
SELECT FAC_HONUM, FAC_REGL, MIN(date(FAC_DATE)) AS FAC_DATE, (MIN(ARRAY[FAC_DATE::text,FAC_NUM::text]))[2]::numeric AS FAC_NUM, count(*) AS FAC_nb
FROM prod_cerner.FACTURE
WHERE FAC_INV = 0 AND
FAC_HONUM IN
(SELECT MC_HONUM FROM w_MOUV_COMPTA_REG WHERE MC_NUMFAC_LET = 0) AND
FAC_NUM NOT IN (SELECT MC_NUMFAC_LET FROM w_MOUV_COMPTA_REG WHERE MC_NUMFAC_LET <> 0)
GROUP BY 1,2
.,
TRUNCATE w_MOUV_COMPTA_LET
.,
INSERT INTO w_MOUV_COMPTA_LET
SELECT MC_HONUM, MC_MON_REG, DATE(min(MC_DATECR)) AS MC_DATECR, count(*) AS MC_nb,
MIN(MC_KEY) AS MC_KEY
FROM w_MOUV_COMPTA_REG
WHERE MC_NUMFAC_LET = 0
GROUP BY 1,2
.,
UPDATE w_MOUV_COMPTA_REG
SET MC_NUMFAC_LET = subview.FAC_NUM
FROM
(
SELECT w_MOUV_COMPTA_LET.MC_KEY, w_FACTURE_LET.FAC_NUM
FROM w_MOUV_COMPTA_LET
JOIN w_FACTURE_LET ON w_MOUV_COMPTA_LET.MC_HONUM = w_FACTURE_LET.FAC_HONUM AND
w_MOUV_COMPTA_LET.MC_MON_REG = w_FACTURE_LET.FAC_REGL
) subview
WHERE w_MOUV_COMPTA_REG.MC_KEY = subview.MC_KEY
',100)
;
SELECT base.cti_execute(
'TRUNCATE w_FACTURE_LET
.,
INSERT INTO w_FACTURE_LET
SELECT FAC_HONUM, FAC_MONT AS FAC_REGL, MIN(date(FAC_DATE)) AS FAC_DATE, (MIN(ARRAY[FAC_DATE::text,FAC_NUM::text]))[2]::numeric AS FAC_NUM, count(*) AS FAC_nb
FROM prod_cerner.FACTURE
WHERE FAC_INV = 0 AND
FAC_REGL = 0 AND
FAC_HONUM IN
(SELECT MC_HONUM FROM w_MOUV_COMPTA_REG WHERE MC_NUMFAC_LET = 0) AND
FAC_NUM NOT IN (SELECT MC_NUMFAC_LET FROM w_MOUV_COMPTA_REG WHERE MC_NUMFAC_LET <> 0)
GROUP BY 1,2
.,
TRUNCATE w_MOUV_COMPTA_LET
.,
INSERT INTO w_MOUV_COMPTA_LET
SELECT MC_HONUM, MC_MON_REG, DATE(min(MC_DATECR)) AS MC_DATECR, count(*) AS MC_nb,
MIN(MC_KEY) AS MC_KEY
FROM w_MOUV_COMPTA_REG
WHERE MC_NUMFAC_LET = 0
GROUP BY 1,2
.,
UPDATE w_MOUV_COMPTA_REG
SET MC_NUMFAC_LET = subview.FAC_NUM
FROM
(
SELECT w_MOUV_COMPTA_LET.MC_KEY, w_FACTURE_LET.FAC_NUM
FROM w_MOUV_COMPTA_LET
JOIN w_FACTURE_LET ON w_MOUV_COMPTA_LET.MC_HONUM = w_FACTURE_LET.FAC_HONUM AND
w_MOUV_COMPTA_LET.MC_MON_REG = w_FACTURE_LET.FAC_REGL AND
(FAC_DATE <= MC_DATECR OR FAC_nb = MC_nb)
) subview
WHERE w_MOUV_COMPTA_REG.MC_KEY = subview.MC_KEY
',100)
;
-- Lettrage des factures. Affectation facture CTI (facture + passage) mono facture
DROP TABLE IF EXISTS w_FACTURE_reg;
CREATE TEMP TABLE w_FACTURE_reg AS
SELECT FAC_NUM,
COUNT(DISTINCT FAC_NUM_CTI),
COUNT(DISTINCT FAC_NUM_CTI) AS nb,
(MAX(ARRAY[FAC_DATE::text,FAC_NUM_CTI]))[2] AS FAC_NUM_CTI_LAST,
SUM(FAC_MONT_0 + FAC_MONT_1 + FAC_MONT_2) AS FAC_MONT_HBG
FROM w_FACTURE
GROUP BY 1
;
UPDATE w_MOUV_COMPTA_REG
SET MC_FACNUM_CTI = FAC_NUM_CTI_LAST,
MC_OK = '1'
FROM w_FACTURE_reg
WHERE w_MOUV_COMPTA_REG.MC_NUMFAC_LET = w_FACTURE_reg.FAC_NUM AND
nb = 1
;
-- Lettrage des factures. Affectation facture CTI (facture + passage) plusieurs factures sur total identique
INSERT INTO w_MOUV_COMPTA_REG
SELECT
MC_EXER,
MC_NUM,
MC_NUMT,
MC_LIGNE,
MC_COMPTE,
MC_PYTYPE_CTI_HB,
MC_DATECR,
MC_HONUM,
MC_MANUMDOS,
MC_SEANCE,
MC_NUMFAC_LET,
MC_TYPE,
FAC_MONT_0 + FAC_MONT_1 + FAC_MONT_2 AS MC_MON_REG,
MC_KEY,
w_FACTURE.FAC_NUM_CTI AS MC_FACNUM_CTI,
'1'::text AS MC_OK
FROM w_MOUV_COMPTA_REG
JOIN w_FACTURE_reg ON w_MOUV_COMPTA_REG.MC_NUMFAC_LET = w_FACTURE_reg.FAC_NUM
JOIN w_FACTURE ON w_MOUV_COMPTA_REG.MC_NUMFAC_LET = w_FACTURE.FAC_NUM
WHERE
MC_OK = '0' AND
nb > 1 AND
MC_MON_REG = FAC_MONT_HBG
;
DELETE FROM w_MOUV_COMPTA_REG
WHERE MC_OK = '0' AND
MC_KEY IN (SELECT MC_KEY FROM w_MOUV_COMPTA_REG WHERE MC_OK = '1')
;
-- Lettrage des factures. Affectation facture CTI (facture + passage) plusieurs factures sur total identique inversé (remboursement)
INSERT INTO w_MOUV_COMPTA_REG
SELECT
MC_EXER,
MC_NUM,
MC_NUMT,
MC_LIGNE,
MC_COMPTE,
MC_PYTYPE_CTI_HB,
MC_DATECR,
MC_HONUM,
MC_MANUMDOS,
MC_SEANCE,
MC_NUMFAC_LET,
MC_TYPE,
0 - (FAC_MONT_0 + FAC_MONT_1 + FAC_MONT_2) AS MC_MON_REG,
MC_KEY,
w_FACTURE.FAC_NUM_CTI AS MC_FACNUM_CTI,
'1'::text AS MC_OK
FROM w_MOUV_COMPTA_REG
JOIN w_FACTURE_reg ON w_MOUV_COMPTA_REG.MC_NUMFAC_LET = w_FACTURE_reg.FAC_NUM
JOIN w_FACTURE ON w_MOUV_COMPTA_REG.MC_NUMFAC_LET = w_FACTURE.FAC_NUM
WHERE
MC_OK = '0' AND
nb > 1 AND
MC_MON_REG = 0-FAC_MONT_HBG
;
DELETE FROM w_MOUV_COMPTA_REG
WHERE MC_OK = '0' AND
MC_KEY IN (SELECT MC_KEY FROM w_MOUV_COMPTA_REG WHERE MC_OK = '1')
;
-- Création des factures fictives CTI sur règlements non lettrés
UPDATE w_MOUV_COMPTA_REG
SET MC_FACNUM_CTI =
CASE WHEN MC_NUMFAC_LET <> 0 THEN MC_NUMFAC_LET ELSE MC_HONUM END::text || '.' || 'RG',
MC_OK = '1'
WHERE MC_OK = '0'
;
UPDATE w_MOUV_COMPTA_REG
SET MC_SEANCE = subview.HO_SEANCE
FROM
(
SELECT MC_KEY, MAX(w_HOSPITALISATION_SELECT_HONUM.HO_SEANCE) AS HO_SEANCE
FROM w_MOUV_COMPTA_REG
LEFT JOIN w_HOSPITALISATION_SELECT ON MC_HONUM = w_HOSPITALISATION_SELECT.HO_NUM AND
MC_SEANCE = w_HOSPITALISATION_SELECT.HO_SEANCE
JOIN w_HOSPITALISATION_SELECT w_HOSPITALISATION_SELECT_HONUM ON MC_HONUM = w_HOSPITALISATION_SELECT_HONUM.HO_NUM
WHERE MC_FACNUM_CTI LIKE '%.RG' AND
w_HOSPITALISATION_SELECT.HO_NUM IS NULL
GROUP BY 1
) subview
WHERE w_MOUV_COMPTA_REG.MC_KEY = subview.MC_KEY
;
INSERT INTO w_FACTURE
SELECT
MC_FACNUM_CTI,
MC_NUMFAC_LET AS FAC_NUM,
MC_HONUM AS HONUM,
COALESCE(HO_MANUMDOS,MC_MANUMDOS,0),
0::numeric AS FAC_ADCPT_BG,
'' AS FAC_PYTYPE_CTI_BG,
'' AS FAC_PYCODE_CTI_BG,
0::numeric AS FAC_ADCPT_HB,
MAX(MC_PYTYPE_CTI_HB) AS FAC_PYTYPE_CTI_HB,
'' AS FAC_PYCODE_CTI_HB,
MIN(MC_DATECR) AS FAC_DATE,
MIN(MC_EXER) AS FAC_EXER,
MIN(MC_DATECR) AS FAC_DATE_VENT,
MIN(HO_DDEB) AS FAC_DDEB,
MAX(HO_DFIN) AS FAC_DFIN,
0::numeric AS FAC_MONT,
0::numeric AS FAC_MONT_0,
0::numeric AS FAC_MONT_1,
0::numeric AS FAC_MONT_2,
0::numeric AS FAC_MONT_BG_1,
0::numeric AS FAC_REGL,
0::numeric AS FAC_REGL_0,
0::numeric AS FAC_REGL_1,
0::numeric AS FAC_REGL_2,
0::numeric AS FAC_ETAT,
0::numeric AS FAC_COMM,
0::numeric AS FAC_INV,
''::text AS FAC_ETAB,
0::numeric AS FAC_BORD,
'20991231' AS FAC_DATE_LOT,
MAX(MC_SEANCE) AS FAC_SEANCE,
NULL::text[] AS FAC_SEANCE_array,
0
FROM w_MOUV_COMPTA_REG
LEFT JOIN prod_cerner.HOSPITALISATION ON MC_HONUM = HO_NUM
WHERE MC_FACNUM_CTI LIKE '%.RG'
GROUP BY 1,2,3,4
;
UPDATE w_FACTURE SET
FAC_REGL = MC_MON_REG,
FAC_REGL_0 = CASE WHEN FAC_PYTYPE_CTI_HB = '0' THEN MC_MON_REG ELSE 0 END,
FAC_REGL_1 = CASE WHEN FAC_PYTYPE_CTI_HB = '1' THEN MC_MON_REG ELSE 0 END,
FAC_REGL_2 = CASE WHEN FAC_PYTYPE_CTI_HB = '2' THEN MC_MON_REG ELSE 0 END
FROM
(
SELECT MC_FACNUM_CTI, SUM(MC_MON_REG) AS MC_MON_REG
FROM w_MOUV_COMPTA_REG
GROUP BY 1
) subview
WHERE w_FACTURE.FAC_NUM_CTI = MC_FACNUM_CTI AND
(
FAC_REGL <> MC_MON_REG OR
FAC_REGL_0 <> CASE WHEN FAC_PYTYPE_CTI_HB = '0' THEN MC_MON_REG ELSE 0 END OR
FAC_REGL_1 <> CASE WHEN FAC_PYTYPE_CTI_HB = '1' THEN MC_MON_REG ELSE 0 END OR
FAC_REGL_2 <> CASE WHEN FAC_PYTYPE_CTI_HB = '2' THEN MC_MON_REG ELSE 0 END
)
;
UPDATE w_FACTURE
SET FAC_REGL = FAC_REGL_0+FAC_REGL_1+FAC_REGL_2
WHERE FAC_REGL <> FAC_REGL_0+FAC_REGL_1+FAC_REGL_2
;
-- Préparation factures CTI
DROP TABLE IF EXISTS w_factures;
CREATE TEMP TABLE w_factures AS
SELECT
FAC_NUM,
FAC_SEANCE,
nextval('activite[PX].s_factures'::regclass) AS oid,
p_sejours.oid AS sejour_id,
p_sejours.no_sejour,
FAC_NUM_CTI AS no_facture,
FAC_NUM_CTI AS no_facture_reference,
0::bigint AS facture_reference_id,
''::text AS no_facture_od_avoir,
0::bigint AS facture_od_avoir_id,
FAC_DDEB AS date_debut,
FAC_DFIN 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,
CASE WHEN FAC_NUM_CTI LIKE '%.RG' THEN '9' WHEN FAC_MONT < 0 THEN '1' ELSE '0' END AS type_facture,
CASE WHEN FAC_MONT < 0 THEN 1 ELSE 0 END AS nb_rejets,
'1' AS code_facture,
date(FAC_DATE) AS date_facture,
'1' AS code_vente,
to_char(FAC_DATE_VENT,'YYYYMM')::numeric AS mois_vente,
date(FAC_DATE_VENT) AS date_vente,
'' AS code_cloture,
'' AS particularite_t2a,
p_sejours.tiers_payant_0_id,
p_sejours.tiers_payant_1_id,
p_sejours.tiers_payant_2_id,
p_sejours.tiers_payant_22_id,
FAC_MONT AS montant_facture_c,
0::numeric AS montant_facture_h,
FAC_MONT_0 AS montant_facture_0_c,
0::numeric AS montant_facture_0_h,
FAC_MONT_1 + FAC_MONT_BG_1 AS montant_facture_1_c,
0::numeric AS montant_facture_1_h,
FAC_MONT_2 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,
FAC_MONT_0 + FAC_MONT_1 + FAC_MONT_2 AS montant_comptabilise_c,
0::numeric AS montant_comptabilise_h,
FAC_MONT_0 AS montant_comptabilise_0_c,
0::numeric AS montant_comptabilise_0_h,
FAC_MONT_1 AS montant_comptabilise_1_c,
0::numeric AS montant_comptabilise_1_h,
FAC_MONT_2 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,
FAC_MONT_BG_1 AS montant_comptabilise_budget_global_c,
FAC_REGL AS montant_regle_c,
0::numeric AS montant_regle_h,
FAC_REGL_0 AS montant_regle_0_c,
0::numeric AS montant_regle_0_h,
FAC_REGL_1 AS montant_regle_1_c,
0::numeric AS montant_regle_1_h,
FAC_REGL_2 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,
CASE WHEN FAC_PYTYPE_CTI_HB = '0' AND FAC_BORD > 0 THEN '1' ELSE '0' END AS code_expedie_0,
CASE WHEN (FAC_PYTYPE_CTI_HB = '1' OR FAC_PYTYPE_CTI_HB = '1') AND FAC_BORD > 0 THEN '1' ELSE '0' END AS code_expedie_1,
CASE WHEN FAC_PYTYPE_CTI_HB = '2' AND FAC_BORD > 0 THEN '1' ELSE '0' END AS code_expedie_2,
'0' AS code_expedie_22,
CASE WHEN FAC_DATE_LOT IS NOT NULL THEN date(FAC_DATE_LOT) ELSE '20991231' END date_expedition,
CASE WHEN FAC_PYTYPE_CTI_HB = '0' AND FAC_DATE_LOT IS NOT NULL THEN date(FAC_DATE_LOT) ELSE '20991231' END AS date_expedition_0,
CASE WHEN (FAC_PYTYPE_CTI_HB = '1' OR FAC_PYTYPE_CTI_HB = '1') AND FAC_DATE_LOT IS NOT NULL THEN date(FAC_DATE_LOT) ELSE '20991231' END AS date_expedition_1,
CASE WHEN FAC_PYTYPE_CTI_HB = '2' AND FAC_DATE_LOT IS NOT NULL THEN date(FAC_DATE_LOT) ELSE '20991231' END AS date_expedition_2,
'20991231'::date AS date_expedition_22,
CASE WHEN FAC_PYTYPE_CTI_HB = '0' AND FAC_BORD > 0 THEN FAC_BORD::text ELSE '' END AS no_bordereau_0,
CASE WHEN (FAC_PYTYPE_CTI_HB = '1' OR FAC_PYTYPE_CTI_HB = '1') AND FAC_BORD > 0 THEN FAC_BORD::text ELSE '' END AS no_bordereau_1,
CASE WHEN FAC_PYTYPE_CTI_HB = '2' AND FAC_BORD > 0 THEN FAC_BORD::text ELSE '' END AS no_bordereau_2,
''::text AS no_bordereau_22,
'0001-01-01'::date AS date_solde,
'0001-01-01'::date AS date_solde_c,
'0001-01-01'::date AS date_solde_h,
'0001-01-01'::date AS date_solde_0_c,
'0001-01-01'::date AS date_solde_0_h,
'0001-01-01'::date AS date_solde_1_c,
'0001-01-01'::date AS date_solde_1_h,
'0001-01-01'::date AS date_solde_2_c,
'0001-01-01'::date AS date_solde_2_h,
'0001-01-01'::date AS date_solde_22_c,
'0001-01-01'::date AS date_solde_22_h
FROM w_FACTURE
JOIN w_HOSPITALISATION_SELECT ON
FAC_HONUM = HO_NUM AND
FAC_SEANCE = HO_SEANCE
JOIN activite[PX].p_sejours ON w_HOSPITALISATION_SELECT.sejour_id = p_sejours.oid
;
CREATE INDEX w_factures_i1
ON w_factures
USING btree
(no_facture);
CREATE INDEX w_factures_FAC_NUM
ON w_factures
USING btree
(FAC_NUM);
CREATE INDEX w_factures_FAC_SEANCE
ON w_factures
USING btree
(FAC_SEANCE);
UPDATE w_factures
SET facture_od_avoir_id = w_factures_od_avoir.oid
FROM w_factures w_factures_od_avoir
WHERE w_factures.no_facture_od_avoir = w_factures_od_avoir.no_facture
;
UPDATE w_factures
SET type_facture = 'X'
WHERE w_factures.no_facture_od_avoir <> '0' AND
w_factures.no_facture_od_avoir <> '' AND
w_factures.type_facture = '0'
;
UPDATE w_factures
SET no_facture_reference = subview.no_facture_reference
FROM
(SELECT sejour_id,
(MAX(ARRAY[date_facture::text,no_facture]))[2] AS no_facture_reference
FROM w_factures
WHERE type_facture = '0'
GROUP BY 1
) subview
WHERE w_factures.sejour_id = subview.sejour_id AND
w_factures.no_facture_reference <> subview.no_facture_reference
;
UPDATE w_factures
SET facture_reference_id = w_factures_reference.oid
FROM w_factures w_factures_reference
WHERE w_factures.no_facture_reference = w_factures_reference.no_facture
;
truncate activite[PX].p_factures;
SELECT base.cti_disable_index('activite', 'i_factures_3');
SELECT base.cti_disable_index('activite', 'i_factures_4');
SELECT base.cti_disable_index('activite', 'i_factures_5');
SELECT base.cti_disable_index('activite', 'i_factures_6');
SELECT base.cti_disable_index('activite', 'i_factures_7');
SELECT base.cti_disable_index('activite', 'i_factures_8');
SELECT base.cti_disable_index('activite', 'i_factures_9');
SELECT base.cti_disable_index('activite', 'i_factures_10');
SELECT base.cti_disable_index('activite', 'i_factures_11');
SELECT base.cti_disable_index('activite', 'i_factures_12');
SELECT base.cti_disable_index('activite', 'i_factures_13');
SELECT base.cti_disable_index('activite', '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_comptabilise_budget_global_c,
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
)
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_comptabilise_budget_global_c,
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
FROM w_factures
;
SELECT base.cti_enable_index('activite', 'i_factures_3');
SELECT base.cti_enable_index('activite', 'i_factures_4');
SELECT base.cti_enable_index('activite', 'i_factures_5');
SELECT base.cti_enable_index('activite', 'i_factures_6');
SELECT base.cti_enable_index('activite', 'i_factures_7');
SELECT base.cti_enable_index('activite', 'i_factures_8');
SELECT base.cti_enable_index('activite', 'i_factures_9');
SELECT base.cti_enable_index('activite', 'i_factures_10');
SELECT base.cti_enable_index('activite', 'i_factures_11');
SELECT base.cti_enable_index('activite', 'i_factures_12');
SELECT base.cti_enable_index('activite', 'i_factures_13');
SELECT base.cti_enable_index('activite', 'i_factures_14');
-- 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.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 NOT NULL AND date_sortie - date_entree < 30 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 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;
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;
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
);
]]></sqlcmd>
</NODE>
<NODE label="Lignes non facturées Clinique">
<sqlcmd><![CDATA[
]]></sqlcmd>
</NODE>
<NODE label="Lignes factures Clinique">
<sqlcmd><![CDATA[
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,
w_factures.no_sejour,
w_factures.oid AS facture_id,
w_factures.no_facture AS no_facture,
w_factures.date_vente,
1::numeric AS coefficient,
1::numeric AS coefficient_mco,
t_rubriques_facturation.oid AS rubrique_facturation_id,
t_rubriques_facturation.oid AS rubrique_comptabilisation_id,
t_prestations.oid AS prestation_id,
t_prestations.code AS prestation_code,
t_prestations.type_ventilation_jour AS prestation_type_ventilation_jour,
COALESCE(t_compte.oid,0) AS compte_produit_id,
p_sejours.lieu_sortie_id AS lieu_id,
1::bigint AS origine_facturation_id,
FAD_PUFAC AS prix_unitaire,
0::numeric AS taux_0,
FAD_TAUDG AS taux_1,
0::numeric AS taux_2,
0::numeric AS taux_22,
date(FAD_DEB) AS date_debut,
date(FAD_FIN) AS date_fin,
FAD_NBR AS nb_rubrique,
FAD_NBR AS nb_prestation,
FAD_MON AS montant_facture,
FAD_MON_0 AS montant_facture_0,
FAD_MON_1+FAD_MON_BG_1 AS montant_facture_1,
FAD_MON_2 AS montant_facture_2,
0::numeric AS montant_facture_22,
FAD_MON_0+FAD_MON_1+FAD_MON_2 AS montant_comptabilise,
FAD_MON_0 AS montant_comptabilise_0,
FAD_MON_1 AS montant_comptabilise_1,
FAD_MON_2 AS montant_comptabilise_2,
0::numeric AS montant_comptabilise_22,
FAD_MON_BG_1 AS montant_comptabilise_budget_global_1,
0::numeric AS rubrique_facture_id
FROM w_FACTURE_DET
JOIN w_factures ON w_factures.FAC_NUM = w_FACTURE_DET.FAD_NUM AND
w_factures.FAC_SEANCE = w_FACTURE_DET.FAD_SEANCE AND
w_factures.no_facture NOT LIKE '%.RG'
JOIN activite[PX].p_sejours ON w_factures.no_sejour = p_sejours.no_sejour
LEFT JOIN activite[PX].t_rubriques_facturation ON FAD_CTCODE = t_rubriques_facturation.code_original
LEFT JOIN activite.t_prestations ON FAD_CTNB2 = t_prestations.code
LEFT JOIN activite[PX].t_compte ON FAD_COMPTE = t_compte.code
;
CREATE INDEX w_factures_lignes_c_i1
ON w_factures_lignes_c
USING btree
(sequence);
CREATE INDEX w_factures_lignes_c_i2
ON w_factures_lignes_c
USING btree
(prestation_id);
-- Eclatement des supplements par jour
DROP TABLE IF EXISTS w_factures_lignes_sup_c;
CREATE TEMP TABLE w_factures_lignes_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 prestation_code = 'GHS' THEN date(date_entree + interval '1 day') ELSE date(date_debut + interval '1 day') END AS date_debut_det,
CASE WHEN prestation_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 prestation_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
WHERE
(
prestation_code IN ('PJ', 'FJ', 'SSM', 'GHS', 'EXH', 'SRC', 'REA', 'STF', 'NN1', 'NN2', 'NN3', 'CP', 'CPC', 'SHO') OR
prestation_type_ventilation_jour = '1'
)
AND
(
(nb_prestation > 1 or nb_prestation < -1 OR
(prestation_code = 'GHS' 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,
no_sejour,
facture_id,
no_facture,
date_vente,
coefficient,
coefficient_mco,
rubrique_facturation_id,
rubrique_comptabilisation_id,
prestation_id,
prestation_code,
prestation_type_ventilation_jour,
compte_produit_id,
lieu_id,
origine_facturation_id,
prix_unitaire,
taux_0,
taux_1,
taux_2,
taux_22,
date AS date_debut,
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,
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,
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,
round(montant_comptabilise_budget_global_1 / ABS(nb_det),2) AS montant_comptabilise_budget_global_1,
rubrique_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_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_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;
-- Ajout des lignes
INSERT INTO w_factures_lignes_c(
sequence,
no_sejour,
facture_id,
no_facture,
date_vente,
coefficient,
coefficient_mco,
rubrique_facturation_id,
rubrique_comptabilisation_id,
prestation_id,
prestation_code,
prestation_type_ventilation_jour,
compte_produit_id,
lieu_id,
origine_facturation_id,
prix_unitaire,
taux_0,
taux_1,
taux_2,
taux_22,
date_debut,
date_fin,
nb_rubrique,
nb_prestation,
montant_facture,
montant_facture_0,
montant_facture_1,
montant_facture_2,
montant_facture_22,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
montant_comptabilise_budget_global_1,
rubrique_facture_id)
SELECT
sequence,
no_sejour,
facture_id,
no_facture,
date_vente,
coefficient,
coefficient_mco,
rubrique_facturation_id,
rubrique_comptabilisation_id,
prestation_id,
prestation_code,
prestation_type_ventilation_jour,
compte_produit_id,
lieu_id,
origine_facturation_id,
prix_unitaire,
taux_0,
taux_1,
taux_2,
taux_22,
date_debut,
date_fin,
nb_rubrique,
nb_prestation,
montant_facture,
montant_facture_0,
montant_facture_1,
montant_facture_2,
montant_facture_22,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
montant_comptabilise_budget_global_1,
rubrique_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 AND
nb_externes <> 1;
-- 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', 'i_factures_lignes_c_1');
SELECT base.cti_disable_index('activite', 'i_factures_lignes_c_2');
SELECT base.cti_disable_index('activite', 'i_factures_lignes_c_3');
SELECT base.cti_disable_index('activite', 'i_factures_lignes_c_4');
SELECT base.cti_disable_index('activite', 'i_factures_lignes_c_5');
SELECT base.cti_disable_index('activite', 'i_factures_lignes_c_6');
SELECT base.cti_disable_index('activite', 'i_factures_lignes_c_7');
SELECT base.cti_disable_index('activite', '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,
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,
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,
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,
montant_comptabilise_budget_global_1,
origine_facturation_id
FROM w_factures_lignes_c
WHERE montant_facture <> 0;
SELECT base.cti_enable_index('activite', 'i_factures_lignes_c_1');
SELECT base.cti_enable_index('activite', 'i_factures_lignes_c_2');
SELECT base.cti_enable_index('activite', 'i_factures_lignes_c_3');
SELECT base.cti_enable_index('activite', 'i_factures_lignes_c_4');
SELECT base.cti_enable_index('activite', 'i_factures_lignes_c_5');
SELECT base.cti_enable_index('activite', 'i_factures_lignes_c_6');
SELECT base.cti_enable_index('activite', 'i_factures_lignes_c_7');
SELECT base.cti_enable_index('activite', 'i_factures_lignes_c_8');
]]></sqlcmd>
</NODE>
<NODE label="Budget global MCO">
<condition><![CDATA[
"[ENV_TYPEETS]" != "1" && "[ENV_WITHPMSI]" == "1"
]]></condition>
<sqlcmd><![CDATA[
-- 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
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
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
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
t_prestations_activite.oid IS NULL
GROUP BY 1,2,3,4;
-- Lignes PMSI à ajouter
DROP TABLE IF EXISTS w_sejours_budget_global;
CREATE TEMP TABLE w_sejours_budget_global AS
SELECT
p_sejour_pmsi.rss_id,
MAX(p_sejour_pmsi.sejour_id) AS sejour_id,
(MAX(Array[to_char(p_sejour_pmsi.sejour_id,'FM000000000000'),p_sejours.no_sejour]))[2]::text AS no_sejour,
(MAX(CASE WHEN p_factures.montant_comptabilise_budget_global_c > 0 AND date_part('year',p_factures.date_facture) = date_part('year',p_sejours.date_sortie) THEN Array[to_char(p_sejour_pmsi.sejour_id,'FM000000000000'),p_factures.no_facture] ELSE NULL END))[2]::text AS no_facture_budget_global,
(MAX(CASE WHEN p_factures.montant_facture_c > 0 AND date_part('year',p_factures.date_facture) = date_part('year',p_sejours.date_sortie) THEN Array[to_char(p_sejour_pmsi.sejour_id,'FM000000000000'),p_factures.no_facture] ELSE NULL END))[2]::text AS no_facture_hors_budget_global,
(MAX(Array[p_sejour_pmsi.sejour_id,p_sejours.lieu_sortie_id]))[2] AS lieu_sortie_id
FROM activite[PX].p_sejour_pmsi
JOIN activite[PX].p_sejours ON p_sejour_pmsi.sejour_id = p_sejours.oid
LEFT JOIN activite[PX].p_factures ON p_factures.no_sejour = p_sejours.no_sejour
WHERE
p_sejour_pmsi.sejour_id IS NOT NULL AND
p_sejour_pmsi.sejour_id <> 0 AND
p_sejour_pmsi.rss_id <> 0
GROUP BY 1;
-- Suppression des lignes issues de la facturation
DELETE FROM activite[PX].p_factures_lignes_c
WHERE montant_comptabilise_budget_global_1 <> 0 AND
no_facture IN
(SELECT no_facture
FROM activite[PX].p_factures
JOIN w_sejours_budget_global ON p_factures.no_sejour = w_sejours_budget_global.no_sejour AND w_sejours_budget_global.rss_id <> 0
)
;
DELETE FROM activite[PX].p_factures_lignes_c
WHERE montant_comptabilise_budget_global_1 <> 0 AND
no_facture IN
(SELECT no_facture
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 t_services_facturation.oid = service_facturation_id AND type_t2a = '1'
)
;
-- Génération des lignes venant du pmsi
DROP TABLE IF EXISTS w_factures_lignes_pmsi;
CREATE TEMP TABLE w_factures_lignes_pmsi AS
SELECT
w_sejours_budget_global.no_sejour,
w_sejours_budget_global.sejour_id,
COALESCE(w_sejours_budget_global.no_facture_budget_global,w_sejours_budget_global.no_facture_hors_budget_global,w_sejours_budget_global.no_sejour || '.BG') AS no_facture,
0::bigint AS facture_id,
CASE WHEN p_rsf_detail.type = 'C' THEN 'H' ELSE 'C' END AS clinique_honoraire,
p_rsf_detail.date_debut,
p_rsf_detail.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,
p_rsf_detail.sejour_remboursable AS montant_facture,
0::numeric AS montant_facture_0,
p_rsf_detail.sejour_remboursable 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,
w_sejours_budget_global.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,
1::bigint 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.p_rsf_total ON p_rss.oid = p_rsf_total.rss_id AND p_rsf_total.valorise_fides IS DISTINCT FROM 1
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 w_sejours_budget_global ON p_rss.oid = w_sejours_budget_global.rss_id
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.date_sortie >= '[ENV_ADM_ANNEEDEBUT]0101' AND
operation_lamda IS DISTINCT FROM '1' AND
operation_lamda IS DISTINCT FROM '2' AND
p_rss.traitement_epmsi IN ('30','31','32','33') ;
-- 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,
'1'::text AS code_facture,
MAX(p_sejours.date_sortie) AS date_facture,
MAX('1') AS code_vente,
MAX(to_char(p_sejours.date_sortie,'YYYYMM')::numeric) AS mois_vente,
MAX(p_sejours.date_sortie) AS date_solde,
'0'::text AS particularite_t2a,
MAX(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,
''::text 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
WHERE w_factures_lignes_pmsi.no_facture LIKE '%BG'
GROUP BY 1,2,3,4,5;
-- 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, 'PMSIMCO' AS 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 ;
-- Eclatement des supplements par jour
DROP TABLE IF EXISTS w_factures_lignes_sup_c;
CREATE TEMP TABLE w_factures_lignes_sup_c AS
SELECT
p_factures_lignes_c.CTID AS from_CTID,
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(p_factures_lignes_c.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(p_factures_lignes_c.date_debut + ((ABS(nb_prestation)-1) || ' day')::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,
p_factures_lignes_c.*
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 AND p_sejours.etat = ''
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 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 activite[PX].p_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
from_CTID,
no_facture,
date AS date_debut,
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,
coefficient,
coefficient_mco,
rubrique_facturation_id,
prestation_id,
compte_produit_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,
taux_0,
taux_1,
taux_2,
taux_22,
finess,
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 date_debut BETWEEN p_calendrier.date - ABS(nb_det)::integer + 1 AND p_calendrier.date AND
p_calendrier.date <> date_debut ;
;
DROP TABLE IF EXISTS w_factures_lignes_sup_c_sup_tot;
CREATE TEMP TABLE w_factures_lignes_sup_c_sup_tot AS
SELECT from_CTID,
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 activite[PX].p_factures_lignes_c
SET
date_fin = p_factures_lignes_c.date_debut,
nb_rubrique = p_factures_lignes_c.nb_rubrique - w_factures_lignes_sup_c_sup_tot.nb_rubrique,
nb_prestation = p_factures_lignes_c.nb_prestation - w_factures_lignes_sup_c_sup_tot.nb_prestation,
montant_facture = p_factures_lignes_c.montant_facture - w_factures_lignes_sup_c_sup_tot.montant_facture,
montant_facture_0 = p_factures_lignes_c.montant_facture_0 - w_factures_lignes_sup_c_sup_tot.montant_facture_0,
montant_facture_1 = p_factures_lignes_c.montant_facture_1 - w_factures_lignes_sup_c_sup_tot.montant_facture_1,
montant_facture_2 = p_factures_lignes_c.montant_facture_2 - w_factures_lignes_sup_c_sup_tot.montant_facture_2,
montant_facture_22 = p_factures_lignes_c.montant_facture_22 - w_factures_lignes_sup_c_sup_tot.montant_facture_22,
montant_comptabilise = p_factures_lignes_c.montant_comptabilise - w_factures_lignes_sup_c_sup_tot.montant_comptabilise,
montant_comptabilise_0 = p_factures_lignes_c.montant_comptabilise_0 - w_factures_lignes_sup_c_sup_tot.montant_comptabilise_0,
montant_comptabilise_1 = p_factures_lignes_c.montant_comptabilise_1 - w_factures_lignes_sup_c_sup_tot.montant_comptabilise_1,
montant_comptabilise_2 = p_factures_lignes_c.montant_comptabilise_2 - w_factures_lignes_sup_c_sup_tot.montant_comptabilise_2,
montant_comptabilise_22 = p_factures_lignes_c.montant_comptabilise_22 - w_factures_lignes_sup_c_sup_tot.montant_comptabilise_22,
montant_encours = p_factures_lignes_c.montant_encours - w_factures_lignes_sup_c_sup_tot.montant_encours,
montant_encours_0 = p_factures_lignes_c.montant_encours_0 - w_factures_lignes_sup_c_sup_tot.montant_encours_0,
montant_encours_1 = p_factures_lignes_c.montant_encours_1 - w_factures_lignes_sup_c_sup_tot.montant_encours_1,
montant_encours_2 = p_factures_lignes_c.montant_encours_2 - w_factures_lignes_sup_c_sup_tot.montant_encours_2,
montant_encours_22 = p_factures_lignes_c.montant_encours_22 - w_factures_lignes_sup_c_sup_tot.montant_encours_22,
montant_facture_actes_inclus_dans_sejour = p_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 = p_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 = p_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 = p_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 = p_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 = p_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 p_factures_lignes_c.CTID = from_CTID;
INSERT INTO activite[PX].p_factures_lignes_c(
no_facture,
date_debut,
date_fin,
nb_rubrique,
coefficient,
coefficient_mco,
rubrique_facturation_id,
prestation_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,
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)
SELECT
no_facture,
date_debut,
date_fin,
nb_rubrique,
coefficient,
coefficient_mco,
rubrique_facturation_id,
prestation_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,
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
FROM w_factures_lignes_sup_c_sup;
-- 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,
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 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 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
GROUP BY 1,2,3,4,5,6,10,11,12,13,14,15,16,17;
-- 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
WHERE p_sejours.est_budget_global = '1' AND
type_t2a = '1' 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 p_factures.no_sejour
FROM activite[PX].p_factures
JOIN activite[PX].p_factures_lignes_c ON p_factures_lignes_c.no_facture = p_factures.no_facture
JOIN activite[PX].t_prestations ON prestation_id = t_prestations.oid
WHERE t_prestations.code = 'GHS' AND montant_facture > 0
) 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 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
t_prestations.code = 'PJ' 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',
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;
-- Suppression des factures encours externes ajoutées à tord
DROP TABLE IF EXISTS w_factures_externes_double_bg;
CREATE TEMP TABLE w_factures_externes_double_bg AS
SELECT p_factures.no_sejour,
MAX(CASE WHEN code_facture = '0' AND p_factures.montant_facture_c = 0 THEN no_facture ELSE '' END) AS no_facture_encours,
MAX(CASE WHEN code_facture = '1' AND no_facture LIKE '%BG%' THEN no_facture ELSE '' END) AS no_facture_bg
FROM activite[PX].p_factures
JOIN activite[PX].p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
WHERE p_sejours.type_sejour = '3'
GROUP BY 1
HAVING MAX(CASE WHEN code_facture = '0' THEN no_facture ELSE '' END) <> '' AND MAX(CASE WHEN code_facture = '1' AND no_facture LIKE '%BG%' THEN no_facture ELSE '' END) <> ''
;
DELETE FROM activite[PX].p_factures
WHERE code_facture = '0' AND
montant_facture_c = 0 AND
no_facture IN (SELECT no_facture_encours FROM w_factures_externes_double_bg)
;
DELETE FROM activite[PX].p_factures_lignes_non_facturees_c
WHERE no_facture IN (SELECT no_facture_encours FROM w_factures_externes_double_bg)
;
-- Ajout des prestations NGAP non facturées
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,
date(NGAP_DATE) AS date_debut,
date(NGAP_DATE) AS date_fin,
NGAP_NB AS nb_rubrique,
NGAP_COEF AS coefficient,
t_rubriques_facturation.oid AS rubrique_facturation_id,
t_prestations.oid AS prestation_id,
LC_PRIX AS prix_unitaire,
p_sejours.lieu_sortie_id AS lieu_id
FROM prod_cerner.PASSAGE_NGAP
JOIN prod_cerner.CODE_TARIF ON NGAP_CTCODE = CT_CODE
JOIN prod_cerner.LETTRE_CLE ON CT_LET = LC_CODE AND NGAP_DATE BETWEEN LC_DDEB AND COALESCE(LC_DFIN,'20991231')
JOIN activite[PX].p_sejours ON NGAP_HONUM = p_sejours.code_original AND p_sejours.etat = '' AND
NGAP_DATE BETWEEN p_sejours.date_entree AND p_sejours.date_sortie
JOIN activite[PX].p_factures ON p_sejours.no_sejour = p_factures.no_sejour
JOIN activite.t_prestations ON t_prestations.code = CT_LET
JOIN activite[PX].t_rubriques_facturation ON t_rubriques_facturation.code_original = NGAP_CTCODE
WHERE p_factures.code_facture <> '1' AND p_sejours.type_sejour = '3' AND NGAP_DATE >= '[ENV_ADM_ANNEEDEBUT]0101'
;
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,
date(CDAM_DATE) AS date_debut,
date(CDAM_DATE) AS date_fin,
1 AS nb_rubrique,
1 AS coefficient,
t_rubriques_facturation.oid AS rubrique_facturation_id,
t_prestations.oid AS prestation_id,
PRIX_ACTE * CASE CDAM_CCAM_ASSNOPREV WHEN '2' THEN 0.5 WHEN '3' THEN 0.75 ELSE 1 END AS prix_unitaire,
p_sejours.lieu_sortie_id AS lieu_id
FROM prod_cerner.PASSAGE_CDAM
JOIN activite[PX].p_sejours ON CDAM_HONUM = p_sejours.code_original AND p_sejours.etat = '' AND
CDAM_DATE BETWEEN p_sejours.date_entree AND p_sejours.date_sortie
JOIN activite[PX].p_factures ON p_sejours.no_sejour = p_factures.no_sejour
JOIN base.t_actes ON CDAM_CODEACTE = t_actes.code
JOIN base.t_ccam_regroupements ON
(t_actes.ccam_regroupement_id_1 = t_ccam_regroupements.oid AND CDAM_CCAM_ACTIVITE <> '4' OR
t_actes.ccam_regroupement_id_4 = t_ccam_regroupements.oid AND CDAM_CCAM_ACTIVITE = '4'
)
JOIN activite.t_prestations ON t_prestations.code = t_ccam_regroupements.code
JOIN activite[PX].t_rubriques_facturation ON t_rubriques_facturation.code_original = t_ccam_regroupements.code
WHERE p_factures.code_facture <> '1' AND p_sejours.type_sejour = '3' AND CDAM_DATE >= '[ENV_ADM_ANNEEDEBUT]0101'
;
]]></sqlcmd>
</NODE>
<NODE label="Compte client Clinique">
<sqlcmd><![CDATA[
SELECT base.cti_disable_index('activite', 'i_factures_soldes_c_1');
SELECT base.cti_disable_index('activite', 'i_factures_soldes_c_2');
SELECT base.cti_disable_index('activite', 'i_factures_soldes_c_3');
SELECT base.cti_disable_index('activite', 'i_factures_soldes_c_4');
SELECT base.cti_disable_index('activite', '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_trunc('month',date_vente) + interval '1 month' - interval '1 day',
0::bigint AS rubrique_comptabilisation_id,
0::bigint AS 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 >= '[ENV_ADM_ANNEEDEBUT]0101' AND
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
p_factures.oid AS facture_id,
no_facture,
date_trunc('month',MC_DATECR) + interval '1 month' - interval '1 day',
0::bigint AS rubrique_comptabilisation_id,
0::bigint 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,
SUM(MC_MON_REG) AS montant_regle,
SUM(CASE WHEN FAC_PYTYPE_CTI_HB = '0' THEN MC_MON_REG ELSE 0 END) AS montant_regle_0,
SUM(CASE WHEN FAC_PYTYPE_CTI_HB = '1' THEN MC_MON_REG ELSE 0 END) AS montant_regle_1,
SUM(CASE WHEN FAC_PYTYPE_CTI_HB = '2' THEN MC_MON_REG ELSE 0 END) AS montant_regle_2,
0::numeric AS montant_regle_22
FROM w_MOUV_COMPTA_REG
JOIN w_FACTURE ON w_FACTURE.FAC_NUM_CTI = MC_FACNUM_CTI
JOIN activite[PX].p_factures ON w_MOUV_COMPTA_REG.MC_FACNUM_CTI = p_factures.no_facture
WHERE MC_DATECR >= '[ENV_ADM_ANNEEDEBUT]0101' AND
MC_MON_REG <> 0
GROUP BY 1,2,3,4,5;
SELECT base.cti_enable_index('activite', 'i_factures_soldes_c_1');
SELECT base.cti_enable_index('activite', 'i_factures_soldes_c_2');
SELECT base.cti_enable_index('activite', 'i_factures_soldes_c_3');
SELECT base.cti_enable_index('activite', 'i_factures_soldes_c_4');
SELECT base.cti_enable_index('activite', 'i_factures_soldes_c_8');
]]></sqlcmd>
</NODE>
<NODE label="Lignes non facturées Honoraires">
<sqlcmd><![CDATA[
]]></sqlcmd>
</NODE>
<NODE label="Lignes factures Honoraires">
<sqlcmd><![CDATA[
-- Recalculer facture de référence (pour attribuer l'acte à la bonne facture)
DROP TABLE IF EXISTS w_sejours_facture_reference;
CREATE TEMP TABLE w_sejours_facture_reference AS
SELECT
p_sejours.no_sejour,
CASE WHEN avec_facturation_intermediaire IS DISTINCT FROM '1' THEN p_sejours.date_sortie ELSE p_factures.date_fin END AS date_fin,
MIN(CASE WHEN avec_facturation_intermediaire IS DISTINCT FROM '1' THEN p_sejours.date_entree ELSE p_factures.date_debut END) AS date_debut,
MAX(p_factures.no_facture) AS no_facture_last,
MAX(CASE WHEN type_facture <> '1' AND type_facture <> 'X' AND type_facture <> 'P' THEN p_factures.no_facture ELSE null END) AS no_facture_reference_last,
(MAX(ARRAY[to_char(
CASE
WHEN type_facture <> '1' AND type_facture <> 'X' AND type_facture <> 'P' AND (t_prestations.code IN ('GHS','PJ') OR (p_factures.no_facture LIKE '%BG' AND p_sejours.type_sejour IN ('1','2','5','6'))) THEN p_factures_lignes_c.taux_1
ELSE 0 END
,'FM00000'),
CASE
WHEN type_facture <> '1' AND type_facture <> 'X' AND type_facture <> 'P' AND (t_prestations.code IN ('GHS','PJ') OR (p_factures.no_facture LIKE '%BG' AND p_sejours.type_sejour IN ('1','2','5','6'))) THEN p_factures.no_facture
ELSE NULL END
]
))[2] AS no_facture_reference_sejour_last,
COUNT(DISTINCT p_factures.no_facture) AS nb_factures,
MAX(avec_facturation_intermediaire) AS avec_facturation_intermediaire
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 p_sejours.lieu_sortie_id = t_lieux.oid
JOIN activite[PX].t_services_facturation ON service_facturation_id = t_services_facturation.oid
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 IN ('GHS','PJ')
GROUP BY 1,2;
CREATE INDEX w_sejours_facture_reference_i1
ON w_sejours_facture_reference
USING btree
(no_sejour);
UPDATE activite[PX].p_factures
SET no_facture_reference = COALESCE(no_facture_reference_sejour_last, no_facture_reference_last, no_facture_last)
FROM w_sejours_facture_reference
JOIN activite[PX].p_sejours ON p_sejours.no_sejour = w_sejours_facture_reference.no_sejour
WHERE p_factures.no_sejour = w_sejours_facture_reference.no_sejour AND
(
p_factures.date_fin = w_sejours_facture_reference.date_fin OR
p_factures.date_fin = p_sejours.date_sortie AND avec_facturation_intermediaire IS DISTINCT FROM '1'
) AND
p_factures.no_facture_reference <> COALESCE(no_facture_reference_sejour_last, no_facture_reference_last, no_facture_last);
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 <> p_factures_references.oid
;
UPDATE activite[PX].p_factures
SET date_fin = date_fin_facture
FROM activite[PX].p_factures_reference
WHERE p_factures.no_facture_reference = p_factures_reference.no_facture_reference AND
p_factures.date_fin <> p_factures_reference.date_fin_facture
;
UPDATE activite[PX].p_factures
SET date_debut = date_debut_facture
FROM activite[PX].p_factures_reference
WHERE p_factures.no_facture_reference = p_factures_reference.no_facture_reference AND
p_factures.date_debut <> p_factures_reference.date_debut_facture
;
INSERT INTO base.t_actes (code, texte, texte_court, nomenclature, ccam_regroupement_id_1)
SELECT CT_LET, MAX(CT_LIB), MAX(CT_LIB), 'NGAP', MAX(t_ccam_regroupements.oid)
FROM prod_cerner.PASSAGE_NGAP
JOIN prod_cerner.CODE_TARIF ON NGAP_CTCODE = CT_CODE
JOIN base.t_ccam_regroupements ON t_ccam_regroupements.Code = 'NGAP'
LEFT JOIN base.t_actes ON t_actes.code = CT_LET
WHERE CT_LET NOT IN ('SE1','SE2','SE3','SE4','SE5', 'SE6', 'SE7','ATU', 'FPU','FFM') AND
t_actes.oid IS NULL
GROUP BY 1
ORDER BY 1
;
SELECT base.cti_disable_index('activite', 'i_factures_lignes_h_1');
SELECT base.cti_disable_index('activite', 'i_factures_lignes_h_2');
SELECT base.cti_disable_index('activite', 'i_factures_lignes_h_3');
SELECT base.cti_disable_index('activite', 'i_factures_lignes_h_4');
SELECT base.cti_disable_index('activite', 'i_factures_lignes_h_5');
SELECT base.cti_disable_index('activite', 'i_factures_lignes_h_6');
SELECT base.cti_disable_index('activite', 'i_factures_lignes_h_7');
SELECT base.cti_disable_index('activite', 'i_factures_lignes_h_8');
SELECT base.cti_disable_index('activite', 'i_factures_lignes_h_9');
DROP TABLE IF EXISTS w_PASSAGE_NGAP;
CREATE TEMP TABLE w_PASSAGE_NGAP AS
SELECT row_number() OVER () AS oid,
0 as lieu_id,
code_original_1,
code_original_2,
code_original_3,
code_original_4,
code_original_5,
PASSAGE_NGAP.*,
CODE_TARIF.*,
LETTRE_CLE.*
FROM prod_cerner.PASSAGE_NGAP
JOIN prod_cerner.CODE_TARIF ON NGAP_CTCODE = CT_CODE
JOIN prod_cerner.LETTRE_CLE ON CT_LET = LC_CODE AND NGAP_DATE BETWEEN LC_DDEB AND COALESCE(LC_DFIN,'20991231')
JOIN activite[PX].p_sejours ON no_sejour = NGAP_HONUM
JOIN activite[PX].t_lieux ON lieu_sortie_id = t_lieux.oid
;
ANALYSE w_PASSAGE_NGAP
;
CREATE INDEX w_PASSAGE_NGAP_oid
ON w_PASSAGE_NGAP
USING btree
(oid);
DROP TABLE IF EXISTS w_PASSAGE_NGAP_facture;
CREATE TEMP TABLE w_PASSAGE_NGAP_facture AS
SELECT PASSAGE_NGAP.oid,
NGAP_HONUM AS HONUM,
MAX(no_facture) AS no_facture,
(MAX(ARRAY[no_facture,p_factures.oid::text]))[2]::bigint AS facture_id,
MAX(p_sejours.lieu_sortie_id) AS lieu_sortie_id
FROM w_PASSAGE_NGAP PASSAGE_NGAP
JOIN activite[PX].p_sejours ON NGAP_HONUM = p_sejours.no_sejour AND p_sejours.etat = ''
JOIN activite[PX].p_factures ON NGAP_HONUM = p_factures.no_sejour AND
p_factures.no_facture = p_factures.no_facture_reference AND
NGAP_DATE BETWEEN p_factures.date_debut AND p_factures.date_fin
GROUP BY 1,2
;
ANALYSE w_PASSAGE_NGAP_facture
;
CREATE INDEX w_PASSAGE_NGAP_facture_oid
ON w_PASSAGE_NGAP_facture
USING btree
(oid)
;
INSERT INTO activite[PX].t_lieux(
code_original_1, code_original_2, code_original_3, code_original_4, code_original_5, code_original_6)
SELECT
w_PASSAGE_NGAP.code_original_1,
w_PASSAGE_NGAP.code_original_2,
w_PASSAGE_NGAP.code_original_3,
w_PASSAGE_NGAP.code_original_4,
w_PASSAGE_NGAP.code_original_5,
NGAP_UFXCODE
FROM w_PASSAGE_NGAP
LEFT JOIN activite[PX].t_lieux ON (
t_lieux.code_original_1 = w_PASSAGE_NGAP.code_original_1 AND
t_lieux.code_original_2 = w_PASSAGE_NGAP.code_original_2 AND
t_lieux.code_original_3 = w_PASSAGE_NGAP.code_original_3 AND
t_lieux.code_original_4 = w_PASSAGE_NGAP.code_original_4 AND
t_lieux.code_original_5 = w_PASSAGE_NGAP.code_original_5 AND
t_lieux.code_original_6 = NGAP_UFXCODE
)
WHERE t_lieux.oid IS NULL
GROUP BY 1,2,3,4,5,6
;
UPDATE w_PASSAGE_NGAP
SET lieu_id = t_lieux.oid
FROM activite[PX].t_lieux
WHERE t_lieux.code_original_1 = w_PASSAGE_NGAP.code_original_1 AND
t_lieux.code_original_2 = w_PASSAGE_NGAP.code_original_2 AND
t_lieux.code_original_3 = w_PASSAGE_NGAP.code_original_3 AND
t_lieux.code_original_4 = w_PASSAGE_NGAP.code_original_4 AND
t_lieux.code_original_5 = w_PASSAGE_NGAP.code_original_5 AND
t_lieux.code_original_6 = NGAP_UFXCODE
;
INSERT INTO activite[PX].p_factures_lignes_h(
no_facture,
date_debut,
date_fin,
coefficient,
coefficient_mco,
prestation_id,
nb_rubrique,
nb_prestation,
prix_unitaire,
taux_0,
taux_1,
taux_2,
taux_22,
montant_facture,
montant_facture_0,
montant_facture_1,
montant_facture_2,
montant_facture_22,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
lieu_id,
montant_depassement,
acte_id,
medecin_facture_id,
medecin_comptabilise_id,
heure_debut,
phase_ccam,
activite_ccam,
extension_ccam,
modificateur_ccam_1,
modificateur_ccam_2,
modificateur_ccam_3,
modificateur_ccam_4,
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,
facture_id,
protocole_id,
rubrique_facturation_id,
rubrique_comptabilisation_id,
montant_non_facture
)
SELECT
w_PASSAGE_NGAP_facture.no_facture,
date(NGAP_DATE) AS date_debut,
date(NGAP_DATE) AS date_fin,
CASE WHEN CT_COEF = NGAP_COEF THEN CT_COEF ELSE CT_COEF * NGAP_COEF END AS coefficient,
1 AS coefficient_mco,
COALESCE(t_prestations.oid, 0) AS prestation_id,
NGAP_NB AS nb_rubrique,
NGAP_NB AS nb_prestation,
LC_PRIX AS prix_unitaire,
0 AS taux_0,
0 AS taux_1,
0 AS taux_2,
0 AS taux_22,
NGAP_NB * (CASE WHEN CT_COEF = NGAP_COEF THEN CT_COEF ELSE CT_COEF * NGAP_COEF END ) * LC_PRIX AS montant_facture,
0 AS montant_facture_0,
NGAP_NB * (CASE WHEN CT_COEF = NGAP_COEF THEN CT_COEF ELSE CT_COEF * NGAP_COEF END ) * LC_PRIX AS montant_facture_1,
0 AS montant_facture_2,
0 AS montant_facture_22,
0 AS montant_comptabilise,
0 AS montant_comptabilise_0,
0 AS montant_comptabilise_1,
0 AS montant_comptabilise_2,
0 AS montant_comptabilise_22,
PASSAGE_NGAP.lieu_id AS lieu_id,
0 AS montant_depassement,
COALESCE(t_actes.oid,0) AS acte_id,
COALESCE(t_medecins_administratifs.oid,0) AS medecin_facture_id,
COALESCE(t_medecins_administratifs.oid,0) AS medecin_comptabilise_id,
to_char(NGAP_HEURE,'HH24MISS')::numeric AS heure_debut,
'' AS phase_ccam,
'' AS activite_ccam,
'' AS extension_ccam,
'' AS modificateur_ccam_1,
'' AS modificateur_ccam_2,
'' AS modificateur_ccam_3,
'' AS modificateur_ccam_4,
0 AS montant_encours,
0 AS montant_encours_0,
0 AS montant_encours_1,
0 AS montant_encours_2,
0 AS montant_encours_22,
0 AS montant_facture_actes_inclus_dans_sejour,
0 AS montant_facture_0_actes_inclus_dans_sejour,
0 AS montant_facture_1_actes_inclus_dans_sejour,
0 AS montant_facture_2_actes_inclus_dans_sejour,
0 AS montant_facture_22_actes_inclus_dans_sejour,
w_PASSAGE_NGAP_facture.facture_id,
0 AS protocole_id,
COALESCE(t_rubriques_facturation.oid,0) AS rubrique_facturation_id,
COALESCE(t_rubriques_facturation.oid,0) AS rubrique_comptabilisation_id,
0 AS montant_non_facture
FROM w_PASSAGE_NGAP PASSAGE_NGAP
JOIN w_PASSAGE_NGAP_facture ON PASSAGE_NGAP.oid = w_PASSAGE_NGAP_facture.oid
LEFT JOIN activite.t_prestations ON t_prestations.code = CT_LET
LEFT JOIN activite[PX].t_rubriques_facturation ON t_rubriques_facturation.code_original = NGAP_CTCODE
LEFT JOIN base.t_actes ON t_actes.code = CT_LET
LEFT JOIN activite[PX].t_medecins_administratifs ON t_medecins_administratifs.code_original = NGAP_INXCODE
WHERE CT_LET NOT IN ('SE1','SE2','SE3','SE4','SE5','SE6', 'SE7','ATU', 'FPU','FFM')
;
DROP TABLE IF EXISTS w_PASSAGE_CDAM;
CREATE TEMP TABLE w_PASSAGE_CDAM AS
SELECT row_number() OVER () AS oid,
0 as lieu_id,
code_original_1,
code_original_2,
code_original_3,
code_original_4,
code_original_5,
PASSAGE_CDAM.*
FROM prod_cerner.PASSAGE_CDAM
JOIN activite[PX].p_sejours ON no_sejour = CDAM_HONUM
JOIN activite[PX].t_lieux ON lieu_sortie_id = t_lieux.oid
;
ANALYSE w_PASSAGE_CDAM
;
CREATE INDEX w_PASSAGE_CDAM_oid
ON w_PASSAGE_CDAM
USING btree
(oid);
INSERT INTO activite[PX].t_lieux(
code_original_1, code_original_2, code_original_3, code_original_4, code_original_5, code_original_6)
SELECT
w_PASSAGE_CDAM.code_original_1,
w_PASSAGE_CDAM.code_original_2,
w_PASSAGE_CDAM.code_original_3,
w_PASSAGE_CDAM.code_original_4,
w_PASSAGE_CDAM.code_original_5,
CDAM_UFXCODE
FROM w_PASSAGE_CDAM
LEFT JOIN activite[PX].t_lieux ON (
t_lieux.code_original_1 = w_PASSAGE_CDAM.code_original_1 AND
t_lieux.code_original_2 = w_PASSAGE_CDAM.code_original_2 AND
t_lieux.code_original_3 = w_PASSAGE_CDAM.code_original_3 AND
t_lieux.code_original_4 = w_PASSAGE_CDAM.code_original_4 AND
t_lieux.code_original_5 = w_PASSAGE_CDAM.code_original_5 AND
t_lieux.code_original_6 = CDAM_UFXCODE
)
WHERE t_lieux.oid IS NULL
GROUP BY 1,2,3,4,5,6
;
UPDATE w_PASSAGE_CDAM
SET lieu_id = t_lieux.oid
FROM activite[PX].t_lieux
WHERE t_lieux.code_original_1 = w_PASSAGE_CDAM.code_original_1 AND
t_lieux.code_original_2 = w_PASSAGE_CDAM.code_original_2 AND
t_lieux.code_original_3 = w_PASSAGE_CDAM.code_original_3 AND
t_lieux.code_original_4 = w_PASSAGE_CDAM.code_original_4 AND
t_lieux.code_original_5 = w_PASSAGE_CDAM.code_original_5 AND
t_lieux.code_original_6 = CDAM_UFXCODE
;
DROP TABLE IF EXISTS w_PASSAGE_CDAM_facture;
CREATE TEMP TABLE w_PASSAGE_CDAM_facture AS
SELECT PASSAGE_CDAM.oid,
CDAM_HONUM AS HONUM,
MAX(no_facture) AS no_facture,
(MAX(ARRAY[no_facture,p_factures.oid::text]))[2]::bigint AS facture_id,
MAX(p_sejours.lieu_sortie_id) AS lieu_sortie_id
FROM w_PASSAGE_CDAM PASSAGE_CDAM
JOIN activite[PX].p_sejours ON CDAM_HONUM = p_sejours.no_sejour AND p_sejours.etat = ''
JOIN activite[PX].p_factures ON CDAM_HONUM = p_factures.no_sejour AND
p_factures.no_facture = p_factures.no_facture_reference AND
CDAM_DATE BETWEEN p_factures.date_debut AND p_factures.date_fin
GROUP BY 1,2
;
ANALYSE w_PASSAGE_CDAM_facture
;
CREATE INDEX w_PASSAGE_CDAM_facture_HONUM
ON w_PASSAGE_CDAM_facture
USING btree
(HONUM);
INSERT INTO activite[PX].p_factures_lignes_h(
no_facture,
date_debut,
date_fin,
coefficient,
coefficient_mco,
prestation_id,
nb_rubrique,
nb_prestation,
prix_unitaire,
taux_0,
taux_1,
taux_2,
taux_22,
montant_facture,
montant_facture_0,
montant_facture_1,
montant_facture_2,
montant_facture_22,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
lieu_id,
montant_depassement,
acte_id,
medecin_facture_id,
medecin_comptabilise_id,
heure_debut,
phase_ccam,
activite_ccam,
extension_ccam,
modificateur_ccam_1,
modificateur_ccam_2,
modificateur_ccam_3,
modificateur_ccam_4,
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,
facture_id,
protocole_id,
rubrique_facturation_id,
rubrique_comptabilisation_id,
montant_non_facture
)
SELECT
w_PASSAGE_CDAM_facture.no_facture,
date(CDAM_DATE) AS date_debut,
date(CDAM_DATE) AS date_fin,
1 AS coefficient,
1 AS coefficient_mco,
t_prestations.oid AS prestation_id,
1 AS nb_rubrique,
1 AS nb_prestation,
PRIX_ACTE * CASE CDAM_CCAM_ASSNOPREV WHEN '2' THEN 0.5 WHEN '3' THEN 0.75 ELSE 1 END AS prix_unitaire,
0 AS taux_0,
0 AS taux_1,
0 AS taux_2,
0 AS taux_22,
PRIX_ACTE * CASE CDAM_CCAM_ASSNOPREV WHEN '2' THEN 0.5 WHEN '3' THEN 0.75 ELSE 1 END AS montant_facture,
0 AS montant_facture_0,
PRIX_ACTE * CASE CDAM_CCAM_ASSNOPREV WHEN '2' THEN 0.5 WHEN '3' THEN 0.75 ELSE 1 END AS montant_facture_1,
0 AS montant_facture_2,
0 AS montant_facture_22,
0 AS montant_comptabilise,
0 AS montant_comptabilise_0,
0 AS montant_comptabilise_1,
0 AS montant_comptabilise_2,
0 AS montant_comptabilise_22,
PASSAGE_CDAM.lieu_id AS lieu_id,
0 AS montant_depassement,
COALESCE(t_actes.oid,0) AS acte_id,
COALESCE(t_medecins_administratifs.oid,0) AS medecin_facture_id,
COALESCE(t_medecins_administratifs.oid,0) AS medecin_comptabilise_id,
to_char(CDAM_HEURE,'HH24MISS')::numeric AS heure_debut,
CDAM_CCAM_PHASTRAIT::text AS phase_ccam,
CDAM_CCAM_ACTIVITE AS activite_ccam,
CDAM_CCAM_EXTDOC AS extension_ccam,
CDAM_CCAM_MODIF1 AS modificateur_ccam_1,
CDAM_CCAM_MODIF2 AS modificateur_ccam_2,
CDAM_CCAM_MODIF3 AS modificateur_ccam_3,
CDAM_CCAM_MODIF4 AS modificateur_ccam_4,
0 AS montant_encours,
0 AS montant_encours_0,
0 AS montant_encours_1,
0 AS montant_encours_2,
0 AS montant_encours_22,
0 AS montant_facture_actes_inclus_dans_sejour,
0 AS montant_facture_0_actes_inclus_dans_sejour,
0 AS montant_facture_1_actes_inclus_dans_sejour,
0 AS montant_facture_2_actes_inclus_dans_sejour,
0 AS montant_facture_22_actes_inclus_dans_sejour,
w_PASSAGE_CDAM_facture.facture_id,
0 AS protocole_id,
COALESCE(t_rubriques_facturation.oid,0) AS rubrique_facturation_id,
COALESCE(t_rubriques_facturation.oid,0) AS rubrique_comptabilisation_id,
0 AS montant_non_facture
FROM w_PASSAGE_CDAM PASSAGE_CDAM
JOIN activite[PX].p_sejours ON CDAM_HONUM = p_sejours.code_original AND p_sejours.etat = ''
JOIN w_PASSAGE_CDAM_facture ON PASSAGE_CDAM.oid = w_PASSAGE_CDAM_facture.oid
JOIN base.t_actes ON CDAM_CODEACTE = t_actes.code
JOIN base.t_ccam_regroupements ON
(t_actes.ccam_regroupement_id_1 = t_ccam_regroupements.oid AND CDAM_CCAM_ACTIVITE <> '4' OR
t_actes.ccam_regroupement_id_4 = t_ccam_regroupements.oid AND CDAM_CCAM_ACTIVITE = '4'
)
LEFT JOIN activite.t_prestations ON t_prestations.code = t_ccam_regroupements.code
LEFT JOIN activite[PX].t_rubriques_facturation ON t_rubriques_facturation.code_original = t_ccam_regroupements.code
LEFT JOIN activite[PX].t_medecins_administratifs ON t_medecins_administratifs.code_original = CDAM_INXCODE
;
ANALYSE activite[PX].p_factures_lignes_h
;
SELECT base.cti_enable_index('activite', 'i_factures_lignes_h_1');
SELECT base.cti_enable_index('activite', 'i_factures_lignes_h_2');
SELECT base.cti_enable_index('activite', 'i_factures_lignes_h_3');
SELECT base.cti_enable_index('activite', 'i_factures_lignes_h_4');
SELECT base.cti_enable_index('activite', 'i_factures_lignes_h_5');
SELECT base.cti_enable_index('activite', 'i_factures_lignes_h_6');
SELECT base.cti_enable_index('activite', 'i_factures_lignes_h_7');
SELECT base.cti_enable_index('activite', 'i_factures_lignes_h_8');
SELECT base.cti_enable_index('activite', 'i_factures_lignes_h_9');
-- Supplément F
UPDATE activite[PX].p_factures_lignes_h SET
prix_unitaire = prix_unitaire + 19.06,
montant_facture = montant_facture + 19.06,
montant_facture_1 = montant_facture_1 + 19.06
WHERE montant_facture > 0 AND
(
modificateur_ccam_1 = 'F' OR
modificateur_ccam_2 = 'F' OR
modificateur_ccam_3 = 'F' OR
modificateur_ccam_4 = 'F'
)
;
-- Supplément M
UPDATE activite[PX].p_factures_lignes_h SET
prix_unitaire = prix_unitaire + 26.88,
montant_facture = montant_facture + 26.88,
montant_facture_1 = montant_facture_1 + 26.88
WHERE montant_facture > 0 AND
(
modificateur_ccam_1 = 'M' OR
modificateur_ccam_2 = 'M' OR
modificateur_ccam_3 = 'M' OR
modificateur_ccam_4 = 'M'
)
;
-- Supplément P
UPDATE activite[PX].p_factures_lignes_h SET
prix_unitaire = prix_unitaire + 35,
montant_facture = montant_facture + 35,
montant_facture_1 = montant_facture_1 + 35
WHERE montant_facture > 0 AND
(
modificateur_ccam_1 = 'P' OR
modificateur_ccam_2 = 'P' OR
modificateur_ccam_3 = 'P' OR
modificateur_ccam_4 = 'P'
)
;
-- Comptabilbilité lettre clé G uniquement avec ECG
UPDATE activite[PX].p_factures_lignes_h SET
montant_facture = 0,
montant_facture_1 = 0
FROM
(
SELECT p_factures_lignes_h.no_facture,
p_factures_lignes_h.date_debut,
p_factures_lignes_h.medecin_facture_id,
subview.prestation_id
FROM activite[PX].p_factures_lignes_h
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
JOIN base.t_actes ON acte_id = t_actes.oid
JOIN
(
SELECT p_factures_lignes_h.no_facture,
p_factures_lignes_h.date_debut,
p_factures_lignes_h.medecin_facture_id,
p_factures_lignes_h.prestation_id
FROM activite[PX].p_factures_lignes_h
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
WHERE t_prestations.code IN ('G','GS') AND
montant_facture <> 0
GROUP BY 1,2,3,4
) subview ON
p_factures_lignes_h.no_facture = subview.no_facture AND
p_factures_lignes_h.date_debut = subview.date_debut AND
p_factures_lignes_h.medecin_facture_id = subview.medecin_facture_id
WHERE t_prestations.code = 'ATM' AND
t_actes.code NOT LIKE 'DEQP%'
GROUP BY 1,2,3,4
) subview
WHERE p_factures_lignes_h.no_facture = subview.no_facture AND
p_factures_lignes_h.date_debut = subview.date_debut AND
p_factures_lignes_h.medecin_facture_id = subview.medecin_facture_id AND
p_factures_lignes_h.prestation_id = subview.prestation_id
;
UPDATE activite[PX].p_factures_lignes_h
SET lieu_id = p_sejours.lieu_sortie_id
FROM
activite[PX].p_factures
JOIN activite[PX].p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
WHERE
p_factures_lignes_h.no_facture = p_factures.no_facture AND
(p_factures_lignes_h.lieu_id = 0 OR
(SELECT count(*) FROM activite.t_divers WHERE code = 'CERNER_LIEU_H' AND valeur = '1') = 0)
;
-- UPDATE activite[PX].p_factures_lignes_h
-- SET lieu_id = p_mouvements_sejour.lieu_id
-- FROM
-- activite[PX].p_factures ,
-- activite[PX].p_sejours ,
-- activite[PX].p_mouvements_sejour
-- WHERE
-- p_factures_lignes_h.no_facture = p_factures.no_facture AND
-- p_factures.no_sejour = p_mouvements_sejour.no_sejour AND
-- p_factures.no_sejour = p_sejours.no_sejour AND
-- p_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
-- (p_factures_lignes_h.lieu_id = 0 OR
-- (p_factures_lignes_h.lieu_id <> p_mouvements_sejour.lieu_id AND
-- (SELECT count(*) FROM activite.t_divers WHERE code = 'CERNER_LIEU_H' AND valeur = '1') = 0) OR
-- (p_factures_lignes_h.lieu_id <> p_mouvements_sejour.lieu_id AND
-- p_factures_lignes_h.lieu_id <> lieu_sortie_id AND
-- (SELECT count(*) FROM activite.t_divers WHERE code = 'CERNER_LIEU_H' AND valeur = '1') = 1))
-- ;
UPDATE activite[PX].p_factures_lignes_h
SET lieu_id = p_mouvements_sejour.lieu_id
FROM
activite[PX].p_factures ,
activite[PX].p_sejours ,
activite[PX].p_mouvements_sejour
WHERE
p_factures_lignes_h.no_facture = p_factures.no_facture AND
p_factures.no_sejour = p_mouvements_sejour.no_sejour AND
p_factures.no_sejour = p_sejours.no_sejour AND
p_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
(p_factures_lignes_h.lieu_id = 0 OR
(p_factures_lignes_h.lieu_id <> p_mouvements_sejour.lieu_id AND
(SELECT count(*) FROM activite.t_divers WHERE code = 'CERNER_LIEU_H' AND valeur = '1') = 0)
)
;
]]></sqlcmd>
</NODE>
<NODEx label="Compte client Honoraires">
<sqlcmd><![CDATA[
SELECT base.cti_disable_index('activite', 'i_factures_soldes_h_1');
SELECT base.cti_disable_index('activite', 'i_factures_soldes_h_3');
SELECT base.cti_disable_index('activite', 'i_factures_soldes_h_4');
SELECT base.cti_disable_index('activite', 'i_factures_soldes_h_8');
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_trunc('month',date_vente) + interval '1 month' - interval '1 day',
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
WHERE date_vente >= '[ENV_ADM_ANNEEDEBUT]0101' 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;
DROP TABLE IF EXISTS w_medecins_3;
CREATE TEMP TABLE w_medecins_3 AS
SELECT
base.cti_to_number(right(code_original,3)) AS code_3,
MAX(oid) AS medecin_administratif_id
FROM activite[PX].t_medecins_administratifs
GROUP BY 1;
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
w_factures.oid AS facture_id,
no_facture,
(to_char(ACSDTF,'FM00')||to_char(ACADTF,'FM00')||to_char(ACMDTF,'FM00')||'01')::date,
COALESCE(w_medecins_3.medecin_administratif_id,0) AS medecin_comptabilise_id,
0::bigint AS rubrique_comptabilisation_id,
0::bigint AS prestation_id,
0,
0,
0,
0,
0,
SUM(0-ACMTFC) AS montant_regle,
SUM(CASE WHEN ACINDI = 3 THEN 0-ACMTFC ELSE 0 END) AS montant_regle_0,
SUM(CASE WHEN ACINDI = 1 THEN 0-ACMTFC ELSE 0 END) AS montant_regle_1,
SUM(CASE WHEN ACINDI = 2 THEN 0-ACMTFC ELSE 0 END) AS montant_regle_2,
0 AS montant_regle_22
FROM prod_chataigneraie_as400.NXXXFAC_FACTURES FACTURES
JOIN w_NDOADM_SELECT ON w_NDOADM_SELECT.NONUMA = FACTURES.NONUMA
JOIN prod_chataigneraie_as400.XXXFICH_REGLI REGLI ON FACTURES.FAID = REGLI.ACNFAC
JOIN w_factures ON REGLI.ACNFAC = w_factures.FAID
LEFT JOIN w_medecins_3 ON w_medecins_3.code_3 = ACMED
WHERE ACSDTF*100+ACADTF >= [ENV_ADM_ANNEEDEBUT] AND
ACID > 100
GROUP BY 1,2,3,4,5,6
;
SELECT base.cti_enable_index('activite', 'i_factures_soldes_h_1');
SELECT base.cti_enable_index('activite', 'i_factures_soldes_h_3');
SELECT base.cti_enable_index('activite', 'i_factures_soldes_h_4');
SELECT base.cti_enable_index('activite', 'i_factures_soldes_h_8');
]]></sqlcmd>
</NODEx>
<NODE label="Rejets">
<sqlcmd><![CDATA[
INSERT INTO activite[PX].p_factures_rejets(
no_facture, date_rejet, rejet_id, rejet_code, rejet_texte)
SELECT
NOE_DET_FAC_NUM,
date(NOE_DET_DATE_LOT) ,
0,
TRIM(NOE_290_CODIF) ,
TRIM(NOE_290_LIBELLE)
FROM prod_cerner.NOEMIE_DETAIL
JOIN prod_cerner.NOEMIE_290 ON NOE_DET_ID = NOE_290_DET_ID
JOIN activite[PX].p_factures ON split_part(no_facture,'.',1) = NOE_DET_FAC_NUM
WHERE NOE_DET_FAC_NUM <> 0
;
INSERT INTO activite[PX].t_rejets_noemie (texte, code)
SELECT rejet_texte, MAX(rejet_code)
FROM activite[PX].p_factures_rejets
LEFT JOIN activite[PX].t_rejets_noemie ON (rejet_texte = t_rejets_noemie.texte)
WHERE t_rejets_noemie.oid IS NULL
GROUP BY 1;
UPDATE activite[PX].p_factures_rejets
SET rejet_id = t_rejets_noemie.oid
FROM activite[PX].t_rejets_noemie
WHERE rejet_texte = t_rejets_noemie.texte;
]]></sqlcmd>
</NODE>
</NODE>
<NODE name="CHIFFRIER" label="CREATION DU CHIFFRIER">
<NODE label="Récupération chiffrier">
<sqlcmd><![CDATA[
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(CASE WHEN date_part('year',MC_DATECR) = MC_EXER THEN date_trunc('month',MC_DATECR) ELSE to_date(MC_EXER||'-12-31','YYYY-MM-DD') END) AS date_comptable,
SUM(
CASE WHEN MC_NUMV <> 0 AND
MC_TYPE <> 'IRR' AND
MC_OD <> 'X' AND
MC_JRN = 'JV' THEN
CASE WHEN MC_SENS = 'D' THEN MC_MON ELSE 0-MC_MON END
ELSE 0 END
) AS montant_ventes_c,
SUM(
CASE WHEN MC_JRN <> 'JV' THEN
CASE WHEN MC_SENS = 'C' THEN MC_MON ELSE 0-MC_MON END
ELSE 0 END::numeric
) AS montant_reglements_c,
0::numeric AS montant_solde_client_c,
0::numeric AS montant_ventes_h,
0::numeric AS montant_reglements_h,
0::numeric AS montant_solde_client_h
FROM prod_cerner.MOUV_COMPTA
WHERE (MC_COMPTE LIKE '411%' OR MC_COMPTE LIKE '412%' OR MC_COMPTE LIKE '413%' OR MC_COMPTE LIKE '414%' OR MC_COMPTE LIKE '452%' OR MC_COMPTE LIKE '467%') AND
date(CASE WHEN date_part('year',MC_DATECR) = MC_EXER THEN MC_DATECR ELSE to_date(MC_EXER||'-12-31','YYYY-MM-DD') END) >= '[ENV_ADM_ANNEEDEBUT]0101'
GROUP BY 1;
-- Justificatif par facture
DROP TABLE IF EXISTS w_factures_comptables;
CREATE TEMP TABLE w_factures_comptables AS
SELECT
MC_NUMV::text AS no_facture,
date(CASE WHEN date_part('year',MC_DATECR) = MC_EXER THEN MC_DATECR ELSE to_date(MC_EXER||'-12-31','YYYY-MM-DD') END) AS date_comptable,
SUM(CASE WHEN MC_SENS = 'D' THEN MC_MON ELSE 0-MC_MON END) AS montant_ventes_c,
0::numeric AS montant_reglements_c,
0::numeric AS montant_ventes_h,
0::numeric AS montant_reglements_h
FROM prod_cerner.MOUV_COMPTA
WHERE MC_NUMV <> 0 AND
(MC_COMPTE LIKE '411%' OR MC_COMPTE LIKE '412%' OR MC_COMPTE LIKE '413%' OR MC_COMPTE LIKE '414%' OR MC_COMPTE LIKE '452%' OR MC_COMPTE LIKE '467%') AND
MC_TYPE <> 'IRR' AND
MC_OD <> 'X' AND
MC_JRN = 'JV' AND
date(CASE WHEN date_part('year',MC_DATECR) = MC_EXER THEN MC_DATECR ELSE to_date(MC_EXER||'-12-31','YYYY-MM-DD') END) >= '[ENV_ADM_ANNEEDEBUT]0101'
GROUP BY 1,2
;
-- Ajustement des factures trouvées dans les ecritures pour ajouter les séances
DROP TABLE IF EXISTS w_factures_eclatees;
CREATE TEMP TABLE w_factures_eclatees AS
SELECT
split_part(no_facture,'.',1)::numeric AS no_facture,
MAX(date_vente) AS date_vente,
SUM(montant_comptabilise_c) AS montant_comptabilise_c,
MIN(no_facture) AS no_facture_1,
base.cti_array_accum(no_facture) AS no_factures_array,
count(*) AS nb
FROM activite[PX].p_factures
WHERE date_vente >= '[ENV_ADM_ANNEEDEBUT]0101'
GROUP BY 1
;
-- Attribuer le bon n° de facture si une seule
UPDATE w_factures_comptables
SET no_facture = no_facture_1
FROM w_factures_eclatees
WHERE w_factures_comptables.no_facture = w_factures_eclatees.no_facture AND
w_factures_comptables.date_comptable = w_factures_eclatees.date_vente AND
w_factures_eclatees.nb = 1 AND
w_factures_comptables.no_facture <> no_facture_1
;
-- Eclater si plusieurs
DELETE FROM w_factures_eclatees WHERE nb = 1;
INSERT INTO w_factures_comptables(
no_facture,
date_comptable,
montant_ventes_c,
montant_reglements_c,
montant_ventes_h,
montant_reglements_h)
SELECT p_factures.no_facture,
p_factures.date_vente,
p_factures.montant_comptabilise_c,
0,
0,
0
FROM w_factures_comptables
JOIN w_factures_eclatees ON
w_factures_comptables.no_facture = w_factures_eclatees.no_facture AND
w_factures_comptables.date_comptable = w_factures_eclatees.date_vente AND
w_factures_comptables.montant_ventes_c = w_factures_eclatees.montant_comptabilise_c
JOIN activite[PX].p_factures ON p_factures.no_facture = ANY(no_factures_array) AND
p_factures.no_facture <> w_factures_eclatees.no_facture_1
;
UPDATE w_factures_comptables
SET no_facture = no_facture_1,
montant_ventes_c = p_factures.montant_comptabilise_c
FROM w_factures_eclatees
JOIN activite[PX].p_factures ON p_factures.no_facture = no_facture_1
WHERE w_factures_comptables.no_facture = w_factures_eclatees.no_facture AND
w_factures_comptables.date_comptable = w_factures_eclatees.date_vente
;
-- Ajout des règlements (déjà éclatés)
INSERT INTO w_factures_comptables
SELECT
MC_FACNUM_CTI::text AS no_facture,
date(CASE WHEN date_part('year',MC_DATECR) = MC_EXER THEN MC_DATECR ELSE to_date(MC_EXER||'-12-31','YYYY-MM-DD') END) AS date_comptable,
0 AS montant_ventes_c,
SUM(MC_MON_REG) AS montant_reglements_c,
0 AS montant_ventes_h,
0 AS montant_reglements_h
FROM w_MOUV_COMPTA_REG
WHERE date(CASE WHEN date_part('year',MC_DATECR) = MC_EXER THEN MC_DATECR ELSE to_date(MC_EXER||'-12-31','YYYY-MM-DD') END) >= '[ENV_ADM_ANNEEDEBUT]0101'
GROUP BY 1,2
;
-- Validation
TRUNCATE activite[PX].p_factures_comptables;
INSERT INTO activite[PX].p_factures_comptables
(
no_facture,
date_comptable,
montant_ventes_c,
montant_reglements_c,
montant_ventes_h,
montant_reglements_h
)
SELECT no_facture,
date_comptable,
SUM(montant_ventes_c),
SUM(montant_reglements_c),
0 AS montant_ventes_h,
0 AS montant_reglements_h
FROM w_factures_comptables
GROUP BY 1,2
;
]]></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="Initialisation paramétres divers">
<sqlcmd><![CDATA[
INSERT INTO activite.t_divers(code, texte, valeur, description)
SELECT
'CERNER_SALLE=ETAGE',
'1=La salle est l''étage',
'0',
'1=La salle est l''étage'
WHERE 'CERNER_SALLE=ETAGE' NOT IN (SELECT code FROM activite.t_divers);
INSERT INTO activite.t_divers(code, texte, valeur, description)
SELECT
'CERNER_RAISONURGENCE',
'Codes raison pour séjour en urgence',
'',
'Codes séparés par une virgule'
WHERE 'CERNER_RAISONURGENCE' NOT IN (SELECT code FROM activite.t_divers);
INSERT INTO activite.t_divers(code, texte, valeur, description)
SELECT
'CERNER_RAISONSEANCE',
'Codes raison pour les séances',
'',
'Codes séparés par une virgule'
WHERE 'CERNER_RAISONSEANCE' NOT IN (SELECT code FROM activite.t_divers);
INSERT INTO activite.t_divers(code, texte, valeur, description)
SELECT
'CERNER_LIEU_H',
'1=récupérer lieu exécution acte',
'0',
'0=ne pas récupérer, prendre celui du séjour ou du mouvement si différent 1=récupérer lieu exécution acte en priorité'
WHERE 'CERNER_LIEU_H' NOT IN (SELECT code FROM activite.t_divers);
]]></sqlcmd>
</NODE>
<NODE label="Préparation mouvements">
<sqlcmd><![CDATA[
-- Selon utilisation l'étage est dans MH_UFHEBER ou dans MH_SACODE
-- Donc préparation d'un fichier qui contient les bon champs selon paramétrage
DROP TABLE IF EXISTS w_MOUV_HOSPI_source;
CREATE TEMP TABLE w_MOUV_HOSPI_source AS
SELECT MOUV_HOSPI.*,
MH_UFCODE AS MH_UMCODE,
HO_MANUMDOS AS MH_MANUMDOS,
CASE
WHEN t_divers.valeur = '2' AND SA_CODE IS NOT NULL AND SA_UFHEBERG <> '' THEN SA_UFHEBERG
WHEN t_divers.valeur = '1' THEN MH_SACODE
WHEN MH_UFHEBER <> '' THEN MH_UFHEBER
WHEN SA_CODE IS NOT NULL AND SA_UFHEBERG <> '' THEN SA_UFHEBERG
ELSE MH_UFCODE
END AS MH_ETCODE_CTI,
CASE
WHEN t_divers.valeur = '1' THEN CASE WHEN MH_SACODE <> '' THEN CASE WHEN MH_LICODE <> '' THEN MH_LICODE ELSE '0' END ELSE '' END
ELSE CASE WHEN MH_LICODE <> '' AND MH_LICODE <> MH_UFCODE AND MH_LICODE <> MH_UFHEBER THEN MH_LICODE WHEN MH_SACODE <> '' AND MH_SACODE <> MH_UFCODE AND MH_SACODE <> MH_UFHEBER THEN MH_SACODE ELSE '0' END
END AS MH_LICODE_CTI,
''::text AS MH_ELCODE_CTI
FROM prod_cerner.MOUV_HOSPI
JOIN prod_cerner.HOSPITALISATION ON HO_NUM = MH_HONUM
LEFT JOIN prod_cerner.SALLE ON MH_SACODE = SA_CODE
JOIN activite.t_divers ON t_divers.code = 'CERNER_SALLE=ETAGE'
;
UPDATE w_MOUV_HOSPI_source
SET MH_DFIN = '20991231', MH_HFIN = now()
WHERE MH_DFIN IS NULL
;
-- Modification Spécifique SJSL pour les urgences (nouvelle version CERNER)
UPDATE w_MOUV_HOSPI_source
SET MH_UFCODE = 'UR21', MH_COMM = '*URG*'
WHERE MH_URGORG = 'UR21' AND MH_UFCODE <> 'CS21' AND MH_UFCODE <> 'UR21' AND MH_DDEB >= '[ENV_ADM_ANNEEDEBUT]0101'
;
UPDATE w_MOUV_HOSPI_source
SET MH_UFHEBER = 'UR00', MH_COMM = '*URG*'
WHERE MH_SACODE = 'UR00' AND MH_UFHEBER <> 'UR00' AND MH_DDEB >= '[ENV_ADM_ANNEEDEBUT]0101'
;
CREATE INDEX w_MOUV_HOSPI_source_MH_MANUMDOS
ON w_MOUV_HOSPI_source
USING btree
(MH_MANUMDOS);
-- Spécifique Saint Joseph St Luc
-- Le premier mouveement transfert urgence sur hospit = Etage = UR00
UPDATE w_MOUV_HOSPI_source SET
MH_ETCODE_CTI = 'UR00', MH_LICODE_CTI = '0'
WHERE MH_ID IN
(
SELECT w_MOUV_HOSPI_source_HOS.MH_ID
FROM w_MOUV_HOSPI_source w_MOUV_HOSPI_source_URG
JOIN w_MOUV_HOSPI_source w_MOUV_HOSPI_source_HOS ON
w_MOUV_HOSPI_source_URG.MH_MANUMDOS = w_MOUV_HOSPI_source_HOS.MH_MANUMDOS AND
w_MOUV_HOSPI_source_URG.MH_DDEB = w_MOUV_HOSPI_source_HOS.MH_DDEB AND
to_char(w_MOUV_HOSPI_source_URG.MH_HDEB,'HH24MISS') = to_char(w_MOUV_HOSPI_source_HOS.MH_HDEB,'HH24MISS') AND
w_MOUV_HOSPI_source_URG.MH_DFIN = w_MOUV_HOSPI_source_HOS.MH_DFIN AND
to_char(w_MOUV_HOSPI_source_URG.MH_HFIN,'HH24MISS') = to_char(w_MOUV_HOSPI_source_HOS.MH_HFIN,'HH24MISS') AND
w_MOUV_HOSPI_source_URG.MH_UFSOR = w_MOUV_HOSPI_source_HOS.MH_UFCODE AND
w_MOUV_HOSPI_source_URG.MH_HONUM <> w_MOUV_HOSPI_source_HOS.MH_HONUM
JOIN base.t_finess ON t_finess.Code = '690805361'
WHERE w_MOUV_HOSPI_source_URG.MH_RSCODSOR = 'UH' AND
w_MOUV_HOSPI_source_HOS.MH_RSCODENT = 'UH' AND
w_MOUV_HOSPI_source_HOS.MH_ETCODE_CTI <> 'UR00'
)
;
UPDATE w_MOUV_HOSPI_source SET
MH_ETCODE_CTI = 'UR00', MH_LICODE_CTI = '0'
WHERE MH_ID IN
(
SELECT w_MOUV_HOSPI_source_HOS.MH_ID
FROM w_MOUV_HOSPI_source w_MOUV_HOSPI_source_URG
JOIN w_MOUV_HOSPI_source w_MOUV_HOSPI_source_HOS ON
w_MOUV_HOSPI_source_URG.MH_MANUMDOS = w_MOUV_HOSPI_source_HOS.MH_MANUMDOS AND
w_MOUV_HOSPI_source_URG.MH_DDEB = w_MOUV_HOSPI_source_HOS.MH_DDEB AND
to_char(w_MOUV_HOSPI_source_URG.MH_HDEB,'HH24MISS') = to_char(w_MOUV_HOSPI_source_HOS.MH_HDEB,'HH24MISS') AND
w_MOUV_HOSPI_source_URG.MH_DFIN = w_MOUV_HOSPI_source_HOS.MH_DFIN AND
to_char(w_MOUV_HOSPI_source_URG.MH_HFIN,'HH24MISS') = to_char(w_MOUV_HOSPI_source_HOS.MH_HFIN,'HH24MISS') AND
w_MOUV_HOSPI_source_URG.MH_HONUM <> w_MOUV_HOSPI_source_HOS.MH_HONUM
JOIN base.t_finess ON t_finess.Code = '690805361'
WHERE w_MOUV_HOSPI_source_URG.MH_RSCODSOR = 'UH' AND
w_MOUV_HOSPI_source_HOS.MH_RSCODENT = 'UH' AND
w_MOUV_HOSPI_source_HOS.MH_ETCODE_CTI <> 'UR00'
)
;
UPDATE w_MOUV_HOSPI_source SET
MH_ETCODE_CTI = 'UR00', MH_LICODE_CTI = '0'
WHERE MH_ID IN
(
SELECT w_MOUV_HOSPI_source_HOS.MH_ID
FROM w_MOUV_HOSPI_source w_MOUV_HOSPI_source_URG
JOIN w_MOUV_HOSPI_source w_MOUV_HOSPI_source_HOS ON
w_MOUV_HOSPI_source_URG.MH_MANUMDOS = w_MOUV_HOSPI_source_HOS.MH_MANUMDOS AND
w_MOUV_HOSPI_source_URG.MH_DDEB = w_MOUV_HOSPI_source_HOS.MH_DDEB AND
to_char(w_MOUV_HOSPI_source_URG.MH_HDEB,'HH24MISS') = to_char(w_MOUV_HOSPI_source_HOS.MH_HDEB,'HH24MISS') AND
w_MOUV_HOSPI_source_URG.MH_HONUM <> w_MOUV_HOSPI_source_HOS.MH_HONUM
JOIN base.t_finess ON t_finess.Code = '690805361'
WHERE w_MOUV_HOSPI_source_URG.MH_RSCODSOR = 'UH' AND
w_MOUV_HOSPI_source_HOS.MH_RSCODENT = 'UH' AND
w_MOUV_HOSPI_source_HOS.MH_ETCODE_CTI <> 'UR00'
)
;
UPDATE w_MOUV_HOSPI_source
SET MH_ELCODE_CTI = MH_ETCODE_CTI || '|' || MH_LICODE_CTI
WHERE MH_LICODE_CTI <> ''
;
ANALYSE w_MOUV_HOSPI_source;
CREATE INDEX w_MOUV_HOSPI_source_i1
ON w_MOUV_HOSPI_source
USING btree
(MH_HONUM);
CREATE INDEX w_MOUV_HOSPI_source_i2
ON w_MOUV_HOSPI_source
USING btree
(MH_INCODE);
CREATE INDEX w_MOUV_HOSPI_source_i3
ON w_MOUV_HOSPI_source
USING btree
(MH_UFCODE);
-- Fusion des urgences hospitalisés (SJSL < [ENV_ADM_ANNEEDEBUT]0630)
DROP TABLE IF EXISTS w_FUSION_UR21;
CREATE TEMP TABLE w_FUSION_UR21 AS
SELECT MH_MANUMDOS, MH_DDEB, MH_HDEB,
MAX(CASE WHEN MH_UFCODE = 'UR21' THEN MH_HONUM ELSE 0 END) AS MH_HONUM_urg,
MAX(CASE WHEN MH_UFCODE <> 'UR21' THEN MH_HONUM ELSE 0 END) AS MH_HONUM_hos,
MAX(CASE WHEN MH_UFCODE = 'UR21' THEN MH_UFCODE ELSE '' END) AS MH_UFHEBER_urg,
MAX(CASE WHEN MH_UFCODE = 'UR21' THEN MH_ETCODE_CTI ELSE '' END) AS MH_ETCODE_CTI_urg,
MAX(CASE WHEN MH_UFCODE = 'UR21' THEN MH_LICODE_CTI ELSE '' END) AS MH_LICODE_CTI_urg,
MAX(CASE WHEN MH_UFCODE = 'UR21' THEN MH_ELCODE_CTI ELSE '' END) AS MH_ELCODE_CTI_urg
FROM w_MOUV_HOSPI_source
JOIN prod_cerner.HOSPITALISATION ON
HO_NUM = MH_HONUM AND
MH_DDEB = HO_DDEB AND
HO_VALID <> 'X'
WHERE MH_UFCODE <> 'CS21'
GROUP BY 1,2,3
HAVING count(*) > 1 AND
MAX(CASE WHEN MH_UFCODE = 'UR21' THEN MH_HONUM ELSE 0 END) > 0 AND
MAX(CASE WHEN MH_UFCODE <> 'UR21' THEN MH_HONUM ELSE 0 END) > 0
;
UPDATE w_MOUV_HOSPI_source SET
MH_UFCODE = 'UR21',
MH_UFHEBER = MH_UFHEBER_urg,
MH_ETCODE_CTI = MH_ETCODE_CTI_urg,
MH_LICODE_CTI = MH_LICODE_CTI_urg,
MH_ELCODE_CTI = MH_ELCODE_CTI_urg
FROM w_FUSION_UR21
WHERE w_MOUV_HOSPI_source.MH_HONUM = w_FUSION_UR21.MH_HONUM_hos AND
w_MOUV_HOSPI_source.MH_DDEB = w_FUSION_UR21.MH_DDEB AND
w_MOUV_HOSPI_source.MH_HDEB = w_FUSION_UR21.MH_HDEB
;
UPDATE prod_cerner.HOSPITALISATION
SET HO_VALID = 'U'
FROM w_FUSION_UR21
WHERE HOSPITALISATION.HO_NUM = MH_HONUM_urg
;
]]></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);
DROP TABLE IF EXISTS w_PAYEUR;
CREATE TEMP TABLE w_PAYEUR AS
SELECT PY_TYPE, PY_CODE,
('C'||PY_TYPE||PY_CODE) AS tiers_payant_code_original,
CASE WHEN PY_TYPE IN ('1','2') THEN '1' ELSE '2' END AS PY_TYPE_CTI,
(MAX(ARRAY[PY_DATCRE::text,PY_LIB]))[2] AS PY_LIB,
0::bigint AS tiers_payant_id
FROM prod_cerner.PAYEUR
GROUP BY 1,2
ORDER BY 1,2
;
INSERT INTO activite[PX].t_tiers_payant(code_original, code, type_tiers_payant, texte, texte_court)
SELECT tiers_payant_code_original,
PY_CODE,
PY_TYPE_CTI,
PY_LIB,
PY_LIB
FROM w_PAYEUR
WHERE tiers_payant_code_original NOT IN (SELECT code_original FROM activite[PX].t_tiers_payant WHERE code_original IS NOT NULL)
ORDER BY 1;
UPDATE activite[PX].t_tiers_payant SET
code = PY_CODE,
type_tiers_payant = PY_TYPE_CTI,
texte = PY_LIB,
texte_court = PY_LIB
FROM w_PAYEUR
WHERE tiers_payant_code_original = t_tiers_payant.code_original AND
(
PY_CODE IS DISTINCT FROM PY_CODE OR
type_tiers_payant IS DISTINCT FROM PY_TYPE_CTI OR
texte IS DISTINCT FROM PY_LIB OR
texte_court IS DISTINCT FROM PY_LIB
)
;
UPDATE activite[PX].t_tiers_payant
SET grand_regime_id = t_grands_regimes.oid
FROM base.t_grands_regimes
WHERE t_tiers_payant.code_original LIKE 'C%' AND
length(t_tiers_payant.code_original) = 10 AND
grand_regime_id = 0 AND
t_grands_regimes.code = substr(t_tiers_payant.code_original,3,2);
INSERT INTO activite[PX].t_tiers_payant(code, code_original, type_tiers_payant, texte, texte_court)
SELECT 'MUTDIV', '*MUTDIV', '2', 'MUTUELLE DIVERSE', 'MUTUELLE DIVERSE'
WHERE '*MUTDIV' NOT IN (SELECT code_original FROM activite[PX].t_tiers_payant WHERE code_original IS NOT NULL);
]]></sqlcmd>
</NODE>
<NODE label="Médecins">
<sqlcmd><![CDATA[
INSERT INTO base.t_specialites_medecin(code_original, code, texte, texte_court)
SELECT
SP_CODE,
SP_CODE,
SP_LIB,
SP_LIB
FROM prod_cerner.SPECIALITE
LEFT JOIN base.t_specialites_medecin on t_specialites_medecin.code = SP_CODE
WHERE t_specialites_medecin.code IS NULL
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
IN_CODE,
base.cti_soundex_nom(IN_NOM) AS IN_NOM_SOUNDEX,
base.cti_soundex_nom(IN_PRENOM) AS IN_PRENOM_SOUNDEX,
IN_NOM,
IN_PRENOM AS IN_PRENOM,
SUBSTR(COALESCE(IN_IDNATIONAL,''),1,9) AS IN_IDNATIONAL,
IN_SPCODE,
COALESCE(t_medecins_administratifs.medecin_id,0) as medecin_id
FROM prod_cerner.INTERVENANT
LEFT JOIN activite[PX].t_medecins_administratifs ON IN_CODE = t_medecins_administratifs.code_original
WHERE IN_CODE IN (SELECT IN_CODE FROM w_MOUV_HOSPI_source) OR
IN_CODE IN (SELECT NGAP_INXCODE FROM prod_cerner.PASSAGE_NGAP)
ORDER BY 2
;
INSERT INTO base.t_medecins(nom, prenom, numero_ordre, specialite_id)
SELECT w_medecins.IN_NOM, w_medecins.IN_PRENOM, w_medecins.IN_IDNATIONAL, 0 FROM
(SELECT SUBSTR(IN_NOM_SOUNDEX, 1, 8) AS IN_NOM_SOUNDEX, SUBSTR(IN_PRENOM_SOUNDEX, 1, 8) AS IN_PRENOM_SOUNDEX, IN_IDNATIONAL, MIN(IN_CODE) AS IN_CODE
FROM w_medecins
GROUP BY 1,2,3) subview, w_medecins
WHERE w_medecins.IN_CODE = subview.IN_CODE
AND subview.IN_NOM_SOUNDEX || ',' || subview.IN_PRENOM_SOUNDEX || ',' || subview.IN_IDNATIONAL 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.IN_NOM, w_medecins.IN_PRENOM, w_medecins.IN_IDNATIONAL, 0 FROM
(SELECT IN_NOM_SOUNDEX, IN_PRENOM_SOUNDEX, MIN(IN_CODE) AS IN_CODE
FROM w_medecins
GROUP BY 1,2) subview, w_medecins
WHERE w_medecins.IN_CODE = subview.IN_CODE
AND subview.IN_NOM_SOUNDEX || ',' || subview.IN_PRENOM_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(IN_NOM_SOUNDEX, 1, 8) = subview.nom
AND SUBSTR(IN_PRENOM_SOUNDEX, 1, 8) = subview.prenom
AND IN_IDNATIONAL = 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(IN_NOM_SOUNDEX, 1, 8) = subview.nom
AND SUBSTR(IN_PRENOM_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 IN_CODE, substr(translate(IN_NOM,' -=()''',''),1,5) || substr(translate(IN_PRENOM,' -=()''',''),1,2), IN_NOM, IN_PRENOM, COALESCE(t_specialites_medecin.oid,0), medecin_id
FROM w_medecins
LEFT JOIN base.t_specialites_medecin ON IN_SPCODE = t_specialites_medecin.code_original
WHERE IN_CODE NOT IN (SELECT code_original FROM activite[PX].t_medecins_administratifs);
UPDATE activite[PX].t_medecins_administratifs
SET code = substr(translate(IN_NOM,' -=()''',''),1,5) || substr(translate(IN_PRENOM,' -=()''',''),1,2),
nom = IN_NOM,
prenom = IN_PRENOM,
specialite_id = COALESCE(t_specialites_medecin.oid,0),
medecin_id = w_medecins.medecin_id,
no_adeli = IN_IDNATIONAL
FROM w_medecins LEFT JOIN base.t_specialites_medecin ON IN_SPCODE = t_specialites_medecin.code_original
WHERE w_medecins.IN_CODE = t_medecins_administratifs.code_original
AND
(
t_medecins_administratifs.code <> substr(translate(IN_NOM,' -=()''',''),1,5) || substr(translate(IN_PRENOM,' -=()''',''),1,2) OR
t_medecins_administratifs.nom <> IN_NOM OR
t_medecins_administratifs.nom <> IN_NOM OR
t_medecins_administratifs.prenom <> IN_PRENOM OR
t_medecins_administratifs.specialite_id <> COALESCE(t_specialites_medecin.oid,0) OR
t_medecins_administratifs.medecin_id <> w_medecins.medecin_id OR
t_medecins_administratifs.no_adeli <> w_medecins.IN_IDNATIONAL
);
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;
]]></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);
INSERT INTO activite[PX].t_services_facturation(code_original, code, texte, texte_court, nb_lits, type_t2a)
SELECT UF_CODE, UF_CODE, UF_LIB, UF_LIB, 0 AS nb_lits, '0' AS type_t2a
FROM prod_cerner.UF
WHERE UF_CODE NOT IN (SELECT code_original FROM activite[PX].t_services_facturation WHERE code_original IS NOT NULL) AND
UF_CODE IN (SELECT MH_UFCODE FROM w_MOUV_HOSPI_source)
ORDER BY UF_CODE;
UPDATE activite[PX].t_services_facturation SET
code = UF_CODE,
texte = UF_LIB,
texte_court = CASE WHEN texte_court = texte THEN UF_LIB ELSE texte_court END
FROM prod_cerner.UF
WHERE UF_CODE = code_original AND
(
code IS DISTINCT FROM UF_CODE OR
texte IS DISTINCT FROM UF_LIB OR
texte_court IS DISTINCT FROM CASE WHEN texte_court = texte THEN UF_LIB ELSE texte_court END
)
;
INSERT INTO base.t_modes_traitement(code_original, code, texte, texte_court)
SELECT UF_ACTIVITE, UF_ACTIVITE, UF_ACTIVITE, UF_ACTIVITE
FROM prod_cerner.UF
WHERE UF_ACTIVITE NOT IN (SELECT code FROM base.t_modes_traitement WHERE code IS NOT NULL) AND
UF_ACTIVITE <> ''
GROUP BY 1
ORDER BY 1;
INSERT INTO activite[PX].t_services_facturation(code_original, code, texte, texte_court, nb_lits, type_t2a)
SELECT UF_CODE, UF_CODE, UF_LIB, UF_LIB, 0 AS nb_lits, '0' AS type_t2a
FROM prod_cerner.UF
WHERE UF_CODE NOT IN (SELECT code_original FROM activite[PX].t_services_facturation WHERE code_original IS NOT NULL) AND
UF_CODE IN (SELECT NGAP_UFXCODE FROM prod_cerner.PASSAGE_NGAP)
ORDER BY UF_CODE;
INSERT INTO activite[PX].t_services_facturation(code_original, code, texte, texte_court, nb_lits, type_t2a)
SELECT UF_CODE, UF_CODE, UF_LIB, UF_LIB, 0 AS nb_lits, '0' AS type_t2a
FROM prod_cerner.UF
WHERE UF_CODE NOT IN (SELECT code_original FROM activite[PX].t_services_facturation WHERE code_original IS NOT NULL) AND
UF_CODE IN (SELECT CDAM_UFXCODE FROM prod_cerner.PASSAGE_CDAM)
ORDER BY UF_CODE;
UPDATE activite[PX].t_services_facturation
SET mode_traitement_id = COALESCE(t_modes_traitement.oid,0)
FROM prod_cerner.UF
LEFT JOIN base.t_modes_traitement ON UF_ACTIVITE = t_modes_traitement.code
WHERE t_services_facturation.code_original = UF_CODE AND
COALESCE(mode_traitement_id,0) = 0 AND
COALESCE(mode_traitement_id,0) <> COALESCE(t_modes_traitement.oid,0);
INSERT INTO base.t_dmt(code_original, code, texte, texte_court)
SELECT DP_CODE, DP_CODE, DP_LIB, DP_LIB
FROM prod_cerner.DISP_PRES
WHERE DP_CODE NOT IN (SELECT code FROM base.t_dmt WHERE code IS NOT NULL) AND
DP_CODE <> ''
GROUP BY 1,2,3,4
ORDER BY 1;
UPDATE activite[PX].t_services_facturation
SET dmt_id = COALESCE(t_dmt.oid,0)
FROM prod_cerner.UF
LEFT JOIN base.t_dmt ON UF_DPCODE = t_dmt.code
WHERE t_services_facturation.code_original = UF_CODE AND
COALESCE(dmt_id,0) = 0 AND
COALESCE(dmt_id,0) <> COALESCE(t_dmt.oid,0);
UPDATE activite[PX].t_services_facturation
SET dmt_id = COALESCE(t_dmt.oid,0)
FROM prod_cerner.UF
LEFT JOIN base.t_dmt ON UF_DECODE = t_dmt.code
WHERE t_services_facturation.code_original = UF_CODE 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 UF_CODE, UF_CODE, UF_LIB, UF_LIB
FROM prod_cerner.UF
WHERE UF_CODE NOT IN (SELECT code_original FROM activite[PX].t_unites_fonctionnelles WHERE code_original IS NOT NULL) AND
UF_CODE IN (SELECT MH_UFCODE FROM w_MOUV_HOSPI_source)
ORDER BY UF_CODE;
INSERT INTO activite[PX].t_unites_fonctionnelles(code_original, code, texte, texte_court)
SELECT UF_CODE, UF_CODE, UF_LIB, UF_LIB
FROM prod_cerner.UF
WHERE UF_CODE NOT IN (SELECT code_original FROM activite[PX].t_unites_fonctionnelles WHERE code_original IS NOT NULL) AND
UF_CODE IN (SELECT NGAP_UFXCODE FROM prod_cerner.PASSAGE_NGAP)
ORDER BY UF_CODE;
INSERT INTO activite[PX].t_unites_fonctionnelles(code_original, code, texte, texte_court)
SELECT UF_CODE, UF_CODE, UF_LIB, UF_LIB
FROM prod_cerner.UF
WHERE UF_CODE NOT IN (SELECT code_original FROM activite[PX].t_unites_fonctionnelles WHERE code_original IS NOT NULL) AND
UF_CODE IN (SELECT CDAM_UFXCODE FROM prod_cerner.PASSAGE_CDAM)
ORDER BY UF_CODE;
UPDATE activite[PX].t_unites_fonctionnelles SET
code = UF_CODE,
texte = UF_LIB,
texte_court = CASE WHEN texte_court = texte THEN UF_LIB ELSE texte_court END
FROM prod_cerner.UF
WHERE UF_CODE = code_original AND
(
code IS DISTINCT FROM UF_CODE OR
texte IS DISTINCT FROM UF_LIB OR
texte_court IS DISTINCT FROM CASE WHEN texte_court = texte THEN UF_LIB 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_original, code, texte, texte_court
FROM activite[PX].t_unites_fonctionnelles
WHERE t_unites_fonctionnelles.oid <> 0 AND
t_unites_fonctionnelles.code_original NOT IN (SELECT t_unites_medicales.code_original FROM activite[PX].t_unites_medicales WHERE code_original IS NOT NULL)
ORDER BY code;
UPDATE activite[PX].t_unites_medicales SET
code = t_unites_fonctionnelles.code,
texte = t_unites_fonctionnelles.texte,
texte_court = t_unites_fonctionnelles.texte_court
FROM activite[PX].t_unites_fonctionnelles
WHERE t_unites_medicales.code_original = t_unites_fonctionnelles.code_original AND
t_unites_medicales.oid <> 0 AND
(
t_unites_medicales.code IS DISTINCT FROM t_unites_fonctionnelles.code OR
t_unites_medicales.texte IS DISTINCT FROM t_unites_fonctionnelles.texte OR
t_unites_medicales.texte_court IS DISTINCT FROM t_unites_fonctionnelles.texte_court
);
-- 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);
INSERT INTO activite[PX].t_activites(code_original, code, texte, texte_court)
SELECT RE_CODE, RE_CODE, RE_LIB, RE_LIB
FROM prod_cerner.REGROUPEMENT
WHERE RE_CODE NOT IN (SELECT code_original FROM activite[PX].t_activites WHERE code_original IS NOT NULL) AND
RE_CODE IN (SELECT HO_RECODE FROM prod_cerner.HOSPITALISATION)
ORDER BY RE_CODE;
UPDATE activite[PX].t_activites SET
code = RE_CODE,
texte = RE_LIB,
texte_court = RE_LIB
FROM prod_cerner.REGROUPEMENT
WHERE RE_CODE = code_original AND
(
t_activites.code IS DISTINCT FROM RE_CODE OR
t_activites.texte IS DISTINCT FROM RE_LIB OR
t_activites.texte_court IS DISTINCT FROM RE_LIB
)
;
-- Etages et lits
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 MH_ETCODE_CTI, MH_ETCODE_CTI, MH_ETCODE_CTI, MH_ETCODE_CTI, 0
FROM w_MOUV_HOSPI_source
WHERE MH_ETCODE_CTI <> '' AND
MH_ETCODE_CTI NOT IN (SELECT code_original FROM activite[PX].t_etages WHERE code_original IS NOT NULL)
GROUP BY 1
ORDER BY MH_ETCODE_CTI;
UPDATE activite[PX].t_etages SET
code = UF_CODE,
texte = UF_LIB,
texte_court = CASE WHEN texte_court = t_etages.texte THEN UF_LIB ELSE t_etages.texte_court END
FROM prod_cerner.UF
JOIN activite.t_divers ON t_divers.code = 'CERNER_SALLE=ETAGE' AND t_divers.valeur IS DISTINCT FROM '1'
WHERE UF_CODE = code_original AND
(
t_etages.code IS DISTINCT FROM UF_CODE OR
t_etages.texte IS DISTINCT FROM UF_LIB OR
t_etages.texte_court IS DISTINCT FROM CASE WHEN texte_court = t_etages.texte THEN UF_LIB ELSE t_etages.texte_court END
);
UPDATE activite[PX].t_etages SET
code = SA_CODE,
texte = SA_LIB,
texte_court = CASE WHEN texte_court = t_etages.texte THEN SA_LIB ELSE t_etages.texte_court END
FROM prod_cerner.SALLE
JOIN activite.t_divers ON t_divers.code = 'CERNER_SALLE=ETAGE' AND t_divers.valeur = '1'
WHERE SA_CODE = code_original AND
(
t_etages.code IS DISTINCT FROM SA_CODE OR
t_etages.texte IS DISTINCT FROM SA_LIB OR
t_etages.texte_court IS DISTINCT FROM CASE WHEN texte_court = t_etages.texte THEN SA_LIB ELSE t_etages.texte_court END
);
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);
DROP TABLE IF EXISTS w_lits;
CREATE TEMP TABLE w_lits AS
SELECT
MH_ETCODE_CTI AS etage_code,
''::text AS etage_texte,
MH_LICODE_CTI AS lit_code,
''::text AS lit_texte,
MH_ELCODE_CTI AS lit_code_original,
0::bigint AS lit_id
FROM w_MOUV_HOSPI_source
WHERE MH_ELCODE_CTI <> ''
GROUP BY 1,2,3,4,5,6
ORDER BY 1,2,3,4,5,6;
UPDATE w_lits
SET lit_texte = LI_LIB
FROM prod_cerner.LIT
WHERE LI_CODE = lit_code
;
UPDATE w_lits
SET lit_texte = SA_LIB
FROM prod_cerner.SALLE
WHERE SA_CODE = lit_code AND
lit_texte = ''
;
INSERT INTO activite[PX].t_lits(code_original, code, texte, texte_court, etage_id, chambre_particuliere)
SELECT lit_code_original, lit_code, lit_texte, lit_texte,
t_etages.oid, CASE WHEN lit_texte ilike '%individuel%' THEN 'O' ELSE 'N' END AS chambre_particuliere
FROM w_lits
JOIN activite[PX].t_etages ON etage_code = t_etages.code_original
WHERE lit_code_original <> '' AND
lit_code_original NOT IN (SELECT code_original FROM activite[PX].t_lits WHERE code_original IS NOT NULL)
GROUP BY 1,2,3,4,5,6
ORDER BY 1;
UPDATE w_lits
SET lit_id = t_lits.oid
FROM activite[PX].t_lits
WHERE lit_code_original = t_lits.code_original
;
UPDATE activite[PX].t_lits SET
code = lit_code,
texte = lit_texte,
texte_court = lit_texte
FROM w_lits
WHERE lit_code_original = code_original AND
(
t_lits.code IS DISTINCT FROM lit_code OR
t_lits.texte IS DISTINCT FROM lit_texte OR
t_lits.texte_court IS DISTINCT FROM lit_texte
)
;
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 );
]]></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 CT_CODE, CT_CODE, MAX(CT_LIB), MAX(CT_LIB)
FROM prod_cerner.CODE_TARIF
WHERE CT_CODE <> '' AND
CT_CODE NOT IN (SELECT code_original FROM activite[PX].t_rubriques_facturation WHERE code_original IS NOT NULL)
GROUP BY 1
ORDER BY 1;
UPDATE activite[PX].t_rubriques_facturation SET
code = CT_CODE,
texte = CT_LIB,
texte_court = CT_LIB
FROM
(
SELECT
CT_CODE,
MAX(CT_LIB) AS CT_LIB
FROM prod_cerner.CODE_TARIF
WHERE CT_CODE <> ''
GROUP BY 1
) subview
WHERE CT_CODE = code_original AND
(
t_rubriques_facturation.code IS DISTINCT FROM CT_CODE OR
t_rubriques_facturation.texte IS DISTINCT FROM CT_LIB OR
t_rubriques_facturation.texte_court IS DISTINCT FROM CT_LIB
)
;
INSERT INTO activite[PX].t_rubriques_facturation(code_original, code, texte, texte_court)
SELECT LC_CODE, LC_CODE, (MAX(ARRAY[LC_DDEB::text,LC_LIB]))[2], (MAX(ARRAY[LC_DDEB::text,LC_LIB]))[2]
FROM prod_cerner.LETTRE_CLE
WHERE LC_LIB <> '' AND
LC_CODE NOT IN (SELECT code_original FROM activite[PX].t_rubriques_facturation WHERE code_original IS NOT NULL)
GROUP BY 1
ORDER BY 1;
INSERT INTO activite[PX].t_rubriques_facturation(code_original, code, texte, texte_court)
SELECT LC_CODE, LC_CODE, LC_CODE, LC_CODE
FROM prod_cerner.LETTRE_CLE
WHERE LC_LIB = '' AND
LC_CODE NOT IN (SELECT code_original FROM activite[PX].t_rubriques_facturation WHERE code_original IS NOT NULL)
GROUP BY 1
ORDER BY 1;
UPDATE activite[PX].t_rubriques_facturation SET
code = LC_CODE,
texte = LC_DDEB,
texte_court = LC_DDEB
FROM
(
SELECT
LC_CODE,
(MAX(ARRAY[LC_DDEB::text,LC_LIB]))[2] AS LC_DDEB
FROM prod_cerner.LETTRE_CLE
WHERE LC_CODE <> ''
GROUP BY 1
) subview
WHERE LC_CODE = code_original AND
(
t_rubriques_facturation.code IS DISTINCT FROM LC_CODE OR
t_rubriques_facturation.texte IS DISTINCT FROM LC_DDEB OR
t_rubriques_facturation.texte_court IS DISTINCT FROM LC_DDEB
)
;
INSERT INTO activite[PX].t_rubriques_facturation(code_original, code, texte, texte_court)
SELECT CT_LET, CT_LET, MAX(CT_LIB), MAX(CT_LIB)
FROM prod_cerner.CODE_TARIF
WHERE CT_LET <> '' AND
CT_LET NOT IN (SELECT LC_CODE FROM prod_cerner.LETTRE_CLE) AND
CT_LET NOT IN (SELECT code_original FROM activite[PX].t_rubriques_facturation WHERE code_original IS NOT NULL)
GROUP BY 1
ORDER BY 1;
UPDATE activite[PX].t_rubriques_facturation
SET texte = CT_LIB, texte_court = CT_LIB
FROM
(
SELECT CT_LET, MAX(CT_LIB) AS CT_LIB
FROM prod_cerner.CODE_TARIF
JOIN activite[PX].t_rubriques_facturation ON CT_LET = code_original
WHERE t_rubriques_facturation.code = t_rubriques_facturation.texte
GROUP BY 1
HAVING count(DISTINCT CT_LIB) = 1 AND
MAX(CT_LIB) <> CT_LET
) subview
WHERE subview.CT_LET = t_rubriques_facturation.code_original
;
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);
INSERT INTO activite.t_prestations(code_original, code, texte, texte_court)
SELECT CT_LET, CT_LET, MAX(CT_LIB), MAX(CT_LIB)
FROM prod_cerner.CODE_TARIF
WHERE CT_LET <> '' AND
CT_LET NOT IN (SELECT code FROM activite.t_prestations WHERE code IS NOT NULL)
GROUP BY 1
ORDER BY 1;
INSERT INTO activite.t_prestations(code_original, code, texte, texte_court)
SELECT LC_CODEB2, LC_CODEB2, MAX(LC_CODEB2), MAX(LC_CODEB2)
FROM prod_cerner.LETTRE_CLE
WHERE LC_CODEB2 <> '' AND
LC_CODEB2 NOT IN (SELECT code FROM activite.t_prestations WHERE code IS NOT NULL)
GROUP BY 1
ORDER BY 1
;
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 MC_COMPTE,MC_COMPTE,MC_COMPTE,MC_COMPTE
FROM prod_cerner.MOUV_COMPTA
WHERE MC_COMPTE <> '' AND
MC_COMPTE <> '0' AND
MC_COMPTE NOT IN (SELECT code_original FROM activite[PX].t_compte WHERE code_original IS NOT NULL)
GROUP BY 1
ORDER BY 1
;
INSERT INTO activite[PX].t_compte(code_original, code, texte, texte_court)
SELECT FAD_COMPTE,FAD_COMPTE,FAD_COMPTE,FAD_COMPTE
FROM prod_cerner.FACTURE_DET
WHERE FAD_COMPTE <> '' AND
FAD_COMPTE <> '0' AND
FAD_COMPTE NOT IN (SELECT code_original FROM activite[PX].t_compte WHERE code_original IS NOT NULL)
GROUP BY 1
ORDER BY 1
;
UPDATE activite[PX].t_compte SET
code = MC_COMPTE,
texte = MC_COMPTE,
texte_court = MC_COMPTE
FROM prod_cerner.MOUV_COMPTA
WHERE MC_COMPTE = code_original AND
(
t_compte.code IS DISTINCT FROM MC_COMPTE OR
t_compte.texte IS DISTINCT FROM MC_COMPTE OR
t_compte.texte_court IS DISTINCT FROM MC_COMPTE
)
;
UPDATE activite[PX].t_compte SET
code = FAD_COMPTE,
texte = FAD_COMPTE,
texte_court = FAD_COMPTE
FROM prod_cerner.FACTURE_DET
WHERE FAD_COMPTE = code_original AND
(
t_compte.code IS DISTINCT FROM FAD_COMPTE OR
t_compte.texte IS DISTINCT FROM FAD_COMPTE OR
t_compte.texte_court IS DISTINCT FROM FAD_COMPTE
)
;
]]></sqlcmd>
</NODE>
</NODE>
<NODE name="POST" label="TRAITEMENTS COMPLEMENTAIRES">
<NODE label="Compléments facture">
<sqlcmd><![CDATA[
UPDATE activite[PX].p_factures SET date_expedition_0 = date_facture WHERE date_expedition_0 < date_facture AND date_facture <> '2099-12-31';
-- Si deux factures (une pour tp1 et une pour patient, il ne faut pas la quantité sur cette du patient
DROP TABLE IF EXISTS w_factures_lignes_quantite_0;
CREATE TEMP TABLE w_factures_lignes_quantite_0 AS
SELECT p_factures.no_sejour, p_factures_lignes_c.date_debut, prestation_id, rubrique_facturation_id
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
WHERE p_sejours.type_sejour = '3' AND
nb_prestation <> 0
GROUP BY 1,2,3,4
HAVING count(*) > 1 AND
MAX(CASE WHEN montant_facture_1 <> 0 THEN 1 ELSE 0 END) = 1 AND
MAX(CASE WHEN montant_facture_1 = 0 AND (montant_facture_2 <> 0 OR montant_facture_0 <> 0) THEN 1 ELSE 0 END) = 1
;
ANALYSE w_factures_lignes_quantite_0
;
UPDATE activite[PX].p_factures_lignes_c SET
nb_prestation = 0,
nb_rubrique = 0
FROM activite[PX].p_factures,
w_factures_lignes_quantite_0
WHERE p_factures_lignes_c.no_facture = p_factures.no_facture AND
p_factures.no_sejour = w_factures_lignes_quantite_0.no_sejour AND
p_factures_lignes_c.date_debut = w_factures_lignes_quantite_0.date_debut AND
p_factures_lignes_c.prestation_id = w_factures_lignes_quantite_0.prestation_id AND
p_factures_lignes_c.rubrique_facturation_id = w_factures_lignes_quantite_0.rubrique_facturation_id AND
montant_facture_1 = 0 AND (montant_facture_2 <> 0 OR montant_facture_0 <> 0)
]]></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
);
-- Sejours qui n'existe plus dans CERNER
UPDATE activite[PX].p_sejours
SET type_sejour = '9'
WHERE split_part(no_sejour,'.',1) NOT IN (SELECT HO_NUM FROM prod_cerner.HOSPITALISATION) AND type_sejour <> '9'
;
DELETE FROM activite[PX].p_mouvements_sejour
WHERE no_sejour IN (SELECT no_sejour FROM activite[PX].p_sejours WHERE type_sejour = '9')
;
]]></sqlcmd>
</NODE>
</NODE>
<NODE name="ENCOURS" label="ENCOURS ET VALORISATION DES NON FACTURES">
<NODE label="Encours et valorisation non facturés">
<sqlcmd><![CDATA[
--SELECT activite[PX].calcul_encours(NULL,'');
SELECT base.cti_vacuum_table('activite[PX]','p_factures_encours');
SELECT base.cti_vacuum_table('activite[PX]','p_factures_encours_lignes_c');
]]></sqlcmd>
</NODE>
</NODE>
</ROOT>