@mohasinac/appkit 4.1.1 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (225) hide show
  1. package/dist/_internal/client/features/maintenance/index.d.ts +2 -0
  2. package/dist/_internal/client/features/maintenance/index.js +1 -0
  3. package/dist/_internal/client/features/maintenance/views/CloudLogsListView.d.ts +9 -0
  4. package/dist/_internal/client/features/maintenance/views/CloudLogsListView.js +55 -0
  5. package/dist/_internal/server/features/auctions/index.d.ts +1 -1
  6. package/dist/_internal/server/features/auctions/index.js +1 -1
  7. package/dist/_internal/server/features/auctions/service.js +2 -2
  8. package/dist/_internal/server/features/checkout/actions.d.ts +15 -0
  9. package/dist/_internal/server/features/checkout/actions.js +245 -182
  10. package/dist/_internal/server/features/maintenance/cloud-logs-data.d.ts +50 -0
  11. package/dist/_internal/server/features/maintenance/cloud-logs-data.js +152 -0
  12. package/dist/_internal/server/functions/scheduled.d.ts +2 -1
  13. package/dist/_internal/server/functions/scheduled.js +9 -1
  14. package/dist/_internal/server/jobs/core/jobRunners.js +10 -0
  15. package/dist/_internal/server/jobs/core/newsletterExport.d.ts +15 -0
  16. package/dist/_internal/server/jobs/core/newsletterExport.js +43 -0
  17. package/dist/_internal/server/jobs/core/onOrderCreate.d.ts +4 -12
  18. package/dist/_internal/server/jobs/core/onOrderCreate.js +3 -3
  19. package/dist/_internal/server/jobs/core/onOrderStatusChange.d.ts +2 -0
  20. package/dist/_internal/server/jobs/core/onOrderStatusChange.js +1 -0
  21. package/dist/_internal/server/jobs/core/onProductWrite.js +14 -2
  22. package/dist/_internal/server/jobs/core/paymentWindowTimeout.js +1 -0
  23. package/dist/_internal/server/jobs/core/pendingOrderTimeout.js +1 -0
  24. package/dist/_internal/server/jobs/core/revenueRollup.d.ts +13 -0
  25. package/dist/_internal/server/jobs/core/revenueRollup.js +22 -0
  26. package/dist/_internal/server/jobs/core/whatsappNotify.d.ts +35 -0
  27. package/dist/_internal/server/jobs/core/whatsappNotify.js +82 -0
  28. package/dist/_internal/server/jobs/handlers/index.d.ts +1 -0
  29. package/dist/_internal/server/jobs/handlers/index.js +1 -0
  30. package/dist/_internal/server/jobs/handlers/revenueRollup.d.ts +2 -0
  31. package/dist/_internal/server/jobs/handlers/revenueRollup.js +2 -0
  32. package/dist/_internal/shared/features/auctions/config.d.ts +1 -1
  33. package/dist/_internal/shared/features/auctions/config.js +1 -1
  34. package/dist/_internal/shared/features/auctions/schema.js +1 -1
  35. package/dist/_internal/shared/features/cart/schema.js +2 -2
  36. package/dist/_internal/shared/features/checkout/config.d.ts +7 -0
  37. package/dist/_internal/shared/features/checkout/config.js +7 -0
  38. package/dist/_internal/shared/features/events/schema.js +1 -1
  39. package/dist/_internal/shared/features/orders/schema.js +1 -1
  40. package/dist/_internal/shared/features/products/schema.js +3 -3
  41. package/dist/_internal/shared/features/promotions/schema.js +3 -3
  42. package/dist/_internal/shared/fees/calculator.d.ts +32 -7
  43. package/dist/_internal/shared/fees/calculator.js +25 -0
  44. package/dist/client.d.ts +4 -4
  45. package/dist/client.js +4 -2
  46. package/dist/constants/api-endpoints.d.ts +9 -6
  47. package/dist/constants/api-endpoints.js +3 -2
  48. package/dist/contracts/client-payment-gateway.d.ts +1 -2
  49. package/dist/features/about/components/AboutView.d.ts +6 -16
  50. package/dist/features/about/components/AboutView.js +3 -3
  51. package/dist/features/about/components/FeesView.js +18 -0
  52. package/dist/features/about/index.d.ts +2 -1
  53. package/dist/features/about/schemas/firestore.d.ts +47 -0
  54. package/dist/features/about/schemas/firestore.js +6 -0
  55. package/dist/features/about/schemas/index.d.ts +210 -0
  56. package/dist/features/about/schemas/index.js +45 -0
  57. package/dist/features/account/hooks/useProfile.js +3 -0
  58. package/dist/features/admin/actions/notification-actions.d.ts +4 -1
  59. package/dist/features/admin/actions/notification-actions.js +56 -10
  60. package/dist/features/admin/components/AdminAdsView.js +1 -1
  61. package/dist/features/admin/components/AdminCarouselGroupEditorView.d.ts +6 -0
  62. package/dist/features/admin/components/AdminCarouselGroupEditorView.js +50 -0
  63. package/dist/features/admin/components/AdminCartsView.js +16 -3
  64. package/dist/features/admin/components/AdminCouponEditorView.js +2 -2
  65. package/dist/features/admin/components/AdminCouponsView.js +14 -4
  66. package/dist/features/admin/components/AdminEmployeeEditorView.js +1 -42
  67. package/dist/features/admin/components/AdminMediaView.js +1 -1
  68. package/dist/features/admin/components/AdminNewsletterView.js +42 -11
  69. package/dist/features/admin/components/AdminNotificationsView.js +31 -19
  70. package/dist/features/admin/components/AdminOrdersView.js +7 -0
  71. package/dist/features/admin/components/AdminPayoutsView.js +18 -3
  72. package/dist/features/admin/components/AdminProductsView.js +17 -2
  73. package/dist/features/admin/components/AdminReviewsView.js +16 -2
  74. package/dist/features/admin/components/AdminScammersView.js +7 -0
  75. package/dist/features/admin/components/AdminSectionsView.js +4 -0
  76. package/dist/features/admin/components/AdminSiteConfigGuideView.js +1 -1
  77. package/dist/features/admin/components/AdminSiteSettingsView.js +127 -8
  78. package/dist/features/admin/components/AdminStoreEditorView.d.ts +2 -1
  79. package/dist/features/admin/components/AdminStoreEditorView.js +4 -4
  80. package/dist/features/admin/components/AdminStoresView.js +1 -1
  81. package/dist/features/admin/components/AdminSupportTicketDetailView.js +23 -5
  82. package/dist/features/admin/components/AdminSupportTicketsView.js +20 -2
  83. package/dist/features/admin/components/AdminTesterChecklistItemEditorView.js +4 -1
  84. package/dist/features/admin/components/AdminTesterChecklistView.js +8 -0
  85. package/dist/features/admin/components/index.d.ts +2 -0
  86. package/dist/features/admin/components/index.js +1 -0
  87. package/dist/features/admin/constants/filter-tabs.d.ts +55 -41
  88. package/dist/features/admin/constants/filter-tabs.js +55 -27
  89. package/dist/features/admin/repository/analytics-rollup.repository.d.ts +25 -0
  90. package/dist/features/admin/repository/analytics-rollup.repository.js +31 -0
  91. package/dist/features/admin/repository/site-settings.repository.js +8 -1
  92. package/dist/features/admin/schemas/firestore.d.ts +46 -0
  93. package/dist/features/admin/schemas/firestore.js +62 -24
  94. package/dist/features/auctions/actions/bid-actions.js +1 -1
  95. package/dist/features/auctions/components/AuctionDetailPageView.js +2 -2
  96. package/dist/features/auctions/components/AuctionsListView.js +8 -1
  97. package/dist/features/auth/components/LoginForm.js +2 -2
  98. package/dist/features/auth/components/RegisterForm.js +2 -2
  99. package/dist/features/auth/permissions/constants.d.ts +16 -0
  100. package/dist/features/auth/permissions/constants.js +53 -0
  101. package/dist/features/auth/schemas/firestore.js +1 -0
  102. package/dist/features/blog/components/BlogFilters.js +1 -1
  103. package/dist/features/cart/schemas/firestore.d.ts +1 -1
  104. package/dist/features/categories/schemas/firestore.d.ts +1 -1
  105. package/dist/features/consultation/components/ConsultationForm.js +1 -1
  106. package/dist/features/events/components/EventFilters.js +2 -0
  107. package/dist/features/homepage/components/WelcomeSection.js +2 -2
  108. package/dist/features/layout/BackToTop.d.ts +9 -5
  109. package/dist/features/layout/BackToTop.js +17 -21
  110. package/dist/features/layout/TitleBarLayout.d.ts +2 -2
  111. package/dist/features/layout/TitleBarLayout.js +4 -4
  112. package/dist/features/media/AvatarUpload.js +7 -3
  113. package/dist/features/media/MediaVideo.js +1 -1
  114. package/dist/features/media/finalize.d.ts +9 -13
  115. package/dist/features/media/finalize.js +23 -74
  116. package/dist/features/media/server.d.ts +1 -1
  117. package/dist/features/media/server.js +1 -1
  118. package/dist/features/orders/actions/refund-actions.js +1 -0
  119. package/dist/features/orders/hooks/useOrders.js +16 -4
  120. package/dist/features/orders/schemas/firestore.d.ts +19 -5
  121. package/dist/features/payments/schemas/firestore.d.ts +2 -2
  122. package/dist/features/pre-orders/components/PreOrdersListView.js +7 -0
  123. package/dist/features/products/components/ArtStickersListView.js +5 -0
  124. package/dist/features/products/components/ProductDetailPageView.d.ts +7 -1
  125. package/dist/features/products/components/ProductForm.js +14 -1
  126. package/dist/features/products/components/ProductsIndexPageView.js +7 -0
  127. package/dist/features/products/constants/action-defs.d.ts +29 -3
  128. package/dist/features/products/constants/action-defs.js +77 -1
  129. package/dist/features/products/schemas/firestore.d.ts +1 -1
  130. package/dist/features/products/schemas/product-templates.d.ts +1 -1
  131. package/dist/features/products/types/index.d.ts +4 -0
  132. package/dist/features/scams/schemas/index.js +2 -2
  133. package/dist/features/search/components/Search.js +3 -3
  134. package/dist/features/seller/components/SellerAuctionsView.js +27 -2
  135. package/dist/features/seller/components/SellerOrdersView.js +2 -2
  136. package/dist/features/seller/components/SellerPayoutsView.js +24 -10
  137. package/dist/features/seller/components/SellerPreOrdersView.js +12 -4
  138. package/dist/features/seller/components/SellerPrizeDrawsView.js +23 -5
  139. package/dist/features/seller/components/SellerProductShell.d.ts +2 -0
  140. package/dist/features/seller/components/SellerProductShell.js +1 -1
  141. package/dist/features/seller/components/SellerProductsView.js +8 -6
  142. package/dist/features/seller/components/SellerReviewsView.js +27 -6
  143. package/dist/features/seller/components/index.d.ts +0 -2
  144. package/dist/features/seller/components/index.js +0 -1
  145. package/dist/features/stores/components/StoreListingsGuideView.js +2 -1
  146. package/dist/features/stores/components/StoreProductsView.js +1 -1
  147. package/dist/features/stores/schemas/firestore.d.ts +11 -0
  148. package/dist/features/stores/schemas/firestore.js +5 -0
  149. package/dist/features/stores/schemas/index.d.ts +2 -2
  150. package/dist/features/tester/actions/checklist-item-actions.d.ts +6 -0
  151. package/dist/features/tester/actions/checklist-item-actions.js +2 -0
  152. package/dist/features/tester/components/AdminTesterFeedbackIssuesView.js +13 -2
  153. package/dist/features/tester/components/AdminTesterFeedbackListView.js +2 -1
  154. package/dist/features/tester/components/AdminTesterFeedbackReportView.js +9 -5
  155. package/dist/features/tester/components/TesterHubView.js +34 -21
  156. package/dist/features/tester/repository/tester-checklist-item.repository.js +1 -0
  157. package/dist/features/tester/repository/tester-checklist-response.repository.d.ts +18 -4
  158. package/dist/features/tester/repository/tester-checklist-response.repository.js +43 -8
  159. package/dist/features/tester/schemas/firestore.d.ts +8 -3
  160. package/dist/features/tester/schemas/firestore.js +6 -0
  161. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +21 -9
  162. package/dist/features/tester/utils/phases.d.ts +31 -0
  163. package/dist/features/tester/utils/phases.js +46 -0
  164. package/dist/features/whatsapp-bot/components/SellerWhatsAppSettingsView.js +1 -1
  165. package/dist/features/whatsapp-bot/helpers/whatsapp.d.ts +10 -1
  166. package/dist/features/whatsapp-bot/helpers/whatsapp.js +47 -0
  167. package/dist/features/whatsapp-bot/types/index.d.ts +20 -1
  168. package/dist/features/wishlist/types/index.d.ts +3 -0
  169. package/dist/index.d.ts +15 -6
  170. package/dist/index.js +19 -9
  171. package/dist/next/components/NotFoundView.js +2 -1
  172. package/dist/next/routing/route-map.d.ts +6 -12
  173. package/dist/next/routing/route-map.js +3 -4
  174. package/dist/providers/db-firebase/admin.d.ts +1 -0
  175. package/dist/providers/db-firebase/admin.js +1 -1
  176. package/dist/repositories/index.d.ts +2 -0
  177. package/dist/repositories/index.js +1 -0
  178. package/dist/schemas/registry.d.ts +2 -2
  179. package/dist/seed/addresses-seed-data.js +18 -18
  180. package/dist/seed/bids-seed-data.js +4 -4
  181. package/dist/seed/blog-posts-seed-data.js +82 -82
  182. package/dist/seed/carousel-slides-seed-data.js +14 -10
  183. package/dist/seed/carousels-seed-data.js +3 -3
  184. package/dist/seed/cart-seed-data.js +92 -92
  185. package/dist/seed/claimed-coupons-seed-data.js +10 -10
  186. package/dist/seed/conversations-seed-data.js +75 -75
  187. package/dist/seed/coupon-usage-seed-data.js +12 -12
  188. package/dist/seed/coupons-seed-data.js +41 -41
  189. package/dist/seed/events-seed-data.js +105 -105
  190. package/dist/seed/grouped-listings-seed-data.d.ts +2 -137
  191. package/dist/seed/grouped-listings-seed-data.js +79 -143
  192. package/dist/seed/history-seed-data.js +38 -38
  193. package/dist/seed/homepage-sections-seed-data.js +9 -9
  194. package/dist/seed/notifications-seed-data.js +56 -56
  195. package/dist/seed/offers-seed-data.js +91 -91
  196. package/dist/seed/orders-seed-data.js +121 -106
  197. package/dist/seed/payouts-seed-data.js +42 -42
  198. package/dist/seed/products-auctions-seed-data.js +10 -2
  199. package/dist/seed/products-standard-seed-data.js +40 -8
  200. package/dist/seed/reviews-seed-data.js +42 -23
  201. package/dist/seed/scammers-seed-data.js +22 -22
  202. package/dist/seed/sessions-seed-data.js +7 -7
  203. package/dist/seed/shipments-seed-data.js +10 -10
  204. package/dist/seed/site-settings-seed-data.js +89 -0
  205. package/dist/seed/store-addresses-seed-data.js +2 -2
  206. package/dist/seed/store-extensions-seed-data.js +93 -93
  207. package/dist/seed/stores-seed-data.js +2 -0
  208. package/dist/seed/support-tickets-seed-data.js +47 -47
  209. package/dist/seed/users-seed-data.js +55 -89
  210. package/dist/seed/wishlists-seed-data.js +22 -22
  211. package/dist/server.d.ts +4 -3
  212. package/dist/server.js +7 -7
  213. package/dist/styles.css +1 -1
  214. package/dist/tailwind-utilities.css +1 -1
  215. package/dist/ui/components/PageLoader.js +8 -3
  216. package/dist/ui/components/Select.d.ts +8 -1
  217. package/dist/ui/components/Select.js +2 -2
  218. package/dist/ui/components/SiteMark.d.ts +23 -0
  219. package/dist/ui/components/SiteMark.js +76 -0
  220. package/dist/ui/index.d.ts +2 -0
  221. package/dist/ui/index.js +1 -0
  222. package/dist/validation/schemas.d.ts +0 -2
  223. package/dist/validation/schemas.js +0 -2
  224. package/package.json +1 -1
  225. package/scripts/seed-cli.mjs +17 -15
@@ -1,6 +1,6 @@
1
1
  /*
2
- * WHY: Seeds buyer ↔ seller conversations for YGO marketplace.
3
- * WHAT: 6 conversations covering grading queries, offer negotiation, shipping delays, returns, bulk orders, tracking.
2
+ * WHY: Seeds buyer ↔ seller conversations for the Beyblade marketplace.
3
+ * WHAT: 6 conversations covering condition queries, offer negotiation, prize-draw fairness, shipping delays, returns, bulk orders, tracking.
4
4
  *
5
5
  * EXPORTS:
6
6
  * conversationsSeedData — Array of Partial<ConversationDocument> for seed runner
@@ -17,30 +17,30 @@ const minsAgo = (n) => new Date(NOW.getTime() - n * 60000);
17
17
  const hoursAgo = (n) => new Date(NOW.getTime() - n * 3600000);
18
18
  const daysAgo = (n) => new Date(NOW.getTime() - n * 86400000);
19
19
  export const conversationsSeedData = [
20
- // ── 1. Blue-Eyes LOB PSA 10 — Pre-purchase grading query ─────────────────
20
+ // ── 1. Metal Lightning L-Drago — Pre-purchase condition query ────────────
21
21
  {
22
- id: "conv-blue-eyes-yugi-kaiba-001",
22
+ id: "conv-l-drago-yugi-kaiba-001",
23
23
  buyerId: "user-yugi-muto",
24
- buyerDisplayName: "Yugi Muto",
25
- sellerDisplayName: "Seto Kaiba",
26
- storeId: "store-kaiba-corp-cards",
27
- storeName: "Kaiba Corp Card Vault",
28
- productId: "auction-blue-eyes-lob-1st-psa10",
29
- productTitle: "Blue-Eyes White Dragon LOB 1st Ed — PSA 10",
24
+ buyerDisplayName: "Mock User 3",
25
+ sellerDisplayName: "Mock User 6",
26
+ storeId: "store-beyblade-arena",
27
+ storeName: "Beyblade Arena",
28
+ productId: "auction-beyblade-metal-lightning-l-drago",
29
+ productTitle: "Beyblade Metal Lightning L-Drago",
30
30
  messages: [
31
31
  {
32
32
  id: "msg-001-1",
33
33
  senderId: "user-yugi-muto",
34
34
  senderRole: "buyer",
35
- body: "Hi! Is this PSA 10 a gem mint or does it have any edge wear on the slab? I'm buying for my collection, not resale, so I want to know the centering before I bid.",
35
+ body: "Hi! Is this a sharp, unrounded tip or has it seen a lot of stadium battles? I'm buying for my collection, not battling, so I want to know the tip wear before I bid.",
36
36
  isRead: true,
37
37
  sentAt: daysAgo(3),
38
38
  },
39
39
  {
40
40
  id: "msg-001-2",
41
- senderId: "user-seto-kaiba",
41
+ senderId: "user-tyson-blader",
42
42
  senderRole: "seller",
43
- body: "Hey Yugi! The centering is approximately 55/45 front and 60/40 back well within PSA 10 standards. The slab itself has no cracks. This was submitted by me personally from a sealed LOB booster. Happy to share full slab photos on WhatsApp if you DM me before bidding.",
43
+ body: "Hey Rehan! The tip is factory-sharp with visible groovesbarely used, maybe 10 launches total. No cracks on the layer. This came direct from a sealed Metal Fight booster. Happy to share close-up photos on WhatsApp if you DM me before bidding.",
44
44
  isRead: true,
45
45
  sentAt: daysAgo(3),
46
46
  },
@@ -48,20 +48,20 @@ export const conversationsSeedData = [
48
48
  id: "msg-001-3",
49
49
  senderId: "user-yugi-muto",
50
50
  senderRole: "buyer",
51
- body: "That sounds great! Can you also confirm the cert number so I can verify on PSA's website?",
51
+ body: "That sounds great! Can you also confirm it's genuine Takara-Tomy and not a clone?",
52
52
  isRead: true,
53
53
  sentAt: daysAgo(2),
54
54
  },
55
55
  {
56
56
  id: "msg-001-4",
57
- senderId: "user-seto-kaiba",
57
+ senderId: "user-tyson-blader",
58
58
  senderRole: "seller",
59
- body: "PSA Cert #: 84729183. You can verify at psacard.com. Grade is confirmed Gem Mint 10. Good luck in the auction!",
59
+ body: "100% genuine laser-etched logo on the underside, verified. Good luck in the auction!",
60
60
  isRead: false,
61
61
  sentAt: daysAgo(2),
62
62
  },
63
63
  ],
64
- lastMessage: "PSA Cert #: 84729183. You can verify at psacard.com. Grade is confirmed Gem Mint 10. Good luck in the auction!",
64
+ lastMessage: "100% genuine laser-etched logo on the underside, verified. Good luck in the auction!",
65
65
  lastMessageAt: daysAgo(2),
66
66
  unreadBuyer: 1,
67
67
  unreadSeller: 0,
@@ -69,30 +69,30 @@ export const conversationsSeedData = [
69
69
  createdAt: daysAgo(3),
70
70
  updatedAt: daysAgo(2),
71
71
  },
72
- // ── 2. Dark Magician Girl IOC — Offer negotiation ────────────────────────
72
+ // ── 2. Burst Valkyrie — Offer negotiation ────────────────────────────────
73
73
  {
74
- id: "conv-dmg-ioc-yugi-kaiba-002",
74
+ id: "conv-burst-valkyrie-yugi-kaiba-002",
75
75
  buyerId: "user-yugi-muto",
76
- buyerDisplayName: "Yugi Muto",
77
- sellerDisplayName: "Seto Kaiba",
78
- storeId: "store-kaiba-corp-cards",
79
- storeName: "Kaiba Corp Card Vault",
80
- productId: "product-dark-magician-girl-ioc",
81
- productTitle: "Dark Magician Girl IOC 1st Edition (NM)",
76
+ buyerDisplayName: "Mock User 3",
77
+ sellerDisplayName: "Mock User 6",
78
+ storeId: "store-beyblade-arena",
79
+ storeName: "Beyblade Arena",
80
+ productId: "product-beyblade-burst-valkyrie",
81
+ productTitle: "Beyblade Burst Valkyrie",
82
82
  messages: [
83
83
  {
84
84
  id: "msg-002-1",
85
85
  senderId: "user-yugi-muto",
86
86
  senderRole: "buyer",
87
- body: "Would you take ₹7,500 for the Dark Magician Girl IOC? I see it's listed at ₹8,999.",
87
+ body: "Would you take ₹1,500 for the Burst Valkyrie? I see it's listed at ₹1,899.",
88
88
  isRead: true,
89
89
  sentAt: daysAgo(1),
90
90
  },
91
91
  {
92
92
  id: "msg-002-2",
93
- senderId: "user-seto-kaiba",
93
+ senderId: "user-tyson-blader",
94
94
  senderRole: "seller",
95
- body: "Hi Yugi! Best I can do is ₹8,200 — it's a clean 1st Ed with no whitening. I'll cover shipping at that price.",
95
+ body: "Hi Rehan! Best I can do is ₹1,700 — it's a clean, sealed piece with no sticker damage. I'll cover shipping at that price.",
96
96
  isRead: true,
97
97
  sentAt: daysAgo(1),
98
98
  },
@@ -100,12 +100,12 @@ export const conversationsSeedData = [
100
100
  id: "msg-002-3",
101
101
  senderId: "user-yugi-muto",
102
102
  senderRole: "buyer",
103
- body: "Deal at ₹8,200 with free shipping. Can I use the Make Offer feature or should you update the listing?",
103
+ body: "Deal at ₹1,700 with free shipping. Can I use the Make Offer feature or should you update the listing?",
104
104
  isRead: false,
105
105
  sentAt: hoursAgo(8),
106
106
  },
107
107
  ],
108
- lastMessage: "Deal at ₹8,200 with free shipping. Can I use the Make Offer feature or should you update the listing?",
108
+ lastMessage: "Deal at ₹1,700 with free shipping. Can I use the Make Offer feature or should you update the listing?",
109
109
  lastMessageAt: hoursAgo(8),
110
110
  unreadBuyer: 0,
111
111
  unreadSeller: 1,
@@ -113,22 +113,22 @@ export const conversationsSeedData = [
113
113
  createdAt: daysAgo(1),
114
114
  updatedAt: hoursAgo(8),
115
115
  },
116
- // ── 3. Exodia Head LOB Authenticity check ──────────────────────────────
116
+ // ── 3. Mystery BoxPrize draw fairness question ────────────────────────
117
117
  {
118
- id: "conv-exodia-yugi-admin-003",
118
+ id: "conv-mystery-box-yugi-admin-003",
119
119
  buyerId: "user-yugi-muto",
120
- buyerDisplayName: "Yugi Muto",
121
- sellerDisplayName: "LetItRip Admin",
120
+ buyerDisplayName: "Mock User 3",
121
+ sellerDisplayName: "Mock User 1",
122
122
  storeId: "store-letitrip-official",
123
123
  storeName: "LetItRip Official",
124
- productId: "product-exodia-head-lob-nm",
125
- productTitle: "Exodia the Forbidden One LOB 1st Ed (NM)",
124
+ productId: "prizedraw-beyblade-mystery-box",
125
+ productTitle: "Beyblade Mystery Box",
126
126
  messages: [
127
127
  {
128
128
  id: "msg-003-1",
129
129
  senderId: "user-yugi-muto",
130
130
  senderRole: "buyer",
131
- body: "Is this a genuine Konami print or a reprint? My friend got burned with a counterfeit Exodia last month.",
131
+ body: "How is the winner for the mystery box actually selected? My friend got burned by a rigged giveaway last month.",
132
132
  isRead: true,
133
133
  sentAt: daysAgo(2),
134
134
  },
@@ -136,7 +136,7 @@ export const conversationsSeedData = [
136
136
  id: "msg-003-2",
137
137
  senderId: "user-admin-letitrip",
138
138
  senderRole: "seller",
139
- body: "100% genuine Konami LOB 1st Edition. You can tell by the eye of Anubis hologram on the lower right corner it's gold, not silver (silver = unlimited). I can send macro photos of the holo stamp before you buy. We also have a 7-day authenticity guarantee.",
139
+ body: "Great question the draw uses a cryptographically random selection (crypto.randomInt) run server-side, logged with a timestamp, and the winner is announced publicly on the event page. No manual picking involved. Happy to walk you through the mechanics before you enter.",
140
140
  isRead: true,
141
141
  sentAt: daysAgo(2),
142
142
  },
@@ -144,12 +144,12 @@ export const conversationsSeedData = [
144
144
  id: "msg-003-3",
145
145
  senderId: "user-yugi-muto",
146
146
  senderRole: "buyer",
147
- body: "Perfect, that's exactly what I needed to hear. Placing the order now!",
147
+ body: "Perfect, that's exactly what I needed to hear. Entering now!",
148
148
  isRead: true,
149
149
  sentAt: daysAgo(1),
150
150
  },
151
151
  ],
152
- lastMessage: "Perfect, that's exactly what I needed to hear. Placing the order now!",
152
+ lastMessage: "Perfect, that's exactly what I needed to hear. Entering now!",
153
153
  lastMessageAt: daysAgo(1),
154
154
  unreadBuyer: 0,
155
155
  unreadSeller: 0,
@@ -157,30 +157,30 @@ export const conversationsSeedData = [
157
157
  createdAt: daysAgo(2),
158
158
  updatedAt: daysAgo(1),
159
159
  },
160
- // ── 4. Sealed Booster Box — Shipping delay ───────────────────────────────
160
+ // ── 4. Original Dranzer S — Shipping delay ───────────────────────────────
161
161
  {
162
- id: "conv-booster-box-admin-kaiba-004",
162
+ id: "conv-dranzer-s-admin-kaiba-004",
163
163
  buyerId: "user-admin-letitrip",
164
- buyerDisplayName: "LetItRip Admin",
165
- sellerDisplayName: "Seto Kaiba",
166
- storeId: "store-kaiba-corp-cards",
167
- storeName: "Kaiba Corp Card Vault",
168
- productId: "product-lob-booster-box-sealed",
169
- productTitle: "Legend of Blue Eyes White Dragon — Sealed Booster Box",
164
+ buyerDisplayName: "Mock User 1",
165
+ sellerDisplayName: "Mock User 6",
166
+ storeId: "store-beyblade-arena",
167
+ storeName: "Beyblade Arena",
168
+ productId: "product-beyblade-original-dranzer-s",
169
+ productTitle: "Beyblade Original Dranzer S",
170
170
  messages: [
171
171
  {
172
172
  id: "msg-004-1",
173
173
  senderId: "user-admin-letitrip",
174
174
  senderRole: "buyer",
175
- body: "Hi Kaiba, I ordered the LOB sealed booster box 3 days ago. The tracking shows it's still at the dispatch hub in Mumbai. Is there a delay?",
175
+ body: "Hi Tyson, I ordered the sealed Dranzer S 3 days ago. The tracking shows it's still at the dispatch hub in Chennai. Is there a delay?",
176
176
  isRead: true,
177
177
  sentAt: daysAgo(2),
178
178
  },
179
179
  {
180
180
  id: "msg-004-2",
181
- senderId: "user-seto-kaiba",
181
+ senderId: "user-tyson-blader",
182
182
  senderRole: "seller",
183
- body: "Apologies for the delay! There was a backlog at the courier facility — they've confirmed it will leave Mumbai tonight. Updated tracking should show movement tomorrow morning. If it doesn't arrive by end of week, I'll initiate a replacement. Very sorry for the inconvenience!",
183
+ body: "Apologies for the delay! There was a backlog at the courier facility — they've confirmed it will leave Chennai tonight. Updated tracking should show movement tomorrow morning. If it doesn't arrive by end of week, I'll initiate a replacement. Very sorry for the inconvenience!",
184
184
  isRead: true,
185
185
  sentAt: daysAgo(2),
186
186
  },
@@ -201,35 +201,35 @@ export const conversationsSeedData = [
201
201
  createdAt: daysAgo(2),
202
202
  updatedAt: daysAgo(1),
203
203
  },
204
- // ── 5. Bulk LOB Singles — Bulk order query ───────────────────────────────
204
+ // ── 5. Bulk Original Series — Bulk order query ───────────────────────────
205
205
  {
206
- id: "conv-bulk-lob-yugi-kaiba-005",
206
+ id: "conv-bulk-original-yugi-kaiba-005",
207
207
  buyerId: "user-yugi-muto",
208
- buyerDisplayName: "Yugi Muto",
209
- sellerDisplayName: "Seto Kaiba",
210
- storeId: "store-kaiba-corp-cards",
211
- storeName: "Kaiba Corp Card Vault",
212
- productId: "product-pot-of-greed-lob",
213
- productTitle: "Pot of Greed LOB 1st Edition",
208
+ buyerDisplayName: "Mock User 3",
209
+ sellerDisplayName: "Mock User 6",
210
+ storeId: "store-beyblade-arena",
211
+ storeName: "Beyblade Arena",
212
+ productId: "product-beyblade-original-driger-v",
213
+ productTitle: "Beyblade Original Driger V",
214
214
  messages: [
215
215
  {
216
216
  id: "msg-005-1",
217
217
  senderId: "user-yugi-muto",
218
218
  senderRole: "buyer",
219
- body: "Do you have 3 copies of Pot of Greed LOB? I'm completing my LOB set and need multiples for the trade binder.",
219
+ body: "Do you have 3 copies of the Original Driger V? I'm completing my original-series set and need multiples for tournament backup.",
220
220
  isRead: true,
221
221
  sentAt: minsAgo(240),
222
222
  },
223
223
  {
224
224
  id: "msg-005-2",
225
- senderId: "user-seto-kaiba",
225
+ senderId: "user-tyson-blader",
226
226
  senderRole: "seller",
227
- body: "Yes! I have 5 copies in stock. For 3+ copies I can do ₹12,000 per card (saving ₹999 per card vs list price) + free shipping. All cards are NM with clean edges.",
227
+ body: "Yes! I have 5 copies in stock. For 3+ copies I can do ₹1,600 per piece (saving ₹399 per piece vs list price) + free shipping. All pieces are NM with sharp tips.",
228
228
  isRead: false,
229
229
  sentAt: minsAgo(200),
230
230
  },
231
231
  ],
232
- lastMessage: "Yes! I have 5 copies in stock. For 3+ copies I can do ₹12,000 per card (saving ₹999 per card vs list price) + free shipping. All cards are NM with clean edges.",
232
+ lastMessage: "Yes! I have 5 copies in stock. For 3+ copies I can do ₹1,600 per piece (saving ₹399 per piece vs list price) + free shipping. All pieces are NM with sharp tips.",
233
233
  lastMessageAt: minsAgo(200),
234
234
  unreadBuyer: 1,
235
235
  unreadSeller: 0,
@@ -237,28 +237,28 @@ export const conversationsSeedData = [
237
237
  createdAt: minsAgo(240),
238
238
  updatedAt: minsAgo(200),
239
239
  },
240
- // ── 6. Chaos Emperor Dragon — Post-purchase tracking (archived) ──────────
240
+ // ── 6. X Knife Shinobi — Post-purchase tracking (archived) ───────────────
241
241
  {
242
- id: "conv-ced-admin-kaiba-006",
242
+ id: "conv-x-knife-admin-kaiba-006",
243
243
  buyerId: "user-admin-letitrip",
244
- buyerDisplayName: "LetItRip Admin",
245
- sellerDisplayName: "Seto Kaiba",
246
- storeId: "store-kaiba-corp-cards",
247
- storeName: "Kaiba Corp Card Vault",
248
- productId: "product-chaos-emperor-dragon-ioc",
249
- productTitle: "Chaos Emperor Dragon — Envoy of the End IOC 1st Ed",
244
+ buyerDisplayName: "Mock User 1",
245
+ sellerDisplayName: "Mock User 6",
246
+ storeId: "store-beyblade-arena",
247
+ storeName: "Beyblade Arena",
248
+ productId: "product-beyblade-x-knife-shinobi",
249
+ productTitle: "Beyblade X Knife Shinobi",
250
250
  messages: [
251
251
  {
252
252
  id: "msg-006-1",
253
253
  senderId: "user-admin-letitrip",
254
254
  senderRole: "buyer",
255
- body: "Hi! My order for CED IOC shipped 2 days ago — the courier's tracking page shows it left your city but has not updated since. Can you check with the courier?",
255
+ body: "Hi! My order for the X Knife Shinobi shipped 2 days ago — the courier's tracking page shows it left your city but has not updated since. Can you check with the courier?",
256
256
  isRead: true,
257
257
  sentAt: daysAgo(6),
258
258
  },
259
259
  {
260
260
  id: "msg-006-2",
261
- senderId: "user-seto-kaiba",
261
+ senderId: "user-tyson-blader",
262
262
  senderRole: "seller",
263
263
  body: "Hi! Yes, I raised a ticket with the courier about that. They confirmed it is in transit at the sorting facility — tracking updates can lag by 24-48 hours. Should arrive tomorrow or day after.",
264
264
  isRead: true,
@@ -268,13 +268,13 @@ export const conversationsSeedData = [
268
268
  id: "msg-006-3",
269
269
  senderId: "user-admin-letitrip",
270
270
  senderRole: "buyer",
271
- body: "Got the card today, arrived in perfect condition. Thanks Kaiba!",
271
+ body: "Got the piece today, arrived in perfect condition. Thanks Tyson!",
272
272
  isRead: true,
273
273
  sentAt: daysAgo(4),
274
274
  },
275
275
  {
276
276
  id: "msg-006-4",
277
- senderId: "user-seto-kaiba",
277
+ senderId: "user-tyson-blader",
278
278
  senderRole: "seller",
279
279
  body: "Glad it arrived safely! Please leave a review when you get a chance.",
280
280
  isRead: true,
@@ -1,6 +1,6 @@
1
1
  /*
2
- * WHY: Seeds per-user coupon usage subcollection for YGO marketplace.
3
- * WHAT: 4 records: Yugi used YUGI10 + FREESHIP499, Kaiba used KAIBA25, Admin used EXODIA50.
2
+ * WHY: Seeds per-user coupon usage subcollection for the Beyblade marketplace.
3
+ * WHAT: 4 records: Rehan used REHAN10 + FREESHIP499, Vivaan used ARENA25, Admin used BLADER50.
4
4
  *
5
5
  * EXPORTS:
6
6
  * CouponUsageSeedRecord (interface)
@@ -16,16 +16,16 @@
16
16
  const NOW = new Date();
17
17
  const daysAgo = (n) => new Date(NOW.getTime() - n * 86400000);
18
18
  export const couponUsageSeedData = [
19
- // Yugi used YUGI10 once (perUserLimit: 1 → exhausted)
19
+ // Rehan used REHAN10 once (perUserLimit: 1 → exhausted)
20
20
  {
21
21
  userId: "user-yugi-muto",
22
- couponId: "coupon-yugi10",
23
- couponCode: "YUGI10",
22
+ couponId: "coupon-rehan10",
23
+ couponCode: "REHAN10",
24
24
  usageCount: 1,
25
25
  lastUsedAt: daysAgo(45),
26
26
  orders: ["order-2-20260325-a1b2c3"],
27
27
  },
28
- // Yugi used FREESHIP499 once (no perUserLimit)
28
+ // Rehan used FREESHIP499 once (no perUserLimit)
29
29
  {
30
30
  userId: "user-yugi-muto",
31
31
  couponId: "coupon-freeship499",
@@ -34,20 +34,20 @@ export const couponUsageSeedData = [
34
34
  lastUsedAt: daysAgo(20),
35
35
  orders: ["order-1-20260410-j1k2l3"],
36
36
  },
37
- // Kaiba used KAIBA25 once (perUserLimit: 2 → one more use left)
37
+ // Vivaan used ARENA25 once (perUserLimit: 2 → one more use left)
38
38
  {
39
39
  userId: "user-seto-kaiba",
40
- couponId: "coupon-kaiba25",
41
- couponCode: "KAIBA25",
40
+ couponId: "coupon-arena25",
41
+ couponCode: "ARENA25",
42
42
  usageCount: 1,
43
43
  lastUsedAt: daysAgo(15),
44
44
  orders: ["order-1-20260425-p7q8r9"],
45
45
  },
46
- // Admin used EXODIA50 once (perUserLimit: 1 → exhausted)
46
+ // Admin used BLADER50 once (perUserLimit: 1 → exhausted)
47
47
  {
48
48
  userId: "user-admin-letitrip",
49
- couponId: "coupon-exodia50",
50
- couponCode: "EXODIA50",
49
+ couponId: "coupon-blader50",
50
+ couponCode: "BLADER50",
51
51
  usageCount: 1,
52
52
  lastUsedAt: daysAgo(10),
53
53
  orders: ["order-1-20260430-g7h8i9"],
@@ -1,6 +1,6 @@
1
1
  /*
2
- * WHY: Seeds 10 discount coupons for YGO marketplace — covers percentage, fixed, free_shipping, buy_x_get_y types.
3
- * WHAT: 5 admin-scoped (YUGI10, EXODIA50, FREESHIP499, NEWDUELIST, TOURNAMENT2026) + 5 seller-scoped (KAIBA25, BLUEEYESVIP, BUYNOW10, SEALED20, GRADEDSET). Mix of active, upcoming, and exhausted.
2
+ * WHY: Seeds 10 discount coupons for the Beyblade marketplace — covers percentage, fixed, free_shipping, buy_x_get_y types.
3
+ * WHAT: 5 admin-scoped (REHAN10, BLADER50, FREESHIP499, NEWBLADER, TOURNAMENT2026) + 5 seller-scoped (ARENA25, ARENAVIP, BUYNOW10, SEALED20, LIMITEDSET). Mix of active, upcoming, and exhausted.
4
4
  *
5
5
  * EXPORTS:
6
6
  * couponsSeedData — Array of Partial<CouponDocument> for seed runner
@@ -19,9 +19,9 @@ const daysAhead = (n) => new Date(NOW.getTime() + n * 86400000);
19
19
  export const couponsSeedData = [
20
20
  // ── Admin coupons ──────────────────────────────────────────────────────────
21
21
  {
22
- id: "coupon-yugi10",
23
- code: "YUGI10",
24
- name: "Yugi's Welcome — 10% Off",
22
+ id: "coupon-rehan10",
23
+ code: "REHAN10",
24
+ name: "Rehan's Welcome — 10% Off",
25
25
  description: "10% off your first order on LetItRip. Maximum discount ₹200. First-time buyers only.",
26
26
  type: COUPON_FIELDS.TYPE_VALUES.PERCENTAGE,
27
27
  scope: COUPON_FIELDS.SCOPE_VALUES.ADMIN,
@@ -35,9 +35,9 @@ export const couponsSeedData = [
35
35
  stats: { totalUses: 312, totalRevenue: 1560000, totalDiscount: 31200 },
36
36
  },
37
37
  {
38
- id: "coupon-exodia50",
39
- code: "EXODIA50",
40
- name: "Exodia's Power — ₹500 Off",
38
+ id: "coupon-blader50",
39
+ code: "BLADER50",
40
+ name: "Blader's Power — ₹500 Off",
41
41
  description: "₹500 off on orders above ₹2,000. All categories. Limited to 500 total uses.",
42
42
  type: COUPON_FIELDS.TYPE_VALUES.FIXED,
43
43
  scope: COUPON_FIELDS.SCOPE_VALUES.ADMIN,
@@ -67,9 +67,9 @@ export const couponsSeedData = [
67
67
  stats: { totalUses: 1024, totalRevenue: 5120000, totalDiscount: 153600 },
68
68
  },
69
69
  {
70
- id: "coupon-newduelist",
71
- code: "NEWDUELIST",
72
- name: "New Duelist — 20% Off First Order",
70
+ id: "coupon-newblader",
71
+ code: "NEWBLADER",
72
+ name: "New Blader — 20% Off First Order",
73
73
  description: "20% off your first order. Maximum discount ₹400. First-time buyers only.",
74
74
  type: COUPON_FIELDS.TYPE_VALUES.PERCENTAGE,
75
75
  scope: COUPON_FIELDS.SCOPE_VALUES.ADMIN,
@@ -98,41 +98,41 @@ export const couponsSeedData = [
98
98
  updatedAt: daysAgo(1),
99
99
  stats: { totalUses: 456, totalRevenue: 2280000, totalDiscount: 91200 },
100
100
  },
101
- // ── Seller coupons (Kaiba Corp) ────────────────────────────────────────────
101
+ // ── Seller coupons (Beyblade Arena) ────────────────────────────────────────
102
102
  {
103
- id: "coupon-kaiba25",
104
- code: "KAIBA25",
105
- name: "Kaiba Corp — 25% Off (Max ₹500)",
106
- description: "25% off any Kaiba Corp Card Vault purchase. Maximum discount ₹500.",
103
+ id: "coupon-arena25",
104
+ code: "ARENA25",
105
+ name: "Beyblade Arena — 25% Off (Max ₹500)",
106
+ description: "25% off any Beyblade Arena purchase. Maximum discount ₹500.",
107
107
  type: COUPON_FIELDS.TYPE_VALUES.PERCENTAGE,
108
108
  scope: COUPON_FIELDS.SCOPE_VALUES.SELLER,
109
- storeId: "store-kaiba-corp-cards",
109
+ storeId: "store-beyblade-arena",
110
110
  discount: { value: 25, maxDiscount: 500, minPurchase: 1000 },
111
111
  usage: { totalLimit: 200, perUserLimit: 2, currentUsage: 67 },
112
112
  validity: { startDate: daysAgo(20), endDate: daysAhead(40), isActive: true },
113
113
  restrictions: { firstTimeUserOnly: false, combineWithSellerCoupons: false },
114
- createdBy: "user-seto-kaiba",
114
+ createdBy: "user-tyson-blader",
115
115
  createdAt: daysAgo(20),
116
116
  updatedAt: daysAgo(4),
117
117
  stats: { totalUses: 67, totalRevenue: 335000, totalDiscount: 33500 },
118
118
  },
119
119
  {
120
- id: "coupon-blueeyesvip",
121
- code: "BLUEEYESVIP",
122
- name: "Blue-Eyes VIP — 15% Off Graded Cards",
123
- description: "15% off graded cards at Kaiba Corp. For our top collectors.",
120
+ id: "coupon-arenavip",
121
+ code: "ARENAVIP",
122
+ name: "Arena VIP — 15% Off Limited Editions",
123
+ description: "15% off limited-edition beyblades at Beyblade Arena. For our top collectors.",
124
124
  type: COUPON_FIELDS.TYPE_VALUES.PERCENTAGE,
125
125
  scope: COUPON_FIELDS.SCOPE_VALUES.SELLER,
126
- storeId: "store-kaiba-corp-cards",
126
+ storeId: "store-beyblade-arena",
127
127
  discount: { value: 15, maxDiscount: 750, minPurchase: 2000 },
128
128
  usage: { totalLimit: 50, perUserLimit: 1, currentUsage: 12 },
129
129
  validity: { startDate: daysAgo(10), endDate: daysAhead(60), isActive: true },
130
130
  restrictions: {
131
- applicableCategories: ["category-psa-graded", "category-bgs-graded", "category-cgc-graded"],
131
+ applicableCategories: ["category-beyblade-original", "category-beyblade-metal"],
132
132
  firstTimeUserOnly: false,
133
133
  combineWithSellerCoupons: false,
134
134
  },
135
- createdBy: "user-seto-kaiba",
135
+ createdBy: "user-tyson-blader",
136
136
  createdAt: daysAgo(10),
137
137
  updatedAt: daysAgo(3),
138
138
  stats: { totalUses: 12, totalRevenue: 60000, totalDiscount: 9000 },
@@ -140,21 +140,21 @@ export const couponsSeedData = [
140
140
  {
141
141
  id: "coupon-buynow10",
142
142
  code: "BUYNOW10",
143
- name: "Buy 3 Singles, Get 10% Off",
144
- description: "Buy any 3 single cards from Kaiba Corp and get 10% off the total.",
143
+ name: "Buy 3 Beyblades, Get 10% Off",
144
+ description: "Buy any 3 beyblades from Beyblade Arena and get 10% off the total.",
145
145
  type: COUPON_FIELDS.TYPE_VALUES.BUY_X_GET_Y,
146
146
  scope: COUPON_FIELDS.SCOPE_VALUES.SELLER,
147
- storeId: "store-kaiba-corp-cards",
147
+ storeId: "store-beyblade-arena",
148
148
  discount: { value: 10, maxDiscount: 300, minPurchase: 0 },
149
149
  bxgy: {
150
150
  buyQuantity: 3,
151
151
  getQuantity: 0,
152
- applicableCategories: ["category-monster-cards", "category-spell-cards", "category-trap-cards", "category-extra-deck-cards"],
152
+ applicableCategories: ["category-beyblade-original", "category-beyblade-metal", "category-beyblade-burst", "category-beyblade-x"],
153
153
  },
154
154
  usage: { totalLimit: 100, perUserLimit: 3, currentUsage: 34 },
155
155
  validity: { startDate: daysAgo(15), endDate: daysAhead(45), isActive: true },
156
156
  restrictions: { firstTimeUserOnly: false, combineWithSellerCoupons: false },
157
- createdBy: "user-seto-kaiba",
157
+ createdBy: "user-tyson-blader",
158
158
  createdAt: daysAgo(15),
159
159
  updatedAt: daysAgo(2),
160
160
  stats: { totalUses: 34, totalRevenue: 170000, totalDiscount: 17000 },
@@ -163,40 +163,40 @@ export const couponsSeedData = [
163
163
  id: "coupon-sealed20",
164
164
  code: "SEALED20",
165
165
  name: "20% Off Sealed Products",
166
- description: "20% off sealed booster packs, boxes, and tins at Kaiba Corp.",
166
+ description: "20% off sealed launcher sets, stadiums, and starter boxes at Beyblade Arena.",
167
167
  type: COUPON_FIELDS.TYPE_VALUES.PERCENTAGE,
168
168
  scope: COUPON_FIELDS.SCOPE_VALUES.SELLER,
169
- storeId: "store-kaiba-corp-cards",
169
+ storeId: "store-beyblade-arena",
170
170
  discount: { value: 20, maxDiscount: 1000, minPurchase: 1000 },
171
171
  usage: { totalLimit: 75, perUserLimit: 2, currentUsage: 28 },
172
172
  validity: { startDate: daysAgo(7), endDate: daysAhead(30), isActive: true },
173
173
  restrictions: {
174
- applicableCategories: ["category-booster-packs", "category-booster-boxes", "category-collector-tins", "category-starter-structure"],
174
+ applicableCategories: ["category-beyblade-burst", "category-beyblade-x"],
175
175
  firstTimeUserOnly: false,
176
176
  combineWithSellerCoupons: false,
177
177
  },
178
- createdBy: "user-seto-kaiba",
178
+ createdBy: "user-tyson-blader",
179
179
  createdAt: daysAgo(7),
180
180
  updatedAt: daysAgo(1),
181
181
  stats: { totalUses: 28, totalRevenue: 140000, totalDiscount: 28000 },
182
182
  },
183
183
  {
184
- id: "coupon-gradedset",
185
- code: "GRADEDSET",
186
- name: "12% Off Graded Cards Bundle",
187
- description: "12% off when purchasing any graded card from Kaiba Corp.",
184
+ id: "coupon-limitedset",
185
+ code: "LIMITEDSET",
186
+ name: "12% Off Limited Edition Bundle",
187
+ description: "12% off when purchasing any limited-edition beyblade bundle from Beyblade Arena.",
188
188
  type: COUPON_FIELDS.TYPE_VALUES.PERCENTAGE,
189
189
  scope: COUPON_FIELDS.SCOPE_VALUES.SELLER,
190
- storeId: "store-kaiba-corp-cards",
190
+ storeId: "store-beyblade-arena",
191
191
  discount: { value: 12, maxDiscount: 600, minPurchase: 1500 },
192
192
  usage: { totalLimit: 100, perUserLimit: 2, currentUsage: 19 },
193
193
  validity: { startDate: daysAgo(5), endDate: daysAhead(55), isActive: true },
194
194
  restrictions: {
195
- applicableCategories: ["category-psa-graded", "category-bgs-graded", "category-cgc-graded", "category-raw-near-mint"],
195
+ applicableCategories: ["bundle-original-collectors-set", "bundle-metal-fusion-duo", "bundle-burst-battlers-pack", "bundle-x-series-starter"],
196
196
  firstTimeUserOnly: false,
197
197
  combineWithSellerCoupons: false,
198
198
  },
199
- createdBy: "user-seto-kaiba",
199
+ createdBy: "user-tyson-blader",
200
200
  createdAt: daysAgo(5),
201
201
  updatedAt: daysAgo(1),
202
202
  stats: { totalUses: 19, totalRevenue: 95000, totalDiscount: 11400 },