/** * Shared OpenAPI components scanned by `scripts/generateApiDocs.js`. * Route-specific paths live as `@openapi` blocks next to each handler. * * @openapi * components: * securitySchemes: * cookieAuth: * type: apiKey * in: cookie * name: token * description: HTTP-only session cookie set by POST /auth/login * bearerAuth: * type: http * scheme: bearer * bearerFormat: JWT * description: JWT token in Authorization header (Bearer ) * schemas: * Error: * type: object * required: [error] * properties: * error: * type: string * User: * type: object * required: [id, email, selectedCompanyId] * properties: * id: * type: integer * email: * type: string * format: email * selectedCompanyId: * type: integer * nullable: true * picture: * type: string * description: Profile image as base64 (from stored picturebinary); omitted when unset * Company: * type: object * properties: * id: * type: integer * name: * type: string * rootCategoryId: * type: integer * nullable: true * languageId: * type: integer * nullable: true * iso639: * type: string * nullable: true * taxrate: * type: number * reducedtaxrate: * type: number * taxfreerate: * type: number * SuccessResponse: * type: object * required: [ok] * properties: * ok: * type: boolean * example: true * CompanySetting: * type: object * required: [key, value] * properties: * key: * type: string * value: * type: string * nullable: true * Category: * type: object * properties: * id: * type: integer * parentId: * type: integer * nullable: true * sort: * type: integer * name: * type: string * Unit: * type: object * description: Measurement unit with conversion factor to base SI unit (e.g. g -> kg, ml -> l) * required: [si, basesi, basesifactor] * properties: * si: * type: string * description: Unit code identifier (e.g. "g", "kg", "ml", "l", "stk") * basesi: * type: string * description: Base SI reference unit (e.g. "kg" for mass, "l" or "m3" for volume, "stk" for counts) * basesifactor: * type: number * description: Conversion factor to base SI (1 si = basesifactor * basesi; e.g. 0.001 for g -> kg) * symbol: * type: string * nullable: true * name: * type: string * nullable: true * ArticleSummary: * type: object * properties: * id: * type: integer * categoryId: * type: integer * name: * type: string * sku: * type: string * track_stock: * type: boolean * Article: * type: object * properties: * id: * type: integer * categoryId: * type: integer * name: * type: string * sku: * type: string * track_stock: * type: boolean * ArticleDetail: * type: object * description: Full article payload (unit, brand, categoryIds, photos, eans, prices, track_stock, …) * properties: * id: * type: integer * sku: * type: string * name: * type: string * slug: * type: string * desc: * type: string * nullable: true * seo: * type: string * nullable: true * track_stock: * type: boolean * unitamount: * type: number * nullable: true * description: Net package content quantity measured in article unit (e.g. 500 for 500g, 0.75 for 0.75l) * weight: * type: number * nullable: true * description: Shipping weight in kg (must be >= 0) * unit: * $ref: '#/components/schemas/Unit' * brand: * $ref: '#/components/schemas/ArticleBrand' * nullable: true * categoryIds: * type: array * items: * type: integer * photos: * type: array * description: Attached article photos * items: * $ref: '#/components/schemas/ArticlePhoto' * eans: * type: array * items: * type: string * prices: * type: array * description: Selling prices by customer group and quantity tier (field is net, not price) * items: * $ref: '#/components/schemas/ArticlePriceEntry' * suppliers: * type: array * items: * $ref: '#/components/schemas/ArticleSupplier' * ArticlePhoto: * type: object * description: Article photo metadata * required: [sort, fullHash, fullW, fullH, fullSize, thumbW, thumbH, thumbHash] * properties: * sort: * type: integer * description: Display sort order * fullHash: * type: string * description: SHA-256 hex hash of the full AVIF image * fullW: * type: integer * description: Width in pixels of the full image * fullH: * type: integer * description: Height in pixels of the full image * fullSize: * type: integer * description: Byte length of full AVIF * thumbW: * type: integer * description: Width in pixels of the thumbnail image * thumbH: * type: integer * description: Height in pixels of the thumbnail image * thumbHash: * type: string * description: Base64 thumbhash preview * ArticlePriceEntry: * type: object * description: Article selling price tier for a customer group (note price field is net, not price) * required: [minmultiplier, net, taxRate, customergroupId] * properties: * minmultiplier: * type: number * description: Quantity threshold for volume pricing (defaults to 1) * net: * type: number * description: Net selling price * taxRate: * type: number * description: Tax rate in percent (e.g. 19 or 8.1) * customergroupId: * type: integer * description: Customer group ID (e.g. company POS customer group) * ArticleHistoryEntry: * type: object * required: [id, date, text] * properties: * id: * type: integer * date: * type: string * format: date-time * text: * type: string * CompanyHistoryEntry: * type: object * required: [id, date, text] * properties: * id: * type: integer * companyuserId: * type: integer * nullable: true * date: * type: string * format: date-time * text: * type: string * ArticleSupplierPrice: * type: object * required: [net, taxId] * properties: * net: * type: number * description: Net purchase price * taxId: * type: integer * description: Tax ID * taxRate: * type: number * nullable: true * description: Tax rate in percent * ArticleSupplier: * type: object * required: [id, articleId, entityId, pu, sort] * properties: * id: * type: integer * articleId: * type: integer * entityId: * type: integer * supplierName: * type: string * nullable: true * sku: * type: string * nullable: true * description: Supplier-specific SKU (Lieferanten-Art.-Nr.) * pu: * type: number * description: Packaging unit (Verpackungseinheit / VPE) * stock: * type: number * nullable: true * description: Supplier stock * sort: * type: integer * description: Display sort order * priceId: * type: integer * nullable: true * price: * $ref: '#/components/schemas/ArticleSupplierPrice' * nullable: true * SupplierArticlePhoto: * type: object * required: [sort, fullHash, thumbW, thumbH, thumbHash] * properties: * sort: * type: integer * fullHash: * type: string * thumbW: * type: integer * thumbH: * type: integer * thumbHash: * type: string * SupplierArticleInfo: * type: object * required: [id, sku] * properties: * id: * type: integer * sku: * type: string * name: * type: string * nullable: true * slug: * type: string * nullable: true * photos: * type: array * items: * $ref: '#/components/schemas/SupplierArticlePhoto' * eans: * type: array * items: * type: string * SupplierArticle: * allOf: * - $ref: '#/components/schemas/ArticleSupplier' * - type: object * required: [article] * properties: * article: * $ref: '#/components/schemas/SupplierArticleInfo' * BrandPic: * type: object * required: [fullHash, thumbW, thumbH, thumbHash] * properties: * fullHash: * type: string * thumbW: * type: integer * thumbH: * type: integer * thumbHash: * type: string * Brand: * type: object * required: [id, name, pics] * properties: * id: * type: integer * name: * type: string * gsprpinfo: * type: string * nullable: true * pics: * type: array * description: Brand pictures sorted by sort * items: * $ref: '#/components/schemas/BrandPic' * BrandListPic: * type: object * required: [fullHash, thumbW, thumbH, thumbHash] * properties: * fullHash: * type: string * thumbW: * type: integer * thumbH: * type: integer * thumbHash: * type: string * smallThumbW: * type: integer * nullable: true * description: Width in pixels of the small AVIF thumbnail * smallThumbH: * type: integer * nullable: true * description: Height in pixels of the small AVIF thumbnail * smallThumbBinary: * type: string * format: byte * nullable: true * description: Base64-encoded small AVIF thumbnail bytes * BrandList: * type: object * required: [id, name, articleCount, pics] * properties: * id: * type: integer * name: * type: string * articleCount: * type: integer * description: Number of articles assigned to this brand (excluding father articles, including child articles inheriting the brand) * gsprpinfo: * type: string * nullable: true * pics: * type: array * description: Brand pictures sorted by sort, including the 32px-edge small thumbnail * items: * $ref: '#/components/schemas/BrandListPic' * ArticleBrand: * type: object * required: [name] * properties: * id: * type: integer * nullable: true * name: * type: string * fullHash: * type: string * nullable: true * thumbW: * type: integer * nullable: true * thumbH: * type: integer * nullable: true * thumbHash: * type: string * nullable: true * StuecklisteItem: * type: object * required: [id, articleId, sku, name, count, sort] * properties: * id: * type: integer * articleId: * type: integer * sku: * type: string * name: * type: string * count: * type: integer * sort: * type: integer * ArticleChild: * type: object * required: [id, sku, name, parentsort, attributeValueId, attributeValue] * properties: * id: * type: integer * sku: * type: string * name: * type: string * parentsort: * type: integer * attributeValueId: * type: integer * attributeValue: * type: string * ArticleOptionItem: * type: object * required: [id, articleId, sku, name, count, sort, mandated] * properties: * id: * type: integer * articleId: * type: integer * sku: * type: string * name: * type: string * count: * type: integer * sort: * type: integer * mandated: * type: boolean * CategoryTreeNode: * type: object * required: [id, sort, posterminalIds] * properties: * id: * type: integer * parentId: * type: integer * nullable: true * sort: * type: integer * name: * type: string * nullable: true * slug: * type: string * nullable: true * fullHash: * type: string * nullable: true * thumbW: * type: integer * nullable: true * thumbH: * type: integer * nullable: true * thumbHash: * type: string * nullable: true * articleCount: * type: integer * description: Number of articles assigned directly to this category * posterminalIds: * type: array * items: * type: integer * CategoryArticle: * type: object * required: [id, sku, name, slug, track_stock, optionsCount, articleListCount, childCount] * properties: * id: * type: integer * sku: * type: string * name: * type: string * slug: * type: string * net: * type: number * nullable: true * taxRate: * type: number * nullable: true * track_stock: * type: boolean * optionsCount: * type: integer * articleListCount: * type: integer * childCount: * type: integer * parentArticleId: * type: integer * nullable: true * parentSku: * type: string * nullable: true * fullHash: * type: string * nullable: true * thumbW: * type: integer * nullable: true * thumbH: * type: integer * nullable: true * thumbHash: * type: string * nullable: true * brand: * $ref: '#/components/schemas/ArticleBrand' * nullable: true * NumberSequence: * type: object * required: [id, type, prefix, padding, next] * properties: * id: * type: integer * type: * type: string * description: Sequence type (e.g. entity, article, delivery) * prefix: * type: string * padding: * type: integer * description: Zero-padding length for the numeric part * next: * type: integer * description: Next value to allocate * Supplier: * type: object * required: [id, name, createdAt, updatedAt] * properties: * id: * type: integer * name: * type: string * createdAt: * type: string * format: date-time * updatedAt: * type: string * format: date-time * Customergroup: * type: object * required: [id, name, sort] * properties: * id: * type: integer * name: * type: string * sort: * type: integer * CustomergroupListItem: * allOf: * - $ref: '#/components/schemas/Customergroup' * - type: object * required: [editable] * properties: * editable: * type: boolean * description: | * `false` for implicit groups `POS` and `Lieferanten` (name locked). * `true` for user-created groups. Reorder all groups via * `PUT /customergroup/order`. * Entity: * type: object * required: [id, customergroupId, firstName, name, number, createdAt, updatedAt] * properties: * id: * type: integer * customergroupId: * type: integer * firstName: * type: string * nullable: true * name: * type: string * number: * type: string * nullable: true * description: Customer number (null for suppliers) * createdAt: * type: string * format: date-time * updatedAt: * type: string * format: date-time * EntityAddress: * type: object * required: [id, entityId, addressType] * properties: * id: * type: integer * entityId: * type: integer * firstName: * type: string * nullable: true * name: * type: string * nullable: true * street: * type: string * nullable: true * streetNumber: * type: string * nullable: true * zip: * type: string * nullable: true * city: * type: string * nullable: true * county: * type: string * nullable: true * addressType: * type: string * EntityContact: * type: object * required: [id, entityId, contactType, contact] * properties: * id: * type: integer * entityId: * type: integer * contactType: * type: string * description: e.g. email, phone * contact: * type: string * DeliverySummary: * type: object * required: [id, number, type, supplierId, date] * properties: * id: * type: integer * number: * type: string * description: Auto-allocated via nextNumber('delivery') * type: * type: string * enum: [delivery] * supplierId: * type: integer * nullable: true * description: manifest.entity_id * externalNumber: * type: string * nullable: true * description: User-supplied reference number * date: * type: string * format: date-time * createdAt: * type: string * format: date-time * ledger: * type: object * description: Ledger booking summary for this delivery * properties: * totalPositions: * type: integer * description: Total number of position lines on this manifest * completelyOnLedgerPositions: * type: integer * description: Number of positions whose quantity is fully transacted in the ledger * DeliveryLine: * type: object * required: [id, sku, name, pu, amount, net, rebate, taxrate, comment] * properties: * id: * type: integer * 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 * rebate: * type: number * taxrate: * type: number * description: Tax rate in percent (e.g. 19) * comment: * type: string * nullable: true * DeliveryLineInput: * type: object * required: [amount, net, taxrate] * 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: * type: number * taxrate: * type: number * description: Tax rate in percent (resolved via tax.ensure) * rebate: * type: number * description: Defaults to 0 * comment: * type: string * nullable: true * Delivery: * allOf: * - $ref: '#/components/schemas/DeliverySummary' * - type: object * required: [lines, files] * properties: * lines: * type: array * items: * $ref: '#/components/schemas/DeliveryLine' * files: * type: array * description: Attached documents (pdf/txt) for the delivery * items: * $ref: '#/components/schemas/DeliveryFile' * DeliveryFile: * type: object * description: Attachment metadata (full binary content is served via `GET /delivery/{id}/file/{fileId}`). Thumbnails (AVIF) are generated server-side. * required: [id, manifestId, fileId, sort, hash, mimetype, name, size] * properties: * id: * type: integer * description: manifestattachment id * manifestId: * type: integer * fileId: * type: integer * sort: * type: integer * hash: * type: string * description: SHA-256 of the file content * mimetype: * type: string * description: application/pdf or text/plain * name: * type: string * size: * type: integer * created: * type: string * format: date-time * modified: * type: string * format: date-time * thumbavif: * type: string * format: byte * nullable: true * description: Base64-encoded AVIF thumbnail generated server-side (null for text files) * thumbx: * type: integer * nullable: true * thumby: * type: integer * nullable: true * meta: * type: object * nullable: true * description: String key/value metadata from the file row * additionalProperties: * type: string * DeliveryFileInput: * type: object * required: [mimetype, name, content] * description: Attachment input. Only application/pdf and text/plain are accepted. Thumbnails are generated server-side and must not be supplied by the client. * properties: * mimetype: * type: string * enum: [application/pdf, text/plain] * name: * type: string * content: * type: string * format: byte * description: File content (base64-encoded in JSON) * sort: * type: integer * description: Optional sort order (defaults to appending after existing files) * size: * type: integer * description: Optional size in bytes (defaults to content length) * hash: * type: string * description: Optional SHA-256 (auto-computed if omitted) * created: * type: string * format: date-time * modified: * type: string * format: date-time * meta: * type: object * description: Optional string key/value metadata stored with the file * additionalProperties: * type: string * ManifestLine: * type: object * required: [id, sku, name, pu, amount, net, rebate, taxrate, comment] * description: Line shape for quote and order * properties: * id: * type: integer * 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 * rebate: * type: number * taxrate: * type: number * description: Tax rate in percent (e.g. 19) * comment: * type: string * nullable: true * ManifestLineInput: * type: object * required: [amount, net, taxrate] * 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: * type: number * taxrate: * type: number * description: Tax rate in percent (resolved via tax.ensure) * rebate: * type: number * description: Defaults to 0 * comment: * type: string * nullable: true * QuoteSummary: * type: object * required: [id, number, type, entityId, date] * properties: * id: * type: integer * number: * type: string * type: * type: string * enum: [quote] * entityId: * type: integer * nullable: true * description: Customer (manifest.entity_id) * date: * type: string * format: date-time * description: Document date / valid-until * createdAt: * type: string * format: date-time * positions: * type: integer * description: Number of line items * grossTotal: * type: number * description: Gross sum across quote positions * totalQuantity: * type: number * description: Total quantity across quote positions * customerName: * type: string * nullable: true * Quote: * allOf: * - $ref: '#/components/schemas/QuoteSummary' * - type: object * required: [lines] * properties: * lines: * type: array * items: * $ref: '#/components/schemas/ManifestLine' * OrderSummary: * type: object * required: [id, number, type, entityId, date] * properties: * id: * type: integer * number: * type: string * type: * type: string * enum: [order] * entityId: * type: integer * nullable: true * description: Customer (manifest.entity_id) * date: * type: string * format: date-time * description: Document date / expected delivery * createdAt: * type: string * format: date-time * Order: * allOf: * - $ref: '#/components/schemas/OrderSummary' * - type: object * required: [lines] * properties: * lines: * type: array * items: * $ref: '#/components/schemas/ManifestLine' * shipping: * $ref: '#/components/schemas/Shipping' * nullable: true * shippings: * type: array * items: * $ref: '#/components/schemas/Shipping' * payment: * $ref: '#/components/schemas/Payment' * nullable: true * payments: * type: array * items: * $ref: '#/components/schemas/Payment' * paid: * type: boolean * description: True when paidTotal equals orderTotal * shipped: * type: boolean * description: True when shippedQuantity equals orderedQuantity * delivered: * type: boolean * orderTotal: * type: number * description: Gross sum across order positions * paidTotal: * type: number * description: Sum of all payments connected to order * orderedQuantity: * type: number * description: Total ordered items * shippedQuantity: * type: number * description: Total shipped items across order shipments * shipments: * type: array * items: * $ref: '#/components/schemas/Shipment' * files: * type: array * description: Attached documents (e.g. order PDF) for the order * items: * $ref: '#/components/schemas/DeliveryFile' * ArticleImage: * type: object * required: [picId, sort, full, thumb, hash, thumbHash] * properties: * picId: * type: integer * sort: * type: integer * full: * type: object * required: [w, h, size] * properties: * w: * type: integer * h: * type: integer * size: * type: integer * description: Byte length of full AVIF (as-is when already AVIF ≤1000×1000) * thumb: * type: object * required: [w, h] * properties: * w: * type: integer * h: * type: integer * hash: * type: string * description: SHA-256 hex of full image bytes * thumbHash: * type: string * description: Base64 thumbhash of thumb preview * LedgerEntry: * type: object * required: [id, manifestarticle_id, transaction_type, amount, transaction_text, hash_version] * properties: * id: * type: integer * manifestarticle_id: * type: integer * description: References manifestarticle.id * transaction_type: * type: string * description: Transaction identifier / type * amount: * type: number * description: Movement amount * transaction_text: * type: string * description: Transaction memo / details * hash_version: * type: integer * description: Algorithm version (1) * prev_hash: * type: string * description: Previous entry SHA-512 hex or initial seed hash * sku: * type: string * nullable: true * description: SKU from referenced manifestarticle (present in query views) * created_at: * type: string * format: date-time * description: Timestamp when the row was created * LedgerEntryInput: * type: object * required: [manifestarticle_id, transaction_type, amount, transaction_text] * properties: * manifestarticle_id: * type: integer * description: References manifestarticle.id * transaction_type: * type: string * description: Transaction identifier / type (max 100 chars) * amount: * type: number * description: Movement amount * transaction_text: * type: string * description: Transaction memo / details * ModelConversation: * type: object * required: [id, companyuser_id, provider, model, created_at, updated_at, state] * properties: * id: * type: integer * companyuser_id: * type: integer * provider: * type: string * model: * type: string * created_at: * type: string * updated_at: * type: string * state: * type: string * enum: [idle, busy] * description: Messages can only be posted while `idle` * started_by: * type: [integer, 'null'] * description: Id of the conversation that started this one as a subagent, or null for a top-level conversation. Deleting a conversation also deletes every conversation below it in this chain. * first_message: * type: [string, 'null'] * description: Plain text of the conversation's first user message (XML stripped, max 50 chars, ellipsis if cut), or null if there is none yet. * ModelConversationCreateInput: * type: object * required: [provider, model] * properties: * provider: * type: string * model: * type: string * ModelMessage: * type: object * required: [id, conversation_id, created_at, role, message] * properties: * id: * type: integer * conversation_id: * type: integer * created_at: * type: string * role: * type: string * enum: [system, user, assistant, tool, reasoning, usage] * message: * type: string * ModelMessageCreateInput: * type: object * properties: * message: * type: string * description: User message text or fallback content * role: * type: string * enum: [user, tool] * description: Message role ('user' or 'tool') * tool_call_id: * type: string * description: Target tool call ID when responding to a tool like ask_user * content: * description: Tool response content payload * answer: * description: Shorthand answer for ask_user response * Account: * type: object * required: [id, companyId, type, name] * properties: * id: * type: integer * companyId: * type: integer * type: * type: string * name: * type: string * Payment: * type: object * required: [id, accountId, manifestId, type, amount] * properties: * id: * type: integer * accountId: * type: integer * manifestId: * type: integer * type: * type: string * amount: * type: number * Shipping: * type: object * required: [id, manifestId, number, type, state] * properties: * id: * type: integer * manifestId: * type: integer * number: * type: string * description: Shipping number from the `shipping` number sequence * trackingCode: * type: string * nullable: true * description: Carrier parcel tracking code * carrier: * type: string * nullable: true * description: Carrier name (e.g. DHL, UPS, DPD) * type: * type: string * state: * type: string * Shipment: * type: object * required: [id, number, type, date, lines, shippings] * properties: * id: * type: integer * number: * type: string * description: Shipment compound number `` * type: * type: string * enum: [shipment] * entityId: * type: integer * nullable: true * externalNumber: * type: string * nullable: true * date: * type: string * createdAt: * type: string * nullable: true * lineCount: * type: integer * packageCount: * type: integer * lines: * type: array * items: * $ref: '#/components/schemas/ManifestLine' * shippings: * type: array * items: * $ref: '#/components/schemas/Shipping' * Package: * type: object * required: [id, shippingId, entityaddressId, number, type, state] * properties: * id: * type: integer * shippingId: * type: integer * entityaddressId: * type: integer * number: * type: string * description: Package number from the `package` number sequence * type: * type: string * state: * type: string * details: * type: string * nullable: true * Printer: * type: object * required: [id, company_id, address, type, sort] * properties: * id: * type: integer * company_id: * type: integer * address: * type: string * description: Printer network address or hostname * type: * type: string * enum: [esc/pos, zpl, ipp] * description: Printer type ("esc/pos" for lines, "zpl" for pages, or "ipp") * model: * type: string * nullable: true * description: Printer model name * serial: * type: string * nullable: true * description: Printer serial number * sort: * type: integer * description: Sort order * desc: * type: string * nullable: true * description: Printer description * PrinterCreateInput: * type: object * required: [address, type] * properties: * address: * type: string * description: Printer network address or hostname * type: * type: string * enum: [esc/pos, zpl, ipp] * description: Printer type ("esc/pos" for lines, "zpl" for pages, or "ipp") * model: * type: string * nullable: true * serial: * type: string * nullable: true * sort: * type: integer * desc: * type: string * nullable: true * PrinterUpdateInput: * type: object * properties: * address: * type: string * type: * type: string * enum: [esc/pos, zpl, ipp] * model: * type: string * nullable: true * serial: * type: string * nullable: true * sort: * type: integer * desc: * type: string * nullable: true * Posterminal: * type: object * required: [id, name] * properties: * id: * type: integer * name: * type: string * pairingpin: * type: string * nullable: true * token: * type: string * nullable: true * pairedAt: * type: string * nullable: true * clientserial: * type: string * nullable: true * rootCategoryId: * type: integer * nullable: true * syncRootArticles: * type: boolean * lastseenAt: * type: string * nullable: true * updatedAt: * type: string * nullable: true * categoryIds: * type: array * items: * type: integer * LabelObject: * type: object * required: [id, type, x, y] * properties: * id: * type: string * type: * type: string * enum: [textbox, barcode, png] * x: * type: number * y: * type: number * w: * type: number * h: * type: number * text: * type: string * font: * type: string * fontSize: * type: number * barcodeFormat: * type: string * enum: [EAN8, EAN13, CODE128, QR] * LabelContent: * type: object * required: [objects] * properties: * objects: * type: array * description: Canvas label editor items * items: * $ref: '#/components/schemas/LabelObject' * LabelTemplateSummary: * type: object * required: [id, name, width, height, dpi, type] * properties: * id: * type: integer * name: * type: string * width: * type: number * height: * type: number * dpi: * type: integer * type: * type: string * thumb: * type: string * nullable: true * LabelTemplate: * type: object * required: [id, name, width, height, dpi, type, content] * properties: * id: * type: integer * name: * type: string * width: * type: number * height: * type: number * dpi: * type: integer * type: * type: string * content: * $ref: '#/components/schemas/LabelContent' * thumb: * type: string * nullable: true * LabelTemplateCreateInput: * type: object * required: [name, width, height, dpi, type, content] * properties: * name: * type: string * width: * type: number * height: * type: number * dpi: * type: integer * type: * type: string * content: * $ref: '#/components/schemas/LabelContent' * LabelTemplateUpdateInput: * type: object * properties: * name: * type: string * width: * type: number * height: * type: number * dpi: * type: integer * type: * type: string * content: * $ref: '#/components/schemas/LabelContent' * Warehouse: * type: object * required: [id, name, sort] * properties: * id: * type: integer * name: * type: string * sort: * type: integer * description: Sort order * WarehouseCreateInput: * type: object * required: [name] * properties: * name: * type: string * sort: * type: integer * description: Optional sort order (defaults to auto-increment) * WarehouseUpdateInput: * type: object * properties: * name: * type: string * sort: * type: integer * description: Sort order * StockAdjustmentInput: * type: object * description: Stock adjustment input. Provide `sku` and `amount` for single-item adjustments, or `lines` for batch adjustments. Note that `sku` must be a string (e.g. "25"), not a number. * properties: * sku: * type: string * description: Article SKU string (e.g. "25", not a number; for single-item adjustment) * warehouseId: * type: integer * description: Target warehouse ID * amount: * type: number * description: Signed adjustment quantity (+ to add, - to remove) * text: * type: string * nullable: true * description: Reason or memo * lines: * type: array * description: Batch adjustment lines * items: * type: object * required: [sku, amount] * properties: * sku: * type: string * description: Article SKU string (e.g. "25", not a number) * warehouseId: * type: integer * description: Target warehouse ID * amount: * type: number * description: Signed adjustment quantity (+ to add, - to remove) * text: * type: string * description: Reason or memo * StockAdjustmentResult: * type: object * properties: * manifest: * type: object * properties: * id: * type: integer * number: * type: string * type: * type: string * example: adjustment * date: * type: string * format: date-time * createdAt: * type: string * format: date-time * lines: * type: array * items: * type: object * required: [manifestarticle_id, sku, name, warehouse_id, amount, text] * properties: * manifestarticle_id: * type: integer * sku: * type: string * name: * type: string * warehouse_id: * type: integer * amount: * type: number * text: * type: string * ledger: * type: array * items: * $ref: '#/components/schemas/LedgerEntry' * Propertyname: * type: object * required: [id, name, sort, exclusive] * properties: * id: * type: integer * name: * type: string * sort: * type: integer * exclusive: * type: boolean * articleCount: * type: integer * description: Number of articles in the selected company that have an articleproperty row for this property. * ArticleProperty: * type: object * required: [id, propertyId, name, exclusive, value, sort] * properties: * id: * type: integer * articleId: * type: integer * propertyId: * type: integer * name: * type: string * exclusive: * type: boolean * value: * type: string * sort: * type: integer * AttributeValue: * type: object * required: [id, attributeId, value, sort] * properties: * id: * type: integer * attributeId: * type: integer * value: * type: string * sort: * type: integer * articleCount: * type: integer * description: Number of articles in the selected company having this attribute value. * AttributeValuePic: * type: object * required: [fullHash, thumbW, thumbH, thumbHash] * properties: * fullHash: * type: string * thumbW: * type: integer * thumbH: * type: integer * thumbHash: * type: string * Attributename: * type: object * required: [id, name, sort, exclusive, values] * properties: * id: * type: integer * name: * type: string * sort: * type: integer * exclusive: * type: boolean * articleCount: * type: integer * description: Number of parent articles in the selected company configured with this attribute name. * values: * type: array * items: * $ref: '#/components/schemas/AttributeValue' * ArticleAttributeValue: * type: object * required: [id, attributeId, attributeName, attributeValueId, value, sort] * properties: * id: * type: integer * articleId: * type: integer * attributeId: * type: integer * attributeName: * type: string * exclusive: * type: boolean * attributeValueId: * type: integer * value: * type: string * sort: * type: integer * CategoryProperty: * type: object * required: [id, propertyId, name, exclusive, value, sort] * properties: * id: * type: integer * categoryId: * type: integer * propertyId: * type: integer * name: * type: string * exclusive: * type: boolean * value: * type: string * sort: * type: integer * CategoryAttributeValue: * type: object * required: [id, attributeId, attributeName, attributeValueId, value, sort] * properties: * id: * type: integer * categoryId: * type: integer * attributeId: * type: integer * attributeName: * type: string * exclusive: * type: boolean * attributeValueId: * type: integer * value: * type: string * sort: * type: integer * VfsFile: * type: object * required: [name, size, mime, updated_at, created_at, isText, isImage, isPdf] * properties: * name: * type: string * description: Relative file path within the virtual filesystem * size: * type: integer * description: File size in bytes * mime: * type: string * description: Detected or declared MIME type * updated_at: * type: string * format: date-time * description: ISO timestamp of last modification * created_at: * type: string * format: date-time * description: ISO timestamp of creation * isText: * type: boolean * description: True if file is text, code, JSON, Markdown, or tabular data * isImage: * type: boolean * description: True if file is a supported raster image eligible for preview thumbnailing * isPdf: * type: boolean * description: True if file is a PDF document * BackupFileDetail: * type: object * required: [name, sizeBytes, sourceExists] * properties: * name: * type: string * sizeBytes: * type: integer * sourceExists: * type: boolean * BackupDatabaseDetail: * type: object * required: [name, sizeBytes, backedUp] * properties: * name: * type: string * nullable: true * sizeBytes: * type: integer * backedUp: * type: boolean * reason: * type: string * nullable: true * BackupManifest: * type: object * required: [id, timestamp, dateKey, monthKey, dbProvider, files, totalSizeBytes, durationMs] * properties: * id: * type: string * timestamp: * type: string * format: date-time * dateKey: * type: string * monthKey: * type: string * dbProvider: * type: string * files: * type: object * required: [vfs, storage, database] * properties: * vfs: * $ref: '#/components/schemas/BackupFileDetail' * storage: * $ref: '#/components/schemas/BackupFileDetail' * database: * $ref: '#/components/schemas/BackupDatabaseDetail' * totalSizeBytes: * type: integer * durationMs: * type: integer * BackupEntry: * type: object * required: [name, path, totalSizeBytes, timestamp] * properties: * name: * type: string * path: * type: string * totalSizeBytes: * type: integer * timestamp: * type: string * format: date-time * nullable: true * manifest: * $ref: '#/components/schemas/BackupManifest' * nullable: true * BackupTierCounts: * type: object * required: [hourly, daily, monthly] * properties: * hourly: * type: integer * daily: * type: integer * monthly: * type: integer * BackupRetentionConfig: * type: object * required: [hourlyMax, dailyMax, monthly] * properties: * hourlyMax: * type: integer * dailyMax: * type: integer * monthly: * type: string * BackupStatus: * type: object * required: [enabled, isRunning, dbProvider, mssqlWarning, backupDir, retention, counts] * properties: * enabled: * type: boolean * isRunning: * type: boolean * dbProvider: * type: string * mssqlWarning: * type: boolean * backupDir: * type: string * retention: * $ref: '#/components/schemas/BackupRetentionConfig' * counts: * $ref: '#/components/schemas/BackupTierCounts' * latestHourly: * $ref: '#/components/schemas/BackupEntry' * nullable: true * latestDaily: * $ref: '#/components/schemas/BackupEntry' * nullable: true * latestMonthly: * $ref: '#/components/schemas/BackupEntry' * nullable: true * BackupListing: * type: object * required: [counts, hourly, daily, monthly] * properties: * counts: * $ref: '#/components/schemas/BackupTierCounts' * hourly: * type: array * items: * $ref: '#/components/schemas/BackupEntry' * daily: * type: array * items: * $ref: '#/components/schemas/BackupEntry' * monthly: * type: array * items: * $ref: '#/components/schemas/BackupEntry' * BackupOverviewResponse: * type: object * required: [status, backups] * properties: * status: * $ref: '#/components/schemas/BackupStatus' * backups: * $ref: '#/components/schemas/BackupListing' * BackupVfsFileItem: * type: object * required: [name, size, mime, mtime] * properties: * name: * type: string * size: * type: integer * mime: * type: string * mtime: * type: string * format: date-time * BackupVfsListResponse: * type: object * required: [backupId, companyId, files] * properties: * backupId: * type: string * companyId: * type: integer * files: * type: array * items: * $ref: '#/components/schemas/BackupVfsFileItem' * BackupVfsRecoverRequest: * type: object * required: [path] * properties: * path: * type: string * description: Relative path of the VFS file to recover * companyId: * type: integer * description: Optional company ID (defaults to user's selected company) * BackupVfsRecoverResponse: * type: object * required: [success, backupId, companyId, path, sizeBytes, mime] * properties: * success: * type: boolean * backupId: * type: string * companyId: * type: integer * path: * type: string * sizeBytes: * type: integer * mime: * type: string */ export {};