stacss / laravel-upd
Laravel package for generating PDF documents: UPD, reconciliation statements and Russian invoices
Requires
- php: >=8.1
- barryvdh/laravel-dompdf: ^3.1
- illuminate/support: ^10.0|^11.0|^12.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.90
- orchestra/testbench: ^9.15
- phpunit/phpunit: ^10.5
This package is auto-updated.
Last update: 2026-04-07 15:50:52 UTC
README
stacss/laravel-upd — Laravel package для генерации PDF-документов:
- УПД
- акта сверки
- счета на оплату
Пакет использует barryvdh/laravel-dompdf, считает НДС через встроенный VatCalculator и отдает готовый Barryvdh\DomPDF\PDF.
Совместимость
Поддерживаются:
- PHP
8.1+ - Laravel
10 - Laravel
11 - Laravel
12
Пакет не заявляет поддержку всех версий Laravel. По текущим constraints в composer.json поддерживаются только illuminate/support ^10|^11|^12.
Установка
Установка в обычный Laravel-проект:
composer require stacss/laravel-upd
Публикация конфига и шаблонов:
php artisan vendor:publish --tag=upd-config php artisan vendor:publish --tag=upd-views
Быстрый старт
УПД
use Stacss\LaravelUpd\UpdRenderer; $renderer = app(UpdRenderer::class); $pdf = $renderer->pdf([ 'document' => [ 'number' => '123', 'date' => now(), 'status' => 1, ], 'seller' => config('upd.seller'), 'buyer' => [ 'name' => 'ООО Покупатель', 'inn' => '1234567890', 'kpp' => '123456789', 'address' => 'г. Москва', ], 'items' => [ [ 'name' => 'Тестовый товар', 'code' => 'TST-001', 'unit' => 'шт', 'unit_code' => '796', 'quantity' => 2, 'price' => 100, 'vat_rate' => 20, 'price_type' => 'net', ], ], ]); $pdf->save(storage_path('upd.pdf'));
Акт сверки
use Stacss\LaravelUpd\ReconciliationRenderer; $renderer = app(ReconciliationRenderer::class); $pdf = $renderer->pdf([ 'act_date' => now(), 'period' => [ 'from' => now()->startOfMonth(), 'to' => now()->endOfMonth(), ], 'left' => [ 'full_name' => 'ООО Ромашка', 'short_name' => 'ООО Ромашка', 'director_post' => 'генерального директора', 'director_full' => 'Иванова Ивана Ивановича', 'director_short' => 'Иванов И. И.', 'director_sign_note' => 'Иванов ' . now()->format('d.m.Y'), 'basis' => 'Устава', ], 'right' => [ 'full_name' => 'ООО Покупатель', 'short_name' => 'ООО Покупатель', 'director_post' => 'генерального директора', 'director_full' => 'Петрова Петра Петровича', 'director_short' => 'Петров П. П.', 'director_sign_note' => 'Петров ' . now()->format('d.m.Y'), 'basis' => 'Устава', ], 'opening' => [ 'date' => now()->startOfMonth(), 'balance' => 0, ], 'closing' => [ 'date' => now()->endOfMonth(), 'balance' => 10000, ], 'operations' => [ [ 'title' => 'Накладная №1', 'debit' => 10000, 'credit' => 0, ], ], ]); $pdf->save(storage_path('reconciliation.pdf'));
Счет на оплату
use Stacss\LaravelUpd\InvoiceRenderer; $renderer = app(InvoiceRenderer::class); $pdf = $renderer->pdf([ 'document' => [ 'number' => '15', 'date' => now(), 'due_date' => now()->addDays(5), 'base' => 'Оплата по счету за товары', 'contract' => 'Договор №5 от 01.01.2026', ], 'seller' => [ 'name' => 'ООО Ромашка', 'short_name' => 'ООО Ромашка', 'inn' => '7700000000', 'kpp' => '770001001', 'ogrn' => '1027700000000', 'address' => 'г. Москва, ул. Пример, д. 1', 'phone' => '+7 (999) 123-45-67', 'email' => 'info@example.ru', ], 'seller_bank' => [ 'bank_name' => 'ПАО Сбербанк', 'bik' => '044525225', 'account' => '40702810900000000001', 'corr_account' => '30101810400000000225', ], 'buyer' => [ 'name' => 'ООО Покупатель', 'short_name' => 'ООО Покупатель', 'inn' => '7800000000', 'kpp' => '780001001', 'address' => 'г. Санкт-Петербург, ул. Тестовая, д. 5', ], 'items' => [ [ 'name' => 'Товар 1', 'brand' => 'ACME', 'code' => 'ABC-001', 'unit' => 'шт', 'unit_code' => '796', 'quantity' => 2, 'price' => 1000, 'vat_rate' => 20, 'price_type' => 'net', ], ], 'payment' => [ 'comment' => 'Без доверенности. Оплата означает согласие с условиями поставки.', ], 'signatures' => [ 'director' => 'Иванов И.И.', 'accountant' => 'Петров П.П.', ], ]); $pdf->save(storage_path('invoice.pdf'));
Примеры документов
Счет на оплату
УПД
Формат данных для счета
Обязательные поля:
document.numberdocument.dateseller.nameseller_bank.bank_nameseller_bank.bikseller_bank.accountitems[*].nameitems[*].unititems[*].quantityitems[*].price
Опциональные поля:
- весь блок
buyer document.due_datedocument.basedocument.contractseller.short_nameseller.ogrnseller.phoneseller.emailseller_bank.corr_accountitems[*].branditems[*].codeitems[*].unit_codepayment.purposepayment.vat_textpayment.commentsignatures.directorsignatures.accountant
Примечания:
- если
buyerне передан, счет все равно будет сгенерирован - если
payment.purposeне передан, пакет сформирует строку автоматически - если
payment.vat_textне передан, пакет сформирует его из рассчитанного НДС - колонки
БрендиКодвыводятся только если хотя бы у одной позиции есть непустые значения brandнормализуется изbrand,brand_name,manufacturer,vendorcodeнормализуется изcode,sku,article
Конфигурация
Файл config/upd.php:
return [ 'seller' => [ 'name' => 'АВТОиностранец', 'inn' => '', 'kpp' => '', 'address' => '', 'phone' => '', ], 'default_vat_rate' => 20.0, 'default_price_type' => 'net', 'view' => 'laravel-upd::upd', 'reconciliation_view' => 'laravel-upd::reconciliation', 'invoice_view' => 'laravel-upd::invoice', 'bank_details' => [ 'bank_name' => '', 'bik' => '', 'account' => '', 'corr_account' => '', ], 'invoice_defaults' => [ 'base' => '', 'contract' => '', 'comment' => '', ], ];
Если опубликованы шаблоны
Если вы уже публиковали views пакета в проекте-потребителе, Laravel будет использовать их вместо шаблонов из vendor.
После обновления шаблонов пакета перепубликуйте их:
php artisan vendor:publish --tag=upd-views --force php artisan view:clear
Если вы меняли опубликованные шаблоны вручную, перепубликация с --force их перезапишет.
Тестирование
composer test
Стиль кода
Проверка:
composer cs
Исправление:
composer cs-fix
Лицензия
MIT

