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.
 
 

6201 lines
350 KiB

return: text
lang: plpgsql
parameters:
p0:
type: date
name: i_date_encours
p1:
type: text
name: i_option
src: |
DECLARE
w_NOW date;
w_date_traitement date;
w_date_encours_actuelle date;
w_date_encours_actuelle_shs date;
w_date_encours date;
w_date_encours_YYMM text;
w_date_histo_18 date;
w_date_histo_12 date;
w_date_histo_xx date;
w_date_sortie_max date;
w_date_histo_coeff_presta date;
w_OPTION_ENCOURSVALOCP text;
w_OPTION_ENCOURSMCOSUP text;
_DATEENCOURS numeric;
_DATESTARTENCOURS date;
_NBSEJMIN_HISTOGHS numeric;
_ENCOURSECARTGHSV numeric;
_ENCOURSRETROSUP text;
w_nbsejours_min text;
w_simul text;
BEGIN
-- Date du jour = now sauf si date de fermeture
w_NOW = (SELECT
MIN(CASE WHEN code = 'DATEFERMETURE' AND
valeur <> '' AND
valeur < to_char(now(),'YYYYMMDD') THEN valeur::date
ELSE date(now()) END
)
FROM activite.t_divers)
;
RAISE NOTICE '%' , 'Parametres. Aujourd''hui : ' || w_NOW;
-- Ne rien calculer sur etablissement fermé
IF EXISTS (
SELECT valeur
FROM activite.t_divers
WHERE code IN ('DATEFERMETURE','ACT_DAT_FIN') AND
valeur <> '' AND
(
(
valeur_date IS NOT NULL AND
valeur_date < date(now())
) OR
valeur::date < date(now())
)
LIMIT 1
) THEN
DELETE FROM activite.p_factures_lignes_c WHERE montant_encours <> 0;
DELETE FROM activite.p_factures_lignes_h WHERE montant_encours <> 0;
DELETE
FROM activite.p_factures_lignes_c
USING activite.p_factures
WHERE p_factures_lignes_c.no_facture = p_factures.no_facture AND
p_factures.montant_encours_c <> 0
;
DELETE
FROM activite.p_factures_lignes_h
USING activite.p_factures
WHERE p_factures_lignes_h.no_facture = p_factures.no_facture AND
(p_factures.montant_encours_c <> 0 OR p_factures.montant_encours_h)
;
UPDATE activite.p_factures SET
montant_encours_c = 0,
montant_encours_0_c = 0,
montant_encours_1_c = 0,
montant_encours_2_c = 0,
montant_encours_22_c = 0,
montant_encours_h = 0,
montant_encours_0_h = 0,
montant_encours_1_h = 0,
montant_encours_2_h = 0,
montant_encours_22_h = 0
WHERE montant_encours_c <> 0 OR montant_encours_h <> 0;
TRUNCATE activite.p_facture_ligne_valorise_c
;
return 'Valorisation désactivée car établissement fermé';
END IF;
-- Paramétrage
INSERT INTO activite.t_divers (code, texte, valeur, description)
SELECT
'DATEENCOURS',
'Date cloture encours',
'5',
'Décalage pour cloture encours en nombre de jours '
WHERE 'DATEENCOURS' NOT IN (SELECT code FROM activite.t_divers);
_DATEENCOURS = base.cti_to_number((SELECT valeur FROM activite.t_divers WHERE code = 'DATEENCOURS'));
IF _DATEENCOURS <= 0 THEN
_DATEENCOURS = 5;
END IF;
INSERT INTO activite.t_divers (code, texte, valeur, description)
SELECT
'DATESTARTENCOURS',
'Date démarrage stockage encours encours',
'20110101',
'Date démarrage stockage encours encours (AAAAMMJJ)'
WHERE 'DATESTARTENCOURS' NOT IN (SELECT code FROM activite.t_divers);
_DATESTARTENCOURS = (SELECT base.cti_to_date(valeur) FROM activite.t_divers WHERE code = 'DATESTARTENCOURS');
IF _DATESTARTENCOURS < '20120101' OR _DATESTARTENCOURS IS NULL THEN
_DATESTARTENCOURS = '20120101';
END IF;
RAISE NOTICE '%' , 'Parametres. Demarrage en-cours : ' || _DATESTARTENCOURS;
_DATESTARTENCOURS = date_trunc('month',_DATESTARTENCOURS) - interval '1 day';
-- Paramètres pour génération fictive d'EXH
INSERT INTO activite.t_divers (code, texte, valeur, description)
SELECT
'ENCOURSBORNEHAUTE',
'Borne haute pour génération EXH en plus du GHS moyen',
'15',
'Borne haute pour génération EXH en plus du GHS moyen sur encours dossiers non groupés (voir ENCOURSEXHMOYEN)'
WHERE 'ENCOURSBORNEHAUTE' NOT IN (SELECT code FROM activite.t_divers);
INSERT INTO activite.t_divers (code, texte, valeur, description)
SELECT
'ENCOURSEXHMOYEN',
'EXH moyen pour génération EXH en plus du GHS moyen',
'50',
'Valeur EXH moyen pour génération EXH en plus du GHS moyen sur encours dossiers non groupés (voir ENCOURSBORNEHAUTE)'
WHERE 'ENCOURSEXHMOYEN' NOT IN (SELECT code FROM activite.t_divers);
-- Paramètres pour génération fictive GHS sur esthétique
INSERT INTO activite.t_divers (code, texte, valeur, description)
SELECT
'ENCOURSGHMSANSGHS',
'Pas de génération de GHS pour les GHM',
'14Z08Z',
'Pas de génération de GHS pour les GHM'
WHERE 'ENCOURSGHMSANSGHS' NOT IN (SELECT code FROM activite.t_divers);
-- Paramètres pour génération fictive GHS sur esthétique
INSERT INTO activite.t_divers (code, texte, valeur, description)
SELECT
'ENCOURSRETROSUP',
'Nombre de mois pour calcul taux prestations',
'18',
'18 ou 12'
WHERE 'ENCOURSRETROSUP' NOT IN (SELECT code FROM activite.t_divers);
_ENCOURSRETROSUP = (SELECT valeur FROM activite.t_divers WHERE code = 'ENCOURSRETROSUP');
-- Nombre de séjours minimum par catégorie (= par règle) d'historique de facturation du GHS
INSERT INTO activite.t_divers (code, texte, valeur, description)
SELECT
'NBSEJMIN_HISTOGHS',
'Histo factu GHS : nb séjours min',
'10',
'Valorisation : nombre minimum de séjours par catégorie pour l''historique de facturation GHS (par défaut 10)'
WHERE 'NBSEJMIN_HISTOGHS' NOT IN (SELECT code FROM activite.t_divers);
_NBSEJMIN_HISTOGHS = base.cti_to_number((SELECT valeur FROM activite.t_divers WHERE code = 'NBSEJMIN_HISTOGHS'));
IF _NBSEJMIN_HISTOGHS <= 0 THEN
_NBSEJMIN_HISTOGHS = 10;
END IF;
w_nbsejours_min = to_char(_NBSEJMIN_HISTOGHS, 'FM999');
INSERT INTO activite.t_divers (code, texte, valeur, description)
SELECT
'ENCOURSACTIVE',
'Encours activés',
'0',
'1 = Stockage des encours activé'
WHERE 'ENCOURSACTIVE' NOT IN (SELECT code FROM activite.t_divers);
INSERT INTO activite.t_divers (code, texte, valeur, description)
SELECT
'ENCOURSVALOCP',
'Valorisation CP',
'0',
'1 = Ne pas tenir compte de la demande CP dans la valorisation'
WHERE 'ENCOURSVALOCP' NOT IN (SELECT code FROM activite.t_divers);
w_OPTION_ENCOURSVALOCP = (SELECT valeur FROM activite.t_divers WHERE code = 'ENCOURSVALOCP');
INSERT INTO activite.t_divers (code, texte, valeur, description)
SELECT
'ENCOURSGHSMBB',
'GHS moyen des bébés sur encours',
'0',
'Pour les séjours en maternité sans GHS bébé, PU du GHS bébé à générer'
WHERE 'ENCOURSGHSMBB' NOT IN (SELECT code FROM activite.t_divers);
INSERT INTO activite.t_divers (code, texte, valeur, description)
SELECT
'ENCOURSMCOSUP',
'Valorisation Suppléments MCO',
'0',
'1 = Sur dossiers groupés validés, valoriser les suppléments (SRC,REA,NNx,STF) saisis (pour les autres utiliser la moyenne)'
WHERE 'ENCOURSMCOSUP' NOT IN (SELECT code FROM activite.t_divers);
w_OPTION_ENCOURSMCOSUP = (SELECT valeur FROM activite.t_divers WHERE code = 'ENCOURSMCOSUP');
-- Paramètres pour generation encours sur honoraires medecins salaries
INSERT INTO activite.t_divers (code, texte, valeur, description)
SELECT
'ENCOURSMEDSAL',
'Génération encours sur médecins salariés',
'0',
'1 = Génération encours sur médecins salariés'
WHERE 'ENCOURSMEDSAL' NOT IN (SELECT code FROM activite.t_divers);
-- Paramètres pour comparer ghs valorisé avec moyenne / médecin -> Alerte expert
INSERT INTO activite.t_divers (code, texte, valeur, description)
SELECT
'ENCOURSECARTGHSV',
'Montant écart pour alerter si le GHS connu est sous valorisé / moyenne médecin',
'0',
'Les GHS groupés sont valorisés aussi par la méthode des moyennes et les deux résultats sont comparés'
WHERE 'ENCOURSECARTGHSV' NOT IN (SELECT code FROM activite.t_divers);
_ENCOURSECARTGHSV = base.cti_to_number(valeur) FROM activite.t_divers WHERE code = 'ENCOURSECARTGHSV';
-- Paramètre pour génération des en-cours SUR BG
INSERT INTO activite.t_divers (code, texte, valeur, description)
SELECT
'ENCOURSACTIVEBG',
'Encours activés sur BG',
'0',
'1 = Stockage des encours BG activé'
WHERE 'ENCOURSACTIVEBG' NOT IN (SELECT code FROM activite.t_divers);
IF EXISTS (SELECT date_encours FROM activite.p_factures_encours LIMIT 1) THEN
UPDATE activite.t_divers
SET valeur = '1'
WHERE code = 'ENCOURSACTIVE';
END IF;
_DATEENCOURS = base.cti_to_number((SELECT valeur FROM activite.t_divers WHERE code = 'DATEENCOURS'));
IF _DATEENCOURS <= 0 THEN
_DATEENCOURS = 5;
END IF;
-- Initialisations
-- Mise à jour factures externes pour affecter à la date d'entrée
UPDATE activite.p_factures
SET date_fin = date_debut
FROM activite.p_sejours
WHERE p_factures.no_sejour = p_sejours.no_sejour AND
type_sejour = '3' AND
(
date_fin = date(date_debut + interval '1 day') OR
date_fin = '20991231'
)
;
-- Les GMT saisis en hospitalisation complète ne doivent pas être traités
DELETE FROM activite.p_factures_lignes_non_facturees_c
USING(
SELECT
no_facture
, prestation_id
FROM activite.p_factures_lignes_non_facturees_c
JOIN activite.t_prestations ON p_factures_lignes_non_facturees_c.prestation_id = t_prestations.oid
JOIN activite.t_lieux ON t_lieux.oid = p_factures_lignes_non_facturees_c.lieu_id
JOIN activite.t_services_facturation ON t_lieux.service_facturation_id = t_services_facturation.oid
JOIN base.t_modes_traitement ON t_services_facturation.mode_traitement_id = t_modes_traitement.oid
WHERE t_prestations.code = 'GMT'
AND t_modes_traitement.code = '03'
GROUP BY
no_facture
, prestation_id
) subview
WHERE
p_factures_lignes_non_facturees_c.no_facture = subview.no_facture
AND p_factures_lignes_non_facturees_c.prestation_id = subview.prestation_id
;
-- Initialisation des tiers payant sur les non facturés (cas de CEGI LOGHOS ou de SIGEMS, les tiers payant ne sont pas connu sur les non facturés
-- D'abord selon le tiers connu sur le patient
UPDATE activite.p_factures SET
tiers_payant_1_id = subview.tiers_payant_1_id,
tiers_payant_2_id = subview.tiers_payant_2_id
FROM
(
SELECT p_factures.no_facture, subview.tiers_payant_1_id, subview.tiers_payant_2_id
FROM activite.p_factures
JOIN activite.p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
JOIN
(
SELECT no_patient,
(MAX(ARRAY[date_entree::text,p_factures.tiers_payant_1_id::text]))[2]::bigint AS tiers_payant_1_id,
(MAX(ARRAY[date_entree::text,p_factures.tiers_payant_2_id::text]))[2]::bigint AS tiers_payant_2_id
FROM activite.p_factures
JOIN activite.p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
WHERE p_factures.tiers_payant_1_id <> 0
GROUP BY 1
) subview ON p_sejours.no_patient = subview.no_patient
WHERE p_factures.code_facture = '0' AND
p_factures.tiers_payant_1_id = 0
) subview
WHERE p_factures.no_facture = subview.no_facture
;
-- Pour le reste, le code NR1
UPDATE activite.p_factures
SET tiers_payant_1_id = t_tiers_payant.oid
FROM activite.t_tiers_payant
WHERE p_factures.code_facture = '0' AND
p_factures.tiers_payant_1_id = 0 AND
t_tiers_payant.code_original = '*CTINR1'
;
-- désactivation index
RAISE NOTICE '%' , 'Initialisations. Desactivation index';
PERFORM base.cti_disable_index('activite', 'i_factures_encours_2');
PERFORM base.cti_disable_index('activite', 'i_factures_encours_4');
PERFORM base.cti_disable_index('activite', 'i_factures_encours_5');
PERFORM base.cti_disable_index('activite', 'i_factures_encours_6');
PERFORM base.cti_disable_index('activite', 'i_factures_encours_7');
PERFORM base.cti_disable_index('activite', 'i_factures_encours_8');
PERFORM base.cti_disable_index('activite', 'i_factures_encours_9');
PERFORM base.cti_disable_index('activite', 'i_factures_encours_10');
PERFORM base.cti_disable_index('activite', 'i_factures_encours_11');
PERFORM base.cti_disable_index('activite', 'i_factures_encours_lignes_c_2');
PERFORM base.cti_disable_index('activite', 'i_factures_encours_lignes_c_3');
PERFORM base.cti_disable_index('activite', 'i_factures_encours_lignes_c_4');
PERFORM base.cti_disable_index('activite', 'i_factures_encours_lignes_c_5');
PERFORM base.cti_disable_index('activite', 'i_factures_encours_lignes_c_6');
PERFORM base.cti_disable_index('activite', 'i_factures_encours_lignes_c_7');
PERFORM base.cti_disable_index('activite', 'i_factures_encours_lignes_c_8');
RAISE NOTICE '%' , 'Initialisations. Creation tables de travail';
IF NOT EXISTS (SELECT * FROM pg_class WHERE relnamespace = pg_my_temp_schema() AND relname = 'w_cti_encours_calcul_parametres') THEN
CREATE TEMP TABLE w_cti_encours_calcul_parametres
(
date_encours date,
coefficient_mco numeric,
rubrique_facturation_ghs_id bigint,
rubrique_comptabilisation_ghs_id bigint,
prestation_ghs_id bigint,
rubrique_facturation_ghs_sea_id bigint,
rubrique_comptabilisation_ghs_sea_id bigint,
prestation_ghs_sea_id bigint,
rubrique_facturation_exh_id bigint,
rubrique_comptabilisation_exh_id bigint,
prestation_exh_id bigint,
rubrique_facturation_i01_id bigint,
rubrique_comptabilisation_i01_id bigint,
prestation_i01_id bigint
) ;
END IF;
IF NOT EXISTS (SELECT * FROM pg_class WHERE relnamespace = pg_my_temp_schema() AND relname = 'w_cti_encours_calcul_parametres_services') THEN
CREATE TEMP TABLE w_cti_encours_calcul_parametres_services
(
service_facturation_id bigint,
type_sejour text,
rubrique_facturation_ghs_id bigint,
prestation_ghs_id bigint,
rubrique_facturation_exh_id bigint,
prestation_exh_id bigint
);
END IF;
IF NOT EXISTS (SELECT * FROM pg_class WHERE relnamespace = pg_my_temp_schema() AND relname = 'w_cti_encours_calcul_parametres_services_prestations') THEN
CREATE TEMP TABLE w_cti_encours_calcul_parametres_services_prestations
(
coefficient_mco numeric,
lieu_service_id bigint,
lieu_unite_fonctionnelle_id bigint,
nb_ambulatoires numeric,
nb_externes numeric,
nb_seances numeric,
nb_journees numeric,
nb_journees_cp numeric,
prestation_id bigint,
prestation_code text,
tranche_ght text,
prestation_type_valorisation text,
rubrique_facturation_id bigint,
prix_unitaire numeric,
nombre numeric,
coefficient numeric,
prix_unitaire_moyen_1 numeric,
nb_prix_unitaire_moyen_1 numeric,
prix_unitaire_moyen_3 numeric,
nb_prix_unitaire_moyen_3 numeric,
prix_unitaire_moyen numeric,
regle_prestation_texte text,
coefficient_calcule numeric DEFAULT 0,
prix_unitaire_calcule numeric DEFAULT 0,
coefficient_is_force text DEFAULT '0',
prix_unitaire_is_force text DEFAULT '0',
type_ligne text DEFAULT '',
prestation_10p_code text DEFAULT '',
rubrique_code text DEFAULT '',
rubrique_10p_code text DEFAULT '',
prestation_10p_id bigint DEFAULT 0,
rubrique_10p_id bigint DEFAULT 0
);
END IF;
IF NOT EXISTS (SELECT * FROM pg_class WHERE relnamespace = pg_my_temp_schema() AND relname = 'w_cti_encours_calcul_parametres_services_journees') THEN
CREATE TEMP TABLE w_cti_encours_calcul_parametres_services_journees
(
lieu_service_id bigint,
lieu_unite_fonctionnelle_id bigint,
nb_ambulatoires numeric,
nb_externes numeric,
nb_seances numeric,
nb_journees bigint,
nb_journees_cp bigint
);
END IF;
IF NOT EXISTS (SELECT * FROM pg_class WHERE relnamespace = pg_my_temp_schema() AND relname = 'w_cti_encours_sejours') THEN
CREATE TEMP TABLE w_cti_encours_sejours
(
sejour_id bigint NOT NULL,
no_sejour text NOT NULL,
type_sejour character(1),
est_budget_global text,
secteur_tarif text default '2',
medecin_sejour_id bigint,
specialite_medecin_sejour_id bigint,
lieu_sortie_service_id bigint,
lieu_sortie_unite_fonctionnelle_id bigint,
code_sorti numeric(1),
lieu_sortie_id bigint,
mode_sortie character(1),
date_groupage date,
tiers_payant_1_id bigint,
tiers_payant_2_id bigint,
nb_ghs numeric,
ghm_id bigint,
ghs_id bigint,
ghs_bebe1_id bigint,
ghs_bebe2_id bigint,
ghs_bebe3_id bigint,
particularites_encours_service text,
type_t2a text,
CONSTRAINT w_cti_encours_sejours_pkey PRIMARY KEY (no_sejour)
) ;
END IF;
IF NOT EXISTS (SELECT * FROM pg_class WHERE relnamespace = pg_my_temp_schema() AND relname = 'w_cti_encours_histo_sejour_facture') THEN
CREATE TEMP TABLE w_cti_encours_histo_sejour_facture
(
no_sejour text,
date_fin date,
classe_ghm text default '',
medecin_sejour_id bigint,
specialite_medecin_sejour_id bigint,
lieu_sortie_service_id bigint,
lieu_sortie_unite_fonctionnelle_id bigint,
nb_ghs numeric,
tranche_sejour text,
duree_sejour integer,
montant_ghs numeric,
montant_ghs_original numeric,
taux_0 numeric,
taux_1 numeric,
taux_2 numeric
) ;
END IF;
IF NOT EXISTS (SELECT * FROM pg_class WHERE relnamespace = pg_my_temp_schema() AND relname = 'w_cti_encours_histo_ghs') THEN
CREATE TEMP TABLE w_cti_encours_histo_ghs
(
classe_ghm text,
regle text,
medecin_sejour_id bigint,
specialite_medecin_sejour_id bigint,
lieu_sortie_service_id bigint,
lieu_sortie_unite_fonctionnelle_id bigint,
tranche_sejour text,
duree_sejour integer,
nombre bigint,
montant_moyen_ghs numeric,
medecin_sejour_texte text default '',
specialite_medecin_sejour_texte text default '',
lieu_sortie_service_texte text default '',
lieu_sortie_unite_fonctionnelle_texte text default '',
tranche_sejour_texte text default '',
duree_sejour_texte text default ''
) ;
CREATE INDEX w_cti_encours_histo_ghs_i1
ON w_cti_encours_histo_ghs
USING btree
(medecin_sejour_id, lieu_sortie_service_id, lieu_sortie_unite_fonctionnelle_id)
;
END IF;
IF NOT EXISTS (SELECT * FROM pg_class WHERE relnamespace = pg_my_temp_schema() AND relname = 'w_cti_encours_histo_dms_sejours') THEN
CREATE TEMP TABLE w_cti_encours_histo_dms_sejours
(
no_sejour text,
medecin_sejour_id bigint,
specialite_medecin_sejour_id bigint,
lieu_sortie_service_id bigint,
lieu_sortie_unite_fonctionnelle_id bigint,
date_fin date,
date_debut date
) ;
END IF;
IF NOT EXISTS (SELECT * FROM pg_class WHERE relnamespace = pg_my_temp_schema() AND relname = 'w_cti_encours_histo_dms') THEN
CREATE TEMP TABLE w_cti_encours_histo_dms
(
regle text,
medecin_sejour_id bigint,
specialite_medecin_sejour_id bigint,
lieu_sortie_service_id bigint,
lieu_sortie_unite_fonctionnelle_id bigint,
dms numeric,
occurences bigint
) ;
END IF;
IF NOT EXISTS (SELECT * FROM pg_class WHERE relnamespace = pg_my_temp_schema() AND relname = 'w_cti_encours_ghm_sans_ghs') THEN
CREATE TEMP TABLE w_cti_encours_ghm_sans_ghs
(
ghm_id bigint
) ;
END IF;
TRUNCATE w_cti_encours_ghm_sans_ghs;
INSERT INTO w_cti_encours_ghm_sans_ghs
SELECT oid
FROM base.t_ghm
WHERE code IN ('14Z08Z')
;
INSERT INTO w_cti_encours_ghm_sans_ghs
SELECT oid
FROM base.t_ghm
JOIN activite.t_divers ON t_divers.code = 'ENCOURSGHMSANSGHS'
WHERE t_divers.valeur LIKE '%' || t_ghm.code || '%' AND
oid <> 0 AND
length(t_ghm.code) = 6 AND
t_ghm.code <> '14Z08Z'
;
CREATE TEMP TABLE IF NOT EXISTS w_cti_encours_factures
(
oid bigint,
sejour_id bigint NOT NULL,
no_sejour text NOT NULL,
type_sejour text,
classe_ghm text,
no_facture text NOT NULL,
no_facture_encours text NOT NULL,
no_facture_reference text NOT NULL,
date_encours date,
date_debut date,
date_fin date,
lieu_sortie_id bigint,
mode_sortie text,
ghs_id bigint DEFAULT 0,
ghm_id bigint DEFAULT 0,
code_cp_demandee character(1) DEFAULT 0,
montant_valorise_c numeric(13,2) DEFAULT 0,
montant_valorise_0_c numeric(13,2) DEFAULT 0,
montant_valorise_1_c numeric(13,2) DEFAULT 0,
montant_valorise_2_c numeric(13,2) DEFAULT 0,
montant_encours_c numeric(13,2) DEFAULT 0,
montant_encours_0_c numeric(13,2) DEFAULT 0,
montant_encours_1_c numeric(13,2) DEFAULT 0,
montant_encours_2_c numeric(13,2) DEFAULT 0,
montant_valorise_h numeric(13,2) DEFAULT 0,
etat character(1) DEFAULT ''::bpchar,
type_t2a character(1) DEFAULT '0'::bpchar,
est_budget_global text,
secteur_tarif text default '2',
ghs_bebe1_id bigint DEFAULT 0,
ghs_bebe2_id bigint DEFAULT 0,
ghs_bebe3_id bigint DEFAULT 0,
code_sorti character(1) DEFAULT '0'::bpchar,
lieu_sortie_service_id bigint DEFAULT 0,
lieu_sortie_unite_fonctionnelle_id bigint DEFAULT 0,
medecin_sejour_id bigint DEFAULT 0,
specialite_medecin_sejour_id bigint,
duree_sejour integer DEFAULT 0,
tranche_sejour character(1) DEFAULT '0'::bpchar,
regle_ghs text DEFAULT ''::text,
regle_dms text DEFAULT '0'::text,
dms numeric default 0,
tiers_payant_1_id bigint,
tiers_payant_2_id bigint,
particularites_encours_service text,
uniquement_prestations_saisies text default '0',
ignorer text default '0',
CONSTRAINT w_cti_encours_factures_pkey PRIMARY KEY (no_facture)
);
CREATE INDEX IF NOT EXISTS w_cti_encours_factures_i1
ON w_cti_encours_factures
USING btree
(no_sejour);
CREATE TEMP TABLE IF NOT EXISTS w_cti_encours_factures_deja_cpc
(
no_facture_reference text NOT NULL,
CONSTRAINT w_cti_encours_factures_deja_cpc_pkey PRIMARY KEY (no_facture_reference)
);
CREATE TEMP TABLE IF NOT EXISTS w_cti_encours_factures_histo_taux
(
service_facturation_id bigint,
taux_ghs_1 numeric,
nb numeric,
regle_taux_texte text,
CONSTRAINT w_cti_encours_factures_histo_taux_pkey PRIMARY KEY (service_facturation_id)
);
CREATE TEMP SEQUENCE IF NOT EXISTS w_cti_encours_factures_lignes_c_sequence;
CREATE TEMP TABLE IF NOT EXISTS w_cti_encours_factures_lignes_c
(
oid bigint NOT NULL DEFAULT nextval('w_cti_encours_factures_lignes_c_sequence'::regclass),
no_sejour text NOT NULL,
no_facture text NOT NULL,
date_debut date,
date_fin date,
nb_rubrique numeric(5) DEFAULT 1,
coefficient numeric(7,2) DEFAULT 1,
coefficient_mco numeric(7,4) DEFAULT 1,
prestation_id bigint DEFAULT 0,
lpp_id bigint DEFAULT 0,
ucd_id bigint DEFAULT 0,
rubrique_facturation_id bigint DEFAULT 0,
rubrique_comptabilisation_id bigint DEFAULT 0,
ghs_id bigint DEFAULT 0,
prix_unitaire numeric(13,2) DEFAULT 0,
borne_basse numeric(5) DEFAULT 0,
borne_haute numeric(5) DEFAULT 0,
forfait_exb numeric(13,2) DEFAULT 0,
tarif_exb numeric(13,2) DEFAULT 0,
duree_sejour numeric(7) DEFAULT 0,
nb_prestation numeric(5) DEFAULT 1,
montant_encours numeric(13,2) DEFAULT 0,
montant_encours_0 numeric(13,2) DEFAULT 0,
montant_encours_1 numeric(13,2) DEFAULT 0,
montant_encours_2 numeric(13,2) DEFAULT 0,
montant_encours_22 numeric(13,2) DEFAULT 0,
type_ligne text DEFAULT ''::text,
regle_ghs text DEFAULT ''::text,
lieu_id bigint DEFAULT 0,
regle_coefficient numeric DEFAULT 0,
regle_texte text,
prix_unitaire_calcule numeric(13,2) DEFAULT 0,
coefficient_calcule numeric(13,2) DEFAULT 0,
ignorer text default '0'
);
CREATE INDEX IF NOT EXISTS w_cti_encours_factures_lignes_c_i1
ON w_cti_encours_factures_lignes_c
USING btree
(no_facture);
CREATE TEMP TABLE IF NOT EXISTS w_cti_factures_lignes_non_facturees_c
(
no_sejour text,
no_facture text,
prestation_code character varying,
only_jour_sortie text,
type_valorisation_non_facture text
);
CREATE TEMP TABLE IF NOT EXISTS w_cti_encours_actes_se1234
(
oid bigint,
code text,
prestation_code text
);
CREATE INDEX IF NOT EXISTS w_cti_encours_actes_se1234_i1
ON w_cti_encours_actes_se1234
USING btree
(oid);
CREATE TEMP TABLE IF NOT EXISTS w_cti_encours_se1234
(
no_facture text,
acte_se text,
type_se text
);
CREATE INDEX IF NOT EXISTS w_cti_encours_se1234_i1
ON w_cti_encours_se1234
USING btree
(no_facture);
CREATE TEMP TABLE IF NOT EXISTS w_cti_encours_factures_lignes_sup_c
(
from_oid bigint,
prestation_code text,
date_debut_ghs date,
date_fin_ghs date,
nb_prestation_ghs integer,
oid bigint,
no_sejour text,
no_facture text,
date_debut date,
date_fin date,
nb_rubrique numeric(5),
coefficient numeric(7,2),
coefficient_mco numeric(7,4),
prestation_id bigint,
lpp_id bigint DEFAULT 0,
ucd_id bigint DEFAULT 0,
rubrique_facturation_id bigint,
rubrique_comptabilisation_id bigint,
ghs_id bigint,
prix_unitaire numeric(13,2),
borne_basse numeric(5),
borne_haute numeric(5),
forfait_exb numeric(13,2),
tarif_exb numeric(13,2),
duree_sejour numeric(7),
nb_prestation numeric(5),
montant_encours numeric(13,2),
montant_encours_0 numeric(13,2),
montant_encours_1 numeric(13,2),
montant_encours_2 numeric(13,2),
montant_encours_22 numeric(13,2),
type_ligne text,
regle_ghs text,
lieu_id bigint,
regle_coefficient numeric,
regle_texte text,
prix_unitaire_calcule numeric(13,2) DEFAULT 0,
coefficient_calcule numeric(13,2) DEFAULT 0,
ignorer text default '0'
);
CREATE TEMP TABLE IF NOT EXISTS w_cti_encours_factures_lignes_sup_c_gen
(
from_oid bigint,
no_sejour text,
no_facture text,
date_debut date,
date_fin date,
lieu_id bigint,
rubrique_facturation_id bigint,
rubrique_comptabilisation_id bigint,
prestation_id bigint,
lpp_id bigint DEFAULT 0,
ucd_id bigint DEFAULT 0,
nb_rubrique integer,
nb_prestation integer,
coefficient numeric(7,2),
coefficient_mco numeric(7,4),
prix_unitaire numeric(13,2),
oid bigint,
montant_encours numeric,
type_ligne text,
regle_ghs text,
regle_coefficient numeric,
regle_texte text
);
CREATE TEMP TABLE IF NOT EXISTS w_cti_encours_factures_lignes_sup_c_gen_tot
(
from_oid bigint,
nb_rubrique bigint,
nb_prestation bigint,
montant_encours numeric
);
CREATE TEMP TABLE IF NOT EXISTS w_cti_encours_repartition_tp
(
rubrique_facturation_id bigint NOT NULL,
coeff_1 numeric,
coeff_2 numeric,
CONSTRAINT w_cti_encours_repartition_tp_pk PRIMARY KEY (rubrique_facturation_id)
);
RAISE NOTICE '%' , 'Initialisations. Repartition par tiers payant';
TRUNCATE w_cti_encours_repartition_tp;
INSERT INTO w_cti_encours_repartition_tp
SELECT
rubrique_facturation_id,
base.cti_division(SUM(montant_facture_1) , SUM(montant_facture)) AS coeff_1,
base.cti_division(SUM(montant_facture_2 + montant_facture_22) , SUM(montant_facture)) AS coeff_2
FROM activite.p_factures_lignes_c
JOIN activite.p_factures ON p_factures_lignes_c.no_facture = p_factures.no_facture
WHERE tiers_payant_1_id <> 0 ANd montant_facture <> 0 AND
p_factures_lignes_c.date_fin BETWEEN '20100301' AND w_NOW
GROUP BY 1;
UPDATE w_cti_encours_repartition_tp SET coeff_2 = 0 WHERE coeff_2 < 0.01;
UPDATE w_cti_encours_repartition_tp SET coeff_2 = 1 - coeff_1 WHERE coeff_2 >= 0.01 AND 1 - coeff_1 - coeff_2 < 0.01;
-- Ménage selon paramétrage
IF i_option NOT ILIKE '%-nogen%' THEN
DELETE
FROM activite.p_factures_encours
WHERE code_origine = 'C' AND date_encours < (SELECT date(date_trunc('month',base.cti_to_date(valeur))) FROM activite.t_divers WHERE code = 'DATESTARTENCOURS')
;
DELETE FROM activite.p_factures_encours_lignes_c
WHERE NOT EXISTS (SELECT 'NOT_TO_DELETE' FROM activite.p_factures_encours WHERE p_factures_encours.no_facture = p_factures_encours_lignes_c.no_facture)
AND p_factures_encours_lignes_c IS NOT NULL;
END IF;
-- Retraitement d'un mois
IF i_date_encours IS NOT NULL AND i_option NOT ILIKE '%-nogen%' THEN
DELETE FROM activite.p_factures_encours
USING w_cti_encours_calcul_parametres
WHERE date_trunc('month',p_factures_encours.date_encours) >= date_trunc('month',i_date_encours) AND
code_origine = 'C';
DELETE FROM activite.p_factures_encours_lignes_c
WHERE NOT EXISTS (SELECT 'NOT_TO_DELETE' FROM activite.p_factures_encours WHERE p_factures_encours.no_facture = p_factures_encours_lignes_c.no_facture)
AND p_factures_encours_lignes_c IS NOT NULL;
END IF;
-- Génération ou regénération des encours
RAISE NOTICE '%' , 'Generation encours';
-- date encours actuelle spécial SHS
w_date_encours_actuelle_shs =
CASE WHEN EXISTS(SELECT nspname from pg_namespace where nspname = 'prod_shs')
THEN (SELECT date(date_trunc('month', MAX(date_vente)) + interval '2 month' - interval '1 day')
FROM activite.p_factures
JOIN activite.p_factures_lignes_c ON p_factures.no_facture = p_factures_lignes_c.no_facture
JOIN activite.t_rubriques_facturation ON rubrique_facturation_id = t_rubriques_facturation.oid AND t_rubriques_facturation.code_original = '111'
WHERE code_vente = '1')
ELSE '2099-12-31' END;
-- date encours actuelle standard
w_date_encours_actuelle = date(CASE WHEN EXTRACT('day' FROM w_NOW) <= _DATEENCOURS THEN date_trunc('month', w_NOW) - interval '1 day' ELSE date_trunc('month', w_NOW) + interval '1 month' - interval '1 day' END);
-- Pour SHS, Si date en cours < date standard (ventes pas faites)
IF w_date_encours_actuelle_shs < w_date_encours_actuelle THEN
w_date_encours_actuelle = w_date_encours_actuelle_shs;
END IF;
-- Stockage date encours active
INSERT INTO activite.t_divers (code, texte, valeur, description, valeur_date)
SELECT
'ENCOURSNOW',
'Date encours calculés',
w_date_encours_actuelle::text,
'Date des encours actuellement calculés (non modifiable)',
w_date_encours_actuelle
WHERE 'ENCOURSNOW' NOT IN (SELECT code FROM activite.t_divers);
UPDATE activite.t_divers SET
valeur = w_date_encours_actuelle::text,
valeur_date = w_date_encours_actuelle
WHERE code = 'ENCOURSNOW'
;
w_date_encours = _DATESTARTENCOURS;
IF i_option ILIKE '%-nogen%' THEN
w_date_encours = date(date_trunc('month', w_date_encours_actuelle) - interval '1 day');
END IF;
IF NOT EXISTS (SELECT valeur FROM activite.t_divers WHERE code = 'ENCOURSACTIVE' AND valeur = '1') THEN
w_date_encours = date(date_trunc('month', w_date_encours_actuelle) - interval '1 day');
END IF;
LOOP
w_date_encours = date(date_trunc('month', w_date_encours) + interval '2 month' - interval '1 day');
w_date_encours_YYMM = to_char(w_date_encours, 'MM YYYY');
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'Generation encours. Analyse.';
IF w_date_encours > date(date_trunc('month',now())+interval '2 month') THEN
EXIT;
END IF;
IF w_date_encours > w_date_encours_actuelle THEN
EXIT;
END IF;
IF i_date_encours IS NOT NULL AND w_date_encours > i_date_encours THEN
EXIT;
END IF;
IF w_date_encours < w_date_encours_actuelle AND
EXISTS (SELECT date_encours FROM activite.p_factures_encours WHERE code_origine = 'C' AND date_trunc('month', date_encours) = date_trunc('month', w_date_encours) LIMIT 1) THEN
CONTINUE;
END IF;
IF w_date_encours < w_date_encours_actuelle AND
NOT EXISTS (SELECT date_vente FROM activite.p_factures WHERE code_vente = '1' AND date_trunc('month', date_vente) = date_trunc('month', w_date_encours) LIMIT 1) THEN
CONTINUE;
END IF;
IF w_date_encours = w_date_encours_actuelle THEN
w_date_traitement = w_NOW;
w_date_sortie_max = w_NOW + CASE WHEN date_part('hour' ,w_NOW) > 18 THEN interval '1 day' ELSE interval '0 day' END;
ELSE
w_date_traitement = w_date_encours + interval '15 days';
w_date_sortie_max = w_date_traitement;
END IF;
w_date_traitement = date(w_date_traitement);
w_date_histo_18 = date(date_trunc('month',w_date_encours) - interval '18 month');
w_date_histo_12 = date(date_trunc('month',w_date_encours) - interval '12 month');
w_date_histo_xx = w_date_histo_18;
w_date_histo_coeff_presta = date(date_trunc('month',w_date_encours) - (_ENCOURSRETROSUP || 'month')::interval);
RAISE NOTICE '%. %' , w_date_histo_coeff_presta, 'Date de calcul coefficient prestations ENCOURSRETROSUP';
w_date_sortie_max = date(w_date_sortie_max);
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'Generation encours ' || w_date_encours_YYMM || ' ' || w_date_traitement::text;
-- Raz tables de travail
TRUNCATE w_cti_encours_calcul_parametres;
TRUNCATE w_cti_encours_calcul_parametres_services;
TRUNCATE w_cti_encours_calcul_parametres_services_prestations;
TRUNCATE w_cti_encours_calcul_parametres_services_journees;
TRUNCATE w_cti_encours_sejours;
TRUNCATE w_cti_encours_histo_sejour_facture;
TRUNCATE w_cti_encours_histo_ghs;
TRUNCATE w_cti_encours_histo_dms_sejours;
TRUNCATE w_cti_encours_histo_dms;
TRUNCATE w_cti_encours_factures_histo_taux;
TRUNCATE w_cti_encours_factures;
TRUNCATE w_cti_encours_factures_deja_cpc;
TRUNCATE w_cti_encours_factures_lignes_c;
TRUNCATE w_cti_factures_lignes_non_facturees_c;
TRUNCATE w_cti_encours_se1234;
TRUNCATE w_cti_encours_actes_se1234;
TRUNCATE w_cti_encours_factures_lignes_sup_c;
TRUNCATE w_cti_encours_factures_lignes_sup_c_gen;
TRUNCATE w_cti_encours_factures_lignes_sup_c_gen_tot;
-- Correction coefficient MCO
-- Initialisation du coefficient MCO non alimenté (exemple WEB100T)
UPDATE activite.p_factures_lignes_c
SET coefficient_mco = coefficient_mco_calcul
FROM activite.t_prestations, base.v_coefficient_mco
WHERE
prestation_id = t_prestations.oid AND
t_prestations.code IN ('GHS', 'EXH') AND
montant_facture <> 0 AND
coefficient_mco = 1 AND
date(p_factures_lignes_c.date_fin) BETWEEN v_coefficient_mco.date_debut AND v_coefficient_mco.date_fin
;
-- Paramétrage des GHS
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'Parametrage GHS';
INSERT INTO w_cti_encours_calcul_parametres
SELECT
w_date_encours as date_encours,
(MAX(Array[date(p_factures_lignes_c.date_fin) - w_NOW, coefficient_mco]))[2] AS coefficient_mco,
(MAX(Array[CASE WHEN t_prestations.code = 'GHS' AND type_sejour <> '5' THEN date(p_factures_lignes_c.date_fin) - w_NOW ELSE -99999999 END, rubrique_facturation_id]))[2] AS rubrique_facturation_ghs_id,
(MAX(Array[CASE WHEN t_prestations.code = 'GHS' AND type_sejour <> '5' THEN date(p_factures_lignes_c.date_fin) - w_NOW ELSE -99999999 END, rubrique_comptabilisation_id]))[2] AS rubrique_comptabilisation_ghs_id,
(MAX(Array[CASE WHEN t_prestations.code = 'GHS' AND type_sejour <> '5' THEN date(p_factures_lignes_c.date_fin) - w_NOW ELSE -99999999 END, prestation_id]))[2] AS prestation_ghs_id,
(MAX(Array[CASE WHEN t_prestations.code = 'GHS' AND type_sejour = '5' THEN date(p_factures_lignes_c.date_fin) - w_NOW ELSE -99999999 END, rubrique_facturation_id]))[2] AS rubrique_facturation_ghs_sea_id,
(MAX(Array[CASE WHEN t_prestations.code = 'GHS' AND type_sejour = '5' THEN date(p_factures_lignes_c.date_fin) - w_NOW ELSE -99999999 END, rubrique_comptabilisation_id]))[2] AS rubrique_comptabilisation_ghs_sea_id,
(MAX(Array[CASE WHEN t_prestations.code = 'GHS' AND type_sejour = '5' THEN date(p_factures_lignes_c.date_fin) - w_NOW ELSE -99999999 END, prestation_id]))[2] AS prestation_ghs_sea_id,
(MAX(Array[CASE WHEN t_prestations.code = 'EXH' AND type_sejour <> '5' THEN date(p_factures_lignes_c.date_fin) - w_NOW ELSE -99999999 END, rubrique_facturation_id]))[2] AS rubrique_facturation_exh_id,
(MAX(Array[CASE WHEN t_prestations.code = 'EXH' AND type_sejour <> '5' THEN date(p_factures_lignes_c.date_fin) - w_NOW ELSE -99999999 END, rubrique_comptabilisation_id]))[2] AS rubrique_comptabilisation_exh_id,
(MAX(Array[CASE WHEN t_prestations.code = 'EXH' AND type_sejour <> '5' THEN date(p_factures_lignes_c.date_fin) - w_NOW ELSE -99999999 END, prestation_id]))[2] AS prestation_exh_id,
(MAX(Array[CASE WHEN t_prestations.code = 'I01' THEN date(p_factures_lignes_c.date_fin) - w_NOW ELSE -99999999 END, rubrique_facturation_id]))[2] AS rubrique_facturation_I01_id,
(MAX(Array[CASE WHEN t_prestations.code = 'I01' THEN date(p_factures_lignes_c.date_fin) - w_NOW ELSE -99999999 END, rubrique_comptabilisation_id]))[2] AS rubrique_comptabilisation_I01_id,
(MAX(Array[CASE WHEN t_prestations.code = 'I01' THEN date(p_factures_lignes_c.date_fin) - w_NOW ELSE -99999999 END, prestation_id]))[2] AS prestation_I01_id
FROM
activite.p_factures_lignes_c
JOIN activite.p_factures ON p_factures_lignes_c.no_facture = p_factures.no_facture AND p_factures.date_fin >= w_date_histo_18
JOIN activite.p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
JOIN activite.t_prestations ON prestation_id = t_prestations.oid AND t_prestations.code IN ('GHS', 'EXH', 'I01')
WHERE montant_facture <> 0 AND
p_factures_lignes_c.date_fin BETWEEN w_date_histo_18 AND w_date_traitement AND montant_facture > 0;
-- Prestations et rubriques par défaut
UPDATE w_cti_encours_calcul_parametres SET
coefficient_mco = COALESCE(coefficient_mco, 1),
prestation_ghs_id = COALESCE(prestation_ghs_id, (SELECT oid FROM activite.t_prestations WHERE code = 'GHS')),
rubrique_facturation_ghs_id = COALESCE(rubrique_facturation_ghs_id, (SELECT oid FROM activite.t_rubriques_facturation WHERE code = 'GHS')),
rubrique_comptabilisation_ghs_id = COALESCE(rubrique_comptabilisation_ghs_id, (SELECT oid FROM activite.t_rubriques_facturation WHERE code = 'GHS')),
prestation_ghs_sea_id = COALESCE(prestation_ghs_sea_id, (SELECT oid FROM activite.t_prestations WHERE code = 'GHS')),
rubrique_facturation_ghs_sea_id = COALESCE(rubrique_facturation_ghs_sea_id, (SELECT oid FROM activite.t_rubriques_facturation WHERE code = 'GHS')),
rubrique_comptabilisation_ghs_sea_id = COALESCE(rubrique_comptabilisation_ghs_sea_id, (SELECT oid FROM activite.t_rubriques_facturation WHERE code = 'GHS')),
prestation_exh_id = COALESCE(prestation_exh_id, (SELECT oid FROM activite.t_prestations WHERE code = 'EXH')),
rubrique_facturation_exh_id = COALESCE(rubrique_facturation_exh_id, (SELECT oid FROM activite.t_rubriques_facturation WHERE code = 'EXH')),
rubrique_comptabilisation_exh_id = COALESCE(rubrique_comptabilisation_exh_id, (SELECT oid FROM activite.t_rubriques_facturation WHERE code = 'EXH')),
prestation_i01_id = COALESCE(prestation_i01_id, (SELECT oid FROM activite.t_prestations WHERE code = 'I01')),
rubrique_facturation_i01_id = COALESCE(rubrique_facturation_i01_id, (SELECT oid FROM activite.t_rubriques_facturation WHERE code = 'I01')),
rubrique_comptabilisation_i01_id = COALESCE(rubrique_comptabilisation_i01_id, (SELECT oid FROM activite.t_rubriques_facturation WHERE code = 'I01'))
;
-- forcage coefficient mco selon calcul et non plus depuis la facturation
UPDATE w_cti_encours_calcul_parametres
SET coefficient_mco = coefficient_mco_calcul
FROM base.v_coefficient_mco
WHERE date(now()) BETWEEN v_coefficient_mco.date_debut AND v_coefficient_mco.date_fin
;
-- Par service
INSERT INTO w_cti_encours_calcul_parametres_services
SELECT
service_facturation_id,
type_sejour,
(MAX(CASE WHEN prestation_code = 'GHS' THEN ARRAY[to_char(nb,'FM0000000000'),rubrique_facturation_id::text] ELSE NULL END))[2]::bigint,
(MAX(CASE WHEN prestation_code = 'GHS' THEN ARRAY[to_char(nb,'FM0000000000'),prestation_id::text] ELSE NULL END))[2]::bigint,
(MAX(CASE WHEN prestation_code = 'EXH' THEN ARRAY[to_char(nb,'FM0000000000'),rubrique_facturation_id::text] ELSE NULL END))[2]::bigint,
(MAX(CASE WHEN prestation_code = 'EXH' THEN ARRAY[to_char(nb,'FM0000000000'),prestation_id::text] ELSE NULL END))[2]::bigint
FROM
(
SELECT
type_sejour,
t_lieux.service_facturation_id,
t_prestations.code AS prestation_code,
prestation_id,
rubrique_facturation_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.p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
JOIN activite.t_prestations ON prestation_id = t_prestations.oid AND t_prestations.code IN ('GHS', 'EXH')
JOIN activite.t_lieux ON lieu_id = t_lieux.oid
WHERE montant_facture <> 0 AND
p_factures_lignes_c.date_fin BETWEEN w_date_histo_18 AND w_date_traitement AND montant_facture > 0
GROUP BY 1,2,3,4,5
HAVING count(*) > 10
) subview
GROUP BY 1,2
;
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'Historique facturation prestations';
INSERT INTO w_cti_encours_calcul_parametres_services_prestations
SELECT w_cti_encours_calcul_parametres.coefficient_mco,
t_lieux.service_facturation_id AS lieu_service_id,
t_lieux.unite_fonctionnelle_id AS lieu_unite_fonctionnelle_id,
0::numeric AS nb_ambulatoires,
0::numeric AS nb_externes,
0::numeric AS nb_seances,
0::numeric AS nb_journees,
0::numeric AS nb_journees_cp,
prestation_id,
t_prestations.code AS prestation_code,
CASE
WHEN t_prestations.code = 'GHT' AND p_factures_lignes_c.date_debut - p_sejours.date_entree <= 3 THEN '1'
WHEN t_prestations.code = 'GHT' AND p_factures_lignes_c.date_debut - p_sejours.date_entree BETWEEN 4 AND 8 THEN '2'
WHEN t_prestations.code = 'GHT' AND p_factures_lignes_c.date_debut - p_sejours.date_entree BETWEEN 9 AND 30 THEN '3'
WHEN t_prestations.code = 'GHT' AND p_factures_lignes_c.date_debut - p_sejours.date_entree > 30 THEN '9'
ELSE '' END AS tranche_ght,
COALESCE(t_prestations.type_valorisation_non_facture,'') AS prestation_type_valorisation,
rubrique_facturation_id,
COALESCE((MAX(Array[date(p_factures_lignes_c.date_fin) - w_NOW, prix_unitaire]))[2],0) as prix_unitaire,
SUM(nb_rubrique * CASE WHEN coefficient <> 0 THEN coefficient ELSE 1 END) -
SUM(CASE WHEN p_sejours.type_sejour = '1' AND p_factures_lignes_c.date_fin = p_sejours.date_sortie AND (t_prestations.code IN ('CPC', 'SHO', 'CP') OR t_prestations.type_valorisation_non_facture IN ('CP')) THEN 1 ELSE 0 END) as nombre,
0::numeric AS coefficient,
base.cti_division(
SUM(CASE WHEN p_factures_lignes_c.date_debut >= date(date_trunc('month',w_cti_encours_calcul_parametres.date_encours)) THEN CASE WHEN taux_1+taux_2+taux_0 = 100 THEN montant_facture ELSE nb_rubrique * CASE WHEN coefficient <> 0 THEN coefficient ELSE 1 END * prix_unitaire END ELSE 0 END) ,
SUM(CASE WHEN p_factures_lignes_c.date_debut >= date(date_trunc('month',w_cti_encours_calcul_parametres.date_encours)) THEN nb_rubrique * CASE WHEN coefficient <> 0 THEN coefficient ELSE 1 END ELSE 0 END)
) AS prix_unitaire_moyen_1,
SUM(CASE WHEN p_factures_lignes_c.date_debut >= date(date_trunc('month',w_cti_encours_calcul_parametres.date_encours)) THEN nb_rubrique * CASE WHEN coefficient <> 0 THEN coefficient ELSE 1 END ELSE 0 END) AS nb_prix_unitaire_moyen_1,
base.cti_division(
SUM(CASE WHEN p_factures_lignes_c.date_debut >= w_cti_encours_calcul_parametres.date_encours - interval '3 month' THEN CASE WHEN taux_1+taux_2+taux_0 = 100 THEN montant_facture ELSE nb_rubrique * CASE WHEN coefficient <> 0 THEN coefficient ELSE 1 END * prix_unitaire END ELSE 0 END) ,
SUM(CASE WHEN p_factures_lignes_c.date_debut >= w_cti_encours_calcul_parametres.date_encours - interval '3 month' THEN nb_rubrique * CASE WHEN coefficient <> 0 THEN coefficient ELSE 1 END ELSE 0 END)
) AS prix_unitaire_moyen_3,
SUM(CASE WHEN p_factures_lignes_c.date_debut >= w_cti_encours_calcul_parametres.date_encours - interval '3 month' THEN nb_rubrique * CASE WHEN coefficient <> 0 THEN coefficient ELSE 1 END ELSE 0 END) AS nb_prix_unitaire_moyen_3,
base.cti_division(
SUM(CASE WHEN taux_1+taux_2+taux_0 = 100 THEN montant_facture ELSE nb_rubrique * CASE WHEN coefficient <> 0 THEN coefficient ELSE 1 END * prix_unitaire END),
SUM(nb_rubrique * CASE WHEN coefficient <> 0 THEN coefficient ELSE 1 END)
) AS prix_unitaire_moyen,
''::text AS regle_prestation_texte,
0::numeric AS coefficient_calcule,
0::numeric AS prix_unitaire_calcule,
'0'::text AS coefficient_is_force,
'0'::text AS prix_unitaire_is_force,
''::text AS type_ligne,
''::text AS prestation_10p_code,
''::text AS rubrique_code,
''::text AS rubrique_10p_code,
0::bigint AS prestation_10p_id,
0::bigint AS rubrique_10p_id
FROM w_cti_encours_calcul_parametres, activite.p_factures_lignes_c
JOIN activite.p_factures ON p_factures_lignes_c.no_facture = p_factures.no_facture AND type_facture NOT IN ('E') AND code_facture >= '1' AND p_factures.date_fin >= w_date_histo_coeff_presta
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
JOIN activite.t_lieux ON lieu_id = t_lieux.oid
JOIN activite.p_sejours On p_factures.no_sejour = p_sejours.no_sejour
WHERE p_factures_lignes_c.montant_facture <> 0 AND p_factures_lignes_c.date_fin <= w_cti_encours_calcul_parametres.date_encours AND
(t_prestations.code IN ('GMT', 'PJ', 'FJ', 'ENT', 'I01', 'PMS', 'CPC', 'SHO', 'CP','SRC','STF','REA','FJA','ATU','FPU','SE1','SE2','SE3','SE4','SE5','SE6','SE7', 'IGM', 'IGP', 'APD', 'AMD', 'AMF', 'APD', 'IMD', 'IMI', 'IPD', 'IVG', 'GHT', 'NN1', 'NN2', 'NN3', 'D09', 'D11', 'D13', 'D15', 'D16', 'DTP', 'DMASSR') OR
t_prestations.type_valorisation_non_facture IN ('GMT', 'CP','PJ','ENT','*AVGJOUSER')
)
GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13
ORDER BY 1,2,3,4,5,6;
UPDATE w_cti_encours_calcul_parametres_services_prestations
SET rubrique_code = t_rubriques_facturation.code
FROM activite.t_rubriques_facturation
WHERE rubrique_facturation_id = t_rubriques_facturation.oid
;
UPDATE w_cti_encours_calcul_parametres_services_prestations
SET prestation_10p_code = t_prestations.code,
prestation_10p_id = t_prestations.oid
FROM activite.t_prestations
WHERE ('M'||w_cti_encours_calcul_parametres_services_prestations.prestation_code = t_prestations.code AND t_prestations.code <> 'MPJ' OR
w_cti_encours_calcul_parametres_services_prestations.prestation_code IN ('GMT', 'PJ') AND t_prestations.code = 'MPJS')
;
UPDATE w_cti_encours_calcul_parametres_services_prestations
SET rubrique_10p_id = subview.rubrique_10p_id, rubrique_10p_code = subview.rubrique_10p_code
FROM
(
SELECT prestation_10p_id,
(MAX(Array[date_debut::text,p_factures_lignes_c.rubrique_facturation_id::text]))[2]::bigint AS rubrique_10p_id,
(MAX(Array[date_debut::text,t_rubriques_facturation.code::text]))[2]::text AS rubrique_10p_code
FROM activite.p_factures_lignes_c
JOIN w_cti_encours_calcul_parametres_services_prestations ON p_factures_lignes_c.prestation_id = prestation_10p_id AND prestation_10p_id > 0
JOIN activite.t_rubriques_facturation ON p_factures_lignes_c.rubrique_facturation_id = t_rubriques_facturation.oid
WHERE montant_facture <> 0
group by 1
) subview
WHERE w_cti_encours_calcul_parametres_services_prestations.prestation_10p_id = subview.prestation_10p_id
;
UPDATE w_cti_encours_calcul_parametres_services_prestations
SET nombre = CASE WHEN w_cti_encours_calcul_parametres_services_prestations.rubrique_facturation_id = subview.rubrique_facturation_id
THEN w_cti_encours_calcul_parametres_services_prestations.nombre
ELSE 0 END
FROM
(
SELECT lieu_service_id,
lieu_unite_fonctionnelle_id,
prestation_id,
count(*),
(MAX(Array[nombre, rubrique_facturation_id]))[2] AS rubrique_facturation_id
FROM w_cti_encours_calcul_parametres_services_prestations
WHERE prestation_code NOT IN ('CPC', 'SHO', 'CP') AND prestation_type_valorisation NOT IN ('CP')
GROUP BY 1,2,3
HAVING count(*) > 1
) subview
WHERE w_cti_encours_calcul_parametres_services_prestations.lieu_service_id = subview.lieu_service_id AND
w_cti_encours_calcul_parametres_services_prestations.lieu_unite_fonctionnelle_id = subview.lieu_unite_fonctionnelle_id AND
w_cti_encours_calcul_parametres_services_prestations.prestation_id = subview.prestation_id;
DELETE FROM w_cti_encours_calcul_parametres_services_prestations WHERE nombre = 0;
INSERT INTO w_cti_encours_calcul_parametres_services_prestations
SELECT
coefficient_mco,
lieu_service_id,
lieu_unite_fonctionnelle_id,
nb_ambulatoires,
nb_externes,
nb_seances,
nb_journees,
nb_journees_cp,
(SELECT oid FROM activite.t_prestations WHERE code = 'FJA') AS prestation_id,
'FJA' AS prestation_code,
''::text AS tranche_ght,
''::text AS prestation_type_valorisation,
rubrique_facturation_id,
prix_unitaire,
nombre,
coefficient,
prix_unitaire_moyen_1,
nb_prix_unitaire_moyen_1,
prix_unitaire_moyen_3,
nb_prix_unitaire_moyen_3,
prix_unitaire_moyen,
''::text AS regle_prestation_texte,
0::numeric AS coefficient_calcule,
0::numeric AS prix_unitaire_calcule,
'0'::text AS coefficient_is_force,
'0'::text AS prix_unitaire_is_force,
''::text AS type_ligne
FROM w_cti_encours_calcul_parametres_services_prestations
WHERE prestation_code = 'FJ' AND
'FJA' || '|' || lieu_service_id::text || '|' || lieu_unite_fonctionnelle_id::text NOT IN (SELECT prestation_code || '|' || lieu_service_id::text || '|' || lieu_unite_fonctionnelle_id::text FROM w_cti_encours_calcul_parametres_services_prestations);
UPDATE w_cti_encours_calcul_parametres_services_prestations
SET prix_unitaire =
CASE
WHEN prix_unitaire_moyen_1 <> 0 AND nb_prix_unitaire_moyen_1 > 100 THEN
CASE WHEN prix_unitaire - prix_unitaire_moyen_1 BETWEEN -2 AND 2 THEN prix_unitaire ELSE round(prix_unitaire_moyen_1,2) END
WHEN prix_unitaire_moyen_3 <> 0 AND nb_prix_unitaire_moyen_1 > 100 THEN
CASE WHEN prix_unitaire - prix_unitaire_moyen_3 BETWEEN -2 AND 2 THEN prix_unitaire ELSE round(prix_unitaire_moyen_3,2) END
WHEN prix_unitaire_moyen <> 0 THEN
CASE WHEN prix_unitaire - prix_unitaire_moyen BETWEEN -2 AND 2 THEN prix_unitaire ELSE round(prix_unitaire_moyen,2) END
ELSE prix_unitaire
END;
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'Historique occupation ' || w_date_histo_coeff_presta::text;
INSERT INTO w_cti_encours_calcul_parametres_services_journees
SELECT t_lieux.service_facturation_id AS lieu_service_id,
t_lieux.unite_fonctionnelle_id AS lieu_unite_fonctionnelle_id,
SUM(nb_ambulatoires) AS nb_ambulatoires,
SUM(nb_externes) AS nb_externes,
SUM(nb_seances) AS nb_seances,
COUNT(DISTINCT CASE WHEN heure_fin = 240000 OR heure_debut > 0 AND heure_fin < 240000 THEN p_mouvements_sejour.no_sejour || p_mouvements_sejour.date::text ELSE NULL END) as nb_journees,
COUNT(DISTINCT CASE WHEN est_chambre_particuliere <> '1' THEN NULL
WHEN heure_fin = 240000 OR heure_debut > 0 AND heure_fin < 240000 THEN p_mouvements_sejour.no_sejour || p_mouvements_sejour.date::text
ELSE NULL END
) as nb_journees_cp
FROM w_cti_encours_calcul_parametres,
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
WHERE p_mouvements_sejour.date <= w_cti_encours_calcul_parametres.date_encours AND
p_mouvements_sejour.date >= w_date_histo_coeff_presta AND
p_mouvements_sejour.no_sejour IN (SELECT no_sejour FROM activite.p_factures WHERE type_facture NOT IN ('E') AND code_facture >= '1' AND p_factures.date_fin >= w_date_histo_18)
GROUP BY 1,2;
UPDATE w_cti_encours_calcul_parametres_services_prestations SET
nb_ambulatoires = w_cti_encours_calcul_parametres_services_journees.nb_ambulatoires,
nb_externes = w_cti_encours_calcul_parametres_services_journees.nb_externes,
nb_seances = w_cti_encours_calcul_parametres_services_journees.nb_seances,
nb_journees = w_cti_encours_calcul_parametres_services_journees.nb_journees,
nb_journees_cp = w_cti_encours_calcul_parametres_services_journees.nb_journees_cp
FROM w_cti_encours_calcul_parametres_services_journees
WHERE w_cti_encours_calcul_parametres_services_journees.lieu_service_id = w_cti_encours_calcul_parametres_services_prestations.lieu_service_id AND
w_cti_encours_calcul_parametres_services_journees.lieu_unite_fonctionnelle_id = w_cti_encours_calcul_parametres_services_prestations.lieu_unite_fonctionnelle_id;
-- Récupération historique d'un autre environnement (saint gatien)
IF EXISTS (
SELECT table_name
FROM information_schema.tables
WHERE table_schema || '.' || table_name = 'activite.t_encours_calcul_parametres_services_prestations_histo' ) THEN
INSERT INTO w_cti_encours_calcul_parametres_services_prestations
(
coefficient_mco,
lieu_service_id,
lieu_unite_fonctionnelle_id,
nb_ambulatoires,
nb_externes,
nb_seances,
nb_journees,
nb_journees_cp,
prestation_id,
prestation_code,
tranche_ght,
prestation_type_valorisation,
rubrique_facturation_id,
prix_unitaire,
nombre,
coefficient,
prix_unitaire_moyen_1,
nb_prix_unitaire_moyen_1,
prix_unitaire_moyen_3,
nb_prix_unitaire_moyen_3,
prix_unitaire_moyen,
regle_prestation_texte,
coefficient_calcule,
prix_unitaire_calcule,
coefficient_is_force,
prix_unitaire_is_force,
type_ligne,
prestation_10p_code,
rubrique_code,
rubrique_10p_code,
prestation_10p_id,
rubrique_10p_id
)
SELECT
t_encours_calcul_parametres_services_prestations_histo.coefficient_mco,
t_encours_calcul_parametres_services_prestations_histo.lieu_service_id,
t_encours_calcul_parametres_services_prestations_histo.lieu_unite_fonctionnelle_id,
t_encours_calcul_parametres_services_prestations_histo.nb_ambulatoires,
t_encours_calcul_parametres_services_prestations_histo.nb_externes,
t_encours_calcul_parametres_services_prestations_histo.nb_seances,
t_encours_calcul_parametres_services_prestations_histo.nb_journees,
t_encours_calcul_parametres_services_prestations_histo.nb_journees_cp,
t_encours_calcul_parametres_services_prestations_histo.prestation_id,
t_encours_calcul_parametres_services_prestations_histo.prestation_code,
t_encours_calcul_parametres_services_prestations_histo.tranche_ght,
t_encours_calcul_parametres_services_prestations_histo.prestation_type_valorisation,
t_encours_calcul_parametres_services_prestations_histo.rubrique_facturation_id,
t_encours_calcul_parametres_services_prestations_histo.prix_unitaire,
t_encours_calcul_parametres_services_prestations_histo.nombre,
t_encours_calcul_parametres_services_prestations_histo.coefficient,
t_encours_calcul_parametres_services_prestations_histo.prix_unitaire_moyen_1,
t_encours_calcul_parametres_services_prestations_histo.nb_prix_unitaire_moyen_1,
t_encours_calcul_parametres_services_prestations_histo.prix_unitaire_moyen_3,
t_encours_calcul_parametres_services_prestations_histo.nb_prix_unitaire_moyen_3,
t_encours_calcul_parametres_services_prestations_histo.prix_unitaire_moyen,
t_encours_calcul_parametres_services_prestations_histo.regle_prestation_texte,
t_encours_calcul_parametres_services_prestations_histo.coefficient_calcule,
t_encours_calcul_parametres_services_prestations_histo.prix_unitaire_calcule,
t_encours_calcul_parametres_services_prestations_histo.coefficient_is_force,
t_encours_calcul_parametres_services_prestations_histo.prix_unitaire_is_force,
t_encours_calcul_parametres_services_prestations_histo.type_ligne,
t_encours_calcul_parametres_services_prestations_histo.prestation_10p_code,
t_encours_calcul_parametres_services_prestations_histo.rubrique_code,
t_encours_calcul_parametres_services_prestations_histo.rubrique_10p_code,
t_encours_calcul_parametres_services_prestations_histo.prestation_10p_id,
t_encours_calcul_parametres_services_prestations_histo.rubrique_10p_id
FROM activite.t_encours_calcul_parametres_services_prestations_histo
LEFT JOIN w_cti_encours_calcul_parametres_services_prestations ON
t_encours_calcul_parametres_services_prestations_histo.lieu_service_id = w_cti_encours_calcul_parametres_services_prestations.lieu_service_id AND
t_encours_calcul_parametres_services_prestations_histo.lieu_unite_fonctionnelle_id = w_cti_encours_calcul_parametres_services_prestations.lieu_unite_fonctionnelle_id AND
t_encours_calcul_parametres_services_prestations_histo.prestation_id = w_cti_encours_calcul_parametres_services_prestations.prestation_id AND
t_encours_calcul_parametres_services_prestations_histo.rubrique_facturation_id = w_cti_encours_calcul_parametres_services_prestations.rubrique_facturation_id AND
t_encours_calcul_parametres_services_prestations_histo.tranche_ght = w_cti_encours_calcul_parametres_services_prestations.tranche_ght
WHERE w_cti_encours_calcul_parametres_services_prestations.lieu_service_id IS NULL
;
UPDATE w_cti_encours_calcul_parametres_services_prestations SET
nb_ambulatoires = w_cti_encours_calcul_parametres_services_prestations.nb_ambulatoires + t_encours_calcul_parametres_services_prestations_histo.nb_ambulatoires,
nb_externes = w_cti_encours_calcul_parametres_services_prestations.nb_externes + t_encours_calcul_parametres_services_prestations_histo.nb_externes,
nb_seances = w_cti_encours_calcul_parametres_services_prestations.nb_seances + t_encours_calcul_parametres_services_prestations_histo.nb_seances,
nb_journees = w_cti_encours_calcul_parametres_services_prestations.nb_journees + t_encours_calcul_parametres_services_prestations_histo.nb_journees,
nb_journees_cp = w_cti_encours_calcul_parametres_services_prestations.nb_journees_cp + t_encours_calcul_parametres_services_prestations_histo.nb_journees_cp,
nombre = w_cti_encours_calcul_parametres_services_prestations.nombre + t_encours_calcul_parametres_services_prestations_histo.nombre
FROM activite.t_encours_calcul_parametres_services_prestations_histo
WHERE t_encours_calcul_parametres_services_prestations_histo.lieu_service_id = w_cti_encours_calcul_parametres_services_prestations.lieu_service_id AND
t_encours_calcul_parametres_services_prestations_histo.lieu_unite_fonctionnelle_id = w_cti_encours_calcul_parametres_services_prestations.lieu_unite_fonctionnelle_id AND
t_encours_calcul_parametres_services_prestations_histo.prestation_id = w_cti_encours_calcul_parametres_services_prestations.prestation_id AND
t_encours_calcul_parametres_services_prestations_histo.rubrique_facturation_id = w_cti_encours_calcul_parametres_services_prestations.rubrique_facturation_id AND
t_encours_calcul_parametres_services_prestations_histo.tranche_ght = w_cti_encours_calcul_parametres_services_prestations.tranche_ght
;
END IF;
--
UPDATE w_cti_encours_calcul_parametres_services_prestations
SET coefficient =
CASE
WHEN base.cti_division(nombre, nb_seances) < 0.1 THEN 0
WHEN base.cti_division(nombre, nb_seances) > 0.4 THEN 1
ELSE round(base.cti_division(nombre, nb_seances),2)
END
WHERE prestation_code IN ('D09', 'D11', 'D13', 'D13', 'D15', 'D16', 'DTP');
UPDATE w_cti_encours_calcul_parametres_services_prestations
SET coefficient =
CASE
WHEN base.cti_division(nombre, nb_journees) < 0.05 THEN 0
WHEN base.cti_division(nombre, nb_journees) < 0.1 AND nombre < 100 THEN 0
WHEN base.cti_division(nombre, nb_journees) > 0.95 THEN 1
ELSE round(base.cti_division(nombre, nb_journees),2)
END
WHERE prestation_code IN ('SRC', 'REA', 'STF');
UPDATE w_cti_encours_calcul_parametres_services_prestations
SET coefficient =
CASE
WHEN base.cti_division(nombre, nb_journees_cp) < 0.05 THEN 0
WHEN base.cti_division(nombre, nb_journees_cp) > 1 THEN 1
ELSE round(base.cti_division(nombre, nb_journees_cp),2)
END
WHERE prestation_code IN ('CPC', 'SHO', 'CP') OR prestation_type_valorisation IN ('CP');
UPDATE w_cti_encours_calcul_parametres_services_prestations
SET nb_journees = w_cti_encours_calcul_parametres_services_prestations.nombre,
coefficient =
CASE
WHEN base.cti_division(nombre, nb_journees) < 0.1 THEN 0
ELSE 1
END
FROM
(
SELECT lieu_service_id, lieu_unite_fonctionnelle_id,
base.cti_division(SUM(nombre), MAX(nb_journees))
FROM w_cti_encours_calcul_parametres_services_prestations
WHERE prestation_code IN ('GHT')
GROUP BY 1,2
) subview
WHERE w_cti_encours_calcul_parametres_services_prestations.lieu_service_id = subview.lieu_service_id AND
w_cti_encours_calcul_parametres_services_prestations.lieu_unite_fonctionnelle_id = subview.lieu_unite_fonctionnelle_id AND
prestation_code IN ('GHT');
UPDATE w_cti_encours_calcul_parametres_services_prestations
SET coefficient =
CASE
WHEN base.cti_division(nombre, nb_ambulatoires + nb_externes) < 0.05 THEN 0
WHEN base.cti_division(nombre, nb_ambulatoires + nb_externes) > 1 THEN 1
ELSE round(base.cti_division(nombre, nb_ambulatoires + nb_externes),2)
END
WHERE prestation_code IN ('AMD', 'AMF', 'IGM', 'IGP', 'APD', 'IMD', 'IMI', 'IPD', 'IVG');
UPDATE w_cti_encours_calcul_parametres_services_prestations
SET coefficient =
CASE
WHEN base.cti_division(nombre, nb_journees) < 0.05 THEN 0
WHEN base.cti_division(nombre, nb_journees) > 1 THEN 1
ELSE round(base.cti_division(nombre, nb_journees),2)
END
WHERE prestation_code IN ('NN1', 'NN2', 'NN3');
-- FPU à compter de janvier 2022. Initialisation provisoire
INSERT INTO activite.t_prestations(code_original, code, texte, texte_court)
SELECT 'FPU'::text, 'FPU'::text, 'Forfait patient urgences'::text, 'Forfait patient urgences'::text
WHERE 'FPU'::text NOT IN (SELECT code FROM activite.t_prestations WHERE code IS NOT NULL )
;
INSERT INTO w_cti_encours_calcul_parametres_services_prestations
SELECT coefficient_mco,
lieu_service_id,
lieu_unite_fonctionnelle_id,
nb_ambulatoires,
nb_externes,
nb_seances,
nb_journees,
nb_journees_cp,
t_prestations.oid AS prestation_id,
t_prestations.code AS prestation_code,
''::text AS tranche_ght,
prestation_type_valorisation,
rubrique_facturation_id,
19.61::numeric as prix_unitaire,
0::numeric as nombre,
0::numeric AS coefficient,
19.61::numeric as prix_unitaire_moyen_1,
0::numeric as nb_prix_unitaire_moyen_1,
19.61::numeric as prix_unitaire_moyen_3,
0::numeric as nb_prix_unitaire_moyen_3,
19.61::numeric as prix_unitaire_moyen,
regle_prestation_texte,
coefficient_calcule,
19.61::numeric AS prix_unitaire_calcule,
coefficient_is_force,
prix_unitaire_is_force,
''::text AS type_ligne
FROM w_cti_encours_calcul_parametres_services_prestations
JOIN activite.t_prestations ON t_prestations.code = 'FPU'
WHERE prestation_code = 'ATU' AND
(lieu_service_id::text||'-'||lieu_unite_fonctionnelle_id::text||'-'||t_prestations.code::text) NOT IN
(
SELECT lieu_service_id::text||'-'||lieu_unite_fonctionnelle_id::text||'-'||prestation_code::text FROM w_cti_encours_calcul_parametres_services_prestations
)
;
-- Le coefficient calculé est la somme des ATU FPU
UPDATE w_cti_encours_calcul_parametres_services_prestations
SET coefficient = subview.coefficient
FROM
(
SELECT lieu_service_id, lieu_unite_fonctionnelle_id,
CASE
WHEN base.cti_division(SUM(nombre), MAX(nb_externes)) < 0.05 THEN 0
WHEN base.cti_division(SUM(nombre), MAX(nb_externes)) > 0.95 THEN 1
ELSE round(base.cti_division(SUM(nombre), MAX(nb_externes)),2)
END AS coefficient
FROM w_cti_encours_calcul_parametres_services_prestations
WHERE prestation_code IN ('ATU','FPU')
GROUP BY 1,2
) subview
WHERE prestation_code IN ('ATU','FPU') AND
w_cti_encours_calcul_parametres_services_prestations.lieu_service_id = subview.lieu_service_id AND
w_cti_encours_calcul_parametres_services_prestations.lieu_unite_fonctionnelle_id = subview.lieu_unite_fonctionnelle_id
;
-- Prix unitaire moyen par jour
UPDATE w_cti_encours_calcul_parametres_services_prestations
SET prix_unitaire = base.cti_division(prix_unitaire_moyen * nombre , nb_journees + nb_ambulatoires)
WHERE prestation_type_valorisation = '*AVGJOUSER';
UPDATE w_cti_encours_calcul_parametres_services_prestations
SET prix_unitaire = 0
WHERE prestation_type_valorisation = '*AVGJOUSER' AND
(prix_unitaire < 20 AND base.cti_division(nombre,nb_journees + nb_ambulatoires) < 0.8 OR
prix_unitaire < 1
);
-- pas de séjour si absence
UPDATE w_cti_encours_calcul_parametres_services_prestations
SET prix_unitaire = 0
WHERE lieu_service_id IN
(
SELECT oid
FROM activite.t_services_facturation
WHERE est_absence = '1'
)
;
-- Prestations comme séjour, seulement si significatif
UPDATE w_cti_encours_calcul_parametres_services_prestations
SET prix_unitaire = 0
WHERE (prestation_type_valorisation IN ('PJ', 'GMT') OR prestation_code IN ('PJ', 'GMT')) AND
(prix_unitaire < 20 AND base.cti_division(nombre,nb_journees + nb_ambulatoires) < 0.8 OR
prix_unitaire < 1
);
UPDATE w_cti_encours_calcul_parametres_services_prestations
SET prix_unitaire = 0
WHERE (prestation_type_valorisation IN ('PJ', 'GMT') OR prestation_code IN ('PJ', 'GMT')) AND
(base.cti_division(nombre,nb_journees + nb_ambulatoires) < 0.2
);
-- Sauvegarde des prix calcules
UPDATE w_cti_encours_calcul_parametres_services_prestations SET
coefficient_calcule = coefficient,
prix_unitaire_calcule = prix_unitaire
;
-- Paramètres qui ne sont pas dans l'historique
INSERT INTO w_cti_encours_calcul_parametres_services_prestations
SELECT
t_calcul_encours.coefficient_mco
, t_calcul_encours.lieu_service_id
, t_calcul_encours.lieu_unite_fonctionnelle_id
, 0::numeric AS nb_ambulatoires
, 0::numeric AS nb_externes
, 0::numeric AS nb_seances
, 0::numeric AS nb_journees
, 0::numeric AS nb_journees_cp
, t_calcul_encours.prestation_id
, t_prestations.code AS prestation_code
, ''::text AS tranche_ght
, COALESCE(t_prestations.type_valorisation_non_facture,'') AS prestation_type_valorisation
, rubrique_facturation_id
, 0::numeric AS prix_unitaire
, 0::numeric AS nombre
, 0::numeric AS coefficient
, 0::numeric AS prix_unitaire_moyen_1
, 0::numeric AS nb_prix_unitaire_moyen_1
, 0::numeric AS prix_unitaire_moyen_3
, 0::numeric AS nb_prix_unitaire_moyen_3
, 0::numeric AS prix_unitaire_moyen
, ''::text AS regle_prestation_texte
, 0::numeric AS coefficient_calcule
, 0::numeric AS prix_unitaire_calcule
, '0'::text AS coefficient_is_force
, '0'::text AS prix_unitaire_is_force
, ''::text AS type_ligne
FROM activite.t_calcul_encours
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
WHERE
type_ligne = 'PRESTA-PC'
AND (
coefficient_is_force = '1'
OR prix_unitaire_is_force = '1'
)
AND (lieu_service_id::text||'-'||lieu_unite_fonctionnelle_id::text||'-'||prestation_id::text||'-'||rubrique_facturation_id::text) NOT IN
(
SELECT lieu_service_id::text||'-'||lieu_unite_fonctionnelle_id::text||'-'||prestation_id::text||'-'||rubrique_facturation_id::text
FROM w_cti_encours_calcul_parametres_services_prestations
)
;
DELETE FROM activite.t_calcul_encours
WHERE type_ligne = 'PRESTA-PC'
AND NOT (
coefficient_is_force = '1'
OR prix_unitaire_is_force = '1'
)
AND (lieu_service_id::text||'-'||lieu_unite_fonctionnelle_id::text||'-'||prestation_id::text||'-'||rubrique_facturation_id::text) NOT IN
(
SELECT lieu_service_id::text||'-'||lieu_unite_fonctionnelle_id::text||'-'||prestation_id::text||'-'||rubrique_facturation_id::text
FROM w_cti_encours_calcul_parametres_services_prestations
)
;
-- Coefficients et prix unitaire force
UPDATE w_cti_encours_calcul_parametres_services_prestations SET
coefficient = t_calcul_encours.coefficient_force,
coefficient_is_force = '1'
FROM activite.t_calcul_encours
WHERE t_calcul_encours.lieu_service_id = w_cti_encours_calcul_parametres_services_prestations.lieu_service_id AND
t_calcul_encours.lieu_unite_fonctionnelle_id = w_cti_encours_calcul_parametres_services_prestations.lieu_unite_fonctionnelle_id AND
t_calcul_encours.prestation_id = w_cti_encours_calcul_parametres_services_prestations.prestation_id AND
t_calcul_encours.rubrique_facturation_id = w_cti_encours_calcul_parametres_services_prestations.rubrique_facturation_id AND
t_calcul_encours.type_ligne LIKE 'PRESTA%' AND
t_calcul_encours.coefficient_is_force = '1'
;
UPDATE w_cti_encours_calcul_parametres_services_prestations SET
prix_unitaire = t_calcul_encours.prix_unitaire_force,
prix_unitaire_is_force = '1'
FROM activite.t_calcul_encours
WHERE t_calcul_encours.lieu_service_id = w_cti_encours_calcul_parametres_services_prestations.lieu_service_id AND
t_calcul_encours.lieu_unite_fonctionnelle_id = w_cti_encours_calcul_parametres_services_prestations.lieu_unite_fonctionnelle_id AND
t_calcul_encours.prestation_id = w_cti_encours_calcul_parametres_services_prestations.prestation_id AND
t_calcul_encours.rubrique_facturation_id = w_cti_encours_calcul_parametres_services_prestations.rubrique_facturation_id AND
t_calcul_encours.type_ligne LIKE 'PRESTA%' AND
t_calcul_encours.prix_unitaire_is_force = '1'
;
-- Texte des règles appliquéées
UPDATE w_cti_encours_calcul_parametres_services_prestations
SET regle_prestation_texte =
'Coefficient ' || to_char(coefficient,'FM90D00') ||
CASE WHEN coefficient_is_force <> '1'
THEN ' issu du taux de facturation de ' || prestation_code || ' (rubrique ' || t_rubriques_facturation.code || ')' ||
' : ' || to_char(nombre,'FM999999999999') || ' journées facturées sur ' ||
to_char(nb_journees,'FM999999999999') || ' journées dans le service ' ||
t_services_facturation.texte || ' (' || t_services_facturation.code || ') ' ||
'des séjours facturés sortis des ' || _ENCOURSRETROSUP || ' derniers mois (' || to_char(w_date_histo_coeff_presta,'DD/MM/YYYY') || ')'
ELSE ' forcé dans le paramétrage de la génération des encours ' END
FROM activite.t_services_facturation, activite.t_rubriques_facturation
WHERE lieu_service_id = t_services_facturation.oid AND
rubrique_facturation_id = t_rubriques_facturation.oid AND
w_cti_encours_calcul_parametres_services_prestations.coefficient > 0 AND
prestation_code IN ('SRC', 'REA', 'STF', 'AMD', 'AMF', 'IGM', 'IGP', 'APD', 'IMD', 'IMI', 'IPD', 'IVG', 'NN1', 'NN2', 'NN3');
UPDATE w_cti_encours_calcul_parametres_services_prestations
SET regle_prestation_texte =
'Coefficient ' || to_char(coefficient,'FM90D00') ||
CASE WHEN coefficient_is_force <> '1'
THEN ' issu du taux de facturation de ' || prestation_code || ' (rubrique ' || t_rubriques_facturation.code || ')' ||
' : ' || to_char(nombre,'FM999999999999') || ' journées facturées sur ' ||
to_char(nb_journees_cp,'FM999999999999') || ' journées en CP dans le service ' ||
t_services_facturation.texte || ' (' || t_services_facturation.code || ') ' ||
'des séjours facturés sortis des ' || _ENCOURSRETROSUP || ' derniers mois (' || to_char(w_date_histo_coeff_presta,'DD/MM/YYYY') || ')'
ELSE ' forcé dans le paramétrage de la génération des encours ' END
FROM activite.t_services_facturation, activite.t_rubriques_facturation
WHERE lieu_service_id = t_services_facturation.oid AND
rubrique_facturation_id = t_rubriques_facturation.oid AND
w_cti_encours_calcul_parametres_services_prestations.coefficient > 0 AND
(prestation_code IN ('CPC', 'SHO', 'CP') OR prestation_type_valorisation IN ('CP'));
UPDATE w_cti_encours_calcul_parametres_services_prestations
SET regle_prestation_texte =
'Coefficient ' || to_char(coefficient,'FM90D00') ||
CASE WHEN coefficient_is_force <> '1'
THEN ' issu du taux de facturation de ' || prestation_code || ' (rubrique ' || t_rubriques_facturation.code || ')' ||
' : ' || to_char(nombre,'FM999999999999') || ' séances facturées sur ' ||
to_char(nb_seances,'FM999999999999') || ' séances dans le service ' ||
t_services_facturation.texte || ' (' || t_services_facturation.code || ') ' ||
'des séjours facturés sortis des ' || _ENCOURSRETROSUP || ' derniers mois (' || to_char(w_date_histo_coeff_presta,'DD/MM/YYYY') || ')'
ELSE ' forcé dans le paramétrage de la génération des encours ' END
FROM activite.t_services_facturation, activite.t_rubriques_facturation
WHERE lieu_service_id = t_services_facturation.oid AND
rubrique_facturation_id = t_rubriques_facturation.oid AND
w_cti_encours_calcul_parametres_services_prestations.coefficient > 0 AND
prestation_code IN ('D09','D11', 'D13', 'D13', 'D15', 'D16', 'DTP');
UPDATE w_cti_encours_calcul_parametres_services_prestations
SET regle_prestation_texte =
'P.U. ' || to_char(prix_unitaire,'FM99999999990D00') ||
CASE WHEN prix_unitaire_is_force <> '1'
THEN ' issu du P.U. moyen quotidien ' ||
CASE
WHEN tranche_ght = '1' THEN '(<= 4j)'
WHEN tranche_ght = '2' THEN '(5-9j)'
WHEN tranche_ght = '3' THEN '(10-30j)'
ELSE '(> 30j)' END || ' de ' || prestation_code || ' (rubrique ' || t_rubriques_facturation.code || ')' ||
' : ' || to_char(nb_journees + nb_ambulatoires,'FM999999999999') || ' journées facturées pour un montant de ' ||
to_char(prix_unitaire_moyen * nombre,'FM999999999999') || ' euros dans le service ' ||
t_services_facturation.texte || ' (' || t_services_facturation.code || ') ' ||
'des séjours facturés sortis des ' || _ENCOURSRETROSUP || ' derniers mois (' || to_char(w_date_histo_coeff_presta,'DD/MM/YYYY') || ')'
ELSE ' forcé dans le paramétrage de la génération des encours ' END
FROM activite.t_services_facturation, activite.t_rubriques_facturation
WHERE lieu_service_id = t_services_facturation.oid AND
rubrique_facturation_id = t_rubriques_facturation.oid AND
w_cti_encours_calcul_parametres_services_prestations.prix_unitaire > 0 AND
(prestation_code IN ('GHT'))
;
UPDATE w_cti_encours_calcul_parametres_services_prestations
SET regle_prestation_texte =
'P.U. ' || to_char(prix_unitaire,'FM99999999990D00') ||
CASE WHEN prix_unitaire_is_force <> '1'
THEN ' issu du P.U. moyen quotidien de ' || prestation_code || ' (rubrique ' || t_rubriques_facturation.code || ')' ||
' : ' || to_char(nb_journees + nb_ambulatoires,'FM999999999999') || ' journées facturées pour un montant de ' ||
to_char(prix_unitaire_moyen * nombre,'FM999999999999') || ' euros dans le service ' ||
t_services_facturation.texte || ' (' || t_services_facturation.code || ') ' ||
'des séjours facturés sortis des ' || _ENCOURSRETROSUP || ' derniers mois (' || to_char(w_date_histo_coeff_presta,'DD/MM/YYYY') || ')'
ELSE ' forcé dans le paramétrage de la génération des encours ' END
FROM activite.t_services_facturation, activite.t_rubriques_facturation
WHERE lieu_service_id = t_services_facturation.oid AND
rubrique_facturation_id = t_rubriques_facturation.oid AND
w_cti_encours_calcul_parametres_services_prestations.prix_unitaire > 0 AND
(prestation_type_valorisation = '*AVGJOUSER' OR prestation_code IN ('GHT'))
;
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'Historique taux facturation AMO BG';
DROP TABLE IF EXISTS w_actes_120;
CREATE TEMP TABLE w_actes_120 AS
SELECT p_factures.no_sejour
FROM activite.p_factures_lignes_h
JOIN activite.p_factures ON p_factures_lignes_h.no_facture = p_factures.no_facture
WHERE p_factures_lignes_h.prix_unitaire >= 120
GROUP BY 1;
INSERT INTO w_actes_120
SELECT p_factures.no_sejour
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
WHERE p_factures_lignes_non_facturees_h.prix_unitaire >= 120
GROUP BY 1;
INSERT INTO w_cti_encours_factures_histo_taux
SELECT service_facturation_id, AVG(taux_ghs_1) AS taux_ghs_1, count(*) AS nb, ''::text AS regle_taux_texte
FROM
(
SELECT p_factures.no_sejour,
MAX(t_lieux.service_facturation_id) AS service_facturation_id,
MAX(COALESCE(taux_1,0)) AS taux_ghs_1
FROM activite.p_sejours
JOIN activite.p_factures 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 t_lieux.service_facturation_id = t_services_facturation.oid AND type_t2a = '1'
LEFT JOIN activite.p_factures_lignes_c ON p_factures_lignes_c.no_facture = p_factures.no_facture AND
prestation_id IN (SELECT oid FROM activite.t_prestations WHERE code = 'GHS')
WHERE p_sejours.est_budget_global = '1' AND
p_sejours.date_sortie BETWEEN w_date_histo_18 AND w_date_traitement AND
p_sejours.no_sejour NOT IN (SELECT no_sejour FROM w_actes_120) AND
(p_sejours.date_sortie - p_sejours.date_entree) <= 30
GROUP BY 1
HAVING MIN(p_factures.code_facture) >= '1'
) subview
GROUP BY 1
;
INSERT INTO w_cti_encours_factures_histo_taux
SELECT oid, 0, 0, ''::text AS regle_taux_texte
FROM activite.t_services_facturation
WHERE oid NOT IN (SELECT service_facturation_id FROM w_cti_encours_factures_histo_taux) AND
est_budget_global = '1'
;
UPDATE w_cti_encours_factures_histo_taux
SET taux_ghs_1 =
round(CASE
WHEN nb < 10 THEN (SELECT base.cti_division(SUM(taux_ghs_1*nb),SUM(nb)) FROM w_cti_encours_factures_histo_taux)
WHEN taux_ghs_1 > 99 THEN 100
ELSE taux_ghs_1
END,2),
nb = CASE
WHEN nb < 10 THEN (SELECT SUM(nb) FROM w_cti_encours_factures_histo_taux)
ELSE w_cti_encours_factures_histo_taux.nb END
;
UPDATE w_cti_encours_factures_histo_taux
SET regle_taux_texte = 'Ticket modérateur moyen ' || to_char(100-taux_ghs_1,'FM9990D00%') || ' des ' ||
to_char(nb,'FM99999990') || ' séjours Budget Global MCO facturés sortis depuis 18 mois (' || to_char(w_date_histo_18,'DD/MM/YYYY') || ') pour le service ' ||
t_services_facturation.texte || ' (' || t_services_facturation.code || ')'
FROM activite.t_services_facturation
WHERE service_facturation_id = t_services_facturation.oid AND
nb >= 10
;
UPDATE w_cti_encours_factures_histo_taux
SET regle_taux_texte = 'Ticket modérateur moyen ' || to_char(100-taux_ghs_1,'FM9990D00%') || ' des ' ||
to_char(nb,'FM99999990') || ' séjours Budget Global MCO sortis depuis 18 mois (' || to_char(w_date_histo_18,'DD/MM/YYYY') || ') pour tous les services'
WHERE nb < 10
;
UPDATE w_cti_encours_calcul_parametres_services_prestations
SET coefficient = 0, prix_unitaire = 0, prix_unitaire_moyen_1 = 0, prix_unitaire_moyen_3 = 0
FROM activite.t_services_facturation
WHERE lieu_service_id = t_services_facturation.oid AND
t_services_facturation.est_absence = '1'
;
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'Sejours a traiter';
INSERT INTO w_cti_encours_sejours
SELECT p_sejours.oid AS sejour_id,
p_sejours.no_sejour,
p_sejours.type_sejour,
p_sejours.est_budget_global,
CASE WHEN p_sejours.est_budget_global = '1' THEN '1' ELSE '2' END AS secteur_tarif,
t_medecins_administratifs.medecin_id AS medecin_sejour_id,
COALESCE(t_medecins.specialite_id,0) AS specialite_medecin_sejour_id,
t_lieux.service_facturation_id AS lieu_sortie_service_id,
t_lieux.unite_fonctionnelle_id AS lieu_sortie_unite_fonctionnelle_id,
code_sorti,
lieu_sortie_id,
mode_sortie,
date_groupage,
tiers_payant_1_id,
tiers_payant_2_id,
COALESCE(SUM(nb_seances),1) AS nb_ghs,
p_sejours.ghm_id,
p_sejours.ghs_id,
p_sejours.ghs_bebe1_id,
p_sejours.ghs_bebe2_id,
p_sejours.ghs_bebe3_id,
COALESCE(t_services_facturation.particularites_encours,''),
CASE WHEN p_sejours.type_sejour <> '3' THEN COALESCE(t_services_facturation.type_t2a,'0') ELSE '0' END
FROM w_cti_encours_calcul_parametres,
activite.p_sejours
JOIN activite.t_lieux ON lieu_sortie_id = t_lieux.oid
JOIN activite.t_services_facturation ON t_lieux.service_facturation_id = t_services_facturation.oid
JOIN activite.t_medecins_administratifs ON p_sejours.medecin_sejour_id = t_medecins_administratifs.oid
LEFT JOIN base.t_medecins ON t_medecins_administratifs.medecin_id = t_medecins.oid
LEFT JOIN activite.p_mouvements_sejour ON
p_sejours.no_sejour = p_mouvements_sejour.no_sejour AND
p_sejours.type_sejour = '5' AND nb_seances > 0
WHERE p_sejours.etat = '' AND
code_prevu = '0' AND
date_entree <= w_date_traitement AND
(code_sorti = '1' OR date_sortie >= w_date_histo_18) AND
p_sejours.type_sejour <> '9'
GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,17,18,19,20,21,22,23
;
UPDATE w_cti_encours_sejours
SET code_sorti = '1'
WHERE type_sejour = '5' AND
code_sorti <> '1'
;
ANALYSE w_cti_encours_sejours
;
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'Prix unitaire honoraires non factures' ;
UPDATE activite.p_factures_lignes_non_facturees_h
SET prix_unitaire = subview.prix_unitaire
FROM
(
SELECT acte_id, activite_ccam, modificateur_ccam_1, modificateur_ccam_2, modificateur_ccam_3, modificateur_ccam_4,
base.cti_division(SUM(montant_facture_1),SUM(nb_prestation*coefficient)) AS prix_unitaire
FROM activite.p_factures_lignes_h
WHERE acte_id IN (SELECT acte_id FROM activite.p_factures_lignes_non_facturees_h WHERE prix_unitaire = 0) AND
montant_facture_1 > 0
GROUP BY 1,2,3,4,5,6
) subview
WHERE p_factures_lignes_non_facturees_h.prix_unitaire = 0 AND
p_factures_lignes_non_facturees_h.acte_id = subview.acte_id AND
p_factures_lignes_non_facturees_h.activite_ccam = subview.activite_ccam AND
p_factures_lignes_non_facturees_h.modificateur_ccam_1 = subview.modificateur_ccam_1 AND
p_factures_lignes_non_facturees_h.modificateur_ccam_2 = subview.modificateur_ccam_2 AND
p_factures_lignes_non_facturees_h.modificateur_ccam_3 = subview.modificateur_ccam_3 AND
p_factures_lignes_non_facturees_h.modificateur_ccam_4 = subview.modificateur_ccam_4 AND
p_factures_lignes_non_facturees_h.prix_unitaire = 0
;
UPDATE activite.p_factures_lignes_non_facturees_h
SET prix_unitaire = subview.prix_unitaire
FROM
(
SELECT acte_id, activite_ccam,
base.Cti_division(SUM(montant_facture_1),SUM(nb_prestation*coefficient)) AS prix_unitaire
FROM activite.p_factures_lignes_h
WHERE acte_id IN (SELECT acte_id FROM activite.p_factures_lignes_non_facturees_h WHERE prix_unitaire = 0) AND
montant_facture_1 > 0
GROUP BY 1,2
) subview
WHERE p_factures_lignes_non_facturees_h.prix_unitaire = 0 AND
p_factures_lignes_non_facturees_h.acte_id = subview.acte_id AND
p_factures_lignes_non_facturees_h.activite_ccam = subview.activite_ccam AND
p_factures_lignes_non_facturees_h.prix_unitaire = 0
;
UPDATE activite.p_factures_lignes_non_facturees_h
SET prix_unitaire = subview.prix_unitaire
FROM
(
SELECT acte_id, prestation_id, (MAX(Array[date_debut::text,prix_unitaire::text]))[2]::numeric AS prix_unitaire
FROM activite.p_factures_lignes_h
WHERE prix_unitaire <> 0 AND
acte_id IN (SELECT acte_id FROM activite.p_factures_lignes_non_facturees_h WHERE prix_unitaire = 0)
GROUP BY 1,2
) subview
WHERE p_factures_lignes_non_facturees_h.prix_unitaire = 0 AND
p_factures_lignes_non_facturees_h.acte_id = subview.acte_id AND
p_factures_lignes_non_facturees_h.prestation_id = subview.prestation_id
;
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'Historique facturation GHS' ;
-- Sur HM, il y a un séjour spécifique pour bébé, il ne faut donc pas tenir compte du GHS bébé du prestataire précédent pour calculer les moyennes
-- Création d'une table de travail avec les GHS mères (cas de 2 prix unitaires GHS, on prend le plus grand)
DROP TABLE IF EXISTS w_cti_encours_calcul_ghs_hm_mat_mere;
CREATE TEMP TABLE w_cti_encours_calcul_ghs_hm_mat_mere AS
SELECT p_factures_lignes_c.no_facture AS no_facture_mat_mere,
p_factures_lignes_c.prestation_id AS prestation_id_mat_mere,
MAX(prix_unitaire) AS prix_unitaire_mat_mere
FROM activite.p_factures_lignes_c
JOIN activite.p_factures ON p_factures_lignes_c.no_facture = p_factures.no_facture
JOIN activite.p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
JOIN base.t_ghm ON p_sejours.ghm_id = t_ghm.oid
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
JOIN (
SELECT 1::integer AS ok_hm
FROM activite.t_providers
HAVING MAX(CASE WHEN oid = 0 AND code ILIKE 'HM' THEN 1 ELSE 0 END) = 1 AND
MAX(CASE WHEN oid <> 0 AND code NOT ILIKE 'HM' THEN 1 ELSE 0 END) = 1
) subview ON ok_hm = 1
WHERE t_prestations.code = 'GHS' AND p_factures.date_fin > '20170101' AND t_ghm.code LIKE '14%' AND
montant_facture > 0
GROUP BY 1,2
HAVING count(DISTINCT prix_unitaire) > 1
;
INSERT INTO w_cti_encours_histo_sejour_facture
SELECT
w_cti_encours_sejours.no_sejour,
p_factures.date_fin,
CASE WHEN MAX(t_ghm.code) LIKE '05C19%' THEN '05C19' WHEN MAX(t_prestations.code) = 'I01' THEN 'I01' ELSE '' END AS classe_ghm,
w_cti_encours_sejours.medecin_sejour_id,
w_cti_encours_sejours.specialite_medecin_sejour_id,
w_cti_encours_sejours.lieu_sortie_service_id,
w_cti_encours_sejours.lieu_sortie_unite_fonctionnelle_id,
w_cti_encours_sejours.nb_ghs,
CASE WHEN w_cti_encours_sejours.type_sejour = '5' THEN 'S'
WHEN p_factures.date_fin - p_factures.date_debut <= 1 THEN '1'
WHEN p_factures.date_fin - p_factures.date_debut <= 3 THEN '2'
WHEN p_factures.date_fin - p_factures.date_debut <= 6 THEN '3'
WHEN p_factures.date_fin - p_factures.date_debut <= 10 THEN '4'
ELSE '5' END as tranche_sejour,
CASE WHEN w_cti_encours_sejours.type_sejour = '5' THEN 0 ELSE p_factures.date_fin - p_factures.date_debut END as duree_sejour,
SUM(CASE WHEN base.cti_division(t_ghs_tarifs.tarif_ghs,t_ghs_tarifs_a.tarif_ghs) > 0 THEN montant_facture * base.cti_division(t_ghs_tarifs.tarif_ghs,t_ghs_tarifs_a.tarif_ghs) ELSE montant_facture END) AS montant_ghs,
SUM(montant_facture) AS montant_ghs_original,
MAX(p_factures_lignes_c.taux_0),
MAX(p_factures_lignes_c.taux_1),
MAX(p_factures_lignes_c.taux_2+p_factures_lignes_c.taux_22)
FROM activite.p_factures_lignes_c
LEFT JOIN w_cti_encours_calcul_ghs_hm_mat_mere ON
w_cti_encours_calcul_ghs_hm_mat_mere.no_facture_mat_mere = p_factures_lignes_c.no_facture AND
w_cti_encours_calcul_ghs_hm_mat_mere.prestation_id_mat_mere = p_factures_lignes_c.prestation_id
JOIN activite.p_factures ON p_factures_lignes_c.no_facture = p_factures.no_facture AND
p_factures.date_fin BETWEEN w_date_histo_18 AND w_date_traitement AND
p_factures.type_facture IN ('0','H','G') AND
p_factures.code_facture >= '1' AND p_factures.ghs_id > 0 AND p_factures.no_facture = p_factures.no_facture_reference
JOIN w_cti_encours_sejours ON p_factures.no_sejour = w_cti_encours_sejours.no_sejour AND w_cti_encours_sejours.code_sorti = '1'
LEFT JOIN base.t_ghs_tarifs ON t_ghs_tarifs.ghs_id = p_factures.ghs_id AND
t_ghs_tarifs.secteur = w_cti_encours_sejours.secteur_tarif AND t_ghs_tarifs.tarif_ghs <> 0 AND
w_date_encours BETWEEN t_ghs_tarifs.date_debut AND t_ghs_tarifs.date_fin
LEFT JOIN base.t_ghs_tarifs t_ghs_tarifs_a ON t_ghs_tarifs_a.ghs_id = p_factures.ghs_id AND
t_ghs_tarifs_a.secteur = w_cti_encours_sejours.secteur_tarif AND t_ghs_tarifs_a.tarif_ghs <> 0 AND
p_factures.date_fin BETWEEN t_ghs_tarifs_a.date_debut AND t_ghs_tarifs_a.date_fin
LEFT JOIN base.t_ghm ON w_cti_encours_sejours.ghm_id = t_ghm.oid
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
WHERE prestation_id IN (SELECT oid FROM activite.t_prestations WHERE code IN ('GHS', 'EXH', 'I01')) AND
montant_facture <> 0 AND
(
w_cti_encours_calcul_ghs_hm_mat_mere.no_facture_mat_mere IS NULL OR
w_cti_encours_calcul_ghs_hm_mat_mere.prix_unitaire_mat_mere = p_factures_lignes_c.prix_unitaire
)
GROUP BY 1,2,4,5,6,7,8,9,10;
-- Ajustement pour QSP (plusieurs factures pour le GHS
UPDATE w_cti_encours_histo_sejour_facture SET
montant_ghs = montant_ghs / taux_1 * 100,
montant_ghs_original = montant_ghs_original / taux_1 * 100
WHERE taux_1 BETWEEN 80 AND 90 AND
taux_0 = 0 AND
taux_2 = 0
;
-- Récupération historique d'un autre environnement (saint gatien)
IF EXISTS (
SELECT table_name
FROM information_schema.tables
WHERE table_schema || '.' || table_name = 'activite.t_encours_histo_sejour_facture_histo' ) THEN
INSERT INTO w_cti_encours_histo_sejour_facture
(
no_sejour,
date_fin,
classe_ghm,
medecin_sejour_id,
specialite_medecin_sejour_id,
lieu_sortie_service_id,
lieu_sortie_unite_fonctionnelle_id,
nb_ghs,
tranche_sejour,
duree_sejour,
montant_ghs,
montant_ghs_original,
taux_0,
taux_1,
taux_2
)
SELECT
no_sejour,
date_fin,
classe_ghm,
medecin_sejour_id,
specialite_medecin_sejour_id,
lieu_sortie_service_id,
lieu_sortie_unite_fonctionnelle_id,
nb_ghs,
tranche_sejour,
duree_sejour,
montant_ghs,
montant_ghs_original,
taux_0,
taux_1,
taux_2
FROM activite.t_encours_histo_sejour_facture_histo
;
END IF;
INSERT INTO w_cti_encours_histo_ghs (
classe_ghm,
regle,
medecin_sejour_id,
specialite_medecin_sejour_id,
lieu_sortie_service_id,
lieu_sortie_unite_fonctionnelle_id,
tranche_sejour,
duree_sejour,
nombre,
montant_moyen_ghs
)
(SELECT
classe_ghm,'01-MSD12'::text AS regle, medecin_sejour_id, specialite_medecin_sejour_id, lieu_sortie_service_id, lieu_sortie_unite_fonctionnelle_id, tranche_sejour::text, duree_sejour::integer,
count(*) as nombre, AVG(montant_ghs / nb_ghs) as montant_moyen_ghs
FROM w_cti_encours_histo_sejour_facture
WHERE montant_ghs <> 0 AND date_fin >= w_date_histo_12
GROUP BY 1,2,3,4,5,6,7,8
HAVING count(*) >= _NBSEJMIN_HISTOGHS)
UNION
(SELECT
classe_ghm,'02-MST12'::text AS regle, medecin_sejour_id, specialite_medecin_sejour_id, lieu_sortie_service_id, lieu_sortie_unite_fonctionnelle_id, tranche_sejour, null::integer,
count(*) as nombre, AVG(montant_ghs / nb_ghs)
FROM w_cti_encours_histo_sejour_facture
WHERE montant_ghs <> 0 AND date_fin >= w_date_histo_12
GROUP BY 1,2,3,4,5,6,7,8
HAVING count(*) >= _NBSEJMIN_HISTOGHS)
UNION
(SELECT
classe_ghm,'03-MSD18'::text AS regle, medecin_sejour_id, specialite_medecin_sejour_id, lieu_sortie_service_id, lieu_sortie_unite_fonctionnelle_id, tranche_sejour::text, duree_sejour::integer,
count(*) as nombre, AVG(montant_ghs / nb_ghs) as montant_moyen_ghs
FROM w_cti_encours_histo_sejour_facture
WHERE montant_ghs <> 0
GROUP BY 1,2,3,4,5,6,7,8
HAVING count(*) >= _NBSEJMIN_HISTOGHS)
UNION
(SELECT
classe_ghm,'04-MST18'::text AS regle, medecin_sejour_id, specialite_medecin_sejour_id, lieu_sortie_service_id, lieu_sortie_unite_fonctionnelle_id, tranche_sejour, null::integer,
count(*) as nombre, AVG(montant_ghs / nb_ghs)
FROM w_cti_encours_histo_sejour_facture
WHERE montant_ghs <> 0
GROUP BY 1,2,3,4,5,6,7,8
HAVING count(*) >= _NBSEJMIN_HISTOGHS)
UNION
(SELECT
classe_ghm,'05-PSD12'::text AS regle, NULL::bigint AS medecin_sejour_id, specialite_medecin_sejour_id, lieu_sortie_service_id, lieu_sortie_unite_fonctionnelle_id, tranche_sejour::text, duree_sejour::integer,
count(*) as nombre, AVG(montant_ghs / nb_ghs) as montant_moyen_ghs
FROM w_cti_encours_histo_sejour_facture
WHERE montant_ghs <> 0 AND date_fin >= w_date_histo_12
GROUP BY 1,2,3,4,5,6,7,8
HAVING count(*) >= _NBSEJMIN_HISTOGHS)
UNION
(SELECT
classe_ghm,'06-PST12'::text AS regle, NULL::bigint AS medecin_sejour_id, specialite_medecin_sejour_id, lieu_sortie_service_id, lieu_sortie_unite_fonctionnelle_id, tranche_sejour, null::integer,
count(*) as nombre, AVG(montant_ghs / nb_ghs)
FROM w_cti_encours_histo_sejour_facture
WHERE montant_ghs <> 0 AND date_fin >= w_date_histo_12
GROUP BY 1,2,3,4,5,6,7,8
HAVING count(*) >= _NBSEJMIN_HISTOGHS)
UNION
(SELECT
classe_ghm,'07-MXD12'::text AS regle, medecin_sejour_id, specialite_medecin_sejour_id, NULL::bigint, NULL::bigint, tranche_sejour::text, duree_sejour::integer,
count(*) as nombre, AVG(montant_ghs / nb_ghs) as montant_moyen_ghs
FROM w_cti_encours_histo_sejour_facture
WHERE montant_ghs <> 0 AND date_fin >= w_date_histo_12
GROUP BY 1,2,3,4,5,6,7,8
HAVING count(*) >= _NBSEJMIN_HISTOGHS)
UNION
(SELECT
classe_ghm,'08-MXT12'::text AS regle, medecin_sejour_id, specialite_medecin_sejour_id, NULL::bigint, NULL::bigint, tranche_sejour, null::integer,
count(*) as nombre, AVG(montant_ghs / nb_ghs)
FROM w_cti_encours_histo_sejour_facture
WHERE montant_ghs <> 0 AND date_fin >= w_date_histo_12
GROUP BY 1,2,3,4,5,6,7,8
HAVING count(*) >= _NBSEJMIN_HISTOGHS)
UNION
(SELECT
classe_ghm,'09-MXD18'::text AS regle, medecin_sejour_id, specialite_medecin_sejour_id, NULL::bigint, NULL::bigint, tranche_sejour::text, duree_sejour::integer,
count(*) as nombre, AVG(montant_ghs / nb_ghs) as montant_moyen_ghs
FROM w_cti_encours_histo_sejour_facture
WHERE montant_ghs <> 0
GROUP BY 1,2,3,4,5,6,7,8
HAVING count(*) >= _NBSEJMIN_HISTOGHS)
UNION
(SELECT
classe_ghm,'10-MXT18'::text AS regle, medecin_sejour_id, specialite_medecin_sejour_id, NULL::bigint, NULL::bigint, tranche_sejour, null::integer,
count(*) as nombre, AVG(montant_ghs / nb_ghs)
FROM w_cti_encours_histo_sejour_facture
WHERE montant_ghs <> 0
GROUP BY 1,2,3,4,5,6,7,8
HAVING count(*) >= _NBSEJMIN_HISTOGHS)
UNION
(SELECT
classe_ghm,'11-PXD12'::text AS regle, NULL::bigint AS medecin_sejour_id, specialite_medecin_sejour_id, NULL::bigint, NULL::bigint, tranche_sejour::text, duree_sejour::integer,
count(*) as nombre, AVG(montant_ghs / nb_ghs) as montant_moyen_ghs
FROM w_cti_encours_histo_sejour_facture
WHERE montant_ghs <> 0 AND date_fin >= w_date_histo_12
GROUP BY 1,2,3,4,5,6,7,8
HAVING count(*) >= _NBSEJMIN_HISTOGHS)
UNION
(SELECT
classe_ghm,'12-PXT12'::text AS regle, NULL::bigint AS medecin_sejour_id, specialite_medecin_sejour_id, NULL::bigint, NULL::bigint, tranche_sejour, null::integer,
count(*) as nombre, AVG(montant_ghs / nb_ghs)
FROM w_cti_encours_histo_sejour_facture
WHERE montant_ghs <> 0 AND date_fin >= w_date_histo_12
GROUP BY 1,2,3,4,5,6,7,8
HAVING count(*) >= _NBSEJMIN_HISTOGHS)
UNION
(SELECT
classe_ghm,'13-XSD18'::text AS regle, NULL::bigint, NULL::bigint, lieu_sortie_service_id, lieu_sortie_unite_fonctionnelle_id, tranche_sejour, duree_sejour::integer,
count(*) as nombre, AVG(montant_ghs / nb_ghs)
FROM w_cti_encours_histo_sejour_facture
WHERE montant_ghs <> 0 AND date_fin >= w_date_histo_12
GROUP BY 1,2,3,4,5,6,7,8
HAVING count(*) >= _NBSEJMIN_HISTOGHS)
UNION
(SELECT
classe_ghm,'21-MSX12'::text AS regle, medecin_sejour_id, specialite_medecin_sejour_id, lieu_sortie_service_id, lieu_sortie_unite_fonctionnelle_id, null::text, null::integer,
count(*) as nombre, AVG(montant_ghs / nb_ghs)
FROM w_cti_encours_histo_sejour_facture
WHERE montant_ghs <> 0 AND date_fin >= w_date_histo_12
GROUP BY 1,2,3,4,5,6,7,8
HAVING count(*) >= _NBSEJMIN_HISTOGHS)
UNION
(SELECT
classe_ghm,'22-MSX18'::text AS regle, medecin_sejour_id, specialite_medecin_sejour_id, lieu_sortie_service_id, lieu_sortie_unite_fonctionnelle_id, null::text, null::integer,
count(*) as nombre, AVG(montant_ghs / nb_ghs)
FROM w_cti_encours_histo_sejour_facture
WHERE montant_ghs <> 0
GROUP BY 1,2,3,4,5,6,7,8
HAVING count(*) >= _NBSEJMIN_HISTOGHS)
UNION
(SELECT
classe_ghm,'51-MXX12'::text AS regle, medecin_sejour_id, specialite_medecin_sejour_id, null::bigint, null::bigint, null::text, null::integer,
count(*) as nombre, AVG(montant_ghs / nb_ghs)
FROM w_cti_encours_histo_sejour_facture
WHERE montant_ghs <> 0 AND date_fin >= w_date_histo_12
GROUP BY 1,2,3,4,5,6,7,8
HAVING count(*) >= _NBSEJMIN_HISTOGHS)
UNION
(SELECT
classe_ghm,'52-MXX18'::text AS regle, medecin_sejour_id, specialite_medecin_sejour_id, null::bigint, null::bigint, null::text, null::integer,
count(*) as nombre, AVG(montant_ghs / nb_ghs)
FROM w_cti_encours_histo_sejour_facture
WHERE montant_ghs <> 0
GROUP BY 1,2,3,4,5,6,7,8
HAVING count(*) >= _NBSEJMIN_HISTOGHS)
UNION
(SELECT
classe_ghm,'61-XSX18'::text AS regle, null::bigint, null::bigint, lieu_sortie_service_id, lieu_sortie_unite_fonctionnelle_id, null::text, null::integer,
count(*) as nombre, AVG(montant_ghs / nb_ghs)
FROM w_cti_encours_histo_sejour_facture
WHERE montant_ghs <> 0
GROUP BY 1,2,3,4,5,6,7,8
HAVING count(*) >= _NBSEJMIN_HISTOGHS)
UNION
(SELECT classe_ghm,'99-XXX18'::text AS regle, null::bigint, null::bigint, null::bigint, null::bigint, null::text, null::integer,
count(*) as nombre, AVG(montant_ghs / nb_ghs)
FROM w_cti_encours_histo_sejour_facture
WHERE montant_ghs <> 0
GROUP BY 1,2,3,4,5,6,7,8)
ORDER BY 1,2,3,4;
-- Textes
UPDATE w_cti_encours_histo_ghs
SET medecin_sejour_texte = t_medecins.nom || ' ' || t_medecins.prenom || ' (' || t_medecins.code || ')'
FROM base.t_medecins
WHERE medecin_sejour_id = t_medecins.oid AND
medecin_sejour_id <> 0 AND
medecin_sejour_id IS NOT NULL
;
UPDATE w_cti_encours_histo_ghs
SET specialite_medecin_sejour_texte = t_specialites_medecin.texte || ' (' || t_specialites_medecin.code || ')'
FROM base.t_specialites_medecin
WHERE specialite_medecin_sejour_id = t_specialites_medecin.oid AND
specialite_medecin_sejour_id <> 0 AND
specialite_medecin_sejour_id IS NOT NULL
;
UPDATE w_cti_encours_histo_ghs
SET lieu_sortie_service_texte = t_services_facturation.texte || ' (' || t_services_facturation.code || ')'
FROM activite.t_services_facturation
WHERE lieu_sortie_service_id = t_services_facturation.oid AND
lieu_sortie_service_id <> 0 AND
lieu_sortie_service_id IS NOT NULL
;
UPDATE w_cti_encours_histo_ghs
SET lieu_sortie_unite_fonctionnelle_texte = t_unites_fonctionnelles.texte || ' (' || t_unites_fonctionnelles.code || ')'
FROM activite.t_unites_fonctionnelles
WHERE lieu_sortie_unite_fonctionnelle_id = t_unites_fonctionnelles.oid AND
lieu_sortie_unite_fonctionnelle_id <> 0 AND
lieu_sortie_unite_fonctionnelle_id IS NOT NULL
;
UPDATE w_cti_encours_histo_ghs
SET tranche_sejour_texte =
CASE tranche_sejour
WHEN 'S' THEN 'Séances'
WHEN '1' THEN '0 ou 1 nuit'
WHEN '2' THEN '2 ou 3 nuits'
WHEN '3' THEN '4,5 ou 6 nuits'
WHEN '4' THEN '7,8,9 ou 10 nuits'
WHEN '5' THEN '11 nuits et plus'
END
WHERE tranche_sejour IS NOT NULL
;
UPDATE w_cti_encours_histo_ghs
SET duree_sejour_texte =
CASE duree_sejour
WHEN 0 THEN '0 nuit'
WHEN 1 THEN '1 nuit'
ELSE duree_sejour::text || ' nuits'
END
WHERE duree_sejour IS NOT NULL
;
-- Calcul moyennes DMS
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'Historique DMS';
INSERT INTO w_cti_encours_histo_dms_sejours
SELECT w_cti_encours_sejours.no_sejour, w_cti_encours_sejours.medecin_sejour_id, w_cti_encours_sejours.specialite_medecin_sejour_id, w_cti_encours_sejours.lieu_sortie_service_id, w_cti_encours_sejours.lieu_sortie_unite_fonctionnelle_id,
p_factures.date_fin, p_factures.date_debut
FROM activite.p_factures
JOIN w_cti_encours_sejours ON p_factures.no_sejour = w_cti_encours_sejours.no_sejour AND code_sorti = '1'
WHERE p_factures.date_fin BETWEEN w_date_histo_18 AND w_date_traitement AND type_facture IN ('0','H','G') AND p_factures.no_facture = p_factures.no_facture_reference;
INSERT INTO w_cti_encours_histo_dms
SELECT '1'::text AS regle, medecin_sejour_id, specialite_medecin_sejour_id, lieu_sortie_service_id, lieu_sortie_unite_fonctionnelle_id, round(AVG(date_fin - date_debut),0) AS dms, count(*) AS occurences
FROM w_cti_encours_histo_dms_sejours
GROUP BY 1,2,3,4,5
HAVING count(*) >= _NBSEJMIN_HISTOGHS
UNION
SELECT '2'::text AS regle, medecin_sejour_id, specialite_medecin_sejour_id, null::bigint, null::bigint, round(AVG(date_fin - date_debut),0) AS dms, count(*) AS occurences
FROM w_cti_encours_histo_dms_sejours
GROUP BY 1,2,3,4,5
HAVING count(*) >= _NBSEJMIN_HISTOGHS
UNION
SELECT '3'::text AS regle, null::bigint, null::bigint, lieu_sortie_service_id, lieu_sortie_unite_fonctionnelle_id, round(AVG(date_fin - date_debut),0) AS dms, count(*) AS occurences
FROM w_cti_encours_histo_dms_sejours
GROUP BY 1,2,3,4,5
HAVING count(*) >= _NBSEJMIN_HISTOGHS
UNION
SELECT '9'::text AS regle, null::bigint, null::bigint, null::bigint, null::bigint, round(AVG(date_fin - date_debut),0) AS dms, count(*) AS occurences
FROM w_cti_encours_histo_dms_sejours
GROUP BY 1,2,3,4,5
HAVING count(*) >= _NBSEJMIN_HISTOGHS;
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'Extraction factures à valoriser';
INSERT INTO w_cti_encours_factures(
oid, sejour_id, no_sejour, type_sejour, classe_ghm, no_facture, no_facture_encours, no_facture_reference,
etat, code_sorti, date_encours, date_debut, date_fin, lieu_sortie_id, mode_sortie,
ghs_id, ghm_id, ghs_bebe1_id, ghs_bebe2_id, ghs_bebe3_id, type_t2a, est_budget_global, secteur_tarif, code_cp_demandee,
lieu_sortie_service_id, lieu_sortie_unite_fonctionnelle_id, medecin_sejour_id, specialite_medecin_sejour_id,
tiers_payant_1_id, tiers_payant_2_id, particularites_encours_service, uniquement_prestations_saisies)
SELECT
p_factures.oid, w_cti_encours_sejours.sejour_id, p_factures.no_sejour, w_cti_encours_sejours.type_sejour, ''::text AS classe_ghm, p_factures.no_facture,
p_factures.no_facture || '.EC' || substr(to_char(date_part('year', w_cti_encours_calcul_parametres.date_encours),'FM0000'),3,2) || to_char(date_part('month', w_cti_encours_calcul_parametres.date_encours),'FM00'),
p_factures.no_facture_reference,
CASE WHEN code_sorti <> '1' THEN 'E' WHEN p_factures.date_fin > w_date_traitement THEN 'E' ELSE 'S' END AS etat,
CASE WHEN code_sorti <> '1' THEN '0' WHEN p_factures.date_fin > w_date_traitement THEN '0' ELSE '1' END AS code_sorti,
w_cti_encours_calcul_parametres.date_encours,
p_factures.date_debut,
CASE WHEN date_fin <= w_date_traitement + interval '10 days' THEN p_factures.date_fin ELSE '20991231' END AS date_fin,
lieu_sortie_id,
mode_sortie,
CASE WHEN code_sorti <> '1' THEN 0 WHEN date_groupage <= w_date_traitement OR date_groupage = '20991231' THEN w_cti_encours_sejours.ghs_id ELSE 0 END AS ghs_id,
CASE WHEN code_sorti <> '1' THEN 0 WHEN date_groupage <= w_date_traitement OR date_groupage = '20991231' THEN w_cti_encours_sejours.ghm_id ELSE 0 END AS ghm_id,
CASE WHEN code_sorti <> '1' THEN 0 WHEN date_groupage <= w_date_traitement OR date_groupage = '20991231' THEN w_cti_encours_sejours.ghs_bebe1_id ELSE 0 END AS ghs_bebe1_id,
CASE WHEN code_sorti <> '1' THEN 0 WHEN date_groupage <= w_date_traitement OR date_groupage = '20991231' THEN w_cti_encours_sejours.ghs_bebe2_id ELSE 0 END AS ghs_bebe2_id,
CASE WHEN code_sorti <> '1' THEN 0 WHEN date_groupage <= w_date_traitement OR date_groupage = '20991231' THEN w_cti_encours_sejours.ghs_bebe3_id ELSE 0 END AS ghs_bebe3_id,
w_cti_encours_sejours.type_t2a,
est_budget_global,
CASE WHEN est_budget_global = '1' THEN '1' ELSE '2' END AS secteur_tarif,
p_factures.code_cp_demandee,
lieu_sortie_service_id,
lieu_sortie_unite_fonctionnelle_id,
medecin_sejour_id,
specialite_medecin_sejour_id,
CASE WHEN p_factures.tiers_payant_1_id <> 0 THEN p_factures.tiers_payant_1_id ELSE w_cti_encours_sejours.tiers_payant_1_id END,
CASE WHEN p_factures.tiers_payant_1_id <> 0 THEN p_factures.tiers_payant_2_id ELSE w_cti_encours_sejours.tiers_payant_2_id END,
w_cti_encours_sejours.particularites_encours_service,
CASE
WHEN p_factures.type_facture IN ('0','E') AND p_factures.no_facture = p_factures.no_facture_reference THEN '0'
WHEN p_factures.code_facture = '0' AND p_factures.no_facture LIKE '%BG' THEN '0'
WHEN est_budget_global = '1' THEN '0'
ELSE '1' END AS uniquement_prestations_saisies
FROM w_cti_encours_calcul_parametres,
activite.p_factures
JOIN w_cti_encours_sejours ON w_cti_encours_sejours.no_sejour = p_factures.no_sejour
WHERE
p_factures.type_facture <> 'P' AND
((p_factures.type_facture IN ('0','E') AND
p_factures.no_facture = p_factures.no_facture_reference)
OR
(p_factures.code_facture = '0' AND
p_factures.no_facture IN (SELECT no_facture FROM activite.p_factures_lignes_non_facturees_c))
OR
(p_factures.code_facture = '0' AND
p_factures.no_facture LIKE '%BG'
)
) AND
p_factures.date_debut <= w_date_traitement AND
(
(p_factures.code_facture = '0' AND p_factures.date_debut <= w_date_traitement)
OR
(p_factures.code_facture >= '1' AND date_facture > w_date_traitement AND date_facture <> '20991231' AND date_vente > w_date_encours)
);
UPDATE w_cti_encours_factures
SET date_fin =
GREATEST(date(date_debut +
COALESCE(
w_cti_encours_histo_dms_1.dms,
w_cti_encours_histo_dms_2.dms,
w_cti_encours_histo_dms_3.dms,
w_cti_encours_histo_dms_9.dms,
0
)::integer),w_date_sortie_max ),
dms = COALESCE(
w_cti_encours_histo_dms_1.dms,
w_cti_encours_histo_dms_2.dms,
w_cti_encours_histo_dms_3.dms,
w_cti_encours_histo_dms_9.dms,
0
),
regle_dms =
COALESCE(
w_cti_encours_histo_dms_1.regle,
w_cti_encours_histo_dms_2.regle,
w_cti_encours_histo_dms_3.regle,
w_cti_encours_histo_dms_9.regle,
'0'
)
FROM w_cti_encours_sejours
LEFT JOIN w_cti_encours_histo_dms w_cti_encours_histo_dms_1 ON
w_cti_encours_histo_dms_1.medecin_sejour_id = w_cti_encours_sejours.medecin_sejour_id AND
w_cti_encours_histo_dms_1.lieu_sortie_service_id = w_cti_encours_sejours.lieu_sortie_service_id AND
w_cti_encours_histo_dms_1.lieu_sortie_unite_fonctionnelle_id = w_cti_encours_sejours.lieu_sortie_unite_fonctionnelle_id
LEFT JOIN w_cti_encours_histo_dms w_cti_encours_histo_dms_2 ON
w_cti_encours_histo_dms_2.medecin_sejour_id = w_cti_encours_sejours.medecin_sejour_id AND
w_cti_encours_histo_dms_2.lieu_sortie_service_id IS NULL AND
w_cti_encours_histo_dms_2.lieu_sortie_unite_fonctionnelle_id IS NULL
LEFT JOIN w_cti_encours_histo_dms w_cti_encours_histo_dms_3 ON
w_cti_encours_histo_dms_3.medecin_sejour_id IS NULL AND
w_cti_encours_histo_dms_3.lieu_sortie_service_id = w_cti_encours_sejours.lieu_sortie_service_id AND
w_cti_encours_histo_dms_3.lieu_sortie_unite_fonctionnelle_id = w_cti_encours_sejours.lieu_sortie_unite_fonctionnelle_id
LEFT JOIN w_cti_encours_histo_dms w_cti_encours_histo_dms_9 ON
w_cti_encours_histo_dms_9.medecin_sejour_id IS NULL AND
w_cti_encours_histo_dms_9.lieu_sortie_service_id IS NULL AND
w_cti_encours_histo_dms_9.lieu_sortie_unite_fonctionnelle_id IS NULL
WHERE w_cti_encours_factures.no_sejour = w_cti_encours_sejours.no_sejour AND
w_cti_encours_factures.code_sorti = '0' AND
w_cti_encours_factures.type_sejour NOT IN ('2','3') AND
w_cti_encours_factures.date_fin = '20991231';
UPDATE w_cti_encours_factures
SET date_fin = date_debut,
dms = 0,
regle_dms = '0'
FROM w_cti_encours_sejours
WHERE w_cti_encours_factures.no_sejour = w_cti_encours_sejours.no_sejour AND
w_cti_encours_factures.code_sorti = '0' AND
w_cti_encours_factures.type_sejour IN ('2','3') AND
w_cti_encours_factures.date_fin = '20991231';
UPDATE w_cti_encours_factures
SET duree_sejour = CASE WHEN type_sejour <> '5' THEN date_fin - date_debut ELSE 0 END,
tranche_sejour =
CASE
WHEN type_sejour = '5' THEN 'S'
WHEN date_fin - date_debut <= 1 THEN '1'
WHEN date_fin - date_debut <= 3 THEN '2'
WHEN date_fin - date_debut <= 6 THEN '3'
WHEN date_fin - date_debut <= 10 THEN '4'
ELSE '5' END;
-- En ESPIC, les actes non factures sont peut être sur une autre facture que BG
UPDATE activite.p_factures_lignes_non_facturees_h
SET no_facture = subview.no_facture_bg
FROM
(
SELECT p_factures_lignes_non_facturees_h.no_facture, MAX(w_cti_encours_factures.no_facture) AS no_facture_bg
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 w_cti_encours_factures ON
p_factures.no_sejour = w_cti_encours_factures.no_sejour AND
w_cti_encours_factures.no_facture LIKE '%BG'
WHERE p_factures_lignes_non_facturees_h.date_debut BETWEEN w_cti_encours_factures.date_debut AND w_cti_encours_factures.date_fin
GROUP BY 1
HAVING p_factures_lignes_non_facturees_h.no_facture <> MAX(w_cti_encours_factures.no_facture)
) subview
WHERE p_factures_lignes_non_facturees_h.no_facture = subview.no_facture
;
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'Extraction CPC deja facturee';
INSERT INTO w_cti_encours_factures_deja_cpc(
no_facture_reference)
SELECT p_factures.no_facture_reference
FROM activite.p_factures_lignes_c
JOIN activite.p_factures ON p_factures_lignes_c.no_facture = p_factures.no_facture
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
WHERE p_factures_lignes_c.montant_facture <> 0 AND
p_factures.no_facture_reference IN (SELECT no_facture_reference FROM w_cti_encours_factures) AND
(t_prestations.code IN ('CPC', 'SHO', 'CP') OR
t_prestations.type_valorisation_non_facture IN ('CP')
)
GROUP BY 1
HAVING SUM(nb_prestation) > 0
;
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'Forcage code GHS';
--UPDATE w_cti_encours_factures
--SET ghs_id = t_ghs.oid
--FROM activite.t_forcage_encours_factures
--JOIN base.t_ghs ON t_ghs.code = t_forcage_encours_factures.ghs_code
--WHERE w_cti_encours_factures.no_sejour = t_forcage_encours_factures.no_sejour AND
-- t_forcage_encours_factures.etat_forcage_ghs = 'F' AND
-- t_forcage_encours_factures.ghs_code <> 0 AND
-- date_trunc('month',t_forcage_encours_factures.date_encours) = date_trunc('month',w_cti_encours_factures.date_encours)
--;
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'Generation des lignes valorisees';
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'GHS';
-- Deux passages pour la valorisation
-- premier passage sans tenir compte des GHS
-- second en en tenant compte
-- pour comparer les deux
IF _ENCOURSECARTGHSV > 0 THEN
w_simul = '';
ELSE
w_simul = '1';
END IF;
WHILE w_simul <> '0' LOOP
w_simul = CASE WHEN w_simul = '' THEN '1' ELSE '0' END;
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'GHS ' || w_simul;
TRUNCATE w_cti_encours_factures_lignes_c;
INSERT INTO w_cti_encours_factures_lignes_c(
no_sejour, no_facture, type_ligne, date_debut, date_fin, nb_rubrique, coefficient, coefficient_mco,
prestation_id, rubrique_facturation_id, rubrique_comptabilisation_id, ghs_id,
prix_unitaire, nb_prestation, montant_encours, lieu_id)
SELECT w_cti_encours_factures.no_sejour, w_cti_encours_factures.no_facture, 'GHS' AS type_ligne, date_debut, date_fin, GREATEST(date_fin - date_debut,1), 1, w_cti_encours_calcul_parametres.coefficient_mco,
COALESCE(w_cti_encours_calcul_parametres_services.prestation_ghs_id, w_cti_encours_calcul_parametres.prestation_ghs_id),
COALESCE(w_cti_encours_calcul_parametres_services.rubrique_facturation_ghs_id, w_cti_encours_calcul_parametres.rubrique_facturation_ghs_id),
COALESCE(w_cti_encours_calcul_parametres_services.rubrique_facturation_ghs_id, w_cti_encours_calcul_parametres.rubrique_facturation_ghs_id),
ghs_id,
0, 1, 0, lieu_sortie_id
FROM w_cti_encours_calcul_parametres,
w_cti_encours_factures
LEFT JOIN w_cti_encours_calcul_parametres_services ON
lieu_sortie_service_id = w_cti_encours_calcul_parametres_services.service_facturation_id AND
w_cti_encours_factures.type_sejour = w_cti_encours_calcul_parametres_services.type_sejour
WHERE w_cti_encours_factures.type_t2a = '1' AND w_cti_encours_factures.type_sejour <> '5' AND
uniquement_prestations_saisies <> '1' AND
w_cti_encours_factures.ghm_id NOT IN (SELECT ghm_id FROM w_cti_encours_ghm_sans_ghs) AND
w_cti_encours_factures.particularites_encours_service NOT ILIKE '%IVG%' AND
COALESCE(w_cti_encours_calcul_parametres_services.prestation_ghs_id, w_cti_encours_calcul_parametres.prestation_ghs_id) <> 0 AND
COALESCE(w_cti_encours_calcul_parametres_services.rubrique_facturation_ghs_id, w_cti_encours_calcul_parametres.rubrique_facturation_ghs_id) <> 0 AND
(w_cti_encours_factures.est_budget_global <> '1' OR w_cti_encours_factures.no_facture LIKE '%BG') AND
w_cti_encours_factures.no_facture NOT IN (
SELECT no_facture
FROM activite.p_factures_lignes_non_facturees_c
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
WHERE t_prestations.code IN ('I01')
);
INSERT INTO w_cti_encours_factures_lignes_c(
no_sejour, no_facture, type_ligne, date_debut, date_fin, nb_rubrique, coefficient, coefficient_mco,
prestation_id, rubrique_facturation_id, rubrique_comptabilisation_id, ghs_id,
prix_unitaire, nb_prestation, montant_encours, lieu_id)
SELECT w_cti_encours_factures.no_sejour, w_cti_encours_factures.no_facture, 'GHS' AS type_ligne, p_mouvements_sejour.date, p_mouvements_sejour.date, nb_seances, 1, w_cti_encours_calcul_parametres.coefficient_mco,
COALESCE(w_cti_encours_calcul_parametres_services.prestation_ghs_id, w_cti_encours_calcul_parametres.prestation_ghs_sea_id),
COALESCE(w_cti_encours_calcul_parametres_services.rubrique_facturation_ghs_id, w_cti_encours_calcul_parametres.rubrique_facturation_ghs_sea_id),
COALESCE(w_cti_encours_calcul_parametres_services.rubrique_facturation_ghs_id, w_cti_encours_calcul_parametres.rubrique_facturation_ghs_sea_id),
ghs_id,
0, nb_seances, 0, lieu_sortie_id
FROM w_cti_encours_calcul_parametres,
w_cti_encours_factures
LEFT JOIN w_cti_encours_calcul_parametres_services ON
lieu_sortie_service_id = w_cti_encours_calcul_parametres_services.service_facturation_id AND
w_cti_encours_factures.type_sejour = w_cti_encours_calcul_parametres_services.type_sejour
JOIN activite.p_mouvements_sejour ON w_cti_encours_factures.no_sejour = p_mouvements_sejour.no_sejour AND nb_seances > 0 AND p_mouvements_sejour.date BETWEEN w_cti_encours_factures.Date_debut AND w_cti_encours_factures.date_fin
WHERE
w_cti_encours_factures.type_t2a = '1' AND w_cti_encours_factures.type_sejour = '5' AND
uniquement_prestations_saisies <> '1' AND
COALESCE(w_cti_encours_calcul_parametres_services.prestation_ghs_id, w_cti_encours_calcul_parametres.prestation_ghs_sea_id) <> 0 AND
COALESCE(w_cti_encours_calcul_parametres_services.rubrique_facturation_ghs_id, w_cti_encours_calcul_parametres.rubrique_facturation_ghs_sea_id) <> 0 AND
(w_cti_encours_factures.est_budget_global <> '1' OR w_cti_encours_factures.no_facture LIKE '%BG') AND
lieu_sortie_service_id NOT IN (select lieu_service_id FROM w_cti_encours_calcul_parametres_services_prestations where prestation_code IN ('D09','D11','D13', 'D13', 'D15', 'D16', 'DTP') AND coefficient = 1);
-- GHS déjà connu
UPDATE w_cti_encours_factures_lignes_c SET
prix_unitaire = t_ghs_tarifs.tarif_ghs,
montant_encours = t_ghs_tarifs.tarif_ghs * w_cti_encours_factures_lignes_c.coefficient_mco,
borne_basse = t_ghs_tarifs.borne_basse,
borne_haute = t_ghs_tarifs.borne_haute,
forfait_exb = t_ghs_tarifs.forfait_exb,
tarif_exb = t_ghs_tarifs.tarif_exb,
duree_sejour = w_cti_encours_factures.date_fin - w_cti_encours_factures.date_debut,
regle_texte = 'GHS pour dossier groupé : ' || to_char(t_ghs.code,'FM0000') || ' (' || COALESCE(t_ghm.code || '-','') || COALESCE(t_ghm.texte,t_ghs.texte) || ')'
FROM w_cti_encours_factures
JOIN base.t_ghs ON t_ghs.oid = w_cti_encours_factures.ghs_id
JOIN base.t_ghs_tarifs ON t_ghs_tarifs.ghs_id = t_ghs.oid AND t_ghs_tarifs.secteur = w_cti_encours_factures.secteur_tarif AND w_cti_encours_factures.date_fin BETWEEN t_ghs_tarifs.date_debut AND t_ghs_tarifs.date_fin
LEFT JOIN base.t_ghm ON t_ghm.oid = w_cti_encours_factures.ghm_id
WHERE w_simul = '0' AND
w_cti_encours_factures_lignes_c.no_facture = w_cti_encours_factures.no_facture AND
montant_encours = 0 AND
w_cti_encours_factures.ghs_id <> 0 AND
type_ligne = 'GHS'
;
-- EXB sur GHS déjà connus
UPDATE w_cti_encours_factures_lignes_c
SET montant_encours =
CASE
WHEN forfait_exb > 0 THEN round(prix_unitaire - forfait_exb * w_cti_encours_factures_lignes_c.coefficient_mco,2)
WHEN forfait_exb = 0 AND tarif_exb > 0 AND duree_sejour = 0 THEN round(tarif_exb / 2 * coefficient_mco,2)
WHEN forfait_exb = 0 AND tarif_exb > 0 THEN round(prix_unitaire - (tarif_exb * (borne_basse-duree_sejour) * coefficient_mco),2)
ELSE montant_encours
END,
regle_texte = 'EXB pour dossier groupé'
WHERE w_simul = '0' AND
duree_sejour < borne_basse AND
prix_unitaire <> 0 AND
ghs_id <> 0 AND
type_ligne = 'GHS';
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'EXH';
-- EXH
INSERT INTO w_cti_encours_factures_lignes_c(
no_sejour, no_facture, type_ligne, date_debut, date_fin, lieu_id, nb_rubrique, coefficient, coefficient_mco,
prestation_id, rubrique_facturation_id, rubrique_comptabilisation_id,
prix_unitaire, nb_prestation, montant_encours, regle_texte)
SELECT w_cti_encours_factures.no_sejour, w_cti_encours_factures.no_facture, 'EXH' AS type_ligne, date(w_cti_encours_factures.date_debut + (t_ghs_tarifs.borne_haute || ' day')::interval),
w_cti_encours_factures.date_fin, w_cti_encours_factures.lieu_sortie_id, w_cti_encours_factures.date_fin - w_cti_encours_factures.date_debut - t_ghs_tarifs.borne_haute, 1, w_cti_encours_calcul_parametres.coefficient_mco,
prestation_exh_id, rubrique_facturation_exh_id, rubrique_comptabilisation_ghs_id,
t_ghs_tarifs.tarif_exh, w_cti_encours_factures.date_fin - w_cti_encours_factures.date_debut - t_ghs_tarifs.borne_haute, round(t_ghs_tarifs.tarif_exh * (w_cti_encours_factures.date_fin - w_cti_encours_factures.date_debut - t_ghs_tarifs.borne_haute) * w_cti_encours_calcul_parametres.coefficient_mco,2),
'EXH pour dossier groupé : Borne haute ' || t_ghs_tarifs.borne_haute || ' pour GHS ' || to_char(t_ghs.code,'FM0000') || ' (' || COALESCE(t_ghm.code || '-','') || COALESCE(t_ghm.texte,t_ghs.texte) || ')'
FROM w_cti_encours_calcul_parametres, w_cti_encours_factures
JOIN base.t_ghs ON t_ghs.oid = w_cti_encours_factures.ghs_id
LEFT JOIN base.t_ghm ON t_ghm.oid = w_cti_encours_factures.ghm_id
JOIN base.t_ghs_tarifs ON t_ghs_tarifs.ghs_id = t_ghs.oid AND
t_ghs_tarifs.secteur = w_cti_encours_factures.secteur_tarif AND
w_cti_encours_factures.date_fin BETWEEN t_ghs_tarifs.date_debut AND t_ghs_tarifs.date_fin
WHERE w_simul = '0' AND
w_cti_encours_factures.type_t2a = '1' AND type_sejour <> '5' AND
uniquement_prestations_saisies <> '1' AND
w_cti_encours_factures.ghs_id > 0 AND
t_ghs_tarifs.borne_haute > 0 AND
w_cti_encours_factures.date_fin - w_cti_encours_factures.date_debut > t_ghs_tarifs.borne_haute AND
COALESCE(rubrique_facturation_exh_id,0) <> 0 AND
COALESCE(prestation_exh_id,0) <> 0 AND
(w_cti_encours_factures.est_budget_global <> '1' OR w_cti_encours_factures.no_facture LIKE '%BG') ;
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'EXH (non groupes)';
-- EXH
INSERT INTO w_cti_encours_factures_lignes_c(
no_sejour, no_facture, type_ligne, date_debut, date_fin, lieu_id, nb_rubrique, coefficient, coefficient_mco,
prestation_id, rubrique_facturation_id, rubrique_comptabilisation_id,
prix_unitaire, nb_prestation, montant_encours, regle_texte)
SELECT w_cti_encours_factures.no_sejour, w_cti_encours_factures.no_facture, 'EXHNG' AS type_ligne, date(w_cti_encours_factures.date_debut + (base.cti_to_number(t_divers_bh.valeur) || ' day')::interval),
w_cti_encours_factures.date_fin, w_cti_encours_factures.lieu_sortie_id, w_cti_encours_factures.date_fin - w_cti_encours_factures.date_debut - base.cti_to_number(t_divers_bh.valeur), 1,
w_cti_encours_calcul_parametres.coefficient_mco,
prestation_exh_id, rubrique_facturation_exh_id, rubrique_comptabilisation_ghs_id,
base.cti_to_number(t_divers_xh.valeur), w_cti_encours_factures.date_fin - w_cti_encours_factures.date_debut - base.cti_to_number(t_divers_bh.valeur),
round(base.cti_to_number(t_divers_xh.valeur) * (w_cti_encours_factures.date_fin - w_cti_encours_factures.date_debut - base.cti_to_number(t_divers_bh.valeur)) * w_cti_encours_calcul_parametres.coefficient_mco,2),
'EXH fictif (pour dossiers non groupés) de ' || t_divers_xh.valeur || ' euros par journée au delà de ' || t_divers_bh.valeur || ' jours'
FROM w_cti_encours_calcul_parametres, w_cti_encours_factures
JOIN activite.t_divers t_divers_bh ON t_divers_bh.code = 'ENCOURSBORNEHAUTE' AND base.cti_to_number(t_divers_bh.valeur) > 0
JOIN activite.t_divers t_divers_xh ON t_divers_xh.code = 'ENCOURSEXHMOYEN' AND base.cti_to_number(t_divers_xh.valeur) > 0
WHERE
w_cti_encours_factures.type_t2a = '1' AND type_sejour <> '5' AND
uniquement_prestations_saisies <> '1' AND
(w_cti_encours_factures.ghs_id <= 0 OR w_simul = '1') AND
w_cti_encours_factures.date_fin - w_cti_encours_factures.date_debut > base.cti_to_number(t_divers_bh.valeur) AND
COALESCE(rubrique_facturation_exh_id,0) <> 0 AND
COALESCE(prestation_exh_id,0) <> 0 AND
(w_cti_encours_factures.est_budget_global <> '1' OR w_cti_encours_factures.no_facture LIKE '%BG')
;
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'GHS bebes';
-- GHS bébés
INSERT INTO w_cti_encours_factures_lignes_c(
no_sejour, no_facture, type_ligne, date_debut, date_fin, nb_rubrique, coefficient, coefficient_mco,
prestation_id, rubrique_facturation_id, rubrique_comptabilisation_id,
prix_unitaire, nb_prestation, montant_encours, lieu_id, regle_texte)
SELECT w_cti_encours_factures.no_sejour, w_cti_encours_factures.no_facture, 'GHSBB' AS type_ligne, w_cti_encours_factures.date_debut, w_cti_encours_factures.date_fin, 1, 1, w_cti_encours_calcul_parametres.coefficient_mco,
prestation_ghs_id, rubrique_facturation_ghs_id, rubrique_comptabilisation_ghs_id,
t_ghs_tarifs.tarif_ghs, 1, t_ghs_tarifs.tarif_ghs * w_cti_encours_calcul_parametres.coefficient_mco, lieu_sortie_id,
'GHS bébé pour dossier groupé : ' || to_char(t_ghs.code,'FM0000') || ' (' || t_ghs.texte || ')'
FROM w_cti_encours_calcul_parametres, w_cti_encours_factures
JOIN base.t_ghs ON t_ghs.oid = w_cti_encours_factures.ghs_bebe1_id
JOIN base.t_ghs_tarifs ON t_ghs.oid = w_cti_encours_factures.ghs_bebe1_id AND
t_ghs_tarifs.ghs_id = t_ghs.oid AND t_ghs_tarifs.secteur = w_cti_encours_factures.secteur_tarif AND w_cti_encours_factures.date_fin BETWEEN t_ghs_tarifs.date_debut AND t_ghs_tarifs.date_fin
WHERE w_simul = '0' AND
w_cti_encours_factures.type_t2a = '1' AND w_cti_encours_factures.ghs_bebe1_id > 0 AND
uniquement_prestations_saisies <> '1' AND
(w_cti_encours_factures.est_budget_global <> '1' OR w_cti_encours_factures.no_facture LIKE '%BG')
UNION
SELECT w_cti_encours_factures.no_sejour, w_cti_encours_factures.no_facture, 'GHSBB', w_cti_encours_factures.date_debut, w_cti_encours_factures.date_fin, 1, 1, w_cti_encours_calcul_parametres.coefficient_mco,
prestation_ghs_id, rubrique_facturation_ghs_id, rubrique_comptabilisation_ghs_id,
t_ghs_tarifs.tarif_ghs, 1, t_ghs_tarifs.tarif_ghs * w_cti_encours_calcul_parametres.coefficient_mco, lieu_sortie_id,
'GHS bébé pour dossier groupé : ' || to_char(t_ghs.code,'FM0000') || ' (' || t_ghs.texte || ')'
FROM w_cti_encours_calcul_parametres, w_cti_encours_factures
JOIN base.t_ghs ON t_ghs.oid = w_cti_encours_factures.ghs_bebe2_id
JOIN base.t_ghs_tarifs ON t_ghs.oid = w_cti_encours_factures.ghs_bebe2_id AND
t_ghs_tarifs.ghs_id = t_ghs.oid AND t_ghs_tarifs.secteur = w_cti_encours_factures.secteur_tarif AND w_cti_encours_factures.date_fin BETWEEN t_ghs_tarifs.date_debut AND t_ghs_tarifs.date_fin
WHERE w_simul = '0' AND
w_cti_encours_factures.type_t2a = '1' AND w_cti_encours_factures.ghs_bebe2_id > 0 AND
uniquement_prestations_saisies <> '1' AND
(w_cti_encours_factures.est_budget_global <> '1' OR w_cti_encours_factures.no_facture LIKE '%BG')
UNION
SELECT w_cti_encours_factures.no_sejour, w_cti_encours_factures.no_facture, 'GHSBB', w_cti_encours_factures.date_debut, w_cti_encours_factures.date_fin, 1, 1, w_cti_encours_calcul_parametres.coefficient_mco,
prestation_ghs_id, rubrique_facturation_ghs_id, rubrique_comptabilisation_ghs_id,
t_ghs_tarifs.tarif_ghs, 1, t_ghs_tarifs.tarif_ghs * w_cti_encours_calcul_parametres.coefficient_mco, lieu_sortie_id,
'GHS bébé pour dossier groupé : ' || to_char(t_ghs.code,'FM0000') || ' (' || t_ghs.texte || ')'
FROM w_cti_encours_calcul_parametres, w_cti_encours_factures
JOIN base.t_ghs ON t_ghs.oid = w_cti_encours_factures.ghs_bebe3_id
JOIN base.t_ghs_tarifs ON t_ghs.oid = w_cti_encours_factures.ghs_bebe3_id AND
t_ghs_tarifs.ghs_id = t_ghs.oid AND t_ghs_tarifs.secteur = w_cti_encours_factures.secteur_tarif AND w_cti_encours_factures.date_fin BETWEEN t_ghs_tarifs.date_debut AND t_ghs_tarifs.date_fin
WHERE w_simul = '0' AND
w_cti_encours_factures.type_t2a = '1' AND w_cti_encours_factures.ghs_bebe3_id > 0 AND
uniquement_prestations_saisies <> '1' AND
(w_cti_encours_factures.est_budget_global <> '1' OR w_cti_encours_factures.no_facture LIKE '%BG');
-- Valorisation non groupes
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'Valorisation GHS non groupes';
UPDATE w_cti_encours_factures
SET classe_ghm = '05C19'
WHERE EXISTS (
SELECT no_sejour
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
WHERE t_actes.code IN ('DELF013', 'DELF020', 'DELF014', 'DELF016', 'DELF086', 'DELA004','DEKA002')
AND w_cti_encours_factures.no_sejour = p_factures.no_sejour
);
UPDATE w_cti_encours_factures
SET classe_ghm = '05C19'
WHERE EXISTS (
SELECT no_sejour
FROM activite.p_factures_lignes_h
JOIN activite.p_factures ON p_factures_lignes_h.no_facture = p_factures.no_facture
JOIN base.t_actes ON acte_id = t_actes.oid
WHERE t_actes.code IN ('DELF013', 'DELF020', 'DELF014', 'DELF016', 'DELA004','DEKA002')
AND classe_ghm = ''
AND p_factures.no_sejour = w_cti_encours_factures.no_sejour
)
;
UPDATE w_cti_encours_factures
SET classe_ghm = 'I01'
WHERE EXISTS (
SELECT no_sejour
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
WHERE acte_id = ANY(SELECT oid FROM base.t_actes WHERE code IN('JGNJ900'))
AND w_cti_encours_factures.no_sejour = p_factures.no_sejour
);
UPDATE w_cti_encours_factures
SET classe_ghm = 'I01'
WHERE EXISTS (
SELECT no_sejour
FROM activite.p_factures_lignes_h
JOIN activite.p_factures ON p_factures_lignes_h.no_facture = p_factures.no_facture
WHERE acte_id = ANY(SELECT oid FROM base.t_actes WHERE code IN('JGNJ900'))
AND classe_ghm = ''
AND w_cti_encours_factures.no_sejour = p_factures.no_sejour
)
;
UPDATE w_cti_encours_factures_lignes_c SET
rubrique_facturation_id = rubrique_facturation_I01_id,
rubrique_comptabilisation_id = rubrique_comptabilisation_I01_id,
prestation_id = prestation_I01_id
FROM activite.t_prestations,
w_cti_encours_factures
JOIN w_cti_encours_calcul_parametres ON
rubrique_facturation_I01_id IS NOT NULL AND
rubrique_facturation_I01_id <> 0
WHERE w_cti_encours_factures_lignes_c.no_facture = w_cti_encours_factures.no_facture AND
w_cti_encours_factures_lignes_c.prestation_id = t_prestations.oid AND
classe_ghm = 'I01' AND
t_prestations.code = 'GHS'
;
UPDATE w_cti_encours_factures_lignes_c SET
montant_encours = montant_moyen_ghs,
prix_unitaire = montant_moyen_ghs,
prix_unitaire_calcule = montant_moyen_ghs,
regle_ghs = regle,
regle_texte = 'P.U. Moyen GHS calculé sur les ' || nombre || ' séjours des 12 derniers mois (' || w_date_histo_12 || ') du médecin ' || medecin_sejour_texte || ' dans le service ' || lieu_sortie_service_texte || ' avec une durée de séjour de ' || duree_sejour_texte,
type_ligne = 'GHSNG'
FROM w_cti_encours_factures
JOIN w_cti_encours_histo_ghs ON
w_cti_encours_histo_ghs.classe_ghm = w_cti_encours_factures.classe_ghm AND
w_cti_encours_histo_ghs.medecin_sejour_id = w_cti_encours_factures.medecin_sejour_id AND
w_cti_encours_histo_ghs.lieu_sortie_service_id = w_cti_encours_factures.lieu_sortie_service_id AND
w_cti_encours_histo_ghs.lieu_sortie_unite_fonctionnelle_id = w_cti_encours_factures.lieu_sortie_unite_fonctionnelle_id AND
w_cti_encours_histo_ghs.duree_sejour = w_cti_encours_factures.duree_sejour AND
w_cti_encours_histo_ghs.tranche_sejour = w_cti_encours_factures.tranche_sejour AND
regle = '01-MSD12'
WHERE w_cti_encours_factures_lignes_c.no_facture = w_cti_encours_factures.no_facture AND
montant_encours = 0 AND
type_ligne = 'GHS';
UPDATE w_cti_encours_factures_lignes_c SET
montant_encours = montant_moyen_ghs,
prix_unitaire = montant_moyen_ghs,
prix_unitaire_calcule = montant_moyen_ghs,
regle_ghs = regle,
regle_texte = 'P.U. Moyen GHS calculé sur les ' || nombre || ' séjours des 12 derniers mois (' || w_date_histo_12 || ') du médecin ' || medecin_sejour_texte || ' dans le service ' || lieu_sortie_service_texte || ' avec une durée de séjour de ' || tranche_sejour_texte,
type_ligne = 'GHSNG'
FROM w_cti_encours_factures
JOIN w_cti_encours_histo_ghs ON
w_cti_encours_histo_ghs.classe_ghm = w_cti_encours_factures.classe_ghm AND
w_cti_encours_histo_ghs.medecin_sejour_id = w_cti_encours_factures.medecin_sejour_id AND
w_cti_encours_histo_ghs.lieu_sortie_service_id = w_cti_encours_factures.lieu_sortie_service_id AND
w_cti_encours_histo_ghs.lieu_sortie_unite_fonctionnelle_id = w_cti_encours_factures.lieu_sortie_unite_fonctionnelle_id AND
w_cti_encours_histo_ghs.tranche_sejour = w_cti_encours_factures.tranche_sejour AND
regle = '02-MST12'
WHERE w_cti_encours_factures_lignes_c.no_facture = w_cti_encours_factures.no_facture AND
montant_encours = 0 AND
type_ligne = 'GHS';
UPDATE w_cti_encours_factures_lignes_c SET
montant_encours = montant_moyen_ghs,
prix_unitaire = montant_moyen_ghs,
prix_unitaire_calcule = montant_moyen_ghs,
regle_ghs = regle,
regle_texte = 'P.U. Moyen GHS calculé sur les ' || nombre || ' séjours des 18 derniers mois (' || w_date_histo_18 || ') du médecin ' || medecin_sejour_texte || ' dans le service ' || lieu_sortie_service_texte || ' avec une durée de séjour de ' || duree_sejour_texte,
type_ligne = 'GHSNG'
FROM w_cti_encours_factures
JOIN w_cti_encours_histo_ghs ON
w_cti_encours_histo_ghs.classe_ghm = w_cti_encours_factures.classe_ghm AND
w_cti_encours_histo_ghs.medecin_sejour_id = w_cti_encours_factures.medecin_sejour_id AND
w_cti_encours_histo_ghs.lieu_sortie_service_id = w_cti_encours_factures.lieu_sortie_service_id AND
w_cti_encours_histo_ghs.lieu_sortie_unite_fonctionnelle_id = w_cti_encours_factures.lieu_sortie_unite_fonctionnelle_id AND
w_cti_encours_histo_ghs.duree_sejour = w_cti_encours_factures.duree_sejour AND
w_cti_encours_histo_ghs.tranche_sejour = w_cti_encours_factures.tranche_sejour AND
regle = '03-MSD18'
WHERE w_cti_encours_factures_lignes_c.no_facture = w_cti_encours_factures.no_facture AND
montant_encours = 0 AND
type_ligne = 'GHS';
UPDATE w_cti_encours_factures_lignes_c SET
montant_encours = montant_moyen_ghs,
prix_unitaire = montant_moyen_ghs,
prix_unitaire_calcule = montant_moyen_ghs,
regle_ghs = regle,
regle_texte = 'P.U. Moyen GHS calculé sur les ' || nombre || ' séjours des 18 derniers mois (' || w_date_histo_18 || ') du médecin ' || medecin_sejour_texte || ' dans le service ' || lieu_sortie_service_texte || ' avec une durée de séjour de ' || tranche_sejour_texte,
type_ligne = 'GHSNG'
FROM w_cti_encours_factures
JOIN w_cti_encours_histo_ghs ON
w_cti_encours_histo_ghs.classe_ghm = w_cti_encours_factures.classe_ghm AND
w_cti_encours_histo_ghs.medecin_sejour_id = w_cti_encours_factures.medecin_sejour_id AND
w_cti_encours_histo_ghs.lieu_sortie_service_id = w_cti_encours_factures.lieu_sortie_service_id AND
w_cti_encours_histo_ghs.lieu_sortie_unite_fonctionnelle_id = w_cti_encours_factures.lieu_sortie_unite_fonctionnelle_id AND
w_cti_encours_histo_ghs.tranche_sejour = w_cti_encours_factures.tranche_sejour AND
regle = '04-MST18'
WHERE w_cti_encours_factures_lignes_c.no_facture = w_cti_encours_factures.no_facture AND
montant_encours = 0 AND
type_ligne = 'GHS';
UPDATE w_cti_encours_factures_lignes_c SET
montant_encours = montant_moyen_ghs,
prix_unitaire = montant_moyen_ghs,
prix_unitaire_calcule = montant_moyen_ghs,
regle_ghs = regle,
regle_texte = 'P.U. Moyen GHS calculé sur les ' || nombre || ' séjours des 12 derniers mois (' || w_date_histo_12 || ') de la spécialité ' || specialite_medecin_sejour_texte || ' dans le service ' || lieu_sortie_service_texte || ' avec une durée de séjour de ' || duree_sejour_texte,
type_ligne = 'GHSNG'
FROM w_cti_encours_factures
JOIN w_cti_encours_histo_ghs ON
w_cti_encours_histo_ghs.classe_ghm = w_cti_encours_factures.classe_ghm AND
w_cti_encours_histo_ghs.specialite_medecin_sejour_id = w_cti_encours_factures.specialite_medecin_sejour_id AND
w_cti_encours_histo_ghs.lieu_sortie_service_id = w_cti_encours_factures.lieu_sortie_service_id AND
w_cti_encours_histo_ghs.lieu_sortie_unite_fonctionnelle_id = w_cti_encours_factures.lieu_sortie_unite_fonctionnelle_id AND
w_cti_encours_histo_ghs.duree_sejour = w_cti_encours_factures.duree_sejour AND
w_cti_encours_histo_ghs.tranche_sejour = w_cti_encours_factures.tranche_sejour AND
regle = '05-PSD12'
WHERE w_cti_encours_factures_lignes_c.no_facture = w_cti_encours_factures.no_facture AND
montant_encours = 0 AND
type_ligne = 'GHS';
UPDATE w_cti_encours_factures_lignes_c SET
montant_encours = montant_moyen_ghs,
prix_unitaire = montant_moyen_ghs,
prix_unitaire_calcule = montant_moyen_ghs,
regle_ghs = regle,
regle_texte = 'P.U. Moyen GHS calculé sur les ' || nombre || ' séjours des 12 derniers mois (' || w_date_histo_12 || ') de la spécialité ' || specialite_medecin_sejour_texte || ' dans le service ' || lieu_sortie_service_texte || ' avec une durée de séjour de ' || tranche_sejour_texte,
type_ligne = 'GHSNG'
FROM w_cti_encours_factures
JOIN w_cti_encours_histo_ghs ON
w_cti_encours_histo_ghs.classe_ghm = w_cti_encours_factures.classe_ghm AND
w_cti_encours_histo_ghs.specialite_medecin_sejour_id = w_cti_encours_factures.specialite_medecin_sejour_id AND
w_cti_encours_histo_ghs.lieu_sortie_service_id = w_cti_encours_factures.lieu_sortie_service_id AND
w_cti_encours_histo_ghs.lieu_sortie_unite_fonctionnelle_id = w_cti_encours_factures.lieu_sortie_unite_fonctionnelle_id AND
w_cti_encours_histo_ghs.tranche_sejour = w_cti_encours_factures.tranche_sejour AND
regle = '06-PST12'
WHERE w_cti_encours_factures_lignes_c.no_facture = w_cti_encours_factures.no_facture AND
montant_encours = 0 AND
type_ligne = 'GHS';
UPDATE w_cti_encours_factures_lignes_c SET
montant_encours = montant_moyen_ghs,
prix_unitaire = montant_moyen_ghs,
prix_unitaire_calcule = montant_moyen_ghs,
regle_ghs = regle,
regle_texte = 'P.U. Moyen GHS calculé sur les ' || nombre || ' séjours des 12 derniers mois (' || w_date_histo_12 || ') du médecin ' || medecin_sejour_texte || ' avec une durée de séjour de ' || duree_sejour_texte,
type_ligne = 'GHSNG'
FROM w_cti_encours_factures
JOIN w_cti_encours_histo_ghs ON
w_cti_encours_histo_ghs.classe_ghm = w_cti_encours_factures.classe_ghm AND
w_cti_encours_histo_ghs.medecin_sejour_id = w_cti_encours_factures.medecin_sejour_id AND
w_cti_encours_histo_ghs.duree_sejour = w_cti_encours_factures.duree_sejour AND
w_cti_encours_histo_ghs.tranche_sejour = w_cti_encours_factures.tranche_sejour AND
regle = '07-MXD12'
WHERE w_cti_encours_factures_lignes_c.no_facture = w_cti_encours_factures.no_facture AND
montant_encours = 0 AND
type_ligne = 'GHS';
UPDATE w_cti_encours_factures_lignes_c SET
montant_encours = montant_moyen_ghs,
prix_unitaire = montant_moyen_ghs,
prix_unitaire_calcule = montant_moyen_ghs,
regle_ghs = regle,
regle_texte = 'P.U. Moyen GHS calculé sur les ' || nombre || ' séjours des 12 derniers mois (' || w_date_histo_12 || ') du médecin ' || medecin_sejour_texte || ' avec une durée de séjour de ' || tranche_sejour_texte,
type_ligne = 'GHSNG'
FROM w_cti_encours_factures
JOIN w_cti_encours_histo_ghs ON
w_cti_encours_histo_ghs.classe_ghm = w_cti_encours_factures.classe_ghm AND
w_cti_encours_histo_ghs.medecin_sejour_id = w_cti_encours_factures.medecin_sejour_id AND
w_cti_encours_histo_ghs.tranche_sejour = w_cti_encours_factures.tranche_sejour AND
regle = '08-MXT12'
WHERE w_cti_encours_factures_lignes_c.no_facture = w_cti_encours_factures.no_facture AND
montant_encours = 0 AND
type_ligne = 'GHS';
UPDATE w_cti_encours_factures_lignes_c SET
montant_encours = montant_moyen_ghs,
prix_unitaire = montant_moyen_ghs,
prix_unitaire_calcule = montant_moyen_ghs,
regle_ghs = regle,
regle_texte = 'P.U. Moyen GHS calculé sur les ' || nombre || ' séjours des 18 derniers mois (' || w_date_histo_18 || ') du médecin ' || medecin_sejour_texte || ' avec une durée de séjour de ' || duree_sejour_texte,
type_ligne = 'GHSNG'
FROM w_cti_encours_factures
JOIN w_cti_encours_histo_ghs ON
w_cti_encours_histo_ghs.classe_ghm = w_cti_encours_factures.classe_ghm AND
w_cti_encours_histo_ghs.medecin_sejour_id = w_cti_encours_factures.medecin_sejour_id AND
w_cti_encours_histo_ghs.duree_sejour = w_cti_encours_factures.duree_sejour AND
w_cti_encours_histo_ghs.tranche_sejour = w_cti_encours_factures.tranche_sejour AND
regle = '09-MXD18'
WHERE w_cti_encours_factures_lignes_c.no_facture = w_cti_encours_factures.no_facture AND
montant_encours = 0 AND
type_ligne = 'GHS';
UPDATE w_cti_encours_factures_lignes_c SET
montant_encours = montant_moyen_ghs,
prix_unitaire = montant_moyen_ghs,
prix_unitaire_calcule = montant_moyen_ghs,
regle_ghs = regle,
regle_texte = 'P.U. Moyen GHS calculé sur les ' || nombre || ' séjours des 18 derniers mois (' || w_date_histo_18 || ') du médecin ' || medecin_sejour_texte || ' avec une durée de séjour de ' || tranche_sejour_texte,
type_ligne = 'GHSNG'
FROM w_cti_encours_factures
JOIN w_cti_encours_histo_ghs ON
w_cti_encours_histo_ghs.classe_ghm = w_cti_encours_factures.classe_ghm AND
w_cti_encours_histo_ghs.medecin_sejour_id = w_cti_encours_factures.medecin_sejour_id AND
w_cti_encours_histo_ghs.tranche_sejour = w_cti_encours_factures.tranche_sejour AND
regle = '10-MXT18'
WHERE w_cti_encours_factures_lignes_c.no_facture = w_cti_encours_factures.no_facture AND
montant_encours = 0 AND
type_ligne = 'GHS';
UPDATE w_cti_encours_factures_lignes_c SET
montant_encours = montant_moyen_ghs,
prix_unitaire = montant_moyen_ghs,
prix_unitaire_calcule = montant_moyen_ghs,
regle_ghs = regle,
regle_texte = 'P.U. Moyen GHS calculé sur les ' || nombre || ' séjours des 12 derniers mois (' || w_date_histo_12 || ') de la spécialité ' || specialite_medecin_sejour_texte || ' avec une durée de séjour de ' || duree_sejour_texte,
type_ligne = 'GHSNG'
FROM w_cti_encours_factures
JOIN w_cti_encours_histo_ghs ON
w_cti_encours_histo_ghs.classe_ghm = w_cti_encours_factures.classe_ghm AND
w_cti_encours_histo_ghs.specialite_medecin_sejour_id = w_cti_encours_factures.specialite_medecin_sejour_id AND
w_cti_encours_histo_ghs.duree_sejour = w_cti_encours_factures.duree_sejour AND
w_cti_encours_histo_ghs.tranche_sejour = w_cti_encours_factures.tranche_sejour AND
regle = '11-PXD12'
WHERE w_cti_encours_factures_lignes_c.no_facture = w_cti_encours_factures.no_facture AND
montant_encours = 0 AND
type_ligne = 'GHS';
UPDATE w_cti_encours_factures_lignes_c SET
montant_encours = montant_moyen_ghs,
prix_unitaire = montant_moyen_ghs,
prix_unitaire_calcule = montant_moyen_ghs,
regle_ghs = regle,
regle_texte = 'P.U. Moyen GHS calculé sur les ' || nombre || ' séjours des 12 derniers mois (' || w_date_histo_12 || ') de la spécialité ' || specialite_medecin_sejour_texte || ' avec une durée de séjour de ' || tranche_sejour_texte,
type_ligne = 'GHSNG'
FROM w_cti_encours_factures
JOIN w_cti_encours_histo_ghs ON
w_cti_encours_histo_ghs.classe_ghm = w_cti_encours_factures.classe_ghm AND
w_cti_encours_histo_ghs.specialite_medecin_sejour_id = w_cti_encours_factures.specialite_medecin_sejour_id AND
w_cti_encours_histo_ghs.tranche_sejour = w_cti_encours_factures.tranche_sejour AND
regle = '12-PXT12'
WHERE w_cti_encours_factures_lignes_c.no_facture = w_cti_encours_factures.no_facture AND
montant_encours = 0 AND
type_ligne = 'GHS';
UPDATE w_cti_encours_factures_lignes_c SET
montant_encours = montant_moyen_ghs,
prix_unitaire = montant_moyen_ghs,
prix_unitaire_calcule = montant_moyen_ghs,
regle_ghs = regle,
regle_texte = 'P.U. Moyen GHS calculé sur les ' || nombre || ' séjours des 18 derniers mois (' || w_date_histo_18 || ') dans le service ' || lieu_sortie_service_texte || ' avec une durée de séjour de ' || duree_sejour_texte,
type_ligne = 'GHSNG'
FROM w_cti_encours_factures
JOIN w_cti_encours_histo_ghs ON
w_cti_encours_histo_ghs.classe_ghm = w_cti_encours_factures.classe_ghm AND
w_cti_encours_histo_ghs.lieu_sortie_service_id = w_cti_encours_factures.lieu_sortie_service_id AND
w_cti_encours_histo_ghs.lieu_sortie_unite_fonctionnelle_id = w_cti_encours_factures.lieu_sortie_unite_fonctionnelle_id AND
w_cti_encours_histo_ghs.duree_sejour = w_cti_encours_factures.duree_sejour AND
w_cti_encours_histo_ghs.tranche_sejour = w_cti_encours_factures.tranche_sejour AND
regle = '13-XSD18'
WHERE w_cti_encours_factures_lignes_c.no_facture = w_cti_encours_factures.no_facture AND
montant_encours = 0 AND
type_ligne = 'GHS';
UPDATE w_cti_encours_factures_lignes_c SET
montant_encours = montant_moyen_ghs,
prix_unitaire = montant_moyen_ghs,
prix_unitaire_calcule = montant_moyen_ghs,
regle_ghs = regle,
regle_texte = 'P.U. Moyen GHS calculé sur les ' || nombre || ' séjours des 12 derniers mois (' || w_date_histo_12 || ') du médecin ' || medecin_sejour_texte || ' dans le service ' || lieu_sortie_service_texte,
type_ligne = 'GHSNG'
FROM w_cti_encours_factures
JOIN w_cti_encours_histo_ghs ON
w_cti_encours_histo_ghs.classe_ghm = w_cti_encours_factures.classe_ghm AND
w_cti_encours_histo_ghs.medecin_sejour_id = w_cti_encours_factures.medecin_sejour_id AND
w_cti_encours_histo_ghs.lieu_sortie_service_id = w_cti_encours_factures.lieu_sortie_service_id AND
w_cti_encours_histo_ghs.lieu_sortie_unite_fonctionnelle_id = w_cti_encours_factures.lieu_sortie_unite_fonctionnelle_id AND
regle = '21-MSX12'
WHERE w_cti_encours_factures_lignes_c.no_facture = w_cti_encours_factures.no_facture AND
montant_encours = 0 AND
type_ligne = 'GHS';
UPDATE w_cti_encours_factures_lignes_c SET
montant_encours = montant_moyen_ghs,
prix_unitaire = montant_moyen_ghs,
prix_unitaire_calcule = montant_moyen_ghs,
regle_ghs = regle,
regle_texte = 'P.U. Moyen GHS calculé sur les ' || nombre || ' séjours des 18 derniers mois (' || w_date_histo_18 || ') du médecin ' || medecin_sejour_texte || ' dans le service ' || lieu_sortie_service_texte,
type_ligne = 'GHSNG'
FROM w_cti_encours_factures
JOIN w_cti_encours_histo_ghs ON
w_cti_encours_histo_ghs.classe_ghm = w_cti_encours_factures.classe_ghm AND
w_cti_encours_histo_ghs.medecin_sejour_id = w_cti_encours_factures.medecin_sejour_id AND
w_cti_encours_histo_ghs.lieu_sortie_service_id = w_cti_encours_factures.lieu_sortie_service_id AND
w_cti_encours_histo_ghs.lieu_sortie_unite_fonctionnelle_id = w_cti_encours_factures.lieu_sortie_unite_fonctionnelle_id AND
regle = '22-MSX18'
WHERE w_cti_encours_factures_lignes_c.no_facture = w_cti_encours_factures.no_facture AND
montant_encours = 0 AND
type_ligne = 'GHS';
UPDATE w_cti_encours_factures_lignes_c SET
montant_encours = montant_moyen_ghs,
prix_unitaire = montant_moyen_ghs,
prix_unitaire_calcule = montant_moyen_ghs,
regle_ghs = regle,
regle_texte = 'P.U. Moyen GHS calculé sur les ' || nombre || ' séjours des 12 derniers mois (' || w_date_histo_12 || ') du médecin ' || medecin_sejour_texte,
type_ligne = 'GHSNG'
FROM w_cti_encours_factures
JOIN w_cti_encours_histo_ghs ON
w_cti_encours_histo_ghs.classe_ghm = w_cti_encours_factures.classe_ghm AND
w_cti_encours_histo_ghs.medecin_sejour_id = w_cti_encours_factures.medecin_sejour_id AND
regle = '51-MXX12'
WHERE w_cti_encours_factures_lignes_c.no_facture = w_cti_encours_factures.no_facture AND
montant_encours = 0 AND
type_ligne = 'GHS';
UPDATE w_cti_encours_factures_lignes_c SET
montant_encours = montant_moyen_ghs,
prix_unitaire = montant_moyen_ghs,
prix_unitaire_calcule = montant_moyen_ghs,
regle_ghs = regle,
regle_texte = 'P.U. Moyen GHS calculé sur les ' || nombre || ' séjours des 18 derniers mois (' || w_date_histo_18 || ') du médecin ' || medecin_sejour_texte,
type_ligne = 'GHSNG'
FROM w_cti_encours_factures
JOIN w_cti_encours_histo_ghs ON
w_cti_encours_histo_ghs.classe_ghm = w_cti_encours_factures.classe_ghm AND
w_cti_encours_histo_ghs.medecin_sejour_id = w_cti_encours_factures.medecin_sejour_id AND
regle = '52-MXX18'
WHERE w_cti_encours_factures_lignes_c.no_facture = w_cti_encours_factures.no_facture AND
montant_encours = 0 AND
type_ligne = 'GHS';
UPDATE w_cti_encours_factures_lignes_c SET
montant_encours = montant_moyen_ghs,
prix_unitaire = montant_moyen_ghs,
prix_unitaire_calcule = montant_moyen_ghs,
regle_ghs = regle,
regle_texte = 'P.U. Moyen GHS calculé sur les ' || nombre || ' séjours des 18 derniers mois (' || w_date_histo_18 || ') dans le service ' || lieu_sortie_service_texte,
type_ligne = 'GHSNG'
FROM w_cti_encours_factures
JOIN w_cti_encours_histo_ghs ON
w_cti_encours_histo_ghs.classe_ghm = w_cti_encours_factures.classe_ghm AND
w_cti_encours_histo_ghs.lieu_sortie_service_id = w_cti_encours_factures.lieu_sortie_service_id AND
w_cti_encours_histo_ghs.lieu_sortie_unite_fonctionnelle_id = w_cti_encours_factures.lieu_sortie_unite_fonctionnelle_id AND
regle = '61-XSX18'
WHERE w_cti_encours_factures_lignes_c.no_facture = w_cti_encours_factures.no_facture AND
montant_encours = 0 AND
type_ligne = 'GHS';
UPDATE w_cti_encours_factures_lignes_c SET
montant_encours = montant_moyen_ghs,
prix_unitaire = montant_moyen_ghs,
prix_unitaire_calcule = montant_moyen_ghs,
regle_ghs = regle,
regle_texte = 'P.U. Moyen GHS calculé sur les ' || nombre || ' séjours des 18 derniers mois (' || w_date_histo_18 || ')',
type_ligne = 'GHSNG'
FROM w_cti_encours_factures
JOIN w_cti_encours_histo_ghs ON
w_cti_encours_histo_ghs.classe_ghm = w_cti_encours_factures.classe_ghm AND
regle = '99-XXX18'
WHERE w_cti_encours_factures_lignes_c.no_facture = w_cti_encours_factures.no_facture AND
montant_encours = 0 AND
type_ligne = 'GHS';
-- Forcage prix GHS selon paramétrage dossier
UPDATE w_cti_encours_factures_lignes_c SET
montant_encours = prix_unitaire_force,
prix_unitaire = prix_unitaire_force,
regle_ghs = '00-FORCE',
regle_texte = 'P.U. Moyen GHS forcé',
type_ligne = 'GHSNG'
FROM activite.t_calcul_encours
WHERE w_cti_encours_factures_lignes_c.no_sejour = t_calcul_encours.no_sejour AND
t_calcul_encours.type_ligne = 'GHSNG' AND
t_calcul_encours.prix_unitaire_is_force = '1' AND
w_cti_encours_factures_lignes_c.type_ligne = 'GHSNG';
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'GHS bebe moyen';
INSERT INTO w_cti_encours_factures_lignes_c(
no_sejour, no_facture, type_ligne, date_debut, date_fin, nb_rubrique, coefficient, coefficient_mco,
prestation_id, rubrique_facturation_id, rubrique_comptabilisation_id, ghs_id,
prix_unitaire, nb_prestation, montant_encours, lieu_id, regle_texte)
SELECT w_cti_encours_factures.no_sejour, w_cti_encours_factures.no_facture, 'GHSBBM' AS type_ligne, date_debut, date_fin, GREATEST(date_fin - date_debut,1), 1, w_cti_encours_calcul_parametres.coefficient_mco,
prestation_ghs_id, rubrique_facturation_ghs_id, rubrique_comptabilisation_ghs_id, -9981,
base.cti_to_number(t_divers.valeur), 1, base.cti_to_number(t_divers.valeur), w_cti_encours_factures.lieu_sortie_id,
'GHS Moyen paramétré pour les séjours bébés pour une maman dont le GHS est connu' AS regle_texte
FROM w_cti_encours_calcul_parametres,
w_cti_encours_factures
JOIN activite.t_divers ON t_divers.code = 'ENCOURSGHSMBB' AND base.cti_to_number(t_divers.valeur) <> 0
WHERE w_cti_encours_factures.type_t2a = '1' AND w_cti_encours_factures.type_sejour = '1' AND
uniquement_prestations_saisies <> '1' AND
(w_cti_encours_factures.ghs_bebe1_id <= 0 OR w_simul = '1') AND
w_cti_encours_factures.ghm_id NOT IN (SELECT oid FROM base.t_ghm WHERE code IN ('14Z08Z')) AND
w_cti_encours_factures.ghm_id IN (SELECT oid FROM base.t_ghm WHERE code LIKE ('14%') AND (texte ILIKE '%sarienne%' OR texte ILIKE '%accouchement%') AND texte NOT ILIKE '%faux%') AND
COALESCE(rubrique_facturation_ghs_id,0) <> 0 AND
COALESCE(prestation_ghs_id,0) <> 0 AND
(w_cti_encours_factures.est_budget_global <> '1' OR w_cti_encours_factures.no_facture LIKE '%BG') ;
-- A la fin du premier passage, conserver le résultat
IF _ENCOURSECARTGHSV > 0 AND w_simul = '1' THEN
DROP TABLE IF EXISTS w_cti_encours_factures_lignes_c_simul_ng;
CREATE TEMP TABLE w_cti_encours_factures_lignes_c_simul_ng AS
SELECT w_cti_encours_factures_lignes_c.*
FROM w_cti_encours_factures_lignes_c
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
WHERE t_prestations.code IN ('GHS','EXH')
;
END IF;
IF _ENCOURSECARTGHSV > 0 AND w_simul = '0' THEN
INSERT INTO activite.t_prestations
(code_original, code, texte, texte_court, clinique_honoraire)
VALUES
('*GHSECARTV', 'GHS-ECART', 'Alerte écart valorisation GHS groupé', 'Alerte écart valorisation GHS groupé', '')
ON CONFLICT ON CONSTRAINT t_prestations_code_key
DO UPDATE SET
code_original = EXCLUDED.code_original -- couvre le cas où code_original aurait été modifié (cf. import SIGEMS notamment)
, texte = EXCLUDED.texte
, texte_court = EXCLUDED.texte_court
, clinique_honoraire = EXCLUDED.clinique_honoraire
;
-- A la fin du second passage, enregistrer les écarts importants
INSERT INTO w_cti_encours_factures_lignes_c(
no_sejour,
no_facture,
type_ligne,
date_debut,
date_fin,
nb_rubrique,
coefficient,
coefficient_mco,
prestation_id,
rubrique_facturation_id,
rubrique_comptabilisation_id,
ghs_id,
prix_unitaire,
nb_prestation,
montant_encours,
lieu_id,
regle_texte)
SELECT subview_simul.no_sejour,
subview_simul.no_facture,
'GHSECART' AS type_ligne,
subview.date_debut,
subview.date_fin,
0::numeric AS nb_rubrique,
0::numeric AS coefficient,
0::numeric AS coefficient_mco,
t_prestations.oid AS prestation_id,
0::bigint AS rubrique_facturation_id,
0::bigint AS rubrique_comptabilisation_id,
subview.ghs_id,
0::numeric AS prix_unitaire,
0::numeric AS nb_prestation,
0::numeric AS montant_encours,
subview.lieu_id,
'Montant GHS inférieur (-' || (montant_encours_simul-montant_encours)::text || 'E) / ' || subview_simul.regle_texte
FROM
(
SELECT no_sejour, no_facture,
SUM(montant_encours) AS montant_encours_simul,
MAX(CASE WHEN t_prestations.code = 'GHS' THEN regle_texte ELSE '' END) AS regle_texte
FROM w_cti_encours_factures_lignes_c_simul_ng
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
WHERE t_prestations.code IN ('GHS','EXH')
GROUP BY 1,2
) subview_simul
JOIN
(
SELECT no_sejour,
no_facture,
SUM(montant_encours) AS montant_encours,
MAX(ghs_id) AS ghs_id,
MIN(date_debut) AS date_debut,
MAX(date_fin) AS date_fin,
MAX(lieu_id) AS lieu_id
FROM w_cti_encours_factures_lignes_c
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
WHERE t_prestations.code IN ('GHS','EXH')
GROUP BY 1,2
) subview ON
subview_simul.no_sejour = subview.no_sejour AND
subview_simul.no_facture = subview.no_facture
JOIN activite.t_prestations ON t_prestations.code_original = '*GHSECARTV'
left JOIN activite.t_rubriques_facturation ON t_rubriques_facturation.code_original = '*GHSECARTV'
WHERE subview_simul.montant_encours_simul - montant_encours >= _ENCOURSECARTGHSV
;
END IF;
END LOOP;
-- Ne pas générer ce qui est deja saisi en non facturé
INSERT INTO w_cti_factures_lignes_non_facturees_c
SELECT w_cti_encours_factures.no_sejour,
w_cti_encours_factures.no_facture,
CASE WHEN t_prestations.code IN ('FJA', 'FJR', 'FJS') THEN 'FJA'
WHEN t_prestations.code IN ('FJ') AND type_t2a = '1' THEN 'FJA'
ELSE t_prestations.code END AS prestation_code,
MIN(CASE WHEN code_sorti = '1' AND type_sejour = '1' AND (p_factures_lignes_non_facturees_c.date_debut = w_cti_encours_factures.date_fin OR p_factures_lignes_non_facturees_c.date_fin = w_cti_encours_factures.date_fin AND nb_rubrique = 1) THEN '1' ELSE '0' END),
MIN(COALESCE(t_prestations.type_valorisation_non_facture,'')) AS type_valorisation_non_facture
FROM w_cti_encours_factures
JOIN activite.p_factures_lignes_non_facturees_c ON w_cti_encours_factures.no_facture = p_factures_lignes_non_facturees_c.no_facture
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
WHERE t_prestations.code NOT IN ('GHS', 'EXH', 'SRC', 'REA', 'STF')
OR
(
t_prestations.code IN ('SRC', 'REA', 'STF') AND
w_cti_encours_factures.ghs_id > 0 AND
w_OPTION_ENCOURSMCOSUP = '1'
)
GROUP BY 1,2,3
UNION
SELECT w_cti_encours_factures.no_sejour,
w_cti_encours_factures.no_facture,
CASE WHEN t_prestations.code IN ('FJA', 'FJR', 'FJS') THEN 'FJA'
WHEN t_prestations.code IN ('FJ') AND type_t2a = '1' THEN 'FJA'
ELSE t_prestations.code END AS prestation_code,
MIN(CASE WHEN code_sorti = '1' AND type_sejour = '1' AND (p_factures_lignes_c.date_debut = w_cti_encours_factures.date_fin OR p_factures_lignes_c.date_fin = w_cti_encours_factures.date_fin AND nb_rubrique = 1) THEN '1' ELSE '0' END),
MIN(COALESCE(t_prestations.type_valorisation_non_facture,'')) AS type_valorisation_non_facture
FROM w_cti_encours_factures
JOIN activite.p_factures_lignes_c ON w_cti_encours_factures.no_facture = p_factures_lignes_c.no_facture
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
WHERE t_prestations.code NOT IN ('GHS', 'EXH', 'SRC', 'REA', 'STF', 'GMT') AND
w_cti_encours_factures.particularites_encours_service NOT ILIKE '%MAT%' AND
w_cti_encours_factures.particularites_encours_service NOT ILIKE '%PASDEFJA%' AND
montant_facture <> 0 AND
w_cti_encours_factures.date_fin <= w_date_traitement
GROUP BY 1,2,3
;
-- Si PJ en saisi, il faut considérer que le FJ est inclus si le FJ n'est pas saisi
INSERT INTO w_cti_factures_lignes_non_facturees_c
SELECT
w_cti_factures_lignes_non_facturees_c.no_sejour,
w_cti_factures_lignes_non_facturees_c.no_facture,
'FJ' AS prestation_code,
w_cti_factures_lignes_non_facturees_c.only_jour_sortie,
''::text AS type_valorisation_non_facture
FROM w_cti_factures_lignes_non_facturees_c
LEFT JOIN w_cti_factures_lignes_non_facturees_c w_cti_factures_lignes_non_facturees_c_fj ON
w_cti_factures_lignes_non_facturees_c.no_sejour = w_cti_factures_lignes_non_facturees_c_fj.no_sejour AND
w_cti_factures_lignes_non_facturees_c.no_facture = w_cti_factures_lignes_non_facturees_c_fj.no_facture AND
w_cti_factures_lignes_non_facturees_c_fj.prestation_code = 'FJ'
WHERE w_cti_factures_lignes_non_facturees_c.prestation_code = 'PJ' AND
w_cti_factures_lignes_non_facturees_c_fj.no_facture IS NULL
;
-- PJ FJ ENT GMT
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'PJ FJ ENT GMT';
INSERT INTO w_cti_encours_factures_lignes_c(no_sejour, no_facture, type_ligne, date_debut, date_fin, nb_rubrique, nb_prestation, coefficient, coefficient_mco, prestation_id, rubrique_facturation_id, rubrique_comptabilisation_id, prix_unitaire, montant_encours, lieu_id, regle_texte)
SELECT
w_cti_encours_factures.no_sejour
, w_cti_encours_factures.no_facture
, CASE
WHEN w_cti_encours_calcul_parametres_services_prestations.prestation_type_valorisation IN ('PJ') THEN 'PJ'
WHEN w_cti_encours_calcul_parametres_services_prestations.prestation_type_valorisation IN ('GMT') THEN 'GMT'
ELSE w_cti_encours_calcul_parametres_services_prestations.prestation_code END AS type_ligne
, p_mouvements_sejour.date
, p_mouvements_sejour.date
, 1
, 1
, 1
, 1
, prestation_id
, rubrique_facturation_id
, rubrique_facturation_id
, MAX(prix_unitaire)
, MAX(round(prix_unitaire,2))
, MAX(p_mouvements_sejour.lieu_id)
, 'GMT et forfaits journaliers'
FROM w_cti_encours_factures
JOIN activite.p_sejours ON w_cti_encours_factures.no_sejour = p_sejours.no_sejour
JOIN activite.t_divers ON t_divers.code = 'OPTADM_DAYOUT'
JOIN activite.p_mouvements_sejour ON w_cti_encours_factures.no_sejour = p_mouvements_sejour.no_sejour
JOIN activite.t_lieux ON p_mouvements_sejour.lieu_id = t_lieux.oid
JOIN w_cti_encours_calcul_parametres_services_prestations ON t_lieux.service_facturation_id = w_cti_encours_calcul_parametres_services_prestations.lieu_service_id
AND t_lieux.unite_fonctionnelle_id = w_cti_encours_calcul_parametres_services_prestations.lieu_unite_fonctionnelle_id
AND (
prestation_code IN ('GMT', 'PJ', 'FJ', 'ENT', 'PMS')
OR w_cti_encours_calcul_parametres_services_prestations.prestation_type_valorisation IN ('GMT', 'PJ','ENT')
)
LEFT JOIN w_cti_factures_lignes_non_facturees_c ON w_cti_factures_lignes_non_facturees_c.no_facture = w_cti_encours_factures.no_facture
AND w_cti_factures_lignes_non_facturees_c.prestation_code = w_cti_encours_calcul_parametres_services_prestations.prestation_code
WHERE
type_t2a IN ('2','3')
AND uniquement_prestations_saisies <> '1'
AND (est_jour_hospitalisation = '1'
OR p_mouvements_sejour.nb_ambulatoires = 1)
AND w_cti_factures_lignes_non_facturees_c.no_facture IS NULL
AND (
w_cti_encours_calcul_parametres_services_prestations.prestation_code IN ('PJ', 'FJ') AND type_t2a = 3 AND nb_sorties_directes = 0 AND p_mouvements_sejour.date <> p_sejours.date_sortie
OR w_cti_encours_calcul_parametres_services_prestations.prestation_code IN ('PJ', 'FJ') AND type_t2a = 3 AND nb_sorties_directes = 1 AND p_mouvements_sejour.date = p_sejours.date_sortie AND (p_mouvements_sejour.heure_fin > 130000 OR t_divers.valeur = '2')
OR w_cti_encours_calcul_parametres_services_prestations.prestation_code IN ('PJ', 'FJ') AND type_t2a = 3 AND p_mouvements_sejour.nb_ambulatoires = 1
OR w_cti_encours_calcul_parametres_services_prestations.prestation_code IN ('GMT', 'FJ') AND type_t2a = 2 AND nb_sorties_directes = 0 AND p_mouvements_sejour.date <> p_sejours.date_sortie
OR w_cti_encours_calcul_parametres_services_prestations.prestation_code IN ('GMT', 'FJ') AND type_t2a = 2 AND nb_sorties_directes = 1 AND p_mouvements_sejour.date = p_sejours.date_sortie AND (p_mouvements_sejour.heure_fin > 130000 OR t_divers.valeur = '2')
OR w_cti_encours_calcul_parametres_services_prestations.prestation_code IN ('GMT', 'FJ') AND type_t2a = 2 AND p_mouvements_sejour.nb_ambulatoires = 1
OR w_cti_encours_calcul_parametres_services_prestations.prestation_type_valorisation IN ('PJ') AND nb_sorties_directes = 0 AND p_mouvements_sejour.date <> p_sejours.date_sortie
OR w_cti_encours_calcul_parametres_services_prestations.prestation_type_valorisation IN ('PJ') AND nb_sorties_directes = 1 AND p_mouvements_sejour.date = p_sejours.date_sortie AND (p_mouvements_sejour.heure_fin > 130000 OR t_divers.valeur = '2')
OR w_cti_encours_calcul_parametres_services_prestations.prestation_type_valorisation IN ('PJ') AND p_mouvements_sejour.nb_ambulatoires = 1
OR w_cti_encours_calcul_parametres_services_prestations.prestation_code IN ('ENT') AND nb_entrees_directes = 1
OR w_cti_encours_calcul_parametres_services_prestations.prestation_type_valorisation IN ('ENT') AND nb_entrees_directes = 1
OR w_cti_encours_calcul_parametres_services_prestations.prestation_code IN ('PMS') AND p_mouvements_sejour.jour_semaine = 7
)
AND COALESCE(rubrique_facturation_id,0) <> 0
AND COALESCE(prestation_id,0) <> 0
AND (
p_mouvements_sejour.date BETWEEN w_cti_encours_factures.date_debut AND w_cti_encours_factures.date_fin
OR service_facturation_id NOT IN (SELECT oid FROM activite.t_services_facturation WHERE avec_facturation_intermediaire = '1'
)
)
GROUP BY
w_cti_encours_factures.no_sejour
, w_cti_encours_factures.no_facture
, 3
, p_mouvements_sejour.date
, 6
, 7
, 8
, 9
, prestation_id
, rubrique_facturation_id
, 16
;
UPDATE w_cti_encours_factures_lignes_c
SET
montant_encours = p_gmt_valorises.montant_valorise_par_jour
, prix_unitaire = p_gmt_valorises.montant_valorise_par_jour
FROM activite.p_gmt_valorises
WHERE 1 = 1
AND w_cti_encours_factures_lignes_c.no_sejour = p_gmt_valorises.no_sejour
AND w_cti_encours_factures_lignes_c.type_ligne = 'GMT'
AND w_cti_encours_factures_lignes_c.date_debut BETWEEN p_gmt_valorises.date_debut_gmt::date AND p_gmt_valorises.date_fin_gmt::date
;
-- Sur budget global, il faut générer le Ticket modérateur
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'TM Budget Global MCO';
INSERT INTO w_cti_encours_factures_lignes_c(
no_sejour, no_facture, type_ligne, date_debut, date_fin, nb_rubrique, nb_prestation, coefficient, coefficient_mco,
prestation_id, rubrique_facturation_id, rubrique_comptabilisation_id,
prix_unitaire, montant_encours, lieu_id, regle_texte)
SELECT w_cti_encours_factures.no_sejour, w_cti_encours_factures.no_facture, 'TMBG' AS type_ligne, p_mouvements_sejour.date, p_mouvements_sejour.date, 1, (100-taux_ghs_1)/100, 1, 1,
prestation_id, rubrique_facturation_id, rubrique_facturation_id,
prix_unitaire, round(prix_unitaire*(100-taux_ghs_1)/100), p_mouvements_sejour.lieu_id,
regle_taux_texte
FROM w_cti_encours_factures
JOIN activite.p_mouvements_sejour ON w_cti_encours_factures.no_sejour = p_mouvements_sejour.no_sejour
JOIN activite.t_lieux ON p_mouvements_sejour.lieu_id = t_lieux.oid
JOIN w_cti_encours_calcul_parametres_services_prestations ON t_lieux.service_facturation_id = w_cti_encours_calcul_parametres_services_prestations.lieu_service_id AND
t_lieux.unite_fonctionnelle_id = w_cti_encours_calcul_parametres_services_prestations.lieu_unite_fonctionnelle_id AND
(prestation_code IN ('PJ')
)
JOIN w_cti_encours_factures_histo_taux ON lieu_sortie_service_id = w_cti_encours_factures_histo_taux.service_facturation_id AND taux_ghs_1 < 100
WHERE
type_t2a = '1' AND
uniquement_prestations_saisies <> '1' AND
w_cti_encours_factures.no_facture NOT LIKE '%BG' AND
w_cti_encours_factures.no_sejour IN (SELECT no_sejour FROM w_cti_encours_factures_lignes_c WHERE prestation_id IN (SELECT oid FROM activite.t_prestations WHERE code = 'GHS')) AND
(est_jour_hospitalisation = '1' OR p_mouvements_sejour.nb_ambulatoires = 1) AND
(
w_cti_encours_calcul_parametres_services_prestations.prestation_code IN ('PJ') AND nb_sorties_directes = 0 AND p_mouvements_sejour.date <> w_cti_encours_factures.date_fin OR
w_cti_encours_calcul_parametres_services_prestations.prestation_code IN ('PJ') AND nb_sorties_directes = 0 AND p_mouvements_sejour.date = w_cti_encours_factures.date_fin AND p_mouvements_sejour.heure_fin > 130000 OR
w_cti_encours_calcul_parametres_services_prestations.prestation_code IN ('PJ') AND p_mouvements_sejour.nb_ambulatoires = 1
) AND
COALESCE(rubrique_facturation_id,0) <> 0 AND
COALESCE(prestation_id,0) <> 0 AND
(p_mouvements_sejour.date BETWEEN w_cti_encours_factures.date_debut AND w_cti_encours_factures.date_fin ) AND
w_cti_encours_factures.duree_sejour <= 30 AND
w_cti_encours_factures.no_sejour NOT IN (SELECT no_sejour FROm w_actes_120)
;
-- Sur budget global, il faut générer éventuellement les suppléments irradiation
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'Suppléments irradiation';
-- GHT (HAD)
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'GHT';
-- Tranche manquante
DROP TABLE IF EXISTS w_cti_encours_calcul_parametres_services_prestations_t;
CREATE TEMP TABLE w_cti_encours_calcul_parametres_services_prestations_t AS
SELECT w_cti_encours_calcul_parametres_services_prestations.*,
tranche_ght_req
FROM w_cti_encours_calcul_parametres_services_prestations
JOIN (
SELECT tranche_ght_req, lieu_service_id, lieu_unite_fonctionnelle_id, MAX(tranche_ght) AS tranche_ght_sel
FROM w_cti_encours_calcul_parametres_services_prestations
JOIN
(SELECT '1'::text AS tranche_ght_req UNION SELECT '2'::text UNION SELECT '3' UNION SELECT '9') subview ON 1=1
WHERE prestation_code = 'GHT' AND
(lieu_service_id || '-' || lieu_unite_fonctionnelle_id) NOT IN
(SELECT lieu_service_id || '-' || lieu_unite_fonctionnelle_id
FROM w_cti_encours_calcul_parametres_services_prestations
WHERE prestation_code = 'GHT' AND
tranche_ght = tranche_ght_req
)
GROUP BY 1,2,3
) subview ON
w_cti_encours_calcul_parametres_services_prestations.lieu_service_id = subview.lieu_service_id AND
w_cti_encours_calcul_parametres_services_prestations.lieu_unite_fonctionnelle_id = subview.lieu_unite_fonctionnelle_id AND
w_cti_encours_calcul_parametres_services_prestations.tranche_ght = tranche_ght_sel
;
UPDATE w_cti_encours_calcul_parametres_services_prestations_t
SET tranche_ght = tranche_ght_req
;
ALTER TABLE w_cti_encours_calcul_parametres_services_prestations_t DROP COLUMN tranche_ght_req
;
INSERT INTO w_cti_encours_calcul_parametres_services_prestations
SELECT *
FROM w_cti_encours_calcul_parametres_services_prestations_t
;
INSERT INTO w_cti_encours_factures_lignes_c(
no_sejour, no_facture, type_ligne, date_debut, date_fin, lieu_id, nb_rubrique, nb_prestation, coefficient, coefficient_mco,
prestation_id, rubrique_facturation_id, rubrique_comptabilisation_id,
prix_unitaire, montant_encours, regle_texte)
SELECT
w_cti_encours_factures.no_sejour, w_cti_encours_factures.no_facture, 'GHT' AS type_ligne, p_mouvements_sejour.date, p_mouvements_sejour.date, p_mouvements_sejour.lieu_id, 1, 1, coefficient, 1,
prestation_id, rubrique_facturation_id, rubrique_facturation_id,
prix_unitaire, round(prix_unitaire * coefficient,2), regle_prestation_texte
FROM w_cti_encours_factures
JOIN activite.p_mouvements_sejour ON w_cti_encours_factures.no_sejour = p_mouvements_sejour.no_sejour
JOIN activite.t_lieux ON p_mouvements_sejour.lieu_id = t_lieux.oid
JOIN activite.p_factures ON w_cti_encours_factures.no_facture = p_factures.no_facture
JOIN activite.p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
JOIN w_cti_encours_calcul_parametres_services_prestations ON t_lieux.service_facturation_id = w_cti_encours_calcul_parametres_services_prestations.lieu_service_id AND
t_lieux.unite_fonctionnelle_id = w_cti_encours_calcul_parametres_services_prestations.lieu_unite_fonctionnelle_id AND
w_cti_encours_calcul_parametres_services_prestations.prestation_code IN ('GHT') AND
CASE
WHEN p_mouvements_sejour.date - p_sejours.date_entree <= 3 THEN '1'
WHEN p_mouvements_sejour.date - p_sejours.date_entree BETWEEN 4 AND 8 THEN '2'
WHEN p_mouvements_sejour.date - p_sejours.date_entree BETWEEN 9 AND 30 THEN '3'
ELSE '9' END = tranche_ght
LEFT JOIN w_cti_factures_lignes_non_facturees_c ON w_cti_factures_lignes_non_facturees_c.no_facture = w_cti_encours_factures.no_facture AND
w_cti_factures_lignes_non_facturees_c.prestation_code = w_cti_encours_calcul_parametres_services_prestations.prestation_code
WHERE
type_t2a <> '1' AND
uniquement_prestations_saisies <> '1' AND
est_jour_hospitalisation = '1' AND
p_mouvements_sejour.date BETWEEN w_cti_encours_factures.date_debut AND w_cti_encours_factures.date_fin AND
(p_mouvements_sejour.date <> w_cti_encours_factures.date_fin OR p_mouvements_sejour.heure_fin > 130000 OR p_sejours.date_sortie = p_sejours.date_entree) AND
(nb_sorties_directes = 0 OR p_sejours.date_sortie = p_sejours.date_entree) AND
coefficient > 0 AND
w_cti_factures_lignes_non_facturees_c.no_facture IS NULL AND
COALESCE(rubrique_facturation_id,0) <> 0 AND
COALESCE(prestation_id,0) <> 0
ORDER BY 1,4;
-- Chambres particulières
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'Chambres particulieres';
-- Si plusieurs factures de référence (SSR), essayer de trouver la bonne prestation
DROP TABLE IF EXISTS w_cti_encours_sejour_deja_cpc;
CREATE TEMP TABLE w_cti_encours_sejour_deja_cpc AS
SELECT p_factures.no_sejour,
prestation_id,
MAX(t_prestations.code) AS prestation_code,
MAX(rubrique_facturation_id) AS rubrique_facturation_id,
MAX(p_factures_lignes_c.date_debut) AS date_debut,
(MAX(Array[p_factures_lignes_c.date_debut::text,
to_char(prix_unitaire,'FM000000000.00')]))[2]::numeric AS prix_unitaire
FROM activite.p_factures_lignes_c
JOIN activite.p_factures ON p_factures_lignes_c.no_facture = p_factures.no_facture
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
WHERE p_factures_lignes_c.montant_facture <> 0 AND
p_factures.no_sejour IN (SELECT no_sejour FROM w_cti_encours_factures) AND
p_factures.no_sejour IN (SELECT no_sejour FROM activite.p_factures WHERE no_facture = no_facture_reference GROUP BY 1 HAVING count(*) > 1) AND
(t_prestations.code IN ('CPC', 'SHO', 'CP') OR
t_prestations.type_valorisation_non_facture IN ('CP')
)
GROUP BY 1,2
HAVING SUM(nb_prestation) > 0
;
DELETE FROM w_cti_encours_sejour_deja_cpc
USING
(
SELECT no_sejour, MAX(date_debut) AS date_debut
FROM w_cti_encours_sejour_deja_cpc
GROUP BY 1
HAVING count(DISTINCT date_debut) > 1
) subview
WHERE w_cti_encours_sejour_deja_cpc.no_sejour = subview.no_sejour AND
w_cti_encours_sejour_deja_cpc.date_debut < subview.date_debut
;
-- Pas de CPC déjà facturées, prendre les moyennes
INSERT INTO w_cti_encours_factures_lignes_c(
no_sejour, no_facture, type_ligne, date_debut, date_fin, lieu_id, nb_rubrique, nb_prestation, coefficient, coefficient_mco,
prestation_id, rubrique_facturation_id, rubrique_comptabilisation_id,
prix_unitaire, montant_encours, regle_coefficient, regle_texte)
SELECT
w_cti_encours_factures.no_sejour, w_cti_encours_factures.no_facture, 'CPC' AS type_ligne, p_mouvements_sejour.date, p_mouvements_sejour.date, p_mouvements_sejour.lieu_id, 1, 1, coefficient, 1,
prestation_id, rubrique_facturation_id, rubrique_facturation_id,
prix_unitaire, round(prix_unitaire * coefficient,2), coefficient,
regle_prestation_texte
FROM w_cti_encours_factures
JOIN activite.p_mouvements_sejour ON w_cti_encours_factures.no_sejour = p_mouvements_sejour.no_sejour
JOIN activite.t_lieux ON p_mouvements_sejour.lieu_id = t_lieux.oid
JOIN activite.p_factures ON w_cti_encours_factures.no_facture = p_factures.no_facture
JOIN w_cti_encours_calcul_parametres_services_prestations ON t_lieux.service_facturation_id = w_cti_encours_calcul_parametres_services_prestations.lieu_service_id AND
t_lieux.unite_fonctionnelle_id = w_cti_encours_calcul_parametres_services_prestations.lieu_unite_fonctionnelle_id AND
w_cti_encours_calcul_parametres_services_prestations.prestation_type_valorisation <> ('*SAISIE') AND
(w_cti_encours_calcul_parametres_services_prestations.prestation_code IN ('CPC', 'SHO', 'CP') OR
w_cti_encours_calcul_parametres_services_prestations.prestation_type_valorisation IN ('CP')
)
LEFT JOIN w_cti_factures_lignes_non_facturees_c ON w_cti_factures_lignes_non_facturees_c.no_facture = w_cti_encours_factures.no_facture AND
(
w_cti_factures_lignes_non_facturees_c.prestation_code IN ('CPC', 'SHO', 'CP', 'FORAMB') OR
w_cti_factures_lignes_non_facturees_c.prestation_code = w_cti_encours_calcul_parametres_services_prestations.prestation_code OR
w_cti_factures_lignes_non_facturees_c.type_valorisation_non_facture IN ('CP')
) AND
only_jour_sortie <> '1'
WHERE
(p_mouvements_sejour.heure_fin = 240000 OR p_mouvements_sejour.nb_ambulatoires = 1) AND
est_chambre_particuliere = '1' AND
coefficient <> 0 AND
uniquement_prestations_saisies <> '1' AND
(p_mouvements_sejour.date <> w_cti_encours_factures.date_fin OR p_mouvements_sejour.heure_fin > 130000 OR p_mouvements_sejour.nb_ambulatoires = 1) AND
p_mouvements_sejour.date <= w_cti_encours_factures.date_fin AND
(p_factures.code_cp_demandee = '1' OR w_OPTION_ENCOURSVALOCP = '1') AND
nb_sorties_directes = 0 AND
w_cti_factures_lignes_non_facturees_c.no_facture IS NULL AND
COALESCE(rubrique_facturation_id,0) <> 0 AND
COALESCE(prestation_id,0) <> 0 AND
w_cti_encours_factures.no_facture NOT LIKE '%BG' AND
w_cti_encours_factures.no_facture_reference NOT IN (SELECT no_facture_reference FROM w_cti_encours_factures_deja_cpc) AND
w_cti_encours_factures.no_sejour NOT IN (SELECT no_sejour FROM w_cti_encours_sejour_deja_cpc) AND
(
p_mouvements_sejour.date BETWEEN w_cti_encours_factures.date_debut AND w_cti_encours_factures.date_fin OR
service_facturation_id NOT IN (SELECT oid FROM activite.t_services_facturation WHERE avec_facturation_intermediaire = '1')
)
ORDER BY 1,4;
-- CPC déjà facturées, prendre le dernier PU
INSERT INTO w_cti_encours_factures_lignes_c(
no_sejour, no_facture, type_ligne, date_debut, date_fin, lieu_id, nb_rubrique, nb_prestation, coefficient, coefficient_mco,
prestation_id, rubrique_facturation_id, rubrique_comptabilisation_id,
prix_unitaire, montant_encours, regle_coefficient, regle_texte)
SELECT
w_cti_encours_factures.no_sejour, w_cti_encours_factures.no_facture, 'CPC' AS type_ligne, p_mouvements_sejour.date, p_mouvements_sejour.date, p_mouvements_sejour.lieu_id, 1, 1, 1::numeric AS coefficient, 1,
prestation_id, rubrique_facturation_id, rubrique_facturation_id,
w_cti_encours_sejour_deja_cpc.prix_unitaire, w_cti_encours_sejour_deja_cpc.prix_unitaire, 1::numeric AS coefficient,
'Reconduite facturation antérieure ('||w_cti_encours_sejour_deja_cpc.date_debut::text||')' AS regle_prestation_texte
FROM w_cti_encours_factures
JOIN activite.p_mouvements_sejour ON w_cti_encours_factures.no_sejour = p_mouvements_sejour.no_sejour
JOIN activite.t_lieux ON p_mouvements_sejour.lieu_id = t_lieux.oid
JOIN activite.p_factures ON w_cti_encours_factures.no_facture = p_factures.no_facture
JOIN w_cti_encours_sejour_deja_cpc ON w_cti_encours_factures.no_sejour = w_cti_encours_sejour_deja_cpc.no_sejour
LEFT JOIN w_cti_factures_lignes_non_facturees_c ON w_cti_factures_lignes_non_facturees_c.no_facture = w_cti_encours_factures.no_facture AND
(
w_cti_factures_lignes_non_facturees_c.prestation_code IN ('CPC', 'SHO', 'CP', 'FORAMB') OR
w_cti_factures_lignes_non_facturees_c.prestation_code = w_cti_encours_sejour_deja_cpc.prestation_code OR
w_cti_factures_lignes_non_facturees_c.type_valorisation_non_facture IN ('CP')
) AND
only_jour_sortie <> '1'
WHERE
(p_mouvements_sejour.heure_fin = 240000 OR p_mouvements_sejour.nb_ambulatoires = 1) AND
est_chambre_particuliere = '1' AND
uniquement_prestations_saisies <> '1' AND
(p_mouvements_sejour.date <> w_cti_encours_factures.date_fin OR p_mouvements_sejour.heure_fin > 130000 OR p_mouvements_sejour.nb_ambulatoires = 1) AND
p_mouvements_sejour.date <= w_cti_encours_factures.date_fin AND
nb_sorties_directes = 0 AND
w_cti_factures_lignes_non_facturees_c.no_facture IS NULL AND
COALESCE(rubrique_facturation_id,0) <> 0 AND
COALESCE(prestation_id,0) <> 0 AND
w_cti_encours_factures.no_facture NOT LIKE '%BG' AND
w_cti_encours_factures.no_facture_reference NOT IN (SELECT no_facture_reference FROM w_cti_encours_factures_deja_cpc) AND
(
p_mouvements_sejour.date BETWEEN w_cti_encours_factures.date_debut AND w_cti_encours_factures.date_fin OR
service_facturation_id NOT IN (SELECT oid FROM activite.t_services_facturation WHERE avec_facturation_intermediaire = '1')
)
ORDER BY 1,4;
-- SRC, REA, STF
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'SRC, REA, STF';
INSERT INTO w_cti_encours_factures_lignes_c(
no_sejour, no_facture, type_ligne, date_debut, date_fin, nb_rubrique, nb_prestation, coefficient, coefficient_mco,
prestation_id, rubrique_facturation_id, rubrique_comptabilisation_id,
prix_unitaire, montant_encours, lieu_id, regle_coefficient, regle_texte)
SELECT w_cti_encours_factures.no_sejour, w_cti_encours_factures.no_facture, 'SSS' AS type_ligne, p_mouvements_sejour.date, p_mouvements_sejour.date, 1, 1, coefficient, 1,
prestation_id, rubrique_facturation_id, rubrique_facturation_id,
prix_unitaire, round(prix_unitaire * coefficient * coefficient_mco), (MAX(Array[p_mouvements_sejour.heure_fin,p_mouvements_sejour.lieu_id]))[2],
coefficient, regle_prestation_texte
FROM w_cti_encours_factures
JOIN activite.p_mouvements_sejour ON w_cti_encours_factures.no_sejour = p_mouvements_sejour.no_sejour
JOIN activite.t_lieux ON p_mouvements_sejour.lieu_id = t_lieux.oid
JOIN w_cti_encours_calcul_parametres_services_prestations ON t_lieux.service_facturation_id = w_cti_encours_calcul_parametres_services_prestations.lieu_service_id AND
t_lieux.unite_fonctionnelle_id = w_cti_encours_calcul_parametres_services_prestations.lieu_unite_fonctionnelle_id AND
prestation_code IN ('SRC', 'REA', 'STF')
WHERE
type_t2a = '1' AND
uniquement_prestations_saisies <> '1' AND
w_cti_encours_calcul_parametres_services_prestations.prestation_type_valorisation <> ('*SAISIE') AND
coefficient > 0 AND
COALESCE(rubrique_facturation_id,0) <> 0 AND
COALESCE(prestation_id,0) <> 0 AND
p_mouvements_sejour.date <= w_cti_encours_factures.date_fin AND
(w_cti_encours_factures.est_budget_global <> '1' OR w_cti_encours_factures.no_facture LIKE '%BG') AND
NOT (
w_OPTION_ENCOURSMCOSUP = '1' AND
w_cti_encours_factures.ghs_id > 0
)
GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,17
HAVING
(MAX(p_mouvements_sejour.heure_fin) = 240000 OR MIN(p_mouvements_sejour.heure_debut) > 0 AND MAX(p_mouvements_sejour.heure_fin) < 240000 OR
MAX(nb_sorties_directes) = 1 AND MAX(mode_sortie) IN ('9'))
;
-- IGM, IGP, IMD, IMI, IPD
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'AMD, AMF, APD, IGM, IGP, IMD, IMI, IPD, IVG';
INSERT INTO w_cti_encours_factures_lignes_c(
no_sejour, no_facture, type_ligne, date_debut, date_fin, nb_rubrique, nb_prestation, coefficient, coefficient_mco,
prestation_id, rubrique_facturation_id, rubrique_comptabilisation_id,
prix_unitaire, montant_encours, lieu_id, regle_coefficient,regle_texte)
SELECT w_cti_encours_factures.no_sejour, w_cti_encours_factures.no_facture, 'IVG' AS type_ligne, p_mouvements_sejour.date, p_mouvements_sejour.date, 1, 1, coefficient, 1,
prestation_id, rubrique_facturation_id, rubrique_facturation_id,
prix_unitaire, round(prix_unitaire * coefficient * coefficient_mco), p_mouvements_sejour.lieu_id,
coefficient, regle_prestation_texte
FROM w_cti_encours_factures
JOIN activite.p_mouvements_sejour ON w_cti_encours_factures.no_sejour = p_mouvements_sejour.no_sejour
JOIN activite.t_lieux ON p_mouvements_sejour.lieu_id = t_lieux.oid
JOIN w_cti_encours_calcul_parametres_services_prestations ON t_lieux.service_facturation_id = w_cti_encours_calcul_parametres_services_prestations.lieu_service_id AND
t_lieux.unite_fonctionnelle_id = w_cti_encours_calcul_parametres_services_prestations.lieu_unite_fonctionnelle_id AND
prestation_code IN ('AMD', 'AMF', 'APD', 'IGM', 'IGP', 'IMD', 'IMI', 'IPD', 'IVG')
LEFT JOIN w_cti_factures_lignes_non_facturees_c ON w_cti_factures_lignes_non_facturees_c.no_sejour = w_cti_encours_factures.no_sejour AND
w_cti_factures_lignes_non_facturees_c.prestation_code IN ('AMD', 'AMF', 'APD', 'IGM', 'IGP', 'IMD', 'IMI', 'IPD', 'IVG')
WHERE
(
p_mouvements_sejour.nb_externes = 1 OR
p_mouvements_sejour.nb_ambulatoires = 1 AND type_t2a <> '1' OR
w_cti_encours_factures.particularites_encours_service ILIKE '%IVG%' OR
w_cti_encours_factures.ghm_id IN (SELECT oid FROM base.t_ghm WHERE code IN ('14Z08Z'))
) AND
uniquement_prestations_saisies <> '1' AND
w_cti_encours_calcul_parametres_services_prestations.prestation_type_valorisation <> ('*SAISIE') AND
(p_mouvements_sejour.nb_externes = 1 OR p_mouvements_sejour.nb_ambulatoires = 1 OR p_mouvements_sejour.nb_entrees_directes = 1) AND
coefficient > 0 AND
w_cti_factures_lignes_non_facturees_c.no_facture IS NULL AND
(w_cti_encours_factures.est_budget_global <> '1' OR w_cti_encours_factures.no_facture LIKE '%BG') AND
COALESCE(rubrique_facturation_id,0) <> 0 AND
COALESCE(prestation_id,0) <> 0;
-- NN1, NN2, NN3
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'NN1, NN2, NN3';
INSERT INTO w_cti_encours_factures_lignes_c(
no_sejour, no_facture, type_ligne, date_debut, date_fin, nb_rubrique, nb_prestation, coefficient, coefficient_mco,
prestation_id, rubrique_facturation_id, rubrique_comptabilisation_id,
prix_unitaire, montant_encours, lieu_id, regle_coefficient, regle_texte)
SELECT w_cti_encours_factures.no_sejour, w_cti_encours_factures.no_facture, 'NNX' AS type_ligne, p_mouvements_sejour.date, p_mouvements_sejour.date, 1, 1, coefficient, 1,
prestation_id, rubrique_facturation_id, rubrique_facturation_id,
(MAX(ARRAY[p_mouvements_sejour.heure_fin,prix_unitaire]))[2],
(MAX(ARRAY[p_mouvements_sejour.heure_fin,round(prix_unitaire * coefficient * coefficient_mco)]))[2],
(MAX(ARRAY[p_mouvements_sejour.heure_fin,p_mouvements_sejour.lieu_id]))[2],
(MAX(ARRAY[p_mouvements_sejour.heure_fin,coefficient]))[2],
(MAX(ARRAY[to_char(p_mouvements_sejour.heure_fin,'000000'),regle_prestation_texte]))[2]
FROM w_cti_encours_factures
JOIN activite.p_mouvements_sejour ON w_cti_encours_factures.no_sejour = p_mouvements_sejour.no_sejour AND
p_mouvements_sejour.date BETWEEN w_cti_encours_factures.date_debut AND w_cti_encours_factures.date_fin
JOIN activite.t_lieux ON p_mouvements_sejour.lieu_id = t_lieux.oid
JOIN w_cti_encours_calcul_parametres_services_prestations ON t_lieux.service_facturation_id = w_cti_encours_calcul_parametres_services_prestations.lieu_service_id AND
t_lieux.unite_fonctionnelle_id = w_cti_encours_calcul_parametres_services_prestations.lieu_unite_fonctionnelle_id AND
prestation_code IN ('NN1', 'NN2', 'NN3')
LEFT JOIN w_cti_factures_lignes_non_facturees_c ON w_cti_factures_lignes_non_facturees_c.no_facture = w_cti_encours_factures.no_facture AND
w_cti_factures_lignes_non_facturees_c.prestation_code LIKE 'NN%'
WHERE
(p_mouvements_sejour.heure_fin = 240000 OR p_mouvements_sejour.heure_debut > 0 AND p_mouvements_sejour.heure_fin < 240000) AND
type_t2a = '1' AND
uniquement_prestations_saisies <> '1' AND
w_cti_encours_calcul_parametres_services_prestations.prestation_type_valorisation <> ('*SAISIE') AND
coefficient > 0 AND
w_cti_factures_lignes_non_facturees_c.no_facture IS NULL AND
COALESCE(rubrique_facturation_id,0) <> 0 AND
COALESCE(prestation_id,0) <> 0 AND
(w_cti_encours_factures.est_budget_global <> '1' OR w_cti_encours_factures.no_facture LIKE '%BG')
GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12;
-- D09 D11 D13
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'Dxx';
-- Seances de dialyse dans les actes non facturés
DROP TABLE IF EXISTS w_actes_seance_jvj;
CREATE TEMP TABLE w_actes_seance_jvj AS
SELECT p_factures.no_sejour, p_factures_lignes_non_facturees_h.date_debut AS date_seance
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
WHERE t_actes.code LIKE 'JVJ%' AND t_actes.code NOT LIKE 'JVJF002%'
GROUP BY 1,2
;
-- Seances deja facturées
DROP TABLE IF EXISTS w_cti_factures_seances_deja_facturees;
CREATE TEMP TABLE w_cti_factures_seances_deja_facturees AS
SELECT p_sejours.no_sejour, p_factures_lignes_c.date_debut
FROM activite.p_factures
JOIN activite.p_sejours ON p_sejours.no_sejour = p_factures.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 type_sejour = '5' AND
montant_facture <> 0 AND
t_prestations.code IN ('D09','D11','D13', 'D13', 'D15', 'D16', 'DTP') AND
p_sejours.no_sejour IN (SElECT no_sejour FROM activite.p_factures WHERE code_facture = '0')
GROUP BY 1,2
HAVING SUM(montant_facture) > 0
;
CREATE INDEX i_w_cti_factures_seances_deja_facturees_1
ON w_cti_factures_seances_deja_facturees
USING btree (no_sejour)
;
INSERT INTO w_cti_encours_factures_lignes_c(
no_sejour, no_facture, type_ligne, date_debut, date_fin, nb_rubrique, nb_prestation, coefficient, coefficient_mco,
prestation_id, rubrique_facturation_id, rubrique_comptabilisation_id,
prix_unitaire, montant_encours, lieu_id, regle_coefficient, regle_texte)
SELECT w_cti_encours_factures.no_sejour, w_cti_encours_factures.no_facture, 'DIA' AS type_ligne, p_mouvements_sejour.date, p_mouvements_sejour.date, 1, 1, coefficient, 1,
prestation_id, rubrique_facturation_id, rubrique_facturation_id,
prix_unitaire, round(prix_unitaire * coefficient * coefficient_mco), p_mouvements_sejour.lieu_id,
coefficient, regle_prestation_texte
FROM w_cti_encours_factures
JOIN activite.p_mouvements_sejour ON w_cti_encours_factures.no_sejour = p_mouvements_sejour.no_sejour AND p_mouvements_sejour.date BETWEEN w_cti_encours_factures.date_debut AND w_cti_encours_factures.date_fin
JOIN activite.t_lieux ON p_mouvements_sejour.lieu_id = t_lieux.oid
LEFT JOIN w_actes_seance_jvj ON w_actes_seance_jvj.no_sejour = w_cti_encours_factures.no_sejour AND
w_actes_seance_jvj.date_seance = p_mouvements_sejour.date
JOIN w_cti_encours_calcul_parametres_services_prestations ON t_lieux.service_facturation_id = w_cti_encours_calcul_parametres_services_prestations.lieu_service_id AND
t_lieux.unite_fonctionnelle_id = w_cti_encours_calcul_parametres_services_prestations.lieu_unite_fonctionnelle_id AND
prestation_code IN ('D09','D11','D13', 'D13', 'D15', 'D16', 'DTP')
LEFT JOIN w_cti_factures_lignes_non_facturees_c ON w_cti_factures_lignes_non_facturees_c.no_facture = w_cti_encours_factures.no_facture AND
w_cti_factures_lignes_non_facturees_c.prestation_code = w_cti_encours_calcul_parametres_services_prestations.prestation_code
LEFT JOIN w_cti_factures_seances_deja_facturees ON
p_mouvements_sejour.no_sejour = w_cti_factures_seances_deja_facturees.no_sejour AND
p_mouvements_sejour.date = w_cti_factures_seances_deja_facturees.date_debut
WHERE
(p_mouvements_sejour.nb_seances > 0) AND
coefficient > 0 AND
uniquement_prestations_saisies <> '1' AND
w_cti_encours_calcul_parametres_services_prestations.prestation_type_valorisation <> ('*SAISIE') AND
w_cti_factures_lignes_non_facturees_c.no_facture IS NULL AND
w_cti_factures_seances_deja_facturees.no_sejour IS NULL AND
COALESCE(rubrique_facturation_id,0) <> 0 AND
COALESCE(prestation_id,0) <> 0 AND
(w_actes_seance_jvj.no_sejour IS NOT NULL OR w_cti_encours_factures.type_sejour = '5') AND
(w_cti_encours_factures.est_budget_global <> '1' OR w_cti_encours_factures.no_facture LIKE '%BG');
-- FJA
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'FJA';
INSERT INTO w_cti_encours_factures_lignes_c(
no_sejour, no_facture, type_ligne, date_debut, date_fin, nb_rubrique, nb_prestation, coefficient, coefficient_mco,
prestation_id, rubrique_facturation_id, rubrique_comptabilisation_id,
prix_unitaire, montant_encours, lieu_id, regle_texte)
SELECT
w_cti_encours_factures.no_sejour, w_cti_encours_factures.no_facture, 'FJA' AS type_ligne, p_mouvements_sejour.date, p_mouvements_sejour.date, 1, 1, 1, 1,
prestation_id, rubrique_facturation_id, rubrique_facturation_id,
prix_unitaire, prix_unitaire, p_mouvements_sejour.lieu_id, 'Forfait jour de sortie (Sauf maternité) '
FROM w_cti_encours_factures
JOIN activite.p_mouvements_sejour ON w_cti_encours_factures.no_sejour = p_mouvements_sejour.no_sejour
JOIN activite.t_lieux ON p_mouvements_sejour.lieu_id = t_lieux.oid
JOIN w_cti_encours_calcul_parametres_services_prestations ON t_lieux.service_facturation_id = w_cti_encours_calcul_parametres_services_prestations.lieu_service_id AND
t_lieux.unite_fonctionnelle_id = w_cti_encours_calcul_parametres_services_prestations.lieu_unite_fonctionnelle_id AND
prestation_code IN ('FJA')
LEFT JOIN w_cti_factures_lignes_non_facturees_c ON w_cti_factures_lignes_non_facturees_c.no_facture = w_cti_encours_factures.no_facture AND
w_cti_factures_lignes_non_facturees_c.prestation_code = w_cti_encours_calcul_parametres_services_prestations.prestation_code
WHERE nb_sorties_directes = 1 AND
mode_sortie IN ('6', '8') AND
uniquement_prestations_saisies <> '1' AND
base.cti_division(w_cti_encours_calcul_parametres_services_prestations.nombre,w_cti_encours_calcul_parametres_services_prestations.nb_journees)*100 >= 1 AND
w_cti_encours_factures.particularites_encours_service NOT ILIKE '%MAT%' AND
w_cti_encours_factures.particularites_encours_service NOT ILIKE '%PASDEFJA%' AND
prix_unitaire > 0 AND
w_cti_encours_factures.duree_sejour > 0 AND
w_cti_factures_lignes_non_facturees_c.no_facture IS NULL AND
COALESCE(rubrique_facturation_id,0) <> 0 AND
COALESCE(prestation_id,0) <> 0 AND
w_cti_encours_factures.no_facture NOT LIKE '%BG' AND
(p_mouvements_sejour.date BETWEEN w_cti_encours_factures.date_debut AND w_cti_encours_factures.date_fin OR
service_facturation_id NOT IN (SELECT oid FROM activite.t_services_facturation WHERE avec_facturation_intermediaire = '1')
);
-- ATU
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'ATU';
INSERT INTO w_cti_encours_factures_lignes_c(
no_sejour, no_facture, type_ligne, date_debut, date_fin, nb_rubrique, nb_prestation, coefficient, coefficient_mco,
prestation_id, rubrique_facturation_id, rubrique_comptabilisation_id,
prix_unitaire, montant_encours, lieu_id, regle_coefficient)
SELECT w_cti_encours_factures.no_sejour, w_cti_encours_factures.no_facture, 'ATU' AS type_ligne, p_mouvements_sejour.date, p_mouvements_sejour.date, 1, 1, coefficient, 1,
prestation_id, rubrique_facturation_id, rubrique_facturation_id,
prix_unitaire, round(prix_unitaire * coefficient), p_mouvements_sejour.lieu_id,
coefficient
FROM w_cti_encours_factures
JOIN activite.p_mouvements_sejour ON w_cti_encours_factures.no_sejour = p_mouvements_sejour.no_sejour
JOIN activite.t_lieux ON p_mouvements_sejour.lieu_id = t_lieux.oid
JOIN w_cti_encours_calcul_parametres_services_prestations ON t_lieux.service_facturation_id = w_cti_encours_calcul_parametres_services_prestations.lieu_service_id AND
t_lieux.unite_fonctionnelle_id = w_cti_encours_calcul_parametres_services_prestations.lieu_unite_fonctionnelle_id AND
(
prestation_code = 'ATU' AND p_mouvements_sejour.date <= '20211231' OR
prestation_code = 'FPU' AND p_mouvements_sejour.date >= '20220101'
)
LEFT JOIN w_cti_factures_lignes_non_facturees_c ON w_cti_factures_lignes_non_facturees_c.no_sejour = w_cti_encours_factures.no_sejour AND
w_cti_factures_lignes_non_facturees_c.prestation_code IN ('ATU','FPU')
WHERE
p_mouvements_sejour.nb_externes = 1 AND
p_mouvements_sejour.nb_externes = 1 AND
uniquement_prestations_saisies <> '1' AND
w_cti_encours_calcul_parametres_services_prestations.prestation_type_valorisation <> ('*SAISIE') AND
coefficient > 0 AND
w_cti_factures_lignes_non_facturees_c.no_facture IS NULL AND
(w_cti_encours_factures.est_budget_global <> '1' OR w_cti_encours_factures.no_facture LIKE '%BG') AND
COALESCE(rubrique_facturation_id,0) <> 0 AND
COALESCE(prestation_id,0) <> 0;
-- Identification des SE pour ne pas générer de GHS
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'SE1, SE2, SE3, SE4';
INSERT INTO w_cti_encours_actes_se1234
SELECT t_actes.oid, t_actes.code,
CASE
WHEN t_actes.code IN ('FEJF003')
THEN 'SE4'
WHEN t_actes.code IN ('AGLB001', 'AHLB003', 'AHLB015', 'AHLB016', 'AHLH014', 'GGHB002', 'GGJB001', 'GGJB002', 'HPJB001', 'JGHB001', 'JGHB002', 'JGHD001', 'JGHJ001', 'JGHJ002', 'JPHJ001', 'JPHJ002')
THEN 'SE3'
WHEN t_actes.code IN ('AELB002', 'AHHA001', 'AHHA002', 'BAGA001', 'BBGA001', 'BDCA003', 'BEJB001', 'BEJB002', 'BELB001', 'BEPA001', 'BGHA001', 'BGJB001', 'BGLB001', 'BGLB002', 'BKLB001', 'CAEA002', 'CAFA006', 'CBLD001', 'CBLD003', 'EBGA001', 'EBHA001', 'EBNE002', 'EGFA007', 'FCFA012', 'FCFA028', 'GBJD002', 'JAHB001', 'JAHJ002', 'JAHJ006', 'JAKD001', 'JCKD001', 'JDLF001', 'JHSB001', 'LHNH001', 'MDGB001', 'MHDB001', 'NJAB001', 'NJMB001', 'PAGB002', 'PAGH001', 'PDFA001', 'QAGA004', 'QZFA001', 'QZFA002', 'QZFA005', 'QZFA007', 'QZGA003', 'QZGA006')
THEN 'SE2'
WHEN t_actes.code IN ('BBCE001', 'DZQJ001', 'DZQJ008', 'DZQJ010', 'DZQJ011', 'GBQA002', 'GDQE004', 'GEQE002', 'GEQE004', 'GEQE006', 'GEQE007', 'GEQE009', 'GEQE010', 'GEQH002', 'HEGE001', 'HEGE002', 'HEQE001', 'HEQE002', 'HEQE003', 'HEQE005', 'HGNE001', 'HGQE002', 'HJQE001', 'HMQH007', 'JCGE003', 'JCGE004', 'JDQE001', 'JDQE002', 'JDQE003', 'JEGE001', 'JEHE002')
THEN 'SE1'
ELSE ''
END AS prestation_code
FROM base.t_actes
WHERE t_actes.code IN ('FEJF003',
'AGLB001', 'AHLB003', 'AHLB015', 'AHLB016', 'AHLH014', 'GGHB002', 'GGJB001', 'GGJB002', 'HPJB001', 'JGHB001', 'JGHB002', 'JGHD001', 'JGHJ001', 'JGHJ002', 'JPHJ001', 'JPHJ002',
'AELB002', 'AHHA001', 'AHHA002', 'BAGA001', 'BBGA001', 'BDCA003', 'BEJB001', 'BEJB002', 'BELB001', 'BEPA001', 'BGHA001', 'BGJB001', 'BGLB001', 'BGLB002', 'BKLB001', 'CAEA002', 'CAFA006', 'CBLD001', 'CBLD003', 'EBGA001', 'EBHA001', 'EBNE002', 'EGFA007', 'FCFA012', 'FCFA028', 'GBJD002', 'JAHB001', 'JAHJ002', 'JAHJ006', 'JAKD001', 'JCKD001', 'JDLF001', 'JHSB001', 'LHNH001', 'MDGB001', 'MHDB001', 'NJAB001', 'NJMB001', 'PAGB002', 'PAGH001', 'PDFA001', 'QAGA004', 'QZFA001', 'QZFA002', 'QZFA005', 'QZFA007', 'QZGA003', 'QZGA006',
'BBCE001', 'DZQJ001', 'DZQJ008', 'DZQJ010', 'DZQJ011', 'GBQA002', 'GDQE004', 'GEQE002', 'GEQE004', 'GEQE006', 'GEQE007', 'GEQE009', 'GEQE010', 'GEQH002', 'HEGE001', 'HEGE002', 'HEQE001', 'HEQE002', 'HEQE003', 'HEQE005', 'HGNE001', 'HGQE002', 'HJQE001', 'HMQH007', 'JCGE003', 'JCGE004', 'JDQE001', 'JDQE002', 'JDQE003', 'JEGE001', 'JEHE002'
)
;
INSERT INTO w_cti_encours_se1234
SELECT p_factures_lignes_h.no_facture,
(MAX(ARRAY[w_cti_encours_actes_se1234.prestation_code,w_cti_encours_actes_se1234.code]))[2] AS acte_se,
(MAX(ARRAY[w_cti_encours_actes_se1234.prestation_code,w_cti_encours_actes_se1234.code]))[1] AS type_se
FROM activite.p_factures_lignes_h
JOIN w_cti_encours_factures ON p_factures_lignes_h.no_facture = w_cti_encours_factures.no_facture AND type_sejour IN ('3')
JOIN w_cti_encours_actes_se1234 ON acte_id = w_cti_encours_actes_se1234.oid
LEFT JOIN w_cti_factures_lignes_non_facturees_c ON w_cti_factures_lignes_non_facturees_c.no_facture = p_factures_lignes_h.no_facture AND
w_cti_factures_lignes_non_facturees_c.prestation_code IN ('SE1','SE2','SE3','SE4','SE5','SE6','SE7')
WHERE w_cti_factures_lignes_non_facturees_c.no_facture IS NULL
GROUP BY 1;
INSERT INTO w_cti_encours_se1234
SELECT p_factures_lignes_non_facturees_h.no_facture,
(MAX(ARRAY[w_cti_encours_actes_se1234.prestation_code,w_cti_encours_actes_se1234.code]))[2] AS acte_se,
(MAX(ARRAY[w_cti_encours_actes_se1234.prestation_code,w_cti_encours_actes_se1234.code]))[1] AS type_se
FROM activite.p_factures_lignes_non_facturees_h
JOIN w_cti_encours_factures ON p_factures_lignes_non_facturees_h.no_facture = w_cti_encours_factures.no_facture AND type_sejour IN ('3')
JOIN w_cti_encours_actes_se1234 ON acte_id = w_cti_encours_actes_se1234.oid
LEFT JOIN w_cti_encours_se1234 ON p_factures_lignes_non_facturees_h.no_facture = w_cti_encours_se1234.no_facture
LEFT JOIN w_cti_factures_lignes_non_facturees_c ON w_cti_factures_lignes_non_facturees_c.no_facture = p_factures_lignes_non_facturees_h.no_facture AND
w_cti_factures_lignes_non_facturees_c.prestation_code IN ('SE1','SE2','SE3','SE4','SE5','SE6','SE7')
WHERE w_cti_encours_se1234.no_facture IS NULL AND w_cti_factures_lignes_non_facturees_c.no_facture IS NULL
GROUP BY 1;
INSERT INTO w_cti_encours_factures_lignes_c(
no_sejour, no_facture, type_ligne, date_debut, date_fin, nb_rubrique, nb_prestation, coefficient, coefficient_mco,
prestation_id, rubrique_facturation_id, rubrique_comptabilisation_id,
prix_unitaire, montant_encours, lieu_id, regle_texte)
SELECT
w_cti_encours_factures.no_sejour, w_cti_encours_factures.no_facture, 'SEH' AS type_ligne, p_mouvements_sejour.date, p_mouvements_sejour.date, 1, 1, 1, 1,
prestation_id, rubrique_facturation_id, rubrique_facturation_id,
prix_unitaire, prix_unitaire, p_mouvements_sejour.lieu_id,
'Prestation générée par l''acte : '||acte_se AS regle_texte
FROM w_cti_encours_factures
JOIN activite.p_mouvements_sejour ON w_cti_encours_factures.no_sejour = p_mouvements_sejour.no_sejour AND nb_externes > 0
JOIN activite.t_lieux ON p_mouvements_sejour.lieu_id = t_lieux.oid
JOIN w_cti_encours_se1234 ON w_cti_encours_factures.no_facture = w_cti_encours_se1234.no_facture
JOIN w_cti_encours_calcul_parametres_services_prestations ON t_lieux.service_facturation_id = w_cti_encours_calcul_parametres_services_prestations.lieu_service_id AND
t_lieux.unite_fonctionnelle_id = w_cti_encours_calcul_parametres_services_prestations.lieu_unite_fonctionnelle_id
WHERE
prix_unitaire > 0 AND
uniquement_prestations_saisies <> '1' AND
w_cti_encours_se1234.type_se = prestation_code AND
COALESCE(rubrique_facturation_id,0) <> 0 AND
COALESCE(prestation_id,0) <> 0 AND
(w_cti_encours_factures.est_budget_global <> '1' OR w_cti_encours_factures.no_facture LIKE '%BG');
-- Prestations valorisées selon prix unitaire moyen par jour de présence dans service
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'Prestations selon PU moyen par jour';
INSERT INTO w_cti_encours_factures_lignes_c(
no_sejour, no_facture, type_ligne, date_debut, date_fin, lieu_id, nb_rubrique, nb_prestation, coefficient, coefficient_mco,
prestation_id, rubrique_facturation_id, rubrique_comptabilisation_id,
prix_unitaire, montant_encours, regle_texte)
SELECT
w_cti_encours_factures.no_sejour, w_cti_encours_factures.no_facture, 'PRESTAM' AS type_ligne, p_mouvements_sejour.date, p_mouvements_sejour.date, p_mouvements_sejour.lieu_id, 1, 1, 1, 1,
prestation_id, rubrique_facturation_id, rubrique_facturation_id,
prix_unitaire, round(prix_unitaire,2), regle_prestation_texte
FROM w_cti_encours_factures
JOIN activite.p_mouvements_sejour ON w_cti_encours_factures.no_sejour = p_mouvements_sejour.no_sejour
JOIN activite.t_lieux ON p_mouvements_sejour.lieu_id = t_lieux.oid
JOIN activite.p_factures ON w_cti_encours_factures.no_facture = p_factures.no_facture
JOIN w_cti_encours_calcul_parametres_services_prestations ON t_lieux.service_facturation_id = w_cti_encours_calcul_parametres_services_prestations.lieu_service_id AND
t_lieux.unite_fonctionnelle_id = w_cti_encours_calcul_parametres_services_prestations.lieu_unite_fonctionnelle_id AND
w_cti_encours_calcul_parametres_services_prestations.prestation_type_valorisation = '*AVGJOUSER'
LEFT JOIN w_cti_factures_lignes_non_facturees_c ON w_cti_factures_lignes_non_facturees_c.no_facture = w_cti_encours_factures.no_facture AND
w_cti_factures_lignes_non_facturees_c.prestation_code = w_cti_encours_calcul_parametres_services_prestations.prestation_code
WHERE
(p_mouvements_sejour.heure_fin = 240000 OR p_mouvements_sejour.heure_debut > 0 AND p_mouvements_sejour.heure_fin < 240000) AND
w_cti_factures_lignes_non_facturees_c.no_facture IS NULL AND
w_cti_encours_calcul_parametres_services_prestations.prix_unitaire > 0 AND
COALESCE(rubrique_facturation_id,0) <> 0 AND
COALESCE(prestation_id,0) <> 0 AND
uniquement_prestations_saisies <> '1' AND
(w_cti_encours_factures.est_budget_global <> '1' OR w_cti_encours_factures.no_facture LIKE '%BG') AND
(p_mouvements_sejour.date BETWEEN w_cti_encours_factures.date_debut AND w_cti_encours_factures.date_fin OR
service_facturation_id NOT IN (SELECT oid FROM activite.t_services_facturation WHERE avec_facturation_intermediaire = '1')
)
ORDER BY 1,4;
-- Prestations saisies
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'Prestations saisies';
INSERT INTO w_cti_encours_factures_lignes_c(
no_sejour, no_facture, type_ligne, date_debut, date_fin, nb_rubrique, nb_prestation, coefficient, coefficient_mco,
prestation_id, lpp_id, ucd_id, rubrique_facturation_id, rubrique_comptabilisation_id,
prix_unitaire, montant_encours, regle_texte)
SELECT w_cti_encours_factures.no_sejour, w_cti_encours_factures.no_facture, 'SAISIE' AS type_ligne, p_factures_lignes_non_facturees_c.date_debut, p_factures_lignes_non_facturees_c.date_fin, nb_rubrique, nb_rubrique, coefficient,
COALESCE(p_factures_lignes_non_facturees_c.coefficient_mco,1) AS coefficient_mco,
prestation_id, COALESCE(p_factures_lignes_non_facturees_c.lpp_id,0) AS lpp_id, COALESCE(p_factures_lignes_non_facturees_c.ucd_id,0) AS ucd_id, rubrique_facturation_id, rubrique_facturation_id,
prix_unitaire, round(nb_rubrique * coefficient * COALESCE(p_factures_lignes_non_facturees_c.coefficient_mco,1) * prix_unitaire * CASE WHEN t_prestations.code IN ('PJ', 'GMT') AND taux_1_bg BETWEEN 1 AND 99 THEN 100-taux_1_bg ELSE 100 END / 100,2), 'Prestation saisie'
FROM w_cti_encours_factures
JOIN activite.p_factures_lignes_non_facturees_c ON w_cti_encours_factures.no_facture = p_factures_lignes_non_facturees_c.no_facture
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
LEFT JOIN
(
SELECT p_factures.no_sejour, MAX(taux_1) AS taux_1_bg
FROM activite.p_factures_lignes_c
JOIN activite.p_factures ON p_factures.no_facture = p_factures_lignes_c.no_facture
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
JOIN w_cti_encours_factures ON p_factures.no_sejour = w_cti_encours_factures.no_sejour
WHERE p_factures.no_facture LIKE '%BG' AND t_prestations.code = 'GHS' AND taux_1 > 0
GROUP BY 1
) subview_fac_bg ON w_cti_encours_factures.no_sejour = subview_fac_bg.no_sejour
WHERE
(
t_prestations.code NOT IN ('GHS', 'EXH', 'SRC', 'REA', 'STF')
OR w_OPTION_ENCOURSMCOSUP = '1'
AND w_cti_encours_factures.ghs_id > 0
AND t_prestations.code IN ('SRC', 'REA', 'STF'))
AND (
t_prestations.code NOT IN ('GMT', 'PJ','PII')
OR t_prestations.code IN ('PII') AND est_budget_global <> '1'
OR t_prestations.code IN ('GMT', 'PJ') AND type_t2a <> '1'
OR t_prestations.code IN ('GMT', 'PJ','PII')
AND est_budget_global = '1'
AND NOT EXISTS (
SELECT no_sejour
FROM w_cti_encours_factures_lignes_c
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
WHERE
t_prestations.code = 'GHS'
AND w_cti_encours_factures.no_sejour = w_cti_encours_factures_lignes_c.no_sejour
)
AND taux_1_bg IS DISTINCT FROM 100
OR t_prestations.code IN ('PII')
AND est_budget_global = '1'
AND w_cti_encours_factures.no_facture LIKE '%BG'
)
;
INSERT INTO w_cti_encours_factures_lignes_c(
no_sejour, no_facture, type_ligne, date_debut, date_fin, nb_rubrique, nb_prestation, coefficient, coefficient_mco,
prestation_id, lpp_id, ucd_id, rubrique_facturation_id, rubrique_comptabilisation_id,
prix_unitaire, montant_encours)
SELECT w_cti_encours_factures.no_sejour, w_cti_encours_factures.no_facture, 'SAISIE' AS type_ligne, p_factures_lignes_c.date_debut, p_factures_lignes_c.date_fin, nb_rubrique, nb_rubrique, coefficient, 1,
prestation_id, COALESCE(p_factures_lignes_c.lpp_id,0) AS lpp_id, COALESCE(p_factures_lignes_c.ucd_id,0) AS ucd_id, rubrique_facturation_id, rubrique_facturation_id,
prix_unitaire, montant_facture
FROM w_cti_encours_factures
JOIN activite.p_factures_lignes_c ON w_cti_encours_factures.no_facture = p_factures_lignes_c.no_facture
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
WHERE t_prestations.code NOT IN ('GHS', 'EXH', 'SRC', 'REA', 'STF') AND
montant_facture <> 0 AND
w_cti_encours_factures.date_fin <= w_date_traitement;
-- En budget global, supprimer en cours GHS si 100% PJ facturé sur mutuelles ou patient ou tp1
DELETE FROM w_cti_encours_factures_lignes_c
USING
(
SELECT no_sejour,
MAX(no_facture_bg) AS no_facture_bg,
MAX(taux_mut) AS taux_mut
FROM
(
SELECT p_factures.no_sejour,
NULL::text AS no_facture_bg,
MAX(taux_0+CASE WHEN montant_facture_1 <> 0 THEN taux_1 ELSE 0 END+taux_2) AS taux_mut
FROM activite.p_factures
JOIN activite.p_sejours 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 est_budget_global = '1' and t_prestations.code IN ('PJ') and
p_factures.no_facture NOT LIKE '%BG' AND
code_facture <> '0' AND
(
montant_facture_0 <> 0 OR
montant_facture_1 <> 0 OR
montant_facture_2 <> 0
)
GROUP BY 1
HAVING MAX(taux_0+CASE WHEN montant_facture_1 <> 0 THEN taux_1 ELSE 0 END+taux_2) = 100 AND
SUM(montant_facture_0+montant_facture_1+montant_facture_2) <> 0
UNION
SELECT p_factures.no_sejour,
MAX(p_factures.no_facture) AS no_facture_bg,
0 AS taux_mut
FROM activite.p_factures
JOIN activite.p_sejours on p_factures.no_sejour = p_sejours.no_sejour
JOIN w_cti_encours_factures_lignes_c ON p_factures.no_facture = w_cti_encours_factures_lignes_c.no_facture
JOIN activite.t_prestations on prestation_id = t_prestations.oid
WHERE est_budget_global = '1' and t_prestations.code IN ('GHS') and
p_factures.no_facture LIKE '%BG' AND
code_facture = '0'
GROUP BY 1
) subview
GROUP BY 1
HAVING MAX(no_facture_bg) IS NOT NULL AND
MAX(taux_mut) = 100
) subview
WHERE w_cti_encours_factures_lignes_c.no_facture = subview.no_facture_bg
;
-- En budget global, diminuer en cours GHS si 20% PJ facturé sur mutuelles ou patient
UPDATE w_cti_encours_factures_lignes_c SET
montant_encours = montant_encours*(100-LEAST(taux_mut,20))/100,
regle_texte = regle_texte || ' - TM facturé déduit'
FROM
(
SELECT no_sejour,
MAX(no_facture_bg) AS no_facture_bg,
MAX(taux_mut) AS taux_mut
FROM
(
SELECT p_factures.no_sejour,
NULL::text AS no_facture_bg,
MAX(taux_0+taux_2) AS taux_mut
FROM activite.p_factures
JOIN activite.p_sejours 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 est_budget_global = '1' and t_prestations.code IN ('PJ') and
p_factures.no_facture NOT LIKE '%BG' AND
code_facture <> '0' AND
(
montant_facture_0 <> 0 OR
montant_facture_2 <> 0
)
GROUP BY 1
HAVING MAX(taux_0+taux_2) <> 0 AND
SUM(montant_facture_0+montant_facture_2) <> 0
UNION
SELECT p_factures.no_sejour,
MAX(p_factures.no_facture) AS no_facture_bg,
0 AS taux_mut
FROM activite.p_factures
JOIN activite.p_sejours on p_factures.no_sejour = p_sejours.no_sejour
JOIN w_cti_encours_factures_lignes_c ON p_factures.no_facture = w_cti_encours_factures_lignes_c.no_facture
JOIN activite.t_prestations on prestation_id = t_prestations.oid
WHERE est_budget_global = '1' and t_prestations.code IN ('GHS') and
p_factures.no_facture LIKE '%BG' AND
code_facture = '0'
GROUP BY 1
) subview
GROUP BY 1
HAVING MAX(no_facture_bg) IS NOT NULL AND
MAX(taux_mut) <> 0
) subview
WHERE w_cti_encours_factures_lignes_c.no_facture = subview.no_facture_bg
;
-- En budget global, diminuer en cours GHS de l'encours TM
UPDATE w_cti_encours_factures_lignes_c
SET montant_encours = montant_encours - montant_encours_tm,
regle_texte = regle_texte || ' - TM moyen déduit'
FROM
(
SELECT w_cti_encours_factures_lignes_c.no_sejour,
SUM(montant_encours) AS montant_encours_tm
FROM w_cti_encours_factures_lignes_c
JOIN activite.p_sejours on w_cti_encours_factures_lignes_c.no_sejour = p_sejours.no_sejour
JOIN activite.t_prestations on prestation_id = t_prestations.oid
WHERE est_budget_global = '1' and
prestation_id IN (SELECT oid FROM activite.t_prestations WHERE code IN ('PJ')) and
w_cti_encours_factures_lignes_c.no_facture NOT LIKE '%BG'
GROUP BY 1
HAVING SUM(montant_encours) > 0
ORDER BY 1
) subview
WHERE w_cti_encours_factures_lignes_c. no_sejour = subview.no_sejour AND
prestation_id IN (SELECT oid FROM activite.t_prestations WHERE code IN ('GHS')) AND
w_cti_encours_factures_lignes_c.no_facture LIKE '%BG'
;
-- Honoraires medecins salaries
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'Honoraires medecins salaries';
IF EXISTS (SELECT valeur FROM activite.t_divers WHERE code = 'ENCOURSMEDSAL' AND valeur = '1') THEN
DROP TABLE IF EXISTS w_cti_encours_prestation_rubrique
;
CREATE TEMP TABLE w_cti_encours_prestation_rubrique AS
SELECT prestation_id, (MAX(Array[nb,rubrique_facturation_id]))[2]::bigint AS rubrique_facturation_id
FROM
(
SELECT prestation_id, rubrique_facturation_id, count(*) AS nb
FROM activite.p_factures_lignes_c
WHERE montant_comptabilise > 0
GROUP BY 1,2
ORDER BY 1,2
) subview
GROUP BY 1
;
UPDATE activite.p_factures_lignes_non_facturees_h
SET prix_unitaire = subview.prix_unitaire
FROM
(
SELECT acte_id, activite_ccam, modificateur_ccam_1, modificateur_ccam_2, modificateur_ccam_3, modificateur_ccam_4,
base.Cti_division(SUM(montant_facture_1),SUM(nb_prestation*coefficient)) AS prix_unitaire
FROM activite.p_factures_lignes_h
WHERE acte_id IN (SELECT acte_id FROM activite.p_factures_lignes_non_facturees_h WHERE prix_unitaire = 0) AND
montant_facture_1 > 0
GROUP BY 1,2,3,4,5,6
) subview
WHERE p_factures_lignes_non_facturees_h.acte_id = subview.acte_id AND
p_factures_lignes_non_facturees_h.activite_ccam = subview.activite_ccam AND
p_factures_lignes_non_facturees_h.modificateur_ccam_1 = subview.modificateur_ccam_1 AND
p_factures_lignes_non_facturees_h.modificateur_ccam_2 = subview.modificateur_ccam_2 AND
p_factures_lignes_non_facturees_h.modificateur_ccam_3 = subview.modificateur_ccam_3 AND
p_factures_lignes_non_facturees_h.modificateur_ccam_4 = subview.modificateur_ccam_4 AND
p_factures_lignes_non_facturees_h.prix_unitaire = 0
;
UPDATE activite.p_factures_lignes_non_facturees_h
SET prix_unitaire = subview.prix_unitaire
FROM
(
SELECT acte_id, activite_ccam,
base.Cti_division(SUM(montant_facture_1),SUM(nb_prestation*coefficient)) AS prix_unitaire
FROM activite.p_factures_lignes_h
WHERE acte_id IN (SELECT acte_id FROM activite.p_factures_lignes_non_facturees_h WHERE prix_unitaire = 0) AND
montant_facture_1 > 0
GROUP BY 1,2
) subview
WHERE p_factures_lignes_non_facturees_h.acte_id = subview.acte_id AND
p_factures_lignes_non_facturees_h.activite_ccam = subview.activite_ccam AND
p_factures_lignes_non_facturees_h.prix_unitaire = 0
;
INSERT INTO w_cti_encours_factures_lignes_c(
no_sejour, no_facture, type_ligne, date_debut, date_fin, nb_rubrique, nb_prestation, coefficient, coefficient_mco,
prestation_id, rubrique_facturation_id, rubrique_comptabilisation_id,
prix_unitaire, montant_encours, regle_texte)
SELECT w_cti_encours_factures.no_sejour, w_cti_encours_factures.no_facture, 'SAISIE' AS type_ligne, p_factures_lignes_non_facturees_h.date_debut, p_factures_lignes_non_facturees_h.date_fin, nb_rubrique, nb_rubrique, coefficient, 1,
p_factures_lignes_non_facturees_h.prestation_id, w_cti_encours_prestation_rubrique.rubrique_facturation_id, w_cti_encours_prestation_rubrique.rubrique_facturation_id,
prix_unitaire, round(nb_rubrique * coefficient * prix_unitaire,2), 'Honoraire salarié saisi'
FROM w_cti_encours_factures
JOIN activite.p_factures_lignes_non_facturees_h ON w_cti_encours_factures.no_facture = p_factures_lignes_non_facturees_h.no_facture
JOIN activite.t_prestations ON p_factures_lignes_non_facturees_h.prestation_id = t_prestations.oid
JOIN activite.t_medecins_administratifs ON medecin_facture_id = t_medecins_administratifs.oid
JOIN w_cti_encours_prestation_rubrique ON p_factures_lignes_non_facturees_h.prestation_id = w_cti_encours_prestation_rubrique.prestation_id
WHERE t_medecins_administratifs.est_medecin_salarie = 1
;
END IF;
-- Réaffectation forfait journalier sur GHS
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'Deduction FJ du GHS';
UPDATE w_cti_encours_factures_lignes_c
SET montant_encours = w_cti_encours_factures_lignes_c.montant_encours - mt_fjpas,
regle_texte = regle_texte || ' - FJ Déduit'
FROM
(
SELECT w_cti_encours_factures.no_facture,
SUM(CASE WHEN t_prestations.code = 'GHS' THEN 1 ELSE 0 END) AS nb_ghs,
MAX(CASE WHEN t_prestations.code = 'GHS' THEN w_cti_encours_factures_lignes_c.CTID ELSE NULL END) AS CTID_ghs,
SUM(CASE WHEN t_prestations.code IN ('FJ','PAS') THEN montant_encours ELSE 0 END) AS mt_fjpas
FROM w_cti_encours_factures_lignes_c
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
JOIN w_cti_encours_factures ON
w_cti_encours_factures_lignes_c.no_facture = w_cti_encours_factures.no_facture
WHERE w_cti_encours_factures.ghs_id > 0 AND
type_ligne <> 'GHSBB' AND
type_ligne <> 'GHSBBM' AND
w_cti_encours_factures.no_facture NOT LIKE '%BG' AND
t_prestations.code IN ('GHS','FJ', 'PAS')
GROUP BY 1
HAVING SUM(CASE WHEN t_prestations.code IN ('FJ','PAS') THEN montant_encours ELSE 0 END) <> 0 AND
SUM(CASE WHEN t_prestations.code = 'GHS' THEN 1 ELSE 0 END) = 1
) subview
WHERE w_cti_encours_factures_lignes_c.no_facture = subview.no_facture AND
w_cti_encours_factures_lignes_c.CTID = subview.CTID_ghs
;
--Déduction du FJ du GHS dans le cas où le PJ facturé et valorisé est à 0
DROP TABLE IF EXISTS w_montant_fj_par_sejour
;
CREATE TEMP TABLE w_montant_fj_par_sejour AS
SELECT
p_sejours.no_sejour
,SUM(CASE WHEN t_prestations.code LIKE 'FJ%'
THEN montant_facture_0 + montant_facture_2
ELSE 0
END) as montant_fj
FROM activite.p_sejours
JOIN activite.p_factures ON p_sejours.no_sejour = p_factures.no_sejour
JOIN activite.p_factures_lignes_c on p_factures.no_facture = p_factures_lignes_c.no_facture
JOIN activite.t_prestations on p_factures_lignes_c.prestation_id = t_prestations.oid
WHERE p_factures.no_facture NOT LIKE '%BG'
AND p_sejours.no_sejour IN (
SELECT DISTINCT(no_sejour) FROM w_cti_encours_factures_lignes_c
)
GROUP BY p_sejours.no_sejour
HAVING
SUM(CASE WHEN t_prestations.code LIKE 'PJ%'
THEN montant_facture_0 + montant_facture_2 + p_factures_lignes_c.montant_encours
ELSE 0 END) = 0 AND
SUM(CASE WHEN t_prestations.code LIKE 'FJ%'
THEN montant_facture_0 + montant_facture_2
ELSE 0 END) <> 0
;
UPDATE w_cti_encours_factures_lignes_c
SET
montant_encours = montant_encours - montant_fj
,regle_texte = regle_texte || ' - FJ facturé déduit'
FROM w_montant_fj_par_sejour
WHERE w_cti_encours_factures_lignes_c.no_sejour = w_montant_fj_par_sejour.no_sejour
AND w_cti_encours_factures_lignes_c.no_facture LIKE '%BG'
AND prestation_id = (
SELECT oid
FROM activite.t_prestations
WHERE code = 'GHS'
)
;
-- Réaffectation forfait journalier sur GMT
WITH factures_smr_avec_fj AS (
SELECT
w_cti_encours_factures.no_facture
, MAX(CASE WHEN t_prestations.code = 'GMT' AND type_ligne = 'GMT' THEN prestation_id ELSE 0 END) AS prestation_gmt_id
, SUM(CASE WHEN t_prestations.code = 'FJ' THEN montant_encours ELSE 0 END) AS montant_fj_total
, SUM(CASE WHEN t_prestations.code = 'GMT' AND type_ligne = 'GMT' THEN 1 ELSE 0 END) AS nb_lignes_gmt
FROM w_cti_encours_factures_lignes_c
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
JOIN w_cti_encours_factures ON w_cti_encours_factures_lignes_c.no_facture = w_cti_encours_factures.no_facture
WHERE w_cti_encours_factures.no_facture NOT LIKE '%BG'
AND t_prestations.code IN ('GMT','FJ')
GROUP BY
w_cti_encours_factures.no_facture
HAVING SUM(CASE WHEN t_prestations.code = 'FJ' THEN montant_encours ELSE 0 END) <> 0
AND SUM(CASE WHEN t_prestations.code = 'GMT' AND type_ligne = 'GMT' THEN 1 ELSE 0 END) > 0
),
montant_fj_ventile_par_jour AS (
SELECT
no_facture
, prestation_gmt_id
, round(montant_fj_total / nb_lignes_gmt, 2) AS prix_unitaire_fj
FROM factures_smr_avec_fj
)
UPDATE w_cti_encours_factures_lignes_c
SET
montant_encours = w_cti_encours_factures_lignes_c.montant_encours - prix_unitaire_fj,
regle_texte = regle_texte || ' - FJ Déduit'
FROM montant_fj_ventile_par_jour
WHERE w_cti_encours_factures_lignes_c.no_facture = montant_fj_ventile_par_jour.no_facture
AND w_cti_encours_factures_lignes_c.prestation_id = montant_fj_ventile_par_jour.prestation_gmt_id
AND w_cti_encours_factures_lignes_c.type_ligne = 'GMT'
;
-- Pour la valorisation SMR, les lignes de rubrique de facturation TJP ne doivent pas être valorisées
UPDATE w_cti_encours_factures_lignes_c
SET montant_encours = 0
FROM activite.t_rubriques_facturation
WHERE w_cti_encours_factures_lignes_c.rubrique_facturation_id = t_rubriques_facturation.oid
AND t_rubriques_facturation.code ILIKE 'TJP%'
AND w_cti_encours_factures_lignes_c.montant_encours <> 0
;
-- Factures à ignorer
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'Factures ignorees';
UPDATE w_cti_encours_factures
SET ignorer = '1'
FROM activite.t_calcul_encours
WHERE t_calcul_encours.no_facture = w_cti_encours_factures.no_facture AND
t_calcul_encours.type_ligne = 'FACTURE' AND
t_calcul_encours.ignorer = '1'
;
-- Forcage par dossier et prestation
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'Lignes forcees ou ignorees';
-- Paramètres de génération
UPDATE w_cti_encours_calcul_parametres_services_prestations
SET type_ligne = 'PRESTA-' ||
CASE
WHEN prestation_code IN ('SRC', 'REA', 'STF', 'AMD', 'AMF', 'IGM', 'IGP', 'APD', 'IMD', 'IMI', 'IPD', 'IVG', 'NN1', 'NN2', 'NN3', 'GHT') THEN 'PC'
WHEN prestation_code IN ('CPC', 'SHO', 'CP') THEN 'PC'
WHEN prestation_code IN ('D09', 'D11', 'D13', 'D13', 'D15', 'D16', 'DTP') THEN 'PC'
WHEN prestation_code IN ('ATU','FPU') THEN 'PC'
WHEN prestation_type_valorisation IN ('CP') THEN 'PC'
WHEN prestation_code IN ('GMT', 'PJ', 'FJ', 'FJA', 'ENT', 'PMS') THEN 'PU'
WHEN prestation_type_valorisation IN ('ENT') THEN 'PU'
WHEN prestation_code IN ('SE1','SE2','SE3','SE4','SE5','SE6','SE7') THEN 'PU'
WHEN prestation_type_valorisation = '*AVGJOUSER' THEN 'PU'
ELSE '' END
;
-- Initialisation coefficient et prix unitaire calcule
UPDATE w_cti_encours_factures_lignes_c
SET coefficient_calcule = w_cti_encours_factures_lignes_c.coefficient
FROM activite.t_lieux,
w_cti_encours_calcul_parametres_services_prestations
WHERE
w_cti_encours_factures_lignes_c.lieu_id = t_lieux.oid AND
t_lieux.service_facturation_id = w_cti_encours_calcul_parametres_services_prestations.lieu_service_id AND
t_lieux.unite_fonctionnelle_id = w_cti_encours_calcul_parametres_services_prestations.lieu_unite_fonctionnelle_id AND
w_cti_encours_factures_lignes_c.prestation_id = w_cti_encours_calcul_parametres_services_prestations.prestation_id AND
w_cti_encours_factures_lignes_c.rubrique_facturation_id = w_cti_encours_calcul_parametres_services_prestations.rubrique_facturation_id AND
w_cti_encours_calcul_parametres_services_prestations.type_ligne LIKE 'PRESTA%' AND
w_cti_encours_factures_lignes_c.coefficient_calcule = 0
;
UPDATE w_cti_encours_factures_lignes_c
SET prix_unitaire_calcule = w_cti_encours_factures_lignes_c.prix_unitaire
FROM activite.t_lieux,
w_cti_encours_calcul_parametres_services_prestations
WHERE
w_cti_encours_factures_lignes_c.lieu_id = t_lieux.oid AND
t_lieux.service_facturation_id = w_cti_encours_calcul_parametres_services_prestations.lieu_service_id AND
t_lieux.unite_fonctionnelle_id = w_cti_encours_calcul_parametres_services_prestations.lieu_unite_fonctionnelle_id AND
w_cti_encours_factures_lignes_c.prestation_id = w_cti_encours_calcul_parametres_services_prestations.prestation_id AND
w_cti_encours_factures_lignes_c.rubrique_facturation_id = w_cti_encours_calcul_parametres_services_prestations.rubrique_facturation_id AND
w_cti_encours_calcul_parametres_services_prestations.type_ligne LIKE 'PRESTA%' AND
w_cti_encours_factures_lignes_c.prix_unitaire_calcule = 0
;
UPDATE w_cti_encours_factures_lignes_c SET
coefficient = CASE WHEN t_calcul_encours.coefficient_is_force = '1' THEN t_calcul_encours.coefficient_force ELSE w_cti_encours_factures_lignes_c.coefficient END,
prix_unitaire = CASE WHEN t_calcul_encours.prix_unitaire_is_force = '1' THEN t_calcul_encours.prix_unitaire_force ELSE w_cti_encours_factures_lignes_c.prix_unitaire END,
ignorer = CASE WHEN t_calcul_encours.ignorer = '1' THEN '1' ELSE '0' END,
regle_texte = CASE
WHEN t_calcul_encours.coefficient_is_force = '1' AND w_cti_encours_factures_lignes_c.regle_texte ILIKE 'COEFF%' THEN 'Coefficient forcé dans paramétrage facture : ' || t_calcul_encours.coefficient_force
WHEN t_calcul_encours.prix_unitaire_is_force = '1' AND w_cti_encours_factures_lignes_c.regle_texte ILIKE 'P.U.%' THEN 'P.U. forcé dans paramétrage facture : ' || t_calcul_encours.prix_unitaire_force
ELSE regle_texte END,
montant_encours =
CASE WHEN t_calcul_encours.ignorer IS DISTINCT from '1' THEN
CASE WHEN t_calcul_encours.coefficient_is_force = '1' THEN t_calcul_encours.coefficient_force ELSE w_cti_encours_factures_lignes_c.coefficient END *
CASE WHEN t_calcul_encours.prix_unitaire_is_force = '1' THEN t_calcul_encours.prix_unitaire_force ELSE w_cti_encours_factures_lignes_c.prix_unitaire END *
nb_prestation
ELSE 0 END
FROM activite.t_lieux,
w_cti_encours_calcul_parametres_services_prestations,
activite.t_calcul_encours
WHERE
w_cti_encours_factures_lignes_c.lieu_id = t_lieux.oid AND
t_lieux.service_facturation_id = w_cti_encours_calcul_parametres_services_prestations.lieu_service_id AND
t_lieux.unite_fonctionnelle_id = w_cti_encours_calcul_parametres_services_prestations.lieu_unite_fonctionnelle_id AND
w_cti_encours_factures_lignes_c.prestation_id = w_cti_encours_calcul_parametres_services_prestations.prestation_id AND
w_cti_encours_factures_lignes_c.rubrique_facturation_id = w_cti_encours_calcul_parametres_services_prestations.rubrique_facturation_id AND
w_cti_encours_calcul_parametres_services_prestations.type_ligne LIKE 'PRESTA%' AND
t_calcul_encours.no_facture = w_cti_encours_factures_lignes_c.no_facture AND
t_calcul_encours.lieu_service_id = t_lieux.service_facturation_id AND
t_calcul_encours.prestation_id = w_cti_encours_factures_lignes_c.prestation_id AND
t_calcul_encours.rubrique_facturation_id = w_cti_encours_factures_lignes_c.rubrique_facturation_id AND
t_calcul_encours.type_ligne LIKE 'PRESEJ%' AND
(
t_calcul_encours.coefficient_is_force = '1' OR
t_calcul_encours.prix_unitaire_is_force = '1' OR
t_calcul_encours.ignorer = '1'
)
;
-- Ecriture du justificatif
IF w_date_encours = w_date_encours_actuelle THEN
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'Ecriture justificatif';
TRUNCATE activite.p_facture_ligne_valorise_c;
INSERT INTO activite.p_facture_ligne_valorise_c(
no_facture, facture_id, date_debut, date_fin, lieu_id, nb_rubrique,
nb_prestation, coefficient, coefficient_mco, rubrique_facturation_id,
prestation_id, lpp_id, ucd_id, prix_unitaire, montant_encours, type_ligne_code, mode_calcul_code,
mode_calcul_texte)
SELECT
w_cti_encours_factures.no_facture,
w_cti_encours_factures.oid,
MIN(w_cti_encours_factures_lignes_c.date_debut),
MAX(w_cti_encours_factures_lignes_c.date_fin),
CASE WHEN t_prestations.code LIKE 'GHS%' THEN w_cti_encours_factures.lieu_sortie_id ELSE w_cti_encours_factures_lignes_c.lieu_id END,
SUM(nb_rubrique),
SUM(nb_prestation),
coefficient,
coefficient_mco,
w_cti_encours_factures_lignes_c.rubrique_facturation_id,
prestation_id,
lpp_id,
ucd_id,
prix_unitaire,
SUM(CASE WHEN w_cti_encours_factures.ignorer IS DISTINCT FROM '1' AND w_cti_encours_factures_lignes_c.ignorer IS DISTINCT FROM '1' THEN montant_encours ELSE 0 END),
w_cti_encours_factures_lignes_c.type_ligne,
CASE
WHEN w_cti_encours_factures.ignorer = '1' AND w_cti_encours_factures_lignes_c.regle_ghs <> '' THEN '00-FORCE'
WHEN w_cti_encours_factures_lignes_c.ignorer = '1' AND w_cti_encours_factures_lignes_c.regle_ghs <> '' THEN '00-FORCE'
ELSE w_cti_encours_factures_lignes_c.regle_ghs END,
CASE
WHEN w_cti_encours_factures.ignorer = '1' THEN 'FACTURE IGNOREE.'
WHEN w_cti_encours_factures_lignes_c.ignorer = '1' THEN 'LIGNE IGNOREE.'
ELSE w_cti_encours_factures_lignes_c.regle_texte END
FROM w_cti_encours_factures_lignes_c
JOIN w_cti_encours_factures ON w_cti_encours_factures_lignes_c.no_facture = w_cti_encours_factures.no_facture
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
WHERE w_cti_encours_factures_lignes_c.rubrique_facturation_id IS NOT NULL AND
(montant_encours <> 0 OR
w_cti_encours_factures_lignes_c.ignorer = '1' OR
type_ligne = 'GHSECART'
)
GROUP BY 1,2,5,8,9,10,11,12,13,14,16,17,18
ORDER BY 1;
-- Stockage des paramètres de calcul
INSERT INTO activite.t_calcul_encours
(
type_ligne,
coefficient_mco,
lieu_service_id,
lieu_unite_fonctionnelle_id,
nb_ambulatoires,
nb_externes,
nb_seances,
nb_journees,
nb_journees_cp,
prestation_id,
prestation_type_valorisation,
rubrique_facturation_id,
nb_prestations_facturees,
prix_unitaire_calcule,
coefficient_calcule
)
SELECT
w_cti_encours_calcul_parametres_services_prestations.type_ligne,
w_cti_encours_calcul_parametres_services_prestations.coefficient_mco,
w_cti_encours_calcul_parametres_services_prestations.lieu_service_id,
w_cti_encours_calcul_parametres_services_prestations.lieu_unite_fonctionnelle_id,
w_cti_encours_calcul_parametres_services_prestations.nb_ambulatoires,
w_cti_encours_calcul_parametres_services_prestations.nb_externes,
w_cti_encours_calcul_parametres_services_prestations.nb_seances,
w_cti_encours_calcul_parametres_services_prestations.nb_journees,
w_cti_encours_calcul_parametres_services_prestations.nb_journees_cp,
w_cti_encours_calcul_parametres_services_prestations.prestation_id,
w_cti_encours_calcul_parametres_services_prestations.prestation_type_valorisation,
w_cti_encours_calcul_parametres_services_prestations.rubrique_facturation_id,
w_cti_encours_calcul_parametres_services_prestations.nombre AS nb_prestations_facturees,
w_cti_encours_calcul_parametres_services_prestations.prix_unitaire_calcule,
w_cti_encours_calcul_parametres_services_prestations.coefficient_calcule
FROM w_cti_encours_calcul_parametres_services_prestations
LEFT JOIN activite.t_calcul_encours ON
t_calcul_encours.lieu_service_id = w_cti_encours_calcul_parametres_services_prestations.lieu_service_id AND
t_calcul_encours.lieu_unite_fonctionnelle_id = w_cti_encours_calcul_parametres_services_prestations.lieu_unite_fonctionnelle_id AND
t_calcul_encours.prestation_id = w_cti_encours_calcul_parametres_services_prestations.prestation_id AND
t_calcul_encours.rubrique_facturation_id = w_cti_encours_calcul_parametres_services_prestations.rubrique_facturation_id AND
t_calcul_encours.type_ligne LIKE 'PRESTA%'
WHERE t_calcul_encours.oid IS NULL
;
UPDATE activite.t_calcul_encours SET
type_ligne = w_cti_encours_calcul_parametres_services_prestations.type_ligne,
nb_ambulatoires = w_cti_encours_calcul_parametres_services_prestations.nb_ambulatoires,
nb_externes = w_cti_encours_calcul_parametres_services_prestations.nb_externes,
nb_seances = w_cti_encours_calcul_parametres_services_prestations.nb_seances,
nb_journees = w_cti_encours_calcul_parametres_services_prestations.nb_journees,
nb_journees_cp = w_cti_encours_calcul_parametres_services_prestations.nb_journees_cp,
prestation_type_valorisation = w_cti_encours_calcul_parametres_services_prestations.prestation_type_valorisation,
nb_prestations_facturees = w_cti_encours_calcul_parametres_services_prestations.nombre,
prix_unitaire_calcule = w_cti_encours_calcul_parametres_services_prestations.prix_unitaire_calcule,
coefficient_calcule = w_cti_encours_calcul_parametres_services_prestations.coefficient_calcule
FROM w_cti_encours_calcul_parametres_services_prestations
WHERE t_calcul_encours.lieu_service_id = w_cti_encours_calcul_parametres_services_prestations.lieu_service_id AND
t_calcul_encours.lieu_unite_fonctionnelle_id = w_cti_encours_calcul_parametres_services_prestations.lieu_unite_fonctionnelle_id AND
t_calcul_encours.prestation_id = w_cti_encours_calcul_parametres_services_prestations.prestation_id AND
t_calcul_encours.rubrique_facturation_id = w_cti_encours_calcul_parametres_services_prestations.rubrique_facturation_id AND
t_calcul_encours.type_ligne LIKE 'PRESTA%' AND
(
t_calcul_encours.type_ligne IS DISTINCT FROM w_cti_encours_calcul_parametres_services_prestations.type_ligne OR
t_calcul_encours.nb_ambulatoires IS DISTINCT FROM w_cti_encours_calcul_parametres_services_prestations.nb_ambulatoires OR
t_calcul_encours.nb_externes IS DISTINCT FROM w_cti_encours_calcul_parametres_services_prestations.nb_externes OR
t_calcul_encours.nb_seances IS DISTINCT FROM w_cti_encours_calcul_parametres_services_prestations.nb_seances OR
t_calcul_encours.nb_journees IS DISTINCT FROM w_cti_encours_calcul_parametres_services_prestations.nb_journees OR
t_calcul_encours.nb_journees_cp IS DISTINCT FROM w_cti_encours_calcul_parametres_services_prestations.nb_journees_cp OR
t_calcul_encours.prestation_type_valorisation IS DISTINCT FROM w_cti_encours_calcul_parametres_services_prestations.prestation_type_valorisation OR
t_calcul_encours.nb_prestations_facturees IS DISTINCT FROM w_cti_encours_calcul_parametres_services_prestations.nombre OR
t_calcul_encours.prix_unitaire_calcule IS DISTINCT FROM w_cti_encours_calcul_parametres_services_prestations.prix_unitaire_calcule OR
t_calcul_encours.coefficient_calcule IS DISTINCT FROM w_cti_encours_calcul_parametres_services_prestations.coefficient_calcule
)
;
-- Stockage des données de calcul par séjour (GHS)
INSERT INTO activite.t_calcul_encours
(
type_ligne,
no_sejour,
no_facture,
coefficient_mco,
lieu_service_id,
lieu_unite_fonctionnelle_id,
nb_ambulatoires,
nb_externes,
nb_seances,
nb_journees,
nb_journees_cp,
prestation_id,
prestation_type_valorisation,
rubrique_facturation_id,
nb_prestations_facturees,
prix_unitaire_calcule,
coefficient_calcule
)
SELECT
w_cti_encours_factures_lignes_c.type_ligne,
w_cti_encours_factures_lignes_c.no_sejour,
w_cti_encours_factures_lignes_c.no_facture,
w_cti_encours_factures_lignes_c.coefficient_mco,
t_lieux.service_facturation_id AS lieu_service_id,
t_lieux.unite_fonctionnelle_id AS lieu_unite_fonctionnelle_id,
0::numeric AS nb_ambulatoires,
0::numeric AS nb_externes,
0::numeric AS nb_seances,
0::numeric AS nb_journees,
0::numeric AS nb_journees_cp,
w_cti_encours_factures_lignes_c.prestation_id,
w_cti_encours_factures_lignes_c.regle_ghs AS prestation_type_valorisation,
w_cti_encours_factures_lignes_c.rubrique_facturation_id,
w_cti_encours_factures_lignes_c.nb_prestation AS nb_prestations_facturees,
w_cti_encours_factures_lignes_c.prix_unitaire_calcule,
0::numeric AS coefficient_calcule
FROM w_cti_encours_factures_lignes_c
JOIN activite.t_lieux ON lieu_id = t_lieux.oid
LEFT JOIN activite.t_calcul_encours ON
t_calcul_encours.no_facture = w_cti_encours_factures_lignes_c.no_facture AND
t_calcul_encours.prestation_id = w_cti_encours_factures_lignes_c.prestation_id AND
t_calcul_encours.rubrique_facturation_id = w_cti_encours_factures_lignes_c.rubrique_facturation_id AND
t_calcul_encours.type_ligne LIKE 'GHSNG%'
WHERE w_cti_encours_factures_lignes_c.type_ligne = 'GHSNG' AND
t_calcul_encours.no_facture IS NULL
;
UPDATE activite.t_calcul_encours SET
type_ligne = w_cti_encours_factures_lignes_c.type_ligne,
prix_unitaire_calcule = w_cti_encours_factures_lignes_c.prix_unitaire_calcule
FROM w_cti_encours_factures_lignes_c
WHERE t_calcul_encours.no_facture = w_cti_encours_factures_lignes_c.no_facture AND
t_calcul_encours.prestation_id = w_cti_encours_factures_lignes_c.prestation_id AND
t_calcul_encours.rubrique_facturation_id = w_cti_encours_factures_lignes_c.rubrique_facturation_id AND
t_calcul_encours.type_ligne LIKE 'GHSNG%' AND
(
t_calcul_encours.type_ligne IS DISTINCT FROM w_cti_encours_factures_lignes_c.type_ligne OR
t_calcul_encours.prix_unitaire_calcule IS DISTINCT FROM w_cti_encours_factures_lignes_c.prix_unitaire_calcule
)
;
DELETE FROM activite.t_calcul_encours
WHERE type_ligne = 'GHSNG' AND
no_facture NOT IN (SELECT no_facture FROM w_cti_encours_factures_lignes_c WHERE w_cti_encours_factures_lignes_c.type_ligne = 'GHSNG')
;
-- Stockage des séjours calculés (prestations)
INSERT INTO activite.t_calcul_encours
(
type_ligne,
no_sejour,
no_facture,
coefficient_mco,
lieu_service_id,
lieu_unite_fonctionnelle_id,
nb_ambulatoires,
nb_externes,
nb_seances,
nb_journees,
nb_journees_cp,
prestation_id,
prestation_type_valorisation,
rubrique_facturation_id,
nb_prestations_facturees,
prix_unitaire_calcule,
coefficient_calcule
)
SELECT
replace(w_cti_encours_calcul_parametres_services_prestations.type_ligne,'PRESTA','PRESEJ') AS type_ligne,
w_cti_encours_factures_lignes_c.no_sejour,
w_cti_encours_factures_lignes_c.no_facture,
w_cti_encours_factures_lignes_c.coefficient_mco,
t_lieux.service_facturation_id AS lieu_service_id,
t_lieux.unite_fonctionnelle_id AS lieu_unite_fonctionnelle_id,
0::numeric AS nb_ambulatoires,
0::numeric AS nb_externes,
0::numeric AS nb_seances,
0::numeric AS nb_journees,
0::numeric AS nb_journees_cp,
w_cti_encours_factures_lignes_c.prestation_id,
w_cti_encours_factures_lignes_c.regle_ghs AS prestation_type_valorisation,
w_cti_encours_factures_lignes_c.rubrique_facturation_id,
SUM(w_cti_encours_factures_lignes_c.nb_prestation) AS nb_prestations_facturees,
w_cti_encours_factures_lignes_c.prix_unitaire_calcule,
w_cti_encours_factures_lignes_c.coefficient_calcule
FROM w_cti_encours_factures_lignes_c
JOIN activite.t_lieux ON lieu_id = t_lieux.oid
JOIN w_cti_encours_calcul_parametres_services_prestations ON
t_lieux.service_facturation_id = w_cti_encours_calcul_parametres_services_prestations.lieu_service_id AND
t_lieux.unite_fonctionnelle_id = w_cti_encours_calcul_parametres_services_prestations.lieu_unite_fonctionnelle_id AND
w_cti_encours_factures_lignes_c.prestation_id = w_cti_encours_calcul_parametres_services_prestations.prestation_id AND
w_cti_encours_factures_lignes_c.rubrique_facturation_id = w_cti_encours_calcul_parametres_services_prestations.rubrique_facturation_id
LEFT JOIN activite.t_calcul_encours ON
t_calcul_encours.no_facture = w_cti_encours_factures_lignes_c.no_facture AND
t_calcul_encours.lieu_service_id = t_lieux.service_facturation_id AND
t_calcul_encours.prestation_id = w_cti_encours_factures_lignes_c.prestation_id AND
t_calcul_encours.rubrique_facturation_id = w_cti_encours_factures_lignes_c.rubrique_facturation_id AND
t_calcul_encours.type_ligne LIKE 'PRESEJ%'
WHERE w_cti_encours_factures_lignes_c.type_ligne <> 'SAISIE' AND
w_cti_encours_calcul_parametres_services_prestations.type_ligne LIKE 'PRESTA%' AND
t_calcul_encours.no_facture IS NULL
GROUP BY 1,2,3,4,5,6,12,13,14,16,17
;
UPDATE activite.t_calcul_encours SET
coefficient_calcule = w_cti_encours_factures_lignes_c.coefficient_calcule,
prix_unitaire_calcule = w_cti_encours_factures_lignes_c.prix_unitaire_calcule
FROM w_cti_encours_factures_lignes_c
JOIN activite.t_lieux ON lieu_id = t_lieux.oid
WHERE t_calcul_encours.no_facture = w_cti_encours_factures_lignes_c.no_facture AND
t_calcul_encours.lieu_service_id = t_lieux.service_facturation_id AND
t_calcul_encours.prestation_id = w_cti_encours_factures_lignes_c.prestation_id AND
t_calcul_encours.rubrique_facturation_id = w_cti_encours_factures_lignes_c.rubrique_facturation_id AND
t_calcul_encours.type_ligne LIKE 'PRESEJ%' AND
(
t_calcul_encours.coefficient_calcule IS DISTINCT FROM w_cti_encours_factures_lignes_c.coefficient OR
t_calcul_encours.prix_unitaire_calcule IS DISTINCT FROM w_cti_encours_factures_lignes_c.prix_unitaire
)
;
DELETE
FROM activite.t_calcul_encours
WHERE t_calcul_encours.type_ligne LIKE 'PRESEJ%' AND
(
t_calcul_encours.no_facture || '-' ||
t_calcul_encours.lieu_service_id || '-' ||
t_calcul_encours.prestation_id || '-' ||
t_calcul_encours.rubrique_facturation_id
) NOT IN
(SELECT
w_cti_encours_factures_lignes_c.no_facture || '-' ||
t_lieux.service_facturation_id || '-' ||
w_cti_encours_factures_lignes_c.prestation_id || '-' ||
w_cti_encours_factures_lignes_c.rubrique_facturation_id
FROM w_cti_encours_factures_lignes_c
JOIN activite.t_lieux ON lieu_id = t_lieux.oid
JOIN w_cti_encours_calcul_parametres_services_prestations ON
t_lieux.service_facturation_id = w_cti_encours_calcul_parametres_services_prestations.lieu_service_id AND
t_lieux.unite_fonctionnelle_id = w_cti_encours_calcul_parametres_services_prestations.lieu_unite_fonctionnelle_id AND
w_cti_encours_factures_lignes_c.prestation_id = w_cti_encours_calcul_parametres_services_prestations.prestation_id AND
w_cti_encours_factures_lignes_c.rubrique_facturation_id = w_cti_encours_calcul_parametres_services_prestations.rubrique_facturation_id
WHERE w_cti_encours_factures_lignes_c.type_ligne <> 'SAISIE' AND
w_cti_encours_calcul_parametres_services_prestations.type_ligne LIKE 'PRESTA%'
)
;
-- Stockage des séjours calculés (pour paramétrer séjours à ne pas calculer)
INSERT INTO activite.t_calcul_encours
(
type_ligne,
no_sejour,
no_facture,
coefficient_mco,
lieu_service_id,
lieu_unite_fonctionnelle_id,
nb_ambulatoires,
nb_externes,
nb_seances,
nb_journees,
nb_journees_cp,
prestation_id,
prestation_type_valorisation,
rubrique_facturation_id,
nb_prestations_facturees,
prix_unitaire_calcule,
coefficient_calcule
)
SELECT
'FACTURE'::text,
w_cti_encours_factures_lignes_c.no_sejour,
w_cti_encours_factures_lignes_c.no_facture,
0::numeric AS coefficient_mco,
0::bigint AS lieu_service_id,
0::bigint AS lieu_unite_fonctionnelle_id,
0::numeric AS nb_ambulatoires,
0::numeric AS nb_externes,
0::numeric AS nb_seances,
0::numeric AS nb_journees,
0::numeric AS nb_journees_cp,
0::bigint AS prestation_id,
0::bigint AS prestation_type_valorisation,
0::bigint AS rubrique_facturation_id,
0::bigint AS nb_prestation,
SUM(montant_encours) AS prix_unitaire_calcule,
0::numeric AS coefficient_calcule
FROM w_cti_encours_factures_lignes_c
LEFT JOIN activite.t_calcul_encours ON
t_calcul_encours.no_facture = w_cti_encours_factures_lignes_c.no_facture AND
t_calcul_encours.type_ligne LIKE 'FACTURE%'
WHERE t_calcul_encours.no_facture IS NULL
GROUP BY 2,3
;
DELETE FROM activite.t_calcul_encours
WHERE type_ligne = 'FACTURE' AND
no_facture NOT IN (SELECT no_facture FROM w_cti_encours_factures_lignes_c)
;
END IF;
-- Eclatement des prestations jour par jour
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'Eclatement jour par jour';
INSERT INTO w_cti_encours_factures_lignes_sup_c
SELECT
w_cti_encours_factures_lignes_c.oid AS from_oid,
t_prestations.code AS prestation_code,
date(p_sejours.date_entree) AS date_debut_ghs,
date(date_fin - interval '1 day') AS date_fin_ghs,
(date(date_fin) - date(date_entree)) * CASE WHEN nb_prestation < 0 THEN -1 ELSE 1 END AS nb_prestation_ghs,
w_cti_encours_factures_lignes_c.*
FROM w_cti_encours_factures_lignes_c
JOIN activite.p_sejours ON w_cti_encours_factures_lignes_c.no_sejour = p_sejours.no_sejour
JOIN activite.t_prestations ON prestation_id = t_prestations.oid AND code IN ('GMT', 'PJ', 'FJ', 'PHJ','SSM', 'GHS', 'GHT', 'EXH', 'SRC', 'REA', 'STF', 'NN1', 'NN2', 'NN3', 'CP', 'CPC', 'SHO')
WHERE type_sejour = '1' AND (nb_prestation > 1 or nb_prestation < -1 OR (t_prestations.code = 'GHS' AND date(date_fin) - date(date_entree) > 1 )) ;
UPDATE w_cti_encours_factures_lignes_sup_c SET
date_fin_ghs = date(date_debut_exh - interval '1 day'),
nb_prestation_ghs = date(date_debut_exh - interval '1 day') - date_debut_ghs + 1
FROM (
SELECT no_facture, date(MIN(date_debut)) AS date_debut_exh
FROM w_cti_encours_factures_lignes_c
JOIN activite.t_prestations ON prestation_id = t_prestations.oid AND code = 'EXH'
GROUP BY 1) subview
WHERE w_cti_encours_factures_lignes_sup_c.no_facture = subview.no_facture ;
INSERT INTO w_cti_encours_factures_lignes_sup_c_gen
SELECT
from_oid,
no_sejour,
no_facture,
date AS date_debut,
date AS date_fin,
lieu_id,
rubrique_facturation_id,
rubrique_comptabilisation_id,
prestation_id,
lpp_id,
ucd_id,
CASE WHEN prestation_code = 'GHS' AND date <> date_fin_ghs AND t_rubriques_facturation.code = '111' THEN 1 WHEN prestation_code = 'GHS' AND date <> date_fin_ghs THEN 0 WHEN nb_prestation < 0 THEN -1 ELSE 1 END AS nb_rubrique,
CASE WHEN prestation_code = 'GHS' AND date <> date_fin_ghs THEN 0 WHEN nb_prestation < 0 THEN -1 ELSE 1 END AS nb_prestation,
coefficient,
coefficient_mco,
prix_unitaire,
w_cti_encours_factures_lignes_sup_c.oid,
round(montant_encours / ABS(CASE WHEN prestation_code <> 'GHS' THEN nb_prestation ELSE nb_prestation_ghs END),2) AS montant_encours,
type_ligne,
regle_ghs,
regle_coefficient,
regle_texte
FROM w_cti_encours_factures_lignes_sup_c
JOIN base.p_calendrier ON date_debut BETWEEN p_calendrier.date - ABS(CASE WHEN prestation_code <> 'GHS' THEN nb_prestation ELSE nb_prestation_ghs END)::integer + 1 AND p_calendrier.date AND
p_calendrier.date <> date_debut
JOIN activite.t_rubriques_facturation ON rubrique_facturation_id = t_rubriques_facturation.oid;
INSERT INTO w_cti_encours_factures_lignes_sup_c_gen_tot
SELECT from_oid,
SUM(nb_rubrique) AS nb_rubrique,
SUM(nb_prestation) AS nb_prestation,
SUM(montant_encours) AS montant_encours
FROM w_cti_encours_factures_lignes_sup_c_gen
GROUP BY 1;
UPDATE w_cti_encours_factures_lignes_c
SET
date_fin = w_cti_encours_factures_lignes_c.date_debut,
nb_rubrique = w_cti_encours_factures_lignes_c.nb_rubrique - w_cti_encours_factures_lignes_sup_c_gen_tot.nb_rubrique,
nb_prestation = w_cti_encours_factures_lignes_c.nb_prestation - w_cti_encours_factures_lignes_sup_c_gen_tot.nb_prestation,
montant_encours = w_cti_encours_factures_lignes_c.montant_encours - w_cti_encours_factures_lignes_sup_c_gen_tot.montant_encours
FROM w_cti_encours_factures_lignes_sup_c_gen_tot
WHERE w_cti_encours_factures_lignes_c.oid = from_oid;
UPDATE w_cti_encours_factures_lignes_c
SET
nb_rubrique = nb_prestation
FROM activite.t_rubriques_facturation, activite.t_prestations
WHERE w_cti_encours_factures_lignes_c.prestation_id = t_prestations.oid AND t_prestations.code = 'GHS' AND
w_cti_encours_factures_lignes_c.rubrique_facturation_id = t_rubriques_facturation.oid AND t_rubriques_facturation.code <> '111';
INSERT INTO w_cti_encours_factures_lignes_c (
no_sejour,
no_facture,
date_debut,
date_fin,
nb_rubrique,
coefficient,
coefficient_mco,
prestation_id,
lpp_id,
ucd_id,
rubrique_facturation_id,
rubrique_comptabilisation_id,
prix_unitaire,
nb_prestation,
montant_encours,
type_ligne,
regle_ghs,
lieu_id,
regle_coefficient,
regle_texte)
SELECT
no_sejour,
no_facture,
date_debut,
date_fin,
nb_rubrique,
coefficient,
coefficient_mco,
prestation_id,
lpp_id,
ucd_id,
rubrique_facturation_id,
rubrique_comptabilisation_id,
prix_unitaire,
nb_prestation,
montant_encours,
type_ligne,
regle_ghs,
lieu_id,
regle_coefficient,
regle_texte
FROM w_cti_encours_factures_lignes_sup_c_gen;
-- sur ambulatoires avec une nuit,
UPDATE w_cti_encours_factures_lignes_c
SET date_fin = date_debut
WHERE prestation_id IN (SELECT oid FROM activite.t_prestations WHERE code = 'GHS') AND
nb_rubrique = 1 AND
date_fin - date_debut = 1;
-- Lieu
UPDATE w_cti_encours_factures_lignes_c
SET lieu_id = p_mouvements_sejour.lieu_id
FROM
activite.p_factures,
activite.p_mouvements_sejour
WHERE
w_cti_encours_factures_lignes_c.no_facture = p_factures.no_facture AND
p_factures.no_sejour = p_mouvements_sejour.no_sejour AND
w_cti_encours_factures_lignes_c.date_fin = p_mouvements_sejour.date AND
(230000 BETWEEN p_mouvements_sejour.heure_debut AND p_mouvements_sejour.heure_fin OR
nb_entrees_directes = 1 AND heure_fin = 240000 OR
nb_sorties_directes = 1 ) AND
p_mouvements_sejour.lieu_id IS DISTINCT FROM w_cti_encours_factures_lignes_c.lieu_id;
UPDATE w_cti_encours_factures_lignes_c
SET lieu_id = p_sejours.lieu_sortie_id
FROM activite.p_sejours
WHERE w_cti_encours_factures_lignes_c.no_sejour = p_sejours.no_sejour
AND (lieu_id = 0 OR lieu_id is null);
-- 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
WHERE p_mouvements_sejour.no_sejour IN (SELECT no_sejour FROM w_cti_encours_factures_lignes_c )
GROUP BY 1,2
HAVING MAX(est_absence) = '1'
;
UPDATE w_cti_encours_factures_lignes_c
SET lieu_id = COALESCE(w_mouvements_sejour_lieu_jour.lieu_id,w_mouvements_sejour_lieu_jour.lieu_id_avec_absence)
FROM w_mouvements_sejour_lieu_jour
WHERE w_cti_encours_factures_lignes_c.no_sejour = w_mouvements_sejour_lieu_jour.no_sejour AND
w_cti_encours_factures_lignes_c.date_fin = w_mouvements_sejour_lieu_jour.date AND
w_cti_encours_factures_lignes_c.lieu_id <> COALESCE(w_mouvements_sejour_lieu_jour.lieu_id,w_mouvements_sejour_lieu_jour.lieu_id_avec_absence)
;
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'Reaffectation prestation TDE sur budget global';
DROP TABLE IF EXISTS w_factures_e;
CREATE TEMP TABLE w_factures_e AS
SELECT p_factures.no_sejour,
p_factures_bg.no_facture AS no_facture_bg,
p_factures.no_facture AS no_facture_nbg
FROM w_cti_encours_factures p_factures
JOIN w_cti_encours_factures p_factures_bg ON p_factures_bg.no_sejour = p_factures.no_sejour AND p_factures_bg.no_facture LIKE '%BG'
WHERE p_factures.no_facture NOT LIKE '%BG'
;
ANALYSE w_factures_e
;
UPDATE w_cti_encours_factures_lignes_c p_factures_lignes_c
SET no_facture = no_facture_bg
FROM w_factures_e, activite.t_prestations
WHERE p_factures_lignes_c.no_facture = no_facture_nbg AND
prestation_id = t_prestations.oid AND
t_prestations.code LIKE 'TDE%'
;
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'Repartition par tiers payant';
UPDATE w_cti_encours_factures_lignes_c SET
montant_encours_1 = CASE WHEN tiers_payant_1_id <> 0 THEN round(montant_encours * coeff_1,2) ELSE 0 END,
montant_encours_2 = CASE WHEN tiers_payant_2_id <> 0 THEN round(montant_encours * coeff_2,2) ELSE 0 END,
montant_encours_0 = montant_encours - CASE WHEN tiers_payant_1_id <> 0 THEN round(montant_encours * coeff_1,2) ELSE 0 END
- CASE WHEN tiers_payant_2_id <> 0 THEN round(montant_encours * coeff_2,2) ELSE 0 END
FROM w_cti_encours_factures, w_cti_encours_repartition_tp
WHERE w_cti_encours_factures_lignes_c.no_facture = w_cti_encours_factures.no_facture AND
w_cti_encours_factures_lignes_c.rubrique_facturation_id = w_cti_encours_repartition_tp.rubrique_facturation_id;
UPDATE w_cti_encours_factures SET
regle_ghs = COALESCE(subview.regle_ghs,'0'),
montant_valorise_c = COALESCE(subview.montant_valorise,0),
montant_valorise_0_c = COALESCE(subview.montant_valorise_0,0),
montant_valorise_1_c = COALESCE(subview.montant_valorise_1,0),
montant_valorise_2_c = COALESCE(subview.montant_valorise_2,0),
montant_encours_c = COALESCE(subview.montant_encours,0),
montant_encours_0_c = COALESCE(subview.montant_encours_0,0),
montant_encours_1_c = COALESCE(subview.montant_encours_1,0),
montant_encours_2_c = COALESCE(subview.montant_encours_2,0),
etat = ''
FROM
(SELECT w_cti_encours_factures.no_facture,
MAX(w_cti_encours_factures_lignes_c.regle_ghs) AS regle_ghs,
SUM(montant_encours) AS montant_valorise,
SUM(montant_encours_0) AS montant_valorise_0,
SUM(montant_encours_1) AS montant_valorise_1,
SUM(montant_encours_2) AS montant_valorise_2,
SUM(CASE WHEN w_cti_encours_factures_lignes_c.date_fin <= w_cti_encours_factures.date_encours THEN montant_encours ELSE 0 END) AS montant_encours,
SUM(CASE WHEN w_cti_encours_factures_lignes_c.date_fin <= w_cti_encours_factures.date_encours THEN montant_encours_0 ELSE 0 END) AS montant_encours_0,
SUM(CASE WHEN w_cti_encours_factures_lignes_c.date_fin <= w_cti_encours_factures.date_encours THEN montant_encours_1 ELSE 0 END) AS montant_encours_1,
SUM(CASE WHEN w_cti_encours_factures_lignes_c.date_fin <= w_cti_encours_factures.date_encours THEN montant_encours_2 ELSE 0 END) AS montant_encours_2
FROM w_cti_encours_factures
LEFT JOIN w_cti_encours_factures_lignes_c ON w_cti_encours_factures_lignes_c.no_facture = w_cti_encours_factures.no_facture AND
w_cti_encours_factures_lignes_c.ignorer IS DISTINCT FROM '1'
WHERE w_cti_encours_factures.ignorer IS DISTINCT FROM '1'
GROUP BY 1
) subview
WHERE subview.no_facture = w_cti_encours_factures.no_facture;
-- Génération encours
IF w_date_encours = w_date_encours_actuelle THEN
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'Generation valorisation non factures';
DELETE FROM activite.p_factures_lignes_c WHERE montant_encours <> 0;
DELETE FROM activite.p_factures_lignes_h WHERE montant_encours <> 0;
DELETE
FROM activite.p_factures_lignes_c
WHERE montant_encours = 0 AND
montant_facture = 0 AND
montant_comptabilise = 0 AND
no_facture IN (SELECT no_facture FROM w_cti_encours_factures_lignes_c)
;
DELETE
FROM activite.p_factures_lignes_c
USING activite.p_factures
WHERE p_factures_lignes_c.no_facture = p_factures.no_facture AND
p_factures.montant_encours_c <> 0
;
DELETE
FROM activite.p_factures_lignes_h
USING activite.p_factures
WHERE p_factures_lignes_h.no_facture = p_factures.no_facture AND
p_factures.montant_encours_c <> 0
;
UPDATE activite.p_factures SET
montant_encours_c = 0,
montant_encours_0_c = 0,
montant_encours_1_c = 0,
montant_encours_2_c = 0,
montant_encours_22_c = 0,
montant_encours_h = 0,
montant_encours_0_h = 0,
montant_encours_1_h = 0,
montant_encours_2_h = 0,
montant_encours_22_h = 0
WHERE montant_encours_c <> 0 OR montant_encours_h <> 0;
INSERT INTO activite.p_factures_lignes_c(
facture_id, no_facture, date_debut, date_fin, nb_rubrique, nb_prestation, coefficient, coefficient_mco, prix_unitaire,
prestation_id, lpp_id, ucd_id, rubrique_facturation_id, rubrique_comptabilisation_id, lieu_id,
montant_facture, montant_facture_0, montant_facture_1, montant_facture_2, montant_facture_22,
taux_0, taux_1, taux_2, taux_22,
montant_comptabilise, montant_comptabilise_0, montant_comptabilise_1, montant_comptabilise_2, montant_comptabilise_22,
montant_encours, montant_encours_1, montant_encours_2, montant_encours_0)
SELECT
w_cti_encours_factures.oid, w_cti_encours_factures.no_facture, w_cti_encours_factures_lignes_c.date_debut, w_cti_encours_factures_lignes_c.date_fin, nb_rubrique, nb_prestation, coefficient, coefficient_mco, prix_unitaire,
prestation_id, lpp_id, ucd_id, w_cti_encours_factures_lignes_c.rubrique_facturation_id, rubrique_comptabilisation_id, lieu_id,
0, 0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0, 0,
montant_encours,
montant_encours_1,
montant_encours_2,
montant_encours_0
FROM w_cti_encours_factures_lignes_c
JOIN w_cti_encours_factures ON w_cti_encours_factures_lignes_c.no_facture = w_cti_encours_factures.no_facture
WHERE w_cti_encours_factures_lignes_c.rubrique_facturation_id IS NOT NULL AND
w_cti_encours_factures.ignorer IS DISTINCT FROM '1' AND
w_cti_encours_factures_lignes_c.ignorer IS DISTINCT FROM '1' AND
type_ligne <> 'GHSECART';
UPDATE activite.p_factures SET
tiers_payant_1_id = w_cti_encours_factures.tiers_payant_1_id,
tiers_payant_2_id = w_cti_encours_factures.tiers_payant_2_id,
montant_encours_c = w_cti_encours_factures.montant_valorise_c,
montant_encours_1_c = w_cti_encours_factures.montant_valorise_1_c,
montant_encours_2_c = w_cti_encours_factures.montant_valorise_2_c,
montant_encours_0_c = w_cti_encours_factures.montant_valorise_0_c
FROM w_cti_encours_factures
WHERE w_cti_encours_factures.no_facture = p_factures.no_facture AND
w_cti_encours_factures.ignorer <> '1';
UPDATE activite.p_factures_lignes_non_facturees_h
SET prix_unitaire = subview.prix_unitaire
FROM
(
SELECT acte_id, activite_ccam, modificateur_ccam_1, modificateur_ccam_2, modificateur_ccam_3, modificateur_ccam_4,
base.Cti_division(SUM(montant_facture_1),SUM(nb_prestation*coefficient)) AS prix_unitaire
FROM activite.p_factures_lignes_h
WHERE acte_id IN (SELECT acte_id FROM activite.p_factures_lignes_non_facturees_h WHERE prix_unitaire = 0) AND
montant_facture_1 > 0
GROUP BY 1,2,3,4,5,6
) subview
WHERE p_factures_lignes_non_facturees_h.acte_id = subview.acte_id AND
p_factures_lignes_non_facturees_h.activite_ccam = subview.activite_ccam AND
p_factures_lignes_non_facturees_h.modificateur_ccam_1 = subview.modificateur_ccam_1 AND
p_factures_lignes_non_facturees_h.modificateur_ccam_2 = subview.modificateur_ccam_2 AND
p_factures_lignes_non_facturees_h.modificateur_ccam_3 = subview.modificateur_ccam_3 AND
p_factures_lignes_non_facturees_h.modificateur_ccam_4 = subview.modificateur_ccam_4 AND
p_factures_lignes_non_facturees_h.prix_unitaire = 0
;
UPDATE activite.p_factures_lignes_non_facturees_h
SET prix_unitaire = subview.prix_unitaire
FROM
(
SELECT acte_id, activite_ccam,
base.Cti_division(SUM(montant_facture_1),SUM(nb_prestation*coefficient)) AS prix_unitaire
FROM activite.p_factures_lignes_h
WHERE acte_id IN (SELECT acte_id FROM activite.p_factures_lignes_non_facturees_h WHERE prix_unitaire = 0) AND
montant_facture_1 > 0
GROUP BY 1,2
) subview
WHERE p_factures_lignes_non_facturees_h.acte_id = subview.acte_id AND
p_factures_lignes_non_facturees_h.activite_ccam = subview.activite_ccam AND
p_factures_lignes_non_facturees_h.prix_unitaire = 0
;
INSERT INTO activite.p_factures_lignes_h (
no_facture,
facture_id,
date_debut,
heure_debut,
date_fin,
coefficient,
coefficient_mco,
lieu_id,
prestation_id,
rubrique_facturation_id,
rubrique_comptabilisation_id,
acte_id,
phase_ccam,
activite_ccam,
extension_ccam,
modificateur_ccam_1,
modificateur_ccam_2,
modificateur_ccam_3,
modificateur_ccam_4,
medecin_facture_id,
medecin_comptabilise_id,
nb_rubrique,
nb_prestation,
prix_unitaire,
taux_0,
taux_1,
taux_2,
taux_22,
montant_facture,
montant_facture_0,
montant_facture_1,
montant_facture_2,
montant_facture_22,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
montant_depassement,
montant_encours,
montant_encours_0,
montant_encours_1,
montant_encours_2,
montant_encours_22,
montant_non_facture
)
SELECT
w_cti_encours_factures.no_facture,
w_cti_encours_factures.oid AS facture_id,
p_factures_lignes_non_facturees_h.date_debut,
p_factures_lignes_non_facturees_h.heure_debut,
p_factures_lignes_non_facturees_h.date_fin,
p_factures_lignes_non_facturees_h.coefficient,
1::numeric AS coefficient_mco,
w_cti_encours_factures.lieu_sortie_id AS lieu_id,
p_factures_lignes_non_facturees_h.prestation_id,
0::bigint AS rubrique_facturation_id,
0::bigint AS rubrique_comptabilisation_id,
p_factures_lignes_non_facturees_h.acte_id,
p_factures_lignes_non_facturees_h.phase_ccam,
p_factures_lignes_non_facturees_h.activite_ccam,
p_factures_lignes_non_facturees_h.extension_ccam,
p_factures_lignes_non_facturees_h.modificateur_ccam_1,
p_factures_lignes_non_facturees_h.modificateur_ccam_2,
p_factures_lignes_non_facturees_h.modificateur_ccam_3,
p_factures_lignes_non_facturees_h.modificateur_ccam_4,
p_factures_lignes_non_facturees_h.medecin_facture_id,
p_factures_lignes_non_facturees_h.medecin_facture_id AS medecin_comptabilise_id,
p_factures_lignes_non_facturees_h.nb_rubrique,
p_factures_lignes_non_facturees_h.nb_rubrique AS nb_prestation,
p_factures_lignes_non_facturees_h.prix_unitaire,
0::numeric AS taux_0,
0::numeric AS taux_1,
0::numeric AS taux_2,
0::numeric AS taux_22,
0::numeric AS montant_facture,
0::numeric AS montant_facture_0,
0::numeric AS montant_facture_1,
0::numeric AS montant_facture_2,
0::numeric AS montant_facture_22,
0::numeric AS montant_comptabilise,
0::numeric AS montant_comptabilise_0,
0::numeric AS montant_comptabilise_1,
0::numeric AS montant_comptabilise_2,
0::numeric AS montant_comptabilise_22,
0::numeric AS montant_depassement,
nb_rubrique * prix_unitaire * p_factures_lignes_non_facturees_h.coefficient AS montant_encours,
0::numeric AS montant_encours_0,
nb_rubrique * prix_unitaire * p_factures_lignes_non_facturees_h.coefficient AS montant_encours_1,
0::numeric AS montant_encours_2,
0::numeric AS montant_encours_22,
nb_rubrique * prix_unitaire * p_factures_lignes_non_facturees_h.coefficient AS montant_non_facture
FROM activite.p_factures_lignes_non_facturees_h
JOIN w_cti_encours_factures ON p_factures_lignes_non_facturees_h.no_facture = w_cti_encours_factures.no_facture
WHERE w_cti_encours_factures.ignorer <> '1'
;
-- Total honoraires valorisés
UPDATE activite.p_factures SET
montant_encours_h = COALESCE(subview.montant_valorise,0)
FROM
(SELECT
w_cti_encours_factures.no_facture,
SUM(nb_rubrique * prix_unitaire * p_factures_lignes_non_facturees_h.coefficient) AS montant_valorise
FROM activite.p_factures_lignes_non_facturees_h
JOIN w_cti_encours_factures ON p_factures_lignes_non_facturees_h.no_facture = w_cti_encours_factures.no_facture
WHERE w_cti_encours_factures.ignorer <> '1'
GROUP BY 1
) subview
WHERE subview.no_facture = p_factures.no_facture;
END IF;
-- Transformation factures non valorisées en en cours
UPDATE activite.p_factures_lignes_c SET
montant_encours = montant_facture,
montant_encours_0 = montant_facture_0,
montant_encours_1 = montant_facture_1,
montant_encours_2 = montant_facture_2,
montant_encours_22 = montant_facture_22,
montant_facture = 0,
montant_facture_0 = 0,
montant_facture_1 = 0,
montant_facture_2 = 0,
montant_facture_22 = 0
FROM activite.p_factures
WHERE p_factures.no_facture = p_factures_lignes_c.no_facture AND
p_factures.code_facture = '3';
UPDATE activite.p_factures_lignes_h SET
montant_encours = montant_facture,
montant_encours_0 = montant_facture_0,
montant_encours_1 = montant_facture_1,
montant_encours_2 = montant_facture_2,
montant_encours_22 = montant_facture_22,
montant_facture = 0,
montant_facture_0 = 0,
montant_facture_1 = 0,
montant_facture_2 = 0,
montant_facture_22 = 0
FROM activite.p_factures
WHERE p_factures.no_facture = p_factures_lignes_h.no_facture AND
p_factures.code_facture = '3';
UPDATE activite.p_factures SET
type_facture = 'E',
code_facture = '0',
montant_encours_c = montant_facture_c,
montant_encours_0_c = montant_facture_0_c,
montant_encours_1_c = montant_facture_1_c,
montant_encours_2_c = montant_facture_2_c,
montant_encours_22_c = montant_facture_22_c,
montant_facture_c = 0,
montant_facture_0_c = 0,
montant_facture_1_c = 0,
montant_facture_2_c = 0,
montant_facture_22_c = 0,
montant_encours_h = montant_facture_h,
montant_encours_0_h = montant_facture_0_h,
montant_encours_1_h = montant_facture_1_h,
montant_encours_2_h = montant_facture_2_h,
montant_encours_22_h = montant_facture_22_h,
montant_facture_h = 0,
montant_facture_0_h = 0,
montant_facture_1_h = 0,
montant_facture_2_h = 0,
montant_facture_22_h = 0
WHERE code_facture = '3';
-- Génération encours comptables
IF (i_option NOT ILIKE '%-nogen%') THEN
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'Generation en-cours comptables';
IF EXISTS (SELECT valeur FROM activite.t_divers WHERE code = 'ENCOURSACTIVE' AND valeur = '1') THEN
-- Effacer encours Budget Global
DELETE FROM activite.p_factures_encours
WHERE code_origine = 'C' AND no_facture LIKE '%BG%' AND
(SELECT valeur FROM activite.t_divers WHERE code = 'ENCOURSACTIVEBG') IS DISTINCT FROM '1';
-- Effacer factures encours comptabilisées sur même mois
DELETE FROM activite.p_factures_encours
USING activite.p_factures
WHERE code_origine = 'C' AND
p_factures_encours.no_facture_reference = p_factures.no_facture AND
p_factures.code_vente = '1' AND p_factures_encours.date_encours >= p_factures.date_vente AND
date(date_trunc('month',p_factures_encours.date_encours)) >=
(SELECT date(date_trunc('month',t_divers.valeur_date)) FROM activite.t_divers WHERE t_divers.code = 'ENCOURSNOW');
-- Effacer génération précédente
DELETE FROM activite.p_factures_encours
USING w_cti_encours_calcul_parametres
WHERE date_trunc('month',p_factures_encours.date_encours) = date_trunc('month',w_cti_encours_calcul_parametres.date_encours) AND
code_origine = 'C';
-- Lignes non référencées
DELETE FROM activite.p_factures_encours_lignes_c
WHERE NOT EXISTS (SELECT 'NOT_TO_DELETE' FROM activite.p_factures_encours WHERE p_factures_encours.no_facture = p_factures_encours_lignes_c.no_facture)
AND p_factures_encours_lignes_c IS NOT NULL;
DELETE FROM activite.p_facture_encours_ligne_valorise_c
WHERE NOT EXISTS (SELECT 'NOT_TO_DELETE' FROM activite.p_factures_encours WHERE p_factures_encours.no_facture = p_facture_encours_ligne_valorise_c.no_facture)
AND p_facture_encours_ligne_valorise_c IS NOT NULL;
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'Entetes (valorisees)';
-- Ajout encours
INSERT INTO activite.p_factures_encours(
sejour_id,
no_sejour,
no_facture,
no_facture_reference,
date_debut,
date_fin,
code_origine,
code_sorti,
date_encours,
date_calcul,
tiers_payant_1_id,
tiers_payant_2_id,
tiers_payant_22_id,
tiers_payant_0_id,
ghs_id,
ghs_bebe1_id,
ghs_bebe2_id,
ghs_bebe3_id,
code_cp_demandee,
montant_encours_c,
montant_encours_0_c,
montant_encours_1_c,
montant_encours_2_c,
montant_encours_22_c,
montant_encours_h,
montant_encours_0_h,
montant_encours_1_h,
montant_encours_2_h,
montant_encours_22_h,
date_entree,
heure_entree,
date_sortie,
heure_sortie,
type_sejour,
lieu_sortie_id,
date_groupage,
provider_id,
ghm_id,
filiere_soin_principale_id
)
SELECT
w_cti_encours_factures.sejour_id,
w_cti_encours_factures.no_sejour,
w_cti_encours_factures.no_facture_encours,
p_factures.no_facture_reference,
w_cti_encours_factures.date_debut,
w_cti_encours_factures.date_fin,
'C' AS code_origine,
CASE
WHEN p_sejours.code_sorti = '1' AND p_sejours.type_sejour <> '3' AND date_trunc('month',p_sejours.date_sortie) <= date_trunc('month',w_cti_encours_factures.date_encours) THEN '1'
WHEN p_sejours.type_sejour = '3' THEN '1'
ELSE '0' END AS code_sorti,
w_cti_encours_factures.date_encours AS date_encours,
w_NOW AS date_calcul,
w_cti_encours_factures.tiers_payant_1_id,
w_cti_encours_factures.tiers_payant_2_id,
0 AS tiers_payant_22_id,
p_factures.tiers_payant_0_id,
w_cti_encours_factures.ghs_id,
w_cti_encours_factures.ghs_bebe1_id,
w_cti_encours_factures.ghs_bebe2_id,
w_cti_encours_factures.ghs_bebe3_id,
w_cti_encours_factures.code_cp_demandee,
w_cti_encours_factures.montant_encours_c,
w_cti_encours_factures.montant_encours_0_c,
w_cti_encours_factures.montant_encours_1_c,
w_cti_encours_factures.montant_encours_2_c,
0 AS montant_encours_22_c,
0 AS montant_encours_h,
0 AS montant_encours_0_h,
0 AS montant_encours_1_h,
0 AS montant_encours_2_h,
0 AS montant_encours_22_h,
p_sejours.date_entree,
p_sejours.heure_entree,
p_sejours.date_sortie,
p_sejours.heure_sortie,
p_sejours.type_sejour,
p_sejours.lieu_sortie_id,
p_sejours.date_groupage,
p_sejours.provider_id,
p_sejours.ghm_id,
p_sejours.filiere_soin_principale_id
FROM w_cti_encours_factures
JOIN activite.p_factures ON w_cti_encours_factures.no_facture = p_factures.no_facture
JOIN activite.p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
LEFT JOIN activite.t_divers t_divers_encoreactivebg ON t_divers_encoreactivebg.code = 'ENCOURSACTIVEBG'
WHERE w_cti_encours_factures.montant_encours_c <> 0 AND
w_cti_encours_factures.date_debut <= w_cti_encours_factures.date_encours AND
(
w_cti_encours_factures.no_facture NOT LIKE '%BG' OR
t_divers_encoreactivebg.valeur = '1'
) AND
w_cti_encours_factures.ignorer <> '1';
-- detail encours
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'Lignes (valorisees)';
INSERT INTO activite.p_factures_encours_lignes_c(
facture_id,
no_facture,
date_debut,
date_fin,
nb_rubrique,
coefficient,
coefficient_mco,
rubrique_facturation_id,
prestation_id,
lpp_id,
ucd_id,
prix_unitaire,
lieu_id,
nb_prestation,
rubrique_comptabilisation_id,
montant_encours,
montant_encours_0,
montant_encours_1,
montant_encours_2,
montant_encours_22
)
SELECT
p_factures_encours.oid AS facture_id,
w_cti_encours_factures.no_facture_encours,
MIN(w_cti_encours_factures_lignes_c.date_debut),
LEAST(MAX(w_cti_encours_factures_lignes_c.date_fin),MAX(p_factures_encours.date_encours)),
SUM(w_cti_encours_factures_lignes_c.nb_rubrique),
w_cti_encours_factures_lignes_c.coefficient,
w_cti_encours_factures_lignes_c.coefficient_mco,
w_cti_encours_factures_lignes_c.rubrique_facturation_id,
w_cti_encours_factures_lignes_c.prestation_id,
w_cti_encours_factures_lignes_c.lpp_id,
w_cti_encours_factures_lignes_c.ucd_id,
w_cti_encours_factures_lignes_c.prix_unitaire,
w_cti_encours_factures_lignes_c.lieu_id,
SUM(w_cti_encours_factures_lignes_c.nb_prestation),
w_cti_encours_factures_lignes_c.rubrique_comptabilisation_id,
SUM(w_cti_encours_factures_lignes_c.montant_encours),
SUM(w_cti_encours_factures_lignes_c.montant_encours_0),
SUM(w_cti_encours_factures_lignes_c.montant_encours_1),
SUM(w_cti_encours_factures_lignes_c.montant_encours_2),
SUM(w_cti_encours_factures_lignes_c.montant_encours_22)
FROM w_cti_encours_factures_lignes_c
JOIN w_cti_encours_factures ON w_cti_encours_factures_lignes_c.no_facture = w_cti_encours_factures.no_facture
JOIN activite.p_factures_encours ON w_cti_encours_factures.no_facture_encours = p_factures_encours.no_facture
LEFT JOIN activite.t_divers t_divers_encoreactivebg ON t_divers_encoreactivebg.code = 'ENCOURSACTIVEBG'
WHERE w_cti_encours_factures_lignes_c.montant_encours <> 0 AND
w_cti_encours_factures_lignes_c.date_debut <= w_cti_encours_factures.date_encours AND
w_cti_encours_factures_lignes_c.rubrique_facturation_id IS NOT NULL AND
(
w_cti_encours_factures.no_facture NOT LIKE '%BG' OR
t_divers_encoreactivebg.valeur = '1'
) AND
w_cti_encours_factures.ignorer <> '1' AND
w_cti_encours_factures_lignes_c.ignorer <> '1'
GROUP BY
p_factures_encours.oid,
date_trunc('month',w_cti_encours_factures_lignes_c.date_fin),
w_cti_encours_factures.no_facture_encours,
w_cti_encours_factures_lignes_c.coefficient,
w_cti_encours_factures_lignes_c.coefficient_mco,
w_cti_encours_factures_lignes_c.rubrique_facturation_id,
w_cti_encours_factures_lignes_c.prestation_id,
w_cti_encours_factures_lignes_c.lpp_id,
w_cti_encours_factures_lignes_c.ucd_id,
w_cti_encours_factures_lignes_c.prix_unitaire,
w_cti_encours_factures_lignes_c.lieu_id,
w_cti_encours_factures_lignes_c.rubrique_comptabilisation_id;
-- Justificatif valorisation
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'Justificatif (valorisees)';
INSERT INTO activite.p_facture_encours_ligne_valorise_c(
no_facture, facture_id, date_debut, date_fin, lieu_id, nb_rubrique,
nb_prestation, coefficient, coefficient_mco, rubrique_facturation_id,
prestation_id, lpp_id, ucd_id, prix_unitaire, montant_valorise_total, montant_encours, type_ligne_code, mode_calcul_code,
mode_calcul_texte)
SELECT
w_cti_encours_factures.no_facture_encours,
p_factures_encours.oid AS facture_id,
MIN(w_cti_encours_factures_lignes_c.date_debut),
MAX(w_cti_encours_factures_lignes_c.date_fin),
CASE
WHEN t_prestations.code LIKE 'GHS%' THEN w_cti_encours_factures.lieu_sortie_id
WHEN w_cti_encours_factures_lignes_c.type_ligne = 'SAISIE' THEN 0
ELSE w_cti_encours_factures_lignes_c.lieu_id END,
SUM(nb_rubrique),
SUM(nb_prestation),
coefficient,
coefficient_mco,
w_cti_encours_factures_lignes_c.rubrique_facturation_id,
prestation_id,
lpp_id,
ucd_id,
prix_unitaire,
SUM(CASE WHEN w_cti_encours_factures.ignorer IS DISTINCT FROM '1' AND w_cti_encours_factures_lignes_c.ignorer IS DISTINCT FROM '1' THEN montant_encours ELSE 0 END),
SUM(CASE WHEN w_cti_encours_factures.ignorer IS DISTINCT FROM '1' AND w_cti_encours_factures_lignes_c.ignorer IS DISTINCT FROM '1' AND w_cti_encours_factures_lignes_c.date_debut <= w_cti_encours_factures.date_encours THEN montant_encours ELSE 0 END),
w_cti_encours_factures_lignes_c.type_ligne,
CASE
WHEN w_cti_encours_factures.ignorer = '1' AND w_cti_encours_factures_lignes_c.regle_ghs <> '' THEN '00-FORCE'
WHEN w_cti_encours_factures_lignes_c.ignorer = '1' AND w_cti_encours_factures_lignes_c.regle_ghs <> '' THEN '00-FORCE'
ELSE w_cti_encours_factures_lignes_c.regle_ghs END,
CASE
WHEN w_cti_encours_factures.ignorer = '1' THEN 'FACTURE IGNOREE.'
WHEN w_cti_encours_factures_lignes_c.ignorer = '1' THEN 'LIGNE IGNOREE.'
ELSE w_cti_encours_factures_lignes_c.regle_texte END
FROM w_cti_encours_factures_lignes_c
JOIN w_cti_encours_factures ON w_cti_encours_factures_lignes_c.no_facture = w_cti_encours_factures.no_facture
JOIN activite.p_factures_encours ON w_cti_encours_factures.no_facture_encours = p_factures_encours.no_facture
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
WHERE w_cti_encours_factures_lignes_c.rubrique_facturation_id IS NOT NULL AND
(montant_encours <> 0 OR
w_cti_encours_factures_lignes_c.ignorer = '1'
)
GROUP BY 1,2,5,8,9,10,11,12,13,14,17,18,19
ORDER BY 1;
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'Entetes (facturees debut de mois)';
-- Ajout encours
INSERT INTO activite.p_factures_encours(
sejour_id,
no_sejour,
no_facture,
no_facture_reference,
date_debut,
date_fin,
code_origine,
code_sorti,
date_encours,
date_calcul,
tiers_payant_1_id,
tiers_payant_2_id,
tiers_payant_22_id,
tiers_payant_0_id,
ghs_id,
ghs_bebe1_id,
ghs_bebe2_id,
ghs_bebe3_id,
code_cp_demandee,
montant_encours_c,
montant_encours_0_c,
montant_encours_1_c,
montant_encours_2_c,
montant_encours_22_c,
montant_encours_h,
montant_encours_0_h,
montant_encours_1_h,
montant_encours_2_h,
montant_encours_22_h,
date_entree,
heure_entree,
date_sortie,
heure_sortie,
type_sejour,
lieu_sortie_id,
date_groupage,
provider_id,
ghm_id,
filiere_soin_principale_id
)
SELECT
p_factures.sejour_id,
p_factures.no_sejour,
p_factures.no_facture || '.EV' || substr(to_char(date_part('year', w_cti_encours_calcul_parametres.date_encours),'FM0000'),3,2) || to_char(date_part('month', w_cti_encours_calcul_parametres.date_encours),'FM00') AS no_facture_encours,
p_factures.no_facture_reference,
p_factures.date_debut,
p_factures.date_fin,
'C' AS code_origine,
CASE
WHEN p_sejours.code_sorti = '1' AND p_sejours.type_sejour <> '3' AND date_trunc('month',p_sejours.date_sortie) <= date_trunc('month',w_cti_encours_calcul_parametres.date_encours) THEN '1'
WHEN p_sejours.type_sejour = '3' THEN '1'
ELSE '0' END AS code_sorti,
w_cti_encours_calcul_parametres.date_encours AS date_encours,
w_NOW AS date_calcul,
p_factures.tiers_payant_1_id,
p_factures.tiers_payant_2_id,
0 AS tiers_payant_22_id,
p_factures.tiers_payant_0_id,
p_factures.ghs_id,
p_factures.ghs_bebe1_id,
p_factures.ghs_bebe2_id,
p_factures.ghs_bebe3_id,
p_factures.code_cp_demandee,
p_factures.montant_comptabilise_c AS montant_encours_c,
p_factures.montant_comptabilise_0_c AS montant_encours_0_c,
p_factures.montant_comptabilise_1_c AS montant_encours_1_c,
p_factures.montant_comptabilise_2_c AS montant_encours_2_c,
0 AS montant_encours_22_c,
0 AS montant_encours_h,
0 AS montant_encours_0_h,
0 AS montant_encours_1_h,
0 AS montant_encours_2_h,
0 AS montant_encours_22_h,
p_sejours.date_entree,
p_sejours.heure_entree,
p_sejours.date_sortie,
p_sejours.heure_sortie,
p_sejours.type_sejour,
p_sejours.lieu_sortie_id,
p_sejours.date_groupage,
p_sejours.provider_id,
p_sejours.ghm_id,
p_sejours.filiere_soin_principale_id
FROM activite.p_factures
JOIN activite.p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
JOIN w_cti_encours_calcul_parametres ON 1=1
WHERE date_trunc('month',p_factures.date_fin) <= date_trunc('month',w_cti_encours_calcul_parametres.date_encours) AND
p_factures.code_facture >= '1' AND
date_trunc('month',p_factures.date_vente) > date_trunc('month',w_cti_encours_calcul_parametres.date_encours) AND
p_factures.no_facture NOT LIKE '%BG';
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'Lignes (facturees debut de mois)';
INSERT INTO activite.p_factures_encours_lignes_c(
facture_id,
no_facture,
date_debut,
date_fin,
nb_rubrique,
coefficient,
coefficient_mco,
rubrique_facturation_id,
prestation_id,
prix_unitaire,
lieu_id,
nb_prestation,
rubrique_comptabilisation_id,
compte_produit_id,
montant_encours,
montant_encours_0,
montant_encours_1,
montant_encours_2,
montant_encours_22
)
SELECT
p_factures_encours.oid AS facture_id,
p_factures_encours.no_facture AS no_facture_encours,
MIN(p_factures_lignes_c.date_debut),
MAX(p_factures_lignes_c.date_fin),
SUM(p_factures_lignes_c.nb_rubrique),
p_factures_lignes_c.coefficient,
p_factures_lignes_c.coefficient_mco,
p_factures_lignes_c.rubrique_facturation_id,
p_factures_lignes_c.prestation_id,
p_factures_lignes_c.prix_unitaire,
p_factures_lignes_c.lieu_id,
SUM(p_factures_lignes_c.nb_prestation),
p_factures_lignes_c.rubrique_comptabilisation_id,
p_factures_lignes_c.compte_produit_id,
SUM(p_factures_lignes_c.montant_comptabilise),
SUM(p_factures_lignes_c.montant_comptabilise_0),
SUM(p_factures_lignes_c.montant_comptabilise_1),
SUM(p_factures_lignes_c.montant_comptabilise_2),
SUM(p_factures_lignes_c.montant_comptabilise_22)
FROM activite.p_factures
JOIN activite.p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
JOIN w_cti_encours_calcul_parametres ON 1=1
JOIN activite.p_factures_lignes_c ON p_factures.no_facture = p_factures_lignes_c.no_facture
JOIN activite.p_factures_encours ON (p_factures.no_facture || '.EV' || substr(to_char(date_part('year', w_cti_encours_calcul_parametres.date_encours),'FM0000'),3,2) || to_char(date_part('month', w_cti_encours_calcul_parametres.date_encours),'FM00')) = p_factures_encours.no_facture
WHERE date_trunc('month',p_factures.date_fin) <= date_trunc('month',w_cti_encours_calcul_parametres.date_encours) AND
p_factures.code_facture >= '1' AND
date_trunc('month',p_factures.date_vente) > date_trunc('month',w_cti_encours_calcul_parametres.date_encours) AND
p_factures.no_facture NOT LIKE '%BG' AND
p_factures_lignes_c.montant_comptabilise <> 0
GROUP BY
p_factures_encours.oid,
p_factures_encours.no_facture,
date_trunc('month',p_factures_lignes_c.date_fin),
p_factures_lignes_c.coefficient,
p_factures_lignes_c.coefficient_mco,
p_factures_lignes_c.rubrique_facturation_id,
p_factures_lignes_c.prestation_id,
p_factures_lignes_c.prix_unitaire,
p_factures_lignes_c.lieu_id,
p_factures_lignes_c.rubrique_comptabilisation_id,
p_factures_lignes_c.compte_produit_id
;
-- Justificatif valorisation
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'Justificatif (facturees debut de mois)';
INSERT INTO activite.p_facture_encours_ligne_valorise_c(
no_facture, facture_id, date_debut, date_fin, lieu_id, nb_rubrique,
nb_prestation, coefficient, coefficient_mco, rubrique_facturation_id,
prestation_id, prix_unitaire, montant_valorise_total, montant_encours, type_ligne_code, mode_calcul_code,
mode_calcul_texte)
SELECT
p_factures_encours.no_facture,
p_factures_encours.oid AS facture_id,
MIN(p_factures_lignes_c.date_debut),
MAX(p_factures_lignes_c.date_fin),
CASE WHEN t_prestations.code LIKE 'GHS%' THEN p_sejours.lieu_sortie_id ELSE p_factures_lignes_c.lieu_id END,
SUM(p_factures_lignes_c.nb_rubrique),
SUM(p_factures_lignes_c.nb_prestation),
p_factures_lignes_c.coefficient,
p_factures_lignes_c.coefficient_mco,
p_factures_lignes_c.rubrique_facturation_id,
p_factures_lignes_c.prestation_id,
p_factures_lignes_c.prix_unitaire,
SUM(p_factures_lignes_c.montant_comptabilise),
SUM(p_factures_lignes_c.montant_comptabilise),
CASE
WHEN t_prestations.code = 'GHS' AND p_sejours.ghs_id > 0 THEN 'GHS'
WHEN t_prestations.code = 'GHS' AND p_sejours.ghs_id <= 0 THEN 'GHSNG'
WHEN t_prestations.code = 'EXH' AND p_sejours.ghs_id > 0 THEN 'EXH'
WHEN t_prestations.code = 'EXH' AND p_sejours.ghs_id <= 0 THEN 'EXHNG'
WHEN t_prestations.code = 'PJ' OR type_valorisation_non_facture = 'PJ' THEN 'PJ'
WHEN t_prestations.code = 'GMT' OR type_valorisation_non_facture = 'GMT' THEN 'GMT'
WHEN t_prestations.code = 'FJ' THEN 'FJ'
WHEN t_prestations.code = 'PMS' THEN 'PMS'
WHEN t_prestations.code = 'ENT' OR type_valorisation_non_facture = 'ENT' THEN 'ENT'
WHEN t_prestations.code IN ('SRC','STF','REA') THEN 'SSS'
WHEN t_prestations.code IN ('NN1','NN2','NN3') THEN 'NNX'
WHEN t_prestations.code IN ('FJA') THEN 'FJA'
WHEN t_prestations.code IN ('CPC') OR type_valorisation_non_facture = 'CP' THEN 'CPC'
WHEN t_prestations.code LIKE 'ATU' THEN 'ATU'
WHEN t_prestations.code LIKE 'FPU' THEN 'ATU'
WHEN t_prestations.code LIKE 'SE%' THEN 'SEH'
ELSE '' END AS type_ligne,
CASE
WHEN p_factures_encours.no_facture LIKE '%.EV%' AND p_factures_encours.code_sorti = '1' THEN 'FROMJVTSOR'
WHEN p_factures_encours.no_facture LIKE '%.EV%' AND p_factures_encours.code_sorti <> '1' THEN 'FROMJVTPRE'
ELSE 'NOJUSTIF'::text END AS mode_calcul_code,
CASE
WHEN p_factures_encours.no_facture LIKE '%.EV%' AND p_factures_encours.code_sorti = '1' THEN 'Encours depuis facturation (sorti)'
WHEN p_factures_encours.no_facture LIKE '%.EV%' AND p_factures_encours.code_sorti <> '1' THEN 'Encours depuis facturation (présent)'
ELSE 'Sans justificatif de valorisation'::text END AS mode_calcul_texte
FROM activite.p_factures
JOIN activite.p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
JOIN w_cti_encours_calcul_parametres ON 1=1
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
JOIN activite.p_factures_encours ON (p_factures.no_facture || '.EV' || substr(to_char(date_part('year', w_cti_encours_calcul_parametres.date_encours),'FM0000'),3,2) || to_char(date_part('month', w_cti_encours_calcul_parametres.date_encours),'FM00')) = p_factures_encours.no_facture
WHERE date_trunc('month',p_factures.date_fin) <= date_trunc('month',w_cti_encours_calcul_parametres.date_encours) AND
p_factures.code_facture >= '1' AND
date_trunc('month',p_factures.date_vente) > date_trunc('month',w_cti_encours_calcul_parametres.date_encours) AND
p_factures.no_facture NOT LIKE '%BG' AND
p_factures_lignes_c.montant_comptabilise <> 0
GROUP BY 1,2,5,8,9,10,11,12,15,16,17
;
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'Entetes (facturees debut de mois a cheval)';
-- Ajout encours
INSERT INTO activite.p_factures_encours(
sejour_id,
no_sejour,
no_facture,
no_facture_reference,
date_debut,
date_fin,
code_origine,
code_sorti,
date_encours,
date_calcul,
tiers_payant_1_id,
tiers_payant_2_id,
tiers_payant_22_id,
tiers_payant_0_id,
ghs_id,
ghs_bebe1_id,
ghs_bebe2_id,
ghs_bebe3_id,
code_cp_demandee,
montant_encours_c,
montant_encours_0_c,
montant_encours_1_c,
montant_encours_2_c,
montant_encours_22_c,
montant_encours_h,
montant_encours_0_h,
montant_encours_1_h,
montant_encours_2_h,
montant_encours_22_h,
date_entree,
heure_entree,
date_sortie,
heure_sortie,
type_sejour,
lieu_sortie_id,
date_groupage,
provider_id,
ghm_id,
filiere_soin_principale_id
)
SELECT
p_factures.sejour_id,
p_factures.no_sejour,
p_factures.no_facture || '.EV' || substr(to_char(date_part('year', w_cti_encours_calcul_parametres.date_encours),'FM0000'),3,2) || to_char(date_part('month', w_cti_encours_calcul_parametres.date_encours),'FM00') AS no_facture_encours,
p_factures.no_facture_reference,
p_factures.date_debut,
p_factures.date_fin,
'C' AS code_origine,
CASE
WHEN p_sejours.code_sorti = '1' AND p_sejours.type_sejour <> '3' AND date_trunc('month',p_sejours.date_sortie) <= date_trunc('month',w_cti_encours_calcul_parametres.date_encours) THEN '1'
WHEN p_sejours.type_sejour = '3' THEN '1'
ELSE '0' END AS code_sorti,
w_cti_encours_calcul_parametres.date_encours AS date_encours,
w_NOW AS date_calcul,
p_factures.tiers_payant_1_id,
p_factures.tiers_payant_2_id,
0 AS tiers_payant_22_id,
p_factures.tiers_payant_0_id,
p_factures.ghs_id,
p_factures.ghs_bebe1_id,
p_factures.ghs_bebe2_id,
p_factures.ghs_bebe3_id,
p_factures.code_cp_demandee,
SUM(p_factures_lignes_c.montant_comptabilise) AS montant_encours_c,
SUM(p_factures_lignes_c.montant_comptabilise_0) AS montant_encours_0_c,
SUM(p_factures_lignes_c.montant_comptabilise_1) AS montant_encours_1_c,
SUM(p_factures_lignes_c.montant_comptabilise_2) AS montant_encours_2_c,
0 AS montant_encours_22_c,
0 AS montant_encours_h,
0 AS montant_encours_0_h,
0 AS montant_encours_1_h,
0 AS montant_encours_2_h,
0 AS montant_encours_22_h,
p_sejours.date_entree,
p_sejours.heure_entree,
p_sejours.date_sortie,
p_sejours.heure_sortie,
p_sejours.type_sejour,
p_sejours.lieu_sortie_id,
p_sejours.date_groupage,
p_sejours.provider_id,
p_sejours.ghm_id,
p_sejours.filiere_soin_principale_id
FROM activite.p_factures
JOIN activite.p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
JOIN w_cti_encours_calcul_parametres ON 1=1
JOIN activite.p_factures_lignes_c ON p_factures.no_facture = p_factures_lignes_c.no_facture
WHERE date_trunc('month',p_factures.date_debut) <= date_trunc('month',w_cti_encours_calcul_parametres.date_encours) AND
date_trunc('month',p_factures.date_fin) > date_trunc('month',w_cti_encours_calcul_parametres.date_encours) AND
date_trunc('month',p_factures_lignes_c.date_debut) <= date_trunc('month',w_cti_encours_calcul_parametres.date_encours) AND
p_factures.code_facture >= '1' AND
date_trunc('month',p_factures.date_vente) > date_trunc('month',w_cti_encours_calcul_parametres.date_encours) AND
p_factures.no_facture NOT LIKE '%BG' AND
p_factures_lignes_c.montant_comptabilise <> 0
GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,30,31,32,33,34,35,36,37,38,39
;
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'Lignes (facturees debut de mois a cheval)';
INSERT INTO activite.p_factures_encours_lignes_c(
facture_id,
no_facture,
date_debut,
date_fin,
nb_rubrique,
coefficient,
coefficient_mco,
rubrique_facturation_id,
prestation_id,
prix_unitaire,
lieu_id,
nb_prestation,
rubrique_comptabilisation_id,
compte_produit_id,
montant_encours,
montant_encours_0,
montant_encours_1,
montant_encours_2,
montant_encours_22
)
SELECT
p_factures_encours.oid AS facture_id,
p_factures_encours.no_facture AS no_facture_encours,
MIN(p_factures_lignes_c.date_debut),
MAX(p_factures_lignes_c.date_fin),
SUM(p_factures_lignes_c.nb_rubrique),
p_factures_lignes_c.coefficient,
p_factures_lignes_c.coefficient_mco,
p_factures_lignes_c.rubrique_facturation_id,
p_factures_lignes_c.prestation_id,
p_factures_lignes_c.prix_unitaire,
p_factures_lignes_c.lieu_id,
SUM(p_factures_lignes_c.nb_prestation),
p_factures_lignes_c.rubrique_comptabilisation_id,
p_factures_lignes_c.compte_produit_id,
SUM(p_factures_lignes_c.montant_comptabilise),
SUM(p_factures_lignes_c.montant_comptabilise_0),
SUM(p_factures_lignes_c.montant_comptabilise_1),
SUM(p_factures_lignes_c.montant_comptabilise_2),
SUM(p_factures_lignes_c.montant_comptabilise_22)
FROM activite.p_factures
JOIN activite.p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
JOIN w_cti_encours_calcul_parametres ON 1=1
JOIN activite.p_factures_lignes_c ON p_factures.no_facture = p_factures_lignes_c.no_facture
JOIN activite.p_factures_encours ON (p_factures.no_facture || '.EV' || substr(to_char(date_part('year', w_cti_encours_calcul_parametres.date_encours),'FM0000'),3,2) || to_char(date_part('month', w_cti_encours_calcul_parametres.date_encours),'FM00')) = p_factures_encours.no_facture
WHERE date_trunc('month',p_factures.date_debut) <= date_trunc('month',w_cti_encours_calcul_parametres.date_encours) AND
date_trunc('month',p_factures.date_fin) > date_trunc('month',w_cti_encours_calcul_parametres.date_encours) AND
date_trunc('month',p_factures_lignes_c.date_debut) <= date_trunc('month',w_cti_encours_calcul_parametres.date_encours) AND
p_factures.code_facture >= '1' AND
date_trunc('month',p_factures.date_vente) > date_trunc('month',w_cti_encours_calcul_parametres.date_encours) AND
p_factures.no_facture NOT LIKE '%BG' AND
p_factures_lignes_c.montant_comptabilise <> 0
GROUP BY
p_factures_encours.oid,
p_factures_encours.no_facture,
date_trunc('month',p_factures_lignes_c.date_fin),
p_factures_lignes_c.coefficient,
p_factures_lignes_c.coefficient_mco,
p_factures_lignes_c.rubrique_facturation_id,
p_factures_lignes_c.prestation_id,
p_factures_lignes_c.prix_unitaire,
p_factures_lignes_c.lieu_id,
p_factures_lignes_c.rubrique_comptabilisation_id,
p_factures_lignes_c.compte_produit_id
;
-- Justificatif valorisation
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'Justificatif (facturees debut de mois a cheval)';
INSERT INTO activite.p_facture_encours_ligne_valorise_c(
no_facture, facture_id, date_debut, date_fin, lieu_id, nb_rubrique,
nb_prestation, coefficient, coefficient_mco, rubrique_facturation_id,
prestation_id, prix_unitaire, montant_valorise_total, montant_encours, type_ligne_code, mode_calcul_code,
mode_calcul_texte)
SELECT
p_factures_encours.no_facture,
p_factures_encours.oid AS facture_id,
MIN(p_factures_lignes_c.date_debut),
MAX(p_factures_lignes_c.date_fin),
CASE WHEN t_prestations.code LIKE 'GHS%' THEN p_sejours.lieu_sortie_id ELSE p_factures_lignes_c.lieu_id END,
SUM(p_factures_lignes_c.nb_rubrique),
SUM(p_factures_lignes_c.nb_prestation),
p_factures_lignes_c.coefficient,
p_factures_lignes_c.coefficient_mco,
p_factures_lignes_c.rubrique_facturation_id,
p_factures_lignes_c.prestation_id,
p_factures_lignes_c.prix_unitaire,
SUM(p_factures_lignes_c.montant_comptabilise),
SUM(CASE WHEN date_trunc('month',p_factures_lignes_c.date_debut) <= date_trunc('month',w_cti_encours_calcul_parametres.date_encours) THEN p_factures_lignes_c.montant_comptabilise ELSE 0 END),
CASE
WHEN t_prestations.code = 'GHS' AND p_sejours.ghs_id > 0 THEN 'GHS'
WHEN t_prestations.code = 'GHS' AND p_sejours.ghs_id <= 0 THEN 'GHSNG'
WHEN t_prestations.code = 'EXH' AND p_sejours.ghs_id > 0 THEN 'EXH'
WHEN t_prestations.code = 'EXH' AND p_sejours.ghs_id <= 0 THEN 'EXHNG'
WHEN t_prestations.code = 'PJ' OR type_valorisation_non_facture = 'PJ' THEN 'PJ'
WHEN t_prestations.code = 'GMT' OR type_valorisation_non_facture = 'GMT' THEN 'GMT'
WHEN t_prestations.code = 'FJ' THEN 'FJ'
WHEN t_prestations.code = 'PMS' THEN 'PMS'
WHEN t_prestations.code = 'ENT' OR type_valorisation_non_facture = 'ENT' THEN 'ENT'
WHEN t_prestations.code IN ('SRC','STF','REA') THEN 'SSS'
WHEN t_prestations.code IN ('NN1','NN2','NN3') THEN 'NNX'
WHEN t_prestations.code IN ('FJA') THEN 'FJA'
WHEN t_prestations.code IN ('CPC') OR type_valorisation_non_facture = 'CP' THEN 'CPC'
WHEN t_prestations.code LIKE 'ATU' THEN 'ATU'
WHEN t_prestations.code LIKE 'FPU' THEN 'ATU'
WHEN t_prestations.code LIKE 'SE%' THEN 'SEH'
ELSE '' END AS type_ligne,
CASE
WHEN p_factures_encours.no_facture LIKE '%.EV%' AND p_factures_encours.code_sorti = '1' THEN 'FROMJVTSOR'
WHEN p_factures_encours.no_facture LIKE '%.EV%' AND p_factures_encours.code_sorti <> '1' THEN 'FROMJVTPRE'
ELSE 'NOJUSTIF'::text END AS mode_calcul_code,
CASE
WHEN p_factures_encours.no_facture LIKE '%.EV%' AND p_factures_encours.code_sorti = '1' THEN 'Encours depuis facturation (sorti)'
WHEN p_factures_encours.no_facture LIKE '%.EV%' AND p_factures_encours.code_sorti <> '1' THEN 'Encours depuis facturation (présent)'
ELSE 'Sans justificatif de valorisation'::text END AS mode_calcul_texte
FROM activite.p_factures
JOIN activite.p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
JOIN w_cti_encours_calcul_parametres ON 1=1
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
JOIN activite.p_factures_encours ON (p_factures.no_facture || '.EV' || substr(to_char(date_part('year', w_cti_encours_calcul_parametres.date_encours),'FM0000'),3,2) || to_char(date_part('month', w_cti_encours_calcul_parametres.date_encours),'FM00')) = p_factures_encours.no_facture
WHERE date_trunc('month',p_factures.date_debut) <= date_trunc('month',w_cti_encours_calcul_parametres.date_encours) AND
date_trunc('month',p_factures.date_fin) > date_trunc('month',w_cti_encours_calcul_parametres.date_encours) AND
p_factures.code_facture >= '1' AND
date_trunc('month',p_factures.date_vente) > date_trunc('month',w_cti_encours_calcul_parametres.date_encours) AND
p_factures.no_facture NOT LIKE '%BG' AND
p_factures_lignes_c.montant_comptabilise <> 0
GROUP BY 1,2,5,8,9,10,11,12,15,16,17
;
END IF;
END IF;
END LOOP;
-- Moulinettes sur encours déjà calculés
IF EXISTS (SELECT valeur FROM activite.t_divers WHERE code = 'ENCOURSACTIVE' AND valeur = '1') THEN
-- Réactualisation oid séjour
UPDATE activite.p_factures_encours
SET no_sejour = p_factures.no_sejour
FROM activite.p_factures
WHERE code_origine = 'C' AND
p_factures_encours.no_facture_reference = p_factures.no_facture AND
(p_factures_encours.no_sejour = '' OR p_factures_encours.no_sejour IS NULL);
UPDATE activite.p_factures_encours
SET no_sejour = p_sejours.no_sejour
FROM activite.p_sejours
WHERE code_origine = 'C' AND
split_part(p_factures_encours.no_facture,'.',1) = 'E' || p_sejours.no_sejour AND
(p_factures_encours.no_sejour = '' OR p_factures_encours.no_sejour IS NULL);
UPDATE activite.p_factures_encours
SET no_sejour = p_sejours.no_sejour
FROM activite.p_sejours
WHERE code_origine = 'C' AND
split_part(p_factures_encours.no_facture,'.',1) = p_sejours.no_sejour AND
(p_factures_encours.no_sejour = '' OR p_factures_encours.no_sejour IS NULL);
UPDATE activite.p_factures_encours
SET sejour_id = p_sejours.oid
FROM activite.p_sejours
WHERE p_factures_encours.no_sejour = p_sejours.no_sejour AND
sejour_id IS DISTINCT FROM p_sejours.oid;
UPDATE activite.p_factures_encours
SET no_sejour = split_part(p_factures_encours.no_facture,'.',1), sejour_id = 0
WHERE p_factures_encours.no_sejour IS NULL OR p_factures_encours.no_sejour = '';
UPDATE activite.p_factures_encours
SET sejour_id = 0
WHERE no_sejour NOT IN (SELECT no_sejour FROM activite.p_sejours) AND
sejour_id <> 0;
UPDATE activite.p_factures_encours
SET lieu_sortie_id = p_sejours.lieu_sortie_id
FROM activite.p_sejours
WHERE p_sejours.no_sejour = p_factures_encours.no_sejour AND
p_sejours.lieu_sortie_id <> p_factures_encours.lieu_sortie_id
;
-- Ajout factures du mois comptabilisées en début de mois suivant (avant date cloture encours)
RAISE NOTICE '%. %' , w_date_encours_YYMM, 'Ajout factures comptabilisee debut du mois suivant';
IF NOT EXISTS (SELECT * FROM pg_class WHERE relnamespace = pg_my_temp_schema() AND relname = 'w_cti_encours_vente') THEN
CREATE TEMP TABLE w_cti_encours_vente
(
no_sejour text,
date_encours date,
no_facture text,
no_facture_encours text
);
END IF;
TRUNCATE w_cti_encours_vente;
INSERT INTO w_cti_encours_vente
SELECT p_factures.no_sejour,
date(date_trunc('month', p_factures.date_fin) + interval '1 month' - interval '1 day') AS date_encours,
(MAX(ARRAY[p_factures.date_vente::text, p_factures.no_facture]))[2] AS no_facture,
(MAX(ARRAY[p_factures.date_vente::text, p_factures.no_facture]))[2] || '.EV' || to_char(p_factures.date_fin,'YYMM') AS no_facture_encours
FROM activite.p_factures
JOIN (SELECT
COALESCE(
MAX(CASE WHEN no_facture LIKE '%.EV%' THEN date(date_encours+interval '1 day') ELSE NULL END),
MIN(date(date_trunc('month',date_encours)))
) AS date_encours_debut,
MAX(date_encours) AS date_encours_fin
FROM activite.p_factures_encours
WHERE date_encours >= '20140101' AND
code_origine = 'C') w_periode_encours ON 1=1
JOIN activite.t_divers ON t_divers.code = 'DATEENCOURS'
LEFT JOIN activite.p_factures p_factures_vente ON
p_factures_vente.no_sejour = p_factures.no_sejour AND
p_factures_vente.date_vente BETWEEN date_trunc('month', p_factures.date_fin) AND date_trunc('month', p_factures.date_fin) + interval '1 month' - interval '1 day'
LEFT JOIN activite.p_factures_encours ON
p_factures_encours.no_sejour = p_factures.no_sejour AND
code_origine = 'C' AND
p_factures_encours.date_encours BETWEEN date_trunc('month', p_factures.date_fin) AND date_trunc('month', p_factures.date_fin) + interval '1 month' - interval '1 day'
WHERE p_factures.date_fin BETWEEN date_encours_debut AND date_encours_fin AND
p_factures.date_vente BETWEEN date_trunc('month', p_factures.date_fin) + interval '1 month' - interval '1 day' AND date_trunc('month', p_factures.date_fin) + interval '1 month' - interval '1 day' + (t_divers.valeur||' day')::INTERVAL AND
p_factures.montant_facture_c > 0 AND
p_factures.no_facture NOT LIKE '%BG' AND
p_factures.code_vente = '1' AND
p_factures_vente.no_facture IS NULL AND
p_factures_encours.no_facture IS NULL
GROUP BY 1,2,to_char(p_factures.date_fin,'YYMM')
ORDER BY 1,2
;
INSERT INTO activite.p_factures_encours(
sejour_id,
no_sejour,
no_facture,
no_facture_reference,
date_debut,
date_fin,
code_origine,
code_sorti,
date_encours,
tiers_payant_1_id,
tiers_payant_2_id,
tiers_payant_22_id,
tiers_payant_0_id,
ghs_id,
ghs_bebe1_id,
ghs_bebe2_id,
ghs_bebe3_id,
code_cp_demandee,
montant_encours_c,
montant_encours_0_c,
montant_encours_1_c,
montant_encours_2_c,
montant_encours_22_c,
montant_encours_h,
montant_encours_0_h,
montant_encours_1_h,
montant_encours_2_h,
montant_encours_22_h,
date_entree,
heure_entree,
date_sortie,
heure_sortie,
type_sejour,
lieu_sortie_id,
date_groupage,
provider_id,
ghm_id,
filiere_soin_principale_id
)
SELECT
p_sejours.oid,
p_sejours.no_sejour,
w_cti_encours_vente.no_facture_encours,
p_factures.no_facture_reference,
p_factures.date_debut,
p_factures.date_fin,
'C' AS code_origine,
'1' AS code_sorti,
w_cti_encours_vente.date_encours AS date_encours,
p_factures.tiers_payant_1_id,
p_factures.tiers_payant_2_id,
0 AS tiers_payant_22_id,
p_factures.tiers_payant_0_id,
p_factures.ghs_id,
p_factures.ghs_bebe1_id,
p_factures.ghs_bebe2_id,
p_factures.ghs_bebe3_id,
p_factures.code_cp_demandee,
p_factures.montant_facture_c,
p_factures.montant_facture_0_c,
p_factures.montant_facture_1_c,
p_factures.montant_facture_2_c,
0 AS montant_encours_22_c,
0 AS montant_encours_h,
0 AS montant_encours_0_h,
0 AS montant_encours_1_h,
0 AS montant_encours_2_h,
0 AS montant_encours_22_h,
p_sejours.date_entree,
p_sejours.heure_entree,
p_sejours.date_sortie,
p_sejours.heure_sortie,
p_sejours.type_sejour,
p_sejours.lieu_sortie_id,
p_sejours.date_groupage,
p_sejours.provider_id,
p_sejours.ghm_id,
p_sejours.filiere_soin_principale_id
FROM w_cti_encours_vente
JOIN activite.p_factures ON w_cti_encours_vente.no_facture = p_factures.no_facture
JOIN activite.p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
;
INSERT INTO activite.p_factures_encours_lignes_c(
facture_id,
no_facture,
date_debut,
date_fin,
nb_rubrique,
coefficient,
coefficient_mco,
rubrique_facturation_id,
prestation_id,
prix_unitaire,
lieu_id,
nb_prestation,
rubrique_comptabilisation_id,
compte_produit_id,
montant_encours,
montant_encours_0,
montant_encours_1,
montant_encours_2,
montant_encours_22
)
SELECT
p_factures_encours.oid AS facture_id,
w_cti_encours_vente.no_facture_encours,
MIN(p_factures_lignes_c.date_debut),
MAX(p_factures_lignes_c.date_fin),
SUM(p_factures_lignes_c.nb_rubrique),
p_factures_lignes_c.coefficient,
p_factures_lignes_c.coefficient_mco,
p_factures_lignes_c.rubrique_facturation_id,
p_factures_lignes_c.prestation_id,
p_factures_lignes_c.prix_unitaire,
p_factures_lignes_c.lieu_id,
SUM(p_factures_lignes_c.nb_prestation),
p_factures_lignes_c.rubrique_comptabilisation_id,
p_factures_lignes_c.compte_produit_id,
SUM(p_factures_lignes_c.montant_facture),
SUM(p_factures_lignes_c.montant_facture_0),
SUM(p_factures_lignes_c.montant_facture_1),
SUM(p_factures_lignes_c.montant_facture_2),
SUM(p_factures_lignes_c.montant_facture_22)
FROM w_cti_encours_vente
JOIN activite.p_factures ON w_cti_encours_vente.no_facture = p_factures.no_facture
JOIN activite.p_factures_lignes_c ON p_factures.no_facture = p_factures_lignes_c.no_facture
JOIN activite.p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
JOIN activite.p_factures_encours ON w_cti_encours_vente.no_facture_encours = p_factures_encours.no_facture
WHERE p_factures_lignes_c.montant_facture <> 0 AND
p_factures_lignes_c.date_debut <= w_cti_encours_vente.date_encours AND
p_factures_lignes_c.rubrique_facturation_id IS NOT NULL
GROUP BY
p_factures_encours.oid,
w_cti_encours_vente.no_facture_encours,
p_factures_lignes_c.coefficient,
p_factures_lignes_c.coefficient_mco,
p_factures_lignes_c.rubrique_facturation_id,
p_factures_lignes_c.prestation_id,
p_factures_lignes_c.prix_unitaire,
p_factures_lignes_c.lieu_id,
p_factures_lignes_c.rubrique_comptabilisation_id,
p_factures_lignes_c.compte_produit_id
;
END IF;
-- désactivation index
RAISE NOTICE '%' , 'Finalisation. Reactivation index';
PERFORM base.cti_enable_index('activite', 'i_factures_encours_2');
PERFORM base.cti_enable_index('activite', 'i_factures_encours_4');
PERFORM base.cti_enable_index('activite', 'i_factures_encours_5');
PERFORM base.cti_enable_index('activite', 'i_factures_encours_6');
PERFORM base.cti_enable_index('activite', 'i_factures_encours_7');
PERFORM base.cti_enable_index('activite', 'i_factures_encours_8');
PERFORM base.cti_enable_index('activite', 'i_factures_encours_9');
PERFORM base.cti_enable_index('activite', 'i_factures_encours_10');
PERFORM base.cti_enable_index('activite', 'i_factures_encours_11');
PERFORM base.cti_enable_index('activite', 'i_factures_encours_lignes_c_2');
PERFORM base.cti_enable_index('activite', 'i_factures_encours_lignes_c_3');
PERFORM base.cti_enable_index('activite', 'i_factures_encours_lignes_c_4');
PERFORM base.cti_enable_index('activite', 'i_factures_encours_lignes_c_5');
PERFORM base.cti_enable_index('activite', 'i_factures_encours_lignes_c_6');
PERFORM base.cti_enable_index('activite', 'i_factures_encours_lignes_c_7');
PERFORM base.cti_enable_index('activite', 'i_factures_encours_lignes_c_8');
-- Reconstitution LPP et UCD sur encours
IF EXISTS (SELECT valeur FROM activite.t_divers WHERE code = 'ENCOURSACTIVE' AND valeur = '1') THEN
UPDATE activite.p_factures_encours_lignes_c
SET lpp_id = subview.lpp_id, ucd_id = subview.ucd_id
FROM activite.p_factures_encours,
(
SELECT p_factures.no_sejour,
prestation_id,
ABS(montant_facture + montant_encours) AS montant,
COUNT(DISTINCT lpp_id::text||ucd_id::text),
MAX(lpp_id) AS lpp_id,
MAX(ucd_id) AS ucd_id
FROM activite.p_factures_lignes_c
JOIN activite.p_factures ON p_factures_lignes_c.no_facture = p_factures.no_facture
WHERE (montant_facture <> 0 OR montant_encours <> 0) AND
(ucd_id <> 0 OR lpp_id <> 0)
GROUP BY 1,2,3
) subview
WHERE p_factures_encours.no_facture = p_factures_encours_lignes_c.no_facture AND
p_factures_encours.no_sejour = subview.no_sejour AND
p_factures_encours_lignes_c.prestation_id = subview.prestation_id AND
p_factures_encours_lignes_c.montant_encours = subview.montant AND
COALESCE(p_factures_encours_lignes_c.lpp_id,0) = 0 AND
COALESCE(p_factures_encours_lignes_c.ucd_id,0) = 0
;
UPDATE activite.p_facture_encours_ligne_valorise_c
SET lpp_id = subview.lpp_id, ucd_id = subview.ucd_id
FROM (
SELECT p_factures_encours_lignes_c.no_facture,
prestation_id,
ABS(montant_encours) AS montant,
COUNT(DISTINCT lpp_id::text||ucd_id::text),
MAX(lpp_id) AS lpp_id,
MAX(ucd_id) AS ucd_id
FROM activite.p_factures_encours_lignes_c
WHERE montant_encours <> 0 AND
(ucd_id <> 0 OR lpp_id <> 0)
GROUP BY 1,2,3
) subview
WHERE p_facture_encours_ligne_valorise_c.no_facture = subview.no_facture AND
p_facture_encours_ligne_valorise_c.prestation_id = subview.prestation_id AND
p_facture_encours_ligne_valorise_c.montant_encours = subview.montant AND
COALESCE(p_facture_encours_ligne_valorise_c.lpp_id,0) = 0 AND
COALESCE(p_facture_encours_ligne_valorise_c.ucd_id,0) = 0
;
END IF;
-- Récupérer le bon compte sur les ventes (WEB100T) car quelque fois, le compte des ventes est provisoire (02020000) au moment des en cours
IF EXISTS (SELECT valeur FROM activite.t_divers WHERE code = 'ENCOURSACTIVE' AND valeur = '1') THEN
IF (SELECT count(*) FROM activite.p_factures_encours_lignes_c JOIN activite.t_compte ON compte_produit_id = t_compte.oid WHERE t_compte.code LIKE '02%') > 0 THEN
UPDATE activite.p_factures_encours_lignes_c
SET compte_produit_id = subview.compte_produit_id
FROM
(
SELECT p_factures_encours_lignes_c.no_facture, p_factures_encours_lignes_c.rubrique_facturation_id, p_factures_encours_lignes_c.CTID AS toCTID, MAX(subview.compte_produit_id) AS compte_produit_id
FROM activite.p_factures_encours_lignes_c
JOIN activite.t_compte ON compte_produit_id = t_compte.oid
JOIN (SELECT no_facture, rubrique_facturation_id, MAX(compte_produit_id) AS compte_produit_id FROM activite.p_factures_lignes_c GROUP BY 1,2) subview ON
subview.no_facture = split_part(p_factures_encours_lignes_c.no_facture,'.EV',1) AND
subview.rubrique_facturation_id = p_factures_encours_lignes_c.rubrique_facturation_id
WHERE p_factures_encours_lignes_c.no_facture LIKE '%EV%' AND
t_compte.code LIKE '02%'
GROUP BY 1,2,3
) subview
WHERE subview.no_facture = p_factures_encours_lignes_c.no_facture AND
subview.rubrique_facturation_id = p_factures_encours_lignes_c.rubrique_facturation_id AND
p_factures_encours_lignes_c.CTID = toCTID
;
END IF;
END IF;
-- Initialiser les filieres de soin anterieurs a partir de la valeur courante
IF EXISTS (SELECT valeur FROM activite.t_divers WHERE code = 'ENCOURSACTIVE' AND valeur = '1') THEN
UPDATE activite.p_factures_encours
SET filiere_soin_principale_id = p_sejours.filiere_soin_principale_id
FROM activite.p_sejours
WHERE p_factures_encours.no_sejour = p_sejours.no_sejour AND
p_factures_encours.filiere_soin_principale_id = 0 AND
p_sejours.filiere_soin_principale_id <> 0
;
END IF;
RETURN 'OK' ;
END;