feat(sync): add order_total field to SQLite tracking
Parse order total from GoMag JSON, store in SQLite orders table, and expose via sync run API. Enables total display in mobile flat rows. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -8,6 +8,7 @@
|
|||||||
*.err
|
*.err
|
||||||
*.ERR
|
*.ERR
|
||||||
*.log
|
*.log
|
||||||
|
/screenshots
|
||||||
|
|
||||||
# Python
|
# Python
|
||||||
__pycache__/
|
__pycache__/
|
||||||
|
|||||||
@@ -103,7 +103,8 @@ CREATE TABLE IF NOT EXISTS orders (
|
|||||||
factura_total_fara_tva REAL,
|
factura_total_fara_tva REAL,
|
||||||
factura_total_tva REAL,
|
factura_total_tva REAL,
|
||||||
factura_total_cu_tva REAL,
|
factura_total_cu_tva REAL,
|
||||||
invoice_checked_at TEXT
|
invoice_checked_at TEXT,
|
||||||
|
order_total REAL
|
||||||
);
|
);
|
||||||
CREATE INDEX IF NOT EXISTS idx_orders_status ON orders(status);
|
CREATE INDEX IF NOT EXISTS idx_orders_status ON orders(status);
|
||||||
CREATE INDEX IF NOT EXISTS idx_orders_date ON orders(order_date);
|
CREATE INDEX IF NOT EXISTS idx_orders_date ON orders(order_date);
|
||||||
@@ -301,6 +302,7 @@ def init_sqlite():
|
|||||||
("factura_total_tva", "REAL"),
|
("factura_total_tva", "REAL"),
|
||||||
("factura_total_cu_tva", "REAL"),
|
("factura_total_cu_tva", "REAL"),
|
||||||
("invoice_checked_at", "TEXT"),
|
("invoice_checked_at", "TEXT"),
|
||||||
|
("order_total", "REAL"),
|
||||||
]:
|
]:
|
||||||
if col not in order_cols:
|
if col not in order_cols:
|
||||||
conn.execute(f"ALTER TABLE orders ADD COLUMN {col} {typedef}")
|
conn.execute(f"ALTER TABLE orders ADD COLUMN {col} {typedef}")
|
||||||
|
|||||||
@@ -149,6 +149,7 @@ async def sync_run_log(run_id: str):
|
|||||||
"id_partener": o.get("id_partener"),
|
"id_partener": o.get("id_partener"),
|
||||||
"error_message": o.get("error_message"),
|
"error_message": o.get("error_message"),
|
||||||
"missing_skus": o.get("missing_skus"),
|
"missing_skus": o.get("missing_skus"),
|
||||||
|
"order_total": o.get("order_total"),
|
||||||
"factura_numar": o.get("factura_numar"),
|
"factura_numar": o.get("factura_numar"),
|
||||||
"factura_serie": o.get("factura_serie"),
|
"factura_serie": o.get("factura_serie"),
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ class OrderData:
|
|||||||
items: list = field(default_factory=list) # list of OrderItem
|
items: list = field(default_factory=list) # list of OrderItem
|
||||||
billing: OrderBilling = field(default_factory=OrderBilling)
|
billing: OrderBilling = field(default_factory=OrderBilling)
|
||||||
shipping: Optional[OrderShipping] = None
|
shipping: Optional[OrderShipping] = None
|
||||||
|
total: float = 0.0
|
||||||
payment_name: str = ""
|
payment_name: str = ""
|
||||||
delivery_name: str = ""
|
delivery_name: str = ""
|
||||||
source_file: str = ""
|
source_file: str = ""
|
||||||
@@ -163,6 +164,7 @@ def _parse_order(order_id: str, data: dict, source_file: str) -> OrderData:
|
|||||||
items=items,
|
items=items,
|
||||||
billing=billing,
|
billing=billing,
|
||||||
shipping=shipping,
|
shipping=shipping,
|
||||||
|
total=float(data.get("total", 0) or 0),
|
||||||
payment_name=str(payment.get("name", "")) if isinstance(payment, dict) else "",
|
payment_name=str(payment.get("name", "")) if isinstance(payment, dict) else "",
|
||||||
delivery_name=str(delivery.get("name", "")) if isinstance(delivery, dict) else "",
|
delivery_name=str(delivery.get("name", "")) if isinstance(delivery, dict) else "",
|
||||||
source_file=source_file
|
source_file=source_file
|
||||||
|
|||||||
@@ -50,7 +50,8 @@ async def upsert_order(sync_run_id: str, order_number: str, order_date: str,
|
|||||||
id_partener: int = None, error_message: str = None,
|
id_partener: int = None, error_message: str = None,
|
||||||
missing_skus: list = None, items_count: int = 0,
|
missing_skus: list = None, items_count: int = 0,
|
||||||
shipping_name: str = None, billing_name: str = None,
|
shipping_name: str = None, billing_name: str = None,
|
||||||
payment_method: str = None, delivery_method: str = None):
|
payment_method: str = None, delivery_method: str = None,
|
||||||
|
order_total: float = None):
|
||||||
"""Upsert a single order — one row per order_number, status updated in place."""
|
"""Upsert a single order — one row per order_number, status updated in place."""
|
||||||
db = await get_sqlite()
|
db = await get_sqlite()
|
||||||
try:
|
try:
|
||||||
@@ -59,8 +60,8 @@ async def upsert_order(sync_run_id: str, order_number: str, order_date: str,
|
|||||||
(order_number, order_date, customer_name, status,
|
(order_number, order_date, customer_name, status,
|
||||||
id_comanda, id_partener, error_message, missing_skus, items_count,
|
id_comanda, id_partener, error_message, missing_skus, items_count,
|
||||||
last_sync_run_id, shipping_name, billing_name,
|
last_sync_run_id, shipping_name, billing_name,
|
||||||
payment_method, delivery_method)
|
payment_method, delivery_method, order_total)
|
||||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||||
ON CONFLICT(order_number) DO UPDATE SET
|
ON CONFLICT(order_number) DO UPDATE SET
|
||||||
status = CASE
|
status = CASE
|
||||||
WHEN orders.status = 'IMPORTED' AND excluded.status = 'ALREADY_IMPORTED'
|
WHEN orders.status = 'IMPORTED' AND excluded.status = 'ALREADY_IMPORTED'
|
||||||
@@ -80,12 +81,13 @@ async def upsert_order(sync_run_id: str, order_number: str, order_date: str,
|
|||||||
billing_name = COALESCE(excluded.billing_name, orders.billing_name),
|
billing_name = COALESCE(excluded.billing_name, orders.billing_name),
|
||||||
payment_method = COALESCE(excluded.payment_method, orders.payment_method),
|
payment_method = COALESCE(excluded.payment_method, orders.payment_method),
|
||||||
delivery_method = COALESCE(excluded.delivery_method, orders.delivery_method),
|
delivery_method = COALESCE(excluded.delivery_method, orders.delivery_method),
|
||||||
|
order_total = COALESCE(excluded.order_total, orders.order_total),
|
||||||
updated_at = datetime('now')
|
updated_at = datetime('now')
|
||||||
""", (order_number, order_date, customer_name, status,
|
""", (order_number, order_date, customer_name, status,
|
||||||
id_comanda, id_partener, error_message,
|
id_comanda, id_partener, error_message,
|
||||||
json.dumps(missing_skus) if missing_skus else None,
|
json.dumps(missing_skus) if missing_skus else None,
|
||||||
items_count, sync_run_id, shipping_name, billing_name,
|
items_count, sync_run_id, shipping_name, billing_name,
|
||||||
payment_method, delivery_method))
|
payment_method, delivery_method, order_total))
|
||||||
await db.commit()
|
await db.commit()
|
||||||
finally:
|
finally:
|
||||||
await db.close()
|
await db.close()
|
||||||
@@ -122,8 +124,8 @@ async def save_orders_batch(orders_data: list[dict]):
|
|||||||
(order_number, order_date, customer_name, status,
|
(order_number, order_date, customer_name, status,
|
||||||
id_comanda, id_partener, error_message, missing_skus, items_count,
|
id_comanda, id_partener, error_message, missing_skus, items_count,
|
||||||
last_sync_run_id, shipping_name, billing_name,
|
last_sync_run_id, shipping_name, billing_name,
|
||||||
payment_method, delivery_method)
|
payment_method, delivery_method, order_total)
|
||||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||||
ON CONFLICT(order_number) DO UPDATE SET
|
ON CONFLICT(order_number) DO UPDATE SET
|
||||||
status = CASE
|
status = CASE
|
||||||
WHEN orders.status = 'IMPORTED' AND excluded.status = 'ALREADY_IMPORTED'
|
WHEN orders.status = 'IMPORTED' AND excluded.status = 'ALREADY_IMPORTED'
|
||||||
@@ -143,6 +145,7 @@ async def save_orders_batch(orders_data: list[dict]):
|
|||||||
billing_name = COALESCE(excluded.billing_name, orders.billing_name),
|
billing_name = COALESCE(excluded.billing_name, orders.billing_name),
|
||||||
payment_method = COALESCE(excluded.payment_method, orders.payment_method),
|
payment_method = COALESCE(excluded.payment_method, orders.payment_method),
|
||||||
delivery_method = COALESCE(excluded.delivery_method, orders.delivery_method),
|
delivery_method = COALESCE(excluded.delivery_method, orders.delivery_method),
|
||||||
|
order_total = COALESCE(excluded.order_total, orders.order_total),
|
||||||
updated_at = datetime('now')
|
updated_at = datetime('now')
|
||||||
""", [
|
""", [
|
||||||
(d["order_number"], d["order_date"], d["customer_name"], d["status"],
|
(d["order_number"], d["order_date"], d["customer_name"], d["status"],
|
||||||
@@ -150,7 +153,8 @@ async def save_orders_batch(orders_data: list[dict]):
|
|||||||
json.dumps(d["missing_skus"]) if d.get("missing_skus") else None,
|
json.dumps(d["missing_skus"]) if d.get("missing_skus") else None,
|
||||||
d.get("items_count", 0), d["sync_run_id"],
|
d.get("items_count", 0), d["sync_run_id"],
|
||||||
d.get("shipping_name"), d.get("billing_name"),
|
d.get("shipping_name"), d.get("billing_name"),
|
||||||
d.get("payment_method"), d.get("delivery_method"))
|
d.get("payment_method"), d.get("delivery_method"),
|
||||||
|
d.get("order_total"))
|
||||||
for d in orders_data
|
for d in orders_data
|
||||||
])
|
])
|
||||||
|
|
||||||
|
|||||||
@@ -286,6 +286,7 @@ async def run_sync(id_pol: int = None, id_sectie: int = None, run_id: str = None
|
|||||||
"items_count": len(order.items),
|
"items_count": len(order.items),
|
||||||
"shipping_name": shipping_name, "billing_name": billing_name,
|
"shipping_name": shipping_name, "billing_name": billing_name,
|
||||||
"payment_method": payment_method, "delivery_method": delivery_method,
|
"payment_method": payment_method, "delivery_method": delivery_method,
|
||||||
|
"order_total": order.total or None,
|
||||||
"items": order_items_data,
|
"items": order_items_data,
|
||||||
})
|
})
|
||||||
_log_line(run_id, f"#{order.number} [{order.date or '?'}] {customer} → DEJA IMPORTAT (ID: {id_comanda_roa})")
|
_log_line(run_id, f"#{order.number} [{order.date or '?'}] {customer} → DEJA IMPORTAT (ID: {id_comanda_roa})")
|
||||||
@@ -313,6 +314,7 @@ async def run_sync(id_pol: int = None, id_sectie: int = None, run_id: str = None
|
|||||||
"items_count": len(order.items),
|
"items_count": len(order.items),
|
||||||
"shipping_name": shipping_name, "billing_name": billing_name,
|
"shipping_name": shipping_name, "billing_name": billing_name,
|
||||||
"payment_method": payment_method, "delivery_method": delivery_method,
|
"payment_method": payment_method, "delivery_method": delivery_method,
|
||||||
|
"order_total": order.total or None,
|
||||||
"items": order_items_data,
|
"items": order_items_data,
|
||||||
})
|
})
|
||||||
_log_line(run_id, f"#{order.number} [{order.date or '?'}] {customer} → OMIS (lipsa: {', '.join(missing_skus)})")
|
_log_line(run_id, f"#{order.number} [{order.date or '?'}] {customer} → OMIS (lipsa: {', '.join(missing_skus)})")
|
||||||
@@ -365,6 +367,7 @@ async def run_sync(id_pol: int = None, id_sectie: int = None, run_id: str = None
|
|||||||
billing_name=billing_name,
|
billing_name=billing_name,
|
||||||
payment_method=payment_method,
|
payment_method=payment_method,
|
||||||
delivery_method=delivery_method,
|
delivery_method=delivery_method,
|
||||||
|
order_total=order.total or None,
|
||||||
)
|
)
|
||||||
await sqlite_service.add_sync_run_order(run_id, order.number, "IMPORTED")
|
await sqlite_service.add_sync_run_order(run_id, order.number, "IMPORTED")
|
||||||
# Store ROA address IDs (R9)
|
# Store ROA address IDs (R9)
|
||||||
@@ -390,6 +393,7 @@ async def run_sync(id_pol: int = None, id_sectie: int = None, run_id: str = None
|
|||||||
billing_name=billing_name,
|
billing_name=billing_name,
|
||||||
payment_method=payment_method,
|
payment_method=payment_method,
|
||||||
delivery_method=delivery_method,
|
delivery_method=delivery_method,
|
||||||
|
order_total=order.total or None,
|
||||||
)
|
)
|
||||||
await sqlite_service.add_sync_run_order(run_id, order.number, "ERROR")
|
await sqlite_service.add_sync_run_order(run_id, order.number, "ERROR")
|
||||||
await sqlite_service.add_order_items(order.number, order_items_data)
|
await sqlite_service.add_order_items(order.number, order_items_data)
|
||||||
|
|||||||
Reference in New Issue
Block a user