Analitikai, ataskaitoms ir duomenų eksportui

Šiame skyriuje apžvelgiamos praktinės galimybės paimti didelius kiekius duomenų iš Rivile ERP per REST užklausą ir juos panaudoti populiariausiose analitikos priemonėse.

Pastaba: techninės API naudojimo detalės (autentifikacija, filtravimas, pavyzdžiai įvairiomis kalbomis) yra API skyriuje:


Turinys


Bendra informacija

Analitikai skirti duomenų šaltiniai (data sources) yra pasiekiami per užklausą GET https://api.rivile.cloud/bi/collect. Tačiau prieš imant duomenis, būtina nurodyti duomenų filtravimo sąlygas. Filtravimo sąlygos priklauso nuo duomenų šaltinio. Pavyzdžiui, prekės, skolos ir sąskaitos faktūros yra skirtingi objektai, todėl jiems taikomi skirtingi filtrai.

Dažniausiai naudojami duomenų šaltiniai

  • SALES_INVOICE_DETAILED – pardavimų sąskaitų eilutės.
  • PURCHASE_INVOICE_DETAILED – pirkimų sąskaitų eilutės.
  • INVENTORY_STOCK – atsargų likučiai.
  • PAYABLE_RECEIVABLES_FLAT – pirkėjų/tiekėjų dokumentai, terminai, likučiai, apmokėjimo statusai.
  • GENERAL_LEDGER – DK įrašai: sąskaitos, korespondencijos, debetas/kreditas.
  • PAYMENTS – apmokėjimai: datos, sumos, mokėjimo būdai.
  • CLIENT – klientų kortelės.
  • CLIENT_GROUP – klientų grupės.
  • PRODUCT – prekių katalogas.
  • PRICE – kainodara.

Pastaba: realų sąrašą duomenų šaltinių ir tikslų laukų rinkinį (schema) visada gaukite iš GET /bi/schemas/.


Greitas naudojimo scenarijus

  • 1 žingsnis: išsikvieskite GET /bi/schemas/{dataSource} ir išsaugokite jus dominančio duomenų šaltinio filtravimo schemą.
  • 2 žingsnis: pagal schemą suformuokite filter JSON objektą (tik palaikomiems laukams ir leistinoms reikšmėms) ir jį URL‑užkoduokite.
  • 3 žingsnis: traukite duomenis su užklausa GET /bi/collect?type={dataSource}&filter={urlEncodedJson}.
  • 4 žingsnis: rezultatą naudokite tiesiogiai analitikos įrankyje arba išsisaugokite į tarpinę duomenų bazę.

Duomenų filtro generavimas

  • Paskirtis: gauti konkretaus duomenų šaltinio filtravimo schemą (laukus, tipus, leistinas reikšmes) tam, kad jūs teisingai suformuotumėte filter parametrą duomenų užklausoms. Visada vadovaukitės šio API prieigos (endpoint'o) atsakymu, nes schemos ateityje gali keistis ar pasipildyti.

  • Užklausos forma:

    GET https://api.rivile.cloud/bi/schemas/{dataSource}
    X-SessionToken: <JŪSŲ_API_RAKTAS>
  • Pavyzdinė užklausa:

    GET https://api.rivile.cloud/bi/schemas/PRODUCT
    X-SessionToken: <JŪSŲ_API_RAKTAS>
  • Pavyzdinis atsakymas (sutrumpinta forma):

    {
    "properties": {
    "type": {
      "type": "string",
      "enum": ["PRODUCT", "SERVICE", "ALL"],
      "default": "ALL"
    },
    "active": { "type": "boolean", "default": true },
    "createdFrom": { "type": "string", "format": "date" },
    "createdTo": { "type": "string", "format": "date" },
    "suppliers": {
      "type": "array",
      "items": { "type": "string", "format": "uuid" },
      "maxItems": 500,
      "minItems": 1,
      "uniqueItems": true
    }
    }
    }

    Pateiktoje schemoje yra properties, kuriame pateikiami atributai (type, active, createdFrom, createdTo, suppliers). Iš šių atributų galima suformuoti filtrą. Filtras konstruojamas kaip JSON objektas.

Pvz.:

  • {"type":"PRODUCT", "active":true} toks filtras ištrauks tik aktyvias prekes.
  • {"type":"SERVICE", "createdFrom": "2025-01-01", "createdTo": "2025-12-31"} toks filtras ištrauks tik paslaugas, kurios buvo sukurtos 2025 metais.
  • {"type":"ALL", "suppliers": ['UUID-1','UUID-2',...'UUID-500']} toks filtras ištrauks visas prekes ir paslaugas pagal tiekėjų UUID.

Norint šį filtrą perduoti kaip GET užklausos filter parametrą, reikės gautą JSON eilutę paversti į URL‑encoded eilutę. Pvz.: iš {"type":"ALL"} gauti %7B%22type%22%3A%22ALL%22%7D.


Duomenų ištraukimas

  • Paskirtis: paimti duomenis iš pasirinkto duomenų šaltinio (parametras type), panaudojus suformuotą filter reikšmę.
  • Užklausos forma:
    GET https://api.rivile.cloud/bi/collect?type={dataSource}&filter={urlEncodedFilterJson}
    X-SessionToken: <JŪSŲ_API_RAKTAS>
  • Pastaba: filter visada turi būti tinkamai URL‑užkoduotas.
  • Pavyzdys (visi produktų tipai):
    GET https://api.rivile.cloud/bi/collect?type=PRODUCT&filter=%7B%22type%22%3A%22ALL%22%7D
    X-SessionToken: <JŪSŲ_API_RAKTAS>
  • Pavyzdinis atsakymas:
    {
    "status": "SUCCESS",
    "success": {
    "data": {
      "products": [{productObject}, {productObject}, ..., {productObject}]
    }
    }
    }
  • Pastaba: kad pakartotinos užklausos veiktų greičiau, užklausų rezultatai 8 val. saugomi laikinoje talpykloje (cache). Svarbu suprasti, kad vykdant tokią pačią užklausą (su tokiu pačiu filtru) 8 val. laikotarpiu gausite duomenis iš talpyklos (cache), o ne aktualius duomenis iš ERP duomenų bazės.

Rekomendacijos

  • Slaptai laikykite API autentifikacijos raktus.
  • Stenkitės duomenų ištraukimą planuoti naktį, o gautus duomenis saugiai laikyti savo infrastruktūroje.

Analitikos API užklausos kainuoja

  • Duomenų kaupimas ir agregavimas detaliu lygiu ERP sistemoje reikalauja daug išteklių, todėl šios užklausos kainuoja papildomai.
  • Daugiau apie analitikos API užklausų kainodarą pasidomėkite ERP kainodaros puslapyje.

ETL ir tarpinis sluoksnis (pasirinktinai)

  • Kai analitikos įrankis turi ribotą REST palaikymą arba kai duomenų yra labai daug, rekomenduojame naudoti ETL įrankį (pvz., n8n, Airflow, Pentaho, Azure Data Factory) ir duomenis krauti į:
    • Debesų duomenų sandėlį: BigQuery, Snowflake, Azure SQL/Synapse.
    • RDBMS: PostgreSQL, MySQL, SQL Server.
  • Privalumai: klaidų kontrolė, pakartojamumas, našumas, istorinių duomenų saugojimas.

Populiariausios analitikos priemonės

Microsoft Excel (Power Query)

  • Paskirtis: greitos ad hoc ataskaitos, pasukamosios (pivot) lentelės, paprasti grafikai.
  • Kaip jungtis: Data > Get Data > From Other Sources > From Web ir nurodykite REST URL adresą.
  • Kaip pasiimti ERP duomenis per endpoint:
    • 1) Išsikvieskite schemą: GET https://api.rivile.cloud/bi/schemas/PAYMENTS (antraštė X-SessionToken: <API_RAKTAS>), pagal atsakymą apsibrėžkite filtrus.
    • 2) Power Query pasirinkite Web > Advanced ir nurodykite URL su filtru, pvz.:
    • URL: https://api.rivile.cloud/bi/collect?type=PAYMENTS&filter=%7B%22from%22%3A%222025-01-01%22%2C%22to%22%3A%222025-12-31%22%7D
    • Headers: X-SessionToken: <API_RAKTAS> (Authentication: Anonymous, nes raktą perduodame antraštėje).
    • 3) Power Query redaktoriuje iš success.data mazgo išskleiskite atitinkamą masyvą (pvz., payments), konvertuokite į lentelę (Table).
  • Patarimai:
    • Power Query redaktoriuje apdorokite JSON (Record/List į Table), tipizuokite stulpelius.
    • Parametrizuokite datų filtrus (pvz., „Nuo_Datos“), kad lengvai atnaujintumėte.
    • Įjunkite Background Refresh arba naudokite „Refresh All“ periodiškai.

Microsoft Power BI

  • Paskirtis: interaktyvūs valdybos/darbo srities (dashboard) atvaizdavimai, duomenų modeliavimas (DAX), publikavimas Power BI Service.
  • Kaip jungtis: Get Data > Web (arba „Blank Query“ su M formuluote) į REST GET užklausą.
  • Kaip pasiimti ERP duomenis per endpoint:
    • 1) Sukurkite parametrus: BaseUrl = "https://api.rivile.cloud", ApiKey, FromDate, ToDate.
    • 2) Modifikuokite užklausą (Blank Query) – pavyzdys:
      let
      BaseUrl = "https://api.rivile.cloud",
      // ApiKey, FromDate, ToDate – tai parametrai; juos naudokite tiesiogiai
      FilterObj = [ from = FromDate, to = ToDate ],
      FilterText = Uri.EscapeDataString( Text.FromBinary( Json.FromValue(FilterObj) ) ),
      Url = BaseUrl & "/bi/collect?type=PAYMENTS&filter=" & FilterText,
      Source = Json.Document(Web.Contents(Url, [Headers=[#"X-SessionToken"=ApiKey]])),
      Data = Source[success][data],
      Lines = Data[payments],
      Table = Table.FromList(Lines, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
      Expanded = Table.ExpandRecordColumn(
      Table,
      "Column1",
      Record.FieldNames(
        Table.FirstValue(
          Table.TransformColumns(Table.FirstN(Table,1), {{"Column1", each _, type record}})[Column1]
        )
      )
      )
      in
      Expanded
    • 3) Įjunkite Incremental Refresh pagal datų stulpelį (pvz., dokumento data).
  • Patarimai:
    • Įgyvendinkite inkrementinį atnaujinimą (Incremental Refresh) pagal datą/laiką.
    • Sukurkite žvaigždės schemą: faktų lentelės (pvz., pardavimai) ir dimensijos (klientai, prekės, kalendorius).
    • Naudokite parametrus (BaseUrl, ApiKey) skirtingiems duomenims ištraukti.

Google Looker Studio (anksčiau „Data Studio“)

  • Paskirtis: lengvai dalinami interaktyvūs prietaisų skydai naršyklėje.
  • Kaip jungtis: per „Community Connector“ arba sukurkite tarpinį Google Sheets/BigQuery sluoksnį.
  • Kaip pasiimti ERP duomenis per endpoint (Google Sheets + Apps Script):
    • 1) Sheets faile Tools > Script editor sukurkite skriptą, kuris kviečia:
      function loadRivileSales() {
      var url = 'https://api.rivile.cloud/bi/collect?type=PAYMENTS&filter=' +
              encodeURIComponent(JSON.stringify({from:'2025-01-01', to:'2025-12-31'}));
      var resp = UrlFetchApp.fetch(url, {headers: {'X-SessionToken': PropertiesService.getScriptProperties().getProperty('API_KEY')}});
      var json = JSON.parse(resp.getContentText());
      var rows = json.success.data.payments || [];
      var sheet = SpreadsheetApp.getActive().getSheetByName('payments') || SpreadsheetApp.getActive().insertSheet('payments');
      sheet.clear();
      if (rows.length === 0) return;
      var headers = Object.keys(rows[0]);
      sheet.getRange(1,1,1,headers.length).setValues([headers]);
      sheet.getRange(2,1,rows.length,headers.length).setValues(rows.map(r => headers.map(h => r[h] ?? '')));
      }
    • 2) Nustatykite API_KEY Script Properties, sukurkite laikmatį (Trigger) periodiniam atnaujinimui ir naudokite šį Sheets kaip Looker Studio šaltinį.
  • Patarimai:
    • Kuo didesni srautai – tuo labiau tinka BigQuery kaip šaltinis.
    • Nustatykite atnaujinimo tvarkaraštį (Sheets + Apps Script trigeriai ar ETL planuotojas).

Tableau

  • Paskirtis: pažangi vizualinė analitika, dideli duomenų kiekiai, interaktyvūs prietaisų skydai.
  • Kaip jungtis: Web Data Connector (WDC) arba duomenų įkėlimas į tarpinę DB (PostgreSQL/SQL Server).
  • Kaip pasiimti ERP duomenis per endpoint:
    • 1) Greitas variantas: naudokite tarpinę DB. ETL pagalba kvieskite GET /bi/collect kas N minučių ir įrašykite rezultatus į lenteles (pvz., fact_sales, dim_client, dim_product). Tableau jungiasi prie DB ir atnaujina Extract.
    • 2) Jei naudojate WDC: sukurkite paprastą WDC, kuris siunčia HTTP GET į https://api.rivile.cloud/bi/collect?type=INVENTORY_STOCK&filter=... su X-SessionToken antrašte ir grąžina data duomenis.
  • Patarimai:
    • Esant ribojimams per REST, naudokite iš anksto paruoštą „extract“ per ETL, o Tableau atnaujinkite „Data Extracts“.
    • Modeliuokite dimensijas/faktus ir naudokite skaičiuojamus laukus konsoliduotoms metrikoms.

Qlik Sense / Qlik Cloud

  • Paskirtis: asociatyvus variklis, lankstus duomenų derinimas iš kelių šaltinių.

  • Kaip jungtis: Qlik Script (REST connector) nurodant endpoint'ą, antraštes, puslapiavimą.

  • Kaip pasiimti ERP duomenis per endpoint (skripto pavyzdys):

    LET vBaseUrl = 'https://api.rivile.cloud';
    LET vApiKey = '$(include=api_key.txt)'; // arba nustatykite kaip kintamąjį saugiai
    LET vFrom = '2025-01-01';
    LET vTo = '2025-12-31';
    LET vFilter = Replace(Replace(JsonSerialize('{
      "from":"$(vFrom)",
      "to":"$(vTo)"
    }'), chr(10), ''), ' ', '');
    LET vUrl = '$(vBaseUrl)/bi/collect?type=PAYMENTS&filter=' & UrlEncode(vFilter);
    
    RESTConnectorMasterTable:
    SQL SELECT 
      "status",
      "success/data/payments" AS payments
    FROM JSON (wrap on) "$(vUrl)"
    WITH CONNECTION (HTTPHEADER "X-SessionToken" "$(vApiKey)");
    
    Payments:
    LOAD *
    RESIDENT RESTConnectorMasterTable;
    DROP TABLE RESTConnectorMasterTable;
  • Pastaba: prieš naudojant aukščiau esantį skriptą, Qlik aplinkoje sukurkite REST Connection (pvz., RivileREST) ir skripto pradžioje pridėkite LIB CONNECT TO 'RivileREST';. WITH CONNECTION bloke nurodykite URL "$(vUrl)" ir antraštę HTTPHEADER "X-SessionToken" "$(vApiKey)". Realioje aplinkoje REST Connector dažniausiai sukuria „Master/Child“ lenteles, kurias reikia sujungti pagal generuojamus raktus (__KEY__, __FK__).

Integraciniai sprendimai