'1'
WHERE MVT_TYPE IN (1,4) AND
LIT_OID <> 0 AND
LIT_OID = MVT_LIT AND
CHA_UF <> MVT_UF_GEO;
-- Unité de soin non renseignée -> attribution de l'unité géo
UPDATE w_REGUL_MOUVEMENTS_source REGUL_MOUVEMENTS
SET MVT_UF_SOIN = MVT_UF_GEO
WHERE MVT_UF_SOIN = 0 AND MVT_UF_GEO <> 0 AND MVT_TYPE IN (1,4);
-- Unité geo non renseignée -> attribution de l'unité de soin
UPDATE w_REGUL_MOUVEMENTS_source REGUL_MOUVEMENTS
SET MVT_UF_GEO = MVT_UF_SOIN
WHERE MVT_UF_SOIN <> 0 AND MVT_UF_GEO = 0 AND MVT_TYPE IN (1,4);
-- Pointage de mouvements en double
DROP TABLE IF EXISTS w_REGUL_MOUVEMENTS_double;
CREATE TEMP TABLE w_REGUL_MOUVEMENTS_double AS
SELECT MVT_SEJ_OID, MVT_DATE,
(MAX(ARRAY[MVT_INDEX,MVT_RESP]))[2] AS MVT_RESP,
(MAX(ARRAY[MVT_INDEX,MVT_UF_SOIN]))[2] AS MVT_UF_SOIN,
(MAX(ARRAY[MVT_INDEX,MVT_UF_GEO]))[2] AS MVT_UF_GEO,
(MAX(ARRAY[MVT_INDEX,MVT_CHAMBRE]))[2] AS MVT_CHAMBRE,
(MAX(ARRAY[MVT_INDEX,MVT_LIT]))[2] AS MVT_LIT,
MIN(MVT_OID) AS MVT_OID
FROM w_REGUL_MOUVEMENTS_source REGUL_MOUVEMENTS
WHERE MVT_TYPE IN (1,4)
GROUP BY 1,2
HAVING count(*) > 1;
UPDATE w_REGUL_MOUVEMENTS_source REGUL_MOUVEMENTS SET
MVT_RESP = w_REGUL_MOUVEMENTS_double.MVT_RESP,
MVT_UF_SOIN = w_REGUL_MOUVEMENTS_double.MVT_UF_SOIN,
MVT_UF_GEO = w_REGUL_MOUVEMENTS_double.MVT_UF_GEO,
MVT_CHAMBRE = w_REGUL_MOUVEMENTS_double.MVT_CHAMBRE,
MVT_LIT = w_REGUL_MOUVEMENTS_double.MVT_LIT
FROM w_REGUL_MOUVEMENTS_double
WHERE REGUL_MOUVEMENTS.MVT_SEJ_OID = w_REGUL_MOUVEMENTS_double.MVT_SEJ_OID AND
REGUL_MOUVEMENTS.MVT_DATE = w_REGUL_MOUVEMENTS_double.MVT_DATE AND
REGUL_MOUVEMENTS.MVT_OID = w_REGUL_MOUVEMENTS_double.MVT_OID AND
REGUL_MOUVEMENTS.MVT_TYPE IN (1,4);
UPDATE w_REGUL_MOUVEMENTS_source REGUL_MOUVEMENTS SET
MVT_TYPE = 49
FROM w_REGUL_MOUVEMENTS_double
WHERE REGUL_MOUVEMENTS.MVT_SEJ_OID = w_REGUL_MOUVEMENTS_double.MVT_SEJ_OID AND
REGUL_MOUVEMENTS.MVT_DATE = w_REGUL_MOUVEMENTS_double.MVT_DATE AND
REGUL_MOUVEMENTS.MVT_OID <> w_REGUL_MOUVEMENTS_double.MVT_OID AND
REGUL_MOUVEMENTS.MVT_TYPE IN (1,4);
-- UF selon mode de calcul PMSI (Cas des retrocessions,FSD,FFM)
DROP TABLE IF EXISTS w_DIM_MODE_FACT_default
;
CREATE TEMP TABLE w_DIM_MODE_FACT_default AS
SELECT DA_DIM_MODE_FACT,
MAX(NMCL_UNITEFONCTIONNELLE.OID::bigint) AS UF_OID,
count(*)
FROM prod_web100t.NMCL_UNITEFONCTIONNELLE
JOIN w_SGN_NMCL_DATA ON ND_INVARIANT_OID = OID
JOIN prod_web100t.DAT_DA ON
DA_DIM_MODE_FACT IN ('FSE','FSD','FFM','RETRO') AND
DA_DIM_MODE_FACT = ND_CODE
WHERE NMCL_IDENT = 'UNITEFONCTIONNELLE'
GROUP BY 1
;
ANALYSE w_DIM_MODE_FACT_default
;
UPDATE w_REGUL_MOUVEMENTS_source REGUL_MOUVEMENTS
SET MVT_UF_SOIN = UF_OID
FROM prod_web100t.DAT_SEJOUR
JOIN prod_web100t.DAT_DA ON SEJ_DA = DA_OID
JOIN w_DIM_MODE_FACT_default ON w_DIM_MODE_FACT_default.DA_DIM_MODE_FACT = DAT_DA.DA_DIM_MODE_FACT
WHERE PHASE_OID = MVT_SEJ_OID AND
MVT_TYPE IN (1,2,4) AND
MVT_UF_SOIN = 0
;
UPDATE w_REGUL_MOUVEMENTS_source REGUL_MOUVEMENTS
SET MVT_UF_SOIN = UF_OID
FROM prod_web100t.DAT_SEJOUR
JOIN prod_web100t.DAT_DA ON SEJ_DA = DA_OID
JOIN w_DIM_MODE_FACT_default ON w_DIM_MODE_FACT_default.DA_DIM_MODE_FACT = DAT_DA.DA_SUGG_MODE_FACT
WHERE PHASE_OID = MVT_SEJ_OID AND
MVT_TYPE IN (1,2,4) AND
MVT_UF_SOIN = 0
;
-- Statut séjour présent alors que facturé depuis plus de 6 mois
UPDATE prod_web100T.DAT_DA
SET DA_STATUT = '3'
WHERE DA_DATE_FIN <= now() - interval '2 month' AND
DA_DATE_FIN >= DA_DATE_DEBUT AND
DA_STATUT = 2 AND
DA_DIM_VALID <= now() - interval '2 month' AND
DA_OID = ANY (ARRAY(SELECT DISTINCT FACT_DA FROM prod_web100T.FAC_FACTURE WHERE FACT_DATE <= now() - interval '2 month')::double precision[])
;
-- Sejour ambulatoire présent à convertir en sorti
UPDATE PROD_WEB100T.DAT_DA SET
DA_STATUT = CASE WHEN DA_STATUT < 3 THEN 3 ELSE DA_STATUT END,
DA_DATE_FIN = DA_DATE_DEBUT,
DA_HEURE_FIN = LEAST(DA_HEURE_DEBUT + 0.2,0.9)
WHERE
DA_STATUT >= 2 AND
DA_CLASSE IN (2,3) AND
DA_DATE_FIN IS NULL
;
-- Forcage code prestation
UPDATE prod_web100t.FAC_FACT_LIGNE_TIER SET
FLT_CODE_PREST = t_prestations.code
FROM activite[PX].t_rubriques_facturation
JOIN activite.t_prestations ON prestation_forcee_id = t_prestations.oid AND prestation_forcee_id <> 0
WHERE FLT_ARTICLE::text = t_rubriques_facturation.code_original
;
-- Placer l'heure dans les lignes d'actes
-- Parametre car trop long sur certains sites (CCN)
INSERT INTO activite.t_divers (code, texte, valeur, description)
SELECT
'WEB100T_INITHEUREACTE',
'Recuperation heures des actes',
'1',
'1=Les heures des actes son recuperees'
WHERE 'WEB100T_INITHEUREACTE' NOT IN (SELECT code FROM activite.t_divers);
;
-- en attendant de trouver la bonnjointure
DROP TABLE IF EXISTS w_heures_actes;
CREATE TEMP TABLE w_heures_actes AS
SELECT PREST_DA,
PREST_ARTICLE,
ART_CODE,
PREST_EXECUTANT,
DATE(PREST_DATE_DEBUT) AS PREST_DATE,
MAX(PREST_DATE_DEBUT-date(PREST_DATE_DEBUT)) AS PREST_HEURE,
count(DISTINCT date_part('hour',PREST_DATE_DEBUT)) AS nb_heure
FROM prod_web100t.DAT_PRESTATIONS_GAP
JOIN activite.t_divers ON t_divers.code = 'WEB100T_INITHEUREACTE'
JOIN prod_web100t.ART_ARTICLES ON PREST_ARTICLE = ART_OID
WHERE
t_divers.valeur = '1' AND
PREST_DELETED <> 1 AND
PREST_EXECUTANT > 0 AND
PREST_DATE_DEBUT <> date(PREST_DATE_DEBUT)
GROUP BY 1,2,3,4,5
;
ANALYSE w_heures_actes
;
UPDATE prod_web100t.FAC_FACT_LIGNE_TIER
SET FLT_DATE_DEBUT = date_trunc('day',FLT_DATE_DEBUT) + PREST_HEURE
FROM prod_web100t.FAC_FACTURE,
w_heures_actes
WHERE FLT_FACTURE = FAC_FACTURE.FACT_OID AND
FACT_DA = PREST_DA AND
FLT_ARTICLE = PREST_ARTICLE AND
date(FLT_DATE_DEBUT) = PREST_DATE AND
FLT_INTERVENANT = PREST_EXECUTANT
;
-- Date de règlement selon ecritures comptable
UPDATE prod_web100t.FAC_REGLEMENTS
SET FR_DATE_ENC = ECR_DATE
FROM prod_web100t.FAC_RGLMT_DETAILS
JOIN w_CPT_ECRITURE_source ON RD_COMPTA = ECR_OPERATION
WHERE FR_OID = RD_REGLEMENT AND
FR_DATE_ENC IS NULL AND
FR_DATE_DEPOT_GUESS IS NOT NULL AND
ECR_REF_TYPE = 'FACTURE' AND
ECR_TYPE = 'CLIENT'
;
DROP TABLE IF EXISTS w_max_ECR_UPDATED;
CREATE TEMP TABLE w_max_ECR_UPDATED AS
SELECT MAX(ECR_UPDATED) AS ECR_UPDATED_MAX FROM w_CPT_ECRITURE_source
;
DROP TABLE IF EXISTS w_CPT_ECRITURE_source;
-- Pour identification de la deuxième mutuelle
UPDATE prod_web100t.FAC_FACT_TIER
SET FT_TYPE_TIER = 'AMD'
FROM
(
SELECT FT_FACTURE,
(MIN(ARRAY[abs(ft_total_ets+ft_total_ho),FT_ORGANISME]))[2]::numeric AS FT_ORGANISME_AMD
FROM prod_web100t.FAC_FACT_TIER
WHERE FT_TYPE_TIER = 'AMC'
GROUP BY 1
HAVING count(DISTINCT FT_ORGANISME) > 1
) subview
WHERE FAC_FACT_TIER.FT_FACTURE = subview.FT_FACTURE AND
FAC_FACT_TIER.FT_ORGANISME = subview.FT_ORGANISME_AMD
;
-- Identification des honoraires directs selon compta
DROP TABLE IF EXISTS w_FAC_RGLMT_DETAILS_FACT_LINE;
CREATE TEMP TABLE w_FAC_RGLMT_DETAILS_FACT_LINE AS
SELECT RD_FACT_LINE
FROM prod_web100t.FAC_RGLMT_DETAILS
WHERE RD_ETS = 0
GROUP BY 1
;
ANALYSE w_FAC_RGLMT_DETAILS_FACT_LINE
;
DROP TABLE IF EXISTS w_FAC_FACT_LIGNE_TIER;
CREATE TEMP TABLE w_FAC_FACT_LIGNE_TIER AS
SELECT *,
CASE WHEN FLT_IS_DIRECT <> 1 THEN FLT_TOTAL_TTC ELSE 0 END AS FLT_TOTAL_TTC_comptable,
CASE WHEN RD_FACT_LINE IS NULL THEN '0' ELSE '1' END AS QRGMT
FROM prod_web100t.FAC_FACT_LIGNE_TIER
JOIN prod_web100t.FAC_FACT_TIER ON FLT_FACTURE_TIER = FT_OID
JOIN prod_web100t.FAC_FACTURE ON FLT_FACTURE = FACT_OID
LEFT JOIN w_FAC_RGLMT_DETAILS_FACT_LINE ON RD_FACT_LINE = FLT_OID
WHERE FLT_IS_ETS = 0 AND
(
SELECT count(*)
FROM w_CPT_ECRITURE_source_OP_LINK
JOIN prod_web100t.CPT_COMPTES ON CPT_OID = ECR_COMPTE
WHERE ECR_IS_ETS = 0 AND
LNK_JOURNAL = 'VE' AND
(CPT_CODE LIKE '411%' OR CPT_CODE LIKE '412%')
) > 0
;
ANALYSE w_FAC_FACT_LIGNE_TIER
;
-- Ajout colonne si absente de prod_web100t
SELECT base.cti_execute('ALTER TABLE w_FAC_FACT_LIGNE_TIER ADD COLUMN FLT_PRED_LIGNE bigint',1)
WHERE 'flt_pred_ligne' NOT IN (SELECT column_name FROM information_schema.columns WHERE table_name = 'w_fac_fact_ligne_tier')
;
-- reporter indicateur vente directe dans avoir depuis facture initiale
UPDATE w_FAC_FACT_LIGNE_TIER FAC_FACT_LIGNE_TIER SET
FLT_IS_DIRECT = FAC_FACT_LIGNE_TIER2.FLT_IS_DIRECT,
FLT_TOTAL_TTC_comptable = CASE WHEN FAC_FACT_LIGNE_TIER2.FLT_IS_DIRECT <> 1 THEN FAC_FACT_LIGNE_TIER.FLT_TOTAL_TTC ELSE 0 END
FROM w_FAC_FACT_LIGNE_TIER FAC_FACT_LIGNE_TIER2
WHERE FAC_FACT_LIGNE_TIER.FLT_PRED_LIGNE = FAC_FACT_LIGNE_TIER2.FLT_OID AND
FAC_FACT_LIGNE_TIER.FLT_TOTAL_TTC < 0 AND
FAC_FACT_LIGNE_TIER.FLT_IS_ETS = 0 AND
FAC_FACT_LIGNE_TIER.FLT_IS_DIRECT <> FAC_FACT_LIGNE_TIER2.FLT_IS_DIRECT
;
-- Honoraires directs comptabilisés ?
DROP TABLE IF EXISTS w_ECR_vente_hon;
CREATE TEMP TABLE w_ECR_vente_hon AS
SELECT FT_OID, FACT_NUMERO, MAX(FT_TOTAL_HO) AS FT_TOTAL_HO
FROM w_CPT_ECRITURE_source_OP_LINK
JOIN prod_web100t.CPT_COMPTES ON CPT_OID = ECR_COMPTE
JOIN prod_web100t.FAC_FACT_TIER ON ECR_REF_FTIERS = FT_OID
JOIN prod_web100t.FAC_FACTURE ON FT_FACTURE = FACT_OID
WHERE ECR_IS_ETS = 0 AND
LNK_JOURNAL = 'VE' AND
(CPT_CODE LIKE '411%' OR CPT_CODE LIKE '412%')
GROUP BY 1,2
HAVING MAX(FT_TOTAL_HO) = SUM(ECR_DEBIT-ECR_CREDIT)
;
UPDATE w_FAC_FACT_LIGNE_TIER FAC_FACT_LIGNE_TIER
SET FLT_IS_DIRECT =
CASE
WHEN FLT_FACTURE IN (
SELECT ECR_REF_FACT
FROM w_CPT_ECRITURE_source_OP_LINK
WHERE ECR_TYPE = 'VENTE-DIRECTE'
) THEN -1
WHEN QRGMT = '0' THEN -1
ELSE 0 END,
FLT_TOTAL_TTC_comptable = FLT_TOTAL_TTC
WHERE FLT_FACTURE_TIER =
ANY(
SELECT w_ECR_vente_hon.FT_OID
FROm w_ECR_vente_hon
LEFT JOIN w_FAC_FACT_LIGNE_TIER ON
FLT_FACTURE_TIER = w_ECR_vente_hon.FT_OID AND
FLT_IS_ETS = 0
GROUP BY 1
HAVING round(MAX(w_ECR_vente_hon.FT_TOTAL_HO)::numeric,2) = round(SUM(FLT_TOTAL_TTC)::numeric,2)
) AND
FLT_IS_DIRECT = 1
;
DROP TABLE IF EXISTS w_FLT_INTERVENANT;
CREATE TEMP TABLE w_FLT_INTERVENANT AS
WITH vente_directe AS (
SELECT ECR_REF_FACT
FROM w_CPT_ECRITURE_source_OP_LINK
WHERE ECR_TYPE = 'VENTE-DIRECTE'
),
journal_vente AS (
SELECT ECR_REF_FACT
FROM w_CPT_ECRITURE_source_OP_LINK
WHERE LNK_JOURNAL = 'VE'
)
SELECT FLT_FACTURE,
FACT_NUMERO,
FT_TYPE_TIER,
FLT_INTERVENANT,
round(SUM(FLT_TOTAL_TTC)::numeric,2) AS FLT_TOTAL_TTC,
round(SUM(FLT_TOTAL_TTC_comptable)::numeric,2) AS FLT_TOTAL_TTC_comptable
FROM w_FAC_FACT_LIGNE_TIER FAC_FACT_LIGNE_TIER
LEFT JOIN vente_directe ON vente_directe.ECR_REF_FACT = FLT_FACTURE
LEFT JOIN journal_vente ON journal_vente.ECR_REF_FACT = FLT_FACTURE
WHERE FLT_IS_ETS = 0 AND
FLT_IS_DIRECT >= 0 AND
(
journal_vente.ECR_REF_FACT IS NOT NULL
OR date(FACT_DATE) <= (SELECT date(MAX(ECR_DATE)) FROM w_CPT_ECRITURE_source_OP_LINK WHERE ECR_LOCKED = 1)
)
AND vente_directe.ECR_REF_FACT IS NULL
GROUP BY 1,2,3,4
;
ANALYSE w_FLT_INTERVENANT
;
DROP TABLE IF EXISTS w_ECR_INTERVENANT;
CREATE TEMP TABLE w_ECR_INTERVENANT AS
SELECT ECR_REF_FACT,
FACT_NUMERO,
CASE
WHEN ECR_DETAILS LIKE '%AMO%' THEN 'AMO'::text
WHEN ECR_DETAILS LIKE '%AMC%' THEN 'AMC'::text
WHEN ECR_DETAILS LIKE '%CLI%' THEN 'CLI'::text
WHEN ECR_DETAILS LIKE '%Part client%' THEN 'CLI'::text
ELSE '???' END AS ECR_TYPE_TIER,
CASE WHEN CPT_REF_TYPE = 'PRATICIEN' THEN CPT_REF ELSE -1 END AS CPT_REF,
round(SUM(ECR_CREDIT-ECR_DEBIT)::numeric,2) AS ECR_MONTANT
FROM w_CPT_ECRITURE_source_OP_LINK
JOIN prod_web100t.FAC_FACTURE ON ECR_REF_FACT = FACT_OID
JOIN prod_web100t.CPT_COMPTES ON CPT_OID = ECR_COMPTE
WHERE ECR_IS_ETS = 0 AND
LNK_JOURNAL = 'VE' AND
(CPT_REF_TYPE = 'PRATICIEN' OR CPT_CODE LIKE '466%' OR CPT_CODE LIKE '4781%' OR (CPT_REF_TYPE = '' AND CPT_CODE IN (
SELECT CPT_CODE
FROM w_CPT_ECRITURE_source_OP_LINK
JOIN prod_web100t.FAC_FACTURE ON ECR_REF_FACT = FACT_OID
JOIN prod_web100t.CPT_COMPTES ON CPT_OID = ECR_COMPTE
WHERE ECR_IS_ETS = 0 AND LNK_JOURNAL = 'VE' AND CPT_REF_TYPE != ''
GROUP BY 1
HAVING COUNT(DISTINCT CPT_REF_TYPE) = 1
AND MIN(CPT_REF_TYPE) = 'PRATICIEN'
)))
GROUP BY 1,2,3,4
;
ANALYSE w_ECR_INTERVENANT
;
DROP TABLE IF EXISTS w_FLT_INTERVENANT_compta;
CREATE TEMP TABLE w_FLT_INTERVENANT_compta AS
SELECT FLT_FACTURE, FT_TYPE_TIER, FLT_INTERVENANT
FROM w_FLT_INTERVENANT
LEFT JOIN w_ECR_INTERVENANT ON
FLT_FACTURE = ECR_REF_FACT AND
FT_TYPE_TIER = ECR_TYPE_TIER AND
FLT_INTERVENANT = CPT_REF
WHERE FLT_TOTAL_TTC_comptable <> COALESCE(ECR_MONTANT,0) AND
FLT_TOTAL_TTC = COALESCE(ECR_MONTANT,0)
GROUP BY 1,2,3
;
ANALYSE w_FLT_INTERVENANT_compta
;
UPDATE w_FAC_FACT_LIGNE_TIER SET
FLT_TOTAL_TTC_comptable = FLT_TOTAL_TTC
FROM w_FLT_INTERVENANT_compta
WHERE w_FAC_FACT_LIGNE_TIER.FLT_FACTURE = w_FLT_INTERVENANT_compta.FLT_FACTURE AND
w_FAC_FACT_LIGNE_TIER.FT_TYPE_TIER = w_FLT_INTERVENANT_compta.FT_TYPE_TIER AND
w_FAC_FACT_LIGNE_TIER.FLT_INTERVENANT = w_FLT_INTERVENANT_compta.FLT_INTERVENANT AND
FLT_IS_DIRECT = 1
;
DROP TABLE IF EXISTS w_FLT_INTERVENANT_compta;
CREATE TEMP TABLE w_FLT_INTERVENANT_compta AS
SELECT FLT_FACTURE, FT_TYPE_TIER, FLT_INTERVENANT
FROM w_FLT_INTERVENANT
LEFT JOIN w_ECR_INTERVENANT ON
FLT_FACTURE = ECR_REF_FACT AND
FT_TYPE_TIER = ECR_TYPE_TIER AND
(FLT_INTERVENANT = CPT_REF OR CPT_REF = -1)
WHERE FLT_TOTAL_TTC_comptable <> COALESCE(ECR_MONTANT,0) AND
COALESCE(ECR_MONTANT,0) = 0
GROUP BY 1,2,3
ORDER BY 1,2,3
;
ANALYSE w_FLT_INTERVENANT_compta
;
UPDATE w_FAC_FACT_LIGNE_TIER SET
FLT_TOTAL_TTC_comptable = 0
FROM w_FLT_INTERVENANT_compta
WHERE w_FAC_FACT_LIGNE_TIER.FLT_FACTURE = w_FLT_INTERVENANT_compta.FLT_FACTURE AND
w_FAC_FACT_LIGNE_TIER.FT_TYPE_TIER = w_FLT_INTERVENANT_compta.FT_TYPE_TIER AND
w_FAC_FACT_LIGNE_TIER.FLT_INTERVENANT = w_FLT_INTERVENANT_compta.FLT_INTERVENANT AND
FLT_TOTAL_TTC_comptable <> 0
;
UPDATE w_FAC_FACT_LIGNE_TIER
SET FLT_IS_DIRECT = 1
WHERE FLT_IS_DIRECT = 0 AND FLT_TOTAL_TTC_comptable = 0
;
UPDATE w_FAC_FACT_LIGNE_TIER
SET FLT_IS_DIRECT = CASE WHEN QRGMT = '0' THEN -1 ELSE 0 END
WHERE FLT_IS_DIRECT = 1 AND FLT_TOTAL_TTC_comptable <> 0
;
UPDATE prod_web100t.FAC_FACT_LIGNE_TIER
SET FLT_IS_DIRECT = w_FAC_FACT_LIGNE_TIER.FLT_IS_DIRECT
FROM w_FAC_FACT_LIGNE_TIER
WHERE w_FAC_FACT_LIGNE_TIER.FLT_OID = FAC_FACT_LIGNE_TIER.FLT_OID AND
w_FAC_FACT_LIGNE_TIER.FLT_IS_DIRECT <> FAC_FACT_LIGNE_TIER.FLT_IS_DIRECT
;
-- Forçage des prestations comptabilisees clinique en facture clinique
INSERT INTO activite.t_divers (code, texte, valeur, description)
SELECT
'WEB100T_FORCEPRESTA_ETSB24',
'Forçage des prestations comptabilisees clinique en facture clinique',
'0',
'1=Les prestations établissements avec type B2 = 4 sont forcées en facturation établissement'
WHERE 'WEB100T_FORCEPRESTA_ETSB24' NOT IN (SELECT code FROM activite.t_divers);
;
UPDATE prod_web100t.FAC_FACT_LIGNE
SET LI_TYPE_B2 = '3'
FROM prod_web100t.FAC_FACT_LIGNE_TIER,
activite.t_divers
WHERE FLT_LIGNE_FACTURE = LI_OID AND
FLT_IS_ETS = '1' AND
LI_TYPE_B2 = '4' AND
t_divers.code = 'WEB100T_FORCEPRESTA_ETSB24' AND
t_divers.valeur = '1'
;
]]>
'' AND
(DA_DATE_FIN >= '[ENV_ADM_ANNEEDEBUT]0101' OR DA_DATE_FIN IS NULL);
UPDATE w_DAT_DA
SET CTI_OK = 'O'
WHERE CTI_OK <> 'O' AND
DA_OID = ANY (ARRAY (SELECT DISTINCT FACT_DA FROM prod_web100t.FAC_FACTURE));
-- Séjours cloturés sans facture à supprimer (fausses venues)
UPDATE w_DAT_DA
SET CTI_OK = 'N'
WHERE CTI_OK = 'O' AND
DA_STATUT = 4 AND
DA_OID = ANY (ARRAY (SELECT DISTINCT DA_OID FROM w_DAT_DA LEFT JOIN prod_web100t.FAC_FACTURE ON FACT_DA = DA_OID WHERE FACT_DA IS NULL))
;
-- Séances (séjours avec plusieurs jour - préparés à l'avance) sans prestation saisie ni facture
DROP TABLE IF EXISTS w_exclude_da;
CREATE TEMP TABLE w_exclude_da AS
(
SELECT
DISTINCT PREST_DA AS exclude_da
FROM
prod_web100t.DAT_PRESTATIONS_GAP
WHERE 1=1
AND PREST_DELETED = 0
AND PREST_DATE_DEBUT >= '[ENV_ADM_ANNEEDEBUT]0101'::timestamp without time zone
)
UNION
(
SELECT
DISTINCT FACT_DA AS exclude_da
FROM
prod_web100t.FAC_FACTURE
WHERE
FACT_DATE >= '[ENV_ADM_ANNEEDEBUT]0101'::timestamp without time zone
);
UPDATE w_DAT_DA
SET CTI_OK = 'N'
WHERE CTI_OK = 'O' AND
DA_STATUT IN ('3','4') AND
DA_CLASSE = '4' AND
date(DA_DATE_FIN) > date(DA_DATE_DEBUT) AND
DA_OID != ALL (ARRAY(SELECT exclude_da FROM w_exclude_da)::double precision[])
;
UPDATE w_DAT_DA
SET CTI_OK = 'N'
WHERE CTI_OK = 'O' AND
DA_STATUT NOT IN ('3','4') AND
DA_CLASSE = '4' AND
DA_OID != ALL (ARRAY(SELECT exclude_da FROM w_exclude_da)::double precision[]) AND
date(DA_DATE_DEBUT) < date(now() - interval '7 day')
;
DROP TABLE w_exclude_da;
-- Enlever les dossiers trop anciens
UPDATE w_DAT_DA
SET CTI_OK = 'N'
FROM
(
SELECT FACT_DA,
SUM(FT_TOTAL),
SUM(RD_TOTAL),
MAX(FACT_DATE),
MAX(FR_DATE_ENC)
FROM
(
SELECT FACT_DA,
FT_OID,
MAX(FT_TOTAL_ETS+FT_TOTAL_HO) AS FT_TOTAL,
SUM(RD_MONTANT) AS RD_TOTAL,
date(MAX(FACT_DATE)) AS FACT_DATE,
date(MAX(GREATEST(RD_DATE,FR_DATE_ENC))) AS FR_DATE_ENC
FROM prod_web100t.FAC_FACTURE
JOIN W_DAT_DA ON FACT_DA = DA_OID AND
CTI_OK = 'O' AND
DA_STATUT IN ('3','4') AND
DA_DATE_FIN <= '[ENV_ADM_ANNEEDEBUT]0101'
LEFT JOIN prod_web100t.FAC_FACT_TIER ON FACT_OID = FT_FACTURE
LEFT JOIN prod_web100t.FAC_RGLMT_DETAILS ON RD_FACT_TIER = FT_OID
LEFT JOIN prod_web100t.FAC_REGLEMENTS ON FR_OID = RD_REGLEMENT
GROUP BY 1,2
) subview
GROUP BY 1
HAVING round(SUM(FT_TOTAL)::numeric,2) = round(SUM(RD_TOTAL)::numeric,2) AND
MAX(FACT_DATE) < '[ENV_ADM_ANNEEDEBUT]0101' AND
MAX(FR_DATE_ENC) < '[ENV_ADM_ANNEEDEBUT]0101'
) subview
WHERE FACT_DA = DA_OID
;
-- Identification séjour suspndus/annulés/refusés
DROP TABLE IF EXISTS w_REGUL_PHASES
;
CREATE TEMP TABLE w_REGUL_PHASES AS
SELECT RPH_SEJOUR_OID,
(MAX(ARRAY[RPH_MODIFIED::text, RPH_ETAT::text]))[2]::numeric AS RPH_ETAT,
MAX(RPH_MODIFIED) AS RPH_MODIFIED
FROM prod_web100T.REGUL_PHASES
GROUP BY 1
;
ANALYSE w_REGUL_PHASES
;
UPDATE w_DAT_DA SET
CTI_OK = 'O',
RPH_ETAT = w_REGUL_PHASES.RPH_ETAT,
RPH_MODIFIED = w_REGUL_PHASES.RPH_MODIFIED
FROM w_REGUL_PHASES
WHERE PHASE_OID = RPH_SEJOUR_OID AND
w_REGUL_PHASES.RPH_ETAT IN (6,7,8) AND
DA_DATE_DEBUT >= '[ENV_ADM_ANNEEDEBUT]0101' AND
CTI_OK = 'N'
;
DELETE FROM w_DAT_DA
WHERE CTI_OK <> 'O';
UPDATE w_DAT_DA
SET SEJ_NO_ENTREE = 'W' || DA_OID
WHERE SEJ_NO_ENTREE = '';
UPDATE w_DAT_DA
SET DA_DATE_FIN = date(MVT_DATE_DAY), DA_HEURE_FIN = MVT_DATE_HOUR
FROM w_REGUL_MOUVEMENTS_source REGUL_MOUVEMENTS
WHERE DA_DATE_FIN IS NULL AND
PHASE_OID = MVT_SEJ_OID AND
DA_STATUT IN (3,4) AND
MVT_TYPE = 2;
-- Sejours en double (Analyser différence entre DA_NUMERO et SEJ_NO_ENTREE)
SELECT base.cti_execute('
DELETE
FROM w_DAT_DA
USING
(SELECT DA_OID, (MAX(ARRAY[to_char(999-SEJ_NBRE_BB,''FM999'')::text || to_char(PHASE_OID,''FM999999999999'')::text,SEJ_NO_ENTREE::text]))[2] AS SEJ_NO_ENTREE FROM w_DAT_DA WHERE CTI_OK = ''O'' GROUP BY 1 HAVING COUNT(*) > 1) subview
WHERE w_DAT_DA.DA_OID = subview.DA_OID AND w_DAT_DA.SEJ_NO_ENTREE = subview.SEJ_NO_ENTREE AND SEJ_NBRE_BB > 0',20);
-- Sejours en double (Analyser différence entre DA_NUMERO et SEJ_NO_ENTREE)
SELECT base.cti_execute('
DELETE
FROM w_DAT_DA
USING
(SELECT DA_OID, (MAX(ARRAY[to_char(999-SEJ_NBRE_BB,''FM999'')::text || to_char(PHASE_OID,''FM999999999999'')::text,SEJ_NO_ENTREE::text]))[2] AS SEJ_NO_ENTREE FROM w_DAT_DA WHERE CTI_OK = ''O'' GROUP BY 1 HAVING COUNT(*) > 1) subview
WHERE w_DAT_DA.DA_OID = subview.DA_OID AND w_DAT_DA.SEJ_NO_ENTREE = subview.SEJ_NO_ENTREE',20);
-- Sejours en double (Suffixer no sejour pour le reste)
SELECT base.cti_execute('
UPDATE w_DAT_DA
SET DA_NUMERO = w_DAT_DA.DA_NUMERO || ''_'' || nb::text
FROM (
SELECT DA_NUMERO, MAX(DA_OID) AS DA_OID, count(*) AS nb
FROM w_DAT_DA
WHERE DA_NUMERO IN (
SELECT da_numero
FROM w_DAT_DA
GROUP BY 1
HAVING count(*) > 1) AND
SEJ_NO_ENTREE <> DA_NUMERO
GROUP BY 1) subview
WHERE w_DAT_DA.DA_OID = subview.DA_OID'
,20);
SELECT base.cti_execute('
UPDATE w_DAT_DA
SET DA_NUMERO = w_DAT_DA.DA_NUMERO || ''_'' || nb::text
FROM (
SELECT DA_NUMERO, MAX(DA_OID) AS DA_OID, count(*) AS nb
FROM w_DAT_DA
WHERE DA_NUMERO IN (
SELECT da_numero
FROM w_DAT_DA
GROUP BY 1
HAVING count(*) > 1)
GROUP BY 1) subview
WHERE w_DAT_DA.DA_OID = subview.DA_OID'
,20);
VACUUM ANALYSE w_DAT_DA;
-- Si mouvement d'entrée sans lit, prendre le lit suivant (si même UF)
DROP TABLE IF EXISTS w_REGUL_MOUVEMENTS_lit_entree;
CREATE TEMP TABLE w_REGUL_MOUVEMENTS_lit_entree AS
SELECT w_REGUL_MOUVEMENTS_source.MVT_OID, MAX(w_REGUL_MOUVEMENTS_source.MVT_SEJ_OID) AS MVT_SEJ_OID,
(MIN(ARRAY[w_REGUL_MOUVEMENTS_source_2.MVT_INDEX, w_REGUL_MOUVEMENTS_source_2.MVT_CHAMBRE]))[2] AS MVT_CHAMBRE,
(MIN(ARRAY[w_REGUL_MOUVEMENTS_source_2.MVT_INDEX, w_REGUL_MOUVEMENTS_source_2.MVT_LIT]))[2] AS MVT_LIT
FROM w_REGUL_MOUVEMENTS_source
JOIN w_DAT_DA ON PHASE_OID = w_REGUL_MOUVEMENTS_source.MVT_SEJ_OID
JOIN w_REGUL_MOUVEMENTS_source w_REGUL_MOUVEMENTS_source_2 ON
w_REGUL_MOUVEMENTS_source.MVT_SEJ_OID = w_REGUL_MOUVEMENTS_source_2.MVT_SEJ_OID AND
w_REGUL_MOUVEMENTS_source_2.MVT_INDEX > w_REGUL_MOUVEMENTS_source.MVT_INDEX AND
w_REGUL_MOUVEMENTS_source_2.MVT_TYPE IN (1,2,4)
WHERE
w_REGUL_MOUVEMENTS_source.MVT_INDEX = 1 AND
w_REGUL_MOUVEMENTS_source.MVT_UF_GEO <> 0 AND
w_REGUL_MOUVEMENTS_source.MVT_LIT = 0 AND
w_REGUL_MOUVEMENTS_source.MVT_CHAMBRE = 0
GROUP BY 1
HAVING (MIN(ARRAY[w_REGUL_MOUVEMENTS_source_2.MVT_INDEX, w_REGUL_MOUVEMENTS_source_2.MVT_UF_GEO]))[2] = MAX(w_REGUL_MOUVEMENTS_source.MVT_UF_GEO) AND
(MIN(ARRAY[w_REGUL_MOUVEMENTS_source_2.MVT_INDEX, w_REGUL_MOUVEMENTS_source_2.MVT_LIT]))[2] <> 0
;
ANALYSE w_REGUL_MOUVEMENTS_lit_entree
;
UPDATE w_REGUL_MOUVEMENTS_source SET
MVT_CHAMBRE = w_REGUL_MOUVEMENTS_lit_entree.MVT_CHAMBRE,
MVT_LIT = w_REGUL_MOUVEMENTS_lit_entree.MVT_LIT
FROM w_REGUL_MOUVEMENTS_lit_entree
WHERE w_REGUL_MOUVEMENTS_source.MVT_OID = w_REGUL_MOUVEMENTS_lit_entree.MVT_OID
;
]]>
1
) subview
WHERE w_patients.w_PAT_ID = subview.w_PAT_ID;
INSERT INTO activite[PX].p_patients(
no_patient,
nom,
prenom,
nom_naissance,
date_naissance,
code_sexe)
SELECT
w_PAT_IPP,
PAT_NOM,
PAT_PRENOM,
PAT_NOMNAISS,
date(PAT_NAISSANCE),
CASE WHEN PAT_SEXE = '2' THEN '2' ELSE '1' END
FROM w_patients
JOIN prod_web100t.PATIENTS ON PAT_ID = w_PAT_ID
LEFT JOIN activite[PX].p_patients ON (w_PAT_IPP = p_patients.no_patient)
WHERE p_patients.no_patient IS NULL;
UPDATE activite[PX].p_patients
SET
nom = PAT_NOM,
prenom = PAT_PRENOM,
nom_naissance = PAT_NOMNAISS,
date_naissance = date(PAT_NAISSANCE),
code_sexe = CASE WHEN PAT_SEXE = '2' THEN '2' ELSE '1' END
FROM prod_web100t.PATIENTS
JOIN w_patients ON PAT_ID = w_PAT_ID
WHERE w_PAT_IPP = p_patients.no_patient
AND (
nom IS DISTINCT FROM PAT_NOM OR
prenom IS DISTINCT FROM PAT_PRENOM OR
nom_naissance IS DISTINCT FROM PAT_NOMNAISS OR
date_naissance IS DISTINCT FROM date(PAT_NAISSANCE) OR
code_sexe IS DISTINCT FROM CASE WHEN PAT_SEXE = '2' THEN '2' ELSE '1' END
);
]]>
0
GROUp BY 1
HAVING count(DISTINCT RSS_OID) > 1
ORDER BY 1
) subview
WHERE DAT_RSS.RSS_NO_HOSPIT = subview.RSS_NO_HOSPIT AND
RSS_OID <> RES_OID_OK
;
-- Détection GHM
DROP TABLE IF EXISTS w_DAT_GROUPAGE;
CREATE TEMP TABLE w_DAT_GROUPAGE AS
SELECT
RSS_NO_HOSPIT,
to_number((MAX(Array[GRP_DATE::text, COALESCE(t_ghs.oid,0)::text]))[2],'00000000000000') AS ghs_id,
to_number((MAX(Array[GRP_DATE::text, COALESCE(t_ghm.oid,0)::text]))[2],'00000000000000') AS ghm_id,
(MAX(Array[GRP_DATE::text, w_SGN_NMCL_DATA_GHS.ND_CODE]))[2] AS ND_CODE_GHS,
(MAX(Array[GRP_DATE::text, w_SGN_NMCL_DATA_GHM.ND_CODE]))[2] AS ND_CODE_GHM
FROM prod_web100t.DAT_GROUPAGE
JOIN prod_web100t.DAT_RESUME ON GRP_RESUME = RES_OID
JOIN prod_web100t.DAT_RSS ON RES_OID = RSS_OID
JOIN prod_web100t.DAT_HOSPIT ON RES_HOSPIT = HOSP_OID
LEFT JOIN w_SGN_NMCL_DATA w_SGN_NMCL_DATA_GHS ON
GRP_CODE_GHS = w_SGN_NMCL_DATA_GHS.ND_OID
LEFT JOIN w_SGN_NMCL_DATA w_SGN_NMCL_DATA_GHM ON
GRP_GHM = w_SGN_NMCL_DATA_GHM.ND_OID
LEFT JOIN base.t_ghs ON t_ghs.code = to_number('0' || w_SGN_NMCL_DATA_GHS.ND_CODE,'00000')
LEFT JOIN base.t_ghm ON t_ghm.code = w_SGN_NMCL_DATA_GHM.ND_CODE
WHERE GRP_CODE_GHS <> 0 OR GRP_GHM <> 0
GROUP BY 1;
UPDATE w_DAT_GROUPAGE SET
ghs_id = 0, ghm_id = 0
WHERE ND_CODE_GHM LIKE '90%' AND
(ghs_id <> 0 OR ghm_id <> 0);
ALTER TABLE w_DAT_GROUPAGE ADD CONSTRAINT w_DAT_GROUPAGE_pkey PRIMARY KEY(RSS_NO_HOSPIT);
DROP TABLE IF EXISTS w_DAT_CONDITIONS_HEB;
CREATE TEMP TABLE w_DAT_CONDITIONS_HEB AS
SELECT
CH_SEJOUR,
(MAX(Array[CH_DATE_DEMANDE::text,CH_CP_DEMANDEE::text]))[2] AS CH_CP_DEMANDEE
FROM prod_web100t.DAT_CONDITIONS_HEB
WHERE CH_CP_DEMANDEE <> 0
GROUP BY 1;
ALTER TABLE w_DAT_CONDITIONS_HEB ADD CONSTRAINT w_DAT_CONDITIONS_HEB_pkey PRIMARY KEY(CH_SEJOUR);
DROP TABLE IF EXISTS w_DAT_IDENTITE;
CREATE TEMP TABLE w_DAT_IDENTITE AS
SELECT
IDT_DA,
(MAX(CASE WHEN IDT_TYPE = 'AMO' AND IDT_ORGANISME <> 0 THEN Array[IDT_CREATED::text, COALESCE(t_tiers_payant.oid,0)::text] ELSE Array['',0::text] END))[2]::bigint AS tiers_payant_1_id,
(MAX(CASE WHEN IDT_TYPE = 'AMC' AND IDT_ORGANISME <> 0 THEN Array[IDT_CREATED::text, COALESCE(t_tiers_payant.oid,0)::text] ELSE Array['',0::text] END))[2]::bigint AS tiers_payant_2_id,
(MAX(Array[IDT_CREATED::text, COALESCE(t_codes_postaux.oid,0)::text]))[2]::bigint AS code_postal_id
FROM prod_web100t.DAT_IDENTITE
LEFT JOIN activite[PX].t_tiers_payant ON IDT_ORGANISME = code_original
LEFT JOIN base.t_codes_postaux on IDT_CP = t_codes_postaux.code
GROUP BY 1;
ALTER TABLE w_DAT_IDENTITE ADD CONSTRAINT w_DAT_IDENTITE_pkey PRIMARY KEY(IDT_DA);
DROP TABLE IF EXISTS w_REGUL_MOUVEMENTS_SORTIE;
CREATE TEMP TABLE w_REGUL_MOUVEMENTS_SORTIE AS
SELECT
DA_OID,
SEJ_SPECIALITE,
SEJ_RESPONSABLE,
DA_NODE_RESP,
COALESCE((MAX(Array[MVT_DATE::text || MVT_INDEX, MVT_RESP::text]))[2]::bigint,0) AS MVT_RESP,
COALESCE((MAX(Array[MVT_DATE::text || MVT_INDEX, MVT_UF_SOIN::text]))[2]::bigint,0) AS MVT_UF_SOIN,
COALESCE((MAX(Array[MVT_DATE::text || MVT_INDEX, MVT_UF_GEO::text]))[2]::bigint,0) AS MVT_UF_GEO,
COALESCE((MAX(Array[MVT_DATE::text || MVT_INDEX, MVT_LIT::text]))[2]::bigint,0) AS MVT_LIT,
SEJ_SPECIALITE || '|' ||
SEJ_RESPONSABLE || '|' ||
DA_NODE_RESP || '|' ||
COALESCE((MAX(Array[MVT_DATE::text || MVT_INDEX, MVT_RESP::text]))[2],'') || '|' ||
COALESCE((MAX(Array[MVT_DATE::text || MVT_INDEX, MVT_UF_SOIN::text]))[2],'') || '|' ||
COALESCE((MAX(Array[MVT_DATE::text || MVT_INDEX, MVT_UF_GEO::text]))[2],'') || '|' ||
COALESCE((MAX(Array[MVT_DATE::text || MVT_INDEX, MVT_LIT::text]))[2],'')
AS key
FROM w_DAT_DA
LEFT JOIN w_REGUL_MOUVEMENTS_source REGUL_MOUVEMENTS ON PHASE_OID = MVT_SEJ_OID AND MVT_TYPE IN (1,4)
GROUP BY 1,2,3,4;
DROP TABLE IF EXISTS w_REGUL_MOUVEMENTS_SORTIE_keys;
CREATE TEMP TABLE w_REGUL_MOUVEMENTS_SORTIE_keys AS
SELECT
key,
SEJ_RESPONSABLE,
DA_NODE_RESP,
MVT_RESP,
MVT_UF_SOIN,
SEJ_SPECIALITE,
MVT_UF_GEO,
MVT_LIT,
0 AS mode_traitement_id,
''::text AS mode_traitement_code,
''::text AS dmt_code,
'0'::text AS type_sejour_force,
'0'::text AS type_sejour_seances_autorise,
'0'::text AS type_t2a,
0::bigint AS lieu_id,
0::bigint AS medecin_sejour_id
FROM w_REGUL_MOUVEMENTS_SORTIE
GROUP BY 1,2,3,4,5,6,7,8;
UPDATE w_REGUL_MOUVEMENTS_SORTIE_keys SET
mode_traitement_id = w_NMCL_UNITEFONCTIONNELLE.mode_traitement_id,
mode_traitement_code = w_NMCL_UNITEFONCTIONNELLE.mode_traitement_code,
dmt_code = w_NMCL_UNITEFONCTIONNELLE.dmt_code,
type_sejour_force = CASE WHEN w_NMCL_UNITEFONCTIONNELLE.type_sejour IN ('1', '2', '3', '31', '4', '5', '9') THEN w_NMCL_UNITEFONCTIONNELLE.type_sejour ELSE '0' END,
type_sejour_seances_autorise = CASE WHEN w_NMCL_UNITEFONCTIONNELLE.type_sejour IN ('1', '2', '3', '31', '4', '0sauf5') THEN '0' ELSE '1' END,
type_t2a = w_NMCL_UNITEFONCTIONNELLE.type_t2a
FROM w_NMCL_UNITEFONCTIONNELLE
WHERE w_NMCL_UNITEFONCTIONNELLE.WEB100T_OID = MVT_UF_SOIN;
UPDATE w_REGUL_MOUVEMENTS_SORTIE_keys
set medecin_sejour_id = w_NMCL_INTERVENANT.medecin_administratif_id
FROM w_NMCL_INTERVENANT
WHERE MVT_RESP <> 0 AND NODE_OID = MVT_RESP;
UPDATE w_REGUL_MOUVEMENTS_SORTIE_keys
set medecin_sejour_id = w_NMCL_INTERVENANT.medecin_administratif_id
FROM w_NMCL_INTERVENANT
WHERE medecin_sejour_id = 0 AND SEJ_RESPONSABLE <> 0 AND NODE_OID = SEJ_RESPONSABLE;
UPDATE w_REGUL_MOUVEMENTS_SORTIE_keys
set medecin_sejour_id = w_NMCL_INTERVENANT.medecin_administratif_id
FROM w_NMCL_INTERVENANT
WHERE medecin_sejour_id = 0 AND DA_NODE_RESP <> 0 AND NODE_OID = DA_NODE_RESP;
INSERT INTO activite[PX].t_lieux(
code_original_1, code_original_2, code_original_3, code_original_4, code_original_6)
SELECT MVT_UF_SOIN, SEJ_SPECIALITE, MVT_UF_GEO, MVT_LIT, MVT_UF_SOIN
FROM w_REGUL_MOUVEMENTS_SORTIE_keys
LEFT JOIN activite[PX].t_lieux ON (
code_original_1 = MVT_UF_SOIN AND
code_original_2 = SEJ_SPECIALITE AND
code_original_3 = MVT_UF_GEO AND
code_original_4 = MVT_LIT AND
code_original_6 = MVT_UF_SOIN
)
WHERE t_lieux.oid IS NULL
GROUP BY 1,2,3,4,5;
UPDATE w_REGUL_MOUVEMENTS_SORTIE_keys
set lieu_id = t_lieux.oid
FROM activite[PX].t_lieux
WHERE code_original_1 = MVT_UF_SOIN AND
code_original_2 = SEJ_SPECIALITE AND
code_original_3 = MVT_UF_GEO AND
code_original_4 = MVT_LIT AND
code_original_6 = MVT_UF_SOIN;
UPDATE activite[PX].t_lieux SET
service_facturation_id = COALESCE(t_services_facturation.oid,0),
mode_traitement_id = COALESCE(t_services_facturation.mode_traitement_id,0)
FROM
activite[PX].t_services_facturation
WHERE code_original_1 = t_services_facturation.code_original
AND (t_lieux.service_facturation_id <> COALESCE(t_services_facturation.oid,0) OR
t_lieux.mode_traitement_id <> COALESCE(t_services_facturation.mode_traitement_id,0)
)
;
UPDATE activite[PX].t_lieux SET
activite_id = COALESCE(t_activites.oid,0)
FROM
activite[PX].t_activites
WHERE code_original_2 = t_activites.code_original
AND activite_id <> COALESCE(t_activites.oid,0);
UPDATE activite[PX].t_lieux SET
unite_fonctionnelle_id = COALESCE(t_unites_fonctionnelles.oid,0)
FROM
activite[PX].t_unites_fonctionnelles
WHERE code_original_6 = t_unites_fonctionnelles.code_original
AND unite_fonctionnelle_id <> COALESCE(t_unites_fonctionnelles.oid,0);
UPDATE activite[PX].t_lieux SET
lit_id = COALESCE(t_lits.oid,0)
FROM
activite[PX].t_lits
WHERE code_original_3 || '-' || code_original_4 = t_lits.code_original AND
t_lieux.lit_id <> COALESCE(t_lits.oid,0)
;
ALTER TABLE w_REGUL_MOUVEMENTS_SORTIE ADD CONSTRAINT w_REGUL_MOUVEMENTS_SORTIE_pkey PRIMARY KEY(DA_OID);
CREATE INDEX w_REGUL_MOUVEMENTS_SORTIE_i1
ON w_REGUL_MOUVEMENTS_SORTIE
USING btree
(key);
DROP TABLE IF EXISTS w_DAT_DA_type_sejour;
CREATE TEMP TABLE w_DAT_DA_type_sejour AS
SELECT
DA_OID,
CASE WHEN date(DA_DATE_DEBUT) = date(DA_DATE_FIN) THEN '1' ELSE '0' END AS de_ds,
SUM(CASE WHEN FLT_IS_ETS = 1 AND FLT_TOTAL_TTC >= 0 AND FLT_CODE_PREST IN ('GHS','PJ') THEN 1
WHEN FLT_IS_ETS = 1 AND FLT_TOTAL_TTC < 0 AND FLT_CODE_PREST IN ('GHS','PJ') THEN -1
ELSE 0 END) AS nb_sej,
SUM(CASE WHEN FLT_IS_ETS = 1 AND FLT_TOTAL_TTC >= 0 AND FLT_CODE_PREST IN ('SE1', 'SE2', 'SE3', 'SE4', 'SE5', 'SE6', 'SE7', 'ATU', 'FPU', 'FFM') THEN 1
WHEN FLT_IS_ETS = 1 AND FLT_TOTAL_TTC < 0 AND FLT_CODE_PREST IN ('SE1', 'SE2', 'SE3', 'SE4', 'SE5', 'SE6', 'SE7', 'ATU', 'FPU', 'FFM') THEN -1
ELSE 0 END) AS nb_ext,
SUM(CASE WHEN FLT_IS_ETS = 1 AND FLT_TOTAL_TTC >= 0 AND FLT_CODE_PREST BETWEEN 'D01' AND 'D19' THEN 1
WHEN FLT_IS_ETS = 1 AND FLT_TOTAL_TTC < 0 AND FLT_CODE_PREST BETWEEN 'D01' AND 'D19' THEN -1
ELSE 0 END) AS nb_dia,
SUM(CASE WHEN FLT_IS_ETS = 1 AND FLT_TOTAL_TTC >= 0 THEN 1
WHEN FLT_IS_ETS = 1 AND FLT_TOTAL_TTC < 0 THEN -1
ELSE 0 END) AS nb_ets,
SUM(CASE WHEN FLT_IS_ETS <> 1 AND FLT_TOTAL_TTC >= 0 THEN 1
WHEN FLT_IS_ETS <> 1 AND FLT_TOTAL_TTC < 0 THEN -1
ELSE 0 END) AS nb_hon,
'0'::text AS type_sejour_facture
FROM w_DAT_DA
JOIN prod_web100t.FAC_FACT_TIER ON FT_DA = DA_OID
JOIN prod_web100t.FAC_FACT_LIGNE_TIER ON FLT_FACTURE_TIER = FT_OID
WHERE FLT_RECAP <> 0
GROUP BY 1,2
ORDER BY 1
;
UPDATE w_DAT_DA_type_sejour SET type_sejour_facture = '1' WHERE nb_sej > 0 AND nb_ext = 0 AND de_ds = '0';
UPDATE w_DAT_DA_type_sejour SET type_sejour_facture = '2' WHERE nb_sej > 0 AND nb_ext = 0 AND de_ds = '1';
UPDATE w_DAT_DA_type_sejour SET type_sejour_facture = '3' WHERE nb_sej = 0 AND nb_ext > 0 AND nb_dia = 0;
UPDATE w_DAT_DA_type_sejour SET type_sejour_facture = '5' WHERE nb_sej = 0 AND nb_ext = 0 AND nb_dia > 0;
UPDATE w_DAT_DA_type_sejour SET type_sejour_facture = '3' WHERE type_sejour_facture = '0' AND de_ds = '1' AND nb_ets = 0 AND nb_hon = 1;
ALTER TABLE w_DAT_DA_type_sejour ADD CONSTRAINT w_DAT_DA_type_sejour_pkey PRIMARY KEY(DA_OID);
-- Table de travail pour la préadmission des séjours
DROP TABLE IF EXISTS w_sejours_preadmission;
CREATE TEMP TABLE w_sejours_preadmission(
no_sejour text PRIMARY KEY,
date_entree timestamp,
date_validation_preadmission timestamp,
"preadmission_j1" smallint,
"preadmission_j2" smallint
)
;
INSERT INTO w_sejours_preadmission(
no_sejour,
date_entree,
date_validation_preadmission,
"preadmission_j1",
"preadmission_j2"
)
SELECT
DA_NUMERO,
DA_DATE_DEBUT,
SEJ_VALIDATION_PREAD_LE,
CASE WHEN (DA_DATE_DEBUT - SEJ_VALIDATION_PREAD_LE) >= '10:00:00' THEN 1 ELSE 0 END,
CASE WHEN (DA_DATE_DEBUT - SEJ_VALIDATION_PREAD_LE) >= '1 day 06:00:00' THEN 1 ELSE 0 END
FROM w_DAT_DA
;
ANALYZE w_sejours_preadmission
;
-- Insertion des colonnes de la table w_sejours_preadmission
-- dans table CTI p_sejours_preadmission
INSERT INTO activite[PX].p_sejours_preadmission(
no_sejour,
date_entree,
date_validation_preadmission,
"preadmission_j1",
"preadmission_j2"
)
SELECT
no_sejour,
date_entree,
date_validation_preadmission,
"preadmission_j1",
"preadmission_j2"
FROM w_sejours_preadmission
WHERE NOT EXISTS (
SELECT no_sejour
FROM activite[PX].p_sejours_preadmission
WHERE w_sejours_preadmission.no_sejour = p_sejours_preadmission.no_sejour
)
;
DROP TABLE IF EXISTS w_sejours ;
CREATE TEMP TABLE w_sejours AS
SELECT
finess,
nextval('activite[PX].s_sejours'::regclass) AS sejour_id,
w_DAT_DA.DA_OID AS code_original,
DA_NUMERO AS no_sejour,
PAT_IPP AS no_patient,
CASE WHEN PAT_SEXE = '2' THEN '2' ELSE '1' END AS code_sexe,
DA_DATE_DEBUT + DA_HEURE_DEBUT * interval '1 day' AS date_heure_entree,
date(DA_DATE_DEBUT) AS date_entree,
extract('hour' FROM DA_HEURE_DEBUT * interval '1 day') * 10000 +
extract('minute' FROM DA_HEURE_DEBUT * interval '1 day') * 100 +
extract('second' FROM DA_HEURE_DEBUT * interval '1 day') AS heure_entree,
COALESCE(substr(w_SGN_NMCL_DATA_MODEENTREE.ND_CODE,1,1),'8') AS mode_entree,
COALESCE(substr(w_SGN_NMCL_DATA_MODEENTREE.ND_CODE,2,1),'') AS provenance,
COALESCE(DA_DATE_FIN + DA_HEURE_FIN * interval '1 day', '20991231') AS date_heure_sortie,
COALESCE(date(DA_DATE_FIN), '20991231') AS date_sortie,
COALESCE(extract('hour' FROM DA_HEURE_FIN * interval '1 day') * 10000 +
extract('minute' FROM DA_HEURE_FIN * interval '1 day') * 100 +
extract('second' FROM DA_HEURE_FIN * interval '1 day'),0) AS heure_sortie,
COALESCE(substr(w_SGN_NMCL_DATA_MODESORTIE.ND_CODE,1,1),'8') AS mode_sortie,
COALESCE(substr(w_SGN_NMCL_DATA_MODESORTIE.ND_CODE,2,1),'') AS destination,
CASE
WHEN DA_STATUT IN ('3','4') AND DA_DATE_FIN IS NOT NULL THEN 1
ELSE 0 END AS code_sorti,
CASE
WHEN DA_STATUT <= 1 THEN 1
ELSE 0 END AS code_prevu,
CASE
WHEN type_sejour_seances_autorise = '1' AND ND_CODE_GHM LIKE '28%' THEN '5'
WHEN type_sejour_force <> '0' AND type_sejour_force <> '31' THEN type_sejour_force
WHEN type_sejour_force = 31 AND date(DA_DATE_FIN) - date(DA_DATE_DEBUT) <= 1 THEN '3'
WHEN type_sejour_force = 31 THEN '1'
WHEN type_sejour_facture <> '0' THEN type_sejour_facture
WHEN DA_CLASSE IN (1,2) AND date(DA_DATE_DEBUT) = date(DA_DATE_FIN) AND DA_SUGG_MODE_FACT IN ('ATU','FSU','HON','SEH') THEN '3'
WHEN DA_CLASSE IN (1,2) AND date(DA_DATE_DEBUT) = date(DA_DATE_FIN) THEN '2'
WHEN DA_CLASSE IN (1,2) THEN '1'
WHEN DA_CLASSE IN (3,5) THEN '3'
WHEN DA_CLASSE IN (4) THEN '5'
WHEN mode_traitement_code IN ('03') AND date(DA_DATE_DEBUT) = date(DA_DATE_FIN) THEN '2'
WHEN mode_traitement_code IN ('03') THEN '1'
WHEN mode_traitement_code IN ('07') THEN '3'
WHEN mode_traitement_code IN ('07') OR dmt_code IN ('958') THEN '3'
WHEN mode_traitement_code IN ('19', '23') AND date(DA_DATE_DEBUT) = date(DA_DATE_FIN) THEN '2'
WHEN mode_traitement_code IN ('04') AND date(DA_DATE_DEBUT) = date(DA_DATE_FIN) THEN '2'
WHEN mode_traitement_code IN ('03') AND date(DA_DATE_DEBUT) = date(DA_DATE_FIN) THEN '2'
WHEN mode_traitement_code IN ('03') THEN '1'
WHEN mode_traitement_id = 0 AND type_t2a = '1' AND date(DA_DATE_DEBUT) = date(DA_DATE_FIN) THEN '2'
WHEN mode_traitement_id = 0 AND ghs_id <> 0 AND date(DA_DATE_DEBUT) = date(DA_DATE_FIN) THEN '2'
WHEN mode_traitement_id = 0 AND type_t2a <> '1' AND date(DA_DATE_DEBUT) = date(DA_DATE_FIN) THEN '3'
ELSE '1' END AS type_sejour,
mode_traitement_id,
w_REGUL_MOUVEMENTS_SORTIE_keys.lieu_id AS lieu_sortie_id,
medecin_sejour_id,
COALESCE(tiers_payant_1_id,0) AS tiers_payant_1_id,
COALESCE(tiers_payant_2_id,0) AS tiers_payant_2_id,
(SELECT MIN(oid) FROM activite[PX].t_tiers_payant WHERE code = 'PATIENTS') AS tiers_payant_0_id,
0::bigint AS tiers_payant_22_id,
COALESCE(ghs_id,0) AS ghs_id,
COALESCE(ghm_id,0) AS ghm_id,
0::bigint AS ghs_bebe1_id,
0::bigint AS ghs_bebe2_id,
0::bigint AS ghs_bebe3_id,
DATE(DA_DIM_VALID) AS date_groupage,
CASE RPH_ETAT
WHEN 6 THEN 'R'
WHEN 7 THEN 'A'
WHEN 8 THEN 'C'
ELSE ''::text
END AS etat,
CASE WHEN RPH_ETAT > 0 THEN RPH_MODIFIED ELSE NULL END AS date_etat,
COALESCE(CH_CP_DEMANDEE,'0') AS code_cp_demandee,
0::numeric AS est_budget_global,
'0'::text AS est_sans_facturation,
0::bigint AS provider_id,
w_DAT_IDENTITE.code_postal_id
FROM w_DAT_DA
JOIN prod_web100t.PATIENTS ON DA_PATIENT = PAT_ID
LEFT JOIN w_SGN_NMCL_DATA w_SGN_NMCL_DATA_MODEENTREE ON
SEJ_MODE_ENTREE = w_SGN_NMCL_DATA_MODEENTREE.ND_INVARIANT_OID AND
w_SGN_NMCL_DATA_MODEENTREE.NMCL_IDENT = 'MODEENTREE'
LEFT JOIN w_SGN_NMCL_DATA w_SGN_NMCL_DATA_MODESORTIE ON
SEJ_MODE_SORTIE = w_SGN_NMCL_DATA_MODESORTIE.ND_INVARIANT_OID AND
w_SGN_NMCL_DATA_MODESORTIE.NMCL_IDENT = 'MODESORTIE'
JOIN w_REGUL_MOUVEMENTS_SORTIE ON w_DAT_DA.DA_OID = w_REGUL_MOUVEMENTS_SORTIE.DA_OID
JOIN w_REGUL_MOUVEMENTS_SORTIE_keys ON w_REGUL_MOUVEMENTS_SORTIE.key = w_REGUL_MOUVEMENTS_SORTIE_keys.key
LEFT JOIN w_DAT_GROUPAGE ON DA_NUMERO = RSS_NO_HOSPIT
LEFT JOIN w_DAT_CONDITIONS_HEB ON PHASE_OID = CH_SEJOUR
LEFT JOIN w_DAT_IDENTITE ON IDT_DA = w_DAT_DA.DA_OID
LEFT JOIN w_DAT_DA_type_sejour ON w_DAT_DA.DA_OID = w_DAT_DA_type_sejour.DA_OID;
-- correction mode de sortie
UPDATE w_sejours
SET mode_sortie = ''
WHERE mode_sortie != ALL (ARRAY(SELECT code from base.t_modes_sortie)::text[])
;
-- correction mode entree
UPDATE w_sejours
SET mode_entree = ''
WHERE mode_entree != ALL (ARRAY(SELECT code from base.t_modes_entree)::text[])
;
-- Forcage type selon séjour
UPDATE w_sejours
SET type_sejour = t_sejour.type_sejour
FROM activite.t_sejour
WHERE t_sejour.no_sejour = w_sejours.no_sejour AND
t_sejour.type_sejour IN ('1','2','3','4','5','6','9');
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');
INSERT INTO activite[PX].p_sejours (
finess,
oid,
code_original,
no_sejour,
no_patient,
code_sexe,
date_entree,
heure_entree,
mode_entree,
provenance,
date_sortie,
heure_sortie,
mode_sortie,
destination,
code_sorti,
code_prevu,
type_sejour,
mode_traitement_id,
lieu_sortie_id,
medecin_sejour_id,
tiers_payant_1_id,
tiers_payant_2_id,
tiers_payant_0_id,
tiers_payant_22_id,
ghs_id,
ghs_bebe1_id,
ghs_bebe2_id,
ghs_bebe3_id,
date_groupage,
ghm_id,
etat,
date_etat,
code_cp_demandee,
est_budget_global,
est_sans_facturation,
provider_id,
code_postal_id
)
SELECT
finess,
sejour_id,
code_original,
no_sejour,
no_patient,
code_sexe,
date_entree,
heure_entree,
mode_entree,
provenance,
date_sortie,
heure_sortie,
mode_sortie,
destination,
code_sorti,
code_prevu,
type_sejour,
mode_traitement_id,
lieu_sortie_id,
medecin_sejour_id,
tiers_payant_1_id,
tiers_payant_2_id,
tiers_payant_0_id,
tiers_payant_22_id,
ghs_id,
ghs_bebe1_id,
ghs_bebe2_id,
ghs_bebe3_id,
date_groupage,
ghm_id,
etat,
date_etat,
code_cp_demandee,
est_budget_global,
est_sans_facturation,
provider_id,
code_postal_id
FROM w_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]' = '';
UPDATE activite[PX].p_sejours
SET etat = ''
WHERE etat = 'I' AND
no_sejour NOT IN (SELECT no_sejour FROM activite.t_sejour WHERE est_ignore = '1') AND
'[PX]' = '';
-- Médecin séjour forcé
UPDATE activite[PX].p_sejours
SET medecin_sejour_id = t_sejour.medecin_sejour_id
FROM activite.t_sejour
WHERE t_sejour.no_sejour = p_sejours.no_sejour AND
t_sejour.medecin_sejour_id <> 0 AND
p_sejours.medecin_sejour_id IS DISTINCT FROM t_sejour.medecin_sejour_id AND
'[PX]' = '';
-- recréation index
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_2');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_3');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_4');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_5');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_6');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_7');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_8');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_9');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_10');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_11');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_12');
SELECT base.cti_enable_index('activite[PX]', 'i_sejours_13');
-- transferts d'établissements
INSERT INTO base.t_etablissements (code, texte, texte_court)
SELECT
ND_CODE,
ND_LIB,
ND_LIB
FROM
w_SGN_NMCL_DATA
WHERE 1=1 AND
NMCL_IDENT = 'FINESS' AND
ND_INVARIANT_OID IN (SELECT DISTINCT MVT_AUTRE_ETS FROM prod_web100t.REGUL_MOUVEMENTS) AND
ND_CODE NOT IN (SELECT CODE FROM base.t_etablissements)
;
INSERT INTO activite[PX].p_sejours_transferts (sejour_id, provenance_id, destination_id)
SELECT
p_sejours.oid,
MIN(CASE WHEN MVT_TYPE = 1 THEN t_etablissements.oid ELSE null END) AS provenance_id,
MIN(CASE WHEN MVT_TYPE = 2 THEN t_etablissements.oid ELSE null END) AS destination_id
FROM
activite[PX].p_sejours
JOIN prod_web100t.DAT_SEJOUR ON SEJ_DA = code_original
JOIN prod_web100t.REGUL_MOUVEMENTS ON MVT_SEJ_OID = PHASE_OID
LEFT JOIN w_SGN_NMCL_DATA ON MVT_AUTRE_ETS = ND_INVARIANT_OID AND NMCL_IDENT = 'FINESS'
LEFT JOIN base.t_etablissements ON ND_CODE = code
WHERE 1!=1 OR
MVT_AUTRE_ETS != 0
GROUP BY 1
;
-- Assurance
SELECT base.cti_execute(
'INSERT INTO activite[PX].p_sejours_assurance(
sejour_id,
nom_assure,
prenom_assure,
tiers_payant_0_id,
tiers_payant_1_id,
matricule_1,
tiers_payant_2_id,
matricule_2,
tiers_payant_22_id,
matricule_22
)
SELECT
p_sejours.oid AS sejour_id,
(MAX(ARRAY[CASE WHEN IDT_TYPE = ''AMO'' THEN ''1'' ELSE ''2'' END::text,IDT_NOM]))[2] AS nom_assure,
(MAX(ARRAY[CASE WHEN IDT_TYPE = ''AMO'' THEN ''1'' ELSE ''2'' END::text,IDT_PRENOM]))[2] AS prenom_assure,
MAX(p_sejours.tiers_payant_0_id),
MAX(p_sejours.tiers_payant_1_id),
MAX(CASE WHEN AMO_MATRICULE_BENEF <> '''' THEN AMO_MATRICULE_BENEF ELSE AMO_MATRICULE END) AS matricule_1,
MAX(p_sejours.tiers_payant_2_id),
MAX(CASE WHEN AMC_MATRICULE <> '''' THEN AMO_MATRICULE ELSE AMC_NUM_CONTRAT END) AS matricule_2,
MAX(p_sejours.tiers_payant_22_id),
''''::text AS matricule_22
FROM prod_web100t.DAT_IDENTITE
JOIN prod_web100t.DAT_DA ON IDT_DA = DA_OID
JOIN prod_web100t.PATIENTS ON DA_PATIENT = PAT_ID
LEFT JOIN prod_web100t.DAT_ASSURE_AMO ON DA_ASSURE_AMO = AMO_OID
LEFT JOIN prod_web100t.DAT_ASSURE_AMC ON DA_ASSURE_AMC_1 = AMC_OID
JOIN activite[PX].p_sejours ON code_original = DA_OID
WHERE IDT_TYPE = ANY(ARRAY[''AMO'',''AMC''])
GROUP BY 1',1)
FROM pg_tables
WHERE schemaname = 'prod_web100t' AND tablename = 'dat_assure_amo'
;
]]>
2
GROUP BY 1,2,3,4,5;
UPDATE w_REGUL_MOUVEMENTS_keys SET
mode_traitement_code = w_NMCL_UNITEFONCTIONNELLE.mode_traitement_code,
dmt_code = w_NMCL_UNITEFONCTIONNELLE.dmt_code
FROM w_NMCL_UNITEFONCTIONNELLE
WHERE w_NMCL_UNITEFONCTIONNELLE.WEB100T_OID = MVT_UF_SOIN;
INSERT INTO activite[PX].t_lieux(
code_original_1, code_original_2, code_original_3, code_original_4, code_original_6)
SELECT MVT_UF_SOIN, SEJ_SPECIALITE, MVT_UF_GEO, MVT_LIT, MVT_UF_SOIN
FROM w_REGUL_MOUVEMENTS_keys
LEFT JOIN activite[PX].t_lieux ON (
code_original_1 = MVT_UF_SOIN AND
code_original_2 = SEJ_SPECIALITE AND
code_original_3 = MVT_UF_GEO AND
code_original_4 = MVT_LIT AND
code_original_6 = MVT_UF_SOIN
)
WHERE t_lieux.oid IS NULL
GROUP BY 1,2,3,4,5;
UPDATE w_REGUL_MOUVEMENTS_keys
set lieu_id = t_lieux.oid
FROM activite[PX].t_lieux
WHERE code_original_1 = MVT_UF_SOIN AND
code_original_2 = SEJ_SPECIALITE AND
code_original_3 = MVT_UF_GEO AND
code_original_4 = MVT_LIT AND
code_original_6 = MVT_UF_SOIN;
UPDATE activite[PX].t_lieux SET
service_facturation_id = COALESCE(t_services_facturation.oid,0),
mode_traitement_id = COALESCE(t_services_facturation.mode_traitement_id,0)
FROM
activite[PX].t_services_facturation
WHERE code_original_1 = t_services_facturation.code_original
AND (t_lieux.service_facturation_id <> COALESCE(t_services_facturation.oid,0) OR
t_lieux.mode_traitement_id <> COALESCE(t_services_facturation.mode_traitement_id,0)
)
;
UPDATE activite[PX].t_lieux SET
activite_id = COALESCE(t_activites.oid,0)
FROM
activite[PX].t_activites
WHERE code_original_2 = t_activites.code_original
AND activite_id <> COALESCE(t_activites.oid,0);
UPDATE activite[PX].t_lieux SET
unite_fonctionnelle_id = COALESCE(t_unites_fonctionnelles.oid,0)
FROM
activite[PX].t_unites_fonctionnelles
WHERE code_original_6 = t_unites_fonctionnelles.code_original
AND unite_fonctionnelle_id <> COALESCE(t_unites_fonctionnelles.oid,0);
UPDATE activite[PX].t_lieux SET
lit_id = COALESCE(t_lits.oid,0)
FROM
activite[PX].t_lits
WHERE code_original_3 || '-' || code_original_4 = t_lits.code_original AND
t_lieux.lit_id <> COALESCE(t_lits.oid,0)
;
UPDATE w_REGUL_MOUVEMENTS_keys
SET chambre_particuliere = t_lits.chambre_particuliere
FROM activite[PX].t_lieux
JOIN activite[PX].t_lits ON lit_id = t_lits.oid
WHERE w_REGUL_MOUVEMENTS_keys.lieu_id = t_lieux.oid;
CREATE INDEX w_REGUL_MOUVEMENTS_i1
ON w_REGUL_MOUVEMENTS
USING btree
(key);
-- calcul date fin
UPDATE w_REGUL_MOUVEMENTS
SET MVT_DATE_FIN = CASE WHEN w_REGUL_MOUVEMENTS_next.MVT_TYPE <> 2 THEN w_REGUL_MOUVEMENTS_next.MVT_DATE - interval '1 second' ELSE w_REGUL_MOUVEMENTS_next.MVT_DATE END,
MVT_DATE_FIN_DAT = date(CASE WHEN w_REGUL_MOUVEMENTS_next.MVT_TYPE <> 2 THEN w_REGUL_MOUVEMENTS_next.MVT_DATE - interval '1 second' ELSE w_REGUL_MOUVEMENTS_next.MVT_DATE END),
MVT_DATE_FIN_TIM = extract('hour' FROM CASE WHEN w_REGUL_MOUVEMENTS_next.MVT_TYPE <> 2 THEN w_REGUL_MOUVEMENTS_next.MVT_DATE - interval '1 second' ELSE w_REGUL_MOUVEMENTS_next.MVT_DATE END) * 10000 +
extract('minute' FROM CASE WHEN w_REGUL_MOUVEMENTS_next.MVT_TYPE <> 2 THEN w_REGUL_MOUVEMENTS_next.MVT_DATE - interval '1 second' ELSE w_REGUL_MOUVEMENTS_next.MVT_DATE END) * 100 +
extract('second' FROM CASE WHEN w_REGUL_MOUVEMENTS_next.MVT_TYPE <> 2 THEN w_REGUL_MOUVEMENTS_next.MVT_DATE - interval '1 second' ELSE w_REGUL_MOUVEMENTS_next.MVT_DATE END),
MVT_TYPE_next = w_REGUL_MOUVEMENTS_next.MVT_TYPE,
MVT_UF_SOIN_next = w_REGUL_MOUVEMENTS_next.MVT_UF_SOIN,
MVT_UF_GEO_next = w_REGUL_MOUVEMENTS_next.MVT_UF_GEO
FROM w_REGUL_MOUVEMENTS w_REGUL_MOUVEMENTS_next
WHERE w_REGUL_MOUVEMENTS.DA_OID = w_REGUL_MOUVEMENTS_next.DA_OID
AND w_REGUL_MOUVEMENTS.sequence = w_REGUL_MOUVEMENTS_next.sequence - 1;
-- calcul mvt avant
UPDATE w_REGUL_MOUVEMENTS
SET
MVT_TYPE_before = w_REGUL_MOUVEMENTS_before.MVT_TYPE,
MVT_UF_SOIN_before = w_REGUL_MOUVEMENTS_before.MVT_UF_SOIN,
MVT_UF_GEO_before = w_REGUL_MOUVEMENTS_before.MVT_UF_GEO
FROM w_REGUL_MOUVEMENTS w_REGUL_MOUVEMENTS_before
WHERE w_REGUL_MOUVEMENTS.DA_OID = w_REGUL_MOUVEMENTS_before.DA_OID
AND w_REGUL_MOUVEMENTS.sequence = w_REGUL_MOUVEMENTS_before.sequence + 1
AND w_REGUL_MOUVEMENTS.MVT_TYPE <> 2;
UPDATE w_DAT_DA SET
dup_type_sejour = p_sejours.type_sejour,
dup_code_prevu = p_sejours.code_prevu,
dup_sejour_id = p_sejours.oid,
dup_no_sejour = p_sejours.no_sejour,
dup_medecin_sejour_id = p_sejours.medecin_sejour_id,
dup_etat = p_sejours.etat
FROM activite[PX].p_sejours
WHERE DA_OID = p_sejours.code_original;
-- creation mouvements par jour
CREATE INDEX w_REGUL_MOUVEMENTS_i2
ON w_REGUL_MOUVEMENTS
USING btree
(DA_OID);
CREATE INDEX w_REGUL_MOUVEMENTS_i3
ON w_REGUL_MOUVEMENTS
USING btree
(MVT_DATE_DAT);
VACUUM ANALYSE w_REGUL_MOUVEMENTS
;
VACUUM ANALYSE w_DAT_DA
;
VACUUM ANALYSE w_REGUL_MOUVEMENTS_keys
;
DROP TABLE IF EXISTS w_mouvements_sejour;
CREATE TEMP TABLE w_mouvements_sejour AS
SELECT
w_REGUL_MOUVEMENTS.DA_OID,
w_DAT_DA.dup_no_sejour AS no_sejour,
w_DAT_DA.dup_sejour_id AS sejour_id,
sequence,
p_calendrier.date,
p_calendrier.jour_semaine,
p_calendrier.is_weekend,
CASE WHEN p_calendrier.date = MVT_DATE_DAT THEN MVT_DATE_TIM ELSE 0 END AS heure_debut,
CASE WHEN p_calendrier.date = MVT_DATE_FIN_DAT THEN MVT_DATE_FIN_TIM ELSE 240000 END AS heure_fin,
CASE WHEN p_calendrier.date = MVT_DATE_DAT AND MVT_TYPE = 1 AND w_DAT_DA.dup_type_sejour = '1' THEN 1 ELSE 0 END AS nb_entrees_directes,
CASE WHEN p_calendrier.date = MVT_DATE_FIN_DAT AND MVT_TYPE_next = 2 AND w_DAT_DA.dup_type_sejour = '1' THEN 1 ELSE 0 END AS nb_sorties_directes,
CASE WHEN p_calendrier.date = MVT_DATE_DAT AND MVT_TYPE = 1 AND w_DAT_DA.dup_type_sejour = '1' THEN '1' ELSE '0' END AS est_jour_entree,
CASE WHEN p_calendrier.date = MVT_DATE_FIN_DAT AND MVT_TYPE_next = 2 AND w_DAT_DA.dup_type_sejour = '1' THEN '1' ELSE '0' END AS est_jour_sortie,
CASE WHEN w_DAT_DA.dup_type_sejour = '1' THEN '1' ELSE '0' END AS est_jour_hospitalisation,
CASE WHEN p_calendrier.date = MVT_DATE_DAT AND MVT_TYPE = 1 AND w_DAT_DA.dup_type_sejour = '2' THEN 1 ELSE 0 END AS nb_ambulatoires,
CASE WHEN p_calendrier.date = MVT_DATE_DAT AND MVT_TYPE = 1 AND w_DAT_DA.dup_type_sejour = '3' THEN 1 ELSE 0 END AS nb_externes,
CASE WHEN p_calendrier.date = MVT_DATE_DAT AND MVT_TYPE = 1 AND w_DAT_DA.dup_type_sejour <> '9' THEN
CASE WHEN dmt_code IN ('303', '307', '308', '401', '402', '403', '404', '405', '406', '407', '408', '409') THEN 1
WHEN SEJ_URGENCE = 1 THEN 1
ELSE 0 END
ELSE 0 END AS nb_urgences,
0 as nb_seances,
CASE WHEN p_calendrier.date = MVT_DATE_DAT AND MVT_TYPE = 4 AND w_DAT_DA.dup_type_sejour = '1' AND w_REGUL_MOUVEMENTS.MVT_UF_SOIN <> MVT_UF_SOIN_before THEN 1 ELSE 0 END AS nb_entrees_mutation_service,
CASE WHEN p_calendrier.date = MVT_DATE_FIN_DAT AND MVT_TYPE_next = 4 AND w_DAT_DA.dup_type_sejour = '1' AND w_REGUL_MOUVEMENTS.MVT_UF_SOIN <> MVT_UF_SOIN_next THEN 1 ELSE 0 END AS nb_sorties_mutation_service,
CASE WHEN p_calendrier.date = MVT_DATE_DAT AND MVT_TYPE = 4 AND w_DAT_DA.dup_type_sejour = '1' AND w_REGUL_MOUVEMENTS.MVT_UF_GEO <> MVT_UF_GEO_before THEN 1 ELSE 0 END AS nb_entrees_mutation_etage,
CASE WHEN p_calendrier.date = MVT_DATE_FIN_DAT AND MVT_TYPE_next = 4 AND w_DAT_DA.dup_type_sejour = '1' AND w_REGUL_MOUVEMENTS.MVT_UF_GEO <> MVT_UF_GEO_next THEN 1 ELSE 0 END AS nb_sorties_mutation_etage,
0 AS nb_entrees_mutation_activite,
0 AS nb_sorties_mutation_activite,
0 AS nb_entrees_mutation_unite_medicale,
0 AS nb_sorties_mutation_unite_medicale,
CASE WHEN w_DAT_DA.dup_type_sejour = '1' AND (p_calendrier.date <> MVT_DATE_FIN_DAT OR MVT_TYPE_next = 2) THEN 1 ELSE 0 END AS nb_jours_js_inclus,
CASE WHEN w_DAT_DA.dup_type_sejour = '1' AND p_calendrier.date <> MVT_DATE_FIN_DAT THEN 1 ELSE 0 END AS nb_jours_js_non_inclus,
CASE WHEN w_DAT_DA.dup_type_sejour IN ('1','2') AND chambre_particuliere = 'O' THEN '1' ELSE '0' END AS est_chambre_particuliere,
CASE WHEN w_DAT_DA.dup_type_sejour IN ('1','2') AND chambre_particuliere = 'O' AND (p_calendrier.date <> MVT_DATE_FIN_DAT OR MVT_TYPE_next = 2) THEN 1 ELSE 0 END AS nb_chambres_particulieres,
0::numeric AS nb_bebes,
lieu_id,
w_DAT_DA.dup_medecin_sejour_id as medecin_sejour_id,
CASE WHEN w_DAT_DA.dup_code_prevu = '1' OR p_calendrier.date > date(now()) THEN '1' ELSE '0' END AS est_mouvement_previsionnel
FROM w_REGUL_MOUVEMENTS
JOIN w_DAT_DA ON w_DAT_DA.DA_OID = w_REGUL_MOUVEMENTS.DA_OID
JOIN w_REGUL_MOUVEMENTS_keys ON w_REGUL_MOUVEMENTS.key = w_REGUL_MOUVEMENTS_keys.key
JOIN base.p_calendrier ON p_calendrier.date BETWEEN MVT_DATE_DAT AND MVT_DATE_FIN_DAT AND p_calendrier.date <= date(now()) + interval '1 month'
WHERE MVT_TYPE <> 2
AND w_DAT_DA.dup_etat = ''
AND (w_DAT_DA.dup_type_sejour NOT IN ('3') OR (w_DAT_DA.dup_type_sejour IN ('3') AND MVT_TYPE = 1 AND p_calendrier.date = MVT_DATE_DAT))
AND (w_DAT_DA.dup_code_prevu <> '1' AND p_calendrier.date <= date(now()) OR p_calendrier.date >= date(now()))
ORDER BY sequence, p_calendrier.date;
-- bébés
DROP TABLE IF EXISTS w_CCAM_bebes;
CREATE TEMP TABLE w_CCAM_bebes AS
SELECT
p_sejours.no_sejour,
MAX(CASE WHEN t_actes.texte ILIKE '%multiple%' THEN 2 ELSE 1 END) AS nb_bebes
FROM prod_web100t.DAT_PRESTATIONS_GAP
JOIN activite[PX].p_sejours ON PREST_DA = p_sejours.code_original
JOIN w_ART_ARTICLES ON PREST_ARTICLE = ART_OID
JOIN base.t_actes ON t_actes.oid = acte_id AND
t_actes.code LIKE 'JQG%' AND
t_actes.texte ILIKE 'accouchement%'
WHERE PREST_DELETED = 0
GROUP BY 1;
CREATE INDEX w_CCAM_bebes_i1
ON w_CCAM_bebes
USING btree
(no_sejour);
UPDATE w_mouvements_sejour
SET nb_bebes = w_CCAM_bebes.nb_bebes
FROM w_CCAM_bebes
WHERE w_CCAM_bebes.no_sejour = w_mouvements_sejour.no_sejour AND
(nb_entrees_directes = 1 OR nb_externes = 1 OR nb_ambulatoires = 1);
-- seances selon prestation Dxx facturées
DROP TABLE IF EXISTS w_sejours_seances;
CREATE TEMP TABLE w_sejours_seances AS
SELECT
p_sejours.no_sejour,
date(FLT_DATE_DEBUT) AS date,
SUM(CASE WHEN FLT_TOTAL_TTC >= 0 THEN 1 ELSE -1 END) AS nb_seances
FROM activite[PX].p_sejours
JOIN prod_web100t.FAC_FACT_TIER ON FT_DA = code_original
JOIN prod_web100t.FAC_FACT_LIGNE_TIER ON FLT_FACTURE_TIER = FT_OID AND FLT_CODE_PREST BETWEEN 'D01' AND 'D19'
WHERE FLT_IS_ETS = 1 AND FLT_RECAP <> 0
GROUP BY 1,2
ORDER BY 1,2
;
CREATE INDEX w_sejours_seances_i1
ON w_sejours_seances
USING btree
(no_sejour);
UPDATE w_mouvements_sejour
SET nb_seances = w_sejours_seances.nb_seances
FROM w_sejours_seances
WHERE w_sejours_seances.no_sejour = w_mouvements_sejour.no_sejour AND
w_sejours_seances.date = w_mouvements_sejour.date AND
w_mouvements_sejour.nb_seances IS DISTINCT FROM w_sejours_seances.nb_seances;
-- seances selon Actes (JV Séances Facturés)
DROP TABLE IF EXISTS w_sejours_seances;
CREATE TEMP TABLE w_sejours_seances AS
SELECT
p_sejours.no_sejour,
date(FLT_DATE_DEBUT) AS date,
SUM(CASE WHEN FLT_TOTAL_TTC >= 0 THEN 1 ELSE -1 END) AS nb_seances
FROM activite[PX].p_sejours
JOIN prod_web100t.FAC_FACT_TIER ON FT_DA = code_original
JOIN prod_web100t.FAC_FACT_LIGNE_TIER ON FLT_FACTURE_TIER = FT_OID
JOIN w_ART_ARTICLES ON FLT_ARTICLE = ART_OID AND
(
ART_CODE_ACTE LIKE 'JV%' AND (ART_LIB_ACTE ILIKE '%seance%' OR ART_LIB_ACTE ILIKE '%séance%' ) OR
ART_CODE_ACTE LIKE 'JVJF%'
)
WHERE FLT_IS_ETS = 0 AND FLT_RECAP <> 0
GROUP BY 1,2
ORDER BY 1,2
;
CREATE INDEX w_sejours_seances_i1
ON w_sejours_seances
USING btree
(no_sejour);
UPDATE w_mouvements_sejour
SET nb_seances = w_sejours_seances.nb_seances
FROM w_sejours_seances
WHERE w_sejours_seances.no_sejour = w_mouvements_sejour.no_sejour AND
w_sejours_seances.date = w_mouvements_sejour.date AND
w_mouvements_sejour.nb_seances IS DISTINCT FROM w_sejours_seances.nb_seances;
-- seances selon prestation Dxx saisies
DROP TABLE IF EXISTS w_sejours_seances;
CREATE TEMP TABLE w_sejours_seances AS
SELECT
p_sejours.no_sejour,
date(PREST_DATE_DEBUT) AS date,
SUM(CASE WHEN PREST_QUANTITE <> 0 THEN PREST_QUANTITE ELSE 1 END) AS nb_seances
FROM prod_web100t.DAT_PRESTATIONS_GAP
JOIN prod_web100t.DAT_DA ON PREST_DA = DA_OID
JOIN activite[PX].p_sejours ON DA_OID = p_sejours.code_original AND date(PREST_DATE_DEBUT) BETWEEN date_entree AND date_sortie
JOIN w_ART_ARTICLES ON PREST_ARTICLE = ART_OID
WHERE ART_CODE BETWEEN 'D01' AND 'D19' AND PREST_DELETED = 0
GROUP BY 1,2;
CREATE INDEX w_sejours_seances_i1
ON w_sejours_seances
USING btree
(no_sejour);
UPDATE w_mouvements_sejour
SET nb_seances = w_sejours_seances.nb_seances
FROM w_sejours_seances
WHERE w_sejours_seances.no_sejour = w_mouvements_sejour.no_sejour AND
w_sejours_seances.date = w_mouvements_sejour.date AND
w_mouvements_sejour.nb_seances IS DISTINCT FROM w_sejours_seances.nb_seances;
-- seances selon actes JV séance saisis
DROP TABLE IF EXISTS w_sejours_seances;
CREATE TEMP TABLE w_sejours_seances AS
SELECT
p_sejours.no_sejour,
date(PREST_DATE_DEBUT) AS date,
SUM(CASE WHEN PREST_QUANTITE <> 0 THEN PREST_QUANTITE ELSE 1 END) AS nb_seances
FROM prod_web100t.DAT_PRESTATIONS_GAP
JOIN prod_web100t.DAT_DA ON PREST_DA = DA_OID
JOIN activite[PX].p_sejours ON DA_OID = p_sejours.code_original AND date(PREST_DATE_DEBUT) BETWEEN date_entree AND date_sortie
JOIN w_ART_ARTICLES ON PREST_ARTICLE = ART_OID AND
(
ART_CODE_ACTE LIKE 'JV%' AND (ART_LIB_ACTE ILIKE '%seance%' OR ART_LIB_ACTE ILIKE '%séance%' ) OR
ART_CODE_ACTE LIKE 'JVJF%'
)
WHERE PREST_DELETED = 0
GROUP BY 1,2;
CREATE INDEX w_sejours_seances_i1
ON w_sejours_seances
USING btree
(no_sejour);
UPDATE w_mouvements_sejour
SET nb_seances = w_sejours_seances.nb_seances
FROM w_sejours_seances
WHERE w_sejours_seances.no_sejour = w_mouvements_sejour.no_sejour AND
w_sejours_seances.date = w_mouvements_sejour.date AND
w_mouvements_sejour.nb_seances IS DISTINCT FROM w_sejours_seances.nb_seances;
-- seances selon K 15 ou 9606
INSERT INTO activite.t_divers (code, description, texte, valeur)
SELECT 'K15_SEANCE',
'Création de séances pour les actes K coefficient 15 : 0 = Jamais, 1 = Toujours, 2 = Sauf pour les séjours Hospitalisation',
'Règle de création de séances pour les actes K coefficient 15',
'1'
WHERE 'K15_SEANCE' NOT IN (SELECT code FROM activite.t_divers)
;
DROP TABLE IF EXISTS w_sejours_seances;
CREATE TEMP TABLE w_sejours_seances AS
SELECT
p_sejours.no_sejour,
date(PREST_DATE_DEBUT) AS date,
1::numeric AS nb_seances
FROM prod_web100t.DAT_PRESTATIONS_GAP
JOIN prod_web100t.DAT_DA ON PREST_DA = DA_OID
JOIN activite[PX].p_sejours ON DA_OID = p_sejours.code_original AND date(PREST_DATE_DEBUT) BETWEEN date_entree AND date_sortie
JOIN activite.t_divers ON t_divers.code = 'K15_SEANCE'
WHERE PREST_DELETED = 0 AND
(
PREST_CODE = 'K' AND PREST_COEFF = 15 AND t_divers.valeur IN ('1','2') OR
PREST_CODE IN ('9605','9606')
)
GROUP BY 1,2;
INSERT INTO w_sejours_seances(no_sejour,date,nb_seances)
SELECT
p_sejours.no_sejour,
date(PREST_DATE_DEBUT) AS date,
1::numeric AS nb_seances
FROM prod_web100t.DAT_PRESTATIONS_GAP
JOIN prod_web100t.DAT_DA ON PREST_DA = DA_OID
JOIN activite[PX].p_sejours ON DA_OID = p_sejours.code_original AND date(PREST_DATE_DEBUT) BETWEEN date_entree AND date_sortie
JOIN activite.t_divers ON t_divers.code = 'K15_SEANCE'
LEFT JOIN w_sejours_seances from_ghs ON from_ghs.no_sejour = p_sejours.no_sejour
WHERE from_ghs.no_sejour IS NULL AND
PREST_DELETED = 0 AND
(
PREST_CODE = 'K' AND PREST_COEFF = 15 AND t_divers.valeur IN ('1','2') OR
PREST_CODE IN ('9605','9606')
)
GROUP BY 1,2
;
CREATE INDEX w_sejours_seances_i1
ON w_sejours_seances
USING btree
(no_sejour);
UPDATE w_mouvements_sejour
SET nb_seances = w_sejours_seances.nb_seances
FROM w_sejours_seances
WHERE w_sejours_seances.no_sejour = w_mouvements_sejour.no_sejour AND
w_sejours_seances.date = w_mouvements_sejour.date AND
w_mouvements_sejour.nb_seances IS DISTINCT FROM w_sejours_seances.nb_seances;
-- seances selon GHS pmsi
DROP TABLE IF EXISTS w_sejours_seances;
CREATE TEMP TABLE w_sejours_seances AS
SELECT
p_sejours.no_sejour,
date_entree AS date,
1 AS nb_seances
FROM activite[PX].p_sejours
JOIN base.t_ghs ON p_sejours.ghs_id = t_ghs.oid
LEFT JOIN base.t_ghm ON p_sejours.ghm_id = t_ghm.oid
WHERE date_sortie - date_entree <= 1 AND
no_sejour != ALL (ARRAY (SELECT DISTINCT no_sejour FROM w_mouvements_sejour WHERE nb_seances > 0)::text[]) AND
(
t_ghs.texte ilike '%séance%' OR
t_ghm.code LIKE '28%'
);
CREATE INDEX w_sejours_seances_i1
ON w_sejours_seances
USING btree
(no_sejour);
UPDATE w_mouvements_sejour
SET nb_seances = w_sejours_seances.nb_seances
FROM w_sejours_seances
WHERE w_sejours_seances.no_sejour = w_mouvements_sejour.no_sejour AND
w_sejours_seances.date = w_mouvements_sejour.date AND
w_mouvements_sejour.nb_seances IS DISTINCT FROM w_sejours_seances.nb_seances;
-- Nombre de seances pour forcage service seances
UPDATE w_mouvements_sejour
SET nb_seances = 1
FROM activite[PX].p_sejours
WHERE p_sejours.no_sejour = w_mouvements_sejour.no_sejour AND
p_sejours.date_entree = w_mouvements_sejour.date AND
p_sejours.type_sejour = '5' AND
p_sejours.no_sejour != ALL (ARRAY (SELECT no_sejour FROM w_mouvements_sejour WHERE nb_seances <> 0)::text[]);
-- une seule séance par jour pour un séjour de type séance
UPDATE w_mouvements_sejour
SET nb_seances = 0
FROM (
SELECT
w_mouvements_sejour.no_sejour,
date,
MAX(w_mouvements_sejour.heure_debut) as heure_debut
FROM w_mouvements_sejour
JOIN activite[PX].p_sejours ON sejour_id = p_sejours.oid
WHERE nb_seances > 0 AND type_sejour = '5'
GROUP BY 1,2
HAVING COUNT(*) > 1
) ref
WHERE 1=1
AND ref.no_sejour = w_mouvements_sejour.no_sejour
AND ref.date = w_mouvements_sejour.date
AND ref.heure_debut != w_mouvements_sejour.heure_debut
;
-- Prise en compte mutations ambulatoire
INSERT INTO activite.t_divers (code, texte, valeur, description)
SELECT
'MUTATIONAMBU',
'Traitement des mutations / ambulatoire',
'0',
'0=Prendre en compte mouvement d''entrée, 1=Prendre en compte mouvement de sortie'
WHERE 'MUTATIONAMBU' NOT IN (SELECT code FROM activite.t_divers);
;
DROP TABLE IF EXISTS w_correction_ambu;
CREATE TEMP TABLE w_correction_ambu AS
SELECT p_mouvements_sejour.no_sejour,
(MAX(Array[COALESCE(t_lits.est_prioritaire,'0'), to_char(heure_debut,'FM000000'),lieu_id::text]))[3]::bigint AS lieu_id,
MIN(heure_entree) AS heure_entree,
MAX(heure_sortie) AS heure_sortie
FROM w_mouvements_sejour p_mouvements_sejour
JOIN activite[PX].p_sejours ON p_mouvements_sejour.no_sejour = p_sejours.no_sejour
JOIN activite.t_divers ON t_divers.code = 'MUTATIONAMBU' ANd t_divers.valeur = '1'
JOIN activite[PX].t_lieux ON lieu_id = t_lieux.oid
JOIN activite[PX].t_lits ON t_lieux.lit_id = t_lits.oid
WHERE type_sejour = '2' AND code_sorti = '1' AND date_sortie = date_entree
GROUP BY 1
HAVING count(*) > 1 AND count(DISTINCT date) = 1
;
DELETE FROM w_mouvements_sejour p_mouvements_sejour
WHERE nb_ambulatoires = '0' AND
no_sejour = ANY (ARRAY (SELECT DISTINCT no_sejour FROM w_correction_ambu)::text[])
;
UPDATE w_mouvements_sejour p_mouvements_sejour
SET lieu_id = w_correction_ambu.lieu_id,
heure_debut = heure_entree,
heure_fin = heure_sortie
FROM w_correction_ambu
WHERE p_mouvements_sejour.no_sejour = w_correction_ambu.no_sejour AND
p_mouvements_sejour.nb_ambulatoires = '1'
;
-- Lignes inutiles
DELETE FROM w_mouvements_sejour
WHERE
nb_entrees_directes = 0 AND
nb_sorties_directes = 0 AND
est_jour_hospitalisation <> '1' AND
nb_ambulatoires = 0 AND
nb_externes = 0 AND
nb_urgences = 0 AND
nb_seances = 0 AND
nb_entrees_mutation_service = 0 AND
nb_sorties_mutation_service = 0 AND
nb_entrees_mutation_etage = 0 AND
nb_sorties_mutation_etage = 0 AND
nb_entrees_mutation_activite = 0 AND
nb_sorties_mutation_activite = 0 AND
nb_entrees_mutation_unite_medicale = 0 AND
nb_sorties_mutation_unite_medicale = 0 AND
nb_jours_js_inclus = 0 AND
nb_jours_js_non_inclus = 0 AND
est_chambre_particuliere <> '1' AND
nb_chambres_particulieres = 0 AND
nb_bebes = 0;
-- Doublons potentiels
DELETE FROM w_mouvements_sejour
USING (
SELECT
no_sejour, date, heure_debut, MIN(CTID) AS keepCTID
FROM w_mouvements_sejour
WHERE heure_fin >= heure_debut
GROUP BY 1,2,3
HAVING count(*) > 1) subview
WHERE w_mouvements_sejour.no_sejour = subview.no_sejour AND
w_mouvements_sejour.date = subview.date AND
w_mouvements_sejour.heure_debut = subview.heure_debut AND
subview.keepCTID <> w_mouvements_sejour.CTID;
-- Mise en production des mouvements
SELECT base.cti_disable_index('activite[PX]', 'i_mouvements_sejour_1');
SELECT base.cti_disable_index('activite[PX]', 'i_mouvements_sejour_2');
SELECT base.cti_disable_index('activite[PX]', 'i_mouvements_sejour_3');
SELECT base.cti_disable_index('activite[PX]', 'i_mouvements_sejour_4');
SELECT base.cti_disable_index('activite[PX]', 'i_mouvements_sejour_5');
INSERT INTO activite[PX].p_mouvements_sejour(
sejour_id, no_sejour, date, est_mouvement_previsionnel, nb_jours_js_non_inclus,
lieu_id, nb_entrees_directes, nb_sorties_directes,
nb_urgences, nb_externes, nb_ambulatoires, medecin_sejour_id,
nb_jours_js_inclus, nb_seances, nb_entrees_mutation_service,
nb_sorties_mutation_service, nb_entrees_mutation_activite, nb_sorties_mutation_activite,
nb_entrees_mutation_etage, nb_sorties_mutation_etage, nb_chambres_particulieres,
heure_debut, heure_fin, est_jour_entree, est_jour_sortie, est_jour_hospitalisation,
est_chambre_particuliere,
nb_entrees_mutation_unite_medicale, nb_sorties_mutation_unite_medicale, nb_bebes,
jour_semaine, is_weekend)
SELECT sejour_id, no_sejour, date, est_mouvement_previsionnel ,nb_jours_js_non_inclus,
lieu_id, nb_entrees_directes, nb_sorties_directes,
nb_urgences, nb_externes, nb_ambulatoires, medecin_sejour_id,
nb_jours_js_inclus, nb_seances, nb_entrees_mutation_service,
nb_sorties_mutation_service, nb_entrees_mutation_activite, nb_sorties_mutation_activite,
nb_entrees_mutation_etage, nb_sorties_mutation_etage, nb_chambres_particulieres,
heure_debut, heure_fin, est_jour_entree, est_jour_sortie, est_jour_hospitalisation,
est_chambre_particuliere,
nb_entrees_mutation_unite_medicale, nb_sorties_mutation_unite_medicale, nb_bebes,
jour_semaine, is_weekend
FROM w_mouvements_sejour
WHERE heure_fin >= heure_debut
ORDER BY no_sejour, sequence;
SELECT base.cti_enable_index('activite[PX]', 'i_mouvements_sejour_1');
SELECT base.cti_enable_index('activite[PX]', 'i_mouvements_sejour_2');
SELECT base.cti_enable_index('activite[PX]', 'i_mouvements_sejour_3');
SELECT base.cti_enable_index('activite[PX]', 'i_mouvements_sejour_4');
SELECT base.cti_enable_index('activite[PX]', 'i_mouvements_sejour_5');
-- Lieux de sortie
UPDATE activite[PX].p_sejours SET lieu_sortie_id = p_mouvements_sejour.lieu_id
FROM activite[PX].p_mouvements_sejour
WHERE p_sejours.no_sejour = p_mouvements_sejour.no_sejour
AND p_mouvements_sejour.date = p_sejours.date_sortie
AND (lieu_sortie_id <> p_mouvements_sejour.lieu_id OR lieu_sortie_id IS NULL);
UPDATE activite[PX].p_sejours SET lieu_sortie_id = p_mouvements_sejour.lieu_id
FROM activite[PX].p_mouvements_sejour
WHERE p_sejours.no_sejour = p_mouvements_sejour.no_sejour
AND p_mouvements_sejour.date = p_sejours.date_sortie AND p_mouvements_sejour.nb_sorties_directes = 1
AND (lieu_sortie_id <> p_mouvements_sejour.lieu_id OR lieu_sortie_id IS NULL);
UPDATE activite[PX].p_sejours SET lieu_sortie_id = p_mouvements_sejour.lieu_id
FROM activite[PX].p_mouvements_sejour
WHERE p_sejours.no_sejour = p_mouvements_sejour.no_sejour
AND (p_sejours.lieu_sortie_id = 0 OR lieu_sortie_id IS NULL) ;
UPDATE activite[PX].p_sejours SET lieu_sortie_id = 0
WHERE lieu_sortie_id IS NULL ;
UPDATE activite[PX].p_sejours SET lieu_sortie_id = 0
WHERE p_sejours.code_prevu = '1' AND (p_sejours.lieu_sortie_id = 0 OR lieu_sortie_id IS NULL);
UPDATE activite[PX].p_sejours
SET code_sorti = '1'
FROM activite[PX].p_mouvements_sejour
WHERE p_sejours.no_sejour = p_mouvements_sejour.no_sejour AND
code_sorti = '0' AND
(nb_ambulatoires > 0 OR nb_externes > 0) AND
date_sortie <= now();
UPDATE activite[PX].p_sejours
SET type_sejour = '5'
FROM activite[PX].t_lieux
JOIN activite[PX].t_services_facturation ON t_services_facturation.oid = service_facturation_id
WHERE lieu_sortie_id = t_lieux.oid AND
p_sejours.type_sejour <> '5' AND
p_sejours.type_sejour <> '1' AND
t_services_facturation.type_sejour NOT IN ('2','0sauf5') AND
no_sejour IN (
SELECT no_sejour
FROM activite[PX].p_mouvements_sejour
WHERE nb_seances > 0);
UPDATE activite[PX].p_mouvements_sejour
SET nb_externes = 0, nb_ambulatoires = 0
FROM activite[PX].p_sejours
WHERE p_mouvements_sejour.no_sejour = p_sejours.no_sejour AND
p_sejours.type_sejour = '5' AND
(
nb_externes <> 0 OR
nb_ambulatoires <> 0
);
-- Forcage service selon etage
UPDATE activite[PX].t_lieux
SET service_facturation_id = t_etages.service_force_id
FROM activite[PX].t_lits
JOIN activite[PX].t_etages ON etage_id = t_etages.oid
WHERE lit_id = t_lits.oid AND
service_force_id <> 0 AND
service_facturation_id IS DISTINCT FROM t_etages.service_force_id;
]]>
1
) subview
WHERE FAC_FACTURE.FACT_OID = subview.FACT_OID',20);
]]>
1 AND FLT_IS_DIRECT = 0 THEN RD_MONTANT ELSE 0 END) AS RD_MONTANT_HON,
MAX(CASE WHEN RD_ETS = 1 THEN FR_DATE_ENC ELSE NULL END) AS FR_DATE_ENC_ETS,
MAX(CASE WHEN RD_ETS <> 1 AND FLT_IS_DIRECT = 0 THEN FR_DATE_ENC ELSE NULL END) AS FR_DATE_ENC_HON
FROM w_DAT_DA
JOIN prod_web100t.FAC_RGLMT_DETAILS ON RD_DA = DA_OID
JOIN prod_web100t.FAC_REGLEMENTS ON FR_OID = RD_REGLEMENT
JOIN prod_web100t.FAC_FACT_LIGNE_TIER ON RD_FACT_LINE = FLT_OID
GROUP BY 1;
ALTER TABLE w_FAC_RGLMT_DETAILS ADD CONSTRAINT w_FAC_RGLMT_DETAILS_pkey PRIMARY KEY(RD_FACT_TIER);
-- Extraction règlements si paiement direct comptabilisé
DROP TABLE IF EXISTS w_FAC_DIRECT_compta;
CREATE TEMP TABLE w_FAC_DIRECT_compta AS
SELECT FLT_FACTURE_TIER,
SUM(FLT_TOTAL_TTC) AS FLT_TOTAL_TTC
FROM prod_web100t.FAC_FACT_LIGNE_TIER
WHERE FLT_IS_ETS = 0 AND
FLT_IS_DIRECT = -1
GROUP BY 1
;
ALTER TABLE w_FAC_DIRECT_compta ADD CONSTRAINT w_FAC_DIRECT_compta_pkey PRIMARY KEY(FLT_FACTURE_TIER);
DROP TABLE IF EXISTS w_ENV_FACTURE;
CREATE TEMP TABLE w_ENV_FACTURE AS
SELECT FACT_OID,
MAX(CASE WHEN ENV_TYPE_TIER = 'AMO' THEN COALESCE(ENV_TELETRANS, ENV_CREATED) ELSE NULL END) AS ENV_TELETRANS_AMO,
MAX(CASE WHEN ENV_TYPE_TIER = 'AMC' THEN COALESCE(ENV_TELETRANS, ENV_CREATED) ELSE NULL END) AS ENV_TELETRANS_AMC,
MAX(CASE WHEN ENV_TYPE_TIER = 'AMD' THEN COALESCE(ENV_TELETRANS, ENV_CREATED) ELSE NULL END) AS ENV_TELETRANS_AMD,
MAX(FACT_DATE) AS ENV_TELETRANS_CLI
FROM prod_web100t.FAC_FACTURE
JOIN prod_web100t.FAC_FACT_TIER ON FT_FACTURE = FACT_OID
LEFT JOIN prod_web100t.ENV_FACTURE ON FT_OID = EF_FACTURE
LEFT JOIN prod_web100t.ENV_ENVOI ON ENV_OID = EF_ENVOI
GROUP BY 1;
ALTER TABLE w_ENV_FACTURE ADD CONSTRAINT w_ENV_FACTURE_pkey PRIMARY KEY(FACT_OID);
DROP TABLE IF EXISTS w_FAC_FACTURE_od;
CREATE TEMP TABLE w_FAC_FACTURE_od AS
SELECT FAC_FACTURE.FACT_OID,
CASE
WHEN FAC_FACTURE.FACT_TYPE = 2 AND FAC_FACTURE.FACT_TYPE <> FAC_FACTURE_PRED.FACT_TYPE THEN FAC_FACTURE_PRED.FACT_NUMERO
WHEN FAC_FACTURE.FACT_TYPE <> 2 AND FAC_FACTURE.FACT_TYPE <> FAC_FACTURE_NEXT.FACT_TYPE THEN FAC_FACTURE_NEXT.FACT_NUMERO
ELSE NULL END AS FACT_NUMERO_OD
FROM prod_web100t.FAC_FACTURE
LEFT JOIN prod_web100t.FAC_FACTURE FAC_FACTURE_PRED ON FAC_FACTURE.FACT_PRED_FACTURE = FAC_FACTURE_PRED.FACT_OID
LEFT JOIN prod_web100t.FAC_FACTURE FAC_FACTURE_NEXT ON FAC_FACTURE.FACT_NEXT_FACTURE = FAC_FACTURE_NEXT.FACT_OID
WHERE FAC_FACTURE.FACT_PRED_FACTURE <> 0 OR FAC_FACTURE.FACT_NEXT_FACTURE <> 0;
ALTER TABLE w_FAC_FACTURE_od ADD CONSTRAINT w_FAC_FACTURE_od_pkey PRIMARY KEY(FACT_OID);
-- Date de comptabilisation
DROP TABLE IF EXISTS w_FAC_FACTURE_vente;
CREATE TEMP TABLE w_FAC_FACTURE_vente AS
SELECT FAC_FACTURE.FACT_OID,
MAX(FACT_TOTAL_ETS) AS w_FACT_TOTAL_ETS,
MAX(FACT_TOTAL_HO) AS w_FACT_TOTAL_HO,
MAX(FACT_DATE) AS w_FACT_DATE,
COALESCE(MIN(CASE
WHEN LNK_TYPE = 'FACT' THEN ECR_DATE
ELSE NULL END)
,'20991231') AS ECR_DATE
FROM prod_web100t.FAC_FACTURE
LEFT JOIN w_CPT_ECRITURE_source_OP_LINK ON
FACT_OID = ECR_REF_OID AND
ECR_REF_TYPE = 'FACTURE' AND
LNK_TYPE IN ('FACT') AND
(
ECR_TYPE IN ('CLIENT','IMPAYE','VENTE-DIRECTE','VENTE-DEP','VENTE-HON') AND LNK_ERROR = '' OR
LNK_JOURNAL = 'VE'
)
GROUP BY 1;
ALTER TABLE w_FAC_FACTURE_vente ADD CONSTRAINT w_FAC_FACTURE_vente_pkey PRIMARY KEY(FACT_OID);
-- Forcage date ventes pour facturés non comptabilisés (sur les factures non comptabilisées, placer la date du jour)
INSERT INTO activite.t_divers (code, texte, valeur, description)
SELECT
'WEB100T_FORCE_DATE_VENTE',
'Antériorité date facture (jours) pour forçage date vente si non comptabilisé',
'3',
'Antériorité date facture (jours) pour forçage date vente si non comptabilisé'
WHERE 'WEB100T_FORCE_DATE_VENTE' NOT IN (SELECT code FROM activite.t_divers);
;
UPDATE w_FAC_FACTURE_vente
SET ECR_DATE = date(now())
FROM prod_web100t.FAC_FACTURE
JOIN activite.t_divers ON t_divers.code = 'WEB100T_FORCE_DATE_VENTE'
WHERE FAC_FACTURE.FACT_OID = w_FAC_FACTURE_vente.FACT_OID AND
ECR_DATE = '20991231' AND
date(FACT_DATE) >= date(now() - (t_divers.valeur||' day')::interval)
;
-- Cas spécial de factures additives honoraires qui ne seraient pas trouvées (cf Saint Claude)
UPDATE w_FAC_FACTURE_vente
SET ECR_DATE = date_trunc('month',w_FACT_DATE)+interval '1 month' - interval '1 day'
WHERE date(ECR_DATE) = '20991231' AND
w_FACT_TOTAL_ETS = 0 AND
w_FACT_TOTAL_HO <> 0
;
DROP TABLE IF EXISTS w_FAC_FACTURE_cpt;
CREATE TEMP TABLE w_FAC_FACTURE_cpt AS
SELECT
FACT_OID,
SUM(CASE WHEN COALESCE(ECR_DATE,'20991231') <> '20991231' AND FLT_IS_ETS = 1 AND FLT_IS_DIRECT <= 0 AND FT_TYPE_TIER <> 'ETS' THEN FLT_TOTAL_TTC ELSE 0 END) AS FLT_TOTAL_CPT_ETS,
SUM(CASE WHEN COALESCE(ECR_DATE,'20991231') <> '20991231' AND FLT_IS_ETS = 1 AND FLT_IS_DIRECT <= 0 AND FT_TYPE_TIER = 'CLI' THEN FLT_TOTAL_TTC ELSE 0 END) AS FLT_TOTAL_CPT_ETS_CLI,
SUM(CASE WHEN COALESCE(ECR_DATE,'20991231') <> '20991231' AND FLT_IS_ETS = 1 AND FLT_IS_DIRECT <= 0 AND FT_TYPE_TIER = 'AMO' THEN FLT_TOTAL_TTC ELSE 0 END) AS FLT_TOTAL_CPT_ETS_AMO,
SUM(CASE WHEN COALESCE(ECR_DATE,'20991231') <> '20991231' AND FLT_IS_ETS = 1 AND FLT_IS_DIRECT <= 0 AND FT_TYPE_TIER = 'AMC' THEN FLT_TOTAL_TTC ELSE 0 END) AS FLT_TOTAL_CPT_ETS_AMC,
SUM(CASE WHEN COALESCE(ECR_DATE,'20991231') <> '20991231' AND FLT_IS_ETS = 1 AND FLT_IS_DIRECT <= 0 AND FT_TYPE_TIER = 'AMD' THEN FLT_TOTAL_TTC ELSE 0 END) AS FLT_TOTAL_CPT_ETS_AMD,
SUM(CASE WHEN COALESCE(ECR_DATE,'20991231') <> '20991231' AND FLT_IS_ETS = 0 AND FLT_IS_DIRECT <= 0 AND FT_TYPE_TIER <> 'ETS' THEN FLT_TOTAL_TTC ELSE 0 END) AS FLT_TOTAL_CPT_HON,
SUM(CASE WHEN COALESCE(ECR_DATE,'20991231') <> '20991231' AND FLT_IS_ETS = 0 AND FLT_IS_DIRECT <= 0 AND FT_TYPE_TIER = 'CLI' THEN FLT_TOTAL_TTC ELSE 0 END) AS FLT_TOTAL_CPT_HON_CLI,
SUM(CASE WHEN COALESCE(ECR_DATE,'20991231') <> '20991231' AND FLT_IS_ETS = 0 AND FLT_IS_DIRECT <= 0 AND FT_TYPE_TIER = 'AMO' THEN FLT_TOTAL_TTC ELSE 0 END) AS FLT_TOTAL_CPT_HON_AMO,
SUM(CASE WHEN COALESCE(ECR_DATE,'20991231') <> '20991231' AND FLT_IS_ETS = 0 AND FLT_IS_DIRECT <= 0 AND FT_TYPE_TIER = 'AMC' THEN FLT_TOTAL_TTC ELSE 0 END) AS FLT_TOTAL_CPT_HON_AMC,
SUM(CASE WHEN COALESCE(ECR_DATE,'20991231') <> '20991231' AND FLT_IS_ETS = 0 AND FLT_IS_DIRECT <= 0 AND FT_TYPE_TIER = 'AMD' THEN FLT_TOTAL_TTC ELSE 0 END) AS FLT_TOTAL_CPT_HON_AMD,
SUM(CASE WHEN COALESCE(ECR_DATE,'20991231') <> '20991231' AND FLT_IS_ETS = 1 AND FLT_IS_DIRECT <= 0 AND FT_TYPE_TIER <> 'ETS' THEN 0-FLT_IMPAYE ELSE 0 END) AS FLT_TOTAL_IMPAYE_ETS,
SUM(CASE WHEN COALESCE(ECR_DATE,'20991231') <> '20991231' AND FLT_IS_ETS = 1 AND FLT_IS_DIRECT <= 0 AND FT_TYPE_TIER = 'CLI' THEN 0-FLT_IMPAYE ELSE 0 END) AS FLT_TOTAL_IMPAYE_ETS_CLI,
SUM(CASE WHEN COALESCE(ECR_DATE,'20991231') <> '20991231' AND FLT_IS_ETS = 1 AND FLT_IS_DIRECT <= 0 AND FT_TYPE_TIER = 'AMO' THEN 0-FLT_IMPAYE ELSE 0 END) AS FLT_TOTAL_IMPAYE_ETS_AMO,
SUM(CASE WHEN COALESCE(ECR_DATE,'20991231') <> '20991231' AND FLT_IS_ETS = 1 AND FLT_IS_DIRECT <= 0 AND FT_TYPE_TIER = 'AMC' THEN 0-FLT_IMPAYE ELSE 0 END) AS FLT_TOTAL_IMPAYE_ETS_AMC,
SUM(CASE WHEN COALESCE(ECR_DATE,'20991231') <> '20991231' AND FLT_IS_ETS = 1 AND FLT_IS_DIRECT <= 0 AND FT_TYPE_TIER = 'AMD' THEN 0-FLT_IMPAYE ELSE 0 END) AS FLT_TOTAL_IMPAYE_ETS_AMD,
SUM(CASE WHEN COALESCE(ECR_DATE,'20991231') <> '20991231' AND FLT_IS_ETS = 0 AND FLT_IS_DIRECT <= 0 AND FT_TYPE_TIER <> 'ETS' THEN 0-FLT_IMPAYE ELSE 0 END) AS FLT_TOTAL_IMPAYE_HON,
SUM(CASE WHEN COALESCE(ECR_DATE,'20991231') <> '20991231' AND FLT_IS_ETS = 0 AND FLT_IS_DIRECT <= 0 AND FT_TYPE_TIER = 'CLI' THEN 0-FLT_IMPAYE ELSE 0 END) AS FLT_TOTAL_IMPAYE_HON_CLI,
SUM(CASE WHEN COALESCE(ECR_DATE,'20991231') <> '20991231' AND FLT_IS_ETS = 0 AND FLT_IS_DIRECT <= 0 AND FT_TYPE_TIER = 'AMO' THEN 0-FLT_IMPAYE ELSE 0 END) AS FLT_TOTAL_IMPAYE_HON_AMO,
SUM(CASE WHEN COALESCE(ECR_DATE,'20991231') <> '20991231' AND FLT_IS_ETS = 0 AND FLT_IS_DIRECT <= 0 AND FT_TYPE_TIER = 'AMC' THEN 0-FLT_IMPAYE ELSE 0 END) AS FLT_TOTAL_IMPAYE_HON_AMC,
SUM(CASE WHEN COALESCE(ECR_DATE,'20991231') <> '20991231' AND FLT_IS_ETS = 0 AND FLT_IS_DIRECT <= 0 AND FT_TYPE_TIER = 'AMD' THEN 0-FLT_IMPAYE ELSE 0 END) AS FLT_TOTAL_IMPAYE_HON_AMD
FROM prod_web100t.FAC_FACT_LIGNE_TIER
JOIN prod_web100t.FAC_FACT_TIER ON FLT_FACTURE_TIER = FT_OID
JOIN w_FAC_FACTURE_vente ON FLT_FACTURE = FACT_OID
WHERE FLT_RECAP <> 0
GROUP BY 1;
ALTER TABLE w_FAC_FACTURE_cpt ADD CONSTRAINT w_FAC_FACTURE_cpt_pkey PRIMARY KEY(FACT_OID);
DROP TABLE IF EXISTS w_FAC_FACTURE;
CREATE TEMP TABLE w_FAC_FACTURE AS
SELECT FAC_FACTURE.FACT_OID,
FAC_FACTURE.FACT_NUMERO,
FAC_FACTURE.FACT_DA,
FAC_FACTURE.FACT_TYPE,
FAC_FACTURE.FACT_PERIODE,
FAC_FACTURE.FACT_DATE,
MAX(CASE WHEN FT_TYPE_TIER = 'AMO' THEN FT_ORGANISME::text ELSE '' END) AS FT_ORGANISME_AMO,
MAX(CASE WHEN FT_TYPE_TIER = 'AMC' THEN FT_ORGANISME::text ELSE '' END) AS FT_ORGANISME_AMC,
MAX(CASE WHEN FT_TYPE_TIER = 'AMD' THEN FT_ORGANISME::text ELSE '' END) AS FT_ORGANISME_AMD,
SUM(CASE WHEN FT_TYPE_TIER <> 'ETS' THEN FT_TOTAL_ETS ELSE 0 END) AS FACT_TOTAL_ETS,
SUM(CASE WHEN FT_TYPE_TIER = 'AMO' THEN FT_TOTAL_ETS ELSE 0 END) AS FT_TOTAL_ETS_AMO,
SUM(CASE WHEN FT_TYPE_TIER = 'AMC' THEN FT_TOTAL_ETS ELSE 0 END) AS FT_TOTAL_ETS_AMC,
SUM(CASE WHEN FT_TYPE_TIER = 'AMD' THEN FT_TOTAL_ETS ELSE 0 END) AS FT_TOTAL_ETS_AMD,
SUM(CASE WHEN FT_TYPE_TIER = 'CLI' THEN FT_TOTAL_ETS ELSE 0 END) AS FT_TOTAL_ETS_CLI,
SUM(CASE WHEN FT_TYPE_TIER <> 'ETS' THEN FT_TOTAL_HO ELSE 0 END) AS FACT_TOTAL_HO,
SUM(CASE WHEN FT_TYPE_TIER = 'AMO' THEN FT_TOTAL_HO ELSE 0 END) AS FT_TOTAL_HO_AMO,
SUM(CASE WHEN FT_TYPE_TIER = 'AMC' THEN FT_TOTAL_HO ELSE 0 END) AS FT_TOTAL_HO_AMC,
SUM(CASE WHEN FT_TYPE_TIER = 'AMD' THEN FT_TOTAL_HO ELSE 0 END) AS FT_TOTAL_HO_AMD,
SUM(CASE WHEN FT_TYPE_TIER = 'CLI' THEN FT_TOTAL_HO ELSE 0 END) AS FT_TOTAL_HO_CLI,
'20991231'::date AS ENV_TELETRANS,
MAX(CASE WHEN FT_TYPE_TIER = 'AMO' THEN COALESCE(ENV_TELETRANS_AMO,'20991231') ELSE '00010101' END) AS ENV_TELETRANS_AMO,
MAX(CASE WHEN FT_TYPE_TIER = 'AMC' THEN COALESCE(ENV_TELETRANS_AMC,'20991231') ELSE '00010101' END) AS ENV_TELETRANS_AMC,
MAX(CASE WHEN FT_TYPE_TIER = 'AMD' THEN COALESCE(ENV_TELETRANS_AMD,'20991231') ELSE '00010101' END) AS ENV_TELETRANS_AMD,
MAX(CASE WHEN FT_TYPE_TIER = 'CLI' THEN COALESCE(ENV_TELETRANS_CLI,'20991231') ELSE '00010101' END) AS ENV_TELETRANS_CLI,
'1'::text AS ENV_Q_TELETRANS,
'1'::text AS ENV_Q_TELETRANS_AMO,
'1'::text AS ENV_Q_TELETRANS_AMC,
'1'::text AS ENV_Q_TELETRANS_AMD,
'1'::text AS ENV_Q_TELETRANS_CLI,
SUM(COALESCE(RD_MONTANT_ETS,0)) AS RD_MONTANT_ETS,
SUM(CASE WHEN FT_TYPE_TIER = 'AMO' THEN COALESCE(RD_MONTANT_ETS,0) ELSE 0 END) AS RD_MONTANT_ETS_AMO,
SUM(CASE WHEN FT_TYPE_TIER = 'AMC' THEN COALESCE(RD_MONTANT_ETS,0) ELSE 0 END) AS RD_MONTANT_ETS_AMC,
SUM(CASE WHEN FT_TYPE_TIER = 'AMD' THEN COALESCE(RD_MONTANT_ETS,0) ELSE 0 END) AS RD_MONTANT_ETS_AMD,
SUM(CASE WHEN FT_TYPE_TIER = 'CLI' THEN COALESCE(RD_MONTANT_ETS,0) ELSE 0 END) AS RD_MONTANT_ETS_CLI,
SUM(COALESCE(RD_MONTANT_HON,0)+COALESCE(FLT_TOTAL_TTC,0)) AS RD_MONTANT_HON,
SUM(CASE WHEN FT_TYPE_TIER = 'AMO' THEN COALESCE(RD_MONTANT_HON,0)+COALESCE(FLT_TOTAL_TTC,0) ELSE 0 END) AS RD_MONTANT_HON_AMO,
SUM(CASE WHEN FT_TYPE_TIER = 'AMC' THEN COALESCE(RD_MONTANT_HON,0)+COALESCE(FLT_TOTAL_TTC,0) ELSE 0 END) AS RD_MONTANT_HON_AMC,
SUM(CASE WHEN FT_TYPE_TIER = 'AMD' THEN COALESCE(RD_MONTANT_HON,0)+COALESCE(FLT_TOTAL_TTC,0) ELSE 0 END) AS RD_MONTANT_HON_AMD,
SUM(CASE WHEN FT_TYPE_TIER = 'CLI' THEN COALESCE(RD_MONTANT_HON,0)+COALESCE(FLT_TOTAL_TTC,0) ELSE 0 END) AS RD_MONTANT_HON_CLI,
MAX(GREATEST(COALESCE(FR_DATE_ENC_ETS,'00010101'), COALESCE(FR_DATE_ENC_HON,'00010101'))) AS FR_DATE_ENC,
MAX(COALESCE(FR_DATE_ENC_ETS,'00010101')) AS FR_DATE_ENC_ETS,
MAX(CASE WHEN FT_TYPE_TIER = 'AMO' THEN COALESCE(FR_DATE_ENC_ETS,'00010101') ELSE '00010101' END) AS FR_DATE_ENC_ETS_AMO,
MAX(CASE WHEN FT_TYPE_TIER = 'AMC' THEN COALESCE(FR_DATE_ENC_ETS,'00010101') ELSE '00010101' END) AS FR_DATE_ENC_ETS_AMC,
MAX(CASE WHEN FT_TYPE_TIER = 'AMD' THEN COALESCE(FR_DATE_ENC_ETS,'00010101') ELSE '00010101' END) AS FR_DATE_ENC_ETS_AMD,
MAX(CASE WHEN FT_TYPE_TIER = 'CLI' THEN COALESCE(FR_DATE_ENC_ETS,'00010101') ELSE '00010101' END) AS FR_DATE_ENC_ETS_CLI,
MAX(COALESCE(FR_DATE_ENC_HON,'00010101')) AS FR_DATE_ENC_HON,
MAX(CASE WHEN FT_TYPE_TIER = 'AMO' THEN COALESCE(FR_DATE_ENC_HON,'00010101') ELSE '00010101' END) AS FR_DATE_ENC_HON_AMO,
MAX(CASE WHEN FT_TYPE_TIER = 'AMC' THEN COALESCE(FR_DATE_ENC_HON,'00010101') ELSE '00010101' END) AS FR_DATE_ENC_HON_AMC,
MAX(CASE WHEN FT_TYPE_TIER = 'AMD' THEN COALESCE(FR_DATE_ENC_HON,'00010101') ELSE '00010101' END) AS FR_DATE_ENC_HON_AMD,
MAX(CASE WHEN FT_TYPE_TIER = 'CLI' THEN COALESCE(FR_DATE_ENC_HON,'00010101') ELSE '00010101' END) AS FR_DATE_ENC_HON_CLI
FROM w_DAT_DA
JOIN prod_web100t.FAC_FACTURE ON FACT_DA = DA_OID
LEFT JOIN prod_web100t.FAC_FACT_TIER ON FT_FACTURE = FAC_FACTURE.FACT_OID
LEFT JOIN w_FAC_RGLMT_DETAILS ON FT_OID = RD_FACT_TIER
LEFT JOIN w_FAC_DIRECT_compta ON FT_OID = FLT_FACTURE_TIER
LEFT JOIN w_ENV_FACTURE ON FT_FACTURE = w_ENV_FACTURE.FACT_OID
GROUP BY 1,2,3,4,5,6
ORDER BY 1;
ALTER TABLE w_FAC_FACTURE ADD CONSTRAINT w_FAC_FACTURE_pkey PRIMARY KEY(FACT_OID);
UPDATE w_FAC_FACTURE
SET ENV_TELETRANS_AMO = FACT_DATE,
ENV_Q_TELETRANS_AMO = '0'
WHERE ENV_TELETRANS_AMO IN ('20991231', '00010101') AND FT_TOTAL_ETS_AMO = 0 AND FT_TOTAL_HO_AMO = 0;
UPDATE w_FAC_FACTURE
SET ENV_Q_TELETRANS_AMO = '0'
WHERE ENV_TELETRANS_AMO IN ('20991231', '00010101') ;
UPDATE w_FAC_FACTURE
SET ENV_TELETRANS_AMC = FACT_DATE,
ENV_Q_TELETRANS_AMC = '0'
WHERE ENV_TELETRANS_AMC IN ('20991231', '00010101') AND FT_TOTAL_ETS_AMC = 0 AND FT_TOTAL_HO_AMC = 0;
UPDATE w_FAC_FACTURE
SET ENV_Q_TELETRANS_AMC = '0'
WHERE ENV_TELETRANS_AMC IN ('20991231', '00010101') ;
UPDATE w_FAC_FACTURE
SET ENV_TELETRANS_AMD = FACT_DATE,
ENV_Q_TELETRANS_AMD = '0'
WHERE ENV_TELETRANS_AMD IN ('20991231', '00010101') AND FT_TOTAL_ETS_AMD = 0 AND FT_TOTAL_HO_AMD = 0;
UPDATE w_FAC_FACTURE
SET ENV_Q_TELETRANS_AMD = '0'
WHERE ENV_TELETRANS_AMD IN ('20991231', '00010101') ;
UPDATE w_FAC_FACTURE
SET ENV_TELETRANS = GREATEST(ENV_TELETRANS_AMO,ENV_TELETRANS_AMC,ENV_TELETRANS_AMD,ENV_TELETRANS_CLI);
UPDATE w_FAC_FACTURE
SET ENV_Q_TELETRANS = '0'
WHERE ENV_TELETRANS IN ('20991231', '00010101') ;
-- Montants honoraires comptabilisés en clinique
-- Ces montants ne sont pas compté en montant facturé chez Web100T. Il faut les changer de type dans les totaux
DROP TABLE IF EXISTS w_FAC_FACTURE_HON_ETS;
CREATE TEMP TABLE w_FAC_FACTURE_HON_ETS AS
SELECT FAC_FACTURE.FACT_OID,
SUM(FLT_TOTAL_TTC) AS HON_ETS,
SUM(CASE WHEN FT_TYPE_TIER = 'AMO' THEN FLT_TOTAL_TTC ELSE 0 END) AS HON_ETS_AMO,
SUM(CASE WHEN FT_TYPE_TIER = 'AMC' THEN FLT_TOTAL_TTC ELSE 0 END) AS HON_ETS_AMC,
SUM(CASE WHEN FT_TYPE_TIER = 'AMD' THEN FLT_TOTAL_TTC ELSE 0 END) AS HON_ETS_AMD,
SUM(CASE WHEN FT_TYPE_TIER = 'CLI' THEN FLT_TOTAL_TTC ELSE 0 END) AS HON_ETS_CLI
FROM prod_web100t.FAC_FACT_LIGNE_TIER
JOIN prod_web100t.FAC_FACTURE ON FLT_FACTURE = FACT_OID
JOIN prod_web100t.FAC_FACT_TIER ON FLT_FACTURE_TIER = FT_OID
JOIN prod_web100t.FAC_FACT_LIGNE ON FLT_LIGNE_FACTURE = LI_OID
WHERE FLT_IS_ETS = 1 AND LI_TYPE_B2 = '4' AND FLT_RECAP <> 0
GROUP BY 1;
UPDATE w_FAC_FACTURE SET
FACT_TOTAL_ETS = FACT_TOTAL_ETS - HON_ETS,
FT_TOTAL_ETS_AMO = FT_TOTAL_ETS_AMO - HON_ETS_AMO,
FT_TOTAL_ETS_AMC = FT_TOTAL_ETS_AMC - HON_ETS_AMC,
FT_TOTAL_ETS_AMD = FT_TOTAL_ETS_AMD - HON_ETS_AMD,
FT_TOTAL_ETS_CLI = FT_TOTAL_ETS_CLI - HON_ETS_CLI,
FACT_TOTAL_HO = FACT_TOTAL_HO + HON_ETS,
FT_TOTAL_HO_AMO = FT_TOTAL_HO_AMO + HON_ETS_AMO,
FT_TOTAL_HO_AMC = FT_TOTAL_HO_AMC + HON_ETS_AMC,
FT_TOTAL_HO_AMD = FT_TOTAL_HO_AMD + HON_ETS_AMD,
FT_TOTAL_HO_CLI = FT_TOTAL_HO_CLI + HON_ETS_CLI
FROM w_FAC_FACTURE_HON_ETS
WHERE w_FAC_FACTURE_HON_ETS.FACT_OID = w_FAC_FACTURE.FACT_OID;
-- Traitement des impayés comptabilisés en ventes
DROP TABLE IF EXISTS w_FAC_FACT_LIGNE_TIER_IMPAYE;
CREATE TEMP TABLE w_FAC_FACT_LIGNE_TIER_IMPAYE AS
SELECT
FI_FACTURE AS FACT_IMPAYE_OID,
to_char(FI_DATE,'YYMM') AS MOIS_IMPAYE,
FIL_CREANCE AS FLT_IMPAYE_OID,
FI_COMPTA,
date(MAX(FI_DATE)) AS ECR_IMPAYE_DATE,
SUM(CASE WHEN FLT_IS_ETS = 1 AND FLT_IS_DIRECT <= 0 THEN 0-FIL_MONTANT ELSE 0 END) AS FLT_TOTAL_IMPAYE_ETS,
SUM(CASE WHEN FLT_IS_ETS = 1 AND FLT_IS_DIRECT <= 0 AND FT_TYPE_TIER = 'CLI' THEN 0-FIL_MONTANT ELSE 0 END) AS FLT_TOTAL_IMPAYE_ETS_CLI,
SUM(CASE WHEN FLT_IS_ETS = 1 AND FLT_IS_DIRECT <= 0 AND FT_TYPE_TIER = 'AMO' THEN 0-FIL_MONTANT ELSE 0 END) AS FLT_TOTAL_IMPAYE_ETS_AMO,
SUM(CASE WHEN FLT_IS_ETS = 1 AND FLT_IS_DIRECT <= 0 AND FT_TYPE_TIER = 'AMC' THEN 0-FIL_MONTANT ELSE 0 END) AS FLT_TOTAL_IMPAYE_ETS_AMC,
SUM(CASE WHEN FLT_IS_ETS = 1 AND FLT_IS_DIRECT <= 0 AND FT_TYPE_TIER = 'AMD' THEN 0-FIL_MONTANT ELSE 0 END) AS FLT_TOTAL_IMPAYE_ETS_AMD,
SUM(CASE WHEN FLT_IS_ETS = 0 AND FLT_IS_DIRECT <= 0 THEN 0-FIL_MONTANT ELSE 0 END) AS FLT_TOTAL_IMPAYE_HON,
SUM(CASE WHEN FLT_IS_ETS = 0 AND FLT_IS_DIRECT <= 0 AND FT_TYPE_TIER = 'CLI' THEN 0-FIL_MONTANT ELSE 0 END) AS FLT_TOTAL_IMPAYE_HON_CLI,
SUM(CASE WHEN FLT_IS_ETS = 0 AND FLT_IS_DIRECT <= 0 AND FT_TYPE_TIER = 'AMO' THEN 0-FIL_MONTANT ELSE 0 END) AS FLT_TOTAL_IMPAYE_HON_AMO,
SUM(CASE WHEN FLT_IS_ETS = 0 AND FLT_IS_DIRECT <= 0 AND FT_TYPE_TIER = 'AMC' THEN 0-FIL_MONTANT ELSE 0 END) AS FLT_TOTAL_IMPAYE_HON_AMC,
SUM(CASE WHEN FLT_IS_ETS = 0 AND FLT_IS_DIRECT <= 0 AND FT_TYPE_TIER = 'AMD' THEN 0-FIL_MONTANT ELSE 0 END) AS FLT_TOTAL_IMPAYE_HON_AMD
FROM prod_web100t.FAC_FACT_IMPAYE
JOIN prod_web100t.FAC_FACT_IMPAYE_LINE ON FIL_IMPAYE = FAC_FACT_IMPAYE.FI_OID
JOIN prod_web100t.FAC_FACT_LIGNE_TIER ON FIL_CREANCE = FLT_OID
JOIN prod_web100t.FAC_FACT_TIER ON FI_FACT_TIER = FT_OID
JOIN w_FAC_FACTURE ON FI_FACTURE = FACT_OID
GROUP BY 1,2,3,4
ORDER BY 1,2,3;
DROP TABLE IF EXISTS w_FAC_FACT_IMPAYE;
CREATE Temp table w_FAC_FACT_IMPAYE AS
SELECT
FACT_IMPAYE_OID,
MOIS_IMPAYE,
FI_COMPTA,
MAX(ECR_IMPAYE_DATE) AS ECR_IMPAYE_DATE,
SUM(FLT_TOTAL_IMPAYE_ETS) AS FT_TOTAL_IMPAYE_ETS,
SUM(FLT_TOTAL_IMPAYE_ETS_CLI) AS FT_TOTAL_IMPAYE_ETS_CLI,
SUM(FLT_TOTAL_IMPAYE_ETS_AMO) AS FT_TOTAL_IMPAYE_ETS_AMO,
SUM(FLT_TOTAL_IMPAYE_ETS_AMC) AS FT_TOTAL_IMPAYE_ETS_AMC,
SUM(FLT_TOTAL_IMPAYE_ETS_AMD) AS FT_TOTAL_IMPAYE_ETS_AMD,
SUM(FLT_TOTAL_IMPAYE_HON) AS FT_TOTAL_IMPAYE_HON,
SUM(FLT_TOTAL_IMPAYE_HON_CLI) AS FT_TOTAL_IMPAYE_HON_CLI,
SUM(FLT_TOTAL_IMPAYE_HON_AMO) AS FT_TOTAL_IMPAYE_HON_AMO,
SUM(FLT_TOTAL_IMPAYE_HON_AMC) AS FT_TOTAL_IMPAYE_HON_AMC,
SUM(FLT_TOTAL_IMPAYE_HON_AMD) AS FT_TOTAL_IMPAYE_HON_AMD
FROM w_FAC_FACT_LIGNE_TIER_IMPAYE
GROUP BY 1,2,3;
DROP TABLE IF EXISTS w_factures;
CREATE TEMP TABLE w_factures AS
SELECT
w_FAC_FACTURE.FACT_OID,
nextval('activite[PX].s_factures'::regclass) AS oid,
no_sejour,
p_sejours.oid AS sejour_id,
p_sejours.lieu_sortie_id,
FACT_NUMERO AS no_facture,
FACT_NUMERO AS no_facture_reference,
0::bigint AS facture_reference_id,
COALESCE(FACT_NUMERO_OD,'') AS no_facture_od_avoir,
0::bigint AS facture_od_avoir_id,
0::bigint AS IMPAYE,
COALESCE(t_tiers_payant_1.oid,0) AS tiers_payant_1_id,
COALESCE(t_tiers_payant_2.oid,0) AS tiers_payant_2_id,
COALESCE(t_tiers_payant_22.oid,0) AS tiers_payant_22_id,
p_sejours.tiers_payant_0_id,
COALESCE(PF_DEBUT,date_entree) AS date_debut,
COALESCE(PF_FIN,date_sortie) AS date_fin,
CASE
WHEN FACT_TYPE = 1 AND FACT_NUMERO_OD IS NOT NULL THEN 'X'
WHEN FACT_TYPE = 4 AND FACT_NUMERO_OD IS NOT NULL THEN 'X'
WHEN FACT_TYPE = 1 THEN '0'
WHEN FACT_TYPE = 2 THEN '1'
WHEN FACT_TYPE = 4 THEN '2'
ELSE '0' END AS type_facture,
'1'::text AS code_facture,
w_FAC_FACTURE.FACT_DATE AS date_facture,
0::numeric AS delai_facture,
CASE WHEN ECR_DATE <> '20991231' THEN '1'::text ELSE '0'::text END AS code_vente,
ECR_DATE AS date_vente,
extract('year' FROM ECR_DATE) * 100 + extract('month' FROM ECR_DATE) AS mois_vente,
'0'::text AS code_cloture,
'20991231'::date AS date_encours,
''::text AS particularite_t2a,
p_sejours.ghs_id,
p_sejours.ghs_bebe1_id,
p_sejours.ghs_bebe2_id,
p_sejours.ghs_bebe3_id,
p_sejours.code_cp_demandee,
0::numeric AS nb_rejets,
FACT_TOTAL_ETS AS montant_facture_c,
FACT_TOTAL_HO AS montant_facture_h,
FT_TOTAL_ETS_CLI AS montant_facture_0_c,
FT_TOTAL_HO_CLI AS montant_facture_0_h,
FT_TOTAL_ETS_AMO AS montant_facture_1_c,
FT_TOTAL_HO_AMO AS montant_facture_1_h,
FT_TOTAL_ETS_AMC AS montant_facture_2_c,
FT_TOTAL_HO_AMC AS montant_facture_2_h,
FT_TOTAL_ETS_AMD AS montant_facture_22_c,
FT_TOTAL_HO_AMD AS montant_facture_22_h,
0::numeric AS montant_facture_c_actes_inclus_dans_sejour,
0::numeric AS montant_facture_h_actes_inclus_dans_sejour,
COALESCE(w_FAC_FACTURE_cpt.FLT_TOTAL_CPT_ETS,0) AS montant_comptabilise_c,
COALESCE(w_FAC_FACTURE_cpt.FLT_TOTAL_CPT_HON,0) AS montant_comptabilise_h,
COALESCE(w_FAC_FACTURE_cpt.FLT_TOTAL_CPT_ETS_CLI,0) AS montant_comptabilise_0_c,
COALESCE(w_FAC_FACTURE_cpt.FLT_TOTAL_CPT_HON_CLI,0) AS montant_comptabilise_0_h,
COALESCE(w_FAC_FACTURE_cpt.FLT_TOTAL_CPT_ETS_AMO,0) AS montant_comptabilise_1_c,
COALESCE(w_FAC_FACTURE_cpt.FLT_TOTAL_CPT_HON_AMO,0) AS montant_comptabilise_1_h,
COALESCE(w_FAC_FACTURE_cpt.FLT_TOTAL_CPT_ETS_AMC,0) AS montant_comptabilise_2_c,
COALESCE(w_FAC_FACTURE_cpt.FLT_TOTAL_CPT_HON_AMC,0) AS montant_comptabilise_2_h,
COALESCE(w_FAC_FACTURE_cpt.FLT_TOTAL_CPT_ETS_AMD,0) AS montant_comptabilise_22_c,
COALESCE(w_FAC_FACTURE_cpt.FLT_TOTAL_CPT_HON_AMD,0) AS montant_comptabilise_22_h,
0::numeric AS montant_comptabilise_budget_global_c,
0::numeric AS montant_encours_c,
0::numeric AS montant_encours_0_c,
0::numeric AS montant_encours_1_c,
0::numeric AS montant_encours_2_c,
0::numeric AS montant_encours_22_c,
0::numeric AS montant_encours_h,
0::numeric AS montant_encours_0_h,
0::numeric AS montant_encours_1_h,
0::numeric AS montant_encours_2_h,
0::numeric AS montant_encours_22_h,
ENV_TELETRANS AS date_expedition,
ENV_TELETRANS_CLI AS date_expedition_0,
ENV_TELETRANS_AMO AS date_expedition_1,
ENV_TELETRANS_AMC AS date_expedition_2,
ENV_TELETRANS_AMD AS date_expedition_22,
ENV_Q_TELETRANS_CLI AS code_expedie_0,
ENV_Q_TELETRANS_AMO AS code_expedie_1,
ENV_Q_TELETRANS_AMC AS code_expedie_2,
ENV_Q_TELETRANS_AMD AS code_expedie_22,
''::text AS no_bordereau_0,
''::text AS no_bordereau_1,
''::text AS no_bordereau_2,
''::text AS no_bordereau_22,
0::numeric AS delai_expedition,
0::numeric AS delai_expedition_0,
0::numeric AS delai_expedition_1,
0::numeric AS delai_expedition_2,
0::numeric AS delai_expedition_22,
RD_MONTANT_ETS AS montant_regle_c,
RD_MONTANT_HON AS montant_regle_h,
RD_MONTANT_ETS_CLI AS montant_regle_0_c,
RD_MONTANT_HON_CLI AS montant_regle_0_h,
RD_MONTANT_ETS_AMO AS montant_regle_1_c,
RD_MONTANT_HON_AMO AS montant_regle_1_h,
RD_MONTANT_ETS_AMC AS montant_regle_2_c,
RD_MONTANT_HON_AMC AS montant_regle_2_h,
RD_MONTANT_ETS_AMD AS montant_regle_22_c,
RD_MONTANT_HON_AMD AS montant_regle_22_h,
FR_DATE_ENC AS date_solde,
FR_DATE_ENC_ETS AS date_solde_c,
FR_DATE_ENC_HON AS date_solde_h,
FR_DATE_ENC_ETS_CLI AS date_solde_0_c,
FR_DATE_ENC_HON_CLI AS date_solde_0_h,
FR_DATE_ENC_ETS_AMO AS date_solde_1_c,
FR_DATE_ENC_HON_AMO AS date_solde_1_h,
FR_DATE_ENC_ETS_AMC AS date_solde_2_c,
FR_DATE_ENC_HON_AMC AS date_solde_2_h,
FR_DATE_ENC_ETS_AMD AS date_solde_22_c,
FR_DATE_ENC_HON_AMD AS date_solde_22_h,
0::numeric AS delai_solde,
0::numeric AS delai_solde_0_c,
0::numeric AS delai_solde_0_h,
0::numeric AS delai_solde_1_c,
0::numeric AS delai_solde_1_h,
0::numeric AS delai_solde_2_c,
0::numeric AS delai_solde_2_h,
0::numeric AS delai_solde_22_c,
0::numeric AS delai_solde_22_h,
'00010101'::date AS date_solde_reference,
'00010101'::date AS date_solde_reference_c,
'00010101'::date AS date_solde_reference_h,
'00010101'::date AS date_solde_reference_0_c,
'00010101'::date AS date_solde_reference_1_c,
'00010101'::date AS date_solde_reference_2_c,
'00010101'::date AS date_solde_reference_22_c,
'00010101'::date AS date_solde_reference_0_h,
'00010101'::date AS date_solde_reference_1_h,
'00010101'::date AS date_solde_reference_2_h,
'00010101'::date AS date_solde_reference_22_h
FROM w_FAC_FACTURE
JOIN activite[PX].p_sejours ON FACT_DA = p_sejours.code_original AND p_sejours.etat = ''
LEFT JOIN w_FAC_FACTURE_vente ON w_FAC_FACTURE.FACT_OID = w_FAC_FACTURE_vente.FACT_OID
LEFT JOIN w_FAC_FACTURE_cpt ON w_FAC_FACTURE.FACT_OID = w_FAC_FACTURE_cpt.FACT_OID
LEFT JOIN prod_web100t.FAC_PERIODE_FACTU ON FACT_PERIODE = PF_OID
LEFT JOIN w_FAC_FACTURE_od ON w_FAC_FACTURE.FACT_OID = w_FAC_FACTURE_od.FACT_OID
LEFT JOIN activite[PX].t_tiers_payant t_tiers_payant_1 ON FT_ORGANISME_AMO = t_tiers_payant_1.code_original
LEFT JOIN activite[PX].t_tiers_payant t_tiers_payant_2 ON FT_ORGANISME_AMC = t_tiers_payant_2.code_original
LEFT JOIN activite[PX].t_tiers_payant t_tiers_payant_22 ON FT_ORGANISME_AMD = t_tiers_payant_22.code_original;
ANALYSE w_factures
;
CREATE INDEX w_factures_i1 ON w_factures USING btree (FACT_OID)
;
-- Facture fictive pour impayés
INSERT INTo w_factures
SELECT
w_FAC_FACTURE.FACT_OID,
nextval('activite[PX].s_factures'::regclass) AS oid,
no_sejour,
p_sejours.oid AS sejour_id,
p_sejours.lieu_sortie_id,
FACT_NUMERO || '-IM' || FI_COMPTA::text AS no_facture,
FACT_NUMERO AS no_facture_reference,
0::bigint AS facture_reference_id,
FACT_NUMERO AS no_facture_od_avoir,
0::bigint AS facture_od_avoir_id,
FI_COMPTA AS IMPAYE,
COALESCE(t_tiers_payant_1.oid,0) AS tiers_payant_1_id,
COALESCE(t_tiers_payant_2.oid,0) AS tiers_payant_2_id,
COALESCE(t_tiers_payant_22.oid,0) AS tiers_payant_22_id,
p_sejours.tiers_payant_0_id,
COALESCE(PF_DEBUT,date_entree) AS date_debut,
COALESCE(PF_FIN,date_sortie) AS date_fin,
'X' AS type_facture,
'1'::text AS code_facture,
w_FAC_FACT_IMPAYE.ECR_IMPAYE_DATE AS date_facture,
0::numeric AS delai_facture,
'1' AS code_vente,
w_FAC_FACT_IMPAYE.ECR_IMPAYE_DATE AS date_vente,
extract('year' FROM w_FAC_FACT_IMPAYE.ECR_IMPAYE_DATE) * 100 + extract('month' FROM w_FAC_FACT_IMPAYE.ECR_IMPAYE_DATE) AS mois_vente,
'0'::text AS code_cloture,
'20991231'::date AS date_encours,
''::text AS particularite_t2a,
p_sejours.ghs_id,
p_sejours.ghs_bebe1_id,
p_sejours.ghs_bebe2_id,
p_sejours.ghs_bebe3_id,
p_sejours.code_cp_demandee,
0::numeric AS nb_rejets,
0 AS montant_facture_c,
0 AS montant_facture_h,
0 AS montant_facture_0_c,
0 AS montant_facture_0_h,
0 AS montant_facture_1_c,
0 AS montant_facture_1_h,
0 AS montant_facture_2_c,
0 AS montant_facture_2_h,
0::numeric AS montant_facture_22_c,
0::numeric AS montant_facture_22_h,
0::numeric AS montant_facture_c_actes_inclus_dans_sejour,
0::numeric AS montant_facture_h_actes_inclus_dans_sejour,
w_FAC_FACT_IMPAYE.FT_TOTAL_IMPAYE_ETS AS montant_comptabilise_c,
w_FAC_FACT_IMPAYE.FT_TOTAL_IMPAYE_HON AS montant_comptabilise_h,
w_FAC_FACT_IMPAYE.FT_TOTAL_IMPAYE_ETS_CLI AS montant_comptabilise_0_c,
w_FAC_FACT_IMPAYE.FT_TOTAL_IMPAYE_HON_CLI AS montant_comptabilise_0_h,
w_FAC_FACT_IMPAYE.FT_TOTAL_IMPAYE_ETS_AMO AS montant_comptabilise_1_c,
w_FAC_FACT_IMPAYE.FT_TOTAL_IMPAYE_HON_AMO AS montant_comptabilise_1_h,
w_FAC_FACT_IMPAYE.FT_TOTAL_IMPAYE_ETS_AMC AS montant_comptabilise_2_c,
w_FAC_FACT_IMPAYE.FT_TOTAL_IMPAYE_HON_AMC AS montant_comptabilise_2_h,
w_FAC_FACT_IMPAYE.FT_TOTAL_IMPAYE_ETS_AMD AS montant_comptabilise_22_c,
w_FAC_FACT_IMPAYE.FT_TOTAL_IMPAYE_HON_AMD AS montant_comptabilise_22_h,
0::numeric AS montant_comptabilise_budget_global_c,
0::numeric AS montant_encours_c,
0::numeric AS montant_encours_0_c,
0::numeric AS montant_encours_1_c,
0::numeric AS montant_encours_2_c,
0::numeric AS montant_encours_22_c,
0::numeric AS montant_encours_h,
0::numeric AS montant_encours_0_h,
0::numeric AS montant_encours_1_h,
0::numeric AS montant_encours_2_h,
0::numeric AS montant_encours_22_h,
'20991231'::date AS date_expedition,
'20991231'::date AS date_expedition_0,
'20991231'::date AS date_expedition_1,
'20991231'::date AS date_expedition_2,
'20991231'::date AS date_expedition_22,
'0'::text AS code_expedie_0,
'0'::text AS code_expedie_1,
'0'::text AS code_expedie_2,
'0'::text AS code_expedie_22,
''::text AS no_bordereau_0,
''::text AS no_bordereau_1,
''::text AS no_bordereau_2,
''::text AS no_bordereau_22,
0::numeric AS delai_expedition,
0::numeric AS delai_expedition_0,
0::numeric AS delai_expedition_1,
0::numeric AS delai_expedition_2,
0::numeric AS delai_expedition_22,
0::numeric AS montant_regle_c,
0::numeric AS montant_regle_h,
0::numeric AS montant_regle_0_c,
0::numeric AS montant_regle_0_h,
0::numeric AS montant_regle_1_c,
0::numeric AS montant_regle_1_h,
0::numeric AS montant_regle_2_c,
0::numeric AS montant_regle_2_h,
0::numeric AS montant_regle_22_c,
0::numeric AS montant_regle_22_h,
w_FAC_FACT_IMPAYE.ECR_IMPAYE_DATE AS date_solde,
w_FAC_FACT_IMPAYE.ECR_IMPAYE_DATE AS date_solde_c,
w_FAC_FACT_IMPAYE.ECR_IMPAYE_DATE AS date_solde_h,
w_FAC_FACT_IMPAYE.ECR_IMPAYE_DATE AS date_solde_0_c,
w_FAC_FACT_IMPAYE.ECR_IMPAYE_DATE AS date_solde_0_h,
w_FAC_FACT_IMPAYE.ECR_IMPAYE_DATE AS date_solde_1_c,
w_FAC_FACT_IMPAYE.ECR_IMPAYE_DATE AS date_solde_1_h,
w_FAC_FACT_IMPAYE.ECR_IMPAYE_DATE AS date_solde_2_c,
w_FAC_FACT_IMPAYE.ECR_IMPAYE_DATE AS date_solde_2_h,
'00010101'::date AS date_solde_22_c,
'00010101'::date AS date_solde_22_h,
0::numeric AS delai_solde,
0::numeric AS delai_solde_0_c,
0::numeric AS delai_solde_0_h,
0::numeric AS delai_solde_1_c,
0::numeric AS delai_solde_1_h,
0::numeric AS delai_solde_2_c,
0::numeric AS delai_solde_2_h,
0::numeric AS delai_solde_22_c,
0::numeric AS delai_solde_22_h,
'00010101'::date AS date_solde_reference,
'00010101'::date AS date_solde_reference_c,
'00010101'::date AS date_solde_reference_h,
'00010101'::date AS date_solde_reference_0_c,
'00010101'::date AS date_solde_reference_1_c,
'00010101'::date AS date_solde_reference_2_c,
'00010101'::date AS date_solde_reference_22_c,
'00010101'::date AS date_solde_reference_0_h,
'00010101'::date AS date_solde_reference_1_h,
'00010101'::date AS date_solde_reference_2_h,
'00010101'::date AS date_solde_reference_22_h
FROM w_FAC_FACTURE
JOIN activite[PX].p_sejours ON FACT_DA = p_sejours.code_original AND p_sejours.etat = ''
JOIN w_FAC_FACT_IMPAYE ON w_FAC_FACTURE.FACT_OID = w_FAC_FACT_IMPAYE.FACT_IMPAYE_OID
LEFT JOIN prod_web100t.FAC_PERIODE_FACTU ON FACT_PERIODE = PF_OID
LEFT JOIN activite[PX].t_tiers_payant t_tiers_payant_1 ON FT_ORGANISME_AMO = t_tiers_payant_1.code_original
LEFT JOIN activite[PX].t_tiers_payant t_tiers_payant_2 ON FT_ORGANISME_AMC = t_tiers_payant_2.code_original
LEFT JOIN activite[PX].t_tiers_payant t_tiers_payant_22 ON FT_ORGANISME_AMD = t_tiers_payant_22.code_original;
UPDATE w_factures SET
facture_od_avoir_id = w_factures_od_avoir.oid
FROM w_factures w_factures_od_avoir
WHERE w_factures.no_facture_od_avoir = w_factures_od_avoir.no_facture AND w_factures.no_facture_od_avoir <> '';
UPDATE w_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 w_factures.no_sejour = p_sejours.no_sejour AND
CASE WHEN code_sorti = '1' THEN date_sortie ELSE date(now()) END - date_entree < 30 AND
(
w_factures.date_debut <> date_entree OR
w_factures.date_fin <> CASE WHEN code_sorti = '1' THEN date_sortie ELSE date_fin END
);
DROP TABLE IF EXISTS w_sejours_facture_reference;
CREATE TEMP TABLE w_sejours_facture_reference AS
SELECT
no_sejour,
date_debut,
MAX(date_fin) AS date_fin,
MAX(w_factures.no_facture) AS no_facture_last,
MAX(CASE WHEN type_facture = '0' THEN w_factures.no_facture ELSE null END) AS no_facture_reference_last,
MAX(CASE WHEN type_facture <> '1' THEN w_factures.no_facture ELSE null END) AS no_facture_reference_last_2,
MAX(w_factures.oid) AS facture_id_last,
MAX(CASE WHEN type_facture = '0' THEN w_factures.oid ELSE null END) AS facture_id_reference_last,
MAX(CASE WHEN type_facture <> '1' THEN w_factures.oid ELSE null END) AS facture_id_reference_last_2
FROM w_factures
GROUP BY 1,2;
CREATE INDEX w_sejours_facture_reference_i1
ON w_sejours_facture_reference
USING btree
(no_sejour);
UPDATE w_sejours_facture_reference
SET facture_id_last = w_factures_references.oid
FROM w_factures w_factures_references
WHERE w_sejours_facture_reference.no_facture_last = w_factures_references.no_facture
AND w_sejours_facture_reference.facture_id_last <> w_factures_references.oid;
UPDATE w_sejours_facture_reference
SET facture_id_reference_last = w_factures_references.oid
FROM w_factures w_factures_references
WHERE w_sejours_facture_reference.no_facture_reference_last = w_factures_references.no_facture
AND w_sejours_facture_reference.facture_id_reference_last <> w_factures_references.oid;
UPDATE w_sejours_facture_reference
SET facture_id_reference_last_2 = w_factures_references.oid
FROM w_factures w_factures_references
WHERE w_sejours_facture_reference.no_facture_reference_last_2 = w_factures_references.no_facture
AND w_sejours_facture_reference.facture_id_reference_last_2 <> w_factures_references.oid;
UPDATE w_factures
SET
no_facture_reference = COALESCE(no_facture_reference_last, no_facture_reference_last_2, no_facture_last),
facture_reference_id = COALESCE(facture_id_reference_last, facture_id_reference_last_2, facture_id_last)
FROM w_sejours_facture_reference
WHERE w_factures.no_sejour = w_sejours_facture_reference.no_sejour AND
w_factures.date_debut BETWEEN w_sejours_facture_reference.date_debut AND w_sejours_facture_reference.date_fin AND
(
no_facture_reference IS DISTINCT FROM COALESCE(no_facture_reference_last, no_facture_reference_last_2, no_facture_last) OR
facture_reference_id IS DISTINCT FROM COALESCE(facture_id_reference_last, facture_id_reference_last_2, facture_id_last)
);
UPDATE w_factures
SET no_facture_reference = no_facture
WHERE (no_facture_reference IS NULL OR no_facture_reference = '');
UPDATE w_factures
SET type_facture = '0'
WHERE w_factures.type_facture = '2' AND
w_factures.no_facture = w_factures.no_facture_reference;
UPDATE w_factures
SET type_facture = '2'
WHERE w_factures.type_facture = '0' AND
w_factures.no_facture <> w_factures.no_facture_reference;
UPDATE w_factures
SET facture_reference_id = w_factures_references.oid
FROM w_factures w_factures_references
WHERE w_factures.no_facture_reference = w_factures_references.no_facture
AND w_factures.facture_reference_id <> w_factures_references.oid;
-- Ajout des factures
SELECT base.cti_disable_index('activite[PX]', 'i_factures_3');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_4');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_5');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_6');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_7');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_8');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_9');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_10');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_11');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_12');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_13');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_14');
INSERT INTO activite[PX].p_factures(
oid,
no_sejour,
sejour_id,
no_facture,
no_facture_reference,
facture_reference_id,
no_facture_od_avoir,
facture_od_avoir_id,
tiers_payant_1_id,
tiers_payant_2_id,
tiers_payant_22_id,
tiers_payant_0_id,
date_debut,
date_fin,
type_facture,
code_facture,
date_facture,
delai_facture,
code_vente,
date_vente,
mois_vente,
code_cloture,
date_encours,
particularite_t2a,
ghs_id,
ghs_bebe1_id,
ghs_bebe2_id,
ghs_bebe3_id,
code_cp_demandee,
nb_rejets,
montant_facture_c,
montant_facture_h,
montant_facture_0_c,
montant_facture_0_h,
montant_facture_1_c,
montant_facture_1_h,
montant_facture_2_c,
montant_facture_2_h,
montant_facture_22_c,
montant_facture_22_h,
montant_facture_c_actes_inclus_dans_sejour,
montant_facture_h_actes_inclus_dans_sejour,
montant_comptabilise_c,
montant_comptabilise_h,
montant_comptabilise_0_c,
montant_comptabilise_0_h,
montant_comptabilise_1_c,
montant_comptabilise_1_h,
montant_comptabilise_2_c,
montant_comptabilise_2_h,
montant_comptabilise_22_c,
montant_comptabilise_22_h,
montant_comptabilise_budget_global_c,
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_expedition,
date_expedition_0,
date_expedition_1,
date_expedition_2,
date_expedition_22,
code_expedie_0,
code_expedie_1,
code_expedie_2,
code_expedie_22,
no_bordereau_0,
no_bordereau_1,
no_bordereau_2,
no_bordereau_22,
delai_expedition,
delai_expedition_0,
delai_expedition_1,
delai_expedition_2,
delai_expedition_22,
montant_regle_c,
montant_regle_h,
montant_regle_0_c,
montant_regle_0_h,
montant_regle_1_c,
montant_regle_1_h,
montant_regle_2_c,
montant_regle_2_h,
montant_regle_22_c,
montant_regle_22_h,
date_solde,
date_solde_c,
date_solde_h,
date_solde_0_c,
date_solde_0_h,
date_solde_1_c,
date_solde_1_h,
date_solde_2_c,
date_solde_2_h,
date_solde_22_c,
date_solde_22_h,
delai_solde,
delai_solde_0_c,
delai_solde_0_h,
delai_solde_1_c,
delai_solde_1_h,
delai_solde_2_c,
delai_solde_2_h,
delai_solde_22_c,
delai_solde_22_h,
date_solde_reference,
date_solde_reference_c,
date_solde_reference_h,
date_solde_reference_0_c,
date_solde_reference_1_c,
date_solde_reference_2_c,
date_solde_reference_22_c,
date_solde_reference_0_h,
date_solde_reference_1_h,
date_solde_reference_2_h,
date_solde_reference_22_h
)
SELECT
oid,
no_sejour,
sejour_id,
no_facture,
no_facture_reference,
facture_reference_id,
no_facture_od_avoir,
facture_od_avoir_id,
tiers_payant_1_id,
tiers_payant_2_id,
tiers_payant_22_id,
tiers_payant_0_id,
date_debut,
date_fin,
type_facture,
code_facture,
date_facture,
delai_facture,
code_vente,
date_vente,
mois_vente,
code_cloture,
date_encours,
particularite_t2a,
ghs_id,
ghs_bebe1_id,
ghs_bebe2_id,
ghs_bebe3_id,
code_cp_demandee,
nb_rejets,
montant_facture_c,
montant_facture_h,
montant_facture_0_c,
montant_facture_0_h,
montant_facture_1_c,
montant_facture_1_h,
montant_facture_2_c,
montant_facture_2_h,
montant_facture_22_c,
montant_facture_22_h,
montant_facture_c_actes_inclus_dans_sejour,
montant_facture_h_actes_inclus_dans_sejour,
montant_comptabilise_c,
montant_comptabilise_h,
montant_comptabilise_0_c,
montant_comptabilise_0_h,
montant_comptabilise_1_c,
montant_comptabilise_1_h,
montant_comptabilise_2_c,
montant_comptabilise_2_h,
montant_comptabilise_22_c,
montant_comptabilise_22_h,
montant_comptabilise_budget_global_c,
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_expedition,
date_expedition_0,
date_expedition_1,
date_expedition_2,
date_expedition_22,
code_expedie_0,
code_expedie_1,
code_expedie_2,
code_expedie_22,
no_bordereau_0,
no_bordereau_1,
no_bordereau_2,
no_bordereau_22,
delai_expedition,
delai_expedition_0,
delai_expedition_1,
delai_expedition_2,
delai_expedition_22,
montant_regle_c,
montant_regle_h,
montant_regle_0_c,
montant_regle_0_h,
montant_regle_1_c,
montant_regle_1_h,
montant_regle_2_c,
montant_regle_2_h,
montant_regle_22_c,
montant_regle_22_h,
date_solde,
date_solde_c,
date_solde_h,
date_solde_0_c,
date_solde_0_h,
date_solde_1_c,
date_solde_1_h,
date_solde_2_c,
date_solde_2_h,
date_solde_22_c,
date_solde_22_h,
delai_solde,
delai_solde_0_c,
delai_solde_0_h,
delai_solde_1_c,
delai_solde_1_h,
delai_solde_2_c,
delai_solde_2_h,
delai_solde_22_c,
delai_solde_22_h,
date_solde_reference,
date_solde_reference_c,
date_solde_reference_h,
date_solde_reference_0_c,
date_solde_reference_1_c,
date_solde_reference_2_c,
date_solde_reference_22_c,
date_solde_reference_0_h,
date_solde_reference_1_h,
date_solde_reference_2_h,
date_solde_reference_22_h
FROM w_factures;
SELECT base.cti_enable_index('activite[PX]', 'i_factures_3');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_4');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_5');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_6');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_7');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_8');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_9');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_10');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_11');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_12');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_13');
SELECT base.cti_enable_index('activite[PX]', 'i_factures_14');
-- Séjours cloturés sans facture, créer une facture fictive
-- Séjours sans facture
DROP TABLE IF EXISTS w_factures_trous;
CREATE TEMP TABLE w_factures_trous AS
SELECT
p_sejours.finess,
p_sejours.oid AS sejour_id,
p_sejours.no_sejour,
p_sejours.date_entree,
p_sejours.tiers_payant_0_id,
p_sejours.tiers_payant_1_id,
p_sejours.tiers_payant_2_id,
p_sejours.tiers_payant_22_id,
p_sejours.code_cp_demandee,
COALESCE(t_services_facturation.avec_facturation_intermediaire,'') AS avec_facturation_intermediaire,
p_sejours.code_sorti,
CASE WHEN code_sorti = '1' THEN date_sortie ELSE date(now()) END AS date_sortie,
MAX(CASE WHEN p_factures.date_fin IS NOT NULL AND date_sortie - date_entree < 30 THEN CASE WHEN code_sorti = '1' THEN date_sortie ELSE date(now()) END ELSE p_factures.date_fin END) AS date_fin_facture,
date(MAX(COALESCE(CASE WHEN p_factures.date_fin IS NOT NULL AND date_sortie - date_entree < 30 AND code_sorti = '1' THEN date_sortie ELSE p_factures.date_fin END + interval '1 day', p_sejours.date_entree))) AS date_debut_encours,
CASE WHEN code_sorti = '1' THEN date_sortie ELSE date(now()) END AS date_fin_encours
FROM activite[PX].p_sejours
LEFT JOIN activite[PX].p_factures ON p_sejours.no_sejour = p_factures.no_sejour AND no_facture NOT LIKE 'E%' AND type_facture IS DISTINCT FROM 'P'
JOIN activite[PX].t_lieux ON lieu_sortie_id = t_lieux.oid
JOIN activite[PX].t_services_facturation ON t_lieux.service_facturation_id = t_services_facturation.oid
WHERE p_sejours.etat = '' AND p_sejours.est_sans_facturation IS DISTINCT FROM '1' AND date_entree <= now() AND p_sejours.type_sejour <> '6' AND p_sejours.type_sejour <> '9'
GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12;
INSERT INTO activite[PX].p_factures(
finess,
sejour_id,
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,
date_debut,
date_fin)
SELECT
finess,
sejour_id,
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 ,
MIN(GREATEST(date_debut_encours, p_calendrier.date)),
MAX(LEAST(date_fin_encours, p_calendrier.date))
FROM w_factures_trous
JOIN base.p_calendrier ON p_calendrier.date BETWEEN date_debut_encours AND date_fin_encours
WHERE (date_debut_encours <= date_fin_encours or date_fin_facture is null)
GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13;
]]>
0 AND ART_CODE NOT IN ('TDE', 'TSE', 'ST1', 'ST2', 'ST3') THEN PREST_QUANTITE ELSE 1 END AS nb_rubrique,
CASE WHEN PREST_COEFF <> 0 AND PREST_PU <> 0 THEN PREST_COEFF ELSE 1 END AS coefficient,
rubrique_facturation_id,
prestation_id,
CASE
WHEN PREST_PU <> 0 THEN PREST_PU
WHEN PREST_QUANTITE <> 0 THEN PREST_MFE_ETS / CASE WHEN ART_CODE NOT IN ('TDE', 'TSE', 'ST1', 'ST2', 'ST3') THEN PREST_QUANTITE ELSE 1 END
ELSE PREST_MFE_ETS END AS prix_unitaire,
p_sejours.lieu_sortie_id AS lieu_id,
w_ART_ARTICLES.ucd_id,
w_ART_ARTICLES.lpp_id
FROM prod_web100t.DAT_PRESTATIONS_GAP
JOIN prod_web100t.DAT_DA ON PREST_DA = DA_OID
JOIN activite[PX].p_sejours ON DA_OID = p_sejours.code_original AND date(PREST_DATE_DEBUT) BETWEEN date_entree AND date_sortie
JOIN activite[PX].p_factures ON p_factures.no_sejour = p_sejours.no_sejour AND type_facture = 'E' AND date(PREST_DATE_DEBUT) BETWEEN date_debut AND date_fin
JOIN w_ART_ARTICLES ON PREST_ARTICLE = ART_OID
WHERE ART_CODE NOT IN ('GHS', 'EXH', 'I01', 'CCAM') AND PREST_MFE_ETS > 0 AND PREST_ENTENTE_DIRECTE = 0 AND PREST_DELETED = 0 AND
PREST_QUANTITE < 99999 AND
NOT (PREST_QUANTITE > 1 AND (date(PREST_DATE_FIN) - date(PREST_DATE_DEBUT) + 1) = PREST_QUANTITE )
;
-- Eclatement des prestations par jour
INSERT INTO activite[PX].p_factures_lignes_non_facturees_c(
no_facture,
facture_id,
date_debut,
date_fin,
nb_rubrique,
coefficient,
rubrique_facturation_id,
prestation_id,
prix_unitaire,
lieu_id,
ucd_id,
lpp_id)
SELECT
p_factures.no_facture,
p_factures.oid AS facture_id,
p_calendrier.date AS date_debut,
p_calendrier.date AS date_fin,
1 AS nb_rubrique,
CASE WHEN PREST_COEFF <> 0 AND PREST_PU <> 0 THEN PREST_COEFF ELSE 1 END AS coefficient,
rubrique_facturation_id,
prestation_id,
CASE
WHEN PREST_PU <> 0 THEN PREST_PU
WHEN PREST_QUANTITE <> 0 THEN PREST_MFE_ETS / PREST_QUANTITE
ELSE PREST_MFE_ETS END AS prix_unitaire,
p_sejours.lieu_sortie_id AS lieu_id,
w_ART_ARTICLES.ucd_id,
w_ART_ARTICLES.lpp_id
FROM prod_web100t.DAT_PRESTATIONS_GAP
JOIN prod_web100t.DAT_DA ON PREST_DA = DA_OID
JOIN activite[PX].p_sejours ON DA_OID = p_sejours.code_original AND date(PREST_DATE_DEBUT) BETWEEN date_entree AND date_sortie
JOIN base.p_calendrier ON p_calendrier.date BETWEEN date(PREST_DATE_DEBUT) AND date(PREST_DATE_FIN)
JOIN activite[PX].p_factures ON p_factures.no_sejour = p_sejours.no_sejour AND type_facture = 'E' AND p_calendrier.date BETWEEN date_debut AND date_fin
JOIN w_ART_ARTICLES ON PREST_ARTICLE = ART_OID
WHERE ART_CODE NOT IN ('GHS', 'EXH', 'I01', 'CCAM') AND PREST_MFE_ETS > 0 AND PREST_ENTENTE_DIRECTE = 0 AND PREST_DELETED = 0 AND
PREST_QUANTITE < 99999 AND
PREST_QUANTITE > 1 AND (date(PREST_DATE_FIN) - date(PREST_DATE_DEBUT) + 1) = PREST_QUANTITE
;
-- Prestation I01 (innovation) venant du PMSI
INSERT INTO activite[PX].p_factures_lignes_non_facturees_c(
no_facture,
facture_id,
date_debut,
date_fin,
nb_rubrique,
coefficient,
coefficient_mco,
rubrique_facturation_id,
prestation_id,
prix_unitaire,
lieu_id)
SELECT
p_factures.no_facture,
MAX(p_factures.oid) AS facture_id,
MAX(p_sejours.date_entree) AS date_debut,
MAX(p_sejours.date_sortie) AS date_fin,
1::numeric AS nb_rubrique,
1::numeric AS coefficient,
0.9935::numeric AS coefficient_mco,
MAX(t_rubriques_facturation.oid) AS rubrique_facturation_id,
MAX(t_prestations.oid) AS prestation_id,
6047::numeric AS prix_unitaire,
MAX(p_sejours.lieu_sortie_id) AS lieu_id
FROM prod_web100t.DAT_RUM
JOIN prod_web100t.SGN_NMCL_DATA ON RUM_NUM_INNOVATION = ND_INVARIANT_OID AND ND_CODE = 'INNOV1441001H'
JOIN prod_web100t.DAT_RESUME ON RUM_OID = RES_OID
JOIN prod_web100t.DAT_DA ON RES_NUM = DA_NUMERO
JOIN activite[PX].p_sejours ON DA_OID = p_sejours.code_original
JOIN activite[PX].p_factures ON p_factures.no_sejour = p_sejours.no_sejour AND code_facture <> '1'
JOIN activite[PX].t_rubriques_facturation ON t_rubriques_facturation.code = 'I01'
JOIN activite.t_prestations ON t_prestations.code = 'I01'
GROUP BY 1
;
]]>
0 THEN B2T_TOTAL_TTC ELSE 0 END)::numeric - SUM(B2T_DEPASSEMENT)::numeric,
MAX(B2T_QUANTITE)::numeric
) AS B2T_PU,
SUM(B2T_TOTAL_TTC) AS B2T_TOTAL,
SUM(B2T_DEPASSEMENT) AS B2T_DEPASSEMENT,
round(base.cti_division(
SUM(CASE WHEN B2T_TYPE_TIER = 'AMO' THEN B2T_TOTAL_TTC ELSE 0 END)::numeric - SUM(CASE WHEN B2T_TYPE_TIER = 'AMO' THEN B2T_DEPASSEMENT ELSE 0 END)::numeric,
SUM(B2T_TOTAL_TTC)::numeric - SUM(B2T_DEPASSEMENT)::numeric
) * 100,0) AS B2T_TAUX_AMO,
round(base.cti_division(
SUM(CASE WHEN B2T_TYPE_TIER = 'AMC' THEN B2T_TOTAL_TTC ELSE 0 END)::numeric - SUM(CASE WHEN B2T_TYPE_TIER = 'AMC' THEN B2T_DEPASSEMENT ELSE 0 END)::numeric,
SUM(B2T_TOTAL_TTC)::numeric - SUM(B2T_DEPASSEMENT)::numeric
) * 100,0) AS B2T_TAUX_AMC,
round(base.cti_division(
SUM(CASE WHEN B2T_TYPE_TIER = 'AMD' THEN B2T_TOTAL_TTC ELSE 0 END)::numeric - SUM(CASE WHEN B2T_TYPE_TIER = 'AMD' THEN B2T_DEPASSEMENT ELSE 0 END)::numeric,
SUM(B2T_TOTAL_TTC)::numeric - SUM(B2T_DEPASSEMENT)::numeric
) * 100,0) AS B2T_TAUX_AMD,
round(base.cti_division(
SUM(CASE WHEN B2T_TYPE_TIER = 'CLI' THEN B2T_TOTAL_TTC ELSE 0 END)::numeric - SUM(CASE WHEN B2T_TYPE_TIER = 'CLI' THEN B2T_DEPASSEMENT ELSE 0 END)::numeric,
SUM(B2T_TOTAL_TTC)::numeric - SUM(B2T_DEPASSEMENT)::numeric
) * 100,0) AS B2T_TAUX_CLI,
SUM(CASE WHEN B2T_TYPE_TIER = 'AMO' THEN B2T_TOTAL_TTC ELSE 0 END) AS B2T_TOTAL_AMO,
SUM(CASE WHEN B2T_TYPE_TIER = 'AMC' THEN B2T_TOTAL_TTC ELSE 0 END) AS B2T_TOTAL_AMC,
SUM(CASE WHEN B2T_TYPE_TIER = 'AMD' THEN B2T_TOTAL_TTC ELSE 0 END) AS B2T_TOTAL_AMD,
SUM(CASE WHEN B2T_TYPE_TIER = 'CLI' THEN B2T_TOTAL_TTC ELSE 0 END) AS B2T_TOTAL_CLI
FROM prod_web100t.FAC_B2_TIER
GROUP BY 1
ORDER BY 1;
ALTER TABLE w_FAC_B2_TIER ADD CONSTRAINT w_FAC_B2_TIER_pkey PRIMARY KEY(B2T_LIGNE);
-- Comptes par ligne
DROP TABLE IF EXISTS w_LIGNE_CPT;
CREATE TEMP TABLE w_LIGNE_CPT AS
SELECT FLT_OID,
LI_OID,
LI_PRED_LIGNE,
LI_NEXT_LIGNE,
MAX(COALESCE(CPT_OID,0)) AS ECR_COMPTE,
MAX(COALESCE(CPT_CODE,'')) AS CPT_CODE,
0::bigint AS compte_produit_id
FROM PROD_WEB100T.FAC_FACT_LIGNE_TIER
JOIN PROD_WEB100T.FAC_FACT_LIGNE ON FLT_LIGNE_FACTURE = LI_OID
LEFT JOIN w_CPT_ECRITURE_source_OP_LINK ON ECR_DATA = LI_OID AND ECR_TYPE = 'PRODUIT_ETS'
LEFT JOIN PROD_WEB100T.CPT_COMPTES ON ECR_COMPTE = CPT_OID
WHERE FLT_IS_ETS = 1
GROUP BY 1,2,3,4;
UPDATE w_LIGNE_CPT
SET ECR_COMPTE = w_LIGNE_CPT_NEXT.ECR_COMPTE, CPT_CODE = w_LIGNE_CPT_NEXT.CPT_CODE
FROM w_LIGNE_CPT w_LIGNE_CPT_NEXT
WHERE w_LIGNE_CPT.ECR_COMPTE = 0 AND
w_LIGNE_CPT.LI_NEXT_LIGNE = w_LIGNE_CPT_NEXT.LI_OID;
UPDATE w_LIGNE_CPT
SET ECR_COMPTE = w_LIGNE_CPT_PRED.ECR_COMPTE, CPT_CODE = w_LIGNE_CPT_PRED.CPT_CODE
FROM w_LIGNE_CPT w_LIGNE_CPT_PRED
WHERE w_LIGNE_CPT.ECR_COMPTE = 0 AND
w_LIGNE_CPT.LI_PRED_LIGNE = w_LIGNE_CPT_PRED.LI_OID;
DELETE FROM w_LIGNE_CPT
WHERE CPT_CODE LIKE '445%';
UPDATE w_LIGNE_CPT
SET compte_produit_id = t_compte.oid
FROM activite[PX].t_compte
WHERE t_compte.code = CPT_CODE;
ALTER TABLE w_LIGNE_CPT ADD CONSTRAINT w_LIGNE_CPT_pkey PRIMARY KEY(FLT_OID);
-- Table temporaire lignes
DROP TABLE IF EXISTS w_factures_lignes_c;
CREATE TEMP TABLE w_factures_lignes_c AS
SELECT
FLT_LIGNE_FACTURE,
w_factures.no_sejour,
w_factures.no_facture,
w_factures.oid AS facture_id,
date_vente,
lieu_sortie_id AS lieu_id,
1::numeric AS origine_facturation_id,
rubrique_facturation_id,
rubrique_facturation_id AS rubrique_comptabilisation_id,
prestation_id,
0::bigint AS protocole_id,
COALESCE(w_LIGNE_CPT.compte_produit_id,0::bigint) AS compte_produit_id,
w_ART_ARTICLES.ucd_id,
w_ART_ARTICLES.lpp_id,
date(MIN(FLT_DATE_DEBUT)) AS date_debut,
date(MAX(FLT_DATE_FIN)) AS date_fin,
MAX(COALESCE(B2T_PU,FLT_TOTAL_TTC)) AS prix_unitaire,
CASE WHEN SUM(FLT_TOTAL_TTC) >= 0 THEN 1 ELSE -1 END * MAX(COALESCE(B2T_QUANTITE,1)) AS nb_rubrique,
CASE WHEN SUM(FLT_TOTAL_TTC) >= 0 THEN 1 ELSE -1 END * MAX(COALESCE(B2T_QUANTITE,1)) AS nb_prestation,
1::numeric AS coefficient,
1::numeric AS coefficient_mco,
MAX(COALESCE(B2T_TAUX_CLI,0)) AS taux_0,
MAX(COALESCE(B2T_TAUX_AMO,0)) AS taux_1,
MAX(COALESCE(B2T_TAUX_AMC,0)) AS taux_2,
MAX(COALESCE(B2T_TAUX_AMD,0)) AS taux_22,
base.cti_division(SUM(FLT_TOTAL_TVA)::numeric , SUM(FLT_TOTAL_TTC)::numeric-SUM(FLT_TOTAL_TVA)::numeric)*100 AS taux_tva,
SUM(CASE WHEN LI_TYPE_B2 IS DISTINCT FROM '4' THEN FLT_TOTAL_TTC ELSE 0 END) AS montant_facture,
SUM(CASE WHEN LI_TYPE_B2 IS DISTINCT FROM '4' AND FT_TYPE_TIER = 'CLI' THEN FLT_TOTAL_TTC ELSE 0 END) AS montant_facture_0,
SUM(CASE WHEN LI_TYPE_B2 IS DISTINCT FROM '4' AND FT_TYPE_TIER IN ('AMO','ETS') THEN FLT_TOTAL_TTC ELSE 0 END) AS montant_facture_1,
SUM(CASE WHEN LI_TYPE_B2 IS DISTINCT FROM '4' AND FT_TYPE_TIER = 'AMC' THEN FLT_TOTAL_TTC ELSE 0 END) AS montant_facture_2,
SUM(CASE WHEN LI_TYPE_B2 IS DISTINCT FROM '4' AND FT_TYPE_TIER = 'AMD' THEN FLT_TOTAL_TTC ELSE 0 END) AS montant_facture_22,
SUM(CASE WHEN LI_TYPE_B2 IS DISTINCT FROM '4' AND FT_TYPE_TIER = 'ETS' THEN 0-FLT_TOTAL_TTC ELSE 0 END) AS montant_facture_dma,
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,
SUM(CASE WHEN code_vente = '1' AND FT_TYPE_TIER <> 'ETS' THEN FLT_TOTAL_TTC ELSE 0 END) AS montant_comptabilise,
SUM(CASE WHEN code_vente = '1' AND FT_TYPE_TIER = 'CLI' THEN FLT_TOTAL_TTC ELSE 0 END) AS montant_comptabilise_0,
SUM(CASE WHEN code_vente = '1' AND FT_TYPE_TIER = 'AMO' THEN FLT_TOTAL_TTC ELSE 0 END) AS montant_comptabilise_1,
SUM(CASE WHEN code_vente = '1' AND FT_TYPE_TIER = 'AMC' THEN FLT_TOTAL_TTC ELSE 0 END) AS montant_comptabilise_2,
SUM(CASE WHEN code_vente = '1' AND FT_TYPE_TIER = 'AMD' THEN FLT_TOTAL_TTC ELSE 0 END) AS montant_comptabilise_22,
0::numeric AS montant_comptabilise_budget_global_1,
0::numeric AS montant_encours,
0::numeric AS montant_encours_0,
0::numeric AS montant_encours_1,
0::numeric AS montant_encours_2,
0::numeric AS montant_encours_22,
0::bigint AS rubrique_facture_id,
MAX(ART_CODE) AS ART_CODE,
MAX(ART_CODE_2) AS ART_CODE_2
FROM prod_web100t.FAC_FACT_LIGNE_TIER
JOIN w_factures ON FLT_FACTURE = FACT_OID AND IMPAYE = 0
JOIN prod_web100t.FAC_FACT_TIER ON FLT_FACTURE_TIER = FT_OID
JOIN prod_web100t.FAC_FACT_LIGNE ON FLT_LIGNE_FACTURE = LI_OID
JOIN w_ART_ARTICLES ON FLT_ARTICLE = ART_OID
LEFT JOIN w_FAC_B2_TIER ON LI_LIGNE_SOURCE = B2T_LIGNE
LEFT JOIN w_LIGNE_CPT ON FAC_FACT_LIGNE_TIER.FLT_OID = w_LIGNE_CPT.FLT_OID
WHERE FLT_IS_ETS = 1 AND FLT_RECAP <> 0
GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14;
-- Montants impayés
INSERT INTO w_factures_lignes_c
SELECT
FLT_LIGNE_FACTURE,
w_factures.no_sejour,
w_factures.no_facture,
w_factures.oid AS facture_id,
date_vente,
lieu_sortie_id AS lieu_id,
1::numeric AS origine_facturation_id,
rubrique_facturation_id,
rubrique_facturation_id AS rubrique_comptabilisation_id,
prestation_id,
0::bigint AS protocole_id,
COALESCE(w_LIGNE_CPT.compte_produit_id,0::bigint) AS compte_produit_id,
w_ART_ARTICLES.ucd_id,
w_ART_ARTICLES.lpp_id,
date(MIN(FLT_DATE_DEBUT)) AS date_debut,
date(MAX(FLT_DATE_FIN)) AS date_fin,
MAX(COALESCE(B2T_PU,FLT_TOTAL_TTC)) AS prix_unitaire,
0 AS nb_rubrique,
0 AS nb_prestation,
1::numeric AS coefficient,
1::numeric AS coefficient_mco,
MAX(COALESCE(B2T_TAUX_CLI,0)) AS taux_0,
MAX(COALESCE(B2T_TAUX_AMO,0)) AS taux_1,
MAX(COALESCE(B2T_TAUX_AMC,0)) AS taux_2,
MAX(COALESCE(B2T_TAUX_AMD,0)) AS taux_22,
0::numeric AS taux_tva,
0 AS montant_facture,
0 AS montant_facture_0,
0 AS montant_facture_1,
0 AS montant_facture_2,
0::numeric AS montant_facture_22,
0::numeric AS montant_facture_dma,
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,
SUM(FLT_TOTAL_IMPAYE_ETS) AS montant_comptabilise,
SUM(FLT_TOTAL_IMPAYE_ETS_CLI) AS montant_comptabilise_0,
SUM(FLT_TOTAL_IMPAYE_ETS_AMO) AS montant_comptabilise_1,
SUM(FLT_TOTAL_IMPAYE_ETS_AMC) AS montant_comptabilise_2,
SUM(FLT_TOTAL_IMPAYE_ETS_AMD) AS montant_comptabilise_22,
0::numeric AS montant_comptabilise_budget_global_1,
0::numeric AS montant_encours,
0::numeric AS montant_encours_0,
0::numeric AS montant_encours_1,
0::numeric AS montant_encours_2,
0::numeric AS montant_encours_22,
0::bigint AS rubrique_facture_id,
MAX(ART_CODE) AS ART_CODE,
MAX(ART_CODE_2) AS ART_CODE_2
FROM prod_web100t.FAC_FACT_LIGNE_TIER
JOIN w_FAC_FACT_LIGNE_TIER_IMPAYE ON FAC_FACT_LIGNE_TIER.FLT_OID = FLT_IMPAYE_OID
JOIN w_factures ON FLT_FACTURE = FACT_OID AND IMPAYE = w_FAC_FACT_LIGNE_TIER_IMPAYE.FI_COMPTA
JOIN prod_web100t.FAC_FACT_TIER ON FLT_FACTURE_TIER = FT_OID
JOIN prod_web100t.FAC_FACT_LIGNE ON FLT_LIGNE_FACTURE = LI_OID
JOIN w_ART_ARTICLES ON FLT_ARTICLE = ART_OID
LEFT JOIN w_FAC_B2_TIER ON LI_LIGNE_SOURCE = B2T_LIGNE
LEFT JOIN w_LIGNE_CPT ON FAC_FACT_LIGNE_TIER.FLT_OID = w_LIGNE_CPT.FLT_OID
WHERE FLT_IS_ETS = 1 AND FLT_RECAP <> 0 AND FLT_TOTAL_IMPAYE_ETS <> 0
GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14;
-- Remplacement des codes dialyse
INSERT INTO activite.t_divers (code, texte, valeur, description)
SELECT
'TRANSGHSDXX',
'Transformation des GHS en Dxx',
'',
'Transformation des prestations GHS en Dxx selong GHS, la rubrique de facturation prend la valeur du GHS'
WHERE 'TRANSGHSDXX' NOT IN (SELECT code FROM activite.t_divers);
;
INSERT INTO activite[PX].t_rubriques_facturation (code_original, code, texte, texte_court)
SELECT t_ghs.code::text, t_ghs.code::text, t_ghs.texte, t_ghs.texte
FROM base.t_ghs
JOIN activite.t_divers ON t_divers.code = 'TRANSGHSDXX' AND t_divers.valeur = '1'
WHERE t_ghs.code IN (9602,9603,9604,9605,9617) AND
t_ghs.code::text NOT IN (SELECT code_original FROM activite[PX].t_rubriques_facturation WHERE code_original IS NOT NULL)
;
INSERT INTO activite[PX].t_rubriques_facturation (code_original, code, texte, texte_court)
SELECT t_prestations.code::text, t_prestations.code::text, t_prestations.texte, t_prestations.texte
FROM activite.t_prestations
JOIN activite.t_divers ON t_divers.code = 'TRANSGHSDXX' AND t_divers.valeur = '1'
WHERE t_prestations.code IN ('D11') AND
t_prestations.code::text NOT IN (SELECT code_original FROM activite[PX].t_rubriques_facturation WHERE code_original IS NOT NULL) AND
t_prestations.code::text NOT IN (SELECT code FROM activite[PX].t_rubriques_facturation WHERE code IS NOT NULL)
;
DROP TABLE IF EXISTS w_transform_dxx;
CREATE TEMP TABLE w_transform_dxx AS
SELECT p_factures_lignes_c.no_facture,
p_factures_lignes_c.CTID AS CTID_source,
t_prestations.code,
CASE WHEN t_ghs.code IN (9602,9603,9604,9605,9617) THEN t_ghs.code::text ELSE ART_CODE_2 END AS ghs_code,
CASE
WHEN t_ghs.code = 9602 THEN 'D18'
WHEN t_ghs.code = 9603 THEN 'D19'
WHEN t_ghs.code = 9604 THEN 'D17'
WHEN t_ghs.code = 9605 THEN 'D09'
WHEN t_ghs.code = 9617 THEN 'D10'
WHEN ART_CODE_2 = '9602' THEN 'D18'
WHEN ART_CODE_2 = '9603' THEN 'D19'
WHEN ART_CODE_2 = '9604' THEN 'D17'
WHEN ART_CODE_2 = '9605' THEN 'D09'
WHEN ART_CODE_2 = '9617' THEN 'D10'
ELSE '' END AS dxx_prestation_code
FROM w_factures_lignes_c 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 base.t_ghs ON p_sejours.ghs_id = t_ghs.oid
JOIN activite.t_prestations ON t_prestations.oid = prestation_id
JOIN activite.t_divers ON t_divers.code = 'TRANSGHSDXX' AND t_divers.valeur = '1'
WHERE t_prestations.code = 'GHS' AND
(
t_ghs.code IN (9602,9603,9604,9605,9617) OR
ART_CODE_2 IN ('9602','9603','9604','9605','9617')
);
CREATE INDEX w_transform_dxx_i1
ON w_transform_dxx
USING btree
(no_facture)
;
UPDATE w_factures_lignes_c p_factures_lignes_c SET
prestation_id = t_prestations.oid,
rubrique_facturation_id = t_rubriques_facturation.oid
FROM w_transform_dxx
JOIN activite.t_prestations ON dxx_prestation_code = t_prestations.code
JOIN activite[PX].t_rubriques_facturation ON ghs_code = t_rubriques_facturation.code_original
WHERE p_factures_lignes_c.no_facture = w_transform_dxx.no_facture AND
p_factures_lignes_c.CTID = w_transform_dxx.CTID_source
;
-- Eclatement des GHS, GMT et suppléments par jour
DROP TABLE IF EXISTS w_factures_lignes_sup_c;
CREATE TEMP TABLE w_factures_lignes_sup_c AS
SELECT
w_factures_lignes_c.CTID AS from_CTID,
t_prestations.code AS prestation_code,
date(p_sejours.date_entree) AS date_debut_ghs,
date(p_sejours.date_sortie - interval '1 day') AS date_fin_ghs,
(date(date_sortie) - date(date_entree)) * CASE WHEN nb_prestation < 0 THEN -1 ELSE 1 END AS nb_prestation_ghs,
w_factures_lignes_c.*
FROM w_factures_lignes_c
JOIN activite[PX].p_sejours ON w_factures_lignes_c.no_sejour = p_sejours.no_sejour
JOIN activite.t_prestations ON prestation_id = t_prestations.oid AND
(
code IN ('PJ', 'FJ', 'PHJ','SSM', 'GHS', 'EXH', 'SRC', 'REA', 'STF', 'NN1', 'NN2', 'NN3', 'CP', 'CPC', 'SHO') OR
t_prestations.type_ventilation_jour = '1'
)
WHERE (nb_prestation > 1 or nb_prestation < -1 OR (t_prestations.code IN ('GHS', 'GMT') AND p_sejours.type_sejour != '5' 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'),
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_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;
DROP TABLE IF EXISTS w_factures_lignes_sup_c_gen;
CREATE TEMP TABLE w_factures_lignes_sup_c_gen AS
SELECT
w_factures_lignes_sup_c.*
,date AS new_date_debut
,date AS new_date_fin
,CASE WHEN prestation_code IN ('GHS', 'GMT') AND date <> date_fin_ghs THEN 0 WHEN nb_prestation < 0 THEN -1 ELSE 1 END AS new_nb_rubrique
,CASE WHEN prestation_code IN ('GHS', 'GMT') AND date <> date_fin_ghs THEN 0 WHEN nb_prestation < 0 THEN -1 ELSE 1 END AS new_nb_prestation
,round((montant_facture / ABS(CASE WHEN prestation_code NOT IN ('GHS', 'GMT') THEN nb_prestation ELSE nb_prestation_ghs END))::numeric,2) AS new_montant_facture
,round((montant_facture_0 / ABS(CASE WHEN prestation_code NOT IN ('GHS', 'GMT') THEN nb_prestation ELSE nb_prestation_ghs END))::numeric,2) AS new_montant_facture_0
,round((montant_facture_1 / ABS(CASE WHEN prestation_code NOT IN ('GHS', 'GMT') THEN nb_prestation ELSE nb_prestation_ghs END))::numeric,2) AS new_montant_facture_1
,round((montant_facture_2 / ABS(CASE WHEN prestation_code NOT IN ('GHS', 'GMT') THEN nb_prestation ELSE nb_prestation_ghs END))::numeric,2) AS new_montant_facture_2
,round((montant_facture_22 / ABS(CASE WHEN prestation_code NOT IN ('GHS', 'GMT') THEN nb_prestation ELSE nb_prestation_ghs END))::numeric,2) AS new_montant_facture_22
,round((montant_facture_dma / ABS(CASE WHEN prestation_code NOT IN ('GHS', 'GMT') THEN nb_prestation ELSE nb_prestation_ghs END))::numeric,2) AS new_montant_facture_dma
,round((montant_comptabilise / ABS(CASE WHEN prestation_code NOT IN ('GHS', 'GMT') THEN nb_prestation ELSE nb_prestation_ghs END))::numeric,2) AS new_montant_comptabilise
,round((montant_comptabilise_0 / ABS(CASE WHEN prestation_code NOT IN ('GHS', 'GMT') THEN nb_prestation ELSE nb_prestation_ghs END))::numeric,2) AS new_montant_comptabilise_0
,round((montant_comptabilise_1 / ABS(CASE WHEN prestation_code NOT IN ('GHS', 'GMT') THEN nb_prestation ELSE nb_prestation_ghs END))::numeric,2) AS new_montant_comptabilise_1
,round((montant_comptabilise_2 / ABS(CASE WHEN prestation_code NOT IN ('GHS', 'GMT') THEN nb_prestation ELSE nb_prestation_ghs END))::numeric,2) AS new_montant_comptabilise_2
,round((montant_comptabilise_22 / ABS(CASE WHEN prestation_code NOT IN ('GHS', 'GMT') THEN nb_prestation ELSE nb_prestation_ghs END))::numeric,2) AS new_montant_comptabilise_22
FROM w_factures_lignes_sup_c
JOIN base.p_calendrier ON date_debut BETWEEN p_calendrier.date - ABS(CASE WHEN prestation_code NOT IN ('GHS', 'GMT') THEN nb_prestation ELSE nb_prestation_ghs END)::integer + 1
AND p_calendrier.date
AND p_calendrier.date <> date_debut
;
DROP TABLE IF EXISTS w_factures_lignes_sup_c_gen_tot;
CREATE TEMP TABLE w_factures_lignes_sup_c_gen_tot AS
SELECT from_CTID,
SUM(new_nb_rubrique) AS nb_rubrique,
SUM(new_nb_prestation) AS nb_prestation,
SUM(new_montant_facture) AS montant_facture,
SUM(new_montant_facture_0) AS montant_facture_0,
SUM(new_montant_facture_1) AS montant_facture_1,
SUM(new_montant_facture_2) AS montant_facture_2,
SUM(new_montant_facture_22) AS montant_facture_22,
SUM(new_montant_facture_dma) AS montant_facture_dma,
SUM(new_montant_comptabilise) AS montant_comptabilise,
SUM(new_montant_comptabilise_0) AS montant_comptabilise_0,
SUM(new_montant_comptabilise_1) AS montant_comptabilise_1,
SUM(new_montant_comptabilise_2) AS montant_comptabilise_2,
SUM(new_montant_comptabilise_22) AS montant_comptabilise_22
FROM w_factures_lignes_sup_c_gen
GROUP BY 1;
UPDATE w_factures_lignes_c
SET
date_fin = w_factures_lignes_c.date_debut,
nb_rubrique = w_factures_lignes_c.nb_rubrique - w_factures_lignes_sup_c_gen_tot.nb_rubrique,
nb_prestation = w_factures_lignes_c.nb_prestation - w_factures_lignes_sup_c_gen_tot.nb_prestation,
montant_facture = w_factures_lignes_c.montant_facture - w_factures_lignes_sup_c_gen_tot.montant_facture,
montant_facture_0 = w_factures_lignes_c.montant_facture_0 - w_factures_lignes_sup_c_gen_tot.montant_facture_0,
montant_facture_1 = w_factures_lignes_c.montant_facture_1 - w_factures_lignes_sup_c_gen_tot.montant_facture_1,
montant_facture_2 = w_factures_lignes_c.montant_facture_2 - w_factures_lignes_sup_c_gen_tot.montant_facture_2,
montant_facture_22 = w_factures_lignes_c.montant_facture_22 - w_factures_lignes_sup_c_gen_tot.montant_facture_22,
montant_facture_dma = w_factures_lignes_c.montant_facture_dma - w_factures_lignes_sup_c_gen_tot.montant_facture_dma,
montant_comptabilise = w_factures_lignes_c.montant_comptabilise - w_factures_lignes_sup_c_gen_tot.montant_comptabilise,
montant_comptabilise_0 = w_factures_lignes_c.montant_comptabilise_0 - w_factures_lignes_sup_c_gen_tot.montant_comptabilise_0,
montant_comptabilise_1 = w_factures_lignes_c.montant_comptabilise_1 - w_factures_lignes_sup_c_gen_tot.montant_comptabilise_1,
montant_comptabilise_2 = w_factures_lignes_c.montant_comptabilise_2 - w_factures_lignes_sup_c_gen_tot.montant_comptabilise_2,
montant_comptabilise_22 = w_factures_lignes_c.montant_comptabilise_22 - w_factures_lignes_sup_c_gen_tot.montant_comptabilise_22
FROM w_factures_lignes_sup_c_gen_tot
WHERE w_factures_lignes_c.CTID = from_CTID;
INSERT INTO w_factures_lignes_c
SELECT
FLT_LIGNE_FACTURE,
no_sejour,
no_facture,
facture_id,
date_vente,
lieu_id,
origine_facturation_id,
rubrique_facturation_id,
rubrique_comptabilisation_id,
prestation_id,
protocole_id,
compte_produit_id,
ucd_id,
lpp_id,
new_date_debut,
new_date_fin,
prix_unitaire,
new_nb_rubrique,
new_nb_prestation,
coefficient,
coefficient_mco,
taux_0,
taux_1,
taux_2,
taux_22,
taux_tva,
new_montant_facture,
new_montant_facture_0,
new_montant_facture_1,
new_montant_facture_2,
new_montant_facture_22,
new_montant_facture_dma,
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,
new_montant_comptabilise,
new_montant_comptabilise_0,
new_montant_comptabilise_1,
new_montant_comptabilise_2,
new_montant_comptabilise_22,
montant_comptabilise_budget_global_1,
montant_encours,
montant_encours_0,
montant_encours_1,
montant_encours_2,
montant_encours_22,
0::bigint AS rubrique_facture_id
FROM w_factures_lignes_sup_c_gen;
-- arrondi tva
UPDATE w_factures_lignes_c
SET taux_tva = 2.1
WHERE taux_tva BETWEEN 1.2 AND 3 AND
taux_tva <> 2.1
;
UPDATE w_factures_lignes_c
SET taux_tva = 5.5
WHERE taux_tva BETWEEN 4.6 AND 6.4 AND
taux_tva <> 5.5
;
UPDATE w_factures_lignes_c
SET taux_tva = 10
WHERE taux_tva BETWEEN 9.1 AND 10.9 AND
taux_tva <> 10
;
UPDATE w_factures_lignes_c
SET taux_tva = 20
WHERE taux_tva >= 15 AND
taux_tva <> 20
;
-- Lieux d'exécution
UPDATE w_factures_lignes_c
SET lieu_id = p_mouvements_sejour.lieu_id
FROM activite[PX].p_mouvements_sejour
WHERE w_factures_lignes_c.no_sejour = p_mouvements_sejour.no_sejour AND
w_factures_lignes_c.date_debut = p_mouvements_sejour.date AND
(p_mouvements_sejour.heure_fin = 240000 OR p_mouvements_sejour.nb_sorties_directes = 1) AND
w_factures_lignes_c.lieu_id <> p_mouvements_sejour.lieu_id;
-- Rubriques internes cti
SELECT activite[PX].cti_reorganize_rubrique_facture_c('w_factures_lignes_c');
-- Validation
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_c_1');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_c_2');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_c_3');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_c_4');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_c_5');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_c_6');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_c_7');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_c_8');
INSERT INTO activite[PX].p_factures_lignes_c(
no_facture,
facture_id,
date_debut,
date_fin,
lieu_id,
origine_facturation_id,
rubrique_facture_id,
rubrique_facturation_id,
rubrique_comptabilisation_id,
prestation_id,
protocole_id,
compte_produit_id,
ucd_id,
lpp_id,
prix_unitaire,
nb_rubrique,
nb_prestation,
coefficient,
coefficient_mco,
taux_0,
taux_1,
taux_2,
taux_22,
taux_tva,
montant_facture,
montant_facture_0,
montant_facture_1,
montant_facture_2,
montant_facture_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,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
montant_comptabilise_budget_global_1,
montant_encours,
montant_encours_0,
montant_encours_1,
montant_encours_2,
montant_encours_22
)
SELECT
no_facture,
facture_id,
date_debut,
date_fin,
lieu_id,
origine_facturation_id,
rubrique_facture_id,
rubrique_facturation_id,
rubrique_comptabilisation_id,
prestation_id,
protocole_id,
compte_produit_id,
ucd_id,
lpp_id,
prix_unitaire,
nb_rubrique,
nb_prestation,
coefficient,
coefficient_mco,
taux_0,
taux_1,
taux_2,
taux_22,
taux_tva,
montant_facture,
montant_facture_0,
montant_facture_1,
montant_facture_2,
montant_facture_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,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
montant_comptabilise_budget_global_1,
montant_encours,
montant_encours_0,
montant_encours_1,
montant_encours_2,
montant_encours_22
FROM w_factures_lignes_c;
-- DMA SSR
DROP TABLE IF EXISTS w_factures_lignes_c_dma;
CREATE TEMP TABLE w_factures_lignes_c_dma AS
SELECT *
FROM w_factures_lignes_c
WHERE montant_facture_dma <> 0
;
UPDATE w_factures_lignes_c_dma SET
nb_rubrique = 0-nb_rubrique,
nb_prestation = 0-nb_prestation,
taux_0 = 0,
taux_2 = 0,
taux_22 = 0,
montant_facture = montant_facture_dma,
montant_facture_1 = montant_facture_dma,
montant_facture_2 = 0,
montant_facture_22 = 0,
montant_facture_0 = 0,
montant_facture_actes_inclus_dans_sejour = 0,
montant_facture_0_actes_inclus_dans_sejour = 0,
montant_facture_1_actes_inclus_dans_sejour = 0,
montant_facture_2_actes_inclus_dans_sejour = 0,
montant_facture_22_actes_inclus_dans_sejour = 0,
montant_comptabilise = 0,
montant_comptabilise_0 = 0,
montant_comptabilise_1 = 0,
montant_comptabilise_2 = 0,
montant_comptabilise_22 = 0,
montant_comptabilise_budget_global_1 = 0,
montant_encours = 0,
montant_encours_0 = 0,
montant_encours_1 = 0,
montant_encours_2 = 0,
montant_encours_22 = 0
WHERE montant_facture_dma <> 0
;
INSERT INTO activite.t_prestations(code_original, code, texte, texte_court)
SELECT 'DMAM'||code, 'DMAM'||code, 'Diminution SSR ' || code, 'Diminution SSR ' || code
FROM
(
SELECT t_prestations.code AS code
FROM w_factures_lignes_c_dma
JOIN activite.t_prestations ON t_prestations.oid = prestation_id
GROUP BY 1
) subview
WHERE ('DMAM'||code) NOT IN (SELECT code FROM activite.t_prestations WHERE code IS NOT NULL)
;
INSERT INTO activite[PX].t_rubriques_facturation(code_original, code, texte, texte_court)
SELECT '*DMAM'||code, 'DMAM'||code, 'Diminution SSR ' || code, 'Diminution SSR ' || code
FROM
(
SELECT t_rubriques_facturation.code AS code
FROM w_factures_lignes_c_dma
JOIN activite[PX].t_rubriques_facturation ON t_rubriques_facturation.oid = rubrique_facturation_id
GROUP BY 1
) subview
WHERE ('*DMAM'||code) NOT IN (SELECT code_original FROM activite[PX].t_rubriques_facturation WHERE code_original IS NOT NULL)
;
UPDATE w_factures_lignes_c_dma SET
rubrique_facturation_id = t_rubriques_facturation_dmam.oid,
rubrique_comptabilisation_id = t_rubriques_facturation_dmam.oid
FROM activite[PX].t_rubriques_facturation
JOIN activite[PX].t_rubriques_facturation t_rubriques_facturation_dmam ON t_rubriques_facturation_dmam.code_original = '*DMAM'||t_rubriques_facturation.code
WHERE rubrique_facturation_id = t_rubriques_facturation.oid
;
UPDATE w_factures_lignes_c_dma SET
prestation_id = t_prestations_dmam.oid
FROM activite.t_prestations
JOIN activite.t_prestations t_prestations_dmam ON t_prestations_dmam.code = 'DMAM'||t_prestations.code
WHERE prestation_id = t_prestations.oid
;
INSERT INTO activite[PX].p_factures_lignes_c(
no_facture,
facture_id,
date_debut,
date_fin,
lieu_id,
origine_facturation_id,
rubrique_facture_id,
rubrique_facturation_id,
rubrique_comptabilisation_id,
prestation_id,
protocole_id,
compte_produit_id,
ucd_id,
lpp_id,
prix_unitaire,
nb_rubrique,
nb_prestation,
coefficient,
coefficient_mco,
taux_0,
taux_1,
taux_2,
taux_22,
taux_tva,
montant_facture,
montant_facture_0,
montant_facture_1,
montant_facture_2,
montant_facture_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,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
montant_comptabilise_budget_global_1,
montant_encours,
montant_encours_0,
montant_encours_1,
montant_encours_2,
montant_encours_22
)
SELECT
no_facture,
facture_id,
date_debut,
date_fin,
lieu_id,
origine_facturation_id,
rubrique_facture_id,
rubrique_facturation_id,
rubrique_comptabilisation_id,
prestation_id,
protocole_id,
compte_produit_id,
ucd_id,
lpp_id,
prix_unitaire,
nb_rubrique,
nb_prestation,
coefficient,
coefficient_mco,
taux_0,
taux_1,
taux_2,
taux_22,
0::numeric AS taux_tva,
montant_facture,
montant_facture_0,
montant_facture_1,
montant_facture_2,
montant_facture_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,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
montant_comptabilise_budget_global_1,
montant_encours,
montant_encours_0,
montant_encours_1,
montant_encours_2,
montant_encours_22
FROM w_factures_lignes_c_dma
WHERE montant_facture_dma <> 0
;
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');
]]>
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;
DROP TABLE IF EXISTS w_CPT_OP_LINK;
CREATE TEMP TABLE w_CPT_OP_LINK AS
SELECT LNK_OPERATION,
MAX(ECR_DATE) AS ECR_DATE
FROM w_CPT_OP_LINK_source_agg
JOIN
(
SELECT
LNK_MASTER_OP, MAX(ECR_DATE) AS ECR_DATE
FROM w_CPT_ECRITURE_source_OP_LINK
WHERE LNK_ERROR = ''
GROUP BY 1
) subview ON w_CPT_OP_LINK_source_agg.LNK_MASTER_OP = subview.LNK_MASTER_OP
GROUP BY 1;
ALTER TABLE w_CPT_OP_LINK ADD CONSTRAINT w_CPT_OP_LINK_pkey PRIMARY KEY(LNK_OPERATION);
INSERT INTO activite[PX].p_factures_soldes_c(
no_facture,
facture_id,
date_comptable,
rubrique_comptabilisee_id,
prestation_id,
od_non_comptabilise,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
montant_regle,
montant_regle_0,
montant_regle_1,
montant_regle_2,
montant_regle_22
)
SELECT
w_factures.no_facture,
w_factures.oid AS facture_id,
date(COALESCE(ECR_DATE,RD_DATE,FR_DATE_ENC)) AS date_comptable,
rubrique_facturation_id AS rubrique_comptabilisation_id,
prestation_id,
CASE
WHEN FR_DATE_DEPOT_GUESS IS NOT NULL AND FR_DATE_ENC IS NULL THEN '1'
WHEN RD_CREATED > ECR_UPDATED_MAX THEN '1'
ELSE '0' END AS od_non_comptabilise,
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,
SUM(RD_MONTANT) As montant_regle,
SUM(CASE WHEN FT_TYPE_TIER = 'CLI' THEN RD_MONTANT ELSE 0 END) AS montant_regle_0,
SUM(CASE WHEN FT_TYPE_TIER = 'AMO' THEN RD_MONTANT ELSE 0 END) AS montant_regle_1,
SUM(CASE WHEN FT_TYPE_TIER = 'AMC' THEN RD_MONTANT ELSE 0 END) AS montant_regle_2,
SUM(CASE WHEN FT_TYPE_TIER = 'AMD' THEN RD_MONTANT ELSE 0 END) AS montant_regle_22
FROM prod_web100t.FAC_RGLMT_DETAILS
JOIN prod_web100t.FAC_REGLEMENTS ON FR_OID = RD_REGLEMENT
JOIN w_factures ON RD_FACTURE = FACT_OID AND IMPAYE = 0
JOIN prod_web100t.FAC_FACT_TIER ON RD_FACT_TIER = FT_OID
JOIN prod_web100t.FAC_FACT_LIGNE_TIER ON RD_FACT_LINE = FLT_OID
JOIN w_ART_ARTICLES ON FLT_ARTICLE = ART_OID
LEFT JOIN w_CPT_OP_LINK ON RD_COMPTA = LNK_OPERATION
JOIN w_max_ECR_UPDATED ON 1=1
WHERE RD_ETS = 1
GROUP BY 1,2,3,4,5,6;
-- Acomptes noemie 85%
INSERT INTO activite[PX].t_rubriques_facturation(code_original, code, texte, texte_court)
SELECT '*CTI_ACO85', 'ACO85', 'Acomptes 85%', 'Acomptes 85%'
WHERE '*CTI_ACO85' NOT IN (SELECT code_original FROM activite[PX].t_rubriques_facturation);
INSERT INTO activite.t_prestations(code_original, code, texte, texte_court)
SELECT '*CTI_ACO85', 'ACO85', 'Acomptes 85%', 'Acomptes 85%'
WHERE '*CTI_ACO85' NOT IN (SELECT code_original FROM activite.t_prestations WHERE code_original IS NOT NULL);
-- Correction tables noemie car quelque fois il manque la reprise d'acompte sur le règlement
UPDATE prod_web100t.NOE_PAI_FACT
SET NPF_TOTAL_ACOMPTE = 0-NPF_TOTAL_ACOMPTE_1
FROM
(
SELECT NPF_FACT_TIER,
MAX(CASE WHEN NPF_TOTAL_ACOMPTE <> 0 THEN NPF_OID ELSE 0 END) AS NPF_OID_1,
MAX(CASE WHEN NPF_TOTAL_ACOMPTE <> 0 THEN NPF_TOTAL_ACOMPTE ELSE NULL END) AS NPF_TOTAL_ACOMPTE_1,
MAX(CASE WHEN NPF_TOTAL_ACOMPTE = 0 THEN NPF_OID ELSE 0 END) AS NPF_OID_2
FROM prod_web100t.NOE_PAI_FACT
JOIN prod_web100t.NOE_PAIEMENT ON NPF_PAIEMENT = NP_OID AND NP_PAIEMENT_ETS = 1
GROUP BY 1
HAVING count(*) = 2 AND
SUM(NPF_TOTAL_ACOMPTE) > 0 AND
MAX(CASE WHEN NPF_TOTAL_ACOMPTE = 0 THEN NPF_OID ELSE 0 END) <> 0
) subview
WHERE NPF_OID = NPF_OID_2 AND
NPF_TOTAL_ACOMPTE = 0
;
-- Exploitation des tables noemie
DROP TABLE IF EXISTS w_NOE_PAI_FACT;
CREATE TEMP TABLE w_NOE_PAI_FACT AS
SELECT FACT_NUMERO,
NPF_FACT_TIER,
NPF_TOTAL_AMO,
NPF_TOTAL_ACOMPTE,
NPF_PAIEMENT,
NP_DATE_COMPTABLE,
NP_REGLEMENT,
date(COALESCE(FR_DATE_ENC,NP_DATE_COMPTABLE)) AS date_imputation,
'1'::text AS ok
FROM prod_web100t.NOE_PAI_FACT
JOIN prod_web100t.NOE_PAIEMENT ON NPF_PAIEMENT = NP_OID AND NP_PAIEMENT_ETS = 1
LEFT JOIN prod_web100T.FAC_REGLEMENTS ON NP_REGLEMENT = FR_OID
JOIN prod_web100t.FAC_FACT_TIER ON NPF_FACT_TIER = FT_OID
JOIN prod_web100t.FAC_FACTURE ON FT_FACTURE = FACT_OID
WHERE NPF_TOTAL_ACOMPTE <> 0 AND
FACT_DA = ANY(SELECT DA_OID FROM prod_web100t.DAT_DA WHERE DA_EG_ENTREE = ANY(SELECT ets_oid FROM w_NMCL_ETABLISSEMENT))
;
-- Date imputation reprise acompte selon date encaissement AMO
UPDATE w_NOE_PAI_FACT
SET date_imputation = subview.date_imputation
FROM
(
SELECT NPF_PAIEMENT, max(date_imputation) AS date_imputation
FROM
(
SELECT p_factures.no_facture,
MAX(NPF_PAIEMENT) AS npf_paiement,
MIN(NP_DATE_COMPTABLE),
MIN(p_factures_soldes_c.date_comptable) AS date_imputation,
date(MIN(p_factures_soldes_c.date_comptable)) - date(MIN(NP_DATE_COMPTABLE)) AS ecart
FROM w_NOE_PAI_FACT
JOIN activite[PX].p_factures ON FACT_NUMERO = p_factures.no_facture
JOIN activite[PX].p_factures_soldes_c ON p_factures_soldes_c.no_facture = p_factures.no_facture
WHERE p_factures.montant_comptabilise_1_c = p_factures_soldes_c.montant_regle_1 AND
NPF_TOTAL_ACOMPTE < 0 AND
NPF_TOTAL_AMO = montant_regle_1
GROUP BY 1
HAVING count(*) = 1
ORDER BY 2,5 desc
) subview
GROUP BY 1
HAVING count(DISTINCT ecart) = 1
) subview
WHERE w_NOE_PAI_FACT.NPF_PAIEMENT = subview.NPF_PAIEMENT
;
UPDATE w_NOE_PAI_FACT
SET OK = '0'
FROM
(
SELECT NPF_FACT_TIER, SUM(NPF_TOTAL_ACOMPTE), MAX(NP_DATE_COMPTABLE)
FROM w_NOE_PAI_FACT
GROUP BY 1
HAVING (
SUM(NPF_TOTAL_ACOMPTE) <> 0 AND MAX(NP_DATE_COMPTABLE) < (now() - interval '1 year') OR
SUM(NPF_TOTAL_ACOMPTE) < 0 OR
SUM(NPF_TOTAL_ACOMPTE) > 0 AND count(*) > 1
)
) subview
WHERE w_NOE_PAI_FACT.NPF_FACT_TIER = subview.NPF_FACT_TIER
;
-- Acompte et reprise d'acompte
INSERT INTO activite[PX].p_factures_soldes_c(
facture_id,
no_facture,
date_comptable,
rubrique_comptabilisee_id,
prestation_id,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
montant_regle,
montant_regle_0,
montant_regle_1,
montant_regle_2,
montant_regle_22,
od_non_comptabilise
)
SELECT
p_factures.oid AS facture_id,
p_factures.no_facture,
date_imputation AS date_comptable,
t_rubriques_facturation.oid AS rubrique_comptabilisation_id,
t_prestations.oid AS prestation_id,
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,
NPF_TOTAL_ACOMPTE AS montant_regle,
0 AS montant_regle_0,
NPF_TOTAL_ACOMPTE AS montant_regle_1,
0 AS montant_regle_2,
0 AS montant_regle_22,
'1' AS od_non_comptabilise
FROM w_NOE_PAI_FACT
JOIN activite[PX].p_factures ON FACT_NUMERO = no_facture
JOIN activite[PX].t_rubriques_facturation ON t_rubriques_facturation.code_original = '*CTI_ACO85'
JOIN activite.t_prestations ON t_prestations.code_original = '*CTI_ACO85'
WHERE w_NOE_PAI_FACT.ok = '1'
;
-- Règlement si mouvement non comptabilisé
INSERT INTO activite[PX].p_factures_soldes_c(
facture_id,
no_facture,
date_comptable,
rubrique_comptabilisee_id,
prestation_id,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
montant_regle,
montant_regle_0,
montant_regle_1,
montant_regle_2,
montant_regle_22,
od_non_comptabilise
)
SELECT
p_factures.oid AS facture_id,
p_factures.no_facture,
date_imputation AS date_comptable,
t_rubriques_facturation.oid AS rubrique_comptabilisation_id,
t_prestations.oid AS prestation_id,
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,
NPF_TOTAL_AMO AS montant_regle,
0 AS montant_regle_0,
NPF_TOTAL_AMO AS montant_regle_1,
0 AS montant_regle_2,
0 AS montant_regle_22,
'1' AS od_non_comptabilise
FROM w_NOE_PAI_FACT
JOIN activite[PX].p_factures ON FACT_NUMERO = no_facture
JOIN activite[PX].t_rubriques_facturation ON t_rubriques_facturation.code_original = '*CTI_ACO85'
JOIN activite.t_prestations ON t_prestations.code_original = '*CTI_ACO85'
WHERE w_NOE_PAI_FACT.ok = '1' AND
NP_REGLEMENT = 0 AND
NPF_TOTAL_ACOMPTE < 0 AND
NPF_TOTAL_AMO > 0 AND
date_imputation >= date(now() - interval '1 month')
;
UPDATE activite[PX].p_factures SET
montant_regle_c = montant_regle_c + montant_acompte,
montant_regle_1_c = montant_regle_1_c + montant_acompte
FROM
(
SELECT no_facture, SUM(montant_regle_1) AS montant_acompte
FROM activite[PX].p_factures_soldes_c
JOIN activite.t_prestations ON prestation_id = t_prestations.oid AND
t_prestations.code_original = '*CTI_ACO85'
GROUP BY 1
HAVING SUM(montant_regle_1) <> 0
) subview
WHERE p_factures.no_facture = subview.no_facture
;
-- Solder les factures soldées par une facture d'impayé
INSERT INTO activite[PX].p_factures_soldes_c(
no_facture,
facture_id,
date_comptable,
rubrique_comptabilisee_id,
prestation_id,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
montant_regle,
montant_regle_0,
montant_regle_1,
montant_regle_2,
montant_regle_22,
od_non_comptabilise
)
SELECT
p_factures_soldes_c.no_facture,
p_factures_soldes_c.facture_id,
p_factures_soldes_c.date_comptable,
p_factures_soldes_c.rubrique_comptabilisee_id,
p_factures_soldes_c.prestation_id,
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,
p_factures_soldes_c.montant_comptabilise AS montant_regle,
p_factures_soldes_c.montant_comptabilise_0 AS montant_regle_0,
p_factures_soldes_c.montant_comptabilise_1 AS montant_regle_1,
p_factures_soldes_c.montant_comptabilise_2 AS montant_regle_2,
p_factures_soldes_c.montant_comptabilise_22 AS montant_regle_22,
'1'::text AS od_non_comptabilise
FROM activite[PX].p_factures_soldes_c
JOIN activite[PX].p_factures ON split_part(p_factures_soldes_c.no_facture,'-IM',1) = p_factures.no_facture
WHERE p_factures_soldes_c.no_facture LIKE '%-IM%' AND p_factures_soldes_c.montant_comptabilise <> 0
;
INSERT INTO activite[PX].p_factures_soldes_c(
no_facture,
facture_id,
date_comptable,
rubrique_comptabilisee_id,
prestation_id,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
montant_regle,
montant_regle_0,
montant_regle_1,
montant_regle_2,
montant_regle_22,
od_non_comptabilise
)
SELECT
p_factures.no_facture,
p_factures.oid AS facture_id,
p_factures_soldes_c.date_comptable,
p_factures_soldes_c.rubrique_comptabilisee_id,
p_factures_soldes_c.prestation_id,
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-p_factures_soldes_c.montant_comptabilise AS montant_regle,
0-p_factures_soldes_c.montant_comptabilise_0 AS montant_regle_0,
0-p_factures_soldes_c.montant_comptabilise_1 AS montant_regle_1,
0-p_factures_soldes_c.montant_comptabilise_2 AS montant_regle_2,
0-p_factures_soldes_c.montant_comptabilise_22 AS montant_regle_22,
'1'::text AS od_non_comptabilise
FROM activite[PX].p_factures_soldes_c
JOIN activite[PX].p_factures ON split_part(p_factures_soldes_c.no_facture,'-IM',1) = p_factures.no_facture
WHERE p_factures_soldes_c.no_facture LIKE '%-IM%' AND montant_comptabilise <> 0
;
DROP TABLE IF EXISTS w_facture_total_impaye;
CREATE TEMP TABLE w_facture_total_impaye AS
SELECT split_part(p_factures.no_facture,'-IM',1) AS impaye_no_facture,
SUM(montant_comptabilise_c) AS impaye_montant_comptabilise_c,
SUM(montant_comptabilise_1_c) AS impaye_montant_comptabilise_1_c,
SUM(montant_comptabilise_2_c) AS impaye_montant_comptabilise_2_c,
SUM(montant_comptabilise_22_c) AS impaye_montant_comptabilise_22_c,
SUM(montant_comptabilise_0_c) AS impaye_montant_comptabilise_0_c
FROM activite[PX].p_factures
WHERE no_facture LIKE '%-IM%' AND montant_comptabilise_c <> 0
GROUP BY 1
;
UPDATE activite[PX].p_factures SET
montant_regle_c = montant_regle_c - impaye_montant_comptabilise_c,
montant_regle_1_c = montant_regle_1_c - impaye_montant_comptabilise_1_c,
montant_regle_2_c = montant_regle_2_c - impaye_montant_comptabilise_2_c,
montant_regle_22_c = montant_regle_22_c - impaye_montant_comptabilise_22_c,
montant_regle_0_c = montant_regle_0_c - impaye_montant_comptabilise_0_c
FROM w_facture_total_impaye
WHERE p_factures.no_facture = impaye_no_facture
;
UPDATE activite[PX].p_factures SET
montant_regle_c = montant_regle_c + montant_comptabilise_c,
montant_regle_1_c = montant_regle_1_c + montant_comptabilise_1_c,
montant_regle_2_c = montant_regle_2_c + montant_comptabilise_2_c,
montant_regle_22_c = montant_regle_22_c + montant_comptabilise_22_c,
montant_regle_0_c = montant_regle_0_c + montant_comptabilise_0_c
FROM w_facture_total_impaye
WHERE p_factures.no_facture LIKE '%-IM%' AND
split_part(p_factures.no_facture,'-IM',1) = w_facture_total_impaye.impaye_no_facture
;
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');
]]>
0
GROUP BY 1
;
UPDATE prod_web100t.DAT_PRESTATIONS_GAP SET
PREST_PU = PU,
PREST_QUANTITE = (date(prest_date_fin)-date(prest_date_debut)+1),
PREST_MFE_HON = round(((date(prest_date_fin)-date(prest_date_debut)+1)*PU*PREST_COEFF)::numeric,2)
FROM w_DAT_PRESTATIONS_GAP_PU
WHERE DAT_PRESTATIONS_GAP.PREST_CODE = w_DAT_PRESTATIONS_GAP_PU.PREST_CODE AND
PREST_DATE_DEBUT <> PREST_DATE_FIN
;
TRUNCATE activite[PX].p_factures_lignes_non_facturees_h;
INSERT INTO activite[PX].p_factures_lignes_non_facturees_h(
no_facture,
facture_id,
date_debut,
date_fin,
heure_debut,
nb_rubrique,
coefficient,
medecin_facture_id,
prestation_id,
prix_unitaire,
montant_depassement,
lieu_id,
acte_id,
phase_ccam,
activite_ccam,
extension_ccam,
modificateur_ccam_1,
modificateur_ccam_2,
modificateur_ccam_3,
modificateur_ccam_4)
SELECT
p_factures.no_facture,
p_factures.oid AS facture_id,
date(PREST_DATE_DEBUT) AS date_debut,
date(COALESCE(PREST_DATE_FIN, PREST_DATE_DEBUT)) AS date_fin,
extract('hour' FROM COALESCE(PREST_DATE_FIN, PREST_DATE_DEBUT)) AS heure_debut,
CASE WHEN PREST_QUANTITE <> 0 AND PREST_PU <> 0 THEN PREST_QUANTITE ELSE 1 END AS nb_rubrique,
CASE WHEN PREST_COEFF <> 0 AND PREST_PU <> 0 THEN PREST_COEFF ELSE 1 END AS coefficient,
COALESCE(t_medecins_administratifs.oid,0) AS medecin_facture_id,
prestation_id,
CASE WHEN PREST_PU <> 0 THEN PREST_PU ELSE PREST_MFE_HON END AS prix_unitaire,
PREST_DEPASSEMENT AS montant_depassement,
p_sejours.lieu_sortie_id AS lieu_id,
acte_id,
ART_CODE_PHASE AS phase_ccam,
ART_CODE_ACTIVITE AS activite_ccam,
PREST_EXTENSION_DOC AS extension_ccam,
substr(PREST_MODIFICATEURS,1,1) AS modificateur_ccam_1,
substr(PREST_MODIFICATEURS,2,1) AS modificateur_ccam_2,
substr(PREST_MODIFICATEURS,3,1) AS modificateur_ccam_3,
substr(PREST_MODIFICATEURS,4,1) AS modificateur_ccam_4
FROM prod_web100t.DAT_PRESTATIONS_GAP
JOIN prod_web100t.DAT_DA ON PREST_DA = DA_OID
JOIN activite[PX].p_sejours ON DA_OID = p_sejours.code_original AND date(PREST_DATE_DEBUT) BETWEEN date_entree AND date_sortie
JOIN activite[PX].p_factures ON p_factures.no_sejour = p_sejours.no_sejour AND type_facture = 'E' AND date(PREST_DATE_DEBUT) BETWEEN date_debut AND date_fin
JOIN w_ART_ARTICLES ON PREST_ARTICLE = ART_OID
LEFT JOIN activite[PX].t_medecins_administratifs ON PREST_EXECUTANT = t_medecins_administratifs.code_original
WHERE PREST_MFE_HON > 0 AND PREST_ENTENTE_DIRECTE = 0 AND PREST_DELETED = 0
ORDER BY p_sejours.no_sejour;
]]>
= 0 THEN 1 ELSE -1 END AS nb_rubrique,
CASE WHEN SUM(FLT_TOTAL_TTC) >= 0 THEN 1 ELSE -1 END AS nb_prestation,
MAX(COALESCE(B2T_QUANTITE,1)) AS coefficient,
1::numeric AS coefficient_mco,
MAX(COALESCE(B2T_TAUX_CLI,0)) AS taux_0,
MAX(COALESCE(B2T_TAUX_AMO,0)) AS taux_1,
MAX(COALESCE(B2T_TAUX_AMC,0)) AS taux_2,
MAX(COALESCE(B2T_TAUX_AMD,0)) AS taux_22,
SUM(FLT_TOTAL_TTC) AS montant_facture,
SUM(CASE WHEN FLT_IS_DEP = 1 THEN FLT_TOTAL_TTC ELSE 0 END) AS montant_depassement,
SUM(CASE WHEN FT_TYPE_TIER = 'CLI' THEN FLT_TOTAL_TTC ELSE 0 END) AS montant_facture_0,
SUM(CASE WHEN FT_TYPE_TIER = 'AMO' THEN FLT_TOTAL_TTC ELSE 0 END) AS montant_facture_1,
SUM(CASE WHEN FT_TYPE_TIER = 'AMC' THEN FLT_TOTAL_TTC ELSE 0 END) AS montant_facture_2,
SUM(CASE WHEN FT_TYPE_TIER = 'AMD' THEN FLT_TOTAL_TTC ELSE 0 END) AS montant_facture_22,
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,
SUM(CASE WHEN code_vente = '1' AND FLT_IS_DIRECT <= 0 AND FLT_IS_ETS = 0 AND FT_TYPE_TIER <> 'ETS' THEN FLT_TOTAL_TTC ELSE 0 END) AS montant_comptabilise,
SUM(CASE WHEN code_vente = '1' AND FLT_IS_DIRECT <= 0 AND FLT_IS_ETS = 0 AND FT_TYPE_TIER = 'CLI' THEN FLT_TOTAL_TTC ELSE 0 END) AS montant_comptabilise_0,
SUM(CASE WHEN code_vente = '1' AND FLT_IS_DIRECT <= 0 AND FLT_IS_ETS = 0 AND FT_TYPE_TIER = 'AMO' THEN FLT_TOTAL_TTC ELSE 0 END) AS montant_comptabilise_1,
SUM(CASE WHEN code_vente = '1' AND FLT_IS_DIRECT <= 0 AND FLT_IS_ETS = 0 AND FT_TYPE_TIER = 'AMC' THEN FLT_TOTAL_TTC ELSE 0 END) AS montant_comptabilise_2,
SUM(CASE WHEN code_vente = '1' AND FLT_IS_DIRECT <= 0 AND FLT_IS_ETS = 0 AND FT_TYPE_TIER = 'AMD' THEN FLT_TOTAL_TTC ELSE 0 END) AS montant_comptabilise_22,
0::numeric AS montant_comptabilise_budget_global_1,
0::numeric AS montant_encours,
0::numeric AS montant_encours_0,
0::numeric AS montant_encours_1,
0::numeric AS montant_encours_2,
0::numeric AS montant_encours_22,
MAX(CASE WHEN FT_TYPE_TIER = 'CLI' THEN FLT_OID ELSE 0 END) AS FLT_OID_0,
MAX(CASE WHEN FT_TYPE_TIER = 'AMO' THEN FLT_OID ELSE 0 END) AS FLT_OID_1,
MAX(CASE WHEN FT_TYPE_TIER = 'AMC' THEN FLT_OID ELSE 0 END) AS FLT_OID_2,
MAX(CASE WHEN FT_TYPE_TIER = 'AMD' THEN FLT_OID ELSE 0 END) AS FLT_OID_22
FROM prod_web100t.FAC_FACT_LIGNE_TIER
JOIN w_factures ON FLT_FACTURE = FACT_OID AND IMPAYE = 0
JOIN prod_web100t.FAC_FACT_TIER ON FLT_FACTURE_TIER = FT_OID
JOIN prod_web100t.FAC_FACT_LIGNE ON FLT_LIGNE_FACTURE = LI_OID
JOIN w_ART_ARTICLES ON FLT_ARTICLE = ART_OID
LEFT JOIN activite[PX].t_medecins_administratifs ON FLT_INTERVENANT = code_original
LEFT JOIN w_FAC_B2_TIER ON LI_LIGNE_SOURCE = B2T_LIGNE
WHERE (FLT_IS_ETS = 0 OR LI_TYPE_B2 = '4') AND FLT_RECAP <> 0
GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,FLT_DATE_DEBUT;
-- Impayés
INSERT INTO w_factures_lignes_h
SELECT
FLT_LIGNE_FACTURE,
w_factures.no_facture,
w_factures.oid AS facture_id,
date_vente,
lieu_sortie_id AS lieu_id,
1::numeric AS origine_facturation_id,
COALESCE(t_medecins_administratifs.oid,0) AS medecin_facture_id,
COALESCE(t_medecins_administratifs.oid,0) AS medecin_comptabilise_id,
acte_id,
ART_CODE_PHASE AS phase_ccam,
ART_CODE_ACTIVITE 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,
rubrique_facturation_id,
rubrique_facturation_id AS rubrique_comptabilisation_id,
prestation_id,
0::bigint AS protocole_id,
0::bigint AS compte_produit_id,
date(MIN(FLT_DATE_DEBUT)) AS date_debut,
date(MAX(FLT_DATE_FIN)) AS date_fin,
date_part('hour', FLT_DATE_DEBUT)*10000 + date_part('minute', FLT_DATE_DEBUT)*100 + date_part('second', FLT_DATE_DEBUT) AS heure_debut,
MAX(COALESCE(B2T_PU,FLT_TOTAL_TTC)) AS prix_unitaire,
0 AS nb_rubrique,
0 AS nb_prestation,
MAX(COALESCE(B2T_QUANTITE,1)) AS coefficient,
1::numeric AS coefficient_mco,
MAX(COALESCE(B2T_TAUX_CLI,0)) AS taux_0,
MAX(COALESCE(B2T_TAUX_AMO,0)) AS taux_1,
MAX(COALESCE(B2T_TAUX_AMC,0)) AS taux_2,
MAX(COALESCE(B2T_TAUX_AMD,0)) AS taux_22,
0 AS montant_facture,
0 AS montant_depassement,
0 AS montant_facture_0,
0 AS montant_facture_1,
0 AS montant_facture_2,
0::numeric AS montant_facture_22,
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,
SUM(FLT_TOTAL_IMPAYE_HON) AS montant_comptabilise,
SUM(FLT_TOTAL_IMPAYE_HON_CLI) AS montant_comptabilise_0,
SUM(FLT_TOTAL_IMPAYE_HON_AMO) AS montant_comptabilise_1,
SUM(FLT_TOTAL_IMPAYE_HON_AMC) AS montant_comptabilise_2,
SUM(FLT_TOTAL_IMPAYE_HON_AMD) AS montant_comptabilise_22,
0::numeric AS montant_comptabilise_budget_global_1,
0::numeric AS montant_encours,
0::numeric AS montant_encours_0,
0::numeric AS montant_encours_1,
0::numeric AS montant_encours_2,
0::numeric AS montant_encours_22,
MAX(CASE WHEN FT_TYPE_TIER = 'CLI' THEN FLT_OID ELSE 0 END) AS FLT_OID_0,
MAX(CASE WHEN FT_TYPE_TIER = 'AMO' THEN FLT_OID ELSE 0 END) AS FLT_OID_1,
MAX(CASE WHEN FT_TYPE_TIER = 'AMC' THEN FLT_OID ELSE 0 END) AS FLT_OID_2,
MAX(CASE WHEN FT_TYPE_TIER = 'AMD' THEN FLT_OID ELSE 0 END) AS FLT_OID_22
FROM prod_web100t.FAC_FACT_LIGNE_TIER
JOIN w_FAC_FACT_LIGNE_TIER_IMPAYE ON FLT_OID = FLT_IMPAYE_OID
JOIN w_factures ON FLT_FACTURE = FACT_OID AND IMPAYE = w_FAC_FACT_LIGNE_TIER_IMPAYE.FI_COMPTA
JOIN prod_web100t.FAC_FACT_TIER ON FLT_FACTURE_TIER = FT_OID
JOIN prod_web100t.FAC_FACT_LIGNE ON FLT_LIGNE_FACTURE = LI_OID
JOIN w_ART_ARTICLES ON FLT_ARTICLE = ART_OID
LEFT JOIN activite[PX].t_medecins_administratifs ON FLT_INTERVENANT = code_original
LEFT JOIN w_FAC_B2_TIER ON LI_LIGNE_SOURCE = B2T_LIGNE
WHERE (FLT_IS_ETS = 0 OR LI_TYPE_B2 = '4') AND FLT_RECAP <> 0
GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,FLT_DATE_DEBUT;
-- Actes honoraires comptabilisés en clinique, recherche véritable exécutant d'après les prestations
DROP TABLE IF EXISTS w_DAT_PRESTATIONS_GAP;
CREATE TEMP TABLE w_DAT_PRESTATIONS_GAP AS
SELECT PREST_DA, PREST_DATE_DEBUT, PREST_DATE_FIN, PREST_CODE, PREST_ARTICLE, MAX(PREST_EXECUTANT) AS PREST_EXECUTANT
FROM prod_web100t.DAT_PRESTATIONS_GAP
WHERE PREST_EXECUTANT <> 0 AND PREST_DELETED = 0
GROUP BY 1,2,3,4,5;
DROP TABLE IF EXISTS w_FAC_FACT_LIGNE_TIER_EXEC;
CREATE TEMP TABLE w_FAC_FACT_LIGNE_TIER_EXEC AS
SELECT FLT_OID,
MAX(COALESCE(w_DAT_PRESTATIONS_GAP_1.PREST_EXECUTANT,w_DAT_PRESTATIONS_GAP_2.PREST_EXECUTANT,FLT_INTERVENANT)) AS FLT_INTERVENANT
FROM prod_web100t.FAC_FACT_LIGNE_TIER
JOIN prod_web100t.FAC_FACTURE ON FLT_FACTURE = FACT_OID
JOIN prod_web100t.FAC_FACT_TIER ON FLT_FACTURE_TIER = FT_OID
JOIN prod_web100t.FAC_FACT_LIGNE ON FLT_LIGNE_FACTURE = LI_OID
JOIN prod_web100t.DAT_DA ON FT_DA = DA_OID
LEFT JOIN w_DAT_PRESTATIONS_GAP w_DAT_PRESTATIONS_GAP_1 ON
w_DAT_PRESTATIONS_GAP_1.PREST_DA = FT_DA AND
(date(FLT_DATE_DEBUT) = date(w_DAT_PRESTATIONS_GAP_1.PREST_DATE_DEBUT) OR
date(FLT_DATE_FIN) = date(w_DAT_PRESTATIONS_GAP_1.PREST_DATE_FIN)
) AND
(FLT_ARTICLE = w_DAT_PRESTATIONS_GAP_1.PREST_ARTICLE OR FLT_CODE_PREST = PREST_CODE)
LEFT JOIN w_DAT_PRESTATIONS_GAP w_DAT_PRESTATIONS_GAP_2 ON
w_DAT_PRESTATIONS_GAP_2.PREST_DA = FT_DA AND
(FLT_ARTICLE = w_DAT_PRESTATIONS_GAP_2.PREST_ARTICLE OR FLT_CODE_PREST = w_DAT_PRESTATIONS_GAP_2.PREST_CODE)
WHERE FLT_IS_ETS = 1 AND LI_TYPE_B2 = '4' AND FLT_RECAP <> 0
GROUP BY 1;
UPDATE w_factures_lignes_h SET
medecin_facture_id = t_medecins_administratifs.oid,
medecin_comptabilise_id = t_medecins_administratifs.oid
FROM w_FAC_FACT_LIGNE_TIER_EXEC
JOIN activite[PX].t_medecins_administratifs ON FLT_INTERVENANT = code_original
WHERE w_factures_lignes_h.FLT_OID_0 = w_FAC_FACT_LIGNE_TIER_EXEC.FLT_OID AND
medecin_facture_id IS DISTINCT FROM t_medecins_administratifs.oid;
UPDATE w_factures_lignes_h SET
medecin_facture_id = t_medecins_administratifs.oid,
medecin_comptabilise_id = t_medecins_administratifs.oid
FROM w_FAC_FACT_LIGNE_TIER_EXEC
JOIN activite[PX].t_medecins_administratifs ON FLT_INTERVENANT = code_original
WHERE w_factures_lignes_h.FLT_OID_1 = w_FAC_FACT_LIGNE_TIER_EXEC.FLT_OID AND
medecin_facture_id IS DISTINCT FROM t_medecins_administratifs.oid;
UPDATE w_factures_lignes_h SET
medecin_facture_id = t_medecins_administratifs.oid,
medecin_comptabilise_id = t_medecins_administratifs.oid
FROM w_FAC_FACT_LIGNE_TIER_EXEC
JOIN activite[PX].t_medecins_administratifs ON FLT_INTERVENANT = code_original
WHERE w_factures_lignes_h.FLT_OID_2 = w_FAC_FACT_LIGNE_TIER_EXEC.FLT_OID AND
medecin_facture_id IS DISTINCT FROM t_medecins_administratifs.oid;
UPDATE w_factures_lignes_h SET
medecin_facture_id = t_medecins_administratifs.oid,
medecin_comptabilise_id = t_medecins_administratifs.oid
FROM w_FAC_FACT_LIGNE_TIER_EXEC
JOIN activite[PX].t_medecins_administratifs ON FLT_INTERVENANT = code_original
WHERE w_factures_lignes_h.FLT_OID_22 = w_FAC_FACT_LIGNE_TIER_EXEC.FLT_OID AND
medecin_facture_id IS DISTINCT FROM t_medecins_administratifs.oid;
-- Correction de taux bizarres
UPDATE w_factures_lignes_h SET
taux_0 = CASE WHEN taux_0 > 100 THEN 100 WHEN taux_0 < -100 THEN -100 ELSE taux_0 END,
taux_1 = CASE WHEN taux_1 > 100 THEN 100 WHEN taux_1 < -100 THEN -100 ELSE taux_1 END,
taux_2 = CASE WHEN taux_2 > 100 THEN 100 WHEN taux_2 < -100 THEN -100 ELSE taux_2 END,
taux_22 = CASE WHEN taux_22 > 100 THEN 100 WHEN taux_22 < -100 THEN -100 ELSE taux_22 END
WHERE
taux_0 > 100 OR
taux_1 > 100 OR
taux_2 > 100 OR
taux_22 > 100 OR
taux_0 < -100 OR
taux_1 < -100 OR
taux_2 < -100 OR
taux_22 < -100
;
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_h_1');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_h_2');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_h_3');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_h_4');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_h_5');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_h_6');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_h_7');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_h_8');
SELECT base.cti_disable_index('activite[PX]', 'i_factures_lignes_h_9');
INSERT INTO activite[PX].p_factures_lignes_h(
no_facture,
facture_id,
lieu_id,
medecin_facture_id,
medecin_comptabilise_id,
acte_id,
phase_ccam,
activite_ccam,
extension_ccam,
modificateur_ccam_1,
modificateur_ccam_2,
modificateur_ccam_3,
modificateur_ccam_4,
rubrique_facturation_id,
rubrique_comptabilisation_id,
prestation_id,
protocole_id,
date_debut,
date_fin,
heure_debut,
prix_unitaire,
nb_rubrique,
nb_prestation,
coefficient,
coefficient_mco,
taux_0,
taux_1,
taux_2,
taux_22,
montant_facture,
montant_depassement,
montant_facture_0,
montant_facture_1,
montant_facture_2,
montant_facture_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,
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
)
SELECT
no_facture,
facture_id,
lieu_id,
medecin_facture_id,
medecin_comptabilise_id,
acte_id,
phase_ccam,
activite_ccam,
extension_ccam,
modificateur_ccam_1,
modificateur_ccam_2,
modificateur_ccam_3,
modificateur_ccam_4,
rubrique_facturation_id,
rubrique_facturation_id AS rubrique_comptabilisation_id,
prestation_id,
protocole_id,
date_debut,
date_fin,
heure_debut,
prix_unitaire,
nb_rubrique,
nb_prestation,
coefficient,
coefficient_mco,
taux_0,
taux_1,
taux_2,
taux_22,
montant_facture,
montant_depassement,
montant_facture_0,
montant_facture_1,
montant_facture_2,
montant_facture_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,
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
FROM w_factures_lignes_h;
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');
]]>
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;
INSERT INTO activite[PX].p_factures_soldes_h(
no_facture,
facture_id,
date_comptable,
medecin_comptabilise_id,
od_non_comptabilise,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
montant_regle,
montant_regle_0,
montant_regle_1,
montant_regle_2,
montant_regle_22
)
SELECT
w_factures.no_facture,
w_factures.oid AS facture_id,
date(COALESCE(ECR_DATE,RD_DATE,FR_DATE_ENC)) AS date_comptable,
COALESCE(t_medecins_administratifs.oid,0) AS medecin_comptabilise_id,
CASE
WHEN FR_DATE_DEPOT_GUESS IS NOT NULL AND FR_DATE_ENC IS NULL THEN '1'
WHEN RD_CREATED > ECR_UPDATED_MAX THEN '1'
ELSE '0' END AS od_non_comptabilise,
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,
SUM(RD_MONTANT) As montant_regle,
SUM(CASE WHEN FT_TYPE_TIER = 'CLI' THEN RD_MONTANT ELSE 0 END) AS montant_regle_0,
SUM(CASE WHEN FT_TYPE_TIER = 'AMO' THEN RD_MONTANT ELSE 0 END) AS montant_regle_1,
SUM(CASE WHEN FT_TYPE_TIER = 'AMC' THEN RD_MONTANT ELSE 0 END) AS montant_regle_2,
SUM(CASE WHEN FT_TYPE_TIER = 'AMD' THEN RD_MONTANT ELSE 0 END) AS montant_regle_22
FROM prod_web100t.FAC_RGLMT_DETAILS
JOIN prod_web100t.FAC_REGLEMENTS ON FR_OID = RD_REGLEMENT
JOIN w_factures ON RD_FACTURE = FACT_OID AND IMPAYE = 0
JOIN prod_web100t.FAC_FACT_TIER ON RD_FACT_TIER = FT_OID
JOIN prod_web100t.FAC_FACT_LIGNE_TIER ON RD_FACT_LINE = FLT_OID
LEFT JOIN activite[PX].t_medecins_administratifs ON FLT_INTERVENANT = code_original
LEFT JOIN w_CPT_OP_LINK ON RD_COMPTA = LNK_OPERATION
JOIN w_max_ECR_UPDATED ON 1=1
WHERE RD_ETS = 0 AND FLT_IS_DIRECT = 0
GROUP BY 1,2,3,4,5;
-- Paiements directs comptabilisés
INSERT INTO activite[PX].p_factures_soldes_h(
no_facture,
facture_id,
date_comptable,
medecin_comptabilise_id,
od_non_comptabilise,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
montant_regle,
montant_regle_0,
montant_regle_1,
montant_regle_2,
montant_regle_22
)
SELECT
w_factures.no_facture,
w_factures.oid AS facture_id,
w_factures.date_vente AS date_comptable,
COALESCE(t_medecins_administratifs.oid,0) AS medecin_comptabilise_id,
'0'::text AS od_non_comptabilise,
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,
SUM(FLT_TOTAL_TTC) As montant_regle,
SUM(CASE WHEN FT_TYPE_TIER = 'CLI' THEN FLT_TOTAL_TTC ELSE 0 END) AS montant_regle_0,
SUM(CASE WHEN FT_TYPE_TIER = 'AMO' THEN FLT_TOTAL_TTC ELSE 0 END) AS montant_regle_1,
SUM(CASE WHEN FT_TYPE_TIER = 'AMC' THEN FLT_TOTAL_TTC ELSE 0 END) AS montant_regle_2,
SUM(CASE WHEN FT_TYPE_TIER = 'AMD' THEN FLT_TOTAL_TTC ELSE 0 END) AS montant_regle_22
FROM prod_web100t.FAC_FACT_LIGNE_TIER
JOIN w_factures ON FLT_FACTURE = FACT_OID AND IMPAYE = 0
JOIN prod_web100t.FAC_FACT_TIER ON FLT_FACTURE_TIER = FT_OID
LEFT JOIN activite[PX].t_medecins_administratifs ON FLT_INTERVENANT = code_original
WHERE FLT_IS_ETS = 0 AND FLT_IS_DIRECT = -1
GROUP BY 1,2,3,4,5;
-- Solder les factures soldées par une facture d'impayé
INSERT INTO activite[PX].p_factures_soldes_h(
no_facture,
facture_id,
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,
od_non_comptabilise
)
SELECT
p_factures_soldes_h.no_facture,
p_factures_soldes_h.facture_id,
p_factures_soldes_h.date_comptable,
p_factures_soldes_h.medecin_comptabilise_id,
p_factures_soldes_h.rubrique_comptabilisee_id,
p_factures_soldes_h.prestation_id,
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,
p_factures_soldes_h.montant_comptabilise AS montant_regle,
p_factures_soldes_h.montant_comptabilise_0 AS montant_regle_0,
p_factures_soldes_h.montant_comptabilise_1 AS montant_regle_1,
p_factures_soldes_h.montant_comptabilise_2 AS montant_regle_2,
p_factures_soldes_h.montant_comptabilise_22 AS montant_regle_22,
'1'::text AS od_non_comptabilise
FROM activite[PX].p_factures_soldes_h
JOIN activite[PX].p_factures ON split_part(p_factures_soldes_h.no_facture,'-IM',1) = p_factures.no_facture
WHERE p_factures_soldes_h.no_facture LIKE '%-IM%' AND p_factures_soldes_h.montant_comptabilise <> 0
;
INSERT INTO activite[PX].p_factures_soldes_h(
no_facture,
facture_id,
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,
od_non_comptabilise
)
SELECT
p_factures.no_facture,
p_factures.oid AS facture_id,
p_factures_soldes_h.date_comptable,
p_factures_soldes_h.medecin_comptabilise_id,
p_factures_soldes_h.rubrique_comptabilisee_id,
p_factures_soldes_h.prestation_id,
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-p_factures_soldes_h.montant_comptabilise AS montant_regle,
0-p_factures_soldes_h.montant_comptabilise_0 AS montant_regle_0,
0-p_factures_soldes_h.montant_comptabilise_1 AS montant_regle_1,
0-p_factures_soldes_h.montant_comptabilise_2 AS montant_regle_2,
0-p_factures_soldes_h.montant_comptabilise_22 AS montant_regle_22,
'1'::text AS od_non_comptabilise
FROM activite[PX].p_factures_soldes_h
JOIN activite[PX].p_factures ON split_part(p_factures_soldes_h.no_facture,'-IM',1) = p_factures.no_facture
WHERE p_factures_soldes_h.no_facture LIKE '%-IM%' AND montant_comptabilise <> 0
;
DROP TABLE IF EXISTS w_facture_total_impaye;
CREATE TEMP TABLE w_facture_total_impaye AS
SELECT split_part(p_factures.no_facture,'-IM',1) AS impaye_no_facture,
SUM(montant_comptabilise_h) AS impaye_montant_comptabilise_h,
SUM(montant_comptabilise_1_h) AS impaye_montant_comptabilise_1_h,
SUM(montant_comptabilise_2_h) AS impaye_montant_comptabilise_2_h,
SUM(montant_comptabilise_22_h) AS impaye_montant_comptabilise_22_h,
SUM(montant_comptabilise_0_h) AS impaye_montant_comptabilise_0_h
FROM activite[PX].p_factures
WHERE no_facture LIKE '%-IM%' AND montant_comptabilise_h <> 0
GROUP BY 1
;
UPDATE activite[PX].p_factures SET
montant_regle_h = montant_regle_h - impaye_montant_comptabilise_h,
montant_regle_1_h = montant_regle_1_h - impaye_montant_comptabilise_1_h,
montant_regle_2_h = montant_regle_2_h - impaye_montant_comptabilise_2_h,
montant_regle_22_h = montant_regle_22_h - impaye_montant_comptabilise_22_h,
montant_regle_0_h = montant_regle_0_h - impaye_montant_comptabilise_0_h
FROM w_facture_total_impaye
WHERE p_factures.no_facture = impaye_no_facture
;
UPDATE activite[PX].p_factures SET
montant_regle_h = montant_regle_h + montant_comptabilise_h,
montant_regle_1_h = montant_regle_1_h + montant_comptabilise_1_h,
montant_regle_2_h = montant_regle_2_h + montant_comptabilise_2_h,
montant_regle_22_h = montant_regle_22_h + montant_comptabilise_22_h,
montant_regle_0_h = montant_regle_0_h + montant_comptabilise_0_h
FROM w_facture_total_impaye
WHERE p_factures.no_facture LIKE '%-IM%' AND
split_part(p_factures.no_facture,'-IM',1) = w_facture_total_impaye.impaye_no_facture
;
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');
]]>
0 AND
p_sejours.ghm_id <= 0 AND
t_ghm_pmsi.code NOT LIKE '90%' AND
t_ghm_pmsi.code NOT LIKE '99%'
;
ANALYSE activite[PX].p_sejours;
ANALYSE activite[PX].p_factures;
ANALYSE activite[PX].p_factures_lignes_c;
-- Ajout des prestations PMSI aux prestations activité
INSERT INTO activite[PX].t_rubriques_facturation(code_original, code, texte, texte_court)
SELECT
t_prestations_pmsi.code,
t_prestations_pmsi.code,
t_prestations_pmsi.texte,
t_prestations_pmsi.texte
FROM pmsi.p_rsf_detail
JOIN pmsi.p_rss ON p_rss.oid = p_rsf_detail.rss_id AND p_rss.etat = '' AND p_rss.en_cours = '0'
JOIN pmsi.t_prestations t_prestations_pmsi ON t_prestations_pmsi.oid = p_rsf_detail.prestation_id
JOIN base.t_finess ON p_rss.finess = t_finess.code AND t_finess.type_etablissement <> '1'
JOIN activite[PX].p_sejours on no_sejour_administratif = p_sejours.no_sejour AND p_sejours.est_budget_global = '1'
LEFT JOIN activite[PX].t_rubriques_facturation ON t_rubriques_facturation.code = t_prestations_pmsi.code
WHERE est_ligne_rss = '1' AND p_rss.en_cours = '0' AND
operation_lamda IS DISTINCT FROM '1' AND
operation_lamda IS DISTINCT FROM '2' AND
t_rubriques_facturation.oid IS NULL
GROUP BY 1,2,3,4;
-- Ajout des prestations PMSI aux rubriques activité
INSERT INTO activite.t_prestations(code_original, code, texte, texte_court)
SELECT
t_prestations_pmsi.code,
t_prestations_pmsi.code,
t_prestations_pmsi.texte,
t_prestations_pmsi.texte
FROM pmsi.p_rsf_detail
JOIN pmsi.p_rss ON p_rss.oid = p_rsf_detail.rss_id AND p_rss.etat = '' AND p_rss.en_cours = '0'
JOIN pmsi.t_prestations t_prestations_pmsi ON t_prestations_pmsi.oid = p_rsf_detail.prestation_id
JOIN base.t_finess ON p_rss.finess = t_finess.code AND t_finess.type_etablissement <> '1'
JOIN activite[PX].p_sejours on no_sejour_administratif = p_sejours.no_sejour AND p_sejours.est_budget_global = '1'
LEFT JOIN activite.t_prestations t_prestations_activite ON t_prestations_activite.code = t_prestations_pmsi.code
WHERE est_ligne_rss = '1' AND p_rss.en_cours = '0' AND
operation_lamda IS DISTINCT FROM '1' AND
operation_lamda IS DISTINCT FROM '2' AND
t_prestations_activite.oid IS NULL
GROUP BY 1,2,3,4;
-- Lignes PMSI à ajouter
DROP TABLE IF EXISTS w_factures_lignes_pmsi;
CREATE TEMP TABLE w_factures_lignes_pmsi AS
SELECT
p_sejours.no_sejour,
p_sejours.oid AS sejour_id,
p_sejours.no_sejour || '.BG' AS no_facture,
0::bigint AS facture_id,
CASE WHEN p_rsf_detail.type = 'C' THEN 'H' ELSE 'C' END AS clinique_honoraire,
p_rsf_detail.date_debut,
CASE WHEN p_sejours.type_sejour <> '5' THEN p_rsf_detail.date_fin ELSE p_rsf_detail.date_debut END AS date_fin,
p_rsf_detail.nombre AS nb_rubrique,
p_rsf_detail.nombre AS nb_prestation,
p_rsf_detail.coefficient AS coefficient,
p_rsf_detail.coefficient_mco,
COALESCE(t_rubriques_facturation.oid,0::bigint) AS rubrique_facturation_id,
COALESCE(t_rubriques_facturation.oid,0::bigint) AS rubrique_comptabilisation_id,
COALESCE(t_prestations_activite.oid,0::bigint) AS prestation_id,
CASE WHEN p_rss.traitement_epmsi IN ('30','31','32','33') THEN p_rsf_detail.sejour_remboursable ELSE 0 END AS montant_facture,
0::numeric AS montant_facture_0,
CASE WHEN p_rss.traitement_epmsi IN ('30','31','32','33') THEN p_rsf_detail.sejour_remboursable ELSE 0 END AS montant_facture_1,
0::numeric AS montant_facture_2,
0::numeric AS montant_facture_22,
0::numeric AS taux_0,
p_rsf_detail.taux_remboursement AS taux_1,
0::numeric AS taux_2,
0::numeric AS taux_22,
p_rsf_detail.prix_unitaire,
p_sejours.lieu_sortie_id AS lieu_id,
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_encours,
0::numeric AS montant_encours_0,
0::numeric AS montant_encours_1,
0::numeric AS montant_encours_2,
0::numeric AS montant_encours_22,
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,
CASE WHEN p_rsf_detail.type = 'C' THEN 2::bigint ELSE 1::bigint END AS origine_facturation_id,
CASE WHEN p_rss.traitement_epmsi IN ('30','31','32','33') THEN p_rsf_detail.sejour_remboursable ELSE 0 END AS montant_comptabilise_budget_global_1,
0::numeric AS protocole_id,
0::numeric AS compte_produit_id,
t_prestations_pmsi.code AS prestation_code,
''::text AS uf_code,
''::text AS dmt_code,
''::text AS mt_code
FROM pmsi.p_rsf_detail
JOIN pmsi.p_rss ON p_rss.oid = p_rsf_detail.rss_id AND p_rss.etat = '' AND p_rss.en_cours = '0'
JOIN pmsi.p_rsf_total ON p_rss.oid = p_rsf_total.rss_id AND p_rsf_total.valorise_fides IS DISTINCT FROM 1
JOIN pmsi.t_prestations t_prestations_pmsi ON t_prestations_pmsi.oid = p_rsf_detail.prestation_id
JOIN base.t_finess ON p_rss.finess = t_finess.code AND t_finess.type_etablissement <> '1'
JOIN activite[PX].p_sejour_pmsi ON p_rss.oid = p_sejour_pmsi.rss_id
JOIN activite[PX].p_sejours on p_sejour_pmsi.no_sejour = p_sejours.no_sejour AND p_sejours.est_budget_global = '1'
LEFT JOIN activite.t_prestations t_prestations_activite ON t_prestations_activite.code = t_prestations_pmsi.code
LEFT JOIN activite[PX].t_rubriques_facturation ON t_rubriques_facturation.code = t_prestations_pmsi.code
WHERE est_ligne_rss = '1' AND p_rss.en_cours = '0' AND
p_rss.etat = '' AND
operation_lamda IS DISTINCT FROM '1' AND
operation_lamda IS DISTINCT FROM '2' AND
p_rss.traitement_epmsi NOT IN ('11', '12') ;
-- compte
UPDATE w_factures_lignes_pmsi
SET uf_code = t_unites_fonctionnelles.code,
dmt_code = CASE WHEN t_dmt.oid <> 0 THEN t_dmt.code ELSE '' END,
mt_code = CASE WHEN t_modes_traitement.oid <> 0 THEN CASE WHEN t_modes_traitement.code <> '23' THEN t_modes_traitement.code ELSE '04' END ELSE '' END
FROM activite[PX].t_lieux
JOIN activite[PX].t_unites_fonctionnelles ON unite_fonctionnelle_id = t_unites_fonctionnelles.oid
JOIN activite[PX].t_services_facturation On service_facturation_id = t_services_facturation.oid
JOIN base.t_dmt ON dmt_id = t_dmt.oid
JOIN base.t_modes_traitement ON t_services_facturation.mode_traitement_id = t_modes_traitement.oid
WHERE lieu_id = t_lieux.oid;
DROP TABLE IF EXISTS w_last_comptes_produits;
CREATE TEMP TABLE w_last_comptes_produits AS
SELECT t_prestations.code AS last_prestation_code,
t_unites_fonctionnelles.code AS last_uf_code,
t_dmt.code AS last_dmt_code,
t_modes_traitement.code AS last_mt_code,
(MAX(ARRAY[date_fin::text,compte_produit_id::text]))[2]::bigint AS last_compte_produit_id
FROM activite[PX].p_factures_lignes_c
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
JOIN activite[PX].t_lieux ON lieu_id = t_lieux.oid
JOIN activite[PX].t_unites_fonctionnelles ON unite_fonctionnelle_id = t_unites_fonctionnelles.oid
JOIN activite[PX].t_services_facturation On service_facturation_id = t_services_facturation.oid
JOIN base.t_dmt ON dmt_id = t_dmt.oid
JOIN base.t_modes_traitement ON t_services_facturation.mode_traitement_id = t_modes_traitement.oid
WHERE compte_produit_id != 0
GROUP BY 1,2,3,4;
UPDATE w_factures_lignes_pmsi
SET compte_produit_id = last_compte_produit_id
FROM w_last_comptes_produits
WHERE compte_produit_id = 0 AND
last_prestation_code = prestation_code AND
last_uf_code = uf_code AND
last_dmt_code = dmt_code AND
last_mt_code = mt_code;
UPDATE w_factures_lignes_pmsi
SET compte_produit_id = last_compte_produit_id
FROM w_last_comptes_produits
WHERE compte_produit_id = 0 AND
last_prestation_code = prestation_code AND
last_uf_code = uf_code AND
last_dmt_code = '' AND
last_mt_code = mt_code;
UPDATE w_factures_lignes_pmsi
SET compte_produit_id = last_compte_produit_id
FROM w_last_comptes_produits
WHERE compte_produit_id = 0 AND
last_prestation_code = prestation_code AND
last_uf_code = uf_code AND
last_dmt_code = dmt_code AND
last_mt_code = '';
UPDATE w_factures_lignes_pmsi
SET compte_produit_id = last_compte_produit_id
FROM w_last_comptes_produits
WHERE compte_produit_id = 0 AND
last_prestation_code = prestation_code AND
last_uf_code = uf_code AND
last_dmt_code = '' AND
last_mt_code = '';
UPDATE w_factures_lignes_pmsi
SET compte_produit_id = last_compte_produit_id
FROM w_last_comptes_produits
WHERE compte_produit_id = 0 AND
last_prestation_code = prestation_code AND
last_uf_code = '' AND
last_dmt_code = dmt_code AND
last_mt_code = mt_code;
UPDATE w_factures_lignes_pmsi
SET compte_produit_id = last_compte_produit_id
FROM w_last_comptes_produits
WHERE compte_produit_id = 0 AND
last_prestation_code = prestation_code AND
last_uf_code = '' AND
last_dmt_code = '' AND
last_mt_code = mt_code;
UPDATE w_factures_lignes_pmsi
SET compte_produit_id = last_compte_produit_id
FROM w_last_comptes_produits
WHERE compte_produit_id = 0 AND
last_prestation_code = prestation_code AND
last_uf_code = '' AND
last_dmt_code = dmt_code AND
last_mt_code = '';
UPDATE w_factures_lignes_pmsi
SET compte_produit_id = last_compte_produit_id
FROM w_last_comptes_produits
WHERE compte_produit_id = 0 AND
last_prestation_code = prestation_code AND
last_uf_code = '' AND
last_dmt_code = '' AND
last_mt_code = '';
UPDATE w_factures_lignes_pmsi
SET prestation_id = (SELECT oid FROM activite.t_prestations WHERE code = 'UCD')
WHERE prestation_id IN (SELECT oid FROM activite.t_prestations WHERE code = 'PHH')
;
-- Rubriques internes cti
SELECT activite[PX].cti_reorganize_rubrique_facture_c('w_factures_lignes_pmsi');
CREATE INDEX w_factures_lignes_pmsi_i1
ON w_factures_lignes_pmsi
USING btree
(no_sejour);
-- Factures de base
DROP TABLE IF EXISTS w_factures_pmsi_base;
CREATE TEMP TABLE w_factures_pmsi_base AS
SELECT p_factures.no_sejour,
(MAX(Array[CASE WHEN p_factures.code_facture <> '0' THEN p_factures.date_facture ELSE '00010101' END::text,p_factures.no_facture]))[2] AS no_facture_base
FROM pmsi.p_rss
JOIN base.t_finess ON p_rss.finess = t_finess.code AND t_finess.type_etablissement <> '1'
JOIN activite[PX].p_sejour_pmsi ON p_rss.oid = p_sejour_pmsi.rss_id
JOIN activite[PX].p_sejours on p_sejour_pmsi.no_sejour = p_sejours.no_sejour AND p_sejours.est_budget_global = '1'
JOIN activite[PX].p_factures ON p_sejours.no_sejour = p_factures.no_sejour
WHERE p_rss.etat = '' AND
p_rss.en_cours = '0'
GROUP BY 1;
CREATE INDEX w_factures_pmsi_base_i1
ON w_factures_pmsi_base
USING btree
(no_sejour);
CREATE INDEX w_factures_pmsi_base_i2
ON w_factures_pmsi_base
USING btree
(no_facture_base);
-- Factures à créer
DROP TABLE IF EXISTS w_factures_pmsi;
CREATE TEMP TABLE w_factures_pmsi AS
SELECT
w_factures_lignes_pmsi.no_sejour,
w_factures_lignes_pmsi.sejour_id,
w_factures_lignes_pmsi.no_facture,
p_sejours.date_entree AS date_debut,
p_sejours.date_sortie AS date_fin,
'0'::text AS type_facture,
'1'::text AS code_facture,
MAX(CASE
WHEN p_factures_base.date_facture IS NULL THEN p_sejours.date_sortie
WHEN p_factures_base.date_facture <> '20991231' THEN p_factures_base.date_facture
WHEN p_sejours.date_groupage <> '20991231' THEN p_sejours.date_groupage
ELSE p_sejours.date_sortie END)::date AS date_facture,
MAX(COALESCE(p_factures_base.code_vente,'1')) AS code_vente,
MAX(COALESCE(p_factures_base.mois_vente,209912)) AS mois_vente,
MAX(COALESCE(p_factures_base.date_facture,p_sejours.date_sortie)) AS date_solde,
'0'::text AS particularite_t2a,
MAX(COALESCE(p_factures_base.date_vente,p_sejours.date_sortie)) AS date_vente,
''::text AS code_cloture,
MAX(p_sejours.code_cp_demandee) AS code_cp_demandee,
'20991231'::date AS date_encours,
MAX(p_sejours.ghs_id) AS ghs_id,
MAX(p_sejours.ghs_bebe1_id) AS ghs_bebe1_id,
MAX(p_sejours.ghs_bebe2_id) AS ghs_bebe2_id,
MAX(p_sejours.ghs_bebe3_id) AS ghs_bebe3_id,
MAX(p_sejours.ghm_id) AS ghm_id,
SUM(montant_facture) AS montant_facture_c,
0::numeric AS montant_facture_h,
0::numeric AS montant_regle_c,
0::numeric AS montant_regle_h,
0::numeric AS delai_facture,
0::numeric AS delai_solde,
'20991231'::date AS date_expedition,
0::numeric AS delai_expedition,
MAX(p_sejours.tiers_payant_1_id) AS tiers_payant_1_id,
MAX(p_sejours.tiers_payant_2_id) AS tiers_payant_2_id,
MAX(p_sejours.tiers_payant_22_id) AS tiers_payant_22_id,
MAX(p_sejours.tiers_payant_0_id) AS tiers_payant_0_id,
'20991231'::date AS date_solde_0_c,
'20991231'::date AS date_solde_0_h,
'20991231'::date AS date_solde_1_c,
'20991231'::date AS date_solde_1_h,
'20991231'::date AS date_solde_2_c,
'20991231'::date AS date_solde_2_h,
'20991231'::date AS date_solde_22_c,
'20991231'::date AS date_solde_22_h,
'20991231'::date AS date_expedition_0,
'20991231'::date AS date_expedition_1,
'20991231'::date AS date_expedition_2,
'20991231'::date AS date_expedition_22,
'0'::text AS code_expedie_0,
'0'::text AS code_expedie_1,
'0'::text AS code_expedie_2,
'0'::text AS code_expedie_22,
''::text AS no_bordereau_0,
''::text AS no_bordereau_1,
''::text AS no_bordereau_2,
''::text AS no_bordereau_22,
0::numeric AS montant_facture_0_c,
0::numeric AS montant_facture_0_h,
SUM(montant_facture) AS montant_facture_1_c,
0::numeric AS montant_facture_1_h,
0::numeric AS montant_facture_2_c,
0::numeric AS montant_facture_2_h,
0::numeric AS montant_facture_22_c,
0::numeric AS montant_facture_22_h,
0::numeric AS montant_regle_0_c,
0::numeric AS montant_regle_0_h,
0::numeric AS montant_regle_1_c,
0::numeric AS montant_regle_1_h,
0::numeric AS montant_regle_2_c,
0::numeric AS montant_regle_2_h,
0::numeric AS montant_regle_22_c,
0::numeric AS montant_regle_22_h,
0::numeric AS delai_expedition_0,
0::numeric AS delai_expedition_1,
0::numeric AS delai_expedition_2,
0::numeric AS delai_expedition_22,
0::numeric AS delai_solde_0_c,
0::numeric AS delai_solde_0_h,
0::numeric AS delai_solde_1_c,
0::numeric AS delai_solde_1_h,
0::numeric AS delai_solde_2_c,
0::numeric AS delai_solde_2_h,
0::numeric AS delai_solde_22_c,
0::numeric AS delai_solde_22_h,
0::numeric AS montant_encours_c,
0::numeric AS montant_encours_0_c,
0::numeric AS montant_encours_1_c,
0::numeric AS montant_encours_2_c,
0::numeric AS montant_encours_22_c,
0::numeric AS montant_encours_h,
0::numeric AS montant_encours_0_h,
0::numeric AS montant_encours_1_h,
0::numeric AS montant_encours_2_h,
0::numeric AS montant_encours_22_h,
0::numeric AS nb_rejets,
0::numeric AS montant_comptabilise_c,
0::numeric AS montant_comptabilise_h,
0::numeric AS montant_comptabilise_0_c,
0::numeric AS montant_comptabilise_0_h,
0::numeric AS montant_comptabilise_1_c,
0::numeric AS montant_comptabilise_1_h,
0::numeric AS montant_comptabilise_2_c,
0::numeric AS montant_comptabilise_2_h,
0::numeric AS montant_comptabilise_22_c,
0::numeric AS montant_comptabilise_22_h,
w_factures_lignes_pmsi.no_facture AS no_facture_reference,
0::bigint AS facture_reference_id,
'20991231'::date AS date_solde_reference,
'20991231'::date AS date_solde_reference_c,
'20991231'::date AS date_solde_reference_h,
'20991231'::date AS date_solde_reference_0_c,
'20991231'::date AS date_solde_reference_1_c,
'20991231'::date AS date_solde_reference_2_c,
'20991231'::date AS date_solde_reference_22_c,
'20991231'::date AS date_solde_reference_0_h,
'20991231'::date AS date_solde_reference_1_h,
'20991231'::date AS date_solde_reference_2_h,
'20991231'::date AS date_solde_reference_22_h,
'20991231'::date AS date_solde_c,
'20991231'::date AS date_solde_h,
0::numeric AS montant_facture_c_actes_inclus_dans_sejour,
0::numeric AS montant_facture_h_actes_inclus_dans_sejour,
SUM(montant_comptabilise_budget_global_1) AS montant_comptabilise_budget_global_c,
'' AS no_facture_od_avoir,
0::bigint AS facture_od_avoir_id
FROM w_factures_lignes_pmsi
JOIN activite[PX].p_sejours ON w_factures_lignes_pmsi.no_sejour = p_sejours.no_sejour
JOIN w_factures_pmsi_base ON w_factures_lignes_pmsi.no_sejour = w_factures_pmsi_base.no_sejour
LEFT JOIN activite[PX].p_factures p_factures_base ON w_factures_pmsi_base.no_facture_base = p_factures_base.no_facture AND 1 <> 1
GROUP BY 1,2,3,4,5;
INSERT INTO w_factures_pmsi
SELECT
p_sejours.no_sejour,
p_sejours.oid AS sejour_id,
p_sejours.no_sejour || '.BG',
p_sejours.date_entree AS date_debut,
p_sejours.date_sortie AS date_fin,
'0'::text AS type_facture,
'1'::text AS code_facture,
MAX(CASE
WHEN p_sejours.date_groupage <> '20991231' THEN p_sejours.date_groupage
ELSE p_sejours.date_sortie END)::date AS date_facture,
'1' AS code_vente,
209912 AS mois_vente,
'20991231' AS date_solde,
'0'::text AS particularite_t2a,
'20991231' AS date_vente,
''::text AS code_cloture,
MAX(p_sejours.code_cp_demandee) AS code_cp_demandee,
'20991231'::date AS date_encours,
MAX(p_sejours.ghs_id) AS ghs_id,
MAX(p_sejours.ghs_bebe1_id) AS ghs_bebe1_id,
MAX(p_sejours.ghs_bebe2_id) AS ghs_bebe2_id,
MAX(p_sejours.ghs_bebe3_id) AS ghs_bebe3_id,
MAX(p_sejours.ghm_id) AS ghm_id,
0 AS montant_facture_c,
0::numeric AS montant_facture_h,
0::numeric AS montant_regle_c,
0::numeric AS montant_regle_h,
0::numeric AS delai_facture,
0::numeric AS delai_solde,
'20991231'::date AS date_expedition,
0::numeric AS delai_expedition,
MAX(p_sejours.tiers_payant_1_id) AS tiers_payant_1_id,
MAX(p_sejours.tiers_payant_2_id) AS tiers_payant_2_id,
MAX(p_sejours.tiers_payant_22_id) AS tiers_payant_22_id,
MAX(p_sejours.tiers_payant_0_id) AS tiers_payant_0_id,
'20991231'::date AS date_solde_0_c,
'20991231'::date AS date_solde_0_h,
'20991231'::date AS date_solde_1_c,
'20991231'::date AS date_solde_1_h,
'20991231'::date AS date_solde_2_c,
'20991231'::date AS date_solde_2_h,
'20991231'::date AS date_solde_22_c,
'20991231'::date AS date_solde_22_h,
'20991231'::date AS date_expedition_0,
'20991231'::date AS date_expedition_1,
'20991231'::date AS date_expedition_2,
'20991231'::date AS date_expedition_22,
'0'::text AS code_expedie_0,
'0'::text AS code_expedie_1,
'0'::text AS code_expedie_2,
'0'::text AS code_expedie_22,
''::text AS no_bordereau_0,
''::text AS no_bordereau_1,
''::text AS no_bordereau_2,
''::text AS no_bordereau_22,
0::numeric AS montant_facture_0_c,
0::numeric AS montant_facture_0_h,
0::numeric AS montant_facture_1_c,
0::numeric AS montant_facture_1_h,
0::numeric AS montant_facture_2_c,
0::numeric AS montant_facture_2_h,
0::numeric AS montant_facture_22_c,
0::numeric AS montant_facture_22_h,
0::numeric AS montant_regle_0_c,
0::numeric AS montant_regle_0_h,
0::numeric AS montant_regle_1_c,
0::numeric AS montant_regle_1_h,
0::numeric AS montant_regle_2_c,
0::numeric AS montant_regle_2_h,
0::numeric AS montant_regle_22_c,
0::numeric AS montant_regle_22_h,
0::numeric AS delai_expedition_0,
0::numeric AS delai_expedition_1,
0::numeric AS delai_expedition_2,
0::numeric AS delai_expedition_22,
0::numeric AS delai_solde_0_c,
0::numeric AS delai_solde_0_h,
0::numeric AS delai_solde_1_c,
0::numeric AS delai_solde_1_h,
0::numeric AS delai_solde_2_c,
0::numeric AS delai_solde_2_h,
0::numeric AS delai_solde_22_c,
0::numeric AS delai_solde_22_h,
0::numeric AS montant_encours_c,
0::numeric AS montant_encours_0_c,
0::numeric AS montant_encours_1_c,
0::numeric AS montant_encours_2_c,
0::numeric AS montant_encours_22_c,
0::numeric AS montant_encours_h,
0::numeric AS montant_encours_0_h,
0::numeric AS montant_encours_1_h,
0::numeric AS montant_encours_2_h,
0::numeric AS montant_encours_22_h,
0::numeric AS nb_rejets,
0::numeric AS montant_comptabilise_c,
0::numeric AS montant_comptabilise_h,
0::numeric AS montant_comptabilise_0_c,
0::numeric AS montant_comptabilise_0_h,
0::numeric AS montant_comptabilise_1_c,
0::numeric AS montant_comptabilise_1_h,
0::numeric AS montant_comptabilise_2_c,
0::numeric AS montant_comptabilise_2_h,
0::numeric AS montant_comptabilise_22_c,
0::numeric AS montant_comptabilise_22_h,
p_sejours.no_sejour || '.BG' AS no_facture_reference,
0::bigint AS facture_reference_id,
'20991231'::date AS date_solde_reference,
'20991231'::date AS date_solde_reference_c,
'20991231'::date AS date_solde_reference_h,
'20991231'::date AS date_solde_reference_0_c,
'20991231'::date AS date_solde_reference_1_c,
'20991231'::date AS date_solde_reference_2_c,
'20991231'::date AS date_solde_reference_22_c,
'20991231'::date AS date_solde_reference_0_h,
'20991231'::date AS date_solde_reference_1_h,
'20991231'::date AS date_solde_reference_2_h,
'20991231'::date AS date_solde_reference_22_h,
'20991231'::date AS date_solde_c,
'20991231'::date AS date_solde_h,
0::numeric AS montant_facture_c_actes_inclus_dans_sejour,
0::numeric AS montant_facture_h_actes_inclus_dans_sejour,
0::numeric AS montant_comptabilise_budget_global_c,
'' AS no_facture_od_avoir,
0::bigint AS facture_od_avoir_id
FROM pmsi.p_rss
JOIN base.t_finess ON p_rss.finess = t_finess.code AND t_finess.type_etablissement <> '1'
JOIN activite[PX].p_sejours on no_sejour_administratif = p_sejours.no_sejour AND p_sejours.est_budget_global = '1'
LEFT JOIN w_factures_pmsi ON p_sejours.no_sejour = w_factures_pmsi.no_sejour
WHERE p_rss.en_cours = '0' AND
p_rss.etat = '' AND
p_rss.traitement_epmsi NOT IN ('11', '12') AND
w_factures_pmsi.no_facture IS NULL AND
p_sejours.date_sortie >= '[ENV_ADM_ANNEEDEBUT]0101' AND
p_sejours.no_sejour NOT IN
(
SELECT p_factures.no_sejour
FROM activite[PX].p_factures
WHERE montant_facture_1_c <> 0
)
GROUP BY 1,2,3,4,5;
UPDATE w_factures_pmsi
SET date_vente = date_facture, mois_vente = date_part('year',date_facture)*100 + date_part('month',date_facture)
WHERE date_vente = '20991231';
UPDATE w_factures_pmsi
SET date_solde = date_facture
WHERE date_vente IS DISTINCT FROM date_facture;
-- Ajout des factures
INSERT INTO activite[PX].p_factures
(no_sejour, no_facture, date_debut, date_fin, type_facture,
code_facture, date_facture, code_vente, mois_vente, date_solde,
montant_facture_c, montant_facture_h, montant_regle_c, montant_regle_h,
delai_facture, delai_solde, date_expedition, delai_expedition,
tiers_payant_1_id, tiers_payant_2_id, tiers_payant_22_id, tiers_payant_0_id,
date_solde_0_c, date_solde_0_h, date_solde_1_c, date_solde_1_h,
date_solde_2_c, date_solde_2_h, date_solde_22_c, date_solde_22_h,
date_expedition_0, date_expedition_1, date_expedition_2, date_expedition_22,
code_expedie_0, code_expedie_1, code_expedie_2, code_expedie_22,
no_bordereau_0, no_bordereau_1, no_bordereau_2, no_bordereau_22,
montant_facture_0_c, montant_facture_0_h, montant_facture_1_c,
montant_facture_1_h, montant_facture_2_c, montant_facture_2_h,
montant_facture_22_c, montant_facture_22_h, montant_regle_0_c,
montant_regle_0_h, montant_regle_1_c, montant_regle_1_h, montant_regle_2_c,
montant_regle_2_h, montant_regle_22_c, montant_regle_22_h, delai_expedition_0,
delai_expedition_1, delai_expedition_2, delai_expedition_22,
delai_solde_0_c, delai_solde_0_h, delai_solde_1_c, delai_solde_1_h,
delai_solde_2_c, delai_solde_2_h, delai_solde_22_c, delai_solde_22_h,
ghs_id, particularite_t2a, date_vente, code_cloture, 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,
code_cp_demandee, date_encours, ghs_bebe1_id, ghs_bebe2_id, ghs_bebe3_id,
nb_rejets, montant_comptabilise_c, montant_comptabilise_h, montant_comptabilise_0_c,
montant_comptabilise_0_h, montant_comptabilise_1_c, montant_comptabilise_1_h,
montant_comptabilise_2_c, montant_comptabilise_2_h, montant_comptabilise_22_c,
montant_comptabilise_22_h, no_facture_reference, date_solde_reference,
date_solde_reference_c, date_solde_reference_h, date_solde_reference_0_c,
date_solde_reference_1_c, date_solde_reference_2_c, date_solde_reference_22_c,
date_solde_reference_0_h, date_solde_reference_1_h, date_solde_reference_2_h,
date_solde_reference_22_h, date_solde_c, date_solde_h, montant_facture_c_actes_inclus_dans_sejour,
montant_facture_h_actes_inclus_dans_sejour, montant_comptabilise_budget_global_c,
no_facture_od_avoir, sejour_id, facture_reference_id, facture_od_avoir_id,
ghm_id)
SELECt no_sejour, no_facture, date_debut, date_fin, type_facture,
code_facture, date_facture, code_vente, mois_vente, date_solde,
montant_facture_c, montant_facture_h, montant_regle_c, montant_regle_h,
delai_facture, delai_solde, date_expedition, delai_expedition,
tiers_payant_1_id, tiers_payant_2_id, tiers_payant_22_id, tiers_payant_0_id,
date_solde_0_c, date_solde_0_h, date_solde_1_c, date_solde_1_h,
date_solde_2_c, date_solde_2_h, date_solde_22_c, date_solde_22_h,
date_expedition_0, date_expedition_1, date_expedition_2, date_expedition_22,
code_expedie_0, code_expedie_1, code_expedie_2, code_expedie_22,
no_bordereau_0, no_bordereau_1, no_bordereau_2, no_bordereau_22,
montant_facture_0_c, montant_facture_0_h, montant_facture_1_c,
montant_facture_1_h, montant_facture_2_c, montant_facture_2_h,
montant_facture_22_c, montant_facture_22_h, montant_regle_0_c,
montant_regle_0_h, montant_regle_1_c, montant_regle_1_h, montant_regle_2_c,
montant_regle_2_h, montant_regle_22_c, montant_regle_22_h, delai_expedition_0,
delai_expedition_1, delai_expedition_2, delai_expedition_22,
delai_solde_0_c, delai_solde_0_h, delai_solde_1_c, delai_solde_1_h,
delai_solde_2_c, delai_solde_2_h, delai_solde_22_c, delai_solde_22_h,
ghs_id, particularite_t2a, date_vente, code_cloture, 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,
code_cp_demandee, date_encours, ghs_bebe1_id, ghs_bebe2_id, ghs_bebe3_id,
nb_rejets, montant_comptabilise_c, montant_comptabilise_h, montant_comptabilise_0_c,
montant_comptabilise_0_h, montant_comptabilise_1_c, montant_comptabilise_1_h,
montant_comptabilise_2_c, montant_comptabilise_2_h, montant_comptabilise_22_c,
montant_comptabilise_22_h, no_facture_reference, date_solde_reference,
date_solde_reference_c, date_solde_reference_h, date_solde_reference_0_c,
date_solde_reference_1_c, date_solde_reference_2_c, date_solde_reference_22_c,
date_solde_reference_0_h, date_solde_reference_1_h, date_solde_reference_2_h,
date_solde_reference_22_h, date_solde_c, date_solde_h, montant_facture_c_actes_inclus_dans_sejour,
montant_facture_h_actes_inclus_dans_sejour, montant_comptabilise_budget_global_c,
no_facture_od_avoir, sejour_id, facture_reference_id, facture_od_avoir_id,
ghm_id
FROM w_factures_pmsi;
-- Ajout des lignes
INSERT INTO activite[PX].p_factures_lignes_c(
no_facture, date_debut, date_fin, nb_rubrique, coefficient, coefficient_mco,
rubrique_facturation_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, rubrique_comptabilisation_id,
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, protocole_id, compte_produit_id)
SELECT
p_factures.no_facture, w_factures_lignes_pmsi.date_debut, w_factures_lignes_pmsi.date_fin, nb_rubrique, coefficient, coefficient_mco,
rubrique_facturation_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, rubrique_comptabilisation_id,
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,
p_factures.oid AS facture_id, protocole_id, compte_produit_id
FROM w_factures_lignes_pmsi
JOIN activite[PX].p_factures ON w_factures_lignes_pmsi.no_facture = p_factures.no_facture ;
-- En cours PMSI public
INSERT INTO activite[PX].p_factures(
sejour_id,
no_sejour,
no_facture,
no_facture_reference,
date_debut,
date_fin,
type_facture,
code_facture,
date_facture,
tiers_payant_0_id,
tiers_payant_1_id,
tiers_payant_2_id,
tiers_payant_22_id,
ghs_id,
ghs_bebe1_id,
ghs_bebe2_id,
ghs_bebe3_id)
SELECT
p_sejours.oid,
p_sejours.no_sejour,
MAX(p_sejours.no_sejour || '.BG'),
MAX(p_sejours.no_sejour || '.BG'),
MAX(p_sejours.date_entree),
MAX(p_sejours.date_sortie),
'0',
'0',
'20991231'::date,
MAX(p_sejours.tiers_payant_0_id),
MAX(p_sejours.tiers_payant_1_id),
MAX(p_sejours.tiers_payant_2_id),
MAX(p_sejours.tiers_payant_22_id),
MAX(p_sejours.ghs_id),
MAX(p_sejours.ghs_bebe1_id),
MAX(p_sejours.ghs_bebe2_id),
MAX(p_sejours.ghs_bebe3_id)
FROM pmsi.p_rss
JOIN base.t_finess ON p_rss.finess = t_finess.code AND t_finess.type_etablissement <> '1'
JOIN activite[PX].p_sejours on no_sejour_administratif = p_sejours.no_sejour AND p_sejours.est_budget_global = '1'
LEFT JOIN activite[PX].p_factures ON p_sejours.no_sejour = p_factures.no_sejour AND p_factures.no_facture LIKE '%BG'
WHERE p_rss.en_cours = '1' AND p_factures.no_facture IS NULL AND
p_sejours.type_sejour IN ('1','2','5')
GROUP BY 1,2;
-- Sejours BG PMSi qui ne sont pas dans les RSS
INSERT INTO activite[PX].p_factures(
sejour_id,
no_sejour,
no_facture,
no_facture_reference,
date_debut,
date_fin,
type_facture,
code_facture,
date_facture,
tiers_payant_0_id,
tiers_payant_1_id,
tiers_payant_2_id,
tiers_payant_22_id,
ghs_id,
ghs_bebe1_id,
ghs_bebe2_id,
ghs_bebe3_id)
SELECT p_sejours.oid,
p_sejours.no_sejour,
p_sejours.no_sejour || '.BG',
p_sejours.no_sejour || '.BG',
p_sejours.date_entree,
p_sejours.date_sortie,
'0',
'0',
'20991231'::date,
p_sejours.tiers_payant_0_id,
p_sejours.tiers_payant_1_id,
p_sejours.tiers_payant_2_id,
p_sejours.tiers_payant_22_id,
p_sejours.ghs_id,
p_sejours.ghs_bebe1_id,
p_sejours.ghs_bebe2_id,
p_sejours.ghs_bebe3_id
FROM activite[PX].p_sejours
JOIN activite[PX].t_lieux ON lieu_sortie_id = t_lieux.oid
JOIN activite[PX].t_services_facturation ON service_facturation_id = t_services_facturation.oid
WHERE p_sejours.est_budget_global = '1' AND
p_sejours.type_sejour IN ('1','2','5') AND
type_t2a = '1' AND
date_sortie between date(date_trunc('year',now() - interval '1 year')) AND now() AND
code_sorti = '1' AND
no_sejour NOT IN (SELECt no_sejour FROm activite[PX].p_factures where no_facture like '%BG') AND
no_sejour NOT IN (
SELECT p_factures.no_sejour
FROM activite[PX].p_factures_lignes_c
JOIN activite[PX].p_factures ON p_factures_lignes_c.no_facture = p_factures.no_facture
JOIN activite[PX].p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
WHERE p_sejours.est_budget_global = '1' AND
p_factures_lignes_c.no_facture NOT LIKE '%BG' AND
code_facture = '1' AND
(t_prestations.code = 'PJ' OR t_prestations.code LIKE 'GHS%') AND
(taux_1 = 100 OR taux_2 = 100 OR taux_0 = 100)
GROUP BY 1
HAVING SUM(montant_facture_1+montant_facture_0+montant_facture_2) > 0
);
-- Séances pour séjour présents
INSERT INTO activite[PX].p_factures(
sejour_id,
no_sejour,
no_facture,
no_facture_reference,
date_debut,
date_fin,
type_facture,
code_facture,
date_facture,
tiers_payant_0_id,
tiers_payant_1_id,
tiers_payant_2_id,
tiers_payant_22_id,
ghs_id,
ghs_bebe1_id,
ghs_bebe2_id,
ghs_bebe3_id)
SELECT p_sejours.oid,
p_sejours.no_sejour,
p_sejours.no_sejour || '.BG',
p_sejours.no_sejour || '.BG',
p_sejours.date_entree,
date(date_trunc('month',now()) + interval '1 month' - interval '1 day'),
'0',
'0',
'20991231'::date,
p_sejours.tiers_payant_0_id,
p_sejours.tiers_payant_1_id,
p_sejours.tiers_payant_2_id,
p_sejours.tiers_payant_22_id,
p_sejours.ghs_id,
p_sejours.ghs_bebe1_id,
p_sejours.ghs_bebe2_id,
p_sejours.ghs_bebe3_id
FROM activite[PX].p_sejours
JOIN activite[PX].t_lieux ON lieu_sortie_id = t_lieux.oid
JOIN activite[PX].t_services_facturation ON service_facturation_id = t_services_facturation.oid
WHERE p_sejours.est_budget_global = '1' AND
type_t2a = '1' AND
date_entree between date(date_trunc('year',now() - interval '1 year')) AND now() AND
p_sejours.type_sejour IN ('5') AND
code_sorti <> '1' AND
no_sejour NOT IN (SELECt no_sejour FROm activite[PX].p_factures where no_facture like '%BG') AND
no_sejour NOT IN (
SELECT p_factures.no_sejour
FROM activite[PX].p_factures_lignes_c
JOIN activite[PX].p_factures ON p_factures_lignes_c.no_facture = p_factures.no_facture
JOIN activite[PX].p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
WHERE p_sejours.est_budget_global = '1' AND
code_facture = '1' AND
t_prestations.code = 'PJ' AND
(taux_2 = 100 OR taux_0 = 100)
GROUP BY 1
HAVING SUM(montant_facture_0+montant_facture_2) > 0
);
-- Il peut y avoir des lignes en double avec la récupération standard
DELETE FROM activite[PX].p_factures_lignes_non_facturees_c
USING
(
SELECT no_sejour, prestation_id,
p_factures_lignes_non_facturees_c.date_debut,
p_factures_lignes_non_facturees_c.date_fin,
p_factures_lignes_non_facturees_c.prix_unitaire,
MAX(CASE WHEN p_factures.no_facture NOT LIKE '%.BG' THEN p_factures_lignes_non_facturees_c.no_facture ELSE NULL END) AS no_facture
FROm activite[PX].p_factures_lignes_non_facturees_c
JOIN activite[PX].p_factures ON p_factures_lignes_non_facturees_c.no_facture = p_factures.no_facture
GROUP BY 1,2,3,4,5
HAVING count(DISTINCT p_factures.no_facture) > 1 AND
MAX(CASE WHEN p_factures.no_facture LIKE '%.BG' THEN 1 ELSE 0 END) = 1 AND
MIN(CASE WHEN p_factures.no_facture LIKE '%.BG' THEN 1 ELSE 0 END) = 0
) subview
WHERE p_factures_lignes_non_facturees_c.no_facture = subview.no_facture AND
p_factures_lignes_non_facturees_c.prestation_id = subview.prestation_id AND
p_factures_lignes_non_facturees_c.date_debut = subview.date_debut AND
p_factures_lignes_non_facturees_c.date_fin = subview.date_fin AND
p_factures_lignes_non_facturees_c.prix_unitaire = subview.prix_unitaire
;
-- Ou des lignes en double avec la facturation
DELETE FROM activite[PX].p_factures_lignes_non_facturees_c
USING
(
SELECT no_sejour, prestation_id,
p_factures_lignes_non_facturees_c.date_debut,
p_factures_lignes_non_facturees_c.date_fin,
p_factures_lignes_non_facturees_c.prix_unitaire,
MAX(CASE WHEN p_factures.no_facture NOT LIKE '%.BG' THEN p_factures_lignes_non_facturees_c.no_facture ELSE NULL END) AS no_facture
FROm activite[PX].p_factures_lignes_non_facturees_c
JOIN activite[PX].p_factures ON p_factures_lignes_non_facturees_c.no_facture = p_factures.no_facture
GROUP BY 1,2,3,4,5
) subview
JOIN
(
SELECT no_sejour, prestation_id,
p_factures_lignes_c.date_debut,
p_factures_lignes_c.date_fin,
p_factures_lignes_c.prix_unitaire,
p_factures.no_facture
FROm activite[PX].p_factures_lignes_c
JOIN activite[PX].p_factures ON p_factures_lignes_c.no_facture = p_factures.no_facture
GROUP BY 1,2,3,4,5,6
) subview2
ON subview2.prestation_id = subview.prestation_id AND
subview2.date_debut = subview.date_debut AND
subview2.date_fin = subview.date_fin AND
subview2.prix_unitaire = subview.prix_unitaire
WHERE p_factures_lignes_non_facturees_c.no_facture = subview.no_facture AND
p_factures_lignes_non_facturees_c.prestation_id = subview.prestation_id AND
p_factures_lignes_non_facturees_c.date_debut = subview.date_debut AND
p_factures_lignes_non_facturees_c.date_fin = subview.date_fin AND
p_factures_lignes_non_facturees_c.prix_unitaire = subview.prix_unitaire
;
-- Factures non assurés ajoutées à tord (on trouve un 100% dans patient ou tp1
DROP TABLE IF EXISTS w_sejours_bg_24;
CREATE TEMP TABLE w_sejours_bg_24 AS
SELECT p_factures.no_sejour, SUM(montant_facture_0+montant_facture_1+montant_facture_2) AS montant_facture_100
FROM activite[PX].p_factures_lignes_c
JOIN activite[PX].p_factures ON p_factures_lignes_c.no_facture = p_factures.no_facture
JOIN activite[PX].p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
JOIN activite[PX].p_sejour_pmsi ON p_sejour_pmsi.sejour_id = p_sejours.oid
JOIN pmsi.p_rss ON p_sejour_pmsi.rss_id = p_rss.oid
WHERE p_sejours.est_budget_global = '1' AND
code_facture = '1' AND
(
t_prestations.code = 'PJ' OR
t_prestations.code LIKE 'GHS%'
) AND
(taux_1 + taux_2 + taux_0 = 100 OR
taux_0+taux_1+taux_2=0 AND montant_facture_1 = montant_facture
) AND
p_rss.traitement_epmsi NOT IN ('30','31','32','33')
GROUP BY 1
HAVING SUM(montant_facture_0+montant_facture_1+montant_facture_2) > 0
ORDER BY 1;
DELETE FROM activite[PX].p_factures_lignes_c
USING activite[PX].p_factures
WHERE p_factures_lignes_c.no_facture = p_factures.no_facture AND
p_factures.no_sejour IN (SELECT no_sejour FROM w_sejours_bg_24) AND
p_factures_lignes_c.no_facture LIKE '%BG' AND
origine_facturation_id = 1;
UPDATE activite[PX].p_factures SET
code_facture = '1',
date_facture = date_fin,
montant_facture_c = 0,
montant_facture_1_c = 0,
montant_comptabilise_1_c =0,
montant_comptabilise_budget_global_c = 0
WHERE no_sejour IN (SELECT no_sejour FROM w_sejours_bg_24) AND
no_facture LIKE '%BG' AND
montant_comptabilise_budget_global_c = 0;
-- Transfert de lignes non facturées vers budget global
UPDATE activite[PX].p_factures_lignes_non_facturees_c
SET no_facture = subview.no_facture_bg
FROM
(
SELECT p_sejours.no_sejour, t_prestations.code, t_prestations.texte, p_factures_lignes_non_facturees_c.*,
p_factures_bg.code_facture,p_factures_bg.no_facture AS no_facture_bg
FROM activite[PX].p_factures_lignes_non_facturees_c
JOIN activite[PX].p_factures ON p_factures_lignes_non_facturees_c.no_facture = p_factures.no_facture
JOIN activite[PX].p_sejours ON p_factures.no_sejour = p_sejours.no_sejour AND type_sejour IN ('1','2','5')
JOIN activite[PX].t_lieux ON lieu_sortie_id = t_lieux.oid
JOIN activite[PX].t_services_facturation ON service_facturation_id = t_services_facturation.oid AND type_t2a = '1'
JOIN activite.t_prestations ON p_factures_lignes_non_facturees_c.prestation_id = t_prestations.oid
JOIN activite[PX].p_factures p_factures_bg ON p_factures_bg.no_sejour = p_factures.no_sejour AND p_factures_bg.no_facture LIKE '%BG' AND
p_factures_lignes_non_facturees_c.date_debut BETWEEN p_factures_bg.date_debut AND p_factures_bg.date_fin
WHERE p_factures_lignes_non_facturees_c.no_facture NOT LIKE '%BG' AND
t_prestations.code IN ('EMI','ETI','PII','PME','PH8','PHU') AND
p_factures_bg.code_facture = '0'
) subview
WHERE p_factures_lignes_non_facturees_c.no_facture = subview.no_facture and
p_factures_lignes_non_facturees_c.prestation_id = subview.prestation_id
;
]]>
0 AND
montant_facture_actes_inclus_dans_sejour = 0 AND
(montant_facture_1 + montant_facture_2 + montant_facture_0) = 0 AND
(taux_0 <> 0 OR taux_1 <> 0 OR taux_2 <> 0 OR taux_22 <> 0);
UPDATE activite[PX].p_factures_lignes_h
SET
montant_facture_actes_inclus_dans_sejour = (prix_unitaire * nb_prestation * coefficient),
montant_facture_1_actes_inclus_dans_sejour = (prix_unitaire * nb_prestation * coefficient)
FROM activite[PX].p_factures
JOIN w_sejours_hospit_bg ON p_factures.no_sejour = w_sejours_hospit_bg.no_sejour_bg AND origine_facturation_id = 1
WHERE p_factures_lignes_h.no_facture = p_factures.no_facture AND prix_unitaire <> 0 AND
montant_facture_actes_inclus_dans_sejour = 0 AND
(montant_facture_1 + montant_facture_2 + montant_facture_0) = 0 AND
taux_1 = 0 AND taux_2 = 0 AND taux_0 = 0;
UPDATE activite[PX].p_factures_lignes_h
SET
montant_facture_actes_inclus_dans_sejour = (prix_unitaire * nb_prestation * coefficient) * taux_1 / 100.00,
montant_facture_1_actes_inclus_dans_sejour = (prix_unitaire * nb_prestation * coefficient) * taux_1 / 100.00
FROM activite[PX].p_factures
JOIN w_sejours_hospit_bg ON p_factures.no_sejour = w_sejours_hospit_bg.no_sejour_bg AND origine_facturation_id = 1
WHERE p_factures_lignes_h.no_facture = p_factures.no_facture AND prix_unitaire <> 0 AND
montant_facture_actes_inclus_dans_sejour = 0 AND
(montant_facture_2 + montant_facture_0) <> 0 AND montant_facture_1 = 0;
--arrondis
UPDATE activite[PX].p_factures_lignes_h
SET montant_facture_1_actes_inclus_dans_sejour = 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)
WHERE montant_facture_1_actes_inclus_dans_sejour <> 0 AND 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);
-- actes externes
UPDATE activite[PX].p_factures_lignes_h
SET
montant_facture = prix_unitaire * nb_prestation * coefficient,
montant_facture_1 = (prix_unitaire * nb_prestation * coefficient) * taux_1 / 100.00,
montant_facture_2 = (prix_unitaire * nb_prestation * coefficient) * taux_2 / 100.00,
montant_facture_0 = (prix_unitaire * nb_prestation * coefficient) * taux_0 / 100.00
FROM activite[PX].p_factures
JOIN w_sejours_hospit_bg ON p_factures.no_sejour = w_sejours_hospit_bg.no_sejour_bg AND origine_facturation_id = 2
WHERE p_factures_lignes_h.no_facture = p_factures.no_facture AND prix_unitaire <> 0 AND
(montant_facture_1 + montant_facture_2 + montant_facture_0) = 0;
UPDATE activite[PX].p_factures_lignes_h
SET
montant_facture = prix_unitaire * nb_prestation * coefficient,
montant_facture_1 = (prix_unitaire * nb_prestation * coefficient) * taux_1 / 100.00
FROM activite[PX].p_factures
JOIN w_sejours_hospit_bg ON p_factures.no_sejour = w_sejours_hospit_bg.no_sejour_bg AND origine_facturation_id = 2
WHERE p_factures_lignes_h.no_facture = p_factures.no_facture AND prix_unitaire <> 0 AND
taux_1 <> 0 AND (montant_facture_2 + montant_facture_0) <> 0 AND montant_facture_1 = 0;
-- Arrondis
UPDATE activite[PX].p_factures_lignes_h
SET montant_facture_1 = montant_facture - (montant_facture_0+montant_facture_1+montant_facture_2+montant_facture_22)
FROM activite[PX].p_factures
JOIN w_sejours_hospit_bg ON p_factures.no_sejour = w_sejours_hospit_bg.no_sejour_bg AND origine_facturation_id = 2
WHERE p_factures_lignes_h.no_facture = p_factures.no_facture AND
montant_facture_1 <> 0 AND
montant_facture <> (montant_facture_0+montant_facture_1+montant_facture_2+montant_facture_22);
-- Ajout des honoraires budget global dans la partie CLINIQUE
INSERT INTO activite[PX].p_factures_lignes_c(
no_facture,
date_debut,
date_fin,
nb_rubrique,
coefficient,
coefficient_mco,
rubrique_facturation_id,
prestation_id,
montant_facture,
montant_facture_0,
montant_facture_1,
montant_facture_2,
montant_facture_22,
taux_0,
taux_1,
taux_2,
taux_22,
prix_unitaire,
lieu_id,
nb_prestation,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
rubrique_comptabilisation_id,
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,
protocole_id,
compte_produit_id)
SELECT
p_factures.no_facture,
p_factures_lignes_h.date_debut,
p_factures_lignes_h.date_fin,
nb_rubrique,
coefficient,
coefficient_mco,
CASE WHEN p_factures_lignes_h.rubrique_facturation_id <> 0 THEN p_factures_lignes_h.rubrique_facturation_id ELSE COALESCE(t_rubriques_facturation.oid,0) END AS rubrique_facturation_id,
prestation_id,
CASE WHEN montant_comptabilise_0 <> 0 THEN montant_facture_0 ELSE 0 END +
CASE WHEN montant_comptabilise_1 <> 0 THEN montant_facture_1 ELSE 0 END +
CASE WHEN montant_comptabilise_2 <> 0 THEN montant_facture_2 ELSE 0 END +
CASE WHEN montant_comptabilise_22 <> 0 THEN montant_facture_22 ELSE 0 END AS montant_facture,
CASE WHEN montant_comptabilise_0 <> 0 THEN montant_facture_0 ELSE 0 END AS montant_facture_0,
CASE WHEN montant_comptabilise_1 <> 0 THEN montant_facture_1 ELSE 0 END AS montant_facture_1,
CASE WHEN montant_comptabilise_2 <> 0 THEN montant_facture_2 ELSE 0 END AS montant_facture_2,
CASE WHEN montant_comptabilise_22 <> 0 THEN montant_facture_22 ELSE 0 END AS montant_facture_22,
taux_0,
taux_1,
taux_2,
taux_22,
prix_unitaire,
lieu_id,
CASE WHEN montant_comptabilise_1 <> 0 THEN nb_prestation ELSE 0 END,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
CASE WHEN p_factures_lignes_h.rubrique_facturation_id <> 0 THEN p_factures_lignes_h.rubrique_facturation_id ELSE COALESCE(t_rubriques_facturation.oid,0) END AS rubrique_comptabilisation_id,
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,
2::bigint AS origine_facturation_id,
0::numeric AS montant_comptabilise_budget_global_1,
p_factures.oid AS facture_id,
protocole_id,
0::bigint AS compte_produit_id
FROM activite[PX].p_factures_lignes_h
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
LEFT JOIN activite[PX].t_rubriques_facturation ON t_prestations.code = t_rubriques_facturation.code
JOIN activite[PX].p_factures ON p_factures_lignes_h.no_facture = p_factures.no_facture
JOIN activite[PX].p_sejours ON p_factures.no_sejour = p_sejours.no_sejour AND est_budget_global = '1'
WHERE p_factures.code_facture = '1' AND
((p_sejours.type_sejour = '3' AND p_factures_lignes_h.no_facture NOT LIKE '%BG') OR
montant_comptabilise <> 0 OR
montant_comptabilise_0 <> 0 OR
montant_comptabilise_1 <> 0 OR
montant_comptabilise_2 <> 0) ;
UPDATE activite[PX].p_factures_lignes_h
SET montant_comptabilise = 0, montant_comptabilise_0 = 0, montant_comptabilise_1 = 0, montant_comptabilise_2 = 0
FROM activite[PX].p_factures
JOIN activite[PX].p_sejours ON p_factures.no_sejour = p_sejours.no_sejour AND est_budget_global = '1'
WHERE p_factures_lignes_h.no_facture = p_factures.no_facture AND
(montant_comptabilise <> 0 OR montant_comptabilise_0 <> 0 OR montant_comptabilise_1 <> 0 OR montant_comptabilise_2 <> 0) ;
-- Ajout des actes inclus dans séjour dans la partie clinique (verrouillé)
DROP TABLE IF EXISTS w_actes_inclus;
CREATE TEMP TABLE w_actes_inclus AS
SELECT
p_factures.no_sejour,
p_factures.no_facture AS no_facture,
p_factures_lignes_h.date_debut,
p_factures_lignes_h.date_fin,
nb_rubrique,
coefficient,
coefficient_mco,
COALESCE(t_rubriques_facturation.oid,0) AS rubrique_facturation_id,
prestation_id,
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,
taux_0,
taux_1,
taux_2,
taux_22,
prix_unitaire,
lieu_id,
nb_prestation,
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,
COALESCE(t_rubriques_facturation.oid,0) AS rubrique_comptabilisation_id,
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,
3::bigint AS origine_facturation_id,
0::numeric AS montant_comptabilise_budget_global_1,
p_factures.oid AS facture_id,
protocole_id,
0::bigint AS compte_produit_id
FROM activite[PX].p_factures_lignes_h
JOIN activite.t_prestations ON prestation_id = t_prestations.oid
LEFT JOIN activite[PX].t_rubriques_facturation ON t_prestations.code = t_rubriques_facturation.code
JOIN activite[PX].p_factures ON p_factures_lignes_h.no_facture = p_factures.no_facture
JOIN activite[PX].p_sejours ON p_factures.no_sejour = p_sejours.no_sejour AND est_budget_global = '1'
WHERE 1<>1 AND
(montant_facture_actes_inclus_dans_sejour <> 0 OR
montant_facture_0_actes_inclus_dans_sejour <> 0 OR
montant_facture_1_actes_inclus_dans_sejour <> 0 OR
montant_facture_2_actes_inclus_dans_sejour <> 0) ;
UPDATE w_actes_inclus
SET no_facture = p_factures.no_facture, facture_id = p_factures.oid
FROM activite[PX].p_factures
WHERE w_actes_inclus.no_sejour = p_factures.no_sejour AND
p_factures.no_facture LIKE '%BG' ;
INSERT INTO activite[PX].p_factures_lignes_c
(
no_facture,
date_debut,
date_fin,
nb_rubrique,
coefficient,
coefficient_mco,
rubrique_facturation_id,
prestation_id,
montant_facture,
montant_facture_0,
montant_facture_1,
montant_facture_2,
montant_facture_22,
taux_0,
taux_1,
taux_2,
taux_22,
prix_unitaire,
lieu_id,
nb_prestation,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
rubrique_comptabilisation_id,
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,
protocole_id,
compte_produit_id
)
SELECT
no_facture,
date_debut,
date_fin,
nb_rubrique,
coefficient,
coefficient_mco,
rubrique_facturation_id,
prestation_id,
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,
taux_0,
taux_1,
taux_2,
taux_22,
prix_unitaire,
lieu_id,
nb_prestation,
montant_comptabilise,
montant_comptabilise_0,
montant_comptabilise_1,
montant_comptabilise_2,
montant_comptabilise_22,
rubrique_comptabilisation_id,
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,
protocole_id,
compte_produit_id
FROM w_actes_inclus;
-- Correction n° facture
UPDATE activite[PX].p_factures_lignes_c
SET no_facture = p_factures.no_facture, facture_id = p_factures.oid
FROM activite[PX].p_factures
WHERE p_factures_lignes_c.montant_facture_actes_inclus_dans_sejour <> 0 AND
split_part(p_factures_lignes_c.no_facture,'.',1) = p_factures.no_sejour AND
p_factures.no_facture LIKE '%BG' AND
p_factures_lignes_c.no_facture NOT LIKE '%BG' AND
p_factures_lignes_c.montant_facture = 0 AND
p_factures_lignes_c.montant_comptabilise = 0;
UPDATE activite[PX].p_factures_lignes_h
SET no_facture = p_factures.no_facture, facture_id = p_factures.oid
FROM activite[PX].p_factures
WHERE p_factures_lignes_h.montant_facture_actes_inclus_dans_sejour <> 0 AND
split_part(p_factures_lignes_h.no_facture,'.',1) = p_factures.no_sejour AND
p_factures.no_facture LIKE '%BG' AND
p_factures_lignes_h.no_facture NOT LIKE '%BG' AND
p_factures_lignes_h.montant_facture = 0 AND
p_factures_lignes_h.montant_comptabilise = 0;
-- Cumuls factures
DROP TABLE IF EXISTS w_factures_corrigees;
CREATE TEMP TABLE w_factures_corrigees AS
SELECT
p_factures_lignes_c.no_facture,
COALESCE(SUM(CASE WHEN origine_facturation_id = 1 THEN montant_facture ELSE 0 END),0) AS ligne_facture_c,
COALESCE(SUM(CASE WHEN origine_facturation_id = 1 THEN montant_facture_0 ELSE 0 END),0) AS ligne_facture_0_c,
COALESCE(SUM(CASE WHEN origine_facturation_id = 1 THEN montant_facture_1 ELSE 0 END),0) AS ligne_facture_1_c,
COALESCE(SUM(CASE WHEN origine_facturation_id = 1 THEN montant_facture_2 ELSE 0 END),0) AS ligne_facture_2_c,
COALESCE(SUM(CASE WHEN origine_facturation_id = 1 THEN montant_facture_22 ELSE 0 END),0) AS ligne_facture_22_c,
COALESCE(SUM(montant_comptabilise),0) AS ligne_comptabilise_c,
COALESCE(SUM(montant_comptabilise_0),0) AS ligne_comptabilise_0_c,
COALESCE(SUM(montant_comptabilise_1),0) AS ligne_comptabilise_1_c,
COALESCE(SUM(montant_comptabilise_2),0) AS ligne_comptabilise_2_c,
COALESCE(SUM(montant_comptabilise_22),0) AS ligne_comptabilise_22_c,
COALESCE(SUM(CASE WHEN origine_facturation_id = 2 THEN montant_facture ELSE 0 END),0) AS ligne_facture_h,
COALESCE(SUM(CASE WHEN origine_facturation_id = 2 THEN montant_facture_0 ELSE 0 END),0) AS ligne_facture_0_h,
COALESCE(SUM(CASE WHEN origine_facturation_id = 2 THEN montant_facture_1 ELSE 0 END),0) AS ligne_facture_1_h,
COALESCE(SUM(CASE WHEN origine_facturation_id = 2 THEN montant_facture_2 ELSE 0 END),0) AS ligne_facture_2_h,
COALESCE(SUM(CASE WHEN origine_facturation_id = 2 THEN montant_facture_22 ELSE 0 END),0) AS ligne_facture_22_h,
0::numeric AS ligne_comptabilise_h,
0::numeric AS ligne_comptabilise_0_h,
0::numeric AS ligne_comptabilise_1_h,
0::numeric AS ligne_comptabilise_2_h,
0::numeric AS ligne_comptabilise_22_h
FROM activite[PX].p_factures
JOIN activite[PX].p_sejours ON p_factures.no_sejour = p_sejours.no_sejour AND est_budget_global = '1'
LEFT JOIN activite[PX].p_factures_lignes_c ON p_factures_lignes_c.no_facture = p_factures.no_facture
GROUP BY 1
HAVING SUM(CASE WHEN origine_facturation_id = 1 THEN montant_facture ELSE 0 END) IS DISTINCT FROM MAX(p_factures.montant_facture_c) OR
SUM(CASE WHEN origine_facturation_id = 1 THEN montant_facture_0 ELSE 0 END) IS DISTINCT FROM MAX(p_factures.montant_facture_0_c) OR
SUM(CASE WHEN origine_facturation_id = 1 THEN montant_facture_1 ELSE 0 END) IS DISTINCT FROM MAX(p_factures.montant_facture_1_c) OR
SUM(CASE WHEN origine_facturation_id = 1 THEN montant_facture_2 ELSE 0 END) IS DISTINCT FROM MAX(p_factures.montant_facture_2_c) OR
SUM(CASE WHEN origine_facturation_id = 1 THEN montant_facture_22 ELSE 0 END) IS DISTINCT FROM MAX(p_factures.montant_facture_22_c) OR
SUM(montant_comptabilise) IS DISTINCT FROM MAX(p_factures.montant_comptabilise_c) OR
SUM(montant_comptabilise_0) IS DISTINCT FROM MAX(p_factures.montant_comptabilise_0_c) OR
SUM(montant_comptabilise_1) IS DISTINCT FROM MAX(p_factures.montant_comptabilise_1_c) OR
SUM(montant_comptabilise_2) IS DISTINCT FROM MAX(p_factures.montant_comptabilise_2_c) OR
SUM(montant_comptabilise_22) IS DISTINCT FROM MAX(p_factures.montant_comptabilise_22_c) OR
SUM(CASE WHEN origine_facturation_id = 2 THEN montant_facture ELSE 0 END) IS DISTINCT FROM MAX(p_factures.montant_facture_h) OR
SUM(CASE WHEN origine_facturation_id = 2 THEN montant_facture_0 ELSE 0 END) IS DISTINCT FROM MAX(p_factures.montant_facture_0_h) OR
SUM(CASE WHEN origine_facturation_id = 2 THEN montant_facture_1 ELSE 0 END) IS DISTINCT FROM MAX(p_factures.montant_facture_1_h) OR
SUM(CASE WHEN origine_facturation_id = 2 THEN montant_facture_2 ELSE 0 END) IS DISTINCT FROM MAX(p_factures.montant_facture_2_h) OR
SUM(CASE WHEN origine_facturation_id = 2 THEN montant_facture_22 ELSE 0 END) IS DISTINCT FROM MAX(p_factures.montant_facture_22_h) OR
0::numeric IS DISTINCT FROM MAX(p_factures.montant_comptabilise_h) OR
0::numeric IS DISTINCT FROM MAX(p_factures.montant_comptabilise_0_h) OR
0::numeric IS DISTINCT FROM MAX(p_factures.montant_comptabilise_1_h) OR
0::numeric IS DISTINCT FROM MAX(p_factures.montant_comptabilise_2_h) OR
0::numeric IS DISTINCT FROM MAX(p_factures.montant_comptabilise_22_h) ;
UPDATE activite[PX].p_factures
SET
montant_facture_c = w_factures_corrigees.ligne_facture_c,
montant_facture_0_c = w_factures_corrigees.ligne_facture_0_c,
montant_facture_1_c = w_factures_corrigees.ligne_facture_1_c,
montant_facture_2_c = w_factures_corrigees.ligne_facture_2_c,
montant_facture_22_c = w_factures_corrigees.ligne_facture_22_c,
montant_comptabilise_c = w_factures_corrigees.ligne_comptabilise_c,
montant_comptabilise_0_c = w_factures_corrigees.ligne_comptabilise_0_c,
montant_comptabilise_1_c = w_factures_corrigees.ligne_comptabilise_1_c,
montant_comptabilise_2_c = w_factures_corrigees.ligne_comptabilise_2_c,
montant_comptabilise_22_c = w_factures_corrigees.ligne_comptabilise_22_c,
montant_facture_h = w_factures_corrigees.ligne_facture_h,
montant_facture_0_h = w_factures_corrigees.ligne_facture_0_h,
montant_facture_1_h = w_factures_corrigees.ligne_facture_1_h,
montant_facture_2_h = w_factures_corrigees.ligne_facture_2_h,
montant_facture_22_h = w_factures_corrigees.ligne_facture_22_h,
montant_comptabilise_h = w_factures_corrigees.ligne_comptabilise_h,
montant_comptabilise_0_h = w_factures_corrigees.ligne_comptabilise_0_h,
montant_comptabilise_1_h = w_factures_corrigees.ligne_comptabilise_1_h,
montant_comptabilise_2_h = w_factures_corrigees.ligne_comptabilise_2_h,
montant_comptabilise_22_h = w_factures_corrigees.ligne_comptabilise_22_h
FROM w_factures_corrigees
WHERE w_factures_corrigees.no_facture = p_factures.no_facture;
-- Report des actes non facturés honoraires budget global pour encours
INSERT INTO activite[PX].p_factures_lignes_non_facturees_c(
facture_id,
no_facture,
date_debut,
date_fin,
nb_rubrique,
coefficient,
rubrique_facturation_id,
prestation_id,
prix_unitaire,
lieu_id)
SELECT
p_factures.oid AS facture_id,
p_factures.no_facture AS no_facture,
p_factures_lignes_h.date_debut,
p_factures_lignes_h.date_fin,
p_factures_lignes_h.nb_rubrique,
p_factures_lignes_h.coefficient,
p_factures_lignes_h.rubrique_facturation_id,
p_factures_lignes_h.prestation_id,
p_factures_lignes_h.prix_unitaire,
p_factures_lignes_h.lieu_id
FROM activite[PX].p_factures_lignes_h
JOIN activite[PX].p_factures on p_factures_lignes_h.no_facture = p_factures.no_facture
JOIN activite[PX].p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
WHERE p_factures.code_facture = '0' AND
p_sejours.est_budget_global = '1' AND
p_sejours.type_sejour = '3' AND
p_factures.no_sejour NOT IN (SELECT no_sejour FROM activite[PX].p_factures WHERE code_facture = '1') AND
p_factures_lignes_h.no_facture NOT IN (SELECT no_facture FROM activite[PX].p_factures_lignes_non_facturees_c)
;
-- Report des actes non facturés honoraires budget global pour encours
INSERT INTO activite[PX].p_factures_lignes_non_facturees_c(
facture_id,
no_facture,
date_debut,
date_fin,
nb_rubrique,
coefficient,
rubrique_facturation_id,
prestation_id,
prix_unitaire,
lieu_id)
SELECT
p_factures.oid AS facture_id,
p_factures.no_facture AS no_facture,
p_factures_lignes_non_facturees_h.date_debut,
p_factures_lignes_non_facturees_h.date_fin,
p_factures_lignes_non_facturees_h.nb_rubrique,
p_factures_lignes_non_facturees_h.coefficient,
p_factures_lignes_non_facturees_h.rubrique_facturation_id,
p_factures_lignes_non_facturees_h.prestation_id,
p_factures_lignes_non_facturees_h.prix_unitaire,
p_factures_lignes_non_facturees_h.lieu_id
FROM activite[PX].p_factures_lignes_non_facturees_h
JOIN activite[PX].p_factures on p_factures_lignes_non_facturees_h.no_facture = p_factures.no_facture
JOIN activite[PX].p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
WHERE p_factures.code_facture = '0' AND
p_sejours.est_budget_global = '1' AND
p_sejours.type_sejour = '3' AND
p_factures.no_sejour NOT IN (SELECT no_sejour FROM activite[PX].p_factures WHERE code_facture = '1') --AND
;
TRUNCATE activite[PX].p_factures_lignes_non_facturees_h
;
]]>
'1' AND
p_sejours.type_sejour = '3' AND
date_entree between now() - interval '1 year' AND now() AND
code_sorti = '1' AND
no_sejour NOT IN (SELECT no_sejour FROM activite[PX].p_factures WHERE no_facture like '%BG') AND
no_sejour NOT IN
(
SELECT no_sejour
FROM activite[PX].p_factures_lignes_c
JOIN activite[PX].p_factures ON p_factures_lignes_c.no_facture = p_factures.no_facture
WHERE p_factures_lignes_c.no_facture NOT LIKE '%BG' AND montant_comptabilise_1 <> 0
)
;
-- Sur Externes, Récupérer actes facturés partiellement
INSERT INTO activite[PX].p_factures_lignes_non_facturees_c(
facture_id,
no_facture,
date_debut,
rubrique_facturation_id,
prestation_id,
date_fin,
nb_rubrique,
coefficient,
lieu_id,
prix_unitaire
)
SELECT
p_factures_bg.oid AS facture_id,
p_factures_bg.no_facture AS no_facture,
p_factures_lignes_c.date_debut,
p_factures_lignes_c.rubrique_facturation_id,
p_factures_lignes_c.prestation_id,
MAX(p_factures_lignes_c.date_fin),
1,
1,
MAX(p_factures_lignes_c.lieu_id),
(MAX(prix_unitaire) * MAX(coefficient) * SUM(nb_rubrique)) - SUM(montant_facture) AS prix_unitaire
FROM activite[PX].p_factures_lignes_c
JOIN activite[PX].p_factures on p_factures_lignes_c.no_facture = p_factures.no_facture
JOIN activite[PX].p_factures p_factures_bg ON p_factures_bg.no_sejour = p_factures.no_sejour and p_factures_bg.no_facture LIKE '%BG'
JOIN activite[PX].p_sejours ON p_factures.no_sejour = p_sejours.no_sejour
WHERE p_sejours.type_sejour = '3' AND
p_factures_bg.code_facture = '0' AND
p_factures_lignes_c.no_facture nOT LIKE '%BG' AND
montant_encours = 0 AND p_factures_bg.montant_encours_c = 0
GROUP BY 1,2,3,4,5
HAVING
SUM(nb_rubrique) > 0 AND
((MAX(prix_unitaire) * MAX(coefficient) * SUM(nb_rubrique)) - SUM(montant_facture)) > 1
;
]]>
'VE' AND CPT_CODE LIKE '468%' THEN 'ATT'
WHEN LNK_JOURNAL <> 'VE' AND CPT_CODE LIKE '471%' THEN 'ATT'
WHEN LNK_JOURNAL <> 'VE' AND CPT_CODE LIKE '411%' AND ECR_REF_TYPE = 'FACTURE' THEN 'RCLI'
WHEN LNK_JOURNAL <> 'VE' AND CPT_CODE LIKE '412%' AND ECR_REF_TYPE = 'FACTURE' THEN 'RCLI'
WHEN LNK_JOURNAL <> 'VE' AND CPT_CODE LIKE '411%' AND ECR_DETAILS LIKE '%NOEMIE%' THEN 'RNOE'
WHEN LNK_JOURNAL <> 'VE' AND CPT_CODE LIKE '412%' AND ECR_DETAILS LIKE '%NOEMIE%' THEN 'RNOE'
WHEN LNK_JOURNAL <> 'VE' AND CPT_CODE LIKE '419%' THEN 'ACPT'
WHEN LNK_JOURNAL <> 'VE' AND CPT_CODE LIKE '51%' THEN 'BANQ'
WHEN LNK_JOURNAL <> 'VE' AND CPT_CODE LIKE '531%' THEN 'BANQ'
WHEN LNK_JOURNAL <> 'VE' AND CPT_CODE LIKE '466%' THEN 'PHON'
WHEN ECR_TYPE = 'IMPAYE' THEN 'PEPR'
WHEN LNK_JOURNAL <> 'VE' AND ECR_TYPE = 'VENTE-DIRECTE' THEN 'RDIR'
WHEN ECR_TYPE LIKE '%PIVOT%' THEN 'PIVO'
WHEN ECR_TYPE LIKE 'REVERS' THEN 'REVP'
WHEN ECR_TYPE LIKE 'OD' THEN 'OD'
ELSE '?'||ECR_TYPE END AS type_ecriture,
ECR_OPERATION::text AS piece,
CASE ECR_IS_ETS WHEN 1 THEN 'C' ELSE 'H' END AS clinique_honoraire,
COALESCE(t_compte.oid,0) AS compte_id,
COALESCE(t_journal.oid,0) AS journal_id,
COALESCE(p_sejours.oid,0::bigint) AS sejour_id,
COALESCE(p_sejours.no_sejour,''::text) AS no_sejour,
COALESCE(p_factures.oid,0::bigint) AS facture_id,
COALESCE(FACT_NUMERO::text,'')::text AS no_facture,
COALESCE(t_medecins_administratifs.oid,0) AS medecin_id,
COALESCE(t_tiers_payant.oid,t_tiers_payant0.oid,0) AS tiers_payant_id,
ECR_DETAILS AS texte,
ECR_CREDIT AS montant_credit,
ECR_DEBIT AS montant_debit,
ECR_OPERATION,
CASE
WHEN LNK_SOURCE = 'FACTURE' THEN 'VENTE'
WHEN LNK_SOURCE = 'IMPAYE' THEN 'VENTE'
WHEN LNK_SOURCE = 'RGLMT' THEN 'RGLMT'
WHEN LNK_SOURCE = 'ENC' THEN 'RGLMT'
WHEN LNK_SOURCE = 'DEPOT' THEN 'ODBANQ'
ELSE LNK_SOURCE END AS type_piece,
LNK_SOURCE,
LNK_SOURCE_OID,
ECR_LOCKED,
''::text AS mode_reglement_code,
ECR_TVA_TAUX*100 AS taux_tva
FROM w_CPT_ECRITURE_source_OP_LINK
JOIN prod_web100t.CPT_COMPTES ON CPT_OID = ECR_COMPTE
LEFT JOIN prod_web100t.DAT_DA ON ECR_REF_DA = DA_OID AND ECR_REF_DA > 0
LEFT JOIN prod_web100t.FAC_FACTURE ON ECR_REF_FACT = FACT_OID AND ECR_REF_FACT > 0
JOIN activite[PX].t_journal ON LNK_JOURNAL = t_journal.code_original
LEFT JOIN activite[PX].t_compte ON CPT_CODE = t_compte.code
LEFT JOIN activite[PX].p_sejours ON ECR_REF_DA = p_sejours.code_original AND ECR_REF_DA > 0
LEFT JOIN activite[PX].p_factures ON FACT_NUMERO = p_factures.no_facture AND ECR_REF_FACT > 0
LEFT JOIN activite[PX].t_tiers_payant ON CPT_REF = t_tiers_payant.code_original AND CPT_REF >0 AND CPT_REF_TYPE IN ('AMO','AMC')
LEFT JOIN activite[PX].t_tiers_payant t_tiers_payant0 ON CPT_REF_TYPE IN ('DA') AND t_tiers_payant0.code = 'PATIENTS'
LEFT JOIN activite[PX].t_medecins_administratifs ON CPT_REF = t_medecins_administratifs.code_original AND CPT_REF > 0 AND CPT_REF_TYPE IN ('PRATICIEN')
WHERE
ECR_TYPE <> 'ERREUR' AND
ECR_TYPE <> 'ENCOURS' AND
LNK_ERROR = '' AND
ECR_DATE >= '[ENV_ADM_ANNEEDEBUT]0101'
;
ANALYSE w_ecriture_comptable
;
CREATE INDEX w_ecriture_comptable_ik_ECR_OID
ON w_ecriture_comptable
USING btree
(ECR_OID);
CREATE INDEX w_ecriture_comptable_ik_ECR_OPERATION
ON w_ecriture_comptable
USING btree
(ECR_OPERATION);
CREATE INDEX w_ecriture_comptable_ik_LNK_SOURCE_OID
ON w_ecriture_comptable
USING btree
(LNK_SOURCE_OID);
CREATE INDEX w_ecriture_comptable_ik_PIECE
ON w_ecriture_comptable
USING btree
(PIECE);
CREATE INDEX w_ecriture_comptable_ik_compte_id
ON w_ecriture_comptable
USING btree
(compte_id);
UPDATE w_ecriture_comptable SET
no_facture = w_ecriture_comptable.no_facture || '-IM'||ECR_OPERATION::text,
facture_id = p_factures.oid
FROM activite[PX].p_factures
WHERE p_factures.no_facture = w_ecriture_comptable.no_facture || '-IM'||ECR_OPERATION::text AND
LNK_SOURCE = 'IMPAYE'
;
DROP TABLE IF EXISTS w_mode_reg;
CREATE TEMP TABLE w_mode_reg AS
SELECT ECR_OID,
LNK_SOURCE,
MAX(
CASE FR_MODE
WHEN 1 THEN 'CHQ'
WHEN 2 THEN 'CB'
WHEN 3 THEN 'ESP'
WHEN 4 THEN 'VIR'
ELSE 'A' END) AS mode_reglement_code
FROM prod_web100t.CPT_ECRITURE
JOIN prod_web100t.CPT_OP_LINK ON LNK_OPERATION = ECR_OPERATION
JOIN prod_web100t.CPT_COMPTES ON ecr_compte = cpt_oid
JOIN prod_web100t.FAC_REGLEMENTS ON LNK_SOURCE_OID = FR_OID
WHERE LNK_SOURCE IN ('RGLMT','ENC') AND
ECR_TYPE IN ('VALEUR_ENC','PIVOT','CAISSE')
GROUP BY 1,2
;
CREATE INDEX w_mode_reg_i1
ON w_mode_reg
USING btree
(ECR_OID);
UPDATE w_ecriture_comptable
SET mode_reglement_code = w_mode_reg.mode_reglement_code
FROM
w_mode_reg
WHERE w_ecriture_comptable.ECR_OID = w_mode_reg.ECR_OID
AND w_mode_reg.LNK_SOURCE = 'RGLMT'
;
UPDATE w_ecriture_comptable
SET mode_reglement_code = w_mode_reg.mode_reglement_code
FROM
w_mode_reg
WHERE w_ecriture_comptable.ECR_OID = w_mode_reg.ECR_OID
AND w_mode_reg.LNK_SOURCE = 'ENC'
;
DROP TABLE IF EXISTS w_ecr_par_piece;
CREATE TEMP TABLE w_ecr_par_piece AS
SELECT piece, MAX(mode_reglement_code) AS mode_reglement_code
FROM w_ecriture_comptable
WHERE mode_reglement_code <> ''
GROUP BY 1
HAVING count(DISTINCT mode_reglement_code) = 1
;
CREATE INDEX w_ecr_par_piece_i1
ON w_ecr_par_piece
USING btree
(PIECE);
UPDATE w_ecriture_comptable
SET mode_reglement_code = w_ecr_par_piece.mode_reglement_code
FROM
w_ecr_par_piece
, activite[PX].t_compte
WHERE w_ecriture_comptable.compte_id = t_compte.oid AND
(t_compte.code LIKE '4%' OR t_compte.code LIKE '5%') AND
t_compte.code NOT LIKE '41%' AND
t_compte.code NOT LIKE '445%' AND
w_ecriture_comptable.piece = w_ecr_par_piece.piece AND
w_ecriture_comptable.mode_reglement_code = ''
;
TRUNCATE activite[PX].p_ecriture_comptable;
INSERT INTO activite[PX].p_ecriture_comptable(
code_original,
date_comptable,
type_ecriture,
type_piece,
piece,
clinique_honoraire,
compte_id,
journal_id,
sejour_id,
no_sejour,
facture_id,
no_facture,
medecin_id,
tiers_payant_id,
texte,
montant_credit,
montant_debit,
est_comptabilise,
mode_reglement_code,
taux_tva)
SELECT
code_original,
date_comptable,
type_ecriture,
type_piece,
piece,
clinique_honoraire,
compte_id,
journal_id,
sejour_id,
no_sejour,
facture_id,
no_facture,
medecin_id,
tiers_payant_id,
texte,
montant_credit,
montant_debit,
CASE WHEN ECR_LOCKED = 1 THEN '1' ELSE 0 END AS est_comptabilise,
mode_reglement_code,
taux_tva
FROM w_ecriture_comptable
;
ANALYSE activite[PX].p_ecriture_comptable
;
UPDATE activite[PX].p_ecriture_comptable
SET code_erreur = 'EQP'
FROM
(
SELECT provider_id, clinique_honoraire, piece
FROM activite[PX].p_ecriture_comptable
GROUP BY 1,2,3
HAVING SUM(montant_debit-montant_credit) <> 0
) subview
WHERE p_ecriture_comptable.provider_id = subview.provider_id AND
p_ecriture_comptable.piece = subview.piece AND
p_ecriture_comptable.clinique_honoraire = subview.clinique_honoraire
;
UPDATE activite[PX].p_ecriture_comptable
SET code_erreur = 'FAC'
FROM
(
SELECT p_ecriture_comptable.provider_id AS provider_id,
p_ecriture_comptable.piece AS piece,
p_ecriture_comptable.clinique_honoraire AS clinique_honoraire
FROM activite[PX].p_ecriture_comptable
JOIN
(
SELECT p_ecriture_comptable.provider_id,
p_ecriture_comptable.no_facture,
CASE WHEN round(SUM(CASE WHEN type_ecriture IN ('VPRD','VTVA') THEN montant_credit-montant_debit ELSE 0 END),2) IS DISTINCT FROM round(MAX(montant_comptabilise_c),2) THEN '1' ELSE '0' END AS erreur_vente_c,
CASE WHEN round(SUM(CASE WHEN type_ecriture IN ('VHON','VHOI') THEN montant_credit-montant_debit ELSE 0 END),2) IS DISTINCT FROM round(MAX(montant_comptabilise_h),2) THEN '1' ELSE '0' END AS erreur_vente_h
FROM activite[PX].p_ecriture_comptable
LEFT JOIN activite[PX].p_factures ON p_factures.no_facture = p_ecriture_comptable.no_facture
WHERE type_ecriture IN ('VPRD','VTVA','VHON','VHOI')
GROUP BY 1,2
) subview ON
p_ecriture_comptable.provider_id = subview.provider_id AND
p_ecriture_comptable.no_facture = subview.no_facture
WHERE p_ecriture_comptable.type_ecriture IN ('VPRD','VTVA','VHON','VHOI','VCLI') AND
(
p_ecriture_comptable.clinique_honoraire = 'C' AND erreur_vente_c = '1' OR
p_ecriture_comptable.clinique_honoraire = 'H' AND erreur_vente_h = '1'
)
GROUP BY 1,2,3
) subview
WHERE p_ecriture_comptable.provider_id = subview.provider_id AND
p_ecriture_comptable.piece = subview.piece AND
p_ecriture_comptable.clinique_honoraire = subview.clinique_honoraire
;
]]>
'VE' AND ECR_IS_ETS = 1 THEN ECR_CREDIT - ECR_DEBIT ELSE 0 END) AS montant_reglements_c,
0::numeric AS montant_solde_client_c,
SUM(CASE
WHEN LNK_JOURNAL = 'VE' AND ECR_IS_ETS = 0 THEN ECR_DEBIT - ECR_CREDIT
ELSE 0 END
) AS montant_ventes_h,
SUM(CASE
WHEN LNK_JOURNAL <> 'VE' AND LNK_JOURNAL <> 'HONO' AND ECR_IS_ETS = 0 THEN ECR_CREDIT - ECR_DEBIT
WHEN LNK_JOURNAL = 'HONO' AND ECR_IS_ETS = 0 THEN ECR_CREDIT - ECR_DEBIT
ELSE 0 END
) AS montant_reglements_h,
0::numeric AS montant_solde_client_h
FROM w_CPT_ECRITURE_source_OP_LINK
JOIN prod_web100t.CPT_COMPTES ON ECR_COMPTE = CPT_OID AND CPT_CODE LIKE '41%'
JOIN prod_web100t.FAC_FACTURE ON FACT_OID = ECR_REF_OID
JOIN activite[PX].p_sejours ON code_original = FACT_DA
WHERE LNK_ERROR = '' AND
date(ECR_DATE) >= '[ENV_ADM_ANNEEDEBUT]0101' AND
ECR_TYPE IN ('CLIENT','VENTE-DIRECTE','VENTE-DEP') AND ECR_REF_TYPE = 'FACTURE'
GROUP BY 1;
TRUNCATE activite[PX].p_factures_comptables;
INSERT INTO activite[PX].p_factures_comptables(
no_facture,
date_comptable,
montant_ventes_c,
montant_reglements_c,
montant_ventes_h,
montant_reglements_h
)
SELECT
COALESCE(FACT_NUMERO, 'ID_' || LNK_SOURCE_OID),
date(ECR_DATE) AS date_comptable,
SUM(CASE WHEN LNK_JOURNAL = 'VE' AND ECR_IS_ETS = 1 THEN ECR_DEBIT - ECR_CREDIT ELSE 0 END) AS montant_ventes_c,
SUM(CASE WHEN LNK_JOURNAL <> 'VE' AND ECR_IS_ETS = 1 THEN ECR_CREDIT - ECR_DEBIT ELSE 0 END) AS montant_reglements_c,
SUM(CASE
WHEN LNK_JOURNAL = 'VE' AND ECR_IS_ETS = 0 THEN ECR_DEBIT - ECR_CREDIT
ELSE 0 END
) AS montant_ventes_h,
SUM(CASE
WHEN LNK_JOURNAL <> 'VE' AND LNK_JOURNAL <> 'HONO' AND ECR_IS_ETS = 0 THEN ECR_CREDIT - ECR_DEBIT
WHEN LNK_JOURNAL = 'HONO' AND ECR_IS_ETS = 0 THEN ECR_CREDIT - ECR_DEBIT
ELSE 0 END
) AS montant_reglements_h
FROM w_CPT_ECRITURE_source_OP_LINK
JOIN prod_web100t.CPT_COMPTES ON ECR_COMPTE = CPT_OID AND CPT_CODE LIKE '41%'
JOIN prod_web100t.FAC_FACTURE ON FACT_OID = ECR_REF_OID
JOIN activite[PX].p_sejours ON code_original = FACT_DA
WHERE LNK_ERROR = '' AND
date(ECR_DATE) >= '[ENV_ADM_ANNEEDEBUT]0101' AND
ECR_TYPE IN ('CLIENT','VENTE-DIRECTE','VENTE-DEP') AND ECR_REF_TYPE = 'FACTURE'
GROUP BY 1,2;
-- Attention, les ventes directes ne sont peut être pas encore générées
-- Date dernière génération ventes directes
-- Attention : Il faut que la dernière génération ne soit pas antérieure à 1 mois
DROP TABLE IF EXISTS w_last_direct;
CREATE TEMP TABLE w_last_direct AS
SELECT
date(max(ECR_DATE)) AS LAST_ECR_DATE
FROM w_CPT_ECRITURE_source_OP_LINK
JOIN prod_web100t.CPT_COMPTES ON ECR_COMPTE = CPT_OID AND CPT_CODE LIKE '41%'
JOIN prod_web100t.FAC_FACTURE ON FACT_OID = ECR_REF_OID
JOIN activite[PX].p_sejours ON code_original = FACT_DA
WHERE LNK_ERROR = '' AND
ECR_TYPE IN ('VENTE-DIRECTE') AND ECR_REF_TYPE = 'FACTURE' and ECR_IS_ETS = 0
HAVING date(max(ECR_DATE)) >= date(now() - interval '1 month');
-- Factures comptabilisées après cette date
DROP TABLE IF EXISTS w_factures_direct;
CREATE TEMP TABLE w_factures_direct AS
SELECT
FACT_OID,
date(MAX(ECR_DATE)) AS ECR_DATE
FROM w_CPT_ECRITURE_source_OP_LINK
JOIN prod_web100t.CPT_COMPTES ON ECR_COMPTE = CPT_OID AND CPT_CODE LIKE '41%'
JOIN prod_web100t.FAC_FACTURE ON FACT_OID = ECR_REF_OID
JOIN w_last_direct ON ECR_DATE > LAST_ECR_DATE
JOIN activite[PX].p_sejours ON code_original = FACT_DA
WHERE LNK_ERROR = '' AND
ECR_TYPE IN ('CLIENT','VENTE-DEP') AND ECR_REF_TYPE = 'FACTURE' AND
LNK_JOURNAL = 'VE' AND
ECR_IS_ETS = 0
GROUP BY 1;
-- Mise à jour chiffrier
DROP TABLE IF EXISTS w_factures_comptables;
CREATE TEMP TABLE w_factures_comptables AS
SELECT FACT_NUMERO AS no_facture,
date(ECR_DATE) AS date_comptable,
SUM(0-FLT_TOTAL_TTC) AS montant_ventes_h
FROM prod_web100t.fac_fact_ligne_tier
JOIN prod_web100t.fac_facture on fac_facture.FACT_OID = FLT_FACTURE
JOIN w_factures_direct ON w_factures_direct.FACT_OID = FLT_FACTURE
WHERE FLT_IS_ETS = 0 AND FLT_IS_DIRECT = 1
GROUP BY 1,2
ORDER BY 1,2;
UPDATE activite[PX].p_factures_comptables
SET montant_ventes_h = p_factures_comptables.montant_ventes_h + w_factures_comptables.montant_ventes_h
FROM w_factures_comptables
WHERE p_factures_comptables.no_facture = w_factures_comptables.no_facture AND
p_factures_comptables.date_comptable = w_factures_comptables.date_comptable;
DROP TABLE IF EXISTS w_chiffrier_comptable;
CREATE TEMP TABLE w_chiffrier_comptable AS
SELECT date(ECR_DATE) AS date_comptable,
SUM(0-FLT_TOTAL_TTC) AS montant_ventes_h
FROM prod_web100t.fac_fact_ligne_tier
JOIN prod_web100t.fac_facture on fac_facture.FACT_OID = FLT_FACTURE
JOIN w_factures_direct ON w_factures_direct.FACT_OID = FLT_FACTURE
WHERE FLT_IS_ETS = 0 AND FLT_IS_DIRECT = 1
GROUP BY 1
ORDER BY 1;
UPDATE activite[PX].p_chiffrier_comptable
SET montant_ventes_h = p_chiffrier_comptable.montant_ventes_h + w_chiffrier_comptable.montant_ventes_h
FROM w_chiffrier_comptable
WHERE p_chiffrier_comptable.date_comptable = w_chiffrier_comptable.date_comptable;
]]>
= '[ENV_ADM_ANNEEDEBUT]0101'
;
ANALYSE w_CPT_OP_LINK_source
;
CREATE INDEX w_CPT_OP_LINK_source_ik_lnk_operation
ON w_CPT_OP_LINK_source
USING btree
(lnk_operation);
CREATE INDEX w_CPT_OP_LINK_source_ik_lnk_master_op
ON w_CPT_OP_LINK_source
USING btree
(lnk_master_op);
DROP TABLE IF EXISTS w_CPT_ECRITURE_source;
CREATE TEMP TABLE w_CPT_ECRITURE_source AS
SELECT *
FROM prod_web100t.CPT_ECRITURE
WHERE ECR_EF = ANY(SELECT ETS_EF_OID FROM w_NMCL_ETABLISSEMENT)
AND ECR_DATE >= '[ENV_ADM_ANNEEDEBUT]0101'
;
ANALYSE w_CPT_ECRITURE_source
;
CREATE INDEX w_CPT_ECRITURE_source_ik_ecr_operation
ON w_CPT_ECRITURE_source
USING btree
(ecr_operation);
DROP TABLE IF EXISTS w_CPT_ECRITURE_source_OP_LINK;
CREATE TEMP TABLE w_CPT_ECRITURE_source_OP_LINK AS
SELECT *,
0::bigint AS ECR_REF_FACT
FROM w_CPT_ECRITURE_source
JOIN w_CPT_OP_LINK_source ON ECR_OPERATION = LNK_OPERATION
;
ANALYSE w_CPT_ECRITURE_source_OP_LINK
;
CREATE INDEX w_CPT_ECRITURE_source_OP_LINK_ik_ecr_operation
ON w_CPT_ECRITURE_source_OP_LINK
USING btree
(ecr_operation)
;
UPDATE w_CPT_ECRITURE_source_OP_LINK
SET ECR_REF_OID = LNK_SOURCE_OID
WHERE ECR_OPERATION = LNK_OPERATION AND
LNK_TYPE IN ('FACT') AND
ECR_REF_TYPE = 'FACTURE' AND
ECR_REF_OID <> LNK_SOURCE_OID
;
DROP TABLE IF EXISTS w_CPT_ECRITURE_work;
CREATE TEMP TABLE w_CPT_ECRITURE_work AS
SELECT ECR_OPERATION, MAX(ECR_REF_DA) AS ECR_REF_DA
FROM w_CPT_ECRITURE_source_OP_LINK
WHERE ECR_REF_DA > 0
GROUP BY 1
HAVING count(DISTINCT ECR_REF_DA) = 1
;
ANALYSE w_CPT_ECRITURE_work
;
CREATE INDEX w_CPT_ECRITURE_work_ik_ecr_operation
ON w_CPT_ECRITURE_work
USING btree
(ECR_OPERATION)
;
UPDATE w_CPT_ECRITURE_source_OP_LINK
SET ECR_REF_DA = w_CPT_ECRITURE_work.ECR_REF_DA
FROM w_CPT_ECRITURE_work
WHERE w_CPT_ECRITURE_source_OP_LINK.ECR_OPERATION = w_CPT_ECRITURE_work.ECR_OPERATION AND
w_CPT_ECRITURE_source_OP_LINK.ECR_REF_DA = 0
;
DROP TABLE IF EXISTS w_CPT_ECRITURE_work;
CREATE TEMP TABLE w_CPT_ECRITURE_work AS
SELECT ECR_MASTER, MAX(ECR_REF_DA) AS ECR_REF_DA
FROM w_CPT_ECRITURE_source_OP_LINK
WHERE ECR_REF_DA > 0
GROUP BY 1
HAVING count(DISTINCT ECR_REF_DA) = 1
;
ANALYSE w_CPT_ECRITURE_work
;
CREATE INDEX w_CPT_ECRITURE_work_ik_ecr_master
ON w_CPT_ECRITURE_work
USING btree
(ECR_MASTER)
;
UPDATE w_CPT_ECRITURE_source_OP_LINK
SET ECR_REF_DA = w_CPT_ECRITURE_work.ECR_REF_DA
FROM w_CPT_ECRITURE_work
WHERE w_CPT_ECRITURE_source_OP_LINK.ECR_MASTER = w_CPT_ECRITURE_work.ECR_MASTER AND
w_CPT_ECRITURE_source_OP_LINK.ECR_REF_DA = 0
;
UPDATE w_CPT_ECRITURE_source_OP_LINK
SET ECR_REF_FACT = LNK_SOURCE_OID
WHERE LNK_SOURCE = 'FACTURE' AND
ECR_REF_OID <> LNK_SOURCE_OID
;
UPDATE w_CPT_ECRITURE_source_OP_LINK
SET ECR_REF_FACT = ECR_REF_OID
WHERE ECR_REF_TYPE = 'FACTURE' AND
ECR_REF_FACT = 0
;
UPDATE w_CPT_ECRITURE_source_OP_LINK
SET ECR_REF_FACT = FACT_OID
FROM prod_web100t.FAC_FACTURE
WHERE ECR_DETAILS LIKE 'Facture n?%' AND
substr(ECR_DETAILS,11,9) = lpad(FACT_NUMERO,9,'0') AND
ECR_REF_FACT = 0
;
UPDATE w_CPT_ECRITURE_source_OP_LINK
SET ECR_REF_FACT = FACT_OID
FROM prod_web100t.FAC_FACTURE
WHERE ECR_REF_KEY LIKE 'F%' AND
substr(ECR_REF_KEY,2) = FACT_OID::text AND
ECR_REF_DA = FACT_DA AND
ECR_REF_FACT = 0
;
DROP TABLE IF EXISTS w_CPT_ECRITURE_work;
CREATE TEMP TABLE w_CPT_ECRITURE_work AS
SELECT ECR_OPERATION, ECR_REF_DA, MAX(ECR_REF_FACT) AS ECR_REF_FACT
FROM w_CPT_ECRITURE_source_OP_LINK
WHERE ECR_REF_FACT > 0
GROUP BY 1,2
HAVING count(DISTINCT ECR_REF_FACT) = 1
;
ANALYSE w_CPT_ECRITURE_work
;
CREATE INDEX w_CPT_ECRITURE_work_ik_ecr_operation
ON w_CPT_ECRITURE_work
USING btree
(ECR_OPERATION)
;
ANALYSE w_CPT_ECRITURE_source_OP_LINK
;
UPDATE w_CPT_ECRITURE_source_OP_LINK
SET ECR_REF_FACT = w_CPT_ECRITURE_work.ECR_REF_FACT
FROM w_CPT_ECRITURE_work
WHERE w_CPT_ECRITURE_source_OP_LINK.ECR_OPERATION = w_CPT_ECRITURE_work.ECR_OPERATION AND
w_CPT_ECRITURE_source_OP_LINK.ECR_REF_DA = w_CPT_ECRITURE_work.ECR_REF_DA AND
w_CPT_ECRITURE_source_OP_LINK.ECR_REF_FACT = 0
;
UPDATE w_CPT_ECRITURE_source_OP_LINK
SET ECR_TYPE = 'VENTE-DEP'
WHERE ECR_TYPE = 'VENTE_DEP'
;
UPDATE w_CPT_ECRITURE_source_OP_LINK
SET ECR_TYPE = 'VENTE-HON'
WHERE ECR_TYPE = 'VENTE_HON'
;
UPDATE w_CPT_ECRITURE_source_OP_LINK
SET ECR_TYPE = 'VENTE-DIRECTE'
WHERE ECR_TYPE = 'VENTE_DIRECTE'
;
ANALYSE w_CPT_ECRITURE_source_OP_LINK
;
CREATE INDEX w_cpt_ecriture_op_link_ik_ecr_compte
ON w_CPT_ECRITURE_source_OP_LINK
USING btree
(ecr_compte);
CREATE INDEX w_cpt_ecriture_op_link_ik_ecr_ref_oid
ON w_CPT_ECRITURE_source_OP_LINK
USING btree
(ecr_ref_oid);
CREATE INDEX w_cpt_ecriture_op_link_ik_ecr_data
ON w_CPT_ECRITURE_source_OP_LINK
USING btree
(ecr_data);
CREATE INDEX w_cpt_ecriture_op_link_ik_ECR_REF_DA
ON w_CPT_ECRITURE_source_OP_LINK
USING btree
(ECR_REF_DA);
CREATE INDEX w_cpt_ecriture_op_link_ik_ECR_REF_FACT
ON w_CPT_ECRITURE_source_OP_LINK
USING btree
(ECR_REF_FACT);
CREATE INDEX w_cpt_ecriture_op_link_ik_LNK_JOURNAL
ON w_CPT_ECRITURE_source_OP_LINK
USING btree
(LNK_JOURNAL);
-- Correction tiers dans les comptes car dans certains cas, ils ne correspondent pas aux factures
UPDATE prod_web100t.CPT_COMPTES
SET CPT_REF = subview.FT_ORGANISME
FROM
(
SELECT ECR_COMPTE, CPT_CODE, CPT_COMPTES.CPT_REF, MAX(FT_ORGANISME) AS FT_ORGANISME
FROM w_CPT_ECRITURE_source_OP_LINK
JOIN prod_web100t.CPT_COMPTES ON ECR_COMPTE = CPT_OID
JOIN prod_web100t.FAC_FACT_TIER ON ECR_REF_FTIERS = FT_OID
WHERE CPT_COMPTES.CPT_REF_TYPE = 'AMC'
GROUP BY 1,2,3
HAVING MAX(CASE WHEN CPT_COMPTES.CPT_REF <> FT_ORGANISME THEN '1' ELSE '0' END) = '1' AND
count(DISTINCT FT_ORGANISME) = 1
ORDER BY 1,2,3
) subview
WHERE CPT_COMPTES.CPT_OID = ECR_COMPTE
;
--
DROP TABLE IF EXISTS w_REGUL_MOUVEMENTS_source;
CREATE TEMP TABLE w_REGUL_MOUVEMENTS_source AS
SELECT *
FROM prod_web100t.REGUL_MOUVEMENTS
WHERE MVT_SEJ_OID = ANY(SELECT PHASE_OID FROM prod_web100t.DAT_SEJOUR WHERE SEJ_DA = ANY(SELECT DA_OID FROM prod_web100t.DAT_DA WHERE DA_EG_ENTREE = ANY(SELECT ets_oid FROM w_NMCL_ETABLISSEMENT)))
;
ANALYSE w_REGUL_MOUVEMENTS_source
;
CREATE INDEX w_REGUL_MOUVEMENTS_source_ik_MVT_SEJ_OID
ON w_REGUL_MOUVEMENTS_source
USING btree
(MVT_SEJ_OID);
--
INSERT INTO activite.t_divers (code, texte, valeur, description)
SELECT
'WEB100T_ETAGE',
'Traitement étage WEB100T ',
'0',
'1 = Prendre UF GEO dans mouvements (pas dans chambres)'
WHERE 'WEB100T_ETAGE' NOT IN (SELECT code FROM activite.t_divers);
-- UF chambre selon mouvements
UPDATE prod_web100t.CHAMBRES
SET CHA_UF = MVT_UF_GEO
FROM (
SELECT MVT_CHAMBRE, (MAX(ARRAY[MVT_DATE::text,MVT_UF_GEO::text]))[2]::bigint AS MVT_UF_GEO
FROM w_REGUL_MOUVEMENTS_source REGUL_MOUVEMENTS
JOIN activite.t_divers ON t_divers.code = 'WEB100T_ETAGE' AND t_divers.valeur ='1'
WHERE MVT_TYPE IN (1,4) AND
MVT_CHAMBRE <> 0
GROUP BY 1
) subview
WHERE CHA_OID = MVT_CHAMBRE
;
]]>
'00';
INSERT INTO activite[PX].t_tiers_payant(code_original, code, type_tiers_payant, texte, texte_court)
SELECT NMCL_AMC.OID::bigint, w_SGN_NMCL_DATA.ND_CODE, '2', w_SGN_NMCL_DATA.ND_LIB, w_SGN_NMCL_DATA.ND_LIB
FROM prod_web100t.NMCL_AMC
JOIN w_SGN_NMCL_DATA ON w_SGN_NMCL_DATA.ND_INVARIANT_OID = OID
WHERE NMCL_IDENT = 'AMC' AND NMCL_AMC.OID::bigint NOT IN (SELECT code_original FROM activite[PX].t_tiers_payant);
-- Dans certains cas, les tiers ne sont pas dans NMCL_DATA
INSERT INTO activite[PX].t_tiers_payant(code_original, code, type_tiers_payant, texte, texte_court)
SELECT NMCL_AMC.OID::bigint, MAX(CPT_AUXILIAIRE), '2', MAX(CPT_LIB), MAX(CPT_LIB)
FROM prod_web100t.NMCL_AMC
JOIN prod_web100t.CPT_COMPTES ON CPT_REF_TYPE = 'AMC' AND CPT_REF = NMCL_AMC.OID
WHERE NMCL_AMC.OID::bigint NOT IN (SELECT code_original FROM activite[PX].t_tiers_payant)
GROUP BY 1;
UPDATE activite[PX].t_tiers_payant SET
code = w_SGN_NMCL_DATA.ND_CODE,
texte = w_SGN_NMCL_DATA.ND_LIB,
texte_court = w_SGN_NMCL_DATA.ND_LIB
FROM prod_web100t.NMCL_AMO
JOIN w_SGN_NMCL_DATA ON w_SGN_NMCL_DATA.ND_INVARIANT_OID = OID
WHERE NMCL_AMO.OID::bigint = code_original AND
(
code IS DISTINCT FROM w_SGN_NMCL_DATA.ND_CODE OR
texte IS DISTINCT FROM w_SGN_NMCL_DATA.ND_LIB OR
texte_court IS DISTINCT FROM w_SGN_NMCL_DATA.ND_LIB
)
;
UPDATE activite[PX].t_tiers_payant SET
code = w_SGN_NMCL_DATA.ND_CODE,
texte = w_SGN_NMCL_DATA.ND_LIB,
texte_court = w_SGN_NMCL_DATA.ND_LIB
FROM prod_web100t.NMCL_AMC
JOIN w_SGN_NMCL_DATA ON w_SGN_NMCL_DATA.ND_INVARIANT_OID = OID
WHERE NMCL_AMC.OID::bigint = code_original AND
(
code IS DISTINCT FROM w_SGN_NMCL_DATA.ND_CODE OR
texte IS DISTINCT FROM w_SGN_NMCL_DATA.ND_LIB OR
texte_court IS DISTINCT FROM w_SGN_NMCL_DATA.ND_LIB
)
;
-- Adresses des tiers payant
INSERT INTO base.t_codes_postaux(code, texte, texte_court, departement_id)
SELECT FLD_CODEPOSTAL, MAX(FLD_COMMUNE), MAX(FLD_COMMUNE), MAX(t_departements.oid)
FROM prod_web100t.NMCL_AMO
LEFT JOIN base.t_codes_postaux ON FLD_CODEPOSTAL = t_codes_postaux.code
JOIN base.t_departements ON
FLD_CODEPOSTAL NOT LIKE '97%' AND substr(FLD_CODEPOSTAL,1,2) = t_departements.code OR
FLD_CODEPOSTAL LIKE '97%' AND substr(FLD_CODEPOSTAL,1,3) = t_departements.code
WHERE t_codes_postaux.oid IS NULL AND
FLD_CODEPOSTAL <> '' AND
length(FLD_CODEPOSTAL) = 5
GROUP BY 1
;
UPDATE activite[PX].t_tiers_payant SET
adresse = FLD_ADRESSE1 || ' ' || FLD_ADRESSE2 || ' ' || FLD_ADRESSE3,
code_postal_id = COALESCE(t_codes_postaux.oid,0),
ville = FLD_COMMUNE,
telephone = FLD_TELEPHONE,
fax = FLD_FAX,
email = FLD_EMAIL
FROM prod_web100t.NMCL_AMO
LEFT JOIN base.t_codes_postaux ON FLD_CODEPOSTAL = t_codes_postaux.code
WHERE t_tiers_payant.code_original = NMCL_AMO.OID::bigint AND
(
adresse IS DISTINCT FROM (FLD_ADRESSE1 || ' ' || FLD_ADRESSE2 || ' ' || FLD_ADRESSE3) OR
code_postal_id IS DISTINCT FROM COALESCE(t_codes_postaux.oid,0) OR
ville IS DISTINCT FROM FLD_COMMUNE OR
telephone IS DISTINCT FROM FLD_TELEPHONE OR
fax IS DISTINCT FROM FLD_FAX OR
email IS DISTINCT FROM FLD_EMAIL
)
;
INSERT INTO base.t_codes_postaux(code, texte, texte_court, departement_id)
SELECT FLD_CODEPOSTAL, MAX(FLD_COMMUNE), MAX(FLD_COMMUNE), MAX(t_departements.oid)
FROM prod_web100t.NMCL_AMC
LEFT JOIN base.t_codes_postaux ON FLD_CODEPOSTAL = t_codes_postaux.code
JOIN base.t_departements ON
FLD_CODEPOSTAL NOT LIKE '97%' AND substr(FLD_CODEPOSTAL,1,2) = t_departements.code OR
FLD_CODEPOSTAL LIKE '97%' AND substr(FLD_CODEPOSTAL,1,3) = t_departements.code
WHERE t_codes_postaux.oid IS NULL AND
FLD_CODEPOSTAL <> '' AND
length(FLD_CODEPOSTAL) = 5
GROUP BY 1
;
UPDATE activite[PX].t_tiers_payant SET
adresse = FLD_ADRESSE1 || ' ' || FLD_ADRESSE2 || ' ' || FLD_ADRESSE3,
code_postal_id = COALESCE(t_codes_postaux.oid,0),
ville = FLD_COMMUNE,
telephone = FLD_TELEPHONE,
fax = FLD_FAX,
email = FLD_EMAIL
FROM prod_web100t.NMCL_AMC
LEFT JOIN base.t_codes_postaux ON FLD_CODEPOSTAL = t_codes_postaux.code
WHERE t_tiers_payant.code_original = NMCL_AMC.OID::bigint AND
(
adresse IS DISTINCT FROM (FLD_ADRESSE1 || ' ' || FLD_ADRESSE2 || ' ' || FLD_ADRESSE3) OR
code_postal_id IS DISTINCT FROM COALESCE(t_codes_postaux.oid,0) OR
ville IS DISTINCT FROM FLD_COMMUNE OR
telephone IS DISTINCT FROM FLD_TELEPHONE OR
fax IS DISTINCT FROM FLD_FAX OR
email IS DISTINCT FROM FLD_EMAIL
)
;
]]>
'' THEN FLD_NOM ELSE TRIM(REPLACE(w_SGN_NMCL_DATA.ND_LIB, FLD_PRENOM, '')) END) AS FLD_NOM_SOUNDEX,
base.cti_soundex_nom(FLD_PRENOM) AS FLD_PRENOM_SOUNDEX,
CASE WHEN FLD_NOM <> '' THEN FLD_NOM ELSE TRIM(REPLACE(w_SGN_NMCL_DATA.ND_LIB, FLD_PRENOM, '')) END AS FLD_NOM,
FLD_PRENOM,
FLD_CODEADELI,
FLD_SPECIALITE,
COALESCE(SUBSTR(w_SGN_NMCL_DATA_spe.ND_CODE,1,10),'') AS FLD_SPECIALITE_CODE,
COALESCE(t_medecins_administratifs.medecin_id,0) as medecin_id,
FLD_CODERPPS
FROM prod_web100t.NMCL_INTERVENANT
JOIN w_SGN_NMCL_DATA ON w_SGN_NMCL_DATA.ND_INVARIANT_OID = OID AND w_SGN_NMCL_DATA.NMCL_IDENT = 'INTERVENANT'
LEFT JOIN w_SGN_NMCL_DATA w_SGN_NMCL_DATA_spe ON FLD_SPECIALITE = w_SGN_NMCL_DATA_spe.ND_INVARIANT_OID
LEFT JOIN activite[PX].t_medecins_administratifs ON NMCL_INTERVENANT.OID::bigint = t_medecins_administratifs.code_original;
INSERT INTO w_medecins (
NMCL_INTERVENANT_OID
,ND_CODE
,FLD_NOM_SOUNDEX
,FLD_PRENOM_SOUNDEX
,FLD_NOM
,FLD_PRENOM
,FLD_CODEADELI
,FLD_SPECIALITE
,FLD_SPECIALITE_CODE
,medecin_id
,FLD_CODERPPS
)
SELECT w_SGN_NMCL_DATA.ND_INVARIANT_OID::bigint
,w_SGN_NMCL_DATA.ND_CODE
,base.cti_soundex_nom(w_SGN_NMCL_DATA.ND_LIB)
,base.cti_soundex_nom('') AS FLD_PRENOM_SOUNDEX
,w_SGN_NMCL_DATA.ND_LIB AS FLD_NOM
,''::text AS FLD_PRENOM
,''::text AS FLD_CODEADELI
,0 AS FLD_SPECIALITE
,''
,COALESCE(t_medecins_administratifs.medecin_id,0) as medecin_id
,NULL
FROM w_SGN_NMCL_DATA
LEFT JOIN activite[PX].t_medecins_administratifs ON w_SGN_NMCL_DATA.ND_INVARIANT_OID::bigint = t_medecins_administratifs.code_original
WHERE NMCL_IDENT IN ('ENTITEFACTURATION','ETABLISSEMENT')
;
INSERT INTO base.t_medecins(nom, prenom, numero_ordre, code_rpps, specialite_id)
SELECT w_medecins.FLD_NOM, w_medecins.FLD_PRENOM, w_medecins.FLD_CODEADELI, w_medecins.FLD_CODERPPS, 0 FROM
(SELECT SUBSTR(FLD_NOM_SOUNDEX, 1, 8) AS FLD_NOM_SOUNDEX, SUBSTR(FLD_PRENOM_SOUNDEX, 1, 8) AS FLD_PRENOM_SOUNDEX, FLD_CODEADELI, FLD_CODERPPS, MIN(NMCL_INTERVENANT_OID) AS NMCL_INTERVENANT_OID
FROM w_medecins
GROUP BY 1,2,3,4) subview, w_medecins
WHERE w_medecins.NMCL_INTERVENANT_OID = subview.NMCL_INTERVENANT_OID
AND subview.FLD_NOM_SOUNDEX || ',' || subview.FLD_PRENOM_SOUNDEX || ',' || subview.FLD_CODEADELI NOT IN
(SELECT substr(base.cti_soundex_nom(nom),1,8) || ',' || substr(base.cti_soundex_nom(prenom),1,8) || ',' || numero_ordre FROM base.t_medecins);
INSERT INTO base.t_medecins(nom, prenom, numero_ordre, code_rpps, specialite_id)
SELECT w_medecins.FLD_NOM, w_medecins.FLD_PRENOM, w_medecins.FLD_CODEADELI, w_medecins.FLD_CODERPPS, 0 FROM
(SELECT FLD_NOM_SOUNDEX, FLD_PRENOM_SOUNDEX, MIN(NMCL_INTERVENANT_OID) AS NMCL_INTERVENANT_OID
FROM w_medecins
GROUP BY 1,2) subview, w_medecins
WHERE w_medecins.NMCL_INTERVENANT_OID = subview.NMCL_INTERVENANT_OID
AND subview.FLD_NOM_SOUNDEX || ',' || subview.FLD_PRENOM_SOUNDEX NOT IN
(SELECT base.cti_soundex_nom(nom) || ',' || base.cti_soundex_nom(prenom) FROM base.t_medecins);
UPDATE w_medecins SET medecin_id = subview.medecin_id
FROM
(SELECT substr(base.cti_soundex_nom(nom),1,8) as nom , substr(base.cti_soundex_nom(prenom),1,8) as prenom, numero_ordre, MIN(oid) AS medecin_id FROM base.t_medecins GROUP BY 1,2,3) subview
WHERE SUBSTR(FLD_NOM_SOUNDEX, 1, 8) = subview.nom
AND SUBSTR(FLD_PRENOM_SOUNDEX, 1, 8) = subview.prenom
AND FLD_CODEADELI = subview.numero_ordre
AND w_medecins.medecin_id = 0;
UPDATE w_medecins SET medecin_id = subview.medecin_id
FROM
(SELECT base.cti_soundex_nom(nom) as nom , base.cti_soundex_nom(prenom) as prenom, MIN(oid) AS medecin_id FROM base.t_medecins GROUP BY 1,2) subview
WHERE SUBSTR(FLD_NOM_SOUNDEX, 1, 8) = subview.nom
AND SUBSTR(FLD_PRENOM_SOUNDEX, 1, 8) = subview.prenom
AND w_medecins.medecin_id = 0;
INSERT INTO activite[PX].t_medecins_administratifs(code_original, code, nom, prenom, specialite_id, medecin_id)
SELECT DISTINCT NMCL_INTERVENANT_OID, ND_CODE, FLD_NOM, FLD_PRENOM, COALESCE(t_specialites_medecin.oid,0), medecin_id
FROM w_medecins
LEFT JOIN base.t_specialites_medecin ON (FLD_SPECIALITE::bigint = t_specialites_medecin.code_original)
WHERE NMCL_INTERVENANT_OID NOT IN (SELECT code_original FROM activite[PX].t_medecins_administratifs);
UPDATE activite[PX].t_medecins_administratifs SET
code = ND_CODE,
nom = FLD_NOM,
prenom = FLD_PRENOM
FROM w_medecins
WHERE t_medecins_administratifs.code_original = NMCL_INTERVENANT_OID AND
(
code IS DISTINCT FROM ND_CODE OR
nom IS DISTINCT FROM FLD_NOM OR
prenom IS DISTINCT FROM FLD_PRENOM
)
;
UPDATE activite[PX].t_medecins_administratifs
SET code = ND_CODE,
nom = FLD_NOM,
prenom = FLD_PRENOM,
specialite_id = COALESCE(t_specialites_medecin.oid,0),
medecin_id = w_medecins.medecin_id,
no_adeli = FLD_CODEADELI,
code_rpps = FLD_CODERPPS
FROM w_medecins LEFT JOIN base.t_specialites_medecin ON (FLD_SPECIALITE_CODE = t_specialites_medecin.code)
WHERE w_medecins.NMCL_INTERVENANT_OID = t_medecins_administratifs.code_original
AND (
t_medecins_administratifs.code IS DISTINCT FROM ND_CODE OR
t_medecins_administratifs.nom IS DISTINCT FROM FLD_NOM OR
t_medecins_administratifs.prenom IS DISTINCT FROM FLD_PRENOM OR
t_medecins_administratifs.specialite_id IS DISTINCT FROM COALESCE(t_specialites_medecin.oid,0) OR
t_medecins_administratifs.medecin_id IS DISTINCT FROM w_medecins.medecin_id OR
t_medecins_administratifs.no_adeli IS DISTINCT FROM w_medecins.FLD_CODEADELI OR
t_medecins_administratifs.code_rpps IS DISTINCT FROM w_medecins.FLD_CODERPPS
);
UPDATE base.t_medecins SET specialite_id = subview.specialite_id FROM
(SELECT t_medecins.oid, MIN(t_medecins_administratifs.specialite_id) as specialite_id
FROM base.t_medecins, activite[PX].t_medecins_administratifs , base.t_specialites_medecin
WHERE t_medecins.oid = t_medecins_administratifs.medecin_id AND
t_medecins_administratifs.specialite_id = t_specialites_medecin.oid AND
t_medecins_administratifs.specialite_id <> 0
GROUP BY t_medecins.oid) subview
WHERE t_medecins.oid = subview.oid AND t_medecins.oid <> 0 AND t_medecins.specialite_id = 0;
-- Code RPPS
UPDATE base.t_medecins
SET code_rpps = subview.RPPS
FROM
(
SELECT medecin_id, count(DISTINCT FLD_CODERPPS), MAX(FLD_CODERPPS) AS RPPS
FROM activite[PX].t_medecins_administratifs
JOIN base.t_medecins ON t_medecins_administratifs.medecin_id = t_medecins.oid
JOIN prod_web100t.NMCL_INTERVENANT ON code_original = NMCL_INTERVENANT.OID
WHERE FLD_CODERPPS <> '' AND
length(FLD_CODERPPS) = 11 AND
t_medecins.code_rpps = '' AND
medecin_id <> 0
GROUP BY 1
HAVING count(DISTINCT FLD_CODERPPS) = 1
) subview
WHERE t_medecins.oid = subview.medecin_id
;
-- adresse
INSERT INTO base.t_codes_postaux(code, texte, texte_court, departement_id)
SELECT FLD_CODEPOSTAL, MAX(FLD_COMMUNE), MAX(FLD_COMMUNE), MAX(t_departements.oid)
FROM prod_web100t.NMCL_INTERVENANT
LEFT JOIN base.t_codes_postaux ON FLD_CODEPOSTAL = t_codes_postaux.code
JOIN base.t_departements ON
FLD_CODEPOSTAL NOT LIKE '97%' AND substr(FLD_CODEPOSTAL,1,2) = t_departements.code OR
FLD_CODEPOSTAL LIKE '97%' AND substr(FLD_CODEPOSTAL,1,3) = t_departements.code
WHERE t_codes_postaux.oid IS NULL AND
FLD_CODEPOSTAL <> '' AND
length(FLD_CODEPOSTAL) = 5
GROUP BY 1
;
UPDATE activite[PX].t_medecins_administratifs SET
adresse = FLD_ADRESSE1 || ' ' || FLD_ADRESSE2 || ' ' || FLD_ADRESSE3,
code_postal_id = COALESCE(t_codes_postaux.oid,0),
ville = FLD_COMMUNE,
telephone = FLD_TELEPHONE,
fax = FLD_FAX,
email = FLD_EMAIL
FROM prod_web100t.NMCL_INTERVENANT
LEFT JOIN base.t_codes_postaux ON FLD_CODEPOSTAL = t_codes_postaux.code
WHERE t_medecins_administratifs.code_original = NMCL_INTERVENANT.OID::bigint AND
(
adresse IS DISTINCT FROM (FLD_ADRESSE1 || ' ' || FLD_ADRESSE2 || ' ' || FLD_ADRESSE3) OR
code_postal_id IS DISTINCT FROM COALESCE(t_codes_postaux.oid,0) OR
ville IS DISTINCT FROM FLD_COMMUNE OR
telephone IS DISTINCT FROM FLD_TELEPHONE OR
fax IS DISTINCT FROM FLD_FAX OR
email IS DISTINCT FROM FLD_EMAIL
)
;
DROP TABLE IF EXISTS w_NMCL_INTERVENANT;
CREATE TEMP TABLE w_NMCL_INTERVENANT AS
SELECT NODE_OID, NMCL_INTERVENANT.OID, COALESCE(t_medecins_administratifs.oid,0) AS medecin_administratif_id
FROM prod_web100t.SGN_TREE_NODES
JOIN prod_web100t.NMCL_INTERVENANT ON NODE_INVARIANT_OID = NMCL_INTERVENANT.OID
JOIN w_SGN_NMCL_DATA ON w_SGN_NMCL_DATA.ND_INVARIANT_OID = OID AND NMCL_IDENT = 'INTERVENANT'
JOIN activite[PX].t_medecins_administratifs ON NMCL_INTERVENANT.OID = code_original;
INSERT INTO w_NMCL_INTERVENANT
SELECT NODE_OID, NODE_INVARIANT_OID, COALESCE(t_medecins_administratifs.oid,0) AS medecin_administratif_id
FROM prod_web100t.SGN_TREE_NODES
JOIN w_SGN_NMCL_DATA ON w_SGN_NMCL_DATA.ND_INVARIANT_OID = NODE_INVARIANT_OID AND NMCL_IDENT IN ('ENTITEFACTURATION','ETABLISSEMENT')
JOIN activite[PX].t_medecins_administratifs ON NODE_INVARIANT_OID = code_original;
CREATE INDEX w_NMCL_INTERVENANT_i1
ON w_NMCL_INTERVENANT
USING btree
(NODE_OID);
]]>
0
LEFT JOIN w_SGN_NMCL_DATA SGN_NMCL_DATA_DMT ON FLD_DMT = SGN_NMCL_DATA_DMT.ND_INVARIANT_OID AND FLD_DMT <> 0
LEFT JOIN base.t_modes_traitement ON SGN_NMCL_DATA_MT.ND_CODE = t_modes_traitement.code
LEFT JOIN base.t_dmt ON SGN_NMCL_DATA_DMT.ND_CODE = t_dmt.code
WHERE COALESCE(t_modes_traitement.oid,0) <> 0 OR COALESCE(t_dmt.oid,0) <> 0
) subview
WHERE code_original = subview.OID AND (t_services_facturation.mode_traitement_id = 0 OR t_services_facturation.dmt_id = 0);
UPDATE activite[PX].t_services_facturation SET
code = w_SGN_NMCL_DATA.ND_CODE,
texte = w_SGN_NMCL_DATA.ND_LIB,
texte_court = w_SGN_NMCL_DATA.ND_LIB
FROM prod_web100t.NMCL_UNITEFONCTIONNELLE
JOIN w_SGN_NMCL_DATA ON w_SGN_NMCL_DATA.ND_INVARIANT_OID = NMCL_UNITEFONCTIONNELLE.OID
WHERE NMCL_UNITEFONCTIONNELLE.OID::bigint = code_original AND
(
code IS DISTINCT FROM w_SGN_NMCL_DATA.ND_CODE OR
texte IS DISTINCT FROM w_SGN_NMCL_DATA.ND_LIB OR
texte_court IS DISTINCT FROM w_SGN_NMCL_DATA.ND_LIB
)
;
-- Unités fonctionnelles
INSERT INTO activite[PX].t_unites_fonctionnelles(oid, code_original, code, texte, texte_court)
SELECT 0, 0, '', 'Non renseignée', 'Non renseignée' WHERE 0 NOT IN (SELECT oid FROM activite[PX].t_unites_fonctionnelles);
INSERT INTO activite[PX].t_unites_fonctionnelles(code_original, code, texte, texte_court)
SELECT OID::bigint, ND_CODE, ND_LIB, ND_LIB
FROM prod_web100t.NMCL_UNITEFONCTIONNELLE
JOIN w_SGN_NMCL_DATA ON ND_INVARIANT_OID = OID
WHERE NMCL_IDENT = 'UNITEFONCTIONNELLE' AND
OID::bigint NOT IN (SELECT code_original FROM activite[PX].t_unites_fonctionnelles)
ORDER BY ND_CODE;
UPDATE activite[PX].t_unites_fonctionnelles SET
code = w_SGN_NMCL_DATA.ND_CODE,
texte = w_SGN_NMCL_DATA.ND_LIB,
texte_court = w_SGN_NMCL_DATA.ND_LIB
FROM prod_web100t.NMCL_UNITEFONCTIONNELLE
JOIN w_SGN_NMCL_DATA ON w_SGN_NMCL_DATA.ND_INVARIANT_OID = NMCL_UNITEFONCTIONNELLE.OID
WHERE NMCL_UNITEFONCTIONNELLE.OID::bigint = code_original AND
(
code IS DISTINCT FROM w_SGN_NMCL_DATA.ND_CODE OR
texte IS DISTINCT FROM w_SGN_NMCL_DATA.ND_LIB OR
texte_court IS DISTINCT FROM w_SGN_NMCL_DATA.ND_LIB
)
;
-- Unités médicales
INSERT INTO activite[PX].t_unites_medicales(oid, code_original, code, texte, texte_court)
SELECT 0, 0, '', 'Non renseignée', 'Non renseignée' WHERE 0 NOT IN (SELECT oid FROM activite[PX].t_unites_medicales);
INSERT INTO activite[PX].t_unites_medicales(code_original, code, texte, texte_court)
SELECT OID::bigint, ND_CODE, ND_LIB, ND_LIB
FROM prod_web100t.NMCL_UNITEMEDICALE
JOIN w_SGN_NMCL_DATA ON ND_INVARIANT_OID = OID
WHERE NMCL_IDENT = 'UNITEMEDICALE' AND
OID::bigint NOT IN (SELECT code_original FROM activite[PX].t_unites_medicales)
ORDER BY ND_CODE;
UPDATE activite[PX].t_unites_medicales SET
code = w_SGN_NMCL_DATA.ND_CODE,
texte = w_SGN_NMCL_DATA.ND_LIB,
texte_court = w_SGN_NMCL_DATA.ND_LIB
FROM prod_web100t.NMCL_UNITEMEDICALE
JOIN w_SGN_NMCL_DATA ON w_SGN_NMCL_DATA.ND_INVARIANT_OID = NMCL_UNITEMEDICALE.OID
WHERE NMCL_UNITEMEDICALE.OID::bigint = code_original AND
(
code IS DISTINCT FROM w_SGN_NMCL_DATA.ND_CODE OR
texte IS DISTINCT FROM w_SGN_NMCL_DATA.ND_LIB OR
texte_court IS DISTINCT FROM w_SGN_NMCL_DATA.ND_LIB
)
;
-- Activités
INSERT INTO activite[PX].t_activites(oid, code_original, code, texte, texte_court)
SELECT 0, 0, '', 'Non renseignée', 'Non renseignée' WHERE 0 NOT IN (SELECt oid FROM activite[PX].t_activites);
--Traitements des spécialités
INSERT INTO w_SGN_NMCL_DATA (NMCL_IDENT, ND_CODE, ND_OID, ND_INVARIANT_OID, ND_LIB)
SELECT DISTINCT ON (ND_LIB)
NMCL_IDENT
,ND_CODE
,null
,ND_INVARIANT_OID
,ND_LIB
FROM prod_web100t.SGN_NMCL_DATA
JOIN prod_web100t.SGN_NMCLS ON ND_NMCL_OID = NMCL_OID
WHERE NMCL_IDENT = 'SPECIALITE'
ORDER BY ND_LIB, ND_VALIDE_DE, ND_INVARIANT_OID DESC
;
-- Modification du code_original des spécialités déjà présentes dans CTI
UPDATE activite[PX].t_activites
SET code_original = ND_INVARIANT_OID
FROM w_SGN_NMCL_DATA
WHERE
NMCL_IDENT = 'SPECIALITE'
AND activite[PX].t_activites.code = substr(ND_CODE,1,10)
AND activite[PX].t_activites.code_original <> ND_INVARIANT_OID
;
-- Insertion des nouvelles spécialités
INSERT INTO activite[PX].t_activites(code_original, code, texte, texte_court)
SELECT ND_INVARIANT_OID, substr(ND_CODE,1,10), ND_LIB, ND_LIB
FROM w_SGN_NMCL_DATA
LEFT JOIN activite[PX].t_activites ON t_activites.code_original = ND_INVARIANT_OID
WHERE NMCL_IDENT = 'SPECIALITE'
AND t_activites.code_original IS NULL
AND NOT EXISTS (SELECT 1 FROM activite[PX].t_activites WHERE t_activites.code = substr(w_SGN_NMCL_DATA.ND_CODE,1,10))
ORDER BY ND_CODE;
-- Correction car avant, le code_original pouvait être doublé.
DELETE FROM activite[PX].t_activites
USING(
SELECT code_original, MIN(oid) AS keep_oid
FROM activite[PX].t_activites
GROUP BY 1
HAVING count(*) > 1
) subview
WHERE t_activites.code_original = subview.code_original AND
t_activites.oid <> keep_oid
;
UPDATE activite[PX].t_activites SET
code = substr(ND_CODE,1,10),
texte = ND_LIB,
texte_court = ND_LIB
FROM w_SGN_NMCL_DATA
WHERE ND_INVARIANT_OID = t_activites.code_original AND
(
t_activites.code IS DISTINCT FROM substr(w_SGN_NMCL_DATA.ND_CODE,1,10) OR
t_activites.texte IS DISTINCT FROM w_SGN_NMCL_DATA.ND_LIB OR
t_activites.texte_court IS DISTINCT FROM w_SGN_NMCL_DATA.ND_LIB
)
;
-- Etages et lits
INSERT INTO activite[PX].t_etages(oid, code_original, code, texte, texte_court, nb_lits)
SELECT 0, 0, '', 'Non renseigné', 'Non renseigné', 0 WHERE 0 NOT IN (SELECT oid FROM activite[PX].t_etages);
UPDATE prod_web100t.CHAMBRES
SET CHA_UF = NODE_INVARIANT_OID
FROM prod_web100t.SGN_TREE_NODES
WHERE CHA_UF = 0 AND
CHA_LIEU = NODE_OID;
-- Avec lit
INSERT INTO activite[PX].t_etages(code_original, code, texte, texte_court)
SELECT CHA_UF::bigint,ND_CODE, ND_LIB , ND_LIB
FROM prod_web100t.CHAMBRES
JOIN w_SGN_NMCL_DATA ON CHA_UF = ND_INVARIANT_OID
WHERE NMCL_IDENT = 'UNITEFONCTIONNELLE' AND
CHA_UF::bigint NOT IN (SELECT code_original FROM activite[PX].t_etages)
GROUP BY 1,2,3,4
ORDER BY ND_CODE;
-- Sans lit
INSERT INTO activite[PX].t_etages(code_original, code, texte, texte_court)
SELECT MVT_UF_GEO::bigint,ND_CODE, ND_LIB , ND_LIB
FROM w_REGUL_MOUVEMENTS_source REGUL_MOUVEMENTS
JOIN w_SGN_NMCL_DATA ON MVT_UF_GEO = ND_INVARIANT_OID
WHERE NMCL_IDENT = 'UNITEFONCTIONNELLE' AND
MVT_LIT = 0 AND
MVT_UF_GEO::bigint NOT IN (SELECT code_original FROM activite[PX].t_etages)
GROUP BY 1,2,3,4
ORDER BY ND_CODE;
UPDATE activite[PX].t_etages SET
code = w_SGN_NMCL_DATA.ND_CODE,
texte = w_SGN_NMCL_DATA.ND_LIB,
texte_court = w_SGN_NMCL_DATA.ND_LIB
FROM w_REGUL_MOUVEMENTS_source REGUL_MOUVEMENTS
JOIN w_SGN_NMCL_DATA ON w_SGN_NMCL_DATA.ND_INVARIANT_OID = REGUL_MOUVEMENTS.MVT_UF_GEO
WHERE REGUL_MOUVEMENTS.MVT_UF_GEO::bigint = code_original AND
(
code IS DISTINCT FROM w_SGN_NMCL_DATA.ND_CODE OR
texte IS DISTINCT FROM w_SGN_NMCL_DATA.ND_LIB OR
texte_court IS DISTINCT FROM w_SGN_NMCL_DATA.ND_LIB
)
;
-- Les codes lits peuvent changer
UPDATE activite[PX].t_lits SET
code = LIT_CODE,
texte = CASE WHEN LIT_DESCR <> '' THEN LIT_DESCR ELSE CHA_CODE || CASE WHEN LIT_CODE <> CHA_CODE THEN '. ' || LIT_CODE ELSE '' END END,
texte_court = CASE WHEN LIT_DESCR <> '' THEN LIT_DESCR ELSE CHA_CODE || CASE WHEN LIT_CODE <> CHA_CODE THEN '. ' || LIT_CODE ELSE '' END END
FROM prod_web100t.CHAMBRES
JOIN prod_web100t.LITS ON CHA_OID = LIT_CHAMBRE
JOIN activite[PX].t_etages ON CHA_UF::bigint = t_etages.code_original
WHERE t_lits.code_original = (CHA_UF || '-' || LIT_OID) AND
(t_lits.code <> LIT_CODE OR
t_lits.texte <> CASE WHEN LIT_DESCR <> '' THEN LIT_DESCR ELSE CHA_CODE || CASE WHEN LIT_CODE <> CHA_CODE THEN '. ' || LIT_CODE ELSE '' END END OR
t_lits.texte_court <> CASE WHEN LIT_DESCR <> '' THEN LIT_DESCR ELSE CHA_CODE || CASE WHEN LIT_CODE <> CHA_CODE THEN '. ' || LIT_CODE ELSE '' END END
)
;
UPDATE activite[PX].t_lits SET
code = LIT_CODE,
texte = CASE WHEN LIT_DESCR <> '' THEN LIT_DESCR ELSE CHA_CODE || CASE WHEN LIT_CODE <> CHA_CODE THEN '. ' || LIT_CODE ELSE '' END END,
texte_court = CASE WHEN LIT_DESCR <> '' THEN LIT_DESCR ELSE CHA_CODE || CASE WHEN LIT_CODE <> CHA_CODE THEN '. ' || LIT_CODE ELSE '' END END,
etage_id = t_etages.oid
FROM
prod_web100t.CHAMBRES
JOIN prod_web100t.LITS ON CHA_OID = LIT_CHAMBRE
JOIN activite[PX].t_etages ON CHA_UF::bigint = t_etages.code_original
WHERE 1=1
AND CHA_UF::text || '-'::text || LIT_OID::text = t_lits.code_original
AND (1!=1
OR t_lits.code != LIT_CODE
OR t_lits.texte != CASE WHEN LIT_DESCR <> '' THEN LIT_DESCR ELSE CHA_CODE || CASE WHEN LIT_CODE <> CHA_CODE THEN '. ' || LIT_CODE ELSE '' END END
OR t_lits.texte_court != CASE WHEN LIT_DESCR <> '' THEN LIT_DESCR ELSE CHA_CODE || CASE WHEN LIT_CODE <> CHA_CODE THEN '. ' || LIT_CODE ELSE '' END END
OR t_lits.etage_id != t_etages.oid
);
-- Mise à jour par rapport au code du lit et à l'étage si l'oid a changé
UPDATE activite[PX].t_lits SET
code_original = (CHA_UF::text || '-'::text || LIT_OID::text)
FROM
prod_web100t.CHAMBRES
JOIN prod_web100t.LITS ON CHA_OID = LIT_CHAMBRE
,activite[PX].t_etages
WHERE 1=1
AND t_lits.etage_id = t_etages.oid
AND t_lits.code = LITS.LIT_CODE
AND t_etages.code_original = CHAMBRES.CHA_UF
AND t_lits.code_original IS DISTINCT FROM (CHA_UF::text || '-'::text || LIT_OID::text)
;
INSERT INTO activite[PX].t_lits(code_original, code, texte, texte_court, etage_id, chambre_particuliere)
SELECT CHA_UF || '-' || MAX(LIT_OID),
LIT_CODE,
CASE WHEN LIT_DESCR <> '' THEN LIT_DESCR ELSE CHA_CODE || CASE WHEN LIT_CODE <> CHA_CODE THEN '. ' || LIT_CODE ELSE '' END END,
CASE WHEN LIT_DESCR <> '' THEN LIT_DESCR ELSE CHA_CODE || CASE WHEN LIT_CODE <> CHA_CODE THEN '. ' || LIT_CODE ELSE '' END END,
t_etages.oid,
CASE WHEN CHA_COMMUNE = '1' THEN 'N' ELSE 'O' END AS chambre_particuliere
FROM prod_web100t.CHAMBRES
JOIN prod_web100t.LITS ON CHA_OID = LIT_CHAMBRE
JOIN activite[PX].t_etages ON CHA_UF::bigint = t_etages.code_original
GROUP BY CHA_UF,2,3,4,5,6
HAVING
CHA_UF || '-' || MAX(LIT_OID) NOT IN (SELECT code_original FROM activite[PX].t_lits WHERE code_original IS NOT NULL)
ORDER BY LIT_CODE;
INSERT INTO activite[PX].t_lits(code_original, code, texte, texte_court, etage_id, chambre_particuliere)
SELECT code_original || '-0' , '', 'Non renseigné', 'Non renseigné', oid, 'N'
FROM activite[PX].t_etages
WHERE oid > 0 AND
code_original || '-0' NOT IN (SELECT code_original FROM activite[PX].t_lits WHERE code_original IS NOT NULL);
UPDATE activite[PX].t_lits SET code = '*****' WHERE code = '';
UPDATE activite[PX].t_lits SET
code = LIT_CODE,
texte = CASE WHEN LIT_DESCR <> '' THEN LIT_DESCR ELSE CHA_CODE || CASE WHEN LIT_CODE <> CHA_CODE THEN '. ' || LIT_CODE ELSE '' END END,
texte_court = CASE WHEN LIT_DESCR <> '' THEN LIT_DESCR ELSE CHA_CODE || CASE WHEN LIT_CODE <> CHA_CODE THEN '. ' || LIT_CODE ELSE '' END END
FROM
(
with max_lit_oid AS (
SELECT CHAMBRES.CHA_OID, CHAMBRES.CHA_UF, MAX(LITS.LIT_OID) AS MAX_LIT_OID
FROM prod_web100t.CHAMBRES
JOIN prod_web100t.LITS ON CHA_OID = LIT_CHAMBRE
GROUP BY 1,2
)
SELECT
CHAMBRES.CHA_UF,
CHAMBRES.CHA_CODE,
max_lit_oid.MAX_LIT_OID,
LITS.LIT_CODE,
LITS.LIT_DESCR
FROM max_lit_oid
JOIN prod_web100t.CHAMBRES ON CHAMBRES.CHA_OID = max_lit_oid.CHA_OID
JOIN prod_web100t.LITS ON LIT_OID = max_lit_oid.MAX_LIT_OID
JOIN activite[PX].t_etages ON t_etages.code_original = CHAMBRES.CHA_UF::bigint
) AS subview
WHERE subview.CHA_UF || '-' || subview.MAX_LIT_OID = code_original AND
(
code IS DISTINCT FROM LIT_CODE OR
texte IS DISTINCT FROM CASE WHEN LIT_DESCR <> '' THEN LIT_DESCR ELSE CHA_CODE || CASE WHEN LIT_CODE <> CHA_CODE THEN '. ' || LIT_CODE ELSE '' END END OR
texte_court IS DISTINCT FROM CASE WHEN LIT_DESCR <> '' THEN LIT_DESCR ELSE CHA_CODE || CASE WHEN LIT_CODE <> CHA_CODE THEN '. ' || LIT_CODE ELSE '' END END
)
;
DROP TABLE IF EXISTS w_NMCL_UNITEFONCTIONNELLE;
CREATE TEMP TABLE w_NMCL_UNITEFONCTIONNELLE AS
SELECT
ND_INVARIANT_OID AS WEB100T_OID,
COALESCE(t_services_facturation.oid,0) AS service_facturation_id,
COALESCE(t_unites_fonctionnelles.oid,0) AS unite_fonctionnelle_id,
COALESCE(mode_traitement_id,0) AS mode_traitement_id,
COALESCE(t_modes_traitement.code,'') AS mode_traitement_code,
COALESCE(dmt_id,0) AS dmt_id,
COALESCE(t_dmt.code,'') AS dmt_code,
COALESCE(t_services_facturation.type_sejour,'') AS type_sejour,
COALESCE(t_services_facturation.type_t2a,'0') AS type_t2a
FROM w_SGN_NMCL_DATA
LEFT JOIN activite[PX].t_services_facturation ON ND_INVARIANT_OID::bigint = t_services_facturation.code_original
LEFT JOIN activite[PX].t_unites_fonctionnelles ON ND_INVARIANT_OID::bigint = t_unites_fonctionnelles.code_original
LEFT JOIN base.t_modes_traitement ON mode_traitement_id = t_modes_traitement.oid
LEFT JOIN base.t_dmt ON mode_traitement_id = t_dmt.oid
WHERE NMCL_IDENT = 'UNITEFONCTIONNELLE';
]]>
0
WHERE ART_OID::text = t_rubriques_facturation.code_original
;
UPDATE w_ART_ARTICLES SET ART_CODE_B2 = ART_CODE WHERE ART_CODE_B2 = '' AND ART_CODE <> '';
-- Codes ou texte modifiés
UPDATE activite[PX].t_rubriques_facturation SET
code = ART_CODE,
texte = ART_LIB,
texte_court = ART_LIB
FROM prod_web100T.ART_ARTICLES
WHERE code_original = ART_OID AND
ART_ARTICLES.ART_CLASS NOT IN ('GRP', 'CCAM', 'UCD', 'LPP', 'GHS', 'GHT') AND
(
t_rubriques_facturation.code <> ART_CODE OR
t_rubriques_facturation.texte <> ART_LIB OR
t_rubriques_facturation.texte_court <> ART_LIB
)
;
-- code changé avec code original inchangé
UPDATE activite[PX].t_rubriques_facturation SET
code = ART_CODE
FROM
(
SELECT
(MAX(Array[ART_DEBUT_VALIDITE::text,ART_OID_rub::text]))[2]::bigint AS ART_OID_rub,
ART_CODE,
(MAX(Array[ART_DEBUT_VALIDITE::text,ART_LIB]))[2] AS ART_LIB,
(MAX(Array[ART_DEBUT_VALIDITE::text,ART_LIB]))[2] AS ART_LIB
FROM w_ART_ARTICLES
GROUP BY ART_CODE
) as subq
WHERE code_original = ART_OID_rub
AND code != ART_CODE
;
INSERT INTO activite[PX].t_rubriques_facturation(code_original, code, texte, texte_court)
SELECT
(MAX(Array[ART_DEBUT_VALIDITE::text,ART_OID_rub::text]))[2]::bigint AS ART_OID_rub,
ART_CODE,
(MAX(Array[ART_DEBUT_VALIDITE::text,ART_LIB]))[2] AS ART_LIB,
(MAX(Array[ART_DEBUT_VALIDITE::text,ART_LIB]))[2] AS ART_LIB
FROM w_ART_ARTICLES
GROUP BY ART_CODE
HAVING (MAX(Array[ART_DEBUT_VALIDITE::text,ART_OID_rub::text]))[2] NOT IN (SELECT code_original FROM activite[PX].t_rubriques_facturation) AND
ART_CODE NOT IN (SELECT code FROM activite[PX].t_rubriques_facturation WHERE t_rubriques_facturation.code IS NOT NULL)
;
INSERT INTO activite.t_prestations(code_original, code, texte, texte_court)
SELECT
ART_CODE_B2,
ART_CODE_B2,
ART_CODE_B2,
ART_CODE_B2
FROM w_ART_ARTICLES
WHERE ART_CODE_B2 NOT IN (SELECT code FROM activite.t_prestations WHERE code IS NOT NULL)
GROUP BY ART_CODE_B2
ORDER BY ART_CODE_B2;
INSERT INTO base.t_actes(
code, texte, texte_court, nomenclature, ccam_regroupement_id_1, ccam_regroupement_id_4,
geste_marqueur_id)
SELECT
substring(ART_CODE_ACTE, 1, 7),
(MAX(Array[ART_DEBUT_VALIDITE::text,ART_LIB_ACTE]))[2] AS ART_LIB_ACTE,
(MAX(Array[ART_DEBUT_VALIDITE::text,ART_LIB_ACTE]))[2] AS ART_LIB_ACTE,
MIN(CASE WHEN length(trim(ART_CODE_ACTE)) >= 7 THEN 'CCAM' ELSE 'NGAP' END),
MIN(COALESCE(t_ccam_regroupements_1.oid,0)),
MIN(COALESCE(t_ccam_regroupements_4.oid,0)),
0
FROM w_ART_ARTICLES
LEFT JOIN base.t_ccam_regroupements t_ccam_regroupements_1 ON t_ccam_regroupements_1.code = CASE WHEN length(trim(ART_CODE_ACTE)) >= 7 THEN ART_CODE_B2 ELSE 'NGAP' END
LEFT JOIN base.t_ccam_regroupements t_ccam_regroupements_4 ON t_ccam_regroupements_4.code = CASE WHEN length(trim(ART_CODE_ACTE)) >= 7 THEN 'ADA' ELSE 'NGAP' END
WHERE
substring(ART_CODE_ACTE, 1, 7) NOT IN (SELECT code FROM base.t_actes) AND
ART_OID = ANY (ARRAY (SELECT DISTINCT FLT_ARTICLE FROM prod_web100t.FAC_FACT_LIGNE_TIER WHERE FLT_IS_ETS = 0 AND FLT_DATE_DEBUT >= '[ENV_ADM_ANNEEDEBUT]0101'::timestamp without time zone)::double precision[])
GROUP BY 1;
UPDATE w_ART_ARTICLES
SET prestation_id = t_prestations.oid
FROM activite.t_prestations
WHERE ART_CODE_B2 = code;
UPDATE w_ART_ARTICLES
SET rubrique_facturation_id = t_rubriques_facturation.oid
FROM activite[PX].t_rubriques_facturation
WHERE ART_CODE = code;
UPDATE w_ART_ARTICLES
SET acte_id = t_actes.oid
FROM base.t_actes
WHERE substring(ART_CODE_ACTE, 1, 7) = code;
UPDATE w_ART_ARTICLES
SET ucd_id = t_ucd.oid
FROM base.t_ucd
WHERE ART_CODE_2 = t_ucd.code;
UPDATE w_ART_ARTICLES
SET lpp_id = t_lpp.oid
FROM base.t_lpp
WHERE ART_CODE_2 = t_lpp.code;
ALTER TABLE w_ART_ARTICLES ADD CONSTRAINT w_ART_ARTICLES_pkey PRIMARY KEY(ART_OID);
-- Journal
INSERT INTO activite[PX].t_journal (code_original, code, texte)
SELECT JOUR_TYPE,
JOUR_TYPE,
SPLIT_PART(JOUR_LIB,' ',1)
FROM prod_web100t.CPT_JOURNAL
WHERE JOUR_TYPE NOT IN (SELECT code_original FROM activite[PX].t_journal WHERE code_original IS NOT NULL)
GROUP BY 1,2,3
;
INSERT INTO activite[PX].t_journal (code_original, code, texte)
SELECT LNK_JOURNAL, LNK_JOURNAL,
CASE LNK_JOURNAL
WHEN 'VE' THEN 'Ventes'
WHEN 'HONO' THEN 'Honoraires'
WHEN 'RGLMT' THEN 'Règlements'
WHEN 'ENCRS' THEN 'En cours'
ELSE LNK_JOURNAL END
FROM w_CPT_OP_LINK_source
WHERE LNK_JOURNAL NOT IN (SELECT code_original FROM activite[PX].t_journal WHERE code_original IS NOT NULL)
GROUP BY 1,2,3
;
-- Comptes
INSERT INTO activite[PX].t_compte(oid, code_original, code, texte, texte_court)
SELECT 0, 0, '', 'Non renseigné', 'Non renseigné' WHERE 0 NOT IN (SELECt oid FROM activite[PX].t_compte);
INSERT INTO activite[PX].t_compte(code_original, code, texte, texte_court)
SELECT
CPT_CODE,
CPT_CODE,
(max(DISTINCT ARRAY[cpt_created::text, CPT_LIB]))[2],
(max(DISTINCT ARRAY[cpt_created::text, CPT_LIB]))[2]
FROM PROD_WEB100T.CPT_COMPTES
WHERE CPT_CODE <> '' AND
CPT_OID = ANY(SELECT ECR_COMPTE FROM w_CPT_ECRITURE_source) AND
CPT_CODE NOT IN (SELECT code FROM activite[PX].t_compte) AND
CPT_CODE NOT IN (SELECT code_original FROM activite[PX].t_compte)
GROUP BY 1
ORDER BY 1;
UPDATE activite[PX].t_compte SET
code = subview.CPT_CODE,
texte = subview.MAX_CPT_LIB,
texte_court = subview.MAX_CPT_LIB
FROM
(
SELECT CPT_CODE, (max(DISTINCT ARRAY[cpt_created::text, CPT_LIB]))[2] AS MAX_CPT_LIB
FROM PROD_WEB100T.CPT_COMPTES
GROUP BY 1
) AS subview
WHERE subview.CPT_CODE = code_original AND
(
code IS DISTINCT FROM subview.CPT_CODE OR
texte IS DISTINCT FROM subview.MAX_CPT_LIB OR
texte_court IS DISTINCT FROM subview.MAX_CPT_LIB
)
;
with last_libelle as (
select
CPT_CODE,
(max(DISTINCT ARRAY[cpt_created::text, CPT_LIB]))[2] as CPT_LIB
from PROD_WEB100T.CPT_COMPTES
where CPT_TYPE = '1'
group by 1
)
UPDATE activite[PX].t_compte SET
texte = last_libelle.CPT_LIB,
texte_court = last_libelle.CPT_LIB
FROM last_libelle
WHERE 1=1
AND t_compte.code = last_libelle.CPT_CODE
AND (1!=1
OR texte IS DISTINCT FROM CPT_LIB
OR texte_court IS DISTINCT FROM CPT_LIB)
;
UPDATE activite[PX].t_compte
SET taux_tva = subview.taux_tva*100
FROM
(
SELECT CPT_CODE, (MAX(ARRAY[nb,ECR_TVA_TAUX]))[2]::numeric AS taux_tva
FROM
(
SELECT CPT_CODE, ECR_TVA_TAUX, count(*) AS nb
FROM prod_web100t.CPT_ECRITURE
JOIN prod_web100t.CPT_COMPTES ON CPT_OID = ECR_COMPTE
WHERE ECR_TYPE LIKE 'PRODUIT%'
GROUP BY 1,2
) subview
GROUP BY 1
ORDER BY 1
) subview
WHERE t_compte.code = CPT_CODE AND
subview.taux_tva <> 0 AND
subview.taux_tva <> 0 AND
t_compte.taux_tva = 0
;
DROP TABLE IF EXISTS w_CPT_OP_LINK_source_agg;
CREATE TEMP TABLE w_CPT_OP_LINK_source_agg AS
SELECT LNK_OPERATION,
LNK_MASTER_OP
FROM w_CPT_OP_LINK_source
;
CREATE INDEX w_CPT_OP_LINK_source_agg_ik_LNK_MASTER_OP
ON w_CPT_OP_LINK_source_agg
USING btree
(LNK_MASTER_OP)
;
DROP TABLE IF EXISTS w_CPT_OP_LINK_source;
]]>
'' THEN FLD_NOM ELSE TRIM(REPLACE(SGN_NMCL_DATA_COR.ND_LIB, FLD_PRENOM, '')) END || ' '|| FLD_PRENOM AS NMCL_CORRESPONDANT_OID2,
NULL::bigint[] AS COR_ID_array,
SGN_NMCL_DATA_COR.ND_CODE::text,
CASE WHEN FLD_NOM <> '' THEN trim(FLD_NOM) ELSE TRIM(REPLACE(SGN_NMCL_DATA_COR.ND_LIB, FLD_PRENOM, ''))::text END AS FLD_NOM,
FLD_PRENOM::text,
FLD_CODEADELI::text,
FLD_SPECIALITE,
FLD_CODERPPS,
COALESCE(SUBSTR(SGN_NMCL_DATA_SPE.ND_CODE,1,10),'')::text AS FLD_SPECIALITE_CODE,
row_number() OVER (PARTITION BY UPPER(CASE WHEN FLD_NOM <> '' THEN trim(FLD_NOM) ELSE TRIM(REPLACE(SGN_NMCL_DATA_COR.ND_LIB, FLD_PRENOM, '')) END), UPPER(trim(FLD_PRENOM)) ORDER BY MWS_NMCL_CORRESPONDANT.OID) AS rang,
0::bigint AS specialite_id,
0::bigint AS medecin_traitant_id
FROM prod_web100t.MWS_NMCL_CORRESPONDANT
JOIN prod_web100t.SGN_NMCL_DATA SGN_NMCL_DATA_COR ON SGN_NMCL_DATA_COR.ND_INVARIANT_OID = MWS_NMCL_CORRESPONDANT.OID
JOIN prod_web100t.SGN_NMCLS SGN_NMCLS_COR ON SGN_NMCL_DATA_COR.ND_NMCL_OID = SGN_NMCLS_COR.NMCL_OID AND SGN_NMCLS_COR.NMCL_IDENT = 'CORRESPONDANT'
LEFT JOIN prod_web100t.SGN_NMCL_DATA SGN_NMCL_DATA_SPE ON SGN_NMCL_DATA_SPE.ND_INVARIANT_OID = MWS_NMCL_CORRESPONDANT.FLD_SPECIALITE
LEFT JOIN prod_web100t.SGN_NMCLS SGN_NMCLS_SPE ON SGN_NMCL_DATA_SPE.ND_NMCL_OID = SGN_NMCLS_SPE.NMCL_OID AND SGN_NMCLS_SPE.NMCL_IDENT = 'SPECIALITE'
WHERE FLD_NOM <> '' OR SGN_NMCL_DATA_COR.ND_LIB <> ''
;
ANALYSE w_CORRESPONDANT
;
UPDATE w_CORRESPONDANT
SET COR_ID_array = subview.COR_ID_array
FROM
(
SELECT UPPER(trim(COR_NOM)) AS COR_NOM, UPPER(trim(COR_PRENOM)) AS COR_PRENOM, base.cti_array_accum(COR_ID) AS COR_ID_array
FROM prod_web100t.CORRESPONDANTS
GROUP BY 1,2
) subview
WHERE COR_NOM ILIKE FLD_NOM AND
COR_PRENOM ILIKE FLD_PRENOM AND
rang = 1
;
DROP TABLE IF EXISTS w_CORRESPONDANTS_ok;
CREATE TEMP TABLE w_CORRESPONDANTS_ok AS
SELECT unnest(COR_ID_array) AS COR_ID_ok
FROM w_CORRESPONDANT
WHERE rang = 1
GROUP BY 1
;
INSERT INTO w_CORRESPONDANT
SELECT
MAX('OLDCOR'::text || COR_ID) AS NMCL_CORRESPONDANT_OID,
MAX(CASE WHEN COR_CODE <> '' THEN COR_CODE ELSE COR_NOM || ' '|| COR_PRENOM END) AS NMCL_CORRESPONDANT_OID2,
base.cti_array_accum(COR_ID) AS COR_ID_array,
MAX(CASE WHEN COR_CODE <> '' THEN COR_CODE ELSE COR_NOM || ' '|| COR_PRENOM END) AS ND_CODE,
trim(COR_NOM) AS FLD_NOM,
trim(COR_PRENOM) AS FLD_PRENOM,
MAX(COR_ADELI) AS COR_ADELI,
0::numeric AS FLD_SPECIALITE,
MAX(COR_RPPS) AS FLD_CODERPPS,
''::text AS FLD_SPECIALITE_CODE,
1::numeric AS rang,
0::bigint AS specialite_id,
0::bigint AS medecin_traitant_id
FROM prod_web100t.CORRESPONDANTS
LEFT JOIN w_CORRESPONDANTS_ok ON COR_ID = COR_ID_ok
WHERE COR_NOM <> '' AND
COR_ID_ok IS NULL
GROUP BY 5,6
;
UPDATE w_CORRESPONDANT
SET specialite_id = t_specialites_medecin.oid
FROM base.t_specialites_medecin
WHERE FLD_SPECIALITE_CODE <> '' AND
t_specialites_medecin.code = (FLD_SPECIALITE_CODE||'..') AND
rang = 1
;
UPDATE w_CORRESPONDANT
SET specialite_id = t_specialites_medecin.oid
FROM base.t_specialites_medecin
WHERE FLD_SPECIALITE_CODE <> '' AND
specialite_id = 0 AND
t_specialites_medecin.code = (FLD_SPECIALITE_CODE)AND
rang = 1
;
UPDATE activite[PX].t_medecins_traitants_administratifs SET
code_original = w_CORRESPONDANT.NMCL_CORRESPONDANT_OID
FROM w_CORRESPONDANT
LEFT JOIN activite[PX].t_medecins_traitants_administratifs t_medecins_traitants_administratifs_2 ON t_medecins_traitants_administratifs_2.code_original = NMCL_CORRESPONDANT_OID
WHERE t_medecins_traitants_administratifs_2.code_original IS NULL AND
t_medecins_traitants_administratifs.code_original = NMCL_CORRESPONDANT_OID2 AND
t_medecins_traitants_administratifs.code_original <> w_CORRESPONDANT.NMCL_CORRESPONDANT_OID
;
UPDATE activite[PX].t_medecins_traitants_administratifs SET
code = w_CORRESPONDANT.ND_CODE,
nom = w_CORRESPONDANT.FLD_NOM,
prenom = w_CORRESPONDANT.FLD_PRENOM,
no_rpps = CASE WHEN FLD_CODERPPS <> '' AND length(w_CORRESPONDANT.FLD_CODERPPS) = 11 THEN FLD_CODERPPS ELSE no_rpps END
FROM w_CORRESPONDANT
WHERE code_original = NMCL_CORRESPONDANT_OID AND
(
code IS DISTINCT FROM w_CORRESPONDANT.ND_CODE OR
nom IS DISTINCT FROM w_CORRESPONDANT.FLD_NOM OR
prenom IS DISTINCT FROM w_CORRESPONDANT.FLD_PRENOM OR
no_rpps IS DISTINCT FROM w_CORRESPONDANT.FLD_CODERPPS AND w_CORRESPONDANT.FLD_CODERPPS <> '' AND length(w_CORRESPONDANT.FLD_CODERPPS) = 11
)
;
INSERT INTO activite[PX].t_medecins_traitants_administratifs(code_original, code, nom, prenom, specialite_id, medecin_id)
SELECT NMCL_CORRESPONDANT_OID, NMCL_CORRESPONDANT_OID, min(FLD_NOM), min(FLD_PRENOM),min(COALESCE(t_specialites_medecin.oid,0)), 0
FROM w_CORRESPONDANT
LEFT JOIN base.t_specialites_medecin ON (FLD_SPECIALITE::bigint = t_specialites_medecin.code_original)
WHERE rang = 1 AND
NMCL_CORRESPONDANT_OID NOT IN (SELECT code_original FROM activite[PX].t_medecins_traitants_administratifs)
GROUP BY 1, 2
;
UPDATE w_CORRESPONDANT
SET medecin_traitant_id = t_medecins_traitants_administratifs.oid
FROM activite[PX].t_medecins_traitants_administratifs
WHERE t_medecins_traitants_administratifs.code_original = NMCL_CORRESPONDANT_OID
;
UPDATE w_CORRESPONDANT
SET medecin_traitant_id = t_medecins_traitants_administratifs.oid
FROM w_CORRESPONDANT w_CORRESPONDANT1
JOIN activite[PX].t_medecins_traitants_administratifs ON
w_CORRESPONDANT1.rang = 1 AND
t_medecins_traitants_administratifs.code_original = w_CORRESPONDANT1.NMCL_CORRESPONDANT_OID
WHERE upper(w_CORRESPONDANT.FLD_NOM) = upper(w_CORRESPONDANT1.FLD_NOM) AND
upper(w_CORRESPONDANT.FLD_PRENOM) = upper(w_CORRESPONDANT1.FLD_PRENOM) AND
w_CORRESPONDANT.rang > 1
;
DROP TABLE IF EXISTS w_sejours;
CREATE TEMP TABLE w_sejours AS
SELECT no_sejour,
date_entree,
p_sejours.no_patient,
p_patients.nom,
''::text AS no_patient_web100t,
''::text AS nom_web100t,
0::numeric AS PAT_MED_TRAITANT,
0::bigint AS medecin_traitant_id
FROM activite[PX].p_sejours
JOIN activite[PX].p_patients ON p_sejours.no_patient = p_patients.no_patient
;
ANALYSE w_sejours
;
UPDATE w_sejours
SET no_patient_web100t = PAT_IPP, nom_web100T = PAT_NOM, PAT_MED_TRAITANT = PATIENTS.PAT_MED_TRAITANT
FROM prod_web100T.PATIENTS
WHERE lpad(no_patient,10,'0') = lpad(PAT_IPP,10,'0') AND PATIENTS.PAT_MED_TRAITANT <> 0
;
ANALYSE w_sejours
;
UPDATE w_sejours
SET medecin_traitant_id = w_CORRESPONDANT.medecin_traitant_id
FROM w_CORRESPONDANT
WHERE PAT_MED_TRAITANT = NMCL_CORRESPONDANT_OID
;
DROP TABLE IF EXISTS w_CORRESPONDANTS_ok;
CREATE TEMP TABLE w_CORRESPONDANTS_ok AS
SELECT unnest(COR_ID_array) AS COR_ID_ok, MAX(medecin_traitant_id) AS medecin_traitant_id
FROM w_CORRESPONDANT
WHERE rang = 1 AND
medecin_traitant_id <> 0
GROUP BY 1
;
UPDATE w_sejours
SET medecin_traitant_id = w_CORRESPONDANTS_ok.medecin_traitant_id
FROM w_CORRESPONDANTS_ok
WHERE w_sejours.medecin_traitant_id = 0 AND
PAT_MED_TRAITANT = COR_ID_ok
;
UPDATE activite[PX].p_sejours
SET medecin_traitant_id = w_sejours.medecin_traitant_id
FROM w_sejours
WHERE p_sejours.no_sejour = w_sejours.no_sejour AND
w_sejours.medecin_traitant_id <> 0 AND
p_sejours.medecin_traitant_id <> w_sejours.medecin_traitant_id
;
-- ajout des coordonnées par séjour
INSERT INTO activite[PX].p_coordonnees_patient (
sejour_id,
adresse,
code_postal_id,
commune,
telephone_fixe,
telephone_portable,
email
)
SELECT
p_sejours.oid,
ADR_ADRESSE,
COALESCE(t_codes_postaux.oid,0),
ADR_COMMUNE,
ADR_TEL_1,
ADR_TEL_2,
ADR_EMAIL
FROM activite[PX].p_sejours
LEFT JOIN prod_web100t.DAT_DA w_DAT_DA ON code_original = DA_OID
LEFT JOIN prod_web100t.PATIENTS ON w_DAT_DA.DA_PATIENT = PATIENTS.PAT_ID
LEFT JOIN prod_web100t.ADRESSES ON PAT_ADRESSE = ADR_ID
LEFT JOIN base.t_codes_postaux ON ADR_CODE_POSTAL = t_codes_postaux.code
;
]]>
'2099-12-31' THEN date_facture ELSE date_expedition_0 END AS date_expedition_0,
CASE WHEN montant_comptabilise_1_c = 0 THEN '00010101' WHEN montant_comptabilise_1_c = montant_regle_1_c THEN date_solde_1_c ELSE '20991231' END AS date_solde,
CASE WHEN montant_comptabilise_1_c = 0 THEN '00010101' WHEN montant_comptabilise_1_c = montant_regle_1_c THEN date_solde_1_c ELSE '20991231' END AS date_solde_c,
CASE WHEN montant_comptabilise_1_h = 0 THEN '00010101' WHEN montant_comptabilise_1_h = montant_regle_1_h THEN date_solde_1_h ELSE '20991231' END AS date_solde_h,
CASE WHEN montant_comptabilise_0_c = 0 THEN '00010101' WHEN montant_comptabilise_0_c = montant_regle_0_c THEN date_solde_0_c ELSE '20991231' END AS date_solde_0_c,
CASE WHEN montant_comptabilise_0_h = 0 THEN '00010101' WHEN montant_comptabilise_0_h = montant_regle_0_h THEN date_solde_0_h ELSE '20991231' END AS date_solde_0_h,
CASE WHEN montant_comptabilise_1_c = 0 THEN '00010101' WHEN montant_comptabilise_1_c = montant_regle_1_c THEN date_solde_1_c ELSE '20991231' END AS date_solde_1_c,
CASE WHEN montant_comptabilise_1_h = 0 THEN '00010101' WHEN montant_comptabilise_1_h = montant_regle_1_h THEN date_solde_1_h ELSE '20991231' END AS date_solde_1_h,
CASE WHEN montant_comptabilise_2_c = 0 THEN '00010101' WHEN montant_comptabilise_2_c = montant_regle_2_c THEN date_solde_2_c ELSE '20991231' END AS date_solde_2_c,
CASE WHEN montant_comptabilise_2_h = 0 THEN '00010101' WHEN montant_comptabilise_2_h = montant_regle_2_h THEN date_solde_2_h ELSE '20991231' END AS date_solde_2_h,
CASE WHEN montant_comptabilise_22_c = 0 THEN '00010101' WHEN montant_comptabilise_22_c = montant_regle_22_c THEN date_solde_22_c ELSE '20991231' END AS date_solde_22_c,
CASE WHEN montant_comptabilise_22_h = 0 THEN '00010101' WHEN montant_comptabilise_22_h = montant_regle_22_h THEN date_solde_22_h ELSE '20991231' END AS date_solde_22_h
FROM activite[PX].p_factures;
UPDATE w_factures SET
date_solde = GREATEST(date_solde_0_c, date_solde_0_h, date_solde_1_c, date_solde_1_h, date_solde_2_c, date_solde_2_h, date_solde_22_c, date_solde_22_h),
date_solde_c = GREATEST(date_solde_0_c, date_solde_1_c, date_solde_2_c, date_solde_22_c),
date_solde_h = GREATEST(date_solde_0_h, date_solde_1_h, date_solde_2_h, date_solde_22_h)
WHERE
date_solde IS DISTINCT FROM GREATEST(date_solde_0_c, date_solde_0_h, date_solde_1_c, date_solde_1_h, date_solde_2_c, date_solde_2_h, date_solde_22_c, date_solde_22_h) OR
date_solde_c IS DISTINCT FROM GREATEST(date_solde_0_c, date_solde_1_c, date_solde_2_c, date_solde_22_c) OR
date_solde_h IS DISTINCT FROM GREATEST(date_solde_0_h, date_solde_1_h, date_solde_2_h, date_solde_22_h) ;
CREATE INDEX w_factures_i1
ON w_factures
USING btree
(no_facture);
CREATE INDEX w_factures_i2
ON w_factures
USING btree
(no_facture_reference);
DROP TABLE IF EXISTS w_factures_references_soldes;
CREATE TEMP TABLE w_factures_references_soldes AS
SELECT
no_facture_reference,
MAX(date_solde) AS date_solde_reference,
MAX(date_solde_c) AS date_solde_reference_c,
MAX(date_solde_h) AS date_solde_reference_h,
MAX(date_solde_0_c) AS date_solde_reference_0_c,
MAX(date_solde_0_h) AS date_solde_reference_0_h,
MAX(date_solde_1_c) AS date_solde_reference_1_c,
MAX(date_solde_1_h) AS date_solde_reference_1_h,
MAX(date_solde_2_c) AS date_solde_reference_2_c,
MAX(date_solde_2_h) AS date_solde_reference_2_h,
MAX(date_solde_22_c) AS date_solde_reference_22_c,
MAX(date_solde_22_h) AS date_solde_reference_22_h
FROM w_factures
GROUP BY no_facture_reference;
CREATE INDEX w_factures_references_soldes_i1
ON w_factures_references_soldes
USING btree
(no_facture_reference);
UPDATE activite[PX].p_factures
SET
date_expedition_0 = w_factures.date_expedition_0,
date_solde = w_factures.date_solde,
date_solde_c = w_factures.date_solde_c,
date_solde_h = w_factures.date_solde_h,
date_solde_0_c = w_factures.date_solde_0_c,
date_solde_0_h = w_factures.date_solde_0_h,
date_solde_1_c = w_factures.date_solde_1_c,
date_solde_1_h = w_factures.date_solde_1_h,
date_solde_2_c = w_factures.date_solde_2_c,
date_solde_2_h = w_factures.date_solde_2_h,
date_solde_22_c = w_factures.date_solde_22_c,
date_solde_22_h = w_factures.date_solde_22_h,
date_solde_reference = w_factures_references_soldes.date_solde_reference,
date_solde_reference_c = w_factures_references_soldes.date_solde_reference_c,
date_solde_reference_h = w_factures_references_soldes.date_solde_reference_h,
date_solde_reference_0_c = w_factures_references_soldes.date_solde_reference_0_c,
date_solde_reference_0_h = w_factures_references_soldes.date_solde_reference_0_h,
date_solde_reference_1_c = w_factures_references_soldes.date_solde_reference_1_c,
date_solde_reference_1_h = w_factures_references_soldes.date_solde_reference_1_h,
date_solde_reference_2_c = w_factures_references_soldes.date_solde_reference_2_c,
date_solde_reference_2_h = w_factures_references_soldes.date_solde_reference_2_h,
date_solde_reference_22_c = w_factures_references_soldes.date_solde_reference_22_c,
date_solde_reference_22_h = w_factures_references_soldes.date_solde_reference_22_h
FROM w_factures
JOIN w_factures_references_soldes ON w_factures_references_soldes.no_facture_reference = w_factures.no_facture_reference
WHERE p_factures.no_facture = w_factures.no_facture
AND (
p_factures.date_expedition_0 IS DISTINCT FROM w_factures.date_expedition_0 OR
p_factures.date_solde IS DISTINCT FROM w_factures.date_solde OR
p_factures.date_solde_c IS DISTINCT FROM w_factures.date_solde_c OR
p_factures.date_solde_h IS DISTINCT FROM w_factures.date_solde_h OR
p_factures.date_solde_0_c IS DISTINCT FROM w_factures.date_solde_0_c OR
p_factures.date_solde_0_h IS DISTINCT FROM w_factures.date_solde_0_h OR
p_factures.date_solde_1_c IS DISTINCT FROM w_factures.date_solde_1_c OR
p_factures.date_solde_1_h IS DISTINCT FROM w_factures.date_solde_1_h OR
p_factures.date_solde_2_c IS DISTINCT FROM w_factures.date_solde_2_c OR
p_factures.date_solde_2_h IS DISTINCT FROM w_factures.date_solde_2_h OR
p_factures.date_solde_22_c IS DISTINCT FROM w_factures.date_solde_22_c OR
p_factures.date_solde_22_h IS DISTINCT FROM w_factures.date_solde_22_h OR
p_factures.date_solde_reference IS DISTINCT FROM w_factures_references_soldes.date_solde_reference OR
p_factures.date_solde_reference_c IS DISTINCT FROM w_factures_references_soldes.date_solde_reference_c OR
p_factures.date_solde_reference_h IS DISTINCT FROM w_factures_references_soldes.date_solde_reference_h OR
p_factures.date_solde_reference_0_c IS DISTINCT FROM w_factures_references_soldes.date_solde_reference_0_c OR
p_factures.date_solde_reference_0_h IS DISTINCT FROM w_factures_references_soldes.date_solde_reference_0_h OR
p_factures.date_solde_reference_1_c IS DISTINCT FROM w_factures_references_soldes.date_solde_reference_1_c OR
p_factures.date_solde_reference_1_h IS DISTINCT FROM w_factures_references_soldes.date_solde_reference_1_h OR
p_factures.date_solde_reference_2_c IS DISTINCT FROM w_factures_references_soldes.date_solde_reference_2_c OR
p_factures.date_solde_reference_2_h IS DISTINCT FROM w_factures_references_soldes.date_solde_reference_2_h OR
p_factures.date_solde_reference_22_c IS DISTINCT FROM w_factures_references_soldes.date_solde_reference_22_c OR
p_factures.date_solde_reference_22_h IS DISTINCT FROM w_factures_references_soldes.date_solde_reference_22_h
);
]]>
'2099-12-31';
DROP TABLE IF EXISTS w_sejours_total;
CREATE TEMP TABLE w_sejours_total AS
SELECT
p_sejours.no_sejour AS no_sejour,
p_sejours.code_sorti,
p_sejours.date_sortie,
p_sejours.date_groupage,
p_sejours.ghs_id,
MAX(COALESCE(p_factures.date_facture,'20991231')) AS date_facture,
MAX(COALESCE(p_factures.date_expedition,'20991231')) AS date_expedition,
MAX(COALESCE(p_factures.date_solde,'20991231')) AS date_solde,
SUM(COALESCE(p_factures.montant_facture_c,0)) AS montant_facture_c,
SUM(COALESCE(p_factures.montant_facture_h,0)) AS montant_facture_h,
SUM(COALESCE(p_factures.montant_regle_c,0)) AS montant_regle_c,
SUM(COALESCE(p_factures.montant_regle_h,0)) AS montant_regle_h,
SUM(COALESCE(CASE WHEN p_factures.type_facture <> 'P' AND p_factures.type_facture <> 'E' AND p_factures.type_facture <> 'G' THEN 1 ELSE 0 END,0)) AS nb_factures,
SUM(COALESCE(CASE WHEN p_factures.type_facture = '0' THEN 0 ELSE 1 END,0)) AS nb_factures_regularisation,
SUM(COALESCE(p_factures.nb_rejets,0)) AS nb_rejets,
SUM(COALESCE(p_factures.montant_facture_0_c,0)) AS montant_facture_0_c,
SUM(COALESCE(p_factures.montant_facture_0_h,0)) AS montant_facture_0_h,
SUM(COALESCE(p_factures.montant_regle_0_c,0)) AS montant_regle_0_c,
SUM(COALESCE(p_factures.montant_regle_0_h,0)) AS montant_regle_0_h,
MAX(COALESCE(CASE WHEN (p_factures.montant_facture_0_c <> 0 OR p_factures.montant_facture_0_h <> 0) THEN p_factures.date_expedition_0 ELSE '0001-01-01' END,'20991231' )) AS date_expedition_0,
MAX(COALESCE(CASE WHEN p_factures.date_solde_0_c < '2099-12-31' AND p_factures.date_solde_0_c > p_factures.date_solde_0_h THEN p_factures.date_solde_0_c ELSE p_factures.date_solde_0_h END,'20991231' )) AS date_solde_0,
SUM(COALESCE(p_factures.montant_facture_1_c,0)) AS montant_facture_1_c,
SUM(COALESCE(p_factures.montant_facture_1_h,0)) AS montant_facture_1_h,
SUM(COALESCE(p_factures.montant_regle_1_c,0)) AS montant_regle_1_c,
SUM(COALESCE(p_factures.montant_regle_1_h,0)) AS montant_regle_1_h,
MAX(COALESCE(CASE WHEN (p_factures.montant_facture_1_c <> 0 OR p_factures.montant_facture_1_h <> 0) THEN p_factures.date_expedition_1 ELSE '0001-01-01' END,'20991231' )) AS date_expedition_1,
MAX(COALESCE(CASE WHEN p_factures.date_solde_1_c < '2099-12-31' AND p_factures.date_solde_1_c > p_factures.date_solde_1_h THEN p_factures.date_solde_1_c ELSE p_factures.date_solde_1_h END,'20991231' )) AS date_solde_1,
SUM(COALESCE(p_factures.montant_facture_2_c,0)) AS montant_facture_2_c,
SUM(COALESCE(p_factures.montant_facture_2_h,0)) AS montant_facture_2_h,
SUM(COALESCE(p_factures.montant_regle_2_c,0)) AS montant_regle_2_c,
SUM(COALESCE(p_factures.montant_regle_2_h,0)) AS montant_regle_2_h,
MAX(COALESCE(CASE WHEN (p_factures.montant_facture_2_c <> 0 OR p_factures.montant_facture_2_h <> 0) THEN p_factures.date_expedition_2 ELSE '0001-01-01' END,'20991231' )) AS date_expedition_2,
MAX(COALESCE(CASE WHEN p_factures.date_solde_2_c < '2099-12-31' AND p_factures.date_solde_2_c > p_factures.date_solde_2_h THEN p_factures.date_solde_2_c ELSE p_factures.date_solde_2_h END,'20991231' )) AS date_solde_2,
SUM(COALESCE(p_factures.montant_facture_22_c,0)) AS montant_facture_22_c,
SUM(COALESCE(p_factures.montant_facture_22_h,0)) AS montant_facture_22_h,
SUM(COALESCE(p_factures.montant_regle_22_c,0)) AS montant_regle_22_c,
SUM(COALESCE(p_factures.montant_regle_22_h,0)) AS montant_regle_22_h,
MAX(COALESCE(CASE WHEN (p_factures.montant_facture_22_c <> 0 OR p_factures.montant_facture_22_h <> 0) THEN p_factures.date_expedition_22 ELSE '0001-01-01' END,'20991231' )) AS date_expedition_22,
MAX(COALESCE(CASE WHEN p_factures.date_solde_22_c < '2099-12-31' AND p_factures.date_solde_22_c > p_factures.date_solde_22_h THEN p_factures.date_solde_22_c ELSE p_factures.date_solde_22_h END,'20991231' )) AS date_solde_22 ,
SUM(COALESCE(p_factures.montant_comptabilise_c,0)) AS montant_comptabilise_c,
SUM(COALESCE(p_factures.montant_comptabilise_h,0)) AS montant_comptabilise_h,
SUM(COALESCE(p_factures.montant_comptabilise_0_c,0)) AS montant_comptabilise_0_c,
SUM(COALESCE(p_factures.montant_comptabilise_0_h,0)) AS montant_comptabilise_0_h,
SUM(COALESCE(p_factures.montant_comptabilise_1_c,0)) AS montant_comptabilise_1_c,
SUM(COALESCE(p_factures.montant_comptabilise_1_h,0)) AS montant_comptabilise_1_h,
SUM(COALESCE(p_factures.montant_comptabilise_2_c,0)) AS montant_comptabilise_2_c,
SUM(COALESCE(p_factures.montant_comptabilise_2_h,0)) AS montant_comptabilise_2_h,
SUM(COALESCE(p_factures.montant_comptabilise_22_c,0)) AS montant_comptabilise_22_c,
SUM(COALESCE(p_factures.montant_comptabilise_22_h,0)) AS montant_comptabilise_22_h,
SUM(COALESCE(p_factures.montant_comptabilise_budget_global_c,0)) AS montant_comptabilise_budget_global_c,
SUM(COALESCE(p_factures.montant_facture_c_actes_inclus_dans_sejour,0)) AS montant_facture_c_actes_inclus_dans_sejour,
SUM(COALESCE(p_factures.montant_facture_h_actes_inclus_dans_sejour,0)) AS montant_facture_h_actes_inclus_dans_sejour,
0::numeric AS delai_groupage,
0::numeric AS delai_facture,
0::numeric AS delai_expedition,
0::numeric AS delai_solde,
0::numeric AS delai_expedition_0,
0::numeric AS delai_solde_0,
0::numeric AS delai_expedition_1,
0::numeric AS delai_solde_1,
0::numeric AS delai_expedition_2,
0::numeric AS delai_solde_2,
0::numeric AS delai_expedition_22,
0::numeric AS delai_solde_22
FROM activite[PX].p_sejours LEFT JOIN activite[PX].p_factures ON p_sejours.no_sejour = p_factures.no_sejour AND type_facture <> 'P'
GROUP BY 1,2,3,4,5;
UPDATE activite[PX].p_sejours
SET date_groupage = date_facture
WHERE (date_groupage IS null OR date_groupage = '20991231' OR date_groupage = '00010101') AND
date_facture <> '2099-12-31';
UPDATE w_sejours_total SET
date_groupage = CASE WHEN date_groupage > '00010101' THEN date_groupage ELSE '20991231' END,
date_facture = CASE WHEN date_facture> '00010101' THEN date_facture ELSE '20991231' END,
date_expedition = CASE WHEN date_expedition > '00010101' THEN date_expedition ELSE '20991231' END,
date_solde = CASE WHEN date_solde > '00010101' THEN date_solde ELSE '20991231' END,
date_expedition_0 = CASE WHEN date_expedition_0 > '00010101' THEN date_expedition_0 ELSE '20991231' END,
date_solde_0 = CASE WHEN date_solde_0 > '00010101' THEN date_solde_0 ELSE '20991231' END,
date_expedition_1 = CASE WHEN date_expedition_1 > '00010101' THEN date_expedition_1 ELSE '20991231' END,
date_solde_1 = CASE WHEN date_solde_1 > '00010101' THEN date_solde_1 ELSE '20991231' END,
date_expedition_2 = CASE WHEN date_expedition_2 > '00010101' THEN date_expedition_2 ELSE '20991231' END,
date_solde_2 = CASE WHEN date_solde_2 > '00010101' THEN date_solde_2 ELSE '20991231' END,
date_expedition_22 = CASE WHEN date_expedition_22 > '00010101' THEN date_expedition_22 ELSE '20991231' END,
date_solde_22 = CASE WHEN date_solde_22 > '00010101' THEN date_solde_22 ELSE '20991231' END;
UPDATE w_sejours_total SET
delai_groupage = CASE WHEN code_sorti = '1' AND date_groupage > date_sortie AND date_groupage < '2099-12-31' AND ghs_id <> 0
THEN date_groupage - date_sortie ELSE 0 END,
delai_facture = CASE WHEN code_sorti = '1' AND date_facture > date_sortie AND date_facture < '2099-12-31' AND date_facture > date_sortie
THEN date_facture - date_sortie ELSE 0 END,
delai_expedition = CASE WHEN code_sorti = '1' AND date_expedition > date_sortie AND date_facture < '2099-12-31' AND date_expedition < '2099-12-31'
THEN date_expedition - date_sortie ELSE 0 END,
delai_solde = CASE WHEN code_sorti = '1' AND date_solde > date_sortie AND date_facture < '2099-12-31' AND date_solde < '2099-12-31'
THEN date_solde - date_sortie ELSE 0 END,
delai_expedition_0 = CASE WHEN code_sorti = '1' AND date_expedition_0 > date_sortie AND date_facture < '2099-12-31' AND date_expedition_0 < '2099-12-31'
THEN date_expedition_0 - date_sortie ELSE 0 END,
delai_solde_0 = CASE WHEN code_sorti = '1'AND date_solde_0 > date_sortie AND date_facture < '2099-12-31' AND date_solde_0 < '2099-12-31'
THEN date_solde_0 - date_sortie ELSE 0 END,
delai_expedition_1 = CASE WHEN code_sorti = '1' AND date_expedition_1 > date_sortie AND date_facture < '2099-12-31' AND date_expedition_1 < '2099-12-31'
THEN date_expedition_1 - date_sortie ELSE 0 END,
delai_solde_1 = CASE WHEN code_sorti = '1' AND date_solde_1 > date_sortie AND date_facture < '2099-12-31' AND date_solde_1 < '2099-12-31'
THEN date_solde_1 - date_sortie ELSE 0 END,
delai_expedition_2 = CASE WHEN code_sorti = '1' AND date_expedition_2 > date_sortie AND date_facture < '2099-12-31' AND date_expedition_2 < '2099-12-31'
THEN date_expedition_2 - date_sortie ELSE 0 END,
delai_solde_2 = CASE WHEN code_sorti = '1' AND date_solde_2 > date_sortie AND date_facture < '2099-12-31' AND date_solde_2 < '2099-12-31'
THEN date_solde_2 - date_sortie ELSE 0 END,
delai_expedition_22 = CASE WHEN code_sorti = '1' AND date_expedition_22 > date_sortie AND date_facture < '2099-12-31' AND date_expedition_22 < '2099-12-31'
THEN date_expedition_22 - date_sortie ELSE 0 END,
delai_solde_22 = CASE WHEN code_sorti = '1' AND date_solde_22 > date_sortie AND date_facture < '2099-12-31' AND date_solde_22 < '2099-12-31'
THEN date_solde_22 - date_sortie ELSE 0 END;
ALTER TABLE w_sejours_total ADD CONSTRAINT w_sejours_total_pkey PRIMARY KEY(no_sejour);
UPDATE activite[PX].p_sejours SET
date_facture = w_sejours_total.date_facture,
date_expedition = w_sejours_total.date_expedition,
date_solde = w_sejours_total.date_solde,
montant_facture_c = w_sejours_total.montant_facture_c,
montant_facture_h = w_sejours_total.montant_facture_h,
montant_regle_c = w_sejours_total.montant_regle_c,
montant_regle_h = w_sejours_total.montant_regle_h,
nb_factures = w_sejours_total.nb_factures,
nb_factures_regularisation = w_sejours_total.nb_factures_regularisation,
nb_factures_rejet = w_sejours_total.nb_rejets,
montant_facture_0_c = w_sejours_total.montant_facture_0_c,
montant_facture_0_h = w_sejours_total.montant_facture_0_h,
montant_regle_0_c = w_sejours_total.montant_regle_0_c,
montant_regle_0_h = w_sejours_total.montant_regle_0_h,
date_expedition_0 = w_sejours_total.date_expedition_0,
date_solde_0 = w_sejours_total.date_solde_0,
montant_facture_1_c = w_sejours_total.montant_facture_1_c,
montant_facture_1_h = w_sejours_total.montant_facture_1_h,
montant_regle_1_c = w_sejours_total.montant_regle_1_c,
montant_regle_1_h = w_sejours_total.montant_regle_1_h,
date_expedition_1 = w_sejours_total.date_expedition_1,
date_solde_1 = w_sejours_total.date_solde_1,
montant_facture_2_c = w_sejours_total.montant_facture_2_c,
montant_facture_2_h = w_sejours_total.montant_facture_2_h,
montant_regle_2_c = w_sejours_total.montant_regle_2_c,
montant_regle_2_h = w_sejours_total.montant_regle_2_h,
date_expedition_2 = w_sejours_total.date_expedition_2,
date_solde_2 = w_sejours_total.date_solde_2,
montant_facture_22_c = w_sejours_total.montant_facture_22_c,
montant_facture_22_h = w_sejours_total.montant_facture_22_h,
montant_regle_22_c = w_sejours_total.montant_regle_22_c,
montant_regle_22_h = w_sejours_total.montant_regle_22_h,
date_expedition_22 = w_sejours_total.date_expedition_22,
date_solde_22 = w_sejours_total.date_solde_22,
montant_comptabilise_c = w_sejours_total.montant_comptabilise_c,
montant_comptabilise_h = w_sejours_total.montant_comptabilise_h,
montant_comptabilise_0_c = w_sejours_total.montant_comptabilise_0_c,
montant_comptabilise_0_h = w_sejours_total.montant_comptabilise_0_h,
montant_comptabilise_1_c = w_sejours_total.montant_comptabilise_1_c,
montant_comptabilise_1_h = w_sejours_total.montant_comptabilise_1_h,
montant_comptabilise_2_c = w_sejours_total.montant_comptabilise_2_c,
montant_comptabilise_2_h = w_sejours_total.montant_comptabilise_2_h,
montant_comptabilise_22_c = w_sejours_total.montant_comptabilise_22_c,
montant_comptabilise_22_h = w_sejours_total.montant_comptabilise_22_h,
montant_comptabilise_budget_global_c = w_sejours_total.montant_comptabilise_budget_global_c,
montant_facture_c_actes_inclus_dans_sejour = w_sejours_total.montant_facture_c_actes_inclus_dans_sejour,
montant_facture_h_actes_inclus_dans_sejour = w_sejours_total.montant_facture_h_actes_inclus_dans_sejour,
delai_groupage = w_sejours_total.delai_groupage,
delai_facture = w_sejours_total.delai_facture,
delai_expedition = w_sejours_total.delai_expedition,
delai_solde = w_sejours_total.delai_solde,
delai_expedition_0 = w_sejours_total.delai_expedition_0,
delai_solde_0 = w_sejours_total.delai_solde_0,
delai_expedition_1 = w_sejours_total.delai_expedition_1,
delai_solde_1 = w_sejours_total.delai_solde_1,
delai_expedition_2 = w_sejours_total.delai_expedition_2,
delai_solde_2 = w_sejours_total.delai_solde_2,
delai_expedition_22 = w_sejours_total.delai_expedition_22,
delai_solde_22 = w_sejours_total.delai_solde_22
FROM w_sejours_total
WHERE w_sejours_total.no_sejour = p_sejours.no_sejour
AND (
p_sejours.date_facture IS DISTINCT FROM w_sejours_total.date_facture OR
p_sejours.date_expedition IS DISTINCT FROM w_sejours_total.date_expedition OR
p_sejours.date_solde IS DISTINCT FROM w_sejours_total.date_solde OR
p_sejours.montant_facture_c IS DISTINCT FROM w_sejours_total.montant_facture_c OR
p_sejours.montant_facture_h IS DISTINCT FROM w_sejours_total.montant_facture_h OR
p_sejours.montant_regle_c IS DISTINCT FROM w_sejours_total.montant_regle_c OR
p_sejours.montant_regle_h IS DISTINCT FROM w_sejours_total.montant_regle_h OR
p_sejours.nb_factures IS DISTINCT FROM w_sejours_total.nb_factures OR
p_sejours.nb_factures_regularisation IS DISTINCT FROM w_sejours_total.nb_factures_regularisation OR
p_sejours.nb_factures_rejet IS DISTINCT FROM w_sejours_total.nb_rejets OR
p_sejours.montant_facture_0_c IS DISTINCT FROM w_sejours_total.montant_facture_0_c OR
p_sejours.montant_facture_0_h IS DISTINCT FROM w_sejours_total.montant_facture_0_h OR
p_sejours.montant_regle_0_c IS DISTINCT FROM w_sejours_total.montant_regle_0_c OR
p_sejours.montant_regle_0_h IS DISTINCT FROM w_sejours_total.montant_regle_0_h OR
p_sejours.date_expedition_0 IS DISTINCT FROM w_sejours_total.date_expedition_0 OR
p_sejours.date_solde_0 IS DISTINCT FROM w_sejours_total.date_solde_0 OR
p_sejours.montant_facture_1_c IS DISTINCT FROM w_sejours_total.montant_facture_1_c OR
p_sejours.montant_facture_1_h IS DISTINCT FROM w_sejours_total.montant_facture_1_h OR
p_sejours.montant_regle_1_c IS DISTINCT FROM w_sejours_total.montant_regle_1_c OR
p_sejours.montant_regle_1_h IS DISTINCT FROM w_sejours_total.montant_regle_1_h OR
p_sejours.date_expedition_1 IS DISTINCT FROM w_sejours_total.date_expedition_1 OR
p_sejours.date_solde_1 IS DISTINCT FROM w_sejours_total.date_solde_1 OR
p_sejours.montant_facture_2_c IS DISTINCT FROM w_sejours_total.montant_facture_2_c OR
p_sejours.montant_facture_2_h IS DISTINCT FROM w_sejours_total.montant_facture_2_h OR
p_sejours.montant_regle_2_c IS DISTINCT FROM w_sejours_total.montant_regle_2_c OR
p_sejours.montant_regle_2_h IS DISTINCT FROM w_sejours_total.montant_regle_2_h OR
p_sejours.date_expedition_2 IS DISTINCT FROM w_sejours_total.date_expedition_2 OR
p_sejours.date_solde_2 IS DISTINCT FROM w_sejours_total.date_solde_2 OR
p_sejours.montant_facture_22_c IS DISTINCT FROM w_sejours_total.montant_facture_22_c OR
p_sejours.montant_facture_22_h IS DISTINCT FROM w_sejours_total.montant_facture_22_h OR
p_sejours.montant_regle_22_c IS DISTINCT FROM w_sejours_total.montant_regle_22_c OR
p_sejours.montant_regle_22_h IS DISTINCT FROM w_sejours_total.montant_regle_22_h OR
p_sejours.date_expedition_22 IS DISTINCT FROM w_sejours_total.date_expedition_22 OR
p_sejours.date_solde_22 IS DISTINCT FROM w_sejours_total.date_solde_22 OR
p_sejours.montant_comptabilise_c IS DISTINCT FROM w_sejours_total.montant_comptabilise_c OR
p_sejours.montant_comptabilise_h IS DISTINCT FROM w_sejours_total.montant_comptabilise_h OR
p_sejours.montant_comptabilise_0_c IS DISTINCT FROM w_sejours_total.montant_comptabilise_0_c OR
p_sejours.montant_comptabilise_0_h IS DISTINCT FROM w_sejours_total.montant_comptabilise_0_h OR
p_sejours.montant_comptabilise_1_c IS DISTINCT FROM w_sejours_total.montant_comptabilise_1_c OR
p_sejours.montant_comptabilise_1_h IS DISTINCT FROM w_sejours_total.montant_comptabilise_1_h OR
p_sejours.montant_comptabilise_2_c IS DISTINCT FROM w_sejours_total.montant_comptabilise_2_c OR
p_sejours.montant_comptabilise_2_h IS DISTINCT FROM w_sejours_total.montant_comptabilise_2_h OR
p_sejours.montant_comptabilise_22_c IS DISTINCT FROM w_sejours_total.montant_comptabilise_22_c OR
p_sejours.montant_comptabilise_22_h IS DISTINCT FROM w_sejours_total.montant_comptabilise_22_h OR
p_sejours.montant_comptabilise_budget_global_c IS DISTINCT FROM w_sejours_total.montant_comptabilise_budget_global_c OR
p_sejours.montant_facture_c_actes_inclus_dans_sejour IS DISTINCT FROM w_sejours_total.montant_facture_c_actes_inclus_dans_sejour OR
p_sejours.montant_facture_h_actes_inclus_dans_sejour IS DISTINCT FROM w_sejours_total.montant_facture_h_actes_inclus_dans_sejour OR
p_sejours.delai_groupage IS DISTINCT FROM w_sejours_total.delai_groupage OR
p_sejours.delai_facture IS DISTINCT FROM w_sejours_total.delai_facture OR
p_sejours.delai_expedition IS DISTINCT FROM w_sejours_total.delai_expedition OR
p_sejours.delai_solde IS DISTINCT FROM w_sejours_total.delai_solde OR
p_sejours.delai_expedition_0 IS DISTINCT FROM w_sejours_total.delai_expedition_0 OR
p_sejours.delai_solde_0 IS DISTINCT FROM w_sejours_total.delai_solde_0 OR
p_sejours.delai_expedition_1 IS DISTINCT FROM w_sejours_total.delai_expedition_1 OR
p_sejours.delai_solde_1 IS DISTINCT FROM w_sejours_total.delai_solde_1 OR
p_sejours.delai_expedition_2 IS DISTINCT FROM w_sejours_total.delai_expedition_2 OR
p_sejours.delai_solde_2 IS DISTINCT FROM w_sejours_total.delai_solde_2 OR
p_sejours.delai_expedition_22 IS DISTINCT FROM w_sejours_total.delai_expedition_22 OR
p_sejours.delai_solde_22 IS DISTINCT FROM w_sejours_total.delai_solde_22
);
]]>