Major architectural changes: - Convert Oracle IMPORT_PARTENERI.cauta_sau_creeaza_partener from FUNCTION to PROCEDURE with OUT parameter for VFP compatibility - Add IS_PERSOANA_JURIDICA parameter to support individual vs company detection - Implement sync-comenzi-web.prg orchestrator for generic web order processing with 5-minute timer automation - Create ApplicationSetup class for proper object-oriented configuration management - Add comprehensive Oracle connection and sync settings via settings.ini configuration system - Implement generic web order processing functions (ProcessWebOrder, ValidateWebOrder, CleanWebText, ConvertWebDate) - Add proper VFP-Oracle integration with correct procedure call syntax using OUT parameters - Rename gomag-vending.prg to gomag-adapter.prg for clarity and platform-specific functionality - Move CheckIniFile function to utils.prg for better code organization - Add settings.ini.example template and update .gitignore to exclude actual settings files - Implement comprehensive logging system with rotation and error handling - Add connection validation and retry logic for robust Oracle integration Technical improvements: - Proper JSON processing integration with existing nfjson library - Comprehensive error handling with categorized logging (INFO, ERROR, WARN) - Timer-based automation with configurable intervals - Settings validation and default value creation - Generic function naming for multi-platform support - Class-based setup system replacing procedural approach 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
288 lines
9.7 KiB
Plaintext
288 lines
9.7 KiB
Plaintext
*-- ApplicationSetup.prg - Clasa pentru configurarea si setup-ul aplicatiei
|
|
*-- Contine toate functiile pentru settings.ini si configurare
|
|
*-- Autor: Claude AI
|
|
*-- Data: 10 septembrie 2025
|
|
|
|
DEFINE CLASS ApplicationSetup AS Custom
|
|
|
|
*-- Proprietati publice
|
|
cAppPath = ""
|
|
cIniFile = ""
|
|
oSettings = NULL
|
|
lInitialized = .F.
|
|
|
|
*-- Constructor
|
|
PROCEDURE Init
|
|
PARAMETERS tcAppPath
|
|
IF !EMPTY(tcAppPath)
|
|
THIS.cAppPath = ADDBS(tcAppPath)
|
|
ELSE
|
|
THIS.cAppPath = ADDBS(JUSTPATH(SYS(16,0)))
|
|
ENDIF
|
|
|
|
THIS.cIniFile = THIS.cAppPath + "settings.ini"
|
|
THIS.lInitialized = .F.
|
|
ENDPROC
|
|
|
|
*-- Functie pentru incarcarea tuturor setarilor din fisierul INI
|
|
PROCEDURE LoadSettings
|
|
PARAMETERS tcIniFile
|
|
LOCAL loSettings
|
|
|
|
IF EMPTY(tcIniFile)
|
|
tcIniFile = THIS.cIniFile
|
|
ENDIF
|
|
|
|
*-- Cream un obiect pentru toate setarile
|
|
loSettings = CREATEOBJECT("Empty")
|
|
|
|
*-- Sectiunea API
|
|
ADDPROPERTY(loSettings, "ApiBaseUrl", ReadPini("API", "ApiBaseUrl", tcIniFile))
|
|
ADDPROPERTY(loSettings, "OrderApiUrl", ReadPini("API", "OrderApiUrl", tcIniFile))
|
|
ADDPROPERTY(loSettings, "ApiKey", ReadPini("API", "ApiKey", tcIniFile))
|
|
ADDPROPERTY(loSettings, "ApiShop", ReadPini("API", "ApiShop", tcIniFile))
|
|
ADDPROPERTY(loSettings, "UserAgent", ReadPini("API", "UserAgent", tcIniFile))
|
|
ADDPROPERTY(loSettings, "ContentType", ReadPini("API", "ContentType", tcIniFile))
|
|
|
|
*-- Sectiunea PAGINATION
|
|
ADDPROPERTY(loSettings, "Limit", VAL(ReadPini("PAGINATION", "Limit", tcIniFile)))
|
|
|
|
*-- Sectiunea OPTIONS
|
|
ADDPROPERTY(loSettings, "GetProducts", ReadPini("OPTIONS", "GetProducts", tcIniFile) = "1")
|
|
ADDPROPERTY(loSettings, "GetOrders", ReadPini("OPTIONS", "GetOrders", tcIniFile) = "1")
|
|
|
|
*-- Sectiunea FILTERS
|
|
ADDPROPERTY(loSettings, "OrderDaysBack", VAL(ReadPini("FILTERS", "OrderDaysBack", tcIniFile)))
|
|
|
|
*-- Sectiunea ORACLE - pentru conexiunea la database
|
|
ADDPROPERTY(loSettings, "OracleUser", ReadPini("ORACLE", "OracleUser", tcIniFile))
|
|
ADDPROPERTY(loSettings, "OraclePassword", ReadPini("ORACLE", "OraclePassword", tcIniFile))
|
|
ADDPROPERTY(loSettings, "OracleDSN", ReadPini("ORACLE", "OracleDSN", tcIniFile))
|
|
|
|
*-- Sectiunea SYNC - pentru configurarea sincronizarii
|
|
ADDPROPERTY(loSettings, "AdapterProgram", ReadPini("SYNC", "AdapterProgram", tcIniFile))
|
|
ADDPROPERTY(loSettings, "JsonFilePattern", ReadPini("SYNC", "JsonFilePattern", tcIniFile))
|
|
ADDPROPERTY(loSettings, "AutoRunAdapter", ReadPini("SYNC", "AutoRunAdapter", tcIniFile) = "1")
|
|
|
|
*-- Salvare in proprietatea clasei
|
|
THIS.oSettings = loSettings
|
|
|
|
RETURN loSettings
|
|
ENDPROC
|
|
|
|
*-- Functie pentru crearea unui fisier INI implicit cu setari de baza
|
|
PROCEDURE CreateDefaultIni
|
|
PARAMETERS tcIniFile
|
|
LOCAL llSuccess
|
|
|
|
IF EMPTY(tcIniFile)
|
|
tcIniFile = THIS.cIniFile
|
|
ENDIF
|
|
|
|
llSuccess = .T.
|
|
|
|
TRY
|
|
*-- Sectiunea API
|
|
WritePini("API", "ApiBaseUrl", "https://api.gomag.ro/api/v1/product/read/json?enabled=1", tcIniFile)
|
|
WritePini("API", "OrderApiUrl", "https://api.gomag.ro/api/v1/order/read/json", tcIniFile)
|
|
WritePini("API", "ApiKey", "YOUR_API_KEY_HERE", tcIniFile)
|
|
WritePini("API", "ApiShop", "https://yourstore.gomag.ro", tcIniFile)
|
|
WritePini("API", "UserAgent", "Mozilla/5.0", tcIniFile)
|
|
WritePini("API", "ContentType", "application/json", tcIniFile)
|
|
|
|
*-- Sectiunea PAGINATION
|
|
WritePini("PAGINATION", "Limit", "100", tcIniFile)
|
|
|
|
*-- Sectiunea OPTIONS
|
|
WritePini("OPTIONS", "GetProducts", "1", tcIniFile)
|
|
WritePini("OPTIONS", "GetOrders", "1", tcIniFile)
|
|
|
|
*-- Sectiunea FILTERS
|
|
WritePini("FILTERS", "OrderDaysBack", "7", tcIniFile)
|
|
|
|
*-- Sectiunea ORACLE - conexiune database
|
|
WritePini("ORACLE", "OracleUser", "MARIUSM_AUTO", tcIniFile)
|
|
WritePini("ORACLE", "OraclePassword", "ROMFASTSOFT", tcIniFile)
|
|
WritePini("ORACLE", "OracleDSN", "ROA_CENTRAL", tcIniFile)
|
|
|
|
*-- Sectiunea SYNC - configurare sincronizare
|
|
WritePini("SYNC", "AdapterProgram", "gomag-adapter.prg", tcIniFile)
|
|
WritePini("SYNC", "JsonFilePattern", "gomag_orders*.json", tcIniFile)
|
|
WritePini("SYNC", "AutoRunAdapter", "1", tcIniFile)
|
|
|
|
CATCH
|
|
llSuccess = .F.
|
|
ENDTRY
|
|
|
|
RETURN llSuccess
|
|
ENDPROC
|
|
|
|
*-- Functie pentru validarea setarilor obligatorii
|
|
PROCEDURE ValidateSettings
|
|
PARAMETERS toSettings
|
|
LOCAL llValid, lcErrors
|
|
|
|
IF ISNULL(toSettings)
|
|
toSettings = THIS.oSettings
|
|
ENDIF
|
|
|
|
IF ISNULL(toSettings)
|
|
RETURN .F.
|
|
ENDIF
|
|
|
|
llValid = .T.
|
|
lcErrors = ""
|
|
|
|
*-- Verificare setari API obligatorii
|
|
IF EMPTY(toSettings.ApiKey) OR toSettings.ApiKey = "YOUR_API_KEY_HERE"
|
|
llValid = .F.
|
|
lcErrors = lcErrors + "ApiKey nu este setat corect in settings.ini" + CHR(13) + CHR(10)
|
|
ENDIF
|
|
|
|
IF EMPTY(toSettings.ApiShop) OR "yourstore.gomag.ro" $ toSettings.ApiShop
|
|
llValid = .F.
|
|
lcErrors = lcErrors + "ApiShop nu este setat corect in settings.ini" + CHR(13) + CHR(10)
|
|
ENDIF
|
|
|
|
*-- Verificare setari Oracle obligatorii (doar pentru sync)
|
|
IF TYPE('toSettings.OracleUser') = 'C' AND EMPTY(toSettings.OracleUser)
|
|
llValid = .F.
|
|
lcErrors = lcErrors + "OracleUser nu este setat in settings.ini" + CHR(13) + CHR(10)
|
|
ENDIF
|
|
|
|
IF TYPE('toSettings.OracleDSN') = 'C' AND EMPTY(toSettings.OracleDSN)
|
|
llValid = .F.
|
|
lcErrors = lcErrors + "OracleDSN nu este setat in settings.ini" + CHR(13) + CHR(10)
|
|
ENDIF
|
|
|
|
*-- Log erorile daca exista
|
|
IF !llValid AND TYPE('gcLogFile') = 'C'
|
|
LogMessage("Erori validare settings.ini:", "ERROR", gcLogFile)
|
|
LogMessage(lcErrors, "ERROR", gcLogFile)
|
|
ENDIF
|
|
|
|
RETURN llValid
|
|
ENDPROC
|
|
|
|
*-- Functie pentru configurarea initiala a aplicatiei
|
|
PROCEDURE Setup
|
|
LOCAL llSetupOk
|
|
|
|
llSetupOk = .T.
|
|
|
|
*-- Verificare existenta settings.ini
|
|
IF !CheckIniFile(THIS.cIniFile)
|
|
IF TYPE('gcLogFile') = 'C'
|
|
LogMessage("ATENTIE: Fisierul settings.ini nu a fost gasit!", "WARN", gcLogFile)
|
|
LogMessage("Cream un fisier settings.ini implicit...", "INFO", gcLogFile)
|
|
ENDIF
|
|
|
|
IF THIS.CreateDefaultIni()
|
|
IF TYPE('gcLogFile') = 'C'
|
|
LogMessage("Fisier settings.ini creat cu succes.", "INFO", gcLogFile)
|
|
LogMessage("IMPORTANT: Modifica setarile din settings.ini (ApiKey, ApiShop) inainte de a rula scriptul din nou!", "INFO", gcLogFile)
|
|
ENDIF
|
|
llSetupOk = .F. && Opreste executia pentru a permite configurarea
|
|
ELSE
|
|
IF TYPE('gcLogFile') = 'C'
|
|
LogMessage("EROARE: Nu s-a putut crea fisierul settings.ini!", "ERROR", gcLogFile)
|
|
ENDIF
|
|
llSetupOk = .F.
|
|
ENDIF
|
|
ENDIF
|
|
|
|
*-- Incarca setarile daca setup-ul este OK
|
|
IF llSetupOk
|
|
THIS.LoadSettings()
|
|
THIS.lInitialized = .T.
|
|
ENDIF
|
|
|
|
RETURN llSetupOk
|
|
ENDPROC
|
|
|
|
*-- Functie pentru afisarea informatiilor despre configuratie
|
|
PROCEDURE DisplaySettingsInfo
|
|
PARAMETERS toSettings
|
|
LOCAL lcInfo
|
|
|
|
IF ISNULL(toSettings)
|
|
toSettings = THIS.oSettings
|
|
ENDIF
|
|
|
|
IF ISNULL(toSettings)
|
|
RETURN .F.
|
|
ENDIF
|
|
|
|
IF TYPE('gcLogFile') != 'C'
|
|
RETURN .F.
|
|
ENDIF
|
|
|
|
lcInfo = "=== CONFIGURATIE APLICATIE ==="
|
|
LogMessage(lcInfo, "INFO", gcLogFile)
|
|
|
|
*-- API Settings
|
|
LogMessage("API: " + toSettings.ApiShop, "INFO", gcLogFile)
|
|
LogMessage("Orders Days Back: " + TRANSFORM(toSettings.OrderDaysBack), "INFO", gcLogFile)
|
|
LogMessage("Get Products: " + IIF(toSettings.GetProducts, "DA", "NU"), "INFO", gcLogFile)
|
|
LogMessage("Get Orders: " + IIF(toSettings.GetOrders, "DA", "NU"), "INFO", gcLogFile)
|
|
|
|
*-- Oracle Settings (doar daca exista)
|
|
IF TYPE('toSettings.OracleUser') = 'C' AND !EMPTY(toSettings.OracleUser)
|
|
LogMessage("Oracle User: " + toSettings.OracleUser, "INFO", gcLogFile)
|
|
LogMessage("Oracle DSN: " + toSettings.OracleDSN, "INFO", gcLogFile)
|
|
ENDIF
|
|
|
|
*-- Sync Settings (doar daca exista)
|
|
IF TYPE('toSettings.AdapterProgram') = 'C' AND !EMPTY(toSettings.AdapterProgram)
|
|
LogMessage("Adapter Program: " + toSettings.AdapterProgram, "INFO", gcLogFile)
|
|
LogMessage("JSON Pattern: " + toSettings.JsonFilePattern, "INFO", gcLogFile)
|
|
LogMessage("Auto Run Adapter: " + IIF(toSettings.AutoRunAdapter, "DA", "NU"), "INFO", gcLogFile)
|
|
ENDIF
|
|
|
|
LogMessage("=== SFARSIT CONFIGURATIE ===", "INFO", gcLogFile)
|
|
|
|
RETURN .T.
|
|
ENDPROC
|
|
|
|
*-- Metoda pentru setup complet cu validare
|
|
PROCEDURE Initialize
|
|
LOCAL llSuccess
|
|
|
|
llSuccess = THIS.Setup()
|
|
|
|
IF llSuccess
|
|
llSuccess = THIS.ValidateSettings()
|
|
|
|
IF llSuccess
|
|
THIS.DisplaySettingsInfo()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN llSuccess
|
|
ENDPROC
|
|
|
|
*-- Functie pentru obtinerea setarilor
|
|
PROCEDURE GetSettings
|
|
RETURN THIS.oSettings
|
|
ENDPROC
|
|
|
|
*-- Functie pentru obtinerea path-ului aplicatiei
|
|
PROCEDURE GetAppPath
|
|
RETURN THIS.cAppPath
|
|
ENDPROC
|
|
|
|
*-- Functie pentru obtinerea path-ului fisierului INI
|
|
PROCEDURE GetIniFile
|
|
RETURN THIS.cIniFile
|
|
ENDPROC
|
|
|
|
ENDDEFINE
|
|
|
|
*-- ApplicationSetup Class - Clasa pentru configurarea si setup-ul aplicatiei
|
|
*-- Caracteristici:
|
|
*-- - Gestionare completa a settings.ini cu toate sectiunile
|
|
*-- - Creare fisier implicit cu valori default
|
|
*-- - Validare setari obligatorii pentru functionare
|
|
*-- - Setup si initializare completa cu o singura metoda
|
|
*-- - Afisarea informatiilor despre configuratia curenta
|
|
*-- - Proprietati pentru acces facil la configuratii si paths |