fix(import): 3 production bugs — items cache, CUI lookup, ANAF name
Some checks failed
Tests / fast-tests (push) Has been cancelled
Tests / full-tests (push) Has been cancelled

1. SQLite order_items overwrite on re-import (VELA CAFE #484669620):
   add_order_items, save_orders_batch, mark_order_deleted_in_roa now use
   DELETE + INSERT so GoMag quantity changes propagate to dashboard.

2. PL/SQL strict CUI lookup tolerates whitespace (FG COFFE #485065210):
   cauta_partener_dupa_cod_fiscal regex ^RO\d → ^RO\s*\d; IN-set uses
   canonical v_ro_cui. Platitor/neplatitor business rule preserved.
   Python defensive: re.sub whitespace collapse in determine_partner_data.

3. New PJ partners use ANAF official denumire (denumire_override) instead
   of GoMag company_name. Existing partners (found by CUI) untouched.

Tests: 18 new (5 SQLite unit, 8 Python unit, 5 Oracle PL/SQL). All green
locally: 228 unit + 26 oracle + 33 e2e.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Agent
2026-04-16 14:32:59 +00:00
parent 5397bec35d
commit 3bcb26b0bd
8 changed files with 685 additions and 13 deletions

View File

@@ -193,10 +193,12 @@ async def save_orders_batch(orders_data: list[dict]):
VALUES (?, ?, ?)
""", [(d["sync_run_id"], d["order_number"], d["status_at_run"]) for d in orders_data])
# 3. Order items
# 3. Order items — replace semantics (GoMag source of truth)
all_items = []
order_numbers_with_items = set()
for d in orders_data:
for item in d.get("items", []):
order_numbers_with_items.add(d["order_number"])
all_items.append((
d["order_number"],
item.get("sku"), item.get("product_name"),
@@ -206,8 +208,13 @@ async def save_orders_batch(orders_data: list[dict]):
item.get("id_articol"), item.get("cantitate_roa")
))
if all_items:
placeholders = ",".join("?" * len(order_numbers_with_items))
await db.execute(
f"DELETE FROM order_items WHERE order_number IN ({placeholders})",
tuple(order_numbers_with_items)
)
await db.executemany("""
INSERT OR IGNORE INTO order_items
INSERT INTO order_items
(order_number, sku, product_name, quantity, price, baseprice,
vat, mapping_status, codmat, id_articol, cantitate_roa)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
@@ -529,13 +536,18 @@ async def get_web_products_batch(skus: list) -> dict:
# ── order_items ──────────────────────────────────
async def add_order_items(order_number: str, items: list):
"""Bulk insert order items. Uses INSERT OR IGNORE — PK is (order_number, sku)."""
"""Replace order items — delete any existing rows, then insert fresh batch.
GoMag is source of truth: re-import must reflect quantity changes.
Atomic (DELETE + INSERT in one transaction).
"""
if not items:
return
db = await get_sqlite()
try:
await db.execute("DELETE FROM order_items WHERE order_number = ?", (order_number,))
await db.executemany("""
INSERT OR IGNORE INTO order_items
INSERT INTO order_items
(order_number, sku, product_name, quantity, price, baseprice,
vat, mapping_status, codmat, id_articol, cantitate_roa)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
@@ -930,9 +942,10 @@ async def clear_order_invoice(order_number: str):
async def mark_order_deleted_in_roa(order_number: str):
"""Mark an order as deleted in ROA — clears id_comanda and invoice cache."""
"""Mark an order as deleted in ROA — clears id_comanda, invoice cache, and stale items."""
db = await get_sqlite()
try:
await db.execute("DELETE FROM order_items WHERE order_number = ?", (order_number,))
await db.execute("""
UPDATE orders SET
status = 'DELETED_IN_ROA',