"Documents the access-scope capabilities a caller must hold to invoke this field. `anyOf` succeeds when the caller holds at least one of the listed capabilities; `allOf` requires every listed capability." directive @requiresScopes( "Capability strings (`:`). The caller must hold at least one entry." anyOf: [String!] "Capability strings (`:`). The caller must hold every entry." allOf: [String!] ) on FIELD_DEFINITION "Any entity that can be loaded by its global id through the `node(id: ID!)` query." interface Node { "Global identifier for this entity." id: ID! } type Query { batches(first: Int = 10, after: String, filter: BatchFilterInput): BatchConnection! @requiresScopes(anyOf: ["batches:read"]) "Loads a single Batch by id." batch(id: ID!): Batch @requiresScopes(anyOf: ["batches:read"]) binLocations(first: Int = 10, after: String, filter: BinLocationFilterInput): BinLocationConnection! @requiresScopes(anyOf: ["warehouses:read"]) "Loads a single BinLocation by id." binLocation(id: ID!): BinLocation @requiresScopes(anyOf: ["warehouses:read"]) countrys(first: Int = 10, after: String, filter: CountryFilterInput): CountryConnection! @requiresScopes(anyOf: ["countries:read"]) "Loads a single Country by id." country(id: ID!): Country @requiresScopes(anyOf: ["countries:read"]) currencies(first: Int = 10, after: String, filter: CurrencyFilterInput): CurrencyConnection! @requiresScopes(anyOf: ["currencies:read"]) "Loads a single Currency by id." currency(id: ID!): Currency @requiresScopes(anyOf: ["currencies:read"]) customers(first: Int = 10, after: String, filter: CustomerFilterInput): CustomerConnection! @requiresScopes(anyOf: ["customers:read"]) "Loads a single Customer by id." customer(id: ID!): Customer @requiresScopes(anyOf: ["customers:read"]) customerGroups(first: Int = 10, after: String, filter: CustomerGroupFilterInput): CustomerGroupConnection! @requiresScopes(anyOf: ["customer_groups:read"]) "Loads a single CustomerGroup by id." customerGroup(id: ID!): CustomerGroup @requiresScopes(anyOf: ["customer_groups:read"]) documents(first: Int = 10, after: String, filter: DocumentFilterInput): DocumentConnection! @requiresScopes(anyOf: ["documents:read"]) "Loads a single Document by id." document(id: ID!): Document @requiresScopes(anyOf: ["documents:read"]) documentTypes(first: Int = 10, after: String, filter: DocumentTypeFilterInput): DocumentTypeConnection! @requiresScopes(anyOf: ["documents:read"]) "Loads a single DocumentType by id." documentType(id: ID!): DocumentType @requiresScopes(anyOf: ["documents:read"]) fulfillments(first: Int = 10, after: String, filter: FulfillmentFilterInput): FulfillmentConnection! @requiresScopes(anyOf: ["fulfillment_orders:read"]) "Loads a single Fulfillment by id." fulfillment(id: ID!): Fulfillment @requiresScopes(anyOf: ["fulfillment_orders:read"]) fulfillmentLineItems(first: Int = 10, after: String, filter: FulfillmentLineItemFilterInput): FulfillmentLineItemConnection! @requiresScopes(anyOf: ["fulfillment_orders:read"]) "Loads a single FulfillmentLineItem by id." fulfillmentLineItem(id: ID!): FulfillmentLineItem @requiresScopes(anyOf: ["fulfillment_orders:read"]) fulfillmentOrders(first: Int = 10, after: String, filter: FulfillmentOrderFilterInput): FulfillmentOrderConnection! @requiresScopes(anyOf: ["fulfillment_orders:read"]) "Loads a single FulfillmentOrder by id." fulfillmentOrder(id: ID!): FulfillmentOrder @requiresScopes(anyOf: ["fulfillment_orders:read"]) fulfillmentOrderLineItems(first: Int = 10, after: String, filter: FulfillmentOrderLineItemFilterInput): FulfillmentOrderLineItemConnection! @requiresScopes(anyOf: ["fulfillment_orders:read"]) "Loads a single FulfillmentOrderLineItem by id." fulfillmentOrderLineItem(id: ID!): FulfillmentOrderLineItem @requiresScopes(anyOf: ["fulfillment_orders:read"]) goodsReceipts(first: Int = 10, after: String, filter: GoodsReceiptFilterInput): GoodsReceiptConnection! @requiresScopes(anyOf: ["goods_receipts:read"]) "Loads a single GoodsReceipt by id." goodsReceipt(id: ID!): GoodsReceipt @requiresScopes(anyOf: ["goods_receipts:read"]) goodsReceiptLineItems(first: Int = 10, after: String, filter: GoodsReceiptLineItemFilterInput): GoodsReceiptLineItemConnection! @requiresScopes(anyOf: ["goods_receipts:read"]) "Loads a single GoodsReceiptLineItem by id." goodsReceiptLineItem(id: ID!): GoodsReceiptLineItem @requiresScopes(anyOf: ["goods_receipts:read"]) locations(first: Int = 10, after: String, filter: LocationFilterInput): LocationConnection! @requiresScopes(anyOf: ["locations:read"]) "Loads a single Location by id." location(id: ID!): Location @requiresScopes(anyOf: ["locations:read"]) orders(first: Int = 10, after: String, filter: OrderFilterInput): OrderConnection! @requiresScopes(anyOf: ["orders:read"]) "Loads a single Order by id." order(id: ID!): Order @requiresScopes(anyOf: ["orders:read"]) orderLineItems(first: Int = 10, after: String, filter: OrderLineItemFilterInput): OrderLineItemConnection! @requiresScopes(anyOf: ["orders:read"]) "Loads a single OrderLineItem by id." orderLineItem(id: ID!): OrderLineItem @requiresScopes(anyOf: ["orders:read"]) paymentMethods(first: Int = 10, after: String, filter: PaymentMethodFilterInput): PaymentMethodConnection! @requiresScopes(anyOf: ["payment_methods:read"]) "Loads a single PaymentMethod by id." paymentMethod(id: ID!): PaymentMethod @requiresScopes(anyOf: ["payment_methods:read"]) products(first: Int = 10, after: String, filter: ProductFilterInput): ProductConnection! @requiresScopes(anyOf: ["products:read"]) "Loads a single Product by id." product(id: ID!): Product @requiresScopes(anyOf: ["products:read"]) productStockLocationConfigurations(first: Int = 10, after: String, filter: ProductStockLocationConfigurationFilterInput): ProductStockLocationConfigurationConnection! @requiresScopes(anyOf: ["product_stock_location_configurations:read"]) "Loads a single ProductStockLocationConfiguration by id." productStockLocationConfiguration(id: ID!): ProductStockLocationConfiguration @requiresScopes(anyOf: ["product_stock_location_configurations:read"]) productSupplierConfigurations(first: Int = 10, after: String, filter: ProductSupplierConfigurationFilterInput): ProductSupplierConfigurationConnection! @requiresScopes(anyOf: ["product_supplier_configurations:read"]) "Loads a single ProductSupplierConfiguration by id." productSupplierConfiguration(id: ID!): ProductSupplierConfiguration @requiresScopes(anyOf: ["product_supplier_configurations:read"]) productWarehouseConfigurations(first: Int = 10, after: String, filter: ProductWarehouseConfigurationFilterInput): ProductWarehouseConfigurationConnection! @requiresScopes(anyOf: ["product_warehouse_configurations:read"]) "Loads a single ProductWarehouseConfiguration by id." productWarehouseConfiguration(id: ID!): ProductWarehouseConfiguration @requiresScopes(anyOf: ["product_warehouse_configurations:read"]) quotes(first: Int = 10, after: String, filter: QuoteFilterInput): QuoteConnection! @requiresScopes(anyOf: ["quotes:read"]) "Loads a single Quote by id." quote(id: ID!): Quote @requiresScopes(anyOf: ["quotes:read"]) quoteLineItems(first: Int = 10, after: String, filter: QuoteLineItemFilterInput): QuoteLineItemConnection! @requiresScopes(anyOf: ["quotes:read"]) "Loads a single QuoteLineItem by id." quoteLineItem(id: ID!): QuoteLineItem @requiresScopes(anyOf: ["quotes:read"]) salesChannels(first: Int = 10, after: String, filter: SalesChannelFilterInput): SalesChannelConnection! @requiresScopes(anyOf: ["sales_channels:read"]) "Loads a single SalesChannel by id." salesChannel(id: ID!): SalesChannel @requiresScopes(anyOf: ["sales_channels:read"]) salutations(first: Int = 10, after: String, filter: SalutationFilterInput): SalutationConnection! @requiresScopes(anyOf: ["salutations:read"]) "Loads a single Salutation by id." salutation(id: ID!): Salutation @requiresScopes(anyOf: ["salutations:read"]) shippingLabels(first: Int = 10, after: String, filter: ShippingLabelFilterInput): ShippingLabelConnection! @requiresScopes(anyOf: ["shipping_labels:read"]) "Loads a single ShippingLabel by id." shippingLabel(id: ID!): ShippingLabel @requiresScopes(anyOf: ["shipping_labels:read"]) stocks(first: Int = 10, after: String, filter: StockFilterInput): StockConnection! @requiresScopes(anyOf: ["stocks:read"]) "Loads a single Stock by id." stock(id: ID!): Stock @requiresScopes(anyOf: ["stocks:read"]) stockMovements(first: Int = 10, after: String, filter: StockMovementFilterInput): StockMovementConnection! @requiresScopes(anyOf: ["stocks:read"]) "Loads a single StockMovement by id." stockMovement(id: ID!): StockMovement @requiresScopes(anyOf: ["stocks:read"]) suppliers(first: Int = 10, after: String, filter: SupplierFilterInput): SupplierConnection! @requiresScopes(anyOf: ["suppliers:read"]) "Loads a single Supplier by id." supplier(id: ID!): Supplier @requiresScopes(anyOf: ["suppliers:read"]) supplierOrders(first: Int = 10, after: String, filter: SupplierOrderFilterInput): SupplierOrderConnection! @requiresScopes(anyOf: ["supplier_orders:read"]) "Loads a single SupplierOrder by id." supplierOrder(id: ID!): SupplierOrder @requiresScopes(anyOf: ["supplier_orders:read"]) supplierOrderLineItems(first: Int = 10, after: String, filter: SupplierOrderLineItemFilterInput): SupplierOrderLineItemConnection! @requiresScopes(anyOf: ["supplier_orders:read"]) "Loads a single SupplierOrderLineItem by id." supplierOrderLineItem(id: ID!): SupplierOrderLineItem @requiresScopes(anyOf: ["supplier_orders:read"]) tags(first: Int = 10, after: String, filter: TagFilterInput): TagConnection! @requiresScopes(anyOf: ["tags:read"]) "Loads a single Tag by id." tag(id: ID!): Tag @requiresScopes(anyOf: ["tags:read"]) warehouses(first: Int = 10, after: String, filter: WarehouseFilterInput): WarehouseConnection! @requiresScopes(anyOf: ["warehouses:read"]) "Loads a single Warehouse by id." warehouse(id: ID!): Warehouse @requiresScopes(anyOf: ["warehouses:read"]) warehouseStocks(first: Int = 10, after: String, filter: WarehouseStockFilterInput): WarehouseStockConnection! @requiresScopes(anyOf: ["stocks:read"]) "Loads a single WarehouseStock by id." warehouseStock(id: ID!): WarehouseStock @requiresScopes(anyOf: ["stocks:read"]) webhookSubscriptions(first: Int = 10, after: String, filter: WebhookSubscriptionFilterInput): WebhookSubscriptionConnection! @requiresScopes(anyOf: ["webhook_subscriptions:read"]) "Loads a single WebhookSubscription by id." webhookSubscription(id: ID!): WebhookSubscription @requiresScopes(anyOf: ["webhook_subscriptions:read"]) "Loads any entity by its global id." node(id: ID!): Node } "Filter input for `Batch` connections. Combines per-field scalar filters with `AND`, `OR` and `NOT`." input BatchFilterInput { id: IDFilter comment: StringFilter number: StringFilter physicalStock: IntFilter productId: IDFilter AND: [BatchFilterInput!] OR: [BatchFilterInput!] NOT: BatchFilterInput } input IDFilter { equals: ID in: [ID!] notIn: [ID!] } input StringFilter { equals: String in: [String!] contains: String startsWith: String endsWith: String isNull: Boolean } input IntFilter { equals: Int in: [Int!] lt: Int lte: Int gt: Int gte: Int isNull: Boolean } "A paginated list of `Batch`." type BatchConnection { edges: [BatchEdge!]! pageInfo: PageInfo! } "An edge in a `Batch` connection." type BatchEdge { cursor: String! node: Batch! } "A batch of a product (e.g. lot, serial group). Used to track stock down to a batch level for products with expiry dates or batch-traceable inventory. The `(productId, number)` pair is unique." type Batch implements Node { "Global identifier for this entity." id: ID! "Free-form note attached to the batch (handling instructions, source, …)." comment: String "Batch identifier (lot number, serial group, …). Unique per product." number: String "Total units of this batch present across all warehouses." physicalStock: Int! "ID of the product this batch belongs to." productId: ID! goodsReceiptLineItems(first: Int = 10, after: String, filter: GoodsReceiptLineItemFilterInput): GoodsReceiptLineItemConnection @requiresScopes(anyOf: ["goods_receipts:read"]) product: Product @requiresScopes(anyOf: ["products:read"]) tags(first: Int = 10, after: String, filter: TagFilterInput): TagConnection @requiresScopes(anyOf: ["tags:read"]) } "Filter input for `GoodsReceiptLineItem` connections. Combines per-field scalar filters with `AND`, `OR` and `NOT`." input GoodsReceiptLineItemFilterInput { id: IDFilter batchId: IDFilter goodsReceiptId: IDFilter plannedDisposalQuantity: IntFilter productId: IDFilter quantity: IntFilter returnOrderId: IDFilter supplierOrderId: IDFilter totalPrice: FloatFilter totalPriceInDefaultCurrency: FloatFilter unitPrice: FloatFilter unitPriceInDefaultCurrency: FloatFilter AND: [GoodsReceiptLineItemFilterInput!] OR: [GoodsReceiptLineItemFilterInput!] NOT: GoodsReceiptLineItemFilterInput } input FloatFilter { equals: Float in: [Float!] lt: Float lte: Float gt: Float gte: Float isNull: Boolean } "A paginated list of `GoodsReceiptLineItem`." type GoodsReceiptLineItemConnection { edges: [GoodsReceiptLineItemEdge!]! pageInfo: PageInfo! } "An edge in a `GoodsReceiptLineItem` connection." type GoodsReceiptLineItemEdge { cursor: String! node: GoodsReceiptLineItem! } "A single line on a `GoodsReceipt`. Tracks the product, optional batch, the quantity moved and the per-unit and total price. Optional FKs (`supplierOrderId`, `returnOrderId`) link the line back to its originating document." type GoodsReceiptLineItem implements Node { "Global identifier for this entity." id: ID! "ID of the batch the units belong to, when batch tracking is enabled for the product." batchId: ID "ID of the parent goods receipt." goodsReceiptId: ID! "Number of the received units that are to be disposed instead of stocked. Set while the goods receipt is being processed and reset to `0` once the disposal is booked, which happens when the goods receipt is stocked." plannedDisposalQuantity: Int! "ID of the product being received." productId: ID "Number of units moved. Signed: negative quantities represent outgoing movements (e.g. corrections)." quantity: Int! "ID of the originating return order, when the receipt was opened from a customer return." returnOrderId: ID "ID of the originating supplier order, when the receipt was opened from one." supplierOrderId: ID "Line total in the parent receipt's currency (`unitPrice * quantity`)." totalPrice: Float "Line total converted into the system default currency with the exchange rate of the parent receipt. Null under the same conditions as `unitPriceInDefaultCurrency`." totalPriceInDefaultCurrency: Float "Per-unit price in the parent receipt's currency." unitPrice: Float "Per-unit price converted into the system default currency with the exchange rate of the parent receipt (`GoodsReceipt.currencyFactor`). Stock value and the last purchase price are computed from it. Null while the line item has no price, and on line items received before this was stored until a background job after the update has filled it in." unitPriceInDefaultCurrency: Float batch: Batch @requiresScopes(anyOf: ["batches:read"]) destinationBinLocation: BinLocation @requiresScopes(anyOf: ["warehouses:read"]) goodsReceipt: GoodsReceipt @requiresScopes(anyOf: ["goods_receipts:read"]) product: Product @requiresScopes(anyOf: ["products:read"]) supplierOrder: SupplierOrder @requiresScopes(anyOf: ["supplier_orders:read"]) } "A bin location inside a warehouse — the smallest addressable place stock can live. Pick lists and stock movements reference bin locations rather than the warehouse as a whole." type BinLocation implements Node { "Global identifier for this entity." id: ID! "Bin label (e.g. `A-01-03`). Unique per warehouse." code: String! "Timestamp the bin location was first persisted." createdAt: DateTime! "Optional ordering hint used by pick-route generation. Lower numbers are visited first." position: Int "Timestamp of the last update." updatedAt: DateTime "ID of the parent warehouse." warehouseId: ID! destinationGoodsReceiptLineItems(first: Int = 10, after: String, filter: GoodsReceiptLineItemFilterInput): GoodsReceiptLineItemConnection @requiresScopes(anyOf: ["goods_receipts:read"]) destinationStockMovements(first: Int = 10, after: String, filter: StockMovementFilterInput): StockMovementConnection @requiresScopes(anyOf: ["stocks:read"]) productWarehouseConfigurations(first: Int = 10, after: String, filter: ProductWarehouseConfigurationFilterInput): ProductWarehouseConfigurationConnection @requiresScopes(anyOf: ["product_warehouse_configurations:read"]) sourceStockMovements(first: Int = 10, after: String, filter: StockMovementFilterInput): StockMovementConnection @requiresScopes(anyOf: ["stocks:read"]) stocks(first: Int = 10, after: String, filter: StockFilterInput): StockConnection @requiresScopes(anyOf: ["stocks:read"]) tags(first: Int = 10, after: String, filter: TagFilterInput): TagConnection @requiresScopes(anyOf: ["tags:read"]) warehouse: Warehouse @requiresScopes(anyOf: ["warehouses:read"]) } "ISO 8601 / RFC 3339 date-time string in the format YYYY-MM-DDTHH:MM:SS+ZZ:ZZ." scalar DateTime "Filter input for `StockMovement` connections. Combines per-field scalar filters with `AND`, `OR` and `NOT`." input StockMovementFilterInput { id: IDFilter createdAt: DateTimeFilter destinationBinLocationId: IDFilter destinationGoodsReceiptId: IDFilter destinationLocationTypeTechnicalName: StringFilter destinationOrderId: IDFilter destinationReturnOrderId: IDFilter destinationSpecialStockLocationTechnicalName: StringFilter destinationStockContainerId: IDFilter destinationWarehouseId: IDFilter productId: IDFilter quantity: IntFilter sourceBinLocationId: IDFilter sourceGoodsReceiptId: IDFilter sourceLocationTypeTechnicalName: StringFilter sourceOrderId: IDFilter sourceReturnOrderId: IDFilter sourceSpecialStockLocationTechnicalName: StringFilter sourceStockContainerId: IDFilter sourceWarehouseId: IDFilter AND: [StockMovementFilterInput!] OR: [StockMovementFilterInput!] NOT: StockMovementFilterInput } input DateTimeFilter { equals: DateTime before: DateTime after: DateTime isNull: Boolean } "A paginated list of `StockMovement`." type StockMovementConnection { edges: [StockMovementEdge!]! pageInfo: PageInfo! } "An edge in a `StockMovement` connection." type StockMovementEdge { cursor: String! node: StockMovement! } "A single booking in the stock movement ledger: `quantity` units of a product moved from a source location to a destination location. Each location is described by its `…LocationTypeTechnicalName` and the one matching `…Id` / `…SpecialStockLocationTechnicalName` field; the others are `null`. The matching `…Id` is `null` as well once the referenced location has been deleted. Stock movements are not edited after they are booked, but deleting a product deletes its stock movements." type StockMovement implements Node { "Global identifier for this entity." id: ID! "Timestamp the stock movement was booked." createdAt: DateTime! "ID of the destination bin location, if the destination location type is `bin_location` and the bin location still exists." destinationBinLocationId: ID "ID of the destination goods receipt, if the destination location type is `goods_receipt` and the goods receipt still exists." destinationGoodsReceiptId: ID "Technical name of the destination location type (`warehouse`, `bin_location`, `order`, `return_order`, `goods_receipt`, `stock_container`, `special_stock_location`)." destinationLocationTypeTechnicalName: String! "ID of the destination order, if the destination location type is `order` and the order still exists." destinationOrderId: ID "ID of the destination return order, if the destination location type is `return_order` and the return order still exists." destinationReturnOrderId: ID "Technical name of the destination special stock location (e.g. `stock_correction`, `import`, `initialization`, `unknown`), if the destination location type is `special_stock_location`." destinationSpecialStockLocationTechnicalName: String "ID of the destination stock container, if the destination location type is `stock_container` and the stock container still exists." destinationStockContainerId: ID "ID of the destination warehouse, if the destination location type is `warehouse` and the warehouse still exists." destinationWarehouseId: ID """ Technical name of the process that booked the stock movement, i.e. the reason for it. Known values include `supplier_order`, `free_goods_receipt`, `return_order`, `shipping`, `shipped_automatically`, `cancelled_fulfillment`, `relocation`, `incoming`, `outgoing`, `stocktaking`, `csv_import_incoming`, `csv_import_outgoing`, `api`, `api_incoming`, `api_outgoing`, `api_relocation` and `api_shipping`. Other plugins register their own values, so treat the list as open. `null` for stock movements booked without a process, which includes all stock movements booked before processes were introduced in March 2025. """ processTypeTechnicalName: String "ID of the moved product." productId: ID! "Number of units moved. Always positive; the direction follows from the source and destination location." quantity: Int! "ID of the source bin location, if the source location type is `bin_location` and the bin location still exists." sourceBinLocationId: ID "ID of the source goods receipt, if the source location type is `goods_receipt` and the goods receipt still exists." sourceGoodsReceiptId: ID "Technical name of the source location type (`warehouse`, `bin_location`, `order`, `return_order`, `goods_receipt`, `stock_container`, `special_stock_location`)." sourceLocationTypeTechnicalName: String! "ID of the source order, if the source location type is `order` and the order still exists." sourceOrderId: ID "ID of the source return order, if the source location type is `return_order` and the return order still exists." sourceReturnOrderId: ID "Technical name of the source special stock location (e.g. `stock_correction`, `import`, `initialization`, `unknown`), if the source location type is `special_stock_location`." sourceSpecialStockLocationTechnicalName: String "ID of the source stock container, if the source location type is `stock_container` and the stock container still exists." sourceStockContainerId: ID "ID of the source warehouse, if the source location type is `warehouse` and the warehouse still exists." sourceWarehouseId: ID destinationBinLocation: BinLocation @requiresScopes(anyOf: ["warehouses:read"]) destinationGoodsReceipt: GoodsReceipt @requiresScopes(anyOf: ["goods_receipts:read"]) destinationOrder: Order @requiresScopes(anyOf: ["orders:read"]) destinationWarehouse: Warehouse @requiresScopes(anyOf: ["warehouses:read"]) product: Product @requiresScopes(anyOf: ["products:read"]) sourceBinLocation: BinLocation @requiresScopes(anyOf: ["warehouses:read"]) sourceGoodsReceipt: GoodsReceipt @requiresScopes(anyOf: ["goods_receipts:read"]) sourceOrder: Order @requiresScopes(anyOf: ["orders:read"]) sourceWarehouse: Warehouse @requiresScopes(anyOf: ["warehouses:read"]) } "An incoming or outgoing goods movement booked against a warehouse — supplier receipt, return-from-customer, manual stock correction. Carries the per-line quantities and prices that are posted to stock once the receipt is completed." type GoodsReceipt implements Node { "Global identifier for this entity." id: ID! "Net total in the receipt's currency, excluding tax." amountNet: Float "Grand total in the receipt's currency, including tax." amountTotal: Float "Free-form note attached to the goods receipt." comment: String "Exchange rate the receipt is valued with, as units of the receipt's currency per one unit of the system default currency. Taken when the receipt is created and changeable until the receipt is part of a stock valuation report; stock value and the last purchase price are computed from it. `currencyFactorOriginType` tells where it comes from." currencyFactor: Float "Timestamp `currencyFactor` was taken or last set by hand. Null for receipts created before the origin was recorded." currencyFactorCapturedAt: DateTime "Provider of the exchange rate (`ECB` or `Frankfurter`) when `currencyFactorOriginType` is `ExchangeRateImport`, null otherwise." currencyFactorOriginSource: String "Where `currencyFactor` comes from. Null for receipts created before the origin was recorded." currencyFactorOriginType: CurrencyFactorOriginType "Date the provider published the exchange rate for when `currencyFactorOriginType` is `ExchangeRateImport`, null otherwise." currencyFactorReferenceDate: DateTime "ID of the currency the receipt is denominated in." currencyId: ID "ID of the customer, when the receipt is a return from a customer." customerId: ID "Timestamp the goods movement happened (booked at completion)." goodsReceiptDateTime: DateTime! "Human-readable goods receipt number." number: String! "Sum of all line item prices before order-level discounts/charges, in the receipt's currency." positionPrice: Float "Technical name of the receipt's state: `draft`, `created`, `approved`, `in_progress` or `completed`." state: String! "ID of the supplier, when the receipt is sourced from a supplier order." supplierId: ID "Tax status of the receipt (`gross`, `net`, `tax-free`)." taxStatus: String "Origin of the incoming stock: `Supplier` for a delivery against supplier orders (see `supplierOrders`), `Customer` for goods returned by a customer, `Free` for stock received without either." type: GoodsReceiptType! "ID of the admin user that created the goods receipt." userId: ID "ID of the warehouse the stock is posted into." warehouseId: ID currency: Currency @requiresScopes(anyOf: ["currencies:read"]) customer: Customer @requiresScopes(anyOf: ["customers:read"]) destinationStockMovements(first: Int = 10, after: String, filter: StockMovementFilterInput): StockMovementConnection @requiresScopes(anyOf: ["stocks:read"]) lineItems(first: Int = 10, after: String, filter: GoodsReceiptLineItemFilterInput): GoodsReceiptLineItemConnection @requiresScopes(anyOf: ["goods_receipts:read"]) sourceStockMovements(first: Int = 10, after: String, filter: StockMovementFilterInput): StockMovementConnection @requiresScopes(anyOf: ["stocks:read"]) stocks(first: Int = 10, after: String, filter: StockFilterInput): StockConnection @requiresScopes(anyOf: ["stocks:read"]) supplier: Supplier @requiresScopes(anyOf: ["suppliers:read"]) supplierOrders(first: Int = 10, after: String, filter: SupplierOrderFilterInput): SupplierOrderConnection @requiresScopes(anyOf: ["supplier_orders:read"]) tags(first: Int = 10, after: String, filter: TagFilterInput): TagConnection @requiresScopes(anyOf: ["tags:read"]) warehouse: Warehouse @requiresScopes(anyOf: ["warehouses:read"]) } "Where the exchange rate a goods receipt is valued with comes from." enum CurrencyFactorOriginType { "The rate of the automatic exchange rate update, e.g. a reference rate of the ECB. `currencyFactorOriginSource` and `currencyFactorReferenceDate` name the provider and the date of the rate." ExchangeRateImport "The rate was set by hand for this goods receipt." Manual "The factor of the currency in the shop, maintained without the automatic exchange rate update." ShopCurrencyFactor } "Classifies a goods receipt by the origin of the incoming stock." enum GoodsReceiptType { "Standalone receipt with no upstream origin (manual stock-in, found stock, etc.). It references no supplier order and no return." Free "Receipt booked against a customer return order — incoming stock comes from a returned customer shipment." Customer "Receipt booked against a supplier order — incoming stock is a delivery from a supplier." Supplier } "A currency known to the shop. Used as the unit for monetary scalars and as the per-sales-channel default currency." type Currency implements Node { "Global identifier for this entity." id: ID! "Conversion factor relative to the default currency. `1.0` for the default itself." factor: Float! "True for the shop's system default currency. Derived from `Defaults::CURRENCY`; equivalent to `id === Defaults::CURRENCY` but cheaper for clients than fetching the default id separately." isDefaultCurrency: Boolean! "ISO 4217 currency code (e.g. `EUR`, `USD`). Stable across locales." isoCode: String! "Localised display name (e.g. `Euro`, `US Dollar`)." name: String "`1` renders the symbol *after* the amount, `0` renders it *before*." position: Int "Short display label. Localised, so may diverge from `isoCode`." shortName: String "Currency symbol used when rendering prices (e.g. `€`, `$`)." symbol: String! orders(first: Int = 10, after: String, filter: OrderFilterInput): OrderConnection @requiresScopes(anyOf: ["orders:read"]) salesChannelDefaultAssignments(first: Int = 10, after: String, filter: SalesChannelFilterInput): SalesChannelConnection @requiresScopes(anyOf: ["sales_channels:read"]) salesChannels(first: Int = 10, after: String, filter: SalesChannelFilterInput): SalesChannelConnection @requiresScopes(anyOf: ["sales_channels:read"]) } "Filter input for `Order` connections. Combines per-field scalar filters with `AND`, `OR` and `NOT`." input OrderFilterInput { id: IDFilter amountNet: FloatFilter amountTotal: FloatFilter createdAt: DateTimeFilter currencyId: IDFilter orderDateTime: DateTimeFilter orderNumber: StringFilter updatedAt: DateTimeFilter AND: [OrderFilterInput!] OR: [OrderFilterInput!] NOT: OrderFilterInput } "A paginated list of `Order`." type OrderConnection { edges: [OrderEdge!]! pageInfo: PageInfo! } "An edge in a `Order` connection." type OrderEdge { cursor: String! node: Order! } "A customer order." type Order implements Node { "Global identifier for this entity." id: ID! "Order net total in the order's currency, excluding tax." amountNet: Float "Order grand total in the order's currency, including tax. Recomputed on every line-item change." amountTotal: Float "Timestamp the order row was first persisted (usually equal to `orderDateTime`)." createdAt: DateTime! "ID of the currency the order is denominated in." currencyId: ID! "Name of the primary delivery's state (e.g. `open`, `shipped`, `returned`)." deliveryState: String "Timestamp the order was placed." orderDateTime: DateTime! "Human-readable order number assigned at checkout." orderNumber: String "Name of the primary transaction's payment state (e.g. `open`, `paid`, `refunded`)." paymentState: String "Shopify GID of the order, e.g. `gid://shopify/Order/5123`. Null for an order that was not imported from Shopify." shopifyId: String "Name of the order's state (e.g. `open`, `in_progress`, `completed`, `cancelled`)." state: String! "Tracking codes of the primary delivery, as a JSON array of strings. Every shipping label Pickware creates for the order adds its outgoing tracking codes there and cancelling the label removes them, so the list covers all shipments of the order, together with codes entered on the delivery by hand. Empty while that delivery carries none, `null` when the order has no delivery at all." trackingCodes: JSON "Timestamp of the last update to the order row." updatedAt: DateTime currency: Currency @requiresScopes(anyOf: ["currencies:read"]) documents(first: Int = 10, after: String, filter: DocumentFilterInput): DocumentConnection @requiresScopes(anyOf: ["documents:read"]) fulfillmentOrders(first: Int = 10, after: String, filter: FulfillmentOrderFilterInput): FulfillmentOrderConnection @requiresScopes(anyOf: ["fulfillment_orders:read"]) lineItems(first: Int = 10, after: String, filter: OrderLineItemFilterInput): OrderLineItemConnection @requiresScopes(anyOf: ["orders:read"]) salesChannel: SalesChannel @requiresScopes(anyOf: ["sales_channels:read"]) tags(first: Int = 10, after: String, filter: TagFilterInput): TagConnection @requiresScopes(anyOf: ["tags:read"]) } "A scalar that can represent any JSON value (object, array, string, number, boolean, or null)." scalar JSON "Filter input for `Document` connections. Combines per-field scalar filters with `AND`, `OR` and `NOT`." input DocumentFilterInput { id: IDFilter deepLinkCode: StringFilter documentNumber: StringFilter sent: BooleanFilter static: BooleanFilter AND: [DocumentFilterInput!] OR: [DocumentFilterInput!] NOT: DocumentFilterInput } input BooleanFilter { equals: Boolean } "A paginated list of `Document`." type DocumentConnection { edges: [DocumentEdge!]! pageInfo: PageInfo! } "An edge in a `Document` connection." type DocumentEdge { cursor: String! node: Document! } "A generated document attached to an order (invoice, credit note, delivery note, …). Each document points at a static rendered file plus the JSON `config` used to render it." type Document implements Node { "Global identifier for this entity." id: ID! "JSON object holding the rendering input captured at document creation (customer address, totals, line items, …)." config: JSON! "Random code used as part of the public download URL so the file can be served without an authenticated session." deepLinkCode: String! "Human-readable document number assigned at render time (e.g. invoice number). Format is controlled by the document type's number range." documentNumber: String "Public download URL for the rendered file: `/api/_action/document/{id}/{deepLinkCode}`. Stable for the lifetime of the document." downloadUrl: String! "True once the document was marked as sent to the customer (e.g. an invoice email was dispatched)." sent: Boolean "True when the document was uploaded as a finished file rather than rendered. Static documents have no live `config`." static: Boolean dependentDocuments(first: Int = 10, after: String, filter: DocumentFilterInput): DocumentConnection @requiresScopes(anyOf: ["documents:read"]) documentType: DocumentType @requiresScopes(anyOf: ["documents:read"]) order: Order @requiresScopes(anyOf: ["orders:read"]) referencedDocument: Document @requiresScopes(anyOf: ["documents:read"]) } "A document type — the kind classifier for a `Document` (e.g. invoice, credit note, delivery note)." type DocumentType implements Node { "Global identifier for this entity." id: ID! "Localised display name (e.g. `Invoice`, `Credit note`)." name: String "Stable machine-readable identifier (e.g. `invoice`, `credit_note`). Safe to switch on in client code." technicalName: String! documents(first: Int = 10, after: String, filter: DocumentFilterInput): DocumentConnection @requiresScopes(anyOf: ["documents:read"]) } "Pagination metadata for a connection." type PageInfo { hasNextPage: Boolean! hasPreviousPage: Boolean! startCursor: String endCursor: String } "Filter input for `FulfillmentOrder` connections. Combines per-field scalar filters with `AND`, `OR` and `NOT`." input FulfillmentOrderFilterInput { id: IDFilter createdAt: DateTimeFilter destinationOrderId: IDFilter isPartiallyFulfilled: BooleanFilter number: StringFilter shippingMethodId: IDFilter sourceWarehouseLocationId: IDFilter state: FulfillmentOrderStateFilter type: FulfillmentOrderTypeFilter updatedAt: DateTimeFilter AND: [FulfillmentOrderFilterInput!] OR: [FulfillmentOrderFilterInput!] NOT: FulfillmentOrderFilterInput } input FulfillmentOrderStateFilter { equals: FulfillmentOrderState in: [FulfillmentOrderState!] isNull: Boolean } "State of a fulfillment order." enum FulfillmentOrderState { "No work has started on the fulfillment order yet." Open "Work on the fulfillment order has started, e.g. picking." InProgress "The merchant has put the fulfillment order on hold. It must not be worked on until it is released." OnHold "No work remains on the fulfillment order. Closed does not imply that all of its quantities were fulfilled; `fulfillments` tells which were." Closed "The fulfillment order was cancelled. Its quantities are no longer to be fulfilled from its location." Cancelled } input FulfillmentOrderTypeFilter { equals: FulfillmentOrderType in: [FulfillmentOrderType!] isNull: Boolean } "Where a fulfillment order is fulfilled from and where it is delivered to." enum FulfillmentOrderType { "The fulfillment order is fulfilled in Pickware, from one of the merchant's locations, and delivered to the customer of the order." WarehouseLocationToOrder "The fulfillment order is to be fulfilled externally, from a location Pickware does not manage, e.g. an unmapped Shopify location or Amazon FBA. Pickware mirrors it, but the shipping work happens outside Pickware." ExternalToOrder } "A paginated list of `FulfillmentOrder`." type FulfillmentOrderConnection { edges: [FulfillmentOrderEdge!]! pageInfo: PageInfo! } "An edge in a `FulfillmentOrder` connection." type FulfillmentOrderEdge { cursor: String! node: FulfillmentOrder! } "The assignment of an order's line items, in specific quantities, to exactly one location they are to be fulfilled from. One order can have several fulfillment orders, also at the same location. A fulfillment order assigned to a location Pickware does not manage is to be fulfilled externally (`type: ExternalToOrder`)." type FulfillmentOrder implements Node { "Global identifier for this entity." id: ID! "Timestamp the fulfillment order was created." createdAt: DateTime! "ID of the order the fulfillment order belongs to." destinationOrderId: ID "Name of the Shopify location a fulfillment order that is to be fulfilled externally is assigned to, e.g. an unmapped Shopify location or Amazon FBA. Such a fulfillment order has no `sourceWarehouseLocation` in Pickware. Null for a fulfillment order fulfilled in Pickware." externalLocationName: String "True when at least one fulfillment exists for the fulfillment order while some of its quantities are still open." isPartiallyFulfilled: Boolean! "Human-readable fulfillment order number." number: String! "Shipping address of the fulfillment order, captured when the fulfillment order was created. It can differ from the order's current shipping address and is null when the order had no shipping address. An object with the keys `company`, `department`, `firstName`, `lastName`, `street`, `additionalAddressLine1`, `additionalAddressLine2`, `zipcode`, `city`, `countryName`, `countryIso`, `countryStateName`, `countryStateShortCode` and `phoneNumber`. Every value is a string or null." shippingAddress: JSON "ID of the shipping method the fulfillment order is to be shipped with." shippingMethodId: ID "Name of the shipping method the fulfillment order is to be shipped with." shippingMethodName: String "Shopify GID of the fulfillment order, e.g. `gid://shopify/FulfillmentOrder/4123`. Null for a fulfillment order that does not belong to an order imported from Shopify." shopifyId: String "ID of the location the fulfillment order is fulfilled from. Null for a fulfillment order that is to be fulfilled externally from a location Pickware does not manage, and for one whose location was deleted." sourceWarehouseLocationId: ID "State of the fulfillment order." state: FulfillmentOrderState! "Whether the fulfillment order is fulfilled in Pickware or is to be fulfilled externally. See the `FulfillmentOrderType` enum for the meaning of each value." type: FulfillmentOrderType! "Timestamp the fulfillment order was last changed." updatedAt: DateTime destinationOrder: Order @requiresScopes(anyOf: ["orders:read"]) fulfillments(first: Int = 10, after: String): FulfillmentConnection @requiresScopes(anyOf: ["fulfillment_orders:read"]) lineItems(first: Int = 10, after: String, filter: FulfillmentOrderLineItemFilterInput): FulfillmentOrderLineItemConnection @requiresScopes(anyOf: ["fulfillment_orders:read"]) shippingLabels(first: Int = 10, after: String): ShippingLabelConnection @requiresScopes(anyOf: ["shipping_labels:read"]) sourceWarehouseLocation: Location @requiresScopes(anyOf: ["locations:read"]) } "A paginated list of `Fulfillment`." type FulfillmentConnection { edges: [FulfillmentEdge!]! pageInfo: PageInfo! } "An edge in a `Fulfillment` connection." type FulfillmentEdge { cursor: String! node: Fulfillment! } "The record of executed shipping work. Its line items fulfill fulfillment order line items: part of one, parts of several, or several whole fulfillment orders." type Fulfillment implements Node { "Global identifier for this entity." id: ID! "Timestamp the fulfillment was created, i.e. when the shipping work was recorded." createdAt: DateTime! "Human-readable fulfillment number." number: String! "Shopify GID of the fulfillment, e.g. `gid://shopify/Fulfillment/1123`. Null for a fulfillment that was not reported to Shopify." shopifyId: String "State of the fulfillment." state: FulfillmentState! lineItems(first: Int = 10, after: String, filter: FulfillmentLineItemFilterInput): FulfillmentLineItemConnection @requiresScopes(anyOf: ["fulfillment_orders:read"]) } "State of a fulfillment." enum FulfillmentState { "The shipping work was executed." Fulfilled "The fulfillment was cancelled, e.g. in Shopify. Its quantities are open again on the fulfillment order." Cancelled } "Filter input for `FulfillmentLineItem` connections. Combines per-field scalar filters with `AND`, `OR` and `NOT`." input FulfillmentLineItemFilterInput { id: IDFilter quantity: IntFilter AND: [FulfillmentLineItemFilterInput!] OR: [FulfillmentLineItemFilterInput!] NOT: FulfillmentLineItemFilterInput } "A paginated list of `FulfillmentLineItem`." type FulfillmentLineItemConnection { edges: [FulfillmentLineItemEdge!]! pageInfo: PageInfo! } "An edge in a `FulfillmentLineItem` connection." type FulfillmentLineItemEdge { cursor: String! node: FulfillmentLineItem! } "A line of a `Fulfillment`: the quantity of a fulfillment order line item the fulfillment fulfilled." type FulfillmentLineItem implements Node { "Global identifier for this entity." id: ID! "Quantity of the fulfillment order line item that was fulfilled." quantity: Int! fulfillment: Fulfillment @requiresScopes(anyOf: ["fulfillment_orders:read"]) fulfillmentOrderLineItem: FulfillmentOrderLineItem @requiresScopes(anyOf: ["fulfillment_orders:read"]) product: Product @requiresScopes(anyOf: ["products:read"]) } "A line of a `FulfillmentOrder`: the quantity of an order line item assigned to the fulfillment order's location." type FulfillmentOrderLineItem implements Node { "Global identifier for this entity." id: ID! "Quantity of the order line item assigned to the fulfillment order. Fulfilled quantities are not subtracted; they are listed in the fulfillment order's `fulfillments`." quantity: Int! "Shopify GID of the fulfillment order line item, e.g. `gid://shopify/FulfillmentOrderLineItem/2123`. Null for a line item of a fulfillment order that does not belong to an order imported from Shopify." shopifyId: String destinationOrderLineItem: OrderLineItem @requiresScopes(anyOf: ["orders:read"]) fulfillmentLineItems(first: Int = 10, after: String, filter: FulfillmentLineItemFilterInput): FulfillmentLineItemConnection @requiresScopes(anyOf: ["fulfillment_orders:read"]) fulfillmentOrder: FulfillmentOrder @requiresScopes(anyOf: ["fulfillment_orders:read"]) product: Product @requiresScopes(anyOf: ["products:read"]) } "A single line on a customer `Order`. May reference a product, a custom item, or a promotion — see `type` to disambiguate." type OrderLineItem implements Node { "Global identifier for this entity." id: ID! "Optional secondary description rendered below the label." description: String "Stable identifier carried over from the cart line. Matches `payload.identifier` for promotion lines." identifier: String! "Display label as shown to the customer at checkout. Frozen at order placement; subsequent product renames do not propagate." label: String! "ID of the parent order." orderId: ID! "ID of the referenced product when `type = \"product\"`." productId: ID "Ordered quantity. Always positive." quantity: Int! "Number of units already shipped against this line. Equals `quantity` once the line is fully shipped." shippedQuantity: Int "Shopify GID of the order line item, e.g. `gid://shopify/LineItem/7123`. Null for a line item Shopify has no line item for, e.g. a discount, and for an order that was not imported from Shopify." shopifyId: String "Gross line total in the order's currency (`unitPrice * quantity`, minus per-line discounts)." totalPrice: Float "Line item type discriminator (`product`, `custom`, `promotion`, `credit`, …). Determines which other fields and references are meaningful." type: String "Gross unit price in the order's currency." unitPrice: Float children(first: Int = 10, after: String, filter: OrderLineItemFilterInput): OrderLineItemConnection @requiresScopes(anyOf: ["orders:read"]) order: Order @requiresScopes(anyOf: ["orders:read"]) parent: OrderLineItem @requiresScopes(anyOf: ["orders:read"]) product: Product @requiresScopes(anyOf: ["products:read"]) } "Filter input for `OrderLineItem` connections. Combines per-field scalar filters with `AND`, `OR` and `NOT`." input OrderLineItemFilterInput { id: IDFilter description: StringFilter identifier: StringFilter label: StringFilter orderId: IDFilter productId: IDFilter quantity: IntFilter totalPrice: FloatFilter type: StringFilter unitPrice: FloatFilter AND: [OrderLineItemFilterInput!] OR: [OrderLineItemFilterInput!] NOT: OrderLineItemFilterInput } "A paginated list of `OrderLineItem`." type OrderLineItemConnection { edges: [OrderLineItemEdge!]! pageInfo: PageInfo! } "An edge in a `OrderLineItem` connection." type OrderLineItemEdge { cursor: String! node: OrderLineItem! } "A purchasable article tracked in the catalog." type Product implements Node { "Global identifier for this entity." id: ID! "Stock available for sale — physical stock minus open orders that have not yet been shipped. See `physicalStock` / `reservedStock` for the breakdown." availableStock: Int "Long description." description: String "Global Trade Item Number (GTIN)." gtin: String "Timestamp of the most recent supplier order containing this product (any state)." lastSupplierOrderAt: DateTime "Manufacturer's part number (MPN), as printed on the article or in supplier catalogs." manufacturerNumber: String "Display name." name: String "Units that are on open supplier orders but have not yet been received against any goods receipt. Reflects expected incoming stock." openSupplierOrderQuantity: Int! "ID of the parent product when this row is a variant." parentId: ID "Total units actually counted in all warehouses, regardless of allocation. Updated by goods receipts, stockings and stock corrections." physicalStock: Int "Sales price of one unit, one entry per currency the price is maintained in. Tiered prices and customer-group-specific prices are not part of this field." price: [Price!]! "Public SKU. Unique across the catalog. Used in URLs, exports and POS workflows." productNumber: String! "Cost price of one unit, one entry per currency the price is maintained in. Kept in sync both ways with the default supplier's `ProductSupplierConfiguration.purchasePrices` while that supplier's currency is the system default currency. For a default supplier in another currency it is only copied from the supplier's price, converted into the system default currency at the exchange rate of that moment, and a price written here is not carried over to the supplier. A price agreed with any other supplier only exists on that configuration row." purchasePrices: [Price!] "Stock level at or below which the product is considered to need reordering. Applies across all warehouses; per-warehouse thresholds are configured separately on the product-warehouse configuration." reorderPoint: Int "Units already promised to open orders or other outbound processes. Subtracted from `physicalStock` to derive what is still sellable." reservedStock: Int "Shopify product variants the product is synced with, one per connected Shopify store: a list of objects with the keys `productId` (GID of the Shopify product, e.g. `gid://shopify/Product/8123`) and `variantId` (GID of the Shopify product variant, e.g. `gid://shopify/ProductVariant/9123`, or null when the product is not synced as a variant). Empty for a product that is not synced with Shopify." shopifyVariants: JSON! "Units excluded from the availability calculation (e.g. stored in warehouses flagged as not selling). Always smaller than or equal to `physicalStock`." stockNotAvailableForSale: Int "Target maximum stock quantity used as the replenish-to level for the product, or `null` when none is set." targetMaximumQuantity: Int canonicalProduct: Product @requiresScopes(anyOf: ["products:read"]) children(first: Int = 10, after: String, filter: ProductFilterInput): ProductConnection @requiresScopes(anyOf: ["products:read"]) orderLineItems(first: Int = 10, after: String, filter: OrderLineItemFilterInput): OrderLineItemConnection @requiresScopes(anyOf: ["orders:read"]) parent: Product @requiresScopes(anyOf: ["products:read"]) stockLocationConfigurations(first: Int = 10, after: String): ProductStockLocationConfigurationConnection @requiresScopes(anyOf: ["product_stock_location_configurations:read"]) tags(first: Int = 10, after: String, filter: TagFilterInput): TagConnection @requiresScopes(anyOf: ["tags:read"]) warehouseConfigurations(first: Int = 10, after: String): ProductWarehouseConfigurationConnection @requiresScopes(anyOf: ["product_warehouse_configurations:read"]) } "A gross/net amount denominated in a single currency." type Price { "ID of the currency this amount is denominated in." currencyId: ID! "Amount excluding tax." net: Float! "Amount including tax." gross: Float! "True when `gross` and `net` are kept in sync through the product's tax rate, so editing one recalculates the other. False when both sides were entered independently." linked: Boolean! } "Filter input for `Product` connections. Combines per-field scalar filters with `AND`, `OR` and `NOT`." input ProductFilterInput { id: IDFilter availableStock: IntFilter gtin: StringFilter manufacturerNumber: StringFilter parentId: IDFilter productNumber: StringFilter AND: [ProductFilterInput!] OR: [ProductFilterInput!] NOT: ProductFilterInput } "A paginated list of `Product`." type ProductConnection { edges: [ProductEdge!]! pageInfo: PageInfo! } "An edge in a `Product` connection." type ProductEdge { cursor: String! node: Product! } "A paginated list of `ProductStockLocationConfiguration`." type ProductStockLocationConfigurationConnection { edges: [ProductStockLocationConfigurationEdge!]! pageInfo: PageInfo! } "An edge in a `ProductStockLocationConfiguration` connection." type ProductStockLocationConfigurationEdge { cursor: String! node: ProductStockLocationConfiguration! } "Per-stock-location configuration for a single product. One row per product and stock location (a bin location, or the warehouse-level \"unknown\" location for stock not assigned to a bin location), storing the product's reorder thresholds at that location." type ProductStockLocationConfiguration implements Node { "Global identifier for this entity." id: ID! "Stock level at or below which the product is considered to need reordering at this stock location." reorderPoint: Int! "Derived amount by which the current stock at this location falls below `reorderPoint` (kept up to date by the stock indexers). Non-positive when stock is at or above the reorder point." stockBelowReorderPoint: Int "Target maximum stock quantity used as the replenish-to level for this product at this stock location, or `null` when none is set." targetMaximumQuantity: Int } "Filter input for `Tag` connections. Combines per-field scalar filters with `AND`, `OR` and `NOT`." input TagFilterInput { id: IDFilter name: StringFilter AND: [TagFilterInput!] OR: [TagFilterInput!] NOT: TagFilterInput } "A paginated list of `Tag`." type TagConnection { edges: [TagEdge!]! pageInfo: PageInfo! } "An edge in a `Tag` connection." type TagEdge { cursor: String! node: Tag! } "A free-form label that can be attached to any number of taggable entities (products, orders, customers, …)." type Tag implements Node { "Global identifier for this entity." id: ID! "Free-form tag label. Unique across all tags in the shop." name: String! customers(first: Int = 10, after: String, filter: CustomerFilterInput): CustomerConnection @requiresScopes(anyOf: ["customers:read"]) orders(first: Int = 10, after: String, filter: OrderFilterInput): OrderConnection @requiresScopes(anyOf: ["orders:read"]) products(first: Int = 10, after: String, filter: ProductFilterInput): ProductConnection @requiresScopes(anyOf: ["products:read"]) } "Filter input for `Customer` connections. Combines per-field scalar filters with `AND`, `OR` and `NOT`." input CustomerFilterInput { id: IDFilter accountType: CustomerAccountTypeFilter active: BooleanFilter company: StringFilter createdAt: DateTimeFilter customerNumber: StringFilter email: StringFilter firstName: StringFilter groupId: IDFilter guest: BooleanFilter lastName: StringFilter salesChannelId: IDFilter title: StringFilter updatedAt: DateTimeFilter AND: [CustomerFilterInput!] OR: [CustomerFilterInput!] NOT: CustomerFilterInput } input CustomerAccountTypeFilter { equals: CustomerAccountType in: [CustomerAccountType!] isNull: Boolean } "Customer account type." enum CustomerAccountType { "A private customer account." Private "A business customer account." Business } "A paginated list of `Customer`." type CustomerConnection { edges: [CustomerEdge!]! pageInfo: PageInfo! } "An edge in a `Customer` connection." type CustomerEdge { cursor: String! node: Customer! } "A customer of the shop. Carries identity and contact details, the assigned customer group and sales channel, and the customer's order history." type Customer implements Node { "Global identifier for this entity." id: ID! "Customer type. Either `Private` or `Business`." accountType: CustomerAccountType! "Whether the customer account is active." active: Boolean "Company name. Set for business customers." company: String "Timestamp the customer was created." createdAt: DateTime! "Human-readable customer number assigned at registration." customerNumber: String! "Customer's email address. Unique per sales channel and bound-sales-channel scope." email: String! "Customer's first name." firstName: String! "ID of the customer group the customer is assigned to." groupId: ID! "Whether this is a guest account (created during guest checkout, no login)." guest: Boolean "Customer's last name." lastName: String! "ID of the sales channel the customer registered in." salesChannelId: ID! "Shopify GID of the customer, e.g. `gid://shopify/Customer/3123`. Null for a customer that was not imported from Shopify." shopifyId: String "Optional academic or honorific title (e.g. `Dr.`)." title: String "Timestamp of the last update to the customer." updatedAt: DateTime "List of VAT registration IDs of the customer, as a JSON array of strings." vatIds: JSON boundSalesChannel: SalesChannel @requiresScopes(anyOf: ["sales_channels:read"]) defaultPaymentMethod: PaymentMethod @requiresScopes(anyOf: ["payment_methods:read"]) group: CustomerGroup @requiresScopes(anyOf: ["customer_groups:read"]) lastPaymentMethod: PaymentMethod @requiresScopes(anyOf: ["payment_methods:read"]) orders(first: Int = 10, after: String): OrderConnection @requiresScopes(anyOf: ["orders:read"]) requestedGroup: CustomerGroup @requiresScopes(anyOf: ["customer_groups:read"]) salesChannel: SalesChannel @requiresScopes(anyOf: ["sales_channels:read"]) salutation: Salutation @requiresScopes(anyOf: ["salutations:read"]) tags(first: Int = 10, after: String, filter: TagFilterInput): TagConnection @requiresScopes(anyOf: ["tags:read"]) } "A sales channel of the shop (e.g. a storefront). Customers register in exactly one sales channel." type SalesChannel implements Node { "Global identifier for this entity." id: ID! "Localised display name of the sales channel." name: String boundCustomers(first: Int = 10, after: String, filter: CustomerFilterInput): CustomerConnection @requiresScopes(anyOf: ["customers:read"]) countries(first: Int = 10, after: String, filter: CountryFilterInput): CountryConnection @requiresScopes(anyOf: ["countries:read"]) country: Country @requiresScopes(anyOf: ["countries:read"]) currencies(first: Int = 10, after: String, filter: CurrencyFilterInput): CurrencyConnection @requiresScopes(anyOf: ["currencies:read"]) currency: Currency @requiresScopes(anyOf: ["currencies:read"]) customerGroup: CustomerGroup @requiresScopes(anyOf: ["customer_groups:read"]) customerGroupsRegistrations(first: Int = 10, after: String, filter: CustomerGroupFilterInput): CustomerGroupConnection @requiresScopes(anyOf: ["customer_groups:read"]) customers(first: Int = 10, after: String, filter: CustomerFilterInput): CustomerConnection @requiresScopes(anyOf: ["customers:read"]) orders(first: Int = 10, after: String, filter: OrderFilterInput): OrderConnection @requiresScopes(anyOf: ["orders:read"]) paymentMethod: PaymentMethod @requiresScopes(anyOf: ["payment_methods:read"]) paymentMethods(first: Int = 10, after: String, filter: PaymentMethodFilterInput): PaymentMethodConnection @requiresScopes(anyOf: ["payment_methods:read"]) } "Filter input for `Country` connections. Combines per-field scalar filters with `AND`, `OR` and `NOT`." input CountryFilterInput { id: IDFilter AND: [CountryFilterInput!] OR: [CountryFilterInput!] NOT: CountryFilterInput } "A paginated list of `Country`." type CountryConnection { edges: [CountryEdge!]! pageInfo: PageInfo! } "An edge in a `Country` connection." type CountryEdge { cursor: String! node: Country! } "A country known to the shop. Used to reference the country of a customer's address." type Country implements Node { "Global identifier for this entity." id: ID! "Localised display name of the country." name: String salesChannelDefaultAssignments(first: Int = 10, after: String, filter: SalesChannelFilterInput): SalesChannelConnection @requiresScopes(anyOf: ["sales_channels:read"]) salesChannels(first: Int = 10, after: String, filter: SalesChannelFilterInput): SalesChannelConnection @requiresScopes(anyOf: ["sales_channels:read"]) } "Filter input for `SalesChannel` connections. Combines per-field scalar filters with `AND`, `OR` and `NOT`." input SalesChannelFilterInput { id: IDFilter AND: [SalesChannelFilterInput!] OR: [SalesChannelFilterInput!] NOT: SalesChannelFilterInput } "A paginated list of `SalesChannel`." type SalesChannelConnection { edges: [SalesChannelEdge!]! pageInfo: PageInfo! } "An edge in a `SalesChannel` connection." type SalesChannelEdge { cursor: String! node: SalesChannel! } "Filter input for `Currency` connections. Combines per-field scalar filters with `AND`, `OR` and `NOT`." input CurrencyFilterInput { id: IDFilter factor: FloatFilter isoCode: StringFilter position: IntFilter symbol: StringFilter AND: [CurrencyFilterInput!] OR: [CurrencyFilterInput!] NOT: CurrencyFilterInput } "A paginated list of `Currency`." type CurrencyConnection { edges: [CurrencyEdge!]! pageInfo: PageInfo! } "An edge in a `Currency` connection." type CurrencyEdge { cursor: String! node: Currency! } "A customer group. Customers are assigned to exactly one group, which drives pricing and registration behaviour." type CustomerGroup implements Node { "Global identifier for this entity." id: ID! "Localised display name of the customer group." name: String customers(first: Int = 10, after: String, filter: CustomerFilterInput): CustomerConnection @requiresScopes(anyOf: ["customers:read"]) registrationSalesChannels(first: Int = 10, after: String, filter: SalesChannelFilterInput): SalesChannelConnection @requiresScopes(anyOf: ["sales_channels:read"]) salesChannels(first: Int = 10, after: String, filter: SalesChannelFilterInput): SalesChannelConnection @requiresScopes(anyOf: ["sales_channels:read"]) } "Filter input for `CustomerGroup` connections. Combines per-field scalar filters with `AND`, `OR` and `NOT`." input CustomerGroupFilterInput { id: IDFilter AND: [CustomerGroupFilterInput!] OR: [CustomerGroupFilterInput!] NOT: CustomerGroupFilterInput } "A paginated list of `CustomerGroup`." type CustomerGroupConnection { edges: [CustomerGroupEdge!]! pageInfo: PageInfo! } "An edge in a `CustomerGroup` connection." type CustomerGroupEdge { cursor: String! node: CustomerGroup! } "A payment method known to the shop. Used to reference a customer's default payment method." type PaymentMethod implements Node { "Global identifier for this entity." id: ID! "Localised display name of the payment method." name: String customers(first: Int = 10, after: String, filter: CustomerFilterInput): CustomerConnection @requiresScopes(anyOf: ["customers:read"]) salesChannelDefaultAssignments(first: Int = 10, after: String, filter: SalesChannelFilterInput): SalesChannelConnection @requiresScopes(anyOf: ["sales_channels:read"]) salesChannels(first: Int = 10, after: String, filter: SalesChannelFilterInput): SalesChannelConnection @requiresScopes(anyOf: ["sales_channels:read"]) } "Filter input for `PaymentMethod` connections. Combines per-field scalar filters with `AND`, `OR` and `NOT`." input PaymentMethodFilterInput { id: IDFilter AND: [PaymentMethodFilterInput!] OR: [PaymentMethodFilterInput!] NOT: PaymentMethodFilterInput } "A paginated list of `PaymentMethod`." type PaymentMethodConnection { edges: [PaymentMethodEdge!]! pageInfo: PageInfo! } "An edge in a `PaymentMethod` connection." type PaymentMethodEdge { cursor: String! node: PaymentMethod! } "A salutation known to the shop (e.g. `mr`, `mrs`). Used to reference a customer's salutation." type Salutation implements Node { "Global identifier for this entity." id: ID! "Localised display name of the salutation." displayName: String "Stable technical identifier of the salutation (e.g. `mr`, `mrs`, `not_specified`)." salutationKey: String! customers(first: Int = 10, after: String, filter: CustomerFilterInput): CustomerConnection @requiresScopes(anyOf: ["customers:read"]) } "A paginated list of `ProductWarehouseConfiguration`." type ProductWarehouseConfigurationConnection { edges: [ProductWarehouseConfigurationEdge!]! pageInfo: PageInfo! } "An edge in a `ProductWarehouseConfiguration` connection." type ProductWarehouseConfigurationEdge { cursor: String! node: ProductWarehouseConfiguration! } "Per-warehouse configuration for a single product. One row per `(product, warehouse)` pair, storing the product's default bin location for that warehouse and its reorder thresholds. The default bin location is the bin proposed when stock for the product is put away in the warehouse." type ProductWarehouseConfiguration implements Node { "Global identifier for this entity." id: ID! "ID of the product's default bin location in this warehouse, or `null` when none is set." defaultBinLocationId: ID "ID of the product." productId: ID! "Stock level at or below which the product is considered to need reordering in this warehouse." reorderPoint: Int! "Derived amount by which the current warehouse stock falls below `reorderPoint` (kept up to date by the stock indexers). Non-positive when stock is at or above the reorder point." stockBelowReorderPoint: Int "Target maximum stock quantity used as the replenish-to level for this product in this warehouse." targetMaximumQuantity: Int "ID of the warehouse." warehouseId: ID! defaultBinLocation: BinLocation @requiresScopes(anyOf: ["warehouses:read"]) product: Product @requiresScopes(anyOf: ["products:read"]) warehouse: Warehouse @requiresScopes(anyOf: ["warehouses:read"]) warehouseStock: WarehouseStock @requiresScopes(anyOf: ["stocks:read"]) } "A physical or logical place where stock can live. Warehouses contain bin locations and aggregate stock records used by inbound, outbound and availability computations." type Warehouse implements Node { "Global identifier for this entity." id: ID! "Short, human-readable warehouse code (e.g. `HQ`, `DE-01`). Unique across the shop." code: String! "When true, stock in this warehouse counts towards availability. Set to false for staging, quarantine or supplier-consignment warehouses." isStockAvailableForSale: Boolean! "Display name shown in admin grids and pick lists." name: String! "Optional ordering hint used when generating pick routes across multiple warehouses. Lower numbers are picked first." pickingPosition: Int "Lifecycle state of the warehouse — see the `WarehouseStatus` enum for the meaning of each value." status: WarehouseStatus "IANA timezone identifier (e.g. `Europe/Berlin`) used to interpret cut-off times for picking and dispatch." timezone: String binLocations(first: Int = 10, after: String, filter: BinLocationFilterInput): BinLocationConnection @requiresScopes(anyOf: ["warehouses:read"]) destinationStockMovements(first: Int = 10, after: String, filter: StockMovementFilterInput): StockMovementConnection @requiresScopes(anyOf: ["stocks:read"]) productWarehouseConfigurations(first: Int = 10, after: String, filter: ProductWarehouseConfigurationFilterInput): ProductWarehouseConfigurationConnection @requiresScopes(anyOf: ["product_warehouse_configurations:read"]) sourceStockMovements(first: Int = 10, after: String, filter: StockMovementFilterInput): StockMovementConnection @requiresScopes(anyOf: ["stocks:read"]) stocks(first: Int = 10, after: String, filter: StockFilterInput): StockConnection @requiresScopes(anyOf: ["stocks:read"]) warehouseLocation: Location @requiresScopes(anyOf: ["locations:read"]) warehouseStocks(first: Int = 10, after: String, filter: WarehouseStockFilterInput): WarehouseStockConnection @requiresScopes(anyOf: ["stocks:read"]) } "Lifecycle status of a Pickware warehouse. Drives whether the warehouse still participates in inbound and outbound processes." enum WarehouseStatus { "Warehouse is fully operational and participates in all stock movements." Active "Warehouse is being phased out: outbound moves are still allowed to clear remaining stock, but new inbound is blocked." Decommissioning } "Filter input for `BinLocation` connections. Combines per-field scalar filters with `AND`, `OR` and `NOT`." input BinLocationFilterInput { id: IDFilter code: StringFilter createdAt: DateTimeFilter position: IntFilter updatedAt: DateTimeFilter warehouseId: IDFilter AND: [BinLocationFilterInput!] OR: [BinLocationFilterInput!] NOT: BinLocationFilterInput } "A paginated list of `BinLocation`." type BinLocationConnection { edges: [BinLocationEdge!]! pageInfo: PageInfo! } "An edge in a `BinLocation` connection." type BinLocationEdge { cursor: String! node: BinLocation! } "Filter input for `ProductWarehouseConfiguration` connections. Combines per-field scalar filters with `AND`, `OR` and `NOT`." input ProductWarehouseConfigurationFilterInput { id: IDFilter defaultBinLocationId: IDFilter productId: IDFilter reorderPoint: IntFilter stockBelowReorderPoint: IntFilter targetMaximumQuantity: IntFilter warehouseId: IDFilter AND: [ProductWarehouseConfigurationFilterInput!] OR: [ProductWarehouseConfigurationFilterInput!] NOT: ProductWarehouseConfigurationFilterInput } "Filter input for `Stock` connections. Combines per-field scalar filters with `AND`, `OR` and `NOT`." input StockFilterInput { id: IDFilter binLocationId: IDFilter createdAt: DateTimeFilter locationTypeTechnicalName: StringFilter productId: IDFilter quantity: IntFilter specialStockLocationTechnicalName: StringFilter updatedAt: DateTimeFilter warehouseId: IDFilter AND: [StockFilterInput!] OR: [StockFilterInput!] NOT: StockFilterInput } "A paginated list of `Stock`." type StockConnection { edges: [StockEdge!]! pageInfo: PageInfo! } "An edge in a `Stock` connection." type StockEdge { cursor: String! node: Stock! } "A per-location stock line — the most granular stock entity. One line per `(product, location)` tuple, where the location is either a physical bin / warehouse or a special slot (order, return order, goods receipt, …). Use `locationTypeTechnicalName` / `specialStockLocationTechnicalName` to disambiguate." type Stock implements Node { "Global identifier for this entity." id: ID! "ID of the bin location." binLocationId: ID "Timestamp the stock line was first persisted." createdAt: DateTime! "Technical name of the location type (`warehouse`, `bin_location`, `order`, `return_order`, `goods_receipt`, `stock_container`, `special_stock_location`). Use this to separate lines inside the warehouses (`warehouse`, `bin_location`, `stock_container`, `goods_receipt`) from the ones outside them (`order`, `return_order`, `special_stock_location`)." locationTypeTechnicalName: String! "ID of the product." productId: ID! "Number of units at this location. Shipping books units onto the `order` location, so an `order` line counts units that left the warehouses for that order. Negative quantities occur at special stock locations: they are the counterpart of stock that entered the warehouses without a physical source, e.g. units added by a stock correction leave a negative quantity at `stock_correction`." quantity: Int! "For lines whose `locationTypeTechnicalName` is `special_stock_location`, the technical name of the special location (e.g. `stock_correction`, `import`, `initialization`, `unknown`)." specialStockLocationTechnicalName: String "Timestamp of the last quantity change." updatedAt: DateTime "ID of the warehouse this line belongs to." warehouseId: ID binLocation: BinLocation @requiresScopes(anyOf: ["warehouses:read"]) goodsReceipt: GoodsReceipt @requiresScopes(anyOf: ["goods_receipts:read"]) order: Order @requiresScopes(anyOf: ["orders:read"]) product: Product @requiresScopes(anyOf: ["products:read"]) warehouse: Warehouse @requiresScopes(anyOf: ["warehouses:read"]) } "A physical site where goods are held, sold or fulfilled. A location groups one or more warehouses, and every fulfillment order is fulfilled from exactly one location." type Location implements Node { "Global identifier for this entity." id: ID! "False when the merchant has deactivated the location." active: Boolean! "ID of the address of the location." addressId: ID "Short, human-readable location code. Unique across the shop." code: String! "Timestamp the location was created." createdAt: DateTime! "ID of the warehouse of the location that goods receipts are booked into when no warehouse is chosen explicitly." defaultReceivingWarehouseId: ID "ID of the warehouse of the location that is used when no warehouse is chosen explicitly, e.g. for shipping and for restocking cancelled fulfillments." defaultWarehouseId: ID "Display name of the location." name: String! "Timestamp the location was last changed." updatedAt: DateTime defaultReceivingWarehouse: Warehouse @requiresScopes(anyOf: ["warehouses:read"]) defaultWarehouse: Warehouse @requiresScopes(anyOf: ["warehouses:read"]) sourcedFulfillmentOrders(first: Int = 10, after: String, filter: FulfillmentOrderFilterInput): FulfillmentOrderConnection @requiresScopes(anyOf: ["fulfillment_orders:read"]) warehouses(first: Int = 10, after: String, filter: WarehouseFilterInput): WarehouseConnection @requiresScopes(anyOf: ["warehouses:read"]) } "Filter input for `Warehouse` connections. Combines per-field scalar filters with `AND`, `OR` and `NOT`." input WarehouseFilterInput { id: IDFilter code: StringFilter isStockAvailableForSale: BooleanFilter name: StringFilter pickingPosition: IntFilter status: WarehouseStatusFilter timezone: StringFilter AND: [WarehouseFilterInput!] OR: [WarehouseFilterInput!] NOT: WarehouseFilterInput } input WarehouseStatusFilter { equals: WarehouseStatus in: [WarehouseStatus!] isNull: Boolean } "A paginated list of `Warehouse`." type WarehouseConnection { edges: [WarehouseEdge!]! pageInfo: PageInfo! } "An edge in a `Warehouse` connection." type WarehouseEdge { cursor: String! node: Warehouse! } "Filter input for `WarehouseStock` connections. Combines per-field scalar filters with `AND`, `OR` and `NOT`." input WarehouseStockFilterInput { id: IDFilter createdAt: DateTimeFilter productId: IDFilter quantity: IntFilter updatedAt: DateTimeFilter warehouseId: IDFilter AND: [WarehouseStockFilterInput!] OR: [WarehouseStockFilterInput!] NOT: WarehouseStockFilterInput } "A paginated list of `WarehouseStock`." type WarehouseStockConnection { edges: [WarehouseStockEdge!]! pageInfo: PageInfo! } "An edge in a `WarehouseStock` connection." type WarehouseStockEdge { cursor: String! node: WarehouseStock! } "Per-warehouse aggregate stock line for a product. One line per `(product, warehouse)` tuple, maintained by Pickware as a denormalised sum of the matching per-bin `Stock` lines. Use this when you want \"how much of this product lives in warehouse X\" without scanning per-bin lines." type WarehouseStock implements Node { "Global identifier for this entity." id: ID! "Timestamp the warehouse stock line was first persisted." createdAt: DateTime! "ID of the product." productId: ID! "Number of units of the product present in the warehouse, summed across every bin location in it." quantity: Int! "Timestamp of the last quantity change." updatedAt: DateTime "ID of the warehouse." warehouseId: ID product: Product @requiresScopes(anyOf: ["products:read"]) productWarehouseConfiguration: ProductWarehouseConfiguration @requiresScopes(anyOf: ["product_warehouse_configurations:read"]) warehouse: Warehouse @requiresScopes(anyOf: ["warehouses:read"]) } "Filter input for `FulfillmentOrderLineItem` connections. Combines per-field scalar filters with `AND`, `OR` and `NOT`." input FulfillmentOrderLineItemFilterInput { id: IDFilter quantity: IntFilter AND: [FulfillmentOrderLineItemFilterInput!] OR: [FulfillmentOrderLineItemFilterInput!] NOT: FulfillmentOrderLineItemFilterInput } "A paginated list of `FulfillmentOrderLineItem`." type FulfillmentOrderLineItemConnection { edges: [FulfillmentOrderLineItemEdge!]! pageInfo: PageInfo! } "An edge in a `FulfillmentOrderLineItem` connection." type FulfillmentOrderLineItemEdge { cursor: String! node: FulfillmentOrderLineItem! } "A paginated list of `ShippingLabel`." type ShippingLabelConnection { edges: [ShippingLabelEdge!]! pageInfo: PageInfo! } "An edge in a `ShippingLabel` connection." type ShippingLabelEdge { cursor: String! node: ShippingLabel! } "A shipping label created with a carrier, together with the tracking codes the carrier assigned to its parcels." type ShippingLabel implements Node { "Global identifier for this entity." id: ID! "True when the shipping label was cancelled with the carrier. Cancelled shipping labels stay listed." cancelled: Boolean! "Technical name of the carrier the shipping label was created with, e.g. `dhl` or `gls`." carrier: String! "Timestamp the shipping label was created." createdAt: DateTime! "True for a return label, i.e. a label for a parcel sent back to the merchant." isReturnShipment: Boolean! "Documents the carrier issued for the shipping label, e.g. the label itself and customs documents: a list of objects with the keys `documentType`, `fileName` (may be null) and `downloadUrl`. The download URL is a path on the shop's API that serves the PDF without authentication, so it can be handed on, e.g. to the customer for a return label." labelDocuments: JSON! "Tracking codes of the shipping label's parcels: a list of objects with the keys `trackingCode`, `trackingUrl` (null when the carrier offers no tracking page) and `direction` (`outgoing` for a parcel to the customer, `incoming` for a parcel back to the merchant)." trackingCodes: JSON! "Timestamp the shipping label was last changed, e.g. when it was cancelled." updatedAt: DateTime orders(first: Int = 10, after: String, filter: OrderFilterInput): OrderConnection @requiresScopes(anyOf: ["orders:read"]) } "A supplier (vendor) from which the shop orders products. Suppliers carry the contact details, address, default delivery time and customer-number used by the shop, and are the target of `SupplierOrder` rows." type Supplier implements Node { "Global identifier for this entity." id: ID! "ID of the supplier's billing/delivery address. Address scalars are reached via the `address` association." addressId: ID "ID of the currency of the supplier, whose details are reached via the `currency` association. The supplier's purchase prices are maintained in it and its supplier orders are raised in it by default; it is changed in the Administration, which converts or clears the purchase prices in the background. Until that has finished, `ProductSupplierConfiguration.purchasePrices` is empty and no supplier order can be raised for the supplier." currencyId: ID! "Customer number the supplier assigned to this shop (i.e. the identifier the supplier uses for the shop in their own system)." customerNumber: String "Default delivery lead time in days, used as a fallback when a product has no supplier-specific override." defaultDeliveryTime: Int "ID of the language used when communicating with the supplier (e.g. PDF supplier orders are rendered in this language)." languageId: ID! "Supplier display name." name: String! "Internal supplier number." number: String! "Taxation type set by hand for the supplier. Null when it is derived automatically from the countries of the supplier and of the company, which happens when a supplier order is raised; the result is recorded as `SupplierOrder.taxationType`." taxationTypeOverride: SupplierTaxationType currency: Currency @requiresScopes(anyOf: ["currencies:read"]) goodsReceipts(first: Int = 10, after: String, filter: GoodsReceiptFilterInput): GoodsReceiptConnection @requiresScopes(anyOf: ["goods_receipts:read"]) orders(first: Int = 10, after: String, filter: SupplierOrderFilterInput): SupplierOrderConnection @requiresScopes(anyOf: ["supplier_orders:read"]) productSupplierConfigurations(first: Int = 10, after: String, filter: ProductSupplierConfigurationFilterInput): ProductSupplierConfigurationConnection @requiresScopes(anyOf: ["product_supplier_configurations:read"]) } "How the line items of a supplier order are taxed. Set on the supplier as `taxationTypeOverride`, or otherwise derived from the countries of the supplier and of the company when the order is raised. Supplier order line items are always net." enum SupplierTaxationType { "Line items carry the tax rate of the product. Derived when the supplier is in the country of the company, and when the country of either is unknown." Domestic "Line items are taxed at 0 %. Derived when the supplier and the company are in different EU countries." EuForeign "Line items are taxed at 0 %. Derived when the supplier and the company are in different countries that are not both in the EU." ThirdCountry } "Filter input for `GoodsReceipt` connections. Combines per-field scalar filters with `AND`, `OR` and `NOT`." input GoodsReceiptFilterInput { id: IDFilter amountNet: FloatFilter amountTotal: FloatFilter comment: StringFilter currencyFactor: FloatFilter currencyId: IDFilter customerId: IDFilter goodsReceiptDateTime: DateTimeFilter number: StringFilter positionPrice: FloatFilter supplierId: IDFilter taxStatus: StringFilter type: GoodsReceiptTypeFilter userId: IDFilter warehouseId: IDFilter AND: [GoodsReceiptFilterInput!] OR: [GoodsReceiptFilterInput!] NOT: GoodsReceiptFilterInput } input GoodsReceiptTypeFilter { equals: GoodsReceiptType in: [GoodsReceiptType!] isNull: Boolean } "A paginated list of `GoodsReceipt`." type GoodsReceiptConnection { edges: [GoodsReceiptEdge!]! pageInfo: PageInfo! } "An edge in a `GoodsReceipt` connection." type GoodsReceiptEdge { cursor: String! node: GoodsReceipt! } "Filter input for `SupplierOrder` connections. Combines per-field scalar filters with `AND`, `OR` and `NOT`." input SupplierOrderFilterInput { id: IDFilter actualDeliveryDate: DateTimeFilter amountNet: FloatFilter amountTotal: FloatFilter currencyFactor: FloatFilter currencyFactorCapturedAt: DateTimeFilter currencyId: IDFilter dueDate: DateTimeFilter expectedDeliveryDate: DateTimeFilter internalComment: StringFilter number: StringFilter orderDateTime: DateTimeFilter positionPrice: FloatFilter salesChannelId: IDFilter supplierId: IDFilter supplierOrderNumber: StringFilter taxStatus: StringFilter taxationType: SupplierTaxationTypeFilter warehouseId: IDFilter AND: [SupplierOrderFilterInput!] OR: [SupplierOrderFilterInput!] NOT: SupplierOrderFilterInput } input SupplierTaxationTypeFilter { equals: SupplierTaxationType in: [SupplierTaxationType!] isNull: Boolean } "A paginated list of `SupplierOrder`." type SupplierOrderConnection { edges: [SupplierOrderEdge!]! pageInfo: PageInfo! } "An edge in a `SupplierOrder` connection." type SupplierOrderEdge { cursor: String! node: SupplierOrder! } "A purchase order raised against a supplier. Carries header data (supplier, currency, warehouse, dates), per-line procurement details, and the totals and tax status used by accounting. Goods are booked in against the supplier order via `GoodsReceipt`." type SupplierOrder implements Node { "Global identifier for this entity." id: ID! "Date the supplier actually delivered." actualDeliveryDate: DateTime "Net total in the order's currency, excluding tax." amountNet: Float "Grand total in the order's currency, including tax." amountTotal: Float "Exchange rate of the order's currency at the time the order was raised or its currency was last changed, as units of that currency per one unit of the system default currency. Used to show the order total in the system default currency; stock is valued with the exchange rate of the goods receipt (`GoodsReceipt.currencyFactor`), not with this one." currencyFactor: Float! "Timestamp `currencyFactor` was taken. Null for orders raised before exchange rates were recorded." currencyFactorCapturedAt: DateTime "ID of the currency the order is denominated in. Taken from the supplier when the order is raised, unless `createSupplierOrder` names another one. Can be changed in the Administration until the order is completed or cancelled, one of its goods receipts is completed, or one of its goods receipts also belongs to another supplier order." currencyId: ID! "Custom fields configured for supplier orders, as a JSON object keyed by custom field technical name. Null when no custom fields are set. Write via `setSupplierOrderCustomFields`." customFields: JSON "Due date for paying the supplier." dueDate: DateTime "Date the supplier promised delivery. Defaulted from the line items' expected dates; can be tightened via `updateSupplierOrderExpectedDeliveryDate`." expectedDeliveryDate: DateTime "Free-form internal note. Not printed on the document sent to the supplier." internalComment: String "Internal supplier order number. Used in the admin UI and on documents." number: String! "Timestamp the supplier order was raised." orderDateTime: DateTime! "Technical name of the order's payment state: `open`, `partially_paid` or `paid`." paymentState: String! "Sum of all line item prices before order-level discounts/charges, in the order's currency." positionPrice: Float "ID of the sales channel the supplier order is attributed to. Drives the default tax / currency setup." salesChannelId: ID "Technical name of the order's state: `open`, `confirmed`, `sent`, `partially_delivered`, `delivered`, `completed` or `cancelled`." state: String! "ID of the supplier." supplierId: ID "Order number assigned by the supplier (i.e. how the supplier references this order)." supplierOrderNumber: String "Tax status of the order (`gross`, `net`, `tax-free`)." taxStatus: String "Taxation type the order was raised with, taken from the supplier's override or derived from the countries of the supplier and of the company. Decides the tax rate of the line items." taxationType: SupplierTaxationType! "ID of the warehouse the goods are destined for." warehouseId: ID currency: Currency @requiresScopes(anyOf: ["currencies:read"]) goodsReceiptLineItems(first: Int = 10, after: String, filter: GoodsReceiptLineItemFilterInput): GoodsReceiptLineItemConnection @requiresScopes(anyOf: ["goods_receipts:read"]) goodsReceipts(first: Int = 10, after: String, filter: GoodsReceiptFilterInput): GoodsReceiptConnection @requiresScopes(anyOf: ["goods_receipts:read"]) lineItems(first: Int = 10, after: String, filter: SupplierOrderLineItemFilterInput): SupplierOrderLineItemConnection @requiresScopes(anyOf: ["supplier_orders:read"]) salesChannel: SalesChannel @requiresScopes(anyOf: ["sales_channels:read"]) supplier: Supplier @requiresScopes(anyOf: ["suppliers:read"]) tags(first: Int = 10, after: String, filter: TagFilterInput): TagConnection @requiresScopes(anyOf: ["tags:read"]) warehouse: Warehouse @requiresScopes(anyOf: ["warehouses:read"]) } "Filter input for `SupplierOrderLineItem` connections. Combines per-field scalar filters with `AND`, `OR` and `NOT`." input SupplierOrderLineItemFilterInput { id: IDFilter actualDeliveryDate: DateTimeFilter cancelledQuantity: IntFilter expectedDeliveryDate: DateTimeFilter minPurchase: IntFilter openQuantity: IntFilter productId: IDFilter purchaseSteps: IntFilter quantity: IntFilter receivedQuantity: IntFilter supplierOrderId: IDFilter supplierProductNumber: StringFilter totalPrice: FloatFilter unitPrice: FloatFilter AND: [SupplierOrderLineItemFilterInput!] OR: [SupplierOrderLineItemFilterInput!] NOT: SupplierOrderLineItemFilterInput } "A paginated list of `SupplierOrderLineItem`." type SupplierOrderLineItemConnection { edges: [SupplierOrderLineItemEdge!]! pageInfo: PageInfo! } "An edge in a `SupplierOrderLineItem` connection." type SupplierOrderLineItemEdge { cursor: String! node: SupplierOrderLineItem! } "A single line on a `SupplierOrder`. Carries the product, the ordered, received, cancelled and still open quantities, lot-size constraints captured at the time of ordering, the per-line dates, and the prices." type SupplierOrderLineItem implements Node { "Global identifier for this entity." id: ID! "Date the last open quantity for this line was actually received." actualDeliveryDate: DateTime "Quantity of the remainder the supplier will not deliver any more and that was settled for that reason. Never changes `quantity`, `unitPrice` or `totalPrice`." cancelledQuantity: Int "Per-line expected delivery date. Optional; falls back to the order-level expected date when absent." expectedDeliveryDate: DateTime "Minimum purchasable quantity captured from the product's supplier configuration when the line was added." minPurchase: Int "Quantity still expected from the supplier: `quantity - receivedQuantity - cancelledQuantity`, never below zero." openQuantity: Int "ID of the product being ordered." productId: ID "Quantity step (lot size) captured from the product's supplier configuration when the line was added." purchaseSteps: Int "Ordered quantity. Always positive." quantity: Int "Quantity received through goods receipts of this supplier order that are approved or further along." receivedQuantity: Int "ID of the parent supplier order." supplierOrderId: ID! "Article number the supplier uses for this product. Frozen at line creation so historical orders keep printing the original number." supplierProductNumber: String "Line total in the parent order's currency (`unitPrice * quantity`)." totalPrice: Float "Per-unit price in the parent order's currency." unitPrice: Float product: Product @requiresScopes(anyOf: ["products:read"]) supplierOrder: SupplierOrder @requiresScopes(anyOf: ["supplier_orders:read"]) } "Filter input for `ProductSupplierConfiguration` connections. Combines per-field scalar filters with `AND`, `OR` and `NOT`." input ProductSupplierConfigurationFilterInput { id: IDFilter deliveryTimeDays: IntFilter minPurchase: IntFilter productId: IDFilter purchaseSteps: IntFilter supplierId: IDFilter supplierIsDefault: BooleanFilter supplierProductNumber: StringFilter AND: [ProductSupplierConfigurationFilterInput!] OR: [ProductSupplierConfigurationFilterInput!] NOT: ProductSupplierConfigurationFilterInput } "A paginated list of `ProductSupplierConfiguration`." type ProductSupplierConfigurationConnection { edges: [ProductSupplierConfigurationEdge!]! pageInfo: PageInfo! } "An edge in a `ProductSupplierConfiguration` connection." type ProductSupplierConfigurationEdge { cursor: String! node: ProductSupplierConfiguration! } "Per-supplier procurement configuration for a single product. One row per `(product, supplier)` pair, storing the supplier-side article number, lot-size constraints, lead time and the agreed purchase price. Drives the line-item defaults used when a supplier order is opened." type ProductSupplierConfiguration implements Node { "Global identifier for this entity." id: ID! "Lead time in days for this `(product, supplier)` pair. Overrides the supplier-wide default." deliveryTimeDays: Int "Minimum quantity that can be ordered from this supplier in a single line. The supplier-order form prefills this value." minPurchase: Int! "ID of the product." productId: ID! "Purchase price agreed with this supplier for one unit of the product. The list holds at most the entry in the currency of the supplier (`Supplier.currencyId`), and is empty when the configuration has no price in that currency, and while a currency change of the supplier is running or has failed, since its purchase prices are not in the new currency yet. Prefills the line-item price when a supplier order is opened for this supplier; the price of the product's default supplier is copied to `Product.purchasePrices`, which describes how." purchasePrices: [Price!]! "Quantity step (lot size) for this supplier. Orderable quantities are `minPurchase + n * purchaseSteps`." purchaseSteps: Int! "ID of the supplier." supplierId: ID! "True for the single configuration row marked as the product's default supplier. The supplier-order form uses the default when no supplier is preselected." supplierIsDefault: Boolean! "Article number the supplier uses for this product in their own catalog. Printed on supplier orders." supplierProductNumber: String product: Product @requiresScopes(anyOf: ["products:read"]) supplier: Supplier @requiresScopes(anyOf: ["suppliers:read"]) } "Filter input for `DocumentType` connections. Combines per-field scalar filters with `AND`, `OR` and `NOT`." input DocumentTypeFilterInput { id: IDFilter technicalName: StringFilter AND: [DocumentTypeFilterInput!] OR: [DocumentTypeFilterInput!] NOT: DocumentTypeFilterInput } "A paginated list of `DocumentType`." type DocumentTypeConnection { edges: [DocumentTypeEdge!]! pageInfo: PageInfo! } "An edge in a `DocumentType` connection." type DocumentTypeEdge { cursor: String! node: DocumentType! } "Filter input for `Fulfillment` connections. Combines per-field scalar filters with `AND`, `OR` and `NOT`." input FulfillmentFilterInput { id: IDFilter createdAt: DateTimeFilter number: StringFilter state: FulfillmentStateFilter AND: [FulfillmentFilterInput!] OR: [FulfillmentFilterInput!] NOT: FulfillmentFilterInput } input FulfillmentStateFilter { equals: FulfillmentState in: [FulfillmentState!] isNull: Boolean } "Filter input for `Location` connections. Combines per-field scalar filters with `AND`, `OR` and `NOT`." input LocationFilterInput { id: IDFilter active: BooleanFilter addressId: IDFilter code: StringFilter createdAt: DateTimeFilter defaultReceivingWarehouseId: IDFilter defaultWarehouseId: IDFilter name: StringFilter updatedAt: DateTimeFilter AND: [LocationFilterInput!] OR: [LocationFilterInput!] NOT: LocationFilterInput } "A paginated list of `Location`." type LocationConnection { edges: [LocationEdge!]! pageInfo: PageInfo! } "An edge in a `Location` connection." type LocationEdge { cursor: String! node: Location! } "Filter input for `ProductStockLocationConfiguration` connections. Combines per-field scalar filters with `AND`, `OR` and `NOT`." input ProductStockLocationConfigurationFilterInput { id: IDFilter reorderPoint: IntFilter stockBelowReorderPoint: IntFilter targetMaximumQuantity: IntFilter AND: [ProductStockLocationConfigurationFilterInput!] OR: [ProductStockLocationConfigurationFilterInput!] NOT: ProductStockLocationConfigurationFilterInput } "Filter input for `Quote` connections. Combines per-field scalar filters with `AND`, `OR` and `NOT`." input QuoteFilterInput { id: IDFilter acceptedAt: DateTimeFilter amountTotal: FloatFilter assignedUserId: IDFilter createdAt: DateTimeFilter currencyId: IDFilter customerId: IDFilter documentComment: StringFilter internalComment: StringFilter number: StringFilter orderId: IDFilter paymentMethodId: IDFilter salesChannelId: IDFilter sentAt: DateTimeFilter shippingCostsOverrideAmount: FloatFilter taxStatus: StringFilter updatedAt: DateTimeFilter validUntil: DateTimeFilter AND: [QuoteFilterInput!] OR: [QuoteFilterInput!] NOT: QuoteFilterInput } "A paginated list of `Quote`." type QuoteConnection { edges: [QuoteEdge!]! pageInfo: PageInfo! } "An edge in a `Quote` connection." type QuoteEdge { cursor: String! node: Quote! } "A sales quotation prepared for a customer: priced line items, a validity date and its own state machine. Becomes an order once the customer accepts it, at which point `orderId` points at the resulting order." type Quote implements Node { "Global identifier for this entity." id: ID! "Timestamp the customer accepted the quote. Null until then." acceptedAt: DateTime "Net total in the quote's currency, excluding tax. Equal to `amountTotal` when `taxStatus` is `tax-free`." amountNet: Float! "Grand total in the quote's currency, including tax." amountTotal: Float "ID of the administration user responsible for the quote. Defaults to the user who created the quote and can be reassigned in the administration at any time. Null when the quote was created without a user, for example through an integration, or when the user was deleted." assignedUserId: ID "Timestamp the quote row was first persisted." createdAt: DateTime! "ID of the currency every monetary field on the quote is denominated in." currencyId: ID! "ID of the customer the quote was prepared for. Null for a quote that is not (yet) tied to a customer account." customerId: ID "Free-form text rendered on the quote document." documentComment: String "Shipping costs actually charged in the quote's currency, after any override. Follows `taxStatus`, so it is a gross amount on a gross-priced quote." effectiveShippingCosts: Float! "Free-form internal note. Not printed on the quote document and not sent in the quote mail." internalComment: String "Human-readable quote number, drawn from the `quote` number range." number: String! "ID of the order the quote was converted into. Null until the conversion happens." orderId: ID "ID of the payment method proposed on the quote." paymentMethodId: ID "ID of the sales channel the quote was created in. Determines tax and price handling." salesChannelId: ID! "Timestamp the quote was first sent to the customer. Null until the quote is sent for the first time; a declined quote that is reopened as a draft keeps it." sentAt: DateTime "Manually overridden shipping costs in the quote's currency. Null when the automatically calculated costs apply; the value actually charged is always `effectiveShippingCosts`." shippingCostsOverrideAmount: Float "Name of the quote's state (`draft`, `sent`, `accepted`, `declined`)." state: String! "Tax status of the quote (`gross`, `net`, `tax-free`). Says whether `amountTotal` and `effectiveShippingCosts` include tax." taxStatus: String "Timestamp of the last update to the quote row." updatedAt: DateTime "Day the quote expires. Date-only: the time part is always midnight UTC." validUntil: DateTime currency: Currency @requiresScopes(anyOf: ["currencies:read"]) customer: Customer @requiresScopes(anyOf: ["customers:read"]) lineItems(first: Int = 10, after: String, filter: QuoteLineItemFilterInput): QuoteLineItemConnection @requiresScopes(anyOf: ["quotes:read"]) order: Order @requiresScopes(anyOf: ["orders:read"]) paymentMethod: PaymentMethod @requiresScopes(anyOf: ["payment_methods:read"]) salesChannel: SalesChannel @requiresScopes(anyOf: ["sales_channels:read"]) } "Filter input for `QuoteLineItem` connections. Combines per-field scalar filters with `AND`, `OR` and `NOT`." input QuoteLineItemFilterInput { id: IDFilter label: StringFilter productId: IDFilter quantity: IntFilter quoteId: IDFilter totalPrice: FloatFilter type: QuoteLineItemTypeFilter unitPrice: FloatFilter AND: [QuoteLineItemFilterInput!] OR: [QuoteLineItemFilterInput!] NOT: QuoteLineItemFilterInput } input QuoteLineItemTypeFilter { equals: QuoteLineItemType in: [QuoteLineItemType!] isNull: Boolean } "Classifies a quote line item by what it charges for. Determines whether the position references a catalog product and whether its price is positive or negative." enum QuoteLineItemType { "Position for a catalog product; `productId` is set. The price is seeded from the product but can be overridden on the quote." Product "Free-text position with a manually entered label, quantity and price; no `productId`." Custom "Discount position, e.g. a granted rebate. Always quantity 1 with a negative price, and no `productId`." Credit "Discount position created by an automatic promotion of the sales channel whose rules match the quote. Always quantity 1 with a negative price, and no `productId`. Removing it keeps the promotion off the quote." Promotion } "A paginated list of `QuoteLineItem`." type QuoteLineItemConnection { edges: [QuoteLineItemEdge!]! pageInfo: PageInfo! } "An edge in a `QuoteLineItem` connection." type QuoteLineItemEdge { cursor: String! node: QuoteLineItem! } "A single position on a `Quote`. Either a catalog product, a free-text position, a credit or a promotion, priced per unit and in total." type QuoteLineItem implements Node { "Global identifier for this entity." id: ID! "Display label of the position. Always set for custom, credit and promotion positions. On a product position it is the name the merchant gave the position instead of the product's name, and null when the position shows the product's name, which is reached through the `product` association." label: String "ID of the product the position refers to. Null for custom, credit and promotion positions." productId: ID "Number of units on the position." quantity: Int "ID of the quote this line item belongs to." quoteId: ID! "Position total in the quote's currency (`unitPrice * quantity`). Follows the quote's `taxStatus`." totalPrice: Float "Kind of position this line item is. Determines whether `productId` is set." type: QuoteLineItemType! "Per-unit price in the quote's currency. Follows the quote's `taxStatus`." unitPrice: Float product: Product @requiresScopes(anyOf: ["products:read"]) quote: Quote @requiresScopes(anyOf: ["quotes:read"]) } "Filter input for `Salutation` connections. Combines per-field scalar filters with `AND`, `OR` and `NOT`." input SalutationFilterInput { id: IDFilter salutationKey: StringFilter AND: [SalutationFilterInput!] OR: [SalutationFilterInput!] NOT: SalutationFilterInput } "A paginated list of `Salutation`." type SalutationConnection { edges: [SalutationEdge!]! pageInfo: PageInfo! } "An edge in a `Salutation` connection." type SalutationEdge { cursor: String! node: Salutation! } "Filter input for `ShippingLabel` connections. Combines per-field scalar filters with `AND`, `OR` and `NOT`." input ShippingLabelFilterInput { id: IDFilter cancelled: BooleanFilter carrier: StringFilter createdAt: DateTimeFilter isReturnShipment: BooleanFilter updatedAt: DateTimeFilter AND: [ShippingLabelFilterInput!] OR: [ShippingLabelFilterInput!] NOT: ShippingLabelFilterInput } "Filter input for `Supplier` connections. Combines per-field scalar filters with `AND`, `OR` and `NOT`." input SupplierFilterInput { id: IDFilter addressId: IDFilter currencyId: IDFilter customerNumber: StringFilter defaultDeliveryTime: IntFilter languageId: IDFilter name: StringFilter number: StringFilter taxationTypeOverride: SupplierTaxationTypeFilter AND: [SupplierFilterInput!] OR: [SupplierFilterInput!] NOT: SupplierFilterInput } "A paginated list of `Supplier`." type SupplierConnection { edges: [SupplierEdge!]! pageInfo: PageInfo! } "An edge in a `Supplier` connection." type SupplierEdge { cursor: String! node: Supplier! } "Filter input for `WebhookSubscription` connections. Combines per-field scalar filters with `AND`, `OR` and `NOT`." input WebhookSubscriptionFilterInput { id: IDFilter abandonedCount: IntFilter active: BooleanFilter consecutiveAbandonedCount: IntFilter consentState: WebhookConsentStateFilter consentVerifiedAt: DateTimeFilter createdAt: DateTimeFilter deliveredCount: IntFilter destinationType: StringFilter disabledAt: DateTimeFilter disabledReason: WebhookSubscriptionDisabledReasonFilter lastDeliveredAt: DateTimeFilter lastErrorAt: DateTimeFilter lastErrorMessage: StringFilter lastErrorStatusCode: IntFilter reactivationBlockedUntil: DateTimeFilter topic: StringFilter AND: [WebhookSubscriptionFilterInput!] OR: [WebhookSubscriptionFilterInput!] NOT: WebhookSubscriptionFilterInput } input WebhookConsentStateFilter { equals: WebhookConsentState in: [WebhookConsentState!] isNull: Boolean } """ Whether the destination currently consents to receiving webhooks. Nothing is delivered while consent is not `Verified`; notifications keep accumulating and go out once a handshake succeeds. Consent is asked for with a CloudEvents `OPTIONS` request and re-validated periodically, so ceasing to answer it is a supported way of switching Pickware off. """ enum WebhookConsentState { "The destination has not answered a handshake yet. Delivery is suspended." Pending "The destination consented in the last handshake and receives deliveries." Verified "The destination answered the last handshake with a refusal. Delivery is suspended and the handshake is retried." Refused "The destination consented before but no longer answers the periodic re-validation. Delivery is suspended." Lost } input WebhookSubscriptionDisabledReasonFilter { equals: WebhookSubscriptionDisabledReason in: [WebhookSubscriptionDisabledReason!] isNull: Boolean } "Why a subscription was disabled. Only set while `active` is false." enum WebhookSubscriptionDisabledReason { "Ten notifications in a row were abandoned after exhausting their retries. Re-activate with `reactivateWebhookSubscription` once the endpoint is healthy again." AutoDisabled "The destination answered `410 Gone`, which retires a subscription immediately. Create a new subscription for a new endpoint." EndpointGone } "A paginated list of `WebhookSubscription`." type WebhookSubscriptionConnection { edges: [WebhookSubscriptionEdge!]! pageInfo: PageInfo! } "An edge in a `WebhookSubscription` connection." type WebhookSubscriptionEdge { cursor: String! node: WebhookSubscription! } """ A request to be notified about a topic at a destination. Notifications carry only the ids of the affected entities and a timestamp; fetch the current state through the API. Subscriptions belong to the API token that created them: a token only sees and manages its own. Delivery itself runs outside the shop, which is why every field from `active` through `lastErrorMessage` is a mirror of what the delivery service reports and is refreshed whenever the shop talks to it. A quiet shop's mirror can be up to a minute behind. Deliveries only start once the destination has consented, so a freshly created subscription reads `consentState: Pending` until then. """ type WebhookSubscription implements Node { "Global identifier for this entity." id: ID! "Notifications given up on after 72 hours of retries since the subscription was created." abandonedCount: Int "False once the subscription was disabled, which happens when deliveries kept failing or the destination answered `410 Gone`. See `disabledReason`." active: Boolean! "Notifications abandoned in a row. The subscription is disabled automatically when this reaches ten; a delivered notification resets it." consecutiveAbandonedCount: Int "Whether the destination currently consents to receiving webhooks." consentState: WebhookConsentState! "When the destination last consented." consentVerifiedAt: DateTime "When the subscription was created. Also the order the list is paginated in, newest first." createdAt: DateTime! "Notifications that reached the destination since the subscription was created." deliveredCount: Int "Destination configuration as normalized on creation. For `http`: `{ \"url\": \"…\" }`." destinationConfig: JSON! "Technical name of the destination type, e.g. `http`. Determines the shape of `destinationConfig`." destinationType: String! "When the subscription was disabled. Null while it is active." disabledAt: DateTime "Why the subscription was disabled. Null while it is active." disabledReason: WebhookSubscriptionDisabledReason "When a notification last reached the destination." lastDeliveredAt: DateTime "When the last failed delivery attempt was made." lastErrorAt: DateTime "What went wrong on the last failed attempt, as a short technical phrase." lastErrorMessage: String "HTTP status the destination answered on the last failed attempt. Null when the attempt failed before a response, e.g. on a connection timeout." lastErrorStatusCode: Int "Until when `reactivateWebhookSubscription` is refused after an automatic disable. Null when re-activation is possible right now." reactivationBlockedUntil: DateTime """ Secret for verifying the `X-Pickware-Signature` header of deliveries (32 bytes, lowercase hex). Returned exactly once: only in the response of the `createWebhookSubscription` mutation that created this subscription. Every later read returns `null`; a lost secret means deleting the subscription and creating it again. """ signingSecret: String "Topic the subscription is for, e.g. `order/completely-shipped`." topic: String! } "Custom mutations contributed by EntityExposure::customMutations() controllers." type Mutation { "Adds a single line item to an existing goods receipt. Only free goods receipts (those without a supplier order or return order origin) in `draft` or `created` state accept line item writes; anything else is rejected. Returns the updated goods receipt." addGoodsReceiptLineItem(input: AddGoodsReceiptLineItemInput!): GoodsReceipt! @requiresScopes(allOf: ["goods_receipts:write"]) "Adds a new (product, supplier) supplier configuration. Its purchase price is maintained in the currency of the supplier." addProductSupplierConfiguration(input: AddProductSupplierConfigurationInput!): ProductSupplierConfiguration! @requiresScopes(allOf: ["product_supplier_configurations:write"]) "Puts a discount position on a quote and recalculates the quote. The amount is deducted from the quote total and its tax is derived from the tax buckets of the merchandise already on the quote, so add the merchandise first. Only a quote in state `draft` can be changed — any other state fails the mutation. Returns the recalculated quote." addQuoteCredit(input: AddQuoteCreditInput!): Quote! @requiresScopes(allOf: ["quotes:write"]) "Puts a free-text position on a quote and recalculates the quote. Unlike a product position it refers to no catalog product and states its own label, price and tax rate. Only a quote in state `draft` can be changed — any other state fails the mutation. Returns the recalculated quote." addQuoteCustomLineItem(input: AddQuoteCustomLineItemInput!): Quote! @requiresScopes(allOf: ["quotes:write"]) "Puts a catalog product on a quote and recalculates the quote. The position is priced from the product's price in the quote's sales channel; change it with `updateQuoteLineItem`. Only a quote in state `draft` can be changed — any other state fails the mutation. Returns the recalculated quote." addQuoteProductLineItem(input: AddQuoteProductLineItemInput!): Quote! @requiresScopes(allOf: ["quotes:write"]) "Adds a single line item to an existing supplier order via the existing SupplierOrderLineItemCreationService, then recalculates the order. Returns the updated supplier order." addSupplierOrderLineItem(input: AddSupplierOrderLineItemInput!): SupplierOrder! @requiresScopes(allOf: ["supplier_orders:write"]) "Applies a relative delta (positive or negative) to the stock at a (product, bin location[, batch]) tuple. Writes one stock movement against the stock-correction special location. Returns the stock row of the bin location, or `null` when the bin location holds no stock afterwards and is not the default bin location of the product." adjustStockAtBinLocation(input: AdjustStockAtBinLocationInput!): Stock @requiresScopes(allOf: ["stocks:write"]) "Applies a relative delta (positive or negative) to the per-warehouse stock total for a (product, warehouse[, batch]) tuple. Writes one stock movement against the stock-correction special location." adjustStockAtWarehouse(input: AdjustStockAtWarehouseInput!): WarehouseStock! @requiresScopes(allOf: ["stocks:write"]) "Approves a goods receipt that has been captured." approveGoodsReceipt( "ID of the goods receipt to approve." id: ID! ): GoodsReceipt! @requiresScopes(allOf: ["goods_receipts:write"]) "Cancels the outstanding quantity of every open line item of a supplier order, for when the supplier will not deliver the remainder. The outstanding quantity leaves the incoming stock so demand planning can reorder, while the ordered quantity, the line prices and the order total stay unchanged; once nothing is open any more the order settles to DELIVERED on its own. The cancelled quantity is never given: whatever is open at the moment of the call is cancelled, and an order with nothing open is left untouched. Prefer this over lowering an ordered quantity, which falsifies the order document. A supplier order without an approved goods receipt has received nothing, so cancelling its remainder would mark the whole order as one the supplier never delivered: the mutation fails with `CONFLICT` there, and cancelling the supplier order is the right action instead." cancelOpenSupplierOrderQuantities( "ID of the supplier order whose outstanding quantities should be cancelled." id: ID! ): SupplierOrder! @requiresScopes(allOf: ["supplier_orders:write"]) "Cancels a supplier order via the cancel state-machine transition." cancelSupplierOrder( "ID of the supplier order to cancel." id: ID! ): SupplierOrder! @requiresScopes(allOf: ["supplier_orders:write"]) "Completes a goods receipt: triggers the stocking work and the underlying state-machine transition." completeGoodsReceipt( "ID of the goods receipt to complete." id: ID! ): GoodsReceipt! @requiresScopes(allOf: ["goods_receipts:write"]) "Creates a new batch row for the given product. The (productId, number) tuple must be unique." createBatch(input: CreateBatchInput!): Batch! @requiresScopes(allOf: ["batches:write"]) "Creates a customer along with its default billing/shipping address. The customer number is generated from the `customer` number range when omitted, and the language is inherited from the sales channel. Returns the created customer." createCustomer(input: CreateCustomerInput!): Customer! @requiresScopes(allOf: ["customers:write"]) "Creates a goods receipt with the given warehouse, optional supplier and line items in one shot." createGoodsReceipt(input: CreateGoodsReceiptInput!): GoodsReceipt! @requiresScopes(allOf: ["goods_receipts:write"]) "Creates an empty quote in state `draft` for the given customer and sales channel. Everything else is derived: the quote number from the `quote` number range, the currency and its rounding and the tax handling from the sales channel, and the shipping and payment method from the sales channel defaults — each recorded as a snapshot on the quote. The result carries no line items and a total of zero, so it is not yet something to send to a customer; add line items and prices before doing so. Requires quotes to be enabled for the shop; the mutation fails with `FORBIDDEN` otherwise." createQuote(input: CreateQuoteInput!): Quote! @requiresScopes(allOf: ["quotes:write"]) "Creates a new supplier. Only `name` is required: `number` is drawn from the supplier number range, `languageId` defaults to the system default language and `currencyId` to the system default currency when omitted. An optional `address` populates the supplier's address record." createSupplier(input: CreateSupplierInput!): Supplier! @requiresScopes(allOf: ["suppliers:write"]) "Creates a draft supplier order with the given header data and line items, then recalculates totals. The order is raised in the supplier's currency unless `currencyId` names another one." createSupplierOrder(input: CreateSupplierOrderInput!): SupplierOrder! @requiresScopes(allOf: ["supplier_orders:write"]) "Creates a new warehouse. Fills in admin defaults (stock available for sale, default warehouse location, active status) for any field the caller omits." createWarehouse(input: CreateWarehouseInput!): Warehouse! @requiresScopes(allOf: ["warehouses:write"]) """ Subscribes the calling token to a topic. The destination is registered with the delivery service and the subscription is stored right away, with `consentState: Pending`. Deliveries start once the destination has consented to the handshake the delivery service performs; until then nothing is sent. The response is the only place the `signingSecret` is ever returned. Besides `webhook_subscriptions:write`, the token needs read access to the topic's subject type — the scope listed for the topic, e.g. `orders:read` for `order/completely-shipped`. Without it the mutation fails with `FORBIDDEN`. """ createWebhookSubscription(input: CreateWebhookSubscriptionInput!): WebhookSubscription! @requiresScopes(allOf: ["webhook_subscriptions:write"]) "Deletes a bin location. Fails when the bin still holds stock." deleteBinLocation( "ID of the bin location to delete." id: ID! ): Boolean! @requiresScopes(allOf: ["warehouses:write"]) "Deletes a goods receipt that is still in a deletable state." deleteGoodsReceipt( "ID of the goods receipt to delete." id: ID! ): Boolean! @requiresScopes(allOf: ["goods_receipts:write"]) "Deletes a supplier order and its line items as part of the same transaction." deleteSupplierOrder( "ID of the supplier order to delete." id: ID! ): Boolean! @requiresScopes(allOf: ["supplier_orders:write"]) "Deletes a warehouse. Delegates to WarehouseDeletionService which fixes up irrelevant stock and rejects deletion when relevant stock remains." deleteWarehouse( "ID of the warehouse to delete." id: ID! ): Boolean! @requiresScopes(allOf: ["warehouses:write"]) "Deletes a subscription. Notifications that have not been delivered yet are discarded." deleteWebhookSubscription( "ID of the subscription to delete." id: ID! ): Boolean! @requiresScopes(allOf: ["webhook_subscriptions:write"]) "Transitions a supplier order to the CONFIRMED state." markSupplierOrderAsConfirmed( "ID of the supplier order to confirm." id: ID! ): SupplierOrder! @requiresScopes(allOf: ["supplier_orders:write"]) "Transitions a supplier order to the SENT state (sent to supplier)." markSupplierOrderAsOrdered( "ID of the supplier order to mark as sent to the supplier." id: ID! ): SupplierOrder! @requiresScopes(allOf: ["supplier_orders:write"]) "Transitions a supplier order to the PAID payment state." markSupplierOrderAsPaid( "ID of the supplier order to mark as paid." id: ID! ): SupplierOrder! @requiresScopes(allOf: ["supplier_orders:write"]) "Transitions a supplier order to the PARTIALLY_PAID payment state." markSupplierOrderAsPartiallyPaid( "ID of the supplier order to mark as partially paid." id: ID! ): SupplierOrder! @requiresScopes(allOf: ["supplier_orders:write"]) "Transitions a supplier order back to the OPEN payment state." markSupplierOrderAsUnpaid( "ID of the supplier order to reset to the unpaid state." id: ID! ): SupplierOrder! @requiresScopes(allOf: ["supplier_orders:write"]) """ Re-activates a subscription that was disabled automatically. The destination has to consent in a fresh handshake, and an escalating cooldown after the automatic disable has to have elapsed — while it is running the mutation fails with `CONFLICT` and a `reactivationBlockedUntil` error extension. """ reactivateWebhookSubscription( "ID of the subscription to re-activate." id: ID! ): WebhookSubscription! @requiresScopes(allOf: ["webhook_subscriptions:write"]) "Removes a single line item from a goods receipt. Only free goods receipts (those without a supplier order or return order origin) in `draft` or `created` state accept line item writes; anything else is rejected. Returns the updated goods receipt." removeGoodsReceiptLineItem( "ID of the line item to remove." id: ID! ): GoodsReceipt! @requiresScopes(allOf: ["goods_receipts:write"]) "Deletes a (product, supplier) configuration row. The associated purchase-list item is unlinked when present." removeProductSupplierConfiguration( "ID of the configuration row to delete." id: ID! ): Boolean! @requiresScopes(allOf: ["product_supplier_configurations:write"]) "Takes a line item off its quote and recalculates the quote. Works for every kind of position, credits included. Only a quote in state `draft` can be changed — any other state fails the mutation. Returns the recalculated quote." removeQuoteLineItem( "ID of the line item to take off the quote." lineItemId: ID! ): Quote! @requiresScopes(allOf: ["quotes:write"]) "Removes a supplier order line item and recalculates the order. Returns the updated supplier order." removeSupplierOrderLineItem( "ID of the line item to remove." id: ID! ): SupplierOrder! @requiresScopes(allOf: ["supplier_orders:write"]) "Sets (or clears) the default bin location for a product in a warehouse. Upserts the `(product, warehouse)` configuration row: an existing row is updated, otherwise a new row is created with a reorder point of 0. Passing `binLocationId: null` clears the default bin location. Returns the resulting configuration row." setProductDefaultBinLocation(input: SetProductDefaultBinLocationInput!): ProductWarehouseConfiguration! @requiresScopes(allOf: ["product_warehouse_configurations:write"]) "Sets the product-level reorder thresholds (`reorderPoint` and `targetMaximumQuantity`) that apply across all warehouses. Returns the updated product." setProductReorderConfiguration(input: SetProductReorderConfigurationInput!): Product! @requiresScopes(allOf: ["products:write"]) "Sets the reorder thresholds (`reorderPoint` and `targetMaximumQuantity`) for a product at a stock location. Pass a `binLocationId` to target a specific bin location, or omit it to target the warehouse-level \"unknown\" location. Upserts the configuration row (and its product-stock-location mapping when it does not yet exist) and returns the resulting configuration row." setProductStockLocationReorderConfiguration(input: SetProductStockLocationReorderConfigurationInput!): ProductStockLocationConfiguration! @requiresScopes(allOf: ["product_stock_location_configurations:write"]) "Sets the reorder thresholds (`reorderPoint` and `targetMaximumQuantity`) for a product in a warehouse. Upserts the `(product, warehouse)` configuration row: an existing row is updated, otherwise a new row is created. Returns the resulting configuration row." setProductWarehouseReorderConfiguration(input: SetProductWarehouseReorderConfigurationInput!): ProductWarehouseConfiguration! @requiresScopes(allOf: ["product_warehouse_configurations:write"]) "Sets the absolute stock quantity for a (product, bin location[, batch]) tuple. Computes the delta against the current stock and writes one stock movement against the stock-correction special location. Returns the stock row of the bin location, or `null` when the bin location holds no stock afterwards and is not the default bin location of the product." setStockAtBinLocation(input: SetStockAtBinLocationInput!): Stock @requiresScopes(allOf: ["stocks:write"]) "Sets the absolute stock quantity for a (product, warehouse[, batch]) tuple. Computes the delta against the current per-warehouse total and writes one stock movement against the stock-correction special location." setStockAtWarehouse(input: SetStockAtWarehouseInput!): WarehouseStock! @requiresScopes(allOf: ["stocks:write"]) "Merges the given custom fields into the supplier order. The payload is a JSON object keyed by custom field technical name; keys not present in the payload keep their current value, and a key present with value null is stored as null. Only keys defined for supplier orders are accepted. Returns the updated supplier order." setSupplierOrderCustomFields( "ID of the supplier order to update." id: ID! "Custom fields to merge, as a JSON object keyed by custom field technical name (e.g. `{ myField: \"value\", anotherField: null }`)." customFields: JSON! ): SupplierOrder! @requiresScopes(allOf: ["supplier_orders:write"]) "Ships every still-shippable quantity of the given order from the chosen warehouse in a single transaction. When `warehouseId` is omitted, the shop's configured default warehouse is used. Returns the freshly loaded order. Fails without shipping anything when the warehouse does not hold enough stock for the open quantities, when the warehouse is being decommissioned, when the order is currently being picked, or when its fulfillment is on hold or assigned to another warehouse. Tracking codes cannot be passed; the shipment takes over the tracking codes already stored on the order's delivery." shipOrderCompletely(input: ShipOrderCompletelyInput!): Order! @requiresScopes(allOf: ["orders:write"]) "Splits a line item in two: a new line item is created with `newLineItemQuantity` units and the original keeps the remainder, so the received total stays the same. Use it to stock parts of one receipt line separately. The quantity must be lower than the line item's current quantity, and the goods receipt must not be completed yet. Returns the updated goods receipt." splitGoodsReceiptLineItem( "ID of the line item to split." id: ID! "Number of units to move onto the newly created line item. Must be positive and lower than the current quantity of the line item." newLineItemQuantity: Int! ): GoodsReceipt! @requiresScopes(allOf: ["goods_receipts:write"]) "Moves the given quantity of a product from one bin location to another in a single stock movement. Source and destination must differ; quantity must be positive." transferStock(input: TransferStockInput!): Stock! @requiresScopes(allOf: ["stocks:write"]) "Changes the warehouse the goods are booked into and re-snapshots it on the receipt. Rejected once the goods receipt is part of a stock valuation report. Returns the updated goods receipt." updateGoodsReceiptWarehouse( "ID of the goods receipt to update." id: ID! "ID of the warehouse the goods are booked into from now on." warehouseId: ID! ): GoodsReceipt! @requiresScopes(allOf: ["goods_receipts:write"]) "Partial update of an existing (product, supplier) configuration. Omitted fields are not touched. The purchase price is maintained in the currency of the supplier; supplying only one of `purchasePriceGross` / `purchasePriceNet` keeps the other side of the current price." updateProductSupplierConfiguration(input: UpdateProductSupplierConfigurationInput!): ProductSupplierConfiguration! @requiresScopes(allOf: ["product_supplier_configurations:write"]) "Changes the label and the amount of a discount position, then recalculates the quote. A position that is not a credit is rejected; use `updateQuoteLineItem` for those. Only a quote in state `draft` can be changed — any other state fails the mutation. Returns the recalculated quote." updateQuoteCredit(input: UpdateQuoteCreditInput!): Quote! @requiresScopes(allOf: ["quotes:write"]) "Changes the quantity, the unit price, the label and — on a free position — the tax rate of a quote line item, then recalculates the quote. This is how a quote departs from the list price. An omitted field keeps its current value, and a `quantity` of `0` takes the position off the quote. A credit position is rejected; use `updateQuoteCredit` for those. Only a quote in state `draft` can be changed — any other state fails the mutation. Returns the recalculated quote." updateQuoteLineItem(input: UpdateQuoteLineItemInput!): Quote! @requiresScopes(allOf: ["quotes:write"]) "Partial update of an existing supplier. Omitted fields are not touched. A supplied `address` is merged field-by-field into the supplier's address record, which is created on the fly when the supplier has none yet." updateSupplier(input: UpdateSupplierInput!): Supplier! @requiresScopes(allOf: ["suppliers:write"]) "Updates the expected delivery date on a supplier order and all of its line items. Pass null to clear it." updateSupplierOrderExpectedDeliveryDate( "ID of the supplier order to update." id: ID! "New expected delivery date. Pass `null` to clear it." expectedDeliveryDate: DateTime ): SupplierOrder! @requiresScopes(allOf: ["supplier_orders:write"]) "Updates the quantity and/or unit price of a supplier order line item via the line item priceDefinition. Triggers an order recalculation. Returns the updated supplier order." updateSupplierOrderLineItem(input: UpdateSupplierOrderLineItemInput!): SupplierOrder! @requiresScopes(allOf: ["supplier_orders:write"]) "Creates a bin location with the given code in the given warehouse, or updates the existing bin location position if a row with the same (warehouseId, code) already exists. Returns the resulting bin location row." upsertBinLocation(input: UpsertBinLocationInput!): BinLocation! @requiresScopes(allOf: ["warehouses:write"]) } "Input for `addGoodsReceiptLineItem`. Adds a single line item to a goods receipt that is still in `draft` or `created` state." input AddGoodsReceiptLineItemInput { "ID of the goods receipt to add the line item to." goodsReceiptId: ID! "ID of the product being received. Must not be the parent of a variant set." productId: ID! "Number of units to book. Must be positive." quantity: Int! "Per-unit net price booked against this line, in the receipt's currency." unitPrice: Float! "ID of the batch the units belong to, when batch tracking is enabled for the product." batchId: ID = null } "Input for `addProductSupplierConfiguration`. Registers a new supplier as a procurement source for a product. The purchase price is maintained in the currency of the supplier." input AddProductSupplierConfigurationInput { "ID of the product." productId: ID! "ID of the supplier." supplierId: ID! "Supplier's own article number for the product (i.e. how the supplier identifies the product)." supplierProductNumber: String = null "Minimum purchasable quantity from this supplier." minPurchase: Int = null "Step size in which the product can be ordered (e.g. multiples of 6)." purchaseSteps: Int = null "Lead time in days. Overrides the supplier-wide default when set." deliveryTimeDays: Int = null "Gross unit purchase price in the currency of the supplier." purchasePriceGross: Float = null "Net unit purchase price in the currency of the supplier." purchasePriceNet: Float = null } "Input for `addQuoteCredit`: a discount position whose tax is derived from the tax buckets of the merchandise already on the quote." input AddQuoteCreditInput { "ID of the quote to add the credit to. The quote must be in state `draft`." quoteId: ID! "Display label of the credit, shown on the quote document." label: String! "Amount to deduct, in the quote's currency. Must be positive: it is stored as a negative position and deducted from the quote total. Zero and negative amounts are rejected." amount: Float! } "Input for `addQuoteCustomLineItem`: a free-text position that refers to no catalog product and carries its own label, price and tax rate." input AddQuoteCustomLineItemInput { "ID of the quote to add the position to. The quote must be in state `draft`." quoteId: ID! "Display label of the position, shown on the quote document." label: String! "Number of units to put on the position. Must be at least 1." quantity: Int! "Per-unit price in the quote's currency, read in the quote's `taxStatus` — gross on a gross-priced quote, net on a net-priced one. Must not be negative. The value is a price *definition*: the server recalculates the position and the quote totals from it, so the resulting `unitPrice` may differ by the quote's rounding." unitPrice: Float! "Tax rate of the position in percent, e.g. `19` for 19%. A free position carries no tax rule of its own, so the rate has to be stated here." taxRate: Float! } "Input for `addQuoteProductLineItem`. Prices the position from the product's sales channel price; use `updateQuoteLineItem` afterwards to depart from the list price." input AddQuoteProductLineItemInput { "ID of the quote to add the position to. The quote must be in state `draft`." quoteId: ID! "ID of the product to put on the quote. Must be available in the quote's sales channel; the mutation fails otherwise." productId: ID! "Number of units to put on the position. Must be at least 1." quantity: Int! } "Input for `addSupplierOrderLineItem`. Adds a single line item to an existing supplier order; the line is identified by the supplier-order + product-supplier-configuration pair." input AddSupplierOrderLineItemInput { "ID of the supplier order to add to." supplierOrderId: ID! "ID of the `(product, supplier)` configuration whose product the line item references." productSupplierConfigurationId: ID! "Number of units to order for this line." quantity: Int! "Net price per unit in the supplier order's currency. Omit to use the purchase price the supplier configuration holds in that currency, or 0 when it holds none. Purchase prices are maintained in the supplier's currency (`ProductSupplierConfiguration.purchasePrices`), so pass the price for an order in another currency." unitPrice: Float = null } "Input for `adjustStockAtBinLocation`. Applies a relative `delta` (positive or negative) to the current stock at a `(productId, binLocationId[, batchId])` tuple." input AdjustStockAtBinLocationInput { "ID of the product whose stock is being adjusted." productId: ID! "ID of the bin location whose stock is being adjusted." binLocationId: ID! "Signed quantity to apply. Positive values add stock, negative values remove stock. Zero is rejected (no-op)." delta: Int! "ID of the batch when batch tracking is enabled for the product." batchId: ID = null } "Input for `adjustStockAtWarehouse`. Applies a relative `delta` (positive or negative) to the per-warehouse total at a `(productId, warehouseId[, batchId])` tuple." input AdjustStockAtWarehouseInput { "ID of the product whose stock is being adjusted." productId: ID! "ID of the warehouse whose stock is being adjusted." warehouseId: ID! "Signed quantity to apply. Positive values add stock, negative values remove stock. Zero is rejected (no-op)." delta: Int! "ID of the batch when batch tracking is enabled for the product." batchId: ID = null } "Input for `createBatch`. Registers a new batch row for the given product; the `(productId, number)` pair must be unique." input CreateBatchInput { "ID of the product the batch belongs to." productId: ID! "Batch identifier (lot number, serial group, …). Unique per product." number: String! "Best-before date for the batch." bestBeforeDate: DateTime = null "Date the batch was produced." productionDate: DateTime = null "Free-form note attached to the batch." comment: String = null } "Input for creating a single customer along with its default address." input CreateCustomerInput { "Email address of the customer. Must be unique within the sales channel." email: String! "First name of the customer." firstName: String! "Last name of the customer." lastName: String! "ID of the sales channel the customer is registered in." salesChannelId: ID! "ID of the customer group the customer is assigned to." customerGroupId: ID! "Customer type. Either `Private` or `Business`. `company` is required for `Business`." accountType: CustomerAccountType! "Billing address, also used as the default shipping address." billingAddress: CreateCustomerAddressInput! "ID of the salutation. Applied to both the customer and the created address." salutationId: ID = null "ID of the customer's default payment method. Shops that store a default payment method per customer require it and reject a customer without one; other shops ignore it." defaultPaymentMethodId: ID = null "Company name. Required when `accountType` is `Business`." company: String = null "Optional academic or honorific title (e.g. `Dr.`)." title: String = null "List of VAT registration IDs of the customer." vatIds: [String!] = null "Password for the customer login. Stored only as a secure hash — never persisted in plain text. Omit to create a customer without login credentials." password: String = null "Human-readable customer number. Generated from the `customer` number range when omitted." customerNumber: String = null } "Address used as the new customer's default billing and shipping address." input CreateCustomerAddressInput { "First name on the address." firstName: String! "Last name on the address." lastName: String! "Street and house number." street: String! "City." city: String! "ID of the country." countryId: ID! "Postal code." zipcode: String = null "Company name on the address." company: String = null } "Input for `createGoodsReceipt`. Booking goods in is a single-shot operation: the caller declares which products and quantities arrive against the chosen warehouse, optionally linking the receipt to a supplier order." input CreateGoodsReceiptInput { "ID of the warehouse the goods are booked into." warehouseId: ID! "Line items to book. Must be non-empty." lineItems: [CreateGoodsReceiptLineItemInput!]! "ID of the supplier the receipt is sourced from." supplierId: ID = null "IDs of further supplier orders to link the receipt to, beyond those its lines are received against." supplierOrderIds: [ID!] = null } "One line item booked together with a goods receipt via `createGoodsReceipt`." input CreateGoodsReceiptLineItemInput { "ID of the product being received." productId: ID! "Number of units to book. Must be positive." quantity: Int! "ID of the supplier order this line is received against. The receipt is linked to this supplier order as well." supplierOrderId: ID = null "Per-unit net price booked against this line. When omitted, a line received against a supplier order defaults to the supplier order line price, and a line of a free receipt defaults to the last used purchase price of the product, converted into the receipt's currency at the receipt's exchange rate, or to the purchase price of the product in the receipt's currency when it has no last used purchase price. The line stays unpriced when neither price is available." unitPrice: Float = null "ID of the bin location the received units are stocked into. Must belong to the warehouse of the goods receipt. The destination is kept as given: approving the goods receipt only computes destinations for lines that leave it empty." destinationBinLocationId: ID = null } "Input for `createQuote`. A quote is opened with the customer it is prepared for and the sales channel it is sold through; every other field on the quote is derived from those two." input CreateQuoteInput { "ID of the customer the quote is prepared for. Must be an existing customer account — quotes have no guest equivalent. Use `createCustomer` when the customer does not exist yet." customerId: ID! "ID of the sales channel the quote is sold through. Determines the currency and its rounding, the tax handling, and the shipping and payment method the quote starts with." salesChannelId: ID! } "Input for `createSupplier`. Only `name` is required: `number` falls back to the supplier number range, `languageId` to the system default language and `currencyId` to the system default currency when omitted." input CreateSupplierInput { "Supplier display name. Must be unique." name: String! "Internal supplier number. Must be unique. Generated from the supplier number range when omitted." number: String = null "Customer number the supplier assigned to this shop." customerNumber: String = null "MID (manufacturer identification) code of the supplier." midCode: String = null "Default delivery lead time in days, used as a fallback when a product has no supplier-specific override." defaultDeliveryTime: Int = null "ID of the language used when communicating with the supplier. Defaults to the system default language when omitted." languageId: ID = null "Address and contact details of the supplier." address: SupplierAddressInput = null "ID of the currency the supplier's purchase prices are maintained in and its supplier orders are raised in. Defaults to the system default currency when omitted." currencyId: ID = null "Taxation type to raise the supplier's supplier orders with instead of deriving it from the countries of the supplier and of the company. Omit it to have it derived automatically." taxationTypeOverride: SupplierTaxationType = null } "Address and contact details of a supplier. Every field is optional; on update only the supplied fields are written, the rest are left untouched." input SupplierAddressInput { "ID of the salutation used when addressing the contact person." salutationId: ID = null "First name of the contact person." firstName: String = null "Last name of the contact person." lastName: String = null "Academic or honorific title of the contact person." title: String = null "Email address of the supplier." email: String = null "Phone number of the supplier." phone: String = null "Fax number of the supplier." fax: String = null "Website of the supplier." website: String = null "Company name of the supplier." company: String = null "Department of the contact person within the supplier company." department: String = null "Position of the contact person within the supplier company." position: String = null "Street of the supplier address." street: String = null "House number of the supplier address." houseNumber: String = null "ZIP/postal code of the supplier address." zipCode: String = null "City of the supplier address." city: String = null "State of the supplier address." state: String = null "Province of the supplier address." province: String = null "Additional address line (e.g. c/o) of the supplier address." addressAddition: String = null "ISO code of the supplier address country (e.g. \"DE\")." countryIso: String = null "Free-text comment on the supplier." comment: String = null "VAT ID of the supplier." vatId: String = null } "Header and line items for `createSupplierOrder`." input CreateSupplierOrderInput { "ID of the supplier the order is raised against." supplierId: ID! "Line items to include on the order. May be empty, which creates an empty order to add line items to with `addSupplierOrderLineItem`." lineItems: [CreateSupplierOrderLineItemInput!]! "ID of the currency to raise the order in when it differs from the supplier's currency. A `unitPrice` is taken in this currency, and the purchase price of a line item without one is converted into it at the current exchange rate." currencyId: ID = null } "One line item created together with a supplier order via `createSupplierOrder`. The product is identified through its supplier-configuration so the `(product, supplier)` relationship is unambiguous." input CreateSupplierOrderLineItemInput { "ID of the `(product, supplier)` configuration whose product the line item references." productSupplierConfigurationId: ID! "Number of units to order for this line." quantity: Int! "Net price per unit in the currency of the supplier order. Omit to use the purchase price of the supplier configuration, which is converted into the currency of the order when `CreateSupplierOrderInput.currencyId` names another one." unitPrice: Float = null } "Input for `createWarehouse`. Only `name` and `code` are required; the resolver fills in admin defaults for the remaining fields." input CreateWarehouseInput { "Warehouse display name." name: String! "Short warehouse code (e.g. `HQ`, `DE-01`). Must be unique across the shop." code: String! "When `true`, stock in this warehouse counts towards availability." isStockAvailableForSale: Boolean = null "IANA timezone identifier the warehouse operates in (e.g. `Europe/Berlin`)." timezone: String = null "ID of the warehouse location to attach to." warehouseLocationId: ID = null "Postal address of the warehouse." address: WarehouseAddressInput = null } "Address payload nested in `CreateWarehouseInput`. Mirrors the subset of `pickware_erp_address` fields the warehouse admin form exposes; all fields are optional so the caller can supply only what they have." input WarehouseAddressInput { "Company line of the address." company: String = null "Department / business unit within the company." department: String = null "Contact first name." firstName: String = null "Contact last name." lastName: String = null "Street name." street: String = null "House number or street number suffix (kept separate from `street` for postal-format compatibility)." houseNumber: String = null "ZIP / postal code." zipCode: String = null "City / town." city: String = null "State / region." state: String = null "ISO 3166-1 alpha-2 country code (e.g. `DE`, `AT`, `CH`)." countryIso: String = null "Contact phone number." phone: String = null "Contact e-mail address." email: String = null "Free-form note attached to the address." comment: String = null } "Input for `createWebhookSubscription`." input CreateWebhookSubscriptionInput { "Topic to subscribe to, e.g. `order/completely-shipped`. The token needs read access to the scope of the topic's subject type." topic: String! "Where notifications are delivered." destination: WebhookDestinationInput! } "Where notifications are delivered. Exactly one field must be set; the set field selects the destination type." input WebhookDestinationInput { "Signed HTTP `POST` requests to a URL." http: HttpWebhookDestinationInput = null } """ Delivers notifications as signed HTTP `POST` requests to a URL you control. The destination has to consent before it receives anything: answer the CloudEvents `OPTIONS` handshake with `WebHook-Allowed-Origin: pickware.com`, or echo the signed `GET` challenge (`?pickware_webhook_challenge=…`) in the response body. """ input HttpWebhookDestinationInput { "Callback URL. It must be `https`, name a publicly reachable host, and carry neither credentials nor a query string or fragment." url: String! } "Input for `setProductDefaultBinLocation`. Sets the default bin location for a product in a warehouse, upserting the underlying configuration row. Pass `binLocationId: null` (or omit it) to clear the default bin location." input SetProductDefaultBinLocationInput { "ID of the product." productId: ID! "ID of the warehouse." warehouseId: ID! "ID of the bin location to set as the default. Pass `null` (or omit) to clear the default bin location." binLocationId: ID = null } "Input for `setProductReorderConfiguration`. Sets the product-level reorder thresholds that apply across all warehouses." input SetProductReorderConfigurationInput { "ID of the product." productId: ID! "Stock level at or below which the product is considered to need reordering. Must be 0 or greater." reorderPoint: Int! "Target maximum stock quantity used as the replenish-to level for the product. Must be 0 or greater when set. Pass `null` (or omit) to clear it." targetMaximumQuantity: Int = null } "Input for `setProductStockLocationReorderConfiguration`. Sets the reorder thresholds for a product at a stock location, upserting the underlying configuration row (and its product-stock-location mapping when it does not yet exist). Pass a `binLocationId` to target a specific bin location; omit it (or pass `null`) to target the warehouse-level \"unknown\" location for stock that is in the warehouse but not assigned to a bin." input SetProductStockLocationReorderConfigurationInput { "ID of the product." productId: ID! "ID of the warehouse the stock location belongs to." warehouseId: ID! "Stock level at or below which the product is considered to need reordering at this stock location. Must be 0 or greater." reorderPoint: Int! "ID of the bin location. Pass `null` (or omit) to target the warehouse-level \"unknown\" location." binLocationId: ID = null "Target maximum stock quantity used as the replenish-to level for the product at this stock location. Must be 0 or greater when set. Pass `null` (or omit) to clear it." targetMaximumQuantity: Int = null } "Input for `setProductWarehouseReorderConfiguration`. Sets the reorder thresholds for a product in a warehouse, upserting the underlying `(product, warehouse)` configuration row." input SetProductWarehouseReorderConfigurationInput { "ID of the product." productId: ID! "ID of the warehouse." warehouseId: ID! "Stock level at or below which the product is considered to need reordering in this warehouse. Must be 0 or greater." reorderPoint: Int! "Target maximum stock quantity used as the replenish-to level for the product in this warehouse. Must be 0 or greater when set. Pass `null` (or omit) to clear it." targetMaximumQuantity: Int = null } "Input for `setStockAtBinLocation`. Sets the absolute stock quantity at a `(productId, binLocationId[, batchId])` tuple. The mutation computes the delta against the current row and writes one stock movement." input SetStockAtBinLocationInput { "ID of the product." productId: ID! "ID of the bin location." binLocationId: ID! "Target absolute stock quantity. Must be `>= 0`." quantity: Int! "ID of the batch when batch tracking is enabled for the product." batchId: ID = null } "Input for `setStockAtWarehouse`. Sets the absolute per-warehouse total stock for a `(productId, warehouseId[, batchId])` tuple. The mutation computes the delta against the current aggregate and writes one stock movement." input SetStockAtWarehouseInput { "ID of the product." productId: ID! "ID of the warehouse." warehouseId: ID! "Target absolute stock quantity. Must be `>= 0`." quantity: Int! "ID of the batch when batch tracking is enabled for the product." batchId: ID = null } "Input for `shipOrderCompletely`. Ships every still-shippable quantity of the order from the chosen warehouse (or the shop default) in a single call." input ShipOrderCompletelyInput { "ID of the order to ship." orderId: ID! "ID of the warehouse to ship from. Defaults to the shop's configured default warehouse when omitted." warehouseId: ID = null } "Input for `transferStock`. Moves `quantity` units of `productId` from `sourceBinLocationId` to `destinationBinLocationId` in a single stock movement (no external counter-location involved)." input TransferStockInput { "ID of the product whose stock is being moved." productId: ID! "ID of the bin location stock is moved out of." sourceBinLocationId: ID! "ID of the bin location stock is moved into. Must differ from `sourceBinLocationId`." destinationBinLocationId: ID! "Number of units to move. Must be positive." quantity: Int! "ID of the batch when batch tracking is enabled for the product." batchId: ID = null } "Input for `updateProductSupplierConfiguration`. Partial update of an existing supplier-configuration row — only supplied fields are written. The purchase price is maintained in the currency of the supplier." input UpdateProductSupplierConfigurationInput { "ID of the configuration row to update." id: ID! "New supplier article number for the product." supplierProductNumber: String = null "New minimum purchasable quantity." minPurchase: Int = null "New purchase step size." purchaseSteps: Int = null "New lead time in days." deliveryTimeDays: Int = null "New gross unit purchase price in the currency of the supplier. The net price keeps its current value unless `purchasePriceNet` is supplied too." purchasePriceGross: Float = null "New net unit purchase price in the currency of the supplier. The gross price keeps its current value unless `purchasePriceGross` is supplied too." purchasePriceNet: Float = null } "Input for `updateQuoteCredit`. Both the label and the amount are always written, so send the current value for the one that should stay as it is." input UpdateQuoteCreditInput { "ID of the credit line item to change. Must belong to a quote in state `draft` and must be a credit position." lineItemId: ID! "New display label of the credit." label: String! "New amount to deduct, in the quote's currency. Must be positive: it is stored as a negative position and deducted from the quote total. Zero and negative amounts are rejected." amount: Float! } "Input for `updateQuoteLineItem`. Every field except `lineItemId` is optional and keeps its current value when omitted, so a price-only change needs nothing but `lineItemId` and `unitPrice`." input UpdateQuoteLineItemInput { "ID of the line item to change. Must belong to a quote in state `draft` and must not be a credit position — use `updateQuoteCredit` for those." lineItemId: ID! "New number of units. Keeps the current quantity when omitted. `0` takes the position off the quote, exactly as `removeQuoteLineItem` would; a negative value is rejected." quantity: Int = null "New per-unit price in the quote's currency, read in the quote's `taxStatus`. Must not be negative. Keeps the current price when omitted. The value is a price *definition*: the server recalculates the position and the quote totals from it, so the resulting `unitPrice` may differ by the quote's rounding." unitPrice: Float = null "New tax rate in percent. Only applies to a free position; on a product position the tax rules of the product are kept and this field is ignored." taxRate: Float = null "New display label. Keeps the current label when omitted. On a product position the label replaces the product's name on the quote and on the order created from it; an empty string removes it again, so the position shows the product's name." label: String = null } "Input for `updateSupplier`. Partial update of an existing supplier — only supplied fields are written, the rest are left untouched." input UpdateSupplierInput { "ID of the supplier to update." id: ID! "New supplier display name. Must be unique." name: String = null "New internal supplier number. Must be unique." number: String = null "New customer number the supplier assigned to this shop." customerNumber: String = null "New MID (manufacturer identification) code of the supplier." midCode: String = null "New default delivery lead time in days." defaultDeliveryTime: Int = null "New ID of the language used when communicating with the supplier." languageId: ID = null "Address and contact details to merge into the supplier's address record." address: SupplierAddressInput = null "New taxation type to raise the supplier's supplier orders with instead of deriving it from the countries of the supplier and of the company. Omitting it or passing `null` leaves the current setting unchanged, so an override cannot be removed through this mutation." taxationTypeOverride: SupplierTaxationType = null } "Input for `updateSupplierOrderLineItem`. Only `quantity` and `unitPrice` are editable; the supplier order is recalculated synchronously after the change." input UpdateSupplierOrderLineItemInput { "ID of the line item to update." id: ID! "New ordered quantity." quantity: Int = null "New per-unit price in the supplier order's currency." unitPrice: Float = null } "Input for `upsertBinLocation`. Idempotent on `(warehouseId, code)` — supplying an existing code updates that bin location's `position` (when given) rather than creating a duplicate." input UpsertBinLocationInput { "ID of the parent warehouse." warehouseId: ID! "Bin location code (e.g. `A-12-3`). Unique within the parent warehouse." code: String! "Optional ordering hint used by pick-route generation. Lower numbers are visited first. When omitted, an existing bin location keeps its position." position: Int = null }