(function ($) {
"use strict";
var portkkm = function () {
var o = this;
};
var p = portkkm.prototype;
p.printer_name = "FPG-1000";
p.btn_repeat_sale = 'Повторить продажу';
p.btn_repeat_refund = 'Повторить возврат';
p.btn_close_check = 'Отменить';
p.btn_cancel_check = 'Отменить';
p.btn_close_shift = 'Закрыть смену';
//p.webroot = '/';//для резервного сервера
p.webroot = '/'+window.location.pathname.split('/')[1]+'/';
p.next_action = null;//метод внешней системы
p.next_action_args = null;//аргументы метода внешней системы
p.control_mixed_payment = null;//элемент управления признаком смешанной оплаты внешней системы
p.control_card_payment = null;//элемент управления признаком оплаты картой внешней системы
p.control_amount = null;//элемент управления суммой от покупателя внешней системы
p.control_noncash = null;//элемент управления суммой безналичного расчета от покупателя внешней системы
p.control_total = null;//элемент управления итоговой суммой чека внешней системы
p.control_confirm = null;//элемент управления confirm внешней системы
p.control_sale = null;//элемент управления проведения новой продажи внешней системы
p.check_enter_sum = null;
p.rest_api_url = 'http://127.0.0.1:55555';//адрес API сервиса
p.type = 0; //тип подключения к терминалу
p.ip = ''; //адрес терминала
p.port = ''; //порт терминала
p.com = ''; //номер последовательного порта терминала
p.taxs = [5, 16, 0];
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.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', 'portkkm');
p.update_printer_name();
}
//регистрация или обновление связи с терминалом в настройках внешней системы
p.check_connect = function(data) {
p.load('start');
$.post(p.rest_api_url, JSON.stringify({
FnName: "Connect",
Port: data,
Baudrate :"115200"
}),
function(data){
console.log(data);
if (data.ErrorCode==0) {
ajax_msg('main_portkkm', 'success', 'Соединение установлено. Не забудьте нажать кнопку Сохранить', 2);
p.update_session({type: 1, com: data});
} else {
ajax_msg('main_portkkm', 'danger', 'Соединение не установлено. ' + data.ErrorMessage, 2);
}
p.load('finish');
});
};
//регистрация кассы внешней системы в терминале
p.check_connect_socket = function(ip) {
p.load('start');
Log({Host: ip.split(':')[0], Port: ip.split(':')[1]}, 'check_connect_socket', 'portkkm');
$.post(p.rest_api_url, JSON.stringify({
FnName: "ConnectToSocket",
Host: ip.split(':')[0],
Port: ip.split(':')[1]
}),
function(data){
console.log(data);
Log(data, 'check_connect_socket', 'portkkm');
if (data.ErrorCode==0) {
ajax_msg('main_portkkm', 'success', 'Соединение установлено успешно. Не забудьте нажать кнопку Сохранить', 2);
p.update_session({type: 0, ip: ip});
} else {
ajax_msg('main_portkkm', 'danger', 'Соединение не установлено. ' + data.ErrorMessage, 2);
}
p.load('finish');
});
};
p.keep_control_card_payment_value = function() {
if ($(p.control_card_payment).prop('checked')) {
p.kept_control_card_payment_value = true;
} else {
p.kept_control_card_payment_value = false;
}
}
//возвращаем галочку оплаты картой в состояние на начало формирования продажи если отличается
p.return_control_card_payment_value = function() {
// console.log($(p.control_card_payment).prop('checked'));
// console.log(p.kept_control_card_payment_value);
if ($(p.control_card_payment).prop('checked') !== p.kept_control_card_payment_value) {
$(p.control_card_payment).prop('checked', p.kept_control_card_payment_value);
}
}
p.sale = function(add_params) {
Log({add_params: add_params,request_enter_sum: p.request_enter_sum()}, 'sale', 'portkkm');
if (!p.salling) {
add_params = add_params || {};
if (!p.request_enter_sum()) {
ajax_msg('main', 'danger', 'Необходимо указать сумму от клиента или указанная сумма меньше чем сумма чека!', 1);
$(p.control_sale).removeClass('noLink');
return;
}
p.prepare_sale();
p.keep_control_card_payment_value();
p.get_cashbox_list(function(positions){//получаем позиции с кассы
p.salling = true;
p.connect( function() {
p.is_first_operation(function(){
p.open_sale(function() {//открытие продажи с сопутствующими операциями
p.registration_loop(positions, 0, function() {//регистация позиций чека
p.close_sale();
});
}, add_params);
});
});
});
}
}
p.request_enter_sum = function() {
Log({
check_enter_sum: p.check_enter_sum,
control_mixed_payment: $(p.control_mixed_payment).prop('checked'),
control_card_payment: $(p.control_card_payment).prop('checked'),
control_amount: $(p.control_amount).val(),
control_noncash: $(p.control_noncash).val()
}, 'request_enter_sum', 'portkkm');
if (p.check_enter_sum == '1') {
var paid_mode = $(p.control_mixed_payment).prop('checked') ? 2 : Number($(p.control_card_payment).prop('checked'));
if (paid_mode==2) {
if ($(p.control_amount).val()>0 && $(p.control_noncash).val()>0) {
return true;
}
} else if (paid_mode==0){
if ($(p.control_amount).val()>0) {
return true;
}
} else {
return true;
}
} else {
return true;
}
return false;
}
p.prepare_sale = function() {
var paid_mode = $(p.control_mixed_payment).prop('checked') ? 2 : Number($(p.control_card_payment).prop('checked'));
var amount = $(p.control_mixed_payment).prop('checked') ? $(p.control_noncash).val() : ($(p.control_card_payment).prop('checked') ? $(p.control_total).val() : 0);
amount = amount > 0 ? amount : parseInt($(p.control_total).html());
var cash = 0;
var noncash = 0;
if (paid_mode == 2) {
cash = $(p.control_amount).val();
noncash = $(p.control_noncash).val();
} else {
if (paid_mode == 0) cash = amount;
if (paid_mode == 1) noncash = amount;
}
p.store.set('cash', cash);
p.store.set('noncash', noncash);
p.store.set('paid_mode', paid_mode);
Log({
paid_mode: p.store.get('paid_mode').toString(),
noncash: p.store.get('noncash').toString(),
cash: p.store.get('cash').toString(),
}, 'prepare sale', 'portkkm');
}
p.refund = function(args) {
Log(args, 'start refund', 'portkkm');
var confirm_text = 'ПОРТ ККМ: Провести операцию \"Возврат\" для выбранного товара?';
p.control_confirm(confirm_text, function(){
p.next_action_args = args;
var guid = args[0], full_check = args[2];
//console.log(args);
p.get_check_list(guid, full_check, function(positions){//получаем позиции чека
p.connect( function() {
p.is_first_operation(function() {//получаем флаг первой операции в смене
p.get_fiscalized(function() {//получаем флаг фискализации
p.get_rnm(function() {//получаем РНМ кассы
p.open_refund(function() {//открытие возврата с сопутствующими операциями
p.registration_loop(positions, 0, function() {//регистация позиций чека
p.close_refund();
});
});
});
});
});
});
});
});
}
p.issue_order = function(args) {
p.next_action_args = args;
var data = {
guid: args[0],
pay_type: args[2],
code: args[3]
}
console.log(args);
Log(data, 'issue_order', 'portkkm');
p.get_order_list(data, function(positions) {//получаем позиции заказа
p.connect( function() {
p.is_first_operation(function() {
p.open_sale(function() {//открытие возврата с сопутствующими операциями
p.registration_loop(positions, 0, function() {//регистация позиций чека
p.close_issue_order();
});
}, {});
});
});
});
}
p.refund_order = function(args) {
p.next_action_args = args;
var data = {
guid: args[0],
pay_type: args[2],
date: args['date'],
refund: true
}
console.log(data);
Log(data, 'refund_order', 'portkkm');
p.get_order_list(data, function(positions) {//получаем позиции заказа
p.connect( function() {
p.is_first_operation(function() {//получаем флаг первой операции в смене
p.get_fiscalized(function() {//получаем флаг фискализации
p.get_rnm(function() {//получаем РНМ кассы
p.open_refund(function() {//открытие возврата с сопутствующими операциями
p.registration_loop(positions, 0, function() {//регистация позиций чека
p.close_refund_order();
});
});
});
});
});
});
});
}
p.get_cashbox_list = function(success) {
$.post(p.webroot + 'Portkkm_api/portkkm/get_cashbox_list', {}, function(response) {
//console.log(response);
if (p.is_json(response)) {
var obj = JSON.parse(response);
//console.log(obj);
Log(obj, 'get_cashbox_list', 'portkkm');
if (!p.objectEmpty(obj)) {
success(obj);
} else {
ajax_msg('main', 'danger', 'Отсутствуют позиции в чеке', 1);
}
} else {
Log({response: response}, 'get_cashbox_list', 'portkkm');
ajax_msg('main', 'danger', 'Произошла ошибка при получении позиций чека для ПОРТ ККМ', 1);
p.load('finish');
}
})
.fail(function(xhr, status, error) {
//console.log(xhr);console.log(status);console.log(data);
ajax_msg('main', 'danger', p.error_message(xhr), 1);
p.load('finish');
Log({xhr: xhr, status: status, error: error}, 'get_cashbox_list', 'portkkm');
});
}
p.get_check_list = function(guid, full_check, success) {
$.post(p.webroot + 'Portkkm_api/portkkm/get_check_list', {
guid: guid,
full_check: full_check
}, function(response) {
//console.log(response);
if (p.is_json(response)) {
var obj = JSON.parse(response);
console.log(obj);
Log(obj, 'get_check_list', 'portkkm');
if (obj['status']=='ok') {
p.store.set('paid_mode', obj['check']['pay_type']);
if (obj['check']['pay_type'] == '0') p.store.set('cash', obj['check']['summ']);
if (obj['check']['pay_type'] == '1') p.store.set('noncash', obj['check']['summ']);
if (obj['check']['pay_type'] == '2') {
// p.store.set('paid_mode', '0');
// p.store.set('cash', Number(obj['check']['cash']) + Number(obj['check']['noncash']));
p.store.set('cash', obj['check']['cash']);
p.store.set('noncash', obj['check']['noncash']);
}
success(obj['check']['items']);
} else {
ajax_msg('main', 'danger', 'Отсутствуют позиции в чеке', 1);
}
} else {
ajax_msg('main', 'danger', 'Произошла ошибка при получении позиций чека для ПОРТ ККМ', 1);
p.load('finish');
Log({response: response}, 'get_check_list', 'portkkm');
}
})
.fail(function(xhr, status, error) {
//console.log(xhr);console.log(status);console.log(data);
ajax_msg('main', 'danger', p.error_message(xhr), 1);
p.load('finish');
Log({xhr: xhr, status: status, error: error}, 'get_check_list', 'portkkm');
});
}
p.get_order_list = function(data, success) {
$.post(p.webroot + 'Portkkm_api/portkkm/get_order_list', data,
function(response) {
console.log(response);
if (p.is_json(response)) {
var obj = JSON.parse(response);
console.log(obj);
Log(obj, 'get_order_list', 'portkkm');
if (obj['status']=='ok') {
p.store.set('paid_mode', obj['check']['pay_type']);
if (obj['check']['pay_type'] == '0') p.store.set('cash', obj['check']['summ']);
if (obj['check']['pay_type'] == '1') p.store.set('noncash', obj['check']['summ']);
if (obj['check']['pay_type'] == '2') {
p.store.set('cash', obj['check']['cash']);
p.store.set('noncash', obj['check']['noncash']);
}
success(obj['check']['items']);
} else {
ajax_msg('main', 'danger', p.isEmpty(obj['msg']) ? 'Отсутствуют позиции в чеке' : obj['msg'], 1);
}
} else {
ajax_msg('main', 'danger', 'Произошла ошибка при получении позиций чека для ПОРТ ККМ', 1);
p.load('finish');
Log({response: response}, 'get_order_list', 'portkkm');
}
})
.fail(function(xhr, status, error) {
//console.log(xhr);console.log(status);console.log(data);
ajax_msg('main', 'danger', p.error_message(xhr), 1);
p.load('finish');
Log({xhr: xhr, status: status, error: error}, 'get_order_list', 'portkkm');
});
}
p.open_sale = function(success, add_params) {
p.reset_prev_check( function() {
p.open_new_check("0", function() {
if (p.objectEmpty(add_params)) {
success();
} else {
p.set_additional_parameters(add_params, success);
}
})
});
}
p.open_refund = function(success) {
p.reset_prev_check( function() {
p.open_new_check("1", function() {
p.set_parent_ticket( function() {
success();
})
})
}) ;
}
p.connect = function(success) {
var param = {};
if (p.type==0) {
param = {
FnName: "ConnectToSocket",
Host: p.ip,
Port: p.port
}
} else if (p.type==1) {
param = {
FnName: "Connect",
Port: p.com,
Baudrate :"115200"
}
}
Log(param, 'connect', 'portkkm');
$.post(p.rest_api_url, JSON.stringify(param), function(response){
Log(response, 'connect', 'portkkm');
if (response.ErrorCode==0) {
console.log('portkkm: connected');
success();
} else {
ajax_msg('main', 'danger', 'ПОРТ: ККМ не доступен', 1);
p.load('finish');
p.reset_flag_salling();
}
}).fail(function(xhr, status, error) {
//console.log(xhr);console.log(status);console.log(data);
ajax_msg('main', 'danger', p.error_message(xhr), 1);
p.load('finish');
p.reset_flag_salling();
Log({xhr: xhr, status: status, error: error}, 'gconnect', 'portkkm');
});
}
p.reset_prev_check = function(success) {
$.post(p.rest_api_url, JSON.stringify({
FnName: "SetFiscalInvParam",
Type: "2",
Data: ""
}),
function(data){
console.log(data);
Log(data, 'reset_prev_check', 'portkkm');
if (data.ErrorCode==0) {
console.log('portkkm: previous check has been reset');
success();
} else {
ajax_msg('main', 'danger', 'ПОРТ: Произошла ошибка при обнулении параметров предыдущего чека перед открытием нового чека. ' + data.ErrorMessage, 1);
p.load('finish');
p.reset_flag_salling();
}
}).fail(function(xhr, status, error) {
//console.log(xhr);console.log(status);console.log(data);
ajax_msg('main', 'danger', p.error_message(xhr), 1);
p.load('finish');
p.reset_flag_salling();
Log({xhr: xhr, status: status, error: error}, 'reset_prev_check', 'portkkm');
});
};
p.open_new_check = function(receipt_type, success) {
var btn_repeat = receipt_type==0 ? p.btn_repeat_sale : p.btn_repeat_refund;
$.post(p.rest_api_url, JSON.stringify({
FnName: "OpenFiscalInv",
OpCode: "30",
OpPwd :"30",
TillNmb: "1",
ReceiptType: receipt_type
//,ShiftNumber: "2"
}),
function(data){
console.log(data);
Log(data, 'open_new_check', 'portkkm');
if (data.ErrorCode==0) {
console.log('portkkm: new check has been open');
success();
} else {
if (data.ErrorCode==111024) {
ajax_msg('main', 'danger', 'ПОРТ: Продолжительность смены превышает 24 часа. Произведите закрытие смены. ' + p.btn_close_shift, 1);
} else if (data.ErrorCode==110210) {
ajax_msg('main', 'danger', 'ПОРТ:' + data.ErrorMessage, 1);
} else {
ajax_msg('main', 'danger', 'ПОРТ: Произошла ошибка при открытии нового чека. ' + data.ErrorMessage + '. ' + btn_repeat + ' | ' + p.btn_close_check, 1);
}
p.load('finish');
p.reset_flag_salling();
}
}).fail(function(xhr, status, error) {
//console.log(xhr);console.log(status);console.log(data);
ajax_msg('main', 'danger', p.error_message(xhr), 1);
p.load('finish');
p.reset_flag_salling();
Log({xhr: xhr, status: status, error: error}, 'open_new_check', 'portkkm');
});
};
p.set_parent_ticket = function(success) {
//console.log(p);
var time_formated = '';
if (p.check_time) {
var time_formated = p.check_time.replace(/(\d{2})\.(\d{2})\.(\d{2})(\d{2})/, '$1-$2-$4');
}
Log({
fiscal_sign: p.fiscal_sign,
time_formated: time_formated,
rnm: p.rnm,
check_sum: p.check_sum,
autonom: +!p.fiscalized
}, 'set_parent_ticket', 'portkkm');
p.set_parent_ticket_data('4', p.fiscal_sign, function(){//ParentTicket FN
p.set_parent_ticket_data('5', time_formated, function() {//ParentTicket Date/Time
p.set_parent_ticket_data('6', p.rnm, function() {//ParentTicket RNM
p.set_parent_ticket_data('7', p.check_sum, function() {//ParentTicket Total sum
p.set_parent_ticket_data('8', +!p.fiscalized, function() {//ParentTicket Autonom
success();
});
})
})
});
});
};
p.set_parent_ticket_data = function(type, value, success) {
console.log(JSON.stringify({FnName: "SetFiscalInvParam",Type: type,Data: value}));
Log({type: type, value: String(value)}, 'set_parent_ticket_data', 'portkkm');
$.post(p.rest_api_url, JSON.stringify({
FnName: "SetFiscalInvParam",
Type: type,
Data: String(value),
}),
function(data){
console.log(data);
Log(data, 'set_parent_ticket_data', 'portkkm');
if (data.ErrorCode==0) {
console.log('portkkm: ParentTicket set param('+type+'): '+data);
success();
} else {
ajax_msg('main', 'danger', 'ПОРТ: Произошла ошибка при установки ParentTicket('+type+'). ' + data.ErrorMessage, 1);
p.load('finish');
}
}).fail(function(xhr, status, error) {
//console.log(xhr);console.log(status);console.log(data);
ajax_msg('main', 'danger', p.error_message(xhr), 1);
p.load('finish');
Log({xhr: xhr, status: status, error: error}, 'set_parent_ticket_data', 'portkkm');
});
};
p.set_additional_parameters = function(add_params, success) {
add_params.FnName = "SetFiscalInvParam";
$.post(p.rest_api_url, JSON.stringify(add_params),
function(data){
console.log(data);
Log(data, 'set_additional_parameters', 'portkkm');
if (data.ErrorCode==0) {
console.log('portkkm: installs additional parameters');
success();
} else {
ajax_msg('main', 'danger', 'ПОРТ: Произошла ошибка при установки дополнительных параметров чека. ' + data.ErrorMessage, 1);
p.load('finish');
}
}).fail(function(xhr, status, error) {
//console.log(xhr);console.log(status);console.log(data);
ajax_msg('main', 'danger', p.error_message(xhr), 1);
p.load('finish');
Log({xhr: xhr, status: status, error: error}, 'set_additional_parameters', 'portkkm');
});
}
p.define_tax_code = function(persent) {
if (p.isEmpty(persent)) persent = '0';
if (persent=='12') persent = '5';
var taxCode = p.taxs.indexOf( parseInt(persent) )+1;
return taxCode>0 ? taxCode : 3;
}
p.register_position = function(position, success) {
//console.log(position);
var json = JSON.stringify({
FnName: "RegisterSale",
PluName: position['name'],
TaxCode: p.define_tax_code(position['nds']),
Price: position['price'],
Quantity: position['count'],
DiscountType: "4",
DiscountValue: position['discount'],
Department: "1",
MarkStamp: position['mark'],
RoundPrice: position['summ'],
UnitCode: "796",
ProductID: "",
BarCode: p.isEmpty(position['barcode']) ? '' : position['barcode'],
NTIN: p.isEmpty(position['ntin']) ? '' : position['ntin']
}).replace(/\\u001d/g, "");
console.log(json);
Log({
position: json,
}, 'register_position', 'portkkm');
$.post(p.rest_api_url, json,
function(data){
console.log(data);
Log(data, 'register_position', 'portkkm');
if (data.ErrorCode==0) {
console.log('portkkm: position is registered');
success();
} else {
ajax_msg('main', 'danger', 'ПОРТ: Произошла ошибка при регистрации позиции нового чека: ' + data.ErrorMessage, 1);
p.load('finish');
p.reset_flag_salling();
}
}).fail(function(xhr, status, error) {
//console.log(xhr);console.log(status);console.log(data);
ajax_msg('main', 'danger', p.error_message(xhr), 1);
p.load('finish');
p.reset_flag_salling();
Log({xhr: xhr, status: status, error: error}, 'register_position', 'portkkm');
});
}
p.registration_loop = function(positions, i, finished) {
console.log(positions);
i = i || 0;
if (i==0 && p.isEmpty(positions[i])) {
i = 1;
}
p.register_position(positions[i], function() {
i++;
if (positions[i]) {
p.registration_loop(positions, i, finished);
} else {
finished();
}
});
}
p.repeat_sale = function() {
$('.alert').hide();
p.close_sale();
}
p.repeat_refund = function() {
$('.alert').hide();
p.close_refund();
}
p.close_sale = function() {
p.total( function(){
p.check_connection(function(){
p.close_check( function() {
p.return_control_card_payment_value();//возвращаем галочку оплаты картой в состояние на начало формирования продажи если отличается
p.next_action();
})
})
});
}
p.close_refund = function() {
p.total( function(){
p.close_check( function() {
Log({
next_action_args0: p.next_action_args[0],
next_action_args1: p.next_action_args[1],
next_action_args2: p.next_action_args[2],
}, 'close_refund', 'portkkm');
p.next_action(p.next_action_args[0], p.next_action_args[1], p.next_action_args[2]);
})
});
}
p.close_issue_order = function() {
p.total( function() {
p.close_check( function() {
var param = {
guid: p.next_action_args[0],
status: 4,
fiscal_sign: p.fiscal_sign,
doc_number: p.doc_number,
}
Log(param, 'close_issue_order', 'portkkm');
p.update_order_status(param, function() {
p.next_action();
});
})
});
}
p.close_refund_order = function() {
p.total( function(){
p.close_check( function() {
var param = {
guid: p.next_action_args[0],
fiscal_sign: p.fiscal_sign,
doc_number: p.doc_number,
refund:true,
}
Log(param, 'close_refund_order', 'portkkm');
p.update_order_status(param, function() {
p.next_action();
});
})
});
}
p.total = function(success) {
var paid_mode = p.store.get('paid_mode').toString();
var amount = 0;
if (paid_mode == '0') amount = p.store.get('cash').toString();
if (paid_mode == '1') amount = p.store.get('noncash').toString();
if (paid_mode == '2') {
paid_mode = '0';
amount = p.store.get('cash').toString();
}
console.log({
FnName: "Total",
PaidMode: paid_mode,
Amount: amount
});
Log({
FnName: "Total",
PaidMode: paid_mode,
Amount: amount
}, 'total', 'portkkm');
$.post(p.rest_api_url, JSON.stringify({
FnName: "Total",
PaidMode: paid_mode,
Amount: amount
}),
function(data){
console.log(data);
Log(data, 'total', 'portkkm');
if (data.ErrorCode==0) {
console.log('portkkm: сheck paid');
if (p.store.get('paid_mode').toString()=='2') {
p.second_total(success);
} else {
p.store.clear();
success();
}
} else {
ajax_msg('main', 'danger', 'ПОРТ: Произошла ошибка при оплате чека. ' + data.ErrorMessage + '. ' + p.btn_cancel_check, 1);
p.load('finish');
p.reset_flag_salling();
}
}).fail(function(xhr, status, error) {
//console.log(xhr);console.log(status);console.log(data);
ajax_msg('main', 'danger', p.error_message(xhr), 1);
p.load('finish');
p.reset_flag_salling();
Log({xhr: xhr, status: status, error: error}, 'total', 'portkkm');
});
}
p.second_total = function(success) {//вторая оплата при смешаном типе оплаты
var paid_mode = '1';
var amount = p.store.get('noncash').toString();
console.log({
FnName: "Total",
PaidMode: paid_mode,
Amount: amount
});
Log({
FnName: "Total(second_total)",
PaidMode: paid_mode,
Amount: amount
}, 'second_total', 'portkkm');
$.post(p.rest_api_url, JSON.stringify({
FnName: "Total",
PaidMode: paid_mode,
Amount: amount
}),
function(data){
console.log(data);
Log(data, 'second_total', 'portkkm');
if (data.ErrorCode==0) {
console.log('portkkm: second сheck paid');
p.store.clear();
success();
} else {
ajax_msg('main', 'danger', 'ПОРТ: Произошла ошибка при оплате чека. ' + data.ErrorMessage + '. ' + p.btn_cancel_check, 1);
p.load('finish');
p.reset_flag_salling();
}
}).fail(function(xhr, status, error) {
//console.log(xhr);console.log(status);console.log(data);
ajax_msg('main', 'danger', p.error_message(xhr), 1);
p.load('finish');
p.reset_flag_salling();
Log({xhr: xhr, status: status, error: error}, 'second_total', 'portkkm');
});
}
p.close_check = function(success) {
$.post(p.rest_api_url, JSON.stringify({
FnName: "CloseFiscalInv"
}),
function(data){
console.log(data);
Log(data, 'close_check', 'portkkm');
if (data.ErrorCode==0) {
console.log('portkkm: check closed');
p.fiscal_sign = data.FiscalSign;
p.doc_number = data.DocNumber;
Log({
first_operation: p.first_operation
}, 'close_check', 'portkkm');
if (p.first_operation) {
p.set_type_operation('2');
p.save_reports();
p.first_operation = false;
}
success();
} else {
ajax_msg('main', 'danger', 'ПОРТ: Произошла ошибка при закрытии чека. ' + data.ErrorMessage + '. ' + p.btn_cancel_check, 1);
p.load('finish');
p.reset_flag_salling();
}
}).fail(function(xhr, status, error) {
//console.log(xhr);console.log(status);console.log(data);
ajax_msg('main', 'danger', p.error_message(xhr), 1);
p.load('finish');
p.reset_flag_salling();
Log({xhr: xhr, status: status, error: error}, 'close_check', 'portkkm');
});
};
p.cancel_check = function() {
$.post(p.rest_api_url, JSON.stringify({
FnName: "CancelFiscalInv"
}),
function(data){
Log(data, 'cancel_check', 'portkkm');
console.log(data);
if (data.ErrorCode==0) {
console.log('portkkm: the check was canceled');
$('.alert').hide();
} else {
ajax_msg('main', 'danger', 'ПОРТ: Произошла ошибка при отмене чека. ' + data.ErrorMessage, 1);
p.load('finish');
}
}).fail(function(xhr, status, error) {
//console.log(xhr);console.log(status);console.log(data);
ajax_msg('main', 'danger', p.error_message(xhr), 1);
p.load('finish');
Log({xhr: xhr, status: status, error: error}, 'cancel_check', 'portkkm');
});
}
p.open_shift = function() {
$.post(p.rest_api_url, JSON.stringify({
FnName: "OpenFiscalInv",
OpCode: "30",
OpPwd :"30",
TillNmb: "1",
ReceiptType: "4"
}),
function(data){
Log(data, 'open_shift', 'portkkm');
console.log(data);
if (data.ErrorCode==0) {
console.log('portkkm: shift open');
//success();
} else {
ajax_msg('main', 'danger', 'ПОРТ: Произошла ошибка при открытии смены. ' + data.ErrorMessage, 1);
p.load('finish');
}
}).fail(function(xhr, status, error) {
//console.log(xhr);console.log(status);console.log(data);
ajax_msg('main', 'danger', p.error_message(xhr), 1);
p.load('finish');
Log({xhr: xhr, status: status, error: error}, 'open_shift', 'portkkm');
});
};
p.close_shift = function() {
$('.alert').hide();
p.connect( function() {
$.post(p.rest_api_url, JSON.stringify({
FnName: "PrintReport",
Type: "Z"
}),
function(data){
console.log(data);
Log(data, 'close_shift', 'portkkm');
p.reset_flag_salling();
$(p.control_sale).removeClass('noLink');
if (data.ErrorCode==0) {
console.log('portkkm: shift closed');
p.set_type_operation('3');
p.save_reports();
p.set_taxs();
} else if (data.ErrorCode==110109) {
ajax_msg('main', 'success', 'ПОРТ: '+data.ErrorMessage, 1);
} else {
ajax_msg('main', 'danger', 'ПОРТ: Произошла ошибка при закрытии смены. ' + data.ErrorMessage, 1);
}
p.load('finish');
}).fail(function(xhr, status, error) {
//console.log(xhr);console.log(status);console.log(data);
ajax_msg('main', 'danger', p.error_message(xhr), 1);
p.load('finish');
Log({
xhr: xhr,
status: status,
error: error
}, 'close_shift', 'portkkm');
});
});
};
p.set_taxs = function () {
const now = new Date();
const start = new Date('2025-12-31');//2026-01-01
const end = new Date('2026-01-03');//2026-01-02
if (now >= start && now <= end) {
$.post(p.rest_api_url, JSON.stringify({
FnName: "SetTaxRates",
TaxA: p.taxs[0],
TaxB: p.taxs[1],
TaxC: "100"
}),
function(data){
Log(data, 'set_taxs', 'portkkm');
console.log(data);
}).fail(function(xhr, status, error) {
console.log(xhr);console.log(status);
Log({xhr: xhr, status: status, error: error}, 'set_taxs', 'portkkm');
});
}
}
// p.zreport = function () {
// p.connect( function() {
// p.close_shift();
// });
// }
p.xreport = function () {
p.connect( function() {
$.post(p.rest_api_url, JSON.stringify({
FnName: "PrintReport",
Type: "X"
}),
function(data){
console.log(data);
Log(data, 'xreport', 'portkkm');
if (data.ErrorCode==0) {
console.log('portkkm: X report received');
$('.alert').hide();
} else {
ajax_msg('main', 'danger', 'ПОРТ: Произошла ошибка при получении X отчета. ' + data.ErrorMessage, 1);
p.load('finish');
}
}).fail(function(xhr, status, error) {
//console.log(xhr);console.log(status);console.log(data);
ajax_msg('main', 'danger', p.error_message(xhr), 1);
p.load('finish');
Log({
xhr: xhr,
status: status,
error: error
}, 'xreport', 'portkkm');
});
});
}
p.creport = function () {
p.connect( function() {
$.post(p.rest_api_url, JSON.stringify({
FnName: "PrintReport",
Type: "C"
}),
function(data){
console.log(data);
Log(data, 'creport', 'portkkm');
// if (data.ErrorCode==0) {
// console.log('portkkm: X report received');
// $('.alert').hide();
// } else {
// ajax_msg('main', 'danger', 'ПОРТ: Произошла ошибка при получении X отчета', 1);
// p.load('finish');
// }
}).fail(function(xhr, status, error) {
//console.log(xhr);console.log(status);console.log(data);
ajax_msg('main', 'danger', p.error_message(xhr), 1);
p.load('finish');
Log({xhr: xhr, status: status, error: error}, 'creport', 'portkkm');
});
});
}
p.get_sum_at_cashbox = function() {
p.connect( function() {
$.post(p.rest_api_url, JSON.stringify({
FnName: "ParishOrConsumption",
Type: "0",
Amount: "0"
}),
function(data){
console.log(data);
Log(data, 'get_sum_at_cashbox', 'portkkm');
if (data.ErrorCode==0) {
console.log('portkkm: get_sum_at_cashbox');
$('#portkkm_cash').val(data.CashSum);
$('#modal_portkkm_transaction').show();
$('#formPortkkmTransaction').modal('show')
} else {
ajax_msg('portkkm_transaction_modal_msg', 'danger', 'ПОРТ: Произошла ошибка при получении данных с кассы. ' + data.ErrorMessage, 1);
p.load('finish');
}
}).fail(function(xhr, status, error) {
//console.log(xhr);console.log(status);console.log(data);
ajax_msg('portkkm_transaction_modal_msg', 'danger', p.error_message(xhr), 1);
p.load('finish');
Log({xhr: xhr, status: status, error: error}, 'get_sum_at_cashbox', 'portkkm');
});
});
}
p.parish_or_consumption = function(success) {
var amount = $('#portkkm_operation_sum').val();
Log({amount: amount}, 'parish_or_consumption', 'portkkm');
$.post(p.rest_api_url, JSON.stringify({
FnName: "ParishOrConsumption",
Type: p.type_operation,
Amount: amount
}),
function(data){
console.log(data);
Log(data, 'parish_or_consumption', 'portkkm');
if (data.ErrorCode==0) {
if (p.type_operation == '0') {
console.log('portkkm: parish ' + amount);
ajax_msg('portkkm_transaction_modal_msg', 'success', 'ПОРТ: Внесена сумма ' + amount, 1);
success();
} else {
console.log('portkkm: consumption ' + amount);
ajax_msg('portkkm_transaction_modal_msg', 'success', 'ПОРТ: Изъята сумма ' + amount, 1);
success();
}
} else {
if (data.ErrorCode==111024) {
ajax_msg('portkkm_transaction_modal_msg', 'danger', 'ПОРТ: Продолжительность смены превышает 24 часа. Произведите закрытие смены. ' + p.btn_close_shift, 1);
} else {
ajax_msg('portkkm_transaction_modal_msg', 'danger', 'ПОРТ: Произошла ошибка при выполнении операции. ' + data.ErrorMessage, 1);
}
p.load('finish');
}
}).fail(function(xhr, status, error) {
//console.log(xhr);console.log(status);console.log(data);
ajax_msg('portkkm_transaction_modal_msg', 'danger', p.error_message(xhr), 1);
p.load('finish');
Log({xhr: xhr, status: status, error: error}, 'parish_or_consumption', 'portkkm');
});
}
p.check_connection = function(success) {
$.post(p.rest_api_url, JSON.stringify({
FnName: "CheckConnection"
}),
function(data){
Log(data, 'check_connection', 'portkkm');
if (data.ErrorCode==0) {
success();
} else {
p.connect(function() {
success();
});
}
}).fail(function(xhr, status, error) {
console.log(xhr);
console.log(status);
console.log(error);
ajax_msg('main', 'danger', p.error_message(xhr), 1);
p.load('finish');
Log({xhr: xhr, status: status, error: error}, 'check_connection', 'portkkm');
});
}
p.save_reports = function() {
var rubus_operations = {
'0': 'deposit_cash',
'1': 'remove_cash',
'2': 'shift_open',
'3': 'shift_close'
};
var data_operation = {};
if (p.type_operation <= 1) {
data_operation = {
sum: $('#portkkm_operation_sum').val(),
comment: $('#portkkm_operation_comment').val()
};
}
Log(data_operation, 'save_reports', 'portkkm');
$.post(p.webroot + 'Portkkm_api/portkkm/save_reports/'+rubus_operations[p.type_operation], data_operation,
function(response){
console.log('report saved');
Log({saved: true}, 'save_reports', 'portkkm');
});
}
p.is_first_operation = function(success) {
$.post(p.rest_api_url, JSON.stringify({
FnName: "Programming",
Name: "DFR_needed"
}),
function(data){
Log(data, 'is_first_operation ', 'portkkm');
console.log(data);
if (data.ErrorCode==0) {
console.log('portkkm: DFR_needed ' + data.Value);
console.log(!+data.Value);
p.first_operation = !+data.Value;
success();
} else {
ajax_msg('main', 'danger', 'ПОРТ: Произошла ошибка при получении служебной переменной DFR_needed. Проверьте подключение к терминалу.', 1);
p.load('finish');
p.reset_flag_salling();
}
}).fail(function(xhr, status, error) {
//console.log(xhr);console.log(status);console.log(data);
ajax_msg('main', 'danger', p.error_message(xhr), 1);
p.load('finish');
p.reset_flag_salling();
Log({xhr: xhr, status: status, error: error}, 'is_first_operation', 'portkkm');
});
}
p.get_fiscalized = function(success) {
$.post(p.rest_api_url, JSON.stringify({
FnName: "Programming",
Name: "Fiscalized"
}),
function(data){
console.log(data);
Log(data, 'get_fiscalized', 'portkkm');
if (data.ErrorCode==0) {
console.log('portkkm: Fiscalized ' + data.Value);
p.fiscalized = +data.Value;
if (success) {
success();
}
} else {
ajax_msg('main', 'danger', 'ПОРТ: Произошла ошибка при получении служебной переменной Fiscalized. Проверьте подключение к терминалу.', 1);
p.load('finish');
}
}).fail(function(xhr, status, error) {
//console.log(xhr);console.log(status);console.log(data);
ajax_msg('main', 'danger', p.error_message(xhr), 1);
p.load('finish');
Log({xhr: xhr, status: status, error: error}, 'get_fiscalized', 'portkkm');
});
}
p.get_rnm = function(success) {
$.post(p.rest_api_url, JSON.stringify({
FnName: "Programming",
Name: "REGnumber"
}),
function(data){
console.log(data);
Log(data, 'get_rnm', 'portkkm');
if (data.ErrorCode==0) {
console.log('portkkm: REGnumber ' + data.Value);
p.rnm = data.Value;
if (success) {
success();
}
} else {
ajax_msg('main', 'danger', 'ПОРТ: Произошла ошибка при получении служебной переменной REGnumber. Проверьте подключение к терминалу.', 1);
p.load('finish');
}
}).fail(function(xhr, status, error) {
//console.log(xhr);console.log(status);console.log(data);
ajax_msg('main', 'danger', p.error_message(xhr), 1);
p.load('finish');
Log({xhr: xhr, status: status, error: error}, 'get_rnm', 'portkkm');
});
}
//реализует возможность получения и установки системных переменных. Выполнять после connect
p.programming = function(name, index, value) {
if((p.printer_name=="DP-25" || p.printer_name=="DPG-25" || p.printer_name=="DPG-35" || p.printer_name=="DPG-150") && name=="NetInterfaceToUse") {
name = 'GprsInterface';
}
Log({Name: name, Index: index, Value: value}, 'programming', 'portkkm');
$.post(p.rest_api_url, JSON.stringify({
FnName: "Programming",
Name: name,
Index: index,
Value: value
}),
function(data){
console.log(data);
Log(data, 'programming', 'portkkm');
if (data.ErrorCode==0) {
console.log('portkkm: ' + name + ' = ' + data.Value);
} else {
ajax_msg('main', 'danger', 'ПОРТ: Произошла ошибка при выполнении комманды Programming', 1);
p.load('finish');
}
}).fail(function(xhr, status, error) {
//console.log(xhr);console.log(status);console.log(data);
ajax_msg('main', 'danger', p.error_message(xhr), 1);
p.load('finish');
Log({xhr: xhr, status: status, error: error}, 'programming', 'portkkm');
});
}
p.clear_fiscal_data = function() {
p.fiscal_sign = '';
p.doc_number = '';
Log({fiscal_sign: p.fiscal_sign, doc_number: p.doc_number}, 'clear_fiscal_data', 'portkkm');
}
p.set_check_data = function(fiscal_sign, sum, time) {
p.fiscal_sign = fiscal_sign;
p.check_sum = sum;
p.check_time = time;
Log({fiscal_sign: p.fiscal_sign, check_sum: p.check_sum, check_time: p.check_time}, 'set_check_data', 'portkkm');
};
p.set_type_operation = function(value) {
p.type_operation = value;
Log({type_operation: p.type_operation}, 'set_type_operation', 'portkkm');
}
p.update_printer_name = function () {
$.post(p.rest_api_url, JSON.stringify({
FnName: "DiagnosticInfo"
}),
function(data){
//console.log(data);
if (data.ErrorCode==0) {
p.printer_name = data.Name;
}
}).fail(function(xhr, status, error) {
console.log(xhr);console.log(status);
Log({xhr: xhr, status: status, error: error}, 'update_printer_name', 'portkkm');
});
}
p.version = function () {
$.post(p.rest_api_url, JSON.stringify({
FnName: "Version"
}),
function(data){
console.log(data);
Log(data, 'version', 'portkkm');
}).fail(function(xhr, status, error) {
console.log(xhr);console.log(status);
Log({xhr: xhr, status: status, error: error}, 'version', 'portkkm');
});
}
//обновляем сессионные переменные kaspi на сервере внешней системы
p.update_session = function(data){
Log({data: data}, 'update_session', 'portkkm');
$.post(p.webroot + 'Portkkm_api/portkkm/update_session', data,
function(response){
console.log('session updated');
Log({updated: true}, 'update_session', 'portkkm');
});
}
//обновляем сессионные переменные
p.update_order_status = function(data, success){
$.post(p.webroot + 'Portkkm_api/portkkm/update_order_status', data,
function(response){
data = JSON.parse(response);
Log(data, 'update_order_status', 'portkkm');
if(data['status']=='ok'){
success();
console.log('status updated');
}
});
}
p.objectEmpty = function(obj){
if (Object.keys(obj).length == 0) return true;
return false;
}
p.reset_flag_salling = function() {
if (p.salling) p.salling = false;
}
//показываем/скрываем процесс загрузки
p.load = function(comand){
if (comand == 'start') {
$('.kaspi_load').addClass('spin');
} else {
if (p.load_finish) p.load_finish();
$('.kaspi_load').removeClass('spin');
}
}
p.set_load_finish = function(func) {
if (func)
p.load_finish = func;
else p.load_finish = function() {};
}
//обработка ошибок
p.error_message = function(xhr, repeat) {
if (xhr.responseJSON) return xhr.responseJSON.message;
return 'ПОРТ ККМ недоступен или вышло время ожидания.';//+repeat_btn;
}
p.is_json = function(str) {
try {
JSON.parse(str);
} catch (e) {
return false;
}
return true;
}
p.isEmpty = function(str) {
return (!str || str.length === 0 );
}
p.repeat_func = p.refund;
p.store = {
set: function(label, value) {
localStorage.setItem('portkkm_' + label, value);
},
get: function(label) {
return localStorage.getItem('portkkm_' + label);
},
clear: function() {
localStorage.removeItem('portkkm_amount');
localStorage.removeItem('portkkm_paid_mode');
}
};
p.test_method = function() {
//p.port = 101010;
console.log(p.port);
}
window.Portkkm = new portkkm;
}(jQuery));