order-management 0.0.101 → 0.0.102
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 +1717 -1707
- package/.medusa/server/src/admin/index.mjs +1718 -1708
- package/.medusa/server/src/api/store/carts/[id]/pickup/route.js +113 -0
- package/.medusa/server/src/api/store/guest-orders/[id]/returns/route.js +12 -1
- package/.medusa/server/src/api/store/guest-orders/[id]/swaps/route.js +14 -2
- package/.medusa/server/src/api/store/pickup-locations/route.js +20 -0
- package/.medusa/server/src/api/store/returns/route.js +15 -3
- package/.medusa/server/src/api/store/swaps/route.js +17 -2
- package/.medusa/server/src/config.js +4 -1
- package/.medusa/server/src/helpers/pickup-locations.js +155 -0
- package/.medusa/server/src/subscribers/order-status-change.js +37 -2
- package/.medusa/server/src/utils/order-fulfillment-metadata.js +68 -0
- package/README.md +10 -1
- package/package.json +1 -1
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.listPickupLocations = listPickupLocations;
|
|
4
|
+
exports.getPickupLocation = getPickupLocation;
|
|
5
|
+
exports.listReturnLocations = listReturnLocations;
|
|
6
|
+
exports.assertValidReturnLocation = assertValidReturnLocation;
|
|
7
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
8
|
+
const order_fulfillment_metadata_1 = require("../utils/order-fulfillment-metadata");
|
|
9
|
+
function str(value) {
|
|
10
|
+
return typeof value === "string" && value.trim() ? value.trim() : null;
|
|
11
|
+
}
|
|
12
|
+
function rows(value) {
|
|
13
|
+
return Array.isArray(value)
|
|
14
|
+
? value.filter((v) => Boolean(v && typeof v === "object"))
|
|
15
|
+
: [];
|
|
16
|
+
}
|
|
17
|
+
function optionCode(option) {
|
|
18
|
+
const type = option.type;
|
|
19
|
+
if (type && typeof type === "object" && !Array.isArray(type)) {
|
|
20
|
+
return str(type.code);
|
|
21
|
+
}
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
function isCustomerPickupOption(option) {
|
|
25
|
+
if (optionCode(option) === order_fulfillment_metadata_1.CUSTOMER_PICKUP_OPTION_CODE)
|
|
26
|
+
return true;
|
|
27
|
+
const data = option.data;
|
|
28
|
+
if (data && typeof data === "object" && !Array.isArray(data)) {
|
|
29
|
+
return data.customer_pickup === true;
|
|
30
|
+
}
|
|
31
|
+
return str(option.name) === "Store pickup";
|
|
32
|
+
}
|
|
33
|
+
function isCustomerVisible(location) {
|
|
34
|
+
const meta = location.metadata;
|
|
35
|
+
if (!meta || typeof meta !== "object" || Array.isArray(meta)) {
|
|
36
|
+
// No flag → treat as visible when a customer pickup option exists
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
const m = meta;
|
|
40
|
+
if (m.customer_visible === false || m.customer_visible === "false")
|
|
41
|
+
return false;
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
function findCustomerPickupOptionId(location) {
|
|
45
|
+
for (const set of rows(location.fulfillment_sets)) {
|
|
46
|
+
if (set.type && set.type !== "pickup")
|
|
47
|
+
continue;
|
|
48
|
+
for (const zone of rows(set.service_zones)) {
|
|
49
|
+
for (const option of rows(zone.shipping_options)) {
|
|
50
|
+
if (isCustomerPickupOption(option) && str(option.id)) {
|
|
51
|
+
return str(option.id);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
function toDto(location) {
|
|
59
|
+
const id = str(location.id);
|
|
60
|
+
if (!id)
|
|
61
|
+
return null;
|
|
62
|
+
if (!isCustomerVisible(location))
|
|
63
|
+
return null;
|
|
64
|
+
const shippingOptionId = findCustomerPickupOptionId(location);
|
|
65
|
+
if (!shippingOptionId)
|
|
66
|
+
return null;
|
|
67
|
+
const meta = location.metadata && typeof location.metadata === "object" && !Array.isArray(location.metadata)
|
|
68
|
+
? location.metadata
|
|
69
|
+
: {};
|
|
70
|
+
const addressRow = location.address && typeof location.address === "object" && !Array.isArray(location.address)
|
|
71
|
+
? location.address
|
|
72
|
+
: null;
|
|
73
|
+
return {
|
|
74
|
+
id,
|
|
75
|
+
name: str(location.name) ?? id,
|
|
76
|
+
address: addressRow
|
|
77
|
+
? {
|
|
78
|
+
address_1: str(addressRow.address_1),
|
|
79
|
+
address_2: str(addressRow.address_2),
|
|
80
|
+
city: str(addressRow.city),
|
|
81
|
+
province: str(addressRow.province),
|
|
82
|
+
postal_code: str(addressRow.postal_code),
|
|
83
|
+
country_code: str(addressRow.country_code),
|
|
84
|
+
phone: str(addressRow.phone),
|
|
85
|
+
}
|
|
86
|
+
: null,
|
|
87
|
+
metadata: meta,
|
|
88
|
+
shipping_option_id: shippingOptionId,
|
|
89
|
+
hours: str(meta.hours) ?? str(meta.opening_hours),
|
|
90
|
+
phone: str(meta.phone) ?? (addressRow ? str(addressRow.phone) : null),
|
|
91
|
+
public_name: str(meta.public_name) ?? str(location.name),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
const LOCATION_FIELDS = [
|
|
95
|
+
"id",
|
|
96
|
+
"name",
|
|
97
|
+
"metadata",
|
|
98
|
+
"address.address_1",
|
|
99
|
+
"address.address_2",
|
|
100
|
+
"address.city",
|
|
101
|
+
"address.province",
|
|
102
|
+
"address.postal_code",
|
|
103
|
+
"address.country_code",
|
|
104
|
+
"address.phone",
|
|
105
|
+
"fulfillment_sets.id",
|
|
106
|
+
"fulfillment_sets.type",
|
|
107
|
+
"fulfillment_sets.service_zones.id",
|
|
108
|
+
"fulfillment_sets.service_zones.shipping_options.id",
|
|
109
|
+
"fulfillment_sets.service_zones.shipping_options.name",
|
|
110
|
+
"fulfillment_sets.service_zones.shipping_options.type.code",
|
|
111
|
+
"fulfillment_sets.service_zones.shipping_options.data",
|
|
112
|
+
];
|
|
113
|
+
async function listPickupLocations(container) {
|
|
114
|
+
const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
115
|
+
const { data } = await query.graph({
|
|
116
|
+
entity: "stock_location",
|
|
117
|
+
fields: LOCATION_FIELDS,
|
|
118
|
+
});
|
|
119
|
+
return rows(data)
|
|
120
|
+
.map(toDto)
|
|
121
|
+
.filter((loc) => Boolean(loc))
|
|
122
|
+
.sort((a, b) => a.name.localeCompare(b.name));
|
|
123
|
+
}
|
|
124
|
+
async function getPickupLocation(container, locationId) {
|
|
125
|
+
const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
126
|
+
const { data } = await query.graph({
|
|
127
|
+
entity: "stock_location",
|
|
128
|
+
fields: LOCATION_FIELDS,
|
|
129
|
+
filters: { id: locationId },
|
|
130
|
+
});
|
|
131
|
+
const [location] = rows(data);
|
|
132
|
+
return location ? toDto(location) : null;
|
|
133
|
+
}
|
|
134
|
+
/** Locations that may receive customer returns/exchanges (same visibility rules as pickup). */
|
|
135
|
+
async function listReturnLocations(container) {
|
|
136
|
+
return listPickupLocations(container);
|
|
137
|
+
}
|
|
138
|
+
async function assertValidReturnLocation(container, locationId) {
|
|
139
|
+
const id = typeof locationId === "string" ? locationId.trim() : "";
|
|
140
|
+
if (!id || id === "default_location") {
|
|
141
|
+
return {
|
|
142
|
+
ok: false,
|
|
143
|
+
message: "A valid store location_id is required for return or exchange",
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
const location = await getPickupLocation(container, id);
|
|
147
|
+
if (!location) {
|
|
148
|
+
return {
|
|
149
|
+
ok: false,
|
|
150
|
+
message: `Store location "${id}" is not available for return or exchange`,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
return { ok: true, location };
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlja3VwLWxvY2F0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9oZWxwZXJzL3BpY2t1cC1sb2NhdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUErSUEsa0RBWUM7QUFFRCw4Q0FZQztBQUdELGtEQUlDO0FBRUQsOERBbUJDO0FBck1ELHFEQUFxRTtBQUVyRSxvRkFBaUY7QUErQmpGLFNBQVMsR0FBRyxDQUFDLEtBQWM7SUFDekIsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQTtBQUN4RSxDQUFDO0FBRUQsU0FBUyxJQUFJLENBQUMsS0FBYztJQUMxQixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQ3pCLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFZLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDO1FBQ3BFLENBQUMsQ0FBQyxFQUFFLENBQUE7QUFDUixDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsTUFBVztJQUM3QixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFBO0lBQ3hCLElBQUksSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUM3RCxPQUFPLEdBQUcsQ0FBRSxJQUFZLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDaEMsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQztBQUVELFNBQVMsc0JBQXNCLENBQUMsTUFBVztJQUN6QyxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyx3REFBMkI7UUFBRSxP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
|
|
@@ -14,15 +14,39 @@ async function resolveOrderFields(orderId, container) {
|
|
|
14
14
|
const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
15
15
|
const { data: orders = [] } = await query.graph({
|
|
16
16
|
entity: "order",
|
|
17
|
-
fields: ["id", "status", "display_id"],
|
|
17
|
+
fields: ["id", "status", "display_id", "metadata"],
|
|
18
18
|
filters: { id: orderId },
|
|
19
19
|
});
|
|
20
20
|
const order = Array.isArray(orders) ? orders[0] : orders;
|
|
21
|
+
const metadata = order?.metadata && typeof order.metadata === "object" && !Array.isArray(order.metadata)
|
|
22
|
+
? order.metadata
|
|
23
|
+
: {};
|
|
21
24
|
return {
|
|
22
25
|
status: order?.status,
|
|
23
26
|
display_id: (0, template_1.normalizeOrderDisplayId)(order?.display_id),
|
|
27
|
+
pickup_status: typeof metadata.pickup_status === "string" ? metadata.pickup_status : undefined,
|
|
28
|
+
payment_mode: typeof metadata.payment_mode === "string" ? metadata.payment_mode : undefined,
|
|
29
|
+
fulfillment_method: typeof metadata.fulfillment_method === "string"
|
|
30
|
+
? metadata.fulfillment_method
|
|
31
|
+
: undefined,
|
|
24
32
|
};
|
|
25
33
|
}
|
|
34
|
+
/** Map pickup metadata to notification statusConfig keys. */
|
|
35
|
+
function pickupNotificationStatuses(fields) {
|
|
36
|
+
const keys = [];
|
|
37
|
+
if (fields.fulfillment_method === "pickup" && fields.pickup_status === "ready") {
|
|
38
|
+
keys.push("pickup_ready");
|
|
39
|
+
}
|
|
40
|
+
if (fields.fulfillment_method === "pickup" && fields.pickup_status === "collected") {
|
|
41
|
+
keys.push("pickup_collected");
|
|
42
|
+
}
|
|
43
|
+
if (fields.fulfillment_method === "pickup" &&
|
|
44
|
+
fields.payment_mode === "pay_at_store" &&
|
|
45
|
+
fields.pickup_status === "collected") {
|
|
46
|
+
keys.push("pay_at_store_captured");
|
|
47
|
+
}
|
|
48
|
+
return keys;
|
|
49
|
+
}
|
|
26
50
|
/**
|
|
27
51
|
* Subscriber handler for order status change events
|
|
28
52
|
* Sends configured notifications based on the new order status
|
|
@@ -74,6 +98,17 @@ async function orderStatusChangeHandler({ event, container, }) {
|
|
|
74
98
|
return;
|
|
75
99
|
}
|
|
76
100
|
await (0, notification_handler_1.handleOrderStatusNotifications)(orderId, status, container);
|
|
101
|
+
// Extra keys for store-pickup / pay-at-store (configure under notifications.statusConfig)
|
|
102
|
+
if (event.name === "order.updated" || event.name === "order.placed") {
|
|
103
|
+
for (const pickupKey of pickupNotificationStatuses(resolved)) {
|
|
104
|
+
await (0, notification_handler_1.handleOrderStatusNotifications)(orderId, pickupKey, container);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if (event.name === "order.placed" &&
|
|
108
|
+
resolved.fulfillment_method === "pickup" &&
|
|
109
|
+
resolved.payment_mode === "pay_at_store") {
|
|
110
|
+
await (0, notification_handler_1.handleOrderStatusNotifications)(orderId, "pickup_pay_at_store_placed", container);
|
|
111
|
+
}
|
|
77
112
|
}
|
|
78
113
|
catch (error) {
|
|
79
114
|
console.error("[Order Status Change Subscriber] Error processing order status change:", error);
|
|
@@ -95,4 +130,4 @@ exports.config = {
|
|
|
95
130
|
"delivery.created", // When order is delivered
|
|
96
131
|
],
|
|
97
132
|
};
|
|
98
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
133
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXItc3RhdHVzLWNoYW5nZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zdWJzY3JpYmVycy9vcmRlci1zdGF0dXMtY2hhbmdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTBGQSwyQ0FpRUM7QUF6SkQscURBQXFFO0FBQ3JFLHdFQUE4RTtBQUM5RSx1REFBNkQ7QUFDN0QsZ0RBQTJEO0FBUTNEOzs7R0FHRztBQUNILEtBQUssVUFBVSxrQkFBa0IsQ0FDL0IsT0FBZSxFQUNmLFNBQXdCO0lBUXhCLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQVEsaUNBQXlCLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDdkUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEdBQUcsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQzlDLE1BQU0sRUFBRSxPQUFPO1FBQ2YsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsVUFBVSxDQUFDO1FBQ2xELE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUU7S0FDekIsQ0FBQyxDQUFBO0lBQ0YsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUE7SUFDeEQsTUFBTSxRQUFRLEdBQ1osS0FBSyxFQUFFLFFBQVEsSUFBSSxPQUFPLEtBQUssQ0FBQyxRQUFRLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQ3JGLENBQUMsQ0FBRSxLQUFLLENBQUMsUUFBb0M7UUFDN0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtJQUNSLE9BQU87UUFDTCxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQTRCO1FBQzNDLFVBQVUsRUFB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
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Cart / order metadata contract for delivery vs store pickup and payment mode.
|
|
4
|
+
* Used by storefront, order-management, and POS pickup queues.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.CUSTOMER_PICKUP_OPTION_CODE = exports.PICKUP_STATUS_KEY = exports.PAYMENT_MODE_KEY = exports.PICKUP_LOCATION_NAME_KEY = exports.PICKUP_LOCATION_ID_KEY = exports.FULFILLMENT_METHOD_KEY = void 0;
|
|
8
|
+
exports.isFulfillmentMethod = isFulfillmentMethod;
|
|
9
|
+
exports.isPaymentMode = isPaymentMode;
|
|
10
|
+
exports.readFulfillmentMetadata = readFulfillmentMetadata;
|
|
11
|
+
exports.buildPickupCartMetadata = buildPickupCartMetadata;
|
|
12
|
+
exports.buildDeliveryCartMetadata = buildDeliveryCartMetadata;
|
|
13
|
+
exports.FULFILLMENT_METHOD_KEY = "fulfillment_method";
|
|
14
|
+
exports.PICKUP_LOCATION_ID_KEY = "pickup_location_id";
|
|
15
|
+
exports.PICKUP_LOCATION_NAME_KEY = "pickup_location_name";
|
|
16
|
+
exports.PAYMENT_MODE_KEY = "payment_mode";
|
|
17
|
+
exports.PICKUP_STATUS_KEY = "pickup_status";
|
|
18
|
+
exports.CUSTOMER_PICKUP_OPTION_CODE = "customer-pickup";
|
|
19
|
+
function isFulfillmentMethod(value) {
|
|
20
|
+
return value === "delivery" || value === "pickup";
|
|
21
|
+
}
|
|
22
|
+
function isPaymentMode(value) {
|
|
23
|
+
return value === "online" || value === "pay_at_store" || value === "cod";
|
|
24
|
+
}
|
|
25
|
+
function readFulfillmentMetadata(metadata) {
|
|
26
|
+
if (!metadata || typeof metadata !== "object")
|
|
27
|
+
return {};
|
|
28
|
+
const out = {};
|
|
29
|
+
if (isFulfillmentMethod(metadata[exports.FULFILLMENT_METHOD_KEY])) {
|
|
30
|
+
out[exports.FULFILLMENT_METHOD_KEY] = metadata[exports.FULFILLMENT_METHOD_KEY];
|
|
31
|
+
}
|
|
32
|
+
const loc = metadata[exports.PICKUP_LOCATION_ID_KEY];
|
|
33
|
+
if (typeof loc === "string" && loc.trim()) {
|
|
34
|
+
out[exports.PICKUP_LOCATION_ID_KEY] = loc.trim();
|
|
35
|
+
}
|
|
36
|
+
if (isPaymentMode(metadata[exports.PAYMENT_MODE_KEY])) {
|
|
37
|
+
out[exports.PAYMENT_MODE_KEY] = metadata[exports.PAYMENT_MODE_KEY];
|
|
38
|
+
}
|
|
39
|
+
const status = metadata[exports.PICKUP_STATUS_KEY];
|
|
40
|
+
if (status === "pending" || status === "ready" || status === "collected") {
|
|
41
|
+
out[exports.PICKUP_STATUS_KEY] = status;
|
|
42
|
+
}
|
|
43
|
+
return out;
|
|
44
|
+
}
|
|
45
|
+
function buildPickupCartMetadata(input) {
|
|
46
|
+
return {
|
|
47
|
+
...(input.existing && typeof input.existing === "object" ? input.existing : {}),
|
|
48
|
+
[exports.FULFILLMENT_METHOD_KEY]: "pickup",
|
|
49
|
+
[exports.PICKUP_LOCATION_ID_KEY]: input.locationId,
|
|
50
|
+
...(input.locationName
|
|
51
|
+
? { [exports.PICKUP_LOCATION_NAME_KEY]: input.locationName }
|
|
52
|
+
: {}),
|
|
53
|
+
[exports.PAYMENT_MODE_KEY]: input.paymentMode ?? "online",
|
|
54
|
+
[exports.PICKUP_STATUS_KEY]: "pending",
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function buildDeliveryCartMetadata(input) {
|
|
58
|
+
const next = {
|
|
59
|
+
...(input.existing && typeof input.existing === "object" ? input.existing : {}),
|
|
60
|
+
[exports.FULFILLMENT_METHOD_KEY]: "delivery",
|
|
61
|
+
[exports.PAYMENT_MODE_KEY]: input.paymentMode ?? "online",
|
|
62
|
+
};
|
|
63
|
+
delete next[exports.PICKUP_LOCATION_ID_KEY];
|
|
64
|
+
delete next[exports.PICKUP_LOCATION_NAME_KEY];
|
|
65
|
+
delete next[exports.PICKUP_STATUS_KEY];
|
|
66
|
+
return next;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXItZnVsZmlsbG1lbnQtbWV0YWRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvb3JkZXItZnVsZmlsbG1lbnQtbWV0YWRhdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7R0FHRzs7O0FBcUJILGtEQUVDO0FBRUQsc0NBRUM7QUFFRCwwREFvQkM7QUFFRCwwREFnQkM7QUFFRCw4REFhQztBQWhGWSxRQUFBLHNCQUFzQixHQUFHLG9CQUFvQixDQUFBO0FBQzdDLFFBQUEsc0JBQXNCLEdBQUcsb0JBQW9CLENBQUE7QUFDN0MsUUFBQSx3QkFBd0IsR0FBRyxzQkFBc0IsQ0FBQTtBQUNqRCxRQUFBLGdCQUFnQixHQUFHLGNBQWMsQ0FBQTtBQUNqQyxRQUFBLGlCQUFpQixHQUFHLGVBQWUsQ0FBQTtBQUNuQyxRQUFBLDJCQUEyQixHQUFHLGlCQUFpQixDQUFBO0FBYzVELFNBQWdCLG1CQUFtQixDQUFDLEtBQWM7SUFDaEQsT0FBTyxLQUFLLEtBQUssVUFBVSxJQUFJLEtBQUssS0FBSyxRQUFRLENBQUE7QUFDbkQsQ0FBQztBQUVELFNBQWdCLGFBQWEsQ0FBQyxLQUFjO0lBQzFDLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssY0FBYyxJQUFJLEtBQUssS0FBSyxLQUFLLENBQUE7QUFDMUUsQ0FBQztBQUVELFNBQWdCLHVCQUF1QixDQUNyQyxRQUFvRDtJQUVwRCxJQUFJLENBQUMsUUFBUSxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVE7UUFBRSxPQUFPLEVBQUUsQ0FBQTtJQUN4RCxNQUFNLEdBQUcsR0FBNkIsRUFBRSxDQUFBO0lBQ3hDLElBQUksbUJBQW1CLENBQUMsUUFBUSxDQUFDLDhCQUFzQixDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzFELEdBQUcsQ0FBQyw4QkFBc0IsQ0FBQyxHQUFHLFFBQVEsQ0FBQyw4QkFBc0IsQ0FBQyxDQUFBO0lBQ2hFLENBQUM7SUFDRCxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsOEJBQXNCLENBQUMsQ0FBQTtJQUM1QyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUMxQyxHQUFHLENBQUMsOEJBQXNCLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUE7SUFDMUMsQ0FBQztJQUNELElBQUksYUFBYSxDQUFDLFFBQVEsQ0FBQyx3QkFBZ0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM5QyxHQUFHLENBQUMsd0JBQWdCLENBQUMsR0FBRyxRQUFRLENBQUMsd0JBQWdCLENBQUMsQ0FBQTtJQUNwRCxDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLHlCQUFpQixDQUFDLENBQUE7SUFDMUMsSUFBSSxNQUFNLEtBQUssU0FBUyxJQUFJLE1BQU0sS0FBSyxPQUFPLElBQUksTUFBTSxLQUFLLFdBQVcsRUFBRSxDQUFDO1FBQ3pFLEdBQUcsQ0FBQyx5QkFBaUIsQ0FBQyxHQUFHLE1BQU0sQ0FBQTtJQUNqQyxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUE7QUFDWixDQUFDO0FBRUQsU0FBZ0IsdUJBQXVCLENBQUMsS0FLdkM7SUFDQyxPQUFPO1FBQ0wsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLElBQUksT0FBTyxLQUFLLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQy9FLENBQUMsOEJBQXNCLENBQUMsRUFBRSxRQUFvQztRQUM5RCxDQUFDLDhCQUFzQixDQUFDLEVBQUUsS0FBSyxDQUFDLFVBQVU7UUFDMUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxZQUFZO1lBQ3BCLENBQUMsQ0FBQyxFQUFFLENBQUMsZ0NBQXdCLENBQUMsRUFBRSxLQUFLLENBQUMsWUFBWSxFQUFFO1lBQ3BELENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDUCxDQUFDLHdCQUFnQixDQUFDLEVBQUUsS0FBSyxDQUFDLFdBQVcsSUFBSSxRQUFRO1FBQ2pELENBQUMseUJBQWlCLENBQUMsRUFBRSxTQUFnQztLQUN0RCxDQUFBO0FBQ0gsQ0FBQztBQUVELFNBQWdCLHlCQUF5QixDQUFDLEtBR3pDO0lBQ0MsTUFBTSxJQUFJLEdBQTRCO1FBQ3BDLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxJQUFJLE9BQU8sS0FBSyxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMvRSxDQUFDLDhCQUFzQixDQUFDLEVBQUUsVUFBc0M7UUFDaEUsQ0FBQyx3QkFBZ0IsQ0FBQyxFQUFFLEtBQUssQ0FBQyxXQUFXLElBQUksUUFBUTtLQUNsRCxDQUFBO0lBQ0QsT0FBTyxJQUFJLENBQUMsOEJBQXNCLENBQUMsQ0FBQTtJQUNuQyxPQUFPLElBQUksQ0FBQyxnQ0FBd0IsQ0FBQyxDQUFBO0lBQ3JDLE9BQU8sSUFBSSxDQUFDLHlCQUFpQixDQUFDLENBQUE7SUFDOUIsT0FBTyxJQUFJLENBQUE7QUFDYixDQUFDIn0=
|
package/README.md
CHANGED
|
@@ -9,7 +9,8 @@
|
|
|
9
9
|
- payment detail storage (`upi`, `bank`, `card`) and default payment rules,
|
|
10
10
|
- refund payment mapping and admin refund context tooling,
|
|
11
11
|
- order status email/notification subscribers,
|
|
12
|
-
- admin UI routes/widgets for returns, swaps, payments, refunds
|
|
12
|
+
- admin UI routes/widgets for returns, swaps, payments, refunds,
|
|
13
|
+
- **store pickup / pay-at-store** helpers (`GET /store/pickup-locations`, `POST /store/carts/:id/pickup`) and required return-store `location_id` validation.
|
|
13
14
|
|
|
14
15
|
It solves common gaps where storefronts need secure post-purchase self-service (especially for guest orders), richer refund operations, and operational admin screens without implementing all workflows manually.
|
|
15
16
|
|
|
@@ -40,6 +41,9 @@ export default defineConfig({
|
|
|
40
41
|
otpTemplate: "src/templates/emails/otp.html",
|
|
41
42
|
orderConfirmTemplate: "src/templates/emails/order-confirmation.html",
|
|
42
43
|
},
|
|
44
|
+
allowPayAtStore: true,
|
|
45
|
+
requireReturnStoreLocation: true,
|
|
46
|
+
capture_payment_on_pickup: true,
|
|
43
47
|
},
|
|
44
48
|
},
|
|
45
49
|
],
|
|
@@ -80,9 +84,14 @@ Source: `src/types/order-management-options.ts`, normalized by `src/config.ts`.
|
|
|
80
84
|
| `notifications.enabled` | `boolean` | No | `false` | Enables status-based notification subscriber handling. |
|
|
81
85
|
| `notifications.statusConfig` | `Record<string, NotificationConfig[]>` | No | `{}` | Map of order status to rules. Email/push: `template` = file path. SMS Twilio: `template` = inline body string. SMS MSG91: `template_obj: { templateId, varMap? }`. Optional `getRecipient`. |
|
|
82
86
|
| `capture_payment_on_delivered` | `boolean` | No | `true` | Auto-capture remaining authorized amount on delivery events. |
|
|
87
|
+
| `capture_payment_on_pickup` | `boolean` | No | `true` | Capture pay-at-store / authorized amount when store pickup is collected. |
|
|
88
|
+
| `allowPayAtStore` | `boolean` | No | `true` | Allow offline payment for web store-pickup carts. |
|
|
89
|
+
| `requireReturnStoreLocation` | `boolean` | No | `true` | Require a valid stock location on return/exchange create. |
|
|
83
90
|
| `returnValidInDays` | `number` | No | `7` | Return request window in days from `delivered_at`. |
|
|
84
91
|
| `exchangeValidInDays` | `number` | No | `7` | Exchange request window in days from `delivered_at`. |
|
|
85
92
|
|
|
93
|
+
Pickup / pay-at-store notification keys (under `notifications.statusConfig`): `pickup_pay_at_store_placed`, `pickup_ready`, `pickup_collected`, `pay_at_store_captured`.
|
|
94
|
+
|
|
86
95
|
Example:
|
|
87
96
|
|
|
88
97
|
```ts
|