Create and manage free-issue sales slips from the backend.
+Persisted backend records with draft-only cancellation.
+{invoice.invoiceNo}
+| Item | +UOM | +Qty | +Free | +Unit price | +Discount | +Tax | +Line total | +
|---|---|---|---|---|---|---|---|
|
+ {line.description}
+ SKU {items.find((i) => i.itemId === line.itemId)?.sku ?? `#${line.itemId}`}
+ |
+ {uoms.find((u) => u.uomId === line.uomId)?.name ?? `#${line.uomId}`} | +{line.qty.toFixed(0)} | +{line.freeQty > 0 ? line.freeQty.toFixed(0) : "—"} | +{money.format(line.unitPrice)} | +{money.format(line.discountAmount)} | +{money.format(line.taxAmount)} | +{money.format(line.lineTotal)} | +
| Item | +Warehouse | +Requested | +Available | +Short | +
|---|---|---|---|---|
|
+ {issue.itemSku}
+ {issue.itemName}{issue.isFreeIssue ? " · free issue" : ""}
+ |
+ {issue.warehouseId} | +{issue.requestedQty.toFixed(0)} | +{issue.availableQty.toFixed(0)} | +{issue.shortQty.toFixed(0)} | +
{company?.footerNote ?? "Standard invoice template view."}
+| Item | +UOM | +Qty | +Free | +Unit price | +Remove | +
|---|---|---|---|---|---|
| + + | ++ + | ++ updateLine(line.key, { qty: Number(e.target.value) || 0 })} + className="h-10 w-full rounded-lg border border-input bg-background px-3 text-right font-mono tabular-nums text-sm" + /> + | ++ updateLine(line.key, { freeQty: Number(e.target.value) || 0 })} + className="h-10 w-full rounded-lg border border-input bg-background px-3 text-right font-mono tabular-nums text-sm" + /> + | ++ updateLine(line.key, { unitPrice: e.target.value === "" ? null : Number(e.target.value) })} + className="h-10 w-full rounded-lg border border-input bg-background px-3 text-right font-mono tabular-nums text-sm" + /> + | ++ + | +
{invoice.invoiceNo}
++ {company?.footerNote ?? "Standard invoice print view."} +
+Select items, set quantity, unit price and line discount.
+Invoice register with filters, posting flow, and settlement tracking.
+{hasFilters ? "No invoices match your filters." : "No invoices yet."}
++ Showing {(pagination.page - 1) * pagination.pageSize + 1}-{Math.min(pagination.page * pagination.pageSize, pagination.totalItems)} of {pagination.totalItems} +
++ Invoices, slips, free issues, and reporting in one place. +
+{section.description}
+Metadata for the selected sales report.
+{report.id}
+{report.description}
+| + {formatHeader(key)} + | + ))} +
|---|
| + {formatCell(record[key])} + | + ))} +
+ Card-based report hub with the same layout and handling style used across stock management. +
+No sales reports are available.
+{report.description}
+{slip.slipNo} · {slip.status}
+| Item | +Warehouse | +Requested | +Available | +Short | +
|---|---|---|---|---|
|
+ {issue.itemSku}
+ {issue.itemName}{issue.isFreeIssue ? " · free issue" : ""}
+ |
+ {issue.warehouseId} | +{issue.requestedQty.toFixed(0)} | +{issue.availableQty.toFixed(0)} | +{issue.shortQty.toFixed(0)} | +
Create counter sales slips from the live backend.
+Counter sales register with posting and cancellation flow.
+{hasFilters ? "No slips match your filters." : "No slips yet."}
++ Showing {(pagination.page - 1) * pagination.pageSize + 1}-{Math.min(pagination.page * pagination.pageSize, pagination.totalItems)} of {pagination.totalItems} +
+Invoice header, tax details, logo, and bank information.
+