Category

Other

Version

0.0.1

Last updated

Jan 15, 2024, 04:00:10 AMa year ago

Installation

Install npm package with Copy to clipboardyarn add medusa-plugin-promotion or Copy to clipboardnpm i medusa-plugin-promotion
Peer dependencies are Copy to clipboard@medusajs/medusa Copy to clipboardmedusa-interfaces Copy to clipboardtypeorm

Application apply

In folder Copy to clipboardsrc/subscribers create file Copy to clipboardpromotions-handler.ts to subscribe event Copy to clipboardCREATED,Copy to clipboardUPDATED, of cart

Step 1

Add Copy to clipboardInjectionDepen interface
// src/subscribers/promotions-handler.ts
interface InjectionDepen {
//...
// Add more
eventBusService: EventBusService
promotionService: PromotionService
cartService: CartService
orderService: OrderService
cartRepository: typeof CartRepository
manager: EntityManager
}

Step 2

Create class Copy to clipboardPromotionHandler and add property
class PromotionsHandler extends TransactionBaseService {
protected manager_: EntityManager
protected transactionManager_: EntityManager
cartService: CartService
eventBusService: EventBusService
promotionService: PromotionService
orderService: OrderService
cartRepository: typeof CartRepository
constructor({
manager,
eventBusService,
promotionService,
cartService,
orderService,
cartRepository,
}: InjectionDepen) {
super(arguments[0])
this.cartService = cartService
this.eventBusService = eventBusService
this.promotionService = promotionService
this.orderService = orderService
this.cartRepository = cartRepository
this.manager_ = manager
eventBusService.subscribe(CartService.Events.CREATED, async (data: Cart) => {
//Add logic handle apply promotion here
//You can call property of promotion service and use it here
//Example like : await this.promotionService.applyPromotions(cart, listPromotionAuto)
})
eventBusService.subscribe(CartService.Events.UPDATED, async (data: Cart) => {
//Add logic handle apply promotion here
//You can call property of promotion service and use it here
//Example like : await this.promotionService.applyPromotions(cart, listPromotionAuto)
})
}
}
export default PromotionsHandler

Promotion method

export class PromotionService extends TransactionBaseService {
//Create promotion
async create(data: PromotionCreateValidator) {}
//Update promotion
async update(data: PromotionUpdateValidator) {}
//Delete promotion
async delete(data: PromotionDeleteValidator) {}
//add action of promotion
async addAction(data: AddPromotionActionValidator) {}
//update action of promotion
async updateAction(data: UpdatePromotionActionValidator) {}
//delete action of promotion
async deleteAction(data: DeletePromotionActionValidator) {}
//add condition of promotion
async addCondition(data: DeletePromotionActionValidator) {}
//update condition of promotion
async updateCondition(data: UpdatePromotionConditionValidator) {}
//delete condition of promotion
async deleteCondition(data: DeletePromotionConditionValidator) {}
//set resource promotion condition
async setResource(data: SetPromotionConditionResource) {}
//resolve resource promotion condition
async resolveResource(resourceName: string, resourceId: string) {}
//retrieve promotion
async retrieve(id: string, relations: string[] = []) {}
//get list promotion of cart
async listPromotionForCart(cart: Cart) {}
//get list promotion
async list(query: ListPromotionQuery | ListPromotionQuery[]) {}
//Validate usage limit condition
hasReachedLimit(promotion: Promotion): boolean {}
//Validate start time of promotion
hasNotStarted(promotion: Promotion): boolean {}
//Validate expired of promotion
hasExpired(promotion: Promotion): boolean {}
//Validate region condition of promotion
async isValidForRegion(promotion: Promotion, region_id: string): Promise<boolean> {}
//Validate promotion is enable or disable
isDisabled(promotion: Promotion): boolean {}
//Validate promotion with setting condition
async isValidForCard(cart: Cart, promotion: Promotion): Promise<boolean> {}
//Remove all adjustment created by promotion of cart
async resetAdjustmentOfPromotionUsed(cart: Cart) {}
//Apply promotion for cart
async applyPromotions(cart: Cart, promotions: Promotion[]) {}
}

Build your own plugins

Develop your own plugins with our API to speed up your processes.

Make your plugin available via npm for it to be shared in our Plugin Library with the broader Medusa community.