### Install libgdiplus Dependency Source: https://kkmserver.ru/WiKi/InstallMacOs Commands to install Homebrew and the required libgdiplus library for the KKT emulator. ```bash brew install mono-libgdiplus ``` -------------------------------- ### Start KkmServer Once Source: https://kkmserver.ru/WiKi/InstallMacOs Command to launch the server as a one-time process. ```bash /Library/kkmserver/kkmserver -s ``` -------------------------------- ### Verify .NET Core SDK Installation Source: https://kkmserver.ru/WiKi/InstallMacOs Command to verify the installed .NET Core SDK version. ```bash dotnet --list-sdks ``` -------------------------------- ### Register KkmServer for Browser Extension Source: https://kkmserver.ru/WiKi/InstallMacOs Command to register the server for use with browser extensions after installation. ```bash /Library/kkmserver/kkmserver -r ``` -------------------------------- ### Configure Money Transfer and Purveyor Data Source: https://kkmserver.ru Example configuration for money transfer operator VATIN and payment agent purveyor details including phone, name, and VATIN. ```javascript // ИНН оператора перевода. Тег ОФД 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" , }, ``` -------------------------------- ### Register Item with Text and Barcode Source: https://kkmserver.ru Full receipt line example including text, item registration details, tax settings, and QR barcode printing. ```javascript // Полная строка: И текст и регистрация и бар-код { 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%), 5 (НДС 5%), 7 (НДС 7%), 10 (НДС 10%), 22 (НДС 22%), -1 (НДС не облагается), 105 (НДС 5 /105), 107 (НДС 7 /107), 122 (НДС 22 /122), 110 (НДС 10 /110), Тег 1043, Из нее расчет тега 1079 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." , }, }, ``` -------------------------------- ### Daemonize KkmServer for Auto-start Source: https://kkmserver.ru/WiKi/InstallMacOs Commands to configure the server as a background daemon for automatic startup. ```bash /Library/kkmserver/kkmserver -d sudo chmod 755 /Library/LaunchDaemons/kkmserver.service.plist sudo launchctl load /Library/LaunchDaemons/kkmserver.service.plist ``` -------------------------------- ### GUID Generation Source: https://kkmserver.ru Helper function to generate a unique identifier. ```javascript // Герерация GUID function guid() { function S4() { return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1); } return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4()); } ``` -------------------------------- ### Marking Code Validation JSON Response Source: https://kkmserver.ru Example of the JSON response returned by the server after executing the ValidationMarkingCode command. ```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 } ``` -------------------------------- ### Удаление kkmserver (rpm-based) Source: https://kkmserver.ru/WiKi/InstallLinux Команда для удаления kkmserver на rpm-based дистрибутивах. ```bash sudo yum remove kkmserver ``` -------------------------------- ### GetGoodCodeData command example with supported barcode formats Source: https://kkmserver.ru JavaScript example for the GetGoodCodeData command. It prepares a Data object with Command, BarCode, and optional IdCommand, then calls ExecuteCommand. The scanner must be configured to not swallow control characters. Supported barcodes include EAN8, EAN13, EAN14, GS1, fur, tobacco, EGAIS-2, EGAIS-3. The response JSON includes parsed data, product code type, and errors. ```text Команда предназначена для проверки корректности сканировани ШК кода маркировки товар (он-же КИЗ он-же честный знак) Сканер нужно настроить так чтобы он при сканировании не проглатывал управляющие символы Поддерживаются ШК: Без идентификатора экземпляра товара: 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 (лекарство), в качестве разделителей полей строка "" "01086912345678902113234246791707011910AX785910BC" GS1, в качестве разделителей полей строка " " (с пробелом!!!!!!!) "0183525492885520210000000859314 91ee05 92r7fLjLdSQBRRL8KgReiJ0mgdFWhlR9gsfe1QS3ibhck=" GS, 1 в качестве разделителей полей строка " " "018352549288552021000000085931491ee0592r7fLjLdSQBRRL8KgReiJ0mgdFWhlR9gsfe1QS3ibhck=" 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" ``` ```javascript 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": "" //} } ``` -------------------------------- ### Удаление kkmserver (deb-based) Source: https://kkmserver.ru/WiKi/InstallLinux Команда для удаления kkmserver на deb-based дистрибутивах. ```bash sudo apt remove kkmserver ``` -------------------------------- ### Execute Marking Code Validation Command Source: https://kkmserver.ru Example of the data structure for the marking code validation command, including the PackageQuantity field and the unique IdCommand identifier. ```javascript PackageQuantity: null, }, ], // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды IdCommand: "g34344gs4ws", }; // Вызов команды ExecuteCommand(Data); ``` -------------------------------- ### Открыть смену на ККМ (OpenShift) Source: https://kkmserver.ru Функция для отправки команды открытия смены на сервер. Включает параметры идентификации устройства, данные кассира и уникальный идентификатор команды. ```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 //} } ```