Казочка про автоматизацію бізнесу. Створюємо кишеньковий пРРО

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті.

Хоч вірте, хоч ні, якось жили собі в Україні напівдикі ФОПи. Жили та й горя не знали, щось собі добували-карбували, та майже все показували у деклараціях.

Як раптом, набігли вовкулаки-підозріваки. Глянули вони на ФОПів, що ті метушаться багато, а до гаю несуть мало, дістали з шароварів касовий агрегат та давай ним бити по тому майже, аж чекова стрічка навкруги полетіла. Щоб тією стрічкою геть усе до гаю прямувало, ані травинки-билинки мимо.

Заволали ФОПи, забігали. Такий вже ґвалт підняли, хіба що каструль на голову не напинали. Увесь ліс ту дискотеку бачив, навіть ті хто про ФОПів й не чув ніколи.

Вовкуляцтво подивилось на цей шармельшейх та перестало агрегатом розмахувать. Так недовго усіх перелякати, що ті по ярах поховаються. Мабуть ще й пам’ять забутих попередників нагадувала, що у системі бруківка-чоло бува боляче, але це, як то кажуть, не точно.

Натомість стали здалеку показувать того свого агрегата. Галай-балай звикнуть ФОПчики до вигляду стрічки та наступного разу не так голосно будуть обурюватися.

ФОПлі походили-погледіли, — агрегат він тільки біля носа страшний, — пробуркотіли «ба ніт, здалося» та й розійшлися.

Вовкулястам давати задній не личить — що вилетіло, то сокирою вже назад не заженеш. Побачили маненьких ФОПця з ФОПчинею, що надають послуги за КВЕД 86.90, поставили їм на хвоста агрегат та сказали: «Гей, мікробізнес! На, стережіть. Ми за рік повернемося». Та й пішли собі.

«Йой!» — зойкнув мікробізнес, озирнувся по сторонах, але навколо вже нікого не було.

Мабуть всі чули, що спочатку усіх ФОПів 2-4 груп зобов’язали використовувати реєстратори розрахункових операцій (РРО), а потім відтермінували це рішення на рік. Проте мало хто чув, що відтермінування не стосується деяких видів діяльності, зокрема надання платних послуг у сфері охорони здоров’я (дивіться вищезгаданий КВЕД).

Так-так, ота крапельниця, що твоїй бабусі ставить чорноброва медсестриня (якщо вона, звісно, не мимогайка), чи то масаж, проста, ти собі думав, послуга, з 1 січня 2021 року мають підтверджуватися чеком. Додайте сюди психологів, психотерапевтів, логопедів, парамедиків... Всі-всі вони зобов’язані видавати вам чеки.

«На щастя», створили такі цікаві штуки, як програмні РРО. Віртуальний касовий апарат — мрія кожної домогосподарки, порядок роботи з яким схожий на натягування сови діджиталізації на глобус досвіду використання кас з минулого століття.

До суті. Моя дружина-психологиня зненацька стала зобов’язана видавати чеки. Я давно маю за гобі автоматизовувати її бізнес — до цієї всієї історії був в неї особистий вайберобот, що йому можна було відправляти денний дохід, а він у гугл-таблицю усе це складав, яка у свою чергу красиво вимальовує книгу доходів та вираховує розмір єдиного податку (3 група, 5%).

Нова реальність — нова схема роботи

Передусім, треба зареєструвати касира та касу у електронному кабінеті платників податків. На початку кожного робочого дня, перед першим здійсненням фіскальної операції, потрібно «відкрити зміну». Після кожного прийому пацієнта клієнта, маємо зробити чек, навіть якщо його прям тут ніхто не вимагає. Фізично друкувати той не обов’язково, можна лише дати посилання, що веде на сайт податкової, де можна переглянути, що чек дійсно трапився. Можна у вигляді QR-коду. Друкувати треба лише на вимогу (тобто термопринтер довелося все ж таки купити). Наприкінці дня робимо «службову видачу (вилучення)» зароблених грошей з уявної касової скрині. Це денний дохід, що записується до книги доходів (нарешті, можна вести не паперову). І наостанок треба обов’язково «закрити зміну».

Уважні емпати відчули слабке нервове свербіння. Так, вам не примарилося, в ілонмасківські часи, використовуючи діджитал-РРО, коли берете готівку, то вам здається, що ви її у кишеню кладете. Ні, вона потрапляє у віртуальну «касову скриню», яку потім треба віртуально спорожнити. Така от дичина: «зміна», «вилучення», сова, глобус. Витривалим та сильним духом скажу, що кожен чек повинен підписуватися ЕЦП касира.

Так от пішов я шукати рішення, що допоможе оце все неподобство спростити.

Пошук рішення

Далі у тексті є згадування комерційного сервісу, за яке мені ніхто не платить, тож не вважайте це рекламою. Хоча у разі, якщо вони мені зроблять знижку, то вважайте, не стидайтеся.

Спершу спробував використовувати державний пРРОсто. Не мені вам казати про якість та зручність програмного забезпечення, створеного за державний кошт. То ж я пішов по альтернативах. Хоча пРРО працюють із серпня минулого року, їх розвиток помітно загальмував після відтермінування.

Зупинився я на Checkbox з наступних причин:

  • автоматизація реєстрації каси та касира у ДПІ
  • веб-інтерфейс віртуального касового апарату — можна видавати чеки користуючись лише бравзером
  • можливість підписувати чеки ЕЦП без його завантаження (про «Checkbox Підпис» дивіться нижче)
  • автоматичне відкриття (при першій операції) та закриття (наприкінці дня) зміни
  • створення чеків у офлайн-режимі, коли сервер податкової недоступний
  • наявність API, документації до нього, без проблем надають доступ до тестового серверу

До недоліків я відношу:

  • відсутність додатку до смартфонів, хоча обіцяли
  • бот для мессенджеру теж обіцяли, але його досі немає, принаймні у вільному доступі
  • у веб-інтерфейсі неможливо налаштувати символьну ширину чеку
  • автоматичне закриття зміни без автоматичного спорожнення касової скриньки

Пам’ятаєте, я казав, що чеки підписуються ЕЦП? Державний пРРО вимагає, щоб я завантажив ключ у смартфон та на кожний чек вводив пароль від нього. Так, не зовсім на кожний, а на кожний вхід до додатку, але якщо чек у вас трапляється раз на декілька годин, то пароль стає необхідним щоразу.

Checkbox завантажує ключ у бравзер таким чином авторизуючи касира. Але разом з цим пропонує альтернативу — запустити так званий «Checkbox Підпис» на вашому комп’ютері. ЕЦП стає сервісом і Checkbox при створенні чеку, відкритті та закритті зміни (ці дії теж вимагають підпису) звертається до цього сервісу та отримує підпис усіх запитів до серверу податкової. Тобто ЕЦП можна не тримати під рукою, не носити з собою, а запустити додаток десь в себе у надійному середовищі, а Checkbox буде до нього звертатись по підписування. Щось на кшталт хмарного підпису (є такі), але одомашнений. Цей Підпис має підтримку Linux, що остаточно мене закохало у Checkbox.

Але до необхідної зручності ще далеко. Включити комп’ютер, відкрити бравзер, авторизуватись, створити чек — це доволі довгий ланцюжок дій. В ідеалі я хочу створювати чеки двома кліками, без необхідності авторизуватися кожного разу.

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

На жаль, користуючись API Checkbox напряму, в нас немає функції автоматичного відкриття зміни, але то не дуже прикра втрата з оглядом на отриману зручність.

Тож мені довелось написати:

  • телеграм-бот для створення чеків
  • Dockerfile для запуску «Checkbox Підпис»
  • скрипт для автоматичного закриття зміни
  • модуль для друку на термопринтері
  • модуль для занесення щоденного доходу до гугл-таблиці

Увесь код написаний за на Python 3.8, усі сервіси загорнуті у Docker-контейнери та розгортаються через docker-compose.

Переваги рішення:

  • створення чеку у два кліка: натиснути кнопку «Створити чек» та вибрати позицію
  • автоматичне відкриття зміни
  • автоматичне закриття зміни з віртуальним спустошенням касової скрині
  • автоматична фіксація доходу у гугл-таблицю
  • можливість фізичного друку чека + друк логотипу + вибір символьної ширини під різні моделі принтерів

Недоліки рішення:

  • тільки один касир та тільки одна каса
  • у одному чеці тільки одна позиція товару/послуги у кількості одна штука
  • потрібен сервер, де все це розгорнути
  • код не має коментарів (лаяти таких, хто так пише)
  • код не має тестів (за таке вже б’ють)
  • немає документації (спалити живцем)

Також до суттєвих недоліків можна віднести значну ускладненість системи з боку бекенду. Ланцюг створення чеку має набагато більше точок відмови, ніж хотілося б. Ось дивіться, який шлях проходить запит на створення чеку: Телеграм у сматрфоні -> Internet -> чат-бот -> Internet -> Checkbox -> Internet -> сервер ДПІ -> Internet -> Checkbox -> Internet -> чат-бот -> Internet -> Телеграм у сматрфоні. Це ще я виключив взаємодію з ЕЦП. Більш-менш захищені стосунки між Checkbox та ДПІ за допомогою офлайн чеків. Але якщо не буде зв’язку між вашим смартфоном та чат-ботом, чи між чат-ботом та Checkbox, то вся ця краса перестане працювати. Намагаюсь про це не думати...

Державний пРРО значно простіший у цьому сенсі. Там шлях такий: додаток у смартфоні -> Internet -> сервер ДПІ -> Internet -> додаток у сматрфоні. Мою схему можна спростити, викинувши з ланцюга Checkbox та взаємодіяти з ДПІ напряму, але тоді доведеться самотужки обробляти випадки, коли сервер податкової відпочиває. Буде потрібно створювати офлайн-чеки, заздалегідь резервуючи за собою їх номери, зберігати їх і потім відправляти до податкової, коли їхній сервер відлигає. Я ліпше віддам це на аутсорс. Плюс, хочу, коли все в мене зламається, мати змогу провести чек іншим способом, типу через веб-інтерфейс.

Для розгортання нам потрібні:

  • docker + docker compose
  • логін касира Checkbox
  • пароль касира
  • номер ліцензії віртуальної каси (для відкриття зміни)
  • файл ключа ЕЦП
  • пароль ключа ЕЦП
  • вибрати АЦСК ключа (його номер за списком «Checkbox Підпис»)
  • токен телеграм-боту
  • номер телефону адміністратора, що буде проводити перші налаштування

За бажанням можна налаштувати:

  • термопринтер для друку (сумісний з escpos)
  • гугл-таблицю для врахування щоденного доходу (треба створити сервіс-аккаунт)

Розгорнувши, адміністратор:

  • натискає /start у діалозі з ботом
  • бот просить авторизуватися
  • за номером телефону авторизуємо адміністратора, його ідентифікатор зберігається у базу sqlite
  • адміністратор дозволяє реєстрацію касира через команду /sign
  • касир авторизується зі свого пристрою
  • адміністратор надає роль CASHIER для касира командою /role
  • можна реєструвати декількох користувачів з роллю CASHIER, але всі дії будуть відбуватися від імені одного касира, чий ЕЦП підв’язаний до системи
  • також можна створити нових адміністраторів (роль ADMIN) чи наглядачів (роль SUPERVISOR), це ті, хто не створює чеків, лише отримує повідомлення про їхнє створення

Касир:

  • робить запит на створення чеку, натиснувши дві кнопки у чаті з ботом
  • бот за потреби відкриває зміну
  • бот створює чек
  • бот відповідає QR-кодом з посиланням на сайт податкової + посилання текстом (можете показати чи поділитися ним з клієнтом)
  • також бот надсилає текст чеку із кнопкою «Друкувати», тож за наявності принтеру можна роздавати гарні шматочки паперу з літерами та цифрами
  • повторити для кожного нового чеку

Виглядає це десь так:

Хоча чек тестовий, його можна перевірити на сайті податкової, якщо відсканувати QR-код та перейти за посиланням.

Наприкінці дня Ofelia викликає скрипт закриття зміни і денний дохід записується до гугл-таблиці.

Розгорнув я це все у себе вдома на старому нетбуці, де до того вже працювала телефонна станція з автовідповідачем. Купив термопринтер з Wi-Fi-єм, поставив у кабінеті дружини та з’єднав його з чат-ботом за допомогою VPN-тунелю.

Проблем для мікробізнесу я вбачаю дві: хтось повинен все налаштувати (я не буду й не просіть) і десь це необхідно розгорнути (потрібен сервер). Та це вже не мої проблеми, в мене все працює.

Увесь код ліцензовано під MIT, тобто робіть що заманеться, але мене згадайте.

Наснаги!

P.S. Там у репозиторії є ще один неназваний тут проєкт. Він для фіксації у таблиці безготівкових надходжень через API банку та нотифікації про такі операції через того самого бота.

P.P.S. Кому цікавий вигляд згадуваної гуглотаблиці — ось. Там у скриптах залишився код старого вайбер-боту.

👍НравитсяПонравилось16
В избранноеВ избранном4
LinkedIn
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

До Checkbox потрібно було звертатись щоб інтегрувати їх чи обійшлося без них? Читали в них на сайті що для інтеграції потрібно звернутись до них, звернулись, обіцяли щось прислати, так і не надіслали

В них нормальна документація по API, здебільшого керувався нею. До них звернувся лише по аккаунт на тестовий сервер та по тестовий ЕЦП — отримав їх наступного дня. Питатися в них про технічні нюанси — то як пощастить, можна отримати вичерпну відповідь, можна не отримати ніякої взагалі.

Круто. Але є одне маленьке зауваження з якто кажуть із секюріті. Підем сюди ru.wikipedia.org/wiki/Telegram і подивимось

Проект финансируется Павлом Дуровым ... В тот же день Роскомнадзор уведомил Telegram о необходимости исполнения требований закона о предоставлении информации ФСБ России.

А тепер читаємо статтю

бот робить запит на створення чеку, натиснувши дві кнопки у чаті з ботом
бот за потреби відкриває зміну
бот створює чек
бот відповідає QR-кодом з посиланням на сайт податкової + посилання текстом (можете показати чи поділитися ним з клієнтом)

Таким чином фінансові операції по ФОП-у йдуть через сторонній софт пов`язаний із россійским бізнесменом, головний актив котрого заблокований в Україні. Ось така казонька малята, вона дуже стара — а досі все працює ic.pics.livejournal.com/...​8061/2138061_original.jpg

Так ви ж читайте далі:

Создатель мессенджера заявил об отказе выдавать ФСБ ключи шифрования переписки в Telegram

На цьому ґрунті в нього виник конфлікт з тамтешнею владою, що призвело до тривалого блокування Телеграму по всій території РФ. Здебільшого формального, бо там клепку треба мати.
Головний актив, про який ви кажете, це ВК чи що? Він продав свою частку ще у 2014 році і того ж року емігрував з Росії. Якщо вже кидатись вікілінками, то ось.

Ти такий наївний, у Нємцова,... були конфлікти з тамтешньою владою, ти ще скажи що Жиріновський це опозиціонер

Я наївний, що є то є. От тільки мені не зрозуміло навіщо Дурову виконувати кремлівські забаганки? Телеграм зареєстрований у Дубаях, Дуров вже давно є громадянином якихось островів, живе де заманеться, тільки не в балалайковій. Так от навіщо йому виконувати закони країни, до якої він відноситься лише місцем народження? З-за патріотичних міркувань чи що?

Тому що СНГ це його ЦА

Пруфи? Чи це суб’єктивна оцінка? На мою суб’єктивну, Телеграм орієнтований зовсім не на СНД, бо там девяться фічури, що в нас чи то зовсім не працюють (на кшталт Passport), чи суперечать пострадянській ментальності (де гроші тре платити). Ми зараз не кажемо про статистику завантажень, бо ми ж розуміємо, що та статистика не корелює з конверсією.

Да в світі ніхто не знає про тєлєгу.
Звісно це субьективна оцінка. Надзор розблокував тєлєгу бо вони дійшли згоди з генпрокуратурою — шо тут ще обговорювати!

Як подивитись на статистику, то у СНД теж про Телеграм ніхто не знає, бо там панують Воццап та Вайбер. Я взагалі про телегу взнав від арабів...

Я давно маю за гобі автоматизовувати її бізнес — до цієї всієї історії був в неї особистий вайберобот

гоби — это опечатка?

Ні, то авторська лексика. «Гобі» — один з варіянтів написання запозиченого з англійської «hobby».

Это зафорсили любители западных диалектов, типа Ивана Франка, как и эту дебильную букву Ґ.

От кляті франківці, не вчились у Харварді та Гете не читали! Може з літератури лише Харрі Поттера брали до рук! І відчуття хумору в них теж нема!

І взагалі незрозуміло, чому такий гвалт зчинився. Треба їх за грати посадити, та й годі.

А якщо без сарказму, то це норми харківського правопису, затвердженого за часів СССР. Навіть газету «Комуніст» змусили використовувати «ґ», кляті франківці...

Цікаво, а як що до того, що новий правопис, у цьому розділі, лише підтверджує старий правопис, що звався Харківським :) Харків — дуже західне місто. Ага.

гоби — это опечатка?

нет, это — пустыня!

Найбільше дивує для чого податковій взагалі відкриття і закриття змін, з їхніми Z-звітами. Виглядає, що податкова за зміну не може порахувати суму податку по всіх чеках, і натомість платнику податків треба турбуватися, щоб недайбоже не забути закрити зміну

Якраз податкова МОЖЕ порахувати і от коли побачить що скоїв жахливий злочин, забув закрити зміну — можна грабувати.

Текст читається легко, тема цікава, спосіб вирішення — також.

Щиро кажучи, за декілька місяців на DOU не бачив такої якісної статті!

Фізично друкувати той не обов’язково

Але закон дозволяє вимагати саме паперовий чек, що власне і будуть вимагати посіпаки задля створення проблем, які потім треба буде «порєшать». А ще програмне API в акурат таке, що воно працює коли захоче і як захоче — а коли і як... це коли ти поставив ПРАВЄЛЬНИЙ софт від ПРАВЄЛЬНИХ пацанів, звісно ж дууже небезкоштовно, і написано на колінці.

Тому вся ця норма — чиста корупція. І по правилах ти нічого не зробиш, бо правила писали власне феодали, і ще не раз їх перепишуть. А правило по суті одне: ми робимо що хочимо і вимагаємо скільки заманеться, і ніяк не відповідаємо за порушення закону в цьому процесі.

Класичний приклад: саме тебе можна буде відімкнути в ручному режимі. Саме в той день і час, коли проводиться чергова чи позачергова перевірка. Якщо податкові накладні вручну можуть блокуватися, що завадить блокувати чеки? Головне не забувати казати СУГС.

Подписаться на комментарии