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 carritoprices.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
- El usuario introduce un código de cupón
- Se llama a
applyCouponcon el código - Si el cupón es válido, se actualiza el carrito con los descuentos aplicados
- 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.