order-management 0.0.23 → 0.0.25
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 +591 -521
- package/.medusa/server/src/admin/index.mjs +592 -522
- package/.medusa/server/src/api/admin/swaps/[id]/approve/route.js +49 -23
- package/.medusa/server/src/api/admin/swaps/[id]/route.js +10 -1
- package/.medusa/server/src/api/admin/swaps/[id]/shipping-options/route.js +105 -0
- package/.medusa/server/src/api/admin/swaps/validators.js +2 -1
- package/.medusa/server/src/api/store/orders/[order_id]/swaps/route.js +2 -1
- package/.medusa/server/src/api/store/swaps/route.js +2 -1
- package/.medusa/server/src/helpers/index.js +2 -1
- package/.medusa/server/src/helpers/order-exchange-data.js +233 -0
- package/.medusa/server/src/modules/swap/service.js +1 -1
- package/.medusa/server/src/workflows/steps/swap/create-medusa-exchange-step.js +271 -27
- package/.medusa/server/src/workflows/steps/swap/create-medusa-return-step.js +639 -28
- package/.medusa/server/src/workflows/steps/swap/update-swap-exchange-details-step.js +12 -2
- package/.medusa/server/src/workflows/steps/swap/validate-swap-items-step.js +102 -4
- package/.medusa/server/src/workflows/swaps/approve-swap-workflow.js +56 -12
- package/package.json +1 -1
- package/.medusa/server/src/api/admin/swaps/[id]/confirm-exchange/route.js +0 -109
- package/.medusa/server/src/workflows/swaps/confirm-exchange-workflow.js +0 -51
|
@@ -5,11 +5,15 @@ const utils_1 = require("@medusajs/framework/utils");
|
|
|
5
5
|
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
|
|
6
6
|
const swap_1 = require("../../../modules/swap");
|
|
7
7
|
exports.updateSwapExchangeDetailsStep = (0, workflows_sdk_1.createStep)("update-swap-exchange-details", async (input, { container }) => {
|
|
8
|
-
const { swap_id, return_location_id, return_shipping_method_id, outbound_shipping_method_id, send_notification, } = input;
|
|
8
|
+
const { swap_id, return_location_id, return_shipping_method_id, outbound_shipping_method_id, send_notification, metadata, } = input;
|
|
9
9
|
if (!swap_id) {
|
|
10
10
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "swap_id is required");
|
|
11
11
|
}
|
|
12
12
|
const swapService = container.resolve(swap_1.SWAP_MODULE);
|
|
13
|
+
// Retrieve current swap to preserve existing metadata
|
|
14
|
+
const currentSwap = await swapService.retrieveSwap(swap_id);
|
|
15
|
+
const currentSwapData = currentSwap;
|
|
16
|
+
const currentMetadata = currentSwapData.metadata || {};
|
|
13
17
|
await swapService.updateSwaps({
|
|
14
18
|
selector: { id: swap_id },
|
|
15
19
|
data: {
|
|
@@ -17,6 +21,12 @@ exports.updateSwapExchangeDetailsStep = (0, workflows_sdk_1.createStep)("update-
|
|
|
17
21
|
return_shipping_method_id: return_shipping_method_id || null,
|
|
18
22
|
outbound_shipping_method_id: outbound_shipping_method_id || null,
|
|
19
23
|
send_notification: send_notification || false,
|
|
24
|
+
...(metadata && {
|
|
25
|
+
metadata: {
|
|
26
|
+
...currentMetadata,
|
|
27
|
+
...metadata,
|
|
28
|
+
},
|
|
29
|
+
}),
|
|
20
30
|
},
|
|
21
31
|
});
|
|
22
32
|
const swap = await swapService.retrieveSwap(swap_id);
|
|
@@ -24,4 +34,4 @@ exports.updateSwapExchangeDetailsStep = (0, workflows_sdk_1.createStep)("update-
|
|
|
24
34
|
swap,
|
|
25
35
|
});
|
|
26
36
|
});
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLXN3YXAtZXhjaGFuZ2UtZGV0YWlscy1zdGVwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9zdGVwcy9zd2FwL3VwZGF0ZS1zd2FwLWV4Y2hhbmdlLWRldGFpbHMtc3RlcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxREFBdUQ7QUFDdkQscUVBQTRFO0FBQzVFLGdEQUFtRDtBQWdCdEMsUUFBQSw2QkFBNkIsR0FBRyxJQUFBLDBCQUFVLEVBQ3JELDhCQUE4QixFQUM5QixLQUFLLEVBQ0gsS0FBeUMsRUFDekMsRUFBRSxTQUFTLEVBQUUsRUFDK0MsRUFBRTtJQUM5RCxNQUFNLEVBQ0osT0FBTyxFQUNQLGtCQUFrQixFQUNsQix5QkFBeUIsRUFDekIsMkJBQTJCLEVBQzNCLGlCQUFpQixFQUNqQixRQUFRLEdBQ1QsR0FBRyxLQUFLLENBQUE7SUFFVCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QixxQkFBcUIsQ0FDdEIsQ0FBQTtJQUNILENBQUM7SUFFRCxNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFjLGtCQUFXLENBQUMsQ0FBQTtJQUUvRCxzREFBc0Q7SUFDdEQsTUFBTSxXQUFXLEdBQUcsTUFBTSxXQUFXLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQzNELE1BQU0sZUFBZSxHQUFHLFdBQXFELENBQUE7SUFDN0UsTUFBTSxlQUFlLEdBQUcsZUFBZSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUE7SUFFdEQsTUFBTSxXQUFXLENBQUMsV0FBVyxDQUFDO1FBQzVCLFFBQVEsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUU7UUFDekIsSUFBSSxFQUFFO1lBQ0osa0JBQWtCLEVBQUUsa0JBQWtCLElBQUksSUFBSTtZQUM5Qyx5QkFBeUIsRUFBRSx5QkFBeUIsSUFBSSxJQUFJO1lBQzVELDJCQUEyQixFQUFFLDJCQUEyQixJQUFJLElBQUk7WUFDaEUsaUJBQWlCLEVBQUUsaUJBQWlCLElBQUksS0FBSztZQUM3QyxHQUFHLENBQUMsUUFBUSxJQUFJO2dCQUNkLFFBQVEsRUFBRTtvQkFDUixHQUFHLGVBQWU7b0JBQ2xCLEdBQUcsUUFBUTtpQkFDWjthQUNGLENBQUM7U0FDSDtLQUNGLENBQUMsQ0FBQTtJQUVGLE1BQU0sSUFBSSxHQUFHLE1BQU0sV0FBVyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUVwRCxPQUFPLElBQUksNEJBQVksQ0FBc0M7UUFDM0QsSUFBSTtLQUNMLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FDRixDQUFBIn0=
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.validateSwapItemsStep = void 0;
|
|
4
4
|
const utils_1 = require("@medusajs/framework/utils");
|
|
5
5
|
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
|
|
6
|
+
const utils_2 = require("@medusajs/framework/utils");
|
|
6
7
|
exports.validateSwapItemsStep = (0, workflows_sdk_1.createStep)("validate-swap-items", async (input, { container }) => {
|
|
7
8
|
const { order, return_items, new_items } = input;
|
|
8
9
|
if (!return_items || return_items.length === 0) {
|
|
@@ -12,8 +13,60 @@ exports.validateSwapItemsStep = (0, workflows_sdk_1.createStep)("validate-swap-i
|
|
|
12
13
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "New items are required");
|
|
13
14
|
}
|
|
14
15
|
const orderItems = order.items || [];
|
|
15
|
-
//
|
|
16
|
-
|
|
16
|
+
// Check for existing returns/exchanges that might conflict with swap items
|
|
17
|
+
try {
|
|
18
|
+
const remoteQuery = container.resolve(utils_2.ContainerRegistrationKeys.REMOTE_QUERY);
|
|
19
|
+
// Query for existing returns on this order
|
|
20
|
+
const existingReturnsQuery = (0, utils_2.remoteQueryObjectFromString)({
|
|
21
|
+
entryPoint: "return",
|
|
22
|
+
fields: ["id", "order_id", "items.id", "items.variant_id"],
|
|
23
|
+
filters: {
|
|
24
|
+
order_id: [order.id],
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
const existingReturns = await remoteQuery(existingReturnsQuery);
|
|
28
|
+
const returnsArray = Array.isArray(existingReturns) ? existingReturns : existingReturns ? [existingReturns] : [];
|
|
29
|
+
// Check if any return items overlap with swap return items
|
|
30
|
+
if (returnsArray.length > 0) {
|
|
31
|
+
const returnedItemIds = new Set();
|
|
32
|
+
const returnedVariantIds = new Set();
|
|
33
|
+
returnsArray.forEach((ret) => {
|
|
34
|
+
const retData = ret;
|
|
35
|
+
retData.items?.forEach((item) => {
|
|
36
|
+
if (item.id)
|
|
37
|
+
returnedItemIds.add(item.id);
|
|
38
|
+
if (item.variant_id)
|
|
39
|
+
returnedVariantIds.add(item.variant_id);
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
// Check for ID overlap
|
|
43
|
+
for (const returnItem of return_items) {
|
|
44
|
+
if (returnedItemIds.has(returnItem.id)) {
|
|
45
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Cannot create swap: Order item "${returnItem.id}" is already part of an existing return for this order. Please use a different item or cancel the existing return first.`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Check for variant_id overlap (catch cases where item was replaced)
|
|
49
|
+
for (const returnItem of return_items) {
|
|
50
|
+
const orderItem = orderItems.find((item) => item.id === returnItem.id);
|
|
51
|
+
const orderItemVariantId = orderItem?.variant_id;
|
|
52
|
+
const itemVariantId = returnItem.variant_id || orderItemVariantId;
|
|
53
|
+
if (itemVariantId && returnedVariantIds.has(itemVariantId)) {
|
|
54
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Cannot create swap: The product variant "${itemVariantId}" for order item "${returnItem.id}" has already been returned. This item may have been replaced in the order.`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch (queryError) {
|
|
60
|
+
// If it's a validation error we threw, re-throw it
|
|
61
|
+
if (queryError instanceof utils_1.MedusaError) {
|
|
62
|
+
throw queryError;
|
|
63
|
+
}
|
|
64
|
+
// Otherwise, log warning but continue - this is just a safety check
|
|
65
|
+
console.warn("[Validate Swap Items] Failed to check existing returns/exchanges:", queryError);
|
|
66
|
+
}
|
|
67
|
+
// Validate return items exist in order and enrich with variant_id
|
|
68
|
+
// This enables safe ID mapping if order items change later
|
|
69
|
+
const enrichedReturnItems = return_items.map((returnItem) => {
|
|
17
70
|
const orderItem = orderItems.find((item) => item.id === returnItem.id);
|
|
18
71
|
if (!orderItem) {
|
|
19
72
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Return item with id ${returnItem.id} not found in order`);
|
|
@@ -23,6 +76,39 @@ exports.validateSwapItemsStep = (0, workflows_sdk_1.createStep)("validate-swap-i
|
|
|
23
76
|
if (returnItem.quantity > orderQuantity) {
|
|
24
77
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Return quantity ${returnItem.quantity} exceeds order quantity ${orderQuantity} for item ${returnItem.id}`);
|
|
25
78
|
}
|
|
79
|
+
// CRITICAL VALIDATION: Check if variant_id matches
|
|
80
|
+
// If a variant_id was provided, it must match the order item's variant_id
|
|
81
|
+
// This catches cases where the order item was replaced before swap creation
|
|
82
|
+
const orderVariantId = orderItemData.variant_id;
|
|
83
|
+
const providedVariantId = returnItem.variant_id;
|
|
84
|
+
if (providedVariantId && orderVariantId && providedVariantId !== orderVariantId) {
|
|
85
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Cannot create swap: Order item "${returnItem.id}" has been replaced with a different product variant. ` +
|
|
86
|
+
`Expected variant: "${providedVariantId}", but order has variant: "${orderVariantId}". ` +
|
|
87
|
+
`The order item may have been modified. Please refresh and try again with the current order items.`);
|
|
88
|
+
}
|
|
89
|
+
// Enrich return item with variant_id from order item for safe ID mapping
|
|
90
|
+
// Use existing variant_id if provided, otherwise get from order item
|
|
91
|
+
return {
|
|
92
|
+
...returnItem,
|
|
93
|
+
variant_id: returnItem.variant_id || orderItemData.variant_id, // Store variant_id for future ID mapping
|
|
94
|
+
};
|
|
95
|
+
});
|
|
96
|
+
// Explicit validation: Ensure return item variant_id matches order item variant_id
|
|
97
|
+
// This allows returning the same variant and catches mismatches
|
|
98
|
+
for (const returnItem of enrichedReturnItems) {
|
|
99
|
+
const orderItem = orderItems.find((item) => item.id === returnItem.id);
|
|
100
|
+
if (orderItem) {
|
|
101
|
+
const orderItemVariantId = orderItem?.variant_id;
|
|
102
|
+
const returnItemVariantId = returnItem.variant_id;
|
|
103
|
+
// If both have variant_id, they should match (allowing same variant returns)
|
|
104
|
+
if (orderItemVariantId && returnItemVariantId && orderItemVariantId !== returnItemVariantId) {
|
|
105
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Variant mismatch: Return item "${returnItem.id}" has variant "${returnItemVariantId}" but order item has variant "${orderItemVariantId}"`);
|
|
106
|
+
}
|
|
107
|
+
// Log when customer is returning the same variant (this is allowed)
|
|
108
|
+
if (orderItemVariantId && returnItemVariantId && orderItemVariantId === returnItemVariantId) {
|
|
109
|
+
console.log(`[Validate Swap Items] Customer returning same variant "${returnItemVariantId}" for order item "${returnItem.id}" in order ${order.id}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
26
112
|
}
|
|
27
113
|
// Validate new items have variant_id and quantity
|
|
28
114
|
for (const newItem of new_items) {
|
|
@@ -33,9 +119,21 @@ exports.validateSwapItemsStep = (0, workflows_sdk_1.createStep)("validate-swap-i
|
|
|
33
119
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `New item quantity must be greater than 0 for variant ${newItem.variant_id}`);
|
|
34
120
|
}
|
|
35
121
|
}
|
|
122
|
+
// Check if new items match variants already in order (allow same variant requests)
|
|
123
|
+
const orderVariantIds = new Set(orderItems
|
|
124
|
+
.map((item) => item.variant_id)
|
|
125
|
+
.filter((variantId) => Boolean(variantId)));
|
|
126
|
+
for (const newItem of new_items) {
|
|
127
|
+
if (orderVariantIds.has(newItem.variant_id)) {
|
|
128
|
+
// Same variant requested - this is allowed, but log for awareness
|
|
129
|
+
console.log(`[Validate Swap Items] Customer requesting same variant "${newItem.variant_id}" that's already in order ${order.id} (quantity: ${newItem.quantity})`);
|
|
130
|
+
// Optional: Add validation that quantity is reasonable
|
|
131
|
+
// For now, allow any quantity as long as variant exists
|
|
132
|
+
}
|
|
133
|
+
}
|
|
36
134
|
return new workflows_sdk_1.StepResponse({
|
|
37
|
-
return_items,
|
|
135
|
+
return_items: enrichedReturnItems, // Return enriched items with variant_id
|
|
38
136
|
new_items,
|
|
39
137
|
});
|
|
40
138
|
});
|
|
41
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
139
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUtc3dhcC1pdGVtcy1zdGVwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9zdGVwcy9zd2FwL3ZhbGlkYXRlLXN3YXAtaXRlbXMtc3RlcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxREFBdUQ7QUFDdkQscUVBQTRFO0FBQzVFLHFEQUFrRztBQTJCckYsUUFBQSxxQkFBcUIsR0FBRyxJQUFBLDBCQUFVLEVBQzdDLHFCQUFxQixFQUNyQixLQUFLLEVBQ0gsS0FBaUMsRUFDakMsRUFBRSxTQUFTLEVBQUUsRUFDdUMsRUFBRTtJQUN0RCxNQUFNLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsR0FBRyxLQUFLLENBQUE7SUFFaEQsSUFBSSxDQUFDLFlBQVksSUFBSSxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQy9DLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLDJCQUEyQixDQUM1QixDQUFBO0lBQ0gsQ0FBQztJQUVELElBQUksQ0FBQyxTQUFTLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6QyxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5Qix3QkFBd0IsQ0FDekIsQ0FBQTtJQUNILENBQUM7SUFFRCxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQTtJQUVwQywyRUFBMkU7SUFDM0UsSUFBSSxDQUFDO1FBQ0gsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FDbkMsaUNBQXlCLENBQUMsWUFBWSxDQUN2QyxDQUFBO1FBRUQsMkNBQTJDO1FBQzNDLE1BQU0sb0JBQW9CLEdBQUcsSUFBQSxtQ0FBMkIsRUFBQztZQUN2RCxVQUFVLEVBQUUsUUFBUTtZQUNw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
|
|
@@ -4,37 +4,81 @@ exports.approveSwapWorkflow = void 0;
|
|
|
4
4
|
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
|
|
5
5
|
const swap_1 = require("../steps/swap");
|
|
6
6
|
exports.approveSwapWorkflow = (0, workflows_sdk_1.createWorkflow)("approve-swap", (input) => {
|
|
7
|
-
const { swap_id, admin_id, return_location_id, return_shipping_method_id, outbound_shipping_method_id, send_notification, } = input;
|
|
8
|
-
//
|
|
9
|
-
|
|
10
|
-
// Store exchange details in metadata for audit trail
|
|
11
|
-
const { swap: approvedSwap } = (0, swap_1.updateSwapStatusStep)({
|
|
7
|
+
const { swap_id, admin_id, return_location_id, return_shipping_method_id, outbound_shipping_method_id, shipping_option_id, send_notification, } = input;
|
|
8
|
+
// Step 1: Retrieve swap to validate it's in requested status
|
|
9
|
+
const { swap: retrievedSwap } = (0, swap_1.retrieveSwapStep)({
|
|
12
10
|
swap_id,
|
|
13
|
-
|
|
11
|
+
});
|
|
12
|
+
// Step 2: Store exchange details and set pending_exchange_creation flag
|
|
13
|
+
// This must happen before creating return/exchange so the data is available
|
|
14
|
+
// The pending_exchange_creation flag allows createMedusaReturnStep to work
|
|
15
|
+
// with "requested" status
|
|
16
|
+
const { swap: swapWithExchangeDetails } = (0, swap_1.updateSwapExchangeDetailsStep)({
|
|
17
|
+
swap_id,
|
|
18
|
+
return_location_id,
|
|
19
|
+
return_shipping_method_id,
|
|
20
|
+
outbound_shipping_method_id,
|
|
21
|
+
send_notification,
|
|
14
22
|
metadata: {
|
|
15
|
-
approved_at: new Date().toISOString(),
|
|
16
|
-
approved_by: admin_id,
|
|
17
23
|
pending_exchange_creation: true,
|
|
18
24
|
exchange_details: {
|
|
19
25
|
return_location_id,
|
|
20
26
|
return_shipping_method_id,
|
|
21
27
|
outbound_shipping_method_id,
|
|
28
|
+
shipping_option_id,
|
|
22
29
|
send_notification,
|
|
23
30
|
configured_at: new Date().toISOString(),
|
|
24
31
|
},
|
|
25
32
|
},
|
|
26
33
|
});
|
|
27
|
-
//
|
|
28
|
-
|
|
34
|
+
// Step 3: Create Medusa Return
|
|
35
|
+
// This will work because pending_exchange_creation flag is set
|
|
36
|
+
// This will automatically rollback if it fails (workflow handles it)
|
|
37
|
+
const { return_id, swap: swapWithReturn } = (0, swap_1.createMedusaReturnStep)({
|
|
29
38
|
swap_id,
|
|
30
39
|
return_location_id,
|
|
31
40
|
return_shipping_method_id,
|
|
41
|
+
});
|
|
42
|
+
// Step 4: Create Medusa Exchange linked to return
|
|
43
|
+
// This will automatically rollback if it fails (workflow handles it)
|
|
44
|
+
// The exchange is created with the admin who approved it
|
|
45
|
+
// Pass shipping_option_id if provided (selected by admin in popup)
|
|
46
|
+
const { exchange_id, swap: swapWithExchange } = (0, swap_1.createMedusaExchangeStep)({
|
|
47
|
+
swap_id,
|
|
48
|
+
return_id,
|
|
32
49
|
outbound_shipping_method_id,
|
|
50
|
+
shipping_option_id,
|
|
33
51
|
send_notification,
|
|
34
52
|
});
|
|
53
|
+
// Step 5: Update swap status to approved and mark exchange as created
|
|
54
|
+
// This is the ONLY call to updateSwapStatusStep - if any previous step fails,
|
|
55
|
+
// workflow will rollback and swap will remain in "requested" status
|
|
56
|
+
const { swap: finalSwap } = (0, swap_1.updateSwapStatusStep)({
|
|
57
|
+
swap_id,
|
|
58
|
+
status: "approved",
|
|
59
|
+
metadata: {
|
|
60
|
+
approved_at: new Date().toISOString(),
|
|
61
|
+
approved_by: admin_id,
|
|
62
|
+
exchange_confirmed_at: new Date().toISOString(),
|
|
63
|
+
exchange_confirmed_by: admin_id,
|
|
64
|
+
exchange_id,
|
|
65
|
+
return_id,
|
|
66
|
+
pending_exchange_creation: false,
|
|
67
|
+
exchange_details: {
|
|
68
|
+
return_location_id,
|
|
69
|
+
return_shipping_method_id,
|
|
70
|
+
outbound_shipping_method_id,
|
|
71
|
+
shipping_option_id,
|
|
72
|
+
send_notification,
|
|
73
|
+
configured_at: new Date().toISOString(),
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
});
|
|
35
77
|
return new workflows_sdk_1.WorkflowResponse({
|
|
36
|
-
swap:
|
|
78
|
+
swap: finalSwap,
|
|
79
|
+
return_id,
|
|
80
|
+
exchange_id,
|
|
37
81
|
});
|
|
38
82
|
});
|
|
39
83
|
exports.default = exports.approveSwapWorkflow;
|
|
40
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
84
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwcm92ZS1zd2FwLXdvcmtmbG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9zd2Fwcy9hcHByb3ZlLXN3YXAtd29ya2Zsb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBRzBDO0FBQzFDLHdDQU1zQjtBQU1ULFFBQUEsbUJBQW1CLEdBQUcsSUFBQSw4QkFBYyxFQUMvQyxjQUFjLEVBQ2QsQ0FDRSxLQUErQixFQUNjLEVBQUU7SUFDL0MsTUFBTSxFQUNKLE9BQU8sRUFDUCxRQUFRLEVBQ1Isa0JBQWtCLEVBQ2xCLHlCQUF5QixFQUN6QiwyQkFBMkIsRUFDM0Isa0JBQWtCLEVBQ2xCLGlCQUFpQixHQUNsQixHQUFHLEtBQUssQ0FBQTtJQUVULDZEQUE2RDtJQUM3RCxNQUFNLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxHQUFHLElBQUEsdUJBQWdCLEVBQUM7UUFDL0MsT0FBTztLQUNSLENBQUMsQ0FBQTtJQUVGLHdFQUF3RTtJQUN4RSw0RUFBNEU7SUFDNUUsMkVBQTJFO0lBQzNFLDBCQUEwQjtJQUMxQixNQUFNLEVBQUUsSUFBSSxFQUFFLHVCQUF1QixFQUFFLEdBQUcsSUFBQSxvQ0FBNkIsRUFBQztRQUN0RSxPQUFPO1FBQ1Asa0JBQWtCO1FBQ2xCLHlCQUF5QjtRQUN6QiwyQkFBMkI7UUFDM0IsaUJBQWlCO1FBQ2pCLFFBQVEsRUFBRTtZQUNSLHlCQUF5QixFQUFFLElBQUk7WUFDL0IsZ0JBQWdCLEVBQUU7Z0JBQ2hCLGtCQUFrQjtnQkFDbEIseUJBQXlCO2dCQUN6QiwyQkFBMkI7Z0JBQzNCLGtCQUFrQjtnQkFDbEIsaUJBQWlCO2dCQUNqQixhQUFhLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7YUFDeEM7U0FDRjtLQUNGLENBQUMsQ0FBQTtJQUVGLCtCQUErQjtJQUMvQiwrREFBK0Q7SUFDL0QscUVBQXFFO0lBQ3JFLE1BQU0sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxHQUFHLElBQUEsNkJBQXNCLEVBQUM7UUFDakUsT0FBTztRQUNQLGtCQUFrQjtRQUNsQix5QkFBeUI7S0FDMUIsQ0FBQyxDQUFBO0lBRUYsa0RBQWtEO0lBQ2xELHFFQUFxRTtJQUNyRSx5REFBeUQ7SUFDekQsbUVBQW1FO0lBQ25FLE1BQU0sRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLEdBQUcsSUFBQSwrQkFBd0IsRUFBQztRQUN2RSxPQUFPO1FBQ1AsU0FBUztRQUNULDJCQUEyQjtRQUMzQixrQkFBa0I7UUFDbEIsaUJBQWlCO0tBQ2xCLENBQUMsQ0FBQTtJQUVGLHNFQUFzRTtJQUN0RSw4RUFBOEU7SUFDOUUsb0VBQW9FO0lBQ3BFLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEdBQUcsSUFBQSwyQkFBb0IsRUFBQztRQUMvQyxPQUFPO1FBQ1AsTUFBTSxFQUFFLFVBQVU7UUFDbEIsUUFBUSxFQUFFO1lBQ1IsV0FBVyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO1lBQ3JDLFdBQVcsRUFBRSxRQUFRO1lBQ3JCLHFCQUFxQixFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO1lBQy9DLHFCQUFxQixFQUFFLFFBQVE7WUFDL0IsV0FBVztZQUNYLFNBQVM7WUFDVCx5QkFBeUIsRUFBRSxLQUFLO1lBQ2hDLGdCQUFnQixFQUFFO2dCQUNoQixrQkFBa0I7Z0JBQ2xCLHlCQUF5QjtnQkFDekIsMkJBQTJCO2dCQUMzQixrQkFBa0I7Z0JBQ2xCLGlCQUFpQjtnQkFDakIsYUFBYSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO2FBQ3hDO1NBQ0Y7S0FDRixDQUFDLENBQUE7SUFFRixPQUFPLElBQUksZ0NBQWdCLENBQTRCO1FBQ3JELElBQUksRUFBRSxTQUFTO1FBQ2YsU0FBUztRQUNULFdBQVc7S0FDWixDQUFDLENBQUE7QUFDSixDQUFDLENBQ0YsQ0FBQTtBQUVELGtCQUFlLDJCQUFtQixDQUFBIn0=
|
package/package.json
CHANGED
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.POST = void 0;
|
|
4
|
-
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
-
const confirm_exchange_workflow_1 = require("../../../../../workflows/swaps/confirm-exchange-workflow");
|
|
6
|
-
const zod_1 = require("zod");
|
|
7
|
-
const ConfirmExchangeSchema = zod_1.z.object({
|
|
8
|
-
return_items: zod_1.z.array(zod_1.z.object({
|
|
9
|
-
item_id: zod_1.z.string(),
|
|
10
|
-
quantity: zod_1.z.number().positive(),
|
|
11
|
-
reason_id: zod_1.z.string().optional(),
|
|
12
|
-
})),
|
|
13
|
-
new_items: zod_1.z.array(zod_1.z.object({
|
|
14
|
-
variant_id: zod_1.z.string(),
|
|
15
|
-
quantity: zod_1.z.number().positive(),
|
|
16
|
-
})),
|
|
17
|
-
return_location_id: zod_1.z.string().optional(),
|
|
18
|
-
return_shipping_method_id: zod_1.z.string().optional(),
|
|
19
|
-
outbound_shipping_method_id: zod_1.z.string().optional(),
|
|
20
|
-
send_notification: zod_1.z.boolean().optional().default(false),
|
|
21
|
-
});
|
|
22
|
-
const POST = async (req, res) => {
|
|
23
|
-
const { id } = req.params;
|
|
24
|
-
if (!id) {
|
|
25
|
-
res.status(400).json({ message: "Swap ID is required" });
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
// Type-safe access to auth_context
|
|
29
|
-
const authContext = req.auth_context;
|
|
30
|
-
const adminId = authContext?.actor_id || authContext?.user_id || "admin";
|
|
31
|
-
try {
|
|
32
|
-
// Parse and validate request body
|
|
33
|
-
const exchangeData = ConfirmExchangeSchema.parse(req.body || {});
|
|
34
|
-
// Create exchange and approve swap
|
|
35
|
-
const { result } = await (0, confirm_exchange_workflow_1.confirmExchangeWorkflow)(req.scope).run({
|
|
36
|
-
input: {
|
|
37
|
-
swap_id: id,
|
|
38
|
-
admin_id: adminId,
|
|
39
|
-
return_items: exchangeData.return_items,
|
|
40
|
-
new_items: exchangeData.new_items,
|
|
41
|
-
return_location_id: exchangeData.return_location_id,
|
|
42
|
-
return_shipping_method_id: exchangeData.return_shipping_method_id,
|
|
43
|
-
outbound_shipping_method_id: exchangeData.outbound_shipping_method_id,
|
|
44
|
-
send_notification: exchangeData.send_notification,
|
|
45
|
-
},
|
|
46
|
-
});
|
|
47
|
-
res.json({
|
|
48
|
-
swap: result.swap,
|
|
49
|
-
return_id: result.return_id,
|
|
50
|
-
exchange_id: result.exchange_id,
|
|
51
|
-
message: "Exchange created and swap approved successfully.",
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
catch (error) {
|
|
55
|
-
// Handle Zod validation errors
|
|
56
|
-
if (error instanceof zod_1.z.ZodError) {
|
|
57
|
-
res.status(400).json({
|
|
58
|
-
message: "Invalid request data",
|
|
59
|
-
errors: error.errors,
|
|
60
|
-
});
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
// Extract error message - handle various error formats
|
|
64
|
-
let errorMessage = "Unknown error";
|
|
65
|
-
let errorStack;
|
|
66
|
-
let errorType;
|
|
67
|
-
if (error instanceof Error) {
|
|
68
|
-
errorMessage = error.message;
|
|
69
|
-
errorStack = error.stack;
|
|
70
|
-
errorType = error.type;
|
|
71
|
-
}
|
|
72
|
-
else if (error && typeof error === "object") {
|
|
73
|
-
const errorObj = error;
|
|
74
|
-
errorMessage = String(errorObj.message ||
|
|
75
|
-
errorObj.error ||
|
|
76
|
-
errorObj.reason ||
|
|
77
|
-
JSON.stringify(errorObj));
|
|
78
|
-
errorStack = errorObj.stack;
|
|
79
|
-
errorType = errorObj.type;
|
|
80
|
-
}
|
|
81
|
-
else {
|
|
82
|
-
errorMessage = String(error);
|
|
83
|
-
}
|
|
84
|
-
console.error("[Confirm Exchange] Error:", {
|
|
85
|
-
swap_id: id,
|
|
86
|
-
error_message: errorMessage,
|
|
87
|
-
error_type: errorType,
|
|
88
|
-
error_stack: errorStack,
|
|
89
|
-
});
|
|
90
|
-
if (error instanceof utils_1.MedusaError) {
|
|
91
|
-
const statusCode = error.type === utils_1.MedusaError.Types.NOT_FOUND
|
|
92
|
-
? 404
|
|
93
|
-
: error.type === utils_1.MedusaError.Types.INVALID_DATA
|
|
94
|
-
? 400
|
|
95
|
-
: 500;
|
|
96
|
-
res.status(statusCode).json({
|
|
97
|
-
message: error.message,
|
|
98
|
-
type: error.type,
|
|
99
|
-
});
|
|
100
|
-
return;
|
|
101
|
-
}
|
|
102
|
-
res.status(500).json({
|
|
103
|
-
message: "Failed to confirm exchange",
|
|
104
|
-
error: errorMessage,
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
};
|
|
108
|
-
exports.POST = POST;
|
|
109
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3N3YXBzL1tpZF0vY29uZmlybS1leGNoYW5nZS9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxxREFBdUQ7QUFDdkQsd0dBQWtHO0FBQ2xHLDZCQUF1QjtBQUV2QixNQUFNLHFCQUFxQixHQUFHLE9BQUMsQ0FBQyxNQUFNLENBQUM7SUFDckMsWUFBWSxFQUFFLE9BQUMsQ0FBQyxLQUFLLENBQ25CLE9BQUMsQ0FBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRTtRQUNuQixRQUFRLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtRQUMvQixTQUFTLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtLQUNqQyxDQUFDLENBQ0g7SUFDRCxTQUFTLEVBQUUsT0FBQyxDQUFDLEtBQUssQ0FDaEIsT0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNQLFVBQVUsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFO1FBQ3RCLFFBQVEsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0tBQ2hDLENBQUMsQ0FDSDtJQUNELGtCQUFrQixFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDekMseUJBQXlCLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUNoRCwyQkFBMkIsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ2xELGlCQUFpQixFQUFFLE9BQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO0NBQ3pELENBQUMsQ0FBQTtBQUVLLE1BQU0sSUFBSSxHQUFHLEtBQUssRUFDdkIsR0FBa0Is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
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.confirmExchangeWorkflow = void 0;
|
|
4
|
-
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
|
|
5
|
-
const swap_1 = require("../steps/swap");
|
|
6
|
-
exports.confirmExchangeWorkflow = (0, workflows_sdk_1.createWorkflow)("confirm-exchange", (input) => {
|
|
7
|
-
const { swap_id, admin_id, return_items, new_items, return_location_id, return_shipping_method_id, outbound_shipping_method_id, send_notification, } = input;
|
|
8
|
-
// Step 1: Retrieve swap to validate it's in requested status
|
|
9
|
-
const { swap: retrievedSwap } = (0, swap_1.retrieveSwapStep)({
|
|
10
|
-
swap_id,
|
|
11
|
-
});
|
|
12
|
-
// Step 2: Create Medusa Return
|
|
13
|
-
// Pass return_items from input (from exchange form)
|
|
14
|
-
const { return_id, swap: swapWithReturn } = (0, swap_1.createMedusaReturnStep)({
|
|
15
|
-
swap_id,
|
|
16
|
-
return_location_id,
|
|
17
|
-
return_shipping_method_id,
|
|
18
|
-
return_items: return_items,
|
|
19
|
-
});
|
|
20
|
-
// Step 3: Create Medusa Exchange linked to return
|
|
21
|
-
// Pass new_items from input (from exchange form)
|
|
22
|
-
// This will trigger Medusa's native exchange workflow which handles:
|
|
23
|
-
// - Fulfillment creation for new items
|
|
24
|
-
// - Payment Collection creation if difference_due > 0 (customer owes)
|
|
25
|
-
// - Refund processing if difference_due < 0 (customer gets refund)
|
|
26
|
-
// - Status transitions (requested → received → shipped → delivered)
|
|
27
|
-
const { exchange_id, swap: swapWithExchange } = (0, swap_1.createMedusaExchangeStep)({
|
|
28
|
-
swap_id,
|
|
29
|
-
return_id,
|
|
30
|
-
outbound_shipping_method_id,
|
|
31
|
-
send_notification,
|
|
32
|
-
new_items: new_items,
|
|
33
|
-
});
|
|
34
|
-
// Step 4: Update swap status to "approved" after successful exchange creation
|
|
35
|
-
const { swap: finalSwap } = (0, swap_1.updateSwapStatusStep)({
|
|
36
|
-
swap_id,
|
|
37
|
-
status: "approved",
|
|
38
|
-
metadata: {
|
|
39
|
-
exchange_confirmed_at: new Date().toISOString(),
|
|
40
|
-
exchange_confirmed_by: admin_id,
|
|
41
|
-
pending_exchange_creation: false,
|
|
42
|
-
},
|
|
43
|
-
});
|
|
44
|
-
return new workflows_sdk_1.WorkflowResponse({
|
|
45
|
-
swap: finalSwap,
|
|
46
|
-
return_id,
|
|
47
|
-
exchange_id,
|
|
48
|
-
});
|
|
49
|
-
});
|
|
50
|
-
exports.default = exports.confirmExchangeWorkflow;
|
|
51
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlybS1leGNoYW5nZS13b3JrZmxvdy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3Mvc3dhcHMvY29uZmlybS1leGNoYW5nZS13b3JrZmxvdy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxRUFHMEM7QUFDMUMsd0NBS3NCO0FBTVQsUUFBQSx1QkFBdUIsR0FBRyxJQUFBLDhCQUFjLEVBQ25ELGtCQUFrQixFQUNsQixDQUNFLEtBQW1DLEVBQ2MsRUFBRTtJQUNuRCxNQUFNLEVBQ0osT0FBTyxFQUNQLFFBQVEsRUFDUixZQUFZLEVBQ1osU0FBUyxFQUNULGtCQUFrQixFQUNsQix5QkFBeUIsRUFDekIsMkJBQTJCLEVBQzNCLGlCQUFpQixHQUNsQixHQUFHLEtBQUssQ0FBQTtJQUVULDZEQUE2RDtJQUM3RCxNQUFNLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxHQUFHLElBQUEsdUJBQWdCLEVBQUM7UUFDL0MsT0FBTztLQUNSLENBQUMsQ0FBQTtJQUVGLCtCQUErQjtJQUMvQixvREFBb0Q7SUFDcEQsTUFBTSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLEdBQUcsSUFBQSw2QkFBc0IsRUFBQztRQUNqRSxPQUFPO1FBQ1Asa0JBQWtCO1FBQ2xCLHlCQUF5QjtRQUN6QixZQUFZLEVBQUUsWUFBWTtLQUMzQixDQUFDLENBQUE7SUFFRixrREFBa0Q7SUFDbEQsaURBQWlEO0lBQ2pELHFFQUFxRTtJQUNyRSx1Q0FBdUM7SUFDdkMsc0VBQXNFO0lBQ3RFLG1FQUFtRTtJQUNuRSxvRUFBb0U7SUFDcEUsTUFBTSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxJQUFBLCtCQUF3QixFQUFDO1FBQ3ZFLE9BQU87UUFDUCxTQUFTO1FBQ1QsMkJBQTJCO1FBQzNCLGlCQUFpQjtRQUNqQixTQUFTLEVBQUUsU0FBUztLQUNyQixDQUFDLENBQUE7SUFFRiw4RUFBOEU7SUFDOUUsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxJQUFBLDJCQUFvQixFQUFDO1FBQy9DLE9BQU87UUFDUCxNQUFNLEVBQUUsVUFBVTtRQUNsQixRQUFRLEVBQUU7WUFDUixxQkFBcUIsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtZQUMvQyxxQkFBcUIsRUFBRSxRQUFRO1lBQy9CLHlCQUF5QixFQUFFLEtBQUs7U0FDakM7S0FDRixDQUFDLENBQUE7SUFFRixPQUFPLElBQUksZ0NBQWdCLENBQWdDO1FBQ3pELElBQUksRUFBRSxTQUFTO1FBQ2YsU0FBUztRQUNULFdBQVc7S0FDWixDQUFDLENBQUE7QUFDSixDQUFDLENBQ0YsQ0FBQTtBQUVELGtCQUFlLCtCQUF1QixDQUFBIn0=
|