Документация по API и примеры на js:
Общая функция вызова сервера
Для активации скрипта расширения ваша страница должна содержать в теге "head" строку:
<script>var KkmServerAddIn = {};</script>
По этой строке расширение поймет что надо в страницу внедрять скрипт расширения.
Пример html странички с подключением расширения:
<html>
<head>
<script>var KkmServerAddIn = {};</script>
</head>
<body/>
</html>
// Общая функция вызова API Unit-server-а
// Будет использоватся во всех примерах
var UrlServer = ""; // HTTP адрес сервера торгового оборудования, если пусто то локальный вызов
var User = ""; // Пользователь доступа к серверу торгового оборудования
var Password = ""; // Пароль доступа к серверу торгового оборудования
function ExecuteCommand(
Data, // Данные команды
FunSuccess, // Функция выполняемая при успешном соединении
FunError, // Функция выполняемая при ошибке соединения
timeout) {
// Проверка стоит ли расширение, и если стоит то отправка через расширение
// Для активации скрипта расширения ваша страница должна содержать в теге "head" строку:
// <script>var KkmServerAddIn = {};</script>
try {
if (KkmServer != undefined) {
// Если данные - строка JSON конвентируем в объект
if (typeof (Data) == "string") Data = JSON.parse(Data);
// Выполняем команду через расширение
KkmServer.Execute(ExecuteSuccess, Data);
//Возврат - вызов по Http не нужен
return;
};
} catch { };
// Если нет расширения - далее отправляем команду по http
// Если не указана функция обработки ответа - назначаем функцию по умолчанию
if (FunSuccess === undefined) {
FunSuccess = ExecuteSuccess;
}
if (FunError === undefined) {
FunError = ErrorSuccess;
}
if (timeout === undefined) {
timeout = 60000; //Минута - некоторые драйверы при работе выполняют интерактивные действия с пользователем - тогда увеличте тайм-аут.
}
// Устанавливаем таймаут чуть больше чем в команде
try {
if (Data.Timeout != undefined && Data.Timeout > 60) {
timeout = (Data.Timeout + 20) * 1000
};
} catch (ex) {
};
// Отправляем данные по HTTP протоколу
var Url = UrlServer + ((UrlServer == "") ? window.location.protocol + "//" + window.location.host + "/" : "/") + 'Execute';
var HeaderAuthorization = (User !== '' || Password !== '') ? ('Basic ' + btoa(User + ':' + Password)) : '';
var IsRerror = false;
const response = fetch(
Url,
{
method: 'POST', // *GET, POST, PUT, DELETE, etc.
mode: 'cors', // no-cors, *cors, same-origin
cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached
//credentials: 'same-origin', // include, *same-origin, omit
headers: {
'Content-Type': 'application/json; charset=UTF-8',
'Authorization': HeaderAuthorization
},
redirect: 'follow', // manual, *follow, error
referrerPolicy: 'no-referrer', // no-referrer, *client
body: JSon
}
).catch(Exception => {
IsRerror = true;
FunError('Ошибка: ' + Exception.message);
}).then(response => {
if (IsRerror == false) {
response.json(
).catch(Exception => {
IsRerror = true;
FunSuccess('Ошибка: ' + Exception.message);
}).then(resultJson => {
if (IsRerror == false) {
FunSuccess(resultJson);
};
});
};
});
}
// Функция вызываемая после обработки команды - обработка возвращаемых данных
// Здесь можно посмотреть как получить возвращаемые данные
function ExecuteSuccess(Rezult) {
//----------------------------------------------------------------------
// ОБЩЕЕ
//----------------------------------------------------------------------
if (Rezult.Status == 0) {
MessageStatus = "Ok";
} else if (Rezult.Status == 1) {
MessageStatus = "Выполняется";
} else if (Rezult.Status == 2) {
MessageStatus = "Ошибка!";
} else if (Rezult.Status == 3) {
MessageStatus = "Данные не найдены!";
};
// Текст ошибки
MessageError = Rezult.Error;
//----------------------------------------------------------------------
// Фискальные регистраторы
//----------------------------------------------------------------------
// Номер чека
var MessageCheckNumber = Rezult.CheckNumber;
// Номер смены
var MessageSessionNumber = Rezult.SessionNumber;
// Количество символов в строке
var MessageLineLength = Rezult.LineLength;
// Сумма наличных в ККМ
var MessageAmount = Rezult.Amount;
}
// Функция вызываемая при ошибке передачи данных
function ErrorSuccess(TextError) {
document.getElementById('Responce').innerHTML = "Ошибка передачи данных по HTTP протоколу: " + TextError;
}
// Герерация GUID
function guid() {
function S4() {
return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
}
return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4());
}
Требуется jquery.
Печать чека на ККМ JavaScript
// Печать чека
function RegisterCheck(NumDevice, TypeCheck, IsBarCode, Print) {
// Подготовка данных команды
var Data = {
// Команда серверу
Command: "RegisterCheck",
//***********************************************************************************************************
// ПОЛЯ ПОИСКА УСТРОЙСТВА
//***********************************************************************************************************
// Номер устройства. Если 0 то первое не блокированное на сервере
// Не рекомендовано для использования.
// Рекомендуем для поиска ККТ задавать InnKkm и TaxVariant !!!!!!
NumDevice: NumDevice,
// ИНН ККМ для поиска. Если "" то ККМ ищется только по NumDevice,
// Если NumDevice = 0 а InnKkm заполнено то ККМ ищется только по InnKkm
InnKkm: "",
//---------------------------------------------
// Заводской номер ККМ для поиска. Если "" то ККМ ищется только по NumDevice,
KktNumber: "",
// **********************************************************************************************************
// Время (сек) ожидания выполнения команды.
//Если За это время команда не выполнилась в статусе вернется результат "NotRun" или "Run"
//Проверить результат еще не выполненной команды можно командой "GetRezult"
//Если не указано или 0 - то значение по умолчанию 60 сек.
// Поле не обязательно. Это поле можно указывать во всех командах
Timeout: 30,
// Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды
// По этому идентификатору можно запросить результат выполнения команды
// Поле не обязательно
IdCommand: guid(),
// Это фискальный или не фискальный чек
IsFiscalCheck: true,
// Тип чека, Тег 1054;
// 0 – продажа/приход; 10 – покупка/расход;
// 1 – возврат продажи/прихода; 11 - возврат покупки/расхода;
// 2 – корректировка продажи/прихода; 12 – корректировка покупки/расхода;
// 3 – корректировка возврата продажи/прихода; (>=ФФД 1.1) 13 – корректировка возврата покупки/расхода; (>=ФФД 1.1)
TypeCheck: TypeCheck,
// Не печатать чек на бумагу
// - Но есть нюансы!!!:
// -- Некоторые ККТ всегда печатают отчеты.
// -- Некоторые ККТ всегда печатают чеки если ККТ не зарегистрирована на "Интернет продажи"
// -- Некоторые ККТ всегда печатают чеки если в данных чека нет телефона или email-а клиента
// -- А у некоторых это еще зависит и от версии прошивки.
NotPrint: false, //true,
// Количество копий документа
NumberCopies: 0,
// Продавец, Тег ОФД 1021
CashierName: "Kазакова Н.А.",
// ИНН продавца Тег ОФД 1203
CashierVATIN: "430601071197",
// Телефон или е-Майл покупателя, Тег ОФД 1008
// Если чек не печатается (NotPrint = true) то указывать обязательно
// Формат: Телефон +{Ц} или Email {С}@{C}
ClientAddress: "sochi@papa.com",
// Покупатель (клиент) - наименование организации или фамилия, имя, отчество (при наличии), серия и номер паспорта покупателя(клиента). Тег 1227
// Только с использованием наличных / электронных денежных средств и при выплате выигрыша, получении страховой премии или при страховой выплате.
ClientInfo: "Везучий В.В. РЕ-125486",
// ИНН Организации или покупателя(клиента). Тег 1228
// Только с использованием наличных / электронных денежных средств и при выплате выигрыша, получении страховой премии или при страховой выплате.
ClientINN: "502906602876",
// Aдрес электронной почты отправителя чека, Тег ОФД 1117 (если задан при регистрации можно не указывать)
// Формат: Email {С}@{C}
SenderEmail: "sochi@mama.com",
// Адрес расчетов, Тег ОФД 1009 (если не задано - берется из регистрационных данных ККТ)
AddressSettle: "Тестовый адрес",
// Место расчетов, Тег ОФД 1187 (если не задано - берется из регистрационных данных ККТ)
PlaceMarket: "kkmserver.ru",
// Система налогообложения (СНО) применяемая для чека, Тег 1055
// Если не указанно - система СНО настроенная в ККМ по умолчанию
// 0: Общая ОСН
// 1: Упрощенная УСН (Доход)
// 2: Упрощенная УСН (Доход минус Расход)
// 3: Единый налог на вмененный доход ЕНВД
// 4: Единый сельскохозяйственный налог ЕСН
// 5: Патентная система налогообложения
// Комбинация разных СНО не возможна
// Надо указывать если ККМ настроена на несколько систем СНО
TaxVariant: "",
// Это только для тестов: Получение ключа суб-лицензии : ВНИМАНИЕ: ключ суб-лицензии вы должны генерить у себя на сервере!!!!
//KeySubLicensing: GetKeySubLicensing("sochi@papa.com", "12qw12"),
// Только для чеков коррекции:
//Тип коррекции 0 - самостоятельно 1 - по предписанию, Тег 1173, Только для чеков коррекции!
CorrectionType: 1,
// Дата документа основания для коррекции, Тег ОФД 1178, Только для чеков коррекции!
CorrectionBaseDate: '2017-06-21T15:30:45',
// Номер документа основания для коррекции, Тег ОФД 1179, Только для чеков коррекции!
CorrectionBaseNumber: "MOS-4516",
// Если надо одновременно автоматически провести транзакцию через эквайринг
// Эквайринг будет задействован если: 1. чек фискальный, 2. оплата по "ElectronicPayment" не равна 0, 3. PayByProcessing = true
// Использовать эквайринг: Null - из настроек на сервере, false - не будет, true - будет
PayByProcessing: false, //В тестовом чеке автоматический эквайринг выключен
// Номер устройства для эквайринга - Null - из настроек на сервере, 0 - любое, число - номер конкретного устройства
NumDeviceByProcessing : null,
// Номер чека для эквайринга
ReceiptNumber: "TEST-01",
// Печатать Слип-чек после чека (а не в чеке)
PrintSlipAfterCheck: false,
// Печатать Слип-чек дополнительно для кассира (основной слип-чек уже будет печататся в составе чека)
PrintSlipForCashier: true,
//Если это чек возврата то возможны два поля для отмены транзакции (если не указано то по эквайрингу будет не отмена а возврат оплаты)
RRNCode: "", // RRNCode из операции эквайринга. Только для отмены оплаты! Для Оплаты или возврата оплаты не заполнять!
AuthorizationCode: "", // AuthorizationCode из операции эквайринга. Только для отмены оплаты! Для Оплаты или возврата оплаты не заполнять!
// Дополнительный реквизит пользователя тег ОФД 1084
UserAttribute: {
// Наименование дополнительного реквизита пользователя тег ОД 1085
Name: "Поле-тест",
// Значение дополнительного реквизита пользователя тег ОФД 1086
Value: "Тестовое значение"
},
// Дополнительный реквизит чека тег 1192
AdditionalAttribute: "Тест",
// Строки чека
CheckStrings: [
// Строка с печатью картинки
{
PrintImage: {
//Картинка в Base64. Картинка будет преобразована в 2-х цветное изображение- поэтому лучше посылать 2-х цветный bmp
Image: "Qk3+EwAAAAAAAD4AAAAoAAAA5AAAAJ4AAAABAAEAAAAAAMATAACHHQAAhx0AAAAAAAAAAAAAAAAAAP///wD/////////////////////////////////////8AAAAP/////////////////////////////////////wAAAA//////////////////////////////////////AAAAD/////////////////////////////////////8AAAAP/////////////////////////////////////wAAAA//////////////////////////////////////AAAAD/////////////////////////////////////8AAAAP////+f//////////+P///////////////////wAAAA/////5///////////4////////////////////AAAAD/////n///////////H///////////////////8AAAAP////+f//////////8f///////////////////wAAAA/////5///////////x////////////////////AAAAD/////j//////////+P///////////////////8AAAAP////+PwAj///////w////////////////////wAAAA/////48PgP///////H////////////////////AAAAD/////zH/B///////4f///////////////////8AAAAP/////J/8H///////j////////////////////wAAAA/////+P/4///////8P////////////////////AAAAD///gAx//z///////h////////////////////8AAAAP//4fgP//P//////+P////////////////////wAAAA///H/z//8B//////x///////gP////////////AAAAD//5/8f//gD/////+P//////4AH///////////8AAAAP//P/3//8/B/////x///////AAMf///////+A/wAAAA//8/////H+H////+H//////4/+AH///////AB/AAAAD//n////5/w/8f//yP//////n/w4P//////4fP8AAAAP/+////+f+D/8AH/8f/////8/+f+P/////+H8/wAAAA//7////z//P//g//x//////3/3/+f/////j/5/AAAAD//P///+//8//////H/////8f///8////wB//n8AAAAP/8////z//j/////8/////wB////5//+AH//8PwAAAA//z///+v/+f/P///D////wAH////z/8A////0fAAAAD//P///7//w/+AA/4f///8Aef////n+A////+R8AAAAP/9//////4ID+Tv/7////A/5//8//vA/////znwAAAA//3/P////H4f7Of/v///4//n//n//Q/////8efAAAAD//f+P///x/B/Mc/+f///H//P/+f/+P/////Dz8AAAAP/9/8f//+P4P9x7/5///5//8//wA/z////4A/PwAAAA//3/Mf//z/+/nD3/n///P//z//GAAf////P/8PAAAAD/+f/A//+f/7+evP/f//8///H/8f/x////9//g8AAAAP/5//A//y//Pz6ef8///n//+f/x//P////3/+HwAAAA//n/+Q//7/8/Ps8/z//+///5//n/9///////yfAAAAD/+YABx////n4+z7/v//z///z/+P/n//////8Z8AAAAP/4B/gh///8/n5n3+//+f///P/8/+f/////8DvwAAAA/+D//xh///n+fnfP5//7///+f/z/5///9/+A+/AAAAD/h///jh//4/x+c+f3//P///4//n/n///v/z/z8AAAAP8P///Hg/+H/P578/f/AD///z//f+f//+//f/fwAAAA/D///+fAAB/8/nn58/wfD/wAH/8/9///n/9/7/AAAAD4f///5+AA//z/ffz7+P/n/4AP/5////8////P8AAAAPn////z5///+f9+/nnz//P/j8f/z////H///x/wAAAA8/////Pz///5/z5/uef/++Af4/vD///4///8f/AAAADn////8/P///n/P3/N7/B58//x/eD//8P//8D/8AAAAOf////D8f//+f8/v+QP553n//h88D/4D///B//wAAAAz////+P5///x/7+f8E/P3c///j54D/////h///AAAADf////8fj///P/v9/x35/dz///Dz4h////8P//8AAAAN/////5/P//8/+fj/PfL8Gf///BH57////H///wAAAA3/////z8f//z/58n5993wT////AH/v///4////AAAACf///z/Px///P/nmfn3nPMP////AP+f//+P///8AAAAN///gB+/n//8/+f8+f+e99/////8P5///z////wAAAA3//wAD7+P//3/9/w5/57z3/////4PH//8/////AAAADd/8H+Hv8///f/z/Hn/APAf/////8AP//n////8AAAAMv/D/z8/x//9//PxPf8/8T///////8//+/////wAAAA6/4//P3/n//3/8/+c/z/0f///////5//7/////AAAADj+P/8+f+P/+f/7/9z/P/D////////x//3////8AAAAPfx//zz/8//4//n/zn8/8P////////h//n////wAAAA9+X//Of/5//4f+f4Gf3/x/////////g//P////AAAADn6f/8z//n//4f5//cff/H/////////B/8////8AAAAOf5//yf//O//8fz/879+8A/////////D/5////wAAAA5/n//j//8H//8fP/5v3zw4////////+H/n////AAAADn+f/8H//4///8c//y/fPH8////////8f/f///8AAAAOf5//AH//H///4x//r988f4///h////5/9////wAAAA9/n/58P/8wH/+Hn//P37x/5//4B////n/n////AAAAD3+f//8/8AD//B+f/+/fvD/7//vj///+f+f///8AAAAPP5///AAA///x/4//79+8P+Af8/n///9/x////wAAAA+Pn/////////v/z//vz7weAAH7/P///z+P////AAAAD8AP////////+f/H/+/Pvfg/4Dn/P///Pw////8AAAAP+I/////////9/+f9788B4//+Df+A//+IH////wAAAA//z/////////z/5/zvz3OP///A/AQ//4D/////AAAAD//P/////////v/j/k/O/x////CA/x//h/////8AAAAP/8/////////+f/P/D85+P////g//n//f/////wAAAA//5/////////8/8f8Px3z/////wf/P////////AAAAD//n/////////5/5/4/gef///////8////////8AAAAP/+f/////////n/n/L+Az////////z////////wAAAA//9//////////P/P9v4Cf//h/////P////////AAAAD//z/////////+f8/v/gD//+7////5////////8AAAAP//P/////////4/58//Af//53////z////////wAAAA//+f/////////z/33/8D///zP////H////////AAAAD//5//////////n/Pf/wP///x////+P///////8AAAAP//j//////////P+Z/3B/////////8f///////wAAAA///P/////////+fpr/uP/////////4////////AAAAD//+f/////////48yP+I//////////x///////8AAAAP//8P//////A//xzp/8H//5///////j///////wAAAA///4AAAAAAAH//iPH/8P//N//////+P///////AAAAD////AAAAAf8P/gA4f////93//////8f//////8AAAAP////4AA///4PAADh/////7v//////4///////wAAAA///////////4AAAMH/////x///////z///////AAAAD///////////+AAAwP///f/////////H//////8AAAAP////////////wADA9//7/////////+f//////wAAAA/////////////gAABn//A/////////5///////AAAAD//////////8AHAAAAf/wf///x/////j//////8AAAAP//////////8AAAAAB/8P///+b/////P//////wAAAA///////////8AAAAAH/Bf/9/73////8///////AAAAD///////////8AAAAAAAE//z/3f////z//////8AAAAP///////////8AAAAAAAJ//n/h//v//P//////wAAAA//////////8AAAAAAD4Az//P///8D/8///////AAAAD//////////AAAAAAAPADAAAf///gD/z//////8AAAAP//////////AAAAAAA/gGAAAf//+AD/P//////wAAAA///////////gAAAAAB+AYDn8///wAH9///////AAAAD///////////gAAAAAH4BwHf4///AAPn//////8AAAAP///////////gAAAAAfgHAd/w//8AAc///////wAAAA////////////gAAAAA/AcBz/w//wAAn///////AAAAD////////////AAAAAD8h5Hv/w//AAA///////8AAAAP///////////+AAAAAPzHke//wf8AAD///////wAAAA///////////+AAAAAA7A+D7//4HwAAP///////AAAAD///////////AAAAAAD0H5/n//8AAAAf//////8AAAAP//////////4AAAAAAPb/n+f///AAAB///////wAAAA//////////+AAAAAAA9v+f5////4AAD///////AAAAD//////////wAAAAAAB2/5/3////wAAP//////8AAAAP////////////AAAAAHN/j/f//7/gDg///////wAAAA/////////////4AAAA+3+P5///P/AfH///////AAAAD/////////////wAAAD9v5fn//x/+A8f//////8AAAAP////////////+OAAAP+ft+//8H/8AB///////wAAAA/////////////54AAA/884j//A//8AP///////AAAAD/////////////nuAAD/AHwD/4H//4D///////8AAAAP////////////+8/AAH9P/4v8Af///////////wAAAA/////////////7n/gAP3P/GfAD////////////AAAAD/////////////Of/AAPPP55wAf///////////8AAAAP////////////+z/8wAGffvAAD/z//////////wAAAA/////////////7P/ngAAc+wAAf4f//////////AAAAD/////////////t/8fAAADwAAD8D//////////8AAAAP////////////+H/z+AAAAAAAeAf//////////wAAAA/////////////4f+f8AAAAAADAD///////////AAAAD/////////////z/x/4AAAAAAAAf//////////8AAAAP/////////////P/P/wAAAAAAAD/+/////////wAAAA/////////////8/5/+AAAAAAAA//H/////////AAAAD/////////////3/n/wgAAAAAAH/g/////////8AAAAP/////////////f8/8PAAAAAAB/gH/////////wAAAA/////////////9/3/h+AAAAAAfgB//////////AAAAD/////////////3+f8P+AAAAAAAAP/////////8AAAAP/////////////f7/j/8AAAAAAAD//////////wAAAA/////////////9/P8f/4AAAAAAA///////////AAAAD/////////////n9/j//4AAAAAAf//////////8AAAAP////////////+fn8f//4AAAAAP///////////wAAAA/////////////5+fj//vwAAAAH/4//////////AAAAD/////////////n78f//PwAAAB/AH/////////8AAAAP////////////+fPg///PwAAAAAB//////////wAAAA/////////////598A///HwAAAAAf//////////AAAAD/////////////3nzgf//H4AAAAP//////////8AAAAP/////////////eefgD/wAAAAAD///////////wAAAA/////////////97z+kAAfAcAAH////////////AAAAD/////////////3OP7f///////////////////8AAAAP/////////////Mx/s////////////////////wAAAA/////////////83P+Z////////////////////AAAAD/////////////zZ/4H///////////////////8AAAAP/////////////tH//////////////////////wAAAA/////////////+c///////////////////////AAAAD/////////////4n//////////////////////8AAAAP/////////////w///////////////////////wAAAA//////////////H///////////////////////AAAAD/////////////////////////////////////8AAAAP/////////////////////////////////////wAAAA",
},
},
// Строка с печатью простого текста
{
PrintText: {
//При вставке в текст символов ">#10#<" строка при печати выровнеется по центру, где 10 - это на сколько меньше станет строка ККТ
Text: ">#2#<ООО \"Рога и копыта\"",
Font: 1,
},
},
// При вставке в текст в середину строки символов "<#10#>" Левая часть строки будет выравнена по левому краю, правая по правому, где 10 - это на сколько меньше станет строка ККТ
// При вставке в текст в середину строки символов "<#10#>>" Левая часть строки будет выравнена по правому краю, правая по правому, где 10 - отступ от правого клая
{ PrintText: { Text: "<<->>" }, },
{ PrintText: { Text: "Пример №1:<#10#>154,41" }, },
{ PrintText: { Text: "2-рое поле:<#10#>4,00" }, },
{ PrintText: { Text: "<<->>" }, },
{ PrintText: { Text: "Пример №2:<#8#>>4,00" }, },
{ PrintText: { Text: "2-рое поле:<#8#>>1544,00" }, },
// Строка с печатью текста определенным шрифтом
{ PrintText: { Text: "<<->>" }, },
{
PrintText: {
Text: "Шрифт № 1" ,
Font: 1, // 1-4, 0 - по настройкам ККМ
Intensity: 15, // 1-15, 0 - по настройкам ККМ
},
},
{
PrintText: {
Text: "Шрифт № 2" ,
Font: 2, // 1-4, 0 - по настройкам ККМ
Intensity: 10, // 1-15, 0 - по настройкам ККМ
},
},
{
PrintText: {
Text: "Шрифт № 3" ,
//Text: "Это мега крутой товар. Продается во всех магазинах страны. Покупайте только у нас" ,
Font: 3, // 1-4, 0 - по настройкам ККМ
Intensity: 5, // 1-15, 0 - по настройкам ККМ
},
},
{
PrintText: {
Text: "Шрифт № 4" ,
Font: 4, // 1-4, 0 - по настройкам ККМ
Intensity: 0, // 1-15, 0 - по настройкам ККМ
},
},
{ PrintText: { Text: "<<*>>" }, },
// Строка с печатью фискальной строки
{
Register: {
// Наименование товара 64 символа, Тег 1059
Name: "Сапоги женские DF-3099-1" ,
// Количество товара (3 знака после запятой), Тег 1023
Quantity: 3,
// Цена за шт. без скидки (2 знака после запятой)
Price: 100,
// Конечная сумма строки с учетом всех скидок /наценок; (2 знака после запятой), Из нее расчет тега 1079
Amount: 0.01,
// Отдел, по которому ведется продажа
Department: 0,
// НДС в процентах или ТЕГ НДС: 0 (НДС 0%), 10 (НДС 10%), 20 (НДС 20%), -1 (НДС не облагается), 120 (НДС 20 /120), 110 (НДС 10 /110), Тег 1043, Из нее расчет тега 1079
Tax: 20,
// Признак способа расчета. Тег ОФД 1214. Для ФФД.1.05 и выше обязательное поле
// 1: "ПРЕДОПЛАТА 100% (Полная предварительная оплата до момента передачи предмета расчета)"
// 2: "ПРЕДОПЛАТА (Частичная предварительная оплата до момента передачи предмета расчета)"
// 3: "АВАНС"
// 4: "ПОЛНЫЙ РАСЧЕТ (Полная оплата, в том числе с учетом аванса в момент передачи предмета расчета)"
// 5: "ЧАСТИЧНЫЙ РАСЧЕТ И КРЕДИТ (Частичная оплата предмета расчета в момент его передачи с последующей оплатой в кредит )"
// 6: "ПЕРЕДАЧА В КРЕДИТ (Передача предмета расчета без его оплаты в момент его передачи с последующей оплатой в кредит)"
// 7: "ОПЛАТА КРЕДИТА (Оплата предмета расчета после его передачи с оплатой в кредит )"
SignMethodCalculation: 4,
// Признак предмета расчета. Тег ОФД 1212. Для ФФД.1.05 и выше обязательное поле
// 1: "ТОВАР (наименование и иные сведения, описывающие товар)"
// 2: "ПОДАКЦИЗНЫЙ ТОВАР (наименование и иные сведения, описывающие товар)"
// 3: "РАБОТА (наименование и иные сведения, описывающие работу)"
// 4: "УСЛУГА (наименование и иные сведения, описывающие услугу)"
// 5: "СТАВКА АЗАРТНОЙ ИГРЫ (при осуществлении деятельности по проведению азартных игр)"
// 6: "ВЫИГРЫШ АЗАРТНОЙ ИГРЫ (при осуществлении деятельности по проведению азартных игр)"
// 7: "ЛОТЕРЕЙНЫЙ БИЛЕТ (при осуществлении деятельности по проведению лотерей)"
// 8: "ВЫИГРЫШ ЛОТЕРЕИ (при осуществлении деятельности по проведению лотерей)"
// 9: "ПРЕДОСТАВЛЕНИЕ РИД (предоставлении прав на использование результатов интеллектуальной деятельности или средств индивидуализации)"
// 10: "ПЛАТЕЖ (аванс, задаток, предоплата, кредит, взнос в счет оплаты, пени, штраф, вознаграждение, бонус и иной аналогичный предмет расчета)"
// 11: "АГЕНТСКОЕ ВОЗНАГРАЖДЕНИЕ (вознаграждение (банковского)платежного агента/субагента, комиссионера, поверенного или иным агентом)"
// 12: "СОСТАВНОЙ ПРЕДМЕТ РАСЧЕТА (предмет расчета, состоящем из предметов, каждому из которых может быть присвоено вышестоящее значение"
// 13: "ИНОЙ ПРЕДМЕТ РАСЧЕТА (предмет расчета, не относящемуся к предметам расчета, которым может быть присвоено вышестоящее значение"
// 14: "ИМУЩЕСТВЕННОЕ ПРАВО" (передача имущественных прав)
// 15: "ВНЕРЕАЛИЗАЦИОННЫЙ ДОХОД"
// 16: "СТРАХОВЫЕ ВЗНОСЫ" (суммы расходов, уменьшающих сумму налога (авансовых платежей) в соответствии с пунктом 3.1 статьи 346.21 Налогового кодекса Российской Федерации)
// 17: "ТОРГОВЫЙ СБОР" (суммы уплаченного торгового сбора)
// 18: "КУРОРТНЫЙ СБОР"
// 19: "ЗАЛОГ"
// 20: "РАСХОД" - суммы произведенных расходов в соответствии со статьей 346.16 Налогового кодекса Российской Федерации, уменьшающих доход
// 21: "ВЗНОСЫ НА ОБЯЗАТЕЛЬНОЕ ПЕНСИОННОЕ СТРАХОВАНИЕ ИП" или "ВЗНОСЫ НА ОПС ИП"
// 22: "ВЗНОСЫ НА ОБЯЗАТЕЛЬНОЕ ПЕНСИОННОЕ СТРАХОВАНИЕ" или "ВЗНОСЫ НА ОПС"
// 23: "ВЗНОСЫ НА ОБЯЗАТЕЛЬНОЕ МЕДИЦИНСКОЕ СТРАХОВАНИЕ ИП" или "ВЗНОСЫ НА ОМС ИП"
// 24: "ВЗНОСЫ НА ОБЯЗАТЕЛЬНОЕ МЕДИЦИНСКОЕ СТРАХОВАНИЕ" или "ВЗНОСЫ НА ОМС"
// 25: "ВЗНОСЫ НА ОБЯЗАТЕЛЬНОЕ СОЦИАЛЬНОЕ СТРАХОВАНИЕ" или "ВЗНОСЫ НА ОСС"
// 26: "ПЛАТЕЖ КАЗИНО" прием и выплата денежных средств при осуществлении казино и залами игровых автоматов расчетов с использованием обменных знаков игорного заведения
SignCalculationObject: 1,
// Мера количества предмета расчета. Тег ОФД 2108, Значение из таблицы 114 (ФФД)
// Если не передавать то применяется "0" - (шт. или ед.)
// 0 шт.или ед.; 10 г; 11 кг; 12 т; 20 см; 21 дм; 22 м; 30 кв.см; 31 кв.дм; 32 кв.м; 40 мл; 41 л; 42 куб.м; 50 кВт ч; 51 Гкал; 70 сутки; 71 час; 72 мин; 73 с; 80 Кбайт; 81 Мбайт; 82 Гбайт; 83 Тбайт; 255 Прочее
// Некоторые ККТ при передачи кода маркировки трабуют чтобы MeasureOfQuantity = 0 (шт.или ед.)
MeasureOfQuantity: 0,
// Общее количество товара в упаковке(тег 1294)
// Передавать ТОЛЬКО при продаже товара из упаковки маркировки!!
// Если товар не из упаковки - Не передовать (или передавать null)!
// Как правило передавать не нужно (или передавать null)
// Должно быть больше или равно продаваемому количеству товара
// Имеет смысл только при передачи совместно с кодом маркировки
// При указании PackageQuantity - поле MeasureOfQuantity должно быть строго равно 0 (шт. или ед.) и не равнятся 0!
// При указании PackageQuantity - поле Quantity (количество продаваемого товара) должно быть строго целое число
// Например при продаже 2 сигарет из упаковки в 22 шт. - MeasureOfQuantity = 0, Quantity = 2, PackageQuantity = 22
PackageQuantity: null,
// Цифровой код страны происхождения товара в соответствии с Общероссийским классификатором стран мира 3 симв. Тег 1230
CountryOfOrigin: "156" ,
// Регистрационный номер таможенной декларации 32 симв. Тег 1231
CustomsDeclaration: "54180656/1345865/3435625/23" ,
// Сумма акциза с учетом копеек, включенная в стоимость предмета расчета Тег 1229
ExciseAmount: null, // Иначе сумма акциза
// КИЗ (контрольный идентификационный знак) товарной номенклатуры, Тег ОФД 1162 (честный знак), можно не указывать
//Описание применимых ШК
GoodCodeData: {
// штрих-код маркировки товара со сканера (нужно настроить сканер так чтобы не проглатывал управляющие символы)
// Поддерживаются ШК:
// Без идентификатора экземпляра товара: EAN8, EAN13, ITF14
// С идентификатором экземпляра товара: GS1, ШК шуб, ШК табачной продукции., ЕГАИС-2, ЕГАИС-3
BarCode: "0104300943734342212413195240818240640291ffd092MDEwNDMwMDk0MzczNDM",
// Проверять содержит ли ШК кода маркировки идентификатор экземпляра товара (если вообще не указать - true)
// Для некоторых товаров нужно передавать ШК EAN-13, тогда это поле устанавливайте в 'false'
ContainsSerialNumber: true,
// Все равно регистрировать чек даже если код маркировки не прошел проверку
// Только для работы по ФФД 1.2
AcceptOnBad: true
},
// Признак агента. Тег ОФД 1222. Поле не обязательное. Можно вообще не указывать.
// 0: "Банковский платежный агент:" Оказание услуг пользователем, являющимся банковским платежным агентом
// 1: "Банковский платежный субагент:" Оказание услуг пользователем, являющимся банковским платежным субагентом
// 2: "Платежный агент:" Оказание услуг пользователем, являющимся платежным агентом
// 3: "Платежный субагент:" Оказание услуг пользователем, являющимся платежным субагентом
// 4: "Поверенный:" Оказание услуг пользователем, являющимся поверенным
// 5: "Комиссионер:" Оказание услуг пользователем, являющимся комиссионером
// 6: "Агент:" Оказание услуг пользователем, являющимся агентом и не являющимся банковским платежным агентом (субагентом), платежным агентом (субагентом), поверенным, комиссионером
AgentSign: 2,
// Данные агента. Тег ОД 1223.
// Поле не обязательное. Обязательно если установлено поле "AgentSign"
// Можно вообще не указывать.
AgentData: {
// Операция платежного агента. Тег ОФД 1044
PayingAgentOperation: "95315" ,
// Телефон платежного агента. Тег ОФД 1073
PayingAgentPhone: "+79995554422" ,
// Телефон оператора по приему платежей. Тег ОФД 1074
ReceivePaymentsOperatorPhone: "+72223334455" ,
// Телефон оператора перевода. Тег ОФД 1075
MoneyTransferOperatorPhone: "+74447776655" ,
// Наименование оператора перевода. Тег ОФД 1026
MoneyTransferOperatorName: "ООО Рога и копыта" ,
// Адрес оператора перевода. Тег ОФД 1005
MoneyTransferOperatorAddress: "Москва, зубовский бульвар 44" ,
// ИНН оператора перевода. Тег ОФД 1016
MoneyTransferOperatorVATIN: "430601071197"
},
// Данные поставщика платежного агента. Тег ОФД 1224
// Поле не обязательное. Обязательно если установлено поле "AgentSign"
// Можно вообще не указывать.
PurveyorData: {
// Телефон поставщика. Тег ОД 1171
PurveyorPhone: "+76662229955" ,
// Наименование поставщика. Тег ОФД 1225
PurveyorName: "ООО 'Гаражик в деревне'" ,
// ИНН поставщика. Тег ОФД 1226
PurveyorVATIN: "430601071197"
},
// Дополнительный реквизит предмета расчета тег 1191, Только для ФФД 1.1 !
AdditionalAttribute: "Тест-доп.реквизит" ,
},
BarCode: {
// Тип штрих-кода: "EAN13" , "CODE39" , "CODE128" , "QR" , "PDF417" .
BarcodeType: "EAN13" ,
// Значение штрих-кода
Barcode: "1254789547853" ,
},
},
{ PrintText: { Text: "<<->>" }, },
// Полная строка: И текст и регистрация и бар-код
{
PrintText: {
Text: "Это мега крутой товар. Продается во всех магазинах страны. Покупайте только у нас" ,
Font: 4, // 1-4, 0 - по настройкам ККМ
Intensity: 0, // 1-15, 0 - по настройкам ККМ
},
Register: {
// Наименование товара 64 символа
Name: "Шаровары мужские красные: НИМБУС-2000" ,
// Количество товара (3 знака после запятой)
Quantity: 3,
// Цена за шт. без скидки (2 знака после запятой)
Price: 100,
// Конечная сумма строки с учетом всех скидок /наценок; (2 знака после запятой)
Amount: 0.00,
// Отдел, по которому ведется продажа (2 знака после запятой)
Department: 1,
// НДС в процентах или ТЕГ НДС: 0 (НДС 0%), 10 (НДС 10%), 20 (НДС 20%), -1 (НДС не облагается), 120 (НДС 20 /120), 110 (НДС 10 /110)
Tax: -1,
// Признак способа расчета. тег ОФД 1214. Для ФФД.1.05 и выше обязательное поле
SignMethodCalculation: 1,
// Признак предмета расчета. тег ОФД 1212. Для ФФД.1.05 и выше обязательное поле
SignCalculationObject: 1,
// Единица измерения предмета расчета. Можно не указывать
MeasurementUnit: "шт" ,
// КИЗ (контрольный идентификационный знак) товарной номенклатуры Тег ОФД 1162 (честный знак), можно не указывать
// В данном случае GoodCodeData неприменим т.к. количество <> 0
GoodCodeData: {
// штрих-код маркировки товара со сканера (нужно настроить сканер так чтобы не проглатывал управляющие символы)
// Поддерживаются ШК:
// Без идентификатора экземпляра товара: EAN8, EAN13, ITF14
// С идентификатором экземпляра товара: GS1, ШК шуб, ШК табачной продукции., ЕГАИС-2, ЕГАИС-3
BarCode: "RU-430301-ABCDEF1234",
// Проверять содержит ли ШК кода маркировки идентификатор экземпляра товара (если вообще не указать - true)
// Для некоторых товаров нужно передавать ШК EAN-13, тогда это поле устанавливайте в 'false'
ContainsSerialNumber: true
},
},
BarCode: {
// Тип штрих-кода: "EAN13" , "CODE39" , "CODE128" , "QR" , "PDF417" .
BarcodeType: "QR" ,
// Значение штрих-кода
Barcode: "12345DFG Proba pera, Print barcode 1234567890." ,
//Barcode: "12345DFG Proba pera, Print barcode 1234567890. 12345DFG Proba pera, Print barcode 1234567890, Print barcode 1, Print barcode 2, Print barcod" +
// "12345DFG Proba pera, Print barcode 1234567890." ,
},
},
{
BarCode: {
// Тип штрих-кода: "EAN13" , "CODE39" , "CODE128" , "QR" , "PDF417" .
BarcodeType: "PDF417" ,
// Значение штрих-кода
Barcode: "12345DFG Proba pera, Print barcode 1234567890." ,
},
},
],
// Наличная оплата (2 знака после запятой), Тег 1031
Cash: 800,
// Сумма электронной оплаты (2 знака после запятой), Тег 1081
ElectronicPayment: 0.01,
// Сумма из предоплаты (зачетом аванса) (2 знака после запятой), Тег 1215
AdvancePayment: 0,
// Сумма постоплатой(в кредит) (2 знака после запятой), Тег 1216
Credit: 0,
// Сумма оплаты встречным предоставлением (сертификаты, др. мат.ценности) (2 знака после запятой), Тег 1217
CashProvision: 0,
};
//Если чек без ШК то удаляем строку с ШК
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;
};
};
};
// Скидываем данные об агенте - т.к.у Вас невярнека ККТ не зарегистрирована как Агент.
Data.AgentSign = null;
Data.AgentData = null;
Data.PurveyorData = 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;
};
};
// Вызов команды
ExecuteCommand(Data);
// Возвращается JSON:
//{
// "CheckNumber": 3, // Номер документа
// "SessionNumber": 1, // Номер смены
// "SessionCheckNumber": 1, // Номер чека в смене
// "URL": "https://ofd-ya.ru/getFiscalDoc?kktRegId=0000000000061716&fiscalSign=839499349",
// "QRCode": "t=20190101T195300&s=0.03&fn=9999078900002838&i=3&fp=839499349&n=1",
// "Command": "RegisterCheck",
// "Cash": 0, // Оплачено наличными
// "ElectronicPayment": 3.02, // Оплачено электронноо
// "AdvancePayment": 0, // Оплачено предоплатой (зачетом аванса)
// "Credit": 0, // постоплатой(в кредит)
// "CashProvision": 0, // встречным предоставлением (сертификаты, др. мат.ценности)
// "Error": "", // Текст ошибки если была - обязательно показать пользователю - по содержанию ошибки можно в 90% случаях понять как ее устранять
// "Message": "", // Сообщение пользователю - Если строка не пустая - ее нужно отобразить пользователю
// "Status": 0, // Ok = 0, Run(Запущено на выполнение) = 1, Error = 2, NotFound(устройство не найдено) = 3, NotRun = 4
// "IdCommand": "dd261969-4190-1125-26cd-aaf5c213c0e3",
// "NumDevice": 2
//}
}
Печать чека коррекции на ККМ JavaScript
Чеки коррекции формируются точно так-же как и обычный чек, за исключением:
// Тип чека, Тег 1054;
// 2 – корректировка продажи/прихода; 12 – корректировка покупки/расхода;
// 3 – корректировка возврата продажи/прихода; (>=ФФД 1.1) 13 – корректировка возврата покупки/расхода; (>=ФФД 1.1)
TypeCheck: TypeCheck,
// Дополнительные поля - Только для чеков коррекции:
//Тип коррекции 0 - самостоятельно 1 - по предписанию, Тег 1173, Только для чеков коррекции!
CorrectionType: 1,
// Дата документа основания для коррекции, Тег ОФД 1178, Только для чеков коррекции!
CorrectionBaseDate: '2017-06-21T15:30:45',
// Номер документа основания для коррекции, Тег ОФД 1179, Только для чеков коррекции!
CorrectionBaseNumber: "MOS-4516",
//Наименование основания для коррекции, Тег ОФД 1177, Только для чеков коррекции!
CorrectionBaseName: "Предписание налоговой",
Проверка кодов маркировки на ККМ JavaScript
// Подготовка данных команды
var Data = {
// Команда серверу
Command: "ValidationMarkingCode",
//***********************************************************************************************************
// ПОЛЯ ПОИСКА УСТРОЙСТВА
//***********************************************************************************************************
// Номер устройства. Если 0 то первое не блокированное на сервере
// Не рекомендовано для использования.
// Рекомендуем для поиска ККТ задавать InnKkm и TaxVariant !!!!!!
NumDevice: NumDevice,
// ИНН ККМ для поиска. Если "" то ККМ ищется только по NumDevice,
// Если NumDevice = 0 а InnKkm заполнено то ККМ ищется только по InnKkm
InnKkm: "",
// Система налогообложения (СНО) для поиска ККТ, Можно не указывать, или = "" - любое СНО
TaxVariant: "",
// Заводской номер ККМ для поиска. Если "" то ККМ ищется только по NumDevice,
KktNumber: "",
// **********************************************************************************************************
// Список кодов маркировки
"GoodCodeDatas": [
{
// Наименование товара - справочно, можно не передавать
"Name": "Тестовый товар 1",
// штрих-код маркировки товара со сканера (нужно настроить сканер так чтобы не проглатывал управляющие символы)
// Поддерживаются ШК:
// Без идентификатора экземпляра товара: EAN8, EAN13, ITF14
// С идентификатором экземпляра товара: GS1, ШК шуб, ШК табачной продукции., ЕГАИС-2, ЕГАИС-3
"Barcode": "010460708021818721&dAIMqnpEQnQ!\u001d910058\u001d921gx+7D2jIWGSo6LLr1FMGiETo7Ez6k4ag9D8FZwEmJqIWtivlAGjqEP8OspoVeIKiP4OkzmSCzRXmEUygvkKQw=="
// Количество товара (3 знака после запятой) для конкретного кода маркировки, Тег 1023
// Если количество = 1 - можно не передавать
// Если товар весовой - передавать обязательно!
Quantity: 3,
// Мера количества предмета расчета. Тег ОФД 2108, Значение из таблицы 114 (ФФД)
// Если не передавать то применяется "0" - (шт. или ед.)
// 0 шт.или ед.; 10 г; 11 кг; 12 т; 20 см; 21 дм; 22 м; 30 кв.см; 31 кв.дм; 32 кв.м; 40 мл; 41 л; 42 куб.м; 50 кВт ч; 51 Гкал; 70 сутки; 71 час; 72 мин; 73 с; 80 Кбайт; 81 Мбайт; 82 Гбайт; 83 Тбайт; 255 Прочее
// Некоторые ККТ при передачи кода маркировки трабуют чтобы MeasureOfQuantity = 0 (шт.или ед.)
MeasureOfQuantity: 0,
// Общее количество товара в упаковке(тег 1294)
// Передавать ТОЛЬКО при продаже товара из упаковки маркировки!!
// Если товар не из упаковки - Не передовать (или передавать null)!
// Как правило передавать не нужно (или передавать null)
// Должно быть больше или равно продаваемому количеству товара
// Имеет смысл только при передачи совместно с кодом маркировки
// При указании PackageQuantity - поле MeasureOfQuantity должно быть строго равно 0 (шт. или ед.) и не равнятся 0!
// При указании PackageQuantity - поле Quantity (количество продаваемого товара) должно быть строго целое число
// Например при продаже 2 сигарет из упаковки в 22 шт. - MeasureOfQuantity = 0, Quantity = 2, PackageQuantity = 22
PackageQuantity: null,
},
{
// Наименование товара - справочно, можно не передавать
"Name": "Тестовый товар 2",
// штрих-код маркировки товара со сканера (нужно настроить сканер так чтобы не проглатывал управляющие символы)
// Поддерживаются ШК:
// Без идентификатора экземпляра товара: EAN8, EAN13, ITF14
// С идентификатором экземпляра товара: GS1, ШК шуб, ШК табачной продукции., ЕГАИС-2, ЕГАИС-3
"Barcode": "01046100301415342100000!&\u001d8005106000\u001d93yikZ"
// Мера количества предмета расчета. Тег ОФД 2108, Значение из таблицы 114 (ФФД)
// Если не передавать то применяется "0" - (шт. или ед.)
// 0 шт.или ед.; 10 г; 11 кг; 12 т; 20 см; 21 дм; 22 м; 30 кв.см; 31 кв.дм; 32 кв.м; 40 мл; 41 л; 42 куб.м; 50 кВт ч; 51 Гкал; 70 сутки; 71 час; 72 мин; 73 с; 80 Кбайт; 81 Мбайт; 82 Гбайт; 83 Тбайт; 255 Прочее
// Некоторые ККТ при передачи кода маркировки трабуют чтобы MeasureOfQuantity = 0 (шт.или ед.)
MeasureOfQuantity: 0,
// Общее количество товара в упаковке(тег 1294)
// Передавать ТОЛЬКО при продаже товара из упаковки маркировки!!
// Если товар не из упаковки - Не передовать (или передавать null)!
// Как правило передавать не нужно (или передавать null)
// Должно быть больше или равно продаваемому количеству товара
// Имеет смысл только при передачи совместно с кодом маркировки
// При указании PackageQuantity - поле MeasureOfQuantity должно быть строго равно 0 (шт. или ед.) и не равнятся 0!
// При указании PackageQuantity - поле Quantity (количество продаваемого товара) должно быть строго целое число
// Например при продаже 2 сигарет из упаковки в 22 шт. - MeasureOfQuantity = 0, Quantity = 2, PackageQuantity = 22
PackageQuantity: null,
},
],
// Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды
// По этому идентификатору можно запросить результат выполнения команды
IdCommand: "g34344gs4ws",
};
// Вызов команды
ExecuteCommand(Data);
// Пример JSON ответа:
{
"MarkingCodeValidation": [
{
"Name": "Тестовый товар 1",
"BarCode": "010460708021818721&dAIMqnpEQnQ!\u001d910058\u001d921gx+7D2jIWGSo6LLr1FMGiETo7Ez6k4ag9D8FZwEmJqIWtivlAGjqEP8OspoVeIKiP4OkzmSCzRXmEUygvkKQw==",
// Результат проверки КМ в ФН (тег 2106)
"ValidationResult": 16,
"DecryptionResult": "[М] Проверка КП КМ не выполнена, статус товара ОИСМ не проверен (ККТ функционирует в автономном режиме); ФН не содержит ключ проверки кода проверки этого КМ"
},
{
"Name": "Тестовый товар 2",
"BarCode": "01046100301415342100000!&\u001d8005106000\u001d93yikZ",
// Результат проверки КМ в ФН (тег 2106)
"ValidationResult": 16,
"DecryptionResult": "[М] Проверка КП КМ не выполнена, статус товара ОИСМ не проверен (ККТ функционирует в автономном режиме); КМ данного типа не подлежит проверке в ФН"
}
],
"Command": "ValidationMarkingCode",
"Error": "",
"Warning": "",
"Message": "",
"Status": 0,
"IdCommand": "",
"NumDevice": 7
}
Печать слип-чека (произвольный текст) на ККМ JavaScript
// Пример печати произвольного текста (Слип-чека)
function PrintSlip(NumDevice, IsBarCode) {
// Подготовка данных команды
var Data = {
Command: "RegisterCheck",
NumDevice: NumDevice,
IsFiscalCheck: false,
NotPrint: false,
IdCommand: guid(),
// Строки чека
CheckStrings: [
// Строка с печатью штрих-кода
{
BarCode: {
// Тип штрих-кода: "EAN13", "CODE39", "CODE128","QR", "PDF417".
BarcodeType: "EAN13",
// Значение штрих-кода
Barcode: "1254789547853",
},
},
//При вставке в текст символов ">#10#<" строка при печати выровнеется по центру, где 10 - это на сколько меньше станет строка ККТ
{
PrintText: {
Text: ">#2#<ООО 'Рога и копыта' " ,
Font: 1,
},
},
// При вставке в текст в середину строки символов "<#10#>" Левая часть строки будет выравнена по левому краю, правая по правому, где 10 - это на сколько меньше станет строка ККТ
// При вставке в текст в середину строки символов "<#10#>>" Левая часть строки будет выравнена по правому краю, правая по правому, где 10 - отступ от правого клая
{ PrintText: { Text: "Пример №1 печати поля:<#16#>154,41" }, },
{ PrintText: { Text: "2-рое поле:<#16#>4,00" }, },
{ PrintText: { Text: "Пример №2 печати поля:<#8#>>4,00" }, },
{ PrintText: { Text: "2-рое поле:<#8#>>1544,00" }, },
// Строка с печатью текста определенным шрифтом
{
PrintText: {
Text: "Шрифт № 1",
Font: 1, // 1-4, 0 - по настройкам ККМ
Intensity: 15, // 1-15, 0 - по настройкам ККМ
},
},
{
PrintText: {
Text: "Шрифт № 2",
Font: 2, // 1-4, 0 - по настройкам ККМ
Intensity: 10, // 1-15, 0 - по настройкам ККМ
},
},
{
PrintText: {
Text: "Шрифт № 3",
//Text: "Это мега крутой товар. Продается во всех магазинах страны. Покупайте только у нас",
Font: 3, // 1-4, 0 - по настройкам ККМ
Intensity: 5, // 1-15, 0 - по настройкам ККМ
},
},
{
PrintText: {
Text: "Шрифт № 4",
Font: 4, // 1-4, 0 - по настройкам ККМ
Intensity: 0, // 1-15, 0 - по настройкам ККМ
},
},
{
BarCode: {
// Тип штрих-кода: "EAN13", "CODE39", "CODE128","QR", "PDF417".
BarcodeType: "QR",
// Значение штрих-кода
Barcode: "12345DFG",
},
},
],
};
//Если чек без ШК то удаляем строку с ШК
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;
}
}
}
// Вызов команды
ExecuteCommand(Data);
}
Открыть смену на ККМ JavaScript
function OpenShift(NumDevice) {
// Подготовка данных команды
var Data = {
// Команда серверу
Command: "OpenShift",
// ИНН ККМ для поиска. Если "" то ККМ ищется только по NumDevice,
// Если NumDevice = 0 а InnKkm заполнено то ККМ ищется только по InnKkm
InnKkm: "",
// Система налогообложения (СНО) для поиска ККТ, Можно не указывать, или = "" - любое СНО
TaxVariant: "",
// Номер устройства. Если 0 то первое не блокированное на сервере
// Не рекомендовано для использования.
// Рекомендуем для поиска ККТ задавать InnKkm и TaxVariant !!!!!!
NumDevice: NumDevice,
// Id устройства. Строка. Если = "" то первое не блокированное на сервере
IdDevice: "",
// Продавец, тег ОФД 1021
CashierName: "Kазакова Н.А.",
// ИНН продавца тег ОФД 1203
CashierVATIN: "430601071197",
// Не печатать чек на бумагу
NotPrint: false,
// Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды
// По этому идентификатору можно запросить результат выполнения команды
IdCommand: guid(),
};
// Вызов команды
ExecuteCommand(Data);
// Возвращается JSON:
//{
// "CheckNumber": 1, // Номер документа
// "SessionNumber": 23, // Номер смены
// "QRCode": "t=20170904T141100&fn=9999078900002287&i=108&fp=605445600",
// "Command": "OpenShift",
// "Error": "", // Текст ошибки если была - обязательно показать пользователю - по содержанию ошибки можно в 90% случаях понять как ее устранять
// "Status": 0 // Ok = 0, Run(Запущено на выполнение) = 1, Error = 2, NotFound(устройство не найдено) = 3, NotRun = 4
//}
}
Закрыть смену на ККМ JavaScript
function CloseShift(NumDevice) {
// Подготовка данных команды
var Data = {
// Команда серверу
Command: "CloseShift",
// ИНН ККМ для поиска. Если "" то ККМ ищется только по NumDevice,
// Если NumDevice = 0 а InnKkm заполнено то ККМ ищется только по InnKkm
InnKkm: "",
// Система налогообложения (СНО) для поиска ККТ, Можно не указывать, или = "" - любое СНО
TaxVariant: "",
// Номер устройства. Если 0 то первое не блокированное на сервере
// Не рекомендовано для использования.
// Рекомендуем для поиска ККТ задавать InnKkm и TaxVariant !!!!!!
NumDevice: NumDevice,
// Продавец, тег ОФД 1021
CashierName: "Иванов И.И.",
// ИНН продавца тег ОФД 1203
CashierVATIN: "430601071197",
// Не печатать чек на бумагу
NotPrint: false,
// Id устройства. Строка. Если = "" то первое не блокированное на сервере
IdDevice: "",
// Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды
// По этому идентификатору можно запросить результат выполнения команды
IdCommand: guid(),
};
// Вызов команды
ExecuteCommand(Data);
// Возвращается JSON:
//{
// "CheckNumber": 1, // Номер документа
// "SessionNumber": 23, // Номер смены
// "QRCode": "t=20170904T141100&fn=9999078900002287&i=108&fp=605445600",
// "Command": "CloseShift",
// "Error": "", // Текст ошибки если была - обязательно показать пользователю - по содержанию ошибки можно в 90% случаях понять как ее устранять
// "Status": 0 // Ok = 0, Run(Запущено на выполнение) = 1, Error = 2, NotFound(устройство не найдено) = 3, NotRun = 4
//}
}
Печать Х-отчета на ККМ JavaScript
// Печать X отчета
function XReport(NumDevice) {
// Подготовка данных команды
var Data = {
// Команда серверу "ZReport" ИЛИ "XReport"
Command: "XReport",
// ИНН ККМ для поиска. Если "" то ККМ ищется только по NumDevice,
// Если NumDevice = 0 а InnKkm заполнено то ККМ ищется только по InnKkm
InnKkm: "",
// Система налогообложения (СНО) для поиска ККТ, Можно не указывать, или = "" - любое СНО
TaxVariant: "",
// Номер устройства. Если 0 то первое не блокированное на сервере
// Не рекомендовано для использования.
// Рекомендуем для поиска ККТ задавать InnKkm и TaxVariant !!!!!!
NumDevice: NumDevice,
// Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды
// По этому идентификатору можно запросить результат выполнения команды
// Поле не обязательно
IdCommand: guid()
};
// Вызов команды
ExecuteCommand(Data);
// Возвращается JSON:
//{
// "CheckNumber": 1, // Номер документа
// "SessionNumber": 23, // Номер смены
// "Command": "ZReport",
// "Error": "", // Текст ошибки если была - обязательно показать пользователю - по содержанию ошибки можно в 90% случаях понять как ее устранять
// "Status": 0 // Ok = 0, Run(Запущено на выполнение) = 1, Error = 2, NotFound(устройство не найдено) = 3, NotRun = 4
//}
}
Внесение/Изъятие денежных средств в ККМ JavaScript
// Печать чека внесения/изъятия
function DepositingCash(NumDevice) {
// Подготовка данных команды
var Data = {
// Команда серверу "DepositingCash" или "PaymentCash"
Command: "DepositingCash",
// ИНН ККМ для поиска. Если "" то ККМ ищется только по NumDevice,
// Если NumDevice = 0 а InnKkm заполнено то ККМ ищется только по InnKkm
InnKkm: "",
// Система налогообложения (СНО) для поиска ККТ, Можно не указывать, или = "" - любое СНО
TaxVariant: "",
// Номер устройства. Если 0 то первое не блокированное на сервере
// Не рекомендовано для использования.
// Рекомендуем для поиска ККТ задавать InnKkm и TaxVariant !!!!!!
NumDevice: NumDevice,
// Продавец, тег ОФД 1021
CashierName: "Kазакова Н.А.",
// ИНН продавца тег ОФД 1203
CashierVATIN: "430601071197",
// Сумма внесения наличных
// Сумма внесения наличных
Amount: 0.01,
// Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды
// По этому идентификатору можно запросить результат выполнения команды
// Поле не обязательно
IdCommand: guid()
};
// Вызов команды
ExecuteCommand(Data);
}
Открыть денежный ящик в ККМ JavaScript
// Открыть денежный ящик
function OpenCashDrawer(NumDevice) {
// Подготовка данных команды
var Data = {
// Команда серверу
Command: "OpenCashDrawer",
// ИНН ККМ для поиска. Если "" то ККМ ищется только по NumDevice,
// Если NumDevice = 0 а InnKkm заполнено то ККМ ищется только по InnKkm
InnKkm: "",
// Система налогообложения (СНО) для поиска ККТ, Можно не указывать, или = "" - любое СНО
TaxVariant: "",
// Номер устройства. Если 0 то первое не блокированное на сервере
// Не рекомендовано для использования.
// Рекомендуем для поиска ККТ задавать InnKkm и TaxVariant !!!!!!
NumDevice: NumDevice,
// Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды
// По этому идентификатору можно запросить результат выполнения команды
// Поле не обязательно
IdCommand: guid()
};
// Вызов команды
ExecuteCommand(Data);
}
Получить ширину строки чека в символах
// Получить ширину строки чека в символах
function GetLineLength(NumDevice) {
// Подготовка данных команды
var Data = {
// Команда серверу
Command: "GetLineLength",
// ИНН ККМ для поиска. Если "" то ККМ ищется только по NumDevice,
// Если NumDevice = 0 а InnKkm заполнено то ККМ ищется только по InnKkm
InnKkm: "",
// Система налогообложения (СНО) для поиска ККТ, Можно не указывать, или = "" - любое СНО
TaxVariant: "",
// Номер устройства. Если 0 то первое не блокированное на сервере
// Не рекомендовано для использования.
// Рекомендуем для поиска ККТ задавать InnKkm и TaxVariant !!!!!!
NumDevice: NumDevice,
// Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды
// По этому идентификатору можно запросить результат выполнения команды
// Поле не обязательно
IdCommand: guid()
};
// Вызов команды
ExecuteCommand(Data);
}
Получить данные чека из ФН по номеру чека
// Получить данные чека из ФН по номеру чека.
function GetDataCheck(NumDevice, FiscalNumber = 0, NumberCopies = 0) {
// Подготовка данных команды
var Data = {
// Команда серверу
Command: "GetDataCheck",
// ИНН ККМ для поиска. Если "" то ККМ ищется только по NumDevice,
// Если NumDevice = 0 а InnKkm заполнено то ККМ ищется только по InnKkm
InnKkm: "",
// Система налогообложения (СНО) для поиска ККТ, Можно не указывать, или = "" - любое СНО
TaxVariant: "",
// Номер устройства. Если 0 то первое не блокированное на сервере
// Не рекомендовано для использования.
// Рекомендуем для поиска ККТ задавать InnKkm и TaxVariant !!!!!!
NumDevice: NumDevice,
// Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды
// По этому идентификатору можно запросить результат выполнения команды
// Поле не обязательно
IdCommand: guid(),
// Фискальный номер (ФД) чека. Если 0 - то последний чек
FiscalNumber: FiscalNumber,
// Количество копий документа (копии печатаются на ленте)
NumberCopies: NumberCopies
};
// Вызов команды
ExecuteCommand(Data);
}
Получить текущее состояние ККТ
// Получить текущее состояние ККТ.
function GetDataKKT(NumDevice) {
// Подготовка данных команды
var Data = {
// Команда серверу
Command: "GetDataKKT",
// ИНН ККМ для поиска. Если "" то ККМ ищется только по NumDevice,
// Если NumDevice = 0 а InnKkm заполнено то ККМ ищется только по InnKkm
InnKkm: "",
// Система налогообложения (СНО) для поиска ККТ, Можно не указывать, или = "" - любое СНО
TaxVariant: "",
// Номер устройства. Если 0 то первое не блокированное на сервере
NumDevice: NumDevice,
// Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды
// По этому идентификатору можно запросить результат выполнения команды
// Поле не обязательно
IdCommand: guid()
};
// Вызов команды
ExecuteCommand(Data);
// Возвращается JSON:
//{
// "CheckNumber": 8, // Номер последнего документа
// "SessionNumber": 24, // Номер текущей смены
// "LineLength": 48, // Ширина строки
// "URL": "",
// "Info": {
// "UrlServerOfd": "connect.ofd-ya.ru",
// "PortServerOfd": "7790",
// "NameOFD": "ООО \"Ярус\" (\"ОФД-Я\")",
// "UrlOfd": "",
// "InnOfd": "504404744207",
// "NameOrganization": "ООО \"Рога и Копыта\"",
// "TaxVariant": "0,3,5", // Описание смотри в команде KkmRegOfd
// "AddressSettle": "109097, Москва, ул. Ильинка, 9", // Адрес установки
// "EncryptionMode": false,
// "OfflineMode": true,
// "AutomaticMode": false,
// "InternetMode": false,
// "BSOMode": false,
// "ServiceMode": true,
// "InnOrganization": "504404744207",
// "KktNumber": "0149060006000651", // Заводской номер
// "FnNumber": "99078900002287", // Номер ФН
// "RegNumber": "0149060006035849", // Регистрационный номер ККТ (из налоговой)
// "Command": "",
// "FN_IsFiscal": true,
// "OFD_Error": "",
// "OFD_NumErrorDoc": 32,
// "OFD_DateErrorDoc": "2017-01-13T14:56:00",
// "FN_DateEnd": "2018-02-01T00:00:00",
// "SessionState": 2 // Статус сессии 1-Закрыта, 2-Открыта, 3-Открыта, но закончилась (3 статус на старых ККМ может быть не опознан)
// },
// "Command": "GetDataKKT",
// "Error": "", // Текст ошибки если была - обязательно показать пользователю - по содержанию ошибки можно в 90% случаях понять как ее устранять
// "Status": 0 // Ok = 0, Run(Запущено на выполнение) = 1, Error = 2, NotFound(устройство не найдено) = 3, NotRun = 4
//}
}
Получить счетчики ФН
// Получить счетчики ФН
function GetCounters(NumDevice) {
// Подготовка данных команды
var Data = {
// Команда серверу
Command: "GetCounters",
// ИНН ККМ для поиска. Если "" то ККМ ищется только по NumDevice,
// Если NumDevice = 0 а InnKkm заполнено то ККМ ищется только по InnKkm
InnKkm: "",
// Система налогообложения (СНО) для поиска ККТ, Можно не указывать, или = "" - любое СНО
TaxVariant: "",
// Номер устройства. Если 0 то первое не блокированное на сервере
NumDevice: NumDevice,
// Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды
// По этому идентификатору можно запросить результат выполнения команды
// Поле не обязательно
IdCommand: guid()
};
// Вызов команды
ExecuteCommand(Data);
// Возвращается JSON:
//{
// "Сounters": [
// {
// "СountersType": "Total",
// "ReceiptType": "Shell",
// "Count": 1,
// "Sum": 3.02,
// "Cash": 0.0,
// "ElectronicPayment": 3.02,
// "AdvancePayment": 0.0,
// "Credit": 0.0,
// "CashProvision": 0.0,
// "Tax20": 0.5,
// "Tax10": 0.0,
// "Tax0": 0.0,
// "TaxNo": 0.02,
// "Tax120": 0.0,
// "Tax110": 0.0,
// "CorrectionsCount": 1,
// "CorrectionsSum": 3.02
// }, {
// "СountersType": "Total",
// "ReceiptType": "ShellReturn",
// "Count": 1,
// "Sum": 3.02,
// "Cash": 0.0,
// "ElectronicPayment": 3.02,
// "AdvancePayment": 0.0,
// "Credit": 0.0,
// "CashProvision": 0.0,
// "Tax20": 0.5,
// "Tax10": 0.0,
// "Tax0": 0.0,
// "TaxNo": 0.02,
// "Tax120": 0.0,
// "Tax110": 0.0,
// "CorrectionsCount": 0,
// "CorrectionsSum": 0.0
// }, {
// "СountersType": "Total",
// "ReceiptType": "Buy",
// "Count": 0,
// "Sum": 0.0,
// "Cash": 0.0,
// "ElectronicPayment": 0.0,
// "AdvancePayment": 0.0,
// "Credit": 0.0,
// "CashProvision": 0.0,
// "Tax20": 0.0,
// "Tax10": 0.0,
// "Tax0": 0.0,
// "TaxNo": 0.0,
// "Tax120": 0.0,
// "Tax110": 0.0,
// "CorrectionsCount": 0,
// "CorrectionsSum": 0.0
// }, {
// "СountersType": "Total",
// "ReceiptType": "BuyReturn",
// "Count": 0,
// "Sum": 0.0,
// "Cash": 0.0,
// "ElectronicPayment": 0.0,
// "AdvancePayment": 0.0,
// "Credit": 0.0,
// "CashProvision": 0.0,
// "Tax20": 0.0,
// "Tax10": 0.0,
// "Tax0": 0.0,
// "TaxNo": 0.0,
// "Tax120": 0.0,
// "Tax110": 0.0,
// "CorrectionsCount": 0,
// "CorrectionsSum": 0.0
// }, {
// "СountersType": "Shift",
// "ReceiptType": "Shell",
// "Count": 1,
// "Sum": 3.02,
// "Cash": 0.0,
// "ElectronicPayment": 3.02,
// "AdvancePayment": 0.0,
// "Credit": 0.0,
// "CashProvision": 0.0,
// "Tax20": 0.5,
// "Tax10": 0.0,
// "Tax0": 0.0,
// "TaxNo": 0.02,
// "Tax120": 0.0,
// "Tax110": 0.0,
// "CorrectionsCount": 1,
// "CorrectionsSum": 3.02
// }, {
// "СountersType": "Shift",
// "ReceiptType": "ShellReturn",
// "Count": 1,
// "Sum": 3.02,
// "Cash": 0.0,
// "ElectronicPayment": 3.02,
// "AdvancePayment": 0.0,
// "Credit": 0.0,
// "CashProvision": 0.0,
// "Tax20": 0.5,
// "Tax10": 0.0,
// "Tax0": 0.0,
// "TaxNo": 0.02,
// "Tax120": 0.0,
// "Tax110": 0.0,
// "CorrectionsCount": 0,
// "CorrectionsSum": 0.0
// }, {
// "СountersType": "Shift",
// "ReceiptType": "Buy",
// "Count": 0,
// "Sum": 0.0,
// "Cash": 0.0,
// "ElectronicPayment": 0.0,
// "AdvancePayment": 0.0,
// "Credit": 0.0,
// "CashProvision": 0.0,
// "Tax20": 0.0,
// "Tax10": 0.0,
// "Tax0": 0.0,
// "TaxNo": 0.0,
// "Tax120": 0.0,
// "Tax110": 0.0,
// "CorrectionsCount": 0,
// "CorrectionsSum": 0.0
// }, {
// "СountersType": "Shift",
// "ReceiptType": "BuyReturn",
// "Count": 0,
// "Sum": 0.0,
// "Cash": 0.0,
// "ElectronicPayment": 0.0,
// "AdvancePayment": 0.0,
// "Credit": 0.0,
// "CashProvision": 0.0,
// "Tax20": 0.0,
// "Tax10": 0.0,
// "Tax0": 0.0,
// "TaxNo": 0.0,
// "Tax120": 0.0,
// "Tax110": 0.0,
// "CorrectionsCount": 0,
// "CorrectionsSum": 0.0
// }],
// "Command": "GetCounters",
// "Error": "",
// "Warning": "",
// "Message": "",
// "Status": 0,
// "IdCommand": "f4836510-983c-85c5-1e72-11113ec4b997",
// "NumDevice": 5
//}
}
Проверка ШК кода маркировки товара
Команда предназначена для проверки корректности сканировани ШК кода маркировки товар
(он-же КИЗ он-же честный знак)
Сканер нужно настроить так чтобы он при сканировании не проглатывал управляющие символы
Поддерживаются ШК:
Без идентификатора экземпляра товара: EAN8, EAN13, EAN14
С идентификатором экземпляра товара: GS1, ШК шуб, ШК табачной продукции., ЕГАИС-2, ЕГАИС-3
Примеры ШК коды которые поддерживаются:
EAN-8:
"46120441"
EAN-13:
"2900001462105"
ITF14:
"02900001462105"
GS1, в качестве разделителей полей символы '(' и ')'
"(01)12345678901231(253)1234567890123(8003)1234567890123456(10)12345678901234567890(21)12345678"
GS1 (обувь), в качестве разделителей полей символ '\x1d' (в виде байта)
"0104300943734342212413195240818240640291ffd092MDEwNDMwMDk0MzczNDM"
GS1, в качестве разделителей полей строка "\u001d"
"010460043993125621JgXJ5.T\u001d8005112000\u001d930001\u001d923zbrLA ==\u001d24014276281"
GS1, в качестве разделителей полей строка "\\u001d" (с символом экранизации \)
"010460043993125621JgXJ5.T\\u001d8005112000\\u001d930001\\u001d923zbrLA ==\\u001d24014276281"
GS1, в качестве разделителей полей строка "\x1d"
"010460406000600021N4N57RSCBUZTQ\x1d2403004002910161218\x1d1724010191ffd0\x1d92tIAF/YVoU4roQS3M/m4"
GS1, в качестве разделителей полей строка "\x1d" (с символом экранизации \)
"010460406000600021N4N57RSCBUZTQ\\x1d2403004002910161218\\x1d1724010191ffd0\\x1d92tIAF/YVoU4roQS3M/m4"
GS1, в качестве разделителей полей строка "\x001d"
"010460406000600021N4N57RSCBUZTQ\x001d2403004002910161218\x001d1724010191ffd0\x001d92tIAF/YVoU4roQS3M/m4"
GS1, в качестве разделителей полей строка "\x001d" (с символом экранизации \)
"010460406000600021N4N57RSCBUZTQ\\x001d2403004002910161218\\x001d1724010191ffd0\\x001d92tIAF/YVoU4roQS3M/m4"
GS1 (лекарство), в качестве разделителей полей строка "<FNC1>"
"<FNC1>0108691234567890211323424679<FNC1>1707011910AX785910BC"
GS1, в качестве разделителей полей строка "<GS> " (с пробелом!!!!!!!)
"0183525492885520210000000859314<GS> 91ee05<GS> 92r7fLjLdSQBRRL8KgReiJ0mgdFWhlR9gsfe1QS3ibhck="
GS, 1 в качестве разделителей полей строка "<GS> "
"0183525492885520210000000859314<GS>91ee05<GS>92r7fLjLdSQBRRL8KgReiJ0mgdFWhlR9gsfe1QS3ibhck="
GS1, в качестве разделителей полей символ '\x1d' (поле 21 фиксированной длины (13) - без символа разделителя в конце - есть и такое!!)
"010460620309891021MCEb6/r890123800511700093EBBm240FA068592.14"
Шубы (20 знаков)
"RU-430301-ABCDEF1234"
Табак (29 знаков)
"00000046186195Xp4k=xyAQDPtFEa"
Табак (25 знаков)
"00000046186195Xp4k=xyAQDP"
ЕГАИС 2.0 (68 знаков)
"22N00002NU5DBKYDOT17ID980726019019608CW1A4XR5EJ7JKFX50FHHGV92ZR2GZRZ"
ЕГАИС 3.0 (150 знаков)
"136222000058810918QWERDFEWT5123456YGHFDSWERT56YUIJHGFDSAERTYUIOKJ8HGFVCXZSDLKJHGFDSAOIPLMNBGHJYTRDFGHJKIREWSDFGHJIOIUTDWQASDFRETYUIUYGTREDFGHUYTREWQWE"
function GetLineLength(NumDevice) {
// Подготовка данных команды
var Data = {
// Команда серверу
Command: "GetGoodCodeData",
//штрих-код маркировки товара со сканера (нужно настроить сканер так чтобы не проглатывал управляющие символы)
BarCode: BarCode
// Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды
// По этому идентификатору можно запросить результат выполнения команды
// Поле не обязательно
IdCommand: guid()
};
// Вызов команды
ExecuteCommand(Data);
// Возвращается JSON:
//{
// "DataProductCode": {
// // Исходный ШК
// "BarCode": "01086912345678902113234246791707011910AX785910BC",
// // ШК прошел проверку
// "isParsed": true,
// "RepresentationBarCode": "(01)08691234567890(21)1323424679(17)070119(10)AX785910BC",
// "EAN": "8691234567890",
// "GTIN": "08691234567890",
// "SerialNumber": "1323424679",
// // ШК идентифицирует экземпляр товара
// "ContainsSerialNumber": true,
// "MarkingCodeBase64": "RE0H55Xy9tIxMzIzNDI0Njc5",
// // Состав полей ШК
// "DataBarCode": {
// "10": "AX785910BC",
// "17": "070119",
// "21": "1323424679",
// "01": "08691234567890"
// },
// // Тип ШК: 'NotParse', 'EAN8', 'EAN13', 'ITF14', 'GS1', 'Fur', 'EGAIS2', 'EGAIS3'
// "ProductCodeType": "GS1",
// "Errors": ""
// },
// "Command": "GetGoodCodeData",
// "Error": "",
// "Warning": "",
// "Message": "",
// "Status": 0,
// "IdCommand": ""
//}
}
Регистрация ККТ
// Регистрация и фискализация ККМ
function KkmRegOfd(NumDevice) {
// АХТУНГ!!!!
// Внимание - некоторые команды регистрации необратимы!!!!!
// Важно понимать что делаете!!!!!
// Подготовка данных команды
var Data = {
// Команда серверу
Command: "KkmRegOfd",
// Номер устройства. Если 0 то первое не блокированное на сервере
NumDevice: NumDevice,
// Не печатать отчет
NotPrint: false,
// Сотрудник регистрирующий ККТ , тег ОФД 1021
CashierName: "Иванов И.И.",
// ИНН продавца тег ОФД 1203
CashierVATIN: "430601071197",
// Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды
// По этому идентификатору можно запросить результат выполнения команды
// Поле не обязательно
IdCommand: guid(),
// Данные регистрации
RegKkmOfd: {
// Команда регистрации
// "Open" - первичная регистрация ККМ
// "ChangeFN" - Замена ФН
// "ChangeOFD" - Смена ОФД
// "ChangeOrganization" - Смена реквизитов организации
// "ChangeKkm" - смена реквизитов ККМ
// "Close" - закрытие архива ФН
Command: "Open",
// Версия ФФД
// 1 - ФФД ver 1.0
// 2 - ФФД ver 1.05
SetFfdVersion: 1,
// URL или IP сервера ОФД (При командах "Open" и "ChangeOFD")
UrlServerOfd: "ofd.com",
// IP-порт сервера ОФД (При командах "Open" и "ChangeOFD")
PortServerOfd: "9999",
// Наименование ОФД (При командах "Open" и "ChangeOFD")
NameOFD: "Лучший ОФД",
// префикс URL ОФД для поиска чека (При командах "Open" и "ChangeOFD")
UrlOfd: "ofd.com/reg",
// ИНН ОФД (При командах "Open" и "ChangeOFD")
InnOfd: "1234567890",
// Наименование организации (При командах "Open" и "ChangeOrganization")
NameOrganization: "ООО Рога и Копыта",
// ИНН организации (При командах "Open")
InnOrganization: "1234567890",
// Регистрационный номер ККМ (При командах "Open")
RegNumber: "0000521455048286",
// Адрес установки ККМ (При командах "Open" и "ChangeOrganization")
AddressSettle: "Сарайчик в деревне у бабушки",
// Место установки (Для ФФД 1.05 и выше)
PlaceSettle: "Подвал контрабандный",
// Email магазина (Для ФФД 1.05 и выше)
SenderEmail: "odessa@mama.ru",
// Система налогообложения, может быть установлено сразу несколько СНО
// (При командах "Open" и "ChangeOrganization")
// 0: Общая ОСН
// 1: Упрощенная УСН (Доход)
// 2: Упрощенная УСН (Доход минус Расход)
// 3: Единый налог на вмененный доход ЕНВД
// 4: Единый сельскохозяйственный налог ЕСН
// 5: Патентная система налогообложения
// При нескольких СНО их нужно указать через запятую, например: "0,3,5"
TaxVariant: "0,3,5",
// Шифрование (При командах "Open" и "ChangeKkm")
EncryptionMode: false,
// Автономный режим (При командах "Open" и "ChangeKkm")
OfflineMode: false,
// Автоматический режим (При командах "Open")
AutomaticMode: false,
// Расчеты в Интернете (При командах "Open")
InternetMode: false,
// Бланки строгой отчетности (При командах "Open")
BSOMode: false,
// Применение в сфере услуг (При командах "Open")
ServiceMode: false,
// Признак установки принтера в автомате (Для ФФД 1.05 и выше)
PrinterAutomatic: false,
// Номер автомата
AutomaticNumber: "",
// Продажа подакцизного товара (Для ФФД 1.1 и выше)
SaleExcisableGoods: false,
// признак проведения азартных игр (Для ФФД 1.1 и выше)
SignOfGambling: false,
// признак проведения лотереи (Для ФФД 1.1 и выше)
SignOfLottery: false,
// Коды признаков агента через разделитель ",". (Для ФФД 1.1 и выше)
SignOfAgent: "",
},
};
// Вызов команды
ExecuteCommand(Data);
}
Эквайринговые терминалы
// Оплатить платежной картой
function PayByPaymentCard(NumDevice) {
// Подготовка данных команды
var Data = {
// Команда серверу
Command: "PayByPaymentCard",
// ИНН для поиска. Если "" то ищется только по NumDevice,
// Если NumDevice = 0 а InnKkm заполнено то ККМ ищется только по InnKkm
InnKkm: "",
// Номер устройства. Если 0 то первое не блокированное на сервере
// Не рекомендовано для использования. рекомендуем задаваь InnKkm
NumDevice: NumDevice,
// Сумма оплаты
Amount: 0.01,
// Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды
// По этому идентификатору можно запросить результат выполнения команды
// Поле не обязательно
IdCommand: guid()
};
// Вызов команды
ExecuteCommand(Data);
// Возвращается JSON:
//{
// "UniversalID": "CN:1254********6845;RN:26;RRN:5486265211;AC:783451264186418", // СОХРАНИТЕ ЭТО ПОЛЕ! Понадобится для отмены или возврата по транзакции
// "Amount": 1.02,
// "Slip": "====================================\r\nОрганизация:ООО Тестовая организация\r\nИНН: 123456789012\r\nТерминал: 21094544\r\nМерчант: 781000055557\r\n------------------------------------\r\n ОПЛАТА \r\nКарта: Visa Credit\r\nНомер: 1254********6845\r\nСумма (руб): 1,02\r\n------------------------------------\r\nСтатус: Одобрено\r\nКод авторизации: 783451264186418\r\nНомер ссылки: 5486265211\r\nНомер чека: 26\r\n====================================\r\n",
// "Command": "PayByPaymentCard",
// "Error": "", // Текст ошибки если была - обязательно показать пользователю - по содержанию ошибки можно в 90% случаях понять как ее устранять
// "Status": 0 // Ok = 0, Run(Запущено на выполнение) = 1, Error = 2, NotFound(устройство не найдено) = 3, NotRun = 4
// "IdCommand": "9836aa83-6899-aba1-4e3d-7352ea1cf64f",
// "NumDevice": 14
//}
}
// Вернуть платеж по платежной карте
function ReturnPaymentByPaymentCard(NumDevice) {
// Подготовка данных команды
var Data = {
// Команда серверу
Command: "ReturnPaymentByPaymentCard",
// ИНН для поиска. Если "" то ищется только по NumDevice,
// Если NumDevice = 0 а InnKkm заполнено то ККМ ищется только по InnKkm
InnKkm: "",
// Номер устройства. Если 0 то первое не блокированное на сервере
// Не рекомендовано для использования. рекомендуем задаваь InnKkm
NumDevice: NumDevice,
// Сумма оплаты
Amount: 0.01,
// Полный банковский идентификатор транзакции, полученный в PayByPaymentCard
UniversalID: UniversalID,
// Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды
// По этому идентификатору можно запросить результат выполнения команды
// Поле не обязательно
IdCommand: guid()
};
// Вызов команды
ExecuteCommand(Data);
// Возвращается JSON:
//{
// "UniversalID": "CN:1254********6845;RN:26;RRN:5486265211;AC:783451264186418",
// "Amount": 1.02,
// "Slip": "====================================\r\nОрганизация:ООО Тестовая организация\r\nИНН: 123456789012\r\nТерминал: 21094544\r\nМерчант: 781000055557\r\n------------------------------------\r\n ОПЛАТА \r\nКарта: Visa Credit\r\nНомер: 1254********6845\r\nСумма (руб): 1,02\r\n------------------------------------\r\nСтатус: Одобрено\r\nКод авторизации: 783451264186418\r\nНомер ссылки: 5486265211\r\nНомер чека: 26\r\n====================================\r\n",
// "Command": "PayByPaymentCard",
// "Error": "", // Текст ошибки если была - обязательно показать пользователю - по содержанию ошибки можно в 90% случаях понять как ее устранять
// "Status": 0 // Ok = 0, Run(Запущено на выполнение) = 1, Error = 2, NotFound(устройство не найдено) = 3, NotRun = 4
// "IdCommand": "9836aa83-6899-aba1-4e3d-7352ea1cf64f",
// "NumDevice": 14
//}
}
// Отменить платеж по платежной карте
function CancelPaymentByPaymentCard(NumDevice) {
// Подготовка данных команды
var Data = {
// Команда серверу
Command: "CancelPaymentByPaymentCard",
// ИНН для поиска. Если "" то ищется только по NumDevice,
// Если NumDevice = 0 а InnKkm заполнено то ККМ ищется только по InnKkm
InnKkm: "",
// Номер устройства. Если 0 то первое не блокированное на сервере
// Не рекомендовано для использования. рекомендуем задаваь InnKkm
NumDevice: NumDevice,
// Сумма оплаты
Amount: 0.01,
// Полный банковский идентификатор транзакции, полученный в PayByPaymentCard
UniversalID: UniversalID,
// Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды
// По этому идентификатору можно запросить результат выполнения команды
// Поле не обязательно
IdCommand: guid()
};
// Вызов команды
ExecuteCommand(Data);
// Возвращается JSON:
//{
// "UniversalID": "CN:1254********6845;RN:26;RRN:5486265211;AC:783451264186418",
// "Amount": 1.02,
// "Slip": "====================================\r\nОрганизация:ООО Тестовая организация\r\nИНН: 123456789012\r\nТерминал: 21094544\r\nМерчант: 781000055557\r\n------------------------------------\r\n ОПЛАТА \r\nКарта: Visa Credit\r\nНомер: 1254********6845\r\nСумма (руб): 1,02\r\n------------------------------------\r\nСтатус: Одобрено\r\nКод авторизации: 783451264186418\r\nНомер ссылки: 5486265211\r\nНомер чека: 26\r\n====================================\r\n",
// "Command": "PayByPaymentCard",
// "Error": "", // Текст ошибки если была - обязательно показать пользователю - по содержанию ошибки можно в 90% случаях понять как ее устранять
// "Status": 0 // Ok = 0, Run(Запущено на выполнение) = 1, Error = 2, NotFound(устройство не найдено) = 3, NotRun = 4
// "IdCommand": "9836aa83-6899-aba1-4e3d-7352ea1cf64f",
// "NumDevice": 14
//}
}
// Блокировка суммы на счете карты
function AuthorisationByPaymentCard(NumDevice) {
// Подготовка данных команды
var Data = {
// Команда серверу
Command: "AuthorisationByPaymentCard",
// ИНН для поиска. Если "" то ищется только по NumDevice,
// Если NumDevice = 0 а InnKkm заполнено то ККМ ищется только по InnKkm
InnKkm: "",
// Номер устройства. Если 0 то первое не блокированное на сервере
// Не рекомендовано для использования. рекомендуем задаваь InnKkm
NumDevice: NumDevice,
// Сумма оплаты
Amount: 0.01,
// Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды
// По этому идентификатору можно запросить результат выполнения команды
// Поле не обязательно
IdCommand: guid()
};
// Вызов команды
ExecuteCommand(Data);
// Возвращается JSON:
//{
// "UniversalID": "CN:1254********6845;RN:26;RRN:5486265211;AC:783451264186418", // СОХРАНИТЕ ЭТО ПОЛЕ! Понадобится для отмены или возврата по транзакции
// "Amount": 1.02,
// "Slip": "====================================\r\nОрганизация:ООО Тестовая организация\r\nИНН: 123456789012\r\nТерминал: 21094544\r\nМерчант: 781000055557\r\n------------------------------------\r\n ОПЛАТА \r\nКарта: Visa Credit\r\nНомер: 1254********6845\r\nСумма (руб): 1,02\r\n------------------------------------\r\nСтатус: Одобрено\r\nКод авторизации: 783451264186418\r\nНомер ссылки: 5486265211\r\nНомер чека: 26\r\n====================================\r\n",
// "Command": "PayByPaymentCard",
// "Error": "", // Текст ошибки если была - обязательно показать пользователю - по содержанию ошибки можно в 90% случаях понять как ее устранять
// "Status": 0 // Ok = 0, Run(Запущено на выполнение) = 1, Error = 2, NotFound(устройство не найдено) = 3, NotRun = 4
// "IdCommand": "9836aa83-6899-aba1-4e3d-7352ea1cf64f",
// "NumDevice": 14
//}
}
// Списать блокированную сумму со счета карты
function AuthConfirmationByPaymentCard(NumDevice) {
// Подготовка данных команды
var Data = {
// Команда серверу
Command: "AuthConfirmationByPaymentCard",
// ИНН для поиска. Если "" то ищется только по NumDevice,
// Если NumDevice = 0 а InnKkm заполнено то ККМ ищется только по InnKkm
InnKkm: "",
// Номер устройства. Если 0 то первое не блокированное на сервере
// Не рекомендовано для использования. рекомендуем задаваь InnKkm
NumDevice: NumDevice,
// Сумма оплаты
Amount: 0.01,
// Полный банковский идентификатор транзакции, полученный в AuthorisationByPaymentCard
UniversalID: UniversalID,
// Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды
// По этому идентификатору можно запросить результат выполнения команды
// Поле не обязательно
IdCommand: guid()
};
// Вызов команды
ExecuteCommand(Data);
// Возвращается JSON:
//{
// "UniversalID": "CN:1254********6845;RN:26;RRN:5486265211;AC:783451264186418",
// "Amount": 1.02,
// "Slip": "====================================\r\nОрганизация:ООО Тестовая организация\r\nИНН: 123456789012\r\nТерминал: 21094544\r\nМерчант: 781000055557\r\n------------------------------------\r\n ОПЛАТА \r\nКарта: Visa Credit\r\nНомер: 1254********6845\r\nСумма (руб): 1,02\r\n------------------------------------\r\nСтатус: Одобрено\r\nКод авторизации: 783451264186418\r\nНомер ссылки: 5486265211\r\nНомер чека: 26\r\n====================================\r\n",
// "Command": "PayByPaymentCard",
// "Error": "", // Текст ошибки если была - обязательно показать пользователю - по содержанию ошибки можно в 90% случаях понять как ее устранять
// "Status": 0 // Ok = 0, Run(Запущено на выполнение) = 1, Error = 2, NotFound(устройство не найдено) = 3, NotRun = 4
// "IdCommand": "9836aa83-6899-aba1-4e3d-7352ea1cf64f",
// "NumDevice": 14
//}
}
// Разблокировать сумму на счете карты
function CancelAuthorisationByPaymentCard(NumDevice) {
// Подготовка данных команды
var Data = {
// Команда серверу
Command: "CancelAuthorisationByPaymentCard",
// ИНН для поиска. Если "" то ищется только по NumDevice,
// Если NumDevice = 0 а InnKkm заполнено то ККМ ищется только по InnKkm
InnKkm: "",
// Номер устройства. Если 0 то первое не блокированное на сервере
// Не рекомендовано для использования. рекомендуем задаваь InnKkm
NumDevice: NumDevice,
// Сумма оплаты
Amount: 0.01,
// Полный банковский идентификатор транзакции, полученный в AuthorisationByPaymentCard
UniversalID: UniversalID,
// Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды
// По этому идентификатору можно запросить результат выполнения команды
// Поле не обязательно
IdCommand: guid()
};
// Вызов команды
ExecuteCommand(Data);
// Возвращается JSON:
//{
// "UniversalID": "CN:1254********6845;RN:26;RRN:5486265211;AC:783451264186418",
// "Amount": 1.02,
// "Slip": "====================================\r\nОрганизация:ООО Тестовая организация\r\nИНН: 123456789012\r\nТерминал: 21094544\r\nМерчант: 781000055557\r\n------------------------------------\r\n ОПЛАТА \r\nКарта: Visa Credit\r\nНомер: 1254********6845\r\nСумма (руб): 1,02\r\n------------------------------------\r\nСтатус: Одобрено\r\nКод авторизации: 783451264186418\r\nНомер ссылки: 5486265211\r\nНомер чека: 26\r\n====================================\r\n",
// "Command": "PayByPaymentCard",
// "Error": "", // Текст ошибки если была - обязательно показать пользователю - по содержанию ошибки можно в 90% случаях понять как ее устранять
// "Status": 0 // Ok = 0, Run(Запущено на выполнение) = 1, Error = 2, NotFound(устройство не найдено) = 3, NotRun = 4
// "IdCommand": "9836aa83-6899-aba1-4e3d-7352ea1cf64f",
// "NumDevice": 14
//}
}
// Аварийная отмена операции (Метод отменяет последнюю транзакцию)
function EmergencyReversal(NumDevice) {
// Подготовка данных команды
var Data = {
// Команда серверу
Command: "EmergencyReversal",
// ИНН для поиска. Если "" то ищется только по NumDevice,
// Если NumDevice = 0 а InnKkm заполнено то ККМ ищется только по InnKkm
InnKkm: "",
// Номер устройства. Если 0 то первое не блокированное на сервере
// Не рекомендовано для использования. рекомендуем задаваь InnKkm
NumDevice: NumDevice,
// Полный банковский идентификатор транзакции, полученный в PayByPaymentCard
UniversalID: UniversalID,
// Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды
// По этому идентификатору можно запросить результат выполнения команды
// Поле не обязательно
IdCommand: guid()
};
// Вызов команды
ExecuteCommand(Data);
// Возвращается JSON:
//{
// "UniversalID": "CN:1254********6845;RN:26;RRN:5486265211;AC:783451264186418",
// "Amount": 1.02,
// "Slip": "====================================\r\nОрганизация:ООО Тестовая организация\r\nИНН: 123456789012\r\nТерминал: 21094544\r\nМерчант: 781000055557\r\n------------------------------------\r\n ОПЛАТА \r\nКарта: Visa Credit\r\nНомер: 1254********6845\r\nСумма (руб): 1,02\r\n------------------------------------\r\nСтатус: Одобрено\r\nКод авторизации: 783451264186418\r\nНомер ссылки: 5486265211\r\nНомер чека: 26\r\n====================================\r\n",
// "Command": "PayByPaymentCard",
// "Error": "", // Текст ошибки если была - обязательно показать пользователю - по содержанию ошибки можно в 90% случаях понять как ее устранять
// "Status": 0 // Ok = 0, Run(Запущено на выполнение) = 1, Error = 2, NotFound(устройство не найдено) = 3, NotRun = 4
// "IdCommand": "9836aa83-6899-aba1-4e3d-7352ea1cf64f",
// "NumDevice": 14
//}
}
// Закрыть смену по картам
function Settlement(NumDevice) {
// Подготовка данных команды
var Data = {
// Команда серверу
Command: "Settlement",
// ИНН для поиска. Если "" то ищется только по NumDevice,
// Если NumDevice = 0 а InnKkm заполнено то ККМ ищется только по InnKkm
InnKkm: "",
// Номер устройства. Если 0 то первое не блокированное на сервере
// Не рекомендовано для использования. рекомендуем задаваь InnKkm
NumDevice: NumDevice,
// Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды
// По этому идентификатору можно запросить результат выполнения команды
// Поле не обязательно
IdCommand: guid()
};
// Вызов команды
ExecuteCommand(Data);
}
// Получить итоги дня по картам
function TerminalReport(NumDevice) {
// Подготовка данных команды
var Data = {
// Команда серверу
Command: "TerminalReport",
// ИНН для поиска. Если "" то ищется только по NumDevice,
// Если NumDevice = 0 а InnKkm заполнено то ККМ ищется только по InnKkm
InnKkm: "",
// Номер устройства. Если 0 то первое не блокированное на сервере
// Не рекомендовано для использования. рекомендуем задаваь InnKkm
NumDevice: NumDevice,
// Краткий (false) или полный (true) отчет
Detailed: Detailed,
// Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды
// По этому идентификатору можно запросить результат выполнения команды
// Поле не обязательно
IdCommand: guid()
};
// Вызов команды
ExecuteCommand(Data);
}
// Получить копию слип-чека
function TransactionDetails(NumDevice) {
// Подготовка данных команды
var Data = {
// Команда серверу
Command: "TransactionDetails",
// ИНН для поиска. Если "" то ищется только по NumDevice,
// Если NumDevice = 0 а InnKkm заполнено то ККМ ищется только по InnKkm
InnKkm: "",
// Номер устройства. Если 0 то первое не блокированное на сервере
// Не рекомендовано для использования. рекомендуем задаваь InnKkm
NumDevice: NumDevice,
// Номер Карты / Данные карты - если карта считывается устройством то не заполняется
CardNumber: Old_CardNumber,
// Сумма оплаты
Amount: 0.01,
// Номер чека
ReceiptNumber: "TEST-01",
// Уникальный код транзакции RRN который был получен при блокировки суммы на счете карты
RRNCode: Old_RRNCode,
// Код авторизации транзакции который был получен при блокировки суммы на счете карты
AuthorizationCode: Old_AuthorizationCode,
// Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды
// По этому идентификатору можно запросить результат выполнения команды
// Поле не обязательно
IdCommand: guid()
};
// Вызов команды
ExecuteCommand(Data);
}
// Есть ли печать квитанций на терминале?
function PrintSlipOnTerminal(NumDevice) {
// Подготовка данных команды
var Data = {
// Команда серверу
Command: "PrintSlipOnTerminal",
// ИНН для поиска. Если "" то ищется только по NumDevice,
// Если NumDevice = 0 а InnKkm заполнено то ККМ ищется только по InnKkm
InnKkm: "",
// Номер устройства. Если 0 то первое не блокированное на сервере
// Не рекомендовано для использования. рекомендуем задаваь InnKkm
NumDevice: NumDevice,
// Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды
// По этому идентификатору можно запросить результат выполнения команды
// Поле не обязательно
IdCommand: guid()
};
// Вызов команды
ExecuteCommand(Data);
}
//----------------------------------------------------------------------------------------
// Пример асинхронного запроса для интерактивного ввода данных на сервере
// Рекомендуется как основной способ работы с эквайринговыми терминалами (или с другим оборудованием с интерактивным вводом данных)
var CounGetRezult;
// Оплатить платежной картой
function PayByPaymentCardAsync(NumDevice) {
CounGetRezult = 0;
// Генерация уникального идентификатора команды
IdCommand = guid();
// Подготовка данных команды
var Data = {
// Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды
IdCommand: IdCommand,
// Команда серверу
Command: "PayByPaymentCard",
// Номер устройства. Если 0 то первое не блокированное на сервере
NumDevice: NumDevice,
// Номер Карты / Данные карты - если карта считывается устройством то не заполняется
CardNumber: "",
// Сумма оплаты
Amount: 0.01,
// Номер чека
ReceiptNumber: "TEST-01",
// Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды
// По этому идентификатору можно запросить результат выполнения команды
// Поле не обязательно
IdCommand: guid(),
// Время (сек) ожидания выполнения команды.
//Если За это время команда не выполнилась в статусе вернется результат "NotRun" или "Run"
//Проверить результат еще не выполненной команды можно командой "GetRezult"
//Если не указано или 0 - то значение по умолчанию 60 сек.
// Поле не обязательно. Это поле можно указывать во всех командах
Timeout: 1 //Асинхронный вызов без ожидания выполнения
};
// Вызов команды
// первый параметр true! это значит что серевр не будет ожидать завершения выполнения команды и сразу отдаст поток со страусом 1 - Run
ExecuteCommand(Data, SetRezult);
}
// Асинхронная проверка выполнения команды!!
function SetRezult(Rezult, textStatus, jqX) {
// Эта функция вызывается при успешном запросе
// Rezult.Status - Статус выполнения команды
// Ok = 0, - выполнено без ошибок
// Run = 1, - команда запущена на выполнение но еще не выполнена
// Error = 2, - команда выполнена, есть ошибка
// NotFound = 3, - не найдена ранее запущенная команда команда (для асинхронного режима при выполнении команды GetRezult)
// NotRun = 4 - команда еще не запущена на выполнение (ожидание готовности устройства)
if (Rezult.Status == 1 || Rezult.Status == 4) { // значит команда еще выполняется или еще не запустилась
//Вывод данных что результат еще не выполнен
CounGetRezult = CounGetRezult + 1;
$("#MessageStatus").text("Выполняется: Запрос №:" + CounGetRezult);
// Заново запрашиваем результат выполнения команды
var Data = {
// Команда серверу - запрос выполнения команды
Command: "GetRezult",
// Уникальный идентификатор ранее поданной команды
IdCommand: IdCommand,
};
// Вызываем запрос на получение результата с задержкой 2 секунды
setTimeout(function () { ExecuteCommand(Data, SetRezult, null, null, false) }, 1000);
} else { // Rezult.Status <> 1 - значит команда уже выполнена
// Вывод результата выполнения команды
ExecuteSuccess(Rezult, textStatus, null);
}
};
Дисплеи покупателя
// Вывести на экран
function OutputOnCustomerDisplay(NumDevice) {
// Подготовка данных команды
var Data = {
// Команда серверу
Command: "OutputOnCustomerDisplay",
// Номер устройства. Если 0 то первое не блокированное на сервере
NumDevice: NumDevice,
// Вывод верхней строки на дисплей
TopString: "Оплата заказа:",
// Вывод QR кода на дисплей
CodeQR: "https://kkmserver.ru",
// Вывод нижней строки на дисплей
BottomString: "Сумма: 3000.00 руб"
};
// Вызов команды
ExecuteCommand(Data);
}
// Очистить экран
function ClearCustomerDisplay(NumDevice) {
// Подготовка данных команды
var Data = {
// Команда серверу
Command: "ClearCustomerDisplay",
// Номер устройства. Если 0 то первое не блокированное на сервере
NumDevice: NumDevice
};
// Вызов команды
ExecuteCommand(Data);
}
// Получить опции дисплея
function OptionsCustomerDisplay(NumDevice) {
// Подготовка данных команды
var Data = {
// Команда серверу
Command: "OptionsCustomerDisplay",
// Номер устройства. Если 0 то первое не блокированное на сервере
NumDevice: NumDevice
};
// Вызов команды
ExecuteCommand(Data);
}
Ответ:
{
// Есть вывод верхней строки
"IsTopString": true,
// Есть вывод нижней строки
"IsBottomString": true,
// Есть вывод QR кода
"IsCodeQR": true,
}
Принтер чеков
// Печать чеков
function PrintDocument(NumDevice, IsBarCode) {
// Подготовка данных команды
var Data = {
// Команда серверу
Command: "PrintDocument",
// Номер устройства. Если 0 то первое не блокированное на сервере
NumDevice: NumDevice,
// Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды
// По этому идентификатору можно запросить результат выполнения команды
// Поле не обязательно
IdCommand: guid(),
// Строки чека
CheckStrings: [
// Строка с печатью штрих-кода
{
BarCode: {
// Тип штрих-кода: "EAN13", "CODE39", "CODE128","QR", "PDF417".
BarcodeType: "PDF417",
// Значение штрих-кода
Barcode: "12345DFG Proba pera, Print barcode 1234567890",
},
},
//При вставке в текст символов ">#10#<" строка при печати выровнеется по центру, где 10 - это на сколько меньше станет строка ККТ
{
PrintText: {
Text: ">#2#<ООО 'Рога и копыта' " ,
Font: 1,
},
},
// При вставке в текст в середину строки символов "<#10#>" Левая часть строки будет выравнена по левому краю, правая по правому, где 10 - это на сколько меньше станет строка ККТ
// При вставке в текст в середину строки символов "<#10#>>" Левая часть строки будет выравнена по правому краю, правая по правому, где 10 - отступ от правого клая
{ PrintText: { Text: "Пример №1 печати поля:<#16#>154,41" }, },
{ PrintText: { Text: "2-рое поле:<#16#>4,00" }, },
{ PrintText: { Text: "Пример №2 печати поля:<#8#>>4,00" }, },
{ PrintText: { Text: "2-рое поле:<#8#>>1544,00" }, },
// Строка с печатью текста определенным шрифтом
{
PrintText: {
Text: "Шрифт № 1",
Font: 1, // 1-4, 0 - по настройкам ККМ
Intensity: 15, // 1-15, 0 - по настройкам ККМ
},
},
{
PrintText: {
Text: "Шрифт № 2",
Font: 2, // 1-4, 0 - по настройкам ККМ
Intensity: 10, // 1-15, 0 - по настройкам ККМ
},
},
{
PrintText: {
Text: "Шрифт № 3",
//Text: "Это мега крутой товар. Продается во всех магазинах страны. Покупайте только у нас",
Font: 3, // 1-4, 0 - по настройкам ККМ
Intensity: 5, // 1-15, 0 - по настройкам ККМ
},
},
{
PrintText: {
Text: "Шрифт № 4",
Font: 4, // 1-4, 0 - по настройкам ККМ
Intensity: 0, // 1-15, 0 - по настройкам ККМ
},
},
{
BarCode: {
// Тип штрих-кода: "EAN13", "CODE39", "CODE128","QR", "PDF417".
BarcodeType: "EAN13",
// Значение штрих-кода
Barcode: "1254789547853",
},
},
// Полная строка: И текст и регистрация и бар-код
{
PrintText: {
Text: "Это мега крутой товар. Продается во всех магазинах страны. Покупайте только у нас",
Font: 3, // 1-4, 0 - по настройкам ККМ
Intensity: 0, // 1-15, 0 - по настройкам ККМ
},
BarCode: {
// Тип штрих-кода: "EAN13", "CODE39", "CODE128","QR", "PDF417".
BarcodeType: "QR",
// Значение штрих-кода
Barcode: "12345DFG",
},
},
],
};
//Если чек без ШК то удаляем строку с ШК
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;
}
}
}
// Вызов команды
ExecuteCommand(Data);
}
// Открыть денежный ящик
function PrintOpenCashDrawer(NumDevice) {
// Подготовка данных команды
var Data = {
// Команда серверу
Command: "PrintOpenCashDrawer",
// Номер устройства. Если 0 то первое не блокированное на сервере
NumDevice: NumDevice,
// Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды
// По этому идентификатору можно запросить результат выполнения команды
// Поле не обязательно
IdCommand: guid()
};
// Вызов команды
ExecuteCommand(Data);
}
// Получить ширину строки чека в символах
function PrintLineLength(NumDevice) {
// Подготовка данных команды
var Data = {
// Команда серверу
Command: "PrintLineLength",
// Номер устройства. Если 0 то первое не блокированное на сервере
NumDevice: NumDevice,
// Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды
// По этому идентификатору можно запросить результат выполнения команды
// Поле не обязательно
IdCommand: guid()
};
// Вызов команды
ExecuteCommand(Data);
}
Работа с весами
// Откалибровать весы
function Calibrate(NumDevice) {
// Подготовка данных команды
var Data = {
// Команда серверу
Command: "Calibrate",
// Номер устройства. Если 0 то первое не блокированное на сервере
NumDevice: NumDevice,
// Установка веса тары на весах. Если 0 то берется текущее значение веса на весах.
TareWeight: 0
};
// Вызов команды
ExecuteCommand(Data);
}
// Получить вес
function GetWeight(NumDevice) {
// Подготовка данных команды
var Data = {
// Команда серверу
Command: "GetWeight",
// Номер устройства. Если 0 то первое не блокированное на сервере
NumDevice: NumDevice
};
// Вызов команды
ExecuteCommand(Data);
}
Получение списка устройств
// Получение списка устройств
function List() {
// Подготовка данных команды
var Data = {
// Команда серверу
Command: "List",
// Отбор по номеру устройства. Число. Если 0 или не указано то с любым номером
NumDevice: 0,
// Отбор по ИНН. Строка. Если "" или не указано то первое не блокированное на сервере
InnKkm: "",
// Отбор активных. Булево. Если null или не указано то активные и не активные
Active: true,
// Отбор выключенных-включенных
OnOff: true,
// Отбор наличию ошибок ОФВ. Булево. Если null или не указано то с ошибками и без
OFD_Error: false,
// Все у которых дата не переданного док. в ОФД меньше указанной. Дата-время. Если null или не указано то любое
OFD_DateErrorDoc: '2100-01-01T00:00:00',
// Все у которых дата окончания работы ФН меньше указанной. Дата-время. Если null или не указано то любое
FN_DateEnd: '2100-01-01T00:00:00',
// Все у которых заканчивается память ФН; Булево. Если null или не указано то все
FN_MemOverflowl: false,
// Фискализованные или нет ФН; Булево. Если null или не указано то все
FN_IsFiscal: true,
};
// Вызов команды
ExecuteCommand(Data);
// Возвращается JSON массив из объектов:
//{
// "ListUnit": [
// {
// "NumDevice": 2,
// "IdDevice": "6a6151a5-b352-485c-8f01-45da05d3df18",
// "OnOf": true,
// "Active": false,
// "TypeDevice": "Фискальный регистратор",
// "IdTypeDevice": "KkmStrihM",
// "IP": "192.168.137.111",
// "NameDevice": "<Не определено>",
// "KktNumber": "",
// "INN": "<Не определено>",
// "TaxVariant": "", // Описание смотри в команде KkmRegOfd
// "AddDate": "2017-01-13T14:55:16",
// "OFD_Error": "",
// "OFD_NumErrorDoc": 0,
// "OFD_DateErrorDoc": "0001-01-01T00:00:00",
// "FN_DateEnd": "0001-01-01T00:00:00",
// "FN_MemOverflowl": false,
// "FN_IsFiscal": false,
// "PaperOver": false
// },
// ],
// "Command": "List",
// "Error": "", // Текст ошибки если была - обязательно показать пользователю - по содержанию ошибки можно в 90% случаях понять как ее устранять
// "Status": 0 // Ok = 0, Run(Запущено на выполнение) = 1, Error = 2, NotFound(устройство не найдено) = 3, NotRun = 4
//}
}
Проверка статуса ранее отданной команды
// Проверка статуса ранее отданной команды
function GetRezult(IdCommand) {
// Эта функцию надо вызывать тогда, когда ответ на команду равен Rezult.Status = 1 или 4
// Статусы выполнения команды
// Ok = 0, - выполнено без ошибок
// Run = 1, - команда запущена на выполнение но еще не выполнена
// Error = 2, - команда выполнена, есть ошибка
// NotFound = 3, - не найдена ранее запущенная команда команда (для асинхронного режима при выполнении команды GetRezult)
// NotRun = 4 - команда еще не запущена на выполнение (ожидание готовности устройства)
// Заново запрашиваем результат выполнения команды
var Data = {
// Команда серверу - запрос выполнения команды
Command: "GetRezult",
// Уникальный идентификатор ранее поданной команды
IdCommand: IdCommand,
};
// Вызываем запрос на получение результата с задержкой 2 секунды
ExecuteCommand(Data, GetRezult, null, null, false);
};
Выдача клиенту в аренду свою лицензию (суб-аренда)
Расчет ключа для получения суб-лицензии
Если Вам надо предоставить свою лицензию во временное пользование вашему клиенту (суб-лицензирование)
вы должны сделать следующее:
1. Сгенерить ключ суб лиценции (пример описан ниже)
2. Вставить в данные команды поле "KeySubLicensing" с эти ключом, пример:
KeySubLicensing: "client@gmail.com/750B3EE783DC3C66BBB2F5B4DF3F4EA0"
Суб-лицензия выделяется из Ваших свободных сроком на 1 месяц.
ВНИМАНИЕ!
Расчет ключа для получения суб-лицензии должен происходить на Вашем сервере (а не у чужого клиента-суб-лицензиата)
НЕ передавайте свой пароль клиенту-суб-лицензиата
Данный пример только для понимания как генерировать ключ на Вашем сервере!!
// Пример расчета ключа:
// Email - ваш Email на который выделенны лицензии
// Password - пароль от лицензии
function GetKeySubLicensing(Email, Password) {
//хеш пароля
var Hash1 = md5(Password).toUpperCase();
// солим
var Hash2 = md5(Hash1 + "Qwerty").toUpperCase();
// формируем дату в формате "YYYYMMDD" по Москве!
var now = new Date(); //Текущая дата по Москве!
var formated_date = "" + now.getFullYear() + ((now.getMonth()+1) < 10 ? "0" : "") + (now.getMonth()+1) + (now.getDate() < 10 ? "0" : "") + now.getDate();
//now.getMonth()+1 потому что getMonth() возвращает 0..11 а не 1..12
//добавляем данные лицензии
var Hash3 = md5(Hash2 + formated_date).toUpperCase();
// Имя машины или имя клиента max 100 символов
// Указывать не обязательно
// Позволяет быстрее найти серийный номер в личном кабинете
var Name = "Клиент-1";
// формируем ключ
if (Name == "") {
var Key = Email + "/" + Hash3;
} else {
var Key = Name + ":" + Email + "/" + Hash3;
};
return Key;
}
Ключ должен расчитываться каждый день новый!!!!
С версии 2.0.23.XX
"Обратный" вызов других серверов
Бывают ситуации когда облачное приложение не может само отправить команды на регистрацию чеков.
Например когда KkmServer установлен в офисе, а у офиса нет постоянного IP и облачный сервер не сможет его увидеть по IP протоколу.
В этом случае нужно настроить "Обратный вызов".
"Обратный вызов" - это когда KkmServer сам по расписанию делает запрос к облачному серверу за данными для регистрации чеков.
На странице настроек сервера, в меню "настройки сервера" внизу есть группа: "Настройка обратного вызова".
Укажите список URL который сервер будет вызывать, Тип вызова, логин, пароль, и интервал вызова.
Тип вызова: WebSockets:
После установления соединения kkmserver передаст строку аутентификации:
Basic=Токен:Логин:Пароль или Basic=Логин:Пароль
Ваш сервер должен проверить данные, и если они не правильные - разорвать соединение.
Далее kkmserver ждет сообщения от Вашего сервера
Передача идет текстовыми сообщениями,
Каждое водящее от Вас сообщение - это JSON команда, которая ставится в очередь на выполнение
JSON формируется по общим правилам команд API
Каждое исходящее к Вам сообщение - JSON ответ на поставленную команду. Ответы могут приходить в отличном от постановки порядке.
Тип вызова: HTTP:
KkmServer будет делать http/put запрос (по указанным URL) с таким json в теле:
{
"Command": "GetCommand",
"Token": "",
"ListRezult": []
}
Где:
"GetCommand" - Это значит что KkmServer запрашивает данные
"Token" - токен(имя клиента) для облачного сервера
"ListRezult" - массив результатов выполнения предыдущих команд. В данном случае пустой.
Облачный сервер возвращает в теле JSON массив команд, например:
{
"ListCommand": [{
"Command": "List",
"IdCommand": "6FA28ECE-0766-4479-BB37-F1343EA9CDBF"
}, {
"Command": "GetDataKKT",
"NumDevice": 1,
"IdCommand": "3B985644-7CF5-47B6-BA18-B54A634B67F3"
}]
}
Где:
"ListCommand" - массив команд.
Формат команд точно такой-же как и при обычном вызове KkmServer.
Допустимы все команды доступные при обычном вызове KkmServer-а.
В данном примере 2 команды: 1-вая - получает список устройств, 2-рая получает данные по 1 устройству.
KkmServer выполнит команды и через заданные в настройках интервал сделает очередной http/put запрос, пример:
{
"Command": "GetCommand",
"Token": "",
"ListRezult": [{
"ListUnit": [{
"NumDevice": 1,
"IdDevice": "7fcfc44a-3741-486b-b8a0-a6f695e06301",
"OnOff": true,
.......................................
"FN_IsFiscal": false,
"PaperOver": false
}],
"Command": "List",
"Error": "",
"Status": 0,
"IdCommand": "6FA28ECE-0766-4479-BB37-F1343EA9CDBF"
}, {
"URL": "",
"Command": "GetDataKKT",
"Error": "",
"Status": 1,
.......................................
"IdCommand": "3B985644-7CF5-47B6-BA18-B54A634B67F3",
"NumDevice": 1
}]
}
Где:
"GetCommand" - Сервер опять запрашивает данные
"Token" - токен(имя клиента) для облачного сервера
"ListRezult" - массив результатов выполнения предыдущих команд.
В данном случае в результах ответы на команды "List" и "GetDataKKT"
Сопоставить отправленные команды с их результатами надо выполнять по полю "IdCommand"
В Команде и в результате это поле будет одинаковое.
Файл html с примерами для браузера