cdfae077a3
Клиент сам выставляет PDF-счёт (TopupDialog вкладка «По счёту»), счета и акты — в отдельной вкладке «Счета». Админ (/admin/invoices) отмечает оплату одной кнопкой → атомарно зачисляет баланс (BillingTopupService), формирует Акт (без НДС, saas_upd_documents ДОП) и шлёт клиенту письмо «Счёт оплачен» с вложением PDF-акта. PDF открываются inline в браузере (ASCII-имя). - Сервисы InvoiceNumberGenerator/InvoiceService/ActService/InvoicePaymentService/PdfRenderer - Контроллеры InvoiceController (клиент) + AdminInvoiceController (список+mark-paid) - Модели SaasInvoice/SaasInvoiceItem/SaasUpdDocument; шаблоны pdf/invoice|act - Нумерация СЧ-ГГГГ-NNNNN (advisory-lock); просрочка invoices:expire (cron) - Наименование услуги: «Оплата генерации рекламных лидов» - Зависимость barryvdh/laravel-dompdf (default_font dejavu sans); схема БД не менялась - Этап 2 (автомат через ВТБ API) — отдельно, спека/план в docs/superpowers Тесты: счета 13, Billing 138, фронт зелёные; larastan baseline +6 (Pest false-pos). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
39 lines
2.0 KiB
PHP
39 lines
2.0 KiB
PHP
<!DOCTYPE html>
|
|
<html lang="ru">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<style>
|
|
body { font-family: 'dejavu sans'; font-size: 11px; color: #000; }
|
|
table { width: 100%; border-collapse: collapse; }
|
|
th, td { border: 1px solid #000; padding: 4px; text-align: left; }
|
|
th { background: #eee; }
|
|
h1 { font-size: 15px; margin: 12px 0; }
|
|
.right { text-align: right; }
|
|
.sign { margin-top: 30px; }
|
|
.sign td { border: none; padding: 8px 4px; }
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<h1>Акт № {{ $act->upd_number }} от {{ \Illuminate\Support\Carbon::parse($act->issued_at)->format('d.m.Y') }}</h1>
|
|
|
|
<p><b>Исполнитель:</b> {{ $seller->name }}, ИНН {{ $seller->inn }}{{ $seller->kpp ? ', КПП '.$seller->kpp : '' }}</p>
|
|
<p><b>Заказчик:</b> {{ $act->buyer_name }}, ИНН {{ $act->buyer_inn }}{{ $act->buyer_kpp ? ', КПП '.$act->buyer_kpp : '' }}</p>
|
|
<p><b>Основание:</b> счёт № {{ $invoiceNumber }}</p>
|
|
|
|
<table>
|
|
<tr><th>№</th><th>Наименование услуги</th><th>Сумма</th></tr>
|
|
<tr><td>1</td><td>Оплата генерации рекламных лидов</td><td>{{ number_format((float) $act->amount_total, 2, '.', ' ') }} ₽</td></tr>
|
|
</table>
|
|
|
|
<p class="right"><b>Всего оказано услуг на сумму: {{ number_format((float) $act->amount_total, 2, '.', ' ') }} ₽</b><br>Без НДС</p>
|
|
<p>Вышеперечисленные услуги оказаны полностью и в срок. Заказчик претензий по объёму, качеству и срокам оказания услуг не имеет.</p>
|
|
|
|
<table class="sign">
|
|
<tr>
|
|
<td style="width:50%">Исполнитель<br><br>_______________ / {{ $seller->director_name ?? $seller->name }}</td>
|
|
<td style="width:50%">Заказчик<br><br>_______________ / {{ $act->buyer_name }}</td>
|
|
</tr>
|
|
</table>
|
|
</body>
|
|
</html>
|