Reorganize Oracle packages into database-scripts for unified git tracking

Move Oracle package files from docs/ to api/database-scripts/ with sequential numbering:
- PACK_COMENZI.pck → 04_pack_comenzi.pck (renamed with git)
- PACK_IMPORT_PARTENERI.pck → 05_pack_import_parteneri.pck
- PACK_IMPORT_COMENZI.pck → 06_pack_import_comenzi.pck

Remove 04_import_comenzi.sql (replaced by 06_pack_import_comenzi.pck actual version)

Update VFP integration files and project structure.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-19 22:32:41 +02:00
parent 5d43509987
commit 05bb0b1b01
11 changed files with 2101 additions and 1255 deletions

View File

@@ -23,9 +23,6 @@ LOCAL llGetProducts, llGetOrders
PRIVATE loJsonData, gcLogFile, gnStartTime, gnProductsProcessed, gnOrdersProcessed
*-- Include utilitare necesare
SET PROCEDURE TO regex.prg ADDITIVE
*-- Initializare logging si statistici
gnStartTime = SECONDS()
gnProductsProcessed = 0
@@ -229,9 +226,8 @@ IF llGetProducts
llHasMorePages = .F.
ENDTRY
*-- Pauza scurta intre cereri pentru a evita rate limiting
IF llHasMorePages
INKEY(1) && Pauza de 1 secunda
INKEY(1) && Pauza de 10 secunde pentru a evita "Limitele API depasite"
ENDIF
ENDDO
@@ -301,80 +297,59 @@ DO WHILE llHasMorePages
*-- Success - preluare raspuns
lcResponse = loHttp.ResponseText
*-- Parsare JSON cu nfjson
SET PATH TO nfjson ADDITIVE
loJsonData = nfJsonRead(lcResponse)
*-- SALVARE DIRECTA: Salveaza raspunsul RAW exact cum vine din API, pe pagini
lcOrderJsonFileName = lcOutputDir + "\gomag_orders_page" + TRANSFORM(lnCurrentPage) + "_" + DTOS(DATE()) + "_" + STRTRAN(TIME(), ":", "") + ".json"
STRTOFILE(lcResponse, lcOrderJsonFileName)
LogMessage("[ORDERS] JSON RAW salvat: " + lcOrderJsonFileName, "INFO", gcLogFile)
IF !ISNULL(loJsonData)
*-- Debug: Afisam structura JSON pentru prima pagina
*-- Parsare JSON pentru obtinerea numarului de pagini
SET PATH TO nfjson ADDITIVE
loOrdersJsonData = nfJsonRead(lcResponse)
IF !ISNULL(loOrdersJsonData)
*-- Extragere informatii paginare din JSON procesat
IF lnCurrentPage = 1
LogMessage("[ORDERS] Analyzing JSON structure...", "INFO", gcLogFile)
LOCAL ARRAY laJsonProps[1]
lnPropCount = AMEMBERS(laJsonProps, loJsonData, 0)
FOR lnDebugIndex = 1 TO MIN(lnPropCount, 10) && Primele 10 proprietati
lcPropName = laJsonProps(lnDebugIndex)
lcPropType = TYPE('loJsonData.' + lcPropName)
LogMessage("[ORDERS] Property: " + lcPropName + " (Type: " + lcPropType + ")", "DEBUG", gcLogFile)
ENDFOR
ENDIF
*-- Prima pagina - setam informatiile generale din metadata
IF lnCurrentPage = 1
IF TYPE('loJsonData.total') = 'C' OR TYPE('loJsonData.total') = 'N'
loAllOrderData.total = VAL(TRANSFORM(loJsonData.total))
ENDIF
IF TYPE('loJsonData.pages') = 'C' OR TYPE('loJsonData.pages') = 'N'
loAllOrderData.pages = VAL(TRANSFORM(loJsonData.pages))
ENDIF
LogMessage("[ORDERS] Total orders: " + TRANSFORM(loAllOrderData.total), "INFO", gcLogFile)
LogMessage("[ORDERS] Total pages: " + TRANSFORM(loAllOrderData.pages), "INFO", gcLogFile)
ENDIF
*-- Adaugare comenzi din pagina curenta
*-- API-ul GoMag returneaza obiect cu metadata si orders
LOCAL llHasOrders, lnOrdersFound
llHasOrders = .F.
lnOrdersFound = 0
*-- Verificam daca avem obiectul orders
IF TYPE('loJsonData.orders') = 'O'
*-- Numaram comenzile din obiectul orders
lnOrdersFound = AMEMBERS(laOrdersPage, loJsonData.orders, 0)
IF lnOrdersFound > 0
*-- Mergem comenzile din pagina curenta
DO MergeOrdersArray WITH loAllOrderData, loJsonData
llHasOrders = .T.
LogMessage("[ORDERS] Found: " + TRANSFORM(lnOrdersFound) + " orders in page " + TRANSFORM(lnCurrentPage), "INFO", gcLogFile)
gnOrdersProcessed = gnOrdersProcessed + lnOrdersFound
IF TYPE('loOrdersJsonData.total') = 'C' OR TYPE('loOrdersJsonData.total') = 'N'
LOCAL lnTotalOrders
lnTotalOrders = VAL(TRANSFORM(loOrdersJsonData.total))
LogMessage("[ORDERS] Total orders: " + TRANSFORM(lnTotalOrders), "INFO", gcLogFile)
ENDIF
ENDIF
IF !llHasOrders
LogMessage("[ORDERS] WARNING: No orders found in JSON response for page " + TRANSFORM(lnCurrentPage), "WARN", gcLogFile)
ENDIF
*-- Verificare daca mai sunt pagini folosind metadata
IF TYPE('loJsonData.pages') = 'C' OR TYPE('loJsonData.pages') = 'N'
lnTotalPages = VAL(TRANSFORM(loJsonData.pages))
IF TYPE('loOrdersJsonData.pages') = 'C' OR TYPE('loOrdersJsonData.pages') = 'N'
lnTotalPages = VAL(TRANSFORM(loOrdersJsonData.pages))
IF lnCurrentPage = 1
LogMessage("[ORDERS] Total pages: " + TRANSFORM(lnTotalPages), "INFO", gcLogFile)
ENDIF
IF lnCurrentPage >= lnTotalPages
llHasMorePages = .F.
LogMessage("[ORDERS] Reached last page (" + TRANSFORM(lnCurrentPage) + "/" + TRANSFORM(lnTotalPages) + ")", "INFO", gcLogFile)
ENDIF
ELSE
*-- Fallback: verifica daca am primit mai putin decat limita
IF !llHasOrders OR lnOrdersFound < lnLimit
*-- Fallback: verificare daca mai sunt comenzi in pagina
IF TYPE('loOrdersJsonData.orders') != 'O'
llHasMorePages = .F.
LogMessage("[ORDERS] No orders found in response, stopping pagination", "INFO", gcLogFile)
ENDIF
ENDIF
lnCurrentPage = lnCurrentPage + 1
*-- Numarare comenzi din pagina curenta
IF TYPE('loOrdersJsonData.orders') = 'O'
LOCAL lnOrdersInPage
lnOrdersInPage = AMEMBERS(laOrdersPage, loOrdersJsonData.orders, 0)
gnOrdersProcessed = gnOrdersProcessed + lnOrdersInPage
LogMessage("[ORDERS] Found " + TRANSFORM(lnOrdersInPage) + " orders in page " + TRANSFORM(lnCurrentPage), "INFO", gcLogFile)
ENDIF
ELSE
*-- Salvare raspuns JSON raw in caz de eroare de parsare
lcFileName = "gomag_order_error_page" + TRANSFORM(lnCurrentPage) + "_" + DTOS(DATE()) + "_" + STRTRAN(TIME(), ":", "") + ".json"
STRTOFILE(lcResponse, lcFileName)
*-- Eroare la parsarea JSON
LogMessage("[ORDERS] ERROR: Could not parse JSON response for page " + TRANSFORM(lnCurrentPage), "ERROR", gcLogFile)
llHasMorePages = .F.
ENDIF
lnCurrentPage = lnCurrentPage + 1
ELSE
*-- Eroare HTTP - salvare in fisier de log
lcLogFileName = "gomag_order_error_page" + TRANSFORM(lnCurrentPage) + "_" + DTOS(DATE()) + "_" + STRTRAN(TIME(), ":", "") + ".log"
@@ -405,19 +380,14 @@ DO WHILE llHasMorePages
llHasMorePages = .F.
ENDTRY
*-- Pauza scurta intre cereri pentru a evita rate limiting
IF llHasMorePages
INKEY(1) && Pauza de 1 secunda
INKEY(1) && Pauza de 10 secunde pentru a evita "Limitele API depasite"
ENDIF
ENDDO
*-- Salvare array JSON cu toate comenzile
IF !ISNULL(loAllOrderData) AND TYPE('loAllOrderData.orders') = 'O'
lcOrderJsonFileName = lcOutputDir + "\gomag_orders_last7days_" + DTOS(DATE()) + "_" + STRTRAN(TIME(), ":", "") + ".json"
DO SaveOrdersArray WITH loAllOrderData, lcOrderJsonFileName
LogMessage("[ORDERS] JSON file created: " + lcOrderJsonFileName, "INFO", gcLogFile)
ENDIF
LogMessage("[ORDERS] JSON files salvate pe pagini separate in directorul output/", "INFO", gcLogFile)
LogMessage("[ORDERS] Total orders processed: " + TRANSFORM(gnOrdersProcessed), "INFO", gcLogFile)
ELSE
LogMessage("[ORDERS] Skipped order retrieval (llGetOrders = .F.)", "INFO", gcLogFile)
@@ -430,139 +400,6 @@ loHttp = NULL
CloseLog(gnStartTime, gnProductsProcessed, gnOrdersProcessed, gcLogFile)
*-- Functie pentru salvarea array-ului de produse in format JSON
PROCEDURE SaveProductsArray
PARAMETERS tloAllData, tcFileName
LOCAL lcJsonContent, lnPropCount, lnIndex, lcPropName, loProduct, lcProductJson
*-- Incepe array-ul JSON
lcJsonContent = "[" + CHR(13) + CHR(10)
*-- Verifica daca avem produse
IF TYPE('tloAllData.products') = 'O'
lnPropCount = AMEMBERS(laProducts, tloAllData.products, 0)
FOR lnIndex = 1 TO lnPropCount
lcPropName = laProducts(lnIndex)
loProduct = EVALUATE('tloAllData.products.' + lcPropName)
IF TYPE('loProduct') = 'O'
*-- Adauga virgula pentru elementele anterioare
IF lnIndex > 1
lcJsonContent = lcJsonContent + "," + CHR(13) + CHR(10)
ENDIF
*-- Serializeaza produsul cu nfjsoncreate standard
lcProductJson = nfJsonCreate(loProduct, .F.)
lcJsonContent = lcJsonContent + " " + lcProductJson
ENDIF
ENDFOR
ENDIF
*-- Inchide array-ul JSON
lcJsonContent = lcJsonContent + CHR(13) + CHR(10) + "]"
*-- Salveaza fisierul
STRTOFILE(lcJsonContent, tcFileName)
ENDPROC
*-- Functie pentru salvarea array-ului de comenzi in format JSON
PROCEDURE SaveOrdersArray
PARAMETERS tloAllData, tcFileName
LOCAL lcJsonContent, lnPropCount, lnIndex, lcPropName, loOrder, lcOrderJson
*-- Incepe array-ul JSON
lcJsonContent = "[" + CHR(13) + CHR(10)
*-- Verifica daca avem comenzi
IF TYPE('tloAllData.orders') = 'O'
lnPropCount = AMEMBERS(laOrders, tloAllData.orders, 0)
FOR lnIndex = 1 TO lnPropCount
lcPropName = laOrders(lnIndex)
loOrder = EVALUATE('tloAllData.orders.' + lcPropName)
IF TYPE('loOrder') = 'O'
*-- Adauga virgula pentru elementele anterioare
IF lnIndex > 1
lcJsonContent = lcJsonContent + "," + CHR(13) + CHR(10)
ENDIF
*-- Serializeaza comanda cu nfjsoncreate standard
lcOrderJson = nfJsonCreate(loOrder, .F.)
lcJsonContent = lcJsonContent + " " + lcOrderJson
ENDIF
ENDFOR
ENDIF
*-- Inchide array-ul JSON
lcJsonContent = lcJsonContent + CHR(13) + CHR(10) + "]"
*-- Salveaza fisierul
STRTOFILE(lcJsonContent, tcFileName)
ENDPROC
*-- Functie pentru unirea produselor din toate paginile (versiune simpla)
PROCEDURE MergeProducts
PARAMETERS tloAllData, tloPageData
LOCAL lnPropCount, lnIndex, lcPropName, loProduct
*-- Verifica daca avem produse in pagina curenta
IF TYPE('tloPageData.products') = 'O'
*-- Itereaza prin toate produsele din pagina
lnPropCount = AMEMBERS(laPageProducts, tloPageData.products, 0)
FOR lnIndex = 1 TO lnPropCount
lcPropName = laPageProducts(lnIndex)
loProduct = EVALUATE('tloPageData.products.' + lcPropName)
IF TYPE('loProduct') = 'O'
*-- Adauga produsul la colectia principala
ADDPROPERTY(tloAllData.products, lcPropName, loProduct)
ENDIF
ENDFOR
ENDIF
ENDPROC
*-- Functie pentru unirea comenzilor din array direct (structura GoMag)
PROCEDURE MergeOrdersArray
PARAMETERS tloAllData, tloPageData
LOCAL lnPropCount, lnIndex, lcPropName, loOrder
*-- Verifica daca avem comenzi in pagina curenta
IF TYPE('tloPageData.orders') = 'O'
*-- Itereaza prin toate comenzile din pagina (array direct)
lnPropCount = AMEMBERS(laPageOrders, tloPageData.orders, 0)
FOR lnIndex = 1 TO lnPropCount
lcPropName = laPageOrders(lnIndex)
loOrder = EVALUATE('tloPageData.orders.' + lcPropName)
IF TYPE('loOrder') = 'O'
*-- Folosim ID-ul comenzii ca nume proprietate, sau un index secvential
LOCAL lcOrderId
lcOrderId = ""
IF TYPE('loOrder.id') = 'C'
lcOrderId = "order_" + loOrder.id
ELSE
lcOrderId = "order_" + TRANSFORM(lnIndex)
ENDIF
*-- Adauga comanda la colectia principala
ADDPROPERTY(tloAllData.orders, lcOrderId, loOrder)
ENDIF
ENDFOR
ENDIF
ENDPROC
*-- Functiile utilitare au fost mutate in utils.prg

7
vfp/gomag-comenzi.sql Normal file
View File

@@ -0,0 +1,7 @@
alter table COMENZI_ELEMENTE add ptva number(5,2);
comment on column COMENZI_ELEMENTE.ptva is 'PROCENT TVA (11,21)';
-- ARTICOLE_TERTI
-- PACK_COMENZI
-- PACK_IMPORT_PARTENERI
-- PACK_IMPORT_COMENZI

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff