This commit is contained in:
seb
2026-10-07 21:23:10 +02:00
parent a29ad50b74
commit 7d537aaa6b
33 changed files with 598 additions and 327 deletions

View File

@@ -42,7 +42,14 @@ Updated Stückliste items
```json
{
"items": [
{}
{
"id": 1,
"articleId": 1,
"sku": "…",
"name": "…",
"count": 1,
"sort": 1
}
]
}
```

View File

@@ -44,7 +44,14 @@ Attached child article and list of children
"track_stock": true
},
"children": [
{}
{
"id": 1,
"sku": "…",
"name": "…",
"parentsort": 1,
"attributeValueId": 1,
"attributeValue": "…"
}
]
}
```

View File

@@ -44,7 +44,15 @@ Updated options list
```json
{
"options": [
{}
{
"id": 1,
"articleId": 1,
"sku": "…",
"name": "…",
"count": 1,
"sort": 1,
"mandated": true
}
]
}
```

View File

@@ -43,8 +43,21 @@ Updated article detail
"track_stock": true,
"unitamount": 1,
"weight": 1,
"unit": {},
"brand": {},
"unit": {
"si": "…",
"basesi": "…",
"basesifactor": 1,
"symbol": "…",
"name": "…"
},
"brand": {
"id": 1,
"name": "…",
"fullHash": "…",
"thumbW": 1,
"thumbH": 1,
"thumbHash": "…"
},
"categoryIds": [
1
],

View File

@@ -26,8 +26,21 @@ Article detail
"track_stock": true,
"unitamount": 1,
"weight": 1,
"unit": {},
"brand": {},
"unit": {
"si": "…",
"basesi": "…",
"basesifactor": 1,
"symbol": "…",
"name": "…"
},
"brand": {
"id": 1,
"name": "…",
"fullHash": "…",
"thumbW": 1,
"thumbH": 1,
"thumbHash": "…"
},
"categoryIds": [
1
],

View File

@@ -23,8 +23,8 @@ Sets `articlepic.sort` to `0..n-1` in the given order.
```json
{
"fullHashes": [
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
"aB1cD2eF",
"gH3iJ4kL"
]
}
```

View File

@@ -44,8 +44,21 @@ Updated article detail
"track_stock": true,
"unitamount": 1,
"weight": 1,
"unit": {},
"brand": {},
"unit": {
"si": "…",
"basesi": "…",
"basesifactor": 1,
"symbol": "…",
"name": "…"
},
"brand": {
"id": 1,
"name": "…",
"fullHash": "…",
"thumbW": 1,
"thumbH": 1,
"thumbHash": "…"
},
"categoryIds": [
1
],

View File

@@ -48,8 +48,21 @@ Updated article detail
"track_stock": true,
"unitamount": 1,
"weight": 1,
"unit": {},
"brand": {},
"unit": {
"si": "…",
"basesi": "…",
"basesifactor": 1,
"symbol": "…",
"name": "…"
},
"brand": {
"id": 1,
"name": "…",
"fullHash": "…",
"thumbW": 1,
"thumbH": 1,
"thumbHash": "…"
},
"categoryIds": [
1
],

View File

@@ -46,8 +46,21 @@ Updated article detail
"track_stock": true,
"unitamount": 1,
"weight": 1,
"unit": {},
"brand": {},
"unit": {
"si": "…",
"basesi": "…",
"basesifactor": 1,
"symbol": "…",
"name": "…"
},
"brand": {
"id": 1,
"name": "…",
"fullHash": "…",
"thumbW": 1,
"thumbH": 1,
"thumbHash": "…"
},
"categoryIds": [
1
],

View File

@@ -5,7 +5,8 @@ Protected. Requires a valid session cookie (`credentials: 'include'`).
Replace POS prices by SKU
Replace-all prices for the company POS customer group.
Each entry: `price` (net), `tax` (rate, ensured via tax.ensure), optional `minmultiplier` (default 1).
Each entry accepts `net` OR `gross` price (or legacy `price`), `taxRate` OR `tax` (percentage, e.g. 19 for 19%, ensured via tax.ensure), optional `minmultiplier` (default 1).
When `gross` is provided, net price is computed as `gross / (1 + taxRate / 100)`.
Empty `prices` clears all POS prices. Returns the same shape as GET by SKU (article `prices` array contains `{ minmultiplier, net, taxRate, customergroupId }`).
@@ -20,20 +21,23 @@ Empty `prices` clears all POS prices. Returns the same shape as GET by SKU (arti
| Field | Required | Type | Description |
|-------|----------|------|-------------|
| `prices` | yes | object[] | |
| `prices[].price` | yes | number | Net price |
| `prices[].tax` | yes | number | Tax rate (e.g. 19) |
| `prices[].minmultiplier` | no | number | Defaults to 1; must be unique per request |
| `prices[].net` | no | number | Net price (excl. VAT). Either `net`, `gross`, or legacy `price` is required. |
| `prices[].gross` | no | number | Gross price (incl. VAT). Net is computed as `gross / (1 + taxRate / 100)`. |
| `prices[].price` | no | number | Legacy alias for `net`. |
| `prices[].taxRate` | no | number | Tax rate percentage (e.g. 19 for 19%, 7 for 7%, 0 for 0%). |
| `prices[].tax` | no | number | Alias for `taxRate` percentage. |
| `prices[].minmultiplier` | no | number | Defaults to 1; must be unique per request. |
```json
{
"prices": [
{
"price": 10.5,
"tax": 19
"net": 10.5,
"taxRate": 19
},
{
"price": 9.9,
"tax": 19,
"gross": 11.9,
"taxRate": 19,
"minmultiplier": 10
}
]
@@ -58,8 +62,21 @@ Updated article detail
"track_stock": true,
"unitamount": 1,
"weight": 1,
"unit": {},
"brand": {},
"unit": {
"si": "…",
"basesi": "…",
"basesifactor": 1,
"symbol": "…",
"name": "…"
},
"brand": {
"id": 1,
"name": "…",
"fullHash": "…",
"thumbW": 1,
"thumbH": 1,
"thumbHash": "…"
},
"categoryIds": [
1
],

View File

@@ -44,8 +44,21 @@ Updated article detail
"track_stock": true,
"unitamount": 1,
"weight": 1,
"unit": {},
"brand": {},
"unit": {
"si": "…",
"basesi": "…",
"basesifactor": 1,
"symbol": "…",
"name": "…"
},
"brand": {
"id": 1,
"name": "…",
"fullHash": "…",
"thumbW": 1,
"thumbH": 1,
"thumbHash": "…"
},
"categoryIds": [
1
],

View File

@@ -48,8 +48,21 @@ Updated article detail
"track_stock": true,
"unitamount": 1,
"weight": 1,
"unit": {},
"brand": {},
"unit": {
"si": "…",
"basesi": "…",
"basesifactor": 1,
"symbol": "…",
"name": "…"
},
"brand": {
"id": 1,
"name": "…",
"fullHash": "…",
"thumbW": 1,
"thumbH": 1,
"thumbHash": "…"
},
"categoryIds": [
1
],

View File

@@ -17,16 +17,7 @@ Brand list
"id": 1,
"name": "…",
"gsprpinfo": "…",
"pics": [
{
"id": 1,
"sort": 1,
"fullHash": "…",
"thumbW": 1,
"thumbH": 1,
"thumbHash": "…"
}
]
"pics": []
}
]
}

View File

@@ -31,16 +31,7 @@ Upserted brand
"id": 1,
"name": "…",
"gsprpinfo": "…",
"pics": [
{
"id": 1,
"sort": 1,
"fullHash": "…",
"thumbW": 1,
"thumbH": 1,
"thumbHash": "…"
}
]
"pics": []
}
}
```

View File

@@ -30,11 +30,20 @@ Articles list
"optionsCount": 1,
"articleListCount": 1,
"childCount": 1,
"parentArticleId": 1,
"parentSku": "…",
"fullHash": "…",
"thumbW": 1,
"thumbH": 1,
"thumbHash": "…",
"brand": {}
"brand": {
"id": 1,
"name": "…",
"fullHash": "…",
"thumbW": 1,
"thumbH": 1,
"thumbHash": "…"
}
}
]
}

View File

@@ -14,10 +14,48 @@ Tree and articles for the selected company
{
"languageId": 1,
"tree": [
{}
{
"id": 1,
"parentId": 1,
"sort": 1,
"name": "…",
"slug": "…",
"fullHash": "…",
"thumbW": 1,
"thumbH": 1,
"thumbHash": "…",
"posterminalIds": [
1
]
}
],
"articles": [
{}
{
"id": 1,
"sku": "…",
"name": "…",
"slug": "…",
"net": 1,
"taxRate": 1,
"track_stock": true,
"optionsCount": 1,
"articleListCount": 1,
"childCount": 1,
"parentArticleId": 1,
"parentSku": "…",
"fullHash": "…",
"thumbW": 1,
"thumbH": 1,
"thumbHash": "…",
"brand": {
"id": 1,
"name": "…",
"fullHash": "…",
"thumbW": 1,
"thumbH": 1,
"thumbHash": "…"
}
}
]
}
```

View File

@@ -4,7 +4,7 @@ Protected. Requires a valid session cookie (`credentials: 'include'`).
Full image by hash
Returns the full AVIF by `pic.hash` (SHA-256 hex).
Returns the full AVIF by `pic.hash` (8-char alphanumeric Base62).
Auth via article category access. Browser-cacheable (`private`, `immutable`, `ETag`).
@@ -12,7 +12,7 @@ Auth via article category access. Browser-cacheable (`private`, `immutable`, `ET
| Param | Required | Type | Description |
|-------|----------|------|-------------|
| `fullHash` | yes | string | SHA-256 hex of the full image bytes |
| `fullHash` | yes | string | 8-char alphanumeric hash of the full image bytes |
## Response `200`

View File

@@ -55,7 +55,14 @@ Stock adjusted successfully
"createdAt": "2026-08-10T00:00:00.000Z"
},
"lines": [
{}
{
"manifestarticle_id": 1,
"sku": "…",
"name": "…",
"warehouse_id": 1,
"amount": 1,
"text": "…"
}
],
"ledger": [
{

View File

@@ -12,7 +12,7 @@ Auth via article category access. Browser-cacheable (`private`, `immutable`, `ET
| Param | Required | Type | Description |
|-------|----------|------|-------------|
| `fullHash` | yes | string | SHA-256 hex of the full image bytes |
| `fullHash` | yes | string | 8-char alphanumeric hash of the full image bytes |
## Response `200`

View File

@@ -5,7 +5,7 @@ Protected. Requires a valid session cookie (`credentials: 'include'`).
Delete a virtual filesystem file
Deletes a file from both the on-disk virtual filesystem and database for the authenticated user's selected company.
Deleting read-only database files (`image/*` or filenames containing 64-character hex hashes) is blocked with HTTP 403.
Deleting read-only database files (`image/*` or filenames containing 8-character image hashes) is blocked with HTTP 403.
## Path parameters

View File

@@ -8,7 +8,7 @@ Uploads one or more files to the virtual filesystem for the authenticated user's
Files are written to the company's VFS root directory and saved to the database.
An optional `targetDir` form field specifies a subfolder within the VFS.
Writing to read-only database paths (`image/*` or filenames containing 64-character hex hashes) is
Writing to read-only database paths (`image/*` or filenames containing 8-character image hashes) is
forbidden and automatically skipped during upload.

View File

@@ -10,7 +10,7 @@ Supports multiple request payload formats:
- Binary body: raw binary buffer with optional `Content-Type` header
- Plain text: raw UTF-8 string
Modifying read-only database paths (`image/*` or filenames containing 64-character hex hashes) is blocked with HTTP 403.
Modifying read-only database paths (`image/*` or filenames containing 8-character image hashes) is blocked with HTTP 403.
## Path parameters