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

6161 lines
242 KiB

<?xml version="1.0" encoding="ISO-8859-1"?>
<ROOT>
<NODE name="POST" label="TRAITEMENTS COMPLEMENTAIRES COMMUNS">
<NODE label="Type d'environnement">
<sqlcmd><![CDATA[
CTISELECT_PROPERTY_READ 'ENV_WITHPMSI', MAX(CASE WHEN schemaname = 'pmsi' AND tablename = 'p_rss' THEN 1 ELSE 0 END)
FROM pg_tables
WHERE schemaname = 'pmsi' AND tablename = 'p_rss'
]]></sqlcmd>
</NODE>
<NODE label="Transformations">
<condition><![CDATA[
"[PX]" == ""
]]></condition>
<sqlcmd><![CDATA[
-- Transformation de rubriques
UPDATE activite.p_factures_lignes_c
SET rubrique_facturation_id = t_transformation.to_id
FROM activite.t_transformation
WHERE p_factures_lignes_c.rubrique_facturation_id = t_transformation.rubrique_id AND
p_factures_lignes_c.prestation_id = t_transformation.prestation_id AND
t_transformation.type = 'RUB' AND
t_transformation.to_id <> 0
;
-- Services + UF vers service
UPDATE activite.t_lieux
SET service_facturation_id = t_transformation.to_id
FROM activite.t_transformation
WHERE t_lieux.service_facturation_id = t_transformation.service_facturation_id AND
t_lieux.unite_fonctionnelle_id = t_transformation.unite_fonctionnelle_id AND
t_transformation.type = 'UFSER' AND
t_transformation.to_id <> 0
;
-- Services
UPDATE activite.t_lieux
SET service_facturation_id = t_transformation.to_id
FROM activite.t_transformation
WHERE t_lieux.service_facturation_id = t_transformation.service_facturation_id AND
t_transformation.type = 'SER' AND
t_transformation.to_id <> 0
;
-- Unités fonctionnelles
UPDATE activite.t_lieux
SET unite_fonctionnelle_id = t_transformation.to_id
FROM activite.t_transformation
WHERE t_lieux.unite_fonctionnelle_id = t_transformation.unite_fonctionnelle_id AND
t_transformation.type = 'UF' AND
t_transformation.to_id <> 0
;
-- Activites
UPDATE activite.t_lieux
SET activite_id = t_transformation.to_id
FROM activite.t_transformation
WHERE t_lieux.activite_id = t_transformation.activite_id AND
t_transformation.type = 'ACT' AND
t_transformation.to_id <> 0
;
-- Correction de comptes en double
UPDATE activite.t_compte
SET code = t_compte.code || '#' || indice::text
FROM
(
SELECT code, max(oid) AS dupplicate_oid, count(*) AS indice
FROM activite.t_compte
WHERE oid <> 0
GROUP BY 1
HAVING count(*)>1
) subview
WHERE t_compte.oid = dupplicate_oid
;
UPDATE activite.t_compte
SET code = 'N/R'
WHERE oid = 0
;
-- Prestation forcée
UPDATE activite.p_factures_lignes_c
SET prestation_id = t_service_rubrique.prestation_forcee_id
FROM activite.t_lieux,
activite.t_service_rubrique
WHERE lieu_id = t_lieux.oid AND
t_service_rubrique.service_facturation_id = t_lieux.service_facturation_id AND
t_service_rubrique.rubrique_facturation_id = p_factures_lignes_c.rubrique_facturation_id AND
t_service_rubrique.prestation_forcee_id <> 0 AND
p_factures_lignes_c.prestation_id IS DISTINCT FROM t_service_rubrique.prestation_forcee_id
;
UPDATE activite.p_factures_lignes_non_facturees_c p_factures_lignes_c
SET prestation_id = t_service_rubrique.prestation_forcee_id
FROM activite.t_lieux,
activite.t_service_rubrique
WHERE lieu_id = t_lieux.oid AND
t_service_rubrique.service_facturation_id = t_lieux.service_facturation_id AND
t_service_rubrique.rubrique_facturation_id = p_factures_lignes_c.rubrique_facturation_id AND
t_service_rubrique.prestation_forcee_id <> 0 AND
p_factures_lignes_c.prestation_id IS DISTINCT FROM t_service_rubrique.prestation_forcee_id
;
-- FJ non facturés qui sont à cheval sur plusieurs factures en cours SMR
-- Il faut ventiler par facture
DROP TABLE IF EXISTS w_factures_lignes_non_facturees_c_cheval;
CREATE TEMP TABLE w_factures_lignes_non_facturees_c_cheval AS
SELECT
p_factures_lignes_non_facturees_c.CTID AS from_ctid
, p_factures_lignes_non_facturees_c.no_facture
, facture_id
, p_factures_lignes_non_facturees_c.date_debut AS date_debut_ligne
, p_factures_lignes_non_facturees_c.date_fin AS date_fin_ligne
, p_factures_lignes_non_facturees_c.nb_rubrique
, p_factures_lignes_non_facturees_c.coefficient
, p_factures_lignes_non_facturees_c.rubrique_facturation_id
, p_factures_lignes_non_facturees_c.prestation_id
, p_factures_lignes_non_facturees_c.prix_unitaire
, p_factures_lignes_non_facturees_c.lieu_id
, p_factures_lignes_non_facturees_c.montant_encours
, p_factures_lignes_non_facturees_c.coefficient_mco
, p_factures_lignes_non_facturees_c.lpp_id
, p_factures_lignes_non_facturees_c.ucd_id
, p_factures.date_debut AS date_debut_facture
, p_factures.date_fin AS date_fin_facture
, p_factures_to.no_facture AS to_no_facture
, p_factures_to.oid AS to_facture_id
, base.cti_division(
p_factures_lignes_non_facturees_c.nb_rubrique * p_factures_lignes_non_facturees_c.prix_unitaire,
(p_factures_lignes_non_facturees_c.date_fin-p_factures_lignes_non_facturees_c.date_debut+1)::numeric
) AS prix_unitaire_jour
, base.cti_division(
p_factures_lignes_non_facturees_c.montant_encours
, (p_factures_lignes_non_facturees_c.date_fin-p_factures_lignes_non_facturees_c.date_debut+1)::numeric
) AS montant_encours_jour
, GREATEST(p_factures_to.date_debut, p_factures_lignes_non_facturees_c.date_debut) AS to_date_debut_ligne
, LEAST(p_factures_to.date_fin, p_factures_lignes_non_facturees_c.date_fin) AS to_date_fin_ligne
, 1::numeric AS to_nb_rubrique
, 0::numeric AS to_prix_unitaire
, 0::numeric AS to_montant_encours
FROM activite.p_factures_lignes_non_facturees_c
JOIN activite.p_factures on p_factures_lignes_non_facturees_c.no_facture = p_factures.no_facture
JOIN activite.p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
JOIN activite.t_lieux ON lieu_sortie_id = t_lieux.oid
JOIN activite.t_services_facturation ON service_facturation_id = t_services_facturation.oid
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
JOIN activite.p_factures p_factures_to ON p_factures.no_sejour = p_factures_to.no_sejour
AND (
p_factures_to.date_debut BETWEEN p_factures_lignes_non_facturees_c.date_debut AND p_factures_lignes_non_facturees_c.date_fin
OR p_factures_to.date_fin BETWEEN p_factures_lignes_non_facturees_c.date_debut AND p_factures_lignes_non_facturees_c.date_fin
)
AND p_factures_to.code_facture = '0'
WHERE
p_factures.code_facture = '0'
AND t_services_facturation.avec_facturation_intermediaire = '1'
AND t_prestations.code IN ('FJ')
AND (
p_factures_lignes_non_facturees_c.date_debut NOT BETWEEN p_factures.date_debut AND p_factures.date_fin
OR p_factures_lignes_non_facturees_c.date_fin NOT BETWEEN p_factures.date_debut AND p_factures.date_fin
)
;
ANALYSE w_factures_lignes_non_facturees_c_cheval
;
UPDATE w_factures_lignes_non_facturees_c_cheval SET
to_prix_unitaire = round((to_date_fin_ligne - to_date_debut_ligne + 1) * prix_unitaire_jour,2),
to_montant_encours = round((to_date_fin_ligne - to_date_debut_ligne + 1) * montant_encours_jour,2)
;
DELETE FROM activite.p_factures_lignes_non_facturees_c
WHERE CTID IN (SELECT from_CTID FROM w_factures_lignes_non_facturees_c_cheval)
;
INSERT INTO activite.p_factures_lignes_non_facturees_c(
no_facture,
date_debut,
date_fin,
nb_rubrique,
coefficient,
rubrique_facturation_id,
prestation_id,
prix_unitaire,
lieu_id,
facture_id,
montant_encours,
coefficient_mco,
lpp_id,
ucd_id
)
SELECT
to_no_facture,
to_date_debut_ligne,
to_date_fin_ligne,
to_nb_rubrique,
coefficient,
rubrique_facturation_id,
prestation_id,
to_prix_unitaire,
lieu_id,
to_facture_id,
to_montant_encours,
coefficient_mco,
lpp_id,
ucd_id
FROM w_factures_lignes_non_facturees_c_cheval
;
]]></sqlcmd>
</NODE>
<NODE label="Compléments patients">
<condition><![CDATA[
"[PX]" == ""
]]></condition>
<sqlcmd><![CDATA[
INSERT INTO activite.t_medecins_traitants_administratifs(oid, code_original, code, nom, prenom, specialite_id, medecin_id)
SELECT 0, '', '****', 'Non renseigné', '', 0, 0 WHERE 0 NOT IN (SELECT oid FROM activite.t_medecins_traitants_administratifs);
UPDATE activite.p_coordonnees_patient
SET
telephone_fixe = CASE WHEN telephone_fixe != '' THEN regexp_replace(telephone_fixe,'[^0-9,]','','g') ELSE null END,
telephone_portable = CASE WHEN telephone_portable != '' THEN regexp_replace(telephone_portable,'[^0-9,]','','g') ELSE null END
;
UPDATE activite.p_coordonnees_patient
SET
telephone_fixe =
SUBSTR(telephone_fixe,1,2) || '.' ||
SUBSTR(telephone_fixe,3,2) || '.' ||
SUBSTR(telephone_fixe,5,2) || '.' ||
SUBSTR(telephone_fixe,7,2) || '.' ||
SUBSTR(telephone_fixe,9,2),
telephone_portable =
SUBSTR(telephone_portable,1,2) || '.' ||
SUBSTR(telephone_portable,3,2) || '.' ||
SUBSTR(telephone_portable,5,2) || '.' ||
SUBSTR(telephone_portable,7,2) || '.' ||
SUBSTR(telephone_portable,9,2)
;
UPDATE activite.p_coordonnees_patient
SET
telephone_fixe = CASE
WHEN SUBSTR(telephone_fixe,2,1) IN (1,2,3,4,5,9) AND SUBSTR(telephone_portable,2,1) IN (1,2,3,4,5,9) THEN telephone_fixe || ',' || telephone_portable
WHEN SUBSTR(telephone_fixe,2,1) IN (1,2,3,4,5,9) THEN telephone_fixe
WHEN SUBSTR(telephone_portable,2,1) IN (1,2,3,4,5,9) THEN telephone_portable
ELSE '' END,
telephone_portable = CASE
WHEN SUBSTR(telephone_portable,2,1) NOT IN (1,2,3,4,5,9) AND telephone_portable != '' AND SUBSTR(telephone_fixe,2,1) NOT IN (1,2,3,4,5,9) AND telephone_fixe != '' THEN telephone_fixe || ',' || telephone_portable
WHEN SUBSTR(telephone_fixe,2,1) NOT IN (1,2,3,4,5,9) THEN telephone_fixe
WHEN SUBSTR(telephone_portable,2,1) NOT IN (1,2,3,4,5,9) THEN telephone_portable
ELSE '' END,
email = CASE WHEN STRPOS(email,'@') > 1 THEN email ELSE '' END
;
UPDATE activite.p_sejours
SET medecin_sejour_id = subview.medecin_sejour_id
FROM
(
SELECT p_factures.no_sejour,
(MAX(ARRAY[to_char(p_factures_lignes_h.montant_facture,'FM000000000000'),medecin_facture_id::text]))[2]::bigint AS medecin_sejour_id
FROM activite.p_factures_lignes_h
JOIN activite.p_factures ON p_factures_lignes_h.no_facture = p_factures.no_facture
JOIN activite.p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
WHERE p_sejours.type_sejour = '3' AND
p_sejours.medecin_sejour_id = 0 AND
medecin_facture_id <> 0
GROUP BY 1
) subview
WHERE p_sejours.no_sejour = subview.no_sejour
;
]]></sqlcmd>
</NODE>
<NODE label="Traitement dépassements">
<condition><![CDATA[
"[PX]" == ""
]]></condition>
<sqlcmd><![CDATA[
-- Pour standardiser la présentation des dépassements
INSERT INTO activite.t_divers (code, texte, valeur, description)
SELECT
'TRTDEPASSEMENT',
'Traitement des dépassements',
'',
'Inclusion dépassements dans montant facturé : ''I'' = Inclus, ''X'' = Exclus '
WHERE 'TRTDEPASSEMENT' NOT IN (SELECT code FROM activite.t_divers);
-- Dépassements inclus
DROP TABLE IF EXISTS w_depassements_detail;
CREATE TEMP TABLE w_depassements_detail AS
SELECT p_factures_lignes_h.CTID AS fromCTID,
no_facture,
prix_unitaire,
coefficient,
nb_prestation,
coefficient_mco,
montant_depassement
FROM activite.p_factures_lignes_h
JOIN activite.t_divers ON t_divers.code = 'TRTDEPASSEMENT' AND
t_divers.valeur = 'I'
WHERE montant_depassement <> 0 AND
montant_facture_0 = 0 AND
(
taux_1+taux_2 = 100 AND
round(montant_facture_1,0) = round(montant_facture*taux_1/100,0) AND
round(montant_facture_2,0) = round(montant_facture*taux_2/100,0)
)
;
UPDATE activite.p_factures_lignes_h SET
montant_facture = montant_facture+w_depassements_detail.montant_depassement,
montant_facture_0 = montant_facture_0+w_depassements_detail.montant_depassement
FROM w_depassements_detail
WHERE p_factures_lignes_h.no_facture = w_depassements_detail.no_facture AND
p_factures_lignes_h.CTID = fromCTID;
UPDATE activite.p_factures SET
montant_facture_h = subview.montant_facture,
montant_facture_0_h = subview.montant_facture_0
FROM (
SELECT no_facture,
SUM(montant_facture) AS montant_facture,
SUM(montant_facture_0) AS montant_facture_0
FROM activite.p_factures_lignes_h
WHERE no_facture IN (SELECT no_facture FROM w_depassements_detail)
GROUP BY 1
) subview
WHERE p_factures.no_facture = subview.no_facture AND
p_factures.no_facture IN (SELECT no_facture FROM w_depassements_detail);
UPDATE activite.p_sejours SET
montant_facture_h = subview.montant_facture_h,
montant_facture_0_h = subview.montant_facture_0_h
FROM (
SELECT no_sejour,
SUM(montant_facture_h) AS montant_facture_h,
SUM(montant_facture_0_h) AS montant_facture_0_h
FROM activite.p_factures
WHERE no_facture IN (SELECT no_facture FROM w_depassements_detail)
GROUP BY 1
) subview
WHERE p_sejours.no_sejour = subview.no_sejour;
-- Suppression montant dépassement sur avoirs et factures annulées (pour comptage des sejours avec dépassement)
INSERT INTO activite.t_divers (code, texte, valeur, description)
SELECT
'DELDEPASSEMENTAVOIR',
'Suppression dépassements sur avoirs',
'0',
'1=Suppression sur avoirs et factures annulées'
WHERE 'DELDEPASSEMENTAVOIR' NOT IN (SELECT code FROM activite.t_divers)
;
DROP TABLE IF EXISTS w_factures_avoir;
CREATE TEMP TABLE w_factures_avoir AS
SELECT p_factures.no_facture, p_factures.no_facture_od_avoir
FROM activite.p_factures
JOIN activite.p_factures p_factures_avoir ON p_factures.no_facture_od_avoir = p_factures_avoir.no_facture
JOIN activite.t_divers ON t_divers.code = 'DELDEPASSEMENTAVOIR'
WHERE t_divers.valeur = '1' AND
p_factures.type_facture = 'X' AND
p_factures.montant_facture_h = 0-p_factures_avoir.montant_facture_h AND
p_factures.montant_facture_h <> 0
;
ANALYSE w_factures_avoir
;
UPDATE activite.p_factures_lignes_h
SET montant_depassement = 0
WHERE no_facture = ANY (SELECT w_factures_avoir.no_facture FROM w_factures_avoir) AND
montant_depassement <> 0
;
UPDATE activite.p_factures_lignes_h
SET montant_depassement = 0
WHERE no_facture = ANY (SELECT w_factures_avoir.no_facture_od_avoir FROM w_factures_avoir) AND
montant_depassement <> 0
;
]]></sqlcmd>
</NODE>
<NODE label="Compléments mouvements séjour">
<condition><![CDATA[
"[PX]" == ""
]]></condition>
<sqlcmd><![CDATA[
-- Date sortie sur séances non saisie, prendre date dernière seance
UPDATE activite.p_sejours SET
date_sortie = subview.date_sortie,
heure_sortie = 230000,
code_sorti = '1'
FROM
(
SELECT p_mouvements_sejour.no_sejour, MAX(p_mouvements_sejour.date) AS date_sortie, MAX(avec_facturation_intermediaire) AS avec_facturation_intermediaire
FROM activite.p_mouvements_sejour
JOIN activite.p_sejours ON p_mouvements_sejour.no_sejour = p_sejours.no_sejour
JOIN activite.t_lieux ON lieu_id = t_lieux.oid
JOIN activite.t_services_facturation ON service_facturation_id = t_services_facturation.oid
WHERE p_sejours.type_sejour = '5' AND
p_sejours.code_prevu <> '1' AND
p_sejours.code_sorti = '0'
GROUP BY 1
HAVING (
MAX(p_mouvements_sejour.date) < date((SELECT MAX(date) FROM activite.p_mouvements_sejour WHERE est_mouvement_previsionnel = '0') - interval '7 days') OR
(MAX(avec_facturation_intermediaire) <> '1' AND p_mouvements_sejour.no_sejour IN (SELECT no_sejour FROM activite.p_factures where code_facture = '1'))
)
) subview
WHERE p_sejours.no_sejour = subview.no_sejour
;
-- GHM et GHS selon PMSI
SELECT base.cti_execute(
'DROP TABLE IF EXISTS w_sejours_ghm
.,
CREATE TEMP TABLE w_sejours_ghm AS
SELECT oid, no_sejour, date_naissance, p_sejours.ghm_id, p_sejours.ghs_id, date_entree, date_sortie, type_sejour
FROM activite.p_sejours
JOIN activite.p_patients ON p_sejours.no_patient = p_patients.no_patient
WHERE type_sejour IN (''1'',''2'',''5'',''6'')
.,
DROP TABLE IF EXISTS w_ghm_corres
.,
CREATE TEMP TABLE w_ghm_corres AS
SELECT t_ghm_p.code AS ghm_code, t_ghm_p.oid AS ghm_p_id, t_ghm_a.oid AS ghm_a_id
FROM pmsi.t_ghm t_ghm_p
JOIN base.t_ghm t_ghm_a ON t_ghm_a.code = t_ghm_p.code
WHERE t_ghm_p.code BETWEEN ''01 '' AND ''29 ''
.,
DROP TABLE IF EXISTS w_ghs_corres
.,
CREATE TEMP TABLE w_ghs_corres AS
SELECT t_ghs_p.code AS ghs_code, t_ghs_p.oid AS ghs_p_id, t_ghs_a.oid AS ghs_a_id
FROM pmsi.t_ghs t_ghs_p
JOIN base.t_ghs t_ghs_a ON t_ghs_a.code = t_ghs_p.code
.,
UPDATE activite.p_sejours
SET
ghm_id = subview.ghm_id
,ghs_id = CASE WHEN subview.ghs_id > 0 THEN subview.ghs_id ELSE p_sejours.ghs_id END
FROM
(
SELECT p_sejours.no_sejour, ghm_a_id AS ghm_id, ghs_a_id AS ghs_id
FROM w_sejours_ghm p_sejours
JOIN activite.p_sejour_pmsi ON p_sejour_pmsi.sejour_id = p_sejours.oid
JOIN pmsi.p_rss ON p_sejour_pmsi.rss_id = p_rss.oid AND
date_trunc(''month'',p_sejours.date_sortie) = date_trunc(''month'',p_rss.date_sortie) AND
p_sejours.date_naissance = p_rss.date_naissance
JOIN w_ghm_corres ON p_rss.ghm_id = ghm_p_id
JOIN w_ghs_corres ON p_rss.ghs_id = ghs_p_id
WHERE (p_sejours.ghm_id <> ghm_a_id OR p_sejours.ghs_id <> ghs_a_id) AND
p_rss.ghm_id > 0 AND
p_rss.etat = '''' AND
(p_rss.en_cours = ''0'' OR p_rss.en_cours_etat IN (''V'',''F''))
) subview
WHERE p_sejours.no_sejour = subview.no_sejour
',1)
WHERE 'p_rss' IN (SELECT tablename FROM pg_tables WHERE schemaname = 'pmsi' AND tablename = 'p_rss')
;
-- Date groupage selon PMSI
SELECT base.cti_execute(
'UPDATE activite.p_sejours
SET date_groupage = subview.date_groupage
FROM
(
SELECT
p_sejours.no_sejour
,MAX(p_rss_etat.date_groupage) AS date_groupage
FROM activite.p_sejours
JOIN activite.p_sejour_pmsi ON p_sejour_pmsi.sejour_id = p_sejours.oid
JOIN pmsi.p_rss ON p_sejour_pmsi.rss_id = p_rss.oid AND
date_trunc(''month'',p_sejours.date_sortie) = date_trunc(''month'',p_rss.date_sortie)
JOIN pmsi.p_rss_etat ON p_rss_etat.rss_id = p_rss.oid
JOIN pmsi.t_ghm t_ghm_p ON p_rss.ghm_id = t_ghm_p.oid
WHERE type_sejour IN (''1'',''2'',''5'',''6'') AND
p_rss.ghm_id > 0 AND
p_rss_etat.date_groupage < ''20991231''::date AND
t_ghm_p.code NOT LIKE ''90%'' AND t_ghm_p.code NOT LIKE ''99%'' AND
(p_rss.en_cours = ''0'' OR p_rss.en_cours_etat IN (''V'',''F''))
GROUP BY 1
) subview
WHERE p_sejours.no_sejour = subview.no_sejour AND
p_sejours.date_groupage IS DISTINCT FROM subview.date_groupage
',1)
WHERE 'p_rss' IN (SELECT tablename FROM pg_tables WHERE schemaname = 'pmsi' AND tablename = 'p_rss')
;
UPDATE activite.p_factures SET
ghs_id = p_sejours.ghs_id,
gmt_id = p_sejours.gmt_id
FROM activite.p_sejours
WHERE p_factures.no_sejour = p_sejours.no_sejour AND
(
p_factures.ghs_id IS DISTINCT FROM p_sejours.ghs_id OR
p_factures.gmt_id IS DISTINCT FROM p_sejours.gmt_id
)
;
-- Chambres particulières selon facturation
DROP TABLE IF EXISTS w_cp_facturees;
CREATE TEMP TABLE w_cp_facturees AS
SELECT no_sejour, p_factures_lignes_c.date_debut, SUM(montant_facture)
FROM activite.p_factures_lignes_c
JOIN activite.p_factures ON p_factures_lignes_c.no_facture = p_factures.no_facture
JOIN activite.t_listes ON t_listes.code = 'CTI_SHO_R'
JOIN activite.t_listes_contenu ON t_listes.oid = t_listes_contenu.liste_id AND
rubrique_facturation_id = t_listes_contenu.to_id
WHERE p_factures_lignes_c.date_debut = p_factures_lignes_c.date_fin
GROUP BY 1,2
HAVING SUM(montant_facture) > 0
;
UPDATE activite.p_mouvements_sejour SET
est_chambre_particuliere = '1',
nb_chambres_particulieres = 1,
est_chambre_particuliere_facturee = '1'
FROM w_cp_facturees
WHERE w_cp_facturees.no_sejour = p_mouvements_sejour.no_sejour AND
w_cp_facturees.date_debut = p_mouvements_sejour.date AND
(
p_mouvements_sejour.heure_fin = 240000 OR
nb_sorties_directes = 1 OR
nb_ambulatoires = 1 OR
nb_externes = 1
)
;
-- Séjours ambulatoires avec prestation externe -> transformation
DROP TABLE IF EXISTS w_sejours_ambu_to_externe;
CREATE TEMP TABLE w_sejours_ambu_to_externe AS
SELECT p_sejours.no_sejour
FROM activite.p_sejours
JOIN activite.t_lieux ON lieu_sortie_id = t_lieux.oid
JOIN activite.t_services_facturation ON service_facturation_id = t_services_facturation.oid
JOIN activite.p_factures ON p_factures.no_sejour = p_sejours.no_sejour
JOIN activite.p_factures_lignes_c ON p_factures.no_facture = p_factures_lignes_c.no_facture
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
WHERE t_prestations.code IN ('SE1', 'SE2', 'SE3', 'SE4', 'SE5', 'SE6', 'ATU', 'FPU', 'FFM') AND
p_sejours.type_sejour = '2' AND
t_services_facturation.type_sejour NOT IN ('1','2','3','4','5','6','9') AND
montant_facture <> 0
GROUP BY 1
HAVING SUM(ABS(montant_facture)) > 0 AND SUM(montant_facture) <> 0
;
UPDATE activite.p_sejours
SET type_sejour = '3'
WHERE no_sejour IN (SELECT no_sejour FROM w_sejours_ambu_to_externe)
;
UPDATE activite.p_mouvements_sejour
SET nb_externes = 1, nb_ambulatoires = 0
WHERE nb_ambulatoires = 1 AND
no_sejour IN
(SELECT no_sejour FROM w_sejours_ambu_to_externe)
;
-- Séjours externes avec prestation ambu -> transformation
DROP TABLE IF EXISTS w_sejours_externe_to_ambu;
CREATE TEMP TABLE w_sejours_externe_to_ambu AS
SELECT p_sejours.no_sejour
FROM activite.p_sejours
JOIN activite.t_lieux ON lieu_sortie_id = t_lieux.oid
JOIN activite.t_services_facturation ON service_facturation_id = t_services_facturation.oid
JOIN activite.p_factures ON p_factures.no_sejour = p_sejours.no_sejour
JOIN activite.p_factures_lignes_c ON p_factures.no_facture = p_factures_lignes_c.no_facture
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
LEFT JOIN activite.t_sejour ON p_sejours.no_sejour = t_sejour.no_sejour
WHERE t_prestations.code IN ('GHS') AND
p_sejours.type_sejour = '3' AND
(
t_services_facturation.type_sejour NOT IN ('1','2','3','4','5','6','9') OR
p_sejours.ghm_id > 0
) AND
t_sejour.type_sejour IS DISTINCT FROM '3' AND
montant_facture <> 0
GROUP BY 1
HAVING SUM(ABS(montant_facture)) > 0 AND SUM(montant_facture) <> 0
;
UPDATE activite.p_sejours
SET type_sejour = '2'
WHERE no_sejour IN (SELECT no_sejour FROM w_sejours_externe_to_ambu)
;
UPDATE activite.p_mouvements_sejour
SET nb_ambulatoires = 1, nb_externes= 0
WHERE nb_externes = 1 AND
no_sejour IN
(SELECT no_sejour FROM w_sejours_externe_to_ambu)
;
-- Si Service sans facturation et sans mouvement, alors séjour fictif
UPDATE activite[PX].p_sejours
SET type_sejour = '9'
FROM activite[PX].t_lieux
JOIN activite[PX].t_services_facturation ON service_facturation_id = t_services_facturation.oid
WHERE lieu_sortie_id = t_lieux.oid AND
t_services_facturation.est_sans_mouvement = '1' AND
t_services_facturation.est_sans_facturation = '1' AND
p_sejours.type_sejour <> '9'
;
UPDATE activite[PX].p_sejours
SET lieu_sortie_id = 0
WHERE lieu_sortie_id IS NULL
;
-- Idem si séjour sans acte et service sans acte fictif, alors séjour fictif
UPDATE activite[PX].p_sejours
SET type_sejour = '9'
WHERE
p_sejours.type_sejour != '9' AND
lieu_sortie_id = ANY(
SELECT t_lieux.oid FROM activite[PX].t_lieux
JOIN activite[PX].t_services_facturation ON service_facturation_id = t_services_facturation.oid
WHERE
t_services_facturation.sej_sans_acte_fictif = '1') AND
oid != ALL (
SELECT DISTINCT p_sejours.oid FROM
activite[PX].p_sejours
LEFT JOIN activite[PX].p_factures ON p_sejours.no_sejour = p_factures.no_sejour
LEFT JOIN activite[PX].p_factures_lignes_h ON p_factures.oid = p_factures_lignes_h.facture_id
LEFT JOIN activite[PX].p_factures_lignes_non_facturees_h ON p_factures.oid = p_factures_lignes_non_facturees_h.facture_id
WHERE (p_factures_lignes_h.facture_id IS NOT NULL OR
p_factures_lignes_non_facturees_h.facture_id IS NOT NULL)
)
;
-- Ajout ligne fictive dans mouvements séjour pour que chaque séjour ait au moins une ligne
-- dans les mouvements
INSERT INTO activite.p_mouvements_sejour
(no_sejour, date, heure_debut, heure_fin, lieu_id, medecin_sejour_id)
WITH w_mv AS (SELECT DISTINCT no_sejour FROM activite.p_mouvements_sejour)
SELECT
p_sejours.no_sejour
, p_sejours.date_entree
, p_sejours.heure_entree
, p_sejours.heure_sortie
, p_sejours.lieu_sortie_id
, p_sejours.medecin_sejour_id
FROM
activite.p_sejours
LEFT JOIN w_mv ON p_sejours.no_sejour = w_mv.no_sejour
WHERE 1=1
AND type_sejour <> '9'
AND code_prevu <> 1
AND p_sejours.etat NOT IN ('A', 'R', 'C')
AND w_mv.no_sejour IS NULL
;
INSERT INTO activite.p_mouvements_sejour
(no_sejour, date, heure_debut, heure_fin, lieu_id, medecin_sejour_id)
SELECT p_sejours.no_sejour, date_sortie, 0, heure_sortie, lieu_sortie_id, p_sejours.medecin_sejour_id
FROM activite.p_sejours
LEFT JOIN activite.p_mouvements_sejour ON p_sejours.no_sejour = p_mouvements_sejour.no_sejour AND
p_mouvements_sejour.date = p_sejours.date_sortie
WHERE type_sejour <> '9' AND
code_prevu <> 1 AND
p_sejours.code_sorti = '1' AND
p_mouvements_sejour.no_sejour IS NULL
;
-- Ajout des séjours annulés dans les mouvements pour regroupement et tri dans les requêtes
INSERT INTO activite.p_mouvements_sejour
(no_sejour, date, lieu_id, medecin_sejour_id, is_annulation)
SELECT
p_sejours.no_sejour,
date_entree,
lieu_sortie_id,
p_sejours.medecin_sejour_id,
CASE WHEN date_entree = date(date_etat) THEN 1 ELSE 0 END AS is_annulation
FROM activite.p_sejours
LEFT JOIN activite.p_mouvements_sejour ON p_sejours.no_sejour = p_mouvements_sejour.no_sejour AND
p_mouvements_sejour.date = p_sejours.date_sortie
WHERE p_sejours.etat IN ('A', 'R', 'C') AND
p_mouvements_sejour.no_sejour IS NULL
;
-- Correction séjours à séance selon GHM
DROP TABLE IF EXISTS w_correction_seances_28z14;
CREATE TEMP TABLE w_correction_seances_28z14 AS
SELECT p_factures.no_sejour, p_factures_lignes_h.date_debut, SUM(p_factures_lignes_h.nb_prestation) AS nb_seances
FROM activite.p_factures_lignes_h
JOIN activite.p_factures ON p_factures_lignes_h.no_facture = p_factures.no_facture
JOIN activite.p_sejours On p_factures.no_sejour = p_sejours.no_sejour AND type_sejour = '1'
JOIN base.t_ghm ON p_sejours.ghm_id = t_ghm.oid AND t_ghm.code LIKE '28Z14%'
JOIN base.t_actes ON acte_id = t_actes.oid AND t_actes.code = 'FELF011'
GROUP BY 1,2
HAVING SUM(p_factures_lignes_h.nb_prestation) > 0
;
UPDATE activite.p_mouvements_sejour
SET nb_seances = w_correction_seances_28z14.nb_seances
FROM w_correction_seances_28z14
WHERE p_mouvements_sejour.no_sejour = w_correction_seances_28z14.no_sejour AND
p_mouvements_sejour.date = w_correction_seances_28z14.date_debut AND
p_mouvements_sejour.nb_seances <> w_correction_seances_28z14.nb_seances;
DROP TABLE IF EXISTS w_correction_seances;
CREATE TEMP TABLE w_correction_seances AS
SELECT p_sejours.no_sejour,
p_sejours.date_entree,
p_sejours.date_sortie,
COALESCE(t_services_facturation.type_sejour,'0') AS type_sejour_force,
t_ghm.code AS ghm_code,
SUM(nb_entrees_directes) AS nb_entrees_directes,
SUM(nb_sorties_directes)AS nb_sorties_directes,
SUM(nb_ambulatoires) AS nb_ambulatoires,
SUM(nb_externes) AS nb_externes,
SUM(nb_seances) AS nb_seances
FROM activite.p_sejours
JOIN activite.t_lieux ON lieu_sortie_id = t_lieux.oid
JOIN activite.t_services_facturation ON service_facturation_id = t_services_facturation.oid
LEFT JOIN activite.p_mouvements_sejour ON p_sejours.no_sejour = p_mouvements_sejour.no_sejour
JOIN base.t_ghm ON ghm_id = t_ghm.oid
WHERE p_sejours.type_sejour <> '9' AND
t_ghm.code LIKE '28%' AND
t_services_facturation.type_sejour IS DISTINCT FROM '0sauf5'
GROUP BY 1,2,3,4,5
HAVING
(
SUM(nb_entrees_directes) <> 0 OR
SUM(nb_ambulatoires) <> 0 OR
SUM(nb_externes) <> 0 OR
SUM(nb_seances) = 0
)
;
UPDATE activite.p_mouvements_sejour SET
nb_seances = 1,
nb_ambulatoires = CASE WHEN w_correction_seances.type_sejour_force <> '0sauf5' AND w_correction_seances.type_sejour_force <> '2' THEN 0 ELSE p_mouvements_sejour.nb_ambulatoires END
FROM w_correction_seances
WHERE w_correction_seances.no_sejour = p_mouvements_sejour.no_sejour AND
p_mouvements_sejour.nb_ambulatoires <> 0 AND
w_correction_seances.nb_seances = 0 AND
w_correction_seances.nb_ambulatoires <> 0;
UPDATE activite.p_sejours SET
type_sejour = '5'
FROM w_correction_seances
WHERE w_correction_seances.type_sejour_force <> '0sauf5' AND
w_correction_seances.type_sejour_force <> '2' AND
w_correction_seances.no_sejour = p_sejours.no_sejour AND
p_sejours.type_sejour = '2' AND
w_correction_seances.nb_seances = 0 AND
w_correction_seances.nb_ambulatoires <> 0;
UPDATE activite.p_mouvements_sejour SET
nb_seances = 1
FROM w_correction_seances
WHERE w_correction_seances.no_sejour = p_mouvements_sejour.no_sejour AND
p_mouvements_sejour.nb_entrees_directes <> 0 AND
p_mouvements_sejour.nb_seances = 0 AND
w_correction_seances.nb_seances = 0 AND
w_correction_seances.nb_ambulatoires = 0 AND
w_correction_seances.nb_entrees_directes <> 0;
-- Types séjours Hospitalisés vers séances
UPDATE activite.p_sejours
SET type_sejour = '5'
FROM activite.t_lieux
JOIN activite.t_services_facturation ON service_facturation_id = t_services_facturation.oid
WHERE lieu_sortie_id = t_lieux.oid AND
t_services_facturation.type_sejour <> '0sauf5' AND
t_services_facturation.type_sejour <> '1' AND
t_services_facturation.type_sejour <> '2' AND
p_sejours.type_sejour <> '5' AND
p_sejours.type_sejour <> '9' AND
ghs_id > 0 AND
ghm_id in (SELECT oid FROm base.t_ghm where code LIKE '28%')
;
UPDATE activite.p_mouvements_sejour
SET nb_entrees_directes = 0,
nb_sorties_directes = 0,
est_jour_hospitalisation = '0',
nb_ambulatoires = 0,
nb_externes = 0,
nb_urgences = 0,
nb_entrees_mutation_service = 0,
nb_sorties_mutation_service = 0,
nb_entrees_mutation_etage = 0,
nb_sorties_mutation_etage = 0,
nb_entrees_mutation_activite = 0,
nb_sorties_mutation_activite = 0,
nb_entrees_mutation_unite_medicale = 0,
nb_sorties_mutation_unite_medicale = 0,
nb_jours_js_inclus = 0,
nb_jours_js_non_inclus = 0,
est_chambre_particuliere = '0',
nb_chambres_particulieres = 0,
nb_bebes = 0
WHERE no_sejour IN (SELECT no_sejour FROM activite.p_sejours WHERE type_sejour = '5') AND
(
nb_entrees_directes IS DISTINCT FROM 0 OR
nb_sorties_directes IS DISTINCT FROM 0 OR
est_jour_hospitalisation IS DISTINCT FROM '0' OR
nb_ambulatoires IS DISTINCT FROM 0 OR
nb_externes IS DISTINCT FROM 0 OR
nb_urgences IS DISTINCT FROM 0 OR
nb_entrees_mutation_service IS DISTINCT FROM 0 OR
nb_sorties_mutation_service IS DISTINCT FROM 0 OR
nb_entrees_mutation_etage IS DISTINCT FROM 0 OR
nb_sorties_mutation_etage IS DISTINCT FROM 0 OR
nb_entrees_mutation_activite IS DISTINCT FROM 0 OR
nb_sorties_mutation_activite IS DISTINCT FROM 0 OR
nb_entrees_mutation_unite_medicale IS DISTINCT FROM 0 OR
nb_sorties_mutation_unite_medicale IS DISTINCT FROM 0 OR
nb_jours_js_inclus IS DISTINCT FROM 0 OR
nb_jours_js_non_inclus IS DISTINCT FROM 0 OR
est_chambre_particuliere IS DISTINCT FROM '0' OR
nb_chambres_particulieres IS DISTINCT FROM 0 OR
nb_bebes IS DISTINCT FROM 0
)
;
-- Séjours hospît vers externe si duree séjour <= 1
DROP TABLE IF EXISTS w_sejours_hospit_to_externe;
CREATE TEMP TABLE w_sejours_hospit_to_externe AS
SELECT p_sejours.no_sejour
FROM activite.p_sejours
JOIN activite.t_lieux ON lieu_sortie_id = t_lieux.oid
JOIN activite.t_services_facturation ON service_facturation_id = t_services_facturation.oid
WHERE p_sejours.type_sejour = '1' AND
date_sortie - date_entree <= 1 AND
code_sorti = '1' AND
t_services_facturation.type_sejour = '31'
;
UPDATE activite.p_sejours
SET type_sejour = '3'
WHERE no_sejour IN (SELECT no_sejour FROM w_sejours_hospit_to_externe)
;
UPDATE activite.p_mouvements_sejour
SET nb_externes = 1, nb_entrees_directes = 0
WHERE nb_entrees_directes = 1 AND
no_sejour IN
(SELECT no_sejour FROM w_sejours_hospit_to_externe)
;
UPDATE activite.p_mouvements_sejour
SET nb_entrees_directes = 0,
nb_sorties_directes = 0,
est_jour_hospitalisation = '0',
nb_ambulatoires = 0,
nb_seances = 0,
nb_urgences = 0,
nb_entrees_mutation_service = 0,
nb_sorties_mutation_service = 0,
nb_entrees_mutation_etage = 0,
nb_sorties_mutation_etage = 0,
nb_entrees_mutation_activite = 0,
nb_sorties_mutation_activite = 0,
nb_entrees_mutation_unite_medicale = 0,
nb_sorties_mutation_unite_medicale = 0,
nb_jours_js_inclus = 0,
nb_jours_js_non_inclus = 0,
est_chambre_particuliere = '0',
nb_chambres_particulieres = 0,
nb_bebes = 0
WHERE no_sejour IN
(SELECT no_sejour FROM w_sejours_hospit_to_externe)
;
-- Forcage ambulatoires non traité dans import prestataire
DROP TABLE IF EXISTS w_correction_seances;
CREATE TEMP TABLE w_correction_seances AS
SELECT p_sejours.no_sejour
FROM activite.p_sejours
JOIN activite.t_lieux on lieu_sortie_id = t_lieux.oid
JOIN activite.t_services_facturation on service_facturation_id = t_services_facturation.oid
LEFT JOIN base.t_ghm on ghm_id = t_ghm.oid
WHERE p_sejours.type_sejour = '5' AND
t_services_facturation.type_sejour = '2'
;
UPDATE activite.p_sejours
SET type_sejour = '2'
FROM w_correction_seances
WHERE p_sejours.no_sejour = w_correction_seances.no_sejour
;
UPDATE activite.p_mouvements_sejour
SET nb_ambulatoires = 1
FROM w_correction_seances
WHERE p_mouvements_sejour.no_sejour = w_correction_seances.no_sejour AND
nb_seances = 1
;
-- Premiers et derniers mouvements par jour pour journées HDJ
UPDATE activite.p_mouvements_sejour SET
est_premier_mouvement_jour = '1'
FROM
(
SELECT no_sejour, date, MIN(heure_fin) AS heure_fin
FROM activite.p_mouvements_sejour
GROUP BY 1,2
HAVING MIN(heure_fin) < 240000
) subview
WHERE p_mouvements_sejour.no_sejour = subview.no_sejour AND
p_mouvements_sejour.heure_fin = subview.heure_fin AND
p_mouvements_sejour.date = subview.date AND
est_premier_mouvement_jour IS DISTINCT FROM '1' ;
UPDATE activite.p_mouvements_sejour SET
est_dernier_mouvement_jour = '1'
FROM
(
SELECT no_sejour, date, MAX(heure_debut) AS heure_debut
FROM activite.p_mouvements_sejour
GROUP BY 1,2
HAVING MAX(heure_debut) <> 0
) subview
WHERE p_mouvements_sejour.no_sejour = subview.no_sejour AND
p_mouvements_sejour.heure_debut = subview.heure_debut AND
p_mouvements_sejour.date = subview.date AND
est_dernier_mouvement_jour IS DISTINCT FROM '1';
UPDATE activite.p_mouvements_sejour SET
est_premier_mouvement_jour = CASE WHEN heure_premier = heure_debut THEN '1' ELSE '0' END,
est_dernier_mouvement_jour = CASE WHEN heure_dernier = heure_debut THEN '1' ELSE '0' END
FROM
(
SELECT no_sejour, date,
MIN(CASE WHEN est_jour_hospitalisation = '1' THEN heure_debut ELSE 999999 END) AS heure_premier,
MAX(CASE WHEN est_jour_hospitalisation = '1' THEN heure_debut ELSE -1 END) AS heure_dernier
FROM activite.p_mouvements_sejour
GROUP BY 1,2
HAVING (
MAX(nb_entrees_directes) = 1 OR
MAX(nb_sorties_directes) = 1
) AND
(
MIN(heure_debut) <> MIN(CASE WHEN est_jour_hospitalisation = '1' THEN heure_debut ELSE 999999 END) OR
MAX(heure_debut) <> MAX(CASE WHEN est_jour_hospitalisation = '1' THEN heure_debut ELSE -1 END)
)
) subview
WHERE p_mouvements_sejour.no_sejour = subview.no_sejour AND
p_mouvements_sejour.date = subview.date AND
(
est_premier_mouvement_jour IS DISTINCT FROM CASE WHEN heure_premier = heure_debut THEN '1' ELSE '0' END OR
est_dernier_mouvement_jour IS DISTINCT FROM CASE WHEN heure_dernier = heure_debut THEN '1' ELSE '0' END
);
-- Transformation UF selon type eclatement
SELECT activite.cti_transform_uf();
-- Mises à jour mouvements selon présence prestation (hdj)
SELECT activite[PX].cti_calcul_hdj_mouvements();
-- Calcul des journées dans la table des mouvements
SELECT activite[PX].cti_calcul_journees_mouvements();
]]></sqlcmd>
</NODE>
<NODE label="Compléments séjour">
<condition><![CDATA[
"[PX]" == ""
]]></condition>
<sqlcmd><![CDATA[
-- Finess séjour
UPDATE activite.p_sejours
SET finess = t_finess.code
FROM activite.t_lieux
JOIN activite.t_services_facturation ON t_lieux.service_facturation_id = t_services_facturation.oid
JOIN base.t_finess On t_services_facturation.finess_id = t_finess.oid
WHERE lieu_sortie_id = t_lieux.oid AND
p_sejours.finess IS DISTINCT FROM t_finess.code AND
t_services_facturation.finess_id <> 0
;
WITH finess as (
SELECT MAX(t_finess.code) AS code
FROM base.t_finess
WHERE secondaire = '0'
HAVING count(*) = 1
), empty_sejours as (
SELECT p_sejours.oid, finess.code as finess_code, lieu_sortie_id
FROM activite.p_sejours
JOIN finess ON 1=1
WHERE p_sejours.finess = '' OR p_sejours.finess = '000000000'
), update_sejours as (
SELECT empty_sejours.oid, finess_code FROM empty_sejours
JOIN activite.t_lieux ON empty_sejours.lieu_sortie_id = t_lieux.oid
JOIN activite.t_services_facturation ON t_lieux.service_facturation_id = t_services_facturation.oid
WHERE t_services_facturation.finess_id = 0
)
UPDATE activite.p_sejours
SET finess = finess_code
FROM update_sejours
WHERE update_sejours.oid = p_sejours.oid
AND finess IS DISTINCT FROM finess_code
;
UPDATE activite.p_sejours
SET finess = subview.code
FROM
(
SELECT MAX(code) AS code
FROM base.t_finess
WHERE secondaire = '0'
HAVING count(DISTINCT code) = 1
) subview
WHERE p_sejours.finess = '' OR
p_sejours.finess = '000000000'
;
-- Médecin séjour selon service
UPDATE activite.p_sejours
SET medecin_sejour_id =
CASE
WHEN COALESCE(t_services_facturation.medecin_force_id,0) > 0 THEN t_services_facturation.medecin_force_id
WHEN COALESCE(t_services_facturation.medecin_par_defaut_id,0) > 0 AND p_sejours.medecin_sejour_id = 0 THEN t_services_facturation.medecin_par_defaut_id
ELSE p_sejours.medecin_sejour_id END
FROM activite.t_lieux
JOIN activite.t_services_facturation ON t_lieux.service_facturation_id = t_services_facturation.oid
WHERE lieu_sortie_id = t_lieux.oid AND
(
t_services_facturation.medecin_force_id <> 0 OR
t_services_facturation.medecin_par_defaut_id <> 0
)
;
-- Correction date sortie dans séjours pour externes et ambu présents
UPDATE activite.p_sejours
SET date_sortie = subview.date_sortie, heure_sortie = subview.heure_sortie
FROM
(
SELECT p_sejours.no_sejour, MAX(date) AS date_sortie, (MAX(Array[date::text, heure_fin::text]))[2]::numeric AS heure_sortie
FROM activite.p_sejours
JOIN activite.p_mouvements_sejour ON p_sejours.no_sejour = p_mouvements_sejour.no_sejour
WHERE p_sejours.type_sejour IN ('2','3') AND
p_sejours.code_sorti <> '1' AND
(
p_mouvements_sejour.nb_ambulatoires = 1 OR
p_mouvements_sejour.nb_externes = 1
)
GROUP BY 1
) subview
WHERE p_sejours.no_sejour = subview.no_sejour
;
-- Chambre particuliere demandee si facturee
DROP TABLE IF EXISTS w_factures_lignes_c_cp;
CREATE TEMP TABLE w_factures_lignes_c_cp AS
SELECT p_factures.no_sejour
FROM activite[PX].p_factures_lignes_c
JOIN activite[PX].p_factures ON p_factures.no_facture = p_factures_lignes_c.no_facture
JOIN activite[PX].p_sejours ON p_sejours.no_sejour = p_factures.no_sejour AND p_sejours.code_cp_demandee <> '1'
JOIN activite[PX].v_listes_3 ON liste_code = 'CTI_SHO_R' AND rubrique_facturation_id = to_id
WHERE p_factures_lignes_c.montant_facture <> 0
GROUP BY 1
HAVING SUM(nb_rubrique) > 0;
ALTER TABLE w_factures_lignes_c_cp ADD CONSTRAINT w_factures_lignes_c_cp_pkey PRIMARY KEY(no_sejour);
UPDATE activite[PX].p_sejours
SET code_cp_demandee = '1'
FROM w_factures_lignes_c_cp
WHERE p_sejours.no_sejour = w_factures_lignes_c_cp.no_sejour AND
code_cp_demandee <> '1';
-- GHS esthétique
UPDATE activite[PX].p_sejours SET
ghs_id = (SELECT oid FROM base.t_ghs WHERE code = 9999)
WHERE ghs_id <= 0 AND
ghm_id IN (SELECT oid FROM base.t_ghm WHERE code LIKE '09Z02%' OR code LIKE '23Z03%');
-- GHS
UPDATE activite[PX].p_sejours SET
date_groupage = '20991231'::date,
ghs_id =
CASE
WHEN p_sejours.particularite_t2a::bpchar = 'SE1'::bpchar THEN - 9991::bigint
WHEN p_sejours.particularite_t2a::bpchar = 'SE2'::bpchar THEN - 9992::bigint
WHEN p_sejours.particularite_t2a::bpchar = 'SE3'::bpchar THEN - 9993::bigint
WHEN p_sejours.particularite_t2a::bpchar = 'SE4'::bpchar THEN - 9994::bigint
WHEN p_sejours.particularite_t2a::bpchar = 'SE5'::bpchar THEN - 9997::bigint
WHEN p_sejours.particularite_t2a::bpchar = 'SE6'::bpchar THEN - 9998::bigint
WHEN p_sejours.particularite_t2a::bpchar = 'ATU'::bpchar THEN - 9995::bigint
WHEN p_sejours.particularite_t2a::bpchar = 'FFM'::bpchar THEN - 9996::bigint
WHEN t_services_facturation.type_t2a <> '1'::bpchar THEN - 9990::bigint
WHEN p_sejours.type_sejour NOT IN ('1','2','5','6') THEN - 9990::bigint
WHEN p_sejours.code_sorti <> 1::numeric THEN - 9980::bigint
WHEN p_sejours.date_groupage = '2099-12-31'::date THEN - 9981::bigint
ELSE - 9981::bigint
END,
ghm_id =
CASE
WHEN p_sejours.particularite_t2a::bpchar = 'SE1'::bpchar THEN - 9991::bigint
WHEN p_sejours.particularite_t2a::bpchar = 'SE2'::bpchar THEN - 9992::bigint
WHEN p_sejours.particularite_t2a::bpchar = 'SE3'::bpchar THEN - 9993::bigint
WHEN p_sejours.particularite_t2a::bpchar = 'SE4'::bpchar THEN - 9994::bigint
WHEN p_sejours.particularite_t2a::bpchar = 'SE5'::bpchar THEN - 9997::bigint
WHEN p_sejours.particularite_t2a::bpchar = 'SE6'::bpchar THEN - 9998::bigint
WHEN p_sejours.particularite_t2a::bpchar = 'ATU'::bpchar THEN - 9995::bigint
WHEN p_sejours.particularite_t2a::bpchar = 'FFM'::bpchar THEN - 9996::bigint
WHEN t_services_facturation.type_t2a <> '1'::bpchar THEN - 9990::bigint
WHEN p_sejours.type_sejour NOT IN ('1','2','5','6') THEN - 9990::bigint
WHEN p_sejours.code_sorti <> 1::numeric THEN - 9980::bigint
WHEN p_sejours.date_groupage = '2099-12-31'::date THEN - 9981::bigint
ELSE - 9981::bigint
END
FROM activite[PX].t_lieux
JOIN activite[PX].t_services_facturation ON service_facturation_id = t_services_facturation.oid
WHERE p_sejours.lieu_sortie_id = t_lieux.oid AND
ghs_id <= 0 AND
gmt_id <= 0 AND
(
date_groupage IS DISTINCT FROM '20991231'::date
OR
ghm_id IS DISTINCT FROM
CASE
WHEN p_sejours.particularite_t2a::bpchar = 'SE1'::bpchar THEN - 9991::bigint
WHEN p_sejours.particularite_t2a::bpchar = 'SE2'::bpchar THEN - 9992::bigint
WHEN p_sejours.particularite_t2a::bpchar = 'SE3'::bpchar THEN - 9993::bigint
WHEN p_sejours.particularite_t2a::bpchar = 'SE4'::bpchar THEN - 9994::bigint
WHEN p_sejours.particularite_t2a::bpchar = 'SE5'::bpchar THEN - 9997::bigint
WHEN p_sejours.particularite_t2a::bpchar = 'SE6'::bpchar THEN - 9998::bigint
WHEN p_sejours.particularite_t2a::bpchar = 'ATU'::bpchar THEN - 9995::bigint
WHEN p_sejours.particularite_t2a::bpchar = 'FFM'::bpchar THEN - 9996::bigint
WHEN t_services_facturation.type_t2a <> '1'::bpchar THEN - 9990::bigint
WHEN p_sejours.type_sejour NOT IN ('1','2','5','6') THEN - 9990::bigint
WHEN p_sejours.code_sorti <> 1::numeric THEN - 9980::bigint
WHEN p_sejours.date_groupage = '2099-12-31'::date THEN - 9981::bigint
ELSE - 9981::bigint
END
OR
ghs_id IS DISTINCT FROM
CASE
WHEN p_sejours.particularite_t2a::bpchar = 'SE1'::bpchar THEN - 9991::bigint
WHEN p_sejours.particularite_t2a::bpchar = 'SE2'::bpchar THEN - 9992::bigint
WHEN p_sejours.particularite_t2a::bpchar = 'SE3'::bpchar THEN - 9993::bigint
WHEN p_sejours.particularite_t2a::bpchar = 'SE4'::bpchar THEN - 9994::bigint
WHEN p_sejours.particularite_t2a::bpchar = 'ATU'::bpchar THEN - 9995::bigint
WHEN p_sejours.particularite_t2a::bpchar = 'FFM'::bpchar THEN - 9996::bigint
WHEN t_services_facturation.type_t2a <> '1'::bpchar THEN - 9990::bigint
WHEN p_sejours.type_sejour NOT IN ('1','2','5','6') THEN - 9990::bigint
WHEN p_sejours.code_sorti <> 1::numeric THEN - 9980::bigint
WHEN p_sejours.date_groupage = '2099-12-31'::date THEN - 9981::bigint
ELSE - 9981::bigint
END
)
;
-- Calcul des ages en années (date_entre - date_naissance ou -1 si une des deux dates absente)
UPDATE activite.p_sejours SET age = NULL;
-- Court séjour
UPDATE activite.p_sejours set
age = extract(year from age(date_entree, date_naissance))
FROM
activite.p_patients
WHERE
p_patients.no_patient = p_sejours.no_patient
and (p_sejours.age = 0 OR p_sejours.age is null OR p_sejours.age = -1)
and date_naissance >= '1890-01-01'::date
and date_entree >= '2000-01-01'::date
AND
(
code_sorti = '1' AND date_sortie - date_entree < 180 OR
code_sorti <> '1' AND date(now()) - date_entree < 180
)
and date_naissance <= date_sortie
and extract(year from age(date_entree, date_naissance)) <= 120
;
-- longs sejours (> 6mois) age selondébut d'année
UPDATE activite.p_sejours set
age = extract(year from age(date_trunc('year',CASE WHEN code_sorti = '1' THEN date_sortie ELSE now() END), date_naissance))
FROM
activite.p_patients
WHERE
p_patients.no_patient = p_sejours.no_patient
and (p_sejours.age = 0 OR p_sejours.age is null OR p_sejours.age = -1)
and date_naissance >= '1890-01-01'::date
AND
(
code_sorti = '1' AND date_sortie - date_entree >= 180 OR
code_sorti <> '1' AND date(now()) - date_entree >= 180
)
and date_naissance <= date_sortie
and extract(year from age(date_trunc('year',CASE WHEN code_sorti = '1' THEN date_sortie ELSE now() END), date_naissance)) <= 120
;
UPDATE activite.p_sejours SET
age = -1
WHERE p_sejours.age is null OR age < -1
;
-- Codes de mode d'entree obsolètes
UPDATE activite[PX].p_sejours SET
mode_entree = CASE
WHEN mode_entree = 'T' THEN '7'
WHEN mode_entree = 'I' THEN '6'
ELSE '8' END
WHERE
mode_entree IN ('D', 'T', 'I');
-- Codes de modes de sortie obsolètes
UPDATE activite[PX].p_sejours SET
mode_sortie = CASE
WHEN mode_sortie = 'T' THEN '7'
WHEN mode_sortie = 'I' THEN '6'
ELSE '8' END
WHERE
mode_sortie IN ('D', 'T', 'I');
-- Suppression des tables de travail non utilisées après
DROP TABLE IF EXISTS w_factures_lignes_c_cp CASCADE;
-- Compléments séjours (type pmsi)
SELECT activite.cti_reorganize_sejours('activite.p_sejours');
]]></sqlcmd>
</NODE>
<NODE label="Compléments clients (solde auto)">
<condition><![CDATA[
"[PX]" == ""
]]></condition>
<sqlcmd><![CDATA[
SELECT activite.cti_solde_auto()
;
]]></sqlcmd>
</NODE>
<NODE label="Compléments factures (BG)">
<condition><![CDATA[
"[PX]" == ""
]]></condition>
<sqlcmd><![CDATA[
-- Factures BG récupérées depuis PMSI -> date facture = date groupage
UPDATE activite.p_factures
SET date_facture = p_sejours.date_groupage
FROM activite.p_sejours
WHERE p_factures.type_facture = 'G' AND
p_factures.no_sejour = p_sejours.no_sejour AND
p_sejours.date_groupage > p_factures.date_facture AND
p_sejours.date_groupage <> '20991231';
-- Factures BG récupérées depuis PMSI -> date facture = date derniere facture TP1 hbg
UPDATE activite.p_factures
SET date_facture = p_factures_x.date_facture
FROM activite.p_factures p_factures_x
JOIN activite.p_sejours ON p_factures_x.no_sejour = p_sejours.no_sejour
WHERE p_factures.type_facture = 'G' AND
p_factures_x.no_sejour = p_factures.no_sejour AND
p_factures_x.no_facture <> p_factures.no_facture AND
p_factures_x.type_facture <> 'G' AND
p_factures_x.date_facture > p_factures.date_facture AND
p_factures_x.code_facture = '1' AND
p_factures_x.montant_facture_1_c > 0 AND
p_factures_x.date_facture <> '20991231'
;
]]></sqlcmd>
</NODE>
<NODE label="Compléments factures">
<condition><![CDATA[
"[PX]" == ""
]]></condition>
<sqlcmd><![CDATA[
-- Ajustement date de fin des prestations non facturées si JS non compris
UPDATE activite.p_factures_lignes_non_facturees_c
SET date_fin = date_fin - interval '1 day'
FROM activite.t_prestations
WHERE prestation_id = t_prestations.oid AND
(
t_prestations.code IN ('CPC') OR
type_ventilation_jour = '1'
) AND
(date_fin - date_debut) = nb_rubrique
;
-- Eclatement des lignes non facturées si une ligne pour plusieurs jours
DROP TABLE IF EXISTS w_factures_lignes_non_facturees_c_jour;
CREATE TEMP TABLE w_factures_lignes_non_facturees_c_jour AS
SELECT p_factures_lignes_non_facturees_c.*,
p_factures_lignes_non_facturees_c.CTID AS fromCTID
FROM activite.p_factures_lignes_non_facturees_c
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
WHERE nb_rubrique > 1 AND
(
t_prestations.code IN ('CPC') OR
type_ventilation_jour = '1'
) AND
(date_fin - date_debut + 1) = nb_rubrique
;
UPDATE activite.p_factures_lignes_non_facturees_c SET
nb_rubrique = 1,
date_fin = p_factures_lignes_non_facturees_c.date_debut,
montant_encours = p_factures_lignes_non_facturees_c.montant_encours / p_factures_lignes_non_facturees_c.nb_rubrique
FROM w_factures_lignes_non_facturees_c_jour
WHERE p_factures_lignes_non_facturees_c.CTID = fromCTID
;
DROP TABLE IF EXISTS w_factures_lignes_non_facturees_c_jour_to;
CREATE TEMP TABLE w_factures_lignes_non_facturees_c_jour_to AS
SELECT w_factures_lignes_non_facturees_c_jour.*,
p_calendrier.date AS to_date
FROM w_factures_lignes_non_facturees_c_jour
JOIN base.p_calendrier ON p_calendrier.date > w_factures_lignes_non_facturees_c_jour.date_debut AND p_calendrier.date <= w_factures_lignes_non_facturees_c_jour.date_fin
;
UPDATE w_factures_lignes_non_facturees_c_jour_to SET
nb_rubrique = 1,
date_debut = to_date,
date_fin = to_date,
montant_encours = montant_encours / nb_rubrique
;
ALTER TABLE w_factures_lignes_non_facturees_c_jour_to DROP COLUMN fromCTID;
ALTER TABLE w_factures_lignes_non_facturees_c_jour_to DROP COLUMN to_date;
-- Dans la table w_factures_lignes_non_facturees_c_jour_to, les lignes sont maintenant ventilees jour/jour
-- Pour les factures SSR (facturation intermediaires), il se peut que certaines lignes soient affectées à la mauvaise
-- facture intermédiaire
-- La sequence qui suit permet de reaffecter la bonne facture
ANALYSE w_factures_lignes_non_facturees_c_jour_to
;
DROP TABLE IF EXISTS w_factures_lignes_non_facturees_c_reaffect
;
CREATE TEMP TABLE w_factures_lignes_non_facturees_c_reaffect AS
SELECT
w_factures_lignes_non_facturees_c_jour_to.no_facture,
w_factures_lignes_non_facturees_c_jour_to.date_debut,
MAX(p_factures_cible.no_facture) AS no_facture_cible
FROM w_factures_lignes_non_facturees_c_jour_to
JOIN activite.p_factures ON w_factures_lignes_non_facturees_c_jour_to.no_facture = p_factures.no_facture
JOIN activite.t_lieux ON w_factures_lignes_non_facturees_c_jour_to.lieu_id = t_lieux.oid
JOIN activite.t_services_facturation ON service_facturation_id = t_services_facturation.oid
LEFT JOIN activite.p_factures p_factures_cible ON
p_factures_cible.no_sejour = p_factures.no_sejour AND
w_factures_lignes_non_facturees_c_jour_to.date_debut BETWEEN p_factures_cible.date_debut AND p_factures_cible.date_fin AND
p_factures_cible.type_facture = 'E'
WHERE avec_facturation_intermediaire = '1' AND
w_factures_lignes_non_facturees_c_jour_to.date_debut NOT BETWEEN p_factures.date_debut AND p_factures.date_fin
GROUP BY 1,2
;
ANALYSE w_factures_lignes_non_facturees_c_reaffect
;
UPDATE w_factures_lignes_non_facturees_c_jour_to
SET no_facture = no_facture_cible
FROM w_factures_lignes_non_facturees_c_reaffect
WHERE w_factures_lignes_non_facturees_c_jour_to.no_facture = w_factures_lignes_non_facturees_c_reaffect.no_facture AND
w_factures_lignes_non_facturees_c_jour_to.date_debut = w_factures_lignes_non_facturees_c_reaffect.date_debut AND
no_facture_cible IS NOT NULL
;
-- Suppression des lignes sans facture cible
DELETE FROM w_factures_lignes_non_facturees_c_jour_to
USING w_factures_lignes_non_facturees_c_reaffect
WHERE w_factures_lignes_non_facturees_c_jour_to.no_facture = w_factures_lignes_non_facturees_c_reaffect.no_facture AND
w_factures_lignes_non_facturees_c_jour_to.date_debut = w_factures_lignes_non_facturees_c_reaffect.date_debut AND
no_facture_cible IS NULL
;
INSERT INTO activite.p_factures_lignes_non_facturees_c
SELECT *
FROM w_factures_lignes_non_facturees_c_jour_to
;
SELECT base.cti_vacuum_table('activite','p_factures');
SELECT base.cti_vacuum_table('activite','p_sejours');
-- suppression des FJ pour les services maternite (idem encours CTI)
DELETE
FROM activite.p_factures_lignes_non_facturees_c
USING activite.t_lieux,
activite.t_services_facturation,
activite.t_prestations
WHERE lieu_id = t_lieux.oid AND
t_services_facturation.oid = t_lieux.service_facturation_id AND
t_services_facturation.particularites_encours = 'MAT' AND
t_prestations.oid = prestation_id AND
t_prestations.code IN ('FJ','FJA','FJS','FJR')
;
-- Recalculer totaux facture
UPDATE activite.p_factures SET
montant_facture_c = subview.montant_facture,
montant_facture_0_c = subview.montant_facture_0,
montant_facture_1_c = subview.montant_facture_1,
montant_facture_2_c = subview.montant_facture_2,
montant_facture_22_c = subview.montant_facture_22,
montant_comptabilise_budget_global_c = subview.montant_comptabilise_budget_global_c
FROM (
SELECT p_factures.no_facture,
SUM(COALESCE(CASE WHEN origine_facturation_id = 1 THEN p_factures_lignes_c.montant_facture ELSE 0 END,0)) AS montant_facture,
MAX(p_factures.montant_facture_c),
SUM(COALESCE(CASE WHEN origine_facturation_id = 1 THEN p_factures_lignes_c.montant_facture_0 ELSE 0 END,0)) AS montant_facture_0,
MAX(p_factures.montant_facture_0_c),
SUM(COALESCE(CASE WHEN origine_facturation_id = 1 THEN p_factures_lignes_c.montant_facture_1 ELSE 0 END,0)) AS montant_facture_1,
MAX(p_factures.montant_facture_1_c),
SUM(COALESCE(CASE WHEN origine_facturation_id = 1 THEN p_factures_lignes_c.montant_facture_2 ELSE 0 END,0)) AS montant_facture_2,
MAX(p_factures.montant_facture_2_c),
SUM(COALESCE(CASE WHEN origine_facturation_id = 1 THEN p_factures_lignes_c.montant_facture_22 ELSE 0 END,0)) AS montant_facture_22,
MAX(p_factures.montant_facture_22_c),
SUM(COALESCE(p_factures_lignes_c.montant_comptabilise_budget_global_1,0)) AS montant_comptabilise_budget_global_c,
MAX(p_factures.montant_comptabilise_budget_global_c)
FROM activite.p_factures
LEFT JOIN activite.p_factures_lignes_c on p_factures_lignes_c.no_facture = p_factures.no_facture
GROUP BY 1
HAVING
(
SUM(COALESCE(CASE WHEN origine_facturation_id = 1 THEN p_factures_lignes_c.montant_facture ELSE 0 END,0)) <> MAX(p_factures.montant_facture_c) OR
SUM(COALESCE(CASE WHEN origine_facturation_id = 1 THEN p_factures_lignes_c.montant_facture_0 ELSE 0 END,0)) <> MAX(p_factures.montant_facture_0_c) OR
SUM(COALESCE(CASE WHEN origine_facturation_id = 1 THEN p_factures_lignes_c.montant_facture_1 ELSE 0 END,0)) <> MAX(p_factures.montant_facture_1_c) OR
SUM(COALESCE(CASE WHEN origine_facturation_id = 1 THEN p_factures_lignes_c.montant_facture_2 ELSE 0 END,0)) <> MAX(p_factures.montant_facture_2_c) OR
SUM(COALESCE(CASE WHEN origine_facturation_id = 1 THEN p_factures_lignes_c.montant_facture_22 ELSE 0 END,0)) <> MAX(p_factures.montant_facture_22_c) OR
SUM(COALESCE(p_factures_lignes_c.montant_comptabilise_budget_global_1,0)) <> MAX(p_factures.montant_comptabilise_budget_global_c)
)
) subview
WHERE p_factures.no_facture = subview.no_facture;
-- Recalculer facture de référence
DROP TABLE IF EXISTS w_sejours_facture_reference;
CREATE TEMP TABLE w_sejours_facture_reference AS
SELECT
p_sejours.no_sejour,
CASE WHEN avec_facturation_intermediaire IS DISTINCT FROM '1' THEN p_sejours.date_sortie ELSE p_factures.date_fin END AS date_fin,
MIN(CASE WHEN avec_facturation_intermediaire IS DISTINCT FROM '1' THEN p_sejours.date_entree ELSE p_factures.date_debut END) AS date_debut,
MAX(p_factures.no_facture) AS no_facture_last,
MAX(CASE WHEN p_factures.no_facture NOT LIKE '%.DMA' AND type_facture <> '1' AND type_facture <> 'X' AND type_facture <> 'P' THEN p_factures.no_facture ELSE null END) AS no_facture_reference_last,
(MAX(ARRAY[to_char(
CASE
WHEN p_factures.no_facture NOT LIKE '%.DMA' AND type_facture <> '1' AND type_facture <> 'X' AND type_facture <> 'P' AND (t_prestations.code IN ('GHS','GHT','PJ') OR (p_factures.no_facture LIKE '%BG' AND p_sejours.type_sejour IN ('1','2','5','6'))) THEN p_factures_lignes_c.taux_1
ELSE 0 END
,'FM00000'),
CASE
WHEN p_factures.no_facture NOT LIKE '%.DMA' AND type_facture <> '1' AND type_facture <> 'X' AND type_facture <> 'P' AND (t_prestations.code IN ('GHS','GHT','PJ') OR (p_factures.no_facture LIKE '%BG' AND p_sejours.type_sejour IN ('1','2','5','6'))) THEN p_factures.no_facture
ELSE NULL END
]
))[2] AS no_facture_reference_sejour_last,
COUNT(DISTINCT p_factures.no_facture) AS nb_factures,
MAX(avec_facturation_intermediaire) AS avec_facturation_intermediaire
FROM activite.p_factures
JOIN activite.p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
JOIN activite.t_lieux ON p_sejours.lieu_sortie_id = t_lieux.oid
JOIN activite.t_services_facturation ON service_facturation_id = t_services_facturation.oid
LEFT JOIN activite.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','GHT','PJ')
GROUP BY 1,2;
CREATE INDEX w_sejours_facture_reference_i1
ON w_sejours_facture_reference
USING btree
(no_sejour);
-- Cas d'une facture, d'un avoir et dune autre facture, il faut privilégier l'autre facture
UPDATE w_sejours_facture_reference
SET no_facture_reference_sejour_last = subview.no_facture_reference
FROM
(
SELECT p_factures.no_sejour,
CASE WHEN avec_facturation_intermediaire IS DISTINCT FROM '1' THEN p_sejours.date_sortie ELSE p_factures.date_fin END AS date_fin,
MAX(CASE WHEN type_facture <> '1' AND type_facture <> 'X' THEN no_facture ELSE NULL END) AS no_facture_reference
FROM activite.p_factures
JOIN activite.p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
JOIN activite.t_lieux ON p_sejours.lieu_sortie_id = t_lieux.oid
JOIN activite.t_services_facturation ON service_facturation_id = t_services_facturation.oid
WHERE p_factures.no_facture NOT LIKE '%.DMA'
GROUP BY 1,2
HAVING SUM(CASE WHEN type_facture <> '1' AND type_facture <> 'X' THEN 1 ELSE 0 END) = 1 AND
SUM(CASE WHEN type_facture = '1' THEN 1 ELSE 0 END) = SUM(CASE WHEN type_facture = 'X' THEN 1 ELSE 0 END) AND
SUM(CASE WHEN type_facture = 'X' THEN 1 ELSE 0 END) > 0
) subview
WHERE w_sejours_facture_reference.no_sejour = subview.no_sejour AND
w_sejours_facture_reference.date_fin = subview.date_fin AND
no_facture_reference_sejour_last IS DISTINCT FROM subview.no_facture_reference
;
UPDATE activite.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.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.p_factures
SET facture_reference_id = p_factures_references.oid
FROM activite.p_factures p_factures_references
WHERE p_factures.no_facture_reference = p_factures_references.no_facture
AND p_factures.facture_reference_id <> p_factures_references.oid;
--Report Sur Encours
UPDATE activite.p_factures_encours
SET no_facture_reference = subview.no_facture_reference
FROM
(SELECT no_sejour, MAX(no_facture_reference) AS no_facture_reference
FROM activite.p_factures
GROUP BY 1
HAVING count(distinct no_facture_reference) = 1
) subview
WHERE p_factures_encours.no_sejour = subview.no_sejour AND
p_factures_encours.no_facture_reference <> subview.no_facture_reference;
-- Supprimer les factures de référence nulles sur séjours budget global
DROP TABLE IF EXISTS w_factures_references;
CREATE TEMP TABLE w_factures_references AS
SELECT p_factures.no_facture_reference
FROM activite.p_factures
JOIN activite.p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
JOIN activite.t_lieux ON lieu_sortie_id = t_lieux.oid
JOIN activite.t_services_facturation ON service_facturation_id = t_services_facturation.oid
JOIN activite.p_factures_reference ON p_factures_reference.no_facture_reference = p_factures.no_facture_reference
WHERE p_factures_reference.nb_non_calcules > 0 AND
t_services_facturation.est_sans_facturation = '2'
GROUP BY 1
HAVING SUM(CASE WHEN p_factures.code_facture = '1' AND p_factures.no_facture LIKE '%BG' THEN 1 ELSE 0 END) > 0 AND
SUM(CASE WHEN p_factures.code_facture = '0' AND
p_factures.montant_facture_c = 0 AND
p_factures.montant_facture_h = 0 AND
p_factures.montant_regle_c = 0 AND
p_factures.montant_regle_h = 0
THEN 1 ELSE 0 END) > 0
ORDER BY 1;
DELETE FROM activite.p_factures
USING w_factures_references
WHERE w_factures_references.no_facture_reference = p_factures.no_facture_reference AND
p_factures.code_facture = '0' AND
p_factures.montant_facture_c = 0 AND
p_factures.montant_facture_h = 0 AND
p_factures.montant_regle_c = 0 AND
p_factures.montant_regle_h = 0;
-- Reporter ghs sur factures
UPDATE activite.p_factures
SET ghs_id = p_sejours.ghs_id
FROM activite.p_sejours
WHERE p_factures.no_sejour = p_sejours.no_sejour AND p_factures.ghs_id IS DISTINCT FROM p_sejours.ghs_id;
UPDATE activite.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' AND ghs_id > 0;
-- Cas spécial de deux factures additives non facturées (pour génération encours)
UPDATE activite.p_factures
SET type_facture = '0'
WHERE no_facture IN
(
SELECT no_facture_reference
FROM
(
SELECT no_sejour, MAX(no_facture_reference) AS no_facture_reference
FROM activite.p_factures
WHERE code_facture = '0'
GROUP BY 1
HAVING count(*) > 1 AND
SUM(CASE WHEN type_facture = '2' AND code_facture = '0' THEN 1 ELSE 0 END) = count(*)
) subview
)
;
]]></sqlcmd>
</NODE>
<NODE label="Compléments factures séances (BG)">
<condition><![CDATA[
"[PX]" == ""
]]></condition>
<sqlcmd><![CDATA[
-- Eclatement seances pour séjours à l'année (GHM Grenoble)
DROP TABLE IF EXISTS w_factures_seances_bg;
CREATE TEMP TABLE w_factures_seances_bg AS
SELECT p_factures.*,
GREATEST(p_calendrier_mois.date_debut,p_factures.date_debut) AS date_seance_debut,
LEAST(p_calendrier_mois.date_fin,p_factures.date_fin) AS date_seance_fin,
0::numeric AS nb_seances,
0::numeric AS nb_seances_facturees,
no_facture AS no_facture_original
FROM activite.p_factures
JOIN activite.p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
LEFT JOIN base.t_ghm ON p_sejours.ghm_id = t_ghm.oid
JOIN base.p_calendrier_mois ON p_calendrier_mois.date_debut <= p_factures.date_fin AND p_calendrier_mois.date_fin >= p_factures.date_debut
WHERE no_facture LIKE '%BG' AND
type_sejour = '5' AND
COALESCE(t_ghm.code,'') NOT IN ('28Z19Z', '28Z20Z') AND
date_trunc('month',p_factures.date_fin) > date_trunc('month',p_factures.date_debut)
;
SELECT setval('activite.s_factures', COALESCE((SELECT MAX(oid) FROM activite.p_factures),0)+1, true)
;
UPDATE w_factures_seances_bg
SET date_debut = date_seance_debut,
date_fin = date_seance_fin,
no_facture = CASE WHEN w_factures_seances_bg.date_debut = date_seance_debut THEN w_factures_seances_bg.no_facture_original ELSE replace(no_facture_original,'BG','') || to_char(date_seance_fin,'YYMM') || '.BG' END,
oid = CASE WHEN w_factures_seances_bg.date_debut = date_seance_debut THEN w_factures_seances_bg.oid ELSE nextval('activite.s_factures'::regclass) END
;
UPDATE w_factures_seances_bg SET
no_facture_reference = no_facture,
facture_reference_id = oid
;
ANALYSE w_factures_seances_bg;
CREATE INDEX i_w_factures_seances_bg_1
ON w_factures_seances_bg
USING btree
(no_facture_original);
CREATE INDEX i_w_factures_seances_bg_2
ON w_factures_seances_bg
USING btree
(no_sejour);
UPDATE w_factures_seances_bg
SET nb_seances = subview.nb_seances
FROM
(
SELECT no_facture, COUNT(DISTINCT date) AS nb_seances
FROM activite.p_mouvements_sejour
JOIN w_factures_seances_bg ON
p_mouvements_sejour.no_sejour = w_factures_seances_bg.no_sejour AND
p_mouvements_sejour.date BETWEEN w_factures_seances_bg.date_debut AND w_factures_seances_bg.date_fin AND
p_mouvements_sejour.nb_seances > 0
GROUP BY 1
) subview
WHERE subview.no_facture = w_factures_seances_bg.no_facture AND
subview.nb_seances > 0
;
UPDATE w_factures_seances_bg
SET nb_seances_facturees = subview.nb_seances
FROM
(
SELECT w_factures_seances_bg.no_facture, COUNT(DISTINCT p_factures_lignes_c.date_debut) AS nb_seances
FROM activite.p_factures_lignes_c
JOIN w_factures_seances_bg ON
p_factures_lignes_c.no_facture = w_factures_seances_bg.no_facture_original AND
p_factures_lignes_c.date_debut BETWEEN w_factures_seances_bg.date_debut AND w_factures_seances_bg.date_fin AND
p_factures_lignes_c.montant_facture > 0
GROUP BY 1
) subview
WHERE subview.no_facture = w_factures_seances_bg.no_facture AND
subview.nb_seances > 0
;
UPDATE w_factures_seances_bg SET
code_facture = CASE WHEN nb_seances_facturees > 0 THEN '1' WHEN nb_seances = 0 THEN '1' ELSE '0' END,
date_facture = CASE WHEN nb_seances_facturees > 0 THEN date_fin WHEN nb_seances = 0 THEN date_fin ELSE '20991231' END,
code_vente = CASE WHEN nb_seances_facturees > 0 THEN '1' WHEN nb_seances = 0 THEN '1' ELSE '0' END,
date_vente = CASE WHEN nb_seances_facturees > 0 THEN date_fin WHEN nb_seances = 0 THEN date_fin ELSE '20991231' END,
mois_vente = to_char(CASE WHEN nb_seances_facturees > 0 THEN date_fin WHEN nb_seances = 0 THEN date_fin ELSE '20991231' END,'YYYMM')::numeric
;
UPDATE activite.p_factures_lignes_c
SET no_facture = w_factures_seances_bg.no_facture, facture_id = w_factures_seances_bg.oid
FROM w_factures_seances_bg
WHERE p_factures_lignes_c.no_facture = w_factures_seances_bg.no_facture_original AND
p_factures_lignes_c.date_debut BETWEEN w_factures_seances_bg.date_debut AND w_factures_seances_bg.date_fin AND
p_factures_lignes_c.no_facture <> w_factures_seances_bg.no_facture
;
UPDATE activite.p_factures_lignes_h
SET no_facture = w_factures_seances_bg.no_facture, facture_id = w_factures_seances_bg.oid
FROM w_factures_seances_bg
WHERE p_factures_lignes_h.no_facture = w_factures_seances_bg.no_facture_original AND
p_factures_lignes_h.date_debut BETWEEN w_factures_seances_bg.date_debut AND w_factures_seances_bg.date_fin AND
p_factures_lignes_h.no_facture <> w_factures_seances_bg.no_facture
;
UPDATE w_factures_seances_bg SET
montant_facture_c = subview.montant_facture,
montant_facture_1_c = subview.montant_facture,
montant_comptabilise_budget_global_c = subview.montant_facture
FROM
(
SELECT w_factures_seances_bg.no_facture, SUM(COALESCE(montant_facture,0)) AS montant_facture
FROM w_factures_seances_bg
LEFT JOIN activite.p_factures_lignes_c ON
p_factures_lignes_c.no_facture = w_factures_seances_bg.no_facture AND
p_factures_lignes_c.date_debut BETWEEN w_factures_seances_bg.date_debut AND w_factures_seances_bg.date_fin AND
p_factures_lignes_c.montant_facture > 0
GROUP BY 1
) subview
WHERE subview.no_facture = w_factures_seances_bg.no_facture AND
w_factures_seances_bg.montant_facture_c <> subview.montant_facture
;
DELETE
FROM activite.p_factures
WHERE no_facture IN (SELECT no_facture_original FROM w_factures_seances_bg)
;
ALTER TABLE w_factures_seances_bg DROP COLUMN nb_seances;
ALTER TABLE w_factures_seances_bg DROP COLUMN nb_seances_facturees;
ALTER TABLE w_factures_seances_bg DROP COLUMN date_seance_debut;
ALTER TABLE w_factures_seances_bg DROP COLUMN date_seance_fin;
ALTER TABLE w_factures_seances_bg DROP COLUMN no_facture_original;
INSERT INTO activite.p_factures
SELECT * FROM w_factures_seances_bg
;
UPDATE activite.p_factures SET
no_facture_reference = p_factures_bg.no_facture, facture_reference_id = p_factures_bg.oid
FROM activite.p_factures p_factures_bg
JOIN activite.p_sejours ON p_factures_bg.no_sejour = p_sejours.no_sejour AND p_sejours.type_sejour = '5'
WHERE
p_factures.no_sejour = p_factures_bg.no_sejour AND
p_factures.no_facture NOT LIKE '%BG' AND
p_factures.no_facture_reference LIKE '%BG' AND
p_factures_bg.no_facture LIKE '%BG' AND
p_factures.date_fin BETWEEN p_factures_bg.date_debut AND p_factures_bg.date_fin AND
p_factures.no_facture_reference <> p_factures_bg.no_facture
;
]]></sqlcmd>
</NODE>
<NODE label="Compléments lignes factures">
<condition><![CDATA[
"[PX]" == ""
]]></condition>
<sqlcmd><![CDATA[
-- Suppression des prestations comptées en double (présentes dans la facture initiale et dans la facture BG)
DROP TABLE IF EXISTS w_dejafac_bg
;
CREATE TEMP TABLE w_dejafac_bg AS
SELECT
p_factures.no_sejour
,p_factures_lignes_c.prestation_id
FROM activite.p_factures_lignes_c
JOIN activite.p_factures ON p_factures_lignes_c.no_facture = p_factures.no_facture
WHERE p_factures_lignes_c.no_facture LIKE '%BG'
GROUP BY
p_factures.no_sejour,
p_factures_lignes_c.prestation_id
;
ANALYZE w_dejafac_bg
;
DROP TABLE IF EXISTS w_dejafac_hbg
;
CREATE TEMP TABLE w_dejafac_hbg AS
SELECT
p_factures.no_facture
,p_factures_lignes_c.prestation_id
FROM activite.p_factures_lignes_c
JOIN activite.p_factures ON p_factures_lignes_c.no_facture = p_factures.no_facture
JOIN w_dejafac_bg
ON p_factures.no_sejour = w_dejafac_bg.no_sejour
AND p_factures_lignes_c.prestation_id = w_dejafac_bg.prestation_id
WHERE p_factures_lignes_c.no_facture NOT LIKE '%BG'
AND p_factures_lignes_c.montant_facture = 0
AND p_factures_lignes_c.montant_comptabilise = 0
AND p_factures_lignes_c.montant_encours = 0
GROUP BY
p_factures.no_facture,
p_factures_lignes_c.prestation_id
;
ANALYZE w_dejafac_hbg
;
DELETE FROM activite.p_factures_lignes_c
USING w_dejafac_hbg
WHERE p_factures_lignes_c.no_facture = w_dejafac_hbg.no_facture
AND p_factures_lignes_c.prestation_id = w_dejafac_hbg.prestation_id
AND p_factures_lignes_c.montant_facture = 0
AND p_factures_lignes_c.montant_comptabilise = 0
AND p_factures_lignes_c.montant_encours = 0
;
-- Lieu des lignes de factures (en tenant compte des absences)
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.p_mouvements_sejour
JOIN activite.t_lieux ON lieu_id = t_lieux.oid
JOIN activite.t_services_facturation On service_facturation_id = t_services_facturation.oid
GROUP BY 1,2
HAVING (MAX(CASE WHEN est_absence <> '1' THEN Array[heure_fin, lieu_id] ELSE NULL END))[2] IS DISTINCT FROM (MAX(Array[heure_fin, lieu_id]))[2]
;
UPDATE activite.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.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_fin = 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)
;
UPDATE activite.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.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_fin = 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)
;
-- Dans le cas des ESPIC les prestations peuvent être facturées en partie sur la facture BG (part AMO) et et partie dans la GAP (part AMC/PATIENT)
-- Dans ce cas afin de ne pas doubler le nombre de prestations -> mise à 0 des coefficient (quantités) des prestations venant dans de la GAP si prestation identique venant de la facture BG
WITH prestations_importees_pmsi as (
SELECT
p_factures.no_facture_reference,
t_prestations.oid as prestation_id
FROM activite.p_factures_lignes_c
JOIN activite.p_factures ON p_factures.no_facture = p_factures_lignes_c.no_facture
JOIN activite.p_sejours ON p_sejours.no_sejour = p_factures.no_sejour -- Jointure sur séjour pour récupérer finess
JOIN base.t_finess ON t_finess.code = p_sejours.finess -- Jointure sur finess pour limiter l'impact aux espics
JOIN activite.t_prestations ON t_prestations.oid = p_factures_lignes_c.prestation_id
AND t_prestations.code IN ('PJ', 'FJ', 'SSM', 'SRC', 'REA', 'STF', 'NN1', 'NN2', 'NN3', 'CP', 'CPC', 'SHO') -- filtre sur les prestations souhaitées
WHERE p_factures.no_facture = no_facture_reference
AND p_factures.no_facture ilike '%BG' -- ne conserver que les factures provenant du PMSI (BG)
AND taux_1 < 100 -- Exclure les lignes à 100% BG -> 100% AMO
AND type_etablissement IN ('2','3') -- Filtre sur espic
GROUP BY 1,2
)
UPDATE activite.p_factures_lignes_c
SET coefficient = 0 -- Mettre la quantité à 0
FROM activite.p_factures, prestations_importees_pmsi
WHERE 1=1
AND p_factures.no_facture = p_factures_lignes_c.no_facture
AND prestations_importees_pmsi.no_facture_reference = p_factures.no_facture_reference AND p_factures_lignes_c.prestation_id = prestations_importees_pmsi.prestation_id -- Si ligne avec prestation identique sur même facture de référence
AND p_factures.no_facture NOT LIKE '%BG' -- Ne pas mettre à jour ce qui vient du PMSI
AND ((taux_2 > 0 AND taux_2 < 100) OR (taux_0 > 0 AND taux_0 < 100)); -- Seulement si lignes n'est pas à 100% patient/AMC
]]></sqlcmd>
</NODE>
<NODE label="Compléments encours">
<condition><![CDATA[
"[PX]" == ""
]]></condition>
<sqlcmd><![CDATA[
ANALYSE activite.p_sejours;
ANALYSE activite.p_mouvements_sejour;
ANALYSE activite.p_factures;
ANALYSE activite.p_factures_lignes_c;
ANALYSE activite.p_factures_reference;
ANALYSE activite.p_factures_encours;
ANALYSE activite.p_factures_encours_lignes_c;
SELECT activite.valoriser_sejours_groupes_smr();
SELECT activite.calcul_encours(NULL,'');
SELECT activite.cti_ajust_encours();
-- Ajustement dotation
SELECT activite.cti_gen_dotation();
]]></sqlcmd>
</NODE>
<NODE label="Factures de référence">
<condition><![CDATA[
"[PX]" == ""
]]></condition>
<sqlcmd><![CDATA[
DROP TABLE IF EXISTS w_factures_reference;
CREATE TEMP TABLE w_factures_reference AS
SELECT
p_sejours.oid AS sejour_id,
p_sejours.no_sejour,
p_sejours.date_entree,
p_sejours.date_sortie,
p_sejours.code_sorti,
p_sejours.type_sejour,
facture_reference_id,
no_facture_reference,
CASE WHEN p_sejours.type_sejour IN ('1','2','5') THEN type_t2a ELSE '0' END AS type_t2a,
MIN(CASE
WHEN p_sejours.type_sejour = '3' THEN p_sejours.date_entree
WHEN p_sejours.type_sejour IN ('5') AND no_facture_reference LIKE '%BG' THEN date_debut
WHEN p_sejours.type_sejour IN ('1','2','5') AND type_t2a = '1' THEN p_sejours.date_entree
WHEN p_sejours.type_sejour IN ('1','2','5') AND avec_facturation_intermediaire <> '1' THEN p_sejours.date_entree
ELSE date_debut END) AS date_debut_facture,
MAX(CASE
WHEN p_sejours.type_sejour = '3' THEN p_sejours.date_sortie
WHEN p_sejours.type_sejour IN ('5') AND no_facture_reference LIKE '%BG' THEN date_fin
WHEN p_sejours.type_sejour IN ('1','2','5') AND type_t2a = '1' THEN p_sejours.date_sortie
WHEN p_sejours.type_sejour IN ('1','2','5') AND avec_facturation_intermediaire <> '1' THEN p_sejours.date_sortie
ELSE date_fin END) AS date_fin_facture,
MAX(CASE WHEN no_facture = no_facture_reference THEN p_factures.type_facture ELSE NULL END) AS type_facture,
MAX(date_groupage) AS date_groupage,
NULL::numeric AS delai_groupage,
0::numeric AS retard_groupage,
0::numeric AS nb_groupe,
0::numeric AS nb_non_groupe,
0::numeric AS nb_calculable,
MAX(CASE WHEN no_facture = no_facture_reference THEN GREATEST(p_factures.ghs_id,0) ELSE 0 END) AS ghs_id,
MAX(CASE WHEN no_facture = no_facture_reference THEN p_factures.ghs_bebe1_id ELSE 0 END) AS ghs_bebe1_id,
MAX(CASE WHEN no_facture = no_facture_reference THEN p_factures.ghs_bebe2_id ELSE 0 END) AS ghs_bebe2_id,
MAX(CASE WHEN no_facture = no_facture_reference THEN p_factures.ghs_bebe3_id ELSE 0 END) AS ghs_bebe3_id,
MAX(CASE WHEN no_facture = no_facture_reference THEN GREATEST(p_factures.gmt_id,0) ELSE 0 END) AS gmt_id,
MAX(CASE WHEN no_facture = no_facture_reference THEN p_factures.tiers_payant_0_id ELSE 0 END) AS tiers_payant_0_id,
MAX(CASE WHEN no_facture = no_facture_reference THEN p_factures.tiers_payant_1_id ELSE 0 END) AS tiers_payant_1_id,
MAX(CASE WHEN no_facture = no_facture_reference THEN p_factures.tiers_payant_2_id ELSE 0 END) AS tiers_payant_2_id,
MAX(CASE WHEN no_facture = no_facture_reference THEN p_factures.tiers_payant_22_id ELSE 0 END) AS tiers_payant_22_id,
MAX(CASE WHEN no_facture = no_facture_reference AND p_factures.code_facture IN ('1', '2') THEN '1' ELSE '0' END) AS code_facture,
MAX(CASE WHEN no_facture = no_facture_reference THEN p_factures.date_facture ELSE '00010101' END) AS date_facture,
NULL::numeric AS delai_facture,
0::numeric AS retard_facture,
MAX(CASE WHEN no_facture = no_facture_reference THEN p_factures.code_vente ELSE '0' END) AS code_vente,
MAX(CASE WHEN no_facture = no_facture_reference THEN p_factures.date_vente ELSE '00010101' END) AS date_vente,
COUNT(*) AS nb_factures,
MAX(CASE
WHEN p_sejours.code_sorti <> '1' AND avec_facturation_intermediaire <> '1' THEN 0
WHEN p_factures.type_facture NOT IN ('P', 'G') AND p_factures.code_facture NOT IN ('1','2') THEN 1
ELSE 0 END) AS nb_non_calcules,
COALESCE(MAX(CASE
WHEN p_sejours.code_sorti <> '1' AND avec_facturation_intermediaire <> '1' THEN 0
WHEN p_factures.type_facture NOT IN ('P', 'G') AND p_factures.no_facture NOT LIKE '%BG' AND p_factures.code_facture NOT IN ('1','2') THEN 1
ELSE 0 END),0) AS nb_non_calcules_horsbg,
COALESCE(MAX(CASE
WHEN p_sejours.code_sorti <> '1' AND avec_facturation_intermediaire <> '1' THEN 0
WHEN p_factures.type_facture NOT IN ('P', 'G') AND p_factures.no_facture LIKE '%BG' AND p_factures.code_facture NOT IN ('1','2') THEN 1
ELSE 0 END),0) AS nb_non_calcules_bg,
SUM(CASE
WHEN p_factures.type_facture = '0'::bpchar THEN 0
WHEN p_factures.type_facture = 'P'::bpchar THEN 0
WHEN p_factures.type_facture = 'E'::bpchar THEN 0
WHEN p_factures.type_facture = 'X'::bpchar THEN 0
ELSE 1
END) AS nb_factures_regularisation,
SUM(p_factures.nb_rejets) AS nb_rejets,
'1'::text AS code_expedie_0,
MAX(CASE WHEN no_facture = no_facture_reference AND p_factures.code_expedie_1 = '1' THEN p_factures.code_expedie_1 ELSE '0' END) AS code_expedie_1,
MAX(p_factures.code_expedie_2) AS code_expedie_2,
MAX(CASE WHEN no_facture = no_facture_reference THEN p_factures.date_expedition ELSE '00010101' END) AS date_expedition,
MAX(CASE WHEN p_factures.code_expedie_0 = '1' AND p_factures.date_expedition_0 < '20991231' THEN p_factures.date_expedition_0 ELSE '00010101' END) AS date_expedition_0,
MAX(CASE WHEN no_facture = no_facture_reference AND p_factures.code_expedie_1 = '1' THEN p_factures.date_expedition_1 ELSE '00010101' END) AS date_expedition_1,
MAX(CASE WHEN p_factures.code_expedie_2 = '1' AND p_factures.date_expedition_2 < '20991231' THEN p_factures.date_expedition_2 ELSE '00010101' END) AS date_expedition_2,
MAX(CASE WHEN p_factures.code_expedie_0 = '1' AND p_factures.date_expedition_0 < '20991231' THEN no_bordereau_0 ELSE '' END) AS no_bordereau_0,
MAX(CASE WHEN no_facture = no_facture_reference AND code_expedie_1 = '1' THEN no_bordereau_1 ELSE '' END) AS no_bordereau_1,
MAX(CASE WHEN p_factures.code_expedie_2 = '1' AND p_factures.date_expedition_2 < '20991231' THEN no_bordereau_2 ELSE '' END) AS no_bordereau_2,
NULL::numeric AS delai_expedition,
NULL::numeric AS delai_expedition_0,
NULL::numeric AS delai_expedition_1,
NULL::numeric AS delai_expedition_2,
0::numeric AS nb_non_expedie,
0::numeric AS nb_non_expedie_c,
0::numeric AS nb_non_expedie_h,
0::numeric AS nb_non_expedie_0,
0::numeric AS nb_non_expedie_0_c,
0::numeric AS nb_non_expedie_0_h,
0::numeric AS nb_non_expedie_1,
0::numeric AS nb_non_expedie_1_c,
0::numeric AS nb_non_expedie_1_h,
0::numeric AS nb_non_expedie_2,
0::numeric AS nb_non_expedie_2_c,
0::numeric AS nb_non_expedie_2_h,
SUM(p_factures.montant_facture_c + p_factures.montant_facture_h) AS montant_facture,
SUM(p_factures.montant_facture_c) AS montant_facture_c,
SUM(p_factures.montant_facture_h) AS montant_facture_h,
SUM(p_factures.montant_facture_0_c + p_factures.montant_facture_0_h) AS montant_facture_0,
SUM(p_factures.montant_facture_0_c) AS montant_facture_0_c,
SUM(p_factures.montant_facture_0_h) AS montant_facture_0_h,
SUM(p_factures.montant_facture_1_c + p_factures.montant_facture_1_h) AS montant_facture_1,
SUM(p_factures.montant_facture_1_c) AS montant_facture_1_c,
SUM(p_factures.montant_facture_1_h) AS montant_facture_1_h,
SUM(p_factures.montant_facture_2_c + p_factures.montant_facture_2_h + p_factures.montant_facture_22_c + p_factures.montant_facture_22_h) AS montant_facture_2,
SUM(p_factures.montant_facture_2_c + p_factures.montant_facture_22_c) AS montant_facture_2_c,
SUM(p_factures.montant_facture_2_h + p_factures.montant_facture_22_h) AS montant_facture_2_h,
SUM(p_factures.montant_facture_c_actes_inclus_dans_sejour) AS montant_facture_c_actes_inclus_dans_sejour,
SUM(p_factures.montant_facture_h_actes_inclus_dans_sejour) AS montant_facture_h_actes_inclus_dans_sejour,
SUM(p_factures.montant_encours_c + p_factures.montant_encours_h) AS montant_encours,
SUM(p_factures.montant_encours_c) AS montant_encours_c,
SUM(p_factures.montant_encours_h) AS montant_encours_h,
SUM(p_factures.montant_encours_0_c + p_factures.montant_encours_0_h) AS montant_encours_0,
SUM(p_factures.montant_encours_0_c) AS montant_encours_0_c,
SUM(p_factures.montant_encours_0_h) AS montant_encours_0_h,
SUM(p_factures.montant_encours_1_c + p_factures.montant_encours_1_h) AS montant_encours_1,
SUM(p_factures.montant_encours_1_c) AS montant_encours_1_c,
SUM(p_factures.montant_encours_1_h) AS montant_encours_1_h,
SUM(p_factures.montant_encours_2_c + p_factures.montant_encours_2_h + p_factures.montant_encours_22_c + p_factures.montant_encours_22_h) AS montant_encours_2,
SUM(p_factures.montant_encours_2_c + p_factures.montant_encours_22_c) AS montant_encours_2_c,
SUM(p_factures.montant_encours_2_h + p_factures.montant_encours_22_h) AS montant_encours_2_h,
SUM(p_factures.montant_comptabilise_c + p_factures.montant_comptabilise_h) AS montant_comptabilise,
SUM(p_factures.montant_comptabilise_c) AS montant_comptabilise_c,
SUM(p_factures.montant_comptabilise_h) AS montant_comptabilise_h,
SUM(p_factures.montant_comptabilise_0_c + p_factures.montant_comptabilise_0_h) AS montant_comptabilise_0,
SUM(p_factures.montant_comptabilise_0_c) AS montant_comptabilise_0_c,
SUM(p_factures.montant_comptabilise_0_h) AS montant_comptabilise_0_h,
SUM(p_factures.montant_comptabilise_1_c + p_factures.montant_comptabilise_1_h) AS montant_comptabilise_1,
SUM(p_factures.montant_comptabilise_1_c) AS montant_comptabilise_1_c,
SUM(p_factures.montant_comptabilise_1_h) AS montant_comptabilise_1_h,
SUM(p_factures.montant_comptabilise_2_c + p_factures.montant_comptabilise_2_h + p_factures.montant_comptabilise_22_c + p_factures.montant_comptabilise_22_h) AS montant_comptabilise_2,
SUM(p_factures.montant_comptabilise_2_c + p_factures.montant_comptabilise_22_c) AS montant_comptabilise_2_c,
SUM(p_factures.montant_comptabilise_2_h + p_factures.montant_comptabilise_22_h) AS montant_comptabilise_2_h,
SUM(p_factures.montant_comptabilise_budget_global_c) AS montant_comptabilise_budget_global_c,
SUM(p_factures.montant_regle_c + p_factures.montant_regle_h) AS montant_regle,
SUM(p_factures.montant_regle_c) AS montant_regle_c,
SUM(p_factures.montant_regle_h) AS montant_regle_h,
SUM(p_factures.montant_regle_0_c + p_factures.montant_regle_0_h) AS montant_regle_0,
SUM(p_factures.montant_regle_0_c) AS montant_regle_0_c,
SUM(p_factures.montant_regle_0_h) AS montant_regle_0_h,
SUM(p_factures.montant_regle_1_c + p_factures.montant_regle_1_h) AS montant_regle_1,
SUM(p_factures.montant_regle_1_c) AS montant_regle_1_c,
SUM(p_factures.montant_regle_1_h) AS montant_regle_1_h,
SUM(p_factures.montant_regle_2_c + p_factures.montant_regle_2_h + p_factures.montant_regle_22_c + p_factures.montant_regle_22_h) AS montant_regle_2,
SUM(p_factures.montant_regle_2_c + p_factures.montant_regle_22_c) AS montant_regle_2_c,
SUM(p_factures.montant_regle_2_h + p_factures.montant_regle_22_h) AS montant_regle_2_h,
COALESCE(
CASE
WHEN SUM(p_factures.montant_regle_c) >= SUM(p_factures.montant_comptabilise_c) AND SUM(p_factures.montant_regle_h) >= SUM(p_factures.montant_comptabilise_h) THEN
MAX(CASE WHEN p_factures.date_solde < '20991231' AND p_factures.date_solde > '00010101' THEN p_factures.date_solde ELSE NULL END)
ELSE NULL END
,'20991231') AS date_solde,
COALESCE(
CASE
WHEN SUM(p_factures.montant_regle_c) >= SUM(p_factures.montant_comptabilise_c) THEN
MAX(CASE WHEN p_factures.date_solde_c < '20991231' AND p_factures.date_solde_c > '00010101' THEN p_factures.date_solde_c ELSE NULL END)
ELSE NULL END
,'20991231') AS date_solde_c,
COALESCE(
CASE
WHEN SUM(p_factures.montant_regle_h) >= SUM(p_factures.montant_comptabilise_h) THEN
MAX(CASE WHEN p_factures.date_solde_h < '20991231' AND p_factures.date_solde_h > '00010101' THEN p_factures.date_solde_h ELSE NULL END)
ELSE NULL END
,'20991231') AS date_solde_h,
NULL::date AS date_solde_0,
COALESCE(
CASE
WHEN SUM(p_factures.montant_regle_0_c) >= SUM(p_factures.montant_comptabilise_0_c) THEN
MAX(CASE WHEN p_factures.date_solde_0_c < '20991231' AND p_factures.date_solde_0_c > '00010101' THEN p_factures.date_solde_0_c ELSE NULL END)
ELSE NULL END
,'20991231') AS date_solde_0_c,
COALESCE(
CASE
WHEN SUM(p_factures.montant_regle_0_h) >= SUM(p_factures.montant_comptabilise_0_h) THEN
MAX(CASE WHEN p_factures.date_solde_0_h < '20991231' AND p_factures.date_solde_0_h > '00010101' THEN p_factures.date_solde_0_h ELSE NULL END)
ELSE NULL END
,'20991231') AS date_solde_0_h,
NULL::date AS date_solde_1,
COALESCE(
CASE
WHEN SUM(p_factures.montant_regle_1_c) >= SUM(p_factures.montant_comptabilise_1_c) THEN
MAX(CASE WHEN p_factures.date_solde_1_c < '20991231' AND p_factures.date_solde_1_c > '00010101' THEN p_factures.date_solde_1_c ELSE NULL END)
ELSE NULL END
,'20991231') AS date_solde_1_c,
COALESCE(
CASE
WHEN SUM(p_factures.montant_regle_1_h) >= SUM(p_factures.montant_comptabilise_1_h) THEN
MAX(CASE WHEN p_factures.date_solde_1_h < '20991231' AND p_factures.date_solde_1_h > '00010101' THEN p_factures.date_solde_1_h ELSE NULL END)
ELSE NULL END
,'20991231') AS date_solde_1_h,
NULL::date AS date_solde_2,
COALESCE(
CASE
WHEN SUM(p_factures.montant_regle_2_c) >= SUM(p_factures.montant_comptabilise_2_c) THEN
MAX(CASE WHEN p_factures.date_solde_2_c < '20991231' AND p_factures.date_solde_2_c > '00010101' THEN p_factures.date_solde_2_c ELSE NULL END)
ELSE NULL END
,'20991231') AS date_solde_2_c,
COALESCE(
CASE
WHEN SUM(p_factures.montant_regle_2_h) >= SUM(p_factures.montant_comptabilise_2_h) THEN
MAX(CASE WHEN p_factures.date_solde_2_h < '20991231' AND p_factures.date_solde_2_h > '00010101' THEN p_factures.date_solde_2_h ELSE NULL END)
ELSE NULL END
,'20991231') AS date_solde_2_h,
0::numeric AS delai_solde,
0::numeric AS delai_solde_c,
0::numeric AS delai_solde_h,
0::numeric AS delai_solde_0,
0::numeric AS delai_solde_0_c,
0::numeric AS delai_solde_0_h,
0::numeric AS delai_solde_1,
0::numeric AS delai_solde_1_c,
0::numeric AS delai_solde_1_h,
0::numeric AS delai_solde_2,
0::numeric AS delai_solde_2_c,
0::numeric AS delai_solde_2_h,
0::numeric AS nb_non_solde,
0::numeric AS nb_non_solde_c,
0::numeric AS nb_non_solde_h,
0::numeric AS nb_non_solde_0,
0::numeric AS nb_non_solde_0_c,
0::numeric AS nb_non_solde_0_h,
0::numeric AS nb_non_solde_1,
0::numeric AS nb_non_solde_1_c,
0::numeric AS nb_non_solde_1_h,
0::numeric AS nb_non_solde_2,
0::numeric AS nb_non_solde_2_c,
0::numeric AS nb_non_solde_2_h,
MAX(CASE WHEN p_factures.montant_comptabilise_c <> p_factures.montant_regle_c OR p_factures.montant_comptabilise_h <> p_factures.montant_regle_h THEN 1 ELSE 0 END) AS nb_non_cloture,
MAX(CASE WHEN p_factures.montant_comptabilise_c <> p_factures.montant_regle_c THEN 1 ELSE 0 END) AS nb_non_cloture_c,
MAX(CASE WHEN p_factures.montant_comptabilise_h <> p_factures.montant_regle_h THEN 1 ELSE 0 END) AS nb_non_cloture_h,
MAX(CASE WHEN p_factures.montant_comptabilise_0_c <> p_factures.montant_regle_0_c OR p_factures.montant_comptabilise_0_h <> p_factures.montant_regle_0_h THEN 1 ELSE 0 END) AS nb_non_cloture_0,
MAX(CASE WHEN p_factures.montant_comptabilise_0_c <> p_factures.montant_regle_0_c THEN 1 ELSE 0 END) AS nb_non_cloture_0_c,
MAX(CASE WHEN p_factures.montant_comptabilise_0_h <> p_factures.montant_regle_0_h THEN 1 ELSE 0 END) AS nb_non_cloture_0_h,
MAX(CASE WHEN p_factures.montant_comptabilise_1_c <> p_factures.montant_regle_1_c OR p_factures.montant_comptabilise_1_h <> p_factures.montant_regle_1_h THEN 1 ELSE 0 END) AS nb_non_cloture_1,
MAX(CASE WHEN p_factures.montant_comptabilise_1_c <> p_factures.montant_regle_1_c THEN 1 ELSE 0 END) AS nb_non_cloture_1_c,
MAX(CASE WHEN p_factures.montant_comptabilise_1_h <> p_factures.montant_regle_1_h THEN 1 ELSE 0 END) AS nb_non_cloture_1_h,
MAX(CASE WHEN p_factures.montant_comptabilise_2_c <> p_factures.montant_regle_2_c OR p_factures.montant_comptabilise_2_h <> p_factures.montant_regle_2_h OR p_factures.montant_comptabilise_22_c <> p_factures.montant_regle_22_c OR p_factures.montant_comptabilise_22_h <> p_factures.montant_regle_22_h THEN 1 ELSE 0 END) AS nb_non_cloture_2,
MAX(CASE WHEN p_factures.montant_comptabilise_2_c <> p_factures.montant_regle_2_c OR p_factures.montant_comptabilise_22_c <> p_factures.montant_regle_22_c THEN 1 ELSE 0 END) AS nb_non_cloture_2_c,
MAX(CASE WHEN p_factures.montant_comptabilise_2_h <> p_factures.montant_regle_2_h OR p_factures.montant_comptabilise_22_h <> p_factures.montant_regle_22_h THEN 1 ELSE 0 END) AS nb_non_cloture_2_h,
0::numeric AS nb_rubriques_c,
0::numeric AS nb_rubriques_h
FROM activite.p_sejours
JOIN activite.p_factures ON p_factures.no_sejour = p_sejours.no_sejour
JOIN activite.t_lieux ON p_sejours.lieu_sortie_id = t_lieux.oid
JOIN activite.t_services_facturation ON service_facturation_id = t_services_facturation.oid
WHERE t_services_facturation.est_sans_facturation IS DISTINCT FROM '1' AND
code_prevu <> 1
GROUP BY 1,2,3,4,5,6,7,8,9;
-- Cas des seances avec un séjour sur l'année (découpées en mois au GHM Grenoble)
UPDATE w_factures_reference
SET date_debut_facture = p_factures.date_debut, date_fin_facture = p_factures.date_fin
FROM activite.p_factures
JOIN activite.p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
WHERE w_factures_reference.no_facture_reference = p_factures.no_facture AND
w_factures_reference.no_facture_reference LIKE '%BG' AND
p_sejours.type_sejour = '5'
;
-- Cas des séjours SSR avec plusieurs factures de references 'recuperationde la bonne date de debut de facture'
UPDATE w_factures_reference
SET date_debut_facture = p_factures.date_debut, date_fin_facture = p_factures.date_fin
FROM activite.p_factures
JOIN activite.p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
WHERE w_factures_reference.no_facture_reference = p_factures.no_facture
AND type_t2a = '2' ;
-- comptage des rubriques dans les lignes clinique avant généaration des lignes cliniques 0ETS
WITH w_fac AS
(
SELECT
p_factures.no_sejour,
COUNT(DISTINCT p_factures_lignes_c.rubrique_facturation_id) as nb_rubriques_c
FROM
activite.p_factures
JOIN activite.p_factures_lignes_c ON p_factures_lignes_c.no_facture = p_factures.no_facture
GROUP BY 1
)
UPDATE w_factures_reference SET
nb_rubriques_c = w_fac.nb_rubriques_c
FROM
w_fac
WHERE
w_fac.no_sejour = w_factures_reference.no_sejour;
-- idem avec les lignes honoraires
WITH w_fac AS
(
SELECT
p_factures.no_sejour,
COUNT(DISTINCT p_factures_lignes_h.rubrique_facturation_id) as nb_rubriques_h
FROM
activite.p_factures
JOIN activite.p_factures_lignes_h ON p_factures_lignes_h.no_facture = p_factures.no_facture
GROUP BY 1
)
UPDATE w_factures_reference SET
nb_rubriques_h = w_fac.nb_rubriques_h
FROM
w_fac
WHERE
w_fac.no_sejour = w_factures_reference.no_sejour;
-- Mise à jour des dates
UPDATE w_factures_reference
SET date_facture = date_fin_facture
WHERE date_facture < date_fin_facture;
UPDATE w_factures_reference
SET date_groupage = date_facture
WHERE date_groupage < date_sortie AND
date_groupage <> '20991231' AND
code_sorti = '1' AND
ghs_id <> 0;
UPDATE w_factures_reference
SET date_groupage = date_facture
WHERE date_groupage > date_facture AND
date_groupage <> '20991231' AND
ghs_id <> 0;
UPDATE w_factures_reference
SET date_facture = '20991231'
WHERE nb_non_calcules = 1 AND date_facture <> '20991231';
UPDATE w_factures_reference SET
date_expedition = CASE WHEN date_expedition < '15000101' THEN '20991231' ELSE date_expedition END,
date_expedition_0 = CASE WHEN date_expedition_0 < '15000101' THEN '20991231' ELSE date_expedition_0 END,
date_expedition_1 = CASE WHEN date_expedition_1 < '15000101' THEN '20991231' ELSE date_expedition_1 END,
date_expedition_2 = CASE WHEN date_expedition_2 < '15000101' THEN '20991231' ELSE date_expedition_2 END,
date_solde = CASE WHEN date_solde < '15000101' THEN '20991231' ELSE date_solde END,
date_solde_c = CASE WHEN date_solde_c < '15000101' THEN '20991231' ELSE date_solde_c END,
date_solde_0_c = CASE WHEN date_solde_0_c < '15000101' THEN '20991231' ELSE date_solde_0_c END,
date_solde_1_c = CASE WHEN date_solde_1_c < '15000101' THEN '20991231' ELSE date_solde_1_c END,
date_solde_2_c = CASE WHEN date_solde_2_c < '15000101' THEN '20991231' ELSE date_solde_2_c END,
date_solde_h = CASE WHEN date_solde_h < '15000101' THEN '20991231' ELSE date_solde_h END,
date_solde_0_h = CASE WHEN date_solde_0_h < '15000101' THEN '20991231' ELSE date_solde_0_h END,
date_solde_1_h = CASE WHEN date_solde_1_h < '15000101' THEN '20991231' ELSE date_solde_1_h END,
date_solde_2_h = CASE WHEN date_solde_2_h < '15000101' THEN '20991231' ELSE date_solde_2_h END
WHERE (
date_expedition < '15000101' OR
date_expedition_0 < '15000101' OR
date_expedition_1 < '15000101' OR
date_expedition_2 < '15000101' OR
date_solde < '15000101' OR
date_solde_c < '15000101' OR
date_solde_0_c < '15000101' OR
date_solde_1_c < '15000101' OR
date_solde_2_c < '15000101' OR
date_solde_h < '15000101' OR
date_solde_0_h < '15000101' OR
date_solde_1_h < '15000101' OR
date_solde_2_h < '15000101'
);
UPDATE w_factures_reference SET
date_expedition = CASE WHEN date_expedition < date_facture THEN date_facture ELSE date_expedition END,
date_expedition_0 = CASE WHEN date_expedition_0 < date_facture AND code_expedie_0 = '1' THEN date_facture ELSE date_expedition_0 END,
date_expedition_1 = CASE WHEN date_expedition_1 < date_facture AND code_expedie_1 = '1' THEN date_facture ELSE date_expedition_1 END,
date_expedition_2 = CASE WHEN date_expedition_2 < date_facture AND code_expedie_2 = '1' THEN date_facture ELSE date_expedition_2 END
WHERE date_expedition < date_facture OR
date_expedition_0 < date_facture AND code_expedie_0 = '1' OR
date_expedition_1 < date_facture AND code_expedie_1 = '1' OR
date_expedition_2 < date_facture AND code_expedie_2 = '1' ;
-- Ajustement dates de solde
DROP TABLE IF EXISTS w_correction_date_c;
CREATE TEMP TABLE w_correction_date_c AS
SELECT p_factures.no_facture_reference, p_factures.no_sejour,
MAX(p_factures_reference.date_solde_0_c) AS date_solde_0_c_old,
MAX(p_factures_reference.date_solde_1_c) AS date_solde_1_c_old,
MAX(p_factures_reference.date_solde_2_c) AS date_solde_2_c_old,
MAX(CASE
WHEN p_factures_reference.montant_comptabilise_0_c = 0 THEN '00010101'
WHEN p_factures_reference.montant_comptabilise_0_c = p_factures_reference.montant_regle_0_c AND
p_factures_reference.date_solde_0_c = '20991231' AND
p_factures_reference.montant_comptabilise_0_c <> 0 AND
p_factures_soldes_c.montant_regle_0 <> 0
THEN date_comptable
ELSE NULL END) AS date_solde_0_c_new,
MAX(CASE
WHEN p_factures_reference.montant_comptabilise_1_c = 0 THEN '00010101'
WHEN p_factures_reference.montant_comptabilise_1_c = p_factures_reference.montant_regle_1_c AND
p_factures_reference.date_solde_1_c = '20991231' AND
p_factures_reference.montant_comptabilise_1_c <> 0 AND
p_factures_reference.date_solde_1_c = '20991231' AND
p_factures_soldes_c.montant_regle_1 <> 0
THEN date_comptable
ELSE NULL END) AS date_solde_1_c_new,
MAX(CASE
WHEN p_factures_reference.montant_comptabilise_2_c = 0 THEN '00010101'
WHEN p_factures_reference.montant_comptabilise_2_c = p_factures_reference.montant_regle_2_c AND
p_factures_reference.date_solde_2_c = '20991231' AND
p_factures_reference.montant_comptabilise_2_c <> 0 AND
p_factures_reference.date_solde_2_c = '20991231' AND
p_factures_soldes_c.montant_regle_2 <> 0
THEN date_comptable
ELSE NULL END) AS date_solde_2_c_new
FROM activite.p_factures
JOIN w_factures_reference p_factures_reference ON p_factures.no_facture_reference = p_factures_reference.no_facture_reference
LEFT JOIN activite.p_factures_soldes_c ON p_factures.no_facture = p_factures_soldes_c.no_facture AND p_factures_soldes_c.montant_regle <> 0
GROUP BY 1,2
;
UPDATE w_factures_reference p_factures_reference SET
date_solde_c =
CASE WHEN GREATEST(COALESCE(date_solde_0_c_new,date_solde_0_c),COALESCE(date_solde_1_c_new,date_solde_1_c),COALESCE(date_solde_2_c_new,date_solde_2_c)) <> '00010101'
THEN GREATEST(COALESCE(date_solde_0_c_new,date_solde_0_c),COALESCE(date_solde_1_c_new,date_solde_1_c),COALESCE(date_solde_2_c_new,date_solde_2_c))
ELSE '20991231' END,
date_solde_0_c = CASE WHEN COALESCE(date_solde_0_c_new,date_solde_0_c) <> '00010101' THEN COALESCE(date_solde_0_c_new,date_solde_0_c) ELSE '20991231' END,
date_solde_1_c = CASE WHEN COALESCE(date_solde_1_c_new,date_solde_1_c) <> '00010101' THEN COALESCE(date_solde_1_c_new,date_solde_1_c) ELSE '20991231' END,
date_solde_2_c = CASE WHEN COALESCE(date_solde_2_c_new,date_solde_2_c) <> '00010101' THEN COALESCE(date_solde_2_c_new,date_solde_2_c) ELSE '20991231' END
FROM w_correction_date_c
WHERE p_factures_reference.no_facture_reference = w_correction_date_c.no_facture_reference AND
(
date_solde_c <> CASE WHEN GREATEST(COALESCE(date_solde_0_c_new,date_solde_0_c),COALESCE(date_solde_1_c_new,date_solde_1_c),COALESCE(date_solde_2_c_new,date_solde_2_c)) <> '00010101'
THEN GREATEST(COALESCE(date_solde_0_c_new,date_solde_0_c),COALESCE(date_solde_1_c_new,date_solde_1_c),COALESCE(date_solde_2_c_new,date_solde_2_c))
ELSE '20991231' END OR
date_solde_0_c <> CASE WHEN COALESCE(date_solde_0_c_new,date_solde_0_c) <> '00010101' THEN COALESCE(date_solde_0_c_new,date_solde_0_c) ELSE '20991231' END OR
date_solde_1_c <> CASE WHEN COALESCE(date_solde_1_c_new,date_solde_1_c) <> '00010101' THEN COALESCE(date_solde_1_c_new,date_solde_1_c) ELSE '20991231' END OR
date_solde_2_c <> CASE WHEN COALESCE(date_solde_2_c_new,date_solde_2_c) <> '00010101' THEN COALESCE(date_solde_2_c_new,date_solde_2_c) ELSE '20991231' END
)
;
-- Ajustement dates de solde
DROP TABLE IF EXISTS w_correction_date_h;
CREATE TEMP TABLE w_correction_date_h AS
SELECT p_factures.no_facture_reference, p_factures.no_sejour,
MAX(p_factures_reference.date_solde_0_h) AS date_solde_0_h_old,
MAX(p_factures_reference.date_solde_1_h) AS date_solde_1_h_old,
MAX(p_factures_reference.date_solde_2_h) AS date_solde_2_h_old,
MAX(CASE
WHEN p_factures_reference.montant_comptabilise_0_h = 0 THEN '00010101'
WHEN p_factures_reference.montant_comptabilise_0_h = p_factures_reference.montant_regle_0_h AND
p_factures_reference.date_solde_0_h = '20991231' AND
p_factures_reference.montant_comptabilise_0_h <> 0 AND
p_factures_soldes_h.montant_regle_0 <> 0
THEN date_comptable
ELSE NULL END) AS date_solde_0_h_new,
MAX(CASE
WHEN p_factures_reference.montant_comptabilise_1_h = 0 THEN '00010101'
WHEN p_factures_reference.montant_comptabilise_1_h = p_factures_reference.montant_regle_1_h AND
p_factures_reference.date_solde_1_h = '20991231' AND
p_factures_reference.montant_comptabilise_1_h <> 0 AND
p_factures_reference.date_solde_1_h = '20991231' AND
p_factures_soldes_h.montant_regle_1 <> 0
THEN date_comptable
ELSE NULL END) AS date_solde_1_h_new,
MAX(CASE
WHEN p_factures_reference.montant_comptabilise_2_h = 0 THEN '00010101'
WHEN p_factures_reference.montant_comptabilise_2_h = p_factures_reference.montant_regle_2_h AND
p_factures_reference.date_solde_2_h = '20991231' AND
p_factures_reference.montant_comptabilise_2_h <> 0 AND
p_factures_reference.date_solde_2_h = '20991231' AND
p_factures_soldes_h.montant_regle_2 <> 0
THEN date_comptable
ELSE NULL END) AS date_solde_2_h_new
FROM activite.p_factures
JOIN w_factures_reference p_factures_reference ON p_factures.no_facture_reference = p_factures_reference.no_facture_reference
LEFT JOIN activite.p_factures_soldes_h ON p_factures.no_facture = p_factures_soldes_h.no_facture AND p_factures_soldes_h.montant_regle <> 0
GROUP BY 1,2
;
UPDATE w_factures_reference p_factures_reference SET
date_solde_h =
CASE WHEN GREATEST(COALESCE(date_solde_0_h_new,date_solde_0_h),COALESCE(date_solde_1_h_new,date_solde_1_h),COALESCE(date_solde_2_h_new,date_solde_2_h)) <> '00010101'
THEN GREATEST(COALESCE(date_solde_0_h_new,date_solde_0_h),COALESCE(date_solde_1_h_new,date_solde_1_h),COALESCE(date_solde_2_h_new,date_solde_2_h))
ELSE '20991231' END,
date_solde_0_h = CASE WHEN COALESCE(date_solde_0_h_new,date_solde_0_h) <> '00010101' THEN COALESCE(date_solde_0_h_new,date_solde_0_h) ELSE '20991231' END,
date_solde_1_h = CASE WHEN COALESCE(date_solde_1_h_new,date_solde_1_h) <> '00010101' THEN COALESCE(date_solde_1_h_new,date_solde_1_h) ELSE '20991231' END,
date_solde_2_h = CASE WHEN COALESCE(date_solde_2_h_new,date_solde_2_h) <> '00010101' THEN COALESCE(date_solde_2_h_new,date_solde_2_h) ELSE '20991231' END
FROM w_correction_date_h
WHERE p_factures_reference.no_facture_reference = w_correction_date_h.no_facture_reference AND
(
date_solde_h <> CASE WHEN GREATEST(COALESCE(date_solde_0_h_new,date_solde_0_h),COALESCE(date_solde_1_h_new,date_solde_1_h),COALESCE(date_solde_2_h_new,date_solde_2_h)) <> '00010101'
THEN GREATEST(COALESCE(date_solde_0_h_new,date_solde_0_h),COALESCE(date_solde_1_h_new,date_solde_1_h),COALESCE(date_solde_2_h_new,date_solde_2_h))
ELSE '20991231' END OR
date_solde_0_h <> CASE WHEN COALESCE(date_solde_0_h_new,date_solde_0_h) <> '00010101' THEN COALESCE(date_solde_0_h_new,date_solde_0_h) ELSE '20991231' END OR
date_solde_1_h <> CASE WHEN COALESCE(date_solde_1_h_new,date_solde_1_h) <> '00010101' THEN COALESCE(date_solde_1_h_new,date_solde_1_h) ELSE '20991231' END OR
date_solde_2_h <> CASE WHEN COALESCE(date_solde_2_h_new,date_solde_2_h) <> '00010101' THEN COALESCE(date_solde_2_h_new,date_solde_2_h) ELSE '20991231' END
)
;
UPDATE w_factures_reference SET
date_solde_0 = COALESCE(GREATEST(CASE WHEN montant_facture_0_c <> 0 THEN date_solde_0_c ELSE NULL END,CASE WHEN montant_facture_0_h <> 0 THEN date_solde_0_h ELSE NULL END),'20991231'),
date_solde_1 = COALESCE(GREATEST(CASE WHEN montant_facture_1_c <> 0 THEN date_solde_1_c ELSE NULL END,CASE WHEN montant_facture_1_h <> 0 THEN date_solde_1_h ELSE NULL END),'20991231'),
date_solde_2 = COALESCE(GREATEST(CASE WHEN montant_facture_2_c <> 0 THEN date_solde_2_c ELSE NULL END,CASE WHEN montant_facture_2_h <> 0 THEN date_solde_2_h ELSE NULL END),'20991231');
UPDATE w_factures_reference SET
nb_groupe = CASE WHEN type_t2a = '1' AND type_sejour IN ('1','2','5') AND ghs_id > 0 THEN 1 ELSE 0 END,
nb_non_groupe = CASE WHEN type_t2a = '1' AND ghs_id = 0 AND nb_non_calcules = 1 THEN 1 ELSE 0 END,
nb_calculable = CASE WHEN type_t2a = '1' AND ghs_id > 0 AND nb_non_calcules = 1 THEN 1
WHEN type_t2a <> '1' AND nb_non_calcules = 1 THEN 1
ELSE 0 END,
nb_non_expedie = CASE WHEN montant_comptabilise_0 > montant_regle_0 AND code_expedie_0 <> '1' THEN 1
WHEN montant_comptabilise_1 > montant_regle_1 AND code_expedie_1 <> '1' THEN 1
WHEN montant_comptabilise_2 > montant_regle_2 AND code_expedie_2 <> '1' THEN 1
ELSE 0 END,
nb_non_expedie_c = CASE WHEN montant_comptabilise_0_c > montant_regle_0_c AND code_expedie_0 <> '1' THEN 1
WHEN montant_comptabilise_1_c > montant_regle_1_c AND code_expedie_1 <> '1' THEN 1
WHEN montant_comptabilise_2_c > montant_regle_2_c AND code_expedie_2 <> '1' THEN 1
ELSE 0 END,
nb_non_expedie_h = CASE WHEN montant_comptabilise_0_h > montant_regle_0_h AND code_expedie_0 <> '1' THEN 1
WHEN montant_comptabilise_1_h > montant_regle_1_h AND code_expedie_1 <> '1' THEN 1
WHEN montant_comptabilise_2_h > montant_regle_2_h AND code_expedie_2 <> '1' THEN 1
ELSE 0 END,
nb_non_expedie_0 = CASE WHEN montant_comptabilise_0 > montant_regle_0 AND code_expedie_0 <> '1' THEN 1
ELSE 0 END,
nb_non_expedie_0_c = CASE WHEN montant_comptabilise_0_c > montant_regle_0_c AND code_expedie_0 <> '1' THEN 1
ELSE 0 END,
nb_non_expedie_0_h = CASE WHEN montant_comptabilise_0_h > montant_regle_0_h AND code_expedie_0 <> '1' THEN 1
ELSE 0 END,
nb_non_expedie_1 = CASE WHEN montant_comptabilise_1 > montant_regle_1 AND code_expedie_1 <> '1' THEN 1
ELSE 0 END,
nb_non_expedie_1_c = CASE WHEN montant_comptabilise_1_c > montant_regle_1_c AND code_expedie_1 <> '1' THEN 1
ELSE 0 END,
nb_non_expedie_1_h = CASE WHEN montant_comptabilise_1_h > montant_regle_1_h AND code_expedie_1 <> '1' THEN 1
ELSE 0 END,
nb_non_expedie_2 = CASE WHEN montant_comptabilise_2 > montant_regle_2 AND code_expedie_2 <> '1' THEN 1
ELSE 0 END,
nb_non_expedie_2_c = CASE WHEN montant_comptabilise_2_c > montant_regle_2_c AND code_expedie_2 <> '1' THEN 1
ELSE 0 END,
nb_non_expedie_2_h = CASE WHEN montant_comptabilise_2_h > montant_regle_2_h AND code_expedie_2 <> '1' THEN 1
ELSE 0 END
;
UPDATE w_factures_reference SET
delai_groupage = CASE
WHEN type_t2a = '1' AND ghs_id > 0 AND date_groupage <> '2099-12-31' AND code_sorti = '1' THEN date_groupage - date_sortie
ELSE NULL END,
delai_facture = CASE
WHEN date_facture <> '2099-12-31' THEN date_facture - date_fin_facture
ELSE NULL END,
delai_expedition = CASE
WHEN montant_facture_c + montant_facture_c <> 0 AND date_expedition <> '2099-12-31' THEN date_expedition - date_fin_facture
ELSE NULL END,
delai_expedition_0 = CASE
WHEN montant_facture_0_c + montant_facture_0_h <> 0 AND date_expedition_0 <> '2099-12-31'THEN date_expedition_0 - date_fin_facture
ELSE NULL END,
delai_expedition_1 = CASE
WHEN montant_facture_1_c + montant_facture_1_h <> 0 AND date_expedition_1 <> '2099-12-31'THEN date_expedition_1 - date_fin_facture
ELSE NULL END,
delai_expedition_2 = CASE
WHEN montant_facture_2_c + montant_facture_2_h <> 0 AND date_expedition_2 <> '2099-12-31'THEN date_expedition_2 - date_fin_facture
ELSE NULL END,
delai_solde = CASE
WHEN montant_comptabilise_c + montant_comptabilise_h <> 0 AND date_solde <> '2099-12-31' THEN date_solde - date_fin_facture
ELSE NULL END,
delai_solde_c = CASE
WHEN montant_comptabilise_c <> 0 AND date_solde_c <> '2099-12-31' THEN date_solde_c - date_fin_facture
ELSE NULL END,
delai_solde_h = CASE
WHEN montant_comptabilise_h <> 0 AND date_solde_h <> '2099-12-31' THEN date_solde_h - date_fin_facture
ELSE NULL END,
delai_solde_0 = CASE
WHEN montant_comptabilise_0 <> 0 AND date_solde_0 <> '2099-12-31' THEN date_solde_0 - date_fin_facture
ELSE NULL END,
delai_solde_0_c = CASE
WHEN montant_comptabilise_0_c <> 0 AND date_solde_0_c <> '2099-12-31' THEN date_solde_0_c - date_fin_facture
ELSE NULL END,
delai_solde_0_h = CASE
WHEN montant_comptabilise_0_h <> 0 AND date_solde_0_h <> '2099-12-31' THEN date_solde_0_h - date_fin_facture
ELSE NULL END,
delai_solde_1 = CASE
WHEN montant_comptabilise_1 <> 0 AND date_solde_1 <> '2099-12-31' THEN date_solde_1 - date_fin_facture
ELSE NULL END,
delai_solde_1_c = CASE
WHEN montant_comptabilise_1_c <> 0 AND date_solde_1_c <> '2099-12-31' THEN date_solde_1_c - date_fin_facture
ELSE NULL END,
delai_solde_1_h = CASE
WHEN montant_comptabilise_1_h <> 0 AND date_solde_1_h <> '2099-12-31' THEN date_solde_1_h - date_fin_facture
ELSE NULL END,
delai_solde_2 = CASE
WHEN montant_comptabilise_2 <> 0 AND date_solde_2 <> '2099-12-31' THEN date_solde_2 - date_fin_facture
ELSE NULL END,
delai_solde_2_c = CASE
WHEN montant_comptabilise_2_c <> 0 AND date_solde_2_c <> '2099-12-31' THEN date_solde_2_c - date_fin_facture
ELSE NULL END,
delai_solde_2_h = CASE
WHEN montant_comptabilise_2_h <> 0 AND date_solde_2_h <> '2099-12-31' THEN date_solde_2_h - date_fin_facture
ELSE NULL END,
nb_non_solde = CASE
WHEN code_facture <> '1'::bpchar THEN 0
WHEN montant_comptabilise_0_c <> montant_regle_0_c THEN 1
WHEN montant_comptabilise_0_h <> montant_regle_0_h THEN 1
WHEN montant_comptabilise_1_c <> montant_regle_1_c THEN 1
WHEN montant_comptabilise_1_h <> montant_regle_1_h THEN 1
WHEN montant_comptabilise_2_c <> montant_regle_2_c THEN 1
WHEN montant_comptabilise_2_h <> montant_regle_2_h THEN 1
ELSE 0
END,
nb_non_solde_c = CASE
WHEN code_facture <> '1'::bpchar THEN 0
WHEN montant_comptabilise_0_c <> montant_regle_0_c THEN 1
WHEN montant_comptabilise_1_c <> montant_regle_1_c THEN 1
WHEN montant_comptabilise_2_c <> montant_regle_2_c THEN 1
ELSE 0
END,
nb_non_solde_h = CASE
WHEN code_facture <> '1'::bpchar THEN 0
WHEN montant_comptabilise_0_h <> montant_regle_0_h THEN 1
WHEN montant_comptabilise_1_h <> montant_regle_1_h THEN 1
WHEN montant_comptabilise_2_h <> montant_regle_2_h THEN 1
ELSE 0
END,
nb_non_solde_0 = CASE
WHEN code_facture <> '1'::bpchar THEN 0
WHEN montant_comptabilise_0_c <> montant_regle_0_c THEN 1
WHEN montant_comptabilise_0_h <> montant_regle_0_h THEN 1
ELSE 0
END,
nb_non_solde_0_c = CASE
WHEN code_facture <> '1'::bpchar THEN 0
WHEN montant_comptabilise_0_c <> montant_regle_0_c THEN 1
ELSE 0
END,
nb_non_solde_0_h = CASE
WHEN code_facture <> '1'::bpchar THEN 0
WHEN montant_comptabilise_0_h <> montant_regle_0_h THEN 1
ELSE 0
END,
nb_non_solde_1 = CASE
WHEN code_facture <> '1'::bpchar THEN 0
WHEN montant_comptabilise_1_c <> montant_regle_1_c THEN 1
WHEN montant_comptabilise_1_h <> montant_regle_1_h THEN 1
ELSE 0
END,
nb_non_solde_1_c = CASE
WHEN code_facture <> '1'::bpchar THEN 0
WHEN montant_comptabilise_1_c <> montant_regle_1_c THEN 1
ELSE 0
END,
nb_non_solde_1_h = CASE
WHEN code_facture <> '1'::bpchar THEN 0
WHEN montant_comptabilise_1_h <> montant_regle_1_h THEN 1
ELSE 0
END,
nb_non_solde_2 = CASE
WHEN code_facture <> '1'::bpchar THEN 0
WHEN montant_comptabilise_2_c <> montant_regle_2_c THEN 1
WHEN montant_comptabilise_2_h <> montant_regle_2_h THEN 1
ELSE 0
END,
nb_non_solde_2_c = CASE
WHEN code_facture <> '1'::bpchar THEN 0
WHEN montant_comptabilise_2_c <> montant_regle_2_c THEN 1
ELSE 0
END,
nb_non_solde_2_h = CASE
WHEN code_facture <> '1'::bpchar THEN 0
WHEN montant_comptabilise_2_h <> montant_regle_2_h THEN 1
ELSE 0
END;
-- Retard de groupage et de facturation
-- Période en semaine pleine pour calcul coefficients
DROP TABLE IF EXISTS w_periode;
CREATE TABLE w_periode AS
SELECT
MAX(CASE WHEN jour_semaine = 1 AND date <= date(t_divers.valeur_date - interval '1 year') THEN date ELSE NULL END) AS date_debut_periode,
MAX(CASE WHEN jour_semaine = 7 AND date <= t_divers.valeur_date THEN date ELSE NULL END) AS date_fin_periode,
(MAX(CASE WHEN jour_semaine = 7 AND date <= t_divers.valeur_date THEN date ELSE NULL END) -
MAX(CASE WHEN jour_semaine = 1 AND date <= date(t_divers.valeur_date - interval '1 year') THEN date ELSE NULL END)
+ 1) AS duree_periode
FROM base.p_calendrier
JOIN activite.t_divers ON t_divers.code = 'NOW' AND p_calendrier.date <= t_divers.valeur_date;
-- Calcul durée groupage par dossier (coeff journalier)
DROP TABLE IF EXISTS w_retard_groupage_coefficient;
CREATE TEMP TABLE w_retard_groupage_coefficient AS
SELECT
MAX(date_debut_periode) AS date_debut_periode,
MAX(duree_periode) AS duree_periode,
SUM(CASE WHEN type_sejour NOT IN ('2','5') THEN v_factures_reference_1.nb_groupe ELSE 0 END) AS nb_groupe_h,
SUM(CASE WHEN type_sejour NOT IN ('2','5') THEN v_factures_reference_1.delai_groupage ELSE 0 END) AS delai_groupe_h,
SUM(CASE WHEN type_sejour IN ('2','5') THEN v_factures_reference_1.nb_groupe ELSE 0 END) AS nb_groupe_a,
SUM(CASE WHEN type_sejour IN ('2','5') THEN v_factures_reference_1.delai_groupage ELSE 0 END) AS delai_groupe_a,
0::numeric AS coefficient_groupage_h,
0::numeric AS coefficient_groupage_a
FROM w_factures_reference v_factures_reference_1
JOIN w_periode ON
(
v_factures_reference_1.date_groupage BETWEEN w_periode.date_debut_periode AND w_periode.date_fin_periode
)
WHERE nb_groupe = 1;
UPDATE w_retard_groupage_coefficient SET
coefficient_groupage_h = base.cti_division(base.cti_division(duree_periode, nb_groupe_h + nb_groupe_a) * base.cti_division(delai_groupe_h, nb_groupe_h)
, base.cti_division(delai_groupe_a + delai_groupe_h, nb_groupe_a + nb_groupe_h)),
coefficient_groupage_a = base.cti_division(base.cti_division(duree_periode, nb_groupe_h + nb_groupe_a) * base.cti_division(delai_groupe_a, nb_groupe_a)
, base.cti_division(delai_groupe_a + delai_groupe_h, nb_groupe_a + nb_groupe_h))
;
-- Code sortie uniquement sur dernière facture si facturations intermédiaires
UPDATE w_factures_reference p_factures_reference
SET code_sorti = '0'
FROM activite.p_sejours
JOIN (SELECT no_sejour, (MAX(Array[date_fin_facture::text,no_facture_reference]))[2] AS no_facture_last FROM activite.p_factures_reference WHERE code_sorti = '1' GROUP BY 1 HAVING count(*) > 1) subview ON p_sejours.no_sejour = subview.no_sejour
WHERE p_factures_reference.no_sejour = p_sejours.no_sejour AND
p_factures_reference.code_sorti = '1' AND
p_sejours.type_sejour <> '3' AND
p_factures_reference.no_facture_reference <> no_facture_last
;
-- Mise à jour dans table
UPDATE w_factures_reference
SET retard_groupage =
CASE WHEN type_sejour NOT IN ('2','5') THEN coefficient_groupage_h ELSE coefficient_groupage_a END
FROM w_retard_groupage_coefficient
WHERE nb_non_groupe = 1 AND date_sortie >= date_debut_periode;
-- Calcul durée facturation par dossier (coeff journalier)
DROP TABLE IF EXISTS w_retard_facture_coefficient;
CREATE TEMP TABLE w_retard_facture_coefficient AS
SELECT
MAX(date_debut_periode) AS date_debut_periode,
MAX(duree_periode) AS duree_periode,
SUM(CASE WHEN type_sejour NOT IN ('2','3','5') THEN 1 ELSE 0 END) AS nb_facture_h,
SUM(CASE WHEN type_sejour NOT IN ('2','3','5') THEN v_factures_reference_1.delai_facture ELSE 0 END) AS delai_facture_h,
SUM(CASE WHEN type_sejour IN ('2','5') THEN 1 ELSE 0 END) AS nb_facture_a,
SUM(CASE WHEN type_sejour IN ('2','5') THEN v_factures_reference_1.delai_facture ELSE 0 END) AS delai_facture_a,
SUM(CASE WHEN type_sejour IN ('3') THEN 1 ELSE 0 END) AS nb_facture_x,
SUM(CASE WHEN type_sejour IN ('3') THEN v_factures_reference_1.delai_facture ELSE 0 END) AS delai_facture_x,
0::numeric AS coefficient_facture_h,
0::numeric AS coefficient_facture_a,
0::numeric AS coefficient_facture_x
FROM w_factures_reference v_factures_reference_1
JOIN w_periode ON
(
v_factures_reference_1.date_facture BETWEEN w_periode.date_debut_periode AND w_periode.date_fin_periode
)
WHERE v_factures_reference_1.nb_non_calcules = 0;
UPDATE w_retard_facture_coefficient SET
coefficient_facture_h = base.cti_division(base.cti_division(duree_periode, nb_facture_h + nb_facture_a + nb_facture_x) * base.cti_division(delai_facture_h, nb_facture_h)
, base.cti_division(delai_facture_a + delai_facture_h + delai_facture_x, nb_facture_a + nb_facture_h + nb_facture_x)),
coefficient_facture_a = base.cti_division(base.cti_division(duree_periode, nb_facture_h + nb_facture_a + nb_facture_x) * base.cti_division(delai_facture_a, nb_facture_a)
, base.cti_division(delai_facture_a + delai_facture_h + delai_facture_x, nb_facture_a + nb_facture_h + nb_facture_x)),
coefficient_facture_x = base.cti_division(duree_periode, nb_facture_h + nb_facture_a + nb_facture_x) *
base.cti_division(base.cti_division(delai_facture_x, nb_facture_x), base.cti_division(delai_facture_a + delai_facture_h + delai_facture_x, nb_facture_a + nb_facture_h + nb_facture_x))
;
-- Mise à jour dans table
UPDATE w_factures_reference
SET retard_facture =
CASE WHEN type_sejour IN ('2','5') THEN coefficient_facture_a WHEN type_sejour IN ('3') THEN coefficient_facture_x ELSE coefficient_facture_h END
FROM w_retard_facture_coefficient
WHERE nb_non_calcules = 1 AND date_sortie >= date_debut_periode;
-- Validation données
SELECT base.cti_disable_index('activite', 'i_factures_reference_1');
SELECT base.cti_disable_index('activite', 'i_factures_reference_2');
SELECT base.cti_disable_index('activite', 'i_factures_reference_3');
SELECT base.cti_disable_index('activite', 'i_factures_reference_4');
TRUNCATE activite.p_factures_reference;
INSERT INTO activite.p_factures_reference (
sejour_id,
no_sejour,
date_entree,
date_sortie,
code_sorti,
facture_reference_id,
no_facture_reference,
type_t2a,
date_debut_facture,
date_fin_facture,
type_facture,
date_groupage,
retard_groupage,
delai_groupage,
nb_groupe,
nb_non_groupe,
nb_calculable,
ghs_id,
ghs_bebe1_id,
ghs_bebe2_id,
ghs_bebe3_id,
gmt_id,
tiers_payant_0_id,
tiers_payant_1_id,
tiers_payant_2_id,
tiers_payant_22_id,
code_facture,
date_facture,
retard_facture,
delai_facture,
code_vente,
date_vente,
nb_factures,
nb_non_calcules,
nb_non_calcules_horsbg,
nb_non_calcules_bg,
nb_factures_regularisation,
nb_rejets,
code_expedie_0,
code_expedie_1,
code_expedie_2,
date_expedition,
date_expedition_0,
date_expedition_1,
date_expedition_2,
no_bordereau_0,
no_bordereau_1,
no_bordereau_2,
delai_expedition,
delai_expedition_0,
delai_expedition_1,
delai_expedition_2,
nb_non_expedie,
nb_non_expedie_c,
nb_non_expedie_h,
nb_non_expedie_0,
nb_non_expedie_0_c,
nb_non_expedie_0_h,
nb_non_expedie_1,
nb_non_expedie_1_c,
nb_non_expedie_1_h,
nb_non_expedie_2,
nb_non_expedie_2_c,
nb_non_expedie_2_h,
montant_facture,
montant_facture_c,
montant_facture_h,
montant_facture_0,
montant_facture_0_c,
montant_facture_0_h,
montant_facture_1,
montant_facture_1_c,
montant_facture_1_h,
montant_facture_2,
montant_facture_2_c,
montant_facture_2_h,
montant_facture_c_actes_inclus_dans_sejour,
montant_facture_h_actes_inclus_dans_sejour,
montant_encours,
montant_encours_c,
montant_encours_h,
montant_encours_0,
montant_encours_0_c,
montant_encours_0_h,
montant_encours_1,
montant_encours_1_c,
montant_encours_1_h,
montant_encours_2,
montant_encours_2_c,
montant_encours_2_h,
montant_comptabilise,
montant_comptabilise_c,
montant_comptabilise_h,
montant_comptabilise_0,
montant_comptabilise_0_c,
montant_comptabilise_0_h,
montant_comptabilise_1,
montant_comptabilise_1_c,
montant_comptabilise_1_h,
montant_comptabilise_2,
montant_comptabilise_2_c,
montant_comptabilise_2_h,
montant_comptabilise_budget_global_c,
montant_regle,
montant_regle_c,
montant_regle_h,
montant_regle_0,
montant_regle_0_c,
montant_regle_0_h,
montant_regle_1,
montant_regle_1_c,
montant_regle_1_h,
montant_regle_2,
montant_regle_2_c,
montant_regle_2_h,
date_solde,
date_solde_c,
date_solde_h,
date_solde_0,
date_solde_0_c,
date_solde_0_h,
date_solde_1,
date_solde_1_c,
date_solde_1_h,
date_solde_2,
date_solde_2_c,
date_solde_2_h,
delai_solde,
delai_solde_c,
delai_solde_h,
delai_solde_0,
delai_solde_0_c,
delai_solde_0_h,
delai_solde_1,
delai_solde_1_c,
delai_solde_1_h,
delai_solde_2,
delai_solde_2_c,
delai_solde_2_h,
nb_non_solde,
nb_non_solde_c,
nb_non_solde_h,
nb_non_solde_0,
nb_non_solde_0_c,
nb_non_solde_0_h,
nb_non_solde_1,
nb_non_solde_1_c,
nb_non_solde_1_h,
nb_non_solde_2,
nb_non_solde_2_c,
nb_non_solde_2_h,
nb_non_cloture,
nb_non_cloture_c,
nb_non_cloture_h,
nb_non_cloture_0,
nb_non_cloture_0_c,
nb_non_cloture_0_h,
nb_non_cloture_1,
nb_non_cloture_1_c,
nb_non_cloture_1_h,
nb_non_cloture_2,
nb_non_cloture_2_c,
nb_non_cloture_2_h,
nb_rubriques_c,
nb_rubriques_h
)
SELECT
sejour_id,
no_sejour,
date_entree,
date_sortie,
code_sorti,
facture_reference_id,
no_facture_reference,
type_t2a,
date_debut_facture,
date_fin_facture,
type_facture,
date_groupage,
retard_groupage,
delai_groupage,
nb_groupe,
nb_non_groupe,
nb_calculable,
ghs_id,
ghs_bebe1_id,
ghs_bebe2_id,
ghs_bebe3_id,
gmt_id,
tiers_payant_0_id,
tiers_payant_1_id,
tiers_payant_2_id,
tiers_payant_22_id,
code_facture,
date_facture,
retard_facture,
delai_facture,
code_vente,
date_vente,
nb_factures,
nb_non_calcules,
nb_non_calcules_horsbg,
nb_non_calcules_bg,
nb_factures_regularisation,
nb_rejets,
code_expedie_0,
code_expedie_1,
code_expedie_2,
date_expedition,
date_expedition_0,
date_expedition_1,
date_expedition_2,
no_bordereau_0,
no_bordereau_1,
no_bordereau_2,
delai_expedition,
delai_expedition_0,
delai_expedition_1,
delai_expedition_2,
nb_non_expedie,
nb_non_expedie_c,
nb_non_expedie_h,
nb_non_expedie_0,
nb_non_expedie_0_c,
nb_non_expedie_0_h,
nb_non_expedie_1,
nb_non_expedie_1_c,
nb_non_expedie_1_h,
nb_non_expedie_2,
nb_non_expedie_2_c,
nb_non_expedie_2_h,
montant_facture,
montant_facture_c,
montant_facture_h,
montant_facture_0,
montant_facture_0_c,
montant_facture_0_h,
montant_facture_1,
montant_facture_1_c,
montant_facture_1_h,
montant_facture_2,
montant_facture_2_c,
montant_facture_2_h,
montant_facture_c_actes_inclus_dans_sejour,
montant_facture_h_actes_inclus_dans_sejour,
montant_encours,
montant_encours_c,
montant_encours_h,
montant_encours_0,
montant_encours_0_c,
montant_encours_0_h,
montant_encours_1,
montant_encours_1_c,
montant_encours_1_h,
montant_encours_2,
montant_encours_2_c,
montant_encours_2_h,
montant_comptabilise,
montant_comptabilise_c,
montant_comptabilise_h,
montant_comptabilise_0,
montant_comptabilise_0_c,
montant_comptabilise_0_h,
montant_comptabilise_1,
montant_comptabilise_1_c,
montant_comptabilise_1_h,
montant_comptabilise_2,
montant_comptabilise_2_c,
montant_comptabilise_2_h,
montant_comptabilise_budget_global_c,
montant_regle,
montant_regle_c,
montant_regle_h,
montant_regle_0,
montant_regle_0_c,
montant_regle_0_h,
montant_regle_1,
montant_regle_1_c,
montant_regle_1_h,
montant_regle_2,
montant_regle_2_c,
montant_regle_2_h,
date_solde,
date_solde_c,
date_solde_h,
date_solde_0,
date_solde_0_c,
date_solde_0_h,
date_solde_1,
date_solde_1_c,
date_solde_1_h,
date_solde_2,
date_solde_2_c,
date_solde_2_h,
delai_solde,
delai_solde_c,
delai_solde_h,
delai_solde_0,
delai_solde_0_c,
delai_solde_0_h,
delai_solde_1,
delai_solde_1_c,
delai_solde_1_h,
delai_solde_2,
delai_solde_2_c,
delai_solde_2_h,
nb_non_solde,
nb_non_solde_c,
nb_non_solde_h,
nb_non_solde_0,
nb_non_solde_0_c,
nb_non_solde_0_h,
nb_non_solde_1,
nb_non_solde_1_c,
nb_non_solde_1_h,
nb_non_solde_2,
nb_non_solde_2_c,
nb_non_solde_2_h,
nb_non_cloture,
nb_non_cloture_c,
nb_non_cloture_h,
nb_non_cloture_0,
nb_non_cloture_0_c,
nb_non_cloture_0_h,
nb_non_cloture_1,
nb_non_cloture_1_c,
nb_non_cloture_1_h,
nb_non_cloture_2,
nb_non_cloture_2_c,
nb_non_cloture_2_h,
nb_rubriques_c,
nb_rubriques_h
FROM w_factures_reference;
ANALYSE activite.p_factures_reference
;
SELECT base.cti_enable_index('activite', 'i_factures_reference_1');
SELECT base.cti_enable_index('activite', 'i_factures_reference_2');
SELECT base.cti_enable_index('activite', 'i_factures_reference_3');
SELECT base.cti_enable_index('activite', 'i_factures_reference_4');
SELECT base.cti_disable_index('activite', 'i_factures_reference_tiers_1');
SELECT base.cti_disable_index('activite', 'i_factures_reference_tiers_2');
SELECT base.cti_disable_index('activite', 'i_factures_reference_tiers_3');
SELECT base.cti_disable_index('activite', 'i_factures_reference_tiers_4');
TRUNCATE activite.p_factures_reference_tiers;
INSERT INTO activite.p_factures_reference_tiers (
sejour_id,
no_sejour,
date_entree,
date_sortie,
code_sorti,
facture_reference_id,
no_facture_reference,
type_t2a,
date_debut_facture,
date_fin_facture,
type_facture,
date_groupage,
retard_groupage,
delai_groupage,
nb_groupe,
nb_non_groupe,
nb_calculable,
ghs_id,
ghs_bebe1_id,
ghs_bebe2_id,
ghs_bebe3_id,
gmt_id,
tiers_payant_id,
code_facture,
date_facture,
retard_facture,
delai_facture,
code_vente,
date_vente,
nb_factures,
nb_non_calcules,
nb_non_calcules_horsbg,
nb_non_calcules_bg,
nb_factures_regularisation,
nb_rejets,
code_expedie_0,
code_expedie_1,
code_expedie_2,
date_expedition,
date_expedition_0,
date_expedition_1,
date_expedition_2,
no_bordereau_0,
no_bordereau_1,
no_bordereau_2,
delai_expedition,
delai_expedition_0,
delai_expedition_1,
delai_expedition_2,
nb_non_expedie,
nb_non_expedie_c,
nb_non_expedie_h,
nb_non_expedie_0,
nb_non_expedie_0_c,
nb_non_expedie_0_h,
nb_non_expedie_1,
nb_non_expedie_1_c,
nb_non_expedie_1_h,
nb_non_expedie_2,
nb_non_expedie_2_c,
nb_non_expedie_2_h,
montant_facture,
montant_facture_c,
montant_facture_h,
montant_facture_0,
montant_facture_0_c,
montant_facture_0_h,
montant_facture_1,
montant_facture_1_c,
montant_facture_1_h,
montant_facture_2,
montant_facture_2_c,
montant_facture_2_h,
montant_facture_c_actes_inclus_dans_sejour,
montant_facture_h_actes_inclus_dans_sejour,
montant_encours,
montant_encours_c,
montant_encours_h,
montant_encours_0,
montant_encours_0_c,
montant_encours_0_h,
montant_encours_1,
montant_encours_1_c,
montant_encours_1_h,
montant_encours_2,
montant_encours_2_c,
montant_encours_2_h,
montant_comptabilise,
montant_comptabilise_c,
montant_comptabilise_h,
montant_comptabilise_0,
montant_comptabilise_0_c,
montant_comptabilise_0_h,
montant_comptabilise_1,
montant_comptabilise_1_c,
montant_comptabilise_1_h,
montant_comptabilise_2,
montant_comptabilise_2_c,
montant_comptabilise_2_h,
montant_comptabilise_budget_global_c,
montant_regle,
montant_regle_c,
montant_regle_h,
montant_regle_0,
montant_regle_0_c,
montant_regle_0_h,
montant_regle_1,
montant_regle_1_c,
montant_regle_1_h,
montant_regle_2,
montant_regle_2_c,
montant_regle_2_h,
date_solde,
date_solde_c,
date_solde_h,
date_solde_0,
date_solde_0_c,
date_solde_0_h,
date_solde_1,
date_solde_1_c,
date_solde_1_h,
date_solde_2,
date_solde_2_c,
date_solde_2_h,
delai_solde,
delai_solde_c,
delai_solde_h,
delai_solde_0,
delai_solde_0_c,
delai_solde_0_h,
delai_solde_1,
delai_solde_1_c,
delai_solde_1_h,
delai_solde_2,
delai_solde_2_c,
delai_solde_2_h,
nb_non_solde,
nb_non_solde_c,
nb_non_solde_h,
nb_non_solde_0,
nb_non_solde_0_c,
nb_non_solde_0_h,
nb_non_solde_1,
nb_non_solde_1_c,
nb_non_solde_1_h,
nb_non_solde_2,
nb_non_solde_2_c,
nb_non_solde_2_h,
nb_non_cloture,
nb_non_cloture_c,
nb_non_cloture_h,
nb_non_cloture_0,
nb_non_cloture_0_c,
nb_non_cloture_0_h,
nb_non_cloture_1,
nb_non_cloture_1_c,
nb_non_cloture_1_h,
nb_non_cloture_2,
nb_non_cloture_2_c,
nb_non_cloture_2_h
)
SELECT
sejour_id,
no_sejour,
date_entree,
date_sortie,
code_sorti,
facture_reference_id,
no_facture_reference,
type_t2a,
date_debut_facture,
date_fin_facture,
type_facture,
date_groupage,
CASE WHEN tiers_payant_1_id = 0 AND tiers_payant_2_id = 0 THEN retard_groupage ELSE 0 END,
delai_groupage,
nb_groupe,
nb_non_groupe,
nb_calculable,
ghs_id,
ghs_bebe1_id,
ghs_bebe2_id,
ghs_bebe3_id,
gmt_id,
tiers_payant_0_id AS tiers_payant_id,
code_facture,
date_facture,
CASE WHEN tiers_payant_1_id = 0 AND tiers_payant_2_id = 0 THEN retard_facture ELSE 0 END,
delai_facture,
code_vente,
date_vente,
nb_factures,
nb_non_calcules,
nb_non_calcules_horsbg,
nb_non_calcules_bg,
nb_factures_regularisation,
nb_rejets,
code_expedie_0 AS code_expedie_0,
'0' AS code_expedie_1,
'0' AS code_expedie_2,
date_expedition_0 AS date_expedition,
date_expedition_0,
NULL::date AS date_expedition_1,
NULL::date AS date_expedition_2,
no_bordereau_0,
'' AS no_bordereau_1,
'' AS no_bordereau_2,
delai_expedition_0 AS delai_expedition,
delai_expedition_0,
NULL::numeric AS delai_expedition_1,
NULL::numeric AS delai_expedition_2,
nb_non_expedie_0 AS nb_non_expedie,
nb_non_expedie_0_c AS nb_non_expedie_c,
nb_non_expedie_0_h AS nb_non_expedie_h,
nb_non_expedie_0,
nb_non_expedie_0_c,
nb_non_expedie_0_h,
0 AS nb_non_expedie_1,
0 AS nb_non_expedie_1_c,
0 AS nb_non_expedie_1_h,
0 AS nb_non_expedie_2,
0 AS nb_non_expedie_2_c,
0 AS nb_non_expedie_2_h,
montant_facture_0 AS montant_facture,
montant_facture_0_c AS montant_facture_c,
montant_facture_0_h AS montant_facture_h,
montant_facture_0,
montant_facture_0_c,
montant_facture_0_h,
0 AS montant_facture_1,
0 AS montant_facture_1_c,
0 AS montant_facture_1_h,
0 AS montant_facture_2,
0 AS montant_facture_2_c,
0 AS montant_facture_2_h,
0 AS montant_facture_c_actes_inclus_dans_sejour,
0 AS montant_facture_h_actes_inclus_dans_sejour,
montant_encours_0 AS montant_encours,
montant_encours_0_c AS montant_encours_c,
montant_encours_0_h AS montant_encours_h,
montant_encours_0,
montant_encours_0_c,
montant_encours_0_h,
0 AS montant_encours_1,
0 AS montant_encours_1_c,
0 AS montant_encours_1_h,
0 AS montant_encours_2,
0 AS montant_encours_2_c,
0 AS montant_encours_2_h,
montant_comptabilise_0 AS montant_comptabilise,
montant_comptabilise_0_c AS montant_comptabilise_c,
montant_comptabilise_0_h AS montant_comptabilise_h,
montant_comptabilise_0,
montant_comptabilise_0_c,
montant_comptabilise_0_h,
0 AS montant_comptabilise_1,
0 AS montant_comptabilise_1_c,
0 AS montant_comptabilise_1_h,
0 AS montant_comptabilise_2,
0 AS montant_comptabilise_2_c,
0 AS montant_comptabilise_2_h,
0 AS montant_comptabilise_budget_global_c,
montant_regle_0 AS montant_regle,
montant_regle_0_c AS montant_regle_c,
montant_regle_0_h AS montant_regle_h,
montant_regle_0,
montant_regle_0_c,
montant_regle_0_h,
0 AS montant_regle_1,
0 AS montant_regle_1_c,
0 AS montant_regle_1_h,
0 AS montant_regle_2,
0 AS montant_regle_2_c,
0 AS montant_regle_2_h,
date_solde_0 AS date_solde,
date_solde_0_c AS date_solde_c,
date_solde_0_h AS date_solde_h,
date_solde_0,
date_solde_0_c,
date_solde_0_h,
NULL::date AS date_solde_1,
NULL::date AS date_solde_1_c,
NULL::date AS date_solde_1_h,
NULL::date AS date_solde_2,
NULL::date AS date_solde_2_c,
NULL::date AS date_solde_2_h,
delai_solde_0 AS delai_solde,
delai_solde_0_c AS delai_solde_c,
delai_solde_0_h AS delai_solde_h,
delai_solde_0,
delai_solde_0_c,
delai_solde_0_h,
NULL::numeric AS delai_solde_1,
NULL::numeric AS delai_solde_1_c,
NULL::numeric AS delai_solde_1_h,
NULL::numeric AS delai_solde_2,
NULL::numeric AS delai_solde_2_c,
NULL::numeric AS delai_solde_2_h,
nb_non_solde_0 AS nb_non_solde,
nb_non_solde_0_c AS nb_non_solde_c,
nb_non_solde_0_h AS nb_non_solde_h,
nb_non_solde_0,
nb_non_solde_0_c,
nb_non_solde_0_h,
0 AS nb_non_solde_1,
0 AS nb_non_solde_1_c,
0 AS nb_non_solde_1_h,
0 AS nb_non_solde_2,
0 AS nb_non_solde_2_c,
0 AS nb_non_solde_2_h,
nb_non_cloture_0 AS nb_non_cloture,
nb_non_cloture_0_c AS nb_non_cloture_c,
nb_non_cloture_0_h AS nb_non_cloture_h,
nb_non_cloture_0,
nb_non_cloture_0_c,
nb_non_cloture_0_h,
0 AS nb_non_cloture_1,
0 AS nb_non_cloture_1_c,
0 AS nb_non_cloture_1_h,
0 AS nb_non_cloture_2,
0 AS nb_non_cloture_2_c,
0 AS nb_non_cloture_2_h
FROM w_factures_reference
WHERE tiers_payant_0_id <> 0
AND
(
montant_facture_0 <> 0 OR
montant_comptabilise_0 <> 0 OR
montant_regle_0 <> 0 OR
montant_encours <> 0
)
;
INSERT INTO activite.p_factures_reference_tiers (
sejour_id,
no_sejour,
date_entree,
date_sortie,
code_sorti,
facture_reference_id,
no_facture_reference,
type_t2a,
date_debut_facture,
date_fin_facture,
type_facture,
date_groupage,
retard_groupage,
delai_groupage,
nb_groupe,
nb_non_groupe,
nb_calculable,
ghs_id,
ghs_bebe1_id,
ghs_bebe2_id,
ghs_bebe3_id,
gmt_id,
tiers_payant_id,
code_facture,
date_facture,
retard_facture,
delai_facture,
code_vente,
date_vente,
nb_factures,
nb_non_calcules,
nb_non_calcules_horsbg,
nb_non_calcules_bg,
nb_factures_regularisation,
nb_rejets,
code_expedie_0,
code_expedie_1,
code_expedie_2,
date_expedition,
date_expedition_0,
date_expedition_1,
date_expedition_2,
no_bordereau_0,
no_bordereau_1,
no_bordereau_2,
delai_expedition,
delai_expedition_0,
delai_expedition_1,
delai_expedition_2,
nb_non_expedie,
nb_non_expedie_c,
nb_non_expedie_h,
nb_non_expedie_0,
nb_non_expedie_0_c,
nb_non_expedie_0_h,
nb_non_expedie_1,
nb_non_expedie_1_c,
nb_non_expedie_1_h,
nb_non_expedie_2,
nb_non_expedie_2_c,
nb_non_expedie_2_h,
montant_facture,
montant_facture_c,
montant_facture_h,
montant_facture_0,
montant_facture_0_c,
montant_facture_0_h,
montant_facture_1,
montant_facture_1_c,
montant_facture_1_h,
montant_facture_2,
montant_facture_2_c,
montant_facture_2_h,
montant_facture_c_actes_inclus_dans_sejour,
montant_facture_h_actes_inclus_dans_sejour,
montant_encours,
montant_encours_c,
montant_encours_h,
montant_encours_0,
montant_encours_0_c,
montant_encours_0_h,
montant_encours_1,
montant_encours_1_c,
montant_encours_1_h,
montant_encours_2,
montant_encours_2_c,
montant_encours_2_h,
montant_comptabilise,
montant_comptabilise_c,
montant_comptabilise_h,
montant_comptabilise_0,
montant_comptabilise_0_c,
montant_comptabilise_0_h,
montant_comptabilise_1,
montant_comptabilise_1_c,
montant_comptabilise_1_h,
montant_comptabilise_2,
montant_comptabilise_2_c,
montant_comptabilise_2_h,
montant_comptabilise_budget_global_c,
montant_regle,
montant_regle_c,
montant_regle_h,
montant_regle_0,
montant_regle_0_c,
montant_regle_0_h,
montant_regle_1,
montant_regle_1_c,
montant_regle_1_h,
montant_regle_2,
montant_regle_2_c,
montant_regle_2_h,
date_solde,
date_solde_c,
date_solde_h,
date_solde_0,
date_solde_0_c,
date_solde_0_h,
date_solde_1,
date_solde_1_c,
date_solde_1_h,
date_solde_2,
date_solde_2_c,
date_solde_2_h,
delai_solde,
delai_solde_c,
delai_solde_h,
delai_solde_0,
delai_solde_0_c,
delai_solde_0_h,
delai_solde_1,
delai_solde_1_c,
delai_solde_1_h,
delai_solde_2,
delai_solde_2_c,
delai_solde_2_h,
nb_non_solde,
nb_non_solde_c,
nb_non_solde_h,
nb_non_solde_0,
nb_non_solde_0_c,
nb_non_solde_0_h,
nb_non_solde_1,
nb_non_solde_1_c,
nb_non_solde_1_h,
nb_non_solde_2,
nb_non_solde_2_c,
nb_non_solde_2_h,
nb_non_cloture,
nb_non_cloture_c,
nb_non_cloture_h,
nb_non_cloture_0,
nb_non_cloture_0_c,
nb_non_cloture_0_h,
nb_non_cloture_1,
nb_non_cloture_1_c,
nb_non_cloture_1_h,
nb_non_cloture_2,
nb_non_cloture_2_c,
nb_non_cloture_2_h
)
SELECT
sejour_id,
no_sejour,
date_entree,
date_sortie,
code_sorti,
facture_reference_id,
no_facture_reference,
type_t2a,
date_debut_facture,
date_fin_facture,
type_facture,
date_groupage,
CASE WHEN tiers_payant_1_id <> 0 THEN retard_groupage ELSE 0 END,
delai_groupage,
nb_groupe,
nb_non_groupe,
nb_calculable,
ghs_id,
ghs_bebe1_id,
ghs_bebe2_id,
ghs_bebe3_id,
gmt_id,
tiers_payant_1_id AS tiers_payant_id,
code_facture,
date_facture,
CASE WHEN tiers_payant_1_id <> 0 THEN retard_facture ELSE 0 END,
delai_facture,
code_vente,
date_vente,
nb_factures,
nb_non_calcules,
nb_non_calcules_horsbg,
nb_non_calcules_bg,
nb_factures_regularisation,
nb_rejets,
'0' AS code_expedie_0,
code_expedie_1,
'0' AS code_expedie_2,
date_expedition_1 AS date_expedition,
NULL::date AS date_expedition_0,
date_expedition_1,
NULL::date AS date_expedition_2,
'' AS no_bordereau_0,
no_bordereau_1,
'' AS no_bordereau_2,
delai_expedition_1 AS delai_expedition,
NULL::numeric AS delai_expedition_0,
delai_expedition_1,
NULL::numeric AS delai_expedition_2,
nb_non_expedie_1 AS nb_non_expedie,
nb_non_expedie_1_c AS nb_non_expedie_c,
nb_non_expedie_1_h AS nb_non_expedie_h,
0 AS nb_non_expedie_0,
0 AS nb_non_expedie_0_c,
0 AS nb_non_expedie_0_h,
nb_non_expedie_1,
nb_non_expedie_1_c,
nb_non_expedie_1_h,
0 AS nb_non_expedie_2,
0 AS nb_non_expedie_2_c,
0 AS nb_non_expedie_2_h,
montant_facture_1 AS montant_facture,
montant_facture_1_c AS montant_facture_c,
montant_facture_1_h AS montant_facture_h,
0 AS montant_facture_0,
0 AS montant_facture_0_c,
0 AS montant_facture_0_h,
montant_facture_1,
montant_facture_1_c,
montant_facture_1_h,
0 AS montant_facture_2,
0 AS montant_facture_2_c,
0 AS montant_facture_2_h,
montant_facture_c_actes_inclus_dans_sejour,
montant_facture_h_actes_inclus_dans_sejour,
montant_encours_1 AS montant_encours,
montant_encours_1_c AS montant_encours_c,
montant_encours_1_h AS montant_encours_h,
0 AS montant_encours_0,
0 AS montant_encours_0_c,
0 AS montant_encours_0_h,
montant_encours_1,
montant_encours_1_c,
montant_encours_1_h,
0 AS montant_encours_2,
0 AS montant_encours_2_c,
0 AS montant_encours_2_h,
montant_comptabilise_1 AS montant_comptabilise,
montant_comptabilise_1_c AS montant_comptabilise_c,
montant_comptabilise_1_h AS montant_comptabilise_h,
0 AS montant_comptabilise_0,
0 AS montant_comptabilise_0_c,
0 AS montant_comptabilise_0_h,
montant_comptabilise_1,
montant_comptabilise_1_c,
montant_comptabilise_1_h,
0 AS montant_comptabilise_2,
0 AS montant_comptabilise_2_c,
0 AS montant_comptabilise_2_h,
montant_comptabilise_budget_global_c,
montant_regle_1 AS montant_regle,
montant_regle_1_c AS montant_regle_c,
montant_regle_1_h AS montant_regle_h,
0 AS montant_regle_0,
0 AS montant_regle_0_c,
0 AS montant_regle_0_h,
montant_regle_1,
montant_regle_1_c,
montant_regle_1_h,
0 AS montant_regle_2,
0 AS montant_regle_2_c,
0 AS montant_regle_2_h,
date_solde_1 AS date_solde,
date_solde_1_c AS date_solde_c,
date_solde_1_h AS date_solde_h,
NULL::date AS date_solde_0,
NULL::date AS date_solde_0_c,
NULL::date AS date_solde_0_h,
date_solde_1,
date_solde_1_c,
date_solde_1_h,
NULL::date AS date_solde_2,
NULL::date AS date_solde_2_c,
NULL::date AS date_solde_2_h,
delai_solde_1 AS delai_solde,
delai_solde_1_c AS delai_solde_c,
delai_solde_1_h AS delai_solde_h,
NULL::numeric AS delai_solde_0,
NULL::numeric AS delai_solde_0_c,
NULL::numeric AS delai_solde_0_h,
delai_solde_1,
delai_solde_1_c,
delai_solde_1_h,
NULL::numeric AS delai_solde_2,
NULL::numeric AS delai_solde_2_c,
NULL::numeric AS delai_solde_2_h,
nb_non_solde_1 AS nb_non_solde,
nb_non_solde_1_c AS nb_non_solde_c,
nb_non_solde_1_h AS nb_non_solde_h,
0 AS nb_non_solde_0,
0 AS nb_non_solde_0_c,
0 AS nb_non_solde_0_h,
nb_non_solde_1,
nb_non_solde_1_c,
nb_non_solde_1_h,
0 AS nb_non_solde_2,
0 AS nb_non_solde_2_c,
0 AS nb_non_solde_2_h,
nb_non_cloture_1 AS nb_non_cloture,
nb_non_cloture_1_c AS nb_non_cloture_c,
nb_non_cloture_1_h AS nb_non_cloture_h,
0 AS nb_non_cloture_0,
0 AS nb_non_cloture_0_c,
0 AS nb_non_cloture_0_h,
nb_non_cloture_1,
nb_non_cloture_1_c,
nb_non_cloture_1_h,
0 AS nb_non_cloture_2,
0 AS nb_non_cloture_2_c,
0 AS nb_non_cloture_2_h
FROM w_factures_reference
WHERE tiers_payant_1_id <> 0
AND
(
montant_facture_1 <> 0 OR
montant_comptabilise_1 <> 0 OR
montant_regle_1 <> 0 OR
montant_encours <> 0
)
;
INSERT INTO activite.p_factures_reference_tiers (
sejour_id,
no_sejour,
date_entree,
date_sortie,
code_sorti,
facture_reference_id,
no_facture_reference,
type_t2a,
date_debut_facture,
date_fin_facture,
type_facture,
date_groupage,
retard_groupage,
delai_groupage,
nb_groupe,
nb_non_groupe,
nb_calculable,
ghs_id,
ghs_bebe1_id,
ghs_bebe2_id,
ghs_bebe3_id,
gmt_id,
tiers_payant_id,
code_facture,
date_facture,
retard_facture,
delai_facture,
code_vente,
date_vente,
nb_factures,
nb_non_calcules,
nb_non_calcules_horsbg,
nb_non_calcules_bg,
nb_factures_regularisation,
nb_rejets,
code_expedie_0,
code_expedie_1,
code_expedie_2,
date_expedition,
date_expedition_0,
date_expedition_1,
date_expedition_2,
no_bordereau_0,
no_bordereau_1,
no_bordereau_2,
delai_expedition,
delai_expedition_0,
delai_expedition_1,
delai_expedition_2,
nb_non_expedie,
nb_non_expedie_c,
nb_non_expedie_h,
nb_non_expedie_0,
nb_non_expedie_0_c,
nb_non_expedie_0_h,
nb_non_expedie_1,
nb_non_expedie_1_c,
nb_non_expedie_1_h,
nb_non_expedie_2,
nb_non_expedie_2_c,
nb_non_expedie_2_h,
montant_facture,
montant_facture_c,
montant_facture_h,
montant_facture_0,
montant_facture_0_c,
montant_facture_0_h,
montant_facture_1,
montant_facture_1_c,
montant_facture_1_h,
montant_facture_2,
montant_facture_2_c,
montant_facture_2_h,
montant_facture_c_actes_inclus_dans_sejour,
montant_facture_h_actes_inclus_dans_sejour,
montant_encours,
montant_encours_c,
montant_encours_h,
montant_encours_0,
montant_encours_0_c,
montant_encours_0_h,
montant_encours_1,
montant_encours_1_c,
montant_encours_1_h,
montant_encours_2,
montant_encours_2_c,
montant_encours_2_h,
montant_comptabilise,
montant_comptabilise_c,
montant_comptabilise_h,
montant_comptabilise_0,
montant_comptabilise_0_c,
montant_comptabilise_0_h,
montant_comptabilise_1,
montant_comptabilise_1_c,
montant_comptabilise_1_h,
montant_comptabilise_2,
montant_comptabilise_2_c,
montant_comptabilise_2_h,
montant_comptabilise_budget_global_c,
montant_regle,
montant_regle_c,
montant_regle_h,
montant_regle_0,
montant_regle_0_c,
montant_regle_0_h,
montant_regle_1,
montant_regle_1_c,
montant_regle_1_h,
montant_regle_2,
montant_regle_2_c,
montant_regle_2_h,
date_solde,
date_solde_c,
date_solde_h,
date_solde_0,
date_solde_0_c,
date_solde_0_h,
date_solde_1,
date_solde_1_c,
date_solde_1_h,
date_solde_2,
date_solde_2_c,
date_solde_2_h,
delai_solde,
delai_solde_c,
delai_solde_h,
delai_solde_0,
delai_solde_0_c,
delai_solde_0_h,
delai_solde_1,
delai_solde_1_c,
delai_solde_1_h,
delai_solde_2,
delai_solde_2_c,
delai_solde_2_h,
nb_non_solde,
nb_non_solde_c,
nb_non_solde_h,
nb_non_solde_0,
nb_non_solde_0_c,
nb_non_solde_0_h,
nb_non_solde_1,
nb_non_solde_1_c,
nb_non_solde_1_h,
nb_non_solde_2,
nb_non_solde_2_c,
nb_non_solde_2_h,
nb_non_cloture,
nb_non_cloture_c,
nb_non_cloture_h,
nb_non_cloture_0,
nb_non_cloture_0_c,
nb_non_cloture_0_h,
nb_non_cloture_1,
nb_non_cloture_1_c,
nb_non_cloture_1_h,
nb_non_cloture_2,
nb_non_cloture_2_c,
nb_non_cloture_2_h
)
SELECT
sejour_id,
no_sejour,
date_entree,
date_sortie,
code_sorti,
facture_reference_id,
no_facture_reference,
type_t2a,
date_debut_facture,
date_fin_facture,
type_facture,
date_groupage,
CASE WHEN tiers_payant_1_id = 0 AND tiers_payant_2_id <> 0 THEN retard_groupage ELSE 0 END,
delai_groupage,
nb_groupe,
nb_non_groupe,
nb_calculable,
ghs_id,
ghs_bebe1_id,
ghs_bebe2_id,
ghs_bebe3_id,
gmt_id,
tiers_payant_2_id AS tiers_payant_id,
code_facture,
date_facture,
CASE WHEN tiers_payant_1_id = 0 AND tiers_payant_2_id <> 0 THEN retard_facture ELSE 0 END,
delai_facture,
code_vente,
date_vente,
nb_factures,
nb_non_calcules,
nb_non_calcules_horsbg,
nb_non_calcules_bg,
nb_factures_regularisation,
nb_rejets,
'0' AS code_expedie_0,
'0' AS code_expedie_1,
code_expedie_2,
date_expedition_2 AS date_expedition,
NULL::date AS date_expedition_0,
NULL::date AS date_expedition_1,
date_expedition_2,
'' AS no_bordereau_0,
'' AS no_bordereau_1,
no_bordereau_2,
delai_expedition_2 AS delai_expedition,
NULL::numeric AS delai_expedition_0,
NULL::numeric AS delai_expedition_1,
delai_expedition_2,
nb_non_expedie_2 AS nb_non_expedie,
nb_non_expedie_2_c AS nb_non_expedie_c,
nb_non_expedie_2_h AS nb_non_expedie_h,
0 AS nb_non_expedie_0,
0 AS nb_non_expedie_0_c,
0 AS nb_non_expedie_0_h,
0 AS nb_non_expedie_1,
0 AS nb_non_expedie_1_c,
0 AS nb_non_expedie_1_h,
nb_non_expedie_2,
nb_non_expedie_2_c,
nb_non_expedie_2_h,
montant_facture_2 AS montant_facture,
montant_facture_2_c AS montant_facture_c,
montant_facture_2_h AS montant_facture_h,
0 AS montant_facture_0,
0 AS montant_facture_0_c,
0 AS montant_facture_0_h,
0 AS montant_facture_1,
0 AS montant_facture_1_c,
0 AS montant_facture_1_h,
montant_facture_2,
montant_facture_2_c,
montant_facture_2_h,
0 AS montant_facture_c_actes_inclus_dans_sejour,
0 AS montant_facture_h_actes_inclus_dans_sejour,
montant_encours_2 AS montant_encours,
montant_encours_2_c AS montant_encours_c,
montant_encours_2_h AS montant_encours_h,
0 AS montant_encours_0,
0 AS montant_encours_0_c,
0 AS montant_encours_0_h,
0 AS montant_encours_1,
0 AS montant_encours_1_c,
0 AS montant_encours_1_h,
montant_encours_2,
montant_encours_2_c,
montant_encours_2_h,
montant_comptabilise_2 AS montant_comptabilise,
montant_comptabilise_2_c AS montant_comptabilise_c,
montant_comptabilise_2_h AS montant_comptabilise_h,
0 AS montant_comptabilise_0,
0 AS montant_comptabilise_0_c,
0 AS montant_comptabilise_0_h,
0 AS montant_comptabilise_1,
0 AS montant_comptabilise_1_c,
0 AS montant_comptabilise_1_h,
montant_comptabilise_2,
montant_comptabilise_2_c,
montant_comptabilise_2_h,
0 AS montant_comptabilise_budget_global_c,
montant_regle_2 AS montant_regle,
montant_regle_2_c AS montant_regle_c,
montant_regle_2_h AS montant_regle_h,
0 AS montant_regle_0,
0 AS montant_regle_0_c,
0 AS montant_regle_0_h,
0 AS montant_regle_1,
0 AS montant_regle_1_c,
0 AS montant_regle_1_h,
montant_regle_2,
montant_regle_2_c,
montant_regle_2_h,
date_solde_2 AS date_solde,
date_solde_2_c AS date_solde_c,
date_solde_2_h AS date_solde_h,
NULL::date AS date_solde_0,
NULL::date AS date_solde_0_c,
NULL::date AS date_solde_0_h,
NULL::date AS date_solde_1,
NULL::date AS date_solde_1_c,
NULL::date AS date_solde_1_h,
date_solde_2,
date_solde_2_c,
date_solde_2_h,
delai_solde_2 AS delai_solde,
delai_solde_2_c AS delai_solde_c,
delai_solde_2_h AS delai_solde_h,
NULL::numeric AS delai_solde_0,
NULL::numeric AS delai_solde_0_c,
NULL::numeric AS delai_solde_0_h,
NULL::numeric AS delai_solde_1,
NULL::numeric AS delai_solde_1_c,
NULL::numeric AS delai_solde_1_h,
delai_solde_2,
delai_solde_2_c,
delai_solde_2_h,
nb_non_solde_2 AS nb_non_solde,
nb_non_solde_2_c AS nb_non_solde_c,
nb_non_solde_2_h AS nb_non_solde_h,
0 AS nb_non_solde_0,
0 AS nb_non_solde_0_c,
0 AS nb_non_solde_0_h,
0 AS nb_non_solde_1,
0 AS nb_non_solde_1_c,
0 AS nb_non_solde_1_h,
nb_non_solde_2,
nb_non_solde_2_c,
nb_non_solde_2_h,
nb_non_cloture_2 AS nb_non_cloture,
nb_non_cloture_2_c AS nb_non_cloture_c,
nb_non_cloture_2_h AS nb_non_cloture_h,
0 AS nb_non_cloture_0,
0 AS nb_non_cloture_0_c,
0 AS nb_non_cloture_0_h,
0 AS nb_non_cloture_1,
0 AS nb_non_cloture_1_c,
0 AS nb_non_cloture_1_h,
nb_non_cloture_2,
nb_non_cloture_2_c,
nb_non_cloture_2_h
FROM w_factures_reference
WHERE tiers_payant_2_id <> 0
AND
(
montant_facture_2 <> 0 OR
montant_comptabilise_2 <> 0 OR
montant_regle_2 <> 0 OR
montant_encours <> 0
)
;
ANALYSE activite.p_factures_reference_tiers
;
SELECT base.cti_enable_index('activite', 'i_factures_reference_tiers_1');
SELECT base.cti_enable_index('activite', 'i_factures_reference_tiers_2');
SELECT base.cti_enable_index('activite', 'i_factures_reference_tiers_3');
SELECT base.cti_enable_index('activite', 'i_factures_reference_tiers_4');
UPDATE activite.p_factures
SET date_fin = date_fin_facture
FROM activite.p_factures_reference
WHERE p_factures.no_facture_reference = p_factures_reference.no_facture_reference AND
p_factures.date_fin <> p_factures_reference.date_fin_facture
;
-- Suppression des tables de travail non utilisées après
DROP TABLE IF EXISTS w_factures_reference CASCADE;
-- Report motifs de non facturation
-- Annulation si facture OK
UPDATE activite.p_factures
SET motif_non_facturation_id = 0, motif_non_facturation_comment = ''
FROM activite.p_factures_reference
WHERE p_factures_reference.no_facture_reference = p_factures.no_facture_reference AND
p_factures.motif_non_facturation_id <> 0 AND
nb_non_calcules = 0
;
UPDATE activite.p_factures_reference
SET motif_non_facturation_id = subview.motif_non_facturation_id,
motif_non_facturation_comment = subview.motif_non_facturation_comment
FROM
(
SELECT no_facture_reference,
MAX(motif_non_facturation_id) AS motif_non_facturation_id,
MAX(motif_non_facturation_comment) AS motif_non_facturation_comment
FROM activite.p_factures
WHERE motif_non_facturation_id <> 0
GROUP BY 1
) subview
WHERE p_factures_reference.no_facture_reference = subview.no_facture_reference AND
nb_non_calcules = 1
;
UPDATE activite.p_factures_reference_tiers
SET motif_non_facturation_id = subview.motif_non_facturation_id,
motif_non_facturation_comment = subview.motif_non_facturation_comment
FROM
(
SELECT no_facture_reference,
MAX(motif_non_facturation_id) AS motif_non_facturation_id,
MAX(motif_non_facturation_comment) AS motif_non_facturation_comment
FROM activite.p_factures
WHERE motif_non_facturation_id <> 0
GROUP BY 1
) subview
WHERE p_factures_reference_tiers.no_facture_reference = subview.no_facture_reference AND
nb_non_calcules = 1
;
UPDATE activite.p_factures_reference
SET motif_non_facturation_id = t_motif_non_facturation.oid
FROM activite.t_motif_non_facturation
WHERE t_motif_non_facturation.code_original = '*CTING' AND
nb_non_calcules = 1 AND
nb_non_groupe = 1 AND
motif_non_facturation_id = 0
;
UPDATE activite.p_factures
SET motif_non_facturation_id = p_factures_reference.motif_non_facturation_id
FROm activite.p_factures_reference
WHERE p_factures_reference.no_facture_reference = p_factures.no_facture_reference AND
p_factures.motif_non_facturation_id IS DISTINCT FROM p_factures_reference.motif_non_facturation_id
;
UPDATE activite.p_factures_reference_tiers
SET motif_non_facturation_id = p_factures_reference.motif_non_facturation_id
FROM activite.p_factures_reference
WHERE p_factures_reference.no_facture_reference = p_factures_reference_tiers.no_facture_reference AND
p_factures_reference_tiers.motif_non_facturation_id IS DISTINCT FROM p_factures_reference.motif_non_facturation_id AND
p_factures_reference_tiers.nb_non_calcules = 1
;
-- Pointer les journées facturées dans occupation
DROP TABLE IF EXISTS w_sejours_non_factures;
CREATE TEMP TABLE w_sejours_non_factures AS
SELECT p_sejours.no_sejour,
COALESCE(p_factures_reference.date_entree, p_sejours.date_entree) AS date_debut,
COALESCE(p_factures_reference.date_sortie, p_sejours.date_sortie) AS date_fin
FROM activite.p_sejours
LEFT JOIN activite.p_factures_reference ON p_sejours.no_sejour = p_factures_reference.no_sejour
WHERE p_factures_reference.nb_non_calcules <> 0
ORDER BY p_sejours.no_sejour, p_factures_reference.date_sortie;
CREATE INDEX w_sejours_non_factures_i1 ON w_sejours_non_factures USING btree (no_sejour);
UPDATE activite.p_mouvements_sejour
SET est_facture = '0'
WHERE p_mouvements_sejour.est_mouvement_previsionnel = '1' AND
est_facture IS DISTINCT FROM '0';
UPDATE activite.p_mouvements_sejour
SET est_facture = '0'
FROM w_sejours_non_factures
WHERE p_mouvements_sejour.no_sejour = w_sejours_non_factures.no_sejour AND
p_mouvements_sejour.date BETWEEN w_sejours_non_factures.date_debut AND w_sejours_non_factures.date_fin;
-- Code facture complet dans séjours
DROP TABLE IF EXISTS w_sejours_etat_factures;
CREATE TEMP TABLE w_sejours_etat_factures AS
SELECT p_sejours.no_sejour,
MIN(CASE WHEN nb_non_calcules = 0 THEN '1' ELSE '0' END) AS code_facture_reference,
MAX(CASE WHEN nb_non_calcules = 0 THEN p_factures_reference.date_facture ELSE '20991231' END) AS date_facture_reference,
MIN(CASE WHEN p_sejours.date_facture < '2099-12-31'THEN '1' ELSE '0' END) AS code_facture_sejour
FROM activite.p_sejours
LEFT JOIN activite.p_factures_reference ON p_sejours.no_sejour = p_factures_reference.no_sejour
GROUP BY 1
HAVING MIN(CASE WHEN nb_non_calcules = 0 THEN '1' ELSE '0' END) <> MIN(CASE WHEN p_sejours.date_facture < '2099-12-31'THEN '1' ELSE '0' END)
ORDER BY p_sejours.no_sejour;
CREATE INDEX w_sejours_etat_factures_i1 ON w_sejours_etat_factures USING btree (no_sejour);
UPDATE activite.p_sejours
SET date_facture = date_facture_reference
FROM w_sejours_etat_factures
WHERE p_sejours.no_sejour = w_sejours_etat_factures.no_sejour;
-- Actualisation facture de référence des encours
UPDATE activite.p_factures_encours
SET no_facture_reference = p_factures.no_facture
FROM activite.p_factures
WHERE p_factures_encours.no_sejour = p_factures.no_sejour AND
p_factures_encours.date_debut BETWEEN p_factures.date_debut AND p_factures.date_fin AND
p_factures.no_facture = p_factures.no_facture_reference AND
p_factures_encours.no_facture_reference <> p_factures.no_facture;
-- Etat des séjours
DROP TABLE IF EXISTS w_sejours_1;
CREATE TEMP TABLE w_sejours_1 as
SELECT
p_sejours.no_sejour,
SUM(CASE WHEN p_factures_reference.date_facture != '2099-12-31' THEN 1 ELSE 0 END) AS nb_facturation_partielle,
MAX(nb_non_groupe) AS nb_non_groupe,
MAX(nb_non_calcules) AS nb_non_calcules,
MAX(nb_non_solde) AS nb_non_solde
FROM activite.p_sejours
LEFT JOIN activite.p_factures_reference ON p_factures_reference.no_sejour = p_sejours.no_sejour
GROUP BY 1;
ANALYSE w_sejours_1
;
-- UPDATE Etat des séjours
UPDATE activite.p_sejours SET etat_sejour =
CASE
WHEN type_sejour = 9 THEN '9' -- Fictif
WHEN est_sans_facturation ='1' THEN '8' -- Non facturable ou recuse
WHEN code_prevu = 1 THEN '0' -- prévu
WHEN code_sorti <> 1 THEN CASE WHEN nb_facturation_partielle > 0 THEN '2' ELSE '1' END -- Présent(1) et présent avec faturation partielle (2)
WHEN code_sorti = 1 AND nb_non_groupe = 1 THEN '3' -- sorti non groupé
WHEN code_sorti = 1 AND nb_non_calcules = 1 AND date_groupage IS NULL THEN '3' -- Sorti non groupé dans le cas où il y a un pré-groupage mais pas de validation DIM
WHEN code_sorti = 1 AND nb_non_calcules = 1 THEN CASE WHEN nb_facturation_partielle > 0 THEN '5' ELSE '4' END-- sorti non facturé(4) et sorti non facturé avec facturation partielle (5)
WHEN nb_non_solde = 0 THEN '7' -- soldé
WHEN nb_non_calcules = 0 AND nb_non_solde = 1 THEN '6' -- Facturé non soldé
ELSE '?'
END
FROM w_sejours_1
WHERE w_sejours_1.no_sejour = p_sejours.no_sejour;
]]></sqlcmd>
</NODE>
<NODE label="Etat des dossiers PMSI">
<condition><![CDATA[
"[PX]" == "" && "[ENV_WITHPMSI]" == "1"
]]></condition>
<sqlcmd><![CDATA[
WITH w_sejours AS (
SELECT
p_sejours.no_sejour
,p_sejour_pmsi.rss_id
,SUM(CASE WHEN p_factures_reference.nb_non_calcules = 0 THEN 1 ELSE 0 END) AS nb_facturation_partielle
,MAX(p_factures_reference.nb_non_groupe) AS nb_non_groupe
,MAX(p_factures_reference.nb_non_calcules) AS nb_non_calcules
,MAX(p_factures_reference.nb_non_solde) AS nb_non_solde
,MAX(p_sejours.type_sejour) AS type_sejour
,MAX(p_sejours.code_sorti) AS code_sorti
,MAX(p_sejours.date_groupage) AS date_groupage
FROM activite.p_sejours
JOIN activite.p_sejour_pmsi ON p_sejour_pmsi.sejour_id = p_sejours.oid
LEFT JOIN activite.p_factures_reference ON p_factures_reference.no_sejour = p_sejours.no_sejour
GROUP BY p_sejours.no_sejour, p_sejour_pmsi.rss_id
),
w_sejours_cal AS (
SELECT
w_sejours.no_sejour
,w_sejours.rss_id
,CASE
WHEN w_sejours.type_sejour = 9 THEN '9'
WHEN w_sejours.code_sorti = 1 AND w_sejours.nb_non_groupe = 1 THEN '3'
WHEN w_sejours.code_sorti = 1 AND w_sejours.nb_non_calcules = 1 AND w_sejours.date_groupage IS NULL THEN '3'
WHEN w_sejours.code_sorti = 1 AND w_sejours.nb_non_calcules = 1 THEN CASE WHEN w_sejours.nb_facturation_partielle > 0 THEN '5' ELSE '4' END
WHEN w_sejours.nb_non_solde = 0 THEN '7'
WHEN w_sejours.nb_non_calcules = 0 AND w_sejours.nb_non_solde = 1 THEN '6'
ELSE '0'
END AS etat_new
FROM w_sejours
)
UPDATE pmsi.p_rss
SET etat_sejour = w_sejours_cal.etat_new
FROM w_sejours_cal
WHERE p_rss.oid = w_sejours_cal.rss_id
AND p_rss.etat_sejour IS DISTINCT FROM w_sejours_cal.etat_new
;
UPDATE pmsi.p_rss SET etat_sejour = '8'
WHERE etat_sejour is null or etat_sejour = '?';
-- Update champ transmission e-pmsi MCO,SSR,PSY,HAD,HORS PMSI
WITH sej_pmsi AS (
SELECT DISTINCT no_sejour
,traitement_epmsi
,en_cours_pmsi FROM activite.p_sejour_pmsi
)
UPDATE activite.p_sejours
SET traitement_epmsi_id = CASE
WHEN type_pmsi not in ('1','2','3','4') THEN 5
WHEN type_pmsi = '1' AND sej_pmsi.en_cours_pmsi = '0' AND sej_pmsi.traitement_epmsi in ('11', '12', '13', '14', '15', '21', '22', '23', '24', '25', '26', '30', '31', '32', '33') THEN 11
ELSE 10 END
FROM sej_pmsi
WHERE sej_pmsi.no_sejour = p_sejours.no_sejour;
]]></sqlcmd>
</NODE>
<NODE label="MAJ GHM-GME dans p_sejours">
<condition><![CDATA[
"[PX]" == ""
]]></condition>
<sqlcmd><![CDATA[
-- MAJ sejours externe MCO
UPDATE activite[PX].p_sejours
SET ghmgme_id = t_ghmgme_c.ghmgme_id
FROM activite[PX].t_ghmgme_c
where t_ghmgme_c.ghmgme_id = p_sejours.ghm_id
AND p_sejours.ghm_id in (-9991,-9992,-9993,-9994,-9995,-9996,-9990,-9980,-9981)
;
-- MAJ sejours externe SSR
UPDATE activite[PX].p_sejours
SET ghmgme_id = t_ghmgme_c.ghmgme_id
FROM activite[PX].t_ghmgme_c
where t_ghmgme_c.ghmgme_id = p_sejours.gme_id
AND p_sejours.gme_id in (-9991,-9992,-9993,-9994,-9995,-9996,-9990,-9980,-9981)
;
-- MAJ p_sejours.ghmgme_id pour le champ ghm
UPDATE activite[PX].p_sejours
SET ghmgme_id = t_ghmgme_c.ghmgme_id
FROM activite[PX].t_ghmgme_c
where t_ghmgme_c.ghmgme_id = p_sejours.ghm_id
AND p_sejours.ghm_id > 0
;
-- MAJ p_sejours.ghmgme_id pour le champ gme
UPDATE activite[PX].p_sejours
SET ghmgme_id = t_ghmgme_c.ghmgme_id
FROM activite[PX].t_ghmgme_c
where t_ghmgme_c.ghmgme_id = p_sejours.gme_id + 10000
AND p_sejours.gme_id > 0
;
]]></sqlcmd>
</NODE>
<NODE label="Compléments lignes factures">
<condition><![CDATA[
"[PX]" == ""
]]></condition>
<sqlcmd><![CDATA[
-- Ajustement PMSI fil de l'eau
SELECT activite.cti_ajust_fildeleau();
-- Modification facturation jour de sortie CP
INSERT INTO activite.t_divers (code, texte, valeur, description)
SELECT
'TRANSCPJS',
'Transformation lignes de facture pour CP jour de sortie',
'0',
'1=Si Rubrique CP avec date fin > date entrée et nombre à 1 et date début = date entrée et date fin = date sortie alors date début = date fin'
WHERE 'TRANSCPJS' NOT IN (SELECT code FROM activite.t_divers);
;
UPDATE activite.p_factures_lignes_c
SET date_debut = p_factures_lignes_c.date_fin
FROM activite.p_factures
JOIN activite.p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
JOIN activite.t_divers ON t_divers.code = 'TRANSCPJS' AND t_divers.valeur = '1'
WHERE p_factures_lignes_c.no_facture = p_factures.no_facture AND
(
nb_rubrique = 1 OR
nb_rubrique = -1
) AND
p_factures_lignes_c.date_fin > p_factures_lignes_c.date_debut AND
p_factures_lignes_c.date_fin = date_sortie AND
p_factures_lignes_c.date_debut = date_entree AND
rubrique_facturation_id IN
(SELECT to_id
FROM activite.t_listes
JOIN activite.t_listes_contenu ON liste_id = t_listes.oid
WHERE code = 'CTI_SHO_R'
)
;
-- Compte produit
-- Forcage depuis parametrage
UPDATE activite[PX].p_factures_lignes_c
SET compte_produit_id =
CASE
WHEN est_compte_force = '1' THEN t_service_rubrique.compte_id
WHEN p_factures_lignes_c.compte_produit_id = 0 THEN t_service_rubrique.compte_id
ELSE p_factures_lignes_c.compte_produit_id END
FROM activite[PX].t_lieux,
activite[PX].t_service_rubrique
WHERE lieu_id = t_lieux.oid AND
t_service_rubrique.service_facturation_id = t_lieux.service_facturation_id AND
t_service_rubrique.rubrique_facturation_id = p_factures_lignes_c.rubrique_facturation_id AND
t_service_rubrique.compte_id <> 0 AND
p_factures_lignes_c.compte_produit_id IS DISTINCT FROM
CASE
WHEN est_compte_force = '1' THEN t_service_rubrique.compte_id
WHEN p_factures_lignes_c.compte_produit_id = 0 THEN t_service_rubrique.compte_id
ELSE p_factures_lignes_c.compte_produit_id END
;
-- Déduction depuis historique service rubrique
DROP TABLE IF EXISTS w_factures_lignes_c_compte_serrub;
CREATE TEMP TABLE w_factures_lignes_c_compte_serrub AS
SELECT rubrique_facturation_id, service_facturation_id, (MAX(Array[date_vente::text || to_char(nb,'FM000000000000'), compte_produit_id::text]))[2]::bigint AS compte_produit_id
FROM
(
SELECT rubrique_facturation_id, service_facturation_id, date(date_trunc('month',date_vente)) AS date_vente, compte_produit_id, count(*) AS nb
FROM activite.p_factures_lignes_c
JOIN activite.p_factures ON p_factures_lignes_c.no_facture = p_factures.no_facture
JOIN activite.t_lieux ON p_factures_lignes_c.lieu_id = t_lieux.oid
WHERE compte_produit_id <> 0 AND date_vente < '20991231'
GROUP BY 1,2,3,4
) subview
GROUP BY 1,2;
CREATE INDEX w_factures_lignes_c_compte_serrub_i1
ON w_factures_lignes_c_compte_serrub
USING btree
(rubrique_facturation_id);
UPDATE activite.p_factures_lignes_c
SET compte_produit_id = w_factures_lignes_c_compte_serrub.compte_produit_id
FROM w_factures_lignes_c_compte_serrub,
activite.t_lieux
WHERE p_factures_lignes_c.compte_produit_id = 0 AND
p_factures_lignes_c.lieu_id = t_lieux.oid AND
p_factures_lignes_c.rubrique_facturation_id = w_factures_lignes_c_compte_serrub.rubrique_facturation_id AND
t_lieux.service_facturation_id = w_factures_lignes_c_compte_serrub.service_facturation_id;
-- Déduction depuis historique service prestation
DROP TABLE IF EXISTS w_factures_lignes_c_compte_serpre;
CREATE TEMP TABLE w_factures_lignes_c_compte_serpre AS
SELECT prestation_id, service_facturation_id, (MAX(Array[date_vente::text || to_char(nb,'FM000000000000'), compte_produit_id::text]))[2]::bigint AS compte_produit_id
FROM
(
SELECT prestation_id, service_facturation_id, date(date_trunc('month',date_vente)) AS date_vente, compte_produit_id, count(*) AS nb
FROM activite.p_factures_lignes_c
JOIN activite.p_factures ON p_factures_lignes_c.no_facture = p_factures.no_facture
JOIN activite.t_lieux ON p_factures_lignes_c.lieu_id = t_lieux.oid
WHERE compte_produit_id <> 0 AND date_vente < '20991231'
GROUP BY 1,2,3,4
) subview
GROUP BY 1,2;
CREATE INDEX w_factures_lignes_c_compte_serpre_i1
ON w_factures_lignes_c_compte_serpre
USING btree
(prestation_id);
UPDATE activite.p_factures_lignes_c
SET compte_produit_id = w_factures_lignes_c_compte_serpre.compte_produit_id
FROM w_factures_lignes_c_compte_serpre,
activite.t_lieux
WHERE p_factures_lignes_c.compte_produit_id = 0 AND
p_factures_lignes_c.lieu_id = t_lieux.oid AND
p_factures_lignes_c.prestation_id = w_factures_lignes_c_compte_serpre.prestation_id AND
t_lieux.service_facturation_id = w_factures_lignes_c_compte_serpre.service_facturation_id;
-- Déduction depuis historique rubrique uniquement
DROP TABLE IF EXISTS w_factures_lignes_c_compte_rub;
CREATE TEMP TABLE w_factures_lignes_c_compte_rub AS
SELECT rubrique_facturation_id, (MAX(Array[date_vente::text || to_char(nb,'FM000000000000'), compte_produit_id::text]))[2]::bigint AS compte_produit_id
FROM
(
SELECT rubrique_facturation_id, date(date_trunc('month',date_vente)) AS date_vente, compte_produit_id, count(*) AS nb
FROM activite.p_factures_lignes_c
JOIN activite.p_factures ON p_factures_lignes_c.no_facture = p_factures.no_facture
WHERE compte_produit_id <> 0 AND date_vente < '20991231'
GROUP BY 1,2,3
) subview
GROUP BY 1;
CREATE INDEX w_factures_lignes_c_compte_rub_i1
ON w_factures_lignes_c_compte_rub
USING btree
(rubrique_facturation_id);
UPDATE activite.p_factures_lignes_c
SET compte_produit_id = w_factures_lignes_c_compte_rub.compte_produit_id
FROM w_factures_lignes_c_compte_rub
WHERE p_factures_lignes_c.compte_produit_id = 0 AND
p_factures_lignes_c.rubrique_facturation_id = w_factures_lignes_c_compte_rub.rubrique_facturation_id;
-- Forcage depuis parametrage
UPDATE activite[PX].p_factures_encours_lignes_c
SET compte_produit_id =
CASE
WHEN est_compte_force = '1' THEN t_service_rubrique.compte_id
WHEN p_factures_encours_lignes_c.compte_produit_id = 0 THEN t_service_rubrique.compte_id
ELSE p_factures_encours_lignes_c.compte_produit_id END
FROM activite[PX].t_lieux,
activite[PX].t_service_rubrique
WHERE lieu_id = t_lieux.oid AND
t_service_rubrique.service_facturation_id = t_lieux.service_facturation_id AND
t_service_rubrique.rubrique_facturation_id = p_factures_encours_lignes_c.rubrique_facturation_id AND
t_service_rubrique.compte_id <> 0 AND
p_factures_encours_lignes_c.compte_produit_id IS DISTINCT FROM
CASE
WHEN est_compte_force = '1' THEN t_service_rubrique.compte_id
WHEN p_factures_encours_lignes_c.compte_produit_id = 0 THEN t_service_rubrique.compte_id
ELSE p_factures_encours_lignes_c.compte_produit_id END
;
-- Déduction depuis historiques service rubrique
UPDATE activite[PX].p_factures_encours_lignes_c
SET compte_produit_id = w_factures_lignes_c_compte_serrub.compte_produit_id
FROM w_factures_lignes_c_compte_serrub,
activite[PX].t_lieux
WHERE (p_factures_encours_lignes_c.compte_produit_id = 0 OR p_factures_encours_lignes_c.compte_produit_id IS NULL) AND
p_factures_encours_lignes_c.lieu_id = t_lieux.oid AND
p_factures_encours_lignes_c.rubrique_facturation_id = w_factures_lignes_c_compte_serrub.rubrique_facturation_id AND
t_lieux.service_facturation_id = w_factures_lignes_c_compte_serrub.service_facturation_id;
-- Déduction depuis historiques service prestation
UPDATE activite.p_factures_encours_lignes_c
SET compte_produit_id = w_factures_lignes_c_compte_serpre.compte_produit_id
FROM w_factures_lignes_c_compte_serpre,
activite.t_lieux
WHERE p_factures_encours_lignes_c.compte_produit_id = 0 AND
p_factures_encours_lignes_c.lieu_id = t_lieux.oid AND
p_factures_encours_lignes_c.prestation_id = w_factures_lignes_c_compte_serpre.prestation_id AND
t_lieux.service_facturation_id = w_factures_lignes_c_compte_serpre.service_facturation_id;
-- Déduction depuis historiques rubrique uniquement
UPDATE activite[PX].p_factures_encours_lignes_c
SET compte_produit_id = w_factures_lignes_c_compte_rub.compte_produit_id
FROM w_factures_lignes_c_compte_rub
WHERE (p_factures_encours_lignes_c.compte_produit_id = 0 OR p_factures_encours_lignes_c.compte_produit_id IS NULL) AND
p_factures_encours_lignes_c.rubrique_facturation_id = w_factures_lignes_c_compte_rub.rubrique_facturation_id;
-- Maintenance rubrique_facturation CTI
SELECT activite[PX].cti_reorganize_rubrique_facture_c('activite[PX].p_factures_lignes_c');
SELECT activite[PX].cti_reorganize_rubrique_facture_c('activite[PX].p_factures_encours_lignes_c');
-- Valorisation des actes gratuits
UPDATE activite.p_factures_lignes_h
SET montant_non_facture = round(p_factures_lignes_h.prix_unitaire * p_factures_lignes_h.nb_prestation * p_factures_lignes_h.coefficient * p_factures_lignes_h.coefficient_mco, 2)
FROM base.t_actes,
activite.p_factures
JOIN activite.p_sejours ON p_sejours.no_sejour = p_factures.no_sejour
WHERE p_factures_lignes_h.no_facture = p_factures.no_facture AND
p_factures_lignes_h.acte_id = t_actes.oid AND
p_factures_lignes_h.montant_facture = 0 AND
(p_sejours.est_budget_global IS DISTINCT FROM '1' OR p_factures.code_facture <> '0') AND
COALESCE(p_factures_lignes_h.montant_facture_actes_inclus_dans_sejour, 0) = 0;
-- Regroupement des lignes de CP (cas de rubriques facturées deux fois sur même date pour pb tarif patient/mutuelle
DROP TABLE IF EXISTS w_cp_double;
CREATE TEMP TABLE w_cp_double AS
SELECT
no_facture, date_debut, date_fin, prestation_id, rubrique_facturation_id, nb_rubrique, nb_prestation, coefficient,
SUM(prix_unitaire) AS prix_unitaire,
round(base.cti_division(SUM(montant_facture_1),SUM(montant_facture))*100.00,0) AS taux_1,
round(base.cti_division(SUM(montant_facture_2),SUM(montant_facture))*100.00,0) AS taux_2,
round(base.cti_division(SUM(montant_facture_22),SUM(montant_facture))*100.00,0) AS taux_22,
round(base.cti_division(SUM(montant_facture_0),SUM(montant_facture))*100.00,0) AS taux_0,
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,
MIN(p_factures_lignes_c.CTID) AS keepCTID
FROM activite.p_factures_lignes_c
WHERE rubrique_facturation_id IN (SELECT to_id FROM activite.v_listes_3 WHERE liste_code = 'CTI_SHO_R') AND
montant_facture <> 0
GROUP BY 1,2,3,4,5,6,7,8
HAVING count(*) > 1;
INSERT INTO w_cp_double
SELECT
no_facture, date_debut, date_fin, MAX(prestation_id) AS prestation_id, rubrique_facturation_id, 1 AS nb_rubrique, 1 AS nb_prestation, 1 AS coefficient,
SUM(montant_encours) AS prix_unitaire,
round(base.cti_division(SUM(montant_facture_1),SUM(montant_facture))*100.00,0) AS taux_1,
round(base.cti_division(SUM(montant_facture_2),SUM(montant_facture))*100.00,0) AS taux_2,
round(base.cti_division(SUM(montant_facture_22),SUM(montant_facture))*100.00,0) AS taux_22,
round(base.cti_division(SUM(montant_facture_0),SUM(montant_facture))*100.00,0) AS taux_0,
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,
MIN(p_factures_lignes_c.CTID) AS keepCTID
FROM activite.p_factures_lignes_c
WHERE rubrique_facturation_id IN (SELECT to_id FROM activite.v_listes_3 WHERE liste_code = 'CTI_SHO_R') AND
montant_encours <> 0
GROUP BY 1,2,3,5,6,7
HAVING count(*) > 1;
UPDATE w_cp_double
SET taux_0 = CASE WHEN taux_0 < 0 THEN 0 WHEN taux_0 > 100 THEN 100 ELSE taux_0 END
WHERE taux_0 <> CASE WHEN taux_0 < 0 THEN 0 WHEN taux_0 > 100 THEN 100 ELSE taux_0 END
;
UPDATE w_cp_double
SET taux_1 = CASE WHEN taux_1 < 0 THEN 0 WHEN taux_1 > 100 THEN 100 ELSE taux_1 END
WHERE taux_1 <> CASE WHEN taux_1 < 0 THEN 0 WHEN taux_1 > 100 THEN 100 ELSE taux_1 END
;
UPDATE w_cp_double
SET taux_2 = CASE WHEN taux_2 < 0 THEN 0 WHEN taux_2 > 100 THEN 100 ELSE taux_2 END
WHERE taux_2 <> CASE WHEN taux_2 < 0 THEN 0 WHEN taux_2 > 100 THEN 100 ELSE taux_2 END
;
UPDATE w_cp_double
SET taux_22 = CASE WHEN taux_22 < 0 THEN 0 WHEN taux_22 > 100 THEN 100 ELSE taux_22 END
WHERE taux_22 <> CASE WHEN taux_22 < 0 THEN 0 WHEN taux_22 > 100 THEN 100 ELSE taux_22 END
;
UPDATE w_cp_double
SET prestation_id = subview.prestation_id
FROM
(
SELECT rubrique_facturation_id, (MAX(ARRAY[nb,prestation_id]))[2] AS prestation_id
FROM
(
SELECT rubrique_facturation_id, prestation_id, count(*) AS nb
FROM w_cp_double
GROUP BY 1,2) subview
GROUP BY 1
) subview
WHERE w_cp_double.rubrique_facturation_id = subview.rubrique_facturation_id AND
w_cp_double.prestation_id <> subview.prestation_id;
CREATE INDEX w_cp_double_i1
ON w_cp_double
USING btree
(no_facture);
DELETE FROM activite.p_factures_lignes_c
USING w_cp_double
WHERE p_factures_lignes_c.no_facture = w_cp_double.no_facture AND
p_factures_lignes_c.date_debut = w_cp_double.date_debut AND
p_factures_lignes_c.date_fin = w_cp_double.date_fin AND
(p_factures_lignes_c.prestation_id = w_cp_double.prestation_id OR w_cp_double.montant_encours <> 0) AND
p_factures_lignes_c.rubrique_facturation_id = w_cp_double.rubrique_facturation_id AND
(p_factures_lignes_c.nb_rubrique = w_cp_double.nb_rubrique OR w_cp_double.montant_encours <> 0) AND
(p_factures_lignes_c.nb_prestation = w_cp_double.nb_prestation OR w_cp_double.montant_encours <> 0) AND
(p_factures_lignes_c.coefficient = w_cp_double.coefficient OR w_cp_double.montant_encours <> 0) AND
p_factures_lignes_c.CTID <> keepCTID;
UPDATE activite.p_factures_lignes_c SET
prestation_id = w_cp_double.prestation_id,
nb_rubrique = w_cp_double.nb_rubrique,
nb_prestation = w_cp_double.nb_prestation,
coefficient = w_cp_double.coefficient,
prix_unitaire = w_cp_double.prix_unitaire,
taux_0 = w_cp_double.taux_0,
taux_1 = w_cp_double.taux_1,
taux_2 = w_cp_double.taux_2,
taux_22 = w_cp_double.taux_22,
montant_facture = w_cp_double.montant_facture,
montant_facture_0 = w_cp_double.montant_facture_0,
montant_facture_1 = w_cp_double.montant_facture_1,
montant_facture_2 = w_cp_double.montant_facture_2,
montant_facture_22 = w_cp_double.montant_facture_22,
montant_comptabilise = w_cp_double.montant_comptabilise,
montant_comptabilise_0 = w_cp_double.montant_comptabilise_0,
montant_comptabilise_1 = w_cp_double.montant_comptabilise_1,
montant_comptabilise_2 = w_cp_double.montant_comptabilise_2,
montant_comptabilise_22 = w_cp_double.montant_comptabilise_22,
montant_encours = w_cp_double.montant_encours,
montant_encours_0 = w_cp_double.montant_encours_0,
montant_encours_1 = w_cp_double.montant_encours_1,
montant_encours_2 = w_cp_double.montant_encours_2,
montant_encours_22 = w_cp_double.montant_encours_22
FROM w_cp_double
WHERE p_factures_lignes_c.no_facture = w_cp_double.no_facture AND
p_factures_lignes_c.date_debut = w_cp_double.date_debut AND
p_factures_lignes_c.date_fin = w_cp_double.date_fin AND
(p_factures_lignes_c.prestation_id = w_cp_double.prestation_id OR w_cp_double.montant_encours <> 0) AND
p_factures_lignes_c.rubrique_facturation_id = w_cp_double.rubrique_facturation_id AND
(p_factures_lignes_c.nb_rubrique = w_cp_double.nb_rubrique OR w_cp_double.montant_encours <> 0) AND
(p_factures_lignes_c.nb_prestation = w_cp_double.nb_prestation OR w_cp_double.montant_encours <> 0) AND
(p_factures_lignes_c.coefficient = w_cp_double.coefficient OR w_cp_double.montant_encours <> 0);
-- Report sur le lieu de sortie de sortie en cas d'absence
UPDATE activite.p_factures_lignes_c
SET lieu_id = p_sejours.lieu_sortie_id
FROM activite.p_factures, activite.p_mouvements_sejour, activite.p_sejours
WHERE p_factures_lignes_c.no_facture = p_factures.no_facture AND
p_factures.no_sejour = p_mouvements_sejour.no_sejour AND
p_sejours.no_sejour = p_mouvements_sejour.no_sejour AND
activite.p_factures_lignes_c.date_debut = p_mouvements_sejour.date AND
(p_mouvements_sejour.heure_fin = 240000 OR p_mouvements_sejour.nb_sorties_directes = 1) AND
p_factures_lignes_c.lieu_id IN (SELECT oid FROM activite.t_lieux_c WHERE unite_fonctionnelle_id IN (SELECT oid FROM activite.t_unites_fonctionnelles WHERE code = '*ABS'))
;
]]></sqlcmd>
</NODE>
<NODE label="Compléments clients">
<condition><![CDATA[
"[PX]" == ""
]]></condition>
<sqlcmd><![CDATA[
-- Factures sans toiers payant
INSERT INTO activite.t_tiers_payant(code, code_original, texte, texte_court, type_tiers_payant)
SELECT 'NR1', '*CTINR1', 'Caisse non renseignée', 'Caisse non renseignée', '1'
WHERE '*CTINR1' NOT IN (SELECT code_original FROM activite.t_tiers_payant WHERE code_original IS NOT NULL)
;
INSERT INTO activite.t_tiers_payant(code, code_original, texte, texte_court, type_tiers_payant)
SELECT 'NR2', '*CTINR2', 'Mutuelle non renseignée', 'Mutuelle non renseignée', '2'
WHERE '*CTINR2' NOT IN (SELECT code_original FROM activite.t_tiers_payant WHERE code_original IS NOT NULL)
;
UPDATE activite.p_factures
SET tiers_payant_1_id = t_tiers_payant.oid
FROM activite.t_tiers_payant
WHERE t_tiers_payant.code_original = '*CTINR1' AND
tiers_payant_1_id = 0 AND
(montant_facture_1_c <> 0 OR montant_facture_1_h <> 0)
;
UPDATE activite.p_factures
SET tiers_payant_2_id = t_tiers_payant.oid
FROM activite.t_tiers_payant
WHERE t_tiers_payant.code_original = '*CTINR2' AND
tiers_payant_2_id = 0 AND
(montant_facture_2_c <> 0 OR montant_facture_2_h <> 0)
;
-- Nouvelle table des clients en attendant le dvp natif
SELECT base.cti_disable_index('activite', 'i_facture_solde_tiers_c_1');
SELECT base.cti_disable_index('activite', 'i_facture_solde_tiers_c_2');
SELECT base.cti_disable_index('activite', 'i_facture_solde_tiers_c_3');
SELECT base.cti_disable_index('activite', 'i_facture_solde_tiers_c_4');
SELECT base.cti_disable_index('activite', 'i_facture_solde_tiers_c_5');
SELECT base.cti_disable_index('activite', 'i_facture_solde_tiers_c_8');
INSERT INTO activite.p_facture_solde_tiers_c
(
facture_id,
no_facture,
date_comptable,
rubrique_comptabilisation_id,
prestation_id,
tiers_payant_id,
montant_comptabilise,
montant_regle,
montant_comptabilise_0,
montant_regle_0,
od_avoir,
od_non_comptabilise
)
SELECT
facture_id,
p_factures_soldes_c.no_facture,
date_comptable,
rubrique_comptabilisee_id,
prestation_id,
tiers_payant_0_id AS tiers_payant_id,
montant_comptabilise_0,
montant_regle_0,
montant_comptabilise_0,
montant_regle_0,
od_avoir,
od_non_comptabilise
FROM activite.p_factures_soldes_c
JOIN activite.p_factures ON p_factures_soldes_c.no_facture = p_factures.no_facture
WHERE p_factures.tiers_payant_0_id > 0 AND
(
p_factures_soldes_c.montant_comptabilise_0 <> 0 OR
p_factures_soldes_c.montant_regle_0 <> 0
);
INSERT INTO activite.p_facture_solde_tiers_c
(
facture_id,
no_facture,
date_comptable,
rubrique_comptabilisation_id,
prestation_id,
tiers_payant_id,
montant_comptabilise,
montant_regle,
montant_comptabilise_1,
montant_regle_1,
od_avoir,
od_non_comptabilise
)
SELECT
facture_id,
p_factures_soldes_c.no_facture,
date_comptable,
rubrique_comptabilisee_id,
prestation_id,
tiers_payant_1_id AS tiers_payant_id,
montant_comptabilise_1,
montant_regle_1,
montant_comptabilise_1,
montant_regle_1,
od_avoir,
od_non_comptabilise
FROM activite.p_factures_soldes_c
JOIN activite.p_factures ON p_factures_soldes_c.no_facture = p_factures.no_facture
WHERE p_factures.tiers_payant_1_id > 0 AND
(
p_factures_soldes_c.montant_comptabilise_1 <> 0 OR
p_factures_soldes_c.montant_regle_1 <> 0
);
INSERT INTO activite.p_facture_solde_tiers_c
(
facture_id,
no_facture,
date_comptable,
rubrique_comptabilisation_id,
prestation_id,
tiers_payant_id,
montant_comptabilise,
montant_regle,
montant_comptabilise_2,
montant_regle_2,
od_avoir,
od_non_comptabilise
)
SELECT
facture_id,
p_factures_soldes_c.no_facture,
date_comptable,
rubrique_comptabilisee_id,
prestation_id,
tiers_payant_2_id AS tiers_payant_id,
montant_comptabilise_2,
montant_regle_2,
montant_comptabilise_2,
montant_regle_2,
od_avoir,
od_non_comptabilise
FROM activite.p_factures_soldes_c
JOIN activite.p_factures ON p_factures_soldes_c.no_facture = p_factures.no_facture
WHERE p_factures.tiers_payant_2_id > 0 AND
(
p_factures_soldes_c.montant_comptabilise_2 <> 0 OR
p_factures_soldes_c.montant_regle_2 <> 0
);
INSERT INTO activite.p_facture_solde_tiers_c
(
facture_id,
no_facture,
date_comptable,
rubrique_comptabilisation_id,
prestation_id,
tiers_payant_id,
montant_comptabilise,
montant_regle,
montant_comptabilise_2,
montant_regle_2,
od_avoir,
od_non_comptabilise
)
SELECT
facture_id,
p_factures_soldes_c.no_facture,
date_comptable,
rubrique_comptabilisee_id,
prestation_id,
tiers_payant_22_id AS tiers_payant_id,
montant_comptabilise_22,
montant_regle_22,
montant_comptabilise_22,
montant_regle_22,
od_avoir,
od_non_comptabilise
FROM activite.p_factures_soldes_c
JOIN activite.p_factures ON p_factures_soldes_c.no_facture = p_factures.no_facture
WHERE p_factures.tiers_payant_22_id > 0 AND
(
p_factures_soldes_c.montant_comptabilise_22 <> 0 OR
p_factures_soldes_c.montant_regle_22 <> 0
);
SELECT base.cti_enable_index('activite', 'i_facture_solde_tiers_c_1');
SELECT base.cti_enable_index('activite', 'i_facture_solde_tiers_c_2');
SELECT base.cti_enable_index('activite', 'i_facture_solde_tiers_c_3');
SELECT base.cti_enable_index('activite', 'i_facture_solde_tiers_c_4');
SELECT base.cti_enable_index('activite', 'i_facture_solde_tiers_c_5');
SELECT base.cti_enable_index('activite', 'i_facture_solde_tiers_c_8');
-- Nouvelle table des honoraires
SELECT base.cti_disable_index('activite', 'i_facture_solde_tiers_h_1');
SELECT base.cti_disable_index('activite', 'i_facture_solde_tiers_h_2');
SELECT base.cti_disable_index('activite', 'i_facture_solde_tiers_h_3');
SELECT base.cti_disable_index('activite', 'i_facture_solde_tiers_h_4');
SELECT base.cti_disable_index('activite', 'i_facture_solde_tiers_h_5');
SELECT base.cti_disable_index('activite', 'i_facture_solde_tiers_h_8');
INSERT INTO activite.p_facture_solde_tiers_h
(
facture_id,
no_facture,
date_comptable,
rubrique_comptabilisation_id,
prestation_id,
tiers_payant_id,
montant_comptabilise,
montant_regle,
montant_comptabilise_0,
montant_regle_0,
od_avoir,
od_non_comptabilise
)
SELECT
facture_id,
p_factures_soldes_h.no_facture,
date_comptable,
rubrique_comptabilisee_id,
prestation_id,
tiers_payant_0_id AS tiers_payant_id,
montant_comptabilise_0,
montant_regle_0,
montant_comptabilise_0,
montant_regle_0,
od_avoir,
od_non_comptabilise
FROM activite.p_factures_soldes_h
JOIN activite.p_factures ON p_factures_soldes_h.no_facture = p_factures.no_facture
WHERE p_factures.tiers_payant_0_id > 0 AND
(
p_factures_soldes_h.montant_comptabilise_0 <> 0 OR
p_factures_soldes_h.montant_regle_0 <> 0
);
INSERT INTO activite.p_facture_solde_tiers_h
(
facture_id,
no_facture,
date_comptable,
rubrique_comptabilisation_id,
prestation_id,
tiers_payant_id,
montant_comptabilise,
montant_regle,
montant_comptabilise_1,
montant_regle_1,
od_avoir,
od_non_comptabilise
)
SELECT
facture_id,
p_factures_soldes_h.no_facture,
date_comptable,
rubrique_comptabilisee_id,
prestation_id,
tiers_payant_1_id AS tiers_payant_id,
montant_comptabilise_1,
montant_regle_1,
montant_comptabilise_1,
montant_regle_1,
od_avoir,
od_non_comptabilise
FROM activite.p_factures_soldes_h
JOIN activite.p_factures ON p_factures_soldes_h.no_facture = p_factures.no_facture
WHERE p_factures.tiers_payant_1_id > 0 AND
(
p_factures_soldes_h.montant_comptabilise_1 <> 0 OR
p_factures_soldes_h.montant_regle_1 <> 0
);
INSERT INTO activite.p_facture_solde_tiers_h
(
facture_id,
no_facture,
date_comptable,
rubrique_comptabilisation_id,
prestation_id,
tiers_payant_id,
montant_comptabilise,
montant_regle,
montant_comptabilise_2,
montant_regle_2,
od_avoir,
od_non_comptabilise
)
SELECT
facture_id,
p_factures_soldes_h.no_facture,
date_comptable,
rubrique_comptabilisee_id,
prestation_id,
tiers_payant_2_id AS tiers_payant_id,
montant_comptabilise_2,
montant_regle_2,
montant_comptabilise_2,
montant_regle_2,
od_avoir,
od_non_comptabilise
FROM activite.p_factures_soldes_h
JOIN activite.p_factures ON p_factures_soldes_h.no_facture = p_factures.no_facture
WHERE p_factures.tiers_payant_2_id > 0 AND
(
p_factures_soldes_h.montant_comptabilise_2 <> 0 OR
p_factures_soldes_h.montant_regle_2 <> 0
);
INSERT INTO activite.p_facture_solde_tiers_h
(
facture_id,
no_facture,
date_comptable,
rubrique_comptabilisation_id,
prestation_id,
tiers_payant_id,
montant_comptabilise,
montant_regle,
montant_comptabilise_2,
montant_regle_2,
od_avoir,
od_non_comptabilise
)
SELECT
facture_id,
p_factures_soldes_h.no_facture,
date_comptable,
rubrique_comptabilisee_id,
prestation_id,
tiers_payant_22_id AS tiers_payant_id,
montant_comptabilise_22,
montant_regle_22,
montant_comptabilise_22,
montant_regle_22,
od_avoir,
od_non_comptabilise
FROM activite.p_factures_soldes_h
JOIN activite.p_factures ON p_factures_soldes_h.no_facture = p_factures.no_facture
WHERE p_factures.tiers_payant_22_id > 0 AND
(
p_factures_soldes_h.montant_comptabilise_22 <> 0 OR
p_factures_soldes_h.montant_regle_22 <> 0
);
SELECT base.cti_enable_index('activite', 'i_facture_solde_tiers_h_1');
SELECT base.cti_enable_index('activite', 'i_facture_solde_tiers_h_2');
SELECT base.cti_enable_index('activite', 'i_facture_solde_tiers_h_3');
SELECT base.cti_enable_index('activite', 'i_facture_solde_tiers_h_4');
SELECT base.cti_enable_index('activite', 'i_facture_solde_tiers_h_5');
SELECT base.cti_enable_index('activite', 'i_facture_solde_tiers_h_8');
]]></sqlcmd>
</NODE>
<NODE label="Interventions">
<condition><![CDATA[
"[PX]" == ""
]]></condition>
<sqlcmd><![CDATA[
DROP TABLE IF EXISTS w_intervention;
CREATE TEMP TABLE w_intervention AS
SELECT
sejour_id,
p_factures_lignes_h.date_debut,
p_factures_lignes_h.heure_debut,
(MAX(CASE WHEN t_prestations.code IN ('ADC','ACO') THEN Array[icr_1,COALESCE(acte_id,0)] ELSE null END))[2] AS acte_id,
(MAX(CASE WHEN t_prestations.code IN ('ADC','ACO') THEN Array[icr_1,medecin_facture_id] ELSE NULL END))[2] AS medecin_chirurgien_id,
(MAX(CASE WHEN t_prestations.code IN ('ADA') THEN Array[icr_1,medecin_facture_id] ELSE NULL END))[2] AS medecin_anesthesiste_id
FROM
activite[PX].p_factures_lignes_h
JOIN activite[PX].p_factures ON p_factures_lignes_h.no_facture = p_factures.no_facture
JOIN base.t_actes ON acte_id = t_actes.oid
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
WHERE
t_prestations.code IN ('ADC', 'ACO', 'ADA') AND
t_actes.code NOT LIKE 'YYYY%'
GROUP BY 1,2,3
HAVING MAX(CASE WHEN t_prestations.code IN ('ADC','ACO') THEN acte_id ELSE 0 END) > 0 AND
SUM(nb_prestation) <> 0
ORDER BY 1,2,3;
INSERT INTO w_intervention
SELECT
sejour_id,
p_factures_lignes_non_facturees_h.date_debut,
p_factures_lignes_non_facturees_h.heure_debut,
(MAX(CASE WHEN t_prestations.code IN ('ADC','ACO') THEN Array[icr_1,COALESCE(acte_id,0)] ELSE null END))[2] AS acte_id,
(MAX(CASE WHEN t_prestations.code IN ('ADC','ACO') THEN Array[icr_1,medecin_facture_id] ELSE NULL END))[2] AS medecin_chirurgien_id,
(MAX(CASE WHEN t_prestations.code IN ('ADA') THEN Array[icr_1,medecin_facture_id] ELSE NULL END))[2] AS medecin_anesthesiste_id
FROM
activite.p_factures_lignes_non_facturees_h
JOIN activite.p_factures ON p_factures_lignes_non_facturees_h.no_facture = p_factures.no_facture
JOIN base.t_actes ON acte_id = t_actes.oid
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
WHERE
t_prestations.code IN ('ADC', 'ACO', 'ADA') AND
t_actes.code NOT LIKE 'YYYY%' AND
sejour_id NOT IN (SELECT sejour_id FROM w_intervention)
GROUP BY 1,2,3
HAVING MAX(CASE WHEN t_prestations.code IN ('ADC','ACO') THEN acte_id ELSE 0 END) > 0
ORDER BY 1,2,3;
TRUNCATE activite.p_intervention;
-- Ajout des conditions "sejour_id != 0 AND date_debut IS DISTINCT FROM NULL" pour dégager les lignes sans date de début et sans référence à un séjour existant
-- CLA 05/05/14
INSERT INTO activite.p_intervention (
sejour_id,
date_debut,
heure_debut,
salle_id,
medecin_chirurgien_id,
medecin_anesthesiste_id,
acte_id
)
SELECT
sejour_id,
date_debut,
heure_debut,
0::bigint AS salle_id,
COALESCE(medecin_chirurgien_id,0),
COALESCE(medecin_anesthesiste_id,0),
acte_id
FROM w_intervention
WHERE
sejour_id != 0 AND date_debut IS DISTINCT FROM NULL;
-- Ventilation selon date intervention
SELECT activite.cti_ventilation_lignes('activite.p_factures_lignes_c');
-- Suppression des tables de travail non utilisées après
DROP TABLE IF EXISTS w_intervention CASCADE;
]]></sqlcmd>
</NODE>
<NODE label="Budget">
<condition><![CDATA[
"[PX]" == ""
]]></condition>
<sqlcmd><![CDATA[
SELECT activite.cti_budget_generate_keys();
SELECT activite.cti_budget_execute_rules();
]]></sqlcmd>
</NODE>
<NODE label="Lien PMSI">
<condition><![CDATA[
"[PX]" == ""
]]></condition>
<sqlcmd><![CDATA[
SELECT activite.cti_reorganize_sejour_pmsi();
SELECT activite.cti_gen_dma_ssr();
-- mise à jour potentielle à partir des lots pour être cohérent (prioritaires dans pmsi)
SELECT base.cti_execute(
'UPDATE activite.p_sejours_transferts
SET
destination_id = etablissement_destination_id
FROM activite.p_sejour_pmsi
JOIN pmsi.p_rss_transferts ON p_sejour_pmsi.rss_id = p_rss_transferts.rss_id
JOIN base.t_etablissements ON etablissement_destination_id = t_etablissements.oid
WHERE p_sejours_transferts.sejour_id = p_sejour_pmsi.sejour_id AND
etablissement_destination_id > 0 AND
destination_id <> etablissement_destination_id AND
length(t_etablissements.code) = 9
.,
INSERT INTO activite.p_sejours_transferts(sejour_id, provenance_id, destination_id)
SELECT
sejour_id,
MAX(etablissement_provenance_id),
MAX(etablissement_destination_id)
FROM activite.p_sejour_pmsi
JOIN pmsi.p_rss_transferts ON p_sejour_pmsi.rss_id = p_rss_transferts.rss_id
WHERE
sejour_id NOT IN (SELECT sejour_id FROM activite.p_sejours_transferts)
GROUP BY 1
HAVING
(
MAX(etablissement_provenance_id) > 0 OR
MAX(etablissement_destination_id) > 0
)
',1)
WHERE 'p_rss' IN (SELECT tablename FROM pg_tables WHERE schemaname = 'pmsi' AND tablename = 'p_rss')
;
-- Ajustement chiffre d'affaire fil de l'eau PMSI
SELECT activite.cti_ajust_fildeleau_rsf()
;
]]></sqlcmd>
</NODE>
<NODE label="Corrections séjours">
<condition><![CDATA[
"[PX]" == ""
]]></condition>
<sqlcmd><![CDATA[
-- Etablissements transfert vide
INSERT INTO activite.p_sejours_transferts(sejour_id, provenance_id,destination_id)
SELECT oid, 0, 0
FROM activite.p_sejours
WHERE p_sejours.oid NOT IN (SELECT sejour_id FROM activite.p_sejours_transferts)
;
-- Màj des médecins séjour d'après les médecins actes si pas encore de médecin RSS dans p_séjours
-- et qu'il y a des exécutants renseignés dans p_factures_lignes_h
-- On prend l'exécutant de l'acte avec le plus fort ICR
DROP TABLE IF EXISTS w_executants;
CREATE TEMP TABLE w_executants AS
SELECT
p_sejours.oid AS sejour_id,
(MAX(ARRAY[t_actes.icr_1, p_factures_lignes_h.montant_facture+p_factures_lignes_h.montant_encours,p_factures_lignes_h.medecin_facture_id]))[3] as medecin_id
FROM activite.p_factures_lignes_h
JOIN activite.p_factures on p_factures.oid = p_factures_lignes_h.facture_id
JOIN activite.p_sejours on p_sejours.no_sejour = p_factures.no_sejour
JOIN base.t_actes ON acte_id = t_actes.oid
WHERE acte_id <> 0
AND medecin_sejour_id = 0
AND activite_ccam <> '4'
AND medecin_facture_id != 0
AND type_sejour IN ('2','3','4')
GROUP BY 1;
UPDATE activite.p_sejours SET
medecin_sejour_id = w_executants.medecin_id
FROM w_executants
WHERE 1=1
AND w_executants.sejour_id = p_sejours.oid
AND p_sejours.medecin_sejour_id = 0;
UPDATE activite.p_mouvements_sejour
SET medecin_sejour_id = p_sejours.medecin_sejour_id
FROM activite.p_sejours
WHERE p_sejours.no_sejour = p_mouvements_sejour.no_sejour AND
p_sejours.medecin_sejour_id <> p_mouvements_sejour.medecin_sejour_id
;
]]></sqlcmd>
</NODE>
<NODE label="Chiffrier CTI">
<condition><![CDATA[
"[PX]" == ""
]]></condition>
<sqlcmd><![CDATA[
TRUNCATE activite[PX].p_chiffrier
;
INSERT INTO activite[PX].p_chiffrier (mois)
SELECT mois
FROM (
SELECT DISTINCT to_char(date_sortie, 'YYYYMM')::numeric AS mois FROM activite[PX].p_sejours
WHERE date_sortie >= 20100101 AND to_char(date_sortie, 'YYYYMM')::numeric <= to_char(now() + interval '1 month', 'YYYYMM')::numeric
) subview
;
DELETE FROM activite[PX].p_chiffrier WHERE mois > to_char(now() + interval '1 month', 'YYYYMM')::numeric
;
]]></sqlcmd>
</NODE>
<NODE label="Calculs divers">
<condition><![CDATA[
"[PX]" == ""
]]></condition>
<sqlcmd><![CDATA[
-- Génération lignes fictive clinique pour facturation uniquement honoraires
SELECT activite.cti_gen_0ets();
-- Calcule moyen 12 derniers mois glissants
DROP TABLE IF EXISTS w_chiffrier;
CREATE TEMP TABLE w_chiffrier AS
SELECT
date(date_trunc('month',date_comptable) + interval '1 month' - interval '1 day') AS date_comptable,
SUM(montant_comptabilise) AS montant_comptabilise,
SUM(montant_regle) AS montant_regle,
COUNT(DISTINCT CASE WHEN date_trunc('month', p_factures.date_vente) = date_trunc('month', date_comptable) THEN p_factures.no_sejour ELSE null END) AS nb_sejour,
0::numeric AS montant_solde,
0::numeric AS montant_encours_cti,
0::numeric AS montant_encours_prs,
0::numeric AS montant_report_encours_cti,
0::numeric AS montant_report_encours_prs
FROM activite.p_factures_soldes_c p_factures_soldes
JOIN activite.p_factures ON p_factures_soldes.no_facture = p_factures.no_facture
WHERE date_comptable <= date(date_trunc('month',now()) + interval '1 month' - interval '1 day')
GROUP BY 1
ORDER BY 1;
UPDATE w_chiffrier
SET montant_solde =
(SELECT SUM(montant_comptabilise - montant_regle)
FROM w_chiffrier w_chiffrier_histo
WHERE w_chiffrier_histo.date_comptable <= w_chiffrier.date_comptable);
-- Reprise des encours
UPDATE w_chiffrier SET
montant_encours_cti = subview.montant_encours_cti,
montant_encours_prs = subview.montant_encours_prs
FROM
(
SELECT
date(date_trunc('month',date_encours) + interval '1 month' - interval '1 day') AS date_comptable,
SUM(CASE WHEN code_origine = 'C' THEN montant_encours_c ELSE 0 END) AS montant_encours_cti,
SUM(CASE WHEN code_origine = 'P' THEN montant_encours_c ELSE 0 END) AS montant_encours_prs
FROM activite.p_factures_encours
GROUP BY 1
) subview
WHERE w_chiffrier.date_comptable = subview.date_comptable;
UPDATE w_chiffrier SET
montant_report_encours_cti = w_chiffrier_2.montant_encours_cti
FROM w_chiffrier w_chiffrier_2
WHERE date_trunc('month',w_chiffrier.date_comptable) - interval '1 month' =
date_trunc('month',w_chiffrier_2.date_comptable)
;
-- occupation
DROP TABLE IF EXISTS w_chiffrier_dt_occ;
CREATE TEMP TABLE w_chiffrier_dt_occ AS
SELECT
date(date_trunc('month',date_fin) + interval '1 month' - interval '1 day') AS date_occupation,
SUM(v_factures_lignes_c_5.montant_facture) + SUM(v_factures_lignes_c_5.montant_encours) AS montant_comptabilise_dt_occ,
COUNT(DISTINCT v_factures_lignes_c_5.no_sejour ) AS nb_sejour_dt_occ
FROM activite.v_factures_lignes_c_5
JOIN activite.v_factures_reference_1 ON (v_factures_lignes_c_5.no_sejour = v_factures_reference_1.no_sejour)
where date(date_trunc('month',date_fin) + interval '1 month' - interval '1 day') <= (select max(valeur) from activite.t_divers where code ilike 'NOWCLOTURE')
GROUP BY 1
ORDER BY 1;
--sortie
DROP TABLE IF EXISTS w_chiffrier_dt_sor;
CREATE TEMP TABLE w_chiffrier_dt_sor AS
SELECT
date(date_trunc('month',date_fin_facture) + interval '1 month' - interval '1 day') AS date_sortie,
SUM(v_factures_reference_1.montant_facture_c) + SUM(v_factures_reference_1.montant_encours_c) AS montant_comptabilise_dt_sor,
COUNT(DISTINCT v_factures_reference_1 ) AS nb_sejour_dt_sor
FROM activite.v_factures_reference_1
where date(date_trunc('month',date_fin_facture) + interval '1 month' - interval '1 day') <= (select max(valeur) from activite.t_divers where code ilike 'NOWCLOTURE')
GROUP BY 1
ORDER BY 1;
--groupage
DROP TABLE IF EXISTS w_chiffrier_dt_grp;
CREATE TEMP TABLE w_chiffrier_dt_grp AS
SELECT
date(date_trunc('month',date_groupage) + interval '1 month' - interval '1 day') AS date_groupage,
SUM(v_factures_reference_1.montant_facture_c) + SUM(v_factures_reference_1.montant_encours_c) AS montant_comptabilise_dt_grp,
COUNT(DISTINCT v_factures_reference_1 ) AS nb_sejour_dt_grp
FROM activite.v_factures_reference_1
where date(date_trunc('month',date_groupage) + interval '1 month' - interval '1 day') <= (select max(valeur) from activite.t_divers where code ilike 'NOWCLOTURE')
GROUP BY 1
ORDER BY 1;
-- table resultat_glob
DROP TABLE IF EXISTS activite.p_chiffrier_data_calcule_gliss;
CREATE TABLE activite.p_chiffrier_data_calcule_gliss AS
select * from w_chiffrier
LEFT JOIN w_chiffrier_dt_occ ON w_chiffrier_dt_occ.date_occupation = w_chiffrier.date_comptable
LEFT JOIN w_chiffrier_dt_sor ON w_chiffrier_dt_sor.date_sortie = w_chiffrier.date_comptable
LEFT JOIN w_chiffrier_dt_grp ON w_chiffrier_dt_grp.date_groupage = w_chiffrier.date_comptable;
DROP TABLE IF EXISTS activite.p_chiffrier_resultat_calcule_gliss;
CREATE TABLE activite.p_chiffrier_resultat_calcule_gliss AS
select p_chiffrier_data_calcule_gliss.date_comptable as date_comptable,
mois_texte ||' '|| iso_annee as texte,
('Du '|| (select mois_texte ||' '||iso_annee from base.p_calendrier where date = (p_chiffrier_data_calcule_gliss.date_comptable - interval '1 year' + interval '1 day')::date) || ' au ' || (mois_texte ||' '||iso_annee)) as periode,
AVG(w_chiffrier_glis.montant_comptabilise) as mt_cpt,
AVG(w_chiffrier_glis.montant_comptabilise)/20 as mt_cpt_j,
AVG(w_chiffrier_glis.montant_regle) as mt_reg,
AVG(w_chiffrier_glis.montant_regle)/20 as mt_reg_j,
AVG(w_chiffrier_glis.nb_sejour) as nb_sej,
AVG(w_chiffrier_glis.nb_sejour)/20 as nb_sej_j,
AVG(w_chiffrier_glis.montant_solde) as mt_sol,
AVG(w_chiffrier_glis.montant_solde)/20 as mt_sol_j,
AVG(w_chiffrier_glis.montant_comptabilise + w_chiffrier_glis.montant_encours_cti - w_chiffrier_glis.montant_report_encours_cti ) as mt_act_cpt,
AVG(w_chiffrier_glis.montant_comptabilise + w_chiffrier_glis.montant_encours_cti - w_chiffrier_glis.montant_report_encours_cti )/20 as mt_act_cpt_j,
AVG(w_chiffrier_glis.nb_sejour_dt_occ) as nb_sej_dt_occ,
AVG(w_chiffrier_glis.nb_sejour_dt_occ)/20 as nb_sej_dt_occ_j,
AVG(w_chiffrier_glis.montant_comptabilise_dt_occ) as mt_cpt_occ,
AVG(w_chiffrier_glis.montant_comptabilise_dt_occ)/20 as mt_cpt_occ_j,
AVG(w_chiffrier_glis.nb_sejour_dt_sor) as nb_sej_dt_sor,
AVG(w_chiffrier_glis.nb_sejour_dt_sor)/20 as nb_sej_dt_sor_j,
AVG(w_chiffrier_glis.montant_comptabilise_dt_sor) as mt_cpt_sor,
AVG(w_chiffrier_glis.montant_comptabilise_dt_sor)/20 as mt_cpt_sor_j,
AVG(w_chiffrier_glis.nb_sejour_dt_grp) as nb_sej_dt_grp,
AVG(w_chiffrier_glis.nb_sejour_dt_grp)/20 as nb_sej_dt_grp_j,
AVG(w_chiffrier_glis.montant_comptabilise_dt_grp) as mt_cpt_grp,
AVG(w_chiffrier_glis.montant_comptabilise_dt_grp)/20 as mt_cpt_grp_j
from activite.p_chiffrier_data_calcule_gliss
JOIN base.p_calendrier ON p_chiffrier_data_calcule_gliss.date_comptable = p_calendrier.date
LEFT JOIN activite.p_chiffrier_data_calcule_gliss w_chiffrier_glis on w_chiffrier_glis.date_comptable between p_chiffrier_data_calcule_gliss.date_comptable - interval '1 year' + interval '1 day' and p_chiffrier_data_calcule_gliss.date_comptable
where p_chiffrier_data_calcule_gliss.date_comptable BETWEEN 2012 AND EXTRACT(YEAR FROM NOW()) + 1
AND p_chiffrier_data_calcule_gliss.date_comptable <= (select max(valeur) from activite.t_divers where code ilike 'NOWCLOTURE')
group by 1,2 order by 1 ;
-- Calcul effet prix GHS
SELECT activite.cti_gen_sejour_effet_tarif();
-- Calcule durée d'occupation par SERVICE/UF/UM/ETAGE/LIT
SELECT activite.cti_calc_duree_occupation();
]]></sqlcmd>
</NODE>
<NODE label="Correction table des mouvements">
<condition><![CDATA[
"[PX]" == ""
]]></condition>
<sqlcmd><![CDATA[
--Selon les prestataires le sejour_id est vide
UPDATE activite[PX].p_mouvements_sejour
SET sejour_id = p_sejours.oid
FROM activite[PX].p_sejours
WHERE true
AND p_mouvements_sejour.no_sejour = p_sejours.no_sejour
AND p_mouvements_sejour.sejour_id = 0
AND p_sejours.oid != 0
;
]]></sqlcmd>
</NODE>
<NODE label="Formes d'activité">
<condition><![CDATA[
"[PX]" == ""
]]></condition>
<sqlcmd><![CDATA[
SELECT activite.cti_reorganize_forme_activite()
;
SELECT activite.cti_filiere_soin_execute_rule()
;
SELECT activite.cti_execute_compte_produit_analytique_rule()
;
]]></sqlcmd>
</NODE>
<NODE label="Référencements">
<condition><![CDATA[
"[PX]" == ""
]]></condition>
<sqlcmd><![CDATA[
-- Oids
INSERT INTO activite[PX].p_oids (code_table, oid)
SELECT 'dursej', date_sortie - date_entree
FROM activite[PX].p_sejours
WHERE date_sortie - date_entree NOT IN (SELECT oid FROM activite[PX].p_oids WHERE code_table = 'dursej')
AND date_sortie >= date_entree
AND date_sortie < '2099-12-31'::date
GROUP BY 2
ORDER BY 2;
INSERT INTO activite[PX].p_oids (code_table, oid)
SELECT 'c_postaux', code_postal_id
FROM activite[PX].p_sejours
WHERE code_postal_id NOT IN (SELECT oid FROM activite[PX].p_oids WHERE code_table = 'c_postaux')
GROUP BY 2;
INSERT INTO activite.p_oids (code_table, oid)
SELECT 'forme_activite', forme_activite_id
FROM activite.p_sejours
WHERE forme_activite_id NOT IN (SELECT oid FROM activite.p_oids WHERE code_table = 'forme_activite')
GROUP BY 2;
INSERT INTO activite[PX].p_oids (code_table, oid)
SELECT 'medecin_s', medecin_sejour_id
FROM activite[PX].p_sejours
WHERE medecin_sejour_id NOT IN (SELECT oid FROM activite[PX].p_oids WHERE code_table = 'medecin_s')
GROUP BY 2;
INSERT INTO activite[PX].p_oids (code_table, oid)
SELECT 'medecin_s', medecin_sejour_id
FROM activite[PX].p_mouvements_sejour
WHERE medecin_sejour_id NOT IN (SELECT oid FROM activite[PX].p_oids WHERE code_table = 'medecin_s')
GROUP BY 2;
INSERT INTO activite[PX].p_oids (code_table, oid)
SELECT 'ghs', ghs_id
FROM activite[PX].p_sejours
WHERE ghs_id NOT IN (SELECT oid FROM activite[PX].p_oids WHERE code_table = 'ghs')
GROUP BY 2;
INSERT INTO activite[PX].p_oids (code_table, oid)
SELECT 'ghm', ghm_id
FROM activite[PX].p_sejours
WHERE ghm_id NOT IN (SELECT oid FROM activite[PX].p_oids WHERE code_table = 'ghm')
GROUP BY 2;
INSERT INTO activite[PX].p_oids (code_table, oid)
SELECT 'ghs', ghs_id
FROM activite[PX].p_factures
WHERE ghs_id NOT IN (SELECT oid FROM activite[PX].p_oids WHERE code_table = 'ghs')
GROUP BY 2;
INSERT INTO activite[PX].p_oids (code_table, oid)
SELECT 'medecin_x', medecin_facture_id
FROM activite[PX].p_factures_lignes_h
WHERE medecin_facture_id NOT IN (SELECT oid FROM activite[PX].p_oids WHERE code_table = 'medecin_x')
GROUP BY 2;
INSERT INTO activite[PX].p_oids (code_table, oid)
SELECT 'gme', gme_id
FROM activite[PX].p_sejours
WHERE gme_id NOT IN (SELECT oid FROM activite[PX].p_oids WHERE code_table = 'gme')
GROUP BY 2;
INSERT INTO activite[PX].p_oids (code_table, oid)
SELECT 'ghmgme', ghmgme_id
FROM activite[PX].p_sejours
WHERE ghmgme_id NOT IN (SELECT oid FROM activite[PX].p_oids WHERE code_table = 'ghmgme')
GROUP BY 2;
INSERT INTO activite[PX].p_oids (code_table, oid)
SELECT 'rubrique_c', rubrique_facturation_id
FROM activite[PX].p_factures_lignes_c WHERE rubrique_facturation_id NOT IN (SELECT oid FROM activite[PX].p_oids WHERE code_table = 'rubrique_c')
GROUP BY 2;
INSERT INTO activite[PX].p_oids (code_table, oid)
SELECT 'rubrique_c', rubrique_comptabilisation_id
FROM activite[PX].p_factures_lignes_c WHERE rubrique_comptabilisation_id NOT IN (SELECT oid FROM activite[PX].p_oids WHERE code_table = 'rubrique_c')
GROUP BY 2;
INSERT INTO activite[PX].p_oids (code_table, oid)
SELECT 'rubrique_c', rubrique_facturation_id
FROM activite[PX].p_factures_encours_lignes_c WHERE rubrique_facturation_id NOT IN (SELECT oid FROM activite[PX].p_oids WHERE code_table = 'rubrique_c')
GROUP BY 2;
INSERT INTO activite[PX].p_oids (code_table, oid)
SELECT 'rubrique_c', rubrique_comptabilisee_id
FROM activite[PX].p_factures_soldes_c WHERE rubrique_comptabilisee_id NOT IN (SELECT oid FROM activite[PX].p_oids WHERE code_table = 'rubrique_c')
GROUP BY 2;
INSERT INTO activite[PX].p_oids (code_table, oid)
SELECT 'prestation_c', prestation_id
FROM activite[PX].p_factures_lignes_c WHERE prestation_id NOT IN (SELECT oid FROM activite[PX].p_oids WHERE code_table = 'prestation_c')
GROUP BY 2;
INSERT INTO activite[PX].p_oids (code_table, oid)
SELECT 'prestation_c', prestation_id
FROM activite[PX].p_factures_encours_lignes_c WHERE prestation_id NOT IN (SELECT oid FROM activite[PX].p_oids WHERE code_table = 'prestation_c')
GROUP BY 2;
INSERT INTO activite[PX].p_oids (code_table, oid)
SELECT 'lpp', lpp_id
FROM activite[PX].p_factures_lignes_c WHERE lpp_id NOT IN (SELECT oid FROM activite[PX].p_oids WHERE code_table = 'lpp')
GROUP BY 2;
INSERT INTO activite[PX].p_oids (code_table, oid)
SELECT 'ucd', ucd_id
FROM activite[PX].p_factures_lignes_c WHERE ucd_id NOT IN (SELECT oid FROM activite[PX].p_oids WHERE code_table = 'ucd')
GROUP BY 2;
INSERT INTO activite[PX].p_oids (code_table, oid)
SELECT 'prestation_c', prestation_id
FROM activite[PX].p_factures_soldes_c WHERE prestation_id NOT IN (SELECT oid FROM activite[PX].p_oids WHERE code_table = 'prestation_c')
GROUP BY 2;
INSERT INTO activite[PX].p_oids (code_table, oid)
SELECT 'prestation_h', prestation_id
FROM activite[PX].p_factures_lignes_h WHERE prestation_id NOT IN (SELECT oid FROM activite[PX].p_oids WHERE code_table = 'prestation_h')
GROUP BY 2;
INSERT INTO activite[PX].p_oids (code_table, oid)
SELECT 'acte_h', acte_id
FROM activite[PX].p_factures_lignes_h WHERE acte_id NOT IN (SELECT oid FROM activite[PX].p_oids WHERE code_table = 'acte_h')
GROUP BY 2;
INSERT INTO activite[PX].p_oids (code_table, oid)
SELECT 'protocole_h', protocole_id
FROM activite[PX].p_factures_lignes_h WHERE protocole_id NOT IN (SELECT oid FROM activite[PX].p_oids WHERE code_table = 'protocole_h')
GROUP BY 2;
INSERT INTO activite[PX].p_oids (code_table, oid)
SELECT 'tiers_payant', tiers_payant_0_id
FROM activite[PX].p_factures WHERE tiers_payant_0_id <> 0 AND tiers_payant_0_id NOT IN (SELECT oid FROM activite[PX].p_oids WHERE code_table = 'tiers_payant')
GROUP BY 2;
INSERT INTO activite[PX].p_oids (code_table, oid)
SELECT 'tiers_payant', tiers_payant_1_id
FROM activite[PX].p_factures WHERE tiers_payant_1_id <> 0 AND tiers_payant_1_id NOT IN (SELECT oid
FROM activite[PX].p_oids WHERE code_table = 'tiers_payant')
GROUP BY 2;
INSERT INTO activite[PX].p_oids (code_table, oid)
SELECT 'tiers_payant', tiers_payant_2_id
FROM activite[PX].p_factures WHERE tiers_payant_2_id <> 0 AND tiers_payant_2_id NOT IN (SELECT oid FROM activite[PX].p_oids WHERE code_table = 'tiers_payant')
GROUP BY 2;
INSERT INTO activite[PX].p_oids (code_table, oid)
SELECT 'tiers_payant', tiers_payant_22_id
FROM activite[PX].p_factures WHERE tiers_payant_22_id <> 0 AND tiers_payant_22_id NOT IN (SELECT oid FROM activite[PX].p_oids WHERE code_table = 'tiers_payant')
GROUP BY 2;
INSERT INTO activite[PX].p_oids (code_table, oid)
SELECT 'mode_traitement', t_services_facturation.mode_traitement_id
FROM activite[PX].t_lieux JOIN activite[PX].t_services_facturation ON service_facturation_id = t_services_facturation.oid
WHERE
t_services_facturation.mode_traitement_id NOT IN (SELECT oid FROM activite[PX].p_oids WHERE code_table = 'mode_traitement' AND oid IS NOT NULL) AND t_services_facturation.mode_traitement_id IS NOT NULL
GROUP BY 2;
INSERT INTO activite[PX].p_oids (code_table, oid)
SELECT 'lit', lit_id
FROM activite[PX].t_lieux WHERE lit_id NOT IN (SELECT oid FROM activite[PX].p_oids WHERE code_table = 'lit')
GROUP BY 2;
INSERT INTO activite[PX].p_oids (code_table, oid)
SELECT 'service', service_facturation_id
FROM activite[PX].t_lieux WHERE service_facturation_id NOT IN (SELECT oid FROM activite[PX].p_oids WHERE code_table = 'service')
GROUP BY 2;
INSERT INTO activite[PX].p_oids (code_table, oid)
SELECT 'activite', activite_id
FROM activite[PX].t_lieux WHERE activite_id NOT IN (SELECT oid FROM activite[PX].p_oids WHERE code_table = 'activite')
GROUP BY 2;
INSERT INTO activite[PX].p_oids (code_table, oid)
SELECT 'etage', etage_id
FROM activite[PX].t_lieux, activite[PX].t_lits WHERE lit_id = t_lits.oid AND etage_id NOT IN (SELECT oid FROM activite[PX].p_oids WHERE code_table = 'etage')
GROUP BY 2;
INSERT INTO activite[PX].p_oids (code_table, oid)
SELECT 'compte', compte_produit_id
FROM activite[PX].p_factures_lignes_c WHERE compte_produit_id NOT IN (SELECT oid FROM activite[PX].p_oids WHERE code_table = 'compte')
GROUP BY 2;
INSERT INTO activite[PX].p_oids (code_table, oid)
SELECT 'compte', compte_produit_analytique_id
FROM activite[PX].p_factures_lignes_c WHERE compte_produit_analytique_id NOT IN (SELECT oid FROM activite[PX].p_oids WHERE code_table = 'compte')
GROUP BY 2;
INSERT INTO activite[PX].p_oids (code_table, oid)
SELECT 'uf', unite_fonctionnelle_id
FROM activite[PX].t_lieux WHERE unite_fonctionnelle_id NOT IN (SELECT oid FROM activite[PX].p_oids WHERE code_table = 'uf')
GROUP BY 2;
INSERT INTO activite[PX].p_oids (code_table, oid)
SELECT 'um', unite_medicale_id
FROM activite[PX].t_lieux WHERE unite_medicale_id NOT IN (SELECT oid FROM activite[PX].p_oids WHERE code_table = 'um')
GROUP BY 2;
INSERT INTO activite[PX].p_oids (code_table, oid)
SELECT 'medecin_t', medecin_traitant_id
FROM activite[PX].p_sejours
WHERE medecin_traitant_id NOT IN (SELECT oid FROM activite[PX].p_oids WHERE code_table = 'medecin_t')
GROUP BY 2;
INSERT INTO activite[PX].p_oids (code_table, oid)
SELECT 'filiere_soin', filiere_soin_principale_id
FROM activite[PX].p_sejours
WHERE filiere_soin_principale_id NOT IN (SELECT oid FROM activite[PX].p_oids WHERE code_table = 'filiere_soin')
GROUP BY 2;
]]></sqlcmd>
</NODE>
<NODE label="Tables répliquées">
<condition><![CDATA[
"[PX]" == ""
]]></condition>
<sqlcmd><![CDATA[
SELECT activite[PX].cti_reorganize_ghs_c();
SELECT activite[PX].cti_reorganize_ghm_c();
SELECT activite[PX].cti_reorganize_gmt_c();
SELECT activite[PX].cti_reorganize_gme_c();
SELECT activite[PX].cti_reorganize_actes_c();
SELECT activite[PX].cti_reorganize_lieux_c();
SELECT activite[PX].cti_reorganize_medecins_administratifs_c();
SELECT activite[PX].cti_reorganize_tiers_payant();
SELECT activite[PX].cti_reorganize_ages_c();
SELECT base.cti_reorganize_codes_postaux_c('activite');
SELECT activite[PX].cti_reorganize_durees_sejour_c();
SELECT activite.cti_reorganize_finess_c();
SELECT activite.cti_reorganize_ucd_lpp_c();
SELECT activite[PX].cti_reorganize_controle_chiffrier();
SELECT activite[PX].cti_update_schema_classes('*ALL');
SELECT activite.cti_now('NOW','FORCE');
SELECT activite.cti_now('NOWCLOTURE','FORCE');
]]></sqlcmd>
</NODE>
<NODE label="Poles">
<condition><![CDATA[
"[PX]" == ""
]]></condition>
<sqlcmd><![CDATA[
SELECT activite.cti_reorganize_pole()
;
INSERT INTO activite.p_oids (code_table, oid)
SELECT 'pole', pole_id
FROM activite.p_mouvements_sejour
WHERE pole_id NOT IN (SELECT oid FROM activite.p_oids WHERE code_table = 'pole')
GROUP BY 2;
INSERT INTO activite.p_oids (code_table, oid)
SELECT 'pole', pole_id
FROM activite.p_factures_lignes_c
WHERE pole_id NOT IN (SELECT oid FROM activite.p_oids WHERE code_table = 'pole')
GROUP BY 2;
]]></sqlcmd>
</NODE>
</NODE>
<NODE name="VACUUM" label="REORGANISATION BASE DE DONNEES">
<condition><![CDATA[
"[PX]" == ""
]]></condition>
<NODE label="Réorganisation tables">
<sqlcmd><![CDATA[
ANALYSE activite[PX].p_chiffrier_comptable;
ANALYSE activite[PX].p_chiffrier_shs;
ANALYSE activite[PX].p_ecriture_comptable;
VACUUM ANALYSE activite[PX].p_factures;
ANALYSE activite[PX].p_factures_comptables;
VACUUM ANALYSE activite[PX].p_factures_encours;
ANALYSE activite[PX].p_factures_encours_lignes_c;
ANALYSE activite[PX].p_factures_lignes_c;
ANALYSE activite[PX].p_factures_lignes_h;
ANALYSE activite[PX].p_factures_lignes_non_facturees_c;
ANALYSE activite[PX].p_factures_lignes_non_facturees_h;
ANALYSE activite[PX].p_factures_rejets;
ANALYSE activite[PX].p_factures_soldes_c;
ANALYSE activite[PX].p_factures_soldes_h;
ANALYSE activite[PX].p_intervention;
ANALYSE activite[PX].p_mouvements_sejour;
ANALYSE activite[PX].p_oids;
ANALYSE activite[PX].p_patients;
VACUUM ANALYSE activite[PX].p_sejours;
REINDEX TABLE activite[PX].p_sejours;
ANALYSE activite[PX].p_sejours_assurance;
ANALYSE activite[PX].t_activites;
ANALYSE activite[PX].t_classes;
ANALYSE activite[PX].t_classes_sections;
ANALYSE activite[PX].t_classes_sections_elements;
ANALYSE activite[PX].t_etages;
ANALYSE activite[PX].t_ghs_c;
ANALYSE activite[PX].t_indicateurs;
ANALYSE activite[PX].t_lieux;
ANALYSE activite[PX].t_lieux_c;
ANALYSE activite[PX].t_listes;
ANALYSE activite[PX].t_listes_contenu;
ANALYSE activite[PX].t_listes_tables;
ANALYSE activite[PX].t_lits;
ANALYSE activite[PX].t_medecins_administratifs;
ANALYSE activite[PX].t_medecins_administratifs_c;
ANALYSE activite[PX].t_prestations;
ANALYSE activite[PX].t_rapports;
ANALYSE activite[PX].t_rapports_rubriques;
ANALYSE activite[PX].t_rejets_noemie;
ANALYSE activite[PX].t_rubriques_facturation;
ANALYSE activite[PX].t_services_facturation;
ANALYSE activite[PX].t_specialites_medecin;
ANALYSE activite[PX].t_tiers_payant;
ANALYSE activite[PX].t_types_tiers_payant;
ANALYSE activite[PX].t_unites_fonctionnelles;
ANALYSE activite[PX].t_unites_medicales;
VACUUM ANALYSE activite[PX].p_bloc_occupation;
VACUUM ANALYSE activite[PX].p_coordonnees_patient;
VACUUM ANALYSE activite[PX].t_controle_chiffrier;
VACUUM ANALYSE activite[PX].t_etages;
VACUUM ANALYSE activite[PX].t_etages_historique;
VACUUM ANALYSE activite[PX].t_expert_controle;
VACUUM ANALYSE activite[PX].t_forme_activite_rule;
VACUUM ANALYSE activite[PX].t_lieux;
VACUUM ANALYSE activite[PX].t_rapport_group;
VACUUM ANALYSE activite[PX].t_services_facturation;
VACUUM ANALYSE activite[PX].t_services_facturation_historique;
VACUUM ANALYSE activite[PX].t_unites_fonctionnelles_historique;
VACUUM ANALYSE activite[PX].t_unites_medicales_historique;
-- indexes
REINDEX TABLE activite.p_factures;
REINDEX TABLE activite.p_factures_encours_lignes_c;
REINDEX TABLE activite.p_patients;
REINDEX TABLE activite.p_sejour_effet_tarif;
REINDEX TABLE activite.p_ecriture_comptable;
]]></sqlcmd>
</NODE>
<NODE label="Vide cache">
<sqlcmd><![CDATA[
SELECT cti_cache_reload as log from cache.cti_cache_reload('iCTI_activite', true);
]]></sqlcmd>
</NODE>
</NODE>
<NODE name="RAZ" label="RAZ BASE">
<NODE label="Parametres">
<sqlcmd><![CDATA[
SELECT activite[PX].cti_initialize_tables()
;
SELECT base.cti_verify_sequences('activite')
;
-- Initialisation table des prestations / ccam
INSERT INTO activite.t_prestations (code, texte, texte_court)
SELECT code, texte, texte
FROM base.t_ccam_regroupements
WHERE code NOT IN (SELECT code FROM activite.t_prestations) AND
code NOT IN ('NGAP','CCAM','CDAM') AND
length(code) = 3 AND
oid IN (SELECT ccam_regroupement_id_1 FROM base.t_actes) AND
code <> ''
;
]]></sqlcmd>
</NODE>
<NODE label="Nettoyage des tables">
<sqlcmd><![CDATA[
TRUNCATE activite[PX].p_chiffrier_comptable;
TRUNCATE activite[PX].p_factures_comptables;
TRUNCATE activite[PX].p_ecriture_comptable;
TRUNCATE activite[PX].p_patients;
TRUNCATE activite[PX].p_coordonnees_patient;
TRUNCATE activite[PX].p_sejours;
TRUNCATE activite[PX].p_sejours_groupes_smr;
TRUNCATE activite[PX].p_sejours_assurance;
TRUNCATE activite[PX].p_sejours_transferts;
ALTER SEQUENCE activite[PX].s_sejours RESTART WITH 1;
TRUNCATE activite[PX].p_mouvements_sejour;
TRUNCATE activite[PX].p_intervention;
-- Les Lieux ne sont plus effacés mais attention aux clés en double
--TRUNCATE activite[PX].t_lieux;
DROP TABLE IF EXISTS w_lieux
;
CREATE TEMP TABLE w_lieux AS
with lieux as (
SELECT
code_original_1,
code_original_2,
code_original_3,
code_original_4,
code_original_5,
code_original_6,
MIN(t_lieux.oid) AS keep_oid,
array_agg(oid) AS all_oid
FROM activite[PX].t_lieux
GROUP BY 1,2,3,4,5,6
HAVING count(*) > 1
)
select
keep_oid,
unnest(all_oid) as all_oid
from lieux
;
ANALYSE w_lieux
;
UPDATE activite[PX].p_factures_encours SET
lieu_sortie_id = keep_oid
FROM w_lieux
WHERE 1=1
AND lieu_sortie_id = all_oid
AND lieu_sortie_id != keep_oid
;
UPDATE activite[PX].p_factures_encours_lignes_c SET
lieu_id = keep_oid
FROM w_lieux
WHERE 1=1
AND lieu_id = all_oid
AND lieu_id != keep_oid
;
-- Report sur justificatif encours
UPDATE activite.p_facture_encours_ligne_valorise_c
SET lieu_id = p_factures_encours_lignes_c.lieu_id
FROM activite.p_factures_encours_lignes_c
WHERE p_facture_encours_ligne_valorise_c.no_facture = p_factures_encours_lignes_c.no_facture AND
p_facture_encours_ligne_valorise_c.date_debut = p_factures_encours_lignes_c.date_debut AND
p_facture_encours_ligne_valorise_c.prestation_id = p_factures_encours_lignes_c.prestation_id AND
p_facture_encours_ligne_valorise_c.lieu_id <> p_factures_encours_lignes_c.lieu_id
;
DELETE FROM activite[PX].t_lieux
USING w_lieux
WHERE 1=1
AND t_lieux.oid = w_lieux.all_oid
AND w_lieux.keep_oid != t_lieux.oid
;
--ALTER SEQUENCE activite[PX].s_lieux RESTART WITH 1;
TRUNCATE activite[PX].p_factures;
ALTER SEQUENCE activite[PX].s_factures RESTART WITH 1;
TRUNCATE activite[PX].p_factures_lignes_non_facturees_c;
TRUNCATE activite[PX].p_factures_lignes_non_facturees_h;
TRUNCATE activite[PX].p_factures_lignes_c;
TRUNCATE activite[PX].p_factures_lignes_h;
TRUNCATE activite[PX].p_factures_rejets;
TRUNCATE activite[PX].p_factures_soldes_c;
TRUNCATE activite[PX].p_facture_solde_tiers_c;
TRUNCATE activite[PX].p_factures_soldes_h;
TRUNCATE activite[PX].p_facture_solde_tiers_h;
TRUNCATE activite[PX].p_factures_comptables;
TRUNCATE activite[PX].p_factures_reference;
TRUNCATE activite[PX].p_factures_reference_tiers;
TRUNCATE activite[PX].p_intervention;
]]></sqlcmd>
</NODE>
<NODE label="Pré-initialisation">
<sqlcmd><![CDATA[
]]></sqlcmd>
</NODE>
</NODE>
</ROOT>