За последние 24 часа нас посетили 22454 программиста и 1142 робота. Сейчас ищут 677 программистов ...

Kkm Server. Печать чека товара. Как прописать в чеке товар и QR код?

Тема в разделе "PHP для профи", создана пользователем Qist, 11 сен 2020.

  1. Qist

    Qist Новичок

    С нами с:
    11 сен 2020
    Сообщения:
    1
    Симпатии:
    0
    Используем 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");

    Data.NumDevice = NumDevice;
    Data.InnKkm = "";
    Data.KktNumber = "";

    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";
    Data.ClientAddress = "sochi@papa.com";
    Data.ClientInfo = "Везучий В.В. РЕ-125486";
    Data.ClientINN = "502906602876";
    Data.SenderEmail = "sochi@mama.com";
    Data.PlaceMarket = "kkmserver.ru";
    Data.TaxVariant = "";
    // Дополнительный реквизит пользователя тег ОФД 1084
    Data.UserAttribute = {
    // Наименование дополнительного реквизита пользователя тег ОД 1085
    Name: "Поле-тест",
    // Значение дополнительного реквизита пользователя тег ОФД 1086
    Value: "Тестовое значение"
    };
    // Дополнительный реквизит чека тег 1192
    Data.AdditionalAttribute = "Тест";


    Data.KPP = "782543005";


    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(
    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.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",
    4,
    1,
    "0104300943734342212413195240818240640291ffd092MDEwNDMwMDk0MzczNDM",
    // Единица измерения предмета расчета. Можно не указывать
    "пара",
    // Цифровой код страны происхождения товара (CountryOfOrigin) в соответствии с Общероссийским классификатором стран мира 3 симв. Тег 1230
    "156",
    // Регистрационный номер таможенной декларации (CustomsDeclaration) 32 симв. Тег 1231
    "54180656/1345865/3435625/23",
    // Сумма акциза (ExciseAmount) с учетом копеек, включенная в стоимость предмета расчета Тег 1229
    0.01,
    // Дополнительный реквизит предмета расчета тег 1191, Только для ФФД 1.1 !
    "Тест-доп.реквизит"
    );


    // DataStr.EGAIS = {
    // Barcode: "22N0000154NUCPRZ3R8381461004001003499NKAQ0ZBUVDNV62JQAR69PEV878RO93V",
    // Ean: "3423290167937",
    // Volume: 0.7500,
    // };


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



    // Наличная оплата (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 != undefined && Data.CheckStrings.Register != undefined) {
    Data.CheckStrings.Register.AgentSign = null;
    Data.CheckStrings.Register.AgentData = null;
    Data.CheckStrings.Register.PurveyorData = null;
    };
    };




    }
    ```
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.823
    Симпатии:
    736
    Адрес:
    Татарстан
    Ну судя по всему, вот тут
    Все же не единички надо (по крайней мере 2 первых параметра точно) а необходимые реквизиты, в частности номер устройства и тип чека...

    Ну и в остальное не вникал - надеюсь нужные параметры не из тестового примера а вы свои реальные и подставили....


    Ну и к php вопрос вообще не имеет отношения
     
  3. acho

    acho Активный пользователь

    С нами с:
    28 дек 2016
    Сообщения:
    854
    Симпатии:
    210
    Адрес:
    Санкт-Петербург
    1. В логах посмотри нет ли ошибок
    2. Для печати фискального чека в настройках устройства должен быть выбран параметр фискализации. Для тестов там есть режим печати нефискального чека
    --- Добавлено ---
    всё же скорее всего единички. Что тип чека, что номер устройства - целочисленные значения
    --- Добавлено ---
    Код (Text):
    1. Data.ClientAddress = "sochi@papa.com";
    2. Data.ClientInfo = "Везучий В.В. РЕ-125486";
    3. Data.ClientINN = "502906602876";
    Это убирай. Это данные только для выигрышей, лотерей и тд.
    --- Добавлено ---
    А ещё - тип чека 1 - это чек возврата. Он может быть аннулирован в том случае, если в ККМ нет денег, т.е. не было продаж
    --- Добавлено ---
    Код (Text):
    1. // Наличная оплата (2 знака после запятой)
    2. Data.Cash = 100;
    3. // Сумма электронной оплаты (2 знака после запятой)
    4. Data.ElectronicPayment = 0.01;
    не все кассы умеют одновременно и наличными, и кешем принимать
    --- Добавлено ---
    Данные о поставщике я бы тоже убрал. И вообще половину данных ненужных.
     
  4. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.823
    Симпатии:
    736
    Адрес:
    Татарстан
    сомнения именно что у них устройство имеет №1
     
  5. acho

    acho Активный пользователь

    С нами с:
    28 дек 2016
    Сообщения:
    854
    Симпатии:
    210
    Адрес:
    Санкт-Петербург
    Номер устройства это не какой-то номер устройства на компе, а порядковый номер подключённого к KKMServer устройства. Начинается с единицы. Чаще всего к серверу подключается только одна ККМ
    --- Добавлено ---
    И к тому же, если чек аннулирован - значит касса его всё же пыталась обработать