chore: auto-commit (10 archivos)
- scratchpad/ap.parquet - scratchpad/bq.py - scratchpad/cards.json - scratchpad/citas_recon.csv - scratchpad/dash.txt - scratchpad/diego.parquet - scratchpad/diego_literals.sql - scratchpad/exf/ - scratchpad/va.parquet - scratchpad/vm.parquet Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Binary file not shown.
@@ -0,0 +1,7 @@
|
||||
import google.auth
|
||||
from google.cloud import bigquery
|
||||
_creds, _ = google.auth.default(scopes=['https://www.googleapis.com/auth/bigquery'])
|
||||
_creds = _creds.with_quota_project(None)
|
||||
client = bigquery.Client(project='autingo-159109', location='europe-west1', credentials=_creds)
|
||||
def q(sql):
|
||||
return client.query(sql).result().to_dataframe()
|
||||
@@ -0,0 +1 @@
|
||||
{"c1": 12363, "c2": 12364, "c3": 12365}
|
||||
@@ -0,0 +1,61 @@
|
||||
ensena,year,mes,diego,bq_neto,match
|
||||
Aurgi,2023,feb,80.52,,
|
||||
Aurgi,2023,mar,89.94,,
|
||||
Aurgi,2023,abr,76.87,,
|
||||
Aurgi,2023,may,87.95,,
|
||||
Aurgi,2023,jun,97.84,,
|
||||
Aurgi,2023,jul,138.24,,
|
||||
Aurgi,2023,ago,89.7,,
|
||||
Aurgi,2023,sep,61.53,,
|
||||
Aurgi,2023,oct,56.48,,
|
||||
Aurgi,2023,nov,73.2,,
|
||||
Aurgi,2023,dic,78.81,,
|
||||
Aurgi,2024,ene,75.34,75.35,100.0
|
||||
Aurgi,2024,feb,60.21,60.21,100.0
|
||||
Aurgi,2024,mar,70.62,71.26,99.1
|
||||
Aurgi,2024,abr,70.46,70.46,100.0
|
||||
Aurgi,2024,may,84.76,84.76,100.0
|
||||
Aurgi,2024,jun,108.7,108.7,100.0
|
||||
Aurgi,2024,jul,141.2,141.2,100.0
|
||||
Aurgi,2024,ago,100.18,100.18,100.0
|
||||
Aurgi,2024,sep,67.91,67.91,100.0
|
||||
Aurgi,2024,oct,81.31,81.31,100.0
|
||||
Aurgi,2024,nov,71.57,71.57,100.0
|
||||
Aurgi,2024,dic,74.33,74.33,100.0
|
||||
Aurgi,2025,ene,86.28,86.28,100.0
|
||||
Aurgi,2025,feb,53.05,53.05,100.0
|
||||
Aurgi,2025,mar,86.75,86.75,100.0
|
||||
Aurgi,2025,abr,83.89,83.89,100.0
|
||||
Aurgi,2025,may,84.24,84.24,100.0
|
||||
Aurgi,2025,jun,134.46,134.46,100.0
|
||||
Aurgi,2025,jul,101.17,174.32,58.0
|
||||
MT,2023,feb,30.19,,
|
||||
MT,2023,mar,41.89,,
|
||||
MT,2023,abr,36.16,,
|
||||
MT,2023,may,42.01,,
|
||||
MT,2023,jun,44.24,,
|
||||
MT,2023,jul,63.61,,
|
||||
MT,2023,ago,40.7,,
|
||||
MT,2023,sep,28.6,,
|
||||
MT,2023,oct,28.79,,
|
||||
MT,2023,nov,30.3,,
|
||||
MT,2023,dic,35.21,,
|
||||
MT,2024,ene,38.13,38.13,100.0
|
||||
MT,2024,feb,32.44,32.44,100.0
|
||||
MT,2024,mar,35.17,35.18,100.0
|
||||
MT,2024,abr,35.38,35.38,100.0
|
||||
MT,2024,may,37.58,37.58,100.0
|
||||
MT,2024,jun,44.54,44.54,100.0
|
||||
MT,2024,jul,58.92,58.92,100.0
|
||||
MT,2024,ago,40.97,40.98,100.0
|
||||
MT,2024,sep,35.03,35.03,100.0
|
||||
MT,2024,oct,38.86,38.86,100.0
|
||||
MT,2024,nov,36.48,36.48,100.0
|
||||
MT,2024,dic,40.52,40.52,100.0
|
||||
MT,2025,ene,39.16,39.16,100.0
|
||||
MT,2025,feb,28.16,28.16,100.0
|
||||
MT,2025,mar,42.26,42.26,100.0
|
||||
MT,2025,abr,44.04,44.04,100.0
|
||||
MT,2025,may,52.71,52.71,100.0
|
||||
MT,2025,jun,63.54,63.54,100.0
|
||||
MT,2025,jul,49.47,84.94,58.2
|
||||
|
@@ -0,0 +1 @@
|
||||
https://reports.autingo.es/dashboard/1142
|
||||
Binary file not shown.
@@ -0,0 +1,60 @@
|
||||
STRUCT(DATE(2023,2,1) AS mes, 80.515 AS diego_neto_k, 1 AS company_id),
|
||||
STRUCT(DATE(2023,3,1) AS mes, 89.936 AS diego_neto_k, 1 AS company_id),
|
||||
STRUCT(DATE(2023,4,1) AS mes, 76.866 AS diego_neto_k, 1 AS company_id),
|
||||
STRUCT(DATE(2023,5,1) AS mes, 87.952 AS diego_neto_k, 1 AS company_id),
|
||||
STRUCT(DATE(2023,6,1) AS mes, 97.84 AS diego_neto_k, 1 AS company_id),
|
||||
STRUCT(DATE(2023,7,1) AS mes, 138.24 AS diego_neto_k, 1 AS company_id),
|
||||
STRUCT(DATE(2023,8,1) AS mes, 89.7 AS diego_neto_k, 1 AS company_id),
|
||||
STRUCT(DATE(2023,9,1) AS mes, 61.53 AS diego_neto_k, 1 AS company_id),
|
||||
STRUCT(DATE(2023,10,1) AS mes, 56.48 AS diego_neto_k, 1 AS company_id),
|
||||
STRUCT(DATE(2023,11,1) AS mes, 73.2 AS diego_neto_k, 1 AS company_id),
|
||||
STRUCT(DATE(2023,12,1) AS mes, 78.81 AS diego_neto_k, 1 AS company_id),
|
||||
STRUCT(DATE(2024,1,1) AS mes, 75.345 AS diego_neto_k, 1 AS company_id),
|
||||
STRUCT(DATE(2024,2,1) AS mes, 60.211 AS diego_neto_k, 1 AS company_id),
|
||||
STRUCT(DATE(2024,3,1) AS mes, 70.62 AS diego_neto_k, 1 AS company_id),
|
||||
STRUCT(DATE(2024,4,1) AS mes, 70.456 AS diego_neto_k, 1 AS company_id),
|
||||
STRUCT(DATE(2024,5,1) AS mes, 84.759 AS diego_neto_k, 1 AS company_id),
|
||||
STRUCT(DATE(2024,6,1) AS mes, 108.702 AS diego_neto_k, 1 AS company_id),
|
||||
STRUCT(DATE(2024,7,1) AS mes, 141.204 AS diego_neto_k, 1 AS company_id),
|
||||
STRUCT(DATE(2024,8,1) AS mes, 100.181 AS diego_neto_k, 1 AS company_id),
|
||||
STRUCT(DATE(2024,9,1) AS mes, 67.91 AS diego_neto_k, 1 AS company_id),
|
||||
STRUCT(DATE(2024,10,1) AS mes, 81.307 AS diego_neto_k, 1 AS company_id),
|
||||
STRUCT(DATE(2024,11,1) AS mes, 71.569 AS diego_neto_k, 1 AS company_id),
|
||||
STRUCT(DATE(2024,12,1) AS mes, 74.329 AS diego_neto_k, 1 AS company_id),
|
||||
STRUCT(DATE(2025,1,1) AS mes, 86.277 AS diego_neto_k, 1 AS company_id),
|
||||
STRUCT(DATE(2025,2,1) AS mes, 53.054 AS diego_neto_k, 1 AS company_id),
|
||||
STRUCT(DATE(2025,3,1) AS mes, 86.749 AS diego_neto_k, 1 AS company_id),
|
||||
STRUCT(DATE(2025,4,1) AS mes, 83.888 AS diego_neto_k, 1 AS company_id),
|
||||
STRUCT(DATE(2025,5,1) AS mes, 84.24 AS diego_neto_k, 1 AS company_id),
|
||||
STRUCT(DATE(2025,6,1) AS mes, 134.464 AS diego_neto_k, 1 AS company_id),
|
||||
STRUCT(DATE(2025,7,1) AS mes, 101.168 AS diego_neto_k, 1 AS company_id),
|
||||
STRUCT(DATE(2023,2,1) AS mes, 30.189 AS diego_neto_k, 2 AS company_id),
|
||||
STRUCT(DATE(2023,3,1) AS mes, 41.89 AS diego_neto_k, 2 AS company_id),
|
||||
STRUCT(DATE(2023,4,1) AS mes, 36.16 AS diego_neto_k, 2 AS company_id),
|
||||
STRUCT(DATE(2023,5,1) AS mes, 42.011 AS diego_neto_k, 2 AS company_id),
|
||||
STRUCT(DATE(2023,6,1) AS mes, 44.24 AS diego_neto_k, 2 AS company_id),
|
||||
STRUCT(DATE(2023,7,1) AS mes, 63.61 AS diego_neto_k, 2 AS company_id),
|
||||
STRUCT(DATE(2023,8,1) AS mes, 40.7 AS diego_neto_k, 2 AS company_id),
|
||||
STRUCT(DATE(2023,9,1) AS mes, 28.6 AS diego_neto_k, 2 AS company_id),
|
||||
STRUCT(DATE(2023,10,1) AS mes, 28.79 AS diego_neto_k, 2 AS company_id),
|
||||
STRUCT(DATE(2023,11,1) AS mes, 30.3 AS diego_neto_k, 2 AS company_id),
|
||||
STRUCT(DATE(2023,12,1) AS mes, 35.207 AS diego_neto_k, 2 AS company_id),
|
||||
STRUCT(DATE(2024,1,1) AS mes, 38.132 AS diego_neto_k, 2 AS company_id),
|
||||
STRUCT(DATE(2024,2,1) AS mes, 32.438 AS diego_neto_k, 2 AS company_id),
|
||||
STRUCT(DATE(2024,3,1) AS mes, 35.174 AS diego_neto_k, 2 AS company_id),
|
||||
STRUCT(DATE(2024,4,1) AS mes, 35.382 AS diego_neto_k, 2 AS company_id),
|
||||
STRUCT(DATE(2024,5,1) AS mes, 37.584 AS diego_neto_k, 2 AS company_id),
|
||||
STRUCT(DATE(2024,6,1) AS mes, 44.54 AS diego_neto_k, 2 AS company_id),
|
||||
STRUCT(DATE(2024,7,1) AS mes, 58.921 AS diego_neto_k, 2 AS company_id),
|
||||
STRUCT(DATE(2024,8,1) AS mes, 40.974 AS diego_neto_k, 2 AS company_id),
|
||||
STRUCT(DATE(2024,9,1) AS mes, 35.029 AS diego_neto_k, 2 AS company_id),
|
||||
STRUCT(DATE(2024,10,1) AS mes, 38.861 AS diego_neto_k, 2 AS company_id),
|
||||
STRUCT(DATE(2024,11,1) AS mes, 36.48 AS diego_neto_k, 2 AS company_id),
|
||||
STRUCT(DATE(2024,12,1) AS mes, 40.522 AS diego_neto_k, 2 AS company_id),
|
||||
STRUCT(DATE(2025,1,1) AS mes, 39.161 AS diego_neto_k, 2 AS company_id),
|
||||
STRUCT(DATE(2025,2,1) AS mes, 28.16 AS diego_neto_k, 2 AS company_id),
|
||||
STRUCT(DATE(2025,3,1) AS mes, 42.263 AS diego_neto_k, 2 AS company_id),
|
||||
STRUCT(DATE(2025,4,1) AS mes, 44.04 AS diego_neto_k, 2 AS company_id),
|
||||
STRUCT(DATE(2025,5,1) AS mes, 52.71 AS diego_neto_k, 2 AS company_id),
|
||||
STRUCT(DATE(2025,6,1) AS mes, 63.544 AS diego_neto_k, 2 AS company_id),
|
||||
STRUCT(DATE(2025,7,1) AS mes, 49.469 AS diego_neto_k, 2 AS company_id)
|
||||
@@ -0,0 +1,8 @@
|
||||
import sys, json
|
||||
from google.cloud import bigquery
|
||||
import google.auth
|
||||
creds=google.auth.default(scopes=['https://www.googleapis.com/auth/bigquery'])[0].with_quota_project(None)
|
||||
c=bigquery.Client(project='autingo-159109', location='europe-west1', credentials=creds)
|
||||
sql=sys.stdin.read()
|
||||
for r in c.query(sql).result():
|
||||
print(json.dumps(dict(r), default=str))
|
||||
@@ -0,0 +1,152 @@
|
||||
import json, os, urllib.request, sys
|
||||
|
||||
MB = os.environ["MB"]; KEY = os.environ["KEY"]
|
||||
|
||||
def api(method, path, body=None, timeout=180):
|
||||
data = json.dumps(body).encode() if body is not None else None
|
||||
req = urllib.request.Request(MB + path, data=data, method=method,
|
||||
headers={"X-API-KEY": KEY, "Content-Type": "application/json"})
|
||||
try:
|
||||
return json.load(urllib.request.urlopen(req, timeout=timeout))
|
||||
except urllib.error.HTTPError as e:
|
||||
print(f"HTTP {e.code} on {method} {path}:", e.read().decode()[:1200]); raise
|
||||
|
||||
# Bridge documento -> service_request (canal + charged), tal cual 1094 card 11751.
|
||||
BASE = r"""
|
||||
WITH vf AS (
|
||||
SELECT document_id, LOGICAL_OR(is_pw) is_pw FROM (
|
||||
SELECT CAST(document_id AS STRING) document_id, ANY_VALUE(is_precaweb) is_pw
|
||||
FROM `autingo-159109.anjana_bi_datamart.VENTAS_aurgi` GROUP BY 1
|
||||
UNION ALL
|
||||
SELECT CAST(document_id AS STRING), ANY_VALUE(is_precaweb)
|
||||
FROM `autingo-159109.anjana_bi_datamart.VENTAS_Motortown` GROUP BY 1
|
||||
) GROUP BY 1
|
||||
),
|
||||
lineas AS (
|
||||
SELECT
|
||||
CAST(s.numeroDocumento AS STRING) AS numdoc,
|
||||
CAST(s.idCentro AS STRING) AS idcentro,
|
||||
DATE(s.Fecha) AS fecha,
|
||||
s.Base_imponible_linea AS bil
|
||||
FROM {{#4494}} s
|
||||
WHERE DATE(s.Fecha) >= DATE_SUB(CURRENT_DATE(), INTERVAL 365 DAY)
|
||||
[[AND DATE(s.Fecha) >= {{fecha_desde}}]]
|
||||
[[AND DATE(s.Fecha) <= {{fecha_hasta}}]]
|
||||
),
|
||||
web AS (
|
||||
SELECT l.numdoc, l.fecha, l.bil, oc.name AS centro, oc.Companies__name AS ambito
|
||||
FROM lineas l
|
||||
LEFT JOIN vf ON l.numdoc = vf.document_id
|
||||
LEFT JOIN `autingo-159109.rag_datasets.Objeto_Centros` oc
|
||||
ON l.idcentro = CAST(oc.nav_id AS STRING)
|
||||
WHERE (COALESCE(vf.is_pw, FALSE) OR oc.name IN ('Aurgi Web','MT Web'))
|
||||
AND (oc.Companies__name IS NULL OR oc.Companies__name NOT IN ('Aurgi Glass','MotorTown Glass'))
|
||||
[[AND oc.name IN ({{centro}})]]
|
||||
[[AND oc.Companies__name IN ({{ensena}})]]
|
||||
),
|
||||
sr_link AS (
|
||||
SELECT CAST(inv.nav_id AS STRING) numdoc, CAST(j.service_request_id AS STRING) sr_id
|
||||
FROM `autingo-159109.psql_dcpublic.tpv_orders_invoice` inv
|
||||
JOIN `autingo-159109.psql_dcpublic.tpv_precawebs_servicerequestjob` j ON j.order_id = inv.order_id
|
||||
WHERE inv.nav_id IS NOT NULL
|
||||
UNION DISTINCT
|
||||
SELECT CAST(invoice_number AS STRING), CAST(service_request_id AS STRING)
|
||||
FROM `autingo-159109.psql_dcpublic.logistic_orders`
|
||||
WHERE invoice_number IS NOT NULL AND invoice_number != ''
|
||||
),
|
||||
sr_link1 AS (SELECT numdoc, MIN(sr_id) sr_id FROM sr_link GROUP BY 1),
|
||||
sr AS (
|
||||
SELECT CAST(id AS STRING) sr_id, channel_id, charged
|
||||
FROM `autingo-159109.psql_dcpublic.service_requests`
|
||||
),
|
||||
doc AS (
|
||||
SELECT
|
||||
w.numdoc,
|
||||
ANY_VALUE(w.fecha) AS fecha,
|
||||
SUM(w.bil) AS venta,
|
||||
ANY_VALUE(sl.sr_id) AS sr_id,
|
||||
ANY_VALUE(sr.channel_id) AS channel_id,
|
||||
ANY_VALUE(sr.charged) AS charged
|
||||
FROM web w
|
||||
LEFT JOIN sr_link1 sl USING (numdoc)
|
||||
LEFT JOIN sr ON sr.sr_id = sl.sr_id
|
||||
GROUP BY w.numdoc
|
||||
),
|
||||
fin AS (
|
||||
SELECT
|
||||
numdoc, fecha, venta,
|
||||
CASE WHEN sr_id IS NULL THEN 'Sin solicitud'
|
||||
WHEN channel_id = 1 THEN 'aurgi.com'
|
||||
WHEN channel_id = 2 THEN 'motortown.es'
|
||||
WHEN channel_id = 3 THEN 'Autingo'
|
||||
WHEN channel_id IN (11,13,14,15,6,8) THEN 'Marketplaces'
|
||||
WHEN channel_id = 10 THEN 'Talleres Digitales'
|
||||
ELSE 'Otros' END AS canal,
|
||||
CASE WHEN sr_id IS NULL THEN 'Sin solicitud'
|
||||
WHEN charged THEN 'Pago web'
|
||||
ELSE 'Pago tienda' END AS forma_pago
|
||||
FROM doc
|
||||
)
|
||||
"""
|
||||
|
||||
CARDS = {
|
||||
"total": {
|
||||
"name": "Venta web total (facturacion NAV / modelo 4494)",
|
||||
"sql": BASE + "SELECT ROUND(SUM(venta),0) AS venta_web_eur, COUNT(DISTINCT numdoc) AS documentos FROM fin",
|
||||
"display": "scalar",
|
||||
},
|
||||
"canal": {
|
||||
"name": "Venta web por canal",
|
||||
"sql": BASE + "SELECT canal, ROUND(SUM(venta),0) AS venta_eur, COUNT(DISTINCT numdoc) AS documentos FROM fin GROUP BY canal ORDER BY venta_eur DESC",
|
||||
"display": "bar",
|
||||
},
|
||||
"pago": {
|
||||
"name": "Venta web por forma de pago",
|
||||
"sql": BASE + "SELECT forma_pago, ROUND(SUM(venta),0) AS venta_eur, COUNT(DISTINCT numdoc) AS documentos FROM fin GROUP BY forma_pago ORDER BY venta_eur DESC",
|
||||
"display": "row",
|
||||
},
|
||||
"matriz": {
|
||||
"name": "Venta web: matriz canal x forma de pago",
|
||||
"sql": BASE + "SELECT canal, forma_pago, ROUND(SUM(venta),0) AS venta_eur, COUNT(DISTINCT numdoc) AS documentos FROM fin GROUP BY canal, forma_pago ORDER BY venta_eur DESC",
|
||||
"display": "table",
|
||||
},
|
||||
"evolutivo": {
|
||||
"name": "Venta web mensual por canal",
|
||||
"sql": BASE + "SELECT DATE_TRUNC(fecha, MONTH) AS mes, canal, ROUND(SUM(venta),0) AS venta_eur FROM fin GROUP BY mes, canal ORDER BY mes, venta_eur DESC",
|
||||
"display": "bar",
|
||||
},
|
||||
}
|
||||
|
||||
TAGS = {
|
||||
"#4494": {"type":"card","name":"#4494","id":"card__4494","display-name":"#4494","card-id":4494},
|
||||
"fecha_desde": {"type":"date","name":"fecha_desde","id":"tag-fecha-desde","display-name":"Fecha desde"},
|
||||
"fecha_hasta": {"type":"date","name":"fecha_hasta","id":"tag-fecha-hasta","display-name":"Fecha hasta"},
|
||||
"centro": {"type":"text","name":"centro","id":"tag-centro","display-name":"Centro"},
|
||||
"ensena": {"type":"text","name":"ensena","id":"tag-ensena","display-name":"Ensena"},
|
||||
}
|
||||
|
||||
def dq(sql):
|
||||
return {"type":"native","database":6,"native":{"query":sql,"template-tags":TAGS}}
|
||||
|
||||
def test_query(sql, params=None):
|
||||
body = dq(sql)
|
||||
body["parameters"] = params or []
|
||||
r = api("POST", "/api/dataset", body)
|
||||
if r.get("error"):
|
||||
print("QUERY ERROR:", r.get("error")); return None
|
||||
cols = [c["name"] for c in r["data"]["cols"]]
|
||||
rows = r["data"]["rows"]
|
||||
return cols, rows
|
||||
|
||||
if __name__ == "__main__":
|
||||
which = sys.argv[1] if len(sys.argv) > 1 else "all"
|
||||
# param YTD 2026 para verificar reconciliacion
|
||||
p_ytd = [{"type":"date/single","value":"2026-01-01","target":["variable",["template-tag","fecha_desde"]]}]
|
||||
for k, c in CARDS.items():
|
||||
if which != "all" and which != k: continue
|
||||
print(f"\n===== TEST {k}: {c['name']} =====")
|
||||
res = test_query(c["sql"], p_ytd)
|
||||
if res:
|
||||
cols, rows = res
|
||||
print("cols:", cols)
|
||||
for row in rows[:15]: print(" ", row)
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
{"total": 12367, "canal": 12368, "pago": 12369, "matriz": 12370, "evolutivo": 12371}
|
||||
@@ -0,0 +1,42 @@
|
||||
import json, sys
|
||||
sys.path.insert(0, "scratchpad/exf")
|
||||
from build import api, BASE, CARDS, TAGS, dq
|
||||
|
||||
COLLECTION = 583 # "Claude" (junto a 1094)
|
||||
|
||||
CUR = {"number_style":"currency","currency":"EUR","currency_style":"symbol","decimals":0}
|
||||
|
||||
def viz(kind):
|
||||
if kind == "total":
|
||||
return {"column_settings":{'["name","venta_web_eur"]':CUR},
|
||||
"scalar.field":"venta_web_eur"}
|
||||
if kind == "canal":
|
||||
return {"graph.dimensions":["canal"],"graph.metrics":["venta_eur"],
|
||||
"graph.x_axis.title_text":"Canal","graph.y_axis.title_text":"Venta web (EUR)",
|
||||
"column_settings":{'["name","venta_eur"]':CUR},"graph.show_values":True}
|
||||
if kind == "pago":
|
||||
return {"graph.dimensions":["forma_pago"],"graph.metrics":["venta_eur"],
|
||||
"column_settings":{'["name","venta_eur"]':CUR},"graph.show_values":True}
|
||||
if kind == "matriz":
|
||||
return {"column_settings":{'["name","venta_eur"]':CUR},
|
||||
"table.columns":[
|
||||
{"name":"canal","enabled":True},{"name":"forma_pago","enabled":True},
|
||||
{"name":"venta_eur","enabled":True},{"name":"documentos","enabled":True}]}
|
||||
if kind == "evolutivo":
|
||||
return {"graph.dimensions":["mes","canal"],"graph.metrics":["venta_eur"],
|
||||
"stackable.stack_type":"stacked","column_settings":{'["name","venta_eur"]':CUR},
|
||||
"graph.x_axis.title_text":"Mes","graph.y_axis.title_text":"Venta web (EUR)"}
|
||||
return {}
|
||||
|
||||
created = {}
|
||||
for k, c in CARDS.items():
|
||||
body = {"name": c["name"], "display": c["display"],
|
||||
"dataset_query": dq(c["sql"]),
|
||||
"visualization_settings": viz(k),
|
||||
"collection_id": COLLECTION}
|
||||
r = api("POST", "/api/card", body)
|
||||
created[k] = r["id"]
|
||||
print(f"card {k}: id {r['id']} {c['name']}")
|
||||
|
||||
json.dump(created, open("scratchpad/exf/cards.json","w"))
|
||||
print("CARDS:", created)
|
||||
@@ -0,0 +1 @@
|
||||
{"dashboard_id": 1143}
|
||||
@@ -0,0 +1,54 @@
|
||||
import json, sys
|
||||
sys.path.insert(0, "scratchpad/exf")
|
||||
from build import api
|
||||
|
||||
C = json.load(open("scratchpad/exf/cards.json"))
|
||||
COLLECTION = 583
|
||||
|
||||
# 1) crear dashboard vacio
|
||||
dash = api("POST", "/api/dashboard", {
|
||||
"name": "Venta Web por Canal y Forma de Pago (facturacion NAV / modelo 4494)",
|
||||
"collection_id": COLLECTION,
|
||||
"description": "Solo venta web (origen precaweb) tomada del modelo 4494 (SUM Base_imponible_linea, facturacion NAV neta), desglosada por canal (channel_id) y forma de pago (pago web vs pago tienda), segun las convenciones del dashboard 1094. Glass excluido. Default: YTD 2026.",
|
||||
})
|
||||
DID = dash["id"]
|
||||
print("dashboard id:", DID)
|
||||
|
||||
# 2) parametros del dashboard
|
||||
PARAMS = [
|
||||
{"id":"p_desde","name":"Fecha desde","slug":"fecha_desde","type":"date/single","default":"2026-01-01"},
|
||||
{"id":"p_hasta","name":"Fecha hasta","slug":"fecha_hasta","type":"date/single"},
|
||||
{"id":"p_centro","name":"Centro","slug":"centro","type":"string/=","sectionId":"string"},
|
||||
{"id":"p_ensena","name":"Ensena","slug":"ensena","type":"string/=","sectionId":"string"},
|
||||
]
|
||||
|
||||
def mappings(cid):
|
||||
return [
|
||||
{"parameter_id":"p_desde","card_id":cid,"target":["variable",["template-tag","fecha_desde"]]},
|
||||
{"parameter_id":"p_hasta","card_id":cid,"target":["variable",["template-tag","fecha_hasta"]]},
|
||||
{"parameter_id":"p_centro","card_id":cid,"target":["variable",["template-tag","centro"]]},
|
||||
{"parameter_id":"p_ensena","card_id":cid,"target":["variable",["template-tag","ensena"]]},
|
||||
]
|
||||
|
||||
# 3) layout (grid 24 col)
|
||||
LAYOUT = {
|
||||
"total": (0, 0, 6, 4),
|
||||
"pago": (0, 6, 18, 4),
|
||||
"canal": (4, 0, 12, 7),
|
||||
"matriz": (4, 12, 12, 7),
|
||||
"evolutivo": (11, 0, 24, 7),
|
||||
}
|
||||
dashcards = []
|
||||
neg = -1
|
||||
for k,(row,col,sx,sy) in LAYOUT.items():
|
||||
cid = C[k]
|
||||
dashcards.append({
|
||||
"id": neg, "card_id": cid, "row": row, "col": col, "size_x": sx, "size_y": sy,
|
||||
"series": [], "parameter_mappings": mappings(cid), "visualization_settings": {}
|
||||
})
|
||||
neg -= 1
|
||||
|
||||
r = api("PUT", f"/api/dashboard/{DID}", {"dashcards": dashcards, "parameters": PARAMS})
|
||||
print("dashcards saved:", len(r.get("dashcards",[])))
|
||||
print("URL: https://reports.autingo.es/dashboard/%d" % DID)
|
||||
json.dump({"dashboard_id":DID}, open("scratchpad/exf/dash.json","w"))
|
||||
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user