Interný messaging - ABRA správy a automatické generovanie správ
V kap. Interný messaging, e-mailová komunikácia a naplánované úlohy bol popísaný vnútorný systém odovzdávania správ - tzv. interný messaging, s tým, že vznikajú tzv. ABRA správy a odoslané a doručené e-maily. Na tomto mieste popíšeme podrobnejšie pravidlá práce s ABRA správami a princíp generovania automatických správ na základe splnenia nejakej udalosti špecifikovanej kontrolným bodom (viď ďalej).

Ďalej je uvedené:

Ako bolo spomenuté už v kap. Interný messaging, e-mailová komunikácia a naplánované úlohy, správy môžu vznikať rôznymi spôsobmi ručne či automaticky. Viď tiež možnosti vytvorenia novej správy. Ako adresát nech je zadaný napr. užívateľ (napr. "JOOM-Jozef Omáčka"), rola (napr. "Obchodníci") a externá e-mailová adresa (napr. bobo@email.sk). V okamihu, keď je správa zadaná a uložená, vygeneruje sa sada pomocných záznamov o správach určených na prečítanie s odkazom na práve uloženú správu a to pre užívateľa JOOM a pre všetkých užívateľov s rolou "Obchodníci" (napr. užívatelia Obchodník1 a Obchodník2). Zároveň sa vygeneruje záznam do agendy Odoslané e-maily s adresátom bobo@email.sk.
Či bude e-mail v agende Odoslané e-maily vytvorený na základe správy (s adresátom typu "e-mail") v stave "Na odoslanie" alebo či bude rovno hneď aj odoslaný, závisí od toho, odkiaľ a ako daná správa vznikla. Viď možnosti vytvorenia novej správy a viď možnosti odoslania e-mailov.
Každý užívateľ ABRA Gen tak môže v agende Správy vidieť:
- správy, které odoslal, ako zoznam všetkých existujúcich záznamov odoslaných správ filtrovaný za užívateľa - odosielateľa (seba samého)
- správy, ktoré má prečítať, ako zoznam všetkých existujúcich záznamov správ na čítanie filtrovaný za užívateľa - adresáta
Medzi záznamom odoslanej správy a záznamami správ na čítanie je jednoznačná väzba, ktorá umožňuje k odoslanej správe sledovať stav prečítania tejto správy všetkými adresátmi.
Pri tvorbe záznamov správ na čítanie sa kontroluje duplicita. Tzn. ak je užívateľ súčasne vo viacerých rolách alebo je súčasne ako adresát vymenovaný i menovite, záznam sa pre neho vygeneruje len jeden.

Keď príde nová správa:
- V tray oblasti sa objaví ikonka novej správy
. Je na ňu možné dvakrát poklikať (dvojitým kliknutím myšou) a skočiť tak hneď do agendy Správy.
- Na dobu niekoľkých sekúnd sa objaví i okno s informáciou, že prišla nová správa. V okne je možné kliknúť na odkaz "Správy" a skočiť tak hneď do agendy Správy:
Príklad zobrazeného okna s informáciou o nových doručených správach, počte zatiaľ neprečítaných správ, vrátane informácie o mene užívateľa a názve spojenia na databázu
Okno sa defaultne zobrazuje cca 10s. Predĺženie doby zobrazenia je možné nastaviť v konfiguračnom súbore Nexus.cfgv sekcii [Client] v parametri ABRAMsgNewInfoDisplayTime. Pokiaľ si užívateľ okno nevšimne, stále mu zostáva ikonka v tray oblasti, ktorá má podobnú funkčnosť.
Viac viď kap. Konfiguračný súbor Nexus.cfg - oddiely a parametre.
- Ak pri spustení ABRA Gen existujú neprečítané správy pre aktuálne prihláseného užívateľa, ABRA Gen o tom zobrazí okno s informáciou, podobne ako v predchádzajúcom prípade.

Možnosti označenia doručenej správy ako prečítanej:
- automaticky, keď si užívateľ-adresát na danej správe zobrazí záložku Detail
- automaticky, ak stojí kurzor v zozname správ na danej správe cca 3s (dané z programu, nie je možné užívateľsky nastavovať) a v agende je začiarknuté Automatické označovanie
- ručne pomocou funkcie Označiť správy
Stav prečítania je viditeľný v záložke Detail, subzáložke Stav. V zozname správ sú tie neprečítané graficky zvýraznené (viď Správy - záložka Zoznam). Keď je doručená správa označená u adresáta ako prečítaná, premietne sa táto informácia spätne i do subzáložky Stav danej odoslanej správy Odosielateľ sa teda môže informovať, či si adresát správu už prečítal.
Vyššie uvedené neplatí pre správy adresované na externé e-mailové adresy, kde nie je možné zabezpečiť spätnú informáciu o prečítaní.

Aby se databáza zbytočne nezahlcovala už starými a vybavenými správami a mazanie správ bolo pritom riadené, je možné na správe nastaviť príznak po zmazaní všetkými adresátmi zmazať. Ten spôsobí, že v okamihu, keď správu zmažú všetci adresáti, správa sa automaticky vymaže (a to ako samotná odoslaná správa, tak všetky záznamy správ na čítanie, ktoré z nej vyplynuli). Užívateľ môže správy, ktoré boli doručené jemu, mazať bez obmedzenia. (Keď adresát doručenú správu zmaže, záznam tejto správy na čítanie sa označí príznakom Zmazané, ale fyzicky sa vymaže až naraz spolu s mazaním zdrojovej odoslanej správy). Správy na externé e-mailové adresy sa z agendy Odoslané e-maily už nezmažú, ale budú odoslané.
Odoslanú správu je možné zmazať i ručne. Správu môže ručne zmazať len ten, kto danú správu vytvoril (odosielateľ správy) - čo vyplýva automaticky už z toho, že len jemu sa zobrazí v odoslaných správach. Viď strom správ a "zafiltrovanie" zobrazených odoslaných správ len za prihláseného užívateľa. Keď užívateľ odoslanú správu vymaže, správa sa odstráni zároveň i všetkým užívateľom z doručených správ bez ohľadu na to, či ju už prečítali, alebo nie (toto zmazanie je nevratné).
Obmedzenie automatického mazania: Ak bola medzi adresátmi správy externá e-mailová adresa, automatické zmazanie sa neuplatní, pretože nie je možné zabezpečiť, aby sa systém dozvedel, či a kedy si užívateľ daný e-mail, ktorý vznikol zo správy na externú e-mailovú adresu, prečítal.

Ďalšou možnosťou, ako riadiť množstvo správ, ktoré sa zobrazuje užívateľovi, je nastavenie časovej platnosti správy v položke Platnosť do. Správy, ktorých platnosť vypršala, adresát už neuvidí, a po zatvorení a znovuotvorení agendy sa automaticky zmažú (bez ohľadu na stav prečítania všetkými adresátmi). Objasníme na príklade:
Správca pošle všetkým užívateľom správu "Do desiatich minút opustite systém, prebehne údržba databázy" a pretože vie, že údržba bude trvať asi 2 hodiny, nastaví správe časovú platnosť 2 hodiny. Užívatelia, ktorí sú v systéme, správu dostanú a prečítajú si ju. Tí, ktorí ale v systéme v tejto dobe nie sú a prihlásia sa napríklad až na ďalší deň, túto správu už v doručených správach mať nebudú, pretože správa bude mať prešlú dobu platnosti. Nebudú teda touto správou zbytočne otravovaní. Správca systému vo svojej agende správ túto správu uvidí i po dvoch hodinách. Akonáhle však agendu Správ zavrie a opäť otvorí, správu už neuvidí, pretože správa sa automaticky vymaže (a to ako samotná odoslaná správa, tak všetky záznamy správ na čítanie, ktoré z nej vyplynuli).

Správy v elektronickej komunikácii môžu mať prílohy. Vo všeobecnosti môže byť prílohou čokoľvek (typicky však súbor - binárne dáta). ABRA Gen ale navyše umožňuje zadávať extra prílohy, ktoré umožňujú správu zviazať:
- s odkazmi na ABRA doklady
- s odkazmi na objekty agend systému ABRA (napr. firma z Adresára)
- s klasickým odkazom na web (url)
- s odkazmi na naplánované úlohy
Tieto odkazy majú tú výhodu, že užívateľ, pre ktorého je správa určená, si môže priamo zo správy daný odkaz prehliadnuť, tzn. napr. jednoduchým kliknutím na odkaz na doklad otvoriť príslušnú dokladovú agendu a daný doklad a objekt v nej zobraziť.
Možnosti vloženia odkazov:
- Ručne - odkazy na doklad, objekt a www adresu - Vloženie tohto odkazu sa vykoná pomocou funkcie Vložiť odkaz v editácii správy.
Odkaz na doklad nie je možné zadať pre všetky typy dokladov, ale iba na niektoré. Rovnako i zoznam agend, na ktorých objekt je možné vytvoriť odkaz, je obmedzený na agendy, pre ktoré to má význam. Ďalej viď Sprievodca vytvorením prílohy, odkaz na doklad.
- Automaticky - odkazy na doklad - Vloženie odkazu na doklad sa vykoná i automaticky a to v prípade, že ide o správu generovanú automaticky na základe definície automatickej správy typu ID (čo je jedna z možností vytvorenia novej správy). Viď tiež Generovanie automatických správ.
- Automaticky - odkazy na naplán. úlohy - Vloženie tohto odkazu na napl. úlohu prebehne automaticky v prípade, že ide o správu generovanú automaticky v rámci vykonania naplánovanej úlohy (čo je jedna z možností vytvorenia novej správy). Ručne ho vložiť nie je možné. Viď tiež Generovanie automatických správ. Po kliknutí na odkaz funkcia vyvolá agendu Naplánované úlohy a otvorí ju "cez" agendu Správy. Tu sú k dispozícii všetky funkcie danej agendy. Takto odtiaľ vyvolaná agenda sa otvorí priamo s prednastaveným obmedzením, tzv. červeným obmedzením, obmedzená za naplánovanú úlohu, ktorá odoslanie správy spôsobila. Toto červené obmedzenie však môžete v záložke Obmedzenie vyvolanej agendy štandardne zrušiť (vyčistiť) a získať záznamy na základe ľubovoľného iného obmedzenia, prípadne úplne bez obmedzenia (a mať tak k dispozícii zoznam všetkých existujúcich záznamov daného typu a pod.).
Objasníme na príkladoch:
Príklad 1: Je teda možné vygenerovať automatickú správu "Faktúra FV-1250/2008 bola práve zaplatená", pričom kliknutím na odkaz s číslom dokladu sa otvorí agenda faktúr vydaných a spomenutá faktúra sa v nej zobrazí.
Príklad 2: Užívateľovi XY pošleme správu "Prosím, skontroluj navrhované ceny v ponuke NV-198/2008". Adresátovi sa kliknutím na číslo NV otvorí agenda Ponúk a daná NV sa v nej zobrazí.
Príklad 3: V definícii naplánovaných úloh má užívateľ nastavené, že sa mu má po dokončení úlohy poslať správa v prípade, že dôjde pri spracovávaní úlohy k chybe. Keď mu takáto správa príde, môže si rýchlym kliknutím na odkaz ihneď zobraziť, o ktorú úlohu ide a skontrolovať ju.

Pre doručené správy si užívateľ môže nastaviť presmerovanie (kópia alebo presun) doručených správ na zadanú externú e-mailovú adresu (defaultne na e-mailovú adresu prihláseného užívateľa). Užívateľ si tak môže nastaviť počas doby svojej plánovanej neprítomnosti, aby doručené správy mohol čítať vzdialene prostredníctvom e-mailu.
Presmerovanie sa uskutoční hneď, ako odosielateľ uloží novú správu. V danom okamihu prebieha generovanie záznamov "správ na čítanie", ako bolo spomenuté vyššie. Pokiaľ v danom okamihu bude pre niektorého užívateľa nastavené platné presmerovanie, tak sa uskutoční, tzn. podľa nastavenia presmerovania sa buď vytvorí kópia danej správy ako ďalší záznam správy na čítanie a externú e-mailovú adresu alebo sa daná správa priamo prepošle na externú e-mailovú adresu (tzn. samotný záznam správy na čítanie na pôvodneho užívateľa sa v tomto prípade označí interne rovno ako zmazaný). Zároveň sa vygeneruje záznam do agendy Odoslané e-maily.
Presmerovanie sa nastavuje priamo v agende Presmerovanie správ.
Presmerovanie správ na externé e-mailové adresy zatiaľ nie je k dispozícii. Z tohto dôvodu ani táto agenda nie je zatiaľ užívateľovi k dispozícii. Pripravuje sa do niektorej z budúcich verzií.

Ďalej je uvedené:

Generovanie automatických správ zabezpečuje automatizačný server. Automatizačný server generuje požiadavky v rámci spustenia naplánovanej úlohytypu Automatické správy, ktorá je pre tento účel určená. Automatické správy generuje podľa interného "zoznamu požiadaviek". Tento zoznam požiadaviek vzniká nasledovne:
Definovanie jednotlivých kontrolných bodov v systému ABRA Gen a implementácia v skriptovaní
Na konkrétne miesta systému ABRA je možné rozmiestniť tzv. kontrolné body (WatchDogPoints), typicky do miesta pred okamihom "uloženie business objektu" (napr. uloženie faktúry). Kontrolný bod zabezpečuje "sledovanie" daného miesta programu. Ak sa stane to, čo sa "sleduje" (tzn. napr. dôjde práve k uloženiu daného business objektu, tzn. program prejde daným kontrolným bodom), môže sa vygenerovať "požiadavka na správu". Či sa tak stane a či na základe tejto požiadavky vznikne neskôr konkrétna správa, závisí od toho, či k danému kontrolnému bodu existuje definícia automatických správ a ako je nadefinovaná, viď ďalej. Je potrebné brať do úvahy aj to, že kontrolný bod, ktorý bol presunutý do skrytých (tzn. vymazaný s možnosťou obnovenia) nemá naďalej na generovanie správ vplyv.
Kontrolné body sa evidujú a zadávajú v agende Kontrolné body. Môže ísť o systémové kontrolné body dodávané výrobcom alebo o užívateľské. V kontrolnom bode sa o. i. udáva zoznam agend, v ktorých sa má kontrolný bod zaregistrovať. "Sledovanie" určitého miesta užívateľským kontrolným bodom sa implementuje pomocou skriptovania. Implementáciou sa myslí to, že každý užívateľský kontrolný bod má jednoznačnú väzbu na zodpovedajúci balíček skriptov rovnakého mena, ako bolo zadané v sekcii Konfigurácia skriptovania v definícii kontrolného bodu, pričom v tomto balíčku je jednak dané, kde v programe budú kontrolné body umiestnené a aké miesto programu sa tým pádom bude "sledovať" (typicky do miesta pred okamih "uloženie business objektu", ale môžu byť aj v inej metóde) a ďalej, aké možnosti sa budú užívateľovi ponúkať v nástroji na tvorbu definícií automatických správ z daných agend. Samotný zoznam agend zadaných v definícii kontrolného bodu je vlastne definíciou toho, kde a ako sa vytvorí užívateľom nástroj (funkcia Autom. správy) na tvorbu definícií autom. správ a ako sa vygeneruje šablóna pre balíček skriptov, viď ďalej.
Balíček skriptov naviazaný na kontrolný bod teda obsahuje:
- skripty druhu Business objekt pre Business objekty, ktoré zodpovedajú agendám uvedeným v zozname agend v definícii kontrolného bodu. Tieto skripty musia obsahovať metódu CFxWDRHelper.CheckWatchDog. (Tzn. musí byť zaregistrovaný WatchDogPoint v danej agende).
- skript druhu Knižnica rovnakého mena, ako bolo zadané v sekcii Konfigurácia skriptovania v definícii aktuálneho kontrolného bodu. Ten obsahuje metódy, pomocou ktorých je možné implementovať funkcionalitu, ktorá sa následne bude ponúkať v Sprievodcovi tvorbou definície automatickej správy vyvolanom z funkcie Autom. správy. Ide o nasledujúce metódy (sú dané pevne z programu):
- GetHelperCaption
- GetHelperDescription
- GetWDPInternalName
- IsConditionHelper
- GetRequestDescription
- GetRequestCondition
- GetRequestSubject
- GetRequestMessage
- CreateWizardFrame
- ValidateWizardFrame
- GetValuesFromControls
Význam metód viď Praktické príklady, predovšetkým Príklad 3 - užívateľský kontrolný bod, výrazová definícia autom. správy.
Vyššie uvedené si je možné nechať vytvoriť automaticky a to funkciou Generovať knižnicu z agendy Kontrolného bodu (tzn. vytvorí sa šablóna knižnice (metódy je samozrejme potrebné doimplementovať) a podľa agend zadaných v definícii kontrolného bodu sa vytvoria skripty druhu Business objekt a umiestni sa do nich funkcia CFxWDRHelper.CheckWatchDog).
Je potrebné, aby tu boli skripty druhu Business objekt (nie druhu Agenda). Inak by sa požiadavky na správy generovali, len ak by došlo k uloženiu sledovaného objektu prostredníctvom agendy. Napr. ak by došlo k uloženiu dodacieho listu v agende dodacích listov. Ak by sa však dodací list uložil vďaka uloženiu faktúry so skladovými riadkami, správa by sa negenerovala. Správa by sa tiež negenerovala ani v prípade, že by sa dodací list ukladal z OLE, alebo zo skriptovania. Z tohto dôvodu musí byť vyvolávanie metódy s generovaním správy "zavesené" na business objekt.
Príklad skriptu knižnice:
Príklad časti skriptu knižnice vygenerovaného automaticky k zadanému kontrolnému bodu
Procedúra CheckWatchDog a príklad skriptu pre agendu:
Ponuka procedúry CheckWatchDog v Class explorere v skriptovaní
Ukážka jednoduchej implementácie operácie, ktorá zaháčikuje kontrolný bod pred uloženie dokladu v agende Faktúry vydané.
Definícia automatických správ a požiadavky na správy:
K jednotlivým kontrolným bodom je možné následne nadefinovať Definície automatických správ.
Typy definícií - Definície sú dvojakého typu:
- ID-čkové - odkazuje sa na konkrétne ID sledovaného objektu (napr. na jeden konkrétny doklad), vloží do správy odkaz na daný doklad, viď Špeciálne odkazy na ABRA doklady, objekty agend systému ABRA, www adresy a naplánované úlohy
- Výrazové - je daná nejaká podmienka výrazom (napr. "suma faktúry je väčšia ako ...").
Definície autom. správ určujú, "čo sa má poslať" (predmet a text správy), "komu" (zoznam adresátov) a ďalej za akých podmienok (ID zodpovedá ukladanému dokladu alebo je splnená podmienka zadaná vo výraze) sa má poslať správa, ak nastane to, čo sa sleduje kontrolným bodom, tzn. program prejde kontrolným bodom. Ak pre kontrolný bod existuje definícia autom. správy pre nejakú agendu, tak sa pri každom prechode programu kontrolným bodom, napr. pri uložení sledovaného objektu v danej agende (napr. uložení faktúry) vygeneruje do pomocnej internej tabuľky čosi ako "požiadavka na správy" s údajmi potrebnými pre vyhodnotenie podmienky zadanej v definícii autom. správy.
Keď potom automatizačný server spustí naplánovanú úlohu typu Automatické správy, prejde záznamy v tejto tabuľke, vyhodnotí, či je podmienka v definícii autom. správy splnená a ak áno, zabezpečí vygenerovanie príslušnej správy.

- Je potrebné zabezpečiť chod automatizačného servera, viď Čo je potrebné na prevádzku e-mailov a interných správ.
- Musí byť zadaná aspoň jedna Naplánovaná úlohatypu Automatické správy - interval spúšťania by mal byť rozumne krátky (aby správy "chodili" adresátom včas).
- Musí existovať Kontrolný bod(y) (WatchDogPoints) pre miesta, ktoré chce užívateľ sledovať. Užívateľ môže využiť dodávané systémové kontrolné body alebo si môže nadefinovať vlastné užívateľské a implementovať požadovanú funkcionalitu v skriptovaní, viď vyššie.
- Musia existovať Definície automatických správ pre dané kontrolné body a príslušné agendy.

Posielané správy generované podľa kontrolných bodov nemusia mať predmet a text zadané úplne napevno, ale je do nich možné vkladať tzv. makrá. Tzn. môžu obsahovať interaktívne hodnoty. Viac viď popis položiek Predmet a Text správy v definícii automatickej správy
Ďalej sú uvedené praktické príklady:

Príklad: Nech obchodník vystavil faktúru a chce byť informovaný o tom, že dôjde k jej zaplateniu, aby potom mohol s klientom dohadovať ďalšie kroky a pod.
Na tomto príklade si demonštrujeme použitie systémového kontrolného bodu Zaplatenie dokladu a vytvorenie definície automatickej správy typu ID podľa neho.
Detail kontrolného bodu Zaplatenie dokladu. Tento bod nemá žiadnu väzbu na skriptovanie (nie je potrebná, funkcionalita je daná v dodávanom programe) ani nemá zadané agendy, pre ktoré má platiť (nie je to potrebné, opäť je to dané programom a platí pre všetky, kde je možné doklady platiť).
Nadefinujeme si novú definíciu automatickej správy pre tento kontrolný bod. To je možné najjednoduchšie takto:
- Otvoríme agendu faktúr vydaných a vyhľadáme sledovanú faktúru. Nech je to napr. FV-8/2009. Postavíme kurzor na ňu.
- Vyvoláme funkciu Autom. správy. Vyvolá sa Sprievodca tvorbou definície automatickej správy.
- V 1. kroku sprievodcu v položke Kontrolný bod vyberieme "Zaplatenie dokladu". V položke Typ sprievodcu vyberieme voľbu "Zmena zaplatenia dokladu":
Zadanie hodnôt v 1. kroku sprievodcu. ABRA vzhľad modrý.
- V ďalšom kroku zadáme adresátov.
- Tento typ sprievodcu už ďalšie kroky nemá, po stlačení Dokončiť sa uloží nová definícia autom. správy do agendy Definícia automatických správ podobná nasledujúcemu obrázku:
Detail definície automatickej správy. Údaje sa predvyplnili automaticky jednak textami danými výrobcom (keďže ide o systémový kontrolný bod) a jednak číslom a ID dokladu, pre ktorý sme funkciu vyvolali. Ako adresát bude uvedený prihlásený užívateľ. Ak by ste chceli definíciu zmeniť (napr. pridať ďalších adresátov, môžete to urobiť priamo v agende Definícia automatických správ.
- Otvoríme agendu Naplánované úlohy a zadáme novú úlohu typu Automatické správy s intervalom spúšťania napr. každých 5 minút:
Príklad definície naplánovanej úlohy.
- Zabezpečíme nastavenie a spustenie Automatizačného servera. Viď Čo je potrebné na prevádzku e-mailov a interných správ.
Teraz bude platiť: Akonáhle dôjde k zmene v zaplatení sledovanej faktúry, zaznamená sa interne požiadavka na generovanie autom. správy. V okamihu, keď automatizačný server spustí úlohu typu Automatické správy, tak tí, ktorí sú uvedení medzi adresátmi vyššie vytvorenej definície autom. správy, dostanú správu s predmetom a textom podľa tejto definície.

Príklad: Nech užívateľ chce byť informovaný, že dôjde k zaplateniu faktúry vystavenej na firmu ABC (s firmou boli v minulosti problémy a užívateľ chce byť informovaný o prebiehajúcich platbách dokladov, ktoré na ňu boli vystavené).
Na tomto príklade si demonštrujeme využitie systémového kontrolného bodu Zaplatenie dokladu i pre výrazovú definíciu automatickej správy.
Nadefinujeme si novú definíciu automatickej správy pre tento kontrolný bod. To je možné najjednoduchšie takto:
- Otvoríme agendu faktúr vydaných. (Teraz nebudeme definovať definíciu typu ID (ako v príklade 1), takže je jedno, na ktorý záznam postavíme kurzor.)
- Vyvoláme funkciu Autom. správy. Vyvolá sa Sprievodca tvorbou definície automatickej správy.
- V 1. kroku sprievodcu v položke Kontrolný bod vyberieme "Zaplatenie dokladu" rovnako ako v príklade 1. V položke Typ sprievodcu ale vyberieme voľbu "Výraz".
- V ďalšom kroku zadáme adresátov.
- Tento typ sprievodcu má ďalší krok, kde zadáme požadované údaje.
Zadanie hodnôt v 2. kroku sprievodcu
- Po stlačení Dokončiť sa uloží nová definícia autom. správy do agendy Definícia automatických správ podobná nasledujúcemu obrázku:
Detail definície automatickej správy. Údaje sa predvyplnili automaticky textami zadanými v sprievodcovi. Na rozdiel od príkladu 1 tu ide o podmienky typu výraz. Ak by ste chceli definíciu zmeniť (napr. pridať ďalších adresátov, môžete to urobiť priamo v agende Definícia automatických správ.
- Ďalej musí existovať naplánovaná úloha a musí byť sprevádzkovaný automatizačný server, ako v príklade 1.
Teraz bude platiť: Akonáhle dôjde k zmene v zaplatení nejakej faktúry, zaznamená sa interne požiadavka na generovanie autom. správy. V okamihu, keď automatizačný server spustí úlohu typu Automatické správy, vyhodnotí sa podmienka (tzn. či daná faktúra bola vystavená na firmu, ktorej ID bolo uvedené vo výraze). Ak je podmienka splnená, tak tí, ktorí sú uvedení medzi adresátmi vyššie vytvorenej definície autom. správy, dostanú správu s predmetom a textom podľa tejto definície.

Príklad: Užívateľ chce byť upozornený, keď dôjde k prijatiu vybraného tovaru.
Tu je potrebné najskôr zadať užívateľský kontrolný bod a pomocou skriptovania zabezpečiť umiestnenie (zaháčikovanie) kontrolného bodu do sledovanej agendy. Prijatie tovaru mení stavy na business objekte Čiastková skladová karta. Na príklade budeme demonštrovať, že kontrolný bod je možné nastaviť aj do inej agendy (Skladové karty), ako z ktorej je sledovaný objekt (Čiastkové skladové karty). Ďalej tu budeme demonštrovať, ako sa dá pomocou skriptovania knižnice naprogramovať nový typ sprievodcu pre tento kontrolný bod a jeho správanie (v našom príklade bude slúžiť na výber skladu).
Predpoklady príkladu:
- Musí existovať kontrolný bod, napr. s názvom "Prijatie tovaruí". Musí mať interný názov (napr. WD5B2FMTMIB41CGVTMY4Z0HYXW) zhodný s interným názvom uvedeným v balíčku skriptov s rovnakým menom, ako je zadané v konfigurácii skriptovania (napr. GoodsReceive) v definícii kontrolného bodu a tento balíček musí obsahovať knižnicu s rovnakým menom, ako je meno knižnice v konfigurácii skirptovania (napr. tiež GoodsReceive). Kontrolný bod je definovaný k agende Skladové karty, tzn. v zozname agend je uvedená agenda Skladové karty.
- Existuje balíček skriptov s názvom GoodsReceive a knižnicou GoodsReceive. Ďalej obsahuje skript pre Business objekt Čiastková skladová karta na "zaháčikovanie" kontrolného bodu. Balíček musí byť skompilovaný a musí mať nastavené Používať. (Balíček skriptov bude vytvorený ku kontrolnému bodu "Prijatie tovaru" funkciou Vygenerovať knižnicu. Predvyplnená šablóna skriptu bude následne doplnená).
Postup:
- Otvoríme agendu Kontrolné body a zadáme nový kontrolný bod s názvom "Prijatie tovaru". Interný názov nech je napr. WD5B2FMTMIB41CGVTMY4Z0HYXW. V konfigurácii skriptovania zadáme názov balíčka skriptov, napr. GoodsReceive a názov knižnice GoodsReceive. V zozname jeho agend vyberieme agendu Skladové karty a uložíme.
Detail definície kontrolného bodu.
- Vytvoríme zodpovedajúci balíček skriptov. To sa dá najjednoduchšie pomocou funkcie Generovať knižnicu. Vygenerovaná šablóna obsahuje predvyplnené metódy uvedené vyššie, viď Metódy skriptu Knižnica. Väčšina z nich je prázdna, len GetHelperCaption, GetHelperDescriotion a GetWDPInternalName sú predvyplnené podľa údajov kontrolného bodu. Môže vyzerať napr. takto:
Tento príklad zodpovedá len verzii 9.02 a vo vyšších verziách sa môže líšiť. Tu slúži len na ilustratívne účely.
function GetHelperCaption(const SiteForm: TSiteForm): String; begin // Helper name in wizard form Result := 'Prijatie tovaru'; end; function GetHelperDescription(const SiteForm: TSiteForm): String; begin // Helper description in wizard form Result := 'Sledovanie prijatia tovaru'; end; function GetWDPInternalName(const SiteForm: TSiteForm): String; begin // Should return WatchDogPoint InternalName (packed GUID) // or Null packed GUID) Result := 'O1Q25DAREN3OHBMZPNMYQE3VV0'; end; function IsConditionHelper(const SiteForm: TSiteForm): Boolean; begin // Return True, if helper use expression. // Return False, if helper use business object ID. Result := True; end; function GetRequestDescription(const SiteForm: TSiteForm; const ObjId: String; Params: TNxParameters): String; begin // Should return short description about expression. // ObjId param is business object ID. // Params param contain values stored in GetValuesFromControls() function. Result := ''; end; function GetRequestCondition(const SiteForm: TSiteForm; const ObjId: String; Params: TNxParameters): String; begin // if IsConditionHelper return False, return empty string. // if IsConditionHelper return True, return expression. // ObjId param is business object ID. // Params param contain values stored in GetValuesFromControls() function. Result := ''; end;
- Otvoríme agendu Balíčky skriptov a doplníme knižnicu GoodsReceive. Balíček skompilujeme a nastavíme mu Používať. V tomto príklade boli napr. upravené popisy v metódach GetHelperCaption a GetHelperDescription, ďalej bol zadaný druhý krok sprievodcu, kde užívateľ môže zvoliť sklad, na ktorom chce prijatie sledovať, a ďalej boli doplnené texty, ktoré sa použijú na predvyplnenie názvu definície, predmetu a textu správy.
Úpravy tu uskutočnené sa spätne nepremietnu do definície kontrolného bodu. V každom prípade musí zodpovedať interný názov kontrolného bodu tomu, ktorý je uvedený v skripte v metóde GetWDPInternalName.
Tento príklad zodpovedá len verzii 9.02 a vo vyšších verziách sa môže líšiť. Tu slúži len na ilustratívne účely.
var StoreCardCode, StoreCardName, StoreCode, StoreName : String; const rSUBJECT = 'Naskladnenie tovaru'; // RequestSubject rMESSAGE = 'Skladové zásoby boli rozšírené.' + #13#10 + '%DISPLAYNAME%'; // RequestMessage function GetHelperCaption(const SiteForm: TSiteForm): String; begin // Helper name in wizard form Result := 'Prijatie tovaru - sprievodca'; // Názov ponúkaný ako Typ sprievodcu end; function GetHelperDescription(const SiteForm: TSiteForm): String; begin // Helper description in wizard form Result := 'Pošle správu, keď dôjde k naskladneniu tovaru'; // Popis daného Typu sprievodcu end; function GetWDPInternalName(const SiteForm: TSiteForm): String; begin // Should return WatchDogPoint InternalName (packed GUID) // or Null packed GUID) Result := 'WD5B2FMTMIB41CGVTMY4Z0HYXW'; // Interný názov zviazaného kontrolného bodu WD5B2FMTMIB41CGVTMY4Z0HYXW end; function IsConditionHelper(const SiteForm: TSiteForm): Boolean; begin // Return True, if helper use expression. // Return False, if helper use business object ID. Result := True; // Nastavenie, že ide o definíciu typu Výraz end; function GetRequestDescription(const SiteForm: TSiteForm; const ObjId: String;// Generovanie názvu pre definíciu autom. správy Params: TNxParameters): String; begin // Should return short description about expression. // ObjId param is business object ID. // Params param contain values stored in GetValuesFromControls() function. Result := 'Definícia užívateľa:' + NxGetUserName + ' [' + FormatDateTime('YYYYMMDD HH:MM',Now) + ']'; end; function GetRequestCondition(const SiteForm: TSiteForm; const ObjId: String; Params: TNxParameters): String; Var mParamItem1, mParamItem2: TNxParameter; begin // if IsConditionHelper return False, return empty string. // if IsConditionHelper return True, return expression. // ObjId param is business object ID. // Params param contain values stored in GetValuesFromControls() function. mParamItem1 := Params.GetOrCreateParam(dtString,'StoreID',pkInputOutput); mParamItem2 := Params.GetOrCreateParam(dtString,'StoreCardID',pkInputOutput); Result := '(NEW.Quantity > OLD.Quantity) And'; Result := Result + '(NEW.Store_ID = ' + QuotedStr(mParamItem1.AsString) + ') And '; Result := Result + '(NEW.StoreCard_ID = ' + QuotedStr(mParamItem2.AsString) + ')'; end; function GetRequestSubject(const SiteForm: TSiteForm; const ObjId: String; // Generovanie predmetu správy pre definíciu autom. správy Params: TNxParameters): String; begin // Define message subject which will be sent to user // ObjId param is business object ID. // Params param contain values stored in GetValuesFromControls() function. Result := rSUBJECT; Result := Result + ' [ ' + StoreCardName + ' na ' +StoreName + ' ]' end; function GetRequestMessage(const SiteForm: TSiteForm; const ObjId: String;// Generovanie textu názvu pre definíciu autom. správy Params: TNxParameters): String; begin // Define message body which will be sent to user // ObjId param is business object ID. // Params param contain values stored in GetValuesFromControls() function. Result := rMESSAGE; Result := Result + #13#10 + 'Skladová karta: ' + StoreCardCode + ' - ' + StoreCardName; Result := Result + #13#10 + 'Sklad: ' + StoreCode + ' - ' + StoreName; end; function CreateWizardFrame(const SiteForm: TSiteForm; const Panel: TPanel): Boolean;// Vytvorenie kroku sprievodcu var mCombo: TComboBox; mListbox: TListBox; mLabel1, mLabel2: TLabel; OS: TNxCustomObjectSpace; BO: TNxCustomBusinessObject; mResult: TStringList; ii : Integer; begin // Create controls and place them to Panel // Return True if any control created. // Return False if no control created. OS:= SiteForm.BaseObjectSpace; BO:= TBusRollSiteForm(SiteForm).CurrentObject; StoreCardCode := BO.GetFieldValueAsString('Code'); StoreCardName := BO.GetFieldValueAsString('Name'); mLabel1 := TLabel.Create(SiteForm); mLabel1.Top := 40; mLabel1.Left := 50; mLabel1.Width := 300; mLabel1.Height := 15; mLabel1.Caption := 'Pre skladovú kartu: '; mLabel1.Caption := mLabel1.Caption + StoreCardCode + ' - ' + StoreCardName; mLabel1.Visible := True; mLabel1.Parent := Panel; mLabel2 := TLabel.Create(SiteForm); mLabel2.Top := 70; mLabel2.Left := 50; mLabel2.Width := 300; mLabel2.Height := 15; mLabel2.Caption := 'Pre sklad: '; mLabel2.Visible := True; mLabel2.Parent := Panel; mCombo := TComboBox.Create(SiteForm); mCombo.Top := 70; mCombo.Left := 150; mCombo.Width := 300; mCombo.Height := 15; mCombo.Text := 'Sklad'; mCombo.Visible := True; mCombo.Enabled := True; mCombo.Parent := Panel; mCombo.Name := 'mCombo'; mListBox := TListBox.Create(SiteForm); mListBox.Top := 0; mListBox.Left := 0; mListBox.Width := 300; mListBox.Height := 30; mListBox.Visible := False; mListBox.Enabled := True; mListBox.Parent := Panel; mListBox.Name := 'mListBox'; mResult:= TStringList.Create; OS.SQLSelect('Select ID, Code || '+QuotedStr(' - ')+' || Name From Stores', mResult); mCombo.Clear; mListBox.Clear; For ii := 0 To mResult.Count -1 Do begin mCombo.AddItem(copy(mResult.Strings[ii],13,Length(mResult.Strings[ii])-13),nil); mListBox.AddItem(copy(mResult.Strings[ii],1,10),nil); end; mCombo.ItemIndex := 0; Result := True; OS.free; BO.Free; mResult.free; end; function ValidateWizardFrame(const SiteForm: TSiteForm; const Panel: TPanel): Boolean; begin // Check control's values. // Return True if user fill the controls properly. // Return False if any control has an invalid value. Result := True; end; procedure GetValuesFromControls(const SiteForm: TSiteForm; const Panel: TPanel; Params: TNxParameters); var mCombo1: TComboBox; mListbox1: TListBox; mParamItem1,mParamItem2: TNxParameter; BOStore, BOCard: TNxCustomBusinessObject; OS: TNxCustomObjectSpace; begin // Get control's values and store them into Params. BOCard := TBusRollSiteForm(SiteForm).CurrentObject; mListBox1 := TListBox(NxFindChildControl(Panel, 'mListBox')); mCombo1 := TComboBox(NxFindChildControl(Panel, 'mCombo')); mParamItem1 := Params.GetOrCreateParam(dtString,'StoreID',pkInputOutput); mParamItem1.AsString := mListBox1.Items.Strings[mCombo1.ItemIndex]; mParamItem2 := Params.GetOrCreateParam(dtString,'StoreCardID',pkInputOutput); mParamItem2.AsString := BOCard.GetFieldValueAsString('ID'); OS := SiteForm.BaseObjectSpace; BOStore := OS.CreateObject('SFMSB5W15BDL3CL100C4RHECN0'); BOStore.Load(mListBox1.Items.Strings[mCombo1.ItemIndex],nil); StoreCode := BOStore.GetFieldValueAsString('Code'); StoreName := BOStore.GetFieldValueAsString('Name'); BOStore.Free; BOCard.FRee; OS.free; end; begin end.
- Teraz si nadefinujeme novú definíciu automatickej správy analogicky ako v príklade 1. Tzn.:
- Otvoríme agendu skladových kariet. Postavíme sa kurzorom na sklad. kartu, pre ktorú chceme nastaviť sledovanie príjmu.
- Vyvoláme funkciu Autom. správy. Táto funkcia je tu dostupná, pretože sme si nadefinovali kontrolný bod "Prijatie tovaru" pre túto agendu, viď vyššie Predpoklady príkladu. Vyvolá sa Sprievodca tvorbou definície automatickej správy.
- V 1. kroku sprievodcu v položke Kontrolný bod sa teraz ponúka náš kontrolný bod "Prijatie tovaru". V položke Typ sprievodcu ale vyberieme voľbu "Výraz":
Typ sprievodcu sa tu ponúka pod názvom s popisom uvedeným v metódach GetHelperCaption a GetHelperDescription v skripte
- V ďalšom kroku zadáme adresátov.
- Keďže sme si v skripte naprogramovali, že tento typ sprievodcu má mať ďalší krok, tento sa ponúkne. V našom príklade tu užívateľ môže zvoliť sklad, na ktorom chce prijatie aktuálne sledovať.
- Po stlačení Dokončiť sa uloží nová definícia autom. správy do agendy Definícia automatických správ podobná nasledujúcemu obrázku:
Detail definície automatickej správy. Údaje sa predvyplnili automaticky textami zadanými tentokrát v skriptovaní v sprievodcovi (na rozdiel od príkladu 1 a príkladu 2), zo sprievodcu sa doplnilo akurát ID zvoleného skladu do konštrukcie výrazu. Ak by ste chceli definíciu zmeniť (napr. pridať ďalších adresátov), môžete to urobiť priamo v agende Definícia automatických správ.
- Ďalej musí existovať naplánovaná úloha a musí byť sprevádzkovaný automatizačný server, ako v príklade 1.
Teraz bude platiť: Akonáhle dôjde k nejakej zmene na čiastkových skladových kartách, zaznamená sa interne požiadavka na generovanie autom. správy. V okamihu, keď automatizačný server spustí úlohu typu Automatické správy, vyhodnotí sa podmienka (tzn. či došlo k zvýšeniu počtu, či dané zvýšenie počtu bolo na skladovú kartu, ktorej ID bolo uvedené vo výraze a na sklad, ktorého ID je vo výraze). Ak je podmienka splnená, tak tí, ktorí sú uvedení medzi adresátmi vyššie vytvorenej definície autom. správy, dostanú správu s predmetom a textom podľa tejto definície.