Assety

Definice assetu (JSON)

Vytvoření definice assetu se nachází v Technické → Definice assetu (role admin). Výběr organizace pro kterou se definice vytváří je pak součást toho portletu definice.

JSON obsahuje část s fixními atributy (name a number) a část s volitelnými atributy, viz ukázka níže.

Každý asset může automaticky mít fotografii. Nyní se nastavuje jako atribut s vlastností position jako primary_picture

Existující JSON je možné editovat za běhu.

Dostupné zákaznické jsony najdete v adresáři assets-json.

Ukázkový JSON

{
    "nameLabel": "Jméno psa", (1)
    "numberLabel": "Číslo zápisu", (2)
    "fontIcon": "fa fa-dog", (3)
    "name": "Pes", (4)
    "singular": "Pes", (4)
    "plural": "Psi", <4>,
    "attributes": [
        {
            "name": "Klubové číslo", (5)
            "type": "TEXT", (6)
            "title": "Klubové číslo psa", (8)
            "placeholder": "POZOR vyplňujte bez mezer!" (9)
        },
        {
            "name": "Datum narození", (5)
            "type": "DATE"  (6)
        },
        {
            "name": "Uchovněný", (5)
            "type": "SELECT",  (6)
            "options": [  (7)
                "-",
                "Ano",
                "Ne"
            ],
            "hiddenOptions":["-"], (15)
            "coloredOptions":[{
                "hex":"#FF0000",
                "options":["Ano"]
            }] (16)
        },
        {
            "name": "Matka", (5)
            "type": "RELATIONSHIP" (6)
        },
        {
            "name": "Otec", (5)
            "type": "RELATIONSHIP" (6)
        },
        {
            "name": "Zdraví",
            "type": "STRUCTURED", (6)
            "subAttributes": [ (12)
                {
                  "name": "Tlak",
                  "type": "TEXT"
                },
                {
                  "name": "Tep",
                  "type": "NUMBER"
                },
                {
                  "name": "Datum posledního očkování",
                  "type": "DATE"
                },
                {
                  "name": "Očkováný na",
                  "type": "SELECT_MULTI",
                  "options": ["Škytavka", "Pěnivka"]
                },
                {
                  "name": "Obecně zdravý",
                  "type": "BOOLEAN"
                },
                {
                  "name": "Společně očkován s",
                  "type": "RELATIONSHIP"
                }
          ]
            "hiddenAttributes":[]
        },
        {
            "name": "Historie očkování",
            "type": "REPEATED", (6)
            "repeatedAttribute": { (13)
                "type": "STRUCTURED",
                "subAttributes": [
                    {
                        "name": "Datum",
                        "type": "DATE"
                    },
                    {
                        "name": "Vakcína",
                        "type": "SELECT_MULTI",
                        "options": ["Covid","Vzteklina"]
                    }
                ]
            }
        },
        {
            "name": "Průkazy v PDF",
            "type":"FILE_ENTRIES" (6)
        },
        {
            "name": "Chovatelská stanice",
            "type":"MEMBER_REFERENCE" <6>,
            "memberSectionType": "PERSON"
        },
        {
              "name": "Fotografie",
              "type": "FILE_ENTRIES", (6)
              "position": "PRIMARY_PICTURE" (17)
        },
        {
              "name": "Počet zubů",
              "type": "INTEGER" (6)
        },
        {
              "name": "Výška",
              "type": "NUMBER", (6)
              "coloredOptions": [
                {
                "hex": "#ff0000",
                "options": [
                    "25.0:999.0"
                ]
                }
              ] (16)
        },
    ],
    "attributesConditionsInCards": [ (18)
        {
            "conditions": {
                "Jméno": "abc"
            },
            "alwaysAdded": true,
            "attributes": []
        },
    ],
    "attributesVisibleInCards" : [
        "visibleByActive": [],
        "visibleByNotActive": [],
        "visibleByRelatedMember": [],
        "visibleByQuest": []
    ], (14)
    "groups": [],  (10)
    "forms": { (11)
        "MS_ASSET_SYNC":[],
        "MS_MEMBER_DETAIL":[],
        "MS_ASSET_LIST_ADD":[],
        "CS_MEMBER_CARD_ADD":[],
        "MS_ASSET_DETAIL_EDIT"[
              {
                "name": "Vykoš",
                "fields": [
                  "Datum narození"
                ],
                "requiredFields": [],
                "conditions": {
                    "Datum narození":"0:1721109029000" (19)
                }
              }
            ],
        "CS_MEMBER_CARD_EDIT":[],
        "MS_ASSET_LIST_BULK_EDIT":[]
    }
}
1 Label pro popis textového atributu Name
2 Label pro popis textového atributu Number
3 Ikona - zobrazují se v některých dialozích
4 Názvy assetu - zobrazují se v některých dialozích nebo tlačítkách
5 Vlastnost name - label custom atributu
6 Vlastnost type- typ custom atributu
  • TEXT

  • NUMBER

  • SELECT

    • Výběr pouze jedné hodnoty

  • SELECT_MULTI

    • Výběr více hodnot

  • RELATIONSHIP

    • vazba na asset stejného druhu (atributy tohoto typu aktuálně nejsou dostupné v nastavení formulářů)

  • DATE

  • DATETIME

  • BOOLEAN

  • HTML_TEXT

    • Zobrazení textového editoru

  • STRUCTURED

  • REPEATED

  • FILE_ENTRIES

  • MEMBER_REFERENCE

    • Musí obsahovat memberSectionType

  • INTEGER - pro přirozené číslo

7 Vlastnost options - definice nabízených hodnot pro výběr v SELECT a SELECT_MULTI.
8 Vlastnost title - tooltip s rozšířenou informací. Nepoužije se u typu atributu RELATIONSHIP
9 Vlastnost placeholder - zástupný text, který se zobrazí v poli formuláře. Nepoužije se u typu atributu SELECT, SELECT_MULTI, RELATIONSHIP
10 Skupiny - rozdělení atributů do skupin
11 Formuláře - umístění atributů do formulářů
12 Typ STRUCTURED podporuje stejně definované typy v subAttributes jako na top level úrovni. Nepodporuje: strukturovaný ve strukturovaném, opakovaný uvnitř strukturovaného. Pozor opakovaný strukturovaný atribut podporován je.
  • může obsahovat hiddenAttributes, které v rámci ČS nebudou k dispozici k vyplnění

13 Typ REPEATED do repeatedAttribute se píše definice jako v top level úrovni, ale bez jména. Nepodporujeme: Opakovaný opakovaného.
14 Seznam názvů atributů, které se zobrazují v kartě assetu. Název a číslo se zobrazují vždy a nejde konfigurovat jejich pořadí. Pořadí závisí prvně na skupinách, následně na tomto seznamu. Seznamy se dělí do 4 typů:
  • visibleByQuest - pro hosta bez člena

  • visibleByNotActive - pro neaktivního člena

  • visibleByActive - pro aktivního člena

  • visibleByRelatedMember - pro člena se vztahem k assetu (například Majitel) (má přednost před členstvím)

15 Vlastnost hiddenOptions - definice hodnot, které se nezobrazí a tím způsobí skrytí i daného atributu v ČS|Kartě assetu a MS|Detail assetu. V rámci formulářů jsou hodnoty stále k dispozici. V rámci tabulek se daná hodnota nevykreslí. Tato vlastnost je u atributu nepovinná. Definováno u typů:
  • TEXT

  • SELECT

  • SELECT_MULTI

  • BOOLEAN

16 Vlastnost coloredOptions - definice pole takových hodnot, které jsou při vykreslení zabarveny. Skládá se ze seznamu hodnot options a barvy v hex kódu hex (nutný "#"). Tato vlastnost je u atributu nepovinná. Definováno u typů:
  • TEXT

  • SELECT

  • SELECT_MULTI

  • BOOLEAN

  • NUMBER - option se definuje jako interval "od:do"

  • INTEGER - option se definuje jako interval "od:do"

17 Vlastnost position - u typu FILE_ENTRIES definuje pozici fotky v ČS|Kartě assetu a MS|Detail assetu. Tato vlastnost je u typu FILE_ENTRIES nepovinná. Nabývá dvou hodnot:
  • PRIMARY_PICTURE - definuje hlavní fotku assetu (obdoba profilové fotografie)

  • SECONDARY_PICTURE - definuje vedlejší fotku assetu

18 attributesConditionsInCards Viditelnost atributů podle podmínky. Pokud daný asset splňuje podmíku, kombinují se vybrané atributy se seznamem viditelné na kartě assetu. Struktura se skládá z:
  • conditions - seznam atributů a hodnot (obdobně jako u filtru portletu Seznam assetů), které určují podmínku, kterou musí asset splnit.

  • alwaysAdded - udává při naplnění podmínek zda dochází k průniku nebo sjednocení.

  • attributes - seznam atributů které se mají zobrazit (nemusí být součástí seznamu conditions)

19 forms - "conditions" Viditelnost formuláře podle podmínky. Pokud daný asset splňuje podmínku, filtrují se seznamy formulářů. Týká se pouze formulářů pro editaci jednoho assetu (MS_MEMBER_DETAIL, MS_ASSET_DETAIL_EDIT, CS_MEMBER_CARD_EDIT) Struktura se skládá z:

Pokud je hodnota atributu prázdná (hodnota je "" nebo není vyplněna) tak se v ČS|Kartě assetu a MS|Detail assetu atribut nezobrazí. Ve formulářích jsou tyto atributy stále dostupné.

U typu FILE_ENTRIES s definovanou pozicí - se vždy vybírá první obrázek v hodnotách atributu (pokud soubor není správného typu (.jpg, .jpeg, .png, .gif), nic se nezobrazí)

Vlastnosti atributů required a editableByMember, byly použity v dřívější verzi, než byla implemetována definice formulářů. Tyto vlastnosti se ignorují, i když budou v definici uvedeny.

Minimální JSON

{
    "nameLabel": "Test",
    "numberLabel": "Test test",
    "fontIcon": "fa fa-help",
    "name": "Test",
    "singular": "Test",
    "plural": "Test",
    "attributes": [],
    "attributesVisibleInCards" : [],
    "groups": [],
    "forms": {}
}

Skupiny

Rozdělení atributů do skupin pro lepší přehlednost.

Atributy mimo skupiny se zobrazují na konci ve skupině "Ostatní"

"groups": [
    {
        "name": "Základní údaje",  (1)
        "attributeNames": [  (2)
            "Jméno psa",
            "Číslo zápisu",
            "Klubové číslo",
            "Datum narození",
            "Uchovněný"
        ],
        "collapsed": false (3)
    },
    {
        "name": "Rodiče",  (1)
        "attributeNames": [  (2)
            "Matka",
            "Otec"
        ],
        "collapsed": true (3)
    }
  ]
1 Vlastnost name - název skupiny
2 Vlastnost attributeNames - seznam jmen atributů, v jakém pořadí se ve skupině zobrazí
3 Vlastnost collapsed - určuje defaultní rozbalení skupiny v ČS|Karta assetu a MS|Detail assetu

Formuláře

Definice atributů v definovaných formulářich určených k editaci assetu. Pokud nebude atribut uveden, nebude ve formuláři zobrazen.

Seznam definovaných formulářů:
  • MS_ASSET_LIST_ADD - Nový asset ze Seznamu assetů v MS

  • MS_ASSET_LIST_BULK_EDIT - Hromadná editace assetů ze Seznamu assetů v MS

  • MS_ASSET_DETAIL_EDIT - Editace v Detailu assetu v MS a ze Seznamu assetů v MS

  • MS_MEMBER_DETAIL - Nový na záložce asseti v Detailu osoby v MS

  • CS_MEMBER_CARD_EDIT - Editace assetu na Kartě člena v ČS

  • CS_MEMBER_CARD_add - Nový asset v kartě člena v CS

Ve formuláři MS_ASSET_LIST_BULK_EDIT se neprojeví povinné položky, protože si vždy vybírají, kterou hodnotu chtějí hromadně změnit.

Každý atribut musí být použit alespoň v jednom formuláři, jinak pokus o uložení definice vyhodí chybu.

"forms": {
    "MS_MEMBER_DETAIL": [  (1)
        {
            "name": "Výchozí", (2)
            "fields": [  (3)
                "Jméno psa",
                "Číslo zápisu",
                "Klubové číslo",
                "Datum narození",
                "Uchovněný",
                "Matka",
                "Otec"
            ],
            "requiredFields": [  (4)
                "Jméno psa",
                "Číslo zápisu
            ]
        }
    ]
}
1 Název formuláře z definovaných formulářů
2 Vlastnost name - název zobrazení (zatím zobrazujeme jen první, ale bude doplňen výběr)
3 Vlastnost fields - seznam jmen atributů, které se mají ve formuláři zobrazit
4 Vlastnost requiredFields - seznam jmen atributů, budou ve formuláři povinné

seznam jen názvů assetů "$.attributes.*.name pomocí plug-in JSON path

Zpříštupnění assetů

Pokud je v organizaci definován asset (asset definice), automaticky se zpřístupní v :

  • Manažerské sekci:

    • v detailu osoby

    • v události - ve formuláři a seznamu účastníků

  • Členské sekci:

    • v kartě člena

Nastavení custom stránek s assety

Do Custom site v MS a ČS přidat novou stránku + portlet:

  • Seznam assetů - stránka pro ČS + portlet CRM Assets viewer - neumožňuje editaci

  • Správa assetů - stránka pro MS + portlet CRM Assets

  • Karta chovatelské stanice - Stránka pro ČS + portlet Karta chovatelské stanice

  • Karta chovatele - Stránka pro ČS určená pro ČMKU + portlet Karta chovatele

U atributu NUMBER a INTEGER je možné filtrovat pomocí matematických znamének =,⇐,>=,<,>, které se přípíšou před číslo (např.: "<9" - vyfiltruje záznami menší než 9)

Nastavit oprávnění na stránce i na portletu pro role, kterým se mají seznamy zobrazit.

Nastavení opravnění

Nastavení akcí vrámci oprávnění se definuje u role. Může být nastavena pro všechny sity nebo jen pro vybranou custom situ.

  • CRM Assets > Assety v manažerské sekci

    • Action.ADD - Možnost přidat assety na site

    • Action.EDIT (Upravit) - Možnost editovat assety na site

    • Action.SERVICES - Možnost definovat služby pro assety na site

  • CRM Assets Viewer > Assety v členské sekci

    • Action.ADD - Možnost přidat assety na site

    • Action.EDIT (Upravit) - Možnost editovat assety na site

    • Action.MY_BREEDS - Možnost zobrazit tlačítko Moje odchovy na site. Bude ZRUŠENO!

Tlačítko odkazuje natvrdo na stránku /moje-odchovy a musí se na site vytvořit. Bude ZRUŠENO!

Odchovy

Karta chovatelské stanice a Karta chovatele obsahují záložku Odchovy, která se definuje přes nastavení portletu stejným způsobem jako AssetViewer.

Pro zobrazení záložky Odchovy v detailu osoby je potřeba do Nastavení detailu osoby přidat záložku s klíčem crm-member-breedings. Na záložce Odchovy v detailu osoby pak může konfigurátor nastavit zobrazení assetů jako v AssetVieweru.

Některá nastavení z AssetViewru nebyla přenesena do MS z důvodu jejich špatné funkčnosti v MS.

Jak nastavit Kartu assetu

Jedná se o portlet CRM ASSET CARD. Je možné nastavit filtr pro assety, takový, že pokud asset podmínku nesplní tak se karta nezobrazí. Manažerovi a Uživatele se vztahem k assetu se karta zobrazí vždy.

Filtry

Jedná se o jednoduchý JSON. Zapisuje se {"Slopec": "Hodnota", …​}. Pokud se filtr nepoužije, načtou se všechny assety. Je to obdoba filtrů ze seznamu assetů

Medailonek

Pokud to organizace vyžaduje, je možné místo klasické karty psa pro nepřihlášeného uživatele zobrazit vytvořené extraHTML. Využito když je publikovaný portlet seznam assetů ale nechtějí aby nepřihlášený uživatel šel hlouběji do databáze psů.

Jak nastavit Seznam assetů pro čtení

Jedná se o portlet CRM ASSETS VIEWER. Nastavuje se zobrazení sloupců, které se na stránce budou zobrazovat. K seznamu se dá nastavit i filtr nebo setřídění.

Filtry

Jedná se o jednoduchý JSON. Zapisuje se {"Slopec": "Hodnota", …​}. Pokud se filtr nepoužije, načtou se všechny assety.

  • Základní sloupec - název se zobrazuje v zobrazení sloupců za znakem |. např. Jméno psa|name. Viz. Beagle Club.

  • Podle přihlášeného uživatele - Sloupec typu MEMBER_REFERENCE může obsahovat hodnotu $current_user.

  • Podle konkrétního membera - Sloupec typu MEMBER_REFERENCE může obsahovat hodnotu $current_member-{}. Pozn. Záměna {} za memberId musí být implementováno, např. u odchovů pro komkrétního membera.

  • Datum (DateRangeFilter) - je možné definovat jako JSONObject obsahující "from" a "to". K tomu je možné použít i dynamická pole:

    • $current_dat" - aktuální den

    • $minus_days - odečet dní od aktuálního dna. Zapisuje se jako "$minus_days:30"

Pokud se ve filtru vybírá hodnota, musí být zapsaná jako pole: "Barva": ["Tricolor", "Bicolor"]

U atributu NUMBER a INTEGER je možné filtrovat pomocí matematických znamének =,⇐,>=,<,>, které se přípíšou před číslo

(např.: "<9" - vyfiltruje záznami menší než 9)

Je možné nastavit negativní podmínku, pomocí speciální tokenu $is_not, která se zapíše do názvu sloupce.

např.: "$is_not:Barva": ["Tricolor", "Bicolor"] - vyfiltruje psi co NEMAJÍ barvu Tricolor nebo BiColor

Setřízení

Jedná se o jednoduchý JSON. Zapisuje se [{"field":"Sloupec","sortOrder":"ASCENDING/DESCENDING"}]. Pokud se setřízení nepoužije, načtou se assety tak, jak byly přídány.

Do třízení lze nastavit více sloupců najednou [{"field":"Datum narození", sortOrder":"DESCENDING"}, {"field":"name","sortOrder":"ASCENDING"}]

Vertikální zobrazení (reflow)

Zobrazí záznamy tabulky pod sebou.

Přejmenování sloupců

Výběrem možnosti lze přejmenovat zobrazené sloupce podle situace. Jedná se o přejmenování pro konktrétní umístěný portlet na stránce.

Přidání Extra HTML zobrazení

K assetu je možné nastavit HTML, které se zobrazí po rozbalení řádku:

  • portlety CRM Assets viewer a CRM Assets,

  • v členské kartě

  • v detailu osoby

Pro přidání je potřeba:

  1. Vytvořit/mít data provider Docgenu, který plní data pro šablonu (jedná se o kus groovy skriptu, viz. níže)

  2. Vytvořit šablonu v Docgenu (typicky pro konkrétní organizaci, typu HTML)

    1. Název šablony musí odpovídat názvu zobrazení

    2. Soubor šablony nastavit s typem FTL

    3. Spojit s data providerem

  3. Nastavit klíč šablony do settingu extra-asset-detail-html (tím se jednoznačně určí že tato organizace bude používat pro generování předanou šablonu)

Zobrazení může být i více, oddělené v settingu znakem |.

Nastavení zobrazovaných atributů:

Každý data provider obsahuje třídu Settings, ve které lze nastavit odlišné chování pro různé organizace. Třída Settings obsahuje proměnou organizationName, která odpovídá aktuálnímu názvu prohlížené organizace. Pomocí této proměnné lze za využití podmínek v funkcích třídy Settings nastavit chování jednotlivých atributů pro každou organizaci zvlášť. Defaultně je nastaveno nezobrazování extra atributů.

Funkce třídy Settings: název funkce (typ : [extraHTML ve kde je použito])

  • getShowLifeStatus (BOOLEAN : [Potenciální rodokmen]): definuje zobrazení ikony pro úmrtí

  • getIsAlive (BOOLEAN : [Rodokmen,Potomci,Sourozenci,Potenciální rodokmen,Potenciální potomci): definuje podmínku pro rozhodnutí, zda je asset živý, nebo mrtvý

  • getExtraAttr (BOOLEAN : [Potomci,Sourozenci,Potenciální rodokmen, Potenciální potomci): definuje zobrazení extra atributu

  • getExtraAttrName (List<String> : [Potomci,Sourozenci,Potenciální rodokmen,Potenciální potomci): definuje hlavičky extra atributů v tabulce

  • getExtraAssetAttrName (List<String> : [Rodokmen,Potomci,Sourozenci,Potenciální rodokmen,Potenciální potomci): definuje názvy extra atributů v assetu, který se má zobrazit

  • renderDescendants (BOOLEAN : [Potenciální rodokmen,Potenciální potomci): definuje zda pod potenticonální rodokmen zobrazit tabulku, která obsahuje potomky vybraných assetů

  • getOneRowAttrName (List<String> : [Potenciální rodokmen): definuje atributy, které se v potenticonálním rodokmenu zobrazí na jeden řadek

  • getShowAge (BOOLEAN : [Potenciální rodokmen): definuje zda zobrazit věk vybraných assetů pro potenticonální rodokmen

  • getChovatelAttr (String : [Kontakty): definuje název atributy Chovatel v konkrétní definici assetu

  • getChovatelAttrName (String : [Kontakty): definuje zobrazený název pro kontakt Chovatel

  • getOwnerAttrName (String : [Kontakty): definuje zobrazený název pro kontakt Majitel

  • getEmptyMsg (String : [Kontakty): definuje text, který se zobrazí, pokud neexistují žádná data k zobrazení

Funkce getExtraAttrName a getExtraAssetAttrName obsahují seznamy do kterých lze přidat více prvků. Každý prvek odpovídá jednomu extra atributu, který se zobrazí v tabulce.

Rodokmen

Jedná se o HTML zobrazení složené z šablony, kde figuruje:

Sourozenci a potomci

Sourozenci

Potomci

Rodokmen s obrázky se sourozenci a potomky

Potenciální rodokmen

Potenciální potomci

Kontakty

V docgenu je portřeba nastavit označení šablony hodnotu otherAsset, aby se zobrazil výběr assetu, vůči kterému se má rodokment vygenretovat.

Definice vztahu osoba-asset

V LOV existuje číselník MEMBER_ASSET_TYPE. Je možné mít i organizační hodnoty.

Importy

Nachází se v pravé části definice assetu

Import assetů

Pojmy číslo, number, numberLabel všechny vyjádřují atribut, který jsme zvolili jako identifikační číslo assetu (např. "Číslo zápisu").

Analogicky jméno, name, nameLabel (např. "Jméno psa").

Obecné
  • Importuje se z CSV. Standardní formát oddělovač čárka, UTF8 encoding.

  • CSV musí obsahovat první řádek s hlavičkou

  • Hlavička musí mýt buď názvy atributů nebo hodnoty ${numberLabel} a ${nameLabel}

  • ${numberLabel} sloupec je povinný

  • Pokud číslo asset v DB existuje, budou se atributy aktualizovat

  • Nastaví se pouze atributy, které jsou v importním souboru (pro nové i pro aktualizaci)

  • soubor nemusí obsahovat všechny atributy z JSONu (tzv. částečný, chybějící atributy budou prázdné)

  • soubor nesmí obsahovat extra pole (atributy, které nejsou definované v JSONu)

  • pokud soubor obsahuje duplicity dle čísla, tak se import neprovede a potřeba import opravit

Typy atributů
  • SELECT_MULTI - jednotlivé hodnoty jsou odděleny podtržítkem (např. "4 - otevřená srst_5 - mírně zvlněná")

  • NUMBER - formátované česky

  • BOOLEAN - podporuji "true", "t", "y", "on", "1" jako pravdivé hodnoty

  • DATE - formátované česky (tip pro Excel - pokud nejde formát data změnit, tak dej pryč hodiny :D)

  • FILE_ENTRIES: Importuje se pomocí UUID nahraného souboru neboj json pole uuid nahraných souborů

  • MEMBER_REFERENCE - hodnota musí být členské číslo osoby, pokud neexistuje import proběhne, ale vypíše to od logu

84d29525-e9b7-41a0-aece-291a22312b0a je uuid které by se dalo do importního souboru

  • STRUCTURED

    • dvě možnosti:

      1. ve sloupcích

        • pro jeden sub atribut jeden sloupec (nejsou všechny povinné)

        • např. Tlak ve strukturovaném Zdraví importuji pomocí hlavičky sloupce Zdraví|Tlak

      2. pomocí Json Objektu (opět se nemusí definovat celý strukturovaný atribut)

    • pro hodnoty ať už v json objektu nebo ve sloupcích se používají pravidla pro sub typy, které jsou zmíněné výše

    • příklad:

{"Tlak": "100,5", "Datum narození": "11.11.2000"}
  • REPEATED

    • ve sloupci musí být json pole a hodnoty jsou typu string, hodnota je jako opakovaný typ

    • příklad pro typ DATETIME

["11.11.2000 11:12", "11.11.2001 11:12"]
  • pro structured zde neplatí import po jednotlivých sloupcích, musí se importovat pomocí json objektu. Př.:

[
  {"Datum závodu": "11.11.2000", "Čas uběhnutí": "11,7"},
  {"Datum závodu": "11.11.2005", "Čas uběhnutí": "10,7"}
]

Ve výsledeném csv to bude divně vypadat s dvojitými uvozovkami, to je v pořádku, CSV editor to vyřeší za vás

"[
  {
    ""Datum závodu"": ""11.11.2022 11.10"",
    ""Vedoucí"": ""Jarda"",
    ""Vyhrál"": ""1"",
    ""Ve dvojici s "": ""K00024"",
    ""Handicap"": ""Pomalý_Krátké nohy""
  },
  {
    ""Datum závodu"": ""11.11.2022 15.10"",
    ""Vedoucí"": ""Láďa"",
    ""Vyhrál"": ""0""
  }
]"
Jak provést update záznamů
  • update se provádí dle existujícího čísla (numberlabel)

  • když asset již existuje, tak se aktualizují pouze zmíněné atributy v souboru

  • číslo nesmí být prázdné

Jak provést přejmenování attributu
# Přejmenování atributu
# Stačí dodat parametry :newName a :oldName (jen název), :assetDefinitionId

-- parametry
\set oldName 'Fotografie'
\set newName 'Profilová fotografie'
\set assetDefinitionId 123

# Kontrola
SELECT attributesinjson =
        jsonb_set(
            a.attributesinjson::jsonb,
            ARRAY[:newName],
            a.attributesinjson::jsonb -> :oldName
        ) - :oldName
FROM PI_CRM_Asset a
WHERE a.assetdefinitionid = :assetDefinitionId
  AND a.attributesinjson::jsonb ? :oldName;

# samotný update
UPDATE pi_crm_asset a
SET attributesinjson =
        jsonb_set(
            a.attributesinjson::jsonb,
            ARRAY[:newName],
            a.attributesinjson::jsonb -> :oldName
        ) - :oldName
WHERE a.assetdefinitionid = :assetDefinitionId
  AND a.attributesinjson::jsonb ? :oldName;
Jak provést transformaci jednoduchého attributu do strukturovaného atributu
# Transformace jednoduchého attributu do strukturovaného atributu
# Stačí dodat parametry :newName a :oldName (jen název), :assetDefinitionId

SET @oldName = '';
SET @newName = '';
SET @assetDefinitionId = 0;

# Kontrola
SELECT JSON_SET(
           CAST(a.attributesInJson AS JSON), CONCAT('$."', @oldName, '"'),
           JSON_OBJECT(@newName, JSON_EXTRACT(
               CAST(a.attributesInJson AS JSON), CONCAT('$."', @oldName, '"'))
           )
       )
FROM PI_CRM_Asset a
WHERE a.assetDefinitionId = @assetDefinitionId
  AND JSON_EXTRACT(CAST(a.attributesInJson AS JSON), CONCAT('$."', @oldName, '"')) IS NOT NULL;

# samotný update
UPDATE PI_CRM_Asset a
SET a.attributesInJson = JSON_SET(
       CAST(a.attributesInJson AS JSON), CONCAT('$."', @oldName, '"'),
       JSON_OBJECT(@newName, JSON_EXTRACT(
           CAST(a.attributesInJson AS JSON), CONCAT('$."', @oldName, '"'))
       )
    )
WHERE a.assetDefinitionId = @assetDefinitionId
  AND JSON_EXTRACT(CAST(a.attributesInJson AS JSON), CONCAT('$."', @oldName, '"')) IS NOT NULL;
Jak změnit hodnotu při změně typu z BOOLEAN na SELECT
# Změna hodnoty při změně typu z BOOLEAN na SELECT
# Stačí dodat parametry :name (jen název) a :oldValue a :newValue, :assetDefinitionId

SET @name = '';
SET @oldValue = '';
SET @newValue = '';
SET @assetDefinitionId = 0;

# Kontrola
SELECT JSON_REPLACE(CAST(a.attributesInJson AS JSON), CONCAT('$."', @name, '"'), @newValue)
FROM PI_CRM_Asset a
WHERE a.assetDefinitionId = @assetDefinitionId
  AND JSON_EXTRACT(CAST(a.attributesInJson AS JSON), CONCAT('$."', @name, '"')) like @oldValue;

# samotný update
UPDATE PI_CRM_Asset a
SET a.attributesInJson = JSON_REPLACE(CAST(a.attributesInJson AS JSON), CONCAT('$."', @name, '"'), @newValue)
WHERE a.assetDefinitionId = @assetDefinitionId
  AND JSON_EXTRACT(CAST(a.attributesInJson AS JSON), CONCAT('$."', @name, '"')) like @oldValue;
Jak provést smazání attributu
# Smazání atributu
# Stačí dodat parametry :name (jen název), :assetDefinitionId

SET @name = '';
SET @assetDefinitionId = 0;

# Kontrola
SELECT JSON_REMOVE(
    CAST(a.attributesInJson AS JSON),
    CONCAT('$."', @name, '"') )
FROM PI_CRM_Asset a
WHERE a.assetDefinitionId = @assetDefinitionId
  AND JSON_EXTRACT(CAST(a.attributesInJson AS JSON), CONCAT('$."', @name, '"')) IS NOT NULL;

# samotný update
UPDATE PI_CRM_Asset a
SET a.attributesInJson = JSON_REMOVE(
         CAST(a.attributesInJson AS JSON),
    CONCAT('$."', @name, '"') )
WHERE a.assetDefinitionId = @assetDefinitionId
  AND JSON_EXTRACT(CAST(a.attributesInJson AS JSON), CONCAT('$."', @name, '"')) IS NOT NULL;
Jak provést přejmenování hodnoty u atributu
# Přejmenování hodnoty atributu
# Stačí dodat parametry :attributeName (jen název) a :oldValue a :newValue, :assetDefinitionId

SET @attributeName = '""';
SET @oldOption = '""'; #Může být i číslo '0' | Json pole '{"X":"Y"}'
SET @newOption = '""'; #Může být i číslo '0' | Json pole '{"X":"Y"}'
SET @assetDefinitionId = 0;

UPDATE PI_CRM_Asset a
SET a.attributesInJson =
        JSON_UNQUOTE(JSON_REPLACE(a.attributesInJson, CONCAT('$.', @attributeName), @newOption))
WHERE a.assetDefinitionId = @assetDefinitionId
  AND JSON_UNQUOTE(JSON_EXTRACT(a.attributesInJson, CONCAT('$.', @attributeName))) = @oldOption;
Jak provézt kontrolu duplicity nad assety
TRUNCATE pi_crm_assetduplicity;

UPDATE counter
SET currentid = 0
WHERE name = 'cz.vrk.pi.crm.model.model.AssetDuplicity';

INSERT INTO PI_CRM_AssetDuplicity(id_, asset1, asset2, duplicityLevel, assetdefinitionid, byattributes)
SELECT row_number() over (order by a.id_), a.id_, a2.id_, 'WEAK', a.assetdefinitionid, pca.numberlabel
FROM PI_CRM_Asset a
     JOIN PI_CRM_Asset a2 ON a.number_ = a2.number_
    AND a.id_ <> a2.id_
    AND a.assetDefinitionId = a2.assetDefinitionId
     JOIN pi_crm_assetdefinition pca on a.assetdefinitionid = pca.id_
WHERE a.number_ != '' and a.id_ < a2.id_
GROUP BY a.id_, a2.id_, pca.numberlabel
HAVING (SELECT COUNT(*)
        FROM pi_crm_asset a2
        WHERE a.assetDefinitionId = a2.assetDefinitionId
          and a.number_ = a2.number_ and a.id_ < a2.id_) > 2;

UPDATE counter
SET currentid = (SELECT MAX(id_) FROM pi_crm_assetduplicity)
WHERE name = 'cz.vrk.pi.crm.model.model.AssetDuplicity';

UPDATE pi_crm_assetduplicity ad
SET duplicityLevel = 'STRONG',
    byattributes   = (SELECT concat(concat(pca.numberlabel, ', '), pca.namelabel)
                      FROM pi_crm_assetdefinition pca
                      WHERE ad.assetdefinitionid = pca.id_)
WHERE id_ in (SELECT ad.id_
              FROM pi_crm_assetduplicity ad
                   JOIN PI_CRM_Asset a1 ON ad.asset1 = a1.id_
                   JOIN PI_CRM_Asset a2 ON ad.asset2 = a2.id_
              WHERE a1.name = a2.name);
Jak provézt přehození ImportId z DB na Číslo zápisu
SET @newName = 'Číslo zápisu';
SET @assetDefinitionId = 0;

#Kontrola
SELECT JSON_UNQUOTE(JSON_EXTRACT(CAST(a.attributesInJson AS JSON), CONCAT('$."', @newName, '"'))), a.*
FROM PI_CRM_Asset a
WHERE a.assetDefinitionId = @assetDefinitionId

#Nastavení hodnoty těm co mají vyplněno
UPDATE PI_CRM_Asset a
SET a.number_ = JSON_UNQUOTE(JSON_EXTRACT(CAST(a.attributesInJson AS JSON), CONCAT('$."', @newName, '"')))
WHERE a.assetDefinitionId = @assetDefinitionId
  AND JSON_EXTRACT(CAST(a.attributesInJson AS JSON), CONCAT('$."', @newName, '"')) IS NOT NULL;

#Vynulování hodnoty, těm co nemají vyplněno
UPDATE PI_CRM_Asset a
SET a.number_ = ''
WHERE a.assetDefinitionId = @assetDefinitionId
  AND JSON_EXTRACT(CAST(a.attributesInJson AS JSON), CONCAT('$."', @newName, '"')) IS NULL;
Jak se importují vztahy mezi assety
  • hodnota pro RELATIONSHIP je z NumberLabel vztaženého assetu (např. Otec = 1143)

  • takový asset buď už je v DB nebo bude obsažen v právě importovaném souboru

  • pokud vztažený asset neexistuje, vyplní se vztah že je prázdný, ale import proběhne

  • pokud vztažený asset existuje vícekrát (= duplicita), tak to skončí chybou (asi :D)

Import vztahů s osobou (= Plátce)

Importní soubor je klasické .csv které obsahuje členské číslo, číslo assetu, datum vytvoření a libovolně služby.

Vzorové csv

  • člen - číslo člena (povinné)

  • asset - číslo assetu (povinné)

  • vytvořeno - datum vytovření vztahu (povinné)

  • typ - typ vztahu z LOVu MEMBER_ASSET_TYPE (povinné)

  • služby - názvy služeb (oddělovač více služeb je _)

člen,asset,vytvořeno,typ,služby
243,6,01.02.2020 15:10,OWNER,
243,7,01.02.2020 15:10,OWNER,Krmení_Čištění na sucho
245,8,01.02.2020 15:10,OWNER,
147,9,01.02.2020 15:10,OWNER,Krmení_Čištění na sucho
50,10,01.02.2020 15:10,OWNER,