kkm Server. Печать чека товара
Используем KKM Server API для печати чека. Как правильно подключиться к системе KKM. Ниже привели пример кода который используем, нашли его в примере API на официальном сайте KKM. При его запуске печатается аннулированный чек без товара. Так же не печатается QR код
Печать производится по нажатию на кнопку:
<button class="btn btn-danger" onclick="RegisterCheck(1, 1, 1);">Печать чека</button>
Вот код обработчика:
function ExecuteSuccess(result) {
$('#kkm-result').html(JSON.stringify(result));
}
// Печать чека
function RegisterCheck(NumDevice, TypeCheck, IsBarCode, Print) {
// Подготовка данных команды, параметры (TypeCheck = 0, NumDevice = 0, InnKkm = "", CashierName = "")
var Data = KkmServer.GetDataCheck(TypeCheck, NumDevice, "", "Kазакова Н.А.", "430601071197");
//***********************************************************************************************************
// ПОЛЯ ПОИСКА УСТРОЙСТВА
//***********************************************************************************************************
// Номер устройства. Если 0 то первое не блокированное на сервере
Data.NumDevice = NumDevice;
// ИНН ККМ для поиска. Если "" то ККМ ищется только по NumDevice,
// Если NumDevice = 0 а InnKkm заполнено то ККМ ищется только по InnKkm
Data.InnKkm = "";
//---------------------------------------------
// Заводской номер ККМ для поиска. Если "" то ККМ ищется только по NumDevice,
Data.KktNumber = "";
// **********************************************************************************************************
// Время (сек) ожидания выполнения команды.
//Если За это время команда не выполнилась в статусе вернется результат "NotRun" или "Run"
//Проверить результат еще не выполненной команды можно командой "GetRezult"
//Если не указано или 0 - то значение по умолчанию 60 сек.
// Поле не обязательно. Это поле можно указывать во всех командах
Data.Timeout = 30;
// Это фискальный или не фискальный чек
Data.IsFiscalCheck = true;
// Тип чека;
// 0 – продажа; 10 – покупка;
// 1 – возврат продажи; 11 - возврат покупки;
// 8 - продажа только по ЕГАИС (обычный чек ККМ не печатается)
// 9 - возврат продажи только по ЕГАИС (обычный чек ККМ не печатается)
Data.TypeCheck = TypeCheck;
// Не печатать чек на бумагу
Data.NotPrint = false; //true,
// Количество копий документа
Data.NumberCopies = 0;
// Продавец, тег ОФД 1021
Data.CashierName = "Kазакова Н.А.";
// ИНН продавца тег ОФД 1203
Data.CashierVATIN = "430601071197";
// Телефон или е-Майл покупателя, тег ОФД 1008
// Если чек не печатается (NotPrint = true) то указывать обязательно
// Формат: Телефон +{Ц} Email {С}@{C}
Data.ClientAddress = "[email protected]";
// Покупатель (клиент) - наименование организации или фамилия, имя, отчество (при наличии), серия и номер паспорта покупателя(клиента). Тег 1227
// Только с использованием наличных / электронных денежных средств и при выплате выигрыша, получении страховой премии или при страховой выплате.
Data.ClientInfo = "Везучий В.В. РЕ-125486";
// ИНН Организации или покупателя(клиента). Тег 1228
// Только с использованием наличных / электронных денежных средств и при выплате выигрыша, получении страховой премии или при страховой выплате.
Data.ClientINN = "502906602876";
// Aдрес электронной почты отправителя чека тег ОФД 1117 (если задан при регистрации можно не указывать)
// Формат: Email {С}@{C}
Data.SenderEmail = "[email protected]";
// Место расчетов, Тег ОФД 1187 (если не задано - берется из регистрационных данных ККТ)
Data.PlaceMarket = "kkmserver.ru";
// Система налогообложения (СНО) применяемая для чека
// Если не указанно - система СНО настроенная в ККМ по умолчанию
// 0: Общая ОСН
// 1: Упрощенная УСН (Доход)
// 2: Упрощенная УСН (Доход минус Расход)
// 3: Единый налог на вмененный доход ЕНВД
// 4: Единый сельскохозяйственный налог ЕСН
// 5: Патентная система налогообложения
// Комбинация разных СНО не возможна
// Надо указывать если ККМ настроена на несколько систем СНО
Data.TaxVariant = "";
// Дополнительный реквизит пользователя тег ОФД 1084
Data.UserAttribute = {
// Наименование дополнительного реквизита пользователя тег ОД 1085
Name: "Поле-тест",
// Значение дополнительного реквизита пользователя тег ОФД 1086
Value: "Тестовое значение"
};
// Дополнительный реквизит чека тег 1192
Data.AdditionalAttribute = "Тест";
// Это только для тестов:
//Data.ClientId = "e1e0c5dbb395acecda9e3ed86a798755b21a53de"; //"541a9db930c2e90670898943",
// Это только для тестов: Получение ключа суб-лицензии : ВНИМАНИЕ: ключ суб-лицензии вы должны генерить у себя на сервере!!!!
//Data.KeySubLicensing = "";
// КПП организации, нужно только для ЕГАИС
Data.KPP = "782543005";
// Если надо одновременно автоматически провести транзакцию через эквайринг
// Эквайринг будет задействован если: 1. чек фискальный, 2. оплата по "ElectronicPayment" не равна 0, 3. PayByProcessing = true
// Использовать эквайринг: Null - из настроек на сервере, false - не будет, true - будет
Data.PayByProcessing = false; //В тестовом чеке автоматический эквайринг выключен
// Номер устройства для эквайринга - Null - из настроек на сервере, 0 - любое, число - номер конкретного устройства
Data.NumDeviceByProcessing = null;
// Номер чека для эквайринга
Data.ReceiptNumber = "TEST-1";
// Печатать Слип-чек после чека (а не в чеке)
PrintSlipAfterCheck = false;
// Печатать Слип-чек дополнительно для кассира (основной слип-чек уже будет печататся в составе чека)
Data.PrintSlipForCashier = true;
//Если это чек возврата то возможны два поля для отмены транзакции (если не указано то по эквайрингу будет не отмена а возврат оплаты)
Data.RRNCode = ""; // RRNCode из операции эквайринга. Только для отмены оплаты! Для Оплаты или возврата оплаты не заполнять!
Data.AuthorizationCode = ""; // AuthorizationCode из операции эквайринга. Только для отмены оплаты! Для Оплаты или возврата оплаты не заполнять!
// Добавление признаков агенте и поставщика
Data.AddDataAgent(
// Признак агента (не обязательно), Тег 1057
// 0: "Банковский платежный агент:" Оказание услуг пользователем, являющимся банковским платежным агентом
// 1: "Банковский платежный субагент:" Оказание услуг пользователем, являющимся банковским платежным субагентом
// 2: "Платежный агент:" Оказание услуг пользователем, являющимся платежным агентом
// 3: "Платежный субагент:" Оказание услуг пользователем, являющимся платежным субагентом
// 4: "Поверенный:" Оказание услуг пользователем, являющимся поверенным
// 5: "Комиссионер:" Оказание услуг пользователем, являющимся комиссионером
// 6: "Агент:" Оказание услуг пользователем, являющимся агентом и не являющимся банковским платежным агентом (субагентом), платежным агентом (субагентом), поверенным, комиссионером
2,
// Операция платежного агента тег 1044
"95315",
// Телефон платежного агента тег 1073
"+79995554422",
// Телефон оператора по приему платежей тег 1074
"+72223334455",
// Телефон оператора перевода тег 1075
"+74447776655",
// Наименование оператора перевода тег 1026
"ООО Тестовая организация",
// Адрес оператора перевода тег 1005
"Москва, зубовский бульвар 44",
// ИНН оператора перевода тег 1016
"430601071197",
// Телефон поставщика тег 1171
"+76662229955"
);
// Добавление печати текста по полям
//При вставке в текст символов ">#10#<" строка при печати выровнеется по центру, где 10 - это на сколько меньше станет строка ККТ
Data.AddTextString(">#2#<ООО \"Рога и копыта\"", 1);
// При вставке в текст в середину строки символов "<#10#>" Левая часть строки будет выравнена по левому краю, правая по правому, где 10 - это на сколько меньше станет строка ККТ
// При вставке в текст в середину строки символов "<#10#>>" Левая часть строки будет выравнена по правому краю, правая по правому, где 10 - отступ от правого клая
Data.AddTextString("<<->>");
Data.AddTextString("Пример №1:<#10#>154,41");
Data.AddTextString("2-рое поле:<#10#>4,00");
Data.AddTextString("<<->>");
Data.AddTextString("Пример №2:<#8#>>4,00");
Data.AddTextString("2-рое поле:<#8#>>1544,00");
// Добавление печати текста шрифтом и интенсивностью
// Data.AddTextString(Data, Текст, Font(1-4, 0 - по настройкам ККМ), Intensity(1-15, 0 - по настройкам ККМ);
Data.AddTextString("<<->>");
Data.AddTextString("Шрифт № 1", 1, 15);
Data.AddTextString("Шрифт № 2", 2, 10);
Data.AddTextString("Шрифт № 3", 3, 5);
Data.AddTextString("Шрифт № 4", 4, 15);
Data.AddTextString("<<->>");
// Добавление печати фискальной строки
var DataStr = Data.AddRegisterString(
// НаименованиеТовара(64 символа)
"Сапоги женские DF-3099-1",
// Количество (3 знака после запятой)
1,
// ЦенаБезСкидки (2 знака после запятой)
1,
// СуммаСтроки (2 знака после запятой)
0.01,
// СтавкаНДС(0(НДС 0%), 10(НДС 10%), 20(НДС 20%), -1(НДС не облагается), 120 (НДС 20/120), 110 (НДС 10/110))
-1,
// Отдел
0,
// Код товара EAN13 - не обязательно
"1254789547853",
// Признак способа расчета. тег ОФД 1214. Для ФФД.1.05 и выше обязательное поле
// 1: "ПРЕДОПЛАТА 100% (Полная предварительная оплата до момента передачи предмета расчета)"
// 2: "ПРЕДОПЛАТА (Частичная предварительная оплата до момента передачи предмета расчета)"
// 3: "АВАНС"
// 4: "ПОЛНЫЙ РАСЧЕТ (Полная оплата, в том числе с учетом аванса в момент передачи предмета расчета)"
// 5: "ЧАСТИЧНЫЙ РАСЧЕТ И КРЕДИТ (Частичная оплата предмета расчета в момент его передачи с последующей оплатой в кредит )"
// 6: "ПЕРЕДАЧА В КРЕДИТ (Передача предмета расчета без его оплаты в момент его передачи с последующей оплатой в кредит)"
// 7: "ОПЛАТА КРЕДИТА (Оплата предмета расчета после его передачи с оплатой в кредит )"
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: "ЗАЛОГ"
1,
//штрих - код маркировки товара со сканера(нужно настроить сканер так чтобы не проглатывал управляющие символы)
//КИЗ(контрольный идентификационный знак) товарной номенклатуры Тег ОФД 1162(честный знак), можно не указывать
// Поддерживаются ШК:
// Без идентификатора экземпляра товара: EAN8, EAN13, ITF14
// С идентификатором экземпляра товара: GS1, ШК шуб, ШК табачной продукции., ЕГАИС-2, ЕГАИС-3
//Описание применимых ШК
"0104300943734342212413195240818240640291ffd092MDEwNDMwMDk0MzczNDM",
// Единица измерения предмета расчета. Можно не указывать
"пара",
// Цифровой код страны происхождения товара (CountryOfOrigin) в соответствии с Общероссийским классификатором стран мира 3 симв. Тег 1230
"156",
// Регистрационный номер таможенной декларации (CustomsDeclaration) 32 симв. Тег 1231
"54180656/1345865/3435625/23",
// Сумма акциза (ExciseAmount) с учетом копеек, включенная в стоимость предмета расчета Тег 1229
0.01,
// Дополнительный реквизит предмета расчета тег 1191, Только для ФФД 1.1 !
"Тест-доп.реквизит"
);
// Добавляет в последнею строку Код товарной номенклатуры
// КИЗ (контрольный идентификационный знак) товарной номенклатуры Тег ОФД 1162 (честный знак), можно не указывать
// !!!!Команда нужна если в команде Data.AddRegisterString не добавили КИЗ
//Data.MarkingCode(
// // штрих-код маркировки товара со сканера (нужно настроить сканер так чтобы не проглатывал управляющие символы)
// // Поддерживаются ШК:
// // Без идентификатора экземпляра товара: EAN8, EAN13, ITF14
// // С идентификатором экземпляра товара: GS1, ШК шуб, ШК табачной продукции., ЕГАИС-2, ЕГАИС-3
// "0104300943734342212413195240818240640291ffd092MDEwNDMwMDk0MzczNDM",
// // Проверять содержит ли ШК кода маркировки идентификатор экземпляра товара (если вообше не указать - true)
// // Для некоторых товаров нужно передавать ШК EAN-13, тогда это поле устанавливайте в 'false'
// true
//);
// DataStr.EGAIS = {
// Barcode: "22N0000154NUCPRZ3R8381461004001003499NKAQ0ZBUVDNV62JQAR69PEV878RO93V",
// Ean: "3423290167937",
// Volume: 0.7500,
// };
// Добавляет в последнею строку признак агента (не обязательно), Тег 1222.
// Поле не обязательное. Можно вообще не указывать.
// 0: "Банковский платежный агент:" Оказание услуг пользователем, являющимся банковским платежным агентом
// 1: "Банковский платежный субагент:" Оказание услуг пользователем, являющимся банковским платежным субагентом
// 2: "Платежный агент:" Оказание услуг пользователем, являющимся платежным агентом
// 3: "Платежный субагент:" Оказание услуг пользователем, являющимся платежным субагентом
// 4: "Поверенный:" Оказание услуг пользователем, являющимся поверенным
// 5: "Комиссионер:" Оказание услуг пользователем, являющимся комиссионером
// 6: "Агент:" Оказание услуг пользователем, являющимся агентом и не являющимся банковским платежным агентом (субагентом), платежным агентом (субагентом), поверенным, комиссионером
Data.AddAgentSign(2);
// Добавляет в последнею строку данные агента (не обязательно)
Data.AddAgentData(
// Операция платежного агента тег 1044
"95315",
// Телефон платежного агента тег 1073
"+79995554422",
// Телефон оператора по приему платежей тег 1074
"+72223334455",
// Телефон оператора перевода тег 1075
"+74447776655",
// Наименование оператора перевода тег 1026
"ООО Рога и копыта",
// Адрес оператора перевода тег 1005
"Москва, зубовский бульвар 44",
// ИНН оператора перевода тег 1016
"430601071197"
);
// Добавляет в последнею строку данные поставщика (не обязательно)
Data.AddPurveyorData(
// Телефон поставщика тег 1171
"+76662229955",
// Наименование поставщика ОФД 1225
"ООО 'Гаражик в деревне'",
// ИНН поставщика тег 1226
"430601071197"
);
// Добавление печати штрихкода
// Data.AddBarcodeString(ТипШтрихКода ("EAN13", "CODE39", "CODE128", "QR", "PDF417", "1254789547853"), ШтрихКод);
Data.AddBarcodeString("EAN13", "1254789547853");
Data.AddTextString("<<->>");
Data.AddTextString("Это мега крутой товар. Продается во всех магазинах страны. Покупайте только у нас", 4, 0);
// Добавление печати еще одной фискальной строки
Data.AddRegisterString("Шаровары мужские красные: НИМБУС-2000", 1, 1, 0.01, 1, 1, "1254789547853", 1, 1);
// Добавляет в последнею строку Код товарной номенклатуры
Data.AddGoodCodeData("02", "04630037591316", "sgEdK2y5");
// Добавление печати штрихкода
// Data.AddBarcodeString(ТипШтрихКода ("EAN13", "CODE39", "CODE128", "QR", "PDF417", "1254789547853"), ШтрихКод);
// Data.AddBarcodeString("QR", "12345DFG Proba pera, Print barcode 1234567890.");
// Data.AddBarcodeString("PDF417", "12345DFG Proba pera, Print barcode 1234567890.");
// Наличная оплата (2 знака после запятой)
Data.Cash = 100;
// Сумма электронной оплаты (2 знака после запятой)
Data.ElectronicPayment = 0.01;
// Сумма из предоплаты (зачетом аванса) (2 знака после запятой)
Data.AdvancePayment = 0;
// Сумма постоплатой(в кредит) (2 знака после запятой)
Data.Credit = 0;
// Сумма оплаты встречным предоставлением (сертификаты, др. мат.ценности) (2 знака после запятой)
Data.CashProvision = 0;
//#if Relese
// Скидываем данные об агенте - т.к.у Вас неверняка ККТ не зарегистрирована как Агент.
Data.AgentSign = null;
Data.AgentData = null;
Data.PurveyorData = null;
//#endif
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;
};
};
// Вызов команды
OldIdCommand = Data.Execute(ExecuteSuccess).IdCommand;
// Возвращается 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
//}
}