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.
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLXN3YXAtZXhjaGFuZ2UtZGV0YWlscy1zdGVwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9zdGVwcy9zd2FwL3VwZGF0ZS1zd2FwLWV4Y2hhbmdlLWRldGFpbHMtc3RlcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxREFBdUQ7QUFDdkQscUVBQTRFO0FBQzVFLGdEQUFtRDtBQWV0QyxRQUFBLDZCQUE2QixHQUFHLElBQUEsMEJBQVUsRUFDckQsOEJBQThCLEVBQzlCLEtBQUssRUFDSCxLQUF5QyxFQUN6QyxFQUFFLFNBQVMsRUFBRSxFQUMrQyxFQUFFO0lBQzlELE1BQU0sRUFDSixPQUFPLEVBQ1Asa0JBQWtCLEVBQ2xCLHlCQUF5QixFQUN6QiwyQkFBMkIsRUFDM0IsaUJBQWlCLEdBQ2xCLEdBQUcsS0FBSyxDQUFBO0lBRVQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2IsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIscUJBQXFCLENBQ3RCLENBQUE7SUFDSCxDQUFDO0lBRUQsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBYyxrQkFBVyxDQUFDLENBQUE7SUFFL0QsTUFBTSxXQUFXLENBQUMsV0FBVyxDQUFDO1FBQzVCLFFBQVEsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUU7UUFDekIsSUFBSSxFQUFFO1lBQ0osa0JBQWtCLEVBQUUsa0JBQWtCLElBQUksSUFBSTtZQUM5Qyx5QkFBeUIsRUFBRSx5QkFBeUIsSUFBSSxJQUFJO1lBQzVELDJCQUEyQixFQUFFLDJCQUEyQixJQUFJLElBQUk7WUFDaEUsaUJBQWlCLEVBQUUsaUJBQWlCLElBQUksS0FBSztTQUM5QztLQUNGLENBQUMsQ0FBQTtJQUVGLE1BQU0sSUFBSSxHQUFHLE1BQU0sV0FBVyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUVwRCxPQUFPLElBQUksNEJBQVksQ0FBc0M7UUFDM0QsSUFBSTtLQUNMLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FDRixDQUFBIn0=
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
- // Validate return items exist in order
16
- for (const returnItem of return_items) {
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUtc3dhcC1pdGVtcy1zdGVwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9zdGVwcy9zd2FwL3ZhbGlkYXRlLXN3YXAtaXRlbXMtc3RlcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxREFBdUQ7QUFDdkQscUVBQTRFO0FBeUIvRCxRQUFBLHFCQUFxQixHQUFHLElBQUEsMEJBQVUsRUFDN0MscUJBQXFCLEVBQ3JCLEtBQUssRUFDSCxLQUFpQyxFQUNqQyxFQUFFLFNBQVMsRUFBRSxFQUN1QyxFQUFFO0lBQ3RELE1BQU0sRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxHQUFHLEtBQUssQ0FBQTtJQUVoRCxJQUFJLENBQUMsWUFBWSxJQUFJLFlBQVksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDL0MsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsMkJBQTJCLENBQzVCLENBQUE7SUFDSCxDQUFDO0lBRUQsSUFBSSxDQUFDLFNBQVMsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3pDLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLHdCQUF3QixDQUN6QixDQUFBO0lBQ0gsQ0FBQztJQUVELE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFBO0lBRXBDLHVDQUF1QztJQUN2QyxLQUFLLE1BQU0sVUFBVSxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3RDLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQy9CLENBQUMsSUFBcUIsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxVQUFVLENBQUMsRUFBRSxDQUNyRCxDQUFBO1FBRUQsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2YsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsdUJBQXVCLFVBQVUsQ0FBQyxFQUFFLHFCQUFxQixDQUMxRCxDQUFBO1FBQ0gsQ0FBQztRQUVELE1BQU0sYUFBYSxHQUFHLFNBQWtDLENBQUE7UUFDeEQsTUFBTSxhQUFhLEdBQUcsYUFBYSxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUE7UUFFakQsSUFBSSxVQUFVLENBQUMsUUFBUSxHQUFHLGFBQWEsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLG1CQUFtQixVQUFVLENBQUMsUUFBUSwyQkFBMkIsYUFBYSxhQUFhLFVBQVUsQ0FBQyxFQUFFLEVBQUUsQ0FDM0csQ0FBQTtRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsa0RBQWtEO0lBQ2xELEtBQUssTUFBTSxPQUFPLElBQUksU0FBUyxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN4QixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QixpQ0FBaUMsQ0FDbEMsQ0FBQTtRQUNILENBQUM7UUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsSUFBSSxPQUFPLENBQUMsUUFBUSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQy9DLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLHdEQUF3RCxPQUFPLENBQUMsVUFBVSxFQUFFLENBQzdFLENBQUE7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sSUFBSSw0QkFBWSxDQUE4QjtRQUNuRCxZQUFZO1FBQ1osU0FBUztLQUNWLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FDRixDQUFBIn0=
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
- // Store exchange details but keep status as "requested"
9
- // Status will change to "approved" when exchange is confirmed
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
- status: "requested", // Keep as requested until exchange is confirmed
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
- // Also store exchange details in model fields directly
28
- const { swap: swapWithExchangeDetails } = (0, swap_1.updateSwapExchangeDetailsStep)({
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: swapWithExchangeDetails,
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwcm92ZS1zd2FwLXdvcmtmbG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9zd2Fwcy9hcHByb3ZlLXN3YXAtd29ya2Zsb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBRzBDO0FBQzFDLHdDQUdzQjtBQU1ULFFBQUEsbUJBQW1CLEdBQUcsSUFBQSw4QkFBYyxFQUMvQyxjQUFjLEVBQ2QsQ0FDRSxLQUErQixFQUNjLEVBQUU7SUFDL0MsTUFBTSxFQUNKLE9BQU8sRUFDUCxRQUFRLEVBQ1Isa0JBQWtCLEVBQ2xCLHlCQUF5QixFQUN6QiwyQkFBMkIsRUFDM0IsaUJBQWlCLEdBQ2xCLEdBQUcsS0FBSyxDQUFBO0lBRVQsd0RBQXdEO0lBQ3hELDhEQUE4RDtJQUM5RCxxREFBcUQ7SUFDckQsTUFBTSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsR0FBRyxJQUFBLDJCQUFvQixFQUFDO1FBQ2xELE9BQU87UUFDUCxNQUFNLEVBQUUsV0FBVyxFQUFFLGdEQUFnRDtRQUNyRSxRQUFRLEVBQUU7WUFDUixXQUFXLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7WUFDckMsV0FBVyxFQUFFLFFBQVE7WUFDckIseUJBQXlCLEVBQUUsSUFBSTtZQUMvQixnQkFBZ0IsRUFBRTtnQkFDaEIsa0JBQWtCO2dCQUNsQix5QkFBeUI7Z0JBQ3pCLDJCQUEyQjtnQkFDM0IsaUJBQWlCO2dCQUNqQixhQUFhLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7YUFDeEM7U0FDRjtLQUNGLENBQUMsQ0FBQTtJQUVGLHVEQUF1RDtJQUN2RCxNQUFNLEVBQUUsSUFBSSxFQUFFLHVCQUF1QixFQUFFLEdBQUcsSUFBQSxvQ0FBNkIsRUFBQztRQUN0RSxPQUFPO1FBQ1Asa0JBQWtCO1FBQ2xCLHlCQUF5QjtRQUN6QiwyQkFBMkI7UUFDM0IsaUJBQWlCO0tBQ2xCLENBQUMsQ0FBQTtJQUVGLE9BQU8sSUFBSSxnQ0FBZ0IsQ0FBNEI7UUFDckQsSUFBSSxFQUFFLHVCQUF1QjtLQUM5QixDQUFDLENBQUE7QUFDSixDQUFDLENBQ0YsQ0FBQTtBQUVELGtCQUFlLDJCQUFtQixDQUFBIn0=
84
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwcm92ZS1zd2FwLXdvcmtmbG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9zd2Fwcy9hcHByb3ZlLXN3YXAtd29ya2Zsb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBRzBDO0FBQzFDLHdDQU1zQjtBQU1ULFFBQUEsbUJBQW1CLEdBQUcsSUFBQSw4QkFBYyxFQUMvQyxjQUFjLEVBQ2QsQ0FDRSxLQUErQixFQUNjLEVBQUU7SUFDL0MsTUFBTSxFQUNKLE9BQU8sRUFDUCxRQUFRLEVBQ1Isa0JBQWtCLEVBQ2xCLHlCQUF5QixFQUN6QiwyQkFBMkIsRUFDM0Isa0JBQWtCLEVBQ2xCLGlCQUFpQixHQUNsQixHQUFHLEtBQUssQ0FBQTtJQUVULDZEQUE2RDtJQUM3RCxNQUFNLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxHQUFHLElBQUEsdUJBQWdCLEVBQUM7UUFDL0MsT0FBTztLQUNSLENBQUMsQ0FBQTtJQUVGLHdFQUF3RTtJQUN4RSw0RUFBNEU7SUFDNUUsMkVBQTJFO0lBQzNFLDBCQUEwQjtJQUMxQixNQUFNLEVBQUUsSUFBSSxFQUFFLHVCQUF1QixFQUFFLEdBQUcsSUFBQSxvQ0FBNkIsRUFBQztRQUN0RSxPQUFPO1FBQ1Asa0JBQWtCO1FBQ2xCLHlCQUF5QjtRQUN6QiwyQkFBMkI7UUFDM0IsaUJBQWlCO1FBQ2pCLFFBQVEsRUFBRTtZQUNSLHlCQUF5QixFQUFFLElBQUk7WUFDL0IsZ0JBQWdCLEVBQUU7Z0JBQ2hCLGtCQUFrQjtnQkFDbEIseUJBQXlCO2dCQUN6QiwyQkFBMkI7Z0JBQzNCLGtCQUFrQjtnQkFDbEIsaUJBQWlCO2dCQUNqQixhQUFhLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7YUFDeEM7U0FDRjtLQUNGLENBQUMsQ0FBQTtJQUVGLCtCQUErQjtJQUMvQiwrREFBK0Q7SUFDL0QscUVBQXFFO0lBQ3JFLE1BQU0sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxHQUFHLElBQUEsNkJBQXNCLEVBQUM7UUFDakUsT0FBTztRQUNQLGtCQUFrQjtRQUNsQix5QkFBeUI7S0FDMUIsQ0FBQyxDQUFBO0lBRUYsa0RBQWtEO0lBQ2xELHFFQUFxRTtJQUNyRSx5REFBeUQ7SUFDekQsbUVBQW1FO0lBQ25FLE1BQU0sRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLEdBQUcsSUFBQSwrQkFBd0IsRUFBQztRQUN2RSxPQUFPO1FBQ1AsU0FBUztRQUNULDJCQUEyQjtRQUMzQixrQkFBa0I7UUFDbEIsaUJBQWlCO0tBQ2xCLENBQUMsQ0FBQTtJQUVGLHNFQUFzRTtJQUN0RSw4RUFBOEU7SUFDOUUsb0VBQW9FO0lBQ3BFLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEdBQUcsSUFBQSwyQkFBb0IsRUFBQztRQUMvQyxPQUFPO1FBQ1AsTUFBTSxFQUFFLFVBQVU7UUFDbEIsUUFBUSxFQUFFO1lBQ1IsV0FBVyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO1lBQ3JDLFdBQVcsRUFBRSxRQUFRO1lBQ3JCLHFCQUFxQixFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO1lBQy9DLHFCQUFxQixFQUFFLFFBQVE7WUFDL0IsV0FBVztZQUNYLFNBQVM7WUFDVCx5QkFBeUIsRUFBRSxLQUFLO1lBQ2hDLGdCQUFnQixFQUFFO2dCQUNoQixrQkFBa0I7Z0JBQ2xCLHlCQUF5QjtnQkFDekIsMkJBQTJCO2dCQUMzQixrQkFBa0I7Z0JBQ2xCLGlCQUFpQjtnQkFDakIsYUFBYSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO2FBQ3hDO1NBQ0Y7S0FDRixDQUFDLENBQUE7SUFFRixPQUFPLElBQUksZ0NBQWdCLENBQTRCO1FBQ3JELElBQUksRUFBRSxTQUFTO1FBQ2YsU0FBUztRQUNULFdBQVc7S0FDWixDQUFDLENBQUE7QUFDSixDQUFDLENBQ0YsQ0FBQTtBQUVELGtCQUFlLDJCQUFtQixDQUFBIn0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "order-management",
3
- "version": "0.0.23",
3
+ "version": "0.0.25",
4
4
  "description": "A starter for Medusa plugins.",
5
5
  "author": "Medusa (https://medusajs.com)",
6
6
  "license": "MIT",
@@ -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=