feat(issued-orders): make line items optional (issue by sections alone)

Items are no longer required on issued orders — an order can be issued
purely from its rich-text sections (Obsah).

- DocumentItemsEditor: opt-in allowEmpty prop lets the list go to zero
  rows (default false keeps the offers/invoices at-least-one-item rule).
- IssuedOrderDetail: allowEmpty on the editor; a saved order with no
  items reopens empty (not a blank starter row); submit guard now
  requires at least one item OR a non-empty section, not an item.
- PDF: with no items the billing heading, items table and total row are
  omitted entirely — a sections-only order shows only its Obsah.
- Service: finalize (draft->sent) and create-as-non-draft reject a
  completely blank order (no items AND no sections) with a Czech 400
  (empty_document); drafts may still be saved empty as WIP.
- Tests: sections-only finalize + blank-order rejection + sections-only
  PDF render; existing finalize fixtures given minimal content.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
BOHA
2026-06-24 21:36:35 +02:00
parent 983a1408f1
commit 237ebf3ef8
7 changed files with 174 additions and 17 deletions

View File

@@ -752,8 +752,11 @@ ${indentCSS}
</tr>
</table>
<!-- Polozky -->
<div class="billing-label">${escapeHtml(order.order_text || t.billing)}</div>
<!-- Polozky — an order may be issued by sections alone; with no items the
heading, items table and total row are omitted entirely. -->
${
items.length > 0
? `<div class="billing-label">${escapeHtml(order.order_text || t.billing)}</div>
<table class="items">
<thead>
<tr>
@@ -779,7 +782,9 @@ ${indentCSS}
<span class="value">${formatCurrency(total, currency)}</span>
</div>
</div>
</div>
</div>`
: ""
}
${scopeHtml}