Přehledové formuláře

Přehledové formuláře jsou zamýšleny spíše pro potřebu vedoucích pracovníků nebo účetních. Jejich pomocí by například mohli obecně sledovat požadavky zadané pomocí procesních formulářů v prostředí Sofa a vytvářet jejich statistické přehledy.

Okno Správa přehledů otevřete v okně Administrace klepnutím na tlačítko Správa přehledů. Okno je ve výchozím stavu prázdné. Hotový přehledový formulář můžete do Sofa importovat ze souboru nebo jej vytvořit jako zcela nový pomocí návrháře.

p1

Vytvoření nového přehledového formuláře

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

p2

V okně Nový přehled nastavte vlastnosti nového přehledu.

  • V sekci Popisné údaje uveďte český a anglický název a také slovní popis, k čemu má přehled sloužit.

  • V sekci Nastavení zapište do pole Priorita řazení číslo udávající, s jakou prioritou bude položka přehledu uváděna v pohledu na přehledové formuláře.

  • 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 přehled 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 agendy. 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.

  • Od verze Sofa 5.0 lze také zvolit barevné schéma zobrazení tzv. dlaždic – velkoplošných tlačítek pro spouštění přehledů v okně Dashboard nebo v pohledu Zadat okna Agendy.

p3

Návrhář přehledu

Tlačítkem Navrhnout přehled přejdete přímo z okna Nový přehled do okna návrháře přehledů.

p4

Obsluha Návrháře přehledu je popsána v kapitole Prostředí návrháře přehledu.

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

Import přehledového formuláře

Předpokladem je, že máte k dispozici soubor, ve kterém je uložen hotový přehledový formulář.

Postupujte takto:

  1. Klepněte na tlačítko Akce.

  2. V rozvinuté nabídce spusťte příkaz Importovat přehled.

p5
  1. V dialogu Import přehledu vyhledejte pomocí tlačítka Procházet v poli Soubor s exportovaným přehledem soubor s přehledovým formulářem. Soubor musí mít koncovku S602.

p6
  1. Chcete-li exportovaný přehled načíst do jiného přehledu, vyhledejte ho voličem Naimportovat do.

  2. Stiskněte tlačítko Importovat přehled.

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

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

p7

Tlačítkem Uložit otevřete Návrhář přehledů, kde můžete vzhled přehledu podle potřeby upravit.

Správa přehledových formulářů

Položky vytvořených i importovaných přehledů jsou zobrazeny v okně Správa přehledů.

p8

Nastavení dostupnosti přehledu

Ve výchozím stavu není vytvořený přehledový formulář nikomu dostupný. Dostupnost je tedy nutné nastavit. V položce přehledu klepněte na tlačítko se třemi tečkami a potom na příkaz Nastavit oprávnění přehledu.

p9

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

p10

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

p11

Poté volbu uložte. Nastavení se promítnou do sloupce Dostupnost přehledu v okně Správa přehledů.

p12

Takto nastavený přehledový formulář nadále budou mít příslušní uživatelé k dispozici v pohledu Přehledy okna Agendy.

Úpravy přehledového formuláře

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 přehledového formuláře. Zastoupení příkazů může být u některých formulářů odlišné podle jejich dostupnosti.

p13
  • Upravit popis – otevře okno Úprava přehledu pro úpravy popisných údajů přehledu.

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

  • Smazat přehled – vymaže přehledový formulář ze seznamu.

  • Exportovat přehled – exportuje údaje o přehledu do nastaveného souboru.

  • Vytvořit kopii přehledu – vloží do přehledů nový přehled, který bude přesnou kopií předmětu, 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í přehledu – umožňuje spravovat dostupnost přehledu podle skupin a rolí.

Prostředí Návrháře přehledu

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

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 přehledu: podle kterých sloupců bude možné filtrovat, podle kterých sloupců lze rychle vyhledávat, šířky sloupců a pro čísla a datumy nastavovat zobrazovanou masku.

V přehledu 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.

p14

GraphQL dotazy pro vytváření přehledů

Přehledy jsou v Sofa od verze 4 realizovány přímo nad databází pomocí GraphQL dotazů. Aby v přehledu 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 Přehledy.

Příprava databáze

Aby bylo možné pracovat s přehledy, 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.

p15

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 Přidat nový datový zdroj.

V okně Datový zdroj je předem nastaveno několik parametrů bez možnosti jejich úprav. Jedná se o:

  • Typ datového zdroje – což je Sofa databáze.

  • Databázové schéma – systém generuje automaticky.

  • 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 musí obsahovat písmena, číslice a speciální znaky.

p16

V tuto chvíli je možné se přihlásit do databáze s loginem uvedeným v položce 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.

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

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

p19
  • 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.

p20

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:

p21

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 screenshot (v tomto případě se hlavní tabulka jmenuje invoices:

p22

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í přehledu

Po vytvoření a otestování dotazu je možné nastavit samotný přehled, 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 přehledu zobrazit. Pozor, zobrazují se zde pouze 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 přehledu. Pro rychlé vyhledávání lze využít jen sloupce typu string. Po nastavení je nutné přehled 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 duplikování podtabulek.

Podtabulky

Přehled 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
    }
  }
}

Samotné zobrazení podtabulky se opět provede 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ř.:

p23

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

U přehledů 4.0 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 přehledů je nutno přidat poddotaz a hlavní JavaScriptovou funkci a použít dotaz a skript, který napsal Kuba (oboje funguje univerzálně).

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í přehledu

Jako případ poslouží přehled 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 přehledu

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
p24

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
p25

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
p26