@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stamhoofd/backend",
3
- "version": "2.73.3",
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.73.3",
41
- "@stamhoofd/backend-middleware": "2.73.3",
42
- "@stamhoofd/email": "2.73.3",
43
- "@stamhoofd/models": "2.73.3",
44
- "@stamhoofd/queues": "2.73.3",
45
- "@stamhoofd/sql": "2.73.3",
46
- "@stamhoofd/structures": "2.73.3",
47
- "@stamhoofd/utility": "2.73.3",
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": "00bbe8abcaac99c614bb352efa0fca54241f77d7"
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(`Je kan geen aansluitingen meer toevoegen in dit werkjaar`),
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(`Je kan geen aansluitingen meer toevoegen in {period} (vergrendeld)`, { period: period?.getBaseStructure().name }),
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(`Je kan geen aansluitingen meer verwijderen in dit werkjaar`),
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(`Je kan geen aansluitingen meer verwijderen in {period} (vergrendeld)`, { period: period?.getBaseStructure().name }),
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 (!(event.model instanceof Group)) {
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
- // Check if group has been deleted
24
- if (event.type === 'deleted' || (event.type === 'updated' && (event.changedFields['deletedAt'] !== undefined || event.changedFields['defaultAgeGroupId'] !== undefined))) {
25
- PlatformMembershipService.updateMembershipsForGroupId(event.model.id);
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.deletedAt = new Date();
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
- let didFind = false;
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
- if (didFind) {
262
- continue;
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.deletedAt = new Date();
307
- await toDelete.save();
331
+ await toDelete.doDelete();
308
332
  }
309
333
  }
310
334
  }