API Reference / Report

Report

Aggregazioni server-side per grafici e KPI: raggruppa e misura i record di qualsiasi modulo (base o custom) senza scaricarli. Il permesso di lettura e lo scope dell'utente sono applicati dentro la query: ognuno aggrega solo ciò che può vedere.

Endpoint
MetodoEndpointCosa fa
POST/api/reports/aggregateAggregazione per campo o nel tempo (serie per i grafici).
POST/api/reports/kpiValore singolo con confronto sul periodo precedente.
POST/api/reports/exportLa stessa aggregazione, scaricata come CSV o XLSX.
GET/api/reports/overviewPanoramica per modulo (conteggi): solo admin.

01Aggregazione

POST /api/reports/aggregate bearer richiesto

Due modalità: mode: "field" raggruppa per il valore di una colonna (es. trattative per stage); mode: "time" costruisce una serie temporale su un campo data.

Body
CampoTipoDescrizione
modulestringrichiestoChiave del modulo (base o custom).
modestringrichiestofield o time.
groupBystringper mode=fieldLa colonna su cui raggruppare.
dateFieldstringper mode=timeIl campo data della serie.
metricstringopzionalecount (default), sum, avg, min, max, distinct, ratio: tutte tranne count richiedono valueField.
valueFieldstringopzionaleLa colonna numerica da misurare (es. amount).
filtersarrayopzionaleCondizioni nello stesso formato dei filtri avanzati.
dateFrom / dateTostringopzionaleIntervallo sul campo periodo (periodField).
Richiesta
curl -X POST https://crm.tuodominio.it/api/reports/aggregate \
  -H "Authorization: Bearer <accessToken>" \
  -H "Content-Type: application/json" \
  -d '{ "module": "deals", "mode": "field", "groupBy": "stage", "metric": "sum", "valueField": "amount" }'
const res = await fetch("https://crm.tuodominio.it/api/reports/aggregate", {
  method: "POST",
  headers: { Authorization: `Bearer ${accessToken}`, "Content-Type": "application/json" },
  body: JSON.stringify({ module: "deals", mode: "field", groupBy: "stage", metric: "sum", valueField: "amount" }),
});
Risposta · 200
json
{
  "success": true,
  "data": {
    "mode": "field",
    "total": 125000,
    "data": [
      { "name": "negotiation", "value": 78000 },
      { "name": "proposal",    "value": 47000 }
    ]
  }
}

02KPI

POST /api/reports/kpi bearer richiesto

Un valore singolo (la card KPI della dashboard): stessa semantica di misura di aggregate, più il confronto opzionale col periodo precedente.

Body
CampoTipoDescrizione
module · metric · valueField · filters·come aggregateLa misura da calcolare.
ratioValuestringopzionalePer metriche a rapporto (percentuale su un valore di riferimento).
period / periodFieldstringopzionaleLa finestra temporale del KPI e il campo data su cui applicarla.
comparebooleanopzionaletrue → calcola anche il periodo precedente e la crescita %.
Risposta · 200
json
{ "success": true, "data": { "value": 125000, "previous": 98000, "growthPct": 27.55, "metric": "sum", "period": "month" } }

03Export

POST /api/reports/export bearer richiesto

Accetta lo stesso body di aggregate più format (csv, default, o xlsx) e opzionalmente groupLabel/valueLabel per intestare le colonne. La risposta è il file binario (Content-Disposition: attachment), non l'envelope JSON.

Nota

Le colonne utilizzabili in groupBy/valueField/filters sono quelle del catalogo del modulo: una colonna non prevista risponde 422. I risultati sono messi in cache lato server per qualche decina di secondi: un dato appena scritto può apparire con un piccolo ritardo.