Мы решили избавить наших клиентов от всего этого ужаса, сделав сервис, регистрирующий все автоматически чуть ли не в один клик. Об этом сейчас и расскажем.
Зачем нам это
Вы уже поняли, регистрация кассы — утомительный многоступенчатый квест, но это не единственная проблема. На каждом этапе подстерегает зоопарк интерфейсов, формы которых предстоит заполнить вручную регистрационными данными для каждой кассы, а также полный набор соответствующих багов (отдельный привет требованиям налоговой по использованию браузеров IE, Яндекс.Браузер или Спутник). Сотни возможностей ошибиться, испортить процедуру и начать сначала. А если устанавливаешь 5-10 касс, шанс ошибки при вводе одних и тех же реквизитов вырастает в разы. Не говоря о непродуктивных тратах времени и выяснении, почему же личный кабинет налоговой отказывается принимать токен, который прекрасно «проглатывал» буквально вчера.
И когда мы прочувствовали на себе всю тяжесть вышеописанной трагедии, решили взяться за разработку.
Этапы регистрации
В регистрации кассы задействовано сразу несколько сторон. Это налоговая служба (ФНС), ОФД — оператор фискальных данных, через которого кассы взаимодействуют с налоговой, удостоверяющий центр, выпускающий электронные подписи и, как правило, немного растерянный, потерявшийся в бюрократических перипетиях предприниматель. Мы хотели вмешаться в их взаимоотношения, да так, чтобы взять все сложности на себя.
Условно процедура разбивается на два этапа:
Регистрация кассы — данные конкретного аппарата отправляются в ФНС, а в ответ приходит регистрационный номер.
Фискализация — активация кассы при помощи регистрационного номера машины, присвоенного ФНС.
Прежде всего, мы отправились к нашим партнерам, чтобы проработать с ними первый этап.
API для ФНС
Мы не первыми задумались об автоматизации регистрации. Многие говорили, что делают нечто в этой области, что разработка ведется, но готового внешнего интерфейса не было ни у кого. Одним из операторов фискальных данных был предоставлен API — почти готовый для взаимодействия с налоговой.
На тот момент с помощью протокола было отправлено всего около 80 тестовых заявок. Мы поверили в то, что вскоре интерфейс заработает на полную мощность, и начали реализацию и тестирование на «заглушках».
Выйдя на прод, мы поняли, что наши тесты и реальная заявка различаются, словно день и ночь. «Заглушки», что мы получили от ОФД, включали в себя только success mock, воспроизводили успешный сценарий. В действительности достичь того самого «success» оказалось непросто.
В хитах значились: заявки на стороне партнеров, необрабатываемые по нескольку дней, отсутствие обратной связи от ФНС и ОФД, ошибки подписи и наша любимая «неизвестная ошибка». Протокол ФНС оказался плохо документирован и, зачастую, отвечал не специфицированными отказами, по которым не ясно, чем они вызваны. Четкой спецификации не существует до сих пор. Так что первое время мы тестировали протокол, и, совместно с ОФД, принимали решения, как реагировать на те или иные ответы ФНС в конкретных случаях.
API для кассы
Пока часть команды изучала поведение систем ФНС на практике, работа не стояла на месте. Параллельно мы устроили переговоры с производителями касс, предложили им реализовать обмен данными от нас до их платформы, от платформы до кассы и в обратном порядке для наладки автоматической фискализации касс.
Мы отобрали пару универсальных моноблочных решений. Кассы Эвотор с сенсорными экранами и Дримкас — для тех из клиентов, что привыкли к старым добрым кнопкам и считают дополнительный функционал избыточным. Модели разные: и со сканером, и без.
Если у ОФД был наготове собственный API, то для кассовых подрядчиков его пришлось разрабатывать с нуля. Иначе сделать так, чтобы все регистрационные данные приходили на кассу автоматически, без ручного ввода, невозможно.
Коллеги добились успеха, настроив взаимодействие через свою платформу, и вскоре были готовы: API для открытия личного кабинета клиента и проприетарный протокол для управления кассой.
Наши поставщики были первыми, кто настроил автоматическую подачу регистрационной информации на кассы. А вскоре API позволит так же легко снимать с учета и перерегистрировать кассы.
Теперь, когда мы ведем переговоры с другими кассовыми вендорами, то одним из ключевых требований становится именно поддержка этого интерфейса.
Анатомия авторегистрации
После того, когда мы научились работать с ФНС и реализовали с вендорами API для передачи регистрационных данных на кассу, пришло время связать это все в единую систему, наладить процедуру регистрации.
Это задача выбора верной архитектуры, которая позволила бы контролировать асинхронную регистрацию кассы и в ОФД, и у ФНС, и у вендора. Поскольку они отвечают на запросы с задержкой, процесс растянут во времени и имеет большое количество интеграций с внешними системами. Из-за этого нам пришлось написать на Java два приложения.
Непосредственно с ОФД и системами производителей касс общается Job service. Например, мы отправляем данные клиента в ОФД и ожидаем получить в ответ регистрационный номер.
Job service опрашивает статус заявки через определенные интервалы. Переспрашивает и переспрашивает, пока в ответ не придет результат. Регистрационный номер сохраняется, Job переводит заявку в следующую стадию и начинается фискализация.
Если первое время мы внимательно следили за прохождением заявок и вручную изучали каждую ошибку, что отдавала система, то теперь процесс автоматизирован.
Мы сразу определяем причину ошибки. А на случай массовых проблем настроили системы мониторинга, которые фиксируют аномалии, свидетельствующие о крупных сбоях у ФНС или ОФД. Клиент же узнает о проблемах в единственном случае: если в ответ на запрос мы получаем конкретный реджект — мотивированный отказ в регистрации.
Второе приложение, CashReg — система процессинга, где ведется статусная модель, представленная в реляционном виде.
Она разрабатывалась исходя из API, предоставленных вендорами и ОФД, и включала в себя все возможные переходы для каждого класса, участвующего в процессе регистрации. Статусная модель позволяет избежать внутренних ошибок и исключить отклонения от стандартного алгоритма обработки заявки.
Так, если заявка слишком долго находится в одном статусе, например, не получает регистрационный номер несколько часов, или ОФД в ответе укажет неверный stage или status заявки, СashReg рапортует об ошибке.
Конечно, для управления процедурой понадобилась админка. С ней работает группа поддержки торговых решений, обслуживающая и сопровождающая кассы во время регистрации. Сейчас этим занимается всего два сотрудника, но их рабочий интерфейс не сложный, а процесс подготовки кассы, благодаря отказу от ручного ввода данных, простой. Так что, мы можем быстро и просто масштабировать отдел.
Все три компонента регистрационной системы не подразумевают высоких нагрузок, потому они развернуты в виртуальных средах.
Как идет обработка заявки
Все это потребовалось, чтобы клиент, оставив заявку в личном кабинете, через несколько дней поставил за прилавок готовую к работе активированную кассу.
С точки зрения внутренней кухни волшебство авторегистрации выглядит немного сложнее. Оставив заявку в личном кабинете, клиент дает нам юридическое согласие на выпуск электронной подписи и прохождение всей процедуры от его имени.
Из банковских баз извлекается информация о компании, регистрационные данные по конкретному магазину и подписанту (например, генеральному директору). Они актуализируются в SPARK, проходят скоринг и поступают в мастер-систему по кассам.
Затем в CASHREG формируется заявка. Она отображается в виде новой задачи в админке сотрудника из группы поддержки торговых решений. Он видит, какие касса и фискальный накопитель нужны клиенту. Сотрудник находит на складе нужный аппарат, выбирает фискальный накопитель, штрих-кодит их серийные номера и подтверждает заявку. Так к ней привязываются конкретные устройства, что будут доставлены клиенту. В этот момент в ОФД поступает запрос: «сформируйте заявление о регистрации такой-то кассы, для такой-то фирмы».
Файл, присланный ОФД в ответ, удостоверяется электронной подписью и, с помощью API ОФД, отправляется в налоговые органы. Там кассе присваивают регистрационный номер.
Теперь полный пакет документов по кассе попадает к производителю кассового аппарата (да, они тут тоже задействованы). Параллельно в админке появляется задача — фискализировать ту самую кассу. Это значит, что сотрудник просто включает кассу. Система вендора «видит», что аппарат вышел на связь, и загружает в его память все необходимые регистрационные данные автоматически. Ошибки при ручном вводе исключены, одинаковые реквизиты попадают и в ФНС, и на кассу.
Касса печатает отчет о регистрации — то, ради чего все затевалось. Фискальные данные из отчета: дата печати, подпись, фискальный признак, служат подтверждением того, что касса готова к работе. Эти реквизиты снова отправляются в ОФД.
Сразу же после того, как ОФД сформирует отчет о регистрации, мы подписываем его за клиента, и готовая касса уезжает с курьером.
ОФД еще предстоит подготовить регистрационную карту, но ее можно не дожидаться. Она будет доступна в электронном виде в личном кабинете клиента через два-три дня.
Заключение
Чтобы реализовать этот проект, от привычных задач отвлеклось порядка двадцати сотрудников со всего банка и еще множество специалистов со стороны наших партнеров, ОФД и кассовых вендоров, но их старания не прошли даром.
Среднее время получения регистрационного номера, за исключением самых негативных кейсов, составляет три часа. В целом на всю процедуру уходит 5 – 6 часов. 90% регистраций завершается успехом. На данный момент уже обработано порядка 1000 заявок.
В общем, как вы поняли, мы у себя в компании любим подобные кейсы, которые могут серьезно упростить жизнь огромному количеству людей. Решая такие задачки чувствуешь, что делаешь что-то по настоящему полезное.
P.S. Если интересно, можете почитать, как мы сами запилили свой банкомат. Причем вместе с протоколами обмена данных.
Комментарии (19)
Rusli
13.08.2018 19:33Здорово, а схема оплаты и расценки? К сожалению, многие решения «за один клик» грешат тем, что потом за этот клик надо платить и платить и платить…
alexhott
13.08.2018 19:52+3По уму это должна была инициировать ФНС, а у нас как обычно ФНС только кучу требований генерирует, а потом все вынуждены тратить кучу времени на выполнение.
А так получается все конечно хорошо, только привязка к вам, к конкретному ОФД и к нескольким производителям касс.
Popadanec
13.08.2018 23:33Чистый эвотор тот еще кал(на счет фирменных прошивок от банков не знаю). И это сейчас. Год назад народ просто покупал новые другой фирмы, потому что из за простоев терялись куча денег.
Пока она одна и не нужна синхронизация товарной базы(хотя бы пары тысяч позиций) с компьютером все еще более менее. Если кассы две начинается мрак.
Marfapr
14.08.2018 09:52Вот хоть бы один пост про кассы и оказание онлайн услуг (продажа рекламы, копирайт, графика)
sunswordrie
14.08.2018 16:51sergey_belyakov подскажите пожалуйста в данной реализации получится людям сделать, чтобы у них была одна касса для офлайн рассчётов и для интернет магазина. У многих бизнесов с этим проблема, т.к. сейчас на рынке нет решений, которые бы это объединяли и это могло бы стать отличным предложением для малого бизнеса. Которому сейчас надо держать офлайн кассу, за которую когда — то ты получишь 18 тысяч вычета с налогов, платить за фискальный накопитель в этой офлайн кассе и за ОФД + если у тебя ещё интернет магазин и ты арендуешь, как правило именно так и бывает, облачную кассу за 2-3 тысячи в месяц + так же оплачиваешь фискальный накопитель и ОФД.
Заранее спасибо за ответ.sergey_belyakov Автор
15.08.2018 11:06В первую очередь это ограничение ФНС. Для них важно указывать какого рода эта касса — для онлайн магазина или оффлайн. Как только ФНС это поддержит — мы сделаем.
NerVik
15.08.2018 11:06а как вы выпускаете ЭП без подписи документов и личной явки будущего владельца этой ЭП?
sergey_belyakov Автор
15.08.2018 11:07Личная явка — приезд представителя на момент открытия РКО. + у нас свой УЦ
mrkizak
15.08.2018 11:08За 5 дней, 300+касс регал руками и это при почти 2х сутках простоя налога(сайт иногда отвечал но в течении минуты падал). Решение интересное но не привязка к офд и банку не практично. Хотя реализация от «А давайте...» до «Вот, работает. Вроде...» увлекательная и интересная!
nckma
15.08.2018 11:53Как мне кажется тиньков всегда славился нетрадиционными решениями.
Вы бы взяли и реализовали нетрадиционный сервис приема платежей вроде такого апи для магазинов где бы использовалась одна касса для 1000-10000 компаний.
Вы может скажете, что это невозможно.
Но почему бы и нет?
Конечно банк не может продавать товар от имени сторонней неизвестной фирмы.
Но банк может оказывать услуги по приему платежей.
Банк может в своем чеке (клиент получает чек не от магазина а от банка) написать:
«Оплата услуги приема платежа по поручению фирмы ООО Рога и копыта за товар по списку...»
После приема платежа банк как и прочие агрегаторы делает безналичный перевод фирме рога и копыта и забирает себе комиссию.
Вроде как кажется странно, но где здесь «незаконно»? Кажется все по закону. И клиент получает чек и компании избавляются от мороки с кассами и работают только в безнал что абсолютно законно — касса одна на всех для 1000 компаний.
Это особенно актуально для самых мелких интернет магазинов с редкими единичными покупками. Сейчас такие магазины даже кассу не очень могут себе позволить, а так остались бы в белом.dimatl
15.08.2018 14:42Так вообще нельзя. Касса не может принадлежать банку, должна числиться за ооо и стоять там где записано в налоговой. И ещё млрд причин почему так делать нельзя.
nckma
15.08.2018 14:51Ну хорошо, может некое ООО принимаеть платежи за услугу и за это выдавать чек?
Может ли ООО оказывать услуги посредника в приеме платежей для других компаний?
Может ли ООО оказав услугу посредника перечислить партнеру безналичный платеж?
Думаю все это реально и возможно. Если толковый юрист в штате есть.dimatl
16.08.2018 14:58яндекс.касса?
nckma
16.08.2018 15:34В том то и дело, что нет.
Наверное могла бы сделать, но нет у них такого.
Яндекс касса не выдает чеки за клиентов — интернет магазины, так как не яндекс продает товар, они просто не могут выдавать чеки за кого-то за чей-то товар. Поэтому физически касса обязана стоять у каждого магазина своя даже прикручена яндекс касса к магазину. Хоть ты даже продаешь собственные магкие игрушки по 100 рублей пять раз в год — нужна онлайн касса стоимость которой в год не менее 10 тыс (офд+фн). Вот как этого избежать?
Я же говорю о другом.
Конечно тут небольшое жульничество.
Оператор приема платежей хоть яндекс касса, хоть тиньков или кто другой (эдакий стартап на грани юридических коллизий в законе) теоретически могли бы иметь одну физическую кассу на много компаний и выдавать чек, но не на проданый товар (этого они не могут сделать), а на услугу по приему платежа по поручению 3й стороны, ООО Рога и копыта.
Тогда покупатель вроде бы и чек получил по закону и в чеке даже может быть прописан список товаров, но позиция в чеке всего одна «услуга по приему платежа» и при этом сам яндекс или кто-там не продают товар, а только оказывают услугу указанную в чеке.
Я не вижу что тут незаконного, но возможно налоговая будет удивлена. Вероятно такому стартапу понадобятся зубастые юристы.
Bork1507
16.08.2018 11:19Здравствуйте.
Не могли бы Вы по-подробнее рассказать про механизм передачи в кассу регистрационных данных? Вы передаете эти данные в каком-то своем формате или поддерживаете в вашем решении протоколы производителей ККТ?
Alter2
Прекрасно!
Добавить бы в этот же интерфейс простую регистрацию-дерегистрацию юрлица с автоматическим открытием счета и отправку налоговой отчетности одним кликом, и предпринимательством станет заниматься реально просто.
Главное чтобы сама налоговая служба не попыталась устранить конкурента.
PavelNN
Кстати, у них есть такой сервис — подготовка документов для регистрации ИП и ООО. (Скорее всего в налоговую идти придется, онлайн отправить документы нужна ЭЦП)
Счет само собой могут открыть после регистрации юрлица — банк всё-таки.
Плюс бесплатное ведение бухгалтерии предлагают.
Осталось связать воедино всё.
sergey_belyakov Автор
Сервисы вот тут: www.tinkoff.ru/business/services
usbstor
сейчас регистрация юрлица и так проста. кстати, сервисы онлайн-бухгалтерии оказывают такую услугу, но нужна электронная подпись.