diff --git a/docs/api/openapi.json b/docs/api/openapi.json index 38683dd..4bb947b 100644 --- a/docs/api/openapi.json +++ b/docs/api/openapi.json @@ -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" diff --git a/docs/api/routes/delivery/create.md b/docs/api/routes/delivery/create.md index 5b98082..9052b58 100644 --- a/docs/api/routes/delivery/create.md +++ b/docs/api/routes/delivery/create.md @@ -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": "…" diff --git a/docs/api/routes/delivery/get.md b/docs/api/routes/delivery/get.md index ce45459..089b64e 100644 --- a/docs/api/routes/delivery/get.md +++ b/docs/api/routes/delivery/get.md @@ -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": "…" diff --git a/docs/api/routes/delivery/update.md b/docs/api/routes/delivery/update.md index 5a56ae7..50d01a5 100644 --- a/docs/api/routes/delivery/update.md +++ b/docs/api/routes/delivery/update.md @@ -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": "…" diff --git a/docs/api/routes/order/create.md b/docs/api/routes/order/create.md index df92870..46ce39a 100644 --- a/docs/api/routes/order/create.md +++ b/docs/api/routes/order/create.md @@ -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, diff --git a/docs/api/routes/order/get.md b/docs/api/routes/order/get.md index b21c174..8884458 100644 --- a/docs/api/routes/order/get.md +++ b/docs/api/routes/order/get.md @@ -27,8 +27,9 @@ Order "lines": [ { "id": 1, - "articleId": 1, "sku": "…", + "name": "…", + "pu": 1, "amount": 1, "net": 1, "rebate": 1, diff --git a/docs/api/routes/order/update.md b/docs/api/routes/order/update.md index ad16718..a5bf854 100644 --- a/docs/api/routes/order/update.md +++ b/docs/api/routes/order/update.md @@ -39,8 +39,9 @@ Updated order "lines": [ { "id": 1, - "articleId": 1, "sku": "…", + "name": "…", + "pu": 1, "amount": 1, "net": 1, "rebate": 1, diff --git a/docs/api/routes/quote/create.md b/docs/api/routes/quote/create.md index 6596f02..d04b77e 100644 --- a/docs/api/routes/quote/create.md +++ b/docs/api/routes/quote/create.md @@ -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, diff --git a/docs/api/routes/quote/get.md b/docs/api/routes/quote/get.md index 67cb456..9a18c19 100644 --- a/docs/api/routes/quote/get.md +++ b/docs/api/routes/quote/get.md @@ -27,8 +27,9 @@ Quote "lines": [ { "id": 1, - "articleId": 1, "sku": "…", + "name": "…", + "pu": 1, "amount": 1, "net": 1, "rebate": 1, diff --git a/docs/api/routes/quote/update.md b/docs/api/routes/quote/update.md index 71e4608..3f5271c 100644 --- a/docs/api/routes/quote/update.md +++ b/docs/api/routes/quote/update.md @@ -39,8 +39,9 @@ Updated quote "lines": [ { "id": 1, - "articleId": 1, "sku": "…", + "name": "…", + "pu": 1, "amount": 1, "net": 1, "rebate": 1, diff --git a/src/api/openapi.js b/src/api/openapi.js index 662d3da..25ebbed 100644 --- a/src/api/openapi.js +++ b/src/api/openapi.js @@ -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: diff --git a/src/api/routes/delivery.js b/src/api/routes/delivery.js index 0ab7823..74d5aa9 100644 --- a/src/api/routes/delivery.js +++ b/src/api/routes/delivery.js @@ -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 diff --git a/src/api/routes/deliveryParsePdf.js b/src/api/routes/deliveryParsePdf.js index 0eee48f..2cf66e2 100644 --- a/src/api/routes/deliveryParsePdf.js +++ b/src/api/routes/deliveryParsePdf.js @@ -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 }), diff --git a/src/api/routes/order.js b/src/api/routes/order.js index af98356..7771326 100644 --- a/src/api/routes/order.js +++ b/src/api/routes/order.js @@ -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 diff --git a/src/api/routes/quote.js b/src/api/routes/quote.js index 8a01160..11c8678 100644 --- a/src/api/routes/quote.js +++ b/src/api/routes/quote.js @@ -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