- InlineField component + useInlineEdit composable for Odoo-style dblclick editing - Client search by name, account ID, and legacy_customer_id (or_filters) - SMS/Email notification panel on ContactCard via n8n webhooks - Ticket reply thread via Communication docs - All migration scripts (51 files) now tracked - Client portal and field tech app added to monorepo - README rewritten with full feature list, migration summary, architecture - CHANGELOG updated with all recent work - ROADMAP updated with current completion status - Removed hardcoded tokens from docs (use $ERP_SERVICE_TOKEN) - .gitignore updated (docker/, .claude/, exports/, .quasar/) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
94 lines
3.7 KiB
Python
94 lines
3.7 KiB
Python
"""Explore legacy services + product descriptions for Expro Transit."""
|
|
import pymysql
|
|
conn = pymysql.connect(
|
|
host="10.100.80.100", user="facturation",
|
|
password="*******", database="gestionclient",
|
|
cursorclass=pymysql.cursors.DictCursor
|
|
)
|
|
|
|
ACCOUNT_ID = 3673
|
|
|
|
with conn.cursor() as cur:
|
|
# Get delivery IDs for this account
|
|
cur.execute("SELECT id FROM delivery WHERE account_id = %s", (ACCOUNT_ID,))
|
|
delivery_ids = [r["id"] for r in cur.fetchall()]
|
|
print("Delivery IDs for account {}: {}".format(ACCOUNT_ID, delivery_ids))
|
|
|
|
if not delivery_ids:
|
|
print("No deliveries found!")
|
|
exit()
|
|
|
|
placeholders = ",".join(["%s"] * len(delivery_ids))
|
|
|
|
# French product translations
|
|
cur.execute("""
|
|
SELECT pt.product_id, pt.name as pname, pt.description_short, p.sku, p.price
|
|
FROM product_translate pt
|
|
JOIN product p ON p.id = pt.product_id
|
|
WHERE pt.language_id = 'fr'
|
|
AND p.sku IN ('FTTB1000I','CSERV','FTTH_LOCMOD','FTT_HFAR','HVIPFIXE','RAB24M','TELEPMENS','RAB2X')
|
|
""")
|
|
print("\n=== French product names ===")
|
|
for r in cur.fetchall():
|
|
print(" sku={:<14} price={:>8} name={}".format(r["sku"], r["price"], r["pname"]))
|
|
|
|
# All active services at these delivery addresses
|
|
cur.execute("""
|
|
SELECT s.id, s.delivery_id, s.product_id, s.hijack, s.hijack_price, s.hijack_desc,
|
|
s.comment, s.radius_user, s.radius_pwd,
|
|
p.sku, p.price as base_price, p.category, p.type,
|
|
pt.name as prod_name, pt.description_short
|
|
FROM service s
|
|
JOIN product p ON p.id = s.product_id
|
|
LEFT JOIN product_translate pt ON pt.product_id = p.id AND pt.language_id = 'fr'
|
|
WHERE s.delivery_id IN ({}) AND s.status = 1
|
|
ORDER BY s.delivery_id, p.category, p.sku
|
|
""".format(placeholders), delivery_ids)
|
|
services = cur.fetchall()
|
|
|
|
print("\n=== Active services for Expro ({} total) ===".format(len(services)))
|
|
current_delivery = None
|
|
subtotal = 0
|
|
grand_total = 0
|
|
for s in services:
|
|
if s["delivery_id"] != current_delivery:
|
|
if current_delivery is not None:
|
|
print(" {:>58} ──────".format(""))
|
|
print(" {:>58} {:>8.2f}$".format("Sous-total:", subtotal))
|
|
grand_total += subtotal
|
|
subtotal = 0
|
|
current_delivery = s["delivery_id"]
|
|
print("\n ── Delivery {} ──".format(s["delivery_id"]))
|
|
|
|
price = s["hijack_price"] if s["hijack"] else s["base_price"]
|
|
desc = s["hijack_desc"] if s["hijack"] and s["hijack_desc"] else s["prod_name"]
|
|
subtotal += float(price or 0)
|
|
|
|
is_rebate = float(price or 0) < 0
|
|
indent = " " if is_rebate else " "
|
|
print(" {}svc={:<6} sku={:<14} {:>8.2f}$ {} {}".format(
|
|
indent, s["id"], s["sku"], float(price or 0),
|
|
desc or "", "({})".format(s["comment"]) if s["comment"] else ""))
|
|
if s["radius_user"]:
|
|
print(" {} PPPoE: {}".format(indent, s["radius_user"]))
|
|
|
|
if current_delivery is not None:
|
|
print(" {:>58} ──────".format(""))
|
|
print(" {:>58} {:>8.2f}$".format("Sous-total:", subtotal))
|
|
grand_total += subtotal
|
|
|
|
print("\n GRAND TOTAL: {:,.2f}$".format(grand_total))
|
|
|
|
# Also get all product categories
|
|
cur.execute("DESCRIBE product_cat")
|
|
print("\n=== product_cat table ===")
|
|
for r in cur.fetchall():
|
|
print(" {} {}".format(r["Field"], r["Type"]))
|
|
|
|
cur.execute("SELECT * FROM product_cat ORDER BY id")
|
|
print("\n=== Product categories ===")
|
|
for r in cur.fetchall():
|
|
print(" id={} {}".format(r["id"], r))
|
|
|
|
conn.close()
|