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:
2026-07-01 17:58:03 +02:00
parent 8408863cfa
commit fbdf80bd71
22 changed files with 395 additions and 0 deletions
Binary file not shown.
+7
View File
@@ -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()
+1
View File
@@ -0,0 +1 @@
{"c1": 12363, "c2": 12364, "c3": 12365}
+61
View File
@@ -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
1 ensena year mes diego bq_neto match
2 Aurgi 2023 feb 80.52
3 Aurgi 2023 mar 89.94
4 Aurgi 2023 abr 76.87
5 Aurgi 2023 may 87.95
6 Aurgi 2023 jun 97.84
7 Aurgi 2023 jul 138.24
8 Aurgi 2023 ago 89.7
9 Aurgi 2023 sep 61.53
10 Aurgi 2023 oct 56.48
11 Aurgi 2023 nov 73.2
12 Aurgi 2023 dic 78.81
13 Aurgi 2024 ene 75.34 75.35 100.0
14 Aurgi 2024 feb 60.21 60.21 100.0
15 Aurgi 2024 mar 70.62 71.26 99.1
16 Aurgi 2024 abr 70.46 70.46 100.0
17 Aurgi 2024 may 84.76 84.76 100.0
18 Aurgi 2024 jun 108.7 108.7 100.0
19 Aurgi 2024 jul 141.2 141.2 100.0
20 Aurgi 2024 ago 100.18 100.18 100.0
21 Aurgi 2024 sep 67.91 67.91 100.0
22 Aurgi 2024 oct 81.31 81.31 100.0
23 Aurgi 2024 nov 71.57 71.57 100.0
24 Aurgi 2024 dic 74.33 74.33 100.0
25 Aurgi 2025 ene 86.28 86.28 100.0
26 Aurgi 2025 feb 53.05 53.05 100.0
27 Aurgi 2025 mar 86.75 86.75 100.0
28 Aurgi 2025 abr 83.89 83.89 100.0
29 Aurgi 2025 may 84.24 84.24 100.0
30 Aurgi 2025 jun 134.46 134.46 100.0
31 Aurgi 2025 jul 101.17 174.32 58.0
32 MT 2023 feb 30.19
33 MT 2023 mar 41.89
34 MT 2023 abr 36.16
35 MT 2023 may 42.01
36 MT 2023 jun 44.24
37 MT 2023 jul 63.61
38 MT 2023 ago 40.7
39 MT 2023 sep 28.6
40 MT 2023 oct 28.79
41 MT 2023 nov 30.3
42 MT 2023 dic 35.21
43 MT 2024 ene 38.13 38.13 100.0
44 MT 2024 feb 32.44 32.44 100.0
45 MT 2024 mar 35.17 35.18 100.0
46 MT 2024 abr 35.38 35.38 100.0
47 MT 2024 may 37.58 37.58 100.0
48 MT 2024 jun 44.54 44.54 100.0
49 MT 2024 jul 58.92 58.92 100.0
50 MT 2024 ago 40.97 40.98 100.0
51 MT 2024 sep 35.03 35.03 100.0
52 MT 2024 oct 38.86 38.86 100.0
53 MT 2024 nov 36.48 36.48 100.0
54 MT 2024 dic 40.52 40.52 100.0
55 MT 2025 ene 39.16 39.16 100.0
56 MT 2025 feb 28.16 28.16 100.0
57 MT 2025 mar 42.26 42.26 100.0
58 MT 2025 abr 44.04 44.04 100.0
59 MT 2025 may 52.71 52.71 100.0
60 MT 2025 jun 63.54 63.54 100.0
61 MT 2025 jul 49.47 84.94 58.2
+1
View File
@@ -0,0 +1 @@
https://reports.autingo.es/dashboard/1142
Binary file not shown.
+60
View File
@@ -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)
+8
View File
@@ -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))
+152
View File
@@ -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
+1
View File
@@ -0,0 +1 @@
{"total": 12367, "canal": 12368, "pago": 12369, "matriz": 12370, "evolutivo": 12371}
+42
View File
@@ -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)
+1
View File
@@ -0,0 +1 @@
{"dashboard_id": 1143}
+54
View File
@@ -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.