Shop-scoped threshold rules with bilingual names, integer threshold/reduction (reduction < threshold), active windows and display order. Checkout applies the best eligible rule per shop with currency conversion; coupon/threshold/activity pricing are mutually exclusive per shop order. Reduction persists in orders.discount_minor + threshold_promotion_id and flows into payment totals; checkout idempotency covers the threshold selection. Delete archives referenced rules, hard-deletes unreferenced ones. - migration 0026: threshold_promotions + orders.threshold_promotion_id + coupon/threshold exclusivity CHECK - api: modules/promotion (CRUD, preview, checkout integration) - shared: ThresholdPromotion types, shop CRUD + preview client methods, checkout threshold_by_shop - shop-admin: promotions page + nav + en/zh locales - mall: exclusive promotion radio on checkout, live preview wiring, threshold label on order detail - tests: promotions.rs (scoping, validation, best-rule, exclusivity, activity-priced 409, totals, replay, archive-vs-delete) - openspec: archived 2026-10-19-add-threshold-promotions; spec threshold-promotions created, order/frontend specs updated
1.3 KiB
1.3 KiB
Index: Marketing (coupons, threshold promotions, flash sales, group buying, points)
Domain design: docs/domains/marketing.md. Specs: openspec/specs/shop-coupons/,
threshold-promotions/, flash-sales/, group-buying/, points-mall/.
Backend (apps/api)
| Module | Holds |
|---|---|
modules/coupon/ |
template CRUD, claim, checkout discount + redemption |
modules/promotion/ |
threshold rule CRUD (archive-vs-delete), best-eligible evaluation, checkout reduction, cart preview |
modules/flash_sale/ |
sessions/items CRUD, activity price resolution, reserved stock |
modules/group_buying/ |
activities, groups, seat claim at payment |
modules/points/ |
points catalog, redemption, fulfillment |
Migrations: 0011_shop_coupons.sql, 0012_points_mall.sql,
0013_flash_sales.sql, 0014_group_buying.sql, 0026_threshold_promotions.sql.
Tests: tests/coupons.rs, tests/promotions.rs, tests/flash_sales.rs,
tests/group_buying.rs, tests/points.rs.
Frontends
- Mall:
pages/seckill.vue,pages/collective.vue,pages/integral.vue,pages/user/coupons.vue; exclusive coupon/threshold radio inpages/checkout/index.vue - Shop-admin:
pages/coupons.vue,pages/promotions.vue,pages/flash-sales.vue,pages/group-buying.vue - Admin:
pages/points-products.vue,pages/points-orders.vue