Customer Bundle Schema
Felder
Customer Bundle Schema
A named, customer-owned collection of articles. Lets MSPs see at a glance which articles are bundled for customer A vs. customer B.
bundleNumber
Auto-generated sequence (e.g. PKG-2026-00042). Server-set, read-only.
name
Bundle name (e.g. "Müller-IT-Setup", "Backup-Plus 2026")
description
Bundle description visible internally
shortDescription
Short description shown on shop cards and list views
descriptionHtml
Rich marketing description (sanitized HTML) for the customer portal product page
partyId
Customer (party) the bundle belongs to (primary owner)
partyName
Denormalized customer name for list-view perf
availableForPartyIds
Additional parties that see this bundle in the customer-portal shop. Owner partyId is implicit; empty list = only owner.
visibleToAllCustomers
When true, every customer with shop access sees this bundle — overrides the per-party `availableForPartyIds` filter. Use for catalog/teaser bundles.
ownerHistory
Append-only audit log of every owner reassignment. Each entry captures who reassigned the bundle from which customer to which, when, and why. Written exclusively by POST /customer_bundles/:id/reassign-owner — direct PATCHes do not append.
fromPartyName
toPartyName
reason
changedByName
status
Bundle lifecycle state
DRAFTACTIVEEXPIREDCANCELLEDvalidFrom
Bundle valid from (YYYY-MM-DD)
validUntil
Bundle valid until (YYYY-MM-DD)
availableInShop
When true, the bundle appears in the customer-portal shop for the owner party (and any party in availableForPartyIds).
featured
Highlight this bundle in the customer-portal shop (featured row)
imageFileIds
Image gallery (resolved via /api/v1/files/{fileId}/download-url). First entry is the hero/cover image.
attachmentFileIds
Non-image attachments (datasheets, brochures, …) shown on the shop detail page
bundleItems
The articles bundled together for this customer
articleId
Referenced article UUID
articleName
Denormalized article name (snapshot at add time)
articleNumber
Denormalized article number
quantity
Quantity of this article in the bundle
unitPriceOverride
Override the article default price for this customer (gross or net depending on tenant config)
discountPercent
Optional line-level discount percentage (0..100)
note
Free-text note for this line (e.g. installation context)
positionNumber
Display order within the bundle
markupPercent
Optional bundle-level markup applied as a percentage of the line subtotal (0..100). Stacks with markupAmount.
markupAmount
Optional bundle-level flat-fee surcharge added on top of the line subtotal (and after markupPercent).
priceOnRequest
When true, the customer-portal shop hides the resolved package price and shows "Preis auf Anfrage" with an "Angebot anfragen" CTA, regardless of the computed line/markup total. Bundle orders then route to inquiry mode (opportunity/LEAD). Mirrors article.priceOnRequest for high-touch B2B packages negotiated per customer.
sourceTemplateArticleId
Optional FK to a SALES_BILL_OF_MATERIAL article that was used as a template to seed bundleItems
contractId
Optional FK to the contract this bundle is contracted under
salesOrderId
Optional FK to the sales order that created this bundle
internalNote
Internal note (not visible in customer portal)
tags
Tags for categorization
Keine Felder passen zum Filter.
Standard-Endpoints
Diese Resource folgt dem generischen CRUD-Vertrag der Plattform. Lesen Sie die Konventionen für Pagination, Idempotenz, Optimistic Locking und Audit. Die wichtigsten Endpoints:
GET /api/v1/customer_bundles— Liste, paginiert + filterbarGET /api/v1/customer_bundles/<id>— Einzelne EntityPOST /api/v1/customer_bundles— AnlegenPATCH /api/v1/customer_bundles/<id>— Teil-UpdateDELETE /api/v1/customer_bundles/<id>— Soft-DeleteGET /api/v1/customer_bundles/<id>/timeline— Audit + Aktivitäten