a56dcb06b2
Клиент сам выставляет 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>
58 lines
2.7 KiB
PHP
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>
|