@cloudcommerce/app-loyalty-points 0.27.0 → 0.28.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/.turbo/turbo-build.log +1 -1
- package/lib/functions-lib/cron-add-points.d.ts +2 -0
- package/lib/functions-lib/cron-add-points.js +98 -0
- package/lib/functions-lib/cron-add-points.js.map +1 -0
- package/lib/functions-lib/handle-loyalty-points-event.js +59 -23
- package/lib/functions-lib/handle-loyalty-points-event.js.map +1 -1
- package/lib/loyalty-create-transaction.js +9 -4
- package/lib/loyalty-create-transaction.js.map +1 -1
- package/lib/loyalty-list-payments.js +7 -2
- package/lib/loyalty-list-payments.js.map +1 -1
- package/lib/loyalty-points-events.d.ts +3 -1
- package/lib/loyalty-points-events.js +9 -0
- package/lib/loyalty-points-events.js.map +1 -1
- package/package.json +6 -5
- package/src/functions-lib/cron-add-points.ts +104 -0
- package/src/functions-lib/handle-loyalty-points-event.ts +67 -25
- package/src/loyalty-create-transaction.ts +11 -4
- package/src/loyalty-list-payments.ts +9 -2
- package/src/loyalty-points-events.ts +12 -1
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
|
|
2
|
-
> @cloudcommerce/app-loyalty-points@0.
|
|
2
|
+
> @cloudcommerce/app-loyalty-points@0.28.0 build /home/leo/code/ecomplus/cloud-commerce/packages/apps/loyalty-points
|
|
3
3
|
> bash ../../../scripts/build-lib.sh
|
|
4
4
|
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import logger from 'firebase-functions/logger';
|
|
2
|
+
import { getFirestore } from 'firebase-admin/firestore';
|
|
3
|
+
import api from '@cloudcommerce/api';
|
|
4
|
+
|
|
5
|
+
const addPoints = async () => {
|
|
6
|
+
const d = new Date();
|
|
7
|
+
// double checking paid orders after 5 days
|
|
8
|
+
d.setDate(d.getDate() - 5);
|
|
9
|
+
const db = getFirestore();
|
|
10
|
+
const snapshot = await db.collection('pointsToAdd')
|
|
11
|
+
.where('queuedAt', '<=', d)
|
|
12
|
+
.orderBy('queuedAt')
|
|
13
|
+
.get();
|
|
14
|
+
const { docs } = snapshot;
|
|
15
|
+
logger.info(`${docs.length} points to add`);
|
|
16
|
+
for (let i = 0; i < docs.length; i++) {
|
|
17
|
+
const { customerId, pointEntries } = docs[i].data();
|
|
18
|
+
const orderId = docs[i].ref.id;
|
|
19
|
+
let order;
|
|
20
|
+
try {
|
|
21
|
+
// eslint-disable-next-line no-await-in-loop
|
|
22
|
+
order = (await api.get(`orders/${orderId}`)).data;
|
|
23
|
+
} catch (error) {
|
|
24
|
+
const status = error.response?.status;
|
|
25
|
+
if (status > 400 && status < 500) {
|
|
26
|
+
logger.warn(`failed reading order ${orderId}`, {
|
|
27
|
+
status,
|
|
28
|
+
response: error.response?.data,
|
|
29
|
+
});
|
|
30
|
+
} else {
|
|
31
|
+
throw error;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (order && Array.isArray(pointEntries) && pointEntries.length) {
|
|
35
|
+
const currentStatus = order.financial_status && order.financial_status.current;
|
|
36
|
+
if (currentStatus === 'paid') {
|
|
37
|
+
const tryAddPoints = (data) => {
|
|
38
|
+
logger.info(`POST ${JSON.stringify(data)} ${customerId}`);
|
|
39
|
+
return api.post(`customers/${customerId}/loyalty_points_entries`, data);
|
|
40
|
+
};
|
|
41
|
+
const pointsEndpoint = `/customers/${customerId}/loyalty_points_entries`;
|
|
42
|
+
for (let ii = 0; ii < pointEntries.length; ii++) {
|
|
43
|
+
const pointsEntry = pointEntries[ii];
|
|
44
|
+
try {
|
|
45
|
+
// eslint-disable-next-line no-await-in-loop
|
|
46
|
+
await tryAddPoints(pointsEntry);
|
|
47
|
+
} catch (err) {
|
|
48
|
+
const status = err.response?.status;
|
|
49
|
+
if (status === 403) {
|
|
50
|
+
// delete older points entry and retry
|
|
51
|
+
const findUrl = `${pointsEndpoint}`
|
|
52
|
+
+ `?valid_thru<=${(new Date().toISOString())}&sort=active_points&limit=1`;
|
|
53
|
+
try {
|
|
54
|
+
// eslint-disable-next-line no-await-in-loop
|
|
55
|
+
await api.get(findUrl)
|
|
56
|
+
.then(({ data }) => {
|
|
57
|
+
const pointsList = data.result;
|
|
58
|
+
if (pointsList.length) {
|
|
59
|
+
const endpoint = `${pointsEndpoint}/${pointsList[0]._id}`;
|
|
60
|
+
return api.delete(endpoint)
|
|
61
|
+
.then(() => {
|
|
62
|
+
return tryAddPoints(pointsEntry);
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
return null;
|
|
66
|
+
});
|
|
67
|
+
} catch (error) {
|
|
68
|
+
logger.warn(`failed cleaning/adding points retry to ${orderId}`, {
|
|
69
|
+
customerId,
|
|
70
|
+
pointsEntry,
|
|
71
|
+
url: error.config?.url,
|
|
72
|
+
method: error.config?.method,
|
|
73
|
+
status: error.response?.status,
|
|
74
|
+
response: error.response?.data,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
} else if (status > 400 && status < 500) {
|
|
78
|
+
logger.warn(`failed adding points to ${orderId}`, {
|
|
79
|
+
customerId,
|
|
80
|
+
pointsEndpoint,
|
|
81
|
+
pointsEntry,
|
|
82
|
+
status,
|
|
83
|
+
response: err.response.data,
|
|
84
|
+
});
|
|
85
|
+
} else {
|
|
86
|
+
throw err;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// eslint-disable-next-line no-await-in-loop
|
|
93
|
+
await docs[i].ref.delete();
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
export default addPoints;
|
|
98
|
+
// # sourceMappingURL=cron-add-points.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cron-add-points.js","sourceRoot":"","sources":["../../src/functions-lib/cron-add-points.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import api from '@cloudcommerce/api';
|
|
2
|
-
import { getFirestore } from 'firebase-admin/firestore';
|
|
2
|
+
import { getFirestore, Timestamp } from 'firebase-admin/firestore';
|
|
3
3
|
import logger from 'firebase-functions/logger';
|
|
4
|
+
import ecomUtils from '@ecomplus/utils';
|
|
4
5
|
import getProgramId from './get-program-id.js';
|
|
5
6
|
|
|
6
7
|
const ECHO_SUCCESS = 'SUCCESS';
|
|
@@ -79,32 +80,67 @@ const handleLoyaltyPointsEvent = async (order, programRules) => {
|
|
|
79
80
|
if (pointsList) {
|
|
80
81
|
const hasEarnedPoints = haveEarnedPoints(pointsList, orderId);
|
|
81
82
|
if (isPaid && !hasEarnedPoints) {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
83
|
+
const docRef = getFirestore().doc(`pointsToAdd/${orderId}`);
|
|
84
|
+
const docSnapshot = await docRef.get();
|
|
85
|
+
if (!docSnapshot.exists) {
|
|
86
|
+
const pointEntries = [];
|
|
87
|
+
for (let i = 0; i < programRules.length; i++) {
|
|
88
|
+
const rule = programRules[i];
|
|
89
|
+
if (rule.earn_percentage === 0) {
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
if (!rule.min_subtotal_to_earn
|
|
93
|
+
|| (amount?.subtotal && rule.min_subtotal_to_earn <= amount.subtotal)) {
|
|
94
|
+
let subtotal = amount.subtotal;
|
|
95
|
+
if (Array.isArray(rule.category_ids) && rule.category_ids.length) {
|
|
96
|
+
if (!order.items || !order.items.length) {
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
// eslint-disable-next-line no-await-in-loop
|
|
100
|
+
const { data: { result } } = await api.get('search/v1', {
|
|
101
|
+
limit: order.items.length,
|
|
102
|
+
params: {
|
|
103
|
+
_id: order.items.map((item) => item.product_id),
|
|
104
|
+
'categories._id': rule.category_ids,
|
|
105
|
+
},
|
|
106
|
+
});
|
|
107
|
+
// eslint-disable-next-line no-await-in-loop
|
|
108
|
+
order.items.forEach((item) => {
|
|
109
|
+
if (!result.find(({ _id }) => _id === item.product_id)) {
|
|
110
|
+
subtotal -= (ecomUtils.price(item) * item.quantity);
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
}
|
|
86
114
|
const pointsValue = ((rule.earn_percentage || 1) / 100)
|
|
87
|
-
* (
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
115
|
+
* (subtotal - (amount.discount || 0));
|
|
116
|
+
if (pointsValue > 0) {
|
|
117
|
+
let validThru;
|
|
118
|
+
if (rule.expiration_days > 0) {
|
|
119
|
+
const d = new Date();
|
|
120
|
+
d.setDate(d.getDate() + 2 + rule.expiration_days);
|
|
121
|
+
validThru = d.toISOString();
|
|
122
|
+
}
|
|
123
|
+
const data = {
|
|
124
|
+
name: rule.name,
|
|
125
|
+
program_id: getProgramId(rule, i),
|
|
126
|
+
earned_points: pointsValue,
|
|
127
|
+
active_points: pointsValue,
|
|
128
|
+
ratio: rule.ratio || 1,
|
|
129
|
+
order_id: orderId,
|
|
130
|
+
};
|
|
131
|
+
if (validThru) {
|
|
132
|
+
Object.assign(data, { valid_thru: validThru });
|
|
133
|
+
}
|
|
134
|
+
pointEntries.push(data);
|
|
93
135
|
}
|
|
94
|
-
const data = {
|
|
95
|
-
name: rule.name,
|
|
96
|
-
program_id: getProgramId(rule, i),
|
|
97
|
-
earned_points: pointsValue,
|
|
98
|
-
active_points: pointsValue,
|
|
99
|
-
ratio: rule.ratio || 1,
|
|
100
|
-
valid_thru: validThru,
|
|
101
|
-
order_id: orderId,
|
|
102
|
-
}; // TODO: set the correct type
|
|
103
|
-
// eslint-disable-next-line no-await-in-loop
|
|
104
|
-
await api.post(`customers/${customerId}/loyalty_points_entries`, data);
|
|
105
|
-
return responsePubSub(ECHO_SUCCESS);
|
|
106
136
|
}
|
|
107
137
|
}
|
|
138
|
+
await docRef.set({
|
|
139
|
+
customerId,
|
|
140
|
+
pointEntries,
|
|
141
|
+
queuedAt: Timestamp.now(),
|
|
142
|
+
});
|
|
143
|
+
return responsePubSub(ECHO_SUCCESS);
|
|
108
144
|
}
|
|
109
145
|
}
|
|
110
146
|
if (isCancelled && hasEarnedPoints) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handle-loyalty-points-event.js","sourceRoot":"","sources":["../../src/functions-lib/handle-loyalty-points-event.ts"],"names":[],"mappings":"AACA,OAAO,GAAG,MAAM,oBAAoB,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"handle-loyalty-points-event.js","sourceRoot":"","sources":["../../src/functions-lib/handle-loyalty-points-event.ts"],"names":[],"mappings":"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"}
|
|
@@ -61,7 +61,7 @@ export default async (appData) => {
|
|
|
61
61
|
if (pointsApplied && Array.isArray(programsRules) && programsRules.length) {
|
|
62
62
|
// for (const programId in pointsApplied) {
|
|
63
63
|
Object.keys(pointsApplied).forEach((programId) => {
|
|
64
|
-
|
|
64
|
+
let pointsValue = pointsApplied[programId];
|
|
65
65
|
if (pointsValue > 0) {
|
|
66
66
|
const programRule = programsRules.find((programRuleFound, index) => {
|
|
67
67
|
if (programRuleFound) {
|
|
@@ -71,14 +71,19 @@ export default async (appData) => {
|
|
|
71
71
|
return false;
|
|
72
72
|
});
|
|
73
73
|
if (programRule) {
|
|
74
|
+
let maxPoints = programRule.max_points;
|
|
74
75
|
const ratio = programRule.ratio || 1;
|
|
76
|
+
if (!maxPoints && programRule.max_amount_percentage && params.amount) {
|
|
77
|
+
maxPoints = Math.round(((programRule.max_amount_percentage * params.amount.total) / 100) / ratio);
|
|
78
|
+
}
|
|
79
|
+
if (maxPoints < pointsValue) {
|
|
80
|
+
pointsValue = maxPoints;
|
|
81
|
+
}
|
|
75
82
|
transaction.loyalty_points = {
|
|
76
83
|
name: programRule.name,
|
|
77
84
|
program_id: programRule.program_id,
|
|
78
85
|
ratio,
|
|
79
|
-
points_value:
|
|
80
|
-
? programRule.max_points
|
|
81
|
-
: pointsValue,
|
|
86
|
+
points_value: pointsValue,
|
|
82
87
|
};
|
|
83
88
|
transaction.amount = pointsValue * ratio;
|
|
84
89
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loyalty-create-transaction.js","sourceRoot":"","sources":["../src/loyalty-create-transaction.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"loyalty-create-transaction.js","sourceRoot":"","sources":["../src/loyalty-create-transaction.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,11 +26,16 @@ export default (data) => {
|
|
|
26
26
|
if (Array.isArray(appData.programs_rules)) {
|
|
27
27
|
const pointsPrograms = {};
|
|
28
28
|
appData.programs_rules.forEach((programRule, index) => {
|
|
29
|
+
let maxPoints = programRule.max_points;
|
|
30
|
+
const ratio = programRule.ratio || 1;
|
|
31
|
+
if (!maxPoints && programRule.max_amount_percentage && params.amount) {
|
|
32
|
+
maxPoints = Math.round(((programRule.max_amount_percentage * params.amount.total) / 100) / ratio);
|
|
33
|
+
}
|
|
29
34
|
const programId = getProgramId(programRule, index);
|
|
30
35
|
pointsPrograms[programId] = {
|
|
31
36
|
name: programRule.name,
|
|
32
|
-
ratio
|
|
33
|
-
max_points:
|
|
37
|
+
ratio,
|
|
38
|
+
max_points: maxPoints,
|
|
34
39
|
min_subtotal_to_earn: programRule.min_subtotal_to_earn,
|
|
35
40
|
earn_percentage: programRule.earn_percentage,
|
|
36
41
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loyalty-list-payments.js","sourceRoot":"","sources":["../src/loyalty-list-payments.ts"],"names":[],"mappings":"AAKA,OAAO,YAAY,MAAM,gCAAgC,CAAC;AAE1D,eAAe,CAAC,IAAmB,EAAE,EAAE;IACrC,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;IAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,MAA4B,CAAC;IAEjD,MAAM,OAAO,GAAG;QACd,GAAG,WAAW,CAAC,IAAI;QACnB,GAAG,WAAW,CAAC,WAAW;KAC3B,CAAC;IAEF,0BAA0B;IAC1B,uCAAuC;IACvC,MAAM,QAAQ,GAAyB;QACrC,gBAAgB,EAAE,EAAE;KACrB,CAAC;IAEF,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI;QACnD,CAAC,CAAC,sBAAsB;QACxB,CAAC,CAAC,gBAAgB,CAAC;IAErB,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC;QAC7B,IAAI,EAAE,SAAS;QACf,cAAc,EAAE;YACd,IAAI,EAAE,gBAAgB;YACtB,IAAI,EAAE,KAAK;SACZ;QACD,KAAK;KACN,CAAC,CAAC;IAEH,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE;QACzC,MAAM,cAAc,GAAG,EAAE,CAAC;QAC1B,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,KAAK,EAAE,EAAE;YACpD,
|
|
1
|
+
{"version":3,"file":"loyalty-list-payments.js","sourceRoot":"","sources":["../src/loyalty-list-payments.ts"],"names":[],"mappings":"AAKA,OAAO,YAAY,MAAM,gCAAgC,CAAC;AAE1D,eAAe,CAAC,IAAmB,EAAE,EAAE;IACrC,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;IAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,MAA4B,CAAC;IAEjD,MAAM,OAAO,GAAG;QACd,GAAG,WAAW,CAAC,IAAI;QACnB,GAAG,WAAW,CAAC,WAAW;KAC3B,CAAC;IAEF,0BAA0B;IAC1B,uCAAuC;IACvC,MAAM,QAAQ,GAAyB;QACrC,gBAAgB,EAAE,EAAE;KACrB,CAAC;IAEF,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI;QACnD,CAAC,CAAC,sBAAsB;QACxB,CAAC,CAAC,gBAAgB,CAAC;IAErB,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC;QAC7B,IAAI,EAAE,SAAS;QACf,cAAc,EAAE;YACd,IAAI,EAAE,gBAAgB;YACtB,IAAI,EAAE,KAAK;SACZ;QACD,KAAK;KACN,CAAC,CAAC;IAEH,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE;QACzC,MAAM,cAAc,GAAG,EAAE,CAAC;QAC1B,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,KAAK,EAAE,EAAE;YACpD,IAAI,SAAS,GAAG,WAAW,CAAC,UAAU,CAAC;YACvC,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,IAAI,CAAC,CAAC;YACrC,IAAI,CAAC,SAAS,IAAI,WAAW,CAAC,qBAAqB,IAAI,MAAM,CAAC,MAAM,EAAE;gBACpE,SAAS,GAAG,IAAI,CAAC,KAAK,CACpB,CAAC,CAAC,WAAW,CAAC,qBAAqB,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,GAAG,KAAK,CAC1E,CAAC;aACH;YACD,MAAM,SAAS,GAAG,YAAY,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YACnD,cAAc,CAAC,SAAS,CAAC,GAAG;gBAC1B,IAAI,EAAE,WAAW,CAAC,IAAI;gBACtB,KAAK;gBACL,UAAU,EAAE,SAAS;gBACrB,oBAAoB,EAAE,WAAW,CAAC,oBAAoB;gBACtD,eAAe,EAAE,WAAW,CAAC,eAAe;aAC7C,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,EAAE;YACtC,QAAQ,CAAC,uBAAuB,GAAG,cAAc,CAAC;SACnD;KACF;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import '@cloudcommerce/firebase/lib/init';
|
|
2
|
+
import functions from 'firebase-functions/v1';
|
|
2
3
|
export declare const loyaltypoints: {
|
|
3
|
-
onStoreEvent:
|
|
4
|
+
onStoreEvent: functions.CloudFunction<functions.pubsub.Message>;
|
|
5
|
+
cronAddPoints: functions.CloudFunction<unknown>;
|
|
4
6
|
};
|
|
@@ -2,8 +2,12 @@
|
|
|
2
2
|
import '@cloudcommerce/firebase/lib/init';
|
|
3
3
|
import { createAppEventsFunction } from '@cloudcommerce/firebase/lib/helpers/pubsub';
|
|
4
4
|
import logger from 'firebase-functions/logger';
|
|
5
|
+
import config from '@cloudcommerce/firebase/lib/config';
|
|
6
|
+
import functions from 'firebase-functions/v1';
|
|
5
7
|
import handleLoyaltyPointsEvent from './functions-lib/handle-loyalty-points-event.js';
|
|
8
|
+
import addPoints from './functions-lib/cron-add-points.js';
|
|
6
9
|
|
|
10
|
+
const { httpsFunctionOptions: { region } } = config.get();
|
|
7
11
|
const handleApiEvent = async ({
|
|
8
12
|
evName, apiEvent, apiDoc, app,
|
|
9
13
|
}) => {
|
|
@@ -24,5 +28,10 @@ const handleApiEvent = async ({
|
|
|
24
28
|
|
|
25
29
|
export const loyaltypoints = {
|
|
26
30
|
onStoreEvent: createAppEventsFunction('loyaltyPoints', handleApiEvent),
|
|
31
|
+
cronAddPoints: functions.region(region).pubsub
|
|
32
|
+
.schedule('28 * * * *')
|
|
33
|
+
.onRun(() => {
|
|
34
|
+
return addPoints;
|
|
35
|
+
}),
|
|
27
36
|
};
|
|
28
37
|
// # sourceMappingURL=loyalty-points-events.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loyalty-points-events.js","sourceRoot":"","sources":["../src/loyalty-points-events.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,OAAO,kCAAkC,CAAC;AAE1C,OAAO,EACL,uBAAuB,GAExB,MAAM,4CAA4C,CAAC;AACpD,OAAO,MAAM,MAAM,2BAA2B,CAAC;AAC/C,OAAO,wBAAwB,MAAM,6CAA6C,CAAC;
|
|
1
|
+
{"version":3,"file":"loyalty-points-events.js","sourceRoot":"","sources":["../src/loyalty-points-events.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,OAAO,kCAAkC,CAAC;AAE1C,OAAO,EACL,uBAAuB,GAExB,MAAM,4CAA4C,CAAC;AACpD,OAAO,MAAM,MAAM,2BAA2B,CAAC;AAC/C,OAAO,MAAM,MAAM,oCAAoC,CAAC;AACxD,OAAO,SAAS,MAAM,uBAAuB,CAAC;AAC9C,OAAO,wBAAwB,MAAM,6CAA6C,CAAC;AACnF,OAAO,SAAS,MAAM,iCAAiC,CAAC;AAExD,MAAM,EAAE,oBAAoB,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC;AAE1D,MAAM,cAAc,GAAoB,KAAK,EAAE,EAC7C,MAAM,EACN,QAAQ,EACR,MAAM,EACN,GAAG,GACJ,EAAE,EAAE;IACH,MAAM,UAAU,GAAG,QAAQ,CAAC,WAAW,CAAC;IACxC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/D,MAAM,GAAG,GAAG,GAAG,MAAM,IAAI,UAAU,EAAE,CAAC;IACtC,MAAM,OAAO,GAAG,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IACpD,MAAM,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC;IAE5C,IACE,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;WAChC,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;WACzC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EACzD;QACA,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,kBAAkB,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC;KACb;IACD,MAAM,CAAC,IAAI,CAAC,aAAa,UAAU,KAAK,MAAM,GAAG,CAAC,CAAC;IAEnD,OAAO,wBAAwB,CAAC,MAAgB,EAAE,YAAY,CAAC,CAAC;AAClE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,YAAY,EAAE,uBAAuB,CACnC,eAAe,EACf,cAAc,CACf;IAED,aAAa,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM;SAC3C,QAAQ,CAAC,YAAY,CAAC;SACtB,KAAK,CAAC,GAAG,EAAE;QACV,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;CACL,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cloudcommerce/app-loyalty-points",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.28.1",
|
|
5
5
|
"description": "E-Com Plus Cloud Commerce app to handle simple loyalty points programs",
|
|
6
6
|
"main": "lib/loyalty-points.js",
|
|
7
7
|
"exports": {
|
|
@@ -20,12 +20,13 @@
|
|
|
20
20
|
},
|
|
21
21
|
"homepage": "https://github.com/ecomplus/cloud-commerce/tree/main/packages/apps/loyalty-points#readme",
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@
|
|
24
|
-
"@cloudcommerce/
|
|
23
|
+
"@ecomplus/utils": "1.5.0-rc.5",
|
|
24
|
+
"@cloudcommerce/api": "0.28.1",
|
|
25
|
+
"@cloudcommerce/firebase": "0.28.1"
|
|
25
26
|
},
|
|
26
27
|
"devDependencies": {
|
|
27
|
-
"@cloudcommerce/
|
|
28
|
-
"@cloudcommerce/
|
|
28
|
+
"@cloudcommerce/types": "0.28.1",
|
|
29
|
+
"@cloudcommerce/test-base": "0.28.1"
|
|
29
30
|
},
|
|
30
31
|
"scripts": {
|
|
31
32
|
"build": "bash ../../../scripts/build-lib.sh",
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import type { CustomerSet, Orders } from '@cloudcommerce/types';
|
|
2
|
+
import logger from 'firebase-functions/logger';
|
|
3
|
+
import { getFirestore } from 'firebase-admin/firestore';
|
|
4
|
+
import api from '@cloudcommerce/api';
|
|
5
|
+
import { Endpoint } from '@cloudcommerce/api/types';
|
|
6
|
+
|
|
7
|
+
const addPoints = async () => {
|
|
8
|
+
const d = new Date();
|
|
9
|
+
// double checking paid orders after 5 days
|
|
10
|
+
d.setDate(d.getDate() - 5);
|
|
11
|
+
const db = getFirestore();
|
|
12
|
+
const snapshot = await db.collection('pointsToAdd')
|
|
13
|
+
.where('queuedAt', '<=', d)
|
|
14
|
+
.orderBy('queuedAt')
|
|
15
|
+
.get();
|
|
16
|
+
const { docs } = snapshot;
|
|
17
|
+
logger.info(`${docs.length} points to add`);
|
|
18
|
+
|
|
19
|
+
for (let i = 0; i < docs.length; i++) {
|
|
20
|
+
const { customerId, pointEntries } = docs[i].data();
|
|
21
|
+
const orderId = docs[i].ref.id;
|
|
22
|
+
let order: Orders | undefined;
|
|
23
|
+
try {
|
|
24
|
+
// eslint-disable-next-line no-await-in-loop
|
|
25
|
+
order = (await api.get(`orders/${orderId}`)).data;
|
|
26
|
+
} catch (error: any) {
|
|
27
|
+
const status = error.response?.status;
|
|
28
|
+
if (status > 400 && status < 500) {
|
|
29
|
+
logger.warn(`failed reading order ${orderId}`, {
|
|
30
|
+
status,
|
|
31
|
+
response: error.response?.data,
|
|
32
|
+
});
|
|
33
|
+
} else {
|
|
34
|
+
throw error;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
if (order && Array.isArray(pointEntries) && pointEntries.length) {
|
|
39
|
+
const currentStatus = order.financial_status && order.financial_status.current;
|
|
40
|
+
if (currentStatus === 'paid') {
|
|
41
|
+
const tryAddPoints = (data: CustomerSet) => {
|
|
42
|
+
logger.info(`POST ${JSON.stringify(data)} ${customerId}`);
|
|
43
|
+
return api.post(`customers/${customerId}/loyalty_points_entries`, data);
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const pointsEndpoint = `/customers/${customerId}/loyalty_points_entries`;
|
|
47
|
+
|
|
48
|
+
for (let ii = 0; ii < pointEntries.length; ii++) {
|
|
49
|
+
const pointsEntry = pointEntries[ii];
|
|
50
|
+
try {
|
|
51
|
+
// eslint-disable-next-line no-await-in-loop
|
|
52
|
+
await tryAddPoints(pointsEntry);
|
|
53
|
+
} catch (err: any) {
|
|
54
|
+
const status = err.response?.status;
|
|
55
|
+
if (status === 403) {
|
|
56
|
+
// delete older points entry and retry
|
|
57
|
+
|
|
58
|
+
const findUrl = `${pointsEndpoint}`
|
|
59
|
+
+ `?valid_thru<=${(new Date().toISOString())}&sort=active_points&limit=1`;
|
|
60
|
+
try {
|
|
61
|
+
// eslint-disable-next-line no-await-in-loop
|
|
62
|
+
await api.get(findUrl as Endpoint)
|
|
63
|
+
.then(({ data }) => {
|
|
64
|
+
const pointsList = data.result;
|
|
65
|
+
if (pointsList.length) {
|
|
66
|
+
const endpoint = `${pointsEndpoint}/${pointsList[0]._id}`;
|
|
67
|
+
return api.delete(endpoint as Endpoint)
|
|
68
|
+
.then(() => {
|
|
69
|
+
return tryAddPoints(pointsEntry);
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
return null;
|
|
73
|
+
});
|
|
74
|
+
} catch (error: any) {
|
|
75
|
+
logger.warn(`failed cleaning/adding points retry to ${orderId}`, {
|
|
76
|
+
customerId,
|
|
77
|
+
pointsEntry,
|
|
78
|
+
url: error.config?.url,
|
|
79
|
+
method: error.config?.method,
|
|
80
|
+
status: error.response?.status,
|
|
81
|
+
response: error.response?.data,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
} else if (status > 400 && status < 500) {
|
|
85
|
+
logger.warn(`failed adding points to ${orderId}`, {
|
|
86
|
+
customerId,
|
|
87
|
+
pointsEndpoint,
|
|
88
|
+
pointsEntry,
|
|
89
|
+
status,
|
|
90
|
+
response: err.response.data,
|
|
91
|
+
});
|
|
92
|
+
} else {
|
|
93
|
+
throw err;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// eslint-disable-next-line no-await-in-loop
|
|
100
|
+
await docs[i].ref.delete();
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
export default addPoints;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import type { Orders, Customers, ResourceId } from '@cloudcommerce/types';
|
|
2
2
|
import api from '@cloudcommerce/api';
|
|
3
|
-
import { getFirestore } from 'firebase-admin/firestore';
|
|
3
|
+
import { getFirestore, Timestamp } from 'firebase-admin/firestore';
|
|
4
4
|
import logger from 'firebase-functions/logger';
|
|
5
|
+
import ecomUtils from '@ecomplus/utils';
|
|
5
6
|
import getProgramId from './get-program-id';
|
|
6
7
|
|
|
7
8
|
const ECHO_SUCCESS = 'SUCCESS';
|
|
@@ -97,36 +98,77 @@ const handleLoyaltyPointsEvent = async (
|
|
|
97
98
|
const hasEarnedPoints = haveEarnedPoints(pointsList, orderId);
|
|
98
99
|
|
|
99
100
|
if (isPaid && !hasEarnedPoints) {
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
101
|
+
const docRef = getFirestore().doc(`pointsToAdd/${orderId}`);
|
|
102
|
+
const docSnapshot = await docRef.get();
|
|
103
|
+
if (!docSnapshot.exists) {
|
|
104
|
+
const pointEntries: any[] = [];
|
|
105
|
+
|
|
106
|
+
for (let i = 0; i < programRules.length; i++) {
|
|
107
|
+
const rule = programRules[i];
|
|
108
|
+
if (rule.earn_percentage === 0) {
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
if (
|
|
112
|
+
!rule.min_subtotal_to_earn
|
|
113
|
+
|| (amount?.subtotal && rule.min_subtotal_to_earn <= amount.subtotal)
|
|
114
|
+
) {
|
|
115
|
+
let subtotal = amount.subtotal as number;
|
|
106
116
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
validThru = d.toISOString();
|
|
112
|
-
}
|
|
117
|
+
if (Array.isArray(rule.category_ids) && rule.category_ids.length) {
|
|
118
|
+
if (!order.items || !order.items.length) {
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
113
121
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
} as any; // TODO: set the correct type
|
|
122
|
+
// eslint-disable-next-line no-await-in-loop
|
|
123
|
+
const { data: { result } } = await api.get('search/v1', {
|
|
124
|
+
limit: order.items.length,
|
|
125
|
+
params: {
|
|
126
|
+
_id: order.items.map((item) => item.product_id),
|
|
127
|
+
'categories._id': rule.category_ids,
|
|
128
|
+
},
|
|
129
|
+
});
|
|
123
130
|
|
|
124
|
-
|
|
125
|
-
|
|
131
|
+
// eslint-disable-next-line no-await-in-loop
|
|
132
|
+
order.items.forEach((item) => {
|
|
133
|
+
if (!result.find(({ _id }) => _id === item.product_id)) {
|
|
134
|
+
subtotal -= (ecomUtils.price(item) * item.quantity);
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
}
|
|
126
138
|
|
|
127
|
-
|
|
139
|
+
const pointsValue = ((rule.earn_percentage || 1) / 100)
|
|
140
|
+
* (subtotal - (amount.discount || 0));
|
|
141
|
+
|
|
142
|
+
if (pointsValue > 0) {
|
|
143
|
+
let validThru: string | undefined;
|
|
144
|
+
if (rule.expiration_days > 0) {
|
|
145
|
+
const d = new Date();
|
|
146
|
+
d.setDate(d.getDate() + 2 + rule.expiration_days);
|
|
147
|
+
validThru = d.toISOString();
|
|
148
|
+
}
|
|
149
|
+
const data = {
|
|
150
|
+
name: rule.name,
|
|
151
|
+
program_id: getProgramId(rule, i),
|
|
152
|
+
earned_points: pointsValue,
|
|
153
|
+
active_points: pointsValue,
|
|
154
|
+
ratio: rule.ratio || 1,
|
|
155
|
+
order_id: orderId,
|
|
156
|
+
};
|
|
157
|
+
if (validThru) {
|
|
158
|
+
Object.assign(data, { valid_thru: validThru });
|
|
159
|
+
}
|
|
160
|
+
pointEntries.push(data);
|
|
161
|
+
}
|
|
128
162
|
}
|
|
129
163
|
}
|
|
164
|
+
|
|
165
|
+
await docRef.set({
|
|
166
|
+
customerId,
|
|
167
|
+
pointEntries,
|
|
168
|
+
queuedAt: Timestamp.now(),
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
return responsePubSub(ECHO_SUCCESS);
|
|
130
172
|
}
|
|
131
173
|
}
|
|
132
174
|
|
|
@@ -76,7 +76,7 @@ export default async (appData: AppModuleBody) => {
|
|
|
76
76
|
if (pointsApplied && Array.isArray(programsRules) && programsRules.length) {
|
|
77
77
|
// for (const programId in pointsApplied) {
|
|
78
78
|
Object.keys(pointsApplied).forEach((programId) => {
|
|
79
|
-
|
|
79
|
+
let pointsValue = pointsApplied[programId];
|
|
80
80
|
if (pointsValue > 0) {
|
|
81
81
|
const programRule = programsRules.find((programRuleFound, index) => {
|
|
82
82
|
if (programRuleFound) {
|
|
@@ -87,14 +87,21 @@ export default async (appData: AppModuleBody) => {
|
|
|
87
87
|
});
|
|
88
88
|
|
|
89
89
|
if (programRule) {
|
|
90
|
+
let maxPoints = programRule.max_points;
|
|
90
91
|
const ratio = programRule.ratio || 1;
|
|
92
|
+
if (!maxPoints && programRule.max_amount_percentage && params.amount) {
|
|
93
|
+
maxPoints = Math.round(
|
|
94
|
+
((programRule.max_amount_percentage * params.amount.total) / 100) / ratio,
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
if (maxPoints < pointsValue) {
|
|
98
|
+
pointsValue = maxPoints;
|
|
99
|
+
}
|
|
91
100
|
transaction.loyalty_points = {
|
|
92
101
|
name: programRule.name,
|
|
93
102
|
program_id: programRule.program_id,
|
|
94
103
|
ratio,
|
|
95
|
-
points_value:
|
|
96
|
-
? programRule.max_points
|
|
97
|
-
: pointsValue,
|
|
104
|
+
points_value: pointsValue,
|
|
98
105
|
};
|
|
99
106
|
transaction.amount = pointsValue * ratio;
|
|
100
107
|
}
|
|
@@ -36,11 +36,18 @@ export default (data: AppModuleBody) => {
|
|
|
36
36
|
if (Array.isArray(appData.programs_rules)) {
|
|
37
37
|
const pointsPrograms = {};
|
|
38
38
|
appData.programs_rules.forEach((programRule, index) => {
|
|
39
|
+
let maxPoints = programRule.max_points;
|
|
40
|
+
const ratio = programRule.ratio || 1;
|
|
41
|
+
if (!maxPoints && programRule.max_amount_percentage && params.amount) {
|
|
42
|
+
maxPoints = Math.round(
|
|
43
|
+
((programRule.max_amount_percentage * params.amount.total) / 100) / ratio,
|
|
44
|
+
);
|
|
45
|
+
}
|
|
39
46
|
const programId = getProgramId(programRule, index);
|
|
40
47
|
pointsPrograms[programId] = {
|
|
41
48
|
name: programRule.name,
|
|
42
|
-
ratio
|
|
43
|
-
max_points:
|
|
49
|
+
ratio,
|
|
50
|
+
max_points: maxPoints,
|
|
44
51
|
min_subtotal_to_earn: programRule.min_subtotal_to_earn,
|
|
45
52
|
earn_percentage: programRule.earn_percentage,
|
|
46
53
|
};
|
|
@@ -6,7 +6,12 @@ import {
|
|
|
6
6
|
ApiEventHandler,
|
|
7
7
|
} from '@cloudcommerce/firebase/lib/helpers/pubsub';
|
|
8
8
|
import logger from 'firebase-functions/logger';
|
|
9
|
+
import config from '@cloudcommerce/firebase/lib/config';
|
|
10
|
+
import functions from 'firebase-functions/v1';
|
|
9
11
|
import handleLoyaltyPointsEvent from './functions-lib/handle-loyalty-points-event';
|
|
12
|
+
import addPoints from './functions-lib/cron-add-points';
|
|
13
|
+
|
|
14
|
+
const { httpsFunctionOptions: { region } } = config.get();
|
|
10
15
|
|
|
11
16
|
const handleApiEvent: ApiEventHandler = async ({
|
|
12
17
|
evName,
|
|
@@ -37,5 +42,11 @@ export const loyaltypoints = {
|
|
|
37
42
|
onStoreEvent: createAppEventsFunction(
|
|
38
43
|
'loyaltyPoints',
|
|
39
44
|
handleApiEvent,
|
|
40
|
-
)
|
|
45
|
+
),
|
|
46
|
+
|
|
47
|
+
cronAddPoints: functions.region(region).pubsub
|
|
48
|
+
.schedule('28 * * * *')
|
|
49
|
+
.onRun(() => {
|
|
50
|
+
return addPoints;
|
|
51
|
+
}),
|
|
41
52
|
};
|