(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));