Fix orders counting bug and improve logging
- Fixed incorrect order count in logging (counted JSON properties instead of actual orders) - Added proper array declaration for AMEMBERS() function - Added comprehensive logging system with timestamps and levels - Added silent operation mode (removed SET STEP ON) - Added output directory creation - Enhanced error handling with proper logging instead of file dumps - Added statistics tracking for products and orders processed 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -6,3 +6,4 @@
|
|||||||
*.json
|
*.json
|
||||||
*.err
|
*.err
|
||||||
*.ERR
|
*.ERR
|
||||||
|
*.log
|
||||||
|
|||||||
@@ -2,6 +2,12 @@
|
|||||||
*-- Autor: Claude AI
|
*-- Autor: Claude AI
|
||||||
*-- Data: 26.08.2025
|
*-- Data: 26.08.2025
|
||||||
|
|
||||||
|
SET SAFETY OFF
|
||||||
|
SET EXACT ON
|
||||||
|
SET CENTURY ON
|
||||||
|
SET DELETED ON
|
||||||
|
SET DATE DMY
|
||||||
|
|
||||||
*-- Setari principale
|
*-- Setari principale
|
||||||
LOCAL lcApiBaseUrl, lcApiUrl, lcApiKey, lcUserAgent, lcContentType
|
LOCAL lcApiBaseUrl, lcApiUrl, lcApiKey, lcUserAgent, lcContentType
|
||||||
LOCAL loHttp, lcResponse, lcJsonResponse
|
LOCAL loHttp, lcResponse, lcJsonResponse
|
||||||
@@ -13,7 +19,7 @@ Local lcOrderApiUrl, loAllOrderData, lcOrderCsvFileName, lcOrderJsonFileName
|
|||||||
Local ldStartDate, lcStartDateStr
|
Local ldStartDate, lcStartDateStr
|
||||||
Local lcIniFile, loSettings
|
Local lcIniFile, loSettings
|
||||||
LOCAL llGetProducts, llGetOrders
|
LOCAL llGetProducts, llGetOrders
|
||||||
PRIVATE gcAppPath, loJsonData
|
PRIVATE gcAppPath, loJsonData, gcLogFile, gnStartTime, gnProductsProcessed, gnOrdersProcessed
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -24,20 +30,34 @@ SET PATH TO (m.lcPath) ADDITIVE
|
|||||||
|
|
||||||
SET PROCEDURE TO nfjsonread.prg ADDITIVE
|
SET PROCEDURE TO nfjsonread.prg ADDITIVE
|
||||||
SET PROCEDURE TO utils.prg ADDITIVE
|
SET PROCEDURE TO utils.prg ADDITIVE
|
||||||
|
SET PROCEDURE TO nfjsoncreate.prg ADDITIVE
|
||||||
|
|
||||||
|
*-- Initializare logging si statistici
|
||||||
|
gnStartTime = SECONDS()
|
||||||
|
gnProductsProcessed = 0
|
||||||
|
gnOrdersProcessed = 0
|
||||||
|
gcLogFile = InitLog("gomag_sync")
|
||||||
|
|
||||||
|
*-- Cream directorul output daca nu existe
|
||||||
|
LOCAL lcOutputDir
|
||||||
|
lcOutputDir = gcAppPath + "output"
|
||||||
|
IF !DIRECTORY(lcOutputDir)
|
||||||
|
MKDIR (lcOutputDir)
|
||||||
|
ENDIF
|
||||||
|
|
||||||
*-- Incarcarea setarilor din fisierul INI
|
*-- Incarcarea setarilor din fisierul INI
|
||||||
lcIniFile = gcAppPath + "settings.ini"
|
lcIniFile = gcAppPath + "settings.ini"
|
||||||
|
|
||||||
*-- Verificare existenta fisier INI
|
*-- Verificare existenta fisier INI
|
||||||
IF !CheckIniFile(lcIniFile)
|
IF !CheckIniFile(lcIniFile)
|
||||||
? "ATENTIE: Fisierul settings.ini nu a fost gasit!"
|
LogMessage("ATENTIE: Fisierul settings.ini nu a fost gasit!", "WARN", gcLogFile)
|
||||||
? "Cream un fisier settings.ini implicit..."
|
LogMessage("Cream un fisier settings.ini implicit...", "INFO", gcLogFile)
|
||||||
IF CreateDefaultIni(lcIniFile)
|
IF CreateDefaultIni(lcIniFile)
|
||||||
? "Fisier settings.ini creat cu succes."
|
LogMessage("Fisier settings.ini creat cu succes.", "INFO", gcLogFile)
|
||||||
? "IMPORTANT: Modifica setarile din settings.ini (ApiKey, ApiShop) inainte de a rula scriptul din nou!"
|
LogMessage("IMPORTANT: Modifica setarile din settings.ini (ApiKey, ApiShop) inainte de a rula scriptul din nou!", "INFO", gcLogFile)
|
||||||
RETURN .F.
|
RETURN .F.
|
||||||
ELSE
|
ELSE
|
||||||
? "EROARE: Nu s-a putut crea fisierul settings.ini!"
|
LogMessage("EROARE: Nu s-a putut crea fisierul settings.ini!", "ERROR", gcLogFile)
|
||||||
RETURN .F.
|
RETURN .F.
|
||||||
ENDIF
|
ENDIF
|
||||||
ENDIF
|
ENDIF
|
||||||
@@ -47,12 +67,12 @@ loSettings = LoadSettings(lcIniFile)
|
|||||||
|
|
||||||
*-- Verificare setari obligatorii
|
*-- Verificare setari obligatorii
|
||||||
IF EMPTY(loSettings.ApiKey) OR loSettings.ApiKey = "YOUR_API_KEY_HERE"
|
IF EMPTY(loSettings.ApiKey) OR loSettings.ApiKey = "YOUR_API_KEY_HERE"
|
||||||
? "EROARE: ApiKey nu este setat in settings.ini!"
|
LogMessage("EROARE: ApiKey nu este setat in settings.ini!", "ERROR", gcLogFile)
|
||||||
RETURN .F.
|
RETURN .F.
|
||||||
ENDIF
|
ENDIF
|
||||||
|
|
||||||
IF EMPTY(loSettings.ApiShop) OR "yourstore.gomag.ro" $ loSettings.ApiShop
|
IF EMPTY(loSettings.ApiShop) OR "yourstore.gomag.ro" $ loSettings.ApiShop
|
||||||
? "EROARE: ApiShop nu este setat corect in settings.ini!"
|
LogMessage("EROARE: ApiShop nu este setat corect in settings.ini!", "ERROR", gcLogFile)
|
||||||
RETURN .F.
|
RETURN .F.
|
||||||
ENDIF
|
ENDIF
|
||||||
|
|
||||||
@@ -80,15 +100,13 @@ lcStartDateStr = TRANSFORM(YEAR(ldStartDate)) + "-" + ;
|
|||||||
TRY
|
TRY
|
||||||
loHttp = CREATEOBJECT("WinHttp.WinHttpRequest.5.1")
|
loHttp = CREATEOBJECT("WinHttp.WinHttpRequest.5.1")
|
||||||
CATCH TO loError
|
CATCH TO loError
|
||||||
? "Eroare la crearea obiectului WinHttp: " + loError.Message
|
LogMessage("Eroare la crearea obiectului WinHttp: " + loError.Message, "ERROR", gcLogFile)
|
||||||
RETURN .F.
|
RETURN .F.
|
||||||
ENDTRY
|
ENDTRY
|
||||||
SET STEP ON
|
*-- Removed SET STEP ON for silent operation
|
||||||
*-- SECTIUNEA PRODUSE - se executa doar daca llGetProducts = .T.
|
*-- SECTIUNEA PRODUSE - se executa doar daca llGetProducts = .T.
|
||||||
IF llGetProducts
|
IF llGetProducts
|
||||||
? "======================================="
|
LogMessage("[PRODUCTS] Starting product retrieval", "INFO", gcLogFile)
|
||||||
? "PRELUARE PRODUSE"
|
|
||||||
? "======================================="
|
|
||||||
|
|
||||||
*-- Bucla pentru preluarea tuturor produselor (paginare)
|
*-- Bucla pentru preluarea tuturor produselor (paginare)
|
||||||
loAllJsonData = CREATEOBJECT("Empty")
|
loAllJsonData = CREATEOBJECT("Empty")
|
||||||
@@ -101,7 +119,7 @@ IF llGetProducts
|
|||||||
*-- Construire URL cu paginare
|
*-- Construire URL cu paginare
|
||||||
lcApiUrl = lcApiBaseUrl + "&page=" + TRANSFORM(lnCurrentPage) + "&limit=" + TRANSFORM(lnLimit)
|
lcApiUrl = lcApiBaseUrl + "&page=" + TRANSFORM(lnCurrentPage) + "&limit=" + TRANSFORM(lnLimit)
|
||||||
|
|
||||||
? "Preluare pagina " + TRANSFORM(lnCurrentPage) + "..."
|
LogMessage("[PRODUCTS] Page " + TRANSFORM(lnCurrentPage) + " fetching...", "INFO", gcLogFile)
|
||||||
|
|
||||||
*-- Configurare request
|
*-- Configurare request
|
||||||
TRY
|
TRY
|
||||||
@@ -142,8 +160,7 @@ IF llGetProducts
|
|||||||
IF TYPE('loJsonData.pages') = 'C' OR TYPE('loJsonData.pages') = 'N'
|
IF TYPE('loJsonData.pages') = 'C' OR TYPE('loJsonData.pages') = 'N'
|
||||||
loAllJsonData.pages = VAL(TRANSFORM(loJsonData.pages))
|
loAllJsonData.pages = VAL(TRANSFORM(loJsonData.pages))
|
||||||
ENDIF
|
ENDIF
|
||||||
? "Total produse: " + TRANSFORM(loAllJsonData.total)
|
LogMessage("[PRODUCTS] Total items: " + TRANSFORM(loAllJsonData.total) + " | Pages: " + TRANSFORM(loAllJsonData.pages), "INFO", gcLogFile)
|
||||||
? "Total pagini: " + TRANSFORM(loAllJsonData.pages)
|
|
||||||
ENDIF
|
ENDIF
|
||||||
|
|
||||||
*-- Adaugare produse din pagina curenta
|
*-- Adaugare produse din pagina curenta
|
||||||
@@ -167,39 +184,31 @@ IF llGetProducts
|
|||||||
lnCurrentPage = lnCurrentPage + 1
|
lnCurrentPage = lnCurrentPage + 1
|
||||||
|
|
||||||
ELSE
|
ELSE
|
||||||
*-- Salvare raspuns JSON raw in caz de eroare de parsare
|
*-- Eroare parsare JSON
|
||||||
lcFileName = "gomag_error_page" + TRANSFORM(lnCurrentPage) + "_" + DTOS(DATE()) + "_" + STRTRAN(TIME(), ":", "") + ".json"
|
LogMessage("[PRODUCTS] ERROR: JSON parsing failed for page " + TRANSFORM(lnCurrentPage), "ERROR", gcLogFile)
|
||||||
STRTOFILE(lcResponse, lcFileName)
|
|
||||||
llHasMorePages = .F.
|
llHasMorePages = .F.
|
||||||
ENDIF
|
ENDIF
|
||||||
|
|
||||||
ELSE
|
ELSE
|
||||||
*-- Eroare HTTP - salvare in fisier de log
|
*-- Eroare HTTP
|
||||||
lcLogFileName = "gomag_error_page" + TRANSFORM(lnCurrentPage) + "_" + DTOS(DATE()) + "_" + STRTRAN(TIME(), ":", "") + ".log"
|
LogMessage("[PRODUCTS] HTTP Error " + TRANSFORM(lnStatusCode) + ": " + lcStatusText + " on page " + TRANSFORM(lnCurrentPage), "ERROR", gcLogFile)
|
||||||
lcLogContent = "HTTP Error " + TRANSFORM(lnStatusCode) + ": " + lcStatusText + CHR(13) + CHR(10)
|
|
||||||
|
|
||||||
*-- Incearca sa citesti raspunsul pentru detalii despre eroare
|
*-- Detalii despre eroare daca sunt disponibile
|
||||||
TRY
|
TRY
|
||||||
lcErrorResponse = loHttp.ResponseText
|
lcErrorResponse = loHttp.ResponseText
|
||||||
IF !EMPTY(lcErrorResponse)
|
IF !EMPTY(lcErrorResponse)
|
||||||
lcLogContent = lcLogContent + "Error Details:" + CHR(13) + CHR(10) + lcErrorResponse
|
LogMessage("[PRODUCTS] Error details: " + LEFT(lcErrorResponse, 200), "ERROR", gcLogFile)
|
||||||
ENDIF
|
ENDIF
|
||||||
CATCH
|
CATCH
|
||||||
lcLogContent = lcLogContent + "Could not read error details"
|
LogMessage("[PRODUCTS] Could not read error details", "WARN", gcLogFile)
|
||||||
ENDTRY
|
ENDTRY
|
||||||
|
|
||||||
STRTOFILE(lcLogContent, lcLogFileName)
|
|
||||||
llHasMorePages = .F.
|
llHasMorePages = .F.
|
||||||
ENDIF
|
ENDIF
|
||||||
|
|
||||||
CATCH TO loError
|
CATCH TO loError
|
||||||
*-- Salvare erori in fisier de log pentru pagina curenta
|
*-- Script error in products section
|
||||||
lcLogFileName = "gomag_error_page" + TRANSFORM(lnCurrentPage) + "_" + DTOS(DATE()) + "_" + STRTRAN(TIME(), ":", "") + ".log"
|
LogMessage("[PRODUCTS] Script Error #" + TRANSFORM(loError.ErrorNo) + ": " + loError.Message + " (Line: " + TRANSFORM(loError.LineNo) + ")", "ERROR", gcLogFile)
|
||||||
lcLogContent = "Script Error on page " + TRANSFORM(lnCurrentPage) + ":" + CHR(13) + CHR(10) +;
|
|
||||||
"Error Number: " + TRANSFORM(loError.ErrorNo) + CHR(13) + CHR(10) +;
|
|
||||||
"Error Message: " + loError.Message + CHR(13) + CHR(10) +;
|
|
||||||
"Error Line: " + TRANSFORM(loError.LineNo)
|
|
||||||
STRTOFILE(lcLogContent, lcLogFileName)
|
|
||||||
llHasMorePages = .F.
|
llHasMorePages = .F.
|
||||||
ENDTRY
|
ENDTRY
|
||||||
|
|
||||||
@@ -212,22 +221,23 @@ ENDDO
|
|||||||
|
|
||||||
*-- Salvare array JSON cu toate produsele
|
*-- Salvare array JSON cu toate produsele
|
||||||
IF !ISNULL(loAllJsonData) AND TYPE('loAllJsonData.products') = 'O'
|
IF !ISNULL(loAllJsonData) AND TYPE('loAllJsonData.products') = 'O'
|
||||||
lcJsonFileName = "gomag_all_products_" + DTOS(DATE()) + "_" + STRTRAN(TIME(), ":", "") + ".json"
|
lcJsonFileName = lcOutputDir + "\gomag_all_products_" + DTOS(DATE()) + "_" + STRTRAN(TIME(), ":", "") + ".json"
|
||||||
DO SaveProductsArray WITH loAllJsonData, lcJsonFileName
|
DO SaveProductsArray WITH loAllJsonData, lcJsonFileName
|
||||||
? "Fisier JSON cu produse creat: " + lcJsonFileName
|
LogMessage("[PRODUCTS] JSON saved: " + lcJsonFileName, "INFO", gcLogFile)
|
||||||
|
*-- Calculam numarul de produse procesate
|
||||||
|
IF TYPE('loAllJsonData.products') = 'O'
|
||||||
|
lnPropCount = AMEMBERS(laProducts, loAllJsonData.products, 0)
|
||||||
|
gnProductsProcessed = lnPropCount
|
||||||
|
ENDIF
|
||||||
ENDIF
|
ENDIF
|
||||||
|
|
||||||
ELSE
|
ELSE
|
||||||
? "SARIT PESTE PRELUAREA PRODUSELOR (llGetProducts = .F.)"
|
LogMessage("[PRODUCTS] Skipped (disabled in settings)", "INFO", gcLogFile)
|
||||||
ENDIF
|
ENDIF
|
||||||
|
|
||||||
*-- SECTIUNEA COMENZI - se executa doar daca llGetOrders = .T.
|
*-- SECTIUNEA COMENZI - se executa doar daca llGetOrders = .T.
|
||||||
IF llGetOrders
|
IF llGetOrders
|
||||||
? ""
|
LogMessage("[ORDERS] Starting orders retrieval (last " + TRANSFORM(loSettings.OrderDaysBack) + " days from " + lcStartDateStr + ")", "INFO", gcLogFile)
|
||||||
? "======================================="
|
|
||||||
? "PRELUARE COMENZI DIN ULTIMELE " + TRANSFORM(loSettings.OrderDaysBack) + " ZILE"
|
|
||||||
? "Data de start: " + lcStartDateStr
|
|
||||||
? "======================================="
|
|
||||||
|
|
||||||
*-- Reinitializare pentru comenzi
|
*-- Reinitializare pentru comenzi
|
||||||
lnCurrentPage = 1
|
lnCurrentPage = 1
|
||||||
@@ -242,7 +252,7 @@ DO WHILE llHasMorePages
|
|||||||
*-- Construire URL cu paginare si filtrare pe data (folosind startDate conform documentatiei GoMag)
|
*-- Construire URL cu paginare si filtrare pe data (folosind startDate conform documentatiei GoMag)
|
||||||
lcApiUrl = lcOrderApiUrl + "?startDate=" + lcStartDateStr + "&page=" + TRANSFORM(lnCurrentPage) + "&limit=" + TRANSFORM(lnLimit)
|
lcApiUrl = lcOrderApiUrl + "?startDate=" + lcStartDateStr + "&page=" + TRANSFORM(lnCurrentPage) + "&limit=" + TRANSFORM(lnLimit)
|
||||||
|
|
||||||
? "Preluare comenzi pagina " + TRANSFORM(lnCurrentPage) + "..."
|
LogMessage("[ORDERS] Page " + TRANSFORM(lnCurrentPage) + " fetching...", "INFO", gcLogFile)
|
||||||
|
|
||||||
*-- Configurare request
|
*-- Configurare request
|
||||||
TRY
|
TRY
|
||||||
@@ -277,12 +287,12 @@ DO WHILE llHasMorePages
|
|||||||
IF !ISNULL(loJsonData)
|
IF !ISNULL(loJsonData)
|
||||||
*-- Debug: Afisam structura JSON pentru prima pagina
|
*-- Debug: Afisam structura JSON pentru prima pagina
|
||||||
IF lnCurrentPage = 1
|
IF lnCurrentPage = 1
|
||||||
? "DEBUG: Analiza structura JSON comenzi..."
|
LogMessage("[ORDERS] DEBUG: Analyzing JSON structure...", "DEBUG", gcLogFile)
|
||||||
lnPropCount = AMEMBERS(laJsonProps, loJsonData, 0)
|
lnPropCount = AMEMBERS(laJsonProps, loJsonData, 0)
|
||||||
FOR lnDebugIndex = 1 TO MIN(lnPropCount, 10) && Primele 10 proprietati
|
FOR lnDebugIndex = 1 TO MIN(lnPropCount, 10) && Primele 10 proprietati
|
||||||
lcPropName = laJsonProps(lnDebugIndex)
|
lcPropName = laJsonProps(lnDebugIndex)
|
||||||
lcPropType = TYPE('loJsonData.' + lcPropName)
|
lcPropType = TYPE('loJsonData.' + lcPropName)
|
||||||
? " Proprietate: " + lcPropName + " (Tip: " + lcPropType + ")"
|
LogMessage("[ORDERS] Property: " + lcPropName + " (Type: " + lcPropType + ")", "DEBUG", gcLogFile)
|
||||||
ENDFOR
|
ENDFOR
|
||||||
ENDIF
|
ENDIF
|
||||||
|
|
||||||
@@ -294,8 +304,7 @@ DO WHILE llHasMorePages
|
|||||||
IF TYPE('loJsonData.pages') = 'C' OR TYPE('loJsonData.pages') = 'N'
|
IF TYPE('loJsonData.pages') = 'C' OR TYPE('loJsonData.pages') = 'N'
|
||||||
loAllOrderData.pages = VAL(TRANSFORM(loJsonData.pages))
|
loAllOrderData.pages = VAL(TRANSFORM(loJsonData.pages))
|
||||||
ENDIF
|
ENDIF
|
||||||
? "Total comenzi: " + TRANSFORM(loAllOrderData.total)
|
LogMessage("[ORDERS] Total items: " + TRANSFORM(loAllOrderData.total) + " | Pages: " + TRANSFORM(loAllOrderData.pages), "INFO", gcLogFile)
|
||||||
? "Total pagini: " + TRANSFORM(loAllOrderData.pages)
|
|
||||||
ENDIF
|
ENDIF
|
||||||
|
|
||||||
*-- Adaugare comenzi din pagina curenta
|
*-- Adaugare comenzi din pagina curenta
|
||||||
@@ -304,7 +313,22 @@ DO WHILE llHasMorePages
|
|||||||
llHasOrders = .F.
|
llHasOrders = .F.
|
||||||
lnOrdersFound = 0
|
lnOrdersFound = 0
|
||||||
|
|
||||||
*-- JSON-ul este direct un array de comenzi
|
*-- Verificam daca JSON-ul contine proprietatea orders
|
||||||
|
IF TYPE('loJsonData.orders') = 'O'
|
||||||
|
*-- Numaram comenzile din obiectul orders
|
||||||
|
LOCAL ARRAY laOrdersProps[1]
|
||||||
|
LOCAL lnOrdersCount
|
||||||
|
lnOrdersCount = AMEMBERS(laOrdersProps, loJsonData.orders, 0)
|
||||||
|
|
||||||
|
IF lnOrdersCount > 0
|
||||||
|
DO MergeOrdersArray WITH loAllOrderData, loJsonData
|
||||||
|
llHasOrders = .T.
|
||||||
|
lnOrdersFound = lnOrdersCount
|
||||||
|
LogMessage("[ORDERS] Found " + TRANSFORM(lnOrdersCount) + " orders in page " + TRANSFORM(lnCurrentPage), "INFO", gcLogFile)
|
||||||
|
gnOrdersProcessed = gnOrdersProcessed + lnOrdersCount
|
||||||
|
ENDIF
|
||||||
|
ELSE
|
||||||
|
*-- JSON-ul este direct un array de comenzi (backup logic)
|
||||||
lnDirectProps = AMEMBERS(laDirectProps, loJsonData, 0)
|
lnDirectProps = AMEMBERS(laDirectProps, loJsonData, 0)
|
||||||
IF lnDirectProps > 0
|
IF lnDirectProps > 0
|
||||||
*-- Cream un obiect temporar cu structura asteptata
|
*-- Cream un obiect temporar cu structura asteptata
|
||||||
@@ -314,11 +338,13 @@ DO WHILE llHasMorePages
|
|||||||
DO MergeOrdersArray WITH loAllOrderData, loTempData
|
DO MergeOrdersArray WITH loAllOrderData, loTempData
|
||||||
llHasOrders = .T.
|
llHasOrders = .T.
|
||||||
lnOrdersFound = lnDirectProps
|
lnOrdersFound = lnDirectProps
|
||||||
? " Gasit: " + TRANSFORM(lnDirectProps) + " comenzi in pagina " + TRANSFORM(lnCurrentPage)
|
LogMessage("[ORDERS] Found " + TRANSFORM(lnDirectProps) + " orders in page " + TRANSFORM(lnCurrentPage), "INFO", gcLogFile)
|
||||||
|
gnOrdersProcessed = gnOrdersProcessed + lnDirectProps
|
||||||
|
ENDIF
|
||||||
ENDIF
|
ENDIF
|
||||||
|
|
||||||
IF !llHasOrders
|
IF !llHasOrders
|
||||||
? " ATENTIE: Nu s-au gasit comenzi in raspunsul JSON pentru pagina " + TRANSFORM(lnCurrentPage)
|
LogMessage("[ORDERS] WARNING: No orders found in JSON response for page " + TRANSFORM(lnCurrentPage), "WARN", gcLogFile)
|
||||||
ENDIF
|
ENDIF
|
||||||
|
|
||||||
*-- Verificare daca mai sunt pagini
|
*-- Verificare daca mai sunt pagini
|
||||||
@@ -337,39 +363,31 @@ DO WHILE llHasMorePages
|
|||||||
lnCurrentPage = lnCurrentPage + 1
|
lnCurrentPage = lnCurrentPage + 1
|
||||||
|
|
||||||
ELSE
|
ELSE
|
||||||
*-- Salvare raspuns JSON raw in caz de eroare de parsare
|
*-- Eroare parsare JSON pentru comenzi
|
||||||
lcFileName = "gomag_order_error_page" + TRANSFORM(lnCurrentPage) + "_" + DTOS(DATE()) + "_" + STRTRAN(TIME(), ":", "") + ".json"
|
LogMessage("[ORDERS] ERROR: JSON parsing failed for page " + TRANSFORM(lnCurrentPage), "ERROR", gcLogFile)
|
||||||
STRTOFILE(lcResponse, lcFileName)
|
|
||||||
llHasMorePages = .F.
|
llHasMorePages = .F.
|
||||||
ENDIF
|
ENDIF
|
||||||
|
|
||||||
ELSE
|
ELSE
|
||||||
*-- Eroare HTTP - salvare in fisier de log
|
*-- Eroare HTTP pentru comenzi
|
||||||
lcLogFileName = "gomag_order_error_page" + TRANSFORM(lnCurrentPage) + "_" + DTOS(DATE()) + "_" + STRTRAN(TIME(), ":", "") + ".log"
|
LogMessage("[ORDERS] HTTP Error " + TRANSFORM(lnStatusCode) + ": " + lcStatusText + " on page " + TRANSFORM(lnCurrentPage), "ERROR", gcLogFile)
|
||||||
lcLogContent = "HTTP Error " + TRANSFORM(lnStatusCode) + ": " + lcStatusText + CHR(13) + CHR(10)
|
|
||||||
|
|
||||||
*-- Incearca sa citesti raspunsul pentru detalii despre eroare
|
*-- Detalii despre eroare daca sunt disponibile
|
||||||
TRY
|
TRY
|
||||||
lcErrorResponse = loHttp.ResponseText
|
lcErrorResponse = loHttp.ResponseText
|
||||||
IF !EMPTY(lcErrorResponse)
|
IF !EMPTY(lcErrorResponse)
|
||||||
lcLogContent = lcLogContent + "Error Details:" + CHR(13) + CHR(10) + lcErrorResponse
|
LogMessage("[ORDERS] Error details: " + LEFT(lcErrorResponse, 200), "ERROR", gcLogFile)
|
||||||
ENDIF
|
ENDIF
|
||||||
CATCH
|
CATCH
|
||||||
lcLogContent = lcLogContent + "Could not read error details"
|
LogMessage("[ORDERS] Could not read error details", "WARN", gcLogFile)
|
||||||
ENDTRY
|
ENDTRY
|
||||||
|
|
||||||
STRTOFILE(lcLogContent, lcLogFileName)
|
|
||||||
llHasMorePages = .F.
|
llHasMorePages = .F.
|
||||||
ENDIF
|
ENDIF
|
||||||
|
|
||||||
CATCH TO loError
|
CATCH TO loError
|
||||||
*-- Salvare erori in fisier de log pentru pagina curenta
|
*-- Script error in orders section
|
||||||
lcLogFileName = "gomag_order_error_page" + TRANSFORM(lnCurrentPage) + "_" + DTOS(DATE()) + "_" + STRTRAN(TIME(), ":", "") + ".log"
|
LogMessage("[ORDERS] Script Error #" + TRANSFORM(loError.ErrorNo) + ": " + loError.Message + " (Line: " + TRANSFORM(loError.LineNo) + ")", "ERROR", gcLogFile)
|
||||||
lcLogContent = "Script Error on page " + TRANSFORM(lnCurrentPage) + ":" + CHR(13) + CHR(10) +;
|
|
||||||
"Error Number: " + TRANSFORM(loError.ErrorNo) + CHR(13) + CHR(10) +;
|
|
||||||
"Error Message: " + loError.Message + CHR(13) + CHR(10) +;
|
|
||||||
"Error Line: " + TRANSFORM(loError.LineNo)
|
|
||||||
STRTOFILE(lcLogContent, lcLogFileName)
|
|
||||||
llHasMorePages = .F.
|
llHasMorePages = .F.
|
||||||
ENDTRY
|
ENDTRY
|
||||||
|
|
||||||
@@ -382,18 +400,21 @@ ENDDO
|
|||||||
|
|
||||||
*-- Salvare array JSON cu toate comenzile
|
*-- Salvare array JSON cu toate comenzile
|
||||||
IF !ISNULL(loAllOrderData) AND TYPE('loAllOrderData.orders') = 'O'
|
IF !ISNULL(loAllOrderData) AND TYPE('loAllOrderData.orders') = 'O'
|
||||||
lcOrderJsonFileName = "gomag_orders_last7days_" + DTOS(DATE()) + "_" + STRTRAN(TIME(), ":", "") + ".json"
|
lcOrderJsonFileName = lcOutputDir + "\gomag_orders_last7days_" + DTOS(DATE()) + "_" + STRTRAN(TIME(), ":", "") + ".json"
|
||||||
DO SaveOrdersArray WITH loAllOrderData, lcOrderJsonFileName
|
DO SaveOrdersArray WITH loAllOrderData, lcOrderJsonFileName
|
||||||
? "Fisier JSON cu comenzi creat: " + lcOrderJsonFileName
|
LogMessage("[ORDERS] JSON saved: " + lcOrderJsonFileName, "INFO", gcLogFile)
|
||||||
ENDIF
|
ENDIF
|
||||||
|
|
||||||
ELSE
|
ELSE
|
||||||
? "SARIT PESTE PRELUAREA COMENZILOR (llGetOrders = .F.)"
|
LogMessage("[ORDERS] Skipped (disabled in settings)", "INFO", gcLogFile)
|
||||||
ENDIF
|
ENDIF
|
||||||
|
|
||||||
*-- Curatare
|
*-- Curatare
|
||||||
loHttp = NULL
|
loHttp = NULL
|
||||||
|
|
||||||
|
*-- Inchidere logging cu statistici finale
|
||||||
|
CloseLog(gnStartTime, gnProductsProcessed, gnOrdersProcessed, gcLogFile)
|
||||||
|
|
||||||
|
|
||||||
*-- Functie pentru salvarea array-ului de produse in format JSON
|
*-- Functie pentru salvarea array-ului de produse in format JSON
|
||||||
PROCEDURE SaveProductsArray
|
PROCEDURE SaveProductsArray
|
||||||
@@ -419,7 +440,6 @@ IF TYPE('tloAllData.products') = 'O'
|
|||||||
ENDIF
|
ENDIF
|
||||||
|
|
||||||
*-- Serializeaza produsul cu nfjsoncreate
|
*-- Serializeaza produsul cu nfjsoncreate
|
||||||
SET PROCEDURE TO nfjsoncreate.prg ADDITIVE
|
|
||||||
lcProductJson = nfJsonCreate(loProduct, .F.)
|
lcProductJson = nfJsonCreate(loProduct, .F.)
|
||||||
lcJsonContent = lcJsonContent + " " + lcProductJson
|
lcJsonContent = lcJsonContent + " " + lcProductJson
|
||||||
ENDIF
|
ENDIF
|
||||||
@@ -458,7 +478,6 @@ IF TYPE('tloAllData.orders') = 'O'
|
|||||||
ENDIF
|
ENDIF
|
||||||
|
|
||||||
*-- Serializeaza comanda cu nfjsoncreate
|
*-- Serializeaza comanda cu nfjsoncreate
|
||||||
SET PROCEDURE TO nfjsoncreate.prg ADDITIVE
|
|
||||||
lcOrderJson = nfJsonCreate(loOrder, .F.)
|
lcOrderJson = nfJsonCreate(loOrder, .F.)
|
||||||
lcJsonContent = lcJsonContent + " " + lcOrderJson
|
lcJsonContent = lcJsonContent + " " + lcOrderJson
|
||||||
ENDIF
|
ENDIF
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ ContentType=application/json
|
|||||||
Limit=100
|
Limit=100
|
||||||
|
|
||||||
[OPTIONS]
|
[OPTIONS]
|
||||||
GetProducts=0
|
GetProducts=1
|
||||||
GetOrders=1
|
GetOrders=1
|
||||||
|
|
||||||
[FILTERS]
|
[FILTERS]
|
||||||
|
|||||||
90
utils.prg
90
utils.prg
@@ -172,3 +172,93 @@ ENDTRY
|
|||||||
|
|
||||||
RETURN llSuccess
|
RETURN llSuccess
|
||||||
ENDFUNC
|
ENDFUNC
|
||||||
|
|
||||||
|
*-- Functie pentru initializarea logging-ului
|
||||||
|
FUNCTION InitLog
|
||||||
|
PARAMETERS cBaseName
|
||||||
|
LOCAL lcLogFile, lcStartTime, lcLogHeader, lcLogDir
|
||||||
|
|
||||||
|
*-- Cream directorul log daca nu existe
|
||||||
|
lcLogDir = gcAppPath + "log"
|
||||||
|
IF !DIRECTORY(lcLogDir)
|
||||||
|
MKDIR (lcLogDir)
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
*-- Generam numele fisierului log cu timestamp in directorul log
|
||||||
|
lcStartTime = DTOS(DATE()) + "_" + STRTRAN(TIME(), ":", "")
|
||||||
|
lcLogFile = lcLogDir + "\" + cBaseName + "_" + lcStartTime + ".log"
|
||||||
|
|
||||||
|
*-- Header pentru log
|
||||||
|
lcLogHeader = "[" + TIME() + "] [START] === GoMag Sync Started ===" + CHR(13) + CHR(10)
|
||||||
|
lcLogHeader = lcLogHeader + "[" + TIME() + "] [INFO ] Date: " + DTOC(DATE()) + " | VFP: " + VERSION() + CHR(13) + CHR(10)
|
||||||
|
|
||||||
|
*-- Cream fisierul log
|
||||||
|
STRTOFILE(lcLogHeader, lcLogFile)
|
||||||
|
|
||||||
|
RETURN lcLogFile
|
||||||
|
ENDFUNC
|
||||||
|
|
||||||
|
*-- Functie pentru logging cu nivel si timestamp
|
||||||
|
FUNCTION LogMessage
|
||||||
|
PARAMETERS cMessage, cLevel, cLogFile
|
||||||
|
LOCAL lcTimeStamp, lcLogEntry, lcExistingContent
|
||||||
|
|
||||||
|
*-- Setam nivel implicit daca nu e specificat
|
||||||
|
IF EMPTY(cLevel)
|
||||||
|
cLevel = "INFO "
|
||||||
|
ELSE
|
||||||
|
*-- Formatam nivelul pentru a avea 5 caractere
|
||||||
|
cLevel = LEFT(cLevel + " ", 5)
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
*-- Cream timestamp-ul
|
||||||
|
lcTimeStamp = TIME()
|
||||||
|
|
||||||
|
*-- Formatam mesajul pentru log
|
||||||
|
lcLogEntry = "[" + lcTimeStamp + "] [" + cLevel + "] " + cMessage + CHR(13) + CHR(10)
|
||||||
|
|
||||||
|
*-- Adaugam la fisierul existent
|
||||||
|
lcExistingContent = ""
|
||||||
|
IF FILE(cLogFile)
|
||||||
|
lcExistingContent = FILETOSTR(cLogFile)
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
STRTOFILE(lcExistingContent + lcLogEntry, cLogFile)
|
||||||
|
|
||||||
|
RETURN .T.
|
||||||
|
ENDFUNC
|
||||||
|
|
||||||
|
*-- Functie pentru inchiderea logging-ului cu statistici
|
||||||
|
FUNCTION CloseLog
|
||||||
|
PARAMETERS nStartTime, nProductsCount, nOrdersCount, cLogFile
|
||||||
|
LOCAL lcEndTime, lcDuration, lcStatsEntry
|
||||||
|
|
||||||
|
lcEndTime = TIME()
|
||||||
|
*-- Calculam durata in secunde
|
||||||
|
nDuration = SECONDS() - nStartTime
|
||||||
|
|
||||||
|
*-- Formatam statisticile finale
|
||||||
|
lcStatsEntry = "[" + lcEndTime + "] [END ] === GoMag Sync Completed ===" + CHR(13) + CHR(10)
|
||||||
|
lcStatsEntry = lcStatsEntry + "[" + lcEndTime + "] [STATS] Duration: " + TRANSFORM(INT(nDuration)) + "s"
|
||||||
|
|
||||||
|
IF nProductsCount > 0
|
||||||
|
lcStatsEntry = lcStatsEntry + " | Products: " + TRANSFORM(nProductsCount)
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IF nOrdersCount > 0
|
||||||
|
lcStatsEntry = lcStatsEntry + " | Orders: " + TRANSFORM(nOrdersCount)
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
lcStatsEntry = lcStatsEntry + CHR(13) + CHR(10)
|
||||||
|
|
||||||
|
*-- Adaugam la log
|
||||||
|
LOCAL lcExistingContent
|
||||||
|
lcExistingContent = ""
|
||||||
|
IF FILE(cLogFile)
|
||||||
|
lcExistingContent = FILETOSTR(cLogFile)
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
STRTOFILE(lcExistingContent + lcStatsEntry, cLogFile)
|
||||||
|
|
||||||
|
RETURN .T.
|
||||||
|
ENDFUNC
|
||||||
Reference in New Issue
Block a user