Actualizare documentatie si plan pentru VFP Orchestrator
- CLAUDE.md: Actualizare completa cu architecture multi-tier si status project - PRD.md: Adaugat plan detaliat pentru sync-comenzi-web.prg cu: * Flux complet de procesare (input/output/logging) * Helper functions necesare (CleanGoMagText, BuildArticlesJSON, etc.) * Cod complet pentru procesarea articolelor GoMag → Oracle * Gestionare cazuri speciale (shipping/billing/discounts) * Mapare detaliata Phase 2 cu P2-001 prin P2-004 - LLM_PROJECT_MANAGER_PROMPT.md: Update comenzi disponibile Phase 1 Database Foundation: 75% complete, ready for P1-004 testing Phase 2 VFP Integration: Fully planned, ready for implementation 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -219,10 +219,7 @@ Toate story-urile sunt stocate în fișiere individuale în `docs/stories/` cu f
|
||||
## 🚀 Getting Started
|
||||
|
||||
**Primul tau task:**
|
||||
1. Citește întregul PRD furnizat
|
||||
2. Generează toate story-urile pentru Phase 1
|
||||
3. Prezintă overall project plan cu timeline
|
||||
4. Începe tracking primul story
|
||||
1. Citește întregul PRD furnizat și verifică dacă există story-uri pentru fiecare fază și la care fază/story ai rămas
|
||||
|
||||
**Întreabă-mă dacă:**
|
||||
- Necesită clarificări tehnice despre PRD
|
||||
@@ -230,6 +227,15 @@ Toate story-urile sunt stocate în fișiere individuale în `docs/stories/` cu f
|
||||
- Apare vreo dependency neidentificată
|
||||
- Ai nevoie de input pentru estimări
|
||||
|
||||
**Întreabă-mă dacă:**
|
||||
Afișează comenzile disponibile
|
||||
- status - Progres overall
|
||||
- stories - Lista story-uri
|
||||
- phase - Detalii fază curentă
|
||||
- risks - Identificare riscuri
|
||||
- demo [story-id] - Demo funcționalitate
|
||||
- plan - Re-planificare
|
||||
|
||||
---
|
||||
|
||||
**Acum începe cu:** "Am analizat PRD-ul și sunt gata să coordonez implementarea. Să încep cu generarea story-urilor pentru Phase 1?"
|
||||
**Acum începe cu:** "Am analizat PRD-ul și sunt gata să coordonez implementarea. Vrei să îți spun care a fost ultimul story si care este statusul său?"
|
||||
181
docs/PRD.md
181
docs/PRD.md
@@ -106,10 +106,167 @@ CREATE TABLE ARTICOLE_TERTI (
|
||||
|
||||
**Responsabilități:**
|
||||
- Rulare automată (timer 5 minute)
|
||||
- Citire comenzi din API-ul web
|
||||
- Apelare package-uri Oracle
|
||||
- Citire comenzi din JSON-ul generat de gomag-vending.prg
|
||||
- Procesare comenzi GoMag cu mapare completă la Oracle
|
||||
- Apelare package-uri Oracle pentru import
|
||||
- Logging în fișiere text cu timestamp
|
||||
|
||||
**Fluxul complet de procesare:**
|
||||
1. **Input:** Citește `output/gomag_orders_last7days_*.json`
|
||||
2. **Pentru fiecare comandă:**
|
||||
- Extrage date billing/shipping
|
||||
- Procesează parteneri (persoane fizice vs companii)
|
||||
- Mapează articole web → ROA
|
||||
- Creează comandă în Oracle cu toate detaliile
|
||||
3. **Output:** Log complet în `logs/sync_comenzi_YYYYMMDD.log`
|
||||
|
||||
**Funcții helper necesare:**
|
||||
- `CleanGoMagText()` - Curățare HTML entities
|
||||
- `ProcessGoMagOrder()` - Procesare comandă completă
|
||||
- `BuildArticlesJSON()` - Transformare items → JSON Oracle
|
||||
- `FormatAddressForOracle()` - Adrese în format semicolon
|
||||
- `HandleSpecialCases()` - Shipping vs billing, discounts, etc.
|
||||
|
||||
**Procesare Date GoMag pentru IMPORT_PARTENERI:**
|
||||
|
||||
*Decodare HTML entities în caractere simple (fără diacritice):*
|
||||
```foxpro
|
||||
* Funcție de curățare text GoMag
|
||||
FUNCTION CleanGoMagText(tcText)
|
||||
LOCAL lcResult
|
||||
lcResult = tcText
|
||||
lcResult = STRTRAN(lcResult, 'ă', 'a') && ă → a
|
||||
lcResult = STRTRAN(lcResult, 'ș', 's') && ș → s
|
||||
lcResult = STRTRAN(lcResult, 'ț', 't') && ț → t
|
||||
lcResult = STRTRAN(lcResult, 'î', 'i') && î → i
|
||||
lcResult = STRTRAN(lcResult, 'â', 'a') && â → a
|
||||
RETURN lcResult
|
||||
ENDFUNC
|
||||
```
|
||||
|
||||
*Pregătire date partener din billing GoMag:*
|
||||
```foxpro
|
||||
* Pentru persoane fizice (când billing.company e gol):
|
||||
IF EMPTY(loBilling.company.name)
|
||||
lcDenumire = CleanGoMagText(loBilling.firstname + ' ' + loBilling.lastname)
|
||||
lcCodFiscal = NULL && persoane fizice nu au CUI în GoMag
|
||||
ELSE
|
||||
* Pentru companii:
|
||||
lcDenumire = CleanGoMagText(loBilling.company.name)
|
||||
lcCodFiscal = loBilling.company.code && CUI companie
|
||||
ENDIF
|
||||
|
||||
* Formatare adresă pentru Oracle (format semicolon):
|
||||
lcAdresa = "JUD:" + CleanGoMagText(loBilling.region) + ";" + ;
|
||||
CleanGoMagText(loBilling.city) + ";" + ;
|
||||
CleanGoMagText(loBilling.address)
|
||||
|
||||
* Date contact
|
||||
lcTelefon = loBilling.phone
|
||||
lcEmail = loBilling.email
|
||||
```
|
||||
|
||||
*Apel package Oracle IMPORT_PARTENERI:*
|
||||
```foxpro
|
||||
* Apelare IMPORT_PARTENERI.cauta_sau_creeaza_partener
|
||||
lcSQL = "SELECT IMPORT_PARTENERI.cauta_sau_creeaza_partener(?, ?, ?, ?, ?) AS ID_PART FROM dual"
|
||||
|
||||
* Executare cu parametri:
|
||||
* p_cod_fiscal, p_denumire, p_adresa, p_telefon, p_email
|
||||
lnIdPart = SQLEXEC(goConnectie, lcSQL, lcCodFiscal, lcDenumire, lcAdresa, lcTelefon, lcEmail, "cursor_result")
|
||||
|
||||
IF lnIdPart > 0 AND RECCOUNT("cursor_result") > 0
|
||||
lnPartnerID = cursor_result.ID_PART
|
||||
* Continuă cu procesarea comenzii...
|
||||
ELSE
|
||||
* Log eroare partener
|
||||
WriteLog("ERROR: Nu s-a putut crea/găsi partenerul: " + lcDenumire)
|
||||
ENDIF
|
||||
```
|
||||
|
||||
**Procesare Articole pentru IMPORT_COMENZI:**
|
||||
|
||||
*Construire JSON articole din items GoMag:*
|
||||
```foxpro
|
||||
* Funcție BuildArticlesJSON - transformă items GoMag în format Oracle
|
||||
FUNCTION BuildArticlesJSON(loItems)
|
||||
LOCAL lcJSON, i, loItem
|
||||
lcJSON = "["
|
||||
|
||||
FOR i = 1 TO loItems.Count
|
||||
loItem = loItems.Item(i)
|
||||
|
||||
IF i > 1
|
||||
lcJSON = lcJSON + ","
|
||||
ENDIF
|
||||
|
||||
* Format JSON conform package Oracle: {"sku":"...", "cantitate":..., "pret":...}
|
||||
lcJSON = lcJSON + "{" + ;
|
||||
'"sku":"' + CleanGoMagText(loItem.sku) + '",' + ;
|
||||
'"cantitate":' + TRANSFORM(VAL(loItem.quantity)) + ',' + ;
|
||||
'"pret":' + TRANSFORM(VAL(loItem.price)) + ;
|
||||
"}"
|
||||
ENDFOR
|
||||
|
||||
lcJSON = lcJSON + "]"
|
||||
RETURN lcJSON
|
||||
ENDFUNC
|
||||
```
|
||||
|
||||
*Gestionare cazuri speciale:*
|
||||
```foxpro
|
||||
* Informații adiționale pentru observații
|
||||
lcObservatii = "Payment: " + CleanGoMagText(loOrder.payment.name) + "; " + ;
|
||||
"Delivery: " + CleanGoMagText(loOrder.delivery.name) + "; " + ;
|
||||
"Status: " + CleanGoMagText(loOrder.status) + "; " + ;
|
||||
"Source: " + CleanGoMagText(loOrder.source) + " " + CleanGoMagText(loOrder.sales_channel)
|
||||
|
||||
* Adrese diferite shipping vs billing
|
||||
IF NOT (CleanGoMagText(loOrder.shipping.address) == CleanGoMagText(loBilling.address))
|
||||
lcObservatii = lcObservatii + "; Shipping: " + ;
|
||||
CleanGoMagText(loOrder.shipping.address) + ", " + ;
|
||||
CleanGoMagText(loOrder.shipping.city)
|
||||
ENDIF
|
||||
```
|
||||
|
||||
*Apel package Oracle IMPORT_COMENZI:*
|
||||
```foxpro
|
||||
* Conversie dată GoMag → Oracle
|
||||
ldDataComanda = CTOD(SUBSTR(loOrder.date, 1, 10)) && "2025-08-27 16:32:43" → date
|
||||
|
||||
* JSON articole
|
||||
lcArticoleJSON = BuildArticlesJSON(loOrder.items)
|
||||
|
||||
* Apelare IMPORT_COMENZI.importa_comanda_web
|
||||
lcSQL = "SELECT IMPORT_COMENZI.importa_comanda_web(?, ?, ?, ?, ?, ?) AS ID_COMANDA FROM dual"
|
||||
|
||||
lnResult = SQLEXEC(goConnectie, lcSQL, ;
|
||||
loOrder.number, ; && p_nr_comanda_ext
|
||||
ldDataComanda, ; && p_data_comanda
|
||||
lnPartnerID, ; && p_id_partener (din pas anterior)
|
||||
lcArticoleJSON, ; && p_json_articole
|
||||
NULL, ; && p_id_adresa_livrare (opțional)
|
||||
lcObservatii, ; && p_observatii
|
||||
"cursor_comanda")
|
||||
|
||||
IF lnResult > 0 AND cursor_comanda.ID_COMANDA > 0
|
||||
WriteLog("SUCCESS: Comandă importată - ID: " + TRANSFORM(cursor_comanda.ID_COMANDA))
|
||||
ELSE
|
||||
WriteLog("ERROR: Import comandă eșuat pentru: " + loOrder.number)
|
||||
ENDIF
|
||||
```
|
||||
|
||||
**Note Importante:**
|
||||
- Toate caracterele HTML trebuie transformate în ASCII simplu (fără diacritice)
|
||||
- Package-ul Oracle așteaptă text curat, fără entități HTML
|
||||
- Adresa trebuie în format semicolon cu prefix "JUD:" pentru județ
|
||||
- Cod fiscal NULL pentru persoane fizice este acceptabil
|
||||
- JSON articole: exact formatul `{"sku":"...", "cantitate":..., "pret":...}`
|
||||
- Conversie date GoMag: `"2025-08-27 16:32:43"` → `CTOD()` pentru Oracle
|
||||
- Observații: concatenează payment/delivery/status/source pentru tracking
|
||||
- Gestionează adrese diferite shipping vs billing în observații
|
||||
- Utilizează conexiunea Oracle existentă (goConnectie)
|
||||
|
||||
### 4. Web Admin Interface
|
||||
|
||||
**Funcționalități:**
|
||||
@@ -129,10 +286,20 @@ CREATE TABLE ARTICOLE_TERTI (
|
||||
- [ ] 🔄 **P1-004:** Testare manuală package-uri (NEXT UP!)
|
||||
|
||||
### Phase 2: VFP Integration (Ziua 2)
|
||||
- [ ] Adaptare gomag-vending-test.prg pentru output JSON
|
||||
- [ ] Creare sync-comenzi-web.prg
|
||||
- [ ] Testare import comenzi end-to-end
|
||||
- [ ] Configurare logging
|
||||
- [ ] **P2-001:** Adaptare gomag-vending.prg pentru output JSON (READY - doar activare GetOrders)
|
||||
- [ ] **P2-002:** Creare sync-comenzi-web.prg cu toate helper functions
|
||||
- [ ] **P2-003:** Testare import comenzi end-to-end cu date reale GoMag
|
||||
- [ ] **P2-004:** Configurare logging și error handling complet
|
||||
|
||||
**Detalii P2-002 (sync-comenzi-web.prg):**
|
||||
- `CleanGoMagText()` - HTML entities cleanup
|
||||
- `ProcessGoMagOrder()` - Main orchestrator per order
|
||||
- `BuildArticlesJSON()` - Items conversion for Oracle
|
||||
- `FormatAddressForOracle()` - Semicolon format
|
||||
- `HandleSpecialCases()` - Shipping/billing/discounts/payments
|
||||
- Integration cu logging existent din utils.prg
|
||||
- Timer-based execution (5 minute intervals)
|
||||
- Complete error handling cu retry logic
|
||||
|
||||
### Phase 3: Web Admin Interface (Ziua 3)
|
||||
- [ ] Flask app cu connection pool Oracle
|
||||
@@ -355,5 +522,5 @@ Toate story-urile pentru fiecare fază sunt stocate în `docs/stories/` cu detal
|
||||
---
|
||||
|
||||
**Document Owner:** Development Team
|
||||
**Last Updated:** 09 septembrie 2025, 10:45
|
||||
**Last Updated:** 09 septembrie 2025, 12:15 (Updated VFP Orchestrator plan)
|
||||
**Next Review:** După P1-004 completion (Phase 1 FINALIZAT!)
|
||||
Reference in New Issue
Block a user