import { AddPaymentToOrderResult, ApplyCouponCodeResult, PaymentInput, PaymentMethodQuote, RemoveOrderItemsResult, SetOrderShippingMethodResult, UpdateOrderItemsResult } from '@vendure/common/lib/generated-shop-types'; import { AddFulfillmentToOrderResult, AddManualPaymentToOrderResult, AddNoteToOrderInput, CancelOrderInput, CancelOrderResult, CancelPaymentResult, CreateAddressInput, DeletionResponse, FulfillOrderInput, ManualPaymentInput, ModifyOrderInput, ModifyOrderResult, OrderListOptions, OrderProcessState, RefundOrderInput, RefundOrderResult, SetOrderCustomerInput, SettlePaymentResult, SettleRefundInput, ShippingMethodQuote, TransitionPaymentToStateResult, UpdateOrderNoteInput } from '@vendure/common/lib/generated-types'; import { ID, PaginatedList } from '@vendure/common/lib/shared-types'; import { RequestContext } from '../../api/common/request-context'; import { RelationPaths } from '../../api/decorators/relations.decorator'; import { RequestContextCacheService } from '../../cache/request-context-cache.service'; import { ErrorResultUnion, JustErrorResults } from '../../common/error/error-result'; import { FulfillmentStateTransitionError, RefundStateTransitionError } from '../../common/error/generated-graphql-admin-errors'; import { OrderStateTransitionError } from '../../common/error/generated-graphql-shop-errors'; import { ListQueryOptions } from '../../common/types/common-types'; import { ConfigService } from '../../config/config.service'; import { TransactionalConnection } from '../../connection/transactional-connection'; import { Channel } from '../../entity/channel/channel.entity'; import { Customer } from '../../entity/customer/customer.entity'; import { Fulfillment } from '../../entity/fulfillment/fulfillment.entity'; import { HistoryEntry } from '../../entity/history-entry/history-entry.entity'; import { OrderLine } from '../../entity/order-line/order-line.entity'; import { OrderModification } from '../../entity/order-modification/order-modification.entity'; import { Order } from '../../entity/order/order.entity'; import { Payment } from '../../entity/payment/payment.entity'; import { Promotion } from '../../entity/promotion/promotion.entity'; import { Refund } from '../../entity/refund/refund.entity'; import { Surcharge } from '../../entity/surcharge/surcharge.entity'; import { User } from '../../entity/user/user.entity'; import { EventBus } from '../../event-bus/event-bus'; import { CustomFieldRelationService } from '../helpers/custom-field-relation/custom-field-relation.service'; import { FulfillmentState } from '../helpers/fulfillment-state-machine/fulfillment-state'; import { ListQueryBuilder } from '../helpers/list-query-builder/list-query-builder'; import { OrderCalculator } from '../helpers/order-calculator/order-calculator'; import { OrderMerger } from '../helpers/order-merger/order-merger'; import { OrderModifier } from '../helpers/order-modifier/order-modifier'; import { OrderState } from '../helpers/order-state-machine/order-state'; import { OrderStateMachine } from '../helpers/order-state-machine/order-state-machine'; import { PaymentState } from '../helpers/payment-state-machine/payment-state'; import { RefundState } from '../helpers/refund-state-machine/refund-state'; import { RefundStateMachine } from '../helpers/refund-state-machine/refund-state-machine'; import { ShippingCalculator } from '../helpers/shipping-calculator/shipping-calculator'; import { TranslatorService } from '../helpers/translator/translator.service'; import { ChannelService } from './channel.service'; import { CountryService } from './country.service'; import { CustomerService } from './customer.service'; import { FulfillmentService } from './fulfillment.service'; import { HistoryService } from './history.service'; import { PaymentMethodService } from './payment-method.service'; import { PaymentService } from './payment.service'; import { ProductVariantService } from './product-variant.service'; import { PromotionService } from './promotion.service'; import { StockLevelService } from './stock-level.service'; /** * @description * Contains methods relating to {@link Order} entities. * * @docsCategory services */ export declare class OrderService { private connection; private configService; private productVariantService; private customerService; private countryService; private orderCalculator; private shippingCalculator; private orderStateMachine; private orderMerger; private paymentService; private paymentMethodService; private fulfillmentService; private listQueryBuilder; private refundStateMachine; private historyService; private promotionService; private eventBus; private channelService; private orderModifier; private customFieldRelationService; private requestCache; private translator; private stockLevelService; constructor(connection: TransactionalConnection, configService: ConfigService, productVariantService: ProductVariantService, customerService: CustomerService, countryService: CountryService, orderCalculator: OrderCalculator, shippingCalculator: ShippingCalculator, orderStateMachine: OrderStateMachine, orderMerger: OrderMerger, paymentService: PaymentService, paymentMethodService: PaymentMethodService, fulfillmentService: FulfillmentService, listQueryBuilder: ListQueryBuilder, refundStateMachine: RefundStateMachine, historyService: HistoryService, promotionService: PromotionService, eventBus: EventBus, channelService: ChannelService, orderModifier: OrderModifier, customFieldRelationService: CustomFieldRelationService, requestCache: RequestContextCacheService, translator: TranslatorService, stockLevelService: StockLevelService); /** * @description * Returns an array of all the configured states and transitions of the order process. This is * based on the default order process plus all configured {@link OrderProcess} objects * defined in the {@link OrderOptions} `process` array. */ getOrderProcessStates(): OrderProcessState[]; findAll(ctx: RequestContext, options?: OrderListOptions, relations?: RelationPaths): Promise>; findOne(ctx: RequestContext, orderId: ID, relations?: RelationPaths): Promise; findOneByCode(ctx: RequestContext, orderCode: string, relations?: RelationPaths): Promise; findOneByOrderLineId(ctx: RequestContext, orderLineId: ID, relations?: RelationPaths): Promise; findByCustomerId(ctx: RequestContext, customerId: ID, options?: ListQueryOptions, relations?: RelationPaths): Promise>; /** * @description * Returns all {@link Payment} entities associated with the Order. */ getOrderPayments(ctx: RequestContext, orderId: ID): Promise; /** * @description * Returns an array of any {@link OrderModification} entities associated with the Order. */ getOrderModifications(ctx: RequestContext, orderId: ID): Promise; /** * @description * Returns any {@link Refund}s associated with a {@link Payment}. */ getPaymentRefunds(ctx: RequestContext, paymentId: ID): Promise; getSellerOrders(ctx: RequestContext, order: Order): Promise; getAggregateOrder(ctx: RequestContext, order: Order): Promise; getOrderChannels(ctx: RequestContext, order: Order): Promise; /** * @description * Returns any Order associated with the specified User's Customer account * that is still in the `active` state. */ getActiveOrderForUser(ctx: RequestContext, userId: ID): Promise; /** * @description * Creates a new, empty Order. If a `userId` is passed, the Order will get associated with that * User's Customer account. */ create(ctx: RequestContext, userId?: ID): Promise; createDraft(ctx: RequestContext): Promise; private createEmptyOrderEntity; /** * @description * Updates the custom fields of an Order. */ updateCustomFields(ctx: RequestContext, orderId: ID, customFields: any): Promise; /** * @description * Updates the Customer which is assigned to a given Order. The target Customer must be assigned to the same * Channels as the Order, otherwise an error will be thrown. * * @since 2.2.0 */ updateOrderCustomer(ctx: RequestContext, { customerId, orderId, note }: SetOrderCustomerInput): Promise; /** * @description * Adds an item to the Order, either creating a new OrderLine or * incrementing an existing one. * * If you need to add multiple items to an Order, use `addItemsToOrder()` instead. */ addItemToOrder(ctx: RequestContext, orderId: ID, productVariantId: ID, quantity: number, customFields?: { [key: string]: any; }, relations?: RelationPaths): Promise>; /** * @description * Adds multiple items to an Order. This method is more efficient than calling `addItemToOrder` * multiple times, as it only needs to fetch the entire Order once, and only performs * price adjustments once at the end. * * Since this method can return multiple error results, it is recommended to check the `errorResults` * array to determine if any errors occurred. * * @since 3.1.0 */ addItemsToOrder(ctx: RequestContext, orderId: ID, items: Array<{ productVariantId: ID; quantity: number; customFields?: { [key: string]: any; }; }>, relations?: RelationPaths): Promise<{ order: Order; errorResults: Array>; }>; /** * @description * Adjusts the quantity and/or custom field values of an existing OrderLine. * * If you need to adjust multiple OrderLines, use `adjustOrderLines()` instead. */ adjustOrderLine(ctx: RequestContext, orderId: ID, orderLineId: ID, quantity: number, customFields?: { [key: string]: any; }, relations?: RelationPaths): Promise>; /** * @description * Adjusts the quantity and/or custom field values of existing OrderLines. * This method is more efficient than calling `adjustOrderLine` multiple times, as it only needs to fetch * the entire Order once, and only performs price adjustments once at the end. * Since this method can return multiple error results, it is recommended to check the `errorResults` * array to determine if any errors occurred. * * @since 3.1.0 */ adjustOrderLines(ctx: RequestContext, orderId: ID, lines: Array<{ orderLineId: ID; quantity: number; customFields?: { [key: string]: any; }; }>, relations?: RelationPaths): Promise<{ order: Order; errorResults: Array>; }>; /** * @description * Removes the specified OrderLine from the Order. * * If you need to remove multiple OrderLines, use `removeItemsFromOrder()` instead. */ removeItemFromOrder(ctx: RequestContext, orderId: ID, orderLineId: ID): Promise>; /** * @description * Removes the specified OrderLines from the Order. * This method is more efficient than calling `removeItemFromOrder` multiple times, as it only needs to fetch * the entire Order once, and only performs price adjustments once at the end. * * @since 3.1.0 */ removeItemsFromOrder(ctx: RequestContext, orderId: ID, orderLineIds: ID[]): Promise>; /** * @description * Removes all OrderLines from the Order. */ removeAllItemsFromOrder(ctx: RequestContext, orderId: ID): Promise>; /** * @description * Adds a {@link Surcharge} to the Order. */ addSurchargeToOrder(ctx: RequestContext, orderId: ID, surchargeInput: Partial>): Promise; /** * @description * Removes a {@link Surcharge} from the Order. */ removeSurchargeFromOrder(ctx: RequestContext, orderId: ID, surchargeId: ID): Promise; /** * @description * Applies a coupon code to the Order, which should be a valid coupon code as specified in the configuration * of an active {@link Promotion}. */ applyCouponCode(ctx: RequestContext, orderId: ID, couponCode: string): Promise>; /** * @description * Removes a coupon code from the Order. */ removeCouponCode(ctx: RequestContext, orderId: ID, couponCode: string): Promise; /** * @description * Returns all {@link Promotion}s associated with an Order. */ getOrderPromotions(ctx: RequestContext, orderId: ID): Promise; /** * @description * Returns the next possible states that the Order may transition to. */ getNextOrderStates(order: Order): readonly OrderState[]; /** * @description * Sets the shipping address for the Order. */ setShippingAddress(ctx: RequestContext, orderId: ID, input: CreateAddressInput): Promise; /** * @description * Sets the billing address for the Order. */ setBillingAddress(ctx: RequestContext, orderId: ID, input: CreateAddressInput): Promise; /** * @description * Unsets the shipping address for the Order. * * @since 3.1.0 */ unsetShippingAddress(ctx: RequestContext, orderId: ID): Promise; /** * @description * Unsets the billing address for the Order. * * @since 3.1.0 */ unsetBillingAddress(ctx: RequestContext, orderId: ID): Promise; /** * @description * Returns an array of quotes stating which {@link ShippingMethod}s may be applied to this Order. * This is determined by the configured {@link ShippingEligibilityChecker} of each ShippingMethod. * * The quote also includes a price for each method, as determined by the configured * {@link ShippingCalculator} of each eligible ShippingMethod. */ getEligibleShippingMethods(ctx: RequestContext, orderId: ID): Promise; /** * @description * Returns an array of quotes stating which {@link PaymentMethod}s may be used on this Order. */ getEligiblePaymentMethods(ctx: RequestContext, orderId: ID): Promise; /** * @description * Sets the ShippingMethod to be used on this Order. */ setShippingMethod(ctx: RequestContext, orderId: ID, shippingMethodIds: ID[]): Promise>; /** * @description * Transitions the Order to the given state. */ transitionToState(ctx: RequestContext, orderId: ID, state: OrderState): Promise; /** * @description * Transitions a Fulfillment to the given state and then transitions the Order state based on * whether all Fulfillments of the Order are shipped or delivered. */ transitionFulfillmentToState(ctx: RequestContext, fulfillmentId: ID, state: FulfillmentState): Promise; /** * @description * Transitions a Refund to the given state */ transitionRefundToState(ctx: RequestContext, refundId: ID, state: RefundState, transactionId?: string): Promise; /** * @description * Allows the Order to be modified, which allows several aspects of the Order to be changed: * * * Changes to OrderLine quantities * * New OrderLines being added * * Arbitrary {@link Surcharge}s being added * * Shipping or billing address changes * * Setting the `dryRun` input property to `true` will apply all changes, including updating the price of the * Order, except history entry and additional payment actions. * * __Using dryRun option, you must wrap function call in transaction manually.__ * */ modifyOrder(ctx: RequestContext, input: ModifyOrderInput): Promise>; /** * @description * Transitions the given {@link Payment} to a new state. */ transitionPaymentToState(ctx: RequestContext, paymentId: ID, state: PaymentState): Promise>; /** * @description * Adds a new Payment to the Order. If the Order totalWithTax is covered by Payments, then the Order * state will get automatically transitioned to the `PaymentSettled` or `PaymentAuthorized` state. */ addPaymentToOrder(ctx: RequestContext, orderId: ID, input: PaymentInput): Promise>; /** * @description * We can add a Payment to the order if: * 1. the Order is in the `ArrangingPayment` state or * 2. the Order's current state can transition to `PaymentAuthorized` and `PaymentSettled` */ private canAddPaymentToOrder; /** * @description * This method is used after modifying an existing completed order using the `modifyOrder()` method. If the modifications * cause the order total to increase (such as when adding a new OrderLine), then there will be an outstanding charge to * pay. * * This method allows you to add a new Payment and assumes the actual processing has been done manually, e.g. in the * dashboard of your payment provider. */ addManualPaymentToOrder(ctx: RequestContext, input: ManualPaymentInput): Promise>; /** * @description * Settles a payment by invoking the {@link PaymentMethodHandler}'s `settlePayment()` method. Automatically * transitions the Order state if all Payments are settled. */ settlePayment(ctx: RequestContext, paymentId: ID): Promise>; /** * @description * Cancels a payment by invoking the {@link PaymentMethodHandler}'s `cancelPayment()` method (if defined), and transitions the Payment to * the `Cancelled` state. */ cancelPayment(ctx: RequestContext, paymentId: ID): Promise>; /** * @description * Creates a new Fulfillment associated with the given Order and OrderItems. */ createFulfillment(ctx: RequestContext, input: FulfillOrderInput): Promise>; private requestedFulfillmentQuantityExceedsLineQuantity; private ensureSufficientStockForFulfillment; /** * @description * Returns an array of all Fulfillments associated with the Order. */ getOrderFulfillments(ctx: RequestContext, order: Order): Promise; /** * @description * Returns an array of all Surcharges associated with the Order. */ getOrderSurcharges(ctx: RequestContext, orderId: ID): Promise; /** * @description * Cancels an Order by transitioning it to the `Cancelled` state. If stock is being tracked for the ProductVariants * in the Order, then new {@link StockMovement}s will be created to correct the stock levels. */ cancelOrder(ctx: RequestContext, input: CancelOrderInput): Promise>; private cancelOrderById; /** * @description * Creates a {@link Refund} against the order and in doing so invokes the `createRefund()` method of the * {@link PaymentMethodHandler}. */ refundOrder(ctx: RequestContext, input: RefundOrderInput): Promise>; /** * @description * Settles a Refund by transitioning it to the `Settled` state. */ settleRefund(ctx: RequestContext, input: SettleRefundInput): Promise; /** * @description * Associates a Customer with the Order. */ addCustomerToOrder(ctx: RequestContext, orderIdOrOrder: ID | Order, customer: Customer): Promise; /** * @description * Creates a new "ORDER_NOTE" type {@link OrderHistoryEntry} in the Order's history timeline. */ addNoteToOrder(ctx: RequestContext, input: AddNoteToOrderInput): Promise; updateOrderNote(ctx: RequestContext, input: UpdateOrderNoteInput): Promise; deleteOrderNote(ctx: RequestContext, id: ID): Promise; /** * @description * Deletes an Order, ensuring that any Sessions that reference this Order are dereferenced before deletion. * * @since 1.5.0 */ deleteOrder(ctx: RequestContext, orderOrId: ID | Order): Promise; /** * @description * When a guest user with an anonymous Order signs in and has an existing Order associated with that Customer, * we need to reconcile the contents of the two orders. * * The logic used to do the merging is specified in the {@link OrderOptions} `mergeStrategy` config setting. */ mergeOrders(ctx: RequestContext, user: User, guestOrder?: Order, existingOrder?: Order): Promise; private getOrderOrThrow; private getOrderLineOrThrow; /** * Returns error if quantity is negative. */ private assertQuantityIsPositive; /** * Returns error if the Order is not in the "AddingItems" or "Draft" state. */ private assertAddingItemsState; /** * Throws if adding the given quantity would take the total order items over the * maximum limit specified in the config. */ private assertNotOverOrderItemsLimit; /** * Throws if adding the given quantity would exceed the maximum allowed * quantity for one order line. */ private assertNotOverOrderLineItemsLimit; /** * @description * Applies promotions, taxes and shipping to the Order. If the `updatedOrderLines` argument is passed in, * then all of those OrderLines will have their prices re-calculated using the configured {@link OrderItemPriceCalculationStrategy}. */ applyPriceAdjustments(ctx: RequestContext, order: Order, updatedOrderLines?: OrderLine[], relations?: RelationPaths): Promise; /** * Applies changes to the shipping lines of an order, adding or removing the relations * in the database. */ private applyChangesToShippingLines; }