/*------------------------------------------------------------------------ File : ybmProducts.p Purpose : Syntax : Description : Author(s) : walter.riechsteiner Created : Tue Apr 06 15:28:25 CEST 2021 Notes : ----------------------------------------------------------------------*/ USING src.ch.adprime.api.yourbarmate.incl.ProductsVesselUnit FROM PROPATH. USING src.ch.adprime.api.yourbarmate.YourBarMateHandler FROM PROPATH. USING src.ch.adprime.communication.HttpHandler FROM PROPATH. USING Progress.Json.ObjectModel.JsonObject FROM PROPATH. USING Progress.Json.ObjectModel.ObjectModelParser FROM PROPATH. USING OpenEdge.Net.HTTP.IHttpResponse FROM PROPATH. USING Progress.Json.ObjectModel.JsonArray FROM PROPATH. /* *************************** Definitions ************************** */ DEFINE VARIABLE cFirma AS CHARACTER NO-UNDO INIT '1000'. DEFINE VARIABLE cTestLive AS CHARACTER NO-UNDO. DEFINE VARIABLE ipiArtnr AS INTEGER NO-UNDO. DEFINE VARIABLE ipiInhalt AS INTEGER NO-UNDO. DEFINE VARIABLE ipiJahr AS INTEGER NO-UNDO. DEFINE VARIABLE oYourBarMateHandler AS YourBarMateHandler NO-UNDO. DEFINE VARIABLE oProduct AS JsonObject NO-UNDO. DEFINE VARIABLE oVessel AS JsonObject NO-UNDO. DEFINE VARIABLE oBundles AS JsonArray NO-UNDO. DEFINE VARIABLE oBundle AS JsonObject NO-UNDO. DEFINE VARIABLE oPalletBundle AS JsonObject NO-UNDO. DEFINE VARIABLE opErrorMessage AS CHARACTER NO-UNDO. DEFINE VARIABLE lRetVal AS LOGICAL NO-UNDO. DEFINE VARIABLE lPreisMut AS LOGICAL NO-UNDO. DEFINE VARIABLE cString AS CHARACTER NO-UNDO. DEFINE VARIABLE ii AS INTEGER NO-UNDO. DEFINE VARIABLE i1 AS INTEGER NO-UNDO. DEFINE VARIABLE i2 AS INTEGER NO-UNDO. DEFINE VARIABLE iok AS INTEGER NO-UNDO. DEFINE VARIABLE inok AS INTEGER NO-UNDO. DEFINE VARIABLE cId AS CHARACTER NO-UNDO. DEFINE VARIABLE cName AS CHARACTER NO-UNDO. DEFINE VARIABLE cKGebinde AS CHARACTER NO-UNDO. DEFINE VARIABLE cVGebinde AS CHARACTER NO-UNDO. DEFINE VARIABLE cGGebinde AS CHARACTER NO-UNDO. DEFINE VARIABLE iVGebInhalt AS INTEGER NO-UNDO. DEFINE VARIABLE cParameter AS CHARACTER NO-UNDO. DEFINE VARIABLE cLogFile AS CHARACTER NO-UNDO. DEFINE VARIABLE cProgramm AS CHARACTER NO-UNDO. DEFINE VARIABLE cAnmeldung AS CHARACTER NO-UNDO. DEFINE VARIABLE cKBez AS CHARACTER NO-UNDO. DEFINE VARIABLE cInstallation AS CHARACTER NO-UNDO. DEFINE VARIABLE lVGebinde AS LOGICAL NO-UNDO. DEFINE VARIABLE cPrice_per AS CHARACTER NO-UNDO. DEFINE VARIABLE iMinOrderCount AS INTEGER NO-UNDO. DEFINE VARIABLE lLoeschen AS LOGICAL NO-UNDO. DEFINE VARIABLE lTotal AS LOGICAL NO-UNDO. DEFINE VARIABLE iArtnr AS INTEGER NO-UNDO. DEFINE VARIABLE cURL AS CHARACTER NO-UNDO. DEFINE VARIABLE cApiKeyValue AS CHARACTER NO-UNDO. DEFINE VARIABLE cServerNameIndication AS CHARACTER NO-UNDO. DEFINE VARIABLE cWgr AS CHARACTER NO-UNDO. DEFINE VARIABLE iArtstatus AS INTEGER NO-UNDO EXTENT 10. DEFINE TEMP-TABLE tArtstYBM FIELD cProdId AS CHARACTER FIELD eStatus AS CHARACTER FIELD cCategory AS CHARACTER FIELD cName AS CHARACTER FIELD iInhaltKGeb AS INTEGER FIELD eVessel AS CHARACTER FIELD iMinOrderCount AS INTEGER FIELD iPrice AS INTEGER FIELD eVGeb AS CHARACTER FIELD iVGeb AS INTEGER FIELD eGGeb AS CHARACTER FIELD iGGeb AS INTEGER FIELD lYBM AS LOGICAL FIELD lOK AS LOGICAL FIELD iStatus AS INTEGER FIELD cPrice_per AS CHARACTER INDEX tArtst-k1 IS PRIMARY cProdId . DEFINE TEMP-TABLE tAufze LIKE Aufze FIELD Knr AS INTEGER FIELD Datum AS DATE FIELD lAktion AS LOGICAL INIT TRUE . DEFINE VARIABLE htAufze AS HANDLE NO-UNDO. htAufze = TEMP-TABLE tAufze:DEFAULT-BUFFER-HANDLE. DEFINE BUFFER bArtst FOR Artst. DEFINE TEMP-TABLE tArtst LIKE Artst FIELD nPreis AS DECIMAL FIELD iPreisArt AS INTEGER FIELD lAktion AS LOGICAL FIELD iStatus AS INTEGER FIELD lVGebinde AS LOGICAL FIELD iKGeb_Inhalt AS INTEGER . DEFINE TEMP-TABLE tWarenGrp LIKE WarenGrp FIELD lOK AS LOGICAL FIELD lKGebinde AS LOGICAL . { propertiesYBM.i } { ybm_product.i } { ttArtst.i } { funktionen.i } /* ******************** Preprocessor Definitions ******************** */ /* ************************ Function Prototypes ********************** */ FUNCTION deleteProduct RETURNS LOGICAL (ipcProdId AS CHARACTER) FORWARD. FUNCTION postProduct RETURNS LOGICAL ( ) FORWARD. FUNCTION setProductToStatus RETURNS LOGICAL (ipcProdId AS CHARACTER, ipcStatus AS CHARACTER) FORWARD. FUNCTION updateProduct RETURNS LOGICAL ( ) FORWARD. /* *************************** Main Block *************************** */ cAnmeldung = SUBSTITUTE ('&1&4&2&4&3', 'SYSTEM', 'SYSTEM', '1000', CHR(01) ). RUN ANMELDUNG ( cAnmeldung ) NO-ERROR. cParameter = SESSION:PARAMETER. cParameter = REPLACE(cParameter, ',', ';'). /*cParameter = ''. */ /*lLoeschen = FALSE.*/ IF cParameter = '' OR cParameter = ? THEN cParameter = '1000;TEST'. DO ii = 1 TO NUM-ENTRIES(cParameter, ';'): CASE ii. WHEN 1 THEN cFirma = ENTRY(ii, cParameter, ';'). WHEN 2 THEN cTestLive = ENTRY(ii, cParameter, ';'). WHEN 3 THEN lLoeschen = (IF ENTRY(ii, cParameter, ';') BEGINS 'n' THEN FALSE ELSE TRUE ). WHEN 4 THEN iArtnr = INTEGER(ENTRY(ii, cParameter, ';')). WHEN 5 THEN lTotal = (IF ENTRY(ii, cParameter, ';') BEGINS 'T' THEN TRUE ELSE FALSE ). /* Alle Artikel */ END CASE. END. /*lLoeschen = TRUE.*/ CASE cTestLive: WHEN 'LIVE' THEN DO: oYourBarMateHandler = NEW YourBarMateHandler(). oYourBarMateHandler:cURL = cURI_Products. oYourBarMateHandler:cApiKey = cApiName. oYourBarMateHandler:cApiKeyValue = cApiKey. oYourBarMateHandler:cServerNameIndicator = cServerNameIndicator. oYourBarMateHandler:lDebug = FALSE. END. WHEN 'TEST' THEN DO: oYourBarMateHandler = NEW YourBarMateHandler(). oYourBarMateHandler:cURL = cURI_ProductsDev. oYourBarMateHandler:cApiKey = cApiName. oYourBarMateHandler:cApiKeyValue = cApiKeyDev. oYourBarMateHandler:cServerNameIndicator = cServerNameIndicatorDev. oYourBarMateHandler:lDebug = TRUE. END. END CASE. cURL = oYourBarMateHandler:cURL. cApiKeyValue = oYourBarMateHandler:cApiKeyValue. cServerNameIndication = oYourBarMateHandler:cServerNameIndicator. cInstallation = DYNAMIC-FUNCTION ('getInstallation':U). cProgramm = ENTRY(1, THIS-PROCEDURE:NAME, '.'). IF R-INDEX(cProgramm, '\') > 0 OR R-INDEX(cProgramm, '/') > 0 THEN DO: cProgramm = REPLACE(cProgramm, '\', '/'). ii = R-INDEX(cProgramm, '/') + 1. cProgramm = TRIM(SUBSTRING(cProgramm,ii)). END. cLogFile = DYNAMIC-FUNCTION ('getLogFilePfad':U) + cProgramm + '_' + cTestLive + '.log'. RUN writeLogFile.p ( cProgramm, cLogFile, SUBSTITUTE('Start ProduktUpdate &1', cTestLive) ). /* ---------------------------------------------------------- */ /* Bei YourBarMate vorhandene Warengruppen holen */ /* ---------------------------------------------------------- */ RUN ybmgetCategories.p ( OUTPUT TABLE tWarenGrp ). ii = 0. FOR EACH tWarenGrp NO-LOCK: ii = ii + 1. END. RUN writeLogFile.p ( cProgramm, cLogFile, SUBSTITUTE('Anzahl Warengruppen bei YBM &1', ii) ). FOR EACH WarenGrp NO-LOCK WHERE WarenGrp.Firma = cFirma: cWgr = STRING(WarenGrp.Wgr,'999'). FIND FIRST tWarenGrp NO-LOCK WHERE tWarenGrp.Wgr = WarenGrp.Wgr NO-ERROR. IF AVAILABLE tWarenGrp THEN NEXT. CREATE tWarenGrp. BUFFER-COPY WarenGrp TO tWarenGrp ASSIGN tWarenGrp.lOK = FALSE tWarenGrp.lKGebinde = FALSE. END. ii = 0. i1 = 0. FOR EACH tWarenGrp: FIND FIRST WarenGrp NO-LOCK WHERE WarenGrp.Firma = cFirma AND WarenGrp.Wgr = tWarenGrp.Wgr NO-ERROR. IF NOT AVAILABLE WarenGrp THEN DO: tWarenGrp.lOK = FALSE. i1 = i1 + 1. NEXT. END. IF NOT WarenGrp.lShopB2B AND NOT WarenGrp.lShopB2C THEN DO: tWarenGrp.lOK = FALSE. ii = ii + 1. NEXT. END. tWarenGrp.lKGebinde = (IF WarenGrp.Int_2 = 0 THEN FALSE ELSE TRUE). END. RUN writeLogFile.p ( cProgramm, cLogFile, SUBSTITUTE('Anzahl gelöschte Warengruppen bei YBM &1', i1) ). RUN writeLogFile.p ( cProgramm, cLogFile, SUBSTITUTE('Anzahl ungültige Warengruppen bei YBM &1', ii) ). /* ---------------------------------------------------------- */ /* Bei YourBarMate vorhandene Artikel holen */ /* ---------------------------------------------------------- */ RUN ybmgetProductList.p ( OUTPUT TABLE ttArtst ). ii = 0. FOR EACH ttArtst NO-LOCK: ii = ii + 1. END. RUN writeLogFile.p ( cProgramm, cLogFile, SUBSTITUTE('Anzahl Artikel bei YBM &1', ii) ). OUTPUT TO 'C:\TEMP\ttArtst.csv' NO-MAP NO-CONVERT. FOR EACH ttArtst NO-LOCK: EXPORT DELIMITER ';' ttArtst. END. OUTPUT CLOSE. /* ---------------------------------------------------------------------- */ /* Artikel bei YBM die geloescht werden müssen weil falsche Warengruppe */ /* ---------------------------------------------------------------------- */ ii = 0. i1 = 0. FOR EACH ttArtst: IF NOT lLoeschen THEN DO: FIND FIRST tWarenGrp NO-LOCK WHERE tWarenGrp.Firma = cFirma AND tWarenGrp.Wgr = INTEGER(ttArtst.cCategorie) AND tWarenGrp.lOK = TRUE NO-ERROR. IF AVAILABLE tWarenGrp THEN NEXT. END. ii = ii + 1. lRetVal = DYNAMIC-FUNCTION ('deleteProduct':U, ttArtst.cProdId) NO-ERROR. IF NOT lRetVal THEN DO: RUN writeLogFile.p ( cProgramm, cLogFile, SUBSTITUTE('Artikel &1 mit Warengrp &2 konnte bei YBM nicht gelöscht werden / muss Inaktiv gesetzt oder in andere Warengruppe verschoben werden', ttArtst.cProdId, ttArtst.cCategorie ) ). NEXT. END. i1 = i1 + 1. RUN writeLogFile.p ( cProgramm, cLogFile, SUBSTITUTE('Artikel &1 bei YBM gelöscht', ttArtst.cProdId) ). IF lLoeschen THEN DELETE ttArtst. END. RUN writeLogFile.p ( cProgramm, cLogFile, SUBSTITUTE('&1 Artikel zum löschen, &2 Artikel gelöscht', ii, i1) ). /* ---------------------------------------------------------- */ /* Artikel lesen */ /* ---------------------------------------------------------- */ ii = 0. FOR EACH bArtst NO-LOCK WHERE bArtst.Firma = cFirma AND ((iArtnr > 0 AND bArtst.Artnr = iArtnr) OR (iArtnr = 0 AND bArtst.Artnr > 0)) : FIND FIRST tWarenGrp NO-LOCK WHERE tWarenGrp.Firma = bArtst.Firma AND tWarenGrp.Wgr = bArtst.Wg_Grp AND tWarenGrp.lOK = TRUE NO-ERROR. IF NOT AVAILABLE tWarenGrp THEN NEXT. cId = SUBSTITUTE('&1-&2-&3', STRING(bArtst.Artnr,'999999'), STRING(bArtst.Inhalt,'9999'), STRING(bArtst.Jahr,'9999')). FIND FIRST ttArtst NO-LOCK WHERE ttArtst.cProdId = cId NO-ERROR. IF AVAILABLE ttArtst THEN ttArtst.lGeMIS = TRUE. lRetVal = (IF AVAILABLE ttArtst THEN TRUE ELSE FALSE). lPreisMut = FALSE. FOR EACH ArtPreis NO-LOCK WHERE ArtPreis.Firma = bArtst.Firma AND ArtPreis.Artnr = bArtst.Artnr AND ArtPreis.Inhalt = bArtst.Inhalt AND ArtPreis.Jahr = bArtst.Jahr AND ArtPreis.Ab_Datum >= (TODAY - 2) AND ArtPreis.Ab_Datum <= (TODAY): lPreisMut = TRUE. LEAVE. END. FOR EACH AktPreis NO-LOCK WHERE AktPreis.Firma = bArtst.Firma AND AktPreis.Artnr = bArtst.Artnr AND AktPreis.Inhalt = bArtst.Inhalt AND AktPreis.Jahr = bArtst.Jahr AND AktPreis.Ab_Datum >= (TODAY - 2) AND AktPreis.Ab_Datum <= (TODAY): lPreisMut = TRUE. LEAVE. END. IF NOT lTest AND NOT lTotal THEN DO: IF AVAILABLE ttArtst AND NOT lPreisMut THEN DO: CASE WEEKDAY(TODAY): WHEN 01 THEN. OTHERWISE DO: IF bArtst.Mdat = ? THEN DO: IF bArtst.Edat < (TODAY - 30) THEN NEXT. END. ELSE DO: IF bArtst.Mdat < (TODAY - 7) THEN NEXT. END. END. END CASE. END. END. lRetVal = (IF AVAILABLE ttArtst THEN TRUE ELSE FALSE). IF NOT bArtst.Aktiv AND NOT lRetVal THEN NEXT. IF bArtst.Ausverk = 9 AND NOT lRetVal THEN NEXT. lVGebinde = (IF tWarenGrp.Int_2 = 0 THEN TRUE ELSE FALSE). FIND FIRST ProdGrp NO-LOCK WHERE ProdGrp.Firma = bArtst.Firma AND ProdGrp.Wgr = bArtst.Wg_Grp AND ProdGrp.Prod_Grp = bArtst.Prod_Grp NO-ERROR. IF AVAILABLE ProdGrp THEN DO: lVGebinde = (IF ProdGrp.Int_2 = 0 THEN TRUE ELSE FALSE). END. CREATE tArtst. BUFFER-COPY bArtst TO tArtst ASSIGN tArtst.lVGebinde = lVGebinde . IF bArtst.Aktiv AND NOT lRetVal THEN tArtst.iStatus = 0. IF bArtst.Aktiv AND lRetVal THEN tArtst.iStatus = 1. IF NOT bArtst.Aktiv AND lRetVal THEN tArtst.iStatus = 9. IF bArtst.Aktiv AND bArtst.Ausverk = 9 AND lRetVal THEN tArtst.iStatus = 8. ii = ii + 1. CASE tArtst.iStatus: WHEN 0 THEN iArtstatus[01] = iArtstatus[01] + 1. WHEN 1 THEN iArtstatus[02] = iArtstatus[02] + 1. WHEN 2 THEN iArtstatus[03] = iArtstatus[03] + 1. WHEN 3 THEN iArtstatus[04] = iArtstatus[04] + 1. WHEN 4 THEN iArtstatus[05] = iArtstatus[05] + 1. WHEN 5 THEN iArtstatus[06] = iArtstatus[06] + 1. WHEN 6 THEN iArtstatus[07] = iArtstatus[07] + 1. WHEN 7 THEN iArtstatus[08] = iArtstatus[08] + 1. WHEN 8 THEN iArtstatus[09] = iArtstatus[09] + 1. WHEN 9 THEN iArtstatus[10] = iArtstatus[10] + 1. END CASE. END. RUN writeLogFile.p ( cProgramm, cLogFile, SUBSTITUTE('Anzahl zur Verarbeitung gelesene Artikel &1', ii) ). DO ii = 1 TO 10: IF iArtstatus[ii] = 0 THEN NEXT. RUN writeLogFile.p ( cProgramm, cLogFile, SUBSTITUTE('Anzahl Artikel mit Status &1 -> &2', ii - 1, STRING(iArtstatus[ii],'zz,zz9')) ). END. /* ---------------------------------------------------------- */ /* Preis des Artikel an Hand der Kundennummer 3259 ermitteln */ /* ---------------------------------------------------------- */ FOR EACH tArtst WHERE tArtst.iStatus < 8: EMPTY TEMP-TABLE tAufze. CREATE tAufze. ASSIGN tAufze.Firma = tArtst.Firma tAufze.Pos = 10 tAufze.Artnr = tArtst.Artnr tAufze.Inhalt = tArtst.Inhalt tAufze.Jahr = tArtst.Jahr tAufze.Knr = 3259 tAufze.Datum = TODAY tAufze.lAktion = FALSE . ii = DYNAMIC-FUNCTION ('fillAufze':U, INPUT-OUTPUT htAufze) NO-ERROR. ASSIGN tAufze.KGeb_Be = 1 tAufze.KGeb_Me = 1 tAufze.MBest = 1 tAufze.MGeli = 1 . ii = DYNAMIC-FUNCTION ('getPreisAufze':U, INPUT-OUTPUT htAufze) NO-ERROR. ASSIGN tArtst.nPreis = tAufze.Preis tArtst.iPreisArt = tAufze.PreisArt tArtst.lAktion = tAufze.lAktion. END. ii = 0. FOR EACH tArtst WHERE tArtst.iStatus < 8: cId = SUBSTITUTE('&1-&2-&3', STRING(tArtst.Artnr,'999999'), STRING(tArtst.Inhalt,'9999'), STRING(tArtst.Jahr,'9999')). FIND KGebinde NO-LOCK WHERE KGebinde.Firma = tArtst.Firma AND KGebinde.Geb_Cd = tArtst.KGeb_Cd NO-ERROR. FIND VGebinde NO-LOCK WHERE VGebinde.Firma = tArtst.Firma AND VGebinde.Geb_Cd = tArtst.VGeb_Cd NO-ERROR. FIND GGebinde NO-LOCK WHERE GGebinde.Firma = tArtst.Firma AND GGebinde.Geb_Cd = tArtst.GGeb_Cd NO-ERROR. FIND FIRST Artbez NO-LOCK OF tArtst. cName = TRIM(REPLACE((Artbez.Bez1 + ' ' + Artbez.Bez2), ' ', ' ')). cKBez = ''. cPrice_per = 'vessel'. iMinOrderCount = (IF tArtst.lVGebinde THEN VGebinde.Inhalt ELSE 1). CASE cInstallation: /* Ganze Artikelbezeichnung ermitteln */ WHEN 'oswald' THEN DO: DO WHILE TRUE: IF INDEX(KGebinde.Bez, 'cl') > 0 THEN DO: cKBez = ENTRY(1, KGebinde.KBez, ' '). i1 = NUM-ENTRIES(KGebinde.Bez, ' '). DO i2 = 2 TO NUM-ENTRIES(KGebinde.Bez, ' '): cKBez = cKBez + ' ' + ENTRY(i2, KGebinde.Bez, ' '). cKBez = TRIM(cKBez). END. LEAVE. END. IF INDEX(KGebinde.Bez, 'dl') > 0 THEN DO: cKBez = ENTRY(1, KGebinde.KBez, ' '). i1 = NUM-ENTRIES(KGebinde.Bez, ' '). DO i2 = 2 TO NUM-ENTRIES(KGebinde.Bez, ' '): cKBez = cKBez + ' ' + ENTRY(i2, KGebinde.Bez, ' '). cKBez = TRIM(cKBez). END. LEAVE. END. IF INDEX(KGebinde.Bez, 'Liter') > 0 OR INDEX(KGebinde.Bez, 'Lt') > 0 THEN DO: cKBez = ENTRY(1, KGebinde.KBez, ' '). i1 = NUM-ENTRIES(KGebinde.Bez, ' '). DO i2 = 2 TO NUM-ENTRIES(KGebinde.Bez, ' '): cKBez = cKBez + ' ' + ENTRY(i2, KGebinde.Bez, ' '). cKBez = TRIM(cKBez). END. LEAVE. END. cKBez = KGebinde.KBez. LEAVE. END. END. OTHERWISE DO: cKBez = KGebinde.KBez. i1 = NUM-ENTRIES(cKBez, ' '). IF i1 > 0 THEN cKBez = TRIM(ENTRY(i1, cKBez, ' ')). END. END. cName = TRIM(SUBSTRING(cName,01,60 - LENGTH(cKBez))) + ', ' + cKBez. cKGebinde = ''. cVGebinde = ''. cGGebinde = ''. DO WHILE TRUE: IF INDEX(KGebinde.Bez, 'cl') > 0 OR INDEX(KGebinde.Bez, 'lt') > 0 OR INDEX(KGebinde.Bez, 'Liter') > 0 OR INDEX(KGebinde.Bez, 'dl') > 0 THEN DO: cKGebinde = 'cl'. LEAVE. END. cKGebinde = 'quantity'. LEAVE. END. tArtst.iKGeb_Inhalt = KGebinde.Inhalt. iVGebInhalt = 0. DO WHILE TRUE: IF NOT AVAILABLE VGebinde THEN LEAVE. IF cKGebinde = 'quantity' AND INDEX(VGebinde.Bez, 'Box') > 0 THEN DO: IF VGebinde.Inhalt > 1 THEN DO: cVGebinde = 'box'. iVGebInhalt = VGebinde.Inhalt. LEAVE. END. LEAVE. END. IF INDEX(VGebinde.Bez, 'Tank' ) > 0 OR INDEX(VGebinde.Bez, 'Box' ) > 0 OR INDEX(VGebinde.Bez, 'Bidon') > 0 THEN DO: IF VGebinde.Inhalt > 1 THEN DO: tArtst.iKGeb_Inhalt = KGebinde.Inhalt * VGebinde.Inhalt. END. ELSE DO: tArtst.nPreis = tArtst.nPreis / (KGebinde.Inhalt / 100). END. cPrice_per = 'l'. iMinOrderCount = 1. LEAVE. END. iVGebInhalt = VGebinde.Inhalt. IF VGebinde.Inhalt < 2 THEN LEAVE. IF INDEX(VGebinde.Bez, 'Har') > 0 OR INDEX(VGebinde.Bez, 'Box') > 0 OR INDEX(VGebinde.Bez, 'Kist') > 0 THEN DO: cVGebinde = 'box'. LEAVE. END. IF INDEX(VGebinde.Bez, 'Kar') > 0 THEN DO: cVGebinde = 'carton'. LEAVE. END. IF INDEX(VGebinde.Bez, 'Pack') > 0 OR INDEX(VGebinde.Bez, 'Pak') > 0 OR INDEX(VGebinde.Bez, 'Sch') > 0 THEN DO: cVGebinde = 'pack'. LEAVE. END. cVGebinde = 'box'. LEAVE. END. DO WHILE TRUE: IF NOT AVAILABLE GGebinde THEN LEAVE. IF GGebinde.Inhalt < 2 THEN LEAVE. cGGebinde = 'pallet'. LEAVE. END. CREATE tArtstYBM. ASSIGN tArtstYBM.cProdId = cId tArtstYBM.cCategory = STRING(tArtst.Wg_Grp,'999') tArtstYBM.cName = cName tArtstYBM.iInhaltKGeb = (IF tArtst.iKGeb_Inhalt > 0 THEN tArtst.iKGeb_Inhalt ELSE 1) tArtstYBM.iPrice = (IF cInstallation = 'oswald' THEN tArtst.nPreis * 100 ELSE 0) tArtstYBM.eVessel = cKGebinde tArtstYBM.iStatus = tArtst.iStatus tArtstYBM.cPrice_per = cPrice_per . IF cVGebinde <> '' THEN DO: ASSIGN tArtstYBM.eVGeb = cVGebinde tArtstYBM.iVGeb = iVGebInhalt. END. ELSE DO: ASSIGN tArtstYBM.eVGeb = '' tArtstYBM.iVGeb = 0. END. IF cGGebinde <> '' THEN DO: ASSIGN tArtstYBM.eGGeb = cGGebinde tArtstYBM.iGGeb = GGebinde.Inhalt. END. CASE tArtst.iStatus: WHEN 0 THEN tArtstYBM.eStatus = 'ACTIVE' . WHEN 1 THEN tArtstYBM.eStatus = 'ACTIVE' . WHEN 8 THEN tArtstYBM.eStatus = 'OUT_OF_STOCK'. WHEN 9 THEN tArtstYBM.eStatus = 'INACTIVE' . END CASE. tArtstYBM.iMinOrderCount = iMinOrderCount. ii = ii + 1. END. RUN writeLogFile.p ( cProgramm, cLogFile, SUBSTITUTE('Anzahl aufbereitete Artikel &1', ii) ). DEFINE VARIABLE htArtYBM AS HANDLE NO-UNDO. htArtYBM = TEMP-TABLE tArtstYBM:DEFAULT-BUFFER-HANDLE. htArtYBM:WRITE-XML( "File", "C:\TEMP\tArtstYBM.xml", TRUE, /* Formatted */ "UTF-8", /* encoding */ ?, /* schema-location */ ?, /* write-xml-schema */ ?, /* min-xmlschema */ ?, /* write-before-image */ TRUE). /* ommit-initial-values */ /* ------------------------------------------ */ /* Alle inaktiven Artikel */ /* ------------------------------------------ */ ii = 0. FOR EACH tArtst WHERE tArtst.iStatus = 9: cId = SUBSTITUTE('&1-&2-&3':U, STRING(tArtst.Artnr,'999999'), STRING(tArtst.Inhalt,'9999'), STRING(tArtst.Jahr,'9999')). FIND FIRST ttArtst WHERE ttArtst.cProdId = cId NO-ERROR. IF AVAILABLE ttArtst AND ttArtst.eStatus = 'INACTIVE' THEN NEXT. lRetVal = DYNAMIC-FUNCTION ('deleteProduct':U, cId ) NO-ERROR. IF NOT lRetVal THEN DO: lRetVal = DYNAMIC-FUNCTION ('setProductToStatus':U, cId, 'INACTIVE') NO-ERROR. END. IF lRetVal THEN ii = ii + 1. END. RUN writeLogFile.p ( cProgramm, cLogFile, SUBSTITUTE('Anzahl inaktivierte Artikel &1', ii) ). /* ------------------------------------------ */ /* Alle neuen Artikel */ /* ------------------------------------------ */ iok = 0. inok = 0. FOR EACH tArtstYBM WHERE tArtstYBM.iStatus = 0: EMPTY TEMP-TABLE tProduct . EMPTY TEMP-TABLE tVessel . EMPTY TEMP-TABLE tBundle . EMPTY TEMP-TABLE tPalletBundle . CREATE tProduct. ASSIGN tProduct.cId = tArtstYBM.cProdId tProduct.cCategory = tArtstYBM.cCategory tProduct.cName = tArtstYBM.cName tProduct.cOrder_by = 'vessel' tProduct.cPrice_per = tArtstYBM.cPrice_per tProduct.iPrice = tArtstYBM.iPrice tProduct.iMinOrderCount = tArtstYBM.iMinOrderCount tProduct.eStatus = 'ACTIVE' tProduct.rtProduct = RECID(tProduct) . CREATE tVessel. ASSIGN tVessel.iSize = tArtstYBM.iInhaltKGeb tVessel.rtProduct = tProduct.rtProduct tVessel.rtVessel = RECID(tVessel) . CASE tArtstYBM.eVessel: WHEN 'cl' THEN tVessel.Unit = ProductsVesselUnit:cl:TOSTRING (). OTHERWISE tVessel.Unit = ProductsVesselUnit:quantity:TOSTRING (). END CASE. IF tArtstYBM.eVGeb <> '' THEN DO: CREATE tBundle. ASSIGN tBundle.iSize = tArtstYBM.iVGeb tBundle.eType = tArtstYBM.eVGeb tBundle.rtProduct = tProduct.rtProduct tBundle.rtBundle = RECID(tBundle) tBundle.iInd = 1 . END. DO WHILE tArtstYBM.eGGeb <> '' : CREATE tBundle. ASSIGN tBundle.iSize = tArtstYBM.iGGeb tBundle.eType = tArtstYBM.eGGeb tBundle.rtProduct = tProduct.rtProduct tBundle.rtBundle = RECID(tBundle) tBundle.iInd = 2 . IF tBundle.eType <> 'pallet' THEN LEAVE. IF tArtstYBM.eVGeb = '' THEN LEAVE. CREATE tPalletBundle. ASSIGN tPalletBundle.eType = tArtstYBM.eVGeb tPalletBundle.iSize = tArtstYBM.iVGeb tPalletBundle.rtBundle = RECID(tBundle) tPalletBundle.rtPalletBundle = RECID(tPalletBundle) . LEAVE. END. lRetVal = DYNAMIC-FUNCTION ('postProduct':U ) NO-ERROR. IF NOT lRetVal THEN inok = inok + 1. ELSE iok = iok + 1. END. RUN writeLogFile.p ( cProgramm, cLogFile, SUBSTITUTE('Anzahl neue Artikel &1 / Fehler = &2', iok, inok ) ). /* ------------------------------------------ */ /* Alle ausverkauften Artikel */ /* ------------------------------------------ */ ii = 0. FOR EACH tArtstYBM WHERE tArtstYBM.iStatus = 8: lRetVal = DYNAMIC-FUNCTION ('setProductToStatus':U, tArtstYBM.cProdId, 'OUT_OF_STOCK') NO-ERROR. IF NOT lRetVal THEN DO: /* RUN writeLogFile.p ( cProgramm, cLogFile, SUBSTITUTE('Fehler ausverkaufte Artikel &1 -> &2', tArtstYBM.cProdId, opErrorMessage) ).*/ END. ELSE ii = ii + 1. END. RUN writeLogFile.p ( cProgramm, cLogFile, SUBSTITUTE('Anzahl ausverkaufte Artikel &1', ii) ). /* ------------------------------------------ */ /* Alle mutierten Artikel */ /* ------------------------------------------ */ iok = 0. inok = 0. FOR EACH tArtstYBM WHERE tArtstYBM.iStatus = 1: EMPTY TEMP-TABLE tProduct . EMPTY TEMP-TABLE tVessel . EMPTY TEMP-TABLE tBundle . EMPTY TEMP-TABLE tPalletBundle . CREATE tProduct. ASSIGN tProduct.cId = tArtstYBM.cProdId tProduct.cCategory = tArtstYBM.cCategory tProduct.cName = tArtstYBM.cName tProduct.cOrder_by = 'vessel' tProduct.cPrice_per = tArtstYBM.cPrice_per tProduct.iPrice = tArtstYBM.iPrice tProduct.iMinOrderCount = tArtstYBM.iMinOrderCount tProduct.eStatus = 'ACTIVE' tProduct.rtProduct = RECID(tProduct) . CREATE tVessel. ASSIGN tVessel.iSize = tArtstYBM.iInhaltKGeb tVessel.rtProduct = tProduct.rtProduct tVessel.rtVessel = RECID(tVessel) . CASE tArtstYBM.eVessel: WHEN 'cl' THEN tVessel.Unit = ProductsVesselUnit:cl:TOSTRING (). OTHERWISE tVessel.Unit = ProductsVesselUnit:quantity:TOSTRING (). END CASE. IF tArtstYBM.eVGeb <> '' THEN DO: CREATE tBundle. ASSIGN tBundle.iSize = tArtstYBM.iVGeb tBundle.eType = tArtstYBM.eVGeb tBundle.rtProduct = tProduct.rtProduct tBundle.rtBundle = RECID(tBundle) tBundle.iInd = 1 . END. DO WHILE tArtstYBM.eGGeb <> '' : CREATE tBundle. ASSIGN tBundle.iSize = tArtstYBM.iGGeb tBundle.eType = tArtstYBM.eGGeb tBundle.rtProduct = tProduct.rtProduct tBundle.rtBundle = RECID(tBundle) tBundle.iInd = 2 . IF tBundle.eType <> 'pallet' THEN LEAVE. IF tArtstYBM.eVGeb = '' THEN LEAVE. CREATE tPalletBundle. ASSIGN tPalletBundle.eType = tArtstYBM.eVGeb tPalletBundle.iSize = tArtstYBM.iVGeb tPalletBundle.rtBundle = RECID(tBundle) tPalletBundle.rtPalletBundle = RECID(tPalletBundle) . LEAVE. END. lRetVal = DYNAMIC-FUNCTION ('updateProduct':U ) NO-ERROR. IF NOT lRetVal THEN inok = inok + 1. ELSE iok = iok + 1. END. RUN writeLogFile.p ( cProgramm, cLogFile, SUBSTITUTE('Anzahl mutierte Artikel &1 / Fehler = &2', iok, inok) ). RUN writeLogFile.p ( cProgramm, cLogFile, '' ). RUN writeLogFile.p ( cProgramm, cLogFile, SUBSTITUTE('Ende des Produktupdates &1', '') ). RUN writeLogFile.p ( cProgramm, cLogFile, '' ). RUN writeLogFile.p ( cProgramm, cLogFile, '' ). QUIT. /* ************************ Function Implementations ***************** */ FUNCTION deleteProduct RETURNS LOGICAL ( ipcProdId AS CHARACTER ): /*------------------------------------------------------------------------------*/ /* Purpose: Super Override */ /* Parameters: */ /* Notes: */ /*------------------------------------------------------------------------------*/ DEFINE VARIABLE lOK AS LOGICAL NO-UNDO. DEFINE VARIABLE cProduct AS LONGCHAR NO-UNDO. DEFINE VARIABLE cUrlWithID AS CHARACTER NO-UNDO. DEFINE VARIABLE oResponse AS IHttpResponse NO-UNDO. DEFINE VARIABLE oResponseMessage AS JsonObject NO-UNDO. DEFINE VARIABLE cResponseMessage AS CHARACTER NO-UNDO. DEFINE VARIABLE oParser AS ObjectModelParser NO-UNDO. DEFINE VARIABLE oBody AS JsonObject NO-UNDO. DEFINE VARIABLE cMeldung AS CHARACTER NO-UNDO. cUrlWithID = cURL + '/' + ipcProdId. oBody = NEW JsonObject(). lOK = HttpHandler:delete(INPUT cURLwithID, INPUT cApiName, INPUT cApiKeyValue, INPUT cServerNameIndication, INPUT oBody, OUTPUT opErrorMessage, OUTPUT oResponse). oParser = NEW ObjectModelParser(). oResponseMessage = CAST(oParser:Parse(CAST(oResponse:Entity, JsonObject):GetJsonText()), JsonObject). IF oResponseMessage:has('code') THEN cMeldung = oResponseMessage:GetCharacter("code"). oResponseMessage:WRITE(cResponseMessage, FALSE). cResponseMessage = SUBSTITUTE ('Status-Code = &1, Artikel &2 / &3', oResponse:StatusCode, ipcProdId, cResponseMessage). RUN writeLogFile.p ('deleteProduct', cLogFile, cResponseMessage ). IF NOT lOK AND INDEX(cMeldung, 'PRODUCT_HAS_CUSTOMERS') > 0 THEN DO: lOK = DYNAMIC-FUNCTION ('setProductToStatus':U, ipcProdId, 'INACTIVE') NO-ERROR. END. DELETE OBJECT oParser NO-ERROR. DELETE OBJECT oResponseMessage NO-ERROR. DELETE OBJECT oBody NO-ERROR. RETURN lOK. END FUNCTION. FUNCTION postProduct RETURNS LOGICAL ( ): /*------------------------------------------------------------------------------*/ /* Purpose: Super Override */ /* Parameters: */ /* Notes: */ /*------------------------------------------------------------------------------*/ DEFINE VARIABLE lOK AS LOGICAL NO-UNDO. DEFINE VARIABLE cProduct AS LONGCHAR NO-UNDO. DEFINE VARIABLE oResponse AS IHttpResponse NO-UNDO. DEFINE VARIABLE oResponseMessage AS JsonObject NO-UNDO. DEFINE VARIABLE cResponseMessage AS CHARACTER NO-UNDO. DEFINE VARIABLE oParser AS ObjectModelParser NO-UNDO. DEFINE VARIABLE cBody AS CHARACTER NO-UNDO. DEFINE VARIABLE lBundles AS LOGICAL NO-UNDO. FIND FIRST tProduct. /* tProduct.cName = CODEPAGE-CONVERT(tProduct.cName, SESSION:CHARSET, "utf-8").*/ oProduct = NEW JsonObject(). oProduct:READ(htProduct). FIND FIRST tVessel NO-ERROR. IF AVAILABLE tVessel THEN DO: oVessel = NEW JsonObject(). oVessel:READ(htVessel). END. lBundles = FALSE. oBundles = NEW JsonArray(). FOR EACH tBundle USE-INDEX tBundle-k1 WHERE tBundle.iSize > 0: oBundle = NEW JsonObject(). oBundle:READ(htBundle). FOR EACH tPalletBundle NO-LOCK WHERE tPalletBundle.rtBundle = tBundle.rtBundle: oPalletBundle = NEW JsonObject(). oPalletBundle:Read(htPalletBundle). oBundle:Add('pallet_bundle', oPalletBundle). END. oBundles:Add(oBundle). lBundles = TRUE. END. oProduct:Add('vessel' , oVessel). /* IF lBundles THEN oProduct:Add('bundles', oBundles).*/ oProduct:Add('bundles', oBundles). oProduct:WRITE(cBody, TRUE). /* RUN writeLogFile.p ('postProduct', cLogFile, cBody ).*/ lOK = HttpHandler:post(INPUT cURL, INPUT cApiName, INPUT cApiKeyValue, INPUT cServerNameIndication, INPUT oProduct, OUTPUT opErrorMessage, OUTPUT oResponse). oParser = NEW ObjectModelParser(). oResponseMessage = CAST(oParser:Parse(CAST(oResponse:Entity, JsonObject):GetJsonText()), JsonObject). oResponseMessage:WRITE(cResponseMessage, FALSE). cResponseMessage = SUBSTITUTE ('Status-Code = &1, Artikel &2 / &3', oResponse:StatusCode, tProduct.cId, cResponseMessage). RUN writeLogFile.p ('postProduct', cLogFile, cResponseMessage ). IF NOT lOK THEN RUN writeLogFile.p ('postProduct', cLogFile, cBody ). DELETE OBJECT oParser NO-ERROR. DELETE OBJECT oResponseMessage NO-ERROR. DELETE OBJECT oProduct NO-ERROR. DELETE OBJECT oVessel NO-ERROR. DELETE OBJECT oBundle NO-ERROR. DELETE OBJECT oPalletBundle NO-ERROR. DELETE OBJECT oBundles NO-ERROR. RETURN lOK. END FUNCTION. FUNCTION setProductToStatus RETURNS LOGICAL ( ipcProdId AS CHARACTER, ipcStatus AS CHARACTER ): /*------------------------------------------------------------------------------*/ /* Purpose: Super Override */ /* Parameters: */ /* Notes: */ /*------------------------------------------------------------------------------*/ DEFINE VARIABLE lOK AS LOGICAL NO-UNDO. DEFINE VARIABLE cProduct AS LONGCHAR NO-UNDO. DEFINE VARIABLE cUrlWithID AS CHARACTER NO-UNDO. DEFINE VARIABLE oResponse AS IHttpResponse NO-UNDO. DEFINE VARIABLE oResponseMessage AS JsonObject NO-UNDO. DEFINE VARIABLE cResponseMessage AS CHARACTER NO-UNDO. DEFINE VARIABLE oParser AS ObjectModelParser NO-UNDO. DEFINE VARIABLE oBody AS JsonObject NO-UNDO. cUrlWithID = cURL + '/' + ipcProdId. oBody = NEW JsonObject(). oBody:Add('status', ipcStatus). lOK = HttpHandler:patch(INPUT cURLwithID, INPUT cApiName, INPUT cApiKeyValue, INPUT cServerNameIndication, INPUT oBody, OUTPUT opErrorMessage, OUTPUT oResponse). oParser = NEW ObjectModelParser(). oResponseMessage = CAST(oParser:Parse(CAST(oResponse:Entity, JsonObject):GetJsonText()), JsonObject). oResponseMessage:WRITE(cResponseMessage, FALSE). cResponseMessage = SUBSTITUTE ('Status-Code = &1, Artikel &2, Status &3 / &4', oResponse:StatusCode, ipcProdId, ipcStatus, cResponseMessage). RUN writeLogFile.p ('setProductToStatus', cLogFile, cResponseMessage ). DELETE OBJECT oParser NO-ERROR. DELETE OBJECT oResponseMessage NO-ERROR. DELETE OBJECT oBody NO-ERROR. RETURN lOK. END FUNCTION. FUNCTION updateProduct RETURNS LOGICAL ( ): /*------------------------------------------------------------------------------*/ /* Purpose: Super Override */ /* Parameters: */ /* Notes: */ /*------------------------------------------------------------------------------*/ DEFINE VARIABLE lOK AS LOGICAL NO-UNDO. DEFINE VARIABLE cProduct AS LONGCHAR NO-UNDO. DEFINE VARIABLE cURLwithID AS CHARACTER NO-UNDO. DEFINE VARIABLE oResponse AS IHttpResponse NO-UNDO. DEFINE VARIABLE oResponseMessage AS JsonObject NO-UNDO. DEFINE VARIABLE cResponseMessage AS CHARACTER NO-UNDO. DEFINE VARIABLE oParser AS ObjectModelParser NO-UNDO. DEFINE VARIABLE cBody AS CHARACTER NO-UNDO. DEFINE VARIABLE lBundles AS LOGICAL NO-UNDO. FIND FIRST tProduct. /* tProduct.cName = CODEPAGE-CONVERT(tProduct.cName, SESSION:CHARSET, "utf-8").*/ htProduct:BUFFER-FIELD('cId'):SERIALIZE-HIDDEN = TRUE. cURLwithID = cURL + '/' + tProduct.cId. oProduct = NEW JsonObject(). oProduct:READ(htProduct). FIND FIRST tVessel. oVessel = NEW JsonObject(). oVessel:READ(htVessel). lBundles = FALSE. oBundles = NEW JsonArray(). FOR EACH tBundle USE-INDEX tBundle-k1 WHERE tBundle.iSize > 0 : oBundle = NEW JsonObject(). oBundle:READ(htBundle). FOR EACH tPalletBundle NO-LOCK WHERE tPalletBundle.rtBundle = tBundle.rtBundle: oPalletBundle = NEW JsonObject(). oPalletBundle:Read(htPalletBundle). oBundle:Add('pallet_bundle', oPalletBundle). END. oBundles:Add(oBundle). lBundles = TRUE. END. oProduct:Add('vessel' , oVessel). /* IF lBundles THEN oProduct:Add('bundles', oBundles).*/ oProduct:Add('bundles', oBundles). oProduct:WRITE(cBody, TRUE). /* RUN writeLogFile.p ('updateProduct', cLogFile, cBody ).*/ lOK = HttpHandler:patch(INPUT cURLwithID, INPUT cApiName, INPUT cApiKeyValue, INPUT cServerNameIndication, INPUT oProduct, OUTPUT opErrorMessage, OUTPUT oResponse). oParser = NEW ObjectModelParser(). oResponseMessage = CAST(oParser:Parse(CAST(oResponse:Entity, JsonObject):GetJsonText()), JsonObject). oResponseMessage:WRITE(cResponseMessage, FALSE). cResponseMessage = SUBSTITUTE ('Status-Code = &1, Artikel &2 / &3', oResponse:StatusCode, tProduct.cId, cResponseMessage). RUN writeLogFile.p ('updateProduct', cLogFile, cResponseMessage ). IF NOT lOK THEN RUN writeLogFile.p ('updateProduct', cLogFile, cBody ). htProduct:BUFFER-FIELD('cId'):SERIALIZE-HIDDEN = TRUE. DELETE OBJECT oParser NO-ERROR. DELETE OBJECT oResponseMessage NO-ERROR. DELETE OBJECT oProduct NO-ERROR. DELETE OBJECT oVessel NO-ERROR. DELETE OBJECT oBundle NO-ERROR. DELETE OBJECT oPalletBundle NO-ERROR. DELETE OBJECT oBundles NO-ERROR. RETURN lOK. END FUNCTION.