(function ($) { 'use strict'; var halykpos = function () { var o = this; }; var p = halykpos.prototype; p.posIp = ''; p.posBridge = 'http://127.0.0.1'; p.posBridgePortDefault = '5555'; p.posBridgePort = p.posBridgePortDefault; //p.webroot = '/';//для резервного сервера p.webroot = '/'+window.location.pathname.split('/')[1]+'/'; p.nextAction = null;//метод внешней системы p.nextActionArgs = null;//аргументы метода внешней системы p.nextKKM = null;//терменал для последовательной работы p.tagRRN = null;//RRN транзакции p.payMethod = null;//Метод оплаты p.inProcess = false;//Флаг запрос в процессе p.cancelProcess = false;//Флаг отменённого запроса p.controlMixedPayment = null;//элемент управления признаком смешанной оплаты внешней системы p.controlCardPayment = null;//элемент управления признаком оплаты картой внешней системы p.controlAmount = null;//элемент управления суммой от покупателя внешней системы p.controlNoncash = null;//элемент управления суммой безналичного расчета от покупателя внешней системы p.controlTotal = null;//элемент управления итоговой суммой чека внешней системы p.controlConfirm = null;//элемент управления confirm внешней системы p.controlSale = null;//элемент управления проведения новой продажи внешней системы p.checkEnterSum = null; p.fiscal_sign = ''; p.doc_number = ''; p.type_operation = null;//Тип операции Внесение/Изятие p.first_operation = false; p.check_time = '';//Время чека (для возврата с ParentTicket) p.check_sum = '';//Сумма чека (для возврата с ParentTicket) p.fiscalized = 1;//Флаг фискализации ККМ (для возврата с ParentTicket) p.rnm = '';//Регистрационный номер ККМ (для возврата с ParentTicket) p.salling = false; p.kept_control_card_payment_value = false; p.btn_repeat_sale = 'Повторить продажу'; p.btn_repeat_refund = 'Повторить возврат'; p.btn_close_check = 'Отменить'; p.btn_cancel_check = 'Отменить'; p.btn_close_shift = 'Закрыть смену'; //инициализация p.init = async function(data) { if (data) { for (var key in data) { switch (key) { // case "ip": // p.ip = data[key].split(':')[0]; // p.port = data[key].split(':')[1]; // break; // case "load_finish": // p.set_load_finish(data[key]); // break; default: p[key] = data[key]; break; } } } Log(data, 'init', 'halykpos'); } //установить порт прокси службы p.setBridgePort = function(port) { p.posBridgePort = port; Log({port: p.posBridgePort}, 'setBridgePort', 'halykpos'); }; //проверка связи с терминалом p.checkConnect = function(ip) { p.posIp = ip; p.load('start'); p.request({ 'task': 'echo' }, function(json){ console.log(json['data']); if (!p.isEmpty(json['data']['terminalId'])) { ajax_msg('main_halykpos', 'success', 'Соединение установлено. Не забудьте нажать кнопку Сохранить', 2); //p.update_session({type: 1, com: data}); } else { ajax_msg('main_halykpos', 'danger', 'Соединение не установлено. ', 2); } p.load('finish'); Log(json, 'checkConnect', 'halykpos'); }); }; //запрос оплаты p.payment = function() { $('.alert').hide(); p.load('start'); var tmpData = p.getTmpData(); if (p.isEmpty(tmpData)) {//если нет временных данных на кассе $('#halykposRequestStatus').modal('show'); var amount = $(p.controlMixedPayment).prop('checked') ? $(p.controlNoncash).val() : ($(p.controlCardPayment).prop('checked') ? $(p.controlAmount).val() : 0); p.request({ 'task': 'purchase', 'data':{ 'amount': (String)(amount>0 ? amount : parseInt($(p.controlTotal).html())), } }, function(json){ console.log(json); if (json['data']['result']=='0') { p.tagRRN = json['data']['tagRRN']; p.payMethod = p.resolvePayMethod(json['data']['channel']); if (p.nextAction) { if (p.nextKKM) { if ($(p.controlPrintCheck).prop("checked")) { p.nextAction(); } } else { p.nextAction(); } $(p.controlSale).removeClass('noLink'); } } else { if (!p.cancelProcess) { ajax_msg('main_halykpos', 'danger', 'Halyk POS: Терминал отклонил попытку подключения.', 2); } $(p.controlSale).removeClass('noLink'); } p.load('finish'); $('#halykposRequestStatus').modal('hide'); }, function(xhr, status, error) { console.log(xhr); console.log(status); console.log(error); $('#halykposRequestStatus').modal('hide'); $(p.controlSale).removeClass('noLink'); Log({xhr: xhr, status: status, error: error}, 'payment', 'halykpos'); }); } else {//если есть временные данные, значит оплата прошла но продажа не проведена полностью console.log(tmpData); p.tagRRN = tmpData['halykpos_tag_rrn']; p.payMethod = tmpData['halykpos_pay_method']; if (p.nextAction) { if (p.nextKKM) { if ($(p.controlPrintCheck).prop("checked")) { p.nextAction(); } } else { p.nextAction(); } p.deleteTmpData(); $(p.controlSale).removeClass('noLink'); } } }; //запрос возврата p.refund = function(args, data) { $('.alert').hide(); p.load('start'); p.nextActionArgs = args; p.getDataForRefund(args[0], args[2], function(response){//guid, fullCheck //console.log(response); $('#halykposRequestStatus').modal('show'); p.request({ 'task': 'refund', 'data':{ 'amount': response['amount'], 'tagRRN': response['tagRRN'], 'method': response['method'] } }, function(json){ console.log(json); Log(json, 'refund', 'halykpos'); if (json['data']['result']=='0') { response['guid'] = args[0]; response['fullCheck'] = args[2] ? 1 : 0; p.saveDataRefund(response); console.log(p.nextKKM); console.log(p.nextAction); if (p.nextKKM) { if (p.nextAction) p.nextAction(); } else { if (p.nextAction) p.nextAction(p.nextActionArgs[0], p.nextActionArgs[1], data); } p.nextAction = null; } else { ajax_msg('main_halykpos', 'danger', 'Halyk POS: Терминал отклонил попытку подключения.', 2); } p.load('finish'); $('#halykposRequestStatus').modal('hide'); }, function(xhr, status, error) { console.log(xhr); console.log(status); console.log(error); $('#halykposRequestStatus').modal('hide'); ajax_msg('main_halykpos', 'danger', 'Попытка установить соединение c терминалом была безуспешной.', 2); Log({xhr: xhr, status: status, error: error}, 'refund', 'halykpos'); }); }); }; //Отмена операции p.cancel = function() { if (p.inProcess) { p.request({ 'task': 'cancel' }, function(json){ console.log(json['data']); if (json['data']['result']=='1010') { p.cancelProcess = true; ajax_msg('main_halykpos', 'warning', 'Halyk POS: Операция отменена.', 2); } else { ajax_msg('main_halykpos', 'danger', json['data']['msg'], 2); } p.load('finish'); Log(json, 'cancel', 'halykpos'); }); } }; //базовый метод запроса в прокси службу p.request = function(payload, success, fail) { if (!p.inProcess || payload['task']=='cancel') {//нет активных запросов или отмена p.inProcess = true; p.cancelProcess = false; var bridge = p.posBridge+':'+(p.isEmpty(p.posBridgePort) ? p.posBridgePortDefault : p.posBridgePort); $.post(bridge, JSON.stringify({ 'terminalUrl': p.posIp, 'payload': payload }), function(json) { p.inProcess = false; if (success) success(json); }).fail(function(xhr, status, error) { p.inProcess = false; console.log(xhr); console.log(status); console.log(error); if (xhr['status']==500) { ajax_msg('main_halykpos', 'danger', 'Проверьте терминал. Терминал не доступен или выключен.', 2); } else if (xhr['status']==400) { ajax_msg('main_halykpos', 'danger', 'Терминал по указаному адресу не найден.', 2); } else { ajax_msg('main_halykpos', 'danger', 'Соединение не установлено. Терминал не доступен', 2); } if (fail) fail(xhr, status, error); p.load('finish'); Log({'bridge':bridge, 'terminalUrl':p.posIp, 'payload': payload, 'xhr': xhr, 'status': status, 'error': error}, 'request fail', 'halykpos'); }); } }; p.getTagRRN = function() { return p.tagRRN; } p.resolvePayMethod = function(channel) { if (channel>=7 && channel<=9) return 'qr'; if (channel==6) return 'go'; return 'card'; } p.getPayMethod = function() { return p.payMethod; } p.setNextAction = function(func) { p.nextAction = func; } p.getDataForRefund = function(guid, fullCheck, success) { fullCheck = fullCheck ? 1 : 0, Log({guid: guid, fullCheck: fullCheck}, 'getDataForRefund', 'halykpos'); $.post(p.webroot+'Halyk_api/Halykpos/getDataForRefund', { outGuid: guid, fullCheck: fullCheck, }, function(data){ console.log(data); Log({response: data}, 'getDataForRefund', 'halykpos'); if (p.isJson(data)) { var obj = JSON.parse(data); if (obj['status']) { success(obj['data']); } else { ajax_msg('main_halykpos', 'danger', obj['msg'], 2); } } else { ajax_msg('main_halykpos', 'danger', 'Не удалось получить данные по чеку для Halyk POS', 2); } }).fail(function(xhr, status, error) { //console.log(xhr);console.log(status);console.log(data); ajax_msg('main_halykpos', 'danger', 'Не удалось получить данные по чеку для Halyk POS', 1); p.load('finish'); Log({xhr: xhr, status: status, error: error}, 'getDataForRefund', 'halykpos'); }); } p.saveDataRefund = function(data) { Log(data, 'saveDataRefund', 'halykpos'); $.post(p.webroot+'Halyk_api/Halykpos/saveDataRefund', data, function(data){ console.log(data); Log({response: data}, 'saveDataRefund', 'halykpos'); }).fail(function(xhr, status, error) { Log({xhr: xhr, status: status, error: error}, 'saveDataRefund', 'halykpos'); }); } p.saveTmpData = function (data) { Log(data, 'saveTmpData', 'halykpos'); try { const json = JSON.stringify(data); localStorage.setItem('halykposTmpData', json); return true; } catch (e) { console.error('saveTmpData error', e); return false; } }; p.getTmpData = function () { try { const raw = localStorage.getItem('halykposTmpData'); if (!raw) return null; const data = JSON.parse(raw); Log(data, 'getTmpData', 'halykpos'); return data; } catch (e) { console.error('halykpos getTmpData error', e); Log(e, 'getTmpData', 'halykpos'); return null; } }; p.deleteTmpData = function () { try { localStorage.removeItem('halykposTmpData'); return true; } catch (e) { console.error('halykpos deleteTmpData error', e); Log(e, 'getTmpData', 'halykpos'); return false; } }; p.objectEmpty = function(obj){ if (Object.keys(obj).length == 0) return true; return false; } //показываем/скрываем процесс загрузки p.load = function(comand){ if (comand == 'start') { $('.halykpos_load').addClass('spin'); } else { if (p.load_finish) p.load_finish(); $('.halykpos_load').removeClass('spin'); } } p.set_load_finish = function(func) { if (func) p.load_finish = func; else p.load_finish = function() {}; } p.isJson = function(str) { try { JSON.parse(str); } catch (e) { return false; } return true; } p.isEmpty = function(str) { return (!str || str.length === 0 ); } p.test_method = function() { //p.port = 101010; console.log(p.port); } window.Halykpos = new halykpos; }(jQuery));