Сервисам, интернет-магазинам и CRM часто нужно выставлять счета автоматически — по заказу, по подписке, по кнопке в боте. Счёт должен выглядеть привычно для бухгалтерии, правильно считать НДС, а реквизиты в нём не должны содержать опечаток: иначе деньги уйдут не туда или платёж вернётся.
За основу взял открытую библиотеку PDF-счетов by-cx/InvoiceGenerator (184 звезды на GitHub). Она умеет только европейские и чешские счета, российского формата в ней нет.
Добавил в библиотеку российский «Счёт на оплату» в привычном виде, как из 1С: блок банковских реквизитов получателя, поставщик и покупатель с ИНН и КПП, основание, таблица работ и услуг с переносом длинных названий и переходом на следующую страницу, подписи — для организации или ИП.
Сделал расчёт НДС как принято в России: «в том числе НДС», начисление сверху или «без НДС» для УСН и самозанятых, несколько ставок одновременно. Написал сумму прописью с правильными падежами и QR-код для оплаты по ГОСТ Р 56042-2014: клиент наводит камеру в приложении банка, и платёж заполняется сам. QR проверил распознаванием с готового PDF.
Добавил проверку реквизитов по контрольным цифрам до выпуска счёта: ИНН, КПП, БИК, расчётный и корреспондентский счёт в связке с БИК — опечатка в одной цифре ловится сразу с понятным сообщением. Алгоритмы сверил на открытых реквизитах Сбербанка. 32 новых автотеста плюс 42 теста оригинала; заодно починил тест, падавший на Windows, и устаревший запуск тестов в CI.
Готовый модуль, который выпускает российский счёт на оплату в PDF одной строкой кода: с правильным НДС, суммой прописью и QR-кодом для оплаты из любого банковского приложения. Счёт с ошибкой в реквизитах не выпускается. Модуль легко встроить в сайт, CRM или Telegram-бота.
Проект — открытый форк с сохранением лицензии BSD и указанием автора оригинала; в README описано, что добавлено.