0.0.1 • Published 4 months ago

@kvytech/medusa-plugin-promotion v0.0.1

Weekly downloads
-
License
MIT
Repository
github
Last release
4 months ago

Installation

Install npm package with yarn add medusa-plugin-promotion or npm i medusa-plugin-promotion

Peer dependencies are @medusajs/medusa medusa-interfaces typeorm

Application apply

In folder src/subscribers create file promotions-handler.ts to subscribe event CREATED,UPDATED, of cart

Step 1

Add InjectionDepen 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 PromotionHandler 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[]) {}

}