0 AND ETATCMDE = ANY(ARRAY[(SELECT string_to_array(valeur,',') FROM eco.t_divers WHERE code = 'PHARMA_COM_TO_SYNC')]) ; ANALYSE w_COMMANDE ; -- Attention, il peut y avoir quelques doubles dans les numeros de commandes -- Et cela provoque des doubles dans les mouvements de livraison -- Solution : pour ces commandes en double, identifier les produits pour mieux filtrer sur les mouvements (MVTPDT) plus loin -- Si un produit est dans deux commandes, on en choisit une UPDATE w_COMMANDE SET is_double = '1' FROM ( SELECT NUMCMDE, SUFCMDE FROM w_COMMANDE GROUP BY 1,2 HAVING count(*) > 1 ) subview WHERE w_COMMANDE.NUMCMDE = subview.NUMCMDE AND w_COMMANDE.SUFCMDE = subview.SUFCMDE ; UPDATE w_COMMANDE SET PRCLEUNIK_array = subview.PRCLEUNIK_array FROM ( SELECT C1CLEUNIK, base.cti_array_accum(DISTINCT PRCLEUNIK) AS PRCLEUNIK_array FROM ( SELECT NUMCMDE, SUFCMDE, PRCLEUNIK, MIN(w_COMMANDE.C1CLEUNIK) AS C1CLEUNIK FROM w_COMMANDE JOIN prod_pharma.LIGNE ON w_COMMANDE.C1CLEUNIK = LIGNE.C1CLEUNIK WHERE is_double = '1' GROUP BY 1,2,3 ) subview GROUP BY 1 ) subview WHERE w_COMMANDE.C1CLEUNIK = subview.C1CLEUNIK ; SELECT base.cti_execute( 'ALTER TABLE w_COMMANDE ADD COLUMN C_EDI_NUMCOMMANDE text DEFAULT ''''', 1 ) WHERE 'C_EDI_NUMCOMMANDE' NOT IN (SELECT upper(column_name) FROM information_schema.columns WHERE table_name = 'w_commande') ; CREATE INDEX w_COMMANDE_i1 ON w_COMMANDE USING btree(C1CLEUNIK); CREATE INDEX w_COMMANDE_i2 ON w_COMMANDE USING btree(F0CLEUNIK); DROP TABLE IF EXISTS w_LIGNE_source; CREATE TEMP TABLE w_LIGNE_source AS SELECT LIGNE.*, row_number() OVER () AS LIGNE_sequence FROM prod_pharma.LIGNE JOIN w_COMMANDE ON w_COMMANDE.C1CLEUNIK = LIGNE.C1CLEUNIK ; ANALYSE w_LIGNE_source ; UPDATE w_LIGNE_source SET SERVICE = UPPER(SERVICE) WHERE SERVICE <> UPPER(SERVICE) AND UPPER(SERVICE) IN (SELECT SERVICE FROM prod_pharma.SERVICE) ; CREATE INDEX i_w_LIGNE_source_L0CLEUNIK ON w_LIGNE_source USING btree (L0CLEUNIK) ; CREATE INDEX i_w_LIGNE_source_C1CLEUNIK ON w_LIGNE_source USING btree (C1CLEUNIK) ; CREATE INDEX i_w_LIGNE_source_PRCLEUNIK ON w_LIGNE_source USING btree (PRCLEUNIK) ; DELETE FROM w_LIGNE_source USING ( SELECT L0CLEUNIK, (MAX(ARRAY[C1INIT,LIGNE_sequence::text]))[2]::numeric AS keep_sequence FROM w_LIGNE_source GROUP BY 1 HAVING count(*) > 1 ) subview WHERE w_LIGNE_source.L0CLEUNIK = subview.L0CLEUNIK AND w_LIGNE_source.LIGNE_sequence <> keep_sequence ; -- Problème de lignes dupliquées sur les commandes UPDATE w_LIGNE_source SET NOLIGCMDE = NOLIGCMDE_new FROM ( SELECT w_LIGNE_source.C1CLEUNIK, w_LIGNE_source.L0CLEUNIK, NOLIGCMDE, row_number() OVER (PARTITION BY w_LIGNE_source.C1CLEUNIK ORDER BY w_LIGNE_source.L0CLEUNIK) AS NOLIGCMDE_new FROM w_LIGNE_source JOIN ( SELECT C1CLEUNIK FROM ( SELECT C1CLEUNIK, NOLIGCMDE FROM w_LIGNE_source GROUP BY 1,2 HAVING count(*) > 1 ) subview GROUP BY 1 ) subview ON w_LIGNE_source.C1CLEUNIK = subview.C1CLEUNIK ) subview WHERE w_LIGNE_source.L0CLEUNIK = subview.L0CLEUNIK ; DROP SEQUENCE IF EXISTS w_MVTPDT_sequence; CREATE TEMP SEQUENCE w_MVTPDT_sequence; DROP TABLE IF EXISTS w_MVTPDT; CREATE TEMP TABLE w_MVTPDT AS SELECT COALESCE(CODEMAGASIN,'') AS MAGASIN, MVTPDT.MVTCLEUNIK, MVTPDT.PRCLEUNIK, MVTPDT.F0CLEUNIK, MVTPDT.DATEMVT, MVTPDT.TYPEMVT, MVTPDT.TYPESORTIE, MVTPDT.VALTTC, MVTPDT.VALHT, CASE WHEN MAGASINDEST = '' THEN MVTPDT.SENSMVT WHEN MAGASINDEST = CODEMAGASIN THEN 1 ELSE 2 END AS SENSMVT, MVTPDT.CODE_UCD, MVTPDT.REFMVT1, MVTPDT.REFMVT2, MVTPDT.REFMVT3, MVTPDT.MOTIF, MVTPDT.L0CLEUNIK, MVTPDT.CODE_LPP, MVTPDT.SERVICE, MVTPDT.QUANTITE, nextval('w_MVTPDT_sequence'::regclass) AS oid, COALESCE(w_COMMANDE.C1CLEUNIK,0) AS C1CLEUNIK, CASE WHEN MVTPDT.SERVICE <> '' AND MVTPDT.SERVICE <> '-1' THEN '|' || MVTPDT.SERVICE ELSE '' END AS profil_code_original, ''::text AS no_patient, ''::text AS no_sejour FROM prod_pharma.MVTPDT LEFT JOIN w_COMMANDE ON NUMCMDE::text || SUFCMDE::text = REFMVT1 AND NUMCMDE > 0 AND TYPEMVT IN (1,3) AND ETATCMDE <> '5' AND (is_double = '0' OR MVTPDT.PRCLEUNIK = ANY(PRCLEUNIK_array)) LEFT JOIN prod_pharma.MAGASIN ON MVTPDT.MAGASIN = CODEMAGASIN OR MAGASINDEST = CODEMAGASIN WHERE DATEMVT BETWEEN '[ENV_ECO_ANNEEDEBUT]0101' AND now() AND TYPEMVT <> 3 AND (IDMAGASIN = ANY (string_to_array('[ETAB_ID]'::text,',')) OR '[ETAB_ID]' = '' OR '[ETAB_ID]' = '-1') GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22; ANALYSE w_MVTPDT ; CREATE INDEX w_MVTPDT_i1 ON w_MVTPDT USING btree (oid); CREATE INDEX w_MVTPDT_i2 ON w_MVTPDT USING btree (C1CLEUNIK); CREATE INDEX w_MVTPDT_i3 ON w_MVTPDT USING btree (L0CLEUNIK); CREATE INDEX w_MVTPDT_14 ON w_MVTPDT USING btree (PRCLEUNIK); CREATE INDEX w_MVTPDT_i5 ON w_MVTPDT USING btree (F0CLEUNIK); UPDATE w_MVTPDT SET SERVICE = UPPER(SERVICE) WHERE SERVICE <> UPPER(SERVICE) AND UPPER(SERVICE) IN (SELECT SERVICE FROM prod_pharma.SERVICE) ; -- Si premier mouvement = inventaire, il doit être considéré comme une entrée UPDATE w_MVTPDT SET SENSMVT = 1, TYPEMVT = 1, QUANTITE = 0 - QUANTITE, VALHT = 0 - VALHT, VALTTC = 0 - VALTTC FROM ( SELECT MAGASIN, PRCLEUNIK, (MIN(ARRAY[to_char(MVTCLEUNIK,'FM000000000000000'),TYPESORTIE]))[2], MIN(MVTCLEUNIK) AS MVTCLEUNIK FROM w_MVTPDT GROUP BY 1,2 HAVING (MIN(ARRAY[to_char(MVTCLEUNIK,'FM000000000000000'),TYPESORTIE]))[2] = 'IN' ) subview WHERE w_MVTPDT.MVTCLEUNIK = subview.MVTCLEUNIK ; -- Inverser les retours UPDATE w_MVTPDT SET QUANTITE = 0-QUANTITE, VALHT = 0-VALHT, VALTTC = 0-VALTTC WHERE SENSMVT = 1 AND TYPEMVT IN (4,5) ; -- Forcage des magasins en tant que lieu INSERT INTO eco.t_divers (code, texte, valeur, description) SELECT 'PHARMA_MAG_LIEU', 'Forcer les magasins en tant que lieu', '0', '0=Non 1=Oui' WHERE 'PHARMA_MAG_LIEU' NOT IN (SELECT code FROM eco.t_divers) ; -- Sejours et patients UPDATE w_MVTPDT SET no_patient = subview.no_patient, no_sejour = subview.no_sejour FROM ( SELECT NUMBONDISP, PRCLEUNIK, date(DATECNSPAT) AS DATECNSPAT, count(distinct CONSOPAT.PACLEUNIK), MAX(COALESCE(PATIENT2.DOSSIER,PATIENT.DOSSIER,''))::text AS no_patient, MAX(COALESCE(SEJOUR.ADMISSION,''))::text AS no_sejour FROM prod_pharma.CONSOPAT LEFT JOIN prod_pharma.PATIENT ON CONSOPAT.PACLEUNIK = PATIENT.PACLEUNIK LEFT JOIN prod_pharma.SEJOUR ON CONSOPAT.SECLEUNIK = SEJOUR.SECLEUNIK LEFT JOIN prod_pharma.PATIENT PATIENT2 ON SEJOUR.PACLEUNIK = PATIENT2.PACLEUNIK GROUP BY 1,2,3 HAVING count(distinct CONSOPAT.PACLEUNIK) = 1 ) subview WHERE w_MVTPDT.REFMVT3 = subview.NUMBONDISP AND date(w_MVTPDT.DATEMVT) = subview.DATECNSPAT AND w_MVTPDT.PRCLEUNIK = subview.PRCLEUNIK ; ]]> 0 AND CODEUCD NOT IN (SELECT code FROM base.t_ucd); ]]> '' THEN LIBELLPP ELSE CODELPP END, CASE WHEN CODELPP <> '' THEN LIBELLPP ELSE CODELPP END FROM prod_pharma.LPP WHERE CODELPP > 0 AND CODELPP NOT IN (SELECT code FROM base.t_lpp); -- comptes INSERT INTO eco.t_compte(code, texte, texte_court, code_original) SELECT COMPTE, MAX(LIBCOMPTE), MAX(LIBCOMPTE), COMPTE FROM prod_pharma.compte WHERE COMPTE <> '-1' AND COMPTE <> '1' AND COMPTE <> '' AND COMPTE NOT IN (SELECT code_original FROM eco.t_compte WHERE code_original IS NOT NULL) AND COMPTE IN (SELECT COMPTE FROM prod_pharma.PRODUIT WHERE COMPTE IS NOT NULL) GROUP BY 1 ORDER BY 1; INSERT INTO eco.t_compte(code, texte, texte_court, code_original) SELECT COMPTE, MAX(LIBCOMPTE), MAX(LIBCOMPTE), COMPTE FROM prod_pharma.compte WHERE COMPTE <> '-1' AND COMPTE <> '1' AND COMPTE <> '' AND COMPTE NOT IN (SELECT code_original FROM eco.t_compte WHERE code_original IS NOT NULL) AND COMPTE IN (SELECT COMPTE FROM prod_pharma.ACHATS WHERE COMPTE IS NOT NULL) GROUP BY 1 ORDER BY 1; UPDATE eco.t_compte SET texte = sub.texte, texte_court = sub.texte_court FROM ( SELECT COMPTE, MAX(LIBCOMPTE) AS texte, LEFT(MAX(LIBCOMPTE),50) AS texte_court FROM prod_pharma.COMPTE GROUP BY 1 ) sub WHERE COMPTE = code AND ( t_compte.texte != sub.texte OR t_compte.texte_court != sub.texte_court ) ; INSERT INTO eco.t_classification_atc(code_original, code, texte, texte_court ) SELECT CLASSETH, MAX(CLASSETH), MAX(LIBELLE), MAX(LIBELLE) FROM prod_PHARMA.CLASSETH LEFT JOIN eco.t_classification_atc ON (code_original = CLASSETH) WHERE CLASSETH NOT IN ('-1', '1', '') AND code_original IS NULL GROUP BY 1 ORDER BY 1; UPDATE eco.t_classification_atc SET texte = LIBELLE, texte_court = LIBELLE FROM prod_PHARMA.CLASSETH WHERE code_original = CLASSETH AND (texte IS DISTINCT FROM LIBELLE OR texte_court IS DISTINCT FROM LIBELLE); -- Standard ATC SELECT eco.cti_reorganize_classification_atc(); -- unités INSERT INTO eco.t_unites(code_original, code, texte, texte_court ) SELECT UDCLEUNIK, MAX(CODEUD), MAX(LIBELUD), MAX(LIBELUD) FROM prod_PHARMA.UNITEDOSE LEFT JOIN eco.t_unites ON (code_original = UDCLEUNIK) WHERE UDCLEUNIK NOT IN (0, 1 , -1) AND code_original IS NULL AND CODEUD <> '' GROUP BY 1 ORDER BY 2; UPDATE eco.t_unites SET code = CODEUD, texte = LIBELUD, texte_court = LIBELUD FROM prod_PHARMA.UNITEDOSE WHERE code_original = UDCLEUNIK AND (code IS DISTINCT FROM CODEUD OR texte IS DISTINCT FROM LIBELUD OR texte_court IS DISTINCT FROM LIBELUD); -- Types articles INSERT INTO eco.t_types_articles(code_original, code, texte, texte_court ) SELECT substr(CODEPARAM,9), substr(CODEPARAM,9), MAX(VALPARAMTX), MAX(VALPARAMTX) FROM prod_PHARMA.PARAMETR LEFT JOIN eco.t_types_articles ON (code_original = substr(CODEPARAM,9)) WHERE CODEPARAM LIKE 'TTYPEPDT%' AND substr(CODEPARAM,9) BETWEEN '0' AND '9' AND VALPARAMTX <> '' AND code_original IS NULL GROUP BY 1; UPDATE eco.t_types_articles SET texte = VALPARAMTX, texte_court = VALPARAMTX FROM prod_PHARMA.PARAMETR WHERE CODEPARAM LIKE 'TTYPEPDT%' AND substr(CODEPARAM,9) BETWEEN '0' AND '9' AND VALPARAMTX <> '' AND code_original = substr(CODEPARAM,9) AND (texte IS DISTINCT FROM VALPARAMTX OR texte_court IS DISTINCT FROM VALPARAMTX); -- Catégories INSERT INTO eco.t_categories_articles(code_original, code, texte, texte_court ) SELECT GRCLEUNIK, MAX(CODEGR), MAX(LIBELGR), MAX(LIBELGR) FROM prod_PHARMA.GRPDT LEFT JOIN eco.t_categories_articles ON (code_original = GRCLEUNIK) WHERE GRCLEUNIK NOT IN (-1, 1) AND code_original IS NULL GROUP BY 1; UPDATE eco.t_categories_articles SET texte = LIBELGR, texte_court = LIBELGR FROM prod_PHARMA.GRPDT WHERE code_original = GRCLEUNIK AND (texte IS DISTINCT FROM LIBELGR OR texte_court IS DISTINCT FROM LIBELGR); -- Lieux SELECT base.cti_execute(' INSERT INTO eco.t_lieux(code_original, code, texte, texte_court) SELECT IDMAGASIN, CODEMAGASIN, MAX(LIBELLEMAGASIN), MAX(LIBELLEMAGASIN) FROM prod_pharma.MAGASIN LEFT JOIN eco.t_lieux ON (code_original = IDMAGASIN) WHERE code_original IS NULL GROUP BY 1,2 ORDER BY 1,2 ., UPDATE eco.t_lieux SET texte = LIBELLEMAGASIN, texte_court = LIBELLEMAGASIN FROM prod_pharma.MAGASIN WHERE code_original = IDMAGASIN AND (texte IS DISTINCT FROM LIBELLEMAGASIN OR texte_court IS DISTINCT FROM LIBELLEMAGASIN) ., ',1) WHERE (SELECT count(*) FROM eco.t_divers WHERE code = 'PHARMA_MAG_LIEU' AND valeur = '1') > 0; SELECT base.cti_execute(' INSERT INTO eco.t_lieux(code_original, code, texte, texte_court) SELECT LIEUSTOCK, LIEUSTOCK, MAX(LIBELLE), MAX(LIBELLE) FROM prod_pharma.LIEUSTK LEFT JOIN eco.t_lieux ON (code_original = LIEUSTOCK) WHERE LIEUSTOCK <> ''-1'' AND code_original IS NULL GROUP BY 1 ORDER BY 1 ., UPDATE eco.t_lieux SET texte = LIBELLE, texte_court = LIBELLE FROM prod_pharma.LIEUSTK WHERE code_original = LIEUSTOCK AND (texte IS DISTINCT FROM LIBELLE OR texte_court IS DISTINCT FROM LIBELLE)',1) WHERE (SELECT count(*) FROM eco.t_divers WHERE code = 'PHARMA_MAG_LIEU' AND valeur = '1') = 0; -- Sites SELECT base.cti_execute(' INSERT INTO eco.t_sites(code_original, code, texte, texte_court) SELECT IDMAGASIN, CODEMAGASIN, MAX(LIBELLEMAGASIN), MAX(LIBELLEMAGASIN) FROM prod_pharma.MAGASIN LEFT JOIN eco.t_sites ON (code_original = IDMAGASIN) WHERE code_original IS NULL GROUP BY 1,2 ORDER BY 1,2., UPDATE eco.t_sites SET texte = LIBELLEMAGASIN, texte_court = LIBELLEMAGASIN FROM prod_pharma.MAGASIN WHERE code_original = IDMAGASIN AND (texte IS DISTINCT FROM LIBELLEMAGASIN OR texte_court IS DISTINCT FROM LIBELLEMAGASIN) ., ',1) WHERE (SELECT count(*) FROM eco.t_divers WHERE code = 'PHARMA_MAG_LIEU' AND valeur = '1') = 0 ; -- Articles INSERT INTO eco.t_divers (code, texte, valeur, description) SELECT 'PHARMA_CODE_ARTICLE', 'Sélection du code à remonter en tant que code article', '0', '0=Réference ou clé unique si référence vide 1=Clé unique' WHERE 'PHARMA_CODE_ARTICLE' NOT IN (SELECT code FROM eco.t_divers) ; DROP TABLE IF EXISTS w_PRODUIT; CREATE TEMP TABLE w_PRODUIT AS SELECT PRCLEUNIK AS code_original, CASE WHEN COALESCE(valeur,'0') = '0' THEN COALESCE(REFERENCE,to_char(PRCLEUNIK,'FM000000')) ELSE to_char(PRCLEUNIK,'FM000000') END AS code, CASE WHEN LIBCALCPR <> '' THEN substr(LIBCALCPR, 1, 255) ELSE substr(PRNOM, 1, 255) END AS texte, CASE WHEN LIBCALCPR <> '' THEN substr(LIBCALCPR, 1, 255) ELSE substr(PRNOM, 1, 255) END AS texte1, substr(CASE WHEN NOMABREGE <> '' THEN NOMABREGE ELSE PRNOM END,1,50) AS texte_court, PRODUIT.* FROM prod_pharma.PRODUIT LEFT JOIN eco.t_divers ON t_divers.code = 'PHARMA_CODE_ARTICLE' WHERE PRCLEUNIK IN (select PRCLEUNIK from w_LIGNE_source LIGNE); INSERT INTO w_PRODUIT SELECT PRCLEUNIK AS code_original, CASE WHEN COALESCE(valeur,'0') = '0' THEN COALESCE(REFERENCE,to_char(PRCLEUNIK,'FM000000')) ELSE to_char(PRCLEUNIK,'FM000000') END AS code, CASE WHEN LIBCALCPR <> '' THEN substr(LIBCALCPR, 1, 255) ELSE substr(PRNOM, 1, 255) END AS texte, CASE WHEN LIBCALCPR <> '' THEN substr(LIBCALCPR, 1, 255) ELSE substr(PRNOM, 1, 255) END AS texte1, substr(CASE WHEN NOMABREGE <> '' THEN NOMABREGE ELSE CASE WHEN LIBCALCPR <> '' THEN LIBCALCPR ELSE PRNOM END END,1,50) AS texte_court, PRODUIT.* FROM prod_pharma.PRODUIT LEFT JOIN eco.t_divers ON t_divers.code = 'PHARMA_CODE_ARTICLE' WHERE PRCLEUNIK IN (select PRCLEUNIK from w_MVTPDT) AND PRCLEUNIK NOT IN (SELECT code_original FROM w_PRODUIT); INSERT INTO eco.t_articles(code_original, code, texte, texte_court ) SELECT w_PRODUIT.code_original, w_PRODUIT.code, w_PRODUIT.texte, w_PRODUIT.texte_court FROM w_PRODUIT LEFT JOIN eco.t_articles ON (w_PRODUIT.code_original = t_articles.code_original) WHERE t_articles.code_original IS NULL; UPDATE eco.t_articles SET code = w_PRODUIT.code, texte = w_PRODUIT.texte, texte_court = w_PRODUIT.texte_court, taux_tva_en_cours = round(COALESCE(VALPARAMRE,0)::numeric,1) FROM w_PRODUIT LEFT JOIN prod_pharma.PARAMETR ON CODEPARAM = 'RTVA'||TVA WHERE w_PRODUIT.code_original = t_articles.code_original AND ( t_articles.code IS DISTINCT FROM w_PRODUIT.code OR t_articles.texte IS DISTINCT FROM w_PRODUIT.texte OR t_articles.texte_court IS DISTINCT FROM w_PRODUIT.texte_court OR taux_tva_en_cours IS DISTINCT FROM round(COALESCE(VALPARAMRE,0)::numeric,1) ) ; UPDATE eco.t_articles SET gere_en_stock = CASE WHEN MODEGEST IN (1,4) THEN '1' ELSE '0' END FROM prod_pharma.PRODUIT WHERE t_articles.code_original = PRODUIT.PRCLEUNIK AND (gere_en_stock != CASE WHEN MODEGEST IN (1,4) THEN '1' ELSE '0' END) ; UPDATE eco.t_articles SET gere_en_stock = '' WHERE gere_en_stock IS NULL; UPDATE eco.t_articles SET type_id = COALESCE(t_types_articles.oid,0), famille_id = 0, sous_famille_id = 0, categorie_id = COALESCE(t_categories_articles.oid,0), sous_categorie_id = 0, unite_stockage_id = COALESCE(t_unites_stockage.oid,0), unite_distribution_id = COALESCE(t_unites_distribution.oid,0) FROM prod_pharma.PRODUIT LEFT JOIN (SELECT PRCLEUNIK, (MAX(ARRAY[MGPPRINC,GRCLEUNIK]))[2] AS GRCLEUNIK FROM prod_pharma.MULTIGRP WHERE GRCLEUNIK > 1 GROUP BY 1) MULTIGRP ON PRODUIT.PRCLEUNIK = MULTIGRP.PRCLEUNIK LEFT JOIN eco.t_types_articles ON TYPEPDT = t_types_articles.code_original LEFT JOIN eco.t_categories_articles ON MULTIGRP.GRCLEUNIK = t_categories_articles.code_original LEFT JOIN eco.t_unites t_unites_stockage ON UDCLEUNIK = t_unites_stockage.code_original LEFT JOIN eco.t_unites t_unites_distribution ON UDCLEUNIK = t_unites_distribution.code_original WHERE t_articles.code_original = PRODUIT.PRCLEUNIK AND ( t_articles.type_id IS DISTINCT FROM COALESCE(t_types_articles.oid,0) OR t_articles.categorie_id IS DISTINCT FROM COALESCE(t_categories_articles.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) ); UPDATE eco.t_articles SET classification_atc_id = (SELECT oid FROM eco.t_classification_atc WHERE code = 'Z99XX99') FROM prod_pharma.PRODUIT LEFT JOIN eco.t_classification_atc ON CLASSETH = t_classification_atc.code_original WHERE t_articles.code_original = PRCLEUNIK AND t_classification_atc.oid IS NULL AND classification_atc_id IS DISTINCT FROM (SELECT oid FROM eco.t_classification_atc WHERE code = 'Z99XX99'); UPDATE eco.t_articles SET classification_atc_id = COALESCE(t_classification_atc.oid,0) FROM prod_pharma.PRODUIT JOIN eco.t_classification_atc ON CLASSETH = t_classification_atc.code_original AND length(CLASSETH) >= 7 WHERE t_articles.code_original = PRCLEUNIK AND ( classification_atc_id IS DISTINCT FROM COALESCE(t_classification_atc.oid,0) ); UPDATE eco.t_articles SET classification_atc_id = COALESCE(t_classification_atc.oid,0) FROM prod_pharma.PRODUIT JOIN eco.t_classification_atc ON CLASSETH || '99' = t_classification_atc.code_original AND length(CLASSETH) = 5 WHERE substr(CLASSETH,2,1) BETWEEN '0' AND '9' AND t_articles.code_original = PRCLEUNIK AND ( classification_atc_id IS DISTINCT FROM COALESCE(t_classification_atc.oid,0) ); UPDATE eco.t_articles SET classification_atc_id = COALESCE(t_classification_atc.oid,0) FROM prod_pharma.PRODUIT JOIN eco.t_classification_atc ON CLASSETH || '99' = t_classification_atc.code_original AND length(CLASSETH) = 6 WHERE substr(CLASSETH,2,1) NOT BETWEEN '0' AND '9' AND t_articles.code_original = PRCLEUNIK AND ( classification_atc_id IS DISTINCT FROM COALESCE(t_classification_atc.oid,0) ); UPDATE eco.t_articles SET classification_atc_id = COALESCE(t_classification_atc.oid,0) FROM prod_pharma.PRODUIT JOIN eco.t_classification_atc ON CLASSETH || 'X99' = t_classification_atc.code_original AND length(CLASSETH) = 4 WHERE substr(CLASSETH,2,1) BETWEEN '0' AND '9' AND t_articles.code_original = PRCLEUNIK AND ( classification_atc_id IS DISTINCT FROM COALESCE(t_classification_atc.oid,0) ); UPDATE eco.t_articles SET classification_atc_id = COALESCE(t_classification_atc.oid,0) FROM prod_pharma.PRODUIT JOIN eco.t_classification_atc ON CLASSETH || 'X99' = t_classification_atc.code_original AND length(CLASSETH) = 5 WHERE substr(CLASSETH,2,1) NOT BETWEEN '0' AND '9' AND t_articles.code_original = PRCLEUNIK AND ( classification_atc_id IS DISTINCT FROM COALESCE(t_classification_atc.oid,0) ); UPDATE eco.t_articles SET classification_atc_id = COALESCE(t_classification_atc.oid,0) FROM prod_pharma.PRODUIT JOIN eco.t_classification_atc ON CLASSETH || 'XX99' = t_classification_atc.code_original AND length(CLASSETH) = 3 WHERE substr(CLASSETH,2,1) BETWEEN '0' AND '9' AND t_articles.code_original = PRCLEUNIK AND ( classification_atc_id IS DISTINCT FROM COALESCE(t_classification_atc.oid,0) ); UPDATE eco.t_articles SET classification_atc_id = COALESCE(t_classification_atc.oid,0) FROM prod_pharma.PRODUIT JOIN eco.t_classification_atc ON CLASSETH || 'XX99' = t_classification_atc.code_original AND length(CLASSETH) = 4 WHERE substr(CLASSETH,2,1) NOT BETWEEN '0' AND '9' AND t_articles.code_original = PRCLEUNIK AND ( classification_atc_id IS DISTINCT FROM COALESCE(t_classification_atc.oid,0) ); UPDATE eco.t_articles SET classification_atc_id = COALESCE(t_classification_atc.oid,0) FROM prod_pharma.PRODUIT JOIN eco.t_classification_atc ON CLASSETH || '99XX99' = t_classification_atc.code_original AND length(CLASSETH) = 1 WHERE substr(CLASSETH,2,1) BETWEEN '0' AND '9' AND t_articles.code_original = PRCLEUNIK AND ( classification_atc_id IS DISTINCT FROM COALESCE(t_classification_atc.oid,0) ); UPDATE eco.t_articles SET classification_atc_id = COALESCE(t_classification_atc.oid,0) FROM prod_pharma.PRODUIT JOIN eco.t_classification_atc ON CLASSETH || '99XX99' = t_classification_atc.code_original AND length(CLASSETH) = 2 WHERE substr(CLASSETH,2,1) NOT BETWEEN '0' AND '9' AND t_articles.code_original = PRCLEUNIK AND ( classification_atc_id IS DISTINCT FROM COALESCE(t_classification_atc.oid,0) ); UPDATE eco.t_articles SET classification_atc_id = (SELECT oid FROM eco.t_classification_atc WHERE code = 'Z99XX99') FROM prod_pharma.PRODUIT LEFT JOIN eco.t_classification_atc ON CLASSETH = t_classification_atc.code_original WHERE t_articles.code_original = PRCLEUNIK AND t_classification_atc.oid IS NULL AND classification_atc_id IS DISTINCT FROM (SELECT oid FROM eco.t_classification_atc WHERE code = 'Z99XX99'); UPDATE eco.t_articles SET classification_atc_id = 0 WHERE classification_atc_id IS NULL; UPDATE eco.t_articles SET compte_id = COALESCE(t_compte.oid,0) FROM prod_pharma.PRODUIT LEFT JOIN eco.t_compte ON COMPTE = t_compte.code_original WHERE t_articles.code_original = PRCLEUNIK AND ( compte_id IS DISTINCT FROM COALESCE(t_compte.oid,0) ); UPDATE eco.t_articles SET compte_id = 0 WHERE compte_id IS NULL; 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 ); -- Listes INSERT INTO eco.t_listes( code, texte, table_id, is_cti, show_omit, utilisateur_createur, est_partagee_modification, chapitre) SELECT subview.code, subview.texte, t_listes_tables.oid, '0', '0', 'administrateur', '0', '' FROM eco.t_listes_tables JOIN ( SELECT 'CTI_ART_GEST_1'::text AS code, 'Produits stockés'::text AS texte UNION SELECT 'CTI_ART_GEST_2'::text AS code, 'Produits non stockés'::text AS texte UNION SELECT 'CTI_ART_GEST_3'::text AS code, 'Produits en Dépot/Vente'::text AS texte UNION SELECT 'CTI_ART_GEST_4'::text AS code, 'Produits inactifs'::text AS texte UNION SELECT 'CTI_ART_LIVR_1'::text AS code, 'Sur livret'::text AS texte UNION SELECT 'CTI_ART_LIVR_2'::text AS code, 'Hors livret'::text AS texte UNION SELECT 'CTI_ART_LIVR_3'::text AS code, 'Attente livret'::text AS texte UNION SELECT 'CTI_ART_LIST_2'::text AS code, 'Liste I'::text AS texte UNION SELECT 'CTI_ART_LIST_3'::text AS code, 'Liste II'::text AS texte UNION SELECT 'CTI_ART_LIST_4'::text AS code, 'Stupéfiant'::text AS texte ) subview ON t_listes_tables.code = 'ART' WHERE subview.code NOT IN (SELECT code FROM eco.t_listes); DELETE FROM eco.t_listes_contenu USING eco.t_listes WHERE t_listes_contenu.liste_id = t_listes.oid AND t_listes.code LIKE 'CTI_ART_GEST%'; INSERT INTO eco.t_listes_contenu (liste_id, to_id) SELECT t_listes.oid, t_articles.oid FROM eco.t_articles JOIN prod_pharma.PRODUIT ON code_original = PRCLEUNIK JOIN eco.t_listes ON t_listes.code = 'CTI_ART_GEST_' || MODEGEST LEFT JOIN eco.t_listes_contenu ON t_listes.oid = liste_id AND t_articles.oid = to_id WHERE liste_id IS NULL; DELETE FROM eco.t_listes_contenu USING eco.t_listes WHERE t_listes_contenu.liste_id = t_listes.oid AND t_listes.code LIKE 'CTI_ART_LIVR%'; INSERT INTO eco.t_listes_contenu (liste_id, to_id) SELECT t_listes.oid, t_articles.oid FROM eco.t_articles JOIN prod_pharma.PRODUIT ON code_original = PRCLEUNIK JOIN eco.t_listes ON t_listes.code = 'CTI_ART_LIVR_' || LIVRETPDT; DELETE FROM eco.t_listes_contenu USING eco.t_listes WHERE t_listes_contenu.liste_id = t_listes.oid AND t_listes.code LIKE 'CTI_ART_LIST%'; INSERT INTO eco.t_listes_contenu (liste_id, to_id) SELECT t_listes.oid, t_articles.oid FROM eco.t_articles JOIN prod_pharma.PRODUIT ON code_original = PRCLEUNIK JOIN eco.t_listes ON t_listes.code = 'CTI_ART_LIST_' || LISTEPR; ]]> '' AND CPOSTFOUR <> '0' GROUP BY 1 ; INSERT INTO eco.t_fournisseurs(code, texte, texte_court, code_original) SELECT w_FOURNIS.code, w_FOURNIS.FOURNIS, w_FOURNIS.FOURNIS, w_FOURNIS.code_original FROM w_FOURNIS LEFT JOIN eco.t_fournisseurs ON (w_FOURNIS.code_original = t_fournisseurs.code_original) WHERE t_fournisseurs.code_original IS NULL; UPDATE eco.t_fournisseurs SET code = w_FOURNIS.code, texte = w_FOURNIS.FOURNIS, texte_court = w_FOURNIS.FOURNIS, adresse = trim(ADRFOUR1 || ' ' || ADRFOUR2), code_postal_id = COALESCE(t_codes_postaux.oid,0), ville = VILLEFOUR, telephone = TELFOUR, fax = FAXFOUR, email = MAILCONTACTFO, siret = W_FOURNIS.SIRET FROM w_FOURNIS LEFT JOIN base.t_codes_postaux ON CPOSTFOUR = t_codes_postaux.code WHERE w_FOURNIS.code_original = t_fournisseurs.code_original AND ( t_fournisseurs.code IS DISTINCT FROM w_FOURNIS.code OR t_fournisseurs.texte IS DISTINCT FROM w_FOURNIS.FOURNIS OR t_fournisseurs.texte_court IS DISTINCT FROM w_FOURNIS.FOURNIS OR adresse IS DISTINCT FROM trim(ADRFOUR1 || ' ' || ADRFOUR2) OR code_postal_id IS DISTINCT FROM COALESCE(t_codes_postaux.oid,0) OR ville IS DISTINCT FROM VILLEFOUR OR telephone IS DISTINCT FROM TELFOUR OR fax IS DISTINCT FROM FAXFOUR OR email IS DISTINCT FROM MAILCONTACTFO OR t_fournisseurs.siret IS DISTINCT FROM W_FOURNIS.SIRET ) ; 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 ); -- Articles fournisseurs DROP TABLE IF EXISTS w_article_fournisseur; CREATE TEMP TABLE w_article_fournisseur AS SELECT F2CLEUNIK::text AS code_original, FOURPRO.F0CLEUNIK, FOURPRO.PRCLEUNIK, COALESCE(t_articles.oid,0) AS article_id, COALESCE(t_fournisseurs.oid,0) AS fournisseur_id, CASE WHEN FOURPRO.F0CLEUNIK = PRODUIT.PRCLEUNIK THEN '1' ELSE '0' END AS est_fournisseur_principal, COALESCE(t_fournisseurs.oid,0) AS fournisseur_distributeur_id, CASE WHEN LIBCALCPR <> '' THEN LIBCALCPR ELSE PRNOM END AS texte_reference_fournisseur, ''::text AS code_cahpp, CASE WHEN FOURPRO.REFFOURPR LIKE '34009%' AND length(FOURPRO.REFFOURPR) = 13 THEN FOURPRO.REFFOURPR WHEN PRODUIT.REFFOURPR LIKE '34009%' AND length(PRODUIT.REFFOURPR) = 13 THEN PRODUIT.REFFOURPR ELSE '' END AS code_cip, FOURPRO.REFFOURPR AS code_reference_fournisseur, PRODUIT.UCD13 AS code_ucd13, PRODUIT.UCD7 AS code_ucd, 0::bigint AS ucd_id, SUBVIEW.CODELPP AS code_lpp, 0::bigint AS lpp_id, 0::bigint AS unite_approvisionnement_id, FOURPRO.CDTACHAT AS nombre_conditionnement_approvisionnement, CASE WHEN base.cti_to_number(FOURPRO.PRIXMARCHE) <> 0 THEN base.cti_to_number(FOURPRO.PRIXMARCHE) ELSE FOURPRO.PRIXTARIF END AS prix_unitaire_en_cours FROM prod_pharma.FOURPRO JOIN ( SELECT PRCLEUNIK, F0CLEUNIK, (MAX(ARRAY[FINMARPR::text, F2CLEUNIK::text]))[2]::bigint AS F2CLEUNIK_keep FROM prod_pharma.FOURPRO GROUP BY 1,2 ) subview_FOURPRO ON FOURPRO.PRCLEUNIK = subview_FOURPRO.PRCLEUNIK AND FOURPRO.F0CLEUNIK = subview_FOURPRO.F0CLEUNIK AND FOURPRO.F2CLEUNIK = subview_FOURPRO.F2CLEUNIK_keep JOIN prod_pharma.PRODUIT ON FOURPRO.PRCLEUNIK = PRODUIT.PRCLEUNIK JOIN eco.t_articles ON FOURPRO.PRCLEUNIK = t_articles.code_original JOIN eco.t_fournisseurs ON FOURPRO.F0CLEUNIK = t_fournisseurs.code_original LEFT JOIN ( SELECT PRCLEUNIK, (MAX(ARRAY[PRINC::text,CODELPP]))[2]::text AS CODELPP FROM prod_pharma.PRODUITLPP GROUP BY 1 ) subview ON FOURPRO.PRCLEUNIK = subview.PRCLEUNIK ; ANALYSE w_article_fournisseur ; UPDATE w_article_fournisseur SET lpp_id = t_lpp.oid FROM base.t_lpp WHERE code_lpp <> '' AND code_lpp = t_lpp.code ; UPDATE w_article_fournisseur SET code_ucd13 = subview.code_ucd, code_ucd = substr(subview.code_ucd,6,7) FROM ( SELECT PRCLEUNIK, F0CLEUNIK, (MAX(ARRAY[DATEMVT::text,CODE_UCD::text]))[2] AS code_ucd FROM w_MVTPDT WHERE length(CODE_UCD::text) = 13 AND CODE_UCD LIKE '34008%' GROUP BY 1,2 ) subview WHERE w_article_fournisseur.PRCLEUNIK = subview.PRCLEUNIK AND w_article_fournisseur.F0CLEUNIK = subview.F0CLEUNIK AND w_article_fournisseur.code_ucd13 = '' ; UPDATE w_article_fournisseur SET code_ucd13 = subview.code_ucd, code_ucd = substr(subview.code_ucd,6,7) FROM ( SELECT PRCLEUNIK, (MAX(ARRAY[DATEMVT::text,CODE_UCD::text]))[2] AS code_ucd FROM w_MVTPDT WHERE length(CODE_UCD::text) = 13 AND CODE_UCD LIKE '34008%' GROUP BY 1 ) subview WHERE w_article_fournisseur.PRCLEUNIK = subview.PRCLEUNIK AND w_article_fournisseur.code_ucd13 = '' ; UPDATE w_article_fournisseur SET code_ucd = subview.code_ucd FROM ( SELECT PRCLEUNIK, F0CLEUNIK, (MAX(ARRAY[DATEMVT::text,CODE_UCD::text]))[2] AS code_ucd FROM w_MVTPDT WHERE length(CODE_UCD::text) = 7 AND CODE_UCD::text LIKE '9%' GROUP BY 1,2 ) subview WHERE w_article_fournisseur.PRCLEUNIK = subview.PRCLEUNIK AND w_article_fournisseur.F0CLEUNIK = subview.F0CLEUNIK AND w_article_fournisseur.code_ucd = '' ; UPDATE w_article_fournisseur SET code_ucd = subview.code_ucd FROM ( SELECT PRCLEUNIK,(MAX(ARRAY[DATEMVT::text,CODE_UCD::text]))[2] AS code_ucd FROM w_MVTPDT WHERE length(CODE_UCD::text) = 7 AND CODE_UCD::text LIKE '9%' GROUP BY 1 ) subview WHERE w_article_fournisseur.PRCLEUNIK = subview.PRCLEUNIK AND w_article_fournisseur.code_ucd = '' ; UPDATE w_article_fournisseur SET ucd_id = t_ucd.oid FROM base.t_ucd WHERE code_ucd <> '' AND code_ucd = t_ucd.code ; DELETE FROM eco.t_article_fournisseur WHERE code_original NOT IN (SELECT w_article_fournisseur.code_original FROM w_article_fournisseur) ; INSERT INTO eco.t_article_fournisseur ( code_original, article_id, fournisseur_id, est_fournisseur_principal, fournisseur_distributeur_id, texte_reference_fournisseur, code_cahpp, code_cip, code_reference_fournisseur, code_ucd13, ucd_id, lpp_id, unite_approvisionnement_id, nombre_conditionnement_approvisionnement, prix_unitaire_en_cours ) SELECT code_original, article_id, fournisseur_id, est_fournisseur_principal, fournisseur_distributeur_id, texte_reference_fournisseur, code_cahpp, code_cip, code_reference_fournisseur, code_ucd13, ucd_id, lpp_id, unite_approvisionnement_id, nombre_conditionnement_approvisionnement, prix_unitaire_en_cours FROM w_article_fournisseur WHERE code_original NOT IN (SELECT t_article_fournisseur.code_original FROM eco.t_article_fournisseur) ; UPDATE eco.t_article_fournisseur SET article_id = w_article_fournisseur.article_id, fournisseur_id = w_article_fournisseur.fournisseur_id, est_fournisseur_principal = w_article_fournisseur.est_fournisseur_principal, fournisseur_distributeur_id = w_article_fournisseur.fournisseur_distributeur_id, texte_reference_fournisseur = w_article_fournisseur.texte_reference_fournisseur, code_cahpp = w_article_fournisseur.code_cahpp, code_cip = w_article_fournisseur.code_cip, code_reference_fournisseur = w_article_fournisseur.code_reference_fournisseur, code_ucd13 = w_article_fournisseur.code_ucd13, ucd_id = w_article_fournisseur.ucd_id, lpp_id = w_article_fournisseur.lpp_id, unite_approvisionnement_id = w_article_fournisseur.unite_approvisionnement_id, nombre_conditionnement_approvisionnement = w_article_fournisseur.nombre_conditionnement_approvisionnement, prix_unitaire_en_cours = w_article_fournisseur.prix_unitaire_en_cours FROM w_article_fournisseur WHERE t_article_fournisseur.code_original = w_article_fournisseur.code_original AND ( t_article_fournisseur.article_id IS DISTINCT FROM w_article_fournisseur.article_id OR t_article_fournisseur.fournisseur_id IS DISTINCT FROM w_article_fournisseur.fournisseur_id OR t_article_fournisseur.est_fournisseur_principal IS DISTINCT FROM w_article_fournisseur.est_fournisseur_principal OR t_article_fournisseur.fournisseur_distributeur_id IS DISTINCT FROM w_article_fournisseur.fournisseur_distributeur_id OR t_article_fournisseur.texte_reference_fournisseur IS DISTINCT FROM w_article_fournisseur.texte_reference_fournisseur OR t_article_fournisseur.code_cahpp IS DISTINCT FROM w_article_fournisseur.code_cahpp OR t_article_fournisseur.code_cip IS DISTINCT FROM w_article_fournisseur.code_cip OR t_article_fournisseur.code_reference_fournisseur IS DISTINCT FROM w_article_fournisseur.code_reference_fournisseur OR t_article_fournisseur.code_ucd13 IS DISTINCT FROM w_article_fournisseur.code_ucd13 OR t_article_fournisseur.ucd_id IS DISTINCT FROM w_article_fournisseur.ucd_id OR t_article_fournisseur.lpp_id IS DISTINCT FROM w_article_fournisseur.lpp_id OR t_article_fournisseur.unite_approvisionnement_id IS DISTINCT FROM w_article_fournisseur.unite_approvisionnement_id OR t_article_fournisseur.nombre_conditionnement_approvisionnement IS DISTINCT FROM w_article_fournisseur.nombre_conditionnement_approvisionnement OR t_article_fournisseur.prix_unitaire_en_cours IS DISTINCT FROM w_article_fournisseur.prix_unitaire_en_cours ) ; ]]> '' AND SERVICE <> '-1'; INSERT INTO eco.t_unites_fonctionnelles(code, texte, texte_court, code_original) SELECT SERVICE, SERVICE, SERVICE, SERVICE FROM w_MVTPDT LEFT JOIN eco.t_unites_fonctionnelles ON t_unites_fonctionnelles.code_original = w_MVTPDT.SERVICE WHERE t_unites_fonctionnelles.code_original IS NULL AND SERVICE <> '' AND SERVICE <> '-1' GROUP BY 1 ; UPDATE eco.t_unites_fonctionnelles SET texte = NOMSERVICE, texte_court = substr(NOMSERVICE,1,50) FROM prod_pharma.SERVICE WHERE code_original = SERVICE AND (texte IS DISTINCT FROM NOMSERVICE OR texte_court IS DISTINCT FROM substr(NOMSERVICE,1,50)); -- Types mouvements INSERT INTO eco.t_types_mouvements(code_original, code, texte, texte_court ) SELECT to_char(TYPEMVT,'FM00') || '|' || TYPESORTIE, to_char(TYPEMVT,'FM00') || CASE WHEN TYPESORTIE <> '' THEN '_' || TYPESORTIE ELSE '' END, to_char(TYPEMVT,'FM00') || CASE WHEN TYPESORTIE <> '' THEN '_' || TYPESORTIE ELSE '' END, to_char(TYPEMVT,'FM00') || CASE WHEN TYPESORTIE <> '' THEN '_' || TYPESORTIE ELSE '' END FROM (SELECT TYPEMVT, TYPESORTIE FROM w_MVTPDT WHERE DATEMVT BETWEEN '[ENV_ECO_ANNEEDEBUT]0101' AND now() GROUP BY 1,2) subview LEFT JOIN eco.t_types_mouvements ON code_original = to_char(TYPEMVT,'FM00') || '|' || TYPESORTIE WHERE code_original IS NULL GROUP BY 1,2 ORDER BY 1; -- Profils INSERT INTO eco.t_profils_comptables ( oid, code_original, centre_responsabilite_id, unite_fonctionnelle_id) SELECT 0 AS oid, '0' AS code_original, 0 AS centre_responsabilite_id, 0 AS unite_fonctionnelle_id WHERE 0 NOT IN (SELECT oid FROM eco.t_profils_comptables); ]]> 0 THEN TOTFACTHT ELSE TOTCMDEHT END AS montant_commande_ht, 0 AS montant_commande_remise, CASE WHEN TOTFACTHT <> 0 THEN TOTALTVA ELSE TOTCMDETTC - TOTFACTHT END AS montant_commande_tva, PORTTTC AS montant_commande_port, CASE WHEN TOTFACTHT <> 0 THEN TOTFACTTTC ELSE 0 END AS montant_commande_total, CASE WHEN NOLIQUID IS NOT NULL THEN TOTFACTHT ELSE 0 END AS montant_liquidation_ht, 0 AS montant_liquidation_remise, CASE WHEN NOLIQUID IS NOT NULL THEN TOTALTVA ELSE 0 END AS montant_liquidation_tva, CASE WHEN NOLIQUID IS NOT NULL THEN PORTTTC ELSE 0 END AS montant_liquidation_port, CASE WHEN NOLIQUID IS NOT NULL THEN TOTFACTTTC ELSE 0 END AS montant_liquidation_total FROM w_COMMANDE LEFT JOIN eco.t_fournisseurs ON F0CLEUNIK = t_fournisseurs.code_original LEFT JOIN eco.t_gestionnaires ON '0' = t_gestionnaires.code_original LEFT JOIN eco.t_divers ON t_divers.code = 'PHARMA_MAG_LIEU' LEFT JOIN eco.t_lieux t_lieux_commande ON CASE WHEN t_divers.valeur = '1' THEN COALESCE(MAGASIN::text,'0') ELSE '0' END = t_lieux_commande.code_original LEFT JOIN eco.t_lieux t_lieux_facturation ON CASE WHEN t_divers.valeur = '1' THEN COALESCE(MAGASIN::text,'0') ELSE '0' END = t_lieux_facturation.code_original LEFT JOIN eco.t_lieux t_lieux_livraison ON CASE WHEN t_divers.valeur = '1' THEN COALESCE(MAGASIN::text,'0') ELSE '0' END = t_lieux_livraison.code_original LEFT JOIN eco.t_sites ON MAGASIN = t_sites.code LEFT JOIN eco.t_unites_fonctionnelles ON '0' = t_unites_fonctionnelles.code_original ; DROP TABLE IF EXISTS w_ligne; CREATE TEMP TABLE w_ligne AS SELECT C1CLEUNIK, L0CLEUNIK, PRCLEUNIK, NOLIGCMDE, TXTCMDEDET, QTELIV, QTECMDE, PRIXCMDE, FACTHT, VALEURHT, LGREMISEVALTTC, TOTALTVA, VALEURTVA, FACTTTC, VALEURTTC, TVA, NONLIQUIDE FROM w_LIGNE_source LIGNE GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 ; TRUNCATE eco.p_lignes_commandes; INSERT INTO eco.t_divers (code, texte, valeur, description) SELECT 'PHARMA_COM_LIGNE_NLIV', 'Remontée des lignes non livrées des commandes soldées', '0', '0=Ne pas les remonter 1=Les remonter' WHERE 'PHARMA_COM_LIGNE_NLIV' NOT IN (SELECT code FROM eco.t_divers); INSERT INTO eco.p_lignes_commandes( code_original, commande_id, ligne_commande, texte, article_id, fournisseur_distributeur_id, unite_approvisionnement_id, compte_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_prorata_tva, taux_tva) SELECT L0CLEUNIK AS code_original, p_commandes.oid AS commande_id, NOLIGCMDE AS ligne_commande, substr(TXTCMDEDET,1,255) AS texte, t_articles.oid AS article_id, p_commandes.fournisseur_distributeur_id, COALESCE(t_unites.oid,t_articles.unite_stockage_id) AS unite_approvisionnement_id, t_articles.compte_id AS compte_id, (CASE WHEN ETATCMDE IN ('4') AND COALESCE(t_divers.valeur,'0') = '0' THEN QTELIV ELSE QTECMDE END)::numeric AS quantite_approvisionnement, PRIXCMDE AS prix_unitaire_approvisionnement, 1 AS multiplicateur_stockage, QTECMDE::numeric AS quantite_stockage, PRIXCMDE::numeric AS prix_unitaire_stockage, CASE WHEN FACTHT <> 0 THEN FACTHT ELSE PRIXCMDE::numeric*QTECMDE::numeric END AS montant_commande_ht, CASE WHEN FACTHT <> 0 THEN 0 - LGREMISEVALTTC ELSE 0 END AS montant_commande_remise, CASE WHEN FACTHT <> 0 THEN w_LIGNE.TOTALTVA ELSE VALEURTVA END AS montant_commande_tva, 0 AS montant_commande_port, CASE WHEN FACTHT <> 0 THEN FACTTTC ELSE VALEURTTC END AS montant_commande_ttc, QTELIV::numeric AS quantite_livraison_approvisionnement, QTELIV::numeric AS quantite_livraison_stockage, CASE WHEN FACTHT <> 0 THEN FACTHT ELSE CASE WHEN QTELIV = 0 THEN 0 ELSE VALEURHT::numeric END END AS montant_livraison_ht, CASE WHEN FACTTTC <> 0 THEN FACTTTC ELSE CASE WHEN QTELIV = 0 THEN 0 ELSE VALEURTTC::numeric END END AS montant_livraison_ttc, CASE WHEN (ETATCMDE IN ('4') AND COALESCE(t_divers.valeur,'0') = '0') OR QTELIV = QTECMDE THEN 'T' WHEN QTELIV = QTECMDE THEN 'S' WHEN QTELIV = 0 THEN 'N' ELSE 'P' END AS etat_livraison, CASE WHEN NONLIQUIDE <> '1' THEN FACTHT ELSE 0 END AS montant_liquidation_ht, CASE WHEN NONLIQUIDE <> '1' THEN 0 ELSE 0 END AS montant_liquidation_remise, CASE WHEN NONLIQUIDE <> '1' THEN w_LIGNE.TOTALTVA ELSE 0 END AS montant_liquidation_tva, CASE WHEN NONLIQUIDE <> '1' THEN 0 ELSE 0 END AS montant_liquidation_port, CASE WHEN NONLIQUIDE <> '1' THEN FACTTTC ELSE 0 END AS montant_liquidation_ttc, CASE WHEN NONLIQUIDE <> '1' THEN 'T' ELSE 'N' END AS etat_liquidation, CASE WHEN t_articles.type_prorata_tva IS DISTINCT FROM '1' THEN COALESCE(t_prorata_tva.taux,0) ELSE 0 END, round(COALESCE(VALPARAMRE,0)::numeric,1) FROM w_LIGNE LEFT JOIN prod_pharma.PARAMETR ON CODEPARAM = 'RTVA'||w_LIGNE.TVA JOIN w_COMMANDE ON w_COMMANDE.C1CLEUNIK = w_LIGNE.C1CLEUNIK JOIN eco.p_commandes ON w_LIGNE.C1CLEUNIK = p_commandes.code_original JOIN eco.t_articles ON PRCLEUNIK = t_articles.code_original LEFT JOIN eco.t_unites ON '0' = t_unites.code_original LEFT JOIN eco.t_prorata_tva ON t_prorata_tva.oid = 0 LEFT JOIN eco.t_divers ON t_divers.code = 'PHARMA_COM_LIGNE_NLIV' WHERE ETATCMDE <> '4' OR CASE WHEN COALESCE(t_divers.valeur,'0') = '0' THEN QTELIV <> 0 ELSE QTECMDE <> 0 END; ANALYSE eco.p_lignes_commandes; UPDATE eco.p_lignes_commandes SET montant_commande_tva = sub.taux_tva * p_lignes_commandes.montant_commande_ht, montant_commande_ttc = (1 + sub.taux_tva) * p_lignes_commandes.montant_commande_ht FROM (SELECT article_id, p_commandes.date_reception, COALESCE(lead(p_commandes.date_reception) OVER (PARTITION BY article_id ORDER BY p_commandes.date_reception),'2099-12-31') as date_reception_next, COALESCE(lag(p_commandes.date_reception) OVER (PARTITION BY article_id ORDER BY p_commandes.date_reception),'1900-01-01') as date_reception_prev, p_lignes_commandes.montant_commande_ttc/p_lignes_commandes.montant_commande_ht -1 AS taux_tva FROM eco.p_commandes JOIN eco.p_lignes_commandes ON commande_id = p_commandes.oid WHERE p_lignes_commandes.montant_commande_ht != 0 AND p_lignes_commandes.montant_commande_ttc != 0 AND p_commandes.date_reception is not null ) sub, eco.p_commandes WHERE p_commandes.oid = commande_id AND p_lignes_commandes.montant_commande_ht != 0 AND p_lignes_commandes.montant_commande_ttc = 0 AND p_lignes_commandes.article_id = sub.article_id AND (date_commande BETWEEN sub.date_reception AND date_reception_next OR (date_commande BETWEEN date_reception_prev AND sub.date_reception AND date_reception_prev = '1900-01-01')) ; ]]> 3 GROUP BY 1,2,3,4,5,6,7,8,9,10,11,13 ORDER BY 1,2; CREATE INDEX w_stocks_i1 ON w_stocks USING btree (article_id); UPDATE w_stocks SET entree_quantite_pump = 0, entree_montant_pump = 0 WHERE entree_quantite_pump < 0 OR entree_montant_pump < 0; /* DELETE FROM w_stocks WHERE article_id IN ( SELECT article_id FROM w_stocks WHERE MODEGEST = '4' GROUP BY 1 HAVING MAX(date_debut) <= '[ENV_ECO_ANNEEDEBUT]1231' ); DELETE FROM w_stocks WHERE date_fin < '[ENV_ECO_ANNEEDEBUT]0101'; */ SELECT base.cti_execute( 'INSERT INTO w_stocks SELECT w_stocks.article_id, date(w_stocks.date_debut + interval ''2 month'' - interval ''1 day'') AS date_fin, date(w_stocks.date_debut + interval ''1 month'') AS date_debut, w_stocks.mois_sequence + 1 AS mois_sequence, w_stocks.MODEGEST, w_stocks.MAGASIN, w_stocks.ucd_id, w_stocks.lpp_id, w_stocks.compte_id, w_stocks.site_id, w_stocks.lieu_id, w_stocks.provider_id, w_stocks.fournisseur_id, 0.00 AS stock_quantite_debut, 0.00 AS stock_valeur_debut, 0.00 AS stock_valeur_debut_ttc, 0.00 AS entree_quantite, 0.00 AS entree_montant, 0.00 AS entree_montant_ttc, 0.00 AS entree_quantite_pump, 0.00 AS entree_montant_pump, 0.00 AS entree_montant_pump_ttc, 0.00 AS pump, 0.00 AS pump_ttc, 0.00 AS sortie_quantite, 0.00 AS sortie_montant, 0.00 AS sortie_montant_ttc, 0.00 AS stock_quantite_fin, 0.00 AS stock_valeur_fin, 0.00 AS stock_valeur_fin_ttc FROM w_stocks LEFT JOIN w_stocks w_stocks_after ON w_stocks_after.article_id = w_stocks.article_id AND w_stocks_after.mois_sequence = w_stocks.mois_sequence + 1 WHERE w_stocks_after.article_id IS NULL AND w_stocks.date_debut < date(date_trunc(''month'',now())) ORDER BY 1,2',300); -- Stock produit pour tous les magasins DROP TABLE IF EXISTS w_correction; CREATE TEMP TABLE w_correction AS SELECT t_articles.oid AS article_id, ''::text AS MAGASIN, PRODUIT.PRCLEUNIK, MAX(STOCK::numeric) AS STOCK, SUM(COALESCE(CASE WHEN SENSMVT = 1 THEN QUANTITE::numeric ELSE -QUANTITE::numeric END,0)) AS quantite_mvt, MAX(STOCK::numeric) - SUM(COALESCE(CASE WHEN SENSMVT = 1 THEN QUANTITE::numeric ELSE -QUANTITE::numeric END,0)) AS correction_quantite_fin, 'P'::text AS source FROM prod_pharma.PRODUIT JOIN eco.t_articles ON PRODUIT.PRCLEUNIK = t_articles.code_original LEFT JOIN w_MVTPDT ON w_MVTPDT.PRCLEUNIK = PRODUIT.PRCLEUNIK WHERE STOCK IS NOT NULL GROUP BY 1,2,3 HAVING MAX(STOCK::numeric) <> SUM(COALESCE(CASE WHEN SENSMVT = 1 THEN QUANTITE::numeric ELSE -QUANTITE::numeric END,0)) ; -- Stock produit par magasin SELECT base.cti_execute(' INSERT INTO w_correction SELECT t_articles.oid AS article_id, STKPDT.MAGASIN, STKPDT.PRCLEUNIK, STKPDT.STOCK, quantite_mvt, STKPDT.STOCK - quantite_mvt AS correction_quantite_fin, ''S''::text AS source FROM prod_pharma.STKPDT JOIN (SELECT MAGASIN, PRCLEUNIK, SUM(COALESCE(QUANTITE::numeric * (CASE WHEN SENSMVT = 1 THEN 1 ELSE -1 END) ,0)) AS quantite_mvt FROM w_MVTPDT GROUP BY 1,2) w_MVTPDT ON w_MVTPDT.PRCLEUNIK = STKPDT.PRCLEUNIK AND w_MVTPDT.MAGASIN = STKPDT.MAGASIN JOIN eco.t_articles ON STKPDT.PRCLEUNIK = t_articles.code_original WHERE STKPDT.STOCK IS NOT NULL AND STKPDT.STOCK - quantite_mvt != 0',1) WHERE (SELECT count(*) FROM information_schema.columns WHERE table_name = 'stkpdt') > 0 ; -- Par magasin en priorité DELETE FROM w_correction WHERE source = 'P' AND (SELECT count(*) FROM w_correction WHERE source = 'S') > 0 ; DROP TABLE IF EXISTS w_stocks_fin; CREATE TEMP TABLE w_stocks_fin AS SELECT w_stocks.article_id, w_stocks.date_fin, w_stocks.MAGASIN, SUM(w_stocks_before.entree_quantite-w_stocks_before.sortie_quantite) AS stock_quantite_fin_base, COALESCE(correction_quantite_fin,0) AS correction_quantite, SUM(w_stocks_before.entree_quantite-w_stocks_before.sortie_quantite) + COALESCE(correction_quantite_fin,0) AS stock_quantite_fin, base.cti_division( SUM(w_stocks_before.entree_montant_pump)::numeric , SUM(w_stocks_before.entree_quantite_pump)::numeric ) AS pump, base.cti_division( SUM(w_stocks_before.entree_montant_pump_ttc)::numeric , SUM(w_stocks_before.entree_quantite_pump)::numeric ) AS pump_ttc, base.cti_division( SUM(CASE WHEN w_stocks.mois_sequence - w_stocks_before.mois_sequence < 6 THEN w_stocks_before.entree_montant_pump ELSE 0 END)::numeric , SUM(CASE WHEN w_stocks.mois_sequence - w_stocks_before.mois_sequence < 6 THEN w_stocks_before.entree_quantite_pump ELSE 0 END)::numeric ) AS pump6, base.cti_division( SUM(CASE WHEN w_stocks.mois_sequence - w_stocks_before.mois_sequence < 6 THEN w_stocks_before.entree_montant_pump_ttc ELSE 0 END)::numeric , SUM(CASE WHEN w_stocks.mois_sequence - w_stocks_before.mois_sequence < 6 THEN w_stocks_before.entree_quantite_pump ELSE 0 END)::numeric ) AS pump6_ttc, base.cti_division( SUM(CASE WHEN w_stocks.mois_sequence - w_stocks_before.mois_sequence < 12 THEN w_stocks_before.entree_montant_pump ELSE 0 END)::numeric , SUM(CASE WHEN w_stocks.mois_sequence - w_stocks_before.mois_sequence < 12 THEN w_stocks_before.entree_quantite_pump ELSE 0 END)::numeric ) AS pump12, base.cti_division( SUM(CASE WHEN w_stocks.mois_sequence - w_stocks_before.mois_sequence < 12 THEN w_stocks_before.entree_montant_pump_ttc ELSE 0 END)::numeric , SUM(CASE WHEN w_stocks.mois_sequence - w_stocks_before.mois_sequence < 12 THEN w_stocks_before.entree_quantite_pump ELSE 0 END)::numeric ) AS pump12_ttc FROM w_stocks JOIN w_stocks w_stocks_before ON w_stocks.MAGASIN = w_stocks_before.MAGASIN AND w_stocks.article_id = w_stocks_before.article_id AND w_stocks.date_fin >= w_stocks_before.date_fin LEFT JOIN w_correction ON w_correction.article_id = w_stocks.article_id AND ( w_correction.MAGASIN = w_stocks.MAGASIN OR w_correction.MAGASIN = '' ) GROUP BY 1,2,3,5; CREATE INDEX w_stocks_fin_i1 ON w_stocks_fin USING btree (article_id); UPDATE w_stocks SET pump = CASE WHEN pump6 <> 0 THEN pump6 WHEN pump12 <> 0 THEN pump12 ELSE w_stocks_fin.pump END, pump_ttc = CASE WHEN pump6_ttc <> 0 THEN pump6_ttc WHEN pump12_ttc <> 0 THEN pump12_ttc ELSE w_stocks_fin.pump_ttc END, stock_quantite_fin = w_stocks_fin.stock_quantite_fin, stock_valeur_fin = w_stocks_fin.stock_quantite_fin * CASE WHEN pump6 <> 0 THEN pump6 WHEN pump12 <> 0 THEN pump12 ELSE w_stocks_fin.pump END, stock_valeur_fin_ttc = w_stocks_fin.stock_quantite_fin * CASE WHEN pump6_ttc <> 0 THEN pump6_ttc WHEN pump12_ttc <> 0 THEN pump12 ELSE w_stocks_fin.pump_ttc END FROM w_stocks_fin WHERE w_stocks_fin.article_id = w_stocks.article_id AND w_stocks_fin.date_fin = w_stocks.date_fin; -- Autres règles de valorisation des stocks INSERT INTO eco.t_divers (code, texte, valeur, description) SELECT 'NO_CALC_PUMP', 'Valorisation des stocks', '0', '0:Selon les entrées, 1:Selon la dernière distribution, 2:???' WHERE 'NO_CALC_PUMP' NOT IN (SELECT code FROM eco.t_divers) ; UPDATE eco.t_divers SET texte = 'Valorisation des stocks', description = '0:Selon les entrées, 1:Selon la dernière distribution, 2:???' WHERE code = 'NO_CALC_PUMP' AND ( texte <> 'Valorisation des stocks' OR description <> '0:Selon les entrées, 1:Selon la moyenne des sorties, 2:???, 3:Selon la dernière sortie' ) ; -- Pharma n'historise pas le PUMP. -- On reconstitue donc l'historique selon les mouvements de distribution, cela permet d'avoir la même valorisation qua PHARMA DROP TABLE IF EXISTS w_MVTPDP_distri; CREATE TEMP TABLE w_MVTPDP_distri AS SELECT MAGASIN, PRCLEUNIK, date(DATE_TRUNC('month',DATEMVT)) AS DATEMVT_mois, date(DATE_TRUNC('month',DATEMVT) + interval '1 month' - interval '1 day') AS DATEMVT_mois_fin, rank() OVER (PARTITION BY MAGASIN, PRCLEUNIK ORDER BY date(DATE_TRUNC('month',DATEMVT)) ) AS DATEMVT_rank, MAX(t_articles.oid) AS article_id, (MAX(ARRAY[DATEMVT::text, base.cti_division(VALTTC::numeric,QUANTITE::numeric)::text]))[2]::numeric AS PUMP_distri_ttc, (MAX(ARRAY[DATEMVT::text, base.cti_division(VALHT::numeric,QUANTITE::numeric)::text]))[2]::numeric AS PUMP_distri_ht, SUM(QUANTITE) AS QUANTITE_distri FROM w_MVTPDT JOIN eco.t_articles ON PRCLEUNIK = t_articles.code_original JOIN eco.t_divers ON t_divers.code = 'NO_CALC_PUMP' AND t_divers.valeur = '1' WHERE SENSMVT = 2 AND QUANTITE > 0 AND VALTTC > 0 AND TYPESORTIE IN ('DG','DN','DS') GROUP BY 1,2,3,4 ORDER BY 1,2,3 ; ANALYSE w_MVTPDP_distri ; CREATE INDEX i_w_MVTPDP_distri_1 ON w_MVTPDP_distri USING btree (PRCLEUNIK) ; UPDATE w_MVTPDP_distri SET DATEMVT_mois_fin = date(w_MVTPDP_distri1.DATEMVT_mois - interval '1 day') FROm w_MVTPDP_distri w_MVTPDP_distri1 WHERE w_MVTPDP_distri.PRCLEUNIK = w_MVTPDP_distri1.PRCLEUNIK AND w_MVTPDP_distri.DATEMVT_rank = w_MVTPDP_distri1.DATEMVT_rank -1 AND w_MVTPDP_distri.DATEMVT_mois_fin <> date(w_MVTPDP_distri1.DATEMVT_mois - interval '1 day') ; UPDATE w_MVTPDP_distri SET DATEMVT_mois_fin = date(date_trunc('month',now()) + interval '1 month' - interval '1 day') FROM ( SELECT MAGASIN, PRCLEUNIK, MAX(DATEMVT_rank) AS DATEMVT_rank FROM w_MVTPDP_distri GROUP BY 1,2 HAVING MAX(DATEMVT_mois_fin) < date(now()) ) subview WHERE w_MVTPDP_distri.PRCLEUNIK = subview.PRCLEUNIK AND w_MVTPDP_distri.MAGASIN = subview.MAGASIN AND w_MVTPDP_distri.DATEMVT_rank = subview.DATEMVT_rank ; UPDATE w_stocks SET stock_valeur_debut = stock_quantite_debut * PUMP_distri_ht, stock_valeur_debut_ttc = stock_quantite_debut * PUMP_distri_ttc, stock_valeur_fin = stock_quantite_fin * PUMP_distri_ht, stock_valeur_fin_ttc = stock_quantite_fin * PUMP_distri_ttc, pump = PUMP_distri_ht, pump_ttc = PUMP_distri_ttc FROM w_MVTPDP_distri WHERE 1=1 AND w_stocks.article_id = w_MVTPDP_distri.article_id AND w_stocks.MAGASIN = w_MVTPDP_distri.MAGASIN AND w_stocks.date_debut BETWEEN w_MVTPDP_distri.DATEMVT_mois AND w_MVTPDP_distri.DATEMVT_mois_fin ; DELETE FROM w_stocks WHERE article_id IN ( SELECT article_id FROM w_stocks WHERE stock_quantite_fin <> 0 GROUP BY 1 HAVING MAX(date_debut) <= '[ENV_ECO_ANNEEDEBUT]1231' ); UPDATE w_stocks SET stock_quantite_debut = w_stocks_before.stock_quantite_fin, stock_valeur_debut = w_stocks_before.stock_valeur_fin, stock_valeur_debut_ttc = w_stocks_before.stock_valeur_fin_ttc FROM w_stocks w_stocks_before WHERE w_stocks_before.article_id = w_stocks.article_id AND w_stocks_before.MAGASIN = w_stocks.MAGASIN AND w_stocks_before.mois_sequence = w_stocks.mois_sequence - 1; 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'); TRUNCATE eco.p_stock; INSERT INTO eco.p_stock( article_id, date_fin, date_debut, ucd_id, lpp_id, compte_id, lieu_id, site_id, provider_id, fournisseur_id, stock_quantite_debut, stock_valeur_debut, stock_valeur_debut_ttc, entree_quantite, entree_montant, entree_montant_ttc, pump, pump_ttc, sortie_quantite, sortie_montant, sortie_montant_ttc, stock_quantite_fin, stock_valeur_fin, stock_valeur_fin_ttc) SELECT article_id, date_fin, date_debut, ucd_id, lpp_id, compte_id, lieu_id, site_id, provider_id, fournisseur_id, stock_quantite_debut, stock_valeur_debut, stock_valeur_debut_ttc, entree_quantite, entree_montant, entree_montant_ttc, pump, pump_ttc, sortie_quantite, sortie_montant, sortie_montant_ttc, stock_quantite_fin, stock_valeur_fin, stock_valeur_fin_ttc FROM w_stocks WHERE date_debut >= '[ENV_ECO_ANNEEDEBUT]0101'; 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'); ]]> 0 AND w_MVTPDT.C1CLEUNIK NOT IN (SELECT code_original FROM eco.p_commandes) AND TYPEMVT = 1 AND w_COMMANDE.C1CLEUNIK = w_MVTPDT.C1CLEUNIK',20); SELECT base.cti_execute(' UPDATE w_MVTPDT SET C1CLEUNIK = COMMANDE_REG.C1CLEUNIK FROM w_COMMANDE JOIN w_COMMANDE COMMANDE_REG ON COMMANDE_REG.NUMCMDE::text || COMMANDE_REG.SUFCMDE::text = w_COMMANDE.NUMCMDEREG WHERE w_MVTPDT.C1CLEUNIK > 0 AND w_MVTPDT.C1CLEUNIK NOT IN (SELECT code_original FROM eco.p_commandes) AND TYPEMVT = 3 AND w_COMMANDE.C1CLEUNIK = w_MVTPDT.C1CLEUNIK',20); DROP TABLE IF EXISTS w_MVTPDT_art; CREATE TEMP TABLE w_MVTPDT_art (C1CLEUNIK bigint, PRCLEUNIK bigint, DATEMVT date, QUANTITE numeric, VALTTC numeric, oid bigint); CREATE INDEX w_MVTPDT_art_i1 ON w_MVTPDT_art USING btree (oid); CREATE INDEX w_MVTPDT_art_i2 ON w_MVTPDT_art USING btree (PRCLEUNIK); CREATE INDEX w_MVTPDT_art_i3 ON w_MVTPDT_art USING btree (C1CLEUNIK); DROP TABLE IF EXISTS w_LIGNE_art; CREATE TEMP TABLE w_LIGNE_art (C1CLEUNIK bigint, PRCLEUNIK bigint, DATELIVCMD date, QTELIV numeric, FACTTTC numeric, nb numeric, L0CLEUNIK bigint); CREATE INDEX w_LIGNE_art_i1 ON w_LIGNE_art USING btree (C1CLEUNIK); CREATE INDEX w_LIGNE_art_i2 ON w_LIGNE_art USING btree (PRCLEUNIK); CREATE INDEX w_LIGNE_art_i3 ON w_LIGNE_art USING btree (L0CLEUNIK); SELECT base.cti_execute(' TRUNCATE w_MVTPDT_art., INSERT INTO w_MVTPDT_art SELECT C1CLEUNIK, PRCLEUNIK, null , 0, 0, MIN(oid) AS oid FROM w_MVTPDT WHERE L0CLEUNIK <= 0 AND C1CLEUNIK <> 0 AND TYPEMVT = 1 GROUP BY 1,2., TRUNCATE w_LIGNE_art., INSERT INTO w_LIGNE_art SELECT w_COMMANDE.C1CLEUNIK, PRCLEUNIK, null , 0, 0, count(*), MIN(L0CLEUNIK) AS L0CLEUNIK FROM w_COMMANDE JOIN eco.p_commandes ON w_COMMANDE.C1CLEUNIK = code_original JOIN w_LIGNE_source LIGNE ON w_COMMANDE.C1CLEUNIK = LIGNE.C1CLEUNIK WHERE QTELIV <> 0 GROUP BY 1,2 HAVING count(*) = 1., UPDATE w_MVTPDT SET L0CLEUNIK = w_LIGNE_art.L0CLEUNIK FROM w_MVTPDT_art JOIN w_LIGNE_art ON w_MVTPDT_art.C1CLEUNIK = w_LIGNE_art.C1CLEUNIK AND w_MVTPDT_art.PRCLEUNIK = w_LIGNE_art.PRCLEUNIK AND w_LIGNE_art.nb = 1 WHERE w_MVTPDT_art.oid = w_MVTPDT.oid',100); SELECT base.cti_execute(' TRUNCATE w_MVTPDT_art., INSERT INTO w_MVTPDT_art SELECT C1CLEUNIK, PRCLEUNIK, date(DATEMVT) AS DATEMVT, QUANTITE::numeric, VALTTC::numeric, MIN(oid) AS oid FROM w_MVTPDT WHERE L0CLEUNIK <= 0 AND C1CLEUNIK <> 0 AND TYPEMVT = 1 GROUP BY 1,2,3,4,5., TRUNCATE w_LIGNE_art., INSERT INTO w_LIGNE_art SELECT w_COMMANDE.C1CLEUNIK, LIGNE.PRCLEUNIK, date(DATELIVCMD) AS DATELIVCMD, QTELIV::numeric, CASE WHEN FACTTTC <> 0 THEN FACTTTC ELSE VALEURTTC END AS FACTTTC, count(*), MIN(LIGNE.L0CLEUNIK) AS L0CLEUNIK FROM w_COMMANDE JOIN eco.p_commandes ON w_COMMANDE.C1CLEUNIK = code_original JOIN w_LIGNE_source LIGNE ON w_COMMANDE.C1CLEUNIK = LIGNE.C1CLEUNIK LEFT JOIN w_MVTPDT ON LIGNE.L0CLEUNIK = w_MVTPDT.L0CLEUNIK WHERE QTELIV <> 0 AND w_MVTPDT.L0CLEUNIK IS NULL GROUP BY 1,2,3,4,5., UPDATE w_MVTPDT SET L0CLEUNIK = w_LIGNE_art.L0CLEUNIK FROM w_MVTPDT_art JOIN w_LIGNE_art ON w_MVTPDT_art.C1CLEUNIK = w_LIGNE_art.C1CLEUNIK AND w_MVTPDT_art.PRCLEUNIK = w_LIGNE_art.PRCLEUNIK AND w_MVTPDT_art.DATEMVT = w_LIGNE_art.DATELIVCMD AND w_MVTPDT_art.QUANTITE = w_LIGNE_art.QTELIV AND w_MVTPDT_art.VALTTC = w_LIGNE_art.FACTTTC WHERE w_MVTPDT_art.oid = w_MVTPDT.oid',100); SELECT base.cti_execute(' TRUNCATE w_MVTPDT_art., INSERT INTO w_MVTPDT_art SELECT C1CLEUNIK, PRCLEUNIK, date(DATEMVT) AS DATEMVT, QUANTITE::numeric, 0, MIN(oid) AS oid FROM w_MVTPDT WHERE L0CLEUNIK <= 0 AND C1CLEUNIK <> 0 AND TYPEMVT = 1 GROUP BY 1,2,3,4., TRUNCATE w_LIGNE_art., INSERT INTO w_LIGNE_art SELECT w_COMMANDE.C1CLEUNIK, LIGNE.PRCLEUNIK, date(DATELIVCMD) AS DATELIVCMD, QTELIV::numeric, 0, count(*), MIN(LIGNE.L0CLEUNIK) AS L0CLEUNIK FROM w_COMMANDE JOIN eco.p_commandes ON w_COMMANDE.C1CLEUNIK = code_original JOIN w_LIGNE_source LIGNE ON w_COMMANDE.C1CLEUNIK = LIGNE.C1CLEUNIK LEFT JOIN w_MVTPDT ON LIGNE.L0CLEUNIK = w_MVTPDT.L0CLEUNIK WHERE QTELIV <> 0 AND w_MVTPDT.L0CLEUNIK IS NULL GROUP BY 1,2,3,4., UPDATE w_MVTPDT SET L0CLEUNIK = w_LIGNE_art.L0CLEUNIK FROM w_MVTPDT_art JOIN w_LIGNE_art ON w_MVTPDT_art.C1CLEUNIK = w_LIGNE_art.C1CLEUNIK AND w_MVTPDT_art.PRCLEUNIK = w_LIGNE_art.PRCLEUNIK AND w_MVTPDT_art.DATEMVT = w_LIGNE_art.DATELIVCMD AND w_MVTPDT_art.QUANTITE = w_LIGNE_art.QTELIV WHERE w_MVTPDT_art.oid = w_MVTPDT.oid',100); SELECT base.cti_execute(' TRUNCATE w_MVTPDT_art., INSERT INTO w_MVTPDT_art SELECT C1CLEUNIK, PRCLEUNIK, NULL::date AS DATEMVT, QUANTITE::numeric, 0, MIN(oid) AS oid FROM w_MVTPDT WHERE L0CLEUNIK <= 0 AND C1CLEUNIK <> 0 AND TYPEMVT = 1 GROUP BY 1,2,3,4., TRUNCATE w_LIGNE_art., INSERT INTO w_LIGNE_art SELECT w_COMMANDE.C1CLEUNIK, LIGNE.PRCLEUNIK, NULL::date AS DATELIVCMD, QTELIV::numeric, 0, count(*), MIN(LIGNE.L0CLEUNIK) AS L0CLEUNIK FROM w_COMMANDE JOIN eco.p_commandes ON w_COMMANDE.C1CLEUNIK = code_original JOIN w_LIGNE_source LIGNE ON w_COMMANDE.C1CLEUNIK = LIGNE.C1CLEUNIK LEFT JOIN w_MVTPDT ON LIGNE.L0CLEUNIK = w_MVTPDT.L0CLEUNIK WHERE QTELIV <> 0 AND w_MVTPDT.L0CLEUNIK IS NULL GROUP BY 1,2,3,4., UPDATE w_MVTPDT SET L0CLEUNIK = w_LIGNE_art.L0CLEUNIK FROM w_MVTPDT_art JOIN w_LIGNE_art ON w_MVTPDT_art.C1CLEUNIK = w_LIGNE_art.C1CLEUNIK AND w_MVTPDT_art.PRCLEUNIK = w_LIGNE_art.PRCLEUNIK AND w_MVTPDT_art.QUANTITE = w_LIGNE_art.QTELIV WHERE w_MVTPDT_art.oid = w_MVTPDT.oid',100); SELECT base.cti_execute(' TRUNCATE w_MVTPDT_art., INSERT INTO w_MVTPDT_art SELECT C1CLEUNIK, PRCLEUNIK, null , 0, 0, MIN(oid) AS oid FROM w_MVTPDT WHERE L0CLEUNIK <= 0 AND C1CLEUNIK <> 0 AND TYPEMVT = 1 GROUP BY 1,2., TRUNCATE w_LIGNE_art., INSERT INTO w_LIGNE_art SELECT w_COMMANDE.C1CLEUNIK, PRCLEUNIK, null , 0, 0, count(*), MIN(L0CLEUNIK) AS L0CLEUNIK FROM w_COMMANDE JOIN eco.p_commandes ON w_COMMANDE.C1CLEUNIK = code_original JOIN w_LIGNE_source LIGNE ON w_COMMANDE.C1CLEUNIK = LIGNE.C1CLEUNIK GROUP BY 1,2 HAVING count(*) = 1., UPDATE w_MVTPDT SET L0CLEUNIK = w_LIGNE_art.L0CLEUNIK FROM w_MVTPDT_art JOIN w_LIGNE_art ON w_MVTPDT_art.C1CLEUNIK = w_LIGNE_art.C1CLEUNIK AND w_MVTPDT_art.PRCLEUNIK = w_LIGNE_art.PRCLEUNIK AND w_LIGNE_art.nb = 1 WHERE w_MVTPDT_art.oid = w_MVTPDT.oid',100); UPDATE w_MVTPDT SET SERVICE = LIGNE.SERVICE, profil_code_original = CASE WHEN LIGNE.SERVICE <> '' AND LIGNE.SERVICE <> '-1' THEN '|' || LIGNE.SERVICE ELSE '' END FROM w_LIGNE_source LIGNE WHERE w_MVTPDT.L0CLEUNIK = LIGNE.L0CLEUNIK AND LIGNE.SERVICE <> '' AND LIGNE.SERVICE <> '-1'; TRUNCATE eco.t_profils_comptables; INSERT INTO eco.t_profils_comptables (code_original, centre_responsabilite_id, unite_fonctionnelle_id) SELECT profil_code_original AS code_original, COALESCE(t_centres_responsabilites.oid,0) AS centre_responsabilite_id, COALESCE(t_unites_fonctionnelles.oid,0) AS unite_fonctionnelle_id FROM w_MVTPDT LEFT JOIN eco.t_centres_responsabilites ON '0' = t_centres_responsabilites.code_original LEFT JOIN eco.t_unites_fonctionnelles ON SERVICE = t_unites_fonctionnelles.code_original GROUP BY 1,2,3; UPDATE eco.t_profils_comptables SET centre_responsabilite_code = t_centres_responsabilites.code, centre_responsabilite_texte = t_centres_responsabilites.texte_court, centre_responsabilite_section_id = t_centres_responsabilites.section_id, centre_responsabilite_section_code = t_centres_responsabilites.section_code, centre_responsabilite_section_texte = t_centres_responsabilites.section_texte, unite_fonctionnelle_code = t_unites_fonctionnelles.code, unite_fonctionnelle_texte = t_unites_fonctionnelles.texte_court, unite_fonctionnelle_section_id = t_unites_fonctionnelles.section_id, unite_fonctionnelle_section_code = t_unites_fonctionnelles.section_code, unite_fonctionnelle_section_texte = t_unites_fonctionnelles.section_texte FROM eco.t_centres_responsabilites, eco.t_unites_fonctionnelles WHERE centre_responsabilite_id = t_centres_responsabilites.oid AND unite_fonctionnelle_id = t_unites_fonctionnelles.oid AND ( centre_responsabilite_code IS DISTINCT FROM t_centres_responsabilites.code OR centre_responsabilite_texte IS DISTINCT FROM t_centres_responsabilites.texte_court OR centre_responsabilite_section_id IS DISTINCT FROM t_centres_responsabilites.section_id OR centre_responsabilite_section_code IS DISTINCT FROM t_centres_responsabilites.section_code OR centre_responsabilite_section_texte IS DISTINCT FROM t_centres_responsabilites.section_texte OR unite_fonctionnelle_code IS DISTINCT FROM t_unites_fonctionnelles.code OR unite_fonctionnelle_texte IS DISTINCT FROM t_unites_fonctionnelles.texte_court OR unite_fonctionnelle_section_id IS DISTINCT FROM t_unites_fonctionnelles.section_id OR unite_fonctionnelle_section_code IS DISTINCT FROM t_unites_fonctionnelles.section_code OR unite_fonctionnelle_section_texte IS DISTINCT FROM t_unites_fonctionnelles.section_texte ); 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'); INSERT INTO eco.p_mouvements_articles( code_original, date, sens_mouvement, type_mouvement_id, texte, gestionnaire_id, site_id, lieu_id, profil_comptable_id, article_id, compte_id, ucd_id, lpp_id, unite_fonctionnelle_id, fournisseur_id, commande_id, ligne_commande, prix_unitaire, entree_quantite, sortie_quantite, entree_montant, sortie_montant, entree_montant_ht, sortie_montant_ht, sortie_montant_original_ttc, sortie_montant_original_ht, stock_quantite_debut, stock_quantite_fin, taux_prorata_tva, no_patient, no_sejour) SELECT MVTCLEUNIK::text AS code_original, date(DATEMVT) AS date, CASE WHEN SENSMVT = '1' THEN 'E' ELSE 'S' END AS sens_mouvement, COALESCE(t_types_mouvements.oid,0) AS type_mouvement_id, substr(TRIM(REFMVT1 || ' ' || REFMVT2 || ' ' || REFMVT3 || ' ' || MOTIF),1,255) AS texte, COALESCE(t_gestionnaires.oid,0) AS gestionnaire_id, COALESCE(t_sites.oid,0) AS site_id, COALESCE(t_lieux.oid,0) AS lieu_id, COALESCE(t_profils_comptables.oid,0) AS profil_comptable, COALESCE(t_articles.oid,0) AS article_id, COALESCE(t_articles.compte_id,0) AS compte_id, COALESCE(t_ucd.oid,0) AS ucd_id, COALESCE(t_lpp.oid,t_lpp_prod.oid,0) AS lpp_id, COALESCE(t_unites_fonctionnelles.oid,0) AS unite_fonctionnelle_id, COALESCE(t_fournisseurs.oid,t_fournisseurs_articles.oid,0) AS fournisseur_id, COALESCE(p_commandes.oid,0) AS commande_id, LIGNE.NOLIGCMDE AS ligne_commande, base.cti_division(VALTTC::numeric , QUANTITE::numeric) AS prix_unitaire, CASE WHEN SENSMVT = '1' THEN QUANTITE::numeric ELSE 0 END AS entree_quantite, CASE WHEN SENSMVT <> '1' THEN QUANTITE::numeric ELSE 0 END AS sortie_quantite, CASE WHEN SENSMVT = '1' THEN VALTTC::numeric ELSE 0 END AS entree_montant, CASE WHEN SENSMVT <> '1' THEN VALTTC::numeric ELSE 0 END AS sortie_montant, CASE WHEN SENSMVT = '1' THEN VALHT::numeric ELSE 0 END AS entree_montant_ht, CASE WHEN SENSMVT <> '1' THEN VALHT::numeric ELSE 0 END AS sortie_montant_ht, CASE WHEN SENSMVT <> '1' THEN VALTTC::numeric ELSE 0 END AS sortie_montant_original_ttc, CASE WHEN SENSMVT <> '1' THEN VALHT::numeric ELSE 0 END AS sortie_montant_original_ht, 0 AS stock_quantite_debut, 0 AS stock_quantite_fin, CASE WHEN t_articles.type_prorata_tva IS DISTINCT FROM '1' THEN COALESCE(t_prorata_tva.taux,0) ELSE 0 END, w_MVTPDT.no_patient, w_MVTPDT.no_sejour FROM w_MVTPDT LEFT JOIN prod_pharma.MAGASIN ON MAGASIN = CODEMAGASIN LEFT JOIN prod_pharma.PRODUIT ON PRODUIT.PRCLEUNIK = w_MVTPDT.PRCLEUNIK LEFT JOIN eco.t_types_mouvements ON to_char(TYPEMVT,'FM00') || '|' || TYPESORTIE = t_types_mouvements.code_original LEFT JOIN eco.t_gestionnaires ON '0' = t_gestionnaires.code_original LEFT JOIN eco.t_divers ON t_divers.code = 'PHARMA_MAG_LIEU' LEFT JOIN eco.t_sites ON CASE WHEN t_divers.valeur = '0' THEN COALESCE (MAGASIN::text,'0') ELSE '0' END = t_sites.code LEFT JOIN eco.t_lieux ON CASE WHEN t_divers.valeur = '0'::text THEN LIEUSTOCK::text ELSE IDMAGASIN::text END = t_lieux.code_original LEFT JOIN eco.t_profils_comptables ON profil_code_original = t_profils_comptables.code_original LEFT JOIN eco.t_articles ON w_MVTPDT.PRCLEUNIK = t_articles.code_original LEFT JOIN eco.t_fournisseurs ON w_MVTPDT.F0CLEUNIK = t_fournisseurs.code_original AND w_MVTPDT.F0CLEUNIK > 1 LEFT JOIN eco.t_fournisseurs t_fournisseurs_articles ON PRODUIT.F0CLEUNIK = t_fournisseurs_articles.code_original AND PRODUIT.F0CLEUNIK > 1 LEFT JOIN w_LIGNE_source LIGNE ON w_MVTPDT.L0CLEUNIK = LIGNE.L0CLEUNIK LEFT JOIN eco.p_commandes ON w_MVTPDT.C1CLEUNIK = p_commandes.code_original LEFT JOIN base.t_ucd ON w_MVTPDT.CODE_UCD = t_ucd.code LEFT JOIN base.t_lpp ON w_MVTPDT.CODE_LPP = t_lpp.code LEFT JOIN base.t_lpp t_lpp_prod ON PRODUIT.CODELPP = t_lpp_prod.code LEFT JOIN eco.t_unites_fonctionnelles ON w_MVTPDT.SERVICE = t_unites_fonctionnelles.code_original AND w_MVTPDT.SERVICE <> '-1' LEFT JOIN eco.t_prorata_tva ON t_prorata_tva.oid = 0 ; 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'); ]]> '' GROUP BY 1,2,3,4 HAVING round(SUM(MONTANT)::numeric,2) = 0; ANALYSE w_ACHATS_0 ; DROP TABLE IF EXISTS w_ACHATS; CREATE TEMP TABLE w_ACHATS AS SELECT ACHATS.*, COALESCE(to_char(ACHATS.DATEFACT,'YYYYMMDD'),'00000000')||'_'||ACHATS.REFFACT||'_'||ACHATS.F0CLEUNIK AS code_original_facture, CASE WHEN MONTANT >= 0 THEN 1 ELSE -1 END AS SENS, COALESCE(C1CLEUNIK,0) AS C1CLEUNIK, NULL::numeric[] AS L0CLEUNIK_array, '0'::text AS commande_ok, '0'::text AS ligne_ok FROM prod_pharma.ACHATS LEFT JOIN w_COMMANDE ON LPAD(to_char(NUMCMDE,'FM0000000') || SUFCMDE,10,'0') = LPAD(trim(REFCMDE),10,'0') AND w_COMMANDE.F0CLEUNIK = ACHATS.F0CLEUNIK AND NUMCMDE <> 0 LEFT JOIN w_ACHATS_0 ON ACHATS.REFCMDE = w_ACHATS_0.REFCMDE AND ACCLEUNIK = ANY (ACCLEUNIK_array) WHERE ACHATS.REFFACT <> '' AND w_ACHATS_0.DATEFACT IS NULL AND ACHATS.MONTANT <> 0; UPDATE w_ACHATS SET NOLIQUIDAT = subview.NOLIQUIDAT FROM (SELECT REFCMDE, MAX(NOLIQUIDAT) AS NOLIQUIDAT FROM w_ACHATS WHERE NOLIQUIDAT <> '1' GROUP BY 1 HAVING count(DISTINCT NOLIQUIDAT) = 1 ) subview WHERE w_ACHATS.REFCMDE = subview.REFCMDE AND w_ACHATS.NOLIQUIDAT = '1'; UPDATE w_ACHATS SET NOLIQUIDAT = (SELECT (MAX(Array[DATEFACT::text,NOLIQUIDAT::text]))[2]::numeric FROM w_ACHATS w_ACHATS_p WHERE w_ACHATS_p.REFCMDE = w_ACHATS.REFCMDE AND w_ACHATS.MONTANT = 0 - w_ACHATS_p.MONTANT AND w_ACHATS_p.NOLIQUIDAT <> '1' AND (w_ACHATS_p.ACCLEUNIK < w_ACHATS.ACCLEUNIK) ) WHERE NOLIQUIDAT = 1 AND (SELECT MAX(Array[DATEFACT::text,NOLIQUIDAT::text]) FROM w_ACHATS w_ACHATS_p WHERE w_ACHATS_p.REFCMDE = w_ACHATS.REFCMDE AND w_ACHATS.MONTANT = 0 - w_ACHATS_p.MONTANT AND w_ACHATS_p.NOLIQUIDAT <> '1' AND (w_ACHATS_p.ACCLEUNIK < w_ACHATS.ACCLEUNIK) ) IS NOT NULL; UPDATE w_ACHATS SET NOLIQUIDAT = (SELECT (MAX(Array[DATEFACT::text,NOLIQUIDAT::text]))[2]::numeric FROM w_ACHATS w_ACHATS_p WHERE w_ACHATS_p.REFCMDE = w_ACHATS.REFCMDE AND w_ACHATS.MONTANT = 0 - w_ACHATS_p.MONTANT AND w_ACHATS_p.NOLIQUIDAT <> '1' AND (w_ACHATS_p.DATEFACT < w_ACHATS.DATEFACT OR w_ACHATS_p.DATEFACT = w_ACHATS.DATEFACT AND w_ACHATS_p.DATESAISIE < w_ACHATS.DATESAISIE OR w_ACHATS_p.DATEFACT = w_ACHATS.DATEFACT AND w_ACHATS_p.DATESAISIE = w_ACHATS.DATESAISIE AND w_ACHATS_p.ACCLEUNIK < w_ACHATS.ACCLEUNIK) ) WHERE NOLIQUIDAT = 1 AND (SELECT MAX(Array[DATEFACT::text,NOLIQUIDAT::text]) FROM w_ACHATS w_ACHATS_p WHERE w_ACHATS_p.REFCMDE = w_ACHATS.REFCMDE AND w_ACHATS.MONTANT = 0 - w_ACHATS_p.MONTANT AND w_ACHATS_p.NOLIQUIDAT <> '1' AND (w_ACHATS_p.DATEFACT < w_ACHATS.DATEFACT OR w_ACHATS_p.DATEFACT = w_ACHATS.DATEFACT AND w_ACHATS_p.DATESAISIE < w_ACHATS.DATESAISIE OR w_ACHATS_p.DATEFACT = w_ACHATS.DATEFACT AND w_ACHATS_p.DATESAISIE = w_ACHATS.DATESAISIE AND w_ACHATS_p.ACCLEUNIK < w_ACHATS.ACCLEUNIK) ) IS NOT NULL; DROP TABLE IF EXISTS w_ACHATS_0; CREATE TEMP TABLE w_ACHATS_0 AS SELECT DATEFACT, REFCMDE, F0CLEUNIK, NOLIQUIDAT, COMPTE, SUM(MONTANT), base.cti_group_array3(ACCLEUNIK) AS ACCLEUNIK_array FROM w_ACHATS GROUP BY 1,2,3,4,5 HAVING round(SUM(MONTANT)::numeric,2) = 0; DELETE FROM w_ACHATS USING w_ACHATS_0 WHERE w_ACHATS.REFCMDE = w_ACHATS_0.REFCMDE AND ACCLEUNIK = ANY (ACCLEUNIK_array); -- correction date facture nulle UPDATE w_ACHATS SET DATEFACT = subview.DATEFACT, code_original_facture = COALESCE(to_char(subview.DATEFACT,'YYYYMMDD'),'00000000')||'_'||w_ACHATS.REFFACT||'_'||w_ACHATS.F0CLEUNIK FROM ( SELECT w_ACHATS.ACCLEUNIK AS ACCLEUNIK, (MAX(Array[w_ACHATS_2.ACCLEUNIK::text,w_ACHATS_2.DATEFACT::text]))[2]::date AS DATEFACT FROM w_ACHATS JOIN w_ACHATS w_ACHATS_2 ON w_ACHATS.REFCMDE = w_ACHATS_2.REFCMDE AND w_ACHATS.COMPTE = w_ACHATS_2.COMPTE AND w_ACHATS.NOLIQUIDAT = w_ACHATS_2.NOLIQUIDAT AND w_ACHATS.REFMARCHE = w_ACHATS_2.REFMARCHE AND w_ACHATS.C1CLEUNIK = w_ACHATS_2.C1CLEUNIK AND w_ACHATS.ACCLEUNIK < w_ACHATS_2.ACCLEUNIK AND w_ACHATS.DATEFACT IS NULL AND w_ACHATS_2.DATEFACT IS NOT NULL GROUP BY 1 ) subview WHERE w_ACHATS.ACCLEUNIK = subview.ACCLEUNIK; -- Suppression des annulations DELETE FROM w_ACHATS USING ( SELECT w_ACHATS.ACCLEUNIK AS ACCLEUNIK_ANN, MAX(w_ACHATS_2.ACCLEUNIK) AS ACCLEUNIK FROM w_ACHATS JOIN w_ACHATS w_ACHATS_2 ON w_ACHATS.DATEFACT = w_ACHATS_2.DATEFACT AND w_ACHATS.REFCMDE = w_ACHATS_2.REFCMDE AND w_ACHATS.COMPTE = w_ACHATS_2.COMPTE AND w_ACHATS.NOLIQUIDAT = w_ACHATS_2.NOLIQUIDAT AND w_ACHATS.REFMARCHE = w_ACHATS_2.REFMARCHE AND w_ACHATS.C1CLEUNIK = w_ACHATS_2.C1CLEUNIK AND w_ACHATS.MONTANT < 0 AND w_ACHATS.ACCLEUNIK > w_ACHATS_2.ACCLEUNIK AND round(w_ACHATS.MONTANT::numeric,2) = 0- round(w_ACHATS_2.MONTANT::numeric,2) GROUP BY 1 ) subview WHERE w_ACHATS.ACCLEUNIK = subview.ACCLEUNIK_ANN OR w_ACHATS.ACCLEUNIK = subview.ACCLEUNIK; UPDATE w_ACHATS SET commande_ok = '1' FROM (SELECT REFCMDE, w_ACHATS.C1CLEUNIK, NOLIQUIDAT, TOTFACTTTC, SUM(MONTANT) AS montant FROM w_ACHATS JOIN w_COMMANDE ON w_COMMANDE.C1CLEUNIK = w_ACHATS.C1CLEUNIK AND NOLIQUID = NOLIQUIDAT GROUP BY 1,2,3,4 HAVING round(TOTFACTTTC::numeric,2) = round(SUM(MONTANT)::numeric,2) ) subview WHERE subview.REFCMDE = w_ACHATS.REFCMDE AND subview.NOLIQUIDAT = w_ACHATS.NOLIQUIDAT; UPDATE w_ACHATS SET commande_ok = '2' FROM (SELECT REFCMDE, w_ACHATS.C1CLEUNIK, NOLIQUIDAT, TOTFACTTTC, SUM(MONTANT) AS montant FROM w_ACHATS JOIN w_COMMANDE ON w_COMMANDE.C1CLEUNIK = w_ACHATS.C1CLEUNIK GROUP BY 1,2,3,4 HAVING round(TOTFACTTTC::numeric,2) = round(SUM(MONTANT)::numeric,2) ) subview WHERE commande_ok = '0' AND subview.REFCMDE = w_ACHATS.REFCMDE AND subview.NOLIQUIDAT = w_ACHATS.NOLIQUIDAT; UPDATE w_ACHATS SET commande_ok = '3' FROM (SELECT REFCMDE, w_ACHATS.C1CLEUNIK, TOTFACTTTC, SUM(MONTANT) AS montant FROM w_ACHATS JOIN w_COMMANDE ON w_COMMANDE.C1CLEUNIK = w_ACHATS.C1CLEUNIK GROUP BY 1,2,3 HAVING round(TOTFACTTTC::numeric,2) = round(SUM(MONTANT)::numeric,2) ) subview WHERE commande_ok = '0' AND subview.REFCMDE = w_ACHATS.REFCMDE; DROP TABLE IF EXISTS w_LIGNE; CREATE TEMP TABLE w_LIGNE AS SELECT C1CLEUNIK, COMPTE.COMPTE, NUMMARCHE, round(SUM(FACTTTC)::numeric,2) AS FACTTTC , round(SUM(VALEURTTC)::numeric,2) AS VALEURTTC, base.cti_group_array3(L0CLEUNIK) AS L0CLEUNIK_array FROM w_LIGNE_source LIGNE JOIN prod_pharma.PRODUIT ON ligne.PRCLEUNIK = PRODUIT.PRCLEUNIK JOIN prod_pharma.COMPTE ON PRODUIT.COMPTE = COMPTE.COMPTE GROUP BY 1,2,3; UPDATE w_ACHATS SET L0CLEUNIK_array = w_LIGNE.L0CLEUNIK_array, ligne_ok = '1' FROM w_LIGNE WHERE w_ACHATS.L0CLEUNIK_array IS NULL AND w_ACHATS.C1CLEUNIK = w_LIGNE.C1CLEUNIK AND w_ACHATS.REFMARCHE = w_LIGNE.NUMMARCHE AND w_ACHATS.COMPTE = w_LIGNE.COMPTE AND MONTANT - VALEURTTC BETWEEN -0.01 AND 0.01; DROP TABLE IF EXISTS w_LIGNE; CREATE TEMP TABLE w_LIGNE AS SELECT C1CLEUNIK, COMPTEPDT, NUMMARCHE, round(SUM(FACTTTC)::numeric,2) AS FACTTTC , round(SUM(VALEURTTC)::numeric,2) AS VALEURTTC, base.cti_group_array3(L0CLEUNIK) AS L0CLEUNIK_array FROM w_LIGNE_source LIGNE GROUP BY 1,2,3; UPDATE w_ACHATS SET L0CLEUNIK_array = w_LIGNE.L0CLEUNIK_array, ligne_ok = '2' FROM w_LIGNE WHERE w_ACHATS.L0CLEUNIK_array IS NULL AND w_ACHATS.C1CLEUNIK = w_LIGNE.C1CLEUNIK AND w_ACHATS.REFMARCHE = w_LIGNE.NUMMARCHE AND w_ACHATS.COMPTE = w_LIGNE.COMPTEPDT AND MONTANT - VALEURTTC BETWEEN -0.01 AND 0.01; UPDATE w_ACHATS SET L0CLEUNIK_array = Array[LIGNE.L0CLEUNIK], ligne_ok = '3' FROM w_LIGNE_source LIGNE JOIN prod_pharma.PRODUIT ON ligne.PRCLEUNIK = PRODUIT.PRCLEUNIK JOIN prod_pharma.COMPTE ON PRODUIT.COMPTE = COMPTE.COMPTE WHERE w_ACHATS.L0CLEUNIK_array IS NULL AND w_ACHATS.C1CLEUNIK = LIGNE.C1CLEUNIK AND w_ACHATS.REFMARCHE = LIGNE.NUMMARCHE AND w_ACHATS.COMPTE = PRODUIT.COMPTE AND MONTANT - VALEURTTC BETWEEN -0.01 AND 0.01; UPDATE w_ACHATS SET L0CLEUNIK_array = Array[LIGNE.L0CLEUNIK], ligne_ok = '4' FROM w_LIGNE_source LIGNE WHERE L0CLEUNIK_array IS NULL AND w_ACHATS.C1CLEUNIK = LIGNE.C1CLEUNIK AND w_ACHATS.REFMARCHE = LIGNE.NUMMARCHE AND w_ACHATS.COMPTE = LIGNE.COMPTEPDT AND MONTANT - VALEURTTC BETWEEN -0.01 AND 0.01; DROP TABLE IF EXISTS w_LIGNE; CREATE TEMP TABLE w_LIGNE AS SELECT LIGNE.C1CLEUNIK, COMPTE.COMPTE, NUMMARCHE, round(SUM(FACTTTC)::numeric,2) AS FACTTTC , round(SUM(VALEURTTC)::numeric,2) AS VALEURTTC, base.cti_group_array3(L0CLEUNIK) AS L0CLEUNIK_array FROM w_LIGNE_source LIGNE LEFT JOIN w_ACHATS ON LIGNE.C1CLEUNIK = w_ACHATS.C1CLEUNIK AND LIGNE.L0CLEUNIK = ANY (L0CLEUNIK_array) JOIN prod_pharma.PRODUIT ON ligne.PRCLEUNIK = PRODUIT.PRCLEUNIK JOIN prod_pharma.COMPTE ON PRODUIT.COMPTE = COMPTE.COMPTE WHERE w_ACHATS.C1CLEUNIK IS NULL GROUP BY 1,2,3; UPDATE w_ACHATS SET L0CLEUNIK_array = w_LIGNE.L0CLEUNIK_array, ligne_ok = '5' FROM w_LIGNE WHERE w_ACHATS.L0CLEUNIK_array IS NULL AND w_ACHATS.C1CLEUNIK = w_LIGNE.C1CLEUNIK AND w_ACHATS.REFMARCHE = w_LIGNE.NUMMARCHE AND w_ACHATS.COMPTE = w_LIGNE.COMPTE AND (round(MONTANT::numeric,2) = VALEURTTC OR round(MONTANT::numeric,2) = 0 - VALEURTTC); DROP TABLE IF EXISTS w_LIGNE; CREATE TEMP TABLE w_LIGNE AS SELECT LIGNE.C1CLEUNIK, COMPTEPDT, NUMMARCHE, round(SUM(FACTTTC)::numeric,2) AS FACTTTC , round(SUM(VALEURTTC)::numeric,2) AS VALEURTTC, base.cti_group_array3(L0CLEUNIK) AS L0CLEUNIK_array FROM w_LIGNE_source LIGNE LEFT JOIN w_ACHATS ON LIGNE.C1CLEUNIK = w_ACHATS.C1CLEUNIK AND LIGNE.L0CLEUNIK = ANY (L0CLEUNIK_array) WHERE w_ACHATS.C1CLEUNIK IS NULL GROUP BY 1,2,3; UPDATE w_ACHATS SET L0CLEUNIK_array = w_LIGNE.L0CLEUNIK_array, ligne_ok = '6' FROM w_LIGNE WHERE w_ACHATS.L0CLEUNIK_array IS NULL AND w_ACHATS.C1CLEUNIK = w_LIGNE.C1CLEUNIK AND w_ACHATS.REFMARCHE = w_LIGNE.NUMMARCHE AND w_ACHATS.COMPTE = w_LIGNE.COMPTEPDT AND (round(MONTANT::numeric,2) = VALEURTTC OR round(MONTANT::numeric,2) = 0 - VALEURTTC); DROP TABLE IF EXISTS w_LIGNE; CREATE TEMP TABLE w_LIGNE AS SELECT LIGNE.C1CLEUNIK, COMPTE.COMPTE, NUMMARCHE, round(SUM(FACTTTC)::numeric,2) AS FACTTTC , round(SUM(VALEURTTC)::numeric,2) AS VALEURTTC, base.cti_group_array3(L0CLEUNIK) AS L0CLEUNIK_array FROM w_LIGNE_source LIGNE LEFT JOIN w_ACHATS ON LIGNE.C1CLEUNIK = w_ACHATS.C1CLEUNIK AND LIGNE.L0CLEUNIK = ANY (L0CLEUNIK_array) JOIN prod_pharma.PRODUIT ON ligne.PRCLEUNIK = PRODUIT.PRCLEUNIK JOIN prod_pharma.COMPTE ON PRODUIT.COMPTE = COMPTE.COMPTE WHERE w_ACHATS.C1CLEUNIK IS NULL GROUP BY 1,2,3; UPDATE w_ACHATS SET L0CLEUNIK_array = w_LIGNE.L0CLEUNIK_array, ligne_ok = '7' FROM w_LIGNE WHERE w_ACHATS.L0CLEUNIK_array IS NULL AND w_ACHATS.C1CLEUNIK = w_LIGNE.C1CLEUNIK AND w_ACHATS.COMPTE = w_LIGNE.COMPTE AND w_ACHATS.REFMARCHE = w_LIGNE.NUMMARCHE AND (round(MONTANT::numeric,2) = VALEURTTC OR round(MONTANT::numeric,2) = 0 - VALEURTTC); DROP TABLE IF EXISTS w_LIGNE; CREATE TEMP TABLE w_LIGNE AS SELECT LIGNE.C1CLEUNIK, COMPTEPDT, NUMMARCHE, round(SUM(FACTTTC)::numeric,2) AS FACTTTC , round(SUM(VALEURTTC)::numeric,2) AS VALEURTTC, base.cti_group_array3(L0CLEUNIK) AS L0CLEUNIK_array FROM w_LIGNE_source LIGNE LEFT JOIN w_ACHATS ON LIGNE.C1CLEUNIK = w_ACHATS.C1CLEUNIK AND LIGNE.L0CLEUNIK = ANY (L0CLEUNIK_array) WHERE w_ACHATS.C1CLEUNIK IS NULL GROUP BY 1,2,3; UPDATE w_ACHATS SET L0CLEUNIK_array = w_LIGNE.L0CLEUNIK_array, ligne_ok = '8' FROM w_LIGNE WHERE w_ACHATS.L0CLEUNIK_array IS NULL AND w_ACHATS.C1CLEUNIK = w_LIGNE.C1CLEUNIK AND w_ACHATS.COMPTE = w_LIGNE.COMPTEPDT AND w_ACHATS.REFMARCHE = w_LIGNE.NUMMARCHE AND (round(MONTANT::numeric,2) = VALEURTTC OR round(MONTANT::numeric,2) = 0 - VALEURTTC); DROP TABLE IF EXISTS w_LIGNE; CREATE TEMP TABLE w_LIGNE AS SELECT LIGNE.C1CLEUNIK, round(SUM(FACTTTC)::numeric,2) AS FACTTTC , round(SUM(VALEURTTC)::numeric,2) AS VALEURTTC, base.cti_group_array3(L0CLEUNIK) AS L0CLEUNIK_array FROM w_LIGNE_source LIGNE GROUP BY 1 HAVING count(*) = 1; UPDATE w_ACHATS SET L0CLEUNIK_array = w_LIGNE.L0CLEUNIK_array, ligne_ok = '9' FROM w_LIGNE WHERE w_ACHATS.L0CLEUNIK_array IS NULL AND w_ACHATS.C1CLEUNIK = w_LIGNE.C1CLEUNIK AND (round(MONTANT::numeric,2) = VALEURTTC OR round(MONTANT::numeric,2) = 0 - VALEURTTC); INSERT INTO eco.p_commandes( numero, date_commande, objet, reference, date_livraison_prevue, etat_reception, date_reception, fournisseur_id, gestionnaire_id, lieu_facturation_id, lieu_livraison_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, etat_liquidation, code_original, unite_fonctionnelle_id, lieu_commande_id) SELECT REFCMDE AS numero, DATESAISIE AS date_commande, 'Achat sans commande' AS objet, CASE WHEN REFFACT <> '' THEN 'REFFACT:' || REFFACT ELSE 'SANS N°FACTURE' END AS reference, COALESCE(DATELIV,'20991231') AS date_livraison_prevue, '0' AS etat_reception, DATESAISIE AS date_reception, COALESCE(t_fournisseurs.oid,0) AS fournisseur_id, 0 AS gestionnaire_id, 0 AS lieu_facturation_id, 0 AS lieu_livraison_id, 0 AS montant_commande_ht, 0 AS montant_commande_remise, 0 AS montant_commande_tva, 0 AS montant_commande_port, 0 AS montant_commande_total, 0 AS montant_liquidation_ht, 0 AS montant_liquidation_remise, 0 AS montant_liquidation_tva, 0 AS montant_liquidation_port, MONTANT::numeric(15,2) AS montant_liquidation_total, '0' AS etat_liquidation, (0-ACCLEUNIK) AS code_original, 0 AS unite_fonctionnelle_id, 0 AS lieu_commande_id FROM w_ACHATS LEFT JOIN eco.t_fournisseurs ON w_ACHATS.F0CLEUNIK = t_fournisseurs.code_original WHERE C1CLEUNIK = 0 AND DATEFACT >= '[ENV_ECO_ANNEEDEBUT]0101' AND (0-ACCLEUNIK) NOT IN (SELECT code_original FROM eco.p_commandes) ; UPDATE w_ACHATS SET C1CLEUNIK = 0-ACCLEUNIK FROM eco.p_commandes WHERE w_ACHATS.C1CLEUNIK = 0 AND 0-ACCLEUNIK = code_original; TRUNCATE eco.p_facture; INSERT INTO eco.p_facture( code_original, no_facture, date_facture, texte, fournisseur_id, commande_id, no_liquidation, montant_facture_ht, montant_facture_tva, montant_facture_ttc, montant_facture_article_ht, montant_facture_article_tva, montant_facture_article_ttc, montant_facture_port_ht, montant_facture_port_tva, montant_facture_port_ttc) SELECT code_original_facture AS code_original, w_ACHATS.REFFACT AS no_facture, DATEFACT AS date_facture, 'Facture n°' || w_ACHATS.REFFACT || CASE WHEN DATEFACT IS NOT NULL THEN ' du ' || to_char(DATEFACT,'DD/MM/YYYY') ELSE ' Sans date' END || ' ' || t_fournisseurs.texte, COALESCE(t_fournisseurs.oid,0) AS fournisseur_id, MAX(COALESCE(p_commandes.oid,0)) AS commande_id, base.cti_group_concat(DISTINCT w_ACHATS.NOLIQUIDAT) AS no_liquidation, SUM(SENS * COALESCE(LIGNE.VALEURHT,0)::numeric(15,2)) AS montant_facture_ht, SUM(SENS * COALESCE(LIGNE.VALEURTVA,0)::numeric(15,2)) AS montant_facture_tva, SUM(SENS * COALESCE(LIGNE.VALEURTTC,MONTANT)::numeric(15,2)) AS montant_facture_ttc, SUM(SENS * COALESCE(LIGNE.FACTHT,0)::numeric(15,2)) AS montant_facture_article_ht, SUM(SENS * COALESCE(LIGNE.TOTALTVA,0)::numeric(15,2)) AS montant_facture_article_tva, SUM(SENS * COALESCE(LIGNE.FACTTTC,0)::numeric(15,2)) AS montant_facture_article_ttc, SUM(SENS * COALESCE(LIGNE.VALEURHT - LIGNE.FACTHT,0)::numeric(15,2)) AS montant_facture_port_ht, SUM(SENS * COALESCE(LIGNE.VALEURTVA - LIGNE.TOTALTVA,0)::numeric(15,2)) AS montant_facture_port_tva, SUM(SENS * COALESCE(LIGNE.VALEURTTC - LIGNE.FACTTTC,0)::numeric(15,2)) AS montant_facture_port_ttc FROM w_ACHATS LEFT JOIN w_COMMANDE ON w_ACHATS.C1CLEUNIK = w_COMMANDE.C1CLEUNIK LEFT JOIN w_LIGNE_source LIGNE ON LIGNE.C1CLEUNIK = w_ACHATS.C1CLEUNIK AND LIGNE.L0CLEUNIK = ANY (w_ACHATS.L0CLEUNIK_ARRAY) LEFT JOIN eco.p_commandes ON p_commandes.code_original = w_ACHATS.C1CLEUNIK LEFT JOIN eco.t_fournisseurs ON w_ACHATS.F0CLEUNIK = t_fournisseurs.code_original WHERE DATEFACT >= '[ENV_ECO_ANNEEDEBUT]0101' OR p_commandes.oid IS NOT NULL GROUP BY 1,2,3,4,5; TRUNCATE eco.p_lignes_facture; INSERT INTO eco.p_lignes_facture( code_original, facture_id, ligne_commande_id, article_id, compte_id, no_liquidation, montant_facture_ht, montant_facture_tva, montant_facture_ttc, montant_facture_article_ht, montant_facture_article_tva, montant_facture_article_ttc, montant_facture_port_ht, montant_facture_port_tva, montant_facture_port_ttc, taux_prorata_tva) SELECT ACCLEUNIK AS code_original, COALESCE(p_facture.oid,0) AS facture_id, COALESCE(p_lignes_commandes.oid,0) AS ligne_commande_id, COALESCE(t_articles.oid,0) AS article_id, COALESCE(t_compte.oid,0) AS compte_id, w_ACHATS.NOLIQUIDAT, SENS * COALESCE(LIGNE.VALEURHT,0)::numeric(15,2) AS montant_facture_ht, SENS * COALESCE(LIGNE.VALEURTVA,0)::numeric(15,2) AS montant_facture_tva, SENS * COALESCE(LIGNE.VALEURTTC,MONTANT)::numeric(15,2) AS montant_facture_ttc, SENS * COALESCE(LIGNE.FACTHT,0)::numeric(15,2) AS montant_facture_article_ht, SENS * COALESCE(LIGNE.TOTALTVA,0)::numeric(15,2) AS montant_facture_article_tva, SENS * COALESCE(LIGNE.FACTTTC,0)::numeric(15,2) AS montant_facture_article_ttc, SENS * COALESCE(LIGNE.VALEURHT - LIGNE.FACTHT,0)::numeric(15,2) AS montant_facture_port_ht, SENS * COALESCE(LIGNE.VALEURTVA - LIGNE.TOTALTVA,0)::numeric(15,2) AS montant_facture_port_tva, SENS * COALESCE(LIGNE.VALEURTTC - LIGNE.FACTTTC,0)::numeric(15,2) AS montant_facture_port_ttc, CASE WHEN t_articles.type_prorata_tva IS DISTINCT FROM '1' THEN COALESCE(t_prorata_tva.taux,0) ELSE 0 END AS taux_prorata_tva FROM w_ACHATS JOIN eco.p_facture ON code_original_facture = p_facture.code_original LEFT JOIN w_LIGNE_source LIGNE ON LIGNE.C1CLEUNIK = w_ACHATS.C1CLEUNIK AND LIGNE.L0CLEUNIK = ANY (w_ACHATS.L0CLEUNIK_ARRAY) LEFT JOIN eco.p_commandes ON p_commandes.code_original = w_ACHATS.C1CLEUNIK LEFT JOIN eco.p_lignes_commandes ON p_lignes_commandes.code_original = L0CLEUNIK LEFT JOIN eco.t_articles ON LIGNE.PRCLEUNIK = t_articles.code_original LEFT JOIN eco.t_compte ON w_ACHATS.COMPTE = t_compte.code_original LEFT JOIN eco.t_prorata_tva ON t_prorata_tva.oid = 0; ]]>