@stamhoofd/backend 2.90.3 → 2.91.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.
Files changed (35) hide show
  1. package/package.json +10 -10
  2. package/src/audit-logs/ModelLogger.ts +0 -1
  3. package/src/crons/endFunctionsOfUsersWithoutRegistration.ts +14 -0
  4. package/src/endpoints/admin/organizations/GetOrganizationsEndpoint.ts +2 -0
  5. package/src/endpoints/global/email/CreateEmailEndpoint.ts +2 -3
  6. package/src/endpoints/global/members/PatchOrganizationMembersEndpoint.ts +6 -4
  7. package/src/endpoints/global/platform/PatchPlatformEnpoint.ts +9 -7
  8. package/src/endpoints/global/registration/RegisterMembersEndpoint.ts +112 -105
  9. package/src/endpoints/organization/dashboard/organization/PatchOrganizationEndpoint.ts +1 -1
  10. package/src/endpoints/organization/dashboard/organization/SetUitpasClientCredentialsEndpoint.ts +5 -5
  11. package/src/endpoints/organization/dashboard/registration-periods/PatchOrganizationRegistrationPeriodsEndpoint.ts +1 -1
  12. package/src/endpoints/organization/dashboard/webshops/SearchUitpasEventsEndpoint.ts +1 -1
  13. package/src/endpoints/organization/webshops/PlaceOrderEndpoint.ts +2 -2
  14. package/src/helpers/AdminPermissionChecker.ts +0 -5
  15. package/src/helpers/FlagMomentCleanup.ts +13 -1
  16. package/src/helpers/GroupedThrottledQueue.ts +5 -3
  17. package/src/helpers/PeriodHelper.ts +10 -137
  18. package/src/helpers/SetupStepUpdater.ts +54 -7
  19. package/src/helpers/UitpasTokenRepository.ts +3 -3
  20. package/src/seeds/1750090030-records-configuration.ts +5 -1
  21. package/src/services/BalanceItemService.ts +12 -7
  22. package/src/services/DocumentService.ts +0 -1
  23. package/src/services/RegistrationService.ts +30 -1
  24. package/src/services/uitpas/UitpasService.ts +1 -1
  25. package/src/services/uitpas/cancelTicketSales.ts +1 -1
  26. package/src/services/uitpas/checkPermissionsFor.ts +9 -9
  27. package/src/services/uitpas/checkUitpasNumbers.ts +2 -2
  28. package/src/services/uitpas/getSocialTariffForEvent.ts +4 -4
  29. package/src/services/uitpas/getSocialTariffForUitpasNumbers.ts +5 -5
  30. package/src/services/uitpas/registerTicketSales.ts +4 -4
  31. package/src/services/uitpas/searchUitpasEvents.ts +3 -3
  32. package/src/services/uitpas/searchUitpasOrganizers.ts +3 -3
  33. package/src/sql-filters/members.ts +1 -1
  34. package/src/sql-filters/organizations.ts +52 -0
  35. package/tests/e2e/register.test.ts +1 -1
@@ -34,7 +34,7 @@ function assertsIsSocialTariffResponse(json: unknown): asserts json is SocialTar
34
34
  throw new SimpleError({
35
35
  code: 'invalid_response_getting_uitpas_social_tariff',
36
36
  message: `Invalid response when getting UiTPAS social tariff`,
37
- human: $t(`Er is een fout opgetreden bij het ophalen van het kansentarief voor jouw UiTPAS-nummer. Probeer het later opnieuw.`),
37
+ human: $t(`466844b9-c042-4bc7-b77d-3f87376086b5`),
38
38
  });
39
39
  }
40
40
  }
@@ -60,7 +60,7 @@ async function getSocialTariffForUitpasNumber(access_token: string, uitpasNumber
60
60
  throw new SimpleError({
61
61
  code: 'invalid_uitpas_event_url',
62
62
  message: `Invalid UiTPAS event URL: ${uitpasEventUrl}`,
63
- human: $t(`De opgegeven UiTPAS-evenement URL is ongeldig.`),
63
+ human: $t(`85fb6e02-9b69-43cc-acf7-96a576461560`),
64
64
  });
65
65
  }
66
66
  params.append('eventId', eventId);
@@ -110,7 +110,7 @@ async function getSocialTariffForUitpasNumber(access_token: string, uitpasNumber
110
110
  throw new SimpleError({
111
111
  code: 'unsuccessful_and_unexpected_response_retrieving_social_tariff_by_uitpas_number',
112
112
  message: `Unsuccesful response without message when retrieving social tariff by UiTPAS number`,
113
- human: $t(`Er is een fout opgetreden bij het ophalen van je UiTPAS kansentarief. Kijk je het nummer even na?`),
113
+ human: $t(`1572d069-abda-4b31-a373-f0c3760c79b1`),
114
114
  });
115
115
  }
116
116
  const json = await response.json().catch(() => {
@@ -136,7 +136,7 @@ async function getSocialTariffForUitpasNumber(access_token: string, uitpasNumber
136
136
  throw new SimpleError({
137
137
  code: 'no_social_tariff_available',
138
138
  message: `No social tariff available for event ${uitpasEventUrl}`,
139
- human: $t(`Er is geen kansentarief beschikbaar voor dit evenement.`),
139
+ human: $t(`ccd8e8b4-01a7-4e7c-8ae0-92d2a4c659eb`),
140
140
  });
141
141
  }
142
142
  if (json.available.length > 1) {
@@ -150,7 +150,7 @@ async function getSocialTariffForUitpasNumber(access_token: string, uitpasNumber
150
150
  throw new SimpleError({
151
151
  code: 'no_remaining_social_tariff',
152
152
  message: `No remaining social tariff for event ${uitpasEventUrl} and UiTPAS number ${uitpasNumber}`,
153
- human: $t(`Je hebt recht op UiTPAS-kansentarief maar het overblijvend aantal is niet voldoende.`),
153
+ human: $t(`f9d6bc51-e7c9-4d3f-a13f-27871a018d83`),
154
154
  });
155
155
  }
156
156
  console.log('Social tariff for UiTPAS number', uitpasNumber, 'with event id', uitpasEventUrl, 'is', json.available[0].price, 'euros');
@@ -46,7 +46,7 @@ function assertisSuccessResponse(json: unknown): asserts json is SuccessResponse
46
46
  throw new SimpleError({
47
47
  code: 'invalid_register_ticket_sale_response',
48
48
  message: `Invalid register ticket sale response`,
49
- human: $t(`Er is een fout opgetreden bij het registreren van de UiTPAS-ticketverkoop.`),
49
+ human: $t(`f5cac12d-ced6-43e6-bbd9-81b381807154`),
50
50
  });
51
51
  }
52
52
  }
@@ -69,7 +69,7 @@ export async function registerTicketSales(access_token: string, registerTicketSa
69
69
  throw new SimpleError({
70
70
  code: 'invalid_uitpas_event_url',
71
71
  message: `Invalid UiTPAS event URL: ${ticketSale.uitpasEventUrl}`,
72
- human: $t(`De opgegeven UiTPAS-evenement URL is ongeldig.`),
72
+ human: $t(`85fb6e02-9b69-43cc-acf7-96a576461560`),
73
73
  });
74
74
  }
75
75
 
@@ -108,7 +108,7 @@ export async function registerTicketSales(access_token: string, registerTicketSa
108
108
  throw new SimpleError({
109
109
  code: 'unsuccessful_response_registering_ticket_sales',
110
110
  message: `Unsuccessful response when registering UiTPAS ticket sales`,
111
- human: $t(`Er is een fout opgetreden bij het verbinden met UiTPAS. Probeer het later opnieuw.`),
111
+ human: $t(`ed4e876c-6a40-49a7-ab65-2a4d5f31c13f`),
112
112
  });
113
113
  }
114
114
  const json = await response.json().catch(() => {});
@@ -117,7 +117,7 @@ export async function registerTicketSales(access_token: string, registerTicketSa
117
117
  throw new SimpleError({
118
118
  code: 'invalid_response_registering_ticket_sales',
119
119
  message: `Invalid response when registering ticket sales`,
120
- human: $t(`Er is een fout opgetreden bij het registreren van de UiTPAS-ticketverkoop.`),
120
+ human: $t(`f5cac12d-ced6-43e6-bbd9-81b381807154`),
121
121
  });
122
122
  }
123
123
  const now = new Date();
@@ -49,7 +49,7 @@ function assertIsEventsResponse(json: unknown): asserts json is EventsResponse {
49
49
  throw new SimpleError({
50
50
  code: 'invalid_events_response',
51
51
  message: `Invalid events response`,
52
- human: $t(`Er is een fout opgetreden bij het ophalen van de UiTPAS-evenementen.`),
52
+ human: $t(`0b610eb8-551f-4ef6-acdc-fb3267dfc2a8`),
53
53
  });
54
54
  }
55
55
  }
@@ -61,7 +61,7 @@ export async function searchUitpasEvents(clientId: string, uitpasOrganizerId: st
61
61
  throw new SimpleError({
62
62
  code: 'no_client_id_for_uitpas_events',
63
63
  message: `No client ID configured for Uitpas events`,
64
- human: $t(`Er is geen UiTPAS client ID geconfigureerd voor deze organisatie.`),
64
+ human: $t(`0009cce2-9d13-4f03-9258-345d8f8e396e`),
65
65
  });
66
66
  }
67
67
  const baseUrl = 'https://search-test.uitdatabank.be/events';
@@ -97,7 +97,7 @@ export async function searchUitpasEvents(clientId: string, uitpasOrganizerId: st
97
97
  throw new SimpleError({
98
98
  code: 'unsuccessful_response_searching_uitpas_events',
99
99
  message: `Unsuccessful response when searching for UiTPAS events`,
100
- human: $t(`Er is een fout opgetreden bij het verbinden met UiTPAS. Probeer het later opnieuw.`),
100
+ human: $t(`ed4e876c-6a40-49a7-ab65-2a4d5f31c13f`),
101
101
  });
102
102
  }
103
103
  const json = await response.json().catch(() => {
@@ -25,7 +25,7 @@ function assertIsOrganizersResponse(json: unknown): asserts json is OrganizersRe
25
25
  throw new SimpleError({
26
26
  code: 'invalid_response_searching_uitpas_organizers',
27
27
  message: `Invalid response when searching for UiTPAS organizers`,
28
- human: $t(`Er is een fout opgetreden bij het zoeken naar UiTPAS-organisaties. Probeer het later opnieuw.`),
28
+ human: $t(`e1aab1a7-fded-4e5e-b994-6607684764ac`),
29
29
  });
30
30
  }
31
31
  }
@@ -37,7 +37,7 @@ export async function searchUitpasOrganizers(access_token: string, name: string)
37
37
  throw new SimpleError({
38
38
  code: 'empty_uitpas_organizer_name',
39
39
  message: `Empty name when searching for UiTPAS organizers`,
40
- human: $t(`Je moet een naam opgeven om UiTPAS-organisaties te zoeken.`),
40
+ human: $t(`963105d8-a70a-4ba4-9ddc-b7f908d44664`),
41
41
  });
42
42
  }
43
43
  const baseUrl = 'https://api-test.uitpas.be/organizers';
@@ -66,7 +66,7 @@ export async function searchUitpasOrganizers(access_token: string, name: string)
66
66
  throw new SimpleError({
67
67
  code: 'unsuccessful_response_searching_uitpas_organizers',
68
68
  message: `Unsuccessful response when searching for UiTPAS organizers`,
69
- human: $t(`Er is een fout opgetreden bij het verbinden met UiTPAS. Probeer het later opnieuw.`),
69
+ human: $t(`ed4e876c-6a40-49a7-ab65-2a4d5f31c13f`),
70
70
  });
71
71
  }
72
72
  const json = await response.json().catch(() => {
@@ -457,7 +457,7 @@ export const memberFilterCompilers: SQLFilterDefinitions = {
457
457
  throw new SimpleError({
458
458
  code: 'permission_denied',
459
459
  message: 'No permissions for financial support filter (organization scope).',
460
- human: result.record ? $t(`Je hebt niet voldoende toegangsrechten om te filteren op {recordName}`, { recordName: result.record.name }) : $t(`Je hebt niet voldoende toegangsrechten om te filteren op dit gegevensveld`),
460
+ human: result.record ? $t(`3560487e-3f2c-4cc9-ad7f-4e9a0fc1bbb8`, { recordName: result.record.name }) : $t(`Je hebt niet voldoende toegangsrechten om te filteren op dit gegevensveld`),
461
461
  statusCode: 400,
462
462
  });
463
463
  }
@@ -187,4 +187,56 @@ export const organizationFilterCompilers: SQLFilterDefinitions = {
187
187
  }),
188
188
  },
189
189
  ),
190
+ companies: createExistsFilter(
191
+ /**
192
+ * There is a bug in MySQL 8 that is fixed in 9.3
193
+ * where EXISTS (select * from json_table(...)) does not work
194
+ * To fix this, we do a double select with join inside the select
195
+ * It is a bit slower, but it works for now.
196
+ */
197
+ SQL.select()
198
+ .from('organizations', 'innerOrganizations')
199
+ .join(
200
+ SQL.join(
201
+ SQL.jsonTable(
202
+ SQL.jsonValue(SQL.column('innerOrganizations', 'meta'), '$.value.companies'),
203
+ 'companies',
204
+ )
205
+ .addColumn(
206
+ 'companyNumber',
207
+ 'TEXT',
208
+ '$.companyNumber',
209
+ )
210
+ .addColumn(
211
+ 'VATNumber',
212
+ 'TEXT',
213
+ '$.VATNumber',
214
+ )
215
+ .addColumn(
216
+ 'name',
217
+ 'TEXT',
218
+ '$.name',
219
+ ),
220
+ ),
221
+ )
222
+ .where(SQL.column('innerOrganizations', 'id'), SQL.column('organizations', 'id')),
223
+ {
224
+ ...baseSQLFilterCompilers,
225
+ name: createColumnFilter({
226
+ expression: SQL.column('companies', 'name'),
227
+ type: SQLValueType.String,
228
+ nullable: true,
229
+ }),
230
+ companyNumber: createColumnFilter({
231
+ expression: SQL.column('companies', 'companyNumber'),
232
+ type: SQLValueType.String,
233
+ nullable: true,
234
+ }),
235
+ VATNumber: createColumnFilter({
236
+ expression: SQL.column('companies', 'VATNumber'),
237
+ type: SQLValueType.String,
238
+ nullable: true,
239
+ }),
240
+ },
241
+ ),
190
242
  };
@@ -1195,7 +1195,7 @@ describe('E2E.Register', () => {
1195
1195
  expect(trialUntil).not.toBeNull();
1196
1196
  expect(trialUntil!.getFullYear()).toBe(2023);
1197
1197
  expect(trialUntil!.getMonth()).toBe(4);
1198
- expect(trialUntil!.getDate()).toBe(24);
1198
+ expect(trialUntil!.getDate()).toBe(19);
1199
1199
  }
1200
1200
  finally {
1201
1201
  jest.useRealTimers().resetAllMocks();