@devx-commerce/plugin-discounts-svaraa 0.0.1-beta.2

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 (105) hide show
  1. package/.medusa/server/src/admin/index.js +20 -0
  2. package/.medusa/server/src/admin/index.mjs +21 -0
  3. package/.medusa/server/src/api/admin/discounts/freebie-rules/[id]/route.js +75 -0
  4. package/.medusa/server/src/api/admin/discounts/freebie-rules/route.js +73 -0
  5. package/.medusa/server/src/api/admin/discounts/middlewares.js +113 -0
  6. package/.medusa/server/src/api/admin/discounts/price-rules/[id]/codes/export/route.js +41 -0
  7. package/.medusa/server/src/api/admin/discounts/price-rules/[id]/codes/route.js +20 -0
  8. package/.medusa/server/src/api/admin/discounts/price-rules/[id]/route.js +50 -0
  9. package/.medusa/server/src/api/admin/discounts/price-rules/bulk/[id]/add-more-codes/route.js +34 -0
  10. package/.medusa/server/src/api/admin/discounts/price-rules/bulk/route.js +33 -0
  11. package/.medusa/server/src/api/admin/discounts/price-rules/route.js +47 -0
  12. package/.medusa/server/src/api/admin/discounts/validators.js +649 -0
  13. package/.medusa/server/src/api/admin/plugin/route.js +7 -0
  14. package/.medusa/server/src/api/middlewares.js +14 -0
  15. package/.medusa/server/src/api/store/discounts/apply/route.js +24 -0
  16. package/.medusa/server/src/api/store/discounts/apply-freebie/route.js +20 -0
  17. package/.medusa/server/src/api/store/discounts/auto-apply/route.js +125 -0
  18. package/.medusa/server/src/api/store/discounts/cart-eligible-coupons/[cart_id]/route.js +19 -0
  19. package/.medusa/server/src/api/store/discounts/middlewares.js +49 -0
  20. package/.medusa/server/src/api/store/discounts/offers-on-product/[variant_id]/route.js +19 -0
  21. package/.medusa/server/src/api/store/discounts/price-rules/route.js +20 -0
  22. package/.medusa/server/src/api/store/discounts/remove/route.js +21 -0
  23. package/.medusa/server/src/api/store/plugin/route.js +7 -0
  24. package/.medusa/server/src/index.js +18 -0
  25. package/.medusa/server/src/jobs/price-rule-status-updates.js +80 -0
  26. package/.medusa/server/src/lib/api-response.js +42 -0
  27. package/.medusa/server/src/lib/utils.js +10 -0
  28. package/.medusa/server/src/links/mtm-freebie-rule-with-customers.js +16 -0
  29. package/.medusa/server/src/links/mtm-freebie-rule-with-products-categories.js +16 -0
  30. package/.medusa/server/src/links/mtm-freebie-rule-with-products-variants.js +18 -0
  31. package/.medusa/server/src/links/mtm-price-rule-with-customers.js +16 -0
  32. package/.medusa/server/src/links/mtm-price-rule-with-products-categories.js +16 -0
  33. package/.medusa/server/src/links/mtm-price-rule-with-products-variants.js +16 -0
  34. package/.medusa/server/src/modules/discounts/index.js +13 -0
  35. package/.medusa/server/src/modules/discounts/migrations/Migration20250526174351.js +21 -0
  36. package/.medusa/server/src/modules/discounts/migrations/Migration20250527074936.js +14 -0
  37. package/.medusa/server/src/modules/discounts/migrations/Migration20250527104919.js +14 -0
  38. package/.medusa/server/src/modules/discounts/migrations/Migration20250527113947.js +14 -0
  39. package/.medusa/server/src/modules/discounts/migrations/Migration20250529123956.js +14 -0
  40. package/.medusa/server/src/modules/discounts/migrations/Migration20250602052234.js +14 -0
  41. package/.medusa/server/src/modules/discounts/migrations/Migration20250602052239.js +14 -0
  42. package/.medusa/server/src/modules/discounts/migrations/Migration20250602165037.js +16 -0
  43. package/.medusa/server/src/modules/discounts/migrations/Migration20250602194000.js +130 -0
  44. package/.medusa/server/src/modules/discounts/migrations/Migration20250603053221.js +16 -0
  45. package/.medusa/server/src/modules/discounts/migrations/Migration20250604162727.js +14 -0
  46. package/.medusa/server/src/modules/discounts/migrations/Migration20250604162741.js +14 -0
  47. package/.medusa/server/src/modules/discounts/migrations/Migration20250604175305.js +15 -0
  48. package/.medusa/server/src/modules/discounts/migrations/Migration20250605161922.js +14 -0
  49. package/.medusa/server/src/modules/discounts/migrations/Migration20250605162116.js +14 -0
  50. package/.medusa/server/src/modules/discounts/migrations/Migration20250605164908.js +14 -0
  51. package/.medusa/server/src/modules/discounts/migrations/Migration20250610063653.js +14 -0
  52. package/.medusa/server/src/modules/discounts/migrations/Migration20250611105345.js +14 -0
  53. package/.medusa/server/src/modules/discounts/migrations/Migration20250611105356.js +14 -0
  54. package/.medusa/server/src/modules/discounts/migrations/Migration20250617113007.js +14 -0
  55. package/.medusa/server/src/modules/discounts/models/discount-code.js +20 -0
  56. package/.medusa/server/src/modules/discounts/models/freebie-rule.js +27 -0
  57. package/.medusa/server/src/modules/discounts/models/price-rule.js +53 -0
  58. package/.medusa/server/src/modules/discounts/service.js +98 -0
  59. package/.medusa/server/src/workflows/discount/add-more-code-in-price-rule/index.js +28 -0
  60. package/.medusa/server/src/workflows/discount/apply-coupon/index.js +41 -0
  61. package/.medusa/server/src/workflows/discount/apply-coupon/steps/apply-coupon-step-backup.js +245 -0
  62. package/.medusa/server/src/workflows/discount/apply-coupon/steps/apply-coupon-step.js +244 -0
  63. package/.medusa/server/src/workflows/discount/apply-coupon/steps/generate-adjustment-line-item.js +28 -0
  64. package/.medusa/server/src/workflows/discount/apply-coupon/steps/validate-coupon-step.js +212 -0
  65. package/.medusa/server/src/workflows/discount/apply-freebie/index.js +31 -0
  66. package/.medusa/server/src/workflows/discount/apply-freebie/steps/add-freebie-items-to-cart.js +212 -0
  67. package/.medusa/server/src/workflows/discount/apply-freebie/steps/remove-freebie-from-cart.js +16 -0
  68. package/.medusa/server/src/workflows/discount/auto-apply-coupon/index.js +10 -0
  69. package/.medusa/server/src/workflows/discount/auto-apply-coupon/steps/auto-apply-coupon.js +81 -0
  70. package/.medusa/server/src/workflows/discount/calculate-coupon-discount/index.js +74 -0
  71. package/.medusa/server/src/workflows/discount/create-bulk-discount/index.js +46 -0
  72. package/.medusa/server/src/workflows/discount/create-bulk-discount/steps/add-bulk-codes-to-rule.js +84 -0
  73. package/.medusa/server/src/workflows/discount/create-discount-code/index.js +10 -0
  74. package/.medusa/server/src/workflows/discount/create-discount-code/steps/create-discount-code-step.js +20 -0
  75. package/.medusa/server/src/workflows/discount/create-discount-price-rule/index.js +56 -0
  76. package/.medusa/server/src/workflows/discount/create-discount-price-rule/steps/create-discount-price-rule-step.js +58 -0
  77. package/.medusa/server/src/workflows/discount/create-discount-price-rule/steps/validate-customer-exists.js +21 -0
  78. package/.medusa/server/src/workflows/discount/create-freebie-rule/index.js +44 -0
  79. package/.medusa/server/src/workflows/discount/create-freebie-rule/steps/create-freebie-rule-step.js +64 -0
  80. package/.medusa/server/src/workflows/discount/export-codes/index.js +14 -0
  81. package/.medusa/server/src/workflows/discount/export-codes/steps/export-codes-step.js +116 -0
  82. package/.medusa/server/src/workflows/discount/get-cart-eligible-coupons/index.js +15 -0
  83. package/.medusa/server/src/workflows/discount/get-cart-eligible-coupons/step/get-cart-eligible-coupon.js +39 -0
  84. package/.medusa/server/src/workflows/discount/get-product-offers/index.js +25 -0
  85. package/.medusa/server/src/workflows/discount/get-product-offers/step/calculate-product-offers.js +53 -0
  86. package/.medusa/server/src/workflows/discount/index.js +28 -0
  87. package/.medusa/server/src/workflows/discount/remove-coupon/index.js +18 -0
  88. package/.medusa/server/src/workflows/discount/remove-coupon/step/remove-coupon-step.js +32 -0
  89. package/.medusa/server/src/workflows/discount/steps/validate-cart-exists.js +22 -0
  90. package/.medusa/server/src/workflows/discount/steps/validate-discount-code-exists.js +20 -0
  91. package/.medusa/server/src/workflows/discount/steps/validate-freebie-code-exists.js +16 -0
  92. package/.medusa/server/src/workflows/discount/steps/validate-same-prefix-rule-exists.js +20 -0
  93. package/.medusa/server/src/workflows/discount/update-discount-price-rule/index.js +42 -0
  94. package/.medusa/server/src/workflows/discount/update-discount-price-rule/steps/update-discount-price-rule-step.js +160 -0
  95. package/.medusa/server/src/workflows/discount/update-discount-price-rule/steps/validate-discount-price-rule-update-step.js +175 -0
  96. package/.medusa/server/src/workflows/discount/update-freebie-price-rule/index.js +44 -0
  97. package/.medusa/server/src/workflows/discount/update-freebie-price-rule/steps/update-freebie-price-rule-step.js +201 -0
  98. package/.medusa/server/src/workflows/discount/update-freebie-price-rule/steps/validate-freebie-rule-update-step.js +44 -0
  99. package/.medusa/server/src/workflows/index.js +18 -0
  100. package/.medusa/server/src/workflows/product/steps/validate-product-category-exists.js +26 -0
  101. package/.medusa/server/src/workflows/product/steps/validate-product-exists.js +28 -0
  102. package/.medusa/server/src/workflows/product/steps/validate-product-variant-exists.js +26 -0
  103. package/.medusa/server/src/workflows/steps/throw-error-step.js +9 -0
  104. package/README.md +64 -0
  105. package/package.json +87 -0
@@ -0,0 +1,649 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ApplyFreebieInputValidator = exports.AdminGetFreebieRulesParams = exports.ListFreebieRulesParams = exports.ListFreebieRulesDirectFields = exports.defaultFreebieRuleFields = exports.UpdateFreebieDetailsInputValidator = exports.UpdateFreebieDetailsBaseSchema = exports.CreateFreebieDetailsInputValidator = exports.AutoApplyDiscountInputValidator = exports.ListDiscountCodeParams = exports.ListDiscountCodeDirectFields = exports.defaultDiscountCodeFields = exports.RemoveDiscountInputValidator = exports.ApplyDiscountInputValidator = exports.AdminGetDiscountPriceRulesParams = exports.ListDiscountPriceRulesParams = exports.ListDiscountPriceRulesParamsFields = exports.ListDiscountPriceRulesDirectFields = exports.defaultDiscountPriceRuleFields = exports.UpdateDiscountPriceRuleInputValidator = exports.UpdateDiscountPriceRuleSchema = exports.AddMoreCodesToDiscountParamsValidator = exports.AddMoreCodesToDiscountParams = exports.AddMoreCodesToDiscountInputValidator = exports.CreateBulkDiscountDetailsInputValidator = exports.CreateDiscountDetailsInputValidator = exports.DiscountApplicableCategoriesType = exports.DiscountApplicableProductsType = exports.DiscountUsageLimitPerCartType = exports.DiscountUsageLimitType = exports.DiscountUsageLimitPerCustomerType = exports.DiscountAppliesOn = exports.DiscountType = exports.DiscountStatus = void 0;
4
+ const common_1 = require("@medusajs/medusa/api/utils/common-validators/common");
5
+ const validators_1 = require("@medusajs/medusa/api/utils/validators");
6
+ const zod_1 = require("zod");
7
+ // ##################### ENUMS #####################
8
+ exports.DiscountStatus = zod_1.z.enum(["ACTIVE", "EXPIRED", "SCHEDULED"]);
9
+ exports.DiscountType = zod_1.z.enum(["FIXED", "PERCENTAGE", "BXGY", "BXAY"]);
10
+ exports.DiscountAppliesOn = zod_1.z.enum(["MRP", "PRICE"]);
11
+ exports.DiscountUsageLimitPerCustomerType = zod_1.z.enum([
12
+ "ONLY_ONCE",
13
+ "UNLIMITED",
14
+ "SPECIFIC",
15
+ ]);
16
+ exports.DiscountUsageLimitType = zod_1.z.enum([
17
+ "ONLY_ONCE",
18
+ "UNLIMITED",
19
+ "SPECIFIC",
20
+ ]);
21
+ exports.DiscountUsageLimitPerCartType = zod_1.z.enum([
22
+ "ONLY_ONCE",
23
+ "UNLIMITED",
24
+ "SPECIFIC",
25
+ ]);
26
+ exports.DiscountApplicableProductsType = zod_1.z.enum([
27
+ "ALL",
28
+ "SPECIFIC",
29
+ "NONE",
30
+ ]);
31
+ exports.DiscountApplicableCategoriesType = zod_1.z.enum([
32
+ "ALL",
33
+ "SPECIFIC",
34
+ "NONE",
35
+ ]);
36
+ // ##################### ENUMS #####################
37
+ // Extract the base object schema for reuse
38
+ const CreateDiscountDetailsBaseSchema = zod_1.z.object({
39
+ title: zod_1.z.string().optional(),
40
+ description: zod_1.z.string().optional(),
41
+ type: exports.DiscountType,
42
+ starts_at: zod_1.z.string().datetime(),
43
+ ends_at: zod_1.z.string().datetime().optional(),
44
+ applies_on: exports.DiscountAppliesOn.optional().default(exports.DiscountAppliesOn.Values.PRICE),
45
+ min_order_value: zod_1.z.number().optional(),
46
+ min_order_qty: zod_1.z.number().optional(),
47
+ max_discount: zod_1.z.number().optional(),
48
+ usage_limit_per_customer_type: exports.DiscountUsageLimitPerCustomerType.optional().default(exports.DiscountUsageLimitPerCustomerType.Values.UNLIMITED),
49
+ usage_limit_per_customer_specific: zod_1.z.number().optional(),
50
+ usage_limit: exports.DiscountUsageLimitType.optional().default(exports.DiscountUsageLimitType.Values.UNLIMITED),
51
+ usage_limit_specific: zod_1.z.number().optional(),
52
+ usage_limit_per_cart_type: exports.DiscountUsageLimitPerCartType.optional().default(exports.DiscountUsageLimitPerCartType.Values.ONLY_ONCE),
53
+ usage_limit_per_cart_specific: zod_1.z.number().optional(),
54
+ get_percent: zod_1.z.number().optional(),
55
+ get_flat_discount: zod_1.z.number().optional(),
56
+ visibility: zod_1.z.boolean().default(false),
57
+ only_for_new_customer: zod_1.z.boolean().default(false),
58
+ auto_apply: zod_1.z.boolean().default(false),
59
+ applicable_on_bundle: zod_1.z.boolean().default(false),
60
+ buy_x: zod_1.z.number().optional(),
61
+ get_y: zod_1.z.number().optional(),
62
+ at_y: zod_1.z.number().optional(),
63
+ applicable_product_variant_ids: zod_1.z.array(zod_1.z.string()).optional(),
64
+ applicable_category_ids: zod_1.z.array(zod_1.z.string()).optional(),
65
+ applicable_customer_ids: zod_1.z.array(zod_1.z.string()).optional(),
66
+ code: zod_1.z.string(),
67
+ // id: z.string().optional(),
68
+ // created_by: z.string().optional(),
69
+ // updated_by: z.string().optional(),
70
+ // sales_generated: z.number().optional(),
71
+ });
72
+ const createPriceRuleSuperRefine = (data, ctx) => {
73
+ /* ─────────────────────────────────────────────────────────────
74
+ * 1‒5. Rules you already had (unchanged)
75
+ * ────────────────────────────────────────────────────────────*/
76
+ if (data.usage_limit_per_customer_type ===
77
+ exports.DiscountUsageLimitPerCustomerType.Values.SPECIFIC &&
78
+ (data.usage_limit_per_customer_specific == null ||
79
+ data.usage_limit_per_customer_specific == undefined)) {
80
+ ctx.addIssue({
81
+ code: zod_1.z.ZodIssueCode.custom,
82
+ message: "usage_limit_per_customer_specific is required when usage_limit_per_customer_type is SPECIFIC",
83
+ path: ["usage_limit_per_customer_specific"],
84
+ });
85
+ }
86
+ if (data.usage_limit === exports.DiscountUsageLimitType.Values.SPECIFIC &&
87
+ (data.usage_limit_specific == null ||
88
+ data.usage_limit_specific == undefined)) {
89
+ ctx.addIssue({
90
+ code: zod_1.z.ZodIssueCode.custom,
91
+ message: "usage_limit_specific is required when usage_limit is SPECIFIC",
92
+ path: ["usage_limit_specific"],
93
+ });
94
+ }
95
+ if (data.usage_limit_per_cart_type ===
96
+ exports.DiscountUsageLimitPerCartType.Values.SPECIFIC &&
97
+ (data.usage_limit_per_cart_specific == null ||
98
+ data.usage_limit_per_cart_specific == undefined)) {
99
+ ctx.addIssue({
100
+ code: zod_1.z.ZodIssueCode.custom,
101
+ message: "usage_limit_per_cart_specific is required when usage_limit_per_cart_type is SPECIFIC",
102
+ path: ["usage_limit_per_cart_specific"],
103
+ });
104
+ }
105
+ if (data.type === exports.DiscountType.Values.FIXED &&
106
+ (data.get_flat_discount == null || data.get_flat_discount == undefined)) {
107
+ ctx.addIssue({
108
+ code: zod_1.z.ZodIssueCode.custom,
109
+ message: "get_flat_discount is required for FIXED discount type",
110
+ path: ["get_flat_discount"],
111
+ });
112
+ }
113
+ if (data.type === exports.DiscountType.Values.PERCENTAGE) {
114
+ if (data.get_percent == null ||
115
+ data.get_percent > 100 ||
116
+ data.get_percent < 0) {
117
+ ctx.addIssue({
118
+ code: zod_1.z.ZodIssueCode.custom,
119
+ message: "get_percent is required for PERCENTAGE discount type and must be between 0-100",
120
+ path: ["get_percent"],
121
+ });
122
+ }
123
+ }
124
+ /* ─────────────────────────────────────────────────────────────
125
+ * 6. ends_at > starts_at (if ends_at provided)
126
+ * ────────────────────────────────────────────────────────────*/
127
+ if (data.ends_at &&
128
+ data.starts_at &&
129
+ new Date(data.ends_at) <= new Date(data.starts_at)) {
130
+ ctx.addIssue({
131
+ code: zod_1.z.ZodIssueCode.custom,
132
+ message: "ends_at must be later than starts_at",
133
+ path: ["ends_at"],
134
+ });
135
+ }
136
+ /* ─────────────────────────────────────────────────────────────
137
+ * 7. usage_limit_per_cart_type allowed values depend on discount type
138
+ * ────────────────────────────────────────────────────────────*/
139
+ if (data.usage_limit_per_cart_type) {
140
+ if ([
141
+ exports.DiscountType.Values.FIXED,
142
+ exports.DiscountType.Values.BXGY,
143
+ exports.DiscountType.Values.BXAY,
144
+ ].includes(data.type)) {
145
+ // For FIXED, BXGY, BXAY: all usage_limit_per_cart_type values allowed
146
+ // No validation needed here
147
+ }
148
+ else if (data.type === exports.DiscountType.Values.PERCENTAGE) {
149
+ // For PERCENTAGE: only ONLY_ONCE allowed
150
+ if (data.usage_limit_per_cart_type !== "ONLY_ONCE") {
151
+ ctx.addIssue({
152
+ code: zod_1.z.ZodIssueCode.custom,
153
+ message: "usage_limit_per_cart_type can only be 'ONLY_ONCE' when discount type is PERCENTAGE",
154
+ path: ["usage_limit_per_cart_type"],
155
+ });
156
+ }
157
+ }
158
+ else {
159
+ // For any other discount types (if any), disallow usage_limit_per_cart_type
160
+ ctx.addIssue({
161
+ code: zod_1.z.ZodIssueCode.custom,
162
+ message: `usage_limit_per_cart_type is not valid for discount type '${data.type}'`,
163
+ path: ["usage_limit_per_cart_type"],
164
+ });
165
+ }
166
+ }
167
+ /* ─────────────────────────────────────────────────────────────
168
+ * 8. BXGY / BXAY must have buy_x, get_y (and at_y for BXAY)
169
+ * ────────────────────────────────────────────────────────────*/
170
+ if (data.type === exports.DiscountType.Values.BXGY) {
171
+ if (data.buy_x == null || data.get_y == null) {
172
+ ctx.addIssue({
173
+ code: zod_1.z.ZodIssueCode.custom,
174
+ message: "buy_x and get_y are required for BXGY discounts",
175
+ path: ["buy_x"],
176
+ });
177
+ }
178
+ }
179
+ if (data.type === exports.DiscountType.Values.BXAY) {
180
+ if (data.buy_x == null || data.at_y == null) {
181
+ ctx.addIssue({
182
+ code: zod_1.z.ZodIssueCode.custom,
183
+ message: "buy_x and at_y are required for BXAY discounts",
184
+ path: ["buy_x"],
185
+ });
186
+ }
187
+ }
188
+ /* ─────────────────────────────────────────────────────────────
189
+ * 9. Product vs Category scope either works
190
+ * ────────────────────────────────────────────────────────────*/
191
+ if (data.applicable_product_variant_ids?.length &&
192
+ data.applicable_category_ids?.length) {
193
+ ctx.addIssue({
194
+ code: zod_1.z.ZodIssueCode.custom,
195
+ message: "You should provide either applicable_product_variant_ids or applicable_category_ids",
196
+ path: ["applicable_product_variant_ids"],
197
+ });
198
+ }
199
+ /* ─────────────────────────────────────────────────────────────
200
+ * 10. min / max sanity checks
201
+ * ────────────────────────────────────────────────────────────*/
202
+ if (data.min_order_value != null && data.min_order_value < 0) {
203
+ ctx.addIssue({
204
+ code: zod_1.z.ZodIssueCode.custom,
205
+ message: "min_order_value cannot be negative",
206
+ path: ["min_order_value"],
207
+ });
208
+ }
209
+ if (data.min_order_qty != null && data.min_order_qty < 0) {
210
+ ctx.addIssue({
211
+ code: zod_1.z.ZodIssueCode.custom,
212
+ message: "min_order_qty cannot be negative",
213
+ path: ["min_order_qty"],
214
+ });
215
+ }
216
+ if (data.max_discount != null && data.max_discount < 0) {
217
+ ctx.addIssue({
218
+ code: zod_1.z.ZodIssueCode.custom,
219
+ message: "max_discount cannot be negative",
220
+ path: ["max_discount"],
221
+ });
222
+ }
223
+ /* ─────────────────────────────────────────────────────────────
224
+ * 11. Mutual-exclusivity of value fields per discount type
225
+ * ────────────────────────────────────────────────────────────*/
226
+ if (data.type === exports.DiscountType.Values.FIXED) {
227
+ ["get_percent", "buy_x", "get_y", "at_y"].forEach((fld) => {
228
+ if (data[fld] != null) {
229
+ ctx.addIssue({
230
+ code: zod_1.z.ZodIssueCode.custom,
231
+ message: `${fld} must be null when discount type is FIXED`,
232
+ path: [fld],
233
+ });
234
+ }
235
+ });
236
+ }
237
+ if (data.type === exports.DiscountType.Values.PERCENTAGE) {
238
+ ["get_flat_discount", "buy_x", "get_y", "at_y"].forEach((fld) => {
239
+ if (data[fld] != null) {
240
+ ctx.addIssue({
241
+ code: zod_1.z.ZodIssueCode.custom,
242
+ message: `${fld} must be null when discount type is PERCENTAGE`,
243
+ path: [fld],
244
+ });
245
+ }
246
+ });
247
+ }
248
+ if (data.type === exports.DiscountType.Values.BXGY) {
249
+ ["get_percent", "get_flat_discount", "at_y"].forEach((fld) => {
250
+ if (data[fld] != null) {
251
+ ctx.addIssue({
252
+ code: zod_1.z.ZodIssueCode.custom,
253
+ message: `${fld} must be null when discount type is BXGY`,
254
+ path: [fld],
255
+ });
256
+ }
257
+ });
258
+ }
259
+ if (data.type === exports.DiscountType.Values.BXAY) {
260
+ ["get_percent", "get_flat_discount", "get_y"].forEach((fld) => {
261
+ if (data[fld] != null) {
262
+ ctx.addIssue({
263
+ code: zod_1.z.ZodIssueCode.custom,
264
+ message: `${fld} must be null when discount type is BXAY`,
265
+ path: [fld],
266
+ });
267
+ }
268
+ });
269
+ }
270
+ return data; // <- always return (even though Zod ignores it)
271
+ };
272
+ const createPriceRulePreprocessor = (input) => {
273
+ if (typeof input === "object" && input !== null && "type" in input) {
274
+ // If usage_limit_per_cart_type is missing, inject default based on type
275
+ if (!("usage_limit_per_cart_type" in input) ||
276
+ input.usage_limit_per_cart_type === undefined) {
277
+ if (["FIXED", "BXGY", "BXAY"].includes(input.type)) {
278
+ return { ...input, usage_limit_per_cart_type: "UNLIMITED" };
279
+ }
280
+ if (input.type === "PERCENTAGE") {
281
+ return { ...input, usage_limit_per_cart_type: "ONLY_ONCE" };
282
+ }
283
+ }
284
+ }
285
+ return input;
286
+ };
287
+ exports.CreateDiscountDetailsInputValidator = zod_1.z.preprocess(createPriceRulePreprocessor, CreateDiscountDetailsBaseSchema
288
+ /* ---------- consolidated refinements ---------- */
289
+ .superRefine(createPriceRuleSuperRefine));
290
+ const CreateBulkDiscountDetailsBaseSchema = CreateDiscountDetailsBaseSchema.omit({ code: true }).extend({
291
+ prefix: zod_1.z
292
+ .string()
293
+ .min(1, { message: "prefix cannot be empty" })
294
+ .describe("String prefix to use when generating each discount code"),
295
+ count: zod_1.z
296
+ .number()
297
+ .int()
298
+ .min(1, { message: "count must be at least 1" })
299
+ .describe("Number of discount codes to generate in bulk"),
300
+ });
301
+ exports.CreateBulkDiscountDetailsInputValidator = zod_1.z.preprocess(createPriceRulePreprocessor, CreateBulkDiscountDetailsBaseSchema.superRefine(createPriceRuleSuperRefine));
302
+ exports.AddMoreCodesToDiscountInputValidator = zod_1.z.object({
303
+ count: zod_1.z
304
+ .number()
305
+ .int()
306
+ .min(1, { message: "count must be at least 1" })
307
+ .describe("Number of discount codes to generate in bulk"),
308
+ });
309
+ exports.AddMoreCodesToDiscountParams = zod_1.z.object({
310
+ id: zod_1.z.string(),
311
+ });
312
+ exports.AddMoreCodesToDiscountParamsValidator = (0, validators_1.createFindParams)({}).merge(exports.AddMoreCodesToDiscountParams);
313
+ const updatePriceRuleSuperRefine = (data, ctx) => {
314
+ // if (data.min_order_qty != null && data.min_order_value != null) {
315
+ // ctx.addIssue({
316
+ // code: z.ZodIssueCode.custom,
317
+ // message: "min_order_qty and min_order_value cannot be used together",
318
+ // path: ["min_order_qty"],
319
+ // });
320
+ // }
321
+ return data;
322
+ };
323
+ // Use the base schema for update, then apply .partial().omit()
324
+ exports.UpdateDiscountPriceRuleSchema = zod_1.z.object({
325
+ title: zod_1.z.string().optional(),
326
+ description: zod_1.z.string().optional(),
327
+ starts_at: zod_1.z.string().datetime().optional(),
328
+ ends_at: zod_1.z.string().datetime().optional(),
329
+ applies_on: exports.DiscountAppliesOn.optional(),
330
+ min_order_value: zod_1.z.number().optional(),
331
+ min_order_qty: zod_1.z.number().optional(),
332
+ max_discount: zod_1.z.number().optional(),
333
+ usage_limit_per_customer_type: exports.DiscountUsageLimitPerCustomerType.optional(),
334
+ usage_limit_per_customer_specific: zod_1.z.number().optional(),
335
+ usage_limit: exports.DiscountUsageLimitType.optional(),
336
+ usage_limit_specific: zod_1.z.number().optional(),
337
+ usage_limit_per_cart_type: exports.DiscountUsageLimitPerCartType.optional(),
338
+ usage_limit_per_cart_specific: zod_1.z.number().optional(),
339
+ is_active: zod_1.z.boolean().optional(),
340
+ get_percent: zod_1.z.number().optional(),
341
+ get_flat_discount: zod_1.z.number().optional(),
342
+ visibility: zod_1.z.boolean().optional(),
343
+ only_for_new_customer: zod_1.z.boolean().optional(),
344
+ auto_apply: zod_1.z.boolean().optional(),
345
+ applicable_on_bundle: zod_1.z.boolean().optional(),
346
+ buy_x: zod_1.z.number().optional(),
347
+ get_y: zod_1.z.number().optional(),
348
+ at_y: zod_1.z.number().optional(),
349
+ applicable_product_variant_ids: zod_1.z.array(zod_1.z.string()).optional(),
350
+ applicable_category_ids: zod_1.z.array(zod_1.z.string()).optional(),
351
+ applicable_customer_ids: zod_1.z.array(zod_1.z.string()).optional(),
352
+ });
353
+ exports.UpdateDiscountPriceRuleInputValidator = exports.UpdateDiscountPriceRuleSchema.superRefine(updatePriceRuleSuperRefine);
354
+ exports.defaultDiscountPriceRuleFields = [
355
+ "id",
356
+ "title",
357
+ "description",
358
+ "type",
359
+ "starts_at",
360
+ "ends_at",
361
+ "status",
362
+ "applies_on",
363
+ "min_order_value",
364
+ "min_order_qty",
365
+ "max_discount",
366
+ "usage_limit_per_customer_type",
367
+ "usage_limit_per_customer_specific",
368
+ "usage_limit",
369
+ "usage_limit_specific",
370
+ "usage_limit_per_cart_type",
371
+ "usage_limit_per_cart_specific",
372
+ "get_percent",
373
+ "get_flat_discount",
374
+ "visibility",
375
+ "only_for_new_customer",
376
+ "auto_apply",
377
+ "applicable_on_bundle",
378
+ "buy_x",
379
+ "get_y",
380
+ "at_y",
381
+ // "applicable_product_variant_ids",
382
+ // "applicable_category_ids",
383
+ "created_at",
384
+ "updated_at",
385
+ "code_count",
386
+ "prefix",
387
+ "discount_code",
388
+ ];
389
+ exports.ListDiscountPriceRulesDirectFields = (0, common_1.applyAndAndOrOperators)(zod_1.z.object({
390
+ id: (0, validators_1.createOperatorMap)().optional(),
391
+ title: (0, validators_1.createOperatorMap)().optional(),
392
+ description: (0, validators_1.createOperatorMap)().optional(),
393
+ type: (0, validators_1.createOperatorMap)().optional(),
394
+ starts_at: (0, validators_1.createOperatorMap)().optional(),
395
+ ends_at: (0, validators_1.createOperatorMap)().optional(),
396
+ status: (0, validators_1.createOperatorMap)().optional(),
397
+ applies_on: (0, validators_1.createOperatorMap)().optional(),
398
+ min_order_value: (0, validators_1.createOperatorMap)().optional(),
399
+ min_order_qty: (0, validators_1.createOperatorMap)().optional(),
400
+ max_discount: (0, validators_1.createOperatorMap)().optional(),
401
+ usage_limit_per_customer_type: (0, validators_1.createOperatorMap)().optional(),
402
+ usage_limit_per_customer_specific: (0, validators_1.createOperatorMap)().optional(),
403
+ usage_limit: (0, validators_1.createOperatorMap)().optional(),
404
+ usage_limit_specific: (0, validators_1.createOperatorMap)().optional(),
405
+ usage_limit_per_cart_type: (0, validators_1.createOperatorMap)().optional(),
406
+ usage_limit_per_cart_specific: (0, validators_1.createOperatorMap)().optional(),
407
+ get_percent: (0, validators_1.createOperatorMap)().optional(),
408
+ get_flat_discount: (0, validators_1.createOperatorMap)().optional(),
409
+ visibility: (0, validators_1.createOperatorMap)().optional(),
410
+ only_for_new_customer: (0, validators_1.createOperatorMap)().optional(),
411
+ auto_apply: (0, validators_1.createOperatorMap)().optional(),
412
+ applicable_on_bundle: (0, validators_1.createOperatorMap)().optional(),
413
+ buy_x: (0, validators_1.createOperatorMap)().optional(),
414
+ get_y: (0, validators_1.createOperatorMap)().optional(),
415
+ at_y: (0, validators_1.createOperatorMap)().optional(),
416
+ prefix: (0, validators_1.createOperatorMap)().optional(),
417
+ code_count: (0, validators_1.createOperatorMap)().optional(),
418
+ created_at: (0, validators_1.createOperatorMap)().optional(),
419
+ updated_at: (0, validators_1.createOperatorMap)().optional(),
420
+ }));
421
+ exports.ListDiscountPriceRulesParamsFields = zod_1.z.object({
422
+ q: zod_1.z.string().optional(),
423
+ title: zod_1.z.string().optional(),
424
+ id: zod_1.z.string().optional(),
425
+ });
426
+ exports.ListDiscountPriceRulesParams = (0, validators_1.createFindParams)({
427
+ limit: 10,
428
+ offset: 0,
429
+ order: "-created_at",
430
+ })
431
+ .merge(exports.ListDiscountPriceRulesDirectFields)
432
+ .merge(exports.ListDiscountPriceRulesParamsFields);
433
+ exports.AdminGetDiscountPriceRulesParams = (0, validators_1.createFindParams)({
434
+ offset: 0,
435
+ limit: 50,
436
+ });
437
+ exports.ApplyDiscountInputValidator = zod_1.z.object({
438
+ code: zod_1.z.string(),
439
+ cart_id: zod_1.z.string(),
440
+ customerId: zod_1.z.string().optional(),
441
+ });
442
+ exports.RemoveDiscountInputValidator = zod_1.z.object({
443
+ cart_id: zod_1.z.string(),
444
+ code: zod_1.z.string().optional(),
445
+ });
446
+ exports.defaultDiscountCodeFields = ["code", "usage_count"];
447
+ exports.ListDiscountCodeDirectFields = (0, common_1.applyAndAndOrOperators)(zod_1.z.object({
448
+ code: (0, validators_1.createOperatorMap)().optional(),
449
+ usage_count: (0, validators_1.createOperatorMap)().optional(),
450
+ }));
451
+ exports.ListDiscountCodeParams = (0, validators_1.createFindParams)({
452
+ limit: 10,
453
+ offset: 0,
454
+ order: "-updated_at",
455
+ }).merge(exports.ListDiscountCodeDirectFields);
456
+ exports.AutoApplyDiscountInputValidator = zod_1.z.object({
457
+ cart_id: zod_1.z.string(),
458
+ });
459
+ // ###################################################
460
+ // ##################### FREEBIE #####################
461
+ // ###################################################
462
+ const createFreebieRuleSuperRefine = (data, ctx) => {
463
+ if (data.usage_limit === exports.DiscountUsageLimitType.Values.SPECIFIC &&
464
+ (data.usage_limit_specific == null ||
465
+ data.usage_limit_specific == undefined)) {
466
+ ctx.addIssue({
467
+ code: zod_1.z.ZodIssueCode.custom,
468
+ message: "usage_limit_specific is required when usage_limit is SPECIFIC",
469
+ path: ["usage_limit_specific"],
470
+ });
471
+ }
472
+ if (data.ends_at &&
473
+ data.starts_at &&
474
+ new Date(data.ends_at) <= new Date(data.starts_at)) {
475
+ ctx.addIssue({
476
+ code: zod_1.z.ZodIssueCode.custom,
477
+ message: "ends_at must be later than starts_at",
478
+ path: ["ends_at"],
479
+ });
480
+ }
481
+ if (data.applicable_product_variant_ids?.length &&
482
+ data.applicable_category_ids?.length) {
483
+ ctx.addIssue({
484
+ code: zod_1.z.ZodIssueCode.custom,
485
+ message: "You should provide either applicable_product_variant_ids or applicable_category_ids",
486
+ path: ["applicable_product_variant_ids"],
487
+ });
488
+ }
489
+ if (data.min_order_value != null && data.min_order_value < 0) {
490
+ ctx.addIssue({
491
+ code: zod_1.z.ZodIssueCode.custom,
492
+ message: "min_order_value cannot be negative",
493
+ path: ["min_order_value"],
494
+ });
495
+ }
496
+ if (data.min_order_qty != null && data.min_order_qty < 0) {
497
+ ctx.addIssue({
498
+ code: zod_1.z.ZodIssueCode.custom,
499
+ message: "min_order_qty cannot be negative",
500
+ path: ["min_order_qty"],
501
+ });
502
+ }
503
+ // if (data.min_order_qty != null && data.min_order_value != null) {
504
+ // ctx.addIssue({
505
+ // code: z.ZodIssueCode.custom,
506
+ // message: "min_order_qty and min_order_value cannot be used together",
507
+ // path: ["min_order_qty"],
508
+ // });
509
+ // }
510
+ return data; // <- always return (even though Zod ignores it)
511
+ };
512
+ const CreateFreebieDetailsBaseSchema = zod_1.z.object({
513
+ code: zod_1.z.string(),
514
+ description: zod_1.z.string().optional(),
515
+ starts_at: zod_1.z.string().datetime(),
516
+ ends_at: zod_1.z.string().datetime().optional(),
517
+ usage_limit: exports.DiscountUsageLimitType.optional().default(exports.DiscountUsageLimitType.Values.UNLIMITED),
518
+ usage_limit_specific: zod_1.z.number().optional(),
519
+ usage_limit_per_customer_type: exports.DiscountUsageLimitPerCustomerType.optional().default(exports.DiscountUsageLimitPerCustomerType.Values.UNLIMITED),
520
+ usage_limit_per_customer_specific: zod_1.z.number().optional(),
521
+ applies_on: exports.DiscountAppliesOn.optional().default(exports.DiscountAppliesOn.Values.PRICE),
522
+ min_order_value: zod_1.z.number().optional(),
523
+ min_order_qty: zod_1.z.number().optional(),
524
+ freebie_product_variant_ids: zod_1.z.array(zod_1.z.string()).min(1),
525
+ applicable_on_bundle: zod_1.z.boolean().default(false),
526
+ only_for_new_customer: zod_1.z.boolean().default(false),
527
+ applicable_product_variant_ids: zod_1.z.array(zod_1.z.string()).optional(),
528
+ applicable_category_ids: zod_1.z.array(zod_1.z.string()).optional(),
529
+ applicable_customer_ids: zod_1.z.array(zod_1.z.string()).optional(),
530
+ });
531
+ exports.CreateFreebieDetailsInputValidator = CreateFreebieDetailsBaseSchema.superRefine(createFreebieRuleSuperRefine);
532
+ const updateFreebieRuleSuperRefine = (data, ctx) => {
533
+ // if (data.min_order_qty != null && data.min_order_value != null) {
534
+ // ctx.addIssue({
535
+ // code: z.ZodIssueCode.custom,
536
+ // message: "min_order_qty and min_order_value cannot be used together",
537
+ // path: ["min_order_qty"],
538
+ // });
539
+ // }
540
+ if (data.usage_limit === exports.DiscountUsageLimitType.Values.SPECIFIC &&
541
+ (data.usage_limit_specific == null ||
542
+ data.usage_limit_specific == undefined)) {
543
+ ctx.addIssue({
544
+ code: zod_1.z.ZodIssueCode.custom,
545
+ message: "usage_limit_specific is required when usage_limit is SPECIFIC",
546
+ path: ["usage_limit_specific"],
547
+ });
548
+ }
549
+ if (data.usage_limit_per_customer_type ===
550
+ exports.DiscountUsageLimitPerCustomerType.Values.SPECIFIC &&
551
+ (data.usage_limit_per_customer_specific == null ||
552
+ data.usage_limit_per_customer_specific == undefined)) {
553
+ ctx.addIssue({
554
+ code: zod_1.z.ZodIssueCode.custom,
555
+ message: "usage_limit_per_customer_specific is required when usage_limit_per_customer_type is SPECIFIC",
556
+ path: ["usage_limit_per_customer_specific"],
557
+ });
558
+ }
559
+ if (data.applicable_product_variant_ids?.length &&
560
+ data.applicable_category_ids?.length) {
561
+ ctx.addIssue({
562
+ code: zod_1.z.ZodIssueCode.custom,
563
+ message: "You should provide either applicable_product_variant_ids or applicable_category_ids",
564
+ path: ["applicable_product_variant_ids"],
565
+ });
566
+ }
567
+ return data;
568
+ };
569
+ exports.UpdateFreebieDetailsBaseSchema = zod_1.z.object({
570
+ title: zod_1.z.string().optional(),
571
+ description: zod_1.z.string().optional(),
572
+ starts_at: zod_1.z.string().datetime().optional(),
573
+ ends_at: zod_1.z.string().datetime().optional(),
574
+ is_active: zod_1.z.boolean().optional(),
575
+ usage_limit: exports.DiscountUsageLimitType.optional(),
576
+ usage_limit_specific: zod_1.z.number().optional(),
577
+ usage_limit_per_customer_type: exports.DiscountUsageLimitPerCustomerType.optional(),
578
+ usage_limit_per_customer_specific: zod_1.z.number().optional(),
579
+ applies_on: exports.DiscountAppliesOn.optional(),
580
+ min_order_value: zod_1.z.number().positive().optional(),
581
+ min_order_qty: zod_1.z.number().positive().optional(),
582
+ freebie_product_variant_ids: zod_1.z.array(zod_1.z.string()).optional(),
583
+ applicable_on_bundle: zod_1.z.boolean().optional(),
584
+ only_for_new_customer: zod_1.z.boolean().optional(),
585
+ applicable_product_variant_ids: zod_1.z.array(zod_1.z.string()).optional(),
586
+ applicable_category_ids: zod_1.z.array(zod_1.z.string()).optional(),
587
+ applicable_customer_ids: zod_1.z.array(zod_1.z.string()).optional(),
588
+ });
589
+ exports.UpdateFreebieDetailsInputValidator = exports.UpdateFreebieDetailsBaseSchema.superRefine(updateFreebieRuleSuperRefine);
590
+ exports.defaultFreebieRuleFields = [
591
+ "id",
592
+ "code",
593
+ "description",
594
+ "starts_at",
595
+ "ends_at",
596
+ "status",
597
+ "applies_on",
598
+ "usage_limit",
599
+ "usage_limit_specific",
600
+ "usage_limit_per_customer_type",
601
+ "usage_limit_per_customer_specific",
602
+ "min_order_value",
603
+ "min_order_qty",
604
+ "only_for_new_customer",
605
+ "applicable_on_bundle",
606
+ "product_variants.*",
607
+ "product_categories.*",
608
+ "created_at",
609
+ "updated_at",
610
+ ];
611
+ exports.ListFreebieRulesDirectFields = (0, common_1.applyAndAndOrOperators)(zod_1.z.object({
612
+ id: (0, validators_1.createOperatorMap)().optional(),
613
+ code: (0, validators_1.createOperatorMap)().optional(),
614
+ description: (0, validators_1.createOperatorMap)().optional(),
615
+ starts_at: (0, validators_1.createOperatorMap)().optional(),
616
+ ends_at: (0, validators_1.createOperatorMap)().optional(),
617
+ status: (0, validators_1.createOperatorMap)().optional(),
618
+ applies_on: (0, validators_1.createOperatorMap)().optional(),
619
+ usage_limit: (0, validators_1.createOperatorMap)().optional(),
620
+ usage_limit_specific: (0, validators_1.createOperatorMap)().optional(),
621
+ usage_limit_per_customer_type: (0, validators_1.createOperatorMap)().optional(),
622
+ usage_limit_per_customer_specific: (0, validators_1.createOperatorMap)().optional(),
623
+ min_order_value: (0, validators_1.createOperatorMap)().optional(),
624
+ min_order_qty: (0, validators_1.createOperatorMap)().optional(),
625
+ only_for_new_customer: (0, validators_1.createOperatorMap)().optional(),
626
+ applicable_on_bundle: (0, validators_1.createOperatorMap)().optional(),
627
+ created_at: (0, validators_1.createOperatorMap)().optional(),
628
+ updated_at: (0, validators_1.createOperatorMap)().optional(),
629
+ }));
630
+ const ListFreebieRulesParamsFields = zod_1.z.object({
631
+ q: zod_1.z.string().optional(),
632
+ id: zod_1.z.string().optional(),
633
+ code: zod_1.z.string().optional(),
634
+ });
635
+ exports.ListFreebieRulesParams = (0, validators_1.createFindParams)({
636
+ limit: 10,
637
+ offset: 0,
638
+ order: "-created_at",
639
+ })
640
+ .merge(exports.ListFreebieRulesDirectFields)
641
+ .merge(ListFreebieRulesParamsFields);
642
+ exports.AdminGetFreebieRulesParams = (0, validators_1.createFindParams)();
643
+ exports.ApplyFreebieInputValidator = zod_1.z.object({
644
+ cart_id: zod_1.z.string(),
645
+ });
646
+ // ###################################################
647
+ // ##################### FREEBIE #####################
648
+ // ###################################################
649
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcGkvYWRtaW4vZGlzY291bnRzL3ZhbGlkYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsZ0ZBQTZGO0FBQzdGLHNFQUcrQztBQUMvQyw2QkFBd0I7QUFFeEIsb0RBQW9EO0FBRXZDLFFBQUEsY0FBYyxHQUFHLE9BQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7QUFHNUQsUUFBQSxZQUFZLEdBQUcsT0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFHL0QsUUFBQSxpQkFBaUIsR0FBRyxPQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFHN0MsUUFBQSxpQ0FBaUMsR0FBRyxPQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3RELFdBQVc7SUFDWCxXQUFXO0lBQ1gsVUFBVTtDQUNYLENBQUMsQ0FBQztBQUtVLFFBQUEsc0JBQXNCLEdBQUcsT0FBQyxDQUFDLElBQUksQ0FBQztJQUMzQyxXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7Q0FDWCxDQUFDLENBQUM7QUFHVSxRQUFBLDZCQUE2QixHQUFHLE9BQUMsQ0FBQyxJQUFJLENBQUM7SUFDbEQsV0FBVztJQUNYLFdBQVc7SUFDWCxVQUFVO0NBQ1gsQ0FBQyxDQUFDO0FBS1UsUUFBQSw4QkFBOEIsR0FBRyxPQUFDLENBQUMsSUFBSSxDQUFDO0lBQ25ELEtBQUs7SUFDTCxVQUFVO0lBQ1YsTUFBTTtDQUNQLENBQUMsQ0FBQztBQUlVLFFBQUEsZ0NBQWdDLEdBQUcsT0FBQyxDQUFDLElBQUksQ0FBQztJQUNyRCxLQUFLO0lBQ0wsVUFBVTtJQUNWLE1BQU07Q0FDUCxDQUFDLENBQUM7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