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 ; ]]> 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 ) ; ]]> 0 FROM information_schema.tables WHERE 1=1 AND table_schema = 'prod_sagex3' AND table_name = 'preceiptd' ; ]]> 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) ; ]]> 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' ; ]]> 0 FROM information_schema.tables WHERE 1=1 AND table_schema = 'prod_sagex3' AND table_name = 'preceiptd' ; ]]> 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'; ]]> 0 FROM information_schema.tables WHERE 1=1 AND table_schema = 'prod_sagex3' AND table_name = 'preceiptd' ; ]]> '' 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 ; ]]> '' 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; ]]> '' 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() ]]> 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'); ]]> = '[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 ; ]]>