@lodashventure/medusa-campaign 1.5.5 → 1.5.7
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.
- package/.medusa/server/src/admin/index.js +54 -9
- package/.medusa/server/src/admin/index.mjs +54 -9
- package/.medusa/server/src/api/admin/coupons/[id]/route.js +2 -1
- package/.medusa/server/src/api/admin/coupons/route.js +16 -2
- package/.medusa/server/src/workflows/custom-campaign/createCouponCampaignWorkflow.js +10 -2
- package/.medusa/server/src/workflows/custom-campaign/createCustomCampaignWorkflow.js +2 -2
- package/.medusa/server/src/workflows/custom-campaign/updateCouponCampaignWorkflow.js +10 -2
- package/.medusa/server/src/workflows/custom-campaign/updateCustomFlashSaleWorkflow.js +2 -2
- package/package.json +23 -23
- package/src/admin/components/CouponForm.tsx +58 -2
- package/src/admin/components/campaign-image-uploader.tsx +13 -14
- package/src/admin/routes/coupons/[id]/page.tsx +1 -0
- package/src/api/admin/coupons/[id]/route.ts +1 -0
- package/src/api/admin/coupons/route.ts +18 -1
- package/src/workflows/custom-campaign/createCouponCampaignWorkflow.ts +21 -6
- package/src/workflows/custom-campaign/createCustomCampaignWorkflow.ts +1 -1
- package/src/workflows/custom-campaign/updateCouponCampaignWorkflow.ts +17 -2
- package/src/workflows/custom-campaign/updateCustomFlashSaleWorkflow.ts +1 -1
|
@@ -432,8 +432,9 @@ const couponSchema = z__default.default.object({
|
|
|
432
432
|
currency_code: z__default.default.string().optional(),
|
|
433
433
|
starts_at: z__default.default.string().min(1, "Start date is required"),
|
|
434
434
|
ends_at: z__default.default.string().min(1, "End date is required"),
|
|
435
|
-
allocation: z__default.default.enum(["each", "across"]).optional(),
|
|
436
|
-
target_type: z__default.default.enum(["order", "items"]).optional()
|
|
435
|
+
allocation: z__default.default.enum(["each", "once", "across"]).optional(),
|
|
436
|
+
target_type: z__default.default.enum(["order", "items"]).optional(),
|
|
437
|
+
max_quantity: z__default.default.number().int("Max quantity must be an integer").positive("Max quantity must be at least 1").optional()
|
|
437
438
|
}).superRefine((data, ctx) => {
|
|
438
439
|
if (new Date(data.ends_at) < new Date(data.starts_at)) {
|
|
439
440
|
ctx.addIssue({
|
|
@@ -449,6 +450,14 @@ const couponSchema = z__default.default.object({
|
|
|
449
450
|
message: "Currency is required for fixed discount"
|
|
450
451
|
});
|
|
451
452
|
}
|
|
453
|
+
const requiresMaxQuantity = data.allocation === "each" || data.allocation === "once";
|
|
454
|
+
if (requiresMaxQuantity && !data.max_quantity) {
|
|
455
|
+
ctx.addIssue({
|
|
456
|
+
code: z__default.default.ZodIssueCode.custom,
|
|
457
|
+
path: ["max_quantity"],
|
|
458
|
+
message: "Max quantity is required when allocation is Each Item or Once"
|
|
459
|
+
});
|
|
460
|
+
}
|
|
452
461
|
});
|
|
453
462
|
const CouponForm = ({
|
|
454
463
|
initialData,
|
|
@@ -476,12 +485,14 @@ const CouponForm = ({
|
|
|
476
485
|
starts_at: (initialData == null ? void 0 : initialData.starts_at) ?? dayjs__default.default().startOf("day").format("YYYY-MM-DDTHH:mm"),
|
|
477
486
|
ends_at: (initialData == null ? void 0 : initialData.ends_at) ?? dayjs__default.default().endOf("day").format("YYYY-MM-DDTHH:mm"),
|
|
478
487
|
allocation: (initialData == null ? void 0 : initialData.allocation) === "total" ? "across" : (initialData == null ? void 0 : initialData.allocation) ?? "across",
|
|
479
|
-
target_type: (initialData == null ? void 0 : initialData.target_type) ?? "order"
|
|
488
|
+
target_type: (initialData == null ? void 0 : initialData.target_type) ?? "order",
|
|
489
|
+
max_quantity: (initialData == null ? void 0 : initialData.max_quantity) ?? 1
|
|
480
490
|
}
|
|
481
491
|
});
|
|
482
492
|
const discountType = watch("discount_type");
|
|
483
493
|
const startsAt = watch("starts_at");
|
|
484
494
|
const endsAt = watch("ends_at");
|
|
495
|
+
const allocation = watch("allocation");
|
|
485
496
|
const handleDateTimeChange = (field, type, value) => {
|
|
486
497
|
const currentValue = watch(field);
|
|
487
498
|
if (type === "date") {
|
|
@@ -493,7 +504,11 @@ const CouponForm = ({
|
|
|
493
504
|
}
|
|
494
505
|
};
|
|
495
506
|
const onFormSubmit = (data) => {
|
|
496
|
-
|
|
507
|
+
const shouldIncludeMaxQuantity = data.allocation === "each" || data.allocation === "once";
|
|
508
|
+
onSubmit({
|
|
509
|
+
...data,
|
|
510
|
+
max_quantity: shouldIncludeMaxQuantity ? data.max_quantity : void 0
|
|
511
|
+
});
|
|
497
512
|
};
|
|
498
513
|
const onFormError = () => {
|
|
499
514
|
const errorMessages = Object.values(errors).map((err) => err == null ? void 0 : err.message).filter(Boolean).join(", ");
|
|
@@ -655,7 +670,8 @@ const CouponForm = ({
|
|
|
655
670
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Select.Trigger, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Value, { placeholder: "Select allocation" }) }),
|
|
656
671
|
/* @__PURE__ */ jsxRuntime.jsxs(ui.Select.Content, { children: [
|
|
657
672
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "across", children: "Across Order" }),
|
|
658
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "each", children: "Each Item" })
|
|
673
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "each", children: "Each Item" }),
|
|
674
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "once", children: "Once per order" })
|
|
659
675
|
] })
|
|
660
676
|
]
|
|
661
677
|
}
|
|
@@ -689,6 +705,30 @@ const CouponForm = ({
|
|
|
689
705
|
)
|
|
690
706
|
] })
|
|
691
707
|
] }),
|
|
708
|
+
(allocation === "each" || allocation === "once") && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-2 gap-4", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2", children: [
|
|
709
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Label, { children: "Max Quantity" }),
|
|
710
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
711
|
+
reactHookForm.Controller,
|
|
712
|
+
{
|
|
713
|
+
name: "max_quantity",
|
|
714
|
+
control,
|
|
715
|
+
render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
716
|
+
ui.Input,
|
|
717
|
+
{
|
|
718
|
+
type: "number",
|
|
719
|
+
min: 1,
|
|
720
|
+
step: 1,
|
|
721
|
+
value: field.value ?? "",
|
|
722
|
+
onChange: (e) => field.onChange(
|
|
723
|
+
e.target.value === "" ? void 0 : Number(e.target.value)
|
|
724
|
+
),
|
|
725
|
+
disabled
|
|
726
|
+
}
|
|
727
|
+
)
|
|
728
|
+
}
|
|
729
|
+
),
|
|
730
|
+
errors.max_quantity && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-red-500 text-sm mt-1", children: errors.max_quantity.message })
|
|
731
|
+
] }) }),
|
|
692
732
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-end gap-2", children: [
|
|
693
733
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Button, { variant: "secondary", type: "button", onClick: onCancel, children: "Cancel" }),
|
|
694
734
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Button, { type: "submit", disabled, children: "Save Coupon" })
|
|
@@ -1046,7 +1086,9 @@ const CampaignImageUploader = ({
|
|
|
1046
1086
|
const newImageUrl = imageType === "image" ? (_a = result.campaign_detail) == null ? void 0 : _a.image_url : (_b = result.campaign_detail) == null ? void 0 : _b.thumbnail_url;
|
|
1047
1087
|
setDisplayImage(newImageUrl);
|
|
1048
1088
|
setPreviewUrl(null);
|
|
1049
|
-
|
|
1089
|
+
if (onSuccess) {
|
|
1090
|
+
await onSuccess();
|
|
1091
|
+
}
|
|
1050
1092
|
setTimeout(() => {
|
|
1051
1093
|
onClose();
|
|
1052
1094
|
}, 1e3);
|
|
@@ -1078,7 +1120,9 @@ const CampaignImageUploader = ({
|
|
|
1078
1120
|
if (response.ok) {
|
|
1079
1121
|
setDisplayImage(null);
|
|
1080
1122
|
setPreviewUrl(null);
|
|
1081
|
-
|
|
1123
|
+
if (onSuccess) {
|
|
1124
|
+
await onSuccess();
|
|
1125
|
+
}
|
|
1082
1126
|
setTimeout(() => {
|
|
1083
1127
|
onClose();
|
|
1084
1128
|
}, 500);
|
|
@@ -1570,7 +1614,7 @@ const CampaignDetailForm = ({
|
|
|
1570
1614
|
] });
|
|
1571
1615
|
};
|
|
1572
1616
|
const CouponDetail = () => {
|
|
1573
|
-
var _a, _b, _c, _d, _e, _f, _g;
|
|
1617
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
1574
1618
|
const { id } = reactRouterDom.useParams();
|
|
1575
1619
|
const navigate = reactRouterDom.useNavigate();
|
|
1576
1620
|
const [isEditing, setIsEditing] = react.useState(false);
|
|
@@ -1594,7 +1638,8 @@ const CouponDetail = () => {
|
|
|
1594
1638
|
starts_at: campaign.starts_at ? dayjs__default.default(campaign.starts_at).format("YYYY-MM-DDTHH:mm") : void 0,
|
|
1595
1639
|
ends_at: campaign.ends_at ? dayjs__default.default(campaign.ends_at).format("YYYY-MM-DDTHH:mm") : void 0,
|
|
1596
1640
|
allocation: ((_e = promotion == null ? void 0 : promotion.application_method) == null ? void 0 : _e.allocation) === "total" ? "across" : ((_f = promotion == null ? void 0 : promotion.application_method) == null ? void 0 : _f.allocation) ?? "across",
|
|
1597
|
-
target_type: ((_g = promotion == null ? void 0 : promotion.application_method) == null ? void 0 : _g.target_type) ?? "order"
|
|
1641
|
+
target_type: ((_g = promotion == null ? void 0 : promotion.application_method) == null ? void 0 : _g.target_type) ?? "order",
|
|
1642
|
+
max_quantity: ((_h = promotion == null ? void 0 : promotion.application_method) == null ? void 0 : _h.max_quantity) ?? void 0
|
|
1598
1643
|
};
|
|
1599
1644
|
const handleSubmit = async (formData) => {
|
|
1600
1645
|
var _a2, _b2;
|
|
@@ -426,8 +426,9 @@ const couponSchema = z.object({
|
|
|
426
426
|
currency_code: z.string().optional(),
|
|
427
427
|
starts_at: z.string().min(1, "Start date is required"),
|
|
428
428
|
ends_at: z.string().min(1, "End date is required"),
|
|
429
|
-
allocation: z.enum(["each", "across"]).optional(),
|
|
430
|
-
target_type: z.enum(["order", "items"]).optional()
|
|
429
|
+
allocation: z.enum(["each", "once", "across"]).optional(),
|
|
430
|
+
target_type: z.enum(["order", "items"]).optional(),
|
|
431
|
+
max_quantity: z.number().int("Max quantity must be an integer").positive("Max quantity must be at least 1").optional()
|
|
431
432
|
}).superRefine((data, ctx) => {
|
|
432
433
|
if (new Date(data.ends_at) < new Date(data.starts_at)) {
|
|
433
434
|
ctx.addIssue({
|
|
@@ -443,6 +444,14 @@ const couponSchema = z.object({
|
|
|
443
444
|
message: "Currency is required for fixed discount"
|
|
444
445
|
});
|
|
445
446
|
}
|
|
447
|
+
const requiresMaxQuantity = data.allocation === "each" || data.allocation === "once";
|
|
448
|
+
if (requiresMaxQuantity && !data.max_quantity) {
|
|
449
|
+
ctx.addIssue({
|
|
450
|
+
code: z.ZodIssueCode.custom,
|
|
451
|
+
path: ["max_quantity"],
|
|
452
|
+
message: "Max quantity is required when allocation is Each Item or Once"
|
|
453
|
+
});
|
|
454
|
+
}
|
|
446
455
|
});
|
|
447
456
|
const CouponForm = ({
|
|
448
457
|
initialData,
|
|
@@ -470,12 +479,14 @@ const CouponForm = ({
|
|
|
470
479
|
starts_at: (initialData == null ? void 0 : initialData.starts_at) ?? dayjs().startOf("day").format("YYYY-MM-DDTHH:mm"),
|
|
471
480
|
ends_at: (initialData == null ? void 0 : initialData.ends_at) ?? dayjs().endOf("day").format("YYYY-MM-DDTHH:mm"),
|
|
472
481
|
allocation: (initialData == null ? void 0 : initialData.allocation) === "total" ? "across" : (initialData == null ? void 0 : initialData.allocation) ?? "across",
|
|
473
|
-
target_type: (initialData == null ? void 0 : initialData.target_type) ?? "order"
|
|
482
|
+
target_type: (initialData == null ? void 0 : initialData.target_type) ?? "order",
|
|
483
|
+
max_quantity: (initialData == null ? void 0 : initialData.max_quantity) ?? 1
|
|
474
484
|
}
|
|
475
485
|
});
|
|
476
486
|
const discountType = watch("discount_type");
|
|
477
487
|
const startsAt = watch("starts_at");
|
|
478
488
|
const endsAt = watch("ends_at");
|
|
489
|
+
const allocation = watch("allocation");
|
|
479
490
|
const handleDateTimeChange = (field, type, value) => {
|
|
480
491
|
const currentValue = watch(field);
|
|
481
492
|
if (type === "date") {
|
|
@@ -487,7 +498,11 @@ const CouponForm = ({
|
|
|
487
498
|
}
|
|
488
499
|
};
|
|
489
500
|
const onFormSubmit = (data) => {
|
|
490
|
-
|
|
501
|
+
const shouldIncludeMaxQuantity = data.allocation === "each" || data.allocation === "once";
|
|
502
|
+
onSubmit({
|
|
503
|
+
...data,
|
|
504
|
+
max_quantity: shouldIncludeMaxQuantity ? data.max_quantity : void 0
|
|
505
|
+
});
|
|
491
506
|
};
|
|
492
507
|
const onFormError = () => {
|
|
493
508
|
const errorMessages = Object.values(errors).map((err) => err == null ? void 0 : err.message).filter(Boolean).join(", ");
|
|
@@ -649,7 +664,8 @@ const CouponForm = ({
|
|
|
649
664
|
/* @__PURE__ */ jsx(Select.Trigger, { children: /* @__PURE__ */ jsx(Select.Value, { placeholder: "Select allocation" }) }),
|
|
650
665
|
/* @__PURE__ */ jsxs(Select.Content, { children: [
|
|
651
666
|
/* @__PURE__ */ jsx(Select.Item, { value: "across", children: "Across Order" }),
|
|
652
|
-
/* @__PURE__ */ jsx(Select.Item, { value: "each", children: "Each Item" })
|
|
667
|
+
/* @__PURE__ */ jsx(Select.Item, { value: "each", children: "Each Item" }),
|
|
668
|
+
/* @__PURE__ */ jsx(Select.Item, { value: "once", children: "Once per order" })
|
|
653
669
|
] })
|
|
654
670
|
]
|
|
655
671
|
}
|
|
@@ -683,6 +699,30 @@ const CouponForm = ({
|
|
|
683
699
|
)
|
|
684
700
|
] })
|
|
685
701
|
] }),
|
|
702
|
+
(allocation === "each" || allocation === "once") && /* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 gap-4", children: /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
703
|
+
/* @__PURE__ */ jsx(Label, { children: "Max Quantity" }),
|
|
704
|
+
/* @__PURE__ */ jsx(
|
|
705
|
+
Controller,
|
|
706
|
+
{
|
|
707
|
+
name: "max_quantity",
|
|
708
|
+
control,
|
|
709
|
+
render: ({ field }) => /* @__PURE__ */ jsx(
|
|
710
|
+
Input,
|
|
711
|
+
{
|
|
712
|
+
type: "number",
|
|
713
|
+
min: 1,
|
|
714
|
+
step: 1,
|
|
715
|
+
value: field.value ?? "",
|
|
716
|
+
onChange: (e) => field.onChange(
|
|
717
|
+
e.target.value === "" ? void 0 : Number(e.target.value)
|
|
718
|
+
),
|
|
719
|
+
disabled
|
|
720
|
+
}
|
|
721
|
+
)
|
|
722
|
+
}
|
|
723
|
+
),
|
|
724
|
+
errors.max_quantity && /* @__PURE__ */ jsx("p", { className: "text-red-500 text-sm mt-1", children: errors.max_quantity.message })
|
|
725
|
+
] }) }),
|
|
686
726
|
/* @__PURE__ */ jsxs("div", { className: "flex justify-end gap-2", children: [
|
|
687
727
|
/* @__PURE__ */ jsx(Button, { variant: "secondary", type: "button", onClick: onCancel, children: "Cancel" }),
|
|
688
728
|
/* @__PURE__ */ jsx(Button, { type: "submit", disabled, children: "Save Coupon" })
|
|
@@ -1040,7 +1080,9 @@ const CampaignImageUploader = ({
|
|
|
1040
1080
|
const newImageUrl = imageType === "image" ? (_a = result.campaign_detail) == null ? void 0 : _a.image_url : (_b = result.campaign_detail) == null ? void 0 : _b.thumbnail_url;
|
|
1041
1081
|
setDisplayImage(newImageUrl);
|
|
1042
1082
|
setPreviewUrl(null);
|
|
1043
|
-
|
|
1083
|
+
if (onSuccess) {
|
|
1084
|
+
await onSuccess();
|
|
1085
|
+
}
|
|
1044
1086
|
setTimeout(() => {
|
|
1045
1087
|
onClose();
|
|
1046
1088
|
}, 1e3);
|
|
@@ -1072,7 +1114,9 @@ const CampaignImageUploader = ({
|
|
|
1072
1114
|
if (response.ok) {
|
|
1073
1115
|
setDisplayImage(null);
|
|
1074
1116
|
setPreviewUrl(null);
|
|
1075
|
-
|
|
1117
|
+
if (onSuccess) {
|
|
1118
|
+
await onSuccess();
|
|
1119
|
+
}
|
|
1076
1120
|
setTimeout(() => {
|
|
1077
1121
|
onClose();
|
|
1078
1122
|
}, 500);
|
|
@@ -1564,7 +1608,7 @@ const CampaignDetailForm = ({
|
|
|
1564
1608
|
] });
|
|
1565
1609
|
};
|
|
1566
1610
|
const CouponDetail = () => {
|
|
1567
|
-
var _a, _b, _c, _d, _e, _f, _g;
|
|
1611
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
1568
1612
|
const { id } = useParams();
|
|
1569
1613
|
const navigate = useNavigate();
|
|
1570
1614
|
const [isEditing, setIsEditing] = useState(false);
|
|
@@ -1588,7 +1632,8 @@ const CouponDetail = () => {
|
|
|
1588
1632
|
starts_at: campaign.starts_at ? dayjs(campaign.starts_at).format("YYYY-MM-DDTHH:mm") : void 0,
|
|
1589
1633
|
ends_at: campaign.ends_at ? dayjs(campaign.ends_at).format("YYYY-MM-DDTHH:mm") : void 0,
|
|
1590
1634
|
allocation: ((_e = promotion == null ? void 0 : promotion.application_method) == null ? void 0 : _e.allocation) === "total" ? "across" : ((_f = promotion == null ? void 0 : promotion.application_method) == null ? void 0 : _f.allocation) ?? "across",
|
|
1591
|
-
target_type: ((_g = promotion == null ? void 0 : promotion.application_method) == null ? void 0 : _g.target_type) ?? "order"
|
|
1635
|
+
target_type: ((_g = promotion == null ? void 0 : promotion.application_method) == null ? void 0 : _g.target_type) ?? "order",
|
|
1636
|
+
max_quantity: ((_h = promotion == null ? void 0 : promotion.application_method) == null ? void 0 : _h.max_quantity) ?? void 0
|
|
1592
1637
|
};
|
|
1593
1638
|
const handleSubmit = async (formData) => {
|
|
1594
1639
|
var _a2, _b2;
|
|
@@ -66,6 +66,7 @@ const PUT = async (req, res) => {
|
|
|
66
66
|
currency_code: body.currency_code,
|
|
67
67
|
allocation: body.allocation,
|
|
68
68
|
target_type: body.target_type,
|
|
69
|
+
max_quantity: body.max_quantity,
|
|
69
70
|
},
|
|
70
71
|
});
|
|
71
72
|
res.status(200).json({
|
|
@@ -73,4 +74,4 @@ const PUT = async (req, res) => {
|
|
|
73
74
|
});
|
|
74
75
|
};
|
|
75
76
|
exports.PUT = PUT;
|
|
76
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
77
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2NvdXBvbnMvW2lkXS9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxtREFBK0U7QUFDL0UscURBQWlFO0FBQ2pFLDhDQUFvQjtBQUNwQixvQ0FBc0Q7QUFDdEQscUhBQWtIO0FBQ2xILDJFQUE4RTtBQUU5RSxzR0FBaUc7QUFFakcsTUFBTSxrQkFBa0IsR0FBRyxrQ0FBMEIsQ0FBQyxVQUFVLENBQUM7SUFDL0QsSUFBSSxFQUFFLGFBQUMsQ0FBQyxPQUFPLENBQUMscUNBQWdCLENBQUMsTUFBTSxDQUFDO0NBQ3pDLENBQUMsQ0FBQztBQUVJLE1BQU0sR0FBRyxHQUFHLEtBQUssRUFBRSxHQUFrQixFQUFFLEdBQW1CLEVBQUUsRUFBRTtJQUNuRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztJQUUxQixNQUFNLGdCQUFnQixHQUFHLHFCQUFTLENBQUMsT0FBTyxDQUFDLGVBQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM5RCxNQUFNLDJCQUEyQixHQUMvQixxQkFBUyxDQUFDLE9BQU8sQ0FBOEIseUNBQXNCLENBQUMsQ0FBQztJQUV6RSxJQUFJLENBQUM7UUFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLEVBQUUsRUFBRTtZQUMzRCxTQUFTLEVBQUUsQ0FBQyxZQUFZLEVBQUUsK0JBQStCLENBQUM7U0FDM0QsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2QsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFDM0IsMkJBQTJCLENBQzVCLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUNsQixNQUFNLDJCQUEyQixDQUFDLHVCQUF1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
|
|
@@ -22,8 +22,13 @@ exports.createCouponCampaignSchema = zod_1.default
|
|
|
22
22
|
discount_type: zod_1.default.enum(["percentage", "fixed"]),
|
|
23
23
|
discount_value: zod_1.default.number().positive("Discount value must be positive"),
|
|
24
24
|
currency_code: zod_1.default.string().optional(),
|
|
25
|
-
allocation: zod_1.default.enum(["each", "across"]).optional(),
|
|
25
|
+
allocation: zod_1.default.enum(["each", "once", "across"]).optional(),
|
|
26
26
|
target_type: zod_1.default.enum(["order", "items"]).optional(),
|
|
27
|
+
max_quantity: zod_1.default
|
|
28
|
+
.number()
|
|
29
|
+
.int("max_quantity must be an integer")
|
|
30
|
+
.positive("max_quantity must be at least 1")
|
|
31
|
+
.optional(),
|
|
27
32
|
})
|
|
28
33
|
.superRefine((data, ctx) => {
|
|
29
34
|
if (data.ends_at <= data.starts_at) {
|
|
@@ -40,6 +45,14 @@ exports.createCouponCampaignSchema = zod_1.default
|
|
|
40
45
|
path: ["currency_code"],
|
|
41
46
|
});
|
|
42
47
|
}
|
|
48
|
+
const requiresMaxQuantity = data.allocation === "each" || data.allocation === "once";
|
|
49
|
+
if (requiresMaxQuantity && !data.max_quantity) {
|
|
50
|
+
ctx.addIssue({
|
|
51
|
+
code: zod_1.default.ZodIssueCode.custom,
|
|
52
|
+
message: "max_quantity is required when allocation is 'each' or 'once'",
|
|
53
|
+
path: ["max_quantity"],
|
|
54
|
+
});
|
|
55
|
+
}
|
|
43
56
|
});
|
|
44
57
|
exports.GetCouponCampaignsSchema = (0, validators_1.createFindParams)({
|
|
45
58
|
order: "-created_at",
|
|
@@ -52,6 +65,7 @@ const POST = async (req, res) => {
|
|
|
52
65
|
const { result } = await createCouponCampaignWorkflow_1.createCouponCampaignWorkflow.run({
|
|
53
66
|
input: {
|
|
54
67
|
...body,
|
|
68
|
+
max_quantity: body.max_quantity,
|
|
55
69
|
},
|
|
56
70
|
});
|
|
57
71
|
res.status(200).json(result);
|
|
@@ -85,4 +99,4 @@ const GET = async (req, res) => {
|
|
|
85
99
|
});
|
|
86
100
|
};
|
|
87
101
|
exports.GET = GET;
|
|
88
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
102
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2NvdXBvbnMvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsbURBQStFO0FBQy9FLHFEQUdtQztBQUNuQyxzRUFBeUU7QUFDekUsOENBQW9CO0FBQ3BCLG1HQUE4RjtBQUM5RixrSEFBK0c7QUFDL0csd0VBQTJFO0FBRzlELFFBQUEsMEJBQTBCLEdBQUcsYUFBQztLQUN4QyxNQUFNLENBQUM7SUFDTixJQUFJLEVBQUUsYUFBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsa0JBQWtCLENBQUM7SUFDM0MsV0FBVyxFQUFFLGFBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLHlCQUF5QixDQUFDO0lBQ3pELElBQUksRUFBRSxhQUFDLENBQUMsT0FBTyxDQUFDLHFDQUFnQixDQUFDLE1BQU0sQ0FBQztJQUN4QyxJQUFJLEVBQUUsYUFBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUseUJBQXlCLENBQUM7SUFDbEQsU0FBUyxFQUFFLGFBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFO0lBQzFCLE9BQU8sRUFBRSxhQUFDLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRTtJQUN4QixhQUFhLEVBQUUsYUFBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM5QyxjQUFjLEVBQUUsYUFBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxpQ0FBaUMsQ0FBQztJQUN0RSxhQUFhLEVBQUUsYUFBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUNwQyxVQUFVLEVBQUUsYUFBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FB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
|
|
@@ -13,6 +13,11 @@ const createCouponCampaignStep = (0, workflows_sdk_1.createStep)("create-coupon-
|
|
|
13
13
|
if (input.discount_type === "fixed" && !input.currency_code) {
|
|
14
14
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "currency_code is required for fixed discount type");
|
|
15
15
|
}
|
|
16
|
+
const requiresMaxQuantity = (input.allocation ?? "across") === "each" ||
|
|
17
|
+
(input.allocation ?? "across") === "once";
|
|
18
|
+
if (requiresMaxQuantity && !input.max_quantity) {
|
|
19
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "max_quantity is required when allocation is set to 'each' or 'once'");
|
|
20
|
+
}
|
|
16
21
|
const link = framework_1.container.resolve(utils_1.ContainerRegistrationKeys.LINK);
|
|
17
22
|
const customCampaignModuleService = framework_1.container.resolve(custom_campaigns_1.CUSTOM_CAMPAIGN_MODULE);
|
|
18
23
|
const campaignIdentifier = `${input.type}-${Date.now()}`;
|
|
@@ -20,6 +25,7 @@ const createCouponCampaignStep = (0, workflows_sdk_1.createStep)("create-coupon-
|
|
|
20
25
|
let promotion;
|
|
21
26
|
let customCampaignType;
|
|
22
27
|
try {
|
|
28
|
+
const allocation = input.allocation ?? "across";
|
|
23
29
|
const { result: [createdCampaign], } = await core_flows_1.createCampaignsWorkflow.run({
|
|
24
30
|
input: {
|
|
25
31
|
campaignsData: [
|
|
@@ -45,12 +51,14 @@ const createCouponCampaignStep = (0, workflows_sdk_1.createStep)("create-coupon-
|
|
|
45
51
|
campaign_id: campaign.id,
|
|
46
52
|
application_method: {
|
|
47
53
|
target_type: input.target_type ?? "order",
|
|
48
|
-
|
|
54
|
+
// Medusa types currently miss the "once" allocation option
|
|
55
|
+
allocation: allocation,
|
|
49
56
|
type: input.discount_type,
|
|
50
57
|
value: input.discount_value,
|
|
51
58
|
currency_code: input.discount_type === "fixed" && input.currency_code
|
|
52
59
|
? input.currency_code
|
|
53
60
|
: undefined,
|
|
61
|
+
max_quantity: requiresMaxQuantity ? input.max_quantity : undefined,
|
|
54
62
|
},
|
|
55
63
|
},
|
|
56
64
|
],
|
|
@@ -102,4 +110,4 @@ exports.createCouponCampaignWorkflow = (0, workflows_sdk_1.createWorkflow)("crea
|
|
|
102
110
|
const couponCampaign = createCouponCampaignStep(input);
|
|
103
111
|
return new workflows_sdk_1.WorkflowResponse(couponCampaign);
|
|
104
112
|
});
|
|
105
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
113
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlQ291cG9uQ2FtcGFpZ25Xb3JrZmxvdy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3MvY3VzdG9tLWNhbXBhaWduL2NyZWF0ZUNvdXBvbkNhbXBhaWduV29ya2Zsb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbURBQWdEO0FBT2hELHFEQUltQztBQUNuQyxxRUFLMkM7QUFDM0MsNERBS3FDO0FBQ3JDLHFFQUF3RTtBQW1CeEUsTUFBTSx3QkFBd0IsR0FBRyxJQUFBLDBCQUFVLEVBQ3pDLDZCQUE2QixFQUM3QixLQUFLLEVBQUUsS0FBZ0MsRUFBRSxFQUFFO0lBQ3pDLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQ3hELE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLG1DQUFtQyxDQUNwQyxDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksS0FBSyxDQUFDLGFBQWEsS0FBSyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDNUQsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsbURBQW1ELENBQ3BELENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxtQkFBbUIsR0FDdkIsQ0FBQyxLQUFLLENBQUMsVUFBVSxJQUFJLFFBQVEsQ0FBQyxLQUFLLE1BQU07UUFDekMsQ0FBQyxLQUFLLENBQUMsVUFBVSxJQUFJLFFBQVEsQ0FBQyxLQUFLLE1BQU0sQ0FBQztJQUU1QyxJQUFJLG1CQUFtQixJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQy9DLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLHFFQUFxRSxDQUN0RSxDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sSUFBSSxHQUFHLHFCQUFTLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9ELE1BQU0sMkJBQTJCLEdBQy9CLHFCQUFTLENBQUMsT0FBTyxDQUE4Qix5Q0FBc0IsQ0FBQyxDQUFDO0lBRXpFLE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxLQUFLLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDO0lBRXpELElBQUksUUFBaUMsQ0FBQztJQUN0QyxJQUFJLFNBQW1DLENBQUM7SUFDeEMsSUFBSSxrQkFJUyxDQUFDO0lBRWhCLElBQUksQ0FBQztRQUNILE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVLElBQUksUUFBUSxDQUFDO1FBQ2hELE1BQU0sRUFDSixNQUFNLEVBQUUsQ0FBQyxlQUFlLENBQUMsR0FDMUIsR0FBRyxNQUFNLG9DQUF1QixDQUFDLEdBQUcsQ0FBQztZQUNsQyxLQUFLLEVBQUU7Z0JBQ0wsYUFBYSxFQUFFO29CQUNiO3dCQUNFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTt3QkFDaEIsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO3dCQUM5QixtQkFBbUIsRUFBRSxrQkFBa0I7d0JBQ3ZDLFNBQVMsRUFBRSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDO3dCQUNwQyxPQUFPLEVBQUUsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztxQkFDakM7aUJBQ0Y7YUFDRjtTQUNGLENBQUMsQ0FBQztRQUVILFFBQVEsR0FBRyxlQUFlLENBQUM7UUFFM0IsTUFBTSxFQUNKLE1BQU0sRUFBRSxDQUFDLGdCQUFnQixDQUFDLEdBQzNCLEdBQUcsTUFBTSxxQ0FBd0IsQ0FBQyxHQUFHLENBQUM7WUFDckMsS0FBSyxFQUFFO2dCQUNMLGNBQWMsRUFBRTtvQkFDZDt3QkFDRSxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7d0JBQ2hCLElBQUksRUFBRSxVQUFVO3dCQUNoQixNQUFNLEVBQUUsUUFBUTt3QkFDaEIsWUFBWSxFQUFFLEtBQUs7d0JBQ25CLFdBQVcsRUFBRSxRQUFRLENBQUMsRUFBRTt3QkFDeEIsa0JBQWtCLEVBQUU7NEJBQ2xCLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVyxJQUFJLE9BQU87NEJBQ3pDLDJEQUEyRDs0QkFDM0QsVUFBVSxFQUFFLFVBQWlCOzRCQUM3QixJQUFJLEVBQUUsS0FBSyxDQUFDLGFBQWE7NEJBQ3pCLEtBQUssRUFBRSxLQUFLLENBQUMsY0FBYzs0QkFDM0IsYUFBYSxFQUNYLEtBQUssQ0FBQyxhQUFhLEtBQUssT0FBTyxJQUFJLEtBQUssQ0FBQyxhQUFhO2dDQUNwRCxDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWE7Z0NBQ3JCLENBQUMsQ0FBQyxTQUFTOzRCQUNmLFlBQVksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsU0FBUzt5QkFDOUI7cUJBQ1Y7aUJBQy9CO2FBQ0Y7U0FDRixDQUFDLENBQUM7UUFFSCxTQUFTLEdBQUcsZ0JBQWdCLENBQUM7UUFFN0Isa0JBQWtCO1lBQ2hCLE1BQU0sMkJBQTJCLENBQUMseUJBQXlCLENBQUM7Z0JBQzFELFdBQVcsRUFBRSxRQUFRLENBQUMsRUFBRTtnQkFDeEIsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO2FBQ2pCLENBQUMsQ0FBQztRQUVMLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUNoQjtnQkFDRSxDQUFDLGVBQU8sQ0FBQyxTQUFTLENBQUMsRUFBRTtvQkFDbkIsV0FBVyxFQUFFLFFBQVEsQ0FBQyxFQUFFO2lCQUN6QjtnQkFDRCxDQUFDLHlDQUFzQixDQUFDLEVBQUU7b0JBQ3hCLHVCQUF1QixFQUFFLGtCQUFrQixDQUFDLEVBQUU7aUJBQy9DO2FBQ0Y7U0FDRixDQUFDLENBQUM7UUFFSCxPQUFPLElBQUksNEJBQVksQ0FBQztZQUN0QixRQUFRO1lBQ1IsU0FBUztTQUNWLENBQUMsQ0FBQztJQUNMLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNiLE1BQU0sb0NBQXVCLENBQUMsR0FBRyxDQUFDO2dCQUNoQyxLQUFLLEVBQUU7b0JBQ0wsR0FBRyxFQUFFLFFBQVEsQ0FBQyxFQUFFO2lCQUNqQjthQUNGLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2QsTUFBTSxxQ0FBd0IsQ0FBQyxHQUFHLENBQUM7Z0JBQ2pDLEtBQUssRUFBRTtvQkFDTCxHQUFHLEVBQUUsU0FBUyxDQUFDLEVBQUU7aUJBQ2xCO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELElBQUksa0JBQWtCLEVBQUUsQ0FBQztZQUN2QixNQUFNLDJCQUEyQixDQUFDLHlCQUF5QixDQUN6RCxrQkFBa0IsQ0FBQyxFQUFFLENBQ3RCLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxLQUFLLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQyxDQUNGLENBQUM7QUFFVyxRQUFBLDRCQUE0QixHQUFHLElBQUEsOEJBQWMsRUFDeEQsd0JBQXdCLEVBQ3hCLENBQUMsS0FBZ0MsRUFBRSxFQUFFO0lBQ25DLE1BQU0sY0FBYyxHQUFHLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZELE9BQU8sSUFBSSxnQ0FBZ0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUM5QyxDQUFDLENBQ0YsQ0FBQyJ9
|
|
@@ -57,7 +57,7 @@ const createCustomCampaignStep = (0, workflows_sdk_1.createStep)("create-custom-
|
|
|
57
57
|
promotions = _promotions;
|
|
58
58
|
const productPromotionMap = new Map();
|
|
59
59
|
promotions.forEach((promotion) => {
|
|
60
|
-
const productId = promotion.code?.split("-").
|
|
60
|
+
const productId = promotion.code?.split("-").pop();
|
|
61
61
|
if (!productId) {
|
|
62
62
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Invalid product id");
|
|
63
63
|
}
|
|
@@ -127,4 +127,4 @@ exports.createCustomCampaignWorkflow = (0, workflows_sdk_1.createWorkflow)("crea
|
|
|
127
127
|
const customCampaign = createCustomCampaignStep(data);
|
|
128
128
|
return new workflows_sdk_1.WorkflowResponse(customCampaign);
|
|
129
129
|
});
|
|
130
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
130
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlQ3VzdG9tQ2FtcGFpZ25Xb3JrZmxvdy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3MvY3VzdG9tLWNhbXBhaWduL2NyZWF0ZUN1c3RvbUNhbXBhaWduV29ya2Zsb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbURBQWdEO0FBT2hELHFEQUltQztBQUNuQyxxRUFLMkM7QUFDM0MsNERBS3FDO0FBRXJDLHFFQUF3RTtBQUd4RSxNQUFNLHdCQUF3QixHQUFHLElBQUEsMEJBQVUsRUFDekMsNkJBQTZCLEVBQzdCLEtBQUssRUFBRSxJQUFvQixFQUFFLEVBQUU7SUFDN0IsTUFBTSxJQUFJLEdBQUcscUJBQVMsQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0QsTUFBTSwyQkFBMkIsR0FDL0IscUJBQVMsQ0FBQyxPQUFPLENBQThCLHlDQUFzQixDQUFDLENBQUM7SUFDekUsTUFBTSxrQkFBa0IsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUM7SUFFeEQsSUFBSSxRQUFpQyxDQUFDO0lBQ3RDLElBQUksVUFBc0MsQ0FBQztJQUMzQyxJQUFJLGtCQUlTLENBQUM7SUFDZCxJQUFJLG1CQUlTLENBQUM7SUFFZCxNQUFNLEVBQ0osTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQ3BCLEdBQUcsTUFBTSxvQ0FBdUIsQ0FBQyxHQUFHLENBQUM7UUFDcEMsS0FBSyxFQUFFO1lBQ0wsYUFBYSxFQUFFO2dCQUNiO29CQUNFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtvQkFDZixtQkFBbUIsRUFBRSxrQkFBa0I7b0JBQ3ZDLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztvQkFDN0IsU0FBUyxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7b0JBQ25DLE9BQU8sRUFBRSxJ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
|
|
@@ -12,6 +12,11 @@ const updateCouponCampaignStep = (0, workflows_sdk_1.createStep)("update-coupon-
|
|
|
12
12
|
if (input.discount_type === "fixed" && !input.currency_code) {
|
|
13
13
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "currency_code is required for fixed discount type");
|
|
14
14
|
}
|
|
15
|
+
const requiresMaxQuantity = (input.allocation ?? "across") === "each" ||
|
|
16
|
+
(input.allocation ?? "across") === "once";
|
|
17
|
+
if (requiresMaxQuantity && !input.max_quantity) {
|
|
18
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "max_quantity is required when allocation is set to 'each' or 'once'");
|
|
19
|
+
}
|
|
15
20
|
const promotionService = framework_1.container.resolve(utils_1.Modules.PROMOTION);
|
|
16
21
|
const promotions = await promotionService.listPromotions({
|
|
17
22
|
campaign_id: input.id,
|
|
@@ -33,17 +38,20 @@ const updateCouponCampaignStep = (0, workflows_sdk_1.createStep)("update-coupon-
|
|
|
33
38
|
],
|
|
34
39
|
},
|
|
35
40
|
});
|
|
41
|
+
const allocation = input.allocation ?? "across";
|
|
36
42
|
const updateData = {
|
|
37
43
|
id: promotion.id,
|
|
38
44
|
code: input.code,
|
|
39
45
|
application_method: {
|
|
40
46
|
type: input.discount_type,
|
|
41
47
|
target_type: input.target_type ?? "order",
|
|
42
|
-
|
|
48
|
+
// Medusa types currently miss the "once" allocation option
|
|
49
|
+
allocation: allocation,
|
|
43
50
|
value: input.discount_value,
|
|
44
51
|
currency_code: input.discount_type === "fixed" && input.currency_code
|
|
45
52
|
? input.currency_code
|
|
46
53
|
: undefined,
|
|
54
|
+
max_quantity: requiresMaxQuantity ? input.max_quantity : undefined,
|
|
47
55
|
},
|
|
48
56
|
};
|
|
49
57
|
await promotionService.updatePromotions([updateData]);
|
|
@@ -56,4 +64,4 @@ exports.updateCouponCampaignWorkflow = (0, workflows_sdk_1.createWorkflow)("upda
|
|
|
56
64
|
const result = updateCouponCampaignStep(input);
|
|
57
65
|
return new workflows_sdk_1.WorkflowResponse(result);
|
|
58
66
|
});
|
|
59
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
67
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlQ291cG9uQ2FtcGFpZ25Xb3JrZmxvdy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3MvY3VzdG9tLWNhbXBhaWduL3VwZGF0ZUNvdXBvbkNhbXBhaWduV29ya2Zsb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbURBQWdEO0FBS2hELHFEQUFpRTtBQUNqRSxxRUFLMkM7QUFDM0MsNERBQXNFO0FBaUJ0RSxNQUFNLHdCQUF3QixHQUFHLElBQUEsMEJBQVUsRUFDekMsNkJBQTZCLEVBQzdCLEtBQUssRUFBRSxLQUFnQyxFQUFFLEVBQUU7SUFDekMsSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDeEQsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsbUNBQW1DLENBQ3BDLENBQUM7SUFDSixDQUFDO0lBRUQsSUFBSSxLQUFLLENBQUMsYUFBYSxLQUFLLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUM1RCxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QixtREFBbUQsQ0FDcEQsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLG1CQUFtQixHQUN2QixDQUFDLEtBQUssQ0FBQyxVQUFVLElBQUksUUFBUSxDQUFDLEtBQUssTUFBTTtRQUN6QyxDQUFDLEtBQUssQ0FBQyxVQUFVLElBQUksUUFBUSxDQUFDLEtBQUssTUFBTSxDQUFDO0lBRTVDLElBQUksbUJBQW1CLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDL0MsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIscUVB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
|
|
@@ -93,7 +93,7 @@ const updateCustomFlashSaleStep = (0, workflows_sdk_1.createStep)("update-custom
|
|
|
93
93
|
});
|
|
94
94
|
const productPromotionMap = new Map();
|
|
95
95
|
createdPromotions.forEach((promotion) => {
|
|
96
|
-
const productId = promotion.code?.split("-").
|
|
96
|
+
const productId = promotion.code?.split("-").pop();
|
|
97
97
|
if (!productId) {
|
|
98
98
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Invalid product id");
|
|
99
99
|
}
|
|
@@ -112,4 +112,4 @@ exports.updateCustomFlashSaleWorkflow = (0, workflows_sdk_1.createWorkflow)("upd
|
|
|
112
112
|
const updatedFlashSale = updateCustomFlashSaleStep(data);
|
|
113
113
|
return new workflows_sdk_1.WorkflowResponse(updatedFlashSale);
|
|
114
114
|
});
|
|
115
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
115
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlQ3VzdG9tRmxhc2hTYWxlV29ya2Zsb3cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL2N1c3RvbS1jYW1wYWlnbi91cGRhdGVDdXN0b21GbGFzaFNhbGVXb3JrZmxvdy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtREFBZ0Q7QUFPaEQscURBQWlFO0FBQ2pFLHFFQUsyQztBQUMzQyw0REFLcUM7QUFFckMscUVBQXdFO0FBT3hFLE1BQU0seUJBQXlCLEdBQUcsSUFBQSwwQkFBVSxFQUMxQywrQkFBK0IsRUFDL0IsS0FBSyxFQUFFLElBQTBCLEVBQUUsRUFBRTtJQUNuQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0lBRTVCLE1BQU0sMkJBQTJCLEdBQy9CLHFCQUFTLENBQUMsT0FBTyxDQUE4Qix5Q0FBc0IsQ0FBQyxDQUFDO0lBQ3pFLE1BQU0sZ0JBQWdCLEdBQUcscUJBQVMsQ0FBQyxPQUFPLENBQUMsZUFBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRTlELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNqQixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5Qix5QkFBeUIsQ0FDMUIsQ0FBQztJQUNKLENBQUM7SUFFRCw4QkFBOEI7SUFDOUIsTUFBTSxRQUFRLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUV0RSx3Q0FBd0M7SUFDeEMsTUFBTSxvQkFBb0IsR0FDeEIsTUFBTSwyQkFBMkIsQ0FBQyx3QkFBd0IsQ0FBQztRQUN6RCxXQUFXLEVBQUUsV0FBVztLQUN6QixDQUFDLENBQUM7SUFFTCx1REFBdUQ7SUFDdkQsTUFBTSxvQ0FBb0MsR0FBRyxJQUFJLEdBQUcsQ0FDbEQsb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FB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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lodashventure/medusa-campaign",
|
|
3
|
-
"version": "1.5.
|
|
3
|
+
"version": "1.5.7",
|
|
4
4
|
"description": "A starter for Medusa plugins.",
|
|
5
5
|
"author": "Medusa (https://medusajs.com)",
|
|
6
6
|
"license": "MIT",
|
|
@@ -30,28 +30,28 @@
|
|
|
30
30
|
"prepublishOnly": "medusa plugin:build"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
|
-
"@hookform/resolvers": "^
|
|
34
|
-
"@medusajs/admin-sdk": "2.11.
|
|
35
|
-
"@medusajs/admin-shared": "2.11.
|
|
36
|
-
"@medusajs/cli": "2.11.
|
|
37
|
-
"@medusajs/framework": "2.11.
|
|
38
|
-
"@medusajs/icons": "^2.11.
|
|
39
|
-
"@medusajs/medusa": "2.11.
|
|
40
|
-
"@medusajs/test-utils": "2.11.
|
|
41
|
-
"@medusajs/ui": "^4.0.
|
|
42
|
-
"@swc/core": "1.
|
|
43
|
-
"@types/lodash": "^4",
|
|
44
|
-
"@types/node": "^
|
|
45
|
-
"@types/react": "^
|
|
46
|
-
"@types/react-dom": "^
|
|
33
|
+
"@hookform/resolvers": "^5.2.2",
|
|
34
|
+
"@medusajs/admin-sdk": "2.11.3",
|
|
35
|
+
"@medusajs/admin-shared": "2.11.3",
|
|
36
|
+
"@medusajs/cli": "2.11.3",
|
|
37
|
+
"@medusajs/framework": "2.11.3",
|
|
38
|
+
"@medusajs/icons": "^2.11.3",
|
|
39
|
+
"@medusajs/medusa": "2.11.3",
|
|
40
|
+
"@medusajs/test-utils": "2.11.3",
|
|
41
|
+
"@medusajs/ui": "^4.0.27",
|
|
42
|
+
"@swc/core": "1.15.0",
|
|
43
|
+
"@types/lodash": "^4.17.20",
|
|
44
|
+
"@types/node": "^24.10.0",
|
|
45
|
+
"@types/react": "^19.2.2",
|
|
46
|
+
"@types/react-dom": "^19.2.2",
|
|
47
47
|
"prop-types": "^15.8.1",
|
|
48
|
-
"react": "^
|
|
49
|
-
"react-dom": "^
|
|
48
|
+
"react": "^19.2.0",
|
|
49
|
+
"react-dom": "^19.2.0",
|
|
50
50
|
"react-hook-form": "^7.66.0",
|
|
51
51
|
"ts-node": "^10.9.2",
|
|
52
|
-
"typescript": "^5.
|
|
53
|
-
"vite": "^
|
|
54
|
-
"yalc": "
|
|
52
|
+
"typescript": "^5.9.3",
|
|
53
|
+
"vite": "^7.2.2",
|
|
54
|
+
"yalc": "1.0.0-pre.53"
|
|
55
55
|
},
|
|
56
56
|
"peerDependencies": {
|
|
57
57
|
"@medusajs/admin-sdk": "2.11.2",
|
|
@@ -67,10 +67,10 @@
|
|
|
67
67
|
"node": ">=20"
|
|
68
68
|
},
|
|
69
69
|
"dependencies": {
|
|
70
|
-
"axios": "^1.
|
|
71
|
-
"dayjs": "^1.11.
|
|
70
|
+
"axios": "^1.13.2",
|
|
71
|
+
"dayjs": "^1.11.19",
|
|
72
72
|
"lodash": "^4.17.21",
|
|
73
73
|
"multer": "^2.0.2",
|
|
74
|
-
"zod": "^4.1.
|
|
74
|
+
"zod": "^4.1.12"
|
|
75
75
|
}
|
|
76
76
|
}
|
|
@@ -24,8 +24,13 @@ const couponSchema = z
|
|
|
24
24
|
currency_code: z.string().optional(),
|
|
25
25
|
starts_at: z.string().min(1, "Start date is required"),
|
|
26
26
|
ends_at: z.string().min(1, "End date is required"),
|
|
27
|
-
allocation: z.enum(["each", "across"]).optional(),
|
|
27
|
+
allocation: z.enum(["each", "once", "across"]).optional(),
|
|
28
28
|
target_type: z.enum(["order", "items"]).optional(),
|
|
29
|
+
max_quantity: z
|
|
30
|
+
.number()
|
|
31
|
+
.int("Max quantity must be an integer")
|
|
32
|
+
.positive("Max quantity must be at least 1")
|
|
33
|
+
.optional(),
|
|
29
34
|
})
|
|
30
35
|
.superRefine((data, ctx) => {
|
|
31
36
|
if (new Date(data.ends_at) < new Date(data.starts_at)) {
|
|
@@ -43,6 +48,18 @@ const couponSchema = z
|
|
|
43
48
|
message: "Currency is required for fixed discount",
|
|
44
49
|
});
|
|
45
50
|
}
|
|
51
|
+
|
|
52
|
+
const requiresMaxQuantity =
|
|
53
|
+
data.allocation === "each" || data.allocation === "once";
|
|
54
|
+
|
|
55
|
+
if (requiresMaxQuantity && !data.max_quantity) {
|
|
56
|
+
ctx.addIssue({
|
|
57
|
+
code: z.ZodIssueCode.custom,
|
|
58
|
+
path: ["max_quantity"],
|
|
59
|
+
message:
|
|
60
|
+
"Max quantity is required when allocation is Each Item or Once",
|
|
61
|
+
});
|
|
62
|
+
}
|
|
46
63
|
});
|
|
47
64
|
|
|
48
65
|
export type CouponFormData = z.infer<typeof couponSchema>;
|
|
@@ -88,12 +105,14 @@ export const CouponForm: FC<CouponFormProps> = ({
|
|
|
88
105
|
? "across"
|
|
89
106
|
: initialData?.allocation ?? "across",
|
|
90
107
|
target_type: initialData?.target_type ?? "order",
|
|
108
|
+
max_quantity: initialData?.max_quantity ?? 1,
|
|
91
109
|
},
|
|
92
110
|
});
|
|
93
111
|
|
|
94
112
|
const discountType = watch("discount_type");
|
|
95
113
|
const startsAt = watch("starts_at");
|
|
96
114
|
const endsAt = watch("ends_at");
|
|
115
|
+
const allocation = watch("allocation");
|
|
97
116
|
|
|
98
117
|
const handleDateTimeChange = (
|
|
99
118
|
field: "starts_at" | "ends_at",
|
|
@@ -118,7 +137,12 @@ export const CouponForm: FC<CouponFormProps> = ({
|
|
|
118
137
|
};
|
|
119
138
|
|
|
120
139
|
const onFormSubmit = (data: CouponFormData) => {
|
|
121
|
-
|
|
140
|
+
const shouldIncludeMaxQuantity =
|
|
141
|
+
data.allocation === "each" || data.allocation === "once";
|
|
142
|
+
onSubmit({
|
|
143
|
+
...data,
|
|
144
|
+
max_quantity: shouldIncludeMaxQuantity ? data.max_quantity : undefined,
|
|
145
|
+
});
|
|
122
146
|
};
|
|
123
147
|
|
|
124
148
|
const onFormError = () => {
|
|
@@ -311,6 +335,7 @@ export const CouponForm: FC<CouponFormProps> = ({
|
|
|
311
335
|
<Select.Content>
|
|
312
336
|
<Select.Item value="across">Across Order</Select.Item>
|
|
313
337
|
<Select.Item value="each">Each Item</Select.Item>
|
|
338
|
+
<Select.Item value="once">Once per order</Select.Item>
|
|
314
339
|
</Select.Content>
|
|
315
340
|
</Select>
|
|
316
341
|
)}
|
|
@@ -341,6 +366,37 @@ export const CouponForm: FC<CouponFormProps> = ({
|
|
|
341
366
|
</div>
|
|
342
367
|
</div>
|
|
343
368
|
|
|
369
|
+
{(allocation === "each" || allocation === "once") && (
|
|
370
|
+
<div className="grid grid-cols-2 gap-4">
|
|
371
|
+
<div className="space-y-2">
|
|
372
|
+
<Label>Max Quantity</Label>
|
|
373
|
+
<Controller
|
|
374
|
+
name="max_quantity"
|
|
375
|
+
control={control}
|
|
376
|
+
render={({ field }) => (
|
|
377
|
+
<Input
|
|
378
|
+
type="number"
|
|
379
|
+
min={1}
|
|
380
|
+
step={1}
|
|
381
|
+
value={field.value ?? ""}
|
|
382
|
+
onChange={(e) =>
|
|
383
|
+
field.onChange(
|
|
384
|
+
e.target.value === "" ? undefined : Number(e.target.value),
|
|
385
|
+
)
|
|
386
|
+
}
|
|
387
|
+
disabled={disabled}
|
|
388
|
+
/>
|
|
389
|
+
)}
|
|
390
|
+
/>
|
|
391
|
+
{errors.max_quantity && (
|
|
392
|
+
<p className="text-red-500 text-sm mt-1">
|
|
393
|
+
{errors.max_quantity.message}
|
|
394
|
+
</p>
|
|
395
|
+
)}
|
|
396
|
+
</div>
|
|
397
|
+
</div>
|
|
398
|
+
)}
|
|
399
|
+
|
|
344
400
|
<div className="flex justify-end gap-2">
|
|
345
401
|
<Button variant="secondary" type="button" onClick={onCancel}>
|
|
346
402
|
Cancel
|
|
@@ -1,10 +1,5 @@
|
|
|
1
1
|
import { useState, useCallback } from "react";
|
|
2
|
-
import {
|
|
3
|
-
PhotoSolid,
|
|
4
|
-
Trash,
|
|
5
|
-
CloudArrowUp,
|
|
6
|
-
X,
|
|
7
|
-
} from "@medusajs/icons";
|
|
2
|
+
import { PhotoSolid, Trash, CloudArrowUp, X } from "@medusajs/icons";
|
|
8
3
|
import { Button, Heading, Text, Alert, clx } from "@medusajs/ui";
|
|
9
4
|
|
|
10
5
|
interface CampaignImageUploaderProps {
|
|
@@ -72,7 +67,7 @@ export const CampaignImageUploader = ({
|
|
|
72
67
|
method: "POST",
|
|
73
68
|
body: formData,
|
|
74
69
|
credentials: "include",
|
|
75
|
-
}
|
|
70
|
+
},
|
|
76
71
|
);
|
|
77
72
|
|
|
78
73
|
if (response.ok) {
|
|
@@ -84,8 +79,10 @@ export const CampaignImageUploader = ({
|
|
|
84
79
|
setDisplayImage(newImageUrl);
|
|
85
80
|
setPreviewUrl(null);
|
|
86
81
|
|
|
87
|
-
// Call onSuccess callback
|
|
88
|
-
onSuccess
|
|
82
|
+
// Call onSuccess callback first to refresh parent data
|
|
83
|
+
if (onSuccess) {
|
|
84
|
+
await onSuccess();
|
|
85
|
+
}
|
|
89
86
|
|
|
90
87
|
// Show success for a moment before closing
|
|
91
88
|
setTimeout(() => {
|
|
@@ -117,15 +114,17 @@ export const CampaignImageUploader = ({
|
|
|
117
114
|
{
|
|
118
115
|
method: "DELETE",
|
|
119
116
|
credentials: "include",
|
|
120
|
-
}
|
|
117
|
+
},
|
|
121
118
|
);
|
|
122
119
|
|
|
123
120
|
if (response.ok) {
|
|
124
121
|
setDisplayImage(null);
|
|
125
122
|
setPreviewUrl(null);
|
|
126
123
|
|
|
127
|
-
// Call onSuccess callback
|
|
128
|
-
onSuccess
|
|
124
|
+
// Call onSuccess callback first to refresh parent data
|
|
125
|
+
if (onSuccess) {
|
|
126
|
+
await onSuccess();
|
|
127
|
+
}
|
|
129
128
|
|
|
130
129
|
setTimeout(() => {
|
|
131
130
|
onClose();
|
|
@@ -206,7 +205,7 @@ export const CampaignImageUploader = ({
|
|
|
206
205
|
alt={`Campaign ${imageType}`}
|
|
207
206
|
className={clx(
|
|
208
207
|
"w-full object-contain",
|
|
209
|
-
isThumbnail ? "h-32" : "h-64"
|
|
208
|
+
isThumbnail ? "h-32" : "h-64",
|
|
210
209
|
)}
|
|
211
210
|
/>
|
|
212
211
|
{isUploading && (
|
|
@@ -244,7 +243,7 @@ export const CampaignImageUploader = ({
|
|
|
244
243
|
isDragging
|
|
245
244
|
? "border-ui-border-interactive bg-ui-bg-highlight"
|
|
246
245
|
: "border-ui-border-base bg-ui-bg-subtle",
|
|
247
|
-
!isUploading && "cursor-pointer"
|
|
246
|
+
!isUploading && "cursor-pointer",
|
|
248
247
|
)}
|
|
249
248
|
onDragEnter={handleDragEnter}
|
|
250
249
|
onDragLeave={handleDragLeave}
|
|
@@ -62,6 +62,7 @@ const CouponDetail: FC = () => {
|
|
|
62
62
|
? "across"
|
|
63
63
|
: promotion?.application_method?.allocation ?? "across",
|
|
64
64
|
target_type: promotion?.application_method?.target_type ?? "order",
|
|
65
|
+
max_quantity: promotion?.application_method?.max_quantity ?? undefined,
|
|
65
66
|
};
|
|
66
67
|
|
|
67
68
|
const handleSubmit = async (formData: CouponFormData) => {
|
|
@@ -21,8 +21,13 @@ export const createCouponCampaignSchema = z
|
|
|
21
21
|
discount_type: z.enum(["percentage", "fixed"]),
|
|
22
22
|
discount_value: z.number().positive("Discount value must be positive"),
|
|
23
23
|
currency_code: z.string().optional(),
|
|
24
|
-
allocation: z.enum(["each", "across"]).optional(),
|
|
24
|
+
allocation: z.enum(["each", "once", "across"]).optional(),
|
|
25
25
|
target_type: z.enum(["order", "items"]).optional(),
|
|
26
|
+
max_quantity: z
|
|
27
|
+
.number()
|
|
28
|
+
.int("max_quantity must be an integer")
|
|
29
|
+
.positive("max_quantity must be at least 1")
|
|
30
|
+
.optional(),
|
|
26
31
|
})
|
|
27
32
|
.superRefine((data, ctx) => {
|
|
28
33
|
if (data.ends_at <= data.starts_at) {
|
|
@@ -40,6 +45,17 @@ export const createCouponCampaignSchema = z
|
|
|
40
45
|
path: ["currency_code"],
|
|
41
46
|
});
|
|
42
47
|
}
|
|
48
|
+
|
|
49
|
+
const requiresMaxQuantity =
|
|
50
|
+
data.allocation === "each" || data.allocation === "once";
|
|
51
|
+
|
|
52
|
+
if (requiresMaxQuantity && !data.max_quantity) {
|
|
53
|
+
ctx.addIssue({
|
|
54
|
+
code: z.ZodIssueCode.custom,
|
|
55
|
+
message: "max_quantity is required when allocation is 'each' or 'once'",
|
|
56
|
+
path: ["max_quantity"],
|
|
57
|
+
});
|
|
58
|
+
}
|
|
43
59
|
});
|
|
44
60
|
|
|
45
61
|
export type CouponCampaignInput = z.infer<typeof createCouponCampaignSchema>;
|
|
@@ -64,6 +80,7 @@ export const POST = async (
|
|
|
64
80
|
const { result } = await createCouponCampaignWorkflow.run({
|
|
65
81
|
input: {
|
|
66
82
|
...body,
|
|
83
|
+
max_quantity: body.max_quantity,
|
|
67
84
|
},
|
|
68
85
|
});
|
|
69
86
|
|
|
@@ -36,8 +36,9 @@ export type CreateCouponCampaignInput = {
|
|
|
36
36
|
discount_type: "percentage" | "fixed";
|
|
37
37
|
discount_value: number;
|
|
38
38
|
currency_code?: string | null;
|
|
39
|
-
allocation?: "each" | "across";
|
|
39
|
+
allocation?: "each" | "once" | "across";
|
|
40
40
|
target_type?: "order" | "items";
|
|
41
|
+
max_quantity?: number;
|
|
41
42
|
};
|
|
42
43
|
|
|
43
44
|
const createCouponCampaignStep = createStep(
|
|
@@ -57,6 +58,17 @@ const createCouponCampaignStep = createStep(
|
|
|
57
58
|
);
|
|
58
59
|
}
|
|
59
60
|
|
|
61
|
+
const requiresMaxQuantity =
|
|
62
|
+
(input.allocation ?? "across") === "each" ||
|
|
63
|
+
(input.allocation ?? "across") === "once";
|
|
64
|
+
|
|
65
|
+
if (requiresMaxQuantity && !input.max_quantity) {
|
|
66
|
+
throw new MedusaError(
|
|
67
|
+
MedusaError.Types.INVALID_DATA,
|
|
68
|
+
"max_quantity is required when allocation is set to 'each' or 'once'",
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
|
|
60
72
|
const link = container.resolve(ContainerRegistrationKeys.LINK);
|
|
61
73
|
const customCampaignModuleService =
|
|
62
74
|
container.resolve<CustomCampaignModuleService>(CUSTOM_CAMPAIGN_MODULE);
|
|
@@ -71,10 +83,11 @@ const createCouponCampaignStep = createStep(
|
|
|
71
83
|
>[number]
|
|
72
84
|
| undefined;
|
|
73
85
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
86
|
+
try {
|
|
87
|
+
const allocation = input.allocation ?? "across";
|
|
88
|
+
const {
|
|
89
|
+
result: [createdCampaign],
|
|
90
|
+
} = await createCampaignsWorkflow.run({
|
|
78
91
|
input: {
|
|
79
92
|
campaignsData: [
|
|
80
93
|
{
|
|
@@ -103,13 +116,15 @@ const createCouponCampaignStep = createStep(
|
|
|
103
116
|
campaign_id: campaign.id,
|
|
104
117
|
application_method: {
|
|
105
118
|
target_type: input.target_type ?? "order",
|
|
106
|
-
|
|
119
|
+
// Medusa types currently miss the "once" allocation option
|
|
120
|
+
allocation: allocation as any,
|
|
107
121
|
type: input.discount_type,
|
|
108
122
|
value: input.discount_value,
|
|
109
123
|
currency_code:
|
|
110
124
|
input.discount_type === "fixed" && input.currency_code
|
|
111
125
|
? input.currency_code
|
|
112
126
|
: undefined,
|
|
127
|
+
max_quantity: requiresMaxQuantity ? input.max_quantity : undefined,
|
|
113
128
|
} satisfies CreateApplicationMethodDTO,
|
|
114
129
|
} satisfies CreatePromotionDTO,
|
|
115
130
|
],
|
|
@@ -97,7 +97,7 @@ const createCustomCampaignStep = createStep(
|
|
|
97
97
|
|
|
98
98
|
const productPromotionMap = new Map<string, string>();
|
|
99
99
|
promotions.forEach((promotion) => {
|
|
100
|
-
const productId = promotion.code?.split("-").
|
|
100
|
+
const productId = promotion.code?.split("-").pop();
|
|
101
101
|
if (!productId) {
|
|
102
102
|
throw new MedusaError(
|
|
103
103
|
MedusaError.Types.INVALID_DATA,
|
|
@@ -22,8 +22,9 @@ export type UpdateCouponCampaignInput = {
|
|
|
22
22
|
discount_type: "percentage" | "fixed";
|
|
23
23
|
discount_value: number;
|
|
24
24
|
currency_code?: string | null;
|
|
25
|
-
allocation?: "each" | "across";
|
|
25
|
+
allocation?: "each" | "once" | "across";
|
|
26
26
|
target_type?: "order" | "items";
|
|
27
|
+
max_quantity?: number;
|
|
27
28
|
};
|
|
28
29
|
|
|
29
30
|
const updateCouponCampaignStep = createStep(
|
|
@@ -43,6 +44,17 @@ const updateCouponCampaignStep = createStep(
|
|
|
43
44
|
);
|
|
44
45
|
}
|
|
45
46
|
|
|
47
|
+
const requiresMaxQuantity =
|
|
48
|
+
(input.allocation ?? "across") === "each" ||
|
|
49
|
+
(input.allocation ?? "across") === "once";
|
|
50
|
+
|
|
51
|
+
if (requiresMaxQuantity && !input.max_quantity) {
|
|
52
|
+
throw new MedusaError(
|
|
53
|
+
MedusaError.Types.INVALID_DATA,
|
|
54
|
+
"max_quantity is required when allocation is set to 'each' or 'once'",
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
|
|
46
58
|
const promotionService = container.resolve(Modules.PROMOTION);
|
|
47
59
|
|
|
48
60
|
const promotions = await promotionService.listPromotions({
|
|
@@ -72,18 +84,21 @@ const updateCouponCampaignStep = createStep(
|
|
|
72
84
|
},
|
|
73
85
|
});
|
|
74
86
|
|
|
87
|
+
const allocation = input.allocation ?? "across";
|
|
75
88
|
const updateData: UpdatePromotionDTO = {
|
|
76
89
|
id: promotion.id,
|
|
77
90
|
code: input.code,
|
|
78
91
|
application_method: {
|
|
79
92
|
type: input.discount_type,
|
|
80
93
|
target_type: input.target_type ?? "order",
|
|
81
|
-
|
|
94
|
+
// Medusa types currently miss the "once" allocation option
|
|
95
|
+
allocation: allocation as any,
|
|
82
96
|
value: input.discount_value,
|
|
83
97
|
currency_code:
|
|
84
98
|
input.discount_type === "fixed" && input.currency_code
|
|
85
99
|
? input.currency_code
|
|
86
100
|
: undefined,
|
|
101
|
+
max_quantity: requiresMaxQuantity ? input.max_quantity : undefined,
|
|
87
102
|
},
|
|
88
103
|
};
|
|
89
104
|
|
|
@@ -153,7 +153,7 @@ const updateCustomFlashSaleStep = createStep(
|
|
|
153
153
|
});
|
|
154
154
|
const productPromotionMap = new Map<string, string>();
|
|
155
155
|
createdPromotions.forEach((promotion) => {
|
|
156
|
-
const productId = promotion.code?.split("-").
|
|
156
|
+
const productId = promotion.code?.split("-").pop();
|
|
157
157
|
if (!productId) {
|
|
158
158
|
throw new MedusaError(
|
|
159
159
|
MedusaError.Types.INVALID_DATA,
|