0
LEFT JOIN base.t_ghm ON ghm_code = t_ghm.code
LEFT JOIN base.t_ghs ON ghs_code = t_ghs.code
LEFT JOIN base.t_codes_postaux ON w_ASSURES.CP = t_codes_postaux.code
WHERE OK = 'O'
;
SELECT base.cti_disable_index('activite[PX]', 'i_sejours_2');
SELECT base.cti_disable_index('activite[PX]', 'i_sejours_3');
SELECT base.cti_disable_index('activite[PX]', 'i_sejours_4');
SELECT base.cti_disable_index('activite[PX]', 'i_sejours_5');
SELECT base.cti_disable_index('activite[PX]', 'i_sejours_6');
SELECT base.cti_disable_index('activite[PX]', 'i_sejours_7');
SELECT base.cti_disable_index('activite[PX]', 'i_sejours_8');
SELECT base.cti_disable_index('activite[PX]', 'i_sejours_9');
SELECT base.cti_disable_index('activite[PX]', 'i_sejours_10');
SELECT base.cti_disable_index('activite[PX]', 'i_sejours_11');
SELECT base.cti_disable_index('activite[PX]', 'i_sejours_12');
SELECT base.cti_disable_index('activite[PX]', 'i_sejours_13');
-- Forcage type selon séjour
UPDATE w_sejours
SET type_sejour = t_sejour.type_sejour::int
FROM activite.t_sejour
WHERE t_sejour.no_sejour = w_sejours.no_sejour AND
t_sejour.type_sejour IN ('1','2','3','4','5','6','9')
AND t_sejour.type_sejour is not NULL ;
INSERT INTO activite[PX].p_sejours (
no_sejour,
code_original,
no_patient,
date_entree,
heure_entree,
date_sortie,
heure_sortie,
code_sexe,
age,
code_sorti,
code_prevu,
type_sejour,
code_postal_id,
medecin_sejour_id,
date_groupage,
code_cp_demandee,
mode_traitement_id,
mode_entree,
provenance,
mode_sortie,
destination,
ghm_id,
ghs_id,
tiers_payant_0_id,
tiers_payant_1_id,
tiers_payant_2_id,
tiers_payant_22_id,
est_budget_global,
finess
)
SELECT
w_sejours.no_sejour,
w_sejours.code_original,
w_sejours.no_patient,
w_sejours.date_entree,
w_sejours.heure_entree,
w_sejours.date_sortie,
w_sejours.heure_sortie,
w_sejours.code_sexe::char(1),
w_sejours.age,
w_sejours.code_sorti,
w_sejours.code_prevu,
w_sejours.type_sejour::char(1),
w_sejours.code_postal_id,
w_sejours.medecin_sejour_id,
w_sejours.date_groupage,
w_sejours.type_sejour::char(1),
w_sejours.mode_traitement_id,
w_sejours.mode_entree::char(1),
w_sejours.provenance::char(1),
w_sejours.mode_sortie::char(1),
w_sejours.destination::char(1),
w_sejours.ghm_id,
w_sejours.ghs_id,
w_sejours.tiers_payant_0_id,
w_sejours.tiers_payant_1_id,
w_sejours.tiers_payant_2_id,
w_sejours.tiers_payant_22_id,
w_sejours.est_budget_global,
w_sejours.finess
FROM w_sejours
;
ANALYSE activite.p_sejours
;
-- Séjours ignorés
UPDATE activite[PX].p_sejours
SET etat = 'I'
FROM activite.t_sejour
WHERE t_sejour.no_sejour = p_sejours.no_sejour AND
est_ignore = '1' AND
etat <> 'I' AND
'[PX]' = '';
-- GHM selon ghs dialyse
UPDATE activite.p_sejours
SET ghm_id = t_ghm.oid
FROM base.t_ghs, base.t_ghm
WHERE ghs_id = t_ghs.oid AND
t_ghm.code = '28Z04Z' AND
p_sejours.ghm_id = 0
;
-- Médecin séjour forcé
UPDATE activite[PX].p_sejours
SET medecin_sejour_id = t_sejour.medecin_sejour_id
FROM activite.t_sejour
WHERE t_sejour.no_sejour = p_sejours.no_sejour AND
t_sejour.medecin_sejour_id <> 0 AND
p_sejours.medecin_sejour_id IS DISTINCT FROM t_sejour.medecin_sejour_id AND
'[PX]' = '';
-- recréation index
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_2');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_3');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_4');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_5');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_6');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_7');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_8');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_9');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_10');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_11');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_12');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_13');
-- assurance
SELECT base.cti_disable_index('activite[PX]', 'i_sejours_assurance_1');
SELECT base.cti_disable_index('activite[PX]', 'i_sejours_assurance_2');
SELECT base.cti_disable_index('activite[PX]', 'i_sejours_assurance_3');
SELECT base.cti_disable_index('activite[PX]', 'i_sejours_assurance_4');
INSERT INTO activite.p_sejours_assurance(
sejour_id,
tiers_payant_0_id,
tiers_payant_1_id,
matricule_1,
tiers_payant_2_id,
matricule_2,
tiers_payant_22_id,
matricule_22)
SELECT
oid AS sejour_id,
p_sejours.tiers_payant_0_id,
p_sejours.tiers_payant_1_id,
NUM_SECU,
p_sejours.tiers_payant_2_id,
'',
p_sejours.tiers_payant_22_id,
''::text AS matricule_22
FROM w_ASSURES
JOIN activite.p_sejours ON code_original = NUM_PAT AND p_sejours.etat = '';
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_assurance_1');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_assurance_2');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_assurance_3');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_assurance_4');
]]>
1
) subview
WHERE w_mouvements_sejour.no_sejour = subview.no_sejour AND
w_mouvements_sejour.date = subview.date AND
w_mouvements_sejour.heure_debut = subview.heure_debut
;
DELETE FROM w_mouvements_sejour
USING (
SELECT
no_sejour, date, heure_debut, MAX(CTID) AS fromCTID
FROM w_mouvements_sejour
GROUP BY 1,2,3
HAVING count(*) > 1) subview
WHERE 1=1
AND subview.no_sejour = w_mouvements_sejour.no_sejour
AND subview.date = w_mouvements_sejour.date
AND subview.heure_debut = w_mouvements_sejour.heure_debut
AND subview.fromCTID != w_mouvements_sejour.CTID;
-- Mise en production des mouvements
SELECT base.cti_disable_index('activite', 'i_mouvements_sejour_1');
SELECT base.cti_disable_index('activite', 'i_mouvements_sejour_2');
SELECT base.cti_disable_index('activite', 'i_mouvements_sejour_3');
SELECT base.cti_disable_index('activite', 'i_mouvements_sejour_4');
SELECT base.cti_disable_index('activite', 'i_mouvements_sejour_5');
INSERT INTO activite.p_mouvements_sejour(
sejour_id, no_sejour, date, est_mouvement_previsionnel, nb_jours_js_non_inclus,
lieu_id, nb_entrees_directes, nb_sorties_directes,
nb_urgences, nb_externes, nb_ambulatoires, medecin_sejour_id,
nb_jours_js_inclus, nb_seances, nb_entrees_mutation_service,
nb_sorties_mutation_service, nb_entrees_mutation_activite, nb_sorties_mutation_activite,
nb_entrees_mutation_etage, nb_sorties_mutation_etage, nb_chambres_particulieres,
heure_debut, heure_fin, est_jour_entree, est_jour_sortie, est_jour_hospitalisation,
est_chambre_particuliere,
nb_entrees_mutation_unite_medicale, nb_sorties_mutation_unite_medicale, nb_bebes,
jour_semaine, is_weekend)
SELECT sejour_id, no_sejour, date, est_mouvement_previsionnel ,nb_jours_js_non_inclus,
lieu_id, nb_entrees_directes, nb_sorties_directes,
nb_urgences, nb_externes, nb_ambulatoires, medecin_sejour_id,
nb_jours_js_inclus, nb_seances, nb_entrees_mutation_service,
nb_sorties_mutation_service, nb_entrees_mutation_activite, nb_sorties_mutation_activite,
nb_entrees_mutation_etage, nb_sorties_mutation_etage, nb_chambres_particulieres,
heure_debut, heure_fin, est_jour_entree, est_jour_sortie, est_jour_hospitalisation,
est_chambre_particuliere,
nb_entrees_mutation_unite_medicale, nb_sorties_mutation_unite_medicale, nb_bebes,
jour_semaine, is_weekend
FROM w_mouvements_sejour
WHERE heure_fin >= heure_debut
ORDER BY no_sejour;
SELECT base.cti_enable_index('activite', 'i_mouvements_sejour_1');
SELECT base.cti_enable_index('activite', 'i_mouvements_sejour_2');
SELECT base.cti_enable_index('activite', 'i_mouvements_sejour_3');
SELECT base.cti_enable_index('activite', 'i_mouvements_sejour_4');
SELECT base.cti_enable_index('activite', 'i_mouvements_sejour_5');
ANALYSE activite.p_mouvements_sejour
;
-- Ajout des séances non rapportées par la facturation selon la présence par jour des 28 derniers jours
DROP TABLE IF EXISTS w_sejours_seances;
CREATE TEMP TABLE w_sejours_seances AS
SELECT p_mouvements_sejour.no_sejour,
date_part('dow',date) AS jour_semaine,
(MAX(ARRAY[date::text,lieu_id::text]))[2]::bigint AS lieu_id,
date(MAX(date_max + interval '1 day')) AS date_first, count(*), max(date_max)
FROM activite.p_mouvements_sejour
JOIN (
SELECT p_mouvements_sejour.no_sejour, MAX(date) AS date_max
FROM activite.p_mouvements_sejour
JOIN activite.p_sejours ON p_mouvements_sejour.no_sejour = p_sejours.no_sejour
WHERE nb_seances > 0 AND code_sorti = 0
GROUP BY 1
) subview ON
p_mouvements_sejour.no_sejour = subview.no_sejour AND
p_mouvements_sejour.date > date(date_max - interval '28 days')
WHERE nb_seances > 0
GROUP BY 1,2
HAVING count(*) >= 3
ORDER BY 1,2,3
;
ANALYSE w_sejours_seances
;
UPDATE w_sejours_seances
SET jour_semaine = 7
WHERE jour_semaine = 0
;
INSERT INTO activite.p_mouvements_sejour(
sejour_id, no_sejour, date, est_mouvement_previsionnel, nb_jours_js_non_inclus,
lieu_id, nb_entrees_directes, nb_sorties_directes,
nb_urgences, nb_externes, nb_ambulatoires, medecin_sejour_id,
nb_jours_js_inclus, nb_seances, nb_entrees_mutation_service,
nb_sorties_mutation_service, nb_entrees_mutation_activite, nb_sorties_mutation_activite,
nb_entrees_mutation_etage, nb_sorties_mutation_etage, nb_chambres_particulieres,
heure_debut, heure_fin, est_jour_entree, est_jour_sortie, est_jour_hospitalisation,
est_chambre_particuliere,
nb_entrees_mutation_unite_medicale, nb_sorties_mutation_unite_medicale, nb_bebes,
jour_semaine, is_weekend)
SELECT p_sejours.oid AS sejour_id,
w_sejours_seances.no_sejour,
p_calendrier.date,
'0' AS est_mouvement_previsionnel ,
0 AS nb_jours_js_non_inclus,
w_sejours_seances.lieu_id,
0 AS nb_entrees_directes,
0 AS nb_sorties_directes,
0 AS nb_urgences,
0 AS nb_externes,
0 AS nb_ambulatoires,
p_sejours.medecin_sejour_id,
0 AS nb_jours_js_inclus,
1 AS nb_seances,
0 AS nb_entrees_mutation_service,
0 AS nb_sorties_mutation_service,
0 AS nb_entrees_mutation_activite,
0 AS nb_sorties_mutation_activite,
0 AS nb_entrees_mutation_etage,
0 AS nb_sorties_mutation_etage,
0 AS nb_chambres_particulieres,
080000 AS heure_debut,
180000 AS heure_fin,
'0' AS est_jour_entree,
'0' AS est_jour_sortie,
'0' AS est_jour_hospitalisation,
'0' AS est_chambre_particuliere,
0 AS nb_entrees_mutation_unite_medicale,
0 AS nb_sorties_mutation_unite_medicale,
0 AS nb_bebes,
p_calendrier.jour_semaine,
p_calendrier.is_weekend
FROM w_sejours_seances
JOIN activite.p_sejours ON w_sejours_seances.no_sejour = p_sejours.no_sejour
JOIN base.p_calendrier ON
p_calendrier.date BETWEEN date_first AND date(now()) AND
p_calendrier.jour_semaine = w_sejours_seances.jour_semaine
;
-- Lieux de sortie
UPDATE activite.p_sejours SET lieu_sortie_id = p_mouvements_sejour.lieu_id
FROM activite.p_mouvements_sejour
WHERE p_sejours.no_sejour = p_mouvements_sejour.no_sejour
AND p_mouvements_sejour.date = p_sejours.date_sortie
AND (lieu_sortie_id <> p_mouvements_sejour.lieu_id OR lieu_sortie_id IS NULL);
UPDATE activite.p_sejours SET lieu_sortie_id = p_mouvements_sejour.lieu_id
FROM activite.p_mouvements_sejour
WHERE p_sejours.no_sejour = p_mouvements_sejour.no_sejour
AND p_mouvements_sejour.date = p_sejours.date_sortie AND p_mouvements_sejour.nb_sorties_directes = 1
AND (lieu_sortie_id <> p_mouvements_sejour.lieu_id OR lieu_sortie_id IS NULL);
UPDATE activite.p_sejours SET lieu_sortie_id = p_mouvements_sejour.lieu_id
FROM activite.p_mouvements_sejour
WHERE p_sejours.no_sejour = p_mouvements_sejour.no_sejour
AND (p_sejours.lieu_sortie_id = 0 OR lieu_sortie_id IS NULL) ;
UPDATE activite.p_sejours SET lieu_sortie_id = 0
WHERE lieu_sortie_id IS NULL ;
UPDATE activite.p_sejours SET lieu_sortie_id = 0
WHERE p_sejours.code_prevu = '1' AND (p_sejours.lieu_sortie_id = 0 OR lieu_sortie_id IS NULL);
]]>
'6' AND p_sejours.type_sejour <> '9'
GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13;
INSERT INTO activite[PX].p_factures(
finess,
no_sejour,
no_facture,
no_facture_reference,
type_facture,
code_facture,
date_facture,
tiers_payant_0_id,
tiers_payant_1_id,
tiers_payant_2_id,
tiers_payant_22_id,
code_cp_demandee,
ghs_id,
date_debut,
date_fin)
SELECT finess,
no_sejour,
'E' || no_sejour || CASE WHEN avec_facturation_intermediaire = '1' THEN '_' || substr(p_calendrier.mois,3,4) ELSE '' END,
'E' || no_sejour || CASE WHEN avec_facturation_intermediaire = '1' THEN '_' || substr(p_calendrier.mois,3,4) ELSE '' END,
'E',
'0',
'20991231'::date,
tiers_payant_0_id,
tiers_payant_1_id,
tiers_payant_2_id,
tiers_payant_22_id,
code_cp_demandee ,
ghs_id,
MIN(GREATEST(date_debut_encours, p_calendrier.date)),
MAX(LEAST(date_fin_encours, p_calendrier.date, CASE WHEN avec_facturation_intermediaire = '1' THEN date(date_trunc('month',p_calendrier.date) + interval '1 month' - interval '1 day') ELSE NULL END))
FROM w_factures_trous
JOIN base.p_calendrier ON p_calendrier.date BETWEEN date_debut_encours AND date_fin_encours
WHERE (date_debut_encours <= date_fin_encours or date_fin_facture is null)
GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13
HAVING MIN(GREATEST(date_debut_encours, p_calendrier.date)) >= '[ENV_ADM_ANNEEDEBUT]0101'
;
UPDATE activite[PX].p_factures SET
date_debut = date_entree,
date_fin = CASE WHEN code_sorti = 1 THEN date_sortie ELSE date_fin END
FROM activite[PX].p_sejours
JOIN activite[PX].t_lieux ON lieu_sortie_id = t_lieux.oid
JOIN activite[PX].t_services_facturation ON t_lieux.service_facturation_id = t_services_facturation.oid AND
avec_facturation_intermediaire IS DISTINCT FROM '1'
WHERE p_factures.no_sejour = p_sejours.no_sejour AND
CASE WHEN code_sorti = 1 THEN date_sortie ELSE date(now()) END - date_entree < 30 AND
(
p_factures.date_debut <> date_entree OR
p_factures.date_fin <> CASE WHEN code_sorti = 1 THEN date_sortie ELSE date_fin END
);
]]>
0 THEN PRIX_UNIT / PRIX_UNIT_NATIONAL ELSE 1 END AS coefficient_mco,
COALESCE(W_RUBRIQUE_FACTUR_source.rubrique_facturation_id,0) AS rubrique_facturation_id,
COALESCE(W_RUBRIQUE_FACTUR_source.rubrique_facturation_id,0) AS rubrique_comptabilisation_id,
COALESCE(W_RUBRIQUE_FACTUR_source.compte_produit_id,0) AS compte_produit_id,
COALESCE(W_RUBRIQUE_FACTUR_source.prestation_id,0) AS prestation_id,
MT_FACT AS montant_facture,
PART_ASS AS montant_facture_0,
PART_CAISSE AS montant_facture_1,
PART_MUT AS montant_facture_2,
0::numeric AS montant_facture_22,
round(base.cti_division(PART_ASS,MT_FACT)*100.0,0) AS taux_0,
round(base.cti_division(PART_CAISSE,MT_FACT)*100.0,0) AS taux_1,
round(base.cti_division(PART_MUT,MT_FACT)*100.0,0) AS taux_2,
0::numeric AS taux_22,
CASE WHEN PRIX_UNIT_NATIONAL > 0 THEN PRIX_UNIT_NATIONAL ELSE PRIX_UNIT END AS prix_unitaire,
COALESCE(t_lieux.oid,0) AS lieu_id,
MT_FACT AS montant_comptabilise,
PART_ASS AS montant_comptabilise_0,
PART_CAISSE AS montant_comptabilise_1,
PART_MUT AS montant_comptabilise_2,
0::numeric AS montant_comptabilise_22,
0,
0,
0,
0,
0,
1::integer AS origine_facturation_id,
0::numeric AS montant_facture_actes_inclus_dans_sejour,
0::numeric AS montant_facture_0_actes_inclus_dans_sejour,
0::numeric AS montant_facture_1_actes_inclus_dans_sejour,
0::numeric AS montant_facture_2_actes_inclus_dans_sejour,
0::numeric AS montant_facture_22_actes_inclus_dans_sejour
FROM w_LIGNES_FACTURES
JOIN activite.p_factures ON w_LIGNES_FACTURES.NUM_FACT = p_factures.no_facture
JOIN activite.p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
LEFT JOIN w_RUBRIQUE_FACTUR_source ON w_RUBRIQUE_FACTUR_source.NUM_ACTE = w_LIGNES_FACTURES.NUM_ACTE
LEFT JOIN activite.t_lieux ON
t_lieux.code_original_1 = w_LIGNES_FACTURES.service_facturation_code_original AND
t_lieux.code_original_2 = '' AND
t_lieux.code_original_4 = '' AND
t_lieux.code_original_5 = w_LIGNES_FACTURES.unite_fonctionnelle_code_original AND
t_lieux.code_original_6 = w_LIGNES_FACTURES.unite_fonctionnelle_code_original
WHERE w_LIGNES_FACTURES.HONO_SEJ = 'false'
;
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_c_1');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_c_2');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_c_3');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_c_4');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_c_5');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_c_6');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_c_7');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_c_8');
ANALYSE activite.p_factures_lignes_c
;
SELECT activite[PX].cti_reorganize_rubrique_facture_c('activite.p_factures_lignes_c');
-- Eclatement des supplements par jour
DROP TABLE IF EXISTS w_factures_lignes_sup_c;
CREATE TEMP TABLE w_factures_lignes_sup_c AS
SELECT
p_factures_lignes_c.CTID AS from_CTID,
t_prestations.code AS prestation_code,
CASE WHEN p_sejours.type_sejour <> '5' THEN date(p_sejours.date_entree) ELSE p_factures_lignes_c.date_debut END AS date_debut_ghs,
CASE WHEN p_sejours.type_sejour <> '5' THEN date(p_sejours.date_sortie - interval '1 day') ELSE p_factures_lignes_c.date_fin END AS date_fin_ghs,
(date(date_sortie) - date(date_entree)) * CASE WHEN nb_prestation < 0 THEN -1 ELSE 1 END AS nb_prestation_ghs,
CASE WHEN type_sejour = '5' THEN p_factures_lignes_c.date_debut WHEN t_prestations.code = 'GHS' THEN date(date_entree + interval '1 day') ELSE date(p_factures_lignes_c.date_debut + interval '1 day') END AS date_debut_det,
CASE WHEN type_sejour = '5' THEN p_factures_lignes_c.date_fin WHEN t_prestations.code = 'GHS' THEN date(p_sejours.date_sortie - interval '1 day') ELSE date(p_factures_lignes_c.date_debut + ((ABS(nb_prestation)-1) || ' day')::interval) END AS date_fin_det,
ABS(CASE WHEN type_sejour <> '5' AND t_prestations.code = 'GHS' THEN date(date_sortie) - date(date_entree) ELSE nb_prestation END) AS nb_det,
p_factures_lignes_c.*
FROM activite[PX].p_factures_lignes_c
JOIN activite[PX].p_factures ON p_factures_lignes_c.no_facture = p_factures.no_facture
JOIN activite[PX].p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
JOIN activite.t_prestations ON prestation_id = t_prestations.oid AND code IN ('PJ', 'PJ1', 'PJ2', 'FJ', 'SSM', 'GHS', 'EXH', 'SRC', 'REA', 'STF', 'NN1', 'NN2', 'NN3', 'CP', 'CPC', 'SHO')
WHERE (nb_prestation > 1 or nb_prestation < -1 OR (type_sejour <> '5' AND t_prestations.code = 'GHS' AND date(date_sortie) - date(date_entree) > 1)) ;
UPDATE w_factures_lignes_sup_c SET
date_fin_ghs = date(date_debut_exh - interval '1 day'),
date_fin_det = date(date_debut_exh - interval '1 day'),
nb_prestation_ghs = date(date_debut_exh - interval '1 day') - date_debut_ghs + 1,
nb_det = date(date_debut_exh - interval '1 day') - date_debut_ghs + 1
FROM (
SELECT no_facture, date(MIN(date_debut)) AS date_debut_exh
FROM activite[PX].p_factures_lignes_c
JOIN activite.t_prestations ON prestation_id = t_prestations.oid AND code = 'EXH'
GROUP BY 1) subview
WHERE w_factures_lignes_sup_c.no_facture = subview.no_facture;
CREATE INDEX w_factures_lignes_sup_c_i1
ON w_factures_lignes_sup_c
USING btree
(date_debut);
DROP TABLE IF EXISTS w_factures_lignes_sup_c_sup;
CREATE TEMP TABLE w_factures_lignes_sup_c_sup AS
SELECT
from_CTID,
no_facture,
date AS date_debut,
date AS date_fin,
CASE WHEN prestation_code = 'GHS' AND date <> date_fin_ghs THEN 0 WHEN nb_prestation < 0 THEN -1 ELSE 1 END AS nb_rubrique,
CASE WHEN prestation_code = 'GHS' AND date <> date_fin_ghs THEN 0 WHEN nb_prestation < 0 THEN -1 ELSE 1 END AS nb_prestation,
coefficient,
coefficient_mco,
rubrique_facturation_id,
rubrique_comptabilisation_id,
compte_produit_id,
prestation_id,
round(montant_facture / ABS(nb_det),2) AS montant_facture,
round(montant_facture_0 / ABS(nb_det),2) AS montant_facture_0,
round(montant_facture_1 / ABS(nb_det),2) AS montant_facture_1,
round(montant_facture_2 / ABS(nb_det),2) AS montant_facture_2,
round(montant_facture_22 / ABS(nb_det),2) AS montant_facture_22,
taux_0,
taux_1,
taux_2,
taux_22,
finess,
prix_unitaire,
lieu_id,
round(montant_comptabilise / ABS(nb_det),2) AS montant_comptabilise,
round(montant_comptabilise_0 / ABS(nb_det),2) AS montant_comptabilise_0,
round(montant_comptabilise_1 / ABS(nb_det),2) AS montant_comptabilise_1,
round(montant_comptabilise_2 / ABS(nb_det),2) AS montant_comptabilise_2,
round(montant_comptabilise_22 / ABS(nb_det),2) AS montant_comptabilise_22,
round(montant_encours / ABS(nb_det),2) AS montant_encours,
round(montant_encours_0 / ABS(nb_det),2) AS montant_encours_0,
round(montant_encours_1 / ABS(nb_det),2) AS montant_encours_1,
round(montant_encours_2 / ABS(nb_det),2) AS montant_encours_2,
round(montant_encours_22 / ABS(nb_det),2) AS montant_encours_22,
round(montant_facture_actes_inclus_dans_sejour / ABS(nb_det),2) AS montant_facture_actes_inclus_dans_sejour,
round(montant_facture_0_actes_inclus_dans_sejour / ABS(nb_det),2) AS montant_facture_0_actes_inclus_dans_sejour,
round(montant_facture_1_actes_inclus_dans_sejour / ABS(nb_det),2) AS montant_facture_1_actes_inclus_dans_sejour,
round(montant_facture_2_actes_inclus_dans_sejour / ABS(nb_det),2) AS montant_facture_2_actes_inclus_dans_sejour,
round(montant_facture_22_actes_inclus_dans_sejour / ABS(nb_det),2) AS montant_facture_22_actes_inclus_dans_sejour,
origine_facturation_id,
round(montant_comptabilise_budget_global_1 / ABS(nb_det),2) AS montant_comptabilise_budget_global_1,
facture_id
FROM w_factures_lignes_sup_c
JOIN base.p_calendrier ON p_calendrier.date BETWEEN date_debut_det AND date_fin_det
;
DROP TABLE IF EXISTS w_factures_lignes_sup_c_sup_tot;
CREATE TEMP TABLE w_factures_lignes_sup_c_sup_tot AS
SELECT from_CTID,
SUM(nb_rubrique) AS nb_rubrique,
SUM(nb_prestation) AS nb_prestation,
SUM(montant_facture) AS montant_facture,
SUM(montant_facture_0) AS montant_facture_0,
SUM(montant_facture_1) AS montant_facture_1,
SUM(montant_facture_2) AS montant_facture_2,
SUM(montant_facture_22) AS montant_facture_22,
SUM(montant_comptabilise) AS montant_comptabilise,
SUM(montant_comptabilise_0) AS montant_comptabilise_0,
SUM(montant_comptabilise_1) AS montant_comptabilise_1,
SUM(montant_comptabilise_2) AS montant_comptabilise_2,
SUM(montant_comptabilise_22) AS montant_comptabilise_22,
SUM(montant_encours) AS montant_encours,
SUM(montant_encours_0) AS montant_encours_0,
SUM(montant_encours_1) AS montant_encours_1,
SUM(montant_encours_2) AS montant_encours_2,
SUM(montant_encours_22) AS montant_encours_22,
SUM(montant_facture_actes_inclus_dans_sejour) AS montant_facture_actes_inclus_dans_sejour,
SUM(montant_facture_0_actes_inclus_dans_sejour) AS montant_facture_0_actes_inclus_dans_sejour,
SUM(montant_facture_1_actes_inclus_dans_sejour) AS montant_facture_1_actes_inclus_dans_sejour,
SUM(montant_facture_2_actes_inclus_dans_sejour) AS montant_facture_2_actes_inclus_dans_sejour,
SUM(montant_facture_22_actes_inclus_dans_sejour) AS montant_facture_22_actes_inclus_dans_sejour,
SUM(montant_comptabilise_budget_global_1) AS montant_comptabilise_budget_global_1
FROM w_factures_lignes_sup_c_sup
GROUP BY 1;
UPDATE activite[PX].p_factures_lignes_c
SET
date_fin = p_factures_lignes_c.date_debut,
nb_rubrique = p_factures_lignes_c.nb_rubrique - w_factures_lignes_sup_c_sup_tot.nb_rubrique,
nb_prestation = p_factures_lignes_c.nb_prestation - w_factures_lignes_sup_c_sup_tot.nb_prestation,
montant_facture = p_factures_lignes_c.montant_facture - w_factures_lignes_sup_c_sup_tot.montant_facture,
montant_facture_0 = p_factures_lignes_c.montant_facture_0 - w_factures_lignes_sup_c_sup_tot.montant_facture_0,
montant_facture_1 = p_factures_lignes_c.montant_facture_1 - w_factures_lignes_sup_c_sup_tot.montant_facture_1,
montant_facture_2 = p_factures_lignes_c.montant_facture_2 - w_factures_lignes_sup_c_sup_tot.montant_facture_2,
montant_facture_22 = p_factures_lignes_c.montant_facture_22 - w_factures_lignes_sup_c_sup_tot.montant_facture_22,
montant_comptabilise = p_factures_lignes_c.montant_comptabilise - w_factures_lignes_sup_c_sup_tot.montant_comptabilise,
montant_comptabilise_0 = p_factures_lignes_c.montant_comptabilise_0 - w_factures_lignes_sup_c_sup_tot.montant_comptabilise_0,
montant_comptabilise_1 = p_factures_lignes_c.montant_comptabilise_1 - w_factures_lignes_sup_c_sup_tot.montant_comptabilise_1,
montant_comptabilise_2 = p_factures_lignes_c.montant_comptabilise_2 - w_factures_lignes_sup_c_sup_tot.montant_comptabilise_2,
montant_comptabilise_22 = p_factures_lignes_c.montant_comptabilise_22 - w_factures_lignes_sup_c_sup_tot.montant_comptabilise_22,
montant_encours = p_factures_lignes_c.montant_encours - w_factures_lignes_sup_c_sup_tot.montant_encours,
montant_encours_0 = p_factures_lignes_c.montant_encours_0 - w_factures_lignes_sup_c_sup_tot.montant_encours_0,
montant_encours_1 = p_factures_lignes_c.montant_encours_1 - w_factures_lignes_sup_c_sup_tot.montant_encours_1,
montant_encours_2 = p_factures_lignes_c.montant_encours_2 - w_factures_lignes_sup_c_sup_tot.montant_encours_2,
montant_encours_22 = p_factures_lignes_c.montant_encours_22 - w_factures_lignes_sup_c_sup_tot.montant_encours_22,
montant_facture_actes_inclus_dans_sejour = p_factures_lignes_c.montant_facture_actes_inclus_dans_sejour - w_factures_lignes_sup_c_sup_tot.montant_facture_actes_inclus_dans_sejour,
montant_facture_0_actes_inclus_dans_sejour = p_factures_lignes_c.montant_facture_0_actes_inclus_dans_sejour - w_factures_lignes_sup_c_sup_tot.montant_facture_0_actes_inclus_dans_sejour,
montant_facture_1_actes_inclus_dans_sejour = p_factures_lignes_c.montant_facture_1_actes_inclus_dans_sejour - w_factures_lignes_sup_c_sup_tot.montant_facture_1_actes_inclus_dans_sejour,
montant_facture_2_actes_inclus_dans_sejour = p_factures_lignes_c.montant_facture_2_actes_inclus_dans_sejour - w_factures_lignes_sup_c_sup_tot.montant_facture_2_actes_inclus_dans_sejour,
montant_facture_22_actes_inclus_dans_sejour = p_factures_lignes_c.montant_facture_22_actes_inclus_dans_sejour - w_factures_lignes_sup_c_sup_tot.montant_facture_22_actes_inclus_dans_sejour,
montant_comptabilise_budget_global_1 = p_factures_lignes_c.montant_comptabilise_budget_global_1 - w_factures_lignes_sup_c_sup_tot.montant_comptabilise_budget_global_1
FROM w_factures_lignes_sup_c_sup_tot
WHERE p_factures_lignes_c.CTID = from_CTID;
-- Rubriques internes cti
SELECT activite[PX].cti_reorganize_rubrique_facture_c('w_factures_lignes_sup_c_sup');
INSERT INTO activite[PX].p_factures_lignes_c(
no_facture,
date_debut,
date_fin,
nb_rubrique,
coefficient,
coefficient_mco,
rubrique_facture_id,
rubrique_facturation_id,
rubrique_comptabilisation_id,
compte_produit_id,
prestation_id,
montant_facture,
montant_facture_0,
montant_facture_1,
montant_facture_2,
montant_facture_22,
taux_0,
taux_1,
taux_2,
taux_22,
finess,
prix_unitaire,
lieu_id,
nb_prestation,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
montant_encours,
montant_encours_0,
montant_encours_1,
montant_encours_2,
montant_encours_22,
montant_facture_actes_inclus_dans_sejour,
montant_facture_0_actes_inclus_dans_sejour,
montant_facture_1_actes_inclus_dans_sejour,
montant_facture_2_actes_inclus_dans_sejour,
montant_facture_22_actes_inclus_dans_sejour,
origine_facturation_id,
montant_comptabilise_budget_global_1,
facture_id)
SELECT
no_facture,
date_debut,
date_fin,
nb_rubrique,
coefficient,
coefficient_mco,
rubrique_facture_id,
rubrique_facturation_id,
rubrique_comptabilisation_id,
compte_produit_id,
prestation_id,
montant_facture,
montant_facture_0,
montant_facture_1,
montant_facture_2,
montant_facture_22,
taux_0,
taux_1,
taux_2,
taux_22,
finess,
prix_unitaire,
lieu_id,
nb_prestation,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
montant_encours,
montant_encours_0,
montant_encours_1,
montant_encours_2,
montant_encours_22,
montant_facture_actes_inclus_dans_sejour,
montant_facture_0_actes_inclus_dans_sejour,
montant_facture_1_actes_inclus_dans_sejour,
montant_facture_2_actes_inclus_dans_sejour,
montant_facture_22_actes_inclus_dans_sejour,
origine_facturation_id,
montant_comptabilise_budget_global_1,
facture_id
FROM w_factures_lignes_sup_c_sup;
DROP TABLE IF EXISTS w_mouvements_sejour_lieu_jour;
CREATE TEMP TABLE w_mouvements_sejour_lieu_jour AS
SELECT no_sejour,
date,
(MAX(CASE WHEN est_absence <> '1' THEN Array[heure_fin, lieu_id] ELSE NULL END))[2] AS lieu_id,
(MAX(Array[heure_fin, lieu_id]))[2] AS lieu_id_avec_absence
FROM activite[PX].p_mouvements_sejour
JOIN activite[PX].t_lieux ON lieu_id = t_lieux.oid
JOIN activite[PX].t_services_facturation On service_facturation_id = t_services_facturation.oid
GROUP BY 1,2
;
UPDATE activite[PX].p_factures_lignes_c
SET lieu_id = COALESCE(w_mouvements_sejour_lieu_jour.lieu_id,w_mouvements_sejour_lieu_jour.lieu_id_avec_absence)
FROM activite[PX].p_factures, w_mouvements_sejour_lieu_jour
WHERE p_factures_lignes_c.no_facture = p_factures.no_facture AND
p_factures.no_sejour = w_mouvements_sejour_lieu_jour.no_sejour AND
p_factures_lignes_c.date_debut = w_mouvements_sejour_lieu_jour.date AND
p_factures_lignes_c.lieu_id = 0
;
]]>
0 AND code_sorti = 0 AND
t_prestations.code <> 'GHS' AND
t_prestations.code NOT LIKE 'D%' AND
p_factures_lignes_c.date_fin > date(date_extraction - interval '56 days')
GROUP BY 1
) subview ON
p_factures.no_sejour = subview.no_sejour AND
p_factures_lignes_c.date_fin > date(date_max - interval '28 days')
WHERE montant_facture > 0 AND
t_prestations.code <> 'GHS' AND
t_prestations.code NOT LIKE 'D%'
GROUP BY 1,2,3,4,5
HAVING count(*) >= 3
ORDER BY 6,1,2,3
;
ANALYSE w_prestations_jour
;
INSERT INTO activite.p_factures_lignes_non_facturees_c(
no_facture,
date_debut,
date_fin,
nb_rubrique,
coefficient,
rubrique_facturation_id,
prestation_id,
prix_unitaire,
lieu_id)
SELECT
p_factures.no_facture,
p_calendrier.date AS date_debut,
p_calendrier.date AS date_fin,
1::numeric AS nb_rubrique,
1::numeric AS coefficient,
w_prestations_jour.rubrique_facturation_id,
w_prestations_jour.prestation_id,
w_prestations_jour.prix_unitaire,
w_prestations_jour.lieu_id
FROM w_prestations_jour
JOIN base.p_calendrier ON
p_calendrier.date BETWEEN date_first AND date(now()) AND
p_calendrier.jour_semaine = w_prestations_jour.jour_semaine
JOIN activite.p_factures ON
p_factures.no_sejour = w_prestations_jour.no_sejour AND
p_factures.type_facture = 'E' AND
p_calendrier.date BETWEEN p_factures.date_debut AND p_factures.date_fin
;
]]>
'20991231' AND
(
p_factures_lignes_c.montant_comptabilise <> 0 OR
p_factures_lignes_c.montant_comptabilise_0 <> 0 OR
p_factures_lignes_c.montant_comptabilise_1 <> 0 OR
p_factures_lignes_c.montant_comptabilise_2 <> 0 OR
p_factures_lignes_c.montant_comptabilise_22 <> 0
)
GROUP BY 1,2,3,4
;
-- Comptes clients (REG)
INSERT INTO activite.p_factures_soldes_c(
no_facture,
date_comptable,
rubrique_comptabilisee_id,
prestation_id,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
montant_regle,
montant_regle_0,
montant_regle_1,
montant_regle_2,
montant_regle_22
)
SELECT
p_factures.no_facture,
w_REGLEMENTS.DATE_REGLE,
COALESCE(w_RUBRIQUE_FACTUR_source.rubrique_facturation_id,0),
COALESCE(w_RUBRIQUE_FACTUR_source.prestation_id,0),
0,
0,
0,
0,
0,
SUM(w_REGLEMENTS.MTTOTAL) AS montant_regle,
SUM(w_REGLEMENTS.MTASS) AS montant_regle_0,
SUM(w_REGLEMENTS.MTCAISS) AS montant_regle_1,
SUM(w_REGLEMENTS.MTMUT) AS montant_regle_2,
0 AS montant_regle_22
FROM w_REGLEMENTS
JOIN activite.p_factures ON w_REGLEMENTS.NUMFACT = p_factures.no_facture
LEFT JOIN w_RUBRIQUE_FACTUR_source ON w_REGLEMENTS.NUM_ACTE = w_RUBRIQUE_FACTUR_source.NUM_ACTE
WHERE DATE_REGLE IS NOT NULL AND
w_REGLEMENTS.HONO_SEJ = 'false'
GROUP BY 1,2,3,4
;
SELECT base.cti_enable_index('activite[PX]', 'i_factures_soldes_c_1');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_soldes_c_2');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_soldes_c_3');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_soldes_c_4');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_soldes_c_8');
ANALYSE activite.p_factures_soldes_c
;
]]>
0 THEN PRIX_UNIT / PRIX_UNIT_NATIONAL ELSE 1 END AS coefficient_mco,
COALESCE(t_medecins_administratifs.oid,0) AS medecin_facture_id,
COALESCE(t_medecins_administratifs.oid,0) AS medecin_comptabilise_id,
COALESCE(W_RUBRIQUE_FACTUR_source.rubrique_facturation_id,0) AS rubrique_facturation_id,
COALESCE(W_RUBRIQUE_FACTUR_source.prestation_id,0) AS prestation_id,
MT_FACT AS montant_facture,
PART_ASS AS montant_facture_0,
PART_CAISSE AS montant_facture_1,
PART_MUT AS montant_facture_2,
0::numeric AS montant_facture_22,
CASE WHEN MT_FACT = (PRIX_UNIT*COEF) + DEPASS THEN DEPASS ELSE 0 END AS montant_depassement,
round(base.cti_division(PART_ASS,MT_FACT)*100.0,0) AS taux_0,
round(base.cti_division(PART_CAISSE,MT_FACT)*100.0,0) AS taux_1,
round(base.cti_division(PART_MUT,MT_FACT)*100.0,0) AS taux_2,
0::numeric AS taux_22,
CASE WHEN PRIX_UNIT_NATIONAL > 0 THEN PRIX_UNIT_NATIONAL ELSE PRIX_UNIT END AS prix_unitaire,
COALESCE(t_lieux.oid,0) AS lieu_id,
LC_HON AS montant_comptabilise,
LC_HON_PAT AS montant_comptabilise_0,
LC_HON_AMO AS montant_comptabilise_1,
LC_HON_AMC AS montant_comptabilise_2,
0::numeric AS montant_comptabilise_22,
0,
0,
0,
0,
0,
0::numeric AS montant_facture_actes_inclus_dans_sejour,
0::numeric AS montant_facture_0_actes_inclus_dans_sejour,
0::numeric AS montant_facture_1_actes_inclus_dans_sejour,
0::numeric AS montant_facture_2_actes_inclus_dans_sejour,
0::numeric AS montant_facture_22_actes_inclus_dans_sejour,
COALESCE(w_RUBRIQUE_FACTUR_source.acte_id,0) AS acte_id
FROM w_LIGNES_FACTURES
JOIN activite.p_factures ON w_LIGNES_FACTURES.NUM_FACT = p_factures.no_facture
JOIN activite.p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
LEFT JOIN w_RUBRIQUE_FACTUR_source ON w_RUBRIQUE_FACTUR_source.NUM_ACTE = w_LIGNES_FACTURES.NUM_ACTE
LEFT JOIN activite.t_medecins_administratifs ON medecin_executant_code_original = t_medecins_administratifs.code_original
LEFT JOIN activite.t_lieux ON
t_lieux.code_original_1 = w_LIGNES_FACTURES.service_facturation_code_original AND
t_lieux.code_original_2 = '' AND
t_lieux.code_original_4 = '' AND
t_lieux.code_original_5 = w_LIGNES_FACTURES.unite_fonctionnelle_code_original AND
t_lieux.code_original_6 = w_LIGNES_FACTURES.unite_fonctionnelle_code_original
WHERE w_LIGNES_FACTURES.HONO_SEJ = 'true'
;
DROP TABLE IF EXISTS w_mouvements_sejour_lieu_jour;
CREATE TEMP TABLE w_mouvements_sejour_lieu_jour AS
SELECT no_sejour,
date,
(MAX(CASE WHEN est_absence <> '1' THEN Array[heure_fin, lieu_id] ELSE NULL END))[2] AS lieu_id,
(MAX(Array[heure_fin, lieu_id]))[2] AS lieu_id_avec_absence
FROM activite[PX].p_mouvements_sejour
JOIN activite[PX].t_lieux ON lieu_id = t_lieux.oid
JOIN activite[PX].t_services_facturation On service_facturation_id = t_services_facturation.oid
GROUP BY 1,2;
UPDATE activite[PX].p_factures_lignes_h
SET lieu_id = COALESCE(w_mouvements_sejour_lieu_jour.lieu_id,w_mouvements_sejour_lieu_jour.lieu_id_avec_absence)
FROM activite[PX].p_factures, w_mouvements_sejour_lieu_jour
WHERE p_factures_lignes_h.no_facture = p_factures.no_facture AND
p_factures.no_sejour = w_mouvements_sejour_lieu_jour.no_sejour AND
p_factures_lignes_h.date_debut = w_mouvements_sejour_lieu_jour.date AND
p_factures_lignes_h.lieu_id = 0;
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_h_1');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_h_2');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_h_3');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_h_4');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_h_5');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_h_6');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_h_7');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_h_8');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_lignes_h_9');
ANALYSE activite.p_factures_lignes_h
;
]]>
0 AND code_sorti = 0 AND
p_factures_lignes_h.date_fin > date(date_extraction - interval '56 days')
GROUP BY 1
) subview ON
p_factures.no_sejour = subview.no_sejour AND
p_factures_lignes_h.date_fin > date(date_max - interval '28 days')
WHERE montant_facture > 0
GROUP BY 1,2,3,4,5,6,7
HAVING count(*) >= 3
;
ANALYSE w_actes_jour
;
INSERT INTO activite.p_factures_lignes_non_facturees_h(
no_facture,
date_debut,
date_fin,
nb_rubrique,
coefficient,
rubrique_facturation_id,
prestation_id,
prix_unitaire,
lieu_id,
medecin_facture_id,
acte_id,
phase_ccam,
activite_ccam,
extension_ccam,
modificateur_ccam_1,
modificateur_ccam_2,
modificateur_ccam_3,
modificateur_ccam_4)
SELECT
p_factures.no_facture,
p_calendrier.date AS date_debut,
p_calendrier.date AS date_fin,
1::numeric AS nb_rubrique,
w_actes_jour.coefficient,
w_actes_jour.rubrique_facturation_id,
w_actes_jour.prestation_id,
w_actes_jour.prix_unitaire,
w_actes_jour.lieu_id,
w_actes_jour.medecin_facture_id,
w_actes_jour.acte_id,
''::text AS phase_ccam,
'1'::text AS activite_ccam,
''::text AS extension_ccam,
''::text AS modificateur_ccam_1,
''::text AS modificateur_ccam_2,
''::text AS modificateur_ccam_3,
''::text AS modificateur_ccam_4
FROM w_actes_jour
JOIN base.p_calendrier ON
p_calendrier.date BETWEEN date_first AND date(now()) AND
p_calendrier.jour_semaine = w_actes_jour.jour_semaine
JOIN activite.p_factures ON
p_factures.no_sejour = w_actes_jour.no_sejour AND
p_factures.type_facture = 'E' AND
p_calendrier.date BETWEEN p_factures.date_debut AND p_factures.date_fin
order by 1,2
;
]]>
0 OR
montant_comptabilise_0 <> 0 OR
montant_comptabilise_1 <> 0 OR
montant_comptabilise_2 <> 0 OR
montant_comptabilise_22 <> 0
)
GROUP BY 1,2,3,4,5
;
-- Réglements
INSERT INTO activite.p_factures_soldes_h(
no_facture,
date_comptable,
medecin_comptabilise_id,
rubrique_comptabilisee_id,
prestation_id,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
montant_regle,
montant_regle_0,
montant_regle_1,
montant_regle_2,
montant_regle_22
)
SELECT
p_factures.no_facture,
w_REGLEMENTS.DATE_REGLE,
COALESCE(t_medecins_administratifs.oid,0) AS medecin_comptabilise_id,
COALESCE(w_RUBRIQUE_FACTUR_source.rubrique_facturation_id,0),
COALESCE(w_RUBRIQUE_FACTUR_source.prestation_id,0),
0,
0,
0,
0,
0,
SUM(w_REGLEMENTS.MTTOTAL) AS montant_regle,
SUM(w_REGLEMENTS.MTASS) AS montant_regle_0,
SUM(w_REGLEMENTS.MTCAISS) AS montant_regle_1,
SUM(w_REGLEMENTS.MTMUT) AS montant_regle_2,
0 AS montant_regle_22
FROM w_REGLEMENTS
JOIN activite.p_factures ON w_REGLEMENTS.NUMFACT = p_factures.no_facture
LEFT JOIN w_RUBRIQUE_FACTUR_source ON w_REGLEMENTS.NUM_ACTE = w_RUBRIQUE_FACTUR_source.NUM_ACTE
LEFT JOIN activite.t_medecins_administratifs On medecin_executant_code_original = t_medecins_administratifs.code_original
WHERE DATE_REGLE IS NOT NULL AND
w_REGLEMENTS.HONO_SEJ = 'true'
GROUP BY 1,2,3,4,5
;
SELECT base.cti_enable_index('activite[PX]', 'i_factures_soldes_h_1');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_soldes_h_3');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_soldes_h_4');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_soldes_h_8');
ANALYSE activite.p_factures_soldes_h
;
]]>
= '20190101'
GROUP BY 1;
]]>
'00' THEN date((LEFT(NUM_FACT,6)||'01')::date + interval '1 month' - interval '1 day')
ELSE date((LEFT(NUM_FACT,4)||'1231')::date)
END AS date_vente,
TT_SEJ AS TT_SEJ_AMO,
0::numeric AS TT_SEJ_AMC,
0::numeric AS TT_SEJ_PAT,
TT_HONO AS TT_HON_AMO,
0::numeric AS TT_HON_AMC,
0::numeric AS TT_HON_PAT,
TT_HONO AS TC_HON,
TT_HONO AS TC_HON_AMO,
0::numeric AS TC_HON_AMC,
0::numeric AS TC_HON_PAT,
'20991231'::date AS DATE_REGLE,
0::numeric AS TR_SEJ,
0::numeric AS TR_SEJ_AMO,
0::numeric AS TR_SEJ_AMC,
0::numeric AS TR_SEJ_PAT,
0::numeric AS TR_HON,
0::numeric AS TR_HON_AMO,
0::numeric AS TR_HON_AMC,
0::numeric AS TR_HON_PAT
FROM prod_hemat2a.FACTURES
;
INSERT INTO w_FACTURES
SELECT
NUM_PAT,
NUM_FACT::text,
VALID,
TT_SEJOUR,
TT_HONO,
MT_CAISS,
MT_MUT,
MT_ASS,
DATE_EDIT,
DATE_TRANSMI,
EDITE,
TRANSMIS,
NUM_BORDEREAU,
DATE_GENE_COMPT,
GENE_CPT,
NUM_JNL,
RAPPEL,
COMPLET,
AVOIR,
SEJOUR_DU,
SEJOUR_AU,
MT_TT,
NUM_CAISS,
NUM_SOC,
TELETRANS,
NUMLOT,
GENAUTO,
REGUL_POSITIVE,
REGUL_NEGATIVE,
CPT_ANA,
NBR_ACT_DIAL,
MUTUELLE,
NUM_MUTUELLE,
AVOIR_FACTINITIALE::text,
FORCER_ARCHIVAGE,
AVOIR_NUMFACT,
'1'::text AS FACT_last,
date(SEJOUR_DU) AS SEJOUR_DU_D,
date(SEJOUR_AU) AS SEJOUR_AU_D,
'1'::text AS gen_sejour,
CASE
WHEN substr(num_fact,5,2) BETWEEN '01' AND '12' THEN date((LEFT(NUM_FACT,6)||'01')::date + interval '1 month' - interval '1 day')
ELSE date((LEFT(NUM_FACT,4)||'1231')::date)
END AS date_vente,
TT_SEJOUR AS TT_SEJ_AMO,
0::numeric AS TT_SEJ_AMC,
0::numeric AS TT_SEJ_PAT,
TT_HONO AS TT_HON_AMO,
0::numeric AS TT_HON_AMC,
0::numeric AS TT_HON_PAT,
TT_HONO AS TC_HON,
TT_HONO AS TC_HON_AMO,
0::numeric AS TC_HON_AMC,
0::numeric AS TC_HON_PAT,
'20991231'::date AS DATE_REGLE,
0::numeric AS TR_SEJ,
0::numeric AS TR_SEJ_AMO,
0::numeric AS TR_SEJ_AMC,
0::numeric AS TR_SEJ_PAT,
0::numeric AS TR_HON,
0::numeric AS TR_HON_AMO,
0::numeric AS TR_HON_AMC,
0::numeric AS TR_HON_PAT
FROM prod_hemat2a.ARCH_FACT
WHERE SEJOUR_AU >= '20100101'
;
ANALYSE w_FACTURES
;
DROP TABLE IF EXISTS w_LIGNES_FACTURES;
CREATE TEMP TABLE w_LIGNES_FACTURES AS
SELECT
NUM_FACT::text,
PRESTATION,
NUM_ACTE,
SEJOUR_DU,
SEJOUR_AU,
QUANTITE,
COEF,
PRIX_UNIT,
MAJORATION,
MT_FACT,
BASE_REMB,
DEPASS,
PART_CAISSE,
PART_MUT,
PART_ASS,
EXECUTANT,
DENOMBREMENT,
RMO,
NUM_PAT,
NUM_EXE,
CPT_COMPTA,
DMT,
CODE_TVA,
NUM_LIG,
HONO_SEJ,
CT_EPO,
XMT_EPO,
CODIF_AFF,
NUM_SOC,
TIERPERS,
FELEC,
TYPE_PRODUIT,
DATE_PRESCRIPTION_PRODUIT,
PRIX_UNIT_NATIONAL,
COEF_NATIONAL,
COEF_REGIONAL,
ACTE_PMSI,
CODE_PRODUIT,
TYPE_ETI,
CODE_ASSOCIATION,
NUM_PRODUIT,
ID_CLEFPRIMAIRE,
FINESS_ETAB_DESTINATAIRE,
''::text AS medecin_executant_code_original,
NUM_SOC::text||'_'||LEFT(DMT,2) AS service_facturation_code_original,
CASE WHEN HONO_SEJ = 'false' AND PRESTATION LIKE 'D%' THEN NUM_SOC::text||'_'||PRESTATION ELSE '' END AS unite_fonctionnelle_code_original,
0::numeric AS LC_HON,
0::numeric AS LC_HON_AMO,
0::numeric AS LC_HON_AMC,
0::numeric AS LC_HON_PAT
FROM prod_hemat2a.LIGNES_FACTURES
;
INSERT INTO w_LIGNES_FACTURES
SELECT
NUM_FACT::text,
PRESTATION,
NUM_ACTE,
SEJOUR_DU,
SEJOUR_AU,
QUANTITE,
COEF,
PRIX_UNIT,
MAJORATION,
MT_FACT,
BASE_REMB,
DEPASS,
PART_CAISS,
PART_MUT,
PART_ASS,
EXECUTANT,
DENOMBREMENT,
RMO,
NUM_PAT,
NUM_EXE,
CPT_COMPTA,
DMT,
CODE_TVA,
NUM_LIGG,
HONO_SEJ,
CPTEPO,
XMT_EPO,
CODIF_AFF,
NUM_SOC,
TIERPERS,
FELEC,
TYPE_PRODUIT,
DATE_PRESCRIPTION_PRODUIT,
PRIX_UNIT_NATIONAL,
COEF_NATIONAL,
COEF_REGIONAL,
ACTE_PMSI,
CODE_PRODUIT,
TYPE_ETI,
CODE_ASSOCIATION,
NUM_PRODUIT,
ID_CLEFPRIMAIRE,
FINESS_ETAB_DESTINATAIRE,
''::text AS medecin_executant_code_original,
NUM_SOC::text||'_'||LEFT(DMT,2) AS service_facturation_code_original,
CASE WHEN HONO_SEJ = 'false' AND PRESTATION LIKE 'D%' THEN NUM_SOC::text||'_'||PRESTATION ELSE '' END AS unite_fonctionnelle_code_original,
0::numeric AS LC_HON,
0::numeric AS LC_HON_AMO,
0::numeric AS LC_HON_AMC,
0::numeric AS LC_HON_PAT
FROM prod_hemat2a.ARCH_LIG_FACT
;
ANALYSE w_LIGNES_FACTURES
;
UPDATE w_LIGNES_FACTURES
SET medecin_executant_code_original = MEDECINS.NUM_MED::text
FROM prod_hemat2a.MEDECINS
WHERE HONO_SEJ = 'true' AND
NUM_EXE = MEDECINS.FINESS AND
EXECUTANT = MEDECINS.NOM
;
UPDATE w_LIGNES_FACTURES
SET medecin_executant_code_original = MEDECINS.NUM_MED::text
FROM prod_hemat2a.MEDECINS
WHERE HONO_SEJ = 'true' AND
EXECUTANT = MEDECINS.NOM AND
medecin_executant_code_original = ''
;
UPDATE w_LIGNES_FACTURES SET
LC_HON = MT_FACT,
LC_HON_AMO = PART_CAISSE,
LC_HON_AMC = PART_MUT,
LC_HON_PAT = PART_ASS
FROM prod_hemat2a.MEDECINS
WHERE HONO_SEJ = 'true' AND
medecin_executant_code_original = NUM_MED::text AND
REGLEMENT_HONO = 'false'
;
UPDATE w_FACTURES SET
SEJOUR_DU_D = subview.SEJOUR_DU_D,
SEJOUR_AU_D = subview.SEJOUR_AU_D
FROM
(
SELECT NUM_FACT,
MIN(SEJOUR_DU) AS SEJOUR_DU_D,
MAX(SEJOUR_AU) AS SEJOUR_AU_D
FROM w_LIGNES_FACTURES
WHERE HONO_SEJ = 'false' AND
PRESTATION LIKE 'D%' AND
PRESTATION NOT LIKE 'DTP'
GROUP BY 1
) subview
WHERE subview.NUM_FACT = w_FACTURES.NUM_FACT AND
(
w_FACTURES.SEJOUR_DU_D IS DISTINCT FROM subview.SEJOUR_DU_D OR
w_FACTURES.SEJOUR_AU_D IS DISTINCT FROM subview.SEJOUR_AU_D
)
;
UPDATE w_FACTURES SET
TT_SEJ = subview.TT_SEJ,
TT_SEJ_AMO = subview.TT_SEJ_AMO,
TT_SEJ_AMC = subview.TT_SEJ_AMC,
TT_SEJ_PAT = subview.TT_SEJ_PAT,
TC_HON = subview.TC_HON,
TC_HON_AMO = subview.TC_HON_AMO,
TC_HON_AMC = subview.TC_HON_AMC,
TC_HON_PAT = subview.TC_HON_PAT,
TT_HONO = subview.TT_HON,
TT_HON_AMO = subview.TT_HON_AMO,
TT_HON_AMC = subview.TT_HON_AMC,
TT_HON_PAT = subview.TT_HON_PAT
FROM
(
SELECT NUM_FACT,
SUM(CASE WHEN HONO_SEJ = 'false' THEN MT_FACT ELSE 0 END) AS TT_SEJ,
SUM(CASE WHEN HONO_SEJ = 'false' THEN PART_CAISSE ELSE 0 END) AS TT_SEJ_AMO,
SUM(CASE WHEN HONO_SEJ = 'false' THEN PART_MUT ELSE 0 END) AS TT_SEJ_AMC,
SUM(CASE WHEN HONO_SEJ = 'false' THEN PART_ASS ELSE 0 END) AS TT_SEJ_PAT,
SUM(CASE WHEN HONO_SEJ = 'true' THEN MT_FACT ELSE 0 END) AS TT_HON,
SUM(CASE WHEN HONO_SEJ = 'true' THEN PART_CAISSE ELSE 0 END) AS TT_HON_AMO,
SUM(CASE WHEN HONO_SEJ = 'true' THEN PART_MUT ELSE 0 END) AS TT_HON_AMC,
SUM(CASE WHEN HONO_SEJ = 'true' THEN PART_ASS ELSE 0 END) AS TT_HON_PAT,
SUM(CASE WHEN HONO_SEJ = 'true' THEN LC_HON ELSE 0 END) AS TC_HON,
SUM(CASE WHEN HONO_SEJ = 'true' THEN LC_HON_AMO ELSE 0 END) AS TC_HON_AMO,
SUM(CASE WHEN HONO_SEJ = 'true' THEN LC_HON_AMC ELSE 0 END) AS TC_HON_AMC,
SUM(CASE WHEN HONO_SEJ = 'true' THEN LC_HON_PAT ELSE 0 END) AS TC_HON_PAT
FROM w_LIGNES_FACTURES
GROUP BY 1
) subview
WHERE subview.NUM_FACT = w_FACTURES.NUM_FACT AND
(
w_FACTURES.TT_SEJ IS DISTINCT FROM subview.TT_SEJ OR
w_FACTURES.TT_SEJ_AMO IS DISTINCT FROM subview.TT_SEJ_AMO OR
w_FACTURES.TT_SEJ_AMC IS DISTINCT FROM subview.TT_SEJ_AMC OR
w_FACTURES.TT_SEJ_PAT IS DISTINCT FROM subview.TT_SEJ_PAT OR
w_FACTURES.TC_HON IS DISTINCT FROM subview.TC_HON OR
w_FACTURES.TC_HON_AMO IS DISTINCT FROM subview.TC_HON_AMO OR
w_FACTURES.TC_HON_AMC IS DISTINCT FROM subview.TC_HON_AMC OR
w_FACTURES.TC_HON_PAT IS DISTINCT FROM subview.TC_HON_PAT OR
w_FACTURES.TT_HONO IS DISTINCT FROM subview.TT_HON OR
w_FACTURES.TT_HON_AMO IS DISTINCT FROM subview.TT_HON_AMO OR
w_FACTURES.TT_HON_AMC IS DISTINCT FROM subview.TT_HON_AMC OR
w_FACTURES.TT_HON_PAT IS DISTINCT FROM subview.TT_HON_PAT
)
;
DROP TABLE IF EXISTS w_REGLEMENTS;
CREATE TEMP TABLE w_REGLEMENTS AS
SELECT REGLEMENTS.NUMFACT::text,
REGLEMENTS.DATE_REGLE,
REGLEMENTS.MTCAISS,
REGLEMENTS.MTMUT,
REGLEMENTS.MTASS,
REGLEMENTS.MTTOTAL,
REGLEMENTS.NUMPAT,
REGLEMENTS.MEDECIN,
REGLEMENTS.NUMBORD,
REGLEMENTS.PRESTATION,
REGLEMENTS.NUMCAISS,
REGLEMENTS.NUM_SOC,
CASE WHEN MEDECIN = 'SEJOUR' THEN 'false'::text ELSE 'true' END AS HONO_SEJ,
0::bigint AS NUM_ACTE,
''::text AS medecin_executant_code_original
FROM prod_hemat2a.REGLEMENTS
JOIN w_FACTURES ON w_FACTURES.NUM_FACT = REGLEMENTS.NUMFACT
;
ANALYSE w_REGLEMENTS
;
UPDATE w_REGLEMENTS
SET HONO_SEJ = subview.HONO_SEJ
FROM
(
SELECT PRESTATION, MAX(HONO_SEJ) AS HONO_SEJ
FROM w_LIGNES_FACTURES
GROUP BY 1
) subview
WHERE w_REGLEMENTS.PRESTATION = subview.PRESTATION AND
w_REGLEMENTS.HONO_SEJ IS DISTINCT FROM subview.HONO_SEJ
;
UPDATE w_REGLEMENTS
SET NUM_ACTE = subview.NUM_ACTE
FROM
(
SELECT NUM_FACT, PRESTATION, MAX(NUM_ACTE) AS NUM_ACTE
FROM w_LIGNES_FACTURES
GROUP BY 1,2
) subview
WHERE w_REGLEMENTS.NUMFACT = subview.NUM_FACT AND
w_REGLEMENTS.PRESTATION = subview.PRESTATION
;
UPDATE w_REGLEMENTS
SET medecin_executant_code_original = MEDECINS.NUM_MED::text
FROM prod_hemat2a.MEDECINS
WHERE HONO_SEJ = 'true' AND
MEDECIN = MEDECINS.NOM AND
medecin_executant_code_original = ''
;
UPDATE w_FACTURES SET
DATE_REGLE = subview.DATE_REGLE,
TR_SEJ = subview.TR_SEJ,
TR_SEJ_AMO = subview.TR_SEJ_AMO,
TR_SEJ_AMC = subview.TR_SEJ_AMC,
TR_SEJ_PAT = subview.TR_SEJ_PAT,
TR_HON = subview.TR_HON,
TR_HON_AMO = subview.TR_HON_AMO,
TR_HON_AMC = subview.TR_HON_AMC,
TR_HON_PAT = subview.TR_HON_PAT
FROM
(
SELECT NUMFACT AS NUM_FACT,
MAX(DATE_REGLE) AS DATE_REGLE,
SUM(CASE WHEN HONO_SEJ = 'false' THEN MTTOTAL ELSE 0 END) AS TR_SEJ,
SUM(CASE WHEN HONO_SEJ = 'false' THEN MTCAISS ELSE 0 END) AS TR_SEJ_AMO,
SUM(CASE WHEN HONO_SEJ = 'false' THEN MTMUT ELSE 0 END) AS TR_SEJ_AMC,
SUM(CASE WHEN HONO_SEJ = 'false' THEN MTASS ELSE 0 END) AS TR_SEJ_PAT,
SUM(CASE WHEN HONO_SEJ = 'true' THEN MTTOTAL ELSE 0 END) AS TR_HON,
SUM(CASE WHEN HONO_SEJ = 'true' THEN MTCAISS ELSE 0 END) AS TR_HON_AMO,
SUM(CASE WHEN HONO_SEJ = 'true' THEN MTMUT ELSE 0 END) AS TR_HON_AMC,
SUM(CASE WHEN HONO_SEJ = 'true' THEN MTASS ELSE 0 END) AS TR_HON_PAT
FROM w_REGLEMENTS
GROUP BY 1
) subview
WHERE subview.NUM_FACT = w_FACTURES.NUM_FACT
;
-- Ménage dans les factures anciennes
DELETE FROM w_factures
WHERE date(SEJOUR_AU) < '20150101'
;
DELETE FROM w_FACTURES
USING
(
SELECT NUM_PAT,
date(COALESCE(MAX(CASE WHEN SEJOUR_DU <= '20190101' AND TT_SEJ <> TR_SEJ THEN SEJOUR_DU ELSE NULL END),'20190101')) AS SEJOUR_DU
FROM w_FACTURES
GROUP BY 1
) subview
WHERE w_FACTURES.NUM_PAT = subview.NUM_PAT AND
w_FACTURES.SEJOUR_DU < subview.SEJOUR_DU
;
-- Traitement des avoirs
-- Regul sans avoir précisé, il faut tenter de le retrouver
UPDATE w_FACTURES
SET AVOIR_FACTINITIALE = subview.AVOIR_FACTINITIALE
FROM
(
SELECT w_FACTURES.NUM_FACT, MIN(w_FACTURES_avoir.NUM_FACT) AS AVOIR_FACTINITIALE
FROM w_FACTURES
JOIN w_FACTURES w_FACTURES_avoir ON
w_FACTURES.NUM_PAT = w_FACTURES_avoir.NUM_PAT AND
w_FACTURES.SEJOUR_DU_D = w_FACTURES_avoir.SEJOUR_DU_D AND
w_FACTURES.SEJOUR_AU_D = w_FACTURES_avoir.SEJOUR_AU_D AND
w_FACTURES.NUM_FACT > w_FACTURES_avoir.NUM_FACT
WHERE w_FACTURES.REGUL_POSITIVE = 'true' AND
w_FACTURES.AVOIR_FACTINITIALE = '0'
GROUP BY 1
) subview
WHERE w_FACTURES.NUM_FACT = subview.NUM_FACT
;
-- Ajout des avoirs
INSERT INTO w_FACTURES
SELECT
w_FACTURES.NUM_PAT,
w_FACTURES.NUM_FACT || 'A'::text AS NUM_FACT,
w_FACTURES_regul.VALID,
0-w_FACTURES.TT_SEJ,
0-w_FACTURES.TT_HONO,
0-w_FACTURES.MT_CAISSE,
0-w_FACTURES.MT_MUT,
0-w_FACTURES.MT_ASS,
w_FACTURES_regul.DATE_EDITION,
w_FACTURES_regul.DATE_TRANSMIS,
w_FACTURES_regul.EDITE,
w_FACTURES_regul.TRANSMIS,
w_FACTURES_regul.NUM_BORDEREAU,
w_FACTURES_regul.DATE_GENE_CPT,
w_FACTURES_regul.GENE_CPT,
w_FACTURES_regul.NUM_JNL,
w_FACTURES_regul.RAPPEL,
w_FACTURES_regul.COMPLET,
'autocti'::text AS AVOIR,
w_FACTURES.SEJOUR_DU,
w_FACTURES.SEJOUR_AU,
0-w_FACTURES.MT_TT,
w_FACTURES.NUM_CAISSE,
w_FACTURES.NUM_SOC,
w_FACTURES_regul.TELETRANS,
w_FACTURES_regul.NUMLOT,
w_FACTURES.GENAUTO,
'false'::text AS REGUL_POSITIVE,
'true'::text AS REGUL_NEGATIVE,
w_FACTURES.CPT_ANA,
w_FACTURES.NBR_ACT_DIAL,
w_FACTURES.MUTUELLE,
w_FACTURES.NUM_MUTUELLE,
w_FACTURES.NUM_FACT AS AVOIR_FACTINITIALE,
w_FACTURES.FORCER_ARCHIVAGE,
0::numeric AS AVOIR_NUMFACT,
'0'::text AS FACT_last,
w_FACTURES.SEJOUR_DU_D,
w_FACTURES.SEJOUR_AU_D,
'0'::text AS gen_sejour,
w_FACTURES_regul.date_vente,
0-w_FACTURES.TT_SEJ_AMO,
0-w_FACTURES.TT_SEJ_AMC,
0-w_FACTURES.TT_SEJ_PAT,
0-w_FACTURES.TT_HON_AMO,
0-w_FACTURES.TT_HON_AMC,
0-w_FACTURES.TT_HON_PAT,
0-w_FACTURES.TC_HON,
0-w_FACTURES.TC_HON_AMO,
0-w_FACTURES.TC_HON_AMC,
0-w_FACTURES.TC_HON_PAT,
w_FACTURES_regul.DATE_REGLE,
0-w_FACTURES.TR_SEJ,
0-w_FACTURES.TR_SEJ_AMO,
0-w_FACTURES.TR_SEJ_AMC,
0-w_FACTURES.TR_SEJ_PAT,
0-w_FACTURES.TR_HON,
0-w_FACTURES.TR_HON_AMO,
0-w_FACTURES.TR_HON_AMC,
0-w_FACTURES.TR_HON_PAT
FROM w_FACTURES
JOIN w_FACTURES w_FACTURES_regul ON w_FACTURES.NUM_FACT = w_FACTURES_regul.AVOIR_FACTINITIALE
;
INSERT INTO w_LIGNES_FACTURES
SELECT
w_FACTURES.NUM_FACT::text,
w_LIGNES_FACTURES.PRESTATION,
w_LIGNES_FACTURES.NUM_ACTE,
w_LIGNES_FACTURES.SEJOUR_DU,
w_LIGNES_FACTURES.SEJOUR_AU,
0-w_LIGNES_FACTURES.QUANTITE,
w_LIGNES_FACTURES.COEF,
w_LIGNES_FACTURES.PRIX_UNIT,
w_LIGNES_FACTURES.MAJORATION,
0-w_LIGNES_FACTURES.MT_FACT,
0-w_LIGNES_FACTURES.BASE_REMB,
0-w_LIGNES_FACTURES.DEPASS,
0-w_LIGNES_FACTURES.PART_CAISSE,
0-w_LIGNES_FACTURES.PART_MUT,
0-w_LIGNES_FACTURES.PART_ASS,
w_LIGNES_FACTURES.EXECUTANT,
w_LIGNES_FACTURES.DENOMBREMENT,
w_LIGNES_FACTURES.RMO,
w_LIGNES_FACTURES.NUM_PAT,
w_LIGNES_FACTURES.NUM_EXE,
w_LIGNES_FACTURES.CPT_COMPTA,
w_LIGNES_FACTURES.DMT,
w_LIGNES_FACTURES.CODE_TVA,
w_LIGNES_FACTURES.NUM_LIG,
w_LIGNES_FACTURES.HONO_SEJ,
w_LIGNES_FACTURES.CT_EPO,
w_LIGNES_FACTURES.XMT_EPO,
w_LIGNES_FACTURES.CODIF_AFF,
w_LIGNES_FACTURES.NUM_SOC,
w_LIGNES_FACTURES.TIERPERS,
w_LIGNES_FACTURES.FELEC,
w_LIGNES_FACTURES.TYPE_PRODUIT,
w_LIGNES_FACTURES.DATE_PRESCRIPTION_PRODUIT,
w_LIGNES_FACTURES.PRIX_UNIT_NATIONAL,
w_LIGNES_FACTURES.COEF_NATIONAL,
w_LIGNES_FACTURES.COEF_REGIONAL,
w_LIGNES_FACTURES.ACTE_PMSI,
w_LIGNES_FACTURES.CODE_PRODUIT,
w_LIGNES_FACTURES.TYPE_ETI,
w_LIGNES_FACTURES.CODE_ASSOCIATION,
w_LIGNES_FACTURES.NUM_PRODUIT,
w_LIGNES_FACTURES.ID_CLEFPRIMAIRE,
w_LIGNES_FACTURES.FINESS_ETAB_DESTINATAIRE,
w_LIGNES_FACTURES.medecin_executant_code_original,
w_LIGNES_FACTURES.service_facturation_code_original,
w_LIGNES_FACTURES.unite_fonctionnelle_code_original,
0-w_LIGNES_FACTURES.LC_HON,
0-w_LIGNES_FACTURES.LC_HON_AMO,
0-w_LIGNES_FACTURES.LC_HON_AMC,
0-w_LIGNES_FACTURES.LC_HON_PAT
FROM w_LIGNES_FACTURES
JOIN w_FACTURES ON w_LIGNES_FACTURES.NUM_FACT || 'A'::text = w_FACTURES.NUM_FACT
;
INSERT INTO w_REGLEMENTS
SELECT
w_FACTURES.NUM_FACT,
w_FACTURES.date_vente AS DATE_REGLE,
0-w_REGLEMENTS.MTCAISS,
0-w_REGLEMENTS.MTMUT,
0-w_REGLEMENTS.MTASS,
0-w_REGLEMENTS.MTTOTAL,
w_REGLEMENTS.NUMPAT,
w_REGLEMENTS.MEDECIN,
w_REGLEMENTS.NUMBORD,
w_REGLEMENTS.PRESTATION,
w_REGLEMENTS.NUMCAISS,
w_REGLEMENTS.NUM_SOC,
w_REGLEMENTS.HONO_SEJ,
w_REGLEMENTS.NUM_ACTE,
w_REGLEMENTS.medecin_executant_code_original
FROM w_REGLEMENTS
JOIN w_FACTURES ON w_REGLEMENTS.NUMFACT || 'A'::text = w_FACTURES.NUM_FACT
;
UPDATE w_FACTURES
SET AVOIR = 'autocti'
WHERE NUM_FACT IN (SELECT AVOIR_FACTINITIALE FROM w_FACTURES) AND
AVOIR = 'false'
;
DROP TABLE IF EXISTS w_ASSURES;
CREATE TEMP TABLE w_ASSURES AS
SELECT
NUM_PAT
, NOM
, PRENOM
, NOM_JF
, CP
, DATE_NAISS
, SEXE
, CAISSE_NUM
, MUT_NUM
, NUM_SOCIETE::text AS service_facturation_code_original
, NUM_SECU
, 'N'::text AS OK
, NULL::date AS date_entree
, NULL::date AS date_sortie
, 0::numeric AS code_sorti
, ''::text AS medecin_sejour_code_original
, ''::text AS unite_fonctionnelle_code_original
, ''::text AS ghm_code
, 0::numeric AS ghs_code
FROM prod_hemat2a.ASSURES
WHERE NUM_PAT IN (SELECT NUM_PAT FROM w_FACTURES)
;
ANALYSE w_ASSURES
;
UPDATE w_ASSURES
SET OK = 'O'
WHERE NUM_PAT IN (
SELECT NUM_PAT FROM w_FACTURES
WHERE SEJOUR_DU >= '20190101' OR
DATE_EDITION >= '20190101' OR
DATE_TRANSMIS >= '20190101'
)
;
UPDATE w_ASSURES
SET OK = 'O'
WHERE OK = 'N' AND
NUM_PAT IN (
SELECT NUM_PAT
FROM w_FACTURES
JOIN prod_hemat2a.REGLEMENTS ON w_FACTURES.NUM_FACT = REGLEMENTS.NUMFACT
WHERE REGLEMENTS.DATE_REGLE >= '20190101'
)
;
UPDATE w_ASSURES SET
date_entree = subview.date_entree,
date_sortie = subview.date_sortie,
code_sorti = subview.code_sorti,
CAISSE_NUM = subview.NUM_CAISSE,
MUT_NUM = subview.NUM_MUTUELLE
FROM
(
SELECT w_FACTURES.NUM_PAT,
date(MIN(SEJOUR_DU)) AS date_entree,
CASE WHEN MAX(date_extraction) - date(MAX(LEAST(now(),SEJOUR_AU))) > 30 THEN date(MAX(LEAST(now(),SEJOUR_AU))) ELSE '20991231' END AS date_sortie,
CASE WHEN MAX(date_extraction) - date(MAX(LEAST(now(),SEJOUR_AU))) > 30 THEN 1 ELSE 0 END AS code_sorti,
(MAX(ARRAY[SEJOUR_AU::text,NUM_CAISSE::text]))[2]::numeric AS NUM_CAISSE,
(MAX(ARRAY[SEJOUR_AU::text,NUM_MUTUELLE::text]))[2]::numeric AS NUM_MUTUELLE
FROM w_FACTURES
JOIN w_ASSURES ON w_FACTURES.NUM_PAT = w_ASSURES.NUM_PAT
JOIN w_periode ON 1=1
WHERE OK = 'O'
GROUP BY 1
) subview
WHERE w_ASSURES.NUM_PAT = subview.NUM_PAT
;
UPDATE w_ASSURES SET
service_facturation_code_original = subview.service_facturation_code_original,
unite_fonctionnelle_code_original = subview.unite_fonctionnelle_code_original,
ghm_code = CASE WHEN subview.ghm_code <> '' THEN '28'::text||subview.ghm_code ELSE '' END,
ghs_code = CASE WHEN subview.ghm_code <> '' THEN CASE WHEN subview.ghs_code <> '0' THEN subview.ghs_code::numeric ELSE 9999 END ELSE 0 END
FROM
(
SELECT w_FACTURES.NUM_PAT,
(MAX(ARRAY[w_LIGNES_FACTURES.SEJOUR_AU::text,w_LIGNES_FACTURES.service_facturation_code_original]))[2] AS service_facturation_code_original,
(MAX(ARRAY[w_LIGNES_FACTURES.SEJOUR_AU::text,w_LIGNES_FACTURES.unite_fonctionnelle_code_original]))[2] AS unite_fonctionnelle_code_original,
(MAX(ARRAY[w_LIGNES_FACTURES.SEJOUR_AU::text,RUBRIQUE_FACTUR.PMSI_GHM_ASSOCIE]))[2] AS ghm_code,
(MAX(ARRAY[w_LIGNES_FACTURES.SEJOUR_AU::text,COALESCE(RUBRIQUE_FACTUR.NUMEROGHS,'0')::text]))[2]::numeric AS ghs_code
FROM w_FACTURES
JOIN w_ASSURES ON w_FACTURES.NUM_PAT = w_ASSURES.NUM_PAT
JOIN w_LIGNES_FACTURES ON w_FACTURES.NUM_FACT = w_LIGNES_FACTURES.NUM_FACT
LEFT JOIN prod_hemat2a.RUBRIQUE_FACTUR ON w_LIGNES_FACTURES.NUM_ACTE = RUBRIQUE_FACTUR.NUM_ACTE
WHERE OK = 'O' AND
w_LIGNES_FACTURES.HONO_SEJ = 'false' AND
w_LIGNES_FACTURES.PRESTATION LIKE 'D%' AND
w_LIGNES_FACTURES.PRESTATION NOT LIKE 'DTP'
GROUP BY 1
) subview
WHERE w_ASSURES.NUM_PAT = subview.NUM_PAT
;
UPDATE w_ASSURES
SET medecin_sejour_code_original = subview.medecin_sejour_code_original
FROM
(
SELECT NUM_PAT, (MAX(ARRAY[SEJOUR_AU::text, medecin_executant_code_original]))[2] AS medecin_sejour_code_original
FROM w_LIGNES_FACTURES
JOIN prod_hemat2a.MEDECINS ON medecin_executant_code_original = NUM_MED::text
WHERE HONO_SEJ = 'true' AND
specialite <> 30
GROUP BY 1
) subview
WHERE w_ASSURES.NUM_PAT = subview.NUM_PAT
;
]]>
''
GROUP BY 1;
INSERT INTO activite.t_tiers_payant(oid, code, code_original, type_tiers_payant, texte, texte_court)
SELECT 0, '', '', '0', 'Non saisi', 'Non saisi'
WHERE 0 NOT IN (SELECT oid FROM activite.t_tiers_payant);
INSERT INTO activite.t_tiers_payant(code, code_original, type_tiers_payant, texte, texte_court)
SELECT 'PATIENTS', '0', '0', 'Patients', 'Patients'
WHERE '0' NOT IN (SELECT code_original FROM activite.t_tiers_payant);
INSERT INTO activite.t_tiers_payant(code_original, code, type_tiers_payant, texte, texte_court)
SELECT NUMERO::text, to_char(NUMERO,'FM9990000'), '1'::text, NOM, NOM
FROM prod_hemat2a.CAISSES
WHERE NUMERO IN (SELECT NUM_CAISSE FROM w_FACTURES) AND
NUMERO::text NOT IN (SELECT code_original FROM activite.t_tiers_payant WHERE code_original IS NOT NULL)
;
INSERT INTO activite.t_tiers_payant(code_original, code, type_tiers_payant, texte, texte_court)
SELECT NUMERO::text||'M', to_char(NUMERO,'FM9990000')||'M', '2'::text, NOM, NOM
FROM prod_hemat2a.CAISSES
WHERE NUMERO IN (SELECT NUM_MUTUELLE FROM w_FACTURES) AND
NUMERO::text||'M' NOT IN (SELECT code_original FROM activite.t_tiers_payant WHERE code_original IS NOT NULL)
;
UPDATE activite.t_tiers_payant
SET grand_regime_id = t_grands_regimes.oid
FROM prod_hemat2a.CAISSES
JOIN base.t_grands_regimes ON CODEGR = code
WHERE t_tiers_payant.code_original = NUMERO AND
grand_regime_id IS DISTINCT FROM t_grands_regimes.oid AND
CODEGR <> '';
UPDATE activite.t_tiers_payant
SET grand_regime_id = t_grands_regimes.oid
FROM prod_hemat2a.CAISSES
JOIN base.t_grands_regimes ON CODEGR = code
WHERE t_tiers_payant.code_original = NUMERO::text||'M' AND
grand_regime_id IS DISTINCT FROM t_grands_regimes.oid AND
CODEGR <> '';
]]>
w_medecins.NOM OR
t_medecins_administratifs.prenom <> w_medecins.PRENOM OR
t_medecins_administratifs.specialite_id <> COALESCE(t_specialites_medecin.oid,t_specialites_medecin_2.oid,0) OR
t_medecins_administratifs.medecin_id <> w_medecins.medecin_id
);
UPDATE activite.t_medecins_administratifs
SET specialite_id = subview.specialite_medecin_id
FROM
(
SELECT t_medecins_administratifs.oid,t_specialites_medecin.oid AS specialite_medecin_id
FROM activite.t_medecins_administratifs
JOIN base.t_specialites_medecin t_specialites_medecin_2 ON specialite_id = t_specialites_medecin_2.oid
JOIN base.t_specialites_medecin ON t_specialites_medecin_2.code || '..' = t_specialites_medecin.code
) subview
WHERE t_medecins_administratifs.oid = subview.oid;
UPDATE base.t_medecins SET specialite_id = subview.specialite_id FROM
(SELECT t_medecins.oid, MIN(t_medecins_administratifs.specialite_id) as specialite_id
FROM base.t_medecins, activite.t_medecins_administratifs , base.t_specialites_medecin
WHERE t_medecins.oid = t_medecins_administratifs.medecin_id
AND t_medecins_administratifs.specialite_id = t_specialites_medecin.oid
GROUP BY t_medecins.oid) subview
WHERE t_medecins.oid = subview.oid AND t_medecins.oid <> 0 AND t_medecins.specialite_id = 0;
-- no_adeli
UPDATE activite.t_medecins_administratifs
SET no_adeli = ADELIE
FROM prod_hemat2a.MEDECINS
WHERE t_medecins_administratifs.code_original = NUM_MED::text AND
t_medecins_administratifs.NO_ADELI IS DISTINCT FROM ADELIE
;
]]>
'' THEN LIBELLE_ACTE ELSE COALESCE(t_prestations.code,CODE_CETEL) END) AS texte
FROM w_RUBRIQUE_FACTUR_source
LEFT JOIN activite.t_prestations ON CODE_CETEL = t_prestations.code
WHERE PRESTATION <> ''
GROUP BY 1
ORDER BY 1
;
INSERT INTO activite.t_rubriques_facturation(code_original, code, texte, texte_court)
SELECT code_original, code_original, texte, texte
FROM w_rubriques_facturation
WHERE code_original NOT IN (SELECT code_original FROM activite.t_rubriques_facturation)
;
INSERT INTO activite.t_prestations(code, code_original, texte, texte_court)
SELECT CODE_CETEL, CODE_CETEL,CODE_CETEL, CODE_CETEL
FROM w_RUBRIQUE_FACTUR_source
WHERE CODE_CETEL NOT IN (SELECT code FROM activite.t_prestations WHERE code IS NOT NULL)
GROUP BY 1
;
INSERT INTO activite.t_protocoles(oid, code_original, code, texte, texte_court)
SELECT 0, 0, '***', 'Non renseigné', 'Non renseigné' WHERE 0 NOT IN (SELECT oid FROM activite.t_protocoles);
INSERT INTO base.t_actes(code, texte, texte_court, nomenclature)
SELECT
UPPER(CODE_CCAM),
UPPER(CODE_CCAM),
UPPER(CODE_CCAM),
'CCAM'
FROM w_RUBRIQUE_FACTUR_source
WHERE
CODE_CCAM <> '' AND
UPPER(CODE_CCAM) NOT IN (SELECT code FROM base.t_actes WHERE code IS NOT NULL)
GROUP BY UPPER(CODE_CCAM)
;
INSERT INTO base.t_actes(code, texte, texte_court, nomenclature)
SELECT
CODE_CETEL,
CODE_CETEL,
CODE_CETEL,
'NGAP'
FROM w_RUBRIQUE_FACTUR_source
WHERE
HONO_SEJ = 'true' AND
ACTE_CCAM = 'false' AND
CODE_CETEL NOT IN (SELECT code FROM base.t_actes WHERE code IS NOT NULL)
GROUP BY CODE_CETEL
;
INSERT INTO activite[PX].t_compte(oid, code_original, code, texte, texte_court)
SELECT 0, 0, '', 'Non renseigné', 'Non renseigné' WHERE 0 NOT IN (SELECt oid FROM activite[PX].t_compte);
INSERT INTO activite.t_compte(code_original, code, texte, texte_court)
SELECT CPT_COMPTA,CPT_COMPTA, CPT_COMPTA, CPT_COMPTA
FROM w_RUBRIQUE_FACTUR_source
WHERE CPT_COMPTA <> '' AND
CPT_COMPTA NOT IN (SELECT code FROM activite.t_compte WHERE code IS NOT NULL)
GROUP BY 1
ORDER BY 1;
INSERT INTO activite.t_compte(code_original, code, texte, texte_court)
SELECT CPT_COMPTA,CPT_COMPTA, CPT_COMPTA, CPT_COMPTA
FROM w_LIGNES_FACTURES
WHERE CPT_COMPTA <> '' AND
CPT_COMPTA NOT IN (SELECT code FROM activite.t_compte WHERE code IS NOT NULL)
GROUP BY 1
ORDER BY 1;
UPDATE w_RUBRIQUE_FACTUR_source
SET rubrique_facturation_id = t_rubriques_facturation.oid
FROM activite.t_rubriques_facturation
WHERE PRESTATION = t_rubriques_facturation.code_original
;
UPDATE w_RUBRIQUE_FACTUR_source
SET prestation_id = t_prestations.oid
FROM activite.t_prestations
WHERE CODE_CETEL = t_prestations.code
;
UPDATE w_RUBRIQUE_FACTUR_source
SET acte_id = t_actes.oid
FROM base.t_actes
WHERE CODE_CETEL = t_actes.code AND
HONO_SEJ = 'true'
;
UPDATE w_RUBRIQUE_FACTUR_source
SET acte_id = t_actes.oid
FROM base.t_actes
WHERE CODE_CCAM = t_actes.code AND
HONO_SEJ = 'true' AND
CODE_CCAM <> ''
;
UPDATE w_RUBRIQUE_FACTUR_source
SET compte_produit_id = t_compte.oid
FROM activite.t_compte
WHERE CPT_COMPTA = t_compte.code AND
CPT_COMPTA <> ''
;
]]>