Используем 54 ФЗ на благо домашней бухгалтерии +46


Когда очередная редакция Федерального Закона номер 54 «О применении контрольно-кассовой техники» вступила в силу, большая часть населения встретила её негативно.

Примерно вот так (18+, содержит нецензурную лексику)


Я был одним из немногих, кто прыгал, хлопал в ладоши и вообще радовался как ребенок.
Ибо ведение бухгалтерии из отдельного бытового труда превратилось в элементарнейшее дело.

Зачем?


Здесь не будет ответа на вопрос «зачем нужна домашняя бухгалтерия». Если вы не знаете ответа, то она вам не нужна.

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

Основа


Начнём с простого. Софт для ведения бухучета.

Есть миллиард программ для домашнего бухучета.

Я поверхностно ознакомился с общими трендами и отказался от специализированного софта.
Высокий порог вхождения, ограниченная поддержка, отсутствие возможности расширять с одной стороны и избыточный функционал — с другой, сомнительные перспективы и срок жизни софта…
В итоге мы с женой остановились на Google Docs. Бухгалтерию ведем с 2014 года и за это время не сорвались (хотя рождения ребенка и стало серьезным соблазном) и не пожалели о выборе инструмента.

Выглядит все очень просто:
Три основных листа:
Категории — список категорий для валидации ввода
Текущий месяц — чтобы не теряться
Текущий год — скидываем сюда текущий месяц

Выглядит вот так (думаю, всё по скриншоту понятно):



Категории автоматически подставляются из соответствующего листа. Если ввести то, чего нет в списке — валидатор ругнется.

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

Вот так выглядит мой список категорий (он не идеальный, часть категорий дублируют друг друга, часть категорий являются подкатегориями других, но именно такой список сформировался за 4 года и покрывает наши семейные потребности по анализу расходов):

Лист: Категории
Сайт
Фрукты
Овощи
Специи
Бензин
Культурный отдых
Десерт
Продукты
Гигиена
Здоровье
Красота
Авто
Работа
Мясо
Спальня
Кухня
Техника
Подарки
Прихожая
Одежда_Обувь
Игры
Коммуналка
Хобби
Soft
Кошка
Рыба
Такси
Работа
Телефон
Техника
Посуда
Бытовая химия
Спорт
Канцелярия
Налоги
Мото
Сад
Интерьер
Безопасность
Кафе
Обслуживание и ремонт дома
Мебель
Секс
Путешествия
Покупка недвижимости
Дрифт
Рисование
Скульптура
Обучение
Готовая еда
Умный дом
Вело
Дети

Практика


В теории ведение бухгалтерии выглядит очень просто.

Ну чего нам стоит после покупки придти домой и быстренько ввести список купленных товаров в документ? Пара пакетов молока, буханка хлеба, печеньки…

Теория не учитывает поездки в супермаркеты, когда продукты покупаются сразу кучей…

И вот она — «горсть гвоздей»:



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

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

Причина простая, как 5 копеек: написать софт требует времени. И в тот момент было очевидно, что время потраченное на написание ПО способного более менее качественно распознавать все чеки и сформировать на их основе хоть сколько нибудь пригодные данные — лет 10 будет перекрывать ручное вбивание чеков.

Так было до 1 июля 2017 года. В этот день вступила в действие «та самая» редакция 54 ФЗ.
«Вот оно!», подумаля я, «Можно брать данные из чека, не вбивая их вручную»… А потом мы продолжили вбивать чеки руками. Потому что инерция, лень и консерватизм.

В феврале 2018 у меня родился сын… Это сильно поменяло приоритеты в делах.

Как итог — мы не находили времени, чтобы вести бухгалтерию.

Чеков накопилось огромное количество.

Ведрище гвоздей


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

Автоматизация


Пришло время поговорить о 54 ФЗ и о том, что он нам дает.

Этот закон обязывает продавцов проводить чеки через ОФД (Оператора Фискальных Данных). Если без умных слов — все кассы сливают чеки в интернет.

И к ним можно получить доступ.

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

К счастью, ФНС выпустили своё приложение для мобильных телефонов, которое может скачивать чеки.

Дело за малым — берем снифер, ставим на телефон и смотрим что там шлет приложение для скачивания данных.

А шлёт оно вот что
GET запрос по адресу:
proverkacheka.nalog.ru:9999/v1/inns/*/kkts/*/fss/{FN}/tickets/{FD}?fiscalSign={FPD}&sendToEmail=no
Заголовок содержит следующие обязательные поля:
«Authorization»: «Basic {BASE64(телефон: пароль)}»
Device-Id": "{Любая белиберда}"
«Device-OS»: «Android 5.1» — скорее всего тоже можно слать белиберду, не проверял.
«Version»: «2»
«ClientVersion»: «1.4.4.1»

Ответ в виде json, смысла приводить структуру не вижу, она простая и на практике её легко поймет тот, кому это будет актуально.

Ссылка на снифер
Ссылки на снифер не будет. Я взял первый попавшийся в гугл плее. Сработало всё отлично, но рекомендовать не могу. Стоит помнить, что для перехвата https трафика приложение устанавливает свои сертификаты и вообще достаточно активно хозяйничает в телефоне. Никакой уверенности в том, что приложение не содержит зловредного кода у меня нет. Поэтому если надо — гуглите и используйте сами на свой страх и риск.

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

Как я уже говорил выше — писать ПО для автоматизации имеет смысл только если затраты на написание перекрываются выигрышем от автоматизации.

Поэтому за код приложения мне немногосильно стыдно.

С другой стороны — приложение написано за несколько часов и прекрасно работает.

С помощью QZXing и веб камеры сканируем QR код, достаем из него ФП, ФД, ФПД и делаем запрос на содержимое чека.

Кстати, дорогая веб камера очень плохо работала в качестве сканера QR кода.

Я даже немного расстроился и уже хотел признать приложение непригодным для использования, т.к. на сканирование одного кода тратилось несколько минут, что совершенно неприемлемо.
Однако, ради эксперимента решил попробовать использовать в качестве сканера дешевую китайскую вебку… И, о чудо, она без проблем сканирует QR коды с чеков! Никак такого не ожидал… Полагаю дело в том, что у китайское вебки есть подсветка, бесполезная при обычном использовании, но неплохо работающая при близком просмотре чеков.

Приложение


Если вы вдруг дочитали досюда, вам вероятно интересно попробовать ПО для чтения чеков самостоятельно.

Категории хранятся в файле categories.txt



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

Нажимаем Request Bill, выбираем источник видеопотока для сканирования чека и сканируем чек, либо вводим данные вручную и жмём Manual, чтобы использовать введенные данные.

Если на видеопотоке удастся распознать данные, окно автоматически закроется и отправится запрос на чек.

То, что мы уже вводили подставляется автоматически:



Заполняем поля: все, кроме гарантии — обязательные.



После чего жмём Generate Result и получаем данные в текстовом виде, пригодном для вставки в редактор таблиц, также этот текст помещается в буфер обмена.



Автоматизация требует минимизации ввода данных. Поэтому всё что мы уже вводили сохраняется.
Покупаете что-то второй раз — все поля товара будут уже заполнены.

Всё введенное сохраняется в файле items.csv

Исходники приложения висят на GitHub

Там же в разделе releases можно забрать билд для линукса и винды. Под мак тоже без проблем собирается, но это уже не ко мне.




К сожалению, не доступен сервер mySQL