@stamhoofd/backend 2.39.1 → 2.40.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.
Files changed (198) hide show
  1. package/eslint.config.mjs +5 -0
  2. package/index.ts +81 -74
  3. package/jest.config.cjs +10 -0
  4. package/migrations.ts +16 -14
  5. package/package.json +11 -11
  6. package/src/crons/clear-excel-cache.test.ts +48 -50
  7. package/src/crons/clear-excel-cache.ts +18 -18
  8. package/src/crons/setup-steps.ts +2 -2
  9. package/src/crons.ts +325 -306
  10. package/src/decoders/StringArrayDecoder.ts +7 -7
  11. package/src/decoders/StringNullableDecoder.ts +1 -2
  12. package/src/email-recipient-loaders/members.ts +22 -22
  13. package/src/endpoints/admin/memberships/ChargeMembershipsEndpoint.ts +8 -9
  14. package/src/endpoints/admin/memberships/GetChargeMembershipsSummaryEndpoint.ts +39 -40
  15. package/src/endpoints/admin/organizations/GetOrganizationsCountEndpoint.ts +8 -8
  16. package/src/endpoints/admin/organizations/GetOrganizationsEndpoint.ts +44 -45
  17. package/src/endpoints/admin/organizations/PatchOrganizationsEndpoint.ts +58 -57
  18. package/src/endpoints/auth/CreateAdminEndpoint.ts +48 -45
  19. package/src/endpoints/auth/CreateTokenEndpoint.test.ts +31 -31
  20. package/src/endpoints/auth/CreateTokenEndpoint.ts +146 -147
  21. package/src/endpoints/auth/DeleteTokenEndpoint.ts +7 -7
  22. package/src/endpoints/auth/DeleteUserEndpoint.ts +15 -15
  23. package/src/endpoints/auth/ForgotPasswordEndpoint.ts +17 -18
  24. package/src/endpoints/auth/GetOtherUserEndpoint.ts +9 -10
  25. package/src/endpoints/auth/GetUserEndpoint.test.ts +32 -35
  26. package/src/endpoints/auth/GetUserEndpoint.ts +5 -6
  27. package/src/endpoints/auth/PatchApiUserEndpoint.ts +35 -33
  28. package/src/endpoints/auth/PatchUserEndpoint.ts +55 -52
  29. package/src/endpoints/auth/PollEmailVerificationEndpoint.ts +9 -9
  30. package/src/endpoints/auth/RetryEmailVerificationEndpoint.ts +8 -8
  31. package/src/endpoints/auth/SignupEndpoint.ts +37 -36
  32. package/src/endpoints/auth/VerifyEmailEndpoint.ts +29 -28
  33. package/src/endpoints/global/addresses/SearchRegionsEndpoint.ts +33 -33
  34. package/src/endpoints/global/addresses/ValidateAddressEndpoint.ts +7 -7
  35. package/src/endpoints/global/caddy/CheckDomainCertEndpoint.ts +37 -37
  36. package/src/endpoints/global/email/CreateEmailEndpoint.ts +30 -30
  37. package/src/endpoints/global/email/GetEmailAddressEndpoint.ts +13 -13
  38. package/src/endpoints/global/email/GetEmailEndpoint.ts +13 -13
  39. package/src/endpoints/global/email/ManageEmailAddressEndpoint.ts +16 -16
  40. package/src/endpoints/global/email/PatchEmailEndpoint.ts +25 -25
  41. package/src/endpoints/global/events/GetEventsEndpoint.ts +43 -44
  42. package/src/endpoints/global/events/PatchEventsEndpoint.ts +127 -172
  43. package/src/endpoints/global/files/ExportToExcelEndpoint.ts +49 -50
  44. package/src/endpoints/global/files/GetFileCache.ts +13 -13
  45. package/src/endpoints/global/files/UploadFile.ts +51 -54
  46. package/src/endpoints/global/files/UploadImage.ts +53 -53
  47. package/src/endpoints/global/groups/GetGroupsEndpoint.ts +25 -25
  48. package/src/endpoints/global/members/GetMemberFamilyEndpoint.ts +24 -23
  49. package/src/endpoints/global/members/GetMembersCountEndpoint.ts +8 -8
  50. package/src/endpoints/global/members/GetMembersEndpoint.ts +105 -102
  51. package/src/endpoints/global/members/PatchOrganizationMembersEndpoint.ts +240 -239
  52. package/src/endpoints/global/organizations/CheckRegisterCodeEndpoint.ts +12 -14
  53. package/src/endpoints/global/organizations/CreateOrganizationEndpoint.test.ts +32 -33
  54. package/src/endpoints/global/organizations/CreateOrganizationEndpoint.ts +48 -57
  55. package/src/endpoints/global/organizations/GetOrganizationFromDomainEndpoint.test.ts +21 -22
  56. package/src/endpoints/global/organizations/GetOrganizationFromDomainEndpoint.ts +28 -28
  57. package/src/endpoints/global/organizations/GetOrganizationFromUriEndpoint.ts +18 -18
  58. package/src/endpoints/global/organizations/SearchOrganizationEndpoint.test.ts +20 -20
  59. package/src/endpoints/global/organizations/SearchOrganizationEndpoint.ts +17 -17
  60. package/src/endpoints/global/payments/StripeWebhookEndpoint.ts +81 -75
  61. package/src/endpoints/global/platform/GetPlatformAdminsEndpoint.ts +14 -14
  62. package/src/endpoints/global/platform/GetPlatformEnpoint.ts +11 -11
  63. package/src/endpoints/global/platform/PatchPlatformEnpoint.ts +71 -68
  64. package/src/endpoints/global/registration/GetPaymentRegistrations.ts +27 -27
  65. package/src/endpoints/global/registration/GetUserBillingStatusEndpoint.ts +30 -30
  66. package/src/endpoints/global/registration/GetUserDetailedBillingStatusEndpoint.ts +34 -34
  67. package/src/endpoints/global/registration/GetUserDocumentsEndpoint.ts +26 -26
  68. package/src/endpoints/global/registration/GetUserMembersEndpoint.ts +12 -12
  69. package/src/endpoints/global/registration/PatchUserMembersEndpoint.ts +90 -90
  70. package/src/endpoints/global/registration/RegisterMembersEndpoint.test.ts +118 -121
  71. package/src/endpoints/global/registration/RegisterMembersEndpoint.ts +362 -350
  72. package/src/endpoints/global/registration-periods/GetRegistrationPeriodsEndpoint.ts +8 -9
  73. package/src/endpoints/global/registration-periods/PatchRegistrationPeriodsEndpoint.ts +21 -21
  74. package/src/endpoints/global/webshops/GetWebshopFromDomainEndpoint.ts +65 -65
  75. package/src/endpoints/organization/dashboard/billing/GetOrganizationBillingStatusEndpoint.ts +9 -9
  76. package/src/endpoints/organization/dashboard/billing/GetOrganizationDetailedBillingStatusEndpoint.ts +14 -14
  77. package/src/endpoints/organization/dashboard/documents/GetDocumentTemplateXML.ts +17 -17
  78. package/src/endpoints/organization/dashboard/documents/GetDocumentTemplatesEndpoint.ts +21 -21
  79. package/src/endpoints/organization/dashboard/documents/GetDocumentsEndpoint.ts +15 -15
  80. package/src/endpoints/organization/dashboard/documents/PatchDocumentEndpoint.ts +52 -52
  81. package/src/endpoints/organization/dashboard/documents/PatchDocumentTemplateEndpoint.ts +37 -37
  82. package/src/endpoints/organization/dashboard/email/CheckEmailBouncesEndpoint.ts +14 -14
  83. package/src/endpoints/organization/dashboard/email/EmailEndpoint.ts +113 -112
  84. package/src/endpoints/organization/dashboard/email-templates/GetEmailTemplatesEndpoint.ts +29 -29
  85. package/src/endpoints/organization/dashboard/email-templates/PatchEmailTemplatesEndpoint.ts +48 -47
  86. package/src/endpoints/organization/dashboard/mollie/CheckMollieEndpoint.ts +22 -21
  87. package/src/endpoints/organization/dashboard/mollie/ConnectMollieEndpoint.ts +13 -14
  88. package/src/endpoints/organization/dashboard/mollie/DisconnectMollieEndpoint.ts +12 -13
  89. package/src/endpoints/organization/dashboard/mollie/GetMollieDashboardEndpoint.ts +24 -24
  90. package/src/endpoints/organization/dashboard/nolt/CreateNoltTokenEndpoint.ts +10 -12
  91. package/src/endpoints/organization/dashboard/organization/GetOrganizationArchivedGroups.ts +14 -14
  92. package/src/endpoints/organization/dashboard/organization/GetOrganizationDeletedGroups.ts +13 -13
  93. package/src/endpoints/organization/dashboard/organization/GetOrganizationSSOEndpoint.ts +12 -12
  94. package/src/endpoints/organization/dashboard/organization/PatchOrganizationEndpoint.test.ts +120 -124
  95. package/src/endpoints/organization/dashboard/organization/PatchOrganizationEndpoint.ts +172 -173
  96. package/src/endpoints/organization/dashboard/organization/SetOrganizationDomainEndpoint.ts +88 -89
  97. package/src/endpoints/organization/dashboard/organization/SetOrganizationSSOEndpoint.ts +12 -12
  98. package/src/endpoints/organization/dashboard/payments/GetMemberBalanceEndpoint.ts +17 -17
  99. package/src/endpoints/organization/dashboard/payments/GetPaymentsCountEndpoint.ts +8 -8
  100. package/src/endpoints/organization/dashboard/payments/GetPaymentsEndpoint.ts +66 -67
  101. package/src/endpoints/organization/dashboard/payments/PatchBalanceItemsEndpoint.ts +47 -47
  102. package/src/endpoints/organization/dashboard/payments/PatchPaymentsEndpoint.ts +93 -91
  103. package/src/endpoints/organization/dashboard/registration-periods/GetOrganizationRegistrationPeriodsEndpoint.ts +16 -17
  104. package/src/endpoints/organization/dashboard/registration-periods/PatchOrganizationRegistrationPeriodsEndpoint.ts +170 -167
  105. package/src/endpoints/organization/dashboard/registration-periods/SetupStepReviewEndpoint.ts +25 -24
  106. package/src/endpoints/organization/dashboard/stripe/ConnectStripeEndpoint.ts +22 -23
  107. package/src/endpoints/organization/dashboard/stripe/DeleteStripeAccountEndpoint.ts +22 -22
  108. package/src/endpoints/organization/dashboard/stripe/GetStripeAccountLinkEndpoint.ts +17 -18
  109. package/src/endpoints/organization/dashboard/stripe/GetStripeAccountsEndpoint.ts +8 -9
  110. package/src/endpoints/organization/dashboard/stripe/GetStripeLoginLinkEndpoint.ts +17 -18
  111. package/src/endpoints/organization/dashboard/stripe/UpdateStripeAccountEndpoint.ts +14 -15
  112. package/src/endpoints/organization/dashboard/users/CreateApiUserEndpoint.ts +19 -19
  113. package/src/endpoints/organization/dashboard/users/DeleteUserEndpoint.ts +19 -19
  114. package/src/endpoints/organization/dashboard/users/GetApiUsersEndpoint.ts +14 -14
  115. package/src/endpoints/organization/dashboard/users/GetOrganizationAdminsEndpoint.ts +12 -12
  116. package/src/endpoints/organization/dashboard/webshops/CreateWebshopEndpoint.ts +103 -100
  117. package/src/endpoints/organization/dashboard/webshops/DeleteWebshopEndpoint.ts +11 -12
  118. package/src/endpoints/organization/dashboard/webshops/GetDiscountCodesEndpoint.ts +15 -15
  119. package/src/endpoints/organization/dashboard/webshops/GetWebshopOrdersEndpoint.ts +14 -14
  120. package/src/endpoints/organization/dashboard/webshops/GetWebshopTicketsEndpoint.ts +14 -14
  121. package/src/endpoints/organization/dashboard/webshops/GetWebshopUriAvailabilityEndpoint.ts +23 -23
  122. package/src/endpoints/organization/dashboard/webshops/PatchDiscountCodesEndpoint.ts +54 -52
  123. package/src/endpoints/organization/dashboard/webshops/PatchWebshopEndpoint.ts +84 -81
  124. package/src/endpoints/organization/dashboard/webshops/PatchWebshopOrdersEndpoint.ts +120 -111
  125. package/src/endpoints/organization/dashboard/webshops/PatchWebshopTicketsEndpoint.ts +24 -24
  126. package/src/endpoints/organization/dashboard/webshops/VerifyWebshopDomainEndpoint.ts +18 -18
  127. package/src/endpoints/organization/shared/ExchangePaymentEndpoint.ts +141 -130
  128. package/src/endpoints/organization/shared/GetDocumentHtml.ts +25 -25
  129. package/src/endpoints/organization/shared/GetPaymentEndpoint.ts +18 -18
  130. package/src/endpoints/organization/shared/auth/GetOrganizationEndpoint.test.ts +36 -37
  131. package/src/endpoints/organization/shared/auth/GetOrganizationEndpoint.ts +9 -9
  132. package/src/endpoints/organization/shared/auth/OpenIDConnectCallbackEndpoint.ts +11 -11
  133. package/src/endpoints/organization/shared/auth/OpenIDConnectStartEndpoint.ts +28 -27
  134. package/src/endpoints/organization/webshops/CheckWebshopDiscountCodesEndpoint.ts +20 -20
  135. package/src/endpoints/organization/webshops/GetOrderByPaymentEndpoint.ts +22 -22
  136. package/src/endpoints/organization/webshops/GetOrderEndpoint.ts +14 -14
  137. package/src/endpoints/organization/webshops/GetTicketsEndpoint.ts +57 -56
  138. package/src/endpoints/organization/webshops/GetWebshopEndpoint.test.ts +65 -66
  139. package/src/endpoints/organization/webshops/GetWebshopEndpoint.ts +18 -17
  140. package/src/endpoints/organization/webshops/PlaceOrderEndpoint.test.ts +124 -128
  141. package/src/endpoints/organization/webshops/PlaceOrderEndpoint.ts +154 -145
  142. package/src/excel-loaders/members.ts +275 -273
  143. package/src/excel-loaders/payments.ts +155 -156
  144. package/src/helpers/AddressValidator.test.ts +32 -32
  145. package/src/helpers/AddressValidator.ts +128 -122
  146. package/src/helpers/AdminPermissionChecker.ts +339 -236
  147. package/src/helpers/AuthenticatedStructures.ts +233 -134
  148. package/src/helpers/BuckarooHelper.ts +134 -134
  149. package/src/helpers/CheckSettlements.ts +94 -88
  150. package/src/helpers/Context.ts +87 -86
  151. package/src/helpers/CookieHelper.ts +23 -22
  152. package/src/helpers/EmailResumer.ts +10 -10
  153. package/src/helpers/FileCache.ts +62 -62
  154. package/src/helpers/ForwardHandler.test.ts +122 -124
  155. package/src/helpers/ForwardHandler.ts +76 -70
  156. package/src/helpers/MemberUserSyncer.ts +101 -96
  157. package/src/helpers/MembershipCharger.ts +69 -69
  158. package/src/helpers/MembershipHelper.ts +11 -12
  159. package/src/helpers/OpenIDConnectHelper.ts +85 -82
  160. package/src/helpers/PeriodHelper.ts +65 -70
  161. package/src/helpers/StripeHelper.ts +146 -137
  162. package/src/helpers/StripePayoutChecker.ts +51 -52
  163. package/src/helpers/ViesHelper.ts +46 -44
  164. package/src/helpers/fetchToAsyncIterator.ts +14 -14
  165. package/src/helpers/xlsxAddressTransformerColumnFactory.ts +58 -60
  166. package/src/middleware/ContextMiddleware.ts +5 -5
  167. package/src/migrations/1646578856-validate-addresses.ts +6 -9
  168. package/src/seeds/0000000000-example.ts +3 -5
  169. package/src/seeds/1715028563-user-permissions.ts +16 -18
  170. package/src/seeds/1722256498-group-update-occupancy.ts +12 -12
  171. package/src/seeds/1722344162-sync-member-users.ts +14 -15
  172. package/src/seeds/1722344162-update-membership.ts +6 -6
  173. package/src/seeds/1726055544-balance-item-paid.ts +4 -4
  174. package/src/seeds/1726055545-balance-item-pending.ts +4 -4
  175. package/src/seeds/1726494419-update-cached-outstanding-balance.ts +16 -16
  176. package/src/seeds/1726494420-update-cached-outstanding-balance-from-items.ts +12 -12
  177. package/src/seeds/1726572303-schedule-stock-updates.ts +12 -12
  178. package/src/seeds/1726847064-setup-steps.ts +16 -0
  179. package/src/sql-filters/balance-item-payments.ts +7 -7
  180. package/src/sql-filters/events.ts +14 -14
  181. package/src/sql-filters/members.ts +96 -96
  182. package/src/sql-filters/organizations.ts +139 -75
  183. package/src/sql-filters/payments.ts +28 -28
  184. package/src/sql-filters/registrations.ts +14 -14
  185. package/src/sql-sorters/events.ts +25 -25
  186. package/src/sql-sorters/members.ts +26 -26
  187. package/src/sql-sorters/organizations.ts +36 -36
  188. package/src/sql-sorters/payments.ts +26 -26
  189. package/tests/e2e/stock.test.ts +616 -621
  190. package/tests/e2e/tickets.test.ts +255 -260
  191. package/tests/helpers/StripeMocker.ts +177 -179
  192. package/tests/helpers/TestServer.ts +9 -9
  193. package/tests/jest.global.setup.ts +14 -13
  194. package/tests/jest.setup.ts +33 -32
  195. package/.eslintrc.js +0 -61
  196. package/jest.config.js +0 -11
  197. package/src/helpers/SetupStepsUpdater.ts +0 -359
  198. package/src/seeds/1724076679-setup-steps.ts +0 -16
@@ -1,9 +1,9 @@
1
1
  import { AutoEncoderPatchType, Decoder, PatchableArrayAutoEncoder, PatchableArrayDecoder, StringDecoder } from '@simonbackx/simple-encoding';
2
- import { DecodedRequest, Endpoint, Request, Response } from "@simonbackx/simple-endpoints";
3
- import { SimpleError } from "@simonbackx/simple-errors";
2
+ import { DecodedRequest, Endpoint, Request, Response } from '@simonbackx/simple-endpoints';
3
+ import { SimpleError } from '@simonbackx/simple-errors';
4
4
  import { BalanceItem, BalanceItemPayment, Payment, Token } from '@stamhoofd/models';
5
5
  import { QueueHandler } from '@stamhoofd/queues';
6
- import { Payment as PaymentStruct, PaymentGeneral, PaymentMethod, PaymentStatus, PermissionLevel } from "@stamhoofd/structures";
6
+ import { Payment as PaymentStruct, PaymentGeneral, PaymentMethod, PaymentStatus, PermissionLevel } from '@stamhoofd/structures';
7
7
 
8
8
  import { AuthenticatedStructures } from '../../../../helpers/AuthenticatedStructures';
9
9
  import { Context } from '../../../../helpers/Context';
@@ -11,22 +11,22 @@ import { ExchangePaymentEndpoint } from '../../shared/ExchangePaymentEndpoint';
11
11
 
12
12
  type Params = Record<string, never>;
13
13
  type Query = undefined;
14
- type Body = PatchableArrayAutoEncoder<PaymentGeneral>
15
- type ResponseBody = PaymentGeneral[]
14
+ type Body = PatchableArrayAutoEncoder<PaymentGeneral>;
15
+ type ResponseBody = PaymentGeneral[];
16
16
 
17
17
  /**
18
18
  * One endpoint to create, patch and delete groups. Usefull because on organization setup, we need to create multiple groups at once. Also, sometimes we need to link values and update multiple groups at once
19
19
  */
20
20
 
21
21
  export class PatchPaymentsEndpoint extends Endpoint<Params, Query, Body, ResponseBody> {
22
- bodyDecoder = new PatchableArrayDecoder(PaymentGeneral as Decoder<PaymentGeneral>, PaymentStruct.patchType() as Decoder<AutoEncoderPatchType<PaymentGeneral>>, StringDecoder)
22
+ bodyDecoder = new PatchableArrayDecoder(PaymentGeneral as Decoder<PaymentGeneral>, PaymentStruct.patchType() as Decoder<AutoEncoderPatchType<PaymentGeneral>>, StringDecoder);
23
23
 
24
24
  protected doesMatch(request: Request): [true, Params] | [false] {
25
- if (request.method != "PATCH") {
25
+ if (request.method !== 'PATCH') {
26
26
  return [false];
27
27
  }
28
28
 
29
- const params = Endpoint.parseParameters(request.url, "/organization/payments", {});
29
+ const params = Endpoint.parseParameters(request.url, '/organization/payments', {});
30
30
 
31
31
  if (params) {
32
32
  return [true, params as Params];
@@ -36,201 +36,203 @@ export class PatchPaymentsEndpoint extends Endpoint<Params, Query, Body, Respons
36
36
 
37
37
  async handle(request: DecodedRequest<Params, Query, Body>) {
38
38
  const organization = await Context.setOrganizationScope();
39
- await Context.authenticate()
39
+ await Context.authenticate();
40
40
 
41
41
  if (!await Context.auth.hasSomeAccess(organization.id)) {
42
- throw Context.auth.error()
42
+ throw Context.auth.error();
43
43
  }
44
44
 
45
- const changedPayments: Payment[] = []
45
+ const changedPayments: Payment[] = [];
46
46
 
47
47
  // Modify payments
48
- for (const {put} of request.body.getPuts()) {
48
+ for (const { put } of request.body.getPuts()) {
49
49
  // Create a new payment
50
50
  if (put.balanceItemPayments.length == 0) {
51
51
  throw new SimpleError({
52
- code: "invalid_field",
53
- message: "You need to add at least one balance item payment",
54
- human: "Een betaling moet ten minste één afrekening bevatten voor een openstaande rekening.",
55
- field: "balanceItemPayments"
56
- })
52
+ code: 'invalid_field',
53
+ message: 'You need to add at least one balance item payment',
54
+ human: 'Een betaling moet ten minste één afrekening bevatten voor een openstaande rekening.',
55
+ field: 'balanceItemPayments',
56
+ });
57
57
  }
58
58
 
59
59
  if (![PaymentMethod.Unknown, PaymentMethod.Transfer, PaymentMethod.PointOfSale].includes(put.method)) {
60
60
  throw new SimpleError({
61
- code: "invalid_field",
62
- message: "Invalid payment method",
63
- human: "Je kan zelf geen online betalingen aanmaken",
64
- field: "method"
65
- })
61
+ code: 'invalid_field',
62
+ message: 'Invalid payment method',
63
+ human: 'Je kan zelf geen online betalingen aanmaken',
64
+ field: 'method',
65
+ });
66
66
  }
67
67
 
68
- const payment = new Payment()
69
- payment.organizationId = organization.id
70
- payment.status = PaymentStatus.Created
71
- payment.method = put.method
72
- payment.customer = put.customer
68
+ const payment = new Payment();
69
+ payment.organizationId = organization.id;
70
+ payment.status = PaymentStatus.Created;
71
+ payment.method = put.method;
72
+ payment.customer = put.customer;
73
73
 
74
74
  if (payment.method == PaymentMethod.Transfer) {
75
75
  if (!put.transferSettings) {
76
76
  throw new SimpleError({
77
- code: "invalid_field",
78
- message: "Transfer settings are required",
79
- human: "Je moet de overschrijvingsdetails invullen",
80
- field: "transferSettings"
81
- })
77
+ code: 'invalid_field',
78
+ message: 'Transfer settings are required',
79
+ human: 'Je moet de overschrijvingsdetails invullen',
80
+ field: 'transferSettings',
81
+ });
82
82
  }
83
83
 
84
- payment.transferSettings = put.transferSettings
84
+ payment.transferSettings = put.transferSettings;
85
85
 
86
86
  if (!put.transferDescription) {
87
87
  throw new SimpleError({
88
- code: "invalid_field",
89
- message: "Transfer description is required",
90
- human: "Je moet een mededeling invullen voor de overschrijving",
91
- field: "transferDescription"
92
- })
88
+ code: 'invalid_field',
89
+ message: 'Transfer description is required',
90
+ human: 'Je moet een mededeling invullen voor de overschrijving',
91
+ field: 'transferDescription',
92
+ });
93
93
  }
94
94
 
95
- payment.transferDescription = put.transferDescription
95
+ payment.transferDescription = put.transferDescription;
96
96
  }
97
97
 
98
- const balanceItems: BalanceItem[] = []
98
+ const balanceItems: BalanceItem[] = [];
99
99
  const balanceItemPayments: BalanceItemPayment[] = [];
100
100
 
101
101
  for (const item of put.balanceItemPayments) {
102
- const balanceItem = await BalanceItem.getByID(item.balanceItem.id)
102
+ const balanceItem = await BalanceItem.getByID(item.balanceItem.id);
103
103
  if (!balanceItem || balanceItem.organizationId !== organization.id) {
104
- throw Context.auth.notFoundOrNoAccess("Eén van de afrekeningen die je wilde markeren als betaald bestaat niet (meer).")
104
+ throw Context.auth.notFoundOrNoAccess('Eén van de afrekeningen die je wilde markeren als betaald bestaat niet (meer).');
105
105
  }
106
- balanceItems.push(balanceItem)
106
+ balanceItems.push(balanceItem);
107
107
 
108
108
  // Create payment
109
- const balanceItemPayment = new BalanceItemPayment()
110
- balanceItemPayment.organizationId = organization.id
111
- balanceItemPayment.balanceItemId = balanceItem.id
112
- balanceItemPayment.price = item.price
113
- balanceItemPayments.push(balanceItemPayment)
109
+ const balanceItemPayment = new BalanceItemPayment();
110
+ balanceItemPayment.organizationId = organization.id;
111
+ balanceItemPayment.balanceItemId = balanceItem.id;
112
+ balanceItemPayment.price = item.price;
113
+ balanceItemPayments.push(balanceItemPayment);
114
114
  }
115
115
 
116
116
  // Check permissions
117
117
  if (!(await Context.auth.canAccessBalanceItems(balanceItems, PermissionLevel.Write))) {
118
- throw Context.auth.error('Je hebt geen toegangsrechten tot één van de gekozen afrekeningen voor de betaling die je wilt aanmaken')
118
+ throw Context.auth.error('Je hebt geen toegangsrechten tot één van de gekozen afrekeningen voor de betaling die je wilt aanmaken');
119
119
  }
120
120
 
121
121
  // Check total price
122
- const totalPrice = balanceItemPayments.reduce((total, item) => total + item.price, 0)
122
+ const totalPrice = balanceItemPayments.reduce((total, item) => total + item.price, 0);
123
123
 
124
124
  if (totalPrice !== put.price) {
125
125
  throw new SimpleError({
126
- code: "invalid_field",
126
+ code: 'invalid_field',
127
127
  message: "Total price doesn't match",
128
- human: "De totale prijs komt niet overeen met de som van de afrekeningen",
129
- field: "price"
130
- })
128
+ human: 'De totale prijs komt niet overeen met de som van de afrekeningen',
129
+ field: 'price',
130
+ });
131
131
  }
132
132
 
133
- payment.price = totalPrice
133
+ payment.price = totalPrice;
134
134
 
135
135
  // Save payment
136
136
  await payment.save();
137
137
 
138
138
  // Save balance item payments
139
139
  for (const balanceItemPayment of balanceItemPayments) {
140
- balanceItemPayment.paymentId = payment.id
141
- await balanceItemPayment.save()
140
+ balanceItemPayment.paymentId = payment.id;
141
+ await balanceItemPayment.save();
142
142
  }
143
143
 
144
144
  // Mark paid or failed
145
145
  if (put.status !== PaymentStatus.Created && put.status !== PaymentStatus.Pending) {
146
- await ExchangePaymentEndpoint.handlePaymentStatusUpdate(payment, organization, put.status)
146
+ await ExchangePaymentEndpoint.handlePaymentStatusUpdate(payment, organization, put.status);
147
147
 
148
148
  if (put.status === PaymentStatus.Succeeded) {
149
- payment.paidAt = put.paidAt
150
- await payment.save()
149
+ payment.paidAt = put.paidAt;
150
+ await payment.save();
151
151
  }
152
- } else {
152
+ }
153
+ else {
153
154
  for (const balanceItem of balanceItems) {
154
- await balanceItem.markUpdated(payment, organization)
155
+ await balanceItem.markUpdated(payment, organization);
155
156
  }
156
157
 
157
- await BalanceItem.updateOutstanding(balanceItems)
158
+ await BalanceItem.updateOutstanding(balanceItems);
158
159
  }
159
160
 
160
- changedPayments.push(payment)
161
+ changedPayments.push(payment);
161
162
  }
162
163
 
163
164
  // Modify payments
164
165
  for (const patch of request.body.getPatches()) {
165
- await QueueHandler.schedule("payments/"+patch.id, async () => {
166
+ await QueueHandler.schedule('payments/' + patch.id, async () => {
166
167
  const payment = await Payment.getByID(patch.id);
167
168
  if (!payment || !(await Context.auth.canAccessPayment(payment, PermissionLevel.Write))) {
168
169
  throw new SimpleError({
169
- code: "not_found",
170
- message: "Payment not found",
171
- human: "Deze betaling werd niet gevonden."
172
- })
170
+ code: 'not_found',
171
+ message: 'Payment not found',
172
+ human: 'Deze betaling werd niet gevonden.',
173
+ });
173
174
  }
174
175
 
175
176
  if (patch.method || patch.paidAt !== undefined || patch.status !== undefined) {
176
177
  if (payment.method && ![PaymentMethod.Unknown, PaymentMethod.Transfer, PaymentMethod.PointOfSale].includes(payment.method)) {
177
178
  throw new SimpleError({
178
- code: "invalid_field",
179
- message: "Invalid payment method",
180
- human: "Je kan online betalingen niet wijzigen"
181
- })
179
+ code: 'invalid_field',
180
+ message: 'Invalid payment method',
181
+ human: 'Je kan online betalingen niet wijzigen',
182
+ });
182
183
  }
183
184
  }
184
185
 
185
186
  if (patch.transferSettings && payment.method == PaymentMethod.Transfer) {
186
187
  if (patch.transferSettings.isPut()) {
187
- payment.transferSettings = patch.transferSettings
188
- } else if (payment.transferSettings !== null) {
189
- payment.transferSettings = payment.transferSettings.patch(patch.transferSettings)
188
+ payment.transferSettings = patch.transferSettings;
189
+ }
190
+ else if (payment.transferSettings !== null) {
191
+ payment.transferSettings = payment.transferSettings.patch(patch.transferSettings);
190
192
  }
191
193
  }
192
194
 
193
195
  if (patch.method) {
194
196
  if (![PaymentMethod.Unknown, PaymentMethod.Transfer, PaymentMethod.PointOfSale].includes(patch.method)) {
195
197
  throw new SimpleError({
196
- code: "invalid_field",
197
- message: "Invalid payment method",
198
- human: "De betaalmethode die je wilt gebruiken is niet toegestaan",
199
- field: "method"
200
- })
198
+ code: 'invalid_field',
199
+ message: 'Invalid payment method',
200
+ human: 'De betaalmethode die je wilt gebruiken is niet toegestaan',
201
+ field: 'method',
202
+ });
201
203
  }
202
- payment.method = patch.method
204
+ payment.method = patch.method;
203
205
 
204
206
  if (payment.method === PaymentMethod.Transfer && patch.transferDescription === undefined && !payment.transferDescription) {
205
- payment.transferSettings = payment.transferSettings ?? organization.meta.transferSettings
207
+ payment.transferSettings = payment.transferSettings ?? organization.meta.transferSettings;
206
208
  // TODO: fill in description!
207
- payment.generateDescription(organization, "")
209
+ payment.generateDescription(organization, '');
208
210
  }
209
211
  }
210
212
 
211
213
  if (patch.transferDescription && payment.method == PaymentMethod.Transfer) {
212
- payment.transferDescription = patch.transferDescription
214
+ payment.transferDescription = patch.transferDescription;
213
215
  }
214
216
 
215
217
  if (patch.paidAt && payment.paidAt !== null) {
216
218
  // Only allow to set the date if it is already set
217
- payment.paidAt = patch.paidAt
219
+ payment.paidAt = patch.paidAt;
218
220
  }
219
221
 
220
- await payment.save()
222
+ await payment.save();
221
223
 
222
224
  if (patch.status) {
223
- await ExchangePaymentEndpoint.handlePaymentStatusUpdate(payment, organization, patch.status)
225
+ await ExchangePaymentEndpoint.handlePaymentStatusUpdate(payment, organization, patch.status);
224
226
  }
225
227
 
226
228
  changedPayments.push(
227
- payment
228
- )
229
+ payment,
230
+ );
229
231
  });
230
232
  }
231
233
 
232
234
  return new Response(
233
- await AuthenticatedStructures.paymentsGeneral(changedPayments, true)
235
+ await AuthenticatedStructures.paymentsGeneral(changedPayments, true),
234
236
  );
235
237
  }
236
238
  }
@@ -1,14 +1,14 @@
1
- import { DecodedRequest, Endpoint, Request, Response } from "@simonbackx/simple-endpoints";
2
- import { RegistrationPeriodList, OrganizationRegistrationPeriod as OrganizationRegistrationPeriodStruct } from "@stamhoofd/structures";
1
+ import { DecodedRequest, Endpoint, Request, Response } from '@simonbackx/simple-endpoints';
2
+ import { RegistrationPeriodList, OrganizationRegistrationPeriod as OrganizationRegistrationPeriodStruct } from '@stamhoofd/structures';
3
3
 
4
4
  import { Group, OrganizationRegistrationPeriod, RegistrationPeriod } from '@stamhoofd/models';
5
- import { Context } from "../../../../helpers/Context";
6
- import { Sorter } from "@stamhoofd/utility";
5
+ import { Context } from '../../../../helpers/Context';
6
+ import { Sorter } from '@stamhoofd/utility';
7
7
 
8
8
  type Params = Record<string, never>;
9
9
  type Query = undefined;
10
- type Body = undefined
11
- type ResponseBody = RegistrationPeriodList
10
+ type Body = undefined;
11
+ type ResponseBody = RegistrationPeriodList;
12
12
 
13
13
  /**
14
14
  * One endpoint to create, patch and delete members and their registrations and payments
@@ -16,11 +16,11 @@ type ResponseBody = RegistrationPeriodList
16
16
 
17
17
  export class PatchRegistrationPeriodsEndpoint extends Endpoint<Params, Query, Body, ResponseBody> {
18
18
  protected doesMatch(request: Request): [true, Params] | [false] {
19
- if (request.method != "GET") {
19
+ if (request.method !== 'GET') {
20
20
  return [false];
21
21
  }
22
22
 
23
- const params = Endpoint.parseParameters(request.url, "/organization/registration-periods", {});
23
+ const params = Endpoint.parseParameters(request.url, '/organization/registration-periods', {});
24
24
 
25
25
  if (params) {
26
26
  return [true, params as Params];
@@ -30,15 +30,15 @@ export class PatchRegistrationPeriodsEndpoint extends Endpoint<Params, Query, Bo
30
30
 
31
31
  async handle(request: DecodedRequest<Params, Query, Body>) {
32
32
  const organization = await Context.setOrganizationScope();
33
- await Context.authenticate()
33
+ await Context.authenticate();
34
34
 
35
35
  if (!await Context.auth.hasSomeAccess(organization.id)) {
36
- throw Context.auth.error()
37
- }
38
-
36
+ throw Context.auth.error();
37
+ }
38
+
39
39
  const organizationPeriods = await OrganizationRegistrationPeriod.where({ organizationId: organization.id });
40
40
  const periods = await RegistrationPeriod.all();
41
- const groups = await Group.getAll(organization.id, null)
41
+ const groups = await Group.getAll(organization.id, null);
42
42
 
43
43
  const structs: OrganizationRegistrationPeriodStruct[] = [];
44
44
 
@@ -53,14 +53,13 @@ export class PatchRegistrationPeriodsEndpoint extends Endpoint<Params, Query, Bo
53
53
  }
54
54
 
55
55
  // Sort
56
- periods.sort((a, b) => Sorter.byDateValue(a.startDate, b.startDate))
56
+ periods.sort((a, b) => Sorter.byDateValue(a.startDate, b.startDate));
57
57
 
58
58
  return new Response(
59
59
  RegistrationPeriodList.create({
60
60
  organizationPeriods: structs,
61
- periods: periods.map(p => p.getStructure())
62
- })
61
+ periods: periods.map(p => p.getStructure()),
62
+ }),
63
63
  );
64
64
  }
65
-
66
65
  }