Správa reportů

Reporty jsou určeny pro potřebu vedoucích pracovníků nebo účetních. Jejich pomocí například mohou sledovat požadavky zadané pomocí formulářů v prostředí Sofa a vytvářet jejich statistické přehledy.

Okno Správa reportů otevřete v okně Administrace klepnutím na tlačítko Správa reportů. Okno je ve výchozím stavu prázdné. Reporty můžete do Sofa importovat ze souborů nebo je vytvářet jako zcela nové pomocí návrháře.

report04

Vytvoření nového reportu

Pokud chcete vytvořit nový report, postupujte takto. Klepněte na tlačítko Akce a v rozvinuté nabídce spusťte příkaz Vytvořit nový report.

report05

V okně Nový report nastavte vlastnosti nového reportu.

  • V sekci Popisné údaje uveďte český, slovenský, anglický a německý název a také slovní popis, k čemu má report sloužit. Povinný je český název.

  • V sekci Nastavení:

    • Do pole Priorita řazení můžete nepovinně zadat číslo udávající, s jakou prioritou bude položka reportu uváděna v pohledu na reporty.

    • Voličem Úroveň logování vyberte, do jaké úrovně se mají zaznamenávat systémové události.

    • Do pole Identifikátor napište stručný řetězec znaků, pod kterým bude report jednoznačně dostupný v interních tabulkách Sofa ve vztahu k jiným procesům. Pole nesmí být prázdné. Jako výchozí volba se nabízí obsah pole Český název – bez mezer, speciálních znaků a znaků s diakritikou. Jednoznačnost identifikátoru se kontroluje.

  • V sekci Ikona agendy můžete vybrat obrázek, který bude vyjadřovat ikonu reportu. Přepínačem vlevo nejprve zvolte, zda chcete použít některou z přednastavených ikon (volba Z galerie), nebo vlastní obrázek (volba Vlastní ikona).

    • V případě výběru z galerie jednoduše klepněte na zvolený motiv, ten se označí černým orámováním.

    • Pokud chcete použít vlastní motiv, připravte si soubor ve formátu PNG, s rozlišením 48×48 pixelů. Klepněte na tlačítko Nahrát ikonu agendy a soubor vyhledejte na disku počítače.

  • Lze také zvolit barevné schéma zobrazení symbolu reportu v okně pro administraci reportů.

Základní nastavení ukončíte klepnutím na tlačítko Navrhnout report.

report06

Návrhář reportů

Tlačítkem Navrhnout report přejdete do okna Návrh reportu.

report07

Obsluha Návrháře reportů je popsána v kapitole Prostředí Návrháře reportů a následujících.

Jakmile návrh reportu publikujete, přejdete do okna Úprava reportu, které je v podstatě totožné s výše uvedeným oknem Nový report. Zde můžete upravit vlastnosti reportu a tlačítkem Uložit práci zakončit.

Import reportu

Předpokladem je, že máte k dispozici soubor, ve kterém je uložen hotový report a ten chcete importovat do prostředí Sofa.

Postupujte takto:

  • V okně Správa reportů klepněte na tlačítko Akce.

  • V rozvinuté nabídce spusťte příkaz Importovat report.

report08
  • V dialogu Import reportu vyhledejte pomocí tlačítka Zvolit soubor v poli Soubor s exportovaným reportem soubor, který obsahuje hledaný report. Soubor musí mít příponu S602.

report09
  • Chcete-li načítaný report importovat jako samostatný nový report, zaškrtněte políčko Importovat jako nový report a v poli Nový identifikátor mu přidělte nový jednoznačný identifikátor. Pozor, jde o identifikátor a nikoliv o popisný název! Nesmí tedy obsahovat nepovolené znaky, jako jsou znaky s diakritikou, mezery a podobně.

  • Stiskněte tlačítko Importovat report.

V okně Úprava reportu zkontrolujte načtené vlastnosti reportu a podle potřeby je upravte.

report10

Klepněte na tlačítko Uložit.

Report se uloží a najdete ho v okně Správa reportů.

Pokud v okně Úprava reportu klepnete na tlačítko Upravit report, načte se popis reportu do okna Návrh reportu, kde můžete obsah a vzhled reportu podle potřeby upravit.

Správa reportů

Položky všech reportů jsou zobrazeny v okně Správa reportů.

report11

Nastavení dostupnosti reportu

Ve výchozím stavu není vytvořený report nikomu z uživatelů Sofa dostupný. Dostupnost je nutné teprve nastavit. V položce reportu klepněte na tlačítko se třemi tečkami a potom na příkaz Nastavit oprávnění reportu.

report12

Otevře se okno Dostupnost reportu xxx. Zde klepněte na tlačítko Přidat skupinu/roli nebo na odkaz Zpřístupnit report skupině / roli.

report13

V dialogu Přidání skupiny / role do dostupnosti reportu vyberte pomocí voliče požadovanou skupinu (roli); podle potřeby postup opakujte pro další skupiny (role).

report14

Nastavení se promítnou do sloupce Dostupnost reportu v okně Správa reportů.

report15

Takto nastavený report nadále budou mít příslušní uživatelé k dispozici v okně Reporty.

Úpravy reportu

Klepnutím na tlačítko se třemi tečkami ve sloupci Akce se pro danou položku otevře příkazová nabídka obsahující servisní příkazy pro úpravy reportu. Zastoupení příkazů může být u některých reportů odlišné podle jejich dostupnosti.

report16
  • Upravit popis – otevře okno Úprava reportu pro úpravy popisných údajů reportu.

  • Upravit předpis reportu – otevře pro daný report okno návrháře reportů.

  • Smazat report – odebere celou definici reportu ze Sofa.

  • Exportovat report – exportuje údaje o reportu do souboru.

  • Vytvořit kopii reportu – vloží do reportů nový report, který bude přesnou kopií reportu, u kterého byl příkaz spuštěn. Název kopie i další parametry lze změnit v okně otevřeném příkazem Upravit popis.

  • Nastavit oprávnění reportu – umožňuje spravovat dostupnost reportu podle skupin a rolí.

Prostředí Návrháře reportů

Návrhář slouží k samotnému sestavení vlastností reportu. Do prostřední části stránky je třeba vložit základní GraphQL dotaz, který získává data do hlavní tabulky reportu.

Dále můžete použít Sofa JavaScript, ten slouží pro přípravu proměnných pro hlavní dotaz. Je možné provolávat poddotazy, např. profiltrovat data ze zobrazení (typicky např. podřízení přihlášeného uživatele).

Je možné definovat názvy sloupců zobrazených v reportu. Lze tak určit, podle kterých sloupců bude možné filtrovat, podle kterých sloupců rychle vyhledávat, určit šířky sloupců a pro čísla a kalendářní data nastavovat masku způsobu zobrazení.

V reportu je možné zobrazovat podtabulky, tedy tabulky propojené s hlavní tabulkou pomocí cizích klíčů. Pro každou podtabulku je možné definovat její název a u sloupců jejich název, šířku a zobrazované masky.

report17

GraphQL dotazy pro vytváření reportů

Reporty jsou v Sofa vytvářeny přímo nad databází pomocí GraphQL dotazů. Aby v reportu vše správně fungovalo (stránkování, filtrování) je nutné přesně dodržovat určité tvary dotazů.

Okno pro práci s datovými zdroji je možné otevřít z okna Administrace klepnutím na tlačítko Datové zdroje.

Příprava databáze

Aby bylo možné pracovat s reporty, je nutné mít ve své organizaci vytvořený a nastavený přístup k Sofa databázi.

Aniž byste cokoliv museli nastavovat, existuje vždy položka systémové databáze Sofa. Ta obsahuje tabulky všech agend Sofa. V této databázi byste neměli nic měnit.

report18

Ukažme si, jak vytvoříte svůj vlastní nový datový zdroj. Ten můžete vytvořit v okně Datové zdroje po stisknutí tlačítka Nový datový zdroj.

V okně Datový zdroj v polích Název a Popis datový zdroj pojmenujte.

V okně je předem nastaveno několik parametrů. Jedná se o:

  • Typ datového zdroje – ponechte nastavení Sofa databáze. Další nabízenou možností je Externí databáze, tu však pro tento případ nevolte.

  • Databázové schéma – systém generuje automaticky bez možnosti změny.

  • Uživatelské jméno – nastavené systémem a neměnné.

U datového zdroje je nejdůležitější nastavení hesla pro přístup do databáze. Heslo zapsané do pole Heslo musí obsahovat písmena, číslice a speciální znaky a být dlouhé minimálně 9 znaků.

report19

V tuto chvíli je možné se přihlásit do databáze s loginem uvedeným v poli Uživatelské jméno a zadaným heslem.

Po vytvoření tabulek a jejich požadovaném propojení je možné načíst do Sofa databázové schéma. To opět uděláte v administraci Sofa:

  • U položky daného datového zdroje klepněte na tlačítko se třemi tečkami a v následující příkazové nabídce spusťte příkaz Tabulky.

report20
  • V okně Tabulky datového zdroje xxx klepněte na tlačítko Aktualizovat databázové schéma.

report21
  • Poté se z databáze načtou tabulky a vypíšou se definované vazby mezi nimi.

Okno může být velice rozsáhlé, takže na následujícím obrázku je jen jeho začátek a konec.

report22
report23
  • Po stisknutí tlačítka Publikovat se otevře přehled všech tabulek, podle kterého je možné tyto tabulky používat v GraphQL dotazech v Sofa.

report24

Po klepnutí na tlačítko se třemi tečkami a spuštění příkazu Editovat tabulku je možné jednotlivé tabulky upravovat – například měnit jejich názvy pro GraphQL dotazy. V editaci tabulek je dále možno označit, že daný sloupec obsahuje identifikátor přílohy, se kterou je pak možné v GraphQL dále pracovat.

Adresy pro připojení k DB pro jednotlivá prostředí

Prostředí URL Název DB

TEST

presecudb.database.windows.net

testsofauserdata

PROD

sofa.database.windows.net

sofauserdata

Příklad nastavení SQL Management Studia pro prostředí DEV:

report25

Obecný tvar dotazu

Nejprve je nutné nastavit Hlavní dotaz. Dotaz má obecně mít následující tvar:

query ($page: Int = 1, $limit: Int = null, $order:[InvoicesOrderByExpr!] = null, $where:InvoicesBooleanExpr = null)
{
  invoicess(page:$page, limit:$limit, orderBy:$order, where:$where)
  {
    pageInfo
    {
      totalPages
      hasNextPage
      hasPreviousPage
    }
    edges
    {
      node
      {
        polozky_z_tabulky
      }
    }
        aggregate
    {
      count
    }
  }
}

Názvy proměnných musí odpovídat názvům tabulek. Správné tvary našeptává přímo nápověda v pravém bočním panelu, viz obrázek (v tomto případě se hlavní tabulka jmenuje invoices:

report26

Při zkoušení dotazu je dobré omezit si počet vrácených výsledků. To se provede nastavením hodnoty proměnné limit ve spodním panelu Proměnné pro test dotazu, např. tedy {"limit": 10} (stačí zadat složené závorky a uvnitř stisknout Ctrl+mezerník, editor začne našeptávat).

Nastavení reportu

Po vytvoření a otestování dotazu je možné nastavit vlastní report, tedy to co bude zobrazeno uživateli. Toto se provádí v levém panelu v položce "Popis hlavní tabulky". Zde je nutné přidat veškeré sloupce, které se mají uživateli v reportu zobrazit.

Zobrazují se zde pouze ty sloupce, které vrací GraphQL dotaz.

Je možné zde nastavit text zobrazený v záhlaví sloupce, šířky sloupců, pro datetime proměnné zobrazovaný tvar podle odkazu https://momentjs.com/docs/#/displaying/ a zobrazovaný tvar číselné proměnné podle odkazu http://numeraljs.com/#format.

Hodnoty z jiných tabulek napojených přes cizí klíč zatím nelze použít k filtrování.

Dále je možné nastavit sloupce použité pro rychlé vyhledávání v pravé horní části reportu. Pro rychlé vyhledávání lze využít jen sloupce typu string. Po nastavení je nutné report publikovat a nastavit mu dostupnost.

Při používání podtabulek je nutné po každé publikaci editor zavřít a znovu otevřít, jinak dojde k jejich duplikování.

Podtabulky

Report může obsahovat n podtabulek propojených s hlavní tabulkou pomocí cizích klíčů. Pro každou zobrazovanou podtabulku je nutné vytvořit GraphQL dotaz. Toto se provede v levém bočním panelu v položce "Popis podtabulky". Dotaz je velmi podobný hlavnímu dotazu, jen je nutné doplnit podmínku pro propojení s hlavní tabulkou. Obecný tvar:

query ($page: Int = 1, $limit: Int = null, $order:[Invoice_attachmentsOrderByExpr!] = null, $nazev_porovnavaci_promenne:Int) {
  invoice_attachmentss(page:$page, limit:$limit, orderBy:$order, where:{
    eqInt: {
      left:{
        col:NAZEV_SLOUPCE_S_ID_Z_HLAVNI_TABULKY
      },
      right:{
        const: $nazev_porovnavaci_promenne
      }
    }
  }) {
    edges {
      node {
        polozky_z_tabulky
      }
    }
    pageInfo
    {
      totalPages
      hasNextPage
      hasPreviousPage
    }
    aggregate
    {
      count
    }
  }
}

Zobrazení podtabulky vyžádáte přes levý boční panel a položku Popis podtabulky. U podtabulek není možné filtrovat.

Pro správnou funkčnost propojení je nutno nastavit proměnnou dotazu.

Název proměnné dotazu musí odpovídat názvu používaném v GraphQL dotazu a sloupec musí odpovídat sloupci s cizím klíčem, např.:

report27

Zobrazování záznamů podřízených

U reportů je možné zobrazované informace třídit pomocí poddotazů a JS funkcí. Příkladem může být např. zobrazování záznamů pouze přímých podřízených (+ aktuálně přihlášeného uživatele). V editoru reportů je nutno přidat poddotaz a hlavní JavaScriptovou funkci a použít vhodný dotaz a skript.

Poddotaz

query byId($id:String) {
  findUser(by: { id: $id }) {
    firstName
    lastName
    id
    subordinates {
      firstName
      lastName
      id
    }
  }
}

Hlavní JavaScriptová funkce

function main(summaryVariables) {
  // ziskame id aktualniho uzivatele
  const currentUserId = CurrentUser.User.GetValue('Id');

  // zavolame GQL dotaz pro ziskani seznamu podrizenych
  const queryVariables = { ...summaryVariables, id: currentUserId };
  const queryResult = GraphQL.Execute('byId', queryVariables);

  // JSON odpovedi
  const toJsonOptions = JSONConvert.CreateToJsonOptions();
  toJsonOptions.DetectRepeAction = false;
  toJsonOptions.WithJsonTypes = false;
  toJsonOptions.EmitRootObject = false;
  toJsonOptions.EmitArrayObject = false;
  const queryData = queryResult.EvaluatePathAsJson(null, toJsonOptions);

  // vytahneme podrizene
  const { data: { findUser: { subordinates } } } = queryData;
  // a sestavime podminku
  const subordinatesWhere = {
    inString: {
      expr: {
        // POZOR! zde musi byt nazev sloupce z hlavniho dotazu
        col: 'USER_ID'
      },
      values: [currentUserId, ...subordinates.map(su => su.id)]
    }
  };

  // sestavime novy where spojenim pripadneho puvodniho + podrizeni
  let where;
  let { where: originalWhere } = summaryVariables;
  if (originalWhere !== null && typeof originalWhere === 'object') {
    where = {
      and: [ originalWhere, subordinatesWhere ]
    };
  } else {
    where = subordinatesWhere
  }

  // nakonec rozsirime puvodni promenne
  const outVariables = {
    ...summaryVariables,
    where
  };

  Log.DbgLog(JSON.stringify(outVariables));
  return outVariables;
}

Komplexní příklad vytvoření reportu

Jako případ poslouží report pro zobrazování faktur. Každá zadaná faktura může mít n položek a m příloh. Příklad obsahuje čtyři tabulky:

  • Tabulka dodavatelů (1 dodavatel může být na n fakturách).

  • Tabulka faktur (faktura má 1 dodavatele, n příloh a m položek).

  • Tabulka položek (1 faktura má n položek).

  • Tabulka příloh (1 faktura má m příloh).

Příklad je možno doplnit o filtrování na podřízené, viz výše.

Vytvoření tabulek

Skripty lze spouštět přímo v SQL Management Studiu po kliknutí na New query a po vložení Execute.

Vytvoření tabulky dodavatelů

--DROP TABLE suppliers;

create table suppliers (
[id] [int] IDENTITY(1,1) NOT NULL,
[company_name] [nvarchar](max) NOT NULL,
[company_address] [nvarchar](max) NOT NULL,
[company_identification] [nvarchar](max) NOT NULL
PRIMARY KEY CLUSTERED (
        [id] ASC
) ON [PRIMARY])

insert into suppliers values ('Firma 1', 'Hornokrcska', '123456');
insert into suppliers values ('Firma 2', 'Dolnokrcska', '1234567');
insert into suppliers values ('Firma 3', 'Pravokrcska', '12345678');
insert into suppliers values ('Firma 4', 'Levokrcska', '123456789');

Vytvoření tabulky faktur

--DROP TABLE [invoices]
--GO

CREATE TABLE [invoices](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [text] [nvarchar](max) NOT NULL,
    [note] [nvarchar](max) NULL,
    [amount] [int] NOT NULL,
    [amount_decimal] [decimal](18, 2) NOT NULL,
    [date_received] [datetime] NOT NULL,
    [paid] [bit] NOT NULL,
    [supplier_id] [int] NULL,
 	 [user_id] [nvarchar](max) NOT NULL,
	 [user_name] [nvarchar](max) NOT NULL
     CONSTRAINT [pk_invoices] PRIMARY KEY CLUSTERED
    (
        [id] ASC
    ) ON [PRIMARY])

ALTER TABLE [invoices]  WITH CHECK ADD  CONSTRAINT [fk_invoice_supplier] FOREIGN KEY([supplier_id])
REFERENCES [suppliers] ([id])
ALTER TABLE [invoices] CHECK CONSTRAINT [fk_invoice_supplier]

Vytvoření tabulky příloh

--DROP TABLE [invoice_attachments]
--GO

CREATE TABLE [invoice_attachments](
	    [id] [int] IDENTITY(1,1) NOT NULL,
	    [attachment] [nvarchar](max) NOT NULL,
	    [invoice_id] [int] NOT NULL
     CONSTRAINT [pk_invoice_attachments] PRIMARY KEY CLUSTERED
    (
	    [id] ASC
    ) ON [PRIMARY])

ALTER TABLE [invoice_attachments]  WITH CHECK ADD CONSTRAINT [fk_attachment_invoice] FOREIGN KEY([invoice_id])
REFERENCES [invoices] ([id])
ALTER TABLE [invoice_attachments] CHECK CONSTRAINT [fk_attachment_invoice]

Vytvoření tabulky položek

--DROP TABLE [invoice_items]
--GO

CREATE TABLE [invoice_items](
	    [id] [int] IDENTITY(1,1) NOT NULL,
	    [item_name] [nvarchar](max) NOT NULL,
	    [item_value] [decimal](18, 2) NOT NULL,
	    [invoice_id] [int] NOT NULL
     CONSTRAINT [pk_invoice_items] PRIMARY KEY CLUSTERED
    (
	    [id] ASC
    ) ON [PRIMARY])

ALTER TABLE [invoice_items]  WITH CHECK ADD CONSTRAINT [fk_invoice_items] FOREIGN KEY([invoice_id])
REFERENCES [invoices] ([id])
ALTER TABLE [invoice_items] CHECK CONSTRAINT [fk_invoice_items]

Naplnění tabulek daty

Pozor, u tabulek faktur a příloh je nutné použít identifikátory z vlastní firmy a u náhodného vybírání upravit čísla podle rozsahu pole!

Naplnění tabulky faktur

DECLARE @i int = 0
DECLARE @zaznamy int
set @zaznamy = (select COUNT(*) from [invoices])

WHILE @i < 1000
BEGIN
    SET @i = @i + 1

    DECLARE @supp_id int
    SELECT @supp_id = Cast(RAND()*(4-1)+1 as int)

    DECLARE @amount int
    SELECT @amount = Cast(RAND()*(10001-1)+1 as int)

    DECLARE @amount_decimal decimal(18, 2)
    SELECT @amount_decimal = Cast((@amount + RAND())  as decimal(18, 2))

    DECLARE @paid bit
    SELECT @paid = Cast(ROUND(RAND(), 0) as bit)

    DECLARE @day int = Cast(RAND()*(29-1)+1 as int)
    DECLARE @month int = Cast(RAND()*(13-1)+1 as int)
    -- 2015 - 2020
    DECLARE @year int = Cast(RAND()*(2021-2015)+2015 as int)

    DECLARE @date_received datetime
    SELECT @date_received = CONCAT(@year, '-', @month, '-', @day, ' 00:00:00.000')

    -- zmenit ID uzivatelu a jmena uzivatelu, pro kazdou firmu unikatni! Je nutne zachovat spravne poradi ID a jmen a upravit hodnotu n pro pocet uzivatelu. Pro 5 uzivatelu by tedy bylo DECLARE @n int = Cast(RAND()*(6-1)+1 as int)
    DECLARE @n int = Cast(RAND()*(10-1)+1 as int)
    DECLARE @user_id nvarchar(max) = choose(@n, '98688029-fc7c-4e08-9ac2-ffe2e7c1b79b','1ee5d82a-5cc5-4a18-a058-2fb2f1121917','61cda2dd-11bf-4a3b-a0fa-e81a3b85cf37','42387e6f-8e96-4fe0-aa55-84ceda92ae3c','75d65294-4e0f-47ab-a252-cfce3d47f686','11092dbf-f678-4287-ac3d-a7290ac99b9c','932d019c-6546-4b58-849c-bd7ac9ef6f84','2411b897-2f59-448c-89a0-b9579265c44e','d3eb53f6-65ed-40a7-a5cc-bdcd7ac881bc')
    DECLARE @user_name nvarchar(max) = choose(@n, 'Eva Účetní','Marie Účetní','Petr Administrátor','Tomáš Ředitel','Jan Žadatel','Jana Účetní','Josef Jednorožec','Lukáš Jednorožec','Miroslav Jednorožec')

    INSERT INTO [invoices]
       ([text]
       ,[note]
       ,[supplier_id]
       ,[amount]
       ,[amount_decimal]
       ,[paid]
       ,[date_received]
       ,[user_id]
	   ,[user_name])
     VALUES
       (CONCAT('Faktura', @i)
       ,CONCAT('Moje faktura #', @i)
       ,@supp_id
       ,@amount
       ,@amount_decimal
       ,@paid
       ,@date_received
       ,@user_id
	   ,@user_name)
END
GO

Naplnění tabulky příloh

DECLARE @i int = 0
DECLARE @zaznamy int
set @zaznamy = (select COUNT(*) from [invoices])

WHILE @i < @zaznamy
BEGIN
    SET @i = @i + 1
-- zde musi byt detachidenty z dane firmy pro vlozene prilohy, lze zjistit z dat formulare kde je prilohove pole, hledejte detachident
	DECLARE @n int = Cast(RAND()*(5-1)+1 as int)
	DECLARE @priloha nvarchar(max) = choose(@n, 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzaWQiOiJkZWZhdWx0IiwiZmlkIjoiZTZmMmYwYmYtMzlkOS00YmYwLWE1MmQtMDAwMWZkZjY0MzQ2IiwiaXNzIjoiaHR0cHM6Ly9kZXZzb2ZhLjYwMi5jei8ifQ.aGOag0DQwnDKbnJP5JymXJbDUub0TIcj7OqWd_OpekQ','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzaWQiOiJkZWZhdWx0IiwiZmlkIjoiMDkzMGE5NGItNjc5NS00ZTdmLWI2NzQtNWM0OTIzZjk0OWU5IiwiaXNzIjoiaHR0cHM6Ly9kZXZzb2ZhLjYwMi5jei8ifQ.-vNJVTmDRoE-e2_i9n8FIHPNh2CTJKfQAVvWxYyNq-k','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzaWQiOiJkZWZhdWx0IiwiZmlkIjoiNjFlZWY2ZjMtYmZjMS00NDg0LTgwMjgtMGFkYzNiNDg3MzBkIiwiaXNzIjoiaHR0cHM6Ly9kZXZzb2ZhLjYwMi5jei8ifQ.8lJPOrIl21LVhYZQgqgfaa-mC8rjJk_m_Ys2Q6lq0wc','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzaWQiOiJkZWZhdWx0IiwiZmlkIjoiNmNhMjQxZjgtZDY2Mi00ZjNmLThiZmYtMWI0ZDU0YmI5N2ZjIiwiaXNzIjoiaHR0cHM6Ly9kZXZzb2ZhLjYwMi5jei8ifQ.xKrFVnX7phEgxSvDTN6BIVVv-vdy3ldkgdMl-Xh7qPI')

	DECLARE @inv_id int
    SELECT @inv_id = Cast(RAND()*(@zaznamy-1)+1 as int)

	INSERT INTO [invoice_attachments]
           ([attachment]
           ,[invoice_id])
     VALUES
           (@priloha,
		   @inv_id)

END
GO

Naplnění tabulky faktur

DECLARE @i int = 0
DECLARE @zaznamy int
set @zaznamy = (select COUNT(*) from [invoices])

WHILE @i < @zaznamy
BEGIN
    SET @i = @i + 1

    DECLARE @amount int
    SELECT @amount = Cast(RAND()*(10001-1)+1 as int)

    DECLARE @amount_decimal decimal(18, 2)
    SELECT @amount_decimal = Cast((@amount + RAND())  as decimal(18, 2))

	INSERT INTO [invoice_items]
           ([item_name]
           ,[item_value]
           ,[invoice_id])
    VALUES
           (NEWID(),
           @amount_decimal,
           @i)
END

SET @i = 0
WHILE @i < @zaznamy
BEGIN
    SET @i = @i + 1

	DECLARE @inv_id int
    SELECT @inv_id = Cast(RAND()*(@zaznamy-1)+1 as int)

    SELECT @amount = Cast(RAND()*(10001-1)+1 as int)

    SELECT @amount_decimal = Cast((@amount + RAND())  as decimal(18, 2))

	INSERT INTO [invoice_items]
           ([item_name]
           ,[item_value]
           ,[invoice_id])
    VALUES
           (NEWID(),
           @amount_decimal,
           @inv_id)
END

SET @i = 0
WHILE @i < 200
BEGIN
    SET @i = @i + 1

    SELECT @amount = Cast(RAND()*(10001-1)+1 as int)

    SELECT @amount_decimal = Cast((@amount + RAND())  as decimal(18, 2))

	INSERT INTO [invoice_items]
           ([item_name]
           ,[item_value]
           ,[invoice_id])
    VALUES
           (NEWID(),
           @amount_decimal,
           '1')
END
GO

Tvorba samotného reportu

Hlavní tabulka

GraphQL dotaz
query ($page: Int = 1, $limit: Int = null, $order:[InvoicesOrderByExpr!] = null, $where:InvoicesBooleanExpr = null)
{
  invoicess(page:$page, limit:$limit, orderBy:$order, where:$where)
  {
    pageInfo
    {
      totalPages
      hasNextPage
      hasPreviousPage
    }
    edges
    {
      node
      {
        invoiceId:id
        amount
        amount_decimal
        date_received
        note
        paid
        user_id
        user_name
        fk_invoice_supplier_Invoices
        {
          suppId:id
          company_name
          company_address
          company_identification
        }
      }
    }
        aggregate
    {
      count
    }
  }
}
Popis hlavní tabulky
report28

Podtabulka přílohy

GraphQL dotaz
query ($page: Int = 1, $limit: Int = null, $order:[Invoice_attachmentsOrderByExpr!] = null, $fakid:Int) {
  invoice_attachmentss(page:$page, limit:$limit, orderBy:$order, where:{
    eqInt: {
      left:{
        col:INVOICE_ID
      },
      right:{
        const: $fakid
      }
    }
  }) {
    edges {
      node {
        attachment
        {
          fileName
          downloadLink
          size
        }
      }
    }
    pageInfo
    {
      totalPages
      hasNextPage
      hasPreviousPage
    }
    aggregate
    {
      count
    }
  }
}
Popis podtabulky
report29

Podtabulka položky

GraphQL dotaz
query ($page: Int = 1, $limit: Int = null, $order:[Invoice_itemsOrderByExpr!] = null, $fakid:Int) {
  invoice_itemss(page:$page, limit:$limit, orderBy:$order, where:{
    eqInt: {
      left:{
        col:INVOICE_ID
      },
      right:{
        const: $fakid
      }
    }
  }) {
    edges {
      node {
        id
        invoice_id
        item_name
        item_value
      }
    }
    pageInfo
    {
      totalPages
      hasNextPage
      hasPreviousPage
    }
    aggregate
    {
      count
    }
  }
}
Popis podtabulky
report30