refactor(api): update manifest line schema docs with name and pu, update deliveryParsePdf model

This commit is contained in:
seb
2026-09-16 17:04:32 +02:00
parent ed36c534b9
commit ab6d018a1f
15 changed files with 142 additions and 70 deletions

View File

@@ -762,7 +762,7 @@
"Quote"
],
"summary": "Create quote",
"description": "Creates a quote with header and lines in one transaction.\n`date` is the document date (valid-until).\n`entityId` must be a company customer (not Lieferanten/POS), or null.\nEach line requires `sku`, `amount`, `net`, and `tax` (rate); `rebate` defaults to `0`.\n",
"description": "Creates a quote with header and lines in one transaction.\n`date` is the document date (valid-until).\n`entityId` must be a company customer (not Lieferanten/POS), or null.\nEach line requires `sku` or `name`, `amount`, `net`, and `tax` (rate); `pu` defaults to `1`; `rebate` defaults to `0`.\n",
"security": [
{
"cookieAuth": []
@@ -808,6 +808,8 @@
"lines": [
{
"sku": "1",
"name": "Sample Article",
"pu": 1,
"amount": 10,
"net": 99.5,
"tax": 19
@@ -2012,7 +2014,7 @@
"Order"
],
"summary": "Create order",
"description": "Creates a sales order with header and lines in one transaction.\n`date` is the document date (expected delivery).\n`entityId` must be a company customer (not Lieferanten/POS), or null.\nEach line requires `sku`, `amount`, `net`, and `tax` (rate); `rebate` defaults to `0`.\n",
"description": "Creates a sales order with header and lines in one transaction.\n`date` is the document date (expected delivery).\n`entityId` must be a company customer (not Lieferanten/POS), or null.\nEach line requires `sku` or `name`, `amount`, `net`, and `tax` (rate); `pu` defaults to `1`; `rebate` defaults to `0`.\n",
"security": [
{
"cookieAuth": []
@@ -2058,6 +2060,8 @@
"lines": [
{
"sku": "1",
"name": "Sample Article",
"pu": 1,
"amount": 10,
"net": 99.5,
"tax": 19
@@ -4223,7 +4227,7 @@
"Delivery"
],
"summary": "Create delivery",
"description": "Creates a goods receipt with header and lines in one transaction.\nThe manifest `number` is allocated automatically via\n`nextNumber('delivery')`; the user-supplied reference is stored as\n`externalNumber`. Each line requires `sku`, `amount`, `net`, and\n`tax` (rate). `rebate` defaults to `0`; `transactedAmount` defaults\nto `amount`.\n",
"description": "Creates a goods receipt with header and lines in one transaction.\nThe manifest `number` is allocated automatically via\n`nextNumber('delivery')`; the user-supplied reference is stored as\n`externalNumber`. Each line requires `sku` or `name`, `amount`, `net`, and\n`tax` (rate). `pu` defaults to `1`; `rebate` defaults to `0`.\n",
"security": [
{
"cookieAuth": []
@@ -4268,6 +4272,8 @@
"lines": [
{
"sku": "1",
"name": "Sample Article",
"pu": 1,
"amount": 10,
"net": 99.5,
"tax": 19
@@ -8940,11 +8946,11 @@
"type": "object",
"required": [
"id",
"articleId",
"sku",
"name",
"pu",
"amount",
"net",
"transactedAmount",
"rebate",
"tax",
"comment"
@@ -8953,29 +8959,31 @@
"id": {
"type": "integer"
},
"articleId": {
"type": "integer",
"nullable": true
},
"sku": {
"type": "string",
"nullable": true
},
"name": {
"type": "string",
"nullable": true,
"description": "Line item name or custom description"
},
"pu": {
"type": "number",
"description": "Packaging unit (defaults to 1)"
},
"amount": {
"type": "number"
},
"net": {
"type": "number"
},
"transactedAmount": {
"type": "number"
},
"rebate": {
"type": "number"
},
"tax": {
"type": "number",
"description": "tax.rate"
"description": "tax.rate (manifestarticle.taxrate)"
},
"comment": {
"type": "string",
@@ -8986,14 +8994,25 @@
"DeliveryLineInput": {
"type": "object",
"required": [
"sku",
"amount",
"net",
"tax"
],
"description": "Line item input. Requires `sku` or `name`.",
"properties": {
"sku": {
"type": "string"
"type": "string",
"nullable": true,
"description": "SKU reference (sku or name is required)"
},
"name": {
"type": "string",
"nullable": true,
"description": "Line item name (sku or name is required)"
},
"pu": {
"type": "number",
"description": "Packaging unit (defaults to 1)"
},
"amount": {
"type": "number"
@@ -9009,10 +9028,6 @@
"type": "number",
"description": "Defaults to 0"
},
"transactedAmount": {
"type": "number",
"description": "Defaults to amount"
},
"comment": {
"type": "string",
"nullable": true
@@ -9044,27 +9059,33 @@
"type": "object",
"required": [
"id",
"articleId",
"sku",
"name",
"pu",
"amount",
"net",
"rebate",
"tax",
"comment"
],
"description": "Line shape for quote and order (no transactedAmount)",
"description": "Line shape for quote and order",
"properties": {
"id": {
"type": "integer"
},
"articleId": {
"type": "integer",
"nullable": true
},
"sku": {
"type": "string",
"nullable": true
},
"name": {
"type": "string",
"nullable": true,
"description": "Line item name or custom description"
},
"pu": {
"type": "number",
"description": "Packaging unit (defaults to 1)"
},
"amount": {
"type": "number"
},
@@ -9076,7 +9097,7 @@
},
"tax": {
"type": "number",
"description": "tax.rate"
"description": "tax.rate (manifestarticle.taxrate)"
},
"comment": {
"type": "string",
@@ -9087,14 +9108,25 @@
"ManifestLineInput": {
"type": "object",
"required": [
"sku",
"amount",
"net",
"tax"
],
"description": "Line item input. Requires `sku` or `name`.",
"properties": {
"sku": {
"type": "string"
"type": "string",
"nullable": true,
"description": "SKU reference (sku or name is required)"
},
"name": {
"type": "string",
"nullable": true,
"description": "Line item name (sku or name is required)"
},
"pu": {
"type": "number",
"description": "Packaging unit (defaults to 1)"
},
"amount": {
"type": "number"

View File

@@ -7,9 +7,8 @@ Create delivery
Creates a goods receipt with header and lines in one transaction.
The manifest `number` is allocated automatically via
`nextNumber('delivery')`; the user-supplied reference is stored as
`externalNumber`. Each line requires `sku`, `amount`, `net`, and
`tax` (rate). `rebate` defaults to `0`; `transactedAmount` defaults
to `amount`.
`externalNumber`. Each line requires `sku` or `name`, `amount`, `net`, and
`tax` (rate). `pu` defaults to `1`; `rebate` defaults to `0`.
## Body (JSON)
@@ -22,6 +21,8 @@ to `amount`.
"lines": [
{
"sku": "1",
"name": "Sample Article",
"pu": 1,
"amount": 10,
"net": 99.5,
"tax": 19
@@ -46,11 +47,11 @@ Created delivery
"lines": [
{
"id": 1,
"articleId": 1,
"sku": "…",
"name": "…",
"pu": 1,
"amount": 1,
"net": 1,
"transactedAmount": 1,
"rebate": 1,
"tax": 1,
"comment": "…"

View File

@@ -28,11 +28,11 @@ Delivery
"lines": [
{
"id": 1,
"articleId": 1,
"sku": "…",
"name": "…",
"pu": 1,
"amount": 1,
"net": 1,
"transactedAmount": 1,
"rebate": 1,
"tax": 1,
"comment": "…"

View File

@@ -41,11 +41,11 @@ Updated delivery
"lines": [
{
"id": 1,
"articleId": 1,
"sku": "…",
"name": "…",
"pu": 1,
"amount": 1,
"net": 1,
"transactedAmount": 1,
"rebate": 1,
"tax": 1,
"comment": "…"

View File

@@ -7,7 +7,7 @@ Create order
Creates a sales order with header and lines in one transaction.
`date` is the document date (expected delivery).
`entityId` must be a company customer (not Lieferanten/POS), or null.
Each line requires `sku`, `amount`, `net`, and `tax` (rate); `rebate` defaults to `0`.
Each line requires `sku` or `name`, `amount`, `net`, and `tax` (rate); `pu` defaults to `1`; `rebate` defaults to `0`.
## Body (JSON)
@@ -20,6 +20,8 @@ Each line requires `sku`, `amount`, `net`, and `tax` (rate); `rebate` defaults t
"lines": [
{
"sku": "1",
"name": "Sample Article",
"pu": 1,
"amount": 10,
"net": 99.5,
"tax": 19
@@ -43,8 +45,9 @@ Created order
"lines": [
{
"id": 1,
"articleId": 1,
"sku": "…",
"name": "…",
"pu": 1,
"amount": 1,
"net": 1,
"rebate": 1,

View File

@@ -27,8 +27,9 @@ Order
"lines": [
{
"id": 1,
"articleId": 1,
"sku": "…",
"name": "…",
"pu": 1,
"amount": 1,
"net": 1,
"rebate": 1,

View File

@@ -39,8 +39,9 @@ Updated order
"lines": [
{
"id": 1,
"articleId": 1,
"sku": "…",
"name": "…",
"pu": 1,
"amount": 1,
"net": 1,
"rebate": 1,

View File

@@ -7,7 +7,7 @@ Create quote
Creates a quote with header and lines in one transaction.
`date` is the document date (valid-until).
`entityId` must be a company customer (not Lieferanten/POS), or null.
Each line requires `sku`, `amount`, `net`, and `tax` (rate); `rebate` defaults to `0`.
Each line requires `sku` or `name`, `amount`, `net`, and `tax` (rate); `pu` defaults to `1`; `rebate` defaults to `0`.
## Body (JSON)
@@ -20,6 +20,8 @@ Each line requires `sku`, `amount`, `net`, and `tax` (rate); `rebate` defaults t
"lines": [
{
"sku": "1",
"name": "Sample Article",
"pu": 1,
"amount": 10,
"net": 99.5,
"tax": 19
@@ -43,8 +45,9 @@ Created quote
"lines": [
{
"id": 1,
"articleId": 1,
"sku": "…",
"name": "…",
"pu": 1,
"amount": 1,
"net": 1,
"rebate": 1,

View File

@@ -27,8 +27,9 @@ Quote
"lines": [
{
"id": 1,
"articleId": 1,
"sku": "…",
"name": "…",
"pu": 1,
"amount": 1,
"net": 1,
"rebate": 1,

View File

@@ -39,8 +39,9 @@ Updated quote
"lines": [
{
"id": 1,
"articleId": 1,
"sku": "…",
"name": "…",
"pu": 1,
"amount": 1,
"net": 1,
"rebate": 1,

View File

@@ -264,36 +264,48 @@
* format: date-time
* DeliveryLine:
* type: object
* required: [id, articleId, sku, amount, net, transactedAmount, rebate, tax, comment]
* required: [id, sku, name, pu, amount, net, rebate, tax, comment]
* properties:
* id:
* type: integer
* articleId:
* type: integer
* nullable: true
* sku:
* type: string
* nullable: true
* name:
* type: string
* nullable: true
* description: Line item name or custom description
* pu:
* type: number
* description: Packaging unit (defaults to 1)
* amount:
* type: number
* net:
* type: number
* transactedAmount:
* type: number
* rebate:
* type: number
* tax:
* type: number
* description: tax.rate
* description: tax.rate (manifestarticle.taxrate)
* comment:
* type: string
* nullable: true
* DeliveryLineInput:
* type: object
* required: [sku, amount, net, tax]
* required: [amount, net, tax]
* description: Line item input. Requires `sku` or `name`.
* properties:
* sku:
* type: string
* nullable: true
* description: SKU reference (sku or name is required)
* name:
* type: string
* nullable: true
* description: Line item name (sku or name is required)
* pu:
* type: number
* description: Packaging unit (defaults to 1)
* amount:
* type: number
* net:
@@ -304,9 +316,6 @@
* rebate:
* type: number
* description: Defaults to 0
* transactedAmount:
* type: number
* description: Defaults to amount
* comment:
* type: string
* nullable: true
@@ -322,17 +331,21 @@
* $ref: '#/components/schemas/DeliveryLine'
* ManifestLine:
* type: object
* required: [id, articleId, sku, amount, net, rebate, tax, comment]
* description: Line shape for quote and order (no transactedAmount)
* required: [id, sku, name, pu, amount, net, rebate, tax, comment]
* description: Line shape for quote and order
* properties:
* id:
* type: integer
* articleId:
* type: integer
* nullable: true
* sku:
* type: string
* nullable: true
* name:
* type: string
* nullable: true
* description: Line item name or custom description
* pu:
* type: number
* description: Packaging unit (defaults to 1)
* amount:
* type: number
* net:
@@ -341,16 +354,26 @@
* type: number
* tax:
* type: number
* description: tax.rate
* description: tax.rate (manifestarticle.taxrate)
* comment:
* type: string
* nullable: true
* ManifestLineInput:
* type: object
* required: [sku, amount, net, tax]
* required: [amount, net, tax]
* description: Line item input. Requires `sku` or `name`.
* properties:
* sku:
* type: string
* nullable: true
* description: SKU reference (sku or name is required)
* name:
* type: string
* nullable: true
* description: Line item name (sku or name is required)
* pu:
* type: number
* description: Packaging unit (defaults to 1)
* amount:
* type: number
* net:

View File

@@ -81,9 +81,8 @@ export function register(app, basePath = '') {
* Creates a goods receipt with header and lines in one transaction.
* The manifest `number` is allocated automatically via
* `nextNumber('delivery')`; the user-supplied reference is stored as
* `externalNumber`. Each line requires `sku`, `amount`, `net`, and
* `tax` (rate). `rebate` defaults to `0`; `transactedAmount` defaults
* to `amount`.
* `externalNumber`. Each line requires `sku` or `name`, `amount`, `net`, and
* `tax` (rate). `pu` defaults to `1`; `rebate` defaults to `0`.
* security:
* - cookieAuth: []
* x-markdown: delivery/create.md
@@ -114,6 +113,8 @@ export function register(app, basePath = '') {
* supplierId: 1
* lines:
* - sku: '1'
* name: 'Sample Article'
* pu: 1
* amount: 10
* net: 99.5
* tax: 19

View File

@@ -194,8 +194,9 @@ export function register(app, basePath = '') {
// ── Fetch OpenRouter API key from company settings ────────────────
let apiKey;
try {
const setting = await dbCompanySetting.getByKey(req.user.id, 'keys.openrouter');
const setting = await dbCompanySetting.getByKey(req.user.id, 'keys.openrouter', { maskWriteonly: false });
apiKey = setting?.value;
console.log('parsePDF debug: user=', req.user.id, 'setting=', setting ? { ...setting, value: setting.value ? `${setting.value.slice(0, 8)}... (len=${setting.value.length})` : null } : null);
} catch (err) {
console.error('parsePDF: failed to read OpenRouter key:', err);
}
@@ -356,7 +357,7 @@ export function register(app, basePath = '') {
});
// ── LLMOrbiter setup ─────────────────────────────────────────────
const model = '~openai/gpt-sol-latest';
const model = '~openai/gpt-luna-latest:floor';
const provider = new OpenRouterProvider({ apiKey });
const orbiter = new LLMOrbiter(provider, {
onStatus: (status) => sseWrite(res, 'status', { message: status }),

View File

@@ -81,7 +81,7 @@ export function register(app, basePath = '') {
* Creates a sales order with header and lines in one transaction.
* `date` is the document date (expected delivery).
* `entityId` must be a company customer (not Lieferanten/POS), or null.
* Each line requires `sku`, `amount`, `net`, and `tax` (rate); `rebate` defaults to `0`.
* Each line requires `sku` or `name`, `amount`, `net`, and `tax` (rate); `pu` defaults to `1`; `rebate` defaults to `0`.
* security:
* - cookieAuth: []
* x-markdown: order/create.md
@@ -113,6 +113,8 @@ export function register(app, basePath = '') {
* entityId: 1
* lines:
* - sku: '1'
* name: 'Sample Article'
* pu: 1
* amount: 10
* net: 99.5
* tax: 19

View File

@@ -81,7 +81,7 @@ export function register(app, basePath = '') {
* Creates a quote with header and lines in one transaction.
* `date` is the document date (valid-until).
* `entityId` must be a company customer (not Lieferanten/POS), or null.
* Each line requires `sku`, `amount`, `net`, and `tax` (rate); `rebate` defaults to `0`.
* Each line requires `sku` or `name`, `amount`, `net`, and `tax` (rate); `pu` defaults to `1`; `rebate` defaults to `0`.
* security:
* - cookieAuth: []
* x-markdown: quote/create.md
@@ -113,6 +113,8 @@ export function register(app, basePath = '') {
* entityId: 1
* lines:
* - sku: '1'
* name: 'Sample Article'
* pu: 1
* amount: 10
* net: 99.5
* tax: 19