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.
 
 

9287 lines
395 KiB

<?xml version="1.0" encoding="ISO-8859-1"?>
<ROOT>
<NODE name="INIT" label="INITIALISATIONS">
<NODE label="Corrections">
<sqlcmd><![CDATA[
-- Longueur de la colonne LFAC_LET_CLE forcée à 16 au lieu de 5
-- Car on assigne LFAC_CODE(16) à LFAC_LET_CLE(5)
ALTER TABLE prod_hm.FAC_LIGNE_FACTURE
ALTER COLUMN LFAC_LET_CLE TYPE varchar(16)
;
-- Traitement si plusieurs medecins responsables
INSERT INTO activite.t_divers (code, texte, valeur, description)
SELECT
'HM_MULTIMED',
'Medecin responsable si plusieurs declares',
'0',
'0=Medecin de l''enveloppe séjour, 1=Medecin a l''entree'
WHERE 'HM_MULTIMED' NOT IN (SELECT code FROM activite.t_divers);
;
-- Correction medecin responsable si plusieurs medecins
UPDATE PROD_HM.IDE_SEJOUR
SET SEJO_ID_MEDE_COURANT = subview.MESE_ID_MEDE
FROM
(
SELECT MESE_ID_SEJO, (MIN(ARRAY[MESE_DAT_DEB::text,MESE_ID_MEDE::text]))[2]::bigint AS MESE_ID_MEDE, MAX(SEJO_ID_MEDE_COURANT) AS SEJO_ID_MEDE_COURANT
FROM prod_hm.IDE_MED_VENUE
JOIN PROD_HM.IDE_SEJOUR ON MESE_ID_SEJO = SEJO_ID_SEJO
JOIN prod_hm.BAS_CATALOGUE_PERS ON MESE_ID_CAPE = CAPE_ID_CAPE
JOIN prod_hm.IDE_MEDECIN ON MESE_ID_MEDE = MEDE_ID_MEDE
JOIN activite.t_divers ON t_divers.code = 'HM_MULTIMED' AND t_divers.valeur = '1'
WHERE CAPE_CODE = '1'
GROUP BY 1
HAVING (MIN(ARRAY[MESE_DAT_DEB::text,MESE_ID_MEDE::text]))[2]::bigint <> MAX(SEJO_ID_MEDE_COURANT)
) subview
WHERE SEJO_ID_SEJO = MESE_ID_SEJO
;
-- Séjours bébés avec ind bgh différents de la mère
UPDATE prod_hm.IDE_SEJOUR
SET SEJO_IND_BGH = IDE_SEJOUR_MERE.SEJO_IND_BGH
FROM prod_hm.IDE_SEJOUR IDE_SEJOUR_MERE
WHERE IDE_SEJOUR.SEJO_ID_SEJO_MER_ENF = IDE_SEJOUR_MERE.SEJO_ID_SEJO AND
IDE_SEJOUR_MERE.SEJO_IND_BGH IS DISTINCT FROM IDE_SEJOUR.SEJO_IND_BGH AND
IDE_SEJOUR.SEJO_ID_SEJO_MER_ENF <> 0
;
-- Forcage prestation
UPDATE prod_hm.PAD_PRESTATION_SEJOUR
SET PRSE_CODE = code_force
FROM activite[PX].t_rubriques_facturation
WHERE t_rubriques_facturation.code_original = PRSE_ID_PRSE AND
t_rubriques_facturation.code_force <> ''
;
UPDATE prod_hm.PAD_PRESTATION_HONORAIRE
SET PRHO_CODE = code_force
FROM activite[PX].t_rubriques_facturation
WHERE t_rubriques_facturation.code_original = PRHO_ID_PRHO AND
t_rubriques_facturation.code_force <> ''
;
UPDATE prod_hm.PAD_PRESTATION_SEJOUR
SET PRSE_LET_CLE = t_prestations.code
FROM activite[PX].t_rubriques_facturation
JOIN activite.t_prestations ON prestation_forcee_id = t_prestations.oid
WHERE t_rubriques_facturation.code_original = PRSE_ID_PRSE AND
t_rubriques_facturation.prestation_forcee_id > 0
;
UPDATE prod_hm.FAC_LIGNE_FACTURE
SET LFAC_LET_CLE = t_prestations.code
FROM activite[PX].t_rubriques_facturation
JOIN activite.t_prestations ON prestation_forcee_id = t_prestations.oid
WHERE t_rubriques_facturation.code_original = LFAC_ID_PRSE AND
t_rubriques_facturation.prestation_forcee_id > 0
;
-- Prestation vide dans lignes de facture
UPDATE prod_hm.FAC_LIGNE_FACTURE
SET LFAC_LET_CLE = LFAC_CODE
WHERE LFAC_LET_CLE = ''
;
-- Externes, mettre une date de fin cohérente
UPDATE prod_hm.IDE_SEJOUR
SET SEJO_DAT_FIN = SEJO_DAT_DEB + interval '2 hours'
FROM prod_hm.BAS_UF
JOIN prod_hm.BAS_CATEGORIE_UFM ON UNFO_ID_CUFM = CUFM_ID_CUFM
JOIN prod_hm.BAS_CATALOGUE_GEN BAS_CATALOGUE_GEN_MT ON CUFM_ID_CAGE_MT = BAS_CATALOGUE_GEN_MT.CAGE_ID_CAGE
WHERE SEJO_STATUT IN ('E','S') AND
(
SEJO_DAT_FIN IS NULL OR
(date(SEJO_DAT_FIN) - date(SEJO_DAT_DEB)) > 1
) AND
SEJO_ID_UNFO = UNFO_ID_UNFO AND
BAS_CATALOGUE_GEN_MT.CAGE_CODE = '07'
;
-- Le code 'M' est aussi médecin salarié
UPDATE prod_hm.FAC_LIGNE_FACTURE
SET LFAC_CDT_EXC = 'S'
WHERE LFAC_CDT_EXC = 'M'
;
-- Conserver les encours HM
INSERT INTO activite.t_divers (code, texte, valeur, description, show_info_module)
SELECT
'ENCOURSHM'
,'Conservation des encours du prestataire HM'
,'0'
,'1=Conserver les encours HM 0=Ne pas conserver',
false
WHERE NOT EXISTS (SELECT 1 FROM activite.t_divers WHERE code = 'ENCOURSHM')
;
]]></sqlcmd>
</NODE>
<NODE label="Identification des séjours">
<sqlcmd><![CDATA[
-- Les types de prestations exclues veant du PMSI MCO sont paramétrés
INSERT INTO activite.t_divers (code, texte, valeur, description)
SELECT
'EXCLUSIONPRESTATIONPMSI',
'Par défaut sont exclues les prestations suivant du PMSI MCO : BHN, PHN, ELMA, HYP, PB, PB F, PHH, PNDL, SAP, SCOL, SIND',
'BHN, PHN, ELMA, HYP, PB, PB F, PHH, PNDL, SAP, SCOL, SIND ',
'Type prestations exclues'
WHERE 'EXCLUSIONPRESTATIONPMSI' NOT IN (SELECT code FROM activite.t_divers);
;
-- Les types de journaux de ventes sont paramétrés
INSERT INTO activite.t_divers (code, texte, valeur, description)
SELECT
'HM_TYPJVT',
'HM. Types des journaux des ventes',
'FACAV',
'Types journaux de ventes HM'
WHERE 'HM_TYPJVT' NOT IN (SELECT code FROM activite.t_divers);
;
-- Les forcages par type de sejours sont paramétrés (anciennement, le type B était bébé)
INSERT INTO activite.t_divers (code, texte, valeur, description)
SELECT 'HM_TYPSEJ_' || CAPE_CODE,
'HM. Forcage type séjour ' || CAPE_LIBELLE || ' (' || CAPE_CODE || ')',
CASE WHEN CAPE_CODE = 'B' THEN '6' ELSE '' END,
'HM. Forcage type séjour ' || CAPE_LIBELLE || ' (' || CAPE_CODE || ')'
FROM
(
SELECT CAPE_CODE, MAX(CAPE_LIBELLE) AS CAPE_LIBELLE
FROM PROD_HM.IDE_SEJOUR
JOIN prod_hm.BAS_CATALOGUE_PERS ON (SEJO_ID_CAPE_VEN = CAPE_ID_CAPE)
GROUP BY 1
) subview
LEFT JOIN activite.t_divers ON t_divers.code = ('HM_TYPSEJ_' || CAPE_CODE)
WHERE t_divers.code IS NULL
ORDER BY 1
;
DROP TABLE IF EXISTS w_CCL_JOURNAL;
CREATE TEMP TABLE w_CCL_JOURNAL AS
SELECT JOUR_ID_JOUR, JOUR_CODE, CAGE_CODE AS JOUR_CAGE_CODE,
CASE WHEN CAGE_CODE = ANY(string_to_array(replace(t_divers.valeur,' ',''),',')) THEN '1' ELSE '0' END AS JOUR_ISJVT
FROM prod_hm.CCL_JOURNAL
JOIN prod_hm.BAS_CATALOGUE_GEN ON JOUR_ID_CAGE = CAGE_ID_CAGE
JOIN activite.t_divers ON t_divers.code = 'HM_TYPJVT';
ALTER TABLE w_CCL_JOURNAL ADD CONSTRAINT w_CCL_JOURNAL_pkey PRIMARY KEY(JOUR_ID_JOUR);
DROP TABLE IF EXISTS w_CCL_COMPTE;
CREATE TEMP TABLE w_CCL_COMPTE AS
SELECT CPTE_ID_CPTE, CPTE_CODE, CAGE_CODE AS CPTE_CAGE_CODE
FROM prod_hm.CCL_COMPTE
JOIN prod_hm.BAS_CATALOGUE_GEN ON CPTE_ID_CAGE = CAGE_ID_CAGE
WHERE CAGE_CODE IN ('CLIENT' , 'ACO85', 'ACO', 'CLIRMB');
ALTER TABLE w_CCL_COMPTE ADD CONSTRAINT w_CCL_COMPTE_pkey PRIMARY KEY(CPTE_ID_CPTE);
DROP TABLE IF EXISTS w_periode;
CREATE TEMP TABLE w_periode AS
SELECT GREATEST(date_trunc('month',date(MIN(ECRI_DAT_ECRITURE))),'[ENV_ADM_ANNEEDEBUT]0101'::date) AS date_debut_periode,
'00010101'::timestamp without time zone AS date_extraction
FROM
prod_hm.CCL_ECRITURE
JOIN w_CCL_JOURNAL ON ECRI_ID_JOUR = JOUR_ID_JOUR
WHERE
ECRI_DAT_SUP IS NULL
AND JOUR_ISJVT = '1'
AND ECRI_ID_ETAB IN ([ID_ETAB]);
UPDATE w_periode
SET date_extraction = DAT_MOD
FROM (
SELECT max(GREATEST(PATI_DAT_MOD,PATI_DAT_CRE)) AS DAT_MOD FROM prod_hm.IDE_PATIENT WHERE GREATEST(PATI_DAT_MOD,PATI_DAT_CRE) < now()
) subview
WHERE DAT_MOD > date_extraction;
UPDATE w_periode
SET date_extraction = DAT_MOD
FROM (
SELECT max(GREATEST(SEJO_DAT_MOD,SEJO_DAT_CRE)) AS DAT_MOD FROM prod_hm.IDE_SEJOUR WHERE GREATEST(SEJO_DAT_MOD,SEJO_DAT_CRE) < now()
) subview
WHERE DAT_MOD > date_extraction;
DROP TABLE IF EXISTS w_SEJOUR_compta;
CREATE TEMP TABLE w_SEJOUR_compta AS
SELECT
FACT_ID_SEJO
FROM prod_hm.CCL_LIGNE_ECRITURE,
prod_hm.CCL_ECRITURE,
w_CCL_JOURNAL,
w_CCL_COMPTE,
prod_hm.FAC_FACTURE_DEBITEUR,
prod_hm.FAC_FACTURE
WHERE
LECR_ID_ECRI = ECRI_ID_ECRI
AND LECR_ID_FACD = FACD_ID_FACD
AND FACD_ID_FACT = FACT_ID_FACT
AND ECRI_ID_JOUR = JOUR_ID_JOUR
AND LECR_ID_CPTE = CPTE_ID_CPTE
AND ECRI_DAT_SUP IS NULL
AND CPTE_CAGE_CODE IN ('CLIENT' , 'ACO85', 'ACO', 'CLIRMB')
AND ECRI_ID_ETAB IN ([ID_ETAB])
AND ECRI_DAT_ECRITURE >= '[ENV_ADM_ANNEEDEBUT]0101'
GROUP BY 1
ORDER BY 1;
DROP TABLE IF EXISTS w_IDE_SEJOUR;
CREATE TEMP TABLE w_IDE_SEJOUR AS
SELECT
date_extraction,
SEJO_ID_SEJO AS w_SEJO_ID_SEJO,
MAX(CASE WHEN COALESCE(SEJO_NUM_SEJ,'') = '' THEN 'W' || SEJO_ID_SEJO::bigint ELSE SEJO_NUM_SEJ END) AS w_SEJO_NUM_SEJ
FROM w_periode , prod_hm.IDE_SEJOUR
WHERE SEJO_ID_ETAB_CON IN ([ID_ETAB])
AND ((SEJO_DAT_SUP IS NULL AND SEJO_IND_INCOMPLET IS DISTINCT FROM '1'))
AND (SEJO_DAT_DEB BETWEEN date_debut_periode AND now() + interval '2 day' OR SEJO_DAT_FIN >= date_debut_periode OR SEJO_DAT_FIN IS NULL)
AND (SEJO_DAT_FIN IS NOT NULL AND SEJO_DAT_FIN <= date_extraction + interval '1 year' OR SEJO_DAT_FIN IS NULL)
AND (SEJO_STATUT NOT IN ('A', 'P') OR (SEJO_STATUT IN ('A', 'P') AND (SEJO_DAT_DEB >= date_extraction AND (SEJO_DAT_FIN IS NULL OR SEJO_DAT_FIN >= date_extraction))))
GROUP BY 1,2;
ALTER TABLE w_IDE_SEJOUR ADD CONSTRAINT w_IDE_SEJOUR_pk PRIMARY KEY(w_SEJO_ID_SEJO);
INSERT INTO w_IDE_SEJOUR
SELECT date_extraction,
SEJO_ID_SEJO AS w_SEJO_ID_SEJO,
MAX(CASE WHEN COALESCE(SEJO_NUM_SEJ,'') = '' THEN 'W' || SEJO_ID_SEJO::bigint ELSE SEJO_NUM_SEJ END) AS w_SEJO_NUM_SEJ
FROM w_periode, prod_hm.FAC_FACTURE
JOIN prod_hm.IDE_SEJOUR ON FACT_ID_SEJO = SEJO_ID_SEJO
WHERE FACT_DAT_SUP IS NULL AND
SEJO_ID_ETAB_CON IN ([ID_ETAB]) AND
FACT_DAT_CRE >= '[ENV_ADM_ANNEEDEBUT]0101' AND
FACT_ID_SEJO NOT IN (SELECT w_SEJO_ID_SEJO FROM w_IDE_SEJOUR)
GROUP BY 1,2
;
INSERT INTO w_IDE_SEJOUR
SELECT
date_extraction,
SEJO_ID_SEJO AS w_SEJO_ID_SEJO,
MAX(CASE WHEN COALESCE(SEJO_NUM_SEJ,'') = '' THEN 'W' || SEJO_ID_SEJO::bigint ELSE SEJO_NUM_SEJ END) AS w_SEJO_NUM_SEJ
FROM w_periode , prod_hm.IDE_SEJOUR
WHERE SEJO_ID_ETAB_CON IN ([ID_ETAB])
AND SEJO_ID_SEJO IN (SELECT FACT_ID_SEJO FROM w_SEJOUR_compta)
AND SEJO_ID_SEJO NOT IN (SELECT w_SEJO_ID_SEJO FROM w_IDE_SEJOUR)
GROUP BY 1,2;
DROP TABLE IF EXISTS w_IDE_SEJOUR_complet;
CREATE TEMP TABLE w_IDE_SEJOUR_complet AS
SELECT
w_SEJO_NUM_SEJ,
w_SEJO_ID_SEJO,
date_extraction,
IDE_SEJOUR.*
FROM w_IDE_SEJOUR
JOIN prod_hm.IDE_SEJOUR ON SEJO_ID_SEJO = w_SEJO_ID_SEJO;
ALTER TABLE w_IDE_SEJOUR_complet ADD CONSTRAINT w_IDE_SEJOUR_complet_pk PRIMARY KEY(SEJO_ID_SEJO);
UPDATE w_IDE_SEJOUR_complet SET
w_SEJO_NUM_SEJ = w_IDE_SEJOUR_complet.w_SEJO_NUM_SEJ || '_2'
FROM
(SELECT w_SEJO_NUM_SEJ, MAX(w_SEJO_ID_SEJO) AS w_SEJO_ID_SEJO
FROM w_IDE_SEJOUR_complet
GROUP BY 1
HAVING count(*) > 1) subview
WHERE subview.w_SEJO_ID_SEJO = w_IDE_SEJOUR_complet.w_SEJO_ID_SEJO;
UPDATE w_IDE_SEJOUR_complet SET
w_SEJO_NUM_SEJ = w_IDE_SEJOUR_complet.w_SEJO_NUM_SEJ || '_3'
FROM
(SELECT w_SEJO_NUM_SEJ, MAX(w_SEJO_ID_SEJO) AS w_SEJO_ID_SEJO
FROM w_IDE_SEJOUR_complet
GROUP BY 1
HAVING count(*) > 1) subview
WHERE subview.w_SEJO_ID_SEJO = w_IDE_SEJOUR_complet.w_SEJO_ID_SEJO;
UPDATE w_IDE_SEJOUR_complet SET
w_SEJO_NUM_SEJ = w_IDE_SEJOUR_complet.w_SEJO_NUM_SEJ || '_4'
FROM
(SELECT w_SEJO_NUM_SEJ, MAX(w_SEJO_ID_SEJO) AS w_SEJO_ID_SEJO
FROM w_IDE_SEJOUR_complet
GROUP BY 1
HAVING count(*) > 1) subview
WHERE subview.w_SEJO_ID_SEJO = w_IDE_SEJOUR_complet.w_SEJO_ID_SEJO;
UPDATE w_IDE_SEJOUR_complet SET
w_SEJO_NUM_SEJ = w_IDE_SEJOUR_complet.w_SEJO_NUM_SEJ || '_5'
FROM
(SELECT w_SEJO_NUM_SEJ, MAX(w_SEJO_ID_SEJO) AS w_SEJO_ID_SEJO
FROM w_IDE_SEJOUR_complet
GROUP BY 1
HAVING count(*) > 1) subview
WHERE subview.w_SEJO_ID_SEJO = w_IDE_SEJOUR_complet.w_SEJO_ID_SEJO;
UPDATE w_IDE_SEJOUR_complet SET
w_SEJO_NUM_SEJ = w_IDE_SEJOUR_complet.w_SEJO_NUM_SEJ || '_6'
FROM
(SELECT w_SEJO_NUM_SEJ, MAX(w_SEJO_ID_SEJO) AS w_SEJO_ID_SEJO
FROM w_IDE_SEJOUR_complet
GROUP BY 1
HAVING count(*) > 1) subview
WHERE subview.w_SEJO_ID_SEJO = w_IDE_SEJOUR_complet.w_SEJO_ID_SEJO;
UPDATE w_IDE_SEJOUR_complet
SET SEJO_NUM_SEJ = w_SEJO_NUM_SEJ
WHERE w_SEJO_NUM_SEJ <> SEJO_NUM_SEJ;
CREATE INDEX w_IDE_SEJOUR_complet_i1
ON w_IDE_SEJOUR_complet
USING btree
(w_SEJO_NUM_SEJ);
ANALYSE w_IDE_SEJOUR_complet
;
-- Correction HM suppression anciennes factures provisoires
UPDATE prod_hm.FAC_FACTURE
SET FACT_DAT_SUP = subview.FACT_DAT_DER_CALCUL
FROM
(
SELECT FACT_ID_SEJO, FACT_DAT_DEB_FAC, count(*),
(MAX(ARRAY[FACT_DAT_DER_CALCUL::text, FACT_ID_FACT::text]))[2]::bigint AS FACT_ID_DER_CALCUL,
MAX(FACT_DAT_DER_CALCUL) AS FACT_DAT_DER_CALCUL
FROM prod_hm.FAC_FACTURE
WHERE FACT_TYPE = 'P' AND FACT_DAT_SUP IS NULL
GROUP BY 1,2
HAVING count(*) > 1
) subview
WHERE FAC_FACTURE.FACT_ID_SEJO = subview.FACT_ID_SEJO AND
FAC_FACTURE.FACT_DAT_DEB_FAC = subview.FACT_DAT_DEB_FAC AND
FAC_FACTURE.FACT_TYPE = 'P' AND
FAC_FACTURE.FACT_DAT_SUP IS NULL AND
FAC_FACTURE.FACT_ID_FACT <> FACT_ID_DER_CALCUL
;
-- Corrections base HM : Factures annulées comptabilisées
UPDATE prod_hm.FAC_FACTURE
SET FACT_DAT_SUP = NULL
WHERE FACT_DAT_SUP IS NOT NULL AND
FACT_ID_FACT IN
(
SELECT
FACT_ID_FACT
FROM prod_hm.CCL_LIGNE_ECRITURE,
prod_hm.CCL_ECRITURE,
w_CCL_JOURNAL,
w_CCL_COMPTE,
prod_hm.FAC_FACTURE_DEBITEUR,
prod_hm.FAC_FACTURE
WHERE
LECR_ID_ECRI = ECRI_ID_ECRI
AND LECR_ID_FACD = FACD_ID_FACD
AND FACD_ID_FACT = FACT_ID_FACT
AND ECRI_ID_JOUR = JOUR_ID_JOUR
AND LECR_ID_CPTE = CPTE_ID_CPTE
AND ECRI_DAT_SUP IS NULL
AND CPTE_CAGE_CODE IN ('CLIENT' , 'ACO85', 'ACO', 'CLIRMB')
AND ECRI_ID_ETAB IN ([ID_ETAB])
AND ECRI_DAT_ECRITURE >= '[ENV_ADM_ANNEEDEBUT]0101'
AND FACT_TYPE <> 'P'
AND FACT_DAT_SUP IS NOT NULL
AND JOUR_CAGE_CODE= 'FACAV'
GROUP BY 1
ORDER BY 1
);
-- Numéros de factures en double
ALTER TABLE prod_hm.fac_facture ALTER fact_num_fac TYPE text;
SELECT base.cti_execute('
UPDATE prod_hm.FAC_FACTURE
SET FACT_NUM_FAC = FAC_FACTURE.FACT_NUM_FAC || ''.'' || count
FROM (
SELECT FACT_NUM_FAC, MAX(FACT_ID_FACT) AS FACT_ID_FACT, count(*) AS count
FROM prod_hm.FAC_FACTURE
WHERE
FACT_NUM_FAC <> '''' AND
FACT_TYPE <> ''E'' AND
(FACT_TYPE = ''P'' OR FACT_DAT_SUP IS NULL)
GROUP BY 1
HAVING COUNT(*) > 1
) subview
WHERE FAC_FACTURE.FACT_ID_FACT = subview.FACT_ID_FACT',1000);
]]></sqlcmd>
</NODE>
<NODE label="Détection modifications">
<sqlcmd><![CDATA[
]]></sqlcmd>
</NODE>
</NODE>
<NODE name="SEJOUR" label="RECUPERATION DES SEJOURS">
<NODE label="Patients">
<sqlcmd><![CDATA[
DROP TABLE IF EXISTS w_patients;
CREATE TEMP TABLE w_patients AS
SELECT CASE WHEN PATI_NIP = '' OR PATI_NIP IS NULL THEN 'W' || PATI_ID_PATI::bigint ELSE PATI_NIP END AS w_PATI_NIP,
MAX(PATI_ID_PATI) AS w_PATI_ID_PATI
FROM w_IDE_SEJOUR_complet JOIN prod_hm.IDE_PATIENT ON SEJO_ID_PATI = PATI_ID_PATI
GROUP BY 1;
INSERT INTO activite[PX].p_patients(finess, no_patient, nom, nom_naissance, prenom, date_naissance, code_sexe)
SELECT '', w_PATI_NIP, PATI_NOM_USU, PATI_NOM_NAI, PATI_PRENOM, date(PATI_DAT_NAI), CASE WHEN PATI_SEXE = 'F' THEN '2' ELSE '1' END
FROM w_patients
JOIN prod_hm.IDE_PATIENT ON PATI_ID_PATI = w_PATI_ID_PATI
LEFT JOIN activite[PX].p_patients ON (w_PATI_NIP = p_patients.no_patient)
WHERE p_patients.no_patient IS NULL;
UPDATE activite[PX].p_patients
SET nom = PATI_NOM_USU,
nom_naissance = PATI_NOM_NAI,
prenom = PATI_PRENOM,
date_naissance = date(PATI_DAT_NAI),
code_sexe = CASE WHEN PATI_SEXE = 'F' THEN '2' ELSE '1' END
FROM prod_hm.IDE_PATIENT JOIN w_patients ON PATI_ID_PATI = w_PATI_ID_PATI
WHERE p_patients.no_patient = w_PATI_NIP
AND (
p_patients.nom IS DISTINCT FROM PATI_NOM_USU OR
p_patients.nom_naissance IS DISTINCT FROM PATI_NOM_NAI OR
p_patients.prenom IS DISTINCT FROM PATI_PRENOM OR
p_patients.date_naissance IS DISTINCT FROM date(PATI_DAT_NAI) OR
p_patients.code_sexe IS DISTINCT FROM CASE WHEN PATI_SEXE = 'F' THEN '2' ELSE '1' END
);
-- Suppression des tables de travail non utilisées après
DROP TABLE IF EXISTS w_patients;
]]></sqlcmd>
</NODE>
<NODE label="Séjours">
<sqlcmd><![CDATA[
DROP TABLE IF EXISTS w_IDE_PEC;
CREATE TEMP TABLE w_IDE_PEC AS
SELECT SEJO_ID_SEJO AS PECH_ID_SEJO,
COALESCE(MAX(t_tiers_payant_0.oid),0)::bigint AS tiers_payant_0_id,
COALESCE(MAX(t_tiers_payant_1.oid),0)::bigint AS tiers_payant_1_id,
COALESCE(MIN(t_tiers_payant_2.oid),0)::bigint AS tiers_payant_2_id,
COALESCE(MAX(t_tiers_payant_2.oid),0)::bigint AS tiers_payant_22_id,
COALESCE(MAX(ASSU_NUM_SEC_SOC)) AS matricule_1,
COALESCE(MAX(SEAM_NUM_ADHERENT)) AS matricule_2
FROM w_IDE_SEJOUR_complet
LEFT JOIN prod_hm.IDE_PEC
LEFT JOIN activite[PX].t_tiers_payant t_tiers_payant_1 ON (PECH_ID_ORGA_AMO::bigint = t_tiers_payant_1.code_original AND PECH_ID_ORGA_AMO <> 0) ON (SEJO_ID_SEJO = PECH_ID_SEJO)
LEFT JOIN prod_hm.IDE_ASSURE ON ASSU_ID_ASSU = PECH_ID_ASSU
LEFT JOIN prod_hm.IDE_SEJOUR_AMC
LEFT JOIN activite[PX].t_tiers_payant t_tiers_payant_2 ON (SEAM_ID_ORGA_AMC::bigint = t_tiers_payant_2.code_original AND SEAM_ID_ORGA_AMC <> 0) ON (SEJO_ID_SEJO = SEAM_ID_SEJO)
LEFT JOIN activite[PX].t_tiers_payant t_tiers_payant_0 ON (t_tiers_payant_0.type_tiers_payant = '0' AND t_tiers_payant_0.oid <> 0)
GROUP BY 1;
ALTER TABLE w_IDE_PEC ADD CONSTRAINT w_IDE_PEC_pkey PRIMARY KEY(PECH_ID_SEJO);
DROP TABLE IF EXISTS w_IDE_MOUVEMENT_S;
CREATE TEMP TABLE w_IDE_MOUVEMENT_S AS
SELECT MOUV_ID_SEJO, 'S'::text AS MOUV_STATUT
FROM prod_hm.IDE_MOUVEMENT
JOIN w_IDE_SEJOUR ON MOUV_ID_SEJO = w_SEJO_ID_SEJO
JOIN prod_hm.BAS_CATALOGUE_GEN ON (MOUV_ID_CAGE = CAGE_ID_CAGE AND CAGE_CODE IN ('S'))
WHERE date(MOUV_DAT_MOU) <= date(now())
GROUP BY 1;
CREATE INDEX w_IDE_MOUVEMENT_S_i1
ON w_IDE_MOUVEMENT_S
USING btree
(MOUV_ID_SEJO);
DROP TABLE IF EXISTS w_sejours;
CREATE TEMP TABLE w_sejours AS
SELECT
CASE WHEN SEJO_NUM_SEJ IS NULL OR SEJO_NUM_SEJ = '' THEN 'W' || SEJO_ID_SEJO ELSE SEJO_NUM_SEJ END as no_sejour,
w_SEJO_ID_SEJO::bigint as code_original,
CASE WHEN PATI_NIP = '' OR PATI_NIP IS NULL THEN 'W' || PATI_ID_PATI::bigint ELSE PATI_NIP END AS no_patient,
date(SEJO_DAT_DEB) as date_entree,
extract('hour' FROM SEJO_DAT_DEB) * 10000 + extract('minute' FROM SEJO_DAT_DEB) * 100 + extract('second' FROM SEJO_DAT_DEB) as heure_entree,
CASE WHEN SEJO_DAT_FIN IS NOT NULL AND (SEJO_STATUT IN ('S', 'M') OR MOUV_STATUT IN ('S')) THEN date(SEJO_DAT_FIN) ELSE '20991231' END::date as date_sortie,
CASE WHEN SEJO_DAT_FIN IS NOT NULL THEN extract('hour' FROM SEJO_DAT_FIN) * 10000 + extract('minute' FROM SEJO_DAT_FIN) * 100 + extract('second' FROM SEJO_DAT_FIN) ELSE 0 END as heure_sortie,
CASE WHEN PATI_SEXE = 'F' THEN '2' ELSE '1' END as code_sexe,
0 AS age,
CASE WHEN SEJO_STATUT IN ('S', 'M') AND SEJO_DAT_FIN <= date(now()) OR MOUV_STATUT IN ('S') THEN 1 ELSE 0 END as code_sorti,
CASE WHEN SEJO_STATUT IN ('A', 'P') OR date(SEJO_DAT_DEB) > date(date_extraction) THEN 1 ELSE 0 END as code_prevu,
CASE
WHEN SEJO_DAT_SUP IS NOT NULL THEN '9'
WHEN SEJO_IND_INCOMPLET = '1' THEN '9'
WHEN SEJO_STATUT = 'Z' THEN '9'
WHEN t_divers.valeur IN ('1', '2', '3', '4', '5', '6', '9') THEN t_divers.valeur
WHEN t_services_facturation.type_sejour IN ('1', '2', '3', '4', '5') THEN t_services_facturation.type_sejour
WHEN t_modes_traitement.code IN ('07') OR t_dmt.code In ('958') THEN '3'
WHEN t_modes_traitement.code IN ('19', '23') AND date(SEJO_DAT_FIN) = date(SEJO_DAT_DEB) THEN '2'
WHEN t_modes_traitement.code IN ('04') AND date(SEJO_DAT_FIN) = date(SEJO_DAT_DEB) THEN '2'
WHEN t_modes_traitement.code IN ('03') AND date(SEJO_DAT_FIN) = date(SEJO_DAT_DEB) THEN '2'
WHEN t_modes_traitement.code IN ('10') AND date(SEJO_DAT_FIN) <= date(SEJO_DAT_DEB) + interval '1 day' THEN '3'
ELSE '1' END as type_sejour,
t_medecins_administratifs.oid as medecin_sejour_id,
0 as ghs_id,
'20991231'::date as date_groupage,
SEJO_IND_CHB_PAR as code_cp_demandee,
t_services_facturation.mode_traitement_id as mode_traitement_id,
'8'::character(1) as mode_entree,
'0'::character(1) as provenance,
'8'::character(1) as mode_sortie,
'0'::character(1) as destination,
COALESCE(tiers_payant_0_id,0) AS tiers_payant_0_id,
COALESCE(tiers_payant_1_id,0) AS tiers_payant_1_id,
COALESCE(tiers_payant_2_id,0) AS tiers_payant_2_id,
CASE WHEN COALESCE(tiers_payant_22_id,0) <> COALESCE(tiers_payant_2_id,0) THEN COALESCE(tiers_payant_22_id,0) ELSE 0 END AS tiers_payant_22_id,
CASE WHEN COALESCE(SEJO_IND_BGH,'0') = '1' THEN 1 ELSE 0 END AS est_budget_global,
COALESCE(t_divers.valeur,'') AS type_sejour_force_hm
FROM w_IDE_SEJOUR_complet
LEFT JOIN w_IDE_PEC ON (PECH_ID_SEJO = SEJO_ID_SEJO)
JOIN prod_hm.IDE_PATIENT ON SEJO_ID_PATI = PATI_ID_PATI
JOIN prod_hm.BAS_CATALOGUE_PERS ON (SEJO_ID_CAPE_VEN = CAPE_ID_CAPE)
LEFT JOIN activite.t_divers ON t_divers.code = ('HM_TYPSEJ_' || CAPE_CODE)
JOIN activite[PX].t_services_facturation ON SEJO_ID_UNFO::bigint = t_services_facturation.code_original
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
JOIN activite[PX].t_medecins_administratifs ON SEJO_ID_MEDE_COURANT::bigint = t_medecins_administratifs.code_original
LEFT JOIN w_IDE_MOUVEMENT_S ON w_SEJO_ID_SEJO = MOUV_ID_SEJO
;
SELECT base.cti_disable_index('activite[PX]', 'i_sejours_2');
SELECT base.cti_disable_index('activite[PX]', 'i_sejours_3');
SELECT base.cti_disable_index('activite[PX]', 'i_sejours_4');
SELECT base.cti_disable_index('activite[PX]', 'i_sejours_5');
SELECT base.cti_disable_index('activite[PX]', 'i_sejours_6');
SELECT base.cti_disable_index('activite[PX]', 'i_sejours_7');
SELECT base.cti_disable_index('activite[PX]', 'i_sejours_8');
SELECT base.cti_disable_index('activite[PX]', 'i_sejours_9');
SELECT base.cti_disable_index('activite[PX]', 'i_sejours_10');
SELECT base.cti_disable_index('activite[PX]', 'i_sejours_11');
SELECT base.cti_disable_index('activite[PX]', 'i_sejours_12');
SELECT base.cti_disable_index('activite[PX]', 'i_sejours_13');
-- 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');
UPDATE activite[PX].p_sejours SET
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,
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
FROM w_sejours
WHERE w_sejours.no_sejour = p_sejours.no_sejour
AND (
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.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
);
INSERT INTO activite[PX].p_sejours (
no_sejour,
code_original,
no_patient,
date_entree,
heure_entree,
date_sortie,
heure_sortie,
code_sexe,
age,
code_sorti,
code_prevu,
type_sejour,
medecin_sejour_id,
ghs_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
)
SELECT
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.medecin_sejour_id,
w_sejours.ghs_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
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
USING activite[PX].p_sejours AS p_sejours_i LEFT JOIN w_sejours ON (w_sejours.no_sejour = p_sejours_i.no_sejour)
WHERE
p_sejours.no_sejour = p_sejours_i.no_sejour AND
w_sejours.no_sejour IS NULL;
-- Modes entrée sortie selon mouvements
DROP TABLE IF EXISTS w_MOUV_MOD_SOR;
CREATE TEMP TABLE w_MOUV_MOD_SOR AS
SELECT MOUV_ID_SEJO,
(MAX(ARRAY[MOUV_DAT_MOU::text, CAPE_CODE]))[2]::text AS MOD_SOR
FROM prod_hm.IDE_MOUVEMENT
JOIN activite[PX].p_sejours ON MOUV_ID_SEJO::bigint = p_sejours.code_original
JOIN prod_hm.BAS_CATALOGUE_GEN ON (MOUV_ID_CAGE = CAGE_ID_CAGE AND CAGE_CODE IN ('E', 'D', 'M', 'S'))
JOIN prod_hm.BAS_CATALOGUE_PERS ON (MOUV_ID_CAPE_SOR = CAPE_ID_CAPE)
GROUP BY 1;
UPDATE w_MOUV_MOD_SOR
SET MOD_SOR = '80' WHERE MOD_SOR = '8';
UPDATE activite[PX].p_sejours
SET mode_sortie = substr(MOD_SOR,1,1)
FROM w_MOUV_MOD_SOR
WHERE code_original = MOUV_ID_SEJO AND
substr(MOD_SOR,1,1) IS DISTINCT FROM mode_sortie AND
substr(MOD_SOR,1,1) IN (SELECT code FROM base.t_modes_sortie);
UPDATE activite[PX].p_sejours
SET destination = substr(MOD_SOR,2,1)
FROM w_MOUV_MOD_SOR
WHERE code_original = MOUV_ID_SEJO AND
length(MOD_SOR) = 2 AND
substr(MOD_SOR,2,1) IS DISTINCT FROM destination AND
substr(MOD_SOR,2,1) IN (SELECT code FROM base.t_destinations_sortie);
DROP TABLE IF EXISTS w_MOUV_MOD_ENT;
CREATE TEMP TABLE w_MOUV_MOD_ENT AS
SELECT MOUV_ID_SEJO,
(MIN(ARRAY[MOUV_DAT_MOU::text, CAPE_CODE]))[2]::text AS MOD_ENT
FROM prod_hm.IDE_MOUVEMENT
JOIN activite[PX].p_sejours ON MOUV_ID_SEJO::bigint = p_sejours.code_original
JOIN prod_hm.BAS_CATALOGUE_GEN ON (MOUV_ID_CAGE = CAGE_ID_CAGE AND CAGE_CODE IN ('E', 'D', 'M', 'S'))
JOIN prod_hm.BAS_CATALOGUE_PERS ON (MOUV_ID_CAPE_ENT = CAPE_ID_CAPE)
GROUP BY 1;
UPDATE w_MOUV_MOD_ENT
SET MOD_ENT = '80' WHERE MOD_ENT = '8';
UPDATE activite[PX].p_sejours
SET mode_entree = substr(MOD_ENT,1,1)
FROM w_MOUV_MOD_ENT
WHERE code_original = MOUV_ID_SEJO AND
substr(MOD_ENT,1,1) IS DISTINCT FROM mode_entree AND
substr(MOD_ENT,1,1) IN (SELECT code FROM base.t_modes_entree);
UPDATE activite[PX].p_sejours
SET provenance = substr(MOD_ENT,2,1)
FROM w_MOUV_MOD_ENT
WHERE code_original = MOUV_ID_SEJO AND
length(MOD_ENT) = 2 AND
substr(MOD_ENT,2,1) IS DISTINCT FROM provenance AND
substr(MOD_ENT,2,1) IN (SELECT code FROM base.t_provenances_entree);
-- Modes entrée sortie selon PMSI MCO
UPDATE activite[PX].p_sejours
SET mode_entree = CASE WHEN TRUM_MOD_ENT < 8 THEN '0'::text ELSE SUBSTR(TRUM_MOD_ENT::bigint * 10,1,1) END,
provenance = CASE WHEN TRUM_MOD_ENT < 8 THEN TRUM_MOD_ENT::text ELSE SUBSTR(TRUM_MOD_ENT::bigint * 10,2,1) END
FROM w_IDE_SEJOUR_complet JOIN
(SELECT
TRUM_ID_SEJO,
MIN(TRUM_DAT_ENT_RUM) AS TRUM_DAT_ENT_RUM,
(MIN(ARRAY[TRUM_DAT_ENT_RUM::text,TRUM_MOD_ENT::text]))[2]::bigint AS TRUM_MOD_ENT
FROM
prod_hm.PMS_RUM
GROUP BY 1) sub ON SEJO_ID_SEJO = TRUM_ID_SEJO AND date(TRUM_DAT_ENT_RUM) = date(SEJO_DAT_DEB)
WHERE
no_sejour = w_SEJO_NUM_SEJ AND
(
mode_entree <> CASE WHEN TRUM_MOD_ENT < 8 THEN '0'::text ELSE SUBSTR(TRUM_MOD_ENT::bigint * 10,1,1) END OR
provenance <> CASE WHEN TRUM_MOD_ENT < 8 THEN TRUM_MOD_ENT::text ELSE SUBSTR(TRUM_MOD_ENT::bigint * 10,2,1) END
)
;
UPDATE activite[PX].p_sejours
SET mode_sortie = CASE WHEN TRUM_MOD_SOR < 8 THEN '0'::text ELSE SUBSTR(TRUM_MOD_SOR::bigint * 10,1,1) END,
destination = CASE WHEN TRUM_MOD_SOR < 8 THEN TRUM_MOD_SOR::text ELSE SUBSTR(TRUM_MOD_SOR::bigint * 10,2,1) END
FROM w_IDE_SEJOUR_complet JOIN
(SELECT
TRUM_ID_SEJO,
MAX(TRUM_DAT_SOR_RUM) AS TRUM_DAT_SOR_RUM,
(MAX(ARRAY[TRUM_DAT_SOR_RUM::text,TRUM_MOD_SOR::text]))[2]::bigint AS TRUM_MOD_SOR
FROM
prod_hm.PMS_RUM
GROUP BY 1) sub ON SEJO_ID_SEJO = TRUM_ID_SEJO AND date(TRUM_DAT_SOR_RUM) = date(SEJO_DAT_FIN)
WHERE
no_sejour = w_SEJO_NUM_SEJ AND
(
mode_sortie <> CASE WHEN TRUM_MOD_SOR < 8 THEN '0'::text ELSE SUBSTR(TRUM_MOD_SOR::bigint * 10,1,1) END OR
destination <> CASE WHEN TRUM_MOD_SOR < 8 THEN TRUM_MOD_SOR::text ELSE SUBSTR(TRUM_MOD_SOR::bigint * 10,2,1) END
);
-- Etablissements de provenance et destination
-- insertion nouveaux etablissements
DROP TABLE IF EXISTS w_ETAB;
CREATE TEMP TABLE w_ETAB AS
SELECT * FROM prod_hm.IDE_ETABLISSEMENT_EXTERIEUR LEFT JOIN base.t_etablissements ON ETEX_CODE = code
WHERE ETEX_ID_ETEX = ANY(array(SELECT SEJO_ID_ETEX_PRO FROM prod_hm.IDE_SEJOUR)::bigint[])
OR ETEX_ID_ETEX = ANY(array(SELECT SEJO_ID_ETEX_DES FROM prod_hm.IDE_SEJOUR)::bigint[]);
INSERT INTO base.t_etablissements
(
code,
texte,
texte_court
)
SELECT
ETEX_CODE,
ETEX_NOM,
ETEX_NOM
FROM w_ETAB
WHERE code IS NULL;
-- rechargements des etablissements
DROP TABLE IF EXISTS w_ETAB;
CREATE TEMP TABLE w_ETAB AS
SELECT * FROM prod_hm.IDE_ETABLISSEMENT_EXTERIEUR LEFT JOIN base.t_etablissements ON ETEX_CODE = code;
-- insertion des données de correspondances (pas d'update car les tables sont vidées avant import)
DROP TABLE IF EXISTS w_TRANS;
CREATE TEMP TABLE w_TRANS AS
SELECT
CASE WHEN SEJO_NUM_SEJ IS NULL OR SEJO_NUM_SEJ = '' THEN 'W' || SEJO_ID_SEJO ELSE SEJO_NUM_SEJ END as no_sejour,
etex_pro.oid as oid_pro,
etex_des.oid as oid_des
FROM w_IDE_SEJOUR_complet
LEFT JOIN w_ETAB as etex_pro ON w_IDE_SEJOUR_complet.SEJO_ID_ETEX_PRO = etex_pro.ETEX_ID_ETEX
LEFT JOIN w_ETAB as etex_des ON w_IDE_SEJOUR_complet.SEJO_ID_ETEX_DES = etex_des.ETEX_ID_ETEX
WHERE SEJO_ID_ETEX_PRO <> 0 OR SEJO_ID_ETEX_DES <> 0;
INSERT INTO activite[PX].p_sejours_transferts(
sejour_id,
provenance_id,
destination_id
)
SELECT
p_sejours.oid,
MAX(COALESCE(oid_pro,0)),
MAX(COALESCE(oid_des,0))
FROM activite[PX].p_sejours
JOIN w_TRANS ON w_TRANS.no_sejour = p_sejours.no_sejour
GROUP BY 1
;
-- ghm et ghs
UPDATE activite[PX].p_sejours SET
ghs_id = COALESCE(t_ghs.oid,0),
ghm_id = COALESCE(t_ghm.oid,0),
date_groupage = CASE WHEN TGHM_NUMERO <> '' AND TGHM_NUMERO NOT LIKE '90%' THEN COALESCE(date(TRUM_DAT_DER_GROUPAGE),'20991231)') ELSE '20991231' END
FROM prod_hm.PMS_RSS
LEFT JOIN
(
SELECT TRUM_ID_TRSS, MAX(TRUM_DAT_DER_GROUPAGE) AS TRUM_DAT_DER_GROUPAGE FROM prod_hm.PMS_RUM GROUP BY 1
) subview ON TRUM_ID_TRSS = TRSS_ID_TRSS
LEFT JOIN prod_hm.PMS_GHM ON (TRSS_ID_TGHM = TGHM_ID_TGHM)
LEFT JOIN base.t_ghs ON TRSS_SARGH_NUM_GHS = t_ghs.code
LEFT JOIN base.t_ghm ON TGHM_NUMERO = t_ghm.code AND t_ghm.code NOT LIKE '90%'
WHERE
p_sejours.code_original = TRSS_ID_SEJO_D AND
TGHM_NUMERO <> '' AND
(
p_sejours.ghs_id IS DISTINCT FROM COALESCE(t_ghs.oid,0) OR
p_sejours.ghm_id IS DISTINCT FROM COALESCE(t_ghm.oid,0) OR
p_sejours.date_groupage IS DISTINCT FROM CASE WHEN TGHM_NUMERO <> '' AND TGHM_NUMERO NOT LIKE '90%' THEN COALESCE(date(TRUM_DAT_DER_GROUPAGE),'20991231)') ELSE '20991231' END
)
;
-- Code postal ?
DROP TABLE IF EXISTS w_SEJO_COD_POS;
CREATE TEMP TABLE w_SEJO_COD_POS AS
SELECT SEJO_ID_SEJO,
(MAX(ARRAY[ADRE_DAT_MOD::text, ADRE_COD_POS]))[2]::text AS ADRE_COD_POS,
(MAX(ARRAY[ADRE_DAT_MOD::text, ADRE_VILLE]))[2]::text AS ADRE_VILLE,
(MAX(ARRAY[ADRE_DAT_MOD::text, COALESCE(t_codes_postaux.oid,0)::text]))[2]::bigint AS code_postal_id
FROM prod_hm.IDE_PATIENT
JOIN prod_hm.IDE_SEJOUR ON SEJO_ID_PATI = PATI_ID_PATI
JOIN prod_hm.IDE_ADRESSE ON PATI_ID_PATI = ADRE_ID_OBJ
JOIN base.t_codes_postaux ON ADRE_COD_POS = t_codes_postaux.code
JOIN prod_hm.BAS_CATALOGUE_GEN ON IDE_ADRESSE.ADRE_ID_CAGE = BAS_CATALOGUE_GEN.CAGE_ID_CAGE AND CAGE_CODE = 'ADR_PERSO'
WHERE ADRE_COD_POS <> '' AND LENGTH(ADRE_COD_POS) = 5
GROUP BY 1;
UPDATE activite[PX].p_sejours
SET code_postal_id = w_SEJO_COD_POS.code_postal_id
FROM w_SEJO_COD_POS
WHERE code_original = SEJO_ID_SEJO AND
p_sejours.code_postal_id IS DISTINCT FROM w_SEJO_COD_POS.code_postal_id;
-- Type séance d'après GHM
UPDATE activite[PX].p_sejours
SET type_sejour = '5'
FROM base.t_ghm,
activite[PX].t_lieux
JOIN activite[PX].t_services_facturation ON service_facturation_id = t_services_facturation.oid
WHERE p_sejours.type_sejour <> '5' AND
p_sejours.type_sejour <> '9' AND
ghm_id = t_ghm.oid AND
lieu_sortie_id = t_lieux.oid AND
t_services_facturation.type_sejour <> '0sauf5' AND
t_ghm.code LIKE '28%' AND
no_sejour NOT IN (SELECT no_sejour FROM w_sejours WHERE type_sejour_force_hm <> '');
-- Séjours ignorés
UPDATE activite[PX].p_sejours
SET etat = 'I'
FROM activite.t_sejour
WHERE t_sejour.no_sejour = p_sejours.no_sejour AND
est_ignore = '1' AND
etat <> 'I' AND
'[PX]' = '';
UPDATE activite[PX].p_sejours
SET etat = ''
WHERE etat = 'I' AND
no_sejour NOT IN (SELECT no_sejour FROM activite.t_sejour WHERE est_ignore = '1') AND
'[PX]' = '';
-- Médecin séjour forcé
UPDATE activite[PX].p_sejours
SET medecin_sejour_id = t_sejour.medecin_sejour_id
FROM activite.t_sejour
WHERE t_sejour.no_sejour = p_sejours.no_sejour AND
t_sejour.medecin_sejour_id <> 0 AND
p_sejours.medecin_sejour_id IS DISTINCT FROM t_sejour.medecin_sejour_id AND
'[PX]' = '';
-- recréation index
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_2');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_3');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_4');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_5');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_6');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_7');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_8');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_9');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_10');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_11');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_12');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_13');
-- assurance
SELECT base.cti_disable_index('activite[PX]', 'i_sejours_assurance_1');
SELECT base.cti_disable_index('activite[PX]', 'i_sejours_assurance_2');
SELECT base.cti_disable_index('activite[PX]', 'i_sejours_assurance_3');
SELECT base.cti_disable_index('activite[PX]', 'i_sejours_assurance_4');
INSERT INTO activite[PX].p_sejours_assurance(
sejour_id,
tiers_payant_0_id,
tiers_payant_1_id,
matricule_1,
tiers_payant_2_id,
matricule_2,
tiers_payant_22_id,
matricule_22)
SELECT
oid AS sejour_id,
p_sejours.tiers_payant_0_id,
p_sejours.tiers_payant_1_id,
substr(w_IDE_PEC.matricule_1,1,30),
p_sejours.tiers_payant_2_id,
substr(w_IDE_PEC.matricule_2,1,30),
p_sejours.tiers_payant_22_id,
''::text AS matricule_22
FROM w_IDE_PEC
JOIN activite[PX].p_sejours ON code_original = PECH_ID_SEJO AND p_sejours.etat = '';
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_assurance_1');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_assurance_2');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_assurance_3');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_assurance_4');
-- SMR
-- Compléments d'informations
DROP TABLE IF EXISTS w_sejours_smr_groupes;
CREATE TEMP TABLE w_sejours_smr_groupes AS
WITH dernier_gme_valide_par_sejour AS (
SELECT DISTINCT ON (trhs_id_sejo)
trhs_id_sejo AS sejour_id
, PMS_GME.TGME_CODE AS gme_code
, t_gme.oid AS gme_id
, trhs_dat_der_groupage AS date_groupage
FROM prod_hm.pms_rhs
JOIN prod_hm.PMS_GME ON PMS_GME.TGME_ID_TGME = PMS_RHS.TRHS_ID_TGME
JOIN base.t_gme ON PMS_GME.TGME_CODE = t_gme.code
ORDER BY trhs_id_sejo, trhs_dat_ent DESC, trhs_dat_der_groupage DESC
)
SELECT
IDE_SEJOUR.SEJO_NUM_SEJ AS no_sejour
, IDE_SEJOUR.sejo_dat_deb AS date_entree
, IDE_SEJOUR.sejo_dat_fin AS date_sortie
, COALESCE(TRHS_DAT_DER_GROUPAGE, dernier_gme_valide_par_sejour.date_groupage) AS date_groupage
, dernier_gme_valide_par_sejour.gme_code AS gme_code
, dernier_gme_valide_par_sejour.gme_id AS gme_id
, PMS_RHS.TRHS_COD_GMT AS gmt_code
, 0 AS gmt_id
, PMS_RHS.TRHS_DAT_ENT AS date_debut_rhs
, PMS_RHS.TRHS_DAT_SOR AS date_fin_rhs
, PMS_RHS.TRHS_NBJ_PRES_HWE AS nb_jours_presence_semaine
, DATE_PART('day', pms_rhs.TRHS_DAT_SOR - sejo_dat_deb) + 1 AS nb_jours_presence_total
, CASE
WHEN DATE_PART('day', pms_rhs.TRHS_DAT_SOR - sejo_dat_deb) <= 90 THEN 'periode_1'
ELSE 'periode_2'
END AS periode
, ''::text AS types_gmt_code
FROM prod_hm.pms_rhs
JOIN prod_hm.ide_sejour ON ide_sejour.sejo_id_sejo = pms_rhs.trhs_id_sejo
JOIN dernier_gme_valide_par_sejour ON dernier_gme_valide_par_sejour.sejour_id = pms_rhs.trhs_id_sejo
JOIN activite[PX].p_sejours ON p_sejours.no_sejour = IDE_SEJOUR.SEJO_NUM_SEJ
WHERE 1 = 1
AND SEJO_STATUT NOT IN ('A', 'P')
AND TRHS_DAT_SOR <= now()
ORDER BY SEJO_NUM_SEJ, TRHS_DAT_ENT
;
ANALYZE w_sejours_smr_groupes;
WITH sejours_avec_gmt_9999 AS (
SELECT DISTINCT(no_sejour)
FROM w_sejours_smr_groupes
WHERE gmt_code = '9999'
),
gmt_hc_reconstitues_par_sejour AS (
SELECT
w_sejours_smr_groupes.no_sejour
, gmt1.code AS code_gmt_90_premiers_jours
, gmt2.code AS gmt_post_90_jours
FROM w_sejours_smr_groupes
JOIN sejours_avec_gmt_9999 ON sejours_avec_gmt_9999.no_sejour = w_sejours_smr_groupes.no_sejour
JOIN base.v_tarifs_prive_gmt_hc_pre_90_jours gmt1 ON w_sejours_smr_groupes.gme_code = gmt1.gme_code
AND w_sejours_smr_groupes.date_debut_rhs BETWEEN gmt1.date_debut AND gmt1.date_fin
JOIN base.v_tarifs_prive_gmt_en_7 gmt2 ON w_sejours_smr_groupes.gme_code = gmt2.gme_code
AND w_sejours_smr_groupes.date_debut_rhs BETWEEN gmt2.date_debut AND gmt2.date_fin
)
UPDATE w_sejours_smr_groupes
SET gmt_code =
CASE
WHEN periode = 'periode_1' THEN code_gmt_90_premiers_jours
ELSE gmt_post_90_jours
END
FROM gmt_hc_reconstitues_par_sejour
WHERE w_sejours_smr_groupes.no_sejour = gmt_hc_reconstitues_par_sejour.no_sejour
;
WITH dernier_gmt_valide_par_sejour AS (
SELECT DISTINCT ON (no_sejour)
no_sejour
, gmt_code
FROM w_sejours_smr_groupes
WHERE gmt_code <> ''
ORDER BY no_sejour, date_fin_rhs DESC, date_groupage DESC
)
UPDATE w_sejours_smr_groupes
SET gmt_code = dernier_gmt_valide_par_sejour.gmt_code
FROM dernier_gmt_valide_par_sejour
WHERE dernier_gmt_valide_par_sejour.no_sejour = w_sejours_smr_groupes.no_sejour
AND w_sejours_smr_groupes.gmt_code = ''
;
WITH affectation_dates_gmt AS (
SELECT DISTINCT ON (periode, no_sejour)
periode
, no_sejour
, MIN(date_debut_rhs) AS date_debut_rhs
, MAX(date_fin_rhs) AS date_fin_rhs
FROM w_sejours_smr_groupes
GROUP BY
periode
, no_sejour
)
UPDATE w_sejours_smr_groupes
SET
date_debut_rhs = affectation_dates_gmt.date_debut_rhs
, date_fin_rhs = affectation_dates_gmt.date_fin_rhs
FROM affectation_dates_gmt
WHERE affectation_dates_gmt.no_sejour = w_sejours_smr_groupes.no_sejour
AND w_sejours_smr_groupes.periode = affectation_dates_gmt.periode
;
WITH presence_moyenne_hebdomadaire AS (
SELECT
no_sejour
, SUM(nb_jours_presence_semaine) AS total_presence_hebdomadaire
, GREATEST(COUNT(*), 1) AS nombre_semaines
FROM w_sejours_smr_groupes
WHERE nb_jours_presence_semaine <> 0
GROUP BY no_sejour
)
UPDATE w_sejours_smr_groupes
SET nb_jours_presence_semaine = (total_presence_hebdomadaire / nombre_semaines)::numeric
FROM presence_moyenne_hebdomadaire
WHERE presence_moyenne_hebdomadaire.no_sejour = w_sejours_smr_groupes.no_sejour
AND nb_jours_presence_semaine = 0
;
WITH presence_hors_weekend_par_sejour AS (
SELECT
no_sejour
, SUM(nb_jours_presence_semaine) AS total_jours_presence
FROM w_sejours_smr_groupes
GROUP BY 1
)
UPDATE w_sejours_smr_groupes
SET nb_jours_presence_semaine = total_jours_presence
FROM presence_hors_weekend_par_sejour
WHERE presence_hors_weekend_par_sejour.no_sejour = w_sejours_smr_groupes.no_sejour
;
UPDATE w_sejours_smr_groupes
SET nb_jours_presence_total = nb_jours_presence_total - 90
WHERE
EXISTS (SELECT 1 FROM base.v_tarifs_prive_gmt_en_7 WHERE v_tarifs_prive_gmt_en_7.code = w_sejours_smr_groupes.gmt_code)
AND periode = 'periode_2'
;
UPDATE w_sejours_smr_groupes
SET types_gmt_code =
CASE
WHEN EXISTS (SELECT 1 FROM base.v_tarifs_prive_gmt_forfaitisables WHERE w_sejours_smr_groupes.gmt_code = v_tarifs_prive_gmt_forfaitisables.code) THEN 'hc_forfaitisable'
WHEN EXISTS (SELECT 1 FROM base.v_tarifs_prive_gmt_non_forfaitisables WHERE w_sejours_smr_groupes.gmt_code = v_tarifs_prive_gmt_non_forfaitisables.code) THEN 'hc_non_forfaitisable'
WHEN EXISTS (SELECT 1 FROM base.v_tarifs_prive_gmt_hospitalisation_partielle WHERE w_sejours_smr_groupes.gmt_code = v_tarifs_prive_gmt_hospitalisation_partielle.code) THEN 'hp_hebdomadaire'
ELSE 'hc_sans_zf'
END
;
DROP TABLE IF EXISTS w_codes_pour_sejours_avec_deux_gmt;
CREATE TEMP TABLE w_codes_pour_sejours_avec_deux_gmt AS
SELECT code, gme_code, date_debut, date_fin FROM base.v_tarifs_prive_gmt_dzf_90
UNION
SELECT code, gme_code, date_debut, date_fin FROM base.v_tarifs_prive_gmt_forfaitisables
UNION
SELECT code, gme_code, date_debut, date_fin FROM base.v_tarifs_prive_gmt_non_forfaitisables
UNION
SELECT code, gme_code, date_debut, date_fin FROM base.v_tarifs_prive_gmt_en_7
;
-- Mise à jour des dates de début de rhs pour hospitalisations partielles de + 90jrs
WITH sejours_hp AS (
SELECT
no_sejour
, MIN(date_debut_rhs) AS date_debut_rhs
FROM w_sejours_smr_groupes
WHERE types_gmt_code = 'hp_hebdomadaire'
GROUP BY no_sejour
)
UPDATE w_sejours_smr_groupes
SET date_debut_rhs = sejours_hp.date_debut_rhs
FROM sejours_hp
WHERE sejours_hp.no_sejour = w_sejours_smr_groupes.no_sejour
;
-- Mise à jour des dates de fin de rhs en HC pour les patients encore présents
WITH sejours_hc_patients_presents AS (
SELECT DISTINCT ON (no_sejour)
no_sejour
, periode
, date_sortie
FROM w_sejours_smr_groupes
WHERE
types_gmt_code ILIKE 'hc%'
AND (
w_sejours_smr_groupes.date_sortie IS NULL
OR w_sejours_smr_groupes.date_sortie > now()
)
ORDER BY
no_sejour
, periode DESC
)
UPDATE w_sejours_smr_groupes
SET date_fin_rhs = now()
FROM sejours_hc_patients_presents
WHERE
sejours_hc_patients_presents.no_sejour = w_sejours_smr_groupes.no_sejour
AND sejours_hc_patients_presents.periode = w_sejours_smr_groupes.periode
;
WITH sejours_gmt_hospit_partielle AS (
SELECT DISTINCT ON (no_sejour)
no_sejour
, date_entree
, date_sortie
, date_groupage
, gmt_code
, gmt_id
, gme_code
, gme_id
, date_debut_rhs
, date_fin_rhs
, nb_jours_presence_semaine
, types_gmt_code
FROM w_sejours_smr_groupes
WHERE types_gmt_code = 'hp_hebdomadaire'
ORDER BY
no_sejour
, date_fin_rhs DESC
),
sejours_gmt_en_8 AS (
SELECT DISTINCT ON (no_sejour)
no_sejour
, date_entree
, date_sortie
, date_groupage
, gmt_code
, gmt_id
, gme_code
, gme_id
, date_debut_rhs
, date_fin_rhs
, nb_jours_presence_total
, types_gmt_code
FROM w_sejours_smr_groupes
WHERE gmt_code LIKE '8%'
ORDER BY
no_sejour
, date_fin_rhs DESC
),
sejours_gmt_multiples AS (
SELECT DISTINCT ON (no_sejour, gmt_code, periode)
no_sejour
, date_entree
, date_sortie
, date_groupage
, gmt_code
, gmt_id
, gme_code
, gme_id
, date_debut_rhs
, date_fin_rhs
, nb_jours_presence_total
, types_gmt_code
FROM w_sejours_smr_groupes
WHERE EXISTS (
SELECT 1 FROM w_codes_pour_sejours_avec_deux_gmt
WHERE w_sejours_smr_groupes.gmt_code = w_codes_pour_sejours_avec_deux_gmt.code
AND w_sejours_smr_groupes.gme_code = w_codes_pour_sejours_avec_deux_gmt.gme_code
AND w_sejours_smr_groupes.date_fin_rhs BETWEEN w_codes_pour_sejours_avec_deux_gmt.date_debut AND w_codes_pour_sejours_avec_deux_gmt.date_fin
)
ORDER BY
no_sejour
, gmt_code, periode
, nb_jours_presence_total DESC
)
INSERT INTO activite[PX].p_sejours_groupes_smr (no_sejour, date_entree, date_sortie, date_groupage, gmt_code, gmt_id, gme_code, gme_id, date_debut_gmt, date_fin_gmt, nb_jours_presence, types_gmt_code)
SELECT *
FROM sejours_gmt_multiples
UNION ALL
SELECT * FROM sejours_gmt_hospit_partielle
UNION ALL
SELECT * FROM sejours_gmt_en_8
ON CONFLICT (no_sejour, gmt_code)
DO NOTHING
;
-- MAJ des séjours groupés dans la table des séjours
WITH dernier_groupage_par_sejour AS (
SELECT DISTINCT ON (no_sejour)
p_sejours_groupes_smr.date_groupage::date
, t_gmt.oid AS gmt_id
, t_gmt.code AS gmt_code
, no_sejour
, p_sejours_groupes_smr.gme_id
FROM activite[PX].p_sejours_groupes_smr
JOIN base.t_gmt ON p_sejours_groupes_smr.gmt_code = t_gmt.code
ORDER BY
no_sejour
, date_debut_gmt DESC
)
UPDATE activite[PX].p_sejours
SET
date_groupage = dernier_groupage_par_sejour.date_groupage
, gmt_id = dernier_groupage_par_sejour.gmt_id
, gme_id = dernier_groupage_par_sejour.gme_id
, delai_groupage = dernier_groupage_par_sejour.date_groupage - p_sejours.date_sortie
FROM dernier_groupage_par_sejour
WHERE dernier_groupage_par_sejour.no_sejour = p_sejours.no_sejour
;
-- Suppression des tables de travail non utilisées après
DROP TABLE IF EXISTS w_IDE_PEC;
DROP TABLE IF EXISTS w_sejours;
DROP TABLE IF EXISTS w_IDE_MOUVEMENT_S;
DROP TABLE IF EXISTS w_sejours_smr_groupes;
DROP TABLE IF EXISTS w_codes_pour_sejours_avec_deux_gmt;
]]></sqlcmd>
</NODE>
<NODE label="Mouvements">
<sqlcmd><![CDATA[
-- Recherche UM principale
DROP TABLE IF EXISTS w_PMS_RUM_principal;
CREATE TEMP TABLE w_PMS_RUM_principal AS
SELECT TRUM_ID_SEJO,
COALESCE(
(MIN(Array[CASE WHEN TRUM_IND_PRINCIPAL = '1' THEN TRUM_DAT_ENT_RUM ELSE NULL END::text, CASE WHEN TRUM_IND_PRINCIPAL = '1' THEN TRUM_ID_UNME ELSE NULL END::text]))[2],
(MIN(Array[TRUM_DAT_ENT_RUM::text,TRUM_ID_UNME::text]))[2]
)::bigint AS TRUM_ID_UNME_principale
FROM prod_hm.PMS_RUM
JOIN activite[PX].p_sejours ON p_sejours.code_original = TRUM_ID_SEJO
GROUP BY 1;
CREATE INDEX w_PMS_RUM_principal_i1
ON w_PMS_RUM_principal
USING btree
(TRUM_ID_SEJO);
ANALYSE w_PMS_RUM_principal
;
-- Séjours hors PMSi = derniere UM
INSERT INTO w_PMS_RUM_principal
SELECT MOUV_ID_SEJO,
(MAX(Array[MOUV_DAT_MOU::text, UNFO_ID_UNME::text]))[2]::bigint
FROM prod_hm.IDE_MOUVEMENT
JOIN activite[PX].p_sejours ON MOUV_ID_SEJO::bigint = p_sejours.code_original
JOIN prod_hm.BAS_UF ON UNFO_ID_UNFO = MOUV_ID_UNFO
LEFT JOIN w_PMS_RUM_principal ON TRUM_ID_SEJO = MOUV_ID_SEJO
WHERE TRUM_ID_SEJO IS NULL
GROUP BY 1;
-- Traitement des mouvements
DROP SEQUENCE IF EXISTS w_IDE_MOUVEMENT_seq;
CREATE TEMP SEQUENCE w_IDE_MOUVEMENT_seq
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 1
CACHE 1;
UPDATE prod_hm.IDE_MOUVEMENT
SET MOUV_DAT_MOU = MOUV_DAT_MOU + '2 second'
FROM prod_hm.BAS_CATALOGUE_GEN
WHERE 1=1
AND MOUV_ID_CAGE = CAGE_ID_CAGE
AND CAGE_CODE IN ('D','M')
AND extract('hour' FROM MOUV_DAT_MOU) * 10000 + extract('minute' FROM MOUV_DAT_MOU) * 100 + extract('second' FROM MOUV_DAT_MOU) = 0
;
DROP TABLE IF EXISTS w_IDE_MOUVEMENT;
CREATE TEMP TABLE w_IDE_MOUVEMENT AS
SELECT nextval('w_IDE_MOUVEMENT_seq'::regclass) AS sequence,
subview.MOUV_ID_SEJO,
subview.SEJO_NUM_SEJ,
subview.SEJO_CODE_CAPE_VEN,
subview.SEJO_ID_SEJO_MER_ENF,
subview.MOUV_DAT_MOU,
date(subview.MOUV_DAT_MOU) AS MOUV_DAT_MOU_DAT,
extract('hour' FROM MOUV_DAT_MOU) * 10000 + extract('minute' FROM MOUV_DAT_MOU) * 100 + extract('second' FROM MOUV_DAT_MOU) AS MOUV_DAT_MOU_TIM,
'2099/12/31'::timestamp without time zone AS MOUV_DAT_FIN,
date('2099/12/31')::date AS MOUV_DAT_FIN_DAT,
000000::numeric(6, 0) AS MOUV_DAT_FIN_TIM,
subview.CAGE_CODE,
subview.TRUM_ID_UNME_principale,
subview.MOUV_ID_UNFO,
subview.MOUV_ID_UNFO_MED,
CASE
WHEN subview.MOUV_ID_LIPO = 0 THEN subview.MOUV_ID_UNFO::text || '-0'
WHEN subview.MOUV_ID_UNFO <> subview.CHAS_ID_UNFO THEN subview.MOUV_ID_UNFO::text || '-0'
ELSE subview.MOUV_ID_LIPO::text END AS MOUV_ID_LIPO,
''::character(1) AS CAGE_CODE_before,
'0'::text AS MOUV_ID_UNFO_before,
'0'::text AS MOUV_ID_UNFO_MED_before,
0::text AS MOUV_ID_LIPO_before,
''::character(1) AS CAGE_CODE_next,
'0'::text AS MOUV_ID_UNFO_next,
'0'::text AS MOUV_ID_UNFO_MED_next,
0::text AS MOUV_ID_LIPO_next
FROM
(
SELECT
CASE WHEN SEJO_NUM_SEJ IS NULL OR SEJO_NUM_SEJ = '' THEN 'W' || SEJO_ID_SEJO ELSE SEJO_NUM_SEJ END AS SEJO_NUM_SEJ,
MOUV_ID_SEJO,
CASE WHEN CAGE_CODE = 'E' THEN SEJO_DAT_DEB WHEN CAGE_CODE = 'S' THEN SEJO_DAT_FIN ELSE MOUV_DAT_MOU END AS MOUV_DAT_MOU,
CAGE_CODE,
COALESCE(TRUM_ID_UNME_principale,0) AS TRUM_ID_UNME_principale,
MOUV_ID_UNFO::text,
MOUV_ID_UNFO_MED::text,
MOUV_ID_LIPO,
COALESCE(CHAS_ID_UNFO,0) AS CHAS_ID_UNFO,
CAPE_CODE AS SEJO_CODE_CAPE_VEN,
SEJO_ID_SEJO_MER_ENF
FROM prod_hm.IDE_MOUVEMENT
JOIN activite[PX].p_sejours ON MOUV_ID_SEJO::bigint = p_sejours.code_original
JOIN w_IDE_SEJOUR_complet ON MOUV_ID_SEJO = SEJO_ID_SEJO
LEFT JOIN prod_hm.PAD_LIT_POSTE ON MOUV_ID_LIPO = LIPO_ID_LIPO
LEFT JOIN prod_hm.PAD_CHAMBRE_SALLE ON LIPO_ID_CHAS = CHAS_ID_CHAS
LEFT JOIN w_PMS_RUM_principal ON TRUM_ID_SEJO = MOUV_ID_SEJO
JOIN prod_hm.BAS_CATALOGUE_GEN ON (MOUV_ID_CAGE = CAGE_ID_CAGE AND CAGE_CODE IN ('E', 'D', 'M', 'S', 'C','P', 'F','T', 'A', 'R'))
JOIN prod_hm.BAS_CATALOGUE_PERS ON (SEJO_ID_CAPE_VEN = CAPE_ID_CAPE)
ORDER BY CASE WHEN SEJO_NUM_SEJ IS NULL OR SEJO_NUM_SEJ = '' THEN 'W' || SEJO_ID_SEJO ELSE SEJO_NUM_SEJ END, MOUV_DAT_MOU, CAGE_CODE
) subview;
-- calcul date fin
UPDATE w_IDE_MOUVEMENT
SET MOUV_DAT_FIN = CASE WHEN w_IDE_MOUVEMENT_next.CAGE_CODE <> 'S' THEN w_IDE_MOUVEMENT_next.MOUV_DAT_MOU - interval '1 second' ELSE w_IDE_MOUVEMENT_next.MOUV_DAT_MOU END,
MOUV_DAT_FIN_DAT = date(CASE WHEN w_IDE_MOUVEMENT_next.CAGE_CODE <> 'S' THEN w_IDE_MOUVEMENT_next.MOUV_DAT_MOU - interval '1 second' ELSE w_IDE_MOUVEMENT_next.MOUV_DAT_MOU END),
MOUV_DAT_FIN_TIM = extract('hour' FROM CASE WHEN w_IDE_MOUVEMENT_next.CAGE_CODE <> 'S' THEN w_IDE_MOUVEMENT_next.MOUV_DAT_MOU - interval '1 second' ELSE w_IDE_MOUVEMENT_next.MOUV_DAT_MOU END) * 10000 +
extract('minute' FROM CASE WHEN w_IDE_MOUVEMENT_next.CAGE_CODE <> 'S' THEN w_IDE_MOUVEMENT_next.MOUV_DAT_MOU - interval '1 second' ELSE w_IDE_MOUVEMENT_next.MOUV_DAT_MOU END) * 100 +
extract('second' FROM CASE WHEN w_IDE_MOUVEMENT_next.CAGE_CODE <> 'S' THEN w_IDE_MOUVEMENT_next.MOUV_DAT_MOU - interval '1 second' ELSE w_IDE_MOUVEMENT_next.MOUV_DAT_MOU END),
CAGE_CODE_next = w_IDE_MOUVEMENT_next.CAGE_CODE,
MOUV_ID_UNFO_next = w_IDE_MOUVEMENT_next.MOUV_ID_UNFO,
MOUV_ID_UNFO_MED_next = w_IDE_MOUVEMENT_next.MOUV_ID_UNFO_MED,
MOUV_ID_LIPO_next = w_IDE_MOUVEMENT_next.MOUV_ID_LIPO
FROM w_IDE_MOUVEMENT w_IDE_MOUVEMENT_next
WHERE w_IDE_MOUVEMENT.SEJO_NUM_SEJ = w_IDE_MOUVEMENT_next.SEJO_NUM_SEJ
AND w_IDE_MOUVEMENT.sequence = w_IDE_MOUVEMENT_next.sequence - 1;
-- Si hopital de jour sans journée,
UPDATE w_IDE_MOUVEMENT
SET CAGE_CODE_next = 'C'
FROM activite[PX].p_sejours,
activite[PX].t_services_facturation
JOIN base.t_modes_traitement on t_services_facturation.mode_traitement_id = t_modes_traitement.oid
WHERE MOUV_ID_SEJO::bigint = p_sejours.code_original AND
code_prevu <> '1' AND
CAGE_CODE = 'E' AND
MOUV_ID_UNFO_MED = t_services_facturation.code_original AND
(CAGE_CODE_NEXT = '' OR CAGE_CODE_NEXT = 'S' AND date_entree <> date_sortie) AND
t_modes_traitement.code = '04' AND
t_services_facturation.type_t2a = '2';
-- calcul mvt avant
UPDATE w_IDE_MOUVEMENT
SET
CAGE_CODE_before = w_IDE_MOUVEMENT_before.CAGE_CODE,
MOUV_ID_UNFO_before = w_IDE_MOUVEMENT_before.MOUV_ID_UNFO,
MOUV_ID_UNFO_MED_before = w_IDE_MOUVEMENT_before.MOUV_ID_UNFO_MED,
MOUV_ID_LIPO_before = w_IDE_MOUVEMENT_before.MOUV_ID_LIPO
FROM w_IDE_MOUVEMENT w_IDE_MOUVEMENT_before
WHERE w_IDE_MOUVEMENT.SEJO_NUM_SEJ = w_IDE_MOUVEMENT_before.SEJO_NUM_SEJ
AND w_IDE_MOUVEMENT.sequence = w_IDE_MOUVEMENT_before.sequence + 1
AND w_IDE_MOUVEMENT.CAGE_CODE <> 'S';
-- Absences
UPDATE w_IDE_MOUVEMENT
SET MOUV_ID_UNFO_MED = '*ABS'
WHERE CAGE_CODE = 'A';
-- Hopital de jour Dernière séance avant dans sortie
UPDATE w_IDE_MOUVEMENT SET
MOUV_DAT_MOU = MOUV_DAT_FIN,
MOUV_DAT_MOU_DAT = MOUV_DAT_FIN_DAT,
MOUV_DAT_MOU_TIM = MOUV_DAT_FIN_TIM
WHERE CAGE_CODE = 'P' AND CAGE_CODE_next = 'S' AND
MOUV_DAT_FIN <> MOUV_DAT_MOU;
-- Hopital de jour Première séance après date entree
UPDATE w_IDE_MOUVEMENT SET
MOUV_DAT_FIN = MOUV_DAT_MOU,
MOUV_DAT_FIN_DAT = MOUV_DAT_MOU_DAT,
MOUV_DAT_FIN_TIM = MOUV_DAT_MOU_TIM
WHERE CAGE_CODE = 'E' AND CAGE_CODE_next = 'C' AND
MOUV_DAT_MOU <> MOUV_DAT_FIN;
-- creation mouvements par jour
DROP TABLE IF EXISTS w_mouvements_sejour;
CREATE TEMP TABLE w_mouvements_sejour AS
SELECT
w_IDE_MOUVEMENT.MOUV_ID_SEJO,
w_IDE_MOUVEMENT.SEJO_NUM_SEJ 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 = MOUV_DAT_MOU_DAT THEN MOUV_DAT_MOU_TIM ELSE 0 END AS heure_debut,
CASE WHEN p_calendrier.date = MOUV_DAT_FIN_DAT THEN MOUV_DAT_FIN_TIM ELSE 240000 END AS heure_fin,
CASE WHEN p_calendrier.date = MOUV_DAT_MOU_DAT AND CAGE_CODE = 'E' AND p_sejours.type_sejour = '1' THEN 1 ELSE 0 END AS nb_entrees_directes,
CASE WHEN p_calendrier.date = MOUV_DAT_FIN_DAT AND CAGE_CODE_next = 'S' AND p_sejours.type_sejour = '1' THEN 1 ELSE 0 END AS nb_sorties_directes,
CASE WHEN p_calendrier.date = MOUV_DAT_MOU_DAT AND CAGE_CODE = 'E' AND p_sejours.type_sejour = '1' THEN '1' ELSE '0' END AS est_jour_entree,
CASE WHEN p_calendrier.date = MOUV_DAT_FIN_DAT AND CAGE_CODE_next = 'S' AND p_sejours.type_sejour = '1' THEN '1' ELSE '0' END AS est_jour_sortie,
CASE WHEN p_sejours.type_sejour = '1' AND CAGE_CODE_next <> 'C' AND CAGE_CODE <> 'P' THEN '1' ELSE '0' END AS est_jour_hospitalisation,
CASE WHEN p_calendrier.date = MOUV_DAT_MOU_DAT AND CAGE_CODE = 'E' AND p_sejours.type_sejour = '2' THEN 1 ELSE 0 END AS nb_ambulatoires,
CASE WHEN p_calendrier.date = MOUV_DAT_MOU_DAT AND CAGE_CODE = 'E' AND p_sejours.type_sejour = '3' THEN 1 ELSE 0 END AS nb_externes,
CASE WHEN p_calendrier.date = MOUV_DAT_MOU_DAT AND CAGE_CODE = 'E' AND p_sejours.type_sejour <> '9' AND t_dmt.code IN ('303', '307', '308', '401', '402', '403', '404', '405', '406', '407', '408', '409') THEN 1 ELSE 0 END AS nb_urgences,
0 as nb_seances,
CASE WHEN p_calendrier.date = MOUV_DAT_MOU_DAT AND CAGE_CODE IN ('D', 'M') AND p_sejours.type_sejour = '1' AND mouv_id_unfo_med <> mouv_id_unfo_med_before THEN 1 ELSE 0 END AS nb_entrees_mutation_service,
CASE WHEN p_calendrier.date = MOUV_DAT_FIN_DAT AND CAGE_CODE_next IN ('D', 'M') AND p_sejours.type_sejour = '1' AND mouv_id_unfo_med <> mouv_id_unfo_med_next THEN 1 ELSE 0 END AS nb_sorties_mutation_service,
CASE WHEN p_calendrier.date = MOUV_DAT_MOU_DAT AND CAGE_CODE IN ('D', 'M') AND p_sejours.type_sejour = '1' AND mouv_id_unfo <> mouv_id_unfo_before THEN 1 ELSE 0 END AS nb_entrees_mutation_etage,
CASE WHEN p_calendrier.date = MOUV_DAT_FIN_DAT AND CAGE_CODE_next IN ('D', 'M') AND p_sejours.type_sejour = '1' AND mouv_id_unfo <> mouv_id_unfo_next THEN 1 ELSE 0 END AS nb_sorties_mutation_etage,
0 AS nb_entrees_mutation_activite,
0 AS nb_sorties_mutation_activite,
0 AS nb_entrees_mutation_unite_medicale,
0 AS nb_sorties_mutation_unite_medicale,
CASE WHEN p_sejours.type_sejour = '1' AND CAGE_CODE_next <> 'C' AND CAGE_CODE <> 'P' AND (p_calendrier.date <> MOUV_DAT_FIN_DAT OR CAGE_CODE_next = 'S') THEN 1 ELSE 0 END AS nb_jours_js_inclus,
CASE WHEN p_sejours.type_sejour = '1' AND CAGE_CODE_next <> 'C' AND CAGE_CODE <> 'P' AND p_calendrier.date <> MOUV_DAT_FIN_DAT THEN 1 ELSE 0 END AS nb_jours_js_non_inclus,
CASE WHEN p_sejours.type_sejour = '1' AND CAGE_CODE_next <> 'C' AND CAGE_CODE <> 'P' AND t_lits.chambre_particuliere = 'O' THEN '1' ELSE '0' END AS est_chambre_particuliere,
CASE WHEN p_sejours.type_sejour = '1' AND CAGE_CODE_next <> 'C' AND CAGE_CODE <> 'P' AND t_lits.chambre_particuliere = 'O' AND (p_calendrier.date <> MOUV_DAT_FIN_DAT OR CAGE_CODE_next = 'S') THEN 1 ELSE 0 END AS nb_chambres_particulieres,
CASE WHEN p_calendrier.date = MOUV_DAT_MOU_DAT AND CAGE_CODE = 'E' AND (p_sejours.type_sejour = '6' OR COALESCE(w_IDE_MOUVEMENT.SEJO_ID_SEJO_MER_ENF) > 0) THEN 1 ELSE 0 END AS nb_bebes,
TRUM_ID_UNME_principale,
MOUV_ID_UNFO_MED,
MOUV_ID_LIPO,
COALESCE(t_lieux.oid,0) AS lieu_id,
p_sejours.medecin_sejour_id as medecin_sejour_id,
CASE WHEN p_sejours.code_prevu = '1' OR p_calendrier.date > date(date_extraction) THEN '1' ELSE '0' END AS est_mouvement_previsionnel,
''::text AS est_premier_mouvement_jour,
''::text AS est_dernier_mouvement_jour
FROM w_IDE_MOUVEMENT
LEFT JOIN activite[PX].t_lieux ON
(t_lieux.code_original_1 = MOUV_ID_UNFO_MED::text AND
t_lieux.code_original_2 = TRUM_ID_UNME_principale AND
t_lieux.code_original_4 = MOUV_ID_LIPO AND
t_lieux.code_original_6 = MOUV_ID_UNFO_MED::text )
JOIN w_IDE_SEJOUR_complet ON SEJO_ID_SEJO = MOUV_ID_SEJO
JOIN activite[PX].p_sejours ON w_IDE_MOUVEMENT.SEJO_NUM_SEJ = p_sejours.no_sejour AND p_sejours.etat = ''
JOIN activite[PX].t_lits ON MOUV_ID_LIPO = t_lits.code_original
JOIN activite[PX].t_services_facturation ON MOUV_ID_UNFO_MED::text = t_services_facturation.code_original
JOIN base.t_dmt ON t_services_facturation.dmt_id = t_dmt.oid
JOIN base.p_calendrier ON p_calendrier.date BETWEEN MOUV_DAT_MOU_DAT AND MOUV_DAT_FIN_DAT AND p_calendrier.date <= date(date_extraction) + interval '1 month'
WHERE CAGE_CODE <> 'S' AND
(CAGE_CODE <> 'P' OR CAGE_CODE_next = 'S') AND
(p_sejours.type_sejour NOT IN ('3') OR (p_sejours.type_sejour IN ('3') AND CAGE_CODE = 'E' AND p_calendrier.date = MOUV_DAT_MOU_DAT)) AND
(p_sejours.code_prevu <> '1' AND p_calendrier.date <= date(date_extraction) OR p_calendrier.date >= date(date_extraction))
ORDER BY sequence, p_calendrier.date;
DELETE FROM w_mouvements_sejour WHERE heure_fin < heure_debut;
-- Actualisation lieux
UPDATE activite[PX].t_lieux SET
service_facturation_id = t_services_facturation.oid,
mode_traitement_id = t_services_facturation.mode_traitement_id
FROM activite[PX].t_services_facturation
WHERE
code_original_1 = t_services_facturation.code_original;
UPDATE activite[PX].t_lieux SET
activite_id = t_activites.oid
FROM activite[PX].t_activites
WHERE
code_original_2 = t_activites.code_original;
UPDATE activite[PX].t_lieux SET
unite_fonctionnelle_id = t_unites_fonctionnelles.oid
FROM activite[PX].t_unites_fonctionnelles
WHERE
code_original_6 = t_unites_fonctionnelles.code_original;
UPDATE activite[PX].t_lieux SET
lit_id = t_lits.oid
FROM activite[PX].t_lits
WHERE
code_original_4 = t_lits.code_original;
-- creation nouveaux lieux
INSERT INTO activite[PX].t_lieux(
code_original_1,
code_original_2,
code_original_3,
code_original_4,
code_original_5,
code_original_6,
code_original_7,
service_facturation_id,
activite_id,
lit_id,
unite_medicale_id,
unite_fonctionnelle_id,
mode_traitement_id)
SELECT DISTINCT
MOUV_ID_UNFO_MED,
TRUM_ID_UNME_principale,
'',
MOUV_ID_LIPO,
'',
MOUV_ID_UNFO_MED,
'',
t_services_facturation.oid,
COALESCE(t_activites.oid,0),
t_lits.oid,
0,
t_unites_fonctionnelles.oid,
t_services_facturation.mode_traitement_id
FROM w_mouvements_sejour
LEFT JOIN activite[PX].t_lieux ON
(t_lieux.code_original_1 = MOUV_ID_UNFO_MED::text AND
t_lieux.code_original_2 = TRUM_ID_UNME_principale::bigint AND
t_lieux.code_original_4 = MOUV_ID_LIPO AND
t_lieux.code_original_6 = MOUV_ID_UNFO_MED::text )
JOIN activite[PX].t_services_facturation ON MOUV_ID_UNFO_MED::text = t_services_facturation.code_original
LEFT JOIN activite[PX].t_activites ON TRUM_ID_UNME_principale::bigint = t_activites.code_original
JOIN activite[PX].t_lits ON MOUV_ID_LIPO = t_lits.code_original
JOIN activite[PX].t_unites_fonctionnelles ON MOUV_ID_UNFO_MED::text = t_unites_fonctionnelles.code_original
WHERE t_lieux.oid IS NULL
GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13;
-- Mise à jour lieux dans futurs mouvements
UPDATE w_mouvements_sejour SET lieu_id = t_lieux.oid
FROM activite[PX].t_lieux
WHERE t_lieux.code_original_1 = MOUV_ID_UNFO_MED::text
AND t_lieux.code_original_2 = TRUM_ID_UNME_principale::bigint
AND t_lieux.code_original_4 = MOUV_ID_LIPO
AND t_lieux.code_original_6 = MOUV_ID_UNFO_MED::text
AND w_mouvements_sejour.lieu_id = 0;
-- Médecin séjour (fonctionnalitée non supportée pour le moment)
--UPDATE w_mouvements_sejour SET medecin_sejour_id = t_medecins_administratifs.oid
--FROM prod_hm.IDE_MED_VENUE, prod_hm.BAS_CATALOGUE_PERS, activite[PX].t_medecins_administratifs
--WHERE MOUV_ID_SEJO = MESE_ID_SEJO
--AND MESE_ID_CAPE = CAPE_ID_CAPE
--AND MESE_ID_MEDE::bigint = t_medecins_administratifs.code_original
--AND date BETWEEN date(MESE_DAT_DEB) AND date(MESE_DAT_FIN)
--AND CAPE_CODE IN ('1')
--AND w_mouvements_sejour.medecin_sejour_id <> t_medecins_administratifs.oid
--AND t_medecins_administratifs.oid <> 0;
-- Unité médicale selon UF
UPDATE activite[PX].t_lieux
SET unite_medicale_id = t_unites_medicales.oid,
code_original_5 = UNFO_ID_UNME
FROM prod_hm.BAS_UF
JOIN prod_hm.SAD_UM ON UNFO_ID_UNME = UNME_ID_UNME
JOIN activite[PX].t_unites_medicales ON UNME_ID_UNME =t_unites_medicales.code_original
WHERE UNFO_ID_UNFO = code_original_6 AND
(unite_medicale_id IS DISTINCT FROM t_unites_medicales.oid OR
code_original_5 IS DISTINCT FROM UNFO_ID_UNME);
UPDATE activite[PX].t_lieux
SET unite_medicale_id = t_unites_medicales.oid,
code_original_5 = '*ABS'
FROM activite[PX].t_unites_medicales
WHERE code_original_6 = '*ABS' AND t_unites_medicales.code_original = '*ABS';
-- Unité médicale principale selon UF
UPDATE activite[PX].t_lieux SET
activite_id = t_activites.oid,
code_original_2 = UNFO_ID_UNME
FROM prod_hm.BAS_UF
JOIN prod_hm.SAD_UM ON UNFO_ID_UNME = UNME_ID_UNME
JOIN activite[PX].t_activites ON UNME_ID_UNME = t_activites.code_original
WHERE UNFO_ID_UNFO = code_original_6 AND
activite_id = 0;
-- Prise en compte mutations ambulatoire
INSERT INTO activite.t_divers (code, texte, valeur, description)
SELECT
'MUTATIONAMBU',
'Traitement des mutations / ambulatoire',
'0',
'0=Prendre en compte mouvement d''entrée, 1=Prendre en compte mouvement de sortie'
WHERE 'MUTATIONAMBU' NOT IN (SELECT code FROM activite.t_divers);
;
DROP TABLE IF EXISTS w_correction_ambu;
CREATE TEMP TABLE w_correction_ambu AS
SELECT p_mouvements_sejour.no_sejour,
(MAX(Array[to_char(heure_debut,'FM000000'),lieu_id::text]))[2]::bigint AS lieu_id,
MIN(heure_entree) AS heure_entree,
MAX(heure_sortie) AS heure_sortie
FROM w_mouvements_sejour p_mouvements_sejour
JOIN activite[PX].p_sejours ON p_mouvements_sejour.no_sejour = p_sejours.no_sejour
JOIN activite.t_divers ON t_divers.code = 'MUTATIONAMBU' ANd t_divers.valeur = '1'
WHERE type_sejour = '2' AND code_sorti = '1' AND date_sortie = date_entree
GROUP BY 1
HAVING count(*) > 1 AND count(DISTINCT date) = 1
;
DELETE FROM w_mouvements_sejour p_mouvements_sejour
WHERE nb_ambulatoires = '0' AND
no_sejour IN (SELECT no_sejour FROM w_correction_ambu)
;
UPDATE w_mouvements_sejour p_mouvements_sejour
SET lieu_id = w_correction_ambu.lieu_id,
heure_debut = heure_entree,
heure_fin = heure_sortie
FROM w_correction_ambu
WHERE p_mouvements_sejour.no_sejour = w_correction_ambu.no_sejour AND
p_mouvements_sejour.nb_ambulatoires = '1'
;
-- Seances selon GHS pmsi
DROP TABLE IF EXISTS w_ghs_seances;
CREATE TEMP TABLE w_ghs_seances AS
SELECT ghs_id AS oid
FROM activite[PX].p_sejours
JOIN base.t_ghm ON p_sejours.ghm_id = t_ghm.oid AND t_ghm.code LIKE '28%'
JOIN base.t_ghs ON p_sejours.ghs_id = t_ghs.oid AND t_ghs.code <> 9999 AND t_ghs.code > 0
WHERE ghs_id <> 0
GROUP BY 1;
DROP TABLE IF EXISTS w_sejours_seances;
CREATE TEMP TABLE w_sejours_seances AS
SELECT
p_sejours.no_sejour,
date_entree AS date,
1 AS nb_seances
FROM activite[PX].p_sejours
JOIN base.t_ghs ON p_sejours.ghs_id = t_ghs.oid
JOIN base.t_ghm ON p_sejours.ghm_id = t_ghm.oid
WHERE date_entree = date_sortie AND
(ghs_id IN (SELECT oid FROM w_ghs_seances) OR t_ghm.code LIKE '28%');
CREATE INDEX w_sejours_seances_i1
ON w_sejours_seances
USING btree
(no_sejour);
UPDATE w_mouvements_sejour
SET nb_seances = w_sejours_seances.nb_seances
FROM w_sejours_seances
WHERE w_sejours_seances.no_sejour = w_mouvements_sejour.no_sejour AND
w_sejours_seances.date = w_mouvements_sejour.date AND
w_mouvements_sejour.nb_seances IS DISTINCT FROM w_sejours_seances.nb_seances;
-- seances selon GHS facturé
DROP TABLE IF EXISTS w_FAC_LIGNE_FACTURE_seances;
CREATE TEMP TABLE w_FAC_LIGNE_FACTURE_seances AS
SELECT
p_sejours.no_sejour,
date(LFAC_DAT_EXE_DEB) AS date,
SUM(LFAC_QTE_COEFFICIENT) AS nb_seances
FROM prod_hm.FAC_LIGNE_FACTURE
JOIN prod_hm.FAC_FACTURE ON LFAC_ID_FACT = FACT_ID_FACT AND FACT_TYPE <> 'P' AND FACT_TYPE <> 'E' AND FACT_DAT_SUP IS NULL
JOIN activite[PX].p_sejours ON LFAC_ID_SEJO_D::bigint = p_sejours.code_original
JOIN base.t_ghs ON to_number('0' || LFAC_NUM_GHS,'00000') = t_ghs.code
WHERE LFAC_LET_CLE = 'GHS' AND LFAC_ID_PRSE <> 0 AND
t_ghs.oid IN (SELECT oid FROM w_ghs_seances)
GROUP BY 1,2
HAVING SUM(LFAC_QTE_COEFFICIENT) > 0;
CREATE INDEX w_FAC_LIGNE_FACTURE_seances_i1
ON w_FAC_LIGNE_FACTURE_seances
USING btree
(no_sejour);
UPDATE w_mouvements_sejour
SET nb_seances = w_FAC_LIGNE_FACTURE_seances.nb_seances
FROM w_FAC_LIGNE_FACTURE_seances
WHERE w_FAC_LIGNE_FACTURE_seances.no_sejour = w_mouvements_sejour.no_sejour AND
w_FAC_LIGNE_FACTURE_seances.date = w_mouvements_sejour.date;
-- seances selon D09, D11 facturé
DROP TABLE IF EXISTS w_FAC_LIGNE_FACTURE_seances;
CREATE TEMP TABLE w_FAC_LIGNE_FACTURE_seances AS
SELECT
p_sejours.no_sejour,
date(LFAC_DAT_EXE_DEB) AS date,
SUM(LFAC_QTE_COEFFICIENT) AS nb_seances
FROM prod_hm.FAC_LIGNE_FACTURE
JOIN prod_hm.FAC_FACTURE ON LFAC_ID_FACT = FACT_ID_FACT AND FACT_TYPE <> 'P' AND FACT_TYPE <> 'E' AND FACT_DAT_SUP IS NULL
JOIN activite[PX].p_sejours ON LFAC_ID_SEJO_D::bigint = p_sejours.code_original
WHERE LFAC_LET_CLE IN ('D09', 'D11') AND LFAC_ID_PRSE <> 0
GROUP BY 1,2
HAVING SUM(LFAC_QTE_COEFFICIENT) > 0;
CREATE INDEX w_FAC_LIGNE_FACTURE_seances_i1
ON w_FAC_LIGNE_FACTURE_seances
USING btree
(no_sejour);
UPDATE w_mouvements_sejour
SET nb_seances = w_FAC_LIGNE_FACTURE_seances.nb_seances
FROM w_FAC_LIGNE_FACTURE_seances
WHERE w_FAC_LIGNE_FACTURE_seances.no_sejour = w_mouvements_sejour.no_sejour AND
w_FAC_LIGNE_FACTURE_seances.date = w_mouvements_sejour.date;
-- seances selon Actes
DROP TABLE IF EXISTS w_SAD_ACTIVITE_SAISIES_seances;
CREATE TEMP TABLE w_SAD_ACTIVITE_SAISIES_seances AS
SELECT
p_sejours.no_sejour,
date(ACSA_DAT_EXE_DEB) AS date,
1 AS nb_seances
FROM prod_hm.SAD_ACTIVITE_SAISIES
JOIN activite[PX].p_sejours ON ACSA_ID_SEJO::bigint = p_sejours.code_original
WHERE
ACSA_LET_CLE = 'K' AND
ACSA_QTE_COEFFICIENT = (SELECT
ACSA_QTE_COEFFICIENT
FROM prod_hm.SAD_ACTIVITE_SAISIES
JOIN activite[PX].p_sejours ON ACSA_ID_SEJO::bigint = p_sejours.code_original
JOIN w_FAC_LIGNE_FACTURE_seances ON p_sejours.no_sejour = w_FAC_LIGNE_FACTURE_seances.no_sejour AND w_FAC_LIGNE_FACTURE_seances.date = date(ACSA_DAT_EXE_DEB)
WHERE ACSA_LET_CLE = 'K'
GROUP BY 1
ORDER BY 1
LIMIT 1)
GROUP BY 1,2;
UPDATE w_mouvements_sejour
SET nb_seances = w_SAD_ACTIVITE_SAISIES_seances.nb_seances
FROM w_SAD_ACTIVITE_SAISIES_seances
WHERE w_SAD_ACTIVITE_SAISIES_seances.no_sejour = w_mouvements_sejour.no_sejour AND
w_SAD_ACTIVITE_SAISIES_seances.date = w_mouvements_sejour.date AND
w_mouvements_sejour.nb_seances = 0;
-- Séances d'après acte PMSI (ESPIC)
SELECT base.cti_execute('DROP TABLE IF EXISTS w_PMSI_seances',1)
WHERE 'p_rss_actes' IN (
SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'pmsi'
)
;
SELECT base.cti_execute('CREATE TEMP TABLE w_PMSI_seances AS
SELECT
p_sejours.no_sejour,
date(p_rss_actes.date_acte) AS date,
1 AS nb_seances
FROM pmsi.p_rss_actes
JOIN pmsi.t_actes ON acte_id = t_actes.oid
JOIN pmsi.p_rss ON rss_id = p_rss.oid
JOIN activite[PX].p_sejours ON p_sejours.no_sejour = p_rss.no_sejour_administratif
WHERE p_sejours.date_sortie > p_sejours.date_entree
AND est_budget_global = ''1''
AND t_actes.code IN (''ZZLF900'',''JVJF004'')
GROUP BY
p_sejours.no_sejour,
date(p_rss_actes.date_acte)'
,1)
WHERE 'p_rss_actes' IN (
SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'pmsi'
)
;
SELECT base.cti_execute('ANALYSE w_PMSI_seances',1)
WHERE 'p_rss_actes' IN (
SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'pmsi'
)
;
SELECT base.cti_execute('UPDATE w_mouvements_sejour
SET nb_seances = w_PMSI_seances.nb_seances
FROM w_PMSI_seances
WHERE w_PMSI_seances.no_sejour = w_mouvements_sejour.no_sejour
AND w_PMSI_seances.date = w_mouvements_sejour.date
AND w_mouvements_sejour.nb_seances = 0'
,1)
WHERE 'p_rss_actes' IN (
SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'pmsi'
)
;
-- seances selon D09
DROP TABLE IF EXISTS w_SAD_ACTIVITE_SAISIES_seances;
CREATE TEMP TABLE w_SAD_ACTIVITE_SAISIES_seances AS
SELECT
p_sejours.no_sejour,
date(ACSA_DAT_EXE_DEB) AS date,
COUNT(*) AS nb_seances
FROM prod_hm.SAD_ACTIVITE_SAISIES
JOIN activite[PX].p_sejours ON ACSA_ID_SEJO::bigint = p_sejours.code_original
WHERE
ACSA_LET_CLE IN ('D09', 'D11')
GROUP BY 1,2;
UPDATE w_mouvements_sejour
SET nb_seances = w_SAD_ACTIVITE_SAISIES_seances.nb_seances
FROM w_SAD_ACTIVITE_SAISIES_seances
WHERE w_SAD_ACTIVITE_SAISIES_seances.no_sejour = w_mouvements_sejour.no_sejour AND
w_SAD_ACTIVITE_SAISIES_seances.date = w_mouvements_sejour.date AND
w_mouvements_sejour.nb_seances = 0;
-- Seances selon type sejour DE = DS
UPDATE w_mouvements_sejour
SET nb_seances = 1
FROM activite[PX].p_sejours
WHERE p_sejours.no_sejour = w_mouvements_sejour.no_sejour AND
p_sejours.type_sejour = '5' AND
p_sejours.date_entree = p_sejours.date_sortie AND
p_sejours.date_entree = w_mouvements_sejour.date AND
w_mouvements_sejour.heure_debut > 0 AND
w_mouvements_sejour.nb_seances = 0 AND
w_mouvements_sejour.no_sejour NOT IN (SELECT no_sejour FROM w_mouvements_sejour WHERE nb_seances > 0);
UPDATE w_mouvements_sejour
SET nb_seances = 1
FROM activite[PX].p_sejours
JOIN base.t_ghm ON p_sejours.ghm_id = t_ghm.oid AND t_ghm.code LIKE '28%'
WHERE p_sejours.no_sejour = w_mouvements_sejour.no_sejour AND
p_sejours.type_sejour = '5' AND
p_sejours.date_entree = w_mouvements_sejour.date AND
w_mouvements_sejour.heure_debut > 0 AND
w_mouvements_sejour.nb_seances = 0 AND
w_mouvements_sejour.no_sejour NOT IN (SELECT no_sejour FROM w_mouvements_sejour WHERE nb_seances > 0)
;
-- plusieurs séances le même jour
DROP TABLE IF EXISTS w_seances;
CREATE TEMP TABLE w_seances as
SELECT no_sejour, date, MAX(heure_debut) AS heure_debut
FROM w_mouvements_sejour
WHERE nb_seances > 0
GROUP BY 1,2
HAVING count(DISTINCT heure_debut) > 1;
UPDATE w_mouvements_sejour
SET nb_seances = 0
FROM w_seances
WHERE w_mouvements_sejour.no_sejour = w_seances.no_sejour and
w_mouvements_sejour.date = w_seances.date and
w_mouvements_sejour.heure_debut <> w_seances.heure_debut;
-- Lignes inutiles
DELETE FROM w_mouvements_sejour
WHERE
nb_entrees_directes = 0 AND
nb_sorties_directes = 0 AND
est_jour_hospitalisation <> '1' AND
nb_ambulatoires = 0 AND
nb_externes = 0 AND
nb_urgences = 0 AND
nb_seances = 0 AND
nb_entrees_mutation_service = 0 AND
nb_sorties_mutation_service = 0 AND
nb_entrees_mutation_etage = 0 AND
nb_sorties_mutation_etage = 0 AND
nb_entrees_mutation_activite = 0 AND
nb_sorties_mutation_activite = 0 AND
nb_entrees_mutation_unite_medicale = 0 AND
nb_sorties_mutation_unite_medicale = 0 AND
nb_jours_js_inclus = 0 AND
nb_jours_js_non_inclus = 0 AND
est_chambre_particuliere <> '1' AND
nb_chambres_particulieres = 0 AND
nb_bebes = 0
;
-- Doublons potentiels
DELETE FROM w_mouvements_sejour
USING (
SELECT
no_sejour, date, heure_debut, MIN(CTID) AS keepCTID
FROM w_mouvements_sejour
WHERE heure_fin >= heure_debut
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
subview.keepCTID <> w_mouvements_sejour.CTID;
-- Mise en production des mouvements
SELECT base.cti_disable_index('activite[PX]', 'i_mouvements_sejour_1');
SELECT base.cti_disable_index('activite[PX]', 'i_mouvements_sejour_2');
SELECT base.cti_disable_index('activite[PX]', 'i_mouvements_sejour_3');
SELECT base.cti_disable_index('activite[PX]', 'i_mouvements_sejour_4');
SELECT base.cti_disable_index('activite[PX]', 'i_mouvements_sejour_5');
INSERT INTO activite[PX].p_mouvements_sejour(
sejour_id, no_sejour, date, est_mouvement_previsionnel, nb_jours_js_non_inclus,
lieu_id, nb_entrees_directes, nb_sorties_directes,
nb_urgences, nb_externes, nb_ambulatoires, medecin_sejour_id,
nb_jours_js_inclus, nb_seances, nb_entrees_mutation_service,
nb_sorties_mutation_service, nb_entrees_mutation_activite, nb_sorties_mutation_activite,
nb_entrees_mutation_etage, nb_sorties_mutation_etage, nb_chambres_particulieres,
heure_debut, heure_fin, est_jour_entree, est_jour_sortie, est_jour_hospitalisation,
est_chambre_particuliere,
nb_entrees_mutation_unite_medicale, nb_sorties_mutation_unite_medicale, nb_bebes,
jour_semaine, is_weekend)
SELECT sejour_id, no_sejour, date, est_mouvement_previsionnel ,nb_jours_js_non_inclus,
lieu_id, nb_entrees_directes, nb_sorties_directes,
nb_urgences, nb_externes, nb_ambulatoires, medecin_sejour_id,
nb_jours_js_inclus, nb_seances, nb_entrees_mutation_service,
nb_sorties_mutation_service, nb_entrees_mutation_activite, nb_sorties_mutation_activite,
nb_entrees_mutation_etage, nb_sorties_mutation_etage, nb_chambres_particulieres,
heure_debut, heure_fin, est_jour_entree, est_jour_sortie, est_jour_hospitalisation,
est_chambre_particuliere,
nb_entrees_mutation_unite_medicale, nb_sorties_mutation_unite_medicale, nb_bebes,
jour_semaine, is_weekend
FROM w_mouvements_sejour
WHERE heure_fin >= heure_debut
ORDER BY no_sejour, sequence;
SELECT base.cti_enable_index('activite[PX]', 'i_mouvements_sejour_1');
SELECT base.cti_enable_index('activite[PX]', 'i_mouvements_sejour_2');
SELECT base.cti_enable_index('activite[PX]', 'i_mouvements_sejour_3');
SELECT base.cti_enable_index('activite[PX]', 'i_mouvements_sejour_4');
SELECT base.cti_enable_index('activite[PX]', 'i_mouvements_sejour_5');
-- Lieux de sortie
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 <> 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_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 lieu_sortie_id = 0
WHERE lieu_sortie_id IS NULL ;
UPDATE activite[PX].p_sejours SET lieu_sortie_id = 0
WHERE p_sejours.code_prevu = '1' AND (p_sejours.lieu_sortie_id = 0 OR lieu_sortie_id IS NULL);
UPDATE activite[PX].p_sejours
SET code_sorti = '1'
FROM activite[PX].p_mouvements_sejour
WHERE p_sejours.no_sejour = p_mouvements_sejour.no_sejour AND
code_sorti = '0' AND
(nb_ambulatoires > 0 OR nb_externes > 0) AND
date_sortie <= now();
UPDATE activite[PX].p_sejours
SET type_sejour = '5'
WHERE type_sejour <> '5' AND
type_sejour <> '1' AND
type_sejour <> '9' 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
);
-- Suppression des tables de travail non utilisées après
DROP TABLE IF EXISTS w_IDE_MOUVEMENT;
DROP TABLE IF EXISTS w_mouvements_sejour;
DROP TABLE IF EXISTS w_seances;
DROP TABLE IF EXISTS w_SAD_ACTIVITE_SAISIES_seances;
DROP TABLE IF EXISTS w_FAC_LIGNE_FACTURE_seances;
]]></sqlcmd>
</NODE>
</NODE>
<NODE name="FACTURE" label="RECUPERATION DES FACTURES">
<NODE label="Entêtes">
<sqlcmd><![CDATA[
DROP TABLE IF EXISTS w_sejours_orga CASCADE
;
CREATE TEMP TABLE w_sejours_orga AS
SELECT
no_sejour
,p_sejours.oid AS sejour_id
,p_sejours.code_original
,p_sejours.date_sortie
,p_sejours.ghs_id
,p_sejours.lieu_sortie_id
,p_sejours.tiers_payant_0_id
,p_sejours.tiers_payant_1_id
,p_sejours.tiers_payant_2_id
,p_sejours.tiers_payant_22_id
,t_tiers_payant_1.code_original as tiers_payant_1_orga_id
,t_tiers_payant_2.code_original as tiers_payant_2_orga_id
,t_tiers_payant_22.code_original as tiers_payant_22_orga_id
FROM activite[PX].p_sejours
JOIN activite[PX].t_tiers_payant t_tiers_payant_1 ON tiers_payant_1_id = t_tiers_payant_1.oid
JOIN activite[PX].t_tiers_payant t_tiers_payant_2 ON tiers_payant_2_id = t_tiers_payant_2.oid
JOIN activite[PX].t_tiers_payant t_tiers_payant_22 ON tiers_payant_22_id = t_tiers_payant_22.oid
WHERE p_sejours.etat = ''
;
CREATE INDEX w_sejours_orga_i1
ON w_sejours_orga
USING btree
(code_original)
;
-- factures à traiter
-- Identification des factures qui sont comptabilisées en honoraires (pour les PSPH multi type Jules Vernes)
DROP TABLE IF EXISTS w_FACTURE_HON;
CREATE TEMP TABLE w_FACTURE_HON AS
SELECT
FACD_ID_FACT AS FACT_ID_FACT_HON
FROM prod_hm.CCL_LIGNE_ECRITURE
JOIN prod_hm.CCL_ECRITURE ON LECR_ID_ECRI = ECRI_ID_ECRI
JOIN prod_hm.FAC_FACTURE_DEBITEUR ON LECR_ID_FACD = FACD_ID_FACD
JOIN w_CCL_JOURNAL ON ECRI_ID_JOUR = JOUR_ID_JOUR
WHERE ECRI_DAT_SUP IS NULL AND
JOUR_ISJVT = '1' AND
LECR_PART = 'HON'
GROUP BY 1
;
DROP TABLE IF EXISTS w_FAC_FACTURE;
CREATE TEMP TABLE w_FAC_FACTURE AS
SELECT FAC_FACTURE.*,
w_sejours_orga.*,
ETAB_TYP_ETAB,
CASE
WHEN FACT_ID_FACT IN (SELECT FACT_ID_FACT_HON FROM w_FACTURE_HON) THEN '0'::text
WHEN SEJO_IND_BGH IS NOT DISTINCT FROM '1' OR ETAB_TYP_ETAB = 'PSPH' THEN '1'::text
ELSE '0'::text END AS CRN_HON_TO_SEJ,
'1'::text AS FAC_HON,
0::bigint AS FACT_ID_FACT_SEJ,
''::text AS FACT_NUM_FAC_SEJ,
SEJO_IND_BGH
FROM prod_hm.FAC_FACTURE
JOIN w_IDE_SEJOUR_complet ON FACT_ID_SEJO = SEJO_ID_SEJO
JOIN prod_hm.BAS_ETABLISSEMENT ON SEJO_ID_ETAB_CON = ETAB_ID_ETAB
JOIN w_sejours_orga ON (FACT_ID_SEJO::bigint = w_sejours_orga.code_original)
WHERE FACT_TYPE <> 'E' AND
(FACT_TYPE = 'P' OR FACT_DAT_SUP IS NULL);
CREATE INDEX w_FAC_FACTURE_i1
ON w_FAC_FACTURE
USING btree
(FACT_ID_FACT);
-- En budget global, tous les honoraires ne sont pas facturés (inclus dans GHS)
-- Honoraires comptabilisés -> Donc pas inclus
DROP TABLE IF EXISTS w_FAC_LIGNE_FACTURE_DEBITEUR_noninclus;
CREATE TEMP TABLE w_FAC_LIGNE_FACTURE_DEBITEUR_noninclus AS
SELECT LFAC_ID_FACT AS LFAC_ID_FACT_noninclus
FROM prod_hm.FAC_LIGNE_FACTURE_DEBITEUR
JOIN prod_hm.FAC_LIGNE_FACTURE ON LFAC_ID_LFAC = LFAD_ID_LFAC
WHERE '[ENV_TYPEETS]' IN ('2','3') AND
LFAC_ID_PRHO <> 0 AND LFAD_MTT_CRN <> 0
GROUP BY 1
;
UPDATE w_FAC_FACTURE SET
FAC_HON = '0',
FACT_ID_FACT_SEJ = FACT_ID_FACT,
FACT_NUM_FAC_SEJ = FACT_NUM_FAC
FROM prod_hm.FAC_LIGNE_FACTURE
WHERE
'[ENV_TYPEETS]' IN ('2','3') AND
FACT_ID_FACT = LFAC_ID_FACT AND
CRN_HON_TO_SEJ = '1' AND
(
LFAC_LET_CLE IN ('GHS', 'PJ', 'AMP5', 'AMD', 'AMF', 'IPD') OR
LFAC_ID_PRSE::bigint IN (SELECT code_original FROM activite[PX].t_rubriques_facturation WHERE actes_inclus_public = '1')
);
UPDATE w_FAC_FACTURE SET
FAC_HON = '0',
FACT_ID_FACT_SEJ = FAC_FACTURE.FACT_ID_FACT,
FACT_NUM_FAC_SEJ = FAC_FACTURE.FACT_NUM_FAC
FROM prod_hm.FAC_LIGNE_FACTURE
JOIN prod_hm.FAC_FACTURE ON LFAC_ID_FACT = FACT_ID_FACT
WHERE
'[ENV_TYPEETS]' IN ('2','3') AND
w_FAC_FACTURE.FACT_ID_SEJO = FAC_FACTURE.FACT_ID_SEJO AND
CRN_HON_TO_SEJ = '1' AND
(
LFAC_LET_CLE IN ('GHS', 'PJ', 'AMP5', 'AMD', 'AMF', 'IPD') OR
LFAC_ID_PRSE::bigint IN (SELECT code_original FROM activite[PX].t_rubriques_facturation WHERE actes_inclus_public = '1')
) AND
FAC_FACTURE.FACT_TYPE <> 'P' AND
FAC_FACTURE.FACT_TYPE <> 'E' AND
FAC_FACTURE.FACT_DAT_SUP IS NULL AND
FAC_HON = '1' AND
LFAC_ID_FACT NOT IN (SELECT LFAC_ID_FACT_noninclus FROM w_FAC_LIGNE_FACTURE_DEBITEUR_noninclus)
;
-- Informations montants factures et regles
DROP TABLE IF EXISTS w_FAC_MONTANTS;
CREATE TEMP TABLE w_FAC_MONTANTS AS
SELECT FACD_ID_FACT::bigint,
SUM(CASE WHEN FACT_TYPE <> 'P' THEN FACD_MTT_SEJOUR ELSE 0 END) AS montant_facture_c,
SUM(CASE WHEN FACT_TYPE <> 'P' AND FACD_ID_ORGA_AMO = 0 AND FACD_ID_ORGA_AMC = 0 THEN FACD_MTT_SEJOUR ELSE 0 END) AS montant_facture_0_c,
SUM(CASE WHEN FACT_TYPE <> 'P' AND FACD_ID_ORGA_AMO > 0 THEN FACD_MTT_SEJOUR ELSE 0 END) AS montant_facture_1_c,
SUM(CASE WHEN FACT_TYPE <> 'P' AND FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC <> tiers_payant_22_orga_id THEN FACD_MTT_SEJOUR ELSE 0 END) AS montant_facture_2_c,
SUM(CASE WHEN FACT_TYPE <> 'P' AND FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC = tiers_payant_22_orga_id THEN FACD_MTT_SEJOUR ELSE 0 END) AS montant_facture_22_c,
SUM(CASE WHEN FACT_TYPE <> 'P' THEN FACD_MTT_CRN_SEJ ELSE 0 END)
+ SUM(CASE WHEN FACT_TYPE <> 'P' AND CRN_HON_TO_SEJ = '1' THEN FACD_MTT_CRN_HON ELSE 0 END) AS montant_comptabilise_c,
SUM(CASE WHEN FACT_TYPE <> 'P' AND FACD_ID_ORGA_AMO = 0 AND FACD_ID_ORGA_AMC = 0 THEN FACD_MTT_CRN_SEJ ELSE 0 END)
+ SUM(CASE WHEN FACT_TYPE <> 'P' AND CRN_HON_TO_SEJ = '1' AND FACD_ID_ORGA_AMO = 0 AND FACD_ID_ORGA_AMC = 0 THEN FACD_MTT_CRN_HON ELSE 0 END) AS montant_comptabilise_0_c,
SUM(CASE WHEN FACT_TYPE <> 'P' AND FACD_ID_ORGA_AMO > 0 THEN FACD_MTT_CRN_SEJ ELSE 0 END)
+ SUM(CASE WHEN FACT_TYPE <> 'P' AND CRN_HON_TO_SEJ = '1' AND FACD_ID_ORGA_AMO > 0 THEN FACD_MTT_CRN_HON ELSE 0 END) AS montant_comptabilise_1_c,
SUM(CASE WHEN FACT_TYPE <> 'P' AND FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC <> tiers_payant_22_orga_id THEN FACD_MTT_CRN_SEJ ELSE 0 END)
+ SUM(CASE WHEN FACT_TYPE <> 'P' AND CRN_HON_TO_SEJ = '1' AND FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC <> tiers_payant_22_orga_id THEN FACD_MTT_CRN_HON ELSE 0 END) AS montant_comptabilise_2_c,
SUM(CASE WHEN FACT_TYPE <> 'P' AND FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC = tiers_payant_22_orga_id THEN FACD_MTT_CRN_SEJ ELSE 0 END)
+ SUM(CASE WHEN FACT_TYPE <> 'P' AND CRN_HON_TO_SEJ = '1' AND FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC = tiers_payant_22_orga_id THEN FACD_MTT_CRN_HON ELSE 0 END) AS montant_comptabilise_22_c,
SUM(CASE WHEN (FACT_TYPE <> 'P' OR FACT_DAT_ARCHIVE IS NULL) THEN FACD_MTT_VEN_SEJ + FACD_MTT_A85_SEJ + FACD_MTT_ACO_SEJ + FACD_MTT_CAR_SEJ + FACD_MTT_PER_SEJ ELSE 0 END) AS montant_regle_c,
SUM(CASE WHEN (FACT_TYPE <> 'P' OR FACT_DAT_ARCHIVE IS NULL) AND FACD_ID_ORGA_AMO = 0 AND FACD_ID_ORGA_AMC = 0 THEN FACD_MTT_VEN_SEJ + FACD_MTT_A85_SEJ + FACD_MTT_ACO_SEJ + FACD_MTT_CAR_SEJ + FACD_MTT_PER_SEJ ELSE 0 END) AS montant_regle_0_c,
SUM(CASE WHEN (FACT_TYPE <> 'P' OR FACT_DAT_ARCHIVE IS NULL) AND FACD_ID_ORGA_AMO > 0 THEN FACD_MTT_VEN_SEJ + FACD_MTT_A85_SEJ + FACD_MTT_ACO_SEJ + FACD_MTT_CAR_SEJ + FACD_MTT_PER_SEJ ELSE 0 END) AS montant_regle_1_c,
SUM(CASE WHEN (FACT_TYPE <> 'P' OR FACT_DAT_ARCHIVE IS NULL) AND FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC <> tiers_payant_22_orga_id THEN FACD_MTT_VEN_SEJ + FACD_MTT_A85_SEJ + FACD_MTT_ACO_SEJ + FACD_MTT_CAR_SEJ + FACD_MTT_PER_SEJ ELSE 0 END) AS montant_regle_2_c,
SUM(CASE WHEN (FACT_TYPE <> 'P' OR FACT_DAT_ARCHIVE IS NULL) AND FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC = tiers_payant_22_orga_id THEN FACD_MTT_VEN_SEJ + FACD_MTT_A85_SEJ + FACD_MTT_ACO_SEJ + FACD_MTT_CAR_SEJ + FACD_MTT_PER_SEJ ELSE 0 END) AS montant_regle_22_c,
SUM(CASE WHEN FACT_TYPE <> 'P' THEN FACD_MTT_HON_HOR_DEH + FACD_MTT_DEH ELSE 0 END) AS montant_facture_h,
SUM(CASE WHEN FACT_TYPE <> 'P' AND FACD_ID_ORGA_AMO = 0 AND FACD_ID_ORGA_AMC = 0 THEN FACD_MTT_HON_HOR_DEH + FACD_MTT_DEH ELSE 0 END) AS montant_facture_0_h,
SUM(CASE WHEN FACT_TYPE <> 'P' AND FACD_ID_ORGA_AMO > 0 THEN FACD_MTT_HON_HOR_DEH + FACD_MTT_DEH ELSE 0 END) AS montant_facture_1_h,
SUM(CASE WHEN FACT_TYPE <> 'P' AND FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC <> tiers_payant_22_orga_id THEN FACD_MTT_HON_HOR_DEH + FACD_MTT_DEH ELSE 0 END) AS montant_facture_2_h,
SUM(CASE WHEN FACT_TYPE <> 'P' AND FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC = tiers_payant_22_orga_id THEN FACD_MTT_HON_HOR_DEH + FACD_MTT_DEH ELSE 0 END) AS montant_facture_22_h,
SUM(CASE WHEN FACT_TYPE <> 'P' AND CRN_HON_TO_SEJ <> '1' THEN FACD_MTT_CRN_HON ELSE 0 END) AS montant_comptabilise_h,
SUM(CASE WHEN FACT_TYPE <> 'P' AND CRN_HON_TO_SEJ <> '1' AND FACD_ID_ORGA_AMO = 0 AND FACD_ID_ORGA_AMC = 0 THEN FACD_MTT_CRN_HON ELSE 0 END) AS montant_comptabilise_0_h,
SUM(CASE WHEN FACT_TYPE <> 'P' AND CRN_HON_TO_SEJ <> '1' AND FACD_ID_ORGA_AMO > 0 THEN FACD_MTT_CRN_HON ELSE 0 END) AS montant_comptabilise_1_h,
SUM(CASE WHEN FACT_TYPE <> 'P' AND CRN_HON_TO_SEJ <> '1' AND FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC <> tiers_payant_22_orga_id THEN FACD_MTT_CRN_HON ELSE 0 END) AS montant_comptabilise_2_h,
SUM(CASE WHEN FACT_TYPE <> 'P' AND CRN_HON_TO_SEJ <> '1' AND FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC = tiers_payant_22_orga_id THEN FACD_MTT_CRN_HON ELSE 0 END) AS montant_comptabilise_22_h,
SUM(CASE WHEN (FACT_TYPE <> 'P' OR FACT_DAT_ARCHIVE IS NULL) THEN FACD_MTT_VEN_HON + FACD_MTT_ACO_HON + FACD_MTT_PER_HON ELSE 0 END) AS montant_regle_h,
SUM(CASE WHEN (FACT_TYPE <> 'P' OR FACT_DAT_ARCHIVE IS NULL) AND FACD_ID_ORGA_AMO = 0 AND FACD_ID_ORGA_AMC = 0 THEN FACD_MTT_VEN_HON + FACD_MTT_ACO_HON + FACD_MTT_PER_HON ELSE 0 END) AS montant_regle_0_h,
SUM(CASE WHEN (FACT_TYPE <> 'P' OR FACT_DAT_ARCHIVE IS NULL) AND FACD_ID_ORGA_AMO > 0 THEN FACD_MTT_VEN_HON + FACD_MTT_ACO_HON + FACD_MTT_PER_HON ELSE 0 END) AS montant_regle_1_h,
SUM(CASE WHEN (FACT_TYPE <> 'P' OR FACT_DAT_ARCHIVE IS NULL) AND FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC <> tiers_payant_22_orga_id THEN FACD_MTT_VEN_HON + FACD_MTT_ACO_HON + FACD_MTT_PER_HON ELSE 0 END) AS montant_regle_2_h,
SUM(CASE WHEN (FACT_TYPE <> 'P' OR FACT_DAT_ARCHIVE IS NULL) AND FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC = tiers_payant_22_orga_id THEN FACD_MTT_VEN_HON + FACD_MTT_ACO_HON + FACD_MTT_PER_HON ELSE 0 END) AS montant_regle_22_h
FROM prod_hm.FAC_FACTURE_DEBITEUR, w_FAC_FACTURE
WHERE FACD_ID_FACT = FACT_ID_FACT
GROUP BY FACD_ID_FACT;
CREATE INDEX w_FAC_MONTANTS_i1
ON w_FAC_MONTANTS
USING btree
(FACD_ID_FACT);
-- Informations date dernier reglement
DROP TABLE IF EXISTS w_FAC_REGLEMENT;
CREATE TEMP TABLE w_FAC_REGLEMENT AS
SELECT FACD_ID_FACT AS LECR_ID_FACT,
FACT_NUM_FAC AS LECR_NUM_FAC,
MAX(CASE WHEN LECR_PART <> 'HON' AND FACD_ID_ORGA_AMO = 0 AND FACD_ID_ORGA_AMC = 0 THEN ECRI_DAT_ECRITURE ELSE NULL END) AS date_dernier_reglement_0_c,
MAX(CASE WHEN LECR_PART <> 'HON' AND FACD_ID_ORGA_AMO > 0 THEN ECRI_DAT_ECRITURE ELSE NULL END) AS date_dernier_reglement_1_c,
MAX(CASE WHEN LECR_PART <> 'HON' AND FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC <> tiers_payant_22_orga_id THEN ECRI_DAT_ECRITURE ELSE NULL END) AS date_dernier_reglement_2_c,
MAX(CASE WHEN LECR_PART <> 'HON' AND FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC = tiers_payant_22_orga_id THEN ECRI_DAT_ECRITURE ELSE NULL END) AS date_dernier_reglement_22_c,
MAX(CASE WHEN LECR_PART = 'HON' AND FACD_ID_ORGA_AMO = 0 AND FACD_ID_ORGA_AMC = 0 THEN ECRI_DAT_ECRITURE ELSE NULL END) AS date_dernier_reglement_0_h,
MAX(CASE WHEN LECR_PART = 'HON' AND FACD_ID_ORGA_AMO > 0 THEN ECRI_DAT_ECRITURE ELSE NULL END) AS date_dernier_reglement_1_h,
MAX(CASE WHEN LECR_PART = 'HON' AND FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC <> tiers_payant_22_orga_id THEN ECRI_DAT_ECRITURE ELSE NULL END) AS date_dernier_reglement_2_h,
MAX(CASE WHEN LECR_PART = 'HON' AND FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC = tiers_payant_22_orga_id THEN ECRI_DAT_ECRITURE ELSE NULL END) AS date_dernier_reglement_22_h,
count(DISTINCT date_part('month',ECRI_DAT_ECRITURE)) AS nb_mois_reglement
FROM prod_hm.CCL_LIGNE_ECRITURE,
prod_hm.CCL_ECRITURE,
prod_hm.FAC_FACTURE_DEBITEUR,
w_CCL_JOURNAL,
w_CCL_COMPTE,
w_FAC_FACTURE
WHERE
LECR_ID_ECRI = ECRI_ID_ECRI
AND LECR_ID_FACD = FACD_ID_FACD
AND LECR_ID_CPTE = CPTE_ID_CPTE
AND ECRI_ID_JOUR = JOUR_ID_JOUR
AND FACD_ID_FACT = FACT_ID_FACT
AND JOUR_ISJVT = '0'
AND CPTE_CAGE_CODE = 'CLIENT'
AND ECRI_DAT_SUP IS NULL
GROUP BY 1,2;
CREATE INDEX w_FAC_REGLEMENT_i1
ON w_FAC_REGLEMENT
USING btree
(LECR_ID_FACT);
-- Informations date vente
DROP TABLE IF EXISTS w_FAC_DATEVENTE;
CREATE TEMP TABLE w_FAC_DATEVENTE AS
SELECT FACD_ID_FACT AS LECR_ID_FACT_VENT,
MAX(date(ECRI_DAT_ECRITURE)) AS date_vente
FROM prod_hm.CCL_LIGNE_ECRITURE,
prod_hm.CCL_ECRITURE,
prod_hm.FAC_FACTURE_DEBITEUR,
w_CCL_JOURNAL,
w_CCL_COMPTE,
w_FAC_FACTURE
WHERE
LECR_ID_ECRI = ECRI_ID_ECRI
AND LECR_ID_FACD = FACD_ID_FACD
AND ECRI_ID_JOUR = JOUR_ID_JOUR
AND LECR_ID_CPTE = CPTE_ID_CPTE
AND FACD_ID_FACT = FACT_ID_FACT
AND ECRI_DAT_SUP IS NULL
AND CPTE_CAGE_CODE = 'CLIENT'
AND JOUR_ISJVT = '1'
GROUP BY 1;
CREATE INDEX w_FAC_DATEVENTE_i1
ON w_FAC_DATEVENTE
USING btree
(LECR_ID_FACT_VENT);
-- Informations expedition
-- L'organisme AMC n'est pas toujours renseigné dans la ligne de bordereau pour les CMU, on le retrouve dans les factures débuteur
UPDATE prod_hm.FAC_BORDEREAU
SET FBOR_ID_ORGA_AMC = FACD_ID_ORGA_AMC
FROM
(
SELECT FBOR_ID_FBOR,
MAX(FACD_ID_ORGA_AMC) AS FACD_ID_ORGA_AMC
FROM
(
SELECT FBOR_ID_FBOR,
FACT_ID_FACT,
MAX(FBOR_ID_ORGA_AMO) AS FBOR_ID_ORGA_AMO,
MAX(FBOR_ID_ORGA_AMC) AS FBOR_ID_ORGA_AMC,
MAX(FACD_ID_ORGA_AMC) AS FACD_ID_ORGA_AMC
FROM prod_hm.FAC_BORDEREAU
JOIN prod_hm.FAC_LIGNE_BORDEREAU ON LBOR_ID_FBOR = FBOR_ID_FBOR
JOIN prod_hm.FAC_FACTURE ON LBOR_ID_FACT = FACT_ID_FACT
JOIN prod_hm.FAC_FACTURE_DEBITEUR ON LBOR_ID_FACT = FACD_ID_FACT
JOIN prod_hm.IDE_ORGANISME ON FACD_ID_ORGA_AMC = ORGA_ID_ORGA
WHERE LBOR_MTT_MUT_SEJ <> 0 AND
FBOR_ID_ORGA_AMO <> 0 AND
FBOR_ID_ORGA_AMC = 0 AND
ORGA_NOM LIKE 'CMU %'
GROUP BY 1,2
HAVING MAX(FBOR_ID_ORGA_AMC) = 0
) subview
GROUP BY 1
) subview
WHERE FAC_BORDEREAU.FBOR_ID_FBOR = subview.FBOR_ID_FBOR
;
-- L'organisme AMC n'est pas toujours renseigné dans la ligne de bordereau, on le retrouve dans les factures débuteur
UPDATE prod_hm.FAC_BORDEREAU
SET FBOR_ID_ORGA_AMC = FACD_ID_ORGA_AMC
FROM
(
SELECT FBOR_ID_FBOR, FACD_ID_ORGA_AMC
FROM prod_hm.FAC_LIGNE_BORDEREAU
JOIN prod_hm.FAC_FACTURE_DEBITEUR ON LBOR_ID_FACD = FACD_ID_FACD
JOIN prod_hm.FAC_BORDEREAU ON LBOR_ID_FBOR = FBOR_ID_FBOR
WHERE FBOR_ID_ORGA_AMC = 0 AND FACD_ID_ORGA_AMC <> 0 AND
FACD_MTT_SEJOUR = LBOR_MTT_MUT_SEJ
) subview
WHERE FAC_BORDEREAU.FBOR_ID_FBOR = subview.FBOR_ID_FBOR
;
DROP TABLE IF EXISTS w_FAC_BORDEREAU;
CREATE TEMP TABLE w_FAC_BORDEREAU AS
SELECT LBOR_ID_FACT::bigint,
'0'::text AS code_expedie_0,
MAX(CASE
WHEN FBOR_ID_ORGA_AMO > 0 THEN '1'
ELSE '0'
END) AS code_expedie_1,
MAX(CASE
WHEN FBOR_ID_ORGA_AMC > 0 AND FBOR_ID_ORGA_AMC <> tiers_payant_22_orga_id THEN '1'
WHEN FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC <> tiers_payant_22_orga_id THEN '1'
ELSE '0' END) AS code_expedie_2,
MAX(CASE
WHEN FBOR_ID_ORGA_AMC > 0 AND FBOR_ID_ORGA_AMC = tiers_payant_22_orga_id THEN '1'
WHEN FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC = tiers_payant_22_orga_id THEN '1'
ELSE '0' END) AS code_expedie_22,
''::text AS no_bordereau_0,
MAX(CASE
WHEN FBOR_ID_ORGA_AMO > 0 THEN FBOR_NUM_LOT
ELSE 0 END) AS no_bordereau_1,
MAX(CASE
WHEN FBOR_ID_ORGA_AMC > 0 AND FBOR_ID_ORGA_AMC <> tiers_payant_22_orga_id THEN FBOR_NUM_LOT
WHEN FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC <> tiers_payant_22_orga_id THEN FBOR_NUM_LOT
ELSE 0 END) AS no_bordereau_2,
MAX(CASE
WHEN FBOR_ID_ORGA_AMC > 0 AND FBOR_ID_ORGA_AMC = tiers_payant_22_orga_id THEN FBOR_NUM_LOT
WHEN FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC = tiers_payant_22_orga_id THEN FBOR_NUM_LOT
ELSE 0 END) AS no_bordereau_22,
'20991231'::date AS date_expedition_0,
MIN(CASE
WHEN FBOR_ID_ORGA_AMO > 0 THEN GREATEST(FBOR_DAT_EXPEDITION, FBOR_DAT_CONSTITUTION)
ELSE '20991231' END) AS date_expedition_1,
MIN(CASE
WHEN FBOR_ID_ORGA_AMC > 0 AND FBOR_ID_ORGA_AMC <> tiers_payant_22_orga_id THEN GREATEST(FBOR_DAT_EXPEDITION, FBOR_DAT_CONSTITUTION)
WHEN FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC <> tiers_payant_22_orga_id THEN GREATEST(FBOR_DAT_EXPEDITION, FBOR_DAT_CONSTITUTION)
ELSE '20991231' END) AS date_expedition_2,
MIN(CASE
WHEN FBOR_ID_ORGA_AMC > 0 AND FBOR_ID_ORGA_AMC = tiers_payant_22_orga_id THEN GREATEST(FBOR_DAT_EXPEDITION, FBOR_DAT_CONSTITUTION)
WHEN FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC = tiers_payant_22_orga_id THEN GREATEST(FBOR_DAT_EXPEDITION, FBOR_DAT_CONSTITUTION)
ELSE '20991231' END) AS date_expedition_22
FROM prod_hm.FAC_BORDEREAU
JOIN prod_hm.FAC_LIGNE_BORDEREAU ON LBOR_ID_FBOR = FBOR_ID_FBOR
JOIN w_FAC_FACTURE ON LBOR_ID_FACT = FACT_ID_FACT
LEFT JOIN prod_hm.FAC_FACTURE_DEBITEUR ON LBOR_ID_FACD = FACD_ID_FACD
WHERE FBOR_DAT_SUPPRESSION IS NULL
GROUP BY LBOR_ID_FACT;
CREATE INDEX w_FAC_BORDEREAU_i1
ON w_FAC_BORDEREAU
USING btree
(LBOR_ID_FACT);
-- Informations rejets
DROP TABLE IF EXISTS w_FAC_REJET;
CREATE TEMP TABLE w_FAC_REJET AS
SELECT NOER_ID_FACT::bigint,
COUNT(*) as nb_rejets
FROM prod_hm.CCL_NOEMIE_REJET, w_FAC_FACTURE
WHERE NOER_ID_FACT = FACT_ID_FACT AND TRIM(NOER_CDF_REJET) <> '0001'
GROUP BY NOER_ID_FACT;
CREATE INDEX w_FAC_REJET_i1
ON w_FAC_REJET
USING btree
(NOER_ID_FACT);
-- Ajout des factures
SELECT base.cti_disable_index('activite[PX]', 'i_factures_3');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_4');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_5');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_6');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_7');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_8');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_9');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_10');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_11');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_12');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_13');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_14');
INSERT INTO activite[PX].p_factures(
sejour_id,
no_sejour,
no_facture,
date_debut,
date_fin,
type_facture,
code_facture,
date_facture,
code_vente,
date_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_0_id,
tiers_payant_1_id,
tiers_payant_2_id,
tiers_payant_22_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,
code_cloture,
code_cp_demandee,
ghs_bebe1_id,
ghs_bebe2_id,
ghs_bebe3_id,
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,
nb_rejets,
montant_facture_c_actes_inclus_dans_sejour,
montant_facture_h_actes_inclus_dans_sejour
)
SELECT
sejour_id,
no_sejour,
FACT_NUM_FAC AS no_facture,
date(FACT_DAT_DEB_FAC) AS date_debut,
date(FACT_DAT_FIN_FAC) AS date_fin,
CASE
WHEN FACT_TYPE IN ('P') THEN 'P'
WHEN FACT_TYPE IN ('F', 'P') AND FACT_TYP_FAC = 0 THEN '0'
WHEN FACT_TYPE = 'X' THEN 'X'
WHEN FACT_TYPE = 'F' AND FACT_TYP_FAC <> 0 THEN '2'
WHEN FACT_TYPE = 'A' THEN '1'
ELSE '0' END AS type_facture,
CASE WHEN FACT_TYPE = 'P' THEN '0' ELSE '1' END AS code_facture,
date(FACT_DAT_DER_CALCUL) AS date_facture,
CASE WHEN FACT_TYPE <> 'P' AND w_FAC_DATEVENTE.date_vente IS NOT NULL THEN '1' ELSE '0' END AS code_vente,
CASE WHEN FACT_TYPE <> 'P' AND w_FAC_DATEVENTE.date_vente IS NOT NULL THEN w_FAC_DATEVENTE.date_vente ELSE '20991231'::date END AS date_vente,
CASE WHEN FACT_TYPE <> 'P' AND w_FAC_DATEVENTE.date_vente IS NOT NULL THEN extract('year' FROM w_FAC_DATEVENTE.date_vente) * 100 + extract('month' FROM w_FAC_DATEVENTE.date_vente) ELSE extract('year' FROM '20991231'::date) * 100 + extract('month' FROM '20991231'::date) END AS mois_vente,
COALESCE(
GREATEST(
CASE
WHEN w_FAC_MONTANTS.montant_comptabilise_0_c = 0 THEN date(FACT_DAT_FIN_FAC) ELSE date_dernier_reglement_0_c END,
CASE
WHEN w_FAC_MONTANTS.montant_comptabilise_0_h = 0 THEN date(FACT_DAT_FIN_FAC) ELSE date_dernier_reglement_0_h END,
CASE
WHEN w_FAC_MONTANTS.montant_comptabilise_1_c = 0 THEN date(FACT_DAT_FIN_FAC) ELSE date_dernier_reglement_1_c END,
CASE
WHEN w_FAC_MONTANTS.montant_comptabilise_1_h = 0 THEN date(FACT_DAT_FIN_FAC) ELSE date_dernier_reglement_1_h END,
CASE
WHEN w_FAC_MONTANTS.montant_comptabilise_2_c = 0 THEN date(FACT_DAT_FIN_FAC) ELSE date_dernier_reglement_2_c END,
CASE
WHEN w_FAC_MONTANTS.montant_comptabilise_2_h = 0 THEN date(FACT_DAT_FIN_FAC) ELSE date_dernier_reglement_2_h END,
CASE
WHEN w_FAC_MONTANTS.montant_comptabilise_22_c = 0 THEN date(FACT_DAT_FIN_FAC) ELSE date_dernier_reglement_22_c END,
CASE
WHEN w_FAC_MONTANTS.montant_comptabilise_22_h = 0 THEN date(FACT_DAT_FIN_FAC) ELSE date_dernier_reglement_22_h END)
, '20991231') as date_solde,
w_FAC_MONTANTS.montant_facture_c AS montant_facture_c,
w_FAC_MONTANTS.montant_facture_h AS montant_facture_h,
w_FAC_MONTANTS.montant_regle_c AS montant_regle_c,
w_FAC_MONTANTS.montant_regle_h AS montant_regle_h,
date(FACT_DAT_DER_CALCUL) - date_sortie as delai_facture,
0 as delai_solde,
LEAST(w_FAC_BORDEREAU.date_expedition_1, w_FAC_BORDEREAU.date_expedition_2) as date_expedition,
0 as delai_expedition,
tiers_payant_0_id,
tiers_payant_1_id,
tiers_payant_2_id,
tiers_payant_22_id,
CASE
WHEN w_FAC_MONTANTS.montant_comptabilise_0_c = 0 THEN date(FACT_DAT_FIN_FAC)
WHEN date_dernier_reglement_0_c IS NOT NULL THEN date_dernier_reglement_0_c ELSE '20991231' END as date_solde_0_c,
CASE
WHEN w_FAC_MONTANTS.montant_comptabilise_0_h = 0 THEN date(FACT_DAT_FIN_FAC)
WHEN date_dernier_reglement_0_h IS NOT NULL THEN date_dernier_reglement_0_h ELSE '20991231' END as date_solde_0_h,
CASE
WHEN w_FAC_MONTANTS.montant_comptabilise_1_c = 0 THEN date(FACT_DAT_FIN_FAC)
WHEN date_dernier_reglement_1_c IS NOT NULL THEN date_dernier_reglement_1_c ELSE '20991231' END as date_solde_1_c,
CASE
WHEN w_FAC_MONTANTS.montant_comptabilise_1_h = 0 THEN date(FACT_DAT_FIN_FAC)
WHEN date_dernier_reglement_1_h IS NOT NULL THEN date_dernier_reglement_1_h ELSE '20991231' END as date_solde_1_h,
CASE
WHEN w_FAC_MONTANTS.montant_comptabilise_2_c = 0 THEN date(FACT_DAT_FIN_FAC)
WHEN date_dernier_reglement_2_c IS NOT NULL THEN date_dernier_reglement_2_c ELSE '20991231' END as date_solde_2_c,
CASE
WHEN w_FAC_MONTANTS.montant_comptabilise_2_h = 0 THEN date(FACT_DAT_FIN_FAC)
WHEN date_dernier_reglement_2_h IS NOT NULL THEN date_dernier_reglement_2_h ELSE '20991231' END as date_solde_2_h,
CASE
WHEN w_FAC_MONTANTS.montant_comptabilise_22_c = 0 THEN date(FACT_DAT_FIN_FAC)
WHEN date_dernier_reglement_22_c IS NOT NULL THEN date_dernier_reglement_22_c ELSE '20991231' END as date_solde_22_c,
CASE
WHEN w_FAC_MONTANTS.montant_comptabilise_22_h = 0 THEN date(FACT_DAT_FIN_FAC)
WHEN date_dernier_reglement_22_h IS NOT NULL THEN date_dernier_reglement_22_h ELSE '20991231' END as date_solde_22_h,
w_FAC_BORDEREAU.date_expedition_0,
w_FAC_BORDEREAU.date_expedition_1,
w_FAC_BORDEREAU.date_expedition_2,
w_FAC_BORDEREAU.date_expedition_22,
w_FAC_BORDEREAU.code_expedie_0,
w_FAC_BORDEREAU.code_expedie_1,
w_FAC_BORDEREAU.code_expedie_2,
w_FAC_BORDEREAU.code_expedie_22,
w_FAC_BORDEREAU.no_bordereau_0,
w_FAC_BORDEREAU.no_bordereau_1,
w_FAC_BORDEREAU.no_bordereau_2,
w_FAC_BORDEREAU.no_bordereau_22,
w_FAC_MONTANTS.montant_facture_0_c AS montant_facture_0_c,
w_FAC_MONTANTS.montant_facture_0_h AS montant_facture_0_h,
w_FAC_MONTANTS.montant_facture_1_c AS montant_facture_1_c,
w_FAC_MONTANTS.montant_facture_1_h AS montant_facture_1_h,
w_FAC_MONTANTS.montant_facture_2_c AS montant_facture_2_c,
w_FAC_MONTANTS.montant_facture_2_h AS montant_facture_2_h,
w_FAC_MONTANTS.montant_facture_22_c AS montant_facture_22_c,
w_FAC_MONTANTS.montant_facture_22_h AS montant_facture_22_h,
w_FAC_MONTANTS.montant_regle_0_c AS montant_regle_0_c,
w_FAC_MONTANTS.montant_regle_0_h AS montant_regle_0_h,
w_FAC_MONTANTS.montant_regle_1_c AS montant_regle_1_c,
w_FAC_MONTANTS.montant_regle_1_h AS montant_regle_1_h,
w_FAC_MONTANTS.montant_regle_2_c AS montant_regle_2_c,
w_FAC_MONTANTS.montant_regle_2_h AS montant_regle_2_h,
w_FAC_MONTANTS.montant_regle_22_c AS montant_regle_22_c,
w_FAC_MONTANTS.montant_regle_22_h AS montant_regle_22_h,
0 AS delai_expedition_0,
0 AS delai_expedition_1,
0 AS delai_expedition_2,
0 AS delai_expedition_22,
0 AS delai_solde_0_c,
0 AS delai_solde_0_h,
0 AS delai_solde_1_c,
0 AS delai_solde_1_h,
0 AS delai_solde_2_c,
0 AS delai_solde_2_h,
0 AS delai_solde_22_c,
0 AS delai_solde_22_h,
ghs_id,
'' as particularite_t2a,
'0' as code_cloture,
'0' as code_cp_demandee,
0 AS ghs_bebe1_id,
0 AS ghs_bebe2_id,
0 AS ghs_bebe3_id,
w_FAC_MONTANTS.montant_comptabilise_c,
w_FAC_MONTANTS.montant_comptabilise_h,
w_FAC_MONTANTS.montant_comptabilise_0_c,
w_FAC_MONTANTS.montant_comptabilise_0_h,
w_FAC_MONTANTS.montant_comptabilise_1_c,
w_FAC_MONTANTS.montant_comptabilise_1_h,
w_FAC_MONTANTS.montant_comptabilise_2_c,
w_FAC_MONTANTS.montant_comptabilise_2_h,
w_FAC_MONTANTS.montant_comptabilise_22_c,
w_FAC_MONTANTS.montant_comptabilise_22_h,
COALESCE(w_FAC_REJET.nb_rejets,0),
0,
0
FROM w_FAC_FACTURE
LEFT JOIN w_FAC_BORDEREAU ON (LBOR_ID_FACT = FACT_ID_FACT)
LEFT JOIN w_FAC_MONTANTS ON (FACD_ID_FACT = FACT_ID_FACT)
LEFT JOIN w_FAC_REGLEMENT ON (LECR_ID_FACT = FACT_ID_FACT)
LEFT JOIN w_FAC_DATEVENTE ON (LECR_ID_FACT_VENT = FACT_ID_FACT)
LEFT JOIN w_FAC_REJET ON (NOER_ID_FACT = FACT_ID_FACT)
ORDER BY 1,2;
-- Avoirs qui annulent des factures
UPDATE activite[PX].p_factures SET no_facture_od_avoir = fac_facture_avoir.FACT_NUM_FAC
FROM prod_hm.FAC_FACTURE
JOIN prod_hm.FAC_FACTURE FAC_FACTURE_AVOIR ON FAC_FACTURE.FACT_ID_FACT_AVOIR = FAC_FACTURE_AVOIR.FACT_ID_FACT AND FAC_FACTURE.FACT_ID_FACT_AVOIR <> 0
WHERE p_factures.no_facture = FAC_FACTURE.FACT_NUM_FAC
AND no_facture_od_avoir IS DISTINCT FROM fac_facture_avoir.FACT_NUM_FAC;
DROP TABLE IF EXISTS w_ods_avoir;
CREATE TEMP TABLE w_ods_avoir AS
SELECT p_factures.no_facture, p_factures.no_facture_od_avoir, p_factures_avoir.date_facture AS date_od_avoir,
SUM(p_factures.montant_comptabilise_c + p_factures.montant_comptabilise_h) AS montant_comptabilise,
SUM(p_factures.montant_regle_c + p_factures.montant_regle_h) AS montant_regle,
SUM(p_factures_avoir.montant_comptabilise_c + p_factures_avoir.montant_comptabilise_h) AS montant_facture_avoir,
SUM(p_factures_avoir.montant_regle_c + p_factures_avoir.montant_regle_h) AS montant_regle_avoir
FROM activite[PX].p_factures
JOIN activite[PX].p_factures p_factures_avoir ON p_factures.no_facture = p_factures_avoir.no_facture_od_avoir
WHERE p_factures.type_facture = 'X' AND p_factures_avoir.type_facture = '1'
GROUP BY 1,2,3
HAVING SUM(p_factures.montant_comptabilise_c + p_factures.montant_comptabilise_h) = 0 - SUM(p_factures_avoir.montant_comptabilise_c + p_factures_avoir.montant_comptabilise_h) AND
SUM(p_factures.montant_regle_c + p_factures.montant_regle_h) = 0 AND
SUM(p_factures_avoir.montant_regle_c + p_factures_avoir.montant_regle_h) = 0;
UPDATE activite[PX].p_factures SET
date_solde_c = date_od_avoir,
date_solde_0_c = date_od_avoir,
date_solde_1_c = date_od_avoir,
date_solde_2_c = date_od_avoir,
date_solde_22_c = date_od_avoir,
date_solde_h = date_od_avoir,
date_solde_0_h = date_od_avoir,
date_solde_1_h = date_od_avoir,
date_solde_2_h = date_od_avoir,
date_solde_22_h = date_od_avoir,
montant_regle_c = montant_comptabilise_c,
montant_regle_0_c = montant_comptabilise_0_c,
montant_regle_1_c = montant_comptabilise_1_c,
montant_regle_2_c = montant_comptabilise_2_c,
montant_regle_22_c = montant_comptabilise_22_c,
montant_regle_h = montant_comptabilise_h,
montant_regle_0_h = montant_comptabilise_0_h,
montant_regle_1_h = montant_comptabilise_1_h,
montant_regle_2_h = montant_comptabilise_2_h,
montant_regle_22_h = montant_comptabilise_22_h
FROM w_ods_avoir
WHERE p_factures.no_facture = w_ods_avoir.no_facture;
UPDATE activite[PX].p_factures SET
date_solde_c = date_od_avoir,
date_solde_0_c = date_od_avoir,
date_solde_1_c = date_od_avoir,
date_solde_2_c = date_od_avoir,
date_solde_22_c = date_od_avoir,
date_solde_h = date_od_avoir,
date_solde_0_h = date_od_avoir,
date_solde_1_h = date_od_avoir,
date_solde_2_h = date_od_avoir,
date_solde_22_h = date_od_avoir,
montant_regle_c = montant_comptabilise_c,
montant_regle_0_c = montant_comptabilise_0_c,
montant_regle_1_c = montant_comptabilise_1_c,
montant_regle_2_c = montant_comptabilise_2_c,
montant_regle_22_c = montant_comptabilise_22_c,
montant_regle_h = montant_comptabilise_h,
montant_regle_0_h = montant_comptabilise_0_h,
montant_regle_1_h = montant_comptabilise_1_h,
montant_regle_2_h = montant_comptabilise_2_h,
montant_regle_22_h = montant_comptabilise_22_h
FROM w_ods_avoir
WHERE p_factures.no_facture = w_ods_avoir.no_facture_od_avoir;
SELECT base.cti_enable_index('activite[PX]', 'i_factures_3');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_4');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_5');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_6');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_7');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_8');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_9');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_10');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_11');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_12');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_13');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_14');
-- 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,
p_sejours.ghs_id,
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,
CASE WHEN code_sorti = '1' THEN date_sortie ELSE date(now()) END AS date_fin_encours,
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
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%' AND
type_facture IS DISTINCT FROM 'P' AND
no_facture_od_avoir = ''
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.code_prevu <> 1 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'
GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13;
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,
ghs_id,
date_debut,
date_fin)
SELECT finess,
no_sejour,
'E' || no_sejour || CASE WHEN avec_facturation_intermediaire = '1' THEN '_' || substr(p_calendrier.mois,3,4) ELSE '' END,
'E' || no_sejour || CASE WHEN avec_facturation_intermediaire = '1' THEN '_' || substr(p_calendrier.mois,3,4) 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 ,
ghs_id,
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,13;
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
);
-- Suppression des tables de travail non utilisées après
DROP TABLE IF EXISTS w_sejours_orga CASCADE;
DROP TABLE IF EXISTS w_FAC_MONTANTS CASCADE;
DROP TABLE IF EXISTS w_FAC_REGLEMENT CASCADE;
DROP TABLE IF EXISTS w_FAC_BORDEREAU CASCADE;
DROP TABLE IF EXISTS w_factures_trous CASCADE;
]]></sqlcmd>
</NODE>
<NODE label="Rejets">
<sqlcmd><![CDATA[
INSERT INTO activite[PX].p_factures_rejets(
no_facture, date_rejet, rejet_id, rejet_code, rejet_texte)
SELECT
FACT_NUM_FAC ,
date(NOER_DAT_CRE) ,
0,
TRIM(NOER_CDF_REJET) ,
TRIM(NOER_LIB_REJET)
FROM prod_hm.CCL_NOEMIE_REJET, w_FAC_FACTURE
WHERE NOER_ID_FACT = FACT_ID_FACT
AND TRIM(NOER_CDF_REJET) <> '0001' AND TRIM(NOER_LIB_REJET) <> '';
INSERT INTO activite.t_rejets_noemie (texte, code)
SELECT rejet_texte, MAX(rejet_code)
FROM activite[PX].p_factures_rejets
LEFT JOIN activite.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.t_rejets_noemie
WHERE rejet_texte = t_rejets_noemie.texte;
]]></sqlcmd>
</NODE>
<NODE label="Date fin multi-séances">
<sqlcmd><![CDATA[
-- Séjours sortis dont la dernière séance est antérieure à la date de sortie
DROP TABLE IF EXISTS w_seances_sortie_mvt;
CREATE TEMP TABLE w_seances_sortie_mvt AS
SELECT p_sejours.no_sejour, MAX(CASE WHEN nb_seances > 0 THEN p_mouvements_sejour.date ELSE p_sejours.date_entree END) AS date_mvt_max
FROM activite[PX].p_sejours
JOIN activite[PX].p_mouvements_sejour On p_sejours.no_sejour = p_mouvements_sejour.no_sejour
JOIN activite[PX].t_lieux ON p_mouvements_sejour.lieu_id = t_lieux.oid
JOIN activite[PX].t_services_facturation On service_facturation_id = t_services_facturation.oid
WHERE code_sorti = '1' AND code_prevu = '0' AND p_sejours.type_sejour = '5' AND
avec_facturation_intermediaire = '1'
GROUP BY 1
HAVING MAX(date_sortie) > MAX(CASE WHEN nb_seances > 0 THEN p_mouvements_sejour.date ELSE p_sejours.date_entree END) AND
SUM(nb_seances) > 0
;
DROP TABLE IF EXISTS w_seances_sortie_fac;
CREATE TEMP TABLE w_seances_sortie_fac AS
SELECT p_sejours.no_sejour, MAX(p_factures.date_fin) AS date_fac_max
FROM activite[PX].p_sejours
JOIN w_seances_sortie_mvt ON p_sejours.no_sejour = w_seances_sortie_mvt.no_sejour
JOIN activite[PX].p_factures On p_sejours.no_sejour = p_factures.no_sejour
WHERE code_sorti = '1' AND code_prevu = '0' AND type_sejour = '5' AND
p_factures.code_facture >= '1'
GROUP BY 1
;
DROP TABLE IF EXISTS w_seances_sortie_maj;
CREATE TEMP TABLE w_seances_sortie_maj AS
SELECT p_sejours.no_sejour, p_sejours.date_sortie, date_mvt_max, date_fac_max,
GREATEST(date_mvt_max, date_fac_max) AS date_sortie_reelle
FROM activite[PX].p_sejours
JOIN w_seances_sortie_mvt ON p_sejours.no_sejour = w_seances_sortie_mvt.no_sejour
LEFT JOIN w_seances_sortie_fac ON p_sejours.no_sejour = w_seances_sortie_fac.no_sejour
WHERE date_sortie > GREATEST(date_mvt_max, date_fac_max)
ORDER BY 1
;
UPDATE activite[PX].p_sejours
SET date_sortie = date_sortie_reelle
FROM w_seances_sortie_maj
WHERE p_sejours.no_sejour = w_seances_sortie_maj.no_sejour AND
p_sejours.date_sortie > date_sortie_reelle;
DELETE FROM activite[PX].p_factures
USING w_seances_sortie_maj
WHERE p_factures.no_sejour = w_seances_sortie_maj.no_sejour AND
p_factures.date_fin > date_sortie_reelle AND
p_factures.code_facture = '0' AND
montant_regle_c = 0 AND montant_facture_c = 0 AND
montant_regle_h = 0 AND montant_facture_h = 0
;
DELETE FROM activite[PX].p_mouvements_sejour
USING w_seances_sortie_maj
WHERE p_mouvements_sejour.no_sejour = w_seances_sortie_maj.no_sejour AND
p_mouvements_sejour.date > date_sortie_reelle
;
]]></sqlcmd>
</NODE>
<NODE label="Lignes non facturées Clinique">
<sqlcmd><![CDATA[
TRUNCATE activite[PX].p_factures_lignes_non_facturees_c;
INSERT INTO activite[PX].p_factures_lignes_non_facturees_c(
no_facture,
date_debut,
date_fin,
nb_rubrique,
coefficient,
rubrique_facturation_id,
prestation_id,
prix_unitaire,
lieu_id,
ucd_id,
lpp_id)
SELECT
p_factures.no_facture,
date(LFAC_DAT_EXE_DEB) AS date_debut,
date(COALESCE(LFAC_DAT_EXE_FIN, LFAC_DAT_EXE_DEB)) AS date_fin,
MAX(LFAC_QTE_COEFFICIENT) AS nb_rubrique,
1 AS coefficient,
MAX(t_rubriques_facturation.oid) AS rubrique_facturation_id,
MAX(t_prestations.oid) AS prestation_id,
CASE
WHEN MAX(LFAD_IND_BGH) <> '1' THEN MAX(LFAC_PRI_UNITAIRE)
ELSE base.cti_division(SUM(CASE WHEN LFAD_IND_BGH <> '1' THEN LFAD_MTT_HOR_DEH ELSE 0 END) , MAX(LFAC_QTE_COEFFICIENT)) END
AS prix_unitaire,
MAX(p_sejours.lieu_sortie_id) AS lieu_id,
MAX(COALESCE(t_ucd.oid)) AS ucd_id,
MAX(COALESCE(t_lpp.oid)) AS lpp_id
FROM prod_hm.FAC_LIGNE_FACTURE
JOIN prod_hm.FAC_FACTURE ON LFAC_ID_FACT = FACT_ID_FACT AND FACT_TYPE = 'P'
JOIN prod_hm.FAC_LIGNE_FACTURE_DEBITEUR ON LFAC_ID_LFAC = LFAD_ID_LFAC
JOIN activite[PX].p_sejours ON LFAC_ID_SEJO_D::bigint = p_sejours.code_original AND p_sejours.etat = ''
JOIN activite[PX].p_factures ON p_sejours.no_sejour = p_factures.no_sejour AND type_facture = 'E' AND p_factures.no_facture NOT LIKE '%BG'
JOIN activite[PX].t_rubriques_facturation ON LFAC_ID_PRSE::bigint = t_rubriques_facturation.code_original
JOIN activite.t_prestations ON LFAC_LET_CLE = t_prestations.code
LEFT JOIN base.t_lpp ON LFAC_COD_LPP <> '' AND LFAC_COD_LPP = t_lpp.code
LEFT JOIN prod_hm.FAC_LIGNE_FACTURE_UCD ON LFAC_ID_LFAC = LFUC_ID_LFAC
LEFT JOIN base.t_ucd ON LFUC_COD_UCD <> '' AND LFUC_COD_UCD = t_ucd.code
WHERE LFAC_LET_CLE NOT IN ('GHS', 'GMT') AND LFAC_ID_PRSE <> 0 AND
FACT_DAT_SUP IS NULL AND
date(LFAC_DAT_EXE_DEB) BETWEEN p_factures.date_debut AND p_factures.date_fin
GROUP BY 1,2,3, LFAC_ID_LFAC
HAVING MIN(LFAD_IND_BGH) <> '1'
;
DROP TABLE IF EXISTS w_deja_non_factures;
CREATE TEMP TABLE w_deja_non_factures AS
SELECT LFAC_ID_ACSA
FROM prod_hm.FAC_LIGNE_FACTURE
JOIN prod_hm.FAC_FACTURE ON LFAC_ID_FACT = FACT_ID_FACT AND FACT_TYPE = 'P'
JOIN activite[PX].p_sejours ON LFAC_ID_SEJO_D::bigint = p_sejours.code_original
JOIN prod_hm.FAC_LIGNE_FACTURE_DEBITEUR ON LFAC_ID_LFAC = LFAD_ID_LFAC
WHERE LFAC_ID_PRSE <> 0 AND
FACT_DAT_SUP IS NULL AND
LFAC_ID_ACSA <> 0
GROUP BY 1
HAVING MIN(LFAD_IND_BGH) <> '1';
INSERT INTO activite[PX].p_factures_lignes_non_facturees_c(
no_facture
, date_debut
, date_fin
, nb_rubrique
, coefficient
, rubrique_facturation_id
, prestation_id
, prix_unitaire
, lieu_id
)
SELECT
p_factures.no_facture
, date(ACSA_DAT_EXE_DEB) AS date_debut
, date(COALESCE(ACSA_DAT_EXE_FIN, ACSA_DAT_EXE_DEB)) AS date_fin
, ACSA_QTE_COEFFICIENT AS nb_rubrique
, 1 AS coefficient
, t_rubriques_facturation.oid AS rubrique_facturation_id
, t_prestations.oid AS prestation_id
, CASE
WHEN acsa_qte_coefficient > 1 AND base.cti_division(acsa_qte_coefficient * acsa_pri_unitaire, acsa_mon_tot) > 2 THEN base.cti_division(acsa_pri_unitaire , acsa_qte_coefficient)
ELSE acsa_pri_unitaire END AS prix_unitaire
, p_sejours.lieu_sortie_id AS lieu_id
FROM prod_hm.SAD_ACTIVITE_SAISIES
JOIN activite[PX].p_sejours ON ACSA_ID_SEJO::bigint = p_sejours.code_original AND p_sejours.etat = ''
JOIN activite[PX].p_factures ON p_sejours.no_sejour = p_factures.no_sejour AND type_facture = 'E'
JOIN activite[PX].t_rubriques_facturation ON ACSA_ID_PRSE::bigint = t_rubriques_facturation.code_original
JOIN activite.t_prestations ON ACSA_LET_CLE = t_prestations.code
LEFT JOIN w_deja_non_factures ON ACSA_ID_ACSA = LFAC_ID_ACSA
WHERE 1 = 1
AND ACSA_LET_CLE NOT IN ('GHS', 'GMT', 'SZH')
AND ACSA_ID_PRSE <> 0
AND LFAC_ID_ACSA IS NULL
AND date(ACSA_DAT_EXE_DEB) BETWEEN p_factures.date_debut AND p_factures.date_fin
;
-- Prestations pointées sur le dossier sans ligne générée
DROP TABLE IF EXISTS w_lignes_deja_non_facturees_sejour;
CREATE TEMP TABLE w_lignes_deja_non_facturees_sejour AS
SELECT no_sejour, prestation_id, rubrique_facturation_id
FROM activite[PX].p_factures_lignes_non_facturees_c
JOIN activite[PX].p_factures ON p_factures_lignes_non_facturees_c.no_facture = p_factures.no_facture
GROUP BY 1,2,3
;
ANALYSE w_lignes_deja_non_facturees_sejour
;
INSERT INTO activite[PX].p_factures_lignes_non_facturees_c(
no_facture,
date_debut,
date_fin,
nb_rubrique,
coefficient,
rubrique_facturation_id,
prestation_id,
prix_unitaire,
lieu_id)
SELECT p_factures.no_facture,
GREATEST(date(SEPR_DAT_DEB), p_factures.date_debut) AS date_debut,
LEAST(date(COALESCE(SEPR_DAT_FIN,'20991231')),p_factures.date_fin, date(now()+interval '1 day')) AS date_fin,
GREATEST(LEAST(date(COALESCE(SEPR_DAT_FIN,'20991231')),p_factures.date_fin, date(now()+interval '1 day')) - GREATEST(date(SEPR_DAT_DEB), p_factures.date_debut),1) AS nb_rubrique,
1 AS coefficient,
t_rubriques_facturation.oid AS rubrique_facturation_id,
t_prestations.oid AS prestation_id,
LFAC_PRI_UNITAIRE AS prix_unitaire,
p_sejours.lieu_sortie_id AS lieu_id
FROM prod_hm.IDE_SEJOUR_PRESTATION
JOIN prod_hm.PAD_PRESTATION_SEJOUR ON SEPR_ID_PRSE = PRSE_ID_PRSE
JOIN activite[PX].p_sejours ON SEPR_ID_SEJO = code_original AND type_sejour IN ('1','2')
JOIN activite[PX].p_factures ON p_factures.no_sejour = p_sejours.no_sejour
JOIN activite[PX].t_rubriques_facturation ON SEPR_ID_PRSE::bigint = t_rubriques_facturation.code_original
JOIN activite.t_prestations ON PRSE_LET_CLE = t_prestations.code
JOIN
(
SELECT LFAC_ID_PRSE, (MAX(ARRAY[LFAC_DAT_EXE_DEB::text,LFAC_PRI_UNITAIRE::text]))[2]::numeric AS LFAC_PRI_UNITAIRE
FROM prod_hm.FAC_LIGNE_FACTURE
WHERE LFAC_ID_PRSE = ANY (SELECT SEPR_ID_PRSE FROM prod_hm.IDE_SEJOUR_PRESTATION GROUP BY 1)
GROUP BY 1
) subview ON SEPR_ID_PRSE = subview.LFAC_ID_PRSE
LEFT JOIN w_lignes_deja_non_facturees_sejour ON
w_lignes_deja_non_facturees_sejour.no_sejour = p_sejours.no_sejour AND
(
w_lignes_deja_non_facturees_sejour.prestation_id = t_prestations.oid OR
w_lignes_deja_non_facturees_sejour.rubrique_facturation_id = t_rubriques_facturation.oid
)
WHERE SEPR_IND_ACTIF = '1'
AND SEPR_ID_PRSE <> 0
AND p_factures.type_facture = 'E'
AND date(SEPR_DAT_DEB) <= p_factures.date_fin
AND (date(SEPR_DAT_FIN) >= p_factures.date_debut OR SEPR_DAT_FIN IS NULL)
AND w_lignes_deja_non_facturees_sejour.no_sejour IS NULL
-- evite les problèmes avec CPC
AND t_prestations.code != ''
AND PRSE_LET_CLE NOT IN ('GMT')
;
]]></sqlcmd>
</NODE>
<NODE label="Lignes facturées Clinique">
<sqlcmd><![CDATA[
-- comptes associés
DROP TABLE IF EXISTS w_FAC_LIGNE_FACTURE_DEBITEUR_compte;
CREATE TEMP TABLE w_FAC_LIGNE_FACTURE_DEBITEUR_compte AS
SELECT LECR_ID_LFAD, MAX(LECR_NUM_COMPTE) AS LECR_NUM_COMPTE
FROM prod_hm.CCL_LIGNE_ECRITURE
JOIN prod_hm.CCL_ECRITURE ON LECR_ID_ECRI = ECRI_ID_ECRI
JOIN w_CCL_JOURNAL ON ECRI_ID_JOUR = JOUR_ID_JOUR
JOIN prod_hm.FAC_LIGNE_FACTURE_DEBITEUR on LECR_ID_LFAD = LFAD_ID_LFAD
WHERE LECR_PART = 'SFT' AND
ECRI_DAT_SUP IS NULL
GROUP BY 1;
ANALYSE w_FAC_LIGNE_FACTURE_DEBITEUR_compte
;
ALTER TABLE w_FAC_LIGNE_FACTURE_DEBITEUR_compte ADD CONSTRAINT w_FAC_LIGNE_FACTURE_DEBITEUR_compte_pkey PRIMARY KEY(LECR_ID_LFAD);
CREATE INDEX w_FAC_LIGNE_FACTURE_DEBITEUR_compte_i1 ON w_FAC_LIGNE_FACTURE_DEBITEUR_compte USING btree (LECR_NUM_COMPTE);
-- Extraction lignes
DROP TABLE IF EXISTS w_FAC_FACTURE_LIGNE_C;
CREATE TEMP TABLE w_FAC_FACTURE_LIGNE_C AS
SELECT
1::integer AS origine_facturation_id,
LFAC_ID_LFAC,
FACT_NUM_FAC AS no_facture,
date(LFAC_DAT_EXE_DEB) AS date_debut,
date(LFAC_DAT_EXE_FIN) AS date_fin,
CASE WHEN FACT_TYPE <> 'P' AND w_FAC_DATEVENTE.date_vente IS NOT NULL THEN w_FAC_DATEVENTE.date_vente ELSE '20991231'::date END AS date_vente,
lieu_sortie_id,
LFAC_QTE_COEFFICIENT AS nb_rubrique,
LFAC_QTE_COEFFICIENT AS nb_prestations,
1::numeric as coefficient,
LFAC_COE_MCO_HAD AS coefficient_mco,
COALESCE(t_rubriques_facturation.oid::bigint, 0) AS rubrique_facturation_id,
COALESCE(t_rubriques_facturation.oid::bigint, 0) AS rubrique_comptabilisation_id,
MAX(COALESCE(t_compte.oid::bigint, 0)) AS compte_produit_id,
COALESCE(t_prestations.oid::bigint, 0) AS prestation_id,
LFAC_PRI_UNITAIRE AS prix_unitaire,
MAX(LFAC_COD_LPP) AS LFAC_COD_LPP,
0::bigint AS ucd_id,
0::bigint AS lpp_id,
SUM(LFAD_MTT_HOR_DEH + LFAD_MTT_DEH) AS montant_facture,
SUM(CASE WHEN FACD_ID_ORGA_AMO = 0 AND FACD_ID_ORGA_AMC = 0 THEN LFAD_MTT_HOR_DEH + LFAD_MTT_DEH ELSE 0 END) as montant_facture_0,
SUM(CASE WHEN FACD_ID_ORGA_AMO > 0 THEN LFAD_MTT_HOR_DEH + LFAD_MTT_DEH ELSE 0 END) as montant_facture_1,
SUM(CASE WHEN FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC <> tiers_payant_22_orga_id THEN LFAD_MTT_HOR_DEH + LFAD_MTT_DEH ELSE 0 END) as montant_facture_2,
SUM(CASE WHEN FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC = tiers_payant_22_orga_id THEN LFAD_MTT_HOR_DEH + LFAD_MTT_DEH ELSE 0 END) as montant_facture_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,
MAX(CASE WHEN FACD_ID_ORGA_AMO = 0 AND FACD_ID_ORGA_AMC = 0 THEN 100-LFAD_TAUX ELSE 0 END) as taux_0,
MAX(CASE WHEN FACD_ID_ORGA_AMO > 0 THEN LFAD_TAUX ELSE 0 END) as taux_1,
MAX(CASE WHEN FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC <> tiers_payant_22_orga_id THEN 100-LFAD_TAUX ELSE 0 END) as taux_2,
MAX(CASE WHEN FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC = tiers_payant_22_orga_id THEN 100-LFAD_TAUX ELSE 0 END) as taux_22,
SUM(LFAD_MTT_CRN) AS montant_comptabilise,
SUM(CASE WHEN FACD_ID_ORGA_AMO = 0 AND FACD_ID_ORGA_AMC = 0 THEN LFAD_MTT_CRN ELSE 0 END) as montant_comptabilise_0,
SUM(CASE WHEN FACD_ID_ORGA_AMO > 0 THEN LFAD_MTT_CRN ELSE 0 END) as montant_comptabilise_1,
SUM(CASE WHEN FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC <> tiers_payant_22_orga_id THEN LFAD_MTT_CRN ELSE 0 END) as montant_comptabilise_2,
SUM(CASE WHEN FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC = tiers_payant_22_orga_id THEN LFAD_MTT_CRN ELSE 0 END) as montant_comptabilise_22,
0::bigint AS rubrique_facture_id
FROM prod_hm.FAC_LIGNE_FACTURE
LEFT JOIN activite[PX].t_rubriques_facturation ON (LFAC_ID_PRSE::bigint = t_rubriques_facturation.code_original)
LEFT JOIN activite.t_prestations ON (LFAC_LET_CLE = t_prestations.code)
JOIN w_FAC_FACTURE ON LFAC_ID_FACT = FACT_ID_FACT
LEFT JOIN w_FAC_DATEVENTE ON (LECR_ID_FACT_VENT = FACT_ID_FACT)
JOIN prod_hm.FAC_LIGNE_FACTURE_DEBITEUR ON LFAC_ID_LFAC = LFAD_ID_LFAC
LEFT JOIN w_FAC_LIGNE_FACTURE_DEBITEUR_compte ON LECR_ID_LFAD = LFAD_ID_LFAD
LEFT JOIN activite[PX].t_compte ON (LECR_NUM_COMPTE = t_compte.code_original)
JOIN prod_hm.FAC_FACTURE_DEBITEUR ON LFAD_ID_FACD = FACD_ID_FACD
WHERE
FACT_TYPE <> 'P' AND
LFAC_ID_PRSE <> 0
GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,15,16;
-- Médecin Salarié ?
INSERT INTO w_FAC_FACTURE_LIGNE_C
SELECT
1::integer AS origine_facturation_id,
LFAC_ID_LFAC,
FACT_NUM_FAC AS no_facture,
date(LFAC_DAT_EXE_DEB) AS date_debut,
date(LFAC_DAT_EXE_FIN) AS date_fin,
CASE WHEN FACT_TYPE <> 'P' AND w_FAC_DATEVENTE.date_vente IS NOT NULL THEN w_FAC_DATEVENTE.date_vente ELSE '20991231'::date END AS date_vente,
lieu_sortie_id,
LFAC_QTE_COEFFICIENT AS nb_rubrique,
LFAC_QTE_COEFFICIENT AS nb_prestations,
1::numeric as coefficient,
LFAC_COE_MCO_HAD AS coefficient_mco,
COALESCE(t_rubriques_facturation.oid::bigint, 0) AS rubrique_facturation_id,
COALESCE(t_rubriques_facturation.oid::bigint, 0) AS rubrique_comptabilisation_id,
MAX(COALESCE(t_compte.oid::bigint, 0)) AS compte_produit_id,
COALESCE(t_prestations.oid::bigint, 0) AS prestation_id,
LFAC_PRI_UNITAIRE AS prix_unitaire,
MAX(LFAC_COD_LPP) AS LFAC_COD_LPP,
0::bigint AS ucd_id,
0::bigint AS lpp_id,
0 AS montant_facture,
0 as montant_facture_0,
0 as montant_facture_1,
0 as montant_facture_2,
0 as montant_facture_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,
MAX(CASE WHEN FACD_ID_ORGA_AMO = 0 AND FACD_ID_ORGA_AMC = 0 THEN 100-LFAD_TAUX ELSE 0 END) as taux_0,
MAX(CASE WHEN FACD_ID_ORGA_AMO > 0 THEN LFAD_TAUX ELSE 0 END) as taux_1,
MAX(CASE WHEN FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC <> tiers_payant_22_orga_id THEN 100-LFAD_TAUX ELSE 0 END) as taux_2,
MAX(CASE WHEN FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC = tiers_payant_22_orga_id THEN 100-LFAD_TAUX ELSE 0 END) as taux_22,
SUM(LFAD_MTT_CRN) AS montant_comptabilise,
SUM(CASE WHEN FACD_ID_ORGA_AMO = 0 AND FACD_ID_ORGA_AMC = 0 THEN LFAD_MTT_CRN ELSE 0 END) as montant_comptabilise_0,
SUM(CASE WHEN FACD_ID_ORGA_AMO > 0 THEN LFAD_MTT_CRN ELSE 0 END) as montant_comptabilise_1,
SUM(CASE WHEN FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC <> tiers_payant_22_orga_id THEN LFAD_MTT_CRN ELSE 0 END) as montant_comptabilise_2,
SUM(CASE WHEN FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC = tiers_payant_22_orga_id THEN LFAD_MTT_CRN ELSE 0 END) as montant_comptabilise_22,
0::bigint AS rubrique_facture_id
FROM prod_hm.FAC_LIGNE_FACTURE
LEFT JOIN activite[PX].t_rubriques_facturation ON (LFAC_ID_PRHO::bigint = t_rubriques_facturation.code_original)
LEFT JOIN activite.t_prestations ON (LFAC_LET_CLE = t_prestations.code)
JOIN w_FAC_FACTURE ON LFAC_ID_FACT = FACT_ID_FACT
LEFT JOIN w_FAC_DATEVENTE ON (LECR_ID_FACT_VENT = FACT_ID_FACT)
JOIN prod_hm.FAC_LIGNE_FACTURE_DEBITEUR ON LFAC_ID_LFAC = LFAD_ID_LFAC
LEFT JOIN w_FAC_LIGNE_FACTURE_DEBITEUR_compte ON LECR_ID_LFAD = LFAD_ID_LFAD
LEFT JOIN activite[PX].t_compte ON (LECR_NUM_COMPTE = t_compte.code_original)
JOIN prod_hm.FAC_FACTURE_DEBITEUR ON LFAD_ID_FACD = FACD_ID_FACD
WHERE
SEJO_IND_BGH <> '1' AND
FACT_TYPE <> 'P' AND
LFAC_ID_PRHO <> 0 AND
LFAC_CDT_EXC = 'S' AND
CRN_HON_TO_SEJ <> '1' AND
LFAD_MTT_CRN <> 0
GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,15,16;
-- Public Honoraires -> Clinique
INSERT INTO w_FAC_FACTURE_LIGNE_C
SELECT
CASE WHEN FAC_HON = '1' THEN 2::integer ELSE 3::integer END AS origine_facturation_id,
LFAC_ID_LFAC,
FACT_NUM_FAC AS no_facture,
date(LFAC_DAT_EXE_DEB) AS date_debut,
date(LFAC_DAT_EXE_FIN) AS date_fin,
CASE WHEN FACT_TYPE <> 'P' AND w_FAC_DATEVENTE.date_vente IS NOT NULL THEN w_FAC_DATEVENTE.date_vente ELSE '20991231'::date END AS date_vente,
lieu_sortie_id,
LFAC_QTE_COEFFICIENT AS nb_rubrique,
LFAC_QTE_COEFFICIENT AS nb_prestation,
1 as coefficient,
LFAC_COE_MCO_HAD AS coefficient_mco,
COALESCE(t_rubriques_facturation.oid::bigint, 0) AS rubrique_facturation_id,
COALESCE(t_rubriques_facturation.oid::bigint, 0) AS rubrique_comptabilisation_id,
MAX(COALESCE(t_compte.oid::bigint, 0)) AS compte_produit_id,
COALESCE(t_prestations.oid::bigint, 0) AS prestation_id,
LFAC_PRI_UNITAIRE AS prix_unitaire,
MAX(LFAC_COD_LPP) AS LFAC_COD_LPP,
0::bigint AS ucd_id,
0::bigint AS lpp_id,
SUM(CASE WHEN FAC_HON = '1' THEN LFAD_MTT_HOR_DEH + LFAD_MTT_DEH ELSE 0 END) AS montant_facture,
SUM(CASE WHEN FAC_HON = '1' AND FACD_ID_ORGA_AMO = 0 AND FACD_ID_ORGA_AMC = 0 THEN LFAD_MTT_HOR_DEH + LFAD_MTT_DEH ELSE 0 END) as montant_facture_0,
SUM(CASE WHEN FAC_HON = '1' AND FACD_ID_ORGA_AMO > 0 THEN LFAD_MTT_HOR_DEH + LFAD_MTT_DEH ELSE 0 END) as montant_facture_1,
SUM(CASE WHEN FAC_HON = '1' AND FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC <> tiers_payant_22_orga_id THEN LFAD_MTT_HOR_DEH + LFAD_MTT_DEH ELSE 0 END) as montant_facture_2,
SUM(CASE WHEN FAC_HON = '1' AND FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC = tiers_payant_22_orga_id THEN LFAD_MTT_HOR_DEH + LFAD_MTT_DEH ELSE 0 END) as montant_facture_22,
SUM(CASE WHEN FAC_HON <> '1' THEN LFAD_MTT_HOR_DEH + LFAD_MTT_DEH ELSE 0 END) AS montant_facture_actes_inclus_dans_sejour,
SUM(CASE WHEN FAC_HON <> '1' AND FACD_ID_ORGA_AMO = 0 AND FACD_ID_ORGA_AMC = 0 THEN LFAD_MTT_HOR_DEH + LFAD_MTT_DEH ELSE 0 END) as montant_facture_0_actes_inclus_dans_sejour,
SUM(CASE WHEN FAC_HON <> '1' AND FACD_ID_ORGA_AMO > 0 THEN LFAD_MTT_HOR_DEH + LFAD_MTT_DEH ELSE 0 END) as montant_facture_1_actes_inclus_dans_sejour,
SUM(CASE WHEN FAC_HON <> '1' AND FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC <> tiers_payant_22_orga_id THEN LFAD_MTT_HOR_DEH + LFAD_MTT_DEH ELSE 0 END) as montant_facture_2_actes_inclus_dans_sejour,
SUM(CASE WHEN FAC_HON <> '1' AND FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC = tiers_payant_22_orga_id THEN LFAD_MTT_HOR_DEH + LFAD_MTT_DEH ELSE 0 END) as montant_facture_22_actes_inclus_dans_sejour,
MAX(CASE WHEN FACD_ID_ORGA_AMO = 0 AND FACD_ID_ORGA_AMC = 0 THEN 100-LFAD_TAUX ELSE 0 END) as taux_0,
MAX(CASE WHEN FACD_ID_ORGA_AMO > 0 THEN LFAD_TAUX ELSE 0 END) as taux_1,
MAX(CASE WHEN FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC <> tiers_payant_22_orga_id THEN 100-LFAD_TAUX ELSE 0 END) as taux_2,
MAX(CASE WHEN FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC = tiers_payant_22_orga_id THEN 100-LFAD_TAUX ELSE 0 END) as taux_22,
SUM(LFAD_MTT_CRN) AS montant_comptabilise,
SUM(CASE WHEN FACD_ID_ORGA_AMO = 0 AND FACD_ID_ORGA_AMC = 0 THEN LFAD_MTT_CRN ELSE 0 END) as montant_comptabilise_0,
SUM(CASE WHEN FACD_ID_ORGA_AMO > 0 THEN LFAD_MTT_CRN ELSE 0 END) as montant_comptabilise_1,
SUM(CASE WHEN FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC <> tiers_payant_22_orga_id THEN LFAD_MTT_CRN ELSE 0 END) as montant_comptabilise_2,
SUM(CASE WHEN FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC = tiers_payant_22_orga_id THEN LFAD_MTT_CRN ELSE 0 END) as montant_comptabilise_22,
0::bigint AS rubrique_facture_id
FROM prod_hm.FAC_LIGNE_FACTURE
LEFT JOIN activite[PX].t_rubriques_facturation ON (LFAC_ID_PRHO::bigint = t_rubriques_facturation.code_original)
LEFT JOIN activite.t_prestations ON (LFAC_LET_CLE = t_prestations.code)
JOIN w_FAC_FACTURE ON LFAC_ID_FACT = FACT_ID_FACT
LEFT JOIN w_FAC_DATEVENTE ON (LECR_ID_FACT_VENT = FACT_ID_FACT)
JOIN prod_hm.FAC_LIGNE_FACTURE_DEBITEUR ON LFAC_ID_LFAC = LFAD_ID_LFAC
LEFT JOIN w_FAC_LIGNE_FACTURE_DEBITEUR_compte ON LECR_ID_LFAD = LFAD_ID_LFAD
LEFT JOIN activite[PX].t_compte ON (LECR_NUM_COMPTE = t_compte.code_original)
JOIN prod_hm.FAC_FACTURE_DEBITEUR ON LFAD_ID_FACD = FACD_ID_FACD
WHERE
'[ENV_TYPEETS]' IN ('2','3') AND
FACT_TYPE <> 'P' AND
LFAC_ID_PRHO <> 0 AND
CRN_HON_TO_SEJ = '1'
GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,15,16;
UPDATE w_FAC_FACTURE_LIGNE_C
SET lpp_id = t_lpp.oid
FROM base.t_lpp
WHERE LFAC_COD_LPP = t_lpp.code
;
UPDATE w_FAC_FACTURE_LIGNE_C
SET ucd_id = t_ucd.oid
FROM prod_hm.FAC_LIGNE_FACTURE_UCD
JOIN base.t_ucd ON LFUC_COD_UCD = t_ucd.code
WHERE LFAC_ID_LFAC = LFUC_ID_LFAC
;
-- Rubriques internes cti
SELECT activite[PX].cti_reorganize_rubrique_facture_c('w_FAC_FACTURE_LIGNE_C');
-- lignes clinique
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_c_1');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_c_2');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_c_3');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_c_4');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_c_5');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_c_6');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_c_7');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_c_8');
INSERT INTO activite[PX].p_factures_lignes_c(
no_facture,
date_debut,
date_fin,
nb_rubrique,
nb_prestation,
coefficient,
coefficient_mco,
rubrique_facture_id,
rubrique_facturation_id,
rubrique_comptabilisation_id,
compte_produit_id,
prestation_id,
ucd_id,
lpp_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,
origine_facturation_id,
montant_facture_actes_inclus_dans_sejour,
montant_facture_0_actes_inclus_dans_sejour,
montant_facture_1_actes_inclus_dans_sejour,
montant_facture_2_actes_inclus_dans_sejour,
montant_facture_22_actes_inclus_dans_sejour)
SELECT
no_facture,
date_debut,
date_fin,
nb_rubrique,
nb_prestations,
coefficient,
coefficient_mco,
rubrique_facture_id,
rubrique_facturation_id,
rubrique_comptabilisation_id,
compte_produit_id,
prestation_id,
ucd_id,
lpp_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_sortie_id,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
0,
0,
0,
0,
0,
origine_facturation_id,
montant_facture_actes_inclus_dans_sejour,
montant_facture_0_actes_inclus_dans_sejour,
montant_facture_1_actes_inclus_dans_sejour,
montant_facture_2_actes_inclus_dans_sejour,
montant_facture_22_actes_inclus_dans_sejour
FROM w_FAC_FACTURE_LIGNE_C;
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_c_1');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_c_2');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_c_3');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_c_4');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_c_5');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_c_6');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_c_7');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_c_8');
UPDATE activite[PX].p_factures_lignes_c
SET nb_prestation = coefficient * nb_prestation,
nb_rubrique = coefficient * nb_prestation,
coefficient = 1
FROM activite.t_prestations
WHERE prestation_id = t_prestations.oid AND
coefficient > 1 AND
(
prestation_id IN (SELECT oid FROM activite.t_prestations WHERE code IN ('PJ', 'PJ1', 'PJ2', 'FJ', 'PHJ', 'SSM', 'SRC', 'REA', 'STF', 'NN1', 'NN2', 'NN3', 'CP', 'CPC', 'SHO'))
OR
type_ventilation_jour = '1'
);
-- 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,
CASE WHEN p_sejours.type_sejour <> '5' THEN date(p_sejours.date_entree) ELSE p_factures_lignes_c.date_debut END AS date_debut_ghs,
CASE WHEN p_sejours.type_sejour <> '5' THEN date(p_sejours.date_sortie - interval '1 day') ELSE p_factures_lignes_c.date_fin END 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 type_sejour = '5' THEN p_factures_lignes_c.date_debut 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 type_sejour = '5' THEN p_factures_lignes_c.date_fin 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 type_sejour <> '5' AND 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
JOIN activite.t_prestations ON prestation_id = t_prestations.oid AND
(
code IN ('PJ', 'PJ1', 'PJ2', '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 (type_sejour <> '5' AND 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
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,
rubrique_comptabilisation_id,
compte_produit_id,
prestation_id,
ucd_id,
lpp_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,
round(montant_encours / ABS(nb_det),2) AS montant_encours,
round(montant_encours_0 / ABS(nb_det),2) AS montant_encours_0,
round(montant_encours_1 / ABS(nb_det),2) AS montant_encours_1,
round(montant_encours_2 / ABS(nb_det),2) AS montant_encours_2,
round(montant_encours_22 / ABS(nb_det),2) AS montant_encours_22,
round(montant_facture_actes_inclus_dans_sejour / ABS(nb_det),2) AS montant_facture_actes_inclus_dans_sejour,
round(montant_facture_0_actes_inclus_dans_sejour / ABS(nb_det),2) AS montant_facture_0_actes_inclus_dans_sejour,
round(montant_facture_1_actes_inclus_dans_sejour / ABS(nb_det),2) AS montant_facture_1_actes_inclus_dans_sejour,
round(montant_facture_2_actes_inclus_dans_sejour / ABS(nb_det),2) AS montant_facture_2_actes_inclus_dans_sejour,
round(montant_facture_22_actes_inclus_dans_sejour / ABS(nb_det),2) AS montant_facture_22_actes_inclus_dans_sejour,
origine_facturation_id,
round(montant_comptabilise_budget_global_1 / ABS(nb_det),2) AS montant_comptabilise_budget_global_1,
facture_id
FROM w_factures_lignes_sup_c
JOIN base.p_calendrier ON p_calendrier.date BETWEEN date_debut_det AND date_fin_det
;
DROP TABLE IF EXISTS w_factures_lignes_sup_c_sup_tot;
CREATE TEMP TABLE w_factures_lignes_sup_c_sup_tot AS
SELECT 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;
-- Rubriques internes cti
SELECT activite[PX].cti_reorganize_rubrique_facture_c('w_factures_lignes_sup_c_sup');
INSERT INTO activite[PX].p_factures_lignes_c(
no_facture,
date_debut,
date_fin,
nb_rubrique,
coefficient,
coefficient_mco,
rubrique_facture_id,
rubrique_facturation_id,
rubrique_comptabilisation_id,
compte_produit_id,
prestation_id,
ucd_id,
lpp_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,
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_facture_id,
rubrique_facturation_id,
rubrique_comptabilisation_id,
compte_produit_id,
prestation_id,
ucd_id,
lpp_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,
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;
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
activite[PX].p_factures_lignes_c.date_debut = p_mouvements_sejour.date AND
(p_mouvements_sejour.heure_fin = 240000 OR p_mouvements_sejour.nb_sorties_directes = 1) AND
p_factures_lignes_c.lieu_id <> p_mouvements_sejour.lieu_id;
DROP TABLE IF EXISTS w_actes_inclus_dans_sejour;
CREATE TEMP TABLE w_actes_inclus_dans_sejour AS
SELECT FACT_NUM_FAC_SEJ AS no_facture,
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
FROM activite[PX].p_factures_lignes_c JOIN w_FAC_FACTURE ON no_facture = FACT_NUM_FAC
WHERE
'[ENV_TYPEETS]' IN ('2','3') AND
montant_facture_actes_inclus_dans_sejour <> 0 AND
origine_facturation_id = 3
GROUP BY 1;
DROP TABLE IF EXISTS w_ghs_pj;
CREATE TEMP TABLE w_ghs_pj AS
SELECT p_factures_lignes_c.no_facture,
p_sejours.no_sejour,
p_sejours.est_budget_global,
MIN(p_factures_lignes_c.ctid) AS ctid_min
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
'[ENV_TYPEETS]' IN ('2','3') AND
origine_facturation_id = 1 AND
(
prestation_id IN (SELECT oid FROM activite.t_prestations where code IN ('PJ', 'PJ1', 'PJ2', 'GHS', 'AMP5')) OR
rubrique_facturation_id IN (SELECT oid FROM activite[PX].t_rubriques_facturation where actes_inclus_public = '1')
)
GROUP BY 1,2,3;
UPDATE activite[PX].p_factures_lignes_c
SET
montant_facture_actes_inclus_dans_sejour = 0 - w_actes_inclus_dans_sejour.montant_facture_actes_inclus_dans_sejour,
montant_facture_0_actes_inclus_dans_sejour = 0 - w_actes_inclus_dans_sejour.montant_facture_0_actes_inclus_dans_sejour,
montant_facture_1_actes_inclus_dans_sejour = 0 - w_actes_inclus_dans_sejour.montant_facture_1_actes_inclus_dans_sejour,
montant_facture_2_actes_inclus_dans_sejour = 0 - w_actes_inclus_dans_sejour.montant_facture_2_actes_inclus_dans_sejour,
montant_facture_22_actes_inclus_dans_sejour = 0 - w_actes_inclus_dans_sejour.montant_facture_22_actes_inclus_dans_sejour
FROM w_actes_inclus_dans_sejour, w_ghs_pj
WHERE
'[ENV_TYPEETS]' IN ('2','3') AND
p_factures_lignes_c.no_facture = w_ghs_pj.no_facture AND p_factures_lignes_c.ctid = w_ghs_pj.ctid_min AND
w_actes_inclus_dans_sejour.no_facture = p_factures_lignes_c.no_facture AND
(
prestation_id IN (SELECT oid FROM activite.t_prestations where code IN ('PJ', 'GHS', 'AMP5')) OR
rubrique_facturation_id IN (SELECT oid FROM activite[PX].t_rubriques_facturation where actes_inclus_public = '1')
);
DROP TABLE IF EXISTS w_actes_inclus_dans_sejour_t;
CREATE TEMP TABLE w_actes_inclus_dans_sejour_t AS
SELECT no_facture,
SUM(CASE WHEN origine_facturation_id = 1 THEN montant_facture_actes_inclus_dans_sejour ELSE 0 END) AS montant_facture_c_actes_inclus_dans_sejour,
SUM(CASE WHEN origine_facturation_id = 3 THEN montant_facture_actes_inclus_dans_sejour ELSE 0 END) AS montant_facture_h_actes_inclus_dans_sejour
FROM activite[PX].p_factures_lignes_c
WHERE
'[ENV_TYPEETS]' IN ('2','3') AND
montant_facture_actes_inclus_dans_sejour <> 0
GROUP BY 1;
UPDATE activite[PX].p_factures SET
montant_facture_c_actes_inclus_dans_sejour = w_actes_inclus_dans_sejour_t.montant_facture_c_actes_inclus_dans_sejour,
montant_facture_h_actes_inclus_dans_sejour = w_actes_inclus_dans_sejour_t.montant_facture_h_actes_inclus_dans_sejour
FROM w_actes_inclus_dans_sejour_t
WHERE
'[ENV_TYPEETS]' IN ('2','3') AND
w_actes_inclus_dans_sejour_t.no_facture = p_factures.no_facture;
-- Suppression des tables de travail non utilisées après
DROP TABLE IF EXISTS w_factures_lignes_sup_c CASCADE;
DROP TABLE IF EXISTS w_factures_lignes_sup_c_sup_tot CASCADE;
DROP TABLE IF EXISTS w_factures_lignes_sup_c_sup CASCADE;
DROP TABLE IF EXISTS w_actes_inclus_dans_sejour CASCADE;
DROP TABLE IF EXISTS w_ghs_pj CASCADE;
DROP TABLE IF EXISTS w_actes_inclus_dans_sejour_t CASCADE;
]]></sqlcmd>
</NODE>
<NODE label="Budget global MCO">
<condition><![CDATA[
"[ENV_TYPEETS]" != "1" && "[ENV_WITHPMSI]" == "1"
]]></condition>
<sqlcmd><![CDATA[
SELECT activite[PX].cti_reorganize_sejour_pmsi()
;
-- Montants depuis PMSI
-- Mise à jour date début PMSI pour EXH
UPDATE pmsi.p_rsf_detail
SET date_debut = date_debut_new
FROM
(
SELECT rss_id, prestation_id, date_debut, date_fin, nombre, date(date_sortie - (nombre||' days')::interval) AS date_debut_new
FROM pmsi.p_rsf_detail
JOIN pmsi.t_prestations on prestation_id = t_prestations.oid
JOIN pmsi.p_rss ON rss_id = p_rss.oid
WHERE t_prestations.code = 'EXH' AND
date_debut = date_entree AND
date(date_sortie - (nombre||' days')::interval) > date_entree
) subview
WHERE p_rsf_detail.rss_id = subview.rss_id AND
p_rsf_detail.prestation_id = subview.prestation_id AND
p_rsf_detail.date_debut = subview.date_debut AND
p_rsf_detail.date_fin = subview.date_fin AND
p_rsf_detail.nombre = subview.nombre
;
UPDATE pmsi.p_rss
SET no_sejour_administratif =
CASE WHEN SEJO_DAT_SUP IS NULL AND
SEJO_IND_INCOMPLET IS DISTINCT FROM '1' AND
p_rss.date_sortie = date(SEJO_DAT_FIN)
THEN sejo_num_sej ELSE no_sejour_administratif END
FROM prod_hm.pms_rss
JOIN w_IDE_SEJOUR_complet ON trss_id_sejo_d = sejo_id_sejo
WHERE p_rss.no_rss = TRSS_NUMERO AND ghm_id <> 0 AND
no_sejour_administratif IS DISTINCT FROM
CASE WHEN SEJO_DAT_SUP IS NULL AND
SEJO_IND_INCOMPLET IS DISTINCT FROM '1' AND
p_rss.date_sortie = date(SEJO_DAT_FIN)
THEN sejo_num_sej ELSE no_sejour_administratif END
;
UPDATE pmsi.p_rss
SET no_sejour_administratif = SEJO_NUM_SEJ
FROM w_IDE_SEJOUR_complet
WHERE p_rss.date_entree = date(SEJO_DAT_DEB) AND p_rss.date_sortie = date(SEJO_DAT_FIN) AND
SEJO_NUM_SEJ LIKE '%' || no_sejour_administratif AND SEJO_DAT_SUP IS NULL AND SEJO_IND_INCOMPLET IS DISTINCT FROM '1' AND
no_sejour_administratif IS DISTINCT FROM SEJO_NUM_SEJ
;
DROP TABLE IF EXISTS w_factures_lignes_bg;
CREATE TEMP TABLE w_factures_lignes_bg AS
SELECT
trim(p_rss.no_sejour_administratif) AS no_sejour_administratif,
p_rss.date_sortie AS date_sortie_pmsi,
p_rss.date_entree AS date_entree_pmsi,
p_rss.date_naissance AS date_naissance_pmsi,
NULL::text AS no_sejour,
NULL::text AS no_facture,
NULL::bigint AS lieu_id,
NULL::date AS date_debut_facture,
NULL::date AS date_fin_facture,
NULL::date AS date_sortie,
NULL::bigint AS tiers_payant_0_id,
NULL::bigint AS tiers_payant_1_id,
0 AS tiers_payant_2_id,
0 AS tiers_payant_22_id,
NULL::bigint AS ghs_id,
NULL::bigint AS ghs_bebe1_id,
NULL::bigint AS ghs_bebe2_id,
NULL::bigint AS ghs_bebe3_id,
p_rsf_detail.date_debut AS date_debut,
p_rsf_detail.date_fin AS date_fin,
trim(replace(replace(t_prestations_pmsi.code, ' F', ''), ' N', '')) AS prestation_code,
p_rsf_detail.nombre,
p_rsf_detail.coefficient,
p_rsf_detail.coefficient_mco,
p_rsf_detail.prix_unitaire,
p_rsf_detail.taux_remboursement,
round(p_rsf_detail.sejour_remboursable,2) AS montant_comptabilise_budget_global_c
FROM pmsi.p_rss
JOIN pmsi.p_rsf_detail ON p_rss.oid = p_rsf_detail.rss_id
JOIN activite.t_divers ON t_divers.code = 'EXCLUSIONPRESTATIONPMSI'
JOIN pmsi.t_prestations t_prestations_pmsi ON prestation_id = t_prestations_pmsi.oid AND t_prestations_pmsi.code != ALL(string_to_array(replace(replace(t_divers.valeur,' ',''), '-', ' '),','))
JOIN base.t_finess ON p_rss.finess = t_finess.code AND t_finess.type_etablissement IN ('2','3')
WHERE p_rss.traitement_epmsi IN ('30','31','32','33') AND
en_cours = '0' AND
p_rss.etat = ''AND
p_rss.date_sortie >= '[ENV_ADM_ANNEEDEBUT]0101' AND
fides_detail <> 1 AND
p_rsf_detail.est_ligne_rss = '1'
;
ANALYSE w_factures_lignes_bg
;
CREATE INDEX i_w_factures_lignes_bg_1
ON w_factures_lignes_bg
USING btree
(no_sejour_administratif);
UPDATE w_factures_lignes_bg SET
no_sejour = p_sejours.no_sejour
FROM activite[PX].p_sejours
JOIN activite[PX].p_patients ON p_sejours.no_patient = p_patients.no_patient
WHERE no_sejour_administratif = p_sejours.no_sejour AND
date_trunc('month',date_sortie_pmsi) = date_trunc('month',p_sejours.date_sortie)AND
date_naissance_pmsi = p_patients.date_naissance
;
CREATE INDEX i_w_factures_lignes_bg_2
ON w_factures_lignes_bg
USING btree
(no_sejour);
UPDATE w_factures_lignes_bg SET
no_sejour = p_sejours.no_sejour
FROM activite[PX].p_sejours
WHERE no_sejour_administratif = p_sejours.no_sejour AND
date_trunc('month',date_sortie_pmsi) = date_trunc('month',p_sejours.date_sortie) AND
w_factures_lignes_bg.no_sejour IS NULL
;
UPDATE w_factures_lignes_bg SET
no_sejour = p_sejours.no_sejour
FROM activite[PX].p_sejours
WHERE no_sejour_administratif = substr(p_sejours.no_sejour,2) AND
date_trunc('month',date_sortie_pmsi) = date_trunc('month',p_sejours.date_sortie) AND
w_factures_lignes_bg.no_sejour IS NULL
;
UPDATE w_factures_lignes_bg SET
no_sejour = p_sejours.no_sejour
FROM activite[PX].p_sejours
WHERE no_sejour_administratif = p_sejours.no_sejour AND
date_entree_pmsi = date_entree AND
w_factures_lignes_bg.no_sejour IS NULL
;
UPDATE w_factures_lignes_bg SET
no_sejour = p_sejours.no_sejour
FROM activite[PX].p_sejours
WHERE no_sejour_administratif = substr(p_sejours.no_sejour,2) AND
date_entree_pmsi= date_entree AND
w_factures_lignes_bg.no_sejour IS NULL
;
UPDATE w_factures_lignes_bg SET
no_sejour = p_sejours.no_sejour
FROM activite[PX].p_sejours
JOIN activite[PX].p_patients ON p_sejours.no_patient = p_patients.no_patient
WHERE no_sejour_administratif = substr(p_sejours.no_sejour,2) AND
date_naissance_pmsi = p_patients.date_naissance AND
w_factures_lignes_bg.no_sejour IS NULL
;
UPDATE w_factures_lignes_bg SET
no_sejour = p_sejours.no_sejour
FROM activite[PX].p_sejours
WHERE no_sejour_administratif = substr(p_sejours.no_sejour,2) AND
w_factures_lignes_bg.no_sejour IS NULL
;
UPDATE w_factures_lignes_bg
SET no_sejour = p_sejours.no_sejour
FROM activite[PX].p_sejours
WHERE no_sejour_administratif = p_sejours.no_sejour
AND w_factures_lignes_bg.no_sejour IS NULL
;
UPDATE w_factures_lignes_bg SET
no_facture = w_factures_lignes_bg.no_sejour || '.BG',
lieu_id = p_sejours.lieu_sortie_id,
date_debut_facture = p_sejours.date_entree,
date_fin_facture = p_sejours.date_sortie,
date_sortie = p_sejours.date_sortie,
tiers_payant_0_id = p_sejours.tiers_payant_0_id,
tiers_payant_1_id = p_sejours.tiers_payant_1_id,
ghs_id = p_sejours.ghs_id,
ghs_bebe1_id = p_sejours.ghs_bebe1_id,
ghs_bebe2_id = p_sejours.ghs_bebe2_id,
ghs_bebe3_id = p_sejours.ghs_bebe3_id
FROM activite[PX].p_sejours
WHERE w_factures_lignes_bg.no_sejour = p_sejours.no_sejour
;
DELETE FROM w_factures_lignes_bg
WHERE no_sejour IS NULL
;
ANALYSE w_factures_lignes_bg
;
UPDATE w_factures_lignes_bg
SET lieu_id = p_mouvements_sejour.lieu_id
FROM activite[PX].p_mouvements_sejour
WHERE
w_factures_lignes_bg.no_sejour = p_mouvements_sejour.no_sejour AND
w_factures_lignes_bg.date_debut = p_mouvements_sejour.date AND
(p_mouvements_sejour.heure_fin = 240000 OR p_mouvements_sejour.nb_sorties_directes = 1) AND
w_factures_lignes_bg.lieu_id <> p_mouvements_sejour.lieu_id
;
INSERT INTO activite[PX].p_factures(
no_sejour,
no_facture,
no_facture_reference,
date_debut,
date_fin,
type_facture,
code_facture,
date_facture,
code_vente,
date_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_0_id,
tiers_payant_1_id,
tiers_payant_2_id,
tiers_payant_22_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,
code_cloture,
code_cp_demandee,
ghs_bebe1_id,
ghs_bebe2_id,
ghs_bebe3_id,
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,
nb_rejets,
montant_facture_c_actes_inclus_dans_sejour,
montant_facture_h_actes_inclus_dans_sejour,
montant_comptabilise_budget_global_c
)
SELECT
no_sejour,
no_facture,
no_facture,
date_debut_facture AS date_debut,
date_fin_facture AS date_fin,
'G' AS type_facture,
'1' AS code_facture,
date_sortie AS date_facture,
'1' AS code_vente,
date_sortie AS date_vente,
extract('year' FROM date_sortie) * 100 + extract('month' FROM date_sortie),
date_sortie AS date_solde,
SUM(montant_comptabilise_budget_global_c) AS montant_facture_c,
0 AS montant_facture_h,
0 AS montant_regle_c,
0 AS montant_regle_h,
0 AS delai_facture,
0 AS delai_solde,
date_sortie AS date_expedition,
0 AS delai_expedition,
tiers_payant_0_id,
tiers_payant_1_id,
tiers_payant_2_id,
tiers_payant_22_id,
date_sortie AS date_solde_0_c,
date_sortie AS date_solde_0_h,
date_sortie AS date_solde_1_c,
date_sortie AS date_solde_1_h,
date_sortie AS date_solde_2_c,
date_sortie AS date_solde_2_h,
date_sortie AS date_solde_22_c,
date_sortie AS date_solde_22_h,
date_sortie AS date_expedition_0,
date_sortie AS date_expedition_1,
date_sortie AS date_expedition_2,
date_sortie AS date_expedition_22,
'1' AS code_expedie_0,
'1' AS code_expedie_1,
'1' AS code_expedie_2,
'1' AS code_expedie_22,
'' AS no_bordereau_0,
'' AS no_bordereau_1,
'' AS no_bordereau_2,
'' AS no_bordereau_22,
0 AS montant_facture_0_c,
0 AS montant_facture_0_h,
SUM(montant_comptabilise_budget_global_c) AS montant_facture_1_c,
0 AS montant_facture_1_h,
0 AS montant_facture_2_c,
0 AS montant_facture_2_h,
0 AS montant_facture_22_c,
0 AS montant_facture_22_h,
0 AS montant_regle_0_c,
0 AS montant_regle_0_h,
0 AS montant_regle_1_c,
0 AS montant_regle_1_h,
0 AS montant_regle_2_c,
0 AS montant_regle_2_h,
0 AS montant_regle_22_c,
0 AS montant_regle_22_h,
0 AS delai_expedition_0,
0 AS delai_expedition_1,
0 AS delai_expedition_2,
0 AS delai_expedition_22,
0 AS delai_solde_0_c,
0 AS delai_solde_0_h,
0 AS delai_solde_1_c,
0 AS delai_solde_1_h,
0 AS delai_solde_2_c,
0 AS delai_solde_2_h,
0 AS delai_solde_22_c,
0 AS delai_solde_22_h,
ghs_id AS ghs_id,
'' AS particularite_t2a,
'' AS code_cloture,
'0' AS code_cp_demandee,
ghs_bebe1_id,
ghs_bebe2_id,
ghs_bebe3_id,
0 AS montant_comptabilise_c,
0 AS montant_comptabilise_h,
0 AS montant_comptabilise_0_c,
0 AS montant_comptabilise_0_h,
0 AS montant_comptabilise_1_c,
0 AS montant_comptabilise_1_h,
0 AS montant_comptabilise_2_c,
0 AS montant_comptabilise_2_h,
0 AS montant_comptabilise_22_c,
0 AS montant_comptabilise_22_h,
0 AS nb_rejets,
0 AS montant_facture_c_actes_inclus_dans_sejour,
0 AS montant_facture_h_actes_inclus_dans_sejour,
SUM(montant_comptabilise_budget_global_c)
FROM w_factures_lignes_bg
GROUP BY no_sejour,
no_facture,
date_debut_facture,
date_fin_facture,
date_sortie,
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
;
INSERT INTO activite.t_prestations(code, code_original, texte, texte_court)
SELECT prestation_code, prestation_code, prestation_code, prestation_code
FROM w_factures_lignes_bg
LEFT JOIN activite.t_prestations ON prestation_code = t_prestations.code
WHERE t_prestations.code IS NULL
GROUP BY prestation_code
;
UPDATE activite[PX].t_rubriques_facturation
SET code = PRSE_CODE,
texte = PRSE_LIBELLE,
texte_court = PRSE_LIBELLE
FROM prod_hm.PAD_PRESTATION_SEJOUR
WHERE PRSE_ID_PRSE::bigint = code_original
;
INSERT INTO activite[PX].t_rubriques_facturation(code, code_original, texte, texte_court)
SELECT prestation_code, prestation_code, prestation_code, prestation_code
FROM w_factures_lignes_bg
LEFT JOIN activite[PX].t_rubriques_facturation ON prestation_code = t_rubriques_facturation.code
WHERE t_rubriques_facturation.code IS NULL
GROUP BY prestation_code
;
DROP TABLE IF EXISTS w_rubriques_bg;
CREATE TEMP TABLE w_rubriques_bg AS
SELECT code, (MIN(ARRAY[CASE WHEN code <> code_original THEN 0 ELSE 1 END, oid]))[2]::bigint AS oid
FROM activite.t_rubriques_facturation
WHERE EXISTS (SELECT prestation_code FROM w_factures_lignes_bg WHERE w_factures_lignes_bg.prestation_code = t_rubriques_facturation.code)
GROUP BY 1
;
ANALYSE w_rubriques_bg
;
INSERT INTO activite[PX].p_factures_lignes_c(
no_facture,
date_debut,
date_fin,
nb_rubrique,
nb_prestation,
coefficient,
coefficient_mco,
rubrique_facturation_id,
rubrique_comptabilisation_id,
compte_produit_id,
prestation_id,
montant_facture,
montant_facture_0,
montant_facture_1,
montant_facture_2,
montant_facture_22,
taux_0,
taux_1,
taux_2,
taux_22,
prix_unitaire,
lieu_id,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
montant_encours,
montant_encours_0,
montant_encours_1,
montant_encours_2,
montant_encours_22,
origine_facturation_id,
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)
SELECT
no_facture,
date_debut,
date_fin,
nombre AS nb_rubrique,
nombre AS nb_prestation,
coefficient AS coefficient,
coefficient_mco AS coefficient_mco,
COALESCE(w_rubriques_bg.oid,0) AS rubrique_facturation_id,
COALESCE(w_rubriques_bg.oid,0) AS rubrique_comptabilisation_id,
0::bigint AS compte_produit_id,
COALESCE(t_prestations.oid,0) AS prestation_id,
montant_comptabilise_budget_global_c AS montant_facture,
0 AS montant_facture_0,
montant_comptabilise_budget_global_c AS montant_facture_1,
0 AS montant_facture_2,
0 AS montant_facture_22,
0 AS taux_0,
taux_remboursement AS taux_1,
0 AS taux_2,
0 AS taux_22,
prix_unitaire,
lieu_id,
0 AS montant_comptabilise,
0 AS montant_comptabilise_0,
0 AS montant_comptabilise_1,
0 AS montant_comptabilise_2,
0 AS montant_comptabilise_22,
0 AS montant_encours,
0 AS montant_encours_0,
0 AS montant_encours_1,
0 AS montant_encours_2,
0 AS montant_encours_22,
1 AS origine_facturation_id,
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,
montant_comptabilise_budget_global_c AS montant_comptabilise_budget_global_1
FROM w_factures_lignes_bg
LEFT JOIN activite.t_prestations ON prestation_code = t_prestations.code
LEFT JOIN w_rubriques_bg ON prestation_code = w_rubriques_bg.code
;
DROP TABLE IF EXISTS w_factures_ventes_bg;
CREATE TEMP TABLE w_factures_ventes_bg AS
SELECT no_sejour, date_debut, date_fin, MAX(date_vente) AS date_vente
FROM activite[PX].p_factures
WHERE montant_comptabilise_budget_global_c <> 0
GROUP BY 1,2,3;
CREATE INDEX i_factures_ventes_bg_1
ON w_factures_ventes_bg
USING btree
(no_sejour);
UPDATE activite[PX].p_factures
SET date_vente= w_factures_ventes_bg.date_vente
FROM w_factures_ventes_bg
WHERE p_factures.date_vente = '20991231' AND
p_factures.code_facture = '1' AND
p_factures.no_sejour = w_factures_ventes_bg.no_sejour AND
p_factures.date_fin BETWEEN w_factures_ventes_bg.date_debut AND w_factures_ventes_bg.date_fin
;
DROP TABLE IF EXISTS w_factures_ventes_bg CASCADE
;
DROP TABLE IF EXISTS w_factures_lignes_bg CASCADE
;
-- RAZ montants facturé TP1 sur budget global (générés à tord par HM)
UPDATE activite[PX].p_factures_lignes_c
SET montant_facture = montant_facture - montant_facture_1,
montant_facture_1 = 0,
taux_1 = 0
FROM prod_hm.FAC_FACTURE
WHERE p_factures_lignes_c.no_facture = FACT_NUM_FAC AND
montant_facture_1 <> 0 AND
montant_comptabilise_1 = 0 AND
p_factures_lignes_c.no_facture NOT LIKE '%BG%' AND
FACT_TYP_BGH = 'B'
;
UPDATE activite[PX].p_factures
SET montant_facture_c = p_factures.montant_facture_c - p_factures.montant_facture_1_c,
montant_facture_1_c = 0
FROM prod_hm.FAC_FACTURE
WHERE p_factures.no_facture = FACT_NUM_FAC AND
p_factures.montant_facture_1_c <> 0 AND
p_factures.montant_comptabilise_1_c = 0 AND
p_factures.no_facture NOT LIKE '%BG%' AND
FACT_TYP_BGH = 'B'
;
-- En cours PMSI public
INSERT INTO activite[PX].p_factures(
sejour_id,
no_sejour,
no_facture,
no_facture_reference,
date_debut,
date_fin,
type_facture,
code_facture,
date_facture,
tiers_payant_0_id,
tiers_payant_1_id,
tiers_payant_2_id,
tiers_payant_22_id,
ghs_id,
ghs_bebe1_id,
ghs_bebe2_id,
ghs_bebe3_id)
SELECT
p_sejours.oid,
p_sejours.no_sejour,
MAX(p_sejours.no_sejour || '.BG'),
MAX(p_sejours.no_sejour || '.BG'),
MAX(p_sejours.date_entree),
MAX(p_sejours.date_sortie),
'0',
'0',
'20991231'::date,
MAX(p_sejours.tiers_payant_0_id),
MAX(p_sejours.tiers_payant_1_id),
MAX(p_sejours.tiers_payant_2_id),
MAX(p_sejours.tiers_payant_22_id),
MAX(p_sejours.ghs_id),
MAX(p_sejours.ghs_bebe1_id),
MAX(p_sejours.ghs_bebe2_id),
MAX(p_sejours.ghs_bebe3_id)
FROM pmsi.p_rss
JOIN base.t_finess ON p_rss.finess = t_finess.code AND t_finess.type_etablissement <> '1'
JOIN activite[PX].p_sejours on no_sejour_administratif = p_sejours.no_sejour AND p_sejours.est_budget_global = '1'
LEFT JOIN activite[PX].p_factures ON p_sejours.no_sejour = p_factures.no_sejour AND p_factures.no_facture LIKE '%BG'
WHERE p_rss.en_cours = '1' AND p_factures.no_facture IS NULL AND
p_sejours.type_sejour IN ('1','2','5','6')
GROUP BY 1,2;
-- Encours Externes BG avec facturation partielle SE, FFM, ATU
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
p_sejours.type_sejour IN ('3') AND
p_sejours.etat = '' AND
date_sortie between date(date_trunc('year',now() - interval '1 year')) AND now() AND
code_sorti = '1' AND
no_sejour NOT IN (SELECt no_sejour FROM activite[PX].p_factures where no_facture like '%BG') AND
no_sejour 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[PX].t_prestations ON prestation_id = t_prestations.oid
WHERE p_sejours.est_budget_global = '1' AND
code_facture = '1' AND
t_prestations.code IN ('SE1','SE2','SE3','SE4','ATU', 'FPU','FFM')
GROUP BY 1
HAVING SUM(nb_prestation) > 0 AND
round(base.cti_division(SUM(montant_facture_0+montant_facture_2),SUM(prix_unitaire*nb_prestation*coefficient*coefficient_mco)),2)<=0.21
)
;
-- Récupération des lignes SE,FFM,ATU facturées à 0 au patient et à la mutuelle pour encours BG
INSERT INTO activite[PX].p_factures_lignes_non_facturees_c(
no_facture,
date_debut,
date_fin,
nb_rubrique,
coefficient,
rubrique_facturation_id,
prestation_id,
prix_unitaire,
lieu_id,
coefficient_mco)
SELECT p_factures_bg.no_facture,
p_factures_bg.date_debut,
p_factures_bg.date_fin,
SUM(p_factures_lignes_c.nb_rubrique),
p_factures_lignes_c.coefficient,
p_factures_lignes_c.rubrique_facturation_id,
p_factures_lignes_c.prestation_id,
MAX(p_factures_lignes_c.prix_unitaire),
p_factures_lignes_c.lieu_id,
MAX(p_factures_lignes_c.coefficient_mco)
FROM activite[PX].p_factures_lignes_c
JOIN activite[PX].p_factures ON p_factures_lignes_c.no_facture = p_factures.no_facture
JOIN activite[PX].p_factures p_factures_bg ON
p_factures_bg.no_facture = p_factures.no_sejour || '.BG' AND
p_factures_bg.code_facture = '0'
JOIN activite[PX].p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
LEFT JOIN activite[PX].p_factures_lignes_non_facturees_c ON
p_factures_lignes_non_facturees_c.no_facture = p_factures_bg.no_facture AND
p_factures_lignes_non_facturees_c.prestation_id = t_prestations.oid
WHERE p_sejours.est_budget_global = '1' AND
p_factures.code_facture = '1' AND
t_prestations.code IN ('SE1','SE2','SE3','SE4','ATU', 'FPU','FFM') AND
p_factures_lignes_non_facturees_c.no_facture IS NULL
GROUP BY 1,2,3,5,6,7,9
HAVING SUM(nb_prestation) > 0
;
-- 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
p_sejours.type_sejour IN ('1','2','5') AND
type_t2a = '1' AND
date_sortie between date(date_trunc('year',now() - interval '1 year')) AND now() AND
code_sorti = '1' AND
no_sejour NOT IN (SELECt no_sejour FROm activite[PX].p_factures where no_facture like '%BG') AND
no_sejour NOT IN (
SELECT p_factures.no_sejour
FROM activite[PX].p_factures_lignes_c
JOIN activite[PX].p_factures ON p_factures_lignes_c.no_facture = p_factures.no_facture
JOIN activite[PX].p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
WHERE p_sejours.est_budget_global = '1' AND
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
);
-- Récupération lignes non facturées pour les factures BG
INSERT INTO activite[PX].p_factures_lignes_non_facturees_c(
no_facture,
date_debut,
date_fin,
nb_rubrique,
coefficient,
rubrique_facturation_id,
prestation_id,
prix_unitaire,
lieu_id)
SELECT
p_factures.no_facture,
date(LFAC_DAT_EXE_DEB) AS date_debut,
date(COALESCE(LFAC_DAT_EXE_FIN, LFAC_DAT_EXE_DEB)) AS date_fin,
MAX(LFAC_QTE_COEFFICIENT) AS nb_rubrique,
1 AS coefficient,
MAX(t_rubriques_facturation.oid) AS rubrique_facturation_id,
MAX(t_prestations.oid) AS prestation_id,
CASE
WHEN MIN(LFAD_IND_BGH) = '1' THEN MAX(LFAC_PRI_UNITAIRE)
ELSE base.cti_division(SUM(CASE WHEN LFAD_IND_BGH = '1' THEN LFAD_MTT_HOR_DEH ELSE 0 END) , MAX(LFAC_QTE_COEFFICIENT)) END
AS prix_unitaire,
MAX(p_sejours.lieu_sortie_id) AS lieu_id
FROM prod_hm.FAC_LIGNE_FACTURE
JOIN prod_hm.FAC_FACTURE ON LFAC_ID_FACT = FACT_ID_FACT AND FACT_TYPE = 'P'
JOIN prod_hm.FAC_LIGNE_FACTURE_DEBITEUR ON LFAC_ID_LFAC = LFAD_ID_LFAC
JOIN activite[PX].p_sejours ON LFAC_ID_SEJO_D::bigint = p_sejours.code_original AND p_sejours.etat = ''
JOIN activite[PX].p_factures ON p_sejours.no_sejour = p_factures.no_sejour AND code_facture = '0' AND p_factures.no_facture LIKE '%BG'
JOIN activite[PX].t_rubriques_facturation ON LFAC_ID_PRSE::bigint = t_rubriques_facturation.code_original
JOIN activite.t_prestations ON LFAC_LET_CLE = t_prestations.code
LEFT JOIN activite[PX].p_factures_lignes_non_facturees_c ON
p_factures_lignes_non_facturees_c.no_facture = p_factures.no_facture AND
p_factures_lignes_non_facturees_c.prestation_id = t_prestations.oid
WHERE LFAC_LET_CLE NOT IN ('GHS','PJ') AND LFAC_ID_PRSE <> 0 AND
FACT_DAT_SUP IS NULL AND
date(LFAC_DAT_EXE_DEB) BETWEEN p_factures.date_debut AND p_factures.date_fin AND
p_factures_lignes_non_facturees_c.no_facture IS NULL
GROUP BY 1,2,3, LFAC_ID_LFAC
HAVING MIN(LFAD_IND_BGH) = '1'
;
-- Il peut y avoir des lignes en double avec la récupération standard
DELETE FROM activite[PX].p_factures_lignes_non_facturees_c
USING
(
SELECT no_sejour, prestation_id,
p_factures_lignes_non_facturees_c.date_debut,
p_factures_lignes_non_facturees_c.date_fin,
p_factures_lignes_non_facturees_c.prix_unitaire,
MAX(CASE WHEN p_factures.no_facture NOT LIKE '%.BG' THEN p_factures_lignes_non_facturees_c.no_facture ELSE NULL END) AS no_facture
FROm activite[PX].p_factures_lignes_non_facturees_c
JOIN activite[PX].p_factures ON p_factures_lignes_non_facturees_c.no_facture = p_factures.no_facture
GROUP BY 1,2,3,4,5
HAVING count(DISTINCT p_factures.no_facture) > 1 AND
MAX(CASE WHEN p_factures.no_facture LIKE '%.BG' THEN 1 ELSE 0 END) = 1 AND
MIN(CASE WHEN p_factures.no_facture LIKE '%.BG' THEN 1 ELSE 0 END) = 0
) subview
WHERE p_factures_lignes_non_facturees_c.no_facture = subview.no_facture AND
p_factures_lignes_non_facturees_c.prestation_id = subview.prestation_id AND
p_factures_lignes_non_facturees_c.date_debut = subview.date_debut AND
p_factures_lignes_non_facturees_c.date_fin = subview.date_fin AND
p_factures_lignes_non_facturees_c.prix_unitaire = subview.prix_unitaire
;
-- Il peut y avoir des lignes en double avec la récupération standard
DELETE FROM activite[PX].p_factures_lignes_non_facturees_c
USING
(
SELECT no_sejour, prestation_id,
p_factures_lignes_non_facturees_c.date_debut,
p_factures_lignes_non_facturees_c.date_fin,
p_factures_lignes_non_facturees_c.prix_unitaire,
MAX(CASE WHEN p_factures.no_facture NOT LIKE '%.BG' THEN p_factures_lignes_non_facturees_c.no_facture ELSE NULL END) AS no_facture
FROm activite[PX].p_factures_lignes_non_facturees_c
JOIN activite[PX].p_factures ON p_factures_lignes_non_facturees_c.no_facture = p_factures.no_facture
GROUP BY 1,2,3,4,5
HAVING count(DISTINCT p_factures.no_facture) > 1 AND
MAX(CASE WHEN p_factures.no_facture LIKE '%.BG' THEN 1 ELSE 0 END) = 1 AND
MIN(CASE WHEN p_factures.no_facture LIKE '%.BG' THEN 1 ELSE 0 END) = 0
) subview
WHERE p_factures_lignes_non_facturees_c.no_facture = subview.no_facture AND
p_factures_lignes_non_facturees_c.prestation_id = subview.prestation_id AND
p_factures_lignes_non_facturees_c.date_debut = subview.date_debut AND
p_factures_lignes_non_facturees_c.date_fin = subview.date_fin AND
p_factures_lignes_non_facturees_c.prix_unitaire = subview.prix_unitaire
;
-- Ou des lignes en double avec la facturation
DELETE FROM activite[PX].p_factures_lignes_non_facturees_c
USING
(
SELECT no_sejour, prestation_id,
p_factures_lignes_non_facturees_c.date_debut,
p_factures_lignes_non_facturees_c.date_fin,
MAX(CASE WHEN p_factures.no_facture NOT LIKE '%.BG' THEN p_factures_lignes_non_facturees_c.no_facture ELSE NULL END) AS no_facture
FROm activite[PX].p_factures_lignes_non_facturees_c
JOIN activite[PX].p_factures ON p_factures_lignes_non_facturees_c.no_facture = p_factures.no_facture
GROUP BY 1,2,3,4
) subview
JOIN
(
SELECT no_sejour, prestation_id,
p_factures_lignes_c.date_debut,
p_factures_lignes_c.date_fin,
p_factures.no_facture
FROm activite[PX].p_factures_lignes_c
JOIN activite[PX].p_factures ON p_factures_lignes_c.no_facture = p_factures.no_facture
GROUP BY 1,2,3,4,5
) subview2
ON subview2.no_sejour = subview.no_sejour AND
subview2.prestation_id = subview.prestation_id AND
subview2.date_debut = subview.date_debut AND
subview2.date_fin = subview.date_fin
WHERE p_factures_lignes_non_facturees_c.no_facture = subview.no_facture AND
p_factures_lignes_non_facturees_c.prestation_id = subview.prestation_id AND
p_factures_lignes_non_facturees_c.date_debut = subview.date_debut AND
p_factures_lignes_non_facturees_c.date_fin = subview.date_fin
;
-- 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
LEFT JOIN pmsi.p_rss ON p_factures.no_sejour = p_rss.no_sejour_administratif
AND p_rss.traitement_epmsi IN ('30','31','32','33')
AND p_rss.etat = ''
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_2+montant_facture_0) = montant_facture
)
AND p_rss.oid IS NULL
AND montant_facture <> 0
AND p_factures.no_facture NOT LIKE '%BG'
GROUP BY p_factures.no_sejour
HAVING SUM(montant_facture_0+montant_facture_1+montant_facture_2) > 0
ORDER BY p_factures.no_sejour
;
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;
-- Eclatement des supplements par jour des lignes BG
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,
CASE WHEN p_sejours.type_sejour <> '5' THEN date(p_sejours.date_entree) ELSE p_factures_lignes_c.date_debut END AS date_debut_ghs,
CASE WHEN p_sejours.type_sejour <> '5' THEN date(p_sejours.date_sortie - interval '1 day') ELSE p_factures_lignes_c.date_fin END 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 type_sejour = '5' THEN p_factures_lignes_c.date_debut 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 type_sejour = '5' THEN p_factures_lignes_c.date_fin 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 type_sejour <> '5' AND 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
JOIN activite.t_prestations ON prestation_id = t_prestations.oid AND
(
code IN ('PJ', 'PJ1', 'PJ2', 'FJ', 'SSM', 'GHS', 'EXH', 'SRC', 'REA', 'STF', 'NN1', 'NN2', 'NN3', 'CP', 'CPC', 'SHO') OR
t_prestations.type_ventilation_jour = '1'
)
WHERE p_factures_lignes_c.no_facture LIKE '%BG' AND
(nb_prestation > 1 or nb_prestation < -1 OR (type_sejour <> '5' AND 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
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,
rubrique_comptabilisation_id,
compte_produit_id,
prestation_id,
ucd_id,
lpp_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,
round(montant_encours / ABS(nb_det),2) AS montant_encours,
round(montant_encours_0 / ABS(nb_det),2) AS montant_encours_0,
round(montant_encours_1 / ABS(nb_det),2) AS montant_encours_1,
round(montant_encours_2 / ABS(nb_det),2) AS montant_encours_2,
round(montant_encours_22 / ABS(nb_det),2) AS montant_encours_22,
round(montant_facture_actes_inclus_dans_sejour / ABS(nb_det),2) AS montant_facture_actes_inclus_dans_sejour,
round(montant_facture_0_actes_inclus_dans_sejour / ABS(nb_det),2) AS montant_facture_0_actes_inclus_dans_sejour,
round(montant_facture_1_actes_inclus_dans_sejour / ABS(nb_det),2) AS montant_facture_1_actes_inclus_dans_sejour,
round(montant_facture_2_actes_inclus_dans_sejour / ABS(nb_det),2) AS montant_facture_2_actes_inclus_dans_sejour,
round(montant_facture_22_actes_inclus_dans_sejour / ABS(nb_det),2) AS montant_facture_22_actes_inclus_dans_sejour,
origine_facturation_id,
round(montant_comptabilise_budget_global_1 / ABS(nb_det),2) AS montant_comptabilise_budget_global_1,
facture_id
FROM w_factures_lignes_sup_c
JOIN base.p_calendrier ON p_calendrier.date BETWEEN date_debut_det AND date_fin_det
;
DROP TABLE IF EXISTS w_factures_lignes_sup_c_sup_tot;
CREATE TEMP TABLE w_factures_lignes_sup_c_sup_tot AS
SELECT 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;
-- Rubriques internes cti
SELECT activite[PX].cti_reorganize_rubrique_facture_c('w_factures_lignes_sup_c_sup');
INSERT INTO activite[PX].p_factures_lignes_c(
no_facture,
date_debut,
date_fin,
nb_rubrique,
coefficient,
coefficient_mco,
rubrique_facture_id,
rubrique_facturation_id,
rubrique_comptabilisation_id,
compte_produit_id,
prestation_id,
ucd_id,
lpp_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,
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_facture_id,
rubrique_facturation_id,
rubrique_comptabilisation_id,
compte_produit_id,
prestation_id,
ucd_id,
lpp_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,
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;
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_lignes_c.no_facture LIKE '%BG' AND
p_factures.no_sejour = p_mouvements_sejour.no_sejour AND
activite[PX].p_factures_lignes_c.date_debut = p_mouvements_sejour.date AND
(p_mouvements_sejour.heure_fin = 240000 OR p_mouvements_sejour.nb_sorties_directes = 1) AND
p_factures_lignes_c.lieu_id <> p_mouvements_sejour.lieu_id;
]]></sqlcmd>
</NODE>
<NODE label="Compte client Clinique">
<sqlcmd><![CDATA[
SELECT base.cti_disable_index('activite[PX]', 'i_factures_soldes_c_1');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_soldes_c_2');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_soldes_c_3');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_soldes_c_4');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_soldes_c_8');
INSERT INTO activite[PX].p_factures_soldes_c(
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
no_facture,
date_vente,
rubrique_comptabilisation_id,
prestation_id,
SUM(montant_comptabilise),
SUM(montant_comptabilise_0),
SUM(montant_comptabilise_1),
SUM(montant_comptabilise_2),
SUM(montant_comptabilise_22),
0,
0,
0,
0,
0
FROM w_FAC_FACTURE_LIGNE_C
WHERE date_vente IS NOT NULL AND
(montant_comptabilise <> 0 OR
montant_comptabilise_0 <> 0 OR
montant_comptabilise_1 <> 0 OR
montant_comptabilise_2 <> 0 OR
montant_comptabilise_22 <> 0
)
GROUP BY 1,2,3,4;
DROP TABLE IF EXISTS w_FAC_REG;
CREATE TEMP TABLE w_FAC_REG AS
SELECT
FACT_NUM_FAC,
ECRI_DAT_ECRITURE,
VENT_MONTANT AS montant_regle,
CASE WHEN FACD_ID_ORGA_AMO = 0 AND FACD_ID_ORGA_AMC = 0 THEN VENT_MONTANT ELSE 0 END AS montant_regle_0,
CASE WHEN FACD_ID_ORGA_AMO > 0 THEN VENT_MONTANT ELSE 0 END AS montant_regle_1,
CASE WHEN FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC <> tiers_payant_22_orga_id THEN VENT_MONTANT ELSE 0 END AS montant_regle_2,
CASE WHEN FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC = tiers_payant_22_orga_id THEN VENT_MONTANT ELSE 0 END AS montant_regle_22,
LFAC_ID_PRSE,
LFAC_LET_CLE,
ECRI_DAT_SUP,
CPTE_CAGE_CODE,
CRN_HON_TO_SEJ,
LFAC_CDT_EXC,
LFAC_ID_PRHO,
LFAC_ID_MEDE_EXE
FROM w_FAC_FACTURE
JOIN prod_hm.FAC_LIGNE_FACTURE ON LFAC_ID_FACT = FACT_ID_FACT
JOIN prod_hm.FAC_LIGNE_FACTURE_DEBITEUR ON LFAC_ID_LFAC = LFAD_ID_LFAC
JOIN prod_hm.CCL_VENTILATION ON VENT_ID_LFAD = LFAD_ID_LFAD
JOIN prod_hm.CCL_LIGNE_ECRITURE ON VENT_ID_LECR = LECR_ID_LECR
JOIN prod_hm.CCL_ECRITURE ON LECR_ID_ECRI = ECRI_ID_ECRI
JOIN w_CCL_JOURNAL ON ECRI_ID_JOUR = JOUR_ID_JOUR
JOIN w_CCL_COMPTE ON LECR_ID_CPTE = CPTE_ID_CPTE
JOIN prod_hm.FAC_FACTURE_DEBITEUR ON LFAD_ID_FACD = FACD_ID_FACD
WHERE ECRI_DAT_SUP IS NULL
AND JOUR_ISJVT = '0'
;
DROP TABLE IF EXISTS w_FAC_REG_DEB;
CREATE TEMP TABLE w_FAC_REG_DEB AS
SELECT
FACT_NUM_FAC,
ECRI_DAT_ECRITURE,
CASE WHEN LECR_SENS = 'C' THEN LECR_MONTANT ELSE 0 - LECR_MONTANT END AS montant_regle,
CASE WHEN FACD_ID_ORGA_AMO = 0 AND FACD_ID_ORGA_AMC = 0 THEN CASE WHEN LECR_SENS = 'C' THEN LECR_MONTANT ELSE 0 - LECR_MONTANT END ELSE 0 END AS montant_regle_0,
CASE WHEN FACD_ID_ORGA_AMO > 0 THEN CASE WHEN LECR_SENS = 'C' THEN LECR_MONTANT ELSE 0 - LECR_MONTANT END ELSE 0 END AS montant_regle_1,
CASE WHEN FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC <> tiers_payant_22_orga_id THEN CASE WHEN LECR_SENS = 'C' THEN LECR_MONTANT ELSE 0 - LECR_MONTANT END ELSE 0 END AS montant_regle_2,
CASE WHEN FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC = tiers_payant_22_orga_id THEN CASE WHEN LECR_SENS = 'C' THEN LECR_MONTANT ELSE 0 - LECR_MONTANT END ELSE 0 END AS montant_regle_22,
LECR_ID_LECR,
CPTE_CAGE_CODE,
LECR_PART
FROM prod_hm.FAC_FACTURE_DEBITEUR
, w_FAC_FACTURE,
prod_hm.CCL_LIGNE_ECRITURE,
prod_hm.CCL_ECRITURE,
w_CCL_JOURNAL,
w_CCL_COMPTE
WHERE LECR_ID_FACD = FACD_ID_FACD
AND FACD_ID_FACT = FACT_ID_FACT
AND LECR_ID_ECRI = ECRI_ID_ECRI
AND ECRI_ID_JOUR = JOUR_ID_JOUR
AND LECR_ID_CPTE = CPTE_ID_CPTE
AND ECRI_DAT_SUP IS NULL
AND JOUR_ISJVT = '0'
--AND LECR_PART = 'SFT'
;
-- Comptes clients (REG)
DROP TABLE IF EXISTS w_FAC_REGLEMENT_LIGNE_C;
CREATE TEMP TABLE w_FAC_REGLEMENT_LIGNE_C AS
SELECT
FACT_NUM_FAC AS no_facture,
date(ECRI_DAT_ECRITURE) AS date_reglement,
COALESCE(t_rubriques_facturation.oid::bigint, 0) AS rubrique_comptabilisation_id,
COALESCE(t_prestations.oid::bigint, 0) AS prestation_id,
SUM(montant_regle) AS montant_regle,
SUM(montant_regle_0) AS montant_regle_0,
SUM(montant_regle_1) AS montant_regle_1,
SUM(montant_regle_2) AS montant_regle_2,
SUM(montant_regle_22) AS montant_regle_22
FROM w_FAC_REG
LEFT JOIN activite[PX].t_rubriques_facturation ON (LFAC_ID_PRSE::bigint = t_rubriques_facturation.code_original)
LEFT JOIN activite.t_prestations ON (LFAC_LET_CLE = t_prestations.code)
WHERE 1=1
AND LFAC_ID_PRSE <> 0
AND CPTE_CAGE_CODE = 'CLIENT'
GROUP BY 1,2,3,4;
-- Médecins salariés
INSERT INTO w_FAC_REGLEMENT_LIGNE_C
SELECT
FACT_NUM_FAC AS no_facture,
date(ECRI_DAT_ECRITURE) AS date_reglement,
COALESCE(t_rubriques_facturation.oid::bigint, 0) AS rubrique_comptabilisation_id,
COALESCE(t_prestations.oid::bigint, 0) AS prestation_id,
SUM(montant_regle) AS montant_regle,
SUM(montant_regle_0) AS montant_regle_0,
SUM(montant_regle_1) AS montant_regle_1,
SUM(montant_regle_2) AS montant_regle_2,
SUM(montant_regle_22) AS montant_regle_22
FROM w_FAC_REG
LEFT JOIN activite[PX].t_rubriques_facturation ON (LFAC_ID_PRHO = t_rubriques_facturation.code_original)
LEFT JOIN activite.t_prestations ON (LFAC_LET_CLE = t_prestations.code)
WHERE 1=1
AND LFAC_ID_PRHO <> 0
AND CRN_HON_TO_SEJ <> '1'
AND LFAC_CDT_EXC = 'S'
AND CPTE_CAGE_CODE = 'CLIENT'
GROUP BY 1,2,3,4;
-- Règlements
INSERT INTO w_FAC_REGLEMENT_LIGNE_C
SELECT
FACT_NUM_FAC AS no_facture,
date(ECRI_DAT_ECRITURE) AS date_reglement,
COALESCE(t_rubriques_facturation.oid::bigint, 0) AS rubrique_comptabilisation_id,
COALESCE(t_prestations.oid::bigint, 0) AS prestation_id,
SUM(montant_regle) AS montant_regle,
SUM(montant_regle_0) AS montant_regle_0,
SUM(montant_regle_1) AS montant_regle_1,
SUM(montant_regle_2) AS montant_regle_2,
SUM(montant_regle_22) AS montant_regle_22
FROM w_FAC_REG
LEFT JOIN activite[PX].t_rubriques_facturation ON (LFAC_ID_PRHO = t_rubriques_facturation.code_original)
LEFT JOIN activite.t_prestations ON (LFAC_LET_CLE = t_prestations.code)
WHERE 1=1
AND LFAC_ID_PRHO <> 0
AND CRN_HON_TO_SEJ = '1'
AND CPTE_CAGE_CODE = 'CLIENT'
GROUP BY 1,2,3,4;
-- Acomptes 85%
INSERT INTO w_FAC_REGLEMENT_LIGNE_C
SELECT
FACT_NUM_FAC AS no_facture,
date(ECRI_DAT_ECRITURE) AS date_reglement,
COALESCE(t_rubriques_facturation.oid::bigint, 0) AS rubrique_comptabilisation_id,
COALESCE(t_prestations.oid::bigint, 0) AS prestation_id,
SUM(montant_regle) AS montant_regle,
SUM(montant_regle_0) AS montant_regle_0,
SUM(montant_regle_1) AS montant_regle_1,
SUM(montant_regle_2) AS montant_regle_2,
SUM(montant_regle_22) AS montant_regle_22
FROM w_FAC_REG_DEB
LEFT JOIN activite[PX].t_rubriques_facturation ON (t_rubriques_facturation.code_original = '*CTI_ACO85')
LEFT JOIN activite.t_prestations ON (t_prestations.code_original = '*CTI_ACO85')
WHERE 1=1
AND CPTE_CAGE_CODE = 'ACO85'
AND LECR_PART = 'SFT'
GROUP BY 1,2,3,4
;
-- Acomptes
INSERT INTO w_FAC_REGLEMENT_LIGNE_C
SELECT
FACT_NUM_FAC AS no_facture,
date(ECRI_DAT_ECRITURE) AS date_reglement,
COALESCE(t_rubriques_facturation.oid::bigint, 0) AS rubrique_comptabilisation_id,
COALESCE(t_prestations.oid::bigint, 0) AS prestation_id,
SUM(montant_regle) AS montant_regle,
SUM(montant_regle_0) AS montant_regle_0,
SUM(montant_regle_1) AS montant_regle_1,
SUM(montant_regle_2) AS montant_regle_2,
SUM(montant_regle_22) AS montant_regle_22
FROM w_FAC_REG_DEB
LEFT JOIN activite[PX].t_rubriques_facturation ON (t_rubriques_facturation.code_original = '*CTI_ACO')
LEFT JOIN activite.t_prestations ON (t_prestations.code_original = '*CTI_ACO')
WHERE 1=1
AND CPTE_CAGE_CODE IN ('ACO', 'CLIRMB')
AND LECR_PART = 'SFT'
GROUP BY 1,2,3,4
;
-- Ecritures clients non ventilees (solde centimes)
DROP TABLE IF EXISTS w_FAC_REGLEMENT_LIGNE_C_non_ventilees;
CREATE TEMP TABLE w_FAC_REGLEMENT_LIGNE_C_non_ventilees AS
SELECT
FACT_NUM_FAC AS no_facture,
date(ECRI_DAT_ECRITURE) AS date_reglement,
0 AS rubrique_comptabilisation_id,
0 AS prestation_id,
SUM(montant_regle) AS montant_regle,
SUM(montant_regle_0) AS montant_regle_0,
SUM(montant_regle_1) AS montant_regle_1,
SUM(montant_regle_2) AS montant_regle_2,
SUM(montant_regle_22) AS montant_regle_22
FROM w_FAC_REG_DEB
LEFT JOIN prod_hm.CCL_VENTILATION ON CCL_VENTILATION.VENT_ID_LECR = w_FAC_REG_DEB.LECR_ID_LECR
WHERE 1=1
AND CPTE_CAGE_CODE IN ('CLIENT')
AND LECR_PART = 'SFT'
AND CCL_VENTILATION.VENT_ID_LECR IS NULL
GROUP BY 1,2,3
;
UPDATE activite[PX].p_factures SET
montant_regle_c = montant_regle + subview.montant_regle,
montant_regle_0_c = montant_regle_0_c + subview.montant_regle_0,
montant_regle_1_c = montant_regle_1_c + subview.montant_regle_1,
montant_regle_2_c = montant_regle_2_c + subview.montant_regle_2,
montant_regle_22_c = montant_regle_22_c + subview.montant_regle_22
FROM
(
SELECT no_facture,
SUM(montant_regle) AS montant_regle,
SUM(montant_regle_0) AS montant_regle_0,
SUM(montant_regle_1) AS montant_regle_1,
SUM(montant_regle_2) AS montant_regle_2,
SUM(montant_regle_22) AS montant_regle_22
FROM w_FAC_REGLEMENT_LIGNE_C_non_ventilees
GROUP BY 1
) subview
WHERE subview.no_facture = p_factures.no_facture
;
INSERT INTO w_FAC_REGLEMENT_LIGNE_C
SELECT *
FROM w_FAC_REGLEMENT_LIGNE_C_non_ventilees
;
SELECT base.cti_enable_index('activite[PX]', 'i_factures_soldes_c_1');
UPDATE activite[PX].p_factures_soldes_c
SET
montant_regle = w_FAC_REGLEMENT_LIGNE_C.montant_regle,
montant_regle_0 = w_FAC_REGLEMENT_LIGNE_C.montant_regle_0,
montant_regle_1 = w_FAC_REGLEMENT_LIGNE_C.montant_regle_1,
montant_regle_2 = w_FAC_REGLEMENT_LIGNE_C.montant_regle_2,
montant_regle_22 = w_FAC_REGLEMENT_LIGNE_C.montant_regle_22
FROM w_FAC_REGLEMENT_LIGNE_C
WHERE p_factures_soldes_c.no_facture = w_FAC_REGLEMENT_LIGNE_C.no_facture AND
p_factures_soldes_c.date_comptable = w_FAC_REGLEMENT_LIGNE_C.date_reglement AND
p_factures_soldes_c.rubrique_comptabilisee_id = w_FAC_REGLEMENT_LIGNE_C.rubrique_comptabilisation_id AND
p_factures_soldes_c.prestation_id = w_FAC_REGLEMENT_LIGNE_C.prestation_id;
INSERT INTO activite[PX].p_factures_soldes_c(
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
w_FAC_REGLEMENT_LIGNE_C.no_facture,
w_FAC_REGLEMENT_LIGNE_C.date_reglement,
w_FAC_REGLEMENT_LIGNE_C.rubrique_comptabilisation_id,
w_FAC_REGLEMENT_LIGNE_C.prestation_id,
0,
0,
0,
0,
0,
w_FAC_REGLEMENT_LIGNE_C.montant_regle,
w_FAC_REGLEMENT_LIGNE_C.montant_regle_0,
w_FAC_REGLEMENT_LIGNE_C.montant_regle_1,
w_FAC_REGLEMENT_LIGNE_C.montant_regle_2,
w_FAC_REGLEMENT_LIGNE_C.montant_regle_22
FROM w_FAC_REGLEMENT_LIGNE_C
LEFT JOIN activite[PX].p_factures_soldes_c
ON (p_factures_soldes_c.no_facture = w_FAC_REGLEMENT_LIGNE_C.no_facture
AND p_factures_soldes_c.date_comptable = w_FAC_REGLEMENT_LIGNE_C.date_reglement
AND p_factures_soldes_c.rubrique_comptabilisee_id = w_FAC_REGLEMENT_LIGNE_C.rubrique_comptabilisation_id
AND p_factures_soldes_c.prestation_id = w_FAC_REGLEMENT_LIGNE_C.prestation_id)
WHERE date_reglement IS NOT NULL AND p_factures_soldes_c.no_facture IS NULL AND
(
w_FAC_REGLEMENT_LIGNE_C.montant_regle <> 0 OR
w_FAC_REGLEMENT_LIGNE_C.montant_regle_0 <> 0 OR
w_FAC_REGLEMENT_LIGNE_C.montant_regle_1 <> 0 OR
w_FAC_REGLEMENT_LIGNE_C.montant_regle_2 <> 0 OR
w_FAC_REGLEMENT_LIGNE_C.montant_regle_22 <> 0
)
;
-- Annulations par avoirs
INSERT INTO activite[PX].p_factures_soldes_c(
no_facture,
date_comptable,
rubrique_comptabilisee_id,
prestation_id,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
montant_regle,
montant_regle_0,
montant_regle_1,
montant_regle_2,
montant_regle_22,
od_avoir)
SELECT
p_factures_soldes_c.no_facture,
date_od_avoir,
rubrique_comptabilisee_id,
prestation_id,
0,
0,
0,
0,
0,
p_factures_soldes_c.montant_comptabilise,
p_factures_soldes_c.montant_comptabilise_0,
p_factures_soldes_c.montant_comptabilise_1,
p_factures_soldes_c.montant_comptabilise_2,
p_factures_soldes_c.montant_comptabilise_22,
'1'
FROM activite[PX].p_factures_soldes_c JOIN w_ods_avoir ON p_factures_soldes_c.no_facture = w_ods_avoir.no_facture
WHERE p_factures_soldes_c.montant_comptabilise <> 0;
INSERT INTO activite[PX].p_factures_soldes_c(
no_facture,
date_comptable,
rubrique_comptabilisee_id,
prestation_id,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
montant_regle,
montant_regle_0,
montant_regle_1,
montant_regle_2,
montant_regle_22,
od_avoir)
SELECT
p_factures_soldes_c.no_facture,
date_od_avoir,
rubrique_comptabilisee_id,
prestation_id,
0,
0,
0,
0,
0,
p_factures_soldes_c.montant_comptabilise,
p_factures_soldes_c.montant_comptabilise_0,
p_factures_soldes_c.montant_comptabilise_1,
p_factures_soldes_c.montant_comptabilise_2,
p_factures_soldes_c.montant_comptabilise_22,
'1'
FROM activite[PX].p_factures_soldes_c JOIN w_ods_avoir ON p_factures_soldes_c.no_facture = w_ods_avoir.no_facture_od_avoir
WHERE p_factures_soldes_c.montant_comptabilise <> 0;
SELECT base.cti_enable_index('activite[PX]', 'i_factures_soldes_c_2');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_soldes_c_3');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_soldes_c_4');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_soldes_c_8');
-- Suppression des tables de travail non utilisées après
DROP TABLE IF EXISTS w_FAC_FACTURE_LIGNE_C CASCADE;
DROP TABLE IF EXISTS w_FAC_REGLEMENT_LIGNE_C CASCADE;
]]></sqlcmd>
</NODE>
<NODE label="Lignes non facturées Honoraires">
<sqlcmd><![CDATA[
TRUNCATE activite[PX].p_factures_lignes_non_facturees_h;
INSERT INTO activite[PX].p_factures_lignes_non_facturees_h(
no_facture,
date_debut,
date_fin,
heure_debut,
nb_rubrique,
coefficient,
medecin_facture_id,
prestation_id,
prix_unitaire,
montant_depassement,
lieu_id,
acte_id,
phase_ccam,
activite_ccam,
extension_ccam,
modificateur_ccam_1,
modificateur_ccam_2,
modificateur_ccam_3,
modificateur_ccam_4)
SELECT
p_factures.no_facture,
date(ACSA_DAT_EXE_DEB) AS date_debut,
date(COALESCE(ACSA_DAT_EXE_FIN, ACSA_DAT_EXE_DEB)) AS date_fin,
CASE WHEN ACSA_HEU_MEDICALE IS NOT NULL
THEN extract('hour' FROM ACSA_HEU_MEDICALE)
ELSE
extract('hour' FROM ACSA_DAT_EXE_DEB)
END AS heure_debut,
1 AS nb_rubrique,
ACSA_QTE_COEFFICIENT AS coefficient,
t_medecins_administratifs.oid AS medecin_facture_id,
t_prestations.oid AS prestation_id,
CASE WHEN ACSA_MON_TOT <> 0 AND ACSA_QTE_COEFFICIENT = 1 THEN ACSA_MON_TOT ELSE ACSA_PRI_UNITAIRE END AS prix_unitaire,
ACSA_MON_DEP_HON AS montant_depassement,
p_sejours.lieu_sortie_id AS lieu_id,
COALESCE(t_actes.oid::bigint, 0) AS acte_id,
COALESCE(floor(ASAI_NUM_PHAS),0) AS phase_ccam,
COALESCE(floor(ACSA_COD_ACT_D),0) AS activite_ccam,
substr(ACSA_EXT_DOC,1,1) AS extension_ccam,
substr(ACSA_MODIF1,1,1) AS modificateur_ccam_1,
substr(ACSA_MODIF2,1,1) AS modificateur_ccam_2,
substr(ACSA_MODIF3,1,1) AS modificateur_ccam_3,
substr(ACSA_MODIF4,1,1) AS modificateur_ccam_4
FROM prod_hm.SAD_ACTIVITE_SAISIES
LEFT JOIN prod_hm.SAD_ACTES_SAISIS ON ACSA_ID_ASAI = ASAI_ID_ASAI
JOIN activite[PX].p_sejours ON ACSA_ID_SEJO::bigint = p_sejours.code_original AND p_sejours.etat = ''
JOIN activite[PX].p_factures ON p_sejours.no_sejour = p_factures.no_sejour AND type_facture = 'E'
JOIN activite[PX].t_medecins_administratifs ON ACSA_ID_MEDE::bigint = t_medecins_administratifs.code_original
JOIN activite.t_prestations ON ACSA_LET_CLE = t_prestations.code
JOIN base.t_actes ON (substring(ACSA_CODE_D, 1, 7) = t_actes.code)
WHERE ACSA_ID_PRHO <> 0
AND date(COALESCE(ACSA_DAT_EXE_FIN, ACSA_DAT_EXE_DEB)) BETWEEN p_factures.date_debut AND p_factures.date_fin
ORDER BY p_sejours.no_sejour;
]]></sqlcmd>
</NODE>
<NODE label="Lignes factures Honoraires">
<sqlcmd><![CDATA[
INSERT INTO base.t_actes(
code, texte, texte_court, nomenclature, ccam_regroupement_id_1, ccam_regroupement_id_4,
geste_marqueur_id)
SELECT
substring(LFAC_CODE, 1, 7),
substring(LFAC_CODE, 1, 7),
substring(LFAC_CODE, 1, 7),
MIN(CASE WHEN length(trim(LFAC_CODE)) >= 7 THEN 'CCAM' ELSE 'NGAP' END),
MIN(CASE WHEN length(trim(LFAC_CODE)) >= 7 THEN 0 ELSE t_ccam_regroupements.oid END),
MIN(CASE WHEN length(trim(LFAC_CODE)) >= 7 THEN 0 ELSE t_ccam_regroupements.oid END),
0
FROM w_FAC_FACTURE, prod_hm.FAC_LIGNE_FACTURE
LEFT JOIN base.t_actes ON (trim(substring(LFAC_CODE, 1, 7)) = trim(t_actes.code)), base.t_ccam_regroupements
WHERE
LFAC_ID_FACT = FACT_ID_FACT
AND LFAC_ID_PRHO <> 0 AND t_actes.oid is NULL
AND t_ccam_regroupements.code = 'NGAP'
GROUP BY 1,2,3;
DROP TABLE IF EXISTS w_FAC_FACTURE_LIGNE_H;
CREATE TEMP TABLE w_FAC_FACTURE_LIGNE_H AS
SELECT
LFAC_ID_LFAC,
FACT_NUM_FAC AS no_facture,
date(LFAC_DAT_EXE_DEB) AS date_debut,
date(LFAC_DAT_EXE_FIN) AS date_fin,
CASE WHEN FACT_TYPE <> 'P' AND w_FAC_DATEVENTE.date_vente IS NOT NULL THEN w_FAC_DATEVENTE.date_vente ELSE '20991231'::date END AS date_vente,
lieu_sortie_id,
CASE WHEN LFAC_QTE_COEFFICIENT >= 0 THEN 1 ELSE -1 END AS nb_rubrique,
CASE WHEN LFAC_QTE_COEFFICIENT >= 0 THEN 1 ELSE -1 END AS nb_prestations,
ABS(LFAC_QTE_COEFFICIENT) as coefficient,
LFAC_COE_MCO_HAD AS coefficient_mco,
COALESCE(t_rubriques_facturation.oid::bigint, 0) AS rubrique_facturation_id,
COALESCE(t_rubriques_facturation.oid::bigint, 0) AS rubrique_comptabilisation_id,
COALESCE(t_prestations.oid::bigint, 0) AS prestation_id,
COALESCE(t_medecins_administratifs.oid::bigint, 0) AS medecin_facture_id,
COALESCE(t_medecins_administratifs.oid::bigint, 0) AS medecin_comptabilise_id,
LFAC_PRI_UNITAIRE AS prix_unitaire,
COALESCE(t_actes.oid::bigint, 0) AS acte_id,
COALESCE(t_protocoles.oid::bigint, 0) AS protocole_id,
to_char(COALESCE(LFAC_HEU_MEDICALE, LFAC_DAT_EXE_DEB, '0001-01-01 00:00:00'),'HH24MISS')::numeric AS heure_debut,
'1' AS phase_ccam,
LFAC_COD_ACTIVITE::integer AS activite_ccam,
LFAC_EXT_DOC AS extension_ccam,
LFAC_MODIF1 AS modificateur_ccam_1,
LFAC_MODIF2 AS modificateur_ccam_2,
LFAC_MODIF3 AS modificateur_ccam_3,
LFAC_MODIF4 AS modificateur_ccam_4,
SUM(CASE WHEN FAC_HON = '1' THEN coalesce(LFAD_MTT_HOR_DEH, 0) + coalesce(LFAD_MTT_DEH, 0) ELSE 0 END) AS montant_facture,
SUM(CASE WHEN FAC_HON = '1' AND FACD_ID_ORGA_AMO = 0 AND FACD_ID_ORGA_AMC = 0 THEN coalesce(LFAD_MTT_HOR_DEH, 0) + coalesce(LFAD_MTT_DEH, 0) ELSE 0 END) as montant_facture_0,
SUM(CASE WHEN FAC_HON = '1' AND FACD_ID_ORGA_AMO > 0 THEN coalesce(LFAD_MTT_HOR_DEH, 0) + coalesce(LFAD_MTT_DEH, 0) ELSE 0 END) as montant_facture_1,
SUM(CASE WHEN FAC_HON = '1' AND FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC <> tiers_payant_22_orga_id THEN coalesce(LFAD_MTT_HOR_DEH, 0) + coalesce(LFAD_MTT_DEH, 0) ELSE 0 END) as montant_facture_2,
SUM(CASE WHEN FAC_HON = '1' AND FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC = tiers_payant_22_orga_id THEN coalesce(LFAD_MTT_HOR_DEH, 0) + coalesce(LFAD_MTT_DEH, 0) ELSE 0 END) as montant_facture_22,
SUM(coalesce(LFAD_MTT_DEH, 0)) as montant_depassement,
SUM(CASE WHEN FAC_HON <> '1' THEN coalesce(LFAD_MTT_HOR_DEH, 0) + coalesce(LFAD_MTT_DEH, 0) ELSE 0 END) AS montant_facture_actes_inclus_dans_sejour,
SUM(CASE WHEN FAC_HON <> '1' AND FACD_ID_ORGA_AMO = 0 AND FACD_ID_ORGA_AMC = 0 THEN coalesce(LFAD_MTT_HOR_DEH, 0) + coalesce(LFAD_MTT_DEH, 0) ELSE 0 END) as montant_facture_0_actes_inclus_dans_sejour,
SUM(CASE WHEN FAC_HON <> '1' AND FACD_ID_ORGA_AMO > 0 THEN coalesce(LFAD_MTT_HOR_DEH, 0) + coalesce(LFAD_MTT_DEH, 0) ELSE 0 END) as montant_facture_1_actes_inclus_dans_sejour,
SUM(CASE WHEN FAC_HON <> '1' AND FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC <> tiers_payant_22_orga_id THEN coalesce(LFAD_MTT_HOR_DEH, 0) + coalesce(LFAD_MTT_DEH, 0) ELSE 0 END) as montant_facture_2_actes_inclus_dans_sejour,
SUM(CASE WHEN FAC_HON <> '1' AND FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC = tiers_payant_22_orga_id THEN coalesce(LFAD_MTT_HOR_DEH, 0) + coalesce(LFAD_MTT_DEH, 0) ELSE 0 END) as montant_facture_22_actes_inclus_dans_sejour,
MAX(CASE WHEN FACD_ID_ORGA_AMO = 0 AND FACD_ID_ORGA_AMC = 0 THEN 100-LFAD_TAUX ELSE 0 END) as taux_0,
MAX(CASE WHEN FACD_ID_ORGA_AMO > 0 THEN LFAD_TAUX ELSE 0 END) as taux_1,
MAX(CASE WHEN FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC <> tiers_payant_22_orga_id THEN 100-LFAD_TAUX ELSE 0 END) as taux_2,
MAX(CASE WHEN FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC = tiers_payant_22_orga_id THEN 100-LFAD_TAUX ELSE 0 END) as taux_22,
SUM(CASE WHEN LFAD_IND_DIRECT <> 1 AND CRN_HON_TO_SEJ <> '1' AND LFAC_CDT_EXC <> 'S' THEN LFAD_MTT_CRN ELSE 0 END) AS montant_comptabilise,
SUM(CASE WHEN LFAD_IND_DIRECT <> 1 AND CRN_HON_TO_SEJ <> '1' AND LFAC_CDT_EXC <> 'S' AND FACD_ID_ORGA_AMO = 0 AND FACD_ID_ORGA_AMC = 0 THEN LFAD_MTT_CRN ELSE 0 END) as montant_comptabilise_0,
SUM(CASE WHEN LFAD_IND_DIRECT <> 1 AND CRN_HON_TO_SEJ <> '1' AND LFAC_CDT_EXC <> 'S' AND FACD_ID_ORGA_AMO > 0 THEN LFAD_MTT_CRN ELSE 0 END) as montant_comptabilise_1,
SUM(CASE WHEN LFAD_IND_DIRECT <> 1 AND CRN_HON_TO_SEJ <> '1' AND LFAC_CDT_EXC <> 'S' AND FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC <> tiers_payant_22_orga_id THEN LFAD_MTT_CRN ELSE 0 END) as montant_comptabilise_2,
SUM(CASE WHEN LFAD_IND_DIRECT <> 1 AND CRN_HON_TO_SEJ <> '1' AND LFAC_CDT_EXC <> 'S' AND FACD_ID_ORGA_AMC > 0 AND FACD_ID_ORGA_AMC = tiers_payant_22_orga_id THEN LFAD_MTT_CRN ELSE 0 END) as montant_comptabilise_22
FROM prod_hm.FAC_LIGNE_FACTURE
LEFT JOIN activite[PX].t_rubriques_facturation ON (LFAC_ID_PRHO::bigint = t_rubriques_facturation.code_original)
LEFT JOIN activite.t_prestations ON (LFAC_LET_CLE = t_prestations.code)
LEFT JOIN activite[PX].t_medecins_administratifs ON (LFAC_ID_MEDE_EXE::bigint = t_medecins_administratifs.code_original)
LEFT JOIN base.t_actes ON (substring(LFAC_CODE, 1, 7) = t_actes.code)
LEFT JOIN activite[PX].t_protocoles ON (LFAC_ID_FAVO::bigint = t_protocoles.code_original)
LEFT JOIN prod_hm.FAC_LIGNE_FACTURE_DEBITEUR ON LFAC_ID_LFAC = LFAD_ID_LFAC
LEFT JOIN prod_hm.FAC_FACTURE_DEBITEUR ON LFAD_ID_FACD = FACD_ID_FACD
, w_FAC_FACTURE
LEFT JOIN w_FAC_DATEVENTE ON (LECR_ID_FACT_VENT = FACT_ID_FACT)
WHERE LFAC_ID_FACT = FACT_ID_FACT
AND FACT_TYPE <> 'P'
AND LFAC_ID_PRHO <> 0
GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26;
-- Ajout des lignes ESPIC non valorisées
DROP TABLE IF EXISTS w_FAC_FACTURE_last;
CREATE TEMP TABLE w_FAC_FACTURE_last AS
SELECT FACT_ID_SEJO,
(MAX(ARRAY[FACT_DAT_CRE::text, FACT_TYPE, FACT_NUM_FAC::text]))[3]::text AS FACT_NUM_FAC_last,
(MAX(ARRAY[FACT_DAT_CRE::text, FACT_TYPE, lieu_sortie_id::text]))[3]::bigint AS lieu_sortie_id
FROM w_FAC_FACTURE
WHERE FACT_TYPE IN ('A','F') AND
SEJO_IND_BGH = '1'
GROUP BY 1
HAVING (MAX(ARRAY[FACT_DAT_CRE::text, FACT_TYPE]))[2] = 'F'
;
ANALYSE w_FAC_FACTURE_last
;
CREATE INDEX w_FAC_FACTURE_last_i1
ON w_FAC_FACTURE_last
USING btree
(FACT_ID_SEJO);
INSERT INTO w_FAC_FACTURE_LIGNE_H
SELECT
0::bigint AS FACT_ID_LFAC,
FACT_NUM_FAC_last AS no_facture,
date(ACSA_DAT_EXE_DEB) AS date_debut,
date(ACSA_DAT_EXE_DEB) AS date_fin,
'20991231'::date AS date_vente,
lieu_sortie_id,
CASE WHEN ACSA_QTE_COEFFICIENT >= 0 THEN 1 ELSE -1 END AS nb_rubrique,
CASE WHEN ACSA_QTE_COEFFICIENT >= 0 THEN 1 ELSE -1 END AS nb_prestations,
ABS(ACSA_QTE_COEFFICIENT) as coefficient,
1::numeric AS coefficient_mco,
COALESCE(t_rubriques_facturation.oid::bigint, 0) AS rubrique_facturation_id,
COALESCE(t_rubriques_facturation.oid::bigint, 0) AS rubrique_comptabilisation_id,
COALESCE(t_prestations.oid::bigint, 0) AS prestation_id,
COALESCE(t_medecins_administratifs.oid::bigint, 0) AS medecin_facture_id,
COALESCE(t_medecins_administratifs.oid::bigint, 0) AS medecin_comptabilise_id,
CASE WHEN ACSA_PRI_UNITAIRE > 0 THEN ACSA_PRI_UNITAIRE ELSE 0.0001 END AS prix_unitaire,
COALESCE(t_actes.oid::bigint, 0) AS acte_id,
COALESCE(t_protocoles.oid::bigint, 0) AS protocole_id,
to_char(ACSA_DAT_EXE_DEB,'HH24MISS')::numeric AS heure_debut,
'1' AS phase_ccam,
ACSA_COD_ACT_D::integer AS activite_ccam,
ACSA_EXT_DOC AS extension_ccam,
ACSA_MODIF1 AS modificateur_ccam_1,
ACSA_MODIF2 AS modificateur_ccam_2,
ACSA_MODIF3 AS modificateur_ccam_3,
ACSA_MODIF4 AS modificateur_ccam_4,
0::numeric AS montant_facture,
0::numeric AS montant_facture_0,
0::numeric AS montant_facture_1,
0::numeric AS montant_facture_2,
0::numeric AS montant_facture_22,
0::numeric AS montant_depassement,
0::numeric AS montant_facture_actes_inclus_dans_sejour,
0::numeric AS montant_facture_0_actes_inclus_dans_sejour,
0::numeric AS montant_facture_1_actes_inclus_dans_sejour,
0::numeric AS montant_facture_2_actes_inclus_dans_sejour,
0::numeric AS montant_facture_22_actes_inclus_dans_sejour,
0::numeric AS taux_0,
0::numeric AS taux_1,
0::numeric AS taux_2,
0::numeric AS taux_22,
0::numeric AS montant_comptabilise,
0::numeric AS montant_comptabilise_0,
0::numeric AS montant_comptabilise_1,
0::numeric AS montant_comptabilise_2,
0::numeric AS montant_comptabilise_22
FROM prod_hm.SAD_ACTES_SAISIS
JOIN prod_hm.SAD_ACTIVITE_SAISIES ON ACSA_ID_ASAI = ASAI_ID_ASAI
JOIN prod_hm.IDE_SEJOUR ON ASAI_ID_SEJO = SEJO_ID_SEJO
JOIN w_FAC_FACTURE_last ON SEJO_ID_SEJO = w_FAC_FACTURE_last.FACT_ID_SEJO
LEFT JOIN activite[PX].t_medecins_administratifs ON (ACSA_ID_MEDE::bigint = t_medecins_administratifs.code_original)
LEFT JOIN base.t_actes ON (substring(ASAI_CODE_D, 1, 7) = t_actes.code)
LEFT JOIN activite.t_prestations ON (ACSA_LET_CLE = t_prestations.code)
LEFT JOIN activite[PX].t_rubriques_facturation ON (ACSA_ID_PRHO::bigint = t_rubriques_facturation.code_original)
LEFT JOIN activite[PX].t_protocoles ON (ACSA_ID_FAVO::bigint = t_protocoles.code_original)
WHERE ACSA_ID_PRHO <> 0 AND
ACSA_ASS_NON_PREV = '99'
GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26
;
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_h_1');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_h_2');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_h_3');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_h_4');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_h_5');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_h_6');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_h_7');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_h_8');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_h_9');
INSERT INTO activite[PX].p_factures_lignes_h(
no_facture,
date_debut,
date_fin,
nb_rubrique,
nb_prestation,
coefficient,
coefficient_mco,
medecin_facture_id,
medecin_comptabilise_id,
rubrique_facturation_id,
rubrique_comptabilisation_id,
prestation_id,
montant_facture,
montant_facture_0,
montant_facture_1,
montant_facture_2,
montant_facture_22,
montant_depassement,
taux_0,
taux_1,
taux_2,
taux_22,
prix_unitaire,
lieu_id,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
montant_encours,
montant_encours_0,
montant_encours_1,
montant_encours_2,
montant_encours_22,
montant_facture_actes_inclus_dans_sejour,
montant_facture_0_actes_inclus_dans_sejour,
montant_facture_1_actes_inclus_dans_sejour,
montant_facture_2_actes_inclus_dans_sejour,
montant_facture_22_actes_inclus_dans_sejour,
acte_id,
protocole_id
)
SELECT
no_facture,
date_debut,
date_fin,
nb_rubrique,
nb_prestations,
coefficient,
coefficient_mco,
medecin_facture_id,
medecin_comptabilise_id,
rubrique_facturation_id,
rubrique_comptabilisation_id,
prestation_id,
montant_facture,
montant_facture_0,
montant_facture_1,
montant_facture_2,
montant_facture_22,
montant_depassement,
taux_0,
taux_1,
taux_2,
taux_22,
prix_unitaire,
lieu_sortie_id,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
0,
0,
0,
0,
0,
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,
acte_id,
protocole_id
FROM w_FAC_FACTURE_LIGNE_H;
UPDATE activite[PX].p_factures_lignes_h
SET lieu_id = p_mouvements_sejour.lieu_id
FROM activite[PX].p_factures, 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
activite[PX].p_factures_lignes_h.date_debut = p_mouvements_sejour.date AND
(p_mouvements_sejour.heure_fin = 240000 OR p_mouvements_sejour.nb_sorties_directes = 1) AND
p_factures_lignes_h.lieu_id <> p_mouvements_sejour.lieu_id;
-- ajout des lignes non facturées mais dont la prestations doit remonter quand même
-- Les types de prestations exclues venant du PMSI MCO sont paramétrés
INSERT INTO activite.t_divers (code, texte, valeur, description)
SELECT
'HM_ACTES_NON_FAC',
'Actes avec tarif à 0 à rajouter en cas de non facturation mais présence d''un autre actes effectué par le même médecin',
'',
'Actes non facturés devant être rajoutés'
WHERE 'HM_ACTES_NON_FAC' NOT IN (SELECT code FROM activite.t_divers);
;
DROP TABLE IF EXISTS w_SAD_ACTIVITE_SAISIES_to_add;
CREATE TEMP TABLE w_SAD_ACTIVITE_SAISIES_to_add AS
SELECT
ACSA_ID_SEJO,
ACSA_ID_FAVO,
ACSA_ID_MEDE,
SUM(CASE WHEN ACSA_CODE_D = ANY(string_to_array(valeur,',')) THEN 1 ELSE 0 END),
base.cti_array_accum(distinct CASE WHEN ACSA_CODE_D = ANY(string_to_array(valeur,',')) THEN ACSA_ID_ACSA ELSE null END) AS ids,
base.cti_array_accum(distinct CASE WHEN ACSA_CODE_D = ANY(string_to_array(valeur,',')) THEN ACSA_CODE_D ELSE null END) AS codes,
base.cti_array_accum(distinct CASE WHEN ACSA_CODE_D != ALL(string_to_array(valeur,',')) THEN ACSA_CODE_D ELSE null END) AS assocs
FROM prod_hm.SAD_ACTIVITE_SAISIES
JOIN activite.t_divers ON code = 'HM_ACTES_NON_FAC'
WHERE ACSA_ID_PRHO != 0
GROUP BY 1,2,3
HAVING
-- present dans les actes à ajouter
SUM(CASE WHEN ACSA_CODE_D = ANY(string_to_array(valeur,',')) THEN 1 ELSE 0 END) > 0
-- avec au moins un autre acte saisi par le même médecin pour le même protocole (meme 0)
--AND cardinality(base.cti_array_accum(distinct CASE WHEN ACSA_CODE_D != ALL(string_to_array(valeur,',')) THEN ACSA_CODE_D ELSE null END)) > 1
;
INSERT INTO activite[PX].p_factures_lignes_h(
no_facture,
date_debut,
date_fin,
nb_rubrique,
nb_prestation,
coefficient,
coefficient_mco,
medecin_facture_id,
medecin_comptabilise_id,
prestation_id,
montant_facture,
montant_facture_0,
montant_facture_1,
montant_facture_2,
montant_facture_22,
montant_depassement,
taux_0,
taux_1,
taux_2,
taux_22,
prix_unitaire,
lieu_id,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
montant_encours,
montant_encours_0,
montant_encours_1,
montant_encours_2,
montant_encours_22,
montant_facture_actes_inclus_dans_sejour,
montant_facture_0_actes_inclus_dans_sejour,
montant_facture_1_actes_inclus_dans_sejour,
montant_facture_2_actes_inclus_dans_sejour,
montant_facture_22_actes_inclus_dans_sejour,
acte_id,
protocole_id
)
SELECT
p_factures.no_facture,
date(ACSA_DAT_EXE_DEB) AS date_debut,
date(COALESCE(ACSA_DAT_EXE_FIN, ACSA_DAT_EXE_DEB)) AS date_fin,
COALESCE(p_factures_lignes_h.nb_rubrique,1),
COALESCE(p_factures_lignes_h.nb_prestation,1),
ACSA_QTE_COEFFICIENT AS coefficient,
COALESCE(p_factures_lignes_h.coefficient_mco,1),
t_medecins_administratifs.oid AS medecin_facture_id,
t_medecins_administratifs.oid AS medecin_comptabilise_id,
COALESCE(t_prestations.oid::bigint, 0) AS prestation_id,
0 AS montant_facture,
0 as montant_facture_0,
0 as montant_facture_1,
0 as montant_facture_2,
0 as montant_facture_22,
0 as montant_depassement,
0 as taux_0,
0 as taux_1,
0 as taux_2,
0 as taux_22,
ACSA_PRI_UNITAIRE AS prix_unitaire,
COALESCE(p_factures_lignes_h.lieu_id,0) AS lieu_sortie_id,
0 AS montant_comptabilise,
0 as montant_comptabilise_0,
0 as montant_comptabilise_1,
0 as montant_comptabilise_2,
0 as montant_comptabilise_22,
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,
COALESCE(t_actes.oid::bigint, 0) AS acte_id,
COALESCE(p_factures_lignes_h.protocole_id, t_protocoles.oid,0)
FROM (
SELECT id, MAX(assoc) AS assoc FROM
(SELECT
unnest(ids) AS id,
unnest(assocs) AS assoc
FROM w_SAD_ACTIVITE_SAISIES_to_add )
sub
GROUP BY 1
) sub
JOIN prod_hm.SAD_ACTIVITE_SAISIES ON id = ACSA_ID_ACSA
LEFT JOIN prod_hm.SAD_ACTES_SAISIS ON ACSA_ID_ASAI = ASAI_ID_ASAI
JOIN activite[PX].p_sejours ON ACSA_ID_SEJO::bigint = p_sejours.code_original AND p_sejours.etat = ''
JOIN activite[PX].p_factures ON p_sejours.no_sejour = p_factures.no_sejour AND type_facture != 'E'
JOIN activite[PX].t_medecins_administratifs ON ACSA_ID_MEDE::bigint = t_medecins_administratifs.code_original
JOIN activite.t_prestations ON ACSA_LET_CLE = t_prestations.code
JOIN base.t_actes ON (substring(ACSA_CODE_D, 1, 7) = t_actes.code)
LEFT JOIN activite[PX].p_factures_lignes_h verif ON p_factures.no_facture = verif.no_facture AND t_actes.oid = verif.acte_id
LEFT JOIN base.t_actes acte_associe ON (substring(assoc, 1, 7) = acte_associe.code)
LEFT JOIN activite[PX].p_factures_lignes_h ON p_factures.no_facture = p_factures_lignes_h.no_facture AND acte_associe.oid = p_factures_lignes_h.acte_id
LEFT JOIN activite[PX].t_protocoles ON (ACSA_ID_FAVO::bigint = t_protocoles.code_original)
WHERE verif.no_facture IS NULL
;
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_h_1');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_h_2');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_h_3');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_h_4');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_h_5');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_h_6');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_h_7');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_h_8');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_h_9');
-- Suppression des tables de travail non utilisées après
]]></sqlcmd>
</NODE>
<NODE label="Compte client Honoraires">
<sqlcmd><![CDATA[
SELECT base.cti_disable_index('activite[PX]', 'i_factures_soldes_h_1');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_soldes_h_3');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_soldes_h_4');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_soldes_h_8');
INSERT INTO activite[PX].p_factures_soldes_h(
no_facture,
date_comptable,
medecin_comptabilise_id,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
montant_regle,
montant_regle_0,
montant_regle_1,
montant_regle_2,
montant_regle_22
)
SELECT
no_facture,
date_vente,
medecin_comptabilise_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_FAC_FACTURE_LIGNE_H
WHERE date_vente IS NOT NULL AND
(montant_comptabilise <> 0 OR
montant_comptabilise_0 <> 0 OR
montant_comptabilise_1 <> 0 OR
montant_comptabilise_2 <> 0 OR
montant_comptabilise_22 <> 0
)
GROUP BY 1,2,3;
SELECT base.cti_enable_index('activite[PX]', 'i_factures_soldes_h_1');
DROP TABLE IF EXISTS w_FAC_REGLEMENT_LIGNE_H;
CREATE TEMP TABLE w_FAC_REGLEMENT_LIGNE_H AS
SELECT
FACT_NUM_FAC AS no_facture,
date(ECRI_DAT_ECRITURE) AS date_reglement,
COALESCE(t_medecins_administratifs.oid::bigint, 0) AS medecin_comptabilise_id,
SUM(montant_regle) AS montant_regle,
SUM(montant_regle_0) AS montant_regle_0,
SUM(montant_regle_1) AS montant_regle_1,
SUM(montant_regle_2) AS montant_regle_2,
SUM(montant_regle_22) AS montant_regle_22
FROM w_FAC_REG
LEFT JOIN activite[PX].t_medecins_administratifs ON (LFAC_ID_MEDE_EXE::bigint = t_medecins_administratifs.code_original)
WHERE 1=1
AND LFAC_ID_PRHO <> 0
AND CRN_HON_TO_SEJ <> '1'
AND LFAC_CDT_EXC <> 'S'
AND CPTE_CAGE_CODE = 'CLIENT'
GROUP BY 1,2,3;
-- Acomptes
INSERT INTO w_FAC_REGLEMENT_LIGNE_H
SELECT
FACT_NUM_FAC AS no_facture,
date(ECRI_DAT_ECRITURE) AS date_reglement,
0 AS medecin_comptabilise_id,
SUM(montant_regle) AS montant_regle,
SUM(montant_regle_0) AS montant_regle_0,
SUM(montant_regle_1) AS montant_regle_1,
SUM(montant_regle_2) AS montant_regle_2,
SUM(montant_regle_22) AS montant_regle_22
FROM w_FAC_REG_DEB
WHERE 1=1
AND CPTE_CAGE_CODE IN ('ACO', 'CLIRMB')
AND LECR_PART = 'HON'
GROUP BY 1,2,3
;
-- Ecritures clients non ventilees (solde centimes)
DROP TABLE IF EXISTS w_FAC_REGLEMENT_LIGNE_H_non_ventilees;
CREATE TEMP TABLE w_FAC_REGLEMENT_LIGNE_H_non_ventilees AS
SELECT
FACT_NUM_FAC AS no_facture,
date(ECRI_DAT_ECRITURE) AS date_reglement,
0 AS medecin_comptabilise_id,
SUM(montant_regle) AS montant_regle,
SUM(montant_regle_0) AS montant_regle_0,
SUM(montant_regle_1) AS montant_regle_1,
SUM(montant_regle_2) AS montant_regle_2,
SUM(montant_regle_22) AS montant_regle_22
FROM w_FAC_REG_DEB
LEFT JOIN prod_hm.CCL_VENTILATION ON CCL_VENTILATION.VENT_ID_LECR = w_FAC_REG_DEB.LECR_ID_LECR
WHERE 1=1
AND CPTE_CAGE_CODE IN ('CLIENT')
AND LECR_PART = 'HON'
AND CCL_VENTILATION.VENT_ID_LECR IS NULL
GROUP BY 1,2,3
;
UPDATE activite[PX].p_factures SET
montant_regle_h = montant_regle + subview.montant_regle,
montant_regle_0_h = montant_regle_0_h + subview.montant_regle_0,
montant_regle_1_h = montant_regle_1_h + subview.montant_regle_1,
montant_regle_2_h = montant_regle_2_h + subview.montant_regle_2,
montant_regle_22_h = montant_regle_22_h + subview.montant_regle_22
FROM
(
SELECT no_facture,
SUM(montant_regle) AS montant_regle,
SUM(montant_regle_0) AS montant_regle_0,
SUM(montant_regle_1) AS montant_regle_1,
SUM(montant_regle_2) AS montant_regle_2,
SUM(montant_regle_22) AS montant_regle_22
FROM w_FAC_REGLEMENT_LIGNE_H_non_ventilees
GROUP BY 1
) subview
WHERE subview.no_facture = p_factures.no_facture
;
INSERT INTO w_FAC_REGLEMENT_LIGNE_H
SELECT *
FROM w_FAC_REGLEMENT_LIGNE_H_non_ventilees
;
-- Comptes clients (REG)
UPDATE activite[PX].p_factures_soldes_h
SET
montant_regle = w_FAC_REGLEMENT_LIGNE_H.montant_regle,
montant_regle_0 = w_FAC_REGLEMENT_LIGNE_H.montant_regle_0,
montant_regle_1 = w_FAC_REGLEMENT_LIGNE_H.montant_regle_1,
montant_regle_2 = w_FAC_REGLEMENT_LIGNE_H.montant_regle_2,
montant_regle_22 = w_FAC_REGLEMENT_LIGNE_H.montant_regle_22
FROM w_FAC_REGLEMENT_LIGNE_H
WHERE p_factures_soldes_h.no_facture = w_FAC_REGLEMENT_LIGNE_H.no_facture
AND p_factures_soldes_h.date_comptable = w_FAC_REGLEMENT_LIGNE_H.date_reglement
AND p_factures_soldes_h.medecin_comptabilise_id = w_FAC_REGLEMENT_LIGNE_H.medecin_comptabilise_id;
INSERT INTO activite[PX].p_factures_soldes_h(
no_facture,
date_comptable,
medecin_comptabilise_id,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
montant_regle,
montant_regle_0,
montant_regle_1,
montant_regle_2,
montant_regle_22
)
SELECT
w_FAC_REGLEMENT_LIGNE_H.no_facture,
w_FAC_REGLEMENT_LIGNE_H.date_reglement,
w_FAC_REGLEMENT_LIGNE_H.medecin_comptabilise_id,
0,
0,
0,
0,
0,
w_FAC_REGLEMENT_LIGNE_H.montant_regle,
w_FAC_REGLEMENT_LIGNE_H.montant_regle_0,
w_FAC_REGLEMENT_LIGNE_H.montant_regle_1,
w_FAC_REGLEMENT_LIGNE_H.montant_regle_2,
w_FAC_REGLEMENT_LIGNE_H.montant_regle_22
FROM w_FAC_REGLEMENT_LIGNE_H
LEFT JOIN activite[PX].p_factures_soldes_h
ON (p_factures_soldes_h.no_facture = w_FAC_REGLEMENT_LIGNE_H.no_facture
AND p_factures_soldes_h.date_comptable = w_FAC_REGLEMENT_LIGNE_H.date_reglement
AND p_factures_soldes_h.medecin_comptabilise_id = w_FAC_REGLEMENT_LIGNE_H.medecin_comptabilise_id)
WHERE date_reglement IS NOT NULL AND p_factures_soldes_h.no_facture IS NULL AND
(
w_FAC_REGLEMENT_LIGNE_H.montant_regle <> 0 OR
w_FAC_REGLEMENT_LIGNE_H.montant_regle_0 <> 0 OR
w_FAC_REGLEMENT_LIGNE_H.montant_regle_1 <> 0 OR
w_FAC_REGLEMENT_LIGNE_H.montant_regle_2 <> 0 OR
w_FAC_REGLEMENT_LIGNE_H.montant_regle_22 <> 0
)
;
SELECT base.cti_enable_index('activite[PX]', 'i_factures_soldes_h_3');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_soldes_h_4');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_soldes_h_8');
-- Suppression des tables de travail non utilisées après
DROP TABLE IF EXISTS w_FAC_REGLEMENT_LIGNE_H CASCADE;
DROP TABLE IF EXISTS w_FAC_FACTURE_LIGNE_H CASCADE;
]]></sqlcmd>
</NODE>
<NODE label="Post traitement entetes">
<sqlcmd><![CDATA[
-- Préfactures inutiles
DROP TABLE IF EXISTS w_factures_soldes_c_h
;
CREATE TEMP TABLE w_factures_soldes_c_h AS
SELECT
p_factures.no_facture AS no_facture
FROM activite[PX].p_factures
LEFT JOIN activite[PX].p_factures_soldes_c ON p_factures_soldes_c.no_facture = p_factures.no_facture AND p_factures_soldes_c IS NULL
LEFT JOIN activite[PX].p_factures_soldes_h ON p_factures_soldes_h.no_facture = p_factures.no_facture AND p_factures_soldes_h IS NULL
;
CREATE INDEX w_factures_soldes_c_h_i1
ON w_factures_soldes_c_h
USING btree
(no_facture)
;
ANALYSE w_factures_soldes_c_h
;
DELETE
FROM activite[PX].p_factures
USING w_factures_soldes_c_h
WHERE w_factures_soldes_c_h.no_facture = p_factures.no_facture AND
type_facture = 'P' AND
coalesce(montant_facture_c,0) = 0 AND
coalesce(montant_facture_h,0) = 0 AND
coalesce(montant_comptabilise_c,0) = 0 AND
coalesce(montant_comptabilise_h,0) = 0 AND
coalesce(montant_regle_c,0) = 0 AND
coalesce(montant_regle_h,0) = 0
;
-- Il reste parfois des encaissements sans facture sur des préfactures
DELETE
FROM activite[PX].p_factures_soldes_h
WHERE no_facture NOT IN (SELECT no_facture FROM activite[PX].p_factures) AND
no_facture LIKE 'P%'
;
-- Facture reference
DROP TABLE IF EXISTS w_sejours_facture_reference;
CREATE TEMP TABLE w_sejours_facture_reference AS
SELECT
no_sejour,
date_debut,
MAX(date_fin) AS date_fin,
MAX(p_factures.no_facture) AS no_facture_last,
MAX(CASE WHEN type_facture = '0' AND type_facture <> 'P' THEN p_factures.no_facture ELSE null END) AS no_facture_reference_last,
MAX(CASE WHEN type_facture <> '1' AND type_facture <> 'P' THEN p_factures.no_facture ELSE null END) AS no_facture_reference_last_2,
MAX(p_factures.oid) AS facture_id_last,
MAX(CASE WHEN type_facture = '0' AND type_facture <> 'P' THEN p_factures.oid ELSE null END) AS facture_id_reference_last,
MAX(CASE WHEN type_facture <> '1' AND type_facture <> 'P' THEN p_factures.oid ELSE null END) AS facture_id_reference_last_2
FROM activite[PX].p_factures
WHERE type_facture <> 'P'
GROUP BY 1,2;
CREATE INDEX w_sejours_facture_reference_i1
ON w_sejours_facture_reference
USING btree
(no_sejour);
UPDATE w_sejours_facture_reference
SET facture_id_last = p_factures_references.oid
FROM activite[PX].p_factures p_factures_references
WHERE w_sejours_facture_reference.no_facture_last = p_factures_references.no_facture
AND w_sejours_facture_reference.facture_id_last <> p_factures_references.oid;
UPDATE w_sejours_facture_reference
SET facture_id_reference_last = p_factures_references.oid
FROM activite[PX].p_factures p_factures_references
WHERE w_sejours_facture_reference.no_facture_reference_last = p_factures_references.no_facture
AND w_sejours_facture_reference.facture_id_reference_last <> p_factures_references.oid;
UPDATE w_sejours_facture_reference
SET facture_id_reference_last_2 = p_factures_references.oid
FROM activite[PX].p_factures p_factures_references
WHERE w_sejours_facture_reference.no_facture_reference_last_2 = p_factures_references.no_facture
AND w_sejours_facture_reference.facture_id_reference_last_2 <> p_factures_references.oid;
UPDATE activite[PX].p_factures
SET
no_facture_reference = COALESCE(no_facture_reference_last, no_facture_reference_last_2, no_facture_last),
facture_reference_id = COALESCE(facture_id_reference_last, facture_id_reference_last_2, facture_id_last)
FROM w_sejours_facture_reference
WHERE p_factures.no_sejour = w_sejours_facture_reference.no_sejour AND
p_factures.date_debut BETWEEN w_sejours_facture_reference.date_debut AND w_sejours_facture_reference.date_fin AND
(
no_facture_reference IS DISTINCT FROM COALESCE(no_facture_reference_last, no_facture_reference_last_2, no_facture_last) OR
facture_reference_id IS DISTINCT FROM COALESCE(facture_id_reference_last, facture_id_reference_last_2, facture_id_last)
);
UPDATE activite[PX].p_factures
SET no_facture_reference = no_facture
WHERE (no_facture_reference IS NULL OR no_facture_reference = '');
UPDATE activite[PX].p_factures
SET type_facture = '0'
WHERE p_factures.type_facture = '2' AND
p_factures.no_facture = p_factures.no_facture_reference;
UPDATE activite[PX].p_factures
SET type_facture = '2'
WHERE p_factures.type_facture = '0' AND
p_factures.no_facture <> p_factures.no_facture_reference;
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;
-- Suppression des tables de travail non utilisées après
DROP TABLE IF EXISTS w_sejours_facture_reference CASCADE;
-- Pour le budget global, il peut y avoir des lignes de factures facturées non comptabilisées avec montant aussi issu du pmsi
-- Il faut les enlever
DROP TABLE IF EXISTS w_factures_lignes_c_factord;
CREATE TEMP TABLE w_factures_lignes_c_factord AS
SELECT no_sejour, prestation_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].t_prestations ON prestation_id = t_prestations.oid
GROUP BY 1,2
HAVING SUM(CASE WHEN p_factures_lignes_c.no_facture LIKE '%BG' THEN montant_facture_1 ELSE 0 END) <> 0 AND
SUM(CASE WHEN p_factures_lignes_c.no_facture NOT LIKE '%BG' AND montant_comptabilise_1 = 0 THEN montant_facture_1 ELSE 0 END) <> 0
ORDER BY 1,2
;
UPDATE activite[PX].p_factures_lignes_c
SET montant_facture_1 = 0, montant_facture = p_factures_lignes_c.montant_facture - p_factures_lignes_c.montant_facture_1
FROM activite[PX].p_factures,
w_factures_lignes_c_factord
WHERE p_factures_lignes_c.no_facture = p_factures.no_facture AND
w_factures_lignes_c_factord.no_sejour = p_factures.no_sejour AND
p_factures_lignes_c.prestation_id = w_factures_lignes_c_factord.prestation_id AND
p_factures_lignes_c.no_facture NOT LIKE '%BG' AND
p_factures_lignes_c.montant_facture_1 <> 0 AND
p_factures_lignes_c.montant_comptabilise_1 = 0
;
DELETE FROM activite[PX].p_factures_lignes_c
USING activite[PX].p_factures,
w_factures_lignes_c_factord
WHERE p_factures_lignes_c.no_facture = p_factures.no_facture AND
w_factures_lignes_c_factord.no_sejour = p_factures.no_sejour AND
p_factures_lignes_c.prestation_id = w_factures_lignes_c_factord.prestation_id AND
p_factures_lignes_c.no_facture NOT LIKE '%BG' AND
p_factures_lignes_c.montant_facture = 0 AND
p_factures_lignes_c.montant_comptabilise = 0
;
-- BG. Lignes PJ non comptabilisées avec GHS a supprimer
DROP TABLE IF EXISTS w_PJ_trop;
CREATE TEMP TABLE w_PJ_trop AS
SELECT p_factures.no_sejour,
MAX(CASE WHEN t_prestations.code = 'PJ' THEN prestation_id ELSE 0 END) AS pj_prestation_id,
SUM(CASE WHEN t_prestations.code = 'PJ' THEN montant_facture ELSE 0 END) AS pj_fac,
SUM(CASE WHEN t_prestations.code = 'PJ' THEN montant_comptabilise ELSE 0 END) AS pj_cpt,
SUM(CASE WHEN t_prestations.code = 'GHS' THEN montant_facture ELSE 0 END) AS ghs_fac
FROm activite[PX].p_factures_lignes_c
JOIN activite[PX].p_factures ON p_factures.no_facture = p_factures_lignes_c.no_facture
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
WHERE '[ENV_TYPEETS]' IN ('2','3') AND
t_prestations.code IN ('GHS','PJ')
GROUP BY 1
HAVING
MAX(CASE WHEN p_factures.no_facture LIKE '%BG' THEN '1' ELSE '0' END) = '1' AND
SUM(CASE WHEN t_prestations.code = 'PJ' THEN montant_facture ELSE 0 END) <>
SUM(CASE WHEN t_prestations.code = 'PJ' THEN montant_comptabilise ELSE 0 END) AND
SUM(CASE WHEN t_prestations.code = 'GHS' THEN montant_facture ELSE 0 END) > 0
;
ANALYSE w_PJ_trop
;
DELETE FROM activite[PX].p_factures_lignes_c
USING activite[PX].p_factures,
w_PJ_trop
WHERE p_factures_lignes_c.no_facture = p_factures.no_facture AND
p_factures.no_sejour = w_PJ_trop.no_sejour AND
p_factures_lignes_c.prestation_id = pj_prestation_id AND
p_factures.no_facture NOT LIKE '%BG'
;
UPDATE activite[PX].p_factures SET
montant_facture_c = subview.montant_facture,
montant_facture_0_c = subview.montant_facture_0,
montant_facture_1_c = subview.montant_facture_1,
montant_facture_2_c = subview.montant_facture_2,
montant_facture_22_c = subview.montant_facture_22
FROM
(
SELECT p_factures.no_facture,
COALESCE(SUM(montant_facture),0) AS montant_facture,
COALESCE(SUM(montant_facture_0),0) AS montant_facture_0,
COALESCE(SUM(montant_facture_1),0) AS montant_facture_1,
COALESCE(SUM(montant_facture_2),0) AS montant_facture_2,
COALESCE(SUM(montant_facture_22),0) AS montant_facture_22
FROM activite[PX].p_factures
LEFT JOIN activite[PX].p_factures_lignes_c ON p_factures_lignes_c.no_facture = p_factures.no_facture
WHERE p_factures.no_sejour IN (SELECT no_sejour FROM w_PJ_trop) AND
p_factures.no_facture NOT LIKE '%BG'
GROUP BY 1
) subview
WHERE p_factures.no_sejour IN (SELECT no_sejour FROM w_PJ_trop) AND
subview.no_facture = p_factures.no_facture
;
]]></sqlcmd>
</NODE>
</NODE>
<NODE name="CHIFFRIER" label="CREATION DU CHIFFRIER">
<NODE label="Ecritures comptables">
<sqlcmd><![CDATA[
INSERT INTO activite[PX].t_journal (code_original, code, texte)
SELECT JOUR_ID_JOUR::text,
MAX(JOUR_CODE),
MAX(JOUR_LIBELLE)
FROM prod_hm.CCL_JOURNAL
WHERE JOUR_ID_JOUR::text NOT IN (SELECT code_original FROM activite[PX].t_journal WHERE code_original IS NOT NULL)
GROUP BY 1
ORDER BY 2
;
UPDATE activite[PX].t_journal
SET type_journal = 'VE'
FROM prod_hm.CCL_JOURNAL
JOIN prod_hm.BAS_CATALOGUE_GEN ON JOUR_ID_CAGE = CAGE_ID_CAGE
WHERE JOUR_ID_JOUR = code_original AND
type_journal = '' AND
CAGE_CODE = 'FACAV'
;
INSERT INTO activite[PX].t_compte(code_original, code, texte, texte_court)
SELECT CPTE_CODE, CPTE_CODE, MAX(CPTE_LIBELLE), MAX(CPTE_LIBELLE)
FROM prod_hm.CCL_COMPTE
WHERE CPTE_CODE NOT IN (SELECT code_original FROM activite[PX].t_compte WHERE code_original IS NOT NULL)
GROUP BY 1
;
-- Initialisation CLI/NON (cas des comptes de liaison et des valeurs à blanc)
UPDATE prod_hm.CCL_LIGNE_ECRITURE SET
LECR_PART =
CASE
WHEN LECR_PART = 'SFT' AND CPTE_ABREVIATION = 'LIAIHONO' THEN 'HOL'
WHEN LECR_PART = 'HON' AND CPTE_ABREVIATION = 'LIAICLI' THEN 'SFL'
ELSE LECR_PART END
FROM prod_hm.CCL_COMPTE
WHERE LECR_ID_CPTE = CPTE_ID_CPTE AND
CPTE_ABREVIATION IN ('LIAIHONO','LIAICLI')
;
UPDATE prod_hm.CCL_LIGNE_ECRITURE
SET LECR_PART = subview.LECR_PART
FROM
(
SELECT LECR_ID_ECRI, MAX(CASE WHEN LECR_PART IN ('HON','HOL') THEN 'HON' WHEN LECR_PART IN ('SFT','SFL') THEN 'SFT' ELSE '' END) AS LECR_PART
FROM prod_hm.CCL_LIGNE_ECRITURE
GROUP BY 1
HAVING MIN(LECR_PART) = '' AND
MAX(CASE WHEN LECR_PART IN ('HON','HOL') THEN 'HOD' WHEN LECR_PART IN ('SFT','SFL') THEN 'SFD' ELSE '' END) <> ''
) subview
WHERE CCL_LIGNE_ECRITURE.LECR_ID_ECRI = subview.LECR_ID_ECRI AND
CCL_LIGNE_ECRITURE.LECR_PART = ''
;
DROP TABLE IF EXISTS w_ecriture_comptable;
CREATE TEMP TABLE w_ecriture_comptable AS
SELECT
LECR_ID_LECR,
LECR_ID_LECR::text AS code_original,
date(ECRI_DAT_ECRITURE) AS date_comptable,
CASE
WHEN t_journal.type_journal = 'VE' AND CPTE_CODE LIKE '411%' THEN 'VCLI'
WHEN t_journal.type_journal = 'VE' AND CPTE_CODE LIKE '412%' THEN 'VCLI'
WHEN t_journal.type_journal = 'VE' AND CPTE_CODE LIKE '445%' THEN 'VTVA'
WHEN t_journal.type_journal = 'VE' AND LECR_PART NOT IN ('HON','HOD','HOL') THEN 'VPRD'
WHEN t_journal.type_journal = 'VE' AND LECR_PART IN ('HON','HOD','HOL') THEN 'VHON'
WHEN CPTE_CODE LIKE '758%' THEN 'PEPR'
WHEN CPTE_CODE LIKE '658%' THEN 'PEPR'
WHEN t_journal.type_journal <> 'VE' AND CPTE_CODE LIKE '468%' THEN 'ATT'
WHEN t_journal.type_journal <> 'VE' AND CPTE_CODE LIKE '471%' THEN 'ATT'
WHEN t_journal.type_journal <> 'VE' AND CPTE_CODE LIKE '411%' AND ECRI_LIBELLE NOT ILIKE '%NOEMIE%' THEN 'RCLI'
WHEN t_journal.type_journal <> 'VE' AND CPTE_CODE LIKE '412%' AND ECRI_LIBELLE NOT ILIKE '%NOEMIE%' THEN 'RCLI'
WHEN t_journal.type_journal <> 'VE' AND CPTE_CODE LIKE '411%' AND ECRI_LIBELLE ILIKE '%NOEMIE%' THEN 'RNOE'
WHEN t_journal.type_journal <> 'VE' AND CPTE_CODE LIKE '412%' AND ECRI_LIBELLE ILIKE '%NOEMIE%' THEN 'RNOE'
WHEN t_journal.type_journal <> 'VE' AND CPTE_CODE LIKE '419%' THEN 'ACPT'
WHEN t_journal.type_journal <> 'VE' AND CPTE_CODE LIKE '51%' THEN 'BANQ'
WHEN t_journal.type_journal <> 'VE' AND CPTE_CODE LIKE '531%' THEN 'BANQ'
WHEN t_journal.type_journal <> 'VE' AND CPTE_CODE LIKE '466%' THEN 'PHON'
ELSE LIBE_CODE END AS type_ecriture,
ECRI_ID_ECRI::text AS piece,
CASE WHEN LECR_PART IN ('HON','HOD','HOL') THEN 'H' ELSE 'C' END AS clinique_honoraire,
COALESCE(t_compte.oid,0) AS compte_id,
COALESCE(t_journal.oid,0) AS journal_id,
COALESCE(p_sejours.oid,0::bigint) AS sejour_id,
COALESCE(p_sejours.no_sejour,''::text) AS no_sejour,
COALESCE(p_factures.oid,0::bigint) AS facture_id,
COALESCE(FACT_NUM_FAC::text,'')::text AS no_facture,
COALESCE(t_medecins_administratifs.oid,0) AS medecin_id,
0::bigint AS tiers_payant_id,
ECRI_LIBELLE AS texte,
CASE WHEN LECR_SENS = 'C' THEN LECR_MONTANT ELSE 0 END AS montant_credit,
CASE WHEN LECR_SENS = 'D' THEN LECR_MONTANT ELSE 0 END AS montant_debit,
CASE
WHEN t_journal.type_journal = 'VE' THEN 'VENTE'
WHEN t_journal.code LIKE 'OD%' THEN 'OD'
ELSE '?'||t_journal.code END AS type_piece,
CASE
WHEN LIBE_CODE = 'ESP' THEN 'ESP'
WHEN LIBE_CODE = 'RCE' THEN 'ESP'
WHEN LIBE_CODE = 'CH' THEN 'CHQ'
WHEN LIBE_CODE = 'RCH' THEN 'CHQ'
WHEN LIBE_CODE = 'CB' THEN 'CB'
WHEN LIBE_CODE = 'RCB' THEN 'CB'
WHEN LIBE_CODE = 'VRT' THEN 'VIR'
WHEN LIBE_CODE = 'VRTP' THEN 'VIR'
ELSE ''::text END AS mode_reglement_code,
t_compte.taux_tva
FROM prod_hm.CCL_ECRITURE
JOIN prod_hm.CCL_LIGNE_ECRITURE ON ECRI_ID_ECRI = LECR_ID_ECRI
JOIN prod_hm.CCL_COMPTE ON LECR_ID_CPTE = CPTE_ID_CPTE
LEFT JOIN prod_hm.FAC_FACTURE_DEBITEUR ON LECR_ID_FACD = FACD_ID_FACD
LEFT JOIN prod_hm.FAC_FACTURE ON FACD_ID_FACT = FACT_ID_FACT
LEFT JOIN prod_hm.CCL_LIBELLE ON ECRI_ID_LIBE = LIBE_ID_LIBE
JOIN activite[PX].t_journal ON ECRI_ID_JOUR = t_journal.code_original
LEFT JOIN activite[PX].t_compte ON CPTE_CODE = t_compte.code
LEFT JOIN activite[PX].p_sejours ON LECR_ID_SEJO = p_sejours.code_original
LEFT JOIN activite[PX].p_factures ON FACT_NUM_FAC = p_factures.no_facture
LEFT JOIN activite[PX].t_medecins_administratifs ON LECR_ID_MEDE::text = t_medecins_administratifs.code_original
WHERE ECRI_DAT_SUP IS NULL AND
ECRI_ID_ETAB IN ([ID_ETAB]) AND
ECRI_DAT_ECRITURE >= '[ENV_ADM_ANNEEDEBUT]0101'
;
ANALYSE w_ecriture_comptable
;
TRUNCATE activite[PX].p_ecriture_comptable;
INSERT INTO activite[PX].p_ecriture_comptable(
code_original,
date_comptable,
type_ecriture,
type_piece,
piece,
clinique_honoraire,
compte_id,
journal_id,
sejour_id,
no_sejour,
facture_id,
no_facture,
medecin_id,
tiers_payant_id,
texte,
montant_credit,
montant_debit,
est_comptabilise,
mode_reglement_code,
taux_tva)
SELECT
code_original,
date_comptable,
type_ecriture,
type_piece,
piece,
clinique_honoraire,
compte_id,
journal_id,
sejour_id,
no_sejour,
facture_id,
no_facture,
medecin_id,
tiers_payant_id,
texte,
montant_credit,
montant_debit,
'1'::text AS est_comptabilise,
mode_reglement_code,
taux_tva
FROM w_ecriture_comptable
;
ANALYSE activite[PX].p_ecriture_comptable
;
UPDATE activite[PX].p_ecriture_comptable
SET code_erreur = 'EQP'
FROM
(
SELECT provider_id, clinique_honoraire, piece
FROM activite[PX].p_ecriture_comptable
GROUP BY 1,2,3
HAVING SUM(montant_debit-montant_credit) <> 0
) subview
WHERE p_ecriture_comptable.provider_id = subview.provider_id AND
p_ecriture_comptable.piece = subview.piece AND
p_ecriture_comptable.clinique_honoraire = subview.clinique_honoraire
;
UPDATE activite[PX].p_ecriture_comptable
SET code_erreur = 'FAC'
FROM
(
SELECT p_ecriture_comptable.provider_id AS provider_id,
p_ecriture_comptable.piece AS piece,
p_ecriture_comptable.clinique_honoraire AS clinique_honoraire
FROM activite[PX].p_ecriture_comptable
JOIN
(
SELECT p_ecriture_comptable.provider_id,
p_ecriture_comptable.no_facture,
CASE WHEN round(SUM(CASE WHEN type_ecriture IN ('VPRD','VTVA') THEN montant_credit-montant_debit ELSE 0 END),2) IS DISTINCT FROM round(MAX(montant_comptabilise_c),2) THEN '1' ELSE '0' END AS erreur_vente_c,
CASE WHEN round(SUM(CASE WHEN type_ecriture IN ('VHON','VHOI') THEN montant_credit-montant_debit ELSE 0 END),2) IS DISTINCT FROM round(MAX(montant_comptabilise_h),2) THEN '1' ELSE '0' END AS erreur_vente_h
FROM activite[PX].p_ecriture_comptable
LEFT JOIN activite[PX].p_factures ON p_factures.no_facture = p_ecriture_comptable.no_facture
WHERE type_ecriture IN ('VPRD','VTVA','VHON','VHOI')
GROUP BY 1,2
) subview ON
p_ecriture_comptable.provider_id = subview.provider_id AND
p_ecriture_comptable.no_facture = subview.no_facture
WHERE p_ecriture_comptable.type_ecriture IN ('VPRD','VTVA','VHON','VHOI','VCLI') AND
(
p_ecriture_comptable.clinique_honoraire = 'C' AND erreur_vente_c = '1' OR
p_ecriture_comptable.clinique_honoraire = 'H' AND erreur_vente_h = '1'
)
GROUP BY 1,2,3
) subview
WHERE p_ecriture_comptable.provider_id = subview.provider_id AND
p_ecriture_comptable.piece = subview.piece AND
p_ecriture_comptable.clinique_honoraire = subview.clinique_honoraire
;
-- Il y a des pièces sans TVA
UPDATE activite[PX].p_ecriture_comptable
SET taux_tva = 0
WHERE piece IN (
SELECT piece
FROM activite[PX].p_ecriture_comptable
JOIN activite[PX].t_compte on compte_id = t_compte.oid
GROUP BY 1
HAVING MAX(CASE WHEN t_compte.code LIKE '445%' THEN '1' ELSE '0' END) = '0' AND
MAX(CASE WHEN t_compte.code NOT LIKE '445%' THEN p_ecriture_comptable.taux_tva ELSE 0 END) > 0
)
;
]]></sqlcmd>
</NODE>
<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(ECRI_DAT_ECRITURE) AS date_comptable,
SUM(CASE WHEN LECR_PART = 'SFT' AND JOUR_ISJVT = '1' THEN CASE WHEN LECR_SENS = 'D' THEN LECR_MONTANT ELSE 0 - LECR_MONTANT END ELSE 0 END) AS montant_ventes_c,
SUM(CASE WHEN LECR_PART = 'SFT' AND JOUR_ISJVT = '0' AND (LECR_ID_FACD <> 0 OR LECR_ID_LFAD <> 0) THEN CASE WHEN LECR_SENS = 'D' THEN 0 - LECR_MONTANT ELSE LECR_MONTANT END ELSE 0 END) AS montant_reglements_c,
SUM(CASE WHEN LECR_PART = 'SFT' THEN CASE WHEN LECR_SENS = 'D' THEN 0 - LECR_MONTANT ELSE LECR_MONTANT END ELSE 0 END) AS montant_solde_client_c,
SUM(CASE WHEN LECR_PART = 'HON' AND JOUR_ISJVT = '1' THEN CASE WHEN LECR_SENS = 'D' THEN LECR_MONTANT ELSE 0 - LECR_MONTANT END ELSE 0 END) AS montant_ventes_h,
SUM(CASE WHEN LECR_PART = 'HON' AND JOUR_ISJVT = '0' AND (LECR_ID_FACD <> 0 OR LECR_ID_LFAD <> 0) THEN CASE WHEN LECR_SENS = 'D' THEN 0 - LECR_MONTANT ELSE LECR_MONTANT END ELSE 0 END) AS montant_reglements_h,
SUM(CASE WHEN LECR_PART = 'HON' THEN CASE WHEN LECR_SENS = 'D' THEN 0 - LECR_MONTANT ELSE LECR_MONTANT END ELSE 0 END) AS montant_solde_client_h
FROM prod_hm.CCL_LIGNE_ECRITURE
JOIN prod_hm.CCL_ECRITURE ON LECR_ID_ECRI = ECRI_ID_ECRI
JOIN w_CCL_JOURNAL ON ECRI_ID_JOUR = JOUR_ID_JOUR
JOIN w_CCL_COMPTE ON LECR_ID_CPTE = CPTE_ID_CPTE
WHERE
ECRI_DAT_SUP IS NULL AND
ECRI_ID_ETAB IN ([ID_ETAB]) AND
CPTE_CAGE_CODE IN ('CLIENT' , 'ACO85', 'ACO', 'CLIRMB') AND
ECRI_DAT_ECRITURE >= '[ENV_ADM_ANNEEDEBUT]0101'
GROUP BY 1
ORDER BY 1;
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
COALESCE(FACT_NUM_FAC,'00000000'),
date(ECRI_DAT_ECRITURE) AS date_comptable,
SUM(CASE WHEN LECR_PART = 'SFT' AND JOUR_ISJVT = '1' THEN CASE WHEN LECR_SENS = 'D' THEN LECR_MONTANT ELSE 0 - LECR_MONTANT END ELSE 0 END) AS montant_ventes_c,
SUM(CASE WHEN LECR_PART = 'SFT' AND JOUR_ISJVT = '0' AND (LECR_ID_FACD <> 0 OR LECR_ID_LFAD <> 0) THEN CASE WHEN LECR_SENS = 'D' THEN 0 - LECR_MONTANT ELSE LECR_MONTANT END ELSE 0 END) AS montant_reglements_c,
SUM(CASE WHEN LECR_PART = 'HON' AND JOUR_ISJVT = '1' THEN CASE WHEN LECR_SENS = 'D' THEN LECR_MONTANT ELSE 0 - LECR_MONTANT END ELSE 0 END) AS montant_ventes_h,
SUM(CASE WHEN LECR_PART = 'HON' AND JOUR_ISJVT = '0' AND (LECR_ID_FACD <> 0 OR LECR_ID_LFAD <> 0) THEN CASE WHEN LECR_SENS = 'D' THEN 0 - LECR_MONTANT ELSE LECR_MONTANT END ELSE 0 END) AS montant_reglements_h
FROM prod_hm.CCL_LIGNE_ECRITURE
JOIN prod_hm.CCL_ECRITURE ON LECR_ID_ECRI = ECRI_ID_ECRI
JOIN w_CCL_JOURNAL ON ECRI_ID_JOUR = JOUR_ID_JOUR
JOIN w_CCL_COMPTE ON LECR_ID_CPTE = CPTE_ID_CPTE
LEFT JOIN prod_hm.FAC_FACTURE_DEBITEUR ON LECR_ID_FACD = FACD_ID_FACD
LEFT JOIN prod_hm.FAC_FACTURE ON FACD_ID_FACT = FACT_ID_FACT
WHERE ECRI_DAT_SUP IS NULL AND
ECRI_ID_ETAB IN ([ID_ETAB]) AND
CPTE_CAGE_CODE IN ('CLIENT' , 'ACO85', 'ACO', 'CLIRMB') AND
ECRI_DAT_ECRITURE >= '[ENV_ADM_ANNEEDEBUT]0101'
GROUP BY 1,2
HAVING
SUM(CASE WHEN LECR_PART = 'SFT' AND JOUR_ISJVT = '1' THEN CASE WHEN LECR_SENS = 'D' THEN LECR_MONTANT ELSE 0 - LECR_MONTANT END ELSE 0 END) <> 0 OR
SUM(CASE WHEN LECR_PART = 'SFT' AND JOUR_ISJVT = '0' AND (LECR_ID_FACD <> 0 OR LECR_ID_LFAD <> 0) THEN CASE WHEN LECR_SENS = 'D' THEN 0 - LECR_MONTANT ELSE LECR_MONTANT END ELSE 0 END) <> 0 OR
SUM(CASE WHEN LECR_PART = 'HON' AND JOUR_ISJVT = '1' THEN CASE WHEN LECR_SENS = 'D' THEN LECR_MONTANT ELSE 0 - LECR_MONTANT END ELSE 0 END) <> 0 OR
SUM(CASE WHEN LECR_PART = 'HON' AND JOUR_ISJVT = '0' AND (LECR_ID_FACD <> 0 OR LECR_ID_LFAD <> 0) THEN CASE WHEN LECR_SENS = 'D' THEN 0 - LECR_MONTANT ELSE LECR_MONTANT END ELSE 0 END) <> 0
ORDER 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="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 base.t_grands_regimes(code, code_original, texte, texte_court)
SELECT GREG_CODE, GREG_CODE, GREG_LIBELLE, GREG_LIBELLE
FROM prod_hm.IDE_ORGANISME
JOIN prod_hm.pad_grand_regime ON ORGA_ID_GREG = GREG_ID_GREG
LEFT JOIN base.t_grands_regimes ON GREG_CODE = code
WHERE t_grands_regimes.code IS NULL
GROUP BY 1,2,3,4;
INSERT INTO activite[PX].t_tiers_payant(oid, code, code_original, type_tiers_payant, texte, texte_court)
SELECT 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 'PATIENTS', '0', '0', 'Patients', 'Patients'
WHERE '0' NOT IN (SELECT code_original FROM activite[PX].t_tiers_payant);
INSERT INTO activite[PX].t_tiers_payant(code_original, code, type_tiers_payant, texte, texte_court)
SELECT ORGA_ID_ORGA::bigint, ORGA_CODE, CASE WHEN ORGA_TYPE = 'AMO' THEN '1' WHEN ORGA_TYPE = 'AMC' THEN '2' ELSE '0' END, ORGA_NOM, ORGA_NOM
FROM prod_hm.IDE_ORGANISME
WHERE ORGA_ID_ORGA IN (
SELECT DISTINCT PECH_ID_ORGA_AMO
FROM prod_hm.IDE_SEJOUR, prod_hm.IDE_PEC
WHERE SEJO_ID_ETAB_CON IN ([ID_ETAB])
AND SEJO_ID_SEJO = PECH_ID_SEJO)
AND ORGA_ID_ORGA::bigint NOT IN (SELECT code_original FROM activite[PX].t_tiers_payant);
INSERT INTO activite[PX].t_tiers_payant(code_original, code, type_tiers_payant, texte, texte_court)
SELECT ORGA_ID_ORGA::bigint, ORGA_CODE, CASE WHEN ORGA_TYPE = 'AMO' THEN '1' WHEN ORGA_TYPE = 'AMC' THEN '2' ELSE '0' END, ORGA_NOM, ORGA_NOM
FROM prod_hm.IDE_ORGANISME
WHERE ORGA_ID_ORGA IN (
SELECT DISTINCT SEAM_ID_ORGA_AMC
FROM prod_hm.IDE_SEJOUR, prod_hm.IDE_SEJOUR_AMC
WHERE SEJO_ID_ETAB_CON IN ([ID_ETAB])
AND SEJO_ID_SEJO = SEAM_ID_SEJO)
AND ORGA_ID_ORGA::bigint NOT IN (SELECT code_original FROM activite[PX].t_tiers_payant);
UPDATE activite[PX].t_tiers_payant
SET grand_regime_id = t_grands_regimes.oid
FROM prod_hm.IDE_ORGANISME
JOIN prod_hm.pad_grand_regime ON ORGA_ID_GREG = GREG_ID_GREG
JOIN base.t_grands_regimes ON GREG_CODE = code
WHERE t_tiers_payant.code_original = ORGA_ID_ORGA AND
grand_regime_id IS DISTINCT FROM t_grands_regimes.oid AND
GREG_CODE <> '00';
UPDATE activite[PX].t_tiers_payant SET
code = ORGA_CODE,
texte = ORGA_NOM,
texte_court = ORGA_NOM
FROM prod_hm.IDE_ORGANISME
WHERE t_tiers_payant.code_original = ORGA_ID_ORGA::bigint AND
(
code IS DISTINCT FROM ORGA_CODE OR
texte IS DISTINCT FROM ORGA_NOM OR
texte_court IS DISTINCT FROM ORGA_NOM
)
;
]]></sqlcmd>
</NODE>
<NODE label="Médecins">
<sqlcmd><![CDATA[
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);
UPDATE base.t_specialites_medecin SET
code_original = code where code_original is null and oid != 0;
INSERT INTO base.t_specialites_medecin(code_original, code, texte, texte_court)
SELECT
CAGE_CODE,
CAGE_CODE,
CAGE_LIBELLE,
CAGE_LIBELLE
FROM
prod_hm.BAS_CATALOGUE_GEN
JOIN prod_hm.BAS_TYPE_INFO ON CAGE_ID_TYIN = TYIN_ID_TYIN AND TYIN_CODE = 'SPEC_MED'
LEFT JOIN base.t_specialites_medecin ON t_specialites_medecin.code = CAGE_CODE
WHERE
t_specialites_medecin.code IS NULL
ORDER BY CAGE_CODE;
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_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_USED;
CREATE TEMP TABLE w_medecins_USED AS
SELECT MESE_ID_MEDE AS MEDE_ID_USED
FROM prod_hm.IDE_MED_VENUE
JOIN prod_hm.BAS_CATALOGUE_PERS ON MESE_ID_CAPE = CAPE_ID_CAPE
WHERE MESE_ID_ETAB_D IN ([ID_ETAB]) AND
CAPE_CODE IN ('1', '15', '8')
GROUP BY 1
;
INSERT INTO w_medecins_USED
SELECT SEJO_ID_MEDE_COURANT AS MEDE_ID_USED
FROM prod_hm.IDE_SEJOUR
WHERE SEJO_ID_ETAB_CON IN ([ID_ETAB])
GROUP BY 1
;
INSERT INTO w_medecins_USED
SELECT LFAC_ID_MEDE_EXE AS MEDE_ID_USED
FROM prod_hm.FAC_LIGNE_FACTURE
WHERE LFAC_ID_ETAB_D IN ([ID_ETAB]) AND
LFAC_ID_MEDE_EXE > 0
GROUP BY 1
;
DROP TABLE IF EXISTS w_medecins;
CREATE TEMP TABLE w_medecins AS
SELECT MEDE_ID_MEDE::bigint,
CASE WHEN MEDE_CODE <> '' AND MEDE_CODE IS NOT NULL THEN MEDE_CODE ELSE MEDE_ID_MEDE::text END AS MEDE_CODE,
base.cti_soundex_nom(MEDE_NOM_USU) AS MEDE_NOM_USU_SOUNDEX,
base.cti_soundex_nom(COALESCE(MEDE_PRENOM,'')) AS MEDE_PRENOM_SOUNDEX,
MEDE_NOM_USU,
COALESCE(MEDE_PRENOM,'') AS MEDE_PRENOM,
COALESCE(MEDI_ADELI,'') AS MEDI_ADELI,
MEDE_ID_CAGE::bigint,
COALESCE(CAGE_CODE,'') AS CAGE_CODE,
COALESCE(t_medecins_administratifs.medecin_id,0) as medecin_id
FROM prod_hm.IDE_MEDECIN
LEFT JOIN (SELECT MEDI_ID_MEDE, MAX(MEDI_ADELI) AS MEDI_ADELI, MAX(MEDI_ID_CAGE) AS MEDI_ID_CAGE FROM prod_hm.IDE_MEDECIN_IMMAT WHERE MEDI_ID_ETAB IN ([ID_ETAB]) GROUP BY 1) subview
ON (MEDE_ID_MEDE = MEDI_ID_MEDE)
LEFT JOIN activite[PX].t_medecins_administratifs ON MEDE_ID_MEDE = t_medecins_administratifs.code_original
LEFT JOIN prod_hm.BAS_CATALOGUE_GEN ON MEDI_ID_CAGE = CAGE_ID_CAGE
WHERE MEDE_ID_MEDE = ANY(SELECT MEDE_ID_USED FROM w_medecins_USED);
INSERT INTO base.t_medecins(nom, prenom, numero_ordre, specialite_id)
SELECT w_medecins.MEDE_NOM_USU, w_medecins.MEDE_PRENOM, w_medecins.MEDI_ADELI, 0 FROM
(SELECT SUBSTR(MEDE_NOM_USU_SOUNDEX, 1, 8) AS MEDE_NOM_USU_SOUNDEX, SUBSTR(MEDE_PRENOM_SOUNDEX, 1, 8) AS MEDE_PRENOM_SOUNDEX, MEDI_ADELI, MIN(MEDE_ID_MEDE) AS MEDE_ID_MEDE
FROM w_medecins
GROUP BY 1,2,3) subview, w_medecins
WHERE w_medecins.MEDE_ID_MEDE = subview.MEDE_ID_MEDE
AND subview.MEDE_NOM_USU_SOUNDEX || ',' || subview.MEDE_PRENOM_SOUNDEX || ',' || subview.MEDI_ADELI 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.MEDE_NOM_USU, w_medecins.MEDE_PRENOM, w_medecins.MEDI_ADELI, 0 FROM
(SELECT MEDE_NOM_USU_SOUNDEX, MEDE_PRENOM_SOUNDEX, MIN(MEDE_ID_MEDE) AS MEDE_ID_MEDE
FROM w_medecins
GROUP BY 1,2) subview, w_medecins
WHERE w_medecins.MEDE_ID_MEDE = subview.MEDE_ID_MEDE
AND subview.MEDE_NOM_USU_SOUNDEX || ',' || subview.MEDE_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(MEDE_NOM_USU_SOUNDEX, 1, 8) = subview.nom
AND SUBSTR(MEDE_PRENOM_SOUNDEX, 1, 8) = subview.prenom
AND MEDI_ADELI = 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(MEDE_NOM_USU_SOUNDEX, 1, 8) = subview.nom
AND SUBSTR(MEDE_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 MEDE_ID_MEDE, MEDE_CODE, MEDE_NOM_USU, MEDE_PRENOM, COALESCE(t_specialites_medecin.oid,0), medecin_id
FROM w_medecins
LEFT JOIN base.t_specialites_medecin ON (MEDE_ID_CAGE::bigint = t_specialites_medecin.code_original)
WHERE MEDE_ID_MEDE NOT IN (SELECT code_original FROM activite[PX].t_medecins_administratifs);
UPDATE activite[PX].t_medecins_administratifs
SET nom = MEDE_NOM_USU,
prenom = MEDE_PRENOM,
specialite_id = COALESCE(t_specialites_medecin.oid,t_specialites_medecin_2.oid,0),
medecin_id = w_medecins.medecin_id
FROM w_medecins
LEFT JOIN base.t_specialites_medecin ON (CAGE_CODE || '..' = t_specialites_medecin.code)
LEFT JOIN base.t_specialites_medecin t_specialites_medecin_2 ON (CAGE_CODE = t_specialites_medecin_2.code)
WHERE w_medecins.MEDE_ID_MEDE = t_medecins_administratifs.code_original
AND (
t_medecins_administratifs.nom <> MEDE_NOM_USU OR
t_medecins_administratifs.prenom <> MEDE_PRENOM OR
t_medecins_administratifs.specialite_id <> COALESCE(t_specialites_medecin.oid,t_specialites_medecin_2.oid,0) OR
t_medecins_administratifs.medecin_id <> w_medecins.medecin_id
);
UPDATE activite[PX].t_medecins_administratifs
SET specialite_id = subview.specialite_medecin_id
FROM
(
SELECT t_medecins_administratifs.oid,t_specialites_medecin.oid AS specialite_medecin_id
FROM activite[PX].t_medecins_administratifs
JOIN base.t_specialites_medecin t_specialites_medecin_2 ON specialite_id = t_specialites_medecin_2.oid
JOIN base.t_specialites_medecin ON t_specialites_medecin_2.code || '..' = t_specialites_medecin.code
) subview
WHERE t_medecins_administratifs.oid = subview.oid;
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;
-- ADELI
UPDATE activite[PX].t_medecins_administratifs
SET no_adeli = MEDI_ADELI
FROM prod_hm.IDE_MEDECIN
JOIN (SELECT MEDI_ID_MEDE, MAX(MEDI_ADELI) AS MEDI_ADELI FROM prod_hm.IDE_MEDECIN_IMMAT GROUP BY 1) subview
ON (MEDE_ID_MEDE = MEDI_ID_MEDE)
WHERE t_medecins_administratifs.code_original = MEDE_ID_MEDE AND
no_adeli IS DISTINCT FROM MEDI_ADELI
;
-- Code RPPS
UPDATE base.t_medecins
SET code_rpps = subview.RPPS
FROM
(
SELECT medecin_id, count(DISTINCT MEIN_IDE_NATIONALE), MAX(MEIN_IDE_NATIONALE) AS RPPS
FROM activite[PX].t_medecins_administratifs
JOIN base.t_medecins ON t_medecins_administratifs.medecin_id = t_medecins.oid
JOIN prod_hm.IDE_MEDECIN_IDENT_NATIONALE ON code_original = IDE_MEDECIN_IDENT_NATIONALE.MEIN_ID_MEDE
WHERE MEIN_IDE_NATIONALE <> '' AND
length(MEIN_IDE_NATIONALE) = 11 AND
t_medecins.code_rpps = '' AND
medecin_id <> 0
GROUP BY 1
HAVING count(DISTINCT MEIN_IDE_NATIONALE) = 1
) subview
WHERE t_medecins.oid = subview.medecin_id
;
-- Adresse
DROP TABLE IF EXISTS w_IDE_MEDECIN_ADRESSE;
CREATE TEMP TABLE w_IDE_MEDECIN_ADRESSE AS
SELECT MEDE_ID_MEDE,
MAX(CASE WHEN BAS_TYP_INFO_ADRE.TYIN_CODE = 'MEDECIN' AND BAS_CATALOGUE_GEN_ADRE.CAGE_CODE = 'ADR_PROF' THEN ADRE_LIGNE1 ELSE '' END) AS ADRE_LIGNE1,
MAX(CASE WHEN BAS_TYP_INFO_ADRE.TYIN_CODE = 'MEDECIN' AND BAS_CATALOGUE_GEN_ADRE.CAGE_CODE = 'ADR_PROF' THEN ADRE_LIGNE2 ELSE '' END) AS ADRE_LIGNE2,
MAX(CASE WHEN BAS_TYP_INFO_ADRE.TYIN_CODE = 'MEDECIN' AND BAS_CATALOGUE_GEN_ADRE.CAGE_CODE = 'ADR_PROF' THEN ADRE_LIGNE3 ELSE '' END) AS ADRE_LIGNE3,
MAX(CASE WHEN BAS_TYP_INFO_ADRE.TYIN_CODE = 'MEDECIN' AND BAS_CATALOGUE_GEN_ADRE.CAGE_CODE = 'ADR_PROF' THEN ADRE_COD_POS ELSE '' END) AS ADRE_COD_POS,
MAX(CASE WHEN BAS_TYP_INFO_ADRE.TYIN_CODE = 'MEDECIN' AND BAS_CATALOGUE_GEN_ADRE.CAGE_CODE = 'ADR_PROF' THEN ADRE_VILLE ELSE '' END) AS ADRE_VILLE,
MAX(CASE WHEN BAS_TYP_INFO_TELE.TYIN_CODE = 'MEDECIN' AND BAS_CATALOGUE_GEN_TELE.CAGE_CODE = 'TEL_PERS' THEN TELE_NUM_TEL ELSE '' END) AS TELE_NULM_TEL_FIXE,
MAX(CASE WHEN BAS_TYP_INFO_TELE.TYIN_CODE = 'MEDECIN' AND BAS_CATALOGUE_GEN_TELE.CAGE_CODE = 'TEL_PORT' THEN TELE_NUM_TEL ELSE '' END) AS TELE_NULM_TEL_PORT
FROM prod_hm.IDE_MEDECIN
LEFT JOIN prod_hm.IDE_ADRESSE ON MEDE_ID_MEDE = ADRE_ID_OBJ
LEFT JOIN prod_hm.BAS_TYPE_INFO BAS_TYP_INFO_ADRE ON ADRE_ID_TYIN = BAS_TYP_INFO_ADRE.TYIN_ID_TYIN AND BAS_TYP_INFO_ADRE.TYIN_CODE = 'MEDECIN'
LEFT JOIN prod_hm.BAS_CATALOGUE_GEN BAS_CATALOGUE_GEN_ADRE ON ADRE_ID_CAGE = BAS_CATALOGUE_GEN_ADRE.CAGE_ID_CAGE
LEFT JOIN prod_hm.IDE_TELEPHONE ON MEDE_ID_MEDE = TELE_ID_OBJ
LEFT JOIN prod_hm.BAS_TYPE_INFO BAS_TYP_INFO_TELE ON TELE_ID_TYIN = BAS_TYP_INFO_TELE.TYIN_ID_TYIN AND BAS_TYP_INFO_TELE.TYIN_CODE = 'MEDECIN'
LEFT JOIN prod_hm.BAS_CATALOGUE_GEN BAS_CATALOGUE_GEN_TELE ON TELE_ID_CAGE = BAS_CATALOGUE_GEN_TELE.CAGE_ID_CAGE
GROUP BY 1
;
INSERT INTO base.t_codes_postaux(code, texte, texte_court, departement_id)
SELECT ADRE_COD_POS, MAX(ADRE_VILLE), MAX(ADRE_VILLE), MAX(t_departements.oid)
FROM w_IDE_MEDECIN_ADRESSE
LEFT JOIN base.t_codes_postaux ON ADRE_COD_POS = t_codes_postaux.code
JOIN base.t_departements ON
ADRE_COD_POS NOT LIKE '97%' AND substr(ADRE_COD_POS,1,2) = t_departements.code OR
ADRE_COD_POS LIKE '97%' AND substr(ADRE_COD_POS,1,3) = t_departements.code
WHERE t_codes_postaux.oid IS NULL AND
ADRE_COD_POS <> '' AND
length(ADRE_COD_POS) = 5
GROUP BY 1
;
UPDATE activite[PX].t_medecins_administratifs SET
adresse = ADRE_LIGNE1 || ' ' || ADRE_LIGNE2 || ' ' || ADRE_LIGNE3,
code_postal_id = COALESCE(t_codes_postaux.oid,0),
ville = ADRE_VILLE,
telephone = trim(TELE_NULM_TEL_FIXE || ' ' || TELE_NULM_TEL_PORT)
FROM w_IDE_MEDECIN_ADRESSE
LEFT JOIN base.t_codes_postaux ON ADRE_COD_POS = t_codes_postaux.code
WHERE t_medecins_administratifs.code_original = MEDE_ID_MEDE::text AND
(
adresse IS DISTINCT FROM (ADRE_LIGNE1 || ' ' || ADRE_LIGNE2 || ' ' || ADRE_LIGNE3) OR
code_postal_id IS DISTINCT FROM COALESCE(t_codes_postaux.oid,0) OR
ville IS DISTINCT FROM ADRE_VILLE OR
telephone IS DISTINCT FROM trim(TELE_NULM_TEL_FIXE || ' ' || TELE_NULM_TEL_PORT)
)
;
]]></sqlcmd>
</NODE>
<NODE label="Hébergement">
<sqlcmd><![CDATA[
-- Modes de traitement
INSERT INTO base.t_modes_traitement(code, texte, texte_court)
SELECT CAGE_CODE, CAGE_LIBELLE, CAGE_LIBELLE
FROM prod_hm.BAS_CATALOGUE_GEN, prod_hm.BAS_TYPE_INFO
WHERE CAGE_ID_TYIN = TYIN_ID_TYIN AND TYIN_CODE = 'ACTIVITE'
AND CAGE_CODE NOT IN (SELECt code FROM base.t_modes_traitement)
ORDER BY CAGE_CODE;
-- DMT
INSERT INTO base.t_dmt(code, texte, texte_court)
SELECT CAGE_CODE, CAGE_LIBELLE, CAGE_LIBELLE
FROM prod_hm.BAS_CATALOGUE_GEN, prod_hm.BAS_TYPE_INFO
WHERE CAGE_ID_TYIN = TYIN_ID_TYIN AND TYIN_CODE = 'CAT_DMT'
AND CAGE_CODE NOT IN (SELECt code FROM base.t_dmt)
ORDER BY CAGE_CODE;
-- 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);
UPDATE activite[PX].t_services_facturation SET
code = substr(translate(UNFO_CODE,' ',''),1,10),
texte = UNFO_LIBELLE,
texte_court = UNFO_LIBELLE
FROM prod_hm.BAS_UF
WHERE UNFO_ID_UNFO::text = code_original AND
(
code IS DISTINCT FROM substr(translate(UNFO_CODE,' ',''),1,10) OR
texte IS DISTINCT FROM UNFO_LIBELLE OR
texte_court IS DISTINCT FROM UNFO_LIBELLE
)
;
INSERT INTO activite[PX].t_services_facturation(code_original, code, texte, texte_court, type_t2a)
SELECT UNFO_ID_UNFO::bigint, substr(translate(UNFO_CODE,' ',''),1,10) AS UNFO_CODE, UNFO_LIBELLE, UNFO_LIBELLE, CASE WHEN UNFO_TYP_PMS = 1 THEN '1' ELSE '0' END
FROM prod_hm.BAS_UF
WHERE
UNFO_ID_ETAB IN ([ID_ETAB]) AND
(
UNFO_IND_MED = 1 OR
UNFO_ID_UNFO IN (
SELECT SEJO_ID_UNFO_MED_COURANT
FROM prod_hm.IDE_SEJOUR
WHERE SEJO_DAT_SUP IS NULL AND
SEJO_IND_INCOMPLET <> 1 AND
SEJO_STATUT NOT IN ('A','P') AND
SEJO_ID_ETAB_CON IN ([ID_ETAB])
)
) AND
UNFO_ID_UNFO::bigint NOT IN (SELECT code_original FROM activite[PX].t_services_facturation)
ORDER BY UNFO_ID_UNFO;
UPDATE activite[PX].t_services_facturation
SET mode_traitement_id = subview.mode_traitement_id, dmt_id = subview.dmt_id
FROM (
SELECT UNFO_ID_UNFO::bigint, COALESCE(t_modes_traitement.oid,0) as mode_traitement_id, COALESCE(t_dmt.oid,0) as dmt_id
FROM prod_hm.BAS_UF
LEFT JOIN prod_hm.BAS_CATEGORIE_UFM ON UNFO_ID_CUFM = CUFM_ID_CUFM
LEFT JOIN prod_hm.BAS_CATALOGUE_GEN BAS_CATALOGUE_GEN_MT ON CUFM_ID_CAGE_MT = BAS_CATALOGUE_GEN_MT.CAGE_ID_CAGE
LEFT JOIN prod_hm.BAS_CATALOGUE_GEN BAS_CATALOGUE_GEN_DMT ON CUFM_ID_CAGE_DMT = BAS_CATALOGUE_GEN_DMT.CAGE_ID_CAGE
LEFT JOIN base.t_modes_traitement ON BAS_CATALOGUE_GEN_MT.CAGE_CODE = t_modes_traitement.code
LEFT JOIN base.t_dmt ON BAS_CATALOGUE_GEN_DMT.CAGE_CODE = t_dmt.code
WHERE
UNFO_ID_ETAB IN ([ID_ETAB]) AND
UNFO_IND_MED = 1 AND
(t_modes_traitement.oid IS NOT NULL OR t_dmt.oid IS NOT NULL)
) subview
WHERE code_original = UNFO_ID_UNFO AND (t_services_facturation.mode_traitement_id = 0 OR t_services_facturation.dmt_id = 0);
INSERT INTO activite[PX].t_services_facturation(code_original, code, texte, texte_court, est_absence)
SELECT '*ABS', '*ABS', 'Absence', 'Absence', '1' WHERE '*ABS' NOT IN (SELECT code_original FROM activite[PX].t_services_facturation);
UPDATE activite[PX].t_services_facturation SET
code = substr(translate(UNFO_CODE,' ',''),1,10),
texte = UNFO_LIBELLE,
texte_court = UNFO_LIBELLE
FROM prod_hm.BAS_UF
WHERE UNFO_ID_UNFO::text = code_original AND
(
code IS DISTINCT FROM substr(translate(UNFO_CODE,' ',''),1,10) OR
texte IS DISTINCT FROM UNFO_LIBELLE OR
texte_court IS DISTINCT FROM UNFO_LIBELLE
)
;
-- 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 UNFO_ID_UNFO::bigint, substr(translate(UNFO_CODE,' ',''),1,10) AS UNFO_CODE, UNFO_LIBELLE, UNFO_LIBELLE
FROM prod_hm.BAS_UF
WHERE
UNFO_ID_ETAB IN ([ID_ETAB]) AND
UNFO_IND_MED = 1 AND
UNFO_ID_UNFO::bigint NOT IN (SELECT code_original FROM activite[PX].t_unites_fonctionnelles)
ORDER BY UNFO_ID_UNFO;
INSERT INTO activite[PX].t_unites_fonctionnelles(code_original, code, texte, texte_court)
SELECT '*ABS', '*ABS', 'Absence', 'Absence' WHERE '*ABS' NOT IN (SELECT code_original FROM activite[PX].t_unites_fonctionnelles);
UPDATE activite[PX].t_unites_fonctionnelles SET
code = substr(translate(UNFO_CODE,' ',''),1,10),
texte = UNFO_LIBELLE,
texte_court = UNFO_LIBELLE
FROM prod_hm.BAS_UF
WHERE UNFO_ID_UNFO::bigint = code_original AND
(
code IS DISTINCT FROM substr(translate(UNFO_CODE,' ',''),1,10) OR
texte IS DISTINCT FROM UNFO_LIBELLE OR
texte_court IS DISTINCT FROM UNFO_LIBELLE
)
;
-- 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 UNME_ID_UNME::bigint, UNME_CODE, UNME_LIBELLE, UNME_LIBELLE
FROM prod_hm.SAD_UM
WHERE
UNME_ID_ETAB IN ([ID_ETAB]) AND
UNME_ID_UNME::bigint NOT IN (SELECT code_original FROM activite[PX].t_unites_medicales)
ORDER BY UNME_ID_UNME;
INSERT INTO activite[PX].t_unites_medicales(code_original, code, texte, texte_court)
SELECT '*ABS', '*ABS', 'Absence', 'Absence' WHERE '*ABS' NOT IN (SELECT code_original FROM activite[PX].t_unites_medicales);
UPDATE activite[PX].t_unites_medicales SET
code = UNME_CODE,
texte = UNME_LIBELLE,
texte_court = UNME_LIBELLE
FROM prod_hm.SAD_UM
WHERE UNME_ID_UNME::bigint = code_original AND
(
code IS DISTINCT FROM UNME_CODE OR
texte IS DISTINCT FROM UNME_LIBELLE OR
texte_court IS DISTINCT FROM UNME_LIBELLE
)
;
-- Activités (um principale)
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);
DROP TABLE IF EXISTS w_SAD_UM;
CREATE TEMP TABLE w_SAD_UM as
SELECT UNME_ID_UNME::BIGINT as UNME_ID_UNME
,UNME_CODE
,UNME_LIBELLE
FROM prod_hm.SAD_UM
WHERE UNME_ID_ETAB IN ([ID_ETAB]);
-- suffixage des codes um en doublon dans la table HM
UPDATE w_SAD_UM SET
UNME_CODE = substr(w_SAD_UM.UNME_CODE, 1, 3) || '#'::text
FROM
(SELECT UNME_CODE FROM w_SAD_UM GROUP BY UNME_CODE HAVING count(*) > 1) w_doub,
activite[PX].t_activites
WHERE 1=1
AND w_SAD_UM.UNME_CODE = w_doub.UNME_CODE
AND w_doub.UNME_CODE = t_activites.code
AND t_activites.code_original = w_SAD_UM.UNME_ID_UNME;
-- Mise à jour du code suffixé dans la table CTI
UPDATE activite[PX].t_activites SET
code = w_SAD_UM.UNME_CODE
FROM w_SAD_UM
WHERE 1=1
AND t_activites.code_original = w_SAD_UM.UNME_ID_UNME
AND t_activites.code IS DISTINCT FROM w_SAD_UM.UNME_CODE;
INSERT INTO activite[PX].t_activites(code_original, code, texte, texte_court)
SELECT UNME_ID_UNME::bigint, UNME_CODE, UNME_LIBELLE, UNME_LIBELLE
FROM w_SAD_UM
WHERE
UNME_ID_UNME::bigint != ALL(ARRAY(SELECT code_original FROM activite[PX].t_activites WHERE code_original IS NOT NULL)::text[])
ORDER BY UNME_ID_UNME;
UPDATE activite[PX].t_activites SET
code = UNME_CODE,
texte = UNME_LIBELLE,
texte_court = UNME_LIBELLE
FROM w_SAD_UM
WHERE UNME_ID_UNME::bigint = code_original AND
(
code IS DISTINCT FROM UNME_CODE OR
texte IS DISTINCT FROM UNME_LIBELLE OR
texte_court IS DISTINCT FROM UNME_LIBELLE
)
;
-- 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)
SELECT UNFO_ID_UNFO::bigint, substr(translate(UNFO_CODE,' ',''),1,10) AS UNFO_CODE, UNFO_LIBELLE, UNFO_LIBELLE
FROM prod_hm.BAS_UF
WHERE
UNFO_ID_ETAB IN ([ID_ETAB]) AND
UNFO_IND_HEB = 1 AND
UNFO_ID_UNFO::bigint NOT IN (SELECT code_original FROM activite[PX].t_etages WHERE code_original IS NOT NULL )
ORDER BY UNFO_ID_UNFO;
UPDATE activite[PX].t_etages SET
code = substr(translate(UNFO_CODE,' ',''),1,10),
texte = UNFO_LIBELLE,
texte_court = UNFO_LIBELLE
FROM prod_hm.BAS_UF
WHERE UNFO_ID_UNFO::bigint = code_original AND
(
code IS DISTINCT FROM substr(translate(UNFO_CODE,' ',''),1,10) OR
texte IS DISTINCT FROM UNFO_LIBELLE OR
texte_court IS DISTINCT FROM UNFO_LIBELLE
)
;
-- Cas de changement de code lit
UPDATE activite[PX].t_lits
SET code = t_lits.code || '(2)'
FROM
(
SELECT etage_id, CASE WHEN code_original LIKE '%-%' THEN split_part(code_original,'-',2) ELSE code_original END AS code_original,
MAX(CASE WHEN code_original NOT LIKE '%-%' THEN oid ELSE 0 END) AS keepoid,
MAX(CASE WHEN code_original NOT LIKE '%-%' THEN t_lits.code ELSE '' END) AS code,
count(*)
FROM activite[PX].t_lits
WHERE trim(code_original) NOT LIKE '%-0'
GROUP BY 1,2
HAVING count(*) > 1
ORDER BY 1,2
) subview
WHERE t_lits.code_original LIKE '%-%' AND
t_lits.code NOT LIKE '%(2)' AND
split_part(t_lits.code_original,'-',2) = subview.code_original AND
t_lits.etage_id = subview.etage_id AND
t_lits.oid <> subview.keepoid
;
UPDATE activite[PX].t_lits SET
code = LIPO_CODE || 'BAK',
texte = LIPO_LIBELLE,
texte_court = LIPO_LIBELLE,
etage_id = t_etages.oid
FROM prod_hm.PAD_LIT_POSTE, prod_hm.PAD_CHAMBRE_SALLE, activite[PX].t_etages
WHERE LIPO_ID_LIPO::bigint = t_lits.code_original
AND LIPO_ID_CHAS = CHAS_ID_CHAS
AND CHAS_ID_ETAB IN ([ID_ETAB])
AND CHAS_ID_UNFO::bigint = t_etages.code_original AND
(
t_lits.code IS DISTINCT FROM LIPO_CODE OR
t_lits.texte IS DISTINCT FROM LIPO_LIBELLE OR
t_lits.texte_court IS DISTINCT FROM LIPO_LIBELLE OR
t_lits.etage_id IS DISTINCT FROM t_etages.oid
);
UPDATE activite[PX].t_lits SET
code = LIPO_CODE,
texte = LIPO_LIBELLE,
texte_court = LIPO_LIBELLE,
etage_id = t_etages.oid
FROM prod_hm.PAD_LIT_POSTE, prod_hm.PAD_CHAMBRE_SALLE, activite[PX].t_etages
WHERE LIPO_ID_LIPO::bigint = t_lits.code_original
AND LIPO_ID_CHAS = CHAS_ID_CHAS
AND CHAS_ID_ETAB IN ([ID_ETAB])
AND CHAS_ID_UNFO::bigint = t_etages.code_original AND
(
t_lits.code IS DISTINCT FROM LIPO_CODE OR
t_lits.texte IS DISTINCT FROM LIPO_LIBELLE OR
t_lits.texte_court IS DISTINCT FROM LIPO_LIBELLE OR
t_lits.etage_id IS DISTINCT FROM t_etages.oid
);
INSERT INTO activite[PX].t_lits(code_original, code, texte, texte_court, etage_id, chambre_particuliere)
SELECT LIPO_ID_LIPO::bigint, LIPO_CODE, LIPO_LIBELLE, LIPO_LIBELLE, t_etages.oid, CASE WHEN CHAS_CODE = LIPO_CODE THEN 'O' ELSE 'N' END AS CHAS_IND_CP
FROM prod_hm.PAD_LIT_POSTE, prod_hm.PAD_CHAMBRE_SALLE, activite[PX].t_etages
WHERE LIPO_ID_CHAS = CHAS_ID_CHAS
AND CHAS_ID_ETAB IN ([ID_ETAB])
AND CHAS_ID_UNFO::bigint = t_etages.code_original
AND LIPO_ID_LIPO::bigint NOT IN (SELECT code_original FROM activite[PX].t_lits WHERE code_original IS NOT NULL );
-- Anciennes versions d'étages par lit
INSERT INTO activite[PX].t_lits(code_original, code, texte, texte_court, etage_id, chambre_particuliere)
SELECT MOUV_ID_UNFO || '-' || LIPO_ID_LIPO, LIPO_CODE, LIPO_LIBELLE, LIPO_LIBELLE, t_etages.oid, CASE WHEN CHAS_CODE = LIPO_CODE THEN 'O' ELSE 'N' END AS CHAS_IND_CP
FROM prod_hm.IDE_MOUVEMENT
JOIN prod_hm.IDE_SEJOUR ON MOUV_ID_SEJO = SEJO_ID_SEJO AND SEJO_ID_ETAB_CON IN ([ID_ETAB])
JOIN prod_hm.PAD_LIT_POSTE ON MOUV_ID_LIPO = LIPO_ID_LIPO
JOIN prod_hm.PAD_CHAMBRE_SALLE ON LIPO_ID_CHAS = CHAS_ID_CHAS
JOIN activite[PX].t_etages ON MOUV_ID_UNFO = t_etages.code_original
WHERE MOUV_ID_UNFO <> CHAS_ID_UNFO AND
(MOUV_ID_UNFO || '-' || LIPO_ID_LIPO) NOT IN (SELECT code_original FROM activite[PX].t_lits WHERE code_original IS NOT NULL )
GROUP BY 1,2,3,4,5,6;
INSERT INTO activite[PX].t_lits(code_original, code, texte, texte_court, etage_id, chambre_particuliere)
SELECT code_original || '-0' , '', 'Non renseigné', 'Non renseigné', oid, 'O'
FROM activite[PX].t_etages
WHERE oid > 0 AND
code_original || '-0' NOT IN (SELECT code_original FROM activite[PX].t_lits WHERE code_original IS NOT NULL );
UPDATE activite[PX].t_lits SET code = '*****' WHERE code = '';
]]></sqlcmd>
</NODE>
<NODE label="Facturation">
<sqlcmd><![CDATA[
-- Comptes
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);
-- Changement d'identification du code original, le numéro devient le code original
DELETE FROM activite[PX].t_compte
USING
(
SELECT code, min(oid) AS keep_oid
FROM activite[PX].t_compte
WHERE oid <> 0
GROUP BY 1
HAVING count(*) > 1
) subview
WHERE t_compte.code = subview.code AND
oid <> keep_oid
;
UPDATE activite[PX].t_compte
SET code_original = code
WHERE oid <> 0 AND
code <> code_original
;
DROP TABLE IF EXISTS w_LECR_COMPTE;
CREATE TEMP TABLE w_LECR_COMPTE AS
SELECT CASE
WHEN LECR_NUM_COMPTE <> '' THEN LECR_NUM_COMPTE
WHEN CPTE_NUM_COMPTE <> '' THEN CPTE_NUM_COMPTE
ELSE CPTE_CODE END AS LECR_NUM_COMPTE,
MAX(LECR_ID_CPTE) AS LECR_ID_CPTE, ''::text AS CPTE_LIBELLE
FROM prod_hm.CCL_LIGNE_ECRITURE
JOIN prod_hm.CCL_COMPTE ON LECR_ID_CPTE = CPTE_ID_CPTE
GROUP BY 1
;
ANALYSE w_LECR_COMPTE
;
UPDATE w_LECR_COMPTE
SET CPTE_LIBELLE = CCL_COMPTE.CPTE_LIBELLE
FROM prod_hm.CCL_COMPTE
WHERE LECR_NUM_COMPTE = CPTE_NUM_COMPTE
;
UPDATE w_LECR_COMPTE
SET CPTE_LIBELLE = CCL_COMPTE.CPTE_LIBELLE
FROM prod_hm.CCL_COMPTE
WHERE w_LECR_COMPTE.CPTE_LIBELLE = '' AND
LECR_NUM_COMPTE = CPTE_CODE
;
UPDATE w_LECR_COMPTE
SET CPTE_LIBELLE = CCL_COMPTE.CPTE_LIBELLE
FROM prod_hm.CCL_COMPTE
WHERE w_LECR_COMPTE.CPTE_LIBELLE = '' AND
LECR_ID_CPTE = CPTE_ID_CPTE
;
UPDATE w_LECR_COMPTE
SET CPTE_LIBELLE = LECR_NUM_COMPTE
WHERE CPTE_LIBELLE = ''
;
INSERT INTO activite[PX].t_compte(code_original, code, texte, texte_court)
SELECT LECR_NUM_COMPTE,
LECR_NUM_COMPTE,
CPTE_LIBELLE,
CPTE_LIBELLE
FROM w_LECR_COMPTE
WHERE LECR_NUM_COMPTE NOT IN (SELECT code_original FROM activite[PX].t_compte WHERE code_original IS NOT NULL)
;
UPDATE activite[PX].t_compte SET
code = LECR_NUM_COMPTE,
texte = CPTE_LIBELLE,
texte_court = CPTE_LIBELLE
FROM w_LECR_COMPTE
WHERE t_compte.code_original = LECR_NUM_COMPTE AND
(
code IS DISTINCT FROM LECR_NUM_COMPTE OR
texte IS DISTINCT FROM CPTE_LIBELLE OR
texte_court IS DISTINCT FROM CPTE_LIBELLE
)
;
-- 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 '*CTI_ACO85', 'ACO85', 'Acomptes 85%', 'Acomptes 85%'
WHERE '*CTI_ACO85' NOT IN (SELECT code_original FROM activite[PX].t_rubriques_facturation);
INSERT INTO activite[PX].t_rubriques_facturation(code_original, code, texte, texte_court)
SELECT '*CTI_ACO', 'ACOMPTE', 'Acomptes', 'Acomptes'
WHERE '*CTI_ACO' NOT IN (SELECT code_original FROM activite[PX].t_rubriques_facturation);
UPDATE activite[PX].t_rubriques_facturation
SET code = '#'||PRSE_CODE
FROM prod_hm.PAD_PRESTATION_SEJOUR
WHERE code_original = PRSE_ID_PRSE AND
code IS DISTINCT FROM PRSE_CODE;
UPDATE activite[PX].t_rubriques_facturation
SET code = PRSE_CODE,
texte = PRSE_LIBELLE,
texte_court = PRSE_LIBELLE
FROM prod_hm.PAD_PRESTATION_SEJOUR
WHERE code_original = PRSE_ID_PRSE AND
(
code IS DISTINCT FROM PRSE_CODE OR
texte IS DISTINCT FROM PRSE_LIBELLE OR
texte_court IS DISTINCT FROM PRSE_LIBELLE
);
INSERT INTO activite[PX].t_rubriques_facturation(code_original, code, texte, texte_court)
SELECT PRSE_ID_PRSE::bigint, PRSE_CODE, PRSE_LIBELLE, PRSE_LIBELLE
FROM prod_hm.PAD_PRESTATION_SEJOUR
WHERE PRSE_ID_ETAB IN ([ID_ETAB])
AND PRSE_ID_PRSE::bigint NOT IN (SELECT code_original FROM activite[PX].t_rubriques_facturation)
AND PRSE_ID_PRSE IN (SELECT LFAC_ID_PRSE FROM prod_hm.FAC_LIGNE_FACTURE)
ORDER BY PRSE_CODE;
INSERT INTO activite[PX].t_rubriques_facturation(code_original, code, texte, texte_court)
SELECT PRSE_ID_PRSE::bigint, PRSE_CODE, PRSE_LIBELLE, PRSE_LIBELLE
FROM prod_hm.PAD_PRESTATION_SEJOUR
WHERE
PRSE_ID_PRSE::bigint NOT IN (SELECT code_original FROM activite[PX].t_rubriques_facturation)
AND PRSE_ID_PRSE IN (SELECT LFAC_ID_PRSE FROM prod_hm.FAC_LIGNE_FACTURE WHERE LFAC_ID_ETAB_D IN ([ID_ETAB]) )
ORDER BY PRSE_CODE;
INSERT INTO activite[PX].t_rubriques_facturation(code_original, code, texte, texte_court)
SELECT PRSE_ID_PRSE::bigint, PRSE_CODE, PRSE_LIBELLE, PRSE_LIBELLE
FROM prod_hm.PAD_PRESTATION_SEJOUR
WHERE PRSE_ID_ETAB IN ([ID_ETAB])
AND PRSE_ID_PRSE::bigint NOT IN (SELECT code_original FROM activite[PX].t_rubriques_facturation)
AND PRSE_ID_PRSE IN (SELECT ACSA_ID_PRSE FROM prod_hm.SAD_ACTIVITE_SAISIES)
ORDER BY PRSE_CODE;
UPDATE activite[PX].t_rubriques_facturation
SET code = '#' || PRHO_CODE || '_H'
FROM prod_hm.PAD_PRESTATION_HONORAIRE
WHERE code_original = PRHO_ID_PRHO AND
code IS DISTINCT FROM PRHO_CODE AND
code IS DISTINCT FROM (PRHO_CODE || '_H');
UPDATE activite[PX].t_rubriques_facturation
SET code = PRHO_CODE || '_H',
texte = PRHO_LIBELLE,
texte_court = PRHO_LIBELLE
FROM prod_hm.PAD_PRESTATION_HONORAIRE
WHERE code_original = PRHO_ID_PRHO AND
code IS DISTINCT FROM PRHO_CODE AND
(
code IS DISTINCT FROM PRHO_CODE || '_H' OR
texte IS DISTINCT FROM PRHO_LIBELLE OR
texte_court IS DISTINCT FROM PRHO_LIBELLE
);
INSERT INTO activite[PX].t_rubriques_facturation(code_original, code, texte, texte_court)
SELECT PRHO_ID_PRHO::bigint, PRHO_CODE, PRHO_LIBELLE, PRHO_LIBELLE
FROM prod_hm.PAD_PRESTATION_HONORAIRE JOIN prod_hm.BAS_ETABLISSEMENT ON PRHO_ID_ETAB = ETAB_ID_ETAB AND ETAB_TYP_ETAB = 'PSPH'
WHERE PRHO_ID_ETAB IN ([ID_ETAB])
AND PRHO_ID_PRHO::bigint NOT IN (SELECT code_original FROM activite[PX].t_rubriques_facturation)
AND PRHO_CODE NOT IN (SELECT code FROM activite[PX].t_rubriques_facturation)
AND PRHO_ID_PRHO IN (SELECT LFAC_ID_PRHO FROM prod_hm.FAC_LIGNE_FACTURE)
ORDER BY PRHO_CODE;
INSERT INTO activite[PX].t_rubriques_facturation(code_original, code, texte, texte_court)
SELECT PRHO_ID_PRHO::bigint, PRHO_CODE || '_H', PRHO_LIBELLE, PRHO_LIBELLE
FROM prod_hm.PAD_PRESTATION_HONORAIRE JOIN prod_hm.BAS_ETABLISSEMENT ON PRHO_ID_ETAB = ETAB_ID_ETAB AND ETAB_TYP_ETAB = 'PSPH'
WHERE PRHO_ID_ETAB IN ([ID_ETAB])
AND PRHO_ID_PRHO::bigint NOT IN (SELECT code_original FROM activite[PX].t_rubriques_facturation)
AND PRHO_CODE IN (SELECT code FROM activite[PX].t_rubriques_facturation)
AND PRHO_CODE || '_H' NOT IN (SELECT code FROM activite[PX].t_rubriques_facturation)
AND PRHO_ID_PRHO IN (SELECT LFAC_ID_PRHO FROM prod_hm.FAC_LIGNE_FACTURE)
ORDER BY PRHO_CODE;
INSERT INTO activite[PX].t_rubriques_facturation(code_original, code, texte, texte_court)
SELECT PRHO_ID_PRHO::bigint, PRHO_CODE, PRHO_LIBELLE, PRHO_LIBELLE
FROM prod_hm.PAD_PRESTATION_HONORAIRE JOIN prod_hm.BAS_ETABLISSEMENT ON PRHO_ID_ETAB = ETAB_ID_ETAB AND ETAB_TYP_ETAB <> 'PSPH'
WHERE PRHO_ID_ETAB IN ([ID_ETAB])
AND PRHO_ID_PRHO::bigint NOT IN (SELECT code_original FROM activite[PX].t_rubriques_facturation)
AND PRHO_CODE NOT IN (SELECT code FROM activite[PX].t_rubriques_facturation)
AND PRHO_ID_PRHO IN (SELECT LFAC_ID_PRHO FROM prod_hm.FAC_LIGNE_FACTURE WHERE LFAC_CDT_EXC = 'S')
ORDER BY PRHO_CODE;
-- Rubriques pour médecins salariés
INSERT INTO activite[PX].t_rubriques_facturation(code_original, code, texte, texte_court)
SELECT PRHO_ID_PRHO::bigint, PRHO_CODE, PRHO_LIBELLE, PRHO_LIBELLE
FROM prod_hm.PAD_PRESTATION_HONORAIRE
WHERE PRHO_ID_ETAB IN ([ID_ETAB])
AND PRHO_ID_PRHO::bigint NOT IN (SELECT code_original FROM activite[PX].t_rubriques_facturation)
AND PRHO_CODE NOT IN (SELECT code FROM activite[PX].t_rubriques_facturation)
AND PRHO_ID_PRHO IN (SELECT LFAC_ID_PRHO FROM prod_hm.FAC_LIGNE_FACTURE WHERE LFAC_CDT_EXC = 'S')
ORDER BY PRHO_CODE;
INSERT INTO activite[PX].t_rubriques_facturation(code_original, code, texte, texte_court)
SELECT PRHO_ID_PRHO::bigint, PRHO_CODE, PRHO_LIBELLE, PRHO_LIBELLE
FROM prod_hm.PAD_PRESTATION_HONORAIRE
WHERE PRHO_ID_PRHO::bigint NOT IN (SELECT code_original FROM activite[PX].t_rubriques_facturation)
AND PRHO_CODE NOT IN (SELECT code FROM activite[PX].t_rubriques_facturation)
AND PRHO_ID_PRHO IN (SELECT LFAC_ID_PRHO FROM prod_hm.FAC_LIGNE_FACTURE WHERE LFAC_ID_ETAB_D IN ([ID_ETAB]) AND LFAC_CDT_EXC = 'S')
ORDER BY PRHO_CODE;
INSERT INTO activite.t_prestations(code, code_original, texte, texte_court)
SELECT CASE WHEN TRIM(PRSE_LET_CLE) <> '' THEN PRSE_LET_CLE ELSE PRSE_CODE END, CASE WHEN TRIM(PRSE_LET_CLE) <> '' THEN PRSE_LET_CLE ELSE PRSE_CODE END, MIN(PRSE_LIBELLE) , MIN(PRSE_LIBELLE)
FROM prod_hm.PAD_PRESTATION_SEJOUR
WHERE PRSE_ID_ETAB IN ([ID_ETAB])
AND CASE WHEN TRIM(PRSE_LET_CLE) <> '' THEN PRSE_LET_CLE ELSE PRSE_CODE END 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 '*CTI_ACO85', 'ACO85', 'Acomptes 85%', 'Acomptes 85%'
WHERE '*CTI_ACO85' NOT IN (SELECT code_original FROM activite.t_prestations WHERE code_original IS NOT NULL);
INSERT INTO activite.t_prestations(code_original, code, texte, texte_court)
SELECT '*CTI_ACO', 'ACOMPTE', 'Acomptes', 'Acomptes'
WHERE '*CTI_ACO' NOT IN (SELECT code_original FROM activite.t_prestations WHERE code_original IS NOT NULL);
INSERT INTO activite.t_prestations(code, code_original, texte, texte_court)
SELECT CASE WHEN TRIM(PRHO_LET_CLE) <> '' THEN PRHO_LET_CLE ELSE PRHO_CODE END, CASE WHEN TRIM(PRHO_LET_CLE) <> '' THEN PRHO_LET_CLE ELSE PRHO_CODE END, MIN(PRHO_LIBELLE) , MIN(PRHO_LIBELLE)
FROM prod_hm.PAD_PRESTATION_HONORAIRE
WHERE PRHO_ID_ETAB IN ([ID_ETAB])
AND CASE WHEN TRIM(PRHO_LET_CLE) <> '' THEN PRHO_LET_CLE ELSE PRHO_CODE END NOT IN (SELECT code FROM activite.t_prestations WHERE code IS NOT NULL)
GROUP BY 1,2
ORDER BY 1;
INSERT INTO activite.t_prestations(code, code_original, texte, texte_court)
SELECT DISTINCT LFAC_LET_CLE, LFAC_LET_CLE, LFAC_LET_CLE , LFAC_LET_CLE
FROM prod_hm.FAC_LIGNE_FACTURE
WHERE LFAC_LET_CLE NOT IN (SELECT code FROM activite.t_prestations WHERE code IS NOT NULL) AND
LFAC_LET_CLE <> ''
ORDER BY 1;
UPDATE activite[PX].t_protocoles SET
code = FAVO_CODE::text,
texte = FAVO_LIBELLE::text,
texte_court = FAVO_LIBELLE::text
FROM
prod_hm.SAD_FAVORIS
WHERE 1=1
AND FAVO_ID_FAVO = t_protocoles.code_original
AND (FAVO_CODE <> t_protocoles.code OR FAVO_LIBELLE <> t_protocoles.texte);
INSERT INTO activite[PX].t_protocoles(oid, code_original, code, texte, texte_court)
SELECT 0, 0, '***', 'Non renseigné', 'Non renseigné' WHERE 0 NOT IN (SELECT oid FROM activite[PX].t_protocoles);
INSERT INTO activite[PX].t_protocoles(code_original, code, texte, texte_court)
SELECT FAVO_ID_FAVO::bigint, FAVO_CODE, FAVO_LIBELLE, FAVO_LIBELLE
FROM prod_hm.SAD_FAVORIS
WHERE FAVO_ID_FAVO IN (SELECT LFAC_ID_FAVO FROM prod_hm.FAC_LIGNE_FACTURE GROUP BY 1) AND
FAVO_ID_FAVO::bigint NOT IN (SELECT code_original FROM activite[PX].t_protocoles)
ORDER BY FAVO_CODE;
]]></sqlcmd>
</NODE>
</NODE>
<NODE name="POST" label="TRAITEMENTS COMPLEMENTAIRES">
<NODE label="Calcul -10% SSR">
<sqlcmd><![CDATA[
DROP TABLE IF EXISTS w_moins10;
CREATE TEMP TABLE w_moins10 AS
SELECT p_factures_lignes_c.*,
p_factures_lignes_c.CTID AS CTID_orig,
CASE
WHEN (t_prestations.code = 'PJ' OR type_valorisation_non_facture = 'PJ') AND
montant_comptabilise_0=0 AND
montant_comptabilise_2=0 AND
montant_comptabilise_22=0 AND
ABS(round(((prix_unitaire*nb_prestation*0.9)-montant_comptabilise_1)/nb_prestation,0)) BETWEEN 17 AND 37
THEN round(((prix_unitaire*nb_prestation*0.9)-montant_comptabilise_1)/ABS(nb_prestation),2)
ELSE 0::numeric END AS montant_fj,
t_prestations.code AS prestation_code,
type_valorisation_non_facture,
'M'::text || CASE WHEN t_prestations.code <> 'PJ' THEN t_prestations.code ELSE 'PJS' END AS prestation_mcode
FROM activite[PX].p_factures_lignes_c
JOIN activite[PX].t_lieux ON lieu_id = t_lieux.oid
JOIN activite[PX].t_services_facturation ON t_services_facturation.oid = service_facturation_id
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
WHERE date_fin >= '20170701' AND
date_debut >= '20170701' AND
type_t2a = '2' AND
prestation_id = ANY (SELECT to_id FROM activite.t_listes_contenu JOIN activite.t_listes ON liste_id = t_listes.oid AND t_listes.code = 'DMAP_MFS') AND
montant_comptabilise <> 0 AND
montant_comptabilise_1 <> 0 AND
round(prix_unitaire * nb_prestation,2) <> montant_comptabilise AND
abs(round(prix_unitaire * nb_prestation,2)) <> abs(montant_comptabilise)+(nb_prestation*18)
ORDER BY no_facture, prestation_id
;
-- Calcul tarif plein
UPDATE w_moins10 SET
montant_facture_1 =
CASE WHEN prestation_code = 'PJ' OR type_valorisation_non_facture = 'PJ' THEN round(prix_unitaire * nb_prestation * taux_1 / 100,2) - montant_fj
ELSE round(prix_unitaire * nb_prestation * taux_1 / 100,2) END,
montant_facture =
CASE WHEN prestation_code = 'PJ' OR type_valorisation_non_facture = 'PJ' THEN round(prix_unitaire * nb_prestation * taux_1 / 100,2) - montant_fj
ELSE round(prix_unitaire * nb_prestation * taux_1 / 100,2) END +
(montant_facture_2+montant_facture_22+montant_facture_0)
;
-- Génération prestations spécifiques
INSERT INTO activite.t_prestations (code, texte, texte_court)
SELECT prestation_mcode, t_prestations.texte || ' (-10%)', t_prestations.texte || ' (-10%)'
FROM w_moins10
JOIN activite.t_prestations on prestation_id = t_prestations.oid
WHERE prestation_mcode NOT IN (SELECT code FROM activite.t_prestations WHERE code IS NOT NULL)
GROUP BY 1,2,3
;
-- Maj tarif plein
UPDATE activite[PX].p_factures_lignes_c
SET montant_facture = w_moins10.montant_facture, montant_facture_1 = w_moins10.montant_facture_1
FROM w_moins10
WHERE p_factures_lignes_c.CTID = w_moins10.CTID_orig;
;
-- Génération -10%
UPDATE w_moins10 SET
montant_facture = montant_comptabilise - montant_facture,
montant_facture_1 = montant_comptabilise_1 - montant_facture_1,
montant_facture_2 = montant_comptabilise_2 - montant_facture_2,
montant_facture_22 = montant_comptabilise_22 - montant_facture_22,
montant_facture_0 = montant_comptabilise_0 - montant_facture_0,
montant_comptabilise = 0,
montant_comptabilise_1 = 0,
montant_comptabilise_2 = 0,
montant_comptabilise_22 = 0,
montant_comptabilise_0 = 0,
prestation_id = t_prestations.oid
FROM activite.t_prestations
WHERE t_prestations.code = prestation_mcode
;
ALTER TABLE w_moins10 DROP COLUMN CTID_orig;
ALTER TABLE w_moins10 DROP COLUMN montant_fj;
ALTER TABLE w_moins10 DROP COLUMN prestation_code;
ALTER TABLE w_moins10 DROP COLUMN prestation_mcode;
ALTER TABLE w_moins10 DROP COLUMN type_valorisation_non_facture;
INSERT INTO activite[PX].p_factures_lignes_c
SELECT *
FROM w_moins10
WHERE montant_facture <> 0
;
SELECT activite[PX].cti_reorganize_rubrique_facture_c('activite[PX].p_factures_lignes_c');
]]></sqlcmd>
</NODE>
<NODE label="compléments patients">
<sqlcmd><![CDATA[
-- Medecin par patient HM
DROP TABLE IF EXISTS w_PATI_MED_TRT;
CREATE TEMP TABLE w_PATI_MED_TRT AS
SELECT
PATI_NIP,
(MAX(ARRAY[MESE_DAT_DEB::text,MESE_ID_MEDE::text]))[2]::bigint AS MESE_ID_MEDE
FROM prod_hm.IDE_MED_VENUE
JOIN prod_hm.IDE_SEJOUR ON MESE_ID_SEJO = SEJO_ID_SEJO
JOIN prod_hm.IDE_PATIENT ON SEJO_ID_PATI = PATI_ID_PATI
JOIN prod_hm.BAS_CATALOGUE_PERS ON MESE_ID_CAPE = CAPE_ID_CAPE
WHERE CAPE_CODE = '2'
GROUP BY 1;
CREATE INDEX w_PATI_MED_TRT_i1 ON w_PATI_MED_TRT USING btree (PATI_NIP);
-- Médecins traitants
INSERT INTO activite[PX].t_medecins_traitants_administratifs(code_original, code, nom, prenom, specialite_id, no_rpps)
SELECT MEDE_ID_MEDE::bigint,
CASE WHEN MEDE_CODE <> '' AND MEDE_CODE IS NOT NULL THEN MEDE_CODE ELSE MEDE_ID_MEDE::text END AS MEDE_CODE,
MEDE_NOM_USU,
COALESCE(MEDE_PRENOM,'') AS MEDE_PRENOM,
0,
''
FROM prod_hm.IDE_MEDECIN
LEFT JOIN (SELECT MEDI_ID_MEDE, MAX(MEDI_ADELI) AS MEDI_ADELI FROM prod_hm.IDE_MEDECIN_IMMAT WHERE MEDI_ID_ETAB IN ([ID_ETAB]) GROUP BY 1) subview
ON (MEDE_ID_MEDE = MEDI_ID_MEDE)
WHERE MEDE_ID_MEDE IN (SELECT MESE_ID_MEDE FROM w_PATI_MED_TRT) AND
MEDE_ID_MEDE NOT IN (SELECT code_original FROM activite[PX].t_medecins_traitants_administratifs)
;
UPDATE activite[PX].t_medecins_traitants_administratifs SET
code = CASE WHEN MEDE_CODE <> '' AND MEDE_CODE IS NOT NULL THEN MEDE_CODE ELSE MEDE_ID_MEDE::text END,
nom = MEDE_NOM_USU,
prenom = COALESCE(MEDE_PRENOM,'')
FROM prod_hm.IDE_MEDECIN
WHERE t_medecins_traitants_administratifs.code_original = MEDE_ID_MEDE::bigint AND
(
code IS DISTINCT FROM CASE WHEN MEDE_CODE <> '' AND MEDE_CODE IS NOT NULL THEN MEDE_CODE ELSE MEDE_ID_MEDE::text END OR
nom IS DISTINCT FROM MEDE_NOM_USU OR
prenom IS DISTINCT FROM COALESCE(MEDE_PRENOM,'')
)
;
-- maj code rpps
UPDATE activite[PX].t_medecins_traitants_administratifs
SET no_rpps = MEIN_IDE_NATIONALE
FROM prod_hm.IDE_MEDECIN_IDENT_NATIONALE
WHERE code_original = MEIN_ID_MEDE AND
t_medecins_traitants_administratifs.no_rpps IS DISTINCT FROM MEIN_IDE_NATIONALE;
-- maj id médecin_traitant dans séjours
UPDATE activite[PX].p_sejours
SET medecin_traitant_id = t_medecins_traitants_administratifs.oid
FROM w_PATI_MED_TRT
JOIN activite[PX].t_medecins_traitants_administratifs ON t_medecins_traitants_administratifs.code_original = MESE_ID_MEDE
WHERE no_patient = PATI_NIP AND
medecin_traitant_id IS DISTINCT FROM t_medecins_traitants_administratifs.oid;
;
-- ajout des coordonnées par séjour
INSERT INTO activite[PX].p_coordonnees_patient (
sejour_id,
adresse,
code_postal_id,
commune,
telephone_fixe,
telephone_portable,
email
)
WITH
w_TEL AS ( SELECT TELE_ID_OBJ, regexp_replace(TELE_NUM_TEL,'[^0-9]','','g') as TELE_NUM_TEL FROM prod_hm.IDE_TELEPHONE),
w_ADR AS ( SELECT DISTINCT ADRE_ID_OBJ,
last_value(ADRE_LIGNE1) OVER (PARTITION BY ADRE_ID_OBJ ORDER BY ADRE_DAT_MOD rows between unbounded preceding and unbounded following) AS ADRE_LIGNE1,
last_value(ADRE_LIGNE2) OVER (PARTITION BY ADRE_ID_OBJ ORDER BY ADRE_DAT_MOD rows between unbounded preceding and unbounded following) AS ADRE_LIGNE2,
last_value(ADRE_LIGNE3) OVER (PARTITION BY ADRE_ID_OBJ ORDER BY ADRE_DAT_MOD rows between unbounded preceding and unbounded following) AS ADRE_LIGNE3,
last_value(ADRE_COD_POS) OVER (PARTITION BY ADRE_ID_OBJ ORDER BY ADRE_DAT_MOD rows between unbounded preceding and unbounded following) AS ADRE_COD_POS,
last_value(ADRE_VILLE) OVER (PARTITION BY ADRE_ID_OBJ ORDER BY ADRE_DAT_MOD rows between unbounded preceding and unbounded following) AS ADRE_VILLE
FROM prod_hm.IDE_ADRESSE
WHERE ADRE_LIGNE1 != ''
)
SELECT
p_sejours.oid,
ADRE_LIGNE1 || CASE WHEN ADRE_LIGNE2 != '' THEN ' - ' || ADRE_LIGNE2 ELSE '' END || CASE WHEN ADRE_LIGNE3 != '' THEN ' - ' || ADRE_LIGNE3 ELSE '' END,
COALESCE(t_codes_postaux.oid,0),
ADRE_VILLE,
STRING_AGG(CASE WHEN SUBSTR(TELE_NUM_TEL,2,1) IN (1,2,3,4,5,9) THEN TELE_NUM_TEL ELSE null END,','),
STRING_AGG(CASE WHEN SUBSTR(TELE_NUM_TEL,2,1) NOT IN (1,2,3,4,5,9) THEN TELE_NUM_TEL ELSE null END,','),
PATI_EMAIL
FROM activite[PX].p_sejours
JOIN prod_hm.IDE_SEJOUR ON SEJO_ID_SEJO = code_original
JOIN prod_hm.IDE_PATIENT ON SEJO_ID_PATI = PATI_ID_PATI
JOIN w_ADR ON PATI_ID_PATI = ADRE_ID_OBJ
LEFT JOIN base.t_codes_postaux ON ADRE_COD_POS = t_codes_postaux.code
LEFT JOIN w_TEL ON PATI_ID_PATI = TELE_ID_OBJ
GROUP BY 1,2,3,4,7
]]></sqlcmd>
</NODE>
<NODE label="Compléments facture">
<sqlcmd><![CDATA[
ANALYSE activite[PX].p_factures;
ANALYSE activite[PX].p_factures_lignes_h;
DROP TABLE IF EXISTS w_factures;
CREATE TEMP TABLE w_factures AS
SELECT
no_facture,
no_facture_reference,
CASE WHEN date_expedition_0 < date_facture AND date_facture <> '2099-12-31' THEN date_facture ELSE date_expedition_0 END AS date_expedition_0,
CASE WHEN montant_comptabilise_1_c = 0 THEN '00010101' WHEN montant_comptabilise_1_c = montant_regle_1_c THEN date_solde_1_c ELSE '20991231' END AS date_solde,
CASE WHEN montant_comptabilise_1_c = 0 THEN '00010101' WHEN montant_comptabilise_1_c = montant_regle_1_c THEN date_solde_1_c ELSE '20991231' END AS date_solde_c,
CASE WHEN montant_comptabilise_1_h = 0 THEN '00010101' WHEN montant_comptabilise_1_h = montant_regle_1_h THEN date_solde_1_h ELSE '20991231' END AS date_solde_h,
CASE WHEN montant_comptabilise_0_c = 0 THEN '00010101' WHEN montant_comptabilise_0_c = montant_regle_0_c THEN date_solde_0_c ELSE '20991231' END AS date_solde_0_c,
CASE WHEN montant_comptabilise_0_h = 0 THEN '00010101' WHEN montant_comptabilise_0_h = montant_regle_0_h THEN date_solde_0_h ELSE '20991231' END AS date_solde_0_h,
CASE WHEN montant_comptabilise_1_c = 0 THEN '00010101' WHEN montant_comptabilise_1_c = montant_regle_1_c THEN date_solde_1_c ELSE '20991231' END AS date_solde_1_c,
CASE WHEN montant_comptabilise_1_h = 0 THEN '00010101' WHEN montant_comptabilise_1_h = montant_regle_1_h THEN date_solde_1_h ELSE '20991231' END AS date_solde_1_h,
CASE WHEN montant_comptabilise_2_c = 0 THEN '00010101' WHEN montant_comptabilise_2_c = montant_regle_2_c THEN date_solde_2_c ELSE '20991231' END AS date_solde_2_c,
CASE WHEN montant_comptabilise_2_h = 0 THEN '00010101' WHEN montant_comptabilise_2_h = montant_regle_2_h THEN date_solde_2_h ELSE '20991231' END AS date_solde_2_h,
CASE WHEN montant_comptabilise_22_c = 0 THEN '00010101' WHEN montant_comptabilise_22_c = montant_regle_22_c THEN date_solde_22_c ELSE '20991231' END AS date_solde_22_c,
CASE WHEN montant_comptabilise_22_h = 0 THEN '00010101' WHEN montant_comptabilise_22_h = montant_regle_22_h THEN date_solde_22_h ELSE '20991231' END AS date_solde_22_h
FROM activite[PX].p_factures;
UPDATE w_factures SET
date_solde = GREATEST(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_solde_c = GREATEST(date_solde_0_c, date_solde_1_c, date_solde_2_c, date_solde_22_c),
date_solde_h = GREATEST(date_solde_0_h, date_solde_1_h, date_solde_2_h, date_solde_22_h)
WHERE
date_solde IS DISTINCT FROM GREATEST(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) OR
date_solde_c IS DISTINCT FROM GREATEST(date_solde_0_c, date_solde_1_c, date_solde_2_c, date_solde_22_c) OR
date_solde_h IS DISTINCT FROM GREATEST(date_solde_0_h, date_solde_1_h, date_solde_2_h, date_solde_22_h) ;
CREATE INDEX w_factures_i1
ON w_factures
USING btree
(no_facture);
CREATE INDEX w_factures_i2
ON w_factures
USING btree
(no_facture_reference);
DROP TABLE IF EXISTS w_factures_references_soldes;
CREATE TEMP TABLE w_factures_references_soldes AS
SELECT
no_facture_reference,
MAX(date_solde) AS date_solde_reference,
MAX(date_solde_c) AS date_solde_reference_c,
MAX(date_solde_h) AS date_solde_reference_h,
MAX(date_solde_0_c) AS date_solde_reference_0_c,
MAX(date_solde_0_h) AS date_solde_reference_0_h,
MAX(date_solde_1_c) AS date_solde_reference_1_c,
MAX(date_solde_1_h) AS date_solde_reference_1_h,
MAX(date_solde_2_c) AS date_solde_reference_2_c,
MAX(date_solde_2_h) AS date_solde_reference_2_h,
MAX(date_solde_22_c) AS date_solde_reference_22_c,
MAX(date_solde_22_h) AS date_solde_reference_22_h
FROM w_factures
GROUP BY no_facture_reference;
CREATE INDEX w_factures_references_soldes_i1
ON w_factures_references_soldes
USING btree
(no_facture_reference);
UPDATE activite[PX].p_factures
SET
date_expedition_0 = w_factures.date_expedition_0,
date_solde = w_factures.date_solde,
date_solde_c = w_factures.date_solde_c,
date_solde_h = w_factures.date_solde_h,
date_solde_0_c = w_factures.date_solde_0_c,
date_solde_0_h = w_factures.date_solde_0_h,
date_solde_1_c = w_factures.date_solde_1_c,
date_solde_1_h = w_factures.date_solde_1_h,
date_solde_2_c = w_factures.date_solde_2_c,
date_solde_2_h = w_factures.date_solde_2_h,
date_solde_22_c = w_factures.date_solde_22_c,
date_solde_22_h = w_factures.date_solde_22_h,
date_solde_reference = w_factures_references_soldes.date_solde_reference,
date_solde_reference_c = w_factures_references_soldes.date_solde_reference_c,
date_solde_reference_h = w_factures_references_soldes.date_solde_reference_h,
date_solde_reference_0_c = w_factures_references_soldes.date_solde_reference_0_c,
date_solde_reference_0_h = w_factures_references_soldes.date_solde_reference_0_h,
date_solde_reference_1_c = w_factures_references_soldes.date_solde_reference_1_c,
date_solde_reference_1_h = w_factures_references_soldes.date_solde_reference_1_h,
date_solde_reference_2_c = w_factures_references_soldes.date_solde_reference_2_c,
date_solde_reference_2_h = w_factures_references_soldes.date_solde_reference_2_h,
date_solde_reference_22_c = w_factures_references_soldes.date_solde_reference_22_c,
date_solde_reference_22_h = w_factures_references_soldes.date_solde_reference_22_h
FROM w_factures
JOIN w_factures_references_soldes ON w_factures_references_soldes.no_facture_reference = w_factures.no_facture_reference
WHERE p_factures.no_facture = w_factures.no_facture
AND (
p_factures.date_expedition_0 IS DISTINCT FROM w_factures.date_expedition_0 OR
p_factures.date_solde IS DISTINCT FROM w_factures.date_solde OR
p_factures.date_solde_c IS DISTINCT FROM w_factures.date_solde_c OR
p_factures.date_solde_h IS DISTINCT FROM w_factures.date_solde_h OR
p_factures.date_solde_0_c IS DISTINCT FROM w_factures.date_solde_0_c OR
p_factures.date_solde_0_h IS DISTINCT FROM w_factures.date_solde_0_h OR
p_factures.date_solde_1_c IS DISTINCT FROM w_factures.date_solde_1_c OR
p_factures.date_solde_1_h IS DISTINCT FROM w_factures.date_solde_1_h OR
p_factures.date_solde_2_c IS DISTINCT FROM w_factures.date_solde_2_c OR
p_factures.date_solde_2_h IS DISTINCT FROM w_factures.date_solde_2_h OR
p_factures.date_solde_22_c IS DISTINCT FROM w_factures.date_solde_22_c OR
p_factures.date_solde_22_h IS DISTINCT FROM w_factures.date_solde_22_h OR
p_factures.date_solde_reference IS DISTINCT FROM w_factures_references_soldes.date_solde_reference OR
p_factures.date_solde_reference_c IS DISTINCT FROM w_factures_references_soldes.date_solde_reference_c OR
p_factures.date_solde_reference_h IS DISTINCT FROM w_factures_references_soldes.date_solde_reference_h OR
p_factures.date_solde_reference_0_c IS DISTINCT FROM w_factures_references_soldes.date_solde_reference_0_c OR
p_factures.date_solde_reference_0_h IS DISTINCT FROM w_factures_references_soldes.date_solde_reference_0_h OR
p_factures.date_solde_reference_1_c IS DISTINCT FROM w_factures_references_soldes.date_solde_reference_1_c OR
p_factures.date_solde_reference_1_h IS DISTINCT FROM w_factures_references_soldes.date_solde_reference_1_h OR
p_factures.date_solde_reference_2_c IS DISTINCT FROM w_factures_references_soldes.date_solde_reference_2_c OR
p_factures.date_solde_reference_2_h IS DISTINCT FROM w_factures_references_soldes.date_solde_reference_2_h OR
p_factures.date_solde_reference_22_c IS DISTINCT FROM w_factures_references_soldes.date_solde_reference_22_c OR
p_factures.date_solde_reference_22_h IS DISTINCT FROM w_factures_references_soldes.date_solde_reference_22_h
);
-- Suppression des tables de travail non utilisées après
DROP TABLE IF EXISTS w_factures CASCADE;
DROP TABLE IF EXISTS w_factures_references_soldes CASCADE;
-- Elimination des protocoles sur avoirs et factures annulées pour comptage correct
DROP TABLE IF EXISTS w_correction_protocole
;
CREATE TEMP TABLE w_correction_protocole AS
SELECT no_facture_reference,
(MAX(ARRAY[CASE WHEN p_factures_lignes_h.nb_prestation >= 0 THEN '1' ELSE '0' END, date_facture::text,p_factures.no_facture]))[3] AS no_facture_ok,
base.cti_array_accum(DISTINCT p_factures.no_facture) AS facture_array
FROM activite[PX].p_factures
JOIN activite[PX].p_factures_lignes_h ON p_factures.no_facture = p_factures_lignes_h.no_facture
WHERE p_factures.no_facture NOT LIKE '%BG' AND
protocole_id IS NOT NULL AND
protocole_id <> 0
GROUP BY 1
HAVING MIN(p_factures_lignes_h.montant_facture) < 0
;
ANALYSE w_correction_protocole
;
-- Etape internmédiaire pour avoir la colonne facture_array ligne par ligne (pour performance)
DROP TABLE IF EXISTS w_correction_protocole_factures_lignes;
CREATE TEMP TABLE w_correction_protocole_factures_lignes AS
SELECT no_facture_reference,
no_facture_ok,
UNNEST(facture_array::text[]) no_facture_par_ligne
FROM w_correction_protocole
;
ANALYSE w_correction_protocole_factures_lignes
;
UPDATE activite[PX].p_factures_lignes_h
SET protocole_id = 0
FROM w_correction_protocole_factures_lignes
WHERE p_factures_lignes_h.no_facture = no_facture_par_ligne AND
p_factures_lignes_h.no_facture <> no_facture_ok
;
-- Taux pour le budget global (actes inclus)
DROP TABLE IF EXISTS w_sejour_taux1;
CREATE TEMP TABLE w_sejour_taux1 AS
SELECT no_sejour, (MAX(ARRAY[p_factures.date_facture::text, taux_1::text]))[2]::numeric AS taux_1
FROM activite[PX].p_factures_lignes_c
JOIN activite[PX].p_factures ON p_factures_lignes_c.no_facture = p_factures.no_facture
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
WHERE '[ENV_TYPEETS]' <> '1' AND
t_prestations.code = 'GHS' AND
code_facture = '1' AND
p_factures_lignes_c.montant_facture <> 0
GROUP BY 1
;
ANALYSE w_sejour_taux1
;
INSERT INTO w_sejour_taux1
SELECT p_factures.no_sejour, (MAX(ARRAY[p_factures.date_facture::text, p_factures_lignes_c.taux_1::text]))[2]::numeric AS taux_1
FROM activite[PX].p_factures_lignes_c
JOIN activite[PX].p_factures ON p_factures_lignes_c.no_facture = p_factures.no_facture
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
LEFT JOIN w_sejour_taux1 ON p_factures.no_sejour = w_sejour_taux1.no_sejour
WHERE '[ENV_TYPEETS]' <> '1' AND
t_prestations.code = 'PJ' AND
code_facture = '1' AND
p_factures_lignes_c.montant_facture <> 0 AND
w_sejour_taux1.no_sejour IS NULL
GROUP BY 1
;
UPDATE activite[PX].p_factures_lignes_h SET
taux_1 = w_sejour_taux1.taux_1
FROM activite[PX].p_factures
JOIN w_sejour_taux1 ON p_factures.no_sejour = w_sejour_taux1.no_sejour
WHERE p_factures_lignes_h.no_facture = p_factures.no_facture AND
montant_facture_actes_inclus_dans_sejour <> 0 AND
p_factures_lignes_h.taux_1 <> w_sejour_taux1.taux_1
;
DROP TABLE IF EXISTS w_sejour_taux1_div;
CREATE TEMP TABLE w_sejour_taux1_div AS
SELECT no_sejour, acte_id, p_factures_lignes_h.date_debut, medecin_facture_id, MAX(taux_1) AS taux_1
FROM activite[PX].p_factures_lignes_h
JOIN activite[PX].p_factures ON p_factures_lignes_h.no_facture = p_factures.no_facture
WHERE '[ENV_TYPEETS]' <> '1' AND
montant_facture_actes_inclus_dans_sejour <> 0
GROUP BY 1,2,3,4
HAVING count(DISTINCT taux_1) > 1
;
ANALYSE w_sejour_taux1_div
;
UPDATE activite[PX].p_factures_lignes_h SET
taux_1 = w_sejour_taux1_div.taux_1
FROM activite[PX].p_factures
JOIN w_sejour_taux1_div ON p_factures.no_sejour = w_sejour_taux1_div.no_sejour
WHERE p_factures_lignes_h.no_facture = p_factures.no_facture AND
montant_facture_actes_inclus_dans_sejour <> 0 AND
p_factures.no_sejour = w_sejour_taux1_div.no_sejour AND
p_factures_lignes_h.acte_id = w_sejour_taux1_div.acte_id AND
p_factures_lignes_h.date_debut = w_sejour_taux1_div.date_debut AND
p_factures_lignes_h.medecin_facture_id = w_sejour_taux1_div.medecin_facture_id AND
p_factures_lignes_h.taux_1 <> w_sejour_taux1_div.taux_1
;
]]></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
p_sejours.no_sejour,
p_sejours.code_sorti,
p_sejours.date_sortie,
p_sejours.date_groupage,
p_sejours.ghs_id
;
UPDATE activite[PX].p_sejours
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
);
-- Suppression des tables de travail non utilisées après
DROP TABLE IF EXISTS w_sejours_total CASCADE;
]]></sqlcmd>
</NODE>
<NODE label="Tables répliquées">
<condition><![CDATA[
"[PX]" == ""
]]></condition>
<sqlcmd><![CDATA[
]]></sqlcmd>
</NODE>
</NODE>
<NODE name="ENCOURS" label="ENCOURS ET VALORISATION DES NON FACTURES">
<NODE label="Encours HM">
<condition><![CDATA[
SELECT
count(*) = 1
FROM activite.t_divers
WHERE code = 'ENCOURSHM'
AND valeur = 1
;
]]></condition>
<sqlcmd><![CDATA[
DROP TABLE IF EXISTS w_FACT_DAT_DER_CALCUL;
CREATE TEMP TABLE w_FACT_DAT_DER_CALCUL AS
SELECT
date(date_trunc('month', fact_dat_fac) + interval '1 month' - interval '1 day') AS date_encours,
MAX(date(FACT_DAT_DER_CALCUL)) AS FACT_DAT_DER_CALCUL
FROM prod_hm.FAC_FACTURE
WHERE FACT_TYPE = 'E' AND
FACT_DAT_FAC >= '[ENV_ADM_ANNEEDEBUT]1201' AND
FACT_DAT_SUP IS NULL
GROUP BY 1
ORDER BY 1;
CREATE INDEX w_FACT_DAT_DER_CALCUL_i1 ON w_FACT_DAT_DER_CALCUL USING btree (date_encours);
-- encours sur medecins salaries
DROP TABLE IF EXISTS w_factures_encours_salaries;
CREATE TEMP TABLE w_factures_encours_salaries AS
SELECT
LFAC_ID_FACT,
SUM(LFAD_MTT_HOR_DEH + LFAD_MTT_DEH) AS montant_encours_salaries,
SUM(CASE WHEN FACD_ID_ORGA_AMO = 0 AND FACD_ID_ORGA_AMC = 0 THEN LFAD_MTT_HOR_DEH + LFAD_MTT_DEH ELSE 0 END) AS montant_encours_salaries_0,
SUM(CASE WHEN FACD_ID_ORGA_AMO > 0 THEN LFAD_MTT_HOR_DEH + LFAD_MTT_DEH ELSE 0 END) AS montant_encours_salaries_1,
SUM(CASE WHEN FACD_ID_ORGA_AMC > 0 THEN LFAD_MTT_HOR_DEH + LFAD_MTT_DEH ELSE 0 END) AS montant_encours_salaries_2,
0::numeric AS montant_encours_22
FROM prod_hm.FAC_LIGNE_FACTURE
JOIN prod_hm.FAC_LIGNE_FACTURE_DEBITEUR ON LFAD_ID_LFAC = LFAC_ID_LFAC
JOIN prod_hm.FAC_FACTURE_DEBITEUR ON LFAD_ID_FACD = FACD_ID_FACD
WHERE LFAC_ID_PRHO <> 0 AND LFAC_CDT_EXC = 'S'
GROUP BY 1
ORDER BY 1;
CREATE INDEX w_factures_encours_salaries_i1 ON w_factures_encours_salaries USING btree (LFAC_ID_FACT);
-- entetes factures encours
DROP TABLE IF EXISTS w_factures_references;
CREATE TEMP TABLE w_factures_references AS
SELECT
no_sejour,
date_fin,
MIN(date_debut) AS date_debut,
MAX(no_facture) AS no_facture
FROM activite[PX].p_factures
WHERE no_facture_reference = no_facture AND code_facture >= '1'
GROUP BY 1,2;
CREATE INDEX w_factures_references_i1 ON w_factures_references USING btree (no_sejour);
DROP TABLE IF EXISTS w_factures_encours;
CREATE TEMP TABLE w_factures_encours AS
SELECT
0::bigint AS oid,
FACT_ID_FACT,
p_sejours.finess,
p_sejours.no_sejour,
p_sejours.date_entree,
p_sejours.date_sortie,
p_sejours.oid AS sejour_id,
p_sejours.lieu_sortie_id,
COALESCE(w_factures_references.no_facture,'ID' || FACT_ID_FACT) || '.EP' || substr(to_char(date_part('year', w_FACT_DAT_DER_CALCUL.date_encours),'FM0000'),3,2) || to_char(date_part('month', w_FACT_DAT_DER_CALCUL.date_encours),'FM00') AS no_facture,
w_factures_references.no_facture AS no_facture_reference,
date(FACT_DAT_DEB_FAC) AS date_debut,
date(FACT_DAT_FIN_FAC) AS date_fin,
w_FACT_DAT_DER_CALCUL.date_encours,
'P'::text AS code_origine,
CASE WHEN date(FACT_DAT_FIN_FAC) > date_encours OR SEJO_STATUT NOT IN ('S', 'M') OR date(SEJO_DAT_FIN) > date_encours THEN '0' ELSE '1' END AS code_sorti,
p_sejours.tiers_payant_1_id,
p_sejours.tiers_payant_2_id,
p_sejours.tiers_payant_22_id,
p_sejours.tiers_payant_0_id,
p_sejours.ghs_id,
p_sejours.ghs_bebe1_id,
p_sejours.ghs_bebe2_id,
p_sejours.ghs_bebe3_id,
p_sejours.code_cp_demandee,
FACT_MTT_CAI_SEJ + FACT_MTT_MUT_SEJ + FACT_MTT_PAT_SEJ + COALESCE(montant_encours_salaries,0) AS montant_encours_c,
FACT_MTT_PAT_SEJ + COALESCE(montant_encours_salaries_0,0) AS montant_encours_0_c,
FACT_MTT_CAI_SEJ + COALESCE(montant_encours_salaries_1,0) AS montant_encours_1_c,
FACT_MTT_MUT_SEJ + COALESCE(montant_encours_salaries_2,0) 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,
p_sejours.type_sejour
FROM prod_hm.FAC_FACTURE
JOIN w_FACT_DAT_DER_CALCUL ON date(FAC_FACTURE.FACT_DAT_DER_CALCUL) = w_FACT_DAT_DER_CALCUL.FACT_DAT_DER_CALCUL AND
date(date_trunc('month', fact_dat_fac) + interval '1 month' - interval '1 day') = date_encours
JOIN prod_hm.IDE_SEJOUR ON FACT_ID_SEJO = SEJO_ID_SEJO
JOIN activite[PX].p_sejours ON code_original = FACT_ID_SEJO
LEFT JOIN w_factures_references ON p_sejours.no_sejour = w_factures_references.no_sejour AND
date(FACT_DAT_FIN_FAC) BETWEEN w_factures_references.date_debut AND w_factures_references.date_fin
LEFT JOIN w_factures_encours_salaries ON w_factures_encours_salaries.LFAC_ID_FACT = FACT_ID_FACT
WHERE FACT_TYPE = 'E' AND
FACT_ID_ECRI_ENC <> 0
;
CREATE INDEX w_factures_encours_i1 ON w_factures_encours USING btree (FACT_ID_FACT);
SELECT base.cti_disable_index('activite[PX]', 'i_factures_encours_2');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_encours_4');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_encours_5');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_encours_6');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_encours_7');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_encours_8');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_encours_9');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_encours_10');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_encours_11');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_encours_lignes_c_2');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_encours_lignes_c_3');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_encours_lignes_c_4');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_encours_lignes_c_5');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_encours_lignes_c_6');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_encours_lignes_c_7');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_encours_lignes_c_8');
DELETE FROM activite[PX].p_factures_encours WHERE code_origine = 'P';
DELETE FROM activite[PX].p_factures_encours_lignes_c
WHERE NOT EXISTS (
SELECT no_facture FROM activite[PX].p_factures_encours
WHERE p_factures_encours.no_facture = p_factures_encours_lignes_c.no_facture
)
;
SELECT base.cti_disable_index('activite[PX]', 'i_factures_encours_1');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_encours_lignes_c_1');
INSERT INTO activite[PX].p_factures_encours(
sejour_id,
no_sejour,
no_facture,
no_facture_reference,
date_debut,
date_fin,
date_encours,
code_origine,
code_sorti,
tiers_payant_1_id,
tiers_payant_2_id,
tiers_payant_22_id,
tiers_payant_0_id,
ghs_id,
ghs_bebe1_id,
ghs_bebe2_id,
ghs_bebe3_id,
code_cp_demandee,
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,
type_sejour
)
SELECT
sejour_id,
no_sejour,
no_facture,
no_facture_reference,
date_debut,
date_fin,
date_encours,
code_origine,
code_sorti,
tiers_payant_1_id,
tiers_payant_2_id,
tiers_payant_22_id,
tiers_payant_0_id,
ghs_id,
ghs_bebe1_id,
ghs_bebe2_id,
ghs_bebe3_id,
code_cp_demandee,
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,
type_sejour
FROM w_factures_encours;
UPDATE w_factures_encours SET oid = p_factures_encours.oid
FROM activite[PX].p_factures_encours
WHERE w_factures_encours.no_facture = p_factures_encours.no_facture;
SELECT base.cti_enable_index('activite[PX]', 'i_factures_encours_1');
DROP SEQUENCE IF EXISTS w_factures_encours_lignes_c_sequence;
CREATE TEMP SEQUENCE w_factures_encours_lignes_c_sequence;
DROP TABLE IF EXISTS w_factures_encours_lignes_c;
CREATE TEMP TABLE w_factures_encours_lignes_c AS
SELECT
nextval('w_factures_encours_lignes_c_sequence'::regclass) AS oid,
no_sejour,
LFAC_ID_LFAC,
w_factures_encours.oid AS facture_id,
w_factures_encours.no_facture,
w_factures_encours.date_entree,
w_factures_encours.date_sortie,
date(LFAC_DAT_EXE_DEB) AS date_debut,
date(LFAC_DAT_EXE_FIN) AS date_fin,
LFAC_QTE_COEFFICIENT AS nb_rubrique,
1::numeric AS coefficient,
LFAC_COE_MCO_HAD AS coefficient_mco,
COALESCE(t_rubriques_facturation_PRSE.oid,t_rubriques_facturation_PRHO.oid, 0) AS rubrique_facturation_id,
COALESCE(t_rubriques_facturation_PRSE.oid,t_rubriques_facturation_PRHO.oid, 0) AS rubrique_comptabilisation_id,
MAX(COALESCE(t_compte.oid::bigint, 0)) AS compte_produit_id,
COALESCE(t_prestations.oid::bigint, 0) AS prestation_id,
0::numeric AS taux_22,
LFAC_PRI_UNITAIRE AS prix_unitaire,
w_factures_encours.lieu_sortie_id AS lieu_id,
LFAC_QTE_COEFFICIENT AS nb_prestation,
MAX(LFAC_ID_PRSE) AS LFAC_ID_PRSE,
MAX(LFAC_ID_PRHO) AS LFAC_ID_PRHO,
MAX(CASE WHEN FACD_ID_ORGA_AMO = 0 AND FACD_ID_ORGA_AMC = 0 THEN 100-LFAD_TAUX ELSE 0 END) AS taux_0,
MAX(CASE WHEN FACD_ID_ORGA_AMO > 0 THEN LFAD_TAUX ELSE 0 END) AS taux_1,
MAX(CASE WHEN FACD_ID_ORGA_AMC > 0 THEN 100-LFAD_TAUX ELSE 0 END) AS taux_2,
SUM(LFAD_MTT_HOR_DEH + LFAD_MTT_DEH) AS montant_encours,
SUM(CASE WHEN FACD_ID_ORGA_AMO = 0 AND FACD_ID_ORGA_AMC = 0 THEN LFAD_MTT_HOR_DEH + LFAD_MTT_DEH ELSE 0 END) AS montant_encours_0,
SUM(CASE WHEN FACD_ID_ORGA_AMO > 0 THEN LFAD_MTT_HOR_DEH + LFAD_MTT_DEH ELSE 0 END) AS montant_encours_1,
SUM(CASE WHEN FACD_ID_ORGA_AMC > 0 THEN LFAD_MTT_HOR_DEH + LFAD_MTT_DEH ELSE 0 END) AS montant_encours_2,
0::numeric AS montant_encours_22
FROM prod_hm.FAC_LIGNE_FACTURE
JOIN w_factures_encours ON FACT_ID_FACT = LFAC_ID_FACT
JOIN prod_hm.FAC_LIGNE_FACTURE_DEBITEUR ON LFAD_ID_LFAC = LFAC_ID_LFAC
JOIN prod_hm.FAC_FACTURE_DEBITEUR ON LFAD_ID_FACD = FACD_ID_FACD
LEFT JOIN activite[PX].t_rubriques_facturation t_rubriques_facturation_PRSE ON LFAC_ID_PRSE::bigint = t_rubriques_facturation_PRSE.code_original AND LFAC_ID_PRSE <> 0
LEFT JOIN activite[PX].t_rubriques_facturation t_rubriques_facturation_PRHO ON LFAC_ID_PRHO::bigint = t_rubriques_facturation_PRHO.code_original AND LFAC_ID_PRHO <> 0
LEFT JOIN activite.t_prestations ON LFAC_LET_CLE = t_prestations.code
LEFT JOIN w_FAC_LIGNE_FACTURE_DEBITEUR_compte ON LECR_ID_LFAD = LFAD_ID_LFAD
LEFT JOIN activite[PX].t_compte ON (LECR_NUM_COMPTE = t_compte.code_original)
WHERE (LFAC_ID_PRSE <> 0 OR (LFAC_ID_PRHO <> 0 AND LFAC_CDT_EXC = 'S')) AND
LFAD_IND_BGH <> '1' AND
(LFAD_MTT_HOR_DEH + LFAD_MTT_DEH) <> 0
GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,17,18,19,20
ORDER BY 1;
-- Compte par défaut si pas trouvé en compta
DROP TABLE IF EXISTS w_PAD_PRESTATION_SEJOUR;
CREATE TEMP TABLE w_PAD_PRESTATION_SEJOUR AS
SELECT *,
''::text AS CPTE_NUM_COMPTE_defaut,
0::bigint AS compte_id
FROM prod_hm.PAD_PRESTATION_SEJOUR
;
UPDATE w_PAD_PRESTATION_SEJOUR
SET CPTE_NUM_COMPTE_defaut = CPTE_NUM_COMPTE
FROM (SELECT
CPTP_ID_PRSE, (MAX(ARRAY[CPTP_DAT_CRE::text,CPTE_NUM_COMPTE]))[2] AS CPTE_NUM_COMPTE
FROM prod_hm.CCL_COMPTE_PRESTATION
JOIN prod_hm.CCL_COMPTE ON CPTP_ID_CPTE = CPTE_ID_CPTE
WHERE CPTP_ID_PRSE <> 0
GROUP BY 1
) subview
WHERE PRSE_ID_PRSE = CPTP_ID_PRSE
;
UPDATE w_PAD_PRESTATION_SEJOUR
SET CPTE_NUM_COMPTE_defaut = CPTE_NUM_COMPTE
FROM (SELECT
CPTP_ID_CAPR, (MAX(ARRAY[CPTP_DAT_CRE::text,CPTE_NUM_COMPTE]))[2] AS CPTE_NUM_COMPTE
FROM prod_hm.CCL_COMPTE_PRESTATION
JOIN prod_hm.CCL_COMPTE ON CPTP_ID_CPTE = CPTE_ID_CPTE
WHERE CPTP_ID_CAPR <> 0
GROUP BY 1
) subview
WHERE CPTE_NUM_COMPTE_defaut = '' AND
PRSE_ID_CAPR = CPTP_ID_CAPR
;
UPDATE w_PAD_PRESTATION_SEJOUR
SET compte_id = t_compte.oid
FROM activite[PX].t_compte
WHERE CPTE_NUM_COMPTE_defaut = code_original
;
DROP TABLE IF EXISTS w_PAD_PRESTATION_HONORAIRE;
CREATE TEMP TABLE w_PAD_PRESTATION_HONORAIRE AS
SELECT *,
''::text AS CPTE_NUM_COMPTE_defaut,
0::bigint AS compte_id
FROM prod_hm.PAD_PRESTATION_HONORAIRE
;
UPDATE w_PAD_PRESTATION_HONORAIRE
SET CPTE_NUM_COMPTE_defaut = CPTE_NUM_COMPTE
FROM (SELECT
CPTP_ID_PRHO, (MAX(ARRAY[CPTP_DAT_CRE::text,CPTE_NUM_COMPTE]))[2] AS CPTE_NUM_COMPTE
FROM prod_hm.CCL_COMPTE_PRESTATION
JOIN prod_hm.CCL_COMPTE ON CPTP_ID_CPTE = CPTE_ID_CPTE
WHERE CPTP_ID_PRHO <> 0
GROUP BY 1
) subview
WHERE PRHO_ID_PRHO = CPTP_ID_PRHO
;
UPDATE w_PAD_PRESTATION_HONORAIRE
SET CPTE_NUM_COMPTE_defaut = CPTE_NUM_COMPTE
FROM (SELECT
CPTP_ID_CAPR, (MAX(ARRAY[CPTP_DAT_CRE::text,CPTE_NUM_COMPTE]))[2] AS CPTE_NUM_COMPTE
FROM prod_hm.CCL_COMPTE_PRESTATION
JOIN prod_hm.CCL_COMPTE ON CPTP_ID_CPTE = CPTE_ID_CPTE
WHERE CPTP_ID_CAPR <> 0
GROUP BY 1
) subview
WHERE CPTE_NUM_COMPTE_defaut = '' AND
PRHO_ID_CAPR = CPTP_ID_CAPR
;
UPDATE w_PAD_PRESTATION_honoraire
SET compte_id = t_compte.oid
FROM activite[PX].t_compte
WHERE CPTE_NUM_COMPTE_defaut = code_original
;
UPDATE w_factures_encours_lignes_c
SET compte_produit_id = compte_id
FROM w_PAD_PRESTATION_SEJOUR
WHERE LFAC_ID_PRSE <> 0 AND
compte_produit_id = 0 AND
LFAC_ID_PRSE = PRSE_ID_PRSE
;
UPDATE w_factures_encours_lignes_c
SET compte_produit_id = compte_id
FROM w_PAD_PRESTATION_HONORAIRE
WHERE LFAC_ID_PRHO <> 0 AND
compte_produit_id = 0 AND
LFAC_ID_PRHO = PRHO_ID_PRHO
;
DROP TABLE IF EXISTS w_factures_encours_lignes_sup_c;
CREATE TEMP TABLE w_factures_encours_lignes_sup_c AS
SELECT
w_factures_encours_lignes_c.oid AS from_oid,
t_prestations.code AS prestation_code,
date(date_debut) AS date_debut_ghs,
date(date_fin - interval '1 day') AS date_fin_ghs,
(date(date_fin) - date(date_debut)) * CASE WHEN nb_prestation < 0 THEN -1 ELSE 1 END AS nb_prestation_ghs,
CASE WHEN t_prestations.code = 'GHS' THEN date(w_factures_encours_lignes_c.date_entree + interval '1 day') ELSE date(w_factures_encours_lignes_c.date_debut + interval '1 day') END AS date_debut_det,
CASE WHEN t_prestations.code = 'GHS' THEN date(w_factures_encours_lignes_c.date_sortie - interval '1 day') ELSE date(w_factures_encours_lignes_c.date_debut + ((ABS(nb_prestation)-1) || ' day')::interval) END AS date_fin_det,
ABS(CASE WHEN t_prestations.code = 'GHS' THEN date(w_factures_encours_lignes_c.date_sortie) - date(w_factures_encours_lignes_c.date_entree) ELSE nb_prestation END) AS nb_det,
w_factures_encours_lignes_c.*
FROM w_factures_encours_lignes_c
JOIN activite[PX].p_sejours ON w_factures_encours_lignes_c.no_sejour = p_sejours.no_sejour
JOIN activite.t_prestations ON prestation_id = t_prestations.oid AND
(
code IN ('PJ', 'PJ1', 'PJ2', '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_fin) - date(date_debut) > 1)) ;
UPDATE w_factures_encours_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_encours_lignes_c
JOIN activite.t_prestations ON prestation_id = t_prestations.oid AND code = 'EXH'
GROUP BY 1) subview
WHERE w_factures_encours_lignes_sup_c.no_facture = subview.no_facture;
CREATE INDEX w_factures_encours_lignes_sup_c_i1
ON w_factures_encours_lignes_sup_c
USING btree
(date_debut);
DROP TABLE IF EXISTS w_factures_encours_lignes_sup_c_gen;
CREATE TEMP TABLE w_factures_encours_lignes_sup_c_gen AS
SELECT
from_oid,
''::text AS finess,
no_sejour,
no_facture,
facture_id,
date AS date_debut,
date AS date_fin,
lieu_id,
rubrique_facturation_id,
rubrique_comptabilisation_id,
compte_produit_id,
prestation_id,
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,
prix_unitaire,
oid,
taux_0,
taux_1,
taux_2,
taux_22,
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
FROM w_factures_encours_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_encours_lignes_sup_c_gen_tot;
CREATE TEMP TABLE w_factures_encours_lignes_sup_c_gen_tot AS
SELECT from_oid,
SUM(nb_rubrique) AS nb_rubrique,
SUM(nb_prestation) AS nb_prestation,
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
FROM w_factures_encours_lignes_sup_c_gen
GROUP BY 1;
UPDATE w_factures_encours_lignes_c
SET
date_fin = w_factures_encours_lignes_c.date_debut,
nb_rubrique = w_factures_encours_lignes_c.nb_rubrique - w_factures_encours_lignes_sup_c_gen_tot.nb_rubrique,
nb_prestation = w_factures_encours_lignes_c.nb_prestation - w_factures_encours_lignes_sup_c_gen_tot.nb_prestation,
montant_encours = w_factures_encours_lignes_c.montant_encours - w_factures_encours_lignes_sup_c_gen_tot.montant_encours,
montant_encours_0 = w_factures_encours_lignes_c.montant_encours_0 - w_factures_encours_lignes_sup_c_gen_tot.montant_encours_0,
montant_encours_1 = w_factures_encours_lignes_c.montant_encours_1 - w_factures_encours_lignes_sup_c_gen_tot.montant_encours_1,
montant_encours_2 = w_factures_encours_lignes_c.montant_encours_2 - w_factures_encours_lignes_sup_c_gen_tot.montant_encours_2,
montant_encours_22 = w_factures_encours_lignes_c.montant_encours_22 - w_factures_encours_lignes_sup_c_gen_tot.montant_encours_22
FROM w_factures_encours_lignes_sup_c_gen_tot
WHERE w_factures_encours_lignes_c.oid = from_oid;
INSERT INTO w_factures_encours_lignes_c(
oid,
no_sejour,
facture_id,
no_facture,
date_debut,
date_fin,
nb_rubrique,
coefficient,
coefficient_mco,
rubrique_facturation_id,
rubrique_comptabilisation_id,
compte_produit_id,
prestation_id,
taux_0,
taux_1,
taux_2,
taux_22,
prix_unitaire,
lieu_id,
nb_prestation,
montant_encours,
montant_encours_0,
montant_encours_1,
montant_encours_2,
montant_encours_22)
SELECT
nextval('w_factures_encours_lignes_c_sequence'::regclass) AS oid,
no_sejour,
facture_id,
no_facture,
date_debut,
date_fin,
nb_rubrique,
coefficient,
coefficient_mco,
rubrique_facturation_id,
rubrique_comptabilisation_id,
compte_produit_id,
prestation_id,
taux_0,
taux_1,
taux_2,
taux_22,
prix_unitaire,
lieu_id,
nb_prestation,
montant_encours,
montant_encours_0,
montant_encours_1,
montant_encours_2,
montant_encours_22
FROM w_factures_encours_lignes_sup_c_gen;
UPDATE w_factures_encours_lignes_c
SET lieu_id = p_mouvements_sejour.lieu_id
FROM activite[PX].p_mouvements_sejour
WHERE w_factures_encours_lignes_c.no_sejour = p_mouvements_sejour.no_sejour AND
w_factures_encours_lignes_c.date_debut = p_mouvements_sejour.date AND
(p_mouvements_sejour.heure_fin = 240000 OR p_mouvements_sejour.nb_sorties_directes = 1) AND
w_factures_encours_lignes_c.lieu_id IS DISTINCT FROM p_mouvements_sejour.lieu_id;
INSERT INTO activite[PX].p_factures_encours_lignes_c(
facture_id,
no_facture,
date_debut,
date_fin,
nb_rubrique,
coefficient,
coefficient_mco,
rubrique_facturation_id,
rubrique_comptabilisation_id,
compte_produit_id,
prestation_id,
taux_0,
taux_1,
taux_2,
taux_22,
prix_unitaire,
lieu_id,
nb_prestation,
montant_encours,
montant_encours_0,
montant_encours_1,
montant_encours_2,
montant_encours_22
)
SELECT
facture_id,
no_facture,
date_debut,
date_fin,
nb_rubrique,
coefficient,
coefficient_mco,
rubrique_facturation_id,
rubrique_comptabilisation_id,
compte_produit_id,
prestation_id,
taux_0,
taux_1,
taux_2,
taux_22,
prix_unitaire,
lieu_id,
nb_prestation,
montant_encours,
montant_encours_0,
montant_encours_1,
montant_encours_2,
montant_encours_22
FROM w_factures_encours_lignes_c;
SELECT base.cti_vacuum_table('activite[PX]','p_factures_encours');
SELECT base.cti_vacuum_table('activite[PX]','p_factures_encours_lignes_c');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_encours_lignes_c_1');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_encours_lignes_c_2');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_encours_lignes_c_3');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_encours_lignes_c_4');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_encours_lignes_c_5');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_encours_lignes_c_6');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_encours_lignes_c_7');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_encours_lignes_c_8');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_encours_2');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_encours_4');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_encours_5');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_encours_6');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_encours_7');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_encours_8');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_encours_9');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_encours_10');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_encours_11');
-- Correction pour factures encours HM en double
UPDATE activite[PX].p_factures_encours
SET no_facture = p_factures_encours.no_facture ||'('||nb::text||')'
FROM
(
SELECT no_facture, count(*) AS nb, MAX(oid) AS oid_dup
FROM activite[PX].p_factures_encours
WHERE p_factures_encours.code_origine = 'P'
GROUP BY 1
HAVING count(*) > 1
) subview
WHERE p_factures_encours.no_facture = subview.no_facture AND
p_factures_encours.oid = subview.oid_dup
;
UPDATE activite[PX].p_factures_encours_lignes_c
SET facture_id = p_factures_encours.oid
FROM activite[PX].p_factures_encours
WHERE p_factures_encours.no_facture = p_factures_encours_lignes_c.no_facture AND
p_factures_encours.code_origine = 'P' AND
facture_id <> p_factures_encours.oid
;
-- Suppression des tables de travail non utilisées après
DROP TABLE IF EXISTS w_factures_encours_salaries CASCADE;
DROP TABLE IF EXISTS w_factures_references CASCADE;
DROP TABLE IF EXISTS w_FAC_FACTURE_DAT_CRE CASCADE;
DROP TABLE IF EXISTS w_factures_encours CASCADE;
DROP TABLE IF EXISTS w_factures_encours_lignes_c CASCADE;
DROP TABLE IF EXISTS w_factures_encours_lignes_sup_c CASCADE;
DROP TABLE IF EXISTS w_factures_encours_lignes_sup_c_gen CASCADE;
DROP TABLE IF EXISTS w_factures_encours_lignes_sup_c_gen_tot CASCADE;
]]></sqlcmd>
</NODE>
</NODE>
</ROOT>