- Saved searches
- Use saved searches to filter your results more quickly
- License
- nalgeon/invoice
- Name already in use
- Sign In Required
- Launching GitHub Desktop
- Launching GitHub Desktop
- Launching Xcode
- Launching Visual Studio Code
- Latest commit
- Git stats
- Files
- README.md
- Генерация счета на оплату PDF PHP
- Вёрстка содержимого для PDF-файла
- Генерация PDF-файла
- Установка шрифтов в Dompdf
- Проблема с кириллицей в Dompdf
- Генерация PDF документ на PHP с помощью dompdf
- Пишем содержимое HTML для генерации PDF документа
- Генерация PDF документа и скачивание
- Или сохраняем наш PDF на сервере
- Собственно все! Пользуйтесь!
- Можно конечно еще улучшить скрипт
- [DEV: PHP] Создание и обработка счета на оплату в криптовалюте
Saved searches
Use saved searches to filter your results more quickly
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.
Ну очень простое выставление счетов для юрлиц
License
nalgeon/invoice
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Sign In Required
Please sign in to use Codespaces.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching Xcode
If nothing happens, download Xcode and try again.
Launching Visual Studio Code
Your codespace will open once ready.
There was a problem preparing your codespace, please try again.
Latest commit
Git stats
Files
Failed to load latest commit information.
README.md
- Форкнуть или скачать репозиторий
- Прописать реквизиты своей компании в company.json
- Скопировать логотип, печать и факсимиле в каталог img
- Выставлять счета!
Чтобы выставить счет, достаточно передать реквизиты счета в invoice.html через параметры URL. Например, хотим выставить счет с такими реквизитами:
- Номер счета: 1234
- Покупатель: ООО «Магазинчик»
- Товар или услуга: Подписка на год
- Стоимость: 5000 ₽
Получится такая строка запроса:
invoice.html?number=1234&company=ООО+«Магазинчик»&item=Подписка+на+год&price=5000
Генерация счета на оплату PDF PHP
С помощью расширения dompdf можно легко сформировать PDF файл. По сути, dompdf – это конвертер HTML в PDF который поддерживает CSS, атрибуты style и другие.
- Поддерживает большинство свойств CSS 2.1.
- Поддерживает сложные таблицы, включая индивидуальный стили ячеек.
- Поддержка изображений gif, png с прозрачностью, bmp и jpeg.
- PHP => 5.3 с установленными расширениями DOM, GD, MBString, php-font-lib, php-svg-lib.
Вёрстка содержимого для PDF-файла
Для примера сделаем счет на оплату:
Для удобства сформируем массив товаров по которому скрипт выведет таблицу и посчитает итоговую сумму и НДС.
$prods = array( array( 'name' => 'Плита CERAMAGUARD FINE FISSURED (100 RH) 600*600*15', 'count' => 25.3, 'unit' => 'м2', 'price' => 1210, 'nds' => 18, ), array( 'name' => 'Европодвес (0.5м)', 'count' => 100, 'unit' => 'шт.', 'price' => 5.50, 'nds' => 0, ), array( 'name' => 'Профиль 20*20', 'count' => 10, 'unit' => 'м', 'price' => 550, 'nds' => 10, ), );
// Форматирование цен. function format_price($value) < return number_format($value, 2, ',', ' '); >// Сумма прописью. function str_price($value) < $value = explode('.', number_format($value, 2, '.', '')); $f = new NumberFormatter('ru', NumberFormatter::SPELLOUT); $str = $f->format($value[0]); // Первую букву в верхний регистр. $str = mb_strtoupper(mb_substr($str, 0, 1)) . mb_substr($str, 1, mb_strlen($str)); // Склонение слова "рубль". $num = $value[0] % 100; if ($num > 19) < $num = $num % 10; >switch ($num) < case 1: $rub = 'рубль'; break; case 2: case 3: case 4: $rub = 'рубля'; break; default: $rub = 'рублей'; >return $str . ' ' . $rub . ' ' . $value[1] . ' копеек.'; >
Некоторые замечания:
- В адреса картинок в лучше указывать полные URL.
- У таблиц не получится задать ширину колонок тегом .
$html = ' * table table th table td .header h1 /* Реквизиты банка */ .details td /* Поставщик/Покупатель */ .contract th .contract td /* Наименование товара, работ, услуг */ .list thead, .list tbody .list thead th .list tbody td .list tfoot th /* Сумма */ .total .total p /* Руководитель, бухгалтер */ .sign .sign table .sign th .sign td .sign-1 .sign-2 .printing
ЗАО "БАНК", г.Москва БИК 000000000 Банк получателя Сч. № 00000000000000000000 ИНН 0000000000 КПП 000000000 Сч. № 00000000000000000000 ООО "Компания" Получатель
Счет на оплату № 10 от 01 февраля 2018 г.
Поставщик: ООО "Компания", ИНН 0000000000, КПП 000000000, 125009, Москва г, Тверская, дом № 9 Покупатель: ООО "Покупатель", ИНН 0000000000, КПП 000000000, 119019, Москва г, Новый Арбат, дом № 10
№ Наименование товара, работ, услуг Коли-
чество Ед.
изм. Цена Сумма '; $total = $nds = 0; foreach ($prods as $i => $row) < $total += $row['price'] * $row['count']; $nds += ($row['price'] * $row['nds'] / 100) * $row['count']; $html .= ' ' . (++$i) . ' ' . $row['name'] . ' ' . $row['count'] . ' ' . $row['unit'] . ' ' . format_price($row['price']) . ' ' . format_price($row['price'] * $row['count']) . ' '; > $html .= ' Итого: ' . format_price($total) . ' В том числе НДС: ' . ((empty($nds)) ? '-' : format_price($nds)) . ' Всего к оплате: ' . format_price($total) . '
' . str_price($total) . '
Руководитель Иванов А.А. Бухгалтер Сидоров Б.Б.
';
Генерация PDF-файла
Передаём переменную $html в dompdf. Библиотеку можно скачать по ссылке https://github.com/dompdf/dompdf/releases.
// Если на сайте используется автозагрузка классов //spl_autoload_unregister('autoload'); include_once __DIR__ . '/dompdf/autoload.inc.php'; $dompdf = new Dompdf\Dompdf(); $dompdf->set_option('isRemoteEnabled', TRUE); $dompdf->setPaper('A4', 'portrait'); $dompdf->loadHtml($html, 'UTF-8'); $dompdf->render(); // Вывод файла в браузер: $dompdf->stream('schet'); // Или сохранение на сервере: $pdf = $dompdf->output(); file_put_contents(__DIR__ . '/schet.pdf', $pdf);
Установка шрифтов в Dompdf
Если используется не стандартный шрифт то нужно его установить по следующиму алгоритму:
1. Скачать шрифты в формате ttf для обычного и жирного начертания (например open-sans.ttf и open-sans-bold.ttf).
2. Скачать программу ttf2ufm (ttf2ufm.zip).
3. Запустить консоль (cmd), лучше от имени администратора.
4. Выполнить команды для всех файлов шрифтов по отдельности, подставив полные пути до файлов.
C:\ttf2ufm.exe -A -F -l russian C:\open-sans.ttf
C:\ttf2ufm.exe -A -F -l russian C:\open-sans-bold.ttf
5. На выходе получатся файлы: open-sans.ttf
open-sans.ufm
open-sans.afm
open-sans-bold.ttf
open-sans-bold.ufm
open-sans-bold.afm 6. Копируем их на сайт, в директорию библиотеки /dompdf/lib/fonts 7. В файле dompdf_font_family_cache.dist.php нужно прописать новый шрифт, добавив элемент в массив:
'open-sans' => [ 'normal' => $distFontDir . '/open-sans', 'bold' => $distFontDir . '/open-sans-bold' ],
Проблема с кириллицей в Dompdf
При использовании стандарных шрифтов (times-roman, helvetica и т.д.) если вместо кирилицы выводятся знаки вороса ( . ), то нужно сделать те же действия как описаны ваше, заменив только файлы (.ufm и .afm) в /dompdf/lib/fonts . В файле dompdf_font_family_cache.dist.php они уже прописаны.
Генерация PDF документ на PHP с помощью dompdf
На примере мы будем создавать счет на оплату, довольно таки распространенный вид документа, который нужно генерировать. Для начала скачиваем библиотеку dompdf Мы будем писать все в одном файле, так что после обращения на по адресу файла php, документ уже будет генерироваться. Делаю я это для упрощения понимания.
require_once($_SERVER["DOCUMENT_ROOT"]."/dompdf/dompdf_config.inc.php");
Теперь готовим содержимое нашего будущего документа. Все делаем всем знакомой HTML разметкой, но эта HTML разметка должна быть в переменной.
Пишем содержимое HTML для генерации PDF документа
Обратите внимание, мы закладываем в документ CSS стили и даже разместим туда свою подпись.
//разбиваем изображение для подписи в base64 $path_podpis = $_SERVER["DOCUMENT_ROOT"].'/images/podpis/podpis.png'; $type = pathinfo($path_podpis, PATHINFO_EXTENSION); $data = file_get_contents($path_podpis); $podpis = 'data:image/' . $type . ';base64,' . base64_encode($data); //содержимое HTML в PDF $content =" body < font-family: times; font-size: 11pt; >table @page .podpis_left < position: relative; display: inline-block; width: 392px; font-weight: 700; >.podpis_left img.podpis < position: absolute; right: 7%; bottom: 12px; width: 83px; >.document_number < text-align: center; font-size: 15pt; >table < border-spacing: 0; border-collapse: collapse; >table th < border: 1px solid #ddd; padding: 5px; font-size: 10pt; >table td "; $content .= ' Продавец
Иванов Иван Иванович
ИНН: 593315450321
КПП: 590334434
р/c: 40817810749771710380
к/с: 30101810900000000603
БИК: 042202603
Банк: Волго-вятский БАНК ПАО Сбербанк
Покупатель
'; $content .= ' '.$company["company"].'
ИНН: инн_компании
КПП: кпп_компании
ОГРН: огрн_компании
р/c: рс
к/с: кс
БИК: бик
Банк: банк
'; $content .= 'Счет №31 от '.date("d.m.Y").'
'; $content .= ' № Наименование Ед. изм. Кол-во Цена (руб.) Сумма (руб.) 1 Услуги по договору №02/10/2021 на создание сайта шт. 1 25 000,00 25 000,00 Итого: 25 000,00 Всего к оплате: 25 000,00
Сумма прописью: двадцать пять тысяч рублей 00 копеек
Иванов Иван Иванович ____________________ ';
Генерация PDF документа и скачивание
$html = mb_convert_encoding($content, 'HTML-ENTITIES', 'UTF-8'); $dompdf = new DOMPDF();// Создаем обьект $dompdf->load_html($html, 'UTF-8'); // Загружаем в него наш html код $dompdf->render(); // Создаем из HTML PDF // $dompdf->stream('mypdf.pdf'); // Выводим результат (скачивание) $output = $dompdf->output();
Или сохраняем наш PDF на сервере
//папка куда сохроняем $img_Dir_Str = "invoice/"; $img_Dir = $_SERVER['DOCUMENT_ROOT']."/". $img_Dir_Str; @mkdir($img_Dir, 0777); //сохранение pdf на сервере $file = "Сгенерированный PDF документ на PHP.pdf"; file_put_contents($img_Dir.$file, $output);
Собственно все! Пользуйтесь!
Можно конечно еще улучшить скрипт
- Загнать сумму в переменную и выводить ее прописью (из 25000 в двадцать пять тысяч рублей 00 коп.)
- Сформировать в догонку акт выполненных работ
- А еще до кучи какой-нибудь договор
Если Вам нужно написать готовый инструмент для генерации документов, то пишите, посмотрим что можно сделать под Ваш задачи.
Пишите в комментариях, если нужно дописать функцию перевода числа в прописной вид.
[DEV: PHP] Создание и обработка счета на оплату в криптовалюте
Если вы не хотите обрабатывать платеж на стороне сайта, проверять факт доплаты/переплаты, то вам достаточно просто пользоваться готовой функцией создания счета на оплату (инвойсы) на стороне процессинга.
Ниже перечислены параметры, необходимых для создания такого счета.
Счет может быть бессрочным или ограниченным по времени действия. Например, бессрочный может использоваться для пополнения игровых балансов, а ограниченный по времени — для оплаты товаров или услуг, чтобы уменьшить волатильность цены. Такая характеристика регулируется с помощью параметра lifetime, который указывается в секундах.
Сумма счета указывается в поле amount, при этом за единицу измерения берутся наименьшие дробные единицы криптовалюты, т.е., к примеру, для Биткоина — сатоши. Сurrency — сокращенное обозначение криптовалюты, например, btc, tbtc (testnet) , ltc, doge, tron и др.
В user-data вы можете передать название вашего магазина, ссылку на него, стоимость товара или услуги. Важно знать — мы не конвертируем amount в массиве user-data, вы можете считать конвертацию из своих источников или указывать в поле currency любую, даже вымышленную игровую валюту.
При оплате счета на указанный адрес передается колбэк, в запросе это параметр callback_url. При этом статусы колбэка по счету отличаются от обычной обработки платежей. Статусы бывают следующие:
- created — счет создан
- paid — оплачен
- partpaid — частично оплачен, т.е. подтвердился платеж меньше и счет завершился по таймеру
- overpaid — переплата
- completed — завершен (перевод подтвержден в сети блокчейн)
- expired — счет просрочен без оплаты, т.е. в течение срока, выставленного по таймеру, оплата не произведена.
Также вы можете запрашивать статус счета самостоятельно https://apirone. com/api/v2/invoices/KDDBhhSTYEbKOW83
Этих параметров достаточно для полноценного выставления счета на оплату в криптовалюте и отслеживания его состояния.