Click or drag to resize

IOBERONCashRegisterService Interface

EXALOGIC
Rozhranie (Interface) pre komunikáciu s modulom Pokladnica OBERON. Najčastejšie sa používa pre komunikáciu externého systému tzv. mobilného čašníka so systémom OBERON. Umožňuje vytvoriť otvorený účet (stôl) na Pokladnici OBERON, zapísať na otvorený účet položky a podobne. Obsahuje aj metódy pre zobrazenie záznamov z bonovacej knihy na displej v kuchyni alebo predajnom mieste. Väčšina metód vracia návratovú triedu ResultValue.

Namespace: Exa.OBERON.Services
Assembly: Exa.OBERON.Services (in Exa.OBERON.Services.dll) Version: 4.5.69.0 (4.5.69.0)
Syntax
public interface IOBERONCashRegisterService

The IOBERONCashRegisterService type exposes the following members.

Methods
 NameDescription
Public methodCashRegister_Add_PrinterText Pridá špecifikáciu do zoznam špecifikácií (textov k jedlu na bonovačke) v číselníku.
Public methodCashRegister_Delete_PrinterText Odstráni špecifikáciu zo zoznam špecifikácií (textov k jedlu na bonovačke) v číselníku.
Public methodDeleteBillOpenOdstráni otvorený účet. Môže sa vymazať len otvorený účet bez položiek.
Public methodDeleteBillOpenItemOdstrániť z otvoreného účtu jednu položku. Ak už bola položka vytlačená na bonovacej tlačiarni (objednávka v prípravni jedál či nápojov), bude automaticky vytlačené STORNO objednávky.
Public methodDeleteLicenceOdstrániť záznam o externej licencii z databázy.
Public methodGetBillOpenVracia konkrétny otvorený účet (stôl) s položkami.
Public methodGetBillsOpenVracia zoznam aktuálne otvorených účtov (stolov). Načítajú sa len otvorené účty danej registračnej pokladnice, ktorú táto webová služba zastupuje (jedna webová služba zastupuje jednu konkrétnu registračnú pokladnicu).
Public methodGetBillsOpenDefinitionVracia zoznam definície účtov (stolov), s ktorými je možné na danej registračnej pokladnici pracovať. Webová služba zastupuje jednu konkrétnu registračnú pokladnicu.
Public methodGetCashRegisterWebMetóda pre načítanie html obsahu pre zobrazenie v prehliadači. Metóda sa používa napr. pri kuchynských monitoroch.
Public methodGetCashRegisterWebResourceFileMetóda vracia konkrétne súbory, potrebné v html aplikácii napr. kuchynských monitoroch.
Public methodGetCashRegisterWebTemplateFileMetóda načíta vzorové súbory funkcií napr. aplikácie kuchynských monitorov.
Public methodGetCompanyInfoNačítanie údajov o firme (účtovnej jednotke), s ktorou webová služba pracuje.
Public methodGetCompanySettingsNačítanie základných nastavení firmy (účtovnej jednotky), s ktorou webová služba pracuje.
Public methodGetDateTimeVráti dátum a čas počítača, na ktorom beží webová služba.
Public methodGetDeliveryShippingRatesVracia cenník dopravy pri donáške.
Public methodGetDeliveryTimeVráti aktuálny predpokladaný čas donášky (v minútach). Vypočítava sa na základe iných objednávok (otvorených účtov), či už donáškových alebo aj priamo na prevádzke (otvorené stoly).
Public methodGetFoodMenuInfoVracia údaje o jedálnom alebo nápojovom lístku, napr. úvodný uvítací text v eMenu, text na začiatku jedálneho lístka, text na konci, alergény a podobne. Neobsahuje položky eMenu, tie sú dostupné v metóde GetStockCards.
Public methodGetHotelAccountsVracia zoznam aktuálne otvorených hotelových účtov v module Hotelová recepcia. Hotelový účet môže ale aj nemusí byť priradený k izbe, prípadne na jednu izbu môže byť vytvorených aj viac hotelových účtov (napr. jeden za ubytovanie, ďalší na stravu, prípadne pre každého hosťa izby samostatne). Účet v Pokladnici OBERON je možné presunúť na hotelový účet pomocou metódy SetBillOpenCompute.
Public methodGetLanguagesVracia zoznam dostupných jazykov definované v systéme pre preklad údajov, napr. názov skladovej karty, popis a podobne. Jazyk, v ktorom sa majú zasielať údaje sa nastavuje pri prihlásení (./>
Public methodGetLicenceVráti informácie o licencii určenej pre externý systém.
Public methodGetLicencesVráti zoznam licencií určených pre externé systémy.
Public methodGetLoginSaltVráti tzv. SALT, ktorý je používaný pri hashovaní hesla pri prihlásení používateľa. Volá sa tesne pred metódou LoginUser.
Public methodGetMenuCategoriesVracia zoznam skupín v jedálnom lístku. Skupiny sa dajú vygenerovať aj so zoznamu skladových kariet (číselník položiek pre predaj), avšak tu je možné navyše získať aj obrázok danej skupiny. Obrázky skupín v jedálnom lístku sú napevno definované v číselníku, prípadne si používateľ môže zvoliť aj svoj vlastný obrázok.
Public methodGetOrderPrinterTextsVracia zoznam textov pre tlač na bonovacej tlačiarni.
Public methodGetOrdersVracia zoznam položiek zapísaných v bonovacej knihe - spravidla vytlačených na jednej alebo viacerých bonovacích tlačiarňach. Položky sú určené na prípravu, najčastejšie jedlá a nápoje. Spravidla vracia ešte nepripravené, alebo nevynesené, tzv. otvorené položky. Môže však vracať aj všetky položky od daného dátumu a času (záleží od parametra funkcie). Používa sa pre zobrazovanie položiek na displeji v kuchyni alebo predajnom mieste.
Public methodGetPaymentTypesVracia zoznam typov platieb (spôsobov zaevidovania dokladu). Používa sa pri vytlačení (uzatvorení) dokladu na Pokladnici OBERON (metóda SetBillOpenCompute).
Public methodGetStockCardDetailVráti detailné informácie o skladovej položke, ktoré sa nenachádzjú v základnej štruktúre. Ide najmä o rozšírený popis a obrázky.
Public methodGetStockCardsVracia zoznam skladových kariet. Načítajú sa len skladové karty danej registračnej pokladnice, ktorú táto webová služba zastupuje (jedna webová služba zastupuje jednu konkrétnu registračnú pokladnicu).
Public methodGetStockCardsLastUpdateVracia dátum a čas (UTC) poslednej zmeny na skladovej karte, zmenou je aj zmena množstva pri príjme alebo výdaji.
Public methodGetUsersNačítanie zoznamu používateľov definovaných v systéme OBERON.
Public methodGetUsersLoggedOnWebServiceVráti zoznam používateľov prihlásených do tejto webovej služby. Ak sa používateľ korektne neodhlási, webová služba ho v stanovenom časovom intervale (momentálne nastavené na 2 hodiny) automaticky odhlási.
Public methodGetVersionVráti číslo verzie webovej služby.
Public methodIsLoginOverenie aktuálne prihláseného používateľa (prípadne používateľa podľa parametra), či je prihlásený do webovej služby (záleží však na nastavení spôsobu autentifikácie služby).
Public methodLoginUserPrihlási používateľa do webovej služby (záleží však na nastavení spôsobu autentifikácie služby). Je potrebné volať na začiatku komunikácie s webovou službou, nakoľko sa generuje tzv. GUID pre ďalšiu komunikáciu (ten musí byť súčasťou hlavičky danej požiadavky).
Public methodLoginUserExPrihlási používateľa do webovej služby (záleží však na nastavení spôsobu autentifikácie služby). Je potrebné volať na začiatku komunikácie s webovou službou, nakoľko sa generuje tzv. GUID pre ďalšiu komunikáciu (ten musí byť súčasťou hlavičky danej požiadavky).
Public methodLogoutOdhlásenie používateľa z webovej služby.
Public methodPingOverenie dostupnosti služby, zároveň vráti adresu IP.
Public methodPrintOrderVytvorí a vytlačí objednávku daného otvoreného účtu na bonovacej tlačiarni (vytvorí zápis aj do bonovacej knihy). Vytlačené budú vždy len položky, ktoré ešte neboli vytlačené (stav po pridaní ďalšej položky na účet, ak už bola objednávka vytlačená).
Public methodSetBillOpenComputeVytlačenie alebo len uzatvorenie dokladu (otvoreného účtu) na Pokladnici OBERON. Zoznam otvorených účtov je možné načítať metódou GetBillsOpen. Špecialitou je uzatvorenie hotelového účtu presunom na hotelový účet (v module Hotelová recepcia). Zoznam hotelových účtov je možné získať metódou GetHotelAccounts.
Public methodSetBillOpenDiscountUplatní na otvorený účet zľavu, t.j. na každú položku dokladu zapíše danú zľavu. Ak už zľava bola zadaná, bude táto zľava upravená (zmenená) - bude sa opätovne počítať z pôvodných súm. Na položky (skladové karty), na ktoré je uplatnenie zľavy nastavené na 'Pýtať sa', bude zľava uplatnená.
Public methodSetBillOpenDoBankTerminalVyvolá komunikáciu s platobným terminálom (na strane OBERON-u) pre vykonanie bankovej transakcie a tým úhrady otvoreného účtu. Započatím bankovej transakcie sa zapíše do hlavičky otvoreného účtu info o novej prebiehajúcej platobnej transakcii (TransactionID zo stavom Progress). TransactionID v prípade problémov v komunikácii umožňuje overiť platnosť platobnej transakcie.
Public methodSetBillOpenItemAktualizuje (upravuje) existujúcu položku na otvorenom účte. Položku vytlačenú na bonovacej tlačiarni už nie je možné upraviť.
Public methodSetBillOpenItemDiscountUplatní na položku otvoreného účtu zľavu. Ak už zľava bola zadaná, bude táto zľava upravená (zmenená) - bude sa opätovne počítať z pôvodných súm. Na položky (skladové karty), na ktoré je uplatnenie zľavy nastavené na 'Pýtať sa', bude zľava uplatnená.
Public methodSetBillOpenItemMovePresun jednej položky otvoreného účtu na iný otvorený účet, prípadne rozdelenie položky medzi dva otvorené účty. Používa sa napr. pri rozdelení jedného účtu tak, že platia obidve osoby samostatne. Všetky činnosti sú zaznamenávané do tzv. Sledovania činností.
Public methodSetBillOpenItemsMergeZlúči položky na otvorenom účte.
Public methodSetBillOpenPaymentZápis informácie o úhrade otvoreného účtu platobnou kartou. Použitím tejto metódy sa nevykonáva banková transakcia volaním bankového terminála, ale sa len zapisuje info o úhrade. Zápis úhrady môže vykonať obsluha pokladnice (napr. na mobilnej aplikácii LUKUL v režime Čašník), prípadne priamo aj zákazník, napr. ako hosť v reštaurácii pri úhrade účtu, prípadne pri donáške. Zoznam otvorených účtov je možné načítať metódou GetBillsOpen.
Public methodSetBillOpenStateZapíše (zmení) príznaky na otvorenom účte (stole). Ide o príznak privolania obsluhy zákazníkom, prípadne príznak oznámenia vyúčtovania otvoreného účtu (tu je možné bližšie určiť spôsob platby).
Public methodSetLicenceZapíše do databázy pre uloženie externých licencií nový záznam (ak Licence.ID = 0), prípadne aktualizuje stávajúci (je zadané Licence.ID).
Public methodSetNewBillOpenZápis (vytvorenie) nového otvoreného účtu (stola). Zápis je vykonávaný v transakcii, ak dôjde k chybe pri čo i len jednej z položiek, nebude zapísaná žiadna položka a ani hlavička otvoreného účtu.
Public methodSetNewBillOpenItemsZápis nových položiek na už existujúci otvorený účet. Zápis je vykonávaný v transakcii, ak dôjde k chybe pri čo i len jednej z položiek, nebude zapísaná žiadna položka.
Public methodSetOrderItemDateTimeDeliveryZapíše príznak dodanie jedla alebo nápoja na položku do bonovacej knihy (zapisuje sa aktuálny serverový dátum a čas). Dodaním sa myslí obslúženie zákazníka (vynesenie jedla), v prípade donáškovej služby to môže byť dátum a čas prevzatia kuriérom (prípadne dodania k zákazníkovi - záleží od systému práce). V prípade potreby aj zruší tento príznak.
Public methodSetOrderItemDateTimeTakeOutZapíše príznak ukončenia prípravy jedla alebo nápoja na položku do bonovacej knihy (zapisuje sa aktuálny serverový dátum a čas). V prípade potreby aj zruší tento príznak.
Public methodSetOrderItemExternalSystemDataZapíše príznak z externého systému do bonovacej knihy. Tu si môže externý systém značiť ľubovolné údaje OBERON s týmito údajmi nepracuje, len ich spätne vracia.
Public methodSetOrderVisibleIndexUmožňuje posunúť objednávku v poradí pri zobrazení na displeji (bonovacia obrazovka v kuchyni). Umožňuje posunie zobrazenia objednávky doľava, doprava, na prvú alebo poslednú pozíciu.
Public methodShowKitchenDisplayZobrazí úvodnú obrazovku webovej aplikácie Systém kuchynských monitorov.
Public methodStockCards_Update_Specifications Aktualizuje zoznam špecifikácií (textov k jedlu na bonovačke) na skladovej karte.
Public methodUploadApplicationLogOdoslanie súboru LOG z externej aplikácie do programu OBERON Center.
Top
Remarks
Uvedené metódy je možné volať napr. z vývojového nástroja Microsoft Visual Studio (potrebné pridať Service Reference), prípadne priamo z webovej stránky pomocou Java skriptov (SOAP/JSON štruktúr). Nasledovne je uvedený funkčný zdrojový kód, ktorým sa po umiestnení do HTML súboru umožní pripojiť na danú webovú službu.
Príklad volania priamo z html stránky pomocou Java skriptov
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <title>Test webovej služby</title>
    <!-- Tato testovacia html stranka spustena na lokalnom pocitaci pracuje korektne v Internet Exploreri, -->
    <!--  v inych prehliadacoch sa casto vyskytuje problem so zabezpecenim, tzv. Cross-site scripting. -->
    <style>
        .right { text-align: right; }
        .tb td, .tb th { padding: 4px; }
        .tb {
            border: solid 1px #808080;
            border-spacing: 0;
        }
        .tb thead tr {
                background-color: #e6e6e6;
                background-image: linear-gradient(top, #eeeeee, #dadada);
            }
    </style>

</head>
<body>

    <div>

        <form id="testWebService" action="/">
            <!-- 87.197.186.118:20057 / system / system -->
            <input type="text" id="settAddress" placeholder="adresa webovej služby" value="87.197.186.118:20057" />
            <input type="text" id="settName" placeholder="meno" value="system" />
            <input type="text" id="settPassword" placeholder="heslo" value="system" />

            <button id="runTest" type="submit" >Test</button>
        </form>


    </div>

    <div id="resultData"></div>

<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.10.2.js" type="text/javascript"></script>

<script type="text/javascript" id="sha1" >
    (function (e) { var t = function (e, t) { return e << t | e >>> 32 - t }; var n = function (e) { var t = ""; var n; var r; var i; for (n = 0; n <= 6; n += 2) { r = e >>> n * 4 + 4 & 15; i = e >>> n * 4 & 15; t += r.toString(16) + i.toString(16) } return t }; var r = function (e) { var t = ""; var n; var r; for (n = 7; n >= 0; n--) { r = e >>> n * 4 & 15; t += r.toString(16) } return t }; var i = function (e) { e = e.replace(/\x0d\x0a/g, "\n"); var t = ""; for (var n = 0; n < e.length; n++) { var r = e.charCodeAt(n); if (r < 128) { t += String.fromCharCode(r) } else if (r > 127 && r < 2048) { t += String.fromCharCode(r >> 6 | 192); t += String.fromCharCode(r & 63 | 128) } else { t += String.fromCharCode(r >> 12 | 224); t += String.fromCharCode(r >> 6 & 63 | 128); t += String.fromCharCode(r & 63 | 128) } } return t }; e.extend({ sha1: function (e) { var n; var s, o; var u = new Array(80); var a = 1732584193; var f = 4023233417; var l = 2562383102; var c = 271733878; var h = 3285377520; var p, d, v, m, g; var y; e = i(e); var b = e.length; var w = new Array; for (s = 0; s < b - 3; s += 4) { o = e.charCodeAt(s) << 24 | e.charCodeAt(s + 1) << 16 | e.charCodeAt(s + 2) << 8 | e.charCodeAt(s + 3); w.push(o) } switch (b % 4) { case 0: s = 2147483648; break; case 1: s = e.charCodeAt(b - 1) << 24 | 8388608; break; case 2: s = e.charCodeAt(b - 2) << 24 | e.charCodeAt(b - 1) << 16 | 32768; break; case 3: s = e.charCodeAt(b - 3) << 24 | e.charCodeAt(b - 2) << 16 | e.charCodeAt(b - 1) << 8 | 128; break } w.push(s); while (w.length % 16 != 14) w.push(0); w.push(b >>> 29); w.push(b << 3 & 4294967295); for (n = 0; n < w.length; n += 16) { for (s = 0; s < 16; s++) u[s] = w[n + s]; for (s = 16; s <= 79; s++) u[s] = t(u[s - 3] ^ u[s - 8] ^ u[s - 14] ^ u[s - 16], 1); p = a; d = f; v = l; m = c; g = h; for (s = 0; s <= 19; s++) { y = t(p, 5) + (d & v | ~d & m) + g + u[s] + 1518500249 & 4294967295; g = m; m = v; v = t(d, 30); d = p; p = y } for (s = 20; s <= 39; s++) { y = t(p, 5) + (d ^ v ^ m) + g + u[s] + 1859775393 & 4294967295; g = m; m = v; v = t(d, 30); d = p; p = y } for (s = 40; s <= 59; s++) { y = t(p, 5) + (d & v | d & m | v & m) + g + u[s] + 2400959708 & 4294967295; g = m; m = v; v = t(d, 30); d = p; p = y } for (s = 60; s <= 79; s++) { y = t(p, 5) + (d ^ v ^ m) + g + u[s] + 3395469782 & 4294967295; g = m; m = v; v = t(d, 30); d = p; p = y } a = a + p & 4294967295; f = f + d & 4294967295; l = l + v & 4294967295; c = c + m & 4294967295; h = h + g & 4294967295 } var y = r(a) + r(f) + r(l) + r(c) + r(h); return y.toLowerCase() } }) })(jQuery)
</script>

<script type="text/javascript">

    (function ($) {

        window.userData = '';
        window.token = '';

        /* --- unit test --- */
        $("#testWebService").submit(function (evt) {
            evt.preventDefault();
            var exc = myException(''),
                data = dataResult(),
                datah = {html:''},
                ajaxUrl = '',
                post = {},
                elmResult = null;

            elmResult = $('#resultData');
            elmResult.empty();

            //ping
            ajaxUrl = getUrl('ping');
            exc = ajaxHtml(ajaxUrl, datah);
            if (exc.result == false) { //--- nejaká chyba
                elmResult.append('Ping: <p style="color: red;">' + exc.description + '</p>');
            } else {
                elmResult.html('<br/>Ping: <p style="color: blue;">' + datah.html + '</p>');
            }

            //get salt for sha1 hash
            data = dataResult();
            post = { username: $('#settName').val() };
            ajaxUrl = getUrl('GetLoginSalt');
            exc = ajaxPost(ajaxUrl, data, post);
            if (exc.result == false) { //--- nejaká chyba
                elmResult.append('Salt: <p style="color: red;">' + exc.description + '</p>');
            } else {
                window.token = data.data;
                elmResult.append('Salt: <p style="color: blue;">' + data.data + '</p>');
            }


            //login
            post = { username: $('#settName').val(), password: $.sha1(data.data + $('#settPassword').val()) };
            data = dataResult();
            ajaxUrl = getUrl('LoginUser');
            exc = ajaxPost(ajaxUrl, data, post);
            if (exc.result == false) { //--- nejaká chyba
                elmResult.append('Token: <p style="color: red;">' + exc.description + '</p>');
            } else {
                window.token = data.data;
                elmResult.append('Token: <p style="color: blue;">' + data.data + '</p>');
            }


            // is login test
            data = dataResult();
            ajaxUrl = getUrl('IsLogin?ud=' + window.token);
            exc = ajaxGet(ajaxUrl, data);
            if (exc.result == false) { //--- nejaká chyba
                elmResult.append('Is Login: <p style="color: red;">FALSE</p>');
            } else {
                elmResult.append('Is Login: <p style="color: blue;">TRUE</p>');
            }


            // method
            data = dataResult();
            post = { GetItems: true };
            ajaxUrl = getUrl('GetBillsOpen');
            exc = ajaxPost(ajaxUrl, data, post);
            if (exc.result == false) { //--- nejaká chyba
                elmResult.append('Zoznam otvorených účtov: <p style="color: red;">' + exc.description + '</p>');
            } else {
                elmResult.append('<p style="color: Purple;">Zoznam otvorených účtov: </p>');
                var str = '<table border="0" class="tb"><thead><tr><th>IDNum</th><th>Predajné miesto</th><th>Názov stola</th><th class="right">Suma [EUR]</th></tr></thead><tbody>';
                data.data.forEach(function (item, index) {
                    str += '<tr>';
                    str += '<td>' + item.IDNum + '</td>';
                    str += '<td>' + item.SalesPoint + '</td>';
                    str += '<td>' + item.Name + '</td>';
                    str += '<td class="right">' + item.TotalPrice + '</td>';
                    str += '</tr>';
                });
                str += '</tbody></table>';
                elmResult.append(str);
            }


            // logout
            ajaxUrl = getUrl('Logout?ud=' + window.token);
            exc = ajaxGet(ajaxUrl, data);
            if (exc.result == false) { //--- nejaká chyba
                elmResult.append('<br/>Logout: OK<br/>');
            } else {
                elmResult.append('<br/>Logout: OK<br/>');
            }

        });

        function getUrl(method) {
            return 'http://' + $('#settAddress').val() + '/' + method;
        }

        function ajaxGet(ajaxurl, rfResult, jdata, processdata) {
            var exc = myException('');
            if (!processdata) { processdata = false; }
            if (!jdata) { jdata = null; }
            $.ajax({ type: 'GET', cache: false, async: false,
                dataType: 'json', contentType: 'application/json; charset=utf-8',
                url: ajaxurl, processData: processdata,
                data: JSON.stringify(jdata), //--- musí byt konverzia na text,
                beforeSend: function (xhr) {
                    xhr.setRequestHeader('userData', window.userData);
                },
                success: function (data, textStatus, xhr) {
                    dataResultGet(data, rfResult);
                    if (rfResult.result == false && rfResult.errNumber === 2) {
                        // chyba užívateľ nie je prihlásený
                    }
                    window.userData = xhr.getResponseHeader('userData');
                    exc.result = true;//--- default je true
                    if (rfResult.result == false) {
                        exc.result = false;
                        exc.errNumber = rfResult.errNumber;
                        exc.description = rfResult.description;
                    }                
                },
                error: function (xhr, exception, errorThrown) {
                    exc = z_GetAjaxException(xhr, exception, errorThrown);
                }
            });
            return exc;
        }

        function ajaxPost(ajaxurl, rfResult, jdata, processdata) {
            var exc = myException('');
            if (!processdata) { processdata = false; }
            if (!jdata) { jdata = null; }
            $.ajax({
                type: 'POST', cache: false, async: false,
                dataType: 'json', contentType: 'application/json; charset=utf-8',
                url: ajaxurl, processData: processdata,
                data: JSON.stringify(jdata), //--- musí byt konverzia na text,
                beforeSend: function (xhr) {
                    xhr.setRequestHeader('userData', window.userData);
                },
                success: function (data, textStatus, xhr) {
                    dataResultGet(data, rfResult);
                    if (rfResult.result == false && rfResult.errNumber === 2) {
                        // chyba užívateľ nie je prihlásený
                    }
                    window.userData = xhr.getResponseHeader('userData');
                    exc.result = true;//--- default je true
                    if (rfResult.result == false) {
                        exc.result = false;
                        exc.errNumber = rfResult.errNumber;
                        exc.description = rfResult.description;
                    }
                },
                error: function (xhr, exception, errorThrown) {
                    exc = z_GetAjaxException(xhr, exception, errorThrown);
                }
            });
            return exc;
        }

        function ajaxHtml(ajaxurl, rfResult, callType, jdata) {
            var exc = myException('');
            if (!callType) { callType = 'GET'; }
            $.ajax({
                type: callType, url: ajaxurl, cache: false, async: false,
                dataType: 'html', contentType: 'text/html; charset=utf-8',
                processData: false, data: JSON.stringify(jdata),
                beforeSend: function (xhr) {
                    xhr.setRequestHeader('userData', window.userData);
                },
                success: function (data, textStatus, xhr) {
                    window.userData = xhr.getResponseHeader('userData');
                    rfResult.html = data;
                    exc.result = true;
                },
                error: function (xhr, exception, errorThrown) {
                    exc = z_GetAjaxException(xhr, exception, errorThrown);
                }
            });
            return exc;
        }

        /* --- Support methods --- */

        function myException(descr, msg, errNum, res) { //exception object
            return { result: !res ? false : res, errNumber: !errNum ? 0 : errNum, message: !msg ? '' : msg, description: !descr ? '' : descr };
        };

        function dataResult() { //data result object
            return { result: false, errNumber: 0, description: '', data: null };
        };
        function dataResultGet(data, rfResult) {//rfResult musí byť inicializovaný pomocou 'dataResult'
            rfResult.result = data.result;
            rfResult.errNumber = data.errNumber;
            rfResult.description = data.description;
            rfResult.data = data.data;
        }

        function z_GetAjaxException(jqXHR, exception, errorThrown) {
            var exc = myException();

            if (jqXHR.status === 0) {
                exc = myException('Server webovej služby je v tejto chvíli nedostupný.', '', 111);
            } else if (jqXHR.status == 404) {
                exc = myException('Metóda pre spracovanie požiadavky nebola nájdená.', '', 404);
            } else if (jqXHR.status == 500) {
                exc = myException('Interná chyba servera webovej služby.', '', 500);
            } else if (exception === 'parsererror') {
                exc = myException('Chyba pre spracovaní JSON dát zo servera.', '', 900);
            } else if (exception === 'timeout') {
                exc = myException('Čas pre spracovanie požiadavky vypršal.', '', 901);
            } else if (exception === 'abort') {
                exc = myException('Asynchrónne volanie bolo prerušené.', '', 902);
            } else {
                exc = myException('Neznáma chyba.<br/>' + jqXHR.statusText, '', 99);
            }
            return exc;
        }

    })(jQuery);

</script>

</body>
</html>
See Also