@stamhoofd/backend 2.73.3 → 2.74.0
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/package.json +10 -10
- package/src/audit-logs/MemberPlatformMembershipLogger.ts +1 -1
- package/src/endpoints/global/members/PatchOrganizationMembersEndpoint.ts +4 -4
- package/src/seeds-temporary/README.md +1 -0
- package/src/services/PlatformMembershipService.ts +38 -14
- /package/src/{seeds → seeds-temporary}/1732117645-move-rrn.ts +0 -0
- /package/src/{seeds → seeds-temporary}/1736266448-recall-balance-item-price-paid.ts +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stamhoofd/backend",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.74.0",
|
|
4
4
|
"main": "./dist/index.js",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": {
|
|
@@ -37,14 +37,14 @@
|
|
|
37
37
|
"@simonbackx/simple-encoding": "2.19.0",
|
|
38
38
|
"@simonbackx/simple-endpoints": "1.15.0",
|
|
39
39
|
"@simonbackx/simple-logging": "^1.0.1",
|
|
40
|
-
"@stamhoofd/backend-i18n": "2.
|
|
41
|
-
"@stamhoofd/backend-middleware": "2.
|
|
42
|
-
"@stamhoofd/email": "2.
|
|
43
|
-
"@stamhoofd/models": "2.
|
|
44
|
-
"@stamhoofd/queues": "2.
|
|
45
|
-
"@stamhoofd/sql": "2.
|
|
46
|
-
"@stamhoofd/structures": "2.
|
|
47
|
-
"@stamhoofd/utility": "2.
|
|
40
|
+
"@stamhoofd/backend-i18n": "2.74.0",
|
|
41
|
+
"@stamhoofd/backend-middleware": "2.74.0",
|
|
42
|
+
"@stamhoofd/email": "2.74.0",
|
|
43
|
+
"@stamhoofd/models": "2.74.0",
|
|
44
|
+
"@stamhoofd/queues": "2.74.0",
|
|
45
|
+
"@stamhoofd/sql": "2.74.0",
|
|
46
|
+
"@stamhoofd/structures": "2.74.0",
|
|
47
|
+
"@stamhoofd/utility": "2.74.0",
|
|
48
48
|
"archiver": "^7.0.1",
|
|
49
49
|
"aws-sdk": "^2.885.0",
|
|
50
50
|
"axios": "1.6.8",
|
|
@@ -64,5 +64,5 @@
|
|
|
64
64
|
"publishConfig": {
|
|
65
65
|
"access": "public"
|
|
66
66
|
},
|
|
67
|
-
"gitHead": "
|
|
67
|
+
"gitHead": "3a77692b8163f10c231785de2f720c423a909762"
|
|
68
68
|
}
|
|
@@ -10,7 +10,7 @@ const defaultGenerator = getDefaultGenerator({
|
|
|
10
10
|
});
|
|
11
11
|
|
|
12
12
|
export const MemberPlatformMembershipLogger = new ModelLogger(MemberPlatformMembership, {
|
|
13
|
-
skipKeys: ['balanceItemId'],
|
|
13
|
+
skipKeys: ['balanceItemId', 'priceWithoutDiscount', 'maximumFreeAmount', 'generated'],
|
|
14
14
|
async optionsGenerator(event) {
|
|
15
15
|
const result = await defaultGenerator(event);
|
|
16
16
|
|
|
@@ -428,7 +428,7 @@ export class PatchOrganizationMembersEndpoint extends Endpoint<Params, Query, Bo
|
|
|
428
428
|
throw new SimpleError({
|
|
429
429
|
code: 'invalid_field',
|
|
430
430
|
message: 'Invalid period',
|
|
431
|
-
human: Context.i18n.$t(`
|
|
431
|
+
human: Context.i18n.$t(`62103514-05f5-4dc0-a5cc-c9321f21c63d`),
|
|
432
432
|
field: 'periodId',
|
|
433
433
|
});
|
|
434
434
|
}
|
|
@@ -437,7 +437,7 @@ export class PatchOrganizationMembersEndpoint extends Endpoint<Params, Query, Bo
|
|
|
437
437
|
throw new SimpleError({
|
|
438
438
|
code: 'invalid_field',
|
|
439
439
|
message: 'Invalid period',
|
|
440
|
-
human: Context.i18n.$t(`
|
|
440
|
+
human: Context.i18n.$t(`745f5355-3398-406d-842e-5c9f7a700e91`, { period: period?.getBaseStructure().name }),
|
|
441
441
|
field: 'periodId',
|
|
442
442
|
});
|
|
443
443
|
}
|
|
@@ -563,7 +563,7 @@ export class PatchOrganizationMembersEndpoint extends Endpoint<Params, Query, Bo
|
|
|
563
563
|
throw new SimpleError({
|
|
564
564
|
code: 'invalid_field',
|
|
565
565
|
message: 'Invalid period',
|
|
566
|
-
human: Context.i18n.$t(`
|
|
566
|
+
human: Context.i18n.$t(`1f1d657d-bc73-4cae-9025-b3ec67a705e7`),
|
|
567
567
|
field: 'periodId',
|
|
568
568
|
});
|
|
569
569
|
}
|
|
@@ -572,7 +572,7 @@ export class PatchOrganizationMembersEndpoint extends Endpoint<Params, Query, Bo
|
|
|
572
572
|
throw new SimpleError({
|
|
573
573
|
code: 'invalid_field',
|
|
574
574
|
message: 'Invalid period',
|
|
575
|
-
human: Context.i18n.$t(`
|
|
575
|
+
human: Context.i18n.$t(`2e615670-813a-414f-b06c-f76136891bf8`, { period: period?.getBaseStructure().name }),
|
|
576
576
|
field: 'periodId',
|
|
577
577
|
});
|
|
578
578
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
This folder contains seeds that should only run once on specific servers. To fix a bug, or migrate data specific for a server.
|
|
@@ -15,14 +15,19 @@ export class PlatformMembershipService {
|
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
// Listen for group changes
|
|
18
|
-
Model.modelEventBus.addListener(this, (event) => {
|
|
19
|
-
if (
|
|
18
|
+
Model.modelEventBus.addListener(this, async (event) => {
|
|
19
|
+
if (event.model instanceof Group) {
|
|
20
|
+
// Check if group has been deleted
|
|
21
|
+
if (event.type === 'deleted' || (event.type === 'updated' && (event.changedFields['deletedAt'] !== undefined || event.changedFields['defaultAgeGroupId'] !== undefined))) {
|
|
22
|
+
PlatformMembershipService.updateMembershipsForGroupId(event.model.id);
|
|
23
|
+
}
|
|
20
24
|
return;
|
|
21
25
|
}
|
|
22
26
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
27
|
+
if (event.model instanceof RegistrationPeriod) {
|
|
28
|
+
if (event.type === 'updated' && event.changedFields['locked'] !== undefined && event.model.locked === true) {
|
|
29
|
+
PlatformMembershipService.setMembershipsLockedForRegistrationPeriodId(event.model.id);
|
|
30
|
+
}
|
|
26
31
|
}
|
|
27
32
|
});
|
|
28
33
|
}
|
|
@@ -80,6 +85,25 @@ export class PlatformMembershipService {
|
|
|
80
85
|
});
|
|
81
86
|
}
|
|
82
87
|
|
|
88
|
+
static setMembershipsLockedForRegistrationPeriodId(periodId: string) {
|
|
89
|
+
if (STAMHOOFD.userMode === 'organization') {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
QueueHandler.schedule('bulk-lock-memberships', async () => {
|
|
94
|
+
console.log('Bulk locking memberships for period id ', periodId);
|
|
95
|
+
|
|
96
|
+
await MemberPlatformMembership.update()
|
|
97
|
+
.set('locked', true)
|
|
98
|
+
.where('periodId', periodId)
|
|
99
|
+
.update();
|
|
100
|
+
|
|
101
|
+
console.log(`Locked memberships for period id ${periodId}`);
|
|
102
|
+
}).catch((e) => {
|
|
103
|
+
console.error('Failed to lock memberships for period id ', periodId, e);
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
|
|
83
107
|
static updateMembershipsForGroupId(id: string) {
|
|
84
108
|
if (STAMHOOFD.userMode === 'organization') {
|
|
85
109
|
return;
|
|
@@ -186,8 +210,7 @@ export class PlatformMembershipService {
|
|
|
186
210
|
if (!silent) {
|
|
187
211
|
console.log('Removing membership because no longer registered member and not yet invoiced for: ' + me.id + ' - membership ' + membership.id);
|
|
188
212
|
}
|
|
189
|
-
membership.
|
|
190
|
-
await membership.save();
|
|
213
|
+
await membership.doDelete();
|
|
191
214
|
}
|
|
192
215
|
}
|
|
193
216
|
|
|
@@ -234,15 +257,16 @@ export class PlatformMembershipService {
|
|
|
234
257
|
}
|
|
235
258
|
return diff;
|
|
236
259
|
})[0];
|
|
260
|
+
|
|
237
261
|
if (!cheapestMembership) {
|
|
238
262
|
console.error('No membership found');
|
|
239
263
|
continue;
|
|
240
264
|
}
|
|
241
265
|
|
|
242
266
|
// Check if already have the same membership
|
|
267
|
+
let didFind = false;
|
|
243
268
|
for (const m of activeMemberships) {
|
|
244
|
-
|
|
245
|
-
if (m.membershipTypeId === cheapestMembership.membership.id) {
|
|
269
|
+
if (m.membershipTypeId === cheapestMembership.membership.id && m.organizationId === cheapestMembership.registration.organizationId) {
|
|
246
270
|
// Update the price of this active membership (could have changed)
|
|
247
271
|
try {
|
|
248
272
|
await m.calculatePrice(me, cheapestMembership.registration);
|
|
@@ -257,10 +281,10 @@ export class PlatformMembershipService {
|
|
|
257
281
|
didFind = true;
|
|
258
282
|
break;
|
|
259
283
|
}
|
|
284
|
+
}
|
|
260
285
|
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
}
|
|
286
|
+
if (didFind) {
|
|
287
|
+
continue;
|
|
264
288
|
}
|
|
265
289
|
|
|
266
290
|
const periodConfig = cheapestMembership.membership.periods.get(period.id);
|
|
@@ -273,6 +297,7 @@ export class PlatformMembershipService {
|
|
|
273
297
|
if (!silent) {
|
|
274
298
|
console.log('Creating automatic membership for: ' + me.id + ' - membership type ' + cheapestMembership.membership.id);
|
|
275
299
|
}
|
|
300
|
+
|
|
276
301
|
const membership = new MemberPlatformMembership();
|
|
277
302
|
membership.memberId = me.id;
|
|
278
303
|
membership.membershipTypeId = cheapestMembership.membership.id;
|
|
@@ -303,8 +328,7 @@ export class PlatformMembershipService {
|
|
|
303
328
|
if (!silent) {
|
|
304
329
|
console.log('Removing membership because cheaper membership found for: ' + me.id + ' - membership ' + toDelete.id);
|
|
305
330
|
}
|
|
306
|
-
toDelete.
|
|
307
|
-
await toDelete.save();
|
|
331
|
+
await toDelete.doDelete();
|
|
308
332
|
}
|
|
309
333
|
}
|
|
310
334
|
}
|
|
File without changes
|
|
File without changes
|