@lodashventure/medusa-membership 0.1.3 → 0.3.1
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/api/middlewares.js +15 -1
- package/.medusa/server/src/api/store/customers/me/member-tier/route.js +74 -4
- package/.medusa/server/src/api/store/customers/me/wishlist/route.js +1 -1
- package/.medusa/server/src/api/store/promotion-codes/[id]/collect/route.js +3 -3
- package/.medusa/server/src/api/store/promotion-codes/[id]/route.js +3 -3
- package/.medusa/server/src/api/store/promotion-codes/route.js +3 -3
- package/.medusa/server/src/modules/membership/migrations/Migration20250416034358.js +2 -2
- package/.medusa/server/src/modules/membership/migrations/Migration20250416231624.js +2 -2
- package/.medusa/server/src/modules/membership/migrations/Migration20250418020235.js +2 -2
- package/.medusa/server/src/modules/membership/migrations/Migration20250420014232.js +2 -2
- package/.medusa/server/src/modules/membership/migrations/Migration20250420050937.js +2 -2
- package/.medusa/server/src/modules/membership/migrations/Migration20250421010109.js +2 -2
- package/.medusa/server/src/modules/membership/migrations/Migration20250421011451.js +2 -2
- package/.medusa/server/src/modules/membership/migrations/Migration20250422230822.js +2 -2
- package/.medusa/server/src/modules/membership/migrations/Migration20250423021328.js +2 -2
- package/.medusa/server/src/modules/membership/migrations/Migration20250423021925.js +2 -2
- package/.medusa/server/src/modules/membership/migrations/Migration20250424011144.js +2 -2
- package/.medusa/server/src/modules/membership/migrations/Migration20250507013347.js +2 -2
- package/.medusa/server/src/modules/promotion-cache/service.js +5 -1
- package/.medusa/server/src/modules/usable-promo/migrations/Migration20250504044646.js +2 -2
- package/.medusa/server/src/modules/wishlist/migrations/Migration20250424011114.js +2 -2
- package/.medusa/server/src/subscribers/customer-created.js +33 -4
- package/.medusa/server/src/subscribers/order-canceled.js +48 -0
- package/.medusa/server/src/subscribers/order-completed.js +62 -16
- package/.medusa/server/src/subscribers/order-fulfilled.js +68 -0
- package/.medusa/server/src/subscribers/order-payment-captured.js +111 -0
- package/.medusa/server/src/subscribers/order-placed.js +83 -9
- package/.medusa/server/src/subscribers/return-received.js +48 -0
- package/.medusa/server/src/workflows/membership/create-membership.js +27 -6
- package/.medusa/server/src/workflows/membership/void-membership-points.js +110 -0
- package/.medusa/server/src/workflows/usable-promo/invalidateUsedPromotionWorkflow.js +8 -2
- package/package.json +17 -30
|
@@ -2,11 +2,40 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.config = void 0;
|
|
4
4
|
exports.default = customerCreatedHandler;
|
|
5
|
-
const
|
|
5
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
6
6
|
const create_membership_consent_1 = require("../workflows/membership-consent/create-membership-consent");
|
|
7
7
|
const create_membership_notification_1 = require("../workflows/membership-notification/create-membership-notification");
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
const create_membership_1 = require("../workflows/membership/create-membership");
|
|
9
|
+
async function customerCreatedHandler({ event: { data }, container, }) {
|
|
10
|
+
const logger = container.resolve("logger");
|
|
11
|
+
try {
|
|
12
|
+
// Create membership for the new customer
|
|
13
|
+
const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
14
|
+
// Check if membership is enabled in store configuration
|
|
15
|
+
const { data: [store], } = await query.graph({
|
|
16
|
+
entity: "store",
|
|
17
|
+
fields: ["id", "membership_config.*"],
|
|
18
|
+
});
|
|
19
|
+
if (store?.membership_config?.enable_membership) {
|
|
20
|
+
logger.log(`[Membership] Creating membership for new customer ${data.id}`);
|
|
21
|
+
// Create membership with 0 points (customer starts at the lowest tier)
|
|
22
|
+
await create_membership_1.createMembershipWorkflow.run({
|
|
23
|
+
input: {
|
|
24
|
+
customer_id: data.id,
|
|
25
|
+
points: 0,
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
logger.log(`[Membership] Successfully created membership for customer ${data.id}`);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
logger.log(`[Membership] Membership is disabled in store configuration, skipping membership creation for customer ${data.id}`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
logger.error(`[Membership] Error creating membership for customer ${data.id}:`, error);
|
|
36
|
+
// Don't throw error to avoid blocking customer creation flow
|
|
37
|
+
}
|
|
38
|
+
// Continue with existing notification and consent workflows
|
|
10
39
|
await create_membership_notification_1.createMembershipNotificationWorkflow.run({
|
|
11
40
|
input: {
|
|
12
41
|
customer_id: data.id,
|
|
@@ -23,4 +52,4 @@ async function customerCreatedHandler({ event: { data }, }) {
|
|
|
23
52
|
exports.config = {
|
|
24
53
|
event: `customer.created`,
|
|
25
54
|
};
|
|
26
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tZXItY3JlYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zdWJzY3JpYmVycy9jdXN0b21lci1jcmVhdGVkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQVVBLHlDQW9EQztBQXpERCxxREFBc0U7QUFDdEUseUdBQTRHO0FBQzVHLHdIQUEySDtBQUMzSCxpRkFBcUY7QUFFdEUsS0FBSyxVQUFVLHNCQUFzQixDQUFDLEVBQ25ELEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxFQUNmLFNBQVMsR0FDc0I7SUFDL0IsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUUzQyxJQUFJLENBQUM7UUFDSCx5Q0FBeUM7UUFDekMsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVqRSx3REFBd0Q7UUFDeEQsTUFBTSxFQUNKLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUNkLEdBQUcsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ3BCLE1BQU0sRUFBRSxPQUFPO1lBQ2YsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLHFCQUFxQixDQUFDO1NBQ3RDLENBQUMsQ0FBQztRQUVILElBQUksS0FBSyxFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLENBQUM7WUFDaEQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxxREFBcUQsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFFM0UsdUVBQXVFO1lBQ3ZFLE1BQU0sNENBQXdCLENBQUMsR0FBRyxDQUFDO2dCQUNqQyxLQUFLLEVBQUU7b0JBQ0wsV0FBVyxFQUFFLElBQUksQ0FBQyxFQUFFO29CQUNwQixNQUFNLEVBQUUsQ0FBQztpQkFDVjthQUNGLENBQUMsQ0FBQztZQUVILE1BQU0sQ0FBQyxHQUFHLENBQUMsNkRBQTZELElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3JGLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxDQUFDLEdBQUcsQ0FBQyx5R0FBeUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDakksQ0FBQztJQUNILENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsTUFBTSxDQUFDLEtBQUssQ0FBQyx1REFBdUQsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3ZGLDZEQUE2RDtJQUMvRCxDQUFDO0lBRUQsNERBQTREO0lBQzVELE1BQU0scUVBQW9DLENBQUMsR0FBRyxDQUFDO1FBQzdDLEtBQUssRUFBRTtZQUNMLFdBQVcsRUFBRSxJQUFJLENBQUMsRUFBRTtTQUNyQjtLQUNGLENBQUMsQ0FBQztJQUNILE1BQU0sQ0FBQyxHQUFHLENBQUMscUNBQXFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRTNELE1BQU0sMkRBQStCLENBQUMsR0FBRyxDQUFDO1FBQ3hDLEtBQUssRUFBRTtZQUNMLFdBQVcsRUFBRSxJQUFJLENBQUMsRUFBRTtTQUNyQjtLQUNGLENBQUMsQ0FBQztJQUNILE1BQU0sQ0FBQyxHQUFHLENBQUMsaUNBQWlDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3pELENBQUM7QUFFWSxRQUFBLE1BQU0sR0FBcUI7SUFDdEMsS0FBSyxFQUFFLGtCQUFrQjtDQUMxQixDQUFDIn0=
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.config = void 0;
|
|
4
|
+
exports.default = orderCanceledHandler;
|
|
5
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
6
|
+
const void_membership_points_1 = require("../workflows/membership/void-membership-points");
|
|
7
|
+
async function orderCanceledHandler({ event: { data }, container, }) {
|
|
8
|
+
try {
|
|
9
|
+
console.log(`[Membership] Processing order.canceled event for order: ${data.id}`);
|
|
10
|
+
const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
11
|
+
// Get order details
|
|
12
|
+
const { data: orders, } = await query.graph({
|
|
13
|
+
entity: "order",
|
|
14
|
+
fields: ["id", "customer_id", "status"],
|
|
15
|
+
filters: {
|
|
16
|
+
id: data.id,
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
if (!orders?.length) {
|
|
20
|
+
console.error(`[Membership] Order ${data.id} not found`);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const order = orders[0];
|
|
24
|
+
console.log(`[Membership] Order details - ID: ${order.id}, Status: ${order.status}, Customer: ${order.customer_id}`);
|
|
25
|
+
// Check if customer exists
|
|
26
|
+
if (!order.customer_id) {
|
|
27
|
+
console.log(`[Membership] Order ${order.id} has no customer (guest checkout), skipping void points`);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
// Void membership points for this canceled order
|
|
31
|
+
await void_membership_points_1.voidMembershipPointsWorkflow.run({
|
|
32
|
+
input: {
|
|
33
|
+
customer_id: order.customer_id,
|
|
34
|
+
order_id: order.id,
|
|
35
|
+
reason: "order_canceled",
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
console.log(`[Membership] Successfully processed cancellation for order ${order.id}`);
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
console.error(`[Membership] Error processing order.canceled for order ${data.id}:`, error);
|
|
42
|
+
// Don't throw error to avoid blocking order flow
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
exports.config = {
|
|
46
|
+
event: `order.canceled`,
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXItY2FuY2VsZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc3Vic2NyaWJlcnMvb3JkZXItY2FuY2VsZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBSUEsdUNBZ0RDO0FBbkRELHFEQUFzRTtBQUN0RSwyRkFBOEY7QUFFL0UsS0FBSyxVQUFVLG9CQUFvQixDQUFDLEVBQ2pELEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxFQUNmLFNBQVMsR0FDc0I7SUFDL0IsSUFBSSxDQUFDO1FBQ0gsT0FBTyxDQUFDLEdBQUcsQ0FBQywyREFBMkQsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFbEYsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVqRSxvQkFBb0I7UUFDcEIsTUFBTSxFQUNKLElBQUksRUFBRSxNQUFNLEdBQ2IsR0FBRyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDcEIsTUFBTSxFQUFFLE9BQU87WUFDZixNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQztZQUN2QyxPQUFPLEVBQUU7Z0JBQ1AsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFO2FBQ1o7U0FDRixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQ3BCLE9BQU8sQ0FBQyxLQUFLLENBQUMsc0JBQXNCLElBQUksQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQ3pELE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0NBQW9DLEtBQUssQ0FBQyxFQUFFLGFBQWEsS0FBSyxDQUFDLE1BQU0sZUFBZSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUVySCwyQkFBMkI7UUFDM0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN2QixPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQixLQUFLLENBQUMsRUFBRSx5REFBeUQsQ0FBQyxDQUFDO1lBQ3JHLE9BQU87UUFDVCxDQUFDO1FBRUQsaURBQWlEO1FBQ2pELE1BQU0scURBQTRCLENBQUMsR0FBRyxDQUFDO1lBQ3JDLEtBQUssRUFBRTtnQkFDTCxXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7Z0JBQzlCLFFBQVEsRUFBRSxLQUFLLENBQUMsRUFBRTtnQkFDbEIsTUFBTSxFQUFFLGdCQUFnQjthQUN6QjtTQUNGLENBQUMsQ0FBQztRQUVILE9BQU8sQ0FBQyxHQUFHLENBQUMsOERBQThELEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3hGLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQywwREFBMEQsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNGLGlEQUFpRDtJQUNuRCxDQUFDO0FBQ0gsQ0FBQztBQUVZLFFBQUEsTUFBTSxHQUFxQjtJQUN0QyxLQUFLLEVBQUUsZ0JBQWdCO0NBQ3hCLENBQUMifQ==
|
|
@@ -5,23 +5,69 @@ exports.default = orderCompletedHandler;
|
|
|
5
5
|
const utils_1 = require("@medusajs/framework/utils");
|
|
6
6
|
const add_membership_points_1 = require("../workflows/membership/add-membership-points");
|
|
7
7
|
async function orderCompletedHandler({ event: { data }, container, }) {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
8
|
+
try {
|
|
9
|
+
console.log(`[Membership] ======= ORDER COMPLETED EVENT RECEIVED =======`);
|
|
10
|
+
console.log(`[Membership] Processing order.completed event for order: ${data.id}`);
|
|
11
|
+
const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
12
|
+
const { data: orders, } = await query.graph({
|
|
13
|
+
entity: "order",
|
|
14
|
+
fields: ["id", "total", "subtotal", "customer_id", "status"],
|
|
15
|
+
filters: {
|
|
16
|
+
id: data.id,
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
if (!orders?.length) {
|
|
20
|
+
console.error(`[Membership] Order ${data.id} not found`);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const order = orders[0];
|
|
24
|
+
console.log(`[Membership] Order details - ID: ${order.id}, Status: ${order.status}, Customer: ${order.customer_id}, Total: ${order.total}`);
|
|
25
|
+
// Check if customer exists
|
|
26
|
+
if (!order.customer_id) {
|
|
27
|
+
console.log(`[Membership] Order ${order.id} has no customer (guest checkout), skipping membership points`);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
// Check if points were already added for this order (to avoid double points)
|
|
31
|
+
// This check is important because points should be added on payment_captured event
|
|
32
|
+
const { data: membershipTransactions } = await query.graph({
|
|
33
|
+
entity: "membership_transaction",
|
|
34
|
+
fields: ["id", "source", "points"],
|
|
35
|
+
filters: {
|
|
36
|
+
source: `order: ${order.id}`,
|
|
37
|
+
customer_id: order.customer_id,
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
if (membershipTransactions && membershipTransactions.length > 0) {
|
|
41
|
+
// Check if there are positive points (not voided)
|
|
42
|
+
const hasPositivePoints = membershipTransactions.some(t => t.points > 0);
|
|
43
|
+
if (hasPositivePoints) {
|
|
44
|
+
console.log(`[Membership] Points already added for order ${order.id} (likely via payment_captured event), skipping to avoid duplication`);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Use subtotal instead of total to exclude shipping/taxes from points calculation
|
|
49
|
+
const spending = order.subtotal || order.total || 0;
|
|
50
|
+
if (spending <= 0) {
|
|
51
|
+
console.log(`[Membership] Order ${order.id} has no spending amount, skipping membership points`);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
console.log(`[Membership] Adding membership points for customer ${order.customer_id}, spending: ${spending}`);
|
|
55
|
+
await add_membership_points_1.addMemberShipPointsWorkflow.run({
|
|
56
|
+
input: {
|
|
57
|
+
customer_id: order.customer_id,
|
|
58
|
+
spending: spending,
|
|
59
|
+
source: `order: ${order.id}`,
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
console.log(`[Membership] Successfully added membership points for order ${order.id}`);
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
console.error(`[Membership] Error processing order.completed for order ${data.id}:`, error);
|
|
66
|
+
// Don't throw error to avoid blocking order flow
|
|
67
|
+
// Membership points can be added manually if needed
|
|
68
|
+
}
|
|
23
69
|
}
|
|
24
70
|
exports.config = {
|
|
25
71
|
event: `order.completed`,
|
|
26
72
|
};
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
73
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXItY29tcGxldGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3N1YnNjcmliZXJzL29yZGVyLWNvbXBsZXRlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFJQSx3Q0E2RUM7QUFoRkQscURBQXNFO0FBQ3RFLHlGQUE0RjtBQUU3RSxLQUFLLFVBQVUscUJBQXFCLENBQUMsRUFDbEQsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQ2YsU0FBUyxHQUNzQjtJQUMvQixJQUFJLENBQUM7UUFDSCxPQUFPLENBQUMsR0FBRyxDQUFDLDZEQUE2RCxDQUFDLENBQUM7UUFDM0UsT0FBTyxDQUFDLEdBQUcsQ0FBQyw0REFBNEQsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFbkYsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqRSxNQUFNLEVBQ0osSUFBSSxFQUFFLE1BQU0sR0FDYixHQUFHLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQztZQUNwQixNQUFNLEVBQUUsT0FBTztZQUNmLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUM7WUFDNUQsT0FBTyxFQUFFO2dCQUNQLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRTthQUNaO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUNwQixPQUFPLENBQUMsS0FBSyxDQUFDLHNCQUFzQixJQUFJLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQztZQUN6RCxPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QixPQUFPLENBQUMsR0FBRyxDQUFDLG9DQUFvQyxLQUFLLENBQUMsRUFBRSxhQUFhLEtBQUssQ0FBQyxNQUFNLGVBQWUsS0FBSyxDQUFDLFdBQVcsWUFBWSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUU1SSwyQkFBMkI7UUFDM0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN2QixPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQixLQUFLLENBQUMsRUFBRSwrREFBK0QsQ0FBQyxDQUFDO1lBQzNHLE9BQU87UUFDVCxDQUFDO1FBRUQsNkVBQTZFO1FBQzdFLG1GQUFtRjtRQUNuRixNQUFNLEVBQUUsSUFBSSxFQUFFLHNCQUFzQixFQUFFLEdBQUcsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ3pELE1BQU0sRUFBRSx3QkFBd0I7WUFDaEMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUM7WUFDbEMsT0FBTyxFQUFFO2dCQUNQLE1BQU0sRUFBRSxVQUFVLEtBQUssQ0FBQyxFQUFFLEVBQUU7Z0JBQzVCLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVzthQUMvQjtTQUNGLENBQUMsQ0FBQztRQUVILElBQUksc0JBQXNCLElBQUksc0JBQXNCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2hFLGtEQUFrRDtZQUNsRCxNQUFNLGlCQUFpQixHQUFHLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDekUsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO2dCQUN0QixPQUFPLENBQUMsR0FBRyxDQUFDLCtDQUErQyxLQUFLLENBQUMsRUFBRSxxRUFBcUUsQ0FBQyxDQUFDO2dCQUMxSSxPQUFPO1lBQ1QsQ0FBQztRQUNILENBQUM7UUFFRCxrRkFBa0Y7UUFDbEYsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQztRQUVwRCxJQUFJLFFBQVEsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNsQixPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQixLQUFLLENBQUMsRUFBRSxxREFBcUQsQ0FBQyxDQUFDO1lBQ2pHLE9BQU87UUFDVCxDQUFDO1FBRUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzREFBc0QsS0FBSyxDQUFDLFdBQVcsZUFBZSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBRTlHLE1BQU0sbURBQTJCLENBQUMsR0FBRyxDQUFDO1lBQ3BDLEtBQUssRUFBRTtnQkFDTCxXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7Z0JBQzlCLFFBQVEsRUFBRSxRQUFRO2dCQUNsQixNQUFNLEVBQUUsVUFBVSxLQUFLLENBQUMsRUFBRSxFQUFFO2FBQzdCO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsT0FBTyxDQUFDLEdBQUcsQ0FBQywrREFBK0QsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDekYsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLDJEQUEyRCxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDNUYsaURBQWlEO1FBQ2pELG9EQUFvRDtJQUN0RCxDQUFDO0FBQ0gsQ0FBQztBQUVZLFFBQUEsTUFBTSxHQUFxQjtJQUN0QyxLQUFLLEVBQUUsaUJBQWlCO0NBQ3pCLENBQUMifQ==
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.config = void 0;
|
|
4
|
+
exports.default = orderFulfilledHandler;
|
|
5
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
6
|
+
const add_membership_points_1 = require("../workflows/membership/add-membership-points");
|
|
7
|
+
async function orderFulfilledHandler({ event: { data }, container, }) {
|
|
8
|
+
try {
|
|
9
|
+
console.log(`[Membership] Processing order.fulfilled event for order: ${data.id}`);
|
|
10
|
+
const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
11
|
+
// Get order details and check if points were already added
|
|
12
|
+
const { data: orders, } = await query.graph({
|
|
13
|
+
entity: "order",
|
|
14
|
+
fields: ["id", "total", "subtotal", "customer_id", "status", "metadata"],
|
|
15
|
+
filters: {
|
|
16
|
+
id: data.id,
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
if (!orders?.length) {
|
|
20
|
+
console.error(`[Membership] Order ${data.id} not found`);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const order = orders[0];
|
|
24
|
+
console.log(`[Membership] Order details - ID: ${order.id}, Status: ${order.status}, Customer: ${order.customer_id}, Total: ${order.total}`);
|
|
25
|
+
// Check if customer exists
|
|
26
|
+
if (!order.customer_id) {
|
|
27
|
+
console.log(`[Membership] Order ${order.id} has no customer (guest checkout), skipping membership points`);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
// Check if points were already added for this order (to avoid double points)
|
|
31
|
+
const { data: membershipTransactions } = await query.graph({
|
|
32
|
+
entity: "membership_transaction",
|
|
33
|
+
fields: ["id", "source"],
|
|
34
|
+
filters: {
|
|
35
|
+
source: `order: ${order.id}`,
|
|
36
|
+
customer_id: order.customer_id,
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
if (membershipTransactions?.length > 0) {
|
|
40
|
+
console.log(`[Membership] Points already added for order ${order.id}, skipping to avoid duplication`);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
// Use subtotal instead of total to exclude shipping/taxes from points calculation
|
|
44
|
+
const spending = order.subtotal || order.total || 0;
|
|
45
|
+
if (spending <= 0) {
|
|
46
|
+
console.log(`[Membership] Order ${order.id} has no spending amount, skipping membership points`);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
console.log(`[Membership] Adding membership points for customer ${order.customer_id}, spending: ${spending}`);
|
|
50
|
+
await add_membership_points_1.addMemberShipPointsWorkflow.run({
|
|
51
|
+
input: {
|
|
52
|
+
customer_id: order.customer_id,
|
|
53
|
+
spending: spending,
|
|
54
|
+
source: `order: ${order.id}`,
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
console.log(`[Membership] Successfully added membership points for fulfilled order ${order.id}`);
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
console.error(`[Membership] Error processing order.fulfilled for order ${data.id}:`, error);
|
|
61
|
+
// Don't throw error to avoid blocking order flow
|
|
62
|
+
// Membership points can be added manually if needed
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
exports.config = {
|
|
66
|
+
event: `order.fulfilled`,
|
|
67
|
+
};
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXItZnVsZmlsbGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3N1YnNjcmliZXJzL29yZGVyLWZ1bGZpbGxlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFJQSx3Q0F5RUM7QUE1RUQscURBQXNFO0FBQ3RFLHlGQUE0RjtBQUU3RSxLQUFLLFVBQVUscUJBQXFCLENBQUMsRUFDbEQsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQ2YsU0FBUyxHQUNzQjtJQUMvQixJQUFJLENBQUM7UUFDSCxPQUFPLENBQUMsR0FBRyxDQUFDLDREQUE0RCxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVuRixNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWpFLDJEQUEyRDtRQUMzRCxNQUFNLEVBQ0osSUFBSSxFQUFFLE1BQU0sR0FDYixHQUFHLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQztZQUNwQixNQUFNLEVBQUUsT0FBTztZQUNmLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDO1lBQ3hFLE9BQU8sRUFBRTtnQkFDUCxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUU7YUFDWjtTQUNGLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDcEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsSUFBSSxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDekQsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQ0FBb0MsS0FBSyxDQUFDLEVBQUUsYUFBYSxLQUFLLENBQUMsTUFBTSxlQUFlLEtBQUssQ0FBQyxXQUFXLFlBQVksS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFFNUksMkJBQTJCO1FBQzNCLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdkIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsS0FBSyxDQUFDLEVBQUUsK0RBQStELENBQUMsQ0FBQztZQUMzRyxPQUFPO1FBQ1QsQ0FBQztRQUVELDZFQUE2RTtRQUM3RSxNQUFNLEVBQUUsSUFBSSxFQUFFLHNCQUFzQixFQUFFLEdBQUcsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ3pELE1BQU0sRUFBRSx3QkFBd0I7WUFDaEMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQztZQUN4QixPQUFPLEVBQUU7Z0JBQ1AsTUFBTSxFQUFFLFVBQVUsS0FBSyxDQUFDLEVBQUUsRUFBRTtnQkFDNUIsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO2FBQy9CO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsSUFBSSxzQkFBc0IsRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdkMsT0FBTyxDQUFDLEdBQUcsQ0FBQywrQ0FBK0MsS0FBSyxDQUFDLEVBQUUsaUNBQWlDLENBQUMsQ0FBQztZQUN0RyxPQUFPO1FBQ1QsQ0FBQztRQUVELGtGQUFrRjtRQUNsRixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDO1FBRXBELElBQUksUUFBUSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2xCLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLEtBQUssQ0FBQyxFQUFFLHFEQUFxRCxDQUFDLENBQUM7WUFDakcsT0FBTztRQUNULENBQUM7UUFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLHNEQUFzRCxLQUFLLENBQUMsV0FBVyxlQUFlLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFFOUcsTUFBTSxtREFBMkIsQ0FBQyxHQUFHLENBQUM7WUFDcEMsS0FBSyxFQUFFO2dCQUNMLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztnQkFDOUIsUUFBUSxFQUFFLFFBQVE7Z0JBQ2xCLE1BQU0sRUFBRSxVQUFVLEtBQUssQ0FBQyxFQUFFLEVBQUU7YUFDN0I7U0FDRixDQUFDLENBQUM7UUFFSCxPQUFPLENBQUMsR0FBRyxDQUFDLHlFQUF5RSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNuRyxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsMkRBQTJELElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM1RixpREFBaUQ7UUFDakQsb0RBQW9EO0lBQ3RELENBQUM7QUFDSCxDQUFDO0FBRVksUUFBQSxNQUFNLEdBQXFCO0lBQ3RDLEtBQUssRUFBRSxpQkFBaUI7Q0FDekIsQ0FBQyJ9
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.config = void 0;
|
|
4
|
+
exports.default = paymentCapturedHandler;
|
|
5
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
6
|
+
const add_membership_points_1 = require("../workflows/membership/add-membership-points");
|
|
7
|
+
async function paymentCapturedHandler({ event: { data }, container, }) {
|
|
8
|
+
try {
|
|
9
|
+
console.log(`[Membership] ======= PAYMENT CAPTURED EVENT RECEIVED =======`);
|
|
10
|
+
console.log(`[Membership] Processing payment.captured event for payment: ${data.id}`);
|
|
11
|
+
console.log(`[Membership] Raw event data:`, JSON.stringify(data, null, 2));
|
|
12
|
+
const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
13
|
+
// Get payment with payment collection
|
|
14
|
+
const { data: payments } = await query.graph({
|
|
15
|
+
entity: "payment",
|
|
16
|
+
fields: ["id", "amount", "payment_collection_id"],
|
|
17
|
+
filters: {
|
|
18
|
+
id: data.id,
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
console.log(`[Membership] Payment query result:`, JSON.stringify(payments, null, 2));
|
|
22
|
+
if (!payments?.length) {
|
|
23
|
+
console.log(`[Membership] Payment ${data.id} not found, skipping membership points`);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const payment = payments[0];
|
|
27
|
+
if (!payment.payment_collection_id) {
|
|
28
|
+
console.log(`[Membership] Payment ${data.id} has no payment_collection_id, skipping membership points`);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
// Get payment collection with linked order using Medusa v2 link module
|
|
32
|
+
const { data: paymentCollections } = await query.graph({
|
|
33
|
+
entity: "payment_collection",
|
|
34
|
+
fields: [
|
|
35
|
+
"id",
|
|
36
|
+
"order.id",
|
|
37
|
+
"order.customer_id",
|
|
38
|
+
"order.status",
|
|
39
|
+
"order.total",
|
|
40
|
+
"order.subtotal",
|
|
41
|
+
],
|
|
42
|
+
filters: {
|
|
43
|
+
id: payment.payment_collection_id,
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
console.log(`[Membership] Payment collection query result:`, JSON.stringify(paymentCollections, null, 2));
|
|
47
|
+
if (!paymentCollections?.length) {
|
|
48
|
+
console.log(`[Membership] Payment collection ${payment.payment_collection_id} not found, skipping membership points`);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const paymentCollection = paymentCollections[0];
|
|
52
|
+
// Get order from the linked data
|
|
53
|
+
const order = paymentCollection.order;
|
|
54
|
+
if (!order || !order.id) {
|
|
55
|
+
console.log(`[Membership] Payment collection ${payment.payment_collection_id} has no linked order, skipping membership points`);
|
|
56
|
+
console.log(`[Membership] Payment collection details:`, JSON.stringify(paymentCollection, null, 2));
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const orderId = order.id;
|
|
60
|
+
console.log(`[Membership] Payment ${payment.id} associated with order ${orderId}`);
|
|
61
|
+
// Check if customer exists
|
|
62
|
+
if (!order.customer_id) {
|
|
63
|
+
console.log(`[Membership] Order ${order.id} has no customer (guest checkout), skipping membership points`);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
console.log(`[Membership] Order details - ID: ${order.id}, Status: ${order.status}, Customer: ${order.customer_id}, Total: ${order.total}`);
|
|
67
|
+
// Check if points were already added for this order (to avoid double points)
|
|
68
|
+
const { data: membershipTransactions } = await query.graph({
|
|
69
|
+
entity: "membership_transaction",
|
|
70
|
+
fields: ["id", "source", "points"],
|
|
71
|
+
filters: {
|
|
72
|
+
source: `order: ${order.id}`,
|
|
73
|
+
customer_id: order.customer_id,
|
|
74
|
+
},
|
|
75
|
+
});
|
|
76
|
+
if (membershipTransactions && membershipTransactions.length > 0) {
|
|
77
|
+
// Check if there are positive points (not voided)
|
|
78
|
+
const hasPositivePoints = membershipTransactions.some((t) => t.points > 0);
|
|
79
|
+
if (hasPositivePoints) {
|
|
80
|
+
console.log(`[Membership] Points already added for order ${order.id}, skipping to avoid duplication`);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// Use subtotal instead of total to exclude shipping/taxes from points calculation
|
|
85
|
+
const spending = order.subtotal || order.total || 0;
|
|
86
|
+
if (spending <= 0) {
|
|
87
|
+
console.log(`[Membership] Order ${order.id} has no spending amount, skipping membership points`);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
console.log(`[Membership] Adding membership points for customer ${order.customer_id}, spending: ${spending}`);
|
|
91
|
+
await add_membership_points_1.addMemberShipPointsWorkflow.run({
|
|
92
|
+
input: {
|
|
93
|
+
customer_id: order.customer_id,
|
|
94
|
+
spending: spending,
|
|
95
|
+
source: `order: ${order.id}`,
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
console.log(`[Membership] Successfully added membership points for paid order ${order.id}`);
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
console.error(`[Membership] Error processing payment.captured for payment ${data.id}:`, error);
|
|
102
|
+
console.error(`[Membership] Error stack:`, error.stack);
|
|
103
|
+
console.error(`[Membership] Error details:`, JSON.stringify(error, Object.getOwnPropertyNames(error)));
|
|
104
|
+
// Don't throw error to avoid blocking order flow
|
|
105
|
+
// Membership points can be added manually if needed
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
exports.config = {
|
|
109
|
+
event: `payment.captured`,
|
|
110
|
+
};
|
|
111
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXItcGF5bWVudC1jYXB0dXJlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zdWJzY3JpYmVycy9vcmRlci1wYXltZW50LWNhcHR1cmVkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUlBLHlDQXFLQztBQXhLRCxxREFBK0U7QUFDL0UseUZBQTRGO0FBRTdFLEtBQUssVUFBVSxzQkFBc0IsQ0FBQyxFQUNuRCxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFDZixTQUFTLEdBQ3NCO0lBQy9CLElBQUksQ0FBQztRQUNILE9BQU8sQ0FBQyxHQUFHLENBQUMsOERBQThELENBQUMsQ0FBQztRQUM1RSxPQUFPLENBQUMsR0FBRyxDQUNULCtEQUErRCxJQUFJLENBQUMsRUFBRSxFQUFFLENBQ3pFLENBQUM7UUFDRixPQUFPLENBQUMsR0FBRyxDQUFDLDhCQUE4QixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTNFLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFakUsc0NBQXNDO1FBQ3RDLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQzNDLE1BQU0sRUFBRSxTQUFTO1lBQ2pCLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsdUJBQXVCLENBQUM7WUFDakQsT0FBTyxFQUFFO2dCQUNQLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRTthQUNaO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsT0FBTyxDQUFDLEdBQUcsQ0FDVCxvQ0FBb0MsRUFDcEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUNsQyxDQUFDO1FBRUYsSUFBSSxDQUFDLFFBQVEsRUFB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
|
|
@@ -1,17 +1,91 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.config = void 0;
|
|
4
|
-
exports.default =
|
|
4
|
+
exports.default = handleOrderPlaced;
|
|
5
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
6
|
const invalidateUsedPromotionWorkflow_1 = require("../workflows/usable-promo/invalidateUsedPromotionWorkflow");
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
7
|
+
const create_membership_1 = require("../workflows/membership/create-membership");
|
|
8
|
+
async function handleOrderPlaced({ event: { data }, container, }) {
|
|
9
|
+
try {
|
|
10
|
+
// First, invalidate all promotions used in this order
|
|
11
|
+
try {
|
|
12
|
+
await invalidateUsedPromotionWorkflow_1.invalidatedUsePromotionWorkflow.run({
|
|
13
|
+
input: {
|
|
14
|
+
order_id: data.id,
|
|
15
|
+
},
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
catch (promoError) {
|
|
19
|
+
console.error(`[Membership] Error invalidating promotions for order ${data.id}:`, promoError);
|
|
20
|
+
// Continue processing - promotion invalidation shouldn't block membership creation
|
|
21
|
+
}
|
|
22
|
+
// Then, ensure customer has a membership (create with 0 points if doesn't exist)
|
|
23
|
+
console.log(`[Membership] Processing order.placed event for order: ${data.id}`);
|
|
24
|
+
const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
25
|
+
// Get order details
|
|
26
|
+
const { data: orders } = await query.graph({
|
|
27
|
+
entity: "order",
|
|
28
|
+
fields: ["id", "customer_id", "status"],
|
|
29
|
+
filters: {
|
|
30
|
+
id: data.id,
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
if (!orders?.length) {
|
|
34
|
+
console.error(`[Membership] Order ${data.id} not found`);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const order = orders[0];
|
|
38
|
+
// Check if customer exists
|
|
39
|
+
if (!order.customer_id) {
|
|
40
|
+
console.log(`[Membership] Order ${order.id} has no customer (guest checkout), skipping membership creation`);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
// Check if customer already has a membership
|
|
44
|
+
const { data: customers } = await query.graph({
|
|
45
|
+
entity: "customer",
|
|
46
|
+
fields: ["id", "membership.id", "membership.membership_points"],
|
|
47
|
+
filters: {
|
|
48
|
+
id: order.customer_id,
|
|
49
|
+
},
|
|
50
|
+
});
|
|
51
|
+
if (!customers?.length) {
|
|
52
|
+
console.error(`[Membership] Customer ${order.customer_id} not found`);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const customer = customers[0];
|
|
56
|
+
if (!customer.membership) {
|
|
57
|
+
// This should rarely happen since memberships are now created on customer creation
|
|
58
|
+
// But we'll handle it as a fallback for existing customers or edge cases
|
|
59
|
+
console.log(`[Membership] Customer ${order.customer_id} doesn't have membership (edge case), creating one from order ${order.id}`);
|
|
60
|
+
// Check if membership is enabled before creating
|
|
61
|
+
const { data: [store], } = await query.graph({
|
|
62
|
+
entity: "store",
|
|
63
|
+
fields: ["id", "membership_config.*"],
|
|
64
|
+
});
|
|
65
|
+
if (store?.membership_config?.enable_membership) {
|
|
66
|
+
// Create membership with 0 points (points will be added when order is completed)
|
|
67
|
+
await create_membership_1.createMembershipWorkflow.run({
|
|
68
|
+
input: {
|
|
69
|
+
customer_id: order.customer_id,
|
|
70
|
+
points: 0,
|
|
71
|
+
},
|
|
72
|
+
});
|
|
73
|
+
console.log(`[Membership] Successfully created membership for customer ${order.customer_id}`);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
console.log(`[Membership] Membership is disabled in store configuration, skipping membership creation`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
console.log(`[Membership] Customer ${order.customer_id} already has membership with ${customer.membership.membership_points} points`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
console.error(`[Membership] Error processing order.placed for order ${data.id}:`, error);
|
|
85
|
+
// Don't throw error to avoid blocking order flow
|
|
86
|
+
}
|
|
13
87
|
}
|
|
14
88
|
exports.config = {
|
|
15
89
|
event: `order.placed`,
|
|
16
90
|
};
|
|
17
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
91
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXItcGxhY2VkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3N1YnNjcmliZXJzL29yZGVyLXBsYWNlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFLQSxvQ0E2RkM7QUFqR0QscURBQXNFO0FBQ3RFLCtHQUE0RztBQUM1RyxpRkFBcUY7QUFFdEUsS0FBSyxVQUFVLGlCQUFpQixDQUFDLEVBQzlDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxFQUNmLFNBQVMsR0FDc0I7SUFDL0IsSUFBSSxDQUFDO1FBQ0gsc0RBQXNEO1FBQ3RELElBQUksQ0FBQztZQUNILE1BQU0saUVBQStCLENBQUMsR0FBRyxDQUFDO2dCQUN4QyxLQUFLLEVBQUU7b0JBQ0wsUUFBUSxFQUFFLElBQUksQ0FBQyxFQUFFO2lCQUNsQjthQUNGLENBQUMsQ0FBQztRQUNMLENBQUM7UUFBQyxPQUFPLFVBQVUsRUFBRSxDQUFDO1lBQ3BCLE9BQU8sQ0FBQyxLQUFLLENBQUMsd0RBQXdELElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM5RixtRkFBbUY7UUFDckYsQ0FBQztRQUVELGlGQUFpRjtRQUNqRixPQUFPLENBQUMsR0FBRyxDQUFDLHlEQUF5RCxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVoRixNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWpFLG9CQUFvQjtRQUNwQixNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQztZQUN6QyxNQUFNLEVBQUUsT0FBTztZQUNmLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDO1lBQ3ZDLE9BQU8sRUFBRTtnQkFDUCxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUU7YUFDWjtTQUNGLENBQUMsQ0FB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
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.config = void 0;
|
|
4
|
+
exports.default = returnReceivedHandler;
|
|
5
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
6
|
+
const void_membership_points_1 = require("../workflows/membership/void-membership-points");
|
|
7
|
+
async function returnReceivedHandler({ event: { data }, container, }) {
|
|
8
|
+
try {
|
|
9
|
+
console.log(`[Membership] Processing return.received event for return: ${data.id}, order: ${data.order_id}`);
|
|
10
|
+
const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
11
|
+
// Get order details
|
|
12
|
+
const { data: orders, } = await query.graph({
|
|
13
|
+
entity: "order",
|
|
14
|
+
fields: ["id", "customer_id", "status"],
|
|
15
|
+
filters: {
|
|
16
|
+
id: data.order_id,
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
if (!orders?.length) {
|
|
20
|
+
console.error(`[Membership] Order ${data.order_id} not found`);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const order = orders[0];
|
|
24
|
+
console.log(`[Membership] Order details - ID: ${order.id}, Status: ${order.status}, Customer: ${order.customer_id}`);
|
|
25
|
+
// Check if customer exists
|
|
26
|
+
if (!order.customer_id) {
|
|
27
|
+
console.log(`[Membership] Order ${order.id} has no customer (guest checkout), skipping void points`);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
// Void membership points for this returned order
|
|
31
|
+
await void_membership_points_1.voidMembershipPointsWorkflow.run({
|
|
32
|
+
input: {
|
|
33
|
+
customer_id: order.customer_id,
|
|
34
|
+
order_id: order.id,
|
|
35
|
+
reason: "order_returned",
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
console.log(`[Membership] Successfully processed return for order ${order.id}`);
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
console.error(`[Membership] Error processing return.received for order ${data.order_id}:`, error);
|
|
42
|
+
// Don't throw error to avoid blocking order flow
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
exports.config = {
|
|
46
|
+
event: `return.received`,
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV0dXJuLXJlY2VpdmVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3N1YnNjcmliZXJzL3JldHVybi1yZWNlaXZlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFJQSx3Q0FnREM7QUFuREQscURBQXNFO0FBQ3RFLDJGQUE4RjtBQUUvRSxLQUFLLFVBQVUscUJBQXFCLENBQUMsRUFDbEQsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQ2YsU0FBUyxHQUN3QztJQUNqRCxJQUFJLENBQUM7UUFDSCxPQUFPLENBQUMsR0FBRyxDQUFDLDZEQUE2RCxJQUFJLENBQUMsRUFBRSxZQUFZLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBRTdHLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFakUsb0JBQW9CO1FBQ3BCLE1BQU0sRUFDSixJQUFJLEVBQUUsTUFBTSxHQUNiLEdBQUcsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ3BCLE1BQU0sRUFBRSxPQUFPO1lBQ2YsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUM7WUFDdkMsT0FBTyxFQUFFO2dCQUNQLEVBQUUsRUFBRSxJQUFJLENBQUMsUUFBUTthQUNsQjtTQUNGLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDcEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsSUFBSSxDQUFDLFFBQVEsWUFBWSxDQUFDLENBQUM7WUFDL0QsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQ0FBb0MsS0FBSyxDQUFDLEVBQUUsYUFBYSxLQUFLLENBQUMsTUFBTSxlQUFlLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBRXJILDJCQUEyQjtRQUMzQixJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3ZCLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLEtBQUssQ0FBQyxFQUFFLHlEQUF5RCxDQUFDLENBQUM7WUFDckcsT0FBTztRQUNULENBQUM7UUFFRCxpREFBaUQ7UUFDakQsTUFBTSxxREFBNEIsQ0FBQyxHQUFHLENBQUM7WUFDckMsS0FBSyxFQUFFO2dCQUNMLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztnQkFDOUIsUUFBUSxFQUFFLEtBQUssQ0FBQyxFQUFFO2dCQUNsQixNQUFNLEVBQUUsZ0JBQWdCO2FBQ3pCO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsT0FBTyxDQUFDLEdBQUcsQ0FBQyx3REFBd0QsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDbEYsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLDJEQUEyRCxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbEcsaURBQWlEO0lBQ25ELENBQUM7QUFDSCxDQUFDO0FBRVksUUFBQSxNQUFNLEdBQXFCO0lBQ3RDLEtBQUssRUFBRSxpQkFBaUI7Q0FDekIsQ0FBQyJ9
|