@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,244 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.calculateDiscount = void 0;
4
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
+ const validators_1 = require("../../../../api/admin/discounts/validators");
6
+ const utils_1 = require("../../../../lib/utils");
7
+ function calculateCartTotal(cartItems) {
8
+ return cartItems?.reduce((acc, item) => {
9
+ const { variant } = item || {};
10
+ const { extended_product_variants } = variant || {};
11
+ const { amount_eligible_for_discount = 0 } = extended_product_variants || {};
12
+ return acc + Number(amount_eligible_for_discount);
13
+ }, 0);
14
+ }
15
+ function filterApplicableCartLineItems(cart, priceRule) {
16
+ const { product_variants, product_categories } = priceRule;
17
+ let applicableCartLineItems = [...cart.items];
18
+ if (product_variants?.length) {
19
+ applicableCartLineItems = applicableCartLineItems.filter((item) => product_variants?.some((v) => v.id === item.variant_id));
20
+ }
21
+ if (product_categories?.length) {
22
+ applicableCartLineItems = applicableCartLineItems.filter((item) => product_categories?.some((v) => v.products?.some((p) => p.id === item.product_id)));
23
+ }
24
+ if (!priceRule.applicable_on_bundle) {
25
+ applicableCartLineItems = applicableCartLineItems.filter((item) => !item.metadata?.bundle_type);
26
+ }
27
+ return applicableCartLineItems.map((item) => {
28
+ const variantListingPrice = item?.variant?.extended_product_variants?.compare_at_price;
29
+ const isBundle = !!item.metadata?.bundle_type;
30
+ const mrp = isBundle ? item.compare_at_unit_price : variantListingPrice;
31
+ const isMrp = priceRule.applies_on == validators_1.DiscountAppliesOn.Values.MRP;
32
+ return {
33
+ ...item,
34
+ variant: {
35
+ ...item.variant,
36
+ extended_product_variants: {
37
+ ...item.variant.extended_product_variants,
38
+ compare_at_price: mrp,
39
+ amount_eligible_for_discount: (0, utils_1.toTwoDecimal)(Number((0, utils_1.toTwoDecimal)(Number(isMrp ? mrp : item.unit_price)) * Number(item.quantity || 1))),
40
+ },
41
+ },
42
+ };
43
+ });
44
+ }
45
+ exports.calculateDiscount = (0, workflows_sdk_1.createStep)("calculate-discount", async ({ priceRule, code, cart }, { container }) => {
46
+ const logger = container.resolve("logger");
47
+ logger.setLogLevel(process.env.LOG_LEVEL);
48
+ const { usage_limit_per_cart_type, usage_limit_per_cart_specific, get_flat_discount, buy_x, get_y, at_y, type, title, description, get_percent, max_discount, } = priceRule;
49
+ const adjustmentLineItems = [];
50
+ let totalDiscount = 0;
51
+ let applicableCartLineItems = filterApplicableCartLineItems(cart, priceRule);
52
+ const totalApplicableProductsQty = applicableCartLineItems.reduce((acc, { quantity }) => acc + Number(quantity || 0), 0);
53
+ let numberOfTimeCouponShouldApply = Math.min(totalApplicableProductsQty, usage_limit_per_cart_type ==
54
+ validators_1.DiscountUsageLimitPerCartType.Values.ONLY_ONCE
55
+ ? 1
56
+ : usage_limit_per_cart_specific || Infinity);
57
+ const cartTotal = calculateCartTotal(applicableCartLineItems);
58
+ switch (type) {
59
+ case validators_1.DiscountType.Values.FIXED:
60
+ totalDiscount = Math.min(get_flat_discount * numberOfTimeCouponShouldApply, cartTotal);
61
+ await Promise.all(applicableCartLineItems?.map(async (item) => {
62
+ const ratio = Number((Number(item.variant.extended_product_variants
63
+ .amount_eligible_for_discount) / Number(cartTotal)).toFixed(2));
64
+ const discount = ratio * totalDiscount;
65
+ adjustmentLineItems.push({
66
+ amount: discount,
67
+ code: code,
68
+ description: title || description || "Discount",
69
+ item_id: item.id,
70
+ promotion_id: priceRule.id,
71
+ });
72
+ }));
73
+ break;
74
+ case validators_1.DiscountType.Values.PERCENTAGE:
75
+ totalDiscount = Math.min((get_percent * cartTotal) / 100, max_discount || Infinity);
76
+ await Promise.all(applicableCartLineItems?.map(async (item) => {
77
+ const ratio = Number((Number(item.variant.extended_product_variants
78
+ .amount_eligible_for_discount) / Number(cartTotal)).toFixed(2));
79
+ const discount = ratio * totalDiscount;
80
+ adjustmentLineItems.push({
81
+ amount: discount,
82
+ code: code,
83
+ description: title || description || "Discount",
84
+ item_id: item.id,
85
+ promotion_id: priceRule.id,
86
+ });
87
+ }));
88
+ break;
89
+ case validators_1.DiscountType.Values.BXGY:
90
+ // This is a β€œBuy X, Get Y Free” coupon.
91
+ // We first count how many items the customer has.
92
+ // For every (X + Y) items, they get Y items free.
93
+ // We always give the free items starting from the cheapest ones.
94
+ // Example 1: Buy 2, Get 1 free (B2G1), used once
95
+ // If the cart has 3 to 6 items, the customer gets 1 free item (the cheapest).
96
+ // Example 2: B2G1, used twice
97
+ // If the cart has 6 or 7 items, the customer gets 2 free items (the cheapest ones).
98
+ // Example 3: Buy 3, Get 2 free (B3G2), used once
99
+ // If the cart has 5 items, the customer gets 2 free items (the cheapest).
100
+ const maxTimesCouponCanApply = Math.min(Math.floor(totalApplicableProductsQty / (buy_x + get_y)), numberOfTimeCouponShouldApply);
101
+ const sortedByUnitPrice = applicableCartLineItems.sort((a, b) => {
102
+ const aPrice = Number(a.variant.extended_product_variants.amount_eligible_for_discount);
103
+ const bPrice = Number(b.variant.extended_product_variants.amount_eligible_for_discount);
104
+ return aPrice - bPrice;
105
+ });
106
+ const numberOfFreeItems = Math.min(get_y * maxTimesCouponCanApply, totalApplicableProductsQty);
107
+ let iterator = 0;
108
+ for (const item of sortedByUnitPrice) {
109
+ const t = Math.min(Number(item.quantity), numberOfFreeItems - iterator);
110
+ if (t <= 0)
111
+ break;
112
+ iterator += t;
113
+ totalDiscount +=
114
+ t *
115
+ Number(item.variant.extended_product_variants
116
+ .amount_eligible_for_discount);
117
+ adjustmentLineItems.push({
118
+ amount: t *
119
+ Number(item.variant.extended_product_variants
120
+ .amount_eligible_for_discount),
121
+ code,
122
+ description: title || description || "Discount",
123
+ item_id: item.id,
124
+ promotion_id: priceRule.id,
125
+ });
126
+ }
127
+ break;
128
+ case validators_1.DiscountType.Values.BXAY:
129
+ /* ────────────────────────────────────────────────────────────────────────────────────|
130
+ * Apply a β€œBuy X At Y” (BXAY) discount, which may fire multiple times per cart. |
131
+ * ────────────────────────────────────────────────────────────────────────────────────|
132
+ * Example A: limit = 1 (β€œonly once”)
133
+ *
134
+ * Cart:
135
+ * - A: qty=1 @200 β†’ units [200]
136
+ * - B: qty=4 @300 β†’ units [300,300,300,300]
137
+ *
138
+ * buy_x = 2, at_y = 400, limit = 1
139
+ * totalQty = 5 β†’ maxPossibleBundles = 2
140
+ * times = min(2,1) = 1
141
+ * unitsNeeded = 1 * 2 = 2
142
+ *
143
+ * Flatten & sort: [200,300,300,300,300] β†’ select [200,300]
144
+ * sumPrices = 200 + 300 = 500
145
+ * bundleTotalPrice = 1 * 400 = 400
146
+ * totalBundleDiscount = 500 βˆ’ 400 = 100
147
+ *
148
+ * Shares:
149
+ * - A: 200/500 = 0.4 β†’ 0.4 * 100 = 40
150
+ * - B: 300/500 = 0.6 β†’ 0.6 * 100 = 60
151
+ *
152
+ *
153
+ * Example B: limit = 2 (β€œtwice”)
154
+ *
155
+ * Same cart & rule, but limit = 2
156
+ * totalQty = 5 β†’ maxPossibleBundles = 2
157
+ * times = min(2,2) = 2
158
+ * unitsNeeded = 2 * 2 = 4
159
+ *
160
+ * Flatten & sort: [200,300,300,300,300] β†’ select [200,300,300,300]
161
+ * sumPrices = 200 + 3*300 = 1100
162
+ * bundleTotalPrice = 2 * 400 = 800
163
+ * totalBundleDiscount = 1100 βˆ’ 800 = 300
164
+ *
165
+ * Shares:
166
+ * - A: 200/1100 β‰ˆ 0.1818 β†’ ~300 * 0.1818 β‰ˆ 54.55
167
+ * - B: 900/1100 β‰ˆ 0.8182 β†’ ~300 * 0.8182 β‰ˆ 245.45
168
+ *
169
+ * You can extend this to any n by adjusting `limit`. The algorithm
170
+ * automatically picks the cheapest `n * buy_x` units and splits the
171
+ * discount proportionally.
172
+ */
173
+ const bxayTimes = Math.min(Math.floor(totalApplicableProductsQty / (buy_x || 1)), numberOfTimeCouponShouldApply);
174
+ logger.info("times: " + bxayTimes);
175
+ // 1) Total times the bundle applies, and units per bundle
176
+ const unitsNeeded = buy_x * bxayTimes;
177
+ const units = [];
178
+ for (const item of applicableCartLineItems) {
179
+ const unitPrice = item.variant.extended_product_variants.amount_eligible_for_discount;
180
+ for (let i = 0; i < (Number(item.quantity) || 1); i++) {
181
+ units.push({ item, unitPrice: Number(unitPrice) });
182
+ }
183
+ }
184
+ // 3) Sort ascending by unitPrice
185
+ units.sort((a, b) => a.unitPrice - b.unitPrice);
186
+ // 4) Pick the cheapest `unitsNeeded` units
187
+ const selected = units.slice(0, unitsNeeded);
188
+ logger.info("selected: " + JSON.stringify(selected, null, 2));
189
+ // 5) Sum their original prices
190
+ const sumPrices = selected.reduce((sum, u) => sum + u.unitPrice, 0);
191
+ logger.info("sumPrices: " + sumPrices);
192
+ // 6) Compute total bundle price (you pay at_y per bundle)
193
+ const totalOfItemsAfterDiscount = at_y * bxayTimes;
194
+ logger.info("totalOfItemsAfterDiscount: " + totalOfItemsAfterDiscount);
195
+ // 7) Total discount to allocate
196
+ const totalBundleDiscount = sumPrices - totalOfItemsAfterDiscount;
197
+ logger.info("totalBundleDiscount: " + totalBundleDiscount);
198
+ // 8) Group back by line-item to allocate proportionally
199
+ const lineBuckets = {};
200
+ for (const { item, unitPrice } of selected) {
201
+ if (!lineBuckets[item.id]) {
202
+ lineBuckets[item.id] = { sumPrices: 0 };
203
+ }
204
+ lineBuckets[item.id].sumPrices += unitPrice;
205
+ }
206
+ logger.info("lineBuckets: " + JSON.stringify(lineBuckets, null, 2));
207
+ // 9) For each line, compute its share and create one adjustment
208
+ let allocated = 0;
209
+ for (const [itemId, { sumPrices: lineSum }] of Object.entries(lineBuckets)) {
210
+ const share = lineSum / sumPrices;
211
+ const lineDiscount = Math.round(totalBundleDiscount * share * 100) / 100;
212
+ allocated += lineDiscount;
213
+ logger.info("line items: " +
214
+ {
215
+ amount: lineDiscount,
216
+ code,
217
+ description: title || description || "Discount",
218
+ item_id: itemId,
219
+ promotion_id: priceRule.id,
220
+ });
221
+ adjustmentLineItems.push({
222
+ amount: lineDiscount,
223
+ code,
224
+ description: title || description || "Discount",
225
+ item_id: itemId,
226
+ promotion_id: priceRule.id,
227
+ });
228
+ }
229
+ // 10) Track overall discount
230
+ totalDiscount += allocated;
231
+ break;
232
+ default:
233
+ logger.error("Discount type not supported" + type);
234
+ break;
235
+ }
236
+ return new workflows_sdk_1.StepResponse({
237
+ hasError: false,
238
+ isApplied: true,
239
+ discount: totalDiscount,
240
+ adjustmentLineItems,
241
+ message: "Coupon Applied Successfully",
242
+ });
243
+ });
244
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbHktY291cG9uLXN0ZXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL2Rpc2NvdW50L2FwcGx5LWNvdXBvbi9zdGVwcy9hcHBseS1jb3Vwb24tc3RlcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFPQSxxRUFBNkU7QUFFN0UsMkVBSW9EO0FBRXBELGlEQUFxRDtBQXFCckQsU0FBUyxrQkFBa0IsQ0FBQyxTQUFxQztJQUMvRCxPQUFPLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBMkIsRUFBRSxFQUFFO1FBQzVELE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQy9CLE1BQU0sRUFBRSx5QkFBeUIsRUFBRSxHQUFHLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFDcEQsTUFBTSxFQUFFLDRCQUE0QixHQUFHLENBQUMsRUFBRSxHQUN4Qyx5QkFBeUIsSUFBSSxFQUFFLENBQUM7UUFFbEMsT0FBTyxHQUFHLEdBQUcsTUFBTSxDQUFDLDRCQUE0QixDQUFDLENBQUM7SUFDcEQsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ1IsQ0FBQztBQUVELFNBQVMsNkJBQTZCLENBQ3BDLElBVUMsRUFDRCxTQUdDO0lBRUQsTUFBTSxFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLEdBQUcsU0FBUyxDQUFDO0lBRTNELElBQUksdUJBQXVCLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUU5QyxJQUFJLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxDQUFDO1FBQzdCLHVCQUF1QixHQUFHLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQ2hFLGdCQUFnQixFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxJQUFJLENB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
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
4
+ const generateAdjustmentLineItem = (0, workflows_sdk_1.createStep)("generate-adjustment-line-item", async (input, { container }) => {
5
+ const cartService = container.resolve("cart");
6
+ console.log("input", input);
7
+ const adjustmentLineItems = await Promise.all(input.map(async (item) => {
8
+ return await cartService.addLineItemAdjustments({
9
+ amount: item.amount,
10
+ code: item.code,
11
+ description: item.description,
12
+ item_id: item.item_id,
13
+ promotion_id: item.promotion_id,
14
+ });
15
+ }));
16
+ return new workflows_sdk_1.StepResponse(adjustmentLineItems, input.map((item) => item.item_id));
17
+ }, async (input, { container }) => {
18
+ const cartService = container.resolve("cart");
19
+ const query = container.resolve("query");
20
+ const { data: cart_line_item_adjustment } = await query.graph({
21
+ entity: "line_item_adjustment",
22
+ fields: ["*"],
23
+ filters: { item_id: { $in: input } },
24
+ });
25
+ await cartService.deleteLineItemAdjustments(cart_line_item_adjustment.map((item) => item.id));
26
+ });
27
+ exports.default = generateAdjustmentLineItem;
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGUtYWRqdXN0bWVudC1saW5lLWl0ZW0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL2Rpc2NvdW50L2FwcGx5LWNvdXBvbi9zdGVwcy9nZW5lcmF0ZS1hZGp1c3RtZW50LWxpbmUtaXRlbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHFFQUE2RTtBQUc3RSxNQUFNLDBCQUEwQixHQUFHLElBQUEsMEJBQVUsRUFDM0MsK0JBQStCLEVBQy9CLEtBQUssRUFDSCxLQU1HLEVBQ0gsRUFBRSxTQUFTLEVBQUUsRUFDYixFQUFFO0lBQ0YsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUU5QyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUU1QixNQUFNLG1CQUFtQixHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDM0MsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUU7UUFDdkIsT0FBTyxNQUFNLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQztZQUM5QyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQzdCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVk7U0FDaEMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUVGLE9BQU8sSUFBSSw0QkFBWSxDQUNyQixtQkFBbUIsRUFDbkIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUNsQyxDQUFDO0FBQ0osQ0FBQyxFQUNELEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFO0lBQzdCLE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUMsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUV6QyxNQUFNLEVBQUUsSUFBSSxFQUFFLHlCQUF5QixFQUFFLEdBQUcsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQzVELE1BQU0sRUFBRSxzQkFBc0I7UUFDOUIsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDO1FBQ2IsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFO0tBQ3JDLENBQUMsQ0FBQztJQUVILE1BQU0sV0FBVyxDQUFDLHlCQUF5QixDQUN6Qyx5QkFBeUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FDakQsQ0FBQztBQUNKLENBQUMsQ0FDRixDQUFDO0FBRUYsa0JBQWUsMEJBQTBCLENBQUMifQ==
@@ -0,0 +1,212 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateCouponStep = void 0;
4
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
+ const validators_1 = require("../../../../api/admin/discounts/validators");
6
+ exports.validateCouponStep = (0, workflows_sdk_1.createStep)("validate-coupon-step", async ({ code, cart, priceRule, customerId }, { container }) => {
7
+ const query = container.resolve("query");
8
+ /* ─────────────────────────────────────────────────────────────
9
+ * Check Coupon Existence
10
+ * ────────────────────────────────────────────────────────────*/
11
+ if (!code) {
12
+ return new workflows_sdk_1.StepResponse({
13
+ isValid: false,
14
+ hasError: true,
15
+ message: "Coupon not found",
16
+ });
17
+ }
18
+ const { data: [discountCode], } = await query.graph({
19
+ entity: "discount_code",
20
+ fields: ["*"],
21
+ filters: { code, price_rule_id: priceRule.id },
22
+ });
23
+ if (!discountCode) {
24
+ return new workflows_sdk_1.StepResponse({
25
+ isValid: false,
26
+ hasError: true,
27
+ message: "Coupon not found under the price rule.",
28
+ });
29
+ }
30
+ /* ─────────────────────────────────────────────────────────────
31
+ * Check Price Rule Status
32
+ * ────────────────────────────────────────────────────────────*/
33
+ if (priceRule.status !== validators_1.DiscountStatus.Values.ACTIVE) {
34
+ return new workflows_sdk_1.StepResponse({
35
+ isValid: false,
36
+ hasError: true,
37
+ message: `Discount code is in ${priceRule.status} status.`,
38
+ });
39
+ }
40
+ /* ─────────────────────────────────────────────────────────────
41
+ * Check Coupon Usage Limit
42
+ * ────────────────────────────────────────────────────────────*/
43
+ const { usage_limit: limitMode, usage_limit_specific } = priceRule;
44
+ const { usage_count } = discountCode;
45
+ const limitReached = (() => {
46
+ switch (limitMode) {
47
+ case "UNLIMITED":
48
+ return false; // no cap
49
+ case "ONLY_ONCE":
50
+ return usage_count >= 1; // hard-coded single use
51
+ case "SPECIFIC":
52
+ // treat null/undefined as β€œno cap” for safety
53
+ if (typeof usage_limit_specific !== "number")
54
+ return false;
55
+ return usage_count >= usage_limit_specific; // respect custom cap
56
+ default:
57
+ return false; // fallback – shouldn’t happen
58
+ }
59
+ })();
60
+ if (limitReached) {
61
+ return new workflows_sdk_1.StepResponse({
62
+ isValid: false,
63
+ hasError: true,
64
+ message: limitMode === "ONLY_ONCE"
65
+ ? "Coupon can only be used once."
66
+ : "Coupon usage limit reached.",
67
+ });
68
+ }
69
+ /* ──────────────────────────────────────────────────────────────
70
+ * Check Customer Existence
71
+ * ─────────────────────────────────────────────────────────────*/
72
+ if (priceRule.customers && priceRule.customers.length > 0) {
73
+ console.log("====> code: ", code);
74
+ console.log("===> priceRule.customers: ", priceRule.customers.map((customer) => customer.id));
75
+ console.log("===> customerId: ", customerId);
76
+ if (!customerId) {
77
+ return new workflows_sdk_1.StepResponse({
78
+ isValid: false,
79
+ hasError: true,
80
+ message: "Need to Login to use this coupon.",
81
+ });
82
+ }
83
+ if (!priceRule.customers.some((customer) => customer.id === customerId)) {
84
+ return new workflows_sdk_1.StepResponse({
85
+ isValid: false,
86
+ hasError: true,
87
+ message: "Coupon is not applicable for this customer.",
88
+ });
89
+ }
90
+ console.log("===> o <====");
91
+ }
92
+ /* ──────────────────────────────────────────────────────────────
93
+ * Check Cart Values
94
+ * ─────────────────────────────────────────────────────────────*/
95
+ if (priceRule.min_order_value != null &&
96
+ priceRule.min_order_value != undefined) {
97
+ let cartTotal = 0;
98
+ if (cart.items && cart.items.length > 0) {
99
+ cartTotal = cart.items.reduce((total, item) => {
100
+ let price = 0;
101
+ if (priceRule.applies_on == validators_1.DiscountAppliesOn.Values.MRP) {
102
+ let variantListingPrice = item?.variant?.extended_product_variants?.compare_at_price;
103
+ const isBundle = !!item.metadata?.bundle_type;
104
+ price = isBundle
105
+ ? Number(item.compare_at_unit_price)
106
+ : Number(variantListingPrice);
107
+ }
108
+ if (priceRule.applies_on == validators_1.DiscountAppliesOn.Values.PRICE)
109
+ price = Number(item.unit_price) || 0;
110
+ return total + Number(price) * Number(item.quantity || 1);
111
+ }, 0);
112
+ }
113
+ if (priceRule.min_order_value && cartTotal < priceRule.min_order_value) {
114
+ return new workflows_sdk_1.StepResponse({
115
+ isValid: false,
116
+ hasError: true,
117
+ message: `Minimum order value of ${priceRule.min_order_value} is required.`,
118
+ });
119
+ }
120
+ }
121
+ /* ──────────────────────────────────────────────────────────────
122
+ * Check Cart Quantity
123
+ * ─────────────────────────────────────────────────────────────*/
124
+ if (priceRule.min_order_qty != null &&
125
+ priceRule.min_order_qty != undefined) {
126
+ let cartTotalQuantity = 0;
127
+ if (cart.items && cart.items.length > 0) {
128
+ cartTotalQuantity = cart.items.reduce((total, item) => {
129
+ const isBundle = !!item.metadata?.bundle_type;
130
+ return (total +
131
+ Number(isBundle
132
+ ? (item?.variant?.extended_product_variants
133
+ ?.products_per_bundle || 1) * (item.quantity || 1)
134
+ : item.quantity || 1));
135
+ }, 0);
136
+ }
137
+ if (priceRule.min_order_qty &&
138
+ cartTotalQuantity < priceRule.min_order_qty) {
139
+ return new workflows_sdk_1.StepResponse({
140
+ isValid: false,
141
+ hasError: true,
142
+ message: `Minimum order Product quantity of ${priceRule.min_order_qty} is required to use this coupon.`,
143
+ });
144
+ }
145
+ }
146
+ /* ──────────────────────────────────────────────────────────────
147
+ * Only for New Customer Check
148
+ * ─────────────────────────────────────────────────────────────*/
149
+ if (priceRule.only_for_new_customer && !customerId) {
150
+ return new workflows_sdk_1.StepResponse({
151
+ isValid: false,
152
+ hasError: true,
153
+ message: "Customer ID is required for new customer coupon validation.",
154
+ });
155
+ }
156
+ if (priceRule.only_for_new_customer && customerId) {
157
+ const { data: orders } = await query.graph({
158
+ entity: "order",
159
+ fields: ["*"],
160
+ filters: { customer_id: customerId },
161
+ pagination: { take: 1 },
162
+ });
163
+ if (orders.length > 0) {
164
+ return new workflows_sdk_1.StepResponse({
165
+ isValid: false,
166
+ hasError: true,
167
+ message: "Customer has already placed an order. cannot use new customer coupon.",
168
+ });
169
+ }
170
+ }
171
+ /* ─────────────────────────────────────────────────────────────
172
+ * Check User Specific Coupon Code Usage Limit
173
+ * ────────────────────────────────────────────────────────────*/
174
+ if ((priceRule.usage_limit_per_customer_type ==
175
+ validators_1.DiscountUsageLimitPerCustomerType.Values.SPECIFIC ||
176
+ priceRule.usage_limit_per_customer_type ==
177
+ validators_1.DiscountUsageLimitPerCustomerType.Values.ONLY_ONCE) &&
178
+ !customerId) {
179
+ return new workflows_sdk_1.StepResponse({
180
+ isValid: false,
181
+ hasError: true,
182
+ message: "Customer ID is required for this coupon usage limit type.",
183
+ });
184
+ }
185
+ if (customerId &&
186
+ (priceRule.usage_limit_per_customer_type ==
187
+ validators_1.DiscountUsageLimitPerCustomerType.Values.SPECIFIC ||
188
+ priceRule.usage_limit_per_customer_type ==
189
+ validators_1.DiscountUsageLimitPerCustomerType.Values.ONLY_ONCE)) {
190
+ const { data: orders } = await query.graph({
191
+ entity: "order",
192
+ fields: ["id"],
193
+ filters: { customer_id: customerId, status: "completed" },
194
+ pagination: {
195
+ take: priceRule?.usage_limit_per_customer_specific || 1,
196
+ },
197
+ });
198
+ if (orders.length >= (priceRule.usage_limit_per_customer_specific || 1)) {
199
+ return new workflows_sdk_1.StepResponse({
200
+ isValid: false,
201
+ hasError: true,
202
+ message: "Customer has reached the usage limit for this coupon.",
203
+ });
204
+ }
205
+ }
206
+ return new workflows_sdk_1.StepResponse({
207
+ isValid: true,
208
+ hasError: false,
209
+ message: "Coupon is valid.",
210
+ });
211
+ });
212
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUtY291cG9uLXN0ZXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL2Rpc2NvdW50L2FwcGx5LWNvdXBvbi9zdGVwcy92YWxpZGF0ZS1jb3Vwb24tc3RlcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFRQSxxRUFBNkU7QUFFN0UsMkVBSW9EO0FBd0J2QyxRQUFBLGtCQUFrQixHQUFHLElBQUEsMEJBQVUsRUFDMUMsc0JBQXNCLEVBQ3RCLEtBQUssRUFDSCxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBMkIsRUFDOUQsRUFBRSxTQUFTLEVBQUUsRUFDYixFQUFFO0lBQ0YsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUV6Qzs7cUVBRWlFO0lBQ2pFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNWLE9BQU8sSUFBSSw0QkFBWSxDQUFDO1lBQ3RCLE9BQU8sRUFBRSxLQUFLO1lBQ2QsUUFBUSxFQUFFLElBQUk7WUFDZCxPQUFPLEVBQUUsa0JBQWtCO1NBQzVCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxNQUFNLEVBQ0osSUFBSSxFQUFFLENBQUMsWUFBWSxDQUFDLEdBQ3JCLEdBQUcsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQ3BCLE1BQU0sRUFBRSxlQUFlO1FBQ3ZCLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQztRQUNiLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsU0FBUyxDQUFDLEVBQUUsRUFBRTtLQUMvQyxDQUFDLENBQUM7SUFFSCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDbEIsT0FBTyxJQUFJLDRCQUFZLENBQUM7WUFDdEIsT0FBTyxFQUFFLEtBQUs7WUFDZCxRQUFRLEVBQUUsSUFBSTtZQUNkLE9BQU8sRUFBRSx3Q0FBd0M7U0FDbEQs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
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.applyFreebieWorkflow = void 0;
4
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
+ const core_flows_1 = require("@medusajs/medusa/core-flows");
6
+ const add_freebie_items_to_cart_1 = require("./steps/add-freebie-items-to-cart");
7
+ const remove_freebie_from_cart_1 = require("./steps/remove-freebie-from-cart");
8
+ exports.applyFreebieWorkflow = (0, workflows_sdk_1.createWorkflow)("apply-freebie", (input) => {
9
+ const { data: carts } = (0, core_flows_1.useQueryGraphStep)({
10
+ entity: "cart",
11
+ fields: [
12
+ "*",
13
+ "items.*",
14
+ "items.variant.*",
15
+ "items.variant.prices.*",
16
+ "items.variant.extended_product_variants.compare_at_price",
17
+ ],
18
+ filters: { id: input.cart_id },
19
+ options: { throwIfKeyNotFound: true },
20
+ }).config({ name: "get-cart" });
21
+ const cart = (0, workflows_sdk_1.transform)({ carts }, ({ carts }) => carts[0]);
22
+ (0, remove_freebie_from_cart_1.removeFreebieFromCartStep)({ cart });
23
+ (0, add_freebie_items_to_cart_1.addFreebieItemsToCartStep)({ cart, customerId: input.customerId });
24
+ const { data: refetchedCart } = (0, core_flows_1.useQueryGraphStep)({
25
+ entity: "cart",
26
+ fields: ["*", "items.*"],
27
+ filters: { id: input.cart_id },
28
+ }).config({ name: "refetch-cart" });
29
+ return new workflows_sdk_1.WorkflowResponse(refetchedCart);
30
+ });
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL2Rpc2NvdW50L2FwcGx5LWZyZWViaWUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBSTJDO0FBQzNDLDREQUFnRTtBQUVoRSxpRkFBOEU7QUFDOUUsK0VBQTZFO0FBRWhFLFFBQUEsb0JBQW9CLEdBQUcsSUFBQSw4QkFBYyxFQUNoRCxlQUFlLEVBQ2YsQ0FBQyxLQUErQyxFQUFFLEVBQUU7SUFDbEQsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFBLDhCQUFpQixFQUFDO1FBQ3hDLE1BQU0sRUFBRSxNQUFNO1FBQ2QsTUFBTSxFQUFFO1lBQ04sR0FBRztZQUNILFNBQVM7WUFDVCxpQkFBaUI7WUFDakIsd0JBQXdCO1lBQ3hCLDBEQUEwRDtTQUMzRDtRQUNELE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFO1FBQzlCLE9BQU8sRUFBRSxFQUFFLGtCQUFrQixFQUFFLElBQUksRUFBRTtLQUN0QyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFFaEMsTUFBTSxJQUFJLEdBQUcsSUFBQSx5QkFBUyxFQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUUzRCxJQUFBLG9EQUF5QixFQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUVwQyxJQUFBLHFEQUF5QixFQUFDLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUVsRSxNQUFNLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxHQUFHLElBQUEsOEJBQWlCLEVBQUM7UUFDaEQsTUFBTSxFQUFFLE1BQU07UUFDZCxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDO1FBQ3hCLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFO0tBQy9CLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQztJQUVwQyxPQUFPLElBQUksZ0NBQWdCLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDN0MsQ0FBQyxDQUNGLENBQUMifQ==