All Release Notes
Introduced Quotes in beta
30 June 2022
Composable Commerce
HTTP API
New feature
CartsOrdersPricing and DiscountsExtensibilityGraphQL
We have released Quotes in public beta. This new feature allows you to negotiate quote requests for your products with your customers. The negotiation process involves utilizing several APIs that we introduced with this feature, allowing you to control each step of the intended workflow of the negotiation. All the introduced resources, such as Quote Request, Staged Quote, and Quote can be extended with Custom Fields. The discounts applied on a specific Quote, can be utilized by the newly added DirectDiscount. After successful negotiation, the Order can be created right from the Quote.
Changes:
- [API] Added Quote Requests and My Quote Requests APIs.
- [API] Added Staged Quotes API.
- [API] Added Quotes API.
- [API] Added QuoteRequestCreated, QuoteRequestStateChanged, and QuoteRequestDeleted Messages.
- [API] Added StagedQuoteCreated, StagedQuoteStateChanged, StagedQuoteValidToSet, StagedQuoteSellerCommentSet, and StagedQuoteDeleted Messages.
- [API] Added QuoteCreated, QuoteStateChanged, and QuoteDeleted Messages.
- [API] Added
Quote
to CartOrigin. - [API] Added DirectDiscount and DirectDiscountDraft to Carts API.
- [API] Added
directDiscounts
field to Cart and Order. - [API] Added
setDirectDiscounts
update action to Carts and Orders via OrderEdit. - [API] Added OrderFromQuoteDraft and Create Order from Quote endpoint to Orders API.
- [API] Added
quote
field to Order. - [API] Added OAuth scopes
manage_quote_requests
,view_quote_requests
,manage_my_quote_requests
,manage_staged_quotes
,view_staged_quotes
,manage_quotes
, andview_quotes
. - [GraphQL API] Added the following types to the GraphQL schema:
CancelQuoteRequest
,ChangeMyQuoteMyQuoteState
,ChangeQuoteRequestState
,ChangeQuoteState
,ChangeStagedQuoteState
,MyQuoteRequestDraft
,MyQuoteRequestUpdateAction
,MyQuoteState
,MyQuoteUpdateAction
,OrderMyQuoteCommand
,OrderQuoteCommand
,Quote
,QuoteDraft
,QuoteQueryResult
,QuoteRequest
,QuoteRequestDraft
,QuoteRequestQueryResult
,QuoteRequestState
,QuoteRequestUpdateAction
,QuoteState
,QuoteUpdateAction
,SetMyQuoteRequestCustomField
,SetMyQuoteRequestCustomType
,SetQuoteCustomField
,SetQuoteCustomType
,SetQuoteRequestCustomField
,SetQuoteRequestCustomType
,SetStagedQuoteCustomField
,SetStagedQuoteCustomType
,SetStagedQuoteSellerComment
,SetStagedQuoteValidTo
,StagedQuote
,StagedQuoteDraft
,StagedQuoteQueryResult
,StagedQuoteState
,StagedQuoteUpdateAction
.
- [GraphQL API] Changed the
Query
type:- Added the
quoteRequest
field to theQuery
type. - Added the
quotes
field to theQuery
type. - Added the
stagedQuotes
field to theQuery
type. - Added the
quote
field to theQuery
type. - Added the
quoteRequests
field to theQuery
type. - Added the
stagedQuote
field to theQuery
type.
- Added the
- [GraphQL API] Changed the
Me
type:- Added the
quoteRequests
field to theMe
type. - Added the
quoteRequest
field to theMe
type. - Added the
quote
field to theMe
type. - Added the
quotes
field to theMe
type.
- Added the
- [GraphQL API] Changed the
Mutation
type:- Added the
createQuoteRequest
field to theMutation
type. - Added the
updateQuoteRequest
field to theMutation
type. - Added the
updateMyQuoteRequest
field to theMutation
type. - Added the
createOrderFromQuote
field to theMutation
type. - Added the
updateQuote
field to theMutation
type. - Added the
deleteQuoteRequest
field to theMutation
type. - Added the
createStagedQuote
field to theMutation
type. - Added the
updateMyQuote
field to theMutation
type. - Added the
deleteStagedQuote
field to theMutation
type. - Added the
createQuote
field to theMutation
type. - Added the
updateStagedQuote
field to theMutation
type. - Added the
createMyQuoteRequest
field to theMutation
type. - Added the
createMyOrderFromQuote
field to theMutation
type. - Added the
deleteQuote
field to theMutation
type.
- Added the
The following changes were introduced in terms of GraphQL SDL:
extend type Query {quote("Queries with specified ID"id: String,"Queries with specified key"key: String): QuotequoteRequest("Queries with specified ID"id: String,"Queries with specified key"key: String): QuoteRequestquoteRequests(where: String, sort: [String!], limit: Int, offset: Int): QuoteRequestQueryResult!quotes(where: String, sort: [String!], limit: Int, offset: Int): QuoteQueryResult!stagedQuote("Queries with specified ID"id: String,"Queries with specified key"key: String): StagedQuotestagedQuotes(where: String, sort: [String!], limit: Int, offset: Int): StagedQuoteQueryResult!}extend type Me {"BETA: This feature can be subject to change and should be used carefully in production. https://docs.commercetools.com/api/contract#public-beta"quote("Queries with specified ID"id: String,"Queries with specified key"key: String): Quote"BETA: This feature can be subject to change and should be used carefully in production. https://docs.commercetools.com/api/contract#public-beta"quoteRequest("Queries with specified ID"id: String,"Queries with specified key"key: String): QuoteRequest"BETA: This feature can be subject to change and should be used carefully in production. https://docs.commercetools.com/api/contract#public-beta"quoteRequests(where: String, sort: [String!], limit: Int, offset: Int): QuoteRequestQueryResult!"BETA: This feature can be subject to change and should be used carefully in production. https://docs.commercetools.com/api/contract#public-beta"quotes(where: String, sort: [String!], limit: Int, offset: Int): QuoteQueryResult!}extend type Mutation {"BETA: This feature can be subject to change and should be used carefully in production. https://docs.commercetools.com/api/contract#public-beta"createMyOrderFromQuote(draft: OrderMyQuoteCommand!): OrdercreateMyQuoteRequest(draft: MyQuoteRequestDraft!): QuoteRequestcreateOrderFromQuote(draft: OrderQuoteCommand!): OrdercreateQuote(draft: QuoteDraft!): QuotecreateQuoteRequest(draft: QuoteRequestDraft!): QuoteRequestcreateStagedQuote(draft: StagedQuoteDraft!): StagedQuotedeleteQuote(version: Long!, personalDataErasure: Boolean = false,"Queries with specified ID"id: String,"Queries with specified key"key: String): QuotedeleteQuoteRequest(version: Long!, personalDataErasure: Boolean = false,"Queries with specified ID"id: String,"Queries with specified key"key: String): QuoteRequestdeleteStagedQuote(version: Long!, personalDataErasure: Boolean = false,"Queries with specified ID"id: String,"Queries with specified key"key: String): StagedQuoteupdateMyQuote(version: Long!, actions: [MyQuoteUpdateAction!]!,"Queries with specified ID"id: String,"Queries with specified key"key: String): QuoteupdateMyQuoteRequest(version: Long!, actions: [MyQuoteRequestUpdateAction!]!,"Queries with specified ID"id: String,"Queries with specified key"key: String): QuoteRequestupdateQuote(version: Long!, actions: [QuoteUpdateAction!]!,"Queries with specified ID"id: String,"Queries with specified key"key: String): QuoteupdateQuoteRequest(version: Long!, actions: [QuoteRequestUpdateAction!]!,"Queries with specified ID"id: String,"Queries with specified key"key: String): QuoteRequestupdateStagedQuote(version: Long!, actions: [StagedQuoteUpdateAction!]!,"Queries with specified ID"id: String,"Queries with specified key"key: String): StagedQuote}input CancelQuoteRequest {dummy: String}input ChangeMyQuoteMyQuoteState {quoteState: MyQuoteState!}input ChangeQuoteRequestState {quoteRequestState: QuoteRequestState!}input ChangeQuoteState {quoteState: MyQuoteState!}input ChangeStagedQuoteState {stagedQuoteState: StagedQuoteState!}input MyQuoteRequestDraft {cartId: String!comment: StringcartVersion: Long!}input MyQuoteRequestUpdateAction {cancelQuoteRequest: CancelQuoteRequestsetCustomField: SetMyQuoteRequestCustomFieldsetCustomType: SetMyQuoteRequestCustomType}enum MyQuoteState {AcceptedDeclinedFailed}input MyQuoteUpdateAction {changeMyQuoteState: ChangeMyQuoteMyQuoteStatesetCustomField: SetQuoteCustomFieldsetCustomType: SetQuoteCustomType}input OrderMyQuoteCommand {id: String!version: Long!}input OrderQuoteCommand {quote: ResourceIdentifierInputversion: Long!paymentState: PaymentStateorderState: OrderStatestate: ReferenceInputshipmentState: ShipmentStateorderNumber: Stringcustom: CustomFieldsDraft}type Quote implements Versioned {customerRef: Referencecustomer: CustomerlineItems("Queries with specified ID"id: String): [LineItem!]!customLineItems: [CustomLineItem!]!totalPrice: Money!taxedPrice: TaxedPriceshippingAddress: AddressbillingAddress: AddressitemShippingAddresses: [Address!]!inventoryMode: InventoryMode!taxMode: TaxMode!taxRoundingMode: RoundingMode!taxCalculationMode: TaxCalculationMode!country: CountryshippingInfo: ShippingInfopaymentInfo: PaymentInfoshippingRateInput: ShippingRateInputstoreRef: KeyReferencestore: Storekey: StringquoteState: QuoteState!stagedQuoteRef: Reference!stagedQuote: StagedQuotequoteRequestRef: Reference!quoteRequest: QuoteRequestvalidTo: DateTimecustom: CustomFieldsTypeid: String!version: Long!createdAt: DateTime!lastModifiedAt: DateTime!createdBy: InitiatorlastModifiedBy: Initiator}input QuoteDraft {key: StringstagedQuote: ResourceIdentifierInputstagedQuoteVersion: Longcustom: CustomFieldsDraft}type QuoteQueryResult {offset: Int!count: Int!total: Long!"BETA: This feature can be subject to change and should be used carefully in production. https://docs.commercetools.com/api/contract#public-beta"exists: Boolean!results: [Quote!]!}type QuoteRequest implements Versioned {customerRef: Referencecustomer: CustomerlineItems("Queries with specified ID"id: String): [LineItem!]!customLineItems: [CustomLineItem!]!totalPrice: Money!taxedPrice: TaxedPriceshippingAddress: AddressbillingAddress: AddressitemShippingAddresses: [Address!]!inventoryMode: InventoryMode!taxMode: TaxMode!taxRoundingMode: RoundingMode!taxCalculationMode: TaxCalculationMode!country: CountryshippingInfo: ShippingInfopaymentInfo: PaymentInfoshippingRateInput: ShippingRateInputstoreRef: KeyReferencestore: Storekey: StringquoteRequestState: QuoteRequestState!comment: Stringcustom: CustomFieldsTypeid: String!version: Long!createdAt: DateTime!lastModifiedAt: DateTime!createdBy: InitiatorlastModifiedBy: Initiator}input QuoteRequestDraft {key: Stringcart: ResourceIdentifierInputcomment: StringcartVersion: Longcustom: CustomFieldsDraft}type QuoteRequestQueryResult {offset: Int!count: Int!total: Long!"BETA: This feature can be subject to change and should be used carefully in production. https://docs.commercetools.com/api/contract#public-beta"exists: Boolean!results: [QuoteRequest!]!}enum QuoteRequestState {ClosedUnderReviewSubmittedCancelledAcceptedRejected}input QuoteRequestUpdateAction {changeQuoteRequestState: ChangeQuoteRequestStatesetCustomField: SetQuoteRequestCustomFieldsetCustomType: SetQuoteRequestCustomType}enum QuoteState {AcceptedDeclinedFailedPendingWithdrawn}input QuoteUpdateAction {changeQuoteState: ChangeQuoteStatesetCustomField: SetQuoteCustomFieldsetCustomType: SetQuoteCustomType}input SetMyQuoteRequestCustomField {name: String!value: String}input SetMyQuoteRequestCustomType {fields: [CustomFieldInput!]type: ResourceIdentifierInputtypeKey: StringtypeId: String}input SetQuoteCustomField {name: String!value: String}input SetQuoteCustomType {fields: [CustomFieldInput!]type: ResourceIdentifierInputtypeKey: StringtypeId: String}input SetQuoteRequestCustomField {name: String!value: String}input SetQuoteRequestCustomType {fields: [CustomFieldInput!]type: ResourceIdentifierInputtypeKey: StringtypeId: String}input SetStagedQuoteCustomField {name: String!value: String}input SetStagedQuoteCustomType {fields: [CustomFieldInput!]type: ResourceIdentifierInputtypeKey: StringtypeId: String}input SetStagedQuoteSellerComment {sellerComment: String}input SetStagedQuoteValidTo {validTo: DateTime}type StagedQuote implements Versioned {key: StringstagedQuoteState: StagedQuoteState!quoteRequestRef: Reference!quoteRequest: QuoteRequestquotationCartRef: Reference!quotationCart: CartcustomerRef: Referencecustomer: CustomervalidTo: DateTimecustom: CustomFieldsTypeid: String!version: Long!createdAt: DateTime!lastModifiedAt: DateTime!createdBy: InitiatorlastModifiedBy: Initiator}input StagedQuoteDraft {key: StringquoteRequest: ResourceIdentifierInputquoteRequestVersion: Longcustom: CustomFieldsDraft}type StagedQuoteQueryResult {offset: Int!count: Int!total: Long!"BETA: This feature can be subject to change and should be used carefully in production. https://docs.commercetools.com/api/contract#public-beta"exists: Boolean!results: [StagedQuote!]!}enum StagedQuoteState {ClosedInProgressSent}input StagedQuoteUpdateAction {changeStagedQuoteState: ChangeStagedQuoteStatesetSellerComment: SetStagedQuoteSellerCommentsetCustomField: SetStagedQuoteCustomFieldsetCustomType: SetStagedQuoteCustomTypesetValidTo: SetStagedQuoteValidTo}