feat(metabase): auto-commit con 17 cambios

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-13 18:40:22 +02:00
parent aec5d82011
commit d110aa40f9
17 changed files with 1946 additions and 2 deletions
@@ -0,0 +1,98 @@
---
name: metabase_smartscalar_anothercolumn_viz
kind: function
lang: py
domain: infra
version: "1.0.0"
purity: pure
signature: "def metabase_smartscalar_anothercolumn_viz(*, main_column: str, compare_column: str, label: str = 'vs N-1', number_style: str = 'percent', decimals: int = 2, currency: str = 'EUR', comparison_id: str = 'cmp_n1') -> dict"
description: "Construye el dict completo de visualization_settings para una card display=smartscalar con comparacion tipo anotherColumn (misma fila, columna diferente). Incluye scalar.field, scalar.comparisons y column_settings para ambas columnas con el mismo formato. Internamente reutiliza metabase_viz_column_format."
tags: [metabase, visualization, smartscalar, anothercolumn, scalar, comparison, pure, builder]
uses_functions:
- metabase_viz_column_format_py_infra
uses_types: []
returns: []
returns_optional: false
error_type: ""
imports: []
params:
- name: main_column
desc: "Nombre de la columna mostrada como valor principal en el smartscalar. Debe coincidir exactamente con el nombre de columna en el resultado del query"
- name: compare_column
desc: "Nombre de la columna usada como valor de comparacion en la misma fila del query"
- name: label
desc: "Etiqueta mostrada bajo el delta de comparacion. Default 'vs N-1'"
- name: number_style
desc: "Estilo de formato para ambas columnas: 'percent', 'currency', 'decimal', '' (default Metabase). Default 'percent'"
- name: decimals
desc: "Numero de decimales para ambas columnas. Default 2"
- name: currency
desc: "Codigo ISO de moneda ('EUR', 'USD', ...). Solo relevante cuando number_style='currency'. Default 'EUR'"
- name: comparison_id
desc: "Identificador interno de la comparacion dentro del array scalar.comparisons. Default 'cmp_n1'"
output: "Dict con visualization_settings completo: {'scalar.field': str, 'scalar.comparisons': [{'id', 'type': 'anotherColumn', 'column', 'label'}], 'column_settings': {key_main: fmt, key_compare: fmt}}. Listo para usar como visualization_settings en el payload de la card."
tested: false
tests: []
test_file_path: ""
file_path: "python/functions/metabase/metabase_smartscalar_anothercolumn_viz.py"
---
## Por que existe
El patron ``anotherColumn`` de Metabase smartscalar muestra un delta entre
dos columnas de la misma fila (en lugar del patron ``previousValue`` que
usa dos filas temporales). Util cuando el query ya calcula el valor actual
y el valor comparativo directamente (tipico en queries con CTEs que calculan
n-1 en una sola pasada).
La combinacion ``scalar.field`` + ``scalar.comparisons[anotherColumn]`` +
``column_settings`` para ambas columnas con formato identico requiere varios
campos que Metabase silenciosamente ignora si faltan o estan mal formateados.
## Ejemplo
```python
from metabase import metabase_smartscalar_anothercolumn_viz, metabase_create_card_raw
# Smartscalar de margen (porcentaje) vs columna n-1
viz = metabase_smartscalar_anothercolumn_viz(
main_column="Margen",
compare_column="MargenN1",
label="vs N-1",
number_style="percent",
decimals=2,
)
# Smartscalar de venta (moneda) vs columna n-1
viz = metabase_smartscalar_anothercolumn_viz(
main_column="Venta",
compare_column="VentaN1",
label="vs ano anterior",
number_style="currency",
decimals=0,
currency="EUR",
)
# Integrar en un payload completo de card
payload = {
"name": "Margen actual",
"type": "question",
"display": "smartscalar",
"dataset_query": { ... },
"visualization_settings": viz,
}
card = metabase_create_card_raw(client, payload)
```
## Notas
- Aplica el mismo formato (``number_style``, ``decimals``, ``currency``) a
ambas columnas (``main_column`` y ``compare_column``). Si necesitas formatos
distintos, construye ``column_settings`` manualmente con
``metabase_viz_column_format`` y monta el dict a mano.
- Cuando ``number_style="currency"`` se agrega automaticamente
``currency_in_header=False`` en ambas columnas.
- El ``comparison_id`` solo necesita ser unico dentro del array
``scalar.comparisons`` de esa card — no es un ID global.
- Para el patron de 2 filas temporales (``previousValue``) usar
``metabase_smartscalar_kpi_payload`` en su lugar.