= '[ENV_ADM_ANNEEDEBUT]0101') sub, (SELECT greatest( max(CASE WHEN DATEENTREE <= now() THEN DATEENTREE ELSE '1900-01-01' END), max(CASE WHEN DATESORTIE <= now() THEN DATESORTIE ELSE '1900-01-01' END)) as max_sej FROM prod_mederi.KDOSSIER WHERE TYPDOS != 4 AND DATEENTREE >= '[ENV_ADM_ANNEEDEBUT]0101' ) sub2; -- Corrections TP UPDATE prod_mederi.KDOSSIER SET COORGDEST = subview.COORGDEST FROM (SELECT substr(COORGDEST,1,10) AS COORGDEST10, MAX(COORGDEST) AS COORGDEST, count(*) FROM prod_mederi.KORGDEST WHERE LENGTH(COORGDEST) > 10 GROUP BY 1) subview WHERE KDOSSIER.COORGDEST = subview.COORGDEST10 ; UPDATE prod_mederi.KDOSSIER SET COORGDEST = 'PATIENT' WHERE COALESCE(COORGDEST,'') = '' AND 'PATIENT' IN (SELECT trim(COORGDEST) FROM prod_mederi.KORGDEST WHERE COORGDEST LIKE 'PAT%') ; -- Corrections RSS DROP TABLE IF EXISTS w_KRSS; CREATE TEMP TABLE w_KRSS AS SELECT * FROM prod_mederi.KRSS ; ANALYSE w_KRSS ; DELETE FROM w_KRSS USING ( SELECT K5CLEUNIK, count(*), (MAX(ARRAY[RSSCMDGHM, RSSSORT::text, CTID::text]))[3]::TID AS keep_CTID FROM w_KRSS GROUP BY 1 HAVING count(*) > 1 ) subview WHERE w_KRSS.K5CLEUNIK = subview.K5CLEUNIK AND w_KRSS.CTID <> subview.keep_CTID ; DELETE FROM w_KRSS USING ( SELECT NODOSSIER, count(*), (MAX(ARRAY[RSSCMDGHM, RSSSORT::text, K5CLEUNIK::text, CTID::text]))[4]::TID AS keep_CTID FROM w_KRSS GROUP BY 1 HAVING count(*) > 1 ) subview WHERE w_KRSS.NODOSSIER = subview.NODOSSIER AND w_KRSS.CTID <> subview.keep_CTID ; -- vérifications des séjours DROP TABLE IF EXISTS w_DOSSIER; CREATE TEMP TABLE w_DOSSIER AS SELECT date_extraction, NOFITNESS, KDOSSIER.* , COALESCE(DATESORTIE, '20991231') AS date_sortie, 'N'::text AS CTI_OK, ''::text AS dup_type_sejour, '0'::text AS dup_code_prevu, 0::bigint AS dup_sejour_id, 0::bigint AS dup_medecin_sejour_id, ''::text AS dup_etat, rank() OVER (PARTITION BY KDOSSIER.NODOSSIER ORDER BY DATESORTIE, HEURESOR, K5CLEUNIK) as rank, K5CLEUNIK FROM w_periode,prod_mederi.KDOSSIER LEFT JOIN w_KRSS KRSS ON KDOSSIER.NODOSSIER = KRSS.NODOSSIER , prod_mederi.ETABLI --LEFT JOIN prod_mederi.ETABLI ON KDOSSIER.NOETABLI = ETABLI.NOETABLI WHERE KDOSSIER.NODOSSIER IS NOT NULL AND DATEENTREE IS NOT NULL AND ( COALESCE(DATESORTIE,RSSSORT,'20991231') >= '[ENV_ADM_ANNEEDEBUT]0101' OR KDOSSIER.NODOSSIER IN (SELECT NODOSSIER FROM w_KFACTURE KFACTURE WHERE DATEFAC >= '[ENV_ADM_ANNEEDEBUT]0101' OR DATECOMPTA >= '[ENV_ADM_ANNEEDEBUT]0101' OR DATECOMPTA IS NULL) OR KDOSSIER.NODOSSIER IN (SELECT NODOSSIER FROM w_KREGL KREGL WHERE DATE >= '[ENV_ADM_ANNEEDEBUT]0101' OR DATECOMPTA >= '[ENV_ADM_ANNEEDEBUT]0101' ) ) ORDER BY NODOSSIER, K5CLEUNIK; ANALYSE w_DOSSIER ; -- Suppression des séjours sans mouvemlent, sans facture, sans reglement DELETE FROM w_dossier WHERE NODOSSIER NOT IN (SELECT KSEJOUR.NODOSSIER FROM prod_mederi.KSEJOUR WHERE KSEJOUR.NODOSSIER IS NOT NULL) AND NODOSSIER NOT IN (SELECT KFACTURE.NODOSSIER FROM prod_mederi.KFACTURE WHERE KFACTURE.NODOSSIER IS NOT NULL) AND NODOSSIER NOT IN (SELECT KRGLDET.NODOSSIER FROM prod_mederi.KRGLDET WHERE KRGLDET.NODOSSIER IS NOT NULL) ; -- Heure entrée non saisie UPDATE w_DOSSIER SET HEUREENT = '08:00:00' WHERE HEUREENT IS NULL AND DATEENTREE = DATESORTIE AND HEURESOR > '08:00:00' ; UPDATE w_DOSSIER SET HEUREENT = '07:00:00' WHERE HEUREENT IS NULL AND DATEENTREE = DATESORTIE AND HEURESOR >= '07:00:00' ; -- date entrée > datedeb UPDATE w_DOSSIER SET DATEENTREE = KSEJOUR.DATEDEB, HEUREENT = KSEJOUR.HEUREDEB FROM prod_mederi.KSEJOUR WHERE DATEENTREE > w_DOSSIER.DATEDEB AND KSEJOUR.NODOSSIER = w_DOSSIER.NODOSSIER AND w_DOSSIER.DATEDEB = KSEJOUR.DATEDEB; UPDATE w_DOSSIER SET NODOSSIER = NODOSSIER || '_' || rank WHERE rank != 1; -- modification de la table des rss pour prendre en compte les rss multiples par séjour UPDATE w_KRSS KRSS SET NODOSSIER = w_DOSSIER.NODOSSIER FROM w_DOSSIER WHERE KRSS.K5CLEUNIK = w_DOSSIER.K5CLEUNIK ; CREATE INDEX w_dossier_i1 ON w_dossier USING btree (NODOSSIER); ANALYSE W_DOSSIER; -- Numéros de factures en double ]]> '') ; DROP TABLE IF EXISTS w_prod_mederi_knip_2 ; CREATE TEMP TABLE w_prod_mederi_knip_2 AS SELECT NIP, NOMPAT, PRENOMPAT, MAX(NOMJFILLE) AS NOMJFILLE, SEXE, DATENAIS, NOMUSUEL, MAX(NIPEXT) AS NIPEXT, NOSS, CLESS, INSC, MAX(NICLEUNIK) AS NICLEUNIK FROM w_prod_mederi_knip GROUP BY NIP, NOMPAT, PRENOMPAT, SEXE, DATENAIS, NOMUSUEL, NOSS, CLESS, INSC ; DROP TABLE IF EXISTS w_prod_mederi_knip_3 ; CREATE TEMP TABLE w_prod_mederi_knip_3 AS SELECT NIP, NIP AS NIP2, NOMPAT, PRENOMPAT, NOMJFILLE, SEXE, DATENAIS, NOMUSUEL, NIPEXT, NOSS, CLESS, INSC, MAX(NICLEUNIK) AS NICLEUNIK FROM w_prod_mederi_knip_2 GROUP BY NIP, NOMPAT, PRENOMPAT, NOMJFILLE, SEXE, DATENAIS, NOMUSUEL, NIPEXT, NOSS, CLESS, INSC ; UPDATE w_prod_mederi_knip_3 SET NOMUSUEL = NOMPAT WHERE NOMUSUEL IS NULL ; -- Cas de NIP en double UPDATE w_prod_mederi_knip_3 SET NIP2 = subview.to_NIP2 FROM ( SELECT NIP2, MAX(NICLEUNIK) AS NICLEUNIK, MAX(NIP)||'-'||count(*)::text AS to_NIP2 FROM w_prod_mederi_knip_3 GROUP BY 1 HAVING count(*) > 1 ) subview WHERE w_prod_mederi_knip_3.NICLEUNIK = subview.NICLEUNIK ; INSERT INTO activite[PX].p_patients(finess, no_patient, nom, prenom, date_naissance, code_sexe) SELECT '', NIP2, MAX(NOMUSUEL), max(PRENOMPAT), date(MAX(DATENAIS)), MAX(sexe) FROM w_prod_mederi_knip_3 LEFT JOIN activite[PX].p_patients ON (NIP = p_patients.no_patient) WHERE p_patients.no_patient IS NULL and NIP IS NOT NULL GROUP BY 2 ; UPDATE activite[PX].p_patients SET nom = NOMUSUEL, prenom = PRENOM, date_naissance = date(DATENAIS), code_sexe = SEXE FROM w_prod_mederi_knip_3 WHERE p_patients.no_patient = NIP2 AND ( p_patients.nom IS DISTINCT FROM NOMUSUEL OR p_patients.prenom IS DISTINCT FROM PRENOMPAT OR p_patients.date_naissance IS DISTINCT FROM date(DATENAIS) OR p_patients.code_sexe IS DISTINCT FROM SEXE ); ]]> 0) GROUP BY 1; ALTER TABLE w_PEC_DOSSIER ADD CONSTRAINT w_PEC_DOSSIER_pkey PRIMARY KEY(NODOSSIER); DROP TABLE IF EXISTS w_sejours; CREATE TEMP TABLE w_sejours AS SELECT CASE WHEN DATEENTREE > now() THEN 'W' || w_DOSSIER.NODOSSIER ELSE w_DOSSIER.NODOSSIER END as no_sejour, w_DOSSIER.NODOSSIER as code_original, NIP as no_patient, DATEENTREE as date_entree, replace(HEUREENT,':','')::bigint as heure_entree, CASE WHEN DATESORTIE IS NOT NULL THEN DATESORTIE ELSE '20991231'::date END as date_sortie, replace(HEURESOR,':','')::numeric as heure_sortie, w_DOSSIER.SEXE as code_sexe, 0 AS age, CASE WHEN DATESORTIE <= date(now()) THEN 1 ELSE 0 END as code_sorti, CASE WHEN TYPDOS = 4 OR DATEENTREE > now() THEN 1 ELSE 0 END as code_prevu, CASE WHEN TYPDOS = 1 THEN 1::int WHEN TYPDOS = 2 THEN 3::int WHEN TYPDOS = 3 THEN CASE WHEN RSSCMDGHM LIKE '28%' THEN 5::int ELSE 2::int END WHEN TYPDOS = 6 THEN 3::int WHEN TYPDOS = 4 AND DATEENTREE = DATEPREV THEN 9::int WHEN TYPDOS = 4 AND DATEENTREE != DATEPREV THEN 9::int ELSE 1::int END as type_sejour, COALESCE(t_medecins_administratifs.oid,0) as medecin_sejour_id, 0 as ghs_id, '20991231'::date as date_groupage, CASE WHEN DUREECP > 1 THEN 1 ELSE 0 END AS code_cp_demandee, 0 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, 0 AS tiers_payant_22_id, 0 AS est_budget_global, -- seulement pour privé pour l'instant w_DOSSIER.NOFITNESS as finess FROM w_DOSSIER LEFT JOIN w_KRSS KRSS ON w_DOSSIER.NODOSSIER = KRSS.NODOSSIER LEFT JOIN activite[PX].t_medecins_administratifs ON w_DOSSIER.NOPRAT = t_medecins_administratifs.code_original JOIN w_PEC_DOSSIER ON w_PEC_DOSSIER.NODOSSIER = w_DOSSIER.NODOSSIER ; 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::int 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') AND t_sejour.type_sejour is not NULL ; 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::int, 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, finess = w_sejours.finess 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 OR w_sejours.finess IS DISTINCT FROM p_sejours.finess ); 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, finess ) 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::char(1), w_sejours.age, w_sejours.code_sorti, w_sejours.code_prevu, w_sejours.type_sejour::char(1), w_sejours.medecin_sejour_id, w_sejours.ghs_id, w_sejours.date_groupage, w_sejours.type_sejour::char(1), w_sejours.mode_traitement_id, w_sejours.mode_entree::char(1), w_sejours.provenance::char(1), w_sejours.mode_sortie::char(1), w_sejours.destination::char(1), w_sejours.tiers_payant_0_id, w_sejours.tiers_payant_1_id, w_sejours.tiers_payant_2_id, w_sejours.tiers_payant_22_id, w_sejours.est_budget_global, w_sejours.finess 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 es selon mouvements (1:entree, 10: sortie 2,11,3) a priori 1 seul enregistrement avec 1 ou 10 mais au cas ou... UPDATE activite[PX].p_sejours SET mode_entree = MPMSI::text, provenance = CASE WHEN char_length(CPMSI) > 1 THEN '0' ELSE CPMSI END FROM prod_mederi.KSEJOUR_MVT WHERE no_sejour = NODOSSIER AND TYPEMVT = 1; UPDATE activite[PX].p_sejours SET mode_sortie = MPMSI::text, destination = CASE WHEN char_length(CPMSI) > 1 THEN '0' ELSE CPMSI END FROM prod_mederi.KSEJOUR_MVT WHERE no_sejour = NODOSSIER AND TYPEMVT = 10; -- Modes entrée sortie selon PMSI MCO UPDATE activite[PX].p_sejours SET mode_entree = KRUM.MODEENTREE, provenance = RIGHT(KRUM.PROVENANCE,1) FROM prod_mederi.KRUM WHERE no_sejour = NODOSSIER AND RSSNO = '01'; DROP TABLE IF EXISTS w_mode_sortie; CREATE TEMP TABLE w_mode_sortie AS SELECT NODOSSIER, (MAX(Array[RSSNO::text, RIGHT(MODESORTIE::text,1)]))[2] as mode, (MAX(Array[RSSNO::text, RIGHT(KRUM.DESTINATION,1)]))[2] as des FROM prod_mederi.KRUM GROUP BY NODOSSIER; UPDATE activite[PX].p_sejours SET mode_sortie = mode, destination = des FROM w_mode_sortie WHERE no_sejour = NODOSSIER; -- Etablissements de provenance et destination -- insertion nouveaux etablissements DROP TABLE IF EXISTS w_ETAB; CREATE TEMP TABLE w_ETAB AS SELECT HOPITAL.*,t_etablissements.code FROM prod_mederi.HOPITAL LEFT JOIN base.t_etablissements ON CODEHOPIT = t_etablissements.code WHERE CODEHOPIT = ANY(array(SELECT NOANEST FROM w_DOSSIER)::text[]) OR CODEHOPIT = ANY(array(SELECT HOPITSORTIE FROM w_DOSSIER)::text[]); INSERT INTO base.t_etablissements ( code, texte, texte_court ) SELECT CODEHOPIT, NOM, NOM FROM w_ETAB WHERE code IS NULL; -- rechargements des etablissements DROP TABLE IF EXISTS w_ETAB; CREATE TEMP TABLE w_ETAB AS SELECT CODEHOPIT, t_etablissements.* FROM prod_mederi.HOPITAL LEFT JOIN base.t_etablissements ON CODEHOPIT = 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 DATEENTREE > now() THEN 'W' || NODOSSIER ELSE NODOSSIER END as no_sejour, pro.oid as oid_pro, des.oid as oid_des FROM w_DOSSIER LEFT JOIN w_ETAB as pro ON w_DOSSIER.NOANEST = pro.CODEHOPIT LEFT JOIN w_ETAB as des ON w_DOSSIER.HOPITSORTIE = des.CODEHOPIT WHERE NOANEST IS NOT NULL OR HOPITSORTIE IS NOT NULL; INSERT INTO activite[PX].p_sejours_transferts( sejour_id, provenance_id, destination_id ) SELECT p_sejours.oid, oid_pro, oid_des FROM activite[PX].p_sejours JOIN w_TRANS ON w_TRANS.no_sejour = p_sejours.no_sejour; -- ghm et ghs DROP TABLE IF EXISTS w_KRSSLOG; CREATE TEMP TABLE w_KRSSLOG AS SELECT KRSS.NODOSSIER, COALESCE(MIN(CASE WHEN KRSSLOG.GHM <> '' AND PMSI_DEXPORT >= RSSSORT AND KRSSLOG.GHM = KRSS.RSSCMDGHM THEN date(PMSI_DEXPORT) ELSE NULL END),'20991231') AS PMSI_DEXPORT, (MAX(Array[PMSI_DEXPORT::text, VERROUAP::text]))[2] AS VERROUAP, (MAX(Array[PMSI_DEXPORT::text, GHM::text]))[2] AS GHM FROM prod_mederi.KRSSLOG JOIN w_KRSS KRSS ON KRSS.RSSNR = KRSSLOG.RSSNR GROUP BY 1 ; UPDATE activite[PX].p_sejours SET ghs_id = COALESCE(t_ghs.oid,0), ghm_id = COALESCE(t_ghm.oid,0), date_groupage = CASE WHEN GHM IS NOT NULL THEN date(PMSI_DEXPORT) ELSE '20991231' END FROM w_DOSSIER JOIN w_KRSSLOG ON w_DOSSIER.NODOSSIER = w_KRSSLOG.NODOSSIER LEFT JOIN base.t_ghs ON VERROUAP = t_ghs.code LEFT JOIN base.t_ghm ON GHM = t_ghm.code AND t_ghm.code NOT LIKE '90%' WHERE p_sejours.code_original = w_DOSSIER.NODOSSIER 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 GHM IS NULL THEN date(PMSI_DEXPORT) ELSE '20991231' END ) ; -- Code postal ? UPDATE activite[PX].p_sejours SET code_postal_id = t_codes_postaux.oid FROM w_DOSSIER JOIN base.t_codes_postaux ON CPPAT = t_codes_postaux.code WHERE code_original = NODOSSIER AND p_sejours.code_postal_id IS DISTINCT FROM t_codes_postaux.oid; -- Type séance d'après GHM (dans création directement) -- 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_PEC_DOSSIER.matricule_1,1,30), p_sejours.tiers_payant_2_id, substr(w_PEC_DOSSIER.matricule_2,1,30), p_sejours.tiers_payant_22_id, ''::text AS matricule_22 FROM w_PEC_DOSSIER JOIN activite[PX].p_sejours ON code_original = NODOSSIER 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'); -- Suppression des tables de travail non utilisées après DROP TABLE IF EXISTS w_PEC_DOSSIER; ]]> '08:00:00' ; UPDATE w_KSEJOUR SET HEUREDEB = '07:00:00' WHERE HEUREDEB IS NULL AND HEUREFIN > '07:00:00' ; -- Correction heures dossier nulles UPDATE w_DOSSIER KDOSSIER SET HEUREENT = subview.HEUREDEB FROM ( SELECT KDOSSIER.NODOSSIER, MIN(KSEJOUR.HEUREDEB) AS HEUREDEB FROM w_DOSSIER KDOSSIER JOIN w_KSEJOUR KSEJOUR ON KDOSSIER.NODOSSIER = KSEJOUR.NODOSSIER AND KDOSSIER.DATEENTREE = KSEJOUR.DATEDEB WHERE HEUREENT IS NULL AND HEUREDEB IS NOT NULL GROUP BY 1 ) subview WHERE KDOSSIER.NODOSSIER = subview.NODOSSIER ; UPDATE w_DOSSIER KDOSSIER SET HEURESOR = subview.HEUREFIN FROM ( SELECT KDOSSIER.NODOSSIER, MAX(KSEJOUR.HEUREFIN) AS HEUREFIN FROM w_DOSSIER KDOSSIER JOIN w_KSEJOUR KSEJOUR ON KDOSSIER.NODOSSIER = KSEJOUR.NODOSSIER AND KDOSSIER.DATESORTIE = KSEJOUR.DATEFIN WHERE HEURESOR IS NULL AND HEUREFIN IS NOT NULL GROUP BY 1 ) subview WHERE KDOSSIER.NODOSSIER = subview.NODOSSIER ; -- L'heure de début du premier mouvement et l'heure de fin du dernier mouvement sont parfois différentes de l'heure d'entrée et de sortie du dossier. -- On les fait correspondre UPDATE w_ksejour SET datefin = subview.datefin, heurefin = subview.heurefin FROM ( SELECT ksejour.nodossier, ((MAX(ARRAY[ksejour.datefin::text, ksejour.heurefin, secleunik])))[3]::numeric AS secleunik, MAX(KDOSSIER.datesortie) AS datefin, ((MAX(ARRAY[KDOSSIER.datesortie::text, KDOSSIER.heuresor])))[2] AS heurefin FROM prod_mederi.KDOSSIER JOIN w_ksejour ksejour ON KDOSSIER.nodossier = ksejour.nodossier WHERE heurefin IS NOT NULL GROUP BY 1 HAVING MAX(kdossier.datesortie) <> MAX(ksejour.datefin) OR ((MAX(ARRAY[datefin::text, heurefin])))[2] <> ((MAX(ARRAY[ksejour.datefin::text, ksejour.heurefin])))[2] ) subview WHERE w_ksejour.secleunik = subview.secleunik ; UPDATE w_ksejour SET datedeb = subview.dateentree, heuredeb = subview.heureent FROM ( SELECT ksejour.nodossier, ((MIN(ARRAY[ksejour.datedeb::text, ksejour.heuredeb, secleunik])))[3]::numeric AS secleunik, MIN(KDOSSIER.dateentree) AS dateentree, ((MIN(ARRAY[KDOSSIER.dateentree::text, KDOSSIER.heureent])))[2] AS heureent FROM prod_mederi.KDOSSIER JOIN w_ksejour ksejour ON KDOSSIER.nodossier = ksejour.nodossier GROUP BY 1 HAVING MIN(KDOSSIER.dateentree) <> MIN(ksejour.datedeb) OR ((MIN(ARRAY[dateentree::text, heureent])))[2] <> ((MIN(ARRAY[ksejour.datedeb::text, ksejour.heuredeb])))[2] ) subview WHERE w_ksejour.secleunik = subview.secleunik ; DROP TABLE IF EXISTS w_MOUVEMENT; CREATE TEMP TABLE w_MOUVEMENT AS SELECT row_number() OVER (PARTITION BY 1 ORDER BY KSEJOUR.NODOSSIER,KSEJOUR.DATEDEB, KSEJOUR.HEUREDEB) AS sequence, KSEJOUR.NODOSSIER, 0 as RSSBEBE, (to_char(KSEJOUR.DATEDEB,'YYYY-MM-DD ') || KSEJOUR.HEUREDEB::text)::timestamp AS DATEDEB, date(KSEJOUR.DATEDEB) AS DATEDEB_DAT, replace(KSEJOUR.HEUREDEB,':','')::numeric(6,0) AS HEUREDEB, (to_char(COALESCE(KSEJOUR.DATEFIN,'20991231'),'YYYY-MM-DD ') || COALESCE(KSEJOUR.HEUREFIN,'240000')::text)::timestamp AS DATEFIN, COALESCE(KSEJOUR.DATEFIN,'20991231') AS DATEFIN_DAT, replace(COALESCE(KSEJOUR.HEUREFIN,'240000'),':','')::numeric(6,0) AS HEUREFIN, CASE WHEN KSEJOUR.DATEDEB = DATEENTREE AND KSEJOUR.HEUREDEB = HEUREENT THEN 'E' WHEN KSEJOUR.DATEFIN = DATESORTIE AND KSEJOUR.HEUREFIN = HEURESOR THEN 'S' ELSE '0' END AS TYPEMVT, w_SER_principal.NOSERVINT AS NOSERVINT_SEJ, KSEJOUR.NOSERVINT, NOSERVSS, CODEUM, CASE WHEN NOCHAMBRE IS NULL THEN KSERVINT.NOSERVINT::text || '-0' ELSE replace(NOCHAMBRE,' ','') END AS NOLIT, SHO, '0'::text AS TYPEMVT_before, '0'::text AS NOSERVINT_before, '0'::text AS NOSERVSS_before, 0::text AS NOLIT_before, '0'::text AS TYPEMVT_next, '0'::text AS NOSERVINT_next, '0'::text AS NOSERVSS_next, 0::text AS NOLIT_next FROM w_KSEJOUR KSEJOUR JOIN activite[PX].p_sejours ON KSEJOUR.NODOSSIER = p_sejours.code_original JOIN w_DOSSIER ON w_DOSSIER.NODOSSIER = KSEJOUR.NODOSSIER JOIN w_SER_principal ON w_DOSSIER.NODOSSIER = w_SER_principal.NODOSSIER LEFT JOIN prod_mederi.KSERVINT ON KSEJOUR.NOSERVINT = KSERVINT.NOSERVINT ORDER BY CASE WHEN DATEENTREE > now() THEN 'W' || w_DOSSIER.NODOSSIER ELSE w_DOSSIER.NODOSSIER END, KSEJOUR.DATEDEB ; CREATE INDEX w_MOUVEMENT_i1 ON w_MOUVEMENT USING btree (SEQUENCE); CREATE INDEX w_MOUVEMENT_i2 ON w_MOUVEMENT USING btree (NODOSSIER); ANALYSE w_MOUVEMENT; -- calcul date fin UPDATE w_MOUVEMENT SET DATEDEB = w_MOUVEMENT_B.DATEFIN + INTERVAL '1 second' FROM w_MOUVEMENT w_MOUVEMENT_B WHERE w_MOUVEMENT.NODOSSIER = w_MOUVEMENT_B.NODOSSIER AND w_MOUVEMENT.sequence = w_MOUVEMENT_B.sequence +1 AND w_MOUVEMENT.HEUREDEB = 0 AND w_MOUVEMENT_B.HEUREFIN <> 0; UPDATE w_MOUVEMENT SET DATEFIN = w_MOUVEMENT_A.DATEDEB - INTERVAL '1 second' FROM w_MOUVEMENT w_MOUVEMENT_A WHERE w_MOUVEMENT.NODOSSIER = w_MOUVEMENT_A.NODOSSIER AND w_MOUVEMENT.sequence = w_MOUVEMENT_A.sequence -1 AND w_MOUVEMENT.HEUREFIN = 0; UPDATE w_MOUVEMENT SET HEUREDEB = to_char(DATEDEB,'HH24MISS')::numeric, DATEDEB_DAT = date(DATEDEB), HEUREFIN = to_char(DATEFIN,'HH24MISS')::numeric, DATEFIN_DAT = date(DATEFIN) WHERE HEUREDEB = 0 OR HEUREFIN = 0 ; UPDATE w_MOUVEMENT SET DATEFIN = CASE WHEN w_MOUVEMENT_next.TYPEMVT <> 'S' THEN w_MOUVEMENT_next.DATEDEB - interval '1 second' ELSE w_MOUVEMENT_next.DATEDEB_DAT END, DATEFIN_DAT = date(CASE WHEN w_MOUVEMENT_next.TYPEMVT <> 'S' THEN w_MOUVEMENT_next.DATEDEB - interval '1 second' ELSE w_MOUVEMENT_next.DATEDEB END), HEUREFIN = extract('hour' FROM CASE WHEN w_MOUVEMENT_next.TYPEMVT <> 'S' THEN w_MOUVEMENT_next.DATEDEB - interval '1 second' ELSE w_MOUVEMENT.DATEDEB END) * 10000 + extract('minute' FROM CASE WHEN w_MOUVEMENT_next.TYPEMVT <> 'S' THEN w_MOUVEMENT_next.DATEDEB - interval '1 second' ELSE w_MOUVEMENT.DATEDEB END) * 100 + extract('second' FROM CASE WHEN w_MOUVEMENT_next.TYPEMVT <> 'S' THEN w_MOUVEMENT_next.DATEDEB - interval '1 second' ELSE w_MOUVEMENT.DATEDEB END), TYPEMVT_next = w_MOUVEMENT_next.TYPEMVT, NOSERVINT_next = w_MOUVEMENT_next.NOSERVINT, NOSERVSS_next = w_MOUVEMENT_next.NOSERVSS, NOLIT_next = w_MOUVEMENT_next.NOLIT FROM w_MOUVEMENT w_MOUVEMENT_next WHERE w_MOUVEMENT.NODOSSIER = w_MOUVEMENT_next.NODOSSIER AND w_MOUVEMENT.sequence = w_MOUVEMENT_next.sequence - 1; -- Si hopital de jour sans journée, UPDATE w_MOUVEMENT SET TYPEMVT_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 NODOSSIER = p_sejours.code_original AND code_prevu <> '1' AND TYPEMVT = 'E' AND NOSERVSS = t_services_facturation.code_original AND (TYPEMVT_NEXT = '' OR TYPEMVT_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_MOUVEMENT SET TYPEMVT_before = w_MOUVEMENT_before.TYPEMVT, NOSERVINT_before = w_MOUVEMENT_before.NOSERVINT, NOSERVSS_before = w_MOUVEMENT_before.NOSERVSS, NOLIT_before = w_MOUVEMENT_before.NOLIT FROM w_MOUVEMENT w_MOUVEMENT_before WHERE w_MOUVEMENT.NODOSSIER = w_MOUVEMENT_before.NODOSSIER AND w_MOUVEMENT.sequence = w_MOUVEMENT_before.sequence + 1 AND w_MOUVEMENT.TYPEMVT <> 'S'; -- Absences UPDATE w_MOUVEMENT SET NOSERVINT = 'ABS' WHERE TYPEMVT = 'A'; -- Hopital de jour Dernière séance avant dans sortie -- pas sur (c'est quoi P) UPDATE w_MOUVEMENT SET DATEDEB = DATEFIN, DATEDEB_DAT = DATEFIN_DAT, HEUREDEB = HEUREFIN WHERE TYPEMVT = 'P' AND TYPEMVT_next = 'S' AND DATEFIN <> DATEDEB; -- Hopital de jour Première séance après date entree UPDATE w_MOUVEMENT SET DATEFIN = DATEDEB, DATEFIN_DAT = DATEDEB_DAT, HEUREFIN = HEUREDEB WHERE TYPEMVT = 'E' AND TYPEMVT_next = 'C' AND DATEDEB <> DATEFIN; -- creation mouvements par jour DROP TABLE IF EXISTS w_mouvements_sejour; CREATE TEMP TABLE w_mouvements_sejour AS SELECT w_MOUVEMENT.NODOSSIER 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 = DATEDEB_DAT THEN HEUREDEB ELSE 0 END AS heure_debut, CASE WHEN p_calendrier.date = DATEFIN_DAT THEN HEUREFIN ELSE 240000 END AS heure_fin, CASE WHEN p_calendrier.date = DATEDEB_DAT AND TYPEMVT = 'E' AND p_sejours.type_sejour = '1' THEN 1 ELSE 0 END AS nb_entrees_directes, CASE WHEN p_calendrier.date = DATEFIN_DAT AND (TYPEMVT = 'S' OR (TYPEMVT = 'E' AND DATEFIN_DAT = p_sejours.date_sortie)) AND p_sejours.type_sejour = '1' THEN 1 ELSE 0 END AS nb_sorties_directes, CASE WHEN p_calendrier.date = DATEDEB_DAT AND TYPEMVT = 'E' AND p_sejours.type_sejour = '1' THEN '1' ELSE '0' END AS est_jour_entree, CASE WHEN p_calendrier.date = DATEFIN_DAT AND (TYPEMVT = 'S' OR (TYPEMVT = 'E' AND DATEFIN_DAT = p_sejours.date_sortie)) AND p_sejours.type_sejour = '1' THEN '1' ELSE '0' END AS est_jour_sortie, CASE WHEN p_sejours.type_sejour = '1' THEN '1' ELSE '0' END AS est_jour_hospitalisation, CASE WHEN p_calendrier.date = DATEDEB_DAT AND TYPEMVT = 'E' AND p_sejours.type_sejour = '2' THEN 1 ELSE 0 END AS nb_ambulatoires, CASE WHEN p_calendrier.date = DATEDEB_DAT AND TYPEMVT = 'E' AND p_sejours.type_sejour = '3' THEN 1 ELSE 0 END AS nb_externes, CASE WHEN p_calendrier.date = DATEDEB_DAT AND TYPEMVT = '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 = DATEDEB_DAT AND TYPEMVT <> 'E' AND p_sejours.type_sejour = '1' AND NOSERVSS <> NOSERVSS_before THEN 1 ELSE 0 END AS nb_entrees_mutation_service, CASE WHEN p_calendrier.date = DATEFIN_DAT AND TYPEMVT <> 'E' AND p_sejours.type_sejour = '1' AND NOSERVSS <> NOSERVSS_next THEN 1 ELSE 0 END AS nb_sorties_mutation_service, CASE WHEN p_calendrier.date = DATEDEB_DAT AND TYPEMVT <> 'E' AND p_sejours.type_sejour = '1' AND NOSERVINT <> NOSERVINT_before THEN 1 ELSE 0 END AS nb_entrees_mutation_etage, CASE WHEN p_calendrier.date = DATEFIN_DAT AND TYPEMVT <> 'E' AND p_sejours.type_sejour = '1' AND NOSERVINT <> NOSERVINT_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 (p_calendrier.date <> DATEFIN_DAT OR TYPEMVT_next = 'S') THEN 1 ELSE 0 END AS nb_jours_js_inclus, CASE WHEN p_sejours.type_sejour = '1' AND p_calendrier.date <> DATEFIN_DAT THEN 1 ELSE 0 END AS nb_jours_js_non_inclus, CASE WHEN p_sejours.type_sejour = '1' AND (t_lits.chambre_particuliere = 'O' OR SHO != 0) THEN '1' ELSE '0' END AS est_chambre_particuliere, CASE WHEN p_sejours.type_sejour = '1' AND (t_lits.chambre_particuliere = 'O' OR SHO != 0) AND (p_calendrier.date <> DATEFIN_DAT OR TYPEMVT_next = 'S') THEN 1 ELSE 0 END AS nb_chambres_particulieres, CASE WHEN p_calendrier.date = DATEDEB_DAT AND TYPEMVT = 'E' AND (COALESCE(w_MOUVEMENT.RSSBEBE) > 0) THEN 1 ELSE 0 END AS nb_bebes, NOSERVINT, NOSERVINT_SEJ, NOSERVSS, NOLIT, CODEUM, 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_MOUVEMENT LEFT JOIN activite[PX].t_lieux ON t_lieux.code_original_1 = NOSERVINT::text AND t_lieux.code_original_2 = CODEUM::text AND t_lieux.code_original_4 = NOLIT AND t_lieux.code_original_5 = NOSERVSS::text JOIN w_DOSSIER ON w_DOSSIER.NODOSSIER = w_MOUVEMENT.NODOSSIER JOIN activite[PX].p_sejours ON w_MOUVEMENT.NODOSSIER = p_sejours.no_sejour AND p_sejours.etat = '' LEFT JOIN activite[PX].t_lits ON NOLIT = t_lits.code_original JOIN activite[PX].t_services_facturation ON NOSERVINT::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 DATEDEB_DAT AND DATEFIN_DAT AND p_calendrier.date <= date(date_extraction) + interval '1 month' WHERE (TYPEMVT <> 'P' OR TYPEMVT_next = 'S') AND (p_sejours.type_sejour NOT IN ('2', '3') OR (p_sejours.type_sejour IN ('2', '3') AND TYPEMVT = 'E' AND (p_calendrier.date = DATEDEB_DAT OR p_calendrier.date = DATEFIN_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; UPDATE w_mouvements_sejour SET nb_sorties_mutation_etage = 0, nb_sorties_mutation_service = 0, nb_sorties_mutation_activite = 0, nb_sorties_mutation_unite_medicale = 0 WHERE nb_sorties_directes = 1 AND ( nb_sorties_mutation_etage <> 0 OR nb_sorties_mutation_service <> 0 OR nb_sorties_mutation_activite <> 0 OR nb_sorties_mutation_unite_medicale <> 0 ) ; -- correction des heure E/S UPDATE activite[PX].p_sejours SET heure_entree = heure_sortie, heure_sortie = heure_entree WHERE heure_sortie < heure_entree AND date_entree = date_sortie; UPDATE w_mouvements_sejour SET heure_fin = heure_debut, heure_debut = heure_fin FROM activite[PX].p_sejours WHERE w_mouvements_sejour.no_sejour = p_sejours.no_sejour AND date_entree = date_sortie AND heure_fin < heure_debut; 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 unite_medicale_id = t_unites_medicales.oid FROM activite[PX].t_unites_medicales WHERE code_original_2 = t_unites_medicales.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; -- 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 NOSERVINT, CODEUM, '', NOLIT, NOSERVSS, '', '', t_services_facturation.oid, COALESCE(t_activites.oid,0), COALESCE(t_lits.oid,0), COALESCE(t_unites_medicales.oid,0), COALESCE(t_unites_fonctionnelles.oid,0), t_services_facturation.mode_traitement_id FROM w_mouvements_sejour LEFT JOIN activite[PX].t_lieux ON t_lieux.code_original_1 = NOSERVINT::text AND t_lieux.code_original_2 = CODEUM::text AND t_lieux.code_original_4 = NOLIT AND t_lieux.code_original_5 = NOSERVSS::text JOIN activite[PX].t_services_facturation ON w_mouvements_sejour.NOSERVINT::text = t_services_facturation.code_original LEFT JOIN activite[PX].t_unites_medicales ON CODEUM::text = t_unites_medicales.code_original LEFT JOIN activite[PX].t_activites ON NOSERVINT_SEJ = t_activites.code_original LEFT JOIN activite[PX].t_lits ON NOLIT = t_lits.code_original LEFT JOIN activite[PX].t_unites_fonctionnelles ON NOSERVSS::text = t_unites_fonctionnelles.code_original WHERE t_lieux.oid IS NULL; -- 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 = NOSERVINT::text AND t_lieux.code_original_4 = NOLIT AND t_lieux.code_original_5 = NOSERVSS::text AND w_mouvements_sejour.lieu_id = 0; -- Médecin séjour UPDATE w_mouvements_sejour SET medecin_sejour_id = t_medecins_administratifs.oid FROM W_KPRAT, prod_mederi.KSEJOUR, activite[PX].t_medecins_administratifs WHERE KSEJOUR.NOPRAT = t_medecins_administratifs.code_original AND KSEJOUR.NODOSSIER = w_mouvements_sejour.no_sejour AND date BETWEEN DATEDEB AND DATEFIN AND w_mouvements_sejour.medecin_sejour_id <> t_medecins_administratifs.oid AND t_medecins_administratifs.oid <> 0; -- mise à jour par le code insee (désactivé car Osny veut voir les erreurs de saisie) -- UPDATE w_mouvements_sejour SET medecin_sejour_id = t_medecins_administratifs.oid -- FROM W_KPRAT KPRAT, prod_mederi.KSEJOUR, activite[PX].t_medecins_administratifs -- WHERE -- KSEJOUR.NOPRAT = KPRAT.CODEINSEE -- AND KPRAT.NOPRAT = t_medecins_administratifs.code_original -- AND KSEJOUR.NODOSSIER = w_mouvements_sejour.no_sejour -- AND date BETWEEN DATEDEB AND DATEFIN -- 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 = NOSERVSS FROM prod_mederi.KSERVINT JOIN activite[PX].t_unites_medicales ON NOSERVSS =t_unites_medicales.code_original WHERE NOSERVINT = code_original_6 AND (unite_medicale_id IS DISTINCT FROM t_unites_medicales.oid OR code_original_5 IS DISTINCT FROM NOSERVSS); 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_1 = '*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_1 = NOSERVINT FROM prod_mederi.KSERVINT JOIN activite[PX].t_activites ON NOSERVSS = t_activites.code_original WHERE NOSERVINT = code_original_1 AND activite_id = 0; -- 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 RSS DROP TABLE IF EXISTS w_SEANCES_RSS; CREATE TEMP TABLE w_SEANCES_RSS AS SELECT NODOSSIER, DATEACTE as DATE_SEANCE, count(*) as nb_seances FROM prod_mederi.MSEANCES JOIN prod_mederi.KRUM ON KRUM.RSSNR = MSEANCES.RSSNR GROUP BY 1,2; UPDATE w_mouvements_sejour SET nb_seances = w_SEANCES_RSS.nb_seances FROM w_SEANCES_RSS WHERE NODOSSIER = w_mouvements_sejour.no_sejour AND w_SEANCES_RSS.DATE_SEANCE = w_mouvements_sejour.date; -- seances selon GHS facturé DROP TABLE IF EXISTS w_KACTES_seances; CREATE TEMP TABLE w_KACTES_seances AS SELECT p_sejours.no_sejour, DATEACTE AS date, SUM(QTE::int) AS nb_seances FROM prod_mederi.KACTES JOIN w_KFACTURE KFACTURE ON KFACTURE.NOFAC = KACTES.NOFAC AND est_doublon = '0' -- AND FACPARTIEL <> 9 JOIN activite[PX].p_sejours ON KFACTURE.NODOSSIER = p_sejours.code_original JOIN base.t_ghs ON GHS = t_ghs.code WHERE t_ghs.oid IN (SELECT oid FROM w_ghs_seances) GROUP BY 1,2 HAVING SUM(QTE::int) > 0; CREATE INDEX w_KACTES_seances_i1 ON w_KACTES_seances USING btree (no_sejour); UPDATE w_mouvements_sejour SET nb_seances = w_KACTES_seances.nb_seances FROM w_KACTES_seances WHERE w_KACTES_seances.no_sejour = w_mouvements_sejour.no_sejour AND w_KACTES_seances.date = w_mouvements_sejour.date; -- seances selon D09, D11 facturé => pas de dialyse dans les actes -- seances selon Actes DROP TABLE IF EXISTS w_K_seances; CREATE TEMP TABLE w_K_seances AS SELECT p_sejours.no_sejour, DATEACTE AS date, SUM(QTE::int) AS nb_seances FROM prod_mederi.KACTES JOIN activite[PX].p_sejours ON NODOSSIER = p_sejours.code_original WHERE NOACTE = 'K' AND QTE > 0 GROUP BY 1,2; UPDATE w_mouvements_sejour SET nb_seances = w_K_seances.nb_seances FROM w_K_seances WHERE w_K_seances.no_sejour = w_mouvements_sejour.no_sejour AND w_K_seances.date = w_mouvements_sejour.date AND w_mouvements_sejour.nb_seances = 0; -- seances selon D09 -- 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); -- 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; -- Doublons potentiels DELETE FROM w_mouvements_sejour USING ( SELECT no_sejour, date, heure_debut, MAX(CTID) AS fromCTID FROM w_mouvements_sejour GROUP BY 1,2,3 HAVING count(*) > 1) subview WHERE 1=1 AND subview.no_sejour = w_mouvements_sejour.no_sejour AND subview.date = w_mouvements_sejour.date AND subview.heure_debut = w_mouvements_sejour.heure_debut AND subview.fromCTID != 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'); -- DROP TABLE IF EXISTS TEMP.w_MOUVEMENT; -- CREATE TABLE temp.w_MOUVEMENT AS SELECT * FROM w_MOUVEMENT; -- DROP TABLE IF EXISTS TEMP.w_MOUVEMENTS_SEJOUR; -- CREATE TABLE temp.w_MOUVEMENTS_SEJOUR AS SELECT * FROM w_MOUVEMENTS_SEJOUR; 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 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_MOUVEMENT; DROP TABLE IF EXISTS w_mouvements_sejour; DROP TABLE IF EXISTS w_seances; DROP TABLE IF EXISTS w_K_seances; DROP TABLE IF EXISTS w_KACTES_seances; ]]> w_PEC_FACTURE.tiers_payant_2_id AND w_FAC_FACTURE.NOFAC = w_PEC_FACTURE.NOFAC; -- En budget global, tous les honoraires ne sont pas facturés (inclus dans GHS) => non utile dans oqn (seul cas traité pour l'instant) -- Informations montants factures et regles DROP TABLE IF EXISTS w_FAC_MONTANTS; CREATE TEMP TABLE w_FAC_MONTANTS AS SELECT NOFAC, SUM(CASE WHEN FACPARTIEL != 9 THEN MNTPREST ELSE 0 END) AS montant_facture_c, SUM(CASE WHEN FACPARTIEL != 9 THEN MNTPASS ELSE 0 END) AS montant_facture_0_c, SUM(CASE WHEN FACPARTIEL != 9 THEN MNTPAM ELSE 0 END) AS montant_facture_1_c, SUM(CASE WHEN FACPARTIEL != 9 THEN MNTPMUT ELSE 0 END) AS montant_facture_2_c, 0 AS montant_facture_22_c, SUM(CASE WHEN FACPARTIEL != 9 AND DATEFAC IS NOT NULL THEN MNTPREST ELSE 0 END) AS montant_comptabilise_c, SUM(CASE WHEN FACPARTIEL != 9 AND DATEFAC IS NOT NULL THEN MNTPASS ELSE 0 END) AS montant_comptabilise_0_c, SUM(CASE WHEN FACPARTIEL != 9 AND DATEFAC IS NOT NULL THEN MNTPAM ELSE 0 END) AS montant_comptabilise_1_c, SUM(CASE WHEN FACPARTIEL != 9 AND DATEFAC IS NOT NULL THEN MNTPMUT ELSE 0 END) AS montant_comptabilise_2_c, SUM(CASE WHEN FACPARTIEL != 9 AND DATEFAC IS NOT NULL THEN 0 ELSE 0 END) AS montant_comptabilise_22_c, SUM(CASE WHEN FACPARTIEL != 9 THEN MNTPREST - (SLDPAM + SLDPMUT + SLDPASS) ELSE 0 END) AS montant_regle_c, SUM(CASE WHEN FACPARTIEL != 9 THEN MNTPASS - SLDPASS ELSE 0 END) AS montant_regle_0_c, SUM(CASE WHEN FACPARTIEL != 9 THEN MNTPAM - SLDPAM ELSE 0 END) AS montant_regle_1_c, SUM(CASE WHEN FACPARTIEL != 9 THEN MNTPMUT - SLDPMUT ELSE 0 END) AS montant_regle_2_c, SUM(CASE WHEN FACPARTIEL != 9 THEN 0 ELSE 0 END) AS montant_regle_22_c, SUM(CASE WHEN FACPARTIEL != 9 THEN MNTHONO ELSE 0 END) AS montant_facture_h, SUM(CASE WHEN FACPARTIEL != 9 THEN MNTHASS ELSE 0 END) AS montant_facture_0_h, SUM(CASE WHEN FACPARTIEL != 9 THEN MNTHAM ELSE 0 END) AS montant_facture_1_h, SUM(CASE WHEN FACPARTIEL != 9 THEN MNTHMUT ELSE 0 END) AS montant_facture_2_h, SUM(CASE WHEN FACPARTIEL != 9 THEN 0 ELSE 0 END) AS montant_facture_22_h, SUM(CASE WHEN FACPARTIEL != 9 AND DATEFAC IS NOT NULL THEN MNTHONO ELSE 0 END) AS montant_comptabilise_h, SUM(CASE WHEN FACPARTIEL != 9 AND DATEFAC IS NOT NULL THEN MNTHASS ELSE 0 END) AS montant_comptabilise_0_h, SUM(CASE WHEN FACPARTIEL != 9 AND DATEFAC IS NOT NULL THEN MNTHAM ELSE 0 END) AS montant_comptabilise_1_h, SUM(CASE WHEN FACPARTIEL != 9 AND DATEFAC IS NOT NULL THEN MNTHMUT ELSE 0 END) AS montant_comptabilise_2_h, SUM(CASE WHEN FACPARTIEL != 9 AND DATEFAC IS NOT NULL THEN 0 ELSE 0 END) AS montant_comptabilise_22_h, SUM(CASE WHEN FACPARTIEL != 9 THEN MNTHONO - (SLDHAM + SLDHMUT + SLDHASS) ELSE 0 END) AS montant_regle_h, SUM(CASE WHEN FACPARTIEL != 9 THEN MNTHASS - SLDHASS ELSE 0 END) AS montant_regle_0_h, SUM(CASE WHEN FACPARTIEL != 9 THEN MNTHAM - SLDHAM ELSE 0 END) AS montant_regle_1_h, SUM(CASE WHEN FACPARTIEL != 9 THEN MNTHMUT - SLDHMUT ELSE 0 END) AS montant_regle_2_h, SUM(CASE WHEN FACPARTIEL != 9 THEN 0 ELSE 0 END) AS montant_regle_22_h FROM w_FAC_FACTURE WHERE NOFAC IS NOT NULL GROUP BY NOFAC; CREATE INDEX w_FAC_MONTANTS_i1 ON w_FAC_MONTANTS USING btree (NOFAC); UPDATE w_FAC_MONTANTS SET montant_facture_c = -montant_facture_c, montant_facture_0_c = -montant_facture_0_c , montant_facture_1_c = -montant_facture_1_c, montant_facture_2_c = -montant_facture_2_c, montant_facture_22_c = montant_facture_22_c, montant_comptabilise_c = -montant_comptabilise_c, montant_comptabilise_0_c = -montant_comptabilise_0_c, montant_comptabilise_1_c = -montant_comptabilise_1_c, montant_comptabilise_2_c = -montant_comptabilise_2_c, montant_comptabilise_22_c = -montant_comptabilise_22_c, montant_regle_c = -montant_regle_c, montant_regle_0_c = -montant_regle_0_c, montant_regle_1_c = -montant_regle_1_c, montant_regle_2_c = -montant_regle_2_c, montant_regle_22_c = -montant_regle_22_c, montant_facture_h = -montant_facture_h, montant_facture_0_h = -montant_facture_0_h, montant_facture_1_h = -montant_facture_1_h, montant_facture_2_h = -montant_facture_2_h, montant_facture_22_h = -montant_facture_22_h, montant_comptabilise_h = -montant_comptabilise_h, montant_comptabilise_0_h = -montant_comptabilise_0_h, montant_comptabilise_1_h = -montant_comptabilise_1_h, montant_comptabilise_2_h = -montant_comptabilise_2_h, montant_comptabilise_22_h = -montant_comptabilise_22_h, montant_regle_h = -montant_regle_h, montant_regle_0_h = -montant_regle_0_h, montant_regle_1_h = -montant_regle_1_h, montant_regle_2_h = -montant_regle_2_h, montant_regle_22_h = -montant_regle_22_h WHERE NOFAC IN (SELECT NOFAC FROM w_KFACTURE KFACTURE WHERE TYPEFAC IN ('2','4')); -- Informations date dernier reglement DROP TABLE IF EXISTS w_FAC_REGLEMENT; CREATE TEMP TABLE w_FAC_REGLEMENT AS SELECT KACTES.NODOSSIER, KACTES.NOFAC, MAX(CASE WHEN TYPERUB <> 4 AND DEBITEUR = 3 THEN DATE ELSE NULL END) AS date_dernier_reglement_0_c, MAX(CASE WHEN TYPERUB <> 4 AND DEBITEUR = 1 THEN DATE ELSE NULL END) AS date_dernier_reglement_1_c, MAX(CASE WHEN TYPERUB <> 4 AND DEBITEUR = 2 THEN DATE ELSE NULL END) AS date_dernier_reglement_2_c, date(NULL) AS date_dernier_reglement_22_c, MAX(CASE WHEN TYPERUB = 4 AND DEBITEUR = 3 THEN DATE ELSE NULL END) AS date_dernier_reglement_0_h, MAX(CASE WHEN TYPERUB = 4 AND DEBITEUR = 1 THEN DATE ELSE NULL END) AS date_dernier_reglement_1_h, MAX(CASE WHEN TYPERUB = 4 AND DEBITEUR = 2 THEN DATE ELSE NULL END) AS date_dernier_reglement_2_h, date(NULL) AS date_dernier_reglement_22_h, count(DISTINCT date_part('month',DATE)) AS nb_mois_reglement FROM w_KRGLDET KRGLDET JOIN prod_mederi.KACTES ON KACTES.ACCLEUNIK = KRGLDET.ACCLEUNIK JOIN w_KFACTURE KFACTURE ON KRGLDET.NOFAC = KFACTURE.NOFAC WHERE est_doublon = '0' GROUP BY 1,2; CREATE INDEX w_FAC_REGLEMENT_i1 ON w_FAC_REGLEMENT USING btree (NOFAC); -- Informations date vente (direct dans kfacture) -- Informations expedition (factures et avoir) DROP TABLE IF EXISTS w_FAC_BORDEREAU; CREATE TEMP TABLE w_FAC_BORDEREAU AS SELECT NOFAC, '0'::text AS code_expedie_0, MAX(CASE WHEN NOBORD != '' AND NOBORD !='X' THEN '1' ELSE '0' END) AS code_expedie_1, MAX(CASE WHEN NOBORDM != '' AND NOBORD != 'X' THEN '1' ELSE '0' END) AS code_expedie_2, '0' AS code_expedie_22, ''::text AS no_bordereau_0, MAX(CASE WHEN NOBORD != '' AND NOBORD != 'X' THEN NOBORD::bigint ELSE '0' END) AS no_bordereau_1, MAX(CASE WHEN NOBORDM != '' AND NOBORDM != 'X' THEN NOBORDM::bigint ELSE '0' END) AS no_bordereau_2, NULL AS no_bordereau_22, '20991231'::date AS date_expedition_0, MIN(CASE WHEN NOBORD != '' AND NOBORD !='X' THEN DATEBORD ELSE '20991231' END) AS date_expedition_1, MIN(CASE WHEN NOBORDM != '' AND NOBORDM !='X' THEN DATEBORD ELSE '20991231' END) AS date_expedition_2, '20991231'::date AS date_expedition_22 FROM w_KFACTURE KFACTURE WHERE NOFAC IS NOT NULL AND est_doublon = '0' GROUP BY 1; CREATE INDEX w_FAC_BORDEREAU_i1 ON w_FAC_BORDEREAU USING btree (NOFAC); -- Informations rejets DROP TABLE IF EXISTS w_FAC_REJET; CREATE TEMP TABLE w_FAC_REJET AS SELECT FACTURE AS NOFAC, COUNT(*) as nb_rejets FROM prod_mederi.KNOERJ WHERE TRIM(ERRCODE) <> '0001' GROUP BY FACTURE; CREATE INDEX w_FAC_REJET_i1 ON w_FAC_REJET USING btree (NOFAC); -- 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, w_FAC_FACTURE.NOFAC AS no_facture, date_debut_facture AS date_debut, date_fin_facture AS date_fin, CASE WHEN TYPEFAC = '1' THEN '0' WHEN TYPEFAC IN ('2','4') THEN '1' WHEN TYPEFAC IN ('3') THEN 'P' ELSE '0' END AS type_facture, CASE WHEN FACPARTIEL != 9 THEN '1' ELSE '0' END AS code_facture, DATEFAC AS date_facture, CASE WHEN DATEFAC IS NOT NULL THEN '1' ELSE '0' END AS code_vente, CASE WHEN DATEFAC IS NOT NULL THEN DATEFAC ELSE '20991231'::date END AS date_vente, CASE WHEN DATEFAC IS NOT NULL THEN extract('year' FROM DATEFAC) * 100 + extract('month' FROM DATEFAC) 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_sortie ELSE date_dernier_reglement_0_c END, CASE WHEN w_FAC_MONTANTS.montant_comptabilise_0_h = 0 THEN date_sortie ELSE date_dernier_reglement_0_h END, CASE WHEN w_FAC_MONTANTS.montant_comptabilise_1_c = 0 THEN date_sortie ELSE date_dernier_reglement_1_c END, CASE WHEN w_FAC_MONTANTS.montant_comptabilise_1_h = 0 THEN date_sortie ELSE date_dernier_reglement_1_h END, CASE WHEN w_FAC_MONTANTS.montant_comptabilise_2_c = 0 THEN date_sortie ELSE date_dernier_reglement_2_c END, CASE WHEN w_FAC_MONTANTS.montant_comptabilise_2_h = 0 THEN date_sortie ELSE date_dernier_reglement_2_h END, CASE WHEN w_FAC_MONTANTS.montant_comptabilise_22_c = 0 THEN date_sortie ELSE date_dernier_reglement_22_c END, CASE WHEN w_FAC_MONTANTS.montant_comptabilise_22_h = 0 THEN date_sortie 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, DATEFAC - 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_sortie 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_sortie 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_sortie 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_sortie 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_sortie 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_sortie 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_sortie 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_sortie 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 (w_FAC_FACTURE.NOFAC = w_FAC_BORDEREAU.NOFAC) LEFT JOIN w_FAC_MONTANTS ON (w_FAC_FACTURE.NOFAC = w_FAC_MONTANTS.NOFAC) LEFT JOIN w_FAC_REGLEMENT ON (w_FAC_FACTURE.NOFAC = w_FAC_REGLEMENT.NOFAC) LEFT JOIN w_FAC_REJET ON (w_FAC_FACTURE.NOFAC = w_FAC_REJET.NOFAC) -- LEFT JOIN prod_mederi.KENCOURS ON w_FAC_FACTURE.NOFAC = KENCOURS.NOFAC ORDER BY 1,2; 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' JOIN activite[PX].t_lieux ON lieu_sortie_id = t_lieux.oid JOIN activite[PX].t_services_facturation ON t_lieux.service_facturation_id = t_services_facturation.oid WHERE p_sejours.etat = '' AND p_sejours.est_sans_facturation IS DISTINCT FROM '1' AND date_entree <= now() AND p_sejours.type_sejour <> '6' AND p_sejours.type_sejour <> '9' 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 HAVING MIN(GREATEST(date_debut_encours, p_calendrier.date)) >= '[ENV_ADM_ANNEEDEBUT]0101' ; 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 ); -- Avoirs qui annulent des factures UPDATE activite[PX].p_factures SET no_facture_od_avoir = FAC_FACTURE_AVOIR.NOFAC, type_facture = 'X' FROM w_KFACTURE KFACTURE JOIN w_KFACTURE FAC_FACTURE_AVOIR ON KFACTURE.NOFAC = FAC_FACTURE_AVOIR.FACAVOIR AND FAC_FACTURE_AVOIR.FACAVOIR != '' WHERE p_factures.no_facture = KFACTURE.NOFAC AND no_facture_od_avoir IS DISTINCT FROM FAC_FACTURE_AVOIR.NOFAC AND KFACTURE.est_doublon = '0' AND FAC_FACTURE_AVOIR.est_doublon = '0' ; 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; -- 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; ]]> '0001' AND TRIM(ERRLIB) <> ''; 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; ]]> 4 AND KACTES.NOACTE <> 'GHS' AND ( KACTES.NOFAC IS NULL OR KFACTURE.NOFAC IS NULL ) ; UPDATE w_KACTES_NF SET no_facture = subview.no_facture FROM ( SELECT no_sejour, (MAX(Array[date_fin::text,no_facture]))[2] AS no_facture FROM activite[PX].p_factures WHERE type_facture = 'E' GROUP BY 1 ) subview WHERE w_KACTES_NF.no_facture = '' AND w_KACTES_NF.no_sejour = subview.no_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 no_facture, date_debut, date_fin, nb_rubrique, coefficient, rubrique_facturation_id, prestation_id, prix_unitaire, lieu_id FROM w_KACTES_NF WHERE no_facture <> '' ; ]]> 4 GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16; -- Médecin Salarié INSERT INTO w_FAC_FACTURE_LIGNE_C SELECT 1::integer AS origine_facturation_id, ACCLEUNIK, KACTES.NOFAC AS no_facture, date(DATEACTE) AS date_debut, COALESCE(date(DATEFIN),date(DATEACTE)) AS date_fin, CASE WHEN FACPARTIEL != 9 AND KACTES.NOFAC IS NOT NULL THEN DATEFAC ELSE '20991231'::date END AS date_vente, lieu_sortie_id, CASE WHEN TYPEFAC NOT IN ('2','4') THEN QTE ELSE 0-QTE END AS nb_rubrique, CASE WHEN TYPEFAC NOT IN ('2','4') THEN QTE ELSE 0-QTE END AS nb_prestations, KACTES.COEFF as coefficient, 1 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, PRIXU AS prix_unitaire, 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, AVG(100-TAUXSS-TAUXMUT) as taux_0, AVG(TAUXSS) as taux_1, AVG(TAUXMUT) as taux_2, 0 as taux_22, SUM(CASE WHEN DATEFAC IS NOT NULL THEN CASE WHEN TYPEFAC NOT IN ('2','4') THEN MNTASS + MNTMUT + MNTSS ELSE - (MNTASS + MNTMUT + MNTSS) END ELSE 0 END) AS montant_comptabilise, SUM(CASE WHEN DATEFAC IS NOT NULL THEN CASE WHEN TYPEFAC NOT IN ('2','4') THEN MNTASS ELSE - MNTASS END ELSE 0 END) AS montant_comptabilise_0, SUM(CASE WHEN DATEFAC IS NOT NULL THEN CASE WHEN TYPEFAC NOT IN ('2','4') THEN MNTSS ELSE - MNTSS END ELSE 0 END) AS montant_comptabilise_1, SUM(CASE WHEN DATEFAC IS NOT NULL THEN CASE WHEN TYPEFAC NOT IN ('2','4') THEN MNTMUT ELSE - MNTMUT END ELSE 0 END) AS montant_comptabilise_2, 0 AS montant_comptabilise_22, 0::bigint AS rubrique_facture_id FROM prod_mederi.KACTES LEFT JOIN activite[PX].t_rubriques_facturation ON (NOACTE = t_rubriques_facturation.code_original) JOIN w_FAC_FACTURE ON KACTES.NOFAC = w_FAC_FACTURE.NOFAC LEFT JOIN (SELECT NOACTE, NOSERVINT, MAX(NOCOMPTE) AS NOCOMPTE FROM prod_mederi.KCPTRUB GROUP BY 1,2) sub ON KACTES.NOSERVINT = sub.NOSERVINT AND KACTES.NOACTE = sub.NOACTE LEFT JOIN prod_mederi.KRUBINT ON KACTES.NOACTE = KRUBINT.NOACTE LEFT JOIN activite.t_prestations ON (NOACTESS = t_prestations.code) LEFT JOIN activite[PX].t_compte ON (NOCOMPTE IS NOT NULL AND NOCOMPTE::bigint = t_compte.code_original) OR (NOCOMPTE IS NULL AND NOCOMPTES::bigint = t_compte.code_original::bigint) JOIN W_KPRAT KPRAT ON KACTES.NOPRAT = KPRAT.NOPRAT AND KPRAT.CODETAB = 3 JOIN activite.t_divers ON t_divers.code = 'MEDSAL_COMPTACLI' AND valeur = 1 WHERE '[ENV_TYPEETS]' NOT IN ('2','3') AND FACPARTIEL != 9 AND KACTES.TYPERUB = 4 GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,15,16; -- 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, 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, 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 WHERE 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')); -- 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') 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; 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, 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, 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, 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; DROP TABLE IF EXISTS w_mouvements_sejour_lieu_jour; CREATE TEMP TABLE w_mouvements_sejour_lieu_jour AS SELECT no_sejour, date, (MAX(CASE WHEN est_absence <> '1' THEN Array[heure_fin, lieu_id] ELSE NULL END))[2] AS lieu_id, (MAX(Array[heure_fin, lieu_id]))[2] AS lieu_id_avec_absence FROM activite[PX].p_mouvements_sejour JOIN activite[PX].t_lieux ON lieu_id = t_lieux.oid JOIN activite[PX].t_services_facturation On service_facturation_id = t_services_facturation.oid GROUP BY 1,2 ; UPDATE activite[PX].p_factures_lignes_c SET lieu_id = COALESCE(w_mouvements_sejour_lieu_jour.lieu_id,w_mouvements_sejour_lieu_jour.lieu_id_avec_absence) FROM activite[PX].p_factures, w_mouvements_sejour_lieu_jour WHERE p_factures_lignes_c.no_facture = p_factures.no_facture AND p_factures.no_sejour = w_mouvements_sejour_lieu_jour.no_sejour AND p_factures_lignes_c.date_debut = w_mouvements_sejour_lieu_jour.date AND p_factures_lignes_c.lieu_id <> COALESCE(w_mouvements_sejour_lieu_jour.lieu_id,w_mouvements_sejour_lieu_jour.lieu_id_avec_absence) ; DROP TABLE IF EXISTS w_actes_inclus_dans_sejour; CREATE TEMP TABLE w_actes_inclus_dans_sejour AS SELECT NOFAC 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 = NOFAC 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; -- Montants depuis PMSI --UPDATE pmsi.p_rss --SET no_sejour_administratif = -- CASE WHEN p_rss.date_sortie = RSSSORT -- THEN KRSS.NODOSSIER ELSE no_sejour_administratif END --FROM prod_mederi.KRSS --JOIN w_DOSSIER ON w_DOSSIER.NODOSSIER = KRSS.NODOSSIER --WHERE p_rss.no_rss = KRSS.NODOSSIER AND ghm_id <> 0; -- Suppression des tables de travail non utilisées après DROP TABLE IF EXISTS w_compte CASCADE; 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; DROP TABLE IF EXISTS w_factures_ventes_bg CASCADE; DROP TABLE IF EXISTS w_factures_lignes_bg CASCADE; ]]> 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; -- Comptes clients (REG) DROP TABLE IF EXISTS w_FAC_REGLEMENT_LIGNE_C; CREATE TEMP TABLE w_FAC_REGLEMENT_LIGNE_C AS SELECT KACTES.NOFAC AS no_facture, date(KRGLDET.DATE) AS date_reglement, COALESCE(t_rubriques_facturation.oid::bigint, 0) AS rubrique_comptabilisation_id, COALESCE(t_prestations.oid::bigint, 0) AS prestation_id, SUM(KRGLDET.MONTANT) AS montant_regle, SUM(CASE WHEN KREGL.DEBITEUR = 3 THEN KRGLDET.MONTANT ELSE 0 END) AS montant_regle_0, SUM(CASE WHEN KREGL.DEBITEUR = 1 THEN KRGLDET.MONTANT ELSE 0 END) AS montant_regle_1, SUM(CASE WHEN KREGL.DEBITEUR = 2 THEN KRGLDET.MONTANT ELSE 0 END) AS montant_regle_2, 0 AS montant_regle_22 FROM w_KRGLDET KRGLDET JOIN w_KREGL KREGL ON KRGLDET.NOREGL = KREGL.NOREGL JOIN prod_mederi.KACTES ON KACTES.ACCLEUNIK = KRGLDET.ACCLEUNIK LEFT JOIN prod_mederi.KRUBINT ON KACTES.NOACTE = KRUBINT.NOACTE LEFT JOIN activite[PX].t_rubriques_facturation ON (KRUBINT.NOACTE = t_rubriques_facturation.code_original) LEFT JOIN activite.t_prestations ON NOACTESS = t_prestations.code WHERE 1=1 AND NOT ((KREGL.ORIGINE = 13 AND KREGL.DEBITEUR = 1) OR (KREGL.ORIGINE = 1 AND KREGL.DEBITEUR = 3)) AND KACTES.TYPERUB <> 4 AND KACTES.NOFAC IS NOT NULL GROUP BY 1,2,3,4; -- Règlements sans affectation INSERT INTO w_FAC_REGLEMENT_LIGNE_C SELECT subview.no_facture AS no_facture, date(KREGL.DATE) AS date_reglement, 0::bigint AS rubrique_comptabilisation_id, 0::bigint AS prestation_id, SUM(KREGL.MONTANT) AS montant_regle, SUM(CASE WHEN KREGL.DEBITEUR = 3 THEN KREGL.MONTANT ELSE 0 END) AS montant_regle_0, SUM(CASE WHEN KREGL.DEBITEUR = 1 THEN KREGL.MONTANT ELSE 0 END) AS montant_regle_1, SUM(CASE WHEN KREGL.DEBITEUR = 2 THEN KREGL.MONTANT ELSE 0 END) AS montant_regle_2, 0 AS montant_regle_22 FROM w_KREGL KREGL JOIN ( SELECT no_sejour, (MAX(ARRAY[date_facture::text, no_facture]))[2] AS no_facture FROM activite[PX].p_factures GROUP BY 1 ) subview ON subview.no_sejour = NODOSSIER WHERE 1=1 AND KREGL.DEBITEUR = '3' AND NUMREGLD = '0' AND ignore = '0' AND forcehon = '0' GROUP BY 1,2,3,4 ; -- Médecins salariés INSERT INTO w_FAC_REGLEMENT_LIGNE_C SELECT KACTES.NOFAC AS no_facture, date(KRGLDET.DATE) AS date_reglement, COALESCE(t_rubriques_facturation.oid::bigint, 0) AS rubrique_comptabilisation_id, COALESCE(t_prestations.oid::bigint, 0) AS prestation_id, SUM(KRGLDET.MONTANT) AS montant_regle, SUM(CASE WHEN KREGL.DEBITEUR = 3 THEN KRGLDET.MONTANT ELSE 0 END) AS montant_regle_0, SUM(CASE WHEN KREGL.DEBITEUR = 1 THEN KRGLDET.MONTANT ELSE 0 END) AS montant_regle_1, SUM(CASE WHEN KREGL.DEBITEUR = 2 THEN KRGLDET.MONTANT ELSE 0 END) AS montant_regle_2, 0 AS montant_regle_22 FROM w_KRGLDET KRGLDET JOIN w_KREGL KREGL ON KRGLDET.NOREGL = KREGL.NOREGL JOIN prod_mederi.KACTES ON KACTES.ACCLEUNIK = KRGLDET.ACCLEUNIK LEFT JOIN prod_mederi.KRUBINT ON KACTES.NOACTE = KRUBINT.NOACTE LEFT JOIN activite[PX].t_rubriques_facturation ON (KRUBINT.NOACTE = t_rubriques_facturation.code_original) LEFT JOIN activite.t_prestations ON NOACTESS = t_prestations.code JOIN W_KPRAT KPRAT ON KACTES.NOPRAT = KPRAT.NOPRAT AND CODETAB = 3 JOIN activite.t_divers ON t_divers.code = 'MEDSAL_COMPTACLI' AND valeur = 1 WHERE 1=1 AND NOT ((KREGL.ORIGINE = 13 AND KREGL.DEBITEUR = 1) OR (KREGL.ORIGINE = 1 AND KREGL.DEBITEUR = 3)) AND KACTES.TYPERUB <> 4 GROUP BY 1,2,3,4; -- Règlements -- Acomptes 85% INSERT INTO w_FAC_REGLEMENT_LIGNE_C SELECT KACTES.NOFAC AS no_facture, date(KRGLDET.DATE) AS date_reglement, COALESCE(t_rubriques_facturation.oid::bigint, 0) AS rubrique_comptabilisation_id, COALESCE(t_prestations.oid::bigint, 0) AS prestation_id, SUM(KRGLDET.MONTANT) AS montant_regle, SUM(CASE WHEN KREGL.DEBITEUR = 3 THEN KRGLDET.MONTANT ELSE 0 END) AS montant_regle_0, SUM(CASE WHEN KREGL.DEBITEUR = 1 THEN KRGLDET.MONTANT ELSE 0 END) AS montant_regle_1, SUM(CASE WHEN KREGL.DEBITEUR = 2 THEN KRGLDET.MONTANT ELSE 0 END) AS montant_regle_2, 0 AS montant_regle_22 FROM w_KRGLDET KRGLDET JOIN w_KREGL KREGL ON KRGLDET.NOREGL = KREGL.NOREGL JOIN prod_mederi.KACTES ON KACTES.ACCLEUNIK = KRGLDET.ACCLEUNIK 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 KREGL.ORIGINE = 13 AND KREGL.DEBITEUR = 1 AND KACTES.TYPERUB <> 4 --AND JOUR_TYPEMVT <> 'FACAV' GROUP BY 1,2,3,4 ; -- Acomptes INSERT INTO w_FAC_REGLEMENT_LIGNE_C SELECT KACTES.NOFAC AS no_facture, date(KRGLDET.DATE) AS date_reglement, COALESCE(t_rubriques_facturation.oid::bigint, 0) AS rubrique_comptabilisation_id, COALESCE(t_prestations.oid::bigint, 0) AS prestation_id, SUM(KRGLDET.MONTANT) AS montant_regle, SUM(CASE WHEN KREGL.DEBITEUR = 3 THEN KRGLDET.MONTANT ELSE 0 END) AS montant_regle_0, SUM(CASE WHEN KREGL.DEBITEUR = 1 THEN KRGLDET.MONTANT ELSE 0 END) AS montant_regle_1, SUM(CASE WHEN KREGL.DEBITEUR = 2 THEN KRGLDET.MONTANT ELSE 0 END) AS montant_regle_2, 0 AS montant_regle_22 FROM w_KRGLDET KRGLDET JOIN w_KREGL KREGL ON KRGLDET.NOREGL = KREGL.NOREGL JOIN prod_mederi.KACTES ON KACTES.ACCLEUNIK = KRGLDET.ACCLEUNIK 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 KREGL.ORIGINE = 1 AND KREGL.DEBITEUR = 3 AND KACTES.TYPERUB <> 4 GROUP BY 1,2,3,4 ; --correction par rapport aux règlement non affectés -- verrouillé pour l'instant par ELA DROP TABLE IF EXISTS w_FAC_CORR; CREATE TEMP TABLE w_FAC_CORR AS SELECT NOREGL, DATE, MONTANT, SENS,DEBITEUR, KREGL.NODOSSIER, w_FAC_FACTURE.NOFAC, MNTPASS,MNTPAM,MNTPMUT,MNTHASS,MNTHAM,MNTHMUT,SLDPASS,SLDPAM,SLDPMUT,SLDHASS,SLDHAM,SLDHMUT, COALESCE(t_rubriques_facturation.oid::bigint,0) AS rubrique_comptabilisation_id, COALESCE(t_prestations.oid::bigint,0) AS prestation_id FROM w_KREGL KREGL, prod_mederi.KDOSSIER, w_FAC_FACTURE LEFT JOIN activite[PX].t_rubriques_facturation ON (t_rubriques_facturation.code_original = '*MED_REG_DOS') LEFT JOIN activite.t_prestations ON (t_prestations.code_original = '*MED_REG_DOS') WHERE NUMREGLD = 0 AND KREGL.DATECOMPTA IS NOT NULL AND KDOSSIER.NODOSSIER = KREGL.NODOSSIER AND KDOSSIER.NODOSSIER = w_FAC_FACTURE.NODOSSIER AND w_FAC_FACTURE.NOFAC IS NOT NULL AND FACAVOIR IS NULL AND 1 <> 1; CREATE INDEX w_fac_corr_i1 ON w_fac_corr USING btree (NOFAC); ANALYSE w_FAC_CORR; -- insertion de règlements dossier sans détail sur les factures et leurs lignes DROP TABLE IF EXISTS w_FAC_REG_SEJ; CREATE TEMP TABLE w_FAC_REG_SEJ as SELECT NOREGL, MAX(DEBITEUR) AS DEBITEUR, MAX(NOFAC) AS NOFAC, MAX(DATE) AS date_reglement, MAX(rubrique_comptabilisation_id) AS rubrique_comptabilisation_id, prestation_id AS prestation_id, CASE WHEN MAX(SENS) IS DISTINCT FROM '-' THEN MAX(MONTANT) ELSE - MAX(MONTANT) END AS montant_regle , CASE WHEN MAX(DEBITEUR) = 3 THEN CASE WHEN MAX(SENS) IS DISTINCT FROM '-' THEN MAX(MONTANT) ELSE - MAX(MONTANT) END ELSE 0 END AS montant_regle_0, CASE WHEN MAX(DEBITEUR) = 1 THEN CASE WHEN MAX(SENS) IS DISTINCT FROM '-' THEN MAX(MONTANT) ELSE - MAX(MONTANT) END ELSE 0 END AS montant_regle_1, CASE WHEN MAX(DEBITEUR) = 2 THEN CASE WHEN MAX(SENS) IS DISTINCT FROM '-' THEN MAX(MONTANT) ELSE - MAX(MONTANT) END ELSE 0 END AS montant_regle_2, 0 as montant_regle_22 FROM (SELECT NOREGL, MONTANT, w_FAC_CORR.NOFAC, date(w_FAC_CORR.DATE) AS DATE, w_FAC_CORR.rubrique_comptabilisation_id, w_FAC_CORR.prestation_id, SENS, DEBITEUR -- , -- CASE -- WHEN MONTANT = MNTPASS THEN montant_facture_0 -- WHEN MONTANT = MNTPAM THEN montant_facture_1 -- WHEN MONTANT = MNTPMUT THEN montant_facture_2 -- WHEN MONTANT = SLDPASS THEN montant_facture_0 -- WHEN MONTANT = SLDPAM THEN montant_facture_1 -- WHEN MONTANT = SLDPMUT THEN montant_facture_2 -- WHEN MONTANT = MNTHASS + MNTPASS THEN montant_facture_0 -- WHEN MONTANT = MNTHAM + MNTPAM THEN montant_facture_1 -- WHEN MONTANT = MNTHMUT + MNTPMUT THEN montant_facture_2 -- WHEN MONTANT = SLDHASS + SLDPASS THEN montant_facture_0 -- WHEN MONTANT = SLDHAM + SLDPAM THEN montant_facture_1 -- WHEN MONTANT = SLDHMUT + SLDPMUT THEN montant_facture_2 -- WHEN MONTANT = MNTHASS THEN 0 -- WHEN MONTANT = MNTHAM THEN 0 -- WHEN MONTANT = MNTHMUT THEN 0 -- WHEN MONTANT = SLDHASS THEN 0 -- WHEN MONTANT = SLDHAM THEN 0 -- WHEN MONTANT = SLDHMUT THEN 0 -- ELSE 0 END as MONTANT_CALC FROM w_FAC_CORR --,w_FAC_FACTURE_LIGNE_C WHERE --w_FAC_CORR.NOFAC = w_FAC_FACTURE_LIGNE_C.no_facture --AND (((MONTANT = MNTPASS OR MONTANT = MNTPAM OR MONTANT = MNTPMUT OR MONTANT = MNTHASS OR MONTANT = MNTHAM OR MONTANT = MNTHMUT OR MONTANT = MNTHASS + MNTPASS OR MONTANT = MNTHAM+MNTPAM OR MONTANT = MNTHMUT+MNTPMUT)) -- AND w_FAC_CORR.NOFAC NOT IN (SELECT no_facture FROM w_FAC_REGLEMENT_LIGNE_C)) -- OR -- ((MONTANT = SLDPASS OR MONTANT = SLDPAM OR MONTANT = SLDPMUT -- OR MONTANT = SLDHASS OR MONTANT = SLDHAM OR MONTANT = SLDHMUT -- OR MONTANT = SLDHASS + SLDPASS OR MONTANT = SLDHAM+SLDPAM OR MONTANT = SLDHMUT+SLDPMUT) --) )) as sub -- WHERE MONTANT_CALC = MONTANT GROUP BY NOREGL,prestation_id; INSERT INTO w_FAC_REGLEMENT_LIGNE_C SELECT NOFAC, date_reglement, rubrique_comptabilisation_id, prestation_id, montant_regle , montant_regle_0, montant_regle_1, montant_regle_2, 0 as montant_regle_22 FROM w_FAC_REG_SEJ WHERE montant_regle != 0; INSERT INTO w_FAC_REGLEMENT_LIGNE_C SELECT MAX(w_FAC_CORR.NOFAC) AS NOFAC, MAX(DATE) AS date_reglement, MAX(rubrique_comptabilisation_id) AS rubrique_comptabilisation_id, MAX(prestation_id) AS prestation_id, CASE WHEN MAX(SENS) IS DISTINCT FROM '-' THEN MAX(MONTANT) ELSE - MAX(MONTANT) END AS montant_regle , CASE WHEN MAX(DEBITEUR) = 3 THEN CASE WHEN MAX(SENS) IS DISTINCT FROM '-' THEN MAX(MONTANT) ELSE - MAX(MONTANT) END ELSE 0 END AS montant_regle_0, CASE WHEN MAX(DEBITEUR) = 1 THEN CASE WHEN MAX(SENS) IS DISTINCT FROM '-' THEN MAX(MONTANT) ELSE - MAX(MONTANT) END ELSE 0 END AS montant_regle_1, CASE WHEN MAX(DEBITEUR) = 2 THEN CASE WHEN MAX(SENS) IS DISTINCT FROM '-' THEN MAX(MONTANT) ELSE - MAX(MONTANT) END ELSE 0 END AS montant_regle_2, 0 as montant_regle_22 FROM w_FAC_CORR WHERE NOREGL NOT IN (SELECT NOREGL FROM w_FAC_REG_SEJ) GROUP BY NOREGL; 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; -- 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; -- maj soldes UPDATE activite[PX].p_factures SET montant_regle_c = sub.montant_regle_c, montant_regle_0_c = sub.montant_regle_0_c, montant_regle_1_c = sub.montant_regle_1_c, montant_regle_2_c = sub.montant_regle_2_c FROM ( SELECT no_facture, SUM(reg_c.montant_regle) AS montant_regle_c, SUM(reg_c.montant_regle_0) AS montant_regle_0_c, SUM(reg_c.montant_regle_1) AS montant_regle_1_c, SUM(reg_c.montant_regle_2) AS montant_regle_2_c FROM activite[PX].p_factures_soldes_c reg_c GROUP BY 1) as sub WHERE sub.no_facture = p_factures.no_facture; ]]> = 7 THEN 'CCAM' ELSE 'NGAP' END), MIN(CASE WHEN length(trim(NCCAM)) >= 7 THEN 0 ELSE t_ccam_regroupements.oid END), MIN(CASE WHEN length(trim(NCCAM)) >= 7 THEN 0 ELSE t_ccam_regroupements.oid END), 0 FROM w_FAC_FACTURE, prod_mederi.KACTES LEFT JOIN base.t_actes ON (trim(substring(NCCAM, 1, 7)) = trim(t_actes.code)), base.t_ccam_regroupements WHERE w_FAC_FACTURE.NOFAC = KACTES.NOFAC AND TYPERUB = 4 AND t_actes.oid is NULL AND t_ccam_regroupements.code = 'NGAP' AND NCCAM IS NOT NULL GROUP BY 1,2,3; DROP TABLE IF EXISTS w_FAC_FACTURE_LIGNE_H; CREATE TEMP TABLE w_FAC_FACTURE_LIGNE_H AS SELECT ACCLEUNIK, KACTES.NOFAC AS no_facture, DATEACTE AS date_debut, COALESCE(DATEFIN,DATEACTE) AS date_fin, CASE WHEN FACPARTIEL != 9 AND DATEFAC IS NOT NULL THEN DATEFAC ELSE '20991231'::date END AS date_vente, lieu_sortie_id, CASE WHEN TYPEFAC NOT IN ('2','4') THEN QTE ELSE 0-QTE END AS nb_rubrique, CASE WHEN TYPEFAC NOT IN ('2','4') THEN QTE ELSE 0-QTE END AS nb_prestations, KACTES.COEFF as coefficient, 1 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, PRIXU::numeric AS prix_unitaire, COALESCE(t_actes.oid::bigint, 0) AS acte_id, replace(HDEBUT,':','')::int AS heure_debut, PHASE::int AS phase_ccam, ACTIVITE::integer AS activite_ccam, '' AS extension_ccam, substr(MODIFICAT,1,1) AS modificateur_ccam_1, substr(MODIFICAT,2,1) AS modificateur_ccam_2, substr(MODIFICAT,3,1) AS modificateur_ccam_3, substr(MODIFICAT,4,1) AS modificateur_ccam_4, SUM(CASE WHEN TYPEFAC NOT IN ('2','4') THEN MNTASS + MNTMUT + MNTSS ELSE - (MNTASS + MNTMUT + MNTSS) END) AS montant_facture, SUM(CASE WHEN TYPEFAC NOT IN ('2','4') THEN MNTASS ELSE - MNTASS END) AS montant_facture_0, SUM(CASE WHEN TYPEFAC NOT IN ('2','4') THEN MNTSS ELSE - MNTSS END) AS montant_facture_1, SUM(CASE WHEN TYPEFAC NOT IN ('2','4') THEN MNTMUT ELSE - MNTMUT END) AS montant_facture_2, 0 as montant_facture_22, SUM(CASE WHEN TYPEFAC NOT IN ('2','4') THEN MDCAI + MDMUT + MDASS ELSE - (MDCAI + MDMUT + MDASS) END) as montant_depassement, 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, AVG(1-TAUXSS-TAUXMUT) as taux_0, AVG(TAUXSS) as taux_1, AVG(TAUXMUT) as taux_2, 0 as taux_22, SUM(CASE WHEN DATEFAC IS NOT NULL AND NOT (CODETAB = 3 AND valeur = 1) THEN CASE WHEN TYPEFAC NOT IN ('2','4') THEN MNTASS + MNTMUT + MNTSS ELSE - (MNTASS + MNTMUT + MNTSS) END ELSE 0 END) AS montant_comptabilise, SUM(CASE WHEN DATEFAC IS NOT NULL AND NOT (CODETAB = 3 AND valeur = 1) THEN CASE WHEN TYPEFAC NOT IN ('2','4') THEN MNTASS ELSE - MNTASS END ELSE 0 END) AS montant_comptabilise_0, SUM(CASE WHEN DATEFAC IS NOT NULL AND NOT (CODETAB = 3 AND valeur = 1) THEN CASE WHEN TYPEFAC NOT IN ('2','4') THEN MNTSS ELSE - MNTSS END ELSE 0 END) AS montant_comptabilise_1, SUM(CASE WHEN DATEFAC IS NOT NULL AND NOT (CODETAB = 3 AND valeur = 1) THEN CASE WHEN TYPEFAC NOT IN ('2','4') THEN MNTMUT ELSE - MNTMUT END ELSE 0 END) AS montant_comptabilise_2, 0 as montant_comptabilise_22 FROM prod_mederi.KACTES LEFT JOIN w_FAC_FACTURE ON w_FAC_FACTURE.NOFAC = KACTES.NOFAC LEFT JOIN activite[PX].t_rubriques_facturation ON (KACTES.NOACTE = t_rubriques_facturation.code_original) LEFT JOIN prod_mederi.KRUBINT ON (KACTES.NOACTE = KRUBINT.NOACTE) LEFT JOIN activite.t_prestations ON (NOACTESS = t_prestations.code) LEFT JOIN activite[PX].t_medecins_administratifs ON (NOPRAT = t_medecins_administratifs.code_original) LEFT JOIN base.t_actes ON (CASE WHEN NCCAM IS NULL THEN KACTES.NOACTE ELSE substring(NCCAM, 1, 7) END = t_actes.code) LEFT JOIN W_KPRAT KPRAT ON KACTES.NOPRAT = KPRAT.NOPRAT LEFT JOIN activite.t_divers ON t_divers.code = 'MEDSAL_COMPTACLI' AND valeur = 1 WHERE 1=1 AND TYPEFAC NOT IN (3,4) AND KACTES.TYPERUB = 4 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; -- modificationd es factures avec règlements sans détail (trop percus ) 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, 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 ) SELECT no_facture, date_debut, date_fin, nb_rubrique, nb_prestations, 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_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 FROM w_FAC_FACTURE_LIGNE_H; DROP TABLE IF EXISTS w_mouvements_sejour_lieu_jour; CREATE TEMP TABLE w_mouvements_sejour_lieu_jour AS SELECT no_sejour, date, (MAX(CASE WHEN est_absence <> '1' THEN Array[heure_fin, lieu_id] ELSE NULL END))[2] AS lieu_id, (MAX(Array[heure_fin, lieu_id]))[2] AS lieu_id_avec_absence FROM activite[PX].p_mouvements_sejour JOIN activite[PX].t_lieux ON lieu_id = t_lieux.oid JOIN activite[PX].t_services_facturation On service_facturation_id = t_services_facturation.oid GROUP BY 1,2; UPDATE activite[PX].p_factures_lignes_h SET lieu_id = COALESCE(w_mouvements_sejour_lieu_jour.lieu_id,w_mouvements_sejour_lieu_jour.lieu_id_avec_absence) FROM activite[PX].p_factures, w_mouvements_sejour_lieu_jour WHERE p_factures_lignes_h.no_facture = p_factures.no_facture AND p_factures.no_sejour = w_mouvements_sejour_lieu_jour.no_sejour AND p_factures_lignes_h.date_debut = w_mouvements_sejour_lieu_jour.date AND p_factures_lignes_h.lieu_id <> COALESCE(w_mouvements_sejour_lieu_jour.lieu_id,w_mouvements_sejour_lieu_jour.lieu_id_avec_absence); 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 ]]> 0 OR montant_comptabilise_0 <> 0 OR montant_comptabilise_1 <> 0 OR montant_comptabilise_2 <> 0 OR montant_comptabilise_22 <> 0 ) AND w_FAC_FACTURE_LIGNE_H.no_facture IS NOT NULL 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 KACTES.NOFAC AS no_facture, KRGLDET.DATE AS date_reglement, COALESCE(t_medecins_administratifs.oid::bigint, 0) AS medecin_comptabilise_id, SUM(KRGLDET.MONTANT) AS montant_regle, SUM(CASE WHEN KREGL.DEBITEUR = 3 THEN KRGLDET.MONTANT ELSE 0 END) AS montant_regle_0, SUM(CASE WHEN KREGL.DEBITEUR = 1 THEN KRGLDET.MONTANT ELSE 0 END) AS montant_regle_1, SUM(CASE WHEN KREGL.DEBITEUR = 2 THEN KRGLDET.MONTANT ELSE 0 END) AS montant_regle_2, 0 AS montant_regle_22 FROM w_KRGLDET KRGLDET JOIN w_KREGL KREGL ON KRGLDET.NOREGL = KREGL.NOREGL JOIN prod_mederi.KACTES ON KACTES.ACCLEUNIK = KRGLDET.ACCLEUNIK JOIN activite[PX].p_sejours ON KACTES.NODOSSIER = p_sejours.no_sejour LEFT JOIN activite[PX].t_medecins_administratifs ON (KACTES.NOPRAT = t_medecins_administratifs.code_original) LEFT JOIN activite.t_divers ON t_divers.code = 'MEDSAL_COMPTACLI' JOIN W_KPRAT KPRAT ON KACTES.NOPRAT = KPRAT.NOPRAT AND (valeur != 1 OR CODETAB != 3) WHERE 1=1 AND NOT ((KREGL.ORIGINE = 13 AND KREGL.DEBITEUR = 1) OR (KREGL.ORIGINE = 1 AND KREGL.DEBITEUR = 3)) AND TYPERUB = 4 GROUP BY 1,2,3; -- Règlements sans affectation INSERT INTO w_FAC_REGLEMENT_LIGNE_H SELECT subview.no_facture AS no_facture, date(KREGL.DATE) AS date_reglement, 0::bigint AS medecin_comptabilise_id, SUM(KREGL.MONTANT) AS montant_regle, SUM(CASE WHEN KREGL.DEBITEUR = 3 THEN KREGL.MONTANT ELSE 0 END) AS montant_regle_0, SUM(CASE WHEN KREGL.DEBITEUR = 1 THEN KREGL.MONTANT ELSE 0 END) AS montant_regle_1, SUM(CASE WHEN KREGL.DEBITEUR = 2 THEN KREGL.MONTANT ELSE 0 END) AS montant_regle_2, 0 AS montant_regle_22 FROM w_KREGL KREGL JOIN ( SELECT no_sejour, (MAX(ARRAY[date_facture::text, no_facture]))[2] AS no_facture FROM activite[PX].p_factures GROUP BY 1 ) subview ON subview.no_sejour = NODOSSIER WHERE 1=1 AND KREGL.DEBITEUR = '3' AND NUMREGLD = '0' AND ignore = '0' AND forcehon = '1' GROUP BY 1,2,3 ; -- Acomptes INSERT INTO w_FAC_REGLEMENT_LIGNE_H SELECT KACTES.NOFAC AS no_facture, KRGLDET.DATE AS date_reglement, 0 AS medecin_comptabilise_id, SUM(KRGLDET.MONTANT) AS montant_regle, SUM(CASE WHEN KREGL.DEBITEUR = 3 THEN KRGLDET.MONTANT ELSE 0 END) AS montant_regle_0, SUM(CASE WHEN KREGL.DEBITEUR = 1 THEN KRGLDET.MONTANT ELSE 0 END) AS montant_regle_1, SUM(CASE WHEN KREGL.DEBITEUR = 2 THEN KRGLDET.MONTANT ELSE 0 END) AS montant_regle_2, 0 AS montant_regle_22 FROM w_KRGLDET KRGLDET JOIN w_KREGL KREGL ON KRGLDET.NOREGL = KREGL.NOREGL JOIN prod_mederi.KACTES ON KACTES.ACCLEUNIK = KRGLDET.ACCLEUNIK JOIN activite[PX].p_sejours ON KACTES.NODOSSIER = p_sejours.no_sejour LEFT JOIN activite[PX].t_medecins_administratifs ON (KACTES.NOPRAT = t_medecins_administratifs.code_original) LEFT JOIN activite.t_divers ON t_divers.code = 'MEDSAL_COMPTACLI' JOIN W_KPRAT KPRAT ON KACTES.NOPRAT = KPRAT.NOPRAT AND (valeur != 1 OR CODETAB != 3) WHERE 1=1 AND ((KREGL.ORIGINE = 13 AND KREGL.DEBITEUR = 1) OR (KREGL.ORIGINE = 1 AND KREGL.DEBITEUR = 3)) AND TYPERUB = 4 GROUP BY 1,2,3 ; UPDATE w_FAC_REG_SEJ SET montant_regle = 0, montant_regle_0 = 0, montant_regle_1 = 0, montant_regle_2 = 0 ; UPDATE w_FAC_REG_SEJ SET montant_regle = CASE WHEN SENS IS DISTINCT FROM '-' THEN MONTANT ELSE - MONTANT END, montant_regle_0 = CASE WHEN sub.DEBITEUR = 3 THEN CASE WHEN SENS IS DISTINCT FROM '-' THEN MONTANT ELSE - MONTANT END ELSE 0 END, montant_regle_1 = CASE WHEN sub.DEBITEUR = 1 THEN CASE WHEN SENS IS DISTINCT FROM '-' THEN MONTANT ELSE - MONTANT END ELSE 0 END, montant_regle_2 = CASE WHEN sub.DEBITEUR = 2 THEN CASE WHEN SENS IS DISTINCT FROM '-' THEN MONTANT ELSE - MONTANT END ELSE 0 END FROM (SELECT NOREGL, w_FAC_CORR.NOFAC, date(w_FAC_CORR.DATE) AS DATE, SENS, DEBITEUR, CASE WHEN MONTANT = MNTHASS THEN montant_facture_0 WHEN MONTANT = MNTHAM THEN montant_facture_1 WHEN MONTANT = MNTHMUT THEN montant_facture_2 WHEN MONTANT = SLDHASS THEN montant_facture_0 WHEN MONTANT = SLDHAM THEN montant_facture_1 WHEN MONTANT = SLDHMUT THEN montant_facture_2 WHEN MONTANT = MNTHASS + MNTPASS THEN montant_facture_0 WHEN MONTANT = MNTHAM + MNTPAM THEN montant_facture_1 WHEN MONTANT = MNTHMUT + MNTPMUT THEN montant_facture_2 WHEN MONTANT = SLDHASS + SLDPASS THEN montant_facture_0 WHEN MONTANT = SLDHAM + SLDPAM THEN montant_facture_1 WHEN MONTANT = SLDHMUT + SLDPMUT THEN montant_facture_2 WHEN MONTANT = MNTPASS THEN 0 WHEN MONTANT = MNTPAM THEN 0 WHEN MONTANT = MNTPMUT THEN 0 WHEN MONTANT = SLDPASS THEN 0 WHEN MONTANT = SLDPAM THEN 0 WHEN MONTANT = SLDPMUT THEN 0 ELSE 0 END as MONTANT FROM w_FAC_CORR ,w_FAC_FACTURE_LIGNE_H WHERE w_FAC_CORR.NOFAC = w_FAC_FACTURE_LIGNE_H.no_facture AND (((MONTANT = MNTPASS OR MONTANT = MNTPAM OR MONTANT = MNTPMUT OR MONTANT = MNTHASS OR MONTANT = MNTHAM OR MONTANT = MNTHMUT OR MONTANT = MNTHASS + MNTPASS OR MONTANT = MNTHAM+MNTPAM OR MONTANT = MNTHMUT+MNTPMUT) AND w_FAC_CORR.NOFAC NOT IN (SELECT no_facture FROM w_FAC_REGLEMENT_LIGNE_H)) OR ((MONTANT = SLDPASS OR MONTANT = SLDPAM OR MONTANT = SLDPMUT OR MONTANT = SLDHASS OR MONTANT = SLDHAM OR MONTANT = SLDHMUT OR MONTANT = SLDHASS + SLDPASS OR MONTANT = SLDHAM+SLDPAM OR MONTANT = SLDHMUT+SLDPMUT) )) ) as sub WHERE sub.NOFAC = w_FAC_REG_SEJ.NOFAC AND sub.DEBITEUR = w_FAC_REG_SEJ.DEBITEUR AND sub.DATE = w_FAC_REG_SEJ.date_reglement ; INSERT INTO w_FAC_REGLEMENT_LIGNE_H SELECT NOFAC, date_reglement, 0 as medecin_comptabilise_id, montant_regle , montant_regle_0, montant_regle_1, montant_regle_2, 0 as montant_regle_22 FROM w_FAC_REG_SEJ WHERE montant_regle != 0; DELETE FROM w_FAC_REGLEMENT_LIGNE_H WHERE w_FAC_REGLEMENT_LIGNE_H.no_facture NOT IN (SELECT p_factures.no_facture FROM activite[PX].p_factures) ; -- 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 TRUE AND date_reglement IS NOT NULL AND p_factures_soldes_h.no_facture IS NULL AND w_FAC_REGLEMENT_LIGNE_H.no_facture IS NOT NULL; 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; -- maj soldes UPDATE activite[PX].p_factures SET montant_regle_h = sub.montant_regle_h, montant_regle_0_h = sub.montant_regle_0_h, montant_regle_1_h = sub.montant_regle_1_h, montant_regle_2_h = sub.montant_regle_2_h FROM ( SELECT no_facture, SUM(reg_h.montant_regle) AS montant_regle_h, SUM(reg_h.montant_regle_0) AS montant_regle_0_h, SUM(reg_h.montant_regle_1) AS montant_regle_1_h, SUM(reg_h.montant_regle_2) AS montant_regle_2_h FROM activite[PX].p_factures_soldes_h reg_h GROUP BY 1) as sub WHERE sub.no_facture = p_factures.no_facture; ]]> '1' AND type_facture <> 'X' 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 <> 'X' AND type_facture <> 'P' AND (t_prestations.code IN ('GHS','PJ') OR (p_factures.no_facture LIKE '%BG' AND p_sejours.type_sejour IN ('1','2','5'))) THEN p_factures.no_facture ELSE null END) AS no_facture_reference_sejour_last, COUNT(DISTINCT p_factures.no_facture) AS nb_factures, MAX(avec_facturation_intermediaire) AS avec_facturation_intermediaire FROM activite[PX].p_factures JOIN activite[PX].p_sejours ON p_factures.no_sejour = p_sejours.no_sejour JOIN activite[PX].t_lieux ON p_sejours.lieu_sortie_id = t_lieux.oid JOIN activite[PX].t_services_facturation ON service_facturation_id = t_services_facturation.oid LEFT JOIN activite[PX].p_factures_lignes_c ON p_factures.no_facture = p_factures_lignes_c.no_facture LEFT JOIN activite.t_prestations ON p_factures_lignes_c.prestation_id = t_prestations.oid AND t_prestations.code IN ('GHS','PJ') GROUP BY 1,2; CREATE INDEX w_sejours_facture_reference_i1 ON w_sejours_facture_reference USING btree (no_sejour); UPDATE activite[PX].p_factures SET no_facture_reference = COALESCE(no_facture_reference_sejour_last, no_facture_reference_last, no_facture_last) FROM w_sejours_facture_reference JOIN activite[PX].p_sejours ON p_sejours.no_sejour = w_sejours_facture_reference.no_sejour WHERE p_factures.no_sejour = w_sejours_facture_reference.no_sejour AND ( p_factures.date_fin = w_sejours_facture_reference.date_fin OR p_factures.date_fin = p_sejours.date_sortie AND avec_facturation_intermediaire IS DISTINCT FROM '1' ) AND p_factures.no_facture_reference <> COALESCE(no_facture_reference_sejour_last, no_facture_reference_last, no_facture_last); UPDATE activite[PX].p_factures SET 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; -- Suppression des tables de travail non utilisées après DROP TABLE IF EXISTS w_sejours_facture_reference CASCADE; ]]> = '[ENV_ADM_ANNEEDEBUT]0101' AND NOFAC IS NOT NULL GROUP BY 1 UNION ALL SELECT date_trunc('month',DATE) AS date_comptable, 0 AS montant_vente_c, SUM(CASE WHEN NOPRAT IS NULL THEN KRGLDET.MONTANT ELSE 0 END) AS montant_reglements_c, 0 AS montant_solde_c, 0 AS montant_vente_h, SUM(CASE WHEN NOPRAT IS NOT NULL THEN KRGLDET.MONTANT ELSE 0 END) AS montant_reglements_h, 0 AS montant_solde_h FROM w_KRGLDET KRGLDET WHERE DATE > '[ENV_ADM_ANNEEDEBUT]0101' AND KRGLDET.NOFAC IS NOT NULL GROUP BY 1 ORDER BY 1) AS sub GROUP BY 1; TRUNCATE activite[PX].p_factures_comptables; INSERT INTO activite[PX].p_factures_comptables ( no_facture, date_comptable, montant_ventes_c, montant_ventes_h, montant_reglements_c, montant_reglements_h ) SELECT no_facture, date_comptable, SUM(montant_ventes_c) AS montant_ventes_c, SUM(montant_ventes_h) AS montant_ventes_h, SUM(montant_reglements_c) AS montant_reglements_c, SUM(montant_reglements_h) AS montant_reglements_h FROM ( SELECT COALESCE(NOFAC,'000000000') AS no_facture, DATEFAC AS date_comptable, SUM(CASE WHEN TYPEFAC NOT IN ('2','4') THEN MNTPREST ELSE 0 -MNTPREST END) AS montant_ventes_c, SUM(CASE WHEN TYPEFAC NOT IN ('2','4') THEN MNTHONO ELSE 0 -MNTHONO END) AS montant_ventes_h, 0::numeric AS montant_reglements_c, 0::numeric AS montant_reglements_h FROM w_KFACTURE KFACTURE WHERE DATEFAC >= '[ENV_ADM_ANNEEDEBUT]0101' AND NOFAC IS NOT NULL GROUP BY 1,2 HAVING SUM(MNTPREST) <> 0 OR SUM(MNTHONO) <> 0 UNION SELECT COALESCE(KRGLDET.NOFAC,'000000000') AS no_facture, date_trunc('month',DATE) AS date_comptable, 0 AS montant_vente_c, 0 AS montant_vente_h, SUM(CASE WHEN NOPRAT IS NULL THEN KRGLDET.MONTANT ELSE 0 END) AS montant_reglements_c, SUM(CASE WHEN NOPRAT IS NOT NULL THEN KRGLDET.MONTANT ELSE 0 END) AS montant_reglements_h FROM w_KRGLDET KRGLDET WHERE DATE > '[ENV_ADM_ANNEEDEBUT]0101' AND KRGLDET.NOFAC IS NOT NULL GROUP BY 1,2 ) subview GROUP BY 1,2 ORDER BY 1,2; ]]> 1 AND count(distinct TYPEFAC) = 1 ) subview WHERE w_KFACTURE.NOFAC = subview.NOFAC ; -- ELA Suppression des autres factures en double (en attendant mieux) UPDATE w_KFACTURE SET est_doublon = '1' WHERE NOFAC IN ( SELECT NOFAC FROM w_KFACTURE WHERE NOFAC IS NOT NULL AND est_doublon = '0' GROUP BY 1 HAVING count(*) > 1 ) ; UPDATE w_KFACTURE SET MNTPREST = MNTPREST - MNTPASS, MNTPASS = MNTPREST - MNTPASS WHERE NOFAC LIKE 'P%' AND (MNTPREST IS DISTINCT FROM MNTPREST - MNTPASS OR MNTPASS IS DISTINCT FROM MNTPREST - MNTPASS ) ; CREATE INDEX w_KFACTURE_ik_nofac ON w_KFACTURE USING btree (nofac); CREATE INDEX w_KFACTURE_ik_nodossier ON w_KFACTURE USING btree (nodossier); UPDATE w_KFACTURE SET DATEFACPAR = subview.DATEFIN FROM (SELECT NOFAC, MAX(COALESCE(DATEFIN,DATEACTE)) AS DATEFIN FROM prod_mederi.KACTES WHERE NOACTE = 'PJ' GROUP BY 1 ) subview WHERE w_KFACTURE.NOFAC = subview.NOFAC AND DATEFACPAR IS NOT NULL AND TYPEFAC = '1' AND (DATEFACPAR - subview.DATEFIN) > 1 ; -- Préparation table des reglements pour signer DROP TABLE IF EXISTS w_KREGL; CREATE TEMP TABLE w_KREGL AS SELECT *, '0'::text AS ignore, '0'::text AS forcehon FROM prod_mederi.KREGL ; UPDATE w_KREGL SET forcehon = '1' WHERE NUMREGLD = 0 AND libelle like 'Rglt %' AND libelle like '% Hon N%' ; UPDATE w_KREGL SET ignore = '1' WHERE NUMREGLD = 0 AND ETATREGL <> '1' AND ORIGINE = 8 ; UPDATE w_KREGL SET SENS = CASE WHEN ORIGINE IN ('4', '6', '8','10','12','14','15') THEN '-' ELSE '' END, MONTANT = CASE WHEN ORIGINE IN ('4', '6', '8','10','12','14','15') THEN 0-MONTANT ELSE MONTANT END ; ANALYSE w_KREGL ; CREATE INDEX w_KREGL_ik_nodossier ON w_KREGL USING btree (nodossier); CREATE INDEX w_KREGL_ik_noregl ON w_KREGL USING btree (noregl); DROP TABLE IF EXISTS w_KRGLDET; CREATE TEMP TABLE w_KRGLDET AS SELECT * FROM prod_mederi.KRGLDET ; UPDATE w_KRGLDET SET MONTANT = CASE WHEN ORIGINE IN ('4', '6', '8','10','12','14','15') THEN 0-MONTANT ELSE MONTANT END WHERE ORIGINE IN ('4', '6', '8','10','12','14','15') ; ANALYSE w_KRGLDET ; CREATE INDEX w_KRGLDET_ik_nodossier ON w_KRGLDET USING btree (nodossier); CREATE INDEX w_KRGLDET_ik_noregl ON w_KRGLDET USING btree (noregl); CREATE INDEX w_KRGLDET_ik_nofac ON w_KRGLDET USING btree (nofac); -- N° dossier vide sur entete reglement UPDATE w_KREGL SET NODOSSIER = subview.NODOSSIER FROM ( SELECT w_KREGL.NOREGL, MAX(w_KFACTURE.NODOSSIER) AS NODOSSIER FROM w_KREGL JOIN w_KRGLDET ON w_KREGL.NOREGL = w_KRGLDET.NOREGL JOIN w_KFACTURE ON w_KRGLDET.NOFAC = w_KFACTURE.NOFAC WHERE w_KREGL.NODOSSIER IS NULL GROUP BY 1 ) subview WHERE w_KREGL.NOREGL = subview.NOREGL AND w_KREGL.NODOSSIER IS NULL ; ]]> '00'; ]]> NOMPRAT OR t_medecins_administratifs.prenom <> PRENOMPRAT 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; -- no_adeli UPDATE activite[PX].t_medecins_administratifs SET no_adeli = CODEINSEE FROM prod_mederi.KPRAT WHERE t_medecins_administratifs.code_original = NOPRAT AND t_medecins_administratifs.NO_ADELI IS DISTINCT FROM CODEINSEE ; ]]> 2 AND KCHAMBRE.NOLIT IS NULL AND ch.NOLIT IS NOT NULL; -- cas nochambre = P, F ou rien et no lit = AC UPDATE prod_mederi.KSEJOUR SET NOCHAMBRE = ch.NOLIT FROM prod_mederi.KSEJOUR mv LEFT JOIN prod_mederi.KCHAMBRE ON mv.NOCHAMBRE = KCHAMBRE.NOLIT LEFT JOIN prod_mederi.KCHAMBRE ch ON left(replace(ch.NOLIT,' ',''),-3) = replace (mv.NOCHAMBRE,' ','') WHERE KSEJOUR.SECLEUNIK = mv.SECLEUNIK AND length(KSEJOUR.NOCHAMBRE) > 2 AND KCHAMBRE.NOLIT IS NULL AND ch.NOLIT IS NOT NULL; -- cas nochambre = XUSI UPDATE prod_mederi.KSEJOUR SET NOCHAMBRE = ch.NOLIT FROM prod_mederi.KSEJOUR mv LEFT JOIN prod_mederi.KCHAMBRE ON mv.NOCHAMBRE = KCHAMBRE.NOLIT LEFT JOIN prod_mederi.KCHAMBRE ch ON replace(mv.NOCHAMBRE,'USI','') = ch.NOLIT WHERE KSEJOUR.SECLEUNIK = mv.SECLEUNIK AND length(KSEJOUR.NOCHAMBRE) > 2 AND KCHAMBRE.NOLIT IS NULL AND ch.NOLIT IS NOT NULL; INSERT INTO activite[PX].t_lits(code_original, code, texte, texte_court, etage_id, chambre_particuliere) SELECT NOLIT, NOLIT, NOLIT, NOLIT, t_etages.oid, CASE WHEN NOACTE = 'CP' THEN 'O' ELSE 'N' END AS CP FROM prod_mederi.KCHAMBRE, activite[PX].t_etages WHERE SECTEUR = t_etages.code_original AND NOLIT NOT IN (SELECT code_original FROM activite[PX].t_lits WHERE code_original IS NOT NULL ) GROUP BY NOLIT, NOLIT, NOLIT, NOLIT, t_etages.oid, NOACTE ; -- Lits non définis DROP TABLE IF EXISTS w_KSEJOUR_CHAMBRE; CREATE TEMP TABLE w_KSEJOUR_CHAMBRE AS SELECT NOCHAMBRE AS NOLIT, ''::text AS SECTEUR FROM prod_mederi.KSEJOUR WHERE NOCHAMBRE NOT IN (SELECT NOLIT FROM prod_mederi.KCHAMBRE WHERE NOLIT IS NOT NULL) GROUP BY 1 ORDER BY 1; UPDATE w_KSEJOUR_CHAMBRE SET SECTEUR = subview.SECTEUR FROM ( SELECT NOCHAMBRE, MAX(SECTEUR) AS SECTEUR FROM prod_mederi.KCHAMBRE WHERE NOCHAMBRE IS NOT NULL AND NOCHAMBRE <> '' GROUP BY 1 HAVING count(DISTINCT SECTEUR) = 1 ) subview WHERE w_KSEJOUR_CHAMBRE.NOLIT LIKE subview.NOCHAMBRE || '%' ; INSERT INTO activite[PX].t_lits(code_original, code, texte, texte_court, etage_id, chambre_particuliere) SELECT NOLIT, NOLIT, NOLIT, NOLIT, t_etages.oid, 'N' AS CP FROM w_KSEJOUR_CHAMBRE, activite[PX].t_etages WHERE SECTEUR = t_etages.code_original AND NOLIT NOT IN (SELECT code_original FROM activite[PX].t_lits WHERE code_original IS NOT NULL ) GROUP BY NOLIT, NOLIT, NOLIT, NOLIT, t_etages.oid ; 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 = ''; ]]> '' AND substring(CODEACTE, 1, 7) NOT IN (SELECT code FROM base.t_actes WHERE code IS NOT NULL) GROUP BY 1,2,3; ]]> '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; ]]> '2099-12-31'; DROP TABLE IF EXISTS w_sejours_total; CREATE TEMP TABLE w_sejours_total AS SELECT p_sejours.no_sejour AS no_sejour, p_sejours.code_sorti, p_sejours.date_sortie, p_sejours.date_groupage, p_sejours.ghs_id, MAX(COALESCE(p_factures.date_facture,'20991231')) AS date_facture, MAX(COALESCE(p_factures.date_expedition,'20991231')) AS date_expedition, MAX(COALESCE(p_factures.date_solde,'20991231')) AS date_solde, SUM(COALESCE(p_factures.montant_facture_c,0)) AS montant_facture_c, SUM(COALESCE(p_factures.montant_facture_h,0)) AS montant_facture_h, SUM(COALESCE(p_factures.montant_regle_c,0)) AS montant_regle_c, SUM(COALESCE(p_factures.montant_regle_h,0)) AS montant_regle_h, SUM(COALESCE(CASE WHEN p_factures.type_facture <> 'P' AND p_factures.type_facture <> 'E' AND p_factures.type_facture <> 'G' THEN 1 ELSE 0 END,0)) AS nb_factures, SUM(COALESCE(CASE WHEN p_factures.type_facture = '0' THEN 0 ELSE 1 END,0)) AS nb_factures_regularisation, SUM(COALESCE(p_factures.nb_rejets,0)) AS nb_rejets, SUM(COALESCE(p_factures.montant_facture_0_c,0)) AS montant_facture_0_c, SUM(COALESCE(p_factures.montant_facture_0_h,0)) AS montant_facture_0_h, SUM(COALESCE(p_factures.montant_regle_0_c,0)) AS montant_regle_0_c, SUM(COALESCE(p_factures.montant_regle_0_h,0)) AS montant_regle_0_h, MAX(COALESCE(CASE WHEN (p_factures.montant_facture_0_c <> 0 OR p_factures.montant_facture_0_h <> 0) THEN p_factures.date_expedition_0 ELSE '0001-01-01' END,'20991231' )) AS date_expedition_0, MAX(COALESCE(CASE WHEN p_factures.date_solde_0_c < '2099-12-31' AND p_factures.date_solde_0_c > p_factures.date_solde_0_h THEN p_factures.date_solde_0_c ELSE p_factures.date_solde_0_h END,'20991231' )) AS date_solde_0, SUM(COALESCE(p_factures.montant_facture_1_c,0)) AS montant_facture_1_c, SUM(COALESCE(p_factures.montant_facture_1_h,0)) AS montant_facture_1_h, SUM(COALESCE(p_factures.montant_regle_1_c,0)) AS montant_regle_1_c, SUM(COALESCE(p_factures.montant_regle_1_h,0)) AS montant_regle_1_h, MAX(COALESCE(CASE WHEN (p_factures.montant_facture_1_c <> 0 OR p_factures.montant_facture_1_h <> 0) THEN p_factures.date_expedition_1 ELSE '0001-01-01' END,'20991231' )) AS date_expedition_1, MAX(COALESCE(CASE WHEN p_factures.date_solde_1_c < '2099-12-31' AND p_factures.date_solde_1_c > p_factures.date_solde_1_h THEN p_factures.date_solde_1_c ELSE p_factures.date_solde_1_h END,'20991231' )) AS date_solde_1, SUM(COALESCE(p_factures.montant_facture_2_c,0)) AS montant_facture_2_c, SUM(COALESCE(p_factures.montant_facture_2_h,0)) AS montant_facture_2_h, SUM(COALESCE(p_factures.montant_regle_2_c,0)) AS montant_regle_2_c, SUM(COALESCE(p_factures.montant_regle_2_h,0)) AS montant_regle_2_h, MAX(COALESCE(CASE WHEN (p_factures.montant_facture_2_c <> 0 OR p_factures.montant_facture_2_h <> 0) THEN p_factures.date_expedition_2 ELSE '0001-01-01' END,'20991231' )) AS date_expedition_2, MAX(COALESCE(CASE WHEN p_factures.date_solde_2_c < '2099-12-31' AND p_factures.date_solde_2_c > p_factures.date_solde_2_h THEN p_factures.date_solde_2_c ELSE p_factures.date_solde_2_h END,'20991231' )) AS date_solde_2, SUM(COALESCE(p_factures.montant_facture_22_c,0)) AS montant_facture_22_c, SUM(COALESCE(p_factures.montant_facture_22_h,0)) AS montant_facture_22_h, SUM(COALESCE(p_factures.montant_regle_22_c,0)) AS montant_regle_22_c, SUM(COALESCE(p_factures.montant_regle_22_h,0)) AS montant_regle_22_h, MAX(COALESCE(CASE WHEN (p_factures.montant_facture_22_c <> 0 OR p_factures.montant_facture_22_h <> 0) THEN p_factures.date_expedition_22 ELSE '0001-01-01' END,'20991231' )) AS date_expedition_22, MAX(COALESCE(CASE WHEN p_factures.date_solde_22_c < '2099-12-31' AND p_factures.date_solde_22_c > p_factures.date_solde_22_h THEN p_factures.date_solde_22_c ELSE p_factures.date_solde_22_h END,'20991231' )) AS date_solde_22 , SUM(COALESCE(p_factures.montant_comptabilise_c,0)) AS montant_comptabilise_c, SUM(COALESCE(p_factures.montant_comptabilise_h,0)) AS montant_comptabilise_h, SUM(COALESCE(p_factures.montant_comptabilise_0_c,0)) AS montant_comptabilise_0_c, SUM(COALESCE(p_factures.montant_comptabilise_0_h,0)) AS montant_comptabilise_0_h, SUM(COALESCE(p_factures.montant_comptabilise_1_c,0)) AS montant_comptabilise_1_c, SUM(COALESCE(p_factures.montant_comptabilise_1_h,0)) AS montant_comptabilise_1_h, SUM(COALESCE(p_factures.montant_comptabilise_2_c,0)) AS montant_comptabilise_2_c, SUM(COALESCE(p_factures.montant_comptabilise_2_h,0)) AS montant_comptabilise_2_h, SUM(COALESCE(p_factures.montant_comptabilise_22_c,0)) AS montant_comptabilise_22_c, SUM(COALESCE(p_factures.montant_comptabilise_22_h,0)) AS montant_comptabilise_22_h, SUM(COALESCE(p_factures.montant_comptabilise_budget_global_c,0)) AS montant_comptabilise_budget_global_c, SUM(COALESCE(p_factures.montant_facture_c_actes_inclus_dans_sejour,0)) AS montant_facture_c_actes_inclus_dans_sejour, SUM(COALESCE(p_factures.montant_facture_h_actes_inclus_dans_sejour,0)) AS montant_facture_h_actes_inclus_dans_sejour, 0::numeric AS delai_groupage, 0::numeric AS delai_facture, 0::numeric AS delai_expedition, 0::numeric AS delai_solde, 0::numeric AS delai_expedition_0, 0::numeric AS delai_solde_0, 0::numeric AS delai_expedition_1, 0::numeric AS delai_solde_1, 0::numeric AS delai_expedition_2, 0::numeric AS delai_solde_2, 0::numeric AS delai_expedition_22, 0::numeric AS delai_solde_22 FROM activite[PX].p_sejours LEFT JOIN activite[PX].p_factures ON p_sejours.no_sejour = p_factures.no_sejour AND type_facture <> 'P' GROUP BY 1,2,3,4,5; UPDATE 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 ); -- Ajout des coordonnées des patients par séjour INSERT INTO activite[PX].p_coordonnees_patient ( sejour_id, adresse, code_postal_id, commune, telephone_fixe, telephone_portable, email ) SELECT p_sejours.oid, COALESCE(ADRPAT1, '') || CASE WHEN COALESCE(ADRPAT2, '') != '' THEN ' - ' || ADRPAT2 ELSE '' END, COALESCE(t_codes_postaux.oid,0), VILLEPAT, CASE WHEN SUBSTRING(TELDOM, 1,2) NOT IN ('06', '07') AND TELDOM <> '' THEN TELDOM WHEN SUBSTRING(TELBUR, 1,2) NOT IN ('06', '07') AND TELBUR <> '' THEN TELBUR ELSE ''::text END AS numero_fixe, CASE WHEN SUBSTRING(TELDOM, 1,2) IN ('06', '07') AND TELDOM <> '' THEN TELDOM WHEN SUBSTRING(TELBUR, 1,2) IN ('06', '07') AND TELBUR <> '' THEN TELBUR ELSE ''::text END AS numero_portable, COALESCE(COURRIEL1, COURRIEL2, ''::text) FROM activite[PX].p_sejours LEFT JOIN prod_mederi.KDOSSIER ON p_sejours.code_original = KDOSSIER.NODOSSIER LEFT JOIN base.t_codes_postaux ON CPPAT = t_codes_postaux.code ; -- Suppression des tables de travail non utilisées après DROP TABLE IF EXISTS w_sejours_total CASCADE; ]]> = '[ENV_ADM_ANNEEDEBUT]1201' GROUP BY 1 ORDER BY 1; CREATE INDEX w_FAC_FACTURE_DAT_CRE_i1 ON w_FAC_FACTURE_DAT_CRE USING btree (date_encours); -- encours sur medecins salaries(vide dans les encours mederi) DROP TABLE IF EXISTS w_factures_encours_salaries; CREATE TEMP TABLE w_factures_encours_salaries AS SELECT NOFAC, SUM(MONTANT + MNTCOMPL) AS montant_encours_salaries, SUM(MNTASS + MDASS) AS montant_encours_salaries_0, SUM(MNTSS + MDCAI) AS montant_encours_salaries_1, SUM(MNTMUT + MDMUT) AS montant_encours_salaries_2, 0::numeric AS montant_encours_22 FROM prod_mederi.KENCOURS JOIN W_KPRAT ON KENCOURS.NOPRAT = W_KPRAT.NOPRAT AND CODETAB = 3 JOIN activite.t_divers ON t_divers.code = 'MEDSAL_COMPTACLI' AND valeur = 1 WHERE TYPERUB = 4 GROUP BY 1 ORDER BY 1; CREATE INDEX w_factures_encours_salaries_i1 ON w_factures_encours_salaries USING btree (NOFAC); -- 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, CASE WHEN KENCOURS.NOFAC != '' THEN KENCOURS.NOFAC ELSE KENCOURS.NODOSSIER END as NOFAC, min(p_sejours.finess) as finess, min(p_sejours.no_sejour) as no_sejour, min(p_sejours.date_entree) as date_entree, min(p_sejours.date_sortie) as date_sortie, min(p_sejours.oid) AS sejour_id, min(p_sejours.lieu_sortie_id) as lieu_sortie_id, min(COALESCE(w_factures_references.no_facture,'ID' || KENCOURS.NOFAC) || '.EP' || substr(to_char(date_part('year', w_FAC_FACTURE_DAT_CRE.date_encours),'FM0000'),3,2) || to_char(date_part('month', w_FAC_FACTURE_DAT_CRE.date_encours),'FM00')) AS no_facture, min(w_factures_references.no_facture) AS no_facture_reference, min(DATEACTE) AS date_debut, max(COALESCE(DATEFIN,DATEACTE)) AS date_fin, min(w_FAC_FACTURE_DAT_CRE.date_encours) as date_encours, 'P'::text AS code_origine, min(CASE WHEN date_sortie > date_encours OR date(DATESORTIE) > date_encours THEN '0' ELSE '1' END) AS code_sorti, min(p_sejours.tiers_payant_1_id) as tiers_payant_1_id, min(p_sejours.tiers_payant_2_id) as tiers_payant_2_id, min(p_sejours.tiers_payant_22_id) as tiers_payant_22_id, min(p_sejours.tiers_payant_0_id) as tiers_payant_0_id, min(p_sejours.ghs_id) as ghs_id, min(p_sejours.ghs_bebe1_id) as ghs_bebe1_id, min(p_sejours.ghs_bebe2_id) as ghs_bebe2_id, min(p_sejours.ghs_bebe3_id) as ghs_bebe3_id, min(p_sejours.code_cp_demandee) as code_cp_demandee, SUM(MNTSS + MNTMUT + MNTASS) + SUM(COALESCE(montant_encours_salaries,0)) AS montant_encours_c, SUM(MNTASS) + SUM(COALESCE(montant_encours_salaries_0,0)) AS montant_encours_0_c, SUM(MNTSS) + SUM(COALESCE(montant_encours_salaries_1,0)) AS montant_encours_1_c, SUM(MNTMUT) + SUM(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 FROM prod_mederi.KENCOURS LEFT JOIN prod_mederi.KFACTURE ON KENCOURS.NOFAC = KFACTURE.NOFAC JOIN w_FAC_FACTURE_DAT_CRE ON date(KENCOURS.DATECREAT) = w_FAC_FACTURE_DAT_CRE.FACT_DAT_CRE AND date(date_trunc('month', DATEFAC) + interval '1 month' - interval '1 day') = date_encours JOIN prod_mederi.KDOSSIER ON KENCOURS.NODOSSIER = KDOSSIER.NODOSSIER JOIN activite[PX].p_sejours ON code_original = KENCOURS.NODOSSIER LEFT JOIN w_factures_references ON p_sejours.no_sejour = w_factures_references.no_sejour AND date_sortie BETWEEN w_factures_references.date_debut AND w_factures_references.date_fin LEFT JOIN w_factures_encours_salaries ON w_factures_encours_salaries.NOFAC = KENCOURS.NOFAC GROUP BY 2; CREATE INDEX w_factures_encours_i1 ON w_factures_encours USING btree (NOFAC); 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 no_facture NOT IN (SELECT no_facture FROM activite[PX].p_factures_encours); 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 ) 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 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, CASE WHEN KENCOURS.NOFAC != '' THEN KENCOURS.NOFAC ELSE KENCOURS.NODOSSIER END AS NOFAC, w_factures_encours.oid AS facture_id, w_factures_encours.no_facture, w_factures_encours.date_entree, w_factures_encours.date_sortie, date(DATEACTE) AS date_debut, COALESCE(date(DATEFIN),date(DATEACTE)) AS date_fin, COEFF AS nb_rubrique, 1::numeric AS coefficient, 1 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, PRIXU AS prix_unitaire, w_factures_encours.lieu_sortie_id AS lieu_id, QTE AS nb_prestation, AVG(1-TAUXSS-TAUXMUT) as taux_0, AVG(TAUXSS) as taux_1, AVG(TAUXMUT) as taux_2, 0::numeric as taux_22, SUM(MONTANT) AS montant_encours, SUM(MNTASS) AS montant_encours_0, SUM(MNTSS) AS montant_encours_1, SUM(MNTMUT) AS montant_encours_2, SUM(0) AS montant_encours_22 FROM prod_mederi.KENCOURS JOIN w_factures_encours ON CASE WHEN KENCOURS.NOFAC = '' THEN KENCOURS.NODOSSIER = w_factures_encours.NOFAC ELSE KENCOURS.NOFAC = w_factures_encours.NOFAC END LEFT JOIN activite[PX].t_rubriques_facturation ON KENCOURS.NOACTE = t_rubriques_facturation.code_original LEFT JOIN prod_mederi.KRUBINT ON KENCOURS.NOACTE = KRUBINT.NOACTE LEFT JOIN (SELECT NOACTE, NOSERVINT, MAX(NOCOMPTE) AS NOCOMPTE FROM prod_mederi.KCPTRUB GROUP BY 1,2) sub ON KENCOURS.NOSERVINT = sub.NOSERVINT AND KENCOURS.NOACTE = sub.NOACTE LEFT JOIN activite.t_prestations ON NOACTESS = t_prestations.code LEFT JOIN activite[PX].t_compte ON (NOCOMPTE IS NOT NULL AND NOCOMPTE::bigint = t_compte.code_original) OR (NOCOMPTE IS NULL AND NOCOMPTES::bigint = t_compte.code_original::bigint) WHERE KENCOURS.TYPERUB <> 4 --pas d'encours mederiu sur salariés GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,17,18,19 ORDER BY 1; 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'); -- Suppression des tables de travail non utilisées après DROP TABLE IF EXISTS w_compte CASCADE; 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; DROP TABLE IF EXISTS w_DOSSIER; ]]>