@stamhoofd/backend 2.120.0 → 2.120.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stamhoofd/backend",
3
- "version": "2.120.0",
3
+ "version": "2.120.1",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "exports": {
@@ -65,14 +65,14 @@
65
65
  "@simonbackx/simple-encoding": "2.26.5",
66
66
  "@simonbackx/simple-endpoints": "1.21.0",
67
67
  "@simonbackx/simple-logging": "^1.0.1",
68
- "@stamhoofd/backend-i18n": "2.120.0",
69
- "@stamhoofd/backend-middleware": "2.120.0",
70
- "@stamhoofd/email": "2.120.0",
71
- "@stamhoofd/models": "2.120.0",
72
- "@stamhoofd/queues": "2.120.0",
73
- "@stamhoofd/sql": "2.120.0",
74
- "@stamhoofd/structures": "2.120.0",
75
- "@stamhoofd/utility": "2.120.0",
68
+ "@stamhoofd/backend-i18n": "2.120.1",
69
+ "@stamhoofd/backend-middleware": "2.120.1",
70
+ "@stamhoofd/email": "2.120.1",
71
+ "@stamhoofd/models": "2.120.1",
72
+ "@stamhoofd/queues": "2.120.1",
73
+ "@stamhoofd/sql": "2.120.1",
74
+ "@stamhoofd/structures": "2.120.1",
75
+ "@stamhoofd/utility": "2.120.1",
76
76
  "archiver": "^7.0.1",
77
77
  "axios": "^1.13.2",
78
78
  "cookie": "^0.7.0",
@@ -90,5 +90,5 @@
90
90
  "publishConfig": {
91
91
  "access": "public"
92
92
  },
93
- "gitHead": "f38f79c15ce16b0c8c14743ff3eb61feda5a18d4"
93
+ "gitHead": "00f65fc28d68feb86c30789784181a8954d638d7"
94
94
  }
package/src/boot.ts CHANGED
@@ -5,6 +5,7 @@ import { Email } from '@stamhoofd/email';
5
5
  import { loadLogger } from '@stamhoofd/logging';
6
6
  import { Version } from '@stamhoofd/structures';
7
7
  import { sleep } from '@stamhoofd/utility';
8
+ import { checkReadOnly } from '@stamhoofd/crons';
8
9
 
9
10
  import { SimpleError } from '@simonbackx/simple-errors';
10
11
  import { startCrons, stopCrons, waitForCrons } from '@stamhoofd/crons';
@@ -24,6 +25,7 @@ import { PlatformMembershipService } from './services/PlatformMembershipService.
24
25
  import { UitpasService } from './services/uitpas/UitpasService.js';
25
26
  import { UniqueUserService } from './services/UniqueUserService.js';
26
27
  import { AutoEncoder } from '@simonbackx/simple-encoding';
28
+ import { StyledText } from '@simonbackx/simple-logging';
27
29
 
28
30
  process.on('unhandledRejection', (error: Error) => {
29
31
  console.error('unhandledRejection');
@@ -47,11 +49,17 @@ if (new Date().getTimezoneOffset() !== 0) {
47
49
  }
48
50
 
49
51
  const seeds = async (options: {shutdown: () => Promise<void>}) => {
52
+ if (await checkReadOnly()) {
53
+ console.error(new StyledText(`[SEEDS] `).addClass('migration', 'tag'), new StyledText('MySQL is in read-only mode: Seeds are disabled.').addClass('error'));
54
+ return;
55
+ }
56
+
50
57
  try {
51
58
  // Internal
52
59
  await AuditLogService.disable(async () => {
53
60
  if (!await Migration.runAll(import.meta.dirname + '/seeds')) {
54
- console.error('Seeds failed!')
61
+ console.error(new StyledText(`[SEEDS] `).addClass('migration', 'tag'), new StyledText('Seeds failed!').addClass('error'));
62
+
55
63
  if (STAMHOOFD.environment === 'test' || STAMHOOFD.environment === 'development') {
56
64
  await options.shutdown();
57
65
  }
@@ -65,7 +65,7 @@ export class PatchOrganizationMembersEndpoint extends Endpoint<Params, Query, Bo
65
65
  throw new SimpleError({
66
66
  code: 'invalid_field',
67
67
  message: 'Member number already in use',
68
- human: $t('Dit lidnummer is al in gebruik'),
68
+ human: $t('%1Oe'),
69
69
  field: 'details.memberNumber',
70
70
  });
71
71
  }
@@ -1031,7 +1031,7 @@ export class PatchOrganizationMembersEndpoint extends Endpoint<Params, Query, Bo
1031
1031
  code: 'known_member_missing_rights',
1032
1032
  message: 'Creating known member without sufficient access rights',
1033
1033
  // different message for userMode organization because security codes are not available in that mode
1034
- human: $t(`{member} is al gekend in ons systeem, maar jouw e-mailadres niet. Neem contact op met de vereniging.`, { member: member.details.firstName }),
1034
+ human: $t(`%1Oz`, { member: member.details.firstName }),
1035
1035
  statusCode: 400,
1036
1036
  });
1037
1037
  }
@@ -2,10 +2,10 @@ import type { Decoder } from '@simonbackx/simple-encoding';
2
2
  import type { DecodedRequest, Request } from '@simonbackx/simple-endpoints';
3
3
  import { Endpoint, Response } from '@simonbackx/simple-endpoints';
4
4
  import { SimpleError } from '@simonbackx/simple-errors';
5
- import { Member, MemberPlatformMembership, Organization } from '@stamhoofd/models';
5
+ import { BalanceItem, Member, MemberPlatformMembership, Organization } from '@stamhoofd/models';
6
6
  import { applySQLSorter, compileToSQLFilter } from '@stamhoofd/sql';
7
7
  import type { CountFilteredRequest, StamhoofdFilter } from '@stamhoofd/structures';
8
- import { assertSort, getSortFilter, LimitedFilteredRequest, PaginatedResponse, PlatformMembershiMemberDetails, PlatformMembership, PlatformMembershipOrganizationDetails } from '@stamhoofd/structures';
8
+ import { assertSort, getSortFilter, LimitedFilteredRequest, PaginatedResponse, PlatformMembershipMemberDetails, PlatformMembership, PlatformMembershipOrganizationDetails } from '@stamhoofd/structures';
9
9
  import { Formatter } from '@stamhoofd/utility';
10
10
  import { Context } from '../../../helpers/Context.js';
11
11
  import { platformMembershipFilterCompilers } from '../../../sql-filters/platform-memberships.js';
@@ -115,8 +115,11 @@ export class GetPlatformMembershipsEndpoint extends Endpoint<Params, Query, Body
115
115
 
116
116
  const memberIds = Formatter.uniqueArray(data.map(d => d.memberId));
117
117
  const organizationIds = Formatter.uniqueArray(data.map(d => d.organizationId));
118
+ const balanceItemIds = Formatter.uniqueArray(data.map(d => d.balanceItemId));
118
119
  const members = await Member.getByIDs(...memberIds);
119
120
  const organizations = await Organization.getByIDs(...organizationIds);
121
+ const balanceItems = await BalanceItem.getByIDs(...balanceItemIds)
122
+ const balanceItemStructures = await BalanceItem.getStructureWithPayments(balanceItems);
120
123
 
121
124
  const results: PlatformMembership[] = [];
122
125
 
@@ -126,7 +129,7 @@ export class GetPlatformMembershipsEndpoint extends Endpoint<Params, Query, Body
126
129
  throw new SimpleError({
127
130
  code: 'not_found',
128
131
  message: 'Member not found',
129
- human: $t(`Het lid dat bij de aansluiting hoort is niet gevonden.`),
132
+ human: $t(`%1Nz`),
130
133
  statusCode: 404,
131
134
  });
132
135
  }
@@ -136,14 +139,16 @@ export class GetPlatformMembershipsEndpoint extends Endpoint<Params, Query, Body
136
139
  throw new SimpleError({
137
140
  code: 'not_found',
138
141
  message: 'Organization not found',
139
- human: $t(`De vereniging die bij de aansluiting hoort is niet gevonden.`),
142
+ human: $t(`%1OX`),
140
143
  statusCode: 404,
141
144
  });
142
145
  }
143
146
 
147
+ const balanceItem = model.balanceItemId ? balanceItemStructures.find(o => o.id === model.balanceItemId) : null;
144
148
  results.push(PlatformMembership.create({
145
149
  ...model,
146
- member: PlatformMembershiMemberDetails.create(member),
150
+ balanceItem: balanceItem,
151
+ member: PlatformMembershipMemberDetails.create(member),
147
152
  organization: PlatformMembershipOrganizationDetails.create(organization)
148
153
  }));
149
154
  }
@@ -115,7 +115,7 @@ export class SetOrganizationDomainEndpoint extends Endpoint<Params, Query, Body,
115
115
  type: DNSRecordType.CNAME,
116
116
  name: organization.privateMeta.mailFromDomain + '.',
117
117
  // Use shops for mail domain, to allow reuse
118
- value: (STAMHOOFD.domains.webshopCname ?? STAMHOOFD.domains.registrationCname) + '.',
118
+ value: (STAMHOOFD.domains.webshopCname ?? STAMHOOFD.domains.registrationCname[organization.address.country] ?? STAMHOOFD.domains.registrationCname['']) + '.',
119
119
  }));
120
120
 
121
121
  if (STAMHOOFD.domains.registration && organization.privateMeta.pendingRegisterDomain) {
@@ -123,7 +123,7 @@ export class SetOrganizationDomainEndpoint extends Endpoint<Params, Query, Body,
123
123
  type: DNSRecordType.CNAME,
124
124
  name: organization.privateMeta.pendingRegisterDomain + '.',
125
125
  // Use registration domain
126
- value: STAMHOOFD.domains.registrationCname + '.',
126
+ value: (STAMHOOFD.domains.registrationCname[organization.address.country] ?? STAMHOOFD.domains.registrationCname['']) + '.',
127
127
  }));
128
128
  }
129
129
  }
@@ -132,7 +132,7 @@ export class SetOrganizationDomainEndpoint extends Endpoint<Params, Query, Body,
132
132
  type: DNSRecordType.CNAME,
133
133
  name: organization.privateMeta.mailFromDomain + '.',
134
134
  // Use registration domain
135
- value: STAMHOOFD.domains.registrationCname + '.',
135
+ value: (STAMHOOFD.domains.registrationCname[organization.address.country] ?? STAMHOOFD.domains.registrationCname['']) + '.',
136
136
  }));
137
137
  }
138
138
 
@@ -38,7 +38,7 @@ const sheet: XlsxTransformerSheet<EventNotification, EventNotification> = {
38
38
  },
39
39
  {
40
40
  id: 'organization.uri',
41
- name: $t(`%7C`),
41
+ name: $t(`%1O1`),
42
42
  width: 30,
43
43
  getValue: (notification: EventNotification) => ({
44
44
  value: notification.organization.uri,
@@ -67,7 +67,7 @@ const sheet: XlsxTransformerSheet<EventNotification, EventNotification> = {
67
67
  },
68
68
  {
69
69
  id: 'startDate',
70
- name: $t(`%7e`),
70
+ name: $t(`%1Of`),
71
71
  width: 20,
72
72
  getValue: (notification: EventNotification) => ({
73
73
  value: notification.startDate,
@@ -80,7 +80,7 @@ const sheet: XlsxTransformerSheet<EventNotification, EventNotification> = {
80
80
  },
81
81
  {
82
82
  id: 'endDate',
83
- name: $t(`%wB`),
83
+ name: $t(`%1P8`),
84
84
  width: 20,
85
85
  getValue: (notification: EventNotification) => ({
86
86
  value: notification.endDate,
@@ -154,7 +154,7 @@ export const baseMemberColumns: XlsxTransformerColumn<PlatformMember>[] = [
154
154
  },
155
155
  {
156
156
  id: 'membership',
157
- name: $t(`%Wq`),
157
+ name: $t(`%1Ny`),
158
158
  width: 20,
159
159
  getValue: (member: PlatformMember) => {
160
160
  return {
@@ -177,7 +177,7 @@ export const baseMemberColumns: XlsxTransformerColumn<PlatformMember>[] = [
177
177
  },
178
178
  {
179
179
  id: 'uri',
180
- name: $t(`%7C`),
180
+ name: $t(`%1O1`),
181
181
  width: 30,
182
182
  getValue: (member: PlatformMember) => {
183
183
  const organizations = member.filterOrganizations({ currentPeriod: true, types: [GroupType.Membership] });
@@ -41,7 +41,7 @@ const sheet: XlsxTransformerSheet<Object, Object> = {
41
41
  },
42
42
  {
43
43
  id: 'uri',
44
- name: $t(`%7C`),
44
+ name: $t(`%1O1`),
45
45
  width: 20,
46
46
  getValue: (object: Object) => ({
47
47
  value: object.uri,
@@ -49,7 +49,7 @@ const sheet: XlsxTransformerSheet<Object, Object> = {
49
49
  },
50
50
  {
51
51
  id: 'name',
52
- name: $t(`%Gq`),
52
+ name: $t(`%1Os`),
53
53
  width: 50,
54
54
  getValue: (object: Object) => ({
55
55
  value: object.name,
@@ -106,7 +106,7 @@ const responsibilities: XlsxTransformerSheet<Object, MemberResponsibilityRecordW
106
106
  },
107
107
  {
108
108
  id: 'organization.uri',
109
- name: $t(`%7C`),
109
+ name: $t(`%1O1`),
110
110
  width: 20,
111
111
  getValue: (object: MemberResponsibilityRecordWithMemberAndOrganization) => ({
112
112
  value: object.organization.uri,
@@ -191,7 +191,7 @@ const premises: XlsxTransformerSheet<Object, PremiseWithOrganization> = {
191
191
  },
192
192
  {
193
193
  id: 'organization.uri',
194
- name: $t(`%7C`),
194
+ name: $t(`%1O1`),
195
195
  width: 20,
196
196
  getValue: (object: PremiseWithOrganization) => ({
197
197
  value: object.organization.uri,
@@ -207,7 +207,7 @@ const premises: XlsxTransformerSheet<Object, PremiseWithOrganization> = {
207
207
  },
208
208
  {
209
209
  id: 'premise.name',
210
- name: $t(`%Gq`),
210
+ name: $t(`%1Os`),
211
211
  width: 20,
212
212
  getValue: (object: PremiseWithOrganization) => ({
213
213
  value: object.premise.name,
@@ -523,7 +523,7 @@ function getInvoiceColumns(): XlsxTransformerColumn<PaymentGeneral>[] {
523
523
  return [
524
524
  {
525
525
  id: 'customer.name',
526
- name: $t(`%Gq`),
526
+ name: $t(`%1Os`),
527
527
  width: 30,
528
528
  getValue: (object: PaymentGeneralWithStripeAccount) => {
529
529
  return {
@@ -20,7 +20,7 @@ const sheet: XlsxTransformerSheet<PlatformMembership> = {
20
20
  },
21
21
  {
22
22
  id: 'type',
23
- name: $t('Type'),
23
+ name: $t('%1LP'),
24
24
  width: 40,
25
25
  getValue: (membership: PlatformMembership) => {
26
26
  const membershipType = Platform.shared.config.membershipTypes.find(m => m.id === membership.membershipTypeId);
@@ -30,7 +30,7 @@ const sheet: XlsxTransformerSheet<PlatformMembership> = {
30
30
  },
31
31
  {
32
32
  id: 'startDate',
33
- name: $t('Startdatum'),
33
+ name: $t('%1Of'),
34
34
  width: 20,
35
35
  getValue: (membership: PlatformMembership) => {
36
36
  return {
@@ -45,7 +45,7 @@ const sheet: XlsxTransformerSheet<PlatformMembership> = {
45
45
  },
46
46
  {
47
47
  id: 'endDate',
48
- name: $t('Einddatum'),
48
+ name: $t('%1P8'),
49
49
  width: 20,
50
50
  getValue: (membership: PlatformMembership) => {
51
51
  return {
@@ -60,7 +60,7 @@ const sheet: XlsxTransformerSheet<PlatformMembership> = {
60
60
  },
61
61
  {
62
62
  id: 'price',
63
- name: $t('Prijs'),
63
+ name: $t('%1IP'),
64
64
  width: 10,
65
65
  getValue: (membership: PlatformMembership) => {
66
66
  return {
@@ -75,7 +75,7 @@ const sheet: XlsxTransformerSheet<PlatformMembership> = {
75
75
  },
76
76
  {
77
77
  id: 'priceWithoutDiscount',
78
- name: $t(`Prijs zonder korting`),
78
+ name: $t(`%1Nm`),
79
79
  width: 10,
80
80
  getValue: (membership: PlatformMembership) => {
81
81
  return {
@@ -90,7 +90,7 @@ const sheet: XlsxTransformerSheet<PlatformMembership> = {
90
90
  },
91
91
  {
92
92
  id: 'trialUntil',
93
- name: $t(`Einde proefperiode`),
93
+ name: $t(`%1PU`),
94
94
  width: 20,
95
95
  getValue: (membership: PlatformMembership) => {
96
96
  return {
@@ -105,7 +105,7 @@ const sheet: XlsxTransformerSheet<PlatformMembership> = {
105
105
  },
106
106
  {
107
107
  id: 'freeAmount',
108
- name: $t(`Dagen gratis`),
108
+ name: $t(`%1Oo`),
109
109
  width: 40,
110
110
  getValue: (membership: PlatformMembership) => ({
111
111
  value: membership.freeAmount,
@@ -113,7 +113,7 @@ const sheet: XlsxTransformerSheet<PlatformMembership> = {
113
113
  },
114
114
  {
115
115
  id: 'createdAt',
116
- name: $t(`Aanmaakdatum`),
116
+ name: $t(`%1Jc`),
117
117
  width: 20,
118
118
  getValue: (membership: PlatformMembership) => {
119
119
  return {
@@ -128,7 +128,7 @@ const sheet: XlsxTransformerSheet<PlatformMembership> = {
128
128
  },
129
129
  {
130
130
  id: 'expireDate',
131
- name: $t(`Vervaldatum`),
131
+ name: $t(`%1J7`),
132
132
  width: 20,
133
133
  getValue: (membership: PlatformMembership) => {
134
134
  return {
@@ -141,10 +141,70 @@ const sheet: XlsxTransformerSheet<PlatformMembership> = {
141
141
  };
142
142
  },
143
143
  },
144
+ // balance item
145
+ {
146
+ id: 'balanceItem.createdAt',
147
+ name: $t(`%1OM`),
148
+ width: 20,
149
+ getValue: (membership: PlatformMembership) => ({
150
+ value: membership.balanceItem?.createdAt ?? null,
151
+ style: {
152
+ numberFormat: {
153
+ id: XlsxBuiltInNumberFormat.DateSlash,
154
+ },
155
+ },
156
+ }),
157
+ },
158
+ {
159
+ id: 'balanceItem.priceOpen',
160
+ name: $t('%1Ni'),
161
+ width: 10,
162
+ getValue: (membership: PlatformMembership) => {
163
+ return {
164
+ value: membership.balanceItem?.priceOpen ? ((membership.balanceItem?.priceOpen ?? 0) / 1_0000) : null,
165
+ style: {
166
+ numberFormat: {
167
+ id: XlsxBuiltInNumberFormat.Currency2DecimalWithRed,
168
+ },
169
+ },
170
+ };
171
+ },
172
+ },
173
+ {
174
+ id: 'balanceItem.pricePaid',
175
+ name: $t('%1OD'),
176
+ width: 10,
177
+ getValue: (membership: PlatformMembership) => {
178
+ return {
179
+ value: membership.balanceItem?.pricePaid ? ((membership.balanceItem?.pricePaid ?? 0) / 1_0000) : null,
180
+ style: {
181
+ numberFormat: {
182
+ id: XlsxBuiltInNumberFormat.Currency2DecimalWithRed,
183
+ },
184
+ },
185
+ };
186
+ },
187
+ },
188
+ {
189
+ id: 'balanceItem.pricePending',
190
+ name: $t('%1OL'),
191
+ width: 10,
192
+ getValue: (membership: PlatformMembership) => {
193
+ return {
194
+ value: membership.balanceItem?.pricePending ? ((membership.balanceItem?.pricePending ?? 0) / 1_0000) : null,
195
+ style: {
196
+ numberFormat: {
197
+ id: XlsxBuiltInNumberFormat.Currency2DecimalWithRed,
198
+ },
199
+ },
200
+ };
201
+ },
202
+ },
203
+
144
204
  // member
145
205
  {
146
206
  id: 'member.memberNumber',
147
- name: $t(`Lidnummer`),
207
+ name: $t(`%19j`),
148
208
  width: 20,
149
209
  getValue: (membership: PlatformMembership) => ({
150
210
  value: membership.member.memberNumber,
@@ -152,7 +212,7 @@ const sheet: XlsxTransformerSheet<PlatformMembership> = {
152
212
  },
153
213
  {
154
214
  id: 'member.firstName',
155
- name: $t(`Voornaam lid`),
215
+ name: $t(`%1O8`),
156
216
  width: 20,
157
217
  getValue:(membership: PlatformMembership) => ({
158
218
  value: membership.member.firstName,
@@ -160,7 +220,7 @@ const sheet: XlsxTransformerSheet<PlatformMembership> = {
160
220
  },
161
221
  {
162
222
  id: 'member.lastName',
163
- name: $t(`Achternaam lid`),
223
+ name: $t(`%1Or`),
164
224
  width: 20,
165
225
  getValue:(membership: PlatformMembership) => ({
166
226
  value: membership.member.lastName,
@@ -169,7 +229,7 @@ const sheet: XlsxTransformerSheet<PlatformMembership> = {
169
229
  // organization
170
230
  {
171
231
  id: 'organization.name',
172
- name: $t(`Naam vereniging`),
232
+ name: $t(`%1PW`),
173
233
  width: 20,
174
234
  getValue:(membership: PlatformMembership) => ({
175
235
  value: membership.organization.name,
@@ -177,7 +237,7 @@ const sheet: XlsxTransformerSheet<PlatformMembership> = {
177
237
  },
178
238
  {
179
239
  id: 'organization.uri',
180
- name: $t(`Nummer vereniging`),
240
+ name: $t(`%1PZ`),
181
241
  width: 20,
182
242
  getValue:(membership: PlatformMembership) => ({
183
243
  value: membership.organization.uri,
@@ -146,7 +146,7 @@ function getBalanceItemColumns(): XlsxTransformerColumn<ReceivableBalanceWithIte
146
146
  },
147
147
  {
148
148
  id: 'pricePending',
149
- name: $t(`%wc`),
149
+ name: $t(`%1PL`),
150
150
  width: 20,
151
151
  getValue: (object: ReceivableBalanceWithItem) => ({
152
152
  value: object.balanceItem.pricePending / 1_0000,
@@ -252,7 +252,7 @@ function getGeneralColumns(): XlsxTransformerConcreteColumn<ReceivableBalance>[]
252
252
  },
253
253
  {
254
254
  id: 'uri',
255
- name: $t(`%7C`),
255
+ name: $t(`%1O1`),
256
256
  width: 16,
257
257
  getValue: (object: ReceivableBalance) => ({
258
258
  value: object.object.uri,
@@ -273,7 +273,7 @@ function getGeneralColumns(): XlsxTransformerConcreteColumn<ReceivableBalance>[]
273
273
  },
274
274
  {
275
275
  id: 'amountPending',
276
- name: $t(`%wc`),
276
+ name: $t(`%1PL`),
277
277
  width: 18,
278
278
  getValue: (object: ReceivableBalance) => ({
279
279
  value: object.amountPending / 1_0000,
@@ -95,7 +95,7 @@ const sheet: XlsxTransformerSheet<PlatformMember, PlatformRegistration> = {
95
95
  },
96
96
  {
97
97
  id: 'startDate',
98
- name: $t(`%7e`),
98
+ name: $t(`%1Of`),
99
99
  width: 20,
100
100
  getValue: (registration: PlatformRegistration) => ({
101
101
  value: registration.startDate,
@@ -108,7 +108,7 @@ const sheet: XlsxTransformerSheet<PlatformMember, PlatformRegistration> = {
108
108
  },
109
109
  {
110
110
  id: 'endDate',
111
- name: $t(`%wB`),
111
+ name: $t(`%1P8`),
112
112
  width: 20,
113
113
  getValue: (registration: PlatformRegistration) => ({
114
114
  value: registration.endDate,
@@ -134,7 +134,7 @@ const sheet: XlsxTransformerSheet<PlatformMember, PlatformRegistration> = {
134
134
  },
135
135
  {
136
136
  id: 'organization',
137
- name: $t('%5E'),
137
+ name: $t('%1PI'),
138
138
  width: 40,
139
139
  getValue: (registration: PlatformRegistration) => {
140
140
  const organization = registration.member.family.getOrganization(registration.group.organizationId);
@@ -145,7 +145,7 @@ const sheet: XlsxTransformerSheet<PlatformMember, PlatformRegistration> = {
145
145
  },
146
146
  {
147
147
  id: 'uri',
148
- name: $t('%7C'),
148
+ name: $t('%1O1'),
149
149
  width: 40,
150
150
  getValue: (registration: PlatformRegistration) => {
151
151
  const organization = registration.member.family.getOrganization(registration.group.organizationId);
@@ -307,7 +307,7 @@ const sheet: XlsxTransformerSheet<PlatformMember, PlatformRegistration> = {
307
307
  },
308
308
  {
309
309
  id: 'uri',
310
- name: $t(`%7C`),
310
+ name: $t(`%1O1`),
311
311
  width: 30,
312
312
  getValue: (registration: PlatformRegistration) => {
313
313
  return {
@@ -18,7 +18,7 @@ export function createOrderDataHTMLTable(order: Order, webshop: Webshop): string
18
18
  }
19
19
 
20
20
  if (order.data.checkoutMethod?.type === CheckoutMethodType.OnSite) {
21
- return $t(`%TW`);
21
+ return $t(`%8a`);
22
22
  }
23
23
 
24
24
  return $t(`%Us`);
@@ -56,7 +56,7 @@ export function createOrderDataHTMLTable(order: Order, webshop: Webshop): string
56
56
  value: order.data.timeSlot?.timeRangeString() ?? '',
57
57
  },
58
58
  {
59
- title: $t(`%Gq`),
59
+ title: $t(`%1Os`),
60
60
  value: order.data.customer.name,
61
61
  },
62
62
  ...(order.data.customer.phone
@@ -46,6 +46,11 @@ export const platformMembershipFilterCompilers: SQLFilterDefinitions = {
46
46
  type: SQLValueType.Number,
47
47
  nullable: false,
48
48
  }),
49
+ price: createColumnFilter({
50
+ expression: SQL.column(MemberPlatformMembership.table, 'price'),
51
+ type: SQLValueType.Number,
52
+ nullable: false,
53
+ }),
49
54
  organization: createExistsFilter(
50
55
  SQL.select()
51
56
  .from(SQL.table('organizations'))