@stamhoofd/backend 2.121.0 → 2.122.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 (429) hide show
  1. package/output-2.txt +1 -0
  2. package/output.txt +1 -0
  3. package/package.json +69 -52
  4. package/src/audit-logs/EventNotificationLogger.ts +40 -0
  5. package/src/audit-logs/ModelLogger.ts +19 -15
  6. package/src/audit-logs/OrganizationLogger.ts +1 -1
  7. package/src/audit-logs/RegistrationInvitationLogger.ts +24 -24
  8. package/src/audit-logs/init.ts +8 -2
  9. package/src/boot.ts +19 -18
  10. package/src/crons/amazon-ses.ts +13 -26
  11. package/src/crons/balance-emails.ts +3 -5
  12. package/src/crons/clearExcelCache.test.ts +1 -1
  13. package/src/crons/clearExcelCache.ts +1 -2
  14. package/src/crons/drip-emails.ts +42 -0
  15. package/src/crons/endFunctionsOfUsersWithoutRegistration.ts +4 -0
  16. package/src/crons/helpers/isOutside.ts +11 -0
  17. package/src/crons/helpers/useSavedIterator.ts +32 -0
  18. package/src/crons/index.ts +5 -0
  19. package/src/crons/invoices.ts +32 -38
  20. package/src/crons/members-fees.ts +50 -0
  21. package/src/crons/mollie-chargebacks.ts +14 -15
  22. package/src/crons/service-fees.ts +152 -0
  23. package/src/crons/stripe-invoices.ts +48 -0
  24. package/src/crons/transfer-fees.ts +176 -0
  25. package/src/crons/update-cached-balances.ts +4 -4
  26. package/src/crons.ts +7 -64
  27. package/src/debug.ts +4 -2
  28. package/src/email-recipient-loaders/documents.ts +1 -1
  29. package/src/email-recipient-loaders/members.ts +1 -1
  30. package/src/email-recipient-loaders/payments.ts +4 -6
  31. package/src/email-recipient-loaders/registrations.ts +1 -1
  32. package/src/email-replacements/getEmailReplacementsForPayment.ts +5 -9
  33. package/src/endpoints/admin/members/ChargeMembersEndpoint.ts +1 -1
  34. package/src/endpoints/admin/memberships/ChargeMembershipsEndpoint.ts +1 -1
  35. package/src/endpoints/admin/memberships/GetChargeMembershipsSummaryEndpoint.ts +3 -5
  36. package/src/endpoints/admin/organizations/ChargeOrganizationsEndpoint.ts +1 -1
  37. package/src/endpoints/admin/organizations/GetOrganizationsCountEndpoint.ts +1 -1
  38. package/src/endpoints/admin/organizations/GetOrganizationsEndpoint.ts +13 -7
  39. package/src/endpoints/admin/organizations/PatchOrganizationsEndpoint.ts +4 -6
  40. package/src/endpoints/admin/organizations/PatchPackagesEndpoint.test.ts +10 -6
  41. package/src/endpoints/admin/organizations/PatchPackagesEndpoint.ts +39 -21
  42. package/src/endpoints/admin/registrations/ChargeRegistrationsEndpoint.ts +1 -1
  43. package/src/endpoints/auth/CreateAdminEndpoint.ts +23 -5
  44. package/src/endpoints/auth/CreateTokenEndpoint.ts +2 -2
  45. package/src/endpoints/auth/DeleteTokenEndpoint.ts +1 -1
  46. package/src/endpoints/auth/DeleteUserEndpoint.ts +3 -3
  47. package/src/endpoints/auth/ForgotPasswordEndpoint.ts +1 -1
  48. package/src/endpoints/auth/GetOtherUserEndpoint.ts +1 -1
  49. package/src/endpoints/auth/GetUserEndpoint.ts +1 -1
  50. package/src/endpoints/auth/OpenIDConnectAuthTokenEndpoint.ts +1 -1
  51. package/src/endpoints/auth/OpenIDConnectStartEndpoint.ts +1 -1
  52. package/src/endpoints/auth/PatchUserEndpoint.ts +5 -8
  53. package/src/endpoints/auth/PollEmailVerificationEndpoint.ts +1 -1
  54. package/src/endpoints/auth/RetryEmailVerificationEndpoint.ts +1 -1
  55. package/src/endpoints/auth/SignupEndpoint.ts +2 -3
  56. package/src/endpoints/auth/VerifyEmailEndpoint.ts +20 -3
  57. package/src/endpoints/frontend/FrontendEnvironmentEndpoint.ts +2 -1
  58. package/src/endpoints/global/addresses/SearchRegionsEndpoint.ts +2 -4
  59. package/src/endpoints/global/addresses/ValidateAddressEndpoint.ts +1 -1
  60. package/src/endpoints/global/audit-logs/GetAuditLogsEndpoint.ts +5 -7
  61. package/src/endpoints/global/caddy/CheckDomainCertEndpoint.ts +2 -2
  62. package/src/endpoints/global/email/CreateEmailEndpoint.ts +3 -4
  63. package/src/endpoints/global/email/GetAdminEmailsEndpoint.test.ts +1 -1
  64. package/src/endpoints/global/email/GetAdminEmailsEndpoint.ts +1 -2
  65. package/src/endpoints/global/email/GetEmailAddressEndpoint.ts +4 -6
  66. package/src/endpoints/global/email/GetEmailEndpoint.ts +1 -1
  67. package/src/endpoints/global/email/GetUserEmailsEndpoint.test.ts +1 -1
  68. package/src/endpoints/global/email/GetUserEmailsEndpoint.ts +1 -1
  69. package/src/endpoints/global/email/ManageEmailAddressEndpoint.ts +6 -10
  70. package/src/endpoints/global/email/PatchEmailEndpoint.test.ts +4 -7
  71. package/src/endpoints/global/email/PatchEmailEndpoint.ts +6 -9
  72. package/src/endpoints/global/email-recipients/GetEmailRecipientsCountEndpoint.ts +1 -1
  73. package/src/endpoints/global/email-recipients/GetEmailRecipientsEndpoint.test.ts +1 -1
  74. package/src/endpoints/global/email-recipients/GetEmailRecipientsEndpoint.ts +1 -1
  75. package/src/endpoints/global/email-recipients/RetryEmailRecipientEndpoint.ts +2 -2
  76. package/src/endpoints/global/events/GetEventNotificationsCountEndpoint.ts +1 -1
  77. package/src/endpoints/global/events/GetEventNotificationsEndpoint.ts +3 -3
  78. package/src/endpoints/global/events/GetEventsEndpoint.ts +3 -3
  79. package/src/endpoints/global/events/PatchEventNotificationsEndpoint.test.ts +49 -4
  80. package/src/endpoints/global/events/PatchEventNotificationsEndpoint.ts +5 -8
  81. package/src/endpoints/global/events/PatchEventsEndpoint.test.ts +12 -44
  82. package/src/endpoints/global/events/PatchEventsEndpoint.ts +128 -127
  83. package/src/endpoints/global/files/ExportToExcelEndpoint.ts +9 -9
  84. package/src/endpoints/global/files/GetFileCache.ts +3 -4
  85. package/src/endpoints/global/files/UploadFile.ts +3 -4
  86. package/src/endpoints/global/files/UploadImage.ts +3 -4
  87. package/src/endpoints/global/groups/GetGroupsCountEndpoint.ts +1 -1
  88. package/src/endpoints/global/groups/GetGroupsEndpoint.test.ts +1 -1
  89. package/src/endpoints/global/groups/GetGroupsEndpoint.ts +4 -2
  90. package/src/endpoints/global/members/GetMemberFamilyEndpoint.ts +2 -3
  91. package/src/endpoints/global/members/GetMembersCountEndpoint.ts +1 -1
  92. package/src/endpoints/global/members/GetMembersEndpoint.test.ts +2 -2
  93. package/src/endpoints/global/members/GetMembersEndpoint.ts +10 -12
  94. package/src/endpoints/global/members/PatchOrganizationMembersEndpoint.test.ts +195 -12
  95. package/src/endpoints/global/members/PatchOrganizationMembersEndpoint.ts +16 -22
  96. package/src/endpoints/global/members/helpers/validateGroupFilter.ts +6 -30
  97. package/src/endpoints/global/members/shouldCheckIfMemberIsDuplicate.ts +1 -1
  98. package/src/endpoints/global/organizations/CheckRegisterCodeEndpoint.ts +1 -1
  99. package/src/endpoints/global/organizations/CreateOrganizationEndpoint.ts +40 -8
  100. package/src/endpoints/global/organizations/GetOrganizationFromDomainEndpoint.ts +2 -2
  101. package/src/endpoints/global/organizations/GetOrganizationFromUriEndpoint.ts +2 -2
  102. package/src/endpoints/global/organizations/SearchOrganizationEndpoint.test.ts +4 -1
  103. package/src/endpoints/global/organizations/SearchOrganizationEndpoint.ts +4 -5
  104. package/src/endpoints/global/payments/StripeWebhookEndpoint.ts +9 -16
  105. package/src/endpoints/global/platform/GetPlatformAdminsEndpoint.ts +1 -1
  106. package/src/endpoints/global/platform/GetPlatformEndpoint.ts +1 -1
  107. package/src/endpoints/global/platform/PatchPlatformEnpoint.test.ts +1 -1
  108. package/src/endpoints/global/platform/PatchPlatformEnpoint.ts +11 -11
  109. package/src/endpoints/global/platform-memberships/GetPlatformMembershipsCountEndpoint.ts +31 -31
  110. package/src/endpoints/global/platform-memberships/GetPlatformMembershipsEndpoint.ts +18 -20
  111. package/src/endpoints/global/registration/GetRegistrationsCountEndpoint.ts +1 -1
  112. package/src/endpoints/global/registration/GetRegistrationsEndpoint.test.ts +1 -1
  113. package/src/endpoints/global/registration/GetRegistrationsEndpoint.ts +6 -10
  114. package/src/endpoints/global/registration/GetUserDetailedPayableBalanceEndpoint.ts +35 -6
  115. package/src/endpoints/global/registration/GetUserDocumentsEndpoint.ts +2 -2
  116. package/src/endpoints/global/registration/GetUserMembersEndpoint.ts +1 -1
  117. package/src/endpoints/global/registration/GetUserPayableBalanceEndpoint.ts +1 -1
  118. package/src/endpoints/global/registration/PatchUserMembersEndpoint.test.ts +2 -2
  119. package/src/endpoints/global/registration/PatchUserMembersEndpoint.ts +3 -3
  120. package/src/endpoints/global/registration/RegisterMembersEndpoint.test.ts +90 -6
  121. package/src/endpoints/global/registration/RegisterMembersEndpoint.ts +35 -34
  122. package/src/endpoints/global/registration-invitations/GetRegistrationInvitationsCountEndpoint.ts +1 -1
  123. package/src/endpoints/global/registration-invitations/GetRegistrationInvitationsEndpoint.test.ts +62 -63
  124. package/src/endpoints/global/registration-invitations/GetRegistrationInvitationsEndpoint.ts +6 -9
  125. package/src/endpoints/global/registration-invitations/PatchRegistrationInvitationsEndpoint.test.ts +51 -52
  126. package/src/endpoints/global/registration-invitations/PatchRegistrationInvitationsEndpoint.ts +6 -7
  127. package/src/endpoints/global/registration-periods/GetRegistrationPeriodsCountEndpoint.ts +43 -0
  128. package/src/endpoints/global/registration-periods/GetRegistrationPeriodsEndpoint.ts +1 -1
  129. package/src/endpoints/global/registration-periods/PatchRegistrationPeriodsEndpoint.ts +13 -5
  130. package/src/endpoints/global/sso/GetSSOEndpoint.ts +2 -3
  131. package/src/endpoints/global/sso/SetSSOEndpoint.ts +1 -1
  132. package/src/endpoints/global/webshops/GetWebshopFromDomainEndpoint.ts +2 -2
  133. package/src/endpoints/global/webshops/GetWebshopsEndpoint.test.ts +1 -2
  134. package/src/endpoints/global/webshops/GetWebshopsEndpoint.ts +2 -4
  135. package/src/endpoints/organization/dashboard/balance-items/GetBalanceItemEndpoint.ts +2 -2
  136. package/src/endpoints/organization/dashboard/balance-items/GetBalanceItemsCountEndpoint.ts +1 -1
  137. package/src/endpoints/organization/dashboard/balance-items/GetBalanceItemsEndpoint.ts +3 -4
  138. package/src/endpoints/organization/dashboard/balance-items/PatchBalanceItemsEndpoint.ts +7 -9
  139. package/src/endpoints/organization/dashboard/billing/ApplyRegisterCodeEndpoint.test.ts +73 -0
  140. package/src/endpoints/organization/dashboard/billing/ApplyRegisterCodeEndpoint.ts +89 -0
  141. package/src/endpoints/organization/dashboard/billing/DeactivatePackageEndpoint.ts +1 -5
  142. package/src/endpoints/organization/dashboard/billing/DeleteOrganizationMandateEndpoint.ts +11 -11
  143. package/src/endpoints/organization/dashboard/billing/GetOrganizationDetailedPayableBalanceCollectionEndpoint.ts +2 -2
  144. package/src/endpoints/organization/dashboard/billing/GetOrganizationDetailedPayableBalanceEndpoint.ts +8 -8
  145. package/src/endpoints/organization/dashboard/billing/GetOrganizationMandatesEndpoint.ts +9 -9
  146. package/src/endpoints/organization/dashboard/billing/GetOrganizationPayableBalanceEndpoint.ts +2 -2
  147. package/src/endpoints/organization/dashboard/billing/GetOrganizationPayableInvoicesEndpoint.ts +68 -0
  148. package/src/endpoints/organization/dashboard/billing/GetPackagesEndpoint.ts +4 -4
  149. package/src/endpoints/organization/dashboard/billing/GetRegisterCodeEndpoint.ts +66 -0
  150. package/src/endpoints/organization/dashboard/billing/OrganizationCheckoutEndpoint.test.ts +949 -0
  151. package/src/endpoints/organization/dashboard/billing/OrganizationCheckoutEndpoint.ts +60 -57
  152. package/src/endpoints/organization/dashboard/billing/PatchOrganizationMandatesEndpoint.ts +20 -20
  153. package/src/endpoints/organization/dashboard/documents/GetDocumentTemplateXML.ts +1 -1
  154. package/src/endpoints/organization/dashboard/documents/GetDocumentTemplatesCountEndpoint.ts +1 -1
  155. package/src/endpoints/organization/dashboard/documents/GetDocumentTemplatesEndpoint.ts +1 -1
  156. package/src/endpoints/organization/dashboard/documents/GetDocumentsCountEndpoint.ts +1 -1
  157. package/src/endpoints/organization/dashboard/documents/GetDocumentsEndpoint.ts +1 -1
  158. package/src/endpoints/organization/dashboard/documents/PatchDocumentEndpoint.ts +10 -2
  159. package/src/endpoints/organization/dashboard/documents/PatchDocumentTemplatesEndpoint.test.ts +2 -2
  160. package/src/endpoints/organization/dashboard/documents/PatchDocumentTemplatesEndpoint.ts +2 -2
  161. package/src/endpoints/organization/dashboard/email/CheckEmailBouncesEndpoint.ts +1 -1
  162. package/src/endpoints/organization/dashboard/email-templates/GetEmailTemplatesEndpoint.test.ts +1 -1
  163. package/src/endpoints/organization/dashboard/email-templates/GetEmailTemplatesEndpoint.ts +10 -8
  164. package/src/endpoints/organization/dashboard/email-templates/PatchEmailTemplatesEndpoint.test.ts +1 -1
  165. package/src/endpoints/organization/dashboard/email-templates/PatchEmailTemplatesEndpoint.ts +5 -6
  166. package/src/endpoints/organization/dashboard/invoices/GetInvoicesCountEndpoint.ts +1 -1
  167. package/src/endpoints/organization/dashboard/invoices/GetInvoicesEndpoint.ts +10 -6
  168. package/src/endpoints/organization/dashboard/invoices/PatchInvoicesEndpoint.ts +11 -2
  169. package/src/endpoints/organization/dashboard/mollie/CheckMollieEndpoint.ts +4 -5
  170. package/src/endpoints/organization/dashboard/mollie/ConnectMollieEndpoint.ts +5 -5
  171. package/src/endpoints/organization/dashboard/mollie/DisconnectMollieEndpoint.ts +2 -2
  172. package/src/endpoints/organization/dashboard/mollie/GetMollieDashboardEndpoint.ts +7 -7
  173. package/src/endpoints/organization/dashboard/nolt/CreateNoltTokenEndpoint.ts +1 -1
  174. package/src/endpoints/organization/dashboard/organization/GetOrganizationArchivedGroups.ts +2 -2
  175. package/src/endpoints/organization/dashboard/organization/GetOrganizationDeletedGroups.ts +1 -1
  176. package/src/endpoints/organization/dashboard/organization/GetUitpasClientIdEndpoint.ts +1 -1
  177. package/src/endpoints/organization/dashboard/organization/PatchOrganizationEndpoint.test.ts +2 -2
  178. package/src/endpoints/organization/dashboard/organization/PatchOrganizationEndpoint.ts +50 -12
  179. package/src/endpoints/organization/dashboard/organization/SearchUitpasOrganizersEndpoint.ts +2 -2
  180. package/src/endpoints/organization/dashboard/organization/SetOrganizationDomainEndpoint.ts +5 -10
  181. package/src/endpoints/organization/dashboard/organization/SetUitpasClientCredentialsEndpoint.ts +1 -1
  182. package/src/endpoints/organization/dashboard/payments/GetPaymentsCountEndpoint.ts +1 -1
  183. package/src/endpoints/organization/dashboard/payments/GetPaymentsEndpoint.ts +3 -4
  184. package/src/endpoints/organization/dashboard/payments/PatchPaymentsEndpoint.ts +21 -14
  185. package/src/endpoints/organization/dashboard/receivable-balances/ChargeReceivableBalancesEndpoint.ts +35 -28
  186. package/src/endpoints/organization/dashboard/receivable-balances/GetReceivableBalanceEndpoint.ts +2 -3
  187. package/src/endpoints/organization/dashboard/receivable-balances/GetReceivableBalancesCountEndpoint.ts +1 -1
  188. package/src/endpoints/organization/dashboard/receivable-balances/GetReceivableBalancesEndpoint.ts +1 -1
  189. package/src/endpoints/organization/dashboard/registration-periods/GetOrganizationRegistrationPeriodsEndpoint.test.ts +1 -1
  190. package/src/endpoints/organization/dashboard/registration-periods/GetOrganizationRegistrationPeriodsEndpoint.ts +2 -3
  191. package/src/endpoints/organization/dashboard/registration-periods/MoveRegistrationPeriods.test.ts +1 -1
  192. package/src/endpoints/organization/dashboard/registration-periods/PatchOrganizationRegistrationPeriodsEndpoint.test.ts +1 -1
  193. package/src/endpoints/organization/dashboard/registration-periods/PatchOrganizationRegistrationPeriodsEndpoint.ts +19 -18
  194. package/src/endpoints/organization/dashboard/registration-periods/SetupStepReviewEndpoint.ts +4 -5
  195. package/src/endpoints/organization/dashboard/stripe/ConnectStripeEndpoint.ts +1 -1
  196. package/src/endpoints/organization/dashboard/stripe/DeleteStripeAccountEndpoint.ts +2 -3
  197. package/src/endpoints/organization/dashboard/stripe/GetStripeAccountLinkEndpoint.ts +2 -2
  198. package/src/endpoints/organization/dashboard/stripe/GetStripeAccountsEndpoint.ts +1 -1
  199. package/src/endpoints/organization/dashboard/stripe/GetStripeLoginLinkEndpoint.ts +2 -2
  200. package/src/endpoints/organization/dashboard/stripe/UpdateStripeAccountEndpoint.ts +1 -1
  201. package/src/endpoints/organization/dashboard/users/CreateApiUserEndpoint.ts +1 -1
  202. package/src/endpoints/organization/dashboard/users/DeleteUserEndpoint.ts +1 -1
  203. package/src/endpoints/organization/dashboard/users/GetApiUsersEndpoint.ts +1 -1
  204. package/src/endpoints/organization/dashboard/users/GetOrganizationAdminsEndpoint.ts +1 -1
  205. package/src/endpoints/organization/dashboard/users/PatchApiUserEndpoint.ts +4 -6
  206. package/src/endpoints/organization/dashboard/webshops/CreateWebshopEndpoint.ts +10 -15
  207. package/src/endpoints/organization/dashboard/webshops/DeleteWebshopEndpoint.ts +1 -1
  208. package/src/endpoints/organization/dashboard/webshops/GetDiscountCodesEndpoint.ts +2 -2
  209. package/src/endpoints/organization/dashboard/webshops/GetWebshopOrdersCountEndpoint.ts +1 -1
  210. package/src/endpoints/organization/dashboard/webshops/GetWebshopOrdersEndpoint.ts +1 -1
  211. package/src/endpoints/organization/dashboard/webshops/GetWebshopTicketsEndpoint.ts +1 -1
  212. package/src/endpoints/organization/dashboard/webshops/GetWebshopUriAvailabilityEndpoint.ts +11 -2
  213. package/src/endpoints/organization/dashboard/webshops/PatchDiscountCodesEndpoint.ts +4 -6
  214. package/src/endpoints/organization/dashboard/webshops/PatchWebshopEndpoint.ts +22 -7
  215. package/src/endpoints/organization/dashboard/webshops/PatchWebshopOrdersEndpoint.ts +20 -27
  216. package/src/endpoints/organization/dashboard/webshops/PatchWebshopTicketsEndpoint.ts +1 -1
  217. package/src/endpoints/organization/dashboard/webshops/SearchUitpasEventsEndpoint.ts +2 -2
  218. package/src/endpoints/organization/dashboard/webshops/VerifyWebshopDomainEndpoint.ts +2 -3
  219. package/src/endpoints/organization/dashboard/webshops/WebshopReservedPathSegments.test.ts +95 -0
  220. package/src/endpoints/organization/shared/ExchangePaymentEndpoint.ts +2 -2
  221. package/src/endpoints/organization/shared/GetDocumentHtml.ts +1 -1
  222. package/src/endpoints/organization/shared/GetPaymentEndpoint.ts +1 -1
  223. package/src/endpoints/organization/shared/GetUitpasNumberDetailsEndpoint.ts +3 -5
  224. package/src/endpoints/organization/shared/auth/GetOrganizationEndpoint.ts +1 -1
  225. package/src/endpoints/organization/webshops/CheckWebshopDiscountCodesEndpoint.ts +4 -1
  226. package/src/endpoints/organization/webshops/GetOrderByPaymentEndpoint.ts +14 -3
  227. package/src/endpoints/organization/webshops/GetOrderEndpoint.ts +14 -2
  228. package/src/endpoints/organization/webshops/GetTicketsEndpoint.ts +37 -16
  229. package/src/endpoints/organization/webshops/GetWebshopEndpoint.test.ts +34 -2
  230. package/src/endpoints/organization/webshops/GetWebshopEndpoint.ts +4 -2
  231. package/src/endpoints/organization/webshops/PlaceOrderEndpoint.test.ts +74 -3
  232. package/src/endpoints/organization/webshops/PlaceOrderEndpoint.ts +16 -33
  233. package/src/endpoints/organization/webshops/RetrieveUitpasSocialTariffPriceEndpoint.ts +3 -5
  234. package/src/endpoints/organization/webshops/WebshopAuthHelper.ts +36 -0
  235. package/src/endpoints/system/HealthEndpoint.ts +1 -1
  236. package/src/excel-loaders/balance-items.ts +1 -1
  237. package/src/excel-loaders/event-notifications.ts +1 -1
  238. package/src/excel-loaders/members.ts +1 -1
  239. package/src/excel-loaders/organizations.ts +3 -3
  240. package/src/excel-loaders/payments.ts +31 -1
  241. package/src/excel-loaders/platform-memberships.ts +13 -14
  242. package/src/excel-loaders/receivable-balances.ts +2 -2
  243. package/src/excel-loaders/registrations.ts +2 -3
  244. package/src/helpers/AddressValidator.ts +7 -14
  245. package/src/helpers/AdminPermissionChecker.ts +50 -63
  246. package/src/helpers/AuthenticatedStructures.ts +69 -55
  247. package/src/helpers/BalanceItemRelationsBackfiller.test.ts +174 -0
  248. package/src/helpers/BalanceItemRelationsBackfiller.ts +163 -0
  249. package/src/helpers/BuckarooHelper.ts +2 -4
  250. package/src/helpers/CheckSettlements.ts +12 -24
  251. package/src/helpers/Context.ts +15 -10
  252. package/src/helpers/CookieHelper.ts +1 -2
  253. package/src/helpers/EmailResumer.ts +1 -2
  254. package/src/helpers/FileCache.ts +2 -3
  255. package/src/helpers/FinancialSupportHelper.ts +2 -2
  256. package/src/helpers/FlagMomentCleanup.ts +1 -2
  257. package/src/helpers/ForwardHandler.ts +5 -10
  258. package/src/helpers/GlobalHelper.ts +3 -3
  259. package/src/helpers/LegacyBillingConverter.ts +787 -0
  260. package/src/helpers/MemberMerger.test.ts +782 -0
  261. package/src/helpers/MemberMerger.ts +600 -0
  262. package/src/helpers/MemberUserSyncer.ts +6 -12
  263. package/src/helpers/MembershipCharger.ts +2 -4
  264. package/src/helpers/PaymentCustomerResolver.test.ts +203 -0
  265. package/src/helpers/PaymentCustomerResolver.ts +144 -0
  266. package/src/helpers/PeriodHelper.ts +2 -3
  267. package/src/helpers/RecordAnswerHelper.test.ts +105 -110
  268. package/src/helpers/RecordAnswerHelper.ts +7 -7
  269. package/src/helpers/SeedTools.ts +106 -0
  270. package/src/helpers/ServiceFeeHelper.ts +125 -15
  271. package/src/helpers/SetupStepUpdater.ts +38 -32
  272. package/src/helpers/StamhoofdFilterAccessHelper.ts +52 -0
  273. package/src/helpers/StripeHelper.ts +14 -36
  274. package/src/helpers/StripeInvoicer.ts +419 -0
  275. package/src/helpers/StripePayoutChecker.ts +5 -10
  276. package/src/helpers/TagHelper.ts +7 -8
  277. package/src/helpers/TemporaryMemberAccess.ts +1 -2
  278. package/src/helpers/ThrottledQueue.ts +1 -2
  279. package/src/helpers/UitpasTokenRepository.ts +1 -2
  280. package/src/helpers/ViesHelper.ts +7 -11
  281. package/src/helpers/XlsxTransformerColumnHelper.ts +1 -1
  282. package/src/helpers/outstandingBalanceJoin.ts +2 -2
  283. package/src/helpers/updateMemberDetailsUitpasNumber.ts +3 -5
  284. package/src/migrate.ts +12 -5
  285. package/src/{seeds → migrations}/0000000004-single-organization.ts +10 -1
  286. package/src/migrations/0000000006-default-organization.ts +139 -0
  287. package/src/{seeds → migrations}/1715028563-user-permissions.ts +17 -27
  288. package/src/{seeds/1765896674-document-update-year.test.ts → migrations/1750090029-document-update-year.test.ts} +27 -26
  289. package/src/migrations/1750090029-document-update-year.ts +103 -0
  290. package/src/{seeds → migrations}/1750090030-records-configuration.ts +33 -32
  291. package/src/migrations/1750090031-records-configuration-webshops.ts +36 -0
  292. package/src/migrations/1752848540-national-numbers.ts +585 -0
  293. package/src/migrations/1752848550-records-configuration-group-filter.ts +1064 -0
  294. package/src/{seeds → migrations}/1752848561-groups-registration-periods.ts +70 -26
  295. package/src/{seeds → migrations}/1754560914-groups-prices.test.ts +1 -1
  296. package/src/{seeds → migrations}/1754560914-groups-prices.ts +9 -15
  297. package/src/{seeds → migrations}/1756293699-fill-previous-next-period-id.ts +1 -2
  298. package/src/migrations/1761665607-sync-member-users.ts +40 -0
  299. package/src/migrations/1779121240-invoice-email-template.sql +6 -0
  300. package/src/migrations/1779986893-default-payment-failed-email-templates.sql +4 -0
  301. package/src/migrations/1780578166-convert-legacy-billing.ts +13 -0
  302. package/src/{seeds/1755876819-remove-duplicate-members.ts → migrations/1780665426-remove-duplicate-members.ts} +23 -4
  303. package/src/migrations/1780933598-document-groups.ts +88 -0
  304. package/src/migrations/1781692342-balance-item-relations.ts +13 -0
  305. package/src/migrations/1781857866-platform-admins.ts +103 -0
  306. package/src/migrations/1781857867-rm-old-platform-admins.ts +25 -0
  307. package/src/seeds/0000000001-throw.ts +5 -0
  308. package/src/seeds/1760702452-update-balance-price-paid.ts +19 -0
  309. package/src/seeds/1760702453-update-balance-invoiced.ts +19 -0
  310. package/src/seeds/1760702454-update-cached-outstanding-balance-from-items.ts +51 -14
  311. package/src/seeds/1773754928-force-save-members.ts +41 -8
  312. package/src/seeds/1780665427-schedule-stock-updates.ts +45 -0
  313. package/src/seeds/1780665428-group-update-occupancy.ts +31 -0
  314. package/src/seeds/1780915001-fill-payment-customer.ts +70 -0
  315. package/src/seeds/1780915002-update-orders.ts +39 -0
  316. package/src/seeds/1782047708-organization-company-address.ts +44 -0
  317. package/src/seeds-temporary/1769088653-uitpas-status.ts +1 -2
  318. package/src/seeds-temporary/1780416000-migrate-audit-log-legacy-enums.test.ts +69 -0
  319. package/src/seeds-temporary/1780416000-migrate-audit-log-legacy-enums.ts +85 -0
  320. package/src/services/AuditLogService.test.ts +51 -0
  321. package/src/services/AuditLogService.ts +45 -0
  322. package/src/services/BalanceItemService.ts +141 -44
  323. package/src/services/CpuService.ts +3 -6
  324. package/src/services/DatabaseCollationService.test.ts +1 -2
  325. package/src/services/DocumentService.ts +1 -2
  326. package/src/services/EventNotificationService.ts +1 -1
  327. package/src/services/FileSignService.ts +2 -4
  328. package/src/services/InvoicePdfService.ts +286 -0
  329. package/src/services/InvoiceService.ts +204 -251
  330. package/src/services/InvoiceXMLService.ts +424 -0
  331. package/src/services/MemberNumberService.ts +6 -11
  332. package/src/services/MemberRecordStore.ts +8 -10
  333. package/src/services/MollieService.ts +114 -121
  334. package/src/services/PaymentMandateService.ts +45 -45
  335. package/src/services/PaymentReallocationService.test.ts +1 -1
  336. package/src/services/PaymentReallocationService.ts +7 -9
  337. package/src/services/PaymentService.ts +444 -308
  338. package/src/services/PlatformMembershipService.ts +4 -8
  339. package/src/services/ReferralService.ts +223 -0
  340. package/src/services/RegistrationService.ts +63 -53
  341. package/src/services/SSOService.test.ts +119 -0
  342. package/src/services/SSOService.ts +56 -49
  343. package/src/services/STPackageService.ts +97 -61
  344. package/src/services/UniqueMemberNumberService.ts +69 -0
  345. package/src/services/UniqueUserService.ts +3 -6
  346. package/src/services/VATService.ts +85 -0
  347. package/src/services/uitpas/PassholderEndpoints.ts +3 -6
  348. package/src/services/uitpas/UitpasService.ts +6 -10
  349. package/src/services/uitpas/checkUitpasNumbers.ts +2 -4
  350. package/src/services/uitpas/getSocialTariffForUitpasNumbers.ts +3 -6
  351. package/src/services/uitpas/searchUitpasEvents.ts +1 -2
  352. package/src/sql-filters/audit-logs.ts +1 -1
  353. package/src/sql-filters/balance-item-payments.ts +1 -1
  354. package/src/sql-filters/balance-items.ts +1 -1
  355. package/src/sql-filters/base-registration-filter-compilers.ts +5 -33
  356. package/src/sql-filters/document-templates.ts +1 -1
  357. package/src/sql-filters/documents.ts +1 -1
  358. package/src/sql-filters/email-recipients.ts +1 -1
  359. package/src/sql-filters/emails.ts +1 -1
  360. package/src/sql-filters/event-notifications.ts +1 -1
  361. package/src/sql-filters/events.ts +6 -1
  362. package/src/sql-filters/groups.ts +5 -0
  363. package/src/sql-filters/invoiced-balance-items.ts +1 -1
  364. package/src/sql-filters/invoices.ts +1 -1
  365. package/src/sql-filters/member-responsibility-records.ts +1 -1
  366. package/src/sql-filters/members.ts +1 -1
  367. package/src/sql-filters/orders.ts +4 -4
  368. package/src/sql-filters/organization-registration-periods.ts +1 -1
  369. package/src/sql-filters/organizations.ts +1 -1
  370. package/src/sql-filters/platform-memberships.ts +3 -3
  371. package/src/sql-filters/receivable-balances.ts +1 -1
  372. package/src/sql-filters/registration-periods.ts +1 -1
  373. package/src/sql-filters/registrations.ts +1 -1
  374. package/src/sql-filters/tickets.ts +1 -1
  375. package/src/sql-filters/users.ts +1 -1
  376. package/src/sql-sorters/groups.ts +23 -0
  377. package/src/sql-sorters/platform-memberships.ts +16 -16
  378. package/src/sql-sorters/registration-invitations.ts +2 -2
  379. package/tests/actions/patchOrganizationMember.ts +1 -1
  380. package/tests/actions/patchUserMember.ts +1 -1
  381. package/tests/assertions/assertBalances.ts +6 -12
  382. package/tests/e2e/api-rate-limits.test.ts +12 -24
  383. package/tests/e2e/bundle-discounts.test.ts +4 -1
  384. package/tests/e2e/charge-members.test.ts +13 -11
  385. package/tests/e2e/documents.test.ts +4 -1
  386. package/tests/e2e/register.test.ts +7 -9
  387. package/tests/e2e/stock.test.ts +4 -3
  388. package/tests/e2e/tickets.test.ts +1 -1
  389. package/tests/helpers/MollieMocker.ts +462 -0
  390. package/tests/helpers/PayconiqMocker.ts +138 -45
  391. package/tests/helpers/StripeMocker.ts +9 -6
  392. package/tests/helpers/index.ts +4 -0
  393. package/tests/init/initAdmin.ts +2 -2
  394. package/tests/init/initBundleDiscount.ts +1 -1
  395. package/tests/init/initMembershipOrganization.ts +13 -0
  396. package/tests/init/initPermissionRole.ts +3 -4
  397. package/tests/vitest.global.setup.ts +1 -1
  398. package/vitest.config.js +6 -0
  399. package/.nvmrc +0 -1
  400. package/src/helpers/GroupBuilder.ts +0 -418
  401. package/src/seeds/0000000000-example.ts +0 -11
  402. package/src/seeds/1722256498-group-update-occupancy.ts +0 -52
  403. package/src/seeds/1726572303-schedule-stock-updates.ts +0 -52
  404. package/src/seeds/1726847064-setup-steps.ts +0 -16
  405. package/src/seeds/1728928974-update-cached-outstanding-balance-from-items.ts +0 -31
  406. package/src/seeds/1729253172-update-orders.ts +0 -21
  407. package/src/seeds/1733319079-fill-paying-organization-ids.ts +0 -68
  408. package/src/seeds/1733748412-update-deleted-order-numbers.ts +0 -109
  409. package/src/seeds/1733994455-balance-item-status-open.ts +0 -30
  410. package/src/seeds/1740046783-update-membership.ts +0 -17
  411. package/src/seeds/1741008870-fix-auditlog-description.ts +0 -50
  412. package/src/seeds/1741011468-fix-auditlog-description-uft16.ts +0 -88
  413. package/src/seeds/1741268179-fix-group-dates-of-events.ts +0 -32
  414. package/src/seeds/1751445358-upload-email-attachments.ts +0 -106
  415. package/src/seeds/1755532883-update-email-sender-ids.ts +0 -47
  416. package/src/seeds/1755790070-fill-email-recipient-errors.ts +0 -96
  417. package/src/seeds/1756115432-remove-old-drafts.ts +0 -16
  418. package/src/seeds/1756115433-fill-email-recipient-organization-id.ts +0 -30
  419. package/src/seeds/1756303697-update-email-counts.ts +0 -76
  420. package/src/seeds/1761665607-sync-member-users.ts +0 -59
  421. package/src/seeds/1765896674-document-update-year.ts +0 -66
  422. /package/src/{seeds → migrations}/0000000001-development-user.ts +0 -0
  423. /package/src/{seeds → migrations}/0000000002-clear-stamhoofd-email-templates.ts +0 -0
  424. /package/src/{seeds → migrations}/0000000003-default-email-templates.ts +0 -0
  425. /package/src/{seeds → migrations}/1752848561-groups-registration-periods.test.ts +0 -0
  426. /package/src/{seeds → migrations}/1766150402-document-published-at.test.ts +0 -0
  427. /package/src/{seeds → migrations}/1766150402-document-published-at.ts +0 -0
  428. /package/src/{seeds → migrations}/1779121239-default-invoice-email-template.sql +0 -0
  429. /package/src/{seeds → migrations}/data/default-email-templates.sql +0 -0
@@ -1,21 +1,17 @@
1
- import { createMollieClient, PaymentMethod as molliePaymentMethod } from '@mollie/api-client';
2
1
  import { ManyToOneRelation } from '@simonbackx/simple-database';
3
2
  import type { Decoder } from '@simonbackx/simple-encoding';
4
- import type { DecodedRequest, Request} from '@simonbackx/simple-endpoints';
3
+ import type { DecodedRequest, Request } from '@simonbackx/simple-endpoints';
5
4
  import { Endpoint, Response } from '@simonbackx/simple-endpoints';
6
5
  import { SimpleError } from '@simonbackx/simple-errors';
7
6
  import { Email } from '@stamhoofd/email';
8
- import type { MemberWithUsersRegistrationsAndGroups, Organization, Payment} from '@stamhoofd/models';
9
- import { BalanceItem, BalanceItemPayment, CachedBalance, Group, Member, MolliePayment, MollieToken, PayconiqPayment, Platform, RateLimiter, Registration, User } from '@stamhoofd/models';
10
- import type { BalanceItem as BalanceItemStruct, PlatformMember, RegisterItem} from '@stamhoofd/structures';
11
- import { BalanceItemRelation, BalanceItemRelationType, BalanceItemStatus, BalanceItemType, IDRegisterCheckout, PaymentCustomer, PaymentMethod, PaymentMethodHelper, PaymentProvider, PaymentStatus, Payment as PaymentStruct, PaymentType, PermissionLevel, PlatformFamily, ReceivableBalanceType, RegisterResponse, TranslatedString, Version } from '@stamhoofd/structures';
12
- import { Formatter, sleep } from '@stamhoofd/utility';
7
+ import type { MemberWithUsersRegistrationsAndGroups, Organization, Payment } from '@stamhoofd/models';
8
+ import { BalanceItem, CachedBalance, Group, Member, Platform, RateLimiter, Registration } from '@stamhoofd/models';
9
+ import type { BalanceItem as BalanceItemStruct, PlatformMember, RegisterItem } from '@stamhoofd/structures';
10
+ import { BalanceItemRelation, BalanceItemRelationType, BalanceItemStatus, BalanceItemType, IDRegisterCheckout, Payment as PaymentStruct, PermissionLevel, PlatformFamily, ReceivableBalanceType, RegisterResponse, TranslatedString } from '@stamhoofd/structures';
11
+ import { Formatter } from '@stamhoofd/utility';
13
12
 
14
13
  import { AuthenticatedStructures } from '../../../helpers/AuthenticatedStructures.js';
15
- import { BuckarooHelper } from '../../../helpers/BuckarooHelper.js';
16
14
  import { Context } from '../../../helpers/Context.js';
17
- import { ServiceFeeHelper } from '../../../helpers/ServiceFeeHelper.js';
18
- import { StripeHelper } from '../../../helpers/StripeHelper.js';
19
15
  import { updateMemberDetailsUitpasNumber } from '../../../helpers/updateMemberDetailsUitpasNumber.js';
20
16
  import { BalanceItemService } from '../../../services/BalanceItemService.js';
21
17
  import { PaymentService } from '../../../services/PaymentService.js';
@@ -88,8 +84,7 @@ export class RegisterMembersEndpoint extends Endpoint<Params, Query, Body, Respo
88
84
 
89
85
  // We won't create a payment. The balance will get added to the outstanding amount of the member / already paying organization
90
86
  whoWillPayNow = 'nobody';
91
- }
92
- else if (request.body.asOrganizationId && request.body.asOrganizationId !== organization.id) {
87
+ } else if (request.body.asOrganizationId && request.body.asOrganizationId !== organization.id) {
93
88
  // Paying balance to a different organization requires finance permissions
94
89
  // we'll check later if you are also registering members, which requires full permissions
95
90
  if (!await Context.auth.canManageFinances(request.body.asOrganizationId)) {
@@ -111,8 +106,7 @@ export class RegisterMembersEndpoint extends Endpoint<Params, Query, Body, Respo
111
106
 
112
107
  try {
113
108
  limiter.track(organization.id, 1);
114
- }
115
- catch (e) {
109
+ } catch (e) {
116
110
  Email.sendWebmaster({
117
111
  subject: '[Limiet] Limiet bereikt voor aantal inschrijvingen',
118
112
  text: 'Beste, \nDe limiet werd bereikt voor het aantal inschrijvingen per dag. \nVereniging: ' + organization.id + ' (' + organization.name + ')' + '\n\n' + e.message + '\n\nStamhoofd',
@@ -135,6 +129,7 @@ export class RegisterMembersEndpoint extends Endpoint<Params, Query, Body, Respo
135
129
 
136
130
  // Validate balance items (can only happen serverside)
137
131
  const balanceItemIds = request.body.cart.balanceItems.map(i => i.item.id);
132
+ console.log('cart ids', balanceItemIds);
138
133
  let memberBalanceItemsStructs: BalanceItemStruct[] = [];
139
134
  let balanceItemsModels: BalanceItem[] = [];
140
135
  if (balanceItemIds.length > 0) {
@@ -154,8 +149,7 @@ export class RegisterMembersEndpoint extends Endpoint<Params, Query, Body, Respo
154
149
  [...request.body.memberIds, ...deleteRegistrationModels.map(i => i.memberId), ...balanceItemsModels.map(i => i.memberId).filter(m => m !== null)],
155
150
  );
156
151
  members = await Member.getBlobByIds(...memberIds);
157
- }
158
- else {
152
+ } else {
159
153
  // Load the user family (required to correctly calculate discounts across family members)
160
154
  members = await Member.getMembersWithRegistrationForUser(user);
161
155
  }
@@ -194,8 +188,7 @@ export class RegisterMembersEndpoint extends Endpoint<Params, Query, Body, Respo
194
188
 
195
189
  try {
196
190
  isUpdated = await updateMemberDetailsUitpasNumber(member.details);
197
- }
198
- catch (e) {
191
+ } catch (e) {
199
192
  // catch all errors
200
193
  }
201
194
 
@@ -250,8 +243,7 @@ export class RegisterMembersEndpoint extends Endpoint<Params, Query, Body, Respo
250
243
  });
251
244
  }
252
245
  }
253
- }
254
- else {
246
+ } else {
255
247
  const blob = await AuthenticatedStructures.membersBlob(members, true);
256
248
  const family = PlatformFamily.create(blob, {
257
249
  platform: await Platform.getSharedStruct(),
@@ -295,8 +287,7 @@ export class RegisterMembersEndpoint extends Endpoint<Params, Query, Body, Respo
295
287
  // Safe and important to ignore: we are only updating the outstanding amounts
296
288
  // If we would throw here, that could leak personal data (e.g. that the user uses financial support)
297
289
  request.body.totalPrice = totalPrice;
298
- }
299
- else {
290
+ } else {
300
291
  // when whoWillPay = organization/member, we should throw or the payment amount could be different / incorrect.
301
292
  // This never leaks information because in this case the user already has full access to the organization (asOrganizationId) or the member
302
293
  throw new SimpleError({
@@ -419,8 +410,7 @@ export class RegisterMembersEndpoint extends Endpoint<Params, Query, Body, Respo
419
410
 
420
411
  if (checkout.isAdminFromSameOrganization) {
421
412
  registration.sendConfirmationEmail = checkout.sendConfirmationEmail;
422
- }
423
- else {
413
+ } else {
424
414
  registration.sendConfirmationEmail = true;
425
415
  if (checkout.asOrganizationId) {
426
416
  // use group default
@@ -550,8 +540,7 @@ export class RegisterMembersEndpoint extends Endpoint<Params, Query, Body, Respo
550
540
  if (registration.payingOrganizationId) {
551
541
  // We no longer also charge the member. This has been removed, ref STA-288
552
542
  balanceItem.payingOrganizationId = registration.payingOrganizationId;
553
- }
554
- else {
543
+ } else {
555
544
  balanceItem.memberId = registration.memberId;
556
545
 
557
546
  if (!checkout.asOrganizationId) {
@@ -782,8 +771,7 @@ export class RegisterMembersEndpoint extends Endpoint<Params, Query, Body, Respo
782
771
 
783
772
  if (request.body.asOrganizationId) {
784
773
  balanceItem.payingOrganizationId = request.body.asOrganizationId;
785
- }
786
- else {
774
+ } else {
787
775
  balanceItem.userId = user.id;
788
776
 
789
777
  // Connect this to the oldest member
@@ -832,6 +820,21 @@ export class RegisterMembersEndpoint extends Endpoint<Params, Query, Body, Respo
832
820
  createdBalanceItems.push(balanceItem);
833
821
  }
834
822
 
823
+ // Apply discounts
824
+ // Automatically add discounts
825
+ /* const { price: totalPriceBefore, roundingAmount: roundingAmountBefore } = PaymentService.calculateTotalPrice({
826
+ balanceItems: mappedBalanceItems,
827
+ organization
828
+ })
829
+
830
+ await BalanceItemService.applyDiscountsToCheckout({
831
+ totalPrice: totalPriceBefore - roundingAmountBefore,
832
+ balanceItems: mappedBalanceItems,
833
+ sellingOrganizationId: organization.id,
834
+ payingOrganizationId: payingOrganization?.id,
835
+ payingUserId: user?.id
836
+ }); */
837
+
835
838
  try {
836
839
  const response = await PaymentService.createPayment({
837
840
  balanceItems: mappedBalanceItems,
@@ -844,7 +847,7 @@ export class RegisterMembersEndpoint extends Endpoint<Params, Query, Body, Respo
844
847
  createMandate: null,
845
848
  useMandate: null,
846
849
  paymentConfiguration: organization.meta.registrationPaymentConfiguration,
847
- privatePaymentConfiguration: organization.privateMeta.registrationPaymentConfiguration
850
+ privatePaymentConfiguration: organization.privateMeta.registrationPaymentConfiguration,
848
851
  });
849
852
 
850
853
  if (response) {
@@ -852,13 +855,11 @@ export class RegisterMembersEndpoint extends Endpoint<Params, Query, Body, Respo
852
855
  paymentQRCode = response.paymentQRCode;
853
856
  payment = response.payment;
854
857
  }
855
- }
856
- finally {
858
+ } finally {
857
859
  // Update cached balance items pending amount (only created balance items, because those are involved in the payment)
858
860
  await BalanceItemService.updatePaidAndPending(createdBalanceItems);
859
861
  }
860
- }
861
- else {
862
+ } else {
862
863
  // Mark as paid/valid without creating a payment
863
864
  for (const balanceItem of markValidList) {
864
865
  await BalanceItemService.markPaid(balanceItem, null, organization);
@@ -884,7 +885,7 @@ export class RegisterMembersEndpoint extends Endpoint<Params, Query, Body, Respo
884
885
  await Member.loadRegistrations(members, true);
885
886
 
886
887
  return new Response(RegisterResponse.create({
887
- payment: payment ? PaymentStruct.create(payment) : null,
888
+ payment: payment ? await AuthenticatedStructures.paymentGeneral(payment, true) : null,
888
889
  members: await AuthenticatedStructures.membersBlob(members),
889
890
  registrations: registrations.map(r => Member.getRegistrationWithTinyMemberStructure(r)),
890
891
  paymentUrl,
@@ -30,7 +30,7 @@ export class GetRegistrationInvitationsCountEndpoint extends Endpoint<Params, Qu
30
30
  async handle(request: DecodedRequest<Params, Query, Body>) {
31
31
  await Context.setOptionalOrganizationScope();
32
32
  await Context.authenticate();
33
-
33
+
34
34
  const query = await GetRegistrationInvitationsEndpoint.buildQuery(request.query);
35
35
 
36
36
  const count = await query
@@ -30,7 +30,7 @@ describe('Endpoint.GetRegistrationInvitationsEndpoint', () => {
30
30
  },
31
31
  });
32
32
 
33
- return testServer.test<PaginatedResponse<RegistrationInvitationStruct[], LimitedFilteredRequest>>(endpoint, request)
33
+ return testServer.test<PaginatedResponse<RegistrationInvitationStruct[], LimitedFilteredRequest>>(endpoint, request);
34
34
  };
35
35
 
36
36
  afterEach(async () => {
@@ -46,7 +46,7 @@ describe('Endpoint.GetRegistrationInvitationsEndpoint', () => {
46
46
  const group2 = await new GroupFactory({ organization, name: new TranslatedString(groupName) }).create();
47
47
 
48
48
  const resources = new Map();
49
-
49
+
50
50
  resources.set(
51
51
  PermissionsResourceType.Groups, new Map([[
52
52
  group.id,
@@ -55,31 +55,31 @@ describe('Endpoint.GetRegistrationInvitationsEndpoint', () => {
55
55
  }),
56
56
  ]]),
57
57
  );
58
-
58
+
59
59
  const user = await new UserFactory({
60
60
  organization,
61
61
  permissions: Permissions.create({
62
- level: PermissionLevel.None,
63
- resources,
64
- }),
62
+ level: PermissionLevel.None,
63
+ resources,
64
+ }),
65
65
  }).create();
66
66
 
67
67
  const member = await new MemberFactory({
68
68
  organization, user,
69
69
  firstName: 'John',
70
70
  lastName: 'Doe',
71
- birthDay: {year: 1994, month: 6, day: 24}
71
+ birthDay: { year: 1994, month: 6, day: 24 },
72
72
  }).create();
73
73
 
74
74
  const member2 = await new MemberFactory({
75
75
  organization, user,
76
76
  firstName: 'Test1',
77
77
  lastName: 'Test1',
78
- birthDay: {year: 1998, month: 3, day: 1}
78
+ birthDay: { year: 1998, month: 3, day: 1 },
79
79
  }).create();
80
80
 
81
81
  // invitations for group
82
- await new RegistrationInvitationFactory({ group, member, organization }).create();
82
+ await new RegistrationInvitationFactory({ group, member, organization }).create();
83
83
  await new RegistrationInvitationFactory({ group, member: member2, organization }).create();
84
84
 
85
85
  // invitations for other group
@@ -94,7 +94,7 @@ describe('Endpoint.GetRegistrationInvitationsEndpoint', () => {
94
94
  // assert
95
95
  expect(response.status).toBe(200);
96
96
  expect(response.body.results).toHaveLength(2);
97
- expect(response.body.results.map((r) => r.id)).not.toContain(invitationForOtherGroup.id);
97
+ expect(response.body.results.map(r => r.id)).not.toContain(invitationForOtherGroup.id);
98
98
  });
99
99
 
100
100
  test('cannot read invitations for other group', async () => {
@@ -104,7 +104,7 @@ describe('Endpoint.GetRegistrationInvitationsEndpoint', () => {
104
104
  const group2 = await new GroupFactory({ organization, name: new TranslatedString(groupName) }).create();
105
105
 
106
106
  const resources = new Map();
107
-
107
+
108
108
  resources.set(
109
109
  PermissionsResourceType.Groups, new Map([[
110
110
  group.id,
@@ -113,31 +113,31 @@ describe('Endpoint.GetRegistrationInvitationsEndpoint', () => {
113
113
  }),
114
114
  ]]),
115
115
  );
116
-
116
+
117
117
  const user = await new UserFactory({
118
118
  organization,
119
119
  permissions: Permissions.create({
120
- level: PermissionLevel.None,
121
- resources,
122
- }),
120
+ level: PermissionLevel.None,
121
+ resources,
122
+ }),
123
123
  }).create();
124
124
 
125
125
  const member = await new MemberFactory({
126
126
  organization, user,
127
127
  firstName: 'John',
128
128
  lastName: 'Doe',
129
- birthDay: {year: 1994, month: 6, day: 24}
129
+ birthDay: { year: 1994, month: 6, day: 24 },
130
130
  }).create();
131
131
 
132
132
  const member2 = await new MemberFactory({
133
133
  organization, user,
134
134
  firstName: 'Test1',
135
135
  lastName: 'Test1',
136
- birthDay: {year: 1998, month: 3, day: 1}
136
+ birthDay: { year: 1998, month: 3, day: 1 },
137
137
  }).create();
138
138
 
139
139
  // invitations for group
140
- await new RegistrationInvitationFactory({ group, member, organization }).create();
140
+ await new RegistrationInvitationFactory({ group, member, organization }).create();
141
141
  await new RegistrationInvitationFactory({ group, member: member2, organization }).create();
142
142
 
143
143
  // invitations for other group
@@ -146,7 +146,7 @@ describe('Endpoint.GetRegistrationInvitationsEndpoint', () => {
146
146
  // assert
147
147
  await expect(getInvitations({
148
148
  filter: {
149
- groupId: group2.id
149
+ groupId: group2.id,
150
150
  },
151
151
  organization,
152
152
  user,
@@ -160,7 +160,7 @@ describe('Endpoint.GetRegistrationInvitationsEndpoint', () => {
160
160
  const groupName = 'test groep';
161
161
  const group = await new GroupFactory({ organization, name: new TranslatedString(groupName) }).create();
162
162
  const group2 = await new GroupFactory({ organization, name: new TranslatedString(groupName) }).create();
163
-
163
+
164
164
  const user = await new UserFactory({
165
165
  organization,
166
166
  permissions: Permissions.create({ level: PermissionLevel.Read }),
@@ -170,21 +170,21 @@ describe('Endpoint.GetRegistrationInvitationsEndpoint', () => {
170
170
  organization, user,
171
171
  firstName: 'John',
172
172
  lastName: 'Doe',
173
- birthDay: {year: 1994, month: 6, day: 24}
173
+ birthDay: { year: 1994, month: 6, day: 24 },
174
174
  }).create();
175
175
 
176
176
  const member2 = await new MemberFactory({
177
177
  organization, user,
178
178
  firstName: 'Test1',
179
179
  lastName: 'Test1',
180
- birthDay: {year: 1998, month: 3, day: 1}
180
+ birthDay: { year: 1998, month: 3, day: 1 },
181
181
  }).create();
182
182
 
183
183
  const organization2 = await new OrganizationFactory({}).create();
184
184
  const groupOfOtherOrganization = await new GroupFactory({ organization: organization2 }).create();
185
185
 
186
186
  // invitations for group
187
- await new RegistrationInvitationFactory({ group, member, organization }).create();
187
+ await new RegistrationInvitationFactory({ group, member, organization }).create();
188
188
  await new RegistrationInvitationFactory({ group, member: member2, organization }).create();
189
189
 
190
190
  // invitations for other group
@@ -194,7 +194,7 @@ describe('Endpoint.GetRegistrationInvitationsEndpoint', () => {
194
194
  const invitationForOtherOrganization = await new RegistrationInvitationFactory({
195
195
  group: groupOfOtherOrganization,
196
196
  member,
197
- organization: organization2
197
+ organization: organization2,
198
198
  }).create();
199
199
 
200
200
  const response = await getInvitations({
@@ -207,15 +207,15 @@ describe('Endpoint.GetRegistrationInvitationsEndpoint', () => {
207
207
  expect(response.status).toBe(200);
208
208
  // should only include registrations for organization of user
209
209
  expect(response.body.results).toHaveLength(3);
210
- expect(response.body.results.map((r) => r.id)).not.toContain(invitationForOtherOrganization.id);
210
+ expect(response.body.results.map(r => r.id)).not.toContain(invitationForOtherOrganization.id);
211
211
  });
212
212
 
213
213
  test('cannot read invitations for other organization', async () => {
214
- const organization = await new OrganizationFactory({}).create();
214
+ const organization = await new OrganizationFactory({}).create();
215
215
  const groupName = 'test groep';
216
216
  const group = await new GroupFactory({ organization, name: new TranslatedString(groupName) }).create();
217
217
  const group2 = await new GroupFactory({ organization, name: new TranslatedString(groupName) }).create();
218
-
218
+
219
219
  const user = await new UserFactory({
220
220
  organization,
221
221
  permissions: Permissions.create({ level: PermissionLevel.Read }),
@@ -225,21 +225,21 @@ describe('Endpoint.GetRegistrationInvitationsEndpoint', () => {
225
225
  organization, user,
226
226
  firstName: 'John',
227
227
  lastName: 'Doe',
228
- birthDay: {year: 1994, month: 6, day: 24}
228
+ birthDay: { year: 1994, month: 6, day: 24 },
229
229
  }).create();
230
230
 
231
231
  const member2 = await new MemberFactory({
232
232
  organization, user,
233
233
  firstName: 'Test1',
234
234
  lastName: 'Test1',
235
- birthDay: {year: 1998, month: 3, day: 1}
235
+ birthDay: { year: 1998, month: 3, day: 1 },
236
236
  }).create();
237
237
 
238
238
  const organization2 = await new OrganizationFactory({}).create();
239
239
  const groupOfOtherOrganization = await new GroupFactory({ organization: organization2 }).create();
240
240
 
241
241
  // invitations for group
242
- await new RegistrationInvitationFactory({ group, member, organization }).create();
242
+ await new RegistrationInvitationFactory({ group, member, organization }).create();
243
243
  await new RegistrationInvitationFactory({ group, member: member2, organization }).create();
244
244
 
245
245
  // invitations for other group
@@ -249,12 +249,12 @@ describe('Endpoint.GetRegistrationInvitationsEndpoint', () => {
249
249
  await new RegistrationInvitationFactory({
250
250
  group: groupOfOtherOrganization,
251
251
  member,
252
- organization: organization2
252
+ organization: organization2,
253
253
  }).create();
254
254
 
255
255
  const response = await getInvitations({
256
256
  filter: {
257
- organizationId: organization2.id
257
+ organizationId: organization2.id,
258
258
  },
259
259
  organization,
260
260
  user,
@@ -270,13 +270,13 @@ describe('Endpoint.GetRegistrationInvitationsEndpoint', () => {
270
270
  beforeEach(async () => {
271
271
  TestUtils.setEnvironment('userMode', 'platform');
272
272
  });
273
-
273
+
274
274
  test('can read all invitations for read access for platform', async () => {
275
275
  const organization = await new OrganizationFactory({}).create();
276
276
  const groupName = 'test groep';
277
277
  const group = await new GroupFactory({ organization, name: new TranslatedString(groupName) }).create();
278
278
  const group2 = await new GroupFactory({ organization, name: new TranslatedString(groupName) }).create();
279
-
279
+
280
280
  const user = await new UserFactory({
281
281
  globalPermissions: Permissions.create({ level: PermissionLevel.Read }),
282
282
  }).create();
@@ -285,21 +285,21 @@ describe('Endpoint.GetRegistrationInvitationsEndpoint', () => {
285
285
  organization, user,
286
286
  firstName: 'John',
287
287
  lastName: 'Doe',
288
- birthDay: {year: 1994, month: 6, day: 24}
288
+ birthDay: { year: 1994, month: 6, day: 24 },
289
289
  }).create();
290
290
 
291
291
  const member2 = await new MemberFactory({
292
292
  organization, user,
293
293
  firstName: 'Test1',
294
294
  lastName: 'Test1',
295
- birthDay: {year: 1998, month: 3, day: 1}
295
+ birthDay: { year: 1998, month: 3, day: 1 },
296
296
  }).create();
297
297
 
298
298
  const organization2 = await new OrganizationFactory({}).create();
299
299
  const groupOfOtherOrganization = await new GroupFactory({ organization: organization2 }).create();
300
300
 
301
301
  // invitations for group
302
- await new RegistrationInvitationFactory({ group, member, organization }).create();
302
+ await new RegistrationInvitationFactory({ group, member, organization }).create();
303
303
  await new RegistrationInvitationFactory({ group, member: member2, organization }).create();
304
304
 
305
305
  // invitations for other group
@@ -309,7 +309,7 @@ describe('Endpoint.GetRegistrationInvitationsEndpoint', () => {
309
309
  const invitationForOtherOrganization = await new RegistrationInvitationFactory({
310
310
  group: groupOfOtherOrganization,
311
311
  member,
312
- organization: organization2
312
+ organization: organization2,
313
313
  }).create();
314
314
 
315
315
  const response = await getInvitations({
@@ -322,7 +322,7 @@ describe('Endpoint.GetRegistrationInvitationsEndpoint', () => {
322
322
  expect(response.status).toBe(200);
323
323
  // should only include registrations for organization of user
324
324
  expect(response.body.results).toHaveLength(4);
325
- expect(response.body.results.map((r) => r.id)).toContain(invitationForOtherOrganization.id);
325
+ expect(response.body.results.map(r => r.id)).toContain(invitationForOtherOrganization.id);
326
326
  });
327
327
 
328
328
  test('can only read invitations for group with tag if only access to groups with tags', async () => {
@@ -335,7 +335,7 @@ describe('Endpoint.GetRegistrationInvitationsEndpoint', () => {
335
335
 
336
336
  organization1.periodId = period.id;
337
337
  await organization1.save();
338
-
338
+
339
339
  const groupName = 'test groep';
340
340
  const group = await new GroupFactory({ organization: organization1, name: new TranslatedString(groupName), period }).create();
341
341
  const group2 = await new GroupFactory({ organization: organization1, name: new TranslatedString(groupName), period }).create();
@@ -353,34 +353,34 @@ describe('Endpoint.GetRegistrationInvitationsEndpoint', () => {
353
353
  }),
354
354
  ]]),
355
355
  );
356
-
356
+
357
357
  const user = await new UserFactory({
358
358
  globalPermissions: Permissions.create({
359
- level: PermissionLevel.None,
360
- roles: [],
361
- resources,
362
- }),
359
+ level: PermissionLevel.None,
360
+ roles: [],
361
+ resources,
362
+ }),
363
363
  }).create();
364
364
 
365
365
  const member = await new MemberFactory({
366
366
  organization: organization1, user,
367
367
  firstName: 'John',
368
368
  lastName: 'Doe',
369
- birthDay: {year: 1994, month: 6, day: 24}
369
+ birthDay: { year: 1994, month: 6, day: 24 },
370
370
  }).create();
371
371
 
372
372
  const member2 = await new MemberFactory({
373
373
  organization: organization1, user,
374
374
  firstName: 'Test1',
375
375
  lastName: 'Test1',
376
- birthDay: {year: 1998, month: 3, day: 1}
376
+ birthDay: { year: 1998, month: 3, day: 1 },
377
377
  }).create();
378
378
 
379
- const organization2 = await new OrganizationFactory({tags: [tag], period}).create();
379
+ const organization2 = await new OrganizationFactory({ tags: [tag], period }).create();
380
380
  const groupOfOtherOrganization = await new GroupFactory({ organization: organization2, period }).create();
381
381
 
382
382
  // invitations for group
383
- await new RegistrationInvitationFactory({ group, member, organization: organization1 }).create();
383
+ await new RegistrationInvitationFactory({ group, member, organization: organization1 }).create();
384
384
  await new RegistrationInvitationFactory({ group, member: member2, organization: organization1 }).create();
385
385
 
386
386
  // invitations for other group
@@ -390,7 +390,7 @@ describe('Endpoint.GetRegistrationInvitationsEndpoint', () => {
390
390
  const invitationForOtherOrganization = await new RegistrationInvitationFactory({
391
391
  group: groupOfOtherOrganization,
392
392
  member,
393
- organization: organization2
393
+ organization: organization2,
394
394
  }).create();
395
395
 
396
396
  const response = await getInvitations({
@@ -404,7 +404,7 @@ describe('Endpoint.GetRegistrationInvitationsEndpoint', () => {
404
404
  expect(response.status).toBe(200);
405
405
  // should only include registrations for organization of user
406
406
  expect(response.body.results).toHaveLength(1);
407
- expect(response.body.results.map((r) => r.id)).toContain(invitationForOtherOrganization.id);
407
+ expect(response.body.results.map(r => r.id)).toContain(invitationForOtherOrganization.id);
408
408
 
409
409
  // should not have access to all invitations of organization1
410
410
  await expect(getInvitations({
@@ -425,7 +425,7 @@ describe('Endpoint.GetRegistrationInvitationsEndpoint', () => {
425
425
 
426
426
  organization.periodId = period.id;
427
427
  await organization.save();
428
-
428
+
429
429
  const groupName = 'test groep';
430
430
  const group = await new GroupFactory({ organization, name: new TranslatedString(groupName), period }).create();
431
431
  const group2 = await new GroupFactory({ organization, name: new TranslatedString(groupName), period }).create();
@@ -443,34 +443,34 @@ describe('Endpoint.GetRegistrationInvitationsEndpoint', () => {
443
443
  }),
444
444
  ]]),
445
445
  );
446
-
446
+
447
447
  const user = await new UserFactory({
448
448
  globalPermissions: Permissions.create({
449
- level: PermissionLevel.None,
450
- roles: [],
451
- resources,
452
- }),
449
+ level: PermissionLevel.None,
450
+ roles: [],
451
+ resources,
452
+ }),
453
453
  }).create();
454
454
 
455
455
  const member = await new MemberFactory({
456
456
  organization, user,
457
457
  firstName: 'John',
458
458
  lastName: 'Doe',
459
- birthDay: {year: 1994, month: 6, day: 24}
459
+ birthDay: { year: 1994, month: 6, day: 24 },
460
460
  }).create();
461
461
 
462
462
  const member2 = await new MemberFactory({
463
463
  organization, user,
464
464
  firstName: 'Test1',
465
465
  lastName: 'Test1',
466
- birthDay: {year: 1998, month: 3, day: 1}
466
+ birthDay: { year: 1998, month: 3, day: 1 },
467
467
  }).create();
468
468
 
469
- const organization2 = await new OrganizationFactory({tags: [tag], period}).create();
469
+ const organization2 = await new OrganizationFactory({ tags: [tag], period }).create();
470
470
  const groupOfOtherOrganization = await new GroupFactory({ organization: organization2, period }).create();
471
471
 
472
472
  // invitations for group
473
- await new RegistrationInvitationFactory({ group, member, organization }).create();
473
+ await new RegistrationInvitationFactory({ group, member, organization }).create();
474
474
  await new RegistrationInvitationFactory({ group, member: member2, organization }).create();
475
475
 
476
476
  // invitations for other group
@@ -480,7 +480,7 @@ describe('Endpoint.GetRegistrationInvitationsEndpoint', () => {
480
480
  await new RegistrationInvitationFactory({
481
481
  group: groupOfOtherOrganization,
482
482
  member,
483
- organization: organization2
483
+ organization: organization2,
484
484
  }).create();
485
485
 
486
486
  await expect(getInvitations({
@@ -491,5 +491,4 @@ describe('Endpoint.GetRegistrationInvitationsEndpoint', () => {
491
491
  });
492
492
  });
493
493
  });
494
-
495
494
  });
@@ -56,11 +56,11 @@ export class GetRegistrationInvitationsEndpoint extends Endpoint<Params, Query,
56
56
  const platform = await Platform.getShared();
57
57
 
58
58
  // Add organization scope filter
59
- scopeFilter = {
59
+ scopeFilter = {
60
60
  group: {
61
61
  $elemMatch: {
62
62
  periodId: platform.periodIdIfPlatform,
63
- }
63
+ },
64
64
  },
65
65
  organization: {
66
66
  $elemMatch: {
@@ -82,20 +82,18 @@ export class GetRegistrationInvitationsEndpoint extends Endpoint<Params, Query,
82
82
  scopeFilter = {
83
83
  organizationId: organization.id,
84
84
  };
85
- }
86
- else {
85
+ } else {
87
86
  // Can only access current period
88
87
  scopeFilter = {
89
88
  organizationId: organization.id,
90
89
  group: {
91
90
  $elemMatch: {
92
91
  periodId: organization.periodId,
93
- }
92
+ },
94
93
  },
95
94
  };
96
95
  }
97
- }
98
- else {
96
+ } else {
99
97
  const groups = await Group.getAll(organization.id, organization.periodId, true, [GroupType.Membership, GroupType.EventRegistration]);
100
98
  Context.auth.cacheGroups(groups);
101
99
  const groupIds: string[] = [];
@@ -163,8 +161,7 @@ export class GetRegistrationInvitationsEndpoint extends Endpoint<Params, Query,
163
161
 
164
162
  try {
165
163
  data = await query.fetch();
166
- }
167
- catch (error) {
164
+ } catch (error) {
168
165
  if (error.message.includes('ER_QUERY_TIMEOUT')) {
169
166
  throw new SimpleError({
170
167
  code: 'timeout',