Каждый день в магазинах мы видим разные кассы — всевозможные embedded-решения с загадочными кнопками. За такими кассами сидят кассиры, которые то и дело кричат «Галя, у нас отменааааа». Это неудобно и для кассиров, и для покупателей.


Интерфейс касс со временем становится более user friendly, а Гали уже нужны меньше, но касса всё еще остается громоздким и сложным артефактом.



Меня зовут Сарбеев Владимир, я Android-разработчик в МоемСкладе. И я уверен, что касса может быть компактной и удобной. Более того, в кассу можно превратить свой смартфон.


В МоемСкладе мы создали мобильное приложение Касса МойСклад. Это полноценная касса внутри смартфона.


Работает она так: после авторизации кассир может открывать и закрывать смены, продавать товар напрямую или по предварительным заказам, учитывать наличные. К Кассе можно подключить устройства, которые требуются в работе. Они на фото:



1 — касса Атол Sigma 10; 2 — приложением не поддерживается, интеграция с сотрудниками
3 — касса Атол 11Ф; 4 — терминал Verifone VX820; 5 — терминал PAX S90
6 — касса Штрих-Нано-Ф; 7 — касса Атол 15Ф; 8 — касса Штрих-ON-LINE
9 — сканер штрихкодов; 10 — терминал PayMe; 11 — касса MSPOS-K


Смартфон сам по себе не может распечатывать кассовые чеки и принимать оплату банковской картой, поэтому нужны кассы и терминалы оплаты. А аппаратный сканер требуется, если камера смартфона не подходит для полноценной замены сканера штрихкодов.


Всевидящее око


Еще до релиза Кассы МойСклад мы решили, что камера камерой, но у пользователя может лежать аппаратный сканер штрихкодов, который он захочет использовать.


Мы умеем работать со сканерами в виде обыкновенного HID (human interface device). После считывания штрихкода мы получаем от сканера последовательность символов. Это, пожалуй, самая простая интеграция. Самая простая, если бы не два «но».


Во-первых, будучи «из коробки» сканер может передавать совсем не то, что должен. Во-вторых, не все модели сканеров сигнализируют нам, что считывание штрихкода завершено.


Первое «но» решается просто: если сканер начинает передавать не то, что он должен отсканировать, нужно найти инструкцию к сканеру и настроить его с помощью сервисных штрихкодов. Обычно инструкция идет в комплекте на бумаге или в электронном виде у производителя. В ней после описания доступных настроек есть штрихкоды, которые сканируют в нужной последовательности. Так можно настроить сканер, как нужно вам.


Второе «но» — более серьезная проблема. Зоопарк сканеров обширен, и далеко не все устройства показывают окончание считанной строки. Для решения этой проблемы есть два варианта. Первый — с помощью тех же сервисных штрихкодов выставить настройку, которая будет передавать символ переноса строки после считывания. Если не повезло с моделью и первый вариант не подходит, можно задать сканеру суффикс. С помощью сервисных штрихкодов добавить в конец считанной последовательности символ, по которому можно поймать окончание ввода.


Подключаем кассу


Итак, приложение есть, сканер штрихкодов подключили, но вот чек напечатать всё еще не можем. Для этого нам нужна сама касса. В МоемСкладе поддерживаем ККТ Атол и Штрих, еще MSPOS, о ней расскажу в другой статье.


Когда дело дошло до интеграции с кассой, объем железного кода стал неумолимо расти. Мы решили всю работу с подключаемым оборудованием вынести в отдельную библиотеку. Само же кассовое приложение стало клиентом, подтягивающим библиотеку через gradle.


В зависимости от модели подключаться можно по USB, Bluetooth или Wi-Fi. А еще по протоколу UART, который представляет из себя жесткую сцепку кассы и Android-устройства в одном корпусе. Также у разных вендоров радикально разнятся реализации подключения клиента к кассе. Java-обертка поверх нативных библиотек .so, надстройка над опенсорсной библиотекой jPOS и даже фискальное ядро, доступ к которому осуществляется через службу с AIDL-интерфейсом (язык определения интерфейсов Android).


При первых попытках интеграции одного устройства от одного производителя нас устраивала схема взаимодействия KKM Device:



Но с учетом количества реализаций драйвера, способов подключения и единообразия функционала мы решили переосмыслить работу с железом. В итоге предыдущая схема пришла к такому виду:



Т — это конкретная низкоуровневая обертка над драйвером


Device Manager скрывает от клиента реализацию подключения. Достаточно создать мастера подключения, который потребует последовательно выбрать производителя кассы, тип подключения, задать настройки. В случае успешного подключения он возвращает нам объект, который реализует интерфейс KKMDevice.


KKMDevice скрывает подробности работы с драйвером отдельного вендора. Wrapper’ы каждого конкретного производителя содержат в себе ссылку на драйвер T и делегаты, реализующие определенные наборы функций. Например, FiscalDelegate, NonFiscalDelegate, DeviceInfoDelegate.


Отмечу несколько общих моментов интеграции:


  • Обязательно следите за обновлениями драйверов. Помимо багфиксов и увеличения скорости работы, нередко происходят качественные скачки. Поверьте, переход от низкоуровневых HEX-команд к Java-like интерфейсу, а от него к json-заданиям сильно облегчает работу и делает код понятнее.
  • На время выполнения операций блокируйте UI прогресс-баром. Примета гласит, что нажатая несколько раз подряд кнопка «Оплатить» при подключенной ККТ — предвестник критикала в таск-трекере.
  • Следите за тем, чтобы любые операции с ККТ выполнялись строго последовательно. «Удачно» возникшая гонка потоков может повесить ККТ, а крутящийся при этом прогресс-бар — еще и приложение.
  • Если нужно настроить передачу данных оператору фискальных данных, советую выбирать максимальное количество параметров из предустановленного списка. Потому что ввод данных вручную при боевом фискальном накопителе — отличный способ выстрелить себе в ногу, но на стороне пользователя при использовании приложения.

Фискальный накопитель — это устройство, которое собирает и обрабатывает информацию о торговых операциях. Может стоить дороже самой кассы. Если накопитель настроить неправильно, может потребоваться технологическое обнуление. Для этого вскрывают корпус кассы, сразу же слетает гарантия.


Эквайринг


Итак, у нас есть интерфейс кассы, мы можем отсканировать товар по штрихкоду и распечатать чек. Осталось добавить возможность платить картой.


В нашем приложении интегрирована поддержка терминалов PayMe и Inpas. Первые подключаются по Bluetooth, а вторые можно подключить по USB или через Wi-Fi.


Схема подключения терминалов оплаты очень похожа на подключение ККТ, разве что требуется дополнительная авторизация.


Но есть и серьезные отличия — в обработке нештатного поведения устройства. Так в ККТ любая операция либо успешно прошла, либо нет. Если операция завершилась неудачей, ее можно попробовать провести еще раз или отменить. Всё остальное происходит без вмешательства.


В случае с терминалами необходимо контролировать возможные прерывания процесса оплаты на любом шаге. Может не считаться банковская карта или на карте окажется недостаточно средств. Можно не дождаться ответа от банка или дождаться, но получить 5хх HTTP-код в ответ. А еще на любом из этапов может просто отвалиться связь.


Более того, вы не сможете выпустить адекватно работающее приложение с поддержкой терминалов Inpas без сертификации. В сертификацию входит проверка наличия и корректной работы всех пользовательских операций терминала и обработка таких событий, как отключение от сети после того как покупатель уже приложил к терминалу карточку.


При тестировании терминала надо учитывать, с каким банком или платежной системой он сопряжен. В некоторых случаях даже в режиме разработки возврат денег осуществляется только через личный кабинет учетной записи, а не автоматически.


Еще нужно помнить, что в процессе оплаты принимает участие и банк. К примеру, отсутствие slip-чека может возникнуть, если нет нужной настройки в личном кабинете банка.


Заключение


Подключение различных устройств к Android-приложению — сложный, но интересный процесс. Мы рассказали о нем в целом, описать все препятствия, конечно, нереально.


Если у вас появились вопросы, буду рад ответить на них в комментах. Если вопросов наберется на отдельную статью, напишем :)

Комментарии (26)


  1. HappyGroundhog
    08.08.2019 16:00
    +1

    «Галя, у нас отменааааа».
    Мне вот интересно, а как эта проблема решена у вас? Или вы искренне считаете, что звать Галю нужно только из-за криворукости разработчиков касс?)


    1. Jeka178RUS
      08.08.2019 16:13

      А кстати это действительно интересный вопрос, если вы обладаете знанием какими рут правами обладает Галя и почему эти элементарные действия не может сделать Лена на кассе расскажите пожалуйста будет интересно. Сейчас я все это вижу как дикий идиотизм


      1. mig126
        08.08.2019 16:23

        По разному. Где то это паранойя руководства, где то ограниченный функционал кассы(нельзя по нормальному раздать права).
        На современных онлайн кассах(тот же эвотор любой модели, работающий на андроид), отмена делается одним нажатием пальца.


      1. HappyGroundhog
        08.08.2019 19:39

        Как уже ответили ниже, чаще всего это комиссионное выполнение критичного действия. Иначе кассир сможет втихую отменять товар и по сути приворовывать.


        1. Jeka178RUS
          08.08.2019 19:43
          -1

          Непонимаю как отмена товара в чеке позволит кассиру, что-то украсть. С той же легкостью кассир может пойти в зал и взять все что ему нужно.


          1. CrushBy
            08.08.2019 20:36
            +1

            Для этого на зале есть охрана, которая его не выпустит с этим товаром (как и любого другого покупателя). Там есть разные схемы воровства. Например, пропикивать товар знакомому, а потом сделать отмену и взять денег гораздо меньше. Или дождаться покупателя, который заплатит, но не возьмет чек, сделать ему отмену, а деньги забрать себе. Ну и т.д.


            1. unfilled
              09.08.2019 07:07

              «Отмена» уже пробитого чека — это, всё-таки, другая операция, которая тоже сопровождается кассовым чеком. Знакомому тогда проще вообще не пропикивать половину товара, чем заморачиваться с «пикнули -отменили».


              1. CrushBy
                09.08.2019 09:05
                +1

                Речь идет именно об отмене до закрытия чека. Если кассир не будет пропикивать, то это будет заметно сразу (охрана за этим тоже следит). А тихую отмену в конце охрана не заметит, если не будет смотреть камеры и сверять с тем, что творится на кассе.


          1. saboteur_kiev
            09.08.2019 03:08

            Пробивание товара на кассе — означает, что выручка в кассе должна соответствовать товару. Кассир периодически сдает всю выручку со своей кассы, и она должна соответствовать чекам. Если же деньги уже получены, а товар отменен — в кассе лишнее. Можно присвоить.

            Кассир — это неквалифицированный персонал, зарплаты низкие.
            Даже на тех недодаваемых 5 копейках, в крупных супермаркетах за день можно наварить себе небольшую премию, а за месяц — 10-20% зарплаты.
            Поэтому подобрать лишнее не гнушается практически никто.


      1. saboteur_kiev
        09.08.2019 03:02

        Если вы внимательно пронаблюдаете за действиями «Гали», вы увидите, что она просто проводит своей персональной карточкой по автомату, собственно подтверждая операцию.
        Ничего сложного в этом действии нет, любой наблюдательный человек понял бы смысл операции с первого-второго раза.


      1. Turilion
        10.08.2019 20:27

        Дело не в криворукости рядового персонала, а отсутствии доверия. Сам работаю в достаточно крупном ритейле, и так же как у многих, права на сторнирование и отмену документа отрубили сразу. И ещё много чего другого. но тем не мене 1-2 раза в месяц кто ни будь из кассиров придумывает новый способ схитрить, обсчитать, украсть… Так что «Галя» очень даже нужная схема…


    1. CrushBy
      08.08.2019 16:41
      +1

      Чаще всего «Галя, у нас отмена» делается, чтобы несколько человек были в курсе того, что идет отмена. Иначе какой-нибудь кассир будет тихенько отменять товары знакомому, и, по сути, воровать товар. Программа тут ни при чем.


    1. imposhibru Автор
      08.08.2019 18:28

      Наши пользователи — это микро- и малый бизнес. Ситуация, когда в магазине несколько касс и существет старший кассир который контролирует работу остальных — не наш кейс. Для контроля возвратов, у нас существуют другие инструменты: запрет на возврат из закрытых смен, моментальное уведомление руководителя при проведении возврата через push-уведомления или email.


      1. tvr
        10.08.2019 12:12

        моментальное уведомление руководителя при проведении возврата через push-уведомления или email.

        И каков физический смысл этого действа?


  1. mig126
    08.08.2019 16:14

    Классический жёлтый заголовок. Как превратить смартфон в онлайн кассу, я так и не увидел.
    Хотя я знаю такие приложения есть.
    И нет, онлайн касса на андроид и смартфон это не одно и тоже. Они все современные на андроид(атол, меркурий и другие динозавры, которые до сих пор выпускают клавишные кассы с трёхстрочным дисплеем, с которыми проблема «Гали», до сих пор актуальна).


    1. osipov_dv
      08.08.2019 17:33

      ответ очевидный — никак, в любой кассе есть фискальный накопитель, без него ну никак нельзя.


    1. imposhibru Автор
      08.08.2019 18:36

      В статье речь идет как раз про локальные кассы, когда все оборудование подключается к смартфону.
      Если нужна именно онлайн-касса, то у нас есть интеграция с сервисом «Атол Онлайн» и мобильное кассовое приложение тоже поддерживает такой вариант работы.


    1. Scrayer
      09.08.2019 06:20

      Если я Вас правильно понял, то приложение, о котором речь — позволяет приложив 2 телефона друг к другу сделать перевод через гугл пей? В таком случае не подскажите данное приложение?


      1. DaemonGloom
        09.08.2019 09:23

        Знаю о подобном приложении через Samsung Pay, но оно пока только в Канаде работает. Появилось недавно, так что в другие страны ещё не успело прийти.
        www.xda-developers.com/samsung-pay-touch-galaxy-phone-payment-terminal


        1. mig126
          09.08.2019 10:11

          В Китае давно работает. На одном приложение выводит QR код, второй его расшифровывает и перечисляет определённую сумму на определённый счёт.
          Не нужно ни каких фискальных регистраторов(т.к. всё и так идёт через банк), сканеров и т.п.
          У нас в России есть приложения фактически превращающие смартфон в онлайн кассу, только всё равно нужен фискальный регистратор(и не важно что все операции могут идти через банк, такой уж закон).


  1. gravity
    08.08.2019 16:54

    Извините, немного не понял следующие моменты:
    Мне придётся иметь свой полноценный кассовый аппарат?
    Совместимость поддерживается только с 5-ю моделями?
    Поддерживаются только фискальные регистраторы?


    1. imposhibru Автор
      08.08.2019 19:14

      Для пробития кассовых чеков нужнен будет фискальный регистратор. Кассовый аппарат с монитором и клавиатурой не понадобится. Ну или, как я написал выше, можно использовать поддерживаемую у нас интеграцию с онлайн-сервисом.
      По поводу поддерживаемых регистраторов приведу ссылку на статью, чтобы не забивать комментарии списком.
      И да, помимо фискальных регистраторов наше приложение поддерживает ряд смарт-терминалов.


      1. gravity
        08.08.2019 20:32

        Тогда что Вы понимаете под термином «Кассовый аппарат»? Я понимаю зарегистрированный в ФНС принтер с ФНом внутри, который способен выдавать чеки.


        1. imposhibru Автор
          09.08.2019 11:36

          Кассовый аппарат, как цельное изделие — это не только фискальный регистратор, включающий принтер чеков и ФН. Нужны же еще устройства ввода и отображения информации и способ передавать информацию об операциях фискальному регистратору.


  1. 1div0
    08.08.2019 20:35

    Заголовок вводит в заблуждение, така как полноценная касса должна удовлетворять как минимум следующим критериям:


    1. Выполнять роль фискального накопителя
    2. Должна уметь отправлять чеки в ОФД.

    Так как от кассы не всегда требуются бумажные копии чеков, то в теории возможно сделать кассу из смартфона. Но в статье мы видим другое: способ подключиться к кассе через смартфон.


    1. imposhibru Автор
      09.08.2019 11:59

      Спасибо за комментарий, но перечисенные критерии относятся к фискальным регистраторам. Для полноценной кассы нужны так же интерфейс ввода и отображения информации. Плюс, желательно, возможность работы с номенклатурой товаров и услуг, если не хочется вбивать каждую позицию чека вручную.