Saltar al contenido principal

Promociones en el Carrito

Las promociones en el carrito permiten aplicar descuentos a través de cupones y otras reglas promocionales.

Estructura de datos principal

Las promociones se reflejan en el objeto Cart a través de:

  • applied_coupons: Cupones aplicados al carrito
  • prices.discounts: Descuentos aplicados, incluyendo importe y etiqueta
  • Propiedades específicas en los items del carrito para descuentos por producto

Métodos principales

Gestión de cupones

// Aplicar cupón al carrito
applyCoupon: (couponCode: string) => Promise<Cart|null>

// Eliminar cupón del carrito
removeCoupon: () => Promise<Cart|null>

Implementación

Los métodos para gestionar promociones están implementados en magento-service-provider.ts:

export const applyCoupon = async (cartId: string, coupon: string): Promise<Cart|null>=> {
const response = await request({
query: QuoteApplyCouponToCartDocument,
variables: {
cartId,
coupon
}
}) as QuoteApplyCouponToCartMutation
return response?.applyCouponToCart?.cart as Cart|null
}

export const removeCoupon = async (cartId: string): Promise<Cart|null>=> {
const response = await request({
query: QuoteRemoveCouponFromCartDocument,
variables: {
cartId,
}
}) as QuoteRemoveCouponFromCartMutation
return response?.removeCouponFromCart?.cart as Cart|null
}

Flujo de uso de promociones

  1. El usuario introduce un código de cupón
  2. Se llama a applyCoupon con el código
  3. Si el cupón es válido, se actualiza el carrito con los descuentos aplicados
  4. El usuario puede eliminar el cupón con removeCoupon

Cashback como promoción especial

El sistema incluye una promoción especial de cashback para productos:

export interface CartItemMetadata {
has_cashback: boolean
additional_services: {code: string, cost: number|string}[]
isArmed: boolean
}

Cuando un producto tiene has_cashback: true, se puede obtener el importe del cashback:

// Obtener importe de cashback actual
getCurrentCashbackAmount: () => number

Implementación en magento-order-container.tsx:

const getCurrentCashbackAmount = () => {
const items = (quote as Cart)?.items ?? []
return items.reduce((cashbackAmount, item) => {
if (item?.has_cashback) {
return cashbackAmount + (item?.additional_services ?? []).find(service => service.code === 'cashback')?.totalPrice ?? 0
}
return cashbackAmount
}, 0)
}

Uso en componentes

import useMagentoOrderContainer from "src/magento/hooks/use-magento-order-container";

const PromoCodeComponent = () => {
const {
quote,
applyCoupon,
removeCoupon,
getCurrentCashbackAmount
} = useMagentoOrderContainer();

// Implementación de la gestión de cupones y promociones
// ...
}

Descuentos a nivel de producto

Además de los cupones aplicados al carrito completo, los productos pueden tener descuentos específicos que aparecen en:

// En cada item del carrito
item.prices.discounts

Estos descuentos pueden provenir de reglas de precios de catálogo, reglas de precios de carrito o promociones especiales configuradas en Magento.