var unknown = '-'; // browser var nVer = navigator.appVersion; var nAgt = navigator.userAgent; var browser = navigator.appName; var version = '' + parseFloat(navigator.appVersion); var majorVersion = parseInt(navigator.appVersion, 10); var nameOffset, verOffset, ix; // Opera if ((verOffset = nAgt.indexOf('Opera')) != -1) { browser = 'Opera'; version = nAgt.substring(verOffset + 6); if ((verOffset = nAgt.indexOf('Version')) != -1) { version = nAgt.substring(verOffset + 8); } } // Opera Next if ((verOffset = nAgt.indexOf('OPR')) != -1) { browser = 'Opera'; version = nAgt.substring(verOffset + 4); } // Legacy Edge else if ((verOffset = nAgt.indexOf('Edge')) != -1) { browser = 'Microsoft Legacy Edge'; version = nAgt.substring(verOffset + 5); } // Edge (Chromium) else if ((verOffset = nAgt.indexOf('Edg')) != -1) { browser = 'Microsoft Edge'; version = nAgt.substring(verOffset + 4); } // MSIE else if ((verOffset = nAgt.indexOf('MSIE')) != -1) { browser = 'Microsoft Internet Explorer'; version = nAgt.substring(verOffset + 5); } // Chrome else if ((verOffset = nAgt.indexOf('Chrome')) != -1) { browser = 'Chrome'; version = nAgt.substring(verOffset + 7); } // Safari else if ((verOffset = nAgt.indexOf('Safari')) != -1) { browser = 'Safari'; version = nAgt.substring(verOffset + 7); if ((verOffset = nAgt.indexOf('Version')) != -1) { version = nAgt.substring(verOffset + 8); } } // Firefox else if ((verOffset = nAgt.indexOf('Firefox')) != -1) { browser = 'Firefox'; version = nAgt.substring(verOffset + 8); } // MSIE 11+ else if (nAgt.indexOf('Trident/') != -1) { browser = 'Microsoft Internet Explorer'; version = nAgt.substring(nAgt.indexOf('rv:') + 3); } // Other browsers else if ((nameOffset = nAgt.lastIndexOf(' ') + 1) < (verOffset = nAgt.lastIndexOf('/'))) { browser = nAgt.substring(nameOffset, verOffset); version = nAgt.substring(verOffset + 1); if (browser.toLowerCase() == browser.toUpperCase()) { browser = navigator.appName; } } // trim the version string if ((ix = version.indexOf(';')) != -1) version = version.substring(0, ix); if ((ix = version.indexOf(' ')) != -1) version = version.substring(0, ix); if ((ix = version.indexOf(')')) != -1) version = version.substring(0, ix); majorVersion = parseInt('' + version, 10); if (isNaN(majorVersion)) { version = '' + parseFloat(navigator.appVersion); majorVersion = parseInt(navigator.appVersion, 10); } // system var os = unknown; var clientStrings = [ {s:'Windows 10', r:/(Windows 10.0|Windows NT 10.0)/}, {s:'Windows 8.1', r:/(Windows 8.1|Windows NT 6.3)/}, {s:'Windows 8', r:/(Windows 8|Windows NT 6.2)/}, {s:'Windows 7', r:/(Windows 7|Windows NT 6.1)/}, {s:'Windows Vista', r:/Windows NT 6.0/}, {s:'Windows Server 2003', r:/Windows NT 5.2/}, {s:'Windows XP', r:/(Windows NT 5.1|Windows XP)/}, {s:'Windows 2000', r:/(Windows NT 5.0|Windows 2000)/}, {s:'Windows ME', r:/(Win 9x 4.90|Windows ME)/}, {s:'Windows 98', r:/(Windows 98|Win98)/}, {s:'Windows 95', r:/(Windows 95|Win95|Windows_95)/}, {s:'Windows NT 4.0', r:/(Windows NT 4.0|WinNT4.0|WinNT|Windows NT)/}, {s:'Windows CE', r:/Windows CE/}, {s:'Windows 3.11', r:/Win16/}, {s:'Android', r:/Android/}, {s:'Open BSD', r:/OpenBSD/}, {s:'Sun OS', r:/SunOS/}, {s:'Chrome OS', r:/CrOS/}, {s:'Linux', r:/(Linux|X11(?!.*CrOS))/}, {s:'iOS', r:/(iPhone|iPad|iPod)/}, {s:'Mac OS X', r:/Mac OS X/}, {s:'Mac OS', r:/(Mac OS|MacPPC|MacIntel|Mac_PowerPC|Macintosh)/}, {s:'QNX', r:/QNX/}, {s:'UNIX', r:/UNIX/}, {s:'BeOS', r:/BeOS/}, {s:'OS/2', r:/OS\/2/}, {s:'Search Bot', r:/(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\/Teoma|ia_archiver)/} ]; for (var id in clientStrings) { var cs = clientStrings[id]; if (cs.r.test(nAgt)) { os = cs.s; break; } } var osVersion = unknown; if (/Windows/.test(os)) { osVersion = /Windows (.*)/.exec(os)[1]; os = 'Windows'; } switch (os) { case 'Mac OS': case 'Mac OS X': case 'Android': osVersion = /(?:Android|Mac OS|Mac OS X|MacPPC|MacIntel|Mac_PowerPC|Macintosh) ([\.\_\d]+)/.exec(nAgt)[1]; break; case 'iOS': osVersion = /OS (\d+)_(\d+)_?(\d+)?/.exec(nVer); osVersion = osVersion[1] + '.' + osVersion[2] + '.' + (osVersion[3] | 0); break; } function round_old(num, decimalPlaces){ var d = decimalPlaces || 2, m = Math.pow(10, d), n = +(d ? num * m : num).toFixed(8), i = Math.floor(n), f = n - i, e = 1e-8, r = (f > 0.5 - e && f < 0.5 + e) ? ((i % 2 == 0) ? i : i + 1) : Math.round(n); var result = d ? r / m : r; try{ if(Number.isNaN(result)){ result = 0; } }catch(err){ result = 0; } return result; } function round(figureToRound,s){ if(!s){ s = 2; } //var roundOff = Math.round((figureToRound* 100 ).toFixed(2))/100; var roundOff = Math.round10(figureToRound, -+s) return roundOff; } function CurrencyFormatted(amount) { amount = Math.round10(amount, -2) var i = parseFloat(amount); if(isNaN(i)) { i = 0.00; } var minus = ''; if(i < 0) { minus = '-'; } i = Math.abs(i); i = parseInt((i + .005) * 100); i = i / 100; s = new String(i); if(s.indexOf('.') < 0) { s += '.00'; } if(s.indexOf('.') == (s.length - 2)) { s += '0'; } s = minus + s; return s; } function QuantityFormatted(amount) { amount = Math.round10(amount, -3) var i = parseFloat(amount); if(isNaN(i)) { i = 0.00; } var minus = ''; if(i < 0) { minus = '-'; } i = Math.abs(i); i = parseInt((i + .0005) * 1000); i = i / 1000; s = new String(i); if(s.indexOf('.') < 0) { s += '.000'; } if(s.indexOf('.') == (s.length - 2)) { s += '0'; } if(s.indexOf('.') == (s.length - 3)) { s += '0'; } s = minus + s; return s; } var Templates = {}; var sPut = {}; var $html = $("html"), $choiceuser = $(".choice_user"), $enterpin = $(".enter_pin"), $chUseConr = $("#choice_user_container"), $exit = $(".exit"), $halldesktop = $(".hall_desktop"), $terminal = $(".terminal"), $topmenu = $("#topmenu"), $desktop = $("#desktop"), $podlojka = $("#podlojka"), $loadImg = $("#loadImg"), $thissklad = $(".thissklad"), $thiszal = $(".thiszal"), $otmena = $("#otmena"), $basket = $(".basket"), $all_price = $(".all_price"), $smenaclose = $(".smenaclose"), $historypay = $("#historypay"), $otchetzasmenu = $("#otchetzasmenu"), $printwifi = $("#printwifi"), $inventoryzation = $("#inventoryzation"), $smenaclosebox = $("#smenaclosebox"), $savetoserverbox = $("#savetoserverbox"), $sendtocookbox = $("#sendtocookbox"), $sendtocookboxes = $("#sendtocookboxes"), $wifibox = $("#wifibox"), $editcashbox = $("#editcashbox"), $vvodsredstvbox = $("#vvodsredstvbox"), $incasationbox = $("#incasationbox"), $inventoryzationbox = $("#inventoryzationbox"), $smenacloseboxes = $("#smenacloseboxes"), $lin1 = $("#lin1"), $desktopheadertitle = $("#desktopheader"), $onlineindicator = $("#onlinestatus"), $tocook = $("#tocook"), $paynow = $("#paynow, #paynow_cash, #paynow_electron"), $support = $(".support"), $bl = $("#container_par"), $supportbox = $("#supportbox"), $comingline = $("#comingline").html(), $inventoryline = $("#inventoryline").html(), $activeaskinput = ""; var loader = 300, htmlbuffer = true, portmoneQR = null, akcizBarcodeScaned = "", ioshttpsender = null, currentlang = 'en', okruglenie = 0, localsocket = null, returnEvotor = {}, returnMosst = {}, returnIngenico = {}, returnVerifone = {}, returnAtol9 = {}, returnAtolapk = {}, returnAtol10 = {}, returnMiniFP = {}, shtorka = 0, pause = 70, currentsklad = 0, webkassatoken = null, ecp = {}, e_receipt = {}, fiscalSettings = {}, uaprroenable = false, rro = false, prro_userdata = { salesum:0, salecount:0, cash:null, electron:null, taxes:{}, taxespay:{}, serviceInput:0, serviceOutput:0, totalCurrencyCost:0, totalCurrencyCommission:0, returncount:0, returnsum:0, returnElectron:null, returnCash:null, returnTaxes:{}, returntaxespay:{} }, prroAdress = {}, nolicense = 0, currentzal = 0, currentuser = 0, currentsmena = 0, currentdesktop = 1, currentcategory = 0, currentdiscount = 0, applybonusdiscount = {}, currentclient = 0, currentblock = "", status = "true", allcena = 0, allcenadiscount = 0, basnew = 0, bascook = 0, basdone = 0, opendialog = 0, sell2arc = [], search = "", userbase = "", bascookedstatus = "", barcodescaned = "", myIP = "127.0.0.1", blW = $bl.outerWidth(), blSW = $bl[0].scrollWidth, wDiff = (blSW / blW) - 1, /* widths difference ratio*/ mPadd = 60, /* Mousemove Padding*/ damp = 20, /* Mousemove response softness*/ mX = 0, /* Real mouse position*/ mX2 = 0, /* Modified mouse position*/ posX = 0, mmAA = blW - (mPadd * 2), /* The mousemove available area*/ mmAAr = (blW / mmAA), /* get available mousemove fidderence ratio*/ disconnectcounter = 0, n = 0, userpin = "", lastitem = 0, thisactivekeyboard = "", //enterpin wskey = "", categorytree = [], sendemail = {}, sending = 0, stopsync = 0, widthgoodsbox = 0, uploadsynctime = 0, serversyncobj = {}, sendingserversync = false, loadsynctime = 0, casserverweight = 0, thisbasket1 = {}, androidinit = {}, bankingcount = 0; poolserver = {}; callingPhone = ""; escpos = "", exec = "", fs = "", webshot = "", electron = "", minifp = {}, hallscreen = null, datalogicbarcodecom = 0; var savedToken = ""; var savedCompanyId = ""; var dashboardURL = "/dashboard-new/"; /*Коды ошибок helpmicro*/ var hlpmicErr = {}; hlpmicErr["x01"] = "Цена не указана"; hlpmicErr["x02"] = "Количество не указано"; hlpmicErr["x03"] = "Отдел не указан"; hlpmicErr["x04"] = "Группа не указана"; hlpmicErr["x25"] = "Нет бумаги"; hlpmicErr["x31"] = "Пользователь уже зарегистрирован"; hlpmicErr["x32"] = "Неверный пароль"; hlpmicErr["x33"] = "Неверный номер таблицы"; hlpmicErr["x34"] = "Доступ к таблице запрещен"; hlpmicErr["x35"] = "Умолчание не найдено"; hlpmicErr["x36"] = "Неверный индекс"; hlpmicErr["x37"] = "Неверное поле"; hlpmicErr["x38"] = "Таблица переполнена"; hlpmicErr["x39"] = "Неверная длина двоичных данных"; hlpmicErr["x3A"] = "Попытка модификации поля только для чтения"; hlpmicErr["x3B"] = "Неверное значение поля"; hlpmicErr["x3C"] = "Товар уже существует"; hlpmicErr["x3D"] = "По товару были продажи"; hlpmicErr["x3F"] = "Неверная закладка"; hlpmicErr["x40"] = "Ключ не найден"; hlpmicErr["x41"] = "Процедура уже исполняется"; hlpmicErr["x42"] = "Количество товара отрицательно"; hlpmicErr["x43"] = "Включено перенаправление с карты памяти"; hlpmicErr["x87"] = "Ошибка фискальной памяти"; hlpmicErr["x88"] = "Ошибка карты памяти"; hlpmicErr["x89"] = "Переполнение карты памяти"; hlpmicErr["x8B"] = "Нет бумаги"; hlpmicErr["x8C"] = "Переполнение фискальной памяти"; hlpmicErr["x8D"] = "Выдача сдачи запрещена, возможно смена превысила 24 часа"; hlpmicErr["xA3"] = "Операция прекращена устройством"; hlpmicErr["xA5"] = "Дневной отчет не найден"; hlpmicErr["xA7"] = "MMC запрещено"; hlpmicErr["xBB"] = "Лента не пуста"; hlpmicErr["xBC"] = "Режим тренировки"; hlpmicErr["xBD"] = "Текущая дата неверна"; hlpmicErr["xBE"] = "Запрещено изменение времени"; hlpmicErr["xC1"] = "Неверный номер налога"; hlpmicErr["xC2"] = "Неверный параметр у процедуры"; hlpmicErr["xC3"] = "Режим фискального принтера не активен"; hlpmicErr["xC4"] = "Изменялось название товара или его налог"; hlpmicErr["xC5"] = "Необходима персонализация"; hlpmicErr["xC6"] = "Отсутствует обмен с сервером НСМЭП на протяжении 72 часов"; hlpmicErr["xC7"] = "Запрещено обнуление данных ЭКЛ"; hlpmicErr["xC8"] = "Запрещена работа с GPRS модемом"; hlpmicErr["xC9"] = "Ошибка в хранилище данных"; hlpmicErr["xCB"] = "Запрещена операция продажи"; hlpmicErr["xCC"] = "Начата операция возврата"; hlpmicErr["xCE"] = "Не установлены налоговые ставки"; hlpmicErr["xCF"] = "Не выведен отчет Z1"; hlpmicErr["xD0"] = "Не сделана инкассация денег"; hlpmicErr["xD1"] = "Сейф не закрыт"; hlpmicErr["xD2"] = "Печать ленты прервана"; hlpmicErr["xD3"] = "Достигнут конец текущей смены, или изменилась дата"; hlpmicErr["xD4"] = "Не указано значение процентной скидки по умолчанию"; hlpmicErr["xD5"] = "Не указано значение скидки по умолчанию"; hlpmicErr["xD6"] = "Дневной отчет не выведен"; hlpmicErr["xD7"] = "Дневной отчет уже выведен (и пуст)"; hlpmicErr["xD8"] = "Нельзя отменить товар на который сделана скидка без ее предварительной отмены"; hlpmicErr["xD9"] = "Товар не продавался в этом чеке"; hlpmicErr["xDA"] = "Нечего отменять"; hlpmicErr["xDB"] = "Отрицательная сумма продажи товара"; hlpmicErr["xDC"] = "Неверный процент"; hlpmicErr["xDD"] = "Нет ни одной продажи"; hlpmicErr["xDE"] = "Скидки запрещены"; hlpmicErr["xDF"] = "Неверная сумма платежа"; hlpmicErr["xE0"] = "Тип оплаты не предполагает введения кода клиента"; hlpmicErr["xE1"] = "Неверная сумма платежа"; hlpmicErr["xE2"] = "Идет оплата чека"; hlpmicErr["xE3"] = "Товар закончился"; hlpmicErr["xE4"] = "Номер группы не может меняться"; hlpmicErr["xE5"] = "Неверная группа"; hlpmicErr["xE6"] = "Номер отдела не может меняться"; hlpmicErr["xE7"] = "Неверный отдел"; hlpmicErr["xE8"] = "Нулевое произведение количества на цену"; hlpmicErr["xE9"] = "Переполнение внутренних сумм"; hlpmicErr["xEA"] = "Дробное количество запрещено"; hlpmicErr["xEB"] = "Неверное количество"; hlpmicErr["xEC"] = "Цена не может быть изменена"; hlpmicErr["xED"] = "Неверная цена"; hlpmicErr["xEE"] = "Товар не существует"; hlpmicErr["xEF"] = "Начат чек внесения-изъятия денег"; hlpmicErr["xF0"] = "Чек содержит продажи"; hlpmicErr["xF1"] = "Не существующий или запрещенный тип оплаты"; hlpmicErr["xF2"] = "Поле в строке переполнено"; hlpmicErr["xF3"] = "Отрицательная сумма по дневному отчету"; hlpmicErr["xF4"] = "Отрицательная сумма по чеку"; hlpmicErr["xF5"] = "Чек переполнен"; hlpmicErr["xF6"] = "Дневной отчет переполнен"; hlpmicErr["xF7"] = "Чек для копии не найден"; hlpmicErr["xF8"] = "Оплата чека не завершена"; hlpmicErr["xF9"] = "Кассир не зарегистрирован"; hlpmicErr["xFA"] = "У кассира нет прав на эту операцию"; hlpmicErr["xFB"] = "Нефискальный чек не открыт"; hlpmicErr["xFC"] = "Чек не открыт"; hlpmicErr["xFD"] = "Нефискальный чек уже открыт"; hlpmicErr["xFE"] = "Чек уже открыт"; hlpmicErr["xFF"] = "Переполнение ленты"; /*Коды ошибок Ingenico Украина*/ var ingenicoUErr = {}; var verifoneUErr = {}; $(function() { try{ if(localStorage.prroTesting){ $("#prrotesting").show(); }else{ $("#prrotesting").hide(); } }catch(err){ console.log(err) } /*Обьявляем переменные*/ var currentversion = "9"; //console.log = function(){}; //console.group = function(){}; //console.warn = function(){}; /** * Корректировка округления десятичных дробей. * * @param {String} type Тип корректировки. * @param {Number} value Число. * @param {Integer} exp Показатель степени (десятичный логарифм основания корректировки). * @returns {Number} Скорректированное значение. */ function decimalAdjust(type, value, exp) { // Если степень не определена, либо равна нулю... if (typeof exp === 'undefined' || +exp === 0) { return Math[type](value); } value = +value; exp = +exp; // Если значение не является числом, либо степень не является целым числом... if (isNaN(value) || !(typeof exp === 'number' && exp % 1 === 0)) { return NaN; } // Сдвиг разрядов value = value.toString().split('e'); value = Math[type](+(value[0] + 'e' + (value[1] ? (+value[1] - exp) : -exp))); // Обратный сдвиг value = value.toString().split('e'); return +(value[0] + 'e' + (value[1] ? (+value[1] + exp) : exp)); } // Десятичное округление к ближайшему if (!Math.round10) { Math.round10 = function(value, exp) { return decimalAdjust('round', value, exp); }; } // Десятичное округление вниз if (!Math.floor10) { Math.floor10 = function(value, exp) { return decimalAdjust('floor', value, exp); }; } // Десятичное округление вверх if (!Math.ceil10) { Math.ceil10 = function(value, exp) { return decimalAdjust('ceil', value, exp); }; } window.onerror1 = function(msg, url, line, col, error) { // Note that col & error are new to the HTML 5 spec and may not be // supported in every browser. It worked for me in Chrome. var extra = !col ? '' : '\n column: ' + col; extra += !error ? '' : '\n error: ' + error; var texterr = msg + "\n url: pos.js "+currentversion+" \n line: " + line + extra; /*alert("Error, sending error reporting");*/ if (localStorage["jserr"] != texterr) { $.ajax({ url: "/?section=db&db=errorreporting&text=" + texterr, success: function() { localStorage["jserr"] = texterr; console.warn("sended error reporting") }, error: function() { /*alert("Error send error reporting"); */ } }); } else { console.warn("Error report was sent earlier") } // TODO: Report this error via ajax so you can keep track // of what pages have JS issues var suppressErrorAlert = true; // If you return true, then error alerts (like in older versions of // Internet Explorer) will be suppressed. return suppressErrorAlert; }; /*������������� Math.round() ���� ������������� �������������! */ function getRandomInt(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } //функция умножения двух чисел function multiply(a, b) { return ((Number(a)*1000)*(Number(b)*1000))/1000000; } function multiplyin(a, b) { return ((a*1000)*(b*1000))/1000000; } function currentDate() { var d = new Date(); var dd = d.getDate(); if (dd < 10) dd = '0' + dd; var mm = d.getMonth() + 1; if (mm < 10) mm = '0' + mm; var yy = d.getFullYear(); return yy + '-' + mm + '-' + dd; } function OpenWindowWithPost(url, windowoption, name, data) { var form = document.createElement("form"); form.setAttribute("method", "post"); form.setAttribute("action", url); form.setAttribute("target", name); for (var i in data) { if (data.hasOwnProperty(i)) { var input = document.createElement('input'); input.type = 'hidden'; input.name = i; input.value = typeof data[i] === "object" ? JSON.stringify(data[i]) : data[i]; form.appendChild(input); } } document.body.appendChild(form); //note I am using a post.htm page since I did not want to make double request to the page //it might have some Page_Load call which might screw things up. mywindow = window.open("", name, windowoption); form.submit(); document.body.removeChild(form); setTimeout(function() { try{ mywindow.close(); }catch(err){ //alert(lang["Ne_vozmoghno_napechataty_chek_tak_kak_vsplyvayuschee_okno_bylo_zablokirovano_Vashim_brauzerom._Razreshite_vsplyvayuschie_okna_dlya_etogo_sayta"]); alert("Не возможно напечатать чек так как всплывающее окно было заблокировано Вашим браузером. Разрешите всплывающие окна для этого сайта"); } }, 1000); } function OpenWindowWithPostt(url, windowoption, name, data) { var form = document.createElement("form"); form.setAttribute("method", "post"); form.setAttribute("action", url); form.setAttribute("target", name); form.setAttribute("id", "formsubmit"); var input = document.createElement('input'); input.type = 'hidden'; input.name = "jsondata"; input.value = data; form.appendChild(input); document.body.appendChild(form); //note I am using a post.htm page since I did not want to make double request to the page //it might have some Page_Load call which might screw things up. mywindow = window.open("", name, windowoption); form.submit(); //document.body.removeChild(form); element = document.getElementById("formsubmit"); element.remove(); setTimeout(function() { try{ console.log(mywindow); mywindow.close(); }catch(err){ alert("Что-то пошло не так"); } }, 50000); } function setIosUserData(str){ alert(str); try{ var p3 = JSON.parse(str) var p4 = JSON.stringify(p3); alert(p4); }catch(err){ } } try{ //showStatusBar iphone //window.webkit.messageHandlers.showStatusBar.postMessage(""); //вилізла проблема на айпаді, годинник налазить на кнопки меню скайсервісу //мабудь треба визивати цю штуку тільки на айфонах з вирізами }catch(err){ } function xhr(url, data, obj) { /*Возвращаем новое Обещание*/ return new Promise(function(resolve, reject) { /*Делаем привычные XHR вещи*/ var request = new XMLHttpRequest(); /*Если нет данных для передачи то GET, если есть то POST*/ if(data == "" || data == undefined){ request.open('GET', url); }else{ request.open("POST", url, true); request.setRequestHeader('Content-type', 'application/x-www-form-urlencoded; charset=ISO-8859-1'); } try{ var behavior = obj["response"]; }catch(err){ var behavior = ""; } //request.setRequestHeader('Content-Type', 'application/json'); request.onload = function() { if(behavior == "errignore"){ sending = 0; } /*Этот кусок вызовется даже при 404’ой ошибке поэтому проверяем статусы ответа*/ if (request.status < 400) { /*Завершаем Обещание с текстом ответа*/ resolve(request.response); } else { /*Обламываемся, и передаём статус ошибки что бы облегчить отладку и поддержку*/ reject(Error(request.statusText)); } }; /*отлавливаем ошибки сети*/ request.onerror = function() { if(behavior == "errignore"){ sending = 0; } if(behavior != "errignore"){ reject(Error("Network Error")); } }; request.send(data); }); } function createobj(){ var flag = 0; var keys = []; var context = arguments[0]; var data = arguments[arguments.length - 1]; //Формируем массив вложенных обьектов for (var i = 1, max = arguments.length; i < max - 1; i++) { keys.push(arguments[i]) } if (keys.length > 1) { if (context[keys[0]] == undefined) { context[keys[0]] = {}; } } else { context[keys[0]] = data; } for (var i = 0; i < keys.length-1; i++) { var value = context[keys[i]]; if (value !== undefined) { if (value[keys[i + 1]] == undefined) { //Создаем следующий value[keys[i + 1]] = {}; if (keys[i + 2] !== undefined) { context = value; } else { value[keys[i + 1]] = data; flag = 1; } } else { //Идем дальше (обьект есть уже) context = value; } } else { //Посыпалось } } //Заплатка чтобы перезаписывать значение в существующем обьекте //Не выполнять если в конец этого обьекта уже было записано значение if(flag == 0){ if(keys[keys.length-1] == keys[i],data){ try{ context[keys[i]]= data; }catch(err){ } } } } function currentDay() { var d = new Date(); var dd = d.getDay(); var weekday = new Array(7); weekday[0] = "Sun"; weekday[1] = "Mon"; weekday[2] = "Tue"; weekday[3] = "Wed"; weekday[4] = "Thu"; weekday[5] = "Fri"; weekday[6] = "Sat"; return weekday[dd]; } function currentTime() { var d = new Date() var hh = d.getHours(); if (hh < 10) hh = '0' + hh; var mm = d.getMinutes(); if (mm < 10) mm = '0' + mm; var ss = d.getSeconds(); if (ss < 10) ss = '0' + ss; return hh + ':' + mm + ':' + ss; } function putjson(id,data){ $('#'+id).iPut({ jsonData: data, name: id }); } function getCookie(cname) { let name = cname + "="; let decodedCookie = decodeURIComponent(document.cookie); let ca = decodedCookie.split(';'); for(let i = 0; i = b && t <= e); }, opendialog:{ tovarcoming: function(){ $('#tovarcomingbox').show().animateCss('fadeInUp'); $('#buttonsavecoming').attr('disabled', false); $('#spisaty_nalichnye_iz_kassy_n').prop('checked', false); $('#spisaty_nalichnye_iz_kassy_y').prop('checked', false); $('#newdocumentBox').hide(); try{ var prov_arr = $.map(preload["providers"], function(value, index) { return [value]; }); if(prov_arr.length > 0){ $("#products_sklad_coming_form_provider_box").show(); prov_arr.unshift({ title: lang["n"], id: 0 }) jPut["products_sklad_coming_form_provider"].data = prov_arr; }else{ $("#products_sklad_coming_form_provider_box").hide(); } }catch(err){ } }, inventory: function(){ $("#inventoryNowFormSubmit").attr("disabled", false); $('#newInventoryOption').show(); $('#newdocumentBox').hide(); $('#inventory_category_items_box').hide(); $("#inventory_everyone").prop("checked", true); $("#inventory_evryone_items_box").show(); app.main.getjson("/?section=db&db=category_select_tree&responce=1").then(function(json){ console.log(json["products"]); jPut["inventory_category_list"].data = json["products"]; }).catch(function(){ }) $(".inventoryType").off(); $(".inventoryType").on('click', function() { $("#inventory_evryone_items_box").hide(); $('#inventory_category_items_box').hide(); var data = $(this).val(); if (data == "all") { } if (data == "everyone") { $("#inventory_evryone_items_box").show(); } if (data == "category") { $('#inventory_category_items_box').show(); } }) }, }, clearcash:function() { /* if(window.navigator && navigator.serviceWorker) { navigator.serviceWorker.getRegistrations() .then(function(registrations) { for(let registration of registrations) { registration.unregister(); } }); caches.keys().then(function (cachesNames) { console.log("Delete " + document.defaultView.location.origin + " caches"); return Promise.all(cachesNames.map(function (cacheName) { return caches.delete(cacheName).then(function () { console.log("Cache with name " + cacheName + " is deleted"); }); })) }).then(function () { console.log("All " + document.defaultView.location.origin + " caches are deleted"); }); } */ }, logout: function(){ $('#logoutbox').show().animateCss('fadeInUp'); $("#logoutboxes").css("padding-top", ($('#logoutbox').height() / 2) - 100); }, opensmenaask: function(){ $("#openSmenaAskBox").show().animateCss('fadeInUp'); $("#openSmenaAskboxes").css("padding-top", ($("#openSmenaAskBox").height() / 2) - 70); }, discountforsale: function(){ $("#discountforsalebox").show().animateCss('fadeInUp'); $("#discountforsaleboxes").css("padding-top", ($("#discountforsalebox").height() / 2) - 70); }, dialogbox:{ close: function(el){ var id = el.closest(".dialogbox").attr('id'); $('#'+id).animateCss('fadeOutDown', function(){$('#'+id).hide()}); }, }, syncserver:{ send: function(){ var items = []; var desktop_settings = {}; var desktop_archive = []; try{ desktop_settings = preload["desktop_settings"][currentsklad][currentzal][currentdesktop] }catch(err){ } try{ items = preload["basket"][currentsklad][currentzal][currentdesktop]; }catch(err){ } try{ desktop_archive = $.map(preload["desktop_archive"][currentsklad][currentzal][currentdesktop], function(value, index) { return [value]; }); }catch(err){ } desktop_archive.unshift({ time: desktop_settings["time"], date: desktop_settings["date"], zal: desktop_settings["zal"], desktop: desktop_settings["desktop"], sklad: desktop_settings["sklad"], title: desktop_settings["title"], id: desktop_settings["id"], current: 1, products: items, info: desktop_settings, }); console.log("desktop_archive",desktop_archive); uploadsynctime = + new Date(); //unix time app.main.basketsyncstatus(1); $.ajax({ type: 'POST', async: true, url: "/?section=db&db=orders_edit&sql=basket&action=sync&desktop="+currentdesktop+"&synctime="+uploadsynctime, dataType: 'json', data: JSON.stringify(desktop_archive), success: function(e) { if(e.synctime >= uploadsynctime){ /*Если время которое вернулось меньше чем то что уже должно быть (последнего запроса)*/ app.main.basketsyncstatus(0); //Пушим меседж о том что все синхронизировано try { /*После каждого сохранения данных и синхронизации с сервером пушить сообщения*/ socket.emit(preload.apikey, JSON.stringify({ "send": "all", "param": "sync", "sklad": currentsklad, "zal": currentzal, "desktop": currentdesktop })); } catch(err) { console.log("Не удалось отправить пуш уведосление"); } }else{ //app.main.basketsyncstatus(false); //false не выводим так как а вдруг старый запрос ответит позже чем последний } }, error: function(err) { app.main.basketsyncstatus(2); } }); console.group("Сохранили на сервер"); console.log("Стол c заказами", desktop_archive); console.groupEnd(); }, hall: function(){ if (preload["sklad"][currentsklad]["serversynk"] == 1) { app.main.getjson("/?section=db&db=halldesktop&sklad=" + currentsklad + "&zal=" + currentzal).then(function(json) { try { var halldesktop = $.map(preload["desktop"][currentsklad][currentzal], function(value, index) { return [value]; }); } catch (err) { var halldesktop = []; halldesktop[0] = { id: "0", }; console.log("Не удалось получить список столов на этом зале"); } halldesktop.forEach(function(entry) { // console.log("ЗАКАЗЫ", json.items[entry.id]); try { createobj(preload, "basket", currentsklad, currentzal, entry.id, json.items[entry.id][0]["products"]); // var arclist1 = arclist.shift(); var arcitems = json.items[entry.id]; var newarcitemsarr = []; for (i = 1; i < arcitems.length; i++) { newarcitemsarr.push(arcitems[i]); } createobj(preload, "desktop_archive", currentsklad, currentzal, entry.id, newarcitemsarr); } catch (err) { console.log("на этом слоле нет ничего " + entry.id) createobj(preload, "basket", currentsklad, currentzal, entry.id, {}); createobj(preload, "desktop_archive", currentsklad, currentzal, entry.id, {}); } }); app.halldesktop.desktopstatus(); }) } }, load: function(desktopid){ app.main.basketsyncstatus(1); loadsynctime = + new Date(); //unix time $.ajax({ type: 'GET', async: true, url: "/?section=db&db=orders_edit&sql=basket&action=download&desktop="+desktopid+"&synctime="+loadsynctime, dataType: 'json', success: function(e) { if(e.synctime >= loadsynctime){ /*Если время которое вернулось меньше чем то что уже должно быть (последнего запроса)*/ app.main.basketsyncstatus(0); //Пушим меседж о том что все синхронизировано if(e.items != null){ var thisdesctop = e.items[0]; try{ createobj(preload, "basket", currentsklad, currentzal, currentdesktop, e.items[0]["products"]); delete e.items[0]["products"]; }catch(err){ createobj(preload, "basket", currentsklad, currentzal, currentdesktop, {}); } if(e.items[0] != undefined){ createobj(preload, "desktop_settings", currentsklad, currentzal, currentdesktop, e.items[0]); }else{ createobj(preload, "desktop_settings", currentsklad, currentzal, currentdesktop, {}); createobj(preload, "desktop_settings", currentsklad, currentzal, currentdesktop, "orderid", ""); createobj(preload, "desktop_settings", currentsklad, currentzal, currentdesktop, "time", ""); createobj(preload, "desktop_settings", currentsklad, currentzal, currentdesktop, "date", ""); } try{ var s = $.map(e.items, function(value, index) { if(index > 0){ return [value]; } }); console.log("e.items",s); createobj(preload, "desktop_archive", currentsklad, currentzal, currentdesktop, s); }catch(err){ } app.halldesktop.opendesktop(desktopid,0); } }else{ //app.main.basketsyncstatus(false); //false не выводим так как а вдруг старый запрос ответит позже чем последний } }, error: function(err) { app.main.basketsyncstatus(2); } }); }, }, basketsyncstatus:function(e){ switch(e){ case 0: $("#syncinfo_box").html('').show("slow"); break; case 1: $("#syncinfo_box").html('').show("slow"); break; case 2: $("#syncinfo_box").html('').show("slow"); break; } }, openkeyboard: function(){ }, closekeyboard: function(){ //document.body.scrollTop = 0; window.scrollTo(0, 0); }, weight:{ set: function(json){ if($("#ves_ask_ves").hasClass("activeinputcash")){ $("#ves_ask_ves").val(round(json,3)); var cenaza1 = $("#ves_ask_cena").val(); $(".ves_ask_summ").show(); $("#ves_ask_summ").val(CurrencyFormatted(cenaza1*json)); } if($("#cook_ask_ves").hasClass("activeinputcash")){ $("#cook_ask_ves").val(round(json*1000,3)); } if($("#one_ask_kolvo").hasClass("activeinputcash")){ //Обратился клиент что у него весы вбивают штучный товар var unit = $("#one_ask_kolvo").attr("unit"); if(unit != 'pcs'){ $("#one_ask_kolvo").val(round(json,3)); } } }, }, lsTest: function(){ var test = 'test'; try { localStorage.setItem(test, test); localStorage.removeItem(test); return true; } catch(e) { return false; } }, lsgetsize: function(){ var allStrings = ''; for(var key in window.localStorage){ if(window.localStorage.hasOwnProperty(key)){ allStrings += window.localStorage[key]; } } allStrings1 = 3 + ((allStrings.length*16)/(8*1024)); if( allStrings1 >= 5000){ app.main.error("Нет места в локальном хранилище. Для решения проблемы обратитесь в техническую поддержку") } else if( allStrings1 > 4900){ app.main.error("В локальном хранилище осталось менее 100кб памяти. Для решения проблеиы обратитесь в техническую поддержку") } else{ console.log("localstorage еще ок") } return allStrings ? 3 + ((allStrings.length*16)/(8*1024)) : 0; }, ws: function() { console.group("WS"); /*Подключаемся к Websockets*/ var wsurl = "wss://img-1.skyservice.pro/skysocket/" + preload.settings.userbase + "/" + preload.apikey+"/"; function webviewCheck() { if(window.webkit != null) { if (typeof window.webkit.messageHandlers === "undefined") { //console.log("not ios webview") } else { //console.log("ios webview") return "ios_webview" } } if (typeof Android === "undefined") { //console.log("not android webview") } else { //console.log("android webview") return "android_webview" } if (typeof window.cefQuery === "undefined") { //console.log("not cef") } else { //console.log("cef") return "cef_webview" } return "browser" } try{ console.log("ws connect to",wsurl); //socket = new WebSocket(wsurl); socket = new ReconnectingWebSocket(wsurl, null, {reconnectInterval: 2000, timeoutInterval: 5000}); var appVersion = ""; var device_uuid = null; try{ if(localStorage["device_uuid"]){ device_uuid = localStorage["device_uuid"]; }else{ device_uuid = app.print.modules.guid(); localStorage["device_uuid"] = device_uuid } }catch(err){ } try{ //Получить версию приложения для андроид appVersion = Android.getAppVersion(); }catch(err){ } var getDeviceInfo = { "manufacturer":null, "brand":null, "model":null, "hardware":null } try{ //Получить инфо о устройстве getDeviceInfo = JSON.parse(Android.getDeviceInfo()); }catch(err){ } try{ //Получить версию приложения для Windows var request = { method: "getAppVersion" } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { appVersion = response }, }); }catch(err){ } socket.onopen = function (event) { console.log("connected"); // try{ // setInterval(function(){ // socket.emit(preload.apikey,JSON.stringify({ "send":"self", "command": "ping" })); // console.warn("ws ping") // },30000) // }catch(err){ // } try{ socket.emit(preload.apikey,JSON.stringify({ "send":"info", "userInfo":{ "os":os +' '+ osVersion, "browser":browser + ' ' + majorVersion + ' (' + version + ')', "appVersion": appVersion, "appName":webviewCheck(), "ip":preload.settings.IP, "lang":currentlang, "device_uuid":device_uuid, "manufacturer":getDeviceInfo.manufacturer, "brand":getDeviceInfo.brand, "model":getDeviceInfo.model, "hardware":getDeviceInfo.hardware, "userLogin":preload.settings.user, "country" : preload.settings.country, "userName":preload.users[currentsklad][preload.settings.userid]["user_name"], "app":{ "appVersion": appVersion, "appName":webviewCheck(), }, "device":{ "uuidDevice":device_uuid, "os":os +' '+ osVersion, "browser":browser + ' ' + majorVersion + ' (' + version + ')', "hardware":getDeviceInfo.hardware, "manufacturer":getDeviceInfo.manufacturer, "brand":getDeviceInfo.brand, "model":getDeviceInfo.model, }, "geolocation":{ "ip":preload.settings.IP, "country" : preload.settings.country, //preload["settings"]["geoip"]["country"] "lang":currentlang, "regionName":preload.settings.country, //preload["settings"]["geoip"]["regionName"], "city":preload.settings.country //preload["settings"]["geoip"]["city"] }, "user":{ "userName":preload.users[currentsklad][preload.settings.userid]["user_name"], "userLogin":preload.settings.user, }, "tradepoint":{ tradepointId:currentsklad, tradepointName:preload["sklad"][currentsklad]["title"] } } })); }catch(err){ console.error(err); } window.isOnline = true; } socket.onclose = function(event) { console.log("WebSocket is closed now"); console.log(event.code); console.log(event.reason); window.isOnline = false; }; socket.onerror = function (event) { console.log("WebSocket error"); console.log(event.code); console.log(event.reason); window.isOnline = false; } socket.onmessage = function(event) { console.log("ws event:",event); var message = JSON.parse(event.data); console.log("ws message", message) app.main.accept(message); }; socket.emit = function(room,data){ console.log("СТРОКА",data) socket.send(data); } window.onbeforeunload = function(){ socket.close(); } }catch(err){ } /*каждую пол секунду меняем состояние индикатора socketserver*/ setInterval(function() { if (window.isOnline) { if (status == "false") { /*app.main.message(lang["serverisreconnect"]);*/ if (nolicense == 0) { sendtopay(JSON.stringify(sell2arc)); } } status = "true"; if (localStorage["archive_" + userbase]) { /*Ставим желтый индикатор*/ $onlineindicator.css("background", "#FFD95C"); /*Пытаемся отправить*/ var sell2arc = JSON.parse(localStorage["archive_" + userbase]); if (nolicense == 0) { sendtopay(JSON.stringify(sell2arc)); } } else { /*Ставим зелёный индикатор*/ $onlineindicator.css("background", "#5cb85c"); } } else { if (status == "true") { /*app.main.error(lang["serverisdisconect"]);*/ } status = "false"; if (localStorage["archive_" + userbase]) { /*Ставим желтый индикатор*/ $onlineindicator.css("background", "#FFD95C"); /*Пытаемся отправить*/ var sell2arc = JSON.parse(localStorage["archive_" + userbase]); if (nolicense == 0) { sendtopay(JSON.stringify(sell2arc)); } } else { /*Ставим красный индикатор*/ $onlineindicator.css("background", "#ff0000"); //$onlineindicator.css("background", "#5cb85c"); } } }, 5000); console.groupEnd(); }, getjson: function(url, data, obj) { /*Возвращаем новое Обещание*/ return new Promise(function(resolve, reject) { xhr(url, data, obj).then(function(json) { app.main.loader("hide"); try{ var content = JSON.parse(json); }catch(err){ /*Раз json не получилось расспарсить то отдаем пусто*/ var content = {}; } if (content.status == "done") { resolve(content); }; if (content.status == "empty") { resolve(content); }; if (content.status == "error") { reject(content); }; if (content.status == "denied") { reject(lang["dostupZakrit"]); }; if (content.status == "nopayments") { nolicense = 1; app.main.error(lang["servicepausedpopolniteschetdliaprod"]); $("#license_service_paused").show(); reject(lang["servicepausedpopolniteschetdliaprod"]); }; if (content.status == "incorrect") { reject(lang["incorrect"]); }; if (content.status == "mysqlerror") { reject(lang["mysqlError"]); }; if (content.status == "invalidpass") { reject(lang["passincorr"]); } if (content.status == "noperms") { reject(lang["no_permissions"]); } if (content.status == "blocked") { reject(lang["account_blocked_by_higher_admin"]); } if (content.status == "unregister") { reject(lang["phone_not_registered"]); } if (content.status == "invalidphone") { reject(lang["phone_too_short"]); } if (content.status == "noauth") { /*app.main.noauth();*/ alert(lang["notauthorized"]); document.location.reload(true); reject(lang["notauthorized"]); }; }, function(error) { app.main.loader("hide"); try{ var behavior = obj["response"]; }catch(err){ var behavior = ""; } if(behavior != "errignore"){ app.main.connect_error(); } reject(error); }); }); }, b64DecodeUnicode: function(str) { var pre = atob(str); var preArr = pre.split(''); var newArr = []; preArr.map(function(c) { newArr.push('%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)) }); return decodeURIComponent(newArr.join('')); }, Base64: { // private property _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", // public method for encoding encode: function(input,utf8) { var output = ""; if (utf8) { input = this.utf8_cp1251(input); } // Проверка наличия нативного метода кодирования if (typeof btoa != "undefined") { output = btoa(input); } else { var chr1, chr2, chr3, enc1, enc2, enc3, enc4; var i = 0; while (i < input.length) { chr1 = input.charCodeAt(i++); chr2 = input.charCodeAt(i++); chr3 = input.charCodeAt(i++); enc1 = chr1 >> 2; enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); enc4 = chr3 & 63; if (isNaN(chr2)) { enc3 = enc4 = 64; } else if (isNaN(chr3)) { enc4 = 64; } output = output + this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) + this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4); } } return output; }, // public method for decoding decode: function(input,utf8) { var output = ""; // Проверка наличия нативного метода декодирования if (typeof atob != "undefined") { output = atob(input); } else { var chr1, chr2, chr3; var enc1, enc2, enc3, enc4; var i = 0; input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); while (i < input.length) { enc1 = this._keyStr.indexOf(input.charAt(i++)); enc2 = this._keyStr.indexOf(input.charAt(i++)); enc3 = this._keyStr.indexOf(input.charAt(i++)); enc4 = this._keyStr.indexOf(input.charAt(i++)); chr1 = (enc1 << 2) | (enc2 >> 4); chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); chr3 = ((enc3 & 3) << 6) | enc4; output = output + String.fromCharCode(chr1); if (enc3 != 64) { output = output + String.fromCharCode(chr2); } if (enc4 != 64) { output = output + String.fromCharCode(chr3); } } } if (utf8) { output = this.cp1251_utf8(output); } return output; }, // private method for UTF-8 encoding utf8_encode: function(string) { string = string.replace(/\r\n/g, "\n"); var utftext = ""; for (var n = 0; n < string.length; n++) { var c = string.charCodeAt(n); if (c < 128) { utftext += String.fromCharCode(c); } else if ((c > 127) && (c < 2048)) { utftext += String.fromCharCode((c >> 6) | 192); utftext += String.fromCharCode((c & 63) | 128); } else { utftext += String.fromCharCode((c >> 12) | 224); utftext += String.fromCharCode(((c >> 6) & 63) | 128); utftext += String.fromCharCode((c & 63) | 128); } } return utftext; }, // private method for UTF-8 decoding utf8_decode: function(utftext) { var string = ""; var i = 0; var c = c1 = c2 = 0; while (i < utftext.length) { c = utftext.charCodeAt(i); if (c < 128) { string += String.fromCharCode(c); i++; } else if ((c > 191) && (c < 224)) { c2 = utftext.charCodeAt(i + 1); string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); i += 2; } else { c2 = utftext.charCodeAt(i + 1); c3 = utftext.charCodeAt(i + 2); string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); i += 3; } } return string; }, utf8_cp1251: function(s){ var L = []; var DMap = { 0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15, 16: 16, 17: 17, 18: 18, 19: 19, 20: 20, 21: 21, 22: 22, 23: 23, 24: 24, 25: 25, 26: 26, 27: 27, 28: 28, 29: 29, 30: 30, 31: 31, 32: 32, 33: 33, 34: 34, 35: 35, 36: 36, 37: 37, 38: 38, 39: 39, 40: 40, 41: 41, 42: 42, 43: 43, 44: 44, 45: 45, 46: 46, 47: 47, 48: 48, 49: 49, 50: 50, 51: 51, 52: 52, 53: 53, 54: 54, 55: 55, 56: 56, 57: 57, 58: 58, 59: 59, 60: 60, 61: 61, 62: 62, 63: 63, 64: 64, 65: 65, 66: 66, 67: 67, 68: 68, 69: 69, 70: 70, 71: 71, 72: 72, 73: 73, 74: 74, 75: 75, 76: 76, 77: 77, 78: 78, 79: 79, 80: 80, 81: 81, 82: 82, 83: 83, 84: 84, 85: 85, 86: 86, 87: 87, 88: 88, 89: 89, 90: 90, 91: 91, 92: 92, 93: 93, 94: 94, 95: 95, 96: 96, 97: 97, 98: 98, 99: 99, 100: 100, 101: 101, 102: 102, 103: 103, 104: 104, 105: 105, 106: 106, 107: 107, 108: 108, 109: 109, 110: 110, 111: 111, 112: 112, 113: 113, 114: 114, 115: 115, 116: 116, 117: 117, 118: 118, 119: 119, 120: 120, 121: 121, 122: 122, 123: 123, 124: 124, 125: 125, 126: 126, 127: 127, 1027: 129, 8225: 135, 1046: 198, 8222: 132, 1047: 199, 1168: 165, 1048: 200, 1113: 154, 1049: 201, 1045: 197, 1050: 202, 1028: 170, 160: 160, 1040: 192, 1051: 203, 164: 164, 166: 166, 167: 167, 169: 169, 171: 171, 172: 172, 173: 173, 174: 174, 1053: 205, 176: 176, 177: 177, 1114: 156, 181: 181, 182: 182, 183: 183, 8221: 148, 187: 187, 1029: 189, 1056: 208, 1057: 209, 1058: 210, 8364: 136, 1112: 188, 1115: 158, 1059: 211, 1060: 212, 1030: 178, 1061: 213, 1062: 214, 1063: 215, 1116: 157, 1064: 216, 1065: 217, 1031: 175, 1066: 218, 1067: 219, 1068: 220, 1069: 221, 1070: 222, 1032: 163, 8226: 149, 1071: 223, 1072: 224, 8482: 153, 1073: 225, 8240: 137, 1118: 162, 1074: 226, 1110: 179, 8230: 133, 1075: 227, 1033: 138, 1076: 228, 1077: 229, 8211: 150, 1078: 230, 1119: 159, 1079: 231, 1042: 194, 1080: 232, 1034: 140, 1025: 168, 1081: 233, 1082: 234, 8212: 151, 1083: 235, 1169: 180, 1084: 236, 1052: 204, 1085: 237, 1035: 142, 1086: 238, 1087: 239, 1088: 240, 1089: 241, 1090: 242, 1036: 141, 1041: 193, 1091: 243, 1092: 244, 8224: 134, 1093: 245, 8470: 185, 1094: 246, 1054: 206, 1095: 247, 1096: 248, 8249: 139, 1097: 249, 1098: 250, 1044: 196, 1099: 251, 1111: 191, 1055: 207, 1100: 252, 1038: 161, 8220: 147, 1101: 253, 8250: 155, 1102: 254, 8216: 145, 1103: 255, 1043: 195, 1105: 184, 1039: 143, 1026: 128, 1106: 144, 8218: 130, 1107: 131, 8217: 146, 1108: 186, 1109: 190 }; for (var i = 0; i < s.length; i++) { var ord = s.charCodeAt(i); /** * Этот jAlert все ломал, если испанский поставиить на utf8 */ //if (!(ord in DMap)) //jAlert("Character " + s.charAt(i) + " isn't supported by win1251!"); L.push(String.fromCharCode(DMap[ord])); } return L.join(''); }, cp1251_utf8: function(str){ if (!str) return null; var charmap = unescape( "%u0402%u0403%u201A%u0453%u201E%u2026%u2020%u2021%u20AC%u2030%u0409%u2039%u040A%u040C%u040B%u040F" + "%u0452%u2018%u2019%u201C%u201D%u2022%u2013%u2014%u0000%u2122%u0459%u203A%u045A%u045C%u045B%u045F" + "%u00A0%u040E%u045E%u0408%u00A4%u0490%u00A6%u00A7%u0401%u00A9%u0404%u00AB%u00AC%u00AD%u00AE%u0407" + "%u00B0%u00B1%u0406%u0456%u0491%u00B5%u00B6%u00B7%u0451%u2116%u0454%u00BB%u0458%u0405%u0455%u0457"); var code2char = function (code) { if (code >= 0xC0 && code <= 0xFF) return String.fromCharCode(code - 0xC0 + 0x0410); if (code >= 0x80 && code <= 0xBF) return charmap.charAt(code - 0x80); return String.fromCharCode(code); }; var res = ""; for (var i = 0; i < str.length; i++) res = res + code2char(str.charCodeAt(i)); return res; }, }, getIP: function() { myIP = "127.0.0.1"; }, initphone: function() { var $phone = $(".phone"); $phone.intlTelInput({ geoIpLookup: function(callback) { //$.get("https://ipinfo.io", function() {}, "jsonp").always(function(resp) { $.get("https://online.skyservice.pro/?section=geoip", function() {}, "jsonp").always(function(resp) { var countryCode = (resp && resp.country) ? resp.country : ""; callback(countryCode); }); }, initialCountry: "auto", /* nationalMode: false, numberType: "MOBILE", onlyCountries: ['us', 'gb', 'ch', 'ca', 'do'], */ preferredCountries: ["ua", "md", "ge", "az", "am", "kz", "kg", "tj", "tm", "uz", "ru", "by"], separateDialCode: true, utilsScript: "/templates/js/utils.js" }); $phone.on('keyup', function() { var phone = $(this).intlTelInput("getNumber"); var name = $(this).attr("data"); $("input[name='" + name + "']").val(phone); console.log("Вводимый телефон:", phone); }); $(".country-list").on('click', function() { var $input = $(this).closest(".intl-tel-input").find("input"); var phone = $input.intlTelInput("getNumber"); var name = $input.attr("data"); $("input[name='" + name + "']").val(phone); console.log("Вводимый телефон:", phone); }); }, formvalid: function(id) { formsaved = true; formerrors = []; $(id).find(".inputerror").removeClass("inputerror"); $(id + " input[compare], " + id + " textarea[compare]").on('keyup', function() { $(this).removeClass("inputerror"); }) /*Проверка телефона*/ $(id + " input[compare='phone']").each(function(i) { if ($(this).val().length <= 4) { formerrors.push(lang["shortphone"]); $(this).addClass("inputerror"); $(this).animateCss("shake"); formsaved = false; } }); /*Проверка radio button*/ var radioarr = {}; $(id + " input[compare='chacked']").each(function(i) { var radioname = $(this).attr("name"); if (!app.main.ifobject(radioarr, radioname)) { radioarr[radioname] = []; } radioarr[radioname].push($(this)); }); var radioarr1 = $.map(radioarr, function(value, index) { return [value]; }); for (var di = 0; di < radioarr1.length; di++) { console.log("radioarr1",radioarr1) var metka = 0; for (var di1 = 0; di1 < radioarr1[di].length; di1++) { console.log("radioarr2",radioarr1[di][di1]) var $tttt = radioarr1[di][di1]; if ($tttt.is(':checked')) { metka = 1; } } if(metka == 0){ formerrors.push(lang["Ne_vybran_element"]); $tttt.closest("div").animateCss("shake"); $tttt.closest("div").addClass("inputerror"); formsaved = false; } } console.log("radio", radioarr) /*Проверка количества*/ $(id + " input[compare='kolvo']").each(function(i) { var data = $(this).val(); if (data.length <= 0 || (data <= 0 || data == "") ) { formerrors.push(lang["Kolichestvo_ne_moghet_byty_pustym"]); $(this).animateCss("shake"); $(this).addClass("inputerror"); formsaved = false; } }); /*Проверка штрихкода*/ $(id + " input[compare='barcode']").each(function(i) { if ($(this).val().length <= 7) { formerrors.push(lang["shortbarcode"]); $(this).animateCss("shake"); $(this).addClass("inputerror"); formsaved = false; } }); /*Проверка поля сортировки*/ $(id + " textarea[compare='sort'], " + id + " input[compare='sort']").each(function(i) { if ($(this).val().length < 1) { formerrors.push(lang["noemptysort"]); $(this).animateCss("shake"); $(this).addClass("inputerror"); formsaved = false; } }); switch (id) { case '#products_all_edit_form': if ($('#prod-edit-unique').is(':checked')) { break; } default: /*Проверка имени*/ $(id + " textarea[compare='name'], " + id + " input[compare='name']").each(function(i) { if ($(this).val().length < 1) { formerrors.push(lang["noemptyname"]); $(this).animateCss("shake"); $(this).addClass("inputerror"); formsaved = false; } }); } /*Проверка имени*/ var massarr = []; $(id + " textarea[compare='namegroope'], " + id + " input[compare='namegroope']").each(function(i) { massarr[i] = $(this).val(); }) $(id + " textarea[compare='namegroope'], " + id + " input[compare='namegroope']").each(function(i) { var $thisinput = $(this); massarr.forEach(function(item, key) { if (key != i) { console.log("formvalid -> namegroope", item + " " + $thisinput.val()) if (item == $thisinput.val()) { /*formerrors.push(lang["noemptyname"]);*/ formerrors.push("Имена не монут быть одинаковыми"); $thisinput.animateCss("shake"); $thisinput.addClass("inputerror"); formsaved = false; } } }); if ($(this).val().length < 1) { formerrors.push(lang["noemptyname"]); $(this).animateCss("shake"); $(this).addClass("inputerror"); formsaved = false; } $("#my-profile .inputerror").off(); $("#my-profile .inputerror").on('keyup', function() { $(".inputerror").removeClass("inputerror"); }); }); /*Проверка цены закупки*/ $(id + " textarea[compare='cena'], " + id + " input[compare='cena']").each(function(i) { if ($(this).val().length < 1) { formerrors.push(lang["noemptycena"]); $(this).animateCss("shake"); $(this).addClass("inputerror"); formsaved = false; } }); /*Проверка пароля*/ var passagain = []; $(id + " input[compare='password']").each(function(i) { passagain.push(this.value); if (i == 0) { if ($(this).val().length > 0) { if ($(this).val().length < 4) { formerrors.push(lang["shortpassword"]); $(this).animateCss("shake"); $(this).addClass("inputerror"); formsaved = false; } } } }); if (passagain.length == 2) { if (passagain[0] != passagain[1]) { $(id + " input[compare='password']").addClass("inputerror"); formerrors.push(lang["passwordmismatch"]); formsaved = false; } } /*Проверка pin*/ $(id + " input[compare='pin']").each(function(i) { if ($(this).val().length !== 4) { formerrors.push(lang["incorrentpin"]); $(this).animateCss("shake"); $(this).addClass("inputerror"); formsaved = false; } }); return formsaved; }, fon: { init: function() { /*Загрузка фона при открытии*/ if (localStorage["background_" + userbase]) { app.main.fon.clear(); $("body").addClass(localStorage["background_" + userbase]); } else { $("body").addClass("body_back_day"); } /*обработчик открытия*/ $('.changebackground').click(function() { $("#changebackgroundbox").show(); }); }, change: { color: function(c) { app.main.fon.clear(); $("body").addClass("body_back_" + c); localStorage["background_" + userbase] = "body_back_" + c; app.main.fon.lepestok("body_back_" + c); }, }, lepestok: function(c) { switch (c) { case "body_back_day": liniyacolor = "rgb(168, 0, 0)"; break; case "body_back_night": liniyacolor = "rgb(168, 0, 0)"; break; case "body_back_gray": liniyacolor = "rgb(168, 0, 0)"; break; case "body_back_gradient_1": liniyacolor = "rgb(100, 45, 94)"; break; case "body_back_gradient_2": liniyacolor = "rgb(92, 184, 92)"; break; case "body_back_gradient_3": liniyacolor = "rgb(42, 118, 121)"; break; case "body_back_flower_1": liniyacolor = "rgb(0, 31, 168)"; break; case "body_back_299f53": liniyacolor = "rgb(0, 31, 168)"; break; case "body_back_6a2d84": liniyacolor = "rgb(153, 72, 187)"; break; case "body_back_16a085": liniyacolor = "rgb(67, 209, 181)"; break; case "body_back_2c3e50": liniyacolor = "rgb(77, 107, 137)"; break; case "body_back_f1c40f": liniyacolor = "rgb(237, 28, 0)"; break; case "body_back_dedede": liniyacolor = "rgb(184, 16, 0)"; break; case "body_back_f39c12": liniyacolor = "rgb(237, 28, 0)"; break; case "body_back_2980b9": liniyacolor = "rgb(21, 79, 117)"; break; } /*$(".liniya").css("background", liniyacolor);*/ }, clear: function() { $("#changebackgroundbox").hide(); $("body").removeClass("body_back_gray"); $("body").removeClass("body_back_day"); $("body").removeClass("body_back_night"); $("body").removeClass("body_back_gray"); $("body").removeClass("body_back_flower_1"); $("body").removeClass("body_back_gradient_3"); $("body").removeClass("body_back_gradient_2"); $("body").removeClass("body_back_gradient_1"); $("body").removeClass("body_back_299f53"); $("body").removeClass("body_back_6a2d84"); $("body").removeClass("body_back_16a085"); $("body").removeClass("body_back_2c3e50"); $("body").removeClass("body_back_f1c40f"); $("body").removeClass("body_back_dedede"); $("body").removeClass("body_back_f39c12"); $("body").removeClass("body_back_2980b9"); }, }, payform_keytrigger: { init: function() { $(document).keyup(function(event) { if(event.key === ","){ event.key = "."; } //ввод сдачи с клавиатуры //thisactivekeyboard = "paymentbox"; try { switch (thisactivekeyboard) { case "paymentbox": if (event.key >= 0 && event.key <= 9 || event.key === ".") { var valll = $activecashinput.val() var marge = valll + "" + String(event.key); console.log(marge); $activecashinput.val(marge) } if (event.keyCode == 8) { var valll = $activecashinput.val(); $activecashinput.val(valll.substring(0, valll.length - 1)) } var paycash = $("#paycash").val(); var payvisa = $("#payvisa").val(); var newcashback = paycash - (allcena - payvisa); $("#cashback").val(newcashback.toFixed(2)); break; case "enterpin": if (event.key >= 0 && event.key <= 9) { obj["pinlength"] = 4; obj["keyvalue"] = event.key; app.pin.pinkeyevent(obj); } if (event.keyCode == 8) { obj["pinlength"] = 4; obj["keyvalue"] = "back"; app.pin.pinkeyevent(obj); } break; case "goodsaddbox": if (event.key >= 0 && event.key <= 9 || event.key === ".") { var valll = $activeaskinput.val() var marge = valll + "" + String(event.key); console.log(marge); $activeaskinput.val(marge) } if (event.keyCode == 8) { var valll = $activeaskinput.val(); $activeaskinput.val(valll.substring(0, valll.length - 1)) } break; } } catch (err) { console.log("payform_keytrigger: поле для ввода не выбрано"); } }) }, }, barcode: { init: function() { $(document).keydown(function(e) { if (!$("input, textarea").is(":focus")) { if (String.fromCharCode(e.which) !== "13") { barcodescaned = barcodescaned + "" + String.fromCharCode(e.which); } setTimeout(function() { if (barcodescaned.length <= 5) { barcodescaned = ""; } else { app.main.barcode.set.set(barcodescaned); akcizBarcodeScaned = barcodescaned; barcodescaned = ""; } }, 400); } }); }, set: { set: function(barcodescaned) { app.main.message(barcodescaned); try { var barcodestring = Number(barcodescaned.replace(/[^\d+]+/g, "")); console.log("scanned:", barcodestring); var barcodes = $.map(preload["barcodes"][currentsklad][barcodestring], function(value, index) { return [value]; }); if (barcodes["0"] == undefined || barcodes["0"] == null || barcodes["0"] == ""){ app.main.error(lang["barcodenotfound"]); } else { console.log("Штрихкод", barcodes); var lengtharr = barcodes.length; switch (barcodes[0]["type"]) { case "client": /*Клиент*/ if (lengtharr > 1) { for (var i = 0; i < lengtharr; i++) { alert("Найдено несколько клиентов Err:"+barcodes[i]["barcode"]); } } else { /*клиент найден*/ app.clients.change(barcodes[0]["id"]) } break; case "tovar": /*Товар*/ if (lengtharr > 1) { var newtovararr = []; for (var i = 0; i < barcodes.length; i++) { var tovar = preload["products"][currentsklad][barcodes[i]["tovcid"]]; if(tovar != undefined){ console.log("tovar",tovar) newtovararr.push(tovar); }else{ try{ var parr = preload["barcodescope"][currentsklad][barcodes[i]["tovcid"]]["parrent"] var tovar = preload["products"][currentsklad][parr]; newtovararr.push(tovar); }catch(err){ //Скорей всего один из товаров к которому добавлен штрихкод или не выставлен на продажу или вовсе удалён } } // console.log(">>>>>>>>>>>>.",tovar) } $("#neskolkotovarovbox").show().animateCss("fadeInUp"); $('#neskolkotovarov').iPut({ jsonData: newtovararr, irepeat: "mods", name: 'goods' }); /*Выбор товара*/ $(".trigger_addbasket").off(); $(".trigger_addbasket").on('click', function() { var obj = []; obj["tovarid"] = $(this).attr("data"); app.main.transformfunc("#tov" + obj["tovarid"]); obj["mods"] = $(this).attr("mods"); app.terminal.productsinit(obj); $('#neskolkotovarovbox').animateCss('fadeOutDown', function(){$('#neskolkotovarovbox').hide()}); }); } else { var tovidb = Number(preload["barcodes"][currentsklad][Number(barcodes[0]["barcode"])][0]["tovcid"]); try{ var thistype = preload["products"][currentsklad][tovidb]["type"]; }catch(err){ var quantity = preload["barcodescope"][currentsklad][tovidb]["quantity"]; var tovidb = preload["barcodescope"][currentsklad][tovidb]["parrent"]; /*Эта штука позволяет пользователю выбрать товар (что не очень прикольно когда он 1) и указать вес технической карты*/ if(quantity != "por"){ var thistype = "cook"; }else{ var thistype = "mod"; } } if(thistype == "cook" || thistype == "manufacture"){ //Если это приготовление то не добавлять сразу все в корзину, а предложить выбрать var newtovararr = []; newtovararr.push(preload["products"][currentsklad][tovidb]); $("#neskolkotovarovbox").show().animateCss("fadeInUp"); $('#neskolkotovarov').iPut({ jsonData: newtovararr, irepeat: "mods", name: 'goods' }); /*Выбор товара*/ $(".trigger_addbasket").off(); $(".trigger_addbasket").on('click', function() { var obj = []; obj["tovarid"] = $(this).attr("data"); app.main.transformfunc("#tov" + obj["tovarid"]); obj["mods"] = $(this).attr("mods"); app.terminal.productsinit(obj); $('#neskolkotovarovbox').animateCss('fadeOutDown', function(){$('#neskolkotovarovbox').hide()}); }); }else{ var obj = []; obj["tovarid"] = tovidb; /*Если это просто товар не приготовление то сразу бросаем в корзину*/ obj["kolvo"] = 1; try { if(thistype == "ves"){ app.terminal.productsinit(obj); }else{ app.terminal.basket.add.tobasket(obj); } } catch (err) { app.main.error(lang["tovarnenaideniliudalen"]); } } } break; } } } catch (err) { console.log(err) app.main.error(lang["barcodenotfound"]+": Error: 3100"); } }, }, }, accept: function(command) { console.log("accept",command); if(command.param == "portmoneResult"){ try{ app.main.message("Portmone: +"+command.sum); console.log("WS PORTMONE",command) $("#portmoneqrpay").hide(); var thisbasket = app.terminal.getbasket(); if(command.data == thisbasket.info.portmone.orderID && command.sum == thisbasket.info.portmone.sum){ app.terminal.paynow(thisbasket); }else{ //app.main.error("Платіж от") } }catch(err){ console.error("Не удалось принять платеж Portmone"); } } if (command.param == "ping") { console.log("ping"); } if(command.param == "rebootnow"){ setTimeout(function(){ document.location.reload(true); },200) } if(command.param == "newOnlineOrder"){ if(preload.settings.notificate_sound == true && (command.sklad == 0 || command.sklad == currentsklad)){ var soundbox = "audio"; try{ if(preload.settings.skymarketsound){ var soundbox = "sound_"+preload.settings.skymarketsound; } }catch(err){ } document.getElementById(soundbox).play().then(function(e){ console.log("Звук проиграло") $mutesoundicon.hide(); }, function(){ var top = ($(document).height() - $("#loadImg").height()) / 2; var right = (($(document).width() - $("#loadImg").width()) / 2)+30 $mutesoundicon.animate({top: top+"px", right: right+"px"}, 500); }) } console.log("newOnlineOrder",command); app.notification.init() } if (command.param == "call") { callingPhone = command.phone; app.clients.callcenter.init(); } if (command.param == "my_device_info") { preload.callcenter[command.my_device_info.deviceId] = command.my_device_info; var phone = ""; socket.emit(apikey, JSON.stringify({ "send": "all", "device_info": command.my_device_info, "param": "tophone", "phone": phone, })); } if (preload["sklad"][currentsklad]["serversynk"] == 1 && command.param == "sync") { console.log("ws",command); if(command.sklad == currentsklad && command.zal == currentzal){ if(command.desktop == currentdesktop){ //если открыт этот же стол то грузить его инфу if(command.desktop > 0){ app.main.syncserver.load(command.desktop); } }else{ //если открыт другой стол то грузить карту столов app.halldesktop.start(); } } } if (preload.settings.pushmsg == 1 && command.param == "addbasket") { /*Добавляем в корзину*/ var obj = []; obj["tovarid"] = command["tovarid"]; obj["wspush"] = 1; /*Что-бы не циклилось*/ obj["wsjson"] = command; //app.main.transformfunc("#tov" + obj["tovarid"]); //obj["mods"] = $(this).attr("mods"); app.terminal.productsinit(obj); app.halldesktop.start(); } if (preload.settings.pushmsg == 1 && command.param == "clearbasket") { var obj = {}; obj["currentsklad"] = command["sklad"]; obj["currentzal"] = command["zal"]; obj["currentdesktop"] = command["desktop"]; app.terminal.cleardesktop(obj); app.halldesktop.start(); } if (preload.settings.pushmsg == 1 && command.param == "plus") { app.terminal.basket.add.plus({ "currentsklad": command.sklad, "currentzal": command.zal, "currentdesktop": command.desktop, "status": command.status, "tovarid": command.tovarid, "ves": command.ves }); } if (preload.settings.pushmsg == 1 && command.param == "minus") { app.terminal.basket.add.minus({ "currentsklad": command.sklad, "currentzal": command.zal, "currentdesktop": command.desktop, "status": command.status, "tovarid": command.tovarid, "ves": command.ves }); } if (preload.settings.pushmsg == 1 && command.param == "sendbasket") { try{ preload["basket"][command.sklad][command.zal][command.desktop] = command.basket; preload["desktop_archive"][command.sklad][command.zal][command.desktop] = command.archive; preload["desktop_settings"][command.sklad][command.zal][command.desktop] = command.dsettings; //createobj(preload, "basket", command.sklad, command.zal, command.desktop, command.basket); //createobj(preload, "desktop_archive", command.sklad, command.zal, command.desktop, command.archive); //createobj(preload, "desktop_settings", command.sklad, command.zal, command.desktop, command.dsettings); var openthisdesktop = 0; if(currentsklad == command.sklad){ if(currentzal == command.zal){ if(currentdesktop == command.desktop){ openthisdesktop = 1; } } } if(openthisdesktop == 1){ app.halldesktop.opendesktop(command.desktop) }else{ app.terminal.basket.start({ websocket: "no" }); } }catch(err){ console.log("По какой-то причине не удалось выполнить это действие") } } if (command.param == "status") { app.main.message(lang["notificationaccepted"]); } //для tablePayment if (command.send == "getOrder") { // app.main.message(lang["notificationaccepted"]); // var tablesObj = {}; // for(var key in preload.desktop){ // var item = preload.desktop[key]; // for(var key1 in item){ // var item2 = item[key1]; // for(var key3 in item2){ // var item4 = item2[key3]; // tablesObj[key3] = { // tradepointId:key, // hallId:key1, // tableId:key3 // } // } // } // } // command.tableId = 1; // var tableLocation = tablesObj[command.tableId]; // var productsArr = $.map(preload["basket"][tableLocation.tradepointId][tableLocation.hallId][tableLocation.tableId], function(value, index) { // return [value]; // }); // var productsString = []; // for(var key in productsArr){ // var productItem = productsArr[key]; // productsString.push({ // "nomenclatureId":productItem.tovarid, // "nomenclatureName":productItem.name, // "price":productItem.cenaout, // "quantity": productItem.kolvo, // "amount":productItem.cenaout*productItem.kolvo // }) // } // socket.send(JSON.stringify({ // "send": "sendGuest", // "uuidGuest": command.uuidGuest, // "data":{ // "orderId":"88", // "productsString":productsString, // "sum":"876.00" // } // })); } if(command.param == "neworder"){ if(command.sklad == currentsklad){ app.terminal.delivery.onlineorder.readnew(); } } }, savetolocal: function() { if(preload["sklad"][currentsklad]["serversynk"] == 0){ /*localStorage["preload"] = JSON.stringify(preload); */ localStorage["basket_" + userbase] = JSON.stringify(preload.basket); localStorage["desktop_" + userbase] = JSON.stringify(preload.desktop_settings); localStorage["desktoparchive_" + userbase] = JSON.stringify(preload.desktop_archive); console.group("Сохранили в локальное хранилище"); console.log("Корзина", preload.basket); console.log("Столы", preload.desktop_settings); console.log("Архив", preload.desktop_archive); console.groupEnd(); } if(preload["sklad"][currentsklad]["serversynk"] == 1){ app.main.syncserver.send(); } try{ if(localsocket != "null"){ localsocket.send(JSON.stringify( { "send":"all", "param":"basketData", "sklad": currentsklad, "zal": currentzal, "desktop": currentdesktop, "data": app.terminal.getbasket() } )); console.log(preload["basket"]); } }catch(err){ } }, validate: { email: function() {}, phone: function() {}, cena: function(e) { var re = new RegExp($("#" + e).attr("pattern")); var vvvv = $("#" + e).val(); return re.test(vvvv); } }, jputswitch: { iffiscal: function(mark) { switch (mark) { case null: return ""; break; default: return mark.taxNumber; } }, historypay: function(mark) { switch (mark) { case "0.00": return ""; break; default: return "(visa)"; } }, }, validation: function() { /* $(document).on("focusout", ".numeric", function() { // pattern regexp для победы над нулями /^(0{2,})|(0{2,}\.)/gm var min = $(this).attr("min"); var value = this.value var preg = $(this).val().replace(/^(0{2,})|(0{2,}\.)/gm, 0); $(this).val(parseFloat(preg)); if(this.value < min || this.value == ""){ this.value = 1; } }); */ $(document).on("input", ".numeric", function() { if(/[^\d\.,]/g.test(this.value)){ this.value = this.value.replace(/[^\d\.,]/g, ''); } if(/\,/g.test(this.value)){ this.value = this.value.replace(',', '.'); } }); $(document).on("input", ".numbers", function() { if(/[^\d]/g.test(this.value)){ this.value = this.value.replace(/[^\d]/g, ''); } }); $(document).on("input", ".text", function() { if(/[&\!]/g.test(this.value)){ this.value = this.value.replace(/[&\!]/g, ''); } }); $(document).on("input", ".text", function() { if(/'/g.test(this.value)){ this.value = this.value.replace(/'/g, '’'); } }); }, dropdownhack: function() { /*Хак для того чтобы дропдаун не вылазил за экран в право*/ $(".dropdown, .dropup").on('click', function() { var $dropel = $(this).children(".dropdown-menu"); var offset = $(this).offset(); var droppos = $(window).width() - (offset.left + $dropel.width()); if (droppos < 5) { $dropel.css("margin-left", droppos - 10 + "px"); } else { $dropel.css("margin-left", "0px"); } }) /*Хак для того чтобы дропдаун не вылазил за экран*/ $(".addbasket").on('click', function() { var winwidth = $(window).width(); var $thisdropdownmenu = $(this).closest(".btn-group").find(".dropdown-menu:hidden"); setTimeout(function() { try { var offset = $thisdropdownmenu.offset(); /*console.log(offset);*/ if (winwidth < offset.left + $thisdropdownmenu.width()) { var newleftposition = offset.left + $thisdropdownmenu.width() - winwidth + 10; $thisdropdownmenu.css("left", "-" + newleftposition + "px"); } } catch (err) { console.log("Здесь нет выпадающего меню") } }, 0); }) }, os: function() { var response = "Unknown OS"; if (navigator.appVersion.indexOf("Win") != -1) response = "Windows"; if (navigator.appVersion.indexOf("Mac") != -1) response = "MacOS"; if (navigator.appVersion.indexOf("X11") != -1) response = "UNIX"; if (navigator.appVersion.indexOf("Linux") != -1) response = "Linux"; return response; }, ifobject: function(context, patch) { var keys = patch.split('.'); for (var i = 0; i < keys.length; i++) { try { var value = context[keys[i]]; } catch (e) { return false } if (value !== undefined) context = value; else return false; } return true; }, history: function() { /*Добавляем новый пустой елемент истории (кнопка назад в браузере)*/ history.pushState("", "", ""); /*Обработчик события кнопки назад в браузере */ window.onpopstate = function(e) { if (currentblock == "halldesktop" || currentblock == "enterpin") { if (preload["sklad"][currentsklad]["pin"] == 1) { app.main.exit(); } } if (currentblock == "terminal") { if (preload["sklad"][currentsklad]["maptable"] == 1) { //app.main.open("halldesktop", ""); app.terminal.tohalldesktop(); } else { if (preload["sklad"][currentsklad]["pin"] == 1) { app.main.exit(); } } } history.pushState("", "", ""); } }, ifconnect: function() { var response = false; if (navigator.onLine) { response = true; } return response; }, error: function(text) { alertify.error(text); }, errorarray: function(formerrors){ var errorstring = ""; /*Преобразуем массив ошибок в строку*/ for (i = 0; i < formerrors.length; ++i) {errorstring = errorstring + "* "+ formerrors[i] +"
"} app.main.error(errorstring); }, message: function(text) { alertify.success(text); }, info: function(text){ alertify.log(text) }, connect_error: function() { app.main.error(lang["sboiConnect"]); }, open: function(block, param) { /*Скрываем все блоки*/ $choiceuser.hide(); $enterpin.hide(); $halldesktop.hide(); $terminal.hide(); $(".change_desktop").hide(); /*Показываем нужный*/ if (block == "choiceuser") { currentdesktop = 0; $choiceuser.show(); currentblock = "choiceuser"; //app.users.start(); // Эта штука замедляет кнопку блокировки /*Позиционирование*/ var width = $html.width(); if (width > 600) { var top = $html.height() / 2 - ($chUseConr.height() / 2) - 25; if (top < 0) { top = 0; } $chUseConr.css("margin-top", top); } var height = $("html").height(); $("#choice_user_container_box").height(height - 80); } if (block == "enterpin") { $enterpin.show(); currentblock = "enterpin"; currentdesktop = 0; } if (block == "halldesktop") { $halldesktop.show(); currentdesktop = 0; currentblock = "halldesktop"; app.halldesktop.start() /*Затычка для обновления статуса столов после пролажи но мне кажется что это как-то слишком*/ } if (block == "changedesktop") { $(".change_desktop").show() currentblock = "changedesktop"; app.terminal.changedesktop.open(); } if (block == "terminal") { /*Костыль который позволяет не закрывать шторку когда происходит оттрытие стола на столе*/ if (currentblock != "terminal") { /*Скрыть шторку*/ $lin1.css("left", "-261px"); /*Ускоряем этот процесс опять таки бред*/ app.terminal.shtorka("hide"); } currentblock = "terminal"; if (param) { try { $desktopheadertitle.html("[ " + lang["StolT"] + " " + preload["desktop"][currentsklad][currentzal][param]["name"] + " ]"); currentdesktop = param; } catch (err) { console.log("не удалось перезаписать имя стола, возможно столы отключены или их просто нет") } } $terminal.show(); /*Проверяем сколько в корзине ща товаров для того чтобы поставить правильную кнопку*/ /*извлекаем обьект текущей корзины и преобразуем его в массив*/ try { var thisbasket = $.map(preload["basket"][currentsklad][currentzal][currentdesktop], function(value, index) { return [value]; }); } catch (err) { var thisbasket = []; } /*определяем переменную поиска товаров в корзине*/ var ifgoods = 0; /*Делаем перебор массива и если в массиве нет такого товара то*/ thisbasket.forEach(function(baskets) { ifgoods = baskets["kolvo"]; }); console.log("В корзине:", ifgoods); if (ifgoods <= 0) { app.terminal.interactivebutton("pusto"); } else { app.terminal.interactivebutton("pay"); } /*А тут выбираем один из 3 видов терминала*/ /*Это должно срабатывать на каждой торговой точке отдельно*/ $("#board").hide(); $("#container_par").hide(); $("#breadhumbsbox").hide(); $("#boardtable").hide(); try { var thismenustyle = preload["sklad"][currentsklad]["menu"]; } catch (err) { var thismenustyle = 0; } switch (thismenustyle) { case '0': app.main.fon.lepestok(localStorage["background_" + userbase]); $("#board").show(); $("#container_par").show(); /*Хак прокрутки для windows и мак*/ if (device.windows() === true || app.main.os() === "MacOS") { /*Инициализация размеров блока категорий для автопрокрутки*/ $bl = $("#container"); blW = $bl.outerWidth(); blSW = $bl[0].scrollWidth; wDiff = blSW / blW - 1; mPadd = 60; damp = 20; posX = mX2 = mX = 0; mmAA = blW - 2 * mPadd; mmAAr = blW / mmAA; } break; case '1': $("#breadhumbsbox").show(); $("#board").show(); break; case '2': $("#boardtable").show(); break; } app.terminal.breadhumbs.init() } }, transformfunc: function(id) { var $id = $(id); $id.css({ "opacity": "0.7", "transition": "opacity 0.1s ease-in-out" }); //$id.css("transform", "scale(0.97)"); setTimeout(function() { //$id.css("transform", "scale(1.00)"); $id.css({ "opacity": "1", "transition": "opacity 0.1s ease-in-out" }); }, 300); }, loader: function(param){ switch(param){ case "show": $("#loadImg").show(); break; case "hide": $("#loadImg").hide(); break; default: $("#loadImg").show(); } }, preloader: function(param) { if (!param) { param = "show"; } if (param == "show") { $(".polosa_term, .polosa").hide(); $("#loadImg").show(); /*Определить коордтнаты Y центра относительно размера окна и учитывая размер картинки*/ var centerY = $(document).scrollTop() + ($(document).height() - $("#loadImg").height()) / 2; /*Определить коордтнаты X центра относительно размера окна и учитывая размер картинки*/ var centerX = ($(document).width() - $("#loadImg").width()) / 2; /*Установить изображение в центр*/ $("#loadImg").offset({ top: centerY, left: centerX }); } if (opendialog != 1) { if (param == "hide") { /*$("html,body").css("overflow", "auto");*/ $(".polosa_term, .polosa").show(); $("#loadImg").hide(); $topmenu.show(); $podlojka.hide(); } } else { $podlojka.hide(); $("#loadImg").hide(); } }, exit: function() { app.main.open("choiceuser", ""); }, likeName: function(arr, search) { console.log("likeName()", arr); var results = []; if (!Array.isArray(arr)) { throw new TypeError(lang["firstargumentarray"]); } arr.forEach(function(value1) { var value3 = $.map(value1, function(value, index) { return [value]; }); search1 = new RegExp(search.toString().replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'), 'i'); value3.find(function(el) { if (search1.test(el["name"])) { console.log("Типа найден?", el["name"]); results.push(el); } }); }); return results; }, likeIndex: function(arr, search) { if (!Array.isArray(arr)) { throw new TypeError(lang["firstargumentarray"]); } var ind; search = new RegExp(search.toString().replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'), 'i'); return typeof arr.find(function(el, i) { ind = i; return search.test(el); }) === 'undefined' ? -1 : ind; }, sum: function() { var result = 0; for (var i = 0, max = arguments.length; i < max; i++) { result += arguments[i] * 10; } return result / 10; }, scrollcategory: function() { /*Хак прокрутки категорий для windows и мак*/ if (device.windows() === true) { $(window).resize(function() { blW = $bl.outerWidth(), blSW = $bl[0].scrollWidth, wDiff = (blSW / blW) - 1, /* widths difference ratio */ mPadd = 60, /* Mousemove Padding*/ damp = 20, /* Mousemove response softness*/ mX = 0, /* Real mouse position*/ mX2 = 0, /* Modified mouse position*/ posX = 0, mmAA = blW - (mPadd * 2), /* The mousemove available area*/ mmAAr = (blW / mmAA); /* get available mousemove fidderence ratio*/ }); $bl.mousemove(function(e) { mX = e.pageX - this.offsetLeft; mX2 = Math.min(Math.max(0, mX - mPadd), mmAA) * mmAAr; }); setInterval(function() { posX += (mX2 - posX) / damp; /* zeno's paradox equation "catching delay"*/ $bl.scrollLeft(posX * wDiff); }, 5); } }, androidMonofix: function(){ /* var Android = { getDisplayCutoutTop: function(){ return 100; } } */ var androidHead = document.getElementById("topmenu"); try{ if(Android != null && Android != undefined) { var s; var androidBrov = Android.getDisplayCutoutTop(); if(window.devicePixelRatio > 1.0) { s = androidBrov / window.devicePixelRatio; } if(androidBrov != 0) { androidHead.style.paddingTop = s + 'px'; $(".razdelitel").css("display","none"); $(".exitbutton").css("border-left","0px solid transparent"); $(".exitbuttonstart").css("border-right","0px solid transparent"); $(".exittop").css("border-right","0px solid transparent"); $("#program").css("padding-top", (s+50) + 'px'); $(".dialogbox").css("padding-top", s+"px"); } else { $(".razdelitel").css("display",""); $(".exitbutton").css("border-left",""); $(".exitbuttonstart").css("border-right",""); $(".exittop").css("border-right",""); $("#program").css("padding-top",'50px'); androidHead.style.paddingTop = '0px'; } } } catch(err) {} }, windowresize: function() { /*При изменении размера окна */ (function() { var time; window.onresize = function(e) { if (time) clearTimeout(time); time = setTimeout(function() { var ifffffsearch = $("#searchline").val(); var ifffffsearch1 = $("#searchline1").val(); if(ifffffsearch == "" && ifffffsearch1 == ""){ resize(e); }else{ //Заплатка которая убирает баг при поиске var fullheight = $("html").height(); $lin1.css("height", fullheight - 50); $("#lin").css("height", fullheight - 50); } }, 100); } })(); /*Перерисовка после смены размера окна */ resize = function(e) { /* $podlojka.show();*/ /*initialization();*/ /*app.terminal.start();*/ app.main.androidMonofix(); try { var thismenustyle = preload["sklad"][currentsklad]["menu"]; } catch (err) { var thismenustyle = 0; } if (thismenustyle == 1) { /*Хлебные крошки*/ categorytree = []; } app.users.start(); app.pin.init(4); /*Восстанавливаем прежнее состояние*/ if (currentblock != "") { if (currentdesktop) { $desktopheadertitle.html("[ " + lang["StolT"] + " " + currentdesktop + " ]"); } if (currentblock != "choiceuser") { app.main.open(currentblock, currentdesktop); } if (currentblock == "terminal") { app.terminal.basket.start(); } } if($(window).width() > 500){ $supportbox.draggable(); } }; }, chat:{ init: function(){ if($(window).width() > 500){ $supportbox.draggable(); } app.main.chat.expand(); $("#skyservice-support-text-input").click(function(){ $("#skyservice-support-text-input").focus(); }) $("#skyservice-support-text-input").on('keydown',function(e){ if (e.keyCode === 13) { app.main.chat.send(); return false; } }) socket.on("messageroom_77782", function(json) { var getmessage = JSON.parse(json); getmessage["type"] = "in"; app.main.chat.put(getmessage); }) }, expand: function(){ $supportbox.show(); $('.support-chat').scrollTop($("#skyservice-support-chat-box").height()); }, hide: function(){}, preload: function(){}, put: function(command){ jPut["skyservice-support"].data = [command]; var htmlmessage = $("#skyservice-support").html(); $("#skyservice-support-chat-box").append(htmlmessage); $(".support-chat").animate({ scrollTop: $("#skyservice-support-chat-box").height() }, 300); }, send: function(){ var text = $('#skyservice-support-text-input').val(); if(text.length > 0){ var message = { "param":"support",//support "text": text, "name": "Вадим", "type": "out", "datetime": currentDate()+" "+currentTime(), } socket.emit("messageroom_77782", JSON.stringify(message)); app.main.chat.put(message); $('#skyservice-support-text-input').val("") } }, }, register_changepass: function(){ var p1 = $("#reguser_password").val(); var p2 = $("#reguser_password_2").val(); if(p1 == p2){ if(p1.length >= 4){ $('#changepassword').hide(); $('#reg_step2').show(); }else{ alert(lang["shortpassword"]); } }else{ alert(lang["passwordmismatch"]); } }, endregister: function(){ function validateEmail(email) { var re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; return re.test(String(email).toLowerCase()); } function runregend(){ var data = { name: $("#reguser_name").val(), password:$("#reguser_password").val(), mail:$("#reguser_email").val() } $("#userEndRegister").attr('disabled','disabled'); app.main.getjson("/?section=db&db=userregisterend", JSON.stringify(data)).then(function(json){ try{ if(json["status"] == "done"){ $("#reg_step2").hide(); //удаляем ссылку что мы толькочто зарегались history.pushState({}, "Skyservice POS", '?section=pos&lang='+currentlang); }else{ app.main.error("Register Error 6341"); } }catch(err){ app.main.error("Register Error 6341"); } $("#userEndRegister").attr('disabled',false); }).catch(function(){ app.main.error("Register Error 6341"); $("#userEndRegister").attr('disabled',false); }) } if(validateEmail($("#reguser_email").val())){ runregend(); }else{ if(confirm(lang["addemailreservrestore"])){ $("#reguser_email").css("outline", "2px solid red"); }else{ runregend(); } } } }, egais: { modules:{ sendxml:function(xml){ return new Promise(function(resolve, reject) { var formData = new FormData(); formData.append("xml_file", new Blob([xml], { type: "text/xml"})); var request = new XMLHttpRequest(); request.open("POST", "http://192.168.1.116:8080/opt/in/QueryRests"); request.send(formData); request.onload = function() { try{ var json = xml2json(request.responseXML); console.log(json) resolve(json); }catch(err){ reject(); } }; }) }, getxml: function(url, data){ /* */ return new Promise(function(resolve, reject) { /* XHR */ var request = new XMLHttpRequest(); /* GET, POST*/ if (data == "" || data == undefined) { request.open('GET', url); } else { request.open("POST", url, true); request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); } request.onload = function() { /* 404 */ if (request.status < 400) { /* */ try{ var json = xmlToJson(request.responseXML); resolve(json); }catch(err){ reject(); } } else { /*, */ reject(Error(request.statusText)); } }; /* */ request.onerror = function() { reject(Error("Connection error")); }; request.send(data); }); } }, getin: function(){ // app.egais.modules.getxml("http://192.168.1.113:8080/opt/out").then(function(response) { console.log(response["A"]["url"]); }).catch(function(error) { // //console.error(error); //alert(error.name + ': ' + error.message); }); }, createxml: function(){ var xw = new XMLWriter('UTF-8'); xw.writeStartDocument(); xw.writeStartElement('ns:Documents'); xw.writeAttributeString('Version', '1.0'); xw.writeAttributeString('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance'); xw.writeAttributeString('xmlns:ns', 'http://fsrar.ru/WEGAIS/WB_DOC_SINGLE_01'); xw.writeAttributeString('xmlns:qp', 'http://fsrar.ru/WEGAIS/QueryParameters'); xw.writeStartElement('ns:Owner'); xw.writeElementString('ns:FSRAR_ID', '030000405450'); xw.writeEndElement(); xw.writeStartElement('ns:Document'); xw.writeEndElement(); xw.writeEndElement(); var xml = xw.flush(); xw.close();//clean the writer xw = undefined;//don't let visitors use it, it's closed alert(xml); app.egais.modules.sendxml(xml).then(function(response) { console.log(response); /**/ if(response["A"]["error"]){ console.log("",response["A"]["error"]); alert(response["A"]["error"]); } /**/ if(response["A"]["sign"]){ console.log("PDF 417",response["A"]["sign"]); } }).catch(function(error) { // //console.error(error); //alert(error.name + ': ' + error.message); }) }, }, print: { print: { check: function(thisbasket) { var devices = app.print.modules.getdevice(); var device = false; console.group("Печать"); console.log("Список устройств", devices) if (thisbasket["info"]["type"] != "precheck" && thisbasket["info"]["type"] != "delivery") { thisbasket["type"] = "check"; /*Какой-то костыляус*/ thisbasket["info"]["type"] = "check"; } var zaderjka = 0 for (var di = 0; di < devices.length; di++) { //devices[di]["checks"] /*Если это принтер*/ if (devices[di]["type"] == "printer" || devices[di]["type"] == "possystem") { /*Печатать только чеки на тех принтерах где можно печатать чеки*/ if (devices[di]["checks"] == 3 || devices[di]["checks"] == 2 || devices[di]["checks"] == 5) { console.log("Чек отправлен на принтер: ", devices[di]["name"]); thisbasket["printer"] = devices[di]; var printing = 1; if (devices[di]["checks"] == 5) { switch (thisbasket["type"]) { case "precheck": break; case "delivery": break; default: printing = 0; } } //Заплатка которая блокирует печать чека на сенсорном терминале виндовом //(Это было нужно чтобы сделать широкий скролл) if (devices[di]["protocol"] == "windows_pos_touch" || devices[di]["protocol"] == "windows_pos_touch_protocol") { printing = 0; } //Только экран if (devices[di]["protocol"] == "possectorSmartCubeDisplay") { printing = 0; } console.log("Протокол", devices[di]["protocol"]); console.log(thisbasket); /*Велик для постоения очереди печати чека на 2 принтера*/ setTimeout(function(thisbasket) { try { if (printing == 1) { app.print.protocols[thisbasket["printer"]["protocol"]](thisbasket); } } catch (err) { app.main.error(thisbasket["printer"]["name"] + ": " + lang["Vash_printer_nastroen_ne_pravilyno,_proveryte_parametry_ustroystva."]) console.error(err); } }, zaderjka, JSON.parse(JSON.stringify(thisbasket))); zaderjka = zaderjka + 2000; } } /*Если это фискальный регистратор*/ if (devices[di]["type"] == "rro") { /*Предусматриваем только один фискальник*/ device = devices[di]; thisbasket["printer"] = device; var thisRRObasket = Object.assign({}, thisbasket) } } console.groupEnd(); return new Promise(function(resolve, reject) { if (device) { try { if (device["promise"] == 0) { try { try { switch (thisRRObasket["type"]) { case "precheck": app.print.protocols[device["protocol"]]["precheck"](thisRRObasket); break case "delivery": app.print.protocols[device["protocol"]]["precheck"](thisRRObasket); break default: if ($("#kassaprintrro").prop("checked")) { app.print.protocols[device["protocol"]]["check"](thisRRObasket); } } } catch (err) { app.print.protocols[device["protocol"]]["check"](thisRRObasket); } } catch (err) {} resolve({ status: "done", device: device }); } else { try { switch (thisRRObasket["type"]) { case "precheck": app.print.protocols[device["protocol"]]["precheck"](thisRRObasket); resolve({ status: "done", device: device }); break case "delivery": app.print.protocols[device["protocol"]]["precheck"](thisRRObasket); resolve({ status: "done", device: device }); break default: //Если установлена отметка что фискальный чек нужно печатать if ($("#kassaprintrro").prop("checked")) { app.print.protocols[device["protocol"]]["check"](thisRRObasket).then(function(success) { console.warn('success sale', success); resolve({ status: "done", device: device, prroSuccess: JSON.stringify(success) }); }, function(error) { reject({ status: "error", device: device }); }); } else { //Фискальный чек печатать не надо resolve({ status: "done", device: device }); } } } catch (err) { console.error(err) app.main.error("Error: 4782") } } } catch (error) { console.error(error); app.main.error(device["name"] + ": " + lang["Vash_fiskalynyy_registrator_nastroen_ne_pravilyno,_proveryte_parametry_ustroystva."]) reject({ status: "error", device: device }); } } else { //Устройство не найдено, а значит возвращаем что все впорядке resolve({ status: "done" }); } }); }, returnBasket:function(){ $("#returnBasketBox").show().animateCss("fadeInUp"); $("#returnBasketAskboxes").css("padding-top", ($("#returnBasketBox").height() / 2) - 70); $("#returnBasketnow").off(); $("#returnBasketnow").on('click', function() { var b777 = app.terminal.getbasket(); b777.customReturn = true; console.warn('b777.customReturn', b777) b777.products.forEach(function(item) { console.log('item', item) if (b777.info.discount == 0) { item.cenaout_discount = item.cenaout; } }) console.warn('b777.customReturn bigtest prro', b777) app.print.print.vozvrat(b777).then(function (resp) { console.log('resp!!!!', resp) // if (resp.status == 'done') { try { var url = '/?section=db&db=magic&action=cash_edit&sklad=' + b777.info.sklad; var returnData = { type: "rashod", cash: b777.info.rrodata.totalSum,//round(b777.info.allcena), comments: "Повернення товару", id: b777.info.id, userbase: b777.info.userbase, day: b777.info.day, smena: b777.info.smena, sklad: b777.info.sklad, user: b777.info.user, wallet: "", client: b777.info.client, clienttitle: "", category: "6", products: b777.products } app.main.getjson(url, "data="+JSON.stringify(returnData)); app.kassamotion.getcash(); } catch(err) { console.log('err data', err); } // } app.terminal.cleardesktop({ "currentsklad": currentsklad, "currentzal": currentzal, "currentdesktop": currentdesktop }); app.main.savetolocal(); }) $('#returnBasketBox').animateCss('fadeOutDown', function() { $('#returnBasketBox').hide() }); }) }, vozvrat: function(thisitems) { console.warn('test test>>>', thisitems); var devices = app.print.modules.getdevice(); var device = false; var thisbasket = app.terminal.getinfo(); if (thisitems.customReturn) { thisbasket.customReturn = true; } thisbasket["info"] = thisitems["info"]; thisbasket["info"]["discount"] = thisitems["info"]["skidka"]; thisbasket["products"] = thisitems["products"] console.group("Печать"); console.log("Список устройств", devices) for (var di = 0; di < devices.length; di++) { /*Если это фискальный регистратор*/ if (devices[di]["type"] == "rro") { device = devices[di]; thisbasket["printer"] = device; /*Ориентируемся на 1 фискальник*/ } } console.groupEnd(); return new Promise(function(resolve, reject) { if (device) { try { if (device["promise"] == 0) { app.print.protocols[device["protocol"]]["vozvrat"](thisbasket); resolve({ status: "done", device: device }); } else { app.print.protocols[device["protocol"]]["vozvrat"](thisbasket).then(function(success) { resolve({ status: "done", device: device, prroSuccess: JSON.stringify(success) }); }, function(error) { console.log('print error', error) reject({ status: "error", device: device }); }) } } catch (error) { console.error(error) app.main.error(device["name"] + ": " + lang["Vash_fiskalynyy_registrator_nastroen_ne_pravilyno,_proveryte_parametry_ustroystva."]) reject({ status: "error", device: device }); } } else { //Устройство не найдено, а значит возвращаем что все впорядке resolve({ status: "done" }); } }); }, zreport: function() { var devices = app.print.modules.getdevice(); var device = false; var thisbasket = {}; //Находим фискальный аппарат for (var di = 0; di < devices.length; di++) { /*Если это фискальный регистратор*/ if (devices[di]["type"] == "rro") { device = devices[di] } } thisbasket["printer"] = device; thisbasket["info"] = {}; thisbasket["info"]["userbase"] = preload["userbase"]; thisbasket["info"]["id"] = ""; thisbasket["info"]["desktop"] = ""; thisbasket["info"]["time"] = currentTime(); thisbasket["info"]["date"] = currentDate(); thisbasket["info"]["day"] = currentDay(); thisbasket["info"]["type"] = "report"; thisbasket["info"]["user"] = currentuser; console.groupEnd(); return new Promise(function(resolve, reject) { if (device) { try { if (device["promise"] == 0) { app.print.protocols[device["protocol"]]["ZReport"](thisbasket); resolve({ status: "done", device: device }); } else { app.print.protocols[device["protocol"]]["ZReport"](thisbasket).then(function(success) { console.warn('lol >>>>', success); resolve({ status: "done", device: device, prroSuccess: JSON.stringify(success) }); }, function(error) { reject({ status: "error", device: device }); }) } } catch (error) { app.main.message(device["name"] + ": " + lang["Ne_fiskalynaya_operaciya"]); reject({ status: "error", device: device }); } } else { //Устройство не найдено, а значит возвращаем что все впорядке resolve({ status: "done" }); } }); }, history_check: function(id) { //console.log("id ", id); var $this = this; app.main.loader("show"); app.main.getjson("/?section=db&db=magic&sql=document&action=read&of=id&ot=desc&pagelimit=999&page=0&search=" + id + "&sline=id&rrodata=true").then(function(content) { var history = app.print.modules.generatehistory(content); console.error('content.products', content.products) if (nolicense == 0) { try{ if (content.products[0].rrodata != null ){// && content.products[0].rrodata != "" || content.products[0].check[0].rroitemdata == null history.info['rrodata'] = content.products[0].rrodata; //Печатаем копию фискального чека console.warn('history >>>>', history); app.print.protocols.uaprro_testdublefix.printCopyCheck(history); } else { app.print.print.check(history); } }catch(err){ //Печатаем новый чек // app.print.print.check(history); console.warn('err catch>>', err) } } }); }, begunok: function(items) { var devices = app.print.modules.getdevice(); console.log("Печать бегунка", items) console.log("Список устройств", devices) var zaderjka = 0 for (var di = 0; di < devices.length; di++) { /*Если это принтер на котором можно печатать бегунки*/ if (devices[di]["type"] == "printer" || devices[di]["type"] == "possystem") { /*Печатать только бегунки на тех принтерах где можно печатать бегунки*/ if (devices[di]["checks"] == 1 || devices[di]["checks"] == 2 || devices[di]["checks"] == 5) { var thisbasket = app.terminal.getbasket(); console.log("Бегунок отправлен на принтер: ", devices[di]["name"]); thisbasket["printer"] = devices[di]; //thisbasket["type"] = "begunok"; thisbasket["type"] = "check"; thisbasket["info"]["type"] = "begunok"; //thisbasket["info"]["comment"] = ""; console.log("Протокол", devices[di]["protocol"]); console.log(thisbasket); if (preload["sklad"][currentsklad]["maptable"] == 1) { thisbasket["info"]["desktop"] = preload["desktop"][currentsklad][currentzal][currentdesktop]["name"]; } var newarrbeg = []; items.forEach(function(oneitem) { if (oneitem["ceh"] == thisbasket["printer"]["ceh"]) { newarrbeg.push(oneitem); } }) thisbasket["products"] = newarrbeg; //Заплатка которая блокирует печать чека на сенсорном терминале виндовом //(Это было нужно чтобы сделать широкий скролл) if (devices[di]["protocol"] == "windows_pos_touch" || devices[di]["protocol"] == "windows_pos_touch_protocol") { printing = 0; } /*Если товаров в бегунке больше чем 0*/ if (newarrbeg.length > 0) { /*Велик для постоения очереди печати чека на 2 принтера*/ setTimeout(function(thisbasket) { try { app.print.protocols[thisbasket["printer"]["protocol"]](thisbasket); } catch (err) { app.main.error(thisbasket["printer"]["name"] + ": " + lang["Vash_printer_nastroen_ne_pravilyno,_proveryte_parametry_ustroystva."]) console.warn(thisbasket["printer"]) console.error(err); } }, zaderjka, JSON.parse(JSON.stringify(thisbasket))); zaderjka = zaderjka + 3000; } } } } }, incasation: function(data) { console.warn('icasation data>>', data); var devices = app.print.modules.getdevice(); var device = false; //Находим фискальный аппарат for (var di = 0; di < devices.length; di++) { /*Если это фискальный регистратор*/ if (devices[di]["type"] == "rro") { device = devices[di] } } data["printer"] = device; if (preload["sklad"][currentsklad]["pin"] == 1) { /*Запрашивать PIN*/ var ouser = currentuser; } else { /*Не запрашивать PIN*/ var ouser = $("#userseller1").val(); } createobj(data, "info", "user", ouser); return new Promise(function(resolve, reject) { if (device) { try { if (device["promise"] == 0) { app.print.protocols[device["protocol"]]["incasation"](data); resolve({ status: "done", device: device }); } else { app.print.protocols[device["protocol"]]["incasation"](data).then(function(success) { console.warn('success sssss====>>', success) try { if (success.checkPRRO) { resolve({ status: "done", device: device, prroCheck: JSON.stringify(success) }); } else { resolve({ status: "done", device: device, }); } } catch(err) { resolve({ status: "done", device: device, }); } }, function(error) { reject({ status: "error", device: device }); }) } } catch (error) { app.main.message(device["name"] + ": " + lang["Ne_fiskalynaya_operaciya"]); reject({ status: "error", device: device }); } } else { //Устройство не найдено, а значит возвращаем что все впорядке resolve({ status: "done" }); } }); }, introduction: function(data) { var devices = app.print.modules.getdevice(); var device = false; //Находим фискальный аппарат for (var di = 0; di < devices.length; di++) { /*Если это фискальный регистратор*/ if (devices[di]["type"] == "rro") { device = devices[di] } } data["printer"] = device; if (preload["sklad"][currentsklad]["pin"] == 1) { /*Запрашивать PIN*/ var ouser = currentuser; } else { /*Не запрашивать PIN*/ var ouser = $("#userseller1").val(); } createobj(data, "info", "user", ouser); return new Promise(function(resolve, reject) { if (device) { try { if (device["promise"] == 0) { app.print.protocols[device["protocol"]]["introduction"](data); resolve({ status: "done", device: device }); } else { app.print.protocols[device["protocol"]]["introduction"](data).then(function(success) { console.warn('success sssss====>>', success) try { if (success.checkPRRO) { resolve({ status: "done", device: device, prroCheck: JSON.stringify(success) }); } else { resolve({ status: "done", device: device, }); } } catch(err) { resolve({ status: "done", device: device, }); } }, function(error) { reject({ status: "error", device: device }); }) } } catch (error) { app.main.message(device["name"] + ": " + lang["Ne_fiskalynaya_operaciya"]); reject({ status: "error", device: device }); } } else { //Устройство не найдено, а значит возвращаем что все впорядке resolve({ status: "done" }); } }); }, rashod: function(data) { var devices = app.print.modules.getdevice(); var device = false; //Находим фискальный аппарат for (var di = 0; di < devices.length; di++) { /*Если это фискальный регистратор*/ if (devices[di]["type"] == "rro") { device = devices[di] } } data["printer"] = device; if (preload["sklad"][currentsklad]["pin"] == 1) { /*Запрашивать PIN*/ var ouser = currentuser; } else { /*Не запрашивать PIN*/ var ouser = $("#userseller1").val(); } createobj(data, "info", "user", ouser); return new Promise(function(resolve, reject) { if (device) { try { if (device["promise"] == 0) { app.print.protocols[device["protocol"]]["rashod"](data); resolve({ status: "done", device: device }); } else { app.print.protocols[device["protocol"]]["rashod"](data).then(function(success) { console.warn('success sssss====>>', success) try { if (success.checkPRRO) { resolve({ status: "done", device: device, prroCheck: JSON.stringify(success) }); } else { resolve({ status: "done", device: device, }); } } catch(err) { resolve({ status: "done", device: device, }); } }, function(error) { reject({ status: "error", device: device }); }) } } catch (error) { app.main.message(device["name"] + ": " + lang["Ne_fiskalynaya_operaciya"]); reject({ status: "error", device: device }); } } else { //Устройство не найдено, а значит возвращаем что все впорядке resolve({ status: "done" }); } }); }, delivery: function(newclientinfo) { /*Вызываем наш промис*/ var prom = masterpassrequest(preload["sklad"][currentsklad]["invoice"]); prom.then(function() { //preload["desktop_settings"][currentsklad][currentzal][currentdesktop]["comment"] = newclientinfo["comments"] /*Фиксим баг с печатью сдачи на пречеке*/ $("#paycash").val(""); $("#payvisa").val(""); if (nolicense == 0) { var thisbasket = app.terminal.getbasket(); thisbasket["info"]["checkcomments"] = 1; thisbasket["info"]["comment"] = newclientinfo["comments"]; thisbasket["info"]["adress"] = newclientinfo["adress"]; if (thisbasket["info"]["client"] > 0) {} else { app.main.error(lang["Klient_ne_vybra_f548s"]); } thisbasket["type"] = "delivery"; thisbasket["info"]["type"] = "delivery"; thisbasket["IsFiscalCheck"] = false; console.log("delivery", thisbasket); app.print.print.check(thisbasket); $('#deliverybox').animateCss('fadeOutDown', function() { $('#deliverybox').hide() }); } }) }, prechek: function() { /*Вызываем наш промис*/ var prom = masterpassrequest(preload["sklad"][currentsklad]["invoice"]); prom.then(function() { /*Фиксим баг с печатью сдачи на пречеке*/ $("#paycash").val(""); $("#payvisa").val(""); if (nolicense == 0) { var thisbasket = app.terminal.getbasket(); thisbasket["type"] = "precheck"; thisbasket["info"]["type"] = "precheck"; try { thisbasket["info"]["checkcomments"] = preload["desktop_settings"][currentsklad][currentzal][currentdesktop]["checkcomments"]; } catch (err) {} thisbasket["IsFiscalCheck"] = false; thisbasket["info"]["precheck_printed"] = true; preload["desktop_settings"][currentsklad][currentzal][currentdesktop]["precheck_printed"] = true; app.main.savetolocal(); app.print.print.check(thisbasket); } }) }, report: function(flag) { var thisuser = $("#thisusersmena").val(); app.main.getjson("/?section=db&db=smenareport&user=" + thisuser + "&sklad=" + currentsklad + "&smena=" + currentsmena).then(function(content) { var getreport = {}; getreport["info"] = {}; getreport["info"]["userbase"] = preload["userbase"]; getreport["info"]["id"] = ""; getreport["info"]["desktop"] = ""; getreport["info"]["time"] = currentTime(); getreport["info"]["date"] = currentDate(); getreport["info"]["day"] = currentDay(); getreport["info"]["type"] = "report"; getreport["info"]["user"] = currentuser; var nall = content.summ - content.visa; getreport["products"] = $.map(content["products"], function(value, index) { return { name: value["name"], kolvo: value["kolvo"], cenaout: value["cenaout"] } }); var arrrrrr = []; arrrrrr.push({ "name": lang["prodanoPozitsij"], cenaout: CurrencyFormatted(content.goods) }); arrrrrr.push({ "name": lang["checks"], cenaout: content.check }); arrrrrr.push({ "name": lang["averagecheck"], cenaout: CurrencyFormatted(content.average) }); arrrrrr.push({ "name": lang["nalichnie"], cenaout: CurrencyFormatted(nall) }); arrrrrr.push({ "name": lang["beznal"], cenaout: CurrencyFormatted(content.visa) }); arrrrrr.push({ "name": lang["viruchka"], cenaout: CurrencyFormatted(content.summ) }); getreport["info"]["report"] = arrrrrr; var devices = app.print.modules.getdevice(); console.group("Печать"); console.log("Список устройств", devices) for (var di = 0; di < devices.length; di++) { //devices[di]["checks"] /*Если это принтер*/ if (devices[di]["type"] == "printer" || devices[di]["type"] == "possystem") { /*Печатать только чеки на тех принтерах где можно печатать чеки*/ if (devices[di]["checks"] == 3 || devices[di]["checks"] == 2) { console.log("Чек отправлен на принтер: ", devices[di]["name"]); getreport["printer"] = devices[di]; getreport["type"] = "report"; console.log(devices[di]); //getreport["printer"].push(devices[di]); console.log(getreport); console.log("Протокол", devices[di]["protocol"]); try { app.print.protocols[devices[di]["protocol"]](getreport); } catch (err) { app.main.error(devices[di]["name"] + ": " + lang["Vash_printer_nastroen_ne_pravilyno,_proveryte_parametry_ustroystva."]); console.error(err); } } } /*Если это rro*/ if (devices[di]["type"] == "rro") { console.log("Чек отправлен на rro: ", devices[di]["name"]); getreport["type"] = "report"; getreport["printer"] = devices[di]; console.log(devices[di]); //getreport["printer"].push(devices[di]); console.log(getreport); console.log("Протокол", devices[di]["protocol"]); try { if(flag == "X3"){ app.print.protocols[devices[di]["protocol"]]["X3Report"](getreport); }else{ app.print.protocols[devices[di]["protocol"]]["XReport"](getreport); } } catch (err) { app.main.error(devices[di]["name"] + ": " + lang["Vash_printer_nastroen_ne_pravilyno,_proveryte_parametry_ustroystva."]); console.error(err); } } } console.groupEnd(); }); }, closecheck: function() { var devices = app.print.modules.getdevice(); console.group("Печать"); console.log("Список устройств", devices) for (var di = 0; di < devices.length; di++) { /*Если это фискальный регистратор*/ if (devices[di]["type"] == "rro") { console.log("Запрос на закрытие чека отправлен на фискальник: ", devices[di]["name"]); console.log("Протокол", devices[di]["protocol"]); var thisbasket = {} thisbasket["printer"] = devices[di]; try { /*Специально для артсофт закрываем чек на всякий случай*/ if (devices[di]["protocol"] == "artsoft_box") { app.print.protocols[devices[di]["protocol"]]["closecurcheck"](thisbasket); } } catch (err) { app.main.error(devices[di]["name"] + ": " + lang["Vash_printer_nastroen_ne_pravilyno,_proveryte_parametry_ustroystva."]); console.error(err); } } } console.groupEnd(); }, opensmena: function() { var devices = app.print.modules.getdevice(); var device = false; var thisbasket = app.terminal.getinfo(); //Находим фискальный аппарат for (var di = 0; di < devices.length; di++) { /*Если это фискальный регистратор*/ if (devices[di]["type"] == "rro") { device = devices[di] } } thisbasket["printer"] = device; return new Promise(function(resolve, reject) { if (device) { try { if (device["promise"] == 0) { app.print.protocols[thisbasket["printer"]["protocol"]]["opensmena"](thisbasket); resolve({ status: "done", device: device }); } else { app.print.protocols[thisbasket["printer"]["protocol"]]["opensmena"](thisbasket).then(function(success) { console.warn('success', success) resolve({ status: "done", device: device, prroSuccess: JSON.stringify(success) }); }, function(error) { reject({ status: "error", device: device }); }) } } catch (error) { app.main.message(device["name"] + ": " + lang["Ne_fiskalynaya_operaciya"]); reject({ status: "error", device: device }); } } else { //Устройство не найдено, а значит возвращаем что все впорядке resolve({ status: "done" }); } }); }, }, modules: { test: function(){ var s = [{ "type": "byte", "byteValue": [27, 112, 0, 100, 250] }, { "type": "text", "value": "ПрАТ \"Літак\"", "font": 1, "position": "center" }, { "type": "text", "value": "test 1", "font": 1, "position": "center" }, { "type": "text", "value": "УКРАЇНА, АР КРИММ. СІМФЕРОПОЛЬ СЕЛИЩЕ БІТУМНЕ, test 1", "font": 1, "position": "center" }, { "type": "text", "value": "ПН 123456789012", "font": 1, "position": "center" }, { "type": "text", "value": "ІД 34554355", "font": 1, "position": "center" }, { "type": "text", "value": "--------------------------------", "font": 1, "position": "left" }, { "type": "text", "value": "гречка ", "font": 1, "position": "left" }, { "type": "text", "value": "1.000 x 32.33 = 32.33 А", "font": 1, "position": "right" }, { "type": "text", "value": "--------------------------------", "font": 1, "position": "left" }, { "type": "text", "value": "ЗАОКРУГЛЕННЯ -0.03", "font": 1, "position": "left" }, { "type": "text", "value": "СУМА 32.30", "font": 1, "position": "left" }, { "type": "text", "value": "ГОТІВКА 32.30", "font": 1, "position": "left" }, { "type": "text", "value": "--------------------------------", "font": 1, "position": "left" }, { "type": "text", "value": "ПДВ А=0% 0.00", "font": 1, "position": "left" }, { "type": "text", "value": "", "font": 1, "position": "left" }, { "type": "text", "value": "--------------------------------", "font": 1, "position": "left" }, { "type": "text", "value": "14-09-2020 15:44:30 №63962/201", "font": 1, "position": "left" }, { "type": "text", "value": "ФН 4000028287 ВН1452", "font": 1, "position": "left" }, { "type": "image", "value": "iVBORw0KGgoAAAANSUhEUgAAALQAAAC0CAYAAAA9zQYyAAAP2ElEQVR4Xu2d4ZraOgxEu+//0L1fNmkXgswcJnIIvdO/kWV5dCzLKbBfv379+v3rDf9+/36c9uvr6y6SymYfKhmzt9n7cOZZfOzHdcTSlQoVWxV/NTdZk8pJ15qIn4WgAF1sLpIkBQ3ZtCRJjo2KLUA7qj4ZQ5LtVE7iNxV6VaBLX7L5m/EZukuFNhOblmOMqGrxZsL9ADTZtU5ApBdzhCBHq6rIZF5S+Tu0I7FU+jtzk5yo6nuWLqS/X2wC9CLC7jJKgXGAUMWAxELje3UusinImomNio08r7QK0AH6LzsBmmyjzYbsWqc6peXgFzynfXDGkFy/gM74AlicrLJCd0D23dtMesesBCeXN3KEVzp0bCaS2Hdqp+4fpLclfTbRgegdoAdKEvGIjQOE2qRdrYGah2z0AL0pcGZSOsBLheatDTlROk5+61LYMXFajp86RjayqpzEB4FKzZMK/aT6dgjsJDI9tF9ZA/RBoBX0zmlRAU0uII6Nip+cVKS1IX2r07u7c6tK/7+9FCogAvR4myltuk43stFVHquNTfySu9Cl3nIoIVTSRqKQZBJBlY2KPxX6R0EnlwH6hTcqClbyPECvKjk6EH0/Dmi1KLfHIwI7faAao9bjXrqcHtqJhYwh/TGxceb6uNd2BBjSTgRogotnQ2AlNmT2VOhNpQBNcPFsCKzEhsweoAM04eSQDYGV2JAgWoAmExEbp0o6fklf6tywSSx7m652yIn3rLkJrCQWR1+rh3YmIpeWrkWSZJOd3bXOWz9kjWSjkzW+azMF6E15kmwCGUl2gK6V7NhMATpA39HVARVps9xTUxWMAB2gAzQ5eoEN6qGBnxYTZ2eT/1hxbJxYFhFUdf30WJY1qnaNaNcCDHTyUb/L4QDSlRSSOJX8T4ulK17IYotZgB780IyqvqnQK39ko7eQCp0EaJgUkrhU6JU6dZGEbFpmX7+73p9Z098P6hCCgLcPlUjgtjuvzkU0cOJ1dCEpJbEQP102AXrib9tVSVIABOhjaAfoAH2IILVBDzk3BgfoAG1g8zMkQD+Rjxy3Sn2nVyRJSQ9dK0+0UznrfN7ynUJyuydBd/jpEvhdm8vRyX2FSOZ69VJLYqnmdV6Tln72f5LCgcoZQy5MDlQBelW2KycB+sB7yI4kBOgAffdHgxyonDGp0M6BX8NKjnnntCM5ctuH/bi2lmP/HyvEsZ+Kn5HOJYtc+EiFdpLr+HXidXQh4DlrJnl21uhuQFI4H17bBWj/Nk+0UzYBetXf1SFAkzJkvqt2qpebSHV5S4XeFCJHLWTizsxJnAMI6fFI/EQHVX1nHrUBeqvszl+SVb2MC54CglQZMrdKPgGP2JB4yWZybMgGVBez5bnjp8MvKXhlsQrQ7DO9ZKOoje6A6Y5xQHQhUjE6fp0x30UmQAfoP0C6EAVo80P15AgnlTQtR41ggN50Ub0v6TeJTYBWtfDneVoOrtWDJekdiY0KgSTJgf6dlYkUA3LJmqWdyhvJiYrNfV7lzeqh1ZFNACHgqXnKW67xd7tJvI7oxG+AdpRdxwToTTtVdc58XRWgA/RTBUjlD9D+pdDZgD6yz0eiCk2SrVoBAlUVqurHyBFOxCNJIWt4V7xd2qk8uhd1whCxUbks32hd+QP+5DKkoCJ9tvOqj7QlszZggF4VCNAbCanQde0jG5tU1i6bVGilQIB+qlCAfuGtAWFNtQ+zjnCSyK5jXq2RtEhdsfyTPfS7vrFCACc9NEmKMxeZW8FJNiC5fJ61RkcnEr/SiW5i0sq87QP+VxKPxELgdDYBASJA15fA8rVdKjTBmX0lKEDzy6ZSnRSQAK1UfPKcCBygPwDoWRcQhy2nFyP9GbkUEhtnTWQM6R2v1JaQ16Jq3U4rtviUPXSArvu3b/HAB6FU4sjzAE1UWm0CtPllgwA9hiwVGm7AtBxbFQInQ5dWMDV3ZpcG2hHGuUBVFa9rbtVfktaB9NAkXjKXipdA1gEVOYVm6eL6lS0HSZJzu3cvayqZBJiuntSBhsQXoA98cXnGe+hUaN5fqg26PO8oKo6PVOgtOwE6QN8qQDYTOe2QTSo0e/3m9nSkHVNVmgCh5nF8fGSFVj804wrhCEx2oEo+OR3O6mO77gkk3q48OXlTOZmlQ1lkAjRLRxcwzqYN0PXrygD9pMdXWAfoVaEr6RCgA7Tatw/PnROFTOL4JWMu9UMz6v3wmRczUomIwKonJclXuhAfxIasmayHxOvMRdYQoAcqEcEDNPucOLmoE1iJTYAO0H8VIJs4FXpTwDmGSAUkNiQJexuS3Flzq1jIWw9SzdQ8xAepvsSGzEVsUqFTof+tCu38T6GqTG4FIVWc7FJVeVT8dI4OPx0+qniJX2Jz1ummcoZzEqD9d6sOEAoQ0uqQ5JLYiI2Kt4qFrEEVPeKj3MgBOkD/AYNApEBcfHX4IT4C9KaAU5ncY11V065YVCW9+jv8tpZDfZaDHClXSooCiFYQBYg7j9KqqwKS+N0qqNbesQbioywyAVqlZ33uCOxURTKPA+Kpr84avvNIdAjQmwJdQKitEKDHCqkcBGhF181zJSbpl8l0AfoCQM96F+wCQMbd2jhHqzOGxNXll1QrtUlJLK4N0ULZONyhj486jlWw9LlKCvFDknLWhcmJxT0dlHYkFteG5EXZONwF6IGqJJEqIRREBR71s7dTfskaXRtHGxW/eyo9fJbD2SkdC1p8qKSQeUhSUqFXBUiuiQ3Ji7Jx5kmFToW+U4BARGwUrOS5M08b0B2VlCyS2JCjifhRRyDxof7TxPFRjel6e+JARNZAtHS0Irm2Wo4AXafVSRJpfzoAIa0YASZAOwq8MObMJKiwAnStkHOiVJ5IrlOhB5Q6p1CAviDQqgpVt2Pn2CS9IQGky6ZjDbN6UmdzOevpmIdWVjUXqcboUhigVwWIoKq3dXyQjU5yFKBfUKljd5HEdVVf4scBIEAzaMiF1NE/FXpTTW3IVGgGKrU6Fej9V7DITlG9IgGG9lq3dl1+XT9KG6VLdf8gpwdpXTrWRMAj8RLQ1ZrcNyMPf5JCJc1NyqxFOn47kl9V8QBNssHuKAH6iZZdVUVt9gAdoO8UcI4hImGAJip5v1PnnnZOrkke03KwXJdWSuCunlQlv2oDnWV1xUvmVmuyWw7nS7LqdZVz4XOTooTp6vlJslVL4sYya41qQ7pgdrRe1dzkNJjy23YBenzxUckmlYkkm8BKbBTUZKO7NlbhTIVmXywgSUmFXhVQm5baBOhBOVECo6Os+K0JNY5sAlIl03LUG6XsBPYVWiXf7XVJ9VI70gFEHZlHniutFPB0bgI09fXMzm13nLmVdo7PZczbPj5KkkQWTWxccdQ4NXeAHiuotFPaj54HaFc50CsG6AB9pwDZxcTmALNPh6q5A3SADtAFA6Q969i0/2QPrS5m34337savKlWH2KPLqIqFzE2AOSvZblV3dCBjlDZd8RLuyIsF+R8rJJEBmmwbZtMFCPEToLecKCHUrmapfbRyNheZi8RL5iZzKRsCYuVD5cQdo7TpijcVGm4uBVDVQlVjAnSt5D8JtLO7ukAjfjpsPg3orpyoCk03P+l/b22I3qWN+iwHcdwl3quL7gCV+nB0oL5VIokfBd6sShqgSXYG7cQLQ9tNAzSXlGweZwOSe0LLW45UaJ5sZUlgIBe8rpwo8C5XoTv+8CYRzxHG8esCoUBzICI+u155Kj9EFydH7/Rb5iRAE+xqGwcAtUldnwF6VfbhO4WoTxF/h25Wv0n8korhI3w/0oXv2SXQ9RmgA/Rhrl34ArSW3i1MqdBa26FFgPa/vqZkbwNaTUQuR3YwDR96cud21r0fQwB/Z3wqXqelc79F5LRIqB1Wv21HEk0m6vBzdWCuHl+AJhSCj5NCNy0fS31nBQzQa6ZV9SU2zmlRvuWg8N3apUJvN2zx9qdKpKN31xiSN2VzuZZDfeubiEcq094PqaTEL/Gj1uDOo8aR2BQwKvazn6s103hUFSfalfe5AM3+/AQ5Ajs2rZtICtJRuwA9UJAkjohH/KgkuvOocSS2VOi6XSPapUIPyFZgjnpfNY4kJUAH6DssCTSp0EoB/lxtYuppWg+t3kO7t1inn9yPIeIpYajAjp2a29lsRG8SK9GO+HHySOZW2pHYyntNgCbS1TYqKQF6rK3SjmQlQBOVXrBRSQnQAfpOgbOOrhcYftq/d1zw0nLwbKAKPSspJExV0c5Mtqq+ozcfap0d+pavqxo+o+68a1frpc8dvSserI+PqiBJZa18BGil7Pi50pzASmz8CJ+PDNCbPmoTONWsqr6zTgcnfmdNBFZiE6BfUEAldxZU5LSYNbdaM5UvFXpVSv6dQipoh11HUpw43MpEjkkVD/FBbPbzdG2Uvd+uO4DKtdJt9DxAF5/f/d7pxkdByRgFHjkJyDwB2t0SjeNUotxKqkJ0/TqVM0BvrQEoGCpv5V1C/U+h49QdE6C9v7dN7gBuTtJyHFAuQAfoA/isl0L166NHJxiNJ8c86QPVJiDxu7GoCxLph1UFXJ6T1kZpRXQiOqiWqbp/OH7dUydAw0shScos8Gb5deB0xhDt3MLzUBBSoesfS1HVl1SiVOgVtwC9bTt1jFZQkZ0+q8rMqqSz/Do6OGPeCjSByIHGqXhEvHfFMqo8t/E4FdpZDxlDYiF9dldO1FzuJpB/GpmIRWwC9Pj4JfodtQnQRxXcjQ/QAVqdXrfPU6Ff2IAdmystx7ENmpZjcFt+geO/pgG6hlFBVmnt3rnUXNMqtJqYLpJAtPdFxpD41FsCIp6TOCe2Ss8OHUj8s/psp+iQMWXe1E+BkaSQmy9JSoCu00i0U3kK0Ju2SqhU6HEtIdo5oJEThRQZVUCqewJZE6muHTap0INNSgAh4BFAOkAj8XbME6A3FYngxIYkhVQMB0angjixdLQTTqx0jHP/IL7Vuh0tl3nlf6wQxw54AXpVTSW2siHAdNkEaPhhlAAdoG83ndo4+K52pbcc6jRwNkHVB3ZVr46eORV6VfF/CTQBkUA/q6dWG5JWGbVRnDWS2By/JCdnvt/+qB6aiDcrKWRuAg25bwRoonZtE6B97R5GBugBZMU3vJ0Wg6QqQBOVoE2ADtB3CjhAkCOcXLwgs0/NnPhJP0/iVzYktlnt2qV66I5ELz6U4NU8ZIyTKOKXrNvxo+LtgqorNtUakA3p5ta6S6jXdiSxxKZDYJJs8ibBiWVWUmadMM4anUoaoLcMEiFIUlTFW6a7cpUJ0KsCbTykQjMxU6FXBUiReeuJfeXf5SDVS/VZZPeTKk+S1GHzzraqSwdSbVXeiA6lTYBmP53bASvxQRI5654QoEmGBjZO4sjOJxcbVR0OLOvwUEeXrntCgD6QPidxAXoseMfFN0AH6AMK1EOdjZ4K/aPlfwLf1zGvPcAFAAAAAElFTkSuQmCC", "position": "center" }, { "type": "text", "value": "", "font": 1, "position": "left" }, { "type": "text", "value": "ФІСКАЛЬНИЙ ЧЕК", "font": 1, "position": "center" }, { "type": "text", "value": " ", "font": 1, "position": "left" }, { "type": "text", "value": " ", "font": 1, "position": "left" }, { "type": "text", "value": " ", "font": 1, "position": "left" }]; app.print.modules.textToRasterize(s); }, textToRasterize: function(strings, printer){ var newstring = function(item){ var text = item.value.replace(/ /g,"  "); var string = document.createElement('div'); if(item.value == ' '){ text = " "; } string.innerHTML = text; string.setAttribute('style', 'text-align:'+item.position); return string; } var html = ''; var div = document.createElement('div'); div.setAttribute('style', 'display:none; background: white; width: 300px; font-size: 12.7pt; font-family: monospace;'); //div.setAttribute('style', 'position:absolute; top:120px; left:5px; background: white; width: 300px; font-size: 12.7pt; font-family: monospace;'); //на єкран for(var key in strings){ var item = strings[key]; if(item.type == "text"){ div.appendChild(newstring(item)); } if(item.type == "image"){ var string = document.createElement('div'); string.setAttribute('style', 'text-align:'+item.position); var img = document.createElement("img"); img.src = "data:image/png;base64,"+item.value; img.setAttribute('style', 'padding:10px;'); string.appendChild(img); div.appendChild(string); } } //Чек для печати будет отображен на экране /* document.body.addEventListener("click", function(e){ div.remove(); document.body.removeEventListener("click"); }, false); document.body.appendChild(div); */ function getWidth(size, protocol) { // var PRINT_SERVER = "PRINT_SERVER"; // var ANDROID_IMAGE_2 = "ANDROID_IMAGE_2"; if (protocol == "printserver_windows_1808") { switch (size) { case "58": return "180"//180 case "80": return "270" default: return "180" } } else { switch (size) { case "58": return "380" case "80": return "576" default: return "380" } } } var witdh = getWidth(printer.size, printer.protocol); if(printer.width > 0){ witdh = printer.width; } var fontSize = '16pt'; try { if (this.webviewCheck() == 'android_webview') { if (Android.getAppVersion() >= 86) { fontSize = '14.75pt' } } else if (this.webviewCheck() == 'cef_webview') { fontSize = '16pt' } } catch(err) { fontSize = '16pt' } return '
'+div.innerHTML+'
'; }, webviewCheck: function() { if(window.webkit != null) { if (typeof window.webkit.messageHandlers === "undefined") { //console.log("not ios webview") } else { //console.log("ios webview") return "ios_webview" } } if (typeof Android === "undefined") { //console.log("not android webview") } else { //console.log("android webview") return "android_webview" } if (typeof window.cefQuery === "undefined") { //console.log("not cef") } else { //console.log("cef") return "cef_webview" } return "browser" }, bignumbers: function(numb){ var symbols = { 0: [ "$$$$$$", "$ $", "$ $", "$ $", "$ $", "$ $", "$$$$$$" ], 1: [ " $", " $ $", "$ $", " $", " $", " $", " $" ], 2: [ "$$$$$$", " $", " $", "$$$$$$", "$ ", "$ ", "$$$$$$" ], 3: [ "$$$$$$", " $", " $", "$$$$$$", " $", " $", "$$$$$$" ], 4: [ "$ $", "$ $", "$ $", "$$$$$$", " $", " $", " $" ], 5: [ "$$$$$$", "$ ", "$ ", "$$$$$$", " $", " $", "$$$$$$" ], 6: [ "$$$$$$", "$ ", "$ ", "$$$$$$", "$ $", "$ $", "$$$$$$" ], 7: [ "$$$$$$", " $", " $", " $", " $", " $", " $" ], 8: [ "$$$$$$", "$ $", "$ $", "$$$$$$", "$ $", "$ $", "$$$$$$" ], 9: [ "$$$$$$", "$ $", "$ $", "$$$$$$", " $", " $", "$$$$$$" ] }; function getSymbol(numbStr) { for (var s in symbols) { if (s.toString() == numbStr) { return symbols[s]; } } } function applySymbols(symbol1, symbol2) { var symbols = []; for (var s1 in symbol1) { var str = symbol1[s1] + " " + symbol2[s1] symbols.push(str) } return symbols; } var orderNumb = numb + ""; if (orderNumb.length == 0) { orderNumb = "00"; } else if (orderNumb.length == 1) { orderNumb = "0" + orderNumb; } var a = orderNumb.charAt(0) var b = orderNumb.charAt(1) return applySymbols(getSymbol(a), getSymbol(b)) }, electronESCPOS: function(device, printer, check){ console.log("ПРинтер",check["printer"]); console.log("check.strings",check.strings) device.open(function(){ if(check["printer"]["mode"] == "image"){ if(webshot == ""){ try{ webshot = require('webshot'); }catch(err){ console.error(err); } } var webshotoptions = { siteType:'html', screenSize: { width: 600, height: 'all' }, shotSize: { width: 600, height: 'all' }, userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36' }; try{ if(electron == ""){ electron = require('electron'); } }catch(err){ console.error(err); } try{ var userappData = electron.remote.app.getPath('userData'); }catch(err){ app.main.error("Electron: Error 6621"); var userappData = ""; } console.log(userappData); try{ var htmlcode = 'print'+check["html"]["code"]+''; webshot(htmlcode, userappData+'/\print.png', webshotoptions, function(err) { console.log("screenshot now saved to hello_world.png"); console.error(err); escpos.Image.load(userappData+'/\print.png', function(image){ printer.raster(image).cut().close(); }); }); }catch(err){ console.error(err) } } if(check["printer"]["mode"] == "text"){ var escposSTR = check.strings; for (var i = 0; i < escposSTR.length; i++) { var thisSTR = escposSTR[i]; if(thisSTR.type == "byte"){ console.log("byte",thisSTR.byteValue) printer.println(String.fromCharCode.apply(null,thisSTR.byteValue)); } if(thisSTR.type == "text"){ printer.font('a'); switch(thisSTR.position){ case "center": printer.align("ct"); break; case "left": printer.align("lt"); break; case "right": printer.align("rt"); break; default: printer.align("lt"); } switch(thisSTR.font){ case 1: printer.size(1, 1); break; case 2: printer.size(1, 1); break; case 3: printer.size(2, 1); break; } printer.text(thisSTR.value); } } //printer.text(""); //printer.text(""); //printer.text(""); //printer.text(""); //printer.text(""); printer.cut(); printer.close(); } }) }, generatehistory: function(content) { var history = {}; history["info"] = {}; history["type"] = "check"; history["info"]["type"] = "check"; history["IsFiscalCheck"] = true; history["info"]["id"] = content.products[0].id; history["info"]["userbase"] = preload["userbase"]; history["info"]["time"] = content.products[0].time; history["info"]["date"] = content.products[0].date; history["info"]["bankingData"] = content.products[0].mosst; history["info"]["servicecash"] = content.products[0].cashservice; //history["info"]["day"] = currentDay(); //history["info"]["comment"] = content.products[0].text; if (preload["sklad"][currentsklad]["pin"] == 1) { /*Запрашивать PIN*/ history["info"]["user"] = currentuser; } else { /*Не запрашивать PIN*/ history["info"]["user"] = $("#userseller").val(); } var paycash = $("#paycash").val(); var payvisa = $("#payvisa").val(); history["info"]["smena"] = content.products[0].currentsmena; history["info"]["client"] = content.products[0].client; history["info"]["discount"] = content.products[0].skidka; try { history["info"]["discounttitle"] = preload["discount"][currentsklad][history["info"]["discount"]]["title"]; } catch (err) { console.log("currentdiscount пустой"); } history["info"]["sklad"] = content.products[0].sklad; history["info"]["summ"] = content.products[0].summ; history["info"]["nall"] = content.products[0].nall; if (preload["sklad"][content.products[0].sklad]["maptable"] == 1) { history["info"]["desktop"] = content.products[0].desktop; try{ history["info"]["desktopname"] = preload["desktop"][currentsklad][currentzal][content.products[0].desktop]["name"]; }catch(err){ } } history["info"]["cash"] = content.products[0].cash; history["info"]["visa"] = content.products[0].visa; history["info"]["coupon"] = 0; var sdacha = history["info"]["nall"] - content.products[0].summ; if (sdacha < 0) { sdacha = 0; } history["info"]["sdacha"] = sdacha; history["info"]["allcena"] = content.products[0].summ; history["products"] = $.map(content["products"][0]["check"], function(value, index) { return [value]; }); /*отображаем стоимость в чеке без наценки за обслуживание*/ if (content["products"][0]["cashservice"] > 0) { for (var i = 0; i < history["products"].length; i++) { if (history["products"][i]["noservicesum"] != 0.00) { history["products"][i]["cenaout"] = history["products"][i]["noservicesum"]; } } } return history; }, getdevice: function() { try { if (preload["settings"]["mode"] == "multiterminals") { var devices = $.map(preload["devices"][currentsklad], function(value, index) { return [value]; }); } else { var devices = $.map(preload["devices"][currentsklad]["sklad"], function(value, index) { return [value]; }); } } catch (err) { var devices = {}; } return devices; }, rasterize: { check: { put: function(thisbasket) { var feed = thisbasket["printer"]["feed"]; $(".check_feed").html("") var hhhbr = ""; for (var i = 0; i < feed; i++) { hhhbr = hhhbr + "
"; } $(".check_feed").html(hhhbr); /*$(".check_ordercontainer").html(thisbasket["info"]["id"]);*/ $(".check_datecontainer").html(thisbasket["info"]["date"] + " " + thisbasket["info"]["time"]); if (thisbasket["info"]["servicecash"] > 0) { $(".check_topay_box").show(); $(".check_topay").html(thisbasket["info"]["servicecash"]); } else { $(".check_topay_box").hide(); } $(".check_allcena").html(app.main.sum(thisbasket["info"]["allcena"], thisbasket["info"]["servicecash"])); if (thisbasket["info"]["nall"] != "") { $(".check_nall").html(thisbasket["info"]["nall"]); $(".check_change").html(thisbasket["info"]["sdacha"]); $(".check_changebox").show(); } else { $(".check_changebox").hide(); } if (thisbasket["printer"]["header"]) { $(".check_headerbox").show(); var headertext = thisbasket["printer"]["header"]; $(".check_header").html(headertext.replace("\n", '
')); } if (thisbasket["printer"]["footer"] != "") { $(".check_footerbox").show(); var headertext = thisbasket["printer"]["footer"]; $(".check_footer").html(headertext.replace("\n", '
')); } if (thisbasket["info"]["desktop"]) { $(".check_desktopcontainerbox").show(); $(".check_desktopcontainer").html(thisbasket["info"]["desktopname"]) } else { $(".check_desktopcontainerbox").hide(); } if (thisbasket["printer"]["logo"]) { if (thisbasket["printer"]["protocol"] == "printserver_windows") { var logoo = thisbasket["printer"]["logo"]; var logoo1 = logoo.replace(/[+]/g, '!____!'); var logoo2 = logoo1.replace(/[\/]/g, '!__1__!'); switch (thisbasket["printer"]["size"]) { case '57': $(".check_logocontainer").html(" ") break; case '58': $(".check_logocontainer").html(" ") break; case '80': $(".check_logocontainer").html(" ") break; } } else { switch (thisbasket["printer"]["size"]) { case '57': $(".check_logocontainer").html(" ") break; case '58': $(".check_logocontainer").html(" ") break; case '80': $(".check_logocontainer").html(" ") break; } } } }, size_57: function(check) { jPut["check58_list"].data = check.checkStrings; var html = $("#check58").html(); return html; }, size_58: function(check) { jPut["check58_list"].data = check.checkStrings; var html = $("#check58").html(); return html; }, size_80: function(check) { jPut["check80_list"].data = check.checkStrings; var html = $("#check80").html(); return html; }, size_57win: function(check) { jPut["check58win_list"].data = check.checkStrings; var html = $("#check58win").html(); return html; }, size_58win: function(check) { jPut["check58win_list"].data = check.checkStrings; var html = $("#check58win").html(); return html; }, size_80win: function(check) { jPut["check80win_list"].data = check.checkStrings; var html = $("#check80win").html(); return html; }, }, report: { put: function(thisbasket) { var feed = thisbasket["printer"]["feed"]; $(".check_feed").html("") var hhhbr = ""; for (var i = 0; i < feed; i++) { hhhbr = hhhbr + "
"; } $(".check_feed").html(hhhbr); $(".check_datecontainer").html(thisbasket["info"]["date"] + " " + thisbasket["info"]["time"]); }, size_57: function(check) { jPut["check58_list_report"].data = check.checkStrings; jPut["check58_list_report_ex"].data = check.info.report; var html = $("#check58_report").html(); return html; }, size_58: function(check) { jPut["check58_list_report"].data = check.checkStrings; jPut["check58_list_report_ex"].data = check.info.report; var html = $("#check58_report").html(); return html; }, size_80: function(check) { jPut["check80_list_report"].data = check.checkStrings; jPut["check80_list_report_ex"].data = check.info.report; var html = $("#check80_report").html(); return html; }, size_57win: function(check) { jPut["check58win_list_report"].data = check.checkStrings; jPut["check58win_list_report_ex"].data = check.info.report; var html = $("#check58win_report").html(); return html; }, size_58win: function(check) { jPut["check58win_list_report"].data = check.checkStrings; jPut["check58win_list_report_ex"].data = check.info.report; var html = $("#check58win_report").html(); return html; }, size_80win: function(check) { jPut["check80win_list_report"].data = check.checkStrings; jPut["check80win_list_report_ex"].data = check.info.report; var html = $("#check80win_report").html(); return html; }, }, }, rasterizenew: function(thisbasket) { if(thisbasket.uaprro == true){ var check = { checkStrings: thisbasket["products"], printer: thisbasket["printer"], info: thisbasket["info"], data: null, strings:[] }; var newtextcheck = []; // //Открыть денежный ящик // if (thisbasket["info"]["type"] == "check" && thisbasket["info"]["cash"] > 0) { // check.strings.push( // { // type: "byte", // byteValue: [ // 0x1B, 0x70, 0x00, 0x64, 0xFA // ] // } // ); // } /** * костыльчик котрый нужен, что бы убрать лишние элементы, если продажу проводили не фискально, а теперь копию чека надо */ var notFiscalCopy = false; if (Object.keys(thisbasket.prodTax.prodTaxPercent).length == 0 && Object.keys(thisbasket.prodTax.prodTaxSum).length == 0 && Object.keys(thisbasket.prodTax.prodTaxType).length == 0 && thisbasket.info.rroNum == '' && thisbasket.info.fiscalNumber == '') { notFiscalCopy = true; } var thislogo = ""; if (thisbasket["printer"]["logo"]) { thislogo = "data:image/png;base64," + thisbasket["printer"]["logo"]; } var ostitle = "android"; if(thisbasket["printer"]["os"] != ""){ ostitle = thisbasket["printer"]["os"]; } var stringlength = 32; if(thisbasket["printer"]["size"] == 80){ stringlength = 48; } var lineh = ""; for (var i = 0; i < stringlength; i++) { switch(thisbasket["printer"]["protocol"]){ case "epson_sdk_ios_bluetooth": lineh = lineh + "*"; break; default: lineh = lineh + "-"; } } //Открыть денежный ящик // if (thisbasket["info"]["type"] == "check" && thisbasket["info"]["cash"] > 0) { // newtextcheck.push( // { // type: "byte", // byteValue: [ // 0x1B, 0x70, 0x00, 0x64, 0xFA // ] // } // ); // } if(thisbasket["printer"]["model"] == "PSE200"){ newtextcheck.push({type: "byte",byteValue: [0x1C, 0x2E]}); } /*Переключение кодовой страници принтера*/ var codepage = thisbasket["printer"]["codepage"]; if(codepage != 0){ if(codepage == 1000){ codepage = 0; } //Выключить китайский режим if(codepage == 2000){ newtextcheck.push({type: "byte",byteValue: [0x1C, 0x2E]}); } byteArray = []; byteArray.push(0x1B); byteArray.push(0x74); byteArray.push(round(codepage,0)); newtextcheck.push( { type: "byte", byteValue: byteArray } ); } if(thisbasket.printer.topfeed > 0){ for (var i = 0; i < thisbasket.printer.topfeed; i++) { try { newtextcheck.push({ type: "text", value: " ", font: 1, position: "left" }); } catch (err) {} } } try { if (thisbasket["printer"]["logo"] != "") { newtextcheck.push({ type: "image", value: thisbasket["printer"]["logo"], position: "center" }); } } catch (err) {} try { if (thisbasket["printer"]["header"] != "" && thisbasket["printer"]["header"] != undefined) { newtextcheck.push({ type: "text", value: thisbasket["printer"]["header"], font: 1, position: "center" }); } } catch (err) {} try { if (thisbasket["info"]["companyName"] != "" && thisbasket["info"]["companyName"] != undefined) { newtextcheck.push({ type: "text", value: thisbasket["info"]["companyName"], font: 1, position: "center" }); } } catch (err) {} try { if (thisbasket["info"]["pointName"] != "" && thisbasket["info"]["pointName"] != undefined) { newtextcheck.push({ type: "text", value: thisbasket["info"]["pointName"], font: 1, position: "center" }); } } catch (err) {} try { if (thisbasket["info"]["pointAdress"] != "" && thisbasket["info"]["pointAdress"] != undefined) { newtextcheck.push({ type: "text", value: thisbasket["info"]["pointAdress"], font: 1, position: "center" }); } } catch (err) {} try { if (thisbasket["info"]["IPN"] != "" && thisbasket["info"]["IPN"] != undefined) { newtextcheck.push({ type: "text", value: "ПН "+thisbasket["info"]["IPN"], font: 1, position: "center" }); } } catch (err) {} try { if (thisbasket["info"]["IID"] != "" && thisbasket["info"]["IID"] != undefined) { newtextcheck.push({ type: "text", value: "ІД "+thisbasket["info"]["IID"], font: 1, position: "center" }); } } catch (err) {} try { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } catch (err) {} try { thisbasket.products.forEach(function(bitem) { var bonustext = ""; try{ if(bitem["bonus"] != '' && bitem["bonus"] != 0 && bitem["bonus"] != undefined){ bonustext = " ("+lang["Bonus"]+")"; } }catch(err){ } var modstext = ""; try{ if(bitem["modstitle"] != '' && bitem["modstitle"] != 0 && bitem["modstitle"] != undefined){ modstext = " ("+bitem["modstitle"]+" )"; } }catch(err){ } var printNameString = bitem.name+" "+bonustext+" "+modstext; var taxLetter = ""; if(bitem.tax){ taxLetter = bitem.tax; } newtextcheck.push({ type: "text", value: printNameString, font: 1, position: "left" }); newtextcheck.push({ type: "text", value: bitem.kolvo + " x " + CurrencyFormatted(bitem.cenaout) + " = " + CurrencyFormatted(bitem.cenaout * bitem.kolvo)+ " "+taxLetter, font: 1, position: "right" }); if(bitem["uktzed"] != '' && bitem["uktzed"] != null){ newtextcheck.push({ type: "text", value: "Код УКТЗЕД: "+bitem["uktzed"], font: 1, position: "left" }); } try { if (bitem.barcode) { newtextcheck.push({ type: "text", value: "ШТРИХ КОД: " + bitem.barcode, font: 1, position: "left" }); } } catch(err) { } try { if (bitem.akciz) { newtextcheck.push({ type: "text", value: "АКЦИЗНА МАРКА: " + bitem.akciz, font: 1, position: "left" }); } } catch(err) { } if(bitem.discSum > 0){ newtextcheck.push({ type: "text", value: app.print.modules.escposstr(2, stringlength, "ЗНИЖКА", bitem.discSum), font: 1, position: "left" }); } try{ if(thisbasket["info"]["checkcomments"] == 1 || thisbasket["info"]["type"] == "begunok"){ if(bitem["comment"] != "" && bitem["comment"] != null && bitem["comment"] != undefined){ newtextcheck.push({ type: "text", value: bitem["comment"], font: 1, position: "left" }); } } }catch(err){ } }) } catch (err) {} try { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } catch (err) {} try { if(thisbasket.info.hallscreen_id != null && thisbasket.info.hallscreen_id != ""){ var bignums = app.print.modules.bignumbers(thisbasket.info.hallscreen_id); for(var key in bignums){ var str = bignums[key]; newtextcheck.push({ type: "text", value: str, font: 1, position: "center" }); } } } catch (err) {} try { newtextcheck.push({ type: "text", value: 'ПРОДАЖ', font: 1, position: "center" }); } catch (err) {} try { if (thisbasket.info.roundsum != "") { newtextcheck.push({ type: "text", value: app.print.modules.escposstr(2, stringlength, "ЗАОКРУГЛЕННЯ", thisbasket.info.roundsum), font: 1, position: "left" }); } } catch (err) {} try { if (thisbasket.info.allcena != "") { newtextcheck.push({ type: "text", value: app.print.modules.escposstr(2, stringlength, "СУМА", thisbasket.info.allcena), font: 1, position: "left" }); } } catch (err) {} try { if (thisbasket.info.visa != "" && thisbasket.info.visa > 0) { newtextcheck.push({ type: "text", value: app.print.modules.escposstr(2, stringlength, "БАНКІВСЬКА КАРТКА", thisbasket.info.visa), font: 1, position: "left" }); } } catch (err) {} console.warn('thisbasket.bankData >>', thisbasket.bankData); if (thisbasket.bankData != null) { // try { // if (thisbasket.bankData.merchantID) { // newtextcheck.push({ // type: "text", // value: app.print.modules.escposstrS(2, stringlength, "МIД", thisbasket.bankData.merchantID), // font: 1, // position: "left" // }); // } // } catch(err) { // console.error(err) // } try { if (thisbasket.bankData.bankName) { newtextcheck.push({ type: "text", value: app.print.modules.escposstrS(2, stringlength, "Еквайр", thisbasket.bankData.bankName), font: 1, position: "left" }); } } catch(err) { console.error(err) } try { if (thisbasket.bankData.terminalID) { newtextcheck.push({ type: "text", value: app.print.modules.escposstrS(2, stringlength, "Термiнал", thisbasket.bankData.terminalID), font: 1, position: "left" }); } } catch(err) { console.error(err) } try { if (thisbasket.bankData.rrn) { newtextcheck.push({ type: "text", value: app.print.modules.escposstrS(2, stringlength, "RNN", thisbasket.bankData.rrn), font: 1, position: "left" }); } } catch(err) { console.error(err) } try { if (thisbasket.bankData.issuerName) { newtextcheck.push({ type: "text", value: app.print.modules.escposstrS(2, stringlength, "Платіжна система", thisbasket.bankData.issuerName), font: 1, position: "left" }); } } catch(err) { console.error(err) } try { if (thisbasket.bankData.cardNumber) { newtextcheck.push({ type: "text", value: app.print.modules.escposstrS(2, stringlength, "ЕПЗ", thisbasket.bankData.cardNumber), font: 1, position: "left" }); } } catch(err) { console.error(err) } try { if (thisbasket.bankData.authorizationCode) { newtextcheck.push({ type: "text", value: app.print.modules.escposstrS(2, stringlength, "Код авторизацiї", thisbasket.bankData.authorizationCode), font: 1, position: "left" }); } } catch(err) { console.error(err) } var sign = thisbasket.bankData.isSignature ? 'Пiдпис' : 'Пiдпис власника карти не потрiбен'; if (Object.keys(thisbasket.bankData).length) { newtextcheck.push({ type: "text", value: sign, font: 1, position: "left" }); if (thisbasket.bankData.isSignature) { try { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } catch (err) {} } } } try { if (thisbasket.info.nall != "") { // var cashSumm = function() { // if(thisbasket.info.nall > 0 && thisbasket.info.visa == '0.00') {// thisbasket.info.allcena - // return thisbasket.info.nall; // } else { // if (thisbasket.info.allcena - thisbasket.info.nall - thisbasket.info.visa == 0) { // return thisbasket.info.nall; // } else { // alert('lol2') // var remainingAmount = thisbasket.info.allcena - thisbasket.info.nall - thisbasket.info.visa; // console.warn(remainingAmount); // return String(Number(thisbasket.info.nall) + remainingAmount); // } // } // } newtextcheck.push({ type: "text", value: app.print.modules.escposstr(2, stringlength, "ГОТІВКА", thisbasket.info.nall),// font: 1, position: "left" }); // if(thisbasket.info.allcena - thisbasket.info.nall > 0 && thisbasket.info.visa == '0.00'){ // newtextcheck.push({ // type: "text", // value: app.print.modules.escposstr(2, stringlength, "ГОТІВКА 2", thisbasket.info.allcena - thisbasket.info.nall), // font: 1, // position: "left" // }); // } } } catch (err) {} console.warn('this basket check>>>', thisbasket); //Костыльчик который говорит что все за нал если не указали обратного try { if (thisbasket.info.nall <= 0 && thisbasket.info.visa <= 0) { newtextcheck.push({ type: "text", value: app.print.modules.escposstr(2, stringlength, "ГОТІВКА", thisbasket.info.nall), font: 1, position: "left" }); } } catch (err) {} try { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } catch (err) {} try { if (thisbasket.info.sdacha > 0) { newtextcheck.push({ type: "text", value: app.print.modules.escposstr(2, stringlength,"РЕШТА", thisbasket.info.sdacha), font: 1, position: "left" }); /*Пробел*/ newtextcheck.push({ type: "text", value: "", font: 1, position: "left" }); } } catch (err) {} if(thisbasket.prodTax != null){ for(var kkk in thisbasket.prodTax.prodTaxSum){ var taxitem = thisbasket.prodTax.prodTaxSum[kkk]; var taxitemPercent = thisbasket.prodTax.prodTaxPercent[kkk]; var taxsum = app.main.sum(taxitem, -(round(taxitem, 2) * 100) / round(round(taxitemPercent, 2) + 100, 2)) //Добавил после того как переделывали подсчет сдвоенного налога с акцизом try{ if(thisbasket.prodTax.prodTaxSumSource[kkk]){ taxsum = thisbasket.prodTax.prodTaxSumSource[kkk]; } }catch(err){ } var taxitemType = thisbasket.prodTax.prodTaxType[kkk]; var cnoType = { "-1":"Без ПДВ", 0:"ПДВ", 1:"Акциз", 2:"ПФ" } try { newtextcheck.push({ type: "text", value: app.print.modules.escposstr(2, stringlength, cnoType[taxitemType]+" "+kkk+"="+taxitemPercent+"%", CurrencyFormatted(taxsum)), font: 1, position: "left" }); } catch (err) {} } /*Пробел*/ newtextcheck.push({ type: "text", value: "", font: 1, position: "left" }); } try { newtextcheck.push({ type: "text", value: "Валюта: Гривня (UAH)", font: 1, position: "left" }); } catch (err) {} if(thisbasket["info"]["checkcomments"] == 1){ /*Комментарий на чек в текстовом режиме*/ try { if (thisbasket.info.comment != "") { newtextcheck.push({ type: "text", value: "#"+thisbasket.info.comment, font: 1, position: "center" }); } } catch (err) {} } try { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } catch (err) {} try { var VN = !notFiscalCopy ? " ВН "+thisbasket.info.localNumber : ''; var NUMBER = !notFiscalCopy ? " №"+thisbasket.info.fiscalNumber : '' newtextcheck.push({ type: "text", value: thisbasket["info"]["date"] + " " + thisbasket["info"]["time"]+ NUMBER + VN,// font: 1, position: "left" }); } catch (err) {} // alert(thisbasket.info.qrcode) try{ if(thisbasket.info.qrcode != ''){ newtextcheck.push({ type: "image", value: thisbasket.info.qrcode, position: "center" }); newtextcheck.push({ type: "text", value: "", font: 1, position: "left" }); } }catch(err){ } // byteArray2 = []; // byteArray2.push(0x1B) // byteArray2.push(0x74) // byteArray2.push(round(codepage,0)) // newtextcheck.push( // { // type: "byte", // byteValue: byteArray2 // } // ); try { newtextcheck.push({ type: "text", value: !notFiscalCopy ? "Режим роботи: онлайн" : '', font: 1, position: "center" }); } catch (err) {} try { var FN = !notFiscalCopy ? "ФН ПРРО "+thisbasket.info.rroNum : ''; newtextcheck.push({ type: "text", value: FN + ' КАСА ' + thisbasket.info.cashRegisterNum, font: 1, position: "left" }); } catch (err) {} try { if (thisbasket.copyCheck) { try { newtextcheck.push({ type: "text", value: !notFiscalCopy ? "КОПІЯ ФІСКАЛЬНОГО ЧЕКА" : '', font: 1, position: "center" }); } catch(err) { } try { function copyDate() { var d = new Date(); var yy = d.getFullYear(); var mm = d.getMonth(); var dd = d.getDate(); var hh = d.getHours(); var min = d.getMinutes(); //var ss = d.getSeconds(); var mmm = (mm + 1) < 10 ? '0' + (mm + 1) : mm + 1 var ddd = dd < 10 ? '0' + dd : dd; var hhh = hh < 10 ? '0' + hh : hh; var minMin = min < 10 ? '0' + min : min; return yy + '-' + mmm + '-' + ddd + ' ' + hhh + ':' + minMin; } newtextcheck.push({ type: "text", value: "ДАТА КОПІЇ: " + copyDate(), font: 1, position: "left" }); } catch(err) { } // try { // newtextcheck.push({ // type: "text", // value: "ПІДПИС", // font: 1, // position: "left" // }); // newtextcheck.push({ // type: "text", // value: lineh, // font: 1, // position: "left" // }); // } catch(err) { // } } else { newtextcheck.push({ type: "text", value: "ФІСКАЛЬНИЙ ЧЕК", font: 1, position: "center" }); newtextcheck.push({ type: "text", value: "Skyservice POS", font: 1, position: "center" }); } } catch (err) {} try { if (thisbasket["printer"]["footer"] != "" && thisbasket["printer"]["footer"] != null) { newtextcheck.push({ type: "text", value: thisbasket["printer"]["footer"], font: 1, position: "center" }); } } catch (err) {} if(thisbasket.printer.feed > 0){ for (var i = 0; i < thisbasket.printer.feed; i++) { try { newtextcheck.push({ type: "text", value: " ", font: 1, position: "left" }); } catch (err) {} } } //Открыть денежный ящик if (thisbasket["info"]["type"] == "check" && thisbasket["info"]["cash"] > 0) { newtextcheck.push( { type: "byte", byteValue: [ 0x1B, 0x70, 0x00, 0x64, 0xFA ] } ); } try{ if( thisbasket["printer"]["charset"] == "cp866" ){ for(var key in newtextcheck){ if(newtextcheck[key]["type"] == "text"){ var string = newtextcheck[key]["value"]; newtextcheck[key]["value"] = string.replace(/і/g, 'i').replace(/І/g, 'I'); } } } }catch(err){ } check["strings"] = newtextcheck; check["printer"]["logo"] = ""; try{ if(thisbasket["printer"]["protocol"] == "android_tactile"){ check["data"] = { printParams:{ cutMode: "4" } } } }catch(err){ } console.log(JSON.stringify(check["strings"])); if(thisbasket["printer"]["mode"] == "image"){ check["html"] = { code: app.print.modules.textToRasterize(check["strings"], thisbasket["printer"]) }; } console.log("Чек на печать", check); return check; } else if(thisbasket.uaprro_xReport == true){ //sfghfdg var check = { checkStrings: thisbasket["products"], printer: thisbasket["printer"], info: thisbasket["info"], data: null, strings:[] }; //Открыть денежный ящик if (thisbasket["info"]["type"] == "check" && thisbasket["info"]["cash"] > 0) { check.strings.push( { type: "byte", byteValue: [ 0x1B, 0x70, 0x00, 0x64, 0xFA ] } ); } var thislogo = ""; if (thisbasket["printer"]["logo"]) { thislogo = "data:image/png;base64," + thisbasket["printer"]["logo"]; } var newtextcheck = []; var stringlength = 32; if(thisbasket["printer"]["size"] == 80){ stringlength = 48; } var lineh = ""; for (var i = 0; i < stringlength; i++) { switch(thisbasket["printer"]["protocol"]){ case "epson_sdk_ios_bluetooth": lineh = lineh + "*"; break; default: lineh = lineh + "-"; } } if(thisbasket["printer"]["model"] == "PSE200"){ newtextcheck.push({type: "byte",byteValue: [0x1C, 0x2E]}); } /*Переключение кодовой страници принтера*/ var codepage = thisbasket["printer"]["codepage"]; if(codepage != 0){ if(codepage == 1000){ codepage = 0; } //Выключить китайский режим if(codepage == 2000){ newtextcheck.push({type: "byte",byteValue: [0x1C, 0x2E]}); } byteArray = []; byteArray.push(0x1B); byteArray.push(0x74); byteArray.push(round(codepage,0)); newtextcheck.push( { type: "byte", byteValue: byteArray } ); } if(thisbasket.printer.topfeed > 0){ for (var i = 0; i < thisbasket.printer.topfeed; i++) { try { newtextcheck.push({ type: "text", value: " ", font: 1, position: "left" }); } catch (err) {} } } try { if (thisbasket["printer"]["logo"] != "" && thisbasket["printer"]["logo"] != null) { newtextcheck.push({ type: "image", value: thisbasket["printer"]["logo"], position: "center" }); } } catch (err) {} try { if (thisbasket["printer"]["header"] != "" && thisbasket["printer"]["header"] != undefined) { newtextcheck.push({ type: "text", value: thisbasket["printer"]["header"], font: 1, position: "center" }); } } catch (err) {} try { if (thisbasket["info"]["companyName"] != "" && thisbasket["info"]["companyName"] != undefined) { newtextcheck.push({ type: "text", value: thisbasket["info"]["companyName"], font: 1, position: "center" }); } } catch (err) {} try { if (thisbasket["info"]["pointName"] != "" && thisbasket["info"]["pointName"] != undefined) { newtextcheck.push({ type: "text", value: thisbasket["info"]["pointName"], font: 1, position: "center" }); } } catch (err) {} try { if (thisbasket["info"]["pointAdress"] != "" && thisbasket["info"]["pointAdress"] != undefined) { newtextcheck.push({ type: "text", value: thisbasket["info"]["pointAdress"], font: 1, position: "center" }); } } catch (err) {} try { if (thisbasket["info"]["IPN"] != "" && thisbasket["info"]["IPN"] != undefined) { newtextcheck.push({ type: "text", value: "ПН "+thisbasket["info"]["IPN"], font: 1, position: "center" }); } } catch (err) {} try { if (thisbasket["info"]["IID"] != "" && thisbasket["info"]["IID"] != undefined) { newtextcheck.push({ type: "text", value: "ІД "+thisbasket["info"]["IID"], font: 1, position: "center" }); } } catch (err) {} try { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } catch (err) {} try { newtextcheck.push({ type: "text", value: "Х-ЗВІТ", font: 2, position: "center" }); } catch (err) {} // test liner try { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } catch(err) { } // Open shifts try { if (thisbasket.xReport.ThisShift != null) { try { var fullDate = thisbasket.xReport.ThisShift.Opened.substr(0, 19) var dateDate = fullDate.substr(0, 10); var timeDate = fullDate.substr(11, 19); newtextcheck.push({ type: 'text', value: app.print.modules.escposstrS(2, stringlength, 'ЗМІНА ВІДКРИТА', dateDate + ' ' + timeDate), font: 1, position: "left" }) } catch(err) { console.warn('Shift err', err); } } } catch(err) { } //первій локальній чек/следующий локальній чек последний фискальный чек старт try { if (thisbasket.xReport.ereceiptStatus != null) { try { newtextcheck.push({ type: 'text', value: app.print.modules.escposstrS(2, stringlength, 'Останній фіскальний номер', thisbasket.xReport.ereceiptStatus.LastFiscalNum), font: 1, position: "left" }) } catch(err) { } } } catch(err) {} //первій локальній чек/следующий локальній чек последний фискальный чек старт конец try { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } catch(err) { } console.warn('this basket X report', thisbasket); // Taxes start try {// Header newtextcheck.push({ type: "text", value: "ПРОДАЖІ", font: 2, position: "center" }); } catch (err) {} try { newtextcheck.push({ type: "text", value: app.print.modules.escposstrS(2, stringlength, "ЧЕКІВ", thisbasket.xReport.Real.OrdersCount), font: 1, position: "left" }); } catch (err) {} try { newtextcheck.push({ type: "text", value: app.print.modules.escposstr(2, stringlength, "СУМА ПРОДАЖ", thisbasket.xReport.Real.Sum), font: 1, position: "left" }); } catch (err) {} try { for(var key in thisbasket.xReport.Real.PayForm){ var item = thisbasket.xReport.Real.PayForm[key]; try { newtextcheck.push({ type: "text", value: app.print.modules.escposstr(2, stringlength, item.PayFormName, item.Sum), font: 1, position: "left" }); } catch (err) {} } } catch(err) {} try { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } catch(err) { } try { for (var key in thisbasket.xReport.Real.Tax) { var item = thisbasket.xReport.Real.Tax[key]; newtextcheck.push({ type: 'text', value: app.print.modules.escposstrS(2, stringlength, 'ОБІГ' + ' ' + item.Letter, item.SourceSum ? CurrencyFormatted(item.SourceSum) : CurrencyFormatted(item.Turnover)), font: 1, position: "left" }) newtextcheck.push({ type: 'text', value: app.print.modules.escposstrS(2, stringlength, item.Name + ' ' + item.Letter, item.Prc + '%'), font: 1, position: "left" }) newtextcheck.push({ type: 'text', value: app.print.modules.escposstrS(2, stringlength, 'СУМА ПОДАТКУ' + item.Letter, CurrencyFormatted(item.Sum)), font: 1, position: "left" }) } } catch(err) { console.log(err) } // Taxes end try { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } catch(err) { } try { if (thisbasket.xReport.Ret != null) { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } } catch(err) { } // Возвраты все start // test liner try { if (thisbasket.xReport.Ret != null) { try { newtextcheck.push({ type: "text", value: "ПОВЕРНЕННЯ", font: 2, position: "center" }); } catch(err) { } try { newtextcheck.push({ type: 'text', value: app.print.modules.escposstrS(2, stringlength, 'ЧЕКІВ' , thisbasket.xReport.Ret.OrdersCount), font: 1, position: "left" }) } catch(err) { } try { newtextcheck.push({ type: 'text', value: app.print.modules.escposstrS(2, stringlength, 'СУМА ПОВЕРНЕННЯ' , CurrencyFormatted(thisbasket.xReport.Ret.Sum)), font: 1, position: "left" }) } catch(err) { } try { for (var key in thisbasket.xReport.Ret.PayForm) { var item = thisbasket.xReport.Ret.PayForm[key]; newtextcheck.push({ type: 'text', value: app.print.modules.escposstrS(2, stringlength, item.PayFormName, item.Sum), font: 1, position: "left" }) } } catch(err) { console.log(err) } try { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } catch (err) {} try { for (var key in thisbasket.xReport.Ret.Tax) { var item = thisbasket.xReport.Ret.Tax[key]; newtextcheck.push({ type: 'text', value: app.print.modules.escposstrS(2, stringlength, 'ОБІГ' + ' ' + item.Letter, item.SourceSum ? CurrencyFormatted(item.SourceSum) : CurrencyFormatted(item.Turnover)), font: 1, position: "left" }) newtextcheck.push({ type: 'text', value: app.print.modules.escposstrS(2, stringlength, item.Name + ' ' + item.Letter, item.Prc + '%'), font: 1, position: "left" }) newtextcheck.push({ type: 'text', value: app.print.modules.escposstrS(2, stringlength, 'СУМА ПОДАТКУ' + item.Letter , CurrencyFormatted(item.Sum)), font: 1, position: "left" }) } } catch(err) { console.log(err) } } } catch(err) {} // Return END // службове внесеня та службове вілучення старт try { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } catch (err) {} try { newtextcheck.push({ type: "text", value: app.print.modules.escposstr(2, stringlength, "Службове внесення", thisbasket.xReport.ServiceInput), font: 1, position: "left" }); } catch (err) {} try { newtextcheck.push({ type: "text", value: app.print.modules.escposstr(2, stringlength, "Службове вилучення", thisbasket.xReport.ServiceOutput), font: 1, position: "left" }); } catch (err) {} try { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } catch (err) {} try { newtextcheck.push({ type: "text", value: app.print.modules.escposstr(2, stringlength, "Готівка в касі", thisbasket.cashSum), font: 1, position: "left" }); } catch (err) {} // службове внесеня та службове вілучення кінець /* if(thisbasket.prodTax != null){ for(var kkk in thisbasket.prodTax.prodTaxSum){ var taxitem = thisbasket.prodTax.prodTaxSum[kkk]; var taxitemPercent = thisbasket.prodTax.prodTaxPercent[kkk]; var taxsum = app.main.sum(taxitem, -(round(taxitem, 2) * 100) / round(round(taxitemPercent, 2) + 100, 2)) var taxitemType = thisbasket.prodTax.prodTaxType[kkk]; var cnoType = { 0:"ПДВ", 1:"Акциз", 2:"ПФ" } try { newtextcheck.push({ type: "text", value: app.print.modules.escposstr(2, stringlength, cnoType[taxitemType]+" "+kkk+"="+taxitemPercent+"%", CurrencyFormatted(taxsum)), font: 1, position: "left" }); } catch (err) {} } newtextcheck.push({ type: "text", value: "", font: 1, position: "left" }); } */ try { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } catch (err) {} try { var a = thisbasket.info.fiscalNumber != null ? " №" + thisbasket.info.fiscalNumber : ''; var b = thisbasket.info.cashRegisterNum != null ? a != '' ? "/" : '' + thisbasket.info.cashRegisterNum : ''; newtextcheck.push({ type: "text", value: thisbasket["info"]["date"] + " " + thisbasket["info"]["time"] + a + b, font: 1, position: "left" }); } catch (err) {} try { newtextcheck.push({ type: "text", value: "Режим роботи: онлайн", font: 1, position: "center" }); } catch (err) {} try { newtextcheck.push({ type: "text", value: "ФН ПРРО "+thisbasket.info.rroNum + ' КАСА ' + thisbasket.info.CASHDESKNUM , font: 1, position: "left" }); } catch (err) {} try { newtextcheck.push({ type: "text", value: "СЛУЖБОВИЙ ЧЕК", font: 1, position: "center" }); newtextcheck.push({ type: "text", value: "Skyservice POS", font: 1, position: "center" }); } catch (err) {} try { if (thisbasket["printer"]["footer"] != "" && thisbasket["printer"]["footer"] != null) { newtextcheck.push({ type: "text", value: thisbasket["printer"]["footer"], font: 1, position: "center" }); } } catch (err) {} if(thisbasket.printer.feed > 0){ for (var i = 0; i < thisbasket.printer.feed; i++) { try { newtextcheck.push({ type: "text", value: " ", font: 1, position: "left" }); } catch (err) {} } } try{ if( thisbasket["printer"]["charset"] == "cp866" ){ for(var key in newtextcheck){ if(newtextcheck[key]["type"] == "text"){ var string = newtextcheck[key]["value"]; newtextcheck[key]["value"] = string.replace(/і/g, 'i').replace(/І/g, 'I'); } } } }catch(err){ } check["strings"] = newtextcheck; check["printer"]["logo"] = ""; try{ if(thisbasket["printer"]["protocol"] == "android_tactile"){ check["data"] = { printParams:{ cutMode: "4" } } } }catch(err){ } console.log(JSON.stringify(check["strings"])); if(thisbasket["printer"]["mode"] == "image"){ check["html"] = { code: app.print.modules.textToRasterize(check["strings"], thisbasket["printer"]) }; } console.log("Х на печать", check); return check; } else if(thisbasket.uaprro_zReport == true) { //sfghfdg var check = { checkStrings: thisbasket["products"], printer: thisbasket["printer"], info: thisbasket["info"], data: null, strings:[] }; //Открыть денежный ящик if (thisbasket["info"]["type"] == "check" && thisbasket["info"]["cash"] > 0) { check.strings.push( { type: "byte", byteValue: [ 0x1B, 0x70, 0x00, 0x64, 0xFA ] } ); } var thislogo = ""; if (thisbasket["printer"]["logo"]) { thislogo = "data:image/png;base64," + thisbasket["printer"]["logo"]; } var newtextcheck = []; var stringlength = 32; if(thisbasket["printer"]["size"] == 80){ stringlength = 48; } var lineh = ""; for (var i = 0; i < stringlength; i++) { switch(thisbasket["printer"]["protocol"]){ case "epson_sdk_ios_bluetooth": lineh = lineh + "*"; break; default: lineh = lineh + "-"; } } if(thisbasket["printer"]["model"] == "PSE200"){ newtextcheck.push({type: "byte",byteValue: [0x1C, 0x2E]}); } /*Переключение кодовой страници принтера*/ var codepage = thisbasket["printer"]["codepage"]; if(codepage != 0){ if(codepage == 1000){ codepage = 0; } //Выключить китайский режим if(codepage == 2000){ newtextcheck.push({type: "byte",byteValue: [0x1C, 0x2E]}); } byteArray = []; byteArray.push(0x1B); byteArray.push(0x74); byteArray.push(round(codepage,0)); newtextcheck.push( { type: "byte", byteValue: byteArray } ); } if (thisbasket.printer.topfeed > 0){ for (var i = 0; i < thisbasket.printer.topfeed; i++) { try { newtextcheck.push({ type: "text", value: " ", font: 1, position: "left" }); } catch (err) {} } } try { if (thisbasket["printer"]["logo"] != "" && thisbasket["printer"]["logo"] != null) { newtextcheck.push({ type: "image", value: thisbasket["printer"]["logo"], position: "center" }); } } catch (err) {} try { if (thisbasket["printer"]["header"] != "" && thisbasket["printer"]["header"] != undefined) { newtextcheck.push({ type: "text", value: thisbasket["printer"]["header"], font: 1, position: "center" }); } } catch (err) {} try { if (thisbasket["info"]["companyName"] != "" && thisbasket["info"]["companyName"] != undefined) { newtextcheck.push({ type: "text", value: thisbasket["info"]["companyName"], font: 1, position: "center" }); } } catch (err) {} try { if (thisbasket["info"]["pointName"] != "" && thisbasket["info"]["pointName"] != undefined) { newtextcheck.push({ type: "text", value: thisbasket["info"]["pointName"], font: 1, position: "center" }); } } catch (err) {} try { if (thisbasket["info"]["pointAdress"] != "" && thisbasket["info"]["pointAdress"] != undefined) { newtextcheck.push({ type: "text", value: thisbasket["info"]["pointAdress"], font: 1, position: "center" }); } } catch (err) {} try { if (thisbasket["info"]["IPN"] != "" && thisbasket["info"]["IPN"] != undefined) { newtextcheck.push({ type: "text", value: "ПН "+thisbasket["info"]["IPN"], font: 1, position: "center" }); } } catch (err) {} try { if (thisbasket["info"]["IID"] != "" && thisbasket["info"]["IID"] != undefined) { newtextcheck.push({ type: "text", value: "ІД "+thisbasket["info"]["IID"], font: 1, position: "center" }); } } catch (err) {} try { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } catch (err) {} try { newtextcheck.push({ type: "text", value: "Z-ЗВІТ", font: 2, position: "center" }); } catch (err) {} // test liner try { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } catch(err) { } console.error("ZZZ",thisbasket); // Open shifts if (thisbasket.zReport.ThisShift != null) { try { if (thisbasket.zReport.ThisShift.Opened) { var fullDate = thisbasket.zReport.ThisShift.Opened.substr(0, 19); var dateDate = fullDate.substr(0, 10); var timeDate = fullDate.substr(11, 19); newtextcheck.push({ type: 'text', value: app.print.modules.escposstrS(2, stringlength, 'ЗМІНА ВІДКРИТА', dateDate + ' ' + timeDate), font: 1, position: "left" }) if (thisbasket.zReport.closeTime != null) { newtextcheck.push({ type: 'text', value: app.print.modules.escposstrS(2, stringlength, 'ЗМІНА ЗАКРИТА', thisbasket.zReport.closeTime), font: 1, position: "left" }) } } } catch(err) { console.warn('Shift err', err); } } //первій локальній чек/следующий локальній чек последний фискальный чек старт if (thisbasket.zReport.ereceiptStatus != null) { try { newtextcheck.push({ type: 'text', value: app.print.modules.escposstrS(2, stringlength, 'Останній фіскальний номер', thisbasket.zReport.ereceiptStatus.LastFiscalNum), font: 1, position: "left" }) } catch(err) { } } //первій локальній чек/следующий локальній чек последний фискальный чек старт конец try { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } catch(err) { } console.warn('Z basket>>',thisbasket); // Taxes start try {// Header newtextcheck.push({ type: "text", value: "ПРОДАЖІ", font: 2, position: "center" }); } catch (err) {} try { newtextcheck.push({ type: "text", value: app.print.modules.escposstrS(2, stringlength, "ЧЕКІВ", thisbasket.zReport.Real.OrdersCount), font: 1, position: "left" }); } catch (err) {} try { newtextcheck.push({ type: "text", value: app.print.modules.escposstr(2, stringlength, "СУМА ПРОДАЖ", thisbasket.zReport.Real.Sum), font: 1, position: "left" }); } catch (err) {} for(var key in thisbasket.zReport.Real.PayForm){ var item = thisbasket.zReport.Real.PayForm[key]; try { newtextcheck.push({ type: "text", value: app.print.modules.escposstr(2, stringlength, item.PayFormName, item.Sum), font: 1, position: "left" }); } catch (err) {} } try { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } catch(err) { } try { for (var key in thisbasket.zReport.Real.Tax) { var item = thisbasket.zReport.Real.Tax[key]; newtextcheck.push({ type: 'text', value: app.print.modules.escposstrS(2, stringlength, 'ОБІГ' + ' ' + item.Letter, item.SourceSum ? CurrencyFormatted(item.SourceSum) : CurrencyFormatted(item.Turnover)), font: 1, position: "left" }) newtextcheck.push({ type: 'text', value: app.print.modules.escposstrS(2, stringlength, item.Name + ' ' + item.Letter, item.Prc + '%'), font: 1, position: "left" }) newtextcheck.push({ type: 'text', value: app.print.modules.escposstrS(2, stringlength, 'СУМА ПОДАТКУ' + ' ' + item.Letter, CurrencyFormatted(item.Sum)), font: 1, position: "left" }) } } catch(err) { console.log(err) } // Taxes end try { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } catch(err) { } try { if (thisbasket.zReport.Ret != null) { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } } catch(err) { } // Возвраты все start // test liner if (thisbasket.zReport.Ret != null) { try { newtextcheck.push({ type: "text", value: "ПОВЕРНЕННЯ", font: 2, position: "center" }); } catch(err) { } try { newtextcheck.push({ type: 'text', value: app.print.modules.escposstrS(2, stringlength, 'ЧЕКІВ' , thisbasket.zReport.Ret.OrdersCount), font: 1, position: "left" }) } catch(err) { } try { newtextcheck.push({ type: 'text', value: app.print.modules.escposstrS(2, stringlength, 'СУМА ПОВЕРНЕННЯ' , CurrencyFormatted(thisbasket.zReport.Ret.Sum)), font: 1, position: "left" }) } catch(err) { } try { for (var key in thisbasket.zReport.Ret.PayForm) { var item = thisbasket.zReport.Ret.PayForm[key]; newtextcheck.push({ type: 'text', value: app.print.modules.escposstrS(2, stringlength, item.PayFormName, CurrencyFormatted(item.Sum)), font: 1, position: "left" }) } } catch(err) { console.log(err) } try { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } catch (err) {} try { for (var key in thisbasket.zReport.Ret.Tax) { var item = thisbasket.zReport.Ret.Tax[key]; newtextcheck.push({ type: 'text', value: app.print.modules.escposstrS(2, stringlength, 'ОБІГ' + ' ' + item.Letter, item.SourceSum ? CurrencyFormatted(item.SourceSum) : CurrencyFormatted(item.Turnover)), font: 1, position: "left" }) newtextcheck.push({ type: 'text', value: app.print.modules.escposstrS(2, stringlength, item.Name + ' ' + item.Letter, item.Prc + '%'), font: 1, position: "left" }) newtextcheck.push({ type: 'text', value: app.print.modules.escposstrS(2, stringlength, 'СУМА ПОДАТКУ' + item.Letter , CurrencyFormatted(item.Sum)), font: 1, position: "left" }) } } catch(err) { console.log(err) } } // Return END // службове внесеня та службове вілучення старт try { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } catch (err) {} try { newtextcheck.push({ type: "text", value: app.print.modules.escposstr(2, stringlength, "Службове внесення", thisbasket.zReport.ServiceInput), font: 1, position: "left" }); } catch (err) {} try { newtextcheck.push({ type: "text", value: app.print.modules.escposstr(2, stringlength, "Службове вилучення", thisbasket.zReport.ServiceOutput), font: 1, position: "left" }); } catch (err) {} // службове внесеня та службове вілучення кінець try { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } catch (err) {} try { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } catch (err) {} try { var a = thisbasket.info.fiscalNumber != null ? " №" + thisbasket.info.fiscalNumber : ''; var b = thisbasket.info.cashRegisterNum != null ? a != '' ? "/" : '' + thisbasket.info.cashRegisterNum : ''; newtextcheck.push({ type: "text", value: thisbasket["info"]["date"] + " " + thisbasket["info"]["time"] + a + b + ' ' + '№' + thisbasket.info.fsNum + ' ВН ' + thisbasket.info.localNum, font: 1, position: "left" }); } catch (err) {} try { newtextcheck.push({ type: "text", value: "Режим роботи: онлайн", font: 1, position: "center" }); } catch (err) {} try { var a = thisbasket.info.localNumber != null ? " ВН"+thisbasket.info.localNumber : ''; newtextcheck.push({ type: "text", value: "ФН ПРРО "+thisbasket.info.rroNum + a + ' КАСА ' + thisbasket.info.CASHDESKNUM, font: 1, position: "left" }); } catch (err) {} try { newtextcheck.push({ type: "text", value: "СЛУЖБОВИЙ ЧЕК", font: 1, position: "center" }); newtextcheck.push({ type: "text", value: "Skyservice POS", font: 1, position: "center" }); } catch (err) {} try { if (thisbasket["printer"]["footer"] != "" && thisbasket["printer"]["footer"] != null) { newtextcheck.push({ type: "text", value: thisbasket["printer"]["footer"], font: 1, position: "center" }); } } catch (err) {} if (thisbasket.printer.feed > 0){ for (var i = 0; i < thisbasket.printer.feed; i++) { try { newtextcheck.push({ type: "text", value: " ", font: 1, position: "left" }); } catch (err) {} } } try{ if( thisbasket["printer"]["charset"] == "cp866" ){ for(var key in newtextcheck){ if(newtextcheck[key]["type"] == "text"){ var string = newtextcheck[key]["value"]; newtextcheck[key]["value"] = string.replace(/і/g, 'i').replace(/І/g, 'I'); } } } }catch(err){ } check["strings"] = newtextcheck; check["printer"]["logo"] = ""; try{ if(thisbasket["printer"]["protocol"] == "android_tactile"){ check["data"] = { printParams:{ cutMode: "4" } } } }catch(err){ } console.log(JSON.stringify(check["strings"])); if (thisbasket["printer"]["mode"] == "image"){ check["html"] = { code: app.print.modules.textToRasterize(check["strings"], thisbasket["printer"]) }; } console.log("Z на печать", check); return check; } else if(thisbasket.open_shift == true) { //sfghfdg var check = { checkStrings: thisbasket["products"], printer: thisbasket["printer"], info: thisbasket["info"], data: null, strings:[] }; //Открыть денежный ящик if (thisbasket["info"]["type"] == "check" && thisbasket["info"]["cash"] > 0) { check.strings.push( { type: "byte", byteValue: [ 0x1B, 0x70, 0x00, 0x64, 0xFA ] } ); } var thislogo = ""; if (thisbasket["printer"]["logo"]) { thislogo = "data:image/png;base64," + thisbasket["printer"]["logo"]; } var newtextcheck = []; var stringlength = 32; if(thisbasket["printer"]["size"] == 80){ stringlength = 48; } var lineh = ""; for (var i = 0; i < stringlength; i++) { switch(thisbasket["printer"]["protocol"]){ case "epson_sdk_ios_bluetooth": lineh = lineh + "*"; break; default: lineh = lineh + "-"; } } if(thisbasket["printer"]["model"] == "PSE200"){ newtextcheck.push({type: "byte",byteValue: [0x1C, 0x2E]}); } /*Переключение кодовой страници принтера*/ var codepage = thisbasket["printer"]["codepage"]; if(codepage != 0){ if(codepage == 1000){ codepage = 0; } //Выключить китайский режим if(codepage == 2000){ newtextcheck.push({type: "byte",byteValue: [0x1C, 0x2E]}); } byteArray = []; byteArray.push(0x1B); byteArray.push(0x74); byteArray.push(round(codepage,0)); newtextcheck.push( { type: "byte", byteValue: byteArray } ); } if(thisbasket.printer.topfeed > 0){ for (var i = 0; i < thisbasket.printer.topfeed; i++) { try { newtextcheck.push({ type: "text", value: " ", font: 1, position: "left" }); } catch (err) {} } } try { if (thisbasket["printer"]["logo"] != "" && thisbasket["printer"]["logo"] != null) { newtextcheck.push({ type: "image", value: thisbasket["printer"]["logo"], position: "center" }); } } catch (err) {} try { if (thisbasket["printer"]["header"] != "" && thisbasket["printer"]["header"] != undefined) { newtextcheck.push({ type: "text", value: thisbasket["printer"]["header"], font: 1, position: "center" }); } } catch (err) {} try { if (thisbasket["info"]["companyName"] != "" && thisbasket["info"]["companyName"] != undefined) { newtextcheck.push({ type: "text", value: thisbasket["info"]["companyName"], font: 1, position: "center" }); } } catch (err) {} try { if (thisbasket["info"]["pointName"] != "" && thisbasket["info"]["pointName"] != undefined) { newtextcheck.push({ type: "text", value: thisbasket["info"]["pointName"], font: 1, position: "center" }); } } catch (err) {} try { if (thisbasket["info"]["pointAdress"] != "" && thisbasket["info"]["pointAdress"] != undefined) { newtextcheck.push({ type: "text", value: thisbasket["info"]["pointAdress"], font: 1, position: "center" }); } } catch (err) {} try { if (thisbasket["info"]["IPN"] != "" && thisbasket["info"]["IPN"] != undefined) { newtextcheck.push({ type: "text", value: "ПН "+thisbasket["info"]["IPN"], font: 1, position: "center" }); } } catch (err) {} try { if (thisbasket["info"]["IID"] != "" && thisbasket["info"]["IID"] != undefined) { newtextcheck.push({ type: "text", value: "ІД "+thisbasket["info"]["IID"], font: 1, position: "center" }); } } catch (err) {} try { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } catch (err) {} try { newtextcheck.push({ type: "text", value: 'ВІДКРИТТЯ ЗМІНИ', font: 1, position: "center" }); } catch(err) { } try { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } catch (err) {} try { newtextcheck.push({ type: "text", value: "ФІСКАЛЬНА ЗМІНА № " + thisbasket.info.fiscalNumber, font: 2, position: "center" }); } catch(err) { } try { console.warn('thisbasket>>>>', thisbasket); } catch(err) { console.warn(err); } try { newtextcheck.push({ type: "text", value: "ВІДКРИТА: " + thisbasket.OpenSmenaReport.ThisShift.Opened, font: 2, position: "center" }); } catch(err) { } try { newtextcheck.push({ type: "text", value: "Касир: " + thisbasket.OpenSmenaReport.Cashier, font: 2, position: "center" }); } catch(err) { } try { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } catch (err) {} try { newtextcheck.push({ type: "text", value: thisbasket.OpenSmenaReport.ThisShift.Opened + ' №' + thisbasket.info.fiscalNumber + ' ВН ' + thisbasket.OpenSmenaReport.dfsresult.TICKET.ORDERNUM, font: 1, position: "left" }); } catch (err) {} try { newtextcheck.push({ type: "text", value: "Режим роботи: онлайн", font: 1, position: "center" }); } catch (err) {} try { newtextcheck.push({ type: "text", value: "ФН ПРРО "+thisbasket.info.rroNum + ' КАСА ' + thisbasket.info.CASHDESKNUM , font: 1, position: "left" }); } catch (err) {} try { newtextcheck.push({ type: "text", value: "СЛУЖБОВИЙ ЧЕК", font: 1, position: "center" }); newtextcheck.push({ type: "text", value: "Skyservice POS", font: 1, position: "center" }); } catch (err) {} try { if (thisbasket["printer"]["footer"] != "" && thisbasket["printer"]["footer"] != null) { newtextcheck.push({ type: "text", value: thisbasket["printer"]["footer"], font: 1, position: "center" }); } } catch (err) {} if(thisbasket.printer.feed > 0){ for (var i = 0; i < thisbasket.printer.feed; i++) { try { newtextcheck.push({ type: "text", value: " ", font: 1, position: "left" }); } catch (err) {} } } try{ if( thisbasket["printer"]["charset"] == "cp866" ){ for(var key in newtextcheck){ if(newtextcheck[key]["type"] == "text"){ var string = newtextcheck[key]["value"]; newtextcheck[key]["value"] = string.replace(/і/g, 'i').replace(/І/g, 'I'); } } } }catch(err){ } check["strings"] = newtextcheck; check["printer"]["logo"] = ""; try{ if(thisbasket["printer"]["protocol"] == "android_tactile"){ check["data"] = { printParams:{ cutMode: "4" } } } }catch(err){ } console.log(JSON.stringify(check["strings"])); if(thisbasket["printer"]["mode"] == "image"){ check["html"] = { code: app.print.modules.textToRasterize(check["strings"], thisbasket["printer"]) }; } console.log("Х на печать", check); return check; } else if(thisbasket.uaprro_Return == true) { var check = { checkStrings: thisbasket["products"], printer: thisbasket["printer"], info: thisbasket["info"], data: null, strings:[] }; var newtextcheck = []; //Открыть денежный ящик if (thisbasket["info"]["type"] == "check" && thisbasket["info"]["cash"] > 0) { check.strings.push( { type: "byte", byteValue: [ 0x1B, 0x70, 0x00, 0x64, 0xFA ] } ); } var thislogo = ""; if (thisbasket["printer"]["logo"]) { thislogo = "data:image/png;base64," + thisbasket["printer"]["logo"]; } var ostitle = "android"; if(thisbasket["printer"]["os"] != ""){ ostitle = thisbasket["printer"]["os"]; } var stringlength = 32; if(thisbasket["printer"]["size"] == 80){ stringlength = 48; } var lineh = ""; for (var i = 0; i < stringlength; i++) { switch(thisbasket["printer"]["protocol"]){ case "epson_sdk_ios_bluetooth": lineh = lineh + "*"; break; default: lineh = lineh + "-"; } } // //Открыть денежный ящик // if (thisbasket["info"]["type"] == "check" && thisbasket["info"]["cash"] > 0) { // newtextcheck.push( // { // type: "byte", // byteValue: [ // 0x1B, 0x70, 0x00, 0x64, 0xFA // ] // } // ); // } if(thisbasket["printer"]["model"] == "PSE200"){ newtextcheck.push({type: "byte",byteValue: [0x1C, 0x2E]}); } console.warn('chek return basket>>>>', thisbasket) /*Переключение кодовой страници принтера*/ var codepage = thisbasket["printer"]["codepage"]; if(codepage != 0){ if(codepage == 1000){ codepage = 0; } //Выключить китайский режим if(codepage == 2000){ newtextcheck.push({type: "byte",byteValue: [0x1C, 0x2E]}); } byteArray = []; byteArray.push(0x1B); byteArray.push(0x74); byteArray.push(round(codepage,0)); newtextcheck.push( { type: "byte", byteValue: byteArray } ); } if(thisbasket.printer.topfeed > 0){ for (var i = 0; i < thisbasket.printer.topfeed; i++) { try { newtextcheck.push({ type: "text", value: " ", font: 1, position: "left" }); } catch (err) {} } } try { if (thisbasket["printer"]["logo"] != "") { newtextcheck.push({ type: "image", value: thisbasket["printer"]["logo"], position: "center" }); } } catch (err) {} try { if (thisbasket["printer"]["header"] != "" && thisbasket["printer"]["header"] != undefined) { newtextcheck.push({ type: "text", value: thisbasket["printer"]["header"], font: 1, position: "center" }); } } catch (err) {} try { if (thisbasket["info"]["companyName"] != "" && thisbasket["info"]["companyName"] != undefined) { newtextcheck.push({ type: "text", value: thisbasket["info"]["companyName"], font: 1, position: "center" }); } } catch (err) {} try { if (thisbasket["info"]["pointName"] != "" && thisbasket["info"]["pointName"] != undefined) { newtextcheck.push({ type: "text", value: thisbasket["info"]["pointName"], font: 1, position: "center" }); } } catch (err) {} try { if (thisbasket["info"]["pointAdress"] != "" && thisbasket["info"]["pointAdress"] != undefined) { newtextcheck.push({ type: "text", value: thisbasket["info"]["pointAdress"], font: 1, position: "center" }); } } catch (err) {} try { if (thisbasket["info"]["IPN"] != "" && thisbasket["info"]["IPN"] != undefined) { newtextcheck.push({ type: "text", value: "ПН "+thisbasket["info"]["IPN"], font: 1, position: "center" }); } } catch (err) {} try { if (thisbasket["info"]["IID"] != "" && thisbasket["info"]["IID"] != undefined) { newtextcheck.push({ type: "text", value: "ІД "+thisbasket["info"]["IID"], font: 1, position: "center" }); } } catch (err) {} try { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } catch (err) {} try { newtextcheck.push({ type: "text", value: 'ПОВЕРНЕННЯ', font: 1, position: "center" }); } catch (err) {} try { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } catch (err) {} try { thisbasket.products.forEach(function(bitem) { var bonustext = ""; try{ if(bitem["bonus"] != '' && bitem["bonus"] != 0 && bitem["bonus"] != undefined){ bonustext = " ("+lang["Bonus"]+")"; } }catch(err){ } var modstext = ""; try{ if(bitem["modstitle"] != '' && bitem["modstitle"] != 0 && bitem["modstitle"] != undefined){ modstext = " ("+bitem["modstitle"]+" )"; } }catch(err){ } var printNameString = bitem.name+" "+bonustext+" "+modstext; var taxLetter = ""; if(bitem.tax){ taxLetter = bitem.tax; } newtextcheck.push({ type: "text", value: printNameString, font: 1, position: "left" }); console.log('BITEM', bitem); newtextcheck.push({ type: "text", value: bitem.kolvo + " x " + CurrencyFormatted(bitem.cenaout) + " = " + CurrencyFormatted(bitem.cenaout * bitem.kolvo)+ " "+taxLetter, font: 1, position: "right" }); if(bitem["uktzed"] != '' && bitem["uktzed"] != null){ newtextcheck.push({ type: "text", value: "Код УКТЗЕД: "+bitem["uktzed"], font: 1, position: "left" }); } try { if (bitem.barcode) { newtextcheck.push({ type: "text", value: "ШТРИХ КОД: " + bitem.barcode, font: 1, position: "left" }); } } catch(err) { } try { if (bitem.excise) { newtextcheck.push({ type: "text", value: "АКЦИЗНА МАРКА: " + bitem.excise, font: 1, position: "left" }); } } catch(err) { } if(bitem.discSum > 0){ newtextcheck.push({ type: "text", value: app.print.modules.escposstr(2, stringlength, "ЗНИЖКА", bitem.discSum), font: 1, position: "left" }); } try{ if(thisbasket["info"]["checkcomments"] == 1 || thisbasket["info"]["type"] == "begunok"){ if(bitem["comment"] != "" && bitem["comment"] != null && bitem["comment"] != undefined){ newtextcheck.push({ type: "text", value: bitem["comment"], font: 1, position: "left" }); } } }catch(err){ } }) } catch (err) {} try { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } catch (err) {} try { if(thisbasket.info.hallscreen_id != null && thisbasket.info.hallscreen_id != ""){ var bignums = app.print.modules.bignumbers(thisbasket.info.hallscreen_id); for(var key in bignums){ var str = bignums[key]; newtextcheck.push({ type: "text", value: str, font: 1, position: "center" }); } } } catch (err) {} try { if (thisbasket.info.roundsum != "") { newtextcheck.push({ type: "text", value: app.print.modules.escposstr(2, stringlength, "ЗАОКРУГЛЕННЯ", thisbasket.info.roundsum), font: 1, position: "left" }); } } catch (err) {} try { if (thisbasket.info.summ != "") {// allcena // customRETURN var returnSum = thisbasket.customRETURN ? Number(thisbasket.info.summ) + Number(thisbasket.info.roundsum) : thisbasket.info.summ; console.warn('>>>>returnSum<<<<<<', returnSum) newtextcheck.push({ type: "text", value: app.print.modules.escposstr(2, stringlength, "СУМА", String(returnSum)),// allcena thisbasket.info.summ font: 1, position: "left" }); } } catch (err) {} console.warn('thisbasket.bankData >>', thisbasket.bankData); if (thisbasket.bankData != null) { // try { // if (thisbasket.bankData.merchantID) { // newtextcheck.push({ // type: "text", // value: app.print.modules.escposstrS(2, stringlength, "МIД", thisbasket.bankData.merchantID), // font: 1, // position: "left" // }); // } // } catch(err) { // console.error(err) // } try { if (thisbasket.bankData.terminalID) { newtextcheck.push({ type: "text", value: app.print.modules.escposstrS(2, stringlength, "Термiнал", thisbasket.bankData.terminalID), font: 1, position: "left" }); } } catch(err) { console.error(err) } try { if (thisbasket.bankData.rrn) { newtextcheck.push({ type: "text", value: app.print.modules.escposstrS(2, stringlength, "RNN", thisbasket.bankData.rrn), font: 1, position: "left" }); } } catch(err) { console.error(err) } try { if (thisbasket.bankData.issuerName) { newtextcheck.push({ type: "text", value: app.print.modules.escposstrS(2, stringlength, "Платіжна система", thisbasket.bankData.issuerName), font: 1, position: "left" }); } } catch(err) { console.error(err) } try { if (thisbasket.bankData.cardNumber) { newtextcheck.push({ type: "text", value: app.print.modules.escposstrS(2, stringlength, "Картка", thisbasket.bankData.cardNumber), font: 1, position: "left" }); } } catch(err) { console.error(err) } try { if (thisbasket.bankData.authorizationCode) { newtextcheck.push({ type: "text", value: app.print.modules.escposstrS(2, stringlength, "Код авторизацiї", thisbasket.bankData.authorizationCode), font: 1, position: "left" }); } } catch(err) { console.error(err) } var sign = thisbasket.bankData.isSignature ? 'Пiдпис' : 'Пiдпис власника карти не потрiбен'; if (Object.keys(thisbasket.bankData).length) { newtextcheck.push({ type: "text", value: sign, font: 1, position: "left" }); if (thisbasket.bankData.isSignature) { try { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } catch (err) {} } } } // try { // if (thisbasket.info.visa != "" && thisbasket.info.visa > 0) { // newtextcheck.push({ // type: "text", // value: app.print.modules.escposstr(2, stringlength, "КАРТКА", thisbasket.info.visa), // font: 1, // position: "left" // }); // } // } catch (err) {} // try { // if (thisbasket.info.nall != "") { // newtextcheck.push({ // type: "text", // value: app.print.modules.escposstr(2, stringlength, "ГОТІВКА", thisbasket.info.nall), // font: 1, // position: "left" // }); // // if(thisbasket.info.allcena - thisbasket.info.nall > 0){ // // newtextcheck.push({ // // type: "text", // // value: app.print.modules.escposstr(2, stringlength, "ГОТІВКА", thisbasket.info.allcena - thisbasket.info.nall), // // font: 1, // // position: "left" // // }); // //} // } // } catch (err) {} //Костыльчик который говорит что все за нал если не указали обратного // try { // if (thisbasket.info.nall <= 0 && thisbasket.info.visa <= 0) { // newtextcheck.push({ // type: "text", // value: app.print.modules.escposstr(2, stringlength, "ГОТІВКА", thisbasket.info.allcena), // font: 1, // position: "left" // }); // } // } catch (err) {} try { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } catch (err) {} try { if (thisbasket.info.sdacha > 0) { newtextcheck.push({ type: "text", value: app.print.modules.escposstr(2, stringlength,"РЕШТА", thisbasket.info.sdacha), font: 1, position: "left" }); /*Пробел*/ newtextcheck.push({ type: "text", value: "", font: 1, position: "left" }); } } catch (err) {} if(thisbasket.prodTax != null){ for(var kkk in thisbasket.prodTax.prodTaxSum){ var taxitem = thisbasket.prodTax.prodTaxSum[kkk]; var taxitemPercent = thisbasket.prodTax.prodTaxPercent[kkk]; var taxsum = app.main.sum(taxitem, -(round(taxitem, 2) * 100) / round(round(taxitemPercent, 2) + 100, 2)) //Добавил после того как переделывали подсчет сдвоенного налога с акцизом try{ if(thisbasket.prodTax.prodTaxSumSource[kkk]){ taxsum = thisbasket.prodTax.prodTaxSumSource[kkk]; } }catch(err){ } var taxitemType = thisbasket.prodTax.prodTaxType[kkk]; var cnoType = { 0:"ПДВ", 1:"Акциз", 2:"ПФ" } try { newtextcheck.push({ type: "text", value: app.print.modules.escposstr(2, stringlength, cnoType[taxitemType]+" "+kkk+"="+taxitemPercent+"%", CurrencyFormatted(taxsum)), font: 1, position: "left" }); } catch (err) {} } /*Пробел*/ newtextcheck.push({ type: "text", value: "", font: 1, position: "left" }); } try { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } catch (err) {} try { newtextcheck.push({ type: "text", value: thisbasket["info"]["date"] + " " + thisbasket["info"]["time"]+" №"+thisbasket.info.fiscalNumber+" ВН "+thisbasket.info.localNumber, font: 1, position: "left" }); } catch (err) {} console.warn('return +++++++>> ', thisbasket) try{ if(thisbasket.info.qrcode != ''){ newtextcheck.push({ type: "image", value: thisbasket.info.qrcode, position: "center" }); newtextcheck.push({ type: "text", value: "", font: 1, position: "left" }); } }catch(err){ } // byteArray = []; // byteArray.push(0x1B) // byteArray.push(0x74) // byteArray.push(round(codepage,0)) // newtextcheck.push( // { // type: "byte", // byteValue: byteArray // } // ); try { newtextcheck.push({ type: "text", value: "Режим роботи: онлайн", font: 1, position: "center" }); } catch (err) {} try { newtextcheck.push({ type: "text", value: "ФН ПРРО "+thisbasket.info.rroNum+' КАСА ' + thisbasket.info.cashRegisterNum, font: 1, position: "left" }); } catch (err) {} try { newtextcheck.push({ type: "text", value: "ФІСКАЛЬНИЙ ЧЕК", font: 1, position: "center" }); newtextcheck.push({ type: "text", value: "Skyservice POS", font: 1, position: "center" }); } catch (err) {} if(thisbasket["info"]["checkcomments"] == 1){ /*Комментарий на чек в текстовом режиме*/ try { if (thisbasket.info.comment != "") { newtextcheck.push({ type: "text", value: "#"+thisbasket.info.comment, font: 1, position: "center" }); } } catch (err) {} } try { if (thisbasket["printer"]["footer"] != "" && thisbasket["printer"]["footer"] != null) { newtextcheck.push({ type: "text", value: thisbasket["printer"]["footer"], font: 1, position: "center" }); } } catch (err) {} if(thisbasket.printer.feed > 0){ for (var i = 0; i < thisbasket.printer.feed; i++) { try { newtextcheck.push({ type: "text", value: " ", font: 1, position: "left" }); } catch (err) {} } } try{ if( thisbasket["printer"]["charset"] == "cp866" ){ for(var key in newtextcheck){ if(newtextcheck[key]["type"] == "text"){ var string = newtextcheck[key]["value"]; newtextcheck[key]["value"] = string.replace(/і/g, 'i').replace(/І/g, 'I'); } } } }catch(err){ } check["strings"] = newtextcheck; check["printer"]["logo"] = ""; try{ if(thisbasket["printer"]["protocol"] == "android_tactile"){ check["data"] = { printParams:{ cutMode: "4" } } } }catch(err){ } console.log(JSON.stringify(check["strings"])); if(thisbasket["printer"]["mode"] == "image"){ check["html"] = { code: app.print.modules.textToRasterize(check["strings"], thisbasket["printer"]) }; } console.log("Чек на печать", check); return check; } else if(thisbasket.uaprro_introduction == true) { //sfghfdg var check = { checkStrings: thisbasket["products"], printer: thisbasket["printer"], info: thisbasket["info"], data: null, strings:[] }; //Открыть денежный ящик if (thisbasket["info"]["type"] == "check" && thisbasket["info"]["cash"] > 0) { check.strings.push( { type: "byte", byteValue: [ 0x1B, 0x70, 0x00, 0x64, 0xFA ] } ); } var thislogo = ""; if (thisbasket["printer"]["logo"]) { thislogo = "data:image/png;base64," + thisbasket["printer"]["logo"]; } var newtextcheck = []; var stringlength = 32; if(thisbasket["printer"]["size"] == 80){ stringlength = 48; } var lineh = ""; for (var i = 0; i < stringlength; i++) { switch(thisbasket["printer"]["protocol"]){ case "epson_sdk_ios_bluetooth": lineh = lineh + "*"; break; default: lineh = lineh + "-"; } } if(thisbasket["printer"]["model"] == "PSE200"){ newtextcheck.push({type: "byte",byteValue: [0x1C, 0x2E]}); } /*Переключение кодовой страници принтера*/ var codepage = thisbasket["printer"]["codepage"]; if(codepage != 0){ if(codepage == 1000){ codepage = 0; } //Выключить китайский режим if(codepage == 2000){ newtextcheck.push({type: "byte",byteValue: [0x1C, 0x2E]}); } byteArray = []; byteArray.push(0x1B); byteArray.push(0x74); byteArray.push(round(codepage,0)); newtextcheck.push( { type: "byte", byteValue: byteArray } ); } if(thisbasket.printer.topfeed > 0){ for (var i = 0; i < thisbasket.printer.topfeed; i++) { try { newtextcheck.push({ type: "text", value: " ", font: 1, position: "left" }); } catch (err) {} } } try { if (thisbasket["printer"]["logo"] != "" && thisbasket["printer"]["logo"] != null) { newtextcheck.push({ type: "image", value: thisbasket["printer"]["logo"], position: "center" }); } } catch (err) {} try { if (thisbasket["printer"]["header"] != "" && thisbasket["printer"]["header"] != undefined) { newtextcheck.push({ type: "text", value: thisbasket["printer"]["header"], font: 1, position: "center" }); } } catch (err) {} try { if (thisbasket["info"]["companyName"] != "" && thisbasket["info"]["companyName"] != undefined) { newtextcheck.push({ type: "text", value: thisbasket["info"]["companyName"], font: 1, position: "center" }); } } catch (err) {} try { if (thisbasket["info"]["pointName"] != "" && thisbasket["info"]["pointName"] != undefined) { newtextcheck.push({ type: "text", value: thisbasket["info"]["pointName"], font: 1, position: "center" }); } } catch (err) {} try { if (thisbasket["info"]["pointAdress"] != "" && thisbasket["info"]["pointAdress"] != undefined) { newtextcheck.push({ type: "text", value: thisbasket["info"]["pointAdress"], font: 1, position: "center" }); } } catch (err) {} try { if (thisbasket["info"]["IPN"] != "" && thisbasket["info"]["IPN"] != undefined) { newtextcheck.push({ type: "text", value: "ПН "+thisbasket["info"]["IPN"], font: 1, position: "center" }); } } catch (err) {} try { if (thisbasket["info"]["IID"] != "" && thisbasket["info"]["IID"] != undefined) { newtextcheck.push({ type: "text", value: "ІД "+thisbasket["info"]["IID"], font: 1, position: "center" }); } } catch (err) {} try { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } catch (err) {} try { console.warn('thisbasket>>>>', thisbasket); } catch(err) { console.warn(err); } try { newtextcheck.push({ type: "text", value: "СЛУЖБОВЕ ВНЕСЕННЯ", font: 2, position: "center" }); } catch(err) { } try { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } catch (err) {} try { newtextcheck.push({ type: "text", value: "Касир: " + thisbasket.ereceiptStatus.Name, font: 2, position: "center" }); } catch(err) { } try { newtextcheck.push({ type: "text", value: app.print.modules.escposstr(2, stringlength, "СУМА", thisbasket.Summ), font: 1, position: "left" }); } catch (err) { } try { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } catch (err) {} try { if (thisbasket.info.comment != '') { newtextcheck.push({ type: "text", value: 'КОМЕНТАР: ' + thisbasket.info.comment, font: 1, position: "left" }); newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } } catch (err) { } try { var a = thisbasket.info.fiscalNumber != null ? " №" + thisbasket.info.fiscalNumber : ''; newtextcheck.push({ type: "text", value: thisbasket["info"]["date"] + " " + thisbasket["info"]["time"] + a + ' ВН ' + thisbasket.info.ORDERNUM, font: 1, position: "left" }); } catch (err) {} try { if (thisbasket["printer"]["footer"] != "" && thisbasket["printer"]["footer"] != null) { newtextcheck.push({ type: "text", value: thisbasket["printer"]["footer"], font: 1, position: "center" }); } } catch (err) {} try { newtextcheck.push({ type: "text", value: "Режим роботи: онлайн", font: 1, position: "center" }); } catch (err) {} try { newtextcheck.push({ type: "text", value: "ФН ПРРО "+thisbasket.info.rroNum + ' КАСА ' + thisbasket.info.CASHDESKNUM , font: 1, position: "left" }); } catch (err) {} try { newtextcheck.push({ type: "text", value: "СЛУЖБОВИЙ ЧЕК", font: 1, position: "center" }); newtextcheck.push({ type: "text", value: "Skyservice POS", font: 1, position: "center" }); } catch (err) {} if(thisbasket.printer.feed > 0){ for (var i = 0; i < thisbasket.printer.feed; i++) { try { newtextcheck.push({ type: "text", value: " ", font: 1, position: "left" }); } catch (err) {} } } try{ if( thisbasket["printer"]["charset"] == "cp866" ){ for(var key in newtextcheck){ if(newtextcheck[key]["type"] == "text"){ var string = newtextcheck[key]["value"]; newtextcheck[key]["value"] = string.replace(/і/g, 'i').replace(/І/g, 'I'); } } } }catch(err){ } check["strings"] = newtextcheck; check["printer"]["logo"] = ""; try{ if(thisbasket["printer"]["protocol"] == "android_tactile"){ check["data"] = { printParams:{ cutMode: "4" } } } }catch(err){ } console.log(JSON.stringify(check["strings"])); if(thisbasket["printer"]["mode"] == "image"){ check["html"] = { code: app.print.modules.textToRasterize(check["strings"], thisbasket["printer"]) }; } console.log("Х на печать", check); return check; } else if(thisbasket.uaprro_incasation == true) { //sfghfdg var check = { checkStrings: thisbasket["products"], printer: thisbasket["printer"], info: thisbasket["info"], data: null, strings:[] }; //Открыть денежный ящик if (thisbasket["info"]["type"] == "check" && thisbasket["info"]["cash"] > 0) { check.strings.push( { type: "byte", byteValue: [ 0x1B, 0x70, 0x00, 0x64, 0xFA ] } ); } var thislogo = ""; if (thisbasket["printer"]["logo"]) { thislogo = "data:image/png;base64," + thisbasket["printer"]["logo"]; } var newtextcheck = []; var stringlength = 32; if(thisbasket["printer"]["size"] == 80){ stringlength = 48; } var lineh = ""; for (var i = 0; i < stringlength; i++) { switch(thisbasket["printer"]["protocol"]){ case "epson_sdk_ios_bluetooth": lineh = lineh + "*"; break; default: lineh = lineh + "-"; } } if(thisbasket["printer"]["model"] == "PSE200"){ newtextcheck.push({type: "byte",byteValue: [0x1C, 0x2E]}); } /*Переключение кодовой страници принтера*/ var codepage = thisbasket["printer"]["codepage"]; if(codepage != 0){ if(codepage == 1000){ codepage = 0; } //Выключить китайский режим if(codepage == 2000){ newtextcheck.push({type: "byte",byteValue: [0x1C, 0x2E]}); } byteArray = []; byteArray.push(0x1B); byteArray.push(0x74); byteArray.push(round(codepage,0)); newtextcheck.push( { type: "byte", byteValue: byteArray } ); } if(thisbasket.printer.topfeed > 0){ for (var i = 0; i < thisbasket.printer.topfeed; i++) { try { newtextcheck.push({ type: "text", value: " ", font: 1, position: "left" }); } catch (err) {} } } try { if (thisbasket["printer"]["logo"] != "" && thisbasket["printer"]["logo"] != null) { newtextcheck.push({ type: "image", value: thisbasket["printer"]["logo"], position: "center" }); } } catch (err) {} try { if (thisbasket["printer"]["header"] != "" && thisbasket["printer"]["header"] != undefined) { newtextcheck.push({ type: "text", value: thisbasket["printer"]["header"], font: 1, position: "center" }); } } catch (err) {} try { if (thisbasket["info"]["companyName"] != "" && thisbasket["info"]["companyName"] != undefined) { newtextcheck.push({ type: "text", value: thisbasket["info"]["companyName"], font: 1, position: "center" }); } } catch (err) {} try { if (thisbasket["info"]["pointName"] != "" && thisbasket["info"]["pointName"] != undefined) { newtextcheck.push({ type: "text", value: thisbasket["info"]["pointName"], font: 1, position: "center" }); } } catch (err) {} try { if (thisbasket["info"]["pointAdress"] != "" && thisbasket["info"]["pointAdress"] != undefined) { newtextcheck.push({ type: "text", value: thisbasket["info"]["pointAdress"], font: 1, position: "center" }); } } catch (err) {} try { if (thisbasket["info"]["IPN"] != "" && thisbasket["info"]["IPN"] != undefined) { newtextcheck.push({ type: "text", value: "ПН "+thisbasket["info"]["IPN"], font: 1, position: "center" }); } } catch (err) {} try { if (thisbasket["info"]["IID"] != "" && thisbasket["info"]["IID"] != undefined) { newtextcheck.push({ type: "text", value: "ІД "+thisbasket["info"]["IID"], font: 1, position: "center" }); } } catch (err) {} try { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } catch (err) {} // try { // newtextcheck.push({ // type: "text", // value: "ФІСКАЛЬНА ЗМІНА № " + thisbasket.OpenSmenaReport.ThisShift.Shifts[thisbasket.OpenSmenaReport.ThisShift.Shifts.length - 1].ShiftId, // font: 2, // position: "center" // }); // } catch(err) { // } try { console.warn('thisbasket>>>>', thisbasket); } catch(err) { console.warn(err); } // try { // newtextcheck.push({ // type: "text", // value: "ВІДКРИТА: " + thisbasket.OpenSmenaReport.ThisShift.Shifts[thisbasket.OpenSmenaReport.ThisShift.Shifts.length - 1].Opened.substr(0, 19), // font: 2, // position: "center" // }); // } catch(err) { // } try { newtextcheck.push({ type: "text", value: "СЛУЖБОВА ВИДАЧА", font: 2, position: "center" }); } catch(err) { } try { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } catch (err) {} try { newtextcheck.push({ type: "text", value: "Касир: " + thisbasket.ereceiptStatus.Name, font: 2, position: "center" }); } catch(err) { } try { newtextcheck.push({ type: "text", value: app.print.modules.escposstr(2, stringlength, "СУМА", thisbasket.Summ), font: 1, position: "left" }); } catch (err) { } try { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } catch (err) {} try { if (thisbasket.info.comment != '') { newtextcheck.push({ type: "text", value: 'КОМЕНТАР: ' + thisbasket.info.comment, font: 1, position: "left" }); newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } } catch (err) { } try { var a = thisbasket.info.fiscalNumber != null ? " №" + thisbasket.info.fiscalNumber : ''; newtextcheck.push({ type: "text", value: thisbasket["info"]["date"] + " " + thisbasket["info"]["time"] + a + ' ВН ' + thisbasket.info.ORDERNUM, font: 1, position: "left" }); } catch (err) {} try { if (thisbasket["printer"]["footer"] != "" && thisbasket["printer"]["footer"] != null) { newtextcheck.push({ type: "text", value: thisbasket["printer"]["footer"], font: 1, position: "center" }); } } catch (err) {} try { newtextcheck.push({ type: "text", value: "Режим роботи: онлайн", font: 1, position: "center" }); } catch (err) {} try { // ORDERNUM: ereceiptStatus.NextLocalNum, // CASHDESKNUM: fiscalSettings.uaprroCASHDESKNUM //var a = thisbasket.info.localNumber != null ? " ВН"+thisbasket.info.localNumber : ''; newtextcheck.push({ type: "text", value: "ФН ПРРО "+thisbasket.info.rroNum + ' КАСА ' + thisbasket.info.CASHDESKNUM, font: 1, position: "left" }); } catch (err) {} try { newtextcheck.push({ type: "text", value: "СЛУЖБОВИЙ ЧЕК", font: 1, position: "center" }); newtextcheck.push({ type: "text", value: "Skyservice POS", font: 1, position: "center" }); } catch (err) {} if(thisbasket.printer.feed > 0){ for (var i = 0; i < thisbasket.printer.feed; i++) { try { newtextcheck.push({ type: "text", value: " ", font: 1, position: "left" }); } catch (err) {} } } try{ if( thisbasket["printer"]["charset"] == "cp866" ){ for(var key in newtextcheck){ if(newtextcheck[key]["type"] == "text"){ var string = newtextcheck[key]["value"]; newtextcheck[key]["value"] = string.replace(/і/g, 'i').replace(/І/g, 'I'); } } } }catch(err){ } check["strings"] = newtextcheck; check["printer"]["logo"] = ""; try{ if(thisbasket["printer"]["protocol"] == "android_tactile"){ check["data"] = { printParams:{ cutMode: "4" } } } }catch(err){ } console.log(JSON.stringify(check["strings"])); if(thisbasket["printer"]["mode"] == "image"){ check["html"] = { code: app.print.modules.textToRasterize(check["strings"], thisbasket["printer"]) }; } console.log("Х на печать", check); return check; }// else if(thisbasket.uaprro_rashod == true) { //sfghfdg var check = { checkStrings: thisbasket["products"], printer: thisbasket["printer"], info: thisbasket["info"], data: null, strings:[] }; //Открыть денежный ящик if (thisbasket["info"]["type"] == "check" && thisbasket["info"]["cash"] > 0) { check.strings.push( { type: "byte", byteValue: [ 0x1B, 0x70, 0x00, 0x64, 0xFA ] } ); } var thislogo = ""; if (thisbasket["printer"]["logo"]) { thislogo = "data:image/png;base64," + thisbasket["printer"]["logo"]; } var newtextcheck = []; var stringlength = 32; if(thisbasket["printer"]["size"] == 80){ stringlength = 48; } var lineh = ""; for (var i = 0; i < stringlength; i++) { switch(thisbasket["printer"]["protocol"]){ case "epson_sdk_ios_bluetooth": lineh = lineh + "*"; break; default: lineh = lineh + "-"; } } if(thisbasket["printer"]["model"] == "PSE200"){ newtextcheck.push({type: "byte",byteValue: [0x1C, 0x2E]}); } /*Переключение кодовой страници принтера*/ var codepage = thisbasket["printer"]["codepage"]; if(codepage != 0){ if(codepage == 1000){ codepage = 0; } //Выключить китайский режим if(codepage == 2000){ newtextcheck.push({type: "byte",byteValue: [0x1C, 0x2E]}); } byteArray = []; byteArray.push(0x1B); byteArray.push(0x74); byteArray.push(round(codepage,0)); newtextcheck.push( { type: "byte", byteValue: byteArray } ); } if(thisbasket.printer.topfeed > 0){ for (var i = 0; i < thisbasket.printer.topfeed; i++) { try { newtextcheck.push({ type: "text", value: " ", font: 1, position: "left" }); } catch (err) {} } } try { if (thisbasket["printer"]["logo"] != "" && thisbasket["printer"]["logo"] != null) { newtextcheck.push({ type: "image", value: thisbasket["printer"]["logo"], position: "center" }); } } catch (err) {} try { if (thisbasket["printer"]["header"] != "" && thisbasket["printer"]["header"] != undefined) { newtextcheck.push({ type: "text", value: thisbasket["printer"]["header"], font: 1, position: "center" }); } } catch (err) {} try { if (thisbasket["info"]["companyName"] != "" && thisbasket["info"]["companyName"] != undefined) { newtextcheck.push({ type: "text", value: thisbasket["info"]["companyName"], font: 1, position: "center" }); } } catch (err) {} try { if (thisbasket["info"]["pointName"] != "" && thisbasket["info"]["pointName"] != undefined) { newtextcheck.push({ type: "text", value: thisbasket["info"]["pointName"], font: 1, position: "center" }); } } catch (err) {} try { if (thisbasket["info"]["pointAdress"] != "" && thisbasket["info"]["pointAdress"] != undefined) { newtextcheck.push({ type: "text", value: thisbasket["info"]["pointAdress"], font: 1, position: "center" }); } } catch (err) {} try { if (thisbasket["info"]["IPN"] != "" && thisbasket["info"]["IPN"] != undefined) { newtextcheck.push({ type: "text", value: "ПН "+thisbasket["info"]["IPN"], font: 1, position: "center" }); } } catch (err) {} try { if (thisbasket["info"]["IID"] != "" && thisbasket["info"]["IID"] != undefined) { newtextcheck.push({ type: "text", value: "ІД "+thisbasket["info"]["IID"], font: 1, position: "center" }); } } catch (err) {} try { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } catch (err) {} // try { // newtextcheck.push({ // type: "text", // value: "ФІСКАЛЬНА ЗМІНА № " + thisbasket.OpenSmenaReport.ThisShift.Shifts[thisbasket.OpenSmenaReport.ThisShift.Shifts.length - 1].ShiftId, // font: 2, // position: "center" // }); // } catch(err) { // } try { console.warn('thisbasket>>>>', thisbasket); } catch(err) { console.warn(err); } // try { // newtextcheck.push({ // type: "text", // value: "ВІДКРИТА: " + thisbasket.OpenSmenaReport.ThisShift.Shifts[thisbasket.OpenSmenaReport.ThisShift.Shifts.length - 1].Opened.substr(0, 19), // font: 2, // position: "center" // }); // } catch(err) { // } try { newtextcheck.push({ type: "text", value: "СЛУЖБОВА ВИДАЧА", font: 2, position: "center" }); } catch(err) { } try { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } catch (err) {} try { newtextcheck.push({ type: "text", value: "Касир: " + thisbasket.ereceiptStatus.Name, font: 2, position: "center" }); } catch(err) { } try { newtextcheck.push({ type: "text", value: app.print.modules.escposstr(2, stringlength, "СУМА", thisbasket.Summ), font: 1, position: "left" }); } catch (err) { } try { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } catch (err) {} try { if (thisbasket.info.comment != '') { newtextcheck.push({ type: "text", value: 'КОМЕНТАР: ' + thisbasket.info.comment, font: 1, position: "left" }); newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } } catch (err) { } try { var a = thisbasket.info.fiscalNumber != null ? " №" + thisbasket.info.fiscalNumber : ''; newtextcheck.push({ type: "text", value: thisbasket["info"]["date"] + " " + thisbasket["info"]["time"] + a + ' ВН ' + thisbasket.info.ORDERNUM, font: 1, position: "left" }); } catch (err) {} try { newtextcheck.push({ type: "text", value: "Режим роботи: онлайн", font: 1, position: "center" }); } catch (err) {} try { newtextcheck.push({ type: "text", value: "ФН ПРРО "+thisbasket.info.rroNum + ' КАСА ' + thisbasket.info.CASHDESKNUM , font: 1, position: "left" }); } catch (err) {} try { newtextcheck.push({ type: "text", value: "СЛУЖБОВИЙ ЧЕК", font: 1, position: "center" }); newtextcheck.push({ type: "text", value: "Skyservice POS", font: 1, position: "center" }); } catch (err) {} try { if (thisbasket["printer"]["footer"] != "" && thisbasket["printer"]["footer"] != null) { newtextcheck.push({ type: "text", value: thisbasket["printer"]["footer"], font: 1, position: "center" }); } } catch (err) {} if(thisbasket.printer.feed > 0){ for (var i = 0; i < thisbasket.printer.feed; i++) { try { newtextcheck.push({ type: "text", value: " ", font: 1, position: "left" }); } catch (err) {} } } try{ if( thisbasket["printer"]["charset"] == "cp866" ){ for(var key in newtextcheck){ if(newtextcheck[key]["type"] == "text"){ var string = newtextcheck[key]["value"]; newtextcheck[key]["value"] = string.replace(/і/g, 'i').replace(/І/g, 'I'); } } } }catch(err){ } check["strings"] = newtextcheck; check["printer"]["logo"] = ""; try{ if(thisbasket["printer"]["protocol"] == "android_tactile"){ check["data"] = { printParams:{ cutMode: "4" } } } }catch(err){ } console.log(JSON.stringify(check["strings"])); if(thisbasket["printer"]["mode"] == "image"){ check["html"] = { code: app.print.modules.textToRasterize(check["strings"], thisbasket["printer"]) }; } console.log("Х на печать", check); return check; } else{ var check = { checkStrings: thisbasket["products"], printer: thisbasket["printer"], info: thisbasket["info"], data: null, strings:[] }; var thislogo = ""; if (thisbasket["printer"]["logo"]) { thislogo = "data:image/png;base64," + thisbasket["printer"]["logo"]; } /*Замена ID скидки на имя*/ try { var discount = thisbasket["info"]["discount"]; // thisbasket["info"]["discount"] = preload["discount"][currentsklad][discount]["title"]; } catch (err) { console.log("Не удалось найти наименование скидки"); } var ostitle = "android"; if(thisbasket["printer"]["os"] != ""){ ostitle = thisbasket["printer"]["os"]; } var data = { div: "checkmodulecontainer_result", lang: "ru", currency: "", os: ostitle, protocol: thisbasket["printer"]["protocol"], type: thisbasket["info"]["type"], logo: thislogo, header: thisbasket["printer"]["header"], order: thisbasket["info"]["id"], mode: "table", desk: thisbasket["info"]["desktopname"], width: thisbasket["printer"]["width"], font: thisbasket["printer"]["fontsize"], tr: 1, margin: { top: thisbasket["printer"]["topfeed"], left: thisbasket["printer"]["marginleft"], right: thisbasket["printer"]["marginright"], }, datetime: thisbasket["info"]["date"] + " " + thisbasket["info"]["time"], products: thisbasket.products, info: thisbasket["info"], feed: thisbasket["printer"]["feed"], footer: thisbasket["printer"]["footer"], } try{ if(preload.sklad[currentsklad]["printusertocheck"] == 1){ var user_id = thisbasket.info.user; var user = preload.users[currentsklad][user_id]; var user_name = user.user_name; if(user_name != '' && user_name != null){ data.waiter = user_name } } }catch(err){ } switch (thisbasket["printer"]["mode"]) { case 'image': app.print.generate(data) check["html"] = { code: $("#checkmodulecontainer_result").html() }; break; case 'text': var newtextcheck = []; if(thisbasket["printer"]["model"] == "PSE200"){ newtextcheck.push({type: "byte",byteValue: [0x1C, 0x2E]}); } /*Переключение кодовой страници принтера*/ var codepage = thisbasket["printer"]["codepage"]; if(codepage != 0){ if(codepage == 1000){ codepage = 0; } //Выключить китайский режим, старый вариант под старую админку, удалять пока не стоит мало ли так кто-то настроил if(codepage == 2000){ newtextcheck.push({type: "byte",byteValue: [0x1C, 0x2E]}); } try{ //Для новой админки педаль отключения китайского режима var p = JSON.parse(thisbasket["printer"]["data"]); if(p.chineseOff == 1){ newtextcheck.push({type: "byte",byteValue: [0x1C, 0x2E]}); console.log("Печать, отключение китайского режима",[0x1C, 0x2E]) } }catch(err){ } byteArray = []; byteArray.push(0x1B) byteArray.push(0x74) byteArray.push(round(codepage,0)) newtextcheck.push( { type: "byte", byteValue: byteArray } ); } if(thisbasket.printer.topfeed > 0){ for (var i = 0; i < thisbasket.printer.topfeed; i++) { try { newtextcheck.push({ type: "text", value: " ", font: 1, position: "left" }); } catch (err) {} } } try { if (thisbasket["printer"]["logo"] != "") { newtextcheck.push({ type: "image", value: thisbasket["printer"]["logo"], position: "center" }); } } catch (err) {} try { if (data.header != "" && data.header != undefined) { newtextcheck.push({ type: "text", value: data.header, font: 1, position: "center" }); } } catch (err) {} try { if (data.order != "" && data.order != undefined) { newtextcheck.push({ type: "text", value: "", font: 1, position: "center" }); newtextcheck.push({ type: "text", value: lang["Zakaz_№"] + " " + data.order, font: 1, position: "center" }); } } catch (err) {} try{ if(preload.sklad[currentsklad]["printusertocheck"] == 1){ var user_id = thisbasket.info.user; var user = preload.users[currentsklad][user_id]; var user_name = user.user_name; if(user_name != '' && user_name != null){ newtextcheck.push({ type: "text", value: lang["sotrudnik"]+": "+user_name, font: 1, position: "center" }); } } }catch(err){ } try { if (data.desk != "" && data.desk != undefined) { newtextcheck.push({ type: "text", value: lang["desk"] + " " + data.desk, font: 1, position: "center" }); } } catch (err) {} try { if (data.datetime != "") { newtextcheck.push({ type: "text", value: data.datetime, font: 1, position: "center" }); } } catch (err) {} try { if (thisbasket.info["type"] == "delivery") { /*Адрес на пречек*/ if (thisbasket.info.client > 0) { var thisclient = preload["clients"][thisbasket.info.client]; if (thisclient.name != "") { newtextcheck.push({ type: "text", value: lang["FIO"] + ":" + thisclient.name, font: 1, position: "left" }); } if (thisclient.phone != "") { newtextcheck.push({ type: "text", value: lang["telefon"] + ":" + thisclient.phone, font: 1, position: "left" }); } if (thisbasket["info"]["adress"] != "") { newtextcheck.push({ type: "text", value: lang["adres"] + ":" + thisbasket["info"]["adress"], font: 1, position: "left" }); } } } } catch (err) {} var stringlength = 32; if(thisbasket["printer"]["size"] == 80){ stringlength = 48; } var lineh = ""; for (var i = 0; i < stringlength; i++) { switch(thisbasket["printer"]["protocol"]){ case "epson_sdk_ios_bluetooth": lineh = lineh + "*"; break; default: lineh = lineh + "-"; } } try { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } catch (err) {} try { if(thisbasket.info["type"] == "report"){ thisbasket.products.forEach(function(bitem) { newtextcheck.push({ type: "text", value: bitem.name, font: 1, position: "left" }); newtextcheck.push({ type: "text", value: bitem.kolvo + " => " + CurrencyFormatted(bitem.cenaout), font: 1, position: "right" }); }) }else{ thisbasket.products.forEach(function(bitem) { var bonustext = ""; try{ if(bitem["bonus"] != '' && bitem["bonus"] != 0 && bitem["bonus"] != undefined){ bonustext = " ("+lang["Bonus"]+")"; } }catch(err){ } var modstext = ""; try{ if(bitem["modstitle"] != '' && bitem["modstitle"] != 0 && bitem["modstitle"] != undefined){ modstext = " ("+bitem["modstitle"]+" )"; } }catch(err){ } var printNameString = bitem.name+" "+bonustext+" "+modstext; /* if(thisbasket["printer"]["os"] == "ios" || thisbasket["printer"]["protocol"] == "android_tactile" || (thisbasket["printer"]["manufacturer"] == "Bixolon" && thisbasket["printer"]["model"] == "131")){ printNameString = printNameString.replace(/і/g, 'i').replace(/І/g, 'I'); } */ newtextcheck.push({ type: "text", value: printNameString, font: 1, position: "left" }); newtextcheck.push({ type: "text", value: bitem.kolvo + " x " + bitem.cenaout + " = " + CurrencyFormatted(bitem.cenaout * bitem.kolvo), font: 1, position: "right" }); try{ if(thisbasket["info"]["checkcomments"] == 1 || thisbasket["info"]["type"] == "begunok"){ if(bitem["comment"] != "" && bitem["comment"] != null && bitem["comment"] != undefined){ /* if(thisbasket["printer"]["os"] == "ios" || thisbasket["printer"]["protocol"] == "android_tactile" || (thisbasket["printer"]["manufacturer"] == "Bixolon" && thisbasket["printer"]["model"] == "131")){ bitem["comment"] = bitem["comment"].replace(/і/g, 'i').replace(/І/g, 'I'); } */ newtextcheck.push({ type: "text", value: bitem["comment"], font: 1, position: "left" }); } } }catch(err){ } }) } } catch (err) {} try { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } catch (err) {} try { if(thisbasket.info.hallscreen_id != null && thisbasket.info.hallscreen_id != ""){ var bignums = app.print.modules.bignumbers(thisbasket.info.hallscreen_id); for(var key in bignums){ var str = bignums[key]; newtextcheck.push({ type: "text", value: str, font: 1, position: "center" }); } } } catch (err) {} if(thisbasket["info"]["type"] == "begunok"){ /*Комментарий на чек в текстовом режиме*/ try { /* if(thisbasket["printer"]["os"] == "ios" || thisbasket["printer"]["protocol"] == "android_tactile" || (thisbasket["printer"]["manufacturer"] == "Bixolon" && thisbasket["printer"]["model"] == "131")){ thisbasket.info.comment = thisbasket.info.comment.replace(/і/g, 'i').replace(/І/g, 'I'); } */ if (thisbasket.info.comment != "" && thisbasket.info.comment != null) { newtextcheck.push({ type: "text", value: thisbasket.info.comment, font: 1, position: "center" }); } } catch (err) {} } if (thisbasket["info"]["type"] == "check" || thisbasket["info"]["type"] == "precheck" || thisbasket["info"]["type"] == "delivery") { try { if (thisbasket.info.servicecash > 0) { newtextcheck.push({ type: "text", value: app.print.modules.escposstr(3, stringlength, lang["Obslughivanie"], thisbasket.info.servicecash), font: 3, position: "left" }); /*Пробел*/ newtextcheck.push({ type: "text", value: "", font: 1, position: "left" }); } } catch (err) {} try { if (thisbasket.info.cashdiscount != "") { if (thisbasket.info.cashdiscount != undefined) { if (thisbasket.info.cashdiscount > 0) { newtextcheck.push({ type: "text", value: app.print.modules.escposstr(3, stringlength, lang["discount"], thisbasket.info.cashdiscount), font: 3, position: "left" }); /*Пробел*/ newtextcheck.push({ type: "text", value: "", font: 1, position: "left" }); } } } } catch (err) {} try { if (thisbasket.info.allcena != "") { newtextcheck.push({ type: "text", value: app.print.modules.escposstr(3, stringlength, lang["Vsego"], thisbasket.info.allcena), font: 3, position: "left" }); /*Пробел*/ newtextcheck.push({ type: "text", value: "", font: 1, position: "left" }); } } catch (err) {} try { if (thisbasket.info.visa != "" && thisbasket.info.visa > 0) { newtextcheck.push({ type: "text", value: app.print.modules.escposstr(3, stringlength, lang["beznal"], thisbasket.info.visa), font: 3, position: "left" }); /*Пробел*/ newtextcheck.push({ type: "text", value: "", font: 1, position: "left" }); } } catch (err) {} try { if (thisbasket.info.nall != "") { newtextcheck.push({ type: "text", value: app.print.modules.escposstr(3, stringlength, lang["cash"], thisbasket.info.nall), font: 3, position: "left" }); /*Пробел*/ newtextcheck.push({ type: "text", value: "", font: 1, position: "left" }); } } catch (err) {} try { if (thisbasket.info.sdacha > 0) { newtextcheck.push({ type: "text", value: app.print.modules.escposstr(3, stringlength, lang["change"], thisbasket.info.sdacha), font: 3, position: "left" }); /*Пробел*/ newtextcheck.push({ type: "text", value: "", font: 1, position: "left" }); } } catch (err) {} if(thisbasket["info"]["checkcomments"] == 1){ /*Комментарий на чек в текстовом режиме*/ /* if(thisbasket["printer"]["os"] == "ios" || thisbasket["printer"]["protocol"] == "android_tactile" || (thisbasket["printer"]["manufacturer"] == "Bixolon" && thisbasket["printer"]["model"] == "131")){ thisbasket.info.comment = thisbasket.info.comment.replace(/і/g, 'i').replace(/І/g, 'I'); } */ try { if (thisbasket.info.comment != "") { newtextcheck.push({ type: "text", value: thisbasket.info.comment, font: 1, position: "center" }); } } catch (err) {} } } if (thisbasket["info"]["type"] == "report") { var reportinfo = thisbasket["info"]["report"]; reportinfo.forEach(function(item) { /* if(thisbasket["printer"]["os"] == "ios" || thisbasket["printer"]["protocol"] == "android_tactile" || (thisbasket["printer"]["manufacturer"] == "Bixolon" && thisbasket["printer"]["model"] == "131")){ item.name = item.name.replace(/і/g, 'i').replace(/І/g, 'I'); } */ newtextcheck.push({ type: "text", value: app.print.modules.escposstr(3, stringlength, item.name, item.cenaout), font: 3, position: "left" }); /*Пробел*/ newtextcheck.push({ type: "text", value: "", font: 1, position: "left" }); }) } try { newtextcheck.push({ type: "text", value: lineh, font: 1, position: "left" }); } catch (err) {} try { if (data.footer != "") { newtextcheck.push({ type: "text", value: data.footer, font: 1, position: "center" }); } } catch (err) {} if(thisbasket.printer.feed > 0){ for (var i = 0; i < thisbasket.printer.feed; i++) { try { newtextcheck.push({ type: "text", value: " ", font: 1, position: "left" }); } catch (err) {} } } try{ if( thisbasket["printer"]["charset"] == "cp866" ){ for(var key in newtextcheck){ if(newtextcheck[key]["type"] == "text"){ var string = newtextcheck[key]["value"]; newtextcheck[key]["value"] = string.replace(/і/g, 'i').replace(/І/g, 'I'); } } } }catch(err){ } check["strings"] = newtextcheck; check["printer"]["logo"] = ""; break; } try{ if(thisbasket["printer"]["protocol"] == "android_tactile"){ check["data"] = { printParams:{ cutMode: thisbasket["printer"]["ofdport"] } } } }catch(err){ } try{ //Открыть денежный ящик if (thisbasket["info"]["type"] == "check" && thisbasket["info"]["cash"] > 0) { check.strings.push( { type: "byte", byteValue: [ 0x1B, 0x70, 0x00, 0x64, 0xFA ] } ); } }catch(err){ } console.log("Чек на печать", check); return check; } }, escposstr: function(font, length, left, right) { //Интересный код right = CurrencyFormatted(right); var infol = left.length + right.length; //Определение длинны вводимого текста для левой стороны if (font == 3) { s = length / 2; } else { s = length; } if (infol > s) { var b = s - (right.length + 1) left = left.substr(0, b); var infol = left.length + right.length; } if (font == 3) { infol = infol * 2; } var a = length - infol; if (font == 3) { a = a / 2; } var lineh = ""; for (var i = 0; i < a; i++) { lineh = lineh + " "; } var newstr = left + "" + lineh + "" + right; return newstr; }, escposstrS: function(font, length, left, right) { right = String(right); //Интересный код var infol = left.length + right.length; //Определение длинны вводимого текста для левой стороны if (font == 3) { s = length / 2; } else { s = length; } if (infol > s) { var b = s - (right.length + 1) left = left.substr(0, b); var infol = left.length + right.length; } if (font == 3) { infol = infol * 2; } var a = length - infol; if (font == 3) { a = a / 2; } var lineh = ""; for (var i = 0; i < a; i++) { lineh = lineh + " "; } var newstr = left + "" + lineh + "" + right; return newstr; }, escposcenter: function(stringlength, str) { var otstup = (stringlength - str.length) / 2; var newstr = ""; for (var i = 0; i < otstup; i++) { newstr = newstr + " "; } newstr = newstr + str; return newstr; }, escposright: function(stringlength, str) { var otstup = stringlength - str.length; var newstr = ""; for (var i = 0; i < otstup; i++) { newstr = newstr + " "; } newstr = newstr + str; return newstr; }, http2: function(jsonData){ return new Promise(function(resolve, reject) { setTimeout(function(jsonData) { try{ resolve(JSON.parse(Android.httpsender2(JSON.stringify(jsonData)))); }catch(err){ reject(new Error("Error:7751")); } }, 50, jsonData) }) }, http2getjson: function(jsonData){ return new Promise(function(resolve, reject) { app.print.modules.http2(jsonData).then(function(dddds111){ //тут бы нам ответ получить if (dddds111.errorMessage) { var err = JSON.stringify(dddds111.errorMessage); app.main.error(err); app.main.loader("hide"); reject(err); } else { var content = JSON.parse(dddds111.response); resolve(content); } }).catch(function(){ app.main.loader("hide"); reject(new Error("Error:9254")); app.main.error("Error:9254"); }) }) }, guid: function() { function S4() { return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1); } return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4()); }, }, protocols: { epson_sdk_android_usb: function(thisbasket) { try { var cuuu = preload["currentcurrency"]["icon"]; } catch (err) { var cuuu = "$"; } var check = { checkStrings: thisbasket["products"], /*Новый протокол*/ printer: thisbasket["printer"], info: thisbasket["info"], lang: { order: lang["Zakaz_№"] + ":", desktop: lang["desk"] + ":", pcs: lang["unit_pcs"], cur: cuuu, discount: lang["skidka"] + ":", discountbig: lang["skidka"], totalbig: lang["Itogo"], polucheno: lang["nalichnie"], sdacha: lang["change"], comments: lang["ordercomment"] + ":", } }; switch (thisbasket["printer"]["mode"]) { case 'image': switch (thisbasket["type"]) { case "check": app.print.modules.rasterize.check.put(thisbasket); check["html"] = { code: app.print.modules.rasterize.check["size_" + thisbasket["printer"]["size"]](check) }; //Открыть денежный ящик if (thisbasket["info"]["type"] == "check" && thisbasket["info"]["cash"] > 0) { check.strings.push( { type: "byte", byteValue: [ 0x1B, 0x70, 0x00, 0x64, 0xFA ] } ); } break; case "precheck": app.print.modules.rasterize.check.put(thisbasket); check["html"] = { code: app.print.modules.rasterize.check["size_" + thisbasket["printer"]["size"]](check) }; break; case "report": app.print.modules.rasterize.report.put(thisbasket); check["html"] = { code: app.print.modules.rasterize.report["size_" + thisbasket["printer"]["size"]](check) }; break; } break; case 'text': break; } console.log("Чек", check); try { Android.escpos_universal_usb(JSON.stringify(check)); } catch (err) { console.warn("Не андроид, поетому чек не печатаем"); } }, epson_sdk_android_usb_new: function(thisbasket) { var check = app.print.modules.rasterizenew(thisbasket); //console.log("Android.escpos_universal_usb",check) try { Android.escpos_universal_usb(JSON.stringify(check)); } catch (err) { console.warn("Не андроид, поетому чек не печатаем"); } }, verifone_x990: function(thisbasket) { var check = app.print.modules.rasterizenew(thisbasket); try { Android.escpos_x990(JSON.stringify(check)); } catch (err) { console.warn("Не андроид, поетому чек не печатаем"); } }, escpos_ingeniko_smart: function(thisbasket){ thisbasket["printer"]["feed"] = 3; var check = app.print.modules.rasterizenew(thisbasket); try { Android.escpos_ingenico_apos(JSON.stringify(check)); // try{ // if(preload["settings"]["userbase"] == "95e6e41b150546f894caea8b2f561860"){ // alert(JSON.stringify(check)); // } // }catch(err){ // } } catch (err) { console.warn("Не андроид, поетому чек не печатаем"); } }, electron_escpos_usb: function(thisbasket){ //Это Java НЕ Electron=) var check = app.print.modules.rasterizenew(thisbasket); try { console.log("electron_escpos_usb", check) var request = { method: "escpos_universal_usb", data: JSON.stringify(check) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { //console.log("on test request success", response); }, onFailure: function(error_code, error_message) { //console.log("on test request Failure", error_message); } }); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } }, electron_escpos_bluetooth: function(thisbasket){ //Это Java НЕ Electron=) var check = app.print.modules.rasterizenew(thisbasket); check.printer.serial = check.printer.serialport; try { console.log("electron_escpos_bluetooth", check) var request = { method: "escpos_universal_serial", data: JSON.stringify(check) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { //console.log("on test request success", response); }, onFailure: function(error_code, error_message) { //console.log("on test request Failure", error_message); } }); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } }, electron_escpos_ethernet: function(thisbasket){ //Это Java НЕ Electron=) var check = app.print.modules.rasterizenew(thisbasket); try { console.log("check", check) var request = { method: "escpos_universal_ethernet", data: JSON.stringify(check) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { //console.log("on test request success", response); }, onFailure: function(error_code, error_message) { //console.log("on test request Failure", error_message); } }); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } }, electron_windowssystem_printer: function(thisbasket){ //Это Java НЕ Electron=) var check = app.print.modules.rasterizenew(thisbasket); check.printer.systemPrinter = JSON.parse(check.printer.data)["systemPrinter"]; try { console.log("check", check) var request = { method: "escpos_system_printer", data: JSON.stringify(check) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { //console.log("on test request success", response); }, onFailure: function(error_code, error_message) { //console.log("on test request Failure", error_message); } }); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } }, epson_sdk_android_bluetooth: function(thisbasket) { try { var cuuu = preload["currentcurrency"]["icon"]; } catch (err) { var cuuu = "$"; } var check = { checkStrings: thisbasket["products"], /*Новый протокол*/ printer: thisbasket["printer"], info: thisbasket["info"], lang: { order: lang["Zakaz_№"] + ":", desktop: lang["desk"] + ":", pcs: lang["unit_pcs"], cur: cuuu, discount: lang["skidka"] + ":", discountbig: lang["skidka"], totalbig: lang["Itogo"], polucheno: lang["nalichnie"], sdacha: lang["change"], comments: lang["ordercomment"] + ":", } }; switch (thisbasket["printer"]["mode"]) { case 'image': switch (thisbasket["type"]) { case "check": app.print.modules.rasterize.check.put(thisbasket); check["html"] = { code: app.print.modules.rasterize.check["size_" + thisbasket["printer"]["size"]](check) }; break; case "precheck": app.print.modules.rasterize.check.put(thisbasket); check["html"] = { code: app.print.modules.rasterize.check["size_" + thisbasket["printer"]["size"]](check) }; break; case "report": app.print.modules.rasterize.report.put(thisbasket); check["html"] = { code: app.print.modules.rasterize.report["size_" + thisbasket["printer"]["size"]](check) }; break; } break; case 'text': break; } console.log("Чек", check); try { Android.escpos_universal_bluetooth(JSON.stringify(check)); } catch (err) { console.warn("Не андроид, поетому чек не печатаем"); } }, epson_sdk_android_bluetooth_new: function(thisbasket) { var check = app.print.modules.rasterizenew(thisbasket); try { Android.escpos_universal_bluetooth(JSON.stringify(check)); } catch (err) { console.warn("Не андроид, поетому чек не печатаем"); } }, android_tactile: function(thisbasket) { var check = app.print.modules.rasterizenew(thisbasket); try { Android.escpos_universal_bluetooth(JSON.stringify(check)); } catch (err) { console.warn("Не андроид, поетому чек не печатаем"); } }, epson_sdk_android_ethernet: function(thisbasket) { try { var cuuu = preload["currentcurrency"]["icon"]; } catch (err) { var cuuu = "$"; } var check = { checkStrings: thisbasket["products"], /*Новый протокол*/ printer: thisbasket["printer"], info: thisbasket["info"], lang: { order: lang["Zakaz_№"] + ":", desktop: lang["desk"] + ":", pcs: lang["unit_pcs"], cur: cuuu, discount: lang["skidka"] + ":", discountbig: lang["skidka"], totalbig: lang["Itogo"], polucheno: lang["nalichnie"], sdacha: lang["change"], comments: lang["ordercomment"] + ":", } }; switch (thisbasket["printer"]["mode"]) { case 'image': switch (thisbasket["type"]) { case "check": app.print.modules.rasterize.check.put(thisbasket); check["html"] = { code: app.print.modules.rasterize.check["size_" + thisbasket["printer"]["size"]](check) }; break; case "precheck": app.print.modules.rasterize.check.put(thisbasket); check["html"] = { code: app.print.modules.rasterize.check["size_" + thisbasket["printer"]["size"]](check) }; break; case "report": app.print.modules.rasterize.report.put(thisbasket); check["html"] = { code: app.print.modules.rasterize.report["size_" + thisbasket["printer"]["size"]](check) }; break; } break; case 'text': break; } console.log("Чек", check); try { Android.escpos_universal_ethernet(JSON.stringify(check)); } catch (err) { console.warn("Не андроид, поетому чек не печатаем"); } }, epson_sdk_android_ethernet_new: function(thisbasket) { var check = app.print.modules.rasterizenew(thisbasket); try { Android.escpos_universal_ethernet(JSON.stringify(check)); } catch (err) { console.warn("Не андроид, поетому чек не печатаем"); } }, printserver_box: function(thisbasket) { var headertext = thisbasket["printer"]["header"]; var newheadertext = headertext.replace("\n", '
'); try { var cuuu = preload["currentcurrency"]["icon"]; } catch (err) { var cuuu = "$"; } var check = { /*Старый протокол до версии 1.8.4.2->>>*/ id: thisbasket["info"]["id"], desktop: thisbasket["info"]["desktopname"], discount: thisbasket["info"]["discount"], discounttitle: thisbasket["info"]["discounttitle"], date: thisbasket["info"]["date"], time: thisbasket["info"]["time"], logotype: app.main.Base64.encode("data:image/png;base64," + thisbasket["printer"]["logo"]), cashback: thisbasket["printer"]["cashback"], header: newheadertext, footer: thisbasket["printer"]["footer"], size: thisbasket["printer"]["size"], shortname: 1, cenatovara: "discount", feed: thisbasket["printer"]["feed"], nall: thisbasket["info"]["nall"], cashDiscount: thisbasket["info"]["cashdiscount"], cash: thisbasket["info"]["allcena"], sdacha: thisbasket["info"]["sdacha"], lang_order: "Заказ №", lang_desktop: "Стол:", lang_pcs: "шт", lang_cur: cuuu, lang_discount: lang["skidka"] + ":", lang_discountbig: lang["skidka"], lang_totalbig: lang["Itogo"], lang_polucheno: lang["nalichnie"], lang_sdacha: lang["change"], lang_comments: lang["ordercomment"] + ":", comments: "", Footer: "", Apikey: "eTJhSm54Z1RDSHpFWnZCMNGHT5mBcGP3Bh2g4G81oA", /*<<<-Старый протокол до версии 1.8.4.2*/ /*Новый протокол*/ printer: thisbasket["printer"], info: thisbasket["info"], lang: { order: lang["Zakaz_№"] + ":", desktop: lang["desk"] + ":", pcs: lang["unit_pcs"], cur: cuuu, discount: lang["skidka"] + ":", discountbig: lang["skidka"], totalbig: lang["Itogo"], polucheno: lang["nalichnie"], sdacha: lang["change"], comments: lang["ordercomment"] + ":", }, /*Товары*/ checkStrings: thisbasket["products"] }; /*Новый протокол растр*/ /*Растровая печать*/ switch (thisbasket["printer"]["mode"]) { case 'image': switch (thisbasket["type"]) { case "check": app.print.modules.rasterize.check.put(thisbasket); check["html"] = app.print.modules.rasterize.check["size_" + thisbasket["printer"]["size"]](check); break; case "precheck": app.print.modules.rasterize.check.put(thisbasket); check["html"] = app.print.modules.rasterize.check["size_" + thisbasket["printer"]["size"]](check); break; case "report": app.print.modules.rasterize.report.put(thisbasket); check["html"] = app.print.modules.rasterize.report["size_" + thisbasket["printer"]["size"]](check); break; } break; case 'text': break; } console.log("Чек", check); var printurl = "http://" + thisbasket["printer"]["ip"] + ":80/?size=" + thisbasket["printer"]["size"] + "&printn=0"; if (window.location.protocol == "https:") { if (device.windows() === true) { console.log("Popup", thisbasket["printer"]["ip"]); OpenWindowWithPost(printurl, "width=300, height=380, left=100, top=100, location=no, directories=no, toolbar=no, resizable=no, menubar=no, status=no, copyhistory=no, scrollbars=yes", "print", { "jsondata": check }); } else { Android.httpsender(printurl, "jsondata=" + JSON.stringify(check)) } } else { console.log("Ajax", thisbasket["printer"]["ip"]); $.ajax({ type: "POST", dataType: 'json', data: "jsondata=" + JSON.stringify(check), url: printurl, success: function(json) { console.log("Ответ принтсервера", json); } }); } }, printserver_windows: function(thisbasket) { var headertext = thisbasket["printer"]["header"]; var newheadertext = headertext.replace("\n", '
'); try { var cuuu = preload["currentcurrency"]["icon"]; } catch (err) { var cuuu = "$"; } var check = { /*Старый протокол до версии 1.8.4.2->>>*/ id: thisbasket["info"]["id"], desktop: thisbasket["info"]["desktopname"], discount: thisbasket["info"]["discount"], discounttitle: thisbasket["info"]["discounttitle"], date: thisbasket["info"]["date"], time: thisbasket["info"]["time"], logotype: app.main.Base64.encode("data:image/png;base64," + thisbasket["printer"]["logo"]), cashback: thisbasket["printer"]["cashback"], header: newheadertext, footer: thisbasket["printer"]["footer"], size: thisbasket["printer"]["size"], shortname: 1, cenatovara: "discount", feed: thisbasket["printer"]["feed"], nall: thisbasket["info"]["nall"], cashDiscount: thisbasket["info"]["cashdiscount"], cash: thisbasket["info"]["allcena"], sdacha: thisbasket["info"]["sdacha"], lang_order: "Заказ №", lang_desktop: "Стол:", lang_pcs: "шт", lang_cur: cuuu, lang_discount: lang["skidka"] + ":", lang_discountbig: lang["skidka"], lang_totalbig: lang["Itogo"], lang_polucheno: lang["nalichnie"], lang_sdacha: lang["change"], lang_comments: lang["ordercomment"] + ":", comments: "", Footer: "", Apikey: "eTJhSm54Z1RDSHpFWnZCMNGHT5mBcGP3Bh2g4G81oA", /*<<<-Старый протокол до версии 1.8.4.2*/ /*Новый протокол*/ printer: thisbasket["printer"], info: thisbasket["info"], lang: { order: lang["Zakaz_№"] + ":", desktop: lang["desk"] + ":", pcs: lang["unit_pcs"], cur: cuuu, discount: lang["skidka"] + ":", discountbig: lang["skidka"], totalbig: lang["Itogo"], polucheno: lang["nalichnie"], sdacha: lang["change"], comments: lang["ordercomment"] + ":", }, /*Товары*/ checkStrings: thisbasket["products"] }; /*Новый протокол растр*/ /*Растровая печать*/ switch (thisbasket["printer"]["mode"]) { case 'image': switch (thisbasket["type"]) { case "check": app.print.modules.rasterize.check.put(thisbasket); check["html"] = app.print.modules.rasterize.check["size_" + thisbasket["printer"]["size"] + "win"](check); break; case "precheck": app.print.modules.rasterize.check.put(thisbasket); check["html"] = app.print.modules.rasterize.check["size_" + thisbasket["printer"]["size"] + "win"](check); break; case "report": app.print.modules.rasterize.report.put(thisbasket); check["html"] = app.print.modules.rasterize.report["size_" + thisbasket["printer"]["size"] + "win"](check); break; } break; case 'text': break; } console.log("Чек", check); var printurl = "http://" + myIP + ":3377/?size=" + thisbasket["printer"]["size"] + "&printn=" + thisbasket["printer"]["nomer"]; if (window.location.protocol == "https:") { if (device.windows() === true) { console.log("Popup", myIP + ":3377"); OpenWindowWithPost(printurl, "width=300, height=380, left=100, top=100, location=no, directories=no, toolbar=no, resizable=no, menubar=no, status=no, copyhistory=no, scrollbars=yes", "print", { "jsondata": check }); } else { Android.httpsender(printurl, "jsondata=" + JSON.stringify(check)) } } else { console.log("Ajax", myIP + ":3377"); $.ajax({ type: "POST", dataType: 'json', data: "jsondata=" + JSON.stringify(check), url: printurl, success: function(json) { console.log("Ответ принтсервера", json); } }); } }, printserver_windows_1808: function(thisbasket) { console.warn("printserver_windows_1808", JSON.stringify(thisbasket)) var check = { checkStrings: thisbasket["products"], printer: thisbasket["printer"], info: thisbasket["info"], }; var thislogo = ""; if (thisbasket["printer"]["logo"]) { var logoo = thisbasket["printer"]["logo"]; var logoo1 = logoo.replace(/[+]/g, '!____!'); var logoo2 = logoo1.replace(/[\/]/g, '!__1__!'); thislogo = "data:image/png;base64," + logoo2; } app.print.generate({ div: "checkmodulecontainer_result", lang: "ru", currency: "", type: thisbasket["info"]["type"], os: "windows", logo: thislogo, header: thisbasket["printer"]["header"], order: thisbasket["info"]["id"], mode: "table", desk: thisbasket["info"]["desktopname"], width: thisbasket["printer"]["width"], font: thisbasket["printer"]["fontsize"], tr: 1, margin: { top: thisbasket["printer"]["topfeed"], left: thisbasket["printer"]["marginleft"], right: thisbasket["printer"]["marginright"], }, datetime: thisbasket["info"]["date"] + " " + thisbasket["info"]["time"], products: thisbasket.products, info: thisbasket["info"], feed: thisbasket["printer"]["feed"], footer: thisbasket["printer"]["footer"], }) switch (thisbasket["type"]) { case "check": break; case "precheck": break; case "report": break; } check["html"] = $("#checkmodulecontainer_result").html(); console.log("Чек", check); console.log("Ajax localhost:3377"); $.ajax({ type: "POST", dataType: 'json', data: "jsondata=" + JSON.stringify(check), url: "http://localhost:3377/?size=" + thisbasket["printer"]["size"] + "&printn=" + thisbasket["printer"]["nomer"], success: function(json) { console.log("Ответ принтсервера", json); } }); console.log(JSON.stringify(check)); }, windows_java_app: function(thisbasket) { //Варик не зашел. Deprecated var check = app.print.modules.rasterizenew(thisbasket); html2canvas(document.querySelector("#checkmodulecontainer_result"),{ allowTaint: true, useCORS: true }).then( function(canvas){ var png = canvas.toDataURL('image/png'); check["base64"] = png; check["printer"]["systemPrinter"] = "80mm Printer Driver1"; console.log("windows_java_app",check); try { var request = { method: "escpos_system_printer", data: JSON.stringify(check) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { //console.log("on test request success", response); }, onFailure: function(error_code, error_message) { //console.log("on test request Failure", error_message); } }); } catch (err) { console.warn(err); } }); }, printserver_windows_new: function(thisbasket) { var check = { checkStrings: thisbasket["products"], printer: thisbasket["printer"], info: thisbasket["info"], }; var thislogo = ""; if (thisbasket["printer"]["logo"]) { var logoo = thisbasket["printer"]["logo"]; var logoo1 = logoo.replace(/[+]/g, '!____!'); var logoo2 = logoo1.replace(/[\/]/g, '!__1__!'); thislogo = "data:image/png;base64," + logoo2; } app.print.generate({ div: "checkmodulecontainer_result", lang: "ru", currency: "", type: thisbasket["info"]["type"], os: "windows", logo: thislogo, header: thisbasket["printer"]["header"], order: thisbasket["info"]["id"], mode: "table", desk: thisbasket["info"]["desktopname"], width: thisbasket["printer"]["width"], font: thisbasket["printer"]["fontsize"], tr: 1, margin: { top: thisbasket["printer"]["topfeed"], left: thisbasket["printer"]["marginleft"], right: thisbasket["printer"]["marginright"], }, datetime: thisbasket["info"]["date"] + " " + thisbasket["info"]["time"], products: thisbasket.products, info: thisbasket["info"], feed: thisbasket["printer"]["feed"], footer: thisbasket["printer"]["footer"], }) switch (thisbasket["type"]) { case "check": break; case "precheck": break; case "report": break; } check["html"] = $("#checkmodulecontainer_result").html(); console.log("Чек", check); if (thisbasket["printer"]["ip"] == "") { thisbasket["printer"]["ip"] = myIP; } var flag = "xhr"; if (device.android() == true) { flag = "android"; } else { if (window.location.protocol == "https:") { if (thisbasket["printer"]["ip"] == "127.0.0.1" || thisbasket["printer"]["ip"] == "localhost") { flag = "xhr"; } else { flag = "popup"; } } else { flag = "xhr"; } } switch (flag) { case "android": var req = Android.httpsender("http://" + thisbasket["printer"]["ip"] + ":3377/", "jsondata=" + JSON.stringify(check)); try { app.main.loader("hide"); } catch (err) {} break; case "popup": console.log("Popup", thisbasket["printer"]["ip"]); //OpenWindowWithPostt("http://"+thisbasket["printer"]["ip"]+":3377/?size=" + thisbasket["printer"]["size"] + "&printn=" + thisbasket["printer"]["nomer"], "width=300, height=380, left=100, top=100, location=no, directories=no, toolbar=no, resizable=no, menubar=no, status=no, copyhistory=no, scrollbars=yes", "print", "jsondata=" + JSON.stringify(check)); OpenWindowWithPost("http://" + thisbasket["printer"]["ip"] + ":3377/?size=" + thisbasket["printer"]["size"] + "&printn=" + thisbasket["printer"]["nomer"], "width=300, height=380, left=100, top=100, location=no, directories=no, toolbar=no, resizable=no, menubar=no, status=no, copyhistory=no, scrollbars=yes", "print", { "jsondata": check }); try { app.main.loader("hide"); } catch (err) {} break; case "xhr": $.ajax({ type: "POST", dataType: 'json', data: "jsondata=" + JSON.stringify(check), url: "http://" + thisbasket["printer"]["ip"] + ":3377/?size=" + thisbasket["printer"]["size"] + "&printn=" + thisbasket["printer"]["nomer"], success: function(json) { console.log("Ответ принтсервера", json); } }); console.log(JSON.stringify(check)); break; } }, android_pos_posin: function(thisbasket) { try { var cuuu = preload["currentcurrency"]["icon"]; } catch (err) { var cuuu = "$"; } var check = { /*Новый протокол*/ printer: thisbasket["printer"], info: thisbasket["info"], lang: { order: lang["Zakaz_№"] + ":", desktop: lang["desk"] + ":", pcs: lang["unit_pcs"], cur: cuuu, discount: lang["skidka"] + ":", discountbig: lang["skidka"], totalbig: lang["Itogo"], polucheno: lang["nalichnie"], sdacha: lang["change"], comments: lang["ordercomment"] + ":", }, /*Товары*/ checkStrings: thisbasket["products"] }; switch (thisbasket["printer"]["mode"]) { case 'image': switch (thisbasket["type"]) { case "check": app.print.modules.rasterize.check.put(thisbasket); check["html"] = { code: app.print.modules.rasterize.check["size_" + thisbasket["printer"]["size"]](check) }; break; case "precheck": app.print.modules.rasterize.check.put(thisbasket); check["html"] = { code: app.print.modules.rasterize.check["size_" + thisbasket["printer"]["size"]](check) }; break; case "report": app.print.modules.rasterize.report.put(thisbasket); check["html"] = { code: app.print.modules.rasterize.report["size_" + thisbasket["printer"]["size"]](check) }; break; } break; case 'text': break; } console.log("Чек", check); try { Android.escpos_posin(JSON.stringify(check)); } catch (err) { console.warn("Не андроид, поетому чек не печатаем"); } }, android_pos_posin_new: function(thisbasket) { var check = app.print.modules.rasterizenew(thisbasket); try { Android.escpos_posin(JSON.stringify(check)); } catch (err) { console.warn("Не андроид, поетому чек не печатаем"); } }, androidsunmi: function(thisbasket) { if(thisbasket.printer.feed < 0){ thisbasket.printer.feed = 0; } var check = app.print.modules.rasterizenew(thisbasket); try { Android.escpos_sunmi(JSON.stringify(check)); } catch (err) { console.warn("Не андроид, поетому чек не печатаем"); } }, d2mini: function(thisbasket) { if(thisbasket.printer.feed < 0){ thisbasket.printer.feed = 0; } var check = app.print.modules.rasterizenew(thisbasket); console.log("d2mini",check) try { Android.escpos_sunmi(JSON.stringify(check)); } catch (err) { console.warn("Не андроид, поетому чек не печатаем"); } }, t1mini: function(thisbasket) { if(thisbasket.printer.feed < 0){ thisbasket.printer.feed = 0; } var check = app.print.modules.rasterizenew(thisbasket); try { Android.escpos_sunmi(JSON.stringify(check)); } catch (err) { console.warn("Не андроид, поетому чек не печатаем"); } }, androidcenterm:function(thisbasket) { thisbasket.printer.feed = 2; var check = app.print.modules.rasterizenew(thisbasket); try { Android.escpos_centerm(JSON.stringify(check)); } catch (err) { console.warn("Не андроид, поетому чек не печатаем"); } }, universal_sdk_ios_ethernet: function(thisbasket) { delete thisbasket.printer.settings; var check = app.print.modules.rasterizenew(thisbasket); try { window.webkit.messageHandlers.ethernetprint.postMessage(JSON.stringify(check)); } catch (err) { console.warn("Не ios, поетому чек не печатаем"); } }, epson_sdk_ios_bluetooth: function(thisbasket) { delete thisbasket.printer.settings; var check = app.print.modules.rasterizenew(thisbasket); try { window.webkit.messageHandlers.bluetoothprint.postMessage(JSON.stringify(check)); } catch (err) { console.warn("Не ios, поетому чек не печатаем", check); } }, kkm_server_ru: { opendrawer: function(thisbasket) { var jsonData = { Command: "OpenCashDrawer", Printer: thisbasket["printer"], NumDevice: 0, IdCommand: app.print.modules.guid() } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.kkm_server_ru.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, vozvrat: function(thisbasket) { //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; var nallll = 0; var newfiscalarr = []; var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); fiscalarr.forEach(function(item) { if (item["tax"] == null) { item["tax"] = ""; } if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] != "") { newfiscalarr.push({ Register: { SignMethodCalculation: 4, SignCalculationObject: 1, Name: item["name"], Quantity: round(item["kolvo"]), Price: round(item["cenaout"]), Amount: round(amount), Department: 0, PerDisc: 0, SumDisc: 0, Tax: round(item["tax"], 0), } }); /*Плюсуем сумму*/ nallll = nallll + amount; } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ kostilsumm = kostilsumm + amount; } }); if (kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы онлайн кассе"); } // Вызов команды var jsonData = { Command: "RegisterCheck", Printer: thisbasket["printer"], Protocol: 1, PortName: thisbasket.printer.serialport, PortSpeed: 0, IsFiscalCheck: true, TypeCheck: 1, CashierName: preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], CashierVATIN: preload["users"][currentsklad][thisbasket["info"]["user"]]["user_vatin"], TaxVariant: round(thisbasket["printer"]["cno"], 0), CheckStrings: newfiscalarr, Cash: round(nallll, 2), Nall: round(nallll, 2), ElectronicPayment: round(thisbasket["info"]["visa"], 2), AdvancePayment: 0, Credit: 0, CashProvision: 0, PerDisc: 0, SumDisc: 0, CashLessType: 0 }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.kkm_server_ru.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, opensmena: function(thisbasket) { // Подготовка данных команды var jsonData = { // Команда серверу Command: "OpenShift", Printer: thisbasket["printer"], // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: 0, // Id устройства. Строка. Если = "" то первое не блокированное на сервере IdDevice: "", // Продавец, тег ОФД 1021 CashierName: preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], // ИНН продавца тег ОФД 1203 //CashierVATIN: "430601071197", // Не печатать чек на бумагу NotPrint: false, // Уникальный идентификатор команды. Любая строока из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды IdCommand: app.print.modules.guid(), }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.kkm_server_ru.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, check: function(thisbasket) { // Подготовка данных команды var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); var newfiscalarr = []; //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; fiscalarr.forEach(function(item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } if (item["tax"] != "") { var newitem = {} flag = 1; newitem["Name"] = item["name"]; newitem["Quantity"] = item["kolvo"]; newitem["Price"] = item["cenaout"]; if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } newitem["Amount"] = amount; newitem["Department"] = 0; newitem["Tax"] = round(item["tax"], 0); newitem["EAN13"] = ""; newfiscalarr.push({ "Register": newitem }) } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } kostilsumm = kostilsumm + amount; } }); var dali = thisbasket["info"]["cash"]; if (thisbasket["info"]["nall"] > 0) { dali = thisbasket["info"]["nall"] } var Data = { // Команда серверу Command: "RegisterCheck", Printer: thisbasket["printer"], //*********************************************************************************************************** // ПОЛЯ ПОИСКА УСТРОЙСТВА //*********************************************************************************************************** // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: 0, // ИНН ККМ для поиска. Если "" то ККМ ищется только по NumDevice, // Если NumDevice = 0 а InnKkm заполнено то ККМ ищется только по InnKkm //InnKkm: "", //--------------------------------------------- // Заводской номер ККМ для поиска. Если "" то ККМ ищется только по NumDevice, //KktNumber: "", // ********************************************************************************************************** // Время (сек) ожидания выполнения команды. //Если За это время команда не выполнилась в статусе вернется результат "NotRun" или "Run" //Проверить результат еще не выполненной команды можно командой "GetRezult" //Если не указано или 0 - то значение по умолчанию 60 сек. // Поле не обязательно. Это поле можно указывать во всех командах Timeout: 30, // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды // Поле не обязательно IdCommand: app.print.modules.guid(), // Это фискальный или не фискальный чек IsFiscalCheck: true, // Тип чека; // 0 – продажа; 10 – покупка; // 1 – возврат продажи; 11 - возврат покупки; // 8 - продажа только по ЕГАИС (обычный чек ККМ не печатается) // 9 - возврат продажи только по ЕГАИС (обычный чек ККМ не печатается) TypeCheck: 0, // Не печатать чек на бумагу NotPrint: false, //true, // Количество копий документа NumberCopies: 0, // Продавец, тег ОФД 1021 CashierName: preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], // ИНН продавца тег ОФД 1203 //CashierVATIN: "1181111110", // Телефон или е-Майл покупателя, тег ОФД 1008 // Если чек не печатается (NotPrint = true) то указывать обязательно // Формат: Телефон +{Ц} Email {С}@{C} //ClientAddress: "", //sochi@papa.com // Aдрес электронной почты отправителя чека тег ОФД 1117 (если задан при регистрации можно не указывать) // Формат: Email {С}@{C} //SenderEmail: "", //sochi@mama.com // Система налогообложения (СНО) применяемая для чека // Если не указанно - система СНО настроенная в ККМ по умолчанию // 0: Общая ОСН // 1: Упрощенная УСН (Доход) // 2: Упрощенная УСН (Доход минус Расход) // 3: Единый налог на вмененный доход ЕНВД // 4: Единый сельскохозяйственный налог ЕСН // 5: Патентная система налогообложения // Комбинация разных СНО не возможна // Надо указывать если ККМ настроена на несколько систем СНО //TaxVariant: 1, // Дополнительные произвольные реквизиты (не обязательно) пока только 1 строка /* AdditionalProps: [ //{ Print: true, PrintInHeader: false, NameProp: "Номер транзакции", Prop: "234/154" }, { Print: true, PrintInHeader: false, NameProp: "Дата транзакции", Prop: "10.11.2016 10:30" }, ], */ //ClientId: "557582273e4edc1c6f315efe", // Это только для тестов: Получение ключа суб-лицензии : ВНИМАНИЕ: ключ суб-лицензии вы должны генерить у себя на сервере!!!! KeySubLicensing: preload["settings"]["kkmKeySubLicensing"], // КПП организации, нужно только для ЕГАИС //KPP: "782543005", // Строки чека // НДС в процентах или ТЕГ НДС: //0 (НДС 0%), //10 (НДС 10%), //18 (НДС 18%), //-1 (НДС не облагается), //118 (НДС 18/118), //110 (НДС 10/110) CheckStrings: newfiscalarr, // Наличная оплата (2 знака после запятой) Cash: dali, // Сумма электронной оплаты (2 знака после запятой) ElectronicPayment: thisbasket["info"]["visa"], // Сумма из предоплаты (зачетом аванса) (2 знака после запятой) AdvancePayment: 0, // Сумма постоплатой(в кредит) (2 знака после запятой) Credit: 0, // Сумма оплаты встречным предоставлением (сертификаты, др. мат.ценности) (2 знака после запятой) CashProvision: 0, }; /*Проверка не пустон ли поле оплаты безналом*/ if (Data.ElectronicPayment == "") { Data.ElectronicPayment = 0; } var IsBarCode = false; /*хз зачем это поеэтому вырубаем*/ /*Если чек без ШК то удаляем строку с ШК*/ if (IsBarCode == false) { //Data.Cash = 100; for (var i = 0; i < Data.CheckStrings.length; i++) { if (Data.CheckStrings[i] != undefined && Data.CheckStrings[i].BarCode != undefined) { Data.CheckStrings[i].BarCode = null; }; if (Data.CheckStrings[i] != undefined && Data.CheckStrings[i].PrintImage != undefined) { Data.CheckStrings[i].PrintImage = null; }; }; }; /* Скидываем данные об агенте - т.к.у Вас невярнека ККТ не зарегистрирована как Агент.*/ for (var i = 0; i < Data.CheckStrings.length; i++) { if (Data.CheckStrings[i] != undefined && Data.CheckStrings[i].Register != undefined) { Data.CheckStrings[i].Register.AgentSign = null; Data.CheckStrings[i].Register.AgentData = null; Data.CheckStrings[i].Register.PurveyorData = null; }; }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.kkm_server_ru.ExecuteCommand(Data).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, precheck: function(thisbasket) { var newfiscalarr = []; newfiscalarr.push({ PrintText: { Text: ">#2#<Счёт на оплату", Font: 1 } }) newfiscalarr.push({ PrintText: { Text: "<<->>" } }) var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); fiscalarr.forEach(function(item, i) { //Собираем нужный массив newfiscalarr.push({ PrintText: { Text: fiscalarr[i]["name"], Font: 3 } }) newfiscalarr.push({ PrintText: { Text: CurrencyFormatted(fiscalarr[i]["kolvo"], 3) + " * " + CurrencyFormatted(fiscalarr[i]["cenaout"]) + "=<#8#>>" + CurrencyFormatted(fiscalarr[i]["cenaout"] * fiscalarr[i]["kolvo"]), Font: 3 } }) }); newfiscalarr.push({ PrintText: { Text: "<<->>" } }) if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { //Со скидкой newfiscalarr.push({ PrintText: { Text: "СКИДКА:<#8#>>" + CurrencyFormatted(thisbasket["info"]["cashdiscount"]), Font: 1 } }) } newfiscalarr.push({ PrintText: { Text: "ИТОГ:<#8#>>" + CurrencyFormatted(thisbasket["info"]["allcena"]), Font: 1 } }) newfiscalarr.push({ PrintText: { Text: "<<->>" } }) newfiscalarr.push({ PrintText: { Text: ">#2#<НЕ ФИСКАЛЬНЫЙ" } }) this.ExecuteCommand({ Command: "RegisterCheck", Printer: thisbasket["printer"], NumDevice: 0, IsFiscalCheck: false, NotPrint: false, IdCommand: app.print.modules.guid(), CheckStrings: newfiscalarr }); }, otmena: function(thisbasket) {}, XReport: function(thisbasket) { // Подготовка данных команды var jsonData = { // Команда серверу "ZReport" ИЛИ "XReport" Command: "XReport", Printer: thisbasket["printer"], // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: 0, // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды // Поле не обязательно IdCommand: app.print.modules.guid() }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.kkm_server_ru.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, ZReport: function(thisbasket) { // Подготовка данных команды var jsonData = { // Команда серверу "ZReport" ИЛИ "XReport" Command: "ZReport", Printer: thisbasket["printer"], // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: 0, // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды // Поле не обязательно IdCommand: app.print.modules.guid() }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.kkm_server_ru.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, introduction: function(data) { var jsonData = { Command: "DepositingCash", Printer: data["printer"], Amount: round(data["cash"]), NumDevice: 0, IdCommand: app.print.modules.guid() } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.kkm_server_ru.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, incasation: function(data) { var jsonData = { Command: "PaymentCash", Printer: data["printer"], Amount: round(data["cash"]), NumDevice: 0, IdCommand: app.print.modules.guid() } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.kkm_server_ru.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, rashod: function(data) { var jsonData = { Command: "PaymentCash", Printer: data["printer"], Amount: round(data["cash"]), Protocol: 1, NumDevice: 0, IdCommand: app.print.modules.guid() } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.kkm_server_ru.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, ExecuteCommand: function(Data) { return new Promise(function(resolve, reject) { app.main.loader("show"); var User = "User"; var Password = ""; var IP = "localhost"; try { if (Data["Printer"]["ip"] != "") { IP = Data["Printer"]["ip"]; } } catch (err) { console.log("Не удалось найти IP") } $.ajax({ type: 'POST', async: true, timeout: 60000, url: "http://" + IP + ":5893/Execute/sync", crossDomain: true, dataType: 'json', contentType: 'application/json; charset=UTF-8', data: JSON.stringify(Data), headers: (User !== "" || Password !== "") ? { "Authorization": "Basic " + btoa(User + ":" + Password) } : "", success: function(json) { app.main.loader("hide"); // Текст ошибки if (json.Error) { reject({ "status": "error" }); app.main.error(json.Error); } else { //Ответ от аппарата console.log(json); resolve({ "status": "done" }); } }, error: function(err) { reject({ "status": "error" }); app.main.loader("hide"); app.main.error("Нет соединения с \"ККМ web-сервер\""); } }); }) }, }, kkm_server_ru_1_05: { opendrawer: function(thisbasket) { var jsonData = { Command: "OpenCashDrawer", Printer: thisbasket["printer"], NumDevice: 0, IdCommand: app.print.modules.guid() } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.kkm_server_ru_1_05.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, vozvrat: function(thisbasket) { //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; var nallll = 0; var newfiscalarr = []; var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); fiscalarr.forEach(function(item) { if (item["tax"] == null) { item["tax"] = ""; } if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] != "") { newfiscalarr.push({ Register: { SignMethodCalculation: 4, SignCalculationObject: 1, Name: item["name"], Quantity: round(item["kolvo"]), Price: round(item["cenaout"]), Amount: round(amount), Department: 0, PerDisc: 0, SumDisc: 0, Tax: round(item["tax"], 0), } }); /*Плюсуем сумму*/ nallll = nallll + amount; } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ kostilsumm = kostilsumm + amount; } }); if (kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы онлайн кассе"); } // Вызов команды var jsonData = { Command: "RegisterCheck", Printer: thisbasket["printer"], Protocol: 1, PortName: thisbasket.printer.serialport, PortSpeed: 0, IsFiscalCheck: true, TypeCheck: 1, CashierName: preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], CashierVATIN: preload["users"][currentsklad][thisbasket["info"]["user"]]["user_vatin"], TaxVariant: round(thisbasket["printer"]["cno"], 0), CheckStrings: newfiscalarr, Cash: round(nallll, 2), Nall: round(nallll, 2), ElectronicPayment: round(thisbasket["info"]["visa"], 2), AdvancePayment: 0, Credit: 0, CashProvision: 0, PerDisc: 0, SumDisc: 0, CashLessType: 0 }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.kkm_server_ru_1_05.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, opensmena: function(thisbasket) { var jsonData = { // Команда серверу Command: "OpenShift", Printer: thisbasket["printer"], // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: 0, // Id устройства. Строка. Если = "" то первое не блокированное на сервере IdDevice: "", // Продавец, тег ОФД 1021 CashierName: preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], // ИНН продавца тег ОФД 1203 CashierVATIN: preload["users"][currentsklad][thisbasket["info"]["user"]]["user_vatin"], // Не печатать чек на бумагу NotPrint: false, // Уникальный идентификатор команды. Любая строока из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды IdCommand: app.print.modules.guid() } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.kkm_server_ru_1_05.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, check: function(thisbasket) { //- добавлено обязательное поле "CashierVATIN" - ИНН продавца //- добавлено не обязательное поле "SenderEmail" - Aдрес электронной почты отправителя чека //- Добавлены поле "ElectronicPayment" - Сумма электронной оплаты //- Добавлены поле "AdvancePayment" - Сумма из предоплаты (зачетом аванса) //- Добавлены поле "Credit" - Сумма постоплатой(в кредит) //- Добавлены поле "CashProvision" - Сумма оплаты встречным предоставлением (сертификаты, тара, др. мат. ценности) //- в фискальной строке добавлены поля: //- "SignMethodCalculation" - Признак способа расчета, обязательно! //- "SignCalculationObject" - Признак предмета расчета, обязательно! //- "MeasurementUnit" - Единица измерения предмета расчета //- "NomenclatureCode" - Код товарной номенклатуры (Новый классификатор товаров и услуг. Пока не утвержден налоговой.) //- "AgentSign" - Признак агента //- "AgentData" - Данные агента (если указан AgentSign) //- "PurveyorData" - Признак поставщика (если указан AgentSign) //В возвращаемых данных: //- в поле "URL" будет возвращаться ссылка на чек в ОФД (для тех ОФД для которых можно сформировать такую ссылку) //- в поле "QRCode" будет возвращаться данные, которые закодированы в QR коде на чеке (ранее это возвращалось в поле "URL") // Подготовка данных команды var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); var newfiscalarr = []; try{ //Закомментировал после обращения клиента о том что не печатает чек //newfiscalarr.push({ // PrintText: { // Text: ">#2#<Заказ #"+thisbasket["info"]["id"], // Font: 1 // } //}) }catch(err){ } //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; //Собираем нужный массив и убираем позиции которые не подлежат налогообложению fiscalarr.forEach(function(item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } if (item["tax"] != "") { flag = 1; var newitem = {} // Признак способа расчета. тег ОФД 1214. Для ФФД.1.05 и выше обязательное поле // 1: "ПРЕДОПЛАТА 100% (Полная предварительная оплата до момента передачи предмета расчета)" // 2: "ПРЕДОПЛАТА (Частичная предварительная оплата до момента передачи предмета расчета)" // 3: "АВАНС" // 4: "ПОЛНЫЙ РАСЧЕТ (Полная оплата, в том числе с учетом аванса в момент передачи предмета расчета)" // 5: "ЧАСТИЧНЫЙ РАСЧЕТ И КРЕДИТ (Частичная оплата предмета расчета в момент его передачи с последующей оплатой в кредит )" // 6: "ПЕРЕДАЧА В КРЕДИТ (Передача предмета расчета без его оплаты в момент его передачи с последующей оплатой в кредит)" // 7: "ОПЛАТА КРЕДИТА (Оплата предмета расчета после его передачи с оплатой в кредит )" newitem["SignMethodCalculation"] = 4; try{ if(thisbasket["info"]["nopaymentstype"] == "debt"){ newitem["SignMethodCalculation"] = 6; } }catch(err){ } // Признак предмета расчета. тег ОФД 1212. Для ФФД.1.1 и выше обязательное поле // 1: "ТОВАР (наименование и иные сведения, описывающие товар)" // 2: "ПОДАКЦИЗНЫЙ ТОВАР (наименование и иные сведения, описывающие товар)" // 3: "РАБОТА (наименование и иные сведения, описывающие работу)" // 4: "УСЛУГА (наименование и иные сведения, описывающие услугу)" // 5: "СТАВКА АЗАРТНОЙ ИГРЫ (при осуществлении деятельности по проведению азартных игр)" // 6: "ВЫИГРЫШ АЗАРТНОЙ ИГРЫ (при осуществлении деятельности по проведению азартных игр)" // 7: "ЛОТЕРЕЙНЫЙ БИЛЕТ (при осуществлении деятельности по проведению лотерей)" // 8: "ВЫИГРЫШ ЛОТЕРЕИ (при осуществлении деятельности по проведению лотерей)" // 9: "ПРЕДОСТАВЛЕНИЕ РИД (предоставлении прав на использование результатов интеллектуальной деятельности или средств индивидуализации)" // 10: "ПЛАТЕЖ (аванс, задаток, предоплата, кредит, взнос в счет оплаты, пени, штраф, вознаграждение, бонус и иной аналогичный предмет расчета)" // 11: "АГЕНТСКОЕ ВОЗНАГРАЖДЕНИЕ (вознаграждение (банковского)платежного агента/субагента, комиссионера, поверенного или иным агентом)" // 12: "СОСТАВНОЙ ПРЕДМЕТ РАСЧЕТА (предмет расчета, состоящем из предметов, каждому из которых может быть присвоено вышестоящее значение" // 13: "ИНОЙ ПРЕДМЕТ РАСЧЕТА (предмет расчета, не относящемуся к предметам расчета, которым может быть присвоено вышестоящее значение" newitem["SignCalculationObject"] = 1; // Единица измерения предмета расчета. Можно не указывать //MeasurementUnit: "пара", // Код товарной номенклатуры Тег ОФД 1162 (Новый классификатор товаров и услуг. Пока не утвержден налоговой. Пока не указывать) // 4 символа – код справочника; последующие 8 символовт – код группы товаров; последние 20 символов – код идентификации товара //NomenclatureCode: "", // Признак агента. Тег ОФД 1057, 1222. Поле не обязательное. Можно вообще не указывать. // 0: "Банковский платежный агент:" Оказание услуг пользователем, являющимся банковским платежным агентом // 1: "Банковский платежный субагент:" Оказание услуг пользователем, являющимся банковским платежным субагентом // 2: "Платежный агент:" Оказание услуг пользователем, являющимся платежным агентом // 3: "Платежный субагент:" Оказание услуг пользователем, являющимся платежным субагентом // 4: "Поверенный:" Оказание услуг пользователем, являющимся поверенным // 5: "Комиссионер:" Оказание услуг пользователем, являющимся комиссионером // 6: "Агент:" Оказание услуг пользователем, являющимся агентом и не являющимся банковским платежным агентом (субагентом), платежным агентом (субагентом), поверенным, комиссионером // Данные для ЕГАИС системы, можно не указывать //EGAIS: { // Barcode: "22N0000154NUCPRZ3R8381461004001003499NKAQ0ZBUVDNV62JQAR69PEV878RO93V", // Ean: "3423290167937", // Volume: 0.7500, //}, newitem["Name"] = item["name"]; newitem["Quantity"] = item["kolvo"]; newitem["Price"] = item["cenaout"]; if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } newitem["Amount"] = amount; newitem["Department"] = 0; newitem["Tax"] = round(item["tax"], 0); newitem["EAN13"] = ""; newfiscalarr.push({ "Register": newitem }) } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } kostilsumm = kostilsumm + amount; } }); var dali = thisbasket["info"]["cash"]; if (thisbasket["info"]["nall"] > 0) { dali = thisbasket["info"]["nall"] } //Отнимаем от суммы которую дал клиент сумму товара который не пошел на печать на фискальник dali = dali - kostilsumm; if (kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы онлайн кассе"); } var Data = { // Команда серверу Command: "RegisterCheck", Printer: thisbasket["printer"], //*********************************************************************************************************** // ПОЛЯ ПОИСКА УСТРОЙСТВА //*********************************************************************************************************** // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: 0, // ИНН ККМ для поиска. Если "" то ККМ ищется только по NumDevice, // Если NumDevice = 0 а InnKkm заполнено то ККМ ищется только по InnKkm //InnKkm: "", //--------------------------------------------- // Заводской номер ККМ для поиска. Если "" то ККМ ищется только по NumDevice, //KktNumber: "", // ********************************************************************************************************** // Время (сек) ожидания выполнения команды. //Если За это время команда не выполнилась в статусе вернется результат "NotRun" или "Run" //Проверить результат еще не выполненной команды можно командой "GetRezult" //Если не указано или 0 - то значение по умолчанию 60 сек. // Поле не обязательно. Это поле можно указывать во всех командах Timeout: 30, // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды // Поле не обязательно IdCommand: app.print.modules.guid(), // Это фискальный или не фискальный чек IsFiscalCheck: true, // Тип чека; // 0 – продажа; 10 – покупка; // 1 – возврат продажи; 11 - возврат покупки; // 8 - продажа только по ЕГАИС (обычный чек ККМ не печатается) // 9 - возврат продажи только по ЕГАИС (обычный чек ККМ не печатается) TypeCheck: 0, // Не печатать чек на бумагу NotPrint: false, //true, // Количество копий документа NumberCopies: 0, // Продавец, тег ОФД 1021 CashierName: preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], // ИНН продавца тег ОФД 1203 CashierVATIN: preload["users"][currentsklad][thisbasket["info"]["user"]]["user_vatin"], // Телефон или е-Майл покупателя, тег ОФД 1008 // Если чек не печатается (NotPrint = true) то указывать обязательно // Формат: Телефон +{Ц} Email {С}@{C} //ClientAddress: "", //sochi@papa.com // Aдрес электронной почты отправителя чека тег ОФД 1117 (если задан при регистрации можно не указывать) // Формат: Email {С}@{C} //SenderEmail: "", //sochi@mama.com // Система налогообложения (СНО) применяемая для чека // Если не указанно - система СНО настроенная в ККМ по умолчанию // 0: Общая ОСН // 1: Упрощенная УСН (Доход) // 2: Упрощенная УСН (Доход минус Расход) // 3: Единый налог на вмененный доход ЕНВД // 4: Единый сельскохозяйственный налог ЕСН // 5: Патентная система налогообложения // Комбинация разных СНО не возможна // Надо указывать если ККМ настроена на несколько систем СНО TaxVariant: thisbasket["printer"]["cno"], // Дополнительные произвольные реквизиты (не обязательно) пока только 1 строка /* AdditionalProps: [ //{ Print: true, PrintInHeader: false, NameProp: "Номер транзакции", Prop: "234/154" }, { Print: true, PrintInHeader: false, NameProp: "Дата транзакции", Prop: "10.11.2016 10:30" }, ], */ //ClientId: "557582273e4edc1c6f315efe", // Это только для тестов: Получение ключа суб-лицензии : ВНИМАНИЕ: ключ суб-лицензии вы должны генерить у себя на сервере!!!! KeySubLicensing: preload["settings"]["kkmKeySubLicensing"], // КПП организации, нужно только для ЕГАИС //KPP: "782543005", // Строки чека // НДС в процентах или ТЕГ НДС: //0 (НДС 0%), //10 (НДС 10%), //18 (НДС 18%), //-1 (НДС не облагается), //118 (НДС 18/118), //110 (НДС 10/110) CheckStrings: newfiscalarr, // Наличная оплата (2 знака после запятой) Cash: round(dali, 2), // Сумма электронной оплаты (2 знака после запятой) ElectronicPayment: round(thisbasket["info"]["visa"], 2), // Сумма из предоплаты (зачетом аванса) (2 знака после запятой) AdvancePayment: 0, // Сумма постоплатой(в кредит) (2 знака после запятой) Credit: 0, // Сумма оплаты встречным предоставлением (сертификаты, др. мат.ценности) (2 знака после запятой) CashProvision: 0, }; /*Проверка не пустон ли поле оплаты безналом*/ if (Data.ElectronicPayment == "") { Data.ElectronicPayment = 0; } var IsBarCode = false; /*хз зачем это поеэтому вырубаем*/ /*Если чек без ШК то удаляем строку с ШК*/ if (IsBarCode == false) { //Data.Cash = 100; for (var i = 0; i < Data.CheckStrings.length; i++) { if (Data.CheckStrings[i] != undefined && Data.CheckStrings[i].BarCode != undefined) { Data.CheckStrings[i].BarCode = null; }; if (Data.CheckStrings[i] != undefined && Data.CheckStrings[i].PrintImage != undefined) { Data.CheckStrings[i].PrintImage = null; }; }; }; /* Скидываем данные об агенте - т.к.у Вас невярнека ККТ не зарегистрирована как Агент.*/ for (var i = 0; i < Data.CheckStrings.length; i++) { if (Data.CheckStrings[i] != undefined && Data.CheckStrings[i].Register != undefined) { Data.CheckStrings[i].Register.AgentSign = null; Data.CheckStrings[i].Register.AgentData = null; Data.CheckStrings[i].Register.PurveyorData = null; }; }; // Вызов команды if (flag == 1) {} else { console.warn("flag"); var ooo = { status: "done" }; } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.kkm_server_ru_1_05.ExecuteCommand(Data).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, precheck: function(thisbasket) { var newfiscalarr = []; newfiscalarr.push({ PrintText: { Text: ">#2#<Счёт на оплату", Font: 1 } }) try { newfiscalarr.push({ PrintText: { Text: ">#2#<Заказ #" + thisbasket["info"]["id"], Font: 1 } }) } catch (err) {} newfiscalarr.push({ PrintText: { Text: "<<->>" } }) var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); fiscalarr.forEach(function(item, i) { //Собираем нужный массив newfiscalarr.push({ PrintText: { Text: fiscalarr[i]["name"], Font: 3 } }) newfiscalarr.push({ PrintText: { Text: CurrencyFormatted(fiscalarr[i]["kolvo"], 3) + " * " + CurrencyFormatted(fiscalarr[i]["cenaout"]) + "=<#8#>>" + CurrencyFormatted(fiscalarr[i]["cenaout"] * fiscalarr[i]["kolvo"]), Font: 3 } }) }); newfiscalarr.push({ PrintText: { Text: "<<->>" } }) if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { //Со скидкой newfiscalarr.push({ PrintText: { Text: "СКИДКА:<#8#>>" + CurrencyFormatted(thisbasket["info"]["cashdiscount"]), Font: 1 } }) } newfiscalarr.push({ PrintText: { Text: "ИТОГ:<#8#>>" + CurrencyFormatted(thisbasket["info"]["allcena"]), Font: 1 } }) newfiscalarr.push({ PrintText: { Text: "<<->>" } }) try { if (thisbasket.info["type"] == "delivery") { /*Адрес на пречек*/ if (thisbasket.info.client > 0) { newfiscalarr.push({ PrintText: { Text: ">#2#<Информация о доставке", Font: 1 } }) var thisclient = preload["clients"][thisbasket.info.client]; if (thisclient.name != "") { newfiscalarr.push({ PrintText: { Text: lang["FIO"] + " :" + thisclient.name, Font: 1 } }) } if (thisclient.phone != "") { newfiscalarr.push({ PrintText: { Text: lang["telefon"] + " :" + thisclient.phone, Font: 1 } }) } if (thisbasket["info"]["adress"] != "") { newfiscalarr.push({ PrintText: { Text: lang["adres"] + " :" + thisbasket["info"]["adress"], Font: 1 } }) } if (thisbasket["info"]["comment"] != "") { newfiscalarr.push({ PrintText: { Text: "Комментарий: " + thisbasket["info"]["comment"], Font: 1 } }) } newfiscalarr.push({ PrintText: { Text: "<<->>", Font: 1 } }) } } } catch (err) {} newfiscalarr.push({ PrintText: { Text: ">#2#<НЕ ФИСКАЛЬНЫЙ" } }) this.ExecuteCommand({ Command: "RegisterCheck", Printer: thisbasket["printer"], NumDevice: 0, IsFiscalCheck: false, NotPrint: false, IdCommand: app.print.modules.guid(), CheckStrings: newfiscalarr }); }, otmena: function(thisbasket) {}, XReport: function(data) { var jsonData = { // Команда серверу "ZReport" ИЛИ "XReport" Command: "XReport", Printer: data["printer"], // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: 0, // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды // Поле не обязательно IdCommand: app.print.modules.guid() } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.kkm_server_ru_1_05.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, ZReport: function(data) { //Данные команды var jsonData = { // Команда серверу "ZReport" ИЛИ "XReport" Command: "ZReport", CashierName: preload["users"][currentsklad][data["info"]["user"]]["user_name"], CashierVATIN: preload["users"][currentsklad][data["info"]["user"]]["user_vatin"], Printer: data["printer"], // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: 0, // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды // Поле не обязательно IdCommand: app.print.modules.guid() } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.kkm_server_ru_1_05.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, introduction: function(data) { var jsonData = { Command: "DepositingCash", CashierName: preload["users"][currentsklad][data["user"]]["user_name"], CashierVATIN: preload["users"][currentsklad][data["user"]]["user_vatin"], Printer: data["printer"], Amount: round(data["cash"]), NumDevice: 0, IdCommand: app.print.modules.guid() } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.kkm_server_ru_1_05.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, incasation: function(data) { var jsonData = { Command: "PaymentCash", CashierName: preload["users"][currentsklad][data["user"]]["user_name"], CashierVATIN: preload["users"][currentsklad][data["user"]]["user_vatin"], Printer: data["printer"], Amount: round(data["cash"]), NumDevice: 0, IdCommand: app.print.modules.guid() } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.kkm_server_ru_1_05.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, rashod: function(data) { var jsonData = { Command: "PaymentCash", CashierName: preload["users"][currentsklad][data["user"]]["user_name"], CashierVATIN: preload["users"][currentsklad][data["user"]]["user_vatin"], Printer: data["printer"], Amount: round(data["cash"]), Protocol: 1, NumDevice: 0, IdCommand: app.print.modules.guid() } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.kkm_server_ru_1_05.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, ExecuteCommand: function(Data) { var flag = "xhr"; return new Promise(function(resolve, reject) { app.main.loader("show"); console.log("Data", Data) var User = "User"; var Password = ""; var IP = "localhost"; try { if (Data["Printer"]["ip"] != "") { IP = Data["Printer"]["ip"]; } } catch (err) { console.log("Не удалось найти IP") } if (device.android() == true) { flag = "android"; } else { if (window.location.protocol == "https:") { if (IP == "127.0.0.1" || IP == "localhost") { flag = "xhr"; } else { flag = "popup"; } } else { flag = "xhr"; } } switch (flag) { case "android": var req = Android.httpsender("http://" + IP + ":5893/Execute/sync", JSON.stringify(Data)) app.main.loader("hide"); //тут бы нам ответ получить resolve({ status: "done" }); break; case "popup": console.log("Popup", Data.ip + Data.url); OpenWindowWithPostt("http://" + IP + ":5893/Execute/sync", "width=300, height=380, left=100, top=100, location=no, directories=no, toolbar=no, resizable=no, menubar=no, status=no, copyhistory=no, scrollbars=yes", "print", JSON.stringify(Data)); app.main.loader("hide"); resolve({ status: "done" }); break; case "xhr": $.ajax({ type: 'POST', async: true, timeout: 60000, url: "http://" + IP + ":5893/Execute/sync", crossDomain: true, dataType: 'json', contentType: 'application/json; charset=UTF-8', data: JSON.stringify(Data), headers: (User !== "" || Password !== "") ? { "Authorization": "Basic " + btoa(User + ":" + Password) } : "", success: function(json) { app.main.loader("hide"); // Текст ошибки if (json.Error) { reject({ status: "error" }); app.main.error(json.Error); } else { //Ответ от аппарата console.log(json); resolve({ status: "done" }); } }, error: function(err) { reject({ status: "error" }); app.main.loader("hide"); app.main.error("Нет соединения с \"ККМ web-сервер\""); } }); break; } }) }, }, artsoft_box: { opensmena: function(thisbasket) { //Вызов return new Promise(function(resolve, reject) { resolve({status:"done"}); }); //Открытие смены в библиотеке артсофта не требуется }, closecurcheck: function(thisbasket) { var jsonData = { Command: "CloseCurCheck", Protocol: 0, PortName: thisbasket.printer.serialport, PortSpeed: 0, Printer: thisbasket.printer, NumDevice: 0, IdCommand: app.print.modules.guid() } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.artsoft_box.ExecuteCommand(jsonData).then( function(success) { resolve(success); }, function(error) { reject(error); } ) }); }, vozvrat: function(thisbasket) { // Подготовка данных команды var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); console.log("Возврат артсофт", fiscalarr); var newfiscalarr = []; var allrealsum = 0; var nallll = 0; fiscalarr.forEach(function(item, i) { var flag555 = true; if(fiscalarr[i]["tax"] == ""){ flag555 = false; } if(fiscalarr[i]["tax"] == "-1"){ flag555 = false; } if(fiscalarr[i]["tax"] == "0"){ flag555 = false; } if(fiscalarr[i]["tax"] == 0){ flag555 = false; } if(fiscalarr[i]["tax"] == null){ flag555 = false; } //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if(flag555 == true) { var price = round(fiscalarr[i]["cenaout"]); var SumDisc = 0 /*Используется для применения скидки*/ if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { SumDisc = -(fiscalarr[i]["cenaout"] - fiscalarr[i]["cenaout_discount"]) * fiscalarr[i]["kolvo"]; } nallll = nallll + (round(fiscalarr[i]["kolvo"], 2) * price); //Костыльчик который убирает с имени товара приставку веса try{ if(item.quantity == "100g" || item.quantity == "100ml"){ fiscalarr[i]["name"] = preload.products[currentsklad][item.idtovara]["name"]; } }catch(err){ } if(item.uktzed != '' && item.uktzed != null){ var ProductName = item.uktzed+"#"+fiscalarr[i]["name"]; }else{ var ProductName = fiscalarr[i]["name"]; } var amount = fiscalarr[i]["cenaout"] * fiscalarr[i]["kolvo"]; newfiscalarr.push({ Register: { SignMethodCalculation: 4, SignCalculationObject: 1, Name: ProductName, Quantity: round(fiscalarr[i]["kolvo"], 3), Price: price, Amount: amount, Department: 0, PerDisc: 0, SumDisc: 0, Tax: round(fiscalarr[i]["tax"], 0), } }); allrealsum = allrealsum + amount; } }); var jsonData = { Command: "RegisterCheck", Protocol: 1, PortName: thisbasket.printer.serialport, PortSpeed: 0, Printer: thisbasket.printer, NumDevice: 0, Timeout: 30, IdCommand: app.print.modules.guid(), IsFiscalCheck: true, TypeCheck: 1, NotPrint: false, NumberCopies: 0, CashierName: preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], CheckStrings: newfiscalarr, Cash: round(thisbasket["info"]["cash"]), nall: round(nallll,2), ElectronicPayment: round(thisbasket["info"]["visa"]), AdvancePayment: 0, PayType: 0, Credit: 0, CashProvision: 0, PerDisc: 0, SumDisc: 0, CashLessType: 0 } if(thisbasket["info"]["visa"] > allrealsum){ jsonData.ElectronicPayment = allrealsum; } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.artsoft_box.ExecuteCommand(jsonData).then( function(success) { resolve(success); }, function(error) { reject(error); } ) }); }, check: function(thisbasket) { var allitems = true; var ifartprint = false; var kostilsumm = 0; var allRealSum = 0; console.log("artsoft чек", thisbasket) // Подготовка данных команды var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); var newfiscalarr = []; fiscalarr.forEach(function(item, i) { console.warn(fiscalarr[i]) var flag555 = true; if(fiscalarr[i]["tax"] == ""){ flag555 = false; } if(fiscalarr[i]["tax"] == "-1"){ flag555 = false; } if(fiscalarr[i]["tax"] == "0"){ flag555 = false; } if(fiscalarr[i]["tax"] == 0){ flag555 = false; } if(fiscalarr[i]["tax"] == null){ flag555 = false; } /*Заплатка чтобы не было ошибки ккм*/ //if(fiscalarr[i]["tax"] == null){ // fiscalarr[i]["tax"] = "-1"; //} //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if(flag555 == true) { ifartprint = true; ///////////////////////////////// if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { //Если скидка есть var amount = round(item["cenaout_discount"] * item["kolvo"],2); //цена после скидки и округления if(okruglenie != 0){ var price = round(item["cenaold_discount"], 2); //цена до скидки и округления }else{ var price = round(item["cenaout"], 2); //цена до скидки и округления если округления не было } } else { //Если скидки нет if(okruglenie != 0){ var price = round(item["cenaold"], 2); //цена до скидки и округления }else{ var price = round(item["cenaout"], 2); //цена до скидки и округления если округления не было } var amount = round(item["cenaout"] * item["kolvo"],2); //цена без скидки но с округлением } ///////////////////////////////// //var SumDisc = 0; //price = price + (price/100)*3; //Костыльчик который убирает с имени товара приставку веса try{ if(item.type == "mod" ){ if(item.quantity == "100g" || item.quantity == "100ml"){ fiscalarr[i]["name"] = preload.products[currentsklad][item.id]["name"]; } } }catch(err){ } if(item.uktzed != '' && item.uktzed != null){ var ProductName = item.uktzed+"#"+fiscalarr[i]["name"]; }else{ var ProductName = fiscalarr[i]["name"]; } newfiscalarr.push({ Register: { SignMethodCalculation: 4, SignCalculationObject: 1, Name: ProductName, Quantity: round(fiscalarr[i]["kolvo"], 3), Price: price, Amount: amount, Department: 0, PerDisc: 0, SumDisc: 0, Tax: round(fiscalarr[i]["tax"], 0), } }); //alert("price "+price) //alert("amount "+amount) allRealSum = allRealSum + amount; }else{ /*Костыль для отнимания суммы товаров которые не пошли на фискальник*/ if(thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } kostilsumm = kostilsumm + amount; allitems = false; } }); var dali = thisbasket["info"]["cash"]; if(thisbasket["info"]["nall"] > 0) { dali = thisbasket["info"]["nall"] } //Отнимаем от суммы которую дал клиент сумму товара который не пошел на печать на фискальник dali = dali - kostilsumm; if(kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы фискальной кассе"); } //если не все товары пошли на фискальник то заменяем сумму и не считаем сдачу if(allitems == false){ dali = allRealSum; } if(thisbasket["info"]["skidkanasummu"] > 0){ okruglenie += thisbasket["info"]["skidkanasummu"]; } //Обслуживание if(thisbasket["info"]["servicecash"] > 0){ okruglenie = okruglenie + -thisbasket["info"]["servicecash"]; } var Data = { // Команда серверу Command: "RegisterCheck", Protocol: 1, //PortName:"ttyACM0", PortName: thisbasket.printer.serialport, PortSpeed: 0, Printer: thisbasket.printer, //*********************************************************************************************************** // ПОЛЯ ПОИСКА УСТРОЙСТВА //*********************************************************************************************************** // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: 0, // ИНН ККМ для поиска. Если "" то ККМ ищется только по NumDevice, // Если NumDevice = 0 а InnKkm заполнено то ККМ ищется только по InnKkm //InnKkm: "", //--------------------------------------------- // Заводской номер ККМ для поиска. Если "" то ККМ ищется только по NumDevice, //KktNumber: "", // ********************************************************************************************************** // Время (сек) ожидания выполнения команды. //Если За это время команда не выполнилась в статусе вернется результат "NotRun" или "Run" //Проверить результат еще не выполненной команды можно командой "GetRezult" //Если не указано или 0 - то значение по умолчанию 60 сек. // Поле не обязательно. Это поле можно указывать во всех командах Timeout: 30, // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды // Поле не обязательно IdCommand: app.print.modules.guid(), // Это фискальный или не фискальный чек IsFiscalCheck: true, // Тип чека; // 0 – продажа; 10 – покупка; // 1 – возврат продажи; 11 - возврат покупки; // 8 - продажа только по ЕГАИС (обычный чек ККМ не печатается) // 9 - возврат продажи только по ЕГАИС (обычный чек ККМ не печатается) TypeCheck: 0, // Не печатать чек на бумагу NotPrint: false, //true, // Количество копий документа NumberCopies: 0, // Продавец, тег ОФД 1021 CashierName: preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], // ИНН продавца тег ОФД 1203 //CashierVATIN: "", // Телефон или е-Майл покупателя, тег ОФД 1008 // Если чек не печатается (NotPrint = true) то указывать обязательно // Формат: Телефон +{Ц} Email {С}@{C} //ClientAddress: "", //sochi@papa.com // Aдрес электронной почты отправителя чека тег ОФД 1117 (если задан при регистрации можно не указывать) // Формат: Email {С}@{C} //SenderEmail: "", //sochi@mama.com // Система налогообложения (СНО) применяемая для чека // Если не указанно - система СНО настроенная в ККМ по умолчанию // 0: Общая ОСН // 1: Упрощенная УСН (Доход) // 2: Упрощенная УСН (Доход минус Расход) // 3: Единый налог на вмененный доход ЕНВД // 4: Единый сельскохозяйственный налог ЕСН // 5: Патентная система налогообложения // Комбинация разных СНО не возможна // Надо указывать если ККМ настроена на несколько систем СНО //TaxVariant: "", // Дополнительные произвольные реквизиты (не обязательно) пока только 1 строка /* AdditionalProps: [ //{ Print: true, PrintInHeader: false, NameProp: "Номер транзакции", Prop: "234/154" }, { Print: true, PrintInHeader: false, NameProp: "Дата транзакции", Prop: "10.11.2016 10:30" }, ], */ //ClientId: "557582273e4edc1c6f315efe", // Это только для тестов: Получение ключа суб-лицензии : ВНИМАНИЕ: ключ суб-лицензии вы должны генерить у себя на сервере!!!! // КПП организации, нужно только для ЕГАИС //KPP: "782543005", // Строки чека // НДС в процентах или ТЕГ НДС: //0 (НДС 0%), //10 (НДС 10%), //18 (НДС 18%), //-1 (НДС не облагается), //118 (НДС 18/118), //110 (НДС 10/110) CheckStrings: newfiscalarr, PayType: 0, //по-умолчанию 0 наличные 3-карта // Наличная оплата (2 знака после запятой) Cash: round(thisbasket["info"]["cash"]), nall: round(dali), //Math.ceil10(64.485, -2); // Сумма электронной оплаты (2 знака после запятой) ElectronicPayment: round(thisbasket["info"]["visa"]), // Сумма из предоплаты (зачетом аванса) (2 знака после запятой) AdvancePayment: 0, // Сумма постоплатой(в кредит) (2 знака после запятой) Credit: 0, // Сумма оплаты встречным предоставлением (сертификаты, др. мат.ценности) (2 знака после запятой) CashProvision: 0, PerDisc: 0, SumDisc: -okruglenie, CashLessType: 0 }; /*Проверка не пустон ли поле оплаты безналом*/ if(Data.ElectronicPayment == "") { Data.ElectronicPayment = 0; } //Костыльчик который ломал все если не все чеки уходят на рро и оплата по безналу if(Data.ElectronicPayment > allRealSum) { Data.ElectronicPayment = allRealSum; } /*Макс попросил это сделать чтобы ему меньше кода писать, если оплата комбинирования то PayType на сервере не используется*/ if(Data.ElectronicPayment > 0 && Data["nall"] == 0) { Data["PayType"] = 3; //0 наличные 2 карта Data["nall"] = Data.ElectronicPayment; //0 наличные 3 карта Data.ElectronicPayment = 0; } var IsBarCode = false; /*хз зачем это поеэтому вырубаем*/ /*Если чек без ШК то удаляем строку с ШК*/ if(IsBarCode == false) { //Data.Cash = 100; for(var i = 0; i < Data.CheckStrings.length; i++) { if(Data.CheckStrings[i] != undefined && Data.CheckStrings[i].BarCode != undefined) { Data.CheckStrings[i].BarCode = null; }; if(Data.CheckStrings[i] != undefined && Data.CheckStrings[i].PrintImage != undefined) { Data.CheckStrings[i].PrintImage = null; }; }; }; /* Скидываем данные об агенте - т.к.у Вас невярнека ККТ не зарегистрирована как Агент.*/ for(var i = 0; i < Data.CheckStrings.length; i++) { if(Data.CheckStrings[i] != undefined && Data.CheckStrings[i].Register != undefined) { Data.CheckStrings[i].Register.AgentSign = null; Data.CheckStrings[i].Register.AgentData = null; Data.CheckStrings[i].Register.PurveyorData = null; }; }; //Вызов return new Promise(function(resolve, reject) { if(ifartprint == true){ app.print.protocols.artsoft_box.ExecuteCommand(Data).then( function(success) { resolve(success); }, function(error) { reject(error); } ) }else{ resolve({"status":"done"}); } }); }, precheck: function(thisbasket) { var IsBarCode = false; /* var fiscalarr = $.map(thisbasket["products"], function(value, index) {return [value];}); var newfiscalarr = []; fiscalarr.forEach(function(item, i) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if(fiscalarr[i]["Tax"] != "-1"){ newfiscalarr[i] = {}; newfiscalarr[i]["PrintText"] = {}; newfiscalarr[i]["PrintText"]["Text"] = {}; newfiscalarr[i]["PrintText"]["Text"]["Name"] = fiscalarr[i]["name"]; newfiscalarr[i]["PrintText"]["Text"]["Quantity"] = fiscalarr[i]["kolvo"]; newfiscalarr[i]["PrintText"]["Text"]["Price"] = fiscalarr[i]["cenaout"]; newfiscalarr[i]["PrintText"]["Text"]["Amount"] = fiscalarr[i]["cenaout"]*fiscalarr[i]["kolvo"]; newfiscalarr[i]["PrintText"]["Font"] = 1; } }); */ // Подготовка данных команды var Data = { Command: "RegisterCheck", NumDevice: 0, PortName: thisbasket.printer.serialport, PortSpeed: 0, Printer: thisbasket.printer, IsFiscalCheck: false, //IsFiscalCheck: thisbasket["IsFiscalCheck"], NotPrint: false, IdCommand: app.print.modules.guid(), // Строки чека //CheckStrings: newfiscalarr, CheckStrings: [{ PrintText: { Text: ">#2#<Счёт на оплату", Font: 1 } }, { PrintText: { Text: "<<->>" } }, { PrintText: { Text: "Товар 1", Font: 3 } }, { PrintText: { Text: "1.000 * 1,00=<#8#>>1,00", Font: 3 } }, { PrintText: { Text: "Товар 2", Font: 3 } }, { PrintText: { Text: "1.000 * 2,00=<#8#>>2,00", Font: 3 } }, { PrintText: { Text: "Товар 3", Font: 3 } }, { PrintText: { Text: "2.000 * 1,00=<#8#>>2,00", Font: 3 } }, { PrintText: { Text: "<<->>" } }, { PrintText: { Text: "ИТОГ:<#8#>>5,00", Font: 1 } }, { PrintText: { Text: "<<->>" } }, ], }; //Если чек без ШК то удаляес строку с ШК if(IsBarCode == false) { //Data.Cash = 100; for(var i = 0; i < Data.CheckStrings.length; i++) { if(Data.CheckStrings[i] != undefined && Data.CheckStrings[i].BarCode != undefined) { Data.CheckStrings[i].BarCode = null; } } } // Вызов команды //this.ExecuteCommand(Data); }, introduction: function(data) { var jsonData = { // Команда серверу "ZReport" ИЛИ "XReport" Command: "CashMotion", Summ: round(data["cash"]), Protocol: 1, //PortName:"ttyACM0", PortName: data.printer.serialport, PortSpeed: 0, Printer: data.printer, // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: 0, // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды // Поле не обязательно IdCommand: app.print.modules.guid() } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.artsoft_box.ExecuteCommand(jsonData).then( function(success) { resolve(success); }, function(error) { reject(error); } ) }); }, incasation: function(data) { var jsonData = { // Команда серверу "ZReport" ИЛИ "XReport" Command: "CashMotion", Summ: -data["cash"], Protocol: 1, //PortName:"ttyACM0", PortName: data.printer.serialport, PortSpeed: 0, Printer: data.printer, // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: 0, // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды // Поле не обязательно IdCommand: app.print.modules.guid() } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.artsoft_box.ExecuteCommand(jsonData).then( function(success) { resolve(success); }, function(error) { reject(error); } ) }); }, rashod: function(data) { var jsonData = { // Команда серверу "ZReport" ИЛИ "XReport" Command: "CashMotion", Summ: -data["cash"], Protocol: 1, //PortName:"ttyACM0", PortName: data.printer.serialport, PortSpeed: 0, Printer: data.printer, // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: 0, // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды // Поле не обязательно IdCommand: app.print.modules.guid() } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.artsoft_box.ExecuteCommand(jsonData).then( function(success) { resolve(success); }, function(error) { reject(error); } ) }); }, otmena: function(thisbasket) {}, XReport: function(thisbasket) { // Подготовка данных команды var jsonData = { // Команда серверу "ZReport" ИЛИ "XReport" Command: "XReport", Protocol: 1, //PortName:"ttyACM0", PortName: thisbasket.printer.serialport, PortSpeed: 0, Printer: thisbasket.printer, // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: 0, // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды // Поле не обязательно IdCommand: app.print.modules.guid() }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.artsoft_box.ExecuteCommand(jsonData).then( function(success) { resolve(success); }, function(error) { reject(error); } ) }); }, ZReport: function(thisbasket) { // Подготовка данных команды var jsonData = { // Команда серверу "ZReport" ИЛИ "XReport" Command: "ZReport", Protocol: 1, //PortName:"ttyACM0", PortName: thisbasket.printer.serialport, PortSpeed: 0, Printer: thisbasket.printer, // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: 0, // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды // Поле не обязательно IdCommand: app.print.modules.guid() }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.artsoft_box.ExecuteCommand(jsonData).then( function(success) { resolve(success); }, function(error) { reject(error); } ) }); }, ExecuteCommand: function(Data) { console.log("Artsoftprotocol",Data); return new Promise(function(resolve, reject) { switch(Data.Printer.manufacturer) { case "EKSELLIO": Data.Protocol = 0; Data.PortSpeed = 6; break; case "Datecs": Data.Protocol = 1; //Из инструкции Артсофт для криптона if(Data.PayType == 3){ Data.PayType = 2; } break; case "IKC": Data.Protocol = 3; break; case "Maria": Data.Protocol = 2; break; case "MINI": Data.Protocol = 5; Data.PortSpeed = 0; break; case "LeoCAS": Data.Protocol = 7; break; case "ArtsoftEmulator": Data.Protocol = 100; Data.PortSpeed = 6; break; case "MG": Data.Protocol = 3; Data.PortSpeed = 0; Data.PayType = 1; break; } switch(Data.Printer.model){ case "FP280": Data.PortSpeed = 6; break; case "FP6": Data.PortSpeed = 3; break; case "FP3530T": Data.PortSpeed = 2; break; } try{ if( preload.userbase == "380714065960"){ Data.Protocol = 0; Data.PortSpeed = 6; } }catch(err){ } app.main.loader("show"); var IP = Data.Printer.ip; var prName = Data.Printer.name; /*Код макса сервера ломается от этого обьекта поетому стираем*/ Data.Printer = {}; var check = JSON.stringify(Data); if(window.location.protocol == "https:") { if(device.windows() === true) { //console.log("Popup", IP + ":3378"); app.main.loader("hide"); //OpenWindowWithPostt('http://' + IP + ':3378', "width=300, height=380, left=100, top=100, location=no, directories=no, toolbar=no, resizable=no, menubar=no, status=no, copyhistory=no, scrollbars=yes", "print", check); xhr("http://" + IP + ":3378", "jsondata=" + check).then(function(json) { try { var content = JSON.parse(json); } catch(err) { /*Раз json не получилось расспарсить то отдаем пусто*/ var content = {}; } app.main.loader("hide"); try { //{"LastError":{"Code":3,"Text":"Порт занят"},"status":"error"} if(content.status == "error") { switch(Data.Command) { case "CloseCurCheck": //Закрытие текущего чека код ошибки 8 //Лучше не надо говорить что это тут не возможно так как при загрузке терминала выпадает эта ошибка break; default: var errstr = ""; try{ errstr += content.LastError.Text+"
"; }catch(err){ } try{ errstr += content.LastErrorEx.Text+"
"; }catch(err){ } app.main.error(prName + ": " + errstr); reject({"status":"error"}); } } } catch(err) { //Ошибок нет resolve({ status: "done" }); } console.log(content); }, function(error) { console.log(error); app.main.loader("hide"); app.main.error(prName + ": " + "Нет связи с устройством") reject(error); }); } else { try{ app.main.loader("hide"); Android.httpsender('http://' + IP + ':3378', "jsondata=" + check); }catch(err){ app.main.loader("hide"); app.main.error(prName+": Error 1573"); } } resolve({ status: "done" }); //Условно типа все ок, хотя на самом деле мы не знаем } else { console.log("Ajax art", IP); xhr("http://" + IP + ":3378", "jsondata=" + check).then(function(json) { try { var content = JSON.parse(json); } catch(err) { /*Раз json не получилось расспарсить то отдаем пусто*/ var content = {}; } app.main.loader("hide"); try { //{"LastError":{"Code":3,"Text":"Порт занят"},"status":"error"} if(content.status == "error") { switch(Data.Command) { case "CloseCurCheck": //Закрытие текущего чека код ошибки 8 //Лучше не надо говорить что это тут не возможно так как при загрузке терминала выпадает эта ошибка break; default: var errstr = ""; try{ errstr += content.LastError.Text+"
"; }catch(err){ } try{ errstr += content.LastErrorEx.Text+"
"; }catch(err){ } app.main.error(prName + ": " + errstr); reject({"status":"error"}); } }else{ //Ошибок нет resolve({ status: "done" }); } } catch(err) { //Ошибок нет resolve({ status: "done" }); } console.log(content); }, function(error) { console.log(error); app.main.loader("hide"); app.main.error(prName + ": " + "Нет связи с устройством") reject(error); }); } }) }, ExecuteCommand_new: function(Data) { console.log("Artsoftprotocol", Data); return new Promise(function(resolve, reject) { switch (Data.Printer.manufacturer) { case "Datecs": Data.Protocol = 1; break; case "IKC": Data.Protocol = 3; break; case "Maria": Data.Protocol = 2; break; case "MINI": Data.Protocol = 5; Data.PortSpeed = 0; break; case "LeoCAS": Data.Protocol = 7; break; case "ArtsoftEmulator": Data.Protocol = 100; break; } switch (Data.Printer.model) { case "FP3530T": Data.PortSpeed = 19200; break; } app.main.loader("show"); var IP = Data.Printer.ip; var prName = Data.Printer.name; Data.Printer = {}; var check = JSON.stringify(Data); /*Код макса сервера ломается от этого обьекта поетому стираем*/ if (window.location.protocol == "https:") { if (device.windows() === true) { console.log("Popup", IP + ":3378"); app.main.loader("hide"); OpenWindowWithPostt('http://' + IP + ':3378', "width=300, height=380, left=100, top=100, location=no, directories=no, toolbar=no, resizable=no, menubar=no, status=no, copyhistory=no, scrollbars=yes", "print", check); } else { try { try { var jsonData = { "requestMethod": "POST", "Headers": [{ "key": "Content-Type", "value": "application/x-www-form-urlencoded" }], "url": 'http://' + IP + ':3378', "data": "jsondata=" + check } app.print.modules.http2getjson(jsonData).then(function(content){ try { if (content.status == "error") { switch (Data.Command + " " + content.LastError.Code) { case "CloseCurCheck 8": //Закрытие текущего чека код ошибки 8 //Лучше не надо говорить что это тут не возможно так как при загрузке терминала выпадает эта ошибка break; default: var errstr = ""; try{ errstr += content.LastError.Text+"
"; }catch(err){ } try{ errstr += content.LastErrorEx.Text+"
"; }catch(err){ } app.main.error(prName + ": " + errstr); app.main.loader("hide"); reject(content); } } } catch (err1) { app.main.loader("hide"); //Ошибок нет resolve({ status: "done" }); } }).catch(function(){ app.main.error("Error:9254"); }) } catch (err) { //В случае если всёже старое приложение и нет нового метода то юзаем старый app.main.loader("hide"); try { Android.httpsender('http://' + IP + ':3378', "jsondata=" + check); } catch (err) { app.main.error("Error:8193") } } } catch (err) { app.main.loader("hide"); app.main.error(prName + ": Error 1573"); } } resolve({ status: "done" }); //Условно типа все ок, хотя на самом деле мы не знаем } else { console.log("Ajax art", IP); xhr("http://" + IP + ":3378", "jsondata=" + check).then(function(json) { try { var content = JSON.parse(json); } catch (err) { /*Раз json не получилось расспарсить то отдаем пусто*/ var content = {}; } app.main.loader("hide"); try { //{"LastError":{"Code":3,"Text":"Порт занят"},"status":"error"} if (content.status == "error") { switch (Data.Command + " " + content.LastError.Code) { case "CloseCurCheck 8": //Закрытие текущего чека код ошибки 8 //Лучше не надо говорить что это тут не возможно так как при загрузке терминала выпадает эта ошибка break; default: var errstr = ""; try{ errstr += content.LastError.Text+"
"; }catch(err){ } try{ errstr += content.LastErrorEx.Text+"
"; }catch(err){ } app.main.error(prName + ": " + errstr); } }else{ //Ошибок нет resolve({ status: "done" }); } } catch (err) { //Ошибок нет resolve({ status: "done" }); } console.log(content); }, function(error) { console.log(error); app.main.loader("hide"); app.main.error(prName + ": " + "Нет связи с устройством") reject(error); }); } }) }, }, helpmicro: { opensmena: function(thisbasket) { //Вызов return new Promise(function(resolve, reject) { resolve({ status: "done" }); }); //Открытие смены в helpmicro не требуется }, check: function(thisbasket) { var Data = {}; Data["F"] = []; //Подготовка данных команды var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); //Товары var calcsum = 0; fiscalarr.forEach(function(item) { //Костыльчик который убирает с имени товара приставку веса try{ if(item.type == "mod" ){ if(item.quantity == "100g" || item.quantity == "100ml"){ item["name"] = preload.products[currentsklad][item.id]["name"]; } } }catch(err){ } var newitem = {}; if(item.uktzed != '' && item.uktzed != null){ newitem["name"] = item.uktzed+"#"+item["name"]; }else{ newitem["name"] = item["name"]; } if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { if(okruglenie != 0){ newitem["price"] = round(item["cenaold_discount"],2); }else{ newitem["price"] = round(item["cenaout"],2); } } else { if(okruglenie != 0){ newitem["price"] = round(item["cenaold"],2); }else{ newitem["price"] = round(item["cenaout"],2); } } calcsum = calcsum + round(newitem["price"]*item["kolvo"], 2); newitem["qty"] = item["kolvo"]; newitem["code"] = item["id"]; if (item["tax"] > 0) { newitem["tax"] = round(item["tax"], 0); } if (item["tax"] > 0) { Data["F"].push({ "S": newitem }) } }) if(Data["F"].length > 0){ if(thisbasket["info"]["skidkanasummu"] > 0){ okruglenie += thisbasket["info"]["skidkanasummu"]; } //Обслуживание if(thisbasket["info"]["servicecash"] > 0){ okruglenie = okruglenie + -thisbasket["info"]["servicecash"]; } if(okruglenie != 0){ Data["F"].push({ "D": { "sum": -okruglenie } }) } //Cпособ расчета нал безнал if (thisbasket["info"]["visa"] == "") { thisbasket["info"]["visa"] = 0; } var dali = thisbasket["info"]["cash"]; if (thisbasket["info"]["nall"] > 0) { dali = thisbasket["info"]["nall"] } if (thisbasket["info"]["visa"] > 0) { if(thisbasket["info"]["visa"] > calcsum){ thisbasket["info"]["visa"] = calcsum; } Data["F"].push({ "P": { "sum": round(thisbasket["info"]["visa"],2), "no": 4 //1-нал, 4-безнал по таблице pay } }) } if(round(dali,2) > 0){ Data["F"].push({ "P": { "sum": round(dali,2), "no": 1 //1-нал, 4-безнал по таблице pay } }) } } console.log("MG707", Data) var jsonData = { ip: thisbasket.printer.ip, url: "/cgi/chk", user:thisbasket.printer.user, pass:thisbasket.printer.pass, data: Data } //Вызов return new Promise(function(resolve, reject) { if(Data["F"].length > 0){ app.print.protocols.helpmicro.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }else{ resolve(success); } }); }, precheck: function(){ }, vozvrat: function(thisbasket) { console.error("voz",thisbasket); var Data = {}; Data["R"] = []; //Подготовка данных команды var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); //Товары var summV = 0; fiscalarr.forEach(function(item) { var newitem = {}; //Костыльчик который убирает с имени товара приставку веса try{ if(item.quantity == "100g" || item.quantity == "100ml"){ item["name"] = preload.products[currentsklad][item.idtovara]["name"]; } }catch(err){ } if(item.uktzed != '' && item.uktzed != null){ newitem["name"] = item.uktzed+"#"+item["name"]; }else{ newitem["name"] = item["name"]; } if(thisbasket.info.skidka > 0){ newitem["price"] = item["cenaout_discount"]; }else{ newitem["price"] = item["cenaout"]; } newitem["qty"] = item["kolvo"]; newitem["code"] = item["id"]; if (item["tax"] > 0) { newitem["tax"] = round(item["tax"], 0); } if(thisbasket.skidka > 0){ summV = summV + (item["kolvo"] * item["cenaout_dicount"]) }else{ summV = summV + (item["kolvo"] * item["cenaout"]) } Data["R"].push({ "S": newitem }) }) console.error("summV",summV) if(thisbasket["info"]["cash"] > 0){ if(thisbasket["info"]["cash"] > summV){ Data["R"].push({ "P": { "sum": summV, "no": 1 //1-нал, 4-безнал по таблице pay } }) }else{ Data["R"].push({ "P": { "sum": thisbasket["info"]["cash"], "no": 1 //1-нал, 4-безнал по таблице pay } }) } summV = summV - thisbasket["info"]["cash"]; } //Безнал if(thisbasket["info"]["visa"] > 0){ if(thisbasket["info"]["visa"] > summV){ Data["R"].push({ "P": { "sum": round(summV, 2), "no": 4 //1-нал, 4-безнал по таблице pay } }) }else{ Data["R"].push({ "P": { "sum": round(thisbasket["info"]["visa"], 2), "no": 4 //1-нал, 4-безнал по таблице pay } }) } } console.log("MG707", Data) var jsonData = { ip: thisbasket.printer.ip, user:thisbasket.printer.user, pass:thisbasket.printer.pass, url: "/cgi/chk", data: Data } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.helpmicro.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, incasation: function(data) { var jsonData = { ip: data.printer.ip, url: "/cgi/chk", user:data.printer.user, pass:data.printer.pass, data: { "IO": [{ "C": { "cm": "Інкасація" } }, { "IO": { "sum": -round(data["cash"]) } }] } } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.helpmicro.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, rashod: function(data) { var jsonData = { ip: data.printer.ip, user:data.printer.user, pass:data.printer.pass, url: "/cgi/chk", data: { "IO": [{ "C": { "cm": "Витрата" } }, { "IO": { "sum": -round(data["cash"]) } }] } } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.helpmicro.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, introduction: function(data) { var jsonData = { ip: data.printer.ip, url: "/cgi/chk", user:data.printer.user, pass:data.printer.pass, data: { "IO": [{ "C": { "cm": "Внесення коштiв" } }, { "IO": { "sum": round(data["cash"]) } }] } } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.helpmicro.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, examples: function(thisbasket) { var check = { "F": [ // F - Фискальный R - Обратный IO - чек внесения-изъятия денег из сейфа P - нефискальный чек L - копия последнего чека { "C": { "cm": "Кассир: Светлана" } }, //Cm - Строка текстового комментария. { "S": { "code": 1300000000000, "price": 5, "name": "Конфета", "tax": "" } }, // S - Строка продажи (F, R) tax - Налог (при отсутствии первый по-умолчанию) ТАБЛИЦА Pay { "S": { "code": 2, "price": 15.00, "name": "Печенье", "qty": 1.000 } }, // S - Строка продажи (F, R) { "D": { "prc": 5, "all": 1, "dn": 1 } }, // D - Скидка (F, R) prc - скидка/наченка all - если присутствует и ненулевое - скидка производится на промежуточный итог. dn - номер подтверждения льготной скидки. (Согласно требованиям НацБанка к системе передачи данных в ДПА) { "P": { "sum": 100, "no": 1, "rrn": 464684964961, "card": 555555555555555 } }, // P - Строка оплаты (F, R) sum - не обязательно no - нал безнал (не обязательно) rrn - номер транзакции card - банк карта { "P": [{ "C": { "cm": "Line 1" } }, { "C": { "cm": "Line 2", "attr": "w" } }, { "C": { "cm": "Line 3" } }] }, { "P": [{ "N": { "cm": "Line 1" } }, { "N": { "cm": "Line 2" } }, { "N": { "cm": "Line 3" } }] }, { "C": "Коментарий" }, // C - Строка текстового комментария (F,R,IO,P) { "N": { "cm": "Кассир: Светлана" } }, // N - Строка нефискального комментария (F,R,IO,P) { "N": { "code": 24000000, "width": 2, "height": 60, "feed": 20 } }, // code - штрихкод type - EAN-13 (по-умолчанию),CODE-128,CODE-39 { "BC": "Штрих-код" }, // BC - Штрих-код (F,R,IO,P) { "IO": { "sum": 120 } }, // Внесение средств (IO) { "IO": { "sum": -140, "no": 2 } }, //Изьятие средств (IO) no - тип опталы нал безнал ТАБЛИЦА Pay ] }; //{"C":"ФИСКАЛЬНЫЙ ЧЕК"} Ну коментарием писать что чек фискальный это безумство!!! Эта строка в аппарат ВШИТА и печатается даже если ВЫ этого не посылаете. //{"IO":{"sum":-120}} Тут тоже многе ошибаются выносят сумму не полностью. И неправильно разделяют целую и дробную часть числа (если надо вынести 120грн55коп ???) var User = "service"; var Password = "751426"; var ip = $("#ip").val(); $.ajax({ type: "POST", username: User, password: Password, crossDomain: true, /*url: "http://192.168.0.1:80/cgi/state", */ /*url: "http://192.168.0.1:80/cgi/tbl/PLU", */ /*url: "http://192.168.0.1:80/cgi/chk", */ /*url: "http://192.168.0.1:80/cgi/proc/printreport?0", //дневного отчета */ /*url: "http://"+ip+":3378/cgi/proc/printreport?0", //z-report */ /*url: "http://192.168.0.1:80/cgi/proc/printreport?1", //продолжить новый день не отправляя на серверы старую инфо */ /*url: "http://service:751426@95.67.71.90/cgi/proc/printreport?0", */ /*url: "http://service:751426@95.67.71.90/cgi/proc/printreport?10 или 1 XReport?? */ /*url: "http://service:751426@95.67.71.90/cgi/chk Получить сумму в касе (нал)?? /*прийдеться распарсить длинный JSON и вычленить только суммы продаж по налу. Избегая служебных вносов и выносов, возвратов товаров и т.п. На самом деле сумма всех чеков в Вашем ПО должна уже существовать сумма искомая. Вы печатаете Х-отчет и сравниваете в бумажном виде с тем что у ВАС прошло по ПО. Так обычно на стдии тестирования проверяют , потом все про эту операцию забывают и вспоминают только когда пошли НЕДОЧЕТЫ и РАСХОЖДЕНИЯ по кассе.*/ /*url: "http://service:751426@95.67.71.90/cgi/proc/openbox открыть ящик? Есть одно НО - в аппарате надо переключить автоматическое открытие денежного ящика и только тогда эта ф-ция зарботает. А так она выполняется автоматом в тех местах где это необходимо.*/ url: "http://" + ip + ":3378", dataType: 'json', data: "jsondata=" + check, headers: (User != "" || Password != "") ? { "Authorization": "Basic " + btoa(User + ":" + Password) } : "", success: function(json) { console.log(json); }, error: function(error) { console.log(error); } }); function request(url, data) { var protocol = "http"; var ip = "95.67.71.90"; var User = "service"; var Password = "751426"; /* $.ajax({ type: "GET", // username: User, // password: Password, url: "//95.67.71.90"+url, crossDomain: false, dataType: 'json', //contentType: 'application/json; charset=UTF-8', //async: false, headers: (User != "" || Password != "") ? { "Authorization": "Basic " + btoa(User + ":" + Password) } : "", //data: data, success: function (json){ console.log(json); }, error: function (error) { console.log(error); } }); */ // using XMLHttpRequest var xhr = new XMLHttpRequest(); xhr.open("GET", "//95.67.71.90:80" + url, true); xhr.withCredentials = true; xhr.setRequestHeader("Authorization", 'Basic ' + btoa('service:751426')); xhr.onload = function() { console.log(xhr.responseText); }; xhr.send(); } //Продажа Фискальная function Check() { var Url = "/cgi/chk"; var Data = { "F": [{ "C": { "cm": "Кассир: Светлана" } }, { "S": { "code": 1300000000000, "price": 5, "name": "Конфета", "tax": "" } }, { "S": { "code": 2, "price": 15.00, "name": "Печенье", "qty": 1.000 } }, { "C": "ФИСКАЛЬНЫЙ ЧЕК" }] }; request(Url, Data); } //Продажа не фискальная function SlipCheck() { var Url = "/cgi/chk"; var Data = { "P": [{ "C": { "cm": "Кассир: Светлана" } }, { "S": { "code": 1300000000000, "price": 5, "name": "Конфета", "tax": "" } }, { "S": { "code": 2, "price": 15.00, "name": "Печенье", "qty": 1.000 } }, { "C": "Коментарий" }] }; request(Url, Data); } //Инкаcация function PaymentCash() { var Url = "/cgi/chk"; var Data = { "IO": [{ "C": { "cm": "Кассир: Светлана" } }, { "IO": { "sum": -120.00 } }] }; request(Url, Data); } //Внесение денег в кассу function DepositingCash() { var Url = "/cgi/chk"; var Data = { "IO": [{ "C": { "cm": "Кассир: Светлана" } }, { "IO": { "sum": 200.00 } }] }; request(Url, Data); } //открыть ящик (в аппарате надо переключить автоматическое открытие денежного ящика) function OpenCashDrawer() { var Url = "cgi/proc/openbox"; var Data = {}; request(Url, Data); } //Получить сумму в касе (нал?) function RequestCash() { var Url = "/cgi/chk"; var Data = {}; request(Url, Data); } //X - отчет Статус текущего чека function XReport() { var Url = "/cgi/proc/printreport?10"; var Data = {}; request(Url, Data); } //Z - отчет Типа закрыть смену function ZReport() { var Url = "/cgi/proc/printreport?0"; var Data = {}; request(Url, Data); } }, otmena: function(thisbasket) {}, ZReport: function(thisbasket) { var jsonData = { ip: thisbasket.printer.ip, user:thisbasket.printer.user, pass:thisbasket.printer.pass, url: "/cgi/proc/printreport?0", data: "" } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.helpmicro.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, XReport: function(thisbasket) { var jsonData = { ip: thisbasket.printer.ip, user:thisbasket.printer.user, pass:thisbasket.printer.pass, url: "/cgi/proc/printreport?10", data: "" } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.helpmicro.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, ExecuteCommand: function(Data) { var flag = "xhr"; var userLogin = "service"; var userPassword = "751426"; if(Data.user != '' && Data.pass != ''){ userLogin = Data.user; userPassword = Data.pass; } app.main.loader("show"); return new Promise(function(resolve, reject) { if (device.android() == true) { flag = "android"; } else { if (window.location.protocol == "https:") { if (Data.ip == "127.0.0.1" || Data.ip == "localhost") { flag = "xhr"; } else { flag = "popup"; } } else { flag = "xhr"; } } if (window.location.protocol == "http:") { flag = "xhr"; } if(window.cefQuery != null){ flag = "javaWindows" } if(window.webkit){ flag = "ios"; } switch (flag) { case "ios": var jsonData1 = { "requestMethod": "GET", "url": 'http://' + Data.ip + Data.url } try{ window.ioshttpsender = null; window.webkit.messageHandlers.httpSender.postMessage(JSON.stringify(jsonData1)); }catch(err){ app.main.loader("hide"); app.main.error("Helpmicro execute [1] error") //alert("Ошибка вызова метода 1"); } new Promise(function(resolve2, reject2) { var count = 0; var refreshId = setInterval(function() { count++; if(window.ioshttpsender) { clearInterval(refreshId); app.main.loader("hide"); resolve2(window.ioshttpsender); } if(count > 5) { clearInterval(refreshId); app.main.error("Helpmicro timeout [1]") app.main.loader("hide"); reject2(); } }, 1000); }).then( function(response){ try{ var resp1 = response; if(Data.data != ''){ var jsonData2 = { "requestMethod": "POST", "headers": [ { "key": "Content-Length", "value":String(JSON.stringify(Data.data).length) }, { "key": "Authorization", //WWW-Authenticate "value": getDigistHeader("POST",Data.url,resp1,userLogin, userPassword) }, { "key": "Content-type", "value":"text/plain;charset=UTF-8" } ], "url": 'http://' + Data.ip + Data.url, "data": JSON.stringify(Data.data) } }else{ var jsonData2 = { "requestMethod": "GET", "headers": [ { "key": "Authorization", //WWW-Authenticate "value": getDigistHeader("GET", Data.url, resp1, userLogin, userPassword) } ], "url": 'http://' + Data.ip + Data.url, } } try{ window.ioshttpsender = null; window.webkit.messageHandlers.httpSender.postMessage(JSON.stringify(jsonData2)); var count = 0; var refreshId = setInterval(function() { count++; if(window.ioshttpsender) { clearInterval(refreshId); //alert("resolve"); app.main.loader("hide"); try{ var jsonStringResponse = app.main.b64DecodeUnicode(window.ioshttpsender.response); //alert(jsonStringResponse); var jsonDataResponse = JSON.parse(jsonStringResponse); if(jsonDataResponse){ if(jsonDataResponse.err){ if (jsonDataResponse.err.e) { app.main.error("MG: " + hlpmicErr[jsonDataResponse.err.e]); app.main.loader("hide"); reject(jsonDataResponse); } } resolve(jsonDataResponse); } }catch(err){ console.log("Не вдалося отримати відповідь від РРО"); app.main.error("Не вдалося отримати відповідь від РРО"); reject(err); } } if(count > 5) { clearInterval(refreshId); app.main.error("Helpmicro timeout [2]") app.main.loader("hide"); reject(); } }, 1000); }catch(err){ app.main.loader("hide"); app.main.error("Helpmicro execute [2] error") reject(err); //alert("Ошибка вызова метода 2"); } }catch(err){ app.main.loader("hide"); app.main.error("Helpmicro [e2] error") reject(err); //alert(err.message) } }).catch( function(error) { //alert("eee"); app.main.error("Helpmicro [e3] error") app.main.loader("hide"); reject(error); window.ioshttpsender = null; }) break; case "javaWindows": console.log("Data",Data) var url = 'http://' + Data.ip + Data.url; var jsonData1 = { "requestMethod": "GET", "url": url } window.cefQuery({ request: JSON.stringify({ method: "http_sender", data: JSON.stringify(jsonData1) }), persistent: true, onSuccess: function (response) { console.log("Network "+url, response) try{ var resp1 = JSON.parse(response); if(Data.data != ''){ var jsonData2 = { "requestMethod": "POST", "headers": [ { "key": "Content-Length", "value":JSON.stringify(Data.data).length }, { "key": "Authorization", //WWW-Authenticate "value": getDigistHeader("POST",Data.url,resp1,userLogin, userPassword) }, { "key": "Content-type", "value":"text/plain;charset=UTF-8" } ], "url": url, "data": JSON.stringify(Data.data) } }else{ var jsonData2 = { "requestMethod": "GET", "headers": [ { "key": "Authorization", //WWW-Authenticate "value": getDigistHeader("GET", Data.url, resp1, userLogin, userPassword) } ], "url": url } } window.cefQuery({ request: JSON.stringify({ method: "http_sender", data: JSON.stringify(jsonData2) }), persistent: true, onSuccess: function (response) { console.log("Network "+url, response) try{ var content = JSON.parse(response); console.log("content", content); //тут бы нам ответ получить var resp = JSON.parse(content.response); if (resp.errorMessage) { var err = JSON.stringify(resp.errorMessage); app.main.error(err); app.main.loader("hide"); reject(err); } else { try { if (content.err.e) { app.main.error("HelpMicro: " + hlpmicErr[resp.err.e]); app.main.loader("hide"); reject(resp); } } catch (err) { //Ошибок нет app.main.loader("hide"); resolve({ status: "done" }); } } }catch(err){ reject(err); } }, onFailure: function (error_code, error_message) { app.main.error(error_message); app.main.loader("hide"); reject(error_code); } }); }catch(err){ console.error(err); } }, onFailure: function (error_code, error_message) { //console.log("onDesktopUsb", error_message); reject(error_message); } }); break; case "android": var jsonData = { "requestMethod": "POST", "Headers": [{ "key": "Content-Type", "value": "application/x-www-form-urlencoded" }], "url": 'http://' + Data.ip + Data.url, "data": JSON.stringify(Data.data) } setTimeout(function(jsonData) { var dddds111 = JSON.parse(Android.httpsender2(JSON.stringify(jsonData))); //тут бы нам ответ получить if (dddds111.errorMessage) { var err = JSON.stringify(dddds111.errorMessage); app.main.error(err); app.main.loader("hide"); reject(err); } else { try { var content = JSON.parse(dddds111.response); if (content.err.e) { app.main.error("MG: " + hlpmicErr[content.err.e]); app.main.loader("hide"); reject(content); } } catch (err) { app.main.loader("hide"); //Ошибок нет resolve({ status: "done" }); } } }, 50, jsonData) break; case "popup": console.log("Popup", Data.ip + Data.url); OpenWindowWithPostt('http://' + Data.ip + Data.url, "width=300, height=380, left=100, top=100, location=no, directories=no, toolbar=no, resizable=no, menubar=no, status=no, copyhistory=no, scrollbars=yes", "print", JSON.stringify(Data.data)); app.main.loader("hide"); resolve({ status: "done" }); break; case "xhr": console.log("Ajax", Data.ip + Data.url); xhr('http://' + Data.ip + Data.url, JSON.stringify(Data.data)).then(function(json) { try { var content = JSON.parse(json); } catch (err) { /*Раз json не получилось расспарсить то отдаем пусто*/ var content = {}; } app.main.loader("hide"); try { if (content.err.e) { app.main.error("MG: " + hlpmicErr[content.err.e]); reject(content); } } catch (err) { //Ошибок нет resolve(); } }, function(error) { console.log(error); app.main.loader("hide"); //app.main.error("Нет связи с устройством") reject(error); }); break; } }) }, }, helpmicro2: { opensmena: function(thisbasket) { //Вызов return new Promise(function(resolve, reject) { resolve({ status: "done" }); }); //Открытие смены в helpmicro не требуется }, check: function(thisbasket) { var Data = {}; Data["F"] = []; Data["F"].push({ "C": { "cm": "ЧЕК", } }) //Подготовка данных команды var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); //Товары var calcsum = 0; fiscalarr.forEach(function(item) { //Костыльчик который убирает с имени товара приставку веса try{ if(item.type == "mod" ){ if(item.quantity == "100g" || item.quantity == "100ml"){ item["name"] = preload.products[currentsklad][item.id]["name"]; } } }catch(err){ } var newitem = {}; newitem["name"] = item["name"]; try{ if(item.uktzed != '' && item.uktzed != null){ newitem["uktzed"] = item.uktzed; } }catch(err){ } try{ if(item.akciz != '' && item.akciz != null){ newitem["excise"] = [ { "stamp": item.akciz } ]; } }catch(err){ } try{ if(item.barcode){ //newitem["barcode"] = item.barcode; //почему-то нету в обнове прошивки } }catch(err){ } if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { if(okruglenie != 0){ newitem["price"] = round(item["cenaold_discount"],2); }else{ newitem["price"] = round(item["cenaout"],2); } } else { if(okruglenie != 0){ newitem["price"] = round(item["cenaold"],2); }else{ newitem["price"] = round(item["cenaout"],2); } } calcsum = calcsum + round(newitem["price"]*item["kolvo"], 2); newitem["qty"] = item["kolvo"]; newitem["code"] = item["id"]; if (item["tax"] != '') { newitem["tax"] = round(item["tax"], 0); } if (item["tax"] != '') { Data["F"].push({ "S": newitem }) } }) if(Data["F"].length > 0){ if(thisbasket["info"]["skidkanasummu"] > 0){ okruglenie += thisbasket["info"]["skidkanasummu"]; } //Обслуживание if(thisbasket["info"]["servicecash"] > 0){ okruglenie = okruglenie + -thisbasket["info"]["servicecash"]; } if(okruglenie != 0){ Data["F"].push({ "D": { "sum": -okruglenie } }) } //Cпособ расчета нал безнал if (thisbasket["info"]["visa"] == "") { thisbasket["info"]["visa"] = 0; } var dali = thisbasket["info"]["cash"]; if (thisbasket["info"]["nall"] > 0) { dali = thisbasket["info"]["nall"] } if (thisbasket["info"]["visa"] > 0) { if(thisbasket["info"]["visa"] > calcsum){ thisbasket["info"]["visa"] = calcsum; } var bankpaymentobj = { "P": { "sum": round(thisbasket["info"]["visa"],2), "no": 4 //1-нал, 4-безнал по таблице pay } }; try{ if(thisbasket["info"]["bankingData"]["commission"]){ bankpaymentobj["P"]["fee"] = thisbasket["info"]["bankingData"]["commission"]; //Комиссия банка (в случае наличия) } }catch(err){ } try{ if(thisbasket["info"]["bankingData"]["rrn"] && thisbasket["info"]["bankingData"]["rrn"] != '' && thisbasket["info"]["bankingData"]["rrn"] != null && thisbasket["info"]["bankingData"]["rrn"] != undefined){ bankpaymentobj["P"]["rrn"] = thisbasket["info"]["bankingData"]["rrn"]; //RRN (Reference Retrieval Number) платежа } }catch(err){ } try{ if(thisbasket["info"]["bankingData"]["bankName"]){ bankpaymentobj["P"]["bank"] = thisbasket["info"]["bankingData"]["bankName"]; //Название банка } }catch(err){ } try{ if(thisbasket["info"]["bankingData"]["cardNumber"]){ bankpaymentobj["P"]["card"] = thisbasket["info"]["bankingData"]["cardNumber"]; //Номер карты клиента } }catch(err){ } try{ if(thisbasket["info"]["bankingData"]["authorizationCode"]){ bankpaymentobj["P"]["authcode"] = thisbasket["info"]["bankingData"]["authorizationCode"]; //Код авторизации платежа } }catch(err){ } try{ if(thisbasket["info"]["bankingData"]["terminalID"]){ bankpaymentobj["P"]["term"] = thisbasket["info"]["bankingData"]["terminalID"]; //Номер платежного терминала } }catch(err){ } console.warn(bankpaymentobj); Data["F"].push(bankpaymentobj) } if(round(dali,2) > 0){ Data["F"].push({ "P": { "sum": round(dali,2), "no": 1 //1-нал, 4-безнал по таблице pay } }) } } console.log("MG707", Data) var jsonData = { ip: thisbasket.printer.ip, url: "/cgi/chk", user:thisbasket.printer.user, pass:thisbasket.printer.pass, data: Data } //Вызов return new Promise(function(resolve, reject) { if(Data["F"].length > 0){ app.print.protocols.helpmicro2.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }else{ resolve(success); } }); }, precheck: function(){ }, vozvrat: function(thisbasket) { console.error("voz",thisbasket); var Data = {}; Data["R"] = []; //Подготовка данных команды var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); //Товары var summV = 0; fiscalarr.forEach(function(item) { var newitem = {}; //Костыльчик который убирает с имени товара приставку веса try{ if(item.quantity == "100g" || item.quantity == "100ml"){ item["name"] = preload.products[currentsklad][item.idtovara]["name"]; } }catch(err){ } if(item.uktzed != '' && item.uktzed != null){ newitem["name"] = item.uktzed+"#"+item["name"]; }else{ newitem["name"] = item["name"]; } if(thisbasket.info.skidka > 0){ newitem["price"] = item["cenaout_discount"]; }else{ newitem["price"] = item["cenaout"]; } newitem["qty"] = item["kolvo"]; newitem["code"] = item["id"]; if (item["tax"] != '') { newitem["tax"] = round(item["tax"], 0); } if(thisbasket.skidka > 0){ summV = summV + (item["kolvo"] * item["cenaout_dicount"]) }else{ summV = summV + (item["kolvo"] * item["cenaout"]) } Data["R"].push({ "S": newitem }) }) console.error("summV",summV) if(thisbasket["info"]["cash"] > 0){ if(thisbasket["info"]["cash"] > summV){ Data["R"].push({ "P": { "sum": summV, "no": 1 //1-нал, 4-безнал по таблице pay } }) }else{ Data["R"].push({ "P": { "sum": thisbasket["info"]["cash"], "no": 1 //1-нал, 4-безнал по таблице pay } }) } summV = summV - thisbasket["info"]["cash"]; } //Безнал if(thisbasket["info"]["visa"] > 0){ if(thisbasket["info"]["visa"] > summV){ Data["R"].push({ "P": { "sum": round(summV, 2), "no": 4 //1-нал, 4-безнал по таблице pay } }) }else{ Data["R"].push({ "P": { "sum": round(thisbasket["info"]["visa"], 2), "no": 4 //1-нал, 4-безнал по таблице pay } }) } } console.log("MG707", Data) var jsonData = { ip: thisbasket.printer.ip, user:thisbasket.printer.user, pass:thisbasket.printer.pass, url: "/cgi/chk", data: Data } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.helpmicro2.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, incasation: function(data) { var jsonData = { ip: data.printer.ip, url: "/cgi/chk", user:data.printer.user, pass:data.printer.pass, data: { "IO": [{ "C": { "cm": "Інкасація" } }, { "IO": { "sum": -round(data["cash"]) } }] } } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.helpmicro2.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, rashod: function(data) { var jsonData = { ip: data.printer.ip, user:data.printer.user, pass:data.printer.pass, url: "/cgi/chk", data: { "IO": [{ "C": { "cm": "Витрата" } }, { "IO": { "sum": -round(data["cash"]) } }] } } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.helpmicro2.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, introduction: function(data) { var jsonData = { ip: data.printer.ip, url: "/cgi/chk", user:data.printer.user, pass:data.printer.pass, data: { "IO": [{ "C": { "cm": "Внесення коштiв" } }, { "IO": { "sum": round(data["cash"]) } }] } } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.helpmicro2.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, otmena: function(thisbasket) {}, ZReport: function(thisbasket) { var jsonData = { ip: thisbasket.printer.ip, user:thisbasket.printer.user, pass:thisbasket.printer.pass, url: "/cgi/proc/printreport?0", data: "" } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.helpmicro2.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, XReport: function(thisbasket) { var jsonData = { ip: thisbasket.printer.ip, user:thisbasket.printer.user, pass:thisbasket.printer.pass, url: "/cgi/proc/printreport?10", data: "" } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.helpmicro2.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, ExecuteCommand: function(Data) { console.log("ExecuteCommand",Data); var flag = "xhr"; var userLogin = "service"; var userPassword = "751426"; if(Data.user != '' && Data.pass != ''){ userLogin = Data.user; userPassword = Data.pass; } app.main.loader("show"); return new Promise(function(resolve, reject) { if (device.android() == true) { flag = "android"; } if(window.cefQuery != null){ flag = "javaWindows"; } if(window.webkit){ flag = "ios"; } switch (flag) { case "ios": var jsonData1 = { "requestMethod": "GET", "url": 'http://' + Data.ip + Data.url } try{ window.ioshttpsender = null; window.webkit.messageHandlers.httpSender.postMessage(JSON.stringify(jsonData1)); }catch(err){ app.main.loader("hide"); app.main.error("Helpmicro execute [1] error") reject(err) //alert("Ошибка вызова метода 1"); } new Promise(function(resolve2, reject2) { var count = 0; var refreshId = setInterval(function() { count++; if(window.ioshttpsender) { clearInterval(refreshId); app.main.loader("hide"); resolve2(window.ioshttpsender); } if(count > 5) { clearInterval(refreshId); app.main.error("Helpmicro timeout [1]") app.main.loader("hide"); reject2(); } }, 1000); }).then( function(response){ try{ var resp1 = response; if(Data.data != ''){ var jsonData2 = { "requestMethod": "POST", "headers": [ { "key": "Content-Length", "value":String(JSON.stringify(Data.data).length) }, { "key": "Authorization", //WWW-Authenticate "value": getDigistHeader("POST",Data.url,resp1,userLogin, userPassword) }, { "key": "Content-type", "value":"text/plain;charset=UTF-8" } ], "url": 'http://' + Data.ip + Data.url, "data": JSON.stringify(Data.data) } }else{ var jsonData2 = { "requestMethod": "GET", "headers": [ { "key": "Authorization", //WWW-Authenticate "value": getDigistHeader("GET", Data.url, resp1, userLogin, userPassword) } ], "url": 'http://' + Data.ip + Data.url, } } try{ window.ioshttpsender = null; window.webkit.messageHandlers.httpSender.postMessage(JSON.stringify(jsonData2)); var count = 0; var refreshId = setInterval(function() { count++; if(window.ioshttpsender) { clearInterval(refreshId); //alert("resolve"); app.main.loader("hide"); try{ var jsonStringResponse = app.main.b64DecodeUnicode(window.ioshttpsender.response); //alert(jsonStringResponse); var jsonDataResponse = JSON.parse(jsonStringResponse); if(jsonDataResponse){ if(jsonDataResponse.err){ if (jsonDataResponse.err.e) { app.main.error("MG: " + hlpmicErr[jsonDataResponse.err.e]); app.main.loader("hide"); reject(jsonDataResponse); } } resolve(jsonDataResponse); } }catch(err){ console.log("Не вдалося отримати відповідь від РРО"); app.main.error("Не вдалося отримати відповідь від РРО"); reject(err); } } if(count > 5) { clearInterval(refreshId); app.main.error("Helpmicro timeout [2]") app.main.loader("hide"); reject(); } }, 1000); }catch(err){ app.main.loader("hide"); app.main.error("Helpmicro execute [2] error") reject(err); //alert("Ошибка вызова метода 2"); } }catch(err){ app.main.loader("hide"); app.main.error("Helpmicro [e2] error") reject(err); //alert(err.message) } }).catch( function(error) { //alert("eee"); app.main.error("Helpmicro [e3] error") app.main.loader("hide"); reject(error); window.ioshttpsender = null; }) break; case "javaWindows": console.log("Data",Data) var url = 'http://' + Data.ip + Data.url; var jsonData1 = { "requestMethod": "GET", "url": 'http://' + Data.ip } console.log("jsonData1",jsonData1) window.cefQuery({ request: JSON.stringify({ method: "http_sender", data: JSON.stringify(jsonData1) }), persistent: true, onSuccess: function (response) { console.log("Network "+url, response) try{ // alert(response); var resp1 = JSON.parse(response); if(Data.data != ''){ var jsonData2 = { "requestMethod": "POST", "headers": [ { "key": "Content-Length", "value":JSON.stringify(Data.data).length }, { "key": "Authorization", //WWW-Authenticate "value": getDigistHeader("POST",Data.url,resp1,userLogin, userPassword) }, { "key": "Content-type", "value":"text/plain;charset=UTF-8" } ], "url": url, "data": JSON.stringify(Data.data) } }else{ var jsonData2 = { "requestMethod": "GET", "headers": [ { "key": "Authorization", //WWW-Authenticate "value": getDigistHeader("GET", Data.url, resp1, userLogin, userPassword) } ], "url": url } } window.cefQuery({ request: JSON.stringify({ method: "http_sender", data: JSON.stringify(jsonData2) }), persistent: true, onSuccess: function (response) { console.log("Network "+url, response) try{ var content = JSON.parse(response); console.log("content", content); //тут бы нам ответ получить var resp = JSON.parse(content.response); if (resp.errorMessage) { var err = JSON.stringify(resp.errorMessage); app.main.error(err); app.main.loader("hide"); reject(err); } else { try { if (resp.err.e) { app.main.error("HelpMicro2: " + hlpmicErr[resp.err.e]); app.main.loader("hide"); reject(resp); } } catch (err) { //Ошибок нет app.main.loader("hide"); resolve({ status: "done" }); } } }catch(err){ reject(err); } }, onFailure: function (error_code, error_message) { app.main.error(error_message); app.main.loader("hide"); reject(error_code); } }); }catch(err){ console.error(err); } }, onFailure: function (error_code, error_message) { //console.log("onDesktopUsb", error_message); reject(error_message); } }); break; case "android": var jsonDataTest = { requestMethod: "GET", url: 'http://' + Data.ip } try { //Helpmicro2 var resp1 = JSON.parse(Android.httpsender2(JSON.stringify(jsonDataTest))); // alert(JSON.stringify(resp1)); var jsonData = { requestMethod: "POST", headers: [ { key: "Authorization", value: getDigistHeader("POST", Data.url, resp1, userLogin, userPassword) }, { key: "Content-type", value: "application/json"//text/plain;charset=UTF-8 } ], url: 'http://' + Data.ip + Data.url, data: JSON.stringify(Data.data) } } catch (err) { //alert(err) } setTimeout(function(jsonData) { var resp2; try { //Helpmicro2 resp2 = JSON.parse(Android.httpsender2(JSON.stringify(jsonData))); //alert(`Response ${JSON.stringify(resp2)}`) } catch (err) { //alert(err) } //тут бы нам ответ получить if (resp2.response.err) { var err = JSON.stringify(resp2.response.err); app.main.error(err); app.main.loader("hide"); reject(err); } else { try { var content = JSON.parse(resp2.response); if (content.err.e) { //app.main.error("MG: " + hlpmicErr[content.err.e]); //app.main.loader("hide"); reject(content); } } catch (err) { //app.main.loader("hide"); //alert(err) //Ошибок нет resolve({ status: "done" }); } } }, 50, jsonData) break; } }) }, }, minifp_android:{ codeErro: function(code){ var minifpErr = []; minifpErr["1"] = "Нет возможности запустить команду"; minifpErr["2"] = "Невозможно обработать команду"; minifpErr["3"] = "Код команды отсутствует"; minifpErr["4"] = "Много данных в команде"; minifpErr["5"] = "Недостаточно данных в команде"; minifpErr["6"] = "Ошибка при приеме данных"; minifpErr["7"] = "Недопустимый идентификатор команды"; minifpErr["8"] = "Невозможно выполнить команду"; minifpErr["10"] = "ошибка ввода"; minifpErr["11"] = "необходимо снять z1 отчет"; minifpErr["12"] = "скидки/наценки запрещены"; minifpErr["13"] = "переполнение по чеку"; minifpErr["14"] = "команда запрещена"; minifpErr["15"] = "кассир не зарегистрирован"; minifpErr["16"] = "отрицательная сумма"; minifpErr["17"] = "количество товара отрицательное"; minifpErr["18"] = "время смены исчерпано"; minifpErr["19"] = "неверный тип оплаты"; minifpErr["20"] = "неправильная или отсутствующая цена"; minifpErr["21"] = "неверный параметр на входе команды"; minifpErr["22"] = "товар находится в открытом чеке, нельзя редактировать"; minifpErr["23"] = "некорректно запрограммированный товар"; minifpErr["24"] = "неверный или отсутствующий штрихкод товара"; minifpErr["27"] = "неверный или отсутствующий код товара"; minifpErr["28"] = "товар не весовой(штучный)"; minifpErr["29"] = "ФП почти заполнена"; minifpErr["30"] = "ФП заполнена"; minifpErr["31"] = "память инициализаций заполнена"; minifpErr["32"] = "есть отложенная операция, оплата запрещена"; minifpErr["33"] = "карточка клиента не принята"; minifpErr["34"] = "не хватает денег на сдачу"; minifpErr["35"] = "запрещена комбинированная оплата"; minifpErr["36"] = "неправильный номер кассира"; minifpErr["37"] = "места недостаточно"; minifpErr["38"] = "нет места в Журнале"; minifpErr["39"] = "нет места в базе товаров"; minifpErr["40"] = "нет места в Архиве"; minifpErr["41"] = "товар есть комплекс"; minifpErr["42"] = "код не принадлежит комплексу"; minifpErr["43"] = "РРО занят и не может выполнить команду"; minifpErr["44"] = "необходимо выполнить Z1 отчет"; minifpErr["45"] = "неправильный пароль кассира"; minifpErr["46"] = "комплекс нельзя продать"; minifpErr["47"] = "цена товара указана"; minifpErr["48"] = "отмена запрещена"; minifpErr["49"] = "продажа товара запрещена"; minifpErr["50"] = "ошибка чтения ФП"; minifpErr["51"] = "номер производителя неверен"; minifpErr["52"] = "ошибка записи во флеш"; minifpErr["54"] = "товар нельзя удалить"; minifpErr["55"] = "нет данных в ФП"; minifpErr["56"] = "неверный пароль налогового инспектора"; minifpErr["57"] = "неверный пароль администратора"; minifpErr["58"] = "неверный пароль старшего кассира"; minifpErr["60"] = "РРО заблокирован. Истекло время для передачи данных"; minifpErr["61"] = "РРО заблокирован. Персонализация не проведена"; minifpErr["67"] = "ошибка работы с SAM"; minifpErr["68"] = "есть неотправленные документы"; minifpErr["69"] = "документы отсутствуют"; minifpErr["70"] = "вал отсутствует"; minifpErr["71"] = "нет питания 3.3В на плате клавиатуры"; minifpErr["79"] = "дата сервисного обслуживания превышена"; minifpErr["80"] = "ошибка записи в ФП"; minifpErr["81"] = "ошибка часов реального времени, дата последнего Z1 отчета больше текущей"; minifpErr["82"] = "ошибка данных в интерфейсе"; minifpErr["83"] = "ошибка часов реального времени, дата/время последнего документа больше текущей"; minifpErr["86"] = "отсутствует индикатор клиента"; minifpErr["91"] = "напряжение питания превышает допустимое"; minifpErr["92"] = "напряжение питания ниже допустимого"; minifpErr["93"] = "критическое снижение напряжения питания"; minifpErr["95"] = "температура термоголовки ниже допустимой"; minifpErr["96"] = "температура термоголовки превышает допустимую"; minifpErr["97"] = "нет бумаги"; minifpErr["200"] = "выключен коммуникационный блок"; minifpErr["201"] = "нет связи с коммуникационном блоком"; minifpErr["203"] = "карточка не принята"; minifpErr["205"] = "ошибка платежного терминала"; minifpErr["206"] = "ошибка транзакции"; minifpErr["207"] = "невозможность выполнить операцию"; minifpErr["208"] = "отмена операции"; minifpErr["209"] = "операция прервана"; minifpErr["241"] = "носитель нуждается в форматировании"; minifpErr["242"] = "носитель отсутствует"; minifpErr["254"] = "носитель заполнен"; minifpErr["257"] = "ошибка SAM модуля"; minifpErr["258"] = "не правильный ID DEV"; minifpErr["259"] = "не правильный ID SAM"; minifpErr["260"] = "ошибка SAM модуля"; minifpErr["261"] = "ошибка инициализации SAM модуля"; minifpErr["262"] = "ошибка SAM модуля"; minifpErr["263"] = "нет ID_DEV"; minifpErr["264"] = "SAM модуль не персонализирован"; minifpErr["265"] = "ошибка SAM модуля"; minifpErr["266"] = "ошибка SAM модуля"; minifpErr["267"] = "ошибка синхронной сессии"; minifpErr["268"] = "ошибка подписи MAC"; minifpErr["269"] = "неудовлетворительное использование"; minifpErr["270"] = "ошибка обмена данными с SAM"; minifpErr["271"] = "ошибка обмена данными с SAM"; minifpErr["272"] = "ошибка обмена данными с SAM"; minifpErr["273"] = "Ошибка обмена данными с SAM"; minifpErr["274"] = "Ошибка обмена данными с SAM"; minifpErr["275"] = "Ошибка обмена данными"; minifpErr["276"] = "Неверная версия VkMAC"; minifpErr["288"] = "Ошибка персонализации SAM"; minifpErr["545"] = "Ошибка персонализации SAM"; minifpErr["289"] = "Ошибка персонализации РРО"; minifpErr["546"] = "Ошибка персонализации РРО"; minifpErr["290"] = "Ошибка передачи данных"; minifpErr["547"] = "Ошибка передачи данных"; minifpErr["300"] = "Ошибка подключения к серверу"; minifpErr["301"] = "Ошибка подключения к коммуникационному блоку"; minifpErr["302"] = "Ошибка подключения к серверу"; minifpErr["303"] = "Ошибка сети"; minifpErr["304"] = "Ошибка коммуникационного блока"; minifpErr["305"] = "Ошибка передачи данных"; minifpErr["307"] = "Ошибка коммуникационного блока"; minifpErr["308"] = "Ошибка формата URL"; minifpErr["900"] = "Ошибка файловой системы при поиске документов"; minifpErr["901"] = "Ошибка размера файла"; minifpErr["902"] = "Превышение времени ожидания ответа"; minifpErr["903"] = "Ошибка целостности данных на носителе"; minifpErr["1001"] = "Слишком длинное наименование товара"; minifpErr["1002"] = "Нет ответа"; return minifpErr[code]; }, opensmena: function(data) { //Вызов return new Promise(function(resolve, reject) { resolve({ status: "done" }); }); }, opendrawer: function(data) { var jsonData = { "type": "openDrawer", "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_android.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, check: function(thisbasket) { var ifartprint = false; console.log("minifp_android", thisbasket); var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); var newfiscalarr = []; try { newfiscalarr.push({ "type": "text", "text": "Замовлення:" + thisbasket["info"]["id"], "alignment": "center" }) } catch (err) {} //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; var kostilsummRRO = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; //Собираем нужный массив и убираем позиции которые не подлежат налогообложению fiscalarr.forEach(function(item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } if (item["tax"] != "") { ifartprint = true; flag = 1; var newitem = {} //Костыльчик который убирает с имени товара приставку веса try{ if(item.type == "mod" ){ if(item.quantity == "100g" || item.quantity == "100ml"){ item["name"] = preload.products[currentsklad][item.id]["name"]; } } }catch(err){ } if(item.uktzed != '' && item.uktzed != null){ newitem["name"] = item.uktzed+"#"+item["name"]; }else{ newitem["name"] = item["name"]; } newitem["quantity"] = round(item["kolvo"], 3); if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { //Если скидка есть amount = round(item["cenaout_discount"] * item["kolvo"],2); //цена после скидки и округления if(okruglenie != 0){ newitem["price"] = round(item["cenaold_discount"], 2); //цена до скидки и округления }else{ newitem["price"] = round(item["cenaout"], 2); //цена до скидки и округления если округления не было } } else { //Если скидки нет if(okruglenie != 0){ newitem["price"] = round(item["cenaold"], 2); //цена до скидки и округления }else{ newitem["price"] = round(item["cenaout"], 2); //цена до скидки и округления если округления не было } amount = round(item["cenaout"] * item["kolvo"],2); //цена без скидки но с округлением } newitem["amount"] = amount; kostilsummRRO = kostilsummRRO + amount; newitem["code"] = item["id"]; newitem["type"] = "position"; newitem["unit"] = "ves"; newitem["tax"] = round(item["tax"],0); try{ if(thisbasket["info"]["nopaymentstype"] == "debt"){ newitem["paymentMethod"] = "credit"; } }catch(err){ } //fullPrepayment - предоплата 100% //prepayment - предоплата //advance - аванс //fullPayment - полный расчет - по умолчанию //partialPayment - частичный расчет и кредит //credit - передача в кредит //creditPayment - оплата кредита // "infoDiscountAmount": 0.0, //"measurementUnit": "кг", //"paymentMethod": "advance", //"paymentObject": "commodity", //"nomenclatureCode": "MTIzNDEyMzQ1Njc4MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=", newfiscalarr.push(newitem) console.log("iiitem",newitem) } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } kostilsumm = kostilsumm + amount; } }); if (thisbasket["info"]["comment"] != "" && thisbasket["info"]["comment"] != undefined && thisbasket.info["checkcomments"] == 1) { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["Kommentariy_k_z_r2za7"] + ":" + thisbasket["info"]["comment"], }); } var dali = thisbasket["info"]["cash"]; if (thisbasket["info"]["nall"] > 0) { dali = thisbasket["info"]["nall"] } //Отнимаем от суммы которую дал клиент сумму товара который не пошел на печать на фискальник dali = dali - kostilsumm; if (kostilsumm > 0) { app.main.message("Деякі товари на суму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не були передані на фіскальний реєстратор"); } var jsonData = { "type": "sell", "taxationType": thisbasket["printer"]["cno"], "operator": { "id": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_pin"] }, "items": newfiscalarr, "payments": [], /* "discount":{ "type":"sum", //per "discount":-0.21 } */ }; try{ if(thisbasket["printer"]["cno"] == "" || thisbasket["printer"]["cno"] == undefined){ delete jsonData["taxationType"]; } }catch(err){ } /*Сумма электронной оплаты (2 знака после запятой)*/ try { var ElectronicPayment = round(thisbasket["info"]["visa"]); } catch (err) { var ElectronicPayment = 0; } //Костыль для починки minifp бага c большей суммой налички при сдвоенной оплате if(ElectronicPayment < kostilsummRRO){ if(thisbasket["info"]["cash"] > 0){ jsonData.payments.push({ "type": "cash", "sum": dali }) } } //Если сумма оплаты картой больше чем сумма товаров переданных на рро if(ElectronicPayment > kostilsummRRO){ if(kostilsummRRO > 0){ jsonData.payments.push({ "type": "electronically", "sum": kostilsummRRO }) } }else{ if (ElectronicPayment > 0) { jsonData.payments.push({ "type": "electronically", "sum": ElectronicPayment }) } } //Вызов return new Promise(function(resolve, reject) { if(ifartprint == true){ app.print.protocols.minifp_android.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }else{ resolve({"status":"done"}); } }); }, vozvrat: function(thisbasket) { //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; var allrealsum = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; var nallll = 0; var newfiscalarr = []; var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); //Собираем нужный массив и убираем позиции которые не подлежат налогообложению fiscalarr.forEach(function(item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } if (item["tax"] != "") { flag = 1; var newitem = {}; //Костыльчик который убирает с имени товара приставку веса try{ if(item.quantity == "100g" || item.quantity == "100ml"){ item["name"] = preload.products[currentsklad][item.idtovara]["name"]; } }catch(err){ } if(item.uktzed != '' && item.uktzed != null){ newitem["name"] = item.uktzed+"#"+item["name"]; }else{ newitem["name"] = item["name"]; } newitem["quantity"] = round(item["kolvo"], 3); newitem["price"] = round(item["cenaout"], 2); if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } newitem["amount"] = amount; newitem["code"] = item["id"]; newitem["type"] = "position"; newitem["tax"] = round(item["tax"],0); newitem["unit"] = "ves"; // "infoDiscountAmount": 0.0, //"measurementUnit": "кг", //"paymentMethod": "advance", //"paymentObject": "commodity", //"nomenclatureCode": "MTIzNDEyMzQ1Njc4MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=", newfiscalarr.push(newitem); allrealsum = allrealsum + amount; } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } kostilsumm = kostilsumm + amount; } }); if (kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы онлайн кассе"); } // Вызов команды var jsonData = { "type": "sellReturn", "taxationType": thisbasket["printer"]["cno"], "operator": { "id": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_pin"] }, "items": newfiscalarr, "payments": [] }; try{ if(thisbasket["printer"]["cno"] == "" || thisbasket["printer"]["cno"] == undefined){ delete jsonData["taxationType"]; } }catch(err){ } //Наличка if(thisbasket["info"]["cash"] > 0){ jsonData["payments"].push({ "type": "cash", "sum": round(thisbasket["info"]["cash"], 2) }); } //Безнал if(thisbasket["info"]["visa"] > 0){ if(thisbasket["info"]["visa"] > allrealsum){ jsonData["payments"].push({ "type": "electronically", "sum": round(allrealsum, 2) }); }else{ jsonData["payments"].push({ "type": "electronically", "sum": round(thisbasket["info"]["visa"], 2) }); } } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_android.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, precheck: function(thisbasket) { var stringlength = 48; var lineh = ""; for (var i = 0; i < stringlength; i++) { lineh = lineh + "-"; } var newfiscalarr = []; try { newfiscalarr.push({ "type": "text", "text": "Заказ:" + thisbasket["info"]["id"], "alignment": "center" }) } catch (err) {} newfiscalarr.push({ "type": "text", "text": "Счёт на оплату", "alignment": "center" }) try { if (thisbasket.info["type"] == "delivery") { /*Адрес на пречек*/ if (thisbasket.info.client > 0) { var thisclient = preload["clients"][thisbasket.info.client]; if (thisclient.name != "") { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["FIO"] + ":" + thisclient.name }); } if (thisclient.phone != "") { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["telefon"] + ":" + thisclient.phone }); } if (thisbasket["info"]["adress"] != "") { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["adres"] + ":" + thisbasket["info"]["adress"], }); } } } } catch (err) {} newfiscalarr.push({ "type": "text", "text": lineh, "alignment": "center" }) var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); fiscalarr.forEach(function(item, i) { //Собираем нужный массив newfiscalarr.push({ "type": "text", "text": fiscalarr[i]["name"], "alignment": "left" }) newfiscalarr.push({ "type": "text", "text": CurrencyFormatted(fiscalarr[i]["kolvo"], 3) + " * " + CurrencyFormatted(fiscalarr[i]["cenaout"]) + " = " + CurrencyFormatted(fiscalarr[i]["cenaout"] * fiscalarr[i]["kolvo"]), "alignment": "right" }) }); newfiscalarr.push({ "type": "text", "text": lineh, "alignment": "center" }) if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { if(thisbasket.info.cashdiscount > 0){ var dstring = CurrencyFormatted(thisbasket.info.cashdiscount); }else{ var dstring = thisbasket.info.discounttitle; } //Со скидкой newfiscalarr.push({ "type": "text", "text": app.print.modules.escposstr(1, stringlength, "СКИДКА:", dstring), "alignment": "left" }) } newfiscalarr.push({ "type": "text", "text": app.print.modules.escposstr(1, stringlength, "ИТОГ:", CurrencyFormatted(thisbasket["info"]["allcena"])), "alignment": "left" }) newfiscalarr.push({ "type": "text", "text": lineh, "alignment": "center" }) if (thisbasket["info"]["comment"] != "" && thisbasket["info"]["comment"] != undefined && thisbasket.info["checkcomments"] == 1) { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["Kommentariy_k_z_r2za7"] + ":" + thisbasket["info"]["comment"], }); } newfiscalarr.push({ "type": "text", "text": "НЕ ФИСКАЛЬНЫЙ", "alignment": "center" }) var jsonData = { "type": "nonFiscal", "items": newfiscalarr } //Вызов return new Promise(function(resolve, reject) { // app.print.protocols.minifp_android.ExecuteCommand(jsonData).then(function(success) { resolve(success); // }, function(error) { // reject(error); // }) }); }, XReport: function(data) { var jsonData = { "type": "reportX", "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_android.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, X3Report: function(data) { var jsonData = { "type": "reportX3", "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_android.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, ZReport: function(data) { var jsonData = { "type": "closeShift", "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_android.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, introduction: function(data) { var jsonData = { "type": "cashIn", "cashSum": round(data["cash"]), "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_android.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, incasation: function(data) { var jsonData = { "type": "cashOut", "cashSum": round(data["cash"]), "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_android.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, rashod: function(data) { var jsonData = { "type": "cashOut", "cashSum": round(data["cash"]), "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_android.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, getUser: function(name){ if(minifp["usersbase"][name]){ console.log("true"); return minifp["usersbase"][name]["id"]; }else{ console.log("false"); minifp["usersbase"][name] = { id:minifp["usersbase_count"], name:name } minifp["usersbase_count"]++; localStorage["minifp_usersbase"] = JSON.stringify(minifp["usersbase"]) return minifp["usersbase"][name]["id"]; } }, ExecuteCommand: function(Data) { try{ Data.operator.id = this.getUser(Data.operator.name); //alert(Data.operator.id+" "+Data.operator.name); console.log(Data.operator.id); if(Data.operator.id > 31){ app.main.error("minifp: Порядковий номер співробітника більше ніж 31, код пимилки: 8163"); } }catch(err){ app.main.error("Не вдалось отримати номер співробітника, код пимилки: 8164"); } app.main.loader("show"); return new Promise(function(resolve, reject) { try { Android.miniFP(JSON.stringify(Data)); returnMiniFP.status = "empty"; try { /*На тот случай если прошлое ожидание не было завершено*/ clearInterval(waitingMiniFP); } catch (err) { /*Скорей всего уже было завершено*/ } var waitingMiniFP = setInterval(function() { console.log("Опрашиваем minifp") if (returnMiniFP.status == "done") { clearInterval(waitingMiniFP); app.main.loader("hide"); resolve({ status: "done", data: returnMiniFP }); } if (returnMiniFP.status == "error") { clearInterval(waitingMiniFP); app.main.loader("hide"); reject({ status: "error", data: returnMiniFP }); } }, 500); } catch (err) { console.log("Устройство minifp не найдено"); app.main.loader("hide"); reject({ status: "error" }); } }) }, ReturnCommand: function(jsondata) { var response = JSON.parse(jsondata) app.main.loader("hide"); if (response["status"] == "done") { returnMiniFP = response; } else { response["status"] = "error"; returnMiniFP = response; app.main.error("miniFP: "+response["errorCode"]+" - "+this.codeErro(response["errorCode"])); } }, ReturnSettings: function(jsondata) { //var atolsetings = JSON.parse(jsondata); //app.main.message("Сервисная информация"+"

"+"Model "+atolsetings.Model+"
"+"AccessPassword "+atolsetings.AccessPassword+"
"+"AutoDisableBluetooth "+atolsetings.AutoDisableBluetooth+"
"+"AutoEnableBluetooth "+atolsetings.AutoEnableBluetooth+"
"+"BaudRate "+atolsetings.BaudRate+"
"+"Bits "+atolsetings.Bits+"
"+"ComFile "+atolsetings.ComFile+"
"+"IPAddress "+atolsetings.IPAddress+"
"+"IPPort "+atolsetings.IPPort+"
"+"LibraryPath "+atolsetings.LibraryPath+"
"+"MACAddress "+atolsetings.MACAddress+"
"+"OfdChannel "+atolsetings.OfdChannel+"
"+"Parity "+atolsetings.Parity+"
"+"Port "+atolsetings.Port+"
"+"StopBits "+atolsetings.StopBits+"
"+"UsbDevicePath "+atolsetings.UsbDevicePath+"
"+"UserPassword "+atolsetings.UserPassword) app.main.message("Ответ от драйвера получен, для продолжение сохраните настройки"); $("#Atol10SettingsButton").removeClass("btn-danger"); $("#Atol10SettingsButton").addClass("btn-info"); $("#settings_device_list_edit_form_settings").val(JSON.stringify(jsondata)); }, }, minifp_android_v2:{ codeErro: function(code){ var minifpErr = []; minifpErr["1"] = "Нет возможности запустить команду"; minifpErr["2"] = "Невозможно обработать команду"; minifpErr["3"] = "Код команды отсутствует"; minifpErr["4"] = "Много данных в команде"; minifpErr["5"] = "Недостаточно данных в команде"; minifpErr["6"] = "Ошибка при приеме данных"; minifpErr["7"] = "Недопустимый идентификатор команды"; minifpErr["8"] = "Невозможно выполнить команду"; minifpErr["10"] = "ошибка ввода"; minifpErr["11"] = "необходимо снять z1 отчет"; minifpErr["12"] = "скидки/наценки запрещены"; minifpErr["13"] = "переполнение по чеку"; minifpErr["14"] = "команда запрещена"; minifpErr["15"] = "кассир не зарегистрирован"; minifpErr["16"] = "отрицательная сумма"; minifpErr["17"] = "количество товара отрицательное"; minifpErr["18"] = "время смены исчерпано"; minifpErr["19"] = "неверный тип оплаты"; minifpErr["20"] = "неправильная или отсутствующая цена"; minifpErr["21"] = "неверный параметр на входе команды"; minifpErr["22"] = "товар находится в открытом чеке, нельзя редактировать"; minifpErr["23"] = "некорректно запрограммированный товар"; minifpErr["24"] = "неверный или отсутствующий штрихкод товара"; minifpErr["27"] = "неверный или отсутствующий код товара"; minifpErr["28"] = "товар не весовой(штучный)"; minifpErr["29"] = "ФП почти заполнена"; minifpErr["30"] = "ФП заполнена"; minifpErr["31"] = "память инициализаций заполнена"; minifpErr["32"] = "есть отложенная операция, оплата запрещена"; minifpErr["33"] = "карточка клиента не принята"; minifpErr["34"] = "не хватает денег на сдачу"; minifpErr["35"] = "запрещена комбинированная оплата"; minifpErr["36"] = "неправильный номер кассира"; minifpErr["37"] = "места недостаточно"; minifpErr["38"] = "нет места в Журнале"; minifpErr["39"] = "нет места в базе товаров"; minifpErr["40"] = "нет места в Архиве"; minifpErr["41"] = "товар есть комплекс"; minifpErr["42"] = "код не принадлежит комплексу"; minifpErr["43"] = "РРО занят и не может выполнить команду"; minifpErr["44"] = "необходимо выполнить Z1 отчет"; minifpErr["45"] = "неправильный пароль кассира"; minifpErr["46"] = "комплекс нельзя продать"; minifpErr["47"] = "цена товара указана"; minifpErr["48"] = "отмена запрещена"; minifpErr["49"] = "продажа товара запрещена"; minifpErr["50"] = "ошибка чтения ФП"; minifpErr["51"] = "номер производителя неверен"; minifpErr["52"] = "ошибка записи во флеш"; minifpErr["54"] = "товар нельзя удалить"; minifpErr["55"] = "нет данных в ФП"; minifpErr["56"] = "неверный пароль налогового инспектора"; minifpErr["57"] = "неверный пароль администратора"; minifpErr["58"] = "неверный пароль старшего кассира"; minifpErr["60"] = "РРО заблокирован. Истекло время для передачи данных"; minifpErr["61"] = "РРО заблокирован. Персонализация не проведена"; minifpErr["67"] = "ошибка работы с SAM"; minifpErr["68"] = "есть неотправленные документы"; minifpErr["69"] = "документы отсутствуют"; minifpErr["70"] = "вал отсутствует"; minifpErr["71"] = "нет питания 3.3В на плате клавиатуры"; minifpErr["79"] = "дата сервисного обслуживания превышена"; minifpErr["80"] = "ошибка записи в ФП"; minifpErr["81"] = "ошибка часов реального времени, дата последнего Z1 отчета больше текущей"; minifpErr["82"] = "ошибка данных в интерфейсе"; minifpErr["83"] = "ошибка часов реального времени, дата/время последнего документа больше текущей"; minifpErr["86"] = "отсутствует индикатор клиента"; minifpErr["91"] = "напряжение питания превышает допустимое"; minifpErr["92"] = "напряжение питания ниже допустимого"; minifpErr["93"] = "критическое снижение напряжения питания"; minifpErr["95"] = "температура термоголовки ниже допустимой"; minifpErr["96"] = "температура термоголовки превышает допустимую"; minifpErr["97"] = "нет бумаги"; minifpErr["200"] = "выключен коммуникационный блок"; minifpErr["201"] = "нет связи с коммуникационном блоком"; minifpErr["203"] = "карточка не принята"; minifpErr["205"] = "ошибка платежного терминала"; minifpErr["206"] = "ошибка транзакции"; minifpErr["207"] = "невозможность выполнить операцию"; minifpErr["208"] = "отмена операции"; minifpErr["209"] = "операция прервана"; minifpErr["241"] = "носитель нуждается в форматировании"; minifpErr["242"] = "носитель отсутствует"; minifpErr["254"] = "носитель заполнен"; minifpErr["257"] = "ошибка SAM модуля"; minifpErr["258"] = "не правильный ID DEV"; minifpErr["259"] = "не правильный ID SAM"; minifpErr["260"] = "ошибка SAM модуля"; minifpErr["261"] = "ошибка инициализации SAM модуля"; minifpErr["262"] = "ошибка SAM модуля"; minifpErr["263"] = "нет ID_DEV"; minifpErr["264"] = "SAM модуль не персонализирован"; minifpErr["265"] = "ошибка SAM модуля"; minifpErr["266"] = "ошибка SAM модуля"; minifpErr["267"] = "ошибка синхронной сессии"; minifpErr["268"] = "ошибка подписи MAC"; minifpErr["269"] = "неудовлетворительное использование"; minifpErr["270"] = "ошибка обмена данными с SAM"; minifpErr["271"] = "ошибка обмена данными с SAM"; minifpErr["272"] = "ошибка обмена данными с SAM"; minifpErr["273"] = "Ошибка обмена данными с SAM"; minifpErr["274"] = "Ошибка обмена данными с SAM"; minifpErr["275"] = "Ошибка обмена данными"; minifpErr["276"] = "Неверная версия VkMAC"; minifpErr["288"] = "Ошибка персонализации SAM"; minifpErr["545"] = "Ошибка персонализации SAM"; minifpErr["289"] = "Ошибка персонализации РРО"; minifpErr["546"] = "Ошибка персонализации РРО"; minifpErr["290"] = "Ошибка передачи данных"; minifpErr["547"] = "Ошибка передачи данных"; minifpErr["300"] = "Ошибка подключения к серверу"; minifpErr["301"] = "Ошибка подключения к коммуникационному блоку"; minifpErr["302"] = "Ошибка подключения к серверу"; minifpErr["303"] = "Ошибка сети"; minifpErr["304"] = "Ошибка коммуникационного блока"; minifpErr["305"] = "Ошибка передачи данных"; minifpErr["307"] = "Ошибка коммуникационного блока"; minifpErr["308"] = "Ошибка формата URL"; minifpErr["900"] = "Ошибка файловой системы при поиске документов"; minifpErr["901"] = "Ошибка размера файла"; minifpErr["902"] = "Превышение времени ожидания ответа"; minifpErr["903"] = "Ошибка целостности данных на носителе"; minifpErr["1001"] = "Слишком длинное наименование товара"; minifpErr["1002"] = "Нет ответа"; return minifpErr[code]; }, opensmena: function(data) { //Вызов return new Promise(function(resolve, reject) { resolve({ status: "done" }); }); }, opendrawer: function(data) { var jsonData = { "type": "openDrawer", "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_android_v2.ExecuteCommand(jsonData, data.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, check: function(thisbasket) { var ifartprint = false; console.log("minifp_android", thisbasket); var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); var newfiscalarr = []; try { newfiscalarr.push({ "type": "text", "text": "Замовлення:" + thisbasket["info"]["id"], "alignment": "center" }) } catch (err) {} //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; var kostilsummRRO = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; //Собираем нужный массив и убираем позиции которые не подлежат налогообложению fiscalarr.forEach(function(item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } if (item["tax"] != "") { flag = 1; ifartprint = true; var newitem = {}; //Костыльчик который убирает с имени товара приставку веса try{ if(item.type == "mod" ){ if(item.quantity == "100g" || item.quantity == "100ml"){ item["name"] = preload.products[currentsklad][item.id]["name"]; } } }catch(err){ } if(item.uktzed != '' && item.uktzed != null){ newitem["name"] = item["name"]; newitem["uktzed"] = item["uktzed"]; }else{ newitem["name"] = item["name"]; } try{ if(item.akciz != '' && item.akciz != null){ newitem["excise"] = [ { "stamp": item.akciz } ]; } }catch(err){ } newitem["quantity"] = round(item["kolvo"], 3); if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { //Если скидка есть if(okruglenie != 0){ // alert("s1"); // newitem["price"] = round(item["cenaold_discount"], 2); //цена до скидки и округления //amount = round(round(item["cenaout_discount"],2) * item["kolvo"],2); //цена после скидки и округления amount = round(multiplyin(item["cenaout_discount"],item["kolvo"]),2); }else{ // alert("s2"); // newitem["price"] = round(item["cenaout"], 2); //цена до скидки и округления если округления не было //amount = round(round(item["cenaout_discount"],2) * item["kolvo"],2); //цена после скидки и округления amount = round(multiplyin(item["cenaout_discount"],item["kolvo"]),2); } } else { //Если скидки нет if(okruglenie != 0){ // alert("s3"); console.warn("item",item) // newitem["price"] = round(item["cenaold"], 2); //цена до скидки и округления amount = round(multiplyin(item["cenaout"],item["kolvo"]),2); //цена без скидки но с округлением }else{ // alert("s4"); // newitem["price"] = round(item["cenaout"], 2); //цена до скидки и округления если округления не было amount = round(multiplyin(item["cenaout"],item["kolvo"]),2); //цена без скидки но с округлением } } if(okruglenie != 0){ newitem["price"] = round(item["cenaold"],2); }else{ newitem["price"] = round(item["cenaout"],2); } // alert("цена"+newitem["price"]); // alert("сумму"+amount); newitem["amount"] = amount; kostilsummRRO = kostilsummRRO + amount; newitem["code"] = item["id"]; newitem["type"] = "position"; newitem["unit"] = "ves"; newitem["tax"] = round(item["tax"],0); try{ if(thisbasket["info"]["nopaymentstype"] == "debt"){ newitem["paymentMethod"] = "credit"; } }catch(err){ } //fullPrepayment - предоплата 100% //prepayment - предоплата //advance - аванс //fullPayment - полный расчет - по умолчанию //partialPayment - частичный расчет и кредит //credit - передача в кредит //creditPayment - оплата кредита // "infoDiscountAmount": 0.0, //"measurementUnit": "кг", //"paymentMethod": "advance", //"paymentObject": "commodity", //"nomenclatureCode": "MTIzNDEyMzQ1Njc4MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=", newfiscalarr.push(newitem) console.log("iiitem",newitem) } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } kostilsumm = kostilsumm + amount; } }); if (thisbasket["info"]["comment"] != "" && thisbasket["info"]["comment"] != undefined && thisbasket.info["checkcomments"] == 1) { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["Kommentariy_k_z_r2za7"] + ":" + thisbasket["info"]["comment"], }); } var dali = thisbasket["info"]["cash"]; if (thisbasket["info"]["nall"] > 0) { dali = thisbasket["info"]["nall"] } //Отнимаем от суммы которую дал клиент сумму товара который не пошел на печать на фискальник dali = dali - kostilsumm; if (kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы онлайн кассе"); } var jsonData = { "type": "sell", "taxationType": thisbasket["printer"]["cno"], "operator": { "id": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_pin"] }, "items": newfiscalarr, "payments": [], /* "discount":{ "type":"sum", //per "discount":-0.21 } */ }; try{ if(thisbasket["printer"]["cno"] == "" || thisbasket["printer"]["cno"] == undefined){ delete jsonData["taxationType"]; } }catch(err){ } /*Сумма электронной оплаты (2 знака после запятой)*/ try { var ElectronicPayment = round(thisbasket["info"]["visa"]); } catch (err) { var ElectronicPayment = 0; } //Костыль для починки minifp бага c большей суммой налички при сдвоенной оплате if(ElectronicPayment < kostilsummRRO){ if(thisbasket["info"]["cash"] > 0){ jsonData.payments.push({ "type": "cash", "sum": dali }) } } var electronicSum = null; //Если сумма оплаты картой больше чем сумма товаров переданных на рро if(ElectronicPayment > kostilsummRRO){ if(kostilsummRRO > 0){ electronicSum = kostilsummRRO } }else{ if (ElectronicPayment > 0) { electronicSum = ElectronicPayment } } if(electronicSum){ var electronicObj = { "type": "electronically", "sum": electronicSum }; //paymentSystem; //numberTerminal; try{ if(thisbasket["info"]["bankingData"]["rrn"]){ electronicObj["rrn"] = thisbasket["info"]["bankingData"]["rrn"]; //RRN (Reference Retrieval Number) платежа } }catch(err){ } try{ if(thisbasket["info"]["bankingData"]["bankName"]){ electronicObj["bankName"] = thisbasket["info"]["bankingData"]["bankName"]; //Название банка } }catch(err){ } try{ if(thisbasket["info"]["bankingData"]["cardNumber"]){ electronicObj["numberCard"] = thisbasket["info"]["bankingData"]["cardNumber"]; //Номер карты клиента } }catch(err){ } try{ if(thisbasket["info"]["bankingData"]["authorizationCode"]){ electronicObj["authorizationCode"] = thisbasket["info"]["bankingData"]["authorizationCode"]; //Код авторизации платежа } }catch(err){ } try{ if(thisbasket["info"]["bankingData"]["terminalID"]){ electronicObj["numberTerminal"] = thisbasket["info"]["bankingData"]["terminalID"]; //Номер платежного терминала } }catch(err){ } jsonData.payments.push(electronicObj); } console.error(thisbasket); //var deviceObj = thisbasket["printer"] //Вызов return new Promise(function(resolve, reject) { if(ifartprint == true){ console.error("MINI FP", jsonData) app.print.protocols.minifp_android_v2.ExecuteCommand(jsonData, thisbasket.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }else{ resolve({"status":"done"}); } }); }, vozvrat: function(thisbasket) { //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; var allrealsum = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; var nallll = 0; var newfiscalarr = []; var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); //Собираем нужный массив и убираем позиции которые не подлежат налогообложению fiscalarr.forEach(function(item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } if (item["tax"] != "") { flag = 1; var newitem = {}; //Костыльчик который убирает с имени товара приставку веса try{ if(item.quantity == "100g" || item.quantity == "100ml"){ item["name"] = preload.products[currentsklad][item.idtovara]["name"]; } }catch(err){ } if(item.uktzed != '' && item.uktzed != null){ newitem["name"] = item["name"]; }else{ newitem["name"] = item["name"]; } newitem["quantity"] = round(item["kolvo"], 3); newitem["price"] = round(item["cenaout"], 2); if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } newitem["amount"] = amount; newitem["code"] = item["id"]; newitem["type"] = "position"; newitem["tax"] = round(item["tax"],0); newitem["unit"] = "ves"; // "infoDiscountAmount": 0.0, //"measurementUnit": "кг", //"paymentMethod": "advance", //"paymentObject": "commodity", //"nomenclatureCode": "MTIzNDEyMzQ1Njc4MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=", newfiscalarr.push(newitem); allrealsum = allrealsum + amount; } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } kostilsumm = kostilsumm + amount; } }); if (kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы онлайн кассе"); } // Вызов команды var jsonData = { "type": "sellReturn", "taxationType": thisbasket["printer"]["cno"], "operator": { "id": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_pin"] }, "items": newfiscalarr, "payments": [] }; try{ if(thisbasket["printer"]["cno"] == "" || thisbasket["printer"]["cno"] == undefined){ delete jsonData["taxationType"]; } }catch(err){ } //Наличка if(thisbasket["info"]["cash"] > 0){ jsonData["payments"].push({ "type": "cash", "sum": round(thisbasket["info"]["cash"], 2) }); } //Безнал if(thisbasket["info"]["visa"] > 0){ if(thisbasket["info"]["visa"] > allrealsum){ jsonData["payments"].push({ "type": "electronically", "sum": round(allrealsum, 2) }); }else{ jsonData["payments"].push({ "type": "electronically", "sum": round(thisbasket["info"]["visa"], 2) }); } } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_android_v2.ExecuteCommand(jsonData, thisbasket.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, precheck: function(thisbasket) { var stringlength = 48; var lineh = ""; for (var i = 0; i < stringlength; i++) { lineh = lineh + "-"; } var newfiscalarr = []; try { newfiscalarr.push({ "type": "text", "text": "Заказ:" + thisbasket["info"]["id"], "alignment": "center" }) } catch (err) {} newfiscalarr.push({ "type": "text", "text": "Счёт на оплату", "alignment": "center" }) try { if (thisbasket.info["type"] == "delivery") { /*Адрес на пречек*/ if (thisbasket.info.client > 0) { var thisclient = preload["clients"][thisbasket.info.client]; if (thisclient.name != "") { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["FIO"] + ":" + thisclient.name }); } if (thisclient.phone != "") { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["telefon"] + ":" + thisclient.phone }); } if (thisbasket["info"]["adress"] != "") { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["adres"] + ":" + thisbasket["info"]["adress"], }); } } } } catch (err) {} newfiscalarr.push({ "type": "text", "text": lineh, "alignment": "center" }) var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); fiscalarr.forEach(function(item, i) { //Собираем нужный массив newfiscalarr.push({ "type": "text", "text": fiscalarr[i]["name"], "alignment": "left" }) newfiscalarr.push({ "type": "text", "text": CurrencyFormatted(fiscalarr[i]["kolvo"], 3) + " * " + CurrencyFormatted(fiscalarr[i]["cenaout"]) + " = " + CurrencyFormatted(fiscalarr[i]["cenaout"] * fiscalarr[i]["kolvo"]), "alignment": "right" }) }); newfiscalarr.push({ "type": "text", "text": lineh, "alignment": "center" }) if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { if(thisbasket.info.cashdiscount > 0){ var dstring = CurrencyFormatted(thisbasket.info.cashdiscount); }else{ var dstring = thisbasket.info.discounttitle; } //Со скидкой newfiscalarr.push({ "type": "text", "text": app.print.modules.escposstr(1, stringlength, "СКИДКА:", dstring), "alignment": "left" }) } newfiscalarr.push({ "type": "text", "text": app.print.modules.escposstr(1, stringlength, "ИТОГ:", CurrencyFormatted(thisbasket["info"]["allcena"])), "alignment": "left" }) newfiscalarr.push({ "type": "text", "text": lineh, "alignment": "center" }) if (thisbasket["info"]["comment"] != "" && thisbasket["info"]["comment"] != undefined && thisbasket.info["checkcomments"] == 1) { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["Kommentariy_k_z_r2za7"] + ":" + thisbasket["info"]["comment"], }); } newfiscalarr.push({ "type": "text", "text": "НЕ ФИСКАЛЬНЫЙ", "alignment": "center" }) var jsonData = { "type": "nonFiscal", "items": newfiscalarr } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_android_v2.ExecuteCommand(jsonData, thisbasket.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, XReport: function(data) { var jsonData = { "type": "reportX", "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_android_v2.ExecuteCommand(jsonData, data.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, X3Report: function(data) { var jsonData = { "type": "reportX3", "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_android_v2.ExecuteCommand(jsonData, data.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, ZReport: function(data) { var jsonData = { "type": "closeShift", "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_android_v2.ExecuteCommand(jsonData, data.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, introduction: function(data) { var jsonData = { "type": "cashIn", "cashSum": round(data["cash"]), "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_android_v2.ExecuteCommand(jsonData, data.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, incasation: function(data) { var jsonData = { "type": "cashOut", "cashSum": round(data["cash"]), "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_android_v2.ExecuteCommand(jsonData, data.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, rashod: function(data) { var jsonData = { "type": "cashOut", "cashSum": round(data["cash"]), "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_android_v2.ExecuteCommand(jsonData, data.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, getUser: function(name){ if(minifp["usersbase"][name]){ console.log("true"); return minifp["usersbase"][name]["id"]; }else{ console.log("false"); minifp["usersbase"][name] = { id:minifp["usersbase_count"], name:name } minifp["usersbase_count"]++; localStorage["minifp_usersbase"] = JSON.stringify(minifp["usersbase"]) return minifp["usersbase"][name]["id"]; } }, ExecuteCommand: function(Data, printer) { try{ Data.operator.id = this.getUser(Data.operator.name); //alert(Data.operator.id+" "+Data.operator.name); console.log(Data.operator.id); if(Data.operator.id > 31){ app.main.error("minifp: Порядковий номер співробітника більше ніж 31, код пимилки: 8163"); } }catch(err){ app.main.error("Не вдалось отримати номер співробітника, код пимилки: 8164"); } app.main.loader("show"); console.log("ExecuteCommand w8", Data); //alert(JSON.stringify(Data)); console.log("ExecuteCommand w8", JSON.stringify(Data)); return new Promise(function(resolve, reject) { try { Android.fiscalOperation(JSON.stringify({ deviceId:printer["id"], protocol:printer["protocol"], jsonObjectData:Data })); returnMiniFP.status = "empty"; try { /*На тот случай если прошлое ожидание не было завершено*/ clearInterval(waitingMiniFP); } catch (err) { /*Скорей всего уже было завершено*/ } var waitingMiniFP = setInterval(function() { console.log("Опрашиваем minifp") if (returnMiniFP.status == "done") { clearInterval(waitingMiniFP); app.main.loader("hide"); resolve({ status: "done", data: returnMiniFP }); } if (returnMiniFP.status == "error") { clearInterval(waitingMiniFP); app.main.loader("hide"); reject({ status: "error", data: returnMiniFP }); } }, 500); } catch (err) { console.log("Устройство minifp не найдено"); app.main.loader("hide"); reject({ status: "error" }); } }) }, ReturnCommand: function(jsondata) { var response = JSON.parse(jsondata) app.main.loader("hide"); if (response["status"] == "done") { returnMiniFP = response; } else { response["status"] = "error"; returnMiniFP = response; app.main.error("miniFP: "+response["errorCode"]+" - "+this.codeErro(response["errorCode"])); } }, ReturnSettings: function(jsondata) { //var atolsetings = JSON.parse(jsondata); //app.main.message("Сервисная информация"+"

"+"Model "+atolsetings.Model+"
"+"AccessPassword "+atolsetings.AccessPassword+"
"+"AutoDisableBluetooth "+atolsetings.AutoDisableBluetooth+"
"+"AutoEnableBluetooth "+atolsetings.AutoEnableBluetooth+"
"+"BaudRate "+atolsetings.BaudRate+"
"+"Bits "+atolsetings.Bits+"
"+"ComFile "+atolsetings.ComFile+"
"+"IPAddress "+atolsetings.IPAddress+"
"+"IPPort "+atolsetings.IPPort+"
"+"LibraryPath "+atolsetings.LibraryPath+"
"+"MACAddress "+atolsetings.MACAddress+"
"+"OfdChannel "+atolsetings.OfdChannel+"
"+"Parity "+atolsetings.Parity+"
"+"Port "+atolsetings.Port+"
"+"StopBits "+atolsetings.StopBits+"
"+"UsbDevicePath "+atolsetings.UsbDevicePath+"
"+"UserPassword "+atolsetings.UserPassword) app.main.message("Ответ от драйвера получен, для продолжение сохраните настройки"); $("#Atol10SettingsButton").removeClass("btn-danger"); $("#Atol10SettingsButton").addClass("btn-info"); $("#settings_device_list_edit_form_settings").val(JSON.stringify(jsondata)); }, }, minifp_usb_android_v2:{ codeErro: function(code){ var minifpErr = []; minifpErr["1"] = "Нет возможности запустить команду"; minifpErr["2"] = "Невозможно обработать команду"; minifpErr["3"] = "Код команды отсутствует"; minifpErr["4"] = "Много данных в команде"; minifpErr["5"] = "Недостаточно данных в команде"; minifpErr["6"] = "Ошибка при приеме данных"; minifpErr["7"] = "Недопустимый идентификатор команды"; minifpErr["8"] = "Невозможно выполнить команду"; minifpErr["10"] = "ошибка ввода"; minifpErr["11"] = "необходимо снять z1 отчет"; minifpErr["12"] = "скидки/наценки запрещены"; minifpErr["13"] = "переполнение по чеку"; minifpErr["14"] = "команда запрещена"; minifpErr["15"] = "кассир не зарегистрирован"; minifpErr["16"] = "отрицательная сумма"; minifpErr["17"] = "количество товара отрицательное"; minifpErr["18"] = "время смены исчерпано"; minifpErr["19"] = "неверный тип оплаты"; minifpErr["20"] = "неправильная или отсутствующая цена"; minifpErr["21"] = "неверный параметр на входе команды"; minifpErr["22"] = "товар находится в открытом чеке, нельзя редактировать"; minifpErr["23"] = "некорректно запрограммированный товар"; minifpErr["24"] = "неверный или отсутствующий штрихкод товара"; minifpErr["27"] = "неверный или отсутствующий код товара"; minifpErr["28"] = "товар не весовой(штучный)"; minifpErr["29"] = "ФП почти заполнена"; minifpErr["30"] = "ФП заполнена"; minifpErr["31"] = "память инициализаций заполнена"; minifpErr["32"] = "есть отложенная операция, оплата запрещена"; minifpErr["33"] = "карточка клиента не принята"; minifpErr["34"] = "не хватает денег на сдачу"; minifpErr["35"] = "запрещена комбинированная оплата"; minifpErr["36"] = "неправильный номер кассира"; minifpErr["37"] = "места недостаточно"; minifpErr["38"] = "нет места в Журнале"; minifpErr["39"] = "нет места в базе товаров"; minifpErr["40"] = "нет места в Архиве"; minifpErr["41"] = "товар есть комплекс"; minifpErr["42"] = "код не принадлежит комплексу"; minifpErr["43"] = "РРО занят и не может выполнить команду"; minifpErr["44"] = "необходимо выполнить Z1 отчет"; minifpErr["45"] = "неправильный пароль кассира"; minifpErr["46"] = "комплекс нельзя продать"; minifpErr["47"] = "цена товара указана"; minifpErr["48"] = "отмена запрещена"; minifpErr["49"] = "продажа товара запрещена"; minifpErr["50"] = "ошибка чтения ФП"; minifpErr["51"] = "номер производителя неверен"; minifpErr["52"] = "ошибка записи во флеш"; minifpErr["54"] = "товар нельзя удалить"; minifpErr["55"] = "нет данных в ФП"; minifpErr["56"] = "неверный пароль налогового инспектора"; minifpErr["57"] = "неверный пароль администратора"; minifpErr["58"] = "неверный пароль старшего кассира"; minifpErr["60"] = "РРО заблокирован. Истекло время для передачи данных"; minifpErr["61"] = "РРО заблокирован. Персонализация не проведена"; minifpErr["67"] = "ошибка работы с SAM"; minifpErr["68"] = "есть неотправленные документы"; minifpErr["69"] = "документы отсутствуют"; minifpErr["70"] = "вал отсутствует"; minifpErr["71"] = "нет питания 3.3В на плате клавиатуры"; minifpErr["79"] = "дата сервисного обслуживания превышена"; minifpErr["80"] = "ошибка записи в ФП"; minifpErr["81"] = "ошибка часов реального времени, дата последнего Z1 отчета больше текущей"; minifpErr["82"] = "ошибка данных в интерфейсе"; minifpErr["83"] = "ошибка часов реального времени, дата/время последнего документа больше текущей"; minifpErr["86"] = "отсутствует индикатор клиента"; minifpErr["91"] = "напряжение питания превышает допустимое"; minifpErr["92"] = "напряжение питания ниже допустимого"; minifpErr["93"] = "критическое снижение напряжения питания"; minifpErr["95"] = "температура термоголовки ниже допустимой"; minifpErr["96"] = "температура термоголовки превышает допустимую"; minifpErr["97"] = "нет бумаги"; minifpErr["200"] = "выключен коммуникационный блок"; minifpErr["201"] = "нет связи с коммуникационном блоком"; minifpErr["203"] = "карточка не принята"; minifpErr["205"] = "ошибка платежного терминала"; minifpErr["206"] = "ошибка транзакции"; minifpErr["207"] = "невозможность выполнить операцию"; minifpErr["208"] = "отмена операции"; minifpErr["209"] = "операция прервана"; minifpErr["241"] = "носитель нуждается в форматировании"; minifpErr["242"] = "носитель отсутствует"; minifpErr["254"] = "носитель заполнен"; minifpErr["257"] = "ошибка SAM модуля"; minifpErr["258"] = "не правильный ID DEV"; minifpErr["259"] = "не правильный ID SAM"; minifpErr["260"] = "ошибка SAM модуля"; minifpErr["261"] = "ошибка инициализации SAM модуля"; minifpErr["262"] = "ошибка SAM модуля"; minifpErr["263"] = "нет ID_DEV"; minifpErr["264"] = "SAM модуль не персонализирован"; minifpErr["265"] = "ошибка SAM модуля"; minifpErr["266"] = "ошибка SAM модуля"; minifpErr["267"] = "ошибка синхронной сессии"; minifpErr["268"] = "ошибка подписи MAC"; minifpErr["269"] = "неудовлетворительное использование"; minifpErr["270"] = "ошибка обмена данными с SAM"; minifpErr["271"] = "ошибка обмена данными с SAM"; minifpErr["272"] = "ошибка обмена данными с SAM"; minifpErr["273"] = "Ошибка обмена данными с SAM"; minifpErr["274"] = "Ошибка обмена данными с SAM"; minifpErr["275"] = "Ошибка обмена данными"; minifpErr["276"] = "Неверная версия VkMAC"; minifpErr["288"] = "Ошибка персонализации SAM"; minifpErr["545"] = "Ошибка персонализации SAM"; minifpErr["289"] = "Ошибка персонализации РРО"; minifpErr["546"] = "Ошибка персонализации РРО"; minifpErr["290"] = "Ошибка передачи данных"; minifpErr["547"] = "Ошибка передачи данных"; minifpErr["300"] = "Ошибка подключения к серверу"; minifpErr["301"] = "Ошибка подключения к коммуникационному блоку"; minifpErr["302"] = "Ошибка подключения к серверу"; minifpErr["303"] = "Ошибка сети"; minifpErr["304"] = "Ошибка коммуникационного блока"; minifpErr["305"] = "Ошибка передачи данных"; minifpErr["307"] = "Ошибка коммуникационного блока"; minifpErr["308"] = "Ошибка формата URL"; minifpErr["900"] = "Ошибка файловой системы при поиске документов"; minifpErr["901"] = "Ошибка размера файла"; minifpErr["902"] = "Превышение времени ожидания ответа"; minifpErr["903"] = "Ошибка целостности данных на носителе"; minifpErr["1001"] = "Слишком длинное наименование товара"; minifpErr["1002"] = "Нет ответа"; return minifpErr[code]; }, opensmena: function(data) { //Вызов return new Promise(function(resolve, reject) { resolve({ status: "done" }); }); }, opendrawer: function(data) { var jsonData = { "type": "openDrawer", "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_android_v2.ExecuteCommand(jsonData, data.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, check: function(thisbasket) { var ifartprint = false; console.log("minifp_android", thisbasket); var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); var newfiscalarr = []; try { newfiscalarr.push({ "type": "text", "text": "Замовлення:" + thisbasket["info"]["id"], "alignment": "center" }) } catch (err) {} //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; var kostilsummRRO = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; //Собираем нужный массив и убираем позиции которые не подлежат налогообложению fiscalarr.forEach(function(item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } if (item["tax"] != "") { flag = 1; ifartprint = true; var newitem = {}; //Костыльчик который убирает с имени товара приставку веса try{ if(item.type == "mod" ){ if(item.quantity == "100g" || item.quantity == "100ml"){ item["name"] = preload.products[currentsklad][item.id]["name"]; } } }catch(err){ } if(item.uktzed != '' && item.uktzed != null){ newitem["name"] = item["name"]; newitem["uktzed"] = item["uktzed"]; }else{ newitem["name"] = item["name"]; } try{ if(item.akciz != '' && item.akciz != null){ newitem["excise"] = [ { "stamp": item.akciz } ]; } }catch(err){ } newitem["quantity"] = round(item["kolvo"], 3); if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { //Если скидка есть if(okruglenie != 0){ // alert("s1"); // newitem["price"] = round(item["cenaold_discount"], 2); //цена до скидки и округления //amount = round(round(item["cenaout_discount"],2) * item["kolvo"],2); //цена после скидки и округления amount = round(multiplyin(item["cenaout_discount"],item["kolvo"]),2); }else{ // alert("s2"); // newitem["price"] = round(item["cenaout"], 2); //цена до скидки и округления если округления не было //amount = round(round(item["cenaout_discount"],2) * item["kolvo"],2); //цена после скидки и округления amount = round(multiplyin(item["cenaout_discount"],item["kolvo"]),2); } } else { //Если скидки нет if(okruglenie != 0){ // alert("s3"); console.warn("item",item) // newitem["price"] = round(item["cenaold"], 2); //цена до скидки и округления amount = round(multiplyin(item["cenaout"],item["kolvo"]),2); //цена без скидки но с округлением }else{ // alert("s4"); // newitem["price"] = round(item["cenaout"], 2); //цена до скидки и округления если округления не было amount = round(multiplyin(item["cenaout"],item["kolvo"]),2); //цена без скидки но с округлением } } if(okruglenie != 0){ newitem["price"] = round(item["cenaold"],2); }else{ newitem["price"] = round(item["cenaout"],2); } // alert("цена"+newitem["price"]); // alert("сумму"+amount); newitem["amount"] = amount; kostilsummRRO = kostilsummRRO + amount; newitem["code"] = item["id"]; newitem["type"] = "position"; newitem["unit"] = "ves"; newitem["tax"] = round(item["tax"],0); try{ if(thisbasket["info"]["nopaymentstype"] == "debt"){ newitem["paymentMethod"] = "credit"; } }catch(err){ } //fullPrepayment - предоплата 100% //prepayment - предоплата //advance - аванс //fullPayment - полный расчет - по умолчанию //partialPayment - частичный расчет и кредит //credit - передача в кредит //creditPayment - оплата кредита // "infoDiscountAmount": 0.0, //"measurementUnit": "кг", //"paymentMethod": "advance", //"paymentObject": "commodity", //"nomenclatureCode": "MTIzNDEyMzQ1Njc4MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=", newfiscalarr.push(newitem) console.log("iiitem",newitem) } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } kostilsumm = kostilsumm + amount; } }); if (thisbasket["info"]["comment"] != "" && thisbasket["info"]["comment"] != undefined && thisbasket.info["checkcomments"] == 1) { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["Kommentariy_k_z_r2za7"] + ":" + thisbasket["info"]["comment"], }); } var dali = thisbasket["info"]["cash"]; if (thisbasket["info"]["nall"] > 0) { dali = thisbasket["info"]["nall"] } //Отнимаем от суммы которую дал клиент сумму товара который не пошел на печать на фискальник dali = dali - kostilsumm; if (kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы онлайн кассе"); } var jsonData = { "type": "sell", "taxationType": thisbasket["printer"]["cno"], "operator": { "id": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_pin"] }, "items": newfiscalarr, "payments": [], /* "discount":{ "type":"sum", //per "discount":-0.21 } */ }; try{ if(thisbasket["printer"]["cno"] == "" || thisbasket["printer"]["cno"] == undefined){ delete jsonData["taxationType"]; } }catch(err){ } /*Сумма электронной оплаты (2 знака после запятой)*/ try { var ElectronicPayment = round(thisbasket["info"]["visa"]); } catch (err) { var ElectronicPayment = 0; } //Костыль для починки minifp бага c большей суммой налички при сдвоенной оплате if(ElectronicPayment < kostilsummRRO){ if(thisbasket["info"]["cash"] > 0){ jsonData.payments.push({ "type": "cash", "sum": dali }) } } var electronicSum = null; //Если сумма оплаты картой больше чем сумма товаров переданных на рро if(ElectronicPayment > kostilsummRRO){ if(kostilsummRRO > 0){ electronicSum = kostilsummRRO } }else{ if (ElectronicPayment > 0) { electronicSum = ElectronicPayment } } if(electronicSum){ var electronicObj = { "type": "electronically", "sum": electronicSum }; //paymentSystem; //numberTerminal; try{ if(thisbasket["info"]["bankingData"]["rrn"]){ electronicObj["rrn"] = thisbasket["info"]["bankingData"]["rrn"]; //RRN (Reference Retrieval Number) платежа } }catch(err){ } try{ if(thisbasket["info"]["bankingData"]["bankName"]){ electronicObj["bankName"] = thisbasket["info"]["bankingData"]["bankName"]; //Название банка } }catch(err){ } try{ if(thisbasket["info"]["bankingData"]["cardNumber"]){ electronicObj["numberCard"] = thisbasket["info"]["bankingData"]["cardNumber"]; //Номер карты клиента } }catch(err){ } try{ if(thisbasket["info"]["bankingData"]["authorizationCode"]){ electronicObj["authorizationCode"] = thisbasket["info"]["bankingData"]["authorizationCode"]; //Код авторизации платежа } }catch(err){ } try{ if(thisbasket["info"]["bankingData"]["terminalID"]){ electronicObj["numberTerminal"] = thisbasket["info"]["bankingData"]["terminalID"]; //Номер платежного терминала } }catch(err){ } jsonData.payments.push(electronicObj); } console.error(thisbasket); //var deviceObj = thisbasket["printer"] //Вызов return new Promise(function(resolve, reject) { if(ifartprint == true){ console.error("MINI FP", jsonData) app.print.protocols.minifp_android_v2.ExecuteCommand(jsonData, thisbasket.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }else{ resolve({"status":"done"}); } }); }, vozvrat: function(thisbasket) { //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; var allrealsum = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; var nallll = 0; var newfiscalarr = []; var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); //Собираем нужный массив и убираем позиции которые не подлежат налогообложению fiscalarr.forEach(function(item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } if (item["tax"] != "") { flag = 1; var newitem = {}; //Костыльчик который убирает с имени товара приставку веса try{ if(item.quantity == "100g" || item.quantity == "100ml"){ item["name"] = preload.products[currentsklad][item.idtovara]["name"]; } }catch(err){ } if(item.uktzed != '' && item.uktzed != null){ newitem["name"] = item["name"]; }else{ newitem["name"] = item["name"]; } newitem["quantity"] = round(item["kolvo"], 3); newitem["price"] = round(item["cenaout"], 2); if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } newitem["amount"] = amount; newitem["code"] = item["id"]; newitem["type"] = "position"; newitem["tax"] = round(item["tax"],0); newitem["unit"] = "ves"; // "infoDiscountAmount": 0.0, //"measurementUnit": "кг", //"paymentMethod": "advance", //"paymentObject": "commodity", //"nomenclatureCode": "MTIzNDEyMzQ1Njc4MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=", newfiscalarr.push(newitem); allrealsum = allrealsum + amount; } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } kostilsumm = kostilsumm + amount; } }); if (kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы онлайн кассе"); } // Вызов команды var jsonData = { "type": "sellReturn", "taxationType": thisbasket["printer"]["cno"], "operator": { "id": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_pin"] }, "items": newfiscalarr, "payments": [] }; try{ if(thisbasket["printer"]["cno"] == "" || thisbasket["printer"]["cno"] == undefined){ delete jsonData["taxationType"]; } }catch(err){ } //Наличка if(thisbasket["info"]["cash"] > 0){ jsonData["payments"].push({ "type": "cash", "sum": round(thisbasket["info"]["cash"], 2) }); } //Безнал if(thisbasket["info"]["visa"] > 0){ if(thisbasket["info"]["visa"] > allrealsum){ jsonData["payments"].push({ "type": "electronically", "sum": round(allrealsum, 2) }); }else{ jsonData["payments"].push({ "type": "electronically", "sum": round(thisbasket["info"]["visa"], 2) }); } } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_android_v2.ExecuteCommand(jsonData, thisbasket.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, precheck: function(thisbasket) { var stringlength = 48; var lineh = ""; for (var i = 0; i < stringlength; i++) { lineh = lineh + "-"; } var newfiscalarr = []; try { newfiscalarr.push({ "type": "text", "text": "Заказ:" + thisbasket["info"]["id"], "alignment": "center" }) } catch (err) {} newfiscalarr.push({ "type": "text", "text": "Счёт на оплату", "alignment": "center" }) try { if (thisbasket.info["type"] == "delivery") { /*Адрес на пречек*/ if (thisbasket.info.client > 0) { var thisclient = preload["clients"][thisbasket.info.client]; if (thisclient.name != "") { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["FIO"] + ":" + thisclient.name }); } if (thisclient.phone != "") { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["telefon"] + ":" + thisclient.phone }); } if (thisbasket["info"]["adress"] != "") { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["adres"] + ":" + thisbasket["info"]["adress"], }); } } } } catch (err) {} newfiscalarr.push({ "type": "text", "text": lineh, "alignment": "center" }) var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); fiscalarr.forEach(function(item, i) { //Собираем нужный массив newfiscalarr.push({ "type": "text", "text": fiscalarr[i]["name"], "alignment": "left" }) newfiscalarr.push({ "type": "text", "text": CurrencyFormatted(fiscalarr[i]["kolvo"], 3) + " * " + CurrencyFormatted(fiscalarr[i]["cenaout"]) + " = " + CurrencyFormatted(fiscalarr[i]["cenaout"] * fiscalarr[i]["kolvo"]), "alignment": "right" }) }); newfiscalarr.push({ "type": "text", "text": lineh, "alignment": "center" }) if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { if(thisbasket.info.cashdiscount > 0){ var dstring = CurrencyFormatted(thisbasket.info.cashdiscount); }else{ var dstring = thisbasket.info.discounttitle; } //Со скидкой newfiscalarr.push({ "type": "text", "text": app.print.modules.escposstr(1, stringlength, "СКИДКА:", dstring), "alignment": "left" }) } newfiscalarr.push({ "type": "text", "text": app.print.modules.escposstr(1, stringlength, "ИТОГ:", CurrencyFormatted(thisbasket["info"]["allcena"])), "alignment": "left" }) newfiscalarr.push({ "type": "text", "text": lineh, "alignment": "center" }) if (thisbasket["info"]["comment"] != "" && thisbasket["info"]["comment"] != undefined && thisbasket.info["checkcomments"] == 1) { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["Kommentariy_k_z_r2za7"] + ":" + thisbasket["info"]["comment"], }); } newfiscalarr.push({ "type": "text", "text": "НЕ ФИСКАЛЬНЫЙ", "alignment": "center" }) var jsonData = { "type": "nonFiscal", "items": newfiscalarr } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_android_v2.ExecuteCommand(jsonData, thisbasket.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, XReport: function(data) { var jsonData = { "type": "reportX", "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_android_v2.ExecuteCommand(jsonData, data.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, X3Report: function(data) { var jsonData = { "type": "reportX3", "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_android_v2.ExecuteCommand(jsonData, data.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, ZReport: function(data) { var jsonData = { "type": "closeShift", "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_android_v2.ExecuteCommand(jsonData, data.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, introduction: function(data) { var jsonData = { "type": "cashIn", "cashSum": round(data["cash"]), "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_android_v2.ExecuteCommand(jsonData, data.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, incasation: function(data) { var jsonData = { "type": "cashOut", "cashSum": round(data["cash"]), "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_android_v2.ExecuteCommand(jsonData, data.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, rashod: function(data) { var jsonData = { "type": "cashOut", "cashSum": round(data["cash"]), "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_android_v2.ExecuteCommand(jsonData, data.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, getUser: function(name){ if(minifp["usersbase"][name]){ console.log("true"); return minifp["usersbase"][name]["id"]; }else{ console.log("false"); minifp["usersbase"][name] = { id:minifp["usersbase_count"], name:name } minifp["usersbase_count"]++; localStorage["minifp_usersbase"] = JSON.stringify(minifp["usersbase"]) return minifp["usersbase"][name]["id"]; } }, ExecuteCommand: function(Data, printer) { try{ Data.operator.id = this.getUser(Data.operator.name); //alert(Data.operator.id+" "+Data.operator.name); console.log(Data.operator.id); if(Data.operator.id > 31){ app.main.error("minifp: Порядковий номер співробітника більше ніж 31, код пимилки: 8163"); } }catch(err){ app.main.error("Не вдалось отримати номер співробітника, код пимилки: 8164"); } app.main.loader("show"); console.log("ExecuteCommand w8", Data); //alert(JSON.stringify(Data)); console.log("ExecuteCommand w8", JSON.stringify(Data)); return new Promise(function(resolve, reject) { try { Android.fiscalOperation(JSON.stringify({ deviceId:printer["id"], protocol:printer["protocol"], jsonObjectData:Data })); returnMiniFP.status = "empty"; try { /*На тот случай если прошлое ожидание не было завершено*/ clearInterval(waitingMiniFP); } catch (err) { /*Скорей всего уже было завершено*/ } var waitingMiniFP = setInterval(function() { console.log("Опрашиваем minifp") if (returnMiniFP.status == "done") { clearInterval(waitingMiniFP); app.main.loader("hide"); resolve({ status: "done", data: returnMiniFP }); } if (returnMiniFP.status == "error") { clearInterval(waitingMiniFP); app.main.loader("hide"); reject({ status: "error", data: returnMiniFP }); } }, 500); } catch (err) { console.log("Устройство minifp не найдено"); app.main.loader("hide"); reject({ status: "error" }); } }) }, ReturnCommand: function(jsondata) { var response = JSON.parse(jsondata) app.main.loader("hide"); if (response["status"] == "done") { returnMiniFP = response; } else { response["status"] = "error"; returnMiniFP = response; app.main.error("miniFP: "+response["errorCode"]+" - "+this.codeErro(response["errorCode"])); } }, ReturnSettings: function(jsondata) { //var atolsetings = JSON.parse(jsondata); //app.main.message("Сервисная информация"+"

"+"Model "+atolsetings.Model+"
"+"AccessPassword "+atolsetings.AccessPassword+"
"+"AutoDisableBluetooth "+atolsetings.AutoDisableBluetooth+"
"+"AutoEnableBluetooth "+atolsetings.AutoEnableBluetooth+"
"+"BaudRate "+atolsetings.BaudRate+"
"+"Bits "+atolsetings.Bits+"
"+"ComFile "+atolsetings.ComFile+"
"+"IPAddress "+atolsetings.IPAddress+"
"+"IPPort "+atolsetings.IPPort+"
"+"LibraryPath "+atolsetings.LibraryPath+"
"+"MACAddress "+atolsetings.MACAddress+"
"+"OfdChannel "+atolsetings.OfdChannel+"
"+"Parity "+atolsetings.Parity+"
"+"Port "+atolsetings.Port+"
"+"StopBits "+atolsetings.StopBits+"
"+"UsbDevicePath "+atolsetings.UsbDevicePath+"
"+"UserPassword "+atolsetings.UserPassword) app.main.message("Ответ от драйвера получен, для продолжение сохраните настройки"); $("#Atol10SettingsButton").removeClass("btn-danger"); $("#Atol10SettingsButton").addClass("btn-info"); $("#settings_device_list_edit_form_settings").val(JSON.stringify(jsondata)); }, }, minifp_usb_skyapp_windows:{ codeErro: function(code){ var minifpErr = []; minifpErr["1"] = "Нет возможности запустить команду"; minifpErr["2"] = "Невозможно обработать команду"; minifpErr["3"] = "Код команды отсутствует"; minifpErr["4"] = "Много данных в команде"; minifpErr["5"] = "Недостаточно данных в команде"; minifpErr["6"] = "Ошибка при приеме данных"; minifpErr["7"] = "Недопустимый идентификатор команды"; minifpErr["8"] = "Невозможно выполнить команду"; minifpErr["10"] = "ошибка ввода"; minifpErr["11"] = "необходимо снять z1 отчет"; minifpErr["12"] = "скидки/наценки запрещены"; minifpErr["13"] = "переполнение по чеку"; minifpErr["14"] = "команда запрещена"; minifpErr["15"] = "кассир не зарегистрирован"; minifpErr["16"] = "отрицательная сумма"; minifpErr["17"] = "количество товара отрицательное"; minifpErr["18"] = "время смены исчерпано"; minifpErr["19"] = "неверный тип оплаты"; minifpErr["20"] = "неправильная или отсутствующая цена"; minifpErr["21"] = "неверный параметр на входе команды"; minifpErr["22"] = "товар находится в открытом чеке, нельзя редактировать"; minifpErr["23"] = "некорректно запрограммированный товар"; minifpErr["24"] = "неверный или отсутствующий штрихкод товара"; minifpErr["27"] = "неверный или отсутствующий код товара"; minifpErr["28"] = "товар не весовой(штучный)"; minifpErr["29"] = "ФП почти заполнена"; minifpErr["30"] = "ФП заполнена"; minifpErr["31"] = "память инициализаций заполнена"; minifpErr["32"] = "есть отложенная операция, оплата запрещена"; minifpErr["33"] = "карточка клиента не принята"; minifpErr["34"] = "не хватает денег на сдачу"; minifpErr["35"] = "запрещена комбинированная оплата"; minifpErr["36"] = "неправильный номер кассира"; minifpErr["37"] = "места недостаточно"; minifpErr["38"] = "нет места в Журнале"; minifpErr["39"] = "нет места в базе товаров"; minifpErr["40"] = "нет места в Архиве"; minifpErr["41"] = "товар есть комплекс"; minifpErr["42"] = "код не принадлежит комплексу"; minifpErr["43"] = "РРО занят и не может выполнить команду"; minifpErr["44"] = "необходимо выполнить Z1 отчет"; minifpErr["45"] = "неправильный пароль кассира"; minifpErr["46"] = "комплекс нельзя продать"; minifpErr["47"] = "цена товара указана"; minifpErr["48"] = "отмена запрещена"; minifpErr["49"] = "продажа товара запрещена"; minifpErr["50"] = "ошибка чтения ФП"; minifpErr["51"] = "номер производителя неверен"; minifpErr["52"] = "ошибка записи во флеш"; minifpErr["54"] = "товар нельзя удалить"; minifpErr["55"] = "нет данных в ФП"; minifpErr["56"] = "неверный пароль налогового инспектора"; minifpErr["57"] = "неверный пароль администратора"; minifpErr["58"] = "неверный пароль старшего кассира"; minifpErr["60"] = "РРО заблокирован. Истекло время для передачи данных"; minifpErr["61"] = "РРО заблокирован. Персонализация не проведена"; minifpErr["67"] = "ошибка работы с SAM"; minifpErr["68"] = "есть неотправленные документы"; minifpErr["69"] = "документы отсутствуют"; minifpErr["70"] = "вал отсутствует"; minifpErr["71"] = "нет питания 3.3В на плате клавиатуры"; minifpErr["79"] = "дата сервисного обслуживания превышена"; minifpErr["80"] = "ошибка записи в ФП"; minifpErr["81"] = "ошибка часов реального времени, дата последнего Z1 отчета больше текущей"; minifpErr["82"] = "ошибка данных в интерфейсе"; minifpErr["83"] = "ошибка часов реального времени, дата/время последнего документа больше текущей"; minifpErr["86"] = "отсутствует индикатор клиента"; minifpErr["91"] = "напряжение питания превышает допустимое"; minifpErr["92"] = "напряжение питания ниже допустимого"; minifpErr["93"] = "критическое снижение напряжения питания"; minifpErr["95"] = "температура термоголовки ниже допустимой"; minifpErr["96"] = "температура термоголовки превышает допустимую"; minifpErr["97"] = "нет бумаги"; minifpErr["200"] = "выключен коммуникационный блок"; minifpErr["201"] = "нет связи с коммуникационном блоком"; minifpErr["203"] = "карточка не принята"; minifpErr["205"] = "ошибка платежного терминала"; minifpErr["206"] = "ошибка транзакции"; minifpErr["207"] = "невозможность выполнить операцию"; minifpErr["208"] = "отмена операции"; minifpErr["209"] = "операция прервана"; minifpErr["241"] = "носитель нуждается в форматировании"; minifpErr["242"] = "носитель отсутствует"; minifpErr["254"] = "носитель заполнен"; minifpErr["257"] = "ошибка SAM модуля"; minifpErr["258"] = "не правильный ID DEV"; minifpErr["259"] = "не правильный ID SAM"; minifpErr["260"] = "ошибка SAM модуля"; minifpErr["261"] = "ошибка инициализации SAM модуля"; minifpErr["262"] = "ошибка SAM модуля"; minifpErr["263"] = "нет ID_DEV"; minifpErr["264"] = "SAM модуль не персонализирован"; minifpErr["265"] = "ошибка SAM модуля"; minifpErr["266"] = "ошибка SAM модуля"; minifpErr["267"] = "ошибка синхронной сессии"; minifpErr["268"] = "ошибка подписи MAC"; minifpErr["269"] = "неудовлетворительное использование"; minifpErr["270"] = "ошибка обмена данными с SAM"; minifpErr["271"] = "ошибка обмена данными с SAM"; minifpErr["272"] = "ошибка обмена данными с SAM"; minifpErr["273"] = "Ошибка обмена данными с SAM"; minifpErr["274"] = "Ошибка обмена данными с SAM"; minifpErr["275"] = "Ошибка обмена данными"; minifpErr["276"] = "Неверная версия VkMAC"; minifpErr["288"] = "Ошибка персонализации SAM"; minifpErr["545"] = "Ошибка персонализации SAM"; minifpErr["289"] = "Ошибка персонализации РРО"; minifpErr["546"] = "Ошибка персонализации РРО"; minifpErr["290"] = "Ошибка передачи данных"; minifpErr["547"] = "Ошибка передачи данных"; minifpErr["300"] = "Ошибка подключения к серверу"; minifpErr["301"] = "Ошибка подключения к коммуникационному блоку"; minifpErr["302"] = "Ошибка подключения к серверу"; minifpErr["303"] = "Ошибка сети"; minifpErr["304"] = "Ошибка коммуникационного блока"; minifpErr["305"] = "Ошибка передачи данных"; minifpErr["307"] = "Ошибка коммуникационного блока"; minifpErr["308"] = "Ошибка формата URL"; minifpErr["900"] = "Ошибка файловой системы при поиске документов"; minifpErr["901"] = "Ошибка размера файла"; minifpErr["902"] = "Превышение времени ожидания ответа"; minifpErr["903"] = "Ошибка целостности данных на носителе"; minifpErr["1001"] = "Слишком длинное наименование товара"; minifpErr["1002"] = "Нет ответа"; return minifpErr[code]; }, opensmena: function(data) { //Вызов return new Promise(function(resolve, reject) { resolve({ status: "done" }); }); }, opendrawer: function(data) { var jsonData = { "type": "openDrawer", "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_usb_skyapp_windows.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, check: function(thisbasket) { var ifartprint = false; console.log("minifp_android", thisbasket); var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); var newfiscalarr = []; try { newfiscalarr.push({ "type": "text", "text": "Замовлення:" + thisbasket["info"]["id"], "alignment": "center" }) } catch (err) {} //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; var kostilsummRRO = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; //Собираем нужный массив и убираем позиции которые не подлежат налогообложению fiscalarr.forEach(function(item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } if (item["tax"] != "") { flag = 1; ifartprint = true; var newitem = {}; //Костыльчик который убирает с имени товара приставку веса try{ if(item.type == "mod" ){ if(item.quantity == "100g" || item.quantity == "100ml"){ item["name"] = preload.products[currentsklad][item.id]["name"]; } } }catch(err){ } if(item.uktzed != '' && item.uktzed != null){ newitem["name"] = item.uktzed+"#"+item["name"]; }else{ newitem["name"] = item["name"]; } newitem["quantity"] = round(item["kolvo"], 3); if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { //Если скидка есть if(okruglenie != 0){ // alert("s1"); // newitem["price"] = round(item["cenaold_discount"], 2); //цена до скидки и округления amount = round(round(item["cenaout_discount"],2) * item["kolvo"],2); //цена после скидки и округления }else{ // alert("s2"); // newitem["price"] = round(item["cenaout"], 2); //цена до скидки и округления если округления не было amount = round(round(item["cenaout_discount"],2) * item["kolvo"],2); //цена после скидки и округления } } else { //Если скидки нет if(okruglenie != 0){ // alert("s3"); console.warn("item",item) // newitem["price"] = round(item["cenaold"], 2); //цена до скидки и округления amount = round(round(item["cenaout"],2) * item["kolvo"],2); //цена без скидки но с округлением }else{ // alert("s4"); // newitem["price"] = round(item["cenaout"], 2); //цена до скидки и округления если округления не было amount = round(round(item["cenaout"],2) * item["kolvo"],2); //цена без скидки но с округлением } } if(okruglenie != 0){ newitem["price"] = round(item["cenaold"],2); }else{ newitem["price"] = round(item["cenaout"],2); } // alert("цена"+newitem["price"]); // alert("сумму"+amount); newitem["amount"] = amount; kostilsummRRO = kostilsummRRO + amount; newitem["code"] = item["id"]; newitem["type"] = "position"; newitem["unit"] = "ves"; newitem["tax"] = round(item["tax"],0); try{ if(thisbasket["info"]["nopaymentstype"] == "debt"){ newitem["paymentMethod"] = "credit"; } }catch(err){ } //fullPrepayment - предоплата 100% //prepayment - предоплата //advance - аванс //fullPayment - полный расчет - по умолчанию //partialPayment - частичный расчет и кредит //credit - передача в кредит //creditPayment - оплата кредита // "infoDiscountAmount": 0.0, //"measurementUnit": "кг", //"paymentMethod": "advance", //"paymentObject": "commodity", //"nomenclatureCode": "MTIzNDEyMzQ1Njc4MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=", newfiscalarr.push(newitem) console.log("iiitem",newitem) } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } kostilsumm = kostilsumm + amount; } }); if (thisbasket["info"]["comment"] != "" && thisbasket["info"]["comment"] != undefined && thisbasket.info["checkcomments"] == 1) { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["Kommentariy_k_z_r2za7"] + ":" + thisbasket["info"]["comment"], }); } var dali = thisbasket["info"]["cash"]; if (thisbasket["info"]["nall"] > 0) { dali = thisbasket["info"]["nall"] } //Отнимаем от суммы которую дал клиент сумму товара который не пошел на печать на фискальник dali = dali - kostilsumm; if (kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы онлайн кассе"); } var jsonData = { "type": "sell", "taxationType": thisbasket["printer"]["cno"], "operator": { "id": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_pin"] }, "items": newfiscalarr, "payments": [], /* "discount":{ "type":"sum", //per "discount":-0.21 } */ }; try{ if(thisbasket["printer"]["cno"] == "" || thisbasket["printer"]["cno"] == undefined){ delete jsonData["taxationType"]; } }catch(err){ } /*Сумма электронной оплаты (2 знака после запятой)*/ try { var ElectronicPayment = round(thisbasket["info"]["visa"]); } catch (err) { var ElectronicPayment = 0; } //Костыль для починки minifp бага c большей суммой налички при сдвоенной оплате if(ElectronicPayment < kostilsummRRO){ if(thisbasket["info"]["cash"] > 0){ jsonData.payments.push({ "type": "cash", "sum": dali }) } } //Если сумма оплаты картой больше чем сумма товаров переданных на рро if(ElectronicPayment > kostilsummRRO){ if(kostilsummRRO > 0){ jsonData.payments.push({ "type": "electronically", "sum": kostilsummRRO }) } }else{ if (ElectronicPayment > 0) { jsonData.payments.push({ "type": "electronically", "sum": ElectronicPayment }) } } //Вызов return new Promise(function(resolve, reject) { if(ifartprint == true){ console.error("MINI FP", jsonData) app.print.protocols.minifp_usb_skyapp_windows.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }else{ resolve({"status":"done"}); } }); }, vozvrat: function(thisbasket) { //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; var allrealsum = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; var nallll = 0; var newfiscalarr = []; var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); //Собираем нужный массив и убираем позиции которые не подлежат налогообложению fiscalarr.forEach(function(item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } if (item["tax"] != "") { flag = 1; var newitem = {}; //Костыльчик который убирает с имени товара приставку веса try{ if(item.quantity == "100g" || item.quantity == "100ml"){ item["name"] = preload.products[currentsklad][item.idtovara]["name"]; } }catch(err){ } if(item.uktzed != '' && item.uktzed != null){ newitem["name"] = item.uktzed+"#"+item["name"]; }else{ newitem["name"] = item["name"]; } newitem["quantity"] = round(item["kolvo"], 3); newitem["price"] = round(item["cenaout"], 2); if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } newitem["amount"] = amount; newitem["code"] = item["id"]; newitem["type"] = "position"; newitem["tax"] = round(item["tax"],0); newitem["unit"] = "ves"; // "infoDiscountAmount": 0.0, //"measurementUnit": "кг", //"paymentMethod": "advance", //"paymentObject": "commodity", //"nomenclatureCode": "MTIzNDEyMzQ1Njc4MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=", newfiscalarr.push(newitem); allrealsum = allrealsum + amount; } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } kostilsumm = kostilsumm + amount; } }); if (kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы онлайн кассе"); } // Вызов команды var jsonData = { "type": "sellReturn", "taxationType": thisbasket["printer"]["cno"], "operator": { "id": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_pin"] }, "items": newfiscalarr, "payments": [] }; try{ if(thisbasket["printer"]["cno"] == "" || thisbasket["printer"]["cno"] == undefined){ delete jsonData["taxationType"]; } }catch(err){ } //Наличка if(thisbasket["info"]["cash"] > 0){ jsonData["payments"].push({ "type": "cash", "sum": round(thisbasket["info"]["cash"], 2) }); } //Безнал if(thisbasket["info"]["visa"] > 0){ if(thisbasket["info"]["visa"] > allrealsum){ jsonData["payments"].push({ "type": "electronically", "sum": round(allrealsum, 2) }); }else{ jsonData["payments"].push({ "type": "electronically", "sum": round(thisbasket["info"]["visa"], 2) }); } } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_usb_skyapp_windows.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, precheck: function(thisbasket) { var stringlength = 48; var lineh = ""; for (var i = 0; i < stringlength; i++) { lineh = lineh + "-"; } var newfiscalarr = []; try { newfiscalarr.push({ "type": "text", "text": "Заказ:" + thisbasket["info"]["id"], "alignment": "center" }) } catch (err) {} newfiscalarr.push({ "type": "text", "text": "Счёт на оплату", "alignment": "center" }) try { if (thisbasket.info["type"] == "delivery") { /*Адрес на пречек*/ if (thisbasket.info.client > 0) { var thisclient = preload["clients"][thisbasket.info.client]; if (thisclient.name != "") { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["FIO"] + ":" + thisclient.name }); } if (thisclient.phone != "") { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["telefon"] + ":" + thisclient.phone }); } if (thisbasket["info"]["adress"] != "") { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["adres"] + ":" + thisbasket["info"]["adress"], }); } } } } catch (err) {} newfiscalarr.push({ "type": "text", "text": lineh, "alignment": "center" }) var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); fiscalarr.forEach(function(item, i) { //Собираем нужный массив newfiscalarr.push({ "type": "text", "text": fiscalarr[i]["name"], "alignment": "left" }) newfiscalarr.push({ "type": "text", "text": CurrencyFormatted(fiscalarr[i]["kolvo"], 3) + " * " + CurrencyFormatted(fiscalarr[i]["cenaout"]) + " = " + CurrencyFormatted(fiscalarr[i]["cenaout"] * fiscalarr[i]["kolvo"]), "alignment": "right" }) }); newfiscalarr.push({ "type": "text", "text": lineh, "alignment": "center" }) if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { if(thisbasket.info.cashdiscount > 0){ var dstring = CurrencyFormatted(thisbasket.info.cashdiscount); }else{ var dstring = thisbasket.info.discounttitle; } //Со скидкой newfiscalarr.push({ "type": "text", "text": app.print.modules.escposstr(1, stringlength, "СКИДКА:", dstring), "alignment": "left" }) } newfiscalarr.push({ "type": "text", "text": app.print.modules.escposstr(1, stringlength, "ИТОГ:", CurrencyFormatted(thisbasket["info"]["allcena"])), "alignment": "left" }) newfiscalarr.push({ "type": "text", "text": lineh, "alignment": "center" }) if (thisbasket["info"]["comment"] != "" && thisbasket["info"]["comment"] != undefined && thisbasket.info["checkcomments"] == 1) { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["Kommentariy_k_z_r2za7"] + ":" + thisbasket["info"]["comment"], }); } newfiscalarr.push({ "type": "text", "text": "НЕ ФИСКАЛЬНЫЙ", "alignment": "center" }) var jsonData = { "type": "nonFiscal", "items": newfiscalarr } //Вызов return new Promise(function(resolve, reject) { // app.print.protocols.minifp_android.ExecuteCommand(jsonData).then(function(success) { resolve(success); // }, function(error) { // reject(error); // }) }); }, XReport: function(data) { var jsonData = { "type": "reportX", "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_usb_skyapp_windows.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, X3Report: function(data) { var jsonData = { "type": "reportX3", "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_usb_skyapp_windows.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, ZReport: function(data) { var jsonData = { "type": "closeShift", "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_usb_skyapp_windows.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, introduction: function(data) { var jsonData = { "type": "cashIn", "cashSum": round(data["cash"]), "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_usb_skyapp_windows.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, incasation: function(data) { var jsonData = { "type": "cashOut", "cashSum": round(data["cash"]), "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_usb_skyapp_windows.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, rashod: function(data) { var jsonData = { "type": "cashOut", "cashSum": round(data["cash"]), "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_usb_skyapp_windows.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, getUser: function(name){ if(minifp["usersbase"][name]){ console.log("true"); return minifp["usersbase"][name]["id"]; }else{ console.log("false"); minifp["usersbase"][name] = { id:minifp["usersbase_count"], name:name } minifp["usersbase_count"]++; localStorage["minifp_usersbase"] = JSON.stringify(minifp["usersbase"]) return minifp["usersbase"][name]["id"]; } }, ExecuteCommand: function(Data) { console.log("minifp ExecuteCommand",Data); try{ Data.operator.id = this.getUser(Data.operator.name); //alert(Data.operator.id+" "+Data.operator.name); console.log(Data.operator.id); if(Data.operator.id > 31){ app.main.error("minifp: Порядковий номер співробітника більше ніж 31, код пимилки: 8163"); } }catch(err){ app.main.error("Не вдалось отримати номер співробітника, код пимилки: 8164"); } app.main.loader("show"); return new Promise(function(resolve, reject) { try { var request = { method: "miniFP", data: JSON.stringify(Data) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { try{ console.log(response) var content2 = JSON.parse(response); if (content2.status == "done") { app.main.loader("hide"); resolve({ status: "done", data: content2 }); } if (content2.status == "error") { app.main.error("miniFP: "+content2["errorCode"]+" - "+app.print.protocols.minifp_usb_skyapp_windows.codeErro(content2["errorCode"])); app.main.loader("hide"); reject({ status: "error", data: content2 }); } }catch(err){ console.error("Устройство minifp не найдено",err); app.main.loader("hide"); reject({ status: "error" }); } }, onFailure: function(error_code, error_message) { reject({ status: "error", data: error_message }); } }); } catch (err) { console.error("Устройство minifp не найдено",err); app.main.loader("hide"); reject({ status: "error" }); } }) } }, minifp_usb_skyapp_windows_v2:{ codeErro: function(code){ var minifpErr = []; minifpErr["1"] = "Нет возможности запустить команду"; minifpErr["2"] = "Невозможно обработать команду"; minifpErr["3"] = "Код команды отсутствует"; minifpErr["4"] = "Много данных в команде"; minifpErr["5"] = "Недостаточно данных в команде"; minifpErr["6"] = "Ошибка при приеме данных"; minifpErr["7"] = "Недопустимый идентификатор команды"; minifpErr["8"] = "Невозможно выполнить команду"; minifpErr["10"] = "ошибка ввода"; minifpErr["11"] = "необходимо снять z1 отчет"; minifpErr["12"] = "скидки/наценки запрещены"; minifpErr["13"] = "переполнение по чеку"; minifpErr["14"] = "команда запрещена"; minifpErr["15"] = "кассир не зарегистрирован"; minifpErr["16"] = "отрицательная сумма"; minifpErr["17"] = "количество товара отрицательное"; minifpErr["18"] = "время смены исчерпано"; minifpErr["19"] = "неверный тип оплаты"; minifpErr["20"] = "неправильная или отсутствующая цена"; minifpErr["21"] = "неверный параметр на входе команды"; minifpErr["22"] = "товар находится в открытом чеке, нельзя редактировать"; minifpErr["23"] = "некорректно запрограммированный товар"; minifpErr["24"] = "неверный или отсутствующий штрихкод товара"; minifpErr["27"] = "неверный или отсутствующий код товара"; minifpErr["28"] = "товар не весовой(штучный)"; minifpErr["29"] = "ФП почти заполнена"; minifpErr["30"] = "ФП заполнена"; minifpErr["31"] = "память инициализаций заполнена"; minifpErr["32"] = "есть отложенная операция, оплата запрещена"; minifpErr["33"] = "карточка клиента не принята"; minifpErr["34"] = "не хватает денег на сдачу"; minifpErr["35"] = "запрещена комбинированная оплата"; minifpErr["36"] = "неправильный номер кассира"; minifpErr["37"] = "места недостаточно"; minifpErr["38"] = "нет места в Журнале"; minifpErr["39"] = "нет места в базе товаров"; minifpErr["40"] = "нет места в Архиве"; minifpErr["41"] = "товар есть комплекс"; minifpErr["42"] = "код не принадлежит комплексу"; minifpErr["43"] = "РРО занят и не может выполнить команду"; minifpErr["44"] = "необходимо выполнить Z1 отчет"; minifpErr["45"] = "неправильный пароль кассира"; minifpErr["46"] = "комплекс нельзя продать"; minifpErr["47"] = "цена товара указана"; minifpErr["48"] = "отмена запрещена"; minifpErr["49"] = "продажа товара запрещена"; minifpErr["50"] = "ошибка чтения ФП"; minifpErr["51"] = "номер производителя неверен"; minifpErr["52"] = "ошибка записи во флеш"; minifpErr["54"] = "товар нельзя удалить"; minifpErr["55"] = "нет данных в ФП"; minifpErr["56"] = "неверный пароль налогового инспектора"; minifpErr["57"] = "неверный пароль администратора"; minifpErr["58"] = "неверный пароль старшего кассира"; minifpErr["60"] = "РРО заблокирован. Истекло время для передачи данных"; minifpErr["61"] = "РРО заблокирован. Персонализация не проведена"; minifpErr["67"] = "ошибка работы с SAM"; minifpErr["68"] = "есть неотправленные документы"; minifpErr["69"] = "документы отсутствуют"; minifpErr["70"] = "вал отсутствует"; minifpErr["71"] = "нет питания 3.3В на плате клавиатуры"; minifpErr["79"] = "дата сервисного обслуживания превышена"; minifpErr["80"] = "ошибка записи в ФП"; minifpErr["81"] = "ошибка часов реального времени, дата последнего Z1 отчета больше текущей"; minifpErr["82"] = "ошибка данных в интерфейсе"; minifpErr["83"] = "ошибка часов реального времени, дата/время последнего документа больше текущей"; minifpErr["86"] = "отсутствует индикатор клиента"; minifpErr["91"] = "напряжение питания превышает допустимое"; minifpErr["92"] = "напряжение питания ниже допустимого"; minifpErr["93"] = "критическое снижение напряжения питания"; minifpErr["95"] = "температура термоголовки ниже допустимой"; minifpErr["96"] = "температура термоголовки превышает допустимую"; minifpErr["97"] = "нет бумаги"; minifpErr["200"] = "выключен коммуникационный блок"; minifpErr["201"] = "нет связи с коммуникационном блоком"; minifpErr["203"] = "карточка не принята"; minifpErr["205"] = "ошибка платежного терминала"; minifpErr["206"] = "ошибка транзакции"; minifpErr["207"] = "невозможность выполнить операцию"; minifpErr["208"] = "отмена операции"; minifpErr["209"] = "операция прервана"; minifpErr["241"] = "носитель нуждается в форматировании"; minifpErr["242"] = "носитель отсутствует"; minifpErr["254"] = "носитель заполнен"; minifpErr["257"] = "ошибка SAM модуля"; minifpErr["258"] = "не правильный ID DEV"; minifpErr["259"] = "не правильный ID SAM"; minifpErr["260"] = "ошибка SAM модуля"; minifpErr["261"] = "ошибка инициализации SAM модуля"; minifpErr["262"] = "ошибка SAM модуля"; minifpErr["263"] = "нет ID_DEV"; minifpErr["264"] = "SAM модуль не персонализирован"; minifpErr["265"] = "ошибка SAM модуля"; minifpErr["266"] = "ошибка SAM модуля"; minifpErr["267"] = "ошибка синхронной сессии"; minifpErr["268"] = "ошибка подписи MAC"; minifpErr["269"] = "неудовлетворительное использование"; minifpErr["270"] = "ошибка обмена данными с SAM"; minifpErr["271"] = "ошибка обмена данными с SAM"; minifpErr["272"] = "ошибка обмена данными с SAM"; minifpErr["273"] = "Ошибка обмена данными с SAM"; minifpErr["274"] = "Ошибка обмена данными с SAM"; minifpErr["275"] = "Ошибка обмена данными"; minifpErr["276"] = "Неверная версия VkMAC"; minifpErr["288"] = "Ошибка персонализации SAM"; minifpErr["545"] = "Ошибка персонализации SAM"; minifpErr["289"] = "Ошибка персонализации РРО"; minifpErr["546"] = "Ошибка персонализации РРО"; minifpErr["290"] = "Ошибка передачи данных"; minifpErr["547"] = "Ошибка передачи данных"; minifpErr["300"] = "Ошибка подключения к серверу"; minifpErr["301"] = "Ошибка подключения к коммуникационному блоку"; minifpErr["302"] = "Ошибка подключения к серверу"; minifpErr["303"] = "Ошибка сети"; minifpErr["304"] = "Ошибка коммуникационного блока"; minifpErr["305"] = "Ошибка передачи данных"; minifpErr["307"] = "Ошибка коммуникационного блока"; minifpErr["308"] = "Ошибка формата URL"; minifpErr["900"] = "Ошибка файловой системы при поиске документов"; minifpErr["901"] = "Ошибка размера файла"; minifpErr["902"] = "Превышение времени ожидания ответа"; minifpErr["903"] = "Ошибка целостности данных на носителе"; minifpErr["1001"] = "Слишком длинное наименование товара"; minifpErr["1002"] = "Нет ответа"; return minifpErr[code]; }, opensmena: function(data) { //Вызов return new Promise(function(resolve, reject) { resolve({ status: "done" }); }); }, opendrawer: function(data) { var jsonData = { "type": "openDrawer", "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_usb_skyapp_windows_v2.ExecuteCommand(jsonData, data.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, check: function(thisbasket) { var ifartprint = false; console.log("minifp_android", thisbasket); var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); var newfiscalarr = []; try { newfiscalarr.push({ "type": "text", "text": "Замовлення:" + thisbasket["info"]["id"], "alignment": "center" }) } catch (err) {} //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; var kostilsummRRO = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; //Собираем нужный массив и убираем позиции которые не подлежат налогообложению fiscalarr.forEach(function(item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } if (item["tax"] != "") { flag = 1; ifartprint = true; var newitem = {}; //Костыльчик который убирает с имени товара приставку веса try{ if(item.type == "mod" ){ if(item.quantity == "100g" || item.quantity == "100ml"){ item["name"] = preload.products[currentsklad][item.id]["name"]; } } }catch(err){ } if(item.uktzed != '' && item.uktzed != null){ newitem["name"] = item["name"]; newitem["uktzed"] = item["uktzed"]; }else{ newitem["name"] = item["name"]; } try{ if(item.akciz != '' && item.akciz != null){ newitem["excise"] = [ { "stamp": item.akciz } ]; } }catch(err){ } newitem["quantity"] = round(item["kolvo"], 3); if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { //Если скидка есть if(okruglenie != 0){ // alert("s1"); // newitem["price"] = round(item["cenaold_discount"], 2); //цена до скидки и округления //amount = round(round(item["cenaout_discount"],2) * item["kolvo"],2); //цена после скидки и округления amount = round(multiplyin(item["cenaout_discount"],item["kolvo"]),2); }else{ // alert("s2"); // newitem["price"] = round(item["cenaout"], 2); //цена до скидки и округления если округления не было //amount = round(round(item["cenaout_discount"],2) * item["kolvo"],2); //цена после скидки и округления amount = round(multiplyin(item["cenaout_discount"],item["kolvo"]),2); } } else { //Если скидки нет if(okruglenie != 0){ // alert("s3"); console.warn("item",item) // newitem["price"] = round(item["cenaold"], 2); //цена до скидки и округления amount = round(multiplyin(item["cenaout"],item["kolvo"]),2); //цена без скидки но с округлением }else{ // alert("s4"); // newitem["price"] = round(item["cenaout"], 2); //цена до скидки и округления если округления не было amount = round(multiplyin(item["cenaout"],item["kolvo"]),2); //цена без скидки но с округлением } } if(okruglenie != 0){ newitem["price"] = round(item["cenaold"],2); }else{ newitem["price"] = round(item["cenaout"],2); } // alert("цена"+newitem["price"]); // alert("сумму"+amount); newitem["amount"] = amount; kostilsummRRO = kostilsummRRO + amount; newitem["code"] = item["id"]; newitem["type"] = "position"; newitem["unit"] = "ves"; newitem["tax"] = round(item["tax"],0); try{ if(thisbasket["info"]["nopaymentstype"] == "debt"){ newitem["paymentMethod"] = "credit"; } }catch(err){ } //fullPrepayment - предоплата 100% //prepayment - предоплата //advance - аванс //fullPayment - полный расчет - по умолчанию //partialPayment - частичный расчет и кредит //credit - передача в кредит //creditPayment - оплата кредита // "infoDiscountAmount": 0.0, //"measurementUnit": "кг", //"paymentMethod": "advance", //"paymentObject": "commodity", //"nomenclatureCode": "MTIzNDEyMzQ1Njc4MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=", newfiscalarr.push(newitem) console.log("iiitem",newitem) } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } kostilsumm = kostilsumm + amount; } }); if (thisbasket["info"]["comment"] != "" && thisbasket["info"]["comment"] != undefined && thisbasket.info["checkcomments"] == 1) { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["Kommentariy_k_z_r2za7"] + ":" + thisbasket["info"]["comment"], }); } var dali = thisbasket["info"]["cash"]; if (thisbasket["info"]["nall"] > 0) { dali = thisbasket["info"]["nall"] } //Отнимаем от суммы которую дал клиент сумму товара который не пошел на печать на фискальник dali = dali - kostilsumm; if (kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы онлайн кассе"); } var jsonData = { "type": "sell", "taxationType": thisbasket["printer"]["cno"], "operator": { "id": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_pin"] }, "items": newfiscalarr, "payments": [], /* "discount":{ "type":"sum", //per "discount":-0.21 } */ }; try{ if(thisbasket["printer"]["cno"] == "" || thisbasket["printer"]["cno"] == undefined){ delete jsonData["taxationType"]; } }catch(err){ } /*Сумма электронной оплаты (2 знака после запятой)*/ try { var ElectronicPayment = round(thisbasket["info"]["visa"]); } catch (err) { var ElectronicPayment = 0; } //Костыль для починки minifp бага c большей суммой налички при сдвоенной оплате if(ElectronicPayment < kostilsummRRO){ if(thisbasket["info"]["cash"] > 0){ jsonData.payments.push({ "type": "cash", "sum": dali }) } } var electronicSum = null; //Если сумма оплаты картой больше чем сумма товаров переданных на рро if(ElectronicPayment > kostilsummRRO){ if(kostilsummRRO > 0){ electronicSum = kostilsummRRO } }else{ if (ElectronicPayment > 0) { electronicSum = ElectronicPayment } } if(electronicSum){ var electronicObj = { "type": "electronically", "sum": electronicSum }; //paymentSystem; //numberTerminal; try{ if(thisbasket["info"]["bankingData"]["rrn"]){ electronicObj["rrn"] = thisbasket["info"]["bankingData"]["rrn"]; //RRN (Reference Retrieval Number) платежа } }catch(err){ } try{ if(thisbasket["info"]["bankingData"]["bankName"]){ electronicObj["bankName"] = thisbasket["info"]["bankingData"]["bankName"]; //Название банка } }catch(err){ } try{ if(thisbasket["info"]["bankingData"]["cardNumber"]){ electronicObj["numberCard"] = thisbasket["info"]["bankingData"]["cardNumber"]; //Номер карты клиента } }catch(err){ } try{ if(thisbasket["info"]["bankingData"]["authorizationCode"]){ electronicObj["authorizationCode"] = thisbasket["info"]["bankingData"]["authorizationCode"]; //Код авторизации платежа } }catch(err){ } try{ if(thisbasket["info"]["bankingData"]["terminalID"]){ electronicObj["numberTerminal"] = thisbasket["info"]["bankingData"]["terminalID"]; //Номер платежного терминала } }catch(err){ } jsonData.payments.push(electronicObj); } console.error(thisbasket); //var deviceObj = thisbasket["printer"] //Вызов return new Promise(function(resolve, reject) { if(ifartprint == true){ console.error("MINI FP", jsonData) app.print.protocols.minifp_usb_skyapp_windows_v2.ExecuteCommand(jsonData, thisbasket.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }else{ resolve({"status":"done"}); } }); }, vozvrat: function(thisbasket) { //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; var allrealsum = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; var nallll = 0; var newfiscalarr = []; var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); //Собираем нужный массив и убираем позиции которые не подлежат налогообложению fiscalarr.forEach(function(item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } if (item["tax"] != "") { flag = 1; var newitem = {}; //Костыльчик который убирает с имени товара приставку веса try{ if(item.quantity == "100g" || item.quantity == "100ml"){ item["name"] = preload.products[currentsklad][item.idtovara]["name"]; } }catch(err){ } if(item.uktzed != '' && item.uktzed != null){ newitem["name"] = item["name"]; }else{ newitem["name"] = item["name"]; } newitem["quantity"] = round(item["kolvo"], 3); newitem["price"] = round(item["cenaout"], 2); if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } newitem["amount"] = amount; newitem["code"] = item["id"]; newitem["type"] = "position"; newitem["tax"] = round(item["tax"],0); newitem["unit"] = "ves"; // "infoDiscountAmount": 0.0, //"measurementUnit": "кг", //"paymentMethod": "advance", //"paymentObject": "commodity", //"nomenclatureCode": "MTIzNDEyMzQ1Njc4MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=", newfiscalarr.push(newitem); allrealsum = allrealsum + amount; } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } kostilsumm = kostilsumm + amount; } }); if (kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы онлайн кассе"); } // Вызов команды var jsonData = { "type": "sellReturn", "taxationType": thisbasket["printer"]["cno"], "operator": { "id": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_pin"] }, "items": newfiscalarr, "payments": [] }; try{ if(thisbasket["printer"]["cno"] == "" || thisbasket["printer"]["cno"] == undefined){ delete jsonData["taxationType"]; } }catch(err){ } //Наличка if(thisbasket["info"]["cash"] > 0){ jsonData["payments"].push({ "type": "cash", "sum": round(thisbasket["info"]["cash"], 2) }); } var electronicSum = null; //Безнал if(thisbasket["info"]["visa"] > 0){ if(thisbasket["info"]["visa"] > allrealsum){ electronicSum = round(allrealsum, 2); }else{ electronicSum = round(thisbasket["info"]["visa"], 2); } } if(electronicSum){ var electronicObj = { "type": "electronically", "sum": electronicSum }; try{ if(thisbasket["info"]["bankingData"]["rrn"]){ electronicObj["rrn"] = thisbasket["mosst"]["bankingData"]["rrn"]; //RRN (Reference Retrieval Number) платежа } }catch(err){ } try{ if(thisbasket["info"]["bankingData"]["bankName"]){ electronicObj["bankName"] = thisbasket["mosst"]["bankingData"]["bankName"]; //Название банка } }catch(err){ } try{ if(thisbasket["info"]["bankingData"]["cardNumber"]){ electronicObj["numberCard"] = thisbasket["mosst"]["bankingData"]["cardNumber"]; //Номер карты клиента } }catch(err){ } try{ if(thisbasket["info"]["bankingData"]["authorizationCode"]){ electronicObj["authorizationCode"] = thisbasket["mosst"]["bankingData"]["authorizationCode"]; //Код авторизации платежа } }catch(err){ } try{ if(thisbasket["info"]["bankingData"]["terminalID"]){ electronicObj["numberTerminal"] = thisbasket["mosst"]["bankingData"]["terminalID"]; //Номер платежного терминала } }catch(err){ } jsonData.payments.push(electronicObj); } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_usb_skyapp_windows_v2.ExecuteCommand(jsonData, thisbasket.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, precheck: function(thisbasket) { var stringlength = 48; var lineh = ""; for (var i = 0; i < stringlength; i++) { lineh = lineh + "-"; } var newfiscalarr = []; try { newfiscalarr.push({ "type": "text", "text": "Заказ:" + thisbasket["info"]["id"], "alignment": "center" }) } catch (err) {} newfiscalarr.push({ "type": "text", "text": "Счёт на оплату", "alignment": "center" }) try { if (thisbasket.info["type"] == "delivery") { /*Адрес на пречек*/ if (thisbasket.info.client > 0) { var thisclient = preload["clients"][thisbasket.info.client]; if (thisclient.name != "") { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["FIO"] + ":" + thisclient.name }); } if (thisclient.phone != "") { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["telefon"] + ":" + thisclient.phone }); } if (thisbasket["info"]["adress"] != "") { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["adres"] + ":" + thisbasket["info"]["adress"], }); } } } } catch (err) {} newfiscalarr.push({ "type": "text", "text": lineh, "alignment": "center" }) var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); fiscalarr.forEach(function(item, i) { //Собираем нужный массив newfiscalarr.push({ "type": "text", "text": fiscalarr[i]["name"], "alignment": "left" }) newfiscalarr.push({ "type": "text", "text": CurrencyFormatted(fiscalarr[i]["kolvo"], 3) + " * " + CurrencyFormatted(fiscalarr[i]["cenaout"]) + " = " + CurrencyFormatted(fiscalarr[i]["cenaout"] * fiscalarr[i]["kolvo"]), "alignment": "right" }) }); newfiscalarr.push({ "type": "text", "text": lineh, "alignment": "center" }) if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { if(thisbasket.info.cashdiscount > 0){ var dstring = CurrencyFormatted(thisbasket.info.cashdiscount); }else{ var dstring = thisbasket.info.discounttitle; } //Со скидкой newfiscalarr.push({ "type": "text", "text": app.print.modules.escposstr(1, stringlength, "СКИДКА:", dstring), "alignment": "left" }) } newfiscalarr.push({ "type": "text", "text": app.print.modules.escposstr(1, stringlength, "ИТОГ:", CurrencyFormatted(thisbasket["info"]["allcena"])), "alignment": "left" }) newfiscalarr.push({ "type": "text", "text": lineh, "alignment": "center" }) if (thisbasket["info"]["comment"] != "" && thisbasket["info"]["comment"] != undefined && thisbasket.info["checkcomments"] == 1) { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["Kommentariy_k_z_r2za7"] + ":" + thisbasket["info"]["comment"], }); } newfiscalarr.push({ "type": "text", "text": "НЕ ФИСКАЛЬНЫЙ", "alignment": "center" }) var jsonData = { "type": "nonFiscal", "items": newfiscalarr } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_android.ExecuteCommand(jsonData, thisbasket.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, XReport: function(data) { var jsonData = { "type": "reportX", "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_usb_skyapp_windows_v2.ExecuteCommand(jsonData, data.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, X3Report: function(data) { var jsonData = { "type": "reportX3", "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_usb_skyapp_windows_v2.ExecuteCommand(jsonData, data.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, ZReport: function(data) { var jsonData = { "type": "closeShift", "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_usb_skyapp_windows_v2.ExecuteCommand(jsonData, data.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, introduction: function(data) { var jsonData = { "type": "cashIn", "cashSum": round(data["cash"]), "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_usb_skyapp_windows_v2.ExecuteCommand(jsonData, data.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, incasation: function(data) { var jsonData = { "type": "cashOut", "cashSum": round(data["cash"]), "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_usb_skyapp_windows_v2.ExecuteCommand(jsonData, data.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, rashod: function(data) { var jsonData = { "type": "cashOut", "cashSum": round(data["cash"]), "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_usb_skyapp_windows_v2.ExecuteCommand(jsonData, data.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, getUser: function(name){ if(minifp["usersbase"][name]){ console.log("true"); return minifp["usersbase"][name]["id"]; }else{ console.log("false"); minifp["usersbase"][name] = { id:minifp["usersbase_count"], name:name } minifp["usersbase_count"]++; localStorage["minifp_usersbase"] = JSON.stringify(minifp["usersbase"]) return minifp["usersbase"][name]["id"]; } }, ExecuteCommand: function(Data, printer) { console.log("minifp ExecuteCommand",Data); try{ Data.operator.id = this.getUser(Data.operator.name); //alert(Data.operator.id+" "+Data.operator.name); console.log(Data.operator.id); if(Data.operator.id > 31){ app.main.error("minifp: Порядковий номер співробітника більше ніж 31, код пимилки: 8163"); } }catch(err){ app.main.error("Не вдалось отримати номер співробітника, код пимилки: 8164"); } app.main.loader("show"); return new Promise(function(resolve, reject) { try { var request = { method: "fiscalOperation", data: JSON.stringify({ deviceId:printer["id"], protocol:printer["protocol"], jsonObjectData:Data }) } console.log("minifp ExecuteCommand request",request); window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { try{ console.log(response) var content2 = JSON.parse(response); if (content2.status == "done") { app.main.loader("hide"); resolve({ status: "done", data: content2 }); } if (content2.status == "error") { app.main.error("miniFP: "+content2["errorCode"]+" - "+app.print.protocols.minifp_usb_skyapp_windows_v2.codeErro(content2["errorCode"])); app.main.loader("hide"); reject({ status: "error", data: content2 }); } }catch(err){ console.error("Устройство minifp не найдено",err); app.main.loader("hide"); reject({ status: "error" }); } }, onFailure: function(error_code, error_message) { reject({ status: "error", data: error_message }); } }); } catch (err) { console.error("Устройство minifp не найдено",err); app.main.loader("hide"); reject({ status: "error" }); } }) } }, minifp_ip_android:{ codeErro: function(code){ var minifpErr = []; minifpErr["1"] = "Нет возможности запустить команду"; minifpErr["2"] = "Невозможно обработать команду"; minifpErr["3"] = "Код команды отсутствует"; minifpErr["4"] = "Много данных в команде"; minifpErr["5"] = "Недостаточно данных в команде"; minifpErr["6"] = "Ошибка при приеме данных"; minifpErr["7"] = "Недопустимый идентификатор команды"; minifpErr["8"] = "Невозможно выполнить команду"; minifpErr["10"] = "ошибка ввода"; minifpErr["11"] = "необходимо снять z1 отчет"; minifpErr["12"] = "скидки/наценки запрещены"; minifpErr["13"] = "переполнение по чеку"; minifpErr["14"] = "команда запрещена"; minifpErr["15"] = "кассир не зарегистрирован"; minifpErr["16"] = "отрицательная сумма"; minifpErr["17"] = "количество товара отрицательное"; minifpErr["18"] = "время смены исчерпано"; minifpErr["19"] = "неверный тип оплаты"; minifpErr["20"] = "неправильная или отсутствующая цена"; minifpErr["21"] = "неверный параметр на входе команды"; minifpErr["22"] = "товар находится в открытом чеке, нельзя редактировать"; minifpErr["23"] = "некорректно запрограммированный товар"; minifpErr["24"] = "неверный или отсутствующий штрихкод товара"; minifpErr["27"] = "неверный или отсутствующий код товара"; minifpErr["28"] = "товар не весовой(штучный)"; minifpErr["29"] = "ФП почти заполнена"; minifpErr["30"] = "ФП заполнена"; minifpErr["31"] = "память инициализаций заполнена"; minifpErr["32"] = "есть отложенная операция, оплата запрещена"; minifpErr["33"] = "карточка клиента не принята"; minifpErr["34"] = "не хватает денег на сдачу"; minifpErr["35"] = "запрещена комбинированная оплата"; minifpErr["36"] = "неправильный номер кассира"; minifpErr["37"] = "места недостаточно"; minifpErr["38"] = "нет места в Журнале"; minifpErr["39"] = "нет места в базе товаров"; minifpErr["40"] = "нет места в Архиве"; minifpErr["41"] = "товар есть комплекс"; minifpErr["42"] = "код не принадлежит комплексу"; minifpErr["43"] = "РРО занят и не может выполнить команду"; minifpErr["44"] = "необходимо выполнить Z1 отчет"; minifpErr["45"] = "неправильный пароль кассира"; minifpErr["46"] = "комплекс нельзя продать"; minifpErr["47"] = "цена товара указана"; minifpErr["48"] = "отмена запрещена"; minifpErr["49"] = "продажа товара запрещена"; minifpErr["50"] = "ошибка чтения ФП"; minifpErr["51"] = "номер производителя неверен"; minifpErr["52"] = "ошибка записи во флеш"; minifpErr["54"] = "товар нельзя удалить"; minifpErr["55"] = "нет данных в ФП"; minifpErr["56"] = "неверный пароль налогового инспектора"; minifpErr["57"] = "неверный пароль администратора"; minifpErr["58"] = "неверный пароль старшего кассира"; minifpErr["60"] = "РРО заблокирован. Истекло время для передачи данных"; minifpErr["61"] = "РРО заблокирован. Персонализация не проведена"; minifpErr["67"] = "ошибка работы с SAM"; minifpErr["68"] = "есть неотправленные документы"; minifpErr["69"] = "документы отсутствуют"; minifpErr["70"] = "вал отсутствует"; minifpErr["71"] = "нет питания 3.3В на плате клавиатуры"; minifpErr["79"] = "дата сервисного обслуживания превышена"; minifpErr["80"] = "ошибка записи в ФП"; minifpErr["81"] = "ошибка часов реального времени, дата последнего Z1 отчета больше текущей"; minifpErr["82"] = "ошибка данных в интерфейсе"; minifpErr["83"] = "ошибка часов реального времени, дата/время последнего документа больше текущей"; minifpErr["86"] = "отсутствует индикатор клиента"; minifpErr["91"] = "напряжение питания превышает допустимое"; minifpErr["92"] = "напряжение питания ниже допустимого"; minifpErr["93"] = "критическое снижение напряжения питания"; minifpErr["95"] = "температура термоголовки ниже допустимой"; minifpErr["96"] = "температура термоголовки превышает допустимую"; minifpErr["97"] = "нет бумаги"; minifpErr["200"] = "выключен коммуникационный блок"; minifpErr["201"] = "нет связи с коммуникационном блоком"; minifpErr["203"] = "карточка не принята"; minifpErr["205"] = "ошибка платежного терминала"; minifpErr["206"] = "ошибка транзакции"; minifpErr["207"] = "невозможность выполнить операцию"; minifpErr["208"] = "отмена операции"; minifpErr["209"] = "операция прервана"; minifpErr["241"] = "носитель нуждается в форматировании"; minifpErr["242"] = "носитель отсутствует"; minifpErr["254"] = "носитель заполнен"; minifpErr["257"] = "ошибка SAM модуля"; minifpErr["258"] = "не правильный ID DEV"; minifpErr["259"] = "не правильный ID SAM"; minifpErr["260"] = "ошибка SAM модуля"; minifpErr["261"] = "ошибка инициализации SAM модуля"; minifpErr["262"] = "ошибка SAM модуля"; minifpErr["263"] = "нет ID_DEV"; minifpErr["264"] = "SAM модуль не персонализирован"; minifpErr["265"] = "ошибка SAM модуля"; minifpErr["266"] = "ошибка SAM модуля"; minifpErr["267"] = "ошибка синхронной сессии"; minifpErr["268"] = "ошибка подписи MAC"; minifpErr["269"] = "неудовлетворительное использование"; minifpErr["270"] = "ошибка обмена данными с SAM"; minifpErr["271"] = "ошибка обмена данными с SAM"; minifpErr["272"] = "ошибка обмена данными с SAM"; minifpErr["273"] = "Ошибка обмена данными с SAM"; minifpErr["274"] = "Ошибка обмена данными с SAM"; minifpErr["275"] = "Ошибка обмена данными"; minifpErr["276"] = "Неверная версия VkMAC"; minifpErr["288"] = "Ошибка персонализации SAM"; minifpErr["545"] = "Ошибка персонализации SAM"; minifpErr["289"] = "Ошибка персонализации РРО"; minifpErr["546"] = "Ошибка персонализации РРО"; minifpErr["290"] = "Ошибка передачи данных"; minifpErr["547"] = "Ошибка передачи данных"; minifpErr["300"] = "Ошибка подключения к серверу"; minifpErr["301"] = "Ошибка подключения к коммуникационному блоку"; minifpErr["302"] = "Ошибка подключения к серверу"; minifpErr["303"] = "Ошибка сети"; minifpErr["304"] = "Ошибка коммуникационного блока"; minifpErr["305"] = "Ошибка передачи данных"; minifpErr["307"] = "Ошибка коммуникационного блока"; minifpErr["308"] = "Ошибка формата URL"; minifpErr["900"] = "Ошибка файловой системы при поиске документов"; minifpErr["901"] = "Ошибка размера файла"; minifpErr["902"] = "Превышение времени ожидания ответа"; minifpErr["903"] = "Ошибка целостности данных на носителе"; minifpErr["1001"] = "Слишком длинное наименование товара"; minifpErr["1002"] = "Нет ответа"; return minifpErr[code]; }, opensmena: function(data) { //Вызов return new Promise(function(resolve, reject) { resolve({ status: "done" }); }); }, opendrawer: function(data) { var jsonData = { "type": "openDrawer", "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_android.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, check: function(thisbasket) { var ifartprint = false; console.log("minifp_android", thisbasket); var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); var newfiscalarr = []; try { newfiscalarr.push({ "type": "text", "text": "Замовлення:" + thisbasket["info"]["id"], "alignment": "center" }) } catch (err) {} //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; var kostilsummRRO = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; //Собираем нужный массив и убираем позиции которые не подлежат налогообложению fiscalarr.forEach(function(item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } if (item["tax"] != "") { ifartprint = true; flag = 1; var newitem = {} //Костыльчик который убирает с имени товара приставку веса try{ if(item.type == "mod" ){ if(item.quantity == "100g" || item.quantity == "100ml"){ item["name"] = preload.products[currentsklad][item.id]["name"]; } } }catch(err){ } if(item.uktzed != '' && item.uktzed != null){ newitem["name"] = item.uktzed+"#"+item["name"]; }else{ newitem["name"] = item["name"]; } newitem["quantity"] = round(item["kolvo"], 3); if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { //Если скидка есть amount = round(item["cenaout_discount"] * item["kolvo"],2); //цена после скидки и округления if(okruglenie != 0){ newitem["price"] = round(item["cenaold_discount"], 2); //цена до скидки и округления }else{ newitem["price"] = round(item["cenaout"], 2); //цена до скидки и округления если округления не было } } else { //Если скидки нет if(okruglenie != 0){ newitem["price"] = round(item["cenaold"], 2); //цена до скидки и округления }else{ newitem["price"] = round(item["cenaout"], 2); //цена до скидки и округления если округления не было } amount = round(item["cenaout"] * item["kolvo"],2); //цена без скидки но с округлением } newitem["amount"] = amount; kostilsummRRO = kostilsummRRO + amount; newitem["code"] = item["id"]; newitem["type"] = "position"; newitem["unit"] = "ves"; newitem["tax"] = round(item["tax"],0); try{ if(thisbasket["info"]["nopaymentstype"] == "debt"){ newitem["paymentMethod"] = "credit"; } }catch(err){ } //fullPrepayment - предоплата 100% //prepayment - предоплата //advance - аванс //fullPayment - полный расчет - по умолчанию //partialPayment - частичный расчет и кредит //credit - передача в кредит //creditPayment - оплата кредита // "infoDiscountAmount": 0.0, //"measurementUnit": "кг", //"paymentMethod": "advance", //"paymentObject": "commodity", //"nomenclatureCode": "MTIzNDEyMzQ1Njc4MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=", newfiscalarr.push(newitem) console.log("iiitem",newitem) } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } kostilsumm = kostilsumm + amount; } }); if (thisbasket["info"]["comment"] != "" && thisbasket["info"]["comment"] != undefined && thisbasket.info["checkcomments"] == 1) { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["Kommentariy_k_z_r2za7"] + ":" + thisbasket["info"]["comment"], }); } var dali = thisbasket["info"]["cash"]; if (thisbasket["info"]["nall"] > 0) { dali = thisbasket["info"]["nall"] } //Отнимаем от суммы которую дал клиент сумму товара который не пошел на печать на фискальник dali = dali - kostilsumm; if (kostilsumm > 0) { app.main.message("Деякі товари на суму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не були передані на фіскальний реєстратор"); } var jsonData = { "type": "sell", "taxationType": thisbasket["printer"]["cno"], "operator": { "id": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_pin"] }, "items": newfiscalarr, "payments": [], /* "discount":{ "type":"sum", //per "discount":-0.21 } */ }; try{ if(thisbasket["printer"]["cno"] == "" || thisbasket["printer"]["cno"] == undefined){ delete jsonData["taxationType"]; } }catch(err){ } /*Сумма электронной оплаты (2 знака после запятой)*/ try { var ElectronicPayment = round(thisbasket["info"]["visa"]); } catch (err) { var ElectronicPayment = 0; } //Костыль для починки minifp бага c большей суммой налички при сдвоенной оплате if(ElectronicPayment < kostilsummRRO){ if(thisbasket["info"]["cash"] > 0){ jsonData.payments.push({ "type": "cash", "sum": dali }) } } //Если сумма оплаты картой больше чем сумма товаров переданных на рро if(ElectronicPayment > kostilsummRRO){ if(kostilsummRRO > 0){ jsonData.payments.push({ "type": "electronically", "sum": kostilsummRRO }) } }else{ if (ElectronicPayment > 0) { jsonData.payments.push({ "type": "electronically", "sum": ElectronicPayment }) } } //Вызов return new Promise(function(resolve, reject) { if(ifartprint == true){ app.print.protocols.minifp_android.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }else{ resolve({"status":"done"}); } }); }, vozvrat: function(thisbasket) { //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; var allrealsum = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; var nallll = 0; var newfiscalarr = []; var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); //Собираем нужный массив и убираем позиции которые не подлежат налогообложению fiscalarr.forEach(function(item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } if (item["tax"] != "") { flag = 1; var newitem = {}; //Костыльчик который убирает с имени товара приставку веса try{ if(item.quantity == "100g" || item.quantity == "100ml"){ item["name"] = preload.products[currentsklad][item.idtovara]["name"]; } }catch(err){ } if(item.uktzed != '' && item.uktzed != null){ newitem["name"] = item.uktzed+"#"+item["name"]; }else{ newitem["name"] = item["name"]; } newitem["quantity"] = round(item["kolvo"], 3); newitem["price"] = round(item["cenaout"], 2); if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } newitem["amount"] = amount; newitem["code"] = item["id"]; newitem["type"] = "position"; newitem["tax"] = round(item["tax"],0); newitem["unit"] = "ves"; // "infoDiscountAmount": 0.0, //"measurementUnit": "кг", //"paymentMethod": "advance", //"paymentObject": "commodity", //"nomenclatureCode": "MTIzNDEyMzQ1Njc4MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=", newfiscalarr.push(newitem); allrealsum = allrealsum + amount; } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } kostilsumm = kostilsumm + amount; } }); if (kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы онлайн кассе"); } // Вызов команды var jsonData = { "type": "sellReturn", "taxationType": thisbasket["printer"]["cno"], "operator": { "id": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_pin"] }, "items": newfiscalarr, "payments": [] }; try{ if(thisbasket["printer"]["cno"] == "" || thisbasket["printer"]["cno"] == undefined){ delete jsonData["taxationType"]; } }catch(err){ } //Наличка if(thisbasket["info"]["cash"] > 0){ jsonData["payments"].push({ "type": "cash", "sum": round(thisbasket["info"]["cash"], 2) }); } //Безнал if(thisbasket["info"]["visa"] > 0){ if(thisbasket["info"]["visa"] > allrealsum){ jsonData["payments"].push({ "type": "electronically", "sum": round(allrealsum, 2) }); }else{ jsonData["payments"].push({ "type": "electronically", "sum": round(thisbasket["info"]["visa"], 2) }); } } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_android.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, precheck: function(thisbasket) { var stringlength = 48; var lineh = ""; for (var i = 0; i < stringlength; i++) { lineh = lineh + "-"; } var newfiscalarr = []; try { newfiscalarr.push({ "type": "text", "text": "Заказ:" + thisbasket["info"]["id"], "alignment": "center" }) } catch (err) {} newfiscalarr.push({ "type": "text", "text": "Счёт на оплату", "alignment": "center" }) try { if (thisbasket.info["type"] == "delivery") { /*Адрес на пречек*/ if (thisbasket.info.client > 0) { var thisclient = preload["clients"][thisbasket.info.client]; if (thisclient.name != "") { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["FIO"] + ":" + thisclient.name }); } if (thisclient.phone != "") { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["telefon"] + ":" + thisclient.phone }); } if (thisbasket["info"]["adress"] != "") { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["adres"] + ":" + thisbasket["info"]["adress"], }); } } } } catch (err) {} newfiscalarr.push({ "type": "text", "text": lineh, "alignment": "center" }) var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); fiscalarr.forEach(function(item, i) { //Собираем нужный массив newfiscalarr.push({ "type": "text", "text": fiscalarr[i]["name"], "alignment": "left" }) newfiscalarr.push({ "type": "text", "text": CurrencyFormatted(fiscalarr[i]["kolvo"], 3) + " * " + CurrencyFormatted(fiscalarr[i]["cenaout"]) + " = " + CurrencyFormatted(fiscalarr[i]["cenaout"] * fiscalarr[i]["kolvo"]), "alignment": "right" }) }); newfiscalarr.push({ "type": "text", "text": lineh, "alignment": "center" }) if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { if(thisbasket.info.cashdiscount > 0){ var dstring = CurrencyFormatted(thisbasket.info.cashdiscount); }else{ var dstring = thisbasket.info.discounttitle; } //Со скидкой newfiscalarr.push({ "type": "text", "text": app.print.modules.escposstr(1, stringlength, "СКИДКА:", dstring), "alignment": "left" }) } newfiscalarr.push({ "type": "text", "text": app.print.modules.escposstr(1, stringlength, "ИТОГ:", CurrencyFormatted(thisbasket["info"]["allcena"])), "alignment": "left" }) newfiscalarr.push({ "type": "text", "text": lineh, "alignment": "center" }) if (thisbasket["info"]["comment"] != "" && thisbasket["info"]["comment"] != undefined && thisbasket.info["checkcomments"] == 1) { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["Kommentariy_k_z_r2za7"] + ":" + thisbasket["info"]["comment"], }); } newfiscalarr.push({ "type": "text", "text": "НЕ ФИСКАЛЬНЫЙ", "alignment": "center" }) var jsonData = { "type": "nonFiscal", "items": newfiscalarr } //Вызов return new Promise(function(resolve, reject) { // app.print.protocols.minifp_android.ExecuteCommand(jsonData).then(function(success) { resolve(success); // }, function(error) { // reject(error); // }) }); }, XReport: function(data) { var jsonData = { "type": "reportX", "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_android.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, X3Report: function(data) { var jsonData = { "type": "reportX3", "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_android.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, ZReport: function(data) { var jsonData = { "type": "closeShift", "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_android.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, introduction: function(data) { var jsonData = { "type": "cashIn", "cashSum": round(data["cash"]), "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_android.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, incasation: function(data) { var jsonData = { "type": "cashOut", "cashSum": round(data["cash"]), "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_android.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, rashod: function(data) { var jsonData = { "type": "cashOut", "cashSum": round(data["cash"]), "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_android.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, getUser: function(name){ if(minifp["usersbase"][name]){ console.log("true"); return minifp["usersbase"][name]["id"]; }else{ console.log("false"); minifp["usersbase"][name] = { id:minifp["usersbase_count"], name:name } minifp["usersbase_count"]++; localStorage["minifp_usersbase"] = JSON.stringify(minifp["usersbase"]) return minifp["usersbase"][name]["id"]; } }, ExecuteCommand: function(Data) { try{ Data.operator.id = this.getUser(Data.operator.name); //alert(Data.operator.id+" "+Data.operator.name); console.log(Data.operator.id); if(Data.operator.id > 31){ app.main.error("minifp: Порядковий номер співробітника більше ніж 31, код пимилки: 8163"); } }catch(err){ app.main.error("Не вдалось отримати номер співробітника, код пимилки: 8164"); } app.main.loader("show"); return new Promise(function(resolve, reject) { try { Android.miniFP(JSON.stringify(Data)); returnMiniFP.status = "empty"; try { /*На тот случай если прошлое ожидание не было завершено*/ clearInterval(waitingMiniFP); } catch (err) { /*Скорей всего уже было завершено*/ } var waitingMiniFP = setInterval(function() { console.log("Опрашиваем minifp") if (returnMiniFP.status == "done") { clearInterval(waitingMiniFP); app.main.loader("hide"); resolve({ status: "done", data: returnMiniFP }); } if (returnMiniFP.status == "error") { clearInterval(waitingMiniFP); app.main.loader("hide"); reject({ status: "error", data: returnMiniFP }); } }, 500); } catch (err) { console.log("Устройство minifp не найдено"); app.main.loader("hide"); reject({ status: "error" }); } }) }, ReturnCommand: function(jsondata) { var response = JSON.parse(jsondata) app.main.loader("hide"); if (response["status"] == "done") { returnMiniFP = response; } else { response["status"] = "error"; returnMiniFP = response; app.main.error("miniFP: "+response["errorCode"]+" - "+this.codeErro(response["errorCode"])); } }, ReturnSettings: function(jsondata) { //var atolsetings = JSON.parse(jsondata); //app.main.message("Сервисная информация"+"

"+"Model "+atolsetings.Model+"
"+"AccessPassword "+atolsetings.AccessPassword+"
"+"AutoDisableBluetooth "+atolsetings.AutoDisableBluetooth+"
"+"AutoEnableBluetooth "+atolsetings.AutoEnableBluetooth+"
"+"BaudRate "+atolsetings.BaudRate+"
"+"Bits "+atolsetings.Bits+"
"+"ComFile "+atolsetings.ComFile+"
"+"IPAddress "+atolsetings.IPAddress+"
"+"IPPort "+atolsetings.IPPort+"
"+"LibraryPath "+atolsetings.LibraryPath+"
"+"MACAddress "+atolsetings.MACAddress+"
"+"OfdChannel "+atolsetings.OfdChannel+"
"+"Parity "+atolsetings.Parity+"
"+"Port "+atolsetings.Port+"
"+"StopBits "+atolsetings.StopBits+"
"+"UsbDevicePath "+atolsetings.UsbDevicePath+"
"+"UserPassword "+atolsetings.UserPassword) app.main.message("Ответ от драйвера получен, для продолжение сохраните настройки"); $("#Atol10SettingsButton").removeClass("btn-danger"); $("#Atol10SettingsButton").addClass("btn-info"); $("#settings_device_list_edit_form_settings").val(JSON.stringify(jsondata)); }, }, minifp_ip_skyapp_windows:{ codeErro: function(code){ var minifpErr = []; minifpErr["1"] = "Нет возможности запустить команду"; minifpErr["2"] = "Невозможно обработать команду"; minifpErr["3"] = "Код команды отсутствует"; minifpErr["4"] = "Много данных в команде"; minifpErr["5"] = "Недостаточно данных в команде"; minifpErr["6"] = "Ошибка при приеме данных"; minifpErr["7"] = "Недопустимый идентификатор команды"; minifpErr["8"] = "Невозможно выполнить команду"; minifpErr["10"] = "ошибка ввода"; minifpErr["11"] = "необходимо снять z1 отчет"; minifpErr["12"] = "скидки/наценки запрещены"; minifpErr["13"] = "переполнение по чеку"; minifpErr["14"] = "команда запрещена"; minifpErr["15"] = "кассир не зарегистрирован"; minifpErr["16"] = "отрицательная сумма"; minifpErr["17"] = "количество товара отрицательное"; minifpErr["18"] = "время смены исчерпано"; minifpErr["19"] = "неверный тип оплаты"; minifpErr["20"] = "неправильная или отсутствующая цена"; minifpErr["21"] = "неверный параметр на входе команды"; minifpErr["22"] = "товар находится в открытом чеке, нельзя редактировать"; minifpErr["23"] = "некорректно запрограммированный товар"; minifpErr["24"] = "неверный или отсутствующий штрихкод товара"; minifpErr["27"] = "неверный или отсутствующий код товара"; minifpErr["28"] = "товар не весовой(штучный)"; minifpErr["29"] = "ФП почти заполнена"; minifpErr["30"] = "ФП заполнена"; minifpErr["31"] = "память инициализаций заполнена"; minifpErr["32"] = "есть отложенная операция, оплата запрещена"; minifpErr["33"] = "карточка клиента не принята"; minifpErr["34"] = "не хватает денег на сдачу"; minifpErr["35"] = "запрещена комбинированная оплата"; minifpErr["36"] = "неправильный номер кассира"; minifpErr["37"] = "места недостаточно"; minifpErr["38"] = "нет места в Журнале"; minifpErr["39"] = "нет места в базе товаров"; minifpErr["40"] = "нет места в Архиве"; minifpErr["41"] = "товар есть комплекс"; minifpErr["42"] = "код не принадлежит комплексу"; minifpErr["43"] = "РРО занят и не может выполнить команду"; minifpErr["44"] = "необходимо выполнить Z1 отчет"; minifpErr["45"] = "неправильный пароль кассира"; minifpErr["46"] = "комплекс нельзя продать"; minifpErr["47"] = "цена товара указана"; minifpErr["48"] = "отмена запрещена"; minifpErr["49"] = "продажа товара запрещена"; minifpErr["50"] = "ошибка чтения ФП"; minifpErr["51"] = "номер производителя неверен"; minifpErr["52"] = "ошибка записи во флеш"; minifpErr["54"] = "товар нельзя удалить"; minifpErr["55"] = "нет данных в ФП"; minifpErr["56"] = "неверный пароль налогового инспектора"; minifpErr["57"] = "неверный пароль администратора"; minifpErr["58"] = "неверный пароль старшего кассира"; minifpErr["60"] = "РРО заблокирован. Истекло время для передачи данных"; minifpErr["61"] = "РРО заблокирован. Персонализация не проведена"; minifpErr["67"] = "ошибка работы с SAM"; minifpErr["68"] = "есть неотправленные документы"; minifpErr["69"] = "документы отсутствуют"; minifpErr["70"] = "вал отсутствует"; minifpErr["71"] = "нет питания 3.3В на плате клавиатуры"; minifpErr["79"] = "дата сервисного обслуживания превышена"; minifpErr["80"] = "ошибка записи в ФП"; minifpErr["81"] = "ошибка часов реального времени, дата последнего Z1 отчета больше текущей"; minifpErr["82"] = "ошибка данных в интерфейсе"; minifpErr["83"] = "ошибка часов реального времени, дата/время последнего документа больше текущей"; minifpErr["86"] = "отсутствует индикатор клиента"; minifpErr["91"] = "напряжение питания превышает допустимое"; minifpErr["92"] = "напряжение питания ниже допустимого"; minifpErr["93"] = "критическое снижение напряжения питания"; minifpErr["95"] = "температура термоголовки ниже допустимой"; minifpErr["96"] = "температура термоголовки превышает допустимую"; minifpErr["97"] = "нет бумаги"; minifpErr["200"] = "выключен коммуникационный блок"; minifpErr["201"] = "нет связи с коммуникационном блоком"; minifpErr["203"] = "карточка не принята"; minifpErr["205"] = "ошибка платежного терминала"; minifpErr["206"] = "ошибка транзакции"; minifpErr["207"] = "невозможность выполнить операцию"; minifpErr["208"] = "отмена операции"; minifpErr["209"] = "операция прервана"; minifpErr["241"] = "носитель нуждается в форматировании"; minifpErr["242"] = "носитель отсутствует"; minifpErr["254"] = "носитель заполнен"; minifpErr["257"] = "ошибка SAM модуля"; minifpErr["258"] = "не правильный ID DEV"; minifpErr["259"] = "не правильный ID SAM"; minifpErr["260"] = "ошибка SAM модуля"; minifpErr["261"] = "ошибка инициализации SAM модуля"; minifpErr["262"] = "ошибка SAM модуля"; minifpErr["263"] = "нет ID_DEV"; minifpErr["264"] = "SAM модуль не персонализирован"; minifpErr["265"] = "ошибка SAM модуля"; minifpErr["266"] = "ошибка SAM модуля"; minifpErr["267"] = "ошибка синхронной сессии"; minifpErr["268"] = "ошибка подписи MAC"; minifpErr["269"] = "неудовлетворительное использование"; minifpErr["270"] = "ошибка обмена данными с SAM"; minifpErr["271"] = "ошибка обмена данными с SAM"; minifpErr["272"] = "ошибка обмена данными с SAM"; minifpErr["273"] = "Ошибка обмена данными с SAM"; minifpErr["274"] = "Ошибка обмена данными с SAM"; minifpErr["275"] = "Ошибка обмена данными"; minifpErr["276"] = "Неверная версия VkMAC"; minifpErr["288"] = "Ошибка персонализации SAM"; minifpErr["545"] = "Ошибка персонализации SAM"; minifpErr["289"] = "Ошибка персонализации РРО"; minifpErr["546"] = "Ошибка персонализации РРО"; minifpErr["290"] = "Ошибка передачи данных"; minifpErr["547"] = "Ошибка передачи данных"; minifpErr["300"] = "Ошибка подключения к серверу"; minifpErr["301"] = "Ошибка подключения к коммуникационному блоку"; minifpErr["302"] = "Ошибка подключения к серверу"; minifpErr["303"] = "Ошибка сети"; minifpErr["304"] = "Ошибка коммуникационного блока"; minifpErr["305"] = "Ошибка передачи данных"; minifpErr["307"] = "Ошибка коммуникационного блока"; minifpErr["308"] = "Ошибка формата URL"; minifpErr["900"] = "Ошибка файловой системы при поиске документов"; minifpErr["901"] = "Ошибка размера файла"; minifpErr["902"] = "Превышение времени ожидания ответа"; minifpErr["903"] = "Ошибка целостности данных на носителе"; minifpErr["1001"] = "Слишком длинное наименование товара"; minifpErr["1002"] = "Нет ответа"; return minifpErr[code]; }, opensmena: function(data) { //Вызов return new Promise(function(resolve, reject) { resolve({ status: "done" }); }); }, opendrawer: function(data) { var jsonData = { "type": "openDrawer", "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_usb_skyapp_windows.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, check: function(thisbasket) { var ifartprint = false; console.log("minifp_android", thisbasket); var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); var newfiscalarr = []; try { newfiscalarr.push({ "type": "text", "text": "Замовлення:" + thisbasket["info"]["id"], "alignment": "center" }) } catch (err) {} //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; var kostilsummRRO = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; //Собираем нужный массив и убираем позиции которые не подлежат налогообложению fiscalarr.forEach(function(item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } if (item["tax"] != "") { flag = 1; ifartprint = true; var newitem = {}; //Костыльчик который убирает с имени товара приставку веса try{ if(item.type == "mod" ){ if(item.quantity == "100g" || item.quantity == "100ml"){ item["name"] = preload.products[currentsklad][item.id]["name"]; } } }catch(err){ } if(item.uktzed != '' && item.uktzed != null){ newitem["name"] = item.uktzed+"#"+item["name"]; }else{ newitem["name"] = item["name"]; } newitem["quantity"] = round(item["kolvo"], 3); if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { //Если скидка есть if(okruglenie != 0){ // alert("s1"); // newitem["price"] = round(item["cenaold_discount"], 2); //цена до скидки и округления amount = round(round(item["cenaout_discount"],2) * item["kolvo"],2); //цена после скидки и округления }else{ // alert("s2"); // newitem["price"] = round(item["cenaout"], 2); //цена до скидки и округления если округления не было amount = round(round(item["cenaout_discount"],2) * item["kolvo"],2); //цена после скидки и округления } } else { //Если скидки нет if(okruglenie != 0){ // alert("s3"); console.warn("item",item) // newitem["price"] = round(item["cenaold"], 2); //цена до скидки и округления amount = round(round(item["cenaout"],2) * item["kolvo"],2); //цена без скидки но с округлением }else{ // alert("s4"); // newitem["price"] = round(item["cenaout"], 2); //цена до скидки и округления если округления не было amount = round(round(item["cenaout"],2) * item["kolvo"],2); //цена без скидки но с округлением } } if(okruglenie != 0){ newitem["price"] = round(item["cenaold"],2); }else{ newitem["price"] = round(item["cenaout"],2); } // alert("цена"+newitem["price"]); // alert("сумму"+amount); newitem["amount"] = amount; kostilsummRRO = kostilsummRRO + amount; newitem["code"] = item["id"]; newitem["type"] = "position"; newitem["unit"] = "ves"; newitem["tax"] = round(item["tax"],0); try{ if(thisbasket["info"]["nopaymentstype"] == "debt"){ newitem["paymentMethod"] = "credit"; } }catch(err){ } //fullPrepayment - предоплата 100% //prepayment - предоплата //advance - аванс //fullPayment - полный расчет - по умолчанию //partialPayment - частичный расчет и кредит //credit - передача в кредит //creditPayment - оплата кредита // "infoDiscountAmount": 0.0, //"measurementUnit": "кг", //"paymentMethod": "advance", //"paymentObject": "commodity", //"nomenclatureCode": "MTIzNDEyMzQ1Njc4MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=", newfiscalarr.push(newitem) console.log("iiitem",newitem) } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } kostilsumm = kostilsumm + amount; } }); if (thisbasket["info"]["comment"] != "" && thisbasket["info"]["comment"] != undefined && thisbasket.info["checkcomments"] == 1) { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["Kommentariy_k_z_r2za7"] + ":" + thisbasket["info"]["comment"], }); } var dali = thisbasket["info"]["cash"]; if (thisbasket["info"]["nall"] > 0) { dali = thisbasket["info"]["nall"] } //Отнимаем от суммы которую дал клиент сумму товара который не пошел на печать на фискальник dali = dali - kostilsumm; if (kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы онлайн кассе"); } var jsonData = { "type": "sell", "taxationType": thisbasket["printer"]["cno"], "operator": { "id": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_pin"] }, "items": newfiscalarr, "payments": [], /* "discount":{ "type":"sum", //per "discount":-0.21 } */ }; try{ if(thisbasket["printer"]["cno"] == "" || thisbasket["printer"]["cno"] == undefined){ delete jsonData["taxationType"]; } }catch(err){ } /*Сумма электронной оплаты (2 знака после запятой)*/ try { var ElectronicPayment = round(thisbasket["info"]["visa"]); } catch (err) { var ElectronicPayment = 0; } //Костыль для починки minifp бага c большей суммой налички при сдвоенной оплате if(ElectronicPayment < kostilsummRRO){ if(thisbasket["info"]["cash"] > 0){ jsonData.payments.push({ "type": "cash", "sum": dali }) } } //Если сумма оплаты картой больше чем сумма товаров переданных на рро if(ElectronicPayment > kostilsummRRO){ if(kostilsummRRO > 0){ jsonData.payments.push({ "type": "electronically", "sum": kostilsummRRO }) } }else{ if (ElectronicPayment > 0) { jsonData.payments.push({ "type": "electronically", "sum": ElectronicPayment }) } } //Вызов return new Promise(function(resolve, reject) { if(ifartprint == true){ console.error("MINI FP", jsonData) app.print.protocols.minifp_usb_skyapp_windows.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }else{ resolve({"status":"done"}); } }); }, vozvrat: function(thisbasket) { //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; var allrealsum = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; var nallll = 0; var newfiscalarr = []; var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); //Собираем нужный массив и убираем позиции которые не подлежат налогообложению fiscalarr.forEach(function(item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } if (item["tax"] != "") { flag = 1; var newitem = {}; //Костыльчик который убирает с имени товара приставку веса try{ if(item.quantity == "100g" || item.quantity == "100ml"){ item["name"] = preload.products[currentsklad][item.idtovara]["name"]; } }catch(err){ } if(item.uktzed != '' && item.uktzed != null){ newitem["name"] = item.uktzed+"#"+item["name"]; }else{ newitem["name"] = item["name"]; } newitem["quantity"] = round(item["kolvo"], 3); newitem["price"] = round(item["cenaout"], 2); if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } newitem["amount"] = amount; newitem["code"] = item["id"]; newitem["type"] = "position"; newitem["tax"] = round(item["tax"],0); newitem["unit"] = "ves"; // "infoDiscountAmount": 0.0, //"measurementUnit": "кг", //"paymentMethod": "advance", //"paymentObject": "commodity", //"nomenclatureCode": "MTIzNDEyMzQ1Njc4MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=", newfiscalarr.push(newitem); allrealsum = allrealsum + amount; } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } kostilsumm = kostilsumm + amount; } }); if (kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы онлайн кассе"); } // Вызов команды var jsonData = { "type": "sellReturn", "taxationType": thisbasket["printer"]["cno"], "operator": { "id": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_pin"] }, "items": newfiscalarr, "payments": [] }; try{ if(thisbasket["printer"]["cno"] == "" || thisbasket["printer"]["cno"] == undefined){ delete jsonData["taxationType"]; } }catch(err){ } //Наличка if(thisbasket["info"]["cash"] > 0){ jsonData["payments"].push({ "type": "cash", "sum": round(thisbasket["info"]["cash"], 2) }); } //Безнал if(thisbasket["info"]["visa"] > 0){ if(thisbasket["info"]["visa"] > allrealsum){ jsonData["payments"].push({ "type": "electronically", "sum": round(allrealsum, 2) }); }else{ jsonData["payments"].push({ "type": "electronically", "sum": round(thisbasket["info"]["visa"], 2) }); } } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_usb_skyapp_windows.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, precheck: function(thisbasket) { var stringlength = 48; var lineh = ""; for (var i = 0; i < stringlength; i++) { lineh = lineh + "-"; } var newfiscalarr = []; try { newfiscalarr.push({ "type": "text", "text": "Заказ:" + thisbasket["info"]["id"], "alignment": "center" }) } catch (err) {} newfiscalarr.push({ "type": "text", "text": "Счёт на оплату", "alignment": "center" }) try { if (thisbasket.info["type"] == "delivery") { /*Адрес на пречек*/ if (thisbasket.info.client > 0) { var thisclient = preload["clients"][thisbasket.info.client]; if (thisclient.name != "") { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["FIO"] + ":" + thisclient.name }); } if (thisclient.phone != "") { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["telefon"] + ":" + thisclient.phone }); } if (thisbasket["info"]["adress"] != "") { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["adres"] + ":" + thisbasket["info"]["adress"], }); } } } } catch (err) {} newfiscalarr.push({ "type": "text", "text": lineh, "alignment": "center" }) var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); fiscalarr.forEach(function(item, i) { //Собираем нужный массив newfiscalarr.push({ "type": "text", "text": fiscalarr[i]["name"], "alignment": "left" }) newfiscalarr.push({ "type": "text", "text": CurrencyFormatted(fiscalarr[i]["kolvo"], 3) + " * " + CurrencyFormatted(fiscalarr[i]["cenaout"]) + " = " + CurrencyFormatted(fiscalarr[i]["cenaout"] * fiscalarr[i]["kolvo"]), "alignment": "right" }) }); newfiscalarr.push({ "type": "text", "text": lineh, "alignment": "center" }) if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { if(thisbasket.info.cashdiscount > 0){ var dstring = CurrencyFormatted(thisbasket.info.cashdiscount); }else{ var dstring = thisbasket.info.discounttitle; } //Со скидкой newfiscalarr.push({ "type": "text", "text": app.print.modules.escposstr(1, stringlength, "СКИДКА:", dstring), "alignment": "left" }) } newfiscalarr.push({ "type": "text", "text": app.print.modules.escposstr(1, stringlength, "ИТОГ:", CurrencyFormatted(thisbasket["info"]["allcena"])), "alignment": "left" }) newfiscalarr.push({ "type": "text", "text": lineh, "alignment": "center" }) if (thisbasket["info"]["comment"] != "" && thisbasket["info"]["comment"] != undefined && thisbasket.info["checkcomments"] == 1) { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["Kommentariy_k_z_r2za7"] + ":" + thisbasket["info"]["comment"], }); } newfiscalarr.push({ "type": "text", "text": "НЕ ФИСКАЛЬНЫЙ", "alignment": "center" }) var jsonData = { "type": "nonFiscal", "items": newfiscalarr } //Вызов return new Promise(function(resolve, reject) { // app.print.protocols.minifp_android.ExecuteCommand(jsonData).then(function(success) { resolve(success); // }, function(error) { // reject(error); // }) }); }, XReport: function(data) { var jsonData = { "type": "reportX", "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_usb_skyapp_windows.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, X3Report: function(data) { var jsonData = { "type": "reportX3", "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_usb_skyapp_windows.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, ZReport: function(data) { var jsonData = { "type": "closeShift", "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_usb_skyapp_windows.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, introduction: function(data) { var jsonData = { "type": "cashIn", "cashSum": round(data["cash"]), "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_usb_skyapp_windows.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, incasation: function(data) { var jsonData = { "type": "cashOut", "cashSum": round(data["cash"]), "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_usb_skyapp_windows.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, rashod: function(data) { var jsonData = { "type": "cashOut", "cashSum": round(data["cash"]), "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_usb_skyapp_windows.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, getUser: function(name){ if(minifp["usersbase"][name]){ console.log("true"); return minifp["usersbase"][name]["id"]; }else{ console.log("false"); minifp["usersbase"][name] = { id:minifp["usersbase_count"], name:name } minifp["usersbase_count"]++; localStorage["minifp_usersbase"] = JSON.stringify(minifp["usersbase"]) return minifp["usersbase"][name]["id"]; } }, ExecuteCommand: function(Data) { console.log("minifp ExecuteCommand",Data); try{ Data.operator.id = this.getUser(Data.operator.name); //alert(Data.operator.id+" "+Data.operator.name); console.log(Data.operator.id); if(Data.operator.id > 31){ app.main.error("minifp: Порядковий номер співробітника більше ніж 31, код пимилки: 8163"); } }catch(err){ app.main.error("Не вдалось отримати номер співробітника, код пимилки: 8164"); } app.main.loader("show"); return new Promise(function(resolve, reject) { try { var request = { method: "miniFP", data: JSON.stringify(Data) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { try{ console.log(response) var content2 = JSON.parse(response); if (content2.status == "done") { app.main.loader("hide"); resolve({ status: "done", data: content2 }); } if (content2.status == "error") { app.main.error("miniFP: "+content2["errorCode"]+" - "+app.print.protocols.minifp_usb_skyapp_windows.codeErro(content2["errorCode"])); app.main.loader("hide"); reject({ status: "error", data: content2 }); } }catch(err){ console.error("Устройство minifp не найдено",err); app.main.loader("hide"); reject({ status: "error" }); } }, onFailure: function(error_code, error_message) { reject({ status: "error", data: error_message }); } }); } catch (err) { console.error("Устройство minifp не найдено",err); app.main.loader("hide"); reject({ status: "error" }); } }) } }, minifp_ip_skyapp_windows_v2:{ codeErro: function(code){ var minifpErr = []; minifpErr["1"] = "Нет возможности запустить команду"; minifpErr["2"] = "Невозможно обработать команду"; minifpErr["3"] = "Код команды отсутствует"; minifpErr["4"] = "Много данных в команде"; minifpErr["5"] = "Недостаточно данных в команде"; minifpErr["6"] = "Ошибка при приеме данных"; minifpErr["7"] = "Недопустимый идентификатор команды"; minifpErr["8"] = "Невозможно выполнить команду"; minifpErr["10"] = "ошибка ввода"; minifpErr["11"] = "необходимо снять z1 отчет"; minifpErr["12"] = "скидки/наценки запрещены"; minifpErr["13"] = "переполнение по чеку"; minifpErr["14"] = "команда запрещена"; minifpErr["15"] = "кассир не зарегистрирован"; minifpErr["16"] = "отрицательная сумма"; minifpErr["17"] = "количество товара отрицательное"; minifpErr["18"] = "время смены исчерпано"; minifpErr["19"] = "неверный тип оплаты"; minifpErr["20"] = "неправильная или отсутствующая цена"; minifpErr["21"] = "неверный параметр на входе команды"; minifpErr["22"] = "товар находится в открытом чеке, нельзя редактировать"; minifpErr["23"] = "некорректно запрограммированный товар"; minifpErr["24"] = "неверный или отсутствующий штрихкод товара"; minifpErr["27"] = "неверный или отсутствующий код товара"; minifpErr["28"] = "товар не весовой(штучный)"; minifpErr["29"] = "ФП почти заполнена"; minifpErr["30"] = "ФП заполнена"; minifpErr["31"] = "память инициализаций заполнена"; minifpErr["32"] = "есть отложенная операция, оплата запрещена"; minifpErr["33"] = "карточка клиента не принята"; minifpErr["34"] = "не хватает денег на сдачу"; minifpErr["35"] = "запрещена комбинированная оплата"; minifpErr["36"] = "неправильный номер кассира"; minifpErr["37"] = "места недостаточно"; minifpErr["38"] = "нет места в Журнале"; minifpErr["39"] = "нет места в базе товаров"; minifpErr["40"] = "нет места в Архиве"; minifpErr["41"] = "товар есть комплекс"; minifpErr["42"] = "код не принадлежит комплексу"; minifpErr["43"] = "РРО занят и не может выполнить команду"; minifpErr["44"] = "необходимо выполнить Z1 отчет"; minifpErr["45"] = "неправильный пароль кассира"; minifpErr["46"] = "комплекс нельзя продать"; minifpErr["47"] = "цена товара указана"; minifpErr["48"] = "отмена запрещена"; minifpErr["49"] = "продажа товара запрещена"; minifpErr["50"] = "ошибка чтения ФП"; minifpErr["51"] = "номер производителя неверен"; minifpErr["52"] = "ошибка записи во флеш"; minifpErr["54"] = "товар нельзя удалить"; minifpErr["55"] = "нет данных в ФП"; minifpErr["56"] = "неверный пароль налогового инспектора"; minifpErr["57"] = "неверный пароль администратора"; minifpErr["58"] = "неверный пароль старшего кассира"; minifpErr["60"] = "РРО заблокирован. Истекло время для передачи данных"; minifpErr["61"] = "РРО заблокирован. Персонализация не проведена"; minifpErr["67"] = "ошибка работы с SAM"; minifpErr["68"] = "есть неотправленные документы"; minifpErr["69"] = "документы отсутствуют"; minifpErr["70"] = "вал отсутствует"; minifpErr["71"] = "нет питания 3.3В на плате клавиатуры"; minifpErr["79"] = "дата сервисного обслуживания превышена"; minifpErr["80"] = "ошибка записи в ФП"; minifpErr["81"] = "ошибка часов реального времени, дата последнего Z1 отчета больше текущей"; minifpErr["82"] = "ошибка данных в интерфейсе"; minifpErr["83"] = "ошибка часов реального времени, дата/время последнего документа больше текущей"; minifpErr["86"] = "отсутствует индикатор клиента"; minifpErr["91"] = "напряжение питания превышает допустимое"; minifpErr["92"] = "напряжение питания ниже допустимого"; minifpErr["93"] = "критическое снижение напряжения питания"; minifpErr["95"] = "температура термоголовки ниже допустимой"; minifpErr["96"] = "температура термоголовки превышает допустимую"; minifpErr["97"] = "нет бумаги"; minifpErr["200"] = "выключен коммуникационный блок"; minifpErr["201"] = "нет связи с коммуникационном блоком"; minifpErr["203"] = "карточка не принята"; minifpErr["205"] = "ошибка платежного терминала"; minifpErr["206"] = "ошибка транзакции"; minifpErr["207"] = "невозможность выполнить операцию"; minifpErr["208"] = "отмена операции"; minifpErr["209"] = "операция прервана"; minifpErr["241"] = "носитель нуждается в форматировании"; minifpErr["242"] = "носитель отсутствует"; minifpErr["254"] = "носитель заполнен"; minifpErr["257"] = "ошибка SAM модуля"; minifpErr["258"] = "не правильный ID DEV"; minifpErr["259"] = "не правильный ID SAM"; minifpErr["260"] = "ошибка SAM модуля"; minifpErr["261"] = "ошибка инициализации SAM модуля"; minifpErr["262"] = "ошибка SAM модуля"; minifpErr["263"] = "нет ID_DEV"; minifpErr["264"] = "SAM модуль не персонализирован"; minifpErr["265"] = "ошибка SAM модуля"; minifpErr["266"] = "ошибка SAM модуля"; minifpErr["267"] = "ошибка синхронной сессии"; minifpErr["268"] = "ошибка подписи MAC"; minifpErr["269"] = "неудовлетворительное использование"; minifpErr["270"] = "ошибка обмена данными с SAM"; minifpErr["271"] = "ошибка обмена данными с SAM"; minifpErr["272"] = "ошибка обмена данными с SAM"; minifpErr["273"] = "Ошибка обмена данными с SAM"; minifpErr["274"] = "Ошибка обмена данными с SAM"; minifpErr["275"] = "Ошибка обмена данными"; minifpErr["276"] = "Неверная версия VkMAC"; minifpErr["288"] = "Ошибка персонализации SAM"; minifpErr["545"] = "Ошибка персонализации SAM"; minifpErr["289"] = "Ошибка персонализации РРО"; minifpErr["546"] = "Ошибка персонализации РРО"; minifpErr["290"] = "Ошибка передачи данных"; minifpErr["547"] = "Ошибка передачи данных"; minifpErr["300"] = "Ошибка подключения к серверу"; minifpErr["301"] = "Ошибка подключения к коммуникационному блоку"; minifpErr["302"] = "Ошибка подключения к серверу"; minifpErr["303"] = "Ошибка сети"; minifpErr["304"] = "Ошибка коммуникационного блока"; minifpErr["305"] = "Ошибка передачи данных"; minifpErr["307"] = "Ошибка коммуникационного блока"; minifpErr["308"] = "Ошибка формата URL"; minifpErr["900"] = "Ошибка файловой системы при поиске документов"; minifpErr["901"] = "Ошибка размера файла"; minifpErr["902"] = "Превышение времени ожидания ответа"; minifpErr["903"] = "Ошибка целостности данных на носителе"; minifpErr["1001"] = "Слишком длинное наименование товара"; minifpErr["1002"] = "Нет ответа"; return minifpErr[code]; }, opensmena: function(data) { //Вызов return new Promise(function(resolve, reject) { resolve({ status: "done" }); }); }, opendrawer: function(data) { var jsonData = { "type": "openDrawer", "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_usb_skyapp_windows_v2.ExecuteCommand(jsonData, data.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, check: function(thisbasket) { var ifartprint = false; console.log("minifp_android", thisbasket); var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); var newfiscalarr = []; try { newfiscalarr.push({ "type": "text", "text": "Замовлення:" + thisbasket["info"]["id"], "alignment": "center" }) } catch (err) {} //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; var kostilsummRRO = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; //Собираем нужный массив и убираем позиции которые не подлежат налогообложению fiscalarr.forEach(function(item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } if (item["tax"] != "") { flag = 1; ifartprint = true; var newitem = {}; //Костыльчик который убирает с имени товара приставку веса try{ if(item.type == "mod" ){ if(item.quantity == "100g" || item.quantity == "100ml"){ item["name"] = preload.products[currentsklad][item.id]["name"]; } } }catch(err){ } if(item.uktzed != '' && item.uktzed != null){ newitem["name"] = item["name"]; newitem["uktzed"] = item["uktzed"]; }else{ newitem["name"] = item["name"]; } try{ if(item.akciz != '' && item.akciz != null){ newitem["excise"] = [ { "stamp": item.akciz } ]; } }catch(err){ } newitem["quantity"] = round(item["kolvo"], 3); if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { //Если скидка есть if(okruglenie != 0){ // alert("s1"); // newitem["price"] = round(item["cenaold_discount"], 2); //цена до скидки и округления //amount = round(round(item["cenaout_discount"],2) * item["kolvo"],2); //цена после скидки и округления amount = round(multiplyin(item["cenaout_discount"],item["kolvo"]),2); }else{ // alert("s2"); // newitem["price"] = round(item["cenaout"], 2); //цена до скидки и округления если округления не было //amount = round(round(item["cenaout_discount"],2) * item["kolvo"],2); //цена после скидки и округления amount = round(multiplyin(item["cenaout_discount"],item["kolvo"]),2); } } else { //Если скидки нет if(okruglenie != 0){ // alert("s3"); console.warn("item",item) // newitem["price"] = round(item["cenaold"], 2); //цена до скидки и округления amount = round(multiplyin(item["cenaout"],item["kolvo"]),2); //цена без скидки но с округлением }else{ // alert("s4"); // newitem["price"] = round(item["cenaout"], 2); //цена до скидки и округления если округления не было amount = round(multiplyin(item["cenaout"],item["kolvo"]),2); //цена без скидки но с округлением } } if(okruglenie != 0){ newitem["price"] = round(item["cenaold"],2); }else{ newitem["price"] = round(item["cenaout"],2); } // alert("цена"+newitem["price"]); // alert("сумму"+amount); newitem["amount"] = amount; kostilsummRRO = kostilsummRRO + amount; newitem["code"] = item["id"]; newitem["type"] = "position"; newitem["unit"] = "ves"; newitem["tax"] = round(item["tax"],0); try{ if(thisbasket["info"]["nopaymentstype"] == "debt"){ newitem["paymentMethod"] = "credit"; } }catch(err){ } //fullPrepayment - предоплата 100% //prepayment - предоплата //advance - аванс //fullPayment - полный расчет - по умолчанию //partialPayment - частичный расчет и кредит //credit - передача в кредит //creditPayment - оплата кредита // "infoDiscountAmount": 0.0, //"measurementUnit": "кг", //"paymentMethod": "advance", //"paymentObject": "commodity", //"nomenclatureCode": "MTIzNDEyMzQ1Njc4MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=", newfiscalarr.push(newitem) console.log("iiitem",newitem) } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } kostilsumm = kostilsumm + amount; } }); if (thisbasket["info"]["comment"] != "" && thisbasket["info"]["comment"] != undefined && thisbasket.info["checkcomments"] == 1) { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["Kommentariy_k_z_r2za7"] + ":" + thisbasket["info"]["comment"], }); } var dali = thisbasket["info"]["cash"]; if (thisbasket["info"]["nall"] > 0) { dali = thisbasket["info"]["nall"] } //Отнимаем от суммы которую дал клиент сумму товара который не пошел на печать на фискальник dali = dali - kostilsumm; if (kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы онлайн кассе"); } var jsonData = { "type": "sell", "taxationType": thisbasket["printer"]["cno"], "operator": { "id": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_pin"] }, "items": newfiscalarr, "payments": [], /* "discount":{ "type":"sum", //per "discount":-0.21 } */ }; try{ if(thisbasket["printer"]["cno"] == "" || thisbasket["printer"]["cno"] == undefined){ delete jsonData["taxationType"]; } }catch(err){ } /*Сумма электронной оплаты (2 знака после запятой)*/ try { var ElectronicPayment = round(thisbasket["info"]["visa"]); } catch (err) { var ElectronicPayment = 0; } //Костыль для починки minifp бага c большей суммой налички при сдвоенной оплате if(ElectronicPayment < kostilsummRRO){ if(thisbasket["info"]["cash"] > 0){ jsonData.payments.push({ "type": "cash", "sum": dali }) } } var electronicSum = null; //Если сумма оплаты картой больше чем сумма товаров переданных на рро if(ElectronicPayment > kostilsummRRO){ if(kostilsummRRO > 0){ electronicSum = kostilsummRRO } }else{ if (ElectronicPayment > 0) { electronicSum = ElectronicPayment } } if(electronicSum){ var electronicObj = { "type": "electronically", "sum": electronicSum }; //paymentSystem; //numberTerminal; try{ if(thisbasket["info"]["bankingData"]["rrn"]){ electronicObj["rrn"] = thisbasket["info"]["bankingData"]["rrn"]; //RRN (Reference Retrieval Number) платежа } }catch(err){ } try{ if(thisbasket["info"]["bankingData"]["bankName"]){ electronicObj["bankName"] = thisbasket["info"]["bankingData"]["bankName"]; //Название банка } }catch(err){ } try{ if(thisbasket["info"]["bankingData"]["cardNumber"]){ electronicObj["numberCard"] = thisbasket["info"]["bankingData"]["cardNumber"]; //Номер карты клиента } }catch(err){ } try{ if(thisbasket["info"]["bankingData"]["authorizationCode"]){ electronicObj["authorizationCode"] = thisbasket["info"]["bankingData"]["authorizationCode"]; //Код авторизации платежа } }catch(err){ } try{ if(thisbasket["info"]["bankingData"]["terminalID"]){ electronicObj["numberTerminal"] = thisbasket["info"]["bankingData"]["terminalID"]; //Номер платежного терминала } }catch(err){ } jsonData.payments.push(electronicObj); } console.error(thisbasket); //var deviceObj = thisbasket["printer"] //Вызов return new Promise(function(resolve, reject) { if(ifartprint == true){ console.error("MINI FP", jsonData) app.print.protocols.minifp_usb_skyapp_windows_v2.ExecuteCommand(jsonData, thisbasket.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }else{ resolve({"status":"done"}); } }); }, vozvrat: function(thisbasket) { //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; var allrealsum = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; var nallll = 0; var newfiscalarr = []; var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); //Собираем нужный массив и убираем позиции которые не подлежат налогообложению fiscalarr.forEach(function(item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } if (item["tax"] != "") { flag = 1; var newitem = {}; //Костыльчик который убирает с имени товара приставку веса try{ if(item.quantity == "100g" || item.quantity == "100ml"){ item["name"] = preload.products[currentsklad][item.idtovara]["name"]; } }catch(err){ } if(item.uktzed != '' && item.uktzed != null){ newitem["name"] = item["name"]; }else{ newitem["name"] = item["name"]; } newitem["quantity"] = round(item["kolvo"], 3); newitem["price"] = round(item["cenaout"], 2); if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } newitem["amount"] = amount; newitem["code"] = item["id"]; newitem["type"] = "position"; newitem["tax"] = round(item["tax"],0); newitem["unit"] = "ves"; // "infoDiscountAmount": 0.0, //"measurementUnit": "кг", //"paymentMethod": "advance", //"paymentObject": "commodity", //"nomenclatureCode": "MTIzNDEyMzQ1Njc4MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=", newfiscalarr.push(newitem); allrealsum = allrealsum + amount; } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } kostilsumm = kostilsumm + amount; } }); if (kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы онлайн кассе"); } // Вызов команды var jsonData = { "type": "sellReturn", "taxationType": thisbasket["printer"]["cno"], "operator": { "id": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_pin"] }, "items": newfiscalarr, "payments": [] }; try{ if(thisbasket["printer"]["cno"] == "" || thisbasket["printer"]["cno"] == undefined){ delete jsonData["taxationType"]; } }catch(err){ } //Наличка if(thisbasket["info"]["cash"] > 0){ jsonData["payments"].push({ "type": "cash", "sum": round(thisbasket["info"]["cash"], 2) }); } var electronicSum = null; //Безнал if(thisbasket["info"]["visa"] > 0){ if(thisbasket["info"]["visa"] > allrealsum){ electronicSum = round(allrealsum, 2); }else{ electronicSum = round(thisbasket["info"]["visa"], 2); } } if(electronicSum){ var electronicObj = { "type": "electronically", "sum": electronicSum }; try{ if(thisbasket["info"]["bankingData"]["rrn"]){ electronicObj["rrn"] = thisbasket["mosst"]["bankingData"]["rrn"]; //RRN (Reference Retrieval Number) платежа } }catch(err){ } try{ if(thisbasket["info"]["bankingData"]["bankName"]){ electronicObj["bankName"] = thisbasket["mosst"]["bankingData"]["bankName"]; //Название банка } }catch(err){ } try{ if(thisbasket["info"]["bankingData"]["cardNumber"]){ electronicObj["numberCard"] = thisbasket["mosst"]["bankingData"]["cardNumber"]; //Номер карты клиента } }catch(err){ } try{ if(thisbasket["info"]["bankingData"]["authorizationCode"]){ electronicObj["authorizationCode"] = thisbasket["mosst"]["bankingData"]["authorizationCode"]; //Код авторизации платежа } }catch(err){ } try{ if(thisbasket["info"]["bankingData"]["terminalID"]){ electronicObj["numberTerminal"] = thisbasket["mosst"]["bankingData"]["terminalID"]; //Номер платежного терминала } }catch(err){ } jsonData.payments.push(electronicObj); } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_usb_skyapp_windows_v2.ExecuteCommand(jsonData, thisbasket.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, precheck: function(thisbasket) { var stringlength = 48; var lineh = ""; for (var i = 0; i < stringlength; i++) { lineh = lineh + "-"; } var newfiscalarr = []; try { newfiscalarr.push({ "type": "text", "text": "Заказ:" + thisbasket["info"]["id"], "alignment": "center" }) } catch (err) {} newfiscalarr.push({ "type": "text", "text": "Счёт на оплату", "alignment": "center" }) try { if (thisbasket.info["type"] == "delivery") { /*Адрес на пречек*/ if (thisbasket.info.client > 0) { var thisclient = preload["clients"][thisbasket.info.client]; if (thisclient.name != "") { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["FIO"] + ":" + thisclient.name }); } if (thisclient.phone != "") { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["telefon"] + ":" + thisclient.phone }); } if (thisbasket["info"]["adress"] != "") { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["adres"] + ":" + thisbasket["info"]["adress"], }); } } } } catch (err) {} newfiscalarr.push({ "type": "text", "text": lineh, "alignment": "center" }) var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); fiscalarr.forEach(function(item, i) { //Собираем нужный массив newfiscalarr.push({ "type": "text", "text": fiscalarr[i]["name"], "alignment": "left" }) newfiscalarr.push({ "type": "text", "text": CurrencyFormatted(fiscalarr[i]["kolvo"], 3) + " * " + CurrencyFormatted(fiscalarr[i]["cenaout"]) + " = " + CurrencyFormatted(fiscalarr[i]["cenaout"] * fiscalarr[i]["kolvo"]), "alignment": "right" }) }); newfiscalarr.push({ "type": "text", "text": lineh, "alignment": "center" }) if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { if(thisbasket.info.cashdiscount > 0){ var dstring = CurrencyFormatted(thisbasket.info.cashdiscount); }else{ var dstring = thisbasket.info.discounttitle; } //Со скидкой newfiscalarr.push({ "type": "text", "text": app.print.modules.escposstr(1, stringlength, "СКИДКА:", dstring), "alignment": "left" }) } newfiscalarr.push({ "type": "text", "text": app.print.modules.escposstr(1, stringlength, "ИТОГ:", CurrencyFormatted(thisbasket["info"]["allcena"])), "alignment": "left" }) newfiscalarr.push({ "type": "text", "text": lineh, "alignment": "center" }) if (thisbasket["info"]["comment"] != "" && thisbasket["info"]["comment"] != undefined && thisbasket.info["checkcomments"] == 1) { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["Kommentariy_k_z_r2za7"] + ":" + thisbasket["info"]["comment"], }); } newfiscalarr.push({ "type": "text", "text": "НЕ ФИСКАЛЬНЫЙ", "alignment": "center" }) var jsonData = { "type": "nonFiscal", "items": newfiscalarr } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_android.ExecuteCommand(jsonData, thisbasket.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, XReport: function(data) { var jsonData = { "type": "reportX", "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_usb_skyapp_windows_v2.ExecuteCommand(jsonData, data.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, X3Report: function(data) { var jsonData = { "type": "reportX3", "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_usb_skyapp_windows_v2.ExecuteCommand(jsonData, data.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, ZReport: function(data) { var jsonData = { "type": "closeShift", "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_usb_skyapp_windows_v2.ExecuteCommand(jsonData, data.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, introduction: function(data) { var jsonData = { "type": "cashIn", "cashSum": round(data["cash"]), "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_usb_skyapp_windows_v2.ExecuteCommand(jsonData, data.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, incasation: function(data) { var jsonData = { "type": "cashOut", "cashSum": round(data["cash"]), "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_usb_skyapp_windows_v2.ExecuteCommand(jsonData, data.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, rashod: function(data) { var jsonData = { "type": "cashOut", "cashSum": round(data["cash"]), "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_usb_skyapp_windows_v2.ExecuteCommand(jsonData, data.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, getUser: function(name){ if(minifp["usersbase"][name]){ console.log("true"); return minifp["usersbase"][name]["id"]; }else{ console.log("false"); minifp["usersbase"][name] = { id:minifp["usersbase_count"], name:name } minifp["usersbase_count"]++; localStorage["minifp_usersbase"] = JSON.stringify(minifp["usersbase"]) return minifp["usersbase"][name]["id"]; } }, ExecuteCommand: function(Data, printer) { console.log("minifp ExecuteCommand",Data); try{ Data.operator.id = this.getUser(Data.operator.name); //alert(Data.operator.id+" "+Data.operator.name); console.log(Data.operator.id); if(Data.operator.id > 31){ app.main.error("minifp: Порядковий номер співробітника більше ніж 31, код пимилки: 8163"); } }catch(err){ app.main.error("Не вдалось отримати номер співробітника, код пимилки: 8164"); } app.main.loader("show"); return new Promise(function(resolve, reject) { try { var request = { method: "fiscalOperation", data: JSON.stringify({ deviceId:printer["id"], protocol:printer["protocol"], jsonObjectData:Data }) } console.log("minifp ExecuteCommand request",request); window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { try{ console.log(response) var content2 = JSON.parse(response); if (content2.status == "done") { app.main.loader("hide"); resolve({ status: "done", data: content2 }); } if (content2.status == "error") { app.main.error("miniFP: "+content2["errorCode"]+" - "+app.print.protocols.minifp_usb_skyapp_windows_v2.codeErro(content2["errorCode"])); app.main.loader("hide"); reject({ status: "error", data: content2 }); } }catch(err){ console.error("Устройство minifp не найдено",err); app.main.loader("hide"); reject({ status: "error" }); } }, onFailure: function(error_code, error_message) { reject({ status: "error", data: error_message }); } }); } catch (err) { console.error("Устройство minifp не найдено",err); app.main.loader("hide"); reject({ status: "error" }); } }) } }, minifp_ip_android_v2:{ codeErro: function(code){ var minifpErr = []; minifpErr["1"] = "Нет возможности запустить команду"; minifpErr["2"] = "Невозможно обработать команду"; minifpErr["3"] = "Код команды отсутствует"; minifpErr["4"] = "Много данных в команде"; minifpErr["5"] = "Недостаточно данных в команде"; minifpErr["6"] = "Ошибка при приеме данных"; minifpErr["7"] = "Недопустимый идентификатор команды"; minifpErr["8"] = "Невозможно выполнить команду"; minifpErr["10"] = "ошибка ввода"; minifpErr["11"] = "необходимо снять z1 отчет"; minifpErr["12"] = "скидки/наценки запрещены"; minifpErr["13"] = "переполнение по чеку"; minifpErr["14"] = "команда запрещена"; minifpErr["15"] = "кассир не зарегистрирован"; minifpErr["16"] = "отрицательная сумма"; minifpErr["17"] = "количество товара отрицательное"; minifpErr["18"] = "время смены исчерпано"; minifpErr["19"] = "неверный тип оплаты"; minifpErr["20"] = "неправильная или отсутствующая цена"; minifpErr["21"] = "неверный параметр на входе команды"; minifpErr["22"] = "товар находится в открытом чеке, нельзя редактировать"; minifpErr["23"] = "некорректно запрограммированный товар"; minifpErr["24"] = "неверный или отсутствующий штрихкод товара"; minifpErr["27"] = "неверный или отсутствующий код товара"; minifpErr["28"] = "товар не весовой(штучный)"; minifpErr["29"] = "ФП почти заполнена"; minifpErr["30"] = "ФП заполнена"; minifpErr["31"] = "память инициализаций заполнена"; minifpErr["32"] = "есть отложенная операция, оплата запрещена"; minifpErr["33"] = "карточка клиента не принята"; minifpErr["34"] = "не хватает денег на сдачу"; minifpErr["35"] = "запрещена комбинированная оплата"; minifpErr["36"] = "неправильный номер кассира"; minifpErr["37"] = "места недостаточно"; minifpErr["38"] = "нет места в Журнале"; minifpErr["39"] = "нет места в базе товаров"; minifpErr["40"] = "нет места в Архиве"; minifpErr["41"] = "товар есть комплекс"; minifpErr["42"] = "код не принадлежит комплексу"; minifpErr["43"] = "РРО занят и не может выполнить команду"; minifpErr["44"] = "необходимо выполнить Z1 отчет"; minifpErr["45"] = "неправильный пароль кассира"; minifpErr["46"] = "комплекс нельзя продать"; minifpErr["47"] = "цена товара указана"; minifpErr["48"] = "отмена запрещена"; minifpErr["49"] = "продажа товара запрещена"; minifpErr["50"] = "ошибка чтения ФП"; minifpErr["51"] = "номер производителя неверен"; minifpErr["52"] = "ошибка записи во флеш"; minifpErr["54"] = "товар нельзя удалить"; minifpErr["55"] = "нет данных в ФП"; minifpErr["56"] = "неверный пароль налогового инспектора"; minifpErr["57"] = "неверный пароль администратора"; minifpErr["58"] = "неверный пароль старшего кассира"; minifpErr["60"] = "РРО заблокирован. Истекло время для передачи данных"; minifpErr["61"] = "РРО заблокирован. Персонализация не проведена"; minifpErr["67"] = "ошибка работы с SAM"; minifpErr["68"] = "есть неотправленные документы"; minifpErr["69"] = "документы отсутствуют"; minifpErr["70"] = "вал отсутствует"; minifpErr["71"] = "нет питания 3.3В на плате клавиатуры"; minifpErr["79"] = "дата сервисного обслуживания превышена"; minifpErr["80"] = "ошибка записи в ФП"; minifpErr["81"] = "ошибка часов реального времени, дата последнего Z1 отчета больше текущей"; minifpErr["82"] = "ошибка данных в интерфейсе"; minifpErr["83"] = "ошибка часов реального времени, дата/время последнего документа больше текущей"; minifpErr["86"] = "отсутствует индикатор клиента"; minifpErr["91"] = "напряжение питания превышает допустимое"; minifpErr["92"] = "напряжение питания ниже допустимого"; minifpErr["93"] = "критическое снижение напряжения питания"; minifpErr["95"] = "температура термоголовки ниже допустимой"; minifpErr["96"] = "температура термоголовки превышает допустимую"; minifpErr["97"] = "нет бумаги"; minifpErr["200"] = "выключен коммуникационный блок"; minifpErr["201"] = "нет связи с коммуникационном блоком"; minifpErr["203"] = "карточка не принята"; minifpErr["205"] = "ошибка платежного терминала"; minifpErr["206"] = "ошибка транзакции"; minifpErr["207"] = "невозможность выполнить операцию"; minifpErr["208"] = "отмена операции"; minifpErr["209"] = "операция прервана"; minifpErr["241"] = "носитель нуждается в форматировании"; minifpErr["242"] = "носитель отсутствует"; minifpErr["254"] = "носитель заполнен"; minifpErr["257"] = "ошибка SAM модуля"; minifpErr["258"] = "не правильный ID DEV"; minifpErr["259"] = "не правильный ID SAM"; minifpErr["260"] = "ошибка SAM модуля"; minifpErr["261"] = "ошибка инициализации SAM модуля"; minifpErr["262"] = "ошибка SAM модуля"; minifpErr["263"] = "нет ID_DEV"; minifpErr["264"] = "SAM модуль не персонализирован"; minifpErr["265"] = "ошибка SAM модуля"; minifpErr["266"] = "ошибка SAM модуля"; minifpErr["267"] = "ошибка синхронной сессии"; minifpErr["268"] = "ошибка подписи MAC"; minifpErr["269"] = "неудовлетворительное использование"; minifpErr["270"] = "ошибка обмена данными с SAM"; minifpErr["271"] = "ошибка обмена данными с SAM"; minifpErr["272"] = "ошибка обмена данными с SAM"; minifpErr["273"] = "Ошибка обмена данными с SAM"; minifpErr["274"] = "Ошибка обмена данными с SAM"; minifpErr["275"] = "Ошибка обмена данными"; minifpErr["276"] = "Неверная версия VkMAC"; minifpErr["288"] = "Ошибка персонализации SAM"; minifpErr["545"] = "Ошибка персонализации SAM"; minifpErr["289"] = "Ошибка персонализации РРО"; minifpErr["546"] = "Ошибка персонализации РРО"; minifpErr["290"] = "Ошибка передачи данных"; minifpErr["547"] = "Ошибка передачи данных"; minifpErr["300"] = "Ошибка подключения к серверу"; minifpErr["301"] = "Ошибка подключения к коммуникационному блоку"; minifpErr["302"] = "Ошибка подключения к серверу"; minifpErr["303"] = "Ошибка сети"; minifpErr["304"] = "Ошибка коммуникационного блока"; minifpErr["305"] = "Ошибка передачи данных"; minifpErr["307"] = "Ошибка коммуникационного блока"; minifpErr["308"] = "Ошибка формата URL"; minifpErr["900"] = "Ошибка файловой системы при поиске документов"; minifpErr["901"] = "Ошибка размера файла"; minifpErr["902"] = "Превышение времени ожидания ответа"; minifpErr["903"] = "Ошибка целостности данных на носителе"; minifpErr["1001"] = "Слишком длинное наименование товара"; minifpErr["1002"] = "Нет ответа"; return minifpErr[code]; }, opensmena: function(data) { //Вызов return new Promise(function(resolve, reject) { resolve({ status: "done" }); }); }, opendrawer: function(data) { var jsonData = { "type": "openDrawer", "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_android_v2.ExecuteCommand(jsonData, data.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, check: function(thisbasket) { var ifartprint = false; console.log("minifp_android", thisbasket); var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); var newfiscalarr = []; try { newfiscalarr.push({ "type": "text", "text": "Замовлення:" + thisbasket["info"]["id"], "alignment": "center" }) } catch (err) {} //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; var kostilsummRRO = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; //Собираем нужный массив и убираем позиции которые не подлежат налогообложению fiscalarr.forEach(function(item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } if (item["tax"] != "") { flag = 1; ifartprint = true; var newitem = {}; //Костыльчик который убирает с имени товара приставку веса try{ if(item.type == "mod" ){ if(item.quantity == "100g" || item.quantity == "100ml"){ item["name"] = preload.products[currentsklad][item.id]["name"]; } } }catch(err){ } if(item.uktzed != '' && item.uktzed != null){ newitem["name"] = item["name"]; newitem["uktzed"] = item["uktzed"]; }else{ newitem["name"] = item["name"]; } try{ if(item.akciz != '' && item.akciz != null){ newitem["excise"] = [ { "stamp": item.akciz } ]; } }catch(err){ } newitem["quantity"] = round(item["kolvo"], 3); if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { //Если скидка есть if(okruglenie != 0){ // alert("s1"); // newitem["price"] = round(item["cenaold_discount"], 2); //цена до скидки и округления //amount = round(round(item["cenaout_discount"],2) * item["kolvo"],2); //цена после скидки и округления amount = round(multiplyin(item["cenaout_discount"],item["kolvo"]),2); }else{ // alert("s2"); // newitem["price"] = round(item["cenaout"], 2); //цена до скидки и округления если округления не было //amount = round(round(item["cenaout_discount"],2) * item["kolvo"],2); //цена после скидки и округления amount = round(multiplyin(item["cenaout_discount"],item["kolvo"]),2); } } else { //Если скидки нет if(okruglenie != 0){ // alert("s3"); console.warn("item",item) // newitem["price"] = round(item["cenaold"], 2); //цена до скидки и округления amount = round(multiplyin(item["cenaout"],item["kolvo"]),2); //цена без скидки но с округлением }else{ // alert("s4"); // newitem["price"] = round(item["cenaout"], 2); //цена до скидки и округления если округления не было amount = round(multiplyin(item["cenaout"],item["kolvo"]),2); //цена без скидки но с округлением } } if(okruglenie != 0){ newitem["price"] = round(item["cenaold"],2); }else{ newitem["price"] = round(item["cenaout"],2); } // alert("цена"+newitem["price"]); // alert("сумму"+amount); newitem["amount"] = amount; kostilsummRRO = kostilsummRRO + amount; newitem["code"] = item["id"]; newitem["type"] = "position"; newitem["unit"] = "ves"; newitem["tax"] = round(item["tax"],0); try{ if(thisbasket["info"]["nopaymentstype"] == "debt"){ newitem["paymentMethod"] = "credit"; } }catch(err){ } //fullPrepayment - предоплата 100% //prepayment - предоплата //advance - аванс //fullPayment - полный расчет - по умолчанию //partialPayment - частичный расчет и кредит //credit - передача в кредит //creditPayment - оплата кредита // "infoDiscountAmount": 0.0, //"measurementUnit": "кг", //"paymentMethod": "advance", //"paymentObject": "commodity", //"nomenclatureCode": "MTIzNDEyMzQ1Njc4MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=", newfiscalarr.push(newitem) console.log("iiitem",newitem) } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } kostilsumm = kostilsumm + amount; } }); if (thisbasket["info"]["comment"] != "" && thisbasket["info"]["comment"] != undefined && thisbasket.info["checkcomments"] == 1) { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["Kommentariy_k_z_r2za7"] + ":" + thisbasket["info"]["comment"], }); } var dali = thisbasket["info"]["cash"]; if (thisbasket["info"]["nall"] > 0) { dali = thisbasket["info"]["nall"] } //Отнимаем от суммы которую дал клиент сумму товара который не пошел на печать на фискальник dali = dali - kostilsumm; if (kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы онлайн кассе"); } var jsonData = { "type": "sell", "taxationType": thisbasket["printer"]["cno"], "operator": { "id": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_pin"] }, "items": newfiscalarr, "payments": [], /* "discount":{ "type":"sum", //per "discount":-0.21 } */ }; try{ if(thisbasket["printer"]["cno"] == "" || thisbasket["printer"]["cno"] == undefined){ delete jsonData["taxationType"]; } }catch(err){ } /*Сумма электронной оплаты (2 знака после запятой)*/ try { var ElectronicPayment = round(thisbasket["info"]["visa"]); } catch (err) { var ElectronicPayment = 0; } //Костыль для починки minifp бага c большей суммой налички при сдвоенной оплате if(ElectronicPayment < kostilsummRRO){ if(thisbasket["info"]["cash"] > 0){ jsonData.payments.push({ "type": "cash", "sum": dali }) } } var electronicSum = null; //Если сумма оплаты картой больше чем сумма товаров переданных на рро if(ElectronicPayment > kostilsummRRO){ if(kostilsummRRO > 0){ electronicSum = kostilsummRRO } }else{ if (ElectronicPayment > 0) { electronicSum = ElectronicPayment } } if(electronicSum){ var electronicObj = { "type": "electronically", "sum": electronicSum }; //paymentSystem; //numberTerminal; try{ if(thisbasket["info"]["bankingData"]["rrn"]){ electronicObj["rrn"] = thisbasket["info"]["bankingData"]["rrn"]; //RRN (Reference Retrieval Number) платежа } }catch(err){ } try{ if(thisbasket["info"]["bankingData"]["bankName"]){ electronicObj["bankName"] = thisbasket["info"]["bankingData"]["bankName"]; //Название банка } }catch(err){ } try{ if(thisbasket["info"]["bankingData"]["cardNumber"]){ electronicObj["numberCard"] = thisbasket["info"]["bankingData"]["cardNumber"]; //Номер карты клиента } }catch(err){ } try{ if(thisbasket["info"]["bankingData"]["authorizationCode"]){ electronicObj["authorizationCode"] = thisbasket["info"]["bankingData"]["authorizationCode"]; //Код авторизации платежа } }catch(err){ } try{ if(thisbasket["info"]["bankingData"]["terminalID"]){ electronicObj["numberTerminal"] = thisbasket["info"]["bankingData"]["terminalID"]; //Номер платежного терминала } }catch(err){ } jsonData.payments.push(electronicObj); } console.error(thisbasket); //var deviceObj = thisbasket["printer"] //Вызов return new Promise(function(resolve, reject) { if(ifartprint == true){ console.error("MINI FP", jsonData) app.print.protocols.minifp_android_v2.ExecuteCommand(jsonData, thisbasket.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }else{ resolve({"status":"done"}); } }); }, vozvrat: function(thisbasket) { //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; var allrealsum = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; var nallll = 0; var newfiscalarr = []; var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); //Собираем нужный массив и убираем позиции которые не подлежат налогообложению fiscalarr.forEach(function(item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } if (item["tax"] != "") { flag = 1; var newitem = {}; //Костыльчик который убирает с имени товара приставку веса try{ if(item.quantity == "100g" || item.quantity == "100ml"){ item["name"] = preload.products[currentsklad][item.idtovara]["name"]; } }catch(err){ } if(item.uktzed != '' && item.uktzed != null){ newitem["name"] = item["name"]; }else{ newitem["name"] = item["name"]; } newitem["quantity"] = round(item["kolvo"], 3); newitem["price"] = round(item["cenaout"], 2); if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } newitem["amount"] = amount; newitem["code"] = item["id"]; newitem["type"] = "position"; newitem["tax"] = round(item["tax"],0); newitem["unit"] = "ves"; // "infoDiscountAmount": 0.0, //"measurementUnit": "кг", //"paymentMethod": "advance", //"paymentObject": "commodity", //"nomenclatureCode": "MTIzNDEyMzQ1Njc4MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=", newfiscalarr.push(newitem); allrealsum = allrealsum + amount; } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } kostilsumm = kostilsumm + amount; } }); if (kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы онлайн кассе"); } // Вызов команды var jsonData = { "type": "sellReturn", "taxationType": thisbasket["printer"]["cno"], "operator": { "id": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_pin"] }, "items": newfiscalarr, "payments": [] }; try{ if(thisbasket["printer"]["cno"] == "" || thisbasket["printer"]["cno"] == undefined){ delete jsonData["taxationType"]; } }catch(err){ } //Наличка if(thisbasket["info"]["cash"] > 0){ jsonData["payments"].push({ "type": "cash", "sum": round(thisbasket["info"]["cash"], 2) }); } //Безнал if(thisbasket["info"]["visa"] > 0){ if(thisbasket["info"]["visa"] > allrealsum){ jsonData["payments"].push({ "type": "electronically", "sum": round(allrealsum, 2) }); }else{ jsonData["payments"].push({ "type": "electronically", "sum": round(thisbasket["info"]["visa"], 2) }); } } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_android_v2.ExecuteCommand(jsonData, thisbasket.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, precheck: function(thisbasket) { var stringlength = 48; var lineh = ""; for (var i = 0; i < stringlength; i++) { lineh = lineh + "-"; } var newfiscalarr = []; try { newfiscalarr.push({ "type": "text", "text": "Заказ:" + thisbasket["info"]["id"], "alignment": "center" }) } catch (err) {} newfiscalarr.push({ "type": "text", "text": "Счёт на оплату", "alignment": "center" }) try { if (thisbasket.info["type"] == "delivery") { /*Адрес на пречек*/ if (thisbasket.info.client > 0) { var thisclient = preload["clients"][thisbasket.info.client]; if (thisclient.name != "") { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["FIO"] + ":" + thisclient.name }); } if (thisclient.phone != "") { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["telefon"] + ":" + thisclient.phone }); } if (thisbasket["info"]["adress"] != "") { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["adres"] + ":" + thisbasket["info"]["adress"], }); } } } } catch (err) {} newfiscalarr.push({ "type": "text", "text": lineh, "alignment": "center" }) var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); fiscalarr.forEach(function(item, i) { //Собираем нужный массив newfiscalarr.push({ "type": "text", "text": fiscalarr[i]["name"], "alignment": "left" }) newfiscalarr.push({ "type": "text", "text": CurrencyFormatted(fiscalarr[i]["kolvo"], 3) + " * " + CurrencyFormatted(fiscalarr[i]["cenaout"]) + " = " + CurrencyFormatted(fiscalarr[i]["cenaout"] * fiscalarr[i]["kolvo"]), "alignment": "right" }) }); newfiscalarr.push({ "type": "text", "text": lineh, "alignment": "center" }) if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { if(thisbasket.info.cashdiscount > 0){ var dstring = CurrencyFormatted(thisbasket.info.cashdiscount); }else{ var dstring = thisbasket.info.discounttitle; } //Со скидкой newfiscalarr.push({ "type": "text", "text": app.print.modules.escposstr(1, stringlength, "СКИДКА:", dstring), "alignment": "left" }) } newfiscalarr.push({ "type": "text", "text": app.print.modules.escposstr(1, stringlength, "ИТОГ:", CurrencyFormatted(thisbasket["info"]["allcena"])), "alignment": "left" }) newfiscalarr.push({ "type": "text", "text": lineh, "alignment": "center" }) if (thisbasket["info"]["comment"] != "" && thisbasket["info"]["comment"] != undefined && thisbasket.info["checkcomments"] == 1) { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["Kommentariy_k_z_r2za7"] + ":" + thisbasket["info"]["comment"], }); } newfiscalarr.push({ "type": "text", "text": "НЕ ФИСКАЛЬНЫЙ", "alignment": "center" }) var jsonData = { "type": "nonFiscal", "items": newfiscalarr } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_android_v2.ExecuteCommand(jsonData, thisbasket.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, XReport: function(data) { var jsonData = { "type": "reportX", "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_android_v2.ExecuteCommand(jsonData, data.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, X3Report: function(data) { var jsonData = { "type": "reportX3", "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_android_v2.ExecuteCommand(jsonData, data.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, ZReport: function(data) { var jsonData = { "type": "closeShift", "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_android_v2.ExecuteCommand(jsonData, data.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, introduction: function(data) { var jsonData = { "type": "cashIn", "cashSum": round(data["cash"]), "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_android_v2.ExecuteCommand(jsonData, data.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, incasation: function(data) { var jsonData = { "type": "cashOut", "cashSum": round(data["cash"]), "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_android_v2.ExecuteCommand(jsonData, data.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, rashod: function(data) { var jsonData = { "type": "cashOut", "cashSum": round(data["cash"]), "operator": { "id": preload["users"][currentsklad][data["info"]["user"]]["user_id"], "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "pass": preload["users"][currentsklad][data["info"]["user"]]["user_pin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.minifp_android_v2.ExecuteCommand(jsonData, data.printer).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, getUser: function(name){ if(minifp["usersbase"][name]){ console.log("true"); return minifp["usersbase"][name]["id"]; }else{ console.log("false"); minifp["usersbase"][name] = { id:minifp["usersbase_count"], name:name } minifp["usersbase_count"]++; localStorage["minifp_usersbase"] = JSON.stringify(minifp["usersbase"]) return minifp["usersbase"][name]["id"]; } }, ExecuteCommand: function(Data, printer) { try{ Data.operator.id = this.getUser(Data.operator.name); //alert(Data.operator.id+" "+Data.operator.name); console.log(Data.operator.id); if(Data.operator.id > 31){ app.main.error("minifp: Порядковий номер співробітника більше ніж 31, код пимилки: 8163"); } }catch(err){ app.main.error("Не вдалось отримати номер співробітника, код пимилки: 8164"); } app.main.loader("show"); console.log("ExecuteCommand w8", Data); //alert(JSON.stringify(Data)); console.log("ExecuteCommand w8", JSON.stringify(Data)); return new Promise(function(resolve, reject) { try { Android.fiscalOperation(JSON.stringify({ deviceId:printer["id"], protocol:printer["protocol"], jsonObjectData:Data })); returnMiniFP.status = "empty"; try { /*На тот случай если прошлое ожидание не было завершено*/ clearInterval(waitingMiniFP); } catch (err) { /*Скорей всего уже было завершено*/ } var waitingMiniFP = setInterval(function() { console.log("Опрашиваем minifp") if (returnMiniFP.status == "done") { clearInterval(waitingMiniFP); app.main.loader("hide"); resolve({ status: "done", data: returnMiniFP }); } if (returnMiniFP.status == "error") { clearInterval(waitingMiniFP); app.main.loader("hide"); reject({ status: "error", data: returnMiniFP }); } }, 500); } catch (err) { console.log("Устройство minifp не найдено"); app.main.loader("hide"); reject({ status: "error" }); } }) }, ReturnCommand: function(jsondata) { var response = JSON.parse(jsondata) app.main.loader("hide"); if (response["status"] == "done") { returnMiniFP = response; } else { response["status"] = "error"; returnMiniFP = response; app.main.error("miniFP: "+response["errorCode"]+" - "+this.codeErro(response["errorCode"])); } }, ReturnSettings: function(jsondata) { //var atolsetings = JSON.parse(jsondata); //app.main.message("Сервисная информация"+"

"+"Model "+atolsetings.Model+"
"+"AccessPassword "+atolsetings.AccessPassword+"
"+"AutoDisableBluetooth "+atolsetings.AutoDisableBluetooth+"
"+"AutoEnableBluetooth "+atolsetings.AutoEnableBluetooth+"
"+"BaudRate "+atolsetings.BaudRate+"
"+"Bits "+atolsetings.Bits+"
"+"ComFile "+atolsetings.ComFile+"
"+"IPAddress "+atolsetings.IPAddress+"
"+"IPPort "+atolsetings.IPPort+"
"+"LibraryPath "+atolsetings.LibraryPath+"
"+"MACAddress "+atolsetings.MACAddress+"
"+"OfdChannel "+atolsetings.OfdChannel+"
"+"Parity "+atolsetings.Parity+"
"+"Port "+atolsetings.Port+"
"+"StopBits "+atolsetings.StopBits+"
"+"UsbDevicePath "+atolsetings.UsbDevicePath+"
"+"UserPassword "+atolsetings.UserPassword) app.main.message("Ответ от драйвера получен, для продолжение сохраните настройки"); $("#Atol10SettingsButton").removeClass("btn-danger"); $("#Atol10SettingsButton").addClass("btn-info"); $("#settings_device_list_edit_form_settings").val(JSON.stringify(jsondata)); }, }, atol_usb: { //Встроенный устаревший 9й версии Deprecated opendrawer: function(data) { try { this.ExecuteCommand({ IsFiscalCheck: true, Settings: { Model: data["printer"]["model"], Bits: "8", Pid: "5", Parity: "0", IPPort: "5555", TTYSuffix: "ttyACM0", MACAddress: "", Vid: "10514", Protocol: "2", //Protocol "По умолчанию" 0 "АТОЛ 2" 1 "АТОЛ 3" 2 UserPassword: "30", Port: data["printer"]["connectiontype"], ConnectionType: "1", AccessPassword: "0", DeviceName: "", StopBits: "0", AutoEnableBluetooth: "1", OfdPort: data["printer"]["ofdport"], IPAddress: data["printer"]["ip"], BaudRate: "9600", AutoDisableBluetooth: "0" }, Command: "OpenDrawer", NumDevice: 0, IdCommand: app.print.modules.guid() }); } catch (err) { console.log("kkt не алё") } }, opensmena: function(data) { var jsonData = { IsFiscalCheck: true, Settings: { Model: data["printer"]["model"], Bits: "8", Pid: "5", Parity: "0", IPPort: "5555", TTYSuffix: "ttyACM0", MACAddress: "", Vid: "10514", Protocol: "2", //Protocol "По умолчанию" 0 "АТОЛ 2" 1 "АТОЛ 3" 2 UserPassword: "30", Port: data["printer"]["connectiontype"], ConnectionType: "1", AccessPassword: "0", DeviceName: "", StopBits: "0", AutoEnableBluetooth: "1", OfdPort: data["printer"]["ofdport"], IPAddress: data["printer"]["ip"], BaudRate: "9600", AutoDisableBluetooth: "0" }, Command: "OpenSession", NumDevice: 0, IdCommand: app.print.modules.guid() } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_usb.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, check: function(thisbasket) { var nallll = 0; // Подготовка данных команды var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); var newfiscalarr = []; //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; //Собираем нужный массив и убираем позиции которые не подлежат налогообложению fiscalarr.forEach(function(item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] != "") { flag = 1; var newitem = {}; newitem["Name"] = item["name"]; newitem["Quantity"] = item["kolvo"]; newitem["Price"] = item["cenaout"]; if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } newitem["Amount"] = amount; newitem["Department"] = 0; newitem["Tax"] = round(item["tax"], 0); newitem["EAN13"] = ""; newfiscalarr.push({ "Register": newitem }); /*Плюсуем сумму*/ nallll = nallll + (item["kolvo"] * item["cenaout"]); } }); if (thisbasket["info"]["visa"] == "") { thisbasket["info"]["visa"] = 0; } var dali = thisbasket["info"]["cash"]; if (thisbasket["info"]["nall"] > 0) { dali = thisbasket["info"]["nall"] } var Data = { Settings: { Model: thisbasket["printer"]["model"], Bits: "8", Pid: "5", Parity: "0", IPPort: "5555", TTYSuffix: "ttyACM0", MACAddress: "", Vid: "10514", Protocol: "2", //Protocol "По умолчанию" 0 "АТОЛ 2" 1 "АТОЛ 3" 2 UserPassword: "30", Port: thisbasket["printer"]["connectiontype"], ConnectionType: "1", AccessPassword: "0", DeviceName: "", StopBits: "0", AutoEnableBluetooth: "1", OfdPort: thisbasket["printer"]["ofdport"], IPAddress: thisbasket["printer"]["ip"], BaudRate: "9600", AutoDisableBluetooth: "0" }, // Команда серверу Command: "RegisterCheck", //*********************************************************************************************************** // ПОЛЯ ПОИСКА УСТРОЙСТВА //*********************************************************************************************************** // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: 0, // ИНН ККМ для поиска. Если "" то ККМ ищется только по NumDevice, // Если NumDevice = 0 а InnKkm заполнено то ККМ ищется только по InnKkm //InnKkm: "", //--------------------------------------------- // Заводской номер ККМ для поиска. Если "" то ККМ ищется только по NumDevice, //KktNumber: "", // ********************************************************************************************************** // Время (сек) ожидания выполнения команды. //Если За это время команда не выполнилась в статусе вернется результат "NotRun" или "Run" //Проверить результат еще не выполненной команды можно командой "GetRezult" //Если не указано или 0 - то значение по умолчанию 60 сек. // Поле не обязательно. Это поле можно указывать во всех командах Timeout: 30, // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды // Поле не обязательно IdCommand: app.print.modules.guid(), // Это фискальный или не фискальный чек IsFiscalCheck: true, // Тип чека; // 0 – продажа; 10 – покупка; // 1 – возврат продажи; 11 - возврат покупки; // 8 - продажа только по ЕГАИС (обычный чек ККМ не печатается) // 9 - возврат продажи только по ЕГАИС (обычный чек ККМ не печатается) TypeCheck: 0, // Не печатать чек на бумагу NotPrint: false, //true, // Количество копий документа NumberCopies: 0, // Продавец, тег ОФД 1021 CashierName: preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], // ИНН продавца тег ОФД 1203 //CashierVATIN: "", // Телефон или е-Майл покупателя, тег ОФД 1008 // Если чек не печатается (NotPrint = true) то указывать обязательно // Формат: Телефон +{Ц} Email {С}@{C} //ClientAddress: "", //sochi@papa.com // Aдрес электронной почты отправителя чека тег ОФД 1117 (если задан при регистрации можно не указывать) // Формат: Email {С}@{C} //SenderEmail: "", //sochi@mama.com // Система налогообложения (СНО) применяемая для чека // Если не указанно - система СНО настроенная в ККМ по умолчанию // 0: Общая ОСН // 1: Упрощенная УСН (Доход) // 2: Упрощенная УСН (Доход минус Расход) // 3: Единый налог на вмененный доход ЕНВД // 4: Единый сельскохозяйственный налог ЕСН // 5: Патентная система налогообложения // Комбинация разных СНО не возможна // Надо указывать если ККМ настроена на несколько систем СНО // ОСН - 1 // УСН доход - 2 // УСН доход-расход - 4 // ЕНВД - 8 // ЕСН - 16 // ПСН - 32 TaxVariant: thisbasket["printer"]["cno"], // Дополнительные произвольные реквизиты (не обязательно) пока только 1 строка /* AdditionalProps: [ //{ Print: true, PrintInHeader: false, NameProp: "Номер транзакции", Prop: "234/154" }, { Print: true, PrintInHeader: false, NameProp: "Дата транзакции", Prop: "10.11.2016 10:30" }, ], */ //ClientId: "557582273e4edc1c6f315efe", // Это только для тестов: Получение ключа суб-лицензии : ВНИМАНИЕ: ключ суб-лицензии вы должны генерить у себя на сервере!!!! // КПП организации, нужно только для ЕГАИС //KPP: "782543005", // Строки чека // НДС в процентах или ТЕГ НДС: //0 (НДС 0%), //10 (НДС 10%), //18 (НДС 18%), //-1 (НДС не облагается), //118 (НДС 18/118), //110 (НДС 10/110) //Atol usb //int TAX_VAT_0 = 1; //int TAX_VAT_10 = 2; //int TAX_VAT_18 = 3; //int TAX_VAT_NO = 4; //int TAX_VAT_110 = 5; //int TAX_VAT_118 = 6; CheckStrings: newfiscalarr, AddNonfiscalCheck: false, /* поставил true, было false */ /* slipCheck:[{ text: "ФИСКАЛЬНЫЙ", alignment:1, warp:"1", type: "text" }, { type: "qr", qrValue: "1234567890", qrType: "1" }], */ // Наличная оплата (2 знака после запятой) Cash: dali, // Сумма электронной оплаты (2 знака после запятой) ElectronicPayment: thisbasket["info"]["visa"], NonCash: thisbasket["info"]["visa"], // Сумма из предоплаты (зачетом аванса) (2 знака после запятой) AdvancePayment: 0, // Сумма постоплатой(в кредит) (2 знака после запятой) Credit: 0, // Сумма оплаты встречным предоставлением (сертификаты, др. мат.ценности) (2 знака после запятой) CashProvision: 0, }; console.log(Data.Settings); /*Проверка не пустон ли поле оплаты безналом*/ if (Data.ElectronicPayment == "") { Data.ElectronicPayment = 0; } // Вызов команды //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_usb.ExecuteCommand(Data).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, vozvrat: function(thisbasket) { // Подготовка данных команды var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); var newfiscalarr = []; var nallll = 0; fiscalarr.forEach(function(item) { if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["Tax"] != "") { newfiscalarr.push({ Register: { SignMethodCalculation: 4, SignCalculationObject: 1, Name: item["name"], Quantity: round(item["kolvo"]), Amount: amount, Price: round(item["cenaout"]), Department: 0, PerDisc: 0, SumDisc: 0, Tax: round(item["tax"], 0) } }); nallll = nallll + amount; } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ kostilsumm = kostilsumm + amount; } }); var dali = round(nallll, 2); if (thisbasket["info"]["nall"] > 0) { dali = thisbasket["info"]["nall"] } var Data = { Settings: { Model: thisbasket["printer"]["model"], Bits: "8", Pid: "5", Parity: "0", IPPort: "5555", TTYSuffix: "ttyACM0", MACAddress: "", Vid: "10514", Protocol: "2", //Protocol "По умолчанию" 0 "АТОЛ 2" 1 "АТОЛ 3" 2 UserPassword: "30", Port: thisbasket["printer"]["connectiontype"], ConnectionType: "1", AccessPassword: "0", DeviceName: "", StopBits: "0", AutoEnableBluetooth: "1", OfdPort: thisbasket["printer"]["ofdport"], IPAddress: thisbasket["printer"]["ip"], BaudRate: "9600", AutoDisableBluetooth: "0" }, // Команда серверу Command: "Return", Protocol: 1, //PortName:"ttyACM0", PortName: thisbasket.printer.serialport, PortSpeed: 0, Printer: thisbasket.printer, //*********************************************************************************************************** // ПОЛЯ ПОИСКА УСТРОЙСТВА //*********************************************************************************************************** // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: 0, // ИНН ККМ для поиска. Если "" то ККМ ищется только по NumDevice, // Если NumDevice = 0 а InnKkm заполнено то ККМ ищется только по InnKkm //InnKkm: "", //--------------------------------------------- // Заводской номер ККМ для поиска. Если "" то ККМ ищется только по NumDevice, //KktNumber: "", // ********************************************************************************************************** // Время (сек) ожидания выполнения команды. //Если За это время команда не выполнилась в статусе вернется результат "NotRun" или "Run" //Проверить результат еще не выполненной команды можно командой "GetRezult" //Если не указано или 0 - то значение по умолчанию 60 сек. // Поле не обязательно. Это поле можно указывать во всех командах Timeout: 30, // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды // Поле не обязательно IdCommand: app.print.modules.guid(), // Это фискальный или не фискальный чек IsFiscalCheck: true, // Тип чека; // 0 – продажа; 10 – покупка; // 1 – возврат продажи; 11 - возврат покупки; // 8 - продажа только по ЕГАИС (обычный чек ККМ не печатается) // 9 - возврат продажи только по ЕГАИС (обычный чек ККМ не печатается) TypeCheck: 1, // Не печатать чек на бумагу NotPrint: false, //true, // Количество копий документа NumberCopies: 0, // Продавец, тег ОФД 1021 CashierName: preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], // ИНН продавца тег ОФД 1203 TaxVariant: 2, // Телефон или е-Майл покупателя, тег ОФД 1008 // Если чек не печатается (NotPrint = true) то указывать обязательно // Формат: Телефон +{Ц} Email {С}@{C} //ClientAddress: "", //sochi@papa.com // Aдрес электронной почты отправителя чека тег ОФД 1117 (если задан при регистрации можно не указывать) // Формат: Email {С}@{C} //SenderEmail: "", //sochi@mama.com // Система налогообложения (СНО) применяемая для чека // Если не указанно - система СНО настроенная в ККМ по умолчанию // 0: Общая ОСН // 1: Упрощенная УСН (Доход) // 2: Упрощенная УСН (Доход минус Расход) // 3: Единый налог на вмененный доход ЕНВД // 4: Единый сельскохозяйственный налог ЕСН // 5: Патентная система налогообложения // Комбинация разных СНО не возможна // Надо указывать если ККМ настроена на несколько систем СНО //TaxVariant: "", // Дополнительные произвольные реквизиты (не обязательно) пока только 1 строка /* AdditionalProps: [ //{ Print: true, PrintInHeader: false, NameProp: "Номер транзакции", Prop: "234/154" }, { Print: true, PrintInHeader: false, NameProp: "Дата транзакции", Prop: "10.11.2016 10:30" }, ], */ //ClientId: "557582273e4edc1c6f315efe", // Это только для тестов: Получение ключа суб-лицензии : ВНИМАНИЕ: ключ суб-лицензии вы должны генерить у себя на сервере!!!! KeySubLicensing: preload["settings"]["kkmKeySubLicensing"], // КПП организации, нужно только для ЕГАИС //KPP: "782543005", // Строки чека // НДС в процентах или ТЕГ НДС: //0 (НДС 0%), //10 (НДС 10%), //18 (НДС 18%), //-1 (НДС не облагается), //118 (НДС 18/118), //110 (НДС 10/110) CheckStrings: newfiscalarr, // Наличная оплата (2 знака после запятой) Cash: thisbasket["info"]["cash"], nall: dali, // Сумма электронной оплаты (2 знака после запятой) ElectronicPayment: thisbasket["info"]["visa"], // Сумма из предоплаты (зачетом аванса) (2 знака после запятой) AdvancePayment: 0, // Сумма постоплатой(в кредит) (2 знака после запятой) Credit: 0, // Сумма оплаты встречным предоставлением (сертификаты, др. мат.ценности) (2 знака после запятой) CashProvision: 0, PerDisc: 0, SumDisc: 0, CashLessType: 0 }; /*Проверка не пустон ли поле оплаты безналом*/ if (Data.ElectronicPayment == "") { Data.ElectronicPayment = 0; } var IsBarCode = false; /*хз зачем это поеэтому вырубаем*/ /*Если чек без ШК то удаляем строку с ШК*/ if (IsBarCode == false) { //Data.Cash = 100; for (var i = 0; i < Data.CheckStrings.length; i++) { if (Data.CheckStrings[i] != undefined && Data.CheckStrings[i].BarCode != undefined) { Data.CheckStrings[i].BarCode = null; }; if (Data.CheckStrings[i] != undefined && Data.CheckStrings[i].PrintImage != undefined) { Data.CheckStrings[i].PrintImage = null; }; }; }; /* Скидываем данные об агенте - т.к.у Вас невярнека ККТ не зарегистрирована как Агент.*/ for (var i = 0; i < Data.CheckStrings.length; i++) { if (Data.CheckStrings[i] != undefined && Data.CheckStrings[i].Register != undefined) { Data.CheckStrings[i].Register.AgentSign = null; Data.CheckStrings[i].Register.AgentData = null; Data.CheckStrings[i].Register.PurveyorData = null; }; }; // Вызов команды //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_usb.ExecuteCommand(Data).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, precheck: function(thisbasket) { console.log("atol", thisbasket) var newfiscalarr = []; try { newfiscalarr.push({ text: "Счёт на оплату", alignment: "1", warp: "0" }) } catch (err) {} try { var stringlength = 48; try{ if(thisbasket["printer"]["model"] == "sigma10"){ var stringlength = 32; } }catch(err){ } var lineh = ""; for (var i = 0; i < stringlength; i++) { lineh = lineh + "-"; } } catch (err) { lineh = ""; } try { newfiscalarr.push({ text: lineh, alignment: 0, warp: "0" }) } catch (err) {} var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); fiscalarr.forEach(function(item, i) { //Собираем нужный массив try { newfiscalarr.push({ text: fiscalarr[i]["name"], alignment: 0, warp: "0" }) } catch (err) {} try { newfiscalarr.push({ text: CurrencyFormatted(fiscalarr[i]["kolvo"], 3) + " * " + CurrencyFormatted(fiscalarr[i]["cenaout"]) + " = " + CurrencyFormatted(fiscalarr[i]["cenaout"] * fiscalarr[i]["kolvo"]), alignment: 2, warp: "0" }) } catch (err) {} }); try { newfiscalarr.push({ text: lineh, alignment: 0, warp: "0" }) } catch (err) {} try { if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { //Со скидкой newfiscalarr.push({ text: "СКИДКА:" + CurrencyFormatted(thisbasket["info"]["cashdiscount"]), alignment: 2, warp: "0" }) } } catch (err) {} try { newfiscalarr.push({ text: "ИТОГ " + CurrencyFormatted(thisbasket["info"]["allcena"]), alignment: 2, warp: "0" }) } catch (err) {} try { newfiscalarr.push({ text: lineh, alignment: 1, warp: "0" }) } catch (err) {} try { newfiscalarr.push({ text: "НЕ ФИСКАЛЬНЫЙ", alignment: 1, warp: "0" }) } catch (err) {} console.log("массив на пречек", newfiscalarr); var data = { IsFiscalCheck: true, Settings: { Model: thisbasket["printer"]["model"], Bits: "8", Pid: "5", Parity: "0", IPPort: "5555", TTYSuffix: "ttyACM0", MACAddress: "", Vid: "10514", Protocol: "2", //Protocol "По умолчанию" 0 "АТОЛ 2" 1 "АТОЛ 3" 2 UserPassword: "30", Port: thisbasket["printer"]["connectiontype"], ConnectionType: "1", AccessPassword: "0", DeviceName: "", StopBits: "0", AutoEnableBluetooth: "1", OfdPort: thisbasket["printer"]["ofdport"], IPAddress: thisbasket["printer"]["ip"], BaudRate: "9600", AutoDisableBluetooth: "0" }, slipCheck: newfiscalarr, Command: "PrintNonfiscalCheck", NumDevice: 0, IdCommand: app.print.modules.guid() } console.log("DATA", data) // Вызов команды this.ExecuteCommand(data) }, XReport: function(data) { var jsonData = { IsFiscalCheck: true, Settings: { Model: data["printer"]["model"], Bits: "8", Pid: "5", Parity: "0", IPPort: "5555", TTYSuffix: "ttyACM0", MACAddress: "", Vid: "10514", Protocol: "2", //Protocol "По умолчанию" 0 "АТОЛ 2" 1 "АТОЛ 3" 2 UserPassword: "30", Port: data["printer"]["connectiontype"], ConnectionType: "1", AccessPassword: "0", DeviceName: "", StopBits: "0", AutoEnableBluetooth: "1", OfdPort: data["printer"]["ofdport"], IPAddress: data["printer"]["ip"], BaudRate: "9600", AutoDisableBluetooth: "0" }, Command: "XReport", NumDevice: 0, IdCommand: app.print.modules.guid() } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_usb.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, ZReport: function(data) { var jsonData = { IsFiscalCheck: true, Settings: { Model: data["printer"]["model"], Bits: "8", Pid: "5", Parity: "0", IPPort: "5555", TTYSuffix: "ttyACM0", MACAddress: "", Vid: "10514", Protocol: "2", //Protocol "По умолчанию" 0 "АТОЛ 2" 1 "АТОЛ 3" 2 UserPassword: "30", Port: data["printer"]["connectiontype"], ConnectionType: "1", AccessPassword: "0", DeviceName: "", StopBits: "0", AutoEnableBluetooth: "1", OfdPort: data["printer"]["ofdport"], IPAddress: data["printer"]["ip"], BaudRate: "9600", AutoDisableBluetooth: "0" }, Command: "ZReport", NumDevice: 0, IdCommand: app.print.modules.guid() } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_usb.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, introduction: function(data) { var jsonData = { IsFiscalCheck: true, Settings: { Model: data["printer"]["model"], Bits: "8", Pid: "5", Parity: "0", IPPort: "5555", TTYSuffix: "ttyACM0", MACAddress: "", Vid: "10514", Protocol: "2", //Protocol "По умолчанию" 0 "АТОЛ 2" 1 "АТОЛ 3" 2 UserPassword: "30", Port: data["printer"]["connectiontype"], ConnectionType: "1", AccessPassword: "0", DeviceName: "", StopBits: "0", AutoEnableBluetooth: "1", OfdPort: data["printer"]["ofdport"], IPAddress: data["printer"]["ip"], BaudRate: "9600", AutoDisableBluetooth: "0" }, Command: "CashIncome", Summ: round(data["cash"]), Protocol: 1, PortName: data.printer.serialport, PortSpeed: 0, Printer: data.printer, NumDevice: 0, IdCommand: app.print.modules.guid() } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_usb.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, incasation: function(data) { var jsonData = { IsFiscalCheck: true, Settings: { Model: data["printer"]["model"], Bits: "8", Pid: "5", Parity: "0", IPPort: "5555", TTYSuffix: "ttyACM0", MACAddress: "", Vid: "10514", Protocol: "2", //Protocol "По умолчанию" 0 "АТОЛ 2" 1 "АТОЛ 3" 2 UserPassword: "30", Port: data["printer"]["connectiontype"], ConnectionType: "1", AccessPassword: "0", DeviceName: "", StopBits: "0", AutoEnableBluetooth: "1", OfdPort: data["printer"]["ofdport"], IPAddress: data["printer"]["ip"], BaudRate: "9600", AutoDisableBluetooth: "0" }, Command: "CashOutcome", Summ: round(data["cash"]), Protocol: 1, PortName: data.printer.serialport, PortSpeed: 0, Printer: data.printer, NumDevice: 0, IdCommand: app.print.modules.guid() } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_usb.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, rashod: function(data) { var jsonData = { IsFiscalCheck: true, Settings: { Model: data["printer"]["model"], Bits: "8", Pid: "5", Parity: "0", IPPort: "5555", TTYSuffix: "ttyACM0", MACAddress: "", Vid: "10514", Protocol: "2", //Protocol "По умолчанию" 0 "АТОЛ 2" 1 "АТОЛ 3" 2 UserPassword: "30", Port: data["printer"]["connectiontype"], ConnectionType: "1", AccessPassword: "0", DeviceName: "", StopBits: "0", AutoEnableBluetooth: "1", OfdPort: data["printer"]["ofdport"], IPAddress: data["printer"]["ip"], BaudRate: "9600", AutoDisableBluetooth: "0" }, Command: "CashOutcome", Summ: round(data["cash"]), Protocol: 1, PortName: data.printer.serialport, PortSpeed: 0, Printer: data.printer, NumDevice: 0, IdCommand: app.print.modules.guid() } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_usb.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, ExecuteCommand: function(Data) { switch (Data.Settings.Model) { case "11F": Data.Settings.Model = 67; break; case "15F": Data.Settings.Model = 78; break; case "20F": Data.Settings.Model = 81; break; case "22F": Data.Settings.Model = 63; break; case "25F": Data.Settings.Model = 57; break; case "30F": Data.Settings.Model = 61; break; case "30Fplus": Data.Settings.Model = 61; break; case "42FS": Data.Settings.Model = 77; break; case "50F": Data.Settings.Model = 80; break; case "52F": Data.Settings.Model = 64; break; case "55F": Data.Settings.Model = 62; break; case "60F": Data.Settings.Model = 75; break; case "77F": Data.Settings.Model = 69; break; case "90F": Data.Settings.Model = 72; break; case "91F": Data.Settings.Model = 82; break; } return new Promise(function(resolve, reject) { try { Android.atol(JSON.stringify(Data)); setTimeout(function() { resolve({ status: "done" }); }, 100) /* var AtolwaitingTime = 0; var waitingAtol = setInterval(function(){ AtolwaitingTime = AtolwaitingTime + 500; console.log("Опрашиваем Атол") if(AtolwaitingTime > 10000){ reject({ status:"error", text:"Нет ответа от атол, привышено время ожидания" }) clearInterval(waitingAtol) app.main.error("Нет ответа от атол, привышено время ожидания"); } },500); */ } catch (err) { console.log("kkt не алё") reject({ status: "error", text: "Нет ответа от атол, привышено время ожидания" }) } }) }, }, atol_apk: { //Актуальный для платформы 2.5 Deprecated opensmena: function(data) { var jsonData = { "type": "openShift", "operator": { "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "vatin": preload["users"][currentsklad][data["info"]["user"]]["user_vatin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_apk.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, opendrawer: function(data) { var jsonData = { "type": "openDrawer", "operator": { "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "vatin": preload["users"][currentsklad][data["info"]["user"]]["user_vatin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_apk.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, check: function(thisbasket) { var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); var newfiscalarr = []; //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; //Собираем нужный массив и убираем позиции которые не подлежат налогообложению fiscalarr.forEach(function(item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } if (item["tax"] != "") { flag = 1; var newitem = {} newitem["name"] = item["name"]; newitem["quantity"] = round(item["kolvo"], 3); newitem["price"] = round(item["cenaout"], 2); if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } newitem["amount"] = amount; newitem["department"] = 1; newitem["type"] = "position"; newitem["tax"] = { type: item["tax"] } try{ if(thisbasket["info"]["nopaymentstype"] == "debt"){ newitem["paymentMethod"] = "credit"; } }catch(err){ } //fullPrepayment - предоплата 100% //prepayment - предоплата //advance - аванс //fullPayment - полный расчет - по умолчанию //partialPayment - частичный расчет и кредит //credit - передача в кредит //creditPayment - оплата кредита // "infoDiscountAmount": 0.0, //"measurementUnit": "кг", //"paymentMethod": "advance", //"paymentObject": "commodity", //"nomenclatureCode": "MTIzNDEyMzQ1Njc4MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=", newfiscalarr.push(newitem) } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } kostilsumm = kostilsumm + amount; } }); var dali = thisbasket["info"]["cash"]; if (thisbasket["info"]["nall"] > 0) { dali = thisbasket["info"]["nall"] } //Отнимаем от суммы которую дал клиент сумму товара который не пошел на печать на фискальник dali = dali - kostilsumm; if (kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы онлайн кассе"); } var jsonData = { "type": "sell", "taxationType": thisbasket["printer"]["cno"], "operator": { "name": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], "vatin": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_vatin"] }, "items": newfiscalarr, "payments": [] }; var sore = document.querySelector('input[name="sendreceipt"]:checked').value; if(sore != "none"){ var emailOrPhone = "" if(sore == "sms"){ emailOrPhone = $("#send_client_phone").val(); } if(sore == "email"){ emailOrPhone = $("#send_client_email").val(); } jsonData["electronically"] = true; jsonData["clientInfo"] = { "emailOrPhone": emailOrPhone } console.log("ATOL Отправка клиенту", emailOrPhone) } try{ if(thisbasket["printer"]["cno"] == "" || thisbasket["printer"]["cno"] == undefined){ delete jsonData["taxationType"]; } }catch(err){ } jsonData.payments.push({ "type": "cash", "sum": dali }) /*Сумма электронной оплаты (2 знака после запятой)*/ try { var ElectronicPayment = round(thisbasket["info"]["visa"]); } catch (err) { var ElectronicPayment = 0; } if (ElectronicPayment > 0) { jsonData.payments.push({ "type": "electronically", "sum": ElectronicPayment }) } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_apk.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, vozvrat: function(thisbasket) { //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; var nallll = 0; var newfiscalarr = []; var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); //Собираем нужный массив и убираем позиции которые не подлежат налогообложению fiscalarr.forEach(function(item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } if (item["tax"] != "") { flag = 1; var newitem = {} newitem["name"] = item["name"]; newitem["quantity"] = round(item["kolvo"], 3); newitem["price"] = round(item["cenaout"], 2); if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } newitem["amount"] = amount; newitem["department"] = 1; newitem["type"] = "position"; newitem["tax"] = { type: item["tax"] } // "infoDiscountAmount": 0.0, //"measurementUnit": "кг", //"paymentMethod": "advance", //"paymentObject": "commodity", //"nomenclatureCode": "MTIzNDEyMzQ1Njc4MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=", newfiscalarr.push(newitem) } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } kostilsumm = kostilsumm + amount; } }); if (kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы онлайн кассе"); } // Вызов команды var jsonData = { "type": "sellReturn", "taxationType": thisbasket["printer"]["cno"], "operator": { "name": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], "vatin": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_vatin"] }, "items": newfiscalarr, "payments": [] }; try{ if(thisbasket["printer"]["cno"] == "" || thisbasket["printer"]["cno"] == undefined){ delete jsonData["taxationType"]; } }catch(err){ } //Наличка if(thisbasket["info"]["cash"] > 0){ jsonData["payments"].push({ "type": "cash", "sum": round(thisbasket["info"]["cash"], 2) }); } //Безнал if(thisbasket["info"]["visa"] > 0){ jsonData["payments"].push({ "type": "electronically", "sum": round(thisbasket["info"]["visa"], 2) }); } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_apk.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, precheck: function(thisbasket) { var stringlength = 48; try{ if(thisbasket["printer"]["model"] == "sigma10"){ var stringlength = 32; } }catch(err){ } var lineh = ""; for (var i = 0; i < stringlength; i++) { lineh = lineh + "-"; } var newfiscalarr = []; newfiscalarr.push({ "type": "text", "text": "Счёт на оплату", "alignment": "center" }) newfiscalarr.push({ "type": "text", "text": lineh, "alignment": "center" }) var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); fiscalarr.forEach(function(item, i) { //Собираем нужный массив newfiscalarr.push({ "type": "text", "text": fiscalarr[i]["name"], "alignment": "left" }) newfiscalarr.push({ "type": "text", "text": CurrencyFormatted(fiscalarr[i]["kolvo"], 3) + " * " + CurrencyFormatted(fiscalarr[i]["cenaout"]) + " = " + CurrencyFormatted(fiscalarr[i]["cenaout"] * fiscalarr[i]["kolvo"]), "alignment": "right" }) }); newfiscalarr.push({ "type": "text", "text": lineh, "alignment": "center" }) if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { //Со скидкой newfiscalarr.push({ "type": "text", "text": app.print.modules.escposstr(3, stringlength, "СКИДКА:", CurrencyFormatted(thisbasket["info"]["cashdiscount"])), "alignment": "left" }) } newfiscalarr.push({ "type": "text", "text": app.print.modules.escposstr(1, stringlength, "ИТОГ:", CurrencyFormatted(thisbasket["info"]["allcena"])), "alignment": "left" }) newfiscalarr.push({ "type": "text", "text": lineh, "alignment": "center" }) newfiscalarr.push({ "type": "text", "text": "НЕ ФИСКАЛЬНЫЙ", "alignment": "center" }) var jsonData = { "type": "nonFiscal", "items": newfiscalarr } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_apk.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, XReport: function(data) { var jsonData = { "type": "reportX", "operator": { "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "vatin": preload["users"][currentsklad][data["info"]["user"]]["user_vatin"] } }; //Вызов Android.atol_apk(JSON.stringify(jsonData)); /* return new Promise(function(resolve, reject) { app.print.protocols.atol_apk.ExecuteCommand(jsonData).then( function(success) { resolve(success); }, function(error) { reject(error); } ) }); */ }, ZReport: function(data) { var jsonData = { "type": "closeShift", "operator": { "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "vatin": preload["users"][currentsklad][data["info"]["user"]]["user_vatin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_apk.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, introduction: function(data) { var jsonData = { "type": "cashIn", "cashSum": round(data["cash"]) }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_apk.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, incasation: function(data) { var jsonData = { "type": "cashOut", "cashSum": round(data["cash"]) }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_apk.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, rashod: function(data) { var jsonData = { "type": "cashOut", "cashSum": round(data["cash"]) }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_apk.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, ExecuteCommand: function(Data) { app.main.loader("show"); return new Promise(function(resolve, reject) { try { Android.atol_apk(JSON.stringify(Data)); returnAtolapk.status = "empty"; try { /*На тот случай если прошлое ожидание не было завершено*/ clearInterval(waitingAtolapk); } catch (err) { /*Скорей всего уже было завершено*/ } var waitingAtolapk = setInterval(function() { console.log("Опрашиваем Атол apk") if (returnAtolapk.status == "done") { clearInterval(waitingAtolapk); app.main.loader("hide"); resolve({ status: "done", data: returnAtolapk }); } if (returnAtolapk.status == "error") { clearInterval(waitingAtolapk); app.main.loader("hide"); reject({ status: "error", data: returnAtolapk }); } }, 500); } catch (err) { console.log("Не удалось вызвать службу Атол apk"); app.main.loader("hide"); reject({ status: "error" }); } }) }, ReturnCommand: function(jsondata) { var response = JSON.parse(jsondata) app.main.loader("hide"); if (response.result.error == 0) { response["status"] = "done"; returnAtolapk = response; } else { response["status"] = "error"; returnAtolapk = response; app.main.error(response.result.description) } }, }, atol_apk_v2: { //Актуальный для платформы 5 opensmena: function(data) { var jsonData = { "type": "openShift", "operator": { "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "vatin": preload["users"][currentsklad][data["info"]["user"]]["user_vatin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_apk.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, opendrawer: function(data) { var jsonData = { "type": "openDrawer", "operator": { "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "vatin": preload["users"][currentsklad][data["info"]["user"]]["user_vatin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_apk.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, check: function(thisbasket) { var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); var newfiscalarr = []; //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; //Собираем нужный массив и убираем позиции которые не подлежат налогообложению fiscalarr.forEach(function(item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } if (item["tax"] != "") { flag = 1; var newitem = {} newitem["name"] = item["name"]; newitem["quantity"] = round(item["kolvo"], 3); if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; var price = item["cenaout_discount"]; var discsum = round((item["cenaout"] * item["kolvo"])-amount,2); if(discsum > 0){ newitem["infoDiscountAmount"] = round((item["cenaout"] * item["kolvo"])-amount,2); } } else { amount = item["cenaout"] * item["kolvo"]; var price = item["cenaout"]; } newitem["price"] = round(price, 2); newitem["amount"] = amount; newitem["department"] = 1; newitem["type"] = "position"; newitem["tax"] = { type: item["tax"] } try{ if(thisbasket["info"]["nopaymentstype"] == "debt"){ newitem["paymentMethod"] = "credit"; } }catch(err){ } //fullPrepayment - предоплата 100% //prepayment - предоплата //advance - аванс //fullPayment - полный расчет - по умолчанию //partialPayment - частичный расчет и кредит //credit - передача в кредит //creditPayment - оплата кредита // "infoDiscountAmount": 0.0, //"measurementUnit": "кг", //"paymentMethod": "advance", //"paymentObject": "commodity", //"nomenclatureCode": "MTIzNDEyMzQ1Njc4MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=", newfiscalarr.push(newitem) } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } kostilsumm = kostilsumm + amount; } }); var dali = thisbasket["info"]["cash"]; if (thisbasket["info"]["nall"] > 0) { dali = thisbasket["info"]["nall"] } //Отнимаем от суммы которую дал клиент сумму товара который не пошел на печать на фискальник dali = dali - kostilsumm; if (kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы онлайн кассе"); } var jsonData = { "type": "sell", "taxationType": thisbasket["printer"]["cno"], "operator": { "name": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], "vatin": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_vatin"] }, "items": newfiscalarr, "payments": [] }; var sore = document.querySelector('input[name="sendreceipt"]:checked').value; if(sore != "none"){ var emailOrPhone = "" if(sore == "sms"){ emailOrPhone = $("#send_client_phone").val(); } if(sore == "email"){ emailOrPhone = $("#send_client_email").val(); } jsonData["electronically"] = true; jsonData["clientInfo"] = { "emailOrPhone": emailOrPhone } console.log("ATOL Отправка клиенту", emailOrPhone) } try{ if(thisbasket["printer"]["cno"] == "" || thisbasket["printer"]["cno"] == undefined){ delete jsonData["taxationType"]; } }catch(err){ } jsonData.payments.push({ "type": "cash", "sum": dali }) /*Сумма электронной оплаты (2 знака после запятой)*/ try { var ElectronicPayment = round(thisbasket["info"]["visa"]); } catch (err) { var ElectronicPayment = 0; } if (ElectronicPayment > 0) { jsonData.payments.push({ "type": "electronically", "sum": ElectronicPayment }) } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_apk.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, vozvrat: function(thisbasket) { //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; var nallll = 0; var newfiscalarr = []; var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); //Собираем нужный массив и убираем позиции которые не подлежат налогообложению fiscalarr.forEach(function(item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } if (item["tax"] != "") { flag = 1; var newitem = {} newitem["name"] = item["name"]; newitem["quantity"] = round(item["kolvo"], 3); if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; var price = item["cenaout_discount"]; var discsum = round((item["cenaout"] * item["kolvo"])-amount,2); if(discsum > 0){ newitem["infoDiscountAmount"] = round((item["cenaout"] * item["kolvo"])-amount,2); } } else { amount = item["cenaout"] * item["kolvo"]; var price = item["cenaout"]; } newitem["price"] = round(price, 2); newitem["amount"] = amount; newitem["department"] = 1; newitem["type"] = "position"; newitem["tax"] = { type: item["tax"] } // "infoDiscountAmount": 0.0, //"measurementUnit": "кг", //"paymentMethod": "advance", //"paymentObject": "commodity", //"nomenclatureCode": "MTIzNDEyMzQ1Njc4MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=", newfiscalarr.push(newitem) } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } kostilsumm = kostilsumm + amount; } }); if (kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы онлайн кассе"); } // Вызов команды var jsonData = { "type": "sellReturn", "taxationType": thisbasket["printer"]["cno"], "operator": { "name": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], "vatin": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_vatin"] }, "items": newfiscalarr, "payments": [] }; try{ if(thisbasket["printer"]["cno"] == "" || thisbasket["printer"]["cno"] == undefined){ delete jsonData["taxationType"]; } }catch(err){ } //Наличка if(thisbasket["info"]["cash"] > 0){ jsonData["payments"].push({ "type": "cash", "sum": round(thisbasket["info"]["cash"], 2) }); } //Безнал if(thisbasket["info"]["visa"] > 0){ jsonData["payments"].push({ "type": "electronically", "sum": round(thisbasket["info"]["visa"], 2) }); } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_apk.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, precheck: function(thisbasket) { var stringlength = 48; try{ if(thisbasket["printer"]["model"] == "sigma10"){ var stringlength = 32; } }catch(err){ } var lineh = ""; for (var i = 0; i < stringlength; i++) { lineh = lineh + "-"; } var newfiscalarr = []; newfiscalarr.push({ "type": "text", "text": "Счёт на оплату", "alignment": "center" }) newfiscalarr.push({ "type": "text", "text": lineh, "alignment": "center" }) var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); fiscalarr.forEach(function(item, i) { //Собираем нужный массив newfiscalarr.push({ "type": "text", "text": fiscalarr[i]["name"], "alignment": "left" }) newfiscalarr.push({ "type": "text", "text": CurrencyFormatted(fiscalarr[i]["kolvo"], 3) + " * " + CurrencyFormatted(fiscalarr[i]["cenaout"]) + " = " + CurrencyFormatted(fiscalarr[i]["cenaout"] * fiscalarr[i]["kolvo"]), "alignment": "right" }) }); newfiscalarr.push({ "type": "text", "text": lineh, "alignment": "center" }) if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { //Со скидкой newfiscalarr.push({ "type": "text", "text": app.print.modules.escposstr(3, stringlength, "СКИДКА:", CurrencyFormatted(thisbasket["info"]["cashdiscount"])), "alignment": "left" }) } newfiscalarr.push({ "type": "text", "text": app.print.modules.escposstr(1, stringlength, "ИТОГ:", CurrencyFormatted(thisbasket["info"]["allcena"])), "alignment": "left" }) newfiscalarr.push({ "type": "text", "text": lineh, "alignment": "center" }) newfiscalarr.push({ "type": "text", "text": "НЕ ФИСКАЛЬНЫЙ", "alignment": "center" }) var jsonData = { "type": "nonFiscal", "items": newfiscalarr } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_apk.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, XReport: function(data) { var jsonData = { "type": "reportX", "operator": { "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "vatin": preload["users"][currentsklad][data["info"]["user"]]["user_vatin"] } }; //Вызов Android.atol_apk(JSON.stringify(jsonData)); /* return new Promise(function(resolve, reject) { app.print.protocols.atol_apk.ExecuteCommand(jsonData).then( function(success) { resolve(success); }, function(error) { reject(error); } ) }); */ }, ZReport: function(data) { var jsonData = { "type": "closeShift", "operator": { "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "vatin": preload["users"][currentsklad][data["info"]["user"]]["user_vatin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_apk.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, introduction: function(data) { var jsonData = { "type": "cashIn", "cashSum": round(data["cash"]) }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_apk.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, incasation: function(data) { var jsonData = { "type": "cashOut", "cashSum": round(data["cash"]) }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_apk.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, rashod: function(data) { var jsonData = { "type": "cashOut", "cashSum": round(data["cash"]) }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_apk.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, ExecuteCommand: function(Data) { app.main.loader("show"); return new Promise(function(resolve, reject) { try { Android.atol_apk(JSON.stringify(Data)); returnAtolapk.status = "empty"; try { /*На тот случай если прошлое ожидание не было завершено*/ clearInterval(waitingAtolapk); } catch (err) { /*Скорей всего уже было завершено*/ } var waitingAtolapk = setInterval(function() { console.log("Опрашиваем Атол apk") if (returnAtolapk.status == "done") { clearInterval(waitingAtolapk); app.main.loader("hide"); resolve({ status: "done", data: returnAtolapk }); } if (returnAtolapk.status == "error") { clearInterval(waitingAtolapk); app.main.loader("hide"); reject({ status: "error", data: returnAtolapk }); } }, 500); } catch (err) { console.log("Не удалось вызвать службу Атол apk"); app.main.loader("hide"); reject({ status: "error" }); } }) }, ReturnCommand: function(jsondata) { var response = JSON.parse(jsondata) app.main.loader("hide"); if (response.result.error == 0) { response["status"] = "done"; returnAtolapk = response; } else { response["status"] = "error"; returnAtolapk = response; app.main.error(response.result.description) } }, }, atol_10_ios:{ //Поскольку не был еще в релизе то можем этот отредачить //Поскольку не был еще в релизе то можем этот отредачить opensmena: function(data) { var jsonData = { "type": "openShift", "operator": { "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "vatin": preload["users"][currentsklad][data["info"]["user"]]["user_vatin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_10_ios.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, opendrawer: function(data) { var jsonData = { "type": "openDrawer", "operator": { "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "vatin": preload["users"][currentsklad][data["info"]["user"]]["user_vatin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_10_ios.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, check: function(thisbasket) { var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); var newfiscalarr = []; //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; //Собираем нужный массив и убираем позиции которые не подлежат налогообложению fiscalarr.forEach(function(item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } if (item["tax"] != "") { flag = 1; var newitem = {} newitem["name"] = item["name"]; newitem["quantity"] = round(item["kolvo"], 3); newitem["price"] = round(item["cenaout"], 2); if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } newitem["amount"] = amount; newitem["department"] = 1; newitem["type"] = "position"; newitem["tax"] = { type: item["tax"] } try{ if(thisbasket["info"]["nopaymentstype"] == "debt"){ newitem["paymentMethod"] = "credit"; } }catch(err){ } //fullPrepayment - предоплата 100% //prepayment - предоплата //advance - аванс //fullPayment - полный расчет - по умолчанию //partialPayment - частичный расчет и кредит //credit - передача в кредит //creditPayment - оплата кредита // "infoDiscountAmount": 0.0, //"measurementUnit": "кг", //"paymentMethod": "advance", //"paymentObject": "commodity", //"nomenclatureCode": "MTIzNDEyMzQ1Njc4MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=", newfiscalarr.push(newitem) } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } kostilsumm = kostilsumm + amount; } }); var dali = thisbasket["info"]["cash"]; if (thisbasket["info"]["nall"] > 0) { dali = thisbasket["info"]["nall"] } //Отнимаем от суммы которую дал клиент сумму товара который не пошел на печать на фискальник dali = dali - kostilsumm; if (kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы онлайн кассе"); } var jsonData = { "type": "sell", "taxationType": thisbasket["printer"]["cno"], "operator": { "name": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], "vatin": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_vatin"] }, "items": newfiscalarr, "payments": [] }; var sore = document.querySelector('input[name="sendreceipt"]:checked').value; if(sore != "none"){ var emailOrPhone = "" if(sore == "sms"){ emailOrPhone = $("#send_client_phone").val(); } if(sore == "email"){ emailOrPhone = $("#send_client_email").val(); } jsonData["electronically"] = true; jsonData["clientInfo"] = { "emailOrPhone": emailOrPhone } console.log("ATOL Отправка клиенту", emailOrPhone) } try{ if(thisbasket["printer"]["cno"] == "" || thisbasket["printer"]["cno"] == undefined){ delete jsonData["taxationType"]; } }catch(err){ } jsonData.payments.push({ "type": "cash", "sum": dali }) /*Сумма электронной оплаты (2 знака после запятой)*/ try { var ElectronicPayment = round(thisbasket["info"]["visa"]); } catch (err) { var ElectronicPayment = 0; } if (ElectronicPayment > 0) { jsonData.payments.push({ "type": "electronically", "sum": ElectronicPayment }) } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_10_ios.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, vozvrat: function(thisbasket) { //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; var nallll = 0; var newfiscalarr = []; var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); //Собираем нужный массив и убираем позиции которые не подлежат налогообложению fiscalarr.forEach(function(item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } if (item["tax"] != "") { flag = 1; var newitem = {} newitem["name"] = item["name"]; newitem["quantity"] = round(item["kolvo"], 3); newitem["price"] = round(item["cenaout"], 2); if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } newitem["amount"] = amount; newitem["department"] = 1; newitem["type"] = "position"; newitem["tax"] = { type: item["tax"] } // "infoDiscountAmount": 0.0, //"measurementUnit": "кг", //"paymentMethod": "advance", //"paymentObject": "commodity", //"nomenclatureCode": "MTIzNDEyMzQ1Njc4MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=", newfiscalarr.push(newitem) } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } kostilsumm = kostilsumm + amount; } }); if (kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы онлайн кассе"); } // Вызов команды var jsonData = { "type": "sellReturn", "taxationType": thisbasket["printer"]["cno"], "operator": { "name": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], "vatin": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_vatin"] }, "items": newfiscalarr, "payments": [] }; try{ if(thisbasket["printer"]["cno"] == "" || thisbasket["printer"]["cno"] == undefined){ delete jsonData["taxationType"]; } }catch(err){ } //Наличка if(thisbasket["info"]["cash"] > 0){ jsonData["payments"].push({ "type": "cash", "sum": round(thisbasket["info"]["cash"], 2) }); } //Безнал if(thisbasket["info"]["visa"] > 0){ jsonData["payments"].push({ "type": "electronically", "sum": round(thisbasket["info"]["visa"], 2) }); } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_10_ios.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, precheck: function(thisbasket) { var stringlength = 48; try{ if(thisbasket["printer"]["model"] == "sigma10"){ var stringlength = 32; } }catch(err){ } var lineh = ""; for (var i = 0; i < stringlength; i++) { lineh = lineh + "-"; } var newfiscalarr = []; newfiscalarr.push({ "type": "text", "text": "Счёт на оплату", "alignment": "center" }) newfiscalarr.push({ "type": "text", "text": lineh, "alignment": "center" }) var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); fiscalarr.forEach(function(item, i) { //Собираем нужный массив newfiscalarr.push({ "type": "text", "text": fiscalarr[i]["name"], "alignment": "left" }) newfiscalarr.push({ "type": "text", "text": CurrencyFormatted(fiscalarr[i]["kolvo"], 3) + " * " + CurrencyFormatted(fiscalarr[i]["cenaout"]) + " = " + CurrencyFormatted(fiscalarr[i]["cenaout"] * fiscalarr[i]["kolvo"]), "alignment": "right" }) }); newfiscalarr.push({ "type": "text", "text": lineh, "alignment": "center" }) if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { //Со скидкой newfiscalarr.push({ "type": "text", "text": app.print.modules.escposstr(3, stringlength, "СКИДКА:", CurrencyFormatted(thisbasket["info"]["cashdiscount"])), "alignment": "left" }) } newfiscalarr.push({ "type": "text", "text": app.print.modules.escposstr(1, stringlength, "ИТОГ:", CurrencyFormatted(thisbasket["info"]["allcena"])), "alignment": "left" }) newfiscalarr.push({ "type": "text", "text": lineh, "alignment": "center" }) newfiscalarr.push({ "type": "text", "text": "НЕ ФИСКАЛЬНЫЙ", "alignment": "center" }) var jsonData = { "type": "nonFiscal", "items": newfiscalarr } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_10_ios.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, XReport: function(data) { console.log("aaatol",data.printer.settings) var jsonData = { "type": "reportX", "operator": { "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "vatin": preload["users"][currentsklad][data["info"]["user"]]["user_vatin"] } }; //Вызов //window.webkit.messageHandlers.atolethernetprint.postMessage(JSON.stringify(jsonData)); window.webkit.messageHandlers.atol_10_ios.postMessage(JSON.stringify(jsonData)); /* return new Promise(function(resolve, reject) { app.print.protocols.atol_apk.ExecuteCommand(jsonData).then( function(success) { resolve(success); }, function(error) { reject(error); } ) }); */ }, ZReport: function(data) { var jsonData = { "type": "closeShift", "operator": { "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "vatin": preload["users"][currentsklad][data["info"]["user"]]["user_vatin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_10_ios.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, introduction: function(data) { var jsonData = { "type": "cashIn", "cashSum": round(data["cash"]) }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_10_ios.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, incasation: function(data) { var jsonData = { "type": "cashOut", "cashSum": round(data["cash"]) }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_10_ios.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, rashod: function(data) { var jsonData = { "type": "cashOut", "cashSum": round(data["cash"]) }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_10_ios.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, ExecuteCommand: function(Data) { app.main.loader("show"); return new Promise(function(resolve, reject) { try { //window.webkit.messageHandlers.atolethernetprint.postMessage(JSON.stringify(Data)); window.webkit.messageHandlers.atol_10_ios.postMessage(JSON.stringify(Data)); console.log(Data); returnAtolapk.status = "empty"; try { /*На тот случай если прошлое ожидание не было завершено*/ clearInterval(waitingAtolapk); } catch (err) { /*Скорей всего уже было завершено*/ } var waitingAtolapk = setInterval(function() { console.log("Опрашиваем Атол apk") if (returnAtolapk.status == "done") { clearInterval(waitingAtolapk); app.main.loader("hide"); resolve({ status: "done", data: returnAtolapk }); } if (returnAtolapk.status == "error") { clearInterval(waitingAtolapk); app.main.loader("hide"); reject({ status: "error", data: returnAtolapk }); } }, 500); } catch (err) { console.error("Не удалось вызвать службу Атол apk",err); app.main.loader("hide"); reject({ status: "error" }); } }) }, ReturnCommand: function(jsondata) { app.main.loader("hide"); try{ var response = JSON.parse(jsondata) if (response.status == "done") { response["status"] = "done"; returnAtolapk = response; } else { response["status"] = "error"; returnAtolapk = response; app.main.error(response.data) } }catch(err){ } }, }, atol_10: { //Встроенный устаревший 10й версии, Deprecated //Встроенный устаревший 10й версии opensmena: function(data) { var jsonData = { "type": "openShift", "operator": { "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "vatin": preload["users"][currentsklad][data["info"]["user"]]["user_vatin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_10.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, opendrawer: function(data) { var jsonData = { "type": "openDrawer", "operator": { "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "vatin": preload["users"][currentsklad][data["info"]["user"]]["user_vatin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_10.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, check: function(thisbasket) { console.log("atol_10", thisbasket); var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); var newfiscalarr = []; try { newfiscalarr.push({ "type": "text", "text": "Заказ:" + thisbasket["info"]["id"], "alignment": "center" }) } catch (err) {} //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; //Собираем нужный массив и убираем позиции которые не подлежат налогообложению fiscalarr.forEach(function(item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } if (item["tax"] != "") { flag = 1; var newitem = {} newitem["name"] = item["name"]; newitem["quantity"] = round(item["kolvo"], 3); newitem["price"] = round(item["cenaout"], 2); if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } newitem["amount"] = amount; newitem["department"] = 1; newitem["type"] = "position"; newitem["tax"] = { type: item["tax"] } try{ if(thisbasket["info"]["nopaymentstype"] == "debt"){ newitem["paymentMethod"] = "credit"; } }catch(err){ } //fullPrepayment - предоплата 100% //prepayment - предоплата //advance - аванс //fullPayment - полный расчет - по умолчанию //partialPayment - частичный расчет и кредит //credit - передача в кредит //creditPayment - оплата кредита // "infoDiscountAmount": 0.0, //"measurementUnit": "кг", //"paymentMethod": "advance", //"paymentObject": "commodity", //"nomenclatureCode": "MTIzNDEyMzQ1Njc4MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=", newfiscalarr.push(newitem) } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } kostilsumm = kostilsumm + amount; } }); if (thisbasket["info"]["comment"] != "" && thisbasket["info"]["comment"] != undefined && thisbasket.info["checkcomments"] == 1) { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["Kommentariy_k_z_r2za7"] + ":" + thisbasket["info"]["comment"], }); } var dali = thisbasket["info"]["cash"]; if (thisbasket["info"]["nall"] > 0) { dali = thisbasket["info"]["nall"] } //Отнимаем от суммы которую дал клиент сумму товара который не пошел на печать на фискальник dali = dali - kostilsumm; if (kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы онлайн кассе"); } var jsonData = { "type": "sell", "taxationType": thisbasket["printer"]["cno"], "operator": { "name": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], "vatin": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_vatin"] }, "items": newfiscalarr, "payments": [] }; var sore = document.querySelector('input[name="sendreceipt"]:checked').value; if(sore != "none"){ var emailOrPhone = "" if(sore == "sms"){ emailOrPhone = $("#send_client_phone").val(); } if(sore == "email"){ emailOrPhone = $("#send_client_email").val(); } jsonData["electronically"] = true; jsonData["clientInfo"] = { "emailOrPhone": emailOrPhone } console.log("ATOL Отправка клиенту", emailOrPhone) } try{ if(thisbasket["printer"]["cno"] == "" || thisbasket["printer"]["cno"] == undefined){ delete jsonData["taxationType"]; } }catch(err){ } jsonData.payments.push({ "type": "cash", "sum": dali }) /*Сумма электронной оплаты (2 знака после запятой)*/ try { var ElectronicPayment = round(thisbasket["info"]["visa"]); } catch (err) { var ElectronicPayment = 0; } if (ElectronicPayment > 0) { jsonData.payments.push({ "type": "electronically", "sum": ElectronicPayment }) } /* [ { "type": "position", "name": "Бананы", "price": 73.15, "quantity": 1.0, "amount": 73.15, "infoDiscountAmount": 0.0, "department": 1, "measurementUnit": "кг", "paymentMethod": "advance", "paymentObject": "commodity", "nomenclatureCode": "MTIzNDEyMzQ1Njc4MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=", "tax": { "type": "vat18" } }, { "type": "position", "name": "Шуба", "price": 51.25, "quantity": 2.0, "amount": 102.50, "department": 1, "paymentMethod": "fullPayment", "paymentObject": "commodity", "nomenclatureCode": { "type": "furs", "gtin": "98765432101234", "serial": "RU-430302-ABC1234567" }, "tax": { "type": "vat10" } }, { "type": "position", "name": "Пряники", "price": 64.25, "quantity": 2.0, "amount": 128.50, "infoDiscountAmount": 6.0, "department": 1, "measurementUnit": "шт.", "paymentMethod": "fullPrepayment", "paymentObject": "commodity", "tax": { "type": "vat10" } }, { "type": "position", "name": "Батон нарезной", "price": 38.15, "quantity": 1.0, "amount": 38.15, "department": 1, "measurementUnit": "шт.", "paymentMethod": "fullPrepayment", "paymentObject": "commodity", "tax": { "type": "10" } }, { "type": "position", "name": "Кефир", "price": 48.45, "quantity": 1.0, "amount": 48.45, "department": 1, "measurementUnit": "шт.", "paymentMethod": "fullPrepayment", "paymentObject": "excise", "tax": { "type": "vat0" } }, { "type": "barcode", "barcode": "123456789012", "barcodeType": "EAN13", "scale": 2 } ] */ //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_10.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, vozvrat: function(thisbasket) { //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; var nallll = 0; var newfiscalarr = []; var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); //Собираем нужный массив и убираем позиции которые не подлежат налогообложению fiscalarr.forEach(function(item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } if (item["tax"] != "") { flag = 1; var newitem = {} newitem["name"] = item["name"]; newitem["quantity"] = round(item["kolvo"], 3); newitem["price"] = round(item["cenaout"], 2); if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } newitem["amount"] = amount; newitem["department"] = 1; newitem["type"] = "position"; newitem["tax"] = { type: item["tax"] } // "infoDiscountAmount": 0.0, //"measurementUnit": "кг", //"paymentMethod": "advance", //"paymentObject": "commodity", //"nomenclatureCode": "MTIzNDEyMzQ1Njc4MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=", newfiscalarr.push(newitem) } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } kostilsumm = kostilsumm + amount; } }); if (kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы онлайн кассе"); } // Вызов команды var jsonData = { "type": "sellReturn", "taxationType": thisbasket["printer"]["cno"], "operator": { "name": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], "vatin": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_vatin"] }, "items": newfiscalarr, "payments": [] }; try{ if(thisbasket["printer"]["cno"] == "" || thisbasket["printer"]["cno"] == undefined){ delete jsonData["taxationType"]; } }catch(err){ } //Наличка if(thisbasket["info"]["cash"] > 0){ jsonData["payments"].push({ "type": "cash", "sum": round(thisbasket["info"]["cash"], 2) }); } //Безнал if(thisbasket["info"]["visa"] > 0){ jsonData["payments"].push({ "type": "electronically", "sum": round(thisbasket["info"]["visa"], 2) }); } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_10.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, precheck: function(thisbasket) { var stringlength = 48; try{ if(thisbasket["printer"]["model"] == "sigma10"){ var stringlength = 32; } }catch(err){ } var lineh = ""; for (var i = 0; i < stringlength; i++) { lineh = lineh + "-"; } var newfiscalarr = []; try { newfiscalarr.push({ "type": "text", "text": "Заказ:" + thisbasket["info"]["id"], "alignment": "center" }) } catch (err) {} newfiscalarr.push({ "type": "text", "text": "Счёт на оплату", "alignment": "center" }) try { if (thisbasket.info["type"] == "delivery") { /*Адрес на пречек*/ if (thisbasket.info.client > 0) { var thisclient = preload["clients"][thisbasket.info.client]; if (thisclient.name != "") { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["FIO"] + ":" + thisclient.name }); } if (thisclient.phone != "") { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["telefon"] + ":" + thisclient.phone }); } if (thisbasket["info"]["adress"] != "") { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["adres"] + ":" + thisbasket["info"]["adress"], }); } } } } catch (err) {} newfiscalarr.push({ "type": "text", "text": lineh, "alignment": "center" }) var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); fiscalarr.forEach(function(item, i) { //Собираем нужный массив newfiscalarr.push({ "type": "text", "text": fiscalarr[i]["name"], "alignment": "left" }) newfiscalarr.push({ "type": "text", "text": CurrencyFormatted(fiscalarr[i]["kolvo"], 3) + " * " + CurrencyFormatted(fiscalarr[i]["cenaout"]) + " = " + CurrencyFormatted(fiscalarr[i]["cenaout"] * fiscalarr[i]["kolvo"]), "alignment": "right" }) }); newfiscalarr.push({ "type": "text", "text": lineh, "alignment": "center" }) if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { //Со скидкой newfiscalarr.push({ "type": "text", "text": app.print.modules.escposstr(1, stringlength, "СКИДКА:", CurrencyFormatted(thisbasket["info"]["cashdiscount"])), "alignment": "left" }) } newfiscalarr.push({ "type": "text", "text": app.print.modules.escposstr(1, stringlength, "ИТОГ:", CurrencyFormatted(thisbasket["info"]["allcena"])), "alignment": "left" }) newfiscalarr.push({ "type": "text", "text": lineh, "alignment": "center" }) if (thisbasket["info"]["comment"] != "" && thisbasket["info"]["comment"] != undefined && thisbasket.info["checkcomments"] == 1) { newfiscalarr.push({ "type": "text", "alignment": "left", "text": lang["Kommentariy_k_z_r2za7"] + ":" + thisbasket["info"]["comment"], }); } newfiscalarr.push({ "type": "text", "text": "НЕ ФИСКАЛЬНЫЙ", "alignment": "center" }) var jsonData = { "type": "nonFiscal", "items": newfiscalarr } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_10.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, XReport: function(data) { var jsonData = { "type": "reportX", "operator": { "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "vatin": preload["users"][currentsklad][data["info"]["user"]]["user_vatin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_10.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, ZReport: function(data) { var jsonData = { "type": "closeShift", "operator": { "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "vatin": preload["users"][currentsklad][data["info"]["user"]]["user_vatin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_10.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, introduction: function(data) { var jsonData = { "type": "cashIn", "cashSum": round(data["cash"]) }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_10.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, incasation: function(data) { var jsonData = { "type": "cashOut", "cashSum": round(data["cash"]) }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_10.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, rashod: function(data) { var jsonData = { "type": "cashOut", "cashSum": round(data["cash"]) }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_10.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, ExecuteCommand: function(Data) { app.main.loader("show"); return new Promise(function(resolve, reject) { try { Android.atol_10(JSON.stringify(Data)); returnAtol10.status = "empty"; try { /*На тот случай если прошлое ожидание не было завершено*/ clearInterval(waitingAtol10); } catch (err) { /*Скорей всего уже было завершено*/ } var waitingAtol10 = setInterval(function() { console.log("Опрашиваем Атол 10") if (returnAtol10.status == "done") { clearInterval(waitingAtol10); app.main.loader("hide"); resolve({ status: "done", data: returnAtol10 }); } if (returnAtol10.status == "error") { clearInterval(waitingAtol10); app.main.loader("hide"); reject({ status: "error", data: returnAtol10 }); } }, 500); } catch (err) { console.log("Устройство Aтол не найдено"); app.main.loader("hide"); reject({ status: "error" }); } }) }, ReturnCommand: function(jsondata) { var response = JSON.parse(jsondata) app.main.loader("hide"); if (response["status"] == "done") { returnAtol10 = response; } else { response["status"] = "error"; returnAtol10 = response; app.main.error(response["errorDescription"]); } }, ReturnSettings: function(jsondata) { //var atolsetings = JSON.parse(jsondata); //app.main.message("Сервисная информация"+"

"+"Model "+atolsetings.Model+"
"+"AccessPassword "+atolsetings.AccessPassword+"
"+"AutoDisableBluetooth "+atolsetings.AutoDisableBluetooth+"
"+"AutoEnableBluetooth "+atolsetings.AutoEnableBluetooth+"
"+"BaudRate "+atolsetings.BaudRate+"
"+"Bits "+atolsetings.Bits+"
"+"ComFile "+atolsetings.ComFile+"
"+"IPAddress "+atolsetings.IPAddress+"
"+"IPPort "+atolsetings.IPPort+"
"+"LibraryPath "+atolsetings.LibraryPath+"
"+"MACAddress "+atolsetings.MACAddress+"
"+"OfdChannel "+atolsetings.OfdChannel+"
"+"Parity "+atolsetings.Parity+"
"+"Port "+atolsetings.Port+"
"+"StopBits "+atolsetings.StopBits+"
"+"UsbDevicePath "+atolsetings.UsbDevicePath+"
"+"UserPassword "+atolsetings.UserPassword) app.main.message("Ответ от драйвера получен, для продолжение сохраните настройки"); $("#Atol10SettingsButton").removeClass("btn-danger"); $("#Atol10SettingsButton").addClass("btn-info"); $("#settings_device_list_edit_form_settings").val(JSON.stringify(jsondata)); }, }, atol_10_web: { //Актуальный для платформы 2.5 Deprecated opensmena: function(data) { var jsonData = { "type": "openShift", "printer": data["printer"], "operator": { "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "vatin": preload["users"][currentsklad][data["info"]["user"]]["user_vatin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_10_web.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, opendrawer: function(data) { var jsonData = { "type": "openDrawer", "printer": data["printer"], "operator": { "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "vatin": preload["users"][currentsklad][data["info"]["user"]]["user_vatin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_10_web.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, check: function(thisbasket) { console.log("atol_10", thisbasket); var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); var newfiscalarr = []; try { newfiscalarr.push({ "type": "text", "text":"Заказ №"+thisbasket["info"]["id"], "alignment": "center" }) } catch (err) {} //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; //Собираем нужный массив и убираем позиции которые не подлежат налогообложению fiscalarr.forEach(function(item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } if (item["tax"] != "") { flag = 1; var newitem = {} newitem["name"] = item["name"]; newitem["quantity"] = round(item["kolvo"], 3); newitem["price"] = round(item["cenaout"], 2); if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } newitem["amount"] = amount; newitem["department"] = 1; newitem["type"] = "position"; newitem["tax"] = { type: item["tax"] } try{ if(thisbasket["info"]["nopaymentstype"] == "debt"){ newitem["paymentMethod"] = "credit"; } }catch(err){ } //fullPrepayment - предоплата 100% //prepayment - предоплата //advance - аванс //fullPayment - полный расчет - по умолчанию //partialPayment - частичный расчет и кредит //credit - передача в кредит //creditPayment - оплата кредита // "infoDiscountAmount": 0.0, //"measurementUnit": "кг", //"paymentMethod": "advance", //"paymentObject": "commodity", //"nomenclatureCode": "MTIzNDEyMzQ1Njc4MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=", newfiscalarr.push(newitem) } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } kostilsumm = kostilsumm + amount; } }); var dali = thisbasket["info"]["cash"]; if (thisbasket["info"]["nall"] > 0) { dali = thisbasket["info"]["nall"] } //Отнимаем от суммы которую дал клиент сумму товара который не пошел на печать на фискальник dali = dali - kostilsumm; if (kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы онлайн кассе"); } var jsonData = { "type": "sell", "printer": thisbasket["printer"], "taxationType": thisbasket["printer"]["cno"], "operator": { "name": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], "vatin": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_vatin"] }, "items": newfiscalarr, "payments": [] }; var sore = document.querySelector('input[name="sendreceipt"]:checked').value; if(sore != "none"){ var emailOrPhone = "" if(sore == "sms"){ emailOrPhone = $("#send_client_phone").val(); } if(sore == "email"){ emailOrPhone = $("#send_client_email").val(); } jsonData["electronically"] = true; jsonData["clientInfo"] = { "emailOrPhone": emailOrPhone } console.log("ATOL Отправка клиенту", emailOrPhone) } try{ if(thisbasket["printer"]["cno"] == "" || thisbasket["printer"]["cno"] == undefined){ delete jsonData["taxationType"]; } }catch(err){ } jsonData.payments.push({ "type": "cash", "sum": dali }) /*Сумма электронной оплаты (2 знака после запятой)*/ try { var ElectronicPayment = round(thisbasket["info"]["visa"]); } catch (err) { var ElectronicPayment = 0; } if (ElectronicPayment > 0) { jsonData.payments.push({ "type": "electronically", "sum": ElectronicPayment }) } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_10_web.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, vozvrat: function(thisbasket) { //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; var nallll = 0; var newfiscalarr = []; var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); //Собираем нужный массив и убираем позиции которые не подлежат налогообложению fiscalarr.forEach(function(item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } if (item["tax"] != "") { flag = 1; var newitem = {} newitem["name"] = item["name"]; newitem["quantity"] = round(item["kolvo"], 3); newitem["price"] = round(item["cenaout"], 2); if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } newitem["amount"] = amount; newitem["department"] = 1; newitem["type"] = "position"; newitem["tax"] = { type: item["tax"] } // "infoDiscountAmount": 0.0, //"measurementUnit": "кг", //"paymentMethod": "advance", //"paymentObject": "commodity", //"nomenclatureCode": "MTIzNDEyMzQ1Njc4MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=", newfiscalarr.push(newitem) } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } kostilsumm = kostilsumm + amount; } }); if (kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы онлайн кассе"); } // Вызов команды var jsonData = { "type": "sellReturn", "taxationType": thisbasket["printer"]["cno"], "printer": thisbasket["printer"], "operator": { "name": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], "vatin": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_vatin"] }, "items": newfiscalarr, "payments": [] }; try{ if(thisbasket["printer"]["cno"] == "" || thisbasket["printer"]["cno"] == undefined){ delete jsonData["taxationType"]; } }catch(err){ } //Наличка if(thisbasket["info"]["cash"] > 0){ jsonData["payments"].push({ "type": "cash", "sum": round(thisbasket["info"]["cash"], 2) }); } //Безнал if(thisbasket["info"]["visa"] > 0){ jsonData["payments"].push({ "type": "electronically", "sum": round(thisbasket["info"]["visa"], 2) }); } console.log("Atol log", thisbasket); //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_10_web.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, precheck: function(thisbasket) { var stringlength = 48; try{ if(thisbasket["printer"]["model"] == "sigma10"){ var stringlength = 32; } }catch(err){ } var lineh = ""; for (var i = 0; i < stringlength; i++) { lineh = lineh + "-"; } var newfiscalarr = []; newfiscalarr.push({ "type": "text", "text": "Счёт на оплату", "alignment": "center" }) try { newfiscalarr.push({ "type": "text", "text":"Заказ №"+thisbasket["info"]["id"], "alignment": "center" }) } catch (err) {} newfiscalarr.push({ "type": "text", "text": lineh, "alignment": "center" }) var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); fiscalarr.forEach(function(item, i) { //Собираем нужный массив newfiscalarr.push({ "type": "text", "text": item["name"], "alignment": "left" }) newfiscalarr.push({ "type": "text", "text": CurrencyFormatted(item["kolvo"], 3) + " * " + CurrencyFormatted(item["cenaout"]) + " = " + CurrencyFormatted(item["cenaout"] * item["kolvo"]), "alignment": "right" }) }); newfiscalarr.push({ "type": "text", "text": lineh, "alignment": "center" }) if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { //Со скидкой newfiscalarr.push({ "type": "text", "text": app.print.modules.escposstr(3, stringlength, "СКИДКА:", CurrencyFormatted(thisbasket["info"]["cashdiscount"])), "alignment": "left" }) } newfiscalarr.push({ "type": "text", "text": app.print.modules.escposstr(1, stringlength, "ИТОГ:", CurrencyFormatted(thisbasket["info"]["allcena"])), "alignment": "left" }) newfiscalarr.push({ "type": "text", "text": lineh, "alignment": "center" }) newfiscalarr.push({ "type": "text", "text": "НЕ ФИСКАЛЬНЫЙ", "alignment": "center" }) var jsonData = { "type": "nonFiscal", "printer": thisbasket["printer"], "items": newfiscalarr } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_10_web.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, XReport: function(data) { var jsonData = { "type": "reportX", "printer": data["printer"], "operator": { "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "vatin": preload["users"][currentsklad][data["info"]["user"]]["user_vatin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_10_web.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, ZReport: function(data) { var jsonData = { "type": "closeShift", "printer": data["printer"], "operator": { "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "vatin": preload["users"][currentsklad][data["info"]["user"]]["user_vatin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_10_web.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, introduction: function(data) { var jsonData = { "type": "cashIn", "printer": data["printer"], "cashSum": round(data["cash"]) }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_10_web.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, incasation: function(data) { var jsonData = { "type": "cashOut", "printer": data["printer"], "cashSum": round(data["cash"]) }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_10_web.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, rashod: function(data) { var jsonData = { "type": "cashOut", "printer": data["printer"], "cashSum": round(data["cash"]) }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_10_web.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, ExecuteCommand: function(Data) { var IP = Data.printer.ip; delete Data.printer; var req1 = { "uuid": app.print.modules.guid(), "request": [] } req1.request.push(Data) console.log(req1.uuid); console.log("Отправляем задание на атол web", req1) var check = JSON.stringify(req1); app.main.loader("show"); return new Promise(function(resolve, reject) { if (device.android() == true) { var req = Android.httpsender("http://" + IP + ":16732/requests", check); //тут бы нам ответ получить resolve({ status: "done" }); } else { console.log("Ajax", IP + ":16732/requests"); xhr("http://" + IP + ":16732/requests", check).then(function(json) { var atolwebinterval = setInterval(function() { xhr("http://" + IP + ":16732/requests/" + req1.uuid).then(function(json) { console.log("json", json) try { var content = JSON.parse(json); } catch (err) { var content = {}; } app.main.loader("hide"); if (content.results[0].status == "error") { clearInterval(atolwebinterval); app.main.error("Error: " + content.results[0].errorDescription); reject({ status: "error" }); } if (content.results[0].status == "ready") { clearInterval(atolwebinterval); //Ошибок нет resolve({ status: "done" }); } console.log(content); }, function(error) { clearInterval(atolwebinterval); app.main.loader("hide"); reject({ status: "error" }); app.main.loader("hide"); app.main.error("Не удалось считать статус задания"); }) }, 500) }, function(error) { app.main.loader("hide"); reject({ status: "error" }); app.main.loader("hide"); app.main.error("Нет соединения с \"Skyservice Atol web-сервер\""); }); } }) }, }, atol_10_web_v2: { //Актуальный для платформы 5 opensmena: function(data) { var jsonData = { "type": "openShift", "printer": data["printer"], "operator": { "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "vatin": preload["users"][currentsklad][data["info"]["user"]]["user_vatin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_10_web_v2.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, opendrawer: function(data) { var jsonData = { "type": "openDrawer", "printer": data["printer"], "operator": { "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "vatin": preload["users"][currentsklad][data["info"]["user"]]["user_vatin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_10_web_v2.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, check: function(thisbasket) { console.log("atol_10", thisbasket); var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); var newfiscalarr = []; try { newfiscalarr.push({ "type": "text", "text":"Заказ №"+thisbasket["info"]["id"], "alignment": "center" }) } catch (err) {} //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; //Собираем нужный массив и убираем позиции которые не подлежат налогообложению fiscalarr.forEach(function(item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } if (item["tax"] != "") { flag = 1; var newitem = {} newitem["name"] = item["name"]; newitem["quantity"] = round(item["kolvo"], 3); if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; var price = item["cenaout_discount"]; var discsum = round((item["cenaout"] * item["kolvo"])-amount,2); if(discsum > 0){ newitem["infoDiscountAmount"] = round((item["cenaout"] * item["kolvo"])-amount,2); } } else { amount = item["cenaout"] * item["kolvo"]; var price = item["cenaout"]; } newitem["price"] = round(price, 2); newitem["amount"] = amount; newitem["department"] = 1; newitem["type"] = "position"; newitem["tax"] = { type: item["tax"] } try{ if(thisbasket["info"]["nopaymentstype"] == "debt"){ newitem["paymentMethod"] = "credit"; } }catch(err){ } //fullPrepayment - предоплата 100% //prepayment - предоплата //advance - аванс //fullPayment - полный расчет - по умолчанию //partialPayment - частичный расчет и кредит //credit - передача в кредит //creditPayment - оплата кредита // "infoDiscountAmount": 0.0, //"measurementUnit": "кг", //"paymentMethod": "advance", //"paymentObject": "commodity", //"nomenclatureCode": "MTIzNDEyMzQ1Njc4MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=", newfiscalarr.push(newitem) } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } kostilsumm = kostilsumm + amount; } }); var dali = thisbasket["info"]["cash"]; if (thisbasket["info"]["nall"] > 0) { dali = thisbasket["info"]["nall"] } //Отнимаем от суммы которую дал клиент сумму товара который не пошел на печать на фискальник dali = dali - kostilsumm; if (kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы онлайн кассе"); } var jsonData = { "type": "sell", "printer": thisbasket["printer"], "taxationType": thisbasket["printer"]["cno"], "operator": { "name": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], "vatin": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_vatin"] }, "items": newfiscalarr, "payments": [] }; var sore = document.querySelector('input[name="sendreceipt"]:checked').value; if(sore != "none"){ var emailOrPhone = "" if(sore == "sms"){ emailOrPhone = $("#send_client_phone").val(); } if(sore == "email"){ emailOrPhone = $("#send_client_email").val(); } jsonData["electronically"] = true; jsonData["clientInfo"] = { "emailOrPhone": emailOrPhone } console.log("ATOL Отправка клиенту", emailOrPhone) } try{ if(thisbasket["printer"]["cno"] == "" || thisbasket["printer"]["cno"] == undefined){ delete jsonData["taxationType"]; } }catch(err){ } jsonData.payments.push({ "type": "cash", "sum": dali }) /*Сумма электронной оплаты (2 знака после запятой)*/ try { var ElectronicPayment = round(thisbasket["info"]["visa"]); } catch (err) { var ElectronicPayment = 0; } if (ElectronicPayment > 0) { jsonData.payments.push({ "type": "electronically", "sum": ElectronicPayment }) } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_10_web_v2.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, vozvrat: function(thisbasket) { //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; var nallll = 0; var newfiscalarr = []; var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); //Собираем нужный массив и убираем позиции которые не подлежат налогообложению fiscalarr.forEach(function(item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } if (item["tax"] != "") { flag = 1; var newitem = {} newitem["name"] = item["name"]; newitem["quantity"] = round(item["kolvo"], 3); if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; var price = item["cenaout_discount"]; var discsum = round((item["cenaout"] * item["kolvo"])-amount,2); if(discsum > 0){ newitem["infoDiscountAmount"] = round((item["cenaout"] * item["kolvo"])-amount,2); } } else { amount = item["cenaout"] * item["kolvo"]; var price = item["cenaout"]; } newitem["price"] = round(price, 2); newitem["amount"] = amount; newitem["department"] = 1; newitem["type"] = "position"; newitem["tax"] = { type: item["tax"] } // "infoDiscountAmount": 0.0, //"measurementUnit": "кг", //"paymentMethod": "advance", //"paymentObject": "commodity", //"nomenclatureCode": "MTIzNDEyMzQ1Njc4MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=", newfiscalarr.push(newitem) } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } kostilsumm = kostilsumm + amount; } }); if (kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы онлайн кассе"); } // Вызов команды var jsonData = { "type": "sellReturn", "taxationType": thisbasket["printer"]["cno"], "printer": thisbasket["printer"], "operator": { "name": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], "vatin": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_vatin"] }, "items": newfiscalarr, "payments": [] }; try{ if(thisbasket["printer"]["cno"] == "" || thisbasket["printer"]["cno"] == undefined){ delete jsonData["taxationType"]; } }catch(err){ } //Наличка if(thisbasket["info"]["cash"] > 0){ jsonData["payments"].push({ "type": "cash", "sum": round(thisbasket["info"]["cash"], 2) }); } //Безнал if(thisbasket["info"]["visa"] > 0){ jsonData["payments"].push({ "type": "electronically", "sum": round(thisbasket["info"]["visa"], 2) }); } console.log("Atol log", thisbasket); //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_10_web_v2.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, precheck: function(thisbasket) { var stringlength = 48; try{ if(thisbasket["printer"]["model"] == "sigma10"){ var stringlength = 32; } }catch(err){ } var lineh = ""; for (var i = 0; i < stringlength; i++) { lineh = lineh + "-"; } var newfiscalarr = []; newfiscalarr.push({ "type": "text", "text": "Счёт на оплату", "alignment": "center" }) try { newfiscalarr.push({ "type": "text", "text":"Заказ №"+thisbasket["info"]["id"], "alignment": "center" }) } catch (err) {} newfiscalarr.push({ "type": "text", "text": lineh, "alignment": "center" }) var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); fiscalarr.forEach(function(item, i) { //Собираем нужный массив newfiscalarr.push({ "type": "text", "text": item["name"], "alignment": "left" }) newfiscalarr.push({ "type": "text", "text": CurrencyFormatted(item["kolvo"], 3) + " * " + CurrencyFormatted(item["cenaout"]) + " = " + CurrencyFormatted(item["cenaout"] * item["kolvo"]), "alignment": "right" }) }); newfiscalarr.push({ "type": "text", "text": lineh, "alignment": "center" }) if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { //Со скидкой newfiscalarr.push({ "type": "text", "text": app.print.modules.escposstr(3, stringlength, "СКИДКА:", CurrencyFormatted(thisbasket["info"]["cashdiscount"])), "alignment": "left" }) } newfiscalarr.push({ "type": "text", "text": app.print.modules.escposstr(1, stringlength, "ИТОГ:", CurrencyFormatted(thisbasket["info"]["allcena"])), "alignment": "left" }) newfiscalarr.push({ "type": "text", "text": lineh, "alignment": "center" }) newfiscalarr.push({ "type": "text", "text": "НЕ ФИСКАЛЬНЫЙ", "alignment": "center" }) var jsonData = { "type": "nonFiscal", "printer": thisbasket["printer"], "items": newfiscalarr } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_10_web_v2.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, XReport: function(data) { var jsonData = { "type": "reportX", "printer": data["printer"], "operator": { "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "vatin": preload["users"][currentsklad][data["info"]["user"]]["user_vatin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_10_web_v2.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, ZReport: function(data) { var jsonData = { "type": "closeShift", "printer": data["printer"], "operator": { "name": preload["users"][currentsklad][data["info"]["user"]]["user_name"], "vatin": preload["users"][currentsklad][data["info"]["user"]]["user_vatin"] } }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_10_web_v2.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, introduction: function(data) { var jsonData = { "type": "cashIn", "printer": data["printer"], "cashSum": round(data["cash"]) }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_10_web_v2.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, incasation: function(data) { var jsonData = { "type": "cashOut", "printer": data["printer"], "cashSum": round(data["cash"]) }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_10_web_v2.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, rashod: function(data) { var jsonData = { "type": "cashOut", "printer": data["printer"], "cashSum": round(data["cash"]) }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_10_web_v2.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, ExecuteCommand: function(Data) { var IP = Data.printer.ip; if(IP == "" || IP == null ){ IP = "127.0.0.1"; } delete Data.printer; var req1 = { "uuid": app.print.modules.guid(), "request": [] } req1.request.push(Data) console.log(req1.uuid); console.log("Отправляем задание на атол web", req1) console.log("Отправляем задание на атол web", JSON.stringify(req1)) var check = JSON.stringify(req1); app.main.loader("show"); return new Promise(function(resolve, reject) { if (device.android() == true) { var req = Android.httpsender("http://" + IP + ":16732/api/v2/requests/", check); //тут бы нам ответ получить resolve({ status: "done" }); } else { try{ var jsonData1 = { "requestMethod": "POST", "headers": [ { "key": "Content-Length", "value":check.length }, { "key": "Content-type", "value":"application/json; charset=utf-8" } ], "url": "http://" + IP + ":16732/api/v2/requests/", "data":check } console.log("sender",JSON.stringify(jsonData1)) window.cefQuery({ request: JSON.stringify({ method: "http_sender", data: JSON.stringify(jsonData1) }), persistent: true, onSuccess: function (response) { console.log("ATOL resp0", response) try{ var resp1 = JSON.parse(response); if(!resp1.errorMessage){ var resp2 = JSON.parse(resp1.response); if(resp2.uuid == req1.uuid){ var atolwebinterval = setInterval(function() { var jsonData2 = { "requestMethod": "GET", "headers": [ { "key": "Content-type", "value":"application/json; charset=utf-8" } ], "url": "http://" + IP + ":16732/api/v2/requests/" + req1.uuid, } window.cefQuery({ request: JSON.stringify({ method: "http_sender", data: JSON.stringify(jsonData2) }), persistent: true, onSuccess: function (response) { console.log("ATOL resp0-", response) try{ var resp1 = JSON.parse(response); app.main.loader("hide"); if(!resp1.errorMessage){ var resp2 = JSON.parse(resp1.response); console.log("ATOL resp- ", resp2); if (resp2.results[0].status == "error") { clearInterval(atolwebinterval); app.main.error("Error: " + resp2.results[0].error.description); reject({ status: "error" }); } if (resp2.results[0].status == "ready") { //console.log("Фискальные данные", resp2.results[0].result.fiscalParams) clearInterval(atolwebinterval); //Ошибок нет resolve({ status: "done" }); } }else{ app.main.loader("hide"); reject({ status: "error" }); app.main.loader("hide"); app.main.error(resp1.errorMessage); clearInterval(atolwebinterval); } }catch(err){ console.error(err); } }, onFailure: function (error_code, error_message) { console.error("onDesktopUsb", error_message); reject(error_message); } }); }, 500) }else{ reject("uuid error"); } }else{ app.main.loader("hide"); reject({ status: "error" }); app.main.loader("hide"); app.main.error(resp1.errorMessage); } console.log("ATOL resp", resp2); }catch(err){ console.error(err); } }, onFailure: function (error_code, error_message) { console.error("onDesktopUsb", error_message); reject(error_message); } }); }catch(err){ console.log("Ajax", IP + ":16732/api/v2/requests/"); xhr("http://" + IP + ":16732/api/v2/requests/", check).then(function(json) { var atolwebinterval = setInterval(function() { xhr("http://" + IP + ":16732/api/v2/requests/" + req1.uuid).then(function(json) { console.log("json", json) try { var content = JSON.parse(json); } catch (err) { var content = {}; } app.main.loader("hide"); if (content.results[0].status == "error") { clearInterval(atolwebinterval); app.main.error("Error: " + content.results[0].errorDescription); reject({ status: "error" }); } if (content.results[0].status == "ready") { clearInterval(atolwebinterval); //Ошибок нет resolve({ status: "done" }); } console.log(content); }, function(error) { clearInterval(atolwebinterval); app.main.loader("hide"); reject({ status: "error" }); app.main.loader("hide"); app.main.error("Не удалось считать статус задания"); }) }, 500) }, function(error) { app.main.loader("hide"); reject({ status: "error" }); app.main.loader("hide"); app.main.error("Нет соединения с \"Skyservice Atol web-сервер\""); }); } } }) }, }, webkassa:{ opensmena: function(data) { }, opendrawer: function(data) { }, check: function(thisbasket) { var $this = this; console.log("WebKassa", thisbasket); try{ var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); var newfiscalarr = []; //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; //Собираем нужный массив и убираем позиции которые не подлежат налогообложению fiscalarr.forEach(function(item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } if (item["tax"] != "") { flag = 1; var newitem = {} newitem["PositionName"] = item["name"]; newitem["Count"] = round(item["kolvo"], 3); newitem["Price"] = round(item["cenaout"], 2); if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } newitem["TaxPercent"] = 0; newitem["amount"] = amount; newitem["TaxType"] = 0;//item["tax"]; //0 - Без налога 100 - НДС Тип налога newitem["Tax"] = 0; //Налог в тенге try{ taxData = preload["tax"][item["tax_id"]]; newitem["TaxType"] = taxData["cno"]; newitem["TaxPercent"] = taxData["percent"]; }catch(err){ } if(newitem["TaxPercent"] > 0){ //Налог в тенге считаем и заменяем если етсь var nalog = (amount/(100+newitem["TaxPercent"]))*newitem["TaxPercent"]; if(nalog > 0){ newitem["Tax"] = round(nalog,2); } } try{ if(thisbasket["info"]["nopaymentstype"] == "debt"){ newitem["paymentMethod"] = "credit"; } }catch(err){ } console.warn("Товар",newitem) newfiscalarr.push(newitem) } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } kostilsumm = kostilsumm + amount; } }); var dali = thisbasket["info"]["cash"]; if (thisbasket["info"]["nall"] > 0) { dali = thisbasket["info"]["nall"] } //Отнимаем от суммы которую дал клиент сумму товара который не пошел на печать на фискальник dali = dali - kostilsumm; if (kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы онлайн кассе"); } var jsonData = { "Token":webkassatoken, "CashboxUniqueNumber": thisbasket["printer"]["settings"]["webKassaFactoryNumber"], "OperationType": 2, "Positions": newfiscalarr, "payments": [], "Change":0, "RoundType":2, //"ExternalCheckNumber":"123456", //"CustomerEmail":"test@mail.ru" }; jsonData.payments.push({ "PaymentType": 0, "Sum": dali }) /*Сумма электронной оплаты (2 знака после запятой)*/ try { var ElectronicPayment = round(thisbasket["info"]["visa"]); } catch (err) { var ElectronicPayment = 0; } if (ElectronicPayment > 0) { jsonData.payments.push({ "PaymentType": 1, "Sum": ElectronicPayment }) } //Вызов return new Promise(function(resolve, reject) { $this.ExecuteCommand("/?section=db&db=webkassa&action=Check",jsonData, thisbasket).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }catch(err){ } }, vozvrat: function(thisbasket) { //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; var nallll = 0; var newfiscalarr = []; var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); //Собираем нужный массив и убираем позиции которые не подлежат налогообложению fiscalarr.forEach(function(item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } if (item["tax"] != "") { flag = 1; var newitem = {} newitem["name"] = item["name"]; newitem["quantity"] = round(item["kolvo"], 3); newitem["price"] = round(item["cenaout"], 2); if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } newitem["amount"] = amount; newitem["department"] = 1; newitem["type"] = "position"; newitem["tax"] = { type: item["tax"] } // "infoDiscountAmount": 0.0, //"measurementUnit": "кг", //"paymentMethod": "advance", //"paymentObject": "commodity", //"nomenclatureCode": "MTIzNDEyMzQ1Njc4MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=", newfiscalarr.push(newitem) } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } kostilsumm = kostilsumm + amount; } }); if (kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы онлайн кассе"); } // Вызов команды var jsonData = { "type": "sellReturn", "taxationType": thisbasket["printer"]["cno"], "printer": thisbasket["printer"], "operator": { "name": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], "vatin": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_vatin"] }, "items": newfiscalarr, "payments": [] }; try{ if(thisbasket["printer"]["cno"] == "" || thisbasket["printer"]["cno"] == undefined){ delete jsonData["taxationType"]; } }catch(err){ } //Наличка if(thisbasket["info"]["cash"] > 0){ jsonData["payments"].push({ "type": "cash", "sum": round(thisbasket["info"]["cash"], 2) }); } //Безнал if(thisbasket["info"]["visa"] > 0){ jsonData["payments"].push({ "type": "electronically", "sum": round(thisbasket["info"]["visa"], 2) }); } console.log("Atol log", thisbasket); //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_10_web.ExecuteCommand(jsonData, thisbasket).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, precheck: function(thisbasket) { }, XReport: function(data) { var $this = this; var jsonData = { "Token":webkassatoken, "CashboxUniqueNumber": data["printer"]["settings"]["CashboxUniqueNumber"], }; //Вызов return new Promise(function(resolve, reject) { $this.ExecuteCommand("/?section=db&db=webkassa&action=XReport",jsonData, data).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, ZReport: function(data) { var $this = this; var jsonData = { "Token":webkassatoken, "CashboxUniqueNumber": data["printer"]["settings"]["webKassaFactoryNumber"], }; //Вызов return new Promise(function(resolve, reject) { $this.ExecuteCommand("/?section=db&db=webkassa&action=ZReport",jsonData, data).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, introduction: function(data) { var $this = this; var jsonData = { "Token":webkassatoken, "CashboxUniqueNumber": data["printer"]["settings"]["webKassaFactoryNumber"], "OperationType": 0, "Sum": round(data["cash"]), // "ExternalCheckNumber": 123456789, }; //Вызов return new Promise(function(resolve, reject) { $this.ExecuteCommand("/?section=db&db=webkassa&action=MoneyOperation",jsonData, data).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, incasation: function(data) { console.warn('data inc ___', data) var $this = this; var jsonData = { "Token":webkassatoken, "CashboxUniqueNumber": data["printer"]["settings"]["webKassaFactoryNumber"], "OperationType": 1, "Sum": round(data["cash"]), // "ExternalCheckNumber": 123456789, }; //Вызов return new Promise(function(resolve, reject) { $this.ExecuteCommand("/?section=db&db=webkassa&action=MoneyOperation",jsonData, data).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, rashod: function(data) { var $this = this; var jsonData = { "Token":webkassatoken, "CashboxUniqueNumber": data["printer"]["settings"]["webKassaFactoryNumber"], "OperationType": 1, "Sum": round(data["cash"]), // "ExternalCheckNumber": 123456789, }; //Вызов return new Promise(function(resolve, reject) { $this.ExecuteCommand("/?section=db&db=webkassa&action=MoneyOperation",jsonData, data).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, auth: function(e){ var $this = this; var jsonData = { Login:e.user, Password:e.pass } //Вызов return new Promise(function(resolve, reject) { $this.ExecuteCommand("/?section=db&db=webkassa&action=auth",jsonData, e).then(function(json){ webkassatoken = json.Token; resolve({ status:"done" }); }).catch(function(error){ reject(error); }) }) }, ExecuteCommand: function(url, Data, e) { console.log("webkassa",Data) app.main.loader("show"); return new Promise(function(resolve, reject) { xhr(url, JSON.stringify(Data)).then(function(json) { var content = JSON.parse(json); app.main.loader("hide"); try{ var errors = content.Errors; errors.forEach(function(item){ app.main.error("WebKassa: "+item.Text); }) }catch(err){ resolve(content.Data); } }).catch(function(){ app.main.loader("hide"); reject({ status: "error" }); app.main.loader("hide"); app.main.error("WebKassa: Нет соединения"); }) }) }, }, kz_webkassa_windows:{ opensmena: function(data) { }, opendrawer: function(data) { }, check: function(thisbasket) { var $this = this; console.log("WebKassa", thisbasket); try{ var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); var newfiscalarr = []; //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; //Собираем нужный массив и убираем позиции которые не подлежат налогообложению fiscalarr.forEach(function(item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } if (item["tax"] != "") { flag = 1; var newitem = {} newitem["PositionName"] = item["name"]; newitem["Count"] = round(item["kolvo"], 3); newitem["Price"] = round(item["cenaout"], 2); if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } newitem["TaxPercent"] = 0; newitem["amount"] = amount; newitem["TaxType"] = 0;//item["tax"]; //0 - Без налога 100 - НДС Тип налога newitem["Tax"] = 0; //Налог в тенге try{ taxData = preload["tax"][item["tax_id"]]; newitem["TaxType"] = taxData["cno"]; newitem["TaxPercent"] = taxData["percent"]; }catch(err){ } if(newitem["TaxPercent"] > 0){ //Налог в тенге считаем и заменяем если етсь var nalog = (amount/(100+newitem["TaxPercent"]))*newitem["TaxPercent"]; if(nalog > 0){ newitem["Tax"] = round(nalog,2); } } try{ if(thisbasket["info"]["nopaymentstype"] == "debt"){ newitem["paymentMethod"] = "credit"; } }catch(err){ } console.warn("Товар",newitem) newfiscalarr.push(newitem) } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } kostilsumm = kostilsumm + amount; } }); var dali = thisbasket["info"]["cash"]; if (thisbasket["info"]["nall"] > 0) { dali = thisbasket["info"]["nall"] } //Отнимаем от суммы которую дал клиент сумму товара который не пошел на печать на фискальник dali = dali - kostilsumm; if (kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы онлайн кассе"); } var jsonData = { "Token":webkassatoken, "CashboxUniqueNumber": thisbasket["printer"]["settings"]["CashboxUniqueNumber"], "OperationType": 2, "Positions": newfiscalarr, "payments": [], "Change":0, "RoundType":2, //"ExternalCheckNumber":"123456", //"CustomerEmail":"test@mail.ru" }; jsonData.payments.push({ "PaymentType": 0, "Sum": dali }) /*Сумма электронной оплаты (2 знака после запятой)*/ try { var ElectronicPayment = round(thisbasket["info"]["visa"]); } catch (err) { var ElectronicPayment = 0; } if (ElectronicPayment > 0) { jsonData.payments.push({ "PaymentType": 1, "Sum": ElectronicPayment }) } //Вызов return new Promise(function(resolve, reject) { $this.ExecuteCommand("/?section=db&db=webkassa&action=Check",jsonData, thisbasket).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }catch(err){ } }, vozvrat: function(thisbasket) { //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; var nallll = 0; var newfiscalarr = []; var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); //Собираем нужный массив и убираем позиции которые не подлежат налогообложению fiscalarr.forEach(function(item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } if (item["tax"] != "") { flag = 1; var newitem = {} newitem["name"] = item["name"]; newitem["quantity"] = round(item["kolvo"], 3); newitem["price"] = round(item["cenaout"], 2); if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } newitem["amount"] = amount; newitem["department"] = 1; newitem["type"] = "position"; newitem["tax"] = { type: item["tax"] } // "infoDiscountAmount": 0.0, //"measurementUnit": "кг", //"paymentMethod": "advance", //"paymentObject": "commodity", //"nomenclatureCode": "MTIzNDEyMzQ1Njc4MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=", newfiscalarr.push(newitem) } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } kostilsumm = kostilsumm + amount; } }); if (kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы онлайн кассе"); } // Вызов команды var jsonData = { "type": "sellReturn", "taxationType": thisbasket["printer"]["cno"], "printer": thisbasket["printer"], "operator": { "name": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], "vatin": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_vatin"] }, "items": newfiscalarr, "payments": [] }; try{ if(thisbasket["printer"]["cno"] == "" || thisbasket["printer"]["cno"] == undefined){ delete jsonData["taxationType"]; } }catch(err){ } //Наличка if(thisbasket["info"]["cash"] > 0){ jsonData["payments"].push({ "type": "cash", "sum": round(thisbasket["info"]["cash"], 2) }); } //Безнал if(thisbasket["info"]["visa"] > 0){ jsonData["payments"].push({ "type": "electronically", "sum": round(thisbasket["info"]["visa"], 2) }); } console.log("Atol log", thisbasket); //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_10_web.ExecuteCommand(jsonData, thisbasket).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, precheck: function(thisbasket) { }, XReport: function(data) { var $this = this; var jsonData = { "Token":webkassatoken, "CashboxUniqueNumber": data["printer"]["settings"]["CashboxUniqueNumber"], }; //Вызов return new Promise(function(resolve, reject) { $this.ExecuteCommand("/?section=db&db=webkassa&action=XReport",jsonData, data).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, ZReport: function(data) { var $this = this; var jsonData = { "Token":webkassatoken, "CashboxUniqueNumber": data["printer"]["settings"]["CashboxUniqueNumber"], }; //Вызов return new Promise(function(resolve, reject) { $this.ExecuteCommand("/?section=db&db=webkassa&action=ZReport",jsonData, data).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, introduction: function(data) { var $this = this; var jsonData = { "Token":webkassatoken, "CashboxUniqueNumber": data["printer"]["settings"]["CashboxUniqueNumber"], "OperationType": 0, "Sum": round(data["cash"]), // "ExternalCheckNumber": 123456789, }; //Вызов return new Promise(function(resolve, reject) { $this.ExecuteCommand("/?section=db&db=webkassa&action=MoneyOperation",jsonData, data).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, incasation: function(data) { var $this = this; var jsonData = { "Token":webkassatoken, "CashboxUniqueNumber": data["printer"]["settings"]["CashboxUniqueNumber"], "OperationType": 1, "Sum": round(data["cash"]), // "ExternalCheckNumber": 123456789, }; //Вызов return new Promise(function(resolve, reject) { $this.ExecuteCommand("/?section=db&db=webkassa&action=MoneyOperation",jsonData, data).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, rashod: function(data) { var $this = this; var jsonData = { "Token":webkassatoken, "CashboxUniqueNumber": data["printer"]["settings"]["CashboxUniqueNumber"], "OperationType": 1, "Sum": round(data["cash"]), // "ExternalCheckNumber": 123456789, }; //Вызов return new Promise(function(resolve, reject) { $this.ExecuteCommand("/?section=db&db=webkassa&action=MoneyOperation",jsonData, data).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, auth: function(e){ var $this = this; var jsonData = { Login:e.user, Password:e.pass } //Вызов return new Promise(function(resolve, reject) { $this.ExecuteCommand("/?section=db&db=webkassa&action=auth",jsonData, e).then(function(json){ webkassatoken = json.Token; resolve({ status:"done" }); }).catch(function(error){ reject(error); }) }) }, ExecuteCommand: function(url, Data, e) { console.log("webkassa",Data) app.main.loader("show"); return new Promise(function(resolve, reject) { xhr(url, JSON.stringify(Data)).then(function(json) { var content = JSON.parse(json); app.main.loader("hide"); try{ var errors = content.Errors; errors.forEach(function(item){ app.main.error("WebKassa: "+item.Text); }) }catch(err){ //А тут печать нужно сделать try{ var printData = {}; printData.printer = e["printer"]; printData.printer.type = "printer"; printData.printer.protocol = "printserver_windows_1808"; printData.printer.os = "windows"; printData.printer.model = "other"; printData.printer.manufacturer = "other"; printData.products = e.products; var psettings = printData.printer.settings; if(psettings["companyName"] != '' && psettings["companyName"] != null){ printData.printer.header = psettings["companyName"]+"\n"; } if(psettings["INN"] != "" && psettings["INN"] != null){ printData.printer.header += "ИИН "+psettings["INN"]+"\n"; } if(psettings["ndsSer"] != "" && psettings["ndsSer"] != null && psettings["ndsNum"] != "" && psettings["ndsNum"] != null){ printData.printer.header += "НДС Серия "+psettings["ndsSer"]+" Номер "+psettings["ndsNum"]+"\n"; } var fiscalData = content.Data; if(fiscalData.CheckNumber != null){ printData.printer.header += "Чек №"+fiscalData.CheckNumber+"\n"; } if(fiscalData.ShiftNumber != null){ printData.printer.header += "Смена №"+fiscalData.ShiftNumber+"\n"; } if(fiscalData.CheckOrderNumber != null){ printData.printer.header += "Порядковый номер чека "+fiscalData.CheckOrderNumber+"\n"; } // $("#qrcodetempcontainer").html(""); // var qrcode = new QRCode("qrcodetempcontainer"); // qrcode.makeCode(fiscalData.TicketUrl); // setTimeout(function(){ // var qrcodei = $("#qrcodetempcontainer").html(); // printData.printer.footer += qrcodei // },1000) if(fiscalData.CheckNumber != null){ printData.printer.footer += "
Фискальный признак: "+fiscalData.CheckNumber+"\n"; }else{ printData.printer.footer += "
Фискальный признак: "+fiscalData.CheckOrderNumber+"\n"; } if(fiscalData.DateTime != null){ printData.printer.footer += "Время: "+fiscalData.DateTime+"\n"; } printData.printer.footer += "Оператор фискальных данных: АО 'Казахтелеком'\n"; printData.printer.footer += "Для проверки чека зайдите на сайт consumer.oofd.kz
\n"; if(fiscalData.CashboxOfflineMode == true){ printData.printer.footer += "Чек сформирован в автономном режиме\n"; } printData.printer.footer += "* * * * *\n"; printData.printer.footer += "ФИСКАЛЬНЫЙ ЧЕК ФП\n"; printData.printer.footer += "ИНК: "+fiscalData.Cashbox.IdentityNumber+"\n"; printData.printer.footer += "РНК: "+fiscalData.Cashbox.RegistrationNumber+"\n"; printData.printer.footer += "ЗНК: "+fiscalData.Cashbox.UniqueNumber+"\n"; printData.printer.footer += "WEBKASSA.KZ\n"; printData.printer.footer += "* * * * *\n"; printData.printer.footer += "SKYSERVICE.PRO\n"; printData.info = e.info printData.info["id"] = ""; printData.info["date"] = ""; printData.info["time"] = ""; // printData.info["type"] = "precheck"; printData.type = "check"; app.print.protocols["printserver_windows_1808"](printData); }catch(err){ } resolve(content.Data); } }).catch(function(){ app.main.loader("hide"); reject({ status: "error" }); app.main.loader("hide"); app.main.error("WebKassa: Нет соединения"); }) }) }, }, kz_webkassa_windows_test:{ opensmena: function(data) { }, opendrawer: function(data) { }, check: function(thisbasket) { var $this = this; console.log("WebKassa", thisbasket); try{ var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); var newfiscalarr = []; //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; //Собираем нужный массив и убираем позиции которые не подлежат налогообложению fiscalarr.forEach(function(item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } if (item["tax"] != "") { flag = 1; var newitem = {} newitem["PositionName"] = item["name"]; newitem["Count"] = round(item["kolvo"], 3); newitem["Price"] = round(item["cenaout"], 2); if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } newitem["amount"] = amount; newitem["TaxType"] = 0;//0 - Без налога 100 - НДС newitem["Tax"] = 0; //Налог в тенге newitem["TaxPercent"] = 0; //в процентах switch(thisbasket["printer"]["cno"]){ case "100": newitem["TaxType"] = 100; break; default: } try{ if(thisbasket["info"]["nopaymentstype"] == "debt"){ newitem["paymentMethod"] = "credit"; } }catch(err){ } newfiscalarr.push(newitem) } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } kostilsumm = kostilsumm + amount; } }); var dali = thisbasket["info"]["cash"]; if (thisbasket["info"]["nall"] > 0) { dali = thisbasket["info"]["nall"] } //Отнимаем от суммы которую дал клиент сумму товара который не пошел на печать на фискальник dali = dali - kostilsumm; if (kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы онлайн кассе"); } var jsonData = { "Token":webkassatoken, "CashboxUniqueNumber": thisbasket["printer"]["settings"]["CashboxUniqueNumber"], "OperationType": 2, "Positions": newfiscalarr, "payments": [], "Change":0, "RoundType":2, //"ExternalCheckNumber":"123456", //"CustomerEmail":"test@mail.ru" }; jsonData.payments.push({ "PaymentType": 0, "Sum": dali }) /*Сумма электронной оплаты (2 знака после запятой)*/ try { var ElectronicPayment = round(thisbasket["info"]["visa"]); } catch (err) { var ElectronicPayment = 0; } if (ElectronicPayment > 0) { jsonData.payments.push({ "PaymentType": 1, "Sum": ElectronicPayment }) } //Вызов return new Promise(function(resolve, reject) { $this.ExecuteCommand("/?section=db&db=webkassa&action=Check",jsonData, thisbasket).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }catch(err){ } }, vozvrat: function(thisbasket) { //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; var nallll = 0; var newfiscalarr = []; var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); //Собираем нужный массив и убираем позиции которые не подлежат налогообложению fiscalarr.forEach(function(item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } if (item["tax"] != "") { flag = 1; var newitem = {} newitem["name"] = item["name"]; newitem["quantity"] = round(item["kolvo"], 3); newitem["price"] = round(item["cenaout"], 2); if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } newitem["amount"] = amount; newitem["department"] = 1; newitem["type"] = "position"; newitem["tax"] = { type: item["tax"] } // "infoDiscountAmount": 0.0, //"measurementUnit": "кг", //"paymentMethod": "advance", //"paymentObject": "commodity", //"nomenclatureCode": "MTIzNDEyMzQ1Njc4MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=", newfiscalarr.push(newitem) } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } kostilsumm = kostilsumm + amount; } }); if (kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы онлайн кассе"); } // Вызов команды var jsonData = { "type": "sellReturn", "taxationType": thisbasket["printer"]["cno"], "printer": thisbasket["printer"], "operator": { "name": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], "vatin": preload["users"][currentsklad][thisbasket["info"]["user"]]["user_vatin"] }, "items": newfiscalarr, "payments": [] }; try{ if(thisbasket["printer"]["cno"] == "" || thisbasket["printer"]["cno"] == undefined){ delete jsonData["taxationType"]; } }catch(err){ } //Наличка if(thisbasket["info"]["cash"] > 0){ jsonData["payments"].push({ "type": "cash", "sum": round(thisbasket["info"]["cash"], 2) }); } //Безнал if(thisbasket["info"]["visa"] > 0){ jsonData["payments"].push({ "type": "electronically", "sum": round(thisbasket["info"]["visa"], 2) }); } console.log("Atol log", thisbasket); //Вызов return new Promise(function(resolve, reject) { app.print.protocols.atol_10_web.ExecuteCommand(jsonData, thisbasket).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, precheck: function(thisbasket) { }, XReport: function(data) { var $this = this; var jsonData = { "Token":webkassatoken, "CashboxUniqueNumber": data["printer"]["settings"]["CashboxUniqueNumber"], }; //Вызов return new Promise(function(resolve, reject) { $this.ExecuteCommand("/?section=db&db=webkassa&action=XReport",jsonData, data).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, ZReport: function(data) { var $this = this; var jsonData = { "Token":webkassatoken, "CashboxUniqueNumber": data["printer"]["settings"]["CashboxUniqueNumber"], }; //Вызов return new Promise(function(resolve, reject) { $this.ExecuteCommand("/?section=db&db=webkassa&action=ZReport",jsonData, data).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, introduction: function(data) { var $this = this; var jsonData = { "Token":webkassatoken, "CashboxUniqueNumber": data["printer"]["settings"]["CashboxUniqueNumber"], "OperationType": 0, "Sum": round(data["cash"]), // "ExternalCheckNumber": 123456789, }; //Вызов return new Promise(function(resolve, reject) { $this.ExecuteCommand("/?section=db&db=webkassa&action=MoneyOperation",jsonData, data).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, incasation: function(data) { var $this = this; var jsonData = { "Token":webkassatoken, "CashboxUniqueNumber": data["printer"]["settings"]["CashboxUniqueNumber"], "OperationType": 1, "Sum": round(data["cash"]), // "ExternalCheckNumber": 123456789, }; //Вызов return new Promise(function(resolve, reject) { $this.ExecuteCommand("/?section=db&db=webkassa&action=MoneyOperation",jsonData, data).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, rashod: function(data) { var $this = this; var jsonData = { "Token":webkassatoken, "CashboxUniqueNumber": data["printer"]["settings"]["CashboxUniqueNumber"], "OperationType": 1, "Sum": round(data["cash"]), // "ExternalCheckNumber": 123456789, }; //Вызов return new Promise(function(resolve, reject) { $this.ExecuteCommand("/?section=db&db=webkassa&action=MoneyOperation",jsonData, data).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, auth: function(e){ var $this = this; var jsonData = { Login:e.user, Password:e.pass } //Вызов return new Promise(function(resolve, reject) { $this.ExecuteCommand("/?section=db&db=webkassa&action=auth",jsonData, e).then(function(json){ webkassatoken = json.Token; resolve({ status:"done" }); }).catch(function(error){ reject(error); }) }) }, generateReceipt: function(webKassaResult, device){ try{ var fiscalData = webKassaResult; var psettings = device.settings; var header = ""; var footer = ""; if(psettings["companyName"] != '' && psettings["companyName"] != null){ header = psettings["companyName"]+"\n"; } if(psettings["INN"] != "" && psettings["INN"] != null){ header += "ИИН "+psettings["INN"]+"\n"; } if(psettings["ndsSer"] != "" && psettings["ndsSer"] != null && psettings["ndsNum"] != "" && psettings["ndsNum"] != null){ header += "НДС Серия "+psettings["ndsSer"]+" Номер "+psettings["ndsNum"]+"\n"; } if(fiscalData.CheckNumber != null){ header += "Чек №"+fiscalData.CheckNumber+"\n"; } if(fiscalData.ShiftNumber != null){ header += "Смена №"+fiscalData.ShiftNumber+"\n"; } if(fiscalData.CheckOrderNumber != null){ header += "Порядковый номер чека "+fiscalData.CheckOrderNumber+"\n"; } // $("#qrcodetempcontainer").html(""); // var qrcode = new QRCode("qrcodetempcontainer"); // qrcode.makeCode(fiscalData.TicketUrl); // setTimeout(function(){ // var qrcodei = $("#qrcodetempcontainer").html(); // footer += qrcodei // },1000) if(fiscalData.CheckNumber != null){ footer += "
Фискальный признак: "+fiscalData.CheckNumber+"\n"; }else{ footer += "
Фискальный признак: "+fiscalData.CheckOrderNumber+"\n"; } if(fiscalData.DateTime != null){ footer += "Время: "+fiscalData.DateTime+"\n"; } footer += "Оператор фискальных данных: АО 'Казахтелеком'\n"; footer += "Для проверки чека зайдите на сайт consumer.oofd.kz
\n"; if(fiscalData.CashboxOfflineMode == true){ footer += "Чек сформирован в автономном режиме\n"; } footer += "* * * * *\n"; footer += "ФИСКАЛЬНЫЙ ЧЕК ФП\n"; footer += "ИНК: "+fiscalData.Cashbox.IdentityNumber+"\n"; footer += "РНК: "+fiscalData.Cashbox.RegistrationNumber+"\n"; footer += "ЗНК: "+fiscalData.Cashbox.UniqueNumber+"\n"; footer += "WEBKASSA.KZ\n"; footer += "* * * * *\n"; footer += "SKYSERVICE.PRO\n"; }catch(err){ console.error(err) } return { header:header, footer:footer } }, searcher: function(webKassaResult, device){ var devices = app.print.modules.getdevice(); var hf = app.print.protocols.kz_webkassa_windows.generateReceipt(webKassaResult, device); for (var di = 0; di < devices.length; di++) { //devices[di]["checks"] /*Если это принтер*/ if (devices[di]["type"] == "printer" || devices[di]["type"] == "possystem") { //devices[di]["header"] = hf.header; //devices[di]["footer"] = hf.footer; } } }, ExecuteCommand: function(url, Data, e) { console.log("webkassa",Data) app.main.loader("show"); return new Promise(function(resolve, reject) { xhr(url, JSON.stringify(Data)).then(function(json) { var content = JSON.parse(json); app.main.loader("hide"); try{ var errors = content.Errors; var errCount = 0; errors.forEach(function(item){ app.main.error("WebKassa: "+item.Text); errCount++; }) if(errCount > 0){ reject({ status: "error" }); } }catch(err){ //А тут печать нужно сделать app.print.protocols.kz_webkassa_windows.searcher(content.Data, e["printer"]); resolve(content.Data); } }).catch(function(){ app.main.loader("hide"); reject({ status: "error" }); app.main.loader("hide"); app.main.error("WebKassa: Нет соединения"); }) }) }, }, uaprro_testdublefix:{ inituser: function(userid) { try{ fiscalSettings = JSON.parse(localStorage["fiscalSettings_" + userbase])[currentsklad]; }catch(err){ } try { e_receipt = JSON.parse(app.main.Base64.decode(localStorage["e_receipt"])); if(!e_receipt[userid]){ this.ql.openUploadDialog().then(function(){ app.print.protocols.uaprro.runChoice(userid).then(function(e){ }) }) }else{ try{ if(fiscalSettings.uaprroCASHREGISTERNUM == null){ app.print.protocols.uaprro.runChoice(userid).then(function(e){ }) } }catch(err){ app.main.error("Не вдалося отримати налаштування ПРРО"); } } } catch (err) { alert("Не вдалось отримати збережені дані електронного цифрового підпису"); localStorage.removeItem('e_receipt'); this.ql.openUploadDialog().then(function(){ app.print.protocols.uaprro.runChoice(userid).then(function(e){ }) }) } }, ql: { reformatdatetime: function(orderdate, ordertime){ try{ var orderdateformat = orderdate[4]+""+orderdate[5]+""+orderdate[6]+""+orderdate[7]+"-"+orderdate[0]+""+orderdate[1]+"-"+orderdate[2]+""+orderdate[3] var ordertimeformat = ordertime[0]+""+ordertime[1]+":"+ordertime[2]+""+ordertime[3]+":"+ordertime[4]+""+ordertime[5] return orderdateformat+" "+ordertimeformat; }catch(err){ return null; } }, getUserECPData: function(userid) { return new Promise(function (resolve, reject) { try { try { var certInfo = JSON.parse(CSP.getCertificateInfo(e_receipt[userid].cert.cert).toString()) resolve(certInfo["subject"]); } catch (err) { reject(new Error("Не вдалось отримати сертифікат користувача")) } } catch (err) { reject(new Error("Не вдалось отримати електронний цифровий підпис користувача")) } }) }, openUploadDialog: function() { return new Promise(function (resolve, reject) { // Check for the File API support. if (window.File && window.FileReader && window.FileList && window.Blob) { $("#cert_file").off(); $("#cert_file").on('change', function (evt) { app.print.protocols.uaprro.ql.uploadfile(evt, "certfile"); }); $("#key_file").off(); $("#key_file").on('change', function (evt) { app.print.protocols.uaprro.ql.uploadfile(evt, "keyContainer"); }); } else { console.error('Не поддерживается загрузка файлов'); } $("#ecp").show() ecp = {}; jPut["userseller8"].data = preload["users"][currentsklad]; $('#userseller8 option[value='+currentuser+']').attr('selected','selected'); $("#saveECP").on('click', function(){ app.print.protocols.uaprro.ql.saveECP().then(function(){ resolve(); }) }) }) }, uploadfile: function(evt, name) { var f = evt.target.files[0]; // FileList object var extension = f.name.split('.').pop().toLowerCase(); console.log(extension) var reader = new FileReader(); // Closure to capture the file information. reader.onload = (function (theFile) { return function (e) { var binaryData = e.target.result; //Converting Binary Data to base 64 var base64String = window.btoa(binaryData); console.log("to localStorage", name, base64String); ecp[name] = base64String; if (name == "keyContainer") { ecp["keyExtension"] = extension } if (name == "certfile") { ecp["certExtension"] = extension } }; })(f); // Read in the image file as a data URL. reader.readAsBinaryString(f); }, saveECP: function() { var self = this; //Проверка ЕЦП для загрузки в хранилище return new Promise(function (resolve, reject) { try { if (ecp["certfile"] != "null" && ecp["keyContainer"] != "null") { var storagePassword = $("#pass_keystorage").val(); var b64storagePassword = btoa(storagePassword); var keyscontainer = self.openSecretKey(ecp["keyContainer"], ecp["keyExtension"], b64storagePassword); console.log("keyscontainer",keyscontainer); if (keyscontainer.keys.length > 0) { // Получение идентификатора ключа из контейнера секретного ключа var keyUser1 = keyscontainer["keys"][0]["key"]; //get second key from dual keys container var keyId = keyscontainer["keys"][0]["id"]; //Проверяем соответствие ключа и сертификата try { var e1 = CSP.getCertificateInfo(ecp["certfile"]); var uacert = e1.getSubjectKeyIdentifier(); try { if (keyId == uacert) { if (CSP.checkKeyPair(ecp["certfile"], keyUser1, b64storagePassword) == true) { var keyStoragePassword = $("#pass_keystorage").val(); try { var erdata = {}; if (localStorage["e_receipt"] != null) { try { erdata = JSON.parse(app.main.Base64.decode(localStorage["e_receipt"])); } catch (err) { alert("Не вдалось отримати збережені дані електронного цифрового підпису"); localStorage.removeItem('e_receipt'); } } var userid = $("#userseller8").val(); if (userid > 0) { erdata[userid] = { cert: { cert: ecp["certfile"], extension: ecp["certExtension"] }, keystorage: { key: ecp["keyContainer"], extension: ecp["keyExtension"], password: keyStoragePassword }, keyscontainer:keyscontainer }; localStorage["e_receipt"] = app.main.Base64.encode(JSON.stringify(erdata)); $("#ecp").hide(); app.main.message(lang["save"]); //Ну а теперь пробуем вычитать app.print.protocols.uaprro.inituser(userid); var certInfo = JSON.parse(e1.toString()) $("#ECPcommonName").html(certInfo["subject"]["commonName"]) resolve(); } else { alert("Не вдалось отримати ідентифікатор співробітника"); } } catch (err) { alert("Не вдалось зберегти електронний цифровий підпис"); } } else { alert("Eror 2: Ключ не відповідає сертифікату"); } } else { alert("Eror 1: Ключ не відповідає сертифікату"); } } catch (err) { alert("Помилка перевірки відповідності ключа до сертифікату") } } catch (err) { alert("Не вдалось отримати ID сертифікату"); } } else { alert("Не вірний пароль або ключ не відповідає необхідним параметрам"); } } } catch (err) { console.error(err) console.log("Не вдалось перевірити за зберегти електронний цифровий підпис") } }) }, openSecretKey: function(keyData, ext, pwd64) { //ext: 'zs2|dat|jks' var keys = []; var ret = { code: 0, keys: [] }; var res; var base64ToHex = function (base64) { var hex = ''; if (base64) { var raw = app.main.Base64.decode(base64); for (i = 0; i < raw.length; i++) { var h = raw.charCodeAt(i).toString(16); hex += (h.length === 2 ? h : '0' + h); } } return hex.toLowerCase(); }; CSP.getLastError().reset(); if (ext.toLowerCase() === 'jks') { keyData = CSP.convertPBKeyToPfx(keyData, pwd64); ret.code = CSP.getLastError().getCode(); if (ret.code) { return ret; } } console.log("конвертонутый", keyData) CSP.pfxVerify(keyData, pwd64); ret.code = CSP.getLastError().getCode(); CSP.getLastError().reset(); if (ret.code === 0 || ret.code === CSP.UNKNOWN_DIGEST) { var id; var keysCnt = CSP.pfxGetFileCount(keyData, pwd64, CSP.bsShroudedKeyBag); ret.code = CSP.getLastError().getCode(); if (ret.code) { return ret; } for (var i = 0; i < keysCnt; i++) { var key = CSP.pfxGetFile(keyData, pwd64, CSP.bsShroudedKeyBag, i); ret.code = CSP.getLastError().getCode(); if (ret.code) { return ret; } id = CSP.pfxGetId(keyData, pwd64, CSP.bsShroudedKeyBag, i); ret.code = CSP.getLastError().getCode(); if (ret.code) { return ret; } keys.push({ id: id, key: key }); } var certsCnt = CSP.pfxGetFileCount(keyData, pwd64, CSP.bsCertBag); if (CSP.getLastError().getCode() === 0) { for (var c = 0; c < certsCnt; c++) { var cert = CSP.pfxGetFile(keyData, pwd64, CSP.bsCertBag, c); console.log("cert",cert) if (CSP.getLastError().getCode() === 0) { var ci = CSP.getCertificateInfo(cert); console.log("keyinfo",ci); if (CSP.getLastError().getCode() === 0) { id = ci.getSubjectKeyIdentifier(); for (var m = 0; m < keys.length; m++) { if (keys[m].id === id) { keys[m].cert = cert; break; } } } else { CSP.getLastError().reset(); } } else { CSP.getLastError().reset(); } } } } else { var data = CSP.convertIITContainerToQL(keyData, pwd64); ret.code = CSP.getLastError().getCode(); if (ret.code) { return ret; } if (data && data.length > 0) { for (var j = 0; j < data.length; j += 2) { var keyItem = { id: base64ToHex(data[j + 1]), key: data[j] }; keys.push(keyItem); } } } ret.keys = keys; return ret; }, subscribe: function(data, userid) { var $this = this; return new Promise(function (resolve, reject) { var msg = app.main.Base64.encode(data, true); var ECPContiner = e_receipt[userid]; var certUser1 = ECPContiner.cert.cert; var contUser1 = ECPContiner.keystorage.key; var context = ECPContiner.keystorage.extension; var pass1 = btoa(ECPContiner.keystorage.password); //var dfscert = "MIIGlDCCBjygAwIBAgIUILTk7Q0wmYwEAAAADYIZAGepaQAwDQYLKoYkAgEBAQEDAQEwggFVMVQwUgYDVQQKDEvQhtC90YTQvtGA0LzQsNGG0ZbQudC90L4t0LTQvtCy0ZbQtNC60L7QstC40Lkg0LTQtdC/0LDRgNGC0LDQvNC10L3RgiDQlNCk0KExXjBcBgNVBAsMVdCj0L/RgNCw0LLQu9GW0L3QvdGPICjRhtC10L3RgtGAKSDRgdC10YDRgtC40YTRltC60LDRhtGW0Zcg0LrQu9GO0YfRltCyINCG0JTQlCDQlNCk0KExYjBgBgNVBAMMWdCQ0LrRgNC10LTQuNGC0L7QstCw0L3QuNC5INGG0LXQvdGC0YAg0YHQtdGA0YLQuNGE0ZbQutCw0YbRltGXINC60LvRjtGH0ZbQsiDQhtCU0JQg0JTQpNChMRkwFwYDVQQFDBBVQS0zOTM4NDQ3Ni0yMDE4MQswCQYDVQQGEwJVQTERMA8GA1UEBwwI0JrQuNGX0LIwHhcNMTgxMDIxMjEwMDAwWhcNMjAxMDIxMjEwMDAwWjCB2jFIMEYGA1UECgw/0JTQtdGA0LbQsNCy0L3QsCDRhNGW0YHQutCw0LvRjNC90LAg0YHQu9GD0LbQsdCwINCj0LrRgNCw0ZfQvdC4MVwwWgYDVQQDDFPQlNC10YDQttCw0LLQvdCwINGE0ZbRgdC60LDQu9GM0L3QsCDRgdC70YPQttCx0LAg0KPQutGA0LDRl9C90LguICLQntCi0KDQmNCc0JDQndCeIjEQMA4GA1UEBQwHMTY3MTY5MzELMAkGA1UEBhMCVUExETAPBgNVBAcMCNCa0LjRl9CyMIIBUTCCARIGCyqGJAIBAQEBAwEBMIIBATCBvDAPAgIBrzAJAgEBAgEDAgEFAgEBBDbzykDGaaTaFzFJyhLDLa4Ya1Osa8Y2WZferq6K0tiI+b/VNAFpTvnEJz2M/m3Cj3BqD0kQzgMCNj///////////////////////////////////7oxdUWACajApyTwL4Gqih/Lr4DZDHqVEQUEzwQ2fIV8lMVDO/2ZHhfCJoQGWFCpoknte8JJrlpOh4aJ+HLvetUkCC7DA46a7ee6a6Ezgdl5umIaBECp1utF8TxwgoDElnsjH16t9ljrpMA3KR042WvwJcpOF/jpcg3GFbQ6KJdfC8Heo2Q4tWTqLBef0BI+bbj6xXkEAzkABDZwH7HH26/x73WbRPIxKjHdz1QdnxUpB9vwBwMCB+2su4uKRf72QGSQH3TFfpk/24U+LF+XPUWjggJjMIICXzApBgNVHQ4EIgQgVPreL0lr1sfyTHNNerUgqfTp9nQpi3qYTy3WIVv+GH8wKwYDVR0jBCQwIoAgILTk7Q0wmYy+MGoHfWmaMnMjiukJCHHWFjcOGOV21H8wDgYDVR0PAQH/BAQDAgMIMBkGA1UdIAEB/wQPMA0wCwYJKoYkAgEBAQICMAwGA1UdEwEB/wQCMAAwHgYIKwYBBQUHAQMBAf8EDzANMAsGCSqGJAIBAQECATAcBgNVHREEFTAToBEGCisGAQQBgjcUAgOgAwwBNjBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vYWNza2lkZC5nb3YudWEvZG93bmxvYWQvY3Jscy9DQS0yMEI0RTRFRC1GdWxsLmNybDBKBgNVHS4EQzBBMD+gPaA7hjlodHRwOi8vYWNza2lkZC5nb3YudWEvZG93bmxvYWQvY3Jscy9DQS0yMEI0RTRFRC1EZWx0YS5jcmwwgY4GCCsGAQUFBwEBBIGBMH8wMAYIKwYBBQUHMAGGJGh0dHA6Ly9hY3NraWRkLmdvdi51YS9zZXJ2aWNlcy9vY3NwLzBLBggrBgEFBQcwAoY/aHR0cDovL2Fjc2tpZGQuZ292LnVhL2Rvd25sb2FkL2NlcnRpZmljYXRlcy9hbGxhY3NraWRkLTIwMTgucDdiMD8GCCsGAQUFBwELBDMwMTAvBggrBgEFBQcwA4YjaHR0cDovL2Fjc2tpZGQuZ292LnVhL3NlcnZpY2VzL3RzcC8wJQYDVR0JBB4wHDAaBgwqhiQCAQEBCwEEAgExChMIMzkyOTIxOTcwDQYLKoYkAgEBAQEDAQEDQwAEQOpK2+wF9M71fGniDDGc5ukZP7TJnnhNgTvcOer4ell38plKW/38z4lZjEnqjMLkmgaNLZLU9ramqTxNCBx62xU="; if(!ECPContiner.keyscontainer){ //alert("Вскрываем контейнер"); //Вскрываем контейнер и сохраняем данные чтобы не вскрытьва потом и не тратить ресурсы var keyscontainer = $this.openSecretKey(contUser1, context, pass1); ECPContiner.keyscontainer = keyscontainer; localStorage["e_receipt"] = app.main.Base64.encode(JSON.stringify(e_receipt)); }else{ //alert("Используем ключ повторно"); //этот вариант будет работать поле того как уже хоть раз контейнер был вскрыт var keyscontainer = ECPContiner.keyscontainer; } //console.log("Контейнер",keyscontainer); // Извлечение секретного ключа из контейнера try{ var keyUser1 = keyscontainer["keys"][0]["key"]; //get second key from dual keys container //console.log("keyUser1",keyUser1) }catch(err){ alert("Не вдалось отримати секретний ключ із контейнера"); reject(); } /* try{ Android.DSTU(JSON.stringify( { method:"sign", data:{ content:msg, cert:certUser1, key:keyUser1, password:pass1, timestamp:"2020-12-01 11:00:00" } } )); }catch(err){ } */ var container = new CSP.CADES(msg, certUser1, keyUser1, pass1, new CSP.UACADESInfo({ signingTime: new Date() })); if (container != undefined) { var bytes = container.getBytes(); console.log(app.main.Base64.decode(bytes)); resolve(bytes); } else { reject(new Error("Не вдалось підписати запит")) } }) }, }, getPRRO: function(userid){ var $this = this; return new Promise(function (resolve, reject) { //Извлекаем информацию из сертификата $this.ql.getUserECPData(userid).then(function (certData) { //Подписываем документ получения статуса РРО $this.ql.subscribe(JSON.stringify({ Command: "Objects" }), userid).then(function (signed) { //Отправляем документ получения статуса РРО $this.ExecuteCommand("cmd", signed).then(function (ereceiptStatus) { resolve(ereceiptStatus); }).catch(function (err) { reject(err) }) }) }) }) }, runChoice: function(userid){ return new Promise(function (resolve, reject) { if(fiscalSettings.uaprroCASHREGISTERNUM == null){ app.print.protocols.uaprro.getPRRO(userid).then(function(e){ $("#choiseprro1").show(); jPut["choiseprro1List"].data = e.TaxObjects; $(".choiseprro1Item").on('click', function(e){ var uuid = $(this).attr("data"); var prroAdressObj = prroAdress[uuid]; console.log("click",prroAdressObj); $("#choiseprro2").show(); jPut["choiseprro2List"].data = prroAdressObj.TransactionsRegistrars; $(".choiseprro2Item").on('click', function(e){ var TransactionsRegistrar = { NumFiscal: $(this).attr("NumFiscal"), NumLocal: $(this).attr("NumLocal"), Name: $(this).attr("FiscalName"), Closed: $(this).attr("shiftStatus") } delete prroAdressObj.TransactionsRegistrars; prroAdressObj.TransactionsRegistrar = TransactionsRegistrar; console.log("Результат работы формы", prroAdressObj) $("#choiseprro2").hide(); $("#choiseprro1").hide(); try{ try{ var fiscalSettingsTemp = JSON.parse(localStorage["fiscalSettings_" + userbase]); }catch(err){ var fiscalSettingsTemp = {}; } fiscalSettingsTemp[currentsklad] = { uaprroCASHDESKNUM: prroAdressObj.TransactionsRegistrar.NumLocal, //uaprroCASHIER: preload.users[currentsklad][userid]["user_name"], uaprroCASHREGISTERNUM: prroAdressObj.TransactionsRegistrar.NumFiscal, uaprroIPN: prroAdressObj.Ipn, uaprroORGNM: prroAdressObj.OrgName, uaprroPOINTADDR: prroAdressObj.Address, uaprroPOINTNM: prroAdressObj.Name, uaprroTIN: prroAdressObj.Tin } localStorage["fiscalSettings_" + userbase] = JSON.stringify(fiscalSettingsTemp); fiscalSettings = fiscalSettingsTemp[currentsklad]; app.main.message("Обрана каса з фіскальний номером "+prroAdressObj.TransactionsRegistrar.NumFiscal); $("#uaprroCASHREGISTERNUM").html(prroAdressObj.TransactionsRegistrar.NumFiscal); resolve(); }catch(err){ app.main.error("Не вдалося отримати параметри") reject(); } }); }) }) }else{ resolve(); } }) }, choiseAddr: function(data){ //Поскольку у нас jquery то нам надо создать обьект ключей что бы к ним обратится после клика var uuid = app.print.modules.guid(); prroAdress[uuid] = data; return uuid; }, prrosettings: function(){ $("#prrostatusbox").show() try{ $("#uaprroCASHREGISTERNUM").html(fiscalSettings.uaprroCASHREGISTERNUM); }catch(err){ } app.print.protocols.uaprro.ql.getUserECPData(currentuser).then(function (certData) { console.warn("certData", certData); $("#ECPcommonName").html(certData.commonName) }) $("#changeprro").on('click', function(){ fiscalSettings = {} $("#uaprroCASHREGISTERNUM").html(""); app.print.protocols.uaprro.runChoice(currentuser).then(function(e){}) }) $("#changeecpnow").on('click', function(){ e_receipt[currentuser] app.print.protocols.uaprro.ql.openUploadDialog().then(function(){}) }) }, opensmena: function(data) { var deviceItem = data.printer; var cdate = data.info.date.split('-'); var CompanyName = fiscalSettings.uaprroORGNM; var PointAdress = fiscalSettings.uaprroPOINTADDR; var PointName = fiscalSettings.uaprroPOINTNM; var IPN = fiscalSettings.uaprroIPN; //var INN = fiscalSettings.uaprroINN; var IID = fiscalSettings.uaprroTIN; try{ var logotype = deviceItem.settings.printerData.printParams.additionalPrintParams.logo; }catch(err){ var logotype = ""; } try{ var connection = deviceItem.settings.printerData.connectionParams.usb; }catch(err){ } var $this = this; function getCurrentDate() { var d = new Date(); var dd = d.getDate(); if (dd < 10) dd = '0' + dd; var mm = d.getMonth() + 1; if (mm < 10) mm = '0' + mm; var yy = d.getFullYear(); return dd + '' + mm + '' + yy; } function getCurrentTime() { var d = new Date() var hh = d.getHours(); if (hh < 10) hh = '0' + hh; var mm = d.getMinutes(); if (mm < 10) mm = '0' + mm; var ss = d.getSeconds(); if (ss < 10) ss = '0' + ss; return hh + '' + mm + '' + ss; } var userid = data.info.user; var rroSerialNum = fiscalSettings.uaprroCASHREGISTERNUM; return new Promise(function (resolve, reject) { $this.ql.subscribe(JSON.stringify({ Command: "TransactionsRegistrarState", NumFiscal: rroSerialNum }), userid).then(function (signed) { $this.ExecuteCommand("cmd", signed).then(function (ereceiptStatus) { if (ereceiptStatus.ShiftState == 0) { $this.ql.getUserECPData(userid).then(function (certData) { var xw = new XMLWriter('windows-1251'); xw.writeStartDocument(); xw.writeStartElement('CHECK'); xw.writeAttributeString('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance'); xw.writeAttributeString('xsi:noNamespaceSchemaLocation', 'check01.xsd'); xw.writeStartElement('CHECKHEAD'); //0-Чек реалізації товарів/послуг, 1-Чек переказу коштів, 2–Чек операції обміну валюти, 3-Чек видачі готівки, 100-Відкриття зміни, 101-Закриття зміни, 102-Початок офлайн сесії, 103-Завершення офлайн сесії xw.writeElementString('DOCTYPE', '100'); //Унікальний ідентифікатор документа (GUID) xw.writeElementString('UID', app.print.modules.guid())//.writeEndElement(); xw.writeElementString('TIN', fiscalSettings.uaprroTIN); //certData.DRFO if(fiscalSettings.uaprroIPN != "" && fiscalSettings.uaprroIPN != null){ xw.writeElementString('IPN', fiscalSettings.uaprroIPN); //certData.EDRPOU } if (certData.EDRPOU != null && certData.EDRPOU != '') { //ЕДРПОУ/ДРФО/№ паспорта продавца (10 символов, обязательный) //xw.writeElementString('TIN', certData.EDRPOU); //certData.DRFO } if (certData.EDRPOU != null && certData.EDRPOU != '') { //ИНН продавца (12 символов, необязательный) //xw.writeElementString('INN', certData.EDRPOU); } //Наименование продавца (256 символов) xw.writeElementString('ORGNM', fiscalSettings.uaprroORGNM)//.writeEndElement(); //Наименование точки продаж (256 символов, обязательный) xw.writeElementString('POINTNM', fiscalSettings.uaprroPOINTNM); //Адрес точки продаж (256 символов, обязательный) xw.writeElementString('POINTADDR', fiscalSettings.uaprroPOINTADDR)//.writeEndElement(); //Дата операции (ддммгггг, обязательный) xw.writeElementString('ORDERDATE', getCurrentDate())//.writeEndElement(); //Время операции (ччммсс, обязательный) xw.writeElementString('ORDERTIME', getCurrentTime())//.writeEndElement(); //Порядковый номер документа (128 символов, обязательный) var tempLocalNum = ereceiptStatus.NextLocalNum var NextLocalNum = tempLocalNum.toString(); xw.writeElementString('ORDERNUM', NextLocalNum)//.writeEndElement(); //Номер кассы (64 символа, обязательный) xw.writeElementString('CASHDESKNUM', fiscalSettings.uaprroCASHDESKNUM)//.writeEndElement(); //Фискальный номер регистратора расчётных операций (128 символов, необязательный) xw.writeElementString('CASHREGISTERNUM', rroSerialNum)//.writeEndElement(); //ФИО кассира (128 символов, обязательный) var cashierName = "Касир"; try{ cashierName = certData.commonName; //preload.users[currentsklad][userid]["user_name"] }catch(err){ } xw.writeElementString('CASHIER', cashierName)//.writeEndElement(); //Версия документа (Числовой) xw.writeElementString('VER', '1')//.writeEndElement(); //Фискальный номер документа (128 символов, необязательный) //xw.writeElementString('ORDERTAXNUM', '101234567890123')//.writeEndElement(); if(localStorage.prroTesting) { xw.writeElementString('TESTING', "true"); } xw.writeEndElement(); xw.writeEndElement(); var xml = xw.flush(); xw.close(); //clean the writer xw = undefined; //don't let visitors use it, it's closed console.log(xml); try { $this.ql.subscribe(xml, userid).then(function (signed) { $this.ExecuteCommand("doc", signed).then(function (res) { try{ app.main.message("Фіскальну зміну №"+res.dfsresult.TICKET.ORDERTAXNUM+" відкрито від "+app.print.protocols.uaprro.ql.reformatdatetime(res.dfsresult.TICKET.ORDERDATE,res.dfsresult.TICKET.ORDERTIME)) }catch(err){ app.main.message("Фіскальну зміну відкрито"); } console.warn('OPENED SHIFT!!!', res); try { res.ThisShift = { "Opened":app.print.protocols.uaprro.ql.reformatdatetime(res.dfsresult.TICKET.ORDERDATE,res.dfsresult.TICKET.ORDERTIME) }; } catch(err) { } try { res.Cashier = cashierName; } catch(err) { } try{ var systemPrinterValue = deviceItem.settings.printerData.connectionParams.systemPrinter; }catch(err){ var systemPrinterValue = ""; } try{ var ipAdress = deviceItem.settings.printerData.connectionParams.ip; }catch(err){ var ipAdress = ""; } try{ var macAdress = deviceItem.settings.printerData.connectionParams.mac; }catch(err){ var macAdress = ""; } try{ if(deviceItem.settings.printerData.printParams.codepage == null){ deviceItem.settings.printerData.printParams.codepage = "0" } }catch(err){ } try{ app.print.protocols[deviceItem.settings.connectionParams.printerProtocol]({ open_shift:true, info:{ allcena: CurrencyFormatted(round(data.info.allcena, 2)), cash: data.info.cash > 0 ? CurrencyFormatted(round(data.info.cash, 2)) : "", //client: "0", //coupon: 0, date: cdate[2] +"-"+ cdate[1] +"-"+ cdate[0], //discount: "0", //discounttitle: "Без скидки", nall: data.info.nall > 0 ? CurrencyFormatted(round(data.info.nall, 2)) : "", sdacha: CurrencyFormatted(round(data.info.sdacha, 2)), //servicecash: "0", summ: CurrencyFormatted(round(data.info.summ, 2)), time: data.info.time, type: "check", visa: CurrencyFormatted(round(data.info.visa, 2)), fiscalNumber:res.dfsresult.TICKET.ORDERTAXNUM, rroNum:rroSerialNum, companyName:CompanyName, pointAdress:PointAdress, pointName:PointName, IPN:IPN, IID:IID, cashRegisterNum:rroSerialNum, CASHDESKNUM:fiscalSettings.uaprroCASHDESKNUM, }, printer:{ buffer: deviceItem.settings.printerData.printParams.buffer != null ? deviceItem.settings.printerData.printParams.buffer : "", charset: deviceItem.settings.printerData.printParams.charset, checks: "3", data: '{"chineseOff":"0","systemPrinter":"'+systemPrinterValue+'"}', feed: deviceItem.settings.printerData.indents.feedBottom, fontsize: deviceItem.settings.printerData.sizes.font, ip: ipAdress, mac:macAdress, logo: logotype, manufacturer: "other", parallel: deviceItem.settings.printerData.printParams.parallel, connection: connection, mode: String(deviceItem.settings.printerData.printParams.printMode), protocol: deviceItem.settings.connectionParams.printerProtocol, size: deviceItem.settings.printerData.sizes.size, width:deviceItem.settings.printerData.sizes.width, header: deviceItem.settings.printerData.additionalPrintParams.header, footer: deviceItem.settings.printerData.additionalPrintParams.footer, systemPrinter: systemPrinterValue, type: "printer", codepage: deviceItem.settings.printerData.printParams.codepage }, OpenSmenaReport:res }); }catch(err){ app.main.error("Фіскальна зміна відкрита, не вдалося роздрукувати чек"); } resolve(res) }).catch(function (err) { reject(err) }) }) } catch (err) { console.error(err) } }) }else{ //Смена уже открыта alert("Фіскальну зміну було відкрито раніше, зміна в Skyservice POS буде відкрита наступним кроком"); resolve({ status:"done" }) } }).catch(function (err) { reject(err) }) }); }); }, opendrawer: function(data) { }, check: function(thisbasket) { console.warn("thisbasket", thisbasket); console.warn('actciz', thisbasket.products[0].aktciz); console.warn('barcode', thisbasket.products[0].barcode); //1 - ПДВ і збір окремо //2 - ПДВ на збір //3 - Збір на ПДВ var doubleTaxAlgorithm = 3; var deviceItem = thisbasket.printer; //TODO5 var fiscalSettings = deviceItem.settings.fiscalSettings; var tradepoint_id = deviceItem.sklad; var tradepoint = preload.sklad[tradepoint_id]; var tradepointName = tradepoint.title; var tradepointAddr = tradepoint.adress; var totalSum = 0; var totalDiscountSum = 0; var CompanyName = ""; var IPN = ""; var PointAdress = ""; var IID = ""; var PointName = ""; var roundsum = 0; var localNumber = ""; var cashRegisterNum = ""; var $this = this; app.main.loader("show"); var rroSerialNum = fiscalSettings.uaprroCASHREGISTERNUM; //Если в настройках указано алгоритм двойного налога if(doubleTaxAlgorithm == 2 || doubleTaxAlgorithm == 3){ //Обьект из которого можно получить данные о налоге по букве var taxLetterObj = {}; for (var keyLetter in preload.tax) { var taxitemObj = preload.tax[keyLetter]; taxLetterObj[taxitemObj["value"]] = taxitemObj; } } //Подсчет суммы var fiscalarr = $.map(thisbasket["products"], function (value, index) { return [value]; }); fiscalarr.forEach(function (item) { if(okruglenie == 0){ var price = round(item["cenaout"],2); var priced = round(item["cenaout_discount"],2); }else{ var price = round(item["cenaout_1"],2); var priced = round(item["cenaout_discount_1"],2); } //item["amount"] = round(price*item["kolvo"],2); //todo999 item["amount"] = round(multiplyin(price, item["kolvo"]),2) var discSum0 = 0; if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { //Если скидка есть //var disc_Sum = round(priced * item["kolvo"],2); //todo999 var disc_Sum = round(multiplyin(priced, item["kolvo"]),2) } else { //Скидки нет //var disc_Sum = round(price * item["kolvo"],2); //todo999 var disc_Sum = round(multiplyin(price, item["kolvo"]),2) } totalSum = app.main.sum(totalSum, disc_Sum); var realsum0 = round(multiplyin(price, item["kolvo"]),2) //var realsum0 = round(price * item["kolvo"],2); //todo999 var razn0 = realsum0 - disc_Sum; discSum0 = round(razn0, 2); //item["amountDisc"] = round(round(price*item["kolvo"],2)-discSum0,2); //todo999 item["amountDisc"] = round(round(multiplyin(price, item["kolvo"]),2)-discSum0,2); totalDiscountSum = app.main.sum(totalDiscountSum, discSum0); }); return new Promise(function (resolve, reject) { setTimeout(function (thisbasket) { //Этот костыль нужен для того чтобы запустить спинер var userid = thisbasket.info.user; //Извлекаем информацию из сертификата $this.ql.getUserECPData(userid).then(function (certData) { console.warn("certData", certData); //Подписываем документ получения статуса РРО $this.ql.subscribe(JSON.stringify({ Command: "TransactionsRegistrarState", //Objects NumFiscal: rroSerialNum }), userid).then(function (signed) { //Отправляем документ получения статуса РРО $this.ExecuteCommand("cmd", signed).then(function (ereceiptStatus) { //console.log("Objects",ereceiptStatus) //Если смена открыта if (ereceiptStatus.ShiftState == 1) { //Создаем документ продажи var xw = new XMLWriter('windows-1251'); xw.writeStartDocument(); xw.writeStartElement('CHECK').writeAttributeString('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance').writeAttributeString('xsi:noNamespaceSchemaLocation', 'check01.xsd'); xw.writeStartElement('CHECKHEAD'); //Тип документа(Числовой, обязательный): 0-Фіскальний чек, 1-Відкриття зміни, 2-Закриття зміни xw.writeElementString('DOCTYPE', '0'); //Расширенный тип документа(Числовой, обязательный) //Для DOCTYPE=0: 0-Касовий чек на товари (послуги), 1-Видатковий чек, 2-Чек операції «службове внесення», 3-Чек операції «службова видача»--> //Для DOCTYPE!=0: 0 xw.writeElementString('DOCSUBTYPE', '0'); //Уникальный идентификатор документа (GUID, обязательный) xw.writeElementString('UID', app.print.modules.guid()); if (fiscalSettings.uaprroTIN != '') { //ЕДРПОУ/ДРФО/№ паспорта продавца (10 символов, обязательный) xw.writeElementString('TIN', fiscalSettings.uaprroTIN); IID = fiscalSettings.uaprroTIN; } else if (certData.DRFO != '' && certData.DRFO != null) { //ЕДРПОУ/ДРФО/№ паспорта продавца (10 символов, обязательный) xw.writeElementString('TIN', certData.DRFO); IID = certData.DRFO; } if (fiscalSettings.uaprroIPN != '' && fiscalSettings.uaprroIPN != null) { //ИНН продавца (12 символов, необязательный) xw.writeElementString('IPN', fiscalSettings.uaprroIPN); IPN = fiscalSettings.uaprroIPN; } else if (certData.DRFO != '' && certData.DRFO != null) { //ИНН продавца (12 символов, необязательный) //xw.writeElementString('IPN', certData.DRFO); //IPN = certData.DRFO; } if (fiscalSettings.uaprroORGNM != "") { //Наименование продавца (256 символов, обязательный) xw.writeElementString('ORGNM', fiscalSettings.uaprroORGNM); //preload.settings.companyname CompanyName = fiscalSettings.uaprroORGNM; } else if (preload.settings.companyname != '') { //Наименование продавца (256 символов, обязательный) xw.writeElementString('ORGNM', preload.settings.companyname); //preload.settings.companyname CompanyName = preload.settings.companyname; } else { alert("Не вказано найменування організації"); reject(); } if (fiscalSettings.uaprroPOINTNM != '') { //Наименование точки продаж (256 символов, обязательный) xw.writeElementString('POINTNM', fiscalSettings.uaprroPOINTNM); PointName = fiscalSettings.uaprroPOINTNM; } else if (tradepointName != '') { //Наименование точки продаж (256 символов, обязательный) xw.writeElementString('POINTNM', tradepointName); PointName = tradepointName; } else { alert("Не вказано найменування точки продаж"); reject(); } if (fiscalSettings.uaprroPOINTADDR != '') { //Адрес точки продаж (256 символов, обязательный) xw.writeElementString('POINTADDR', fiscalSettings.uaprroPOINTADDR); PointAdress = fiscalSettings.uaprroPOINTADDR; } else if (tradepointAddr != '') { //Адрес точки продаж (256 символов, обязательный) xw.writeElementString('POINTADDR', tradepointAddr); PointAdress = tradepointAddr; } else { alert("Не вказано адресу торгової точки"); reject(); } var cdate = thisbasket.info.date.split('-'); //Дата операции (ддммгггг, обязательный) xw.writeElementString('ORDERDATE', cdate[2] + cdate[1] + cdate[0]); //Время операции (ччммсс, обязательный) xw.writeElementString('ORDERTIME', thisbasket.info.time.replace(/\:/g, '')); //Порядковый номер документа (128 символов, обязательный) xw.writeElementString('ORDERNUM', String(ereceiptStatus.NextLocalNum)); localNumber = ereceiptStatus.NextLocalNum; //Фискальный номер документа (128 символов, необязательный) //xw.writeElementString('ORDERTAXNUM', '101234567890123'); //Номер кассы (64 символа, обязательный) if (fiscalSettings.uaprroCASHDESKNUM == null || fiscalSettings.uaprroCASHDESKNUM == '') { alert("Не вказано порядковий номер каси"); reject(); } xw.writeElementString('CASHDESKNUM', fiscalSettings.uaprroCASHDESKNUM); cashRegisterNum = fiscalSettings.uaprroCASHDESKNUM; if (rroSerialNum == null || rroSerialNum == '') { alert("Не вказано фіскальний номер каси"); reject(); } //Фискальный номер регистратора расчётных операций (128 символов, необязательный) xw.writeElementString('CASHREGISTERNUM', rroSerialNum); var cashierName = "Касир"; try{ cashierName = certData.commonName; //preload.users[currentsklad][userid]["user_name"] }catch(err){ } //ФИО кассира (128 символов, обязательный) xw.writeElementString('CASHIER', cashierName); // certData.commonName //Версия документа (Числовой, обязательный) xw.writeElementString('VER', '1'); if(localStorage.prroTesting) { xw.writeElementString('TESTING', 'true'); } xw.writeEndElement(); //Підсумок по чеку xw.writeStartElement('CHECKTOTAL'); //Загальна сума (15.2 цифри) наприклад, 1000.00 xw.writeElementString('SUM', CurrencyFormatted(totalSum-okruglenie)); //thisbasket.info.allcena //Заокруглення (15.2 цифри) (наприклад, 0.71)--> xw.writeElementString('RNDSUM', CurrencyFormatted(okruglenie)); roundsum = CurrencyFormatted(okruglenie); //Загальна сума без округлення (15.2 цифри) (наприклад, 1000.71) xw.writeElementString('NORNDSUM', CurrencyFormatted(totalSum)); if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { //Тип знижки/націнки (1 символ) //0–Сумова, 1–Відсоткова xw.writeElementString('DISCOUNTTYPE', '0'); //Загальна сума знижки (15.2 цифри) xw.writeElementString('DISCOUNTSUM', CurrencyFormatted(totalDiscountSum)); } xw.writeEndElement(); xw.writeStartElement('CHECKPAY'); //Строка 1 xw.writeStartElement('ROW').writeAttributeString('ROWNUM', '1'); //Код форми оплати (числовий) //0–Готівка, 1–Банківська картка.. xw.writeElementString('PAYFORMCD', '0'); //Форма оплаты (64 символа, необязательный) xw.writeElementString('PAYFORMNM', 'ГОТІВКА'); //Итоговая сумма (15.2 цифры, необязательный) xw.writeElementString('SUM', CurrencyFormatted(thisbasket.info.cash)); //xw.writeElementString('PROVIDED', '12.00'); xw.writeEndElement(); //Строка 2 xw.writeStartElement('ROW').writeAttributeString('ROWNUM', '2'); //Код форми оплати (числовий) //0–Готівка, 1–Банківська картка.. xw.writeElementString('PAYFORMCD', '1'); //Форма оплаты (64 символа, необязательный) xw.writeElementString('PAYFORMNM', 'Банківська картка'); //Итоговая сумма (15.2 цифры, необязательный) xw.writeElementString('SUM', CurrencyFormatted(thisbasket.info.visa)); if (thisbasket["info"]["bankingData"]) { xw.writeStartElement('PAYSYS'); xw.writeStartElement('ROW').writeAttributeString('ROWNUM', '1'); /** виса/мастеркард и тд */ //Найменування платіжної системи (текст) if (thisbasket["info"]["bankingData"].issuerName) { xw.writeElementString('NAME', thisbasket["info"]["bankingData"].issuerName); } if (IPN) { //Податковий номер еквайра торговця (64 символи) //xw.writeElementString('ACQUIREPN', IPN);// thisbasket["info"]["bankingData"] } if (thisbasket["info"]["bankingData"]["bankName"]) { xw.writeElementString('ACQUIRENM', thisbasket["info"]["bankingData"]["bankName"]);// thisbasket["info"]["bankingData"] }else{ xw.writeElementString('ACQUIRENM', "Банк");// thisbasket["info"]["bankingData"] } // RRN (Reference Retrieval Number) платежа //Ідентифікатор транзакції, що надається еквайром та ідентифікує операцію в платіжній системі (128 символів) if (thisbasket["info"]["bankingData"]["rrn"]) { xw.writeElementString('ACQUIRETRANSID', thisbasket["info"]["bankingData"]["rrn"]); } //POS-термінал. Дата та час транзакції (ддммррррггххсс) //POSTRANSDATE //Ідентифікатор платіжного пристрою (128 символів)--> if (thisbasket["info"]["bankingData"].merchantID) { xw.writeElementString('DEVICEID', thisbasket["info"]["bankingData"].merchantID); } //Реквізити електронного платіжного засобу (128 символів) if (thisbasket["info"]["bankingData"].cardNumber) { xw.writeElementString('EPZDETAILS', thisbasket["info"]["bankingData"].cardNumber); } // Код авторизації (64 символи) if (thisbasket["info"]["bankingData"].authorizationCode) { xw.writeElementString('AUTHCD', thisbasket["info"]["bankingData"].authorizationCode); } //Сума оплати (15.2 цифри) xw.writeElementString('SUM', CurrencyFormatted(thisbasket.info.visa)); //Сума комісії (15.2 цифри)--> xw.writeElementString('COMMISSION', "0.00"); xw.writeEndElement(); xw.writeEndElement();// PAYSYS END } //Найменування платіжної системи (текст) // // // // // // // // // xw.writeEndElement(); xw.writeEndElement(); try { var prodTaxArr = {}; var prodTaxSum = {}; var prodTaxSumSource = {}; var prodTaxPercent = {}; var prodTaxType = {}; //Тут нам надо скалькулировать налоги fiscalarr.forEach(function (item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } if (item["tax"] != "" && item["tax"] != '-1') { //Если используем 2 буквы налога if(item["tax"].length == 2){ var splitters = item["tax"].split(""); for(var key in splitters){ var letter = splitters[key]; try{ if(doubleTaxAlgorithm != 1){ //Если в настройках указано алгоритм двойного налога //Тут нам надо добавить метки что это допустим был товар с сдвоенным налогом //Альтернативная версия что надо расчитать акциз сдесь, отнять от суммы товара для пдв if(taxLetterObj[letter]){ //Если это акциз то надо считать сумму для этого товара //Если активирован Збір на ПДВ if((taxLetterObj[letter]["cno"] == "1" && doubleTaxAlgorithm == 3) || taxLetterObj[letter]["cno"] == "0" && doubleTaxAlgorithm == 2){ item["amountDiscExciseSum"] = app.main.sum(item.amountDisc, -(round(item.amountDisc, 2) * 100) / round(round(taxLetterObj[letter]["percent"], 2) + 100, 2)); item["amountExciseSum"] = app.main.sum(item.amount, -(round(item.amount, 2) * 100) / round(round(taxLetterObj[letter]["percent"], 2) + 100, 2)); //возможно что-то из этого не нужно } } } }catch(err){ console.log("Не вдалось використати подвоєний податок") } if (prodTaxArr[letter]) { prodTaxArr[letter].push(item); } else { prodTaxArr[letter] = []; prodTaxArr[letter].push(item); } } } if (prodTaxArr[item["tax"]]) { prodTaxArr[item["tax"]].push(item); } else { prodTaxArr[item["tax"]] = []; prodTaxArr[item["tax"]].push(item); } item["rroitemdata"] = { status:"taxed", taxValue:item["tax"] } } }); } catch (err) { console.error(err); } //Налоговые ставки xw.writeStartElement('CHECKTAX'); var taxes = []; //Если в настройках указано алгоритм двойного налога то нам надо отсортировать налоги в правильном порядке if(doubleTaxAlgorithm != 1){ try{ for(var keyTaxItem in preload.tax){ var thisTax = preload.tax[keyTaxItem]; //ПДВ на збір (сначала пдв потом акциз) if(doubleTaxAlgorithm == 2){ //Акцизы добавляем в конец if(thisTax.cno == "1"){ taxes.push(thisTax); } //ПДВ добавляем в начало if(thisTax.cno == "0"){ taxes.unshift(thisTax); } } //Збір на ПДВ (сначала акциз потом пдв) if(doubleTaxAlgorithm == 3){ //Акцизы добавляем в начало if(thisTax.cno == "1"){ taxes.unshift(thisTax); } //ПДВ добавляем в конец if(thisTax.cno == "0"){ taxes.push(thisTax); } } } }catch(err){ console.log("не удалось отсортировать налоги по doubleTaxAlgorithm") } }else{ taxes = preload.tax; } var taxcounter = 1; try { //поменял key на keyTax во избежанеи проблем for (var keyTax in taxes) { var taxitem = taxes[keyTax]; if (taxitem.value != '' && taxitem.value != '-1' && taxitem.cno != "" && taxitem.cno != "-1" && taxitem.cno != null && taxitem.value.length == 1 && String(taxitem.value).match(/[А-ЩЬЮЯҐЄІЇ]/i)) { xw.writeStartElement('ROW').writeAttributeString('ROWNUM', String(taxcounter)); //Код виду податку/збору (числовий): //0-ПДВ,1-Акциз,2-ПФ... xw.writeElementString('TYPE', String(taxitem.cno)); //Найменування виду податку/збору (64 символи) xw.writeElementString('NAME', taxitem.title); //Літерне позначення виду і ставки податку/збору (А,Б,В,Г,...) (1 символ) xw.writeElementString('LETTER', taxitem.value); if (taxitem.percent == '') { taxitem.percent = 0; } //Відсоток податку/збору (15.2 цифри) xw.writeElementString('PRC', CurrencyFormatted(round(taxitem.percent, 2))); //Відсоток податку/збору (15.2 цифри) xw.writeElementString('SIGN', 'false'); var sum = 0; var sumDisc = 0; var SOURCESUM = 0; try { for (var keyTaxProduct in prodTaxArr[taxitem.value]) { var pritem = prodTaxArr[taxitem.value][keyTaxProduct]; try{ if(doubleTaxAlgorithm != 1){ //Попытка сказать налогу пдв что бы он отнял от суммы акцизный налог или наоборот //поскольку тут есть информация о том что был расчитан акцизный налог if(pritem.amountDiscExciseSum > 0 && pritem.amountExciseSum > 0){ //разделяем логику на 2 части что бы точно ниче не сломалось //метод расчета сдвоенного налога (Збір на ПДВ) if(doubleTaxAlgorithm == 3){ //И налоговая ставка ПДВ if(taxitem.cno == "0" && taxitem.percent > 0){ SOURCESUM = app.main.sum(SOURCESUM, pritem.amountDiscExciseSum); } } //метод расчета сдвоенного налога (ПДВ на збір) if(doubleTaxAlgorithm == 2 ){ //налоговая ставка акциз if(taxitem.cno == "1" && taxitem.percent > 0){ SOURCESUM = app.main.sum(SOURCESUM, pritem.amountDiscExciseSum); } } } } }catch(err){ console.log("не удалось совершить расчет сдвоенного налога"); } sum = app.main.sum(sum, pritem.amount); sumDisc = app.main.sum(sumDisc, pritem.amountDisc); if (prodTaxSum[taxitem.value] == null) { prodTaxSum[taxitem.value] = 0; } prodTaxSum[taxitem.value] += pritem.amountDisc //amount prodTaxPercent[taxitem.value] = taxitem.percent; prodTaxType[taxitem.value] = taxitem.cno; } } catch (err) { console.error(err); } //Сума для розрахування податку/збору (15.2 цифри) xw.writeElementString('TURNOVER', CurrencyFormatted(round(sum, 2))); //для сдвоенного налога if(SOURCESUM > 0 && doubleTaxAlgorithm != 1){ var sssssss = round(app.main.sum(sumDisc, -SOURCESUM), 2); xw.writeElementString('SOURCESUM', CurrencyFormatted(sssssss)); var taxsum = app.main.sum(sssssss, -(round(sssssss, 2) * 100) / round(round(taxitem.percent, 2) + 100, 2)); }else{ //сума для розрахунку податка. Додано для фіксу багу від 28.12.2022 xw.writeElementString('SOURCESUM', CurrencyFormatted(sumDisc)); var taxsum = app.main.sum(sumDisc, -(round(sumDisc, 2) * 100) / round(round(taxitem.percent, 2) + 100, 2)); } //Добавил что бы сохранять налог с вычетом акциза для печати на чеке... try{ if (prodTaxSumSource[taxitem.value] == null) { prodTaxSumSource[taxitem.value] = 0; } prodTaxSumSource[taxitem.value] += taxsum //amount }catch(err){ } if (prro_userdata.taxespay == null) { prro_userdata.taxespay = {} } if (!app.main.ifobject(prro_userdata, "taxespay." + taxitem.value)) { createobj(prro_userdata, "taxespay", taxitem.value, 0); } prro_userdata.taxespay[taxitem.value] += round(taxsum, 2) xw.writeElementString('SUM', CurrencyFormatted(round(taxsum, 2))); xw.writeEndElement(); taxcounter++; } } } catch (err) { console.error(err); } xw.writeEndElement(); xw.writeStartElement('CHECKBODY'); //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; var pcount = 0; var printProducts = []; //Собираем нужный массив и убираем позиции которые не подлежат налогообложению fiscalarr.forEach(function (item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } if (item["tax"] != "" && item["tax"] != '-1') { flag = 1; pcount++; xw.writeStartElement('ROW').writeAttributeString('ROWNUM', pcount); //Внутренний код товара (64 символа, необязательный) //xw.writeElementString('CODE', '98765'); var productName = item["name"]; //Костыльчик который убирает с имени товара приставку веса try { if (item.type == "mod") { if (item.quantity == "100g" || item.quantity == "100ml") { productName = preload.products[currentsklad][item.id]["name"]; } } } catch (err) { } if (item.barcode) { xw.writeElementString('BARCODE', String(item.barcode)); } if (item.uktzed != '' && item.uktzed != null && item.uktzed != "undefined" && item.uktzed != "0") { //Код товара по УКТЗЕД (15 цифр, необязательный) xw.writeElementString('UKTZED', String(item.uktzed)); } //Наименование товара (128 символов, необязательный) xw.writeElementString('NAME', String(productName)); //Код единицы измерения согласно классификатора (5 цифр, необязательный) //xw.writeElementString('UNITCODE', '25'); var unit = { pcs: "шт.", kg: "кг.", gr: "г.", l: "л.", ml: "мл.", m2: "м.кв.", mp: "м.п.", cm: "см.", mm: "мм.", t: "т.", min: "мин." }; //Наименование единицы измерения (64 символа, необязательный) xw.writeElementString('UNITNM', String(unit[item["quantity"]])); //Количество/объём товара (15.3 цифры, необязательный) xw.writeElementString('AMOUNT', QuantityFormatted(round(item["kolvo"], 3))); if(okruglenie == 0){ var price = round(item["cenaout"],2); var priced = round(item["cenaout_discount"],2); }else{ var price = round(item["cenaout_1"],2); var priced = round(item["cenaout_discount_1"],2); } var discountSum = 0; if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { //Если скидка есть var discSum = round(multiply(priced, item["kolvo"])); } else { //Скидки нет var discSum = round(multiply(price, item["kolvo"])); } var realsum = round(multiply(price, item["kolvo"])); var razn = realsum - discSum; discountSum = round(razn, 2); //Цена за единицу товара (15.2 цифры, необязательный) xw.writeElementString('PRICE', CurrencyFormatted(round(price, 2))); //Буквенное обозначение ставки (1 символа, необязательный) try{ if(preload.tax[item["tax_id"]]["cno"] != "-1"){ //Типа если это без ПДВ то не указываем LETTERS xw.writeElementString('LETTERS', String(item["tax"])); } }catch(err){ } //Стоимость товара (15.2 цифры, необязательный) xw.writeElementString('COST', CurrencyFormatted(round(((round(price, 2)*1000)*(round(item["kolvo"], 3)*1000))/1000000))); if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { //Тип знижки/націнки (1 символ): //0–Сумова, 1–Відсоткова xw.writeElementString('DISCOUNTTYPE', "0"); //Загальна сума знижки (15.2 цифри) xw.writeElementString('DISCOUNTSUM', CurrencyFormatted(round(discountSum, 2))); } // Акцизы, по идее, тут массив быть должен console.warn('ITEM!!!!') if (item.akciz) { xw.writeStartElement('EXCISELABELS'); xw.writeStartElement('ROW').writeAttributeString('ROWNUM', '1'); xw.writeElementString('EXCISELABEL', item.akciz); xw.writeEndElement(); xw.writeEndElement(); } xw.writeEndElement(); try{ //Товар на печать printProducts.push({ name:productName, unit:unit[item["quantity"]], kolvo:QuantityFormatted(round(item["kolvo"], 3)), cenaout:price, tax:item["tax"], uktzed:item["uktzed"], discSum:discountSum, akciz: item.akciz, barcode: item.barcode ? item.barcode : '', akciz: item.akciz ? item.akciz : '' }) }catch(err){ } } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } kostilsumm = kostilsumm + amount; } }); var dali = thisbasket["info"]["cash"]; if (thisbasket["info"]["nall"] > 0) { dali = thisbasket["info"]["nall"] } //Отнимаем от суммы которую дал клиент сумму товара который не пошел на печать на фискальник dali = dali - kostilsumm; if (kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы онлайн кассе"); } xw.writeEndElement(); var xml = xw.flush(); xw.close(); //clean the writer xw = undefined; //don't let visitors use it, it's closed console.log("xml", xml); try { //Хрень чисто для отладки //var xmlDOM = new DOMParser().parseFromString(xml, 'text/xml'); //console.log("xml", xml2json(xmlDOM)); } catch (err) { } //Подписываем чек продажи $this.ql.subscribe(xml, userid).then(function (signed) { //console.log("signed",signed) /////ТУТ БЫЛ ЗАПРОС //Отправляем чек продажи $this.ExecuteCommand("doc", signed).then(function (res) { if (res.dfsresult != null) { thisbasket.info.rrodata = { status:"taxed", taxNumber:res.dfsresult.TICKET.ORDERTAXNUM, rroSerialNum:rroSerialNum, deviceId:deviceItem.id, totalSum:thisbasket.info.allcena, electronSum:thisbasket.info.visa, cashSum:thisbasket.info.cash, rroResponse:res.dfsresult }; app.main.message("Фіскальний чек №" + res.dfsresult.TICKET.ORDERTAXNUM + " успішно прийнятий"); } //Если прошло успешно то записываем инфу о том что суммы поменялись (нужно для закытия смены) try { //Загальна сума реалізації prro_userdata.salesum += round(thisbasket.info.allcena, 2); } catch (err) { console.error(err); } try { //Кількість чеків prro_userdata.salecount += 1; } catch (err) { console.error(err); } try { //Выручка за наличные if (thisbasket.info.cash > 0) { prro_userdata.cash += round(thisbasket.info.cash, 2); } } catch (err) { console.error(err); } try { //Выручка по безналу if (thisbasket.info.visa > 0) { prro_userdata.electron += round(thisbasket.info.visa, 2); } } catch (err) { console.error(err); } try { //Записываем по налогам for (var key in prodTaxSum) { var t = prodTaxSum[key]; if (prro_userdata.taxes == null) { prro_userdata.taxes = {} } if (!app.main.ifobject(prro_userdata, "taxes." + key)) { createobj(prro_userdata, "taxes", key, 0); } prro_userdata.taxes[key] += t; } } catch (err) { console.error(err); } console.log("prro_userdata.taxes", prro_userdata.taxes) try { //Записываем в памяьб localStorage["currentShift"] = JSON.stringify(prro_userdata); } catch (err) { } try{ //electron_windowssystem_printer //electron_escpos_ethernet //electron_escpos_usb //electron_escpos_bluetooth // printserver_windows_1808 try{ var connection = deviceItem.settings.printerData.connectionParams.usb; }catch(err){ } try{ var logotype = deviceItem.settings.printerData.printParams.additionalPrintParams.logo; }catch(err){ var logotype = ""; } var qrcode = ""; var qrBlock = document.getElementById("qrcodetempcontainer"); new Promise(function(resolve,reject) { try{ qrBlock.innerHTML = ""; var receiptDate = res.dfsresult.TICKET.ORDERDATE; var receiptDateFix = receiptDate[4]+receiptDate[5]+receiptDate[6]+receiptDate[7] +"-"+receiptDate[2]+receiptDate[3]+"-"+receiptDate[0]+receiptDate[1]; new QRCode("qrcodetempcontainer", { text: "https://cabinet.tax.gov.ua/cashregs/check?id=" + res.dfsresult.TICKET.ORDERTAXNUM + "&date=" + receiptDateFix + "&type=3&fn=" + rroSerialNum+"&time="+res.dfsresult.TICKET.ORDERTIME+"&sm="+thisbasket.info.rrodata.totalSum, width: 180, height: 180, colorDark : "#000000", colorLight : "#ffffff", correctLevel : QRCode.CorrectLevel.M }); }catch(err){ //console.error(err) } setTimeout(function(){ var qrUrl = qrBlock.children[0].toDataURL("image/png"); console.log(qrUrl) var base64Url; try { qrcode = qrUrl.split("data:image/png;base64,")["1"]; console.log(base64Url) } catch (err) { console.log(err) } resolve() }, 500) }).then(function(){ try{ var systemPrinterValue = deviceItem.settings.printerData.connectionParams.systemPrinter; }catch(err){ var systemPrinterValue = ""; } try{ var ipAdress = deviceItem.settings.printerData.connectionParams.ip; }catch(err){ var ipAdress = ""; } try{ var macAdress = deviceItem.settings.printerData.connectionParams.mac; }catch(err){ var macAdress = ""; } try{ if(deviceItem.settings.printerData.printParams.codepage == null){ deviceItem.settings.printerData.printParams.codepage = "0" } }catch(err){ } var bankpaymentobj = {}; console.warn('thisbasket["info"]["bankingData"]>>>>>', thisbasket["info"]["bankingData"]); if (thisbasket["info"]["bankingData"]) { try{ if(thisbasket["info"]["bankingData"]["commission"]){ bankpaymentobj["fee"] = thisbasket["info"]["bankingData"]["commission"]; //Комиссия банка (в случае наличия) } }catch(err){ } try { if (thisbasket["info"]["bankingData"].isSignature) { bankpaymentobj.isSignature = thisbasket["info"]["bankingData"].isSignature; } } catch(err) { } try{ if(thisbasket["info"]["bankingData"]["rrn"]){ bankpaymentobj["rrn"] = thisbasket["info"]["bankingData"]["rrn"]; //RRN (Reference Retrieval Number) платежа } }catch(err){ } try { if (thisbasket["info"]["bankingData"].issuerName) { bankpaymentobj.issuerName = thisbasket["info"]["bankingData"].issuerName; } } catch(err) { } try{ if(thisbasket["info"]["bankingData"]["bankName"]){ bankpaymentobj.bankName = thisbasket["info"]["bankingData"]["bankName"]; //Название банка } }catch(err){ } try{ if(thisbasket["info"]["bankingData"]["cardNumber"]){ bankpaymentobj.cardNumber = thisbasket["info"]["bankingData"]["cardNumber"]; //Номер карты клиента } }catch(err){ } try{ if(thisbasket["info"]["bankingData"]["authorizationCode"]){ bankpaymentobj.authorizationCode = thisbasket["info"]["bankingData"]["authorizationCode"]; //Код авторизации платежа } }catch(err){ } try{ if(thisbasket["info"]["bankingData"]["terminalID"]){ bankpaymentobj.terminalID = thisbasket["info"]["bankingData"]["terminalID"]; //Номер платежного терминала } }catch(err){ } } //Печать, первая попытка try{ app.print.protocols[deviceItem.settings.connectionParams.printerProtocol]({ uaprro:true, info:{ allcena: CurrencyFormatted(round(thisbasket.info.allcena, 2)), cash: thisbasket.info.cash > 0 ? CurrencyFormatted(round(thisbasket.info.cash, 2)) : "", //client: "0", //coupon: 0, date: cdate[2] +"-"+ cdate[1] +"-"+ cdate[0], //discount: "0", //discounttitle: "Без скидки", nall: thisbasket.info.nall != '' ? CurrencyFormatted(round(thisbasket.info.nall, 2)) : thisbasket.info.cash, sdacha: CurrencyFormatted(round(thisbasket.info.sdacha, 2)), //servicecash: "0", summ: CurrencyFormatted(round(thisbasket.info.summ, 2)), time: thisbasket.info.time, type: "check", visa: CurrencyFormatted(round(thisbasket.info.visa, 2)), fiscalNumber:res.dfsresult.TICKET.ORDERTAXNUM, rroNum:rroSerialNum, companyName:CompanyName, pointAdress:PointAdress, pointName:PointName, IPN:IPN, IID:IID, qrcode:qrcode, roundsum:-roundsum, localNumber:localNumber, cashRegisterNum:cashRegisterNum }, printer:{ buffer: deviceItem.settings.printerData.printParams.buffer != null ? deviceItem.settings.printerData.printParams.buffer : "", charset: deviceItem.settings.printerData.printParams.charset, checks: "3", data: '{"chineseOff":"0","systemPrinter":"'+systemPrinterValue+'"}', feed: deviceItem.settings.printerData.indents.feedBottom, fontsize: deviceItem.settings.printerData.sizes.font, ip: ipAdress, mac:macAdress, logo: logotype, manufacturer: "other", parallel: deviceItem.settings.printerData.printParams.parallel, connection: connection, mode: String(deviceItem.settings.printerData.printParams.printMode), protocol: deviceItem.settings.connectionParams.printerProtocol, size: deviceItem.settings.printerData.sizes.size, width:deviceItem.settings.printerData.sizes.width, header: deviceItem.settings.printerData.additionalPrintParams.header, footer: deviceItem.settings.printerData.additionalPrintParams.footer, systemPrinter: systemPrinterValue, type: "printer", codepage: deviceItem.settings.printerData.printParams.codepage }, products:printProducts, prodTax:{ prodTaxSumSource:prodTaxSumSource, prodTaxSum:prodTaxSum, prodTaxPercent:prodTaxPercent, prodTaxType:prodTaxType }, bankData: bankpaymentobj }); }catch(err){ console.error(err) } }) }catch(err){ console.error(err) } resolve(res) }).catch(function (err) { reject(err) }) }) } else { alert("ПРРО: Не знайдено поточної фіскальної зміни, відкрийте фіскальну зміну"); app.main.opensmenaask(); $("#opennewsmenanow").off(); $("#opennewsmenanow").on('click', function(){ $("#opennewsmenanow").attr("disabled", true); app.main.loader("show"); app.print.print.opensmena().then(function(success) { console.warn('success!!!!!!', success); $('#openSmenaAskBox').animateCss('fadeOutDown', function() { $('#openSmenaAskBox').hide(); }); }, function(error) { // console.error(error); app.main.loader("hide"); $("#opennewsmenanow").attr("disabled", false); app.main.error("Не выполнена фискальная операция открытия смены"); $("#sendtranzakciu").attr("disabled", false); $('#openSmenaAskBox').animateCss('fadeOutDown', function() { $('#openSmenaAskBox').hide(); }); }); }) reject(); } }).catch(function (err) { console.error(err); if(err.text){ app.main.error(err.text) } reject(err); }) }) }).catch(function (err) { app.main.error(err); $this.ql.openUploadDialog(); }) }, 0, thisbasket); }) }, printCopyCheck: function(data) { //1 - ПДВ і збір окремо //2 - ПДВ на збір //3 - Збір на ПДВ var doubleTaxAlgorithm = 3; //Если в настройках указано алгоритм двойного налога if(doubleTaxAlgorithm == 2 || doubleTaxAlgorithm == 3){ //Обьект из которого можно получить данные о налоге по букве var taxLetterObj = {}; for (var keyLetter in preload.tax) { var taxitemObj = preload.tax[keyLetter]; taxLetterObj[taxitemObj["value"]] = taxitemObj; } } console.warn('printCopyCheck DATA', data); var devices = app.print.modules.getdevice(); console.log('+++++++devices+++++++', devices); // var thisbasket = {printer: devices[0], ...data}; //Object.assign(devices, history); // console.warn('this baskert !!! >>', thisbasket); var thisbasket = { //printer: devices[0], IsFiscalCheck: data.IsFiscalCheck, info: data.info, products: data.products, type: data.type } for (var di = 0; di < devices.length; di++) { console.warn('di device', devices[di]); if (devices[di].protocol == 'uaprro' || devices[di].protocol == 'uaprro_testdublefix') { thisbasket.printer = devices[di]; } } console.log('thisbasket >>>>>', thisbasket); var deviceItem = thisbasket.printer; try { var fiscalReceiptData = thisbasket.info.rrodata != null ? thisbasket.info.rrodata : {}; } catch(err) {} //var f iscalSettings = deviceItem.settings.f iscalSettings; var tradepoint_id = deviceItem.sklad; var tradepoint = preload.sklad[tradepoint_id]; var tradepointName = tradepoint.title; var tradepointAddr = tradepoint.adress; var cdate = thisbasket.info.date.split('-'); //TODO5 var fiscalSettings = thisbasket.printer.settings.fiscalSettings; console.warn(' deviceItem.settings ++++', deviceItem.settings) try{ var systemPrinterValue = deviceItem.settings.printerData.connectionParams.systemPrinter; }catch(err){ var systemPrinterValue = ""; } try{ var ipAdress = deviceItem.settings.printerData.connectionParams.ip; }catch(err){ var ipAdress = ""; } try{ var macAdress = deviceItem.settings.printerData.connectionParams.mac; }catch(err){ var macAdress = ""; } try{ if(deviceItem.settings.printerData.printParams.codepage == null){ deviceItem.settings.printerData.printParams.codepage = "0" } }catch(err){ } try{ var logotype = deviceItem.settings.printerData.printParams.additionalPrintParams.logo; }catch(err){ var logotype = ""; } try{ var connection = deviceItem.settings.printerData.connectionParams.usb; }catch(err){ } var roundsum = 0; var discountsum = 0; var fiscalarr = $.map(thisbasket["products"], function (value, index) { return [value]; }); var sum0 = 0; var sum2 = 0; console.warn('fiscal arr===>', fiscalarr); var printProducts = []; var prodTaxArr = {}; var prodTaxSum = {}; var prodTaxPercent = {}; var prodTaxSumSource = {}; var prodTaxType = {}; try { fiscalarr.forEach(function (item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } //item.rroitemdata.taxValue Можно и с истории брать значение и подставлять что бы ничего не ломалось if (item["tax"] != "" && item["tax"] != '-1' && item.rroitemdata.status == "taxed") { if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { discountsum = discountsum + round((item["cenaout"] - item["cenaout_discount"])* item["kolvo"],2); item["amount"] = item["cenaout"] * item["kolvo"]; item["amount2"] = item["cenaout_discount"] * item["kolvo"]; } else { item["amount"] = item["cenaout_discount"] * item["kolvo"]; item["amount2"] = item["cenaout"] * item["kolvo"]; } sum0 = sum0 + item["amount2"]; sum2 = sum2 + item["amount"]; try { roundsum = CurrencyFormatted(sum0-fiscalReceiptData.totalSum); } catch(err) { roundsum = 0; } //Если используем 2 буквы налога if (item["tax"].length == 2) { var splitters = item["tax"].split(""); for(var key in splitters) { var letter = splitters[key]; try{ if(doubleTaxAlgorithm != 1){ //Если в настройках указано алгоритм двойного налога //Тут нам надо добавить метки что это допустим был товар с сдвоенным налогом //Альтернативная версия что надо расчитать акциз сдесь, отнять от суммы товара для пдв if(taxLetterObj[letter]){ //Если это акциз то надо считать сумму для этого товара //Если активирован Збір на ПДВ if((taxLetterObj[letter]["cno"] == "1" && doubleTaxAlgorithm == 3) || taxLetterObj[letter]["cno"] == "0" && doubleTaxAlgorithm == 2){ //item["amountDiscExciseSum"] = app.main.sum(item.amountDisc, -(round(item.amountDisc, 2) * 100) / round(round(taxLetterObj[letter]["percent"], 2) + 100, 2)); item["amountExciseSum"] = app.main.sum(item.amount, -(round(item.amount, 2) * 100) / round(round(taxLetterObj[letter]["percent"], 2) + 100, 2)); //возможно что-то из этого не нужно } } } }catch(err){ console.log("Не вдалось використати подвоєний податок") } if (prodTaxArr[letter]) { prodTaxArr[letter].push(item); } else { prodTaxArr[letter] = []; prodTaxArr[letter].push(item); } } } if (prodTaxArr[item["tax"]]) { prodTaxArr[item["tax"]].push(item); } else { prodTaxArr[item["tax"]] = []; prodTaxArr[item["tax"]].push(item); } console.log('prodTaxArr>>>', prodTaxArr); } }); } catch(err) { console.log('fiscalarr.forEach', err); } try { var taxes = []; //Если в настройках указано алгоритм двойного налога то нам надо отсортировать налоги в правильном порядке if(doubleTaxAlgorithm != 1){ try{ for(var keyTaxItem in preload.tax){ var thisTax = preload.tax[keyTaxItem]; //ПДВ на збір (сначала пдв потом акциз) if(doubleTaxAlgorithm == 2){ //Акцизы добавляем в конец if(thisTax.cno == "1"){ taxes.push(thisTax); } //ПДВ добавляем в начало if(thisTax.cno == "0"){ taxes.unshift(thisTax); } } //Збір на ПДВ (сначала акциз потом пдв) if(doubleTaxAlgorithm == 3){ //Акцизы добавляем в начало if(thisTax.cno == "1"){ taxes.unshift(thisTax); } //ПДВ добавляем в конец if(thisTax.cno == "0"){ taxes.push(thisTax); } } } }catch(err){ console.log("не удалось отсортировать налоги по doubleTaxAlgorithm") } }else{ taxes = preload.tax; } var taxcounter = 1; for (var key in taxes) { var taxitem = taxes[key]; if (taxitem.value != '' && taxitem.value != '-1' && taxitem.cno != "" && taxitem.cno != "-1" && taxitem.cno != null && taxitem.value.length == 1 && String(taxitem.value).match(/[А-ЩЬЮЯҐЄІЇ]/i)) { if (taxitem.percent == '') { taxitem.percent = 0; } var sum = 0; var SOURCESUM = 0; try { console.warn('prodTaxArr переюор суммы>>>', prodTaxArr); for (var key in prodTaxArr[taxitem.value]) { var pritem = prodTaxArr[taxitem.value][key]; try{ if(doubleTaxAlgorithm != 1){ //Попытка сказать налогу пдв что бы он отнял от суммы акцизный налог или наоборот //поскольку тут есть информация о том что был расчитан акцизный налог if(pritem.amountExciseSum > 0){ //разделяем логику на 2 части что бы точно ниче не сломалось //метод расчета сдвоенного налога (Збір на ПДВ) if(doubleTaxAlgorithm == 3){ //И налоговая ставка ПДВ if(taxitem.cno == "0" && taxitem.percent > 0){ SOURCESUM = app.main.sum(SOURCESUM, pritem.amountExciseSum); } } //метод расчета сдвоенного налога (ПДВ на збір) if(doubleTaxAlgorithm == 2 ){ //налоговая ставка акциз if(taxitem.cno == "1" && taxitem.percent > 0){ SOURCESUM = app.main.sum(SOURCESUM, pritem.amountExciseSum); } } } } }catch(err){ console.log("не удалось совершить расчет сдвоенного налога"); } console.warn('pritem sssss ==>', pritem) sum = app.main.sum(sum, pritem.amount); if (prodTaxSum[taxitem.value] == null) { prodTaxSum[taxitem.value] = 0; } prodTaxSum[taxitem.value] += pritem.amount prodTaxPercent[taxitem.value] = taxitem.percent; prodTaxType[taxitem.value] = taxitem.cno; } } catch (err) { console.error(err); } //для сдвоенного налога if(SOURCESUM > 0 && doubleTaxAlgorithm != 1){ var sssssss = round(app.main.sum(sum, -SOURCESUM), 2); var taxsum = app.main.sum(sssssss, -(round(sssssss, 2) * 100) / round(round(taxitem.percent, 2) + 100, 2)); }else{ //Сума для розрахування податку/збору (15.2 цифри) var taxsum = app.main.sum(sum, -(round(sum, 2) * 100) / round(round(taxitem.percent, 2) + 100, 2)) } //Добавил что бы сохранять налог с вычетом акциза для печати на чеке... try{ if (prodTaxSumSource[taxitem.value] == null) { prodTaxSumSource[taxitem.value] = 0; } prodTaxSumSource[taxitem.value] += taxsum //amount }catch(err){ } if (prro_userdata.returntaxespay == null) { prro_userdata.returntaxespay = {} } if (!app.main.ifobject(prro_userdata, "returntaxespay." + taxitem.value)) { createobj(prro_userdata, "returntaxespay", taxitem.value, 0); } prro_userdata.returntaxespay[taxitem.value] += round(taxsum, 2) taxcounter++; } } } catch (err) { console.log('var key in taxes', err) } thisbasket.products.forEach(function (item) { try { //var discountsum = round((item["cenaout"] - item["cenaout_discount"])* item["kolvo"],2); //Товар на печать printProducts.push({ name: item.name,//productName, unit: item.quantity,//unit[item["quantity"]], kolvo: QuantityFormatted(round(item.kolvo, 3)), cenaout: item.cenaout, tax:item.tax, uktzed:item.uktzed, discSum: discountsum, barcode: item.rroitemdata.barcode, akciz: item.rroitemdata.excise }) } catch(err){ } }) console.warn('fiscalSettings!!!!!', fiscalSettings); var qrcode = ""; var qrBlock = document.getElementById("qrcodetempcontainer"); new Promise(function(resolve,reject) { try { qrBlock.innerHTML = ""; var receiptDate = thisbasket.info.rrodata.rroResponse.TICKET.ORDERDATE; var receiptDateFix = receiptDate[4]+receiptDate[5]+receiptDate[6]+receiptDate[7] +"-"+receiptDate[2]+receiptDate[3]+"-"+receiptDate[0]+receiptDate[1]; new QRCode("qrcodetempcontainer", { text: "https://cabinet.tax.gov.ua/cashregs/check?id=" + thisbasket.info.rrodata.rroResponse.TICKET.ORDERTAXNUM + "&date=" + receiptDateFix + "&type=3&fn=" + thisbasket.info.rrodata.rroSerialNum+"&time="+thisbasket.info.rrodata.rroResponse.TICKET.ORDERTIME+"&sm="+thisbasket.info.rrodata.totalSum, width: 180, height: 180, colorDark : "#000000", colorLight : "#ffffff", correctLevel : QRCode.CorrectLevel.M }); } catch(err){ console.log('QR err', err) } setTimeout(function(){ var qrUrl = qrBlock.children[0].toDataURL("image/png"); console.log(qrUrl) var base64Url; try { qrcode = qrUrl.split("data:image/png;base64,")["1"]; console.log(base64Url) } catch (err) { console.log(err) } resolve() }, 500) }).then(function() { try { console.warn('deviceItem+++++++++>>>>', deviceItem); app.print.protocols[deviceItem.settings.connectionParams.printerProtocol]({// copyCheck: true, uaprro:true, info:{ allcena: CurrencyFormatted(round(thisbasket.info.allcena, 2)), cash: thisbasket.info.cash > 0 ? CurrencyFormatted(round(thisbasket.info.cash, 2)) : "", date: cdate[2] +"-"+ cdate[1] +"-"+ cdate[0], nall: thisbasket.info.nall > 0 ? CurrencyFormatted(round(thisbasket.info.nall, 2)) : "", sdacha: CurrencyFormatted(round(thisbasket.info.sdacha, 2)), //servicecash: "0", summ: CurrencyFormatted(round(thisbasket.info.summ, 2)), time: thisbasket.info.time, type: "check", visa: CurrencyFormatted(round(thisbasket.info.visa, 2)), fiscalNumber: thisbasket.info.rrodata != null ? thisbasket.info.rrodata.rroResponse.TICKET.ORDERTAXNUM : '', rroNum: thisbasket.info.rrodata != null ? thisbasket.info.rrodata.rroSerialNum : '', companyName: fiscalSettings.uaprroORGNM, pointAdress: fiscalSettings.uaprroPOINTADDR, pointName: fiscalSettings.uaprroPOINTNM, IPN: fiscalSettings.uaprroIPN, IID: fiscalSettings.uaprroTIN, qrcode: qrcode, roundsum:-roundsum, localNumber: thisbasket.info.rrodata != null ? thisbasket.info.rrodata.rroResponse.TICKET.ORDERNUM : '', cashRegisterNum: fiscalSettings.uaprroCASHDESKNUM, }, printer:{ buffer: deviceItem.settings.printerData.printParams.buffer != null ? deviceItem.settings.printerData.printParams.buffer : "",// charset: deviceItem.settings.printerData.printParams.charset,// checks: "3", data: '{"chineseOff":"0","systemPrinter":"'+systemPrinterValue+'"}', feed: deviceItem.settings.printerData.indents.feedBottom,// fontsize: deviceItem.settings.printerData.sizes.font,// ip: ipAdress, mac:macAdress, logo: logotype, manufacturer: "other", parallel: deviceItem.settings.printerData.printParams.parallel,// connection: connection, mode: deviceItem.settings.printerData.printParams.printMode,// protocol: deviceItem.settings.connectionParams.printerProtocol,// size: deviceItem.settings.printerData.sizes.size,// width:deviceItem.settings.printerData.sizes.width,// header: deviceItem.settings.printerData.additionalPrintParams.header,// footer: deviceItem.settings.printerData.additionalPrintParams.footer,// systemPrinter: systemPrinterValue, type: "printer", codepage: deviceItem.settings.printerData.printParams.codepage// }, products:printProducts, prodTax:{ prodTaxSumSource:prodTaxSumSource, prodTaxSum: prodTaxSum, prodTaxPercent: prodTaxPercent, prodTaxType: prodTaxType }, bankData: thisbasket.info.bankingData ? JSON.parse(thisbasket.info.bankingData) : {} }); } catch(err) { console.error(err) } }) }, vozvrat: function(thisbasket) { var roudOrderSum = 0; //1 - ПДВ і збір окремо //2 - ПДВ на збір //3 - Збір на ПДВ var doubleTaxAlgorithm = 3; //Если в настройках указано алгоритм двойного налога if(doubleTaxAlgorithm == 2 || doubleTaxAlgorithm == 3){ //Обьект из которого можно получить данные о налоге по букве var taxLetterObj = {}; for (var keyLetter in preload.tax) { var taxitemObj = preload.tax[keyLetter]; taxLetterObj[taxitemObj["value"]] = taxitemObj; } } function runroundcheck(f_allcena, newcena){ var f1 = (100 / f_allcena) * (newcena); //Остаток от изначальной цены в процентах var outposition = 0; var summsoskidkoi = 0; for (key in thisbasket["products"]) { if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { //Со скидкой thisbasket["products"][key]["discount_zazor"] = (thisbasket["products"][key]["cenaout_discount"] - CurrencyFormatted((thisbasket["products"][key]["cenaout_discount"]/100)*f1)) * thisbasket["products"][key]["kolvo"]; summsoskidkoi = summsoskidkoi + (thisbasket["products"][key]["cenaout_discount"] + thisbasket["products"][key]["discount_zazor"]) * thisbasket["products"][key]["kolvo"]; }else{ //Без скидки thisbasket["products"][key]["cenaout_zazor"] = (thisbasket["products"][key]["cenaout"] - (thisbasket["products"][key]["cenaout"] / 100) * f1) * thisbasket["products"][key]["kolvo"]; summsoskidkoi = summsoskidkoi + (thisbasket["products"][key]["cenaout"] + thisbasket["products"][key]["cenaout_zazor"]) * thisbasket["products"][key]["kolvo"]; } outposition = key; } if (thisbasket.customReturn) { if (thisbasket["products"][key]["cenaout_discount_1"] != null) { thisbasket["products"][key]["cenaout_discount"] = thisbasket["products"][key]["cenaout_discount_1"]; } thisbasket["products"][key]["cenaout_discount_1"] = CurrencyFormatted((thisbasket["products"][key]["cenaout_discount"])); thisbasket["products"][key]["cenaout_1"] = CurrencyFormatted((thisbasket["products"][key]["cenaout"])); } var ostatok = round((thisbasket["info"]["allcena"] / 100) * f1, 2) - summsoskidkoi; roudOrderSum = round((thisbasket["info"]["allcena"] / 100) * f1, 2); //Закидіваем остаток который округлился в последнюю позицию if(ostatok != null && ostatok != undefined){ if(ostatok > 0 || ostatok < 0){ thisbasket["products"][outposition]["cenaout_zazor"] = parseFloat(thisbasket["products"][outposition]["cenaout_zazor"] + ostatok); } } } var $this = this; console.warn('vozvrat basket!!!!!>>', thisbasket); return new Promise(function (resolve, reject) { if (thisbasket.customReturn) { runroundcheck(thisbasket["info"]["allcena"], round(thisbasket["info"]["allcena"],1)); $("#returFiscalInputBox").show().animateCss("fadeInUp"); $("#returnFiskalNumBTN").off(); $("#returnFiskalNumBTN").on('click', function() { var fiscalNumInput = $('#fiscalInput').val(); if(thisbasket.info.discount <= 0 || thisbasket.info.discount == undefined || thisbasket.info.discount == null){ thisbasket.info.discount = 0; } if (fiscalNumInput != '') { thisbasket.info.fiscalNumber = fiscalNumInput; thisbasket.info.rrodata = { totalSum: roudOrderSum, cashSum: roudOrderSum, } for (var key in thisbasket.products) { var item = thisbasket.products[key]; item.rroitemdata = { status : "taxed" } } $('#returFiscalInputBox').hide(); console.error("newroundthisbasket",thisbasket) resolve(thisbasket); } else { console.log('Ошибка не указан фискальный чек'); } }) } else { resolve(thisbasket); } }).then(function(thisbasket){ var deviceItem = thisbasket.printer; var fiscalReceiptData = thisbasket.info.rrodata; //var f iscalSettings = deviceItem.settings.f iscalSettings; var tradepoint_id = deviceItem.sklad; var tradepoint = preload.sklad[tradepoint_id]; var tradepointName = tradepoint.title; var tradepointAddr = tradepoint.adress; var cdate = thisbasket.info.date.split('-'); //TODO5 var fiscalSettings = thisbasket.printer.settings.fiscalSettings; var prodTaxPercent = {}; var prodTaxType = {}; var localNumber = ""; var cashRegisterNum = ""; try{ var connection = deviceItem.settings.printerData.connectionParams.usb; }catch(err){ } var roundsum = 0; var crutchOkruglenie = okruglenie; app.main.loader("show"); var rroSerialNum = fiscalSettings.uaprroCASHREGISTERNUM; return new Promise(function (resolve, reject) { setTimeout(function (thisbasket) { //Этот костыль нужен для того чтобы запустить спинер var userid = thisbasket.info.user; //Извлекаем информацию из сертификата $this.ql.getUserECPData(userid).then(function (certData) { //console.warn("certData", certData); //Подписываем документ получения статуса РРО $this.ql.subscribe(JSON.stringify({ Command: "TransactionsRegistrarState", NumFiscal: rroSerialNum }), userid).then(function (signed) { //Отправляем документ получения статуса РРО $this.ExecuteCommand("cmd", signed).then(function (ereceiptStatus) { //Если смена открыта if (ereceiptStatus.ShiftState == 1) { //Создаем документ продажи var xw = new XMLWriter('windows-1251'); xw.writeStartDocument(); xw.writeStartElement('CHECK').writeAttributeString('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance').writeAttributeString('xsi:noNamespaceSchemaLocation', 'check01.xsd'); xw.writeStartElement('CHECKHEAD'); //Тип документа(Числовой, обязательный): 0-Фіскальний чек, 1-Відкриття зміни, 2-Закриття зміни xw.writeElementString('DOCTYPE', '0'); //Расширенный тип документа(Числовой, обязательный) //Для DOCTYPE=0: 0-Касовий чек на товари (послуги), 1-Видатковий чек, 2-Чек операції «службове внесення», 3-Чек операції «службова видача»--> //Для DOCTYPE!=0: 0 xw.writeElementString('DOCSUBTYPE', '1'); //Уникальный идентификатор документа (GUID, обязательный) xw.writeElementString('UID', app.print.modules.guid()); if (fiscalSettings.uaprroTIN != '') { //ЕДРПОУ/ДРФО/№ паспорта продавца (10 символов, обязательный) xw.writeElementString('TIN', fiscalSettings.uaprroTIN); } else if (certData.DRFO != '' && certData.DRFO != null) { //ЕДРПОУ/ДРФО/№ паспорта продавца (10 символов, обязательный) xw.writeElementString('TIN', certData.DRFO); } if (fiscalSettings.uaprroIPN != '' && fiscalSettings.uaprroIPN != null) { //ИНН продавца (12 символов, необязательный) xw.writeElementString('IPN', fiscalSettings.uaprroIPN); } else if (certData.DRFO != '' && certData.DRFO != null) { //ИНН продавца (12 символов, необязательный) //xw.writeElementString('IPN', certData.DRFO); } if (fiscalSettings.uaprroORGNM != "") { //Наименование продавца (256 символов, обязательный) xw.writeElementString('ORGNM', fiscalSettings.uaprroORGNM); //preload.settings.companyname } else if (preload.settings.companyname != '') { //Наименование продавца (256 символов, обязательный) xw.writeElementString('ORGNM', preload.settings.companyname); //preload.settings.companyname } else { alert("Не вказано найменування організації"); reject(); } if (fiscalSettings.uaprroPOINTNM != '') { //Наименование точки продаж (256 символов, обязательный) xw.writeElementString('POINTNM', fiscalSettings.uaprroPOINTNM); } else if (tradepointName != '') { //Наименование точки продаж (256 символов, обязательный) xw.writeElementString('POINTNM', tradepointName); } else { alert("Не вказано найменування точки продаж"); reject(); } if (fiscalSettings.uaprroPOINTADDR != '') { //Адрес точки продаж (256 символов, обязательный) xw.writeElementString('POINTADDR', fiscalSettings.uaprroPOINTADDR); } else if (tradepointAddr != '') { //Адрес точки продаж (256 символов, обязательный) xw.writeElementString('POINTADDR', tradepointAddr); } else { alert("Не вказано адресу торгової точки"); reject(); } //Дата операции (ддммгггг, обязательный) xw.writeElementString('ORDERDATE', (function () { var d = new Date(); var dd = d.getDate(); if (dd < 10) dd = '0' + dd; var mm = d.getMonth() + 1; if (mm < 10) mm = '0' + mm; var yy = d.getFullYear(); return dd + '' + mm + '' + yy; })()); //Время операции (ччммсс, обязательный) xw.writeElementString('ORDERTIME', (function () { var d = new Date() var hh = d.getHours(); if (hh < 10) hh = '0' + hh; var mm = d.getMinutes(); if (mm < 10) mm = '0' + mm; var ss = d.getSeconds(); if (ss < 10) ss = '0' + ss; return hh + '' + mm + '' + ss; })()); //Порядковый номер документа (128 символов, обязательный) xw.writeElementString('ORDERNUM', String(ereceiptStatus.NextLocalNum)); //Фискальный номер документа (128 символов, необязательный) //xw.writeElementString('ORDERTAXNUM', '101234567890123'); //Номер кассы (64 символа, обязательный) if (fiscalSettings.uaprroCASHDESKNUM == null || fiscalSettings.uaprroCASHDESKNUM == '') { alert("Не вказано порядковий номер каси"); reject(); } xw.writeElementString('CASHDESKNUM', fiscalSettings.uaprroCASHDESKNUM); if (rroSerialNum == null || rroSerialNum == '') { alert("Не вказано фіскальний номер каси"); reject(); } //Фискальный номер регистратора расчётных операций (128 символов, необязательный) xw.writeElementString('CASHREGISTERNUM', rroSerialNum); //Фіскальний номер чека, для якого здійснюється повернення (зазначається тільки для чеків повернення) (128 символів) try{ if(fiscalReceiptData.taxNumber){ xw.writeElementString('ORDERRETNUM', fiscalReceiptData.taxNumber); } else { xw.writeElementString('ORDERRETNUM', thisbasket.info.fiscalNumber); } }catch(err){ } var cashierName = "Касир"; try{ cashierName = certData.commonName; //preload.users[currentsklad][userid]["user_name"] }catch(err){ } //ФИО кассира (128 символов, обязательный) xw.writeElementString('CASHIER', cashierName); // certData.commonName //Версия документа (Числовой, обязательный) xw.writeElementString('VER', '1'); if(localStorage.prroTesting) { xw.writeElementString('TESTING', "true"); } xw.writeEndElement(); //Підсумок по чеку xw.writeStartElement('CHECKTOTAL'); var discountsum = 0; var sum0 = 0; var sum2 = 0; var fiscalarr = $.map(thisbasket["products"], function (value, index) { return [value]; }); var prodTaxArr = {}; var prodTaxSumSource = {}; var prodTaxSum = {}; try { //Тут нам надо скалькулировать налоги fiscalarr.forEach(function (item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } //item.rroitemdata.taxValue Можно и с истории брать значение и подставлять что бы ничего не ломалось if (item["tax"] != "" && item["tax"] != '-1' && item.rroitemdata.status == "taxed") { if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { discountsum = discountsum + round((item["cenaout"] - item["cenaout_discount"])* item["kolvo"],2); item["amount"] = item["cenaout"] * item["kolvo"]; item["amount2"] = item["cenaout_discount"] * item["kolvo"]; } else { console.warn('item["cenaout_discount"]', item["cenaout_discount"]) item["amount"] = item["cenaout_discount"] * item["kolvo"]; item["amount2"] = item["cenaout"] * item["kolvo"]; } sum0 = sum0 + item["amount2"]; sum2 = sum2 + item["amount"]; //Если используем 2 буквы налога if(item["tax"].length == 2){ var splitters = item["tax"].split(""); for(var key in splitters){ var letter = splitters[key]; try{ if(doubleTaxAlgorithm != 1){ //Если в настройках указано алгоритм двойного налога //Тут нам надо добавить метки что это допустим был товар с сдвоенным налогом //Альтернативная версия что надо расчитать акциз сдесь, отнять от суммы товара для пдв if(taxLetterObj[letter]){ //Если это акциз то надо считать сумму для этого товара //Если активирован Збір на ПДВ if((taxLetterObj[letter]["cno"] == "1" && doubleTaxAlgorithm == 3) || taxLetterObj[letter]["cno"] == "0" && doubleTaxAlgorithm == 2){ //item["amountDiscExciseSum"] = app.main.sum(item.amountDisc, -(round(item.amountDisc, 2) * 100) / round(round(taxLetterObj[letter]["percent"], 2) + 100, 2)); item["amountExciseSum"] = app.main.sum(item.amount, -(round(item.amount, 2) * 100) / round(round(taxLetterObj[letter]["percent"], 2) + 100, 2)); //возможно что-то из этого не нужно } } } }catch(err){ console.log("Не вдалось використати подвоєний податок") } if (prodTaxArr[letter]) { prodTaxArr[letter].push(item); } else { prodTaxArr[letter] = []; prodTaxArr[letter].push(item); } } } if (prodTaxArr[item["tax"]]) { prodTaxArr[item["tax"]].push(item); } else { prodTaxArr[item["tax"]] = []; prodTaxArr[item["tax"]].push(item); } } }); } catch (err) { console.error(err); } //Загальна сума (15.2 цифри) xw.writeElementString('SUM', CurrencyFormatted(fiscalReceiptData.totalSum)); if(thisbasket.customReturn){ //Возврат из корзины //Заокруглення (15.2 цифри) (наприклад, 0.71)--> console.log('TYT OKRUGLENIE VAR', okruglenie) xw.writeElementString('RNDSUM', CurrencyFormatted(okruglenie)); //Загальна сума без округлення (15.2 цифри) (наприклад, 1000.71) xw.writeElementString('NORNDSUM', CurrencyFormatted(thisbasket["info"]["allcena"])); //todo8 }else{ //Возврат через сервер if(sum0-fiscalReceiptData.totalSum != 0){ //Заокруглення (15.2 цифри) (наприклад, 0.71)--> xw.writeElementString('RNDSUM', CurrencyFormatted(sum0-fiscalReceiptData.totalSum)); roundsum = CurrencyFormatted(sum0-fiscalReceiptData.totalSum); //Загальна сума без округлення (15.2 цифри) (наприклад, 1000.71) xw.writeElementString('NORNDSUM', CurrencyFormatted(sum0)); } } if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { //Тип знижки/націнки (1 символ) //0–Сумова, 1–Відсоткова xw.writeElementString('DISCOUNTTYPE', '0'); //Загальна сума знижки (15.2 цифри) xw.writeElementString('DISCOUNTSUM', CurrencyFormatted(discountsum)); } xw.writeEndElement(); xw.writeStartElement('CHECKPAY'); //Строка 1 xw.writeStartElement('ROW').writeAttributeString('ROWNUM', '1'); //Код форми оплати (числовий) //0–Готівка, 1–Банківська картка.. xw.writeElementString('PAYFORMCD', '0'); //Форма оплаты (64 символа, необязательный) xw.writeElementString('PAYFORMNM', 'ГОТІВКА'); //Итоговая сумма (15.2 цифры, необязательный) xw.writeElementString('SUM', CurrencyFormatted(fiscalReceiptData.cashSum)); //xw.writeElementString('PROVIDED', '12.00'); xw.writeEndElement(); //Строка 2 xw.writeStartElement('ROW').writeAttributeString('ROWNUM', '2'); //Код форми оплати (числовий) //0–Готівка, 1–Банківська картка.. xw.writeElementString('PAYFORMCD', '1'); //Форма оплаты (64 символа, необязательный) xw.writeElementString('PAYFORMNM', 'Банківська картка'); //Итоговая сумма (15.2 цифры, необязательный) xw.writeElementString('SUM', CurrencyFormatted(fiscalReceiptData.electronSum)); if (thisbasket["info"]["bankingData"]) { xw.writeStartElement('PAYSYS'); xw.writeStartElement('ROW').writeAttributeString('ROWNUM', '1'); /** виса/мастеркард и тд */ //Найменування платіжної системи (текст) if (thisbasket["info"]["bankingData"].issuerName) { // xw.writeElementString('NAME', thisbasket["info"]["bankingData"].issuerName); } if (IPN) { xw.writeElementString('ACQUIREPN', IPN);// thisbasket["info"]["bankingData"] } if (thisbasket["info"]["bankingData"]["bankName"]) { //xxw.writeElementString('ACQUIRENM', thisbasket["info"]["bankingData"]["bankName"]);// thisbasket["info"]["bankingData"] } // RRN (Reference Retrieval Number) платежа if (thisbasket["info"]["bankingData"]["rrn"]) { xw.writeElementString('ACQUIRETRANSID', thisbasket["info"]["bankingData"]["rrn"]); } // Код авторизації (64 символи) if (thisbasket["info"]["bankingData"].authorizationCode) { //xw.writeElementString('AUTHCD', thisbasket["info"]["bankingData"].authorizationCode); } xw.writeEndElement(); xw.writeEndElement();// PAYSYS END } xw.writeEndElement(); xw.writeEndElement(); //Налоговые ставки xw.writeStartElement('CHECKTAX'); var taxes = []; //Если в настройках указано алгоритм двойного налога то нам надо отсортировать налоги в правильном порядке if(doubleTaxAlgorithm != 1){ try{ for(var keyTaxItem in preload.tax){ var thisTax = preload.tax[keyTaxItem]; //ПДВ на збір (сначала пдв потом акциз) if(doubleTaxAlgorithm == 2){ //Акцизы добавляем в конец if(thisTax.cno == "1"){ taxes.push(thisTax); } //ПДВ добавляем в начало if(thisTax.cno == "0"){ taxes.unshift(thisTax); } } //Збір на ПДВ (сначала акциз потом пдв) if(doubleTaxAlgorithm == 3){ //Акцизы добавляем в начало if(thisTax.cno == "1"){ taxes.unshift(thisTax); } //ПДВ добавляем в конец if(thisTax.cno == "0"){ taxes.push(thisTax); } } } }catch(err){ console.log("не удалось отсортировать налоги по doubleTaxAlgorithm") } }else{ taxes = preload.tax; } console.warn('TAXES', taxes); var taxcounter = 1; try { for (var keyTax in taxes) { var taxitem = taxes[keyTax]; console.warn('пременная первая в переборе', taxitem) if (taxitem.value != '' && taxitem.value != '-1' && taxitem.cno != "" && taxitem.cno != "-1" && taxitem.cno != null && taxitem.value.length == 1 && String(taxitem.value).match(/[А-ЩЬЮЯҐЄІЇ]/i)) { xw.writeStartElement('ROW').writeAttributeString('ROWNUM', String(taxcounter)); //Код виду податку/збору (числовий): //0-ПДВ,1-Акциз,2-ПФ... xw.writeElementString('TYPE', String(taxitem.cno)); //Найменування виду податку/збору (64 символи) xw.writeElementString('NAME', taxitem.title); //Літерне позначення виду і ставки податку/збору (А,Б,В,Г,...) (1 символ) xw.writeElementString('LETTER', taxitem.value); if (taxitem.percent == '') { taxitem.percent = 0; } //Відсоток податку/збору (15.2 цифри) xw.writeElementString('PRC', CurrencyFormatted(round(taxitem.percent, 2))); //Відсоток податку/збору (15.2 цифри) xw.writeElementString('SIGN', 'false'); var sum = 0; var SOURCESUM = 0; try { for (var keyTaxProduct in prodTaxArr[taxitem.value]) { var pritem = prodTaxArr[taxitem.value][keyTaxProduct]; try{ if(doubleTaxAlgorithm != 1){ //Попытка сказать налогу пдв что бы он отнял от суммы акцизный налог или наоборот //поскольку тут есть информация о том что был расчитан акцизный налог if(pritem.amountExciseSum > 0){ //разделяем логику на 2 части что бы точно ниче не сломалось //метод расчета сдвоенного налога (Збір на ПДВ) if(doubleTaxAlgorithm == 3){ //И налоговая ставка ПДВ if(taxitem.cno == "0" && taxitem.percent > 0){ SOURCESUM = app.main.sum(SOURCESUM, pritem.amountExciseSum); } } //метод расчета сдвоенного налога (ПДВ на збір) if(doubleTaxAlgorithm == 2 ){ //налоговая ставка акциз if(taxitem.cno == "1" && taxitem.percent > 0){ SOURCESUM = app.main.sum(SOURCESUM, pritem.amountExciseSum); } } } } }catch(err){ console.log("не удалось совершить расчет сдвоенного налога"); } sum = app.main.sum(sum, pritem.amount); if (prodTaxSum[taxitem.value] == null) { prodTaxSum[taxitem.value] = 0; } prodTaxSum[taxitem.value] += pritem.amount prodTaxPercent[taxitem.value] = taxitem.percent; prodTaxType[taxitem.value] = taxitem.cno; } } catch (err) { console.error(err); } //Сума для розрахування податку/збору (15.2 цифри) console.warn('!!!!!sum>>', sum); xw.writeElementString('TURNOVER', CurrencyFormatted(round(sum, 2))); //для сдвоенного налога if(SOURCESUM > 0 && doubleTaxAlgorithm != 1){ var sssssss = round(app.main.sum(sum, -SOURCESUM), 2); xw.writeElementString('SOURCESUM', CurrencyFormatted(sssssss)); var taxsum = app.main.sum(sssssss, -(round(sssssss, 2) * 100) / round(round(taxitem.percent, 2) + 100, 2)); }else{ var taxsum = app.main.sum(sum, -(round(sum, 2) * 100) / round(round(taxitem.percent, 2) + 100, 2)) } //Добавил что бы сохранять налог с вычетом акциза для печати на чеке... try{ if (prodTaxSumSource[taxitem.value] == null) { prodTaxSumSource[taxitem.value] = 0; } prodTaxSumSource[taxitem.value] += taxsum //amount }catch(err){ } console.log('var taxsum ====>>', taxsum) if (prro_userdata.returntaxespay == null) { prro_userdata.returntaxespay = {} } if (!app.main.ifobject(prro_userdata, "returntaxespay." + taxitem.value)) { createobj(prro_userdata, "returntaxespay", taxitem.value, 0); } prro_userdata.returntaxespay[taxitem.value] += round(taxsum, 2) xw.writeElementString('SUM', CurrencyFormatted(round(taxsum, 2))); xw.writeEndElement(); taxcounter++; } } } catch (err) { console.error(err); } xw.writeEndElement(); xw.writeStartElement('CHECKBODY'); //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; var pcount = 0; var printProducts = []; //Собираем нужный массив и убираем позиции которые не подлежат налогообложению fiscalarr.forEach(function (item) { console.warn('fiscalarr>>>>> item>>>', item) //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } if (item["tax"] != "" && item["tax"] != '-1') { flag = 1; pcount++; xw.writeStartElement('ROW').writeAttributeString('ROWNUM', pcount); //Внутренний код товара (64 символа, необязательный) //xw.writeElementString('CODE', '98765'); var productName = item["name"]; //Костыльчик который убирает с имени товара приставку веса try { if (item.type == "mod") { if (item.quantity == "100g" || item.quantity == "100ml") { productName = preload.products[currentsklad][item.id]["name"]; } } } catch (err) { } if (item.rroitemdata.barcode) { xw.writeElementString('BARCODE', item.rroitemdata.barcode); } if (item.uktzed != '' && item.uktzed != null && item.uktzed != "undefined" && item.uktzed != "0") { //Код товара по УКТЗЕД (15 цифр, необязательный) xw.writeElementString('UKTZED', String(item.uktzed)); } //Наименование товара (128 символов, необязательный) xw.writeElementString('NAME', String(productName)); //Код единицы измерения согласно классификатора (5 цифр, необязательный) //xw.writeElementString('UNITCODE', '25'); var unit = { pcs: "шт.", kg: "кг.", gr: "г.", l: "л.", ml: "мл.", m2: "м.кв.", mp: "м.п.", cm: "см.", mm: "мм.", t: "т.", min: "мин." }; //Наименование единицы измерения (64 символа, необязательный) xw.writeElementString('UNITNM', String(unit[item["quantity"]])); //Количество/объём товара (15.3 цифры, необязательный) xw.writeElementString('AMOUNT', QuantityFormatted(round(item["kolvo"], 3))); //Цена за единицу товара (15.2 цифры, необязательный) if (thisbasket.info.cashdiscount > 0 && thisbasket.customReturn) { //xw.writeElementString('PRICE', CurrencyFormatted(thisbasket.info.rrodata.cashSum)); xw.writeElementString('PRICE', CurrencyFormatted(Number(item.cenaout_discount))); } else { xw.writeElementString('PRICE', CurrencyFormatted(round(item["cenaout"], 2))); } //Буквенное обозначение ставки (1 символа, необязательный) try{ if(preload.tax[item["tax_id"]]["cno"] != "-1"){ //Типа если это без ПДВ то не указываем LETTERS xw.writeElementString('LETTERS', String(item["tax"])); } }catch(err){ } //Стоимость товара (15.2 цифры, необязательный) if (thisbasket.info.cashdiscount > 0 && thisbasket.customReturn) { //xw.writeElementString('COST', CurrencyFormatted(thisbasket.info.rrodata.cashSum * round(item["kolvo"], 3))); xw.writeElementString('COST', CurrencyFormatted(round(((Number(item.cenaout_discount)*1000)*(round(item["kolvo"],3)*1000))/1000000))); } else { xw.writeElementString('COST', CurrencyFormatted(round(((Number(item.cenaout)*1000)*(round(item["kolvo"],3)*1000))/1000000))); } if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { //Тип знижки/націнки (1 символ): //0–Сумова, 1–Відсоткова xw.writeElementString('DISCOUNTTYPE', "0"); //Загальна сума знижки (15.2 цифри) xw.writeElementString('DISCOUNTSUM', CurrencyFormatted(round(item["cenaout"] - item["cenaout_discount"], 2)*item["kolvo"])); } if (item.rroitemdata.excise) { xw.writeStartElement('EXCISELABELS'); xw.writeStartElement('ROW').writeAttributeString('ROWNUM', '1'); xw.writeElementString('EXCISELABEL', item.rroitemdata.excise); xw.writeEndElement(); xw.writeEndElement(); } xw.writeEndElement(); // return test var price; var priced; if (okruglenie == 0){ price = round(item["cenaout"],2); priced = round(item["cenaout_discount"],2); }else{ price = round(item["cenaout_1"],2); priced = round(item["cenaout_discount_1"],2); } var discSum; if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { //Если скидка есть discSum = round(priced * item["kolvo"],2); } else { //Скидки нет discSum = round(price * item["kolvo"],2); } console.log('price!!!', price); console.log('priced!!!', priced); console.log('discSum!!!', discSum); console.log('item["cenaout"]', item["cenaout"]); console.log('round(item["cenaout_discount"]', item["cenaout_discount"]); console.log('round(item["cenaout_1"],2)', item["cenaout_1"],2); console.log('round(item["cenaout_discount_1"],2)', item["cenaout_discount_1"],2); var realsum = price * item["kolvo"] var razn; if (thisbasket.customReturn) { razn = realsum - round(item.cenaout_discount); } else { razn = realsum - discSum; } discountSum = round(razn, 2); console.error('price item', item["cenaout"]) try{ //Товар на печать printProducts.push({ name:productName, unit:unit[item["quantity"]], kolvo:QuantityFormatted(round(item["kolvo"], 3)), cenaout:thisbasket.customReturn ? item["cenaout"] : price, tax:item["tax"], uktzed:item["uktzed"], discSum:discountSum, excise: item.rroitemdata.excise, barcode: item.rroitemdata.barcode }) }catch(err){ console.warn(err); } } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount2 = item["cenaout_discount"] * item["kolvo"]; } else { amount2 = item["cenaout"] * item["kolvo"]; } kostilsumm = kostilsumm + amount2; } }); var dali = thisbasket["info"]["cash"]; if (thisbasket["info"]["nall"] > 0) { dali = thisbasket["info"]["nall"] } //Отнимаем от суммы которую дал клиент сумму товара который не пошел на печать на фискальник dali = dali - kostilsumm; if (kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы онлайн кассе"); } xw.writeEndElement(); var xml = xw.flush(); xw.close(); //clean the writer xw = undefined; //don't let visitors use it, it's closed console.log("xml", xml); try { //Хрень чисто для отладки //var xmlDOM = new DOMParser().parseFromString(xml, 'text/xml'); //console.log("xml", xml2json(xmlDOM)); } catch (err) { } //Подписываем чек продажи $this.ql.subscribe(xml, userid).then(function (signed) { //console.log("signed",signed) /////ТУТ БЫЛ ЗАПРОС //Отправляем чек продажи $this.ExecuteCommand("doc", signed).then(function (res) { if (res.dfsresult != null) { //app.main.message("Фіскальний чек №" + res.dfsresult.TICKET.ORDERTAXNUM + " успішно прийнятий"); } //Если прошло успешно то записываем инфу о том что суммы поменялись (нужно для закытия смены) try { //Загальна сума реалізації prro_userdata.returnsum += round(fiscalReceiptData.totalSum, 2); } catch (err) { console.error(err); } try { //Кількість чеків prro_userdata.returncount += 1; } catch (err) { console.error(err); } try { //Выручка за наличные if (fiscalReceiptData.cashSum > 0) { prro_userdata.returnCash += round(fiscalReceiptData.cashSum, 2); } } catch (err) { console.error(err); } try { //Выручка по безналу if (fiscalReceiptData.electronSum > 0) { prro_userdata.returnElectron += round(fiscalReceiptData.electronSum, 2); } } catch (err) { console.error(err); } try { //Записываем по налогам for (var key in prodTaxSum) { var t = prodTaxSum[key]; if (prro_userdata.returnTaxes == null) { prro_userdata.returnTaxes = {}; } if (!app.main.ifobject(prro_userdata, "returnTaxes." + key)) { createobj(prro_userdata, "returnTaxes", key, 0); } prro_userdata.returnTaxes[key] += t; } } catch (err) { console.error(err); } console.log("prro_userdata.returnTaxes", prro_userdata.returnTaxes) try { //Записываем в памяьб localStorage["currentShift"] = JSON.stringify(prro_userdata); } catch (err) { } /** * печать чека */ // try{ var logotype = deviceItem.settings.printerData.printParams.additionalPrintParams.logo; }catch(err){ var logotype = ""; } var qrcode = ""; var qrBlock = document.getElementById("qrcodetempcontainer"); new Promise(function(resolve,reject){ try{ qrBlock.innerHTML = ""; var receiptDate = res.dfsresult.TICKET.ORDERDATE; var receiptDateFix = receiptDate[4]+receiptDate[5]+receiptDate[6]+receiptDate[7] +"-"+receiptDate[2]+receiptDate[3]+"-"+receiptDate[0]+receiptDate[1]; new QRCode("qrcodetempcontainer", { text: "https://cabinet.tax.gov.ua/cashregs/check?id=" + res.dfsresult.TICKET.ORDERTAXNUM + "&date=" + receiptDateFix + "&type=3&fn=" + rroSerialNum+"&time="+res.dfsresult.TICKET.ORDERTIME+"&sm="+round(fiscalReceiptData.totalSum, 2), width: 180, height: 180, colorDark : "#000000", colorLight : "#ffffff", correctLevel : QRCode.CorrectLevel.M }); }catch(err){ console.error(err) } setTimeout(function(){ var qrUrl = qrBlock.children[0].toDataURL("image/png"); console.log(qrUrl) var base64Url; try { qrcode = qrUrl.split("data:image/png;base64,")["1"]; console.log(base64Url) } catch (err) { console.log(err) } resolve() }, 500) }).then(function() { try{ var systemPrinterValue = deviceItem.settings.printerData.connectionParams.systemPrinter; }catch(err){ var systemPrinterValue = ""; } try{ var ipAdress = deviceItem.settings.printerData.connectionParams.ip; }catch(err){ var ipAdress = ""; } try{ var macAdress = deviceItem.settings.printerData.connectionParams.mac; }catch(err){ var macAdress = ""; } try{ if(deviceItem.settings.printerData.printParams.codepage == null){ deviceItem.settings.printerData.printParams.codepage = "0" } }catch(err){ } var bankpaymentobj = {} console.warn('thisbasket["info"]["bankingData"]>>>>>', thisbasket["info"]["bankingData"]); if (thisbasket["info"]["bankingData"]) { try{ if(thisbasket["info"]["bankingData"]["commission"]){ bankpaymentobj["fee"] = thisbasket["info"]["bankingData"]["commission"]; //Комиссия банка (в случае наличия) } }catch(err){ } try { if (thisbasket["info"]["bankingData"].isSignature) { bankpaymentobj.isSignature = thisbasket["info"]["bankingData"].isSignature; } } catch(err) { } try{ if(thisbasket["info"]["bankingData"]["rrn"]){ bankpaymentobj["rrn"] = thisbasket["info"]["bankingData"]["rrn"]; //RRN (Reference Retrieval Number) платежа } }catch(err){ } try { if (thisbasket["info"]["bankingData"].issuerName) { bankpaymentobj.issuerName = thisbasket["info"]["bankingData"].issuerName; } } catch(err) { } try{ if(thisbasket["info"]["bankingData"]["bankName"]){ bankpaymentobj.bankName = thisbasket["info"]["bankingData"]["bankName"]; //Название банка } }catch(err){ } try{ if(thisbasket["info"]["bankingData"]["cardNumber"]){ bankpaymentobj.cardNumber = thisbasket["info"]["bankingData"]["cardNumber"]; //Номер карты клиента } }catch(err){ } try{ if(thisbasket["info"]["bankingData"]["authorizationCode"]){ bankpaymentobj.authorizationCode = thisbasket["info"]["bankingData"]["authorizationCode"]; //Код авторизации платежа } }catch(err){ } try{ if(thisbasket["info"]["bankingData"]["terminalID"]){ bankpaymentobj.terminalID = thisbasket["info"]["bankingData"]["terminalID"]; //Номер платежного терминала } }catch(err){ } } try { var RS = thisbasket.customReturn ? -crutchOkruglenie : -roundsum; console.error('okruglenie', crutchOkruglenie) app.print.protocols[deviceItem.settings.connectionParams.printerProtocol]({ uaprro_Return:true, customRETURN: thisbasket.customReturn, info:{ allcena: CurrencyFormatted(round(thisbasket.info.allcena, 2)), cash: thisbasket.info.cash > 0 ? CurrencyFormatted(round(thisbasket.info.cash, 2)) : "", //client: "0", //coupon: 0, date: cdate[2] +"-"+ cdate[1] +"-"+ cdate[0], //discount: "0", //discounttitle: "Без скидки", nall: thisbasket.info.nall > 0 ? CurrencyFormatted(round(thisbasket.info.nall, 2)) : "", sdacha: CurrencyFormatted(round(thisbasket.info.sdacha, 2)), //servicecash: "0", summ: CurrencyFormatted(round(thisbasket.info.summ, 2)), time: thisbasket.info.time, type: "check", visa: CurrencyFormatted(round(thisbasket.info.visa, 2)), fiscalNumber:res.dfsresult.TICKET.ORDERTAXNUM, rroNum:rroSerialNum, companyName:fiscalSettings.uaprroORGNM, pointAdress:fiscalSettings.uaprroPOINTADDR, pointName:fiscalSettings.uaprroPOINTNM, IPN:fiscalSettings.uaprroIPN, IID:fiscalSettings.uaprroTIN, qrcode:qrcode, roundsum: RS,//-roundsum, localNumber:ereceiptStatus.NextLocalNum, cashRegisterNum:fiscalSettings.uaprroCASHDESKNUM }, printer:{ buffer: deviceItem.settings.printerData.printParams.buffer != null ? deviceItem.settings.printerData.printParams.buffer : "", charset: deviceItem.settings.printerData.printParams.charset, checks: "3", data: '{"chineseOff":"0","systemPrinter":"'+systemPrinterValue+'"}', feed: deviceItem.settings.printerData.indents.feedBottom, fontsize: deviceItem.settings.printerData.sizes.font, ip: ipAdress, mac:macAdress, logo: "", manufacturer: "other", parallel: deviceItem.settings.printerData.printParams.parallel, connection: connection, mode: String(deviceItem.settings.printerData.printParams.printMode), protocol: deviceItem.settings.connectionParams.printerProtocol, size: deviceItem.settings.printerData.sizes.size, width:deviceItem.settings.printerData.sizes.width, header: deviceItem.settings.printerData.additionalPrintParams.header, footer: deviceItem.settings.printerData.additionalPrintParams.footer, systemPrinter: systemPrinterValue, type: "printer", codepage: deviceItem.settings.printerData.printParams.codepage }, products:printProducts, prodTax:{ prodTaxSumSource:prodTaxSumSource, prodTaxSum:prodTaxSum, prodTaxPercent:prodTaxPercent, prodTaxType:prodTaxType }, bankData: bankpaymentobj }); } catch(err) { console.warn('error >>>', err) } }) console.warn('RES RES RES', res); resolve(res) }).catch(function (err) { reject(err) }) }) } else { alert("Нет активной смены, откройте смену"); reject(); } }).catch(function (err) { console.error(err); if(err.text){ app.main.error(err.text) } reject(err); }) }) }).catch(function (err) { app.main.error(err); $this.ql.openUploadDialog(); }) }, 0, thisbasket); }); }) }, precheck: function(thisbasket) { }, XReport: function(thisbasket) { console.warn('x report basket ====>>', thisbasket) var cdate = thisbasket.info.date.split('-'); var deviceItem = thisbasket.printer; app.main.loader("show") //TODO5 var fiscalSettings = thisbasket.printer.settings.fiscalSettings var $this = this; function getCurrentDate() { var d = new Date(); var dd = d.getDate(); if (dd < 10) dd = '0' + dd; var mm = d.getMonth() + 1; if (mm < 10) mm = '0' + mm; var yy = d.getFullYear(); return dd + '' + mm + '' + yy; } function getCurrentTime() { var d = new Date() var hh = d.getHours(); if (hh < 10) hh = '0' + hh; var mm = d.getMinutes(); if (mm < 10) mm = '0' + mm; var ss = d.getSeconds(); if (ss < 10) ss = '0' + ss; return hh + '' + mm + '' + ss; } var userid = thisbasket.info.user; var rroSerialNum = fiscalSettings.uaprroCASHREGISTERNUM; return new Promise(function (resolve, reject) { $this.ql.subscribe(JSON.stringify({ Command: "TransactionsRegistrarState", NumFiscal: rroSerialNum }), userid).then(function (signed) { $this.ExecuteCommand("cmd", signed).then(function (ereceiptStatus) { $this.ql.subscribe(JSON.stringify({ Command: "LastShiftTotals", NumFiscal: rroSerialNum }), userid).then(function (signed) { $this.ExecuteCommand("cmd", signed).then(function (res) { console.log('ereceiptStatus =======>', ereceiptStatus); //Если смена не закрыта if(res.ShiftState == 1){ console.warn("Отчет за смену",res); if (!res.Totals) res.Totals = {} try{ res.Totals.ereceiptStatus = ereceiptStatus; }catch(err){ console.error("ereceiptStatus") } try { res.Totals.ThisShift = { "Opened":res.Opened }; } catch(err) { console.log(err); } var cashSum = 0; var ServiceInput = 0; var ServiceOutput = 0; var saleCash = 0; var retCash = 0; try{ try{ //Внесение кассовых средств ServiceInput = res.Totals.ServiceInput; }catch(err){ } try{ //Изьятие кассовых средств ServiceOutput = res.Totals.ServiceOutput; }catch(err){ } try{ //Сумма продаж за наличные for(var key in res.Totals.Real.PayForm){ var value = res.Totals.Real.PayForm[key]; if(value["PayFormCode"] == 0){ saleCash = value["Sum"]; } } }catch(err){ } try{ //Сумма возвратов за наличные for(var key in res.Totals.Ret.PayForm){ var value = res.Totals.Ret.PayForm[key]; if(value["PayFormCode"] == 0){ retCash = value["Sum"]; } } }catch(err){ } //Сумма в кассе наличных cashSum = app.main.sum(ServiceInput, -ServiceOutput, saleCash, -retCash) }catch(err){ } try{ var systemPrinterValue = deviceItem.settings.printerData.connectionParams.systemPrinter; }catch(err){ var systemPrinterValue = ""; } try{ var ipAdress = deviceItem.settings.printerData.connectionParams.ip; }catch(err){ var ipAdress = ""; } try{ var macAdress = deviceItem.settings.printerData.connectionParams.mac; }catch(err){ var macAdress = ""; } try{ if(deviceItem.settings.printerData.printParams.codepage == null){ deviceItem.settings.printerData.printParams.codepage = "0" } }catch(err){ } try{ var connection = deviceItem.settings.printerData.connectionParams.usb; }catch(err){ } app.print.protocols[deviceItem.settings.connectionParams.printerProtocol]({ uaprro_xReport:true, info:{ date: cdate[2] +"-"+ cdate[1] +"-"+ cdate[0], time: thisbasket.info.time, type: "check", rroNum:rroSerialNum, companyName:fiscalSettings.uaprroORGNM, pointAdress:fiscalSettings.uaprroPOINTADDR, pointName:fiscalSettings.uaprroPOINTNM, IPN:fiscalSettings.uaprroIPN, IID:fiscalSettings.uaprroTIN, CASHDESKNUM: fiscalSettings.uaprroCASHDESKNUM //cashRegisterNum:cashRegisterNum }, printer:{ buffer: deviceItem.settings.printerData.printParams.buffer != null ? deviceItem.settings.printerData.printParams.buffer : "", charset: deviceItem.settings.printerData.printParams.charset, checks: "3", data: '{"chineseOff":"0","systemPrinter":"'+systemPrinterValue+'"}', feed: deviceItem.settings.printerData.indents.feedBottom, fontsize: deviceItem.settings.printerData.sizes.font, ip: ipAdress, mac:macAdress, //logo: logotype, connection:connection, manufacturer: "other", parallel: deviceItem.settings.printerData.printParams.parallel, mode: String(deviceItem.settings.printerData.printParams.printMode), protocol: deviceItem.settings.connectionParams.printerProtocol, size: deviceItem.settings.printerData.sizes.size, width:deviceItem.settings.printerData.sizes.width, header: deviceItem.settings.printerData.additionalPrintParams.header, footer: deviceItem.settings.printerData.additionalPrintParams.footer, systemPrinter: systemPrinterValue, type: "printer", codepage: deviceItem.settings.printerData.printParams.codepage }, xReport:res.Totals, cashSum:cashSum }); app.main.loader("hide") resolve(res) }else{ alert("Нет активной смены"); app.main.loader("hide") reject(); } }).catch(function (err) { reject(err) }) }) }).catch(function (err) { reject(err) }) }); }); }, X3Report: function(thisbasket) { console.warn('thisbasket>>>>>>', thisbasket) var cdate = thisbasket.info.date.split('-'); var deviceItem = thisbasket.printer; app.main.loader("show") //TODO5 var fiscalSettings = thisbasket.printer.settings.fiscalSettings var $this = this; function getCurrentDate() { var d = new Date(); var dd = d.getDate(); if (dd < 10) dd = '0' + dd; var mm = d.getMonth() + 1; if (mm < 10) mm = '0' + mm; var yy = d.getFullYear(); return dd + '' + mm + '' + yy; } function getCurrentTime() { var d = new Date() var hh = d.getHours(); if (hh < 10) hh = '0' + hh; var mm = d.getMinutes(); if (mm < 10) mm = '0' + mm; var ss = d.getSeconds(); if (ss < 10) ss = '0' + ss; return hh + '' + mm + '' + ss; } var userid = thisbasket.info.user; var rroSerialNum = fiscalSettings.uaprroCASHREGISTERNUM; return new Promise(function (resolve, reject) { $this.ql.subscribe(JSON.stringify({ Command: "TransactionsRegistrarState", NumFiscal: rroSerialNum }), userid).then(function (signed) { $this.ExecuteCommand("cmd", signed).then(function (ereceiptStatus) { $this.ql.subscribe(JSON.stringify({ Command: "LastShiftTotals", NumFiscal: rroSerialNum }), userid).then(function (signed) { $this.ExecuteCommand("cmd", signed).then(function (res) { var funcDateFrom = function() { // 3 дня var dayMilliseconds = 72*60*60*1000; // формируем дату минус 3 дня var fromDate = new Date(); fromDate.setTime(fromDate.getTime() - dayMilliseconds) console.log(fromDate) // создаем переменные из которых потом собираем дату в нужном формате var yy = fromDate.getFullYear(); var mm = fromDate.getMonth(); var dd = fromDate.getDate(); var hh = fromDate.getHours(); var min = fromDate.getMinutes(); var mmm = (mm + 1) < 10 ? '0' + (mm + 1) : mm + 1 var ddd = dd < 10 ? '0' + dd : dd; var hhh = hh < 10 ? '0' + hh : hh; var minMin = min < 10 ? '0' + min : min; return yy + '-' + mmm + '-' + ddd + 'T' + hhh + ':' + minMin + ':00+03:00'; } // функция формирующая дату для запроса по сменам TO var funcDateTo = function() { var d = new Date(); var yy = d.getFullYear(); var mm = d.getMonth(); var dd = d.getDate(); var hh = d.getHours(); var min = d.getMinutes(); //var ss = d.getSeconds(); var mmm = (mm + 1) < 10 ? '0' + (mm + 1) : mm + 1 var ddd = dd < 10 ? '0' + dd : dd; var hhh = hh < 10 ? '0' + hh : hh; var minMin = min < 10 ? '0' + min : min; return yy + '-' + mmm + '-' + ddd + 'T' + hhh + ':' + minMin + ':00+02:00'; } console.warn('date>>>', funcDateFrom() + ' ' + funcDateTo()); // запрос по сменам старт $this.ql.subscribe(JSON.stringify({ Command: "Shifts", NumFiscal: rroSerialNum, From: funcDateFrom(),//"2020-12-21T13:53:00+03:00" To: funcDateTo() }), userid).then(function (signed) { $this.ExecuteCommand("cmd", signed).then(function (Shifts) { $this.ql.subscribe(JSON.stringify({ Command: "Documents", NumFiscal: rroSerialNum, ShiftId: Shifts.Shifts[Shifts.Shifts.length - 1].ShiftId }), userid).then(function (signed) { $this.ExecuteCommand("cmd", signed).then(function (Doc) { console.warn('Documents DOOOOC!!>>>', Doc); app.main.loader("show"); app.main.getjson("/?section=db&db=magic&sql=document&action=read&type=sale&of=id&ot=desc&pagelimit=999999999999&page=0&search=" + currentsmena + "&sline=smena&rrodata=true").then(function(content) { if (content.status == "done") { console.warn('content>>', content) // Изначально формируем массив локальными номерами которые получили с бэка var contentArr = []; content.products.map(function(item) { contentArr.push(item.rrodata.rroResponse.TICKET.ORDERNUM) }) // потом формируем массив из списка чеков полученных с ДФС var arrDoc = [] Doc.Documents.map(function(item) { if (item.CheckDocType == 'SaleGoods') { arrDoc.push(String(item.NumLocal)) } }) console.log('arrDoc', arrDoc); console.log('contentArr>>>', contentArr); // сравниваем оба массива на идентичность contentArr.reverse() if (arrDoc.length === contentArr.length && arrDoc.every(function(value, index) { value === contentArr[index]} )) { console.warn('true'); } else { console.log('false'); } }; //Если смена не закрыта if(res.ShiftState == 1){ console.warn("Отчет за смену doc",res); try{ res.Totals.ereceiptStatus = ereceiptStatus; }catch(err){ console.error("ereceiptStatus") } try { res.Totals.ThisShift = Shifts; } catch(err) { console.log(err); } try{ var systemPrinterValue = deviceItem.settings.printerData.connectionParams.systemPrinter; }catch(err){ var systemPrinterValue = ""; } try{ var ipAdress = deviceItem.settings.printerData.connectionParams.ip; }catch(err){ var ipAdress = ""; } try{ var macAdress = deviceItem.settings.printerData.connectionParams.mac; }catch(err){ var macAdress = ""; } try{ if(deviceItem.settings.printerData.printParams.codepage == null){ deviceItem.settings.printerData.printParams.codepage = "0" } }catch(err){ } try{ var connection = deviceItem.settings.printerData.connectionParams.usb; }catch(err){ } app.print.protocols[deviceItem.settings.connectionParams.printerProtocol]({ uaprro_xReport:true, info:{ date: cdate[2] +"-"+ cdate[1] +"-"+ cdate[0], time: thisbasket.info.time, type: "check", rroNum:rroSerialNum, companyName:fiscalSettings.uaprroORGNM, pointAdress:fiscalSettings.uaprroPOINTADDR, pointName:fiscalSettings.uaprroPOINTNM, IPN:fiscalSettings.uaprroIPN, IID:fiscalSettings.uaprroTIN, //cashRegisterNum:cashRegisterNum }, printer:{ buffer: deviceItem.settings.printerData.printParams.buffer != null ? deviceItem.settings.printerData.printParams.buffer : "", charset: deviceItem.settings.printerData.printParams.charset, checks: "3", data: '{"chineseOff":"0","systemPrinter":"'+systemPrinterValue+'"}', feed: deviceItem.settings.printerData.indents.feedBottom, fontsize: deviceItem.settings.printerData.sizes.font, ip: ipAdress, mac:macAdress, //logo: logotype, connection:connection, manufacturer: "other", parallel: deviceItem.settings.printerData.printParams.parallel, mode: String(deviceItem.settings.printerData.printParams.printMode), protocol: deviceItem.settings.connectionParams.printerProtocol, size: deviceItem.settings.printerData.sizes.size, width:deviceItem.settings.printerData.sizes.width, header: deviceItem.settings.printerData.additionalPrintParams.header, footer: deviceItem.settings.printerData.additionalPrintParams.footer, systemPrinter: systemPrinterValue, type: "printer", codepage: deviceItem.settings.printerData.printParams.codepage }, xReport:res.Totals }); app.main.loader("hide") resolve(res) }else{ alert("Нет активной смены"); app.main.loader("hide") reject(); } // запрос по всем чекам за день и запрос на сервак по чекам if (content.status == "empty") { app.main.error(lang["empty"]); console.log('WTF') }; }).catch(function(e) { }); }).catch(function (err) { reject(err) }) }) // }).catch(function (err) { reject(err) }) });// запрос по сменам конец }).catch(function (err) { reject(err) }) }) }).catch(function (err) { reject(err) }) }); }); }, ZReport: function(data) { //TODO5 var fiscalSettings = data.printer.settings.fiscalSettings var deviceItem = data.printer; var cdate = data.info.date.split('-'); var $this = this; function getCurrentDate() { var d = new Date(); var dd = d.getDate(); if (dd < 10) dd = '0' + dd; var mm = d.getMonth() + 1; if (mm < 10) mm = '0' + mm; var yy = d.getFullYear(); return dd + '' + mm + '' + yy; } function getCurrentTime() { var d = new Date() var hh = d.getHours(); if (hh < 10) hh = '0' + hh; var mm = d.getMinutes(); if (mm < 10) mm = '0' + mm; var ss = d.getSeconds(); if (ss < 10) ss = '0' + ss; return hh + '' + mm + '' + ss; } var userid = data.info.user; var rroSerialNum = fiscalSettings.uaprroCASHREGISTERNUM; return new Promise(function (resolve, reject) { $this.ql.subscribe(JSON.stringify({ Command: "TransactionsRegistrarState", NumFiscal: rroSerialNum }), userid).then(function (signed) { $this.ExecuteCommand("cmd", signed).then(function (ereceiptStatus) { $this.ql.subscribe(JSON.stringify({ Command: "LastShiftTotals", NumFiscal: rroSerialNum }), userid).then(function (signed) { $this.ExecuteCommand("cmd", signed).then(function (res) { var OpenedSmena = res.Opened; console.log("res",res) var resRes = res; //Если смена не закрыта if(res.ShiftState == 1){ //Если Z отчет не сдан if(res.ZRepPresent == false){ //Если есть информация //Костыльчики что бы закрыть пустую смену if(res.Totals == null){ res.Totals = { Real:{ Sum:"0", OrdersCount:"0", }, ServiceInput:"0", ServiceOutput:"0", } }else{ if(res.Totals.Real == null){ res.Totals.Real = { Sum:"0", OrdersCount:"0", } } } var xw = new XMLWriter('windows-1251'); xw.writeStartDocument(); xw.writeStartElement('ZREP'); xw.writeAttributeString('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance'); xw.writeAttributeString('xsi:noNamespaceSchemaLocation', 'zrep01.xsd'); xw.writeStartElement('ZREPHEAD'); //Унікальний ідентифікатор документа (GUID) xw.writeElementString('UID', app.print.modules.guid())//.writeEndElement(); xw.writeElementString('TIN', fiscalSettings.uaprroTIN); //certData.DRFO if(fiscalSettings.uaprroIPN != "" && fiscalSettings.uaprroIPN != null){ xw.writeElementString('IPN', fiscalSettings.uaprroIPN); } //Наименование продавца (256 символов) xw.writeElementString('ORGNM', fiscalSettings.uaprroORGNM)//.writeEndElement(); //Наименование точки продаж (256 символов, обязательный) xw.writeElementString('POINTNM', fiscalSettings.uaprroPOINTNM)//.writeEndElement(); xw.writeElementString('POINTADDR', fiscalSettings.uaprroPOINTADDR); //Дата операции (ддммгггг, обязательный) xw.writeElementString('ORDERDATE', getCurrentDate())//.writeEndElement(); //Время операции (ччммсс, обязательный) xw.writeElementString('ORDERTIME', getCurrentTime())//.writeEndElement(); //Порядковый номер документа (128 символов, обязательный) var tempLocalNum = ereceiptStatus.NextLocalNum var NextLocalNum = tempLocalNum.toString(); xw.writeElementString('ORDERNUM', NextLocalNum)//.writeEndElement(); //Номер кассы (64 символа, обязательный) xw.writeElementString('CASHDESKNUM', fiscalSettings.uaprroCASHDESKNUM)//.writeEndElement(); //Фискальный номер регистратора расчётных операций (128 символов, необязательный) xw.writeElementString('CASHREGISTERNUM', rroSerialNum)//.writeEndElement(); //Версия документа (Числовой) xw.writeElementString('VER', '1')//.writeEndElement(); if(localStorage.prroTesting) { xw.writeElementString('TESTING', "true"); } xw.writeEndElement(); //ZREPHEAD END //Підсумки реалізації xw.writeStartElement('ZREPREALIZ'); //Загальна сума реалізації xw.writeElementString('SUM', CurrencyFormatted(res.Totals.Real.Sum)); //Кількість чеків xw.writeElementString('ORDERSCNT', String(res.Totals.Real.OrdersCount)); if (res.Totals.Real.TotalCurrencyCost > 0) { xw.writeElementString('TOTALCURRENCYCOST', String(res.Totals.Real.TotalCurrencyCost)); xw.writeElementString('TOTALCURRENCYCOMMISSION', CurrencyFormatted(res.Totals.Real.TotalCurrencyCommission)); } try{ if(res.Totals.Real.PayForm.length > 0){ //Підсумки по формам оплати xw.writeStartElement('PAYFORMS'); var ccc = 1; for(var keiii in res.Totals.Real.PayForm){ var payitem = res.Totals.Real.PayForm[keiii]; if (payitem.Sum != null) { xw.writeStartElement('ROW').writeAttributeString('ROWNUM', String(ccc)); //0 – Готівка, 1 – Банківська картка xw.writeElementString('PAYFORMCD', String(payitem.PayFormCode)); //Найменування форми оплати xw.writeElementString('PAYFORMNM', payitem.PayFormName); //Сума оплати xw.writeElementString('SUM', CurrencyFormatted(payitem.Sum)); xw.writeEndElement(); //ROW END } ccc++; } xw.writeEndElement(); //PAYFORMS END } }catch(err){ } console.error("test",res.Totals.Real) try{ if(res.Totals.Real.Tax.length > 0 && res.Totals.Real.Tax != null){ //Податки/Збори xw.writeStartElement('TAXES'); try { var taxcounter = 1; for (var key in res.Totals.Real.Tax) { var taxitem = res.Totals.Real.Tax[key]; xw.writeStartElement('ROW').writeAttributeString('ROWNUM', String(taxcounter)); //Код виду податку/збору (числовий): //0-ПДВ,1-Акциз,2-ПФ... xw.writeElementString('TYPE', String(taxitem.Type)); //Найменування виду податку/збору (64 символи) xw.writeElementString('NAME', String(taxitem.Name)); //Літерне позначення виду і ставки податку/збору (А,Б,В,Г,...) (1 символ) xw.writeElementString('LETTER', String(taxitem.Letter)); //Відсоток податку/збору (15.2 цифри) xw.writeElementString('PRC', CurrencyFormatted(taxitem.Prc)); //Відсоток податку/збору (15.2 цифри) xw.writeElementString('SIGN', String(taxitem.Sign)); //Сума для розрахування податку/збору (15.2 цифри) xw.writeElementString('TURNOVER', CurrencyFormatted(taxitem.Turnover)); //var taxsum = app.main.sum(prro_userdata.taxes[taxitem.value], -(round(prro_userdata.taxes[taxitem.value], 10) * 100) / round(round(taxitem.percent, 10) + 100, 10)) try{ if(taxitem.SourceSum){ xw.writeElementString('SOURCESUM', CurrencyFormatted(taxitem.SourceSum)); } }catch(err){ console.log("в текущей смене не было продаж со сдвоенным налогом") } xw.writeElementString('SUM', CurrencyFormatted(taxitem.Sum)); xw.writeEndElement(); taxcounter++; } } catch (err) { console.error(err); } xw.writeEndElement(); //TAXES END } }catch(err){ } xw.writeEndElement(); //ZREPREALIZ END if(res.Totals.Ret != null){ //Підсумки повернення xw.writeStartElement('ZREPRETURN'); //Загальна сума повернення xw.writeElementString('SUM', CurrencyFormatted(res.Totals.Ret.Sum)); //Кількість чеків повернення xw.writeElementString('ORDERSCNT', String(res.Totals.Ret.OrdersCount)); //Підсумки по формам оплати //Підсумки по формам оплати try{ if(res.Totals.Ret.PayForm.length > 0){ xw.writeStartElement('PAYFORMS'); var ccc2 = 1; for(var keiii1 in res.Totals.Ret.PayForm){ var payitem = res.Totals.Ret.PayForm[keiii1]; if (payitem.Sum != null) { xw.writeStartElement('ROW').writeAttributeString('ROWNUM', String(ccc2)); //0 – Готівка, 1 – Банківська картка xw.writeElementString('PAYFORMCD', String(payitem.PayFormCode)); //Найменування форми оплати xw.writeElementString('PAYFORMNM', payitem.PayFormName); //Сума оплати xw.writeElementString('SUM', CurrencyFormatted(payitem.Sum)); xw.writeEndElement(); //ROW END } ccc2++; } xw.writeEndElement(); //PAYFORMS END } }catch(err){ } try { if(res.Totals.Ret.Tax.length > 0 && res.Totals.Ret.Tax != null){ //Податки/Збори //Податки/Збори xw.writeStartElement('TAXES'); var taxcounter1 = 1; for (var key3 in res.Totals.Ret.Tax) { var taxitem = res.Totals.Ret.Tax[key3]; xw.writeStartElement('ROW').writeAttributeString('ROWNUM', String(taxcounter1)); //Код виду податку/збору (числовий): //0-ПДВ,1-Акциз,2-ПФ... xw.writeElementString('TYPE', String(taxitem.Type)); //Найменування виду податку/збору (64 символи) xw.writeElementString('NAME', String(taxitem.Name)); //Літерне позначення виду і ставки податку/збору (А,Б,В,Г,...) (1 символ) xw.writeElementString('LETTER', String(taxitem.Letter)); //Відсоток податку/збору (15.2 цифри) xw.writeElementString('PRC', CurrencyFormatted(taxitem.Prc)); //Відсоток податку/збору (15.2 цифри) xw.writeElementString('SIGN', String(taxitem.Sign)); //Сума для розрахування податку/збору (15.2 цифри) xw.writeElementString('TURNOVER', CurrencyFormatted(taxitem.Turnover)); try{ if(taxitem.SourceSum){ xw.writeElementString('SOURCESUM', CurrencyFormatted(taxitem.SourceSum)); } }catch(err){ console.log("в текущей смене не было продаж со сдвоенным налогом") } xw.writeElementString('SUM', CurrencyFormatted(taxitem.Sum)); xw.writeEndElement(); taxcounter1++; } xw.writeEndElement(); //TAXES END } } catch (err) { console.error(err); } xw.writeEndElement(); //ZREPRETURN END } try{ //Підсумки видачі готівки if(res.Totals.Cash.OrdersCount > 0){ xw.writeStartElement('ZREPCASH'); //Загальна сума (15.2 цифри) xw.writeElementString('SUM', CurrencyFormatted(res.Totals.Cash.Sum)); //Сума комісії (15.2 цифри) xw.writeElementString('COMMISSION', CurrencyFormatted(res.Totals.Cash.Commission)); //Кількість чеків (числовий) xw.writeElementString('ORDERSCNT', String(res.Totals.Cash.OrdersCount)); xw.writeEndElement(); //ZREPCASH END } }catch(err){ } /* xw.writeStartElement('ZREPVAL'); xw.writeElementString('TOTALINADVANCE', CurrencyFormatted(100)); xw.writeElementString('TOTALINATTACH', CurrencyFormatted(100)); xw.writeElementString('TOTALSURRCOLLECTION', CurrencyFormatted(100)); xw.writeElementString('CALCDOCSCNT', "1"); xw.writeElementString('COMMISSIONN', CurrencyFormatted(100)); xw.writeElementString('TRANSFERSCNT', "1"); xw.writeEndElement(); */ //Підсумки xw.writeStartElement('ZREPBODY'); //Службовий внесок xw.writeElementString('SERVICEINPUT', CurrencyFormatted(round(res.Totals.ServiceInput, 2))); //Службова видача xw.writeElementString('SERVICEOUTPUT', CurrencyFormatted(round(res.Totals.ServiceOutput, 2))); xw.writeEndElement(); //ZREPBODY END xw.writeEndElement(); var xml = xw.flush(); xw.close(); //clean the writer xw = undefined; //don't let visitors use it, it's closed console.log("ZZZZZ", xml); var zXML = xml; $this.ql.subscribe(xml, userid).then(function (signed) { console.log("signed", signed) /////ТУТ БЫЛ ЗАПРОС $this.ExecuteCommand("doc", signed).then(function (res) { $this.ql.getUserECPData(userid).then(function (certData) { console.log("certData", certData) console.warn('res>>> ') var xw = new XMLWriter('windows-1251'); xw.writeStartDocument(); xw.writeStartElement('CHECK'); xw.writeAttributeString('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance'); xw.writeAttributeString('xsi:noNamespaceSchemaLocation', 'check01.xsd'); xw.writeStartElement('CHECKHEAD'); //0-Чек реалізації товарів/послуг, 1-Чек переказу коштів, 2–Чек операції обміну валюти, 3-Чек видачі готівки, 100-Відкриття зміни, 101-Закриття зміни, 102-Початок офлайн сесії, 103-Завершення офлайн сесії xw.writeElementString('DOCTYPE', '101'); //Унікальний ідентифікатор документа (GUID) xw.writeElementString('UID', app.print.modules.guid())//.writeEndElement(); xw.writeElementString('TIN', fiscalSettings.uaprroTIN); //certData.DRFO if(fiscalSettings.uaprroIPN != "" && fiscalSettings.uaprroIPN != null){ xw.writeElementString('IPN', fiscalSettings.uaprroIPN); } if (certData.EDRPOU != null && certData.EDRPOU != '') { //ЕДРПОУ/ДРФО/№ паспорта продавца (10 символов, обязательный) //xw.writeElementString('TIN', certData.EDRPOU); //certData.DRFO } if (certData.EDRPOU != null && certData.EDRPOU != '') { //ИНН продавца (12 символов, необязательный) //xw.writeElementString('IPN', certData.EDRPOU); //fiscalSettings.uaprroIPN } //Наименование продавца (256 символов) xw.writeElementString('ORGNM', fiscalSettings.uaprroORGNM)//.writeEndElement(); //Наименование точки продаж (256 символов, обязательный) xw.writeElementString('POINTNM', fiscalSettings.uaprroPOINTNM)//.writeEndElement(); //Адрес точки продаж (256 символов, обязательный) xw.writeElementString('POINTADDR', fiscalSettings.uaprroPOINTADDR)//.writeEndElement(); //Дата операции (ддммгггг, обязательный) xw.writeElementString('ORDERDATE', getCurrentDate())//.writeEndElement(); //Время операции (ччммсс, обязательный) xw.writeElementString('ORDERTIME', getCurrentTime())//.writeEndElement(); //Порядковый номер документа (128 символов, обязательный) var tempLocalNum = ereceiptStatus.NextLocalNum + 1 var NextLocalNum = tempLocalNum.toString(); xw.writeElementString('ORDERNUM', NextLocalNum)//.writeEndElement(); //Номер кассы (64 символа, обязательный) xw.writeElementString('CASHDESKNUM', fiscalSettings.uaprroCASHDESKNUM)//.writeEndElement(); //Фискальный номер регистратора расчётных операций (128 символов, необязательный) xw.writeElementString('CASHREGISTERNUM', rroSerialNum)//.writeEndElement(); //ФИО кассира (128 символов, обязательный) var cashierName = "Касир"; try{ cashierName = certData.commonName; //preload.users[currentsklad][userid]["user_name"] }catch(err){ } xw.writeElementString('CASHIER', cashierName)//.writeEndElement(); //Версия документа (Числовой) xw.writeElementString('VER', '1')//.writeEndElement(); //Фискальный номер документа (128 символов, необязательный) //xw.writeElementString('ORDERTAXNUM', '101234567890123')//.writeEndElement(); if(localStorage.prroTesting) { xw.writeElementString('TESTING', "true"); } xw.writeEndElement(); xw.writeEndElement(); var xml = xw.flush(); xw.close(); //clean the writer xw = undefined; //don't let visitors use it, it's closed console.log(xml); try { //Хрень чисто для отладки var xmlDOM = new DOMParser().parseFromString(xml, 'text/xml'); console.log("xml", xml2json(xmlDOM)); $this.ql.subscribe(xml, userid).then(function (signed) { console.log("signed", signed) /////ТУТ БЫЛ ЗАПРОС $this.ExecuteCommand("doc", signed).then(function (res) { //Зачищаем данные о текущей смене prro_userdata = { salesum:0, salecount:0, cash:null, electron:null, taxes:{}, taxespay:{}, serviceInput:0, serviceOutput:0, totalCurrencyCost:0, totalCurrencyCommission:0, returncount:0, returnsum:0, returnElectron:null, returnCash:null, returnTaxes:{}, }; try { //Записываем в памяьб localStorage["currentShift"] = JSON.stringify(prro_userdata); } catch (err) { } try { console.log('res >><< res ', res) resRes.Totals.ThisShift = { "Opened":OpenedSmena }; } catch(err) { console.log(err); } try { var closeTime = function() { var d = new Date(); var yy = d.getFullYear(); var mm = d.getMonth(); var dd = d.getDate(); var hh = d.getHours(); var min = d.getMinutes(); var ss = d.getSeconds(); var mmm = (mm + 1) < 10 ? '0' + (mm + 1) : mm + 1; var ddd = dd < 10 ? '0' + dd : dd; var hhh = hh < 10 ? '0' + hh : hh; var minMin = min < 10 ? '0' + min : min; var sss = ss < 10 ? '0' + ss : ss ; return yy + '-' + mmm + '-' + ddd + ' ' + hhh + ':' + minMin + ':' + sss; } console.warn('closeTime()', closeTime()); resRes.Totals.closeTime = closeTime(); } catch(err) { console.log(err); } // try { // resRes.Totals.fsNum = res.dfsresult.ORDERTAXNUM; // resRes.Totals.localNum = res.dfsresult.ORDERNUM; // } catch(err) { // } try { console.warn('res>>', res) console.warn('aaaaaaaaa>>>>>>>>>>>>>>>>>>>', fiscalSettings) try{ var systemPrinterValue = deviceItem.settings.printerData.connectionParams.systemPrinter; }catch(err){ var systemPrinterValue = ""; } try{ var ipAdress = deviceItem.settings.printerData.connectionParams.ip; }catch(err){ var ipAdress = ""; } try{ var macAdress = deviceItem.settings.printerData.connectionParams.mac; }catch(err){ var macAdress = ""; } try{ if(deviceItem.settings.printerData.printParams.codepage == null){ deviceItem.settings.printerData.printParams.codepage = "0" } }catch(err){ } try{ var connection = deviceItem.settings.printerData.connectionParams.usb; }catch(err){ } app.print.protocols[deviceItem.settings.connectionParams.printerProtocol]({ uaprro_zReport:true, info:{ date: cdate[2] +"-"+ cdate[1] +"-"+ cdate[0], time: data.info.time, type: "check", rroNum:rroSerialNum, companyName:fiscalSettings.uaprroORGNM, pointAdress:fiscalSettings.uaprroPOINTADDR, pointName:fiscalSettings.uaprroPOINTNM, IPN:fiscalSettings.uaprroIPN, IID:fiscalSettings.uaprroTIN, CASHDESKNUM:fiscalSettings.uaprroCASHDESKNUM, fsNum: res.dfsresult.TICKET.ORDERTAXNUM, localNum: res.dfsresult.TICKET.ORDERNUM //cashRegisterNum:cashRegisterNum }, printer:{ buffer: deviceItem.settings.printerData.printParams.buffer != null ? deviceItem.settings.printerData.printParams.buffer : "", charset: deviceItem.settings.printerData.printParams.charset, checks: "3", data: '{"chineseOff":"0","systemPrinter":"'+systemPrinterValue+'"}', feed: deviceItem.settings.printerData.indents.feedBottom, fontsize: deviceItem.settings.printerData.sizes.font, ip: ipAdress, mac:macAdress, //logo: logotype, connection:connection, manufacturer: "other", parallel: deviceItem.settings.printerData.printParams.parallel, mode: String(deviceItem.settings.printerData.printParams.printMode), protocol: deviceItem.settings.connectionParams.printerProtocol, size: deviceItem.settings.printerData.sizes.size, width:deviceItem.settings.printerData.sizes.width, header: deviceItem.settings.printerData.additionalPrintParams.header, footer: deviceItem.settings.printerData.additionalPrintParams.footer, systemPrinter: systemPrinterValue, type: "printer", codepage: deviceItem.settings.printerData.printParams.codepage }, zReport: resRes.Totals }); } catch(err) { console.warn(err) } var zXMLDOM = new DOMParser().parseFromString(zXML, 'text/xml'); var xmlDOM = new DOMParser().parseFromString(xml, 'text/xml'); var checkJson = xml2json(xmlDOM); var zChekJson = xml2json(zXMLDOM) var objPrint = { zChekJson: zChekJson, checkJson: checkJson, answear: res } resolve(objPrint) }).catch(function (err) { reject(err) }) }) } catch (err) { console.error(err) } }) }).catch(function (err) { reject(err) }) }) }else{ // alert("Z отчет сдан, смена не закрыта, пытаемся закрыть смену"); $this.ql.getUserECPData(userid).then(function (certData) { console.log("certData", certData) var xw = new XMLWriter('windows-1251'); xw.writeStartDocument(); xw.writeStartElement('CHECK'); xw.writeAttributeString('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance'); xw.writeAttributeString('xsi:noNamespaceSchemaLocation', 'check01.xsd'); xw.writeStartElement('CHECKHEAD'); //0-Чек реалізації товарів/послуг, 1-Чек переказу коштів, 2–Чек операції обміну валюти, 3-Чек видачі готівки, 100-Відкриття зміни, 101-Закриття зміни, 102-Початок офлайн сесії, 103-Завершення офлайн сесії xw.writeElementString('DOCTYPE', '101'); //Унікальний ідентифікатор документа (GUID) xw.writeElementString('UID', app.print.modules.guid())//.writeEndElement(); xw.writeElementString('TIN', fiscalSettings.uaprroTIN); //certData.DRFO if(fiscalSettings.uaprroIPN != "" && fiscalSettings.uaprroIPN != null){ xw.writeElementString('IPN', fiscalSettings.uaprroIPN); } if (certData.EDRPOU != null && certData.EDRPOU != '') { //ЕДРПОУ/ДРФО/№ паспорта продавца (10 символов, обязательный) //xw.writeElementString('TIN', certData.EDRPOU); //certData.DRFO } if (certData.EDRPOU != null && certData.EDRPOU != '') { //ИНН продавца (12 символов, необязательный) //xw.writeElementString('IPN', certData.EDRPOU); //fiscalSettings.uaprroIPN } //Наименование продавца (256 символов) xw.writeElementString('ORGNM', fiscalSettings.uaprroORGNM)//.writeEndElement(); //Наименование точки продаж (256 символов, обязательный) xw.writeElementString('POINTNM', fiscalSettings.uaprroPOINTNM)//.writeEndElement(); //Адрес точки продаж (256 символов, обязательный) xw.writeElementString('POINTADDR', fiscalSettings.uaprroPOINTADDR)//.writeEndElement(); //Дата операции (ддммгггг, обязательный) xw.writeElementString('ORDERDATE', getCurrentDate())//.writeEndElement(); //Время операции (ччммсс, обязательный) xw.writeElementString('ORDERTIME', getCurrentTime())//.writeEndElement(); //Порядковый номер документа (128 символов, обязательный) var tempLocalNum = ereceiptStatus.NextLocalNum //+ 1 var NextLocalNum = tempLocalNum.toString(); xw.writeElementString('ORDERNUM', NextLocalNum)//.writeEndElement(); //Номер кассы (64 символа, обязательный) xw.writeElementString('CASHDESKNUM', fiscalSettings.uaprroCASHDESKNUM)//.writeEndElement(); //Фискальный номер регистратора расчётных операций (128 символов, необязательный) xw.writeElementString('CASHREGISTERNUM', rroSerialNum)//.writeEndElement(); //ФИО кассира (128 символов, обязательный) var cashierName = "Касир"; try{ cashierName = certData.commonName; //preload.users[currentsklad][userid]["user_name"] }catch(err){ } xw.writeElementString('CASHIER', cashierName)//.writeEndElement(); //Версия документа (Числовой) xw.writeElementString('VER', '1')//.writeEndElement(); //Фискальный номер документа (128 символов, необязательный) //xw.writeElementString('ORDERTAXNUM', '101234567890123')//.writeEndElement(); if(localStorage.prroTesting) { xw.writeElementString('TESTING', "true"); } xw.writeEndElement(); xw.writeEndElement(); var xml = xw.flush(); xw.close(); //clean the writer xw = undefined; //don't let visitors use it, it's closed console.log(xml); try { //Хрень чисто для отладки var xmlDOM = new DOMParser().parseFromString(xml, 'text/xml'); console.log("xml", xml2json(xmlDOM)); $this.ql.subscribe(xml, userid).then(function (signed) { console.log("signed", signed) /////ТУТ БЫЛ ЗАПРОС $this.ExecuteCommand("doc", signed).then(function (res) { //Зачищаем данные о текущей смене prro_userdata = { salesum:0, salecount:0, cash:null, electron:null, taxes:{}, taxespay:{}, serviceInput:0, serviceOutput:0, totalCurrencyCost:0, totalCurrencyCommission:0, returncount:0, returnsum:0, returnElectron:null, returnCash:null, returnTaxes:{}, }; try { //Записываем в памяьб localStorage["currentShift"] = JSON.stringify(prro_userdata); } catch (err) { } console.warn('lol ahahaha', res); resolve(res) }).catch(function (err) { reject(err) }) }) } catch (err) { console.error(err) } }) } }else{ alert("Смена уже закрыта"); reject(); } }).catch(function (err) { reject(err) }) }); }).catch(function (err) { reject(err) }) }); }); }, introduction: function(thisbasket) { console.log("thisbasket introduction!!!!!!!!!!!!!>>>>>>>!!!!!!!!", thisbasket) var deviceItem = thisbasket.printer; //var fiscalSettings = deviceItem.settings.fiscalSettings; //TODO5 var tradepoint_id = deviceItem.sklad; var tradepoint = preload.sklad[tradepoint_id]; var tradepointName = tradepoint.title; var tradepointAddr = tradepoint.adress; try{ var logotype = deviceItem.settings.printerData.printParams.additionalPrintParams.logo; }catch(err){ var logotype = ""; } console.warn(thisbasket.info) var $this = this; app.main.loader("show"); var rroSerialNum = fiscalSettings.uaprroCASHREGISTERNUM; return new Promise(function (resolve, reject) { setTimeout(function (thisbasket) { //Этот костыль нужен для того чтобы запустить спинер var userid = thisbasket.info.user; //Извлекаем информацию из сертификата $this.ql.getUserECPData(userid).then(function (certData) { //console.warn("certData", certData); //Подписываем документ получения статуса РРО $this.ql.subscribe(JSON.stringify({ Command: "TransactionsRegistrarState", NumFiscal: rroSerialNum }), userid).then(function (signed) { //Отправляем документ получения статуса РРО $this.ExecuteCommand("cmd", signed).then(function (ereceiptStatus) { console.log("ereceiptStatus", ereceiptStatus) //Если смена открыта if (ereceiptStatus.ShiftState == 1) { //Создаем документ продажи var xw = new XMLWriter('windows-1251'); xw.writeStartDocument(); xw.writeStartElement('CHECK').writeAttributeString('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance').writeAttributeString('xsi:noNamespaceSchemaLocation', 'check01.xsd'); xw.writeStartElement('CHECKHEAD'); //Тип документа(Числовой, обязательный): 0-Фіскальний чек, 1-Відкриття зміни, 2-Закриття зміни xw.writeElementString('DOCTYPE', '0'); //Расширенный тип документа(Числовой, обязательный) //Для DOCTYPE=0: 0-Касовий чек на товари (послуги), 1-Видатковий чек, 2-Чек операції «службове внесення», 3-Чек операції «службова видача»--> //Для DOCTYPE!=0: 0 xw.writeElementString('DOCSUBTYPE', '2'); //Уникальный идентификатор документа (GUID, обязательный) xw.writeElementString('UID', app.print.modules.guid()); if (fiscalSettings.uaprroTIN != '') { //ЕДРПОУ/ДРФО/№ паспорта продавца (10 символов, обязательный) xw.writeElementString('TIN', fiscalSettings.uaprroTIN); } else if (certData.DRFO != '' && certData.DRFO != null) { //ЕДРПОУ/ДРФО/№ паспорта продавца (10 символов, обязательный) xw.writeElementString('TIN', certData.DRFO); } if (fiscalSettings.uaprroIPN != '' && fiscalSettings.uaprroIPN != null) { //ИНН продавца (12 символов, необязательный) xw.writeElementString('IPN', fiscalSettings.uaprroIPN); } else if (certData.DRFO != '' && certData.DRFO != null) { //ИНН продавца (12 символов, необязательный) //xw.writeElementString('IPN', certData.DRFO); } if (fiscalSettings.uaprroORGNM != "") { //Наименование продавца (256 символов, обязательный) xw.writeElementString('ORGNM', fiscalSettings.uaprroORGNM); //preload.settings.companyname } else if (preload.settings.companyname != '') { //Наименование продавца (256 символов, обязательный) xw.writeElementString('ORGNM', preload.settings.companyname); //preload.settings.companyname } else { alert("Не вказано найменування організації"); } if (fiscalSettings.uaprroPOINTNM != '') { //Наименование точки продаж (256 символов, обязательный) xw.writeElementString('POINTNM', fiscalSettings.uaprroPOINTNM); } else if (tradepointName != '') { //Наименование точки продаж (256 символов, обязательный) xw.writeElementString('POINTNM', tradepointName); } else { alert("Не вказано найменування точки продаж"); } if (fiscalSettings.uaprroPOINTADDR != '') { //Адрес точки продаж (256 символов, обязательный) xw.writeElementString('POINTADDR', fiscalSettings.uaprroPOINTADDR); } else if (tradepointAddr != '') { //Адрес точки продаж (256 символов, обязательный) xw.writeElementString('POINTADDR', tradepointAddr); } else { alert("Не вказано адресу торгової точки"); } //Дата операции (ддммгггг, обязательный) xw.writeElementString('ORDERDATE', (function () { var d = new Date(); var dd = d.getDate(); if (dd < 10) dd = '0' + dd; var mm = d.getMonth() + 1; if (mm < 10) mm = '0' + mm; var yy = d.getFullYear(); return dd + '' + mm + '' + yy; })()); //Время операции (ччммсс, обязательный) xw.writeElementString('ORDERTIME', (function () { var d = new Date() var hh = d.getHours(); if (hh < 10) hh = '0' + hh; var mm = d.getMinutes(); if (mm < 10) mm = '0' + mm; var ss = d.getSeconds(); if (ss < 10) ss = '0' + ss; return hh + '' + mm + '' + ss; })()); //Порядковый номер документа (128 символов, обязательный) xw.writeElementString('ORDERNUM', String(ereceiptStatus.NextLocalNum)); //Фискальный номер документа (128 символов, необязательный) //xw.writeElementString('ORDERTAXNUM', '101234567890123'); //Номер кассы (64 символа, обязательный) if (fiscalSettings.uaprroCASHDESKNUM == null || fiscalSettings.uaprroCASHDESKNUM == '') { alert("Не вказано порядковий номер каси"); } xw.writeElementString('CASHDESKNUM', fiscalSettings.uaprroCASHDESKNUM); if (rroSerialNum == null || rroSerialNum == '') { alert("Не вказано фіскальний номер каси"); } //Фискальный номер регистратора расчётных операций (128 символов, необязательный) xw.writeElementString('CASHREGISTERNUM', rroSerialNum); //ФИО кассира (128 символов, обязательный) var cashierName = "Касир"; try{ cashierName = certData.commonName; //preload.users[currentsklad][userid]["user_name"] }catch(err){ } xw.writeElementString('CASHIER', cashierName); // certData.commonName //Версия документа (Числовой, обязательный) xw.writeElementString('VER', '1'); if(localStorage.prroTesting) { xw.writeElementString('TESTING', 'true'); } xw.writeEndElement(); //Підсумок по чеку xw.writeStartElement('CHECKTOTAL'); //Загальна сума (15.2 цифри) xw.writeElementString('SUM', CurrencyFormatted(thisbasket.cash)); xw.writeEndElement(); var xml = xw.flush(); xw.close(); //clean the writer xw = undefined; //don't let visitors use it, it's closed //console.log("xml", xml); try { //Хрень чисто для отладки //var xmlDOM = new DOMParser().parseFromString(xml, 'text/xml'); //console.log("xml", xml2json(xmlDOM)); } catch (err) { } //Подписываем чек продажи $this.ql.subscribe(xml, userid).then(function (signed) { console.log("signed",signed) /////ТУТ БЫЛ ЗАПРОС //Отправляем чек продажи $this.ExecuteCommand("doc", signed).then(function (res) { //Если прошло успешно то записываем инфу о том что суммы поменялись (нужно для закытия смены) try { //Загальна сума внесення prro_userdata.serviceInput += round(thisbasket["cash"], 2) } catch (err) { console.error(err); } try { //Записываем в памяьб localStorage["currentShift"] = JSON.stringify(prro_userdata); } catch (err) { } try { var dateP = new Date(); var yyP = dateP.getFullYear(); var mmP = dateP.getMonth(); var ddP = dateP.getDate(); var hhP = dateP.getHours(); var minP = dateP.getMinutes(); var ssP = dateP.getSeconds(); var dddP = ddP < 10 ? '0' + ddP : ddP; var mmmP = (mmP + 1) < 10 ? '0' + (mmP + 1) : mmP + 1; var hhhP = hhP < 10 ? '0' + hhP : hhP; var minMinP = minP < 10 ? '0' + minP : minP; var sssP = ssP < 10 ? '0' + ssP : ssP; try{ var systemPrinterValue = deviceItem.settings.printerData.connectionParams.systemPrinter; }catch(err){ var systemPrinterValue = ""; } try{ var ipAdress = deviceItem.settings.printerData.connectionParams.ip; }catch(err){ var ipAdress = ""; } try{ var macAdress = deviceItem.settings.printerData.connectionParams.mac; }catch(err){ var macAdress = ""; } try{ if(deviceItem.settings.printerData.printParams.codepage == null){ deviceItem.settings.printerData.printParams.codepage = "0" } }catch(err){ } try{ var connection = deviceItem.settings.printerData.connectionParams.usb; }catch(err){ } app.print.protocols[deviceItem.settings.connectionParams.printerProtocol]({ uaprro_introduction:true, info:{ allcena: CurrencyFormatted(round(thisbasket.info.allcena, 2)), cash: thisbasket.info.cash > 0 ? CurrencyFormatted(round(thisbasket.info.cash, 2)) : "", date: dddP + '-' + mmmP + '-' + yyP, nall: thisbasket.info.nall > 0 ? CurrencyFormatted(round(thisbasket.info.nall, 2)) : "", sdacha: CurrencyFormatted(round(thisbasket.info.sdacha, 2)), //servicecash: "0", summ: CurrencyFormatted(round(thisbasket.info.summ, 2)), time: hhhP + '-' + minMinP + '-' + sssP, type: "check", visa: CurrencyFormatted(round(thisbasket.info.visa, 2)), fiscalNumber:res.dfsresult.TICKET.ORDERTAXNUM, rroNum:rroSerialNum, companyName:fiscalSettings.uaprroORGNM, pointAdress:fiscalSettings.uaprroPOINTADDR, pointName:fiscalSettings.uaprroPOINTNM, IPN:fiscalSettings.uaprroIPN, IID:fiscalSettings.uaprroTIN, cashRegisterNum:rroSerialNum, ORDERNUM: ereceiptStatus.NextLocalNum, CASHDESKNUM: fiscalSettings.uaprroCASHDESKNUM, comment: thisbasket.comments }, printer:{ buffer: deviceItem.settings.printerData.printParams.buffer != null ? deviceItem.settings.printerData.printParams.buffer : "", charset: deviceItem.settings.printerData.printParams.charset, checks: "3", data: '{"chineseOff":"0","systemPrinter":"'+systemPrinterValue+'"}', feed: deviceItem.settings.printerData.indents.feedBottom, fontsize: deviceItem.settings.printerData.sizes.font, ip: ipAdress, mac:macAdress, logo: logotype, manufacturer: "other", parallel: deviceItem.settings.printerData.printParams.parallel, connection: connection, mode: String(deviceItem.settings.printerData.printParams.printMode), protocol: deviceItem.settings.connectionParams.printerProtocol, size: deviceItem.settings.printerData.sizes.size, width:deviceItem.settings.printerData.sizes.width, header: deviceItem.settings.printerData.additionalPrintParams.header, footer: deviceItem.settings.printerData.additionalPrintParams.footer, systemPrinter: systemPrinterValue, type: "printer", codepage: deviceItem.settings.printerData.printParams.codepage }, ereceiptStatus: ereceiptStatus, ResPRRO: res, Summ: thisbasket.cash }); // console.warn('res', res); // resolve(res) } catch(err) { console.log('error>>>', err); } var xmlDOM = new DOMParser().parseFromString(xml, 'text/xml'); var checkJson = xml2json(xmlDOM); res.checkPRRO = checkJson; console.log('res aaaaaa', res); resolve(res) }).catch(function (err) { reject(err) }) }) } else { alert("Нет активной смены, откройте смену"); reject(); } }).catch(function (err) { reject(err) }) }) }).catch(function (err) { app.main.error(err); $this.ql.openUploadDialog(); }) }, 0, thisbasket); }) }, incasation: function(thisbasket) { console.log("thisbasket incasation>>>>", thisbasket) var deviceItem = thisbasket.printer; //TODO5 var fiscalSettings = deviceItem.settings.fiscalSettings; var tradepoint_id = deviceItem.sklad; var tradepoint = preload.sklad[tradepoint_id]; var tradepointName = tradepoint.title; var tradepointAddr = tradepoint.adress; try{ var logotype = deviceItem.settings.printerData.printParams.additionalPrintParams.logo; }catch(err){ var logotype = ""; } var $this = this; app.main.loader("show"); var rroSerialNum = fiscalSettings.uaprroCASHREGISTERNUM; return new Promise(function (resolve, reject) { setTimeout(function (thisbasket) { //Этот костыль нужен для того чтобы запустить спинер var userid = thisbasket.info.user; //Извлекаем информацию из сертификата $this.ql.getUserECPData(userid).then(function (certData) { //console.warn("certData", certData); //Подписываем документ получения статуса РРО $this.ql.subscribe(JSON.stringify({ Command: "TransactionsRegistrarState", NumFiscal: rroSerialNum }), userid).then(function (signed) { //Отправляем документ получения статуса РРО $this.ExecuteCommand("cmd", signed).then(function (ereceiptStatus) { console.log("ereceiptStatus", ereceiptStatus) //Если смена открыта if (ereceiptStatus.ShiftState == 1) { //Создаем документ продажи var xw = new XMLWriter('windows-1251'); xw.writeStartDocument(); xw.writeStartElement('CHECK').writeAttributeString('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance').writeAttributeString('xsi:noNamespaceSchemaLocation', 'check01.xsd'); xw.writeStartElement('CHECKHEAD'); //Тип документа(Числовой, обязательный): 0-Фіскальний чек, 1-Відкриття зміни, 2-Закриття зміни xw.writeElementString('DOCTYPE', '0'); //Расширенный тип документа(Числовой, обязательный) //Для DOCTYPE=0: 0-Касовий чек на товари (послуги), 1-Видатковий чек, 2-Чек операції «службове внесення», 3-Чек операції «службова видача»--> //Для DOCTYPE!=0: 0 xw.writeElementString('DOCSUBTYPE', '4'); //Уникальный идентификатор документа (GUID, обязательный) xw.writeElementString('UID', app.print.modules.guid()); if (fiscalSettings.uaprroTIN != '') { //ЕДРПОУ/ДРФО/№ паспорта продавца (10 символов, обязательный) xw.writeElementString('TIN', fiscalSettings.uaprroTIN); } else if (certData.DRFO != '' && certData.DRFO != null) { //ЕДРПОУ/ДРФО/№ паспорта продавца (10 символов, обязательный) xw.writeElementString('TIN', certData.DRFO); } if (fiscalSettings.uaprroIPN != '' && fiscalSettings.uaprroIPN != null) { //ИНН продавца (12 символов, необязательный) xw.writeElementString('IPN', fiscalSettings.uaprroIPN); } else if (certData.DRFO != '' && certData.DRFO != null) { //ИНН продавца (12 символов, необязательный) //xw.writeElementString('IPN', certData.DRFO); } if (fiscalSettings.uaprroORGNM != "") { //Наименование продавца (256 символов, обязательный) xw.writeElementString('ORGNM', fiscalSettings.uaprroORGNM); //preload.settings.companyname } else if (preload.settings.companyname != '') { //Наименование продавца (256 символов, обязательный) xw.writeElementString('ORGNM', preload.settings.companyname); //preload.settings.companyname } else { alert("Не вказано найменування організації"); } if (fiscalSettings.uaprroPOINTNM != '') { //Наименование точки продаж (256 символов, обязательный) xw.writeElementString('POINTNM', fiscalSettings.uaprroPOINTNM); } else if (tradepointName != '') { //Наименование точки продаж (256 символов, обязательный) xw.writeElementString('POINTNM', tradepointName); } else { alert("Не вказано найменування точки продаж"); } if (fiscalSettings.uaprroPOINTADDR != '') { //Адрес точки продаж (256 символов, обязательный) xw.writeElementString('POINTADDR', fiscalSettings.uaprroPOINTADDR); } else if (tradepointAddr != '') { //Адрес точки продаж (256 символов, обязательный) xw.writeElementString('POINTADDR', tradepointAddr); } else { alert("Не вказано адресу торгової точки"); } //Дата операции (ддммгггг, обязательный) xw.writeElementString('ORDERDATE', (function () { var d = new Date(); var dd = d.getDate(); if (dd < 10) dd = '0' + dd; var mm = d.getMonth() + 1; if (mm < 10) mm = '0' + mm; var yy = d.getFullYear(); return dd + '' + mm + '' + yy; })()); //Время операции (ччммсс, обязательный) xw.writeElementString('ORDERTIME', (function () { var d = new Date() var hh = d.getHours(); if (hh < 10) hh = '0' + hh; var mm = d.getMinutes(); if (mm < 10) mm = '0' + mm; var ss = d.getSeconds(); if (ss < 10) ss = '0' + ss; return hh + '' + mm + '' + ss; })()); //Порядковый номер документа (128 символов, обязательный) xw.writeElementString('ORDERNUM', String(ereceiptStatus.NextLocalNum)); //Фискальный номер документа (128 символов, необязательный) //xw.writeElementString('ORDERTAXNUM', '101234567890123'); //Номер кассы (64 символа, обязательный) if (fiscalSettings.uaprroCASHDESKNUM == null || fiscalSettings.uaprroCASHDESKNUM == '') { alert("Не вказано порядковий номер каси"); } xw.writeElementString('CASHDESKNUM', fiscalSettings.uaprroCASHDESKNUM); if (rroSerialNum == null || rroSerialNum == '') { alert("Не вказано фіскальний номер каси"); } //Фискальный номер регистратора расчётных операций (128 символов, необязательный) xw.writeElementString('CASHREGISTERNUM', rroSerialNum); //ФИО кассира (128 символов, обязательный) var cashierName = "Касир"; try{ cashierName = certData.commonName; //preload.users[currentsklad][userid]["user_name"] }catch(err){ } xw.writeElementString('CASHIER', cashierName); // certData.commonName //Версия документа (Числовой, обязательный) xw.writeElementString('VER', '1'); if(localStorage.prroTesting) { xw.writeElementString('TESTING', 'true'); } xw.writeEndElement(); //Підсумок по чеку xw.writeStartElement('CHECKTOTAL'); //Загальна сума (15.2 цифри) xw.writeElementString('SUM', CurrencyFormatted(thisbasket.cash)); xw.writeEndElement(); var xml = xw.flush(); xw.close(); //clean the writer xw = undefined; //don't let visitors use it, it's closed //console.log("xml", xml); try { //Хрень чисто для отладки //var xmlDOM = new DOMParser().parseFromString(xml, 'text/xml'); //console.log("xml", xml2json(xmlDOM)); } catch (err) { } //Подписываем чек продажи $this.ql.subscribe(xml, userid).then(function (signed) { //console.log("signed",signed) /////ТУТ БЫЛ ЗАПРОС //Отправляем чек продажи $this.ExecuteCommand("doc", signed).then(function (res) { //Если прошло успешно то записываем инфу о том что суммы поменялись (нужно для закытия смены) try { //Загальна сума внесення prro_userdata.serviceOutput += round(thisbasket["cash"], 2) } catch (err) { console.error(err); } try { //Записываем в памяьб localStorage["currentShift"] = JSON.stringify(prro_userdata); } catch (err) { } try { var dateP = new Date(); var yyP = dateP.getFullYear(); var mmP = dateP.getMonth(); var ddP = dateP.getDate(); var hhP = dateP.getHours(); var minP = dateP.getMinutes(); var ssP = dateP.getSeconds(); var dddP = ddP < 10 ? '0' + ddP : ddP; var mmmP = (mmP + 1) < 10 ? '0' + (mmP + 1) : mmP + 1; var hhhP = hhP < 10 ? '0' + hhP : hhP; var minMinP = minP < 10 ? '0' + minP : minP; var sssP = ssP < 10 ? '0' + ssP : ssP; try{ var systemPrinterValue = deviceItem.settings.printerData.connectionParams.systemPrinter; }catch(err){ var systemPrinterValue = ""; } try{ var ipAdress = deviceItem.settings.printerData.connectionParams.ip; }catch(err){ var ipAdress = ""; } try{ var macAdress = deviceItem.settings.printerData.connectionParams.mac; }catch(err){ var macAdress = ""; } try{ if(deviceItem.settings.printerData.printParams.codepage == null){ deviceItem.settings.printerData.printParams.codepage = "0" } }catch(err){ } try{ var connection = deviceItem.settings.printerData.connectionParams.usb; }catch(err){ } app.print.protocols[deviceItem.settings.connectionParams.printerProtocol]({ uaprro_incasation:true, info:{ allcena: CurrencyFormatted(round(thisbasket.info.allcena, 2)), cash: thisbasket.info.cash > 0 ? CurrencyFormatted(round(thisbasket.info.cash, 2)) : "", date: dddP + '-' + mmmP + '-' + yyP, nall: thisbasket.info.nall > 0 ? CurrencyFormatted(round(thisbasket.info.nall, 2)) : "", sdacha: CurrencyFormatted(round(thisbasket.info.sdacha, 2)), //servicecash: "0", summ: CurrencyFormatted(round(thisbasket.info.summ, 2)), time: hhhP + '-' + minMinP + '-' + sssP,//thisbasket.info.time, type: "check", visa: CurrencyFormatted(round(thisbasket.info.visa, 2)), fiscalNumber:res.dfsresult.TICKET.ORDERTAXNUM, rroNum:rroSerialNum, companyName:fiscalSettings.uaprroORGNM, pointAdress:fiscalSettings.uaprroPOINTADDR, pointName:fiscalSettings.uaprroPOINTNM, IPN:fiscalSettings.uaprroIPN, IID:fiscalSettings.uaprroTIN, cashRegisterNum:rroSerialNum, ORDERNUM: ereceiptStatus.NextLocalNum, CASHDESKNUM: fiscalSettings.uaprroCASHDESKNUM, comment: thisbasket.comments }, printer:{ buffer: deviceItem.settings.printerData.printParams.buffer != null ? deviceItem.settings.printerData.printParams.buffer : "", charset: deviceItem.settings.printerData.printParams.charset, checks: "3", data: '{"chineseOff":"0","systemPrinter":"'+systemPrinterValue+'"}', feed: deviceItem.settings.printerData.indents.feedBottom, fontsize: deviceItem.settings.printerData.sizes.font, ip: ipAdress, mac:macAdress, logo: logotype, manufacturer: "other", parallel: deviceItem.settings.printerData.printParams.parallel, connection: connection, mode: String(deviceItem.settings.printerData.printParams.printMode), protocol: deviceItem.settings.connectionParams.printerProtocol, size: deviceItem.settings.printerData.sizes.size, width:deviceItem.settings.printerData.sizes.width, header: deviceItem.settings.printerData.additionalPrintParams.header, footer: deviceItem.settings.printerData.additionalPrintParams.footer, systemPrinter: systemPrinterValue, type: "printer", codepage: deviceItem.settings.printerData.printParams.codepage }, ereceiptStatus: ereceiptStatus, ResPRRO: res, Summ: thisbasket.cash }); } catch(err) { console.log('error>>>', err); } var xmlDOM = new DOMParser().parseFromString(xml, 'text/xml'); var checkJson = xml2json(xmlDOM); res.checkPRRO = checkJson; resolve(res) }).catch(function (err) { reject(err) }) }) } else { alert("Нет активной смены, откройте смену"); reject(); } }).catch(function (err) { reject(err) }) }) }).catch(function (err) { app.main.error(err); $this.ql.openUploadDialog(); }) }, 0, thisbasket); }) }, rashod: function(thisbasket) { console.log("thisbasket", thisbasket) var deviceItem = thisbasket.printer; //TODO5 var fiscalSettings = deviceItem.settings.fiscalSettings; var tradepoint_id = deviceItem.sklad; var tradepoint = preload.sklad[tradepoint_id]; var tradepointName = tradepoint.title; var tradepointAddr = tradepoint.adress; var $this = this; app.main.loader("show"); try{ var logotype = deviceItem.settings.printerData.printParams.additionalPrintParams.logo; }catch(err){ var logotype = ""; } var rroSerialNum = fiscalSettings.uaprroCASHREGISTERNUM; return new Promise(function (resolve, reject) { setTimeout(function (thisbasket) { //Этот костыль нужен для того чтобы запустить спинер var userid = thisbasket.info.user; //Извлекаем информацию из сертификата $this.ql.getUserECPData(userid).then(function (certData) { //console.warn("certData", certData); //Подписываем документ получения статуса РРО $this.ql.subscribe(JSON.stringify({ Command: "TransactionsRegistrarState", NumFiscal: rroSerialNum }), userid).then(function (signed) { //Отправляем документ получения статуса РРО $this.ExecuteCommand("cmd", signed).then(function (ereceiptStatus) { console.log("ereceiptStatus", ereceiptStatus) //Если смена открыта if (ereceiptStatus.ShiftState == 1) { //Создаем документ продажи var xw = new XMLWriter('windows-1251'); xw.writeStartDocument(); xw.writeStartElement('CHECK').writeAttributeString('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance').writeAttributeString('xsi:noNamespaceSchemaLocation', 'check01.xsd'); xw.writeStartElement('CHECKHEAD'); //Тип документа(Числовой, обязательный): 0-Фіскальний чек, 1-Відкриття зміни, 2-Закриття зміни xw.writeElementString('DOCTYPE', '0'); //Расширенный тип документа(Числовой, обязательный) //Для DOCTYPE=0: 0-Касовий чек на товари (послуги), 1-Видатковий чек, 2-Чек операції «службове внесення», 3-Чек операції «службова видача»--> //Для DOCTYPE!=0: 0 xw.writeElementString('DOCSUBTYPE', '4'); //Уникальный идентификатор документа (GUID, обязательный) xw.writeElementString('UID', app.print.modules.guid()); if (fiscalSettings.uaprroTIN != '') { //ЕДРПОУ/ДРФО/№ паспорта продавца (10 символов, обязательный) xw.writeElementString('TIN', fiscalSettings.uaprroTIN); } else if (certData.DRFO != '' && certData.DRFO != null) { //ЕДРПОУ/ДРФО/№ паспорта продавца (10 символов, обязательный) xw.writeElementString('TIN', certData.DRFO); } if (fiscalSettings.uaprroIPN != '' && fiscalSettings.uaprroIPN != null) { //ИНН продавца (12 символов, необязательный) xw.writeElementString('IPN', fiscalSettings.uaprroIPN); } else if (certData.DRFO != '' && certData.DRFO != null) { //ИНН продавца (12 символов, необязательный) //xw.writeElementString('IPN', certData.DRFO); } if (fiscalSettings.uaprroORGNM != "") { //Наименование продавца (256 символов, обязательный) xw.writeElementString('ORGNM', fiscalSettings.uaprroORGNM); //preload.settings.companyname } else if (preload.settings.companyname != '') { //Наименование продавца (256 символов, обязательный) xw.writeElementString('ORGNM', preload.settings.companyname); //preload.settings.companyname } else { alert("Не вказано найменування організації"); } if (fiscalSettings.uaprroPOINTNM != '') { //Наименование точки продаж (256 символов, обязательный) xw.writeElementString('POINTNM', fiscalSettings.uaprroPOINTNM); } else if (tradepointName != '') { //Наименование точки продаж (256 символов, обязательный) xw.writeElementString('POINTNM', tradepointName); } else { alert("Не вказано найменування точки продаж"); } if (fiscalSettings.uaprroPOINTADDR != '') { //Адрес точки продаж (256 символов, обязательный) xw.writeElementString('POINTADDR', fiscalSettings.uaprroPOINTADDR); } else if (tradepointAddr != '') { //Адрес точки продаж (256 символов, обязательный) xw.writeElementString('POINTADDR', tradepointAddr); } else { alert("Не вказано адресу торгової точки"); } //Дата операции (ддммгггг, обязательный) xw.writeElementString('ORDERDATE', (function () { var d = new Date(); var dd = d.getDate(); if (dd < 10) dd = '0' + dd; var mm = d.getMonth() + 1; if (mm < 10) mm = '0' + mm; var yy = d.getFullYear(); return dd + '' + mm + '' + yy; })()); //Время операции (ччммсс, обязательный) xw.writeElementString('ORDERTIME', (function () { var d = new Date() var hh = d.getHours(); if (hh < 10) hh = '0' + hh; var mm = d.getMinutes(); if (mm < 10) mm = '0' + mm; var ss = d.getSeconds(); if (ss < 10) ss = '0' + ss; return hh + '' + mm + '' + ss; })()); //Порядковый номер документа (128 символов, обязательный) xw.writeElementString('ORDERNUM', String(ereceiptStatus.NextLocalNum)); //Фискальный номер документа (128 символов, необязательный) //xw.writeElementString('ORDERTAXNUM', '101234567890123'); //Номер кассы (64 символа, обязательный) if (fiscalSettings.uaprroCASHDESKNUM == null || fiscalSettings.uaprroCASHDESKNUM == '') { alert("Не вказано порядковий номер каси"); } xw.writeElementString('CASHDESKNUM', fiscalSettings.uaprroCASHDESKNUM); if (rroSerialNum == null || rroSerialNum == '') { alert("Не вказано фіскальний номер каси"); } //Фискальный номер регистратора расчётных операций (128 символов, необязательный) xw.writeElementString('CASHREGISTERNUM', rroSerialNum); //ФИО кассира (128 символов, обязательный) var cashierName = "Касир"; try{ cashierName = certData.commonName; //preload.users[currentsklad][userid]["user_name"] }catch(err){ } xw.writeElementString('CASHIER', cashierName); // certData.commonName //Версия документа (Числовой, обязательный) xw.writeElementString('VER', '1'); if(localStorage.prroTesting) { xw.writeElementString('TESTING', 'true'); } xw.writeEndElement(); //Підсумок по чеку xw.writeStartElement('CHECKTOTAL'); //Загальна сума (15.2 цифри) xw.writeElementString('SUM', CurrencyFormatted(thisbasket.cash)); xw.writeEndElement(); var xml = xw.flush(); xw.close(); //clean the writer xw = undefined; //don't let visitors use it, it's closed //console.log("xml", xml); try { //Хрень чисто для отладки //var xmlDOM = new DOMParser().parseFromString(xml, 'text/xml'); //console.log("xml", xml2json(xmlDOM)); } catch (err) { } //Подписываем чек продажи $this.ql.subscribe(xml, userid).then(function (signed) { //console.log("signed",signed) /////ТУТ БЫЛ ЗАПРОС //Отправляем чек продажи $this.ExecuteCommand("doc", signed).then(function (res) { //Если прошло успешно то записываем инфу о том что суммы поменялись (нужно для закытия смены) try { //Загальна сума внесення prro_userdata.serviceOutput += round(thisbasket["cash"], 2) } catch (err) { console.error(err); } try { //Записываем в памяьб localStorage["currentShift"] = JSON.stringify(prro_userdata); } catch (err) { } try { var dateP = new Date(); var yyP = dateP.getFullYear(); var mmP = dateP.getMonth(); var ddP = dateP.getDate(); var hhP = dateP.getHours(); var minP = dateP.getMinutes(); var ssP = dateP.getSeconds(); var dddP = ddP < 10 ? '0' + ddP : ddP; var mmmP = (mmP + 1) < 10 ? '0' + (mmP + 1) : mmP + 1; var hhhP = hhP < 10 ? '0' + hhP : hhP; var minMinP = minP < 10 ? '0' + minP : minP; var sssP = ssP < 10 ? '0' + ssP : ssP; try{ var systemPrinterValue = deviceItem.settings.printerData.connectionParams.systemPrinter; }catch(err){ var systemPrinterValue = ""; } try{ var ipAdress = deviceItem.settings.printerData.connectionParams.ip; }catch(err){ var ipAdress = ""; } try{ var macAdress = deviceItem.settings.printerData.connectionParams.mac; }catch(err){ var macAdress = ""; } try{ if(deviceItem.settings.printerData.printParams.codepage == null){ deviceItem.settings.printerData.printParams.codepage = "0" } }catch(err){ } try{ var connection = deviceItem.settings.printerData.connectionParams.usb; }catch(err){ } app.print.protocols[deviceItem.settings.connectionParams.printerProtocol]({ uaprro_rashod:true, info:{ allcena: CurrencyFormatted(round(thisbasket.info.allcena, 2)), cash: thisbasket.info.cash > 0 ? CurrencyFormatted(round(thisbasket.info.cash, 2)) : "", date: dddP + '-' + mmmP + '-' + yyP,//cdate[2] +"-"+ cdate[1] +"-"+ cdate[0], nall: thisbasket.info.nall > 0 ? CurrencyFormatted(round(thisbasket.info.nall, 2)) : "", sdacha: CurrencyFormatted(round(thisbasket.info.sdacha, 2)), //servicecash: "0", summ: CurrencyFormatted(round(thisbasket.info.summ, 2)), time: hhhP + '-' + minMinP + '-' + sssP,//thisbasket.info.time, type: "check", visa: CurrencyFormatted(round(thisbasket.info.visa, 2)), fiscalNumber:res.dfsresult.TICKET.ORDERTAXNUM, rroNum:rroSerialNum, companyName:fiscalSettings.uaprroORGNM, pointAdress:fiscalSettings.uaprroPOINTADDR, pointName:fiscalSettings.uaprroPOINTNM, IPN:fiscalSettings.uaprroIPN, IID:fiscalSettings.uaprroTIN, cashRegisterNum:rroSerialNum, ORDERNUM: ereceiptStatus.NextLocalNum, CASHDESKNUM: fiscalSettings.uaprroCASHDESKNUM, comment: thisbasket.comments }, printer:{ buffer: deviceItem.settings.printerData.printParams.buffer != null ? deviceItem.settings.printerData.printParams.buffer : "", charset: deviceItem.settings.printerData.printParams.charset, checks: "3", data: '{"chineseOff":"0","systemPrinter":"'+systemPrinterValue+'"}', feed: deviceItem.settings.printerData.indents.feedBottom, fontsize: deviceItem.settings.printerData.sizes.font, ip: ipAdress, mac:macAdress, logo: logotype, manufacturer: "other", parallel: deviceItem.settings.printerData.printParams.parallel, connection: connection, mode: String(deviceItem.settings.printerData.printParams.printMode), protocol: deviceItem.settings.connectionParams.printerProtocol, size: deviceItem.settings.printerData.sizes.size, width:deviceItem.settings.printerData.sizes.width, header: deviceItem.settings.printerData.additionalPrintParams.header, footer: deviceItem.settings.printerData.additionalPrintParams.footer, systemPrinter: systemPrinterValue, type: "printer", codepage: deviceItem.settings.printerData.printParams.codepage }, ereceiptStatus: ereceiptStatus, ResPRRO: res, Summ: thisbasket.cash }); } catch(err) { console.log('error>>>', err); } var xmlDOM = new DOMParser().parseFromString(xml, 'text/xml'); var checkJson = xml2json(xmlDOM); res.checkPRRO = checkJson; resolve(res) }).catch(function (err) { reject(err) }) }) } else { alert("Нет активной смены, откройте смену"); reject(); } }).catch(function (err) { reject(err) }) }) }).catch(function (err) { app.main.error(err); $this.ql.openUploadDialog(); }) }, 0, thisbasket); }) }, ExecuteCommand: function(type, signedData) { console.warn('начала отрабатывать функция ex comm =>', type, signedData); //type: doc cmd var $this = this; return new Promise(function (resolve, reject) { app.main.loader("show"); //online.skyservice.pro xhr("https://skymarket.top/prro.php?action=" + type, signedData).then(function (json) { console.warn('json json =====>', json); app.main.loader("hide"); try{ var content = JSON.parse(json); console.log(content) if (content.doc) { app.main.loader("show"); var xmldata = app.main.Base64.decode(CSP.getSignedDataContent(content.doc), true); console.log("Результат в XML", xmldata); var xmlDOM = new DOMParser().parseFromString(xmldata, 'text/xml'); var json1 = xml2json(xmlDOM); console.log(json1) app.main.loader("hide"); if (json1.TICKET.ERRORCODE == 0) { resolve({ "status": "done", "dfsresult": json1 }) } else { if (json1.TICKET.ERRORCODE == 7) { } alert("ПРРО: " + json1.TICKET.ERRORTEXT); app.main.loader("hide") reject({ "status": "error" }) } // var json2 = xmlToJson(xmlDOM); // console.log(json2) } if (content.error) { app.main.loader("hide"); alert("ПРРО: " + content.error); reject({ "status": "error" }) } else { resolve(content) } //console.log("Ответ",JSON.parse(Base64.decode(json,true))); }catch(err){ reject({ "status": "error", "text":json }) } }).catch(function () { app.main.loader("hide"); reject({ "status": "error" }) }) }) }, }, uaprro:{ inituser: function(userid) { try{ fiscalSettings = JSON.parse(localStorage["fiscalSettings_" + userbase])[currentsklad]; }catch(err){ } try { e_receipt = JSON.parse(app.main.Base64.decode(localStorage["e_receipt"])); if(!e_receipt[userid]){ this.ql.openUploadDialog().then(function(){ app.print.protocols.uaprro.runChoice(userid).then(function(e){ }) }) }else{ try{ if(fiscalSettings.uaprroCASHREGISTERNUM == null){ app.print.protocols.uaprro.runChoice(userid).then(function(e){ }) } }catch(err){ app.main.error("Не вдалося отримати налаштування ПРРО"); } } } catch (err) { alert("Не вдалось отримати збережені дані електронного цифрового підпису"); localStorage.removeItem('e_receipt'); this.ql.openUploadDialog().then(function(){ app.print.protocols.uaprro.runChoice(userid).then(function(e){ }) }) } }, ql: { reformatdatetime: function(orderdate, ordertime){ try{ var orderdateformat = orderdate[4]+""+orderdate[5]+""+orderdate[6]+""+orderdate[7]+"-"+orderdate[0]+""+orderdate[1]+"-"+orderdate[2]+""+orderdate[3] var ordertimeformat = ordertime[0]+""+ordertime[1]+":"+ordertime[2]+""+ordertime[3]+":"+ordertime[4]+""+ordertime[5] return orderdateformat+" "+ordertimeformat; }catch(err){ return null; } }, getUserECPData: function(userid) { return new Promise(function (resolve, reject) { try { try { var certInfo = JSON.parse(CSP.getCertificateInfo(e_receipt[userid].cert.cert).toString()) resolve(certInfo["subject"]); } catch (err) { reject(new Error("Не вдалось отримати сертифікат користувача")) } } catch (err) { reject(new Error("Не вдалось отримати електронний цифровий підпис користувача")) } }) }, openUploadDialog: function() { return new Promise(function (resolve, reject) { // Check for the File API support. if (window.File && window.FileReader && window.FileList && window.Blob) { $("#cert_file").off(); $("#cert_file").on('change', function (evt) { app.print.protocols.uaprro.ql.uploadfile(evt, "certfile"); }); $("#key_file").off(); $("#key_file").on('change', function (evt) { app.print.protocols.uaprro.ql.uploadfile(evt, "keyContainer"); }); } else { console.error('Не поддерживается загрузка файлов'); } $("#ecp").show() ecp = {}; jPut["userseller8"].data = preload["users"][currentsklad]; $('#userseller8 option[value='+currentuser+']').attr('selected','selected'); $("#saveECP").on('click', function(){ app.print.protocols.uaprro.ql.saveECP().then(function(){ resolve(); }) }) }) }, uploadfile: function(evt, name) { var f = evt.target.files[0]; // FileList object var extension = f.name.split('.').pop().toLowerCase(); console.log(extension) var reader = new FileReader(); // Closure to capture the file information. reader.onload = (function (theFile) { return function (e) { var binaryData = e.target.result; //Converting Binary Data to base 64 var base64String = window.btoa(binaryData); console.log("to localStorage", name, base64String); ecp[name] = base64String; if (name == "keyContainer") { ecp["keyExtension"] = extension } if (name == "certfile") { ecp["certExtension"] = extension } }; })(f); // Read in the image file as a data URL. reader.readAsBinaryString(f); }, saveECP: function() { var self = this; //Проверка ЕЦП для загрузки в хранилище return new Promise(function (resolve, reject) { try { if (ecp["certfile"] != "null" && ecp["keyContainer"] != "null") { var storagePassword = $("#pass_keystorage").val(); var b64storagePassword = btoa(storagePassword); var keyscontainer = self.openSecretKey(ecp["keyContainer"], ecp["keyExtension"], b64storagePassword); console.log("keyscontainer",keyscontainer); if (keyscontainer.keys.length > 0) { // Получение идентификатора ключа из контейнера секретного ключа var keyUser1 = keyscontainer["keys"][0]["key"]; //get second key from dual keys container var keyId = keyscontainer["keys"][0]["id"]; //Проверяем соответствие ключа и сертификата try { var e1 = CSP.getCertificateInfo(ecp["certfile"]); var uacert = e1.getSubjectKeyIdentifier(); try { if (keyId == uacert) { if (CSP.checkKeyPair(ecp["certfile"], keyUser1, b64storagePassword) == true) { var keyStoragePassword = $("#pass_keystorage").val(); try { var erdata = {}; if (localStorage["e_receipt"] != null) { try { erdata = JSON.parse(app.main.Base64.decode(localStorage["e_receipt"])); } catch (err) { alert("Не вдалось отримати збережені дані електронного цифрового підпису"); localStorage.removeItem('e_receipt'); } } var userid = $("#userseller8").val(); if (userid > 0) { erdata[userid] = { cert: { cert: ecp["certfile"], extension: ecp["certExtension"] }, keystorage: { key: ecp["keyContainer"], extension: ecp["keyExtension"], password: keyStoragePassword }, keyscontainer:keyscontainer }; localStorage["e_receipt"] = app.main.Base64.encode(JSON.stringify(erdata)); $("#ecp").hide(); app.main.message(lang["save"]); //Ну а теперь пробуем вычитать app.print.protocols.uaprro.inituser(userid); var certInfo = JSON.parse(e1.toString()) $("#ECPcommonName").html(certInfo["subject"]["commonName"]) resolve(); } else { alert("Не вдалось отримати ідентифікатор співробітника"); } } catch (err) { alert("Не вдалось зберегти електронний цифровий підпис"); } } else { alert("Eror 2: Ключ не відповідає сертифікату"); } } else { alert("Eror 1: Ключ не відповідає сертифікату"); } } catch (err) { alert("Помилка перевірки відповідності ключа до сертифікату") } } catch (err) { alert("Не вдалось отримати ID сертифікату"); } } else { alert("Не вірний пароль або ключ не відповідає необхідним параметрам"); } } } catch (err) { console.error(err) console.log("Не вдалось перевірити за зберегти електронний цифровий підпис") } }) }, openSecretKey: function(keyData, ext, pwd64) { //ext: 'zs2|dat|jks' var keys = []; var ret = { code: 0, keys: [] }; var res; var base64ToHex = function (base64) { var hex = ''; if (base64) { var raw = app.main.Base64.decode(base64); for (i = 0; i < raw.length; i++) { var h = raw.charCodeAt(i).toString(16); hex += (h.length === 2 ? h : '0' + h); } } return hex.toLowerCase(); }; CSP.getLastError().reset(); if (ext.toLowerCase() === 'jks') { keyData = CSP.convertPBKeyToPfx(keyData, pwd64); ret.code = CSP.getLastError().getCode(); if (ret.code) { return ret; } } console.log("конвертонутый", keyData) CSP.pfxVerify(keyData, pwd64); ret.code = CSP.getLastError().getCode(); CSP.getLastError().reset(); if (ret.code === 0 || ret.code === CSP.UNKNOWN_DIGEST) { var id; var keysCnt = CSP.pfxGetFileCount(keyData, pwd64, CSP.bsShroudedKeyBag); ret.code = CSP.getLastError().getCode(); if (ret.code) { return ret; } for (var i = 0; i < keysCnt; i++) { var key = CSP.pfxGetFile(keyData, pwd64, CSP.bsShroudedKeyBag, i); ret.code = CSP.getLastError().getCode(); if (ret.code) { return ret; } id = CSP.pfxGetId(keyData, pwd64, CSP.bsShroudedKeyBag, i); ret.code = CSP.getLastError().getCode(); if (ret.code) { return ret; } keys.push({ id: id, key: key }); } var certsCnt = CSP.pfxGetFileCount(keyData, pwd64, CSP.bsCertBag); if (CSP.getLastError().getCode() === 0) { for (var c = 0; c < certsCnt; c++) { var cert = CSP.pfxGetFile(keyData, pwd64, CSP.bsCertBag, c); console.log("cert",cert) if (CSP.getLastError().getCode() === 0) { var ci = CSP.getCertificateInfo(cert); console.log("keyinfo",ci); if (CSP.getLastError().getCode() === 0) { id = ci.getSubjectKeyIdentifier(); for (var m = 0; m < keys.length; m++) { if (keys[m].id === id) { keys[m].cert = cert; break; } } } else { CSP.getLastError().reset(); } } else { CSP.getLastError().reset(); } } } } else { var data = CSP.convertIITContainerToQL(keyData, pwd64); ret.code = CSP.getLastError().getCode(); if (ret.code) { return ret; } if (data && data.length > 0) { for (var j = 0; j < data.length; j += 2) { var keyItem = { id: base64ToHex(data[j + 1]), key: data[j] }; keys.push(keyItem); } } } ret.keys = keys; return ret; }, subscribe: function(data, userid) { var $this = this; return new Promise(function (resolve, reject) { var msg = app.main.Base64.encode(data, true); var ECPContiner = e_receipt[userid]; var certUser1 = ECPContiner.cert.cert; var contUser1 = ECPContiner.keystorage.key; var context = ECPContiner.keystorage.extension; var pass1 = btoa(ECPContiner.keystorage.password); //var dfscert = "MIIGlDCCBjygAwIBAgIUILTk7Q0wmYwEAAAADYIZAGepaQAwDQYLKoYkAgEBAQEDAQEwggFVMVQwUgYDVQQKDEvQhtC90YTQvtGA0LzQsNGG0ZbQudC90L4t0LTQvtCy0ZbQtNC60L7QstC40Lkg0LTQtdC/0LDRgNGC0LDQvNC10L3RgiDQlNCk0KExXjBcBgNVBAsMVdCj0L/RgNCw0LLQu9GW0L3QvdGPICjRhtC10L3RgtGAKSDRgdC10YDRgtC40YTRltC60LDRhtGW0Zcg0LrQu9GO0YfRltCyINCG0JTQlCDQlNCk0KExYjBgBgNVBAMMWdCQ0LrRgNC10LTQuNGC0L7QstCw0L3QuNC5INGG0LXQvdGC0YAg0YHQtdGA0YLQuNGE0ZbQutCw0YbRltGXINC60LvRjtGH0ZbQsiDQhtCU0JQg0JTQpNChMRkwFwYDVQQFDBBVQS0zOTM4NDQ3Ni0yMDE4MQswCQYDVQQGEwJVQTERMA8GA1UEBwwI0JrQuNGX0LIwHhcNMTgxMDIxMjEwMDAwWhcNMjAxMDIxMjEwMDAwWjCB2jFIMEYGA1UECgw/0JTQtdGA0LbQsNCy0L3QsCDRhNGW0YHQutCw0LvRjNC90LAg0YHQu9GD0LbQsdCwINCj0LrRgNCw0ZfQvdC4MVwwWgYDVQQDDFPQlNC10YDQttCw0LLQvdCwINGE0ZbRgdC60LDQu9GM0L3QsCDRgdC70YPQttCx0LAg0KPQutGA0LDRl9C90LguICLQntCi0KDQmNCc0JDQndCeIjEQMA4GA1UEBQwHMTY3MTY5MzELMAkGA1UEBhMCVUExETAPBgNVBAcMCNCa0LjRl9CyMIIBUTCCARIGCyqGJAIBAQEBAwEBMIIBATCBvDAPAgIBrzAJAgEBAgEDAgEFAgEBBDbzykDGaaTaFzFJyhLDLa4Ya1Osa8Y2WZferq6K0tiI+b/VNAFpTvnEJz2M/m3Cj3BqD0kQzgMCNj///////////////////////////////////7oxdUWACajApyTwL4Gqih/Lr4DZDHqVEQUEzwQ2fIV8lMVDO/2ZHhfCJoQGWFCpoknte8JJrlpOh4aJ+HLvetUkCC7DA46a7ee6a6Ezgdl5umIaBECp1utF8TxwgoDElnsjH16t9ljrpMA3KR042WvwJcpOF/jpcg3GFbQ6KJdfC8Heo2Q4tWTqLBef0BI+bbj6xXkEAzkABDZwH7HH26/x73WbRPIxKjHdz1QdnxUpB9vwBwMCB+2su4uKRf72QGSQH3TFfpk/24U+LF+XPUWjggJjMIICXzApBgNVHQ4EIgQgVPreL0lr1sfyTHNNerUgqfTp9nQpi3qYTy3WIVv+GH8wKwYDVR0jBCQwIoAgILTk7Q0wmYy+MGoHfWmaMnMjiukJCHHWFjcOGOV21H8wDgYDVR0PAQH/BAQDAgMIMBkGA1UdIAEB/wQPMA0wCwYJKoYkAgEBAQICMAwGA1UdEwEB/wQCMAAwHgYIKwYBBQUHAQMBAf8EDzANMAsGCSqGJAIBAQECATAcBgNVHREEFTAToBEGCisGAQQBgjcUAgOgAwwBNjBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vYWNza2lkZC5nb3YudWEvZG93bmxvYWQvY3Jscy9DQS0yMEI0RTRFRC1GdWxsLmNybDBKBgNVHS4EQzBBMD+gPaA7hjlodHRwOi8vYWNza2lkZC5nb3YudWEvZG93bmxvYWQvY3Jscy9DQS0yMEI0RTRFRC1EZWx0YS5jcmwwgY4GCCsGAQUFBwEBBIGBMH8wMAYIKwYBBQUHMAGGJGh0dHA6Ly9hY3NraWRkLmdvdi51YS9zZXJ2aWNlcy9vY3NwLzBLBggrBgEFBQcwAoY/aHR0cDovL2Fjc2tpZGQuZ292LnVhL2Rvd25sb2FkL2NlcnRpZmljYXRlcy9hbGxhY3NraWRkLTIwMTgucDdiMD8GCCsGAQUFBwELBDMwMTAvBggrBgEFBQcwA4YjaHR0cDovL2Fjc2tpZGQuZ292LnVhL3NlcnZpY2VzL3RzcC8wJQYDVR0JBB4wHDAaBgwqhiQCAQEBCwEEAgExChMIMzkyOTIxOTcwDQYLKoYkAgEBAQEDAQEDQwAEQOpK2+wF9M71fGniDDGc5ukZP7TJnnhNgTvcOer4ell38plKW/38z4lZjEnqjMLkmgaNLZLU9ramqTxNCBx62xU="; if(!ECPContiner.keyscontainer){ //alert("Вскрываем контейнер"); //Вскрываем контейнер и сохраняем данные чтобы не вскрытьва потом и не тратить ресурсы var keyscontainer = $this.openSecretKey(contUser1, context, pass1); ECPContiner.keyscontainer = keyscontainer; localStorage["e_receipt"] = app.main.Base64.encode(JSON.stringify(e_receipt)); }else{ //alert("Используем ключ повторно"); //этот вариант будет работать поле того как уже хоть раз контейнер был вскрыт var keyscontainer = ECPContiner.keyscontainer; } //console.log("Контейнер",keyscontainer); // Извлечение секретного ключа из контейнера try{ var keyUser1 = keyscontainer["keys"][0]["key"]; //get second key from dual keys container //console.log("keyUser1",keyUser1) }catch(err){ alert("Не вдалось отримати секретний ключ із контейнера"); reject(); } /* try{ Android.DSTU(JSON.stringify( { method:"sign", data:{ content:msg, cert:certUser1, key:keyUser1, password:pass1, timestamp:"2020-12-01 11:00:00" } } )); }catch(err){ } */ var container = new CSP.CADES(msg, certUser1, keyUser1, pass1, new CSP.UACADESInfo({ signingTime: new Date() })); if (container != undefined) { var bytes = container.getBytes(); console.log(app.main.Base64.decode(bytes)); resolve(bytes); } else { reject(new Error("Не вдалось підписати запит")) } }) }, }, getPRRO: function(userid){ var $this = this; return new Promise(function (resolve, reject) { //Извлекаем информацию из сертификата $this.ql.getUserECPData(userid).then(function (certData) { //Подписываем документ получения статуса РРО $this.ql.subscribe(JSON.stringify({ Command: "Objects" }), userid).then(function (signed) { //Отправляем документ получения статуса РРО $this.ExecuteCommand("cmd", signed).then(function (ereceiptStatus) { resolve(ereceiptStatus); }).catch(function (err) { reject(err) }) }) }) }) }, runChoice: function(userid){ return new Promise(function (resolve, reject) { if(fiscalSettings.uaprroCASHREGISTERNUM == null){ app.print.protocols.uaprro.getPRRO(userid).then(function(e){ $("#choiseprro1").show(); jPut["choiseprro1List"].data = e.TaxObjects; $(".choiseprro1Item").on('click', function(e){ var uuid = $(this).attr("data"); var prroAdressObj = prroAdress[uuid]; console.log("click",prroAdressObj); $("#choiseprro2").show(); jPut["choiseprro2List"].data = prroAdressObj.TransactionsRegistrars; $(".choiseprro2Item").on('click', function(e){ var TransactionsRegistrar = { NumFiscal: $(this).attr("NumFiscal"), NumLocal: $(this).attr("NumLocal"), Name: $(this).attr("FiscalName"), Closed: $(this).attr("shiftStatus") } delete prroAdressObj.TransactionsRegistrars; prroAdressObj.TransactionsRegistrar = TransactionsRegistrar; console.log("Результат работы формы", prroAdressObj) $("#choiseprro2").hide(); $("#choiseprro1").hide(); try{ try{ var fiscalSettingsTemp = JSON.parse(localStorage["fiscalSettings_" + userbase]); }catch(err){ var fiscalSettingsTemp = {}; } fiscalSettingsTemp[currentsklad] = { uaprroCASHDESKNUM: prroAdressObj.TransactionsRegistrar.NumLocal, //uaprroCASHIER: preload.users[currentsklad][userid]["user_name"], uaprroCASHREGISTERNUM: prroAdressObj.TransactionsRegistrar.NumFiscal, uaprroIPN: prroAdressObj.Ipn, uaprroORGNM: prroAdressObj.OrgName, uaprroPOINTADDR: prroAdressObj.Address, uaprroPOINTNM: prroAdressObj.Name, uaprroTIN: prroAdressObj.Tin } localStorage["fiscalSettings_" + userbase] = JSON.stringify(fiscalSettingsTemp); fiscalSettings = fiscalSettingsTemp[currentsklad]; app.main.message("Обрана каса з фіскальний номером "+prroAdressObj.TransactionsRegistrar.NumFiscal); $("#uaprroCASHREGISTERNUM").html(prroAdressObj.TransactionsRegistrar.NumFiscal); resolve(); }catch(err){ app.main.error("Не вдалося отримати параметри") reject(); } }); }) }) }else{ resolve(); } }) }, choiseAddr: function(data){ //Поскольку у нас jquery то нам надо создать обьект ключей что бы к ним обратится после клика var uuid = app.print.modules.guid(); prroAdress[uuid] = data; return uuid; }, prrosettings: function(){ $("#prrostatusbox").show() try{ $("#uaprroCASHREGISTERNUM").html(fiscalSettings.uaprroCASHREGISTERNUM); }catch(err){ } app.print.protocols.uaprro.ql.getUserECPData(currentuser).then(function (certData) { console.warn("certData", certData); $("#ECPcommonName").html(certData.commonName) }) $("#changeprro").on('click', function(){ fiscalSettings = {} $("#uaprroCASHREGISTERNUM").html(""); app.print.protocols.uaprro.runChoice(currentuser).then(function(e){}) }) $("#changeecpnow").on('click', function(){ e_receipt[currentuser] app.print.protocols.uaprro.ql.openUploadDialog().then(function(){}) }) }, opensmena: function(data) { var deviceItem = data.printer; var cdate = data.info.date.split('-'); var CompanyName = fiscalSettings.uaprroORGNM; var PointAdress = fiscalSettings.uaprroPOINTADDR; var PointName = fiscalSettings.uaprroPOINTNM; var IPN = fiscalSettings.uaprroIPN; //var INN = fiscalSettings.uaprroINN; var IID = fiscalSettings.uaprroTIN; try{ var logotype = deviceItem.settings.printerData.printParams.additionalPrintParams.logo; }catch(err){ var logotype = ""; } try{ var connection = deviceItem.settings.printerData.connectionParams.usb; }catch(err){ } var $this = this; function getCurrentDate() { var d = new Date(); var dd = d.getDate(); if (dd < 10) dd = '0' + dd; var mm = d.getMonth() + 1; if (mm < 10) mm = '0' + mm; var yy = d.getFullYear(); return dd + '' + mm + '' + yy; } function getCurrentTime() { var d = new Date() var hh = d.getHours(); if (hh < 10) hh = '0' + hh; var mm = d.getMinutes(); if (mm < 10) mm = '0' + mm; var ss = d.getSeconds(); if (ss < 10) ss = '0' + ss; return hh + '' + mm + '' + ss; } var userid = data.info.user; var rroSerialNum = fiscalSettings.uaprroCASHREGISTERNUM; return new Promise(function (resolve, reject) { $this.ql.subscribe(JSON.stringify({ Command: "TransactionsRegistrarState", NumFiscal: rroSerialNum }), userid).then(function (signed) { $this.ExecuteCommand("cmd", signed).then(function (ereceiptStatus) { if (ereceiptStatus.ShiftState == 0) { $this.ql.getUserECPData(userid).then(function (certData) { var xw = new XMLWriter('windows-1251'); xw.writeStartDocument(); xw.writeStartElement('CHECK'); xw.writeAttributeString('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance'); xw.writeAttributeString('xsi:noNamespaceSchemaLocation', 'check01.xsd'); xw.writeStartElement('CHECKHEAD'); //0-Чек реалізації товарів/послуг, 1-Чек переказу коштів, 2–Чек операції обміну валюти, 3-Чек видачі готівки, 100-Відкриття зміни, 101-Закриття зміни, 102-Початок офлайн сесії, 103-Завершення офлайн сесії xw.writeElementString('DOCTYPE', '100'); //Унікальний ідентифікатор документа (GUID) xw.writeElementString('UID', app.print.modules.guid())//.writeEndElement(); xw.writeElementString('TIN', fiscalSettings.uaprroTIN); //certData.DRFO if(fiscalSettings.uaprroIPN != "" && fiscalSettings.uaprroIPN != null){ xw.writeElementString('IPN', fiscalSettings.uaprroIPN); //certData.EDRPOU } if (certData.EDRPOU != null && certData.EDRPOU != '') { //ЕДРПОУ/ДРФО/№ паспорта продавца (10 символов, обязательный) //xw.writeElementString('TIN', certData.EDRPOU); //certData.DRFO } if (certData.EDRPOU != null && certData.EDRPOU != '') { //ИНН продавца (12 символов, необязательный) //xw.writeElementString('INN', certData.EDRPOU); } //Наименование продавца (256 символов) xw.writeElementString('ORGNM', fiscalSettings.uaprroORGNM)//.writeEndElement(); //Наименование точки продаж (256 символов, обязательный) xw.writeElementString('POINTNM', fiscalSettings.uaprroPOINTNM); //Адрес точки продаж (256 символов, обязательный) xw.writeElementString('POINTADDR', fiscalSettings.uaprroPOINTADDR)//.writeEndElement(); //Дата операции (ддммгггг, обязательный) xw.writeElementString('ORDERDATE', getCurrentDate())//.writeEndElement(); //Время операции (ччммсс, обязательный) xw.writeElementString('ORDERTIME', getCurrentTime())//.writeEndElement(); //Порядковый номер документа (128 символов, обязательный) var tempLocalNum = ereceiptStatus.NextLocalNum var NextLocalNum = tempLocalNum.toString(); xw.writeElementString('ORDERNUM', NextLocalNum)//.writeEndElement(); //Номер кассы (64 символа, обязательный) xw.writeElementString('CASHDESKNUM', fiscalSettings.uaprroCASHDESKNUM)//.writeEndElement(); //Фискальный номер регистратора расчётных операций (128 символов, необязательный) xw.writeElementString('CASHREGISTERNUM', rroSerialNum)//.writeEndElement(); //ФИО кассира (128 символов, обязательный) var cashierName = "Касир"; try{ cashierName = certData.commonName; //preload.users[currentsklad][userid]["user_name"] }catch(err){ } xw.writeElementString('CASHIER', cashierName)//.writeEndElement(); //Версия документа (Числовой) xw.writeElementString('VER', '1')//.writeEndElement(); //Фискальный номер документа (128 символов, необязательный) //xw.writeElementString('ORDERTAXNUM', '101234567890123')//.writeEndElement(); if(localStorage.prroTesting) { xw.writeElementString('TESTING', "true"); } xw.writeEndElement(); xw.writeEndElement(); var xml = xw.flush(); xw.close(); //clean the writer xw = undefined; //don't let visitors use it, it's closed console.log(xml); try { $this.ql.subscribe(xml, userid).then(function (signed) { $this.ExecuteCommand("doc", signed).then(function (res) { try{ app.main.message("Фіскальну зміну №"+res.dfsresult.TICKET.ORDERTAXNUM+" відкрито від "+app.print.protocols.uaprro.ql.reformatdatetime(res.dfsresult.TICKET.ORDERDATE,res.dfsresult.TICKET.ORDERTIME)) }catch(err){ app.main.message("Фіскальну зміну відкрито"); } console.warn('OPENED SHIFT!!!', res); try { res.ThisShift = { "Opened":app.print.protocols.uaprro.ql.reformatdatetime(res.dfsresult.TICKET.ORDERDATE,res.dfsresult.TICKET.ORDERTIME) }; } catch(err) { } try { res.Cashier = cashierName; } catch(err) { } try{ var systemPrinterValue = deviceItem.settings.printerData.connectionParams.systemPrinter; }catch(err){ var systemPrinterValue = ""; } try{ var ipAdress = deviceItem.settings.printerData.connectionParams.ip; }catch(err){ var ipAdress = ""; } try{ var macAdress = deviceItem.settings.printerData.connectionParams.mac; }catch(err){ var macAdress = ""; } try{ if(deviceItem.settings.printerData.printParams.codepage == null){ deviceItem.settings.printerData.printParams.codepage = "0" } }catch(err){ } try{ app.print.protocols[deviceItem.settings.connectionParams.printerProtocol]({ open_shift:true, info:{ allcena: CurrencyFormatted(round(data.info.allcena, 2)), cash: data.info.cash > 0 ? CurrencyFormatted(round(data.info.cash, 2)) : "", //client: "0", //coupon: 0, date: cdate[2] +"-"+ cdate[1] +"-"+ cdate[0], //discount: "0", //discounttitle: "Без скидки", nall: data.info.nall > 0 ? CurrencyFormatted(round(data.info.nall, 2)) : "", sdacha: CurrencyFormatted(round(data.info.sdacha, 2)), //servicecash: "0", summ: CurrencyFormatted(round(data.info.summ, 2)), time: data.info.time, type: "check", visa: CurrencyFormatted(round(data.info.visa, 2)), fiscalNumber:res.dfsresult.TICKET.ORDERTAXNUM, rroNum:rroSerialNum, companyName:CompanyName, pointAdress:PointAdress, pointName:PointName, IPN:IPN, IID:IID, cashRegisterNum:rroSerialNum, CASHDESKNUM:fiscalSettings.uaprroCASHDESKNUM, }, printer:{ buffer: deviceItem.settings.printerData.printParams.buffer != null ? deviceItem.settings.printerData.printParams.buffer : "", charset: deviceItem.settings.printerData.printParams.charset, checks: "3", data: '{"chineseOff":"0","systemPrinter":"'+systemPrinterValue+'"}', feed: deviceItem.settings.printerData.indents.feedBottom, fontsize: deviceItem.settings.printerData.sizes.font, ip: ipAdress, mac:macAdress, logo: logotype, manufacturer: "other", parallel: deviceItem.settings.printerData.printParams.parallel, connection: connection, mode: String(deviceItem.settings.printerData.printParams.printMode), protocol: deviceItem.settings.connectionParams.printerProtocol, size: deviceItem.settings.printerData.sizes.size, width:deviceItem.settings.printerData.sizes.width, header: deviceItem.settings.printerData.additionalPrintParams.header, footer: deviceItem.settings.printerData.additionalPrintParams.footer, systemPrinter: systemPrinterValue, type: "printer", codepage: deviceItem.settings.printerData.printParams.codepage }, OpenSmenaReport:res }); }catch(err){ app.main.error("Фіскальна зміна відкрита, не вдалося роздрукувати чек"); } resolve(res) }).catch(function (err) { reject(err) }) }) } catch (err) { console.error(err) } }) }else{ //Смена уже открыта alert("Фіскальну зміну було відкрито раніше, зміна в Skyservice POS буде відкрита наступним кроком"); resolve({ status:"done" }) } }).catch(function (err) { reject(err) }) }); }); }, opendrawer: function(data) { }, check: function(thisbasket) { console.warn("thisbasket", thisbasket); console.warn('actciz', thisbasket.products[0].aktciz); console.warn('barcode', thisbasket.products[0].barcode); //1 - ПДВ і збір окремо //2 - ПДВ на збір //3 - Збір на ПДВ var doubleTaxAlgorithm = 3; var deviceItem = thisbasket.printer; //TODO5 var fiscalSettings = deviceItem.settings.fiscalSettings; var tradepoint_id = deviceItem.sklad; var tradepoint = preload.sklad[tradepoint_id]; var tradepointName = tradepoint.title; var tradepointAddr = tradepoint.adress; var totalSum = 0; var totalDiscountSum = 0; var CompanyName = ""; var IPN = ""; var PointAdress = ""; var IID = ""; var PointName = ""; var roundsum = 0; var localNumber = ""; var cashRegisterNum = ""; var $this = this; app.main.loader("show"); var rroSerialNum = fiscalSettings.uaprroCASHREGISTERNUM; //Если в настройках указано алгоритм двойного налога if(doubleTaxAlgorithm == 2 || doubleTaxAlgorithm == 3){ //Обьект из которого можно получить данные о налоге по букве var taxLetterObj = {}; for (var keyLetter in preload.tax) { var taxitemObj = preload.tax[keyLetter]; taxLetterObj[taxitemObj["value"]] = taxitemObj; } } //Подсчет суммы var fiscalarr = $.map(thisbasket["products"], function (value, index) { return [value]; }); fiscalarr.forEach(function (item) { if(okruglenie == 0){ var price = round(item["cenaout"],2); var priced = round(item["cenaout_discount"],2); }else{ var price = round(item["cenaout_1"],2); var priced = round(item["cenaout_discount_1"],2); } //item["amount"] = round(price*item["kolvo"],2); //todo999 item["amount"] = round(multiplyin(price, item["kolvo"]),2) var discSum0 = 0; if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { //Если скидка есть //var disc_Sum = round(priced * item["kolvo"],2); //todo999 var disc_Sum = round(multiplyin(priced, item["kolvo"]),2) } else { //Скидки нет //var disc_Sum = round(price * item["kolvo"],2); //todo999 var disc_Sum = round(multiplyin(price, item["kolvo"]),2) } totalSum = app.main.sum(totalSum, disc_Sum); var realsum0 = round(multiplyin(price, item["kolvo"]),2) //var realsum0 = round(price * item["kolvo"],2); //todo999 var razn0 = realsum0 - disc_Sum; discSum0 = round(razn0, 2); //item["amountDisc"] = round(round(price*item["kolvo"],2)-discSum0,2); //todo999 item["amountDisc"] = round(round(multiplyin(price, item["kolvo"]),2)-discSum0,2); totalDiscountSum = app.main.sum(totalDiscountSum, discSum0); }); return new Promise(function (resolve, reject) { setTimeout(function (thisbasket) { //Этот костыль нужен для того чтобы запустить спинер var userid = thisbasket.info.user; //Извлекаем информацию из сертификата $this.ql.getUserECPData(userid).then(function (certData) { console.warn("certData", certData); //Подписываем документ получения статуса РРО $this.ql.subscribe(JSON.stringify({ Command: "TransactionsRegistrarState", //Objects NumFiscal: rroSerialNum }), userid).then(function (signed) { //Отправляем документ получения статуса РРО $this.ExecuteCommand("cmd", signed).then(function (ereceiptStatus) { //console.log("Objects",ereceiptStatus) //Если смена открыта if (ereceiptStatus.ShiftState == 1) { //Создаем документ продажи var xw = new XMLWriter('windows-1251'); xw.writeStartDocument(); xw.writeStartElement('CHECK').writeAttributeString('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance').writeAttributeString('xsi:noNamespaceSchemaLocation', 'check01.xsd'); xw.writeStartElement('CHECKHEAD'); //Тип документа(Числовой, обязательный): 0-Фіскальний чек, 1-Відкриття зміни, 2-Закриття зміни xw.writeElementString('DOCTYPE', '0'); //Расширенный тип документа(Числовой, обязательный) //Для DOCTYPE=0: 0-Касовий чек на товари (послуги), 1-Видатковий чек, 2-Чек операції «службове внесення», 3-Чек операції «службова видача»--> //Для DOCTYPE!=0: 0 xw.writeElementString('DOCSUBTYPE', '0'); //Уникальный идентификатор документа (GUID, обязательный) xw.writeElementString('UID', app.print.modules.guid()); if (fiscalSettings.uaprroTIN != '') { //ЕДРПОУ/ДРФО/№ паспорта продавца (10 символов, обязательный) xw.writeElementString('TIN', fiscalSettings.uaprroTIN); IID = fiscalSettings.uaprroTIN; } else if (certData.DRFO != '' && certData.DRFO != null) { //ЕДРПОУ/ДРФО/№ паспорта продавца (10 символов, обязательный) xw.writeElementString('TIN', certData.DRFO); IID = certData.DRFO; } if (fiscalSettings.uaprroIPN != '' && fiscalSettings.uaprroIPN != null) { //ИНН продавца (12 символов, необязательный) xw.writeElementString('IPN', fiscalSettings.uaprroIPN); IPN = fiscalSettings.uaprroIPN; } else if (certData.DRFO != '' && certData.DRFO != null) { //ИНН продавца (12 символов, необязательный) //xw.writeElementString('IPN', certData.DRFO); //IPN = certData.DRFO; } if (fiscalSettings.uaprroORGNM != "") { //Наименование продавца (256 символов, обязательный) xw.writeElementString('ORGNM', fiscalSettings.uaprroORGNM); //preload.settings.companyname CompanyName = fiscalSettings.uaprroORGNM; } else if (preload.settings.companyname != '') { //Наименование продавца (256 символов, обязательный) xw.writeElementString('ORGNM', preload.settings.companyname); //preload.settings.companyname CompanyName = preload.settings.companyname; } else { alert("Не вказано найменування організації"); reject(); } if (fiscalSettings.uaprroPOINTNM != '') { //Наименование точки продаж (256 символов, обязательный) xw.writeElementString('POINTNM', fiscalSettings.uaprroPOINTNM); PointName = fiscalSettings.uaprroPOINTNM; } else if (tradepointName != '') { //Наименование точки продаж (256 символов, обязательный) xw.writeElementString('POINTNM', tradepointName); PointName = tradepointName; } else { alert("Не вказано найменування точки продаж"); reject(); } if (fiscalSettings.uaprroPOINTADDR != '') { //Адрес точки продаж (256 символов, обязательный) xw.writeElementString('POINTADDR', fiscalSettings.uaprroPOINTADDR); PointAdress = fiscalSettings.uaprroPOINTADDR; } else if (tradepointAddr != '') { //Адрес точки продаж (256 символов, обязательный) xw.writeElementString('POINTADDR', tradepointAddr); PointAdress = tradepointAddr; } else { alert("Не вказано адресу торгової точки"); reject(); } var cdate = thisbasket.info.date.split('-'); //Дата операции (ддммгггг, обязательный) xw.writeElementString('ORDERDATE', cdate[2] + cdate[1] + cdate[0]); //Время операции (ччммсс, обязательный) xw.writeElementString('ORDERTIME', thisbasket.info.time.replace(/\:/g, '')); //Порядковый номер документа (128 символов, обязательный) xw.writeElementString('ORDERNUM', String(ereceiptStatus.NextLocalNum)); localNumber = ereceiptStatus.NextLocalNum; //Фискальный номер документа (128 символов, необязательный) //xw.writeElementString('ORDERTAXNUM', '101234567890123'); //Номер кассы (64 символа, обязательный) if (fiscalSettings.uaprroCASHDESKNUM == null || fiscalSettings.uaprroCASHDESKNUM == '') { alert("Не вказано порядковий номер каси"); reject(); } xw.writeElementString('CASHDESKNUM', fiscalSettings.uaprroCASHDESKNUM); cashRegisterNum = fiscalSettings.uaprroCASHDESKNUM; if (rroSerialNum == null || rroSerialNum == '') { alert("Не вказано фіскальний номер каси"); reject(); } //Фискальный номер регистратора расчётных операций (128 символов, необязательный) xw.writeElementString('CASHREGISTERNUM', rroSerialNum); var cashierName = "Касир"; try{ cashierName = certData.commonName; //preload.users[currentsklad][userid]["user_name"] }catch(err){ } //ФИО кассира (128 символов, обязательный) xw.writeElementString('CASHIER', cashierName); // certData.commonName //Версия документа (Числовой, обязательный) xw.writeElementString('VER', '1'); if(localStorage.prroTesting) { xw.writeElementString('TESTING', 'true'); } xw.writeEndElement(); //Підсумок по чеку xw.writeStartElement('CHECKTOTAL'); //Загальна сума (15.2 цифри) наприклад, 1000.00 xw.writeElementString('SUM', CurrencyFormatted(totalSum-okruglenie)); //thisbasket.info.allcena //Заокруглення (15.2 цифри) (наприклад, 0.71)--> xw.writeElementString('RNDSUM', CurrencyFormatted(okruglenie)); roundsum = CurrencyFormatted(okruglenie); //Загальна сума без округлення (15.2 цифри) (наприклад, 1000.71) xw.writeElementString('NORNDSUM', CurrencyFormatted(totalSum)); if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { //Тип знижки/націнки (1 символ) //0–Сумова, 1–Відсоткова xw.writeElementString('DISCOUNTTYPE', '0'); //Загальна сума знижки (15.2 цифри) xw.writeElementString('DISCOUNTSUM', CurrencyFormatted(totalDiscountSum)); } xw.writeEndElement(); xw.writeStartElement('CHECKPAY'); //Строка 1 xw.writeStartElement('ROW').writeAttributeString('ROWNUM', '1'); //Код форми оплати (числовий) //0–Готівка, 1–Банківська картка.. xw.writeElementString('PAYFORMCD', '0'); //Форма оплаты (64 символа, необязательный) xw.writeElementString('PAYFORMNM', 'ГОТІВКА'); //Итоговая сумма (15.2 цифры, необязательный) xw.writeElementString('SUM', CurrencyFormatted(thisbasket.info.cash)); //xw.writeElementString('PROVIDED', '12.00'); xw.writeEndElement(); //Строка 2 xw.writeStartElement('ROW').writeAttributeString('ROWNUM', '2'); //Код форми оплати (числовий) //0–Готівка, 1–Банківська картка.. xw.writeElementString('PAYFORMCD', '1'); //Форма оплаты (64 символа, необязательный) xw.writeElementString('PAYFORMNM', 'Банківська картка'); //Итоговая сумма (15.2 цифры, необязательный) xw.writeElementString('SUM', CurrencyFormatted(thisbasket.info.visa)); if (thisbasket["info"]["bankingData"]) { xw.writeStartElement('PAYSYS'); xw.writeStartElement('ROW').writeAttributeString('ROWNUM', '1'); /** виса/мастеркард и тд */ //Найменування платіжної системи (текст) if (thisbasket["info"]["bankingData"].issuerName) { xw.writeElementString('NAME', thisbasket["info"]["bankingData"].issuerName); } if (IPN) { //Податковий номер еквайра торговця (64 символи) //xw.writeElementString('ACQUIREPN', IPN);// thisbasket["info"]["bankingData"] } if (thisbasket["info"]["bankingData"]["bankName"]) { xw.writeElementString('ACQUIRENM', thisbasket["info"]["bankingData"]["bankName"]);// thisbasket["info"]["bankingData"] }else{ xw.writeElementString('ACQUIRENM', "Банк");// thisbasket["info"]["bankingData"] } // RRN (Reference Retrieval Number) платежа //Ідентифікатор транзакції, що надається еквайром та ідентифікує операцію в платіжній системі (128 символів) if (thisbasket["info"]["bankingData"]["rrn"]) { xw.writeElementString('ACQUIRETRANSID', thisbasket["info"]["bankingData"]["rrn"]); } //POS-термінал. Дата та час транзакції (ддммррррггххсс) //POSTRANSDATE //Ідентифікатор платіжного пристрою (128 символів)--> if (thisbasket["info"]["bankingData"].merchantID) { xw.writeElementString('DEVICEID', thisbasket["info"]["bankingData"].merchantID); } //Реквізити електронного платіжного засобу (128 символів) if (thisbasket["info"]["bankingData"].cardNumber) { xw.writeElementString('EPZDETAILS', thisbasket["info"]["bankingData"].cardNumber); } // Код авторизації (64 символи) if (thisbasket["info"]["bankingData"].authorizationCode) { xw.writeElementString('AUTHCD', thisbasket["info"]["bankingData"].authorizationCode); } //Сума оплати (15.2 цифри) xw.writeElementString('SUM', CurrencyFormatted(thisbasket.info.visa)); //Сума комісії (15.2 цифри)--> xw.writeElementString('COMMISSION', "0.00"); xw.writeEndElement(); xw.writeEndElement();// PAYSYS END } //Найменування платіжної системи (текст) // // // // // // // // // xw.writeEndElement(); xw.writeEndElement(); try { var prodTaxArr = {}; var prodTaxSum = {}; var prodTaxSumSource = {}; var prodTaxPercent = {}; var prodTaxType = {}; //Тут нам надо скалькулировать налоги fiscalarr.forEach(function (item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } if (item["tax"] != "" && item["tax"] != '-1') { //Если используем 2 буквы налога if(item["tax"].length == 2){ var splitters = item["tax"].split(""); for(var key in splitters){ var letter = splitters[key]; try{ if(doubleTaxAlgorithm != 1){ //Если в настройках указано алгоритм двойного налога //Тут нам надо добавить метки что это допустим был товар с сдвоенным налогом //Альтернативная версия что надо расчитать акциз сдесь, отнять от суммы товара для пдв if(taxLetterObj[letter]){ //Если это акциз то надо считать сумму для этого товара //Если активирован Збір на ПДВ if((taxLetterObj[letter]["cno"] == "1" && doubleTaxAlgorithm == 3) || taxLetterObj[letter]["cno"] == "0" && doubleTaxAlgorithm == 2){ item["amountDiscExciseSum"] = app.main.sum(item.amountDisc, -(round(item.amountDisc, 2) * 100) / round(round(taxLetterObj[letter]["percent"], 2) + 100, 2)); item["amountExciseSum"] = app.main.sum(item.amount, -(round(item.amount, 2) * 100) / round(round(taxLetterObj[letter]["percent"], 2) + 100, 2)); //возможно что-то из этого не нужно } } } }catch(err){ console.log("Не вдалось використати подвоєний податок") } if (prodTaxArr[letter]) { prodTaxArr[letter].push(item); } else { prodTaxArr[letter] = []; prodTaxArr[letter].push(item); } } } if (prodTaxArr[item["tax"]]) { prodTaxArr[item["tax"]].push(item); } else { prodTaxArr[item["tax"]] = []; prodTaxArr[item["tax"]].push(item); } item["rroitemdata"] = { status:"taxed", taxValue:item["tax"] } } }); } catch (err) { console.error(err); } //Налоговые ставки xw.writeStartElement('CHECKTAX'); var taxes = []; //Если в настройках указано алгоритм двойного налога то нам надо отсортировать налоги в правильном порядке if(doubleTaxAlgorithm != 1){ try{ for(var keyTaxItem in preload.tax){ var thisTax = preload.tax[keyTaxItem]; //ПДВ на збір (сначала пдв потом акциз) if(doubleTaxAlgorithm == 2){ //Акцизы добавляем в конец if(thisTax.cno == "1"){ taxes.push(thisTax); } //ПДВ добавляем в начало if(thisTax.cno == "0"){ taxes.unshift(thisTax); } } //Збір на ПДВ (сначала акциз потом пдв) if(doubleTaxAlgorithm == 3){ //Акцизы добавляем в начало if(thisTax.cno == "1"){ taxes.unshift(thisTax); } //ПДВ добавляем в конец if(thisTax.cno == "0"){ taxes.push(thisTax); } } } }catch(err){ console.log("не удалось отсортировать налоги по doubleTaxAlgorithm") } }else{ taxes = preload.tax; } var taxcounter = 1; try { //поменял key на keyTax во избежанеи проблем for (var keyTax in taxes) { var taxitem = taxes[keyTax]; if (taxitem.value != '' && taxitem.value != '-1' && taxitem.cno != "" && taxitem.cno != "-1" && taxitem.cno != null && taxitem.value.length == 1 && String(taxitem.value).match(/[А-ЩЬЮЯҐЄІЇ]/i)) { xw.writeStartElement('ROW').writeAttributeString('ROWNUM', String(taxcounter)); //Код виду податку/збору (числовий): //0-ПДВ,1-Акциз,2-ПФ... xw.writeElementString('TYPE', String(taxitem.cno)); //Найменування виду податку/збору (64 символи) xw.writeElementString('NAME', taxitem.title); //Літерне позначення виду і ставки податку/збору (А,Б,В,Г,...) (1 символ) xw.writeElementString('LETTER', taxitem.value); if (taxitem.percent == '') { taxitem.percent = 0; } //Відсоток податку/збору (15.2 цифри) xw.writeElementString('PRC', CurrencyFormatted(round(taxitem.percent, 2))); //Відсоток податку/збору (15.2 цифри) xw.writeElementString('SIGN', 'false'); var sum = 0; var sumDisc = 0; var SOURCESUM = 0; try { for (var keyTaxProduct in prodTaxArr[taxitem.value]) { var pritem = prodTaxArr[taxitem.value][keyTaxProduct]; try{ if(doubleTaxAlgorithm != 1){ //Попытка сказать налогу пдв что бы он отнял от суммы акцизный налог или наоборот //поскольку тут есть информация о том что был расчитан акцизный налог if(pritem.amountDiscExciseSum > 0 && pritem.amountExciseSum > 0){ //разделяем логику на 2 части что бы точно ниче не сломалось //метод расчета сдвоенного налога (Збір на ПДВ) if(doubleTaxAlgorithm == 3){ //И налоговая ставка ПДВ if(taxitem.cno == "0" && taxitem.percent > 0){ SOURCESUM = app.main.sum(SOURCESUM, pritem.amountDiscExciseSum); } } //метод расчета сдвоенного налога (ПДВ на збір) if(doubleTaxAlgorithm == 2 ){ //налоговая ставка акциз if(taxitem.cno == "1" && taxitem.percent > 0){ SOURCESUM = app.main.sum(SOURCESUM, pritem.amountDiscExciseSum); } } } } }catch(err){ console.log("не удалось совершить расчет сдвоенного налога"); } sum = app.main.sum(sum, pritem.amount); sumDisc = app.main.sum(sumDisc, pritem.amountDisc); if (prodTaxSum[taxitem.value] == null) { prodTaxSum[taxitem.value] = 0; } prodTaxSum[taxitem.value] += pritem.amountDisc //amount prodTaxPercent[taxitem.value] = taxitem.percent; prodTaxType[taxitem.value] = taxitem.cno; } } catch (err) { console.error(err); } //Сума для розрахування податку/збору (15.2 цифри) xw.writeElementString('TURNOVER', CurrencyFormatted(round(sum, 2))); //для сдвоенного налога if(SOURCESUM > 0 && doubleTaxAlgorithm != 1){ var sssssss = round(app.main.sum(sumDisc, -SOURCESUM), 2); xw.writeElementString('SOURCESUM', CurrencyFormatted(sssssss)); var taxsum = app.main.sum(sssssss, -(round(sssssss, 2) * 100) / round(round(taxitem.percent, 2) + 100, 2)); }else{ //сума для розрахунку податка. Додано для фіксу багу від 28.12.2022 xw.writeElementString('SOURCESUM', CurrencyFormatted(sumDisc)); var taxsum = app.main.sum(sumDisc, -(round(sumDisc, 2) * 100) / round(round(taxitem.percent, 2) + 100, 2)); } //Добавил что бы сохранять налог с вычетом акциза для печати на чеке... try{ if (prodTaxSumSource[taxitem.value] == null) { prodTaxSumSource[taxitem.value] = 0; } prodTaxSumSource[taxitem.value] += taxsum //amount }catch(err){ } if (prro_userdata.taxespay == null) { prro_userdata.taxespay = {} } if (!app.main.ifobject(prro_userdata, "taxespay." + taxitem.value)) { createobj(prro_userdata, "taxespay", taxitem.value, 0); } prro_userdata.taxespay[taxitem.value] += round(taxsum, 2) xw.writeElementString('SUM', CurrencyFormatted(round(taxsum, 2))); xw.writeEndElement(); taxcounter++; } } } catch (err) { console.error(err); } xw.writeEndElement(); xw.writeStartElement('CHECKBODY'); //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; var pcount = 0; var printProducts = []; //Собираем нужный массив и убираем позиции которые не подлежат налогообложению fiscalarr.forEach(function (item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } if (item["tax"] != "" && item["tax"] != '-1') { flag = 1; pcount++; xw.writeStartElement('ROW').writeAttributeString('ROWNUM', pcount); //Внутренний код товара (64 символа, необязательный) //xw.writeElementString('CODE', '98765'); var productName = item["name"]; //Костыльчик который убирает с имени товара приставку веса try { if (item.type == "mod") { if (item.quantity == "100g" || item.quantity == "100ml") { productName = preload.products[currentsklad][item.id]["name"]; } } } catch (err) { } if (item.barcode) { xw.writeElementString('BARCODE', String(item.barcode)); } if (item.uktzed != '' && item.uktzed != null && item.uktzed != "undefined" && item.uktzed != "0") { //Код товара по УКТЗЕД (15 цифр, необязательный) xw.writeElementString('UKTZED', String(item.uktzed)); } //Наименование товара (128 символов, необязательный) xw.writeElementString('NAME', String(productName)); //Код единицы измерения согласно классификатора (5 цифр, необязательный) //xw.writeElementString('UNITCODE', '25'); var unit = { pcs: "шт.", kg: "кг.", gr: "г.", l: "л.", ml: "мл.", m2: "м.кв.", mp: "м.п.", cm: "см.", mm: "мм.", t: "т.", min: "мин." }; //Наименование единицы измерения (64 символа, необязательный) xw.writeElementString('UNITNM', String(unit[item["quantity"]])); //Количество/объём товара (15.3 цифры, необязательный) xw.writeElementString('AMOUNT', QuantityFormatted(round(item["kolvo"], 3))); if(okruglenie == 0){ var price = round(item["cenaout"],2); var priced = round(item["cenaout_discount"],2); }else{ var price = round(item["cenaout_1"],2); var priced = round(item["cenaout_discount_1"],2); } var discountSum = 0; if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { //Если скидка есть var discSum = round(multiply(priced, item["kolvo"])); } else { //Скидки нет var discSum = round(multiply(price, item["kolvo"])); } var realsum = round(multiply(price, item["kolvo"])); var razn = realsum - discSum; discountSum = round(razn, 2); //Цена за единицу товара (15.2 цифры, необязательный) xw.writeElementString('PRICE', CurrencyFormatted(round(price, 2))); //Буквенное обозначение ставки (1 символа, необязательный) try{ if(preload.tax[item["tax_id"]]["cno"] != "-1"){ //Типа если это без ПДВ то не указываем LETTERS xw.writeElementString('LETTERS', String(item["tax"])); } }catch(err){ } //Стоимость товара (15.2 цифры, необязательный) xw.writeElementString('COST', CurrencyFormatted(round(((round(price, 2)*1000)*(round(item["kolvo"], 3)*1000))/1000000))); if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { //Тип знижки/націнки (1 символ): //0–Сумова, 1–Відсоткова xw.writeElementString('DISCOUNTTYPE', "0"); //Загальна сума знижки (15.2 цифри) xw.writeElementString('DISCOUNTSUM', CurrencyFormatted(round(discountSum, 2))); } // Акцизы, по идее, тут массив быть должен console.warn('ITEM!!!!') if (item.akciz) { xw.writeStartElement('EXCISELABELS'); xw.writeStartElement('ROW').writeAttributeString('ROWNUM', '1'); xw.writeElementString('EXCISELABEL', item.akciz); xw.writeEndElement(); xw.writeEndElement(); } xw.writeEndElement(); try{ //Товар на печать printProducts.push({ name:productName, unit:unit[item["quantity"]], kolvo:QuantityFormatted(round(item["kolvo"], 3)), cenaout:price, tax:item["tax"], uktzed:item["uktzed"], discSum:discountSum, akciz: item.akciz, barcode: item.barcode ? item.barcode : '', akciz: item.akciz ? item.akciz : '' }) }catch(err){ } } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } kostilsumm = kostilsumm + amount; } }); var dali = thisbasket["info"]["cash"]; if (thisbasket["info"]["nall"] > 0) { dali = thisbasket["info"]["nall"] } //Отнимаем от суммы которую дал клиент сумму товара который не пошел на печать на фискальник dali = dali - kostilsumm; if (kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы онлайн кассе"); } xw.writeEndElement(); var xml = xw.flush(); xw.close(); //clean the writer xw = undefined; //don't let visitors use it, it's closed console.log("xml", xml); try { //Хрень чисто для отладки //var xmlDOM = new DOMParser().parseFromString(xml, 'text/xml'); //console.log("xml", xml2json(xmlDOM)); } catch (err) { } //Подписываем чек продажи $this.ql.subscribe(xml, userid).then(function (signed) { //console.log("signed",signed) /////ТУТ БЫЛ ЗАПРОС //Отправляем чек продажи $this.ExecuteCommand("doc", signed).then(function (res) { if (res.dfsresult != null) { thisbasket.info.rrodata = { status:"taxed", taxNumber:res.dfsresult.TICKET.ORDERTAXNUM, rroSerialNum:rroSerialNum, deviceId:deviceItem.id, totalSum:thisbasket.info.allcena, electronSum:thisbasket.info.visa, cashSum:thisbasket.info.cash, rroResponse:res.dfsresult }; app.main.message("Фіскальний чек №" + res.dfsresult.TICKET.ORDERTAXNUM + " успішно прийнятий"); } //Если прошло успешно то записываем инфу о том что суммы поменялись (нужно для закытия смены) try { //Загальна сума реалізації prro_userdata.salesum += round(thisbasket.info.allcena, 2); } catch (err) { console.error(err); } try { //Кількість чеків prro_userdata.salecount += 1; } catch (err) { console.error(err); } try { //Выручка за наличные if (thisbasket.info.cash > 0) { prro_userdata.cash += round(thisbasket.info.cash, 2); } } catch (err) { console.error(err); } try { //Выручка по безналу if (thisbasket.info.visa > 0) { prro_userdata.electron += round(thisbasket.info.visa, 2); } } catch (err) { console.error(err); } try { //Записываем по налогам for (var key in prodTaxSum) { var t = prodTaxSum[key]; if (prro_userdata.taxes == null) { prro_userdata.taxes = {} } if (!app.main.ifobject(prro_userdata, "taxes." + key)) { createobj(prro_userdata, "taxes", key, 0); } prro_userdata.taxes[key] += t; } } catch (err) { console.error(err); } console.log("prro_userdata.taxes", prro_userdata.taxes) try { //Записываем в памяьб localStorage["currentShift"] = JSON.stringify(prro_userdata); } catch (err) { } try{ //electron_windowssystem_printer //electron_escpos_ethernet //electron_escpos_usb //electron_escpos_bluetooth // printserver_windows_1808 try{ var connection = deviceItem.settings.printerData.connectionParams.usb; }catch(err){ } try{ var logotype = deviceItem.settings.printerData.printParams.additionalPrintParams.logo; }catch(err){ var logotype = ""; } var qrcode = ""; var qrBlock = document.getElementById("qrcodetempcontainer"); new Promise(function(resolve,reject) { try{ qrBlock.innerHTML = ""; var receiptDate = res.dfsresult.TICKET.ORDERDATE; var receiptDateFix = receiptDate[4]+receiptDate[5]+receiptDate[6]+receiptDate[7] +"-"+receiptDate[2]+receiptDate[3]+"-"+receiptDate[0]+receiptDate[1]; new QRCode("qrcodetempcontainer", { text: "https://cabinet.tax.gov.ua/cashregs/check?id=" + res.dfsresult.TICKET.ORDERTAXNUM + "&date=" + receiptDateFix + "&type=3&fn=" + rroSerialNum+"&time="+res.dfsresult.TICKET.ORDERTIME+"&sm="+thisbasket.info.rrodata.totalSum, width: 180, height: 180, colorDark : "#000000", colorLight : "#ffffff", correctLevel : QRCode.CorrectLevel.M }); }catch(err){ //console.error(err) } setTimeout(function(){ var qrUrl = qrBlock.children[0].toDataURL("image/png"); console.log(qrUrl) var base64Url; try { qrcode = qrUrl.split("data:image/png;base64,")["1"]; console.log(base64Url) } catch (err) { console.log(err) } resolve() }, 500) }).then(function(){ try{ var systemPrinterValue = deviceItem.settings.printerData.connectionParams.systemPrinter; }catch(err){ var systemPrinterValue = ""; } try{ var ipAdress = deviceItem.settings.printerData.connectionParams.ip; }catch(err){ var ipAdress = ""; } try{ var macAdress = deviceItem.settings.printerData.connectionParams.mac; }catch(err){ var macAdress = ""; } try{ if(deviceItem.settings.printerData.printParams.codepage == null){ deviceItem.settings.printerData.printParams.codepage = "0" } }catch(err){ } var bankpaymentobj = {}; console.warn('thisbasket["info"]["bankingData"]>>>>>', thisbasket["info"]["bankingData"]); if (thisbasket["info"]["bankingData"]) { try{ if(thisbasket["info"]["bankingData"]["commission"]){ bankpaymentobj["fee"] = thisbasket["info"]["bankingData"]["commission"]; //Комиссия банка (в случае наличия) } }catch(err){ } try { if (thisbasket["info"]["bankingData"].isSignature) { bankpaymentobj.isSignature = thisbasket["info"]["bankingData"].isSignature; } } catch(err) { } try{ if(thisbasket["info"]["bankingData"]["rrn"]){ bankpaymentobj["rrn"] = thisbasket["info"]["bankingData"]["rrn"]; //RRN (Reference Retrieval Number) платежа } }catch(err){ } try { if (thisbasket["info"]["bankingData"].issuerName) { bankpaymentobj.issuerName = thisbasket["info"]["bankingData"].issuerName; } } catch(err) { } try{ if(thisbasket["info"]["bankingData"]["bankName"]){ bankpaymentobj.bankName = thisbasket["info"]["bankingData"]["bankName"]; //Название банка } }catch(err){ } try{ if(thisbasket["info"]["bankingData"]["cardNumber"]){ bankpaymentobj.cardNumber = thisbasket["info"]["bankingData"]["cardNumber"]; //Номер карты клиента } }catch(err){ } try{ if(thisbasket["info"]["bankingData"]["authorizationCode"]){ bankpaymentobj.authorizationCode = thisbasket["info"]["bankingData"]["authorizationCode"]; //Код авторизации платежа } }catch(err){ } try{ if(thisbasket["info"]["bankingData"]["terminalID"]){ bankpaymentobj.terminalID = thisbasket["info"]["bankingData"]["terminalID"]; //Номер платежного терминала } }catch(err){ } } //Печать, первая попытка try{ app.print.protocols[deviceItem.settings.connectionParams.printerProtocol]({ uaprro:true, info:{ allcena: CurrencyFormatted(round(thisbasket.info.allcena, 2)), cash: thisbasket.info.cash > 0 ? CurrencyFormatted(round(thisbasket.info.cash, 2)) : "", //client: "0", //coupon: 0, date: cdate[2] +"-"+ cdate[1] +"-"+ cdate[0], //discount: "0", //discounttitle: "Без скидки", nall: thisbasket.info.nall != '' ? CurrencyFormatted(round(thisbasket.info.nall, 2)) : thisbasket.info.cash, sdacha: CurrencyFormatted(round(thisbasket.info.sdacha, 2)), //servicecash: "0", summ: CurrencyFormatted(round(thisbasket.info.summ, 2)), time: thisbasket.info.time, type: "check", visa: CurrencyFormatted(round(thisbasket.info.visa, 2)), fiscalNumber:res.dfsresult.TICKET.ORDERTAXNUM, rroNum:rroSerialNum, companyName:CompanyName, pointAdress:PointAdress, pointName:PointName, IPN:IPN, IID:IID, qrcode:qrcode, roundsum:-roundsum, localNumber:localNumber, cashRegisterNum:cashRegisterNum }, printer:{ buffer: deviceItem.settings.printerData.printParams.buffer != null ? deviceItem.settings.printerData.printParams.buffer : "", charset: deviceItem.settings.printerData.printParams.charset, checks: "3", data: '{"chineseOff":"0","systemPrinter":"'+systemPrinterValue+'"}', feed: deviceItem.settings.printerData.indents.feedBottom, fontsize: deviceItem.settings.printerData.sizes.font, ip: ipAdress, mac:macAdress, logo: logotype, manufacturer: "other", parallel: deviceItem.settings.printerData.printParams.parallel, connection: connection, mode: String(deviceItem.settings.printerData.printParams.printMode), protocol: deviceItem.settings.connectionParams.printerProtocol, size: deviceItem.settings.printerData.sizes.size, width:deviceItem.settings.printerData.sizes.width, header: deviceItem.settings.printerData.additionalPrintParams.header, footer: deviceItem.settings.printerData.additionalPrintParams.footer, systemPrinter: systemPrinterValue, type: "printer", codepage: deviceItem.settings.printerData.printParams.codepage }, products:printProducts, prodTax:{ prodTaxSumSource:prodTaxSumSource, prodTaxSum:prodTaxSum, prodTaxPercent:prodTaxPercent, prodTaxType:prodTaxType }, bankData: bankpaymentobj }); }catch(err){ console.error(err) } }) }catch(err){ console.error(err) } resolve(res) }).catch(function (err) { reject(err) }) }) } else { alert("ПРРО: Не знайдено поточної фіскальної зміни, відкрийте фіскальну зміну"); app.main.opensmenaask(); $("#opennewsmenanow").off(); $("#opennewsmenanow").on('click', function(){ $("#opennewsmenanow").attr("disabled", true); app.main.loader("show"); app.print.print.opensmena().then(function(success) { console.warn('success!!!!!!', success); $('#openSmenaAskBox').animateCss('fadeOutDown', function() { $('#openSmenaAskBox').hide(); }); }, function(error) { // console.error(error); app.main.loader("hide"); $("#opennewsmenanow").attr("disabled", false); app.main.error("Не выполнена фискальная операция открытия смены"); $("#sendtranzakciu").attr("disabled", false); $('#openSmenaAskBox').animateCss('fadeOutDown', function() { $('#openSmenaAskBox').hide(); }); }); }) reject(); } }).catch(function (err) { console.error(err); if(err.text){ app.main.error(err.text) } reject(err); }) }) }).catch(function (err) { app.main.error(err); $this.ql.openUploadDialog(); }) }, 0, thisbasket); }) }, printCopyCheck: function(data) { //1 - ПДВ і збір окремо //2 - ПДВ на збір //3 - Збір на ПДВ var doubleTaxAlgorithm = 3; //Если в настройках указано алгоритм двойного налога if(doubleTaxAlgorithm == 2 || doubleTaxAlgorithm == 3){ //Обьект из которого можно получить данные о налоге по букве var taxLetterObj = {}; for (var keyLetter in preload.tax) { var taxitemObj = preload.tax[keyLetter]; taxLetterObj[taxitemObj["value"]] = taxitemObj; } } console.warn('printCopyCheck DATA', data); var devices = app.print.modules.getdevice(); console.log('+++++++devices+++++++', devices); // var thisbasket = {printer: devices[0], ...data}; //Object.assign(devices, history); // console.warn('this baskert !!! >>', thisbasket); var thisbasket = { //printer: devices[0], IsFiscalCheck: data.IsFiscalCheck, info: data.info, products: data.products, type: data.type } for (var di = 0; di < devices.length; di++) { console.warn('di device', devices[di]); if (devices[di].protocol == 'uaprro' || devices[di].protocol == 'uaprro_testdublefix') { thisbasket.printer = devices[di]; } } console.log('thisbasket >>>>>', thisbasket); var deviceItem = thisbasket.printer; try { var fiscalReceiptData = thisbasket.info.rrodata != null ? thisbasket.info.rrodata : {}; } catch(err) {} //var f iscalSettings = deviceItem.settings.f iscalSettings; var tradepoint_id = deviceItem.sklad; var tradepoint = preload.sklad[tradepoint_id]; var tradepointName = tradepoint.title; var tradepointAddr = tradepoint.adress; var cdate = thisbasket.info.date.split('-'); //TODO5 var fiscalSettings = thisbasket.printer.settings.fiscalSettings; console.warn(' deviceItem.settings ++++', deviceItem.settings) try{ var systemPrinterValue = deviceItem.settings.printerData.connectionParams.systemPrinter; }catch(err){ var systemPrinterValue = ""; } try{ var ipAdress = deviceItem.settings.printerData.connectionParams.ip; }catch(err){ var ipAdress = ""; } try{ var macAdress = deviceItem.settings.printerData.connectionParams.mac; }catch(err){ var macAdress = ""; } try{ if(deviceItem.settings.printerData.printParams.codepage == null){ deviceItem.settings.printerData.printParams.codepage = "0" } }catch(err){ } try{ var logotype = deviceItem.settings.printerData.printParams.additionalPrintParams.logo; }catch(err){ var logotype = ""; } try{ var connection = deviceItem.settings.printerData.connectionParams.usb; }catch(err){ } var roundsum = 0; var discountsum = 0; var fiscalarr = $.map(thisbasket["products"], function (value, index) { return [value]; }); var sum0 = 0; var sum2 = 0; console.warn('fiscal arr===>', fiscalarr); var printProducts = []; var prodTaxArr = {}; var prodTaxSum = {}; var prodTaxPercent = {}; var prodTaxSumSource = {}; var prodTaxType = {}; try { fiscalarr.forEach(function (item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } //item.rroitemdata.taxValue Можно и с истории брать значение и подставлять что бы ничего не ломалось if (item["tax"] != "" && item["tax"] != '-1' && item.rroitemdata.status == "taxed") { if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { discountsum = discountsum + round((item["cenaout"] - item["cenaout_discount"])* item["kolvo"],2); item["amount"] = item["cenaout"] * item["kolvo"]; item["amount2"] = item["cenaout_discount"] * item["kolvo"]; } else { item["amount"] = item["cenaout_discount"] * item["kolvo"]; item["amount2"] = item["cenaout"] * item["kolvo"]; } sum0 = sum0 + item["amount2"]; sum2 = sum2 + item["amount"]; try { roundsum = CurrencyFormatted(sum0-fiscalReceiptData.totalSum); } catch(err) { roundsum = 0; } //Если используем 2 буквы налога if (item["tax"].length == 2) { var splitters = item["tax"].split(""); for(var key in splitters) { var letter = splitters[key]; try{ if(doubleTaxAlgorithm != 1){ //Если в настройках указано алгоритм двойного налога //Тут нам надо добавить метки что это допустим был товар с сдвоенным налогом //Альтернативная версия что надо расчитать акциз сдесь, отнять от суммы товара для пдв if(taxLetterObj[letter]){ //Если это акциз то надо считать сумму для этого товара //Если активирован Збір на ПДВ if((taxLetterObj[letter]["cno"] == "1" && doubleTaxAlgorithm == 3) || taxLetterObj[letter]["cno"] == "0" && doubleTaxAlgorithm == 2){ //item["amountDiscExciseSum"] = app.main.sum(item.amountDisc, -(round(item.amountDisc, 2) * 100) / round(round(taxLetterObj[letter]["percent"], 2) + 100, 2)); item["amountExciseSum"] = app.main.sum(item.amount, -(round(item.amount, 2) * 100) / round(round(taxLetterObj[letter]["percent"], 2) + 100, 2)); //возможно что-то из этого не нужно } } } }catch(err){ console.log("Не вдалось використати подвоєний податок") } if (prodTaxArr[letter]) { prodTaxArr[letter].push(item); } else { prodTaxArr[letter] = []; prodTaxArr[letter].push(item); } } } if (prodTaxArr[item["tax"]]) { prodTaxArr[item["tax"]].push(item); } else { prodTaxArr[item["tax"]] = []; prodTaxArr[item["tax"]].push(item); } console.log('prodTaxArr>>>', prodTaxArr); } }); } catch(err) { console.log('fiscalarr.forEach', err); } try { var taxes = []; //Если в настройках указано алгоритм двойного налога то нам надо отсортировать налоги в правильном порядке if(doubleTaxAlgorithm != 1){ try{ for(var keyTaxItem in preload.tax){ var thisTax = preload.tax[keyTaxItem]; //ПДВ на збір (сначала пдв потом акциз) if(doubleTaxAlgorithm == 2){ //Акцизы добавляем в конец if(thisTax.cno == "1"){ taxes.push(thisTax); } //ПДВ добавляем в начало if(thisTax.cno == "0"){ taxes.unshift(thisTax); } } //Збір на ПДВ (сначала акциз потом пдв) if(doubleTaxAlgorithm == 3){ //Акцизы добавляем в начало if(thisTax.cno == "1"){ taxes.unshift(thisTax); } //ПДВ добавляем в конец if(thisTax.cno == "0"){ taxes.push(thisTax); } } } }catch(err){ console.log("не удалось отсортировать налоги по doubleTaxAlgorithm") } }else{ taxes = preload.tax; } var taxcounter = 1; for (var key in taxes) { var taxitem = taxes[key]; if (taxitem.value != '' && taxitem.value != '-1' && taxitem.cno != "" && taxitem.cno != "-1" && taxitem.cno != null && taxitem.value.length == 1 && String(taxitem.value).match(/[А-ЩЬЮЯҐЄІЇ]/i)) { if (taxitem.percent == '') { taxitem.percent = 0; } var sum = 0; var SOURCESUM = 0; try { console.warn('prodTaxArr переюор суммы>>>', prodTaxArr); for (var key in prodTaxArr[taxitem.value]) { var pritem = prodTaxArr[taxitem.value][key]; try{ if(doubleTaxAlgorithm != 1){ //Попытка сказать налогу пдв что бы он отнял от суммы акцизный налог или наоборот //поскольку тут есть информация о том что был расчитан акцизный налог if(pritem.amountExciseSum > 0){ //разделяем логику на 2 части что бы точно ниче не сломалось //метод расчета сдвоенного налога (Збір на ПДВ) if(doubleTaxAlgorithm == 3){ //И налоговая ставка ПДВ if(taxitem.cno == "0" && taxitem.percent > 0){ SOURCESUM = app.main.sum(SOURCESUM, pritem.amountExciseSum); } } //метод расчета сдвоенного налога (ПДВ на збір) if(doubleTaxAlgorithm == 2 ){ //налоговая ставка акциз if(taxitem.cno == "1" && taxitem.percent > 0){ SOURCESUM = app.main.sum(SOURCESUM, pritem.amountExciseSum); } } } } }catch(err){ console.log("не удалось совершить расчет сдвоенного налога"); } console.warn('pritem sssss ==>', pritem) sum = app.main.sum(sum, pritem.amount); if (prodTaxSum[taxitem.value] == null) { prodTaxSum[taxitem.value] = 0; } prodTaxSum[taxitem.value] += pritem.amount prodTaxPercent[taxitem.value] = taxitem.percent; prodTaxType[taxitem.value] = taxitem.cno; } } catch (err) { console.error(err); } //для сдвоенного налога if(SOURCESUM > 0 && doubleTaxAlgorithm != 1){ var sssssss = round(app.main.sum(sum, -SOURCESUM), 2); var taxsum = app.main.sum(sssssss, -(round(sssssss, 2) * 100) / round(round(taxitem.percent, 2) + 100, 2)); }else{ //Сума для розрахування податку/збору (15.2 цифри) var taxsum = app.main.sum(sum, -(round(sum, 2) * 100) / round(round(taxitem.percent, 2) + 100, 2)) } //Добавил что бы сохранять налог с вычетом акциза для печати на чеке... try{ if (prodTaxSumSource[taxitem.value] == null) { prodTaxSumSource[taxitem.value] = 0; } prodTaxSumSource[taxitem.value] += taxsum //amount }catch(err){ } if (prro_userdata.returntaxespay == null) { prro_userdata.returntaxespay = {} } if (!app.main.ifobject(prro_userdata, "returntaxespay." + taxitem.value)) { createobj(prro_userdata, "returntaxespay", taxitem.value, 0); } prro_userdata.returntaxespay[taxitem.value] += round(taxsum, 2) taxcounter++; } } } catch (err) { console.log('var key in taxes', err) } thisbasket.products.forEach(function (item) { try { //var discountsum = round((item["cenaout"] - item["cenaout_discount"])* item["kolvo"],2); //Товар на печать printProducts.push({ name: item.name,//productName, unit: item.quantity,//unit[item["quantity"]], kolvo: QuantityFormatted(round(item.kolvo, 3)), cenaout: item.cenaout, tax:item.tax, uktzed:item.uktzed, discSum: discountsum, barcode: item.rroitemdata.barcode, akciz: item.rroitemdata.excise }) } catch(err){ } }) console.warn('fiscalSettings!!!!!', fiscalSettings); var qrcode = ""; var qrBlock = document.getElementById("qrcodetempcontainer"); new Promise(function(resolve,reject) { try { qrBlock.innerHTML = ""; var receiptDate = thisbasket.info.rrodata.rroResponse.TICKET.ORDERDATE; var receiptDateFix = receiptDate[4]+receiptDate[5]+receiptDate[6]+receiptDate[7] +"-"+receiptDate[2]+receiptDate[3]+"-"+receiptDate[0]+receiptDate[1]; new QRCode("qrcodetempcontainer", { text: "https://cabinet.tax.gov.ua/cashregs/check?id=" + thisbasket.info.rrodata.rroResponse.TICKET.ORDERTAXNUM + "&date=" + receiptDateFix + "&type=3&fn=" + thisbasket.info.rrodata.rroSerialNum+"&time="+thisbasket.info.rrodata.rroResponse.TICKET.ORDERTIME+"&sm="+thisbasket.info.rrodata.totalSum, width: 180, height: 180, colorDark : "#000000", colorLight : "#ffffff", correctLevel : QRCode.CorrectLevel.M }); } catch(err){ console.log('QR err', err) } setTimeout(function(){ var qrUrl = qrBlock.children[0].toDataURL("image/png"); console.log(qrUrl) var base64Url; try { qrcode = qrUrl.split("data:image/png;base64,")["1"]; console.log(base64Url) } catch (err) { console.log(err) } resolve() }, 500) }).then(function() { try { console.warn('deviceItem+++++++++>>>>', deviceItem); app.print.protocols[deviceItem.settings.connectionParams.printerProtocol]({// copyCheck: true, uaprro:true, info:{ allcena: CurrencyFormatted(round(thisbasket.info.allcena, 2)), cash: thisbasket.info.cash > 0 ? CurrencyFormatted(round(thisbasket.info.cash, 2)) : "", date: cdate[2] +"-"+ cdate[1] +"-"+ cdate[0], nall: thisbasket.info.nall > 0 ? CurrencyFormatted(round(thisbasket.info.nall, 2)) : "", sdacha: CurrencyFormatted(round(thisbasket.info.sdacha, 2)), //servicecash: "0", summ: CurrencyFormatted(round(thisbasket.info.summ, 2)), time: thisbasket.info.time, type: "check", visa: CurrencyFormatted(round(thisbasket.info.visa, 2)), fiscalNumber: thisbasket.info.rrodata != null ? thisbasket.info.rrodata.rroResponse.TICKET.ORDERTAXNUM : '', rroNum: thisbasket.info.rrodata != null ? thisbasket.info.rrodata.rroSerialNum : '', companyName: fiscalSettings.uaprroORGNM, pointAdress: fiscalSettings.uaprroPOINTADDR, pointName: fiscalSettings.uaprroPOINTNM, IPN: fiscalSettings.uaprroIPN, IID: fiscalSettings.uaprroTIN, qrcode: qrcode, roundsum:-roundsum, localNumber: thisbasket.info.rrodata != null ? thisbasket.info.rrodata.rroResponse.TICKET.ORDERNUM : '', cashRegisterNum: fiscalSettings.uaprroCASHDESKNUM, }, printer:{ buffer: deviceItem.settings.printerData.printParams.buffer != null ? deviceItem.settings.printerData.printParams.buffer : "",// charset: deviceItem.settings.printerData.printParams.charset,// checks: "3", data: '{"chineseOff":"0","systemPrinter":"'+systemPrinterValue+'"}', feed: deviceItem.settings.printerData.indents.feedBottom,// fontsize: deviceItem.settings.printerData.sizes.font,// ip: ipAdress, mac:macAdress, logo: logotype, manufacturer: "other", parallel: deviceItem.settings.printerData.printParams.parallel,// connection: connection, mode: deviceItem.settings.printerData.printParams.printMode,// protocol: deviceItem.settings.connectionParams.printerProtocol,// size: deviceItem.settings.printerData.sizes.size,// width:deviceItem.settings.printerData.sizes.width,// header: deviceItem.settings.printerData.additionalPrintParams.header,// footer: deviceItem.settings.printerData.additionalPrintParams.footer,// systemPrinter: systemPrinterValue, type: "printer", codepage: deviceItem.settings.printerData.printParams.codepage// }, products:printProducts, prodTax:{ prodTaxSumSource:prodTaxSumSource, prodTaxSum: prodTaxSum, prodTaxPercent: prodTaxPercent, prodTaxType: prodTaxType }, bankData: thisbasket.info.bankingData ? JSON.parse(thisbasket.info.bankingData) : {} }); } catch(err) { console.error(err) } }) }, vozvrat: function(thisbasket) { var roudOrderSum = 0; //1 - ПДВ і збір окремо //2 - ПДВ на збір //3 - Збір на ПДВ var doubleTaxAlgorithm = 3; //Если в настройках указано алгоритм двойного налога if(doubleTaxAlgorithm == 2 || doubleTaxAlgorithm == 3){ //Обьект из которого можно получить данные о налоге по букве var taxLetterObj = {}; for (var keyLetter in preload.tax) { var taxitemObj = preload.tax[keyLetter]; taxLetterObj[taxitemObj["value"]] = taxitemObj; } } function runroundcheck(f_allcena, newcena){ var f1 = (100 / f_allcena) * (newcena); //Остаток от изначальной цены в процентах var outposition = 0; var summsoskidkoi = 0; for (key in thisbasket["products"]) { if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { //Со скидкой thisbasket["products"][key]["discount_zazor"] = (thisbasket["products"][key]["cenaout_discount"] - CurrencyFormatted((thisbasket["products"][key]["cenaout_discount"]/100)*f1)) * thisbasket["products"][key]["kolvo"]; summsoskidkoi = summsoskidkoi + (thisbasket["products"][key]["cenaout_discount"] + thisbasket["products"][key]["discount_zazor"]) * thisbasket["products"][key]["kolvo"]; }else{ //Без скидки thisbasket["products"][key]["cenaout_zazor"] = (thisbasket["products"][key]["cenaout"] - (thisbasket["products"][key]["cenaout"] / 100) * f1) * thisbasket["products"][key]["kolvo"]; summsoskidkoi = summsoskidkoi + (thisbasket["products"][key]["cenaout"] + thisbasket["products"][key]["cenaout_zazor"]) * thisbasket["products"][key]["kolvo"]; } outposition = key; } if (thisbasket.customReturn) { if (thisbasket["products"][key]["cenaout_discount_1"] != null) { thisbasket["products"][key]["cenaout_discount"] = thisbasket["products"][key]["cenaout_discount_1"]; } thisbasket["products"][key]["cenaout_discount_1"] = CurrencyFormatted((thisbasket["products"][key]["cenaout_discount"])); thisbasket["products"][key]["cenaout_1"] = CurrencyFormatted((thisbasket["products"][key]["cenaout"])); } var ostatok = round((thisbasket["info"]["allcena"] / 100) * f1, 2) - summsoskidkoi; roudOrderSum = round((thisbasket["info"]["allcena"] / 100) * f1, 2); //Закидіваем остаток который округлился в последнюю позицию if(ostatok != null && ostatok != undefined){ if(ostatok > 0 || ostatok < 0){ thisbasket["products"][outposition]["cenaout_zazor"] = parseFloat(thisbasket["products"][outposition]["cenaout_zazor"] + ostatok); } } } var $this = this; console.warn('vozvrat basket!!!!!>>', thisbasket); return new Promise(function (resolve, reject) { if (thisbasket.customReturn) { runroundcheck(thisbasket["info"]["allcena"], round(thisbasket["info"]["allcena"],1)); $("#returFiscalInputBox").show().animateCss("fadeInUp"); $("#returnFiskalNumBTN").off(); $("#returnFiskalNumBTN").on('click', function() { var fiscalNumInput = $('#fiscalInput').val(); if(thisbasket.info.discount <= 0 || thisbasket.info.discount == undefined || thisbasket.info.discount == null){ thisbasket.info.discount = 0; } if (fiscalNumInput != '') { thisbasket.info.fiscalNumber = fiscalNumInput; thisbasket.info.rrodata = { totalSum: roudOrderSum, cashSum: roudOrderSum, } for (var key in thisbasket.products) { var item = thisbasket.products[key]; item.rroitemdata = { status : "taxed" } } $('#returFiscalInputBox').hide(); console.error("newroundthisbasket",thisbasket) resolve(thisbasket); } else { console.log('Ошибка не указан фискальный чек'); } }) } else { resolve(thisbasket); } }).then(function(thisbasket){ var deviceItem = thisbasket.printer; var fiscalReceiptData = thisbasket.info.rrodata; //var f iscalSettings = deviceItem.settings.f iscalSettings; var tradepoint_id = deviceItem.sklad; var tradepoint = preload.sklad[tradepoint_id]; var tradepointName = tradepoint.title; var tradepointAddr = tradepoint.adress; var cdate = thisbasket.info.date.split('-'); //TODO5 var fiscalSettings = thisbasket.printer.settings.fiscalSettings; var prodTaxPercent = {}; var prodTaxType = {}; var localNumber = ""; var cashRegisterNum = ""; try{ var connection = deviceItem.settings.printerData.connectionParams.usb; }catch(err){ } var roundsum = 0; var crutchOkruglenie = okruglenie; app.main.loader("show"); var rroSerialNum = fiscalSettings.uaprroCASHREGISTERNUM; return new Promise(function (resolve, reject) { setTimeout(function (thisbasket) { //Этот костыль нужен для того чтобы запустить спинер var userid = thisbasket.info.user; //Извлекаем информацию из сертификата $this.ql.getUserECPData(userid).then(function (certData) { //console.warn("certData", certData); //Подписываем документ получения статуса РРО $this.ql.subscribe(JSON.stringify({ Command: "TransactionsRegistrarState", NumFiscal: rroSerialNum }), userid).then(function (signed) { //Отправляем документ получения статуса РРО $this.ExecuteCommand("cmd", signed).then(function (ereceiptStatus) { //Если смена открыта if (ereceiptStatus.ShiftState == 1) { //Создаем документ продажи var xw = new XMLWriter('windows-1251'); xw.writeStartDocument(); xw.writeStartElement('CHECK').writeAttributeString('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance').writeAttributeString('xsi:noNamespaceSchemaLocation', 'check01.xsd'); xw.writeStartElement('CHECKHEAD'); //Тип документа(Числовой, обязательный): 0-Фіскальний чек, 1-Відкриття зміни, 2-Закриття зміни xw.writeElementString('DOCTYPE', '0'); //Расширенный тип документа(Числовой, обязательный) //Для DOCTYPE=0: 0-Касовий чек на товари (послуги), 1-Видатковий чек, 2-Чек операції «службове внесення», 3-Чек операції «службова видача»--> //Для DOCTYPE!=0: 0 xw.writeElementString('DOCSUBTYPE', '1'); //Уникальный идентификатор документа (GUID, обязательный) xw.writeElementString('UID', app.print.modules.guid()); if (fiscalSettings.uaprroTIN != '') { //ЕДРПОУ/ДРФО/№ паспорта продавца (10 символов, обязательный) xw.writeElementString('TIN', fiscalSettings.uaprroTIN); } else if (certData.DRFO != '' && certData.DRFO != null) { //ЕДРПОУ/ДРФО/№ паспорта продавца (10 символов, обязательный) xw.writeElementString('TIN', certData.DRFO); } if (fiscalSettings.uaprroIPN != '' && fiscalSettings.uaprroIPN != null) { //ИНН продавца (12 символов, необязательный) xw.writeElementString('IPN', fiscalSettings.uaprroIPN); } else if (certData.DRFO != '' && certData.DRFO != null) { //ИНН продавца (12 символов, необязательный) //xw.writeElementString('IPN', certData.DRFO); } if (fiscalSettings.uaprroORGNM != "") { //Наименование продавца (256 символов, обязательный) xw.writeElementString('ORGNM', fiscalSettings.uaprroORGNM); //preload.settings.companyname } else if (preload.settings.companyname != '') { //Наименование продавца (256 символов, обязательный) xw.writeElementString('ORGNM', preload.settings.companyname); //preload.settings.companyname } else { alert("Не вказано найменування організації"); reject(); } if (fiscalSettings.uaprroPOINTNM != '') { //Наименование точки продаж (256 символов, обязательный) xw.writeElementString('POINTNM', fiscalSettings.uaprroPOINTNM); } else if (tradepointName != '') { //Наименование точки продаж (256 символов, обязательный) xw.writeElementString('POINTNM', tradepointName); } else { alert("Не вказано найменування точки продаж"); reject(); } if (fiscalSettings.uaprroPOINTADDR != '') { //Адрес точки продаж (256 символов, обязательный) xw.writeElementString('POINTADDR', fiscalSettings.uaprroPOINTADDR); } else if (tradepointAddr != '') { //Адрес точки продаж (256 символов, обязательный) xw.writeElementString('POINTADDR', tradepointAddr); } else { alert("Не вказано адресу торгової точки"); reject(); } //Дата операции (ддммгггг, обязательный) xw.writeElementString('ORDERDATE', (function () { var d = new Date(); var dd = d.getDate(); if (dd < 10) dd = '0' + dd; var mm = d.getMonth() + 1; if (mm < 10) mm = '0' + mm; var yy = d.getFullYear(); return dd + '' + mm + '' + yy; })()); //Время операции (ччммсс, обязательный) xw.writeElementString('ORDERTIME', (function () { var d = new Date() var hh = d.getHours(); if (hh < 10) hh = '0' + hh; var mm = d.getMinutes(); if (mm < 10) mm = '0' + mm; var ss = d.getSeconds(); if (ss < 10) ss = '0' + ss; return hh + '' + mm + '' + ss; })()); //Порядковый номер документа (128 символов, обязательный) xw.writeElementString('ORDERNUM', String(ereceiptStatus.NextLocalNum)); //Фискальный номер документа (128 символов, необязательный) //xw.writeElementString('ORDERTAXNUM', '101234567890123'); //Номер кассы (64 символа, обязательный) if (fiscalSettings.uaprroCASHDESKNUM == null || fiscalSettings.uaprroCASHDESKNUM == '') { alert("Не вказано порядковий номер каси"); reject(); } xw.writeElementString('CASHDESKNUM', fiscalSettings.uaprroCASHDESKNUM); if (rroSerialNum == null || rroSerialNum == '') { alert("Не вказано фіскальний номер каси"); reject(); } //Фискальный номер регистратора расчётных операций (128 символов, необязательный) xw.writeElementString('CASHREGISTERNUM', rroSerialNum); //Фіскальний номер чека, для якого здійснюється повернення (зазначається тільки для чеків повернення) (128 символів) try{ if(fiscalReceiptData.taxNumber){ xw.writeElementString('ORDERRETNUM', fiscalReceiptData.taxNumber); } else { xw.writeElementString('ORDERRETNUM', thisbasket.info.fiscalNumber); } }catch(err){ } var cashierName = "Касир"; try{ cashierName = certData.commonName; //preload.users[currentsklad][userid]["user_name"] }catch(err){ } //ФИО кассира (128 символов, обязательный) xw.writeElementString('CASHIER', cashierName); // certData.commonName //Версия документа (Числовой, обязательный) xw.writeElementString('VER', '1'); if(localStorage.prroTesting) { xw.writeElementString('TESTING', "true"); } xw.writeEndElement(); //Підсумок по чеку xw.writeStartElement('CHECKTOTAL'); var discountsum = 0; var sum0 = 0; var sum2 = 0; var fiscalarr = $.map(thisbasket["products"], function (value, index) { return [value]; }); var prodTaxArr = {}; var prodTaxSumSource = {}; var prodTaxSum = {}; try { //Тут нам надо скалькулировать налоги fiscalarr.forEach(function (item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } //item.rroitemdata.taxValue Можно и с истории брать значение и подставлять что бы ничего не ломалось if (item["tax"] != "" && item["tax"] != '-1' && item.rroitemdata.status == "taxed") { if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { discountsum = discountsum + round((item["cenaout"] - item["cenaout_discount"])* item["kolvo"],2); item["amount"] = item["cenaout"] * item["kolvo"]; item["amount2"] = item["cenaout_discount"] * item["kolvo"]; } else { console.warn('item["cenaout_discount"]', item["cenaout_discount"]) item["amount"] = item["cenaout_discount"] * item["kolvo"]; item["amount2"] = item["cenaout"] * item["kolvo"]; } sum0 = sum0 + item["amount2"]; sum2 = sum2 + item["amount"]; //Если используем 2 буквы налога if(item["tax"].length == 2){ var splitters = item["tax"].split(""); for(var key in splitters){ var letter = splitters[key]; try{ if(doubleTaxAlgorithm != 1){ //Если в настройках указано алгоритм двойного налога //Тут нам надо добавить метки что это допустим был товар с сдвоенным налогом //Альтернативная версия что надо расчитать акциз сдесь, отнять от суммы товара для пдв if(taxLetterObj[letter]){ //Если это акциз то надо считать сумму для этого товара //Если активирован Збір на ПДВ if((taxLetterObj[letter]["cno"] == "1" && doubleTaxAlgorithm == 3) || taxLetterObj[letter]["cno"] == "0" && doubleTaxAlgorithm == 2){ //item["amountDiscExciseSum"] = app.main.sum(item.amountDisc, -(round(item.amountDisc, 2) * 100) / round(round(taxLetterObj[letter]["percent"], 2) + 100, 2)); item["amountExciseSum"] = app.main.sum(item.amount, -(round(item.amount, 2) * 100) / round(round(taxLetterObj[letter]["percent"], 2) + 100, 2)); //возможно что-то из этого не нужно } } } }catch(err){ console.log("Не вдалось використати подвоєний податок") } if (prodTaxArr[letter]) { prodTaxArr[letter].push(item); } else { prodTaxArr[letter] = []; prodTaxArr[letter].push(item); } } } if (prodTaxArr[item["tax"]]) { prodTaxArr[item["tax"]].push(item); } else { prodTaxArr[item["tax"]] = []; prodTaxArr[item["tax"]].push(item); } } }); } catch (err) { console.error(err); } //Загальна сума (15.2 цифри) xw.writeElementString('SUM', CurrencyFormatted(fiscalReceiptData.totalSum)); if(thisbasket.customReturn){ //Возврат из корзины //Заокруглення (15.2 цифри) (наприклад, 0.71)--> console.log('TYT OKRUGLENIE VAR', okruglenie) xw.writeElementString('RNDSUM', CurrencyFormatted(okruglenie)); //Загальна сума без округлення (15.2 цифри) (наприклад, 1000.71) xw.writeElementString('NORNDSUM', CurrencyFormatted(thisbasket["info"]["allcena"])); //todo8 }else{ //Возврат через сервер if(sum0-fiscalReceiptData.totalSum != 0){ //Заокруглення (15.2 цифри) (наприклад, 0.71)--> xw.writeElementString('RNDSUM', CurrencyFormatted(sum0-fiscalReceiptData.totalSum)); roundsum = CurrencyFormatted(sum0-fiscalReceiptData.totalSum); //Загальна сума без округлення (15.2 цифри) (наприклад, 1000.71) xw.writeElementString('NORNDSUM', CurrencyFormatted(sum0)); } } if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { //Тип знижки/націнки (1 символ) //0–Сумова, 1–Відсоткова xw.writeElementString('DISCOUNTTYPE', '0'); //Загальна сума знижки (15.2 цифри) xw.writeElementString('DISCOUNTSUM', CurrencyFormatted(discountsum)); } xw.writeEndElement(); xw.writeStartElement('CHECKPAY'); //Строка 1 xw.writeStartElement('ROW').writeAttributeString('ROWNUM', '1'); //Код форми оплати (числовий) //0–Готівка, 1–Банківська картка.. xw.writeElementString('PAYFORMCD', '0'); //Форма оплаты (64 символа, необязательный) xw.writeElementString('PAYFORMNM', 'ГОТІВКА'); //Итоговая сумма (15.2 цифры, необязательный) xw.writeElementString('SUM', CurrencyFormatted(fiscalReceiptData.cashSum)); //xw.writeElementString('PROVIDED', '12.00'); xw.writeEndElement(); //Строка 2 xw.writeStartElement('ROW').writeAttributeString('ROWNUM', '2'); //Код форми оплати (числовий) //0–Готівка, 1–Банківська картка.. xw.writeElementString('PAYFORMCD', '1'); //Форма оплаты (64 символа, необязательный) xw.writeElementString('PAYFORMNM', 'Банківська картка'); //Итоговая сумма (15.2 цифры, необязательный) xw.writeElementString('SUM', CurrencyFormatted(fiscalReceiptData.electronSum)); if (thisbasket["info"]["bankingData"]) { xw.writeStartElement('PAYSYS'); xw.writeStartElement('ROW').writeAttributeString('ROWNUM', '1'); /** виса/мастеркард и тд */ //Найменування платіжної системи (текст) if (thisbasket["info"]["bankingData"].issuerName) { // xw.writeElementString('NAME', thisbasket["info"]["bankingData"].issuerName); } if (IPN) { xw.writeElementString('ACQUIREPN', IPN);// thisbasket["info"]["bankingData"] } if (thisbasket["info"]["bankingData"]["bankName"]) { //xxw.writeElementString('ACQUIRENM', thisbasket["info"]["bankingData"]["bankName"]);// thisbasket["info"]["bankingData"] } // RRN (Reference Retrieval Number) платежа if (thisbasket["info"]["bankingData"]["rrn"]) { xw.writeElementString('ACQUIRETRANSID', thisbasket["info"]["bankingData"]["rrn"]); } // Код авторизації (64 символи) if (thisbasket["info"]["bankingData"].authorizationCode) { //xw.writeElementString('AUTHCD', thisbasket["info"]["bankingData"].authorizationCode); } xw.writeEndElement(); xw.writeEndElement();// PAYSYS END } xw.writeEndElement(); xw.writeEndElement(); //Налоговые ставки xw.writeStartElement('CHECKTAX'); var taxes = []; //Если в настройках указано алгоритм двойного налога то нам надо отсортировать налоги в правильном порядке if(doubleTaxAlgorithm != 1){ try{ for(var keyTaxItem in preload.tax){ var thisTax = preload.tax[keyTaxItem]; //ПДВ на збір (сначала пдв потом акциз) if(doubleTaxAlgorithm == 2){ //Акцизы добавляем в конец if(thisTax.cno == "1"){ taxes.push(thisTax); } //ПДВ добавляем в начало if(thisTax.cno == "0"){ taxes.unshift(thisTax); } } //Збір на ПДВ (сначала акциз потом пдв) if(doubleTaxAlgorithm == 3){ //Акцизы добавляем в начало if(thisTax.cno == "1"){ taxes.unshift(thisTax); } //ПДВ добавляем в конец if(thisTax.cno == "0"){ taxes.push(thisTax); } } } }catch(err){ console.log("не удалось отсортировать налоги по doubleTaxAlgorithm") } }else{ taxes = preload.tax; } console.warn('TAXES', taxes); var taxcounter = 1; try { for (var keyTax in taxes) { var taxitem = taxes[keyTax]; console.warn('пременная первая в переборе', taxitem) if (taxitem.value != '' && taxitem.value != '-1' && taxitem.cno != "" && taxitem.cno != "-1" && taxitem.cno != null && taxitem.value.length == 1 && String(taxitem.value).match(/[А-ЩЬЮЯҐЄІЇ]/i)) { xw.writeStartElement('ROW').writeAttributeString('ROWNUM', String(taxcounter)); //Код виду податку/збору (числовий): //0-ПДВ,1-Акциз,2-ПФ... xw.writeElementString('TYPE', String(taxitem.cno)); //Найменування виду податку/збору (64 символи) xw.writeElementString('NAME', taxitem.title); //Літерне позначення виду і ставки податку/збору (А,Б,В,Г,...) (1 символ) xw.writeElementString('LETTER', taxitem.value); if (taxitem.percent == '') { taxitem.percent = 0; } //Відсоток податку/збору (15.2 цифри) xw.writeElementString('PRC', CurrencyFormatted(round(taxitem.percent, 2))); //Відсоток податку/збору (15.2 цифри) xw.writeElementString('SIGN', 'false'); var sum = 0; var SOURCESUM = 0; try { for (var keyTaxProduct in prodTaxArr[taxitem.value]) { var pritem = prodTaxArr[taxitem.value][keyTaxProduct]; try{ if(doubleTaxAlgorithm != 1){ //Попытка сказать налогу пдв что бы он отнял от суммы акцизный налог или наоборот //поскольку тут есть информация о том что был расчитан акцизный налог if(pritem.amountExciseSum > 0){ //разделяем логику на 2 части что бы точно ниче не сломалось //метод расчета сдвоенного налога (Збір на ПДВ) if(doubleTaxAlgorithm == 3){ //И налоговая ставка ПДВ if(taxitem.cno == "0" && taxitem.percent > 0){ SOURCESUM = app.main.sum(SOURCESUM, pritem.amountExciseSum); } } //метод расчета сдвоенного налога (ПДВ на збір) if(doubleTaxAlgorithm == 2 ){ //налоговая ставка акциз if(taxitem.cno == "1" && taxitem.percent > 0){ SOURCESUM = app.main.sum(SOURCESUM, pritem.amountExciseSum); } } } } }catch(err){ console.log("не удалось совершить расчет сдвоенного налога"); } sum = app.main.sum(sum, pritem.amount); if (prodTaxSum[taxitem.value] == null) { prodTaxSum[taxitem.value] = 0; } prodTaxSum[taxitem.value] += pritem.amount prodTaxPercent[taxitem.value] = taxitem.percent; prodTaxType[taxitem.value] = taxitem.cno; } } catch (err) { console.error(err); } //Сума для розрахування податку/збору (15.2 цифри) console.warn('!!!!!sum>>', sum); xw.writeElementString('TURNOVER', CurrencyFormatted(round(sum, 2))); //для сдвоенного налога if(SOURCESUM > 0 && doubleTaxAlgorithm != 1){ var sssssss = round(app.main.sum(sum, -SOURCESUM), 2); xw.writeElementString('SOURCESUM', CurrencyFormatted(sssssss)); var taxsum = app.main.sum(sssssss, -(round(sssssss, 2) * 100) / round(round(taxitem.percent, 2) + 100, 2)); }else{ var taxsum = app.main.sum(sum, -(round(sum, 2) * 100) / round(round(taxitem.percent, 2) + 100, 2)) } //Добавил что бы сохранять налог с вычетом акциза для печати на чеке... try{ if (prodTaxSumSource[taxitem.value] == null) { prodTaxSumSource[taxitem.value] = 0; } prodTaxSumSource[taxitem.value] += taxsum //amount }catch(err){ } console.log('var taxsum ====>>', taxsum) if (prro_userdata.returntaxespay == null) { prro_userdata.returntaxespay = {} } if (!app.main.ifobject(prro_userdata, "returntaxespay." + taxitem.value)) { createobj(prro_userdata, "returntaxespay", taxitem.value, 0); } prro_userdata.returntaxespay[taxitem.value] += round(taxsum, 2) xw.writeElementString('SUM', CurrencyFormatted(round(taxsum, 2))); xw.writeEndElement(); taxcounter++; } } } catch (err) { console.error(err); } xw.writeEndElement(); xw.writeStartElement('CHECKBODY'); //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; var pcount = 0; var printProducts = []; //Собираем нужный массив и убираем позиции которые не подлежат налогообложению fiscalarr.forEach(function (item) { console.warn('fiscalarr>>>>> item>>>', item) //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } if (item["tax"] != "" && item["tax"] != '-1') { flag = 1; pcount++; xw.writeStartElement('ROW').writeAttributeString('ROWNUM', pcount); //Внутренний код товара (64 символа, необязательный) //xw.writeElementString('CODE', '98765'); var productName = item["name"]; //Костыльчик который убирает с имени товара приставку веса try { if (item.type == "mod") { if (item.quantity == "100g" || item.quantity == "100ml") { productName = preload.products[currentsklad][item.id]["name"]; } } } catch (err) { } if (item.rroitemdata.barcode) { xw.writeElementString('BARCODE', item.rroitemdata.barcode); } if (item.uktzed != '' && item.uktzed != null && item.uktzed != "undefined" && item.uktzed != "0") { //Код товара по УКТЗЕД (15 цифр, необязательный) xw.writeElementString('UKTZED', String(item.uktzed)); } //Наименование товара (128 символов, необязательный) xw.writeElementString('NAME', String(productName)); //Код единицы измерения согласно классификатора (5 цифр, необязательный) //xw.writeElementString('UNITCODE', '25'); var unit = { pcs: "шт.", kg: "кг.", gr: "г.", l: "л.", ml: "мл.", m2: "м.кв.", mp: "м.п.", cm: "см.", mm: "мм.", t: "т.", min: "мин." }; //Наименование единицы измерения (64 символа, необязательный) xw.writeElementString('UNITNM', String(unit[item["quantity"]])); //Количество/объём товара (15.3 цифры, необязательный) xw.writeElementString('AMOUNT', QuantityFormatted(round(item["kolvo"], 3))); //Цена за единицу товара (15.2 цифры, необязательный) if (thisbasket.info.cashdiscount > 0 && thisbasket.customReturn) { //xw.writeElementString('PRICE', CurrencyFormatted(thisbasket.info.rrodata.cashSum)); xw.writeElementString('PRICE', CurrencyFormatted(Number(item.cenaout_discount))); } else { xw.writeElementString('PRICE', CurrencyFormatted(round(item["cenaout"], 2))); } //Буквенное обозначение ставки (1 символа, необязательный) try{ if(preload.tax[item["tax_id"]]["cno"] != "-1"){ //Типа если это без ПДВ то не указываем LETTERS xw.writeElementString('LETTERS', String(item["tax"])); } }catch(err){ } //Стоимость товара (15.2 цифры, необязательный) if (thisbasket.info.cashdiscount > 0 && thisbasket.customReturn) { //xw.writeElementString('COST', CurrencyFormatted(thisbasket.info.rrodata.cashSum * round(item["kolvo"], 3))); xw.writeElementString('COST', CurrencyFormatted(round(((Number(item.cenaout_discount)*1000)*(round(item["kolvo"],3)*1000))/1000000))); } else { xw.writeElementString('COST', CurrencyFormatted(round(((Number(item.cenaout)*1000)*(round(item["kolvo"],3)*1000))/1000000))); } if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { //Тип знижки/націнки (1 символ): //0–Сумова, 1–Відсоткова xw.writeElementString('DISCOUNTTYPE', "0"); //Загальна сума знижки (15.2 цифри) xw.writeElementString('DISCOUNTSUM', CurrencyFormatted(round(item["cenaout"] - item["cenaout_discount"], 2)*item["kolvo"])); } if (item.rroitemdata.excise) { xw.writeStartElement('EXCISELABELS'); xw.writeStartElement('ROW').writeAttributeString('ROWNUM', '1'); xw.writeElementString('EXCISELABEL', item.rroitemdata.excise); xw.writeEndElement(); xw.writeEndElement(); } xw.writeEndElement(); // return test var price; var priced; if (okruglenie == 0){ price = round(item["cenaout"],2); priced = round(item["cenaout_discount"],2); }else{ price = round(item["cenaout_1"],2); priced = round(item["cenaout_discount_1"],2); } var discSum; if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { //Если скидка есть discSum = round(priced * item["kolvo"],2); } else { //Скидки нет discSum = round(price * item["kolvo"],2); } console.log('price!!!', price); console.log('priced!!!', priced); console.log('discSum!!!', discSum); console.log('item["cenaout"]', item["cenaout"]); console.log('round(item["cenaout_discount"]', item["cenaout_discount"]); console.log('round(item["cenaout_1"],2)', item["cenaout_1"],2); console.log('round(item["cenaout_discount_1"],2)', item["cenaout_discount_1"],2); var realsum = price * item["kolvo"] var razn; if (thisbasket.customReturn) { razn = realsum - round(item.cenaout_discount); } else { razn = realsum - discSum; } discountSum = round(razn, 2); console.error('price item', item["cenaout"]) try{ //Товар на печать printProducts.push({ name:productName, unit:unit[item["quantity"]], kolvo:QuantityFormatted(round(item["kolvo"], 3)), cenaout:thisbasket.customReturn ? item["cenaout"] : price, tax:item["tax"], uktzed:item["uktzed"], discSum:discountSum, excise: item.rroitemdata.excise, barcode: item.rroitemdata.barcode }) }catch(err){ console.warn(err); } } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount2 = item["cenaout_discount"] * item["kolvo"]; } else { amount2 = item["cenaout"] * item["kolvo"]; } kostilsumm = kostilsumm + amount2; } }); var dali = thisbasket["info"]["cash"]; if (thisbasket["info"]["nall"] > 0) { dali = thisbasket["info"]["nall"] } //Отнимаем от суммы которую дал клиент сумму товара который не пошел на печать на фискальник dali = dali - kostilsumm; if (kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы онлайн кассе"); } xw.writeEndElement(); var xml = xw.flush(); xw.close(); //clean the writer xw = undefined; //don't let visitors use it, it's closed console.log("xml", xml); try { //Хрень чисто для отладки //var xmlDOM = new DOMParser().parseFromString(xml, 'text/xml'); //console.log("xml", xml2json(xmlDOM)); } catch (err) { } //Подписываем чек продажи $this.ql.subscribe(xml, userid).then(function (signed) { //console.log("signed",signed) /////ТУТ БЫЛ ЗАПРОС //Отправляем чек продажи $this.ExecuteCommand("doc", signed).then(function (res) { if (res.dfsresult != null) { //app.main.message("Фіскальний чек №" + res.dfsresult.TICKET.ORDERTAXNUM + " успішно прийнятий"); } //Если прошло успешно то записываем инфу о том что суммы поменялись (нужно для закытия смены) try { //Загальна сума реалізації prro_userdata.returnsum += round(fiscalReceiptData.totalSum, 2); } catch (err) { console.error(err); } try { //Кількість чеків prro_userdata.returncount += 1; } catch (err) { console.error(err); } try { //Выручка за наличные if (fiscalReceiptData.cashSum > 0) { prro_userdata.returnCash += round(fiscalReceiptData.cashSum, 2); } } catch (err) { console.error(err); } try { //Выручка по безналу if (fiscalReceiptData.electronSum > 0) { prro_userdata.returnElectron += round(fiscalReceiptData.electronSum, 2); } } catch (err) { console.error(err); } try { //Записываем по налогам for (var key in prodTaxSum) { var t = prodTaxSum[key]; if (prro_userdata.returnTaxes == null) { prro_userdata.returnTaxes = {}; } if (!app.main.ifobject(prro_userdata, "returnTaxes." + key)) { createobj(prro_userdata, "returnTaxes", key, 0); } prro_userdata.returnTaxes[key] += t; } } catch (err) { console.error(err); } console.log("prro_userdata.returnTaxes", prro_userdata.returnTaxes) try { //Записываем в памяьб localStorage["currentShift"] = JSON.stringify(prro_userdata); } catch (err) { } /** * печать чека */ // try{ var logotype = deviceItem.settings.printerData.printParams.additionalPrintParams.logo; }catch(err){ var logotype = ""; } var qrcode = ""; var qrBlock = document.getElementById("qrcodetempcontainer"); new Promise(function(resolve,reject){ try{ qrBlock.innerHTML = ""; var receiptDate = res.dfsresult.TICKET.ORDERDATE; var receiptDateFix = receiptDate[4]+receiptDate[5]+receiptDate[6]+receiptDate[7] +"-"+receiptDate[2]+receiptDate[3]+"-"+receiptDate[0]+receiptDate[1]; new QRCode("qrcodetempcontainer", { text: "https://cabinet.tax.gov.ua/cashregs/check?id=" + res.dfsresult.TICKET.ORDERTAXNUM + "&date=" + receiptDateFix + "&type=3&fn=" + rroSerialNum+"&time="+res.dfsresult.TICKET.ORDERTIME+"&sm="+round(fiscalReceiptData.totalSum, 2), width: 180, height: 180, colorDark : "#000000", colorLight : "#ffffff", correctLevel : QRCode.CorrectLevel.M }); }catch(err){ console.error(err) } setTimeout(function(){ var qrUrl = qrBlock.children[0].toDataURL("image/png"); console.log(qrUrl) var base64Url; try { qrcode = qrUrl.split("data:image/png;base64,")["1"]; console.log(base64Url) } catch (err) { console.log(err) } resolve() }, 500) }).then(function() { try{ var systemPrinterValue = deviceItem.settings.printerData.connectionParams.systemPrinter; }catch(err){ var systemPrinterValue = ""; } try{ var ipAdress = deviceItem.settings.printerData.connectionParams.ip; }catch(err){ var ipAdress = ""; } try{ var macAdress = deviceItem.settings.printerData.connectionParams.mac; }catch(err){ var macAdress = ""; } try{ if(deviceItem.settings.printerData.printParams.codepage == null){ deviceItem.settings.printerData.printParams.codepage = "0" } }catch(err){ } var bankpaymentobj = {} console.warn('thisbasket["info"]["bankingData"]>>>>>', thisbasket["info"]["bankingData"]); if (thisbasket["info"]["bankingData"]) { try{ if(thisbasket["info"]["bankingData"]["commission"]){ bankpaymentobj["fee"] = thisbasket["info"]["bankingData"]["commission"]; //Комиссия банка (в случае наличия) } }catch(err){ } try { if (thisbasket["info"]["bankingData"].isSignature) { bankpaymentobj.isSignature = thisbasket["info"]["bankingData"].isSignature; } } catch(err) { } try{ if(thisbasket["info"]["bankingData"]["rrn"]){ bankpaymentobj["rrn"] = thisbasket["info"]["bankingData"]["rrn"]; //RRN (Reference Retrieval Number) платежа } }catch(err){ } try { if (thisbasket["info"]["bankingData"].issuerName) { bankpaymentobj.issuerName = thisbasket["info"]["bankingData"].issuerName; } } catch(err) { } try{ if(thisbasket["info"]["bankingData"]["bankName"]){ bankpaymentobj.bankName = thisbasket["info"]["bankingData"]["bankName"]; //Название банка } }catch(err){ } try{ if(thisbasket["info"]["bankingData"]["cardNumber"]){ bankpaymentobj.cardNumber = thisbasket["info"]["bankingData"]["cardNumber"]; //Номер карты клиента } }catch(err){ } try{ if(thisbasket["info"]["bankingData"]["authorizationCode"]){ bankpaymentobj.authorizationCode = thisbasket["info"]["bankingData"]["authorizationCode"]; //Код авторизации платежа } }catch(err){ } try{ if(thisbasket["info"]["bankingData"]["terminalID"]){ bankpaymentobj.terminalID = thisbasket["info"]["bankingData"]["terminalID"]; //Номер платежного терминала } }catch(err){ } } try { var RS = thisbasket.customReturn ? -crutchOkruglenie : -roundsum; console.error('okruglenie', crutchOkruglenie) app.print.protocols[deviceItem.settings.connectionParams.printerProtocol]({ uaprro_Return:true, customRETURN: thisbasket.customReturn, info:{ allcena: CurrencyFormatted(round(thisbasket.info.allcena, 2)), cash: thisbasket.info.cash > 0 ? CurrencyFormatted(round(thisbasket.info.cash, 2)) : "", //client: "0", //coupon: 0, date: cdate[2] +"-"+ cdate[1] +"-"+ cdate[0], //discount: "0", //discounttitle: "Без скидки", nall: thisbasket.info.nall > 0 ? CurrencyFormatted(round(thisbasket.info.nall, 2)) : "", sdacha: CurrencyFormatted(round(thisbasket.info.sdacha, 2)), //servicecash: "0", summ: CurrencyFormatted(round(thisbasket.info.summ, 2)), time: thisbasket.info.time, type: "check", visa: CurrencyFormatted(round(thisbasket.info.visa, 2)), fiscalNumber:res.dfsresult.TICKET.ORDERTAXNUM, rroNum:rroSerialNum, companyName:fiscalSettings.uaprroORGNM, pointAdress:fiscalSettings.uaprroPOINTADDR, pointName:fiscalSettings.uaprroPOINTNM, IPN:fiscalSettings.uaprroIPN, IID:fiscalSettings.uaprroTIN, qrcode:qrcode, roundsum: RS,//-roundsum, localNumber:ereceiptStatus.NextLocalNum, cashRegisterNum:fiscalSettings.uaprroCASHDESKNUM }, printer:{ buffer: deviceItem.settings.printerData.printParams.buffer != null ? deviceItem.settings.printerData.printParams.buffer : "", charset: deviceItem.settings.printerData.printParams.charset, checks: "3", data: '{"chineseOff":"0","systemPrinter":"'+systemPrinterValue+'"}', feed: deviceItem.settings.printerData.indents.feedBottom, fontsize: deviceItem.settings.printerData.sizes.font, ip: ipAdress, mac:macAdress, logo: "", manufacturer: "other", parallel: deviceItem.settings.printerData.printParams.parallel, connection: connection, mode: String(deviceItem.settings.printerData.printParams.printMode), protocol: deviceItem.settings.connectionParams.printerProtocol, size: deviceItem.settings.printerData.sizes.size, width:deviceItem.settings.printerData.sizes.width, header: deviceItem.settings.printerData.additionalPrintParams.header, footer: deviceItem.settings.printerData.additionalPrintParams.footer, systemPrinter: systemPrinterValue, type: "printer", codepage: deviceItem.settings.printerData.printParams.codepage }, products:printProducts, prodTax:{ prodTaxSumSource:prodTaxSumSource, prodTaxSum:prodTaxSum, prodTaxPercent:prodTaxPercent, prodTaxType:prodTaxType }, bankData: bankpaymentobj }); } catch(err) { console.warn('error >>>', err) } }) console.warn('RES RES RES', res); resolve(res) }).catch(function (err) { reject(err) }) }) } else { alert("Нет активной смены, откройте смену"); reject(); } }).catch(function (err) { console.error(err); if(err.text){ app.main.error(err.text) } reject(err); }) }) }).catch(function (err) { app.main.error(err); $this.ql.openUploadDialog(); }) }, 0, thisbasket); }); }) }, precheck: function(thisbasket) { }, XReport: function(thisbasket) { console.warn('x report basket ====>>', thisbasket) var cdate = thisbasket.info.date.split('-'); var deviceItem = thisbasket.printer; app.main.loader("show") //TODO5 var fiscalSettings = thisbasket.printer.settings.fiscalSettings var $this = this; function getCurrentDate() { var d = new Date(); var dd = d.getDate(); if (dd < 10) dd = '0' + dd; var mm = d.getMonth() + 1; if (mm < 10) mm = '0' + mm; var yy = d.getFullYear(); return dd + '' + mm + '' + yy; } function getCurrentTime() { var d = new Date() var hh = d.getHours(); if (hh < 10) hh = '0' + hh; var mm = d.getMinutes(); if (mm < 10) mm = '0' + mm; var ss = d.getSeconds(); if (ss < 10) ss = '0' + ss; return hh + '' + mm + '' + ss; } var userid = thisbasket.info.user; var rroSerialNum = fiscalSettings.uaprroCASHREGISTERNUM; return new Promise(function (resolve, reject) { $this.ql.subscribe(JSON.stringify({ Command: "TransactionsRegistrarState", NumFiscal: rroSerialNum }), userid).then(function (signed) { $this.ExecuteCommand("cmd", signed).then(function (ereceiptStatus) { $this.ql.subscribe(JSON.stringify({ Command: "LastShiftTotals", NumFiscal: rroSerialNum }), userid).then(function (signed) { $this.ExecuteCommand("cmd", signed).then(function (res) { console.log('ereceiptStatus =======>', ereceiptStatus); //Если смена не закрыта if(res.ShiftState == 1){ console.warn("Отчет за смену",res); if (!res.Totals) res.Totals = {} try{ res.Totals.ereceiptStatus = ereceiptStatus; }catch(err){ console.error("ereceiptStatus") } try { res.Totals.ThisShift = { "Opened":res.Opened }; } catch(err) { console.log(err); } var cashSum = 0; var ServiceInput = 0; var ServiceOutput = 0; var saleCash = 0; var retCash = 0; try{ try{ //Внесение кассовых средств ServiceInput = res.Totals.ServiceInput; }catch(err){ } try{ //Изьятие кассовых средств ServiceOutput = res.Totals.ServiceOutput; }catch(err){ } try{ //Сумма продаж за наличные for(var key in res.Totals.Real.PayForm){ var value = res.Totals.Real.PayForm[key]; if(value["PayFormCode"] == 0){ saleCash = value["Sum"]; } } }catch(err){ } try{ //Сумма возвратов за наличные for(var key in res.Totals.Ret.PayForm){ var value = res.Totals.Ret.PayForm[key]; if(value["PayFormCode"] == 0){ retCash = value["Sum"]; } } }catch(err){ } //Сумма в кассе наличных cashSum = app.main.sum(ServiceInput, -ServiceOutput, saleCash, -retCash) }catch(err){ } try{ var systemPrinterValue = deviceItem.settings.printerData.connectionParams.systemPrinter; }catch(err){ var systemPrinterValue = ""; } try{ var ipAdress = deviceItem.settings.printerData.connectionParams.ip; }catch(err){ var ipAdress = ""; } try{ var macAdress = deviceItem.settings.printerData.connectionParams.mac; }catch(err){ var macAdress = ""; } try{ if(deviceItem.settings.printerData.printParams.codepage == null){ deviceItem.settings.printerData.printParams.codepage = "0" } }catch(err){ } try{ var connection = deviceItem.settings.printerData.connectionParams.usb; }catch(err){ } app.print.protocols[deviceItem.settings.connectionParams.printerProtocol]({ uaprro_xReport:true, info:{ date: cdate[2] +"-"+ cdate[1] +"-"+ cdate[0], time: thisbasket.info.time, type: "check", rroNum:rroSerialNum, companyName:fiscalSettings.uaprroORGNM, pointAdress:fiscalSettings.uaprroPOINTADDR, pointName:fiscalSettings.uaprroPOINTNM, IPN:fiscalSettings.uaprroIPN, IID:fiscalSettings.uaprroTIN, CASHDESKNUM: fiscalSettings.uaprroCASHDESKNUM //cashRegisterNum:cashRegisterNum }, printer:{ buffer: deviceItem.settings.printerData.printParams.buffer != null ? deviceItem.settings.printerData.printParams.buffer : "", charset: deviceItem.settings.printerData.printParams.charset, checks: "3", data: '{"chineseOff":"0","systemPrinter":"'+systemPrinterValue+'"}', feed: deviceItem.settings.printerData.indents.feedBottom, fontsize: deviceItem.settings.printerData.sizes.font, ip: ipAdress, mac:macAdress, //logo: logotype, connection:connection, manufacturer: "other", parallel: deviceItem.settings.printerData.printParams.parallel, mode: String(deviceItem.settings.printerData.printParams.printMode), protocol: deviceItem.settings.connectionParams.printerProtocol, size: deviceItem.settings.printerData.sizes.size, width:deviceItem.settings.printerData.sizes.width, header: deviceItem.settings.printerData.additionalPrintParams.header, footer: deviceItem.settings.printerData.additionalPrintParams.footer, systemPrinter: systemPrinterValue, type: "printer", codepage: deviceItem.settings.printerData.printParams.codepage }, xReport:res.Totals, cashSum:cashSum }); app.main.loader("hide") resolve(res) }else{ alert("Нет активной смены"); app.main.loader("hide") reject(); } }).catch(function (err) { reject(err) }) }) }).catch(function (err) { reject(err) }) }); }); }, X3Report: function(thisbasket) { console.warn('thisbasket>>>>>>', thisbasket) var cdate = thisbasket.info.date.split('-'); var deviceItem = thisbasket.printer; app.main.loader("show") //TODO5 var fiscalSettings = thisbasket.printer.settings.fiscalSettings var $this = this; function getCurrentDate() { var d = new Date(); var dd = d.getDate(); if (dd < 10) dd = '0' + dd; var mm = d.getMonth() + 1; if (mm < 10) mm = '0' + mm; var yy = d.getFullYear(); return dd + '' + mm + '' + yy; } function getCurrentTime() { var d = new Date() var hh = d.getHours(); if (hh < 10) hh = '0' + hh; var mm = d.getMinutes(); if (mm < 10) mm = '0' + mm; var ss = d.getSeconds(); if (ss < 10) ss = '0' + ss; return hh + '' + mm + '' + ss; } var userid = thisbasket.info.user; var rroSerialNum = fiscalSettings.uaprroCASHREGISTERNUM; return new Promise(function (resolve, reject) { $this.ql.subscribe(JSON.stringify({ Command: "TransactionsRegistrarState", NumFiscal: rroSerialNum }), userid).then(function (signed) { $this.ExecuteCommand("cmd", signed).then(function (ereceiptStatus) { $this.ql.subscribe(JSON.stringify({ Command: "LastShiftTotals", NumFiscal: rroSerialNum }), userid).then(function (signed) { $this.ExecuteCommand("cmd", signed).then(function (res) { var funcDateFrom = function() { // 3 дня var dayMilliseconds = 72*60*60*1000; // формируем дату минус 3 дня var fromDate = new Date(); fromDate.setTime(fromDate.getTime() - dayMilliseconds) console.log(fromDate) // создаем переменные из которых потом собираем дату в нужном формате var yy = fromDate.getFullYear(); var mm = fromDate.getMonth(); var dd = fromDate.getDate(); var hh = fromDate.getHours(); var min = fromDate.getMinutes(); var mmm = (mm + 1) < 10 ? '0' + (mm + 1) : mm + 1 var ddd = dd < 10 ? '0' + dd : dd; var hhh = hh < 10 ? '0' + hh : hh; var minMin = min < 10 ? '0' + min : min; return yy + '-' + mmm + '-' + ddd + 'T' + hhh + ':' + minMin + ':00+03:00'; } // функция формирующая дату для запроса по сменам TO var funcDateTo = function() { var d = new Date(); var yy = d.getFullYear(); var mm = d.getMonth(); var dd = d.getDate(); var hh = d.getHours(); var min = d.getMinutes(); //var ss = d.getSeconds(); var mmm = (mm + 1) < 10 ? '0' + (mm + 1) : mm + 1 var ddd = dd < 10 ? '0' + dd : dd; var hhh = hh < 10 ? '0' + hh : hh; var minMin = min < 10 ? '0' + min : min; return yy + '-' + mmm + '-' + ddd + 'T' + hhh + ':' + minMin + ':00+02:00'; } console.warn('date>>>', funcDateFrom() + ' ' + funcDateTo()); // запрос по сменам старт $this.ql.subscribe(JSON.stringify({ Command: "Shifts", NumFiscal: rroSerialNum, From: funcDateFrom(),//"2020-12-21T13:53:00+03:00" To: funcDateTo() }), userid).then(function (signed) { $this.ExecuteCommand("cmd", signed).then(function (Shifts) { $this.ql.subscribe(JSON.stringify({ Command: "Documents", NumFiscal: rroSerialNum, ShiftId: Shifts.Shifts[Shifts.Shifts.length - 1].ShiftId }), userid).then(function (signed) { $this.ExecuteCommand("cmd", signed).then(function (Doc) { console.warn('Documents DOOOOC!!>>>', Doc); app.main.loader("show"); app.main.getjson("/?section=db&db=magic&sql=document&action=read&type=sale&of=id&ot=desc&pagelimit=999999999999&page=0&search=" + currentsmena + "&sline=smena&rrodata=true").then(function(content) { if (content.status == "done") { console.warn('content>>', content) // Изначально формируем массив локальными номерами которые получили с бэка var contentArr = []; content.products.map(function(item) { contentArr.push(item.rrodata.rroResponse.TICKET.ORDERNUM) }) // потом формируем массив из списка чеков полученных с ДФС var arrDoc = [] Doc.Documents.map(function(item) { if (item.CheckDocType == 'SaleGoods') { arrDoc.push(String(item.NumLocal)) } }) console.log('arrDoc', arrDoc); console.log('contentArr>>>', contentArr); // сравниваем оба массива на идентичность contentArr.reverse() if (arrDoc.length === contentArr.length && arrDoc.every(function(value, index) { value === contentArr[index]} )) { console.warn('true'); } else { console.log('false'); } }; //Если смена не закрыта if(res.ShiftState == 1){ console.warn("Отчет за смену doc",res); try{ res.Totals.ereceiptStatus = ereceiptStatus; }catch(err){ console.error("ereceiptStatus") } try { res.Totals.ThisShift = Shifts; } catch(err) { console.log(err); } try{ var systemPrinterValue = deviceItem.settings.printerData.connectionParams.systemPrinter; }catch(err){ var systemPrinterValue = ""; } try{ var ipAdress = deviceItem.settings.printerData.connectionParams.ip; }catch(err){ var ipAdress = ""; } try{ var macAdress = deviceItem.settings.printerData.connectionParams.mac; }catch(err){ var macAdress = ""; } try{ if(deviceItem.settings.printerData.printParams.codepage == null){ deviceItem.settings.printerData.printParams.codepage = "0" } }catch(err){ } try{ var connection = deviceItem.settings.printerData.connectionParams.usb; }catch(err){ } app.print.protocols[deviceItem.settings.connectionParams.printerProtocol]({ uaprro_xReport:true, info:{ date: cdate[2] +"-"+ cdate[1] +"-"+ cdate[0], time: thisbasket.info.time, type: "check", rroNum:rroSerialNum, companyName:fiscalSettings.uaprroORGNM, pointAdress:fiscalSettings.uaprroPOINTADDR, pointName:fiscalSettings.uaprroPOINTNM, IPN:fiscalSettings.uaprroIPN, IID:fiscalSettings.uaprroTIN, //cashRegisterNum:cashRegisterNum }, printer:{ buffer: deviceItem.settings.printerData.printParams.buffer != null ? deviceItem.settings.printerData.printParams.buffer : "", charset: deviceItem.settings.printerData.printParams.charset, checks: "3", data: '{"chineseOff":"0","systemPrinter":"'+systemPrinterValue+'"}', feed: deviceItem.settings.printerData.indents.feedBottom, fontsize: deviceItem.settings.printerData.sizes.font, ip: ipAdress, mac:macAdress, //logo: logotype, connection:connection, manufacturer: "other", parallel: deviceItem.settings.printerData.printParams.parallel, mode: String(deviceItem.settings.printerData.printParams.printMode), protocol: deviceItem.settings.connectionParams.printerProtocol, size: deviceItem.settings.printerData.sizes.size, width:deviceItem.settings.printerData.sizes.width, header: deviceItem.settings.printerData.additionalPrintParams.header, footer: deviceItem.settings.printerData.additionalPrintParams.footer, systemPrinter: systemPrinterValue, type: "printer", codepage: deviceItem.settings.printerData.printParams.codepage }, xReport:res.Totals }); app.main.loader("hide") resolve(res) }else{ alert("Нет активной смены"); app.main.loader("hide") reject(); } // запрос по всем чекам за день и запрос на сервак по чекам if (content.status == "empty") { app.main.error(lang["empty"]); console.log('WTF') }; }).catch(function(e) { }); }).catch(function (err) { reject(err) }) }) // }).catch(function (err) { reject(err) }) });// запрос по сменам конец }).catch(function (err) { reject(err) }) }) }).catch(function (err) { reject(err) }) }); }); }, ZReport: function(data) { //TODO5 var fiscalSettings = data.printer.settings.fiscalSettings var deviceItem = data.printer; var cdate = data.info.date.split('-'); var $this = this; function getCurrentDate() { var d = new Date(); var dd = d.getDate(); if (dd < 10) dd = '0' + dd; var mm = d.getMonth() + 1; if (mm < 10) mm = '0' + mm; var yy = d.getFullYear(); return dd + '' + mm + '' + yy; } function getCurrentTime() { var d = new Date() var hh = d.getHours(); if (hh < 10) hh = '0' + hh; var mm = d.getMinutes(); if (mm < 10) mm = '0' + mm; var ss = d.getSeconds(); if (ss < 10) ss = '0' + ss; return hh + '' + mm + '' + ss; } var userid = data.info.user; var rroSerialNum = fiscalSettings.uaprroCASHREGISTERNUM; return new Promise(function (resolve, reject) { $this.ql.subscribe(JSON.stringify({ Command: "TransactionsRegistrarState", NumFiscal: rroSerialNum }), userid).then(function (signed) { $this.ExecuteCommand("cmd", signed).then(function (ereceiptStatus) { $this.ql.subscribe(JSON.stringify({ Command: "LastShiftTotals", NumFiscal: rroSerialNum }), userid).then(function (signed) { $this.ExecuteCommand("cmd", signed).then(function (res) { var OpenedSmena = res.Opened; console.log("res",res) var resRes = res; //Если смена не закрыта if(res.ShiftState == 1){ //Если Z отчет не сдан if(res.ZRepPresent == false){ //Если есть информация //Костыльчики что бы закрыть пустую смену if(res.Totals == null){ res.Totals = { Real:{ Sum:"0", OrdersCount:"0", }, ServiceInput:"0", ServiceOutput:"0", } }else{ if(res.Totals.Real == null){ res.Totals.Real = { Sum:"0", OrdersCount:"0", } } } var xw = new XMLWriter('windows-1251'); xw.writeStartDocument(); xw.writeStartElement('ZREP'); xw.writeAttributeString('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance'); xw.writeAttributeString('xsi:noNamespaceSchemaLocation', 'zrep01.xsd'); xw.writeStartElement('ZREPHEAD'); //Унікальний ідентифікатор документа (GUID) xw.writeElementString('UID', app.print.modules.guid())//.writeEndElement(); xw.writeElementString('TIN', fiscalSettings.uaprroTIN); //certData.DRFO if(fiscalSettings.uaprroIPN != "" && fiscalSettings.uaprroIPN != null){ xw.writeElementString('IPN', fiscalSettings.uaprroIPN); } //Наименование продавца (256 символов) xw.writeElementString('ORGNM', fiscalSettings.uaprroORGNM)//.writeEndElement(); //Наименование точки продаж (256 символов, обязательный) xw.writeElementString('POINTNM', fiscalSettings.uaprroPOINTNM)//.writeEndElement(); xw.writeElementString('POINTADDR', fiscalSettings.uaprroPOINTADDR); //Дата операции (ддммгггг, обязательный) xw.writeElementString('ORDERDATE', getCurrentDate())//.writeEndElement(); //Время операции (ччммсс, обязательный) xw.writeElementString('ORDERTIME', getCurrentTime())//.writeEndElement(); //Порядковый номер документа (128 символов, обязательный) var tempLocalNum = ereceiptStatus.NextLocalNum var NextLocalNum = tempLocalNum.toString(); xw.writeElementString('ORDERNUM', NextLocalNum)//.writeEndElement(); //Номер кассы (64 символа, обязательный) xw.writeElementString('CASHDESKNUM', fiscalSettings.uaprroCASHDESKNUM)//.writeEndElement(); //Фискальный номер регистратора расчётных операций (128 символов, необязательный) xw.writeElementString('CASHREGISTERNUM', rroSerialNum)//.writeEndElement(); //Версия документа (Числовой) xw.writeElementString('VER', '1')//.writeEndElement(); if(localStorage.prroTesting) { xw.writeElementString('TESTING', "true"); } xw.writeEndElement(); //ZREPHEAD END //Підсумки реалізації xw.writeStartElement('ZREPREALIZ'); //Загальна сума реалізації xw.writeElementString('SUM', CurrencyFormatted(res.Totals.Real.Sum)); //Кількість чеків xw.writeElementString('ORDERSCNT', String(res.Totals.Real.OrdersCount)); if (res.Totals.Real.TotalCurrencyCost > 0) { xw.writeElementString('TOTALCURRENCYCOST', String(res.Totals.Real.TotalCurrencyCost)); xw.writeElementString('TOTALCURRENCYCOMMISSION', CurrencyFormatted(res.Totals.Real.TotalCurrencyCommission)); } try{ if(res.Totals.Real.PayForm.length > 0){ //Підсумки по формам оплати xw.writeStartElement('PAYFORMS'); var ccc = 1; for(var keiii in res.Totals.Real.PayForm){ var payitem = res.Totals.Real.PayForm[keiii]; if (payitem.Sum != null) { xw.writeStartElement('ROW').writeAttributeString('ROWNUM', String(ccc)); //0 – Готівка, 1 – Банківська картка xw.writeElementString('PAYFORMCD', String(payitem.PayFormCode)); //Найменування форми оплати xw.writeElementString('PAYFORMNM', payitem.PayFormName); //Сума оплати xw.writeElementString('SUM', CurrencyFormatted(payitem.Sum)); xw.writeEndElement(); //ROW END } ccc++; } xw.writeEndElement(); //PAYFORMS END } }catch(err){ } console.error("test",res.Totals.Real) try{ if(res.Totals.Real.Tax.length > 0 && res.Totals.Real.Tax != null){ //Податки/Збори xw.writeStartElement('TAXES'); try { var taxcounter = 1; for (var key in res.Totals.Real.Tax) { var taxitem = res.Totals.Real.Tax[key]; xw.writeStartElement('ROW').writeAttributeString('ROWNUM', String(taxcounter)); //Код виду податку/збору (числовий): //0-ПДВ,1-Акциз,2-ПФ... xw.writeElementString('TYPE', String(taxitem.Type)); //Найменування виду податку/збору (64 символи) xw.writeElementString('NAME', String(taxitem.Name)); //Літерне позначення виду і ставки податку/збору (А,Б,В,Г,...) (1 символ) xw.writeElementString('LETTER', String(taxitem.Letter)); //Відсоток податку/збору (15.2 цифри) xw.writeElementString('PRC', CurrencyFormatted(taxitem.Prc)); //Відсоток податку/збору (15.2 цифри) xw.writeElementString('SIGN', String(taxitem.Sign)); //Сума для розрахування податку/збору (15.2 цифри) xw.writeElementString('TURNOVER', CurrencyFormatted(taxitem.Turnover)); //var taxsum = app.main.sum(prro_userdata.taxes[taxitem.value], -(round(prro_userdata.taxes[taxitem.value], 10) * 100) / round(round(taxitem.percent, 10) + 100, 10)) try{ if(taxitem.SourceSum){ xw.writeElementString('SOURCESUM', CurrencyFormatted(taxitem.SourceSum)); } }catch(err){ console.log("в текущей смене не было продаж со сдвоенным налогом") } xw.writeElementString('SUM', CurrencyFormatted(taxitem.Sum)); xw.writeEndElement(); taxcounter++; } } catch (err) { console.error(err); } xw.writeEndElement(); //TAXES END } }catch(err){ } xw.writeEndElement(); //ZREPREALIZ END if(res.Totals.Ret != null){ //Підсумки повернення xw.writeStartElement('ZREPRETURN'); //Загальна сума повернення xw.writeElementString('SUM', CurrencyFormatted(res.Totals.Ret.Sum)); //Кількість чеків повернення xw.writeElementString('ORDERSCNT', String(res.Totals.Ret.OrdersCount)); //Підсумки по формам оплати //Підсумки по формам оплати try{ if(res.Totals.Ret.PayForm.length > 0){ xw.writeStartElement('PAYFORMS'); var ccc2 = 1; for(var keiii1 in res.Totals.Ret.PayForm){ var payitem = res.Totals.Ret.PayForm[keiii1]; if (payitem.Sum != null) { xw.writeStartElement('ROW').writeAttributeString('ROWNUM', String(ccc2)); //0 – Готівка, 1 – Банківська картка xw.writeElementString('PAYFORMCD', String(payitem.PayFormCode)); //Найменування форми оплати xw.writeElementString('PAYFORMNM', payitem.PayFormName); //Сума оплати xw.writeElementString('SUM', CurrencyFormatted(payitem.Sum)); xw.writeEndElement(); //ROW END } ccc2++; } xw.writeEndElement(); //PAYFORMS END } }catch(err){ } try { if(res.Totals.Ret.Tax.length > 0 && res.Totals.Ret.Tax != null){ //Податки/Збори //Податки/Збори xw.writeStartElement('TAXES'); var taxcounter1 = 1; for (var key3 in res.Totals.Ret.Tax) { var taxitem = res.Totals.Ret.Tax[key3]; xw.writeStartElement('ROW').writeAttributeString('ROWNUM', String(taxcounter1)); //Код виду податку/збору (числовий): //0-ПДВ,1-Акциз,2-ПФ... xw.writeElementString('TYPE', String(taxitem.Type)); //Найменування виду податку/збору (64 символи) xw.writeElementString('NAME', String(taxitem.Name)); //Літерне позначення виду і ставки податку/збору (А,Б,В,Г,...) (1 символ) xw.writeElementString('LETTER', String(taxitem.Letter)); //Відсоток податку/збору (15.2 цифри) xw.writeElementString('PRC', CurrencyFormatted(taxitem.Prc)); //Відсоток податку/збору (15.2 цифри) xw.writeElementString('SIGN', String(taxitem.Sign)); //Сума для розрахування податку/збору (15.2 цифри) xw.writeElementString('TURNOVER', CurrencyFormatted(taxitem.Turnover)); try{ if(taxitem.SourceSum){ xw.writeElementString('SOURCESUM', CurrencyFormatted(taxitem.SourceSum)); } }catch(err){ console.log("в текущей смене не было продаж со сдвоенным налогом") } xw.writeElementString('SUM', CurrencyFormatted(taxitem.Sum)); xw.writeEndElement(); taxcounter1++; } xw.writeEndElement(); //TAXES END } } catch (err) { console.error(err); } xw.writeEndElement(); //ZREPRETURN END } try{ //Підсумки видачі готівки if(res.Totals.Cash.OrdersCount > 0){ xw.writeStartElement('ZREPCASH'); //Загальна сума (15.2 цифри) xw.writeElementString('SUM', CurrencyFormatted(res.Totals.Cash.Sum)); //Сума комісії (15.2 цифри) xw.writeElementString('COMMISSION', CurrencyFormatted(res.Totals.Cash.Commission)); //Кількість чеків (числовий) xw.writeElementString('ORDERSCNT', String(res.Totals.Cash.OrdersCount)); xw.writeEndElement(); //ZREPCASH END } }catch(err){ } /* xw.writeStartElement('ZREPVAL'); xw.writeElementString('TOTALINADVANCE', CurrencyFormatted(100)); xw.writeElementString('TOTALINATTACH', CurrencyFormatted(100)); xw.writeElementString('TOTALSURRCOLLECTION', CurrencyFormatted(100)); xw.writeElementString('CALCDOCSCNT', "1"); xw.writeElementString('COMMISSIONN', CurrencyFormatted(100)); xw.writeElementString('TRANSFERSCNT', "1"); xw.writeEndElement(); */ //Підсумки xw.writeStartElement('ZREPBODY'); //Службовий внесок xw.writeElementString('SERVICEINPUT', CurrencyFormatted(round(res.Totals.ServiceInput, 2))); //Службова видача xw.writeElementString('SERVICEOUTPUT', CurrencyFormatted(round(res.Totals.ServiceOutput, 2))); xw.writeEndElement(); //ZREPBODY END xw.writeEndElement(); var xml = xw.flush(); xw.close(); //clean the writer xw = undefined; //don't let visitors use it, it's closed console.log("ZZZZZ", xml); var zXML = xml; $this.ql.subscribe(xml, userid).then(function (signed) { console.log("signed", signed) /////ТУТ БЫЛ ЗАПРОС $this.ExecuteCommand("doc", signed).then(function (res) { $this.ql.getUserECPData(userid).then(function (certData) { console.log("certData", certData) console.warn('res>>> ') var xw = new XMLWriter('windows-1251'); xw.writeStartDocument(); xw.writeStartElement('CHECK'); xw.writeAttributeString('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance'); xw.writeAttributeString('xsi:noNamespaceSchemaLocation', 'check01.xsd'); xw.writeStartElement('CHECKHEAD'); //0-Чек реалізації товарів/послуг, 1-Чек переказу коштів, 2–Чек операції обміну валюти, 3-Чек видачі готівки, 100-Відкриття зміни, 101-Закриття зміни, 102-Початок офлайн сесії, 103-Завершення офлайн сесії xw.writeElementString('DOCTYPE', '101'); //Унікальний ідентифікатор документа (GUID) xw.writeElementString('UID', app.print.modules.guid())//.writeEndElement(); xw.writeElementString('TIN', fiscalSettings.uaprroTIN); //certData.DRFO if(fiscalSettings.uaprroIPN != "" && fiscalSettings.uaprroIPN != null){ xw.writeElementString('IPN', fiscalSettings.uaprroIPN); } if (certData.EDRPOU != null && certData.EDRPOU != '') { //ЕДРПОУ/ДРФО/№ паспорта продавца (10 символов, обязательный) //xw.writeElementString('TIN', certData.EDRPOU); //certData.DRFO } if (certData.EDRPOU != null && certData.EDRPOU != '') { //ИНН продавца (12 символов, необязательный) //xw.writeElementString('IPN', certData.EDRPOU); //fiscalSettings.uaprroIPN } //Наименование продавца (256 символов) xw.writeElementString('ORGNM', fiscalSettings.uaprroORGNM)//.writeEndElement(); //Наименование точки продаж (256 символов, обязательный) xw.writeElementString('POINTNM', fiscalSettings.uaprroPOINTNM)//.writeEndElement(); //Адрес точки продаж (256 символов, обязательный) xw.writeElementString('POINTADDR', fiscalSettings.uaprroPOINTADDR)//.writeEndElement(); //Дата операции (ддммгггг, обязательный) xw.writeElementString('ORDERDATE', getCurrentDate())//.writeEndElement(); //Время операции (ччммсс, обязательный) xw.writeElementString('ORDERTIME', getCurrentTime())//.writeEndElement(); //Порядковый номер документа (128 символов, обязательный) var tempLocalNum = ereceiptStatus.NextLocalNum + 1 var NextLocalNum = tempLocalNum.toString(); xw.writeElementString('ORDERNUM', NextLocalNum)//.writeEndElement(); //Номер кассы (64 символа, обязательный) xw.writeElementString('CASHDESKNUM', fiscalSettings.uaprroCASHDESKNUM)//.writeEndElement(); //Фискальный номер регистратора расчётных операций (128 символов, необязательный) xw.writeElementString('CASHREGISTERNUM', rroSerialNum)//.writeEndElement(); //ФИО кассира (128 символов, обязательный) var cashierName = "Касир"; try{ cashierName = certData.commonName; //preload.users[currentsklad][userid]["user_name"] }catch(err){ } xw.writeElementString('CASHIER', cashierName)//.writeEndElement(); //Версия документа (Числовой) xw.writeElementString('VER', '1')//.writeEndElement(); //Фискальный номер документа (128 символов, необязательный) //xw.writeElementString('ORDERTAXNUM', '101234567890123')//.writeEndElement(); if(localStorage.prroTesting) { xw.writeElementString('TESTING', "true"); } xw.writeEndElement(); xw.writeEndElement(); var xml = xw.flush(); xw.close(); //clean the writer xw = undefined; //don't let visitors use it, it's closed console.log(xml); try { //Хрень чисто для отладки var xmlDOM = new DOMParser().parseFromString(xml, 'text/xml'); console.log("xml", xml2json(xmlDOM)); $this.ql.subscribe(xml, userid).then(function (signed) { console.log("signed", signed) /////ТУТ БЫЛ ЗАПРОС $this.ExecuteCommand("doc", signed).then(function (res) { //Зачищаем данные о текущей смене prro_userdata = { salesum:0, salecount:0, cash:null, electron:null, taxes:{}, taxespay:{}, serviceInput:0, serviceOutput:0, totalCurrencyCost:0, totalCurrencyCommission:0, returncount:0, returnsum:0, returnElectron:null, returnCash:null, returnTaxes:{}, }; try { //Записываем в памяьб localStorage["currentShift"] = JSON.stringify(prro_userdata); } catch (err) { } try { console.log('res >><< res ', res) resRes.Totals.ThisShift = { "Opened":OpenedSmena }; } catch(err) { console.log(err); } try { var closeTime = function() { var d = new Date(); var yy = d.getFullYear(); var mm = d.getMonth(); var dd = d.getDate(); var hh = d.getHours(); var min = d.getMinutes(); var ss = d.getSeconds(); var mmm = (mm + 1) < 10 ? '0' + (mm + 1) : mm + 1; var ddd = dd < 10 ? '0' + dd : dd; var hhh = hh < 10 ? '0' + hh : hh; var minMin = min < 10 ? '0' + min : min; var sss = ss < 10 ? '0' + ss : ss ; return yy + '-' + mmm + '-' + ddd + ' ' + hhh + ':' + minMin + ':' + sss; } console.warn('closeTime()', closeTime()); resRes.Totals.closeTime = closeTime(); } catch(err) { console.log(err); } // try { // resRes.Totals.fsNum = res.dfsresult.ORDERTAXNUM; // resRes.Totals.localNum = res.dfsresult.ORDERNUM; // } catch(err) { // } try { console.warn('res>>', res) console.warn('aaaaaaaaa>>>>>>>>>>>>>>>>>>>', fiscalSettings) try{ var systemPrinterValue = deviceItem.settings.printerData.connectionParams.systemPrinter; }catch(err){ var systemPrinterValue = ""; } try{ var ipAdress = deviceItem.settings.printerData.connectionParams.ip; }catch(err){ var ipAdress = ""; } try{ var macAdress = deviceItem.settings.printerData.connectionParams.mac; }catch(err){ var macAdress = ""; } try{ if(deviceItem.settings.printerData.printParams.codepage == null){ deviceItem.settings.printerData.printParams.codepage = "0" } }catch(err){ } try{ var connection = deviceItem.settings.printerData.connectionParams.usb; }catch(err){ } app.print.protocols[deviceItem.settings.connectionParams.printerProtocol]({ uaprro_zReport:true, info:{ date: cdate[2] +"-"+ cdate[1] +"-"+ cdate[0], time: data.info.time, type: "check", rroNum:rroSerialNum, companyName:fiscalSettings.uaprroORGNM, pointAdress:fiscalSettings.uaprroPOINTADDR, pointName:fiscalSettings.uaprroPOINTNM, IPN:fiscalSettings.uaprroIPN, IID:fiscalSettings.uaprroTIN, CASHDESKNUM:fiscalSettings.uaprroCASHDESKNUM, fsNum: res.dfsresult.TICKET.ORDERTAXNUM, localNum: res.dfsresult.TICKET.ORDERNUM //cashRegisterNum:cashRegisterNum }, printer:{ buffer: deviceItem.settings.printerData.printParams.buffer != null ? deviceItem.settings.printerData.printParams.buffer : "", charset: deviceItem.settings.printerData.printParams.charset, checks: "3", data: '{"chineseOff":"0","systemPrinter":"'+systemPrinterValue+'"}', feed: deviceItem.settings.printerData.indents.feedBottom, fontsize: deviceItem.settings.printerData.sizes.font, ip: ipAdress, mac:macAdress, //logo: logotype, connection:connection, manufacturer: "other", parallel: deviceItem.settings.printerData.printParams.parallel, mode: String(deviceItem.settings.printerData.printParams.printMode), protocol: deviceItem.settings.connectionParams.printerProtocol, size: deviceItem.settings.printerData.sizes.size, width:deviceItem.settings.printerData.sizes.width, header: deviceItem.settings.printerData.additionalPrintParams.header, footer: deviceItem.settings.printerData.additionalPrintParams.footer, systemPrinter: systemPrinterValue, type: "printer", codepage: deviceItem.settings.printerData.printParams.codepage }, zReport: resRes.Totals }); } catch(err) { console.warn(err) } var zXMLDOM = new DOMParser().parseFromString(zXML, 'text/xml'); var xmlDOM = new DOMParser().parseFromString(xml, 'text/xml'); var checkJson = xml2json(xmlDOM); var zChekJson = xml2json(zXMLDOM) var objPrint = { zChekJson: zChekJson, checkJson: checkJson, answear: res } resolve(objPrint) }).catch(function (err) { reject(err) }) }) } catch (err) { console.error(err) } }) }).catch(function (err) { reject(err) }) }) }else{ // alert("Z отчет сдан, смена не закрыта, пытаемся закрыть смену"); $this.ql.getUserECPData(userid).then(function (certData) { console.log("certData", certData) var xw = new XMLWriter('windows-1251'); xw.writeStartDocument(); xw.writeStartElement('CHECK'); xw.writeAttributeString('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance'); xw.writeAttributeString('xsi:noNamespaceSchemaLocation', 'check01.xsd'); xw.writeStartElement('CHECKHEAD'); //0-Чек реалізації товарів/послуг, 1-Чек переказу коштів, 2–Чек операції обміну валюти, 3-Чек видачі готівки, 100-Відкриття зміни, 101-Закриття зміни, 102-Початок офлайн сесії, 103-Завершення офлайн сесії xw.writeElementString('DOCTYPE', '101'); //Унікальний ідентифікатор документа (GUID) xw.writeElementString('UID', app.print.modules.guid())//.writeEndElement(); xw.writeElementString('TIN', fiscalSettings.uaprroTIN); //certData.DRFO if(fiscalSettings.uaprroIPN != "" && fiscalSettings.uaprroIPN != null){ xw.writeElementString('IPN', fiscalSettings.uaprroIPN); } if (certData.EDRPOU != null && certData.EDRPOU != '') { //ЕДРПОУ/ДРФО/№ паспорта продавца (10 символов, обязательный) //xw.writeElementString('TIN', certData.EDRPOU); //certData.DRFO } if (certData.EDRPOU != null && certData.EDRPOU != '') { //ИНН продавца (12 символов, необязательный) //xw.writeElementString('IPN', certData.EDRPOU); //fiscalSettings.uaprroIPN } //Наименование продавца (256 символов) xw.writeElementString('ORGNM', fiscalSettings.uaprroORGNM)//.writeEndElement(); //Наименование точки продаж (256 символов, обязательный) xw.writeElementString('POINTNM', fiscalSettings.uaprroPOINTNM)//.writeEndElement(); //Адрес точки продаж (256 символов, обязательный) xw.writeElementString('POINTADDR', fiscalSettings.uaprroPOINTADDR)//.writeEndElement(); //Дата операции (ддммгггг, обязательный) xw.writeElementString('ORDERDATE', getCurrentDate())//.writeEndElement(); //Время операции (ччммсс, обязательный) xw.writeElementString('ORDERTIME', getCurrentTime())//.writeEndElement(); //Порядковый номер документа (128 символов, обязательный) var tempLocalNum = ereceiptStatus.NextLocalNum //+ 1 var NextLocalNum = tempLocalNum.toString(); xw.writeElementString('ORDERNUM', NextLocalNum)//.writeEndElement(); //Номер кассы (64 символа, обязательный) xw.writeElementString('CASHDESKNUM', fiscalSettings.uaprroCASHDESKNUM)//.writeEndElement(); //Фискальный номер регистратора расчётных операций (128 символов, необязательный) xw.writeElementString('CASHREGISTERNUM', rroSerialNum)//.writeEndElement(); //ФИО кассира (128 символов, обязательный) var cashierName = "Касир"; try{ cashierName = certData.commonName; //preload.users[currentsklad][userid]["user_name"] }catch(err){ } xw.writeElementString('CASHIER', cashierName)//.writeEndElement(); //Версия документа (Числовой) xw.writeElementString('VER', '1')//.writeEndElement(); //Фискальный номер документа (128 символов, необязательный) //xw.writeElementString('ORDERTAXNUM', '101234567890123')//.writeEndElement(); if(localStorage.prroTesting) { xw.writeElementString('TESTING', "true"); } xw.writeEndElement(); xw.writeEndElement(); var xml = xw.flush(); xw.close(); //clean the writer xw = undefined; //don't let visitors use it, it's closed console.log(xml); try { //Хрень чисто для отладки var xmlDOM = new DOMParser().parseFromString(xml, 'text/xml'); console.log("xml", xml2json(xmlDOM)); $this.ql.subscribe(xml, userid).then(function (signed) { console.log("signed", signed) /////ТУТ БЫЛ ЗАПРОС $this.ExecuteCommand("doc", signed).then(function (res) { //Зачищаем данные о текущей смене prro_userdata = { salesum:0, salecount:0, cash:null, electron:null, taxes:{}, taxespay:{}, serviceInput:0, serviceOutput:0, totalCurrencyCost:0, totalCurrencyCommission:0, returncount:0, returnsum:0, returnElectron:null, returnCash:null, returnTaxes:{}, }; try { //Записываем в памяьб localStorage["currentShift"] = JSON.stringify(prro_userdata); } catch (err) { } console.warn('lol ahahaha', res); resolve(res) }).catch(function (err) { reject(err) }) }) } catch (err) { console.error(err) } }) } }else{ alert("Смена уже закрыта"); reject(); } }).catch(function (err) { reject(err) }) }); }).catch(function (err) { reject(err) }) }); }); }, introduction: function(thisbasket) { console.log("thisbasket introduction!!!!!!!!!!!!!>>>>>>>!!!!!!!!", thisbasket) var deviceItem = thisbasket.printer; //var fiscalSettings = deviceItem.settings.fiscalSettings; //TODO5 var tradepoint_id = deviceItem.sklad; var tradepoint = preload.sklad[tradepoint_id]; var tradepointName = tradepoint.title; var tradepointAddr = tradepoint.adress; try{ var logotype = deviceItem.settings.printerData.printParams.additionalPrintParams.logo; }catch(err){ var logotype = ""; } console.warn(thisbasket.info) var $this = this; app.main.loader("show"); var rroSerialNum = fiscalSettings.uaprroCASHREGISTERNUM; return new Promise(function (resolve, reject) { setTimeout(function (thisbasket) { //Этот костыль нужен для того чтобы запустить спинер var userid = thisbasket.info.user; //Извлекаем информацию из сертификата $this.ql.getUserECPData(userid).then(function (certData) { //console.warn("certData", certData); //Подписываем документ получения статуса РРО $this.ql.subscribe(JSON.stringify({ Command: "TransactionsRegistrarState", NumFiscal: rroSerialNum }), userid).then(function (signed) { //Отправляем документ получения статуса РРО $this.ExecuteCommand("cmd", signed).then(function (ereceiptStatus) { console.log("ereceiptStatus", ereceiptStatus) //Если смена открыта if (ereceiptStatus.ShiftState == 1) { //Создаем документ продажи var xw = new XMLWriter('windows-1251'); xw.writeStartDocument(); xw.writeStartElement('CHECK').writeAttributeString('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance').writeAttributeString('xsi:noNamespaceSchemaLocation', 'check01.xsd'); xw.writeStartElement('CHECKHEAD'); //Тип документа(Числовой, обязательный): 0-Фіскальний чек, 1-Відкриття зміни, 2-Закриття зміни xw.writeElementString('DOCTYPE', '0'); //Расширенный тип документа(Числовой, обязательный) //Для DOCTYPE=0: 0-Касовий чек на товари (послуги), 1-Видатковий чек, 2-Чек операції «службове внесення», 3-Чек операції «службова видача»--> //Для DOCTYPE!=0: 0 xw.writeElementString('DOCSUBTYPE', '2'); //Уникальный идентификатор документа (GUID, обязательный) xw.writeElementString('UID', app.print.modules.guid()); if (fiscalSettings.uaprroTIN != '') { //ЕДРПОУ/ДРФО/№ паспорта продавца (10 символов, обязательный) xw.writeElementString('TIN', fiscalSettings.uaprroTIN); } else if (certData.DRFO != '' && certData.DRFO != null) { //ЕДРПОУ/ДРФО/№ паспорта продавца (10 символов, обязательный) xw.writeElementString('TIN', certData.DRFO); } if (fiscalSettings.uaprroIPN != '' && fiscalSettings.uaprroIPN != null) { //ИНН продавца (12 символов, необязательный) xw.writeElementString('IPN', fiscalSettings.uaprroIPN); } else if (certData.DRFO != '' && certData.DRFO != null) { //ИНН продавца (12 символов, необязательный) //xw.writeElementString('IPN', certData.DRFO); } if (fiscalSettings.uaprroORGNM != "") { //Наименование продавца (256 символов, обязательный) xw.writeElementString('ORGNM', fiscalSettings.uaprroORGNM); //preload.settings.companyname } else if (preload.settings.companyname != '') { //Наименование продавца (256 символов, обязательный) xw.writeElementString('ORGNM', preload.settings.companyname); //preload.settings.companyname } else { alert("Не вказано найменування організації"); } if (fiscalSettings.uaprroPOINTNM != '') { //Наименование точки продаж (256 символов, обязательный) xw.writeElementString('POINTNM', fiscalSettings.uaprroPOINTNM); } else if (tradepointName != '') { //Наименование точки продаж (256 символов, обязательный) xw.writeElementString('POINTNM', tradepointName); } else { alert("Не вказано найменування точки продаж"); } if (fiscalSettings.uaprroPOINTADDR != '') { //Адрес точки продаж (256 символов, обязательный) xw.writeElementString('POINTADDR', fiscalSettings.uaprroPOINTADDR); } else if (tradepointAddr != '') { //Адрес точки продаж (256 символов, обязательный) xw.writeElementString('POINTADDR', tradepointAddr); } else { alert("Не вказано адресу торгової точки"); } //Дата операции (ддммгггг, обязательный) xw.writeElementString('ORDERDATE', (function () { var d = new Date(); var dd = d.getDate(); if (dd < 10) dd = '0' + dd; var mm = d.getMonth() + 1; if (mm < 10) mm = '0' + mm; var yy = d.getFullYear(); return dd + '' + mm + '' + yy; })()); //Время операции (ччммсс, обязательный) xw.writeElementString('ORDERTIME', (function () { var d = new Date() var hh = d.getHours(); if (hh < 10) hh = '0' + hh; var mm = d.getMinutes(); if (mm < 10) mm = '0' + mm; var ss = d.getSeconds(); if (ss < 10) ss = '0' + ss; return hh + '' + mm + '' + ss; })()); //Порядковый номер документа (128 символов, обязательный) xw.writeElementString('ORDERNUM', String(ereceiptStatus.NextLocalNum)); //Фискальный номер документа (128 символов, необязательный) //xw.writeElementString('ORDERTAXNUM', '101234567890123'); //Номер кассы (64 символа, обязательный) if (fiscalSettings.uaprroCASHDESKNUM == null || fiscalSettings.uaprroCASHDESKNUM == '') { alert("Не вказано порядковий номер каси"); } xw.writeElementString('CASHDESKNUM', fiscalSettings.uaprroCASHDESKNUM); if (rroSerialNum == null || rroSerialNum == '') { alert("Не вказано фіскальний номер каси"); } //Фискальный номер регистратора расчётных операций (128 символов, необязательный) xw.writeElementString('CASHREGISTERNUM', rroSerialNum); //ФИО кассира (128 символов, обязательный) var cashierName = "Касир"; try{ cashierName = certData.commonName; //preload.users[currentsklad][userid]["user_name"] }catch(err){ } xw.writeElementString('CASHIER', cashierName); // certData.commonName //Версия документа (Числовой, обязательный) xw.writeElementString('VER', '1'); if(localStorage.prroTesting) { xw.writeElementString('TESTING', 'true'); } xw.writeEndElement(); //Підсумок по чеку xw.writeStartElement('CHECKTOTAL'); //Загальна сума (15.2 цифри) xw.writeElementString('SUM', CurrencyFormatted(thisbasket.cash)); xw.writeEndElement(); var xml = xw.flush(); xw.close(); //clean the writer xw = undefined; //don't let visitors use it, it's closed //console.log("xml", xml); try { //Хрень чисто для отладки //var xmlDOM = new DOMParser().parseFromString(xml, 'text/xml'); //console.log("xml", xml2json(xmlDOM)); } catch (err) { } //Подписываем чек продажи $this.ql.subscribe(xml, userid).then(function (signed) { console.log("signed",signed) /////ТУТ БЫЛ ЗАПРОС //Отправляем чек продажи $this.ExecuteCommand("doc", signed).then(function (res) { //Если прошло успешно то записываем инфу о том что суммы поменялись (нужно для закытия смены) try { //Загальна сума внесення prro_userdata.serviceInput += round(thisbasket["cash"], 2) } catch (err) { console.error(err); } try { //Записываем в памяьб localStorage["currentShift"] = JSON.stringify(prro_userdata); } catch (err) { } try { var dateP = new Date(); var yyP = dateP.getFullYear(); var mmP = dateP.getMonth(); var ddP = dateP.getDate(); var hhP = dateP.getHours(); var minP = dateP.getMinutes(); var ssP = dateP.getSeconds(); var dddP = ddP < 10 ? '0' + ddP : ddP; var mmmP = (mmP + 1) < 10 ? '0' + (mmP + 1) : mmP + 1; var hhhP = hhP < 10 ? '0' + hhP : hhP; var minMinP = minP < 10 ? '0' + minP : minP; var sssP = ssP < 10 ? '0' + ssP : ssP; try{ var systemPrinterValue = deviceItem.settings.printerData.connectionParams.systemPrinter; }catch(err){ var systemPrinterValue = ""; } try{ var ipAdress = deviceItem.settings.printerData.connectionParams.ip; }catch(err){ var ipAdress = ""; } try{ var macAdress = deviceItem.settings.printerData.connectionParams.mac; }catch(err){ var macAdress = ""; } try{ if(deviceItem.settings.printerData.printParams.codepage == null){ deviceItem.settings.printerData.printParams.codepage = "0" } }catch(err){ } try{ var connection = deviceItem.settings.printerData.connectionParams.usb; }catch(err){ } app.print.protocols[deviceItem.settings.connectionParams.printerProtocol]({ uaprro_introduction:true, info:{ allcena: CurrencyFormatted(round(thisbasket.info.allcena, 2)), cash: thisbasket.info.cash > 0 ? CurrencyFormatted(round(thisbasket.info.cash, 2)) : "", date: dddP + '-' + mmmP + '-' + yyP, nall: thisbasket.info.nall > 0 ? CurrencyFormatted(round(thisbasket.info.nall, 2)) : "", sdacha: CurrencyFormatted(round(thisbasket.info.sdacha, 2)), //servicecash: "0", summ: CurrencyFormatted(round(thisbasket.info.summ, 2)), time: hhhP + '-' + minMinP + '-' + sssP, type: "check", visa: CurrencyFormatted(round(thisbasket.info.visa, 2)), fiscalNumber:res.dfsresult.TICKET.ORDERTAXNUM, rroNum:rroSerialNum, companyName:fiscalSettings.uaprroORGNM, pointAdress:fiscalSettings.uaprroPOINTADDR, pointName:fiscalSettings.uaprroPOINTNM, IPN:fiscalSettings.uaprroIPN, IID:fiscalSettings.uaprroTIN, cashRegisterNum:rroSerialNum, ORDERNUM: ereceiptStatus.NextLocalNum, CASHDESKNUM: fiscalSettings.uaprroCASHDESKNUM, comment: thisbasket.comments }, printer:{ buffer: deviceItem.settings.printerData.printParams.buffer != null ? deviceItem.settings.printerData.printParams.buffer : "", charset: deviceItem.settings.printerData.printParams.charset, checks: "3", data: '{"chineseOff":"0","systemPrinter":"'+systemPrinterValue+'"}', feed: deviceItem.settings.printerData.indents.feedBottom, fontsize: deviceItem.settings.printerData.sizes.font, ip: ipAdress, mac:macAdress, logo: logotype, manufacturer: "other", parallel: deviceItem.settings.printerData.printParams.parallel, connection: connection, mode: String(deviceItem.settings.printerData.printParams.printMode), protocol: deviceItem.settings.connectionParams.printerProtocol, size: deviceItem.settings.printerData.sizes.size, width:deviceItem.settings.printerData.sizes.width, header: deviceItem.settings.printerData.additionalPrintParams.header, footer: deviceItem.settings.printerData.additionalPrintParams.footer, systemPrinter: systemPrinterValue, type: "printer", codepage: deviceItem.settings.printerData.printParams.codepage }, ereceiptStatus: ereceiptStatus, ResPRRO: res, Summ: thisbasket.cash }); // console.warn('res', res); // resolve(res) } catch(err) { console.log('error>>>', err); } var xmlDOM = new DOMParser().parseFromString(xml, 'text/xml'); var checkJson = xml2json(xmlDOM); res.checkPRRO = checkJson; console.log('res aaaaaa', res); resolve(res) }).catch(function (err) { reject(err) }) }) } else { alert("Нет активной смены, откройте смену"); reject(); } }).catch(function (err) { reject(err) }) }) }).catch(function (err) { app.main.error(err); $this.ql.openUploadDialog(); }) }, 0, thisbasket); }) }, incasation: function(thisbasket) { console.log("thisbasket incasation>>>>", thisbasket) var deviceItem = thisbasket.printer; //TODO5 var fiscalSettings = deviceItem.settings.fiscalSettings; var tradepoint_id = deviceItem.sklad; var tradepoint = preload.sklad[tradepoint_id]; var tradepointName = tradepoint.title; var tradepointAddr = tradepoint.adress; try{ var logotype = deviceItem.settings.printerData.printParams.additionalPrintParams.logo; }catch(err){ var logotype = ""; } var $this = this; app.main.loader("show"); var rroSerialNum = fiscalSettings.uaprroCASHREGISTERNUM; return new Promise(function (resolve, reject) { setTimeout(function (thisbasket) { //Этот костыль нужен для того чтобы запустить спинер var userid = thisbasket.info.user; //Извлекаем информацию из сертификата $this.ql.getUserECPData(userid).then(function (certData) { //console.warn("certData", certData); //Подписываем документ получения статуса РРО $this.ql.subscribe(JSON.stringify({ Command: "TransactionsRegistrarState", NumFiscal: rroSerialNum }), userid).then(function (signed) { //Отправляем документ получения статуса РРО $this.ExecuteCommand("cmd", signed).then(function (ereceiptStatus) { console.log("ereceiptStatus", ereceiptStatus) //Если смена открыта if (ereceiptStatus.ShiftState == 1) { //Создаем документ продажи var xw = new XMLWriter('windows-1251'); xw.writeStartDocument(); xw.writeStartElement('CHECK').writeAttributeString('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance').writeAttributeString('xsi:noNamespaceSchemaLocation', 'check01.xsd'); xw.writeStartElement('CHECKHEAD'); //Тип документа(Числовой, обязательный): 0-Фіскальний чек, 1-Відкриття зміни, 2-Закриття зміни xw.writeElementString('DOCTYPE', '0'); //Расширенный тип документа(Числовой, обязательный) //Для DOCTYPE=0: 0-Касовий чек на товари (послуги), 1-Видатковий чек, 2-Чек операції «службове внесення», 3-Чек операції «службова видача»--> //Для DOCTYPE!=0: 0 xw.writeElementString('DOCSUBTYPE', '4'); //Уникальный идентификатор документа (GUID, обязательный) xw.writeElementString('UID', app.print.modules.guid()); if (fiscalSettings.uaprroTIN != '') { //ЕДРПОУ/ДРФО/№ паспорта продавца (10 символов, обязательный) xw.writeElementString('TIN', fiscalSettings.uaprroTIN); } else if (certData.DRFO != '' && certData.DRFO != null) { //ЕДРПОУ/ДРФО/№ паспорта продавца (10 символов, обязательный) xw.writeElementString('TIN', certData.DRFO); } if (fiscalSettings.uaprroIPN != '' && fiscalSettings.uaprroIPN != null) { //ИНН продавца (12 символов, необязательный) xw.writeElementString('IPN', fiscalSettings.uaprroIPN); } else if (certData.DRFO != '' && certData.DRFO != null) { //ИНН продавца (12 символов, необязательный) //xw.writeElementString('IPN', certData.DRFO); } if (fiscalSettings.uaprroORGNM != "") { //Наименование продавца (256 символов, обязательный) xw.writeElementString('ORGNM', fiscalSettings.uaprroORGNM); //preload.settings.companyname } else if (preload.settings.companyname != '') { //Наименование продавца (256 символов, обязательный) xw.writeElementString('ORGNM', preload.settings.companyname); //preload.settings.companyname } else { alert("Не вказано найменування організації"); } if (fiscalSettings.uaprroPOINTNM != '') { //Наименование точки продаж (256 символов, обязательный) xw.writeElementString('POINTNM', fiscalSettings.uaprroPOINTNM); } else if (tradepointName != '') { //Наименование точки продаж (256 символов, обязательный) xw.writeElementString('POINTNM', tradepointName); } else { alert("Не вказано найменування точки продаж"); } if (fiscalSettings.uaprroPOINTADDR != '') { //Адрес точки продаж (256 символов, обязательный) xw.writeElementString('POINTADDR', fiscalSettings.uaprroPOINTADDR); } else if (tradepointAddr != '') { //Адрес точки продаж (256 символов, обязательный) xw.writeElementString('POINTADDR', tradepointAddr); } else { alert("Не вказано адресу торгової точки"); } //Дата операции (ддммгггг, обязательный) xw.writeElementString('ORDERDATE', (function () { var d = new Date(); var dd = d.getDate(); if (dd < 10) dd = '0' + dd; var mm = d.getMonth() + 1; if (mm < 10) mm = '0' + mm; var yy = d.getFullYear(); return dd + '' + mm + '' + yy; })()); //Время операции (ччммсс, обязательный) xw.writeElementString('ORDERTIME', (function () { var d = new Date() var hh = d.getHours(); if (hh < 10) hh = '0' + hh; var mm = d.getMinutes(); if (mm < 10) mm = '0' + mm; var ss = d.getSeconds(); if (ss < 10) ss = '0' + ss; return hh + '' + mm + '' + ss; })()); //Порядковый номер документа (128 символов, обязательный) xw.writeElementString('ORDERNUM', String(ereceiptStatus.NextLocalNum)); //Фискальный номер документа (128 символов, необязательный) //xw.writeElementString('ORDERTAXNUM', '101234567890123'); //Номер кассы (64 символа, обязательный) if (fiscalSettings.uaprroCASHDESKNUM == null || fiscalSettings.uaprroCASHDESKNUM == '') { alert("Не вказано порядковий номер каси"); } xw.writeElementString('CASHDESKNUM', fiscalSettings.uaprroCASHDESKNUM); if (rroSerialNum == null || rroSerialNum == '') { alert("Не вказано фіскальний номер каси"); } //Фискальный номер регистратора расчётных операций (128 символов, необязательный) xw.writeElementString('CASHREGISTERNUM', rroSerialNum); //ФИО кассира (128 символов, обязательный) var cashierName = "Касир"; try{ cashierName = certData.commonName; //preload.users[currentsklad][userid]["user_name"] }catch(err){ } xw.writeElementString('CASHIER', cashierName); // certData.commonName //Версия документа (Числовой, обязательный) xw.writeElementString('VER', '1'); if(localStorage.prroTesting) { xw.writeElementString('TESTING', 'true'); } xw.writeEndElement(); //Підсумок по чеку xw.writeStartElement('CHECKTOTAL'); //Загальна сума (15.2 цифри) xw.writeElementString('SUM', CurrencyFormatted(thisbasket.cash)); xw.writeEndElement(); var xml = xw.flush(); xw.close(); //clean the writer xw = undefined; //don't let visitors use it, it's closed //console.log("xml", xml); try { //Хрень чисто для отладки //var xmlDOM = new DOMParser().parseFromString(xml, 'text/xml'); //console.log("xml", xml2json(xmlDOM)); } catch (err) { } //Подписываем чек продажи $this.ql.subscribe(xml, userid).then(function (signed) { //console.log("signed",signed) /////ТУТ БЫЛ ЗАПРОС //Отправляем чек продажи $this.ExecuteCommand("doc", signed).then(function (res) { //Если прошло успешно то записываем инфу о том что суммы поменялись (нужно для закытия смены) try { //Загальна сума внесення prro_userdata.serviceOutput += round(thisbasket["cash"], 2) } catch (err) { console.error(err); } try { //Записываем в памяьб localStorage["currentShift"] = JSON.stringify(prro_userdata); } catch (err) { } try { var dateP = new Date(); var yyP = dateP.getFullYear(); var mmP = dateP.getMonth(); var ddP = dateP.getDate(); var hhP = dateP.getHours(); var minP = dateP.getMinutes(); var ssP = dateP.getSeconds(); var dddP = ddP < 10 ? '0' + ddP : ddP; var mmmP = (mmP + 1) < 10 ? '0' + (mmP + 1) : mmP + 1; var hhhP = hhP < 10 ? '0' + hhP : hhP; var minMinP = minP < 10 ? '0' + minP : minP; var sssP = ssP < 10 ? '0' + ssP : ssP; try{ var systemPrinterValue = deviceItem.settings.printerData.connectionParams.systemPrinter; }catch(err){ var systemPrinterValue = ""; } try{ var ipAdress = deviceItem.settings.printerData.connectionParams.ip; }catch(err){ var ipAdress = ""; } try{ var macAdress = deviceItem.settings.printerData.connectionParams.mac; }catch(err){ var macAdress = ""; } try{ if(deviceItem.settings.printerData.printParams.codepage == null){ deviceItem.settings.printerData.printParams.codepage = "0" } }catch(err){ } try{ var connection = deviceItem.settings.printerData.connectionParams.usb; }catch(err){ } app.print.protocols[deviceItem.settings.connectionParams.printerProtocol]({ uaprro_incasation:true, info:{ allcena: CurrencyFormatted(round(thisbasket.info.allcena, 2)), cash: thisbasket.info.cash > 0 ? CurrencyFormatted(round(thisbasket.info.cash, 2)) : "", date: dddP + '-' + mmmP + '-' + yyP, nall: thisbasket.info.nall > 0 ? CurrencyFormatted(round(thisbasket.info.nall, 2)) : "", sdacha: CurrencyFormatted(round(thisbasket.info.sdacha, 2)), //servicecash: "0", summ: CurrencyFormatted(round(thisbasket.info.summ, 2)), time: hhhP + '-' + minMinP + '-' + sssP,//thisbasket.info.time, type: "check", visa: CurrencyFormatted(round(thisbasket.info.visa, 2)), fiscalNumber:res.dfsresult.TICKET.ORDERTAXNUM, rroNum:rroSerialNum, companyName:fiscalSettings.uaprroORGNM, pointAdress:fiscalSettings.uaprroPOINTADDR, pointName:fiscalSettings.uaprroPOINTNM, IPN:fiscalSettings.uaprroIPN, IID:fiscalSettings.uaprroTIN, cashRegisterNum:rroSerialNum, ORDERNUM: ereceiptStatus.NextLocalNum, CASHDESKNUM: fiscalSettings.uaprroCASHDESKNUM, comment: thisbasket.comments }, printer:{ buffer: deviceItem.settings.printerData.printParams.buffer != null ? deviceItem.settings.printerData.printParams.buffer : "", charset: deviceItem.settings.printerData.printParams.charset, checks: "3", data: '{"chineseOff":"0","systemPrinter":"'+systemPrinterValue+'"}', feed: deviceItem.settings.printerData.indents.feedBottom, fontsize: deviceItem.settings.printerData.sizes.font, ip: ipAdress, mac:macAdress, logo: logotype, manufacturer: "other", parallel: deviceItem.settings.printerData.printParams.parallel, connection: connection, mode: String(deviceItem.settings.printerData.printParams.printMode), protocol: deviceItem.settings.connectionParams.printerProtocol, size: deviceItem.settings.printerData.sizes.size, width:deviceItem.settings.printerData.sizes.width, header: deviceItem.settings.printerData.additionalPrintParams.header, footer: deviceItem.settings.printerData.additionalPrintParams.footer, systemPrinter: systemPrinterValue, type: "printer", codepage: deviceItem.settings.printerData.printParams.codepage }, ereceiptStatus: ereceiptStatus, ResPRRO: res, Summ: thisbasket.cash }); } catch(err) { console.log('error>>>', err); } var xmlDOM = new DOMParser().parseFromString(xml, 'text/xml'); var checkJson = xml2json(xmlDOM); res.checkPRRO = checkJson; resolve(res) }).catch(function (err) { reject(err) }) }) } else { alert("Нет активной смены, откройте смену"); reject(); } }).catch(function (err) { reject(err) }) }) }).catch(function (err) { app.main.error(err); $this.ql.openUploadDialog(); }) }, 0, thisbasket); }) }, rashod: function(thisbasket) { console.log("thisbasket", thisbasket) var deviceItem = thisbasket.printer; //TODO5 var fiscalSettings = deviceItem.settings.fiscalSettings; var tradepoint_id = deviceItem.sklad; var tradepoint = preload.sklad[tradepoint_id]; var tradepointName = tradepoint.title; var tradepointAddr = tradepoint.adress; var $this = this; app.main.loader("show"); try{ var logotype = deviceItem.settings.printerData.printParams.additionalPrintParams.logo; }catch(err){ var logotype = ""; } var rroSerialNum = fiscalSettings.uaprroCASHREGISTERNUM; return new Promise(function (resolve, reject) { setTimeout(function (thisbasket) { //Этот костыль нужен для того чтобы запустить спинер var userid = thisbasket.info.user; //Извлекаем информацию из сертификата $this.ql.getUserECPData(userid).then(function (certData) { //console.warn("certData", certData); //Подписываем документ получения статуса РРО $this.ql.subscribe(JSON.stringify({ Command: "TransactionsRegistrarState", NumFiscal: rroSerialNum }), userid).then(function (signed) { //Отправляем документ получения статуса РРО $this.ExecuteCommand("cmd", signed).then(function (ereceiptStatus) { console.log("ereceiptStatus", ereceiptStatus) //Если смена открыта if (ereceiptStatus.ShiftState == 1) { //Создаем документ продажи var xw = new XMLWriter('windows-1251'); xw.writeStartDocument(); xw.writeStartElement('CHECK').writeAttributeString('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance').writeAttributeString('xsi:noNamespaceSchemaLocation', 'check01.xsd'); xw.writeStartElement('CHECKHEAD'); //Тип документа(Числовой, обязательный): 0-Фіскальний чек, 1-Відкриття зміни, 2-Закриття зміни xw.writeElementString('DOCTYPE', '0'); //Расширенный тип документа(Числовой, обязательный) //Для DOCTYPE=0: 0-Касовий чек на товари (послуги), 1-Видатковий чек, 2-Чек операції «службове внесення», 3-Чек операції «службова видача»--> //Для DOCTYPE!=0: 0 xw.writeElementString('DOCSUBTYPE', '4'); //Уникальный идентификатор документа (GUID, обязательный) xw.writeElementString('UID', app.print.modules.guid()); if (fiscalSettings.uaprroTIN != '') { //ЕДРПОУ/ДРФО/№ паспорта продавца (10 символов, обязательный) xw.writeElementString('TIN', fiscalSettings.uaprroTIN); } else if (certData.DRFO != '' && certData.DRFO != null) { //ЕДРПОУ/ДРФО/№ паспорта продавца (10 символов, обязательный) xw.writeElementString('TIN', certData.DRFO); } if (fiscalSettings.uaprroIPN != '' && fiscalSettings.uaprroIPN != null) { //ИНН продавца (12 символов, необязательный) xw.writeElementString('IPN', fiscalSettings.uaprroIPN); } else if (certData.DRFO != '' && certData.DRFO != null) { //ИНН продавца (12 символов, необязательный) //xw.writeElementString('IPN', certData.DRFO); } if (fiscalSettings.uaprroORGNM != "") { //Наименование продавца (256 символов, обязательный) xw.writeElementString('ORGNM', fiscalSettings.uaprroORGNM); //preload.settings.companyname } else if (preload.settings.companyname != '') { //Наименование продавца (256 символов, обязательный) xw.writeElementString('ORGNM', preload.settings.companyname); //preload.settings.companyname } else { alert("Не вказано найменування організації"); } if (fiscalSettings.uaprroPOINTNM != '') { //Наименование точки продаж (256 символов, обязательный) xw.writeElementString('POINTNM', fiscalSettings.uaprroPOINTNM); } else if (tradepointName != '') { //Наименование точки продаж (256 символов, обязательный) xw.writeElementString('POINTNM', tradepointName); } else { alert("Не вказано найменування точки продаж"); } if (fiscalSettings.uaprroPOINTADDR != '') { //Адрес точки продаж (256 символов, обязательный) xw.writeElementString('POINTADDR', fiscalSettings.uaprroPOINTADDR); } else if (tradepointAddr != '') { //Адрес точки продаж (256 символов, обязательный) xw.writeElementString('POINTADDR', tradepointAddr); } else { alert("Не вказано адресу торгової точки"); } //Дата операции (ддммгггг, обязательный) xw.writeElementString('ORDERDATE', (function () { var d = new Date(); var dd = d.getDate(); if (dd < 10) dd = '0' + dd; var mm = d.getMonth() + 1; if (mm < 10) mm = '0' + mm; var yy = d.getFullYear(); return dd + '' + mm + '' + yy; })()); //Время операции (ччммсс, обязательный) xw.writeElementString('ORDERTIME', (function () { var d = new Date() var hh = d.getHours(); if (hh < 10) hh = '0' + hh; var mm = d.getMinutes(); if (mm < 10) mm = '0' + mm; var ss = d.getSeconds(); if (ss < 10) ss = '0' + ss; return hh + '' + mm + '' + ss; })()); //Порядковый номер документа (128 символов, обязательный) xw.writeElementString('ORDERNUM', String(ereceiptStatus.NextLocalNum)); //Фискальный номер документа (128 символов, необязательный) //xw.writeElementString('ORDERTAXNUM', '101234567890123'); //Номер кассы (64 символа, обязательный) if (fiscalSettings.uaprroCASHDESKNUM == null || fiscalSettings.uaprroCASHDESKNUM == '') { alert("Не вказано порядковий номер каси"); } xw.writeElementString('CASHDESKNUM', fiscalSettings.uaprroCASHDESKNUM); if (rroSerialNum == null || rroSerialNum == '') { alert("Не вказано фіскальний номер каси"); } //Фискальный номер регистратора расчётных операций (128 символов, необязательный) xw.writeElementString('CASHREGISTERNUM', rroSerialNum); //ФИО кассира (128 символов, обязательный) var cashierName = "Касир"; try{ cashierName = certData.commonName; //preload.users[currentsklad][userid]["user_name"] }catch(err){ } xw.writeElementString('CASHIER', cashierName); // certData.commonName //Версия документа (Числовой, обязательный) xw.writeElementString('VER', '1'); if(localStorage.prroTesting) { xw.writeElementString('TESTING', 'true'); } xw.writeEndElement(); //Підсумок по чеку xw.writeStartElement('CHECKTOTAL'); //Загальна сума (15.2 цифри) xw.writeElementString('SUM', CurrencyFormatted(thisbasket.cash)); xw.writeEndElement(); var xml = xw.flush(); xw.close(); //clean the writer xw = undefined; //don't let visitors use it, it's closed //console.log("xml", xml); try { //Хрень чисто для отладки //var xmlDOM = new DOMParser().parseFromString(xml, 'text/xml'); //console.log("xml", xml2json(xmlDOM)); } catch (err) { } //Подписываем чек продажи $this.ql.subscribe(xml, userid).then(function (signed) { //console.log("signed",signed) /////ТУТ БЫЛ ЗАПРОС //Отправляем чек продажи $this.ExecuteCommand("doc", signed).then(function (res) { //Если прошло успешно то записываем инфу о том что суммы поменялись (нужно для закытия смены) try { //Загальна сума внесення prro_userdata.serviceOutput += round(thisbasket["cash"], 2) } catch (err) { console.error(err); } try { //Записываем в памяьб localStorage["currentShift"] = JSON.stringify(prro_userdata); } catch (err) { } try { var dateP = new Date(); var yyP = dateP.getFullYear(); var mmP = dateP.getMonth(); var ddP = dateP.getDate(); var hhP = dateP.getHours(); var minP = dateP.getMinutes(); var ssP = dateP.getSeconds(); var dddP = ddP < 10 ? '0' + ddP : ddP; var mmmP = (mmP + 1) < 10 ? '0' + (mmP + 1) : mmP + 1; var hhhP = hhP < 10 ? '0' + hhP : hhP; var minMinP = minP < 10 ? '0' + minP : minP; var sssP = ssP < 10 ? '0' + ssP : ssP; try{ var systemPrinterValue = deviceItem.settings.printerData.connectionParams.systemPrinter; }catch(err){ var systemPrinterValue = ""; } try{ var ipAdress = deviceItem.settings.printerData.connectionParams.ip; }catch(err){ var ipAdress = ""; } try{ var macAdress = deviceItem.settings.printerData.connectionParams.mac; }catch(err){ var macAdress = ""; } try{ if(deviceItem.settings.printerData.printParams.codepage == null){ deviceItem.settings.printerData.printParams.codepage = "0" } }catch(err){ } try{ var connection = deviceItem.settings.printerData.connectionParams.usb; }catch(err){ } app.print.protocols[deviceItem.settings.connectionParams.printerProtocol]({ uaprro_rashod:true, info:{ allcena: CurrencyFormatted(round(thisbasket.info.allcena, 2)), cash: thisbasket.info.cash > 0 ? CurrencyFormatted(round(thisbasket.info.cash, 2)) : "", date: dddP + '-' + mmmP + '-' + yyP,//cdate[2] +"-"+ cdate[1] +"-"+ cdate[0], nall: thisbasket.info.nall > 0 ? CurrencyFormatted(round(thisbasket.info.nall, 2)) : "", sdacha: CurrencyFormatted(round(thisbasket.info.sdacha, 2)), //servicecash: "0", summ: CurrencyFormatted(round(thisbasket.info.summ, 2)), time: hhhP + '-' + minMinP + '-' + sssP,//thisbasket.info.time, type: "check", visa: CurrencyFormatted(round(thisbasket.info.visa, 2)), fiscalNumber:res.dfsresult.TICKET.ORDERTAXNUM, rroNum:rroSerialNum, companyName:fiscalSettings.uaprroORGNM, pointAdress:fiscalSettings.uaprroPOINTADDR, pointName:fiscalSettings.uaprroPOINTNM, IPN:fiscalSettings.uaprroIPN, IID:fiscalSettings.uaprroTIN, cashRegisterNum:rroSerialNum, ORDERNUM: ereceiptStatus.NextLocalNum, CASHDESKNUM: fiscalSettings.uaprroCASHDESKNUM, comment: thisbasket.comments }, printer:{ buffer: deviceItem.settings.printerData.printParams.buffer != null ? deviceItem.settings.printerData.printParams.buffer : "", charset: deviceItem.settings.printerData.printParams.charset, checks: "3", data: '{"chineseOff":"0","systemPrinter":"'+systemPrinterValue+'"}', feed: deviceItem.settings.printerData.indents.feedBottom, fontsize: deviceItem.settings.printerData.sizes.font, ip: ipAdress, mac:macAdress, logo: logotype, manufacturer: "other", parallel: deviceItem.settings.printerData.printParams.parallel, connection: connection, mode: String(deviceItem.settings.printerData.printParams.printMode), protocol: deviceItem.settings.connectionParams.printerProtocol, size: deviceItem.settings.printerData.sizes.size, width:deviceItem.settings.printerData.sizes.width, header: deviceItem.settings.printerData.additionalPrintParams.header, footer: deviceItem.settings.printerData.additionalPrintParams.footer, systemPrinter: systemPrinterValue, type: "printer", codepage: deviceItem.settings.printerData.printParams.codepage }, ereceiptStatus: ereceiptStatus, ResPRRO: res, Summ: thisbasket.cash }); } catch(err) { console.log('error>>>', err); } var xmlDOM = new DOMParser().parseFromString(xml, 'text/xml'); var checkJson = xml2json(xmlDOM); res.checkPRRO = checkJson; resolve(res) }).catch(function (err) { reject(err) }) }) } else { alert("Нет активной смены, откройте смену"); reject(); } }).catch(function (err) { reject(err) }) }) }).catch(function (err) { app.main.error(err); $this.ql.openUploadDialog(); }) }, 0, thisbasket); }) }, ExecuteCommand: function(type, signedData) { console.warn('начала отрабатывать функция ex comm =>', type, signedData); //type: doc cmd var $this = this; return new Promise(function (resolve, reject) { app.main.loader("show"); //online.skyservice.pro xhr("https://skymarket.top/prro.php?action=" + type, signedData).then(function (json) { console.warn('json json =====>', json); app.main.loader("hide"); try{ var content = JSON.parse(json); console.log(content) if (content.doc) { app.main.loader("show"); var xmldata = app.main.Base64.decode(CSP.getSignedDataContent(content.doc), true); console.log("Результат в XML", xmldata); var xmlDOM = new DOMParser().parseFromString(xmldata, 'text/xml'); var json1 = xml2json(xmlDOM); console.log(json1) app.main.loader("hide"); if (json1.TICKET.ERRORCODE == 0) { resolve({ "status": "done", "dfsresult": json1 }) } else { if (json1.TICKET.ERRORCODE == 7) { } alert("ПРРО: " + json1.TICKET.ERRORTEXT); app.main.loader("hide") reject({ "status": "error" }) } // var json2 = xmlToJson(xmlDOM); // console.log(json2) } if (content.error) { app.main.loader("hide"); alert("ПРРО: " + content.error); reject({ "status": "error" }) } else { resolve(content) } //console.log("Ответ",JSON.parse(Base64.decode(json,true))); }catch(err){ reject({ "status": "error", "text":json }) } }).catch(function () { app.main.loader("hide"); reject({ "status": "error" }) }) }) }, }, skyserviceatolkkmserver: { opensmena: function(thisbasket) { // Подготовка данных команды var jsonData = { // Команда серверу "ZReport" ИЛИ "XReport" Command: "OpenShift", Protocol: 1, //PortName:"ttyACM0", PortName: thisbasket.printer.serialport, CashierName: preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], CashierVATIN: preload["users"][currentsklad][thisbasket["info"]["user"]]["user_vatin"], PortSpeed: 0, Printer: thisbasket.printer, // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: 0, // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды // Поле не обязательно IdCommand: app.print.modules.guid() }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.skyserviceatolkkmserver.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, closecurcheck: function(thisbasket) { this.ExecuteCommand({ Command: "CloseCurCheck", Protocol: 1, PortName: thisbasket.printer.serialport, PortSpeed: 0, Printer: thisbasket.printer, NumDevice: 0, IdCommand: app.print.modules.guid() }); }, vozvrat: function(thisbasket) { var nallll = 0; var kostilsumm = 0; var newfiscalarr = []; var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); fiscalarr.forEach(function(item) { if (item["tax"] == null) { item["tax"] = ""; } console.log("thisbasket", thisbasket); //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } if (item["tax"] != "") { newfiscalarr.push({ Register: { SignMethodCalculation: 4, SignCalculationObject: 1, Name: item["name"], Quantity: round(item["kolvo"]), Price: round(item["cenaout"]), Amount: round(amount), Department: 0, PerDisc: 0, SumDisc: 0, Tax: round(item["tax"], 0), } }); /*Плюсуем сумму*/ nallll = nallll + amount; } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ kostilsumm = kostilsumm + amount; } }); if (kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы онлайн кассе"); } // Вызов команды var jsonData = { Command: "RegisterCheck", Protocol: 1, PortName: thisbasket.printer.serialport, PortSpeed: 0, Printer: thisbasket.printer, IsFiscalCheck: true, TypeCheck: 2, CashierName: preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], CashierVATIN: preload["users"][currentsklad][thisbasket["info"]["user"]]["user_vatin"], TaxVariant: round(thisbasket["printer"]["cno"], 0), CheckStrings: newfiscalarr, Cash: round(nallll, 2), Nall: round(nallll, 2), ElectronicPayment: round(thisbasket["info"]["visa"], 2), AdvancePayment: 0, Credit: 0, CashProvision: 0, PerDisc: 0, SumDisc: 0, CashLessType: 0 } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.skyserviceatolkkmserver.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, check: function(thisbasket) { // Подготовка данных команды var nallll = 0, newfiscalarr = [], amount = 0, fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; //Собираем нужный массив и убираем позиции которые не подлежат налогообложению fiscalarr.forEach(function(item) { /*Используется для применения скидки*/ if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] != "") { flag = 1; newfiscalarr.push({ Register: { SignMethodCalculation: 4, SignCalculationObject: 1, Name: item["name"], Quantity: round(item["kolvo"]), Amount: amount, Price: round(item["cenaout"]), Department: 0, PerDisc: 0, SumDisc: 0, Tax: round(item["tax"], 0) } }); /*Плюсуем сумму*/ nallll = nallll + amount; } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ kostilsumm = kostilsumm + amount; } }); //var dali = round(nallll, 2); //if(thisbasket["info"]["nall"] > 0) { // dali = thisbasket["info"]["nall"] //} var dali = thisbasket["info"]["cash"]; if (thisbasket["info"]["nall"] > 0) { dali = thisbasket["info"]["nall"] } //Отнимаем от суммы которую дал клиент сумму товара который не пошел на печать на фискальник dali = dali - kostilsumm; if (kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы онлайн кассе"); } var Data = { Command: "RegisterCheck", Protocol: 1, PortName: thisbasket.printer.serialport, PortSpeed: 0, Printer: thisbasket.printer, NumDevice: 0, Timeout: 30, IdCommand: app.print.modules.guid(), IsFiscalCheck: true, TypeCheck: 1, NotPrint: false, //true, NumberCopies: 0, // Продавец, тег ОФД 1021 CashierName: preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], CashierVATIN: preload["users"][currentsklad][thisbasket["info"]["user"]]["user_vatin"], TaxVariant: round(thisbasket["printer"]["cno"], 0), CheckStrings: newfiscalarr, Cash: round(nallll, 2), Nall: dali, ElectronicPayment: round(thisbasket["info"]["visa"]), // Сумма из предоплаты (зачетом аванса) (2 знака после запятой) AdvancePayment: 0, // Сумма постоплатой(в кредит) (2 знака после запятой) Credit: 0, // Сумма оплаты встречным предоставлением (сертификаты, др. мат.ценности) (2 знака после запятой) CashProvision: 0, PerDisc: 0, SumDisc: 0, CashLessType: 0 } // Вызов команды if (flag == 1) {} else { console.warn("flag"); var ooo = { status: "done" }; } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.skyserviceatolkkmserver.ExecuteCommand(Data).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, precheck: function(thisbasket) {}, introduction: function(data) { var jsonData = { Command: "CashMotion", Summ: round(data["cash"]), Protocol: 1, PortName: data.printer.serialport, PortSpeed: 0, Printer: data.printer, NumDevice: 0, IdCommand: app.print.modules.guid() } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.skyserviceatolkkmserver.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, incasation: function(data) { var jsonData = { Command: "CashMotion", Summ: -data["cash"], Protocol: 1, PortName: data.printer.serialport, PortSpeed: 0, Printer: data.printer, NumDevice: 0, IdCommand: app.print.modules.guid() } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.skyserviceatolkkmserver.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, rashod: function(data) { var jsonData = { Command: "CashMotion", Summ: -data["cash"], Protocol: 1, PortName: data.printer.serialport, PortSpeed: 0, Printer: data.printer, NumDevice: 0, IdCommand: app.print.modules.guid() } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.skyserviceatolkkmserver.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, otmena: function(thisbasket) {}, XReport: function(thisbasket) { var jsonData = { Command: "XReport", Protocol: 1, PortName: thisbasket.printer.serialport, CashierName: preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], CashierVATIN: preload["users"][currentsklad][thisbasket["info"]["user"]]["user_vatin"], PortSpeed: 0, Printer: thisbasket.printer, NumDevice: 0, IdCommand: app.print.modules.guid() } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.skyserviceatolkkmserver.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, ZReport: function(thisbasket) { var jsonData = { Command: "ZReport", Protocol: 1, PortName: thisbasket.printer.serialport, CashierName: preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], CashierVATIN: preload["users"][currentsklad][thisbasket["info"]["user"]]["user_vatin"], PortSpeed: 0, Printer: thisbasket.printer, NumDevice: 0, IdCommand: app.print.modules.guid() } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.skyserviceatolkkmserver.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, ExecuteCommand: function(Data) { switch (Data.Printer.model) { case "auto": Data.Model = 500; break; case "11F": Data.Model = 67; break; case "15F": Data.Model = 78; break; case "20F": Data.Model = 81; break; case "22F": Data.Model = 63; break; case "25F": Data.Model = 57; break; case "30F": Data.Model = 61; break; case "42FS": Data.Model = 77; break; case "50F": Data.Model = 80; break; case "52F": Data.Model = 64; break; case "55F": Data.Model = 62; break; case "60F": Data.Model = 75; break; case "77F": Data.Model = 69; break; case "90F": Data.Model = 72; break; case "91F": Data.Model = 82; break; } Data.BaudRate = 115200; Data.Port = 0; //COM var IP = Data.Printer.ip; /*Код макса сервера ломается от этого обьекта поетому стираем*/ //delete Data.Printer; Data.Printer = {}; app.main.loader("show"); var User = "User"; var Password = ""; var check = JSON.stringify(Data); return new Promise(function(resolve, reject) { if (device.android() == true) { var req = Android.httpsender("http://" + IP + ":3378", "jsondata=" + check) //тут бы нам ответ получить resolve({ status: "done" }); } else { console.log("Ajax", IP + ":3378"); xhr("http://" + IP + ":3378", "jsondata=" + check).then(function(json) { console.log("json", json) try { var content = JSON.parse(json); } catch (err) { var content = {}; } app.main.loader("hide"); //{"LastError":{"Code":3,"Text":"Порт занят"},"status":"error"} if (content.status == "error") { app.main.error("Error: " + content.LastError.Text); reject({ status: "error" }); } if (content.status == "done") { //Ошибок нет resolve({ status: "done" }); } console.log(content); }, function(error) { app.main.loader("hide"); reject({ status: "error" }); app.main.loader("hide"); app.main.error("Нет соединения с \"Skyservice Atol web-сервер\""); }); } }) }, }, evotorkkm: { check: function(thisbasket) { //- добавлено обязательное поле "CashierVATIN" - ИНН продавца //- добавлено не обязательное поле "SenderEmail" - Aдрес электронной почты отправителя чека //- Добавлены поле "ElectronicPayment" - Сумма электронной оплаты //- Добавлены поле "AdvancePayment" - Сумма из предоплаты (зачетом аванса) //- Добавлены поле "Credit" - Сумма постоплатой(в кредит) //- Добавлены поле "CashProvision" - Сумма оплаты встречным предоставлением (сертификаты, тара, др. мат. ценности) //- в фискальной строке добавлены поля: //- "SignMethodCalculation" - Признак способа расчета, обязательно! //- "SignCalculationObject" - Признак предмета расчета, обязательно! //- "MeasurementUnit" - Единица измерения предмета расчета //- "NomenclatureCode" - Код товарной номенклатуры (Новый классификатор товаров и услуг. Пока не утвержден налоговой.) //- "AgentSign" - Признак агента //- "AgentData" - Данные агента (если указан AgentSign) //- "PurveyorData" - Признак поставщика (если указан AgentSign) //В возвращаемых данных: //- в поле "URL" будет возвращаться ссылка на чек в ОФД (для тех ОФД для которых можно сформировать такую ссылку) //- в поле "QRCode" будет возвращаться данные, которые закодированы в QR коде на чеке (ранее это возвращалось в поле "URL") // Подготовка данных команды // var dddd = thisbasket["products"]; // dddd.forEach(function(item) { // }) var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); var newfiscalarr = []; //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; //Собираем нужный массив и убираем позиции которые не подлежат налогообложению fiscalarr.forEach(function(item) { //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] == null) { item["tax"] = ""; } if (item["tax"] != "") { flag = 1; var newitem = {} // Признак способа расчета. тег ОФД 1214. Для ФФД.1.05 и выше обязательное поле // 1: "ПРЕДОПЛАТА 100% (Полная предварительная оплата до момента передачи предмета расчета)" // 2: "ПРЕДОПЛАТА (Частичная предварительная оплата до момента передачи предмета расчета)" // 3: "АВАНС" // 4: "ПОЛНЫЙ РАСЧЕТ (Полная оплата, в том числе с учетом аванса в момент передачи предмета расчета)" // 5: "ЧАСТИЧНЫЙ РАСЧЕТ И КРЕДИТ (Частичная оплата предмета расчета в момент его передачи с последующей оплатой в кредит )" // 6: "ПЕРЕДАЧА В КРЕДИТ (Передача предмета расчета без его оплаты в момент его передачи с последующей оплатой в кредит)" // 7: "ОПЛАТА КРЕДИТА (Оплата предмета расчета после его передачи с оплатой в кредит )" newitem["SignMethodCalculation"] = 4; // Признак предмета расчета. тег ОФД 1212. Для ФФД.1.1 и выше обязательное поле // 1: "ТОВАР (наименование и иные сведения, описывающие товар)" // 2: "ПОДАКЦИЗНЫЙ ТОВАР (наименование и иные сведения, описывающие товар)" // 3: "РАБОТА (наименование и иные сведения, описывающие работу)" // 4: "УСЛУГА (наименование и иные сведения, описывающие услугу)" // 5: "СТАВКА АЗАРТНОЙ ИГРЫ (при осуществлении деятельности по проведению азартных игр)" // 6: "ВЫИГРЫШ АЗАРТНОЙ ИГРЫ (при осуществлении деятельности по проведению азартных игр)" // 7: "ЛОТЕРЕЙНЫЙ БИЛЕТ (при осуществлении деятельности по проведению лотерей)" // 8: "ВЫИГРЫШ ЛОТЕРЕИ (при осуществлении деятельности по проведению лотерей)" // 9: "ПРЕДОСТАВЛЕНИЕ РИД (предоставлении прав на использование результатов интеллектуальной деятельности или средств индивидуализации)" // 10: "ПЛАТЕЖ (аванс, задаток, предоплата, кредит, взнос в счет оплаты, пени, штраф, вознаграждение, бонус и иной аналогичный предмет расчета)" // 11: "АГЕНТСКОЕ ВОЗНАГРАЖДЕНИЕ (вознаграждение (банковского)платежного агента/субагента, комиссионера, поверенного или иным агентом)" // 12: "СОСТАВНОЙ ПРЕДМЕТ РАСЧЕТА (предмет расчета, состоящем из предметов, каждому из которых может быть присвоено вышестоящее значение" // 13: "ИНОЙ ПРЕДМЕТ РАСЧЕТА (предмет расчета, не относящемуся к предметам расчета, которым может быть присвоено вышестоящее значение" newitem["SignCalculationObject"] = 1; // Единица измерения предмета расчета. Можно не указывать //MeasurementUnit: "пара", // Код товарной номенклатуры Тег ОФД 1162 (Новый классификатор товаров и услуг. Пока не утвержден налоговой. Пока не указывать) // 4 символа – код справочника; последующие 8 символовт – код группы товаров; последние 20 символов – код идентификации товара //NomenclatureCode: "", // Признак агента. Тег ОФД 1057, 1222. Поле не обязательное. Можно вообще не указывать. // 0: "Банковский платежный агент:" Оказание услуг пользователем, являющимся банковским платежным агентом // 1: "Банковский платежный субагент:" Оказание услуг пользователем, являющимся банковским платежным субагентом // 2: "Платежный агент:" Оказание услуг пользователем, являющимся платежным агентом // 3: "Платежный субагент:" Оказание услуг пользователем, являющимся платежным субагентом // 4: "Поверенный:" Оказание услуг пользователем, являющимся поверенным // 5: "Комиссионер:" Оказание услуг пользователем, являющимся комиссионером // 6: "Агент:" Оказание услуг пользователем, являющимся агентом и не являющимся банковским платежным агентом (субагентом), платежным агентом (субагентом), поверенным, комиссионером // Данные для ЕГАИС системы, можно не указывать //EGAIS: { // Barcode: "22N0000154NUCPRZ3R8381461004001003499NKAQ0ZBUVDNV62JQAR69PEV878RO93V", // Ean: "3423290167937", // Volume: 0.7500, //}, newitem["Name"] = item["name"]; newitem["Quantity"] = item["kolvo"]; newitem["Price"] = item["cenaout"]; newitem["uuid"] = app.print.modules.guid(); item["uuid"] = newitem["uuid"]; if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } newitem["Amount"] = amount; newitem["Department"] = 0; newitem["Tax"] = round(item["tax"], 0); newitem["EAN13"] = "999999"; newitem["unit"] = "шт."; newfiscalarr.push(newitem) } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } kostilsumm = kostilsumm + amount; } }); var dali = thisbasket["info"]["cash"]; if (thisbasket["info"]["nall"] > 0) { dali = thisbasket["info"]["nall"] } //Отнимаем от суммы которую дал клиент сумму товара который не пошел на печать на фискальник dali = dali - kostilsumm; if (kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы онлайн кассе"); } var Data = { Command: "RegisterCheck", IdCommand: app.print.modules.guid(), IsFiscalCheck: true, // Продавец, тег ОФД 1021 CashierName: preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], // ИНН продавца тег ОФД 1203 CashierVATIN: preload["users"][currentsklad][thisbasket["info"]["user"]]["user_vatin"], TaxVariant: thisbasket["printer"]["cno"], thisbasket: thisbasket, CheckStrings: newfiscalarr, // Наличная оплата (2 знака после запятой) Cash: dali, // Сумма электронной оплаты (2 знака после запятой) ElectronicPayment: thisbasket["info"]["visa"], }; /*Проверка не пустон ли поле оплаты безналом*/ if (Data.ElectronicPayment == "") { Data.ElectronicPayment = 0; } // Вызов команды if (flag == 1) {} else { console.warn("flag"); var ooo = { status: "done" }; } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.evotorkkm.ExecuteCommand(Data).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, opensmena: function() { var jsonData = { IsFiscalCheck: true, Command: "OpenShift", IdCommand: app.print.modules.guid() } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.evotorkkm.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, opendrawer: function() { var jsonData = { IsFiscalCheck: true, Command: "openDrawer", IdCommand: app.print.modules.guid() } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.evotorkkm.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, vozvrat: function(thisbasket) { //Сумма которую мы будем отнимать от налички которую дал клиент (это товары которые не пойдут напечать) var kostilsumm = 0; //Флаг для того чтобы не печатать чек если ни один товар так и не пошел на печать фискальника var flag = 0; var nallll = 0; var newfiscalarr = []; var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); fiscalarr.forEach(function(item) { if (item["tax"] == null) { item["tax"] = ""; } if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { amount = item["cenaout_discount"] * item["kolvo"]; } else { amount = item["cenaout"] * item["kolvo"]; } //Собираем нужный массив и убираем позиции которые не подлежат налогообложению if (item["tax"] != "") { newfiscalarr.push({ SignMethodCalculation: 4, SignCalculationObject: 1, Name: item["name"], Quantity: round(item["kolvo"]), Price: round(item["cenaout"]), Amount: round(amount), Department: 0, PerDisc: 0, SumDisc: 0, Tax: round(item["tax"], 0), }); /*Плюсуем сумму*/ nallll = nallll + amount; } else { /*Костыль для отнимания суммы товаров которые не пошлина фискальник*/ kostilsumm = kostilsumm + amount; } }); if (kostilsumm > 0) { app.main.message("Некоторые товары на общую сумму " + kostilsumm + preload["settings"]["currentcurrency"]["icon"] + " не были переданы онлайн кассе"); } // Вызов команды var jsonData = { Command: "ReturnCheck", Printer: thisbasket["printer"], Protocol: 1, PortName: thisbasket.printer.serialport, PortSpeed: 0, IsFiscalCheck: true, CashierName: preload["users"][currentsklad][thisbasket["info"]["user"]]["user_name"], CashierVATIN: preload["users"][currentsklad][thisbasket["info"]["user"]]["user_vatin"], TaxVariant: round(thisbasket["printer"]["cno"], 0), CheckStrings: newfiscalarr, Cash: round(nallll, 2), Nall: round(nallll, 2), ElectronicPayment: round(thisbasket["info"]["visa"], 2), AdvancePayment: 0, Credit: 0, CashProvision: 0, PerDisc: 0, SumDisc: 0, CashLessType: 0 }; //Вызов return new Promise(function(resolve, reject) { app.print.protocols.evotorkkm.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, precheck: function(thisbasket) { console.log("precheck", thisbasket) var jsonData = { IsFiscalCheck: false, Command: "PrintNonfiscalCheck", IdCommand: app.print.modules.guid(), SlipCheck: [ /* { "type":"text", "text":"sadldsafjasldf" }, { "type":"barcode", "barcodeType":"CODE39", "barcodeValue":"1488228" }, { "type":"image", "image": "/9j/4RWfRXhpZgAATU0AKgAAAAgADAEAAAMAAAABAkAAAAEBAAMAAAABAfQAAAECAAMAAAADAAAAngEGAAMAAAABAAIAAAESAAMAAAABAAEAAAEVAAMAAAABAAMAAAEaAAUAAAABAAAApAEbAAUAAAABAAAArAEoAAMAAAABAAIAAAExAAIAAAAeAAAAtAEyAAIAAAAUAAAA0odpAAQAAAABAAAA6AAAASAACAAIAAgACvyAAAAnEAAK/IAAACcQQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykAMjAxODowMzowNyAxMzowMTo1OAAAAAAEkAAABwAAAAQwMjIxoAEAAwAAAAH//wAAoAIABAAAAAEAAAGAoAMABAAAAAEAAAFNAAAAAAAAAAYBAwADAAAAAQAGAAABGgAFAAAAAQAAAW4BGwAFAAAAAQAAAXYBKAADAAAAAQACAAACAQAEAAAAAQAAAX4CAgAEAAAAAQAAFBkAAAAAAAAASAAAAAEAAABIAAAAAf/Y/+0ADEFkb2JlX0NNAAH/7gAOQWRvYmUAZIAAAAAB/9sAhAAMCAgICQgMCQkMEQsKCxEVDwwMDxUYExMVExMYEQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQ0LCw0ODRAODhAUDg4OFBQODg4OFBEMDAwMDBERDAwMDAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCACLAKADASIAAhEBAxEB/90ABAAK/8QBPwAAAQUBAQEBAQEAAAAAAAAAAwABAgQFBgcICQoLAQABBQEBAQEBAQAAAAAAAAABAAIDBAUGBwgJCgsQAAEEAQMCBAIFBwYIBQMMMwEAAhEDBCESMQVBUWETInGBMgYUkaGxQiMkFVLBYjM0coLRQwclklPw4fFjczUWorKDJkSTVGRFwqN0NhfSVeJl8rOEw9N14/NGJ5SkhbSVxNTk9KW1xdXl9VZmdoaWprbG1ub2N0dXZ3eHl6e3x9fn9xEAAgIBAgQEAwQFBgcHBgU1AQACEQMhMRIEQVFhcSITBTKBkRShsUIjwVLR8DMkYuFygpJDUxVjczTxJQYWorKDByY1wtJEk1SjF2RFVTZ0ZeLys4TD03Xj80aUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9ic3R1dnd4eXp7fH/9oADAMBAAIRAxEAPwD1VJJJJSkkkklKSSSSUpJcz1z6/dG6Xk/s7Fbb1bqx3BuBhN9V4c0P9tz2S2va6v8AS1/pcir/ALjqk1n+MzrTt77cX6tYjidrGtGVlbTGz1N36v8A5jsaz/g0lPZqlkda6PiuDMnOxqHGYbZcxhMHY76bh+e3aub/APGz6fl7Xdc6n1DrDm6lmReRVu8a6me+r/t5WGf4sfqMwadMBn96253H9a5JTuY/Wuj5TizGzsa9wiW13MeRJ2N0Y4/nu2q6uWf/AIsfqM8a9MAj9225vP8AVuVf/wAbPp+Jud0PqfUOjudqGY95NU+NlT/fb/28kp7FJcY5n+Mzort7LcX6y4jSNzHNGLlbRO709v6v/nuybP8Ag1d6H9fujdUyf2dlNt6T1YbQ7AzW+k8ucGe2l74bZudZ+ir/AEWRb/3HSU9MkkkkpSSSSSlJJJJKf//Q9VSSSSUpJJDyMinGosych4qppabLbHGGta0bnvd/VakpHn5+H07Etzc65uPjUN3WWvMADj+05zvYxn+EeuMGV9Yfr29zen2WdF+q4IY7Kjbl5YBm37N/oMd3836n/tx+mxKYdPxMr/GBns6x1RrqfqziWE9M6c7T7Q9vs+25n77fzW1/9Y/7kWZfeNa1jQxgDWtENaBAAHACSnO6F9W+jdAxvs/S8ZtAIAst5ssjvdc732fSd/Ir/wAGtNJcl9af8ZXQPq89+KCc/qDZnGpIhjh+bk3+5lP0foN9W7/gUlPWpLw/qX+OL615TiMMUdPZMt9NgsfH7r35Pq1u/s0VrP8A/HR+vf8A5Z/+AY//ALzpKfoBJfP/AP46P17/APLP/wAAx/8A3nVvB/xu/XLFcTkW0ZzT+bdU1sf1TifZv+kkp91WZ136t9G6/jfZ+qYzbwARXbxZXPem5vvr+i3+RZ/hFzP1a/xs9B6u9uN1Fp6Vlu0abHB1Dj/JyYZ6bv8Aj2Vs/wCFsXcpKeE+1fWH6iPa3qFlnWvquSWNyo3ZeICZq+0/6fHb/N+p/wC2/wChxLuzwM/D6jiVZuDc3Ixr27qrWGQRx/Zc13sex3vrejOa17Sx4DmuEOaRIIPIK4PqGJlf4v8APf1jpbHXfVnLsB6n05uv2d7vZ9tw/wBxv5rq/wDrH/cezESnvkkPHyKcmivJx3i2m5osqsbqHNcNzHt/rNRElKSSSSU//9H1VJJJJSlw/wBYX2fW76xt+qeM4jpPTizI65cwuh7p3Y/TdzNrfd9N/wCk/wDBcFdL9ZetV9C6FmdVsAccasmtpmHWOPp49btvu2vuezes/wConQ7ek9CZZmS7qfUXHM6hY/6Ztu9+yyfduqZ7H/8ADer/AKRJT0FNNVFTKaWNqqqaGV1sAa1rWjaxjGN9rWMappLO+sPV6+idEzOq2QRi1F7GukB1h9lFUj/S3OrrSU8R/jO/xhXdLc/oHR3mvOc0fa8tuhpa4bm00H/uTYw733f4Cv8Amv0/9H8dRMnIuysi3KyHmy+97rLbDy57zve8/wBZzkNJSkklZ6d03P6pmV4XT6H5OTaYZWwT/ac76Ndbfz7LP0daSmsku9+sf+Lur6s/U93UM6wZHVbb62SwkVVMO7dXX9H1nu2/pLbP+tV/4W3gkkA3fgpel/4sf8YV2NfT9XusWGzFtIqwMh2pqd9GrGsd/wBxn/zdP/cf+b/o/wDMeaJJJfqpQupqvqfTcxttVrSyyt4Dmua4bXsex3tcx7Vz3+L7r7+v/VfGyrnb8qicbKcZJNlcfpHE/SfdS6q5/wDLsXSJKeH+rz7Pqj9Y3fVPJcT0nqJfkdDueXQx07sjp25+5vt+mz9J/wCC5y7hc59e+h29W6E+zDlvU+nOGZ0+xn0xbT79le33brWexn/Del/o1ofVrrVfXehYfVawGnJrBsaJhtjT6eRW3d7trLmP2JKdNJJJJT//0vVUkkklPGfXljeq9b+rn1bcGupycp2ZlNdJBqxWl/pPb+5kNdcxdmuNw3/bf8ame8j29K6bXjCR+fc5mXvb/wBbtexdkkpS4X/HJk20fVFlTDDcrLqqsHi0NtyP/PlFa7pcB/jpY931WxnNBLWZ1ZfA0ANWQ3c7+07akp8USSSSU9F9T/qR1T61Xv8As7m4+HQQMjKfrtJ4ZXSC19tu33fmV/v2r3L6u/Vfo/1bxDjdMp2F8G69/utsI0abbIH/AG2zZUz8ytfPHR+tdT6JmtzumXux8ho2kjUOafpV2sd7LK3bfoPXtX1L/wAZXTPrEGYWZtweqwB6RP6O13Dvsj3fnbv+01n6X/R/aP0iSnpur9G6Z1rE+xdToGTj7m2emS5vub9F26tzHrDf/iw+ozzJ6YAePbdeP+pvWx1zr3Teg4Yzup2OqxjY2re1rnw507dzaw5232qlhfXv6n5wmjq2O3yud6B+TcsUuSVo4HUf8TX1XyWuOFZkYNkQza8W1g+L67gbX/8AsRWuG+sP+Kn6y9ID78Ro6pit/PxwfVA0E2Yh3P8Azv8AtO/J/lr3Suyu1jbKnCytwlr2kEEfyXNUklPl3+I3Itdj9Yxif0Vb6LGt8HWC9lh/zaK16iqmN0rp+Jm5OfjUtpyM0MGU5gj1DWXmt72j2+r+ms/Sfnq2kpS4z6jMb0rrf1j+rbQ1tONlNzMVrZAFWU3f6TG/uY7W0sXZrjcx/wBi/wAamA8D29V6bZjGB+fS5+Xvd/1uqtiSnskkkklP/9P1VJJJJTx31WebPr19bnuAaQ7CZA8G12M3f9BdiuO6JY6j/GX9YsZ4g5mNiZNRPJZUxmO6I/4S3auxSQFKh13o+N1vpGV0rKkVZTNu4ctcCH1WiC3d6VrWWbVfSSS/MnXOh9R6D1K3pvUa/Tvq1Dhqx7D9C6l/t31Wf+o7P0vsVBfSf1j+q3R/rLiNxep1FxrJdTfWdttZIhxqsh30vz63tfU//R/o2LyPr3+KT6zdNe5/Tw3qmKJIdVDLQAB9PGsd9L937PZekp4hJWc3pfU+nuDc/EvxHO4F9b6yf+3WtXVfUT6l4n1s6Z1Wt1hx87FdQ7Fv1c0bxd6lV1U+6qz0/pt/S1v/AO2bEpoZ3166t1P6tu6D1QnL22124+W536VoZuDq79D9o3bvZY79L/pPW/wfNrR679XurfV/NdhdTpNTwT6dg1rsaP8ACUW/4Rmv9dn+F9OxZySgPxbnS+s9V6Pf9o6ZlW4lsjca3EB0GWttr/m7mfyLW7F6h9T/APG9VlWVdP8ArIGUWvIYzqDPbUTG39bZ/gNzv8PX+g9/83j1M9ReRpJKfqpJcH/ih+sFvU/q/Z0/Idvu6U5tTHGf5h4JxmucT9Kv07qv+JrpXeJKUuO+tNhr+vX1Re0AkuzWQfB1dbN3/TXYrjut2Ov/AMZf1dxmCTh42Xk2kchlrH47Zn/hKtqSC9ikkkkl/9T1VJJJJTx3XHfsz/GH0LqJO2nqePd0y5x+iC0/aMVk/wCkuyLGMauxXMf4xOl5Gd9W7MnCJbn9KsZ1DEe3kPo9z40du/Q+r6bP9N6S2eh9Wo6z0jE6pjx6eVWH7QZ2u+jbUXfvU2h9TklN5Yv1p+s+L9WcXFzcyt1mNfktxrXM+kwOZdb6wZ/hNrqfcz/1Wtpch/jU6a7P+puU5jS+zCezKa0CdGH07nf9bx7brElPS9O6lgdUxGZvT72ZONaJbZWZHE7XD6Vdjfz6rP0latL5i6T1vq3Rcj7T0vKsxbdN2w+10fRFtTt1Vzf5FrF2/Tv8dXXqA1vUMPHzGtEF7N1Njj+89w9an/MoYkp9lIBEHUFBowsPGsstx6K6bLoNz62Na58Tt9RzAN+3e76S83o/x44biPtHSbKxPu9O5r4Hluqp3LrPqf8AXbC+tgyziY9uOMM1h3q7fd6nqRt9Nzvo+kkp1ur9G6Z1rCdg9Tobk47juDXctcNG2VPb76rPd9OteKfXf/Fvn/Vpr8/FeczpO6DaYFlW5wbUzJb+du37PXq9m/8AwdH6Ner/AFs+u3R/qvjzlO9bNewuowqz73/mtc8/4Cjf/hn/APCeky7Z6a8Q+s/1v6z9Zsv1s+zbQw/oMSuRVWPFrPz7f37rP0n/AFv9GkpxUkkklPqf+Ixp39adJgDGG3sZ+06/9Ferrzn/ABKdNdR0TN6i8Fv228VskaFlDfpt/wCu33M/62vRklKXHdDd+0/8YfXeog7qemY9PTKXD6JLj9oymT/pKcit7HLo+udWo6N0jL6pkR6eLWX7SY3O+jVUD+9daWVNWN/i76XkYP1bryc0l2f1Wx2flvdyX3+5k6N2/ofS9Rn+m9VJT06SSSSn/9X1VJJJJSlw/QH/APNL605H1Yv9nSuqudl9EsdIY15/pHTmucNvt/wbPU/0X+GzV3Cx/rR9XMf6w9MOK97qMmpwuwsthIfTe3+ataW/m/6Rv/o307ElOwh30U5FFmPewWU3NNdlbhIc1w2vY4fuuaVzn1O+tF/URb0brLfs/wBYem+zMpIDfUaI25lQbDHV27mOd6X6P3+pX+htqXTpKfm362/VzI+rfW7+m2y6oH1MW39+lxPpP+iz36end/w1dix19H/Wz6p9N+tHTTh5g9O6uXYuU0S+p57jj1Knx+no/wAL/ItZVbX4R9Y/ql1v6t5HpdSoipx/RZVcupfz9C2B7/Z/M2bLv+DSU466L6s/XTO+rPT8+jprG/a881xkPhwrbWLRLKiNr7d13+E/R/8AB2LnUklJMjJyMq9+Rk2vvvsO6y2xxc9x8XvfLnIaSSSlK30npeX1fqWP03CbuyMp4YwGYHd9j9od+jqYHWWf8GidF6D1bruWMTpeM7Is/PcNGMGvvutd+jqb7fz/AKf5nvXuX1G+o2H9VcMvcW5HVMhoGVlAaAfS+zY273Nx2u/t5D/0tn+CppSnb6L0nG6N0rF6Xi/zOLWGAxBcfpWWu/l3WOfa9XklzH1x+tF/ThV0bozftH1h6l7MOloDvTaZ3ZlodLG11bXub6v6P2epZ+hqtSU53X3/APO3604/1Yo9/SulObl9bsbOxzx/R+nOc0bfd/hGep/pf8NhLuFj/Vf6uY/1e6YMVj3X5Nrjdm5byS+69387a4u/N/0bf/RvqWLYSUpJJJJT/9b1VJJJJSkkkklPPfWv6ps62Kc7Cu+wdcwfdg57ORGv2fIj+cxn7nf8V/xdl9F9XoX1zsOb+wfrPU3pnXGlorkxRlNcdtduHafbusf7PR3fzn81+k9Wmjq1ndb6B0nr2GcPqmO2+vljuHsd+/Ta331O0/N+n/hP0aSnRQ7qKcip9F9bbabAW2VvAc1wPLXsd7XNXGDC+vP1UB/Zz/8AnN0dk7cS92zNqYN7gyrI932hrf0f5tj/APBY+JSr3Tv8Y/1Yy7Ti5dz+k5rCRbi9QaaHNI532u/QN/t2+p/waSkfUv8AFb9Tc9znjEdh2PMl+K8sH9ml3qY1f9ilZn/jKfVX/uVn/wDblP8A7yrvarqb6220vbbW8S17CHNI/kub7VNJT5//AOMp9Vf+5Wf/ANuU/wDvKruB/ik+puId1tF2aQQQci06R/Jxvs7Hf22rs1C26mit1tz21VsEue8hrQP5Tne1JSPDwsPBobjYVFeNQ2S2qlgYwE6u9lYa33I65bqP+Mf6sYloxcS5/Vs15AqxentN7nE8bbW/oHf2LfU/4NUfsX15+tYH7Rf/AM2ejvjdiY7t+baw7HbLcj2/Z936T82t/wDgsjEuSU3Ou/XOwZv7B+rFTep9ccXCyDNGK1p22W5lo9u6t/s9Hd/Ofzv6T0qb7X1U+qbOiC7Ozbvt/XM73Z2e/kzr9nx5/m8Zm1v/ABv/ABddFFGh0ToHSeg4Yw+l47aK+Xu5e93791rvfa7X876H+D/RrRSUpJJJJSkkkklP/9f1VJJJJSkkkklKSSSSUpVOodI6X1NgZ1HEpy2tnb61bX7Z52F4Oz+yraSSnkbv8V/1Y9X1unnK6VdMmzCvewn/ALe9fb/YQbvqB1kO/VPrZ1Spmsi55uPJ2+/1KfzP5K7RJJGjxdP1A6yXfrf1s6pazSBS80nkbvf6l35iNT/iv+rHq+t1A5XVbpkWZt73kf8AbPobv7a65JJWjU6f0jpfTGFnTsSnEa6N3o1tZujjeWAb/wC0raSSSVJJJJKUkkkkpSSSSSn/2f/tHXBQaG90b3Nob3AgMy4wADhCSU0EBAAAAAAAFxwBWgADGyVHHAFaAAMbJUccAgAAAgB/ADhCSU0EJQAAAAAAEHX4gcyU/AvIINxksfxmYlg4QklNBDoAAAAAASMAAAAQAAAAAQAAAAAAC3ByaW50T3V0cHV0AAAABQAAAABQc3RTYm9vbAEAAAAASW50ZWVudW0AAAAASW50ZQAAAABJbWcgAAAAD3ByaW50U2l4dGVlbkJpdGJvb2wAAAAAC3ByaW50ZXJOYW1lVEVYVAAAABcARQBwAHMAbwBuACAAUwB0AHkAbAB1AHMAIABQAGgAbwB0AG8AIABQADUAMAAAAAAAD3ByaW50UHJvb2ZTZXR1cE9iamMAAAAVBB8EMARABDAEPAQ1BEIEQARLACAERgQyBDUEQgQ+BD8EQAQ+BDEESwAAAAAACnByb29mU2V0dXAAAAABAAAAAEJsdG5lbnVtAAAADGJ1aWx0aW5Qcm9vZgAAAAlwcm9vZkNNWUsAOEJJTQQ7AAAAAAItAAAAEAAAAAEAAAAAABJwcmludE91dHB1dE9wdGlvbnMAAAAXAAAAAENwdG5ib29sAAAAAABDbGJyYm9vbAAAAAAAUmdzTWJvb2wAAAAAAENybkNib29sAAAAAABDbnRDYm9vbAAAAAAATGJsc2Jvb2wAAAAAAE5ndHZib29sAAAAAABFbWxEYm9vbAAAAAAASW50cmJvb2wAAAAAAEJja2dPYmpjAAAAAQAAAAAAAFJHQkMAAAADAAAAAFJkICBkb3ViQG/gAAAAAAAAAAAAR3JuIGRvdWJAb+AAAAAAAAAAAABCbCAgZG91YkBv4AAAAAAAAAAAAEJyZFRVbnRGI1JsdAAAAAAAAAAAAAAAAEJsZCBVbnRGI1JsdAAAAAAAAAAAAAAAAFJzbHRVbnRGI1B4bEBSAAAAAAAAAAAACnZlY3RvckRhdGFib29sAQAAAABQZ1BzZW51bQAAAABQZ1BzAAAAAFBnUEMAAAAATGVmdFVudEYjUmx0AAAAAAAAAAAAAAAAVG9wIFVudEYjUmx0AAAAAAAAAAAAAAAAU2NsIFVudEYjUHJjQFkAAAAAAAAAAAAQY3JvcFdoZW5QcmludGluZ2Jvb2wAAAAADmNyb3BSZWN0Qm90dG9tbG9uZwAAAAAAAAAMY3JvcFJlY3RMZWZ0bG9uZwAAAAAAAAANY3JvcFJlY3RSaWdodGxvbmcAAAAAAAAAC2Nyb3BSZWN0VG9wbG9uZwAAAAAAOEJJTQPtAAAAAAAQAEgAAAABAAIASAAAAAEAAjhCSU0EJgAAAAAADgAAAAAAAAAAAAA/gAAAOEJJTQQNAAAAAAAEAAAAeDhCSU0EGQAAAAAABAAAAB44QklNA/MAAAAAAAkAAAAAAAAAAAEAOEJJTScQAAAAAAAKAAEAAAAAAAAAAjhCSU0D9QAAAAAASAAvZmYAAQBsZmYABgAAAAAAAQAvZmYAAQChmZoABgAAAAAAAQAyAAAAAQBaAAAABgAAAAAAAQA1AAAAAQAtAAAABgAAAAAAAThCSU0D+AAAAAAAcAAA/////////////////////////////wPoAAAAAP////////////////////////////8D6AAAAAD/////////////////////////////A+gAAAAA/////////////////////////////wPoAAA4QklNBAgAAAAAABAAAAABAAACQAAAAkAAAAAAOEJJTQQeAAAAAAAEAAAAADhCSU0EGgAAAAADSwAAAAYAAAAAAAAAAAAAAU0AAAGAAAAACwQRBDUENwAgBDgEPAQ1BD0EOAAtADEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAYAAAAFNAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAEAAAAAAABudWxsAAAAAgAAAAZib3VuZHNPYmpjAAAAAQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRvbWxvbmcAAAFNAAAAAFJnaHRsb25nAAABgAAAAAZzbGljZXNWbExzAAAAAU9iamMAAAABAAAAAAAFc2xpY2UAAAASAAAAB3NsaWNlSURsb25nAAAAAAAAAAdncm91cElEbG9uZwAAAAAAAAAGb3JpZ2luZW51bQAAAAxFU2xpY2VPcmlnaW4AAAANYXV0b0dlbmVyYXRlZAAAAABUeXBlZW51bQAAAApFU2xpY2VUeXBlAAAAAEltZyAAAAAGYm91bmRzT2JqYwAAAAEAAAAAAABSY3QxAAAABAAAAABUb3AgbG9uZwAAAAAAAAAATGVmdGxvbmcAAAAAAAAAAEJ0b21sb25nAAABTQAAAABSZ2h0bG9uZwAAAYAAAAADdXJsVEVYVAAAAAEAAAAAAABudWxsVEVYVAAAAAEAAAAAAABNc2dlVEVYVAAAAAEAAAAAAAZhbHRUYWdURVhUAAAAAQAAAAAADmNlbGxUZXh0SXNIVE1MYm9vbAEAAAAIY2VsbFRleHRURVhUAAAAAQAAAAAACWhvcnpBbGlnbmVudW0AAAAPRVNsaWNlSG9yekFsaWduAAAAB2RlZmF1bHQAAAAJdmVydEFsaWduZW51bQAAAA9FU2xpY2VWZXJ0QWxpZ24AAAAHZGVmYXVsdAAAAAtiZ0NvbG9yVHlwZWVudW0AAAARRVNsaWNlQkdDb2xvclR5cGUAAAAATm9uZQAAAAl0b3BPdXRzZXRsb25nAAAAAAAAAApsZWZ0T3V0c2V0bG9uZwAAAAAAAAAMYm90dG9tT3V0c2V0bG9uZwAAAAAAAAALcmlnaHRPdXRzZXRsb25nAAAAAAA4QklNBCgAAAAAAAwAAAACP/AAAAAAAAA4QklNBBQAAAAAAAQAAAACOEJJTQQMAAAAABQ1AAAAAQAAAKAAAACLAAAB4AABBKAAABQZABgAAf/Y/+0ADEFkb2JlX0NNAAH/7gAOQWRvYmUAZIAAAAAB/9sAhAAMCAgICQgMCQkMEQsKCxEVDwwMDxUYExMVExMYEQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQ0LCw0ODRAODhAUDg4OFBQODg4OFBEMDAwMDBERDAwMDAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCACLAKADASIAAhEBAxEB/90ABAAK/8QBPwAAAQUBAQEBAQEAAAAAAAAAAwABAgQFBgcICQoLAQABBQEBAQEBAQAAAAAAAAABAAIDBAUGBwgJCgsQAAEEAQMCBAIFBwYIBQMMMwEAAhEDBCESMQVBUWETInGBMgYUkaGxQiMkFVLBYjM0coLRQwclklPw4fFjczUWorKDJkSTVGRFwqN0NhfSVeJl8rOEw9N14/NGJ5SkhbSVxNTk9KW1xdXl9VZmdoaWprbG1ub2N0dXZ3eHl6e3x9fn9xEAAgIBAgQEAwQFBgcHBgU1AQACEQMhMRIEQVFhcSITBTKBkRShsUIjwVLR8DMkYuFygpJDUxVjczTxJQYWorKDByY1wtJEk1SjF2RFVTZ0ZeLys4TD03Xj80aUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9ic3R1dnd4eXp7fH/9oADAMBAAIRAxEAPwD1VJJJJSkkkklKSSSSUpJcz1z6/dG6Xk/s7Fbb1bqx3BuBhN9V4c0P9tz2S2va6v8AS1/pcir/ALjqk1n+MzrTt77cX6tYjidrGtGVlbTGz1N36v8A5jsaz/g0lPZqlkda6PiuDMnOxqHGYbZcxhMHY76bh+e3aub/APGz6fl7Xdc6n1DrDm6lmReRVu8a6me+r/t5WGf4sfqMwadMBn96253H9a5JTuY/Wuj5TizGzsa9wiW13MeRJ2N0Y4/nu2q6uWf/AIsfqM8a9MAj9225vP8AVuVf/wAbPp+Jud0PqfUOjudqGY95NU+NlT/fb/28kp7FJcY5n+Mzort7LcX6y4jSNzHNGLlbRO709v6v/nuybP8Ag1d6H9fujdUyf2dlNt6T1YbQ7AzW+k8ucGe2l74bZudZ+ir/AEWRb/3HSU9MkkkkpSSSSSlJJJJKf//Q9VSSSSUpJJDyMinGosych4qppabLbHGGta0bnvd/VakpHn5+H07Etzc65uPjUN3WWvMADj+05zvYxn+EeuMGV9Yfr29zen2WdF+q4IY7Kjbl5YBm37N/oMd3836n/tx+mxKYdPxMr/GBns6x1RrqfqziWE9M6c7T7Q9vs+25n77fzW1/9Y/7kWZfeNa1jQxgDWtENaBAAHACSnO6F9W+jdAxvs/S8ZtAIAst5ssjvdc732fSd/Ir/wAGtNJcl9af8ZXQPq89+KCc/qDZnGpIhjh+bk3+5lP0foN9W7/gUlPWpLw/qX+OL615TiMMUdPZMt9NgsfH7r35Pq1u/s0VrP8A/HR+vf8A5Z/+AY//ALzpKfoBJfP/AP46P17/APLP/wAAx/8A3nVvB/xu/XLFcTkW0ZzT+bdU1sf1TifZv+kkp91WZ136t9G6/jfZ+qYzbwARXbxZXPem5vvr+i3+RZ/hFzP1a/xs9B6u9uN1Fp6Vlu0abHB1Dj/JyYZ6bv8Aj2Vs/wCFsXcpKeE+1fWH6iPa3qFlnWvquSWNyo3ZeICZq+0/6fHb/N+p/wC2/wChxLuzwM/D6jiVZuDc3Ixr27qrWGQRx/Zc13sex3vrejOa17Sx4DmuEOaRIIPIK4PqGJlf4v8APf1jpbHXfVnLsB6n05uv2d7vZ9tw/wBxv5rq/wDrH/cezESnvkkPHyKcmivJx3i2m5osqsbqHNcNzHt/rNRElKSSSSU//9H1VJJJJSlw/wBYX2fW76xt+qeM4jpPTizI65cwuh7p3Y/TdzNrfd9N/wCk/wDBcFdL9ZetV9C6FmdVsAccasmtpmHWOPp49btvu2vuezes/wConQ7ek9CZZmS7qfUXHM6hY/6Ztu9+yyfduqZ7H/8ADer/AKRJT0FNNVFTKaWNqqqaGV1sAa1rWjaxjGN9rWMappLO+sPV6+idEzOq2QRi1F7GukB1h9lFUj/S3OrrSU8R/jO/xhXdLc/oHR3mvOc0fa8tuhpa4bm00H/uTYw733f4Cv8Amv0/9H8dRMnIuysi3KyHmy+97rLbDy57zve8/wBZzkNJSkklZ6d03P6pmV4XT6H5OTaYZWwT/ac76Ndbfz7LP0daSmsku9+sf+Lur6s/U93UM6wZHVbb62SwkVVMO7dXX9H1nu2/pLbP+tV/4W3gkkA3fgpel/4sf8YV2NfT9XusWGzFtIqwMh2pqd9GrGsd/wBxn/zdP/cf+b/o/wDMeaJJJfqpQupqvqfTcxttVrSyyt4Dmua4bXsex3tcx7Vz3+L7r7+v/VfGyrnb8qicbKcZJNlcfpHE/SfdS6q5/wDLsXSJKeH+rz7Pqj9Y3fVPJcT0nqJfkdDueXQx07sjp25+5vt+mz9J/wCC5y7hc59e+h29W6E+zDlvU+nOGZ0+xn0xbT79le33brWexn/Del/o1ofVrrVfXehYfVawGnJrBsaJhtjT6eRW3d7trLmP2JKdNJJJJT//0vVUkkklPGfXljeq9b+rn1bcGupycp2ZlNdJBqxWl/pPb+5kNdcxdmuNw3/bf8ame8j29K6bXjCR+fc5mXvb/wBbtexdkkpS4X/HJk20fVFlTDDcrLqqsHi0NtyP/PlFa7pcB/jpY931WxnNBLWZ1ZfA0ANWQ3c7+07akp8USSSSU9F9T/qR1T61Xv8As7m4+HQQMjKfrtJ4ZXSC19tu33fmV/v2r3L6u/Vfo/1bxDjdMp2F8G69/utsI0abbIH/AG2zZUz8ytfPHR+tdT6JmtzumXux8ho2kjUOafpV2sd7LK3bfoPXtX1L/wAZXTPrEGYWZtweqwB6RP6O13Dvsj3fnbv+01n6X/R/aP0iSnpur9G6Z1rE+xdToGTj7m2emS5vub9F26tzHrDf/iw+ozzJ6YAePbdeP+pvWx1zr3Teg4Yzup2OqxjY2re1rnw507dzaw5232qlhfXv6n5wmjq2O3yud6B+TcsUuSVo4HUf8TX1XyWuOFZkYNkQza8W1g+L67gbX/8AsRWuG+sP+Kn6y9ID78Ro6pit/PxwfVA0E2Yh3P8Azv8AtO/J/lr3Suyu1jbKnCytwlr2kEEfyXNUklPl3+I3Itdj9Yxif0Vb6LGt8HWC9lh/zaK16iqmN0rp+Jm5OfjUtpyM0MGU5gj1DWXmt72j2+r+ms/Sfnq2kpS4z6jMb0rrf1j+rbQ1tONlNzMVrZAFWU3f6TG/uY7W0sXZrjcx/wBi/wAamA8D29V6bZjGB+fS5+Xvd/1uqtiSnskkkklP/9P1VJJJJTx31WebPr19bnuAaQ7CZA8G12M3f9BdiuO6JY6j/GX9YsZ4g5mNiZNRPJZUxmO6I/4S3auxSQFKh13o+N1vpGV0rKkVZTNu4ctcCH1WiC3d6VrWWbVfSSS/MnXOh9R6D1K3pvUa/Tvq1Dhqx7D9C6l/t31Wf+o7P0vsVBfSf1j+q3R/rLiNxep1FxrJdTfWdttZIhxqsh30vz63tfU//R/o2LyPr3+KT6zdNe5/Tw3qmKJIdVDLQAB9PGsd9L937PZekp4hJWc3pfU+nuDc/EvxHO4F9b6yf+3WtXVfUT6l4n1s6Z1Wt1hx87FdQ7Fv1c0bxd6lV1U+6qz0/pt/S1v/AO2bEpoZ3166t1P6tu6D1QnL22124+W536VoZuDq79D9o3bvZY79L/pPW/wfNrR679XurfV/NdhdTpNTwT6dg1rsaP8ACUW/4Rmv9dn+F9OxZySgPxbnS+s9V6Pf9o6ZlW4lsjca3EB0GWttr/m7mfyLW7F6h9T/APG9VlWVdP8ArIGUWvIYzqDPbUTG39bZ/gNzv8PX+g9/83j1M9ReRpJKfqpJcH/ih+sFvU/q/Z0/Idvu6U5tTHGf5h4JxmucT9Kv07qv+JrpXeJKUuO+tNhr+vX1Re0AkuzWQfB1dbN3/TXYrjut2Ov/AMZf1dxmCTh42Xk2kchlrH47Zn/hKtqSC9ikkkkl/9T1VJJJJTx3XHfsz/GH0LqJO2nqePd0y5x+iC0/aMVk/wCkuyLGMauxXMf4xOl5Gd9W7MnCJbn9KsZ1DEe3kPo9z40du/Q+r6bP9N6S2eh9Wo6z0jE6pjx6eVWH7QZ2u+jbUXfvU2h9TklN5Yv1p+s+L9WcXFzcyt1mNfktxrXM+kwOZdb6wZ/hNrqfcz/1Wtpch/jU6a7P+puU5jS+zCezKa0CdGH07nf9bx7brElPS9O6lgdUxGZvT72ZONaJbZWZHE7XD6Vdjfz6rP0latL5i6T1vq3Rcj7T0vKsxbdN2w+10fRFtTt1Vzf5FrF2/Tv8dXXqA1vUMPHzGtEF7N1Njj+89w9an/MoYkp9lIBEHUFBowsPGsstx6K6bLoNz62Na58Tt9RzAN+3e76S83o/x44biPtHSbKxPu9O5r4Hluqp3LrPqf8AXbC+tgyziY9uOMM1h3q7fd6nqRt9Nzvo+kkp1ur9G6Z1rCdg9Tobk47juDXctcNG2VPb76rPd9OteKfXf/Fvn/Vpr8/FeczpO6DaYFlW5wbUzJb+du37PXq9m/8AwdH6Ner/AFs+u3R/qvjzlO9bNewuowqz73/mtc8/4Cjf/hn/APCeky7Z6a8Q+s/1v6z9Zsv1s+zbQw/oMSuRVWPFrPz7f37rP0n/AFv9GkpxUkkklPqf+Ixp39adJgDGG3sZ+06/9Ferrzn/ABKdNdR0TN6i8Fv228VskaFlDfpt/wCu33M/62vRklKXHdDd+0/8YfXeog7qemY9PTKXD6JLj9oymT/pKcit7HLo+udWo6N0jL6pkR6eLWX7SY3O+jVUD+9daWVNWN/i76XkYP1bryc0l2f1Wx2flvdyX3+5k6N2/ofS9Rn+m9VJT06SSSSn/9X1VJJJJSlw/QH/APNL605H1Yv9nSuqudl9EsdIY15/pHTmucNvt/wbPU/0X+GzV3Cx/rR9XMf6w9MOK97qMmpwuwsthIfTe3+ataW/m/6Rv/o307ElOwh30U5FFmPewWU3NNdlbhIc1w2vY4fuuaVzn1O+tF/URb0brLfs/wBYem+zMpIDfUaI25lQbDHV27mOd6X6P3+pX+htqXTpKfm362/VzI+rfW7+m2y6oH1MW39+lxPpP+iz36end/w1dix19H/Wz6p9N+tHTTh5g9O6uXYuU0S+p57jj1Knx+no/wAL/ItZVbX4R9Y/ql1v6t5HpdSoipx/RZVcupfz9C2B7/Z/M2bLv+DSU466L6s/XTO+rPT8+jprG/a881xkPhwrbWLRLKiNr7d13+E/R/8AB2LnUklJMjJyMq9+Rk2vvvsO6y2xxc9x8XvfLnIaSSSlK30npeX1fqWP03CbuyMp4YwGYHd9j9od+jqYHWWf8GidF6D1bruWMTpeM7Is/PcNGMGvvutd+jqb7fz/AKf5nvXuX1G+o2H9VcMvcW5HVMhoGVlAaAfS+zY273Nx2u/t5D/0tn+CppSnb6L0nG6N0rF6Xi/zOLWGAxBcfpWWu/l3WOfa9XklzH1x+tF/ThV0bozftH1h6l7MOloDvTaZ3ZlodLG11bXub6v6P2epZ+hqtSU53X3/APO3604/1Yo9/SulObl9bsbOxzx/R+nOc0bfd/hGep/pf8NhLuFj/Vf6uY/1e6YMVj3X5Nrjdm5byS+69387a4u/N/0bf/RvqWLYSUpJJJJT/9b1VJJJJSkkkklPPfWv6ps62Kc7Cu+wdcwfdg57ORGv2fIj+cxn7nf8V/xdl9F9XoX1zsOb+wfrPU3pnXGlorkxRlNcdtduHafbusf7PR3fzn81+k9Wmjq1ndb6B0nr2GcPqmO2+vljuHsd+/Ta331O0/N+n/hP0aSnRQ7qKcip9F9bbabAW2VvAc1wPLXsd7XNXGDC+vP1UB/Zz/8AnN0dk7cS92zNqYN7gyrI932hrf0f5tj/APBY+JSr3Tv8Y/1Yy7Ti5dz+k5rCRbi9QaaHNI532u/QN/t2+p/waSkfUv8AFb9Tc9znjEdh2PMl+K8sH9ml3qY1f9ilZn/jKfVX/uVn/wDblP8A7yrvarqb6220vbbW8S17CHNI/kub7VNJT5//AOMp9Vf+5Wf/ANuU/wDvKruB/ik+puId1tF2aQQQci06R/Jxvs7Hf22rs1C26mit1tz21VsEue8hrQP5Tne1JSPDwsPBobjYVFeNQ2S2qlgYwE6u9lYa33I65bqP+Mf6sYloxcS5/Vs15AqxentN7nE8bbW/oHf2LfU/4NUfsX15+tYH7Rf/AM2ejvjdiY7t+baw7HbLcj2/Z936T82t/wDgsjEuSU3Ou/XOwZv7B+rFTep9ccXCyDNGK1p22W5lo9u6t/s9Hd/Ofzv6T0qb7X1U+qbOiC7Ozbvt/XM73Z2e/kzr9nx5/m8Zm1v/ABv/ABddFFGh0ToHSeg4Yw+l47aK+Xu5e93791rvfa7X876H+D/RrRSUpJJJJSkkkklP/9f1VJJJJSkkkklKSSSSUpVOodI6X1NgZ1HEpy2tnb61bX7Z52F4Oz+yraSSnkbv8V/1Y9X1unnK6VdMmzCvewn/ALe9fb/YQbvqB1kO/VPrZ1Spmsi55uPJ2+/1KfzP5K7RJJGjxdP1A6yXfrf1s6pazSBS80nkbvf6l35iNT/iv+rHq+t1A5XVbpkWZt73kf8AbPobv7a65JJWjU6f0jpfTGFnTsSnEa6N3o1tZujjeWAb/wC0raSSSVJJJJKUkkkkpSSSSSn/2QA4QklNBCEAAAAAAFUAAAABAQAAAA8AQQBkAG8AYgBlACAAUABoAG8AdABvAHMAaABvAHAAAAATAEEAZABvAGIAZQAgAFAAaABvAHQAbwBzAGgAbwBwACAAQwBTADYAAAABADhCSU0EBgAAAAAABwAFAAAAAQEA/+EO22h0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4zLWMwMTEgNjYuMTQ1NjYxLCAyMDEyLzAyLzA2LTE0OjU2OjI3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMTgtMDMtMDdUMTI6MzE6MjUrMDI6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMTgtMDMtMDdUMTM6MDE6NTgrMDI6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDE4LTAzLTA3VDEzOjAxOjU4KzAyOjAwIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjZEREZCNkY0RjYyMUU4MTFCMDI4RkE2MjhDMkJCOTAyIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjY3QUEyN0IwRjIyMUU4MTE5QzdBRjREQkEyOUMzQjM0IiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6NjdBQTI3QjBGMjIxRTgxMTlDN0FGNERCQTI5QzNCMzQiIGRjOmZvcm1hdD0iaW1hZ2UvanBlZyIgcGhvdG9zaG9wOkxlZ2FjeUlQVENEaWdlc3Q9IkE1ODJCODMxRTdEMDlEM0NBQzI0NjQ2ODc4NEFFMEE2IiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiBwaG90b3Nob3A6SUNDUHJvZmlsZT0iQWRvYmUgUkdCICgxOTk4KSI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NjdBQTI3QjBGMjIxRTgxMTlDN0FGNERCQTI5QzNCMzQiIHN0RXZ0OndoZW49IjIwMTgtMDMtMDdUMTI6MzE6MjUrMDI6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo2OEFBMjdCMEYyMjFFODExOUM3QUY0REJBMjlDM0IzNCIgc3RFdnQ6d2hlbj0iMjAxOC0wMy0wN1QxMjozMToyNSswMjowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjZEREZCNkY0RjYyMUU4MTFCMDI4RkE2MjhDMkJCOTAyIiBzdEV2dDp3aGVuPSIyMDE4LTAzLTA3VDEzOjAxOjU4KzAyOjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD94cGFja2V0IGVuZD0idyI/Pv/iAkBJQ0NfUFJPRklMRQABAQAAAjBBREJFAhAAAG1udHJSR0IgWFlaIAfPAAYAAwAAAAAAAGFjc3BBUFBMAAAAAG5vbmUAAAAAAAAAAAAAAAAAAAAAAAD21gABAAAAANMtQURCRQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACmNwcnQAAAD8AAAAMmRlc2MAAAEwAAAAa3d0cHQAAAGcAAAAFGJrcHQAAAGwAAAAFHJUUkMAAAHEAAAADmdUUkMAAAHUAAAADmJUUkMAAAHkAAAADnJYWVoAAAH0AAAAFGdYWVoAAAIIAAAAFGJYWVoAAAIcAAAAFHRleHQAAAAAQ29weXJpZ2h0IDE5OTkgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQAAABkZXNjAAAAAAAAABFBZG9iZSBSR0IgKDE5OTgpAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA81EAAQAAAAEWzFhZWiAAAAAAAAAAAAAAAAAAAAAAY3VydgAAAAAAAAABAjMAAGN1cnYAAAAAAAAAAQIzAABjdXJ2AAAAAAAAAAECMwAAWFlaIAAAAAAAAJwYAABPpQAABPxYWVogAAAAAAAANI0AAKAsAAAPlVhZWiAAAAAAAAAmMQAAEC8AAL6c/+4ADkFkb2JlAGRAAAAAAf/bAIQABAMDAwMDBAMDBAYEAwQGBwUEBAUHCAYGBwYGCAoICQkJCQgKCgwMDAwMCgwMDAwMDAwMDAwMDAwMDAwMDAwMDAEEBQUIBwgPCgoPFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM/8AAEQgBTQGAAwERAAIRAQMRAf/dAAQAMP/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPBUtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZqbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEyobHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9/Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX//0Pf2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV//9H39irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirVQMVQWqa1pGh2Z1HW7+20ywUhWur2aO2hDN0BeRlWp+eKvF/PP/OX/wCQnkQvFc+Zk1q9jlML2ehqL91YIHqWVhHx3A5B/tbdmooeG+bf+fkPlmCO5i8keT7y9n9OFrS61aaO2j9Rj++WSKEyNRR9gq/xHrx7q7vI9Y/5+Ffnbqsd5aaNpujaS900Qspre2lubi34n4gvrSujl+nxR7fs4Fq+rHr3/nKP/nLXzjDZ6Tp19qIu0dnjfRdK9K6n2NVb0YjyCg9AvauOzC4na0H/AMrL/wCc15SxF551qNmAsbpaH5egMFgJ4oja2/8AlZf/ADmvEVJvPOtTsoNjdNU/L0DjYK8UTtaLsv8AnKP/AJy18nQ3mk6jfaibt3V5H1rSvVuoNhRV9aIcQwHQr3rh2RcRtbIdH/5+FfnbpUdnaazpujatJatKL2a4tpba4uOR+EN6MqIhTp8Me/7WLOq6vXPKX/PyHy1PHbQ+d/J95ZXHpzNd3WkzR3MfqKf3KxxTGM0YfbLSfCenLsV3e5eRv+cv/wAhPPZSK28zJot7JKIUs9cUWDsxQvUMzGPiKEci9OW3daqvaNL1rSNdsxqOiX9tqensSq3VlNHcwll6gPGzLUfPFKNqDireKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kv8A/9L39irsVdirsVdirsVdirsVdirsVdirsVdirsVdirRIUFmICgVJO2KvBPzV/wCcwfyY/KwvZS6t/iXzAux0jQSl2yV/37PyEMdO6l/U/wAjFD4688/855/nV54u30f8vNPg8sQXLGO1jsYTqWqurEgKJJFK8iD/ALrhDV+ycCpNo/8AzjT/AM5W/nVIuoebWv7awuXWc3fmu+mUEkD41tmLyA8W2/dqO2NseLue3+T/APn295dt0jl89+cbu+uAVaS20iFLWHZqsvqTCVmBXaoVDivqe6+WP+cO/wDnHnywqGLyfDqk6K6mfV5JL4tzNalJG9Oo6KQgpjS8Pm9S0f8AL7yJ5fS2TRPLOl6eLMAWrW1lBG0fHpxZUBBHjXGgngHcyFYYk3RFUnqVAB/DDS8IXUxZOpiq1oYn3dFYjoWAJ/HGmPCGPax+XvkPzAlymueWdL1AXgIumubKCRpOXXkzIST71wUF4B3PLfNH/OHn/OPPmcSGXyfDpk7qiifSJJLErwNahI29Op6MShrjSOHzeFecP+fb3l24SSXyJ5xu7K4JZo7XV4Uuod2qq+pCImUBe5Vzin1PENY/5xp/5yu/JWRtQ8pNf3FhbO063flS+mYVFfja2UxyElV3/dt4Y2ji7058jf8AOef51eR7tNH/ADD0+DzPBbMI7qO+hOm6qiqQCpkjULyAH+7IS1ftHFk+xfyq/wCcwfyY/NMpZRat/hrzA2w0jXiloz0/31PyMMleyh/U/wAjCr3sEMAykFSKgjfFLeKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kv/0/f2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KtFgDTvirxL87v+cpPyv8AyThlsdWu/wBM+cFUGHyzpzK1yCwqpnfdIFoQfj+Mrukb4q+BfO357/8AOQ3/ADlDrknlTyta3kWjXHwp5U8viQQ+kdq3lwOLSA/tNKyw+CLgYmhzexflR/z7ruJkt9U/ODXPq4NHby9orBpKdeM106kA9iI0b2kxXcvs7yF+T/5a/ljai18j+WrLSSAA10kfqXb7U+OeTlI1ad2xpeEM4wsnYq7FXYq7FXYq7FXYq7FXYq7FXYqwfz5+T/5bfmbata+ePLNlqpIot08Yju02pVLiPjItK9mwUx4Q+MvzY/591zwpPqn5P6364FXXy9rTBXp14w3SKAT2CyoPeXFbIeOeSfz4/wCchv8AnF7XI/Knmm1vJdGt/hfyp5gEhhMQ2rZ3B5NGB+y0TND4o+IUEHk++vyR/wCcpPyv/O2GKx0m7/Q3nBlJm8s6iyrckqKsYH2SdaAn4PjC7vGmFk9tDAmnfFW8VdirsVdirsVdirsVdirsVdirsVdirsVf/9T39irsVdirsVdirsVdirsVdirsVdirsVS7XNd0fy1pV1rnmC/g0zR7JDLd313IsUMaDuzMQPl4nFX53/n9/wA506/5xnl8l/kgLjTNFuSLWTzD6TLq140lUKWqbmBGqOLU+sHbj6X2Sqofkd/zgj5p86SQ+bvzlubjQ9Huj9Z/QytXWLsueRa4dwwgDVqa8pv5hGd8DG75P0B8j/l75M/LnRY9A8k6Nb6NpiU5JbJR5GApzlkNWkY92ck40kRAZMABhS3irsVdirsVdirsVdirsVdirsVdirsVdirsVaIBxVjPnj8vfJn5jaJJ5f8AO2jW+s6ZJXilygMkbEU5xSCjRsOzIQcUGIL8/vzx/wCcEfNPkuSbzd+TVzca5o9qfrP6GZqaxaFDyDW7oFE4WlRTjN/Ksh3wWi65q/5A/wDOdPmDydPF5L/PAXGp6LbE20fmH0mbVrNo6IEuk2MyLQ8mp9YG/L1fsgpfohoeu6P5l0q11zy/fwano96gltL60kWWGRD3VlJHz8DilMcVdirsVdirsVdirsVdirsVdirsVdir/9X39irsVdirsVdirsVdirsVdirsVcTTFWBfmx+bvkr8m/K0/mrzleiGJQVsNOiKteXs4G0NvGSOTGoq32EHxOyrir80/Ov5ifnZ/wA5mefIvLXl2wmTQkkSSx8t20jHTrCIHgLq9m4qGcczyldf8iJN+JUXT7i/5x7/AOcTPJH5J20Os3yReYfzCZf32tzxgxWzdeNnG4Pp+Bk/vW8VX4MCK730PhZOxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV88f8AOQn/ADiX5J/Oy2m1mwSLy9+YSr+51uCMCK5b+W8jQD1PASf3q+LL8GBjXc+HfJX5ifnZ/wA4ZefJfLPmGwmfQpJGkvvLdzIw06/iJ4fWrKbiwVyEHGVV/wAmVNuII3Tdv0s/Kf8AN3yV+cnlaDzV5NvRNEwC3+nSlVvLKcjeG4jBPFhQ0b7Dj4kZlxSz0GuKuxV2KuxV2KuxV2KuxV2KuxV2Kv8A/9b39irsVdirsVdirsVdirsVdirsVeY/nd+d3lH8jvKMvmPzLIJ9Qn5RaLokTAXN9chahV68Y129WUjjGP5nZEZV+bOhaF+b3/Oa35tS32pXBW0jI+vahxb9G6Pp3KqwwJWhaleEdecr1eRvtvgRb9Nfyl/KDyR+TXlqPyz5MshCjBX1DUJaNeXs6inqzyUFT/KooidFXEBADPwKYWTsVdirsVdirsVdiqS635t8seWYvW8xa3YaTHxZ+V9cw21Vj+0R6jLWnemBjxB5rqv/ADlX/wA4+aOENx5/0yYyV4rZs94RT+b0Ffj1/awEsTOu9Kj/AM5l/wDOOI/6bWL6LW7/AOqONrx+Ra/6HM/5xx/6nSP/AKRLz/qjjxLx+Rd/0OZ/zjj/ANTpH/0iXn/VHHiXj8i7/ocz/nHH/qdI/wDpEvP+qOPEvH5FFWX/ADl//wA4631xHbR+ebSKSVuKvcQ3EEYJ/meSIKo92ONqMm/Is88u/m3+WPm1gnlrzjo+pylxCsVtfQPIZG3ChOfIk9qDDYZcQZkrBgCCCDuCOhwsl2KuxV2KuxV2KtEV2xVgP5tflB5I/OXyzJ5Y852QmjUM+n6hFRbyynYU9WCQg0Pipqj9GXEsSH5la7oX5u/84Vfm1Ff6ZcFrSQn6jqHFv0brOncqtDOlaBqU5x15xPR42+w+BIL9JvyR/O7yj+ePlGLzH5akEGoQcYtb0SVgbmxuStSrdOUbb+lKBxkH8rq6KUvTsVdirsVdirsVdirsVdirsVdir//X9/Yq7FXYq7FXYq7FXYq7FXYqwb82fzU8qfk75NvfOnm2cpaQfurOzjobi8u3BMdvCp6s1DU9EUM7UVTir8w9D0X81/8AnNf84J9Qv5vStkCtfXtG/R+j6YHPCGFT1bc8ErzlflI5+24B2QTXJ+oX5Yflj5T/ACl8pWflDydaC30+2HKedqG4urggB553AHJ2p8lHwrRRjSIxr3szwsnYq7FXYq4mmKqc08NvE887rFDEpeSWQhUVFFSzE0AAHU4q+Vvze/5zt/KzyC9xpPk1W86+YYuScrNxHpcUg2+O6o3Oh/3yrg/zrgY2XxZ+Yn/OZH56fmE80P6fby5o8tVGm6CDZqEbajT1aZtv+LKe2NLw97wu/wBRv9VuZL3U7ua9vJSWkuLmR5pWYmpLM5JJOFkhcVdirsVdirsVdirasVIZSQwNQRsQRir0jyR+fv5wfl3LG3lXzhqNtaxgKLCeY3dnxWtF9CfmgG56AY0GJFvrv8q/+fisEzw6b+b+g+hXin6e0NSyDsWltZGLAdyY3b2jwLuH215P88+UfzA0aPzB5M1i21rSJdhcWkgfi1K8JF+0jjujhWHhhSDafggioxS3irsVdirsVYZ+Z35Y+U/za8pXnlDzhaC40+5HKCdaC4tbgA8J4HIPF1r8mHwtVScFMZRv3vy+1vRfzX/5wo/OCC/sJvVtpOTWF7Rv0frGmFxzhmUdG2HNK84n4yIfsOUbpBt+nf5Tfmp5U/OLybZedPKU5e0nrFeWclBcWd2gBkt5lHRlqKHo6lXWqsMKWc4q7FXYq7FXYq7FXYq7FXYq/wD/0Pf2KuxV2KuxV2KuxV2KuxVBavq2maDpd5res3cVjpOnwvc3t5OwSKKGJSzuzHoABir8pPzR/MDz5/zmL+c9l5Z8pQz/AOHhObby1pbVEVrZggTX90AaBmUc5GP2F4wry/aUE0/SX8mvyh8sfkt5KtfJvlpC/H9/qeoyAeteXjKBJK5HQbURf2EouIQA9D6YsnYq7FXYq7FWC/mn+bfkr8nvLE3mjzpfrbW6hlsrFCGvLydRURW8ZILMe5+wn2nZVxtBL8t/z6/5yt/ML87bqfTPWbQPIYc/VvL1pIaSoOjXcooZm78do1/ZT9rBS08EqaU7YUtYq7FXYq7FXYq7FXYq7FXYq7FWwaYqy78u/wAzfPH5Wa/F5j8javNpd+hX140PK3uI1Ib054j8MiGnRh/q0OKCH6d/843/APOXPlb86oIvLuvCHy/+YsaqG05npbX5A+KSzZzWvcwsS6/smRatgRdc30phZOxV2KuxV3XFXnn5y/lB5Y/OryVdeTvMqFOX7/TNRjA9ezvFUhJUr1G9HXo6VXAWJD82vyt/MDz5/wA4dfnPfeWfNsM48vGdbbzLpS1MdzZkkQ39qCaFlU+pGw+2vKFuP7JSDb9W9I1bTNe0uz1vRruK+0nUIUubK8gYPFLDKoZHVh1BBxSjcVdirsVdirsVdirsVdir/9H39irsVdirsVdirsVdirRIG2Kvzz/5zy/P2XVNQH5FeT7hpLW2kil82TW55Ge6qGhsRxrUIeLyj/fvBPtRsMVe8/8AOIH/ADj0n5N+SRrvmC2UfmF5kjSbUmdVL2VqaNHZq29KbNL4ybfsLgYjfd9KYWTsVdirsVdirzr85/zh8r/kn5LufOPmVjK1fq+l6ZGwWe9vGUlYkrWg2q70+Bat4DAUEvyA/Nj82PN35yebbnzd5vujLcyEx2VjGSLWytgSVggQk0Udz9p2+JqthUBguKXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqrWt1cWVxFd2kz293bussFxExjkjkQhldGUgqwIqCMVfp9/wA4gf8AOVp/NKCL8uvP8wT8wrKAmx1E0VNVt4QKlh2uUG7gf3i/vF/aGBHJ9dA1wpdirsVdirsVfNf/ADl//wA48p+cfkk695ftl/5WH5cjebTiiqHvbVatJZsxpWu7Rb7SbfttgYnbd4N/zgb+fsulagfyK84XDR2tzJLL5TluDxMF1UtNYnlSgc8niH+/eafakUYWT9DAQdsVbxV2KuxV2KuxV2KuxV//0vf2KuxV2KuxV2KuxV2KvH/+clPzjtfyT/LDUfM0bK3mO9rp3lyA8W5ahMjFZCpIqkQBkf5Bf2sUF8T/APOEX5LXP5nef7z83fOcb3uh+X7priGS5Bf69rsjetzYn7XpcvVf/ixo/fAxO5p+m69MLNvFXYq7FXYql+uazpfl3R7/AF/WrlLPSNMgku766kNEjghUu7H5AYoJp+N3/ORH55a1+eXn+58wXDPb+W7Ita+XNLLMUgtA32yp29WWgeQ08E+yi4FDyLCl2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ko/SNY1TQtUs9a0a7lsNW0+VLmyvLdiksU0R5K6sOhBGKv2H/wCcaPzzs/zz/Lu31qThD5r0wrZeZbFNglyFqsyD/fcw+Nf5TyT9jAEDue0YUuxV2KuxVpumKvzI/wCc3PyVufyw8/2f5ueTI2stD8wXQuJZLYFPqOuxt63NSv2fV4+qn/Fiye2BhHY0+2P+ca/zjtfzs/LDTvMsjKvmOypp3mOAcV438KKWkCgmiSgiRPmV/Zwsg9gxS7FXYq7FXYq7FXYq/wD/0/f2KuxV2KuxV2KuxVpumKvys/5y0/MDVfz3/Pq0/L/ygTeadodyPLuhwoS0c+ozyhLqbbkKGQCPkP8AdcQbFB2D9H/ym/LrSfyp8gaH5E0hV9LS7dVuZwADcXb/ABTzNQDd3JPy2xCxGzNcUuxV2KuxV2KvhH/n4T+csum6dp35NaHcFJ9TVNT8zNG1D9VVj9Wt2p2dlMjg9lj/AJsDE7n3PzwY8jXCyaxV2KuxV2KuxV2KuxV2KrlRmIVRVjsANyScVep+Y/yC8/eSvyvs/wA0vOFn+h9L1O7hs9K064+G9mE8byiV4zvGnFDx5fG38oXfI8W4DSclTEa53u8qyTc7FXYq7FXYq7FXYq9q/wCcXfzjuPyZ/NXTNYnmK+V9WZNM8yQmvD6pM4AmpUDlC1JAf5ea/tYoL9kY5I5UWSJg8bgMjqaqVIqCCOoOKV+KuxV2KuxVhX5sfl1pP5reQNc8iauqiLVLdltbhgCbe7T4oJlqDujhT8tsBRIbPzg/5xL/ADA1T8iPz6u/y/8AN5Nnp2uXJ8u65C5KxwajDKUtZ9+IoJCY+R/3XKWwqNxb9U16YpbxV2KuxV2KuxV2Kv8A/9T39irsVdirsVdirsVeQf8AOS/5pr+Uv5PeYPMkFx6Ou3UR0zQKfbOoXgKIyio/ul5S/wCwxV8d/wDPvX8q/wBPeb9X/NjWIvVs/Lymw0hpPi5aldLWWUVB3jiNK+MuBidy/SIAA1wsm8VdirsVdiqF1C/tdLsbrU76QQ2NlDJc3MzdEihUu7H5AE4oOz8PvzX8+Xv5m/mJ5j883zMW1i9kmto2rWK1U8LeLcn7ESquIUcmGYpdirsVdirsVdirsVdirJPI/kPzZ+Y2v2/ljyZpU+ra1cmoggWqxxggNJK5+GONa/E7kKMVJp+mX/OOn/OGPlL8qPqnmjzv6PmT8wkCyxsV56dp8gNR9WRwC8g2/fOK/wC+1TqwRV80q/5+KbfktpH/AG37f/qHuMhL6g4+T+8h8fufl9ljkuxV2KuxV2KuxV2KuxV+vv8Azhr+ZUn5j/kfo5vpfV1vy0ToOoMTydhaKvoOSe7Qslf8oHAxHc+gcLJ2KuxV2KtFQTXFX5uf8/Cvyr/QPm/R/wA2dHi9Kz8wqLHV2j+HjqVqtYpTQDeSIUrXrFg5MRsX2L/zjR+aa/m1+T3l/wAyT3Hra7axDTNfr9sahZgI7MKn+9XjL/s8LJ6/irsVdirsVdirsVf/1ff2KuxV2KuxV2KuxV+bH/PxL8w5tY896D+WVhMXsfL9sNQv4EoQdRv6iMGlSSkIUr/xlOKH2l/zjn+W6flb+Tnljyq8fDUvqwv9W2oxvr399KDsN05CP5IMARHk9VwsnYq7FXYq7FXg3/OY3m9/J3/OP3mq4t2ZLzV0i0W3ZBUg378JDXktP3Qk3Fd8BYy6Px6wsnYq7FXYq7FXYq7FW6VFcVe+f84/f84q+fPzxu49TKtoPkKKQLd+YLmMkygblLSNuPrNtQtX00/abl8BCL7n6iflX+T3kT8nPLy+XvJGmraxuQ99fyH1Ly7lAALzSkVPTZRRF/YVcNKBTPcUvln/AJz18q+ZfNn5P6bZeV9Iu9ZvINbtpprawhe5mWMwzpz4Rhm4hmAJptXIEbgtE4kziegt+cR/JP8AOICv+APMRHtpV4f1RZNuBBSjUPy98/aTL6Gq+VtXsZqBvTutPuoW4t0NHjBocBkAxM4g0SLSe70nVNPUPf2U9qrGitPE8YJ8ByAwsrCEAr3GKXU2rirWKuxV2Kvt3/n3F5wks/O/mvyPI7G21XT01OCMLUCaxkEbHlX4arN4fFRfDB1R1fpADXfClvFXYq7FXYq8q/5yL/LhPzS/JzzP5VWMSal9Wa/0narC+sgZogNju9DH8nOAsZPi3/n3b+Ycukeete/LO/mKWHmC2OoafA1ABqFhQSAVIILwli3/ABiGFL9J8UuxV2KuxV2KuxV//9b39irsVdirsVdiq13WNGkkYKiAszHYADck4q/J7yfFH/zkX/zmP+lV9a40C/1yXVmNwCXXStL+KFHChwoKRRxgH4fipgLE8ve/WJdhQCgGwA6Uwsm8VdirsVdirsVfEn/PyPV0h8ieTdCAb1bvVprzmKcQlrbshB71JmBHywdWBoyD83MLN2KuxV2KuxV2KonT7C91S9g07TraW8v7pxFbWtujSyySMaBURQSSfAYq+/P+cdf+cD0gNp5x/O+IPKCk1l5NRgyKVYMDfutQ3T+4T4f9+MfijxY7l95Wdlaafaw2NhBHa2Vsiw29tAixxRxoKKiIoAVQBQADFkrgUxV2KtU3rirdMVaIB674KRSGvdN07UohBqVpDeQKeSxXEaSoGpSoDgiuGkGIPMMQ8wfkx+UvmrkfMPkrRb92jMPqy2MAkCH+V1UMpFdiDUYKXhDwvzz/AM4Cfkl5mEk3lv6/5SvnNU+pTG6tQeIUVhueZptyIWRd++K0Xy7+Yv8AzgH+cPlIT3vlOS0846XHVlS0b6tqHGp628x4ttT7EjH/ACcVs9XzDrWhax5c1CbSNf0+50vVbc8Z7K9he3nQ+6SAEYUg2l2KXvf/ADhnrw0L/nIvye7hzHqD3Omssbcam6t5FXluKqH4kjAWEn7BL03ws28VdirsVdirTdN+neuKvye84RRf846f85j/AKVYzW+g2OuRasptwQ7aVqnxTIoYIGASWSMgfD8JGAMRy9z9YEdZEWSNgyOAysNwQdwRhZLsVdirsVdirsVf/9f39irsVdirsVdirzj8/fMS+VPyY89a4zOjQaNdxQtHwLia5jMEZAdlGzOCd60+zU7Yq+MP+fb/AJO+s+ZvN/nqeMFNOs4dJs5CrbS3b+tLRvs1CxrUdfiwdWB+p+ioFBTCzbxV2KuxV2KuxV8E/wDPy0r9R/Llf22m1Un5KtrT9eKH574pdirsVdirsVdir9Gv+cDE/IT9FhtGZT+dAR/0n+luAuxCx3XT6niYqAczGPV3/efDxyLWLv1PuNemSbG8VdirsVdirsVdirsVdirsVdirDPzA/Kj8v/zS046Z570C11eEKVgnlTjdQ1BFYp04yId/2WwUxoPgb88/+cB/MvlKO58x/lJcS+ZdDiDSy6FPxGqwIDU+kyhVuFA7ALL4LJitkc3h/wDzjHBPaf8AORXkC3uYmhuItZjjlhkUo6OocFWVgCCD2OFL9nBil2KuxV2KuxVoiopir86v+fkHk1bbzN5Q89QRUGo2k2k3kgVqGS0b1Yqt9mpWR6D/ACcHVgPqfZ35BeYk81/kx5F1xXZ2m0a0imaTgHM1tGIJCQjMBVkJG9afaodsLN6RirsVdirsVdir/9D39irsVdirsVdir5B/5+Ja/DYfk7pWgi6hjutY1mBvqb8jNLb2cUju0dNgEdo+Rb+YYoTj/nALyx+g/wAiI9YkiMc/mPU7u+5FuQeKEraoQo+z/dN74BzQOZfU2Fk7FXYq7FXYq7FX51/8/KpH/wAT+QY+RMYsL9glTxqZohWnSuQ/i+DVH+8PuH++fCuTbXYq7FXYq7FXYqi9N1LUNJv7fU9KupbHUrSRZrW8tnaGaKRDVWR0IKkHuMVq337/AM46/wDOeMNwLTyb+d8qwTgLDZ+cVWkb8QAovkUHix/3+nw/78VfifAx3D7vtbu3vYIrq0mS4tJ0EsE8TCSOSNxVWVlJBBHQjCyV8VdirsVdirsVdirsVdirsVdirRAOKvIPOH/OPXkjzN+ZPlr82LGFdH87aDqMV9eXttGCuowxqVMVwlVBelOM3216NyH2VFb7PX16YpbxV2KuxV2KuxV8s/8AOfvlj9OfkRJq8cJln8uanaX3INxCRTFrVyVP2v71ff8AHB1YnmEn/wCfduvQ3/5O6roJuoZLvR9Znb6onITxW95FG6NJXYh3WTiV/lOFPV9fYpdirsVdirsVf//R9/Yq7FXYq7FXYq/PD/n5L5lun13yV5PWSI2UNpc6q8YVTMJpZPQUlvtBSqHbofo2CAd31r/zjHpdtpH5B/l9bW0YjWTR7e5kAPLlLcj1Xav+UzE4hjAgiw9aws3Yq7FXYq7FXYq+Ef8An5PoEkui+RPNEdupitbq9064uR9oG5jjljU+37pyPfB1YfxfB+d+Fm7FXYq7FXYq7FXYq7FXv/8Azj//AM5W+efyQuotKctr3kF3/wBI0C5c1gDMC8lm5r6b0r8H903deXx4EV3P1E/Kz83fIn5weXU8w+SNTW7iUKL2xkol5ZyOK+ncRVJU7Gh3Rv2GbCgFnQYE0xZPF/8AnJj87dQ/IbyRp/m/T9Ii1l7rVILCa0nlaBfReOSRyrqGIc+nRTxYDrQ5EncBrlOpAd7wby//AM/I/JlwUTzN5M1GwZ5QryWFxDeIkJp8X7z0WLD+UDfDuy3eseXf+c3f+cdtfKRyeY5tInkkESx6pZzwCh6OZEWSNV9y/wA8bW/J695b/ND8uPOEaSeV/Nelar6nPglreQvIRH9o8OXLbvtjYXiDKg6sAVNVIqCNwRhZNgg4q3irsVdirsVdirsVdirsVdirsVeS/wDOTmmW2r/kH+YNrcxiRY9HuLmME8eMtsPVRqj+VlB98BYTIAsvkr/n2z5luk13zr5QaSIWU1pbaqkfFRMZopPQYhvtFQrjboPau6yvd+h+FLsVdirsVdir/9L39irsVdirsVaOKvy9/wCfiltNF+duk3DlDFP5etfSCmrgJdXSnkKbb9MFIA3t+j35eQLa+QfKtuihFi0fT0CqAAAttGKADYYjkxgbiCyXCzdirsVdirsVdiryr/nIv8sf+VuflF5i8nwIG1doRfaKakH6/Z1kiH+zoYz7PgLEvxcubea1mltrmNobmF2jmhkBV0dCVZWB3BBFDhZKOKuxV2KuxV2KuxV2KuBpirJfI/n/AM3/AJb+YbbzR5L1WbSdZtiKSwn4JE7xyxtVZEPdHBXFBFv0z/5x1/5zM8o/mwtr5X85mDy3+YTKI40d+Gn6g6gb28j/AGJGP+6HPL/fbSdgi65pR/z8TqfyV0ivX9P2/wD1DXGQl9QaMn95D4/c/L7LHJbqcVbWR0YOhKOOjLsR9IxV6J5Q/Pz85PIjJ/hnzpqlrAhUi1lnN1bHivAAxXHqJQLsPh2wUxMQ+qPyy/5+LazaSQ2H5seX47+12V9a0QejcqCftPbSNweg68Hj/wBXFd32v+XH5v8A5d/mzpx1LyFrtvqioA1xaAmK8gr/AL9gk4yL1pUrxPY42m2c4UuxV2KuxV2KuxV2KuxV2Ksa/MOBbryD5qt3UMsuj6ghVgCCGtZBQg7HAeTCZqJL84f+fddtNL+durXCMgig8vXXqhjRyHurVRxFN9+uNMiN7fqEMKW8VdirsVdir//T9/Yq7FXYq7FVrbjFX5Of854Xd3c/85FatbXE8ktvaWOnRWkTsSsUb26yFUH7ILuzGn7THIg82qJ5+9+pflGNYfKugxIKRx6daIo67LAgGCHIe5cP0R9wTrJtrsVdirsVdirsVdir83f+c6v+cdbnQNbn/OXydZF/L2ryV8020Clvqd8231ogVpHOT8Z6LL/xl2DHk+JCCOuFk1irsVdirsVdirsVdirsVXI3Fgw2I3BHUHxxV6p5n/5yB/MDzv8AlnZ/lj5xvTrOm6ZdRXmmajckvfIYldPTllNTKoVyF5fEP5m2pDh3tqOO5iV7C9nlOTbXYq7FXYq7FUy0LX9a8s6nb615e1C40vWLRudtfWcrQTI3s6EH5jvir7w/5x9/5z3E8lr5T/PDijNxhtfOMCcVJNFH12FBQVO5mjov88Y3fAx3D72trm3u7eK6tJUntZ0WWCeJg8bxuAysrKSCCDUEYWStirsVdirsVdirsVdiqS+bo1m8q69FIKxyaddow6bNA4OQnyPuas30S9xflp/zgfeXdt/zkVpNtbzyRW93Y6jFdRIxVZY1t2kCuP2gHRWFf2lGEnksjy979ZFFBkm1vFXYq7FXYq//1Pf2KuxV2KuxVpumKvyv/wCfgegHSPz3XV/X9X9PaRZ3oiKhfSMBe041qeVfR5VoPtUwUwEavzfpp5Llafyf5enYgtJplk5p0q1uh2yMOQ9yMQqAHkE9ybY7FXYq7FXYq7FXYqhdQ0+x1SwudN1K3ju9PvInt7u1nUSRSwyqVdHVqgqwJBBxV+YH/OU//OH+qflfdXXnj8vLafU/y6mLTXdqgaW50gkkkPSpe3H7Mv7H2ZezuGPLm+SsLJ2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KtgkdMVfWP/OIn/OVN9+V2r23kTz3fNN+WuoSCOC4nLOdJnc0EinciAk/vE6J/eL+1yDGqNh+pEUqTIksTiSKQB45EIZWVhUEEdQRhZKmKuxV2KuxV2KuxVIvOkrQeT/MMy0DR6ZeuCelVgc75CfI+5ryi4H3F+Zf/AD780A6v+e7av6/pfoHSLy9MQUN6vrlLTjWo409blWh+zTJUkxuvJ+qC9MLNvFXYq7FXYq//1ff2KuxV2KuxV2KvzJ/5+M6FcWf5s+X/ADA7xG21XREt4o1eswexuJS5dKbKRMvA1+Kjfy4sQN36BflHq1trn5XeS9WtOX1e60TT3TmKNtbIpr13qMA5LA2GaYWTsVdirsVdirsVdirsVU5YkmRo5FDxOCrowBVlIoQQdiDir44/Pv8A5wQ8tecpLrzR+U72/lrzJKWluNEkBTSblyP918ATbsT/ACqYv8lPtYGO45Pz38+flv54/LTWG0Pzxolzo1+K+n9YX91Mq/tQyrVJF90Y4Ug2xUgjrilrFXYq7FXtv/OJvk3y1+YH53aL5R83WCaloGpWuopdWrllqUspXRlZSCrKyhlIPUYCGJFvQP8AnIv/AJwu81flUbvzV5G9bzJ+X68pZVC8tQ06MUP79VA9SMV/vUXb/diL9oq3XN8pkUFcLJrFXYq7FXYq7FXYq7FXYq7FX6j/APOBn5yXPnz8vbryHr1yZ/MHkz04rSWRqyS6TKKQ1r19JlMX+p6eBiNjT6364WTsVdirsVdirsVYX+bmq22h/ld501a75fV7XRNQZ+G7b2zgUr3qRgPJjMgB+fv/AD7m0G4vPzZ8weYEeIW2laI1vLGz0mL31xEUKJQ1UCFuZ/Zqv82FSNw/TbFk7FXYq7FXYq//1vf2KuxV2KuxV2Kvg/8A5+SeVkl0nyV5yisp3mgnudLutQVh9WiikUTRRuvUO7ByreCsPDFHV9Af84h6+PMP/OPPki45RM9jaPpkiwn7JsZXgAcdmKqCfny74hjG3uGLN2KuxV2KuxV2KuxV2KuxVoiu2KpP5l8peWfOWly6J5r0m11nSZhR7S+hSeP5gMDQ+BG+KCLfKPn/AP594/lhr8k175H1e+8qXT82WyemoWIc1KgLIVlUV/4tbbouBFF89+af+fe/516PKx8u3OleY7WpCGG4NnOVC1BZLgBRU/DtI2+K2e541r//ADjv+eHlcFtZ8haxHGsbTvLb2zXkaxKaFme29QLSnc42vEHnV7p99p0oh1C1mtJmHJY7iNomKnoaOAaYWT6C/wCcGv8A1pPyv/xg1P8A6gJ8VfrkVU9d+xHtir46/wCciv8AnB7y/wCfvrXm78q0g0Dzk5aa70k/utMv3YlmYUB9CVieqj0m/aVal8HJjyfm/wCZ/K3mHyZrd15c806ZcaRrdm3G5sbtDHIpPQiuxUjdWWqsN1OFlaT4q7FXYq7FXYq7FXYq7FX0X/zhD5vk8r/85B6DatKY7LzDDc6PcoFLhzNH6sQIBFP3safF+zgLGT9cl6YWTeKuxV2KuxV2KvD/APnLzXx5e/5x4873HKJXvrRNMjWY/aN9KkBCDuwViR8uXbAWErfP/wDz7b8rRxaT5185S2U6TTz2+lWuoMaW0sUamaWNF6l0YoWbwZR44WXV94YpdirsVdirsVf/1/f2KuxV2KuxV2Kvm7/nOXykPM//ADj/AKzeRxRyXXl64ttWiklleL01jf0pWRVqHYpIyhX2+Kv2gMUMD/59zeaBqH5ZeYvKkkimbRdVNxFGEIIgvolIJboavG9B1GDqj+Ivs3CydirsVdirsVdirRYDFW8VdirsVdirsVdirR9sVS7U9A0XWVK6vptpfqyGEi6gjmrG3VfjU7GvTGmJA7mLaT+TH5V6D5hsfNWheUNL0rzDpqypZ6hYW6WsiCdDG9fSCh6qxHxhqV2wALws6Fab4WTj7Yq8x/OX8h/IP54aJ+jPN1kE1OBGGl67bAJfWjsCBxenxpU1MT1Rvn8WKCH5b/nt/wA42ef/AMitSP6Yh/SflK4kK6b5ltUP1aQV2SZfiMMu/wBhjRv2HfAoLxgimFLsVdirsVdirsVdir0f/nH+6nsvzu/L+5tpPSlXXbBQ+2yvOqN1qNwSMhMkCw0Z5GMCRzftsvf5nJt7eKuxV2KuxV2KvjL/AJ+M+aBp/wCWXl3ypHIom1rVRcSxlCSYLGJiSG6CjyJUdTg6sf4gzz/nBryl/hj8gNGvJIo47rzDcXOrSyRSvL6iSP6UTOrUCMEjVSqbfDU/EThS+kcUuxV2KuxV2Kv/0Pf2KuxV2KuxV2Ksc8/eX5PNfknzJ5YibhNrWl3unxOTxAe5geNTWhpuw7Yq/OH/AJ9/eapvLH51an5MvuUQ8w6fPbGFuW17pzesoKgUqEEoq3TAWB5gv1AUkipws28VdirsVdirsVfH/wDzm5+aPm/8oNd/K/zj5NvTb3sM+qx3VnIWa0u7craFobiIEBlPY/bT7SMrYoIelfkL/wA5S+QfzwsYbGCZNE89pHW98t3Ug5syj4mtJDQTJtXYc0/bQdSLRfe91Bwsm8VdirsVdirsVdirsVdirsVdiqB1fR9L13TLrRtasodR0m+jMN5Y3cazQSxt1V0cEEfRir89v+civ+cEdQ0d7vzj+SkMmoaTvLeeUWYvdwVJLGzZv72MD/dTH1f5TJ0ARyfDs8EtvJJBPG0U8TFJIpAVdWU0KsDQgg9sKVLFXYq7FXYq7FXrf/OL0ay/85B/l4jAMBrEDUO+6BmH4jFBftEBQYpbxV2KuxV2KtMSBUYq/L//AJ+A+a5vM/51aZ5MseUo8vafBbCFeW97qLeswCkUqUMQqvXAOrAcyX6PeQfL8nlTyT5b8sStzm0XS7LT5XB5AvbQJGxrQV3U9sLNkeKuxV2KuxV2Kv8A/9H39irsVdirsVdirsVfk7+eo1L8jv8AnL6882p/drrFv5otWRaepaXzCSZQPn6sR8aYGJFh+rGm39rqunWmqWMglsb6GO5tpV3DxTIHRh8wQcKQbRWKXYq7FXYq7FXw5/z8m0h5fKPkfXQw9O11K5snTfkTcwCRSO1B6Jr8xka3YV6rfnVa3VxZXMV3aTSW91AwkgnhYxyJIpqrKykEEHoRkmb7C/Jn/nPzzn5Sjt9D/NG0fzbokdEXVo2WPV4k6fEWolxT/L4SfzSHBTGq5Pu38tfz5/Kj82bdJPJfmO2ub4rWTSbg/VdQQ9wbeXixp/MnJP8AKxtb73pHIeGFk4GuKt4q7FXYq7FXYq7FXYq1yGKvmj/nIj/nMPyb+TgufLnlz0vMn5iIDG2nxvWzsZPG8kQg8hX+5Q8/5/T64GN9z8t/OXm/W/PnmXU/N3mSdbjW9Xna5vJY41iQux6KqAAADYYQKTGIiKCQ4pdirsVdirsVe4/84f6LLrf/ADkX5HhjkWIWlzNfuzb1W0t5JSop3bjx+nAWEuT9jF6dKYWbeKuxV2KuxVC6lf2uladd6pfSCKxsYZLq5lbokUKF3Y/IAnFBNPym/Ikal+eP/OX1l5tk/u21i480XTOtfTtLFjJCpHz9KIeFcCAKD9Y8LJ2KuxV2KuxV2Kv/0vf2KuxV2KuxV2KuxV8Q/wDPxX8uDqnlLy/+Z9hblrvQZzperyqKn6jenlCz/wCTHMOI958Vehf84Nfmb/jr8l7XQLub1Nb8my/oq4VjV2syOdq/jThWP/nngDEbGn05hZOxV2KuxV2Kvm//AJzk8qP5n/5x/wBauYI1kuvL9xa6ulYy7iOJzFLxK/Z+CRmYnbiuAsTzD8kcLJuppTFV8U80EqTwSNFPGweOVCVdWXcEMNwRir2XyR/zlf8An15DSG30vzfc3+nQ7Lp+rhdRi4gEBeU4aRQK9FkXFFPcPLf/AD8f/MCyjSLzR5S0vV2WIIZ7OaawkaUH+8YMJ1Nf5VCfPAxo970bS/8An5L5Jkjtl1nyVqlvO3EXbWs9vPGlTRinP0yw70PHHdPqZmn/AD8H/IRyKx66gPXnYx7f8DO2JJWRI5C0/tP+c5v+cbrmBJZPM1xayMKtBPpt9zQ+BMcLrX/VY4Ug2yvyJ/zlF+Sv5leZ7Tyd5O8wPfa/fLK9tbNZ3UAcQRmV/jljVQQqk7nACi/J7CMLJvFUt17X9H8s6Xc65r9/b6Zo1khlvL67kWGGNB3LMQPkO+KLfnX/AM5F/wDOdWr+aVu/KH5NyTaR5ckBhu/MrqYtQu1ZSHWBSKwRmv2/74/8V9wirfFTyySMzyMWdyWdmNSWO5JJ6k4WSzFXYq7FXYq7FXYq+xv+fdvlR9U/NjW/NTxhrTQNJeJHeMuBc38iqvF+itwST3K1wMTzD9N16YWTeKuxV2KuxV8x/wDOcv5mjyL+S91oFpN6et+cpf0VAqmjrZgc7p/GnCkf/PTAWJ5089/591flwdL8peYPzPv7crd69ONL0iVhQ/UbI8pmT/JkmPE+8GFk+3sVdirsVdirsVdir//T9/Yq7FXYq7FXYq7FWPee/KGm+fvJuueS9X/452uWc1jM43aP1UIWRdx8SNR191xV+YP/ADjR5w1X/nHb/nIyfyZ5sYW1jfXUnlfzCpNIll9Xjb3IJB+EScSG/wB9SMcBYnvfq9UVphZN4q7FXYq7FUo8z+X7HzX5d1byzqaCTTtYs57C5UgN+7uI2jJAIIqK1GJQRYfhr5x8r6j5K806z5S1ZCmo6JeT2FyOxaBynIezAch7HFQkWKXYq7FXYq7FXYq7FX0X/wA4Nf8ArSflf/jBqf8A1AT4q/XImmKvKfzs/wCcg/y+/I3Rvrfme7+s69cIzaX5dtSGvbpl7kbiKOvWWSi/y8m+HFBL8tPzv/5yI8//AJ56ubjzHcmy8vQOTpvly0ZhZQLU8WcberLQ0Mrj/UCL8OBQHkeFLsVdirsVdirsVdirqYq/Vr/nA38un8m/kxH5jvogmqecbltTqachYoPSthWgNCA0gFf28DEDcl9SYWTsVdirsVaqK074q/KH/nJfzhqv/ORP/ORkHk3ymwubGxuo/K/l5QaxPJ63G4uKgD4TJyJb/fUanAGI736feRPKOmeQfJuh+S9HH+47Q7KGxhc7M/ooA0jdfidqu3u2FkyHFXYq7FXYq7FXYq//1Pf2KuxV2KuxV2KuxVxFcVfnz/z8M/JqSG707869Dtv3Ewi0rzT6a7pKvw2ly9OzD9wzeKwr+1ir6A/5w8/OlPzc/Ky1tdTuPU84+V1j0zWQ7VkmjRaW9z0H94go3/FivgG2zEbbPobCydirsVdirsVfnB/z8K/KCXSfMun/AJwaRb/7i9cWPTteKLtHqECEQytQbCWJeFT+1F/lYEdXxAfbCl2KuxV2KuxV2KuxV9Ff84NkD/nJLywxIAFvqZJPQAWE+KC+oP8AnIv/AJzn0Xyp9c8n/lBJDrXmYBobvzGaSafZsQQfQ7Tyqe/9yp/35uuDmjcvzo1/zFrnmrWLvzB5jv5tU1q/kM15fXTmSWRz4k9gNgBso2GFklmKuxV2KuxV2KuxV2KuxV6F+Sf5Y6h+b/5k6H5GsFYQXkwl1S4X/dGnwENPIfkvwr4uyjFBfthpmm2Wj6fZ6TpsQg0+wgjtLSBfsxwwKERR7AADFQKFIzFLsVdirsVfPP8AzmH+dKflJ+Vl1aaXccPOPmhZNM0ZUakkMbrS4uehp6aGi/8AFjJg57MTvs+f/wDn3n+TUk13qP51a5bUghEmleVjIv25W+G7uUr2UfuFbuWmX9nCyfoMBTFXYq7FXYq7FXYq7FX/1ff2KuxV2KuxV2KuxV2KpJ5v8q6R548sat5R1+H19F1q1lsryMGjcJVpyU70ZT8SnswBxV+VPlPWvNX/ADht/wA5EXFjq6yy6RazGx1VQCF1DQ7hw0dxGOhbiFlTwkVo/wCbFjIX7w/WLRtY0zX9Jstb0a6jvdJ1GGO6sruFg0csEqhkdSOxBxCbR+KXYq7FXYqxj8wPI2hfmP5O1fyV5lhE2k6vA0Eh/bik6xyodqPG4DqfEYqRb8W/zR/LXzH+VHnfVPJPmeIx31hIfQuOPGO6tWYiK4i3PwSAV6/CaofiU4oBthmKXYq7FXYq7FXYqiLO+vNPlaexuJbWZkeJpIHaNjHIpV1JUg0YGjDuMUEWoMeR/DFLWKuxV2KuxV2KuxV2KuxVfEjSOsaKWdjxVVBJJOwAA6nFX6u/84Zf84/S/lF5HfzN5ltfS8/eaUSS8ik2ksrAfFDakV2cn95L0+Iqh/u8DEbvp7CydirsVdiqA1nV9M0HSb3W9Zuo7LSdOhkur27mYLHFDEpZ2YnsAMUW/J7zZrXmn/nMn/nIi3sdIWWLSLqYWOlKQSun6HbuWkuJF6BuJaR/GRlj/lxQBXxfqr5Q8q6R5H8saT5R0CH0NF0W1isrOMmrcIlpyY7VZj8THuxJxZJ3irsVdirsVdirsVdir//W9/Yq7FXYq7FXYq7FXYq7FXzZ/wA5e/8AOPC/nT5MGueXoK/mN5aid9JCcVN9bE85LNyabmhaAk/DJ8Owkc4q+ef+cHf+cjf8Magn5KefbswaVdzMvli8uyy/Vb12ANi/L7KyNUx1+zL8H7YpE7MORt+jOSZuxV2KuxVogHY4q8J/5yc/5x20j89/KRW0SK08/aSjPoGquKcurNazMP8AdUh7n+7f41/aVggjq/IzzD5e1nyrrN75e8w2Uuna3p0rW97ZXC8ZI5EO4I7juGHwsPiXbCoNiwleKXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX3l/zhf/AM4pNeXFn+cH5lacRYxcLnylot0tPVkBDJezIf2F6wq32j+86BOQ5sbv3P0LXphZN4q7FXYq7FX5zf8AOcX/ADkb/ifUG/JTyFdmfSrSZV8z3loS31q9RiFsk4/aWNqGSn2pfg/YNQGHM2+hv+cQv+ceF/JbyYdc8wwU/MbzLEj6sH4sbG2B5x2aEV3FQ05B+KT4dxGhws30nirsVdirsVdirsVdirsVf//X9/Yq7FXYq7FXYq7FXYq7FWmBI28cVfnz/wA5wf8AONMmnXN1+eX5f20gSSQT+b9PtVp6Eg3/AEjHxoQCQPXoPhf993kZVXp//OHX/OUUP5m6TD+X3nu9UfmLpkfGyu5SE/StpGAAwOwNwg/vB1df3m/x8RyYjbZ9bg1wsm8VdirsVdirw3/nIX/nGbyf+e+jNNOE0nz3aR8NJ8xxpVqLUiG5UU9SIk/68f2kP2lYIrq/Kz80Pyk89/lD5hfy9540x7KcljZ3i1ezu4lJX1IJQKMpp02df21U4VBtg9CMUtYq7FXYq7FXYq7FXYq7FXYq7FXYqi9O03UNVvrfTNKtpb3Urt1htbS3RpZpZH2Coigkk+2Kv0I/5xj/AOcH00Oaz8/fnRaxXOpoFn0vyi9JIreQGqy3pBKu4/ZhFUX/AHZyPwqEc33SiBAFUBVUUAGwAHQAYUrsVdirsVaJoMVfJP8AzmL/AM5RQ/ljpM/5e+RL1T+Yupxhb27iIf8ARVpIDVidwJ3H92vVF/efycgxO+zy/wD5wf8A+capNRubX88vzAtpCkchn8oafdLX15Dv+kZOVSQCT6FR8T/vu0bEsn6DKCBv44q3irsVdirsVdirsVdirsVf/9D39irsVdirsVdirsVdirsVdiqyWGKeN4Z0WSGRSkkbgMjIwoQwOxBHbFX5g/8AOU//ADjDq/5J68n5o/lf9Yi8jG5S4/0Zn+saHeF+SfEPi9AtT0pD9g/upP2GkUeRfTv/ADiv/wA5Y6V+cGn2vkzzbIth+ZlnDxJaiwaosI+KaHoBLQcpIvmyfD9keTEEjYvqTCzdirsVdirRFeuKpB5x8k+VPP8Aoc/lrzlpNvrOi3G72t0nIK1CA8bCjI4r8LoVZexxKCHwr+bn/Pu+9iefV/yb1cXNvUv/AIc1h+Eqj+WC6A4t/krKF95TgXcPjbzp+Wvnz8u702Hnby7faJODxVrqFhC53H7uZaxuNuqM2KggsUwpdirsVdirsVdirsVdiqL0zS9S1m8j0/SLKfUL+Y8YrW1ieeZydqKiAk9fDFX05+Vf/OCH5ueeXivvNyJ5J0BqMz349XUJF2NEtUYFTT/fzR0/lOKL7n33+Tf/ADjl+WH5J24fytppuPMDpwuvMN+RNfyVFGCtQLEh/kjCj+blgpaet0GFLeKuxV2KuxV8t/8AOVH/ADljpX5QWF15M8pSJf8A5mXcPEcaNDpazD4ZpuoMtDyji/2T/D9oc9mBJOwfMX/OLH/OMOrfnZrz/mj+aAnk8jC5e4rcMwuNcvA/JxyPxegGr6sg+2f3Uf7bRln5B+n0UMUEaQwIscMahI40AVFRRQBQNgAO2Kr8VdirsVdirsVdirsVdirsVf/R9/Yq7FXYq7FXYq7FXYq7FXYq7FUPf2NnqdlcadqNvHd6fdxvBdWs6CSKWGVSro6MCGVgSCDir80f+cmP+cS/MP5ParL+aX5RfWX8mWkov5YrZ2N9okqPyDowPN4FO6yD44h/e/CvqMoe2f8AOMP/ADmlpnnpbXyP+bFzBpfnICODTdbekVpqbGihZNgsU5PbaOT9ni3wYGN1z5PsmuFm3irsVdirsVdiqF1DTbDVbWSx1O1hvbKUFZLa5jWWJgRQgq4IOxxQQC8b80/84jf84+ebpTcX/ku1sbhn9R5NJeXTuRpxoVt2RKewXBSKeXar/wA+6vycu0m/Rmta7p0rtWGk9vPHGta04vDybbYfHjugiVbH7GPn/n2v5K/6nnVf+kW3/rgosan3j5f8ea/6Jr+Sv+p51X/pFt/640U1PvHy/wCPO/6Jr+Sv+p51X/pFt/640VqfePl/x53/AETX8lf9Tzqv/SLb/wBcaK1PvHy/48mOlf8APuD8sbd3bV/NWt38ZWiRw/VrUBq9STHLUU7bYi1Al1I+X7Wf+XP+cGf+cetAMEt1odzrdzDy5SaleTOknIEDlFE0abdvhw0yAPUvbvK/kPyZ5JthaeUfL+n6JBQKVsLaO3LBQFHJkUMxoBUsanCoiAyEe+LJvFXYq7FXYq1XFXxt/wA5Pf8AOaemeRVuvI/5T3MOqecyJINR1taS2mmMKqVjqCss4PbeOP8Aa5N8GBhd8uTxP/nGf/nEvzD+cOqxfmn+b31lPJt3Kb+OG5dhfa3K78i7sTzSBju0h+OUf3Xwt6ilk/S6wsbPTLK307TreO00+0jSC1tYEEcUUMShUREUAKqgAADFKIxV2KuxV2KuxV2KuxV2KuxV2Kv/0vf2KuxV2KuxV2KuxV2KuxV2KuxV2KrXjjlRo5FDo4KujCqlTsQQexxV8Mf85Kf84Mwa1JeeefyUto7PVWPq3/k5OEFrMaEtJZMSFic7fuDSM/sMmyMq8y/IT/nM/wA4flVdJ5B/OG3vNW8t2Ti0+sXCsNZ0sqwUrIstGlRP99vSRP2WOyYGIFcn6L+TvOnlfz9odv5l8n6rb6xod0KxXVs4YBqAlHXZkda/EjgMvcYUg2n+KXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqx/zj518r+QNDuPMvnDVbfR9DtR+9urluILEEhEXdndqfCiAs3YYoJAfnT+ff/OZ/nD81rp/IH5P215pPlu9c2n1iBWbWdULMVCxrFVokf/faVkf9phumBBF83pv/ADjX/wA4MwaJJZ+efzqto7zVUPq2Hk5+E9rCaApJesCVlcb/ALgVjH7bP9hSyfc6RxxIscahI0AVEUUUKNgAB2GKrsVdirsVdirsVdirsVdirsVdirsVf//T9/Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FWiKimKvEvz2/5xf8Ay9/PS0e81SI6R51iiEdl5mslHrjgCES4jNFniBPRuMgG0ciYq+Ade8jf85F/84b+Zn1/SriaDRHkWMa7p4a50W9Qn4I7qN1ojHpwlVWrX0nb7eNMSLfVX5Mf857eQ/OCQaN+Z8K+UPMJ4oNQUtJpM7HvzoWgJPaSqD/fuBFkc31zZX9lqVpDf6dcRXlhcKJLe6t3WWKRD0ZXUkEHxGFkDfJEg1FcUuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuJoK4qhr2/stNtJr/AFG4is7G3UyT3Vw6xRRoOrM7EAAeJxQTXN8i/nP/AM57eQ/J6T6N+WEK+bvMI5IdRYtHpMDDvz2acg9o6If9+4GNk8nytoPkb/nIv/nMjzKmv6rcTT6IkjRnXdRDW2iWSA/HHaxotGYdOESs1aeq6/bw0yAp9/fkT/zi/wDl7+Rdol5pcR1fzrLEY73zNeKPXPMAOlvGKrBESOi8pCNpJHxS9tAoKYq3irsVdirsVdirsVdirsVdirsVdirsVf/U9/Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FUPe2FlqVpNYajbRXdjcqY7i1uEWWGRG2KujgqwPgRir5G/OH/nAP8vvOBn1f8tLn/BuvPVzp5Vp9Hmc709OvOCp7xlkX9mHFXyhcW/8AzlJ/ziJqVQ99pOhmX4ZYyNR8vXRr7ho1ZvBhFN8sDExF2+hfy1/5+M6JdiGx/NTy7Jps5IV9Y0Um4tug+J7eQ+ov+xaT5Yd13D6u8j/nR+Vv5jwLL5N816fqcpALWgmEV0vKmzQS8JB9oD7PXBaOIM8GFm3XFXYq7FXYq7FXYq7FXYq0cVYH54/Oj8rfy4gaXzl5r0/TJQCVtDMJbpuNdlgi5yHdSPs9cFsOIPlH8yv+fjOiWgmsfyr8uyalMCVTWNZJt7bv8SW8Z9Rv9m0fyx3TufJ89QW//OUn/OXmpVL32raGsu8shGneXrU136BY2ZfBRLNTxxURF2+r/wAnv+cA/wAvvJ5g1f8AMu5/xlrqUcaeFaDR4XG9PTrznoe8hVG/ahwsn1zZWFlptpDYadbRWljbKI7e1t0WKGNF2CoiAKoHgBiqIxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kv/9X39irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVUrm2gu4HtrmJJreQcZIpVDow8CrAgjFXzx+Y/wDzhP8Akd5/W5u7LSm8p67OS4v9Db0Yg5JJLWrVhINdwqof8oYq+XPOf/PvD8zPL0M+peRvMFl5ilglVrS0IbTbwxgFuQZ3aMOpAA+P4uu3TFDGP0l/zm3+Q4WO4PmBdJsiRwmVdc0/0rZPWf4v34WJVYlmVlXrv8OCgx4Qyby7/wA/FPzS0pIYfNnlrStZ4oeUsfrafPIX+JHNPUSlOyooYYrUuheo6D/z8i8kXDW0XmXyZqdgHFLuexngvFRqb8Ef0Swr4kY7p9TOtI/5z9/IC/dlv7jVdJAXkHubB5VJr9kfVzKa/MU98KAT1CbJ/wA50f8AOODiv+Irob0o2nXYP/JvI2jjPcXP/wA50f8AOOCCv+Iro70ounXZP/JvG14z3FKdX/5z9/ICwdVsLjVdWDLyL21g8Sqa/ZP1gxGvyFPfJJJPQMF1/wD5+ReR7ZrmPyz5N1O/4j/RJ76eCzR2p1dU9YqK+BODdO7y7zF/z8U/NLVUmh8p+WtK0blH8MknrahPGU+J3FfTSlB0ZGCjFFS6ljP6S/5zb/PgNHAfMDaRekDhCq6Hp/pXKCdPi/cBomVQUZmZem/xY0vCGT+TP+feH5meYYYNS88+YLLy7LPKzXdoA2pXgjIDciyOsZdiSD8fw9fi6YWXufUf5cf84T/kf5AFtd3ulN5s12Ahzf643rRcwQQVtVpCAKbB1c/5RxV9D21tBaQJbW0SQ28Y4xxRKERR4BVAAGKVXFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq/wD/1vf2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVogHFWmjRlKMOSMKMp3BB2IIxVi3mb8svy885RzR+afK+mar9YEKTyXVrE8rpatyiUycefFD0WtO3Q4ooPK/MH/OGH/OO2vPqcx8pjTbzUlUC4024ntRbMopyt4VcwoT3HplT/LitMA13/n3h+TuoWdtb6FqusaPdwtWe7aaO8My0IAKOiqprQ1X7sUG+jG2/59r+TCfg896oB4G0tyf+JDFIcv8Az7X8mA/H571QjwFpbg/8SOKlkmhf8+8PydsLK5t9d1XWNYu5mrBdrNHZmFaAUCIjKxrU1b7sUAHqWf8Al/8A5ww/5x30F9MmHlQaneaarA3GpXE90LlmFOVxCziFyOw9MKP5cVp6p5Z/LL8vPJscMflbyvpmlfVxMkElraxJKiXTcpVEnHnxc9VrTt0GKaDKVRFUIg4ooAVV2AA2AAxS2ABireKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV//1/f2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV//9D39irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf//Z" } */ ] } // jsonData.SlipCheck.push() var stringlength = 32; var lineh = ""; for (var i = 0; i < stringlength; i++) { lineh = lineh + "-"; } try { if (thisbasket["printer"]["logo"] != "") { jsonData.SlipCheck.push({ type: "image", image: thisbasket["printer"]["logo"] }); } } catch (err) {} try { if (thisbasket["printer"]["header"] != "" && thisbasket["printer"]["header"] != undefined) { jsonData.SlipCheck.push({ type: "text", text: app.print.modules.escposcenter(stringlength, thisbasket["printer"]["header"]) }); } } catch (err) {} try { if (thisbasket["info"]["id"] != "" && thisbasket["info"]["id"] != undefined) { jsonData.SlipCheck.push({ type: "text", text: " " }); jsonData.SlipCheck.push({ type: "text", text: app.print.modules.escposcenter(stringlength, lang["Zakaz_№"] + " " + thisbasket["info"]["id"]), }); } } catch (err) {} try { if (thisbasket["info"]["desktop"] != "" && thisbasket["info"]["desktop"] != undefined) { jsonData.SlipCheck.push({ type: "text", text: app.print.modules.escposcenter(stringlength, lang["desk"] + " " + thisbasket["info"]["desktopname"]), }); } } catch (err) {} try { if (thisbasket["info"]["date"] != "" && thisbasket["info"]["time"]) { jsonData.SlipCheck.push({ type: "text", text: app.print.modules.escposcenter(stringlength, thisbasket["info"]["date"] + " " + thisbasket["info"]["time"]) }); } } catch (err) {} jsonData.SlipCheck.push({ type: "text", text: app.print.modules.escposcenter(stringlength, "Счёт на оплату"), }) jsonData.SlipCheck.push({ type: "text", text: lineh }) var fiscalarr = $.map(thisbasket["products"], function(value, index) { return [value]; }); fiscalarr.forEach(function(item, i) { //Собираем нужный массив jsonData.SlipCheck.push({ type: "text", text: fiscalarr[i]["name"] }) jsonData.SlipCheck.push({ type: "text", text: app.print.modules.escposright(stringlength, CurrencyFormatted(fiscalarr[i]["kolvo"], 3) + " * " + CurrencyFormatted(fiscalarr[i]["cenaout"]) + " =" + CurrencyFormatted(fiscalarr[i]["cenaout"] * fiscalarr[i]["kolvo"])) }) }); jsonData.SlipCheck.push({ type: "text", text: lineh }) if (thisbasket["info"]["discount"] > 0 && preload["discount"][currentsklad][thisbasket["info"]["discount"]]["type"] == "discount") { //Со скидкой jsonData.SlipCheck.push({ type: "text", text: app.print.modules.escposstr(2, stringlength, "СКИДКА:", CurrencyFormatted(thisbasket["info"]["cashdiscount"])) }) } jsonData.SlipCheck.push({ type: "text", text: app.print.modules.escposstr(2, stringlength, "ИТОГ:", CurrencyFormatted(thisbasket["info"]["allcena"])) }) jsonData.SlipCheck.push({ type: "text", text: lineh }) try { if (thisbasket.info["type"] == "delivery") { /*Адрес на пречек*/ if (thisbasket.info.client > 0) { jsonData.SlipCheck.push({ type: "text", text: app.print.modules.escposcenter(stringlength, "Информация о доставке") }) var thisclient = preload["clients"][thisbasket.info.client]; if (thisclient.name != "") { jsonData.SlipCheck.push({ type: "text", text: lang["FIO"] + ": " + thisclient.name }) } if (thisclient.phone != "") { jsonData.SlipCheck.push({ type: "text", text: lang["telefon"] + ": " + thisclient.phone }) } if (thisbasket["info"]["adress"] != "") { jsonData.SlipCheck.push({ type: "text", text: lang["adres"] + ": " + thisbasket["info"]["adress"] }) } if (thisbasket["info"]["comment"] != "") { jsonData.SlipCheck.push({ type: "text", text: "Комментарий: " + thisbasket["info"]["comment"] }) } jsonData.SlipCheck.push({ type: "text", text: lineh }) } } } catch (err) {} jsonData.SlipCheck.push({ type: "text", text: app.print.modules.escposcenter(stringlength, "НЕ ФИСКАЛЬНЫЙ") }) //Вызов return new Promise(function(resolve, reject) { try { Android.evotorkkm(JSON.stringify(jsonData)); } catch (err) { console.log("На эвотор отправлено", jsonData) } resolve({ status: "done" }); }); }, XReport: function() { var jsonData = { IsFiscalCheck: true, Command: "XReport", IdCommand: app.print.modules.guid() } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.evotorkkm.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, ZReport: function() { var jsonData = { IsFiscalCheck: true, Command: "CloseShift", IdCommand: app.print.modules.guid() } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.evotorkkm.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, introduction: function() { var jsonData = { IsFiscalCheck: true, Command: "Introduction", IdCommand: app.print.modules.guid() } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.evotorkkm.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, incasation: function() { var jsonData = { IsFiscalCheck: true, Command: "Incasation", IdCommand: app.print.modules.guid() } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.evotorkkm.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, rashod: function() { var jsonData = { IsFiscalCheck: true, Command: "Rashod", IdCommand: app.print.modules.guid() } //Вызов return new Promise(function(resolve, reject) { app.print.protocols.evotorkkm.ExecuteCommand(jsonData).then(function(success) { resolve(success); }, function(error) { reject(error); }) }); }, ExecuteCommand: function(data) { console.log(JSON.stringify(data)); return new Promise(function(resolve, reject) { /*ТЕСТ*/ // resolve({ // status: "done", // data:"" // }); try { Android.evotorkkm(JSON.stringify(data)); returnEvotor.status = "empty"; try { clearInterval(waitingEvotor); } catch (err) {} var waitingEvotor = setInterval(function() { console.log("Опрашиваем Evotor") if (returnEvotor.status == "done") { clearInterval(waitingEvotor); if (returnEvotor.type == "sell") { try { var newsumm = 0; var updataData = data.thisbasket["products"]; updataData.forEach(function(item) { if (returnEvotor["printDocuments"]["0"]["discounts"][item["uuid"]]) { var curcena = item.cenaout; try { item.cenaout = round(curcena - returnEvotor["printDocuments"]["0"]["discounts"][item["uuid"]]); } catch (err) {} } newsumm = newsumm + (item.cenaout * item.kolvo); }) switch (returnEvotor["paymentType"]) { case "CASH": //Оплачено наличными data.thisbasket["info"]["cash"] = newsumm; data.thisbasket["info"]["nall"] = returnEvotor["cash"]; break; case "ELECTRON": //Оплачено по безналу data.thisbasket["info"]["visa"] = newsumm; break; case "UNKNOWN": //Не понятно как оплачено data.thisbasket["info"]["cash"] = newsumm; data.thisbasket["info"]["nall"] = newsumm; data.thisbasket["info"]["visa"] = 0; break; default: //Иной способ оплаты которого не было до 2018-09-04 data.thisbasket["info"]["cash"] = newsumm; data.thisbasket["info"]["nall"] = newsumm; data.thisbasket["info"]["visa"] = 0; } data.thisbasket["info"]["summ"] = newsumm; } catch (err) { alert("Не удалось обработать ответ Эвотор"); } } //Обрабатываем ответ от эвотор resolve({ status: "done", data: returnEvotor }); } }, 500); } catch (err) { console.log("Устройство Эвотор не найдено"); reject({ status: "error" }); } }); }, ReturnCommand: function(jsondata) { returnEvotor = JSON.parse(jsondata) returnEvotor.status = "done"; }, } }, generate: function(obj) { // alert(JSON.stringify(obj)); obj.header = obj.header.replace(/\n/g,'
'); obj.footer = obj.footer.replace(/\n/g,'
'); var goods = obj.products; for (var ig = 0; ig < goods.length; ig++) { goods[ig]["css"] = {}; var left = (obj.width / 100) * 60; var right = (obj.width / 100) * 40; goods[ig]["count"] = ig + 1; switch (obj.tr) { case 1: goods[ig]["css"]["fullnamediv"] = "style='float:left; width:" + left + "px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;'" goods[ig]["css"]["namediv"] = "style='display:none;'" goods[ig]["css"]["infodiv"] = "style='font-size:1em; float:right; width:" + right + "px; white-space: nowrap; text-align:right;'"; break; case 2: goods[ig]["css"]["namediv"] = "style='display:none;'" goods[ig]["css"]["infodiv"] = "style='font-size:1em; float:right; width:" + right + "px; white-space: nowrap; text-align:right;'"; break; default: goods[ig]["css"]["namediv"] = "style='float:left; width:" + left + "px;'" goods[ig]["css"]["textarea"] = "style='width:100%; border:0; height:20px; overflow:hidden; font-size:1em; font-weight:500; font-family:Tahoma; white-space: nowrap; resize: none;'" goods[ig]["css"]["fullnamediv"] = "style='display:none;'" goods[ig]["css"]["infodiv"] = "style='font-size:1em; float:right; width:" + right + "px; white-space: nowrap; text-align:right;'"; } var bonustext = ""; try{ if(goods[ig]["bonus"] != '' && goods[ig]["bonus"] != 0 && goods[ig]["bonus"] != undefined){ bonustext = " ("+lang["Bonus"]+")"; } }catch(err){ } var modstext = ""; try{ if(goods[ig]["modstitle"] != '' && goods[ig]["modstitle"] != 0 && goods[ig]["modstitle"] != undefined){ modstext = " ("+goods[ig]["modstitle"]+" )"; } }catch(err){ } var summ = goods[ig]["kolvo"] * goods[ig]["cenaout"]; goods[ig]["summ"] = summ.toFixed(2); goods[ig]["title"] = goods[ig]["name"]+bonustext+modstext; goods[ig]["info"] = goods[ig]["kolvo"] + " x " + goods[ig]["cenaout"] + "" + obj.currency; goods[ig]["cenaout"] = goods[ig]["cenaout"] + "" + obj.currency; switch(obj.os){ case "windows": switch(obj.protocol){ case "electron_windowssystem_printer": if(obj.width < 181){ goods[ig]["css"]["td5"] = "style='display:none'"; }else{ goods[ig]["css"]["td5"] = " style='text-align: right !important;' "; } default: if(obj.width < 261){ goods[ig]["css"]["td5"] = "style='display:none'"; }else{ goods[ig]["css"]["td5"] = " style='text-align: right !important;' "; } } break; default: if(obj.width < 381){ goods[ig]["css"]["td5"] = "style='display:none'"; }else{ goods[ig]["css"]["td5"] = "style='text-align: right !important;'"; } } //Затычка которая убивает третюю колонку в отчете за смену if(obj["type"] == "report"){ goods[ig]["css"]["td5"] = "style='display:none'"; } } var feed = ""; for (var i = 0; i < obj.feed; i++) { feed = feed + "
"; } switch (obj.mode) { case "table": var string = "style='display:none;'" var table = "style='display:block;'" break; default: var string = "style='display:block;'" var table = "style='display:none;'" } if (obj.logo == "") { var logocss = "style='display:none;'"; } else { var logocss = "style='text-align:center; margin: 0 auto;'"; } if (obj.order == "") { var ordercss = "style='display:none;'"; } else { var ordercss = "style='text-align:center; '"; } if (obj.header == "") { var headercss = "style='display:none;'"; } else { var headercss = "style='text-align:center; '"; } if (obj.footer == "") { var footercss = "style='display:none;'"; } else { var footercss = "style='text-align:center; '"; } if (obj.desk == "" ) { var deskcss = "style='display:none;'"; } else { var deskcss = "style='text-align:center; '"; } if (obj.desk == undefined) { var deskcss = "style='display:none;'"; } else { var deskcss = "style='text-align:center; '"; } if (obj.datetime == "") { var datetimecss = "style='display:none;'"; } else { var datetimecss = "style='text-align:center;'"; } waitercss = obj.waiter != null && obj.waiter != '' && obj.waiter != undefined ? 'style="text-align:center;"' : 'style="display:none;"'; switch(obj.os){ case "windows": var hr = ""; var liniya = "style='display:none;'"; break; default: var hr = "style='display:none;'"; var liniya = "style='background:black; width:100%; height:1px; margin-top:5px; margin-bottom:5px;'"; } var padding = "" if(obj.padding){ padding = "padding:"+obj.padding+"px;"; } var headblockbox = []; if (obj.info.servicecash > 0){ headblockbox.push({ title: lang["Obslughivanie"], info: obj.info.servicecash, style: "style='font-size:1em; font-weight:500;'" }) } if (obj.info.discount != "" && obj.info.discount > 0){ if(obj.info.discount != undefined){ if(obj.info.cashdiscount > 0){ var dstring = CurrencyFormatted(obj.info.cashdiscount); }else{ var dstring = obj.info.discounttitle; } headblockbox.push({ title: lang["discount"], info: dstring, style: "style='font-size:1em; font-weight:bold;'" }) } } if(obj.info.allcena != ""){ obj.info.allcena = round(obj.info.allcena) headblockbox.push({ title: lang["Vsego"], info: CurrencyFormatted(obj.info.allcena), style: "style='font-size:1.5em; font-weight:bold;'" }) } if (obj.info.visa != ""){ obj.info.visa = round(obj.info.visa) headblockbox.push({ title: lang["beznal"], info: CurrencyFormatted(obj.info.visa), style: "style='font-size:1em; font-weight:500;'" }) } if (obj.info.nall != ""){ obj.info.nall = round(obj.info.nall) headblockbox.push({ title: lang["cash"], info: CurrencyFormatted(obj.info.nall), style: "style='font-size:1em; font-weight:500;'" }) } if (obj.info.sdacha > 0){ obj.info.sdacha = round(obj.info.sdacha) headblockbox.push({ title: lang["change"], info: CurrencyFormatted(obj.info.sdacha), style: "style='font-size:1em; font-weight:500;'" }) } /*Эта штука заменяет нижний кронтитул на отчет о смене*/ try{ if(obj.info["type"] == "report"){ var objs = obj.info.report; headblockbox = []; if(objs.length > 0){ for (var di = 0; di < objs.length; di++) { headblockbox.push({ title: objs[di]["name"], info: objs[di]["cenaout"], style: "style='font-size:1em; font-weight:500;'" }) } } } }catch(err){ } console.log("тут надо глянуть по чеку", obj) try{ if(obj.info["type"] == "begunok" || obj.info["checkcomments"] == 1){ if(obj.info["type"] == "begunok"){ headblockbox = []; } /*Комментарий на бегунок или на чек если это установлено*/ if (obj.info.comment != ""){ obj.footer = obj.info.comment+"
"+obj.footer; var footercss = "style='padding:5px; '"; } } }catch(err){ } /*Блок с адресом для доставки*/ var clientinfocss = "style='display:none;'"; obj.clientinfo = []; try{ if(obj.info["type"] == "delivery"){ /*Адрес на пречек*/ if (obj.info.client > 0){ var thisclient = preload["clients"][obj.info.client]; if(thisclient.name != ""){ obj.clientinfo.push({clientheader: lang["FIO"]+":",clientinfo:thisclient.name}); } if(thisclient.phone != ""){ obj.clientinfo.push({clientheader: lang["telefon"]+":",clientinfo:thisclient.phone}); } if(obj.info.adress != ""){ obj.clientinfo.push({clientheader: lang["adres"]+":",clientinfo:obj.info.adress}); } clientinfocss = "style='text-align:left; padding-left:5px; padding-right:5px;'"; } } }catch(err){ } console.log("os",obj.os); console.log("width",obj.width); switch(obj.os){ case "windows": if(obj.width < 261){ var tablep = { td1:"style='width:10%;'", td2:"style='width:50%;'", td3:"style='width:10%;'", td4:"style='width:30%;'", td5:"style='display:none;'" }; }else{ var tablep = { td1:"style='width:10%;'", td2:"style='width:40%;'", td3:"style='width:10%;'", td4:"style='width:20%;'", td5:"style='width:20%;'" }; } break; default: if(obj.width < 381){ var tablep = { td1:"style='width:10%;'", td2:"style='width:50%;'", td3:"style='width:10%;'", td4:"style='width:30%;'", td5:"style='display:none;'" }; }else{ var tablep = { td1:"style='width:10%;'", td2:"style='width:40%;'", td3:"style='width:10%;'", td4:"style='width:20%;'", td5:"style='width:20%;'" }; } } //Затычка которая убивает третюю колонку в отчете за смену if(obj["type"] == "report"){ if(tablep.td5 != "style='display:none;'"){ tablep.td4 = "style='width:40%;'"; //Не уверен что это правильно, но узнаем 2018.09.10 tablep.td5 = "style='display:none;'"; } } if(obj["type"] == "begunok"){ $("#begunokprintcomment").show(); }else{ $("#begunokprintcomment").hide(); } //jPut["checkmodule"].data var data = [{ css: { bodywidth: "style='width:" + (obj.width - obj.margin.right) + "px; background:white; padding-left:"+obj.margin.left+"px; font-size:" + obj.font + ";'", body: "style='box-shadow: 0 1px 3px rgba(0,0,0,0.3), 0 1px 2px rgba(0,0,0,0.24); "+ padding +" width:" + obj.width - obj.margin.right + "px; margin-top:" + obj.margin.top + "px; margin-left:" + obj.margin.left + "px; background:white; font-size:" + obj.font + ";'", tablewidth: "style='width:"+obj.width - obj.margin.right+"px; table-layout: fixed;'", hr: hr, liniya: liniya, string: string, table: table, tablep:tablep, footer: footercss, clientinfo: clientinfocss, hallscreen: obj.info.hallscreen_id != null && obj.info.hallscreen_id != '' && obj.info.hallscreen_id != undefined ? 'style="font-size:8em;"' : 'style="display:none;"' }, type:obj["type"], footer: obj.footer, footerinfo: obj.footerinfo, desk: obj.desk, datetime: obj.datetime, clientinfo: obj.clientinfo, hallscreen_id: obj.info.hallscreen_id, products: obj.products, productst: obj.products, headblock: [ { info: "", style: logocss }, { info: obj.header, style: headercss }, { info: lang["Zakaz_№"]+" "+obj.order, style: ordercss }, { info: lang["desk"]+" "+ obj.desk, style: deskcss }, { info: obj.datetime, style: datetimecss }, { info:lang["sotrudnik"]+": "+obj.waiter, style: waitercss } ], cashblock: headblockbox, // cashblock: [{ // title: lang["Obslughivanie"], // info: "25" + obj.currency, // style: "style='font-size:1em; font-weight:500;'" // }, // { // title: lang["discount"], // info: "10" + obj.currency, // style: "style='font-size:1em; font-weight:bold;'" // }, // { // title: lang["Vsego"], // info: "888" + obj.currency, // style: "style='font-size:1.5em; font-weight:bold;'" // }, // { // title: lang["cash"], // info: "888" + obj.currency, // style: "style='font-size:1em; font-weight:500;'" // }, // { // title: lang["change"], // info: "888" + obj.currency, // style: "style='font-size:1em; font-weight:500;'" // }, // ], feed: feed, lang: { Obslughivanie: lang["Obslughivanie"], total: lang["Vsego"], nalichnie: lang["cash"], change: lang["change"], naimenovanie: lang["naimenovanie"], kolvo: lang["kolvo"], cena: lang["tsena"], summa: lang["summa"], price: lang["tsena"] } }]; if(obj.info["type"] == "report"){ data[0].lang.price = lang["summa"]; }else{ data[0].lang.price = lang["tsena"]; } //Вставляем в нужный div $('#'+obj.div).iPut({ jsonData: data, name: 'checkmodule' }); }, }, hallscreen:{ send: function(thisbasket){ return new Promise(function(resolve, reject){ app.main.loader("show"); try{ if(currentsklad == hallscreen.sklad){ if(hallscreen.settings.hallScreenParams.hall == "0" || hallscreen.settings.hallScreenParams.hall == currentzal.toString()){ var url = hallscreen.ip; var data = { "command":"add_order", "data": { "order_id":"'"+thisbasket["info"]["id"]+"'", "time":thisbasket["info"]["time"], "date":thisbasket["info"]["date"], "status":"cooking" } }; console.warn("Данные на отправку",data); try{ try { try{ //Попытка вызвать на андроид var jsonData = { "requestMethod": "POST", "Headers": [{ "key": "Content-Type", "value": "application/x-www-form-urlencoded" }], "url": "http://"+url+":3383", "data": JSON.stringify(data) //POST data } var req = Android.httpsender2(JSON.stringify(jsonData)); var result = JSON.parse(JSON.parse(req)["response"]); if(result.status == "done"){ resolve(result.data); }else{ reject(); } }catch(err){ try{ //Попытка вызвать на приложении винды try { var httpSenderData = { requestMethod: "POST", url: "http://"+url+":3383", data: JSON.stringify(data) } console.warn("httpSenderData",httpSenderData); var request = { method: "http_sender", data:JSON.stringify(httpSenderData) }; console.warn("request",request); window.cefQuery({request: JSON.stringify(request), persistent: true, onSuccess: function(response) { console.warn("response",response); var result = JSON.parse(JSON.parse(response)["response"]); resolve(result.data); }, onFailure: function(error_code, error_message) { reject(); } }); } catch(e) { app.main.getjson("http://"+url+":3383",JSON.stringify(data)).then(function(result){ if(result.status == "done"){ resolve(result.data); }else{ reject(); } }).catch(function(){ reject(); }) } }catch(err){ } } } catch (err) { } }catch(err){ } }else{ //Если не тот зал reject(); } } }catch(err){ reject(); } }) } }, banking:{ modules:{ status: function(e){ $("#bankingstatus").html(e); $("#bankingterminalconnectingsbox").show(); }, }, protocols: { android_privatreader_sdk:{ sendpayment: function(device) { var thisbasket = app.terminal.getbasket(); try { var visasum = $("#payvisa").val(); var cashsum = $("#paycash").val(); var jsonData = { products: [{ name: "Товар", quantity: 1, price: round(visasum, 2), }], protocol: "minipos_privat", //mosst_sdk | mosst_apk | ingenico_ua | minipos_privat mPosPrivat: { command: "cardPayment", //authorization //loguot //setLanguage //cardPayment - Оплата //cardRefund - Возврат //login: device.user, //pass: device.pass, //language: "rus", //eng }, cashless: round(visasum, 2), cash: round(cashsum, 2), sum: round(thisbasket["info"]["allcena"], 2), } var json = JSON.stringify(jsonData); console.log("На мосст", json); //Android.mosst(json); Android.bankingPayment(json) returnMosst = {}; returnMosst.status = "empty"; try { clearInterval(waitingMosst); } catch (err) {} var waitingMosst = setInterval(function() { console.log("Опрашиваем Mosst"); if (returnMosst.status == "done") { clearInterval(waitingMosst); returnMosst.status = "empty"; try{ returnMosst.terminalId = device.id; }catch(err){ } // alert(json); //app.banking.protocols.android_mosstreader_run_app.success(); var thisbasket = app.terminal.getbasket(); thisbasket["info"]["mosst"] = JSON.stringify(returnMosst); app.terminal.paynow(thisbasket); } }, 1000); } catch (err) { console.warn(lang["Eto_ne_Android_poetomu_ne_vyzyvaem_terminal_mosst"]); //app.terminal.paynow(thisbasket); } }, success: function(json) { try{ returnMosst = JSON.parse(json); console.log(returnMosst); $("#bankingterminalconnectingsbox").hide(); try{ var reciptHtml = app.main.Base64.decode(returnMosst["receipt"]); //html чека }catch(err){ } // $("body").append(app.main.Base64.decode(returnMosst.transaction)); }catch(err){ } returnMosst.status = "done"; }, error: function(json) { $("#bankingterminalconnectingsbox").hide(); app.main.error(json); }, receipt:function(html) { returnMosst.receipt = html; }, returnsale: function(data) { return new Promise(function(resolve, reject) { var device = data["device"]; console.log(device); try { try { var jsonData = { protocol: "minipos_privat", //mosst_sdk | mosst_apk | ingenico_ua | minipos_privat mPosPrivat: { command: "cardRefund", //authorization //loguot //setLanguage //cardPayment - Оплата //cardRefund - Возврат refundData:data.mosst.refundData /* refundData: { "id":"PAX5e60e999a1324", "sn":"917093788" } */ } } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Не достаточно данных, ошибка 3721"); reject(); } var json = JSON.stringify(jsonData); console.log("На мосст mosst_card_refund", json); Android.bankingPayment(json); returnMosst.status = "empty"; try { clearInterval(waitingMosst); } catch (err) {} var waitingMosst = setInterval(function() { console.log("Опрашиваем Mosst"); if (returnMosst.status == "done") { clearInterval(waitingMosst); $("#bankingterminalsbox").hide(); resolve(returnMosst); } }, 500); } catch (err) {} }); }, }, banking_emulator:{ sendpayment: function(device) { var thisbasket = app.terminal.getbasket(); try{ thisbasket["info"]["mosst"] = JSON.stringify({ terminalId:device.id }); }catch(err){ } app.terminal.paynow(thisbasket); }, success: function(json) { }, error: function(json) { }, returnsale: function(data) { return new Promise(function(resolve, reject) { resolve(); }); }, }, android_mosstreader_run_app: { sendpayment: function(device) { var thisbasket = app.terminal.getbasket(); try { var visasum = $("#payvisa").val(); var cashsum = $("#paycash").val(); var jsonData = { products: [{ name: "Товар", quantity: 1, price: round(visasum, 2), }], protocol: "mosst_apk", // mosst_apk | ingenico_ua mosst: { command: "cardPayment", //authorization //loguot //setLanguage //cardPayment - Оплата //cardRefund - Возврат login: device.user, pass: device.pass, language: "rus", //eng }, cashless: round(visasum, 2), cash: round(cashsum, 2), sum: round(thisbasket["info"]["allcena"], 2), } var json = JSON.stringify(jsonData); console.log("На мосст", json); //Android.mosst(json); Android.bankingPayment(json) returnMosst = {}; returnMosst.status = "empty"; try { clearInterval(waitingMosst); } catch (err) {} var waitingMosst = setInterval(function() { console.log("Опрашиваем Mosst"); if (returnMosst.status == "done") { clearInterval(waitingMosst); returnMosst.status = "empty"; try{ returnMosst.terminalId = device.id; }catch(err){ } // alert(json); //app.banking.protocols.android_mosstreader_run_app.success(); var thisbasket = app.terminal.getbasket(); thisbasket["info"]["mosst"] = JSON.stringify(returnMosst); app.terminal.paynow(thisbasket); } }, 1000); } catch (err) { console.warn(lang["Eto_ne_Android_poetomu_ne_vyzyvaem_terminal_mosst"]); //app.terminal.paynow(thisbasket); } }, success: function(json) { try{ returnMosst = JSON.parse(json); }catch(err){ } returnMosst.status = "done"; }, error: function(json) {}, returnsale: function(data) { return new Promise(function(resolve, reject) { var device = data["device"]; console.log(device); try { try { var jsonData = { protocol: "mosst_apk", // mosst_apk | ingenico_ua mosst: { command: "cardRefund", //authorization //loguot //setLanguage //cardPayment - Оплата //cardRefund - Возврат login: device.user, pass: device.pass, language: "rus", //eng refundDataApk: data["mosst"] } } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Не достаточно данных, ошибка 3721"); reject(); } var json = JSON.stringify(jsonData); console.log("На мосст mosst_card_refund", json); Android.bankingPayment(json); returnMosst.status = "empty"; try { clearInterval(waitingMosst); } catch (err) {} var waitingMosst = setInterval(function() { console.log("Опрашиваем Mosst"); if (returnMosst.status == "done") { clearInterval(waitingMosst); $("#bankingterminalsbox").hide(); resolve(returnMosst); } }, 500); } catch (err) {} }); }, }, android_mosstreader_sdk: { sendpayment: function(device) { var thisbasket = app.terminal.getbasket(); try { try { var visasum = $("#payvisa").val(); var cashsum = $("#paycash").val(); var jsonData = { products: [{ name: "Товар", quantity: 1, price: round(visasum, 2), }], protocol: "mosst_sdk", // mosst_apk | ingenico_ua mosst: { command: "cardPayment", //authorization //loguot //setLanguage //cardPayment - Оплата //cardRefund - Возврат login: device.user, pass: device.pass, language: "rus", //eng }, cashless: round(visasum, 2), cash: round(cashsum, 2), sum: round(thisbasket["info"]["allcena"], 2), } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Не достаточно данных, ошибка 3721"); } var json = JSON.stringify(jsonData); console.log("На мосст", json); Android.bankingPayment(json); returnMosst = {}; returnMosst.status = "empty"; try { clearInterval(waitingMosst); } catch (err) {} var waitingMosst = setInterval(function() { console.log("Опрашиваем Mosst"); if (returnMosst.status == "done") { clearInterval(waitingMosst); // alert(json); //app.banking.protocols.android_mosstreader_run_app.success(); var thisbasket = app.terminal.getbasket(); returnMosst.status = "empty"; try{ returnMosst.terminalId = device.id; }catch(err){ } thisbasket["info"]["mosst"] = JSON.stringify(returnMosst); app.terminal.paynow(thisbasket); } }, 500); } catch (err) { app.main.error(device.name + ": " + lang["Eto_ne_Android_poetomu_ne_vyzyvaem_terminal_mosst"]); // app.terminal.paynow(thisbasket); } }, success: function(json) { try{ returnMosst = JSON.parse(json); }catch(err){ } returnMosst.status = "done"; }, error: function(json) {}, returnsale: function(data) { return new Promise(function(resolve, reject) { var device = data["device"]; console.log(device); try { try { var jsonData = { protocol: "mosst_sdk", // mosst_apk | ingenico_ua mosst: { command: "cardRefund", //authorization //loguot //setLanguage //cardPayment - Оплата //cardRefund - Возврат login: device.user, pass: device.pass, language: "rus", //eng refundDataSdk: JSON.stringify(data["mosst"]) } } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Не достаточно данных, ошибка 3721"); reject(); } var json = JSON.stringify(jsonData); console.log("На мосст", json); Android.bankingPayment(json); returnMosst.status = "empty"; try { clearInterval(waitingMosst); } catch (err) {} var waitingMosst = setInterval(function() { console.log("Опрашиваем Mosst"); if (returnMosst.status == "done") { clearInterval(waitingMosst); $("#bankingterminalsbox").hide(); resolve(returnMosst); } }, 500); } catch (err) {} }); }, }, portmone_QR: { sendpayment: function(device) { console.log("portmone_QR -> sendpayment",device) var thisbasket = app.terminal.getbasket(); console.log("portmone_QR thisbasket",thisbasket) var bill_amount = thisbasket["info"]["allcena"]; //var bill_amount = thisbasket["info"]["visa"]; //Проблема в том что если чек закрывается не только за безнал то надо это понимать var payee_id = device.clientprint; var flag7 = true; if (payee_id == "") { //flag7 = false; //app.main.error(device.name + ": " + "Не заполнено поле 'ID компании (payee_id)'"); } if (bill_amount <= 0) { flag7 = false; app.main.error(device.name + ": " + "Сумма должна быть больше 0'"); } if (flag7) { portmoneQR = device.settings.bankingParams; var qrdata = { "method":"getLinkInvoice", "params": { "data":{ "login":device.settings.bankingParams.protmoneQrLogin, "password":device.settings.bankingParams.protmoneQrPassword, "payeeId":device.settings.bankingParams.protmoneQrPayeeId, "amount":bill_amount, //"emailRecipient":"intertelservice@gmail.com", //"comment":"test", "billCurrency":"UAH", "preauthFlag":"N" } }, "id": "1" } function getinvoice(){ app.main.loader("show"); app.main.getjson("/?section=db&db=portmone&action=getqr",JSON.stringify(qrdata)).then(function(jsonContent) { var json = jsonContent.data; console.log("QR", json); console.log("invoiseLINK",json.result.linkInvoice) var portmoneData = { sum:round(bill_amount,2), orderID:json.invoice_id, linkInvoice:json.result.linkInvoice }; thisbasket.info.portmone = portmoneData preload["desktop_settings"][currentsklad][currentzal][currentdesktop]["portmone"] = portmoneData; app.main.savetolocal(); $("#portmoneqrpay").show(); $("#portmoneQrPaySum").html(CurrencyFormatted(bill_amount)); $("#confirmQrPayment").attr("billid", json.invoice_id); //$("#confirmQrPayment").attr("location", json.location); $("#qrcode").html(""); var qrcode = new QRCode("qrcode"); qrcode.makeCode(json.result.linkInvoice); }).catch(function(error) { //Если нужно то и тут тоже можно отработать ошибку //console.error(error); //alert(error.name + ': ' + error.message); app.main.error("Error: 6432"); }) } try{ if(thisbasket.info.portmone.sum == round(bill_amount,2)){ $("#portmoneqrpay").show(); $("#portmoneQrPaySum").html(CurrencyFormatted(thisbasket.info.portmone.sum)); $("#confirmQrPayment").attr("billid", thisbasket.info.portmone.orderID); //$("#confirmQrPayment").attr("location", json.location); $("#qrcode").html(""); var qrcode = new QRCode("qrcode"); qrcode.makeCode(thisbasket.info.portmone.linkInvoice); }else{ getinvoice(); } }catch(err){ getinvoice(); } } }, status: function(id, url) { var thisbasket = app.terminal.getbasket(); var receiptdata = { "method":"result", "params": { "data": { "login":portmoneQR.protmoneQrLogin, "password":portmoneQR.protmoneQrPassword, "payeeId":portmoneQR.protmoneQrPayeeId, "shopOrderNumber":id, //"shopbillId": id, //"status":"", //"startDate":"30.03.2019", //"endDate":"31.03.2019" } }, "id":"1" }; app.main.loader("show"); app.main.getjson("/?section=db&db=portmone&action=result",JSON.stringify(receiptdata)).then(function(json) { console.log("QR check", json); var flag = false; for(var key in json.data){ var trans = json.data[key]; if(trans.status == "PAYED"){ if(trans.billAmount == thisbasket.info.portmone.sum){ flag = true; app.banking.protocols.portmone_QR.success(json); }else{ app.main.error("Сума платежу не спiвпадає"); //app.main.error("Не оплачен"); } } } if(flag == false){ app.main.error("Не сплачено"); } }); }, success: function(json) { $("#portmoneqrpay").hide(); var thisbasket = app.terminal.getbasket(); app.terminal.paynow(thisbasket); }, error: function(json) { app.main.error(lang["Ne_udalosy_prinyaty_oplatu_po_beznalu"]); }, returnsale: function(data) { return new Promise(function(resolve, reject) { resolve(); }); } }, android_ingenico_bpos_sdk_ua: { sendpayment: function(device) { var merchId = 0; try{ var merchval = device["settings"]["bankingParams"]["merchId"]; if(merchval > 0){ merchId = merchval; } }catch(err){ } console.log("ingeniko merchId",merchId) var thisbasket = app.terminal.getbasket(); var visasum = $("#payvisa").val(); var cashsum = $("#paycash").val(); try { try { var jsonData = { products: [{ name: "Товар", quantity: 1, price: round(visasum, 2), }], protocol: "ingenico_ua", // mosst_apk | ingenico_ua ingenico: { command: "cardPayment", merchId: merchId }, cashless: round(visasum, 2), cash: round(cashsum, 2), sum: round(thisbasket["info"]["allcena"], 2), } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Error 3722"); } var json = JSON.stringify(jsonData); console.log("На ingenico", json); Android.bankingPayment(json); returnIngenico = {}; returnIngenico.status = "empty"; try { clearInterval(waitingIngenico); } catch (err) {} var waitingIngenico = setInterval(function() { console.log("Опрашиваем Ingenico"); if (returnIngenico.status == "done") { clearInterval(waitingIngenico); //app.banking.protocols.android_mosstreader_run_app.success(); var thisbasket = app.terminal.getbasket(); returnIngenico.status = "empty"; try{ returnIngenico.terminalId = device.id; }catch(err){ } thisbasket["info"]["bankingData"] = returnIngenico; thisbasket["info"]["mosst"] = JSON.stringify(returnIngenico); app.terminal.paynow(thisbasket); } }, 500); } catch (err) { console.error(err); app.main.error(device.name + ": Error 7743"); // app.terminal.paynow(thisbasket); } }, success: function(json) { try{ returnIngenico = JSON.parse(json); }catch(err){ //app.main.error("Error: 8291"); } $("#bankingterminalconnectingsbox").hide(); returnIngenico.status = "done"; }, error: function(errCode) { $("#bankingterminalconnectingsbox").hide(); ingenicoUErr["1"] = lang["Oshibka_otkryti_yny88"]; ingenicoUErr["2"] = lang["Neobhodimo_otkr_ytk4i"]; ingenicoUErr["3"] = lang["Oshibka_podklyu_7bhe3"]; ingenicoUErr["4"] = lang["Terminal_vozvra_4dt5y"]; ingenicoUErr["1000"] = lang["Obschaya_oshibk_dtefh"]; ingenicoUErr["1001"] = lang["Tranzakciya_otm_zi5di"]; ingenicoUErr["1002"] = lang["Snighenie_EMV"]; ingenicoUErr["1003"] = lang["Ghurnal_tranzak_h67f2"]; ingenicoUErr["1004"] = lang["Net_svyazi_s_ho_f453y"]; ingenicoUErr["1005"] = lang["Net_bumagi_v_ba_ni9hd"]; ingenicoUErr["1006"] = lang["Oshibka_kriptok_rsiyt"]; var errorText = ingenicoUErr[errCode]; if(!errorText){ errorText = errCode; } app.main.error("Ingenico: "+lang["Ne_udalosy_prinyaty_oplatu_po_beznalu"]+"
• "+errorText); }, status: function(statusCode){ var ingenicoUStatus = {}; ingenicoUStatus["0"] = lang["kod_statusa_ned_8d6ze"]; ingenicoUStatus["1"] = lang["Karta_prochitan_4fy7k"]; ingenicoUStatus["2"] = lang["Beskontaktnaya__52645"]; ingenicoUStatus["3"] = lang["avtorizatsija"]; ingenicoUStatus["4"] = lang["Oghidanie_polyz_rbaer"]; ingenicoUStatus["5"] = lang["Pechaty"]; ingenicoUStatus["6"] = lang["Vvedite_PIN"]; ingenicoUStatus["7"] = lang["Udalite_kartu"]; ingenicoUStatus["8"] = lang["vybor_EMV_multi_223k6"]; ingenicoUStatus["9"] = lang["Oghidaet_kartu"]; var statusText = ingenicoUStatus[statusCode]; if(!statusText){ statusText = statusCode; } app.banking.modules.status(statusText); //app.main.message("Ingenico:
• "+statusText); }, returnsale: function(data) { return new Promise(function(resolve, reject) { var device = data["device"]; console.log(device); try { try { var jsonData = { protocol: "ingenico_ua", // mosst_apk | ingenico_ua ingenico: { command: "cardRefund", //authorization //loguot //setLanguage //cardPayment - Оплата //cardRefund - Возврат refundData: data["mosst"] } } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Не достаточно данных, ошибка 3721"); } var json = JSON.stringify(jsonData); console.log("На ingenico", json); Android.bankingPayment(json); returnIngenico.status = "empty"; try { clearInterval(waitingIngenico); } catch (err) {} var waitingIngenico = setInterval(function() { console.log("Опрашиваем Ingenico"); if (returnIngenico.status == "done") { clearInterval(waitingIngenico); //alert("Возврат выполнен"); $("#bankingterminalsbox").hide(); resolve(returnIngenico); } }, 500); } catch (err) {} }); }, closeShift: function(){ try { var jsonData = { protocol: "ingenico_ua", // mosst_apk | ingenico_ua ingenico: { command: "closeShift", } } var json = JSON.stringify(jsonData); console.log("На ingenico", json); Android.bankingPayment(json); } catch (err) { app.main.error(device.name + ": " + "Error 3722-1"); } } }, android_ingenico_bpos_sdk_ua_tcpip: { sendpayment: function(device) { var merchId = 0; try{ var merchval = device["settings"]["bankingParams"]["merchId"]; if(merchval > 0){ merchId = merchval; } }catch(err){ } console.log("ingeniko merchId",merchId) var thisbasket = app.terminal.getbasket(); var visasum = $("#payvisa").val(); var cashsum = $("#paycash").val(); try { try { var jsonData = { products: [{ name: "Товар", quantity: 1, price: round(visasum, 2), }], protocol: "ingenico_ua", // mosst_apk | ingenico_ua ingenico: { command: "cardPayment", merchId: merchId }, cashless: round(visasum, 2), cash: round(cashsum, 2), sum: round(thisbasket["info"]["allcena"], 2), } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Error 3722"); } var json = JSON.stringify(jsonData); console.log("На ingenico", json); Android.bankingPayment(json); returnIngenico = {}; returnIngenico.status = "empty"; try { clearInterval(waitingIngenico); } catch (err) {} var waitingIngenico = setInterval(function() { console.log("Опрашиваем Ingenico"); if (returnIngenico.status == "done") { clearInterval(waitingIngenico); //app.banking.protocols.android_mosstreader_run_app.success(); var thisbasket = app.terminal.getbasket(); returnIngenico.status = "empty"; try{ returnIngenico.terminalId = device.id; }catch(err){ } thisbasket["info"]["bankingData"] = returnIngenico; thisbasket["info"]["mosst"] = JSON.stringify(returnIngenico); app.terminal.paynow(thisbasket); } }, 500); } catch (err) { console.error(err); app.main.error(device.name + ": Error 7743"); // app.terminal.paynow(thisbasket); } }, success: function(json) { try{ returnIngenico = JSON.parse(json); }catch(err){ //app.main.error("Error: 8291"); } $("#bankingterminalconnectingsbox").hide(); returnIngenico.status = "done"; }, error: function(errCode) { $("#bankingterminalconnectingsbox").hide(); ingenicoUErr["1"] = lang["Oshibka_otkryti_yny88"]; ingenicoUErr["2"] = lang["Neobhodimo_otkr_ytk4i"]; ingenicoUErr["3"] = lang["Oshibka_podklyu_7bhe3"]; ingenicoUErr["4"] = lang["Terminal_vozvra_4dt5y"]; ingenicoUErr["1000"] = lang["Obschaya_oshibk_dtefh"]; ingenicoUErr["1001"] = lang["Tranzakciya_otm_zi5di"]; ingenicoUErr["1002"] = lang["Snighenie_EMV"]; ingenicoUErr["1003"] = lang["Ghurnal_tranzak_h67f2"]; ingenicoUErr["1004"] = lang["Net_svyazi_s_ho_f453y"]; ingenicoUErr["1005"] = lang["Net_bumagi_v_ba_ni9hd"]; ingenicoUErr["1006"] = lang["Oshibka_kriptok_rsiyt"]; var errorText = ingenicoUErr[errCode]; if(!errorText){ errorText = errCode; } app.main.error("Ingenico: "+lang["Ne_udalosy_prinyaty_oplatu_po_beznalu"]+"
• "+errorText); }, status: function(statusCode){ var ingenicoUStatus = {}; ingenicoUStatus["0"] = lang["kod_statusa_ned_8d6ze"]; ingenicoUStatus["1"] = lang["Karta_prochitan_4fy7k"]; ingenicoUStatus["2"] = lang["Beskontaktnaya__52645"]; ingenicoUStatus["3"] = lang["avtorizatsija"]; ingenicoUStatus["4"] = lang["Oghidanie_polyz_rbaer"]; ingenicoUStatus["5"] = lang["Pechaty"]; ingenicoUStatus["6"] = lang["Vvedite_PIN"]; ingenicoUStatus["7"] = lang["Udalite_kartu"]; ingenicoUStatus["8"] = lang["vybor_EMV_multi_223k6"]; ingenicoUStatus["9"] = lang["Oghidaet_kartu"]; var statusText = ingenicoUStatus[statusCode]; if(!statusText){ statusText = statusCode; } app.banking.modules.status(statusText); //app.main.message("Ingenico:
• "+statusText); }, returnsale: function(data) { return new Promise(function(resolve, reject) { var device = data["device"]; console.log(device); try { try { var jsonData = { protocol: "ingenico_ua", // mosst_apk | ingenico_ua ingenico: { command: "cardRefund", //authorization //loguot //setLanguage //cardPayment - Оплата //cardRefund - Возврат refundData: data["mosst"] } } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Не достаточно данных, ошибка 3721"); } var json = JSON.stringify(jsonData); console.log("На ingenico", json); Android.bankingPayment(json); returnIngenico.status = "empty"; try { clearInterval(waitingIngenico); } catch (err) {} var waitingIngenico = setInterval(function() { console.log("Опрашиваем Ingenico"); if (returnIngenico.status == "done") { clearInterval(waitingIngenico); //alert("Возврат выполнен"); $("#bankingterminalsbox").hide(); resolve(returnIngenico); } }, 500); } catch (err) {} }); }, closeShift: function(){ try { var jsonData = { protocol: "ingenico_ua", // mosst_apk | ingenico_ua ingenico: { command: "closeShift", } } var json = JSON.stringify(jsonData); console.log("На ingenico", json); Android.bankingPayment(json); } catch (err) { app.main.error(device.name + ": " + "Error 3722-1"); } } }, android_ingenico_bpos_ip: { sendpayment: function(device) { var merchId = 0; try{ var merchval = device["settings"]["bankingParams"]["merchId"]; if(merchval > 0){ merchId = merchval; } }catch(err){ } console.log("ingeniko merchId",merchId) var thisbasket = app.terminal.getbasket(); var visasum = $("#payvisa").val(); var cashsum = $("#paycash").val(); try { try { var jsonData = { products: [{ name: "Товар", quantity: 1, price: round(visasum, 2), }], protocol: "android_ingenico_bpos_ip", // mosst_apk | ingenico_ua deviceId:device.id, ingenico: { command: "cardPayment", merchId: merchId }, cashless: round(visasum, 2), cash: round(cashsum, 2), sum: round(thisbasket["info"]["allcena"], 2), } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Error 3722"); } var json = JSON.stringify(jsonData); console.log("На ingenico", json); Android.bankingPayment(json); returnIngenico = {}; returnIngenico.status = "empty"; try { clearInterval(waitingIngenico); } catch (err) {} var waitingIngenico = setInterval(function() { console.log("Опрашиваем Ingenico"); if (returnIngenico.status == "done") { clearInterval(waitingIngenico); //app.banking.protocols.android_mosstreader_run_app.success(); var thisbasket = app.terminal.getbasket(); returnIngenico.status = "empty"; try{ returnIngenico.terminalId = device.id; }catch(err){ } thisbasket["info"]["bankingData"] = returnIngenico; thisbasket["info"]["mosst"] = JSON.stringify(returnIngenico); app.terminal.paynow(thisbasket); } }, 500); } catch (err) { console.error(err); app.main.error(device.name + ": Error 7743"); // app.terminal.paynow(thisbasket); } }, success: function(json) { try{ returnIngenico = JSON.parse(json); }catch(err){ //app.main.error("Error: 8291"); } $("#bankingterminalconnectingsbox").hide(); returnIngenico.status = "done"; }, error: function(errCode) { $("#bankingterminalconnectingsbox").hide(); ingenicoUErr["1"] = lang["Oshibka_otkryti_yny88"]; ingenicoUErr["2"] = lang["Neobhodimo_otkr_ytk4i"]; ingenicoUErr["3"] = lang["Oshibka_podklyu_7bhe3"]; ingenicoUErr["4"] = lang["Terminal_vozvra_4dt5y"]; ingenicoUErr["1000"] = lang["Obschaya_oshibk_dtefh"]; ingenicoUErr["1001"] = lang["Tranzakciya_otm_zi5di"]; ingenicoUErr["1002"] = lang["Snighenie_EMV"]; ingenicoUErr["1003"] = lang["Ghurnal_tranzak_h67f2"]; ingenicoUErr["1004"] = lang["Net_svyazi_s_ho_f453y"]; ingenicoUErr["1005"] = lang["Net_bumagi_v_ba_ni9hd"]; ingenicoUErr["1006"] = lang["Oshibka_kriptok_rsiyt"]; var errorText = ingenicoUErr[errCode]; if(!errorText){ errorText = errCode; } app.main.error("Ingenico: "+lang["Ne_udalosy_prinyaty_oplatu_po_beznalu"]+"
• "+errorText); }, status: function(statusCode){ var ingenicoUStatus = {}; ingenicoUStatus["0"] = lang["kod_statusa_ned_8d6ze"]; ingenicoUStatus["1"] = lang["Karta_prochitan_4fy7k"]; ingenicoUStatus["2"] = lang["Beskontaktnaya__52645"]; ingenicoUStatus["3"] = lang["avtorizatsija"]; ingenicoUStatus["4"] = lang["Oghidanie_polyz_rbaer"]; ingenicoUStatus["5"] = lang["Pechaty"]; ingenicoUStatus["6"] = lang["Vvedite_PIN"]; ingenicoUStatus["7"] = lang["Udalite_kartu"]; ingenicoUStatus["8"] = lang["vybor_EMV_multi_223k6"]; ingenicoUStatus["9"] = lang["Oghidaet_kartu"]; var statusText = ingenicoUStatus[statusCode]; if(!statusText){ statusText = statusCode; } app.banking.modules.status(statusText); //app.main.message("Ingenico:
• "+statusText); }, returnsale: function(data) { return new Promise(function(resolve, reject) { var device = data["device"]; console.log(device); try { try { var jsonData = { protocol: "ingenico_ua", // mosst_apk | ingenico_ua ingenico: { command: "cardRefund", //authorization //loguot //setLanguage //cardPayment - Оплата //cardRefund - Возврат refundData: data["mosst"] } } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Не достаточно данных, ошибка 3721"); } var json = JSON.stringify(jsonData); console.log("На ingenico", json); Android.bankingPayment(json); returnIngenico.status = "empty"; try { clearInterval(waitingIngenico); } catch (err) {} var waitingIngenico = setInterval(function() { console.log("Опрашиваем Ingenico"); if (returnIngenico.status == "done") { clearInterval(waitingIngenico); //alert("Возврат выполнен"); $("#bankingterminalsbox").hide(); resolve(returnIngenico); } }, 500); } catch (err) {} }); }, closeShift: function(){ try { var jsonData = { protocol: "ingenico_ua", // mosst_apk | ingenico_ua ingenico: { command: "closeShift", } } var json = JSON.stringify(jsonData); console.log("На ingenico", json); Android.bankingPayment(json); } catch (err) { app.main.error(device.name + ": " + "Error 3722-1"); } } }, android_ingenico_bpos_noprinter_sdk_ua: { sendpayment: function(device) { var merchId = 0; try{ var merchval = device["settings"]["bankingParams"]["merchId"]; if(merchval > 0){ merchId = merchval; } }catch(err){ } console.log("ingeniko merchId",merchId) var thisbasket = app.terminal.getbasket(); var visasum = $("#payvisa").val(); var cashsum = $("#paycash").val(); try { try { var jsonData = { products: [{ name: "Товар", quantity: 1, price: round(visasum, 2), }], protocol: "ingenico_ua", // mosst_apk | ingenico_ua ingenico: { command: "cardPayment", merchId: merchId }, cashless: round(visasum, 2), cash: round(cashsum, 2), sum: round(thisbasket["info"]["allcena"], 2), } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Error 3722"); } var json = JSON.stringify(jsonData); console.log("На ingenico", json); Android.bankingPayment(json); returnIngenico = {}; returnIngenico.status = "empty"; try { clearInterval(waitingIngenico); } catch (err) {} var waitingIngenico = setInterval(function() { console.log("Опрашиваем Ingenico"); if (returnIngenico.status == "done") { clearInterval(waitingIngenico); //app.banking.protocols.android_mosstreader_run_app.success(); var thisbasket = app.terminal.getbasket(); returnIngenico.status = "empty"; try{ returnIngenico.terminalId = device.id; }catch(err){ } thisbasket["info"]["bankingData"] = returnIngenico; thisbasket["info"]["mosst"] = JSON.stringify(returnIngenico); app.terminal.paynow(thisbasket); } }, 500); } catch (err) { console.error(err); app.main.error(device.name + ": Error 7743"); // app.terminal.paynow(thisbasket); } }, success: function(json) { try{ returnIngenico = JSON.parse(json); }catch(err){ //app.main.error("Error: 8291"); } $("#bankingterminalconnectingsbox").hide(); returnIngenico.status = "done"; }, error: function(errCode) { $("#bankingterminalconnectingsbox").hide(); ingenicoUErr["1"] = lang["Oshibka_otkryti_yny88"]; ingenicoUErr["2"] = lang["Neobhodimo_otkr_ytk4i"]; ingenicoUErr["3"] = lang["Oshibka_podklyu_7bhe3"]; ingenicoUErr["4"] = lang["Terminal_vozvra_4dt5y"]; ingenicoUErr["1000"] = lang["Obschaya_oshibk_dtefh"]; ingenicoUErr["1001"] = lang["Tranzakciya_otm_zi5di"]; ingenicoUErr["1002"] = lang["Snighenie_EMV"]; ingenicoUErr["1003"] = lang["Ghurnal_tranzak_h67f2"]; ingenicoUErr["1004"] = lang["Net_svyazi_s_ho_f453y"]; ingenicoUErr["1005"] = lang["Net_bumagi_v_ba_ni9hd"]; ingenicoUErr["1006"] = lang["Oshibka_kriptok_rsiyt"]; var errorText = ingenicoUErr[errCode]; if(!errorText){ errorText = errCode; } app.main.error("Ingenico: "+lang["Ne_udalosy_prinyaty_oplatu_po_beznalu"]+"
• "+errorText); }, status: function(statusCode){ var ingenicoUStatus = {}; ingenicoUStatus["0"] = lang["kod_statusa_ned_8d6ze"]; ingenicoUStatus["1"] = lang["Karta_prochitan_4fy7k"]; ingenicoUStatus["2"] = lang["Beskontaktnaya__52645"]; ingenicoUStatus["3"] = lang["avtorizatsija"]; ingenicoUStatus["4"] = lang["Oghidanie_polyz_rbaer"]; ingenicoUStatus["5"] = lang["Pechaty"]; ingenicoUStatus["6"] = lang["Vvedite_PIN"]; ingenicoUStatus["7"] = lang["Udalite_kartu"]; ingenicoUStatus["8"] = lang["vybor_EMV_multi_223k6"]; ingenicoUStatus["9"] = lang["Oghidaet_kartu"]; var statusText = ingenicoUStatus[statusCode]; if(!statusText){ statusText = statusCode; } app.banking.modules.status(statusText); //app.main.message("Ingenico:
• "+statusText); }, returnsale: function(data) { return new Promise(function(resolve, reject) { var device = data["device"]; console.log(device); try { try { var jsonData = { protocol: "ingenico_ua", // mosst_apk | ingenico_ua ingenico: { command: "cardRefund", //authorization //loguot //setLanguage //cardPayment - Оплата //cardRefund - Возврат refundData: data["mosst"] } } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Не достаточно данных, ошибка 3721"); } var json = JSON.stringify(jsonData); console.log("На ingenico", json); Android.bankingPayment(json); returnIngenico.status = "empty"; try { clearInterval(waitingIngenico); } catch (err) {} var waitingIngenico = setInterval(function() { console.log("Опрашиваем Ingenico"); if (returnIngenico.status == "done") { clearInterval(waitingIngenico); //alert("Возврат выполнен"); $("#bankingterminalsbox").hide(); resolve(returnIngenico); } }, 500); } catch (err) {} }); }, closeShift: function(){ try { var jsonData = { protocol: "ingenico_ua", // mosst_apk | ingenico_ua ingenico: { command: "closeShift", } } var json = JSON.stringify(jsonData); console.log("На ingenico", json); Android.bankingPayment(json); } catch (err) { app.main.error(device.name + ": " + "Error 3722-1"); } } }, android_ingenico_bpos_noprinter_sdk_ua_tcpip: { sendpayment: function(device) { var merchId = 0; try{ var merchval = device["settings"]["bankingParams"]["merchId"]; if(merchval > 0){ merchId = merchval; } }catch(err){ } console.log("ingeniko merchId",merchId) var thisbasket = app.terminal.getbasket(); var visasum = $("#payvisa").val(); var cashsum = $("#paycash").val(); try { try { var jsonData = { products: [{ name: "Товар", quantity: 1, price: round(visasum, 2), }], protocol: "ingenico_ua", // mosst_apk | ingenico_ua ingenico: { command: "cardPayment", merchId: merchId }, cashless: round(visasum, 2), cash: round(cashsum, 2), sum: round(thisbasket["info"]["allcena"], 2), } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Error 3722"); } var json = JSON.stringify(jsonData); console.log("На ingenico", json); Android.bankingPayment(json); returnIngenico = {}; returnIngenico.status = "empty"; try { clearInterval(waitingIngenico); } catch (err) {} var waitingIngenico = setInterval(function() { console.log("Опрашиваем Ingenico"); if (returnIngenico.status == "done") { clearInterval(waitingIngenico); //app.banking.protocols.android_mosstreader_run_app.success(); var thisbasket = app.terminal.getbasket(); returnIngenico.status = "empty"; try{ returnIngenico.terminalId = device.id; }catch(err){ } thisbasket["info"]["bankingData"] = returnIngenico; thisbasket["info"]["mosst"] = JSON.stringify(returnIngenico); app.terminal.paynow(thisbasket); } }, 500); } catch (err) { console.error(err); app.main.error(device.name + ": Error 7743"); // app.terminal.paynow(thisbasket); } }, success: function(json) { try{ returnIngenico = JSON.parse(json); }catch(err){ //app.main.error("Error: 8291"); } $("#bankingterminalconnectingsbox").hide(); returnIngenico.status = "done"; }, error: function(errCode) { $("#bankingterminalconnectingsbox").hide(); ingenicoUErr["1"] = lang["Oshibka_otkryti_yny88"]; ingenicoUErr["2"] = lang["Neobhodimo_otkr_ytk4i"]; ingenicoUErr["3"] = lang["Oshibka_podklyu_7bhe3"]; ingenicoUErr["4"] = lang["Terminal_vozvra_4dt5y"]; ingenicoUErr["1000"] = lang["Obschaya_oshibk_dtefh"]; ingenicoUErr["1001"] = lang["Tranzakciya_otm_zi5di"]; ingenicoUErr["1002"] = lang["Snighenie_EMV"]; ingenicoUErr["1003"] = lang["Ghurnal_tranzak_h67f2"]; ingenicoUErr["1004"] = lang["Net_svyazi_s_ho_f453y"]; ingenicoUErr["1005"] = lang["Net_bumagi_v_ba_ni9hd"]; ingenicoUErr["1006"] = lang["Oshibka_kriptok_rsiyt"]; var errorText = ingenicoUErr[errCode]; if(!errorText){ errorText = errCode; } app.main.error("Ingenico: "+lang["Ne_udalosy_prinyaty_oplatu_po_beznalu"]+"
• "+errorText); }, status: function(statusCode){ var ingenicoUStatus = {}; ingenicoUStatus["0"] = lang["kod_statusa_ned_8d6ze"]; ingenicoUStatus["1"] = lang["Karta_prochitan_4fy7k"]; ingenicoUStatus["2"] = lang["Beskontaktnaya__52645"]; ingenicoUStatus["3"] = lang["avtorizatsija"]; ingenicoUStatus["4"] = lang["Oghidanie_polyz_rbaer"]; ingenicoUStatus["5"] = lang["Pechaty"]; ingenicoUStatus["6"] = lang["Vvedite_PIN"]; ingenicoUStatus["7"] = lang["Udalite_kartu"]; ingenicoUStatus["8"] = lang["vybor_EMV_multi_223k6"]; ingenicoUStatus["9"] = lang["Oghidaet_kartu"]; var statusText = ingenicoUStatus[statusCode]; if(!statusText){ statusText = statusCode; } app.banking.modules.status(statusText); //app.main.message("Ingenico:
• "+statusText); }, returnsale: function(data) { return new Promise(function(resolve, reject) { var device = data["device"]; console.log(device); try { try { var jsonData = { protocol: "ingenico_ua", // mosst_apk | ingenico_ua ingenico: { command: "cardRefund", //authorization //loguot //setLanguage //cardPayment - Оплата //cardRefund - Возврат refundData: data["mosst"] } } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Не достаточно данных, ошибка 3721"); } var json = JSON.stringify(jsonData); console.log("На ingenico", json); Android.bankingPayment(json); returnIngenico.status = "empty"; try { clearInterval(waitingIngenico); } catch (err) {} var waitingIngenico = setInterval(function() { console.log("Опрашиваем Ingenico"); if (returnIngenico.status == "done") { clearInterval(waitingIngenico); //alert("Возврат выполнен"); $("#bankingterminalsbox").hide(); resolve(returnIngenico); } }, 500); } catch (err) {} }); }, closeShift: function(){ try { var jsonData = { protocol: "ingenico_ua", // mosst_apk | ingenico_ua ingenico: { command: "closeShift", } } var json = JSON.stringify(jsonData); console.log("На ingenico", json); Android.bankingPayment(json); } catch (err) { app.main.error(device.name + ": " + "Error 3722-1"); } } }, android_ingenico_bpos_noprinter_privatbank_sdk_ua: { sendpayment: function(device) { var merchId = 0; try{ var merchval = device["settings"]["bankingParams"]["merchId"]; if(merchval > 0){ merchId = merchval; } }catch(err){ } console.log("ingeniko merchId",merchId) var thisbasket = app.terminal.getbasket(); var visasum = $("#payvisa").val(); var cashsum = $("#paycash").val(); try { try { var jsonData = { products: [{ name: "Товар", quantity: 1, price: round(visasum, 2), }], protocol: "ingenico_ua", // mosst_apk | ingenico_ua ingenico: { command: "cardPayment", merchId: merchId }, cashless: round(visasum, 2), cash: round(cashsum, 2), sum: round(thisbasket["info"]["allcena"], 2), } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Error 3722"); } var json = JSON.stringify(jsonData); console.log("На ingenico", json); Android.bankingPayment(json); returnIngenico = {}; returnIngenico.status = "empty"; try { clearInterval(waitingIngenico); } catch (err) {} var waitingIngenico = setInterval(function() { console.log("Опрашиваем Ingenico"); if (returnIngenico.status == "done") { clearInterval(waitingIngenico); //app.banking.protocols.android_mosstreader_run_app.success(); var thisbasket = app.terminal.getbasket(); returnIngenico.status = "empty"; try{ returnIngenico.terminalId = device.id; }catch(err){ } thisbasket["info"]["bankingData"] = returnIngenico; thisbasket["info"]["mosst"] = JSON.stringify(returnIngenico); app.terminal.paynow(thisbasket); } }, 500); } catch (err) { console.error(err); app.main.error(device.name + ": Error 7743"); // app.terminal.paynow(thisbasket); } }, success: function(json) { try{ returnIngenico = JSON.parse(json); }catch(err){ //app.main.error("Error: 8291"); } $("#bankingterminalconnectingsbox").hide(); returnIngenico.status = "done"; }, error: function(errCode) { $("#bankingterminalconnectingsbox").hide(); ingenicoUErr["1"] = lang["Oshibka_otkryti_yny88"]; ingenicoUErr["2"] = lang["Neobhodimo_otkr_ytk4i"]; ingenicoUErr["3"] = lang["Oshibka_podklyu_7bhe3"]; ingenicoUErr["4"] = lang["Terminal_vozvra_4dt5y"]; ingenicoUErr["1000"] = lang["Obschaya_oshibk_dtefh"]; ingenicoUErr["1001"] = lang["Tranzakciya_otm_zi5di"]; ingenicoUErr["1002"] = lang["Snighenie_EMV"]; ingenicoUErr["1003"] = lang["Ghurnal_tranzak_h67f2"]; ingenicoUErr["1004"] = lang["Net_svyazi_s_ho_f453y"]; ingenicoUErr["1005"] = lang["Net_bumagi_v_ba_ni9hd"]; ingenicoUErr["1006"] = lang["Oshibka_kriptok_rsiyt"]; var errorText = ingenicoUErr[errCode]; if(!errorText){ errorText = errCode; } app.main.error("Ingenico: "+lang["Ne_udalosy_prinyaty_oplatu_po_beznalu"]+"
• "+errorText); }, status: function(statusCode){ var ingenicoUStatus = {}; ingenicoUStatus["0"] = lang["kod_statusa_ned_8d6ze"]; ingenicoUStatus["1"] = lang["Karta_prochitan_4fy7k"]; ingenicoUStatus["2"] = lang["Beskontaktnaya__52645"]; ingenicoUStatus["3"] = lang["avtorizatsija"]; ingenicoUStatus["4"] = lang["Oghidanie_polyz_rbaer"]; ingenicoUStatus["5"] = lang["Pechaty"]; ingenicoUStatus["6"] = lang["Vvedite_PIN"]; ingenicoUStatus["7"] = lang["Udalite_kartu"]; ingenicoUStatus["8"] = lang["vybor_EMV_multi_223k6"]; ingenicoUStatus["9"] = lang["Oghidaet_kartu"]; var statusText = ingenicoUStatus[statusCode]; if(!statusText){ statusText = statusCode; } app.banking.modules.status(statusText); //app.main.message("Ingenico:
• "+statusText); }, returnsale: function(data) { return new Promise(function(resolve, reject) { var device = data["device"]; console.log(device); try { try { var jsonData = { protocol: "ingenico_ua", // mosst_apk | ingenico_ua ingenico: { command: "cardRefund", //authorization //loguot //setLanguage //cardPayment - Оплата //cardRefund - Возврат refundData: data["mosst"] } } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Не достаточно данных, ошибка 3721"); } var json = JSON.stringify(jsonData); console.log("На ingenico", json); Android.bankingPayment(json); returnIngenico.status = "empty"; try { clearInterval(waitingIngenico); } catch (err) {} var waitingIngenico = setInterval(function() { console.log("Опрашиваем Ingenico"); if (returnIngenico.status == "done") { clearInterval(waitingIngenico); //alert("Возврат выполнен"); $("#bankingterminalsbox").hide(); resolve(returnIngenico); } }, 500); } catch (err) {} }); }, closeShift: function(){ try { var jsonData = { protocol: "ingenico_ua", // mosst_apk | ingenico_ua ingenico: { command: "closeShift", } } var json = JSON.stringify(jsonData); console.log("На ingenico", json); Android.bankingPayment(json); } catch (err) { app.main.error(device.name + ": " + "Error 3722-1"); } } }, android_ingenico_bpos_noprinter_privatbank_sdk_ua_tcpip: { sendpayment: function(device) { var merchId = 0; try{ var merchval = device["settings"]["bankingParams"]["merchId"]; if(merchval > 0){ merchId = merchval; } }catch(err){ } console.log("ingeniko merchId",merchId) var thisbasket = app.terminal.getbasket(); var visasum = $("#payvisa").val(); var cashsum = $("#paycash").val(); try { try { var jsonData = { products: [{ name: "Товар", quantity: 1, price: round(visasum, 2), }], protocol: "ingenico_ua", // mosst_apk | ingenico_ua ingenico: { command: "cardPayment", merchId: merchId }, cashless: round(visasum, 2), cash: round(cashsum, 2), sum: round(thisbasket["info"]["allcena"], 2), } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Error 3722"); } var json = JSON.stringify(jsonData); console.log("На ingenico", json); Android.bankingPayment(json); returnIngenico = {}; returnIngenico.status = "empty"; try { clearInterval(waitingIngenico); } catch (err) {} var waitingIngenico = setInterval(function() { console.log("Опрашиваем Ingenico"); if (returnIngenico.status == "done") { clearInterval(waitingIngenico); //app.banking.protocols.android_mosstreader_run_app.success(); var thisbasket = app.terminal.getbasket(); returnIngenico.status = "empty"; try{ returnIngenico.terminalId = device.id; }catch(err){ } thisbasket["info"]["bankingData"] = returnIngenico; thisbasket["info"]["mosst"] = JSON.stringify(returnIngenico); app.terminal.paynow(thisbasket); } }, 500); } catch (err) { console.error(err); app.main.error(device.name + ": Error 7743"); // app.terminal.paynow(thisbasket); } }, success: function(json) { try{ returnIngenico = JSON.parse(json); }catch(err){ //app.main.error("Error: 8291"); } $("#bankingterminalconnectingsbox").hide(); returnIngenico.status = "done"; }, error: function(errCode) { $("#bankingterminalconnectingsbox").hide(); ingenicoUErr["1"] = lang["Oshibka_otkryti_yny88"]; ingenicoUErr["2"] = lang["Neobhodimo_otkr_ytk4i"]; ingenicoUErr["3"] = lang["Oshibka_podklyu_7bhe3"]; ingenicoUErr["4"] = lang["Terminal_vozvra_4dt5y"]; ingenicoUErr["1000"] = lang["Obschaya_oshibk_dtefh"]; ingenicoUErr["1001"] = lang["Tranzakciya_otm_zi5di"]; ingenicoUErr["1002"] = lang["Snighenie_EMV"]; ingenicoUErr["1003"] = lang["Ghurnal_tranzak_h67f2"]; ingenicoUErr["1004"] = lang["Net_svyazi_s_ho_f453y"]; ingenicoUErr["1005"] = lang["Net_bumagi_v_ba_ni9hd"]; ingenicoUErr["1006"] = lang["Oshibka_kriptok_rsiyt"]; var errorText = ingenicoUErr[errCode]; if(!errorText){ errorText = errCode; } app.main.error("Ingenico: "+lang["Ne_udalosy_prinyaty_oplatu_po_beznalu"]+"
• "+errorText); }, status: function(statusCode){ var ingenicoUStatus = {}; ingenicoUStatus["0"] = lang["kod_statusa_ned_8d6ze"]; ingenicoUStatus["1"] = lang["Karta_prochitan_4fy7k"]; ingenicoUStatus["2"] = lang["Beskontaktnaya__52645"]; ingenicoUStatus["3"] = lang["avtorizatsija"]; ingenicoUStatus["4"] = lang["Oghidanie_polyz_rbaer"]; ingenicoUStatus["5"] = lang["Pechaty"]; ingenicoUStatus["6"] = lang["Vvedite_PIN"]; ingenicoUStatus["7"] = lang["Udalite_kartu"]; ingenicoUStatus["8"] = lang["vybor_EMV_multi_223k6"]; ingenicoUStatus["9"] = lang["Oghidaet_kartu"]; var statusText = ingenicoUStatus[statusCode]; if(!statusText){ statusText = statusCode; } app.banking.modules.status(statusText); //app.main.message("Ingenico:
• "+statusText); }, returnsale: function(data) { return new Promise(function(resolve, reject) { var device = data["device"]; console.log(device); try { try { var jsonData = { protocol: "ingenico_ua", // mosst_apk | ingenico_ua ingenico: { command: "cardRefund", //authorization //loguot //setLanguage //cardPayment - Оплата //cardRefund - Возврат refundData: data["mosst"] } } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Не достаточно данных, ошибка 3721"); } var json = JSON.stringify(jsonData); console.log("На ingenico", json); Android.bankingPayment(json); returnIngenico.status = "empty"; try { clearInterval(waitingIngenico); } catch (err) {} var waitingIngenico = setInterval(function() { console.log("Опрашиваем Ingenico"); if (returnIngenico.status == "done") { clearInterval(waitingIngenico); //alert("Возврат выполнен"); $("#bankingterminalsbox").hide(); resolve(returnIngenico); } }, 500); } catch (err) {} }); }, closeShift: function(){ try { var jsonData = { protocol: "ingenico_ua", // mosst_apk | ingenico_ua ingenico: { command: "closeShift", } } var json = JSON.stringify(jsonData); console.log("На ingenico", json); Android.bankingPayment(json); } catch (err) { app.main.error(device.name + ": " + "Error 3722-1"); } } }, android_ingenico_bpos_privatbank_sdk_ua: { sendpayment: function(device) { var merchId = 0; try{ var merchval = device["settings"]["bankingParams"]["merchId"]; if(merchval > 0){ merchId = merchval; } }catch(err){ } console.log("ingeniko merchId",merchId) var thisbasket = app.terminal.getbasket(); var visasum = $("#payvisa").val(); var cashsum = $("#paycash").val(); try { try { var jsonData = { products: [{ name: "Товар", quantity: 1, price: round(visasum, 2), }], protocol: "ingenico_ua", // mosst_apk | ingenico_ua ingenico: { command: "cardPayment", merchId: merchId }, cashless: round(visasum, 2), cash: round(cashsum, 2), sum: round(thisbasket["info"]["allcena"], 2), } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Error 3722"); } var json = JSON.stringify(jsonData); console.log("На ingenico", json); Android.bankingPayment(json); returnIngenico = {}; returnIngenico.status = "empty"; try { clearInterval(waitingIngenico); } catch (err) {} var waitingIngenico = setInterval(function() { console.log("Опрашиваем Ingenico"); if (returnIngenico.status == "done") { clearInterval(waitingIngenico); //app.banking.protocols.android_mosstreader_run_app.success(); var thisbasket = app.terminal.getbasket(); returnIngenico.status = "empty"; try{ returnIngenico.terminalId = device.id; }catch(err){ } thisbasket["info"]["bankingData"] = returnIngenico; thisbasket["info"]["mosst"] = JSON.stringify(returnIngenico); app.terminal.paynow(thisbasket); } }, 500); } catch (err) { console.error(err); app.main.error(device.name + ": Error 7743"); // app.terminal.paynow(thisbasket); } }, success: function(json) { try{ returnIngenico = JSON.parse(json); }catch(err){ //app.main.error("Error: 8291"); } $("#bankingterminalconnectingsbox").hide(); returnIngenico.status = "done"; }, error: function(errCode) { $("#bankingterminalconnectingsbox").hide(); ingenicoUErr["1"] = lang["Oshibka_otkryti_yny88"]; ingenicoUErr["2"] = lang["Neobhodimo_otkr_ytk4i"]; ingenicoUErr["3"] = lang["Oshibka_podklyu_7bhe3"]; ingenicoUErr["4"] = lang["Terminal_vozvra_4dt5y"]; ingenicoUErr["1000"] = lang["Obschaya_oshibk_dtefh"]; ingenicoUErr["1001"] = lang["Tranzakciya_otm_zi5di"]; ingenicoUErr["1002"] = lang["Snighenie_EMV"]; ingenicoUErr["1003"] = lang["Ghurnal_tranzak_h67f2"]; ingenicoUErr["1004"] = lang["Net_svyazi_s_ho_f453y"]; ingenicoUErr["1005"] = lang["Net_bumagi_v_ba_ni9hd"]; ingenicoUErr["1006"] = lang["Oshibka_kriptok_rsiyt"]; var errorText = ingenicoUErr[errCode]; if(!errorText){ errorText = errCode; } app.main.error("Ingenico: "+lang["Ne_udalosy_prinyaty_oplatu_po_beznalu"]+"
• "+errorText); }, status: function(statusCode){ var ingenicoUStatus = {}; ingenicoUStatus["0"] = lang["kod_statusa_ned_8d6ze"]; ingenicoUStatus["1"] = lang["Karta_prochitan_4fy7k"]; ingenicoUStatus["2"] = lang["Beskontaktnaya__52645"]; ingenicoUStatus["3"] = lang["avtorizatsija"]; ingenicoUStatus["4"] = lang["Oghidanie_polyz_rbaer"]; ingenicoUStatus["5"] = lang["Pechaty"]; ingenicoUStatus["6"] = lang["Vvedite_PIN"]; ingenicoUStatus["7"] = lang["Udalite_kartu"]; ingenicoUStatus["8"] = lang["vybor_EMV_multi_223k6"]; ingenicoUStatus["9"] = lang["Oghidaet_kartu"]; var statusText = ingenicoUStatus[statusCode]; if(!statusText){ statusText = statusCode; } app.banking.modules.status(statusText); //app.main.message("Ingenico:
• "+statusText); }, returnsale: function(data) { return new Promise(function(resolve, reject) { var device = data["device"]; console.log(device); try { try { var jsonData = { protocol: "ingenico_ua", // mosst_apk | ingenico_ua ingenico: { command: "cardRefund", //authorization //loguot //setLanguage //cardPayment - Оплата //cardRefund - Возврат refundData: data["mosst"] } } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Не достаточно данных, ошибка 3721"); } var json = JSON.stringify(jsonData); console.log("На ingenico", json); Android.bankingPayment(json); returnIngenico.status = "empty"; try { clearInterval(waitingIngenico); } catch (err) {} var waitingIngenico = setInterval(function() { console.log("Опрашиваем Ingenico"); if (returnIngenico.status == "done") { clearInterval(waitingIngenico); //alert("Возврат выполнен"); $("#bankingterminalsbox").hide(); resolve(returnIngenico); } }, 500); } catch (err) {} }); }, closeShift: function(){ try { var jsonData = { protocol: "ingenico_ua", // mosst_apk | ingenico_ua ingenico: { command: "closeShift", } } var json = JSON.stringify(jsonData); console.log("На ingenico", json); Android.bankingPayment(json); } catch (err) { app.main.error(device.name + ": " + "Error 3722-1"); } } }, android_ingenico_bpos_privatbank_sdk_ua_tcpip: { sendpayment: function(device) { var merchId = 0; try{ var merchval = device["settings"]["bankingParams"]["merchId"]; if(merchval > 0){ merchId = merchval; } }catch(err){ } console.log("ingeniko merchId",merchId) var thisbasket = app.terminal.getbasket(); var visasum = $("#payvisa").val(); var cashsum = $("#paycash").val(); try { try { var jsonData = { products: [{ name: "Товар", quantity: 1, price: round(visasum, 2), }], protocol: "ingenico_ua", // mosst_apk | ingenico_ua ingenico: { command: "cardPayment", merchId: merchId }, cashless: round(visasum, 2), cash: round(cashsum, 2), sum: round(thisbasket["info"]["allcena"], 2), } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Error 3722"); } var json = JSON.stringify(jsonData); console.log("На ingenico", json); Android.bankingPayment(json); returnIngenico = {}; returnIngenico.status = "empty"; try { clearInterval(waitingIngenico); } catch (err) {} var waitingIngenico = setInterval(function() { console.log("Опрашиваем Ingenico"); if (returnIngenico.status == "done") { clearInterval(waitingIngenico); //app.banking.protocols.android_mosstreader_run_app.success(); var thisbasket = app.terminal.getbasket(); returnIngenico.status = "empty"; try{ returnIngenico.terminalId = device.id; }catch(err){ } thisbasket["info"]["bankingData"] = returnIngenico; thisbasket["info"]["mosst"] = JSON.stringify(returnIngenico); app.terminal.paynow(thisbasket); } }, 500); } catch (err) { console.error(err); app.main.error(device.name + ": Error 7743"); // app.terminal.paynow(thisbasket); } }, success: function(json) { try{ returnIngenico = JSON.parse(json); }catch(err){ //app.main.error("Error: 8291"); } $("#bankingterminalconnectingsbox").hide(); returnIngenico.status = "done"; }, error: function(errCode) { $("#bankingterminalconnectingsbox").hide(); ingenicoUErr["1"] = lang["Oshibka_otkryti_yny88"]; ingenicoUErr["2"] = lang["Neobhodimo_otkr_ytk4i"]; ingenicoUErr["3"] = lang["Oshibka_podklyu_7bhe3"]; ingenicoUErr["4"] = lang["Terminal_vozvra_4dt5y"]; ingenicoUErr["1000"] = lang["Obschaya_oshibk_dtefh"]; ingenicoUErr["1001"] = lang["Tranzakciya_otm_zi5di"]; ingenicoUErr["1002"] = lang["Snighenie_EMV"]; ingenicoUErr["1003"] = lang["Ghurnal_tranzak_h67f2"]; ingenicoUErr["1004"] = lang["Net_svyazi_s_ho_f453y"]; ingenicoUErr["1005"] = lang["Net_bumagi_v_ba_ni9hd"]; ingenicoUErr["1006"] = lang["Oshibka_kriptok_rsiyt"]; var errorText = ingenicoUErr[errCode]; if(!errorText){ errorText = errCode; } app.main.error("Ingenico: "+lang["Ne_udalosy_prinyaty_oplatu_po_beznalu"]+"
• "+errorText); }, status: function(statusCode){ var ingenicoUStatus = {}; ingenicoUStatus["0"] = lang["kod_statusa_ned_8d6ze"]; ingenicoUStatus["1"] = lang["Karta_prochitan_4fy7k"]; ingenicoUStatus["2"] = lang["Beskontaktnaya__52645"]; ingenicoUStatus["3"] = lang["avtorizatsija"]; ingenicoUStatus["4"] = lang["Oghidanie_polyz_rbaer"]; ingenicoUStatus["5"] = lang["Pechaty"]; ingenicoUStatus["6"] = lang["Vvedite_PIN"]; ingenicoUStatus["7"] = lang["Udalite_kartu"]; ingenicoUStatus["8"] = lang["vybor_EMV_multi_223k6"]; ingenicoUStatus["9"] = lang["Oghidaet_kartu"]; var statusText = ingenicoUStatus[statusCode]; if(!statusText){ statusText = statusCode; } app.banking.modules.status(statusText); //app.main.message("Ingenico:
• "+statusText); }, returnsale: function(data) { return new Promise(function(resolve, reject) { var device = data["device"]; console.log(device); try { try { var jsonData = { protocol: "ingenico_ua", // mosst_apk | ingenico_ua ingenico: { command: "cardRefund", //authorization //loguot //setLanguage //cardPayment - Оплата //cardRefund - Возврат refundData: data["mosst"] } } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Не достаточно данных, ошибка 3721"); } var json = JSON.stringify(jsonData); console.log("На ingenico", json); Android.bankingPayment(json); returnIngenico.status = "empty"; try { clearInterval(waitingIngenico); } catch (err) {} var waitingIngenico = setInterval(function() { console.log("Опрашиваем Ingenico"); if (returnIngenico.status == "done") { clearInterval(waitingIngenico); //alert("Возврат выполнен"); $("#bankingterminalsbox").hide(); resolve(returnIngenico); } }, 500); } catch (err) {} }); }, closeShift: function(){ try { var jsonData = { protocol: "ingenico_ua", // mosst_apk | ingenico_ua ingenico: { command: "closeShift", } } var json = JSON.stringify(jsonData); console.log("На ingenico", json); Android.bankingPayment(json); } catch (err) { app.main.error(device.name + ": " + "Error 3722-1"); } } }, windows_ingenico_bposlight_com: { sendpayment: function(device) { console.log("windows_ingenico_bposlight_com",device) var merchId = ""; try{ merchId = device["settings"]["bankingParams"]["merchId"]; }catch(err){ } console.log("ingeniko merchId",merchId) var thisbasket = app.terminal.getbasket(); var visasum = $("#payvisa").val(); var cashsum = $("#paycash").val(); try { try { var jsonData = { products: [{ name: "Товар", quantity: 1, price: round(visasum, 2), }], protocol: "ingenico", // mosst_apk | ingenico_ua ingenico_bposlight: { command: "cardPayment", merchantID: merchId }, cashless: round(visasum, 2), cash: round(cashsum, 2), sum: round(thisbasket["info"]["allcena"], 2), } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Error 3722"); } try { var request = { method: "banking_payment", data: JSON.stringify(jsonData) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { //console.log("on test request success", response); }, onFailure: function(error_code, error_message) { //console.log("on test request Failure", error_message); } }); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } returnIngenico = {}; returnIngenico.status = "empty"; try { clearInterval(waitingIngenico); } catch (err) {} var waitingIngenico = setInterval(function() { console.log("Опрашиваем Ingenico"); if (returnIngenico.status == "done") { clearInterval(waitingIngenico); //app.banking.protocols.android_mosstreader_run_app.success(); var thisbasket = app.terminal.getbasket(); returnIngenico.status = "empty"; try{ returnIngenico.terminalId = device.id; }catch(err){ } thisbasket["info"]["bankingData"] = returnIngenico; thisbasket["info"]["mosst"] = JSON.stringify(returnIngenico); app.terminal.paynow(thisbasket); } }, 500); } catch (err) { console.error(err); app.main.error(device.name + ": Error 7743"); // app.terminal.paynow(thisbasket); } }, success: function(json) { try{ returnIngenico = JSON.parse(json); }catch(err){ //app.main.error("Error: 8291"); } $("#bankingterminalconnectingsbox").hide(); returnIngenico.status = "done"; }, error: function(errCode) { $("#bankingterminalconnectingsbox").hide(); ingenicoUErr["1"] = lang["Oshibka_otkryti_yny88"]; ingenicoUErr["2"] = lang["Neobhodimo_otkr_ytk4i"]; ingenicoUErr["3"] = lang["Oshibka_podklyu_7bhe3"]; ingenicoUErr["4"] = lang["Terminal_vozvra_4dt5y"]; ingenicoUErr["1000"] = lang["Obschaya_oshibk_dtefh"]; ingenicoUErr["1001"] = lang["Tranzakciya_otm_zi5di"]; ingenicoUErr["1002"] = lang["Snighenie_EMV"]; ingenicoUErr["1003"] = lang["Ghurnal_tranzak_h67f2"]; ingenicoUErr["1004"] = lang["Net_svyazi_s_ho_f453y"]; ingenicoUErr["1005"] = lang["Net_bumagi_v_ba_ni9hd"]; ingenicoUErr["1006"] = lang["Oshibka_kriptok_rsiyt"]; var errorText = ingenicoUErr[errCode]; if(!errorText){ errorText = errCode; } app.main.error("Ingenico: "+lang["Ne_udalosy_prinyaty_oplatu_po_beznalu"]+"
• "+errorText); }, status: function(statusCode){ var ingenicoUStatus = {}; ingenicoUStatus["0"] = lang["kod_statusa_ned_8d6ze"]; ingenicoUStatus["1"] = lang["Karta_prochitan_4fy7k"]; ingenicoUStatus["2"] = lang["Beskontaktnaya__52645"]; ingenicoUStatus["3"] = lang["avtorizatsija"]; ingenicoUStatus["4"] = lang["Oghidanie_polyz_rbaer"]; ingenicoUStatus["5"] = lang["Pechaty"]; ingenicoUStatus["6"] = lang["Vvedite_PIN"]; ingenicoUStatus["7"] = lang["Udalite_kartu"]; ingenicoUStatus["8"] = lang["vybor_EMV_multi_223k6"]; ingenicoUStatus["9"] = lang["Oghidaet_kartu"]; var statusText = ingenicoUStatus[statusCode]; if(!statusText){ statusText = statusCode; } app.banking.modules.status(statusText); //app.main.message("Ingenico:
• "+statusText); }, returnsale: function(data) { return new Promise(function(resolve, reject) { var device = data["device"]; console.log(device); try { try { var jsonData = { protocol: "ingenico", // mosst_apk | ingenico_ua ingenico_bposlight: { command: "cardVoid", //authorization //loguot //setLanguage //cardPayment - Оплата //cardRefund - Возврат refundData: data["mosst"] } } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Не достаточно данных, ошибка 3721"); reject(); } try { var request = { method: "banking_payment", data: JSON.stringify(jsonData) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { //console.log("on test request success", response); }, onFailure: function(error_code, error_message) { //console.log("on test request Failure", error_message); } }); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); reject(); } returnIngenico.status = "empty"; try { clearInterval(waitingIngenico); } catch (err) {} var waitingIngenico = setInterval(function() { console.log("Опрашиваем Ingenico"); if (returnIngenico.status == "done") { clearInterval(waitingIngenico); //alert("Возврат выполнен"); $("#bankingterminalsbox").hide(); resolve(returnIngenico); } }, 500); } catch (err) {} }); }, closeShift: function(device_obj){ try { var merchId = ""; try{ merchId = device_obj["settings"]["bankingParams"]["merchId"]; }catch(err){ } var jsonData = { protocol: "ingenico", // mosst_apk | ingenico_ua ingenico_bposlight: { command: "closeShift", merchantID: merchId } } try { var request = { method: "banking_payment", data: JSON.stringify(jsonData) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { //console.log("on test request success", response); }, onFailure: function(error_code, error_message) { //console.log("on test request Failure", error_message); } }); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } } catch (err) { app.main.error(device.name + ": " + "Error 3722-1"); } } }, windows_ingenico_bposlight_com_2: { sendpayment: function(device) { console.log("windows_ingenico_bposlight_com",device) var merchId = ""; try{ merchId = device["settings"]["bankingParams"]["merchId"]; }catch(err){ } console.log("ingeniko merchId",merchId) var thisbasket = app.terminal.getbasket(); var visasum = $("#payvisa").val(); var cashsum = $("#paycash").val(); try { try { var jsonData = { products: [{ name: "Товар", quantity: 1, price: round(visasum, 2), }], protocol: "ingenico", // mosst_apk | ingenico_ua ingenico_bposlight: { command: "cardPayment", merchantID: merchId }, cashless: round(visasum, 2), cash: round(cashsum, 2), sum: round(thisbasket["info"]["allcena"], 2), } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Error 3722"); } try { var request = { method: "banking_payment", data: JSON.stringify(jsonData) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { //console.log("on test request success", response); }, onFailure: function(error_code, error_message) { //console.log("on test request Failure", error_message); } }); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } returnIngenico = {}; returnIngenico.status = "empty"; try { clearInterval(waitingIngenico); } catch (err) {} var waitingIngenico = setInterval(function() { console.log("Опрашиваем Ingenico"); if (returnIngenico.status == "done") { clearInterval(waitingIngenico); //app.banking.protocols.android_mosstreader_run_app.success(); var thisbasket = app.terminal.getbasket(); returnIngenico.status = "empty"; try{ returnIngenico.terminalId = device.id; }catch(err){ } thisbasket["info"]["bankingData"] = returnIngenico; thisbasket["info"]["mosst"] = JSON.stringify(returnIngenico); app.terminal.paynow(thisbasket); } }, 500); } catch (err) { console.error(err); app.main.error(device.name + ": Error 7743"); // app.terminal.paynow(thisbasket); } }, success: function(json) { try{ returnIngenico = JSON.parse(json); }catch(err){ //app.main.error("Error: 8291"); } $("#bankingterminalconnectingsbox").hide(); returnIngenico.status = "done"; }, error: function(errCode) { $("#bankingterminalconnectingsbox").hide(); ingenicoUErr["1"] = lang["Oshibka_otkryti_yny88"]; ingenicoUErr["2"] = lang["Neobhodimo_otkr_ytk4i"]; ingenicoUErr["3"] = lang["Oshibka_podklyu_7bhe3"]; ingenicoUErr["4"] = lang["Terminal_vozvra_4dt5y"]; ingenicoUErr["1000"] = lang["Obschaya_oshibk_dtefh"]; ingenicoUErr["1001"] = lang["Tranzakciya_otm_zi5di"]; ingenicoUErr["1002"] = lang["Snighenie_EMV"]; ingenicoUErr["1003"] = lang["Ghurnal_tranzak_h67f2"]; ingenicoUErr["1004"] = lang["Net_svyazi_s_ho_f453y"]; ingenicoUErr["1005"] = lang["Net_bumagi_v_ba_ni9hd"]; ingenicoUErr["1006"] = lang["Oshibka_kriptok_rsiyt"]; var errorText = ingenicoUErr[errCode]; if(!errorText){ errorText = errCode; } app.main.error("Ingenico: "+lang["Ne_udalosy_prinyaty_oplatu_po_beznalu"]+"
• "+errorText); }, status: function(statusCode){ var ingenicoUStatus = {}; ingenicoUStatus["0"] = lang["kod_statusa_ned_8d6ze"]; ingenicoUStatus["1"] = lang["Karta_prochitan_4fy7k"]; ingenicoUStatus["2"] = lang["Beskontaktnaya__52645"]; ingenicoUStatus["3"] = lang["avtorizatsija"]; ingenicoUStatus["4"] = lang["Oghidanie_polyz_rbaer"]; ingenicoUStatus["5"] = lang["Pechaty"]; ingenicoUStatus["6"] = lang["Vvedite_PIN"]; ingenicoUStatus["7"] = lang["Udalite_kartu"]; ingenicoUStatus["8"] = lang["vybor_EMV_multi_223k6"]; ingenicoUStatus["9"] = lang["Oghidaet_kartu"]; var statusText = ingenicoUStatus[statusCode]; if(!statusText){ statusText = statusCode; } app.banking.modules.status(statusText); //app.main.message("Ingenico:
• "+statusText); }, returnsale: function(data) { return new Promise(function(resolve, reject) { var device = data["device"]; console.log(device); try { try { var jsonData = { protocol: "ingenico", // mosst_apk | ingenico_ua ingenico_bposlight: { command: "cardVoid", //authorization //loguot //setLanguage //cardPayment - Оплата //cardRefund - Возврат refundData: data["mosst"] } } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Не достаточно данных, ошибка 3721"); reject(); } try { var request = { method: "banking_payment", data: JSON.stringify(jsonData) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { //console.log("on test request success", response); }, onFailure: function(error_code, error_message) { //console.log("on test request Failure", error_message); } }); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); reject(); } returnIngenico.status = "empty"; try { clearInterval(waitingIngenico); } catch (err) {} var waitingIngenico = setInterval(function() { console.log("Опрашиваем Ingenico"); if (returnIngenico.status == "done") { clearInterval(waitingIngenico); //alert("Возврат выполнен"); $("#bankingterminalsbox").hide(); resolve(returnIngenico); } }, 500); } catch (err) {} }); }, closeShift: function(device_obj){ try { var merchId = ""; try{ merchId = device_obj["settings"]["bankingParams"]["merchId"]; }catch(err){ } var jsonData = { protocol: "ingenico", // mosst_apk | ingenico_ua ingenico_bposlight: { command: "closeShift", merchantID: merchId } } try { var request = { method: "banking_payment", data: JSON.stringify(jsonData) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { //console.log("on test request success", response); }, onFailure: function(error_code, error_message) { //console.log("on test request Failure", error_message); } }); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } } catch (err) { app.main.error(device.name + ": " + "Error 3722-1"); } } }, windows_ingenico_bposlight_ip: { sendpayment: function(device) { console.log("windows_ingenico_bposlight_ip",device) var merchId = ""; try{ merchId = device["settings"]["bankingParams"]["merchId"]; }catch(err){ } console.log("ingeniko merchId",merchId) var thisbasket = app.terminal.getbasket(); var visasum = $("#payvisa").val(); var cashsum = $("#paycash").val(); try { try { var jsonData = { products: [{ name: "Товар", quantity: 1, price: round(visasum, 2), }], protocol: "ingenico", // mosst_apk | ingenico_ua ingenico_bposlight: { command: "cardPayment", merchantID: merchId }, cashless: round(visasum, 2), cash: round(cashsum, 2), sum: round(thisbasket["info"]["allcena"], 2), } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Error 3722"); } try { var request = { method: "banking_payment", data: JSON.stringify(jsonData) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { //console.log("on test request success", response); }, onFailure: function(error_code, error_message) { //console.log("on test request Failure", error_message); } }); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } returnIngenico = {}; returnIngenico.status = "empty"; try { clearInterval(waitingIngenico); } catch (err) {} var waitingIngenico = setInterval(function() { console.log("Опрашиваем Ingenico"); if (returnIngenico.status == "done") { clearInterval(waitingIngenico); //app.banking.protocols.android_mosstreader_run_app.success(); var thisbasket = app.terminal.getbasket(); returnIngenico.status = "empty"; try{ returnIngenico.terminalId = device.id; }catch(err){ } thisbasket["info"]["bankingData"] = returnIngenico; thisbasket["info"]["mosst"] = JSON.stringify(returnIngenico); app.terminal.paynow(thisbasket); } }, 500); } catch (err) { console.error(err); app.main.error(device.name + ": Error 7743"); // app.terminal.paynow(thisbasket); } }, success: function(json) { try{ returnIngenico = JSON.parse(json); }catch(err){ //app.main.error("Error: 8291"); } $("#bankingterminalconnectingsbox").hide(); returnIngenico.status = "done"; }, error: function(errCode) { $("#bankingterminalconnectingsbox").hide(); ingenicoUErr["1"] = lang["Oshibka_otkryti_yny88"]; ingenicoUErr["2"] = lang["Neobhodimo_otkr_ytk4i"]; ingenicoUErr["3"] = lang["Oshibka_podklyu_7bhe3"]; ingenicoUErr["4"] = lang["Terminal_vozvra_4dt5y"]; ingenicoUErr["1000"] = lang["Obschaya_oshibk_dtefh"]; ingenicoUErr["1001"] = lang["Tranzakciya_otm_zi5di"]; ingenicoUErr["1002"] = lang["Snighenie_EMV"]; ingenicoUErr["1003"] = lang["Ghurnal_tranzak_h67f2"]; ingenicoUErr["1004"] = lang["Net_svyazi_s_ho_f453y"]; ingenicoUErr["1005"] = lang["Net_bumagi_v_ba_ni9hd"]; ingenicoUErr["1006"] = lang["Oshibka_kriptok_rsiyt"]; var errorText = ingenicoUErr[errCode]; if(!errorText){ errorText = errCode; } app.main.error("Ingenico: "+lang["Ne_udalosy_prinyaty_oplatu_po_beznalu"]+"
• "+errorText); }, status: function(statusCode){ var ingenicoUStatus = {}; ingenicoUStatus["0"] = lang["kod_statusa_ned_8d6ze"]; ingenicoUStatus["1"] = lang["Karta_prochitan_4fy7k"]; ingenicoUStatus["2"] = lang["Beskontaktnaya__52645"]; ingenicoUStatus["3"] = lang["avtorizatsija"]; ingenicoUStatus["4"] = lang["Oghidanie_polyz_rbaer"]; ingenicoUStatus["5"] = lang["Pechaty"]; ingenicoUStatus["6"] = lang["Vvedite_PIN"]; ingenicoUStatus["7"] = lang["Udalite_kartu"]; ingenicoUStatus["8"] = lang["vybor_EMV_multi_223k6"]; ingenicoUStatus["9"] = lang["Oghidaet_kartu"]; var statusText = ingenicoUStatus[statusCode]; if(!statusText){ statusText = statusCode; } app.banking.modules.status(statusText); //app.main.message("Ingenico:
• "+statusText); }, returnsale: function(data) { return new Promise(function(resolve, reject) { var device = data["device"]; console.log(device); try { try { var jsonData = { protocol: "ingenico", // mosst_apk | ingenico_ua ingenico_bposlight: { command: "cardVoid", //authorization //loguot //setLanguage //cardPayment - Оплата //cardRefund - Возврат refundData: data["mosst"] } } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Не достаточно данных, ошибка 3721"); reject(); } try { var request = { method: "banking_payment", data: JSON.stringify(jsonData) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { //console.log("on test request success", response); }, onFailure: function(error_code, error_message) { //console.log("on test request Failure", error_message); } }); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); reject(); } returnIngenico.status = "empty"; try { clearInterval(waitingIngenico); } catch (err) {} var waitingIngenico = setInterval(function() { console.log("Опрашиваем Ingenico"); if (returnIngenico.status == "done") { clearInterval(waitingIngenico); //alert("Возврат выполнен"); $("#bankingterminalsbox").hide(); resolve(returnIngenico); } }, 500); } catch (err) {} }); }, closeShift: function(device_obj){ try { var merchId = ""; try{ merchId = device_obj["settings"]["bankingParams"]["merchId"]; }catch(err){ } var jsonData = { protocol: "ingenico", // mosst_apk | ingenico_ua ingenico_bposlight: { command: "closeShift", merchantID: merchId } } try { var request = { method: "banking_payment", data: JSON.stringify(jsonData) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { //console.log("on test request success", response); }, onFailure: function(error_code, error_message) { //console.log("on test request Failure", error_message); } }); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } } catch (err) { app.main.error(device.name + ": " + "Error 3722-1"); } } }, android_ingenico_bposlight_usb: { sendpayment: function(device) { console.log("windows_ingenico_bposlight_com",device) var merchId = ""; try{ merchId = device["settings"]["bankingParams"]["merchId"]; }catch(err){ } console.log("ingeniko merchId",merchId) var thisbasket = app.terminal.getbasket(); var visasum = $("#payvisa").val(); var cashsum = $("#paycash").val(); try { try { var jsonData = { products: [{ name: "Товар", quantity: 1, price: round(visasum, 2), }], protocol: "ingenico", // mosst_apk | ingenico_ua ingenico_bposlight: { command: "cardPayment", merchantID: merchId }, cashless: round(visasum, 2), cash: round(cashsum, 2), sum: round(thisbasket["info"]["allcena"], 2), } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Error 3722"); } try{ Android.bankingPayment(JSON.stringify(jsonData)); }catch(err){ app.main.error(device.name + ": " + "Please run on Android device") } returnIngenico = {}; returnIngenico.status = "empty"; try { clearInterval(waitingIngenico); } catch (err) {} var waitingIngenico = setInterval(function() { console.log("Опрашиваем Ingenico"); if (returnIngenico.status == "done") { clearInterval(waitingIngenico); //app.banking.protocols.android_mosstreader_run_app.success(); var thisbasket = app.terminal.getbasket(); returnIngenico.status = "empty"; try{ returnIngenico.terminalId = device.id; }catch(err){ } thisbasket["info"]["bankingData"] = returnIngenico; thisbasket["info"]["mosst"] = JSON.stringify(returnIngenico); app.terminal.paynow(thisbasket); } }, 500); } catch (err) { console.error(err); app.main.error(device.name + ": Error 7743"); // app.terminal.paynow(thisbasket); } }, success: function(json) { try{ returnIngenico = JSON.parse(json); }catch(err){ //app.main.error("Error: 8291"); } $("#bankingterminalconnectingsbox").hide(); returnIngenico.status = "done"; }, error: function(errCode) { $("#bankingterminalconnectingsbox").hide(); ingenicoUErr["1"] = lang["Oshibka_otkryti_yny88"]; ingenicoUErr["2"] = lang["Neobhodimo_otkr_ytk4i"]; ingenicoUErr["3"] = lang["Oshibka_podklyu_7bhe3"]; ingenicoUErr["4"] = lang["Terminal_vozvra_4dt5y"]; ingenicoUErr["1000"] = lang["Obschaya_oshibk_dtefh"]; ingenicoUErr["1001"] = lang["Tranzakciya_otm_zi5di"]; ingenicoUErr["1002"] = lang["Snighenie_EMV"]; ingenicoUErr["1003"] = lang["Ghurnal_tranzak_h67f2"]; ingenicoUErr["1004"] = lang["Net_svyazi_s_ho_f453y"]; ingenicoUErr["1005"] = lang["Net_bumagi_v_ba_ni9hd"]; ingenicoUErr["1006"] = lang["Oshibka_kriptok_rsiyt"]; var errorText = ingenicoUErr[errCode]; if(!errorText){ errorText = errCode; } app.main.error("Ingenico: "+lang["Ne_udalosy_prinyaty_oplatu_po_beznalu"]+"
• "+errorText); }, status: function(statusCode){ var ingenicoUStatus = {}; ingenicoUStatus["0"] = lang["kod_statusa_ned_8d6ze"]; ingenicoUStatus["1"] = lang["Karta_prochitan_4fy7k"]; ingenicoUStatus["2"] = lang["Beskontaktnaya__52645"]; ingenicoUStatus["3"] = lang["avtorizatsija"]; ingenicoUStatus["4"] = lang["Oghidanie_polyz_rbaer"]; ingenicoUStatus["5"] = lang["Pechaty"]; ingenicoUStatus["6"] = lang["Vvedite_PIN"]; ingenicoUStatus["7"] = lang["Udalite_kartu"]; ingenicoUStatus["8"] = lang["vybor_EMV_multi_223k6"]; ingenicoUStatus["9"] = lang["Oghidaet_kartu"]; var statusText = ingenicoUStatus[statusCode]; if(!statusText){ statusText = statusCode; } app.banking.modules.status(statusText); //app.main.message("Ingenico:
• "+statusText); }, returnsale: function(data) { return new Promise(function(resolve, reject) { var device = data["device"]; console.log(device); try { try { var jsonData = { protocol: "ingenico", // mosst_apk | ingenico_ua ingenico_bposlight: { command: "cardVoid", //authorization //loguot //setLanguage //cardPayment - Оплата //cardRefund - Возврат refundData: data["mosst"] } } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Не достаточно данных, ошибка 3721"); reject(); } try{ Android.bankingPayment(JSON.stringify(jsonData)); }catch(err){ app.main.error(device.name + ": " + "Please run on Android device") reject(); } returnIngenico.status = "empty"; try { clearInterval(waitingIngenico); } catch (err) {} var waitingIngenico = setInterval(function() { console.log("Опрашиваем Ingenico"); if (returnIngenico.status == "done") { clearInterval(waitingIngenico); //alert("Возврат выполнен"); $("#bankingterminalsbox").hide(); resolve(returnIngenico); } }, 500); } catch (err) {} }); }, closeShift: function(device_obj){ try { var merchId = ""; try{ merchId = device_obj["settings"]["bankingParams"]["merchId"]; }catch(err){ } var jsonData = { protocol: "ingenico", // mosst_apk | ingenico_ua ingenico_bposlight: { command: "closeShift", merchantID: merchId } } try{ Android.bankingPayment(JSON.stringify(jsonData)); }catch(err){ app.main.error(device.name + ": " + "Please run on Android device") } } catch (err) { app.main.error(device.name + ": " + "Error 3722-1"); } } }, android_ingenico_bposlight_ip: { sendpayment: function(device) { console.log("windows_ingenico_bposlight_ip",device) var merchId = ""; try{ merchId = device["settings"]["bankingParams"]["merchId"]; }catch(err){ } console.log("ingeniko merchId",merchId) var thisbasket = app.terminal.getbasket(); var visasum = $("#payvisa").val(); var cashsum = $("#paycash").val(); try { try { var jsonData = { products: [{ name: "Товар", quantity: 1, price: round(visasum, 2), }], protocol: "ingenico", // mosst_apk | ingenico_ua ingenico_bposlight: { command: "cardPayment", merchantID: merchId }, cashless: round(visasum, 2), cash: round(cashsum, 2), sum: round(thisbasket["info"]["allcena"], 2), } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Error 3722"); } try{ Android.bankingPayment(JSON.stringify(jsonData)); }catch(err){ app.main.error(device.name + ": " + "Please run on Android device") } returnIngenico = {}; returnIngenico.status = "empty"; try { clearInterval(waitingIngenico); } catch (err) {} var waitingIngenico = setInterval(function() { console.log("Опрашиваем Ingenico"); if (returnIngenico.status == "done") { clearInterval(waitingIngenico); //app.banking.protocols.android_mosstreader_run_app.success(); var thisbasket = app.terminal.getbasket(); returnIngenico.status = "empty"; try{ returnIngenico.terminalId = device.id; }catch(err){ } thisbasket["info"]["bankingData"] = returnIngenico; thisbasket["info"]["mosst"] = JSON.stringify(returnIngenico); app.terminal.paynow(thisbasket); } }, 500); } catch (err) { console.error(err); app.main.error(device.name + ": Error 7743"); // app.terminal.paynow(thisbasket); } }, success: function(json) { try{ returnIngenico = JSON.parse(json); }catch(err){ //app.main.error("Error: 8291"); } $("#bankingterminalconnectingsbox").hide(); returnIngenico.status = "done"; }, error: function(errCode) { $("#bankingterminalconnectingsbox").hide(); ingenicoUErr["1"] = lang["Oshibka_otkryti_yny88"]; ingenicoUErr["2"] = lang["Neobhodimo_otkr_ytk4i"]; ingenicoUErr["3"] = lang["Oshibka_podklyu_7bhe3"]; ingenicoUErr["4"] = lang["Terminal_vozvra_4dt5y"]; ingenicoUErr["1000"] = lang["Obschaya_oshibk_dtefh"]; ingenicoUErr["1001"] = lang["Tranzakciya_otm_zi5di"]; ingenicoUErr["1002"] = lang["Snighenie_EMV"]; ingenicoUErr["1003"] = lang["Ghurnal_tranzak_h67f2"]; ingenicoUErr["1004"] = lang["Net_svyazi_s_ho_f453y"]; ingenicoUErr["1005"] = lang["Net_bumagi_v_ba_ni9hd"]; ingenicoUErr["1006"] = lang["Oshibka_kriptok_rsiyt"]; var errorText = ingenicoUErr[errCode]; if(!errorText){ errorText = errCode; } app.main.error("Ingenico: "+lang["Ne_udalosy_prinyaty_oplatu_po_beznalu"]+"
• "+errorText); }, status: function(statusCode){ var ingenicoUStatus = {}; ingenicoUStatus["0"] = lang["kod_statusa_ned_8d6ze"]; ingenicoUStatus["1"] = lang["Karta_prochitan_4fy7k"]; ingenicoUStatus["2"] = lang["Beskontaktnaya__52645"]; ingenicoUStatus["3"] = lang["avtorizatsija"]; ingenicoUStatus["4"] = lang["Oghidanie_polyz_rbaer"]; ingenicoUStatus["5"] = lang["Pechaty"]; ingenicoUStatus["6"] = lang["Vvedite_PIN"]; ingenicoUStatus["7"] = lang["Udalite_kartu"]; ingenicoUStatus["8"] = lang["vybor_EMV_multi_223k6"]; ingenicoUStatus["9"] = lang["Oghidaet_kartu"]; var statusText = ingenicoUStatus[statusCode]; if(!statusText){ statusText = statusCode; } app.banking.modules.status(statusText); //app.main.message("Ingenico:
• "+statusText); }, returnsale: function(data) { return new Promise(function(resolve, reject) { var device = data["device"]; console.log(device); try { try { var jsonData = { protocol: "ingenico", // mosst_apk | ingenico_ua ingenico_bposlight: { command: "cardVoid", //authorization //loguot //setLanguage //cardPayment - Оплата //cardRefund - Возврат refundData: data["mosst"] } } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Не достаточно данных, ошибка 3721"); reject(); } try{ Android.bankingPayment(JSON.stringify(jsonData)); }catch(err){ app.main.error(device.name + ": " + "Please run on Android device") reject(); } returnIngenico.status = "empty"; try { clearInterval(waitingIngenico); } catch (err) {} var waitingIngenico = setInterval(function() { console.log("Опрашиваем Ingenico"); if (returnIngenico.status == "done") { clearInterval(waitingIngenico); //alert("Возврат выполнен"); $("#bankingterminalsbox").hide(); resolve(returnIngenico); } }, 500); } catch (err) {} }); }, closeShift: function(device_obj){ try { var merchId = ""; try{ merchId = device_obj["settings"]["bankingParams"]["merchId"]; }catch(err){ } var jsonData = { protocol: "ingenico", // mosst_apk | ingenico_ua ingenico_bposlight: { command: "closeShift", merchantID: merchId } } try{ Android.bankingPayment(JSON.stringify(jsonData)); }catch(err){ app.main.error(device.name + ": " + "Please run on Android device") } } catch (err) { app.main.error(device.name + ": " + "Error 3722-1"); } } }, android_sumup_sdk:{ sendpayment: function(device) { var thisbasket = app.terminal.getbasket(); var visasum = $("#payvisa").val(); var cashsum = $("#paycash").val(); try { try { var jsonData = { products: [{ name: "Товар", quantity: 1, price: round(visasum, 2), }], protocol: "sumup_sdk", // mosst_apk | ingenico_ua sumup_sdk: { command: "cardPayment", }, cashless: round(visasum, 2), cash: round(cashsum, 2), sum: round(thisbasket["info"]["allcena"], 2), } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Error 3722"); } var json = JSON.stringify(jsonData); console.log("На SumUP", json); Android.bankingPayment(json); returnIngenico = {}; returnIngenico.status = "empty"; try { clearInterval(waitingIngenico); } catch (err) {} var waitingIngenico = setInterval(function() { console.log("Опрашиваем SumUP"); if (returnIngenico.status == "done") { clearInterval(waitingIngenico); //app.banking.protocols.android_mosstreader_run_app.success(); var thisbasket = app.terminal.getbasket(); returnIngenico.status = "empty"; try{ returnIngenico.terminalId = device.id; }catch(err){ } thisbasket["info"]["mosst"] = JSON.stringify(returnIngenico); app.terminal.paynow(thisbasket); } }, 500); } catch (err) { console.error(err); app.main.error(device.name + ": Error 7743"); // app.terminal.paynow(thisbasket); } }, success: function(json) { try{ returnIngenico = JSON.parse(json); }catch(err){ //app.main.error("Error: 8291"); } $("#bankingterminalconnectingsbox").hide(); returnIngenico.status = "done"; }, error: function(errCode) { $("#bankingterminalconnectingsbox").hide(); ingenicoUErr["1"] = lang["Oshibka_otkryti_yny88"]; ingenicoUErr["2"] = lang["Neobhodimo_otkr_ytk4i"]; ingenicoUErr["3"] = lang["Oshibka_podklyu_7bhe3"]; ingenicoUErr["4"] = lang["Terminal_vozvra_4dt5y"]; ingenicoUErr["1000"] = lang["Obschaya_oshibk_dtefh"]; ingenicoUErr["1001"] = lang["Tranzakciya_otm_zi5di"]; ingenicoUErr["1002"] = lang["Snighenie_EMV"]; ingenicoUErr["1003"] = lang["Ghurnal_tranzak_h67f2"]; ingenicoUErr["1004"] = lang["Net_svyazi_s_ho_f453y"]; ingenicoUErr["1005"] = lang["Net_bumagi_v_ba_ni9hd"]; ingenicoUErr["1006"] = lang["Oshibka_kriptok_rsiyt"]; var errorText = ingenicoUErr[errCode]; if(!errorText){ errorText = errCode; } app.main.error("SumUP: "+lang["Ne_udalosy_prinyaty_oplatu_po_beznalu"]+"
• "+errorText); }, status: function(statusCode){ var ingenicoUStatus = {}; ingenicoUStatus["0"] = lang["kod_statusa_ned_8d6ze"]; ingenicoUStatus["1"] = lang["Karta_prochitan_4fy7k"]; ingenicoUStatus["2"] = lang["Beskontaktnaya__52645"]; ingenicoUStatus["3"] = lang["avtorizatsija"]; ingenicoUStatus["4"] = lang["Oghidanie_polyz_rbaer"]; ingenicoUStatus["5"] = lang["Pechaty"]; ingenicoUStatus["6"] = lang["Vvedite_PIN"]; ingenicoUStatus["7"] = lang["Udalite_kartu"]; ingenicoUStatus["8"] = lang["vybor_EMV_multi_223k6"]; ingenicoUStatus["9"] = lang["Oghidaet_kartu"]; var statusText = ingenicoUStatus[statusCode]; if(!statusText){ statusText = statusCode; } app.banking.modules.status(statusText); //app.main.message("SumUP:
• "+statusText); }, returnsale: function(data) { return new Promise(function(resolve, reject) { var device = data["device"]; console.log(device); try { try { var jsonData = { protocol: "sumup_sdk", // mosst_apk | ingenico_ua sumup_sdk: { command: "cardRefund", //authorization //loguot //setLanguage //cardPayment - Оплата //cardRefund - Возврат refundData: data["mosst"] } } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Не достаточно данных, ошибка 3721"); reject(); } var json = JSON.stringify(jsonData); console.log("На sumup_sdk", json); Android.bankingPayment(json); returnIngenico.status = "empty"; try { clearInterval(waitingIngenico); } catch (err) {} var waitingIngenico = setInterval(function() { console.log("Опрашиваем SumUP"); if (returnIngenico.status == "done") { clearInterval(waitingIngenico); //alert("Возврат выполнен"); $("#bankingterminalsbox").hide(); resolve(returnIngenico); } }, 500); } catch (err) {} }); }, closeShift: function(){ try { var jsonData = { protocol: "sumup_sdk", // mosst_apk | ingenico_ua sumup_sdk: { command: "closeShift", } } var json = JSON.stringify(jsonData); console.log("На SumUP", json); Android.bankingPayment(json); } catch (err) { app.main.error("SumUP: " + "Error 3723-2"); } }, login:function(){ try { var jsonData = { protocol: "sumup_sdk", // mosst_apk | ingenico_ua sumup_sdk: { command: "login", } } var json = JSON.stringify(jsonData); console.log("На SumUP", json); Android.bankingPayment(json); } catch (err) { app.main.error("SumUP: " + "Error 3723-2"); } }, paymentSettings:function(){ try { var jsonData = { protocol: "sumup_sdk", // mosst_apk | ingenico_ua sumup_sdk: { command: "paymentSettings", } } var json = JSON.stringify(jsonData); console.log("На SumUP", json); Android.bankingPayment(json); } catch (err) { app.main.error("SumUP: " + "Error 3723-2"); } }, logout:function(){ try { var jsonData = { protocol: "sumup_sdk", // mosst_apk | ingenico_ua sumup_sdk: { command: "logout", } } var json = JSON.stringify(jsonData); console.log("На SumUP", json); Android.bankingPayment(json); } catch (err) { app.main.error("SumUP: " + "Error 3723-2"); } }, }, smart_pos:{ init: function(){ var currencyObj = { UAH:980 } var currentCurrency = preload["settings"]["valuta"]; if(currencyObj[currentCurrency] > 0){ try { androidinit.smart_pos = { "isUsage":"true", "currency":currencyObj[currentCurrency] } } catch (err) { } }else{ alert(lang["K_soghaleniyu_V_7s8k5"]) } return androidinit; }, sendpayment: function(device) { var thisbasket = app.terminal.getbasket(); var visasum = $("#payvisa").val(); var cashsum = $("#paycash").val(); try { try { var jsonData = { products: [{ name: "Товар", quantity: 1, price: round(visasum, 2), }], protocol: "smart_pos", // mosst_apk | ingenico_ua smart_pos: { command: "cardPayment", }, cashless: round(visasum, 2), cash: round(cashsum, 2), sum: round(thisbasket["info"]["allcena"], 2), } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Error 3722"); } var json = JSON.stringify(jsonData); console.log("На SmartPos", json); Android.bankingPayment(json); returnIngenico = {}; returnIngenico.status = "empty"; try { clearInterval(waitingIngenico); } catch (err) {} var waitingIngenico = setInterval(function() { console.log("Опрашиваем SmartPos"); if (returnIngenico.status == "done") { clearInterval(waitingIngenico); //app.banking.protocols.android_mosstreader_run_app.success(); var thisbasket = app.terminal.getbasket(); returnIngenico.status = "empty"; try{ returnIngenico.terminalId = device.id; }catch(err){ } thisbasket["info"]["mosst"] = JSON.stringify(returnIngenico); app.terminal.paynow(thisbasket); } }, 500); } catch (err) { console.error(err); app.main.error(device.name + ": Error 7743"); // app.terminal.paynow(thisbasket); } }, success: function(json) { try{ returnIngenico = JSON.parse(json); }catch(err){ //app.main.error("Error: 8291"); } $("#bankingterminalconnectingsbox").hide(); returnIngenico.status = "done"; }, error: function(errCode) { $("#bankingterminalconnectingsbox").hide(); switch(currentlang){ case "ru": ingenicoUErr["0"] = "Операция отменена пользователем, либо от пользователя не было реакции в рамках установленного сервером Aria таймаута ожидания"; ingenicoUErr["1"] = "Операция отклонена хостом"; ingenicoUErr["2"] = "Операция отклонена терминалом"; ingenicoUErr["3"] = "Транзакция успешно завершена"; ingenicoUErr["4"] = "Другая ошибка"; break; case "uk": ingenicoUErr["0"] = "Операція скасована користувачем, або від користувача не було реакції в рамках встановленого сервером Aria таймаута очікування"; ingenicoUErr["1"] = "Операція відхилена хостом"; ingenicoUErr["2"] = "Операція відхилена терміналом"; ingenicoUErr["3"] = "Транзакція успішно завершена"; ingenicoUErr["4"] = "Інша помилка"; break; } var errorText = ingenicoUErr[errCode]; if(!errorText){ errorText = errCode; } app.main.error("SmartPos: "+lang["Ne_udalosy_prinyaty_oplatu_po_beznalu"]+"
• "+errorText); }, returnsale: function(data) { return new Promise(function(resolve, reject) { var device = data["device"]; console.log(device); try { try { var jsonData = { protocol: "smart_pos", // mosst_apk | ingenico_ua smart_pos: { command: "cardRefund", //authorization //loguot //setLanguage //cardPayment - Оплата //cardRefund - Возврат refundData: data["mosst"] } } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Не достаточно данных, ошибка 3721"); reject(); } var json = JSON.stringify(jsonData); console.log("На SmartPos_sdk", json); Android.bankingPayment(json); returnIngenico.status = "empty"; try { clearInterval(waitingIngenico); } catch (err) {} var waitingIngenico = setInterval(function() { console.log("Опрашиваем SmartPos"); if (returnIngenico.status == "done") { clearInterval(waitingIngenico); //alert("Возврат выполнен"); $("#bankingterminalsbox").hide(); resolve(returnIngenico); } }, 500); } catch (err) {} }); }, closeShift: function(){ try { var jsonData = { protocol: "smart_pos", // mosst_apk | ingenico_ua smart_pos: { command: "closeShift", } } var json = JSON.stringify(jsonData); console.log("На SmartPos", json); Android.bankingPayment(json); } catch (err) { app.main.error("SmartPos: " + "Error 3723-2"); } }, login:function(){ try { var jsonData = { protocol: "smart_pos", // mosst_apk | ingenico_ua smart_pos: { command: "login", } } var json = JSON.stringify(jsonData); console.log("На SmartPos", json); Android.bankingPayment(json); } catch (err) { app.main.error("SmartPos: " + "Error 3723-2"); } }, paymentSettings:function(){ try { var jsonData = { protocol: "smart_pos", // mosst_apk | ingenico_ua smart_pos: { command: "paymentSettings", } } var json = JSON.stringify(jsonData); console.log("На SmartPos", json); Android.bankingPayment(json); } catch (err) { app.main.error("SmartPos: " + "Error 3723-2"); } }, logout:function(){ try { var jsonData = { protocol: "smart_pos", // mosst_apk | ingenico_ua smart_pos: { command: "logout", } } var json = JSON.stringify(jsonData); console.log("На SmartPos", json); Android.bankingPayment(json); } catch (err) { app.main.error("SmartPos: " + "Error 3723-2"); } }, }, android_verifone_ssi_privatbank_x990:{ sendpayment: function(device) { var merchId = 0; try{ var merchval = device["settings"]["bankingParams"]["merchId"]; if(merchval > 0){ merchId = merchval; } }catch(err){ } console.log("x990 merchId",merchId) var thisbasket = app.terminal.getbasket(); var visasum = $("#payvisa").val(); var cashsum = $("#paycash").val(); try { try { var jsonData = { products: [{ name: "Товар", quantity: 1, price: round(visasum, 2), }], protocol: "ssi_privatbank", // mosst_apk | ingenico_ua deviceId:device.id, ssi_privatbank: { command: "cardPayment", merchId: merchId }, cashless: round(visasum, 2), cash: round(cashsum, 2), sum: round(thisbasket["info"]["allcena"], 2), } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Error 3722"); } var json = JSON.stringify(jsonData); console.log("На android_verifone_ssi_privatbank_x990", json); Android.bankingPayment(json); returnIngenico = {}; returnIngenico.status = "empty"; try { clearInterval(waitingIngenico); } catch (err) {} var waitingIngenico = setInterval(function() { console.log("Опрашиваем android_verifone_ssi_privatbank_x990"); if (returnIngenico.status == "done") { clearInterval(waitingIngenico); //app.banking.protocols.android_mosstreader_run_app.success(); var thisbasket = app.terminal.getbasket(); returnIngenico.status = "empty"; try{ returnIngenico.terminalId = device.id; }catch(err){ } thisbasket["info"]["bankingData"] = returnIngenico; thisbasket["info"]["mosst"] = JSON.stringify(returnIngenico); app.terminal.paynow(thisbasket); } }, 500); } catch (err) { console.error(err); app.main.error(device.name + ": Error 7743"); // app.terminal.paynow(thisbasket); } }, success: function(json) { try{ returnIngenico = JSON.parse(json); }catch(err){ //app.main.error("Error: 8291"); } $("#bankingterminalconnectingsbox").hide(); returnIngenico.status = "done"; }, error: function(errorText) { $("#bankingterminalconnectingsbox").hide(); app.main.error("SmartPos: "+lang["Ne_udalosy_prinyaty_oplatu_po_beznalu"]+"
• "+errorText); }, returnsale: function(data) { var device = data["device"]; console.log(device); try { try { var jsonData = { protocol: "ssi_privatbank", // mosst_apk | ingenico_ua ssi_privatbank: { command: "cardRefund", //authorization //loguot //setLanguage //cardPayment - Оплата //cardRefund - Возврат refundData: data["mosst"] } } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Не достаточно данных, ошибка 3721"); } var json = JSON.stringify(jsonData); console.log("На SmartPos_sdk", json); Android.bankingPayment(json); returnIngenico.status = "empty"; try { clearInterval(waitingIngenico); } catch (err) {} var waitingIngenico = setInterval(function() { console.log("Опрашиваем SmartPos"); if (returnIngenico.status == "done") { clearInterval(waitingIngenico); //alert("Возврат выполнен"); $("#bankingterminalsbox").hide(); } }, 500); } catch (err) {} }, closeShift: function(){ try { var jsonData = { protocol: "ssi_privatbank", // mosst_apk | ingenico_ua ssi_privatbank: { command: "closeShift", } } var json = JSON.stringify(jsonData); console.log("На SmartPos", json); Android.bankingPayment(json); } catch (err) { app.main.error("SmartPos: " + "Error 3723-2"); } }, login:function(){ try { var jsonData = { protocol: "ssi_privatbank", // mosst_apk | ingenico_ua ssi_privatbank: { command: "login", } } var json = JSON.stringify(jsonData); console.log("На SmartPos", json); Android.bankingPayment(json); } catch (err) { app.main.error("SmartPos: " + "Error 3723-2"); } }, paymentSettings:function(){ try { var jsonData = { protocol: "ssi_privatbank", // mosst_apk | ingenico_ua ssi_privatbank: { command: "paymentSettings", } } var json = JSON.stringify(jsonData); console.log("На SmartPos", json); Android.bankingPayment(json); } catch (err) { app.main.error("SmartPos: " + "Error 3723-2"); } }, logout:function(){ try { var jsonData = { protocol: "ssi_privatbank", // mosst_apk | ingenico_ua ssi_privatbank: { command: "logout", } } var json = JSON.stringify(jsonData); console.log("На SmartPos", json); Android.bankingPayment(json); } catch (err) { app.main.error("SmartPos: " + "Error 3723-2"); } }, }, android_ingenico_smart_sdk_ua:{ sendpayment: function(device) { var thisbasket = app.terminal.getbasket(); var visasum = $("#payvisa").val(); var cashsum = $("#paycash").val(); try { try { var jsonData = { products: [{ name: "Товар", quantity: 1, price: round(visasum, 2), }], protocol: "ingenico_apos", // mosst_apk | ingenico_ua ingenico_apos: { command: "cardPayment", currency:"UAH" }, cashless: round(visasum, 2), cash: round(cashsum, 2), sum: round(thisbasket["info"]["allcena"], 2), } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Error 3722"); } var json = JSON.stringify(jsonData); console.log("На SmartPos", json); Android.bankingPayment(json); returnIngenico = {}; returnIngenico.status = "empty"; try { clearInterval(waitingIngenico); } catch (err) {} var waitingIngenico = setInterval(function() { console.log("Опрашиваем SmartPos"); if (returnIngenico.status == "done") { clearInterval(waitingIngenico); //app.banking.protocols.android_mosstreader_run_app.success(); var thisbasket = app.terminal.getbasket(); returnIngenico.status = "empty"; try{ returnIngenico.terminalId = device.id; }catch(err){ } thisbasket["info"]["bankingData"] = returnIngenico; thisbasket["info"]["mosst"] = JSON.stringify(returnIngenico); app.terminal.paynow(thisbasket); } }, 500); } catch (err) { console.error(err); app.main.error(device.name + ": Error 7743"); // app.terminal.paynow(thisbasket); } }, success: function(json) { try{ returnIngenico = JSON.parse(json); }catch(err){ //app.main.error("Error: 8291"); } $("#bankingterminalconnectingsbox").hide(); returnIngenico.status = "done"; }, error: function(errCode) { $("#bankingterminalconnectingsbox").hide(); ingenicoUErr["0"] = "TID NOT AVAILABLE"; ingenicoUErr["1"] = "DECLINED"; ingenicoUErr["2"] = "NOT_ALLOWED"; ingenicoUErr["3"] = "UNKNOWN ERROR"; var errorText = ingenicoUErr[errCode]; if(!errorText){ errorText = errCode; } app.main.error("Ingenico: "+lang["Ne_udalosy_prinyaty_oplatu_po_beznalu"]+"
• "+errorText); }, returnsale: function(data) { return new Promise(function(resolve, reject) { var device = data["device"]; console.log(device); try { try { var jsonData = { protocol: "ingenico_apos", // mosst_apk | ingenico_ua ingenico_apos: { command: "cardRefund", //authorization //loguot //setLanguage //cardPayment - Оплата //cardRefund - Возврат currency:"UAH", aposRefundData: data["mosst"]["aposRefundData"] }, cashless: round(data.document.info.visa, 2), //cash: round(data.document.info.cash, 2), //sum: round(data.document.info.cenaout, 2), } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Не достаточно данных, ошибка 3721"); reject(); } var json = JSON.stringify(jsonData); console.log("На SmartPos_sdk", json); Android.bankingPayment(json); returnIngenico.status = "empty"; try { clearInterval(waitingIngenico); } catch (err) {} var waitingIngenico = setInterval(function() { console.log("Опрашиваем SmartPos"); if (returnIngenico.status == "done") { clearInterval(waitingIngenico); //alert("Возврат выполнен"); $("#bankingterminalsbox").hide(); resolve(returnIngenico); } }, 500); } catch (err) {} }); }, closeShift: function(){ // try { // var jsonData = { // protocol: "ingenico_apos", // mosst_apk | ingenico_ua // ingenico_apos: { // command: "closeShift", // currency:"UAH" // } // } // var json = JSON.stringify(jsonData); // console.log("На SmartPos", json); // Android.bankingPayment(json); // } catch (err) { // app.main.error("Ingenico: " + "Error 3723-2"); // } }, login:function(){ }, paymentSettings:function(){ }, logout:function(){ }, }, android_ingenico_smart_sdk_ua_2:{ sendpayment: function(device) { var thisbasket = app.terminal.getbasket(); var visasum = $("#payvisa").val(); var cashsum = $("#paycash").val(); try { try { var jsonData = { products: [{ name: "Товар", quantity: 1, price: round(visasum, 2), }], protocol: "android_ingenico_smart_sdk_ua_2", // mosst_apk | ingenico_ua ingenico_apos: { command: "cardPayment", currency:"UAH" }, deviceId:device.id, cashless: round(visasum, 2), cash: round(cashsum, 2), sum: round(thisbasket["info"]["allcena"], 2), } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Error 3722"); } var json = JSON.stringify(jsonData); console.log("На SmartPos", json); Android.bankingPayment(json); returnIngenico = {}; returnIngenico.status = "empty"; try { clearInterval(waitingIngenico); } catch (err) {} var waitingIngenico = setInterval(function() { console.log("Опрашиваем SmartPos"); if (returnIngenico.status == "done") { clearInterval(waitingIngenico); //app.banking.protocols.android_mosstreader_run_app.success(); var thisbasket = app.terminal.getbasket(); returnIngenico.status = "empty"; try{ returnIngenico.terminalId = device.id; }catch(err){ } thisbasket["info"]["bankingData"] = returnIngenico; thisbasket["info"]["mosst"] = JSON.stringify(returnIngenico); app.terminal.paynow(thisbasket); } }, 500); } catch (err) { console.error(err); app.main.error(device.name + ": Error 7743"); // app.terminal.paynow(thisbasket); } }, success: function(json) { try{ var resultData = JSON.parse(json); returnIngenico = resultData.resultData; returnIngenico.bankName = "Банк"; }catch(err){ //app.main.error("Error: 8291"); } $("#bankingterminalconnectingsbox").hide(); returnIngenico.status = "done"; }, error: function(errCode) { $("#bankingterminalconnectingsbox").hide(); ingenicoUErr["0"] = "TID NOT AVAILABLE"; ingenicoUErr["1"] = "DECLINED"; ingenicoUErr["2"] = "NOT_ALLOWED"; ingenicoUErr["3"] = "UNKNOWN ERROR"; var errorText = ingenicoUErr[errCode]; if(!errorText){ errorText = errCode; } app.main.error("Ingenico: "+lang["Ne_udalosy_prinyaty_oplatu_po_beznalu"]+"
• "+errorText); }, returnsale: function(data) { return new Promise(function(resolve, reject) { var device = data["device"]; console.log(device); try { try { var jsonData = { protocol: "android_ingenico_smart_sdk_ua_2", // mosst_apk | ingenico_ua ingenico_apos: { command: "cardRefund", //authorization //loguot //setLanguage //cardPayment - Оплата //cardRefund - Возврат currency:"UAH", aposRefundData: data["mosst"]["resultData"]["aposRefundData"] }, deviceId:device.id, cashless: round(data.document.info.visa, 2), //cash: round(data.document.info.cash, 2), //sum: round(data.document.info.cenaout, 2), } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Не достаточно данных, ошибка 3721"); reject(); } var json = JSON.stringify(jsonData); console.log("На SmartPos_sdk", json); Android.bankingPayment(json); returnIngenico.status = "empty"; try { clearInterval(waitingIngenico); } catch (err) {} var waitingIngenico = setInterval(function() { console.log("Опрашиваем SmartPos"); if (returnIngenico.status == "done") { clearInterval(waitingIngenico); //alert("Возврат выполнен"); $("#bankingterminalsbox").hide(); resolve(returnIngenico); } }, 500); } catch (err) {} }); }, closeShift: function(){ // try { // var jsonData = { // protocol: "ingenico_apos", // mosst_apk | ingenico_ua // ingenico_apos: { // command: "closeShift", // currency:"UAH" // } // } // var json = JSON.stringify(jsonData); // console.log("На SmartPos", json); // Android.bankingPayment(json); // } catch (err) { // app.main.error("Ingenico: " + "Error 3723-2"); // } }, login:function(){ }, paymentSettings:function(){ }, logout:function(){ }, }, windows_verifone_ip: { sendpayment: function(device) { var merchId = 0; try{ var merchval = device["settings"]["bankingParams"]["merchId"]; if(merchval > 0){ merchId = merchval; } }catch(err){ } console.log("verifone merchId",merchId) var thisbasket = app.terminal.getbasket(); var visasum = $("#payvisa").val(); var cashsum = $("#paycash").val(); try { try { var jsonData = { products: [{ name: "Товар", quantity: 1, price: round(visasum, 2), }], protocol: "verifone", // mosst_apk | ingenico_ua verifone: { command: "cardPayment", merchId: merchId }, cashless: round(visasum, 2), cash: round(cashsum, 2), sum: round(thisbasket["info"]["allcena"], 2), } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Error 3722"); } console.log("На verifone", jsonData); try { var request = { method: "banking_payment", data: JSON.stringify(jsonData) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { //console.log("on test request success", response); }, onFailure: function(error_code, error_message) { //console.log("on test request Failure", error_message); } }); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } returnVerifone = {}; returnVerifone.status = "empty"; try { clearInterval(waitingVerifone); } catch (err) {} var waitingVerifone = setInterval(function() { console.log("Опрашиваем Verifone"); if (returnVerifone.status == "done") { clearInterval(waitingVerifone); var thisbasket = app.terminal.getbasket(); returnVerifone.status = "empty"; try{ returnVerifone.terminalId = device.id; }catch(err){ } thisbasket["info"]["bankingData"] = returnVerifone; thisbasket["info"]["mosst"] = JSON.stringify(returnVerifone); app.terminal.paynow(thisbasket); } }, 500); } catch (err) { console.error(err); app.main.error(device.name + ": Error 7743"); // app.terminal.paynow(thisbasket); } }, success: function(json) { try{ returnVerifone = JSON.parse(json); }catch(err){ //app.main.error("Error: 8291"); } $("#bankingterminalconnectingsbox").hide(); returnVerifone.status = "done"; }, error: function(errCode) { $("#bankingterminalconnectingsbox").hide(); verifoneUErr = { "03" : "Format error", "04" : "Retain card", "05" : "External decline", "12" : "Invalid transaction", "13" : "Merchant limit exceeded 14 – Invalid track 2", "20" : "Verification fault", "30" : "Invalid format", "33" : "Expired card", "54" : "Expired card", "41" : "Lost card", "43" : "Stolen card", "51" : "Insufficient funds", "55" : "Invalid PIN, PIN tries exceeded", "58" : "Invalid processing code", "62" : "Invalid MAC", "78" : "Original request not found", "81" : "Wrong format of customer information field 82 – Prepaid code not found", "89" : "Invalid terminal id", "91" : "Destination not available", "94" : "Duplicate transmission", "96" : "System error", //Для привата "1000" : "General error (should be used in exceptional case)", "1001" : "Transaction canceled by user", "1002" : "EMV Decline", "1003" : "Transaction log is full. Need close batch", "1004" : "No connection with host", "1005" : "No paper in printer", "1006" : "Error Crypto keys", "1007" : "Card reader is not connected", "1008" : "Transaction is already complete" }; var errorText = verifoneUErr[errCode]; if(!errorText){ errorText = errCode; } app.main.error("Verifone: "+lang["Ne_udalosy_prinyaty_oplatu_po_beznalu"]+"
• "+errorText); }, status: function(statusText){ app.banking.modules.status(statusText); //app.main.message("Verifone:
• "+statusText); }, statuscode: function(statusCode){ var statusCodes = { "0" : "status code is not available", "1" : "card was read", "2" : "used a chip card", "3" : "authorization in progress", "4" : "waiting for cashier action", "5" : "printing receipt", "6" : "pin entry is needed", "7" : "card was removed", "8" : "EMV multi aid’s", "9" : "waiting for card", "10" : "in progress", "11" : "correct transaction", "12" : "Pin input wait key", "13" : "Pin input backspace pressed", "14" : "Pin input key pressed" } app.banking.modules.status(statusCodes[statusCode]); }, returnsale: function(data) { return new Promise(function(resolve, reject) { var device = data["device"]; console.log(device); try { try { var jsonData = { protocol: "verifone", // mosst_apk | ingenico_ua verifone: { command: "cardRefund", //authorization //loguot //setLanguage //cardPayment - Оплата //cardRefund - Возврат refundData: data["mosst"] } } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Не достаточно данных, ошибка 3721"); reject(); } console.log("На verifone", jsonData); try { var request = { method: "banking_payment", data: JSON.stringify(jsonData) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { //console.log("on test request success", response); }, onFailure: function(error_code, error_message) { //console.log("on test request Failure", error_message); } }); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); reject(); } returnVerifone.status = "empty"; try { clearInterval(waitingVerifone); } catch (err) {} var waitingVerifone = setInterval(function() { console.log("Опрашиваем Verifone"); if (returnVerifone.status == "done") { clearInterval(waitingVerifone); //alert("Возврат выполнен"); $("#bankingterminalsbox").hide(); resolve(returnVerifone); } }, 500); } catch (err) {} }); }, closeShift: function(){ try { var jsonData = { protocol: "verifone", // mosst_apk | ingenico_ua verifone: { command: "closeShift", } } console.log("На verifone", jsonData); try { var request = { method: "banking_payment", data: JSON.stringify(jsonData) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { //console.log("on test request success", response); }, onFailure: function(error_code, error_message) { //console.log("on test request Failure", error_message); } }); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } } catch (err) { app.main.error(device.name + ": " + "Error 3722-1"); } } }, windows_verifone_ip_2: { sendpayment: function(device) { var merchId = 0; try{ var merchval = device["settings"]["bankingParams"]["merchId"]; if(merchval > 0){ merchId = merchval; } }catch(err){ } console.log("verifone merchId",merchId) var thisbasket = app.terminal.getbasket(); var visasum = $("#payvisa").val(); var cashsum = $("#paycash").val(); try { try { var jsonData = { products: [{ name: "Товар", quantity: 1, price: round(visasum, 2), }], protocol: "windows_verifone_ip_2", // mosst_apk | ingenico_ua verifone: { command: "cardPayment", merchId: merchId }, deviceId: device.id, cashless: round(visasum, 2), cash: round(cashsum, 2), sum: round(thisbasket["info"]["allcena"], 2), } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Error 3722"); } console.log("На verifone", jsonData); try { var request = { method: "banking_payment", data: JSON.stringify(jsonData) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { //console.log("on test request success", response); }, onFailure: function(error_code, error_message) { //console.log("on test request Failure", error_message); } }); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } returnVerifone = {}; returnVerifone.status = "empty"; try { clearInterval(waitingVerifone); } catch (err) {} var waitingVerifone = setInterval(function() { console.log("Опрашиваем Verifone"); if (returnVerifone.status == "done") { clearInterval(waitingVerifone); var thisbasket = app.terminal.getbasket(); returnVerifone.status = "empty"; try{ returnVerifone.terminalId = device.id; }catch(err){ } thisbasket["info"]["bankingData"] = returnVerifone; thisbasket["info"]["mosst"] = JSON.stringify(returnVerifone); app.terminal.paynow(thisbasket); } }, 500); } catch (err) { console.error(err); app.main.error(device.name + ": Error 7743"); // app.terminal.paynow(thisbasket); } }, success: function(json) { try{ returnVerifone = JSON.parse(json); }catch(err){ //app.main.error("Error: 8291"); } $("#bankingterminalconnectingsbox").hide(); returnVerifone.status = "done"; }, error: function(errCode) { $("#bankingterminalconnectingsbox").hide(); verifoneUErr = { "03" : "Format error", "04" : "Retain card", "05" : "External decline", "12" : "Invalid transaction", "13" : "Merchant limit exceeded 14 – Invalid track 2", "20" : "Verification fault", "30" : "Invalid format", "33" : "Expired card", "54" : "Expired card", "41" : "Lost card", "43" : "Stolen card", "51" : "Insufficient funds", "55" : "Invalid PIN, PIN tries exceeded", "58" : "Invalid processing code", "62" : "Invalid MAC", "78" : "Original request not found", "81" : "Wrong format of customer information field 82 – Prepaid code not found", "89" : "Invalid terminal id", "91" : "Destination not available", "94" : "Duplicate transmission", "96" : "System error", //Для привата "1000" : "General error (should be used in exceptional case)", "1001" : "Transaction canceled by user", "1002" : "EMV Decline", "1003" : "Transaction log is full. Need close batch", "1004" : "No connection with host", "1005" : "No paper in printer", "1006" : "Error Crypto keys", "1007" : "Card reader is not connected", "1008" : "Transaction is already complete" }; var errorText = verifoneUErr[errCode]; if(!errorText){ errorText = errCode; } app.main.error("Verifone: "+lang["Ne_udalosy_prinyaty_oplatu_po_beznalu"]+"
• "+errorText); }, status: function(statusText){ app.banking.modules.status(statusText); //app.main.message("Verifone:
• "+statusText); }, statuscode: function(statusCode){ var statusCodes = { "0" : "status code is not available", "1" : "card was read", "2" : "used a chip card", "3" : "authorization in progress", "4" : "waiting for cashier action", "5" : "printing receipt", "6" : "pin entry is needed", "7" : "card was removed", "8" : "EMV multi aid’s", "9" : "waiting for card", "10" : "in progress", "11" : "correct transaction", "12" : "Pin input wait key", "13" : "Pin input backspace pressed", "14" : "Pin input key pressed", "1001" : "Продаж", "1002" : "Повернення", "1003" : "Відміна", "1004" : "Закриття зміни" } app.banking.modules.status(statusCodes[statusCode]); }, returnsale: function(data) { return new Promise(function(resolve, reject) { var device = data["device"]; console.log(device); try { try { var jsonData = { protocol: "windows_verifone_ip_2", // mosst_apk | ingenico_ua deviceId: device.id, verifone: { command: "cardRefund", //authorization //loguot //setLanguage //cardPayment - Оплата //cardRefund - Возврат refundData: data["mosst"] } } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Не достаточно данных, ошибка 3721"); reject(); } console.log("На verifone", jsonData); try { var request = { method: "banking_payment", data: JSON.stringify(jsonData) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { //console.log("on test request success", response); }, onFailure: function(error_code, error_message) { //console.log("on test request Failure", error_message); } }); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); reject(); } returnVerifone.status = "empty"; try { clearInterval(waitingVerifone); } catch (err) {} var waitingVerifone = setInterval(function() { console.log("Опрашиваем Verifone"); if (returnVerifone.status == "done") { clearInterval(waitingVerifone); //alert("Возврат выполнен"); $("#bankingterminalsbox").hide(); resolve(returnVerifone); } }, 500); } catch (err) {} }); }, closeShift: function(device){ try { var jsonData = { protocol: "windows_verifone_ip_2", // mosst_apk | ingenico_ua deviceId: device.id, verifone: { command: "closeShift", } } console.log("На verifone", jsonData); try { var request = { method: "banking_payment", data: JSON.stringify(jsonData) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { //console.log("on test request success", response); }, onFailure: function(error_code, error_message) { //console.log("on test request Failure", error_message); } }); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } } catch (err) { app.main.error(device.name + ": " + "Error 3722-1"); } } }, android_verifone_ip: { sendpayment: function(device) { var merchId = 0; try{ var merchval = device["settings"]["bankingParams"]["merchId"]; if(merchval > 0){ merchId = merchval; } }catch(err){ } console.log("verifone merchId",merchId) var thisbasket = app.terminal.getbasket(); var visasum = $("#payvisa").val(); var cashsum = $("#paycash").val(); try { try { var jsonData = { products: [{ name: "Товар", quantity: 1, price: round(visasum, 2), }], protocol: "verifone", // mosst_apk | ingenico_ua verifone: { command: "cardPayment", merchId: merchId }, cashless: round(visasum, 2), cash: round(cashsum, 2), sum: round(thisbasket["info"]["allcena"], 2), } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Error 3722"); } console.log("На verifone", jsonData); try { var json = JSON.stringify(jsonData); Android.bankingPayment(json); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } returnVerifone = {}; returnVerifone.status = "empty"; try { clearInterval(waitingVerifone); } catch (err) {} var waitingVerifone = setInterval(function() { console.log("Опрашиваем Verifone"); if (returnVerifone.status == "done") { clearInterval(waitingVerifone); var thisbasket = app.terminal.getbasket(); returnVerifone.status = "empty"; try{ returnVerifone.terminalId = device.id; }catch(err){ } thisbasket["info"]["bankingData"] = returnVerifone; thisbasket["info"]["mosst"] = JSON.stringify(returnVerifone); app.terminal.paynow(thisbasket); } }, 500); } catch (err) { console.error(err); app.main.error(device.name + ": Error 7743"); // app.terminal.paynow(thisbasket); } }, success: function(json) { try{ var temp = JSON.parse(json); }catch(err){ app.main.error("Error: Ошибка парсина ответа от терминала"); } try{ returnVerifone = temp; }catch(err){ app.main.error("Error: 8291"); } $("#bankingterminalconnectingsbox").hide(); returnVerifone.status = "done"; }, error: function(errCode) { $("#bankingterminalconnectingsbox").hide(); verifoneUErr = { "03" : "Format error", "04" : "Retain card", "05" : "External decline", "12" : "Invalid transaction", "13" : "Merchant limit exceeded 14 – Invalid track 2", "20" : "Verification fault", "30" : "Invalid format", "33" : "Expired card", "54" : "Expired card", "41" : "Lost card", "43" : "Stolen card", "51" : "Insufficient funds", "55" : "Invalid PIN, PIN tries exceeded", "58" : "Invalid processing code", "62" : "Invalid MAC", "78" : "Original request not found", "81" : "Wrong format of customer information field 82 – Prepaid code not found", "89" : "Invalid terminal id", "91" : "Destination not available", "94" : "Duplicate transmission", "96" : "System error", //Для привата "1000" : "General error (should be used in exceptional case)", "1001" : "Transaction canceled by user", "1002" : "EMV Decline", "1003" : "Transaction log is full. Need close batch", "1004" : "No connection with host", "1005" : "No paper in printer", "1006" : "Error Crypto keys", "1007" : "Card reader is not connected", "1008" : "Transaction is already complete" }; var errorText = verifoneUErr[errCode]; if(!errorText){ errorText = errCode; } app.main.error("Verifone: "+lang["Ne_udalosy_prinyaty_oplatu_po_beznalu"]+"
• "+errorText); }, status: function(statusText){ app.banking.modules.status(statusText); //app.main.message("Verifone:
• "+statusText); }, statuscode: function(statusCode){ var statusCodes = { "0" : "status code is not available", "1" : "card was read", "2" : "used a chip card", "3" : "authorization in progress", "4" : "waiting for cashier action", "5" : "printing receipt", "6" : "pin entry is needed", "7" : "card was removed", "8" : "EMV multi aid’s", "9" : "waiting for card", "10" : "in progress", "11" : "correct transaction", "12" : "Pin input wait key", "13" : "Pin input backspace pressed", "14" : "Pin input key pressed" } app.banking.modules.status(statusCodes[statusCode]); }, returnsale: function(data) { return new Promise(function(resolve, reject) { var device = data["device"]; console.log(device); try { try { var jsonData = { protocol: "verifone", // mosst_apk | ingenico_ua verifone: { command: "cardRefund", //authorization //loguot //setLanguage //cardPayment - Оплата //cardRefund - Возврат refundData: data["mosst"] } } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Не достаточно данных, ошибка 3721"); reject(); } console.log("На verifone", jsonData); try { var json = JSON.stringify(jsonData); Android.bankingPayment(json); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); reject(); } returnVerifone.status = "empty"; try { clearInterval(waitingVerifone); } catch (err) {} var waitingVerifone = setInterval(function() { console.log("Опрашиваем Verifone"); if (returnVerifone.status == "done") { clearInterval(waitingVerifone); //alert("Возврат выполнен"); $("#bankingterminalsbox").hide(); resolve(returnVerifone); } }, 500); } catch (err) {} }); }, closeShift: function(){ try { var jsonData = { protocol: "verifone", // mosst_apk | ingenico_ua verifone: { command: "closeShift", } } console.log("На verifone", jsonData); try { var json = JSON.stringify(jsonData); Android.bankingPayment(json); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } } catch (err) { app.main.error(device.name + ": " + "Error 3722-1"); } } }, android_verifone_ip_2: { sendpayment: function(device) { var merchId = 0; try{ var merchval = device["settings"]["bankingParams"]["merchId"]; if(merchval > 0){ merchId = merchval; } }catch(err){ } console.log("verifone merchId",merchId) var thisbasket = app.terminal.getbasket(); var visasum = $("#payvisa").val(); var cashsum = $("#paycash").val(); try { try { var jsonData = { products: [{ name: "Товар", quantity: 1, price: round(visasum, 2), }], protocol: "android_verifone_ip_2", // mosst_apk | ingenico_ua verifone: { command: "cardPayment", merchId: merchId }, deviceId:device.id, cashless: round(visasum, 2), cash: round(cashsum, 2), sum: round(thisbasket["info"]["allcena"], 2), } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Error 3722"); } console.log("На verifone", jsonData); try { var json = JSON.stringify(jsonData); Android.bankingPayment(json); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } returnVerifone = {}; returnVerifone.status = "empty"; try { clearInterval(waitingVerifone); } catch (err) {} var waitingVerifone = setInterval(function() { console.log("Опрашиваем Verifone"); if (returnVerifone.status == "done") { clearInterval(waitingVerifone); var thisbasket = app.terminal.getbasket(); returnVerifone.status = "empty"; try{ returnVerifone.terminalId = device.id; }catch(err){ } thisbasket["info"]["bankingData"] = returnVerifone; thisbasket["info"]["mosst"] = JSON.stringify(returnVerifone); app.terminal.paynow(thisbasket); } }, 500); } catch (err) { console.error(err); app.main.error(device.name + ": Error 7743"); // app.terminal.paynow(thisbasket); } }, success: function(json) { try{ var temp = JSON.parse(json); }catch(err){ app.main.error("Error: Ошибка парсина ответа от терминала"); } try{ returnVerifone = temp; }catch(err){ app.main.error("Error: 8291"); } $("#bankingterminalconnectingsbox").hide(); returnVerifone.status = "done"; }, error: function(errCode) { $("#bankingterminalconnectingsbox").hide(); verifoneUErr = { "03" : "Format error", "04" : "Retain card", "05" : "External decline", "12" : "Invalid transaction", "13" : "Merchant limit exceeded 14 – Invalid track 2", "20" : "Verification fault", "30" : "Invalid format", "33" : "Expired card", "54" : "Expired card", "41" : "Lost card", "43" : "Stolen card", "51" : "Insufficient funds", "55" : "Invalid PIN, PIN tries exceeded", "58" : "Invalid processing code", "62" : "Invalid MAC", "78" : "Original request not found", "81" : "Wrong format of customer information field 82 – Prepaid code not found", "89" : "Invalid terminal id", "91" : "Destination not available", "94" : "Duplicate transmission", "96" : "System error", //Для привата "1000" : "General error (should be used in exceptional case)", "1001" : "Transaction canceled by user", "1002" : "EMV Decline", "1003" : "Transaction log is full. Need close batch", "1004" : "No connection with host", "1005" : "No paper in printer", "1006" : "Error Crypto keys", "1007" : "Card reader is not connected", "1008" : "Transaction is already complete" }; var errorText = verifoneUErr[errCode]; if(!errorText){ errorText = errCode; } app.main.error("Verifone: "+lang["Ne_udalosy_prinyaty_oplatu_po_beznalu"]+"
• "+errorText); }, status: function(statusText){ app.banking.modules.status(statusText); //app.main.message("Verifone:
• "+statusText); }, statuscode: function(statusCode){ var statusCodes = { "0" : "status code is not available", "1" : "card was read", "2" : "used a chip card", "3" : "authorization in progress", "4" : "waiting for cashier action", "5" : "printing receipt", "6" : "pin entry is needed", "7" : "card was removed", "8" : "EMV multi aid’s", "9" : "waiting for card", "10" : "in progress", "11" : "correct transaction", "12" : "Pin input wait key", "13" : "Pin input backspace pressed", "14" : "Pin input key pressed", "1001" : "Продаж", "1002" : "Повернення", "1003" : "Відміна", "1004" : "Закриття зміни" } app.banking.modules.status(statusCodes[statusCode]); }, returnsale: function(data) { return new Promise(function(resolve, reject) { var device = data["device"]; console.log(device); try { try { var jsonData = { protocol: "android_verifone_ip_2", // mosst_apk | ingenico_ua deviceId:device.id, verifone: { command: "cardRefund", //authorization //loguot //setLanguage //cardPayment - Оплата //cardRefund - Возврат refundData: data["mosst"] } } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Не достаточно данных, ошибка 3721"); reject(); } console.log("На verifone", jsonData); try { var json = JSON.stringify(jsonData); Android.bankingPayment(json); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); reject(); } returnVerifone.status = "empty"; try { clearInterval(waitingVerifone); } catch (err) {} var waitingVerifone = setInterval(function() { console.log("Опрашиваем Verifone"); if (returnVerifone.status == "done") { clearInterval(waitingVerifone); //alert("Возврат выполнен"); $("#bankingterminalsbox").hide(); resolve(returnVerifone); } }, 500); } catch (err) {} }); }, closeShift: function(device){ try { var jsonData = { protocol: "android_verifone_ip_2", // mosst_apk | ingenico_ua deviceId: device.id, verifone: { command: "closeShift", } } console.log("На verifone", jsonData); try { var json = JSON.stringify(jsonData); Android.bankingPayment(json); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } } catch (err) { app.main.error(device.name + ": " + "Error 3722-1"); } } }, android_verifone_usb: { sendpayment: function(device) { var merchId = 0; try{ var merchval = device["settings"]["bankingParams"]["merchId"]; if(merchval > 0){ merchId = merchval; } }catch(err){ } console.log("verifone merchId",merchId) var thisbasket = app.terminal.getbasket(); var visasum = $("#payvisa").val(); var cashsum = $("#paycash").val(); try { try { var jsonData = { products: [{ name: "Товар", quantity: 1, price: round(visasum, 2), }], protocol: "verifone", // mosst_apk | ingenico_ua verifone: { command: "cardPayment", merchId: merchId }, cashless: round(visasum, 2), cash: round(cashsum, 2), sum: round(thisbasket["info"]["allcena"], 2), } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Error 3722"); } console.log("На verifone", jsonData); try { var json = JSON.stringify(jsonData); Android.bankingPayment(json); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } returnVerifone = {}; returnVerifone.status = "empty"; try { clearInterval(waitingVerifone); } catch (err) {} var waitingVerifone = setInterval(function() { console.log("Опрашиваем Verifone"); if (returnVerifone.status == "done") { clearInterval(waitingVerifone); var thisbasket = app.terminal.getbasket(); returnVerifone.status = "empty"; try{ returnVerifone.terminalId = device.id; }catch(err){ } thisbasket["info"]["bankingData"] = returnVerifone; thisbasket["info"]["mosst"] = JSON.stringify(returnVerifone); app.terminal.paynow(thisbasket); } }, 500); } catch (err) { console.error(err); app.main.error(device.name + ": Error 7743"); // app.terminal.paynow(thisbasket); } }, success: function(json) { try{ var temp = JSON.parse(json); }catch(err){ app.main.error("Error: Ошибка парсина ответа от терминала"); } try{ returnVerifone = temp; }catch(err){ app.main.error("Error: 8291"); } $("#bankingterminalconnectingsbox").hide(); returnVerifone.status = "done"; }, error: function(errCode) { $("#bankingterminalconnectingsbox").hide(); verifoneUErr = { "03" : "Format error", "04" : "Retain card", "05" : "External decline", "12" : "Invalid transaction", "13" : "Merchant limit exceeded 14 – Invalid track 2", "20" : "Verification fault", "30" : "Invalid format", "33" : "Expired card", "54" : "Expired card", "41" : "Lost card", "43" : "Stolen card", "51" : "Insufficient funds", "55" : "Invalid PIN, PIN tries exceeded", "58" : "Invalid processing code", "62" : "Invalid MAC", "78" : "Original request not found", "81" : "Wrong format of customer information field 82 – Prepaid code not found", "89" : "Invalid terminal id", "91" : "Destination not available", "94" : "Duplicate transmission", "96" : "System error", //Для привата "1000" : "General error (should be used in exceptional case)", "1001" : "Transaction canceled by user", "1002" : "EMV Decline", "1003" : "Transaction log is full. Need close batch", "1004" : "No connection with host", "1005" : "No paper in printer", "1006" : "Error Crypto keys", "1007" : "Card reader is not connected", "1008" : "Transaction is already complete" }; var errorText = verifoneUErr[errCode]; if(!errorText){ errorText = errCode; } app.main.error("Verifone: "+lang["Ne_udalosy_prinyaty_oplatu_po_beznalu"]+"
• "+errorText); }, status: function(statusText){ app.banking.modules.status(statusText); //app.main.message("Verifone:
• "+statusText); }, statuscode: function(statusCode){ var statusCodes = { "0" : "status code is not available", "1" : "card was read", "2" : "used a chip card", "3" : "authorization in progress", "4" : "waiting for cashier action", "5" : "printing receipt", "6" : "pin entry is needed", "7" : "card was removed", "8" : "EMV multi aid’s", "9" : "waiting for card", "10" : "in progress", "11" : "correct transaction", "12" : "Pin input wait key", "13" : "Pin input backspace pressed", "14" : "Pin input key pressed" } app.banking.modules.status(statusCodes[statusCode]); }, returnsale: function(data) { return new Promise(function(resolve, reject) { var device = data["device"]; console.log(device); try { try { var jsonData = { protocol: "verifone", // mosst_apk | ingenico_ua verifone: { command: "cardRefund", //authorization //loguot //setLanguage //cardPayment - Оплата //cardRefund - Возврат refundData: data["mosst"] } } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Не достаточно данных, ошибка 3721"); reject(); } console.log("На verifone", jsonData); try { var json = JSON.stringify(jsonData); Android.bankingPayment(json); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); reject(); } returnVerifone.status = "empty"; try { clearInterval(waitingVerifone); } catch (err) {} var waitingVerifone = setInterval(function() { console.log("Опрашиваем Verifone"); if (returnVerifone.status == "done") { clearInterval(waitingVerifone); //alert("Возврат выполнен"); $("#bankingterminalsbox").hide(); resolve(returnVerifone); } }, 500); } catch (err) {} }); }, closeShift: function(){ try { var jsonData = { protocol: "verifone", // mosst_apk | ingenico_ua verifone: { command: "closeShift", } } console.log("На verifone", jsonData); try { var json = JSON.stringify(jsonData); Android.bankingPayment(json); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } } catch (err) { app.main.error(device.name + ": " + "Error 3722-1"); } } }, android_verifone_usb_2: { sendpayment: function(device) { var merchId = 0; try{ var merchval = device["settings"]["bankingParams"]["merchId"]; if(merchval > 0){ merchId = merchval; } }catch(err){ } console.log("verifone merchId",merchId) var thisbasket = app.terminal.getbasket(); var visasum = $("#payvisa").val(); var cashsum = $("#paycash").val(); try { try { var jsonData = { products: [{ name: "Товар", quantity: 1, price: round(visasum, 2), }], protocol: "android_verifone_usb_2", // mosst_apk | ingenico_ua verifone: { command: "cardPayment", merchId: merchId }, deviceId: device.id, cashless: round(visasum, 2), cash: round(cashsum, 2), sum: round(thisbasket["info"]["allcena"], 2), } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Error 3722"); } console.log("На verifone", jsonData); try { var json = JSON.stringify(jsonData); Android.bankingPayment(json); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } returnVerifone = {}; returnVerifone.status = "empty"; try { clearInterval(waitingVerifone); } catch (err) {} var waitingVerifone = setInterval(function() { console.log("Опрашиваем Verifone"); if (returnVerifone.status == "done") { clearInterval(waitingVerifone); var thisbasket = app.terminal.getbasket(); returnVerifone.status = "empty"; try{ returnVerifone.terminalId = device.id; }catch(err){ } thisbasket["info"]["bankingData"] = returnVerifone; thisbasket["info"]["mosst"] = JSON.stringify(returnVerifone); app.terminal.paynow(thisbasket); } }, 500); } catch (err) { console.error(err); app.main.error(device.name + ": Error 7743"); // app.terminal.paynow(thisbasket); } }, success: function(json) { try{ var temp = JSON.parse(json); }catch(err){ app.main.error("Error: Ошибка парсина ответа от терминала"); } try{ returnVerifone = temp; }catch(err){ app.main.error("Error: 8291"); } $("#bankingterminalconnectingsbox").hide(); returnVerifone.status = "done"; }, error: function(errCode) { $("#bankingterminalconnectingsbox").hide(); verifoneUErr = { "03" : "Format error", "04" : "Retain card", "05" : "External decline", "12" : "Invalid transaction", "13" : "Merchant limit exceeded 14 – Invalid track 2", "20" : "Verification fault", "30" : "Invalid format", "33" : "Expired card", "54" : "Expired card", "41" : "Lost card", "43" : "Stolen card", "51" : "Insufficient funds", "55" : "Invalid PIN, PIN tries exceeded", "58" : "Invalid processing code", "62" : "Invalid MAC", "78" : "Original request not found", "81" : "Wrong format of customer information field 82 – Prepaid code not found", "89" : "Invalid terminal id", "91" : "Destination not available", "94" : "Duplicate transmission", "96" : "System error", //Для привата "1000" : "General error (should be used in exceptional case)", "1001" : "Transaction canceled by user", "1002" : "EMV Decline", "1003" : "Transaction log is full. Need close batch", "1004" : "No connection with host", "1005" : "No paper in printer", "1006" : "Error Crypto keys", "1007" : "Card reader is not connected", "1008" : "Transaction is already complete" }; var errorText = verifoneUErr[errCode]; if(!errorText){ errorText = errCode; } app.main.error("Verifone: "+lang["Ne_udalosy_prinyaty_oplatu_po_beznalu"]+"
• "+errorText); }, status: function(statusText){ app.banking.modules.status(statusText); //app.main.message("Verifone:
• "+statusText); }, statuscode: function(statusCode){ var statusCodes = { "0" : "status code is not available", "1" : "card was read", "2" : "used a chip card", "3" : "authorization in progress", "4" : "waiting for cashier action", "5" : "printing receipt", "6" : "pin entry is needed", "7" : "card was removed", "8" : "EMV multi aid’s", "9" : "waiting for card", "10" : "in progress", "11" : "correct transaction", "12" : "Pin input wait key", "13" : "Pin input backspace pressed", "14" : "Pin input key pressed", "1001" : "Продаж", "1002" : "Повернення", "1003" : "Відміна", "1004" : "Закриття зміни" } app.banking.modules.status(statusCodes[statusCode]); }, returnsale: function(data) { return new Promise(function(resolve, reject) { var device = data["device"]; console.log(device); try { try { var jsonData = { protocol: "android_verifone_usb_2", // mosst_apk | ingenico_ua deviceId: device.id, verifone: { command: "cardRefund", //authorization //loguot //setLanguage //cardPayment - Оплата //cardRefund - Возврат refundData: data["mosst"] } } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Не достаточно данных, ошибка 3721"); reject(); } console.log("На verifone", jsonData); try { var json = JSON.stringify(jsonData); Android.bankingPayment(json); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); reject(); } returnVerifone.status = "empty"; try { clearInterval(waitingVerifone); } catch (err) {} var waitingVerifone = setInterval(function() { console.log("Опрашиваем Verifone"); if (returnVerifone.status == "done") { clearInterval(waitingVerifone); //alert("Возврат выполнен"); $("#bankingterminalsbox").hide(); resolve(returnVerifone); } }, 500); } catch (err) {} }); }, closeShift: function(device){ try { var jsonData = { protocol: "android_verifone_usb_2", // mosst_apk | ingenico_ua deviceId: device.id, verifone: { command: "closeShift", } } console.log("На verifone", jsonData); try { var json = JSON.stringify(jsonData); Android.bankingPayment(json); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } } catch (err) { app.main.error(device.name + ": " + "Error 3722-1"); } } }, windows_verifone_com: { sendpayment: function(device) { var merchId = 0; try{ var merchval = device["settings"]["bankingParams"]["merchId"]; if(merchval > 0){ merchId = merchval; } }catch(err){ } console.log("verifone merchId",merchId) var thisbasket = app.terminal.getbasket(); var visasum = $("#payvisa").val(); var cashsum = $("#paycash").val(); try { try { var jsonData = { products: [{ name: "Товар", quantity: 1, price: round(visasum, 2), }], protocol: "verifone", // mosst_apk | ingenico_ua verifone: { command: "cardPayment", merchId: merchId }, cashless: round(visasum, 2), cash: round(cashsum, 2), sum: round(thisbasket["info"]["allcena"], 2), } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Error 3722"); } console.log("На verifone", jsonData); try { var request = { method: "banking_payment", data: JSON.stringify(jsonData) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { //console.log("on test request success", response); }, onFailure: function(error_code, error_message) { //console.log("on test request Failure", error_message); } }); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } returnVerifone = {}; returnVerifone.status = "empty"; try { clearInterval(waitingVerifone); } catch (err) {} var waitingVerifone = setInterval(function() { console.log("Опрашиваем Verifone"); if (returnVerifone.status == "done") { clearInterval(waitingVerifone); var thisbasket = app.terminal.getbasket(); returnVerifone.status = "empty"; try{ returnVerifone.terminalId = device.id; }catch(err){ } thisbasket["info"]["bankingData"] = returnVerifone; thisbasket["info"]["mosst"] = JSON.stringify(returnVerifone); app.terminal.paynow(thisbasket); } }, 500); } catch (err) { console.error(err); app.main.error(device.name + ": Error 7743"); // app.terminal.paynow(thisbasket); } }, success: function(json) { try{ returnVerifone = JSON.parse(json); }catch(err){ //app.main.error("Error: 8291"); } $("#bankingterminalconnectingsbox").hide(); returnVerifone.status = "done"; }, error: function(errCode) { $("#bankingterminalconnectingsbox").hide(); verifoneUErr = { "03" : "Format error", "04" : "Retain card", "05" : "External decline", "12" : "Invalid transaction", "13" : "Merchant limit exceeded 14 – Invalid track 2", "20" : "Verification fault", "30" : "Invalid format", "33" : "Expired card", "54" : "Expired card", "41" : "Lost card", "43" : "Stolen card", "51" : "Insufficient funds", "55" : "Invalid PIN, PIN tries exceeded", "58" : "Invalid processing code", "62" : "Invalid MAC", "78" : "Original request not found", "81" : "Wrong format of customer information field 82 – Prepaid code not found", "89" : "Invalid terminal id", "91" : "Destination not available", "94" : "Duplicate transmission", "96" : "System error", //Для привата "1000" : "General error (should be used in exceptional case)", "1001" : "Transaction canceled by user", "1002" : "EMV Decline", "1003" : "Transaction log is full. Need close batch", "1004" : "No connection with host", "1005" : "No paper in printer", "1006" : "Error Crypto keys", "1007" : "Card reader is not connected", "1008" : "Transaction is already complete" }; var errorText = verifoneUErr[errCode]; if(!errorText){ errorText = errCode; } app.main.error("Verifone: "+lang["Ne_udalosy_prinyaty_oplatu_po_beznalu"]+"
• "+errorText); }, status: function(statusText){ app.banking.modules.status(statusText); //app.main.message("Verifone:
• "+statusText); }, statuscode: function(statusCode){ var statusCodes = { "0" : "status code is not available", "1" : "card was read", "2" : "used a chip card", "3" : "authorization in progress", "4" : "waiting for cashier action", "5" : "printing receipt", "6" : "pin entry is needed", "7" : "card was removed", "8" : "EMV multi aid’s", "9" : "waiting for card", "10" : "in progress", "11" : "correct transaction", "12" : "Pin input wait key", "13" : "Pin input backspace pressed", "14" : "Pin input key pressed" } app.banking.modules.status(statusCodes[statusCode]); }, returnsale: function(data) { return new Promise(function(resolve, reject) { var device = data["device"]; console.log(device); try { try { var jsonData = { protocol: "verifone", // mosst_apk | ingenico_ua verifone: { command: "cardRefund", //authorization //loguot //setLanguage //cardPayment - Оплата //cardRefund - Возврат refundData: data["mosst"] } } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Не достаточно данных, ошибка 3721"); reject(); } console.log("На verifone", jsonData); try { var request = { method: "banking_payment", data: JSON.stringify(jsonData) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { //console.log("on test request success", response); }, onFailure: function(error_code, error_message) { //console.log("on test request Failure", error_message); } }); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); reject(); } returnVerifone.status = "empty"; try { clearInterval(waitingVerifone); } catch (err) {} var waitingVerifone = setInterval(function() { console.log("Опрашиваем Verifone"); if (returnVerifone.status == "done") { clearInterval(waitingVerifone); //alert("Возврат выполнен"); $("#bankingterminalsbox").hide(); resolve(returnVerifone); } }, 500); } catch (err) {} }); }, closeShift: function(){ try { var jsonData = { protocol: "verifone", // mosst_apk | ingenico_ua verifone: { command: "closeShift", } } console.log("На verifone", jsonData); try { var request = { method: "banking_payment", data: JSON.stringify(jsonData) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { //console.log("on test request success", response); }, onFailure: function(error_code, error_message) { //console.log("on test request Failure", error_message); } }); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } } catch (err) { app.main.error(device.name + ": " + "Error 3722-1"); } } }, windows_verifone_com_2: { sendpayment: function(device) { var merchId = 0; try{ var merchval = device["settings"]["bankingParams"]["merchId"]; if(merchval > 0){ merchId = merchval; } }catch(err){ } console.log("verifone merchId",merchId) var thisbasket = app.terminal.getbasket(); var visasum = $("#payvisa").val(); var cashsum = $("#paycash").val(); try { try { var jsonData = { products: [{ name: "Товар", quantity: 1, price: round(visasum, 2), }], protocol: "windows_verifone_com_2", // mosst_apk | ingenico_ua verifone: { command: "cardPayment", merchId: merchId }, deviceId: device.id, cashless: round(visasum, 2), cash: round(cashsum, 2), sum: round(thisbasket["info"]["allcena"], 2), } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Error 3722"); } console.log("На verifone", jsonData); try { var request = { method: "banking_payment", data: JSON.stringify(jsonData) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { //console.log("on test request success", response); }, onFailure: function(error_code, error_message) { //console.log("on test request Failure", error_message); } }); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } returnVerifone = {}; returnVerifone.status = "empty"; try { clearInterval(waitingVerifone); } catch (err) {} var waitingVerifone = setInterval(function() { console.log("Опрашиваем Verifone"); if (returnVerifone.status == "done") { clearInterval(waitingVerifone); var thisbasket = app.terminal.getbasket(); returnVerifone.status = "empty"; try{ returnVerifone.terminalId = device.id; }catch(err){ } thisbasket["info"]["bankingData"] = returnVerifone; thisbasket["info"]["mosst"] = JSON.stringify(returnVerifone); app.terminal.paynow(thisbasket); } }, 500); } catch (err) { console.error(err); app.main.error(device.name + ": Error 7743"); // app.terminal.paynow(thisbasket); } }, success: function(json) { try{ returnVerifone = JSON.parse(json); }catch(err){ //app.main.error("Error: 8291"); } $("#bankingterminalconnectingsbox").hide(); returnVerifone.status = "done"; }, error: function(errCode) { $("#bankingterminalconnectingsbox").hide(); verifoneUErr = { "03" : "Format error", "04" : "Retain card", "05" : "External decline", "12" : "Invalid transaction", "13" : "Merchant limit exceeded 14 – Invalid track 2", "20" : "Verification fault", "30" : "Invalid format", "33" : "Expired card", "54" : "Expired card", "41" : "Lost card", "43" : "Stolen card", "51" : "Insufficient funds", "55" : "Invalid PIN, PIN tries exceeded", "58" : "Invalid processing code", "62" : "Invalid MAC", "78" : "Original request not found", "81" : "Wrong format of customer information field 82 – Prepaid code not found", "89" : "Invalid terminal id", "91" : "Destination not available", "94" : "Duplicate transmission", "96" : "System error", //Для привата "1000" : "General error (should be used in exceptional case)", "1001" : "Transaction canceled by user", "1002" : "EMV Decline", "1003" : "Transaction log is full. Need close batch", "1004" : "No connection with host", "1005" : "No paper in printer", "1006" : "Error Crypto keys", "1007" : "Card reader is not connected", "1008" : "Transaction is already complete" }; var errorText = verifoneUErr[errCode]; if(!errorText){ errorText = errCode; } app.main.error("Verifone: "+lang["Ne_udalosy_prinyaty_oplatu_po_beznalu"]+"
• "+errorText); }, status: function(statusText){ app.banking.modules.status(statusText); //app.main.message("Verifone:
• "+statusText); }, statuscode: function(statusCode){ var statusCodes = { "0" : "status code is not available", "1" : "card was read", "2" : "used a chip card", "3" : "authorization in progress", "4" : "waiting for cashier action", "5" : "printing receipt", "6" : "pin entry is needed", "7" : "card was removed", "8" : "EMV multi aid’s", "9" : "waiting for card", "10" : "in progress", "11" : "correct transaction", "12" : "Pin input wait key", "13" : "Pin input backspace pressed", "14" : "Pin input key pressed", "1001" : "Продаж", "1002" : "Повернення", "1003" : "Відміна", "1004" : "Закриття зміни" } app.banking.modules.status(statusCodes[statusCode]); }, returnsale: function(data) { return new Promise(function(resolve, reject) { var device = data["device"]; console.log(device); try { try { var jsonData = { protocol: "windows_verifone_com_2", // mosst_apk | ingenico_ua deviceId: device.id, verifone: { command: "cardRefund", //authorization //loguot //setLanguage //cardPayment - Оплата //cardRefund - Возврат refundData: data["mosst"] } } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Не достаточно данных, ошибка 3721"); reject(); } console.log("На verifone", jsonData); try { var request = { method: "banking_payment", data: JSON.stringify(jsonData) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { //console.log("on test request success", response); }, onFailure: function(error_code, error_message) { //console.log("on test request Failure", error_message); } }); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); reject(); } returnVerifone.status = "empty"; try { clearInterval(waitingVerifone); } catch (err) {} var waitingVerifone = setInterval(function() { console.log("Опрашиваем Verifone"); if (returnVerifone.status == "done") { clearInterval(waitingVerifone); //alert("Возврат выполнен"); $("#bankingterminalsbox").hide(); resolve(returnVerifone); } }, 500); } catch (err) {} }); }, closeShift: function(device){ try { var jsonData = { protocol: "windows_verifone_com_2", // mosst_apk | ingenico_ua deviceId: device.id, verifone: { command: "closeShift", } } console.log("На verifone", jsonData); try { var request = { method: "banking_payment", data: JSON.stringify(jsonData) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { //console.log("on test request success", response); }, onFailure: function(error_code, error_message) { //console.log("on test request Failure", error_message); } }); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } } catch (err) { app.main.error(device.name + ": " + "Error 3722-1"); } } }, android_verifone_privatbank_ip: { sendpayment: function(device) { var merchId = 0; try{ var merchval = device["settings"]["bankingParams"]["merchId"]; if(merchval > 0){ merchId = merchval; } }catch(err){ } console.log("verifone merchId",merchId) var thisbasket = app.terminal.getbasket(); var visasum = $("#payvisa").val(); var cashsum = $("#paycash").val(); try { try { var jsonData = { products: [{ name: "Товар", quantity: 1, price: round(visasum, 2), }], protocol: "verifone", // mosst_apk | ingenico_ua verifone: { command: "cardPayment", merchId: merchId }, cashless: round(visasum, 2), cash: round(cashsum, 2), sum: round(thisbasket["info"]["allcena"], 2), } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Error 3722"); } console.log("На verifone", jsonData); try { var json = JSON.stringify(jsonData); Android.bankingPayment(json); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } returnVerifone = {}; returnVerifone.status = "empty"; try { clearInterval(waitingVerifone); } catch (err) {} var waitingVerifone = setInterval(function() { console.log("Опрашиваем Verifone"); if (returnVerifone.status == "done") { clearInterval(waitingVerifone); var thisbasket = app.terminal.getbasket(); returnVerifone.status = "empty"; try{ returnVerifone.terminalId = device.id; }catch(err){ } thisbasket["info"]["bankingData"] = returnVerifone; thisbasket["info"]["mosst"] = JSON.stringify(returnVerifone); app.terminal.paynow(thisbasket); } }, 500); } catch (err) { console.error(err); app.main.error(device.name + ": Error 7743"); // app.terminal.paynow(thisbasket); } }, success: function(json) { try{ var temp = JSON.parse(json); }catch(err){ app.main.error("Error: Ошибка парсина ответа от терминала"); } try{ returnVerifone = temp; }catch(err){ app.main.error("Error: 8291"); } $("#bankingterminalconnectingsbox").hide(); returnVerifone.status = "done"; }, error: function(errCode) { $("#bankingterminalconnectingsbox").hide(); verifoneUErr = { "03" : "Format error", "04" : "Retain card", "05" : "External decline", "12" : "Invalid transaction", "13" : "Merchant limit exceeded 14 – Invalid track 2", "20" : "Verification fault", "30" : "Invalid format", "33" : "Expired card", "54" : "Expired card", "41" : "Lost card", "43" : "Stolen card", "51" : "Insufficient funds", "55" : "Invalid PIN, PIN tries exceeded", "58" : "Invalid processing code", "62" : "Invalid MAC", "78" : "Original request not found", "81" : "Wrong format of customer information field 82 – Prepaid code not found", "89" : "Invalid terminal id", "91" : "Destination not available", "94" : "Duplicate transmission", "96" : "System error", //Для привата "1000" : "General error (should be used in exceptional case)", "1001" : "Transaction canceled by user", "1002" : "EMV Decline", "1003" : "Transaction log is full. Need close batch", "1004" : "No connection with host", "1005" : "No paper in printer", "1006" : "Error Crypto keys", "1007" : "Card reader is not connected", "1008" : "Transaction is already complete" }; var errorText = verifoneUErr[errCode]; if(!errorText){ errorText = errCode; } app.main.error("Verifone: "+lang["Ne_udalosy_prinyaty_oplatu_po_beznalu"]+"
• "+errorText); }, status: function(statusText){ app.banking.modules.status(statusText); //app.main.message("Verifone:
• "+statusText); }, statuscode: function(statusCode){ var statusCodes = { "0" : "status code is not available", "1" : "card was read", "2" : "used a chip card", "3" : "authorization in progress", "4" : "waiting for cashier action", "5" : "printing receipt", "6" : "pin entry is needed", "7" : "card was removed", "8" : "EMV multi aid’s", "9" : "waiting for card", "10" : "in progress", "11" : "correct transaction", "12" : "Pin input wait key", "13" : "Pin input backspace pressed", "14" : "Pin input key pressed" } app.banking.modules.status(statusCodes[statusCode]); }, returnsale: function(data) { return new Promise(function(resolve, reject) { var device = data["device"]; console.log(device); try { try { var jsonData = { protocol: "verifone", // mosst_apk | ingenico_ua verifone: { command: "cardRefund", //authorization //loguot //setLanguage //cardPayment - Оплата //cardRefund - Возврат refundData: data["mosst"] } } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Не достаточно данных, ошибка 3721"); reject(); } console.log("На verifone", jsonData); try { var json = JSON.stringify(jsonData); Android.bankingPayment(json); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); reject(); } returnVerifone.status = "empty"; try { clearInterval(waitingVerifone); } catch (err) {} var waitingVerifone = setInterval(function() { console.log("Опрашиваем Verifone"); if (returnVerifone.status == "done") { clearInterval(waitingVerifone); //alert("Возврат выполнен"); $("#bankingterminalsbox").hide(); resolve(returnVerifone); } }, 500); } catch (err) {} }); }, closeShift: function(){ try { var jsonData = { protocol: "verifone", // mosst_apk | ingenico_ua verifone: { command: "closeShift", } } console.log("На verifone", jsonData); try { var json = JSON.stringify(jsonData); Android.bankingPayment(json); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } } catch (err) { app.main.error(device.name + ": " + "Error 3722-1"); } } }, android_verifone_privatbank_usb: { sendpayment: function(device) { var merchId = 0; try{ var merchval = device["settings"]["bankingParams"]["merchId"]; if(merchval > 0){ merchId = merchval; } }catch(err){ } console.log("verifone merchId",merchId) var thisbasket = app.terminal.getbasket(); var visasum = $("#payvisa").val(); var cashsum = $("#paycash").val(); try { try { var jsonData = { products: [{ name: "Товар", quantity: 1, price: round(visasum, 2), }], protocol: "verifone", // mosst_apk | ingenico_ua verifone: { command: "cardPayment", merchId: merchId }, cashless: round(visasum, 2), cash: round(cashsum, 2), sum: round(thisbasket["info"]["allcena"], 2), } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Error 3722"); } console.log("На verifone", jsonData); try { var json = JSON.stringify(jsonData); Android.bankingPayment(json); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } returnVerifone = {}; returnVerifone.status = "empty"; try { clearInterval(waitingVerifone); } catch (err) {} var waitingVerifone = setInterval(function() { console.log("Опрашиваем Verifone"); if (returnVerifone.status == "done") { clearInterval(waitingVerifone); var thisbasket = app.terminal.getbasket(); returnVerifone.status = "empty"; try{ returnVerifone.terminalId = device.id; }catch(err){ } thisbasket["info"]["bankingData"] = returnVerifone; thisbasket["info"]["mosst"] = JSON.stringify(returnVerifone); app.terminal.paynow(thisbasket); } }, 500); } catch (err) { console.error(err); app.main.error(device.name + ": Error 7743"); // app.terminal.paynow(thisbasket); } }, success: function(json) { try{ var temp = JSON.parse(json); }catch(err){ app.main.error("Error: Ошибка парсина ответа от терминала"); } try{ returnVerifone = temp; }catch(err){ app.main.error("Error: 8291"); } $("#bankingterminalconnectingsbox").hide(); returnVerifone.status = "done"; }, error: function(errCode) { $("#bankingterminalconnectingsbox").hide(); verifoneUErr = { "03" : "Format error", "04" : "Retain card", "05" : "External decline", "12" : "Invalid transaction", "13" : "Merchant limit exceeded 14 – Invalid track 2", "20" : "Verification fault", "30" : "Invalid format", "33" : "Expired card", "54" : "Expired card", "41" : "Lost card", "43" : "Stolen card", "51" : "Insufficient funds", "55" : "Invalid PIN, PIN tries exceeded", "58" : "Invalid processing code", "62" : "Invalid MAC", "78" : "Original request not found", "81" : "Wrong format of customer information field 82 – Prepaid code not found", "89" : "Invalid terminal id", "91" : "Destination not available", "94" : "Duplicate transmission", "96" : "System error", //Для привата "1000" : "General error (should be used in exceptional case)", "1001" : "Transaction canceled by user", "1002" : "EMV Decline", "1003" : "Transaction log is full. Need close batch", "1004" : "No connection with host", "1005" : "No paper in printer", "1006" : "Error Crypto keys", "1007" : "Card reader is not connected", "1008" : "Transaction is already complete" }; var errorText = verifoneUErr[errCode]; if(!errorText){ errorText = errCode; } app.main.error("Verifone: "+lang["Ne_udalosy_prinyaty_oplatu_po_beznalu"]+"
• "+errorText); }, status: function(statusText){ app.banking.modules.status(statusText); //app.main.message("Verifone:
• "+statusText); }, statuscode: function(statusCode){ var statusCodes = { "0" : "status code is not available", "1" : "card was read", "2" : "used a chip card", "3" : "authorization in progress", "4" : "waiting for cashier action", "5" : "printing receipt", "6" : "pin entry is needed", "7" : "card was removed", "8" : "EMV multi aid’s", "9" : "waiting for card", "10" : "in progress", "11" : "correct transaction", "12" : "Pin input wait key", "13" : "Pin input backspace pressed", "14" : "Pin input key pressed" } app.banking.modules.status(statusCodes[statusCode]); }, returnsale: function(data) { return new Promise(function(resolve, reject) { var device = data["device"]; console.log(device); try { try { var jsonData = { protocol: "verifone", // mosst_apk | ingenico_ua verifone: { command: "cardRefund", //authorization //loguot //setLanguage //cardPayment - Оплата //cardRefund - Возврат refundData: data["mosst"] } } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Не достаточно данных, ошибка 3721"); reject(); } console.log("На verifone", jsonData); try { var json = JSON.stringify(jsonData); Android.bankingPayment(json); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); reject(); } returnVerifone.status = "empty"; try { clearInterval(waitingVerifone); } catch (err) {} var waitingVerifone = setInterval(function() { console.log("Опрашиваем Verifone"); if (returnVerifone.status == "done") { clearInterval(waitingVerifone); //alert("Возврат выполнен"); $("#bankingterminalsbox").hide(); resolve(returnVerifone); } }, 500); } catch (err) {} }); }, closeShift: function(){ try { var jsonData = { protocol: "verifone", // mosst_apk | ingenico_ua verifone: { command: "closeShift", } } console.log("На verifone", jsonData); try { var json = JSON.stringify(jsonData); Android.bankingPayment(json); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } } catch (err) { app.main.error(device.name + ": " + "Error 3722-1"); } } }, windows_verifone_privatbank_ip: { sendpayment: function(device) { var merchId = 0; try{ var merchval = device["settings"]["bankingParams"]["merchId"]; if(merchval > 0){ merchId = merchval; } }catch(err){ } console.log("verifone merchId",merchId) var thisbasket = app.terminal.getbasket(); var visasum = $("#payvisa").val(); var cashsum = $("#paycash").val(); try { try { var jsonData = { products: [{ name: "Товар", quantity: 1, price: round(visasum, 2), }], protocol: "verifone", // mosst_apk | ingenico_ua verifone: { command: "cardPayment", merchId: merchId }, cashless: round(visasum, 2), cash: round(cashsum, 2), sum: round(thisbasket["info"]["allcena"], 2), } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Error 3722"); } console.log("На verifone", jsonData); try { var request = { method: "banking_payment", data: JSON.stringify(jsonData) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { //console.log("on test request success", response); }, onFailure: function(error_code, error_message) { //console.log("on test request Failure", error_message); } }); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } returnVerifone = {}; returnVerifone.status = "empty"; try { clearInterval(waitingVerifone); } catch (err) {} var waitingVerifone = setInterval(function() { console.log("Опрашиваем Verifone"); if (returnVerifone.status == "done") { clearInterval(waitingVerifone); var thisbasket = app.terminal.getbasket(); returnVerifone.status = "empty"; try{ returnVerifone.terminalId = device.id; }catch(err){ } thisbasket["info"]["bankingData"] = returnVerifone; thisbasket["info"]["mosst"] = JSON.stringify(returnVerifone); app.terminal.paynow(thisbasket); } }, 500); } catch (err) { console.error(err); app.main.error(device.name + ": Error 7743"); // app.terminal.paynow(thisbasket); } }, success: function(json) { try{ returnVerifone = JSON.parse(json); }catch(err){ //app.main.error("Error: 8291"); } $("#bankingterminalconnectingsbox").hide(); returnVerifone.status = "done"; }, error: function(errCode) { $("#bankingterminalconnectingsbox").hide(); verifoneUErr = { "03" : "Format error", "04" : "Retain card", "05" : "External decline", "12" : "Invalid transaction", "13" : "Merchant limit exceeded 14 – Invalid track 2", "20" : "Verification fault", "30" : "Invalid format", "33" : "Expired card", "54" : "Expired card", "41" : "Lost card", "43" : "Stolen card", "51" : "Insufficient funds", "55" : "Invalid PIN, PIN tries exceeded", "58" : "Invalid processing code", "62" : "Invalid MAC", "78" : "Original request not found", "81" : "Wrong format of customer information field 82 – Prepaid code not found", "89" : "Invalid terminal id", "91" : "Destination not available", "94" : "Duplicate transmission", "96" : "System error", //Для привата "1000" : "General error (should be used in exceptional case)", "1001" : "Transaction canceled by user", "1002" : "EMV Decline", "1003" : "Transaction log is full. Need close batch", "1004" : "No connection with host", "1005" : "No paper in printer", "1006" : "Error Crypto keys", "1007" : "Card reader is not connected", "1008" : "Transaction is already complete" }; var errorText = verifoneUErr[errCode]; if(!errorText){ errorText = errCode; } app.main.error("Verifone: "+lang["Ne_udalosy_prinyaty_oplatu_po_beznalu"]+"
• "+errorText); }, status: function(statusText){ app.banking.modules.status(statusText); //app.main.message("Verifone:
• "+statusText); }, statuscode: function(statusCode){ var statusCodes = { "0" : "status code is not available", "1" : "card was read", "2" : "used a chip card", "3" : "authorization in progress", "4" : "waiting for cashier action", "5" : "printing receipt", "6" : "pin entry is needed", "7" : "card was removed", "8" : "EMV multi aid’s", "9" : "waiting for card", "10" : "in progress", "11" : "correct transaction", "12" : "Pin input wait key", "13" : "Pin input backspace pressed", "14" : "Pin input key pressed" } app.banking.modules.status(statusCodes[statusCode]); }, returnsale: function(data) { return new Promise(function(resolve, reject) { var device = data["device"]; console.log(device); try { try { var jsonData = { protocol: "verifone", // mosst_apk | ingenico_ua verifone: { command: "cardRefund", //authorization //loguot //setLanguage //cardPayment - Оплата //cardRefund - Возврат refundData: data["mosst"] } } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Не достаточно данных, ошибка 3721"); reject(); } console.log("На verifone", jsonData); try { var request = { method: "banking_payment", data: JSON.stringify(jsonData) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { //console.log("on test request success", response); }, onFailure: function(error_code, error_message) { //console.log("on test request Failure", error_message); } }); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); reject(); } returnVerifone.status = "empty"; try { clearInterval(waitingVerifone); } catch (err) {} var waitingVerifone = setInterval(function() { console.log("Опрашиваем Verifone"); if (returnVerifone.status == "done") { clearInterval(waitingVerifone); //alert("Возврат выполнен"); $("#bankingterminalsbox").hide(); resolve(returnVerifone); } }, 500); } catch (err) {} }); }, closeShift: function(){ try { var jsonData = { protocol: "verifone", // mosst_apk | ingenico_ua verifone: { command: "closeShift", } } console.log("На verifone", jsonData); try { var request = { method: "banking_payment", data: JSON.stringify(jsonData) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { //console.log("on test request success", response); }, onFailure: function(error_code, error_message) { //console.log("on test request Failure", error_message); } }); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } } catch (err) { app.main.error(device.name + ": " + "Error 3722-1"); } } }, windows_verifone_privatbank_com: { sendpayment: function(device) { var merchId = 0; try{ var merchval = device["settings"]["bankingParams"]["merchId"]; if(merchval > 0){ merchId = merchval; } }catch(err){ } console.log("verifone merchId",merchId) var thisbasket = app.terminal.getbasket(); var visasum = $("#payvisa").val(); var cashsum = $("#paycash").val(); try { try { var jsonData = { products: [{ name: "Товар", quantity: 1, price: round(visasum, 2), }], protocol: "verifone", // mosst_apk | ingenico_ua verifone: { command: "cardPayment", merchId: merchId }, cashless: round(visasum, 2), cash: round(cashsum, 2), sum: round(thisbasket["info"]["allcena"], 2), } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Error 3722"); } console.log("На verifone", jsonData); try { var request = { method: "banking_payment", data: JSON.stringify(jsonData) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { //console.log("on test request success", response); }, onFailure: function(error_code, error_message) { //console.log("on test request Failure", error_message); } }); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } returnVerifone = {}; returnVerifone.status = "empty"; try { clearInterval(waitingVerifone); } catch (err) {} var waitingVerifone = setInterval(function() { console.log("Опрашиваем Verifone"); if (returnVerifone.status == "done") { clearInterval(waitingVerifone); var thisbasket = app.terminal.getbasket(); returnVerifone.status = "empty"; try{ returnVerifone.terminalId = device.id; }catch(err){ } thisbasket["info"]["bankingData"] = returnVerifone; thisbasket["info"]["mosst"] = JSON.stringify(returnVerifone); app.terminal.paynow(thisbasket); } }, 500); } catch (err) { console.error(err); app.main.error(device.name + ": Error 7743"); // app.terminal.paynow(thisbasket); } }, success: function(json) { try{ returnVerifone = JSON.parse(json); }catch(err){ //app.main.error("Error: 8291"); } $("#bankingterminalconnectingsbox").hide(); returnVerifone.status = "done"; }, error: function(errCode) { $("#bankingterminalconnectingsbox").hide(); verifoneUErr = { "03" : "Format error", "04" : "Retain card", "05" : "External decline", "12" : "Invalid transaction", "13" : "Merchant limit exceeded 14 – Invalid track 2", "20" : "Verification fault", "30" : "Invalid format", "33" : "Expired card", "54" : "Expired card", "41" : "Lost card", "43" : "Stolen card", "51" : "Insufficient funds", "55" : "Invalid PIN, PIN tries exceeded", "58" : "Invalid processing code", "62" : "Invalid MAC", "78" : "Original request not found", "81" : "Wrong format of customer information field 82 – Prepaid code not found", "89" : "Invalid terminal id", "91" : "Destination not available", "94" : "Duplicate transmission", "96" : "System error", //Для привата "1000" : "General error (should be used in exceptional case)", "1001" : "Transaction canceled by user", "1002" : "EMV Decline", "1003" : "Transaction log is full. Need close batch", "1004" : "No connection with host", "1005" : "No paper in printer", "1006" : "Error Crypto keys", "1007" : "Card reader is not connected", "1008" : "Transaction is already complete" }; var errorText = verifoneUErr[errCode]; if(!errorText){ errorText = errCode; } app.main.error("Verifone: "+lang["Ne_udalosy_prinyaty_oplatu_po_beznalu"]+"
• "+errorText); }, status: function(statusText){ app.banking.modules.status(statusText); //app.main.message("Verifone:
• "+statusText); }, statuscode: function(statusCode){ var statusCodes = { "0" : "status code is not available", "1" : "card was read", "2" : "used a chip card", "3" : "authorization in progress", "4" : "waiting for cashier action", "5" : "printing receipt", "6" : "pin entry is needed", "7" : "card was removed", "8" : "EMV multi aid’s", "9" : "waiting for card", "10" : "in progress", "11" : "correct transaction", "12" : "Pin input wait key", "13" : "Pin input backspace pressed", "14" : "Pin input key pressed" } app.banking.modules.status(statusCodes[statusCode]); }, returnsale: function(data) { return new Promise(function(resolve, reject) { var device = data["device"]; console.log(device); try { try { var jsonData = { protocol: "verifone", // mosst_apk | ingenico_ua verifone: { command: "cardRefund", //authorization //loguot //setLanguage //cardPayment - Оплата //cardRefund - Возврат refundData: data["mosst"] } } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Не достаточно данных, ошибка 3721"); reject(); } console.log("На verifone", jsonData); try { var request = { method: "banking_payment", data: JSON.stringify(jsonData) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { //console.log("on test request success", response); }, onFailure: function(error_code, error_message) { //console.log("on test request Failure", error_message); } }); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); reject(); } returnVerifone.status = "empty"; try { clearInterval(waitingVerifone); } catch (err) {} var waitingVerifone = setInterval(function() { console.log("Опрашиваем Verifone"); if (returnVerifone.status == "done") { clearInterval(waitingVerifone); //alert("Возврат выполнен"); $("#bankingterminalsbox").hide(); resolve(returnVerifone); } }, 500); } catch (err) {} }); }, closeShift: function(){ try { var jsonData = { protocol: "verifone", // mosst_apk | ingenico_ua verifone: { command: "closeShift", } } console.log("На verifone", jsonData); try { var request = { method: "banking_payment", data: JSON.stringify(jsonData) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { //console.log("on test request success", response); }, onFailure: function(error_code, error_message) { //console.log("on test request Failure", error_message); } }); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } } catch (err) { app.main.error(device.name + ": " + "Error 3722-1"); } } }, android_jsonbased_privatbank_ip: { sendpayment: function(device) { var merchId = 0; try{ var merchval = device["settings"]["bankingParams"]["merchId"]; if(merchval > 0){ merchId = merchval; } }catch(err){ } console.log("verifone merchId",merchId) var thisbasket = app.terminal.getbasket(); var visasum = $("#payvisa").val(); var cashsum = $("#paycash").val(); try { try { var jsonData = { products: [{ name: "Товар", quantity: 1, price: round(visasum, 2), }], protocol: "jsonBased", jsonBased: { command: "cardPayment", merchId: merchId }, deviceId:device.id, cashless: round(visasum, 2), cash: round(cashsum, 2), sum: round(thisbasket["info"]["allcena"], 2), } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Error 3722"); } console.log("На verifone", jsonData); try { var json = JSON.stringify(jsonData); Android.bankingPayment(json); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } returnVerifone = {}; returnVerifone.status = "empty"; try { clearInterval(waitingVerifone); } catch (err) {} var waitingVerifone = setInterval(function() { console.log("Опрашиваем Verifone"); if (returnVerifone.status == "done") { clearInterval(waitingVerifone); var thisbasket = app.terminal.getbasket(); returnVerifone.status = "empty"; try{ returnVerifone.terminalId = device.id; }catch(err){ } thisbasket["info"]["bankingData"] = returnVerifone; thisbasket["info"]["mosst"] = JSON.stringify(returnVerifone); app.terminal.paynow(thisbasket); } }, 500); } catch (err) { console.error(err); app.main.error(device.name + ": Error 7743"); // app.terminal.paynow(thisbasket); } }, success: function(json) { try{ var temp = JSON.parse(json); }catch(err){ app.main.error("Error: Ошибка парсина ответа от терминала"); } try{ try{ delete temp.receipt; }catch(err){ console.log("не вдалось вичистити receipt") } try{ temp.bankName = "ПриватБанк"; }catch(err){ } returnVerifone = temp; }catch(err){ app.main.error("Error: 8291"); } $("#bankingterminalconnectingsbox").hide(); returnVerifone.status = "done"; }, error: function(errCode) { $("#bankingterminalconnectingsbox").hide(); verifoneUErr = { "03" : "Format error", "04" : "Retain card", "05" : "External decline", "12" : "Invalid transaction", "13" : "Merchant limit exceeded 14 – Invalid track 2", "20" : "Verification fault", "30" : "Invalid format", "33" : "Expired card", "54" : "Expired card", "41" : "Lost card", "43" : "Stolen card", "51" : "Insufficient funds", "55" : "Invalid PIN, PIN tries exceeded", "58" : "Invalid processing code", "62" : "Invalid MAC", "78" : "Original request not found", "81" : "Wrong format of customer information field 82 – Prepaid code not found", "89" : "Invalid terminal id", "91" : "Destination not available", "94" : "Duplicate transmission", "96" : "System error", //Для привата "1000" : "General error (should be used in exceptional case)", "1001" : "Transaction canceled by user", "1002" : "EMV Decline", "1003" : "Transaction log is full. Need close batch", "1004" : "No connection with host", "1005" : "No paper in printer", "1006" : "Error Crypto keys", "1007" : "Card reader is not connected", "1008" : "Transaction is already complete" }; var errorText = verifoneUErr[errCode]; if(!errorText){ errorText = errCode; } app.main.error("Verifone: "+lang["Ne_udalosy_prinyaty_oplatu_po_beznalu"]+"
• "+errorText); }, status: function(statusText){ app.banking.modules.status(statusText); //app.main.message("Verifone:
• "+statusText); }, statuscode: function(statusCode){ var statusCodes = { "0" : "status code is not available", "1" : "card was read", "2" : "used a chip card", "3" : "authorization in progress", "4" : "waiting for cashier action", "5" : "printing receipt", "6" : "pin entry is needed", "7" : "card was removed", "8" : "EMV multi aid’s", "9" : "waiting for card", "10" : "in progress", "11" : "correct transaction", "12" : "Pin input wait key", "13" : "Pin input backspace pressed", "14" : "Pin input key pressed" } app.banking.modules.status(statusCodes[statusCode]); }, returnsale: function(data) { return new Promise(function(resolve, reject) { var device = data["device"]; console.log(device); try { try { var jsonData = { protocol: "jsonBased", // mosst_apk | ingenico_ua deviceId:device.id, jsonBased: { command: "cardRefund", //authorization //loguot //setLanguage //cardPayment - Оплата //cardRefund - Возврат refundData: data["mosst"] } } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Не достаточно данных, ошибка 3721"); reject(); } console.log("На verifone", jsonData); try { var json = JSON.stringify(jsonData); Android.bankingPayment(json); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); reject(); } returnVerifone.status = "empty"; try { clearInterval(waitingVerifone); } catch (err) {} var waitingVerifone = setInterval(function() { console.log("Опрашиваем Verifone"); if (returnVerifone.status == "done") { clearInterval(waitingVerifone); //alert("Возврат выполнен"); $("#bankingterminalsbox").hide(); resolve(returnVerifone); } }, 500); } catch (err) {} }) }, closeShift: function(device){ try { var jsonData = { protocol: "jsonBased", deviceId: device.id, jsonBased: { command: "closeShift", } } console.log("На verifone", jsonData); try { var json = JSON.stringify(jsonData); Android.bankingPayment(json); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } } catch (err) { app.main.error(device.name + ": " + "Error 3722-1"); } } }, android_jsonbased_privatbank_usb: { sendpayment: function(device) { var merchId = 0; try{ var merchval = device["settings"]["bankingParams"]["merchId"]; if(merchval > 0){ merchId = merchval; } }catch(err){ } console.log("verifone merchId",merchId) var thisbasket = app.terminal.getbasket(); var visasum = $("#payvisa").val(); var cashsum = $("#paycash").val(); try { try { var jsonData = { products: [{ name: "Товар", quantity: 1, price: round(visasum, 2), }], protocol: "jsonBased", jsonBased: { command: "cardPayment", merchId: merchId }, deviceId:device.id, cashless: round(visasum, 2), cash: round(cashsum, 2), sum: round(thisbasket["info"]["allcena"], 2), } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Error 3722"); } console.log("На verifone", jsonData); try { var json = JSON.stringify(jsonData); Android.bankingPayment(json); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } returnVerifone = {}; returnVerifone.status = "empty"; try { clearInterval(waitingVerifone); } catch (err) {} var waitingVerifone = setInterval(function() { console.log("Опрашиваем Verifone"); if (returnVerifone.status == "done") { clearInterval(waitingVerifone); var thisbasket = app.terminal.getbasket(); returnVerifone.status = "empty"; try{ returnVerifone.terminalId = device.id; }catch(err){ } thisbasket["info"]["bankingData"] = returnVerifone; thisbasket["info"]["mosst"] = JSON.stringify(returnVerifone); try{ if( preload.userbase == "380981068879"){ // alert(thisbasket["info"]["mosst"]); } }catch(err){ } app.terminal.paynow(thisbasket); } }, 500); } catch (err) { console.error(err); app.main.error(device.name + ": Error 7743"); // app.terminal.paynow(thisbasket); } }, success: function(json) { try{ var temp = JSON.parse(json); }catch(err){ app.main.error("Error: Ошибка парсина ответа от терминала"); } try{ try{ delete temp.receipt; }catch(err){ console.log("не вдалось вичистити receipt") } try{ temp.bankName = "ПриватБанк"; }catch(err){ } returnVerifone = temp; }catch(err){ app.main.error("Error: 8291"); } $("#bankingterminalconnectingsbox").hide(); returnVerifone.status = "done"; }, error: function(errCode) { $("#bankingterminalconnectingsbox").hide(); verifoneUErr = { "03" : "Format error", "04" : "Retain card", "05" : "External decline", "12" : "Invalid transaction", "13" : "Merchant limit exceeded 14 – Invalid track 2", "20" : "Verification fault", "30" : "Invalid format", "33" : "Expired card", "54" : "Expired card", "41" : "Lost card", "43" : "Stolen card", "51" : "Insufficient funds", "55" : "Invalid PIN, PIN tries exceeded", "58" : "Invalid processing code", "62" : "Invalid MAC", "78" : "Original request not found", "81" : "Wrong format of customer information field 82 – Prepaid code not found", "89" : "Invalid terminal id", "91" : "Destination not available", "94" : "Duplicate transmission", "96" : "System error", //Для привата "1000" : "General error (should be used in exceptional case)", "1001" : "Transaction canceled by user", "1002" : "EMV Decline", "1003" : "Transaction log is full. Need close batch", "1004" : "No connection with host", "1005" : "No paper in printer", "1006" : "Error Crypto keys", "1007" : "Card reader is not connected", "1008" : "Transaction is already complete" }; var errorText = verifoneUErr[errCode]; if(!errorText){ errorText = errCode; } app.main.error("Verifone: "+lang["Ne_udalosy_prinyaty_oplatu_po_beznalu"]+"
• "+errorText); }, status: function(statusText){ app.banking.modules.status(statusText); //app.main.message("Verifone:
• "+statusText); }, statuscode: function(statusCode){ var statusCodes = { "0" : "status code is not available", "1" : "card was read", "2" : "used a chip card", "3" : "authorization in progress", "4" : "waiting for cashier action", "5" : "printing receipt", "6" : "pin entry is needed", "7" : "card was removed", "8" : "EMV multi aid’s", "9" : "waiting for card", "10" : "in progress", "11" : "correct transaction", "12" : "Pin input wait key", "13" : "Pin input backspace pressed", "14" : "Pin input key pressed" } app.banking.modules.status(statusCodes[statusCode]); }, returnsale: function(data) { return new Promise(function(resolve, reject) { var device = data["device"]; console.log(device); try { try { var jsonData = { protocol: "jsonBased", // mosst_apk | ingenico_ua deviceId:device.id, jsonBased: { command: "cardRefund", //authorization //loguot //setLanguage //cardPayment - Оплата //cardRefund - Возврат refundData: data["mosst"] } } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Не достаточно данных, ошибка 3721"); reject(); } console.log("На verifone", jsonData); try { var json = JSON.stringify(jsonData); Android.bankingPayment(json); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); reject(); } returnVerifone.status = "empty"; try { clearInterval(waitingVerifone); } catch (err) {} var waitingVerifone = setInterval(function() { console.log("Опрашиваем Verifone"); if (returnVerifone.status == "done") { clearInterval(waitingVerifone); //alert("Возврат выполнен"); $("#bankingterminalsbox").hide(); resolve(returnVerifone); } }, 500); } catch (err) {} }); }, closeShift: function(device){ try { var jsonData = { protocol: "jsonBased", deviceId: device.id, jsonBased: { command: "closeShift", } } console.log("На verifone", jsonData); try { var json = JSON.stringify(jsonData); Android.bankingPayment(json); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } } catch (err) { app.main.error(device.name + ": " + "Error 3722-1"); } } }, windows_jsonbased_privatbank_ip: { sendpayment: function(device) { var merchId = 0; try{ var merchval = device["settings"]["bankingParams"]["merchId"]; if(merchval > 0){ merchId = merchval; } }catch(err){ } console.log("verifone merchId",merchId) var thisbasket = app.terminal.getbasket(); var visasum = $("#payvisa").val(); var cashsum = $("#paycash").val(); try { try { var jsonData = { products: [{ name: "Товар", quantity: 1, price: round(visasum, 2), }], protocol: "jsonBased", jsonBased: { command: "cardPayment", merchId: merchId }, deviceId:device.id, cashless: round(visasum, 2), cash: round(cashsum, 2), sum: round(thisbasket["info"]["allcena"], 2), } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Error 3722"); } console.log("На verifone", jsonData); try { var request = { method: "banking_payment", data: JSON.stringify(jsonData) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { //console.log("on test request success", response); }, onFailure: function(error_code, error_message) { //console.log("on test request Failure", error_message); } }); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } returnVerifone = {}; returnVerifone.status = "empty"; try { clearInterval(waitingVerifone); } catch (err) {} var waitingVerifone = setInterval(function() { console.log("Опрашиваем Verifone"); if (returnVerifone.status == "done") { clearInterval(waitingVerifone); var thisbasket = app.terminal.getbasket(); returnVerifone.status = "empty"; try{ returnVerifone.terminalId = device.id; }catch(err){ } thisbasket["info"]["bankingData"] = returnVerifone; thisbasket["info"]["mosst"] = JSON.stringify(returnVerifone); app.terminal.paynow(thisbasket); } }, 500); } catch (err) { console.error(err); app.main.error(device.name + ": Error 7743"); // app.terminal.paynow(thisbasket); } }, success: function(json) { try{ var temp = JSON.parse(json); }catch(err){ app.main.error("Error: Ошибка парсина ответа от терминала"); } try{ try{ delete temp.receipt; }catch(err){ console.log("не вдалось вичистити receipt") } try{ temp.bankName = "ПриватБанк"; }catch(err){ } returnVerifone = temp; }catch(err){ app.main.error("Error: 8291"); } $("#bankingterminalconnectingsbox").hide(); returnVerifone.status = "done"; }, error: function(errCode) { $("#bankingterminalconnectingsbox").hide(); verifoneUErr = { "03" : "Format error", "04" : "Retain card", "05" : "External decline", "12" : "Invalid transaction", "13" : "Merchant limit exceeded 14 – Invalid track 2", "20" : "Verification fault", "30" : "Invalid format", "33" : "Expired card", "54" : "Expired card", "41" : "Lost card", "43" : "Stolen card", "51" : "Insufficient funds", "55" : "Invalid PIN, PIN tries exceeded", "58" : "Invalid processing code", "62" : "Invalid MAC", "78" : "Original request not found", "81" : "Wrong format of customer information field 82 – Prepaid code not found", "89" : "Invalid terminal id", "91" : "Destination not available", "94" : "Duplicate transmission", "96" : "System error", //Для привата "1000" : "General error (should be used in exceptional case)", "1001" : "Transaction canceled by user", "1002" : "EMV Decline", "1003" : "Transaction log is full. Need close batch", "1004" : "No connection with host", "1005" : "No paper in printer", "1006" : "Error Crypto keys", "1007" : "Card reader is not connected", "1008" : "Transaction is already complete" }; var errorText = verifoneUErr[errCode]; if(!errorText){ errorText = errCode; } app.main.error("Verifone: "+lang["Ne_udalosy_prinyaty_oplatu_po_beznalu"]+"
• "+errorText); }, status: function(statusText){ app.banking.modules.status(statusText); //app.main.message("Verifone:
• "+statusText); }, statuscode: function(statusCode){ var statusCodes = { "0" : "status code is not available", "1" : "card was read", "2" : "used a chip card", "3" : "authorization in progress", "4" : "waiting for cashier action", "5" : "printing receipt", "6" : "pin entry is needed", "7" : "card was removed", "8" : "EMV multi aid’s", "9" : "waiting for card", "10" : "in progress", "11" : "correct transaction", "12" : "Pin input wait key", "13" : "Pin input backspace pressed", "14" : "Pin input key pressed" } app.banking.modules.status(statusCodes[statusCode]); }, returnsale: function(data) { return new Promise(function(resolve, reject) { var device = data["device"]; console.log(device); try { try { var jsonData = { protocol: "jsonBased", // mosst_apk | ingenico_ua deviceId:device.id, jsonBased: { command: "cardRefund", //authorization //loguot //setLanguage //cardPayment - Оплата //cardRefund - Возврат refundData: data["mosst"] } } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Не достаточно данных, ошибка 3721"); reject(); } console.log("На verifone", jsonData); try { var request = { method: "banking_payment", data: JSON.stringify(jsonData) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { console.warn("on test request success", response); }, onFailure: function(error_code, error_message) { //reject(error_message); console.error("on test request Failure", error_message); } }); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); reject(); } returnVerifone.status = "empty"; try { clearInterval(waitingVerifone); } catch (err) {} var waitingVerifone = setInterval(function() { console.log("Опрашиваем Verifone"); if (returnVerifone.status == "done") { clearInterval(waitingVerifone); resolve(); $("#bankingterminalsbox").hide(); } }, 500); } catch (err) {} }) }, closeShift: function(device){ try { var jsonData = { protocol: "jsonBased", deviceId: device.id, jsonBased: { command: "closeShift", } } console.log("На verifone", jsonData); try { var request = { method: "banking_payment", data: JSON.stringify(jsonData) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { //console.log("on test request success", response); }, onFailure: function(error_code, error_message) { //console.log("on test request Failure", error_message); } }); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } } catch (err) { app.main.error(device.name + ": " + "Error 3722-1"); } } }, windows_jsonbased_privatbank_com: { sendpayment: function(device) { var merchId = 0; try{ var merchval = device["settings"]["bankingParams"]["merchId"]; if(merchval > 0){ merchId = merchval; } }catch(err){ } console.log("verifone merchId",merchId) var thisbasket = app.terminal.getbasket(); var visasum = $("#payvisa").val(); var cashsum = $("#paycash").val(); try { try { var jsonData = { products: [{ name: "Товар", quantity: 1, price: round(visasum, 2), }], protocol: "jsonBased", jsonBased: { command: "cardPayment", merchId: merchId }, deviceId:device.id, cashless: round(visasum, 2), cash: round(cashsum, 2), sum: round(thisbasket["info"]["allcena"], 2), } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Error 3722"); } console.log("На verifone", jsonData); try { var request = { method: "banking_payment", data: JSON.stringify(jsonData) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { //console.log("on test request success", response); }, onFailure: function(error_code, error_message) { //console.log("on test request Failure", error_message); } }); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } returnVerifone = {}; returnVerifone.status = "empty"; try { clearInterval(waitingVerifone); } catch (err) {} var waitingVerifone = setInterval(function() { console.log("Опрашиваем Verifone"); if (returnVerifone.status == "done") { clearInterval(waitingVerifone); var thisbasket = app.terminal.getbasket(); returnVerifone.status = "empty"; try{ returnVerifone.terminalId = device.id; }catch(err){ } thisbasket["info"]["bankingData"] = returnVerifone; thisbasket["info"]["mosst"] = JSON.stringify(returnVerifone); app.terminal.paynow(thisbasket); } }, 500); } catch (err) { console.error(err); app.main.error(device.name + ": Error 7743"); // app.terminal.paynow(thisbasket); } }, success: function(json) { try{ var temp = JSON.parse(json); }catch(err){ app.main.error("Error: Ошибка парсина ответа от терминала"); } try{ try{ delete temp.receipt; }catch(err){ console.log("не вдалось вичистити receipt") } try{ temp.bankName = "ПриватБанк"; }catch(err){ } returnVerifone = temp; }catch(err){ app.main.error("Error: 8291"); } $("#bankingterminalconnectingsbox").hide(); returnVerifone.status = "done"; }, error: function(errCode) { $("#bankingterminalconnectingsbox").hide(); verifoneUErr = { "03" : "Format error", "04" : "Retain card", "05" : "External decline", "12" : "Invalid transaction", "13" : "Merchant limit exceeded 14 – Invalid track 2", "20" : "Verification fault", "30" : "Invalid format", "33" : "Expired card", "54" : "Expired card", "41" : "Lost card", "43" : "Stolen card", "51" : "Insufficient funds", "55" : "Invalid PIN, PIN tries exceeded", "58" : "Invalid processing code", "62" : "Invalid MAC", "78" : "Original request not found", "81" : "Wrong format of customer information field 82 – Prepaid code not found", "89" : "Invalid terminal id", "91" : "Destination not available", "94" : "Duplicate transmission", "96" : "System error", //Для привата "1000" : "General error (should be used in exceptional case)", "1001" : "Transaction canceled by user", "1002" : "EMV Decline", "1003" : "Transaction log is full. Need close batch", "1004" : "No connection with host", "1005" : "No paper in printer", "1006" : "Error Crypto keys", "1007" : "Card reader is not connected", "1008" : "Transaction is already complete" }; var errorText = verifoneUErr[errCode]; if(!errorText){ errorText = errCode; } app.main.error("Verifone: "+lang["Ne_udalosy_prinyaty_oplatu_po_beznalu"]+"
• "+errorText); }, status: function(statusText){ app.banking.modules.status(statusText); //app.main.message("Verifone:
• "+statusText); }, statuscode: function(statusCode){ var statusCodes = { "0" : "status code is not available", "1" : "card was read", "2" : "used a chip card", "3" : "authorization in progress", "4" : "waiting for cashier action", "5" : "printing receipt", "6" : "pin entry is needed", "7" : "card was removed", "8" : "EMV multi aid’s", "9" : "waiting for card", "10" : "in progress", "11" : "correct transaction", "12" : "Pin input wait key", "13" : "Pin input backspace pressed", "14" : "Pin input key pressed" } app.banking.modules.status(statusCodes[statusCode]); }, returnsale: function(data) { return new Promise(function(resolve, reject) { var device = data["device"]; console.log(device); try { try { var jsonData = { protocol: "jsonBased", // mosst_apk | ingenico_ua deviceId:device.id, jsonBased: { command: "cardRefund", //authorization //loguot //setLanguage //cardPayment - Оплата //cardRefund - Возврат refundData: data["mosst"] } } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Не достаточно данных, ошибка 3721"); reject(); } console.log("На verifone", jsonData); try { var request = { method: "banking_payment", data: JSON.stringify(jsonData) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { //console.log("on test request success", response); }, onFailure: function(error_code, error_message) { //console.log("on test request Failure", error_message); } }); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); reject(); } returnVerifone.status = "empty"; try { clearInterval(waitingVerifone); } catch (err) {} var waitingVerifone = setInterval(function() { console.log("Опрашиваем Verifone"); if (returnVerifone.status == "done") { clearInterval(waitingVerifone); //alert("Возврат выполнен"); $("#bankingterminalsbox").hide(); resolve(returnVerifone); } }, 500); } catch (err) {} }); }, closeShift: function(device){ try { var jsonData = { protocol: "jsonBased", deviceId: device.id, jsonBased: { command: "closeShift", } } console.log("На verifone", jsonData); try { var request = { method: "banking_payment", data: JSON.stringify(jsonData) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { //console.log("on test request success", response); }, onFailure: function(error_code, error_message) { //console.log("on test request Failure", error_message); } }); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } } catch (err) { app.main.error(device.name + ": " + "Error 3722-1"); } } }, android_jsonbased_privatbank_usb_pax: { sendpayment: function(device) { var merchId = 0; try{ var merchval = device["settings"]["bankingParams"]["merchId"]; if(merchval > 0){ merchId = merchval; } }catch(err){ } console.log("verifone merchId",merchId) var thisbasket = app.terminal.getbasket(); var visasum = $("#payvisa").val(); var cashsum = $("#paycash").val(); try { try { var jsonData = { products: [{ name: "Товар", quantity: 1, price: round(visasum, 2), }], protocol: "jsonBased", jsonBased: { command: "cardPayment", merchId: merchId }, deviceId:device.id, cashless: round(visasum, 2), cash: round(cashsum, 2), sum: round(thisbasket["info"]["allcena"], 2), } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Error 3722"); } console.log("На verifone", jsonData); try { var json = JSON.stringify(jsonData); Android.bankingPayment(json); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } returnVerifone = {}; returnVerifone.status = "empty"; try { clearInterval(waitingVerifone); } catch (err) {} var waitingVerifone = setInterval(function() { console.log("Опрашиваем Verifone"); if (returnVerifone.status == "done") { clearInterval(waitingVerifone); var thisbasket = app.terminal.getbasket(); returnVerifone.status = "empty"; try{ returnVerifone.terminalId = device.id; }catch(err){ } thisbasket["info"]["bankingData"] = returnVerifone; thisbasket["info"]["mosst"] = JSON.stringify(returnVerifone); app.terminal.paynow(thisbasket); } }, 500); } catch (err) { console.error(err); app.main.error(device.name + ": Error 7743"); // app.terminal.paynow(thisbasket); } }, success: function(json) { try{ var temp = JSON.parse(json); }catch(err){ app.main.error("Error: Ошибка парсина ответа от терминала"); } try{ try{ delete temp.receipt; }catch(err){ console.log("не вдалось вичистити receipt") } try{ temp.bankName = "ПриватБанк"; }catch(err){ } returnVerifone = temp; }catch(err){ app.main.error("Error: 8291"); } $("#bankingterminalconnectingsbox").hide(); returnVerifone.status = "done"; }, error: function(errCode) { $("#bankingterminalconnectingsbox").hide(); verifoneUErr = { "03" : "Format error", "04" : "Retain card", "05" : "External decline", "12" : "Invalid transaction", "13" : "Merchant limit exceeded 14 – Invalid track 2", "20" : "Verification fault", "30" : "Invalid format", "33" : "Expired card", "54" : "Expired card", "41" : "Lost card", "43" : "Stolen card", "51" : "Insufficient funds", "55" : "Invalid PIN, PIN tries exceeded", "58" : "Invalid processing code", "62" : "Invalid MAC", "78" : "Original request not found", "81" : "Wrong format of customer information field 82 – Prepaid code not found", "89" : "Invalid terminal id", "91" : "Destination not available", "94" : "Duplicate transmission", "96" : "System error", //Для привата "1000" : "General error (should be used in exceptional case)", "1001" : "Transaction canceled by user", "1002" : "EMV Decline", "1003" : "Transaction log is full. Need close batch", "1004" : "No connection with host", "1005" : "No paper in printer", "1006" : "Error Crypto keys", "1007" : "Card reader is not connected", "1008" : "Transaction is already complete" }; var errorText = verifoneUErr[errCode]; if(!errorText){ errorText = errCode; } app.main.error("Verifone: "+lang["Ne_udalosy_prinyaty_oplatu_po_beznalu"]+"
• "+errorText); }, status: function(statusText){ app.banking.modules.status(statusText); //app.main.message("Verifone:
• "+statusText); }, statuscode: function(statusCode){ var statusCodes = { "0" : "status code is not available", "1" : "card was read", "2" : "used a chip card", "3" : "authorization in progress", "4" : "waiting for cashier action", "5" : "printing receipt", "6" : "pin entry is needed", "7" : "card was removed", "8" : "EMV multi aid’s", "9" : "waiting for card", "10" : "in progress", "11" : "correct transaction", "12" : "Pin input wait key", "13" : "Pin input backspace pressed", "14" : "Pin input key pressed" } app.banking.modules.status(statusCodes[statusCode]); }, returnsale: function(data) { return new Promise(function(resolve, reject) { var device = data["device"]; console.log(device); try { try { var jsonData = { protocol: "jsonBased", // mosst_apk | ingenico_ua deviceId:device.id, jsonBased: { command: "cardRefund", //authorization //loguot //setLanguage //cardPayment - Оплата //cardRefund - Возврат refundData: data["mosst"] } } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Не достаточно данных, ошибка 3721"); reject(); } console.log("На verifone", jsonData); try { var json = JSON.stringify(jsonData); Android.bankingPayment(json); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); reject(); } returnVerifone.status = "empty"; try { clearInterval(waitingVerifone); } catch (err) {} var waitingVerifone = setInterval(function() { console.log("Опрашиваем Verifone"); if (returnVerifone.status == "done") { clearInterval(waitingVerifone); //alert("Возврат выполнен"); $("#bankingterminalsbox").hide(); resolve(returnVerifone); } }, 500); } catch (err) {} }); }, closeShift: function(device){ try { var jsonData = { protocol: "jsonBased", deviceId: device.id, jsonBased: { command: "closeShift", } } console.log("На verifone", jsonData); try { var json = JSON.stringify(jsonData); Android.bankingPayment(json); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } } catch (err) { app.main.error(device.name + ": " + "Error 3722-1"); } } }, windows_jsonbased_privatbank_com_pax: { sendpayment: function(device) { var merchId = 0; try{ var merchval = device["settings"]["bankingParams"]["merchId"]; if(merchval > 0){ merchId = merchval; } }catch(err){ } console.log("verifone merchId",merchId) var thisbasket = app.terminal.getbasket(); var visasum = $("#payvisa").val(); var cashsum = $("#paycash").val(); try { try { var jsonData = { products: [{ name: "Товар", quantity: 1, price: round(visasum, 2), }], protocol: "jsonBased", jsonBased: { command: "cardPayment", merchId: merchId }, deviceId:device.id, cashless: round(visasum, 2), cash: round(cashsum, 2), sum: round(thisbasket["info"]["allcena"], 2), } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Error 3722"); } console.log("На verifone", jsonData); try { var request = { method: "banking_payment", data: JSON.stringify(jsonData) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { //console.log("on test request success", response); }, onFailure: function(error_code, error_message) { //console.log("on test request Failure", error_message); } }); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } returnVerifone = {}; returnVerifone.status = "empty"; try { clearInterval(waitingVerifone); } catch (err) {} var waitingVerifone = setInterval(function() { console.log("Опрашиваем Verifone"); if (returnVerifone.status == "done") { clearInterval(waitingVerifone); var thisbasket = app.terminal.getbasket(); returnVerifone.status = "empty"; try{ returnVerifone.terminalId = device.id; }catch(err){ } thisbasket["info"]["bankingData"] = returnVerifone; thisbasket["info"]["mosst"] = JSON.stringify(returnVerifone); app.terminal.paynow(thisbasket); } }, 500); } catch (err) { console.error(err); app.main.error(device.name + ": Error 7743"); // app.terminal.paynow(thisbasket); } }, success: function(json) { try{ var temp = JSON.parse(json); }catch(err){ app.main.error("Error: Ошибка парсина ответа от терминала"); } try{ try{ delete temp.receipt; }catch(err){ console.log("не вдалось вичистити receipt") } try{ temp.bankName = "ПриватБанк"; }catch(err){ } returnVerifone = temp; }catch(err){ app.main.error("Error: 8291"); } $("#bankingterminalconnectingsbox").hide(); returnVerifone.status = "done"; }, error: function(errCode) { $("#bankingterminalconnectingsbox").hide(); verifoneUErr = { "03" : "Format error", "04" : "Retain card", "05" : "External decline", "12" : "Invalid transaction", "13" : "Merchant limit exceeded 14 – Invalid track 2", "20" : "Verification fault", "30" : "Invalid format", "33" : "Expired card", "54" : "Expired card", "41" : "Lost card", "43" : "Stolen card", "51" : "Insufficient funds", "55" : "Invalid PIN, PIN tries exceeded", "58" : "Invalid processing code", "62" : "Invalid MAC", "78" : "Original request not found", "81" : "Wrong format of customer information field 82 – Prepaid code not found", "89" : "Invalid terminal id", "91" : "Destination not available", "94" : "Duplicate transmission", "96" : "System error", //Для привата "1000" : "General error (should be used in exceptional case)", "1001" : "Transaction canceled by user", "1002" : "EMV Decline", "1003" : "Transaction log is full. Need close batch", "1004" : "No connection with host", "1005" : "No paper in printer", "1006" : "Error Crypto keys", "1007" : "Card reader is not connected", "1008" : "Transaction is already complete" }; var errorText = verifoneUErr[errCode]; if(!errorText){ errorText = errCode; } app.main.error("Verifone: "+lang["Ne_udalosy_prinyaty_oplatu_po_beznalu"]+"
• "+errorText); }, status: function(statusText){ app.banking.modules.status(statusText); //app.main.message("Verifone:
• "+statusText); }, statuscode: function(statusCode){ var statusCodes = { "0" : "status code is not available", "1" : "card was read", "2" : "used a chip card", "3" : "authorization in progress", "4" : "waiting for cashier action", "5" : "printing receipt", "6" : "pin entry is needed", "7" : "card was removed", "8" : "EMV multi aid’s", "9" : "waiting for card", "10" : "in progress", "11" : "correct transaction", "12" : "Pin input wait key", "13" : "Pin input backspace pressed", "14" : "Pin input key pressed" } app.banking.modules.status(statusCodes[statusCode]); }, returnsale: function(data) { return new Promise(function(resolve, reject) { var device = data["device"]; console.log(device); try { try { var jsonData = { protocol: "jsonBased", // mosst_apk | ingenico_ua deviceId:device.id, jsonBased: { command: "cardRefund", //authorization //loguot //setLanguage //cardPayment - Оплата //cardRefund - Возврат refundData: data["mosst"] } } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Не достаточно данных, ошибка 3721"); reject(); } console.log("На verifone", jsonData); try { var request = { method: "banking_payment", data: JSON.stringify(jsonData) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { //console.log("on test request success", response); }, onFailure: function(error_code, error_message) { //console.log("on test request Failure", error_message); } }); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); reject(); } returnVerifone.status = "empty"; try { clearInterval(waitingVerifone); } catch (err) {} var waitingVerifone = setInterval(function() { console.log("Опрашиваем Verifone"); if (returnVerifone.status == "done") { clearInterval(waitingVerifone); //alert("Возврат выполнен"); $("#bankingterminalsbox").hide(); resolve(returnVerifone); } }, 500); } catch (err) {} }); }, closeShift: function(device){ try { var jsonData = { protocol: "jsonBased", deviceId: device.id, jsonBased: { command: "closeShift", } } console.log("На verifone", jsonData); try { var request = { method: "banking_payment", data: JSON.stringify(jsonData) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { //console.log("on test request success", response); }, onFailure: function(error_code, error_message) { //console.log("on test request Failure", error_message); } }); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } } catch (err) { app.main.error(device.name + ": " + "Error 3722-1"); } } }, windows_jsonbased_privatbank_ip_pax: { sendpayment: function(device) { var merchId = 0; try{ var merchval = device["settings"]["bankingParams"]["merchId"]; if(merchval > 0){ merchId = merchval; } }catch(err){ } console.log("verifone merchId",merchId) var thisbasket = app.terminal.getbasket(); var visasum = $("#payvisa").val(); var cashsum = $("#paycash").val(); try { try { var jsonData = { products: [{ name: "Товар", quantity: 1, price: round(visasum, 2), }], protocol: "jsonBased", jsonBased: { command: "cardPayment", merchId: merchId }, deviceId:device.id, cashless: round(visasum, 2), cash: round(cashsum, 2), sum: round(thisbasket["info"]["allcena"], 2), } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Error 3722"); } console.log("На verifone", jsonData); try { var request = { method: "banking_payment", data: JSON.stringify(jsonData) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { //console.log("on test request success", response); }, onFailure: function(error_code, error_message) { //console.log("on test request Failure", error_message); } }); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } returnVerifone = {}; returnVerifone.status = "empty"; try { clearInterval(waitingVerifone); } catch (err) {} var waitingVerifone = setInterval(function() { console.log("Опрашиваем Verifone"); if (returnVerifone.status == "done") { clearInterval(waitingVerifone); var thisbasket = app.terminal.getbasket(); returnVerifone.status = "empty"; try{ returnVerifone.terminalId = device.id; }catch(err){ } thisbasket["info"]["bankingData"] = returnVerifone; thisbasket["info"]["mosst"] = JSON.stringify(returnVerifone); app.terminal.paynow(thisbasket); } }, 500); } catch (err) { console.error(err); app.main.error(device.name + ": Error 7743"); // app.terminal.paynow(thisbasket); } }, success: function(json) { try{ var temp = JSON.parse(json); }catch(err){ app.main.error("Error: Ошибка парсина ответа от терминала"); } try{ try{ delete temp.receipt; }catch(err){ console.log("не вдалось вичистити receipt") } try{ temp.bankName = "ПриватБанк"; }catch(err){ } returnVerifone = temp; }catch(err){ app.main.error("Error: 8291"); } $("#bankingterminalconnectingsbox").hide(); returnVerifone.status = "done"; }, error: function(errCode) { $("#bankingterminalconnectingsbox").hide(); verifoneUErr = { "03" : "Format error", "04" : "Retain card", "05" : "External decline", "12" : "Invalid transaction", "13" : "Merchant limit exceeded 14 – Invalid track 2", "20" : "Verification fault", "30" : "Invalid format", "33" : "Expired card", "54" : "Expired card", "41" : "Lost card", "43" : "Stolen card", "51" : "Insufficient funds", "55" : "Invalid PIN, PIN tries exceeded", "58" : "Invalid processing code", "62" : "Invalid MAC", "78" : "Original request not found", "81" : "Wrong format of customer information field 82 – Prepaid code not found", "89" : "Invalid terminal id", "91" : "Destination not available", "94" : "Duplicate transmission", "96" : "System error", //Для привата "1000" : "General error (should be used in exceptional case)", "1001" : "Transaction canceled by user", "1002" : "EMV Decline", "1003" : "Transaction log is full. Need close batch", "1004" : "No connection with host", "1005" : "No paper in printer", "1006" : "Error Crypto keys", "1007" : "Card reader is not connected", "1008" : "Transaction is already complete" }; var errorText = verifoneUErr[errCode]; if(!errorText){ errorText = errCode; } app.main.error("Verifone: "+lang["Ne_udalosy_prinyaty_oplatu_po_beznalu"]+"
• "+errorText); }, status: function(statusText){ app.banking.modules.status(statusText); //app.main.message("Verifone:
• "+statusText); }, statuscode: function(statusCode){ var statusCodes = { "0" : "status code is not available", "1" : "card was read", "2" : "used a chip card", "3" : "authorization in progress", "4" : "waiting for cashier action", "5" : "printing receipt", "6" : "pin entry is needed", "7" : "card was removed", "8" : "EMV multi aid’s", "9" : "waiting for card", "10" : "in progress", "11" : "correct transaction", "12" : "Pin input wait key", "13" : "Pin input backspace pressed", "14" : "Pin input key pressed" } app.banking.modules.status(statusCodes[statusCode]); }, returnsale: function(data) { return new Promise(function(resolve, reject) { var device = data["device"]; console.log(device); try { try { var jsonData = { protocol: "jsonBased", // mosst_apk | ingenico_ua deviceId:device.id, jsonBased: { command: "cardRefund", //authorization //loguot //setLanguage //cardPayment - Оплата //cardRefund - Возврат refundData: data["mosst"] } } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Не достаточно данных, ошибка 3721"); reject(); } console.log("На verifone", jsonData); try { var request = { method: "banking_payment", data: JSON.stringify(jsonData) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { console.warn("on test request success", response); }, onFailure: function(error_code, error_message) { //reject(error_message); console.error("on test request Failure", error_message); } }); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); reject(); } returnVerifone.status = "empty"; try { clearInterval(waitingVerifone); } catch (err) {} var waitingVerifone = setInterval(function() { console.log("Опрашиваем Verifone"); if (returnVerifone.status == "done") { clearInterval(waitingVerifone); resolve(); $("#bankingterminalsbox").hide(); } }, 500); } catch (err) {} }) }, closeShift: function(device){ try { var jsonData = { protocol: "jsonBased", deviceId: device.id, jsonBased: { command: "closeShift", } } console.log("На verifone", jsonData); try { var request = { method: "banking_payment", data: JSON.stringify(jsonData) } window.cefQuery({request: JSON.stringify(request), persistent: false, onSuccess: function(response) { //console.log("on test request success", response); }, onFailure: function(error_code, error_message) { //console.log("on test request Failure", error_message); } }); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } } catch (err) { app.main.error(device.name + ": " + "Error 3722-1"); } } }, android_jsonbased_privatbank_ip_pax: { sendpayment: function(device) { var merchId = 0; try{ var merchval = device["settings"]["bankingParams"]["merchId"]; if(merchval > 0){ merchId = merchval; } }catch(err){ } console.log("verifone merchId",merchId) var thisbasket = app.terminal.getbasket(); var visasum = $("#payvisa").val(); var cashsum = $("#paycash").val(); try { try { var jsonData = { products: [{ name: "Товар", quantity: 1, price: round(visasum, 2), }], protocol: "jsonBased", jsonBased: { command: "cardPayment", merchId: merchId }, deviceId:device.id, cashless: round(visasum, 2), cash: round(cashsum, 2), sum: round(thisbasket["info"]["allcena"], 2), } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Error 3722"); } console.log("На verifone", jsonData); try { var json = JSON.stringify(jsonData); Android.bankingPayment(json); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } returnVerifone = {}; returnVerifone.status = "empty"; try { clearInterval(waitingVerifone); } catch (err) {} var waitingVerifone = setInterval(function() { console.log("Опрашиваем Verifone"); if (returnVerifone.status == "done") { clearInterval(waitingVerifone); var thisbasket = app.terminal.getbasket(); returnVerifone.status = "empty"; try{ returnVerifone.terminalId = device.id; }catch(err){ } thisbasket["info"]["bankingData"] = returnVerifone; thisbasket["info"]["mosst"] = JSON.stringify(returnVerifone); app.terminal.paynow(thisbasket); } }, 500); } catch (err) { console.error(err); app.main.error(device.name + ": Error 7743"); // app.terminal.paynow(thisbasket); } }, success: function(json) { try{ var temp = JSON.parse(json); }catch(err){ app.main.error("Error: Ошибка парсина ответа от терминала"); } try{ try{ delete temp.receipt; }catch(err){ console.log("не вдалось вичистити receipt") } try{ temp.bankName = "ПриватБанк"; }catch(err){ } returnVerifone = temp; }catch(err){ app.main.error("Error: 8291"); } $("#bankingterminalconnectingsbox").hide(); returnVerifone.status = "done"; }, error: function(errCode) { $("#bankingterminalconnectingsbox").hide(); verifoneUErr = { "03" : "Format error", "04" : "Retain card", "05" : "External decline", "12" : "Invalid transaction", "13" : "Merchant limit exceeded 14 – Invalid track 2", "20" : "Verification fault", "30" : "Invalid format", "33" : "Expired card", "54" : "Expired card", "41" : "Lost card", "43" : "Stolen card", "51" : "Insufficient funds", "55" : "Invalid PIN, PIN tries exceeded", "58" : "Invalid processing code", "62" : "Invalid MAC", "78" : "Original request not found", "81" : "Wrong format of customer information field 82 – Prepaid code not found", "89" : "Invalid terminal id", "91" : "Destination not available", "94" : "Duplicate transmission", "96" : "System error", //Для привата "1000" : "General error (should be used in exceptional case)", "1001" : "Transaction canceled by user", "1002" : "EMV Decline", "1003" : "Transaction log is full. Need close batch", "1004" : "No connection with host", "1005" : "No paper in printer", "1006" : "Error Crypto keys", "1007" : "Card reader is not connected", "1008" : "Transaction is already complete" }; var errorText = verifoneUErr[errCode]; if(!errorText){ errorText = errCode; } app.main.error("Verifone: "+lang["Ne_udalosy_prinyaty_oplatu_po_beznalu"]+"
• "+errorText); }, status: function(statusText){ app.banking.modules.status(statusText); //app.main.message("Verifone:
• "+statusText); }, statuscode: function(statusCode){ var statusCodes = { "0" : "status code is not available", "1" : "card was read", "2" : "used a chip card", "3" : "authorization in progress", "4" : "waiting for cashier action", "5" : "printing receipt", "6" : "pin entry is needed", "7" : "card was removed", "8" : "EMV multi aid’s", "9" : "waiting for card", "10" : "in progress", "11" : "correct transaction", "12" : "Pin input wait key", "13" : "Pin input backspace pressed", "14" : "Pin input key pressed" } app.banking.modules.status(statusCodes[statusCode]); }, returnsale: function(data) { return new Promise(function(resolve, reject) { var device = data["device"]; console.log(device); try { try { var jsonData = { protocol: "jsonBased", // mosst_apk | ingenico_ua deviceId:device.id, jsonBased: { command: "cardRefund", //authorization //loguot //setLanguage //cardPayment - Оплата //cardRefund - Возврат refundData: data["mosst"] } } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Не достаточно данных, ошибка 3721"); reject(); } console.log("На verifone", jsonData); try { var json = JSON.stringify(jsonData); Android.bankingPayment(json); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); reject(); } returnVerifone.status = "empty"; try { clearInterval(waitingVerifone); } catch (err) {} var waitingVerifone = setInterval(function() { console.log("Опрашиваем Verifone"); if (returnVerifone.status == "done") { clearInterval(waitingVerifone); //alert("Возврат выполнен"); $("#bankingterminalsbox").hide(); resolve(returnVerifone); } }, 500); } catch (err) {} }) }, closeShift: function(device){ try { var jsonData = { protocol: "jsonBased", deviceId: device.id, jsonBased: { command: "closeShift", } } console.log("На verifone", jsonData); try { var json = JSON.stringify(jsonData); Android.bankingPayment(json); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } } catch (err) { app.main.error(device.name + ": " + "Error 3722-1"); } } }, android_tapxphone:{ sendpayment: function(device) { var thisbasket = app.terminal.getbasket(); var visasum = $("#payvisa").val(); var cashsum = $("#paycash").val(); try { try { var jsonData = { products: [{ name: "Товар", quantity: 1, price: round(visasum, 2), }], protocol: "android_tapxphone", tapXPhone:{ data:{ edit:false, currency:"UAH", receipt:true, operation:"contactless", stay:false } }, deviceId:device.id, cashless: round(visasum, 2), cash: round(cashsum, 2), sum: round(thisbasket["info"]["allcena"], 2), } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Error 3722"); } console.log("На tapXphone", jsonData); try { var json = JSON.stringify(jsonData); Android.bankingPayment(json); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } returnVerifone = {}; returnVerifone.status = "empty"; try { clearInterval(waitingVerifone); } catch (err) {} var waitingVerifone = setInterval(function() { console.log("Опрашиваем tapXphone"); if (returnVerifone.status == "done") { clearInterval(waitingVerifone); var thisbasket = app.terminal.getbasket(); returnVerifone.status = "empty"; try{ returnVerifone.terminalId = device.id; }catch(err){ } thisbasket["info"]["bankingData"] = returnVerifone; thisbasket["info"]["bankingData"]["bankName"] = "ConcordBank"; thisbasket["info"]["mosst"] = JSON.stringify(returnVerifone); app.terminal.paynow(thisbasket); } }, 500); } catch (err) { console.error(err); app.main.error(device.name + ": Error 7743"); // app.terminal.paynow(thisbasket); } }, success: function(json) { try{ var temp = JSON.parse(json); }catch(err){ app.main.error("Error: Помилка парсінгу відповіді від терміналу"); } try{ try{ delete temp.receipt; }catch(err){ console.log("Не вдалось вичистити receipt") } try{ temp.bankName = "concordBank"; }catch(err){ } returnVerifone = temp; }catch(err){ app.main.error("Error: 8291"); } $("#bankingterminalconnectingsbox").hide(); returnVerifone.status = "done"; }, error: function(errCode) { $("#bankingterminalconnectingsbox").hide(); var tapXphoneErrors = { "0" : "The transaction was successful", "512" : "Device blocked", "900" : "Transaction execution error", "999" : "The status of the payment transaction is unknown", "903" : "Intent has an invalid UID", "904" : "Issue with connection between tapXphone mobile application and tapXphone back- end", "905" : "Invalid payment transaction type in token", "906" : "Intent has an invalid locale", "907" : "Amount invalid for the session token", "908" : "Overlay detected", "909" : "The device successfully configured and can be used for payment", "910" : "The device setup required", "911" : "Developer mode detected", "912" : "Split screen detected", "913" : "Error in the formation of a request to the server", "914" : "Encryption error", "915" : "Error receiving a response from the server", "916" : "Response parsing error", "917" : "No currency selected", "918" : "Invalid data for the operation", "919" : "JNI error", "920" : "Decline transaction during processing", "921" : "The transaction is canceled after execution within one session", "922" : "Lack of external data from the token", "923" : "Reset application settings required", "924" : "Incorrect device status" }; var errorText = tapXphoneErrors[errCode]; if(!errorText){ errorText = errCode; } app.main.error("tapXphone: "+lang["Ne_udalosy_prinyaty_oplatu_po_beznalu"]+"
• "+errorText); }, returnsale: function(data) { return new Promise(function(resolve, reject) { console.log('returnsaledata',data); var device = data["device"]; console.log(device); try { try { var concordData = data["mosst"]["check"]; var jsonData = { protocol: "android_tapxphone", // mosst_apk | ingenico_ua deviceId:device.id, tapXPhone:{ data:{ edit:false, currency:"UAH", receipt:true, operation:"combo", // тут refund при поверненні stay:false, rrn:concordData.rrn } }, sum:concordData.amt } } catch (err) { var jsonData = {} app.main.error(device.name + ": " + "Не достатньо данних, помилка 3721"); reject(); } console.log("На tapXphone", jsonData); try { var json = JSON.stringify(jsonData); Android.bankingPayment(json); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); reject(); } returnVerifone.status = "empty"; try { clearInterval(waitingVerifone); } catch (err) {} var waitingVerifone = setInterval(function() { console.log("Опрашиваем tapXphone"); if (returnVerifone.status == "done") { clearInterval(waitingVerifone); //alert("Возврат выполнен"); $("#bankingterminalsbox").hide(); resolve(returnVerifone); } }, 500); } catch (err) {} }); }, closeShift: function(device){ try { var jsonData = { protocol: "jsonBased", deviceId: device.id, jsonBased: { command: "closeShift", } } console.log("На verifone", jsonData); try { var json = JSON.stringify(jsonData); Android.bankingPayment(json); } catch (err) { console.warn('Возможно это не Java приложение на виндовс по этому ошибка'); } } catch (err) { app.main.error(device.name + ": " + "Error 3722-1"); } }} }, }, pool:{ init: function(device) { //app.pool.timer.start(5); $("#timerBox").show(); app.pool.buttons("start"); poolserver["device"] = device; try { poolserver["timers"] = JSON.parse(localStorage["timers"]); var poolarray = $.map(poolserver["timers"], function(value, index) { return [value]; }); //Перебираем таймеры poolarray.forEach(function(element) { console.log("element", element); if (element.desktop > 0 && element.status == 1) { app.pool.opentimer(element.desktop); } }); } catch (err) { poolserver["timers"] = {}; } }, buttons: function(button) { $("#startTimer").hide(); $("#stopTimer").hide(); switch (button) { case "start": $("#startTimer").show(); break; case "stop": $("#stopTimer").show(); break; } }, opentimer: function(desktop) { if(desktop != currentdesktop){ $("#timer").html("__:__"); } app.pool.buttons("start"); var data = poolserver["timers"][desktop]; if (data == undefined) { $("#timer").html("00:00"); } else { if (data["status"] == 1) { if (data["minutes"] > 0) { app.pool.timer.startback(data); } else { app.pool.timer.startforward(data); } } else { $("#timer").html("00:00"); } } }, timer: { start: function(min) { if (!min) { //Секундомер app.pool.timer.startforward({ datetime: new Date(), desktop: currentdesktop, status: 1 }); } else { //Таймер обратного отсчёта app.pool.timer.startback({ desktop: currentdesktop, datetime: new Date(), minutes: min, status: 1 }); } app.pool.localstorage.save(); }, startforward: function(obj) { app.pool.poolserver.on(obj.desktop); console.log("startforward", obj); var e = obj.datetime; var setdate = new Date(e); now = new Date(); sec = (now - setdate) / 1000; sec = Math.round(sec); if (isNaN(sec)) { sec = 0; } app.pool.buttons("stop"); var timer = sec; var minute = 0; var second = 0; if (!app.main.ifobject(poolserver, "timers." + obj.desktop + ".counter")) { poolserver["timers"][obj.desktop] = obj; } else { clearInterval(poolserver["timers"][obj.desktop]["counter"]); } if (obj.desktop > 0) { obj.reload = 0; poolserver["timers"][obj.desktop]["counter"] = setInterval(function(obj) { ++timer; obj.reload++; minute = Math.floor((timer) / 60); second = timer - minute * 60; if (minute < 10) minute = '0' + minute; if (second < 10) second = '0' + second; if (obj.desktop == currentdesktop) { $('#timer').html(minute + ':' + second); } else { //$("#timer").html("00:00"); } console.log("Таймер:" + obj.desktop, minute + ':' + second); if(obj.reload > 60){ app.pool.opentimer(obj.desktop); console.log("reloadtimer"); } }, 1000, obj); } }, startback: function(obj) { var e = obj.datetime; //"Время начала работы таймера обратного отсчёта" var end = obj.minutes; //"Колво минут для отсчёта" poolserver["timers"][obj.desktop] = obj; //от даты запуска отнять текущую дату и отнять от sec var setdate = new Date(e); var now = new Date(); var secb = (setdate - now) / 1000; secb = Math.round(secb); var sec = end * 60 + secb; sec = Math.round(sec); if (isNaN(sec)) { sec = 0; } app.pool.buttons("stop"); //Включаем свет app.pool.poolserver.on(obj.desktop); var timer = sec; var minute = 0; var second = 0; if (!app.main.ifobject(poolserver, "timers." + obj.desktop + ".counter")) { poolserver["timers"][obj.desktop] = obj; } else { clearInterval(poolserver["timers"][obj.desktop]["counter"]); } obj.reload = 0; poolserver["timers"][obj.desktop]["counter"] = setInterval(function(obj) { --timer; obj.reload++; if (timer <= 0) { //Выключаем свет app.pool.timer.stop(obj.desktop); //app.pool.poolserver.off(obj.desktop); app.pool.localstorage.save(); } minute = Math.floor((timer) / 60); second = timer - minute * 60; if (minute < 10) minute = '0' + minute; if (second < 10) second = '0' + second; if (obj.desktop == currentdesktop) { $('#timer').html(minute + ':' + second); } console.log("Таймер:" + obj.desktop, minute + ':' + second); if(obj.reload > 60){ app.pool.opentimer(obj.desktop); console.log("reloadtimer"); } }, 1000, obj); app.pool.localstorage.save(); }, stop: function(desktop) { if (desktop == undefined) { desktop = currentdesktop; } try { clearInterval(poolserver["timers"][desktop]["counter"]); } catch (err) { console.log("Не удалось остановить таймер") } $('#timer').html("00:00"); app.pool.buttons("start"); if (poolserver["timers"][desktop]["minutes"] > 0) { var kolvo = Math.round((poolserver["timers"][desktop]["minutes"] * 60 + Math.round((new Date(poolserver["timers"][desktop]["datetime"]) - new Date()) / 1000)) / 60); app.main.message("Остаток:" + kolvo); try { poolserver["timers"][desktop]["minutes"] = ""; } catch (err) { console.log("Не удалось очисьть таймер"); } } else { var kolvo = Math.round((new Date() - new Date(poolserver["timers"][desktop]["datetime"])) / 1000 / 60); if (kolvo > 0) { //app.main.message(kolvo); var arrrrrrr = preload["time"][currentsklad]; try{ if(arrrrrrr.length > 1){ $("#neskolkotovarovbox").show().animateCss("fadeInUp"); $('#neskolkotovarov').iPut({ jsonData: arrrrrrr, irepeat: "mods", name: 'goods' }); /*Выбор товара*/ $(".timetrigger_addbasket").off(); $(".timetrigger_addbasket").on('click', function() { var obj = []; obj["tovarid"] = $(this).attr("data"); obj["kolvo"] = kolvo; app.main.transformfunc("#tov" + obj["tovarid"]); //obj["mods"] = $(this).attr("mods"); app.terminal.productsinit(obj); $('#neskolkotovarovbox').animateCss('fadeOutDown', function(){$('#neskolkotovarovbox').hide()}); }); }else{ if(arrrrrrr.length == 1){ obj["tovarid"] = arrrrrrr["0"]["id"]; obj["kolvo"] = kolvo; app.terminal.productsinit(obj); } } }catch(err){ app.main.error(lang["Ne_naydeno_tova_hi42r"]); } } else { app.main.error(lang["Vremya_menee_mi_za76e"]); } } poolserver["timers"][desktop] = {} //Выключаем свет app.pool.poolserver.off(desktop); //Сохраняем app.pool.localstorage.save(); }, }, localstorage: { save: function() { try { localStorage["timers"] = JSON.stringify(poolserver["timers"]); } catch (err) { console.log("не удалось сохранить данные о таймерах") } } }, poolserver: { on: function(desktop) { app.pool.poolserver.send({ "desktop": desktop, "status": 1 }) }, off: function(desktop) { app.pool.poolserver.send({ "desktop": desktop, "status": 0 }) }, test: function() {}, send: function(obj) { var ip = "127.0.0.1"; var desktop = 0; var status = 0; try { var ip = poolserver["device"]["ip"]; } catch (err) { console.log("Не удалось получить IP блока управления освещением"); } try { var desktop = obj["desktop"]; } catch (err) { console.log("Не удалось получить номер стола для включения освещения"); } try { if (obj["status"] == 1) { status = 1; } } catch (err) { console.log("Не удалось получить параметр для управления освещением"); } if(ip != "127.0.0.1"){ try { var jsonData2 = { "requestMethod": "GET", "url": "http://" + ip + ":862/?d=" + desktop + "&p=" + status } window.cefQuery({ request: JSON.stringify({ method: "http_sender", data: JSON.stringify(jsonData2) }), persistent: true, onSuccess: function (response) { try{ var content = JSON.parse(response); console.log("cef",content.response) if (content.response == "on") { app.main.message(lang["Osveschenie_vkl_r66na"]); } if (content.response == "off") { app.main.message(lang["Osveschenie_vyk_t672a"]); } }catch(err){ app.main.error(lang["Proveryte_soedi_at5e2"]); } }, onFailure: function (error_code, error_message) { app.main.error(lang["Proveryte_soedi_at5e2"]); } }); } catch (err) { xhr("http://" + ip + ":862/?d=" + desktop + "&p=" + status).then(function(response) { if (response == "on") { app.main.message(lang["Osveschenie_vkl_r66na"]); } if (response == "off") { app.main.message(lang["Osveschenie_vyk_t672a"]); } }).catch(function(error) { app.main.error(lang["Proveryte_soedi_at5e2"]); }) } } }, }, }, update: { init: function() { $(".update-set").on('click', function() { $(".update-box").hide(); setTimeout(function() { window.location = "/?section=pos&lang=" + preload["currentlang"]; }, 100); }) }, }, notification:{ init: function() { sPut["msglist"] = []; $.sPut("msglist", sPut["msglist"]); var jsonData = encodeURIComponent(JSON.stringify({ "sklad": currentsklad })); app.main.getjson("/?section=db&db=readmessages", jsonData).then(function(content) { if (content["new"] > 0) { app.notification.setindicator(content["new"]); //jPut["msglist"].data = content.newmessages; sPut["msglist"] = content.newmessages; $.sPut("msglist", sPut["msglist"]); } else { app.notification.setindicator(0); } }); }, open: function() { var jsonData = encodeURIComponent(JSON.stringify({ "sklad": currentsklad })); try { app.main.loader("show"); } catch (err) {} app.main.getjson("/?section=db&db=readmessages", jsonData).then(function(content) { app.notification.setindicator(content["new"]); if (content["new"] > 0) { // jPut["msglist"].data = content.newmessages; sPut["msglist"] = content.newmessages; $.sPut("msglist", sPut["msglist"]); document.getElementById("mySidenav").style.marginRight = "0px"; } else { app.main.error(lang["Net_novyh_soobs_dbinf"]); } console.log("readmsg", content); }); // document.getElementById("sideNavTabs").style.width = "320px"; }, /* Set the width of the side navigation to 0 */ close: function() { document.getElementById("mySidenav").style.marginRight = "-320px"; }, readmsg: function() { var jsonData = encodeURIComponent(JSON.stringify({ "sklad": currentsklad })); try { app.main.loader("show"); } catch (err) {} app.main.getjson("/?section=db&db=readmessages", jsonData).then(function(content) { if (content["new"] > 0) { app.notification.setindicator(content["new"]); //jPut["msglist"].data = content.newmessages; sPut["msglist"] = content.newmessages; $.sPut("msglist", sPut["msglist"]); } else { app.main.error(lang["Net_novyh_soobs_dbinf"]); } console.log("readmsg", content); }); }, closemsg: function(id) { try { app.main.loader("show"); } catch (err) {} app.main.getjson("/?section=db&db=messagestatus&id=" + id).then(function(content) { app.notification.setindicator(content["new"]); if (content["new"] < 1) { app.notification.close(); //jPut["msglist"].data = []; sPut["msglist"] = []; $.sPut("msglist", sPut["msglist"]); } else { jPut["msglist"].data = content.newmessages; } console.log("readmsg", content); }); }, openorder: function(id) { if (currentblock == "terminal") { try { app.main.loader("show"); } catch (err) {} app.terminal.basket.archive.add() app.main.getjson("/?section=db&db=applyorder&id=" + id+"&sklad="+currentsklad).then(function(content) { console.log("Заказ", content.order.products) createobj(preload, "basket", currentsklad, currentzal, currentdesktop, content.order.products); content.order.info.onlineorderid = content.id; content.order.info.deliverydata = content.order.info.delivery createobj(preload, "desktop_settings", currentsklad, currentzal, currentdesktop, content.order.info); if (preload["sklad"][currentsklad]["serversynk"] == 1) { app.main.syncserver.send(); //правка если синхронизация включена }else{ app.halldesktop.opendesktop(currentdesktop) } var client = content.order.info.client; var clinet_id = client.id; if(preload["clients"][clinet_id] == null){ //Подкидаем данные preload.clients[clinet_id] = { id: clinet_id, name: client.name, phone: client.phone } app.clients.change(clinet_id); }else{ app.clients.change(clinet_id); } app.main.savetolocal(); app.notification.init(); app.notification.close(); }); }else{ app.main.error(lang["ViberiteStol"]); } }, setindicator: function(e) { if (e > 0) { $(".update-box").show(); $(".newmessage").html(e); $(".messageindicator").css("color", "#ffe200"); } else { //$(".update-box").hide(); $(".newmessage").html(0); $(".messageindicator").css("color", "#fff"); } }, }, smena: { cassacorrect: function(){ if(preload["sklad"][currentsklad]["smenaopenask"] == 1) { comment = $("#correct_balance_comments").val(); console.log(comment); $("#sendcorrectbalance").attr("disabled", true) var data = $("#correct_balance_form").serializeJSON(); data["id"] = getRandomInt(1, 99999); if (preload["sklad"][currentsklad]["pin"] != 1) { currentuser = $("#userseller1").val(); } data["userbase"] = preload["userbase"]; /* data["time"] = currentTime(); data["date"] = currentDate(); */ data["type"] = "prihod"; data["comments"] = lang["IntrodactionCashCorrectInMomentCloseShift"] +""+ comment; data["day"] = currentDay(); data["smena"] = currentsmena; data["sklad"] = currentsklad; data["user"] = currentuser; var json = JSON.stringify(data); $(".kassa_cash").html("..."); val = $("#correct_ask_cena").val() // Сумма может быть меньше нуля или ноль if (val == "" || val == 0) { app.main.error(lang["Summa_ne_moghet_byty_0_ili_menyshe"]); $("#sendcorrectbalance").attr("disabled", false) } else { app.main.loader("show"); app.main.getjson("/?section=db&db=magic&action=cash_edit&sklad=" + currentsklad, "data=" + json).then(function (content) { $(".kassa_cash").html(content.cash); // app.kassamotion.getcash(); $('#cassacorrectbox').animateCss('fadeOutDown', function(){$('#cassacorrectbox').hide()}); /*Отправка на фискальник*/ // switch (data["type"]) { // case "prihod": // app.print.print.introduction(data) // break; // case "ink": // app.print.print.incasation(data); // break; // case "rashod": // app.print.print.rashod(data); // break; //} $("#sendcorrectbalance").attr("disabled", false); }, function (err) { $("#sendcorrectbalance").attr("disabled", false); }); } $("#closesmenabuttony").attr("disabled", false); }else { console.log("smenaopen ask != 1, окно не должно вызываться"); } }, smenareport: function(obj) { try { var thisuser = obj["user"] } catch(err) { var thisuser = ""; } /*Очистить отчет за смену*/ jPut["historylisttop"].data = []; $("#reports_statistics_global_form_check").html(""); $("#reports_statistics_global_form_average").html(""); $("#reports_statistics_global_form_skladsumm").html(""); $("#reports_statistics_global_form_summ").html(""); $("#reports_statistics_global_form_visa").html(""); $("#reports_statistics_global_form_bonus").html(""); $(".statisticbox_bonusbox").hide(); $("#reports_statistics_global_form_nall").html(""); $("#reports_statistics_global_form_rashodizkassi").html(""); $("#reports_statistics_global_form_incasationcash").html(""); $("#reports_statistics_global_form_prihodcash").html(""); app.main.loader("show"); app.main.getjson("/?section=db&db=smenareport&user=" + thisuser + "&sklad=" + currentsklad + "&smena=" + currentsmena).then(function(content) { var nall = content.summ - content.visa; $("#reports_statistics_global_form_check").html(content.check); $("#reports_statistics_global_form_average").html(content.average.toFixed(2)); $("#reports_statistics_global_form_skladsumm").html(content.goods); $("#reports_statistics_global_form_summ").html(content.summ.toFixed(2)); $("#reports_statistics_global_form_visa").html(content.visa.toFixed(2)); $("#reports_statistics_global_form_bonus").html(-content.bonuspaysum.toFixed(2)); if(content.bonuspaysum > 0){ $(".statisticbox_bonusbox").show(); } $("#reports_statistics_global_form_nall").html(nall.toFixed(2)); $("#reports_statistics_global_form_rashodizkassi").html(content.rashodcash.toFixed(2)); $("#reports_statistics_global_form_incasationcash").html(content.incasationcash.toFixed(2)); $("#reports_statistics_global_form_prihodcash").html(content.prihodcash.toFixed(2)); try { $("#thisusersmenadatatime").html(lang["ot"] + " " + content.smena.date + " " + content.smena.time); } catch(err) { $("#thisusersmenadatatime").html("") } try { jPut["historylisttop"].data = content["products"]; } catch(err) {} }); }, incasationreport: function(obj) { $('#smenareportbox').animateCss('fadeOutDown', function() { $('#smenareportbox').hide() }); $("#incasation_detailbox").show().animateCss("fadeInUp"); app.main.loader("show"); app.main.getjson("/?section=db&db=magic&sql=archive&action=read&type=cash_ink&smena=" + currentsmena + "users=name&sklad=" + currentsklad + "&exclude=date&&of=id&ot=desc&pagelimit=99999999999").then(function(content) { // var nall = content.summ - content.visa; // $("#reports_statistics_global_form_check").html(content.check); // $("#reports_statistics_global_form_average").html(content.average.toFixed(2)); // $("#reports_statistics_global_form_skladsumm").html(content.goods); // $("#reports_statistics_global_form_summ").html(content.summ.toFixed(2)); // $("#reports_statistics_global_form_visa").html(content.visa.toFixed(2)); // $("#reports_statistics_global_form_nall").html(nall.toFixed(2)); // $("#reports_statistics_global_form_rashodizkassi").html(content.rashodcash.toFixed(2)); // $("#reports_statistics_global_form_incasationcash").html(content.incasationcash.toFixed(2)); // $("#reports_statistics_global_form_prihodcash").html(content.prihodcash.toFixed(2)); // try { // $("#thisusersmenadatatime").html(lang["ot"] + " " + content.smena.date + " " + content.smena.time); // } catch (err) { // $("#thisusersmenadatatime").html("") // } try { jPut["incassationlist"].data = content["products"]; } catch(err) {} console.log(content); }); }, prihodreport: function(obj) { $('#smenareportbox').animateCss('fadeOutDown', function() { $('#smenareportbox').hide() }); $("#prihod_detailbox").show().animateCss("fadeInUp"); app.main.loader("show"); app.main.getjson("/?section=db&db=magic&sql=archive&action=read&type=cash_vnesenie&smena=" + currentsmena + "users=name&sklad=" + currentsklad + "&exclude=date&&of=id&ot=desc&pagelimit=99999999999").then(function(content) { // var nall = content.summ - content.visa; // $("#reports_statistics_global_form_check").html(content.check); // $("#reports_statistics_global_form_average").html(content.average.toFixed(2)); // $("#reports_statistics_global_form_skladsumm").html(content.goods); // $("#reports_statistics_global_form_summ").html(content.summ.toFixed(2)); // $("#reports_statistics_global_form_visa").html(content.visa.toFixed(2)); // $("#reports_statistics_global_form_nall").html(nall.toFixed(2)); // $("#reports_statistics_global_form_rashodizkassi").html(content.rashodcash.toFixed(2)); // $("#reports_statistics_global_form_incasationcash").html(content.incasationcash.toFixed(2)); // $("#reports_statistics_global_form_prihodcash").html(content.prihodcash.toFixed(2)); // try { // $("#thisusersmenadatatime").html(lang["ot"] + " " + content.smena.date + " " + content.smena.time); // } catch (err) { // $("#thisusersmenadatatime").html("") // } try { jPut["prihodlist"].data = content["products"]; } catch(err) {} console.log(content); }); }, rashodreport: function(obj) { $('#smenareportbox').animateCss('fadeOutDown', function() { $('#smenareportbox').hide() }); $("#rashod_detailbox").show().animateCss('fadeInUp'); app.main.loader("show"); app.main.getjson(" /?section=db&db=magic&sql=archive&action=read&type=cash_rashod&smena=" + currentsmena + "users=name&sklad=" + currentsklad + "&exclude=date&&of=id&ot=desc&pagelimit=99999999999").then(function(content) { // var nall = content.summ - content.visa; // $("#reports_statistics_global_form_check").html(content.check); // $("#reports_statistics_global_form_average").html(content.average.toFixed(2)); // $("#reports_statistics_global_form_skladsumm").html(content.goods); // $("#reports_statistics_global_form_summ").html(content.summ.toFixed(2)); // $("#reports_statistics_global_form_visa").html(content.visa.toFixed(2)); // $("#reports_statistics_global_form_nall").html(nall.toFixed(2)); // $("#reports_statistics_global_form_rashodizkassi").html(content.rashodcash.toFixed(2)); // $("#reports_statistics_global_form_incasationcash").html(content.incasationcash.toFixed(2)); // $("#reports_statistics_global_form_prihodcash").html(content.prihodcash.toFixed(2)); // try { // $("#thisusersmenadatatime").html(lang["ot"] + " " + content.smena.date + " " + content.smena.time); // } catch (err) { // $("#thisusersmenadatatime").html("") // } try { jPut["rashodlist"].data = content["products"]; } catch(err) {} console.log(content); }); }, initsmena: function(obj) { if(preload["sklad"][currentsklad]["pin"] != 1) { currentuser = $("#userseller1").val(); } if(currentuser == "" || currentuser == 0 || currentuser == null) { var users = $.map(preload["users"][currentsklad], function(value, index) { return [value]; }); console.log("users", users); //currentuser = users[0]["user_id"]; currentuser = preload["userid"]; } app.smena.newsmena({ "user": currentuser }); console.log("Вошел пользователь", currentuser); app.kassamotion.getcash(); }, newsmena: function(obj) { currentsmena = ""; console.log("newsmena", obj) try { var thisuser = obj["user"] } catch(err) { var thisuser = currentuser } app.main.loader("show"); app.main.getjson("/?section=db&db=magic&action=newsmenaverify&user=" + thisuser + "&sklad=" + currentsklad).then(function(content) { if(content.smenastatus == "closed") { app.main.opensmenaask(); $("#opennewsmenanow").off(); $("#opennewsmenanow").on('click', function(){ $("#opennewsmenanow").attr("disabled", true); app.main.loader("show"); app.print.print.opensmena().then(function(success) { console.warn('success!!!!!!', success); opensmenanow(success); }, function(error) { console.error(error); app.main.loader("hide"); $("#opennewsmenanow").attr("disabled", false); app.main.error("Не выполнена фискальная операция открытия смены"); $("#sendtranzakciu").attr("disabled", false); $('#openSmenaAskBox').animateCss('fadeOutDown', function() { $('#openSmenaAskBox').hide(); }); try { if(error.device.promise == 2) { $("#repeatrro").show(); $(".repeatrrobutton").off(); $(".repeatrrobutton").on('click', function() { $("#repeatrro").hide(); app.smena.initsmena(); }) $(".ignorerrobutton").off(); $(".ignorerrobutton").on('click', function() { $("#repeatrro").hide(); opensmenanow(); }) } } catch(err) { console.log("Что-то пошло не так") } }); }) } else { if(content.smenastatus == "current") { currentsmena = content.smena.id; }; } }, function(error) { // $("#board").html("
"+lang["mainInfo"]+"

"+lang["Ne_udalosy_poluchity_nomer_smeny._Proveryte_podklyuchenie_k_internetu_i_naghmite_(Obnovity)"]+"

"); }); function opensmenanow(obj) { app.main.loader("show"); console.warn('opensmena obj', obj); app.main.getjson("/?section=db&db=magic&action=newsmena&user=" + thisuser + "&sklad=" + currentsklad, JSON.stringify(obj)).then(function(content) { $('#openSmenaAskBox').animateCss('fadeOutDown', function() { $('#openSmenaAskBox').hide(); }); if(content.smenastatus == "new") { app.main.message(lang["smena_otkrita"]); app.main.loader("hide"); $("#opennewsmenanow").attr("disabled", false); if(preload["sklad"][currentsklad]["smenaopenask"] == 1) { try { var newwallets = []; newwallets.push({ id:"0", title:lang["n"] }) var flaggg9 = 0; for(var key in preload["wallets_all"]){ var wallet = preload["wallets_all"][key]; newwallets.push(wallet); flaggg9++; } jPut["tranzakcija_wallet_move_1"].data = newwallets; if(flaggg9 > 0){ $("#allwallets_move_1").show(); }else{ $("#allwallets_move_1").hide(); } } catch (err) {} $("#start_balance").val(""); $activeaskinput = $("#start_balance"); $("#startbalancebox").show().animateCss("fadeInUp"); } }; currentsmena = content.smena.id; if(currentsmena == "" || currentsmena == 0) { $("#board").html("
" + lang["mainInfo"] + "

" + lang["Ne_udalosy_poluchity_nomer_smeny._Proveryte_podklyuchenie_k_internetu_i_naghmite_(Obnovity)"] + "

"); } console.log("Смена", currentsmena); }, function(error) { $("#board").html("
" + lang["mainInfo"] + "

" + lang["Ne_udalosy_poluchity_nomer_smeny._Proveryte_podklyuchenie_k_internetu_i_naghmite_(Obnovity)"] + "

"); }); } }, setcash: function() { console.warn('setcash') if(preload["sklad"][currentsklad]["smenaopenask"] == 1) { var data = $("#start_balance_form").serializeJSON(); data["id"] = getRandomInt(1, 99999); data["userbase"] = preload["userbase"]; data["type"] = "prihod"; data["comments"] = lang["IntrodactionCashOpenShift"]; data["day"] = currentDay(); data["sklad"] = currentsklad; data["user"] = currentuser; data["movefrom"] = $("#tranzakcija_wallet_move_1").val(); function setnow() { var introcash = $("#start_balance").val(); if(introcash != "") { $("#sendstartbalance").attr("disabled", true) data["smena"] = currentsmena; var json = JSON.stringify(data); $(".kassa_cash").html("..."); app.main.loader("show"); app.main.getjson("/?section=db&db=magic&action=cash_edit&sklad=" + currentsklad, "data=" + json).then(function(content) { $(".kassa_cash").html(content.cash); app.main.message(lang["saved"]); $('#startbalancebox').animateCss('fadeOutDown', function() { $('#startbalancebox').hide() }); $("#sendstartbalance").attr("disabled", false); }, function(err) { $("#sendstartbalance").attr("disabled", false); app.main.error(lang["ErrorIntrodaction"]) }); } else { app.main.error(lang["SumIsCanNotBeEmpty"]); } } app.print.print.introduction(data).then(function(success) { console.log("Ответ от устройства introduction", success); setnow(); }, function(error) { console.log("Ответ от устройства introduction", error); try { if(error.device.promise == 2) { $("#repeatrro").show(); $(".repeatrrobutton").off(); $(".repeatrrobutton").on('click', function() { $("#repeatrro").hide(); app.smena.setcash() }) $(".ignorerrobutton").off(); $(".ignorerrobutton").on('click', function() { $("#repeatrro").hide(); setnow() }) } } catch(err) { console.log("Что-то пошло не так") } }) } }, smenareload: function() { app.terminal.start(); app.smena.newsmena({ "user": currentuser }); }, otchetzasmenu: function(obj) { $("#smenareportbox").show().animateCss("fadeInUp"); var users = $.map(preload["users"][currentsklad], function(value, index) { return [value]; }); users.unshift({ "user_id": "", "user_name": lang["all"] }); jPut["userslist"].data = users; $("#thisusersmena").off(); $("#thisusersmena").on('change', function() { var data = $(this).val(); app.smena.smenareport({ user: data }); }) app.smena.smenareport(); }, smenaclosenow: function(obj) { try { var thisuser = obj["user"] } catch(err) { var thisuser = currentuser; } function smenaclosenow(checkData) { console.warn('checkData in smenaclosenow ======>>>', checkData ) new Promise(function(resolve, reject) { if(preload["sklad"][currentsklad]["smenaopenask"] == 0) { resolve(); } if(preload["sklad"][currentsklad]["smenaopenask"] == 1) { try { app.main.loader("show"); app.main.getjson("/?section=db&db=magic&action=cash_read&sklad=" + currentsklad).then(function(content) { kassacash = content.cash; if(+kassacash < 0) { $(".kassa_cash").html(content.cash); $("#correct_ask_cena").val(""); $("#correct_balance_comments").val(""); $activeaskinput = $("#correct_ask_cena"); $("#cassacorrectbox").show().animateCss("fadeInUp"); // kassacash = 0; } else { var data = {}; data["id"] = getRandomInt(1, 99999); data["userbase"] = preload["userbase"]; /* data["time"] = currentTime(); data["date"] = currentDate(); */ data["type"] = "ink"; data["comments"] = lang["WOffCashDeskCloseShift"]; data["day"] = currentDay(); data["smena"] = currentsmena; data["sklad"] = currentsklad; data["user"] = currentuser; data["cash"] = kassacash; var json = JSON.stringify(data); $(".kassa_cash").html("..."); /* убрал, сумма может быть реально меньше нуля */ // if (val == "" || val == 0) { // app.main.error(lang["Summa_ne_moghet_byty_0_ili_menyshe"]); // } else { } app.main.loader("show"); app.main.getjson("/?section=db&db=magic&action=cash_edit&sklad=" + currentsklad, "data=" + json, checkData).then(function(content) { console.warn('content content content', content) if(content.status == "done") { resolve(); } /*Отправка на фискальник*/ /* switch (data["type"]) { case "prihod": app.print.print.introduction(data) break; case "ink": app.print.print.incasation(data); break; case "rashod": app.print.print.rashod(data); break; } */ }, function(err) { reject(err) console.log(err); }); } }, function(error) { console.log("Не удалось получить новую сумму в кассе") reject(); }); } catch(err) { console.warn('error ++++', err) var kassacash = ""; reject(); } } }).then(function() { app.main.getjson("/?section=db&db=magic&action=closesmena&user=" + thisuser + "&sklad=" + currentsklad, checkData).then(function(content) { app.main.message(lang["smena_zakrita"]); /*После закрытия смены надо выйти*/ if(preload["sklad"][currentsklad]["pin"] == 1) { /*Если есть запрос PIN то блокируем*/ app.main.exit(); } else { /*если нет запроса PIN то завершаем сессию*/ setTimeout(function() { window.location = "/logout.php?&lang=" + preload["currentlang"]; }, 1000); } currentsmena = 0; console.log("Смена", currentsmena); $('#smenaclosebox').animateCss('fadeOutDown', function() { $('#smenaclosebox').hide() }); $("#closesmenabuttony").attr("disabled", false); }); }) } app.main.loader("show"); $("#closesmenabuttony").attr("disabled", true); var devices = app.print.modules.getdevice(); for(var di = 0; di < devices.length; di++) { /*Если это банковский терминал*/ if(devices[di]["type"] == "banking") { try{ app.banking.protocols[devices[di]["protocol"]].closeShift(devices[di]); }catch(err){ console.log("не удалось закрыть смену на банковском терминале") } } } app.print.print.zreport().then(function(success) { console.log("Ответ от аппарата", success); app.main.loader("show"); try{ smenaclosenow(success.prroSuccess); }catch(err){ smenaclosenow(); } }, function(error) { console.log("Ответ от аппарата", error); app.main.error("Не удалось закрыть фискальную смену"); $("#closesmenabuttony").attr("disabled", false); $("#sendtranzakciu").attr("disabled", false); try { if(error.device.promise == 2) { $("#repeatrro").show(); $(".repeatrrobutton").off(); $(".repeatrrobutton").on('click', function() { $("#repeatrro").hide(); app.main.loader("show"); app.smena.smenaclosenow() }) $(".ignorerrobutton").off(); $(".ignorerrobutton").on('click', function() { $("#repeatrro").hide(); smenaclosenow(); }) } } catch(err) {} try { if(error.device.promise == 0) { smenaclosenow(); } } catch(err) {} }) }, }, kassamotion: { save: function(json){ $(".kassa_cash").html("..."); app.main.loader("show"); app.main.getjson("/?section=db&db=magic&action=cash_edit&sklad=" + currentsklad, "data=" + json).then(function(content) { $('#sozdattranzakciubox').animateCss('fadeOutDown', function() { $('#sozdattranzakciubox').hide() }); app.main.message(lang["saved"]); $(".kassa_cash").html(content.cash); $("#sendtranzakciu").attr("disabled", false); }, function(err) { $("#sendtranzakciu").attr("disabled", false); }); }, send: function() { console.warn('ahahaha lol send') function transactionError(error){ app.main.error("Не выполнена фискальная операция"); $("#sendtranzakciu").attr("disabled", false); try { if(error.device.promise == 2) { $("#repeatrro").show(); $(".repeatrrobutton").off(); $(".repeatrrobutton").on('click', function() { $("#repeatrro").hide(); app.kassamotion.send(); }) $(".ignorerrobutton").off(); $(".ignorerrobutton").on('click', function() { $("#repeatrro").hide(); app.kassamotion.save(json); }) } } catch(err) { console.log("Возникла какая-то ошибка"); } } $("#sendtranzakciu").attr("disabled", true); var data = $("#tranzakcia_form").serializeJSON(); data["id"] = getRandomInt(1, 99999); if(preload["sklad"][currentsklad]["pin"] != 1) { currentuser = $("#userseller1").val(); } data["userbase"] = preload["userbase"]; /* data["time"] = currentTime(); data["date"] = currentDate(); */ data["day"] = currentDay(); data["smena"] = currentsmena; data["sklad"] = currentsklad; data["user"] = currentuser; data["wallet"] = $("#tranzakcija_wallet").val(); data["client"] = $("#tranzakcija_clientlist_value").val(); data["clienttitle"] = $("#tranzakcija_clientlist").val(); data["movefrom"] = $("#tranzakcija_wallet_move").val(); data["category"] = $("#tranzakcija_category").val(); var json = JSON.stringify(data); val = $("#tranzakcija_ask_cena").val() if(val == "" || val == 0) { app.main.error(lang["Summa_ne_moghet_byty_0_ili_menyshe"]); $("#tranzakcia_summa").animateCss('bounce'); $("#sendtranzakciu").attr("disabled", false) } else { //Если установлено галочку что это фискальная операция то отправляем на фискальник, если нет то тупо сохраняем if($("#tranzactionrro").prop("checked")) { /*Функция блокировки дейтвия до выполнения фискальной операции*/ switch(data["type"]) { case "prihod": app.print.print.introduction(data).then( function(success){ console.warn('AAAAAA sssss prihod>>>', success); var fullData = JSON.parse(json); fullData.checkPRRO = success.prroCheck; app.kassamotion.save(JSON.stringify(fullData)); }, function(error){ transactionError(error); } ) break; case "ink": app.print.print.incasation(data).then( function(success) { var fullData = JSON.parse(json); fullData.checkPRRO = success.prroCheck; app.kassamotion.save(JSON.stringify(fullData)); }, function(error){ transactionError(error); } ) break; case "rashod": app.print.print.rashod(data).then( function(success){ console.warn('AAAAAA sssss rashod>>>', success); var fullData = JSON.parse(json); fullData.checkPRRO = success.prroCheck; app.kassamotion.save(JSON.stringify(fullData)); }, function(error){ transactionError(error); } ) break; } }else{ app.kassamotion.save(json); } } }, getcash: function() { $(".kassa_cash").html("..."); app.main.getjson("/?section=db&db=magic&action=cash_read&sklad=" + currentsklad).then(function(content) { $(".kassa_cash").html(content.cash); }, function(error) { console.log("Не удалось получить новую сумму в кассе") }); }, }, users: { start: function() { try { this.skladselect(); } catch (err) {} try { var users = preload["users"][currentsklad]; jPut["users"].data = users; } catch (err) {} /*Выбор пользователя*/ $(".userblock").on('click', function() { var data = $(this).attr("data"); app.main.transformfunc("#user" + data); currentuser = data; setTimeout(function() { app.main.open("enterpin", ""); if ("0000" === preload["users"][currentsklad][currentuser]["user_pin"]) { app.main.message(lang["pin_podskazka"]); } }, pause) }); var width = $html.width(); if (width > 600) { /*Позиционирование */ var top = $html.height() / 2 - ($chUseConr.height() / 2) - 25; if (top < 0) { top = 0; } $chUseConr.css("margin-top", top); } }, getFirstProperty: function() { for (var i in this) { return this[i]; break; } }, ifbonus: function(discountlist) { try { if (preload["desktop_settings"][currentsklad][currentzal][currentdesktop]["client"] > 0 && preload["desktop_settings"][currentsklad][currentzal][currentdesktop]["discount"] == 0) { /* Старый вариант бонусной программы discountlist[0] = { id: 0, title: lang["Bonusnaya_programma"], type: "none", discount: 0 }; */ //$("#discount_box").show(); //$("#current_discount").html(lang["Bonusnaya_programma"]); } else { //Клиента нет } } catch (err) { //рано } }, discountlist: function() { /*Скидки*/ var discountlist = $.map(preload["discount"][currentsklad], function(value, index) { return [value]; }); app.users.ifbonus(discountlist); jPut["discount"].data = discountlist; $(".changediscount").off(); $(".changediscount").on('click', function() { $('#choicediscount').animateCss('fadeOutDown', function() { $('#choicediscount').hide(); }); if (!app.main.ifobject(preload, "desktop_settings." + currentsklad + "." + currentzal + "." + currentdesktop)) { createobj(preload, "desktop_settings", currentsklad, currentzal, currentdesktop, {}) } var title = $(this).text(); var data = $(this).attr("data"); try { //preload["desktop_settings"][currentsklad][currentzal][currentdesktop]["discount"] = data; createobj(preload, "desktop_settings", currentsklad, currentzal, currentdesktop, "discount", data) } catch (err) { console.log("Не удалось записать на стол скидку"); } if (data == 0) { $("#discount_box").hide(); $("#current_discount").html(""); //app.users.ifbonus(discountlist); } else { $("#discount_box").show(); $("#current_discount").html(title); } currentdiscount = data; app.terminal.basket.start(); /*Сохраняем в локальное хранилище*/ app.main.savetolocal(); }) }, servicecash: { change: function() { if (!app.main.ifobject(preload, "desktop_settings." + currentsklad + "." + currentzal + "." + currentdesktop)) { createobj(preload, "desktop_settings", currentsklad, currentzal, currentdesktop, {}) } if (preload["desktop_settings"][currentsklad][currentzal][currentdesktop]["servicecash"] == undefined) { //preload["desktop_settings"][currentsklad][currentzal][currentdesktop]["servicecash"] = 0; createobj(preload, "desktop_settings", currentsklad, currentzal, currentdesktop, "servicecash", 0) } if (preload["desktop_settings"][currentsklad][currentzal][currentdesktop]["servicecash"] == 0) { var servicecash = preload["sklad"][currentsklad]["cashservice"]; } else { var servicecash = 0; } try { preload["desktop_settings"][currentsklad][currentzal][currentdesktop]["servicecash"] = servicecash; //createobj(preload,"desktop_settings", currentsklad, currentzal, currentdesktop, "servicecash", servicecash) //Это почему-то сломало код } catch (err) { console.log("Не удалось записать на стол процент за обслуживание"); } if (servicecash <= 0) { $("#servicecash_box").hide(); $("#current_servicecash").html(""); } else { $("#servicecash_box").show(); $("#current_servicecash").html(servicecash); } app.terminal.basket.start(); /*Сохраняем в локальное хранилище*/ app.main.savetolocal(); }, auto: function() { try { //Обслуживание автоматически var servicecash = preload["sklad"][currentsklad]["cashservice"]; try { preload["desktop_settings"][currentsklad][currentzal][currentdesktop]["servicecash"] = servicecash; //createobj(preload,"desktop_settings", currentsklad, currentzal, currentdesktop, "servicecash", servicecash) //Это почему-то сломало код } catch (err) { console.log("Не удалось записать на стол процент за обслуживание"); } if (servicecash <= 0) { $("#servicecash_box").hide(); $("#current_servicecash").html(""); } else { $("#servicecash_box").show(); $("#current_servicecash").html(servicecash); } } catch (err) {} }, }, skladselect: function() { /*Извлекаем все доступные склады пользователя*/ var sklad = $.map(preload["sklad"], function(value, index) { return [value]; }); /*Сообщение о том что у сотрудника нет прав доступа к торговой точке*/ if (sklad.length < 1) { $("body").html('
'); } /*Выводим на экран*/ jPut["skladselect"].data = sklad; jPut["skladselect_users"].data = sklad; jPut["skladselect_halldesktop"].data = sklad; /*Если функция инициализируется первый раз*/ if (currentsklad == 0) { /*То извлекаем первый склад */ /*Устанавливаем currentsklad*/ currentsklad = sklad[0]["id"]; } try { /*Устанавливаем индикатор склада */ $thissklad.html(preload["sklad"][currentsklad]["title"]) } catch (err) {} try { /*Вызываем список скидок на этой торговой точке*/ app.users.discountlist(); } catch (err) {} try { /*Извлекаем список залов на этом складе */ var zal = $.map(preload["zal"][currentsklad], function(value, index) { return [value]; }); console.log("Залы", zal); /*Выводим на экран*/ jPut.zalselect.data = zal; /*Устанавливаем currentzal*/ /*Но тут оказалось что нельзя занять зал когда он уже установлен ибо перебрасывает со второго на первый*/ /*Но тут все сломалось опять потому что при смене склада надо опять сменить зал....*/ if (currentzal <= 0) { currentzal = zal[0]["id"]; } } catch (err) { currentzal = 1; zal = [{ "id": "1", "title": "zal", "sklad": currentsklad }]; } try { /*Устанавливаем индикатор зала */ $thiszal.html(preload["zal"][currentsklad][currentzal]["title"]) } catch (err) {} try { /*Показываем столы */ app.halldesktop.start() } catch (err) {} try { app.terminal.start(); } catch (err) {} try { /*Починка бага 1 когда нет созданых столов*/ /*После смены размера окна автоматом переключалось на стол 1*/ if (currentdesktop >= 1) {} else { currentdesktop = 1; } } catch (err) {} /*Если ты выбираеш склад вручную */ $(".changesklad").off(); $(".changesklad").on('click', function() { console.log("склад выбран", $(this).attr("data")); /*Устанавливаем currentsklad */ currentsklad = $(this).attr("data"); currentdesktop = 1; /*Устанавливаем индикатор склада*/ $thissklad.html(preload["sklad"][currentsklad]["title"]); /*Извлекаем список залов на этом складе*/ /*Но но, код ломать=)))*/ //6.5 try { var zal = $.map(preload["zal"][currentsklad], function(value, index) { return [value]; }); } catch (err) {} try { /*Выводим на экран */ jPut["zalselect"].data = zal; } catch (err) { //Поламалось в продакшине } try { var users = preload["users"][currentsklad]; jPut["users"].data = users; /*Выбор пользователя*/ $(".userblock").on('click', function() { var data = $(this).attr("data"); app.main.transformfunc("#user" + data); currentuser = data; setTimeout(function() { app.main.open("enterpin", ""); if ("0000" === preload["users"][currentsklad][currentuser]["user_pin"]) { app.main.message(lang["pin_podskazka"]); } }, pause) }); } catch (err) { console.error("Не удалось обновить список пользователей"); } $(".basket").html(""); app.terminal.basket.start(); /*Выбираем первый зал*/ try { /*Устанавливаем currentzal*/ currentzal = zal[0]["id"]; try { /*Устанавливаем индикатор зала*/ $thiszal.html(zal[0]["title"]); /*Показываем столы*/ } catch (err) { console.log("Что-то пошло не так с индикатором зала"); } app.halldesktop.start(); app.halldesktop.zalselect(); app.terminal.start(); app.users.start(); } catch (err) { app.terminal.start(); console.log("На этом складе нет зала или столов"); } app.halldesktop.desktopstatus(); app.settings.init(); }) try { app.halldesktop.zalselect(); } catch (err) {} try { app.terminal.breadhumbs.init() } catch (err) {} } }, pin:{ init: function(pinlength) { /*Извлекаем