Как мы запустили регистрацию касс за наших клиентов

Согласно поправкам к 54-ФЗ, с июля этого года практически все торговые предприятия обязаны использовать онлайн-кассы, передающие данные через интернет в налоговую службу. Чтобы обзавестись таким аппаратом, придется купить кассу и фискальный накопитель, подписать договор и оплатить услуги оператора фискальных данных, зарегистрироваться в двух личных кабинетах ФНС и ОФД, вбить реквизиты в кассу, получить бумажный отчет о регистрации. Ну, а еще понадобится электронная цифровая подпись, иначе придется приехать в ФНС и лично отстоять в очереди.

3a9fb39b680344c3f892804eb41b1a11.png

Мы решили избавить наших клиентов от всего этого ужаса, сделав сервис, регистрирующий все автоматически чуть ли не в один клик. Об этом сейчас и расскажем.

Зачем нам это


Вы уже поняли, регистрация кассы — утомительный многоступенчатый квест, но это не единственная проблема. На каждом этапе подстерегает зоопарк интерфейсов, формы которых предстоит заполнить вручную регистрационными данными для каждой кассы, а также полный набор соответствующих багов (отдельный привет требованиям налоговой по использованию браузеров IE, Яндекс.Браузер или Спутник). Сотни возможностей ошибиться, испортить процедуру и начать сначала. А если устанавливаешь 5–10 касс, шанс ошибки при вводе одних и тех же реквизитов вырастает в разы. Не говоря о непродуктивных тратах времени и выяснении, почему же личный кабинет налоговой отказывается принимать токен, который прекрасно «проглатывал» буквально вчера.

czbkqnhvog24qqgwodhckwfyhew.png

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

Этапы регистрации


В регистрации кассы задействовано сразу несколько сторон. Это налоговая служба (ФНС), ОФД — оператор фискальных данных, через которого кассы взаимодействуют с налоговой, удостоверяющий центр, выпускающий электронные подписи и, как правило, немного растерянный, потерявшийся в бюрократических перипетиях предприниматель. Мы хотели вмешаться в их взаимоотношения, да так, чтобы взять все сложности на себя.

Условно процедура разбивается на два этапа:

Регистрация кассы — данные конкретного аппарата отправляются в ФНС, а в ответ приходит регистрационный номер.

Фискализация — активация кассы при помощи регистрационного номера машины, присвоенного ФНС.

Прежде всего, мы отправились к нашим партнерам, чтобы проработать с ними первый этап.

API для ФНС


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

На тот момент с помощью протокола было отправлено всего около 80 тестовых заявок. Мы поверили в то, что вскоре интерфейс заработает на полную мощность, и начали реализацию и тестирование на «заглушках».

Выйдя на прод, мы поняли, что наши тесты и реальная заявка различаются, словно день и ночь. «Заглушки», что мы получили от ОФД, включали в себя только success mock, воспроизводили успешный сценарий. В действительности достичь того самого «success» оказалось непросто.

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

API для кассы


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

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

ror7dcretvhsilz3yiw12judrxi.png


Если у ОФД был наготове собственный API, то для кассовых подрядчиков его пришлось разрабатывать с нуля. Иначе сделать так, чтобы все регистрационные данные приходили на кассу автоматически, без ручного ввода, невозможно.

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

wy5hhrv-agl7qmya0x9pnpbppde.png

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

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

Анатомия авторегистрации


После того, когда мы научились работать с ФНС и реализовали с вендорами API для передачи регистрационных данных на кассу, пришло время связать это все в единую систему, наладить процедуру регистрации.

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

Непосредственно с ОФД и системами производителей касс общается Job service. Например, мы отправляем данные клиента в ОФД и ожидаем получить в ответ регистрационный номер.

Job service опрашивает статус заявки через определенные интервалы. Переспрашивает и переспрашивает, пока в ответ не придет результат. Регистрационный номер сохраняется, Job переводит заявку в следующую стадию и начинается фискализация.

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

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

Второе приложение, CashReg — система процессинга, где ведется статусная модель, представленная в реляционном виде.

Она разрабатывалась исходя из API, предоставленных вендорами и ОФД, и включала в себя все возможные переходы для каждого класса, участвующего в процессе регистрации. Статусная модель позволяет избежать внутренних ошибок и исключить отклонения от стандартного алгоритма обработки заявки.

Так, если заявка слишком долго находится в одном статусе, например, не получает регистрационный номер несколько часов, или ОФД в ответе укажет неверный stage или status заявки, СashReg рапортует об ошибке.

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

Все три компонента регистрационной системы не подразумевают высоких нагрузок, потому они развернуты в виртуальных средах.

Как идет обработка заявки


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

f14777abe2e59529a31a321dcfbe01ca.png


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

36e5efccba0427be9fef8324a50323c3.png


Из банковских баз извлекается информация о компании, регистрационные данные по конкретному магазину и подписанту (например, генеральному директору). Они актуализируются в SPARK, проходят скоринг и поступают в мастер-систему по кассам.

ae4749b7824fe74ebc8ddefb2d952955.png


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

Файл, присланный ОФД в ответ, удостоверяется электронной подписью и, с помощью API ОФД, отправляется в налоговые органы. Там кассе присваивают регистрационный номер.

Теперь полный пакет документов по кассе попадает к производителю кассового аппарата (да, они тут тоже задействованы). Параллельно в админке появляется задача — фискализировать ту самую кассу. Это значит, что сотрудник просто включает кассу. Система вендора «видит», что аппарат вышел на связь, и загружает в его память все необходимые регистрационные данные автоматически. Ошибки при ручном вводе исключены, одинаковые реквизиты попадают и в ФНС, и на кассу.

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

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

dccsetgp8qnjvcijl84ra3n6vu0.png

ОФД еще предстоит подготовить регистрационную карту, но ее можно не дожидаться. Она будет доступна в электронном виде в личном кабинете клиента через два-три дня.

Заключение


Чтобы реализовать этот проект, от привычных задач отвлеклось порядка двадцати сотрудников со всего банка и еще множество специалистов со стороны наших партнеров, ОФД и кассовых вендоров, но их старания не прошли даром.

Среднее время получения регистрационного номера, за исключением самых негативных кейсов, составляет три часа. В целом на всю процедуру уходит 5 — 6 часов. 90% регистраций завершается успехом. На данный момент уже обработано порядка 1000 заявок.

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

P.S. Если интересно, можете почитать, как мы сами запилили свой банкомат. Причем вместе с протоколами обмена данных.

© Habrahabr.ru