chore: sync from fn-registry agent
This commit is contained in:
@@ -0,0 +1,139 @@
|
||||
#!/usr/bin/env python3
|
||||
"""B = (A) UNION (regenerados): vuelve la union al SQL de cards B.
|
||||
|
||||
Mantiene los field-filters por NAME (multi-select dropdown) ya aplicados en rewire_filters_by_name.
|
||||
"""
|
||||
import subprocess
|
||||
import httpx
|
||||
|
||||
API_KEY = subprocess.check_output(["pass", "show", "metabase/aurgi-api-key"], text=True).strip().splitlines()[0]
|
||||
BASE = "https://reports.autingo.es"
|
||||
DB_ID = 6
|
||||
|
||||
F_QUOTE_CREATED_AT = 16588
|
||||
F_CENTER_NAME = 17330
|
||||
F_TPVUSER_NAME = 17958
|
||||
F_COMPANY_NAME = 17158
|
||||
F_PRODUCT_DESC = 16795
|
||||
|
||||
client = httpx.Client(base_url=BASE, headers={"x-api-key": API_KEY}, timeout=180)
|
||||
|
||||
|
||||
def field_filter_tag(name, field_id, widget, display_name):
|
||||
return {
|
||||
"id": name + "-tag",
|
||||
"name": name,
|
||||
"display-name": display_name,
|
||||
"type": "dimension",
|
||||
"dimension": ["field", field_id, None],
|
||||
"widget-type": widget,
|
||||
"default": None,
|
||||
}
|
||||
|
||||
|
||||
TAGS_AB = {
|
||||
"date": field_filter_tag("date", F_QUOTE_CREATED_AT, "date/range", "Fecha presupuesto"),
|
||||
"centro": field_filter_tag("centro", F_CENTER_NAME, "string/=", "Centro"),
|
||||
"agente": field_filter_tag("agente", F_TPVUSER_NAME, "string/=", "Agente CC"),
|
||||
"compania": field_filter_tag("compania", F_COMPANY_NAME, "string/=", "Compañía"),
|
||||
"producto": field_filter_tag("producto", F_PRODUCT_DESC, "string/contains", "Producto"),
|
||||
}
|
||||
|
||||
|
||||
SQL_B = """
|
||||
WITH cc_users AS (
|
||||
SELECT DISTINCT tpvuser_id AS user_id
|
||||
FROM `psql_dcpublic.tpv_authorization_tpvuser_centers`
|
||||
WHERE dccenter_id IN (159, 162)
|
||||
),
|
||||
quotes_q1 AS (SELECT id, order_id, created_at, deleted_at FROM `psql_dcpublic.tpv_orders_quote`),
|
||||
orders_q1 AS (SELECT id, customer_id, vehicle_id, terminal_id FROM `psql_dcpublic.tpv_orders_order`),
|
||||
terminals_q1 AS (SELECT id, center_id FROM `psql_dcpublic.tpv_terminals`),
|
||||
cc_anchored AS (
|
||||
SELECT
|
||||
`psql_dcpublic.tpv_orders_quote`.id AS q0_id,
|
||||
`psql_dcpublic.tpv_orders_quote`.order_id AS q0_order,
|
||||
`psql_dcpublic.tpv_orders_quote`.created_at AS q0_ts,
|
||||
`psql_dcpublic.tpv_orders_quote`.created_by_id AS cc_agent_id,
|
||||
`psql_dcpublic.tpv_orders_order`.customer_id AS cust_id,
|
||||
`psql_dcpublic.tpv_orders_order`.vehicle_id AS veh_id
|
||||
FROM `psql_dcpublic.tpv_orders_quote`
|
||||
JOIN cc_users ON `psql_dcpublic.tpv_orders_quote`.created_by_id = cc_users.user_id
|
||||
JOIN `psql_dcpublic.tpv_orders_order` ON `psql_dcpublic.tpv_orders_quote`.order_id = `psql_dcpublic.tpv_orders_order`.id
|
||||
LEFT JOIN `psql_dcpublic.tpv_authorization_tpvuser` ON `psql_dcpublic.tpv_orders_quote`.created_by_id = `psql_dcpublic.tpv_authorization_tpvuser`.id
|
||||
WHERE `psql_dcpublic.tpv_orders_quote`.deleted_at IS NULL
|
||||
[[AND {{date}}]]
|
||||
[[AND {{agente}}]]
|
||||
),
|
||||
b_orders AS (
|
||||
-- A: orders directos del Q-CC
|
||||
SELECT q0_order AS order_id FROM cc_anchored
|
||||
UNION DISTINCT
|
||||
-- Regenerados: Q1 dentro 60d desde Q0-CC, distinto order, centro NO-CC, mismo cliente+vehiculo
|
||||
SELECT q1.order_id AS order_id
|
||||
FROM cc_anchored a
|
||||
JOIN quotes_q1 q1
|
||||
ON q1.deleted_at IS NULL
|
||||
AND q1.created_at > a.q0_ts
|
||||
AND q1.created_at <= TIMESTAMP_ADD(a.q0_ts, INTERVAL 60 DAY)
|
||||
AND q1.order_id != a.q0_order
|
||||
JOIN orders_q1 o1 ON q1.order_id = o1.id
|
||||
LEFT JOIN terminals_q1 t1 ON o1.terminal_id = t1.id
|
||||
WHERE o1.customer_id = a.cust_id
|
||||
AND o1.vehicle_id = a.veh_id
|
||||
AND t1.center_id IS NOT NULL
|
||||
AND t1.center_id NOT IN (159, 162)
|
||||
),
|
||||
filtered AS (
|
||||
SELECT DISTINCT
|
||||
`psql_dcpublic.tpv_orders_invoice`.id AS invoice_id,
|
||||
`psql_dcpublic.tpv_orders_order`.total_cost AS total_cost
|
||||
FROM b_orders
|
||||
JOIN `psql_dcpublic.tpv_orders_order` ON b_orders.order_id = `psql_dcpublic.tpv_orders_order`.id
|
||||
JOIN `psql_dcpublic.tpv_orders_invoice` ON `psql_dcpublic.tpv_orders_invoice`.order_id = `psql_dcpublic.tpv_orders_order`.id
|
||||
LEFT JOIN `psql_dcpublic.tpv_terminals` ON `psql_dcpublic.tpv_orders_order`.terminal_id = `psql_dcpublic.tpv_terminals`.id
|
||||
LEFT JOIN `psql_dcpublic.centers` ON `psql_dcpublic.tpv_terminals`.center_id = `psql_dcpublic.centers`.id
|
||||
LEFT JOIN `psql_dcpublic.tpv_customers` ON `psql_dcpublic.tpv_orders_order`.customer_id = `psql_dcpublic.tpv_customers`.id
|
||||
LEFT JOIN `psql_dcpublic.companies` ON `psql_dcpublic.tpv_customers`.company_id = `psql_dcpublic.companies`.id
|
||||
LEFT JOIN `psql_dcpublic.tpv_orders_orderitem` ON `psql_dcpublic.tpv_orders_orderitem`.order_id = `psql_dcpublic.tpv_orders_order`.id
|
||||
LEFT JOIN `psql_dcpublic.products` ON `psql_dcpublic.tpv_orders_orderitem`.product_id = `psql_dcpublic.products`.id
|
||||
WHERE COALESCE(`psql_dcpublic.centers`.id, 0) NOT IN (159, 162)
|
||||
[[AND {{centro}}]]
|
||||
[[AND {{compania}}]]
|
||||
[[AND {{producto}}]]
|
||||
)
|
||||
SELECT __AGG__ AS valor FROM filtered
|
||||
"""
|
||||
|
||||
AGG = {
|
||||
"total": "ROUND(SUM(total_cost), 2)",
|
||||
"count": "COUNT(*)",
|
||||
"ticket": "ROUND(SAFE_DIVIDE(SUM(total_cost), NULLIF(COUNT(*), 0)), 2)",
|
||||
}
|
||||
|
||||
CARDS = {
|
||||
10251: ("total", "B · Presupuestos CallC + Regenerados — Total facturado"),
|
||||
10252: ("count", "B · Presupuestos CallC + Regenerados — # Facturas"),
|
||||
10253: ("ticket", "B · Presupuestos CallC + Regenerados — Ticket medio"),
|
||||
}
|
||||
|
||||
|
||||
for cid, (agg, name) in CARDS.items():
|
||||
cur = client.get(f"/api/card/{cid}").json()
|
||||
viz = cur.get("visualization_settings", {})
|
||||
sql = SQL_B.replace("__AGG__", AGG[agg])
|
||||
body = {
|
||||
"name": name,
|
||||
"description": name,
|
||||
"dataset_query": {
|
||||
"type": "native", "database": DB_ID,
|
||||
"native": {"query": sql, "template-tags": TAGS_AB},
|
||||
},
|
||||
"visualization_settings": viz,
|
||||
}
|
||||
r = client.put(f"/api/card/{cid}", json=body)
|
||||
r.raise_for_status()
|
||||
print(f" card {cid} ({agg}) updated -> name='{name}'")
|
||||
|
||||
client.close()
|
||||
print("done")
|
||||
Reference in New Issue
Block a user