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

2832 lines
109 KiB

<?xml version="1.0" encoding="ISO-8859-1"?>
<ROOT>
<NODE name="INIT" label="INITIALISATIONS">
<NODE label="Tables Articles">
<sqlcmd><![CDATA[
-- Table articles avec autres caractéristiques
INSERT INTO eco.t_divers (code, texte, valeur, description)
SELECT
'X3_TYPART',
'Source du type d''article',
'0',
'0=Première lettre du code, 1=Champ X_TYPACT_0'
WHERE 'X3_TYPART' NOT IN (SELECT code FROM eco.t_divers)
;
-- Table articles avec autres caractéristiques
DROP TABLE IF EXISTS w_ITMMASTER;
CREATE TEMP TABLE w_ITMMASTER AS
SELECT ITMMASTER.*,
''::text AS FAMCMP_CODE_CTI,
''::text AS SFMCP_CODE_CTI
FROM prod_sagex3.ITMMASTER
;
-- Colonne LPP selon integrateur
SELECT base.cti_execute('ALTER TABLE w_ITMMASTER ADD COLUMN X_LPPT_0 text., UPDATE w_ITMMASTER SET X_LPPT_0 = X_LPP_0',1)
WHERE 'x_lpp_0' IN (SELECT column_name FROM information_schema.columns WHERE table_name = 'itmmaster' AND table_schema = 'prod_sagex3') AND
'x_lppt_0' NOT IN (SELECT column_name FROM information_schema.columns WHERE table_name = 'itmmaster' AND table_schema = 'prod_sagex3')
;
SELECT base.cti_execute('ALTER TABLE w_ITMMASTER ADD COLUMN X_LPPF_0 text., UPDATE w_ITMMASTER SET X_LPPF_0 = X_LPP_0',1)
WHERE 'x_lpp_0' IN (SELECT column_name FROM information_schema.columns WHERE table_name = 'itmmaster' AND table_schema = 'prod_sagex3') AND
'x_lppf_0' NOT IN (SELECT column_name FROM information_schema.columns WHERE table_name = 'itmmaster' AND table_schema = 'prod_sagex3')
;
CREATE INDEX w_ITMMASTER_i1 ON w_ITMMASTER USING btree (ITMREF_0);
DELETE FROM w_ITMMASTER
USING
(
SELECT ITMREF_0, MAX(CTID) AS delCTID
FROM w_ITMMASTER
GROUP BY 1
HAVING count(*) > 1
) subview
WHERE w_ITMMASTER.ITMREF_0 = subview.ITMREF_0 AND
w_ITMMASTER.CTID = delCTID
;
-- Unites de stockage
INSERT INTO eco.t_unites(code, code_original, texte, texte_court)
SELECT
UOM_0,
UOM_0,
UOM_0,
UOM_0
FROM
prod_sagex3.TABUNIT
WHERE UOMTYP_0 IN (6,7)
AND UOM_0 NOT IN (SELECT code_original from eco.t_unites);
-- LPP
SELECT base.cti_execute('
INSERT INTO base.t_lpp (code, texte, texte_court)
SELECT X_CODLPP_0, X_LIBELLE_0, XLPP
FROM prod_sagex3.XLPP
WHERE X_CODLPP_0 NOT IN (SELECT code FROM base.t_lpp)
AND X_CODLPP_0 IN (SELECT X_LPPT_0 FROM w_ITMMASTER)',1)
WHERE EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'prod_sagex3' AND table_name = 'xlpp');
-- UCD
SELECT base.cti_execute('
INSERT INTO base.t_ucd (code, texte, texte_court, laboratoire_texte, conditionnement_texte)
SELECT X_UCDCOD_0, MAX(X_LIBELLE_0), MAX(X_LIBELLE_0), MAX(X_LABO_0), MAX(X_FORME_0)
FROM prod_sagex3.XUCD
WHERE X_UCDCOD_0 NOT IN (SELECT code FROM base.t_ucd)
AND X_UCDCOD_0 IN (SELECT X_UCDCOD_0 FROM w_ITMMASTER)
GROUP BY 1',1)
WHERE EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'prod_sagex3' AND table_name = 'xucd');
-- ATC
INSERT INTO eco.t_classification_atc(code_original, code, texte, texte_court )
SELECT UPPER(X_ATCCOD1_0), UPPER(MAX(X_ATCCOD1_0)), MAX(X_ATCDES1_0), MAX(X_ATCDES1_0)
FROM prod_sagex3.XATC1
LEFT JOIN eco.t_classification_atc ON code_original = UPPER(X_ATCCOD1_0)
WHERE code_original IS NULL
GROUP BY 1
ORDER BY 1;
INSERT INTO eco.t_classification_atc(code_original, code, texte, texte_court )
SELECT UPPER(X_ATCCOD2_0), UPPER(MAX(X_ATCCOD2_0)), MAX(X_ATCDES2_0), MAX(X_ATCDES2_0)
FROM prod_sagex3.XATC2
LEFT JOIN eco.t_classification_atc ON code_original = UPPER(X_ATCCOD2_0)
WHERE code_original IS NULL
GROUP BY 1
ORDER BY 1;
INSERT INTO eco.t_classification_atc(code_original, code, texte, texte_court )
SELECT UPPER(X_ATCCOD3_0), UPPER(MAX(X_ATCCOD3_0)), MAX(X_ATCDES3_0), MAX(X_ATCDES3_0)
FROM prod_sagex3.XATC3
LEFT JOIN eco.t_classification_atc ON code_original = UPPER(X_ATCCOD3_0)
WHERE code_original IS NULL
GROUP BY 1
ORDER BY 1;
INSERT INTO eco.t_classification_atc(code_original, code, texte, texte_court )
SELECT UPPER(X_ATCCOD4_0), UPPER(MAX(X_ATCCOD4_0)), MAX(X_ATCDES4_0), MAX(X_ATCDES4_0)
FROM prod_sagex3.XATC4
LEFT JOIN eco.t_classification_atc ON code_original = UPPER(X_ATCCOD4_0)
WHERE code_original IS NULL
GROUP BY 1
ORDER BY 1;
INSERT INTO eco.t_classification_atc(code_original, code, texte, texte_court )
SELECT UPPER(X_ATCCOD5_0), UPPER(MAX(X_ATCCOD5_0)), MAX(X_ATCDES5_0), MAX(X_ATCDES5_0)
FROM prod_sagex3.XATC5
LEFT JOIN eco.t_classification_atc ON code_original = UPPER(X_ATCCOD5_0)
WHERE code_original IS NULL
GROUP BY 1
ORDER BY 1;
INSERT INTO eco.t_classification_atc(code_original, code, texte, texte_court )
SELECT UPPER(X_ATCCOD_0), UPPER(MAX(X_ATCCOD_0)), MAX(X_ATCDES_0), MAX(X_ATCDES_0)
FROM prod_sagex3.XATC
LEFT JOIN eco.t_classification_atc ON code_original = UPPER(X_ATCCOD_0)
WHERE code_original IS NULL
GROUP BY 1
ORDER BY 1;
-- Standard ATC
SELECT eco.cti_reorganize_classification_atc();
-- Comptes
INSERT INTO eco.t_compte(code, texte, texte_court, code_original)
SELECT
GACCOUNT.ACC_0 AS code,
MAX(GACCOUNT.DES_0) AS texte,
MAX(GACCOUNT.DES_0) AS texte,
GACCOUNT.ACC_0 AS code_original
FROM prod_sagex3.GACCOUNT
JOIN w_ITMMASTER ON ACCCOD_0 = ACC_0
WHERE ACC_0 NOT IN (SELECT code_original FROM eco.t_compte WHERE code_original IS NOT NULL)
GROUP BY 1
ORDER BY 1;
-- Types d'articles
INSERT INTO eco.t_types_articles(code, texte, texte_court, code_original)
SELECT upper(substr(ITMREF_0,1,1)), upper(substr(ITMREF_0,1,1)),upper(substr(ITMREF_0,1,1)), upper(substr(ITMREF_0,1,1))
FROM prod_sagex3.ITMMASTER
JOIN eco.t_divers ON t_divers.code = 'X3_TYPART' AND t_divers.valeur <> '1'
WHERE upper(substr(ITMREF_0,1,1)) NOT IN (SELECT code_original FROM eco.t_types_articles WHERE code_original IS NOT NULL)
GROUP BY 1,2,3,4
ORDER BY 1;
INSERT INTO eco.t_types_articles(code, texte, texte_court, code_original)
SELECT LANNUM_0::text, LANMES_0, LANMES_0, LANNUM_0::text
FROM prod_sagex3.APLSTD
JOIN eco.t_divers ON t_divers.code = 'X3_TYPART' AND t_divers.valeur = '1'
WHERE LANCHP_0 = '1019' AND
LANNUM_0::text NOT IN (SELECT code_original FROM eco.t_types_articles WHERE code_original IS NOT NULL)
ORDER BY 1;
-- Familles d'articles
DROP TABLE IF EXISTS w_FAMILLE;
CREATE TEMP TABLE w_FAMILLE AS
SELECT XFAMILLE.X_GRPFAM_0,
XFAMILLE.X_FAMCOD_0 AS CODE,
UPPER(XFAMILLE.X_FAMCOD_0) AS CODE_CTI,
XFAMILLE.X_GRPCOD_0 AS GROUPE,
XFAMILLE.X_FAMCOD_0 AS GROUPE_CODE,
MAX(XFAMILLE.X_FAMDES_0) AS LIBELLE
FROM prod_sagex3.XFAMILLE
JOIN w_ITMMASTER ON
XFAMILLE.X_GRPCOD_0 = w_ITMMASTER.X_GRPCOD_0 AND
XFAMILLE.X_FAMCOD_0 = w_ITMMASTER.X_FAMCOD_0
WHERE XFAMILLE.X_FAMCOD_0 != ''
GROUP BY 1,2,3,4
ORDER BY 1,2;
UPDATE w_FAMILLE SET
CODE_CTI = CODE_CTI || ' (' || GROUPE || ')',
GROUPE_CODE = CODE || '-' || GROUPE
WHERE CODE IN (SELECT CODE FROM w_FAMILLE GROUP BY 1 HAVING COUNT(DISTINCT LIBELLE) > 1);
INSERT INTO eco.t_familles_articles(code, texte, texte_court, code_original)
SELECT CODE_CTI, LIBELLE, LIBELLE, GROUPE_CODE
FROM w_FAMILLE
WHERE GROUPE_CODE != '' AND
GROUPE_CODE NOT IN (SELECT code_original FROM eco.t_familles_articles WHERE code_original IS NOT NULL)
GROUP BY 1,2,3,4
ORDER BY 1;
UPDATE eco.t_familles_articles
SET texte = LIBELLE, texte_court = LIBELLE
FROM w_FAMILLE
WHERE w_FAMILLE.GROUPE_CODE = code_original AND
(texte IS DISTINCT FROM LIBELLE OR
texte_court IS DISTINCT FROM LIBELLE);
-- Sous familles
DROP TABLE IF EXISTS w_SOUS_FAMILLE;
CREATE TEMP TABLE w_SOUS_FAMILLE AS
SELECT XSFAMILLE.X_SFACOD_0 AS CODE,
UPPER(XSFAMILLE.X_SFACOD_0) AS CODE_CTI,
XSFAMILLE.X_GRPCOD_0 AS GROUPE,
XSFAMILLE.X_SFACOD_0 AS GROUPE_CODE,
MAX(XSFAMILLE.X_SFADES_0) AS LIBELLE
FROM prod_sagex3.XSFAMILLE
JOIN w_ITMMASTER ON
XSFAMILLE.X_GRPCOD_0 = w_ITMMASTER.X_GRPCOD_0 AND
XSFAMILLE.X_SFACOD_0 = w_ITMMASTER.X_SFACOD_0
WHERE XSFAMILLE.X_SFACOD_0 != ''
GROUP BY 1,2,3
ORDER BY 1,2;
UPDATE w_SOUS_FAMILLE SET
CODE_CTI = CODE_CTI || ' (' || GROUPE || ')',
GROUPE_CODE = CODE || '-' || GROUPE
WHERE CODE IN (SELECT CODE FROM w_SOUS_FAMILLE GROUP BY 1 HAVING COUNT(DISTINCT LIBELLE) > 1);
INSERT INTO eco.t_sous_familles_articles(code, texte, texte_court, code_original)
SELECT CODE_CTI, LIBELLE, LIBELLE, GROUPE_CODE
FROM w_SOUS_FAMILLE
WHERE
GROUPE_CODE NOT IN (SELECT code_original FROM eco.t_sous_familles_articles WHERE code_original IS NOT NULL)
GROUP BY 1,2,3,4
ORDER BY 1;
UPDATE eco.t_sous_familles_articles
SET texte = LIBELLE, texte_court = LIBELLE
FROM w_SOUS_FAMILLE
WHERE w_SOUS_FAMILLE.GROUPE_CODE = code_original AND
(texte IS DISTINCT FROM LIBELLE OR
texte_court IS DISTINCT FROM LIBELLE);
-- Catégories
DROP TABLE IF EXISTS w_XFAMCMP;
CREATE TEMP TABLE w_XFAMCMP AS
SELECT XFAMCMP.X_FMPCOD_0 AS CODE,
UPPER(XFAMCMP.X_FMPCOD_0) AS CODE_CTI,
XFAMCMP.X_FMPCOD_0 AS GROUPE_CODE,
MAX(XFAMCMP.X_FMPDES_0) AS LIBELLE
FROM prod_sagex3.XFAMCMP
JOIN w_ITMMASTER ON
XFAMCMP.X_FMPCOD_0 = w_ITMMASTER.X_FMPCOD_0
WHERE XFAMCMP.X_FMPCOD_0 != ''
GROUP BY 1,2,3
ORDER BY 1,2;
INSERT INTO eco.t_categories_articles(code, texte, texte_court, code_original)
SELECT TCLCOD_0, TCLCOD_0, TCLCOD_0, TCLCOD_0
FROM prod_sagex3.ITMCATEG
WHERE
TCLCOD_0 NOT IN (SELECT code_original FROM eco.t_categories_articles WHERE code_original IS NOT NULL)
GROUP BY 1,2,3,4
ORDER BY 1;
UPDATE eco.t_categories_articles SET
texte = TEXTE_0, texte_court = substr(TEXTE_0,1,50)
FROM prod_sagex3.ATEXTRA
WHERE code_original = IDENT1_0 AND
LANGUE_0 = 'FRA' AND
ZONE_0 = 'TCLAXX' AND
(texte <> TEXTE_0 OR texte_court <> substr(TEXTE_0,1,50))
;
-- Sous catégories
DROP TABLE IF EXISTS w_XSFACMP;
CREATE TEMP TABLE w_XSFACMP AS
SELECT XSFACMP.X_SFMCOD_0 AS CODE,
UPPER(XSFACMP.X_SFMCOD_0) AS CODE_CTI,
XSFACMP.X_SFMCOD_0 AS GROUPE_CODE,
MAX(XSFACMP.X_SFMDES_0) AS LIBELLE
FROM prod_sagex3.XSFACMP
JOIN w_ITMMASTER ON
XSFACMP.X_SFMCOD_0 = w_ITMMASTER.X_SFMCOD_0
GROUP BY 1,2,3
ORDER BY 1,2;
INSERT INTO eco.t_sous_categories_articles(code, code_original, texte, texte_court)
SELECT x_GRPCOD_0, x_GRPCOD_0, MAX(x_GRPDES_0), MAX(x_GRPDES_0)
FROM prod_sagex3.XGROUPE
WHERE
x_GRPCOD_0 NOT IN (SELECT code_original FROM eco.t_sous_categories_articles WHERE code_original IS NOT NULL)
GROUP BY 1,2
ORDER BY 1;
UPDATE eco.t_sous_categories_articles
SET texte = x_GRPDES_0, texte_court = substr(x_GRPDES_0,1,50)
FROM prod_sagex3.XGROUPE
WHERE x_GRPCOD_0 = code_original AND
(
texte IS DISTINCT FROM x_GRPDES_0 OR
texte_court IS DISTINCT FROM substr(x_GRPDES_0,1,50)
);
-- Articles
INSERT INTO eco.t_articles(code, texte, texte_court, code_original)
SELECT ITMREF_0, ITMDES1_0, substr(ITMDES1_0,1,50), ITMREF_0
FROM w_ITMMASTER
LEFT JOIN eco.t_articles ON (code_original = ITMREF_0)
WHERE code_original IS NULL;
UPDATE eco.t_articles
SET
texte = ITMDES1_0,
texte_court = substr(ITMDES1_0,1,50)
FROM w_ITMMASTER
WHERE code_original = ITMREF_0
AND (
texte IS DISTINCT FROM ITMDES1_0 OR
texte_court IS DISTINCT FROM substr(ITMDES1_0,1,50));
UPDATE eco.t_articles SET
type_id = COALESCE(t_types_articles.oid,0),
famille_id = COALESCE(t_familles_articles.oid,fam_grp.oid,0),
sous_famille_id = COALESCE(t_sous_familles_articles.oid,0),
categorie_id = COALESCE(t_categories_articles.oid,0),
sous_categorie_id = COALESCE(t_sous_categories_articles.oid,0),
classification_atc_id = COALESCE(t_classification_atc.oid,0),
unite_stockage_id = COALESCE(t_unites_stockage.oid,0),
unite_distribution_id = COALESCE(t_unites_distribution.oid,0),
lpp_id = COALESCE(t_lpp.oid,0),
ucd_id = COALESCE(t_ucd.oid,0)
FROM w_ITMMASTER
JOIN eco.t_divers ON t_divers.code = 'X3_TYPART'
LEFT JOIN eco.t_familles_articles ON X_FAMCOD_0 = upper(t_familles_articles.code_original)
LEFT JOIN eco.t_familles_articles fam_grp ON X_FAMCOD_0 || '-' || X_GRPCOD_0 = upper(fam_grp.code_original)
LEFT JOIN eco.t_sous_familles_articles ON X_SFACOD_0 = upper(t_sous_familles_articles.code_original)
LEFT JOIN eco.t_types_articles ON
CASE
WHEN t_divers.valeur = '1' THEN X_TYPACT_0::text
ELSE upper(substr(ITMREF_0,1,1))
END = upper(t_types_articles.code_original)
LEFT JOIN eco.t_classification_atc ON X_ATCCOD5_0 = upper(t_classification_atc.code_original)
LEFT JOIN eco.t_categories_articles ON TCLCOD_0 = upper(t_categories_articles.code_original)
LEFT JOIN eco.t_sous_categories_articles ON X_GRPCOD_0 = upper(t_sous_categories_articles.code_original)
LEFT JOIN eco.t_unites t_unites_stockage ON w_ITMMASTER.STU_0 = upper(t_unites_stockage.code_original)
LEFT JOIN eco.t_unites t_unites_distribution ON w_ITMMASTER.SAU_0 = upper(t_unites_distribution.code_original)
LEFT JOIN base.t_lpp ON coalesce(nullif(X_LPP_0, ''), nullif(x_lppf_0, ''), nullif(x_lppt_0, '')) = t_lpp.code
LEFT JOIN base.t_ucd ON COALESCE(NULLIF(X_UCDCOD_0, '')) = t_ucd.code
WHERE
t_articles.code_original = w_ITMMASTER.ITMREF_0 AND
(t_articles.type_id IS DISTINCT FROM COALESCE(t_types_articles.oid,0) OR
t_articles.famille_id IS DISTINCT FROM COALESCE(t_familles_articles.oid,fam_grp.oid,0) OR
t_articles.sous_famille_id IS DISTINCT FROM COALESCE(t_sous_familles_articles.oid,0) OR
t_articles.categorie_id IS DISTINCT FROM COALESCE(t_categories_articles.oid,0) OR
t_articles.sous_categorie_id IS DISTINCT FROM COALESCE(t_sous_categories_articles.oid,0) OR
t_articles.classification_atc_id IS DISTINCT FROM COALESCE(t_classification_atc.oid,0) OR
t_articles.unite_stockage_id IS DISTINCT FROM COALESCE(t_unites_stockage.oid,0) OR
t_articles.unite_distribution_id IS DISTINCT FROM COALESCE(t_unites_distribution.oid,0) OR
lpp_id IS DISTINCT FROM COALESCE(t_lpp.oid,0) OR
ucd_id IS DISTINCT FROM COALESCE(t_ucd.oid,0)
);
UPDATE eco.t_articles SET
compte_id = COALESCE(t_compte.oid,0)
FROM w_ITMMASTER
LEFT JOIN eco.t_compte ON ACCCOD_0 = t_compte.code_original
WHERE
t_articles.code_original = ITMREF_0 AND
(
t_articles.compte_id IS DISTINCT FROM COALESCE(t_compte.oid,0)
);
UPDATE eco.t_articles SET compte_id = 0 WHERE compte_id IS NULL;
-- gere en stock
-- niveau articles
UPDATE eco.t_articles
SET gere_en_stock = CASE WHEN STOMGTCOD_0 = 1 OR X_TYPSTK_0 != 1 THEN '0' ELSE '1' END
FROM prod_sagex3.ITMMASTER
WHERE ITMREF_0 = code_original AND
gere_en_stock != CASE WHEN STOMGTCOD_0 = 1 THEN '0' ELSE '1' END
;
-- niveau categorie (seulement pour désactiver)
UPDATE eco.t_articles
SET gere_en_stock = '0'
FROM prod_sagex3.ITMCATEG
WHERE TCLCOD_0 = categorie_code AND
LOCMGTCOD_0 = 0
;
UPDATE eco.t_articles SET
type_code = t_types_articles.code,
type_texte = t_types_articles.texte_court,
type_section_id = t_types_articles.section_id,
type_section_code = t_types_articles.section_code,
type_section_texte = t_types_articles.section_texte,
famille_code = t_familles_articles.code,
famille_texte = t_familles_articles.texte_court,
famille_section_id = t_familles_articles.section_id,
famille_section_code = t_familles_articles.section_code,
famille_section_texte = t_familles_articles.section_texte,
sous_famille_code = t_sous_familles_articles.code,
sous_famille_texte = t_sous_familles_articles.texte_court,
sous_famille_section_id = t_sous_familles_articles.section_id,
sous_famille_section_code = t_sous_familles_articles.section_code,
sous_famille_section_texte = t_sous_familles_articles.section_texte,
categorie_code = t_categories_articles.code,
categorie_texte = t_categories_articles.texte_court,
categorie_section_id = t_categories_articles.section_id,
categorie_section_code = t_categories_articles.section_code,
categorie_section_texte = t_categories_articles.section_texte,
sous_categorie_code = t_sous_categories_articles.code,
sous_categorie_texte = t_sous_categories_articles.texte_court,
sous_categorie_section_id = t_sous_categories_articles.section_id,
sous_categorie_section_code = t_sous_categories_articles.section_code,
sous_categorie_section_texte = t_sous_categories_articles.section_texte,
classification_atc_code = t_classification_atc.code,
classification_atc_texte = t_classification_atc.texte_court,
classification_atc_section_id = t_classification_atc.section_id,
classification_atc_section_code = t_classification_atc.section_code,
classification_atc_section_texte = t_classification_atc.section_texte,
classification_atc_1_id = t_classification_atc.classification_atc_1_id,
classification_atc_1_code = t_classification_atc.classification_atc_1_code,
classification_atc_1_texte = t_classification_atc.classification_atc_1_texte,
classification_atc_2_id = t_classification_atc.classification_atc_2_id,
classification_atc_2_code = t_classification_atc.classification_atc_2_code,
classification_atc_2_texte = t_classification_atc.classification_atc_2_texte,
classification_atc_3_id = t_classification_atc.classification_atc_3_id,
classification_atc_3_code = t_classification_atc.classification_atc_3_code,
classification_atc_3_texte = t_classification_atc.classification_atc_3_texte,
classification_atc_4_id = t_classification_atc.classification_atc_4_id,
classification_atc_4_code = t_classification_atc.classification_atc_4_code,
classification_atc_4_texte = t_classification_atc.classification_atc_4_texte,
unite_stockage_code = t_unites_stockage.code,
unite_stockage_texte = t_unites_stockage.texte_court,
unite_stockage_section_id = t_unites_stockage.section_id,
unite_stockage_section_code = t_unites_stockage.section_code,
unite_stockage_section_texte = t_unites_stockage.section_texte,
unite_distribution_code = t_unites_distribution.code,
unite_distribution_texte = t_unites_distribution.texte_court,
unite_distribution_section_id = t_unites_distribution.section_id,
unite_distribution_section_code = t_unites_distribution.section_code,
unite_distribution_section_texte = t_unites_distribution.section_texte,
compte_code = t_compte.code,
compte_texte = t_compte.texte_court,
compte_section_id = t_compte.section_id,
compte_section_code = t_compte.section_code,
compte_section_texte = t_compte.section_texte
FROM eco.t_types_articles ,
eco.t_familles_articles,
eco.t_sous_familles_articles,
eco.t_categories_articles,
eco.t_sous_categories_articles,
eco.t_classification_atc,
eco.t_unites t_unites_stockage,
eco.t_unites t_unites_distribution,
eco.t_compte
WHERE type_id = t_types_articles.oid
AND famille_id = t_familles_articles.oid
AND sous_famille_id = t_sous_familles_articles.oid
AND categorie_id = t_categories_articles.oid
AND sous_categorie_id = t_sous_categories_articles.oid
AND classification_atc_id = t_classification_atc.oid
AND unite_stockage_id = t_unites_stockage.oid
AND unite_distribution_id = t_unites_distribution.oid
AND compte_id = t_compte.oid
AND (
type_code IS DISTINCT FROM t_types_articles.code OR
type_texte IS DISTINCT FROM t_types_articles.texte_court OR
type_section_id IS DISTINCT FROM t_types_articles.section_id OR
type_section_code IS DISTINCT FROM t_types_articles.section_code OR
type_section_texte IS DISTINCT FROM t_types_articles.section_texte OR
famille_code IS DISTINCT FROM t_familles_articles.code OR
famille_texte IS DISTINCT FROM t_familles_articles.texte_court OR
famille_section_id IS DISTINCT FROM t_familles_articles.section_id OR
famille_section_code IS DISTINCT FROM t_familles_articles.section_code OR
famille_section_texte IS DISTINCT FROM t_familles_articles.section_texte OR
sous_famille_code IS DISTINCT FROM t_sous_familles_articles.code OR
sous_famille_texte IS DISTINCT FROM t_sous_familles_articles.texte_court OR
sous_famille_section_id IS DISTINCT FROM t_sous_familles_articles.section_id OR
sous_famille_section_code IS DISTINCT FROM t_sous_familles_articles.section_code OR
sous_famille_section_texte IS DISTINCT FROM t_sous_familles_articles.section_texte OR
categorie_code IS DISTINCT FROM t_categories_articles.code OR
categorie_texte IS DISTINCT FROM t_categories_articles.texte_court OR
categorie_section_id IS DISTINCT FROM t_categories_articles.section_id OR
categorie_section_code IS DISTINCT FROM t_categories_articles.section_code OR
categorie_section_texte IS DISTINCT FROM t_categories_articles.section_texte OR
sous_categorie_code IS DISTINCT FROM t_sous_categories_articles.code OR
sous_categorie_texte IS DISTINCT FROM t_sous_categories_articles.texte_court OR
sous_categorie_section_id IS DISTINCT FROM t_sous_categories_articles.section_id OR
sous_categorie_section_code IS DISTINCT FROM t_sous_categories_articles.section_code OR
sous_categorie_section_texte IS DISTINCT FROM t_sous_categories_articles.section_texte OR
t_articles.classification_atc_code IS DISTINCT FROM t_classification_atc.code OR
t_articles.classification_atc_texte IS DISTINCT FROM t_classification_atc.texte_court OR
t_articles.classification_atc_section_id IS DISTINCT FROM t_classification_atc.section_id OR
t_articles.classification_atc_section_code IS DISTINCT FROM t_classification_atc.section_code OR
t_articles.classification_atc_section_texte IS DISTINCT FROM t_classification_atc.section_texte OR
t_articles.classification_atc_1_id IS DISTINCT FROM t_classification_atc.classification_atc_1_id OR
t_articles.classification_atc_1_code IS DISTINCT FROM t_classification_atc.classification_atc_1_code OR
t_articles.classification_atc_1_texte IS DISTINCT FROM t_classification_atc.classification_atc_1_texte OR
t_articles.classification_atc_2_id IS DISTINCT FROM t_classification_atc.classification_atc_2_id OR
t_articles.classification_atc_2_code IS DISTINCT FROM t_classification_atc.classification_atc_2_code OR
t_articles.classification_atc_2_texte IS DISTINCT FROM t_classification_atc.classification_atc_2_texte OR
t_articles.classification_atc_3_id IS DISTINCT FROM t_classification_atc.classification_atc_3_id OR
t_articles.classification_atc_3_code IS DISTINCT FROM t_classification_atc.classification_atc_3_code OR
t_articles.classification_atc_3_texte IS DISTINCT FROM t_classification_atc.classification_atc_3_texte OR
t_articles.classification_atc_4_id IS DISTINCT FROM t_classification_atc.classification_atc_4_id OR
t_articles.classification_atc_4_code IS DISTINCT FROM t_classification_atc.classification_atc_4_code OR
t_articles.classification_atc_4_texte IS DISTINCT FROM t_classification_atc.classification_atc_4_texte OR
t_articles.unite_stockage_code IS DISTINCT FROM t_unites_stockage.code OR
t_articles.unite_stockage_texte IS DISTINCT FROM t_unites_stockage.texte_court OR
t_articles.unite_stockage_section_id IS DISTINCT FROM t_unites_stockage.section_id OR
t_articles.unite_stockage_section_code IS DISTINCT FROM t_unites_stockage.section_code OR
t_articles.unite_stockage_section_texte IS DISTINCT FROM t_unites_stockage.section_texte OR
t_articles.unite_distribution_code IS DISTINCT FROM t_unites_distribution.code OR
t_articles.unite_distribution_texte IS DISTINCT FROM t_unites_distribution.texte_court OR
t_articles.unite_distribution_section_id IS DISTINCT FROM t_unites_distribution.section_id OR
t_articles.unite_distribution_section_code IS DISTINCT FROM t_unites_distribution.section_code OR
t_articles.unite_distribution_section_texte IS DISTINCT FROM t_unites_distribution.section_texte OR
t_articles.compte_code IS DISTINCT FROM t_compte.code OR
t_articles.compte_texte IS DISTINCT FROM t_compte.texte_court OR
t_articles.compte_section_id IS DISTINCT FROM t_compte.section_id OR
t_articles.compte_section_code IS DISTINCT FROM t_compte.section_code OR
t_articles.compte_section_texte IS DISTINCT FROM t_compte.section_texte
);
UPDATE eco.t_articles
SET taux_tva_en_cours = VAT_RAT
FROM
(
SELECT ITMREF_0, MAX(CASE WHEN VATRAT_0 = 20.6 THEN 20 ELSE VATRAT_0 END) AS VAT_RAT, count(*)
FROM prod_sagex3.ITMMASTER
JOIN prod_sagex3.TABVAC ON TABVAC.vacitm_0 = ITMMASTER.vacitm_0
JOIN prod_sagex3.TABVAT ON TABVAC.VAT_0 = TABVAT.VAT_0
GROUP BY 1
) subview
WHERE ITMREF_0 = t_articles.code_original AND
taux_tva_en_cours IS DISTINCT FROM VAT_RAT
;
]]>
</sqlcmd>
</NODE>
<NODE label="Tables Fournisseurs">
<sqlcmd><![CDATA[
-- Types de fournisseurs
UPDATE prod_sagex3.BPARTNER
SET BPSFLG_0 = CASE WHEN BPRNUM_0 IN (SELECT BPSNUM_0 FROM prod_sagex3.BPSUPPLIER) THEN 2 ELSE 1 END
WHERE BPSFLG_0 <> CASE WHEN BPRNUM_0 IN (SELECT BPSNUM_0 FROM prod_sagex3.BPSUPPLIER) THEN 2 ELSE 1 END
;
-- Fournisseurs (basé sur commandes)
INSERT INTO eco.t_fournisseurs(code, code_original, texte, texte_court)
SELECT BPSNUM_0, BPSNUM_0, BPSNAM_0, CASE WHEN BPSSHO_0 != '' THEN BPSSHO_0 ELSE BPSNAM_0 END
FROM prod_sagex3.BPSUPPLIER
JOIN prod_sagex3.BPADDRESS ON BPSUPPLIER.BPSNUM_0 = BPADDRESS.BPANUM_0
WHERE BPSNUM_0 NOT IN (SELECT code_original FROM eco.t_fournisseurs WHERE code_original IS NOT NULL)
AND BPSNUM_0 IN (SELECT BPSNUM_0 FROM prod_sagex3.PORDER GROUP BY 1)
GROUP BY 1,2,3,4
ORDER BY BPSNUM_0
;
-- fournisseurs (basés sur mouvements au cas ou)
INSERT INTO eco.t_fournisseurs(code, code_original, texte, texte_court)
SELECT BPRNUM_0, BPRNUM_0, BPRNAM_0, BPRNAM_0
FROM prod_sagex3.BPARTNER
WHERE BPRNUM_0 IN (SELECT BPRNUM_0 FROM prod_sagex3.STOJOU GROUP BY 1)
AND BPRNUM_0 NOT IN (SELECT code_original FROM eco.t_fournisseurs)
AND BPSFLG_0 = 2 -- BPRNUM_0 ~ '^[0-9].*$'
;
INSERT INTO eco.t_fournisseurs(code, code_original, texte, texte_court)
SELECT BPRNUM_0, BPRNUM_0, BPRNAM_0, BPRNAM_0
FROM prod_sagex3.BPARTNER
WHERE BPRNUM_0 IN (SELECT BPSNUM_0 FROM prod_SAGEX3.ITMBPS GROUP BY 1)
AND BPRNUM_0 NOT IN (SELECT code_original FROM eco.t_fournisseurs)
AND BPSFLG_0 = 2 -- BPRNUM_0 ~ '^[0-9].*$'
;
INSERT INTO base.t_codes_postaux(code, texte, texte_court, departement_id)
SELECT POSCOD_0, MAX(CTY_0), MAX(CTY_0), MAX(t_departements.oid)
FROM prod_sagex3.BPSUPPLIER
JOIN prod_sagex3.BPADDRESS ON BPSUPPLIER.BPSNUM_0 = BPADDRESS.BPANUM_0
LEFT JOIN base.t_codes_postaux ON POSCOD_0 = t_codes_postaux.code
JOIN base.t_departements ON CASE WHEN CRY_0 = 'FR' THEN substr(POSCOD_0,1,2) else '99' END = t_departements.code
WHERE t_codes_postaux.oid IS NULL
GROUP BY 1
;
UPDATE eco.t_fournisseurs
SET
texte = BPSNAM_0,
texte_court = CASE WHEN BPSSHO_0 != '' THEN BPSSHO_0 ELSE BPSNAM_0 END,
adresse = trim(BPAADDLIG_0 || ' ' || BPAADDLIG_1 || ' ' || BPAADDLIG_2),
code_postal_id = COALESCE(t_codes_postaux.oid,0),
ville = CTY_0,
telephone = TEL_0,
fax = FAX_0,
email = WEB_0
FROM prod_sagex3.BPSUPPLIER
JOIN prod_sagex3.BPADDRESS ON BPSUPPLIER.BPSNUM_0 = BPADDRESS.BPANUM_0
LEFT JOIN base.t_codes_postaux ON POSCOD_0 = t_codes_postaux.code
WHERE code_original = BPSUPPLIER.BPSNUM_0
AND
(
t_fournisseurs.texte IS DISTINCT FROM BPSNAM_0 OR
t_fournisseurs.texte_court IS DISTINCT FROM CASE WHEN BPSSHO_0 != '' THEN BPSSHO_0 ELSE BPSNAM_0 END OR
t_fournisseurs.adresse IS DISTINCT FROM trim(BPAADDLIG_0 || ' ' || BPAADDLIG_1 || ' ' || BPAADDLIG_2) OR
t_fournisseurs.code_postal_id IS DISTINCT FROM COALESCE(t_codes_postaux.oid,0) OR
t_fournisseurs.ville IS DISTINCT FROM CTY_0 OR
t_fournisseurs.telephone IS DISTINCT FROM TEL_0 OR
t_fournisseurs.fax IS DISTINCT FROM FAX_0 OR
t_fournisseurs.email IS DISTINCT FROM WEB_0
)
;
UPDATE eco.t_fournisseurs
SET
texte = BPRNAM_0,
texte_court = CASE WHEN BPRSHO_0 != '' THEN BPRSHO_0 ELSE BPRNAM_0 END,
adresse = trim(BPAADDLIG_0 || ' ' || BPAADDLIG_1 || ' ' || BPAADDLIG_2),
code_postal_id = COALESCE(t_codes_postaux.oid,0),
ville = CTY_0,
telephone = TEL_0,
fax = FAX_0,
email = WEB_0,
siret = BPARTNER.CRN_0,
iban = CASE WHEN length(BPARTNER.BIDNUM_0) = 23 THEN CASE WHEN IBAN_0 <> '' THEN IBAN_0 ELSE 'FR76' END || BPARTNER.BIDNUM_0 ELSE '' END,
bic = COALESCE(BICCOD_0,'')
FROM prod_sagex3.BPARTNER
JOIN prod_sagex3.BPADDRESS ON BPARTNER.BPRNUM_0 = BPADDRESS.BPANUM_0 AND BPARTNER.BPAADD_0 = BPADDRESS.BPAADD_0
LEFT JOIN base.t_codes_postaux ON POSCOD_0 = t_codes_postaux.code
LEFT JOIN prod_sagex3.BID ON BPARTNER.BPRNUM_0 = BID.BPANUM_0
WHERE code_original = BPARTNER.BPRNUM_0
AND
(
t_fournisseurs.texte IS DISTINCT FROM BPRNAM_0 OR
t_fournisseurs.texte_court IS DISTINCT FROM CASE WHEN BPRSHO_0 != '' THEN BPRSHO_0 ELSE BPRNAM_0 END OR
t_fournisseurs.adresse IS DISTINCT FROM trim(BPAADDLIG_0 || ' ' || BPAADDLIG_1 || ' ' || BPAADDLIG_2) OR
t_fournisseurs.code_postal_id IS DISTINCT FROM COALESCE(t_codes_postaux.oid,0) OR
t_fournisseurs.ville IS DISTINCT FROM CTY_0 OR
t_fournisseurs.telephone IS DISTINCT FROM TEL_0 OR
t_fournisseurs.fax IS DISTINCT FROM FAX_0 OR
t_fournisseurs.email IS DISTINCT FROM WEB_0 OR
t_fournisseurs.siret IS DISTINCT FROM BPARTNER.CRN_0 OR
t_fournisseurs.iban IS DISTINCT FROM CASE WHEN length(BPARTNER.BIDNUM_0) = 23 THEN CASE WHEN BPARTNER.CRY_0 = 'FR' THEN 'FR76' ELSE '' END || BPARTNER.BIDNUM_0 ELSE '' END OR
t_fournisseurs.bic IS DISTINCT FROM COALESCE(BICCOD_0,'')
)
;
UPDATE eco.t_fournisseurs
SET type_id = 0
WHERE type_id IS NULL;
UPDATE eco.t_fournisseurs SET
type_code = t_types_fournisseurs.code,
type_texte = t_types_fournisseurs.texte_court,
type_section_id = t_types_fournisseurs.section_id,
type_section_code = t_types_fournisseurs.section_code,
type_section_texte = t_types_fournisseurs.section_texte
FROM eco.t_types_fournisseurs
WHERE type_id = t_types_fournisseurs.oid
AND (
type_code IS DISTINCT FROM t_types_fournisseurs.code OR
type_texte IS DISTINCT FROM t_types_fournisseurs.texte_court OR
type_section_id IS DISTINCT FROM t_types_fournisseurs.section_id OR
type_section_code IS DISTINCT FROM t_types_fournisseurs.section_code OR
type_section_texte IS DISTINCT FROM t_types_fournisseurs.section_texte
);
UPDATE eco.t_articles SET
fournisseur_principal_id = t_fournisseurs.oid
FROM w_ITMMASTER, eco.t_fournisseurs
WHERE 1=1
AND t_fournisseurs.code = X_BPSPRIO_0
AND ITMREF_0 = t_articles.code
;
UPDATE eco.t_articles SET
ref_fournisseur_id = subview.ref_fournisseur_id,
ref_fournisseur_texte = subview.ref_fournisseur_texte
FROM
(
SELECT article_id,
base.cti_group_array3(fournisseur_id) AS ref_fournisseur_id,
base.cti_group_array3(ref_fournisseur_texte) AS ref_fournisseur_texte
FROM
(
SELECT
t_articles.oid AS article_id,
t_fournisseurs.oid AS fournisseur_id,
ITMDESBPS_0 || '(' || ITMREFBPS_0 || ')' AS ref_fournisseur_texte
FROM eco.t_articles
LEFT JOIN prod_sagex3.ITMBPS ON t_articles.code = ITMREF_0
JOIN eco.t_fournisseurs ON BPSNUM_0 = t_fournisseurs.code
GROUP BY 1,2,3
ORDER BY 1,2,3
) subview
GROUP BY 1
) subview
WHERE t_articles.oid = subview.article_id AND
(
t_articles.ref_fournisseur_id IS DISTINCT FROM subview.ref_fournisseur_id OR
t_articles.ref_fournisseur_texte IS DISTINCT FROM subview.ref_fournisseur_texte
)
;
-- Article fournisseur
DROP TABLE IF EXISTS w_article_fournisseur_eco;
CREATE TEMP TABLE w_article_fournisseur_eco AS
SELECT
ITMBPS.ITMREF_0 || '-' ||ITMBPS.BPSNUM_0 AS code_original,
t_articles.oid AS article_id,
t_fournisseurs.oid AS fournisseur_id,
CASE WHEN ITMREFBPS_0 <> '' THEN ITMREFBPS_0 ELSE EANCODBPS_0 END AS code_reference_fournisseur,
ITMDESBPS_0 AS texte_reference_fournisseur,
X_CIPCOD13_0 AS code_cip,
''::text AS code_cahpp,
COALESCE(t_unites.oid,0) AS unite_approvisionnement_id,
ITMBPS.PUUSTUCOE_0 AS nombre_conditionnement_approvisionnement,
0::numeric AS prix_unitaire_en_cours,
CASE WHEN row_number() OVER (PARTITION BY ITMBPS.ITMREF_0 ORDER BY PIO_0) = 1 THEn '1' ELSE '0' END AS est_fournisseur_principal,
t_fournisseurs.oid AS fournisseur_distributeur_id,
X_UCDCOD_0 AS ucd_code,
0::bigint AS ucd_id,
X_LPPT_0 AS lpp_code,
0::bigint AS lpp_id,
X_UCDCOD13_0 AS code_ucd13
FROM prod_SAGEX3.ITMBPS
JOIN w_ITMMASTER ITMMASTER ON ITMBPS.ITMREF_0 = ITMMASTER.ITMREF_0
JOIN eco.t_articles ON ITMBPS.ITMREF_0 = t_articles.code_original
JOIN eco.t_fournisseurs ON ITMBPS.BPSNUM_0 = t_fournisseurs.code_original
LEFT JOIN eco.t_unites ON ITMBPS.PCU_0 = t_unites.code_original
;
ANALYSE w_article_fournisseur_eco
;
-- Champs supplémentaires provenant de ITMBPS
SELECT base.cti_execute('
UPDATE w_article_fournisseur_eco
SET ucd_code = X_UCDITP_0
FROM prod_SAGEX3.ITMBPS
WHERE ITMBPS.ITMREF_0 || ''-'' ||ITMBPS.BPSNUM_0 = code_original AND
X_UCDITP_0 <> '''' AND
length(X_UCDITP_0) = 7 AND
ucd_code <> X_UCDITP_0
',1)
WHERE 'x_ucditp_0' IN (SELECT column_name FROM information_schema.columns WHERE table_name = 'itmbps')
;
SELECT base.cti_execute('
UPDATE w_article_fournisseur_eco
SET code_ucd13 = X_UCDITP1_0
FROM prod_SAGEX3.ITMBPS
WHERE ITMBPS.ITMREF_0 || ''-'' ||ITMBPS.BPSNUM_0 = code_original AND
X_UCDITP_0 <> '''' AND
length(X_UCDITP1_0) = 13 AND
code_ucd13 <> X_UCDITP1_0 AND
X_UCDITP1_0 LIKE ''34008%''
',1)
WHERE 'x_ucditp1_0' IN (SELECT column_name FROM information_schema.columns WHERE table_name = 'itmbps')
;
SELECT base.cti_execute('
UPDATE w_article_fournisseur_eco
SET code_cip = X_CIPITP1_0
FROM prod_SAGEX3.ITMBPS
WHERE ITMBPS.ITMREF_0 || ''-'' ||ITMBPS.BPSNUM_0 = code_original AND
X_UCDITP_0 <> '''' AND
length(X_CIPITP1_0) = 13 AND
code_cip <> X_CIPITP1_0 AND
X_CIPITP1_0 LIKE ''34%'' AND
X_CIPITP1_0 NOT LIKE ''34008%''
',1)
WHERE 'x_cipitp1_0' IN (SELECT column_name FROM information_schema.columns WHERE table_name = 'itmbps')
;
-- Code UCD selon code ucd 13
UPDATE w_article_fournisseur_eco
SET ucd_code = substr(code_ucd13,6,7)
WHERE ucd_code = '' AND code_ucd13 LIKE '34008%'
;
UPDATE w_article_fournisseur_eco
SET ucd_id = t_ucd.oid
FROM base.t_ucd
WHERE ucd_code = t_ucd.code
;
UPDATE w_article_fournisseur_eco
SET lpp_id = t_lpp.oid
FROM base.t_lpp
WHERE lpp_code = t_lpp.code
;
UPDATE w_article_fournisseur_eco
SET prix_unitaire_en_cours = NETPRI_0
FROM
(
SELECT PORDERP.ITMREF_0 || '-' ||PORDER.BPSNUM_0 AS code_original,
(MAX(ARRAY[ORDDAT_0::text,NETPRI_0::text]))[2]::numeric AS NETPRI_0
FROM prod_sagex3.PORDER
JOIN prod_sagex3.PORDERP ON PORDERP.POHNUM_0 = PORDER.POHNUM_0
GROUP BY 1
) subview
WHERE w_article_fournisseur_eco.code_original = subview.code_original
;
INSERT INTO eco.t_article_fournisseur (
code_original,
article_id,
fournisseur_id,
code_reference_fournisseur,
texte_reference_fournisseur,
code_cip,
ucd_id,
code_ucd13,
lpp_id,
code_cahpp,
unite_approvisionnement_id,
nombre_conditionnement_approvisionnement,
prix_unitaire_en_cours
)
SELECT
code_original,
article_id,
fournisseur_id,
code_reference_fournisseur,
texte_reference_fournisseur,
code_cip,
ucd_id,
code_ucd13,
lpp_id,
code_cahpp,
unite_approvisionnement_id,
nombre_conditionnement_approvisionnement,
prix_unitaire_en_cours
FROM w_article_fournisseur_eco
WHERE w_article_fournisseur_eco.code_original NOT IN (SELECT t_article_fournisseur.code_original FROM eco.t_article_fournisseur WHERE code_original IS NOT NULL)
;
UPDATE eco.t_article_fournisseur SET
article_id = w_article_fournisseur_eco.article_id,
fournisseur_id = w_article_fournisseur_eco.fournisseur_id,
code_reference_fournisseur = w_article_fournisseur_eco.code_reference_fournisseur,
texte_reference_fournisseur = w_article_fournisseur_eco.texte_reference_fournisseur,
code_cip = w_article_fournisseur_eco.code_cip,
code_ucd13 = w_article_fournisseur_eco.code_ucd13,
ucd_id = w_article_fournisseur_eco.ucd_id,
lpp_id = w_article_fournisseur_eco.lpp_id,
code_cahpp = w_article_fournisseur_eco.code_cahpp,
unite_approvisionnement_id = w_article_fournisseur_eco.unite_approvisionnement_id,
nombre_conditionnement_approvisionnement = w_article_fournisseur_eco.nombre_conditionnement_approvisionnement,
prix_unitaire_en_cours = w_article_fournisseur_eco.prix_unitaire_en_cours
FROM w_article_fournisseur_eco
WHERE t_article_fournisseur.code_original = w_article_fournisseur_eco.code_original AND
(
t_article_fournisseur.article_id IS DISTINCT FROM w_article_fournisseur_eco.article_id OR
t_article_fournisseur.fournisseur_id IS DISTINCT FROM w_article_fournisseur_eco.fournisseur_id OR
t_article_fournisseur.code_reference_fournisseur IS DISTINCT FROM w_article_fournisseur_eco.code_reference_fournisseur OR
t_article_fournisseur.texte_reference_fournisseur IS DISTINCT FROM w_article_fournisseur_eco.texte_reference_fournisseur OR
t_article_fournisseur.code_cip IS DISTINCT FROM w_article_fournisseur_eco.code_cip OR
t_article_fournisseur.code_ucd13 IS DISTINCT FROM w_article_fournisseur_eco.code_ucd13 OR
t_article_fournisseur.ucd_id IS DISTINCT FROM w_article_fournisseur_eco.ucd_id OR
t_article_fournisseur.lpp_id IS DISTINCT FROM w_article_fournisseur_eco.lpp_id OR
t_article_fournisseur.code_cahpp IS DISTINCT FROM w_article_fournisseur_eco.code_cahpp OR
t_article_fournisseur.unite_approvisionnement_id IS DISTINCT FROM w_article_fournisseur_eco.unite_approvisionnement_id OR
t_article_fournisseur.nombre_conditionnement_approvisionnement IS DISTINCT FROM w_article_fournisseur_eco.nombre_conditionnement_approvisionnement OR
t_article_fournisseur.prix_unitaire_en_cours IS DISTINCT FROM w_article_fournisseur_eco.prix_unitaire_en_cours
)
;
]]>
</sqlcmd>
</NODE>
<NODE label="Autres tables">
<sqlcmd><![CDATA[
-- Gestionnaires
-- Achats
INSERT INTO eco.t_gestionnaires(code_original, code, texte, texte_court)
SELECT USR_0, USR_0, NOMUSR_0, NOMUSR_0
FROM prod_sagex3.AUTILIS
LEFT JOIN eco.t_gestionnaires ON (code_original = USR_0)
WHERE code_original IS NULL AND
USR_0 IN (SELECT USR_0 FROM prod_sagex3.PORDER);
-- Stocks
INSERT INTO eco.t_gestionnaires(code_original, code, texte, texte_court)
SELECT USR_0, USR_0, NOMUSR_0, NOMUSR_0
FROM prod_sagex3.AUTILIS
LEFT JOIN eco.t_gestionnaires ON (code_original = USR_0)
WHERE code_original IS NULL AND
USR_0 IN (SELECT UPDUSR_0 FROM prod_sagex3.STOCK);
-- Unités fonctionnelles
INSERT INTO eco.t_unites_fonctionnelles(code_original, code, texte, texte_court)
SELECT BPRNUM_0, BPRNUM_0, BPRNAM_0, BPRNAM_0
FROM prod_sagex3.BPARTNER
WHERE BPRNUM_0 IN (
SELECT BPRNUM_0
FROM prod_sagex3.STOJOU
GROUP BY 1
)
AND BPSFLG_0 = 1
AND BPRNUM_0 NOT IN (SELECT code_original FROM eco.t_unites_fonctionnelles)
;
UPDATE eco.t_unites_fonctionnelles SET
texte = FCYNAM_0,
texte_court = FCYNAM_0
FROM prod_sagex3.FACILITY
JOIN prod_sagex3.STOLOC ON FCY_0 = STOFCY_0
WHERE code_original = FCY_0
AND (texte IS DISTINCT FROM FCYNAM_0 OR
texte_court IS DISTINCT FROM FCYNAM_0);
-- Lieux
INSERT INTO eco.t_lieux(code_original, code, texte, texte_court)
SELECT STOFCY_0, STOFCY_0, STOFCY_0 , STOFCY_0
FROM prod_sagex3.STOLOC
LEFT JOIN eco.t_lieux ON (code_original = STOFCY_0)
WHERE code_original IS NULL
GROUP BY 1,2,3,4;
INSERT INTO eco.t_lieux(code_original, code, texte, texte_court)
SELECT LOC_0, LOC_0, LOC_0, LOC_0
FROM prod_sagex3.STOLOC
LEFT JOIN eco.t_lieux ON (code_original = LOC_0)
WHERE code_original IS NULL
GROUP BY 1,2,3,4;
INSERT INTO eco.t_lieux(code_original, code, texte, texte_court)
SELECT STOFCY_0, STOFCY_0, STOFCY_0 , STOFCY_0
FROM prod_sagex3.STOLOC
LEFT JOIN eco.t_lieux ON (code_original = STOFCY_0)
WHERE code_original IS NULL
GROUP BY 1,2,3,4;
-- Site
INSERT INTO eco.t_sites(code, code_original,texte, texte_court)
SELECT FCY_0, FCY_0, FCYNAM_0, FCYNAM_0
FROM prod_sagex3.FACILITY
WHERE FCY_0 IN (SELECT POHFCY_0 FROM prod_sagex3.PORDER) AND
FCY_0 NOT IN (SELECT code_original FROM eco.t_sites WHERE code_original IS NOT NULL)
ORDER BY FCY_0;
INSERT INTO eco.t_sites(code, code_original,texte, texte_court)
SELECT FCY_0, FCY_0, FCYNAM_0, FCYNAM_0
FROM prod_sagex3.FACILITY
WHERE FCY_0 IN (SELECT STOFCY_0 FROM prod_sagex3.STOJOU) AND
FCY_0 NOT IN (SELECT code_original FROM eco.t_sites WHERE code_original IS NOT NULL)
ORDER BY FCY_0;
-- Types mouvements
INSERT INTO eco.t_types_mouvements(code, texte, texte_court, code_original)
SELECT LANNUM_0, LANMES_0, LANMES_0, LANNUM_0
FROM prod_sagex3.APLSTD
LEFT JOIN eco.t_types_mouvements ON code_original = LANNUM_0
WHERE LANCHP_0 = 704 AND LAN_0 = 'FRA' AND t_types_mouvements.oid IS NULL
GROUP BY 1,2,3,4;
]]></sqlcmd>
</NODE>
<NODE label="Table optionelle PRECEIPTD">
<condition><![CDATA[
SELECT count(*) > 0
FROM information_schema.tables
WHERE 1=1
AND table_schema = 'prod_sagex3'
AND table_name = 'preceiptd'
;
]]> </condition>
<sqlcmd><![CDATA[
INSERT INTO eco.t_unites_fonctionnelles(code_original, code, texte, texte_court)
SELECT BPRNUM_0, BPRNUM_0, BPRNAM_0, BPRNAM_0
FROM prod_sagex3.BPARTNER
WHERE BPSFLG_0 <> 2 AND
BPRNUM_0 IN (
SELECT X_SERVICE_0
FROM prod_sagex3.PRECEIPTD
GROUP BY 1
)
AND BPRNUM_0 NOT IN (SELECT code_original FROM eco.t_unites_fonctionnelles)
;
]]></sqlcmd>
</NODE>
</NODE>
<NODE name="PROD" label="RECUPERATION DES DONNEES DE PRODUCTION">
<NODE label="Commandes">
<sqlcmd><![CDATA[
-- Cas de commandes en mode abonnement (même ligne commandée plusieurs fois)
DROP TABLE IF EXISTS w_PORDER;
CREATE TEMP TABLE w_PORDER AS
SELECT *
FROM prod_sagex3.PORDER
;
DROP TABLE IF EXISTS w_PORDERP;
CREATE TEMP TABLE w_PORDERP AS
SELECT PORDERP.*, POHNUM_0 AS POHNUM_0_orig, COALESCE(VATRAT_0,0) AS VATRAT_0
FROM prod_sagex3.PORDERP
LEFT JOIN prod_sagex3.TABVAT ON PORDERP.VAT_0 = TABVAT.VAT_0
;
DROP TABLE IF EXISTS w_PORDERP_multi;
CREATE TEMP TABLE w_PORDERP_multi AS
SELECT POHNUM_0
FROM
(
SELECT POHNUM_0, POPLIN_0
FROM w_PORDERP
GROUP BY 1,2
HAVING count(*) > 1
) subview
GROUP BY 1
;
UPDATE w_PORDERP
SET POHNUM_0 = w_PORDERP.POHNUM_0 || '-' || to_char(STRDAT_0,'YYYYMMDD')
FROM w_PORDERP_multi
WHERE w_PORDERP.POHNUM_0 = w_PORDERP_multi.POHNUM_0
;
DROP TABLE IF EXISTS w_PORDERP_eclat;
CREATE TEMP TABLE w_PORDERP_eclat AS
SELECT POHNUM_0_orig, w_PORDERP.POHNUM_0, MIN(STRDAT_0) AS STRDAT_0, MAX(POPDAT_0) AS POPDAT_0
FROM w_PORDERP
JOIN w_PORDERP_multi ON w_PORDERP_multi.POHNUM_0 = w_PORDERP.POHNUM_0_orig
GROUP BY 1,2
;
DROP TABLE IF EXISTS w_PORDER_new;
CREATE TEMP TABLE w_PORDER_new AS
SELECT w_PORDER.*,
w_PORDERP_eclat.POHNUM_0 AS POHNUM_0_new,
w_PORDERP_eclat.STRDAT_0 AS STRDAT_0_new,
w_PORDERP_eclat.POPDAT_0 AS POPDAT_0_new
FROM w_PORDER
JOIN w_PORDERP_eclat ON w_PORDERP_eclat.POHNUM_0_orig = w_PORDER.POHNUM_0
;
UPDATE w_PORDER_new SET
POHNUM_0 = POHNUM_0_new,
STRDAT_0 = STRDAT_0_new,
ORDDAT_0 = STRDAT_0_new
;
ALTER TABLE w_PORDER_new DROP COLUMN POHNUM_0_new
;
ALTER TABLE w_PORDER_new DROP COLUMN STRDAT_0_new
;
ALTER TABLE w_PORDER_new DROP COLUMN POPDAT_0_new
;
INSERT INTO w_PORDER SELECT * FROM w_PORDER_new
;
DELETE FROM w_PORDER
USING w_PORDERP_eclat
WHERE w_PORDERP_eclat.POHNUM_0_orig = w_PORDER.POHNUM_0
;
-- Date livraison souhaitée mal saisie
UPDATE w_PORDER
SET X_LIVSOUH_0 = X_LIVSOUH_0 - (date_part('year',X_LIVSOUH_0)::text || ' year')::interval + (date_part('year',ORDDAT_0)::text || ' year')::interval
WHERE date(X_LIVSOUH_0) - date(ORDDAT_0) > 300
;
UPDATE w_PORDER
SET X_DATDISP_0 = X_DATDISP_0 - (date_part('year',X_DATDISP_0)::text || ' year')::interval + (date_part('year',ORDDAT_0)::text || ' year')::interval
WHERE date(X_DATDISP_0) - date(ORDDAT_0) > 300
;
-- Livraisons
DROP TABLE IF EXISTS w_PORDERQ_LIN;
CREATE TEMP TABLE w_PORDERQ_LIN AS
SELECT POHNUM_0, POPLIN_0,
SUM(QTYUOM_0) AS QTYUOM_0,
SUM(QTYPUU_0) AS QTYPUU_0,
SUM(LINAMT_0) AS LINAMT_0,
SUM(LINATIAMT_0) AS LINATIAMT_0,
SUM(RCPQTYPUU_0) AS RCPQTYPUU_0,
MAX(LINCLEFLG_0) AS LINCLEFLG_0,
MAX(RCPCLEFLG_0) AS RCPCLEFLG_0,
MAX(ORDDAT_0) AS ORDDAT_0
FROM prod_sagex3.PORDERQ
GROUP BY 1,2
;
ANALYSE w_PORDER
;
ANALYSE w_PORDERQ_LIN
;
SELECT base.cti_disable_index('eco', 'i_commandes_1');
SELECT base.cti_disable_index('eco', 'i_commandes_2');
SELECT base.cti_disable_index('eco', 'i_commandes_3');
SELECT base.cti_disable_index('eco', 'i_commandes_4');
SELECT base.cti_disable_index('eco', 'i_commandes_5');
SELECT base.cti_disable_index('eco', 'i_commandes_6');
SELECT base.cti_disable_index('eco', 'i_commandes_7');
SELECT base.cti_disable_index('eco', 'i_commandes_8');
TRUNCATE eco.p_commandes;
INSERT INTO eco.p_commandes(
code_original,
numero,
date_commande,
date_engagement,
objet,
reference,
date_livraison_prevue,
etat_reception,
date_reception,
etat_liquidation,
fournisseur_id,
gestionnaire_id,
lieu_commande_id,
lieu_facturation_id,
lieu_livraison_id,
unite_fonctionnelle_id,
site_id,
montant_commande_ht,
montant_commande_remise,
montant_commande_tva,
montant_commande_port,
montant_commande_total,
montant_liquidation_ht,
montant_liquidation_remise,
montant_liquidation_tva,
montant_liquidation_port,
montant_liquidation_total)
SELECT
POHNUM_0 AS code_original,
POHNUM_0 AS numero,
ORDDAT_0 AS date_commande,
date(greatest(ORDDAT_0, X_LIVSOUH_0, X_DATDISP_0)) AS date_engagement,
''::text AS objet,
''::text AS reference,
EXTRCPDAT1_0 AS date_livraison_prevue,
CASE
WHEN RCPFLG_0 = 5 THEN 'T'
WHEN RCPFLG_0 = 3 THEN 'T'
WHEN RCPFLG_0 = 1 THEN 'N'
WHEN RCPFLG_0 = 2 THEN 'P'
ELSE 'P' END AS etat_reception,
'20991231'::date AS date_reception,
CASE
WHEN CLEFLG_0 = 2 THEN 'T'
WHEN CLEFLG_0 = 1 THEN 'N'
ELSE 'N' END AS etat_liquidation,
COALESCE(t_fournisseurs.oid, 0) AS fournisseur_id,
COALESCE(t_gestionnaires.oid,0) AS gestionnaire_id,
0::bigint AS lieu_commande_id,
COALESCE(t_lieux_facturation.oid,0) AS lieu_facturation_id,
COALESCE(t_lieux_facturation.oid,0) AS lieu_livraison_id,
0::bigint AS unite_fonctionnelle_id,
COALESCE(t_sites.oid,0) AS site_id,
TOTORD_0 AS montant_commande_ht,
0::numeric AS montant_commande_remise,
TTVORD_0 - TOTORD_0 AS montant_commande_tva,
0::numeric AS montant_commande_port,
TTVORD_0 AS montant_commande_total,
0::numeric AS montant_liquidation_ht,
0::numeric AS montant_liquidation_remise,
0::numeric AS montant_liquidation_tva,
0::numeric AS montant_liquidation_port,
0::numeric AS montant_liquidation_total
FROM w_PORDER PORDER
LEFT JOIN eco.t_fournisseurs ON t_fournisseurs.code_original = BPSNUM_0
LEFT JOIN eco.t_lieux t_lieux_commande ON t_lieux_commande.code_original = POHFCY_0
LEFT JOIN eco.t_lieux t_lieux_livraison ON t_lieux_livraison.code_original = RCPFCY_0
LEFT JOIN eco.t_lieux t_lieux_facturation ON t_lieux_facturation.code_original = INVFCY_0
LEFT JOIN eco.t_gestionnaires ON t_gestionnaires.code = BUY_0
LEFT JOIN eco.t_sites ON t_sites.code_original = POHFCY_0
WHERE ORDDAT_0 >= '[ENV_ECO_ANNEEDEBUT]-01-01'
ORDER BY 1;
SELECT base.cti_enable_index('eco', 'i_commandes_1');
SELECT base.cti_enable_index('eco', 'i_commandes_2');
SELECT base.cti_enable_index('eco', 'i_commandes_3');
SELECT base.cti_enable_index('eco', 'i_commandes_4');
SELECT base.cti_enable_index('eco', 'i_commandes_5');
SELECT base.cti_enable_index('eco', 'i_commandes_6');
SELECT base.cti_enable_index('eco', 'i_commandes_7');
SELECT base.cti_enable_index('eco', 'i_commandes_8');
SELECT base.cti_disable_index('eco', 'i_ligne_commandes_1');
SELECT base.cti_disable_index('eco', 'i_ligne_commandes_2');
SELECT base.cti_disable_index('eco', 'i_ligne_commandes_3');
TRUNCATE eco.p_lignes_commandes;
INSERT INTO eco.p_lignes_commandes(
code_original,
commande_id,
ligne_commande,
texte,
article_id,
unite_approvisionnement_id,
compte_id,
ucd_id,
lpp_id,
quantite_approvisionnement,
prix_unitaire_approvisionnement,
multiplicateur_stockage,
quantite_stockage,
prix_unitaire_stockage,
montant_commande_ht,
--montant_commande_remise,
montant_commande_tva,
montant_commande_port,
montant_commande_ttc,
quantite_livraison_approvisionnement,
quantite_livraison_stockage,
montant_livraison_ht,
montant_livraison_ttc,
etat_livraison,
montant_liquidation_ht,
montant_liquidation_remise,
montant_liquidation_tva,
montant_liquidation_port,
montant_liquidation_ttc,
etat_liquidation,
taux_tva,
taux_prorata_tva)
SELECT
p_commandes.code_original || '-' || PORDERP.POPLIN_0 AS code_original,
p_commandes.oid AS commande_id,
PORDERP.POPLIN_0 AS ligne_commande,
ITMDES_0 AS texte,
COALESCE(t_articles.oid, 0) AS article_id,
0::bigint AS unite_approvisionnement_id,
compte_id, --possibilite de remonter le compte present dans le reglement par jointure avec GACCENTRYD ou A
COALESCE(t_ucd.oid, t_articles.ucd_id, 0) AS ucd_id,
COALESCE(t_lpp.oid, t_articles.lpp_id, 0) AS lpp_id,
QTYUOM_0 AS quantite_approvisionnement,
NETPRI_0 AS prix_unitaire_approvisionnement,
0::numeric AS multiplicateur_stockage,
0::numeric AS quantite_stockage,
0::numeric AS prix_unitaire_stockage,
LINAMT_0 AS montant_commande_ht,
LINATIAMT_0 - LINAMT_0 AS montant_commande_tva,
0::numeric AS montant_commande_port,
LINATIAMT_0 AS montant_commande_ttc,
RCPQTYPUU_0 AS quantite_livraison_approvisionnement,
RCPQTYPUU_0 AS quantite_livraison_stockage,
RCPQTYPUU_0*NETPRI_0 AS montant_livraison_ht,
RCPQTYPUU_0*NETPRI_0*base.cti_division(LINATIAMT_0::numeric,LINAMT_0::numeric) AS montant_livraison_ttc,
CASE WHEN QTYPUU_0 = RCPQTYPUU_0 THEN 'T'
WHEN RCPQTYPUU_0 > QTYPUU_0 THEN 'P'
WHEN RCPQTYPUU_0 != 0 THEN 'P'
ELSE 'N' END AS etat_livraison,
AMTNOTLIN_0 AS montant_liquidation_ht,
PINVOICED.DISCRGAMT1_0::numeric AS montant_liquidation_remise,
AMTTAXLIN_0 AS montant_liquidation_tva,
0::numeric AS montant_liquidation_port,
AMTATILIN_0 AS montant_liquidation_ttc,
CASE WHEN LINCLEFLG_0 = 2 THEN 'T' ELSE 'N' END,
CASE WHEN VATRAT_0 = 20.6 AND ORDDAT_0 < '[ENV_ECO_ANNEEDEBUT]0101' THEN 19.6 WHEN VATRAT_0 = 20.6 THEN 20 ELSE VATRAT_0 END AS taux_tva,
0 -- todo
FROM w_PORDERP PORDERP
LEFT JOIN w_PORDERQ_LIN PORDERQ ON PORDERQ.POHNUM_0 = PORDERP.POHNUM_0 AND PORDERQ.POPLIN_0 = PORDERP.POPLIN_0
LEFT JOIN (
SELECT
POHNUM_0,
POPLIN_0,
SUM(QTYGLU_0) as QTYGLU_0,
SUM(AMTNOTLIN_0) AS AMTNOTLIN_0,
SUM(AMTATILIN_0) AS AMTATILIN_0,
SUM(AMTTAXLIN1_0) AS AMTTAXLIN_0,
SUM(DISCRGAMT1_0) AS DISCRGAMT1_0
FROM prod_sagex3.PINVOICED
GROUP BY 1,2) PINVOICED
ON PINVOICED.POHNUM_0 = PORDERP.POHNUM_0 AND PINVOICED.POPLIN_0 = PORDERP.POPLIN_0
JOIN eco.p_commandes ON PORDERQ.POHNUM_0 = p_commandes.code_original
LEFT JOIN eco.t_articles ON PORDERP.ITMREF_0 = t_articles.code_original AND t_articles.oid != 0
LEFT JOIN base.t_ucd ON ucd_id = t_ucd.oid AND t_ucd.oid != 0
LEFT JOIN base.t_lpp ON lpp_id = t_lpp.oid AND t_lpp.oid != 0
LEFT JOIN eco.t_prorata_tva ON p_commandes.date_engagement BETWEEN t_prorata_tva.date_debut AND t_prorata_tva.date_fin
;
-- Recalcul si remise
UPDATE eco.p_lignes_commandes SET
montant_commande_ht = montant_commande_ht + montant_commande_remise,
montant_commande_tva = round((montant_commande_ht + montant_commande_remise) * montant_commande_tva / montant_commande_ht,2),
montant_commande_ttc = round((montant_commande_ht + montant_commande_remise) * montant_commande_ttc / montant_commande_ht,2)
WHERE montant_commande_remise <> 0 AND montant_commande_ht <> 0
;
UPDATE eco.p_lignes_commandes SET
montant_livraison_ht = montant_livraison_ht + montant_commande_remise,
montant_livraison_tva = round((montant_livraison_ht + montant_commande_remise) * montant_livraison_tva / montant_livraison_ht,2),
montant_livraison_ttc = round((montant_livraison_ht + montant_commande_remise) * montant_livraison_ttc / montant_livraison_ht,2)
WHERE montant_commande_remise <> 0 AND etat_livraison = 'T' AND montant_livraison_ht <> 0
;
UPDATE eco.p_lignes_commandes SET
montant_liquidation_ht = montant_liquidation_ht + montant_liquidation_remise,
montant_liquidation_tva = round((montant_liquidation_ht + montant_liquidation_remise) * montant_liquidation_tva / montant_liquidation_ht,2),
montant_liquidation_ttc = round((montant_liquidation_ht + montant_liquidation_remise) * montant_liquidation_ttc / montant_liquidation_ht,2)
WHERE montant_liquidation_remise <> 0 AND montant_liquidation_ht <> 0
;
SELECT base.cti_enable_index('eco', 'i_ligne_commandes_1');
SELECT base.cti_enable_index('eco', 'i_ligne_commandes_2');
SELECT base.cti_enable_index('eco', 'i_ligne_commandes_3');
DROP TABLE IF EXISTS w_PORDERQ_CMD;
CREATE TEMP TABLE w_PORDERQ_CMD AS
SELECT POHNUM_0,
MAX(LASRCPDAT_0) AS LASRCPDAT_0
FROM prod_sagex3.PORDERQ
GROUP BY 1
;
UPDATE eco.p_commandes
SET date_reception = LASRCPDAT_0
FROM w_PORDERQ_CMD
WHERE code_original = POHNUM_0 AND
date(LASRCPDAT_0) >= '19700101'
;
]]>
</sqlcmd>
</NODE>
<NODE label="UF Commandes par table PRECEIPTD">
<condition><![CDATA[
SELECT count(*) > 0
FROM information_schema.tables
WHERE 1=1
AND table_schema = 'prod_sagex3'
AND table_name = 'preceiptd'
;
]]></condition>
<sqlcmd><![CDATA[
-- services
UPDATE eco.p_commandes
SET
unite_fonctionnelle_id = t_unites_fonctionnelles.oid
FROM
prod_sagex3.PRECEIPTD
JOIN eco.t_unites_fonctionnelles ON X_SERVICE_0 = t_unites_fonctionnelles.code_original
WHERE
PRECEIPTD.POHNUM_0 = p_commandes.code_original
;
UPDATE eco.p_lignes_commandes
SET
unite_fonctionnelle_id = p_commandes.unite_fonctionnelle_id
FROM
eco.p_commandes
WHERE
p_commandes.oid = commande_id
;
]]></sqlcmd>
</NODE>
<NODE label="Mouvements">
<sqlcmd><![CDATA[
-- Table articles avec autres caractéristiques
INSERT INTO eco.t_divers (code, texte, valeur, description)
SELECT
'X3_MVTREG',
'Importer les mouvements de régulation',
'1',
'0=Non 1=Oui'
WHERE 'X3_MVTREG' NOT IN (SELECT code FROM eco.t_divers)
;
DROP TABLE IF EXISTS w_STOJOU;
CREATE TEMP TABLE w_STOJOU AS
SELECT
LOC_0 AS LOC_0_add,
BPSFLG_0,
STOJOU.*
FROM
prod_sagex3.STOJOU
LEFT JOIN prod_sagex3.BPARTNER ON BPARTNER.BPRNUM_0 = STOJOU.BPRNUM_0
WHERE 1=1 AND
CASE WHEN (SELECT valeur FROM eco.t_divers WHERE code = 'SAGEX3_REG_MVT' AND valeur = '1') > 0 THEN VCRNUMREG_0 ELSE '' END = ''
ORDER BY IPTDAT_0
;
-- prise en compte des inventaires
UPDATE w_STOJOU SET LOC_0_add = sub.LOC_0 FROM (select CUNSSSNUM_0,ITMREF_0,LOC_0 as LOC_0 from prod_sagex3.CUNLISDET) sub WHERE sub.ITMREF_0 = w_STOJOU.ITMREF_0 AND CUNSSSNUM_0 = VCRNUMORI_0;
--prise en compte des lieux de stocks possibles (update si 1 seul) -> todo a faire avec stoloc, plus simple
UPDATE w_STOJOU SET LOC_0_add = sub.LOC_0 FROM (select ITMREF_0,STOFCY_0,MIN(LOC_0) AS LOC_0 from prod_sagex3.stojou where loc_0 != '' group by 1,2 having count(distinct loc_0) = 1) sub WHERE sub.ITMREF_0 = w_STOJOU.ITMREF_0 AND sub.STOFCY_0 = w_STOJOU.STOFCY_0;
-- constitution du code avec arborescence
--UPDATE w_STOJOU SET LOC_0_add = STOFCY_0 || '-' || LOC_0_add WHERE LOC_0_add != '';
UPDATE w_STOJOU SET LOC_0_add = STOFCY_0 WHERE LOC_0_add = '';
DROP TABLE IF EXISTS w_mvt;
CREATE TEMP TABLE w_mvt AS
SELECT
'STOJOU'::text||md5(w_STOJOU.STOFCY_0||'-'||w_STOJOU.VCRNUM_0||'-'||w_STOJOU.VCRLIN_0::text||'-'||w_STOJOU.ITMREF_0||'-'||w_STOJOU.MVTSEQ_0::text||'-'||w_STOJOU.MVTIND_0::text||'-'||w_STOJOU.CSTCOU_0::text||'-'||to_char(w_STOJOU.IPTDAT_0,'YYYYMMDD')||'-'||to_char(w_STOJOU.CREDAT_0,'YYYYMMDD')||'-'||w_STOJOU.CRETIM_0) AS mvt_code_original,
null as oid,
CRETIM_0 AS time,
w_STOJOU.IPTDAT_0 AS date, --autre possible IPTDAT_0 mais imputation
CASE WHEN w_STOJOU.QTYSTU_0 >= 0 THEN 'E' ELSE 'S' END AS sens_mouvement,
COALESCE(t_types_mouvements.oid,0) AS type_mouvement_id,
t_types_mouvements.texte || ' (' || VCRNUM_0 || '-' || VCRLIN_0 || ')' AS texte,
COALESCE(t_gestionnaires.oid,0) AS gestionnaire_id,
COALESCE(t_lieux.oid,0) AS lieu_id,
COALESCE(t_unites_fonctionnelles.oid,0) AS unite_fonctionnelle_id,
COALESCE(t_articles.oid,0) AS article_id,
COALESCE(t_articles.compte_id,0) AS compte_id,
COALESCE(t_fournisseurs.oid,t_articles.fournisseur_principal_id,0) AS fournisseur_id,
COALESCE(p_commandes.oid,0) AS commande_id,
VCRLINORI_0 AS ligne_commande,
COALESCE(t_sites.oid,0) AS site_id,
COALESCE(t_articles.lpp_id,0) AS lpp_id,
COALESCE(t_articles.ucd_id,0) AS ucd_id,
w_STOJOU.PRIORD_0 AS prix_unitaire,
CASE WHEN w_STOJOU.QTYSTU_0 >= 0 THEN w_STOJOU.QTYSTU_0 ELSE 0 END AS entree_quantite,
CASE WHEN w_STOJOU.QTYSTU_0 < 0 THEN 0-w_STOJOU.QTYSTU_0 ELSE 0 END AS sortie_quantite,
CASE WHEN w_STOJOU.QTYSTU_0 >= 0 THEN CASE WHEN AMTVAL_0 != 0 THEN AMTVAL_0 ELSE w_STOJOU.QTYSTU_0*w_STOJOU.PRIORD_0 END ELSE 0 END AS entree_montant,
CASE WHEN w_STOJOU.QTYSTU_0 < 0 THEN CASE WHEN AMTVAL_0 != 0 THEN AMTVAL_0 ELSE -w_STOJOU.QTYSTU_0*w_STOJOU.PRIORD_0 END ELSE 0 END AS sortie_montant,
0::numeric AS entree_montant_ht,
0::numeric AS sortie_montant_ht,
CUNLISDET.QTYSTU_0 - w_STOJOU.QTYPCU_0 AS stock_quantite_debut,
CUNLISDET.QTYSTU_0 AS stock_quantite_fin,
CASE
WHEN split_part(w_STOJOU.PJT_0,' ',2) LIKE '%/%' AND split_part(w_STOJOU.PJT_0,' ',3) <> '' AND split_part(w_STOJOU.PJT_0,' ',4) = '' THEN split_part(w_STOJOU.PJT_0,' ',1)
WHEN split_part(w_STOJOU.PJT_0,' ',4) LIKE '%/%' AND split_part(w_STOJOU.PJT_0,' ',3) <> '' AND split_part(w_STOJOU.PJT_0,' ',5) = '' THEN split_part(w_STOJOU.PJT_0,' ',2)
WHEN split_part(w_STOJOU.PJT_0,' ',5) LIKE '%/%' AND split_part(w_STOJOU.PJT_0,' ',3) <> '' AND split_part(w_STOJOU.PJT_0,' ',6) = '' THEN split_part(w_STOJOU.PJT_0,' ',2)
ELSE '' END AS no_sejour,
''::text AS no_patient
FROM w_STOJOU
LEFT JOIN eco.t_types_mouvements ON TRSTYP_0 = t_types_mouvements.code_original
LEFT JOIN eco.t_gestionnaires ON CREUSR_0 = t_gestionnaires.code_original
LEFT JOIN eco.t_lieux ON LOC_0_add = t_lieux.code_original
LEFT JOIN eco.t_unites_fonctionnelles ON BPRNUM_0 = t_unites_fonctionnelles.code_original AND BPSFLG_0 = 1
LEFT JOIN eco.t_articles ON ITMREF_0 = t_articles.code_original AND t_articles.oid != 0
LEFT JOIN prod_sagex3.XMVTSART ON X_ITMREF_0 = ITMREF_0 AND X_STOFCY_0 = STOFCY_0 AND date_part('year',IPTDAT_0) = X_YEA_0 AND date_part('month',IPTDAT_0) = X_MON_0
LEFT JOIN eco.t_compte ON X_CPTACHAT_0 = t_compte.code_original
LEFT JOIN eco.t_sites ON STOFCY_0 = t_sites.code_original
LEFT JOIN eco.t_fournisseurs ON (BPRNUM_0 = t_fournisseurs.code_original AND BPSFLG_0 = 2)
LEFT JOIN eco.p_commandes ON VCRNUMORI_0 = p_commandes.code_original
LEFT JOIN prod_sagex3.CUNLISDET ON CUNLISNUM_0 = VCRNUM_0 AND ITMLISNUM_0 = VCRLIN_0
WHERE w_STOJOU.IPTDAT_0 >= date('[ENV_ECO_ANNEEDEBUT]-01-01')
AND w_STOJOU.QTYSTU_0 != 0
ORDER BY w_STOJOU.IPTDAT_0;
UPDATE w_mvt SET
entree_montant_ht = entree_montant * montant_livraison_ht / montant_livraison_ttc
FROM eco.p_lignes_commandes
WHERE 1=1 AND
p_lignes_commandes.commande_id = w_mvt.commande_id AND
p_lignes_commandes.ligne_commande = w_mvt.ligne_commande AND
entree_quantite > 0 AND
montant_livraison_ttc > 0
;
DROP TABLE IF EXISTS w_TAX;
CREATE TEMP TABLE w_TAX AS
SELECT
VACITM_0 AS tax_code,
100 + VATRAT_0 as tax_rate_inv
FROM prod_sagex3.TABVAC
JOIN prod_sagex3.TABVAT ON TABVAC.VACITM_0 = TABVAC.VACITM_0 AND TABVAC.VAT_0 = TABVAT.VAT_0 AND VACBPR_0 = 'FRA'
;
-- mise à jour montants ht sorties si facture commande
UPDATE w_mvt SET
sortie_montant = sortie_quantite * prix_unitaire
WHERE sortie_quantite != 0 AND prix_unitaire != 0 AND sortie_montant_ht = 0;
;
-- mise à jour montants ht entrées si pas de commande (à partir des articles)
UPDATE w_mvt SET
entree_montant_ht = entree_montant * 100 / tax_rate_inv
FROM eco.t_articles
JOIN prod_sagex3.ITMMASTER ON ITMREF_0 = code
JOIN w_TAX ON tax_code = VACITM_0
WHERE article_id = t_articles.oid AND
entree_quantite != 0 AND
entree_montant_ht = 0
;
-- mise à jour montants ht sortie (à partir des articles)
UPDATE w_mvt SET
sortie_montant_ht = sortie_montant * 100 / tax_rate_inv
FROM eco.t_articles
JOIN prod_sagex3.ITMMASTER ON ITMREF_0 = code
JOIN w_TAX ON tax_code = VACITM_0
WHERE article_id = t_articles.oid AND
sortie_quantite != 0
;
UPDATE w_mvt SET
entree_quantite = 0 - entree_quantite,
sortie_quantite = 0 - sortie_quantite,
entree_montant = 0 - entree_montant,
sortie_montant = 0 - sortie_montant,
entree_montant_ht = 0 - entree_montant_ht,
sortie_montant_ht = 0 - sortie_montant_ht
FROM eco.t_types_mouvements
WHERE type_mouvement_id = t_types_mouvements.oid AND
t_types_mouvements.particularite_inverser_signe = '1';
]]></sqlcmd>
</NODE>
<NODE label="Livraisons par table PRECEIPTD">
<condition><![CDATA[
SELECT count(*) > 0
FROM information_schema.tables
WHERE 1=1
AND table_schema = 'prod_sagex3'
AND table_name = 'preceiptd'
;
]]> </condition>
<sqlcmd><![CDATA[
-- Ajout des lignes fictives produits non stockés
DROP TABLE IF EXISTS w_articles_mvt;
CREATE TABLE w_articles_mvt AS
SELECT article_id
FROM w_mvt
GROUP BY 1
;
INSERT INTO w_mvt(
mvt_code_original,
oid,
time,
date,
sens_mouvement,
type_mouvement_id,
texte,
gestionnaire_id,
lieu_id,
unite_fonctionnelle_id,
article_id,
compte_id,
fournisseur_id,
commande_id,
ligne_commande,
site_id,
lpp_id,
ucd_id,
prix_unitaire,
entree_quantite,
entree_montant,
entree_montant_ht,
sortie_quantite,
sortie_montant,
sortie_montant_ht,
stock_quantite_debut,
stock_quantite_fin,
no_sejour,
no_patient)
SELECT
'PRECEIPTD'::text||PRECEIPTD.PTHNUM_0||'-'||PRECEIPTD.PTDLIN_0::text AS mvt_code_original,
null as oid,
CRETIM_0 AS time,
PRECEIPTD.RCPDAT_0 AS date,
'E'::text AS sens_mouvement,
COALESCE(t_types_mouvements.oid,0) AS type_mouvement_id,
CASE WHEN ITMDES_0 <> '' OR LINTEX_0 <> '' THEN trim(ITMDES_0 || ' ' || LINTEX_0) ELSE t_types_mouvements.texte END || ' (' || PRECEIPTD.PTHNUM_0 || ')' AS texte,
COALESCE(t_gestionnaires.oid,0) AS gestionnaire_id,
0::bigint AS lieu_id,
COALESCE(t_unites_fonctionnelles.oid,0) AS unite_fonctionnelle_id,
COALESCE(t_articles.oid,0) AS article_id,
COALESCE(t_articles.compte_id,0) AS compte_id,
COALESCE(t_fournisseurs.oid,0) AS fournisseur_id,
COALESCE(p_commandes.oid,0) AS commande_id,
PRECEIPTD.POPLIN_0 AS ligne_commande,
t_sites.oid AS site_id,
COALESCE(t_articles.lpp_id,0) AS lppid,
COALESCE(t_articles.ucd_id,0) AS ucd_id,
NETPRI_0 AS prix_unitaire,
PRECEIPTD.QTYSTU_0 AS entree_quantite,
LINATIAMT_0 AS entree_montant,
LINAMT_0 AS entree_montaht_ht,
0 AS sortie_quantite,
0 AS sortie_montant,
0 AS sortie_montant_ht,
0 AS stock_quantite_debut,
0 AS stock_quantite_fin,
CASE
WHEN split_part(PRECEIPTD.PJT_0,' ',2) LIKE '%/%' AND split_part(PRECEIPTD.PJT_0,' ',3) <> '' AND split_part(PRECEIPTD.PJT_0,' ',4) = '' THEN split_part(PRECEIPTD.PJT_0,' ',1)
WHEN split_part(PRECEIPTD.PJT_0,' ',4) LIKE '%/%' AND split_part(PRECEIPTD.PJT_0,' ',3) <> '' AND split_part(PRECEIPTD.PJT_0,' ',5) = '' THEN split_part(PRECEIPTD.PJT_0,' ',2)
WHEN split_part(PRECEIPTD.PJT_0,' ',5) LIKE '%/%' AND split_part(PRECEIPTD.PJT_0,' ',3) <> '' AND split_part(PRECEIPTD.PJT_0,' ',6) = '' THEN split_part(PRECEIPTD.PJT_0,' ',2)
ELSE '' END AS no_sejour,
''::text AS no_patient
FROM prod_sagex3.PRECEIPTD
JOIN prod_sagex3.ITMMASTER ON PRECEIPTD.ITMREF_0 = ITMMASTER.ITMREF_0
LEFT JOIN eco.p_commandes ON PRECEIPTD.POHNUM_0 = p_commandes.code_original
LEFT JOIN eco.t_sites ON PRECEIPTD.POHFCY_0 = t_sites.code_original
LEFT JOIN eco.t_articles ON PRECEIPTD.ITMREF_0 = t_articles.code_original AND t_articles.oid != 0
LEFT JOIN eco.t_gestionnaires ON PRECEIPTD.CREUSR_0 = t_gestionnaires.code_original
LEFT JOIN eco.t_fournisseurs ON PRECEIPTD.BPSNUM_0 = t_fournisseurs.code_original
LEFT JOIN eco.t_types_mouvements ON '*NS' = t_types_mouvements.code_original
LEFT JOIN eco.t_unites_fonctionnelles ON X_SERVICE_0 = t_unites_fonctionnelles.code_original
LEFT JOIN prod_sagex3.STOJOU ON STOJOU.ITMREF_0 = PRECEIPTD.ITMREF_0 AND STOJOU.VCRNUM_0 = PRECEIPTD.PTHNUM_0
WHERE PRECEIPTD.RCPDAT_0 >= date('[ENV_ECO_ANNEEDEBUT]-01-01')
AND STOJOU.ITMREF_0 IS NULL AND
t_articles.oid <> ALL(SELECT article_id FROM w_articles_mvt)
;
INSERT INTO w_mvt(
mvt_code_original,
oid,
time,
date,
sens_mouvement,
type_mouvement_id,
texte,
gestionnaire_id,
lieu_id,
unite_fonctionnelle_id,
article_id,
compte_id,
fournisseur_id,
commande_id,
ligne_commande,
site_id,
lpp_id,
ucd_id,
prix_unitaire,
entree_quantite,
entree_montant,
entree_montant_ht,
sortie_quantite,
sortie_montant,
sortie_montant_ht,
stock_quantite_debut,
stock_quantite_fin,
no_sejour,
no_patient)
SELECT
'PRECEIPTD'::text||PRECEIPTD.PTHNUM_0||'-'||PRECEIPTD.PTDLIN_0::text AS mvt_code_original,
null as oid, CRETIM_0 AS time,
PRECEIPTD.RCPDAT_0 AS date,
'S'::text AS sens_mouvement,
COALESCE(t_types_mouvements.oid,0) AS type_mouvement_id,
CASE WHEN ITMDES_0 <> '' OR LINTEX_0 <> '' THEN trim(ITMDES_0 || ' ' || LINTEX_0) ELSE t_types_mouvements.texte END || ' (' || PRECEIPTD.PTHNUM_0 || ')' AS texte,
COALESCE(t_gestionnaires.oid,0) AS gestionnaire_id,
0::bigint AS lieu_id,
COALESCE(t_unites_fonctionnelles.oid,0) AS unite_fonctionnelle_id,
COALESCE(t_articles.oid,0) AS article_id,
COALESCE(t_articles.compte_id,0) AS compte_id,
COALESCE(t_fournisseurs.oid,0) AS fournisseur_id,
COALESCE(p_commandes.oid,0) AS commande_id,
PRECEIPTD.POPLIN_0 AS ligne_commande,
t_sites.oid AS site_id,
COALESCE(t_articles.lpp_id,0) AS lppid,
COALESCE(t_articles.ucd_id,0) AS ucd_id,
NETPRI_0 AS prix_unitaire,
0 AS entree_quantite,
0 AS entree_montant,
0 AS entree_montaht_ht,
PRECEIPTD.QTYSTU_0 AS sortie_quantite,
LINATIAMT_0 AS sortie_montant,
LINAMT_0 AS sortie_montant_ht,
0 AS stock_quantite_debut,
0 AS stock_quantite_fin,
CASE
WHEN split_part(PRECEIPTD.PJT_0,' ',2) LIKE '%/%' AND split_part(PRECEIPTD.PJT_0,' ',3) <> '' AND split_part(PRECEIPTD.PJT_0,' ',4) = '' THEN split_part(PRECEIPTD.PJT_0,' ',1)
WHEN split_part(PRECEIPTD.PJT_0,' ',4) LIKE '%/%' AND split_part(PRECEIPTD.PJT_0,' ',3) <> '' AND split_part(PRECEIPTD.PJT_0,' ',5) = '' THEN split_part(PRECEIPTD.PJT_0,' ',2)
WHEN split_part(PRECEIPTD.PJT_0,' ',5) LIKE '%/%' AND split_part(PRECEIPTD.PJT_0,' ',3) <> '' AND split_part(PRECEIPTD.PJT_0,' ',6) = '' THEN split_part(PRECEIPTD.PJT_0,' ',2)
ELSE '' END AS no_sejour,
''::text AS no_patient
FROM prod_sagex3.PRECEIPTD
JOIN prod_sagex3.ITMMASTER ON PRECEIPTD.ITMREF_0 = ITMMASTER.ITMREF_0
LEFT JOIN eco.p_commandes ON PRECEIPTD.POHNUM_0 = p_commandes.code_original
LEFT JOIN eco.t_sites ON PRECEIPTD.POHFCY_0 = t_sites.code_original
LEFT JOIN eco.t_articles ON PRECEIPTD.ITMREF_0 = t_articles.code_original AND t_articles.oid != 0
LEFT JOIN eco.t_gestionnaires ON PRECEIPTD.CREUSR_0 = t_gestionnaires.code_original
LEFT JOIN eco.t_fournisseurs ON PRECEIPTD.BPSNUM_0 = t_fournisseurs.code_original
LEFT JOIN eco.t_types_mouvements ON '*NS' = t_types_mouvements.code_original
LEFT JOIN eco.t_unites_fonctionnelles ON X_SERVICE_0 = t_unites_fonctionnelles.code_original
LEFT JOIN prod_sagex3.STOJOU ON STOJOU.ITMREF_0 = PRECEIPTD.ITMREF_0 AND STOJOU.VCRNUM_0 = PRECEIPTD.PTHNUM_0
WHERE PRECEIPTD.RCPDAT_0 >= date('[ENV_ECO_ANNEEDEBUT]-01-01')
AND STOJOU.ITMREF_0 IS NULL AND
t_articles.oid <> ALL(SELECT article_id FROM w_articles_mvt)
;
UPDATE eco.p_commandes
SET date_reception = date
FROM (
SELECT
commande_id,
MAX(date) as date
FROM
w_mvt
GROUP BY 1
) sub
WHERE oid = commande_id
;
UPDATE w_mvt
SET sortie_montant_ht = sortie_montant / ((100 + VATRAT_0)/100)
FROM (
SELECT '(' || PTHNUM_0 || '-' || PTDLIN_0 || ')' AS ref, VATRAT_0
FROM prod_sagex3.PRECEIPTD
JOIN prod_sagex3.TABVAT ON TABVAT.VAT_0 = PRECEIPTD.VAT_0
) sub
WHERE substring(texte from '\([^\)]*\)$') = ref
;
]]></sqlcmd>
</NODE>
<NODE label="Livraison par rapport à PORDERQ">
<condition><![CDATA[
SELECT count(*) = 0
FROM information_schema.tables
WHERE 1=1
AND table_schema = 'prod_sagex3'
AND table_name = 'preceiptd'
;
]]> </condition>
<sqlcmd><![CDATA[
-- Ajout des lignes fictives produits non stockés
INSERT INTO w_mvt (
mvt_code_original,
oid,
time,
date,
sens_mouvement,
type_mouvement_id,
texte,
gestionnaire_id,
lieu_id,
unite_fonctionnelle_id,
article_id,
compte_id,
fournisseur_id,
commande_id,
ligne_commande,
site_id,
lpp_id,
ucd_id,
prix_unitaire,
entree_quantite,
entree_montant,
entree_montant_ht,
sortie_quantite,
sortie_montant,
sortie_montant_ht,
stock_quantite_debut,
stock_quantite_fin,
no_sejour,
no_patient)
SELECT
'PORDERP'::text||PORDERP.POHNUM_0||'-'||PORDERP.POPLIN_0::text AS mvt_code_original,
null as oid,
1200 AS time,
PORDERQ.LASRCPDAT_0 AS date,
'E'::text AS sens_mouvement,
COALESCE(t_types_mouvements.oid,0) AS type_mouvement_id,
CASE WHEN ITMDES_0 <> '' OR LINTEX_0 <> '' THEN trim(ITMDES_0 || ' ' || LINTEX_0) ELSE t_types_mouvements.texte || ' ' || t_articles.code END AS texte,
p_commandes.gestionnaire_id,
0::bigint AS lieu_id,
COALESCE(t_unites_fonctionnelles.oid,0) AS unite_fonctionnelle_id,
COALESCE(t_articles.oid,0) AS article_id,
COALESCE(t_articles.compte_id,0) AS compte_id,
p_commandes.fournisseur_id,
p_commandes.oid AS commande_id,
PORDERQ.POPLIN_0 AS ligne_commande,
p_commandes.site_id,
COALESCE(t_articles.lpp_id,0) AS lppid,
COALESCE(t_articles.ucd_id,0) AS ucd_id,
NETPRI_0 AS prix_unitaire,
RCPQTYPUU_0 AS entree_quantite,
RCPQTYPUU_0*NETPRI_0*(base.cti_division(LINATIAMT_0::numeric, LINAMT_0::numeric)) AS entree_montant,
RCPQTYPUU_0*NETPRI_0 AS entree_montaht_ht,
0 AS sortie_quantite,
0 AS sortie_montant,
0 AS sortie_montant_ht,
0 AS stock_quantite_debut,
0 AS stock_quantite_fin,
CASE
WHEN split_part(PORDERP.PJT_0,' ',2) LIKE '%/%' AND split_part(PORDERP.PJT_0,' ',3) <> '' AND split_part(PORDERP.PJT_0,' ',4) = '' THEN split_part(PORDERP.PJT_0,' ',1)
WHEN split_part(PORDERP.PJT_0,' ',4) LIKE '%/%' AND split_part(PORDERP.PJT_0,' ',3) <> '' AND split_part(PORDERP.PJT_0,' ',5) = '' THEN split_part(PORDERP.PJT_0,' ',2)
WHEN split_part(PORDERP.PJT_0,' ',5) LIKE '%/%' AND split_part(PORDERP.PJT_0,' ',3) <> '' AND split_part(PORDERP.PJT_0,' ',6) = '' THEN split_part(PORDERP.PJT_0,' ',2)
ELSE '' END AS no_sejour,
''::text AS no_patient
FROM prod_sagex3.PORDERP
JOIN prod_sagex3.PORDERQ ON PORDERQ.POHNUM_0 = PORDERP.POHNUM_0 AND PORDERQ.POPLIN_0 = PORDERP.POPLIN_0
JOIN prod_sagex3.PORDER ON PORDER.POHNUM_0 = PORDERP.POHNUM_0
JOIN prod_sagex3.ITMMASTER ON PORDERP.ITMREF_0 = ITMMASTER.ITMREF_0
JOIN eco.p_commandes ON PORDERQ.POHNUM_0 = p_commandes.code_original
LEFT JOIN eco.t_articles ON PORDERQ.ITMREF_0 = t_articles.code_original AND t_articles.oid != 0
LEFT JOIN eco.t_types_mouvements ON '*NS' = t_types_mouvements.code_original
LEFT JOIN eco.t_unites_fonctionnelles ON PORDERP.X_SERVICE_0 = t_unites_fonctionnelles.code_original AND PORDERP.X_SERVICE_0 ~ '^[A-Z].*$'
WHERE PORDERQ.LASRCPDAT_0 >= date('[ENV_ECO_ANNEEDEBUT]-01-01')
AND RCPQTYPUU_0 <> 0
ORDER BY PORDERQ.LASRCPDAT_0;
INSERT INTO w_mvt(
mvt_code_original,
oid,
time,
date,
sens_mouvement,
type_mouvement_id,
texte,
gestionnaire_id,
lieu_id,
unite_fonctionnelle_id,
article_id,
compte_id,
fournisseur_id,
commande_id,
ligne_commande,
site_id,
lpp_id,
ucd_id,
prix_unitaire,
entree_quantite,
entree_montant,
entree_montant_ht,
sortie_quantite,
sortie_montant,
sortie_montant_ht,
stock_quantite_debut,
stock_quantite_fin,
no_sejour,
no_patient)
SELECT
'PORDERP'::text||PORDERP.POHNUM_0||'-'||PORDERP.POPLIN_0::text AS mvt_code_original,
null AS oid,
1200 AS time,
PORDERQ.LASRCPDAT_0 AS date,
'S'::text AS sens_mouvement,
COALESCE(t_types_mouvements.oid,0) AS type_mouvement_id,
CASE WHEN ITMDES_0 <> '' OR LINTEX_0 <> '' THEN trim(ITMDES_0 || ' ' || LINTEX_0) ELSE t_types_mouvements.texte || ' ' || t_articles.code END AS texte,
p_commandes.gestionnaire_id,
0::bigint AS lieu_id,
COALESCE(t_unites_fonctionnelles.oid,0) AS unite_fonctionnelle_id,
COALESCE(t_articles.oid,0) AS article_id,
COALESCE(t_articles.compte_id,0) AS compte_id,
p_commandes.fournisseur_id,
p_commandes.oid AS commande_id,
PORDERQ.POPLIN_0 AS ligne_commande,
p_commandes.site_id,
COALESCE(t_articles.lpp_id,0) AS lppid,
COALESCE(t_articles.ucd_id,0) AS ucd_id,
NETPRI_0 AS prix_unitaire,
0 AS entree_quantite,
0 AS entree_montant,
0 AS entree_montant_ht,
RCPQTYPUU_0 AS sortie_quantite,
RCPQTYPUU_0*NETPRI_0*(base.cti_division(LINATIAMT_0::numeric, LINAMT_0::numeric)) AS sortie_montant,
RCPQTYPUU_0*NETPRI_0 AS sortie_montant_ht,
0 AS stock_quantite_debut,
0 AS stock_quantite_fin,
CASE
WHEN split_part(PORDERP.PJT_0,' ',2) LIKE '%/%' AND split_part(PORDERP.PJT_0,' ',3) <> '' AND split_part(PORDERP.PJT_0,' ',4) = '' THEN split_part(PORDERP.PJT_0,' ',1)
WHEN split_part(PORDERP.PJT_0,' ',4) LIKE '%/%' AND split_part(PORDERP.PJT_0,' ',3) <> '' AND split_part(PORDERP.PJT_0,' ',5) = '' THEN split_part(PORDERP.PJT_0,' ',2)
WHEN split_part(PORDERP.PJT_0,' ',5) LIKE '%/%' AND split_part(PORDERP.PJT_0,' ',3) <> '' AND split_part(PORDERP.PJT_0,' ',6) = '' THEN split_part(PORDERP.PJT_0,' ',2)
ELSE '' END AS no_sejour,
''::text AS no_patient
FROM prod_sagex3.PORDERP
JOIN prod_sagex3.PORDERQ ON PORDERQ.POHNUM_0 = PORDERP.POHNUM_0 AND PORDERQ.POPLIN_0 = PORDERP.POPLIN_0
JOIN prod_sagex3.PORDER ON PORDER.POHNUM_0 = PORDERP.POHNUM_0
JOIN prod_sagex3.ITMMASTER ON PORDERP.ITMREF_0 = ITMMASTER.ITMREF_0
JOIN eco.p_commandes ON PORDERQ.POHNUM_0 = p_commandes.code_original
LEFT JOIN eco.t_articles ON PORDERQ.ITMREF_0 = t_articles.code_original AND t_articles.oid != 0
LEFT JOIN eco.t_types_mouvements ON '*NS' = t_types_mouvements.code_original
LEFT JOIN eco.t_unites_fonctionnelles ON PORDERP.X_SERVICE_0 = t_unites_fonctionnelles.code_original AND PORDERP.X_SERVICE_0 ~ '^[A-Z].*$'
WHERE PORDERQ.LASRCPDAT_0 >= date('[ENV_ECO_ANNEEDEBUT]-01-01')
AND RCPQTYPUU_0 <> 0
ORDER BY PORDERQ.LASRCPDAT_0;
]]></sqlcmd>
</NODE>
<NODE label="Insertion des mouvements">
<sqlcmd><![CDATA[
TRUNCATE eco.p_mouvements_articles;
SELECT base.cti_disable_index('eco', 'i_mouvements_articles_1');
SELECT base.cti_disable_index('eco', 'i_mouvements_articles_2');
SELECT base.cti_disable_index('eco', 'i_mouvements_articles_3');
SELECT base.cti_disable_index('eco', 'i_mouvements_articles_4');
SELECT base.cti_disable_index('eco', 'i_mouvements_articles_5');
SELECT base.cti_disable_index('eco', 'i_mouvements_articles_6');
SELECT base.cti_disable_index('eco', 'i_mouvements_articles_7');
SELECT base.cti_disable_index('eco', 'i_mouvements_articles_8');
SELECT base.cti_disable_index('eco', 'i_mouvements_articles_9');
SELECT base.cti_disable_index('eco', 'i_mouvements_articles_10');
DROP SEQUENCE IF EXISTS w_MVT_sequence;
CREATE TEMP SEQUENCE w_mvt_sequence;
INSERT INTO eco.p_mouvements_articles(
oid,
code_original,
date,
sens_mouvement,
type_mouvement_id,
texte,
gestionnaire_id,
lieu_id,
unite_fonctionnelle_id,
article_id,
compte_id,
fournisseur_id,
commande_id,
ligne_commande,
site_id,
lpp_id,
ucd_id,
prix_unitaire,
entree_quantite,
entree_montant,
entree_montant_ht,
sortie_quantite,
sortie_montant,
sortie_montant_ht,
stock_quantite_debut,
stock_quantite_fin,
no_sejour,
no_patient)
SELECT
nextval('w_MVT_sequence'::regclass) AS sequence,
mvt_code_original,
date,
sens_mouvement,
type_mouvement_id,
texte,
gestionnaire_id,
lieu_id,
unite_fonctionnelle_id,
article_id,
compte_id,
fournisseur_id,
commande_id,
ligne_commande,
site_id,
lpp_id,
ucd_id,
prix_unitaire,
entree_quantite,
entree_montant,
entree_montant_ht,
sortie_quantite,
sortie_montant,
sortie_montant_ht,
stock_quantite_debut,
stock_quantite_fin,
no_sejour,
no_patient
FROM (
SELECT * FROM w_mvt
ORDER BY date, time
) sub
;
SELECT base.cti_enable_index('eco', 'i_mouvements_articles_1');
SELECT base.cti_enable_index('eco', 'i_mouvements_articles_2');
SELECT base.cti_enable_index('eco', 'i_mouvements_articles_3');
SELECT base.cti_enable_index('eco', 'i_mouvements_articles_4');
SELECT base.cti_enable_index('eco', 'i_mouvements_articles_5');
SELECT base.cti_enable_index('eco', 'i_mouvements_articles_6');
SELECT base.cti_enable_index('eco', 'i_mouvements_articles_7');
SELECT base.cti_enable_index('eco', 'i_mouvements_articles_8');
SELECT base.cti_enable_index('eco', 'i_mouvements_articles_9');
SELECT base.cti_enable_index('eco', 'i_mouvements_articles_10');
]]></sqlcmd>
</NODE>
<NODE label="Séjours par rapport SDELIVERYD">
<condition><![CDATA[
SELECT count(*) = 1
FROM information_schema.tables
WHERE 1=1
AND table_schema = 'prod_sagex3'
AND table_name = 'sdeliveryd'
;
]]></condition>
<sqlcmd><![CDATA[
UPDATE eco.p_mouvements_articles
SET sortie_montant_ht = sortie_montant / ((100 + VATRAT_0)/100)
FROM (
SELECT '(' || SDHNUM_0 || '-' || SDDLIN_0 || ')' AS ref, VATRAT_0
FROM prod_sagex3.SDELIVERYD
JOIN prod_sagex3.TABVAT ON TABVAT.VAT_0 = SDELIVERYD.VAT_0
) sub
WHERE substring(texte from '\([^\)]*\)$') = ref
AND sortie_montant != 0 AND sortie_montant_ht = 0
;
]]></sqlcmd>
</NODE>
<NODE label="Séjours par rapport SDELIVERY">
<condition><![CDATA[
SELECT count(*) = 1
FROM information_schema.tables
WHERE 1=1
AND table_schema = 'prod_sagex3'
AND table_name = 'sdelivery'
;
]]></condition>
<sqlcmd><![CDATA[
UPDATE eco.p_mouvements_articles
SET no_sejour = SDELIVERY.X_CODSEJ_0,
no_patient = X_CODIPP_0
FROM prod_sagex3.SDELIVERY
LEFT JOIN prod_sagex3.XPATIENT ON SDELIVERY.X_CODSEJ_0 = XPATIENT.X_CODSEJ_0
WHERE SDHNUM_0 = regexp_replace(p_mouvements_articles.texte,'.*\(([A-Z]*\-[^\-\)]*)[^\)]*\)$',E'\\1');
DROP TABLE IF EXISTS w_sejour_patient;
CREATE TEMP TABLE w_sejour_patient AS
SELECT no_sejour, MAX(no_patient) AS no_patient
FROM eco.p_mouvements_articles
WHERE no_patient <> '' AND no_sejour <> ''
GROUP BY 1
;
ANALYSE w_sejour_patient
;
UPDATE eco.p_mouvements_articles
SET no_patient = w_sejour_patient.no_patient
FROM w_sejour_patient
WHERE p_mouvements_articles.no_sejour = w_sejour_patient.no_sejour AND
p_mouvements_articles.no_patient = ''
;
SELECT eco.cti_reorganize_sejour();
SELECT eco.cti_reorganize_sejour_ucd_lpp()
]]></sqlcmd>
</NODE>
<NODE label="Stocks">
<sqlcmd><![CDATA[
SELECT base.cti_disable_index('eco', 'i_stock_1');
SELECT base.cti_disable_index('eco', 'i_stock_2');
SELECT base.cti_disable_index('eco', 'i_stock_3');
SELECT base.cti_disable_index('eco', 'i_stock_4');
SELECT base.cti_disable_index('eco', 'i_stock_5');
-- cumul ES d'après mouvements
DROP TABLE IF EXISTS w_stock;
CREATE TEMP TABLE w_stock AS
SELECT
COALESCE(t_sites.code_original,'') AS site_code_original,
t_articles.code_original AS article_code_original,
p_mouvements_articles.article_id,
t_articles.compte_id,
t_articles.ucd_id,
t_articles.lpp_id,
p_mouvements_articles.fournisseur_id AS fournisseur_id,
site_id,
0 as lieu_id,
date(date_trunc('month',date)) AS date_debut,
date(date_trunc('month',date) + interval '1 month' - interval '1 day') AS date_fin,
date_part('year',date)*12 + date_part('month',date) AS mois_sequence,
SUM(entree_quantite) AS entree_quantite,
SUM(entree_montant) AS entree_montant,
SUM(sortie_quantite) AS sortie_quantite,
SUM(sortie_montant) AS sortie_montant,
0::numeric as pump,
'0'::text AS ok_pump,
0::numeric AS stock_quantite_debut,
0::numeric AS stock_quantite_fin,
0::numeric AS stock_valeur_debut,
0::numeric AS stock_valeur_fin
FROM eco.p_mouvements_articles
JOIN eco.t_articles ON p_mouvements_articles.article_id = t_articles.oid
JOIN eco.t_sites ON p_mouvements_articles.site_id = t_sites.oid
GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12
ORDER BY article_id,date_fin
;
--etats
DROP TABLE IF EXISTS w_etat;
CREATE TEMP TABLE w_etat AS
SELECT
CASE WHEN CSTCOD_0 = 4 THEN CST_0 ELSE '0.5' END as ok_pump,
CASE WHEN REFDAT_0 = date_trunc('month',REFDAT_0) + interval '1 month' - interval '1 day' OR IPTDAT_0 IS NULL THEN STOVALWRK.QTYSTU_0 ELSE
STOVALWRK.QTYSTU_0 + SUM(CASE WHEN IPTDAT_0 > REFDAT_0 THEN STOJOU.QTYSTU_0 ELSE 0 END) OVER
(PARTITION BY STOVALWRK.ITMREF_0, STOVALWRK.STOFCY_0, date_trunc('month',IPTDAT_0), IPTDAT_0 > REFDAT_0 ORDER BY IPTDAT_0) END as stock,
STOVALWRK.ITMREF_0,STOVALWRK.STOFCY_0,CASE WHEN CSTCOD_0 = 4 THEN CST_0 ELSE 0 END as pump,
date_trunc('month',REFDAT_0) AS date_ref, COALESCE(IPTDAT_0,REFDAT_0) AS date_mvt
FROM prod_sagex3.STOVALWRK LEFT JOIN prod_sagex3.STOJOU ON
STOVALWRK.ITMREF_0 = STOJOU.ITMREF_0 AND
STOVALWRK.STOFCY_0 = STOJOU.STOFCY_0 AND
date_trunc('month',REFDAT_0) = date_trunc('month',IPTDAT_0)
order by STOVALWRK.ITMREF_0,date_mvt;
-- inventaires
DROP TABLE IF EXISTS w_inv;
CREATE TEMP TABLE w_inv AS
SELECT
CASE WHEN CUNDAT_0 > LASRCPDAT_0 THEN '1' ELSE '0.5' END AS ok_pump,
CASE WHEN CUNDAT_0 = IPTDAT_0 OR IPTDAT_0 IS NULL THEN PHYSTO_0 ELSE CUNSTO_0 + COALESCE(SUM(STOJOU.QTYSTU_0) OVER (PARTITION BY ITMMVT.ITMREF_0, ITMMVT.STOFCY_0, IPTDAT_0 > CUNDAT_0 ORDER BY IPTDAT_0 ),0) END as stock,
ITMMVT.ITMREF_0,
ITMMVT.STOFCY_0,
X_PMPPER_0,
date_trunc('month',CUNDAT_0) AS date_ref,
COALESCE(IPTDAT_0, CUNDAT_0) AS date_mvt
FROM prod_sagex3.ITMMVT JOIN prod_sagex3.STOJOU ON
ITMMVT.ITMREF_0 = STOJOU.ITMREF_0 AND
ITMMVT.STOFCY_0 = STOJOU.STOFCY_0 AND
date_trunc('month',CUNDAT_0) = date_trunc('month',IPTDAT_0) AND
CUNDAT_0 < IPTDAT_0
order by itmmvt.itmref_0
;
INSERT INTO w_stock
SELECT
t_sites.code_original,
t_articles.code_original,
t_articles.oid,
t_articles.compte_id,
t_articles.ucd_id,
t_articles.lpp_id,
w_stock.fournisseur_id,
t_sites.oid,
0,
date_ref AS date_debut,
date_ref + interval '1 month' - interval '1 day' AS date_fin,
date_part('year',date_ref)*12 + date_part('month',date_ref) AS mois_sequence,
0 AS entree_quantite,
0 AS entree_montant,
0 AS sortie_quantite,
0 AS sortie_montant,
w_etat.pump,
w_etat.ok_pump,
0 AS stock_quantite_debut,
(MAX(ARRAY[date_mvt::text,stock::text]))[2]::numeric AS stock_quantite_fin,
0 AS stock_valeur_debut,
(MAX(ARRAY[date_mvt::text,stock::text]))[2]::numeric * w_etat.pump AS stock_valeur_fin
FROM w_etat
JOIN eco.t_articles ON ITMREF_0 = t_articles.code_original
JOIN eco.t_sites ON STOFCY_0 = t_sites.code_original
LEFT JOIN w_stock ON 1=1 AND
ITMREF_0 = article_code_original AND
date_ref = date_debut AND
STOFCY_0 = t_sites.code_original
WHERE date_debut IS NULL
AND date_ref > '[ENV_ECO_ANNEEDEBUT]-01-01'
GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,21
;
UPDATE w_stock
SET
ok_pump = sub.ok_pump,
--stock_quantite_debut = stock - entree_quantite + sortie_quantite,
stock_quantite_fin = stock,
stock_valeur_debut = (stock - entree_quantite + sortie_quantite) * sub.pump,
stock_valeur_fin = stock * sub.pump,
pump = sub.pump
FROM (
SELECT ITMREF_0,
STOFCY_0,
date_ref,
pump,
ok_pump,
(MAX(ARRAY[date_mvt::text,stock::text]))[2]::numeric as stock
FROM w_etat
GROUP BY 1,2,3,4,5) sub
WHERE 1=1
AND ITMREF_0 = article_code_original
AND STOFCY_0 = site_code_original
AND date_ref = date_debut
AND w_stock.ok_pump = '0'
;
UPDATE w_stock
SET
stock_quantite_fin = CASE WHEN w_stock.ok_pump = 0 THEN stock ELSE stock_quantite_fin END,
pump = X_PMPPER_0,
stock_valeur_fin = X_PMPPER_0 * stock,
ok_pump = sub.ok_pump
FROM
(SELECT ITMREF_0,
STOFCY_0,
date_ref,
(MAX(ARRAY[date_mvt::text, stock::text]))[2]::numeric as stock,
(MAX(ARRAY[date_mvt::text, X_PMPPER_0::text]))[2]::numeric as X_PMPPER_0,
(MAX(ARRAY[date_mvt::text, ok_pump::text]))[2]::numeric as ok_pump
FROM w_inv
GROUP BY 1,2,3) sub
WHERE 1=1 AND
article_code_original = ITMREF_0 AND
site_code_original = STOFCY_0 AND
date_debut = date_ref AND
stock > 0
;
INSERT INTO w_stock
SELECT
COALESCE(t_sites.code_original,'') AS site_code_original,
t_articles.code_original AS article_code_original,
t_articles.oid,
t_articles.compte_id,
t_articles.ucd_id,
t_articles.lpp_id,
w_stock.fournisseur_id,
t_sites.oid,
0,
date_ref AS date_debut,
date_ref + interval '1 month' - interval '1 day' AS date_fin,
date_part('year',date_ref)*12 + date_part('month',date_ref) AS mois_sequence,
0 AS entree_quantite,
0 AS entree_montant,
0 AS sortie_quantite,
0 AS sortie_montant,
CASE WHEN w_inv.ok_pump = '1' THEN X_PMPPER_0 ELSE 0 END as pump,
w_inv.ok_pump,
stock AS stock_quantite_debut,
stock AS stock_quantite_fin,
stock * X_PMPPER_0 AS stock_valeur_debut,
stock * X_PMPPER_0 AS stock_valeur_fin
FROM w_inv
LEFT JOIN w_stock ON 1=1 AND
ITMREF_0 = article_code_original AND
STOFCY_0 = site_code_original AND
date_ref = date_debut
JOIN eco.t_articles ON ITMREF_0 = t_articles.code_original
JOIN eco.t_sites ON STOFCY_0 = t_sites.code_original
AND stock > 0
WHERE date_debut IS NULL
AND date_ref > '[ENV_ECO_ANNEEDEBUT]-01-01'
ORDER BY article_id,date_fin
;
-- pas dans un état => stock à 0
INSERT INTO w_stock
SELECT
t_sites.code_original,
t_articles.code_original,
t_articles.oid,
t_articles.compte_id,
t_articles.ucd_id,
t_articles.lpp_id,
ref.fournisseur_id,
t_sites.oid,
0,
date_trunc('month',periode.REFDAT_0) AS date_debut,
date_trunc('month',periode.REFDAT_0) + interval '1 month' - interval '1 day' AS date_fin,
date_part('year',date_trunc('month',periode.REFDAT_0))*12 + date_part('month',date_trunc('month',periode.REFDAT_0)) AS mois_sequence,
0 AS entree_quantite,
0 AS entree_montant,
0 AS sortie_quantite,
0 AS sortie_montant,
0 AS pump,
'0.5' AS ok_pump,
0 AS stock_quantite_debut,
0 AS stock_quantite_fin,
0 AS stock_valeur_debut,
0 AS stock_valeur_fin
FROM
(SELECT ITMREF_0, STOFCY_0 FROM prod_sagex3.STOJOU GROUP BY 1,2) w_exist
JOIN
(SELECT STOFCY_0, REFDAT_0 FROM prod_sagex3.STOVALWRK GROUP BY 1,2) periode ON w_exist.STOFCY_0 = periode.STOFCY_0
LEFT JOIN (SELECT date_ref, ITMREF_0, STOFCY_0 FROM w_etat GROUP BY 1,2,3) w_etat ON
w_exist.ITMREF_0 = w_etat.ITMREF_0 AND
w_exist.STOFCY_0 = w_etat.STOFCY_0 AND
date_ref = date_trunc('month',REFDAT_0)
LEFT JOIN w_stock ref ON
ref.article_code_original = w_exist.ITMREF_0 AND
ref.site_code_original = w_exist.STOFCY_0 AND
ref.date_debut = date_trunc('month',REFDAT_0)
JOIN eco.t_articles ON w_exist.ITMREF_0 = t_articles.code_original
JOIN eco.t_sites ON w_exist.STOFCY_0 = t_sites.code_original
WHERE w_etat.date_ref IS NULL AND ref.date_debut IS NULL
;
drop table if exists temp.w_st;
create table temp.w_st as select * from w_stock;
-- initialisation des stock à 0 si premier mouvements détecté sur l'article et le site
UPDATE w_stock
SET
ok_pump = 0.5,
stock_quantite_fin = entree_quantite - sortie_quantite
FROM (SELECT ITMREF_0, STOFCY_0, min(IPTDAT_0) as min_date FROM prod_sagex3.STOJOU GROUP BY 1,2) start
WHERE article_code_original = ITMREF_0
AND site_code_original = STOFCY_0
AND date(date_trunc('month',min_date)) = date_debut
AND ok_pump = 0
;
-- maj croissante des quantités
UPDATE w_stock
SET ok_pump = '0.5',
stock_quantite_fin = subview.stock_quantite_fin
FROM
(
SELECT w_stock.site_id, w_stock.lieu_id, w_stock.article_id, w_stock.mois_sequence, w_stock.date_fin,
w_stock_ref.stock_quantite_fin + SUM(w_stock.entree_quantite - w_stock.sortie_quantite) OVER (PARTITION BY w_stock.site_id, w_stock.lieu_id, w_stock.article_id, last_ref ORDER BY w_stock.date_fin asc) AS stock_quantite_fin
FROM w_stock JOIN
(SELECT
site_id,
lieu_id,
article_id,
mois_sequence,
stock_quantite_fin,
COALESCE(lead(mois_sequence,1) OVER (PARTITION BY article_id, site_id, lieu_id ORDER BY mois_sequence),100000000) AS next_ref,
COALESCE(lag(mois_sequence,1) OVER (PARTITION BY article_id, site_id, lieu_id ORDER BY mois_sequence),-100000000) AS last_ref
FROM w_stock WHERE ok_pump != '0'
) w_stock_ref ON 1=1
AND w_stock.lieu_id = w_stock_ref.lieu_id
AND w_stock.site_id = w_stock_ref.site_id
AND w_stock.article_id = w_stock_ref.article_id
AND w_stock.mois_sequence BETWEEN w_stock_ref.mois_sequence AND next_ref
AND w_stock_ref.mois_sequence < w_stock.mois_sequence
ORDER BY w_stock.date_fin
) subview
WHERE ok_pump = '0' AND
w_stock.article_id = subview.article_id AND
w_stock.site_id = subview.site_id AND
w_stock.lieu_id = subview.lieu_id AND
w_stock.mois_sequence = subview.mois_sequence
;
-- calcul quantités
-- maj décroissante
UPDATE w_stock
SET ok_pump = '0.5',
stock_quantite_fin = subview.stock_quantite_fin
FROM
(
SELECT w_stock.site_id, w_stock.lieu_id, w_stock.article_id, w_stock.mois_sequence, w_stock.date_fin,
w_stock_ref.stock_quantite_fin - w_stock_ref.entree_quantite + w_stock_ref.sortie_quantite + w_stock.entree_quantite - w_stock.sortie_quantite - SUM(w_stock.entree_quantite
- w_stock.sortie_quantite) OVER (PARTITION BY w_stock.site_id, w_stock.lieu_id, w_stock.article_id, next_ref ORDER BY w_stock.date_fin desc) AS stock_quantite_fin
FROM w_stock
JOIN (SELECT
site_id,
lieu_id,
article_id,
mois_sequence,
stock_quantite_fin,
entree_quantite,
sortie_quantite,
COALESCE(lead(mois_sequence,1) OVER (PARTITION BY article_id, site_id, lieu_id ORDER BY mois_sequence),100000000) AS next_ref,
COALESCE(lag(mois_sequence,1) OVER (PARTITION BY article_id, site_id, lieu_id ORDER BY mois_sequence),-100000000) AS last_ref
FROM w_stock WHERE ok_pump != '0'
) w_stock_ref ON 1=1
AND w_stock.lieu_id = w_stock_ref.lieu_id
AND w_stock.site_id = w_stock_ref.site_id
AND w_stock.article_id = w_stock_ref.article_id
AND w_stock.mois_sequence BETWEEN last_ref ANd w_stock_ref.mois_sequence
AND w_stock.mois_sequence != w_stock_ref.mois_sequence
ORDER BY w_stock.date_fin
) subview
WHERE ok_pump = '0' AND
w_stock.article_id = subview.article_id AND
w_stock.site_id = subview.site_id AND
w_stock.lieu_id = subview.lieu_id AND
w_stock.mois_sequence = subview.mois_sequence
;
-- forcage pump avec dernières réceptions
DROP TABLE IF EXISTS w_rec;
CREATE TEMP TABLE w_rec AS
SELECT
'1' as ok_pump,
ITMMVT.ITMREF_0,ITMMVT.STOFCY_0,X_PMPPER_0,
date_trunc('month',X_DATPMP_0) AS date_ref
FROM prod_sagex3.ITMMVT
;
-- Prix distri historisé si pas de pump
DROP SEQUENCE IF EXISTS w_prix_distri_seq;
CREATE TEMP SEQUENCE w_prix_distri_seq;
DROP TABLE IF EXISTS w_prix_distri;
CREATE TEMP TABLE w_prix_distri AS
SELECT subview.*, '20991231'::date AS date_fin, nextval('w_prix_distri_seq'::regclass) AS prix_sequence
FROM
(
SELECT STOFCY_0,ITMREF_0, date(date_trunc('month',IPTDAT_0)) AS date_debut,
(MAX(ARRAY[IPTDAT_0::text,PRIORD_0::text]))[2]::numeric AS prix_distri_ht,
0 AS prix_distri_ttc
FROM prod_sagex3.STOJOU
WHERE QTYSTU_0 < 0
AND PRINAT_0 = 5 AND TRSTYP_0 = 4
GROUP BY 1,2,3
ORDER BY 1,2,3
) subview;
UPDATE w_prix_distri
SET date_fin = w_prix_distri_next.date_debut - interval '1 day'
FROM w_prix_distri w_prix_distri_next
WHERE w_prix_distri.ITMREF_0 = w_prix_distri_next.ITMREF_0 AND
w_prix_distri.STOFCY_0 = w_prix_distri_next.STOFCY_0 AND
w_prix_distri.prix_sequence = w_prix_distri_next.prix_sequence - 1
;
CREATE INDEX w_prix_distri_i1 ON w_prix_distri USING btree (ITMREF_0)
;
CREATE INDEX w_prix_distri_i2 ON w_prix_distri USING btree (STOFCY_0)
;
UPDATE w_stock
SET
ok_pump = '1',
pump = X_PMPPER_0,
stock_valeur_fin = stock_quantite_fin * X_PMPPER_0,
stock_valeur_debut = stock_quantite_debut * X_PMPPER_0
FROM w_rec
WHERE 1=1 AND
ITMREF_0 = article_code_original AND
STOFCY_0 = site_code_original AND
date_ref <= date_debut AND
w_stock.ok_pump = '0.5' AND
X_PMPPER_0 != 0
;
UPDATE w_STOCK SET
pump = prix_distri_ht,
stock_valeur_fin = w_STOCK.stock_quantite_fin * prix_distri_ht,
ok_pump = 1
FROM w_prix_distri
WHERE w_prix_distri.ITMREF_0 = w_STOCK.article_code_original AND
w_prix_distri.STOFCY_0 = w_STOCK.site_code_original AND
w_STOCK.date_fin BETWEEN w_prix_distri.date_debut AND w_prix_distri.date_fin
AND ok_pump != '1'
AND prix_distri_ht != 0
;
-- Prix reception historisé si toujours pas de pump
DROP SEQUENCE IF EXISTS w_prix_rec_seq;
CREATE TEMP SEQUENCE w_prix_rec_seq;
DROP TABLE IF EXISTS w_prix_rec;
CREATE TEMP TABLE w_prix_rec AS
SELECT subview.*, '20991231'::date AS date_fin, nextval('w_prix_rec_seq'::regclass) AS prix_sequence
FROM
(
SELECT STOFCY_0,ITMREF_0, date(date_trunc('month',IPTDAT_0)) AS date_debut,
(MAX(ARRAY[IPTDAT_0::text,PRIORD_0::text]))[2]::numeric AS prix_distri_ht,
0 AS prix_distri_ttc
FROM prod_sagex3.STOJOU
WHERE QTYSTU_0 > 0
AND PRINAT_0 = 8
GROUP BY 1,2,3
ORDER BY 1,2,3
) subview;
UPDATE w_prix_rec
SET date_fin = w_prix_rec_next.date_debut - interval '1 day'
FROM w_prix_rec w_prix_rec_next
WHERE w_prix_rec.ITMREF_0 = w_prix_rec_next.ITMREF_0 AND
w_prix_rec.STOFCY_0 = w_prix_rec_next.STOFCY_0 AND
w_prix_rec.prix_sequence = w_prix_rec_next.prix_sequence - 1
;
CREATE INDEX w_prix_rec_i1 ON w_prix_rec USING btree (ITMREF_0)
;
CREATE INDEX w_prix_rec_i2 ON w_prix_rec USING btree (STOFCY_0)
;
UPDATE w_STOCK SET
pump = prix_distri_ht,
stock_valeur_fin = w_STOCK.stock_quantite_fin * prix_distri_ht
FROM w_prix_rec
WHERE w_prix_rec.ITMREF_0 = w_STOCK.article_code_original AND
w_prix_rec.STOFCY_0 = w_STOCK.site_code_original AND
w_STOCK.date_fin BETWEEN w_prix_rec.date_debut AND w_prix_rec.date_fin
AND ok_pump != '1'
;
UPDATE w_STOCK SET
pump = prix_distri_ht,
stock_valeur_fin = w_STOCK.stock_quantite_fin * prix_distri_ht
FROM w_prix_rec
WHERE w_prix_rec.ITMREF_0 = w_STOCK.article_code_original AND
w_prix_rec.STOFCY_0 = w_STOCK.site_code_original AND
w_STOCK.date_fin BETWEEN w_prix_rec.date_debut AND w_prix_rec.date_fin
AND ok_pump != '1'
;
-- ajout des stocks mensuels manquants
SELECT base.cti_execute('
INSERT INTO w_stock
SELECT
w_stock.site_code_original,
w_stock.article_code_original,
w_stock.article_id,
w_stock.compte_id,
w_stock.ucd_id,
w_stock.lpp_id,
w_stock.fournisseur_id,
w_stock.site_id,
w_stock.lieu_id,
date(date_trunc(''month'',w_stock.date_debut) + interval ''1 month'') AS date_debut,
date(date_trunc(''month'',w_stock.date_debut) + interval ''2 month'' - interval ''1 day'') AS date_fin,
w_stock.mois_sequence + 1,
0 AS entree_quantite,
0 AS entree_montant,
0 AS sortie_quantite,
0 AS sortie_montant,
w_stock.pump,
w_stock.ok_pump,
w_stock.stock_quantite_debut,
w_stock.stock_quantite_fin,
w_stock.stock_valeur_debut,
w_stock.stock_valeur_fin
FROM w_stock
LEFT JOIN w_stock w_stock_next ON
w_stock.site_id = w_stock_next.site_id AND
w_stock.lieu_id = w_stock_next.lieu_id AND
w_stock.article_code_original = w_stock_next.article_code_original AND
w_stock.mois_sequence = w_stock_next.mois_sequence - 1
WHERE
w_stock_next.mois_sequence IS NULL AND
w_stock.date_debut <= date(now()) AND
w_stock.date_fin >= ''[ENV_ECO_ANNEEDEBUT]-01-01'' AND
w_stock.stock_quantite_fin != 0
',200)
;
-- mise à jour des débuts
UPDATE w_STOCK SET
stock_quantite_debut = stock_quantite_fin - entree_quantite + sortie_quantite,
stock_valeur_debut = stock_valeur_fin - entree_montant + sortie_montant
;
-- insertion
TRUNCATE eco.p_stock
;
INSERT INTO eco.p_stock
(
article_id,
compte_id,
ucd_id,
lpp_id,
fournisseur_id,
site_id,
lieu_id,
date_debut,
date_fin,
entree_quantite,
entree_montant,
sortie_quantite,
sortie_montant,
pump,
stock_quantite_debut,
stock_quantite_fin,
stock_valeur_debut,
stock_valeur_fin
)
SELECT
article_id,
compte_id,
ucd_id,
lpp_id,
fournisseur_id,
site_id,
lieu_id,
date_debut,
date_fin,
entree_quantite,
entree_montant,
sortie_quantite,
sortie_montant,
pump,
stock_quantite_debut,
stock_quantite_fin,
stock_valeur_debut,
stock_valeur_fin
FROM w_stock
WHERE stock_quantite_debut != 0 OR stock_quantite_fin != 0
;
SELECT base.cti_enable_index('eco', 'i_stock_1');
SELECT base.cti_enable_index('eco', 'i_stock_2');
SELECT base.cti_enable_index('eco', 'i_stock_3');
SELECT base.cti_enable_index('eco', 'i_stock_4');
SELECT base.cti_enable_index('eco', 'i_stock_5');
]]></sqlcmd>
</NODE>
<NODE label="Factures">
<sqlcmd><![CDATA[
SELECT base.cti_disable_index('eco', 'i_facture_1');
SELECT base.cti_disable_index('eco', 'i_facture_2');
SELECT base.cti_disable_index('eco', 'i_facture_3');
SELECT base.cti_disable_index('eco', 'i_facture_4');
SELECT base.cti_disable_index('eco', 'i_facture_5');
TRUNCATE eco.p_facture;
INSERT INTO eco.p_facture(
code_original,
no_facture,
commande_id,
date_facture,
date_reglement,
fournisseur_id,
texte,
montant_facture_article_ht,
montant_facture_article_ttc,
montant_facture_article_tva,
montant_facture_port_ht,
montant_facture_port_ttc,
montant_facture_port_tva,
montant_facture_ht,
montant_facture_ttc,
montant_facture_tva)
SELECT
PINVOICED.NUM_0 AS code_original,
MAX(PINVOICED.NUM_0) AS numero_facture,
MAX(p_commandes.oid) AS commande_id,
MAX(date(BPRDATVCR_0)) AS date_facture,
MAX(date(GACCENTRY.ACCDAT_0)) AS date_reglement,
MAX(t_fournisseurs.oid) AS fournisseur_id,
MAX('Facture n°' || PINVOICED.NUM_0) as texte,
SUM(AMTNOTLIN_0) AS montant_facture_article_ht,
SUM(AMTATILIN_0) AS montant_facture_article_ttc,
SUM(AMTTAXLIN1_0) AS montant_facture_article_tva,
0::numeric,
0::numeric,
0::numeric,
SUM(AMTNOTLIN_0) AS montant_facture_ht,
SUM(AMTATILIN_0) AS montant_facture_tt,
SUM(AMTTAXLIN1_0) AS montant_facture_tva
FROM prod_sagex3.PINVOICED
JOIN eco.p_commandes ON POHNUM_0= p_commandes.code_original
LEFT JOIN prod_sagex3.GACCENTRY ON GACCENTRY.NUM_0 = PINVOICED.NUM_0
LEFT JOIN eco.t_fournisseurs ON t_fournisseurs.code_original = BPR_0
WHERE PINVOICED.ACCDAT_0 >= '[ENV_ECO_ANNEEDEBUT]-01-01'
GROUP BY 1
ORDER BY 1;
SELECT base.cti_enable_index('eco', 'i_facture_1');
SELECT base.cti_enable_index('eco', 'i_facture_2');
SELECT base.cti_enable_index('eco', 'i_facture_3');
SELECT base.cti_enable_index('eco', 'i_facture_4');
SELECT base.cti_enable_index('eco', 'i_facture_5');
SELECT base.cti_disable_index('eco', 'i_lignes_facture_1');
SELECT base.cti_disable_index('eco', 'i_lignes_facture_2');
SELECT base.cti_disable_index('eco', 'i_lignes_facture_3');
SELECT base.cti_disable_index('eco', 'i_lignes_facture_4');
TRUNCATE eco.p_lignes_facture;
INSERT INTO eco.p_lignes_facture(
article_id,
code_original,
compte_id,
facture_id,
ligne_commande,
ligne_commande_id,
montant_facture_article_ht,
montant_facture_article_ttc,
montant_facture_article_tva,
montant_facture_port_ht,
montant_facture_port_ttc,
montant_facture_port_tva,
montant_facture_ht,
montant_facture_ttc,
montant_facture_tva
)
SELECT
t_articles.oid,
PINVOICED.NUM_0 || '-' || PINVOICED.PIDLIN_0 AS code_original,
t_articles.compte_id as compte_id,
p_facture.oid,
ligne_commande,
p_lignes_commandes.oid,
AMTNOTLIN_0 AS montant_facture_article_ht,
AMTATILIN_0 AS montant_facture_article_ttc,
AMTTAXLIN1_0 AS montant_facture_article_tva,
0::numeric,
0::numeric,
0::numeric,
AMTNOTLIN_0 AS montant_facture_ht,
AMTATILIN_0 AS montant_facture_ttc,
AMTTAXLIN1_0 AS montant_facture_tva
FROM prod_sagex3.PINVOICED
JOIN eco.t_articles ON ITMREF_0 = t_articles.code_original
JOIN eco.p_facture ON NUM_0 = p_facture.code_original
JOIN eco.p_lignes_commandes ON POHNUM_0 || '-' || POPLIN_0 = p_lignes_commandes.code_original
LEFT JOIN prod_sagex3.GACCENTRY ON GACCENTRY.NUM_0 = PINVOICED.NUM_0
WHERE PINVOICED.ACCDAT_0 >= '[ENV_ECO_ANNEEDEBUT]-01-01'
ORDER BY 2;
SELECT base.cti_enable_index('eco', 'i_lignes_facture_1');
SELECT base.cti_enable_index('eco', 'i_lignes_facture_2');
SELECT base.cti_enable_index('eco', 'i_lignes_facture_3');
SELECT base.cti_enable_index('eco', 'i_lignes_facture_4');
DROP TABLE IF EXISTS w_engagement;
CREATE TEMP TABLE w_engagement AS
SELECT p_lignes_commandes.commande_id, MIN(date_facture) AS date_facture
FROM eco.p_lignes_facture
JOIN eco.p_facture ON facture_id = p_facture.oid
JOIN eco.p_lignes_commandes ON ligne_commande_id = p_lignes_commandes.oid
GROUP BY 1;
UPDATE eco.p_commandes
SET date_engagement = date_facture
FROM w_engagement
where oid = commande_id
;
]]></sqlcmd>
</NODE>
</NODE>
<NODE name="POST" label="POST-TRAITEMENTS">
<sqlcmd><![CDATA[
VACUUM ANALYSE eco.p_mouvements_articles;
VACUUM ANALYSE eco.p_stock;
SELECT eco.cti_update_mvt_qte_stock();
SELECT eco.cti_update_mvt_mnt_stock();
]]></sqlcmd>
</NODE>
</ROOT>