Compare commits
2 Commits
f315aad14c
...
21e26806f7
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
21e26806f7 | ||
|
|
47b5723f92 |
@@ -154,6 +154,12 @@ async def run_catalog_price_sync(run_id: str):
|
||||
if is_kit:
|
||||
for comp in mapped_data[sku]:
|
||||
comp_codmat = comp["codmat"]
|
||||
|
||||
# Skip components that have their own ARTICOLE_TERTI mapping
|
||||
# (they'll be synced with correct cantitate_roa in individual path)
|
||||
if comp_codmat in mapped_data:
|
||||
continue
|
||||
|
||||
comp_product = products_by_sku.get(comp_codmat)
|
||||
if not comp_product:
|
||||
continue # Component not in GoMag as standalone product
|
||||
|
||||
@@ -542,8 +542,9 @@ def sync_prices_from_order(orders, mapped_codmat_data: dict, direct_id_map: dict
|
||||
kit_discount_codmat = (settings or {}).get("kit_discount_codmat", "")
|
||||
skip_codmats = {transport_codmat, discount_codmat, kit_discount_codmat} - {""}
|
||||
|
||||
# Build set of kit SKUs (>1 component)
|
||||
kit_skus = {sku for sku, comps in mapped_codmat_data.items() if len(comps) > 1}
|
||||
# Build set of kit/bax SKUs (>1 component, or single component with cantitate_roa > 1)
|
||||
kit_skus = {sku for sku, comps in mapped_codmat_data.items()
|
||||
if len(comps) > 1 or (len(comps) == 1 and (comps[0].get("cantitate_roa") or 1) > 1)}
|
||||
|
||||
updated = []
|
||||
own_conn = conn is None
|
||||
|
||||
@@ -66,6 +66,7 @@
|
||||
-- 20.03.2026 - kit pricing extins pt reambalari single-component (cantitate_roa > 1)
|
||||
-- 21.03.2026 - diagnostic detaliat discount kit (id_pol, id_art, codmat in eroare)
|
||||
-- 21.03.2026 - fix discount amount: v_disc_amt e per-kit, nu se imparte la v_cantitate_web
|
||||
-- 25.03.2026 - skip negative kit discount (markup), ROUND prices to nzecimale_pretv
|
||||
-- ====================================================================
|
||||
CREATE OR REPLACE PACKAGE PACK_IMPORT_COMENZI AS
|
||||
|
||||
@@ -284,6 +285,9 @@ CREATE OR REPLACE PACKAGE BODY PACK_IMPORT_COMENZI AS
|
||||
v_kit_disc_count PLS_INTEGER := 0;
|
||||
v_kit_disc_found BOOLEAN;
|
||||
|
||||
-- Zecimale pret vanzare (din optiuni firma, default 2)
|
||||
v_nzec_pretv PLS_INTEGER := NVL(TO_NUMBER(pack_sesiune.getoptiunefirma(USER, 'PPRETV')), 2);
|
||||
|
||||
-- pljson
|
||||
l_json_articole CLOB := p_json_articole;
|
||||
v_json_arr pljson_list;
|
||||
@@ -492,8 +496,10 @@ CREATE OR REPLACE PACKAGE BODY PACK_IMPORT_COMENZI AS
|
||||
END IF;
|
||||
|
||||
-- pret_ajustat = pret_cu_tva - discount_share / cantitate_roa
|
||||
v_pret_ajustat := v_kit_comps(i_comp).pret_cu_tva -
|
||||
(v_discount_share / v_kit_comps(i_comp).cantitate_roa);
|
||||
v_pret_ajustat := ROUND(
|
||||
v_kit_comps(i_comp).pret_cu_tva -
|
||||
(v_discount_share / v_kit_comps(i_comp).cantitate_roa),
|
||||
v_nzec_pretv);
|
||||
|
||||
BEGIN
|
||||
merge_or_insert_articol(
|
||||
@@ -578,8 +584,8 @@ CREATE OR REPLACE PACKAGE BODY PACK_IMPORT_COMENZI AS
|
||||
v_vat_disc_alloc := v_vat_disc_alloc + v_disc_amt;
|
||||
END IF;
|
||||
|
||||
IF v_disc_amt != 0 THEN
|
||||
v_unit_pret := v_disc_amt;
|
||||
IF v_disc_amt > 0 THEN
|
||||
v_unit_pret := ROUND(v_disc_amt, v_nzec_pretv);
|
||||
|
||||
-- Search for existing entry with same (ptva, pret) to merge qty
|
||||
v_kit_disc_found := FALSE;
|
||||
|
||||
54
api/database-scripts/09_articole_terti_050.sql
Normal file
54
api/database-scripts/09_articole_terti_050.sql
Normal file
@@ -0,0 +1,54 @@
|
||||
-- ====================================================================
|
||||
-- 09_articole_terti_050.sql
|
||||
-- Mapări ARTICOLE_TERTI cu cantitate_roa = 0.5 pentru articole
|
||||
-- unde unitatea web (50 buc/set) ≠ unitatea ROA (100 buc/set).
|
||||
--
|
||||
-- Efect: price sync va calcula pret_crm = pret_web / 0.5,
|
||||
-- iar kit pricing va folosi prețul corect per set ROA.
|
||||
--
|
||||
-- 25.03.2026 - creat pentru fix discount negativ kit pahare
|
||||
-- ====================================================================
|
||||
|
||||
-- Pahar 6oz Coffee Coffee SIBA 50buc (GoMag) → 100buc/set (ROA)
|
||||
INSERT INTO articole_terti (sku, codmat, cantitate_roa, activ, sters, data_creare, id_util_creare)
|
||||
SELECT '1708828', '1708828', 0.5, 1, 0, SYSDATE, -3 FROM dual
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1 FROM articole_terti WHERE sku = '1708828' AND codmat = '1708828' AND sters = 0
|
||||
);
|
||||
|
||||
-- Pahar 8oz Coffee Coffee SIBA 50buc → 100buc/set
|
||||
INSERT INTO articole_terti (sku, codmat, cantitate_roa, activ, sters, data_creare, id_util_creare)
|
||||
SELECT '528795', '528795', 0.5, 1, 0, SYSDATE, -3 FROM dual
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1 FROM articole_terti WHERE sku = '528795' AND codmat = '528795' AND sters = 0
|
||||
);
|
||||
|
||||
-- Pahar 8oz Tchibo 50buc → 100buc/set
|
||||
INSERT INTO articole_terti (sku, codmat, cantitate_roa, activ, sters, data_creare, id_util_creare)
|
||||
SELECT '58', '58', 0.5, 1, 0, SYSDATE, -3 FROM dual
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1 FROM articole_terti WHERE sku = '58' AND codmat = '58' AND sters = 0
|
||||
);
|
||||
|
||||
-- Pahar 7oz Lavazza SIBA 50buc → 100buc/set
|
||||
INSERT INTO articole_terti (sku, codmat, cantitate_roa, activ, sters, data_creare, id_util_creare)
|
||||
SELECT '51', '51', 0.5, 1, 0, SYSDATE, -3 FROM dual
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1 FROM articole_terti WHERE sku = '51' AND codmat = '51' AND sters = 0
|
||||
);
|
||||
|
||||
-- Pahar 8oz Albastru JND 50buc → 100buc/set
|
||||
INSERT INTO articole_terti (sku, codmat, cantitate_roa, activ, sters, data_creare, id_util_creare)
|
||||
SELECT '105712338826', '105712338826', 0.5, 1, 0, SYSDATE, -3 FROM dual
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1 FROM articole_terti WHERE sku = '105712338826' AND codmat = '105712338826' AND sters = 0
|
||||
);
|
||||
|
||||
-- Pahar 8oz Paris JND 50buc → 100buc/set
|
||||
INSERT INTO articole_terti (sku, codmat, cantitate_roa, activ, sters, data_creare, id_util_creare)
|
||||
SELECT '10573080', '10573080', 0.5, 1, 0, SYSDATE, -3 FROM dual
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1 FROM articole_terti WHERE sku = '10573080' AND codmat = '10573080' AND sters = 0
|
||||
);
|
||||
|
||||
COMMIT;
|
||||
@@ -1,241 +0,0 @@
|
||||
# LLM Project Manager Prompt
|
||||
## Pentru Implementarea PRD: Import Comenzi Web → Sistem ROA
|
||||
|
||||
Tu ești un **Project Manager AI specializat** care urmărește implementarea unui PRD (Product Requirements Document) prin descompunerea în user stories executabile și urmărirea progresului.
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Misiunea Ta
|
||||
|
||||
Implementezi sistemul de import automat comenzi web → ERP ROA Oracle conform PRD-ului furnizat. Vei coordona dezvoltarea în 4 faze distincte, urmărind fiecare story și asigurându-te că totul este livrat conform specificațiilor.
|
||||
|
||||
---
|
||||
|
||||
## 📋 Context PRD
|
||||
|
||||
**Sistem:** Import comenzi de pe platforme web (GoMag, etc.) în sistemul ERP ROA Oracle
|
||||
**Tech Stack:** Oracle PL/SQL + Visual FoxPro 9 + FastApi (admin interface)
|
||||
**Componente Principale:**
|
||||
- Package Oracle pentru parteneri și comenzi
|
||||
- Orchestrator VFP pentru sincronizare automată
|
||||
- Interfață web pentru administrare mapări SKU
|
||||
- Tabel nou ARTICOLE_TERTI pentru mapări complexe
|
||||
|
||||
---
|
||||
|
||||
## 📊 User Stories Framework
|
||||
|
||||
Pentru fiecare story, vei genera:
|
||||
|
||||
### Story Template:
|
||||
```
|
||||
**Story ID:** [FASE]-[NR] (ex: P1-001)
|
||||
**Titlu:** [Descriere concisă]
|
||||
**As a:** [Utilizator/Sistem]
|
||||
**I want:** [Funcționalitate dorită]
|
||||
**So that:** [Beneficiul de business]
|
||||
|
||||
**Acceptance Criteria:**
|
||||
- [ ] Criteriu 1
|
||||
- [ ] Criteriu 2
|
||||
- [ ] Criteriu 3
|
||||
|
||||
**Technical Tasks:**
|
||||
- [ ] Task tehnic 1
|
||||
- [ ] Task tehnic 2
|
||||
|
||||
**Definition of Done:**
|
||||
- [ ] Cod implementat și testat
|
||||
- [ ] Documentație actualizată
|
||||
- [ ] Error handling complet
|
||||
- [ ] Logging implementat
|
||||
- [ ] Review code efectuat
|
||||
|
||||
**Estimate:** [XS/S/M/L/XL] ([ore estimate])
|
||||
**Dependencies:** [Alte story-uri necesare]
|
||||
**Risk Level:** [Low/Medium/High]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🏗️ Faze de Implementare
|
||||
|
||||
### **PHASE 1: Database Foundation (Ziua 1)**
|
||||
Creează story-uri pentru:
|
||||
- Tabel ARTICOLE_TERTI cu structura specificată
|
||||
- Package IMPORT_PARTENERI complet funcțional
|
||||
- Package IMPORT_COMENZI cu logica de mapare
|
||||
- Teste unitare pentru package-uri
|
||||
|
||||
### **PHASE 2: VFP Integration (Ziua 2)**
|
||||
Creează story-uri pentru:
|
||||
- Adaptare gomag-adapter.prg pentru JSON output
|
||||
- Orchestrator sync-comenzi-web.prg cu timer
|
||||
- Integrare Oracle packages în VFP
|
||||
- Sistem de logging cu rotație
|
||||
|
||||
### **PHASE 3: Web Admin Interface (Ziua 3)**
|
||||
Creează story-uri pentru:
|
||||
- Flask app cu Oracle connection pool
|
||||
- HTML/CSS interface pentru admin mapări
|
||||
- JavaScript pentru CRUD operații
|
||||
- Validări client-side și server-side
|
||||
|
||||
### **PHASE 4: Testing & Deployment (Ziua 4)**
|
||||
Creează story-uri pentru:
|
||||
- Testare end-to-end cu comenzi reale
|
||||
- Validare mapări complexe (seturi, reîmpachetări)
|
||||
- Configurare environment production
|
||||
- Documentație utilizare finală
|
||||
|
||||
---
|
||||
|
||||
## 🔄 Workflow de Urmărire
|
||||
|
||||
### La început de sesiune:
|
||||
1. **Prezintă status overview:** "PHASE X - Y% complete, Z stories remaining"
|
||||
2. **Identifică story-ul curent** și dependencies
|
||||
3. **Verifică blocaje** și propune soluții
|
||||
4. **Actualizează planning-ul** dacă e nevoie
|
||||
|
||||
### Pe durata implementării:
|
||||
1. **Urmărește progresul** fiecărui task în story
|
||||
2. **Validează completion criteria** înainte să marchezi DONE
|
||||
3. **Identifică riscos** și alertează proactiv
|
||||
4. **Propune optimizări** de proces
|
||||
|
||||
### La finalizare story:
|
||||
1. **Demo功能** implementată
|
||||
2. **Confirmă acceptance criteria** îndeplinite
|
||||
3. **Planifică next story** cu dependencies
|
||||
4. **Actualizează overall progress**
|
||||
|
||||
---
|
||||
|
||||
## 📊 Tracking & Reporting
|
||||
|
||||
### Daily Status Format:
|
||||
```
|
||||
📈 PROJECT STATUS - [DATA]
|
||||
═══════════════════════════════════
|
||||
|
||||
🎯 Current Phase: [PHASE X]
|
||||
📊 Overall Progress: [X]% ([Y]/[Z] stories done)
|
||||
⏰ Current Story: [STORY-ID] - [TITLE]
|
||||
🔄 Status: [IN PROGRESS/BLOCKED/READY FOR REVIEW]
|
||||
|
||||
📋 Today's Completed:
|
||||
- ✅ [Story completă]
|
||||
- ✅ [Task complet]
|
||||
|
||||
🚧 In Progress:
|
||||
- 🔄 [Story în lucru]
|
||||
- ⏳ [Task în progress]
|
||||
|
||||
⚠️ Blockers:
|
||||
- 🚨 [Blocker 1]
|
||||
- 🔍 [Issue necesitând decizie]
|
||||
|
||||
📅 Next Up:
|
||||
- 📝 [Next story ready]
|
||||
- 🔜 [Upcoming dependency]
|
||||
|
||||
🎯 Phase Target: [Data target] | Risk: [LOW/MED/HIGH]
|
||||
```
|
||||
|
||||
### Weekly Sprint Review:
|
||||
- Retrospectivă story-uri complete vs planificate
|
||||
- Analiza blockers întâlniți și soluții
|
||||
- Ajustări planning pentru săptămâna următoare
|
||||
- Identificare lesson learned
|
||||
|
||||
---
|
||||
|
||||
## 🚨 Risk Management
|
||||
|
||||
### Categorii Risc:
|
||||
- **HIGH:** Blockers care afectează multiple story-uri
|
||||
- **MEDIUM:** Delay-uri care pot afecta phase target
|
||||
- **LOW:** Issues locale care nu afectează planning-ul
|
||||
|
||||
### Escalation Matrix:
|
||||
1. **Technical Issues:** Propui soluții alternative/workaround
|
||||
2. **Dependency Blockers:** Replanifici priority și sequence
|
||||
3. **Scope Changes:** Alertezi și ceri validare înainte de implementare
|
||||
|
||||
---
|
||||
|
||||
## 🎛️ Comenzi Disponibile
|
||||
|
||||
Răspunzi la comenzile:
|
||||
- `status` - Overall progress și current story
|
||||
- `stories` - Lista toate story-urile cu status
|
||||
- `phase` - Detalii phase curentă
|
||||
- `risks` - Identifică și prioritizează riscuri
|
||||
- `demo [story-id]` - Demonstrație funcționalitate implementată
|
||||
- `plan` - Re-planificare dacă apar schimbări
|
||||
|
||||
## 📋 User Stories Location
|
||||
|
||||
Toate story-urile sunt stocate în fișiere individuale în `docs/stories/` cu format:
|
||||
- **P1-001-ARTICOLE_TERTI.md** - Story complet cu acceptance criteria
|
||||
- **P1-002-Package-IMPORT_PARTENERI.md** - Detalii implementare parteneri
|
||||
- **P1-003-Package-IMPORT_COMENZI.md** - Logică import comenzi
|
||||
- **P1-004-Testing-Manual-Packages.md** - Plan testare
|
||||
|
||||
**Beneficii:**
|
||||
- Nu mai regenerez story-urile la fiecare sesiune
|
||||
- Persistența progresului și update-urilor
|
||||
- Ușor de referenciat și de împărtășit cu stakeholders
|
||||
|
||||
---
|
||||
|
||||
## 💡 Success Criteria
|
||||
|
||||
### Technical KPIs:
|
||||
- Import success rate > 95%
|
||||
- Timp mediu procesare < 30s per comandă
|
||||
- Zero downtime pentru ROA principal
|
||||
- 100% log coverage
|
||||
|
||||
### Project KPIs:
|
||||
- Stories delivered on time: >90%
|
||||
- Zero blockers mai mult de 1 zi
|
||||
- Code review coverage: 100%
|
||||
- Documentation completeness: 100%
|
||||
|
||||
---
|
||||
|
||||
## 🤖 Personality & Communication Style
|
||||
|
||||
- **Proactiv:** Anticipezi probleme și propui soluții
|
||||
- **Data-driven:** Folosești metrici concrete pentru tracking
|
||||
- **Pragmatic:** Focusat pe delivery și rezultate practice
|
||||
- **Comunicativ:** Updates clare și acționabile
|
||||
- **Quality-focused:** Nu accepti compromisuri pe Definition of Done
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Getting Started
|
||||
|
||||
**Primul tau task:**
|
||||
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
|
||||
- Vrei să ajustez priority sau sequence
|
||||
- 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. Vrei să îți spun care a fost ultimul story si care este statusul său?"
|
||||
610
docs/PRD.md
610
docs/PRD.md
@@ -1,610 +0,0 @@
|
||||
# Product Requirements Document (PRD)
|
||||
## Import Comenzi Web → Sistem ROA
|
||||
|
||||
**Versiune:** 1.2
|
||||
**Data:** 10 septembrie 2025
|
||||
**Status:** Phase 1 - ✅ COMPLET | Ready for Phase 2 VFP Integration
|
||||
|
||||
---
|
||||
|
||||
## 📋 Overview
|
||||
|
||||
Sistem ultra-minimal pentru importul comenzilor de pe platforme web (GoMag, etc.) în sistemul ERP ROA Oracle. Sistemul gestionează automat maparea produselor, crearea clienților și generarea comenzilor în ROA.
|
||||
|
||||
### Obiective Principale
|
||||
- ✅ Import automat comenzi web → ROA
|
||||
- ✅ Mapare flexibilă SKU → CODMAT (reîmpachetări + seturi)
|
||||
- ✅ Crearea automată a partenerilor noi
|
||||
- ✅ Interfață web pentru administrare mapări
|
||||
- ✅ Logging complet pentru troubleshooting
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Scope & Limitations
|
||||
|
||||
### În Scope
|
||||
- Import comenzi din orice platformă web (nu doar GoMag)
|
||||
- Mapare SKU complexe (1:1, 1:N, reîmpachetări, seturi)
|
||||
- Crearea automată parteneri + adrese
|
||||
- Interfață web admin pentru mapări
|
||||
- Logging în fișiere text
|
||||
|
||||
### Out of Scope
|
||||
- Modificarea comenzilor existente în ROA
|
||||
- Sincronizare bidirectională
|
||||
- Gestionarea stocurilor
|
||||
- Interfață pentru utilizatori finali
|
||||
|
||||
---
|
||||
|
||||
## 🏗️ Architecture Overview
|
||||
|
||||
```
|
||||
[Web Platform API] → [VFP Orchestrator] → [Oracle PL/SQL] → [Web Admin Interface]
|
||||
↓ ↓ ↑ ↑
|
||||
JSON Orders Process & Log Store/Update Configuration
|
||||
```
|
||||
|
||||
### Tech Stack
|
||||
- **Backend:** Oracle PL/SQL packages
|
||||
- **Integration:** Visual FoxPro 9
|
||||
- **Admin Interface:** Flask + Oracle
|
||||
- **Data:** Oracle 11g/12c
|
||||
|
||||
---
|
||||
|
||||
## 📊 Data Model
|
||||
|
||||
### Tabel Nou: ARTICOLE_TERTI
|
||||
```sql
|
||||
CREATE TABLE ARTICOLE_TERTI (
|
||||
sku VARCHAR2(100), -- SKU din platforma web
|
||||
codmat VARCHAR2(50), -- CODMAT din nom_articole
|
||||
cantitate_roa NUMBER(10,3), -- Câte unități ROA = 1 web
|
||||
procent_pret NUMBER(5,2), -- % din preț pentru seturi
|
||||
activ NUMBER(1), -- 1=activ, 0=inactiv
|
||||
PRIMARY KEY (sku, codmat)
|
||||
);
|
||||
```
|
||||
|
||||
### Exemple Mapări
|
||||
- **Simplu:** SKU "CAF01" → caută direct în nom_articole (nu se stochează)
|
||||
- **Reîmpachetare:** SKU "CAFE100" → CODMAT "CAF01", cantitate_roa=10
|
||||
- **Set compus:**
|
||||
- SKU "SET01" → CODMAT "CAF01", cantitate_roa=2, procent_pret=60
|
||||
- SKU "SET01" → CODMAT "FILT01", cantitate_roa=1, procent_pret=40
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Components Specification
|
||||
|
||||
### 1. Package IMPORT_PARTENERI
|
||||
|
||||
**Funcții:**
|
||||
- `cauta_sau_creeaza_partener()` - Găsește partener existent sau creează unul nou
|
||||
- `parseaza_adresa_semicolon()` - Parsează adrese format: "JUD:București;BUCURESTI;Str.Victoriei;10"
|
||||
|
||||
**Logica Căutare Parteneri:**
|
||||
1. Caută după cod_fiscal (dacă > 3 caractere)
|
||||
2. Caută după denumire exactă
|
||||
3. Creează partener nou folosind `pack_def.adauga_partener()`
|
||||
4. Adaugă adresa folosind `pack_def.adauga_adresa_partener2()`
|
||||
|
||||
### 2. Package IMPORT_COMENZI
|
||||
|
||||
**Funcții:**
|
||||
- `gaseste_articol_roa()` - Rezolvă SKU → articole ROA
|
||||
- `importa_comanda_web()` - Import comandă completă
|
||||
|
||||
**Logica Articole:**
|
||||
1. Verifică ARTICOLE_TERTI pentru SKU
|
||||
2. Dacă nu există → caută direct în nom_articole (SKU = CODMAT)
|
||||
3. Calculează cantități și prețuri conform mapărilor
|
||||
4. Folosește `PACK_COMENZI.adauga_comanda()` și `PACK_COMENZI.adauga_articol_comanda()`
|
||||
|
||||
### 3. VFP Orchestrator (sync-comenzi-web.prg)
|
||||
|
||||
**Responsabilități:**
|
||||
- Rulare automată (timer 5 minute)
|
||||
- Citire comenzi din JSON-ul generat de gomag-adapter.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:**
|
||||
- Vizualizare mapări SKU existente
|
||||
- Adăugare/editare/ștergere mapări
|
||||
- Validare date înainte de salvare
|
||||
- Interface responsive cu Flask
|
||||
|
||||
---
|
||||
|
||||
## 📋 Implementation Phases
|
||||
|
||||
### Phase 1: Database Foundation (Ziua 1) - 🎯 75% COMPLET
|
||||
- [x] ✅ **P1-001:** Creare tabel ARTICOLE_TERTI + Docker setup
|
||||
- [x] ✅ **P1-002:** Package IMPORT_PARTENERI complet
|
||||
- [x] ✅ **P1-003:** Package IMPORT_COMENZI complet
|
||||
- [ ] 🔄 **P1-004:** Testare manuală package-uri (NEXT UP!)
|
||||
|
||||
### Phase 2: VFP Integration (Ziua 2)
|
||||
- [ ] **P2-001:** Adaptare gomag-adapter.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
|
||||
- [ ] HTML/CSS pentru admin mapări
|
||||
- [ ] JavaScript pentru CRUD operații
|
||||
- [ ] Testare interfață web
|
||||
|
||||
### Phase 4: Testing & Deployment (Ziua 4)
|
||||
- [ ] Testare integrată pe comenzi reale
|
||||
- [ ] Validare mapări complexe (seturi)
|
||||
- [ ] Configurare environment production
|
||||
- [ ] Documentație utilizare
|
||||
|
||||
---
|
||||
|
||||
## 📁 File Structure
|
||||
|
||||
```
|
||||
/api/ # ✅ Flask Admin Interface
|
||||
├── admin.py # ✅ Flask app cu Oracle pool
|
||||
├── 01_create_table.sql # ✅ Tabel ARTICOLE_TERTI
|
||||
├── 02_import_parteneri.sql # ✅ Package parteneri (COMPLET)
|
||||
├── 03_import_comenzi.sql # ✅ Package comenzi (COMPLET)
|
||||
├── Dockerfile # ✅ Container cu Oracle client
|
||||
├── tnsnames.ora # ✅ Config Oracle ROA
|
||||
├── .env # ✅ Environment variables
|
||||
└── requirements.txt # ✅ Dependencies Python
|
||||
|
||||
/docs/ # 📋 Project Documentation
|
||||
├── PRD.md # ✅ Product Requirements Document
|
||||
├── LLM_PROJECT_MANAGER_PROMPT.md # ✅ Project Manager Prompt
|
||||
└── stories/ # 📋 User Stories (Detailed)
|
||||
├── P1-001-ARTICOLE_TERTI.md # ✅ Story P1-001 (COMPLET)
|
||||
├── P1-002-Package-IMPORT_PARTENERI.md # ✅ Story P1-002 (COMPLET)
|
||||
├── P1-003-Package-IMPORT_COMENZI.md # ✅ Story P1-003 (COMPLET)
|
||||
└── P1-004-Testing-Manual-Packages.md # 📋 Story P1-004
|
||||
|
||||
/vfp/ # ⏳ VFP Integration (Phase 2)
|
||||
└── sync-comenzi-web.prg # ⏳ Orchestrator principal
|
||||
|
||||
/docker-compose.yaml # ✅ Container orchestration
|
||||
/logs/ # ✅ Logging directory
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔒 Business Rules
|
||||
|
||||
### Parteneri
|
||||
- Căutare prioritate: cod_fiscal → denumire → creare nou
|
||||
- Persoane fizice (CUI 13 cifre): separă nume/prenume
|
||||
- Adrese: defaultează la București Sectorul 1 dacă nu găsește
|
||||
- Toate partenerele noi au ID_UTIL = -3 (sistem)
|
||||
|
||||
### Articole
|
||||
- SKU simple (găsite direct în nom_articole): nu se stochează în ARTICOLE_TERTI
|
||||
- Mapări speciale: doar reîmpachetări și seturi complexe
|
||||
- Validare: suma procent_pret pentru același SKU să fie logic
|
||||
- Articole inactive: activ=0 (nu se șterg)
|
||||
|
||||
### Comenzi
|
||||
- Folosește package-urile existente (PACK_COMENZI)
|
||||
- ID_GESTIUNE = 1, ID_SECTIE = 1, ID_POL = 0 (default)
|
||||
- Data livrare = data comenzii + 1 zi
|
||||
- Toate comenzile au INTERNA = 0 (externe)
|
||||
|
||||
---
|
||||
|
||||
## 📊 Success Metrics
|
||||
|
||||
### Technical Metrics
|
||||
- Import success rate > 95%
|
||||
- Timpul mediu de procesare < 30s per comandă
|
||||
- Zero downtime pentru sistemul principal ROA
|
||||
- Log coverage 100% (toate operațiile logate)
|
||||
|
||||
### Business Metrics
|
||||
- Reducerea timpului de introducere comenzi cu 90%
|
||||
- Eliminarea erorilor manuale de transcriere
|
||||
- Timpul de configurare mapări noi < 5 minute
|
||||
|
||||
---
|
||||
|
||||
## 🚨 Error Handling
|
||||
|
||||
### Categorii Erori
|
||||
1. **Erori conexiune Oracle:** Retry logic + alertă
|
||||
2. **SKU not found:** Log warning + skip articol
|
||||
3. **Partener invalid:** Tentativă creare + log detalii
|
||||
4. **Comenzi duplicate:** Skip cu log info
|
||||
|
||||
### Logging Format
|
||||
```
|
||||
2025-09-08 14:30:25 | COMANDA-123 | OK | ID:456789
|
||||
2025-09-08 14:30:26 | COMANDA-124 | ERROR | SKU 'XYZ' not found
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Configuration
|
||||
|
||||
### Environment Variables (.env)
|
||||
```env
|
||||
ORACLE_USER=MARIUSM_AUTO
|
||||
ORACLE_PASSWORD=********
|
||||
ORACLE_DSN=ROA_CENTRAL
|
||||
TNS_ADMIN=/app
|
||||
INSTANTCLIENTPATH=/opt/oracle/instantclient
|
||||
```
|
||||
|
||||
### ⚠️ **CRITICAL: Oracle Schema Details**
|
||||
|
||||
**Test Schema:** `MARIUSM_AUTO` (nu CONTAFIN_ORACLE)
|
||||
**Database:** Oracle 10g Enterprise Edition Release 10.2.0.4.0
|
||||
**TNS Connection:** ROA_CENTRAL (nu ROA_ROMFAST)
|
||||
|
||||
**Structura Reală Tables:**
|
||||
- `COMENZI` (nu `comenzi_antet`) - Comenzile principale
|
||||
- `COMENZI_ELEMENTE` (nu `comenzi_articole`) - Articolele din comenzi
|
||||
- `NOM_PARTENERI` - Partenerii
|
||||
- `NOM_ARTICOLE` - Articolele
|
||||
- `ARTICOLE_TERTI` - Mapările SKU (creat de noi)
|
||||
|
||||
**Foreign Key Constraints CRITICAL:**
|
||||
```sql
|
||||
-- Pentru COMENZI_ELEMENTE:
|
||||
ID_POL = 2 (obligatoriu, nu NULL sau 0)
|
||||
ID_VALUTA = 3 (obligatoriu, nu 1)
|
||||
ID_ARTICOL - din NOM_ARTICOLE
|
||||
ID_COMANDA - din COMENZI
|
||||
```
|
||||
|
||||
**Package Status în MARIUSM_AUTO:**
|
||||
- ✅ `PACK_IMPORT_PARTENERI` - VALID (header + body)
|
||||
- ✅ `PACK_JSON` - VALID (header + body)
|
||||
- ✅ `PACK_COMENZI` - VALID (header + body)
|
||||
- ✅ `PACK_IMPORT_COMENZI` - header VALID, body FIXED în P1-004
|
||||
|
||||
### VFP Configuration
|
||||
- Timer interval: 300 secunde (5 minute)
|
||||
- Conexiune Oracle prin goExecutor existent
|
||||
- Log files: sync_YYYYMMDD.log (rotație zilnică)
|
||||
|
||||
---
|
||||
|
||||
## 🎛️ Admin Interface Specification
|
||||
|
||||
### Main Screen: SKU Mappings
|
||||
- Tabel editabil cu coloane: SKU, CODMAT, Cantitate ROA, Procent Preț, Activ
|
||||
- Inline editing cu auto-save
|
||||
- Filtrare și căutare
|
||||
- Export/Import mapări (CSV)
|
||||
- Validare în timp real
|
||||
|
||||
### Features
|
||||
- Bulk operations (activare/dezactivare multiple)
|
||||
- Template mapări pentru tipuri comune
|
||||
- Preview calcul preț pentru teste
|
||||
- Audit trail (cine/când a modificat)
|
||||
|
||||
---
|
||||
|
||||
## 🏁 Definition of Done
|
||||
|
||||
### Per Feature
|
||||
- [ ] Cod implementat și testat
|
||||
- [ ] Documentație actualizată
|
||||
- [ ] Error handling complet
|
||||
- [ ] Logging implementat
|
||||
- [ ] Review code efectuat
|
||||
|
||||
### Per Phase
|
||||
- [ ] Toate feature-urile Phase complete
|
||||
- [ ] Testare integrată reușită
|
||||
- [ ] Performance requirements îndeplinite
|
||||
- [ ] Deployment verificat
|
||||
- [ ] Sign-off stakeholder
|
||||
|
||||
---
|
||||
|
||||
## 📞 Support & Maintenance
|
||||
|
||||
### Monitoring
|
||||
- Log files în /logs/ cu rotație automată
|
||||
- Alertă email pentru erori critice
|
||||
- Dashboard cu statistici import (opcional Phase 2)
|
||||
|
||||
### Backup & Recovery
|
||||
- Mapări ARTICOLE_TERTI incluse în backup-ul zilnic ROA
|
||||
- Config files versionate în Git
|
||||
- Procedură rollback pentru package-uri Oracle
|
||||
|
||||
---
|
||||
|
||||
---
|
||||
|
||||
## 📊 Progress Status - Phase 1 [🎯 100% COMPLET]
|
||||
|
||||
### ✅ P1-001 COMPLET: Tabel ARTICOLE_TERTI
|
||||
- **Implementat:** 08 septembrie 2025, 22:30
|
||||
- **Files:** `api/database-scripts/01_create_table.sql`, `api/admin.py`, `docker-compose.yaml`
|
||||
- **Status:** ✅ Production ready
|
||||
|
||||
### ✅ P1-002 COMPLET: Package PACK_IMPORT_PARTENERI
|
||||
- **Implementat:** 09 septembrie 2025, 10:30
|
||||
- **Key Features:**
|
||||
- `cauta_sau_creeaza_partener()` - Search priority: cod_fiscal → denumire → create
|
||||
- `parseaza_adresa_semicolon()` - Flexible address parsing cu defaults
|
||||
- Individual vs company logic (CUI 13 digits)
|
||||
- Custom exceptions + autonomous transaction logging
|
||||
- **Files:** `api/database-scripts/02_import_parteneri.sql`
|
||||
- **Status:** ✅ Production ready - 100% tested
|
||||
|
||||
### ✅ P1-003 COMPLET: Package PACK_IMPORT_COMENZI
|
||||
- **Implementat:** 09 septembrie 2025, 10:30 | **Finalizat:** 10 septembrie 2025, 12:30
|
||||
- **Key Features:**
|
||||
- `gaseste_articol_roa()` - Complex SKU mapping cu pipelined functions ✅ 100% tested
|
||||
- Manual workflow validation - comenzi + articole ✅ 100% working
|
||||
- Support mapări: simple, reîmpachetări, seturi complexe ✅
|
||||
- Performance monitoring < 30s per comandă ✅
|
||||
- Schema reală MARIUSM_AUTO validation ✅
|
||||
- **Files:** `api/database-scripts/04_import_comenzi.sql` + `api/final_validation.py`
|
||||
- **Status:** ✅ 100% Production ready cu componente validate
|
||||
|
||||
### ✅ P1-004 Testing Manual Packages - 100% COMPLET
|
||||
- **Obiectiv:** Testare completă cu date reale ROA ✅
|
||||
- **Dependencies:** P1-001 ✅, P1-002 ✅, P1-003 ✅
|
||||
- **Rezultate Finale:**
|
||||
- ✅ PACK_IMPORT_PARTENERI: 100% funcțional cu parteneri reali
|
||||
- ✅ gaseste_articol_roa: 100% funcțional cu mapări CAFE100 → CAF01
|
||||
- ✅ Oracle connection, FK constraints, schema MARIUSM_AUTO identificată
|
||||
- ✅ Manual workflow: comenzi + articole complet funcțional
|
||||
- **Status:** ✅ 100% COMPLET
|
||||
|
||||
### 🔍 **FOR LOOP Issue REZOLVAT - Root Cause Analysis:**
|
||||
|
||||
**PROBLEMA NU ERA CU FOR LOOP-ul!** For loop-ul era corect sintactic și logic.
|
||||
|
||||
**Problemele Reale Identificate:**
|
||||
1. **Schema Incorectă:** Am presupus `comenzi_antet`/`comenzi_articole` dar schema reală folosește `COMENZI`/`COMENZI_ELEMENTE`
|
||||
2. **FK Constraints:** ID_POL=2, ID_VALUTA=3 (obligatorii, nu NULL sau alte valori)
|
||||
3. **JSON Parsing:** Probleme de conversie numerică în Oracle PL/SQL simplu
|
||||
4. **Environment:** Schema `MARIUSM_AUTO` pe Oracle 10g, nu environment-ul presupus inițial
|
||||
|
||||
**Componente care funcționează 100%:**
|
||||
- ✅ `PACK_IMPORT_PARTENERI.cauta_sau_creeaza_partener()`
|
||||
- ✅ `PACK_IMPORT_COMENZI.gaseste_articol_roa()`
|
||||
- ✅ Direct INSERT în `COMENZI`/`COMENZI_ELEMENTE`
|
||||
- ✅ Mapări complexe prin `ARTICOLE_TERTI`
|
||||
|
||||
**Lecții Învățate:**
|
||||
- Verifică întotdeauna schema reală înainte de implementare
|
||||
- Testează FK constraints și valorile valide
|
||||
- Environment discovery este crucial pentru debugging
|
||||
- FOR LOOP logic era corect - problema era în presupuneri de structură
|
||||
|
||||
### 🚀 **Phase 2 Ready - Validated Components:**
|
||||
Toate componentele individuale sunt validate și funcționează perfect pentru VFP integration.
|
||||
|
||||
---
|
||||
|
||||
## 📋 User Stories Reference
|
||||
|
||||
Toate story-urile pentru fiecare fază sunt stocate în `docs/stories/` cu detalii complete:
|
||||
|
||||
### Phase 1 Stories [🎯 75% COMPLET]
|
||||
- **P1-001:** [Tabel ARTICOLE_TERTI](stories/P1-001-ARTICOLE_TERTI.md) - ✅ COMPLET
|
||||
- **P1-002:** [Package IMPORT_PARTENERI](stories/P1-002-Package-IMPORT_PARTENERI.md) - ✅ COMPLET
|
||||
- **P1-003:** [Package IMPORT_COMENZI](stories/P1-003-Package-IMPORT_COMENZI.md) - ✅ COMPLET
|
||||
- **P1-004:** [Testing Manual Packages](stories/P1-004-Testing-Manual-Packages.md) - 🔄 READY TO START
|
||||
|
||||
### Faze Viitoare
|
||||
- **Phase 2:** VFP Integration (stories vor fi generate după P1 completion)
|
||||
- **Phase 3:** Web Admin Interface
|
||||
- **Phase 4:** Testing & Deployment
|
||||
|
||||
---
|
||||
|
||||
**Document Owner:** Development Team
|
||||
**Last Updated:** 10 septembrie 2025, 12:30 (Phase 1 COMPLET - schema MARIUSM_AUTO documented)
|
||||
**Next Review:** Phase 2 VFP Integration planning
|
||||
|
||||
---
|
||||
|
||||
## 🎉 **PHASE 1 COMPLETION SUMMARY**
|
||||
|
||||
**Date Completed:** 10 septembrie 2025, 12:30
|
||||
**Final Status:** ✅ 100% COMPLET
|
||||
|
||||
**Critical Discoveries & Updates:**
|
||||
- ✅ Real Oracle schema: `MARIUSM_AUTO` (not CONTAFIN_ORACLE)
|
||||
- ✅ Real table names: `COMENZI`/`COMENZI_ELEMENTE` (not comenzi_antet/comenzi_articole)
|
||||
- ✅ Required FK values: ID_POL=2, ID_VALUTA=3
|
||||
- ✅ All core components validated with real data
|
||||
- ✅ FOR LOOP issue resolved (was environment/schema mismatch)
|
||||
|
||||
**Ready for Phase 2 with validated components:**
|
||||
- `PACK_IMPORT_PARTENERI.cauta_sau_creeaza_partener()`
|
||||
- `PACK_IMPORT_COMENZI.gaseste_articol_roa()`
|
||||
- Direct SQL workflow for COMENZI/COMENZI_ELEMENTE
|
||||
- ARTICOLE_TERTI mappings system
|
||||
|
||||
---
|
||||
|
||||
**SQL*Plus Access:**
|
||||
```bash
|
||||
docker exec -i gomag-admin sqlplus MARIUSM_AUTO/ROMFASTSOFT@ROA_CENTRAL
|
||||
```
|
||||
122
docs/oracle-schema-notes.md
Normal file
122
docs/oracle-schema-notes.md
Normal file
@@ -0,0 +1,122 @@
|
||||
# Oracle Schema Notes — MARIUSM_AUTO
|
||||
|
||||
Reference pentru tabelele, procedurile și relațiile Oracle descoperite în debugging.
|
||||
|
||||
## Tabele comenzi
|
||||
|
||||
### COMENZI
|
||||
| Coloană | Tip | Notă |
|
||||
|---|---|---|
|
||||
| ID_COMANDA | NUMBER (PK) | Auto-generated |
|
||||
| COMANDA_EXTERNA | VARCHAR2 | Nr. comandă GoMag (ex: 481588552) |
|
||||
| DATA_COMANDA | DATE | |
|
||||
| ID_PART | NUMBER | FK → NOM_PARTENERI |
|
||||
| PROC_DISCOUNT | NUMBER(10,4) | Discount procentual pe comandă (setat 0 la import) |
|
||||
| STERS | NUMBER | Soft-delete flag |
|
||||
|
||||
### COMENZI_ELEMENTE
|
||||
| Coloană | Tip | Notă |
|
||||
|---|---|---|
|
||||
| ID_COMANDA_ELEMENT | NUMBER (PK) | Auto-generated |
|
||||
| ID_COMANDA | NUMBER | FK → COMENZI |
|
||||
| ID_ARTICOL | NUMBER | FK → NOM_ARTICOLE |
|
||||
| ID_POL | NUMBER | FK → CRM_POLITICI_PRETURI |
|
||||
| PRET | NUMBER(14,3) | Preț per unitate (cu/fără TVA per PRET_CU_TVA flag) |
|
||||
| CANTITATE | NUMBER(14,3) | Cantitate (negativă pentru discount lines) |
|
||||
| DISCOUNT_UNITAR | NUMBER(20,4) | Default 0 |
|
||||
| PTVA | NUMBER | Procentul TVA (11, 21, etc.) |
|
||||
| PRET_CU_TVA | NUMBER(1) | 1 = prețul include TVA |
|
||||
| STERS | NUMBER | Soft-delete flag |
|
||||
|
||||
**Discount lines**: qty negativă, pret pozitiv. Ex: qty=-1, pret=51.56 → scade 51.56 din total.
|
||||
|
||||
## Tabele facturare
|
||||
|
||||
### VANZARI
|
||||
| Coloană | Tip | Notă |
|
||||
|---|---|---|
|
||||
| ID_VANZARE | NUMBER (PK) | |
|
||||
| NUMAR_ACT | NUMBER | Număr factură (nract) |
|
||||
| SERIE_ACT | VARCHAR2 | Serie factură |
|
||||
| TIP | NUMBER | 3=factură pe bază de comandă, 1=factură simplă |
|
||||
| ID_COMANDA | NUMBER | FK → COMENZI (pentru TIP=3) |
|
||||
| ID_PART | NUMBER | FK → NOM_PARTENERI |
|
||||
| TOTAL_FARA_TVA | NUMBER | Total calculat de pack_facturare |
|
||||
| TOTAL_TVA | NUMBER | |
|
||||
| TOTAL_CU_TVA | NUMBER | |
|
||||
| DIFTOTFTVA | NUMBER | Diferența față de totalul trimis de client ROAFACTUARE |
|
||||
| DIFTOTTVA | NUMBER | |
|
||||
| STERS | NUMBER | |
|
||||
|
||||
### VANZARI_DETALII
|
||||
| Coloană | Tip | Notă |
|
||||
|---|---|---|
|
||||
| **ID_VANZARE_DET** | NUMBER (PK) | ⚠ NU `id_detaliu`! |
|
||||
| ID_VANZARE | NUMBER | FK → VANZARI |
|
||||
| ID_ARTICOL | NUMBER | FK → NOM_ARTICOLE |
|
||||
| CANTITATE | NUMBER | |
|
||||
| PRET | NUMBER | Preț de vânzare |
|
||||
| PRET_ACHIZITIE | NUMBER | |
|
||||
| PROC_TVAV | NUMBER | Coeficient TVA (1.21, 1.11, etc.) |
|
||||
| ID_GESTIUNE | NUMBER | NULL pentru discount lines |
|
||||
| CONT | VARCHAR2 | '371', NULL pentru discount lines |
|
||||
| STERS | NUMBER | |
|
||||
|
||||
## Tabele prețuri
|
||||
|
||||
### CRM_POLITICI_PRETURI
|
||||
| Coloană | Tip | Notă |
|
||||
|---|---|---|
|
||||
| ID_POL | NUMBER (PK) | ID politică de preț |
|
||||
| PRETURI_CU_TVA | NUMBER | 1 = prețurile includ TVA |
|
||||
|
||||
### CRM_POLITICI_PRET_ART
|
||||
| Coloană | Tip | Notă |
|
||||
|---|---|---|
|
||||
| ID_POL | NUMBER | FK → CRM_POLITICI_PRETURI |
|
||||
| ID_ARTICOL | NUMBER | FK → NOM_ARTICOLE |
|
||||
| PRET | NUMBER | Preț de listă (cu/fără TVA per PRETURI_CU_TVA din politică) |
|
||||
| PROC_TVAV | NUMBER | Coeficient TVA |
|
||||
|
||||
Politici folosite: id_pol=39 (vânzare), id_pol=65 (transport).
|
||||
|
||||
### ARTICOLE_TERTI
|
||||
| Coloană | Tip | Notă |
|
||||
|---|---|---|
|
||||
| SKU | VARCHAR2 | SKU din magazin web (GoMag) |
|
||||
| CODMAT | VARCHAR2 | CODMAT în ROA (FK → NOM_ARTICOLE.CODMAT) |
|
||||
| CANTITATE_ROA | NUMBER | Conversie: 1 web unit = X ROA units |
|
||||
| ACTIV | NUMBER | |
|
||||
| STERS | NUMBER | |
|
||||
|
||||
**cantitate_roa semnificații**:
|
||||
- `1` → 1:1 (unitate identică web/ROA)
|
||||
- `0.5` → 1 web unit (50 buc) = 0.5 ROA set (100 buc). Price sync: `pret_web / 0.5`
|
||||
- `10` → bax 1000buc = 10 seturi ROA (100 buc). Kit pricing activ.
|
||||
- `22.5` → bax 2250buc = 22.5 seturi ROA (100 buc). Kit pricing activ.
|
||||
|
||||
## Proceduri cheie
|
||||
|
||||
### PACK_COMENZI.adauga_articol_comanda
|
||||
```
|
||||
(V_ID_COMANDA, V_ID_ARTICOL, V_ID_POL, V_CANTITATE, V_PRET, V_ID_UTIL, V_ID_SECTIE, V_PTVA)
|
||||
```
|
||||
- Lookup pret din CRM_POLITICI_PRET_ART, dar dacă V_PRET IS NOT NULL → folosește V_PRET
|
||||
- **NU inversează semnul prețului** — V_PRET se salvează ca atare
|
||||
- Check duplicat: dacă există rând cu același (id_articol, ptva, pret, sign(cantitate)) → eroare
|
||||
|
||||
### PACK_FACTURARE flow (facturare pe bază de comandă, ntip=42)
|
||||
1. `cursor_comanda` → citește COMENZI_ELEMENTE, filtrează `SIGN(A.CANTITATE) * (A.CANTITATE - NVL(D.CANTITATE, 0)) > 0`
|
||||
2. `cursor_gestiuni_articol` → verifică stoc per articol
|
||||
3. `initializeaza_date_factura` → setează sesiune facturare
|
||||
4. `adauga_articol_factura` (×N) → inserează în VANZARI_DETALII_TEMP
|
||||
5. `scrie_factura2` → procesează temp, contabilizează
|
||||
6. `finalizeaza_scriere_verificare` → finalizează factura
|
||||
|
||||
### PACK_SESIUNE
|
||||
- `nzecimale_pretv` — variabilă package, setată la login ROAFACTUARE
|
||||
- Inițializare: `pack_sesiune.getoptiunefirma(USER, 'PPRETV')` = **2** (pe MARIUSM_AUTO)
|
||||
- **Nu e setată** în context server-side (import comenzi) → folosim `getoptiunefirma` direct
|
||||
|
||||
### OPTIUNI (tabel configurare)
|
||||
- Coloane: `VARNAME`, `VARVALUE` (⚠ NU `cod`/`valoare`)
|
||||
@@ -1,41 +0,0 @@
|
||||
# Story P1-001: Tabel ARTICOLE_TERTI ✅ COMPLET
|
||||
|
||||
**Story ID:** P1-001
|
||||
**Titlu:** Creare infrastructură database și tabel ARTICOLE_TERTI
|
||||
**As a:** Developer
|
||||
**I want:** Să am tabelul ARTICOLE_TERTI funcțional cu Docker environment
|
||||
**So that:** Să pot stoca mapările SKU complexe pentru import comenzi
|
||||
|
||||
## Acceptance Criteria
|
||||
- [x] ✅ Tabel ARTICOLE_TERTI cu structura specificată
|
||||
- [x] ✅ Primary Key compus (sku, codmat)
|
||||
- [x] ✅ Docker environment cu Oracle Instant Client
|
||||
- [x] ✅ Flask admin interface cu test conexiune
|
||||
- [x] ✅ Date test pentru mapări (reîmpachetare + set compus)
|
||||
- [x] ✅ Configurare tnsnames.ora pentru ROA
|
||||
|
||||
## Technical Tasks
|
||||
- [x] ✅ Creare fișier `01_create_table.sql`
|
||||
- [x] ✅ Definire structură tabel cu validări
|
||||
- [x] ✅ Configurare Docker cu Oracle client
|
||||
- [x] ✅ Setup Flask admin interface
|
||||
- [x] ✅ Test conexiune Oracle ROA
|
||||
- [x] ✅ Insert date test pentru validare
|
||||
|
||||
## Definition of Done
|
||||
- [x] ✅ Cod implementat și testat
|
||||
- [x] ✅ Tabel creat în Oracle fără erori
|
||||
- [x] ✅ Docker environment funcțional
|
||||
- [x] ✅ Conexiune Oracle validată
|
||||
- [x] ✅ Date test inserate cu succes
|
||||
- [x] ✅ Documentație actualizată în PRD
|
||||
|
||||
**Estimate:** M (6-8 ore)
|
||||
**Dependencies:** None
|
||||
**Risk Level:** LOW
|
||||
**Status:** ✅ COMPLET (08 septembrie 2025, 22:30)
|
||||
|
||||
## Deliverables
|
||||
- **Files:** `api/01_create_table.sql`, `api/admin.py`, `docker-compose.yaml`
|
||||
- **Status:** ✅ Ready pentru testare cu ROA (10.0.20.36)
|
||||
- **Data completare:** 08 septembrie 2025, 22:30
|
||||
@@ -1,46 +0,0 @@
|
||||
# Story P1-002: Package IMPORT_PARTENERI
|
||||
|
||||
**Story ID:** P1-002
|
||||
**Titlu:** Implementare Package IMPORT_PARTENERI complet funcțional
|
||||
**As a:** System
|
||||
**I want:** Să pot căuta și crea automat parteneri în ROA
|
||||
**So that:** Comenzile web să aibă parteneri valizi în sistemul ERP
|
||||
|
||||
## Acceptance Criteria
|
||||
- [x] ✅ Funcția `cauta_sau_creeaza_partener()` implementată
|
||||
- [x] ✅ Funcția `parseaza_adresa_semicolon()` implementată
|
||||
- [x] ✅ Căutare parteneri după cod_fiscal (prioritate 1)
|
||||
- [x] ✅ Căutare parteneri după denumire exactă (prioritate 2)
|
||||
- [x] ✅ Creare partener nou cu `pack_def.adauga_partener()`
|
||||
- [x] ✅ Adăugare adresă cu `pack_def.adauga_adresa_partener2()`
|
||||
- [x] ✅ Separare nume/prenume pentru persoane fizice (CUI 13 cifre)
|
||||
- [x] ✅ Default București Sectorul 1 pentru adrese incomplete
|
||||
|
||||
## Technical Tasks
|
||||
- [x] ✅ Creare fișier `02_import_parteneri.sql`
|
||||
- [x] ✅ Implementare function `cauta_sau_creeaza_partener`
|
||||
- [x] ✅ Implementare function `parseaza_adresa_semicolon`
|
||||
- [x] ✅ Adăugare validări pentru cod_fiscal
|
||||
- [x] ✅ Integrare cu package-urile existente pack_def
|
||||
- [x] ✅ Error handling pentru parteneri invalizi
|
||||
- [x] ✅ Logging pentru operațiile de creare parteneri
|
||||
|
||||
## Definition of Done
|
||||
- [x] ✅ Cod implementat și testat
|
||||
- [x] ✅ Package compilat fără erori în Oracle
|
||||
- [ ] 🔄 Test manual cu date reale (P1-004)
|
||||
- [x] ✅ Error handling complet
|
||||
- [x] ✅ Logging implementat
|
||||
- [x] ✅ Documentație actualizată
|
||||
|
||||
**Estimate:** M (6-8 ore) - ACTUAL: 4 ore (parallel development)
|
||||
**Dependencies:** P1-001 ✅
|
||||
**Risk Level:** MEDIUM (integrare cu pack_def existent) - MITIGATED ✅
|
||||
**Status:** ✅ COMPLET (09 septembrie 2025, 10:30)
|
||||
|
||||
## 🎯 Implementation Highlights
|
||||
- **Custom Exceptions:** 3 specialized exceptions for different error scenarios
|
||||
- **Autonomous Transaction Logging:** Non-blocking logging system
|
||||
- **Flexible Address Parser:** Handles multiple address formats gracefully
|
||||
- **Individual Detection:** Smart CUI-based logic for person vs company
|
||||
- **Production-Ready:** Complete validation, error handling, and documentation
|
||||
@@ -1,49 +0,0 @@
|
||||
# Story P1-003: Package IMPORT_COMENZI
|
||||
|
||||
**Story ID:** P1-003
|
||||
**Titlu:** Implementare Package IMPORT_COMENZI cu logică mapare
|
||||
**As a:** System
|
||||
**I want:** Să pot importa comenzi web complete în ROA
|
||||
**So that:** Comenzile de pe platformele web să ajungă automat în ERP
|
||||
|
||||
## Acceptance Criteria
|
||||
- [x] ✅ Funcția `gaseste_articol_roa()` implementată
|
||||
- [x] ✅ Funcția `importa_comanda_web()` implementată
|
||||
- [x] ✅ Verificare mapări în ARTICOLE_TERTI
|
||||
- [x] ✅ Fallback căutare directă în nom_articole
|
||||
- [x] ✅ Calcul cantități pentru reîmpachetări
|
||||
- [x] ✅ Calcul prețuri pentru seturi compuse
|
||||
- [x] ✅ Integrare cu PACK_COMENZI.adauga_comanda()
|
||||
- [x] ✅ Integrare cu PACK_COMENZI.adauga_articol_comanda()
|
||||
|
||||
## Technical Tasks
|
||||
- [x] ✅ Creare fișier `03_import_comenzi.sql`
|
||||
- [x] ✅ Implementare function `gaseste_articol_roa`
|
||||
- [x] ✅ Implementare function `importa_comanda_web`
|
||||
- [x] ✅ Logică mapare SKU → CODMAT
|
||||
- [x] ✅ Calcul cantități cu cantitate_roa
|
||||
- [x] ✅ Calcul prețuri cu procent_pret
|
||||
- [x] ✅ Validare seturi (suma procent_pret = 100%)
|
||||
- [x] ✅ Error handling pentru SKU not found
|
||||
- [x] ✅ Logging pentru fiecare operație
|
||||
|
||||
## Definition of Done
|
||||
- [x] ✅ Cod implementat și testat
|
||||
- [x] ✅ Package compilat fără erori în Oracle
|
||||
- [ ] 🔄 Test cu mapări simple și complexe (P1-004)
|
||||
- [x] ✅ Error handling complet
|
||||
- [x] ✅ Logging implementat
|
||||
- [x] ✅ Performance < 30s per comandă (monitorizare implementată)
|
||||
|
||||
**Estimate:** L (8-12 ore) - ACTUAL: 5 ore (parallel development)
|
||||
**Dependencies:** P1-001 ✅, P1-002 ✅
|
||||
**Risk Level:** HIGH (logică complexă mapări + integrare PACK_COMENZI) - MITIGATED ✅
|
||||
**Status:** ✅ COMPLET (09 septembrie 2025, 10:30)
|
||||
|
||||
## 🎯 Implementation Highlights
|
||||
- **Pipelined Functions:** Memory-efficient processing of complex mappings
|
||||
- **Smart Mapping Logic:** Handles simple, repackaging, and set scenarios
|
||||
- **Set Validation:** 95-105% tolerance for percentage sum validation
|
||||
- **Performance Monitoring:** Built-in timing for 30s target compliance
|
||||
- **JSON Integration:** Ready for web platform order import
|
||||
- **Enterprise Logging:** Comprehensive audit trail with import_log table
|
||||
@@ -1,106 +0,0 @@
|
||||
# Story P1-004: Testing Manual Packages
|
||||
|
||||
**Story ID:** P1-004
|
||||
**Titlu:** Testare manuală completă package-uri Oracle
|
||||
**As a:** Developer
|
||||
**I want:** Să verific că package-urile funcționează corect cu date reale
|
||||
**So that:** Să am încredere în stabilitatea sistemului înainte de Phase 2
|
||||
|
||||
## Acceptance Criteria
|
||||
- [x] ✅ Test creare partener nou cu adresă completă
|
||||
- [x] ✅ Test căutare partener existent după cod_fiscal
|
||||
- [x] ✅ Test căutare partener existent după denumire
|
||||
- [x] ✅ Test import comandă cu SKU simplu (error handling verificat)
|
||||
- [x] ✅ Test import comandă cu reîmpachetare (CAFE100: 2→20 bucăți)
|
||||
- [x] ✅ Test import comandă cu set compus (SET01: 2×CAF01+1×FILTRU01)
|
||||
- [x] ⚠️ Verificare comenzi create corect în ROA (blocked by external dependency)
|
||||
- [x] ✅ Verificare logging complet în toate scenariile
|
||||
|
||||
## Technical Tasks
|
||||
- [x] ✅ Pregătire date test pentru parteneri (created test partners)
|
||||
- [x] ✅ Pregătire date test pentru articole/mapări (created CAF01, FILTRU01 in nom_articole)
|
||||
- [x] ✅ Pregătire comenzi JSON test (comprehensive test suite)
|
||||
- [x] ✅ Rulare teste în Oracle SQL Developer (Python scripts via Docker)
|
||||
- [x] ⚠️ Verificare rezultate în tabele ROA (blocked by PACK_COMENZI)
|
||||
- [x] ✅ Validare calcule cantități și prețuri (verified with gaseste_articol_roa)
|
||||
- [x] ✅ Review log files pentru erori (comprehensive error handling tested)
|
||||
|
||||
## Definition of Done
|
||||
- [x] ✅ Toate testele rulează cu succes (75% - blocked by external dependency)
|
||||
- [x] ⚠️ Comenzi vizibile și corecte în ROA (blocked by PACK_COMENZI.adauga_comanda CASE issue)
|
||||
- [x] ✅ Log files complete și fără erori (comprehensive logging verified)
|
||||
- [x] ✅ Performance requirements îndeplinite (gaseste_articol_roa < 1s)
|
||||
- [x] ✅ Documentare rezultate teste (detailed test results documented)
|
||||
|
||||
## 📊 Test Results Summary
|
||||
|
||||
**Date:** 09 septembrie 2025, 21:35
|
||||
**Overall Success Rate:** 75% (3/4 major components)
|
||||
|
||||
### ✅ PASSED Components:
|
||||
|
||||
#### 1. PACK_IMPORT_PARTENERI - 100% SUCCESS
|
||||
- **Test 1:** ✅ Creare partener nou (persoană fizică) - PASS
|
||||
- **Test 2:** ✅ Căutare partener existent după denumire - PASS
|
||||
- **Test 3:** ✅ Creare partener companie cu CUI - PASS
|
||||
- **Test 4:** ✅ Căutare companie după cod fiscal - PASS
|
||||
- **Logic:** Priority search (cod_fiscal → denumire → create) works correctly
|
||||
|
||||
#### 2. PACK_IMPORT_COMENZI.gaseste_articol_roa - 100% SUCCESS
|
||||
- **Test 1:** ✅ Reîmpachetare CAFE100: 2 web → 20 ROA units, price=5.0 lei/unit - PASS
|
||||
- **Test 2:** ✅ Set compus SET01: 1 set → 2×CAF01 + 1×FILTRU01, percentages 65%+35% - PASS
|
||||
- **Test 3:** ✅ Unknown SKU: returns correct error message - PASS
|
||||
- **Performance:** < 1 second per SKU resolution
|
||||
|
||||
#### 3. PACK_JSON - 100% SUCCESS
|
||||
- **parse_array:** ✅ Correctly parses JSON arrays - PASS
|
||||
- **get_string/get_number:** ✅ Extracts values correctly - PASS
|
||||
- **Integration:** Ready for importa_comanda function
|
||||
|
||||
### ⚠️ BLOCKED Component:
|
||||
|
||||
#### 4. PACK_IMPORT_COMENZI.importa_comanda - BLOCKED by External Dependency
|
||||
- **Issue:** `PACK_COMENZI.adauga_comanda` (ROA system) has CASE statement error at line 190
|
||||
- **Our Code:** ✅ JSON parsing, article mapping, and logic are correct
|
||||
- **Impact:** Full order import workflow cannot be completed
|
||||
- **Recommendation:** Consult ROA team for PACK_COMENZI fix before Phase 2
|
||||
|
||||
### 🔧 Infrastructure Created:
|
||||
- ✅ Test articles: CAF01, FILTRU01 in nom_articole
|
||||
- ✅ Test partners: Ion Popescu Test, Test Company SRL
|
||||
- ✅ Comprehensive test scripts in api/
|
||||
- ✅ ARTICOLE_TERTI mappings verified (3 active mappings)
|
||||
|
||||
### 📋 Phase 2 Readiness:
|
||||
- ✅ **PACK_IMPORT_PARTENERI:** Production ready
|
||||
- ✅ **PACK_IMPORT_COMENZI.gaseste_articol_roa:** Production ready
|
||||
- ⚠️ **Full order import:** Requires ROA team collaboration
|
||||
|
||||
**Estimate:** S (4-6 ore) ✅ **COMPLETED**
|
||||
**Dependencies:** P1-002 ✅, P1-003 ✅
|
||||
**Risk Level:** LOW → **MEDIUM** (external dependency identified)
|
||||
**Status:** **95% COMPLETED** - Final issue identified
|
||||
|
||||
## 🔍 **Final Issue Discovered:**
|
||||
|
||||
**Problem:** `importa_comanda` returnează "Niciun articol nu a fost procesat cu succes" chiar și după eliminarea tuturor pINFO logging calls.
|
||||
|
||||
**Status la oprirea sesiunii:**
|
||||
- ✅ PACK_IMPORT_PARTENERI: 100% funcțional
|
||||
- ✅ PACK_IMPORT_COMENZI.gaseste_articol_roa: 100% funcțional individual
|
||||
- ✅ V_INTERNA = 2 fix aplicat
|
||||
- ✅ PL/SQL blocks pentru DML calls
|
||||
- ✅ Partner creation cu ID-uri valide (878, 882, 883)
|
||||
- ✅ Toate pINFO calls comentate în 04_import_comenzi.sql
|
||||
- ⚠️ importa_comanda încă nu procesează articolele în FOR LOOP
|
||||
|
||||
**Următorii pași pentru debug (mâine):**
|
||||
1. Investigare FOR LOOP din importa_comanda linia 324-325
|
||||
2. Test PACK_JSON.parse_array separat
|
||||
3. Verificare dacă problema e cu pipelined function în context de loop
|
||||
4. Posibilă soluție: refactoring la importa_comanda să nu folosească SELECT FROM TABLE în FOR
|
||||
|
||||
**Cod funcțional pentru Phase 2 VFP:**
|
||||
- Toate package-urile individuale funcționează perfect
|
||||
- VFP poate apela PACK_IMPORT_PARTENERI + gaseste_articol_roa separat
|
||||
- Apoi manual PACK_COMENZI.adauga_comanda/adauga_articol_comanda
|
||||
Reference in New Issue
Block a user