Files
portal/app/resources/views/pdf/invoice.blade.php
T
Дмитрий a56dcb06b2 feat(биллинг): оплата по счёту (Этап 1) — счёт, акт, отметка оплаты
Клиент сам выставляет 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>
2026-06-29 11:25:16 +03:00

58 lines
2.7 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; }
.bank td { border: 1px solid #000; padding: 4px; vertical-align: top; }
.items th, .items td { border: 1px solid #000; padding: 4px; text-align: left; }
.items th { background: #eee; }
h1 { font-size: 15px; margin: 12px 0; }
.right { text-align: right; }
.muted { color: #555; }
</style>
</head>
<body>
<table class="bank">
<tr>
<td rowspan="2" style="width:55%">{{ $seller->bank_name }}</td>
<td style="width:15%">БИК</td>
<td>{{ $seller->bank_bik }}</td>
</tr>
<tr>
<td>Сч. </td>
<td>{{ $seller->bank_corr }}</td>
</tr>
<tr>
<td>Получатель<br>{{ $seller->name }}<br>ИНН {{ $seller->inn }} {{ $seller->kpp ? 'КПП '.$seller->kpp : '' }}</td>
<td>Сч. </td>
<td>{{ $seller->bank_account }}</td>
</tr>
</table>
<h1>Счёт на оплату {{ $invoice->invoice_number }} от {{ \Illuminate\Support\Carbon::parse($invoice->issued_at)->format('d.m.Y') }}</h1>
<p><b>Поставщик (Исполнитель):</b> {{ $seller->name }}, ИНН {{ $seller->inn }}{{ $seller->kpp ? ', КПП '.$seller->kpp : '' }}{{ $seller->legal_address ? ', '.$seller->legal_address : '' }}</p>
<p><b>Покупатель (Заказчик):</b> {{ $invoice->payer_name }}, ИНН {{ $invoice->payer_inn }}{{ $invoice->payer_kpp ? ', КПП '.$invoice->payer_kpp : '' }}{{ $invoice->payer_address ? ', '.$invoice->payer_address : '' }}</p>
<table class="items">
<tr><th></th><th>Наименование</th><th>Кол-во</th><th>Ед.</th><th>Цена</th><th>Сумма</th></tr>
@foreach($items as $i => $it)
<tr>
<td>{{ $i + 1 }}</td>
<td>{{ $it->name }}</td>
<td>{{ (int) $it->quantity }}</td>
<td>{{ $it->unit }}</td>
<td>{{ number_format((float) $it->price, 2, '.', ' ') }}</td>
<td>{{ number_format((float) $it->amount_total, 2, '.', ' ') }}</td>
</tr>
@endforeach
</table>
<p class="right"><b>Итого: {{ number_format((float) $invoice->amount_total, 2, '.', ' ') }} </b><br>Без НДС</p>
<p><b>Назначение платежа:</b> {{ $invoice->payment_purpose }}</p>
<p class="muted">Оплатить до: {{ \Illuminate\Support\Carbon::parse($invoice->expires_at)->format('d.m.Y') }}</p>
</body>
</html>