@stamhoofd/backend 2.120.6 → 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 (434) hide show
  1. package/output-2.txt +1 -0
  2. package/output.txt +1 -0
  3. package/package.json +70 -53
  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 +46 -0
  8. package/src/audit-logs/init.ts +9 -1
  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 +7 -0
  19. package/src/crons/invoices.ts +160 -0
  20. package/src/crons/members-fees.ts +50 -0
  21. package/src/crons/mollie-chargebacks.ts +86 -0
  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 +54 -74
  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 +87 -46
  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 +51 -0
  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 +32 -13
  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 +38 -33
  122. package/src/endpoints/global/registration-invitations/GetRegistrationInvitationsCountEndpoint.ts +45 -0
  123. package/src/endpoints/global/registration-invitations/GetRegistrationInvitationsEndpoint.test.ts +494 -0
  124. package/src/endpoints/global/registration-invitations/GetRegistrationInvitationsEndpoint.ts +213 -0
  125. package/src/endpoints/global/registration-invitations/PatchRegistrationInvitationsEndpoint.test.ts +404 -0
  126. package/src/endpoints/global/registration-invitations/PatchRegistrationInvitationsEndpoint.ts +167 -0
  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 +19 -6
  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/{global → organization/dashboard}/billing/DeactivatePackageEndpoint.ts +4 -9
  142. package/src/endpoints/organization/dashboard/billing/DeleteOrganizationMandateEndpoint.ts +62 -0
  143. package/src/endpoints/organization/dashboard/billing/GetOrganizationDetailedPayableBalanceCollectionEndpoint.ts +56 -0
  144. package/src/endpoints/organization/dashboard/billing/GetOrganizationDetailedPayableBalanceEndpoint.ts +41 -18
  145. package/src/endpoints/organization/dashboard/billing/GetOrganizationMandatesEndpoint.ts +64 -0
  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 +12 -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 +311 -0
  152. package/src/endpoints/organization/dashboard/billing/PatchOrganizationMandatesEndpoint.ts +94 -0
  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 +15 -4
  168. package/src/endpoints/organization/dashboard/invoices/PatchInvoicesEndpoint.ts +11 -2
  169. package/src/endpoints/organization/dashboard/mollie/CheckMollieEndpoint.ts +8 -8
  170. package/src/endpoints/organization/dashboard/mollie/ConnectMollieEndpoint.ts +10 -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 +67 -20
  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 +24 -17
  185. package/src/endpoints/organization/dashboard/receivable-balances/ChargeReceivableBalancesEndpoint.ts +134 -0
  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 +32 -22
  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 +29 -8
  215. package/src/endpoints/organization/dashboard/webshops/PatchWebshopOrdersEndpoint.ts +21 -28
  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 +15 -13
  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 +28 -50
  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 +60 -65
  246. package/src/helpers/AuthenticatedStructures.ts +153 -51
  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 +21 -0
  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 +741 -0
  268. package/src/helpers/RecordAnswerHelper.ts +116 -0
  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 +15 -38
  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 +11 -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/migrations/1750090030-records-configuration.ts +92 -0
  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 +95 -27
  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/1779121239-default-invoice-email-template.sql +3 -0
  300. package/src/migrations/1779121240-invoice-email-template.sql +6 -0
  301. package/src/migrations/1779986893-default-payment-failed-email-templates.sql +4 -0
  302. package/src/migrations/1780578166-convert-legacy-billing.ts +13 -0
  303. package/src/{seeds/1755876819-remove-duplicate-members.ts → migrations/1780665426-remove-duplicate-members.ts} +23 -4
  304. package/src/migrations/1780933598-document-groups.ts +88 -0
  305. package/src/migrations/1781692342-balance-item-relations.ts +13 -0
  306. package/src/migrations/1781857866-platform-admins.ts +103 -0
  307. package/src/migrations/1781857867-rm-old-platform-admins.ts +25 -0
  308. package/src/seeds/0000000001-throw.ts +5 -0
  309. package/src/seeds/1760702452-update-balance-price-paid.ts +19 -0
  310. package/src/seeds/1760702453-update-balance-invoiced.ts +19 -0
  311. package/src/seeds/1760702454-update-cached-outstanding-balance-from-items.ts +51 -14
  312. package/src/seeds/1773754928-force-save-members.ts +41 -8
  313. package/src/seeds/1780665427-schedule-stock-updates.ts +45 -0
  314. package/src/seeds/1780665428-group-update-occupancy.ts +31 -0
  315. package/src/seeds/1780915001-fill-payment-customer.ts +70 -0
  316. package/src/seeds/1780915002-update-orders.ts +39 -0
  317. package/src/seeds/1782047708-organization-company-address.ts +44 -0
  318. package/src/seeds-temporary/1769088653-uitpas-status.ts +1 -2
  319. package/src/seeds-temporary/1780416000-migrate-audit-log-legacy-enums.test.ts +69 -0
  320. package/src/seeds-temporary/1780416000-migrate-audit-log-legacy-enums.ts +85 -0
  321. package/src/services/AuditLogService.test.ts +51 -0
  322. package/src/services/AuditLogService.ts +45 -0
  323. package/src/services/BalanceItemService.ts +148 -55
  324. package/src/services/CpuService.ts +3 -6
  325. package/src/services/DatabaseCollationService.test.ts +1 -2
  326. package/src/services/DocumentService.ts +1 -2
  327. package/src/services/EventNotificationService.ts +1 -1
  328. package/src/services/FileSignService.ts +2 -4
  329. package/src/services/InvoicePdfService.ts +286 -0
  330. package/src/services/InvoiceService.ts +330 -77
  331. package/src/services/InvoiceXMLService.ts +424 -0
  332. package/src/services/MemberNumberService.ts +6 -11
  333. package/src/services/MemberRecordStore.ts +8 -10
  334. package/src/services/MollieService.ts +530 -0
  335. package/src/services/PaymentMandateService.ts +214 -0
  336. package/src/services/PaymentReallocationService.test.ts +1 -1
  337. package/src/services/PaymentReallocationService.ts +7 -9
  338. package/src/services/PaymentService.ts +820 -328
  339. package/src/services/PlatformMembershipService.ts +5 -9
  340. package/src/services/ReferralService.ts +223 -0
  341. package/src/services/RegistrationService.ts +125 -54
  342. package/src/services/SSOService.test.ts +119 -0
  343. package/src/services/SSOService.ts +56 -49
  344. package/src/services/STPackageService.ts +97 -68
  345. package/src/services/UniqueMemberNumberService.ts +69 -0
  346. package/src/services/UniqueUserService.ts +3 -6
  347. package/src/services/VATService.ts +85 -0
  348. package/src/services/data/invoice.hbs.html +686 -0
  349. package/src/services/uitpas/PassholderEndpoints.ts +3 -6
  350. package/src/services/uitpas/UitpasService.ts +6 -10
  351. package/src/services/uitpas/checkUitpasNumbers.ts +2 -4
  352. package/src/services/uitpas/getSocialTariffForUitpasNumbers.ts +3 -6
  353. package/src/services/uitpas/searchUitpasEvents.ts +1 -2
  354. package/src/sql-filters/audit-logs.ts +1 -1
  355. package/src/sql-filters/balance-item-payments.ts +1 -1
  356. package/src/sql-filters/balance-items.ts +1 -1
  357. package/src/sql-filters/base-registration-filter-compilers.ts +5 -33
  358. package/src/sql-filters/document-templates.ts +1 -1
  359. package/src/sql-filters/documents.ts +1 -1
  360. package/src/sql-filters/email-recipients.ts +1 -1
  361. package/src/sql-filters/emails.ts +1 -1
  362. package/src/sql-filters/event-notifications.ts +1 -1
  363. package/src/sql-filters/events.ts +6 -1
  364. package/src/sql-filters/groups.ts +16 -1
  365. package/src/sql-filters/invoiced-balance-items.ts +1 -1
  366. package/src/sql-filters/invoices.ts +1 -1
  367. package/src/sql-filters/member-responsibility-records.ts +1 -1
  368. package/src/sql-filters/members.ts +1 -1
  369. package/src/sql-filters/orders.ts +4 -4
  370. package/src/sql-filters/organization-registration-periods.ts +1 -1
  371. package/src/sql-filters/organizations.ts +1 -1
  372. package/src/sql-filters/payments.ts +5 -0
  373. package/src/sql-filters/platform-memberships.ts +3 -3
  374. package/src/sql-filters/receivable-balances.ts +1 -1
  375. package/src/sql-filters/registration-invitations.ts +90 -0
  376. package/src/sql-filters/registration-periods.ts +1 -1
  377. package/src/sql-filters/registrations.ts +1 -1
  378. package/src/sql-filters/tickets.ts +1 -1
  379. package/src/sql-filters/users.ts +1 -1
  380. package/src/sql-sorters/groups.ts +23 -0
  381. package/src/sql-sorters/platform-memberships.ts +16 -16
  382. package/src/sql-sorters/registration-invitations.ts +36 -0
  383. package/tests/actions/patchOrganizationMember.ts +1 -1
  384. package/tests/actions/patchUserMember.ts +1 -1
  385. package/tests/assertions/assertBalances.ts +6 -12
  386. package/tests/e2e/api-rate-limits.test.ts +12 -24
  387. package/tests/e2e/bundle-discounts.test.ts +4 -1
  388. package/tests/e2e/charge-members.test.ts +13 -11
  389. package/tests/e2e/documents.test.ts +4 -1
  390. package/tests/e2e/register.test.ts +7 -9
  391. package/tests/e2e/stock.test.ts +4 -3
  392. package/tests/e2e/tickets.test.ts +1 -1
  393. package/tests/helpers/MollieMocker.ts +462 -0
  394. package/tests/helpers/PayconiqMocker.ts +138 -45
  395. package/tests/helpers/StripeMocker.ts +9 -6
  396. package/tests/helpers/index.ts +4 -0
  397. package/tests/init/initAdmin.ts +2 -2
  398. package/tests/init/initBundleDiscount.ts +1 -1
  399. package/tests/init/initMembershipOrganization.ts +13 -0
  400. package/tests/init/initPermissionRole.ts +3 -4
  401. package/tests/vitest.global.setup.ts +1 -1
  402. package/vitest.config.js +7 -0
  403. package/.nvmrc +0 -1
  404. package/src/endpoints/global/billing/ActivatePackagesEndpoint.ts +0 -216
  405. package/src/helpers/GroupBuilder.ts +0 -418
  406. package/src/seeds/0000000000-example.ts +0 -11
  407. package/src/seeds/1722256498-group-update-occupancy.ts +0 -52
  408. package/src/seeds/1726572303-schedule-stock-updates.ts +0 -52
  409. package/src/seeds/1726847064-setup-steps.ts +0 -16
  410. package/src/seeds/1728928974-update-cached-outstanding-balance-from-items.ts +0 -31
  411. package/src/seeds/1729253172-update-orders.ts +0 -21
  412. package/src/seeds/1733319079-fill-paying-organization-ids.ts +0 -68
  413. package/src/seeds/1733748412-update-deleted-order-numbers.ts +0 -109
  414. package/src/seeds/1733994455-balance-item-status-open.ts +0 -30
  415. package/src/seeds/1740046783-update-membership.ts +0 -17
  416. package/src/seeds/1741008870-fix-auditlog-description.ts +0 -50
  417. package/src/seeds/1741011468-fix-auditlog-description-uft16.ts +0 -88
  418. package/src/seeds/1741268179-fix-group-dates-of-events.ts +0 -32
  419. package/src/seeds/1750090030-records-configuration.ts +0 -26
  420. package/src/seeds/1751445358-upload-email-attachments.ts +0 -106
  421. package/src/seeds/1755532883-update-email-sender-ids.ts +0 -47
  422. package/src/seeds/1755790070-fill-email-recipient-errors.ts +0 -96
  423. package/src/seeds/1756115432-remove-old-drafts.ts +0 -16
  424. package/src/seeds/1756115433-fill-email-recipient-organization-id.ts +0 -30
  425. package/src/seeds/1756303697-update-email-counts.ts +0 -76
  426. package/src/seeds/1761665607-sync-member-users.ts +0 -59
  427. package/src/seeds/1765896674-document-update-year.ts +0 -66
  428. /package/src/{seeds → migrations}/0000000001-development-user.ts +0 -0
  429. /package/src/{seeds → migrations}/0000000002-clear-stamhoofd-email-templates.ts +0 -0
  430. /package/src/{seeds → migrations}/0000000003-default-email-templates.ts +0 -0
  431. /package/src/{seeds → migrations}/1752848561-groups-registration-periods.test.ts +0 -0
  432. /package/src/{seeds → migrations}/1766150402-document-published-at.test.ts +0 -0
  433. /package/src/{seeds → migrations}/1766150402-document-published-at.ts +0 -0
  434. /package/src/{seeds → migrations}/data/default-email-templates.sql +0 -0
@@ -0,0 +1,494 @@
1
+ import { Request } from '@simonbackx/simple-endpoints';
2
+ import type { Organization, User } from '@stamhoofd/models';
3
+ import { GroupFactory, MemberFactory, OrganizationFactory, RegistrationInvitation, RegistrationInvitationFactory, RegistrationPeriodFactory, Token, UserFactory } from '@stamhoofd/models';
4
+ import type { PaginatedResponse, RegistrationInvitation as RegistrationInvitationStruct, StamhoofdFilter } from '@stamhoofd/structures';
5
+ import { LimitedFilteredRequest, PermissionLevel, Permissions, PermissionsResourceType, ResourcePermissions, TranslatedString } from '@stamhoofd/structures';
6
+ import { TestUtils } from '@stamhoofd/test-utils';
7
+ import { testServer } from '../../../../tests/helpers/TestServer.js';
8
+ import { GetRegistrationInvitationsEndpoint } from './GetRegistrationInvitationsEndpoint.js';
9
+
10
+ describe('Endpoint.GetRegistrationInvitationsEndpoint', () => {
11
+ const endpoint = new GetRegistrationInvitationsEndpoint();
12
+
13
+ const getInvitations = async ({ filter, organization, user }: { filter: StamhoofdFilter; organization: Organization | null; user: User | null }) => {
14
+ let authorization = '';
15
+
16
+ if (user) {
17
+ const token = await Token.createToken(user);
18
+ authorization = 'Bearer ' + token.accessToken;
19
+ }
20
+
21
+ const request = Request.get({
22
+ path: '/registration-invitations',
23
+ host: organization?.getApiHost(),
24
+ query: new LimitedFilteredRequest({
25
+ filter,
26
+ limit: 10,
27
+ }),
28
+ headers: {
29
+ authorization,
30
+ },
31
+ });
32
+
33
+ return testServer.test<PaginatedResponse<RegistrationInvitationStruct[], LimitedFilteredRequest>>(endpoint, request);
34
+ };
35
+
36
+ afterEach(async () => {
37
+ await RegistrationInvitation.delete();
38
+ });
39
+
40
+ describe('Permission checking', () => {
41
+ describe('read access for specific group', () => {
42
+ test('should only return invitations for that group', async () => {
43
+ const organization = await new OrganizationFactory({}).create();
44
+ const groupName = 'test groep';
45
+ const group = await new GroupFactory({ organization, name: new TranslatedString(groupName) }).create();
46
+ const group2 = await new GroupFactory({ organization, name: new TranslatedString(groupName) }).create();
47
+
48
+ const resources = new Map();
49
+
50
+ resources.set(
51
+ PermissionsResourceType.Groups, new Map([[
52
+ group.id,
53
+ ResourcePermissions.create({
54
+ level: PermissionLevel.Write,
55
+ }),
56
+ ]]),
57
+ );
58
+
59
+ const user = await new UserFactory({
60
+ organization,
61
+ permissions: Permissions.create({
62
+ level: PermissionLevel.None,
63
+ resources,
64
+ }),
65
+ }).create();
66
+
67
+ const member = await new MemberFactory({
68
+ organization, user,
69
+ firstName: 'John',
70
+ lastName: 'Doe',
71
+ birthDay: { year: 1994, month: 6, day: 24 },
72
+ }).create();
73
+
74
+ const member2 = await new MemberFactory({
75
+ organization, user,
76
+ firstName: 'Test1',
77
+ lastName: 'Test1',
78
+ birthDay: { year: 1998, month: 3, day: 1 },
79
+ }).create();
80
+
81
+ // invitations for group
82
+ await new RegistrationInvitationFactory({ group, member, organization }).create();
83
+ await new RegistrationInvitationFactory({ group, member: member2, organization }).create();
84
+
85
+ // invitations for other group
86
+ const invitationForOtherGroup = await new RegistrationInvitationFactory({ group: group2, member, organization }).create();
87
+
88
+ const response = await getInvitations({
89
+ filter: null,
90
+ organization,
91
+ user,
92
+ });
93
+
94
+ // assert
95
+ expect(response.status).toBe(200);
96
+ expect(response.body.results).toHaveLength(2);
97
+ expect(response.body.results.map(r => r.id)).not.toContain(invitationForOtherGroup.id);
98
+ });
99
+
100
+ test('cannot read invitations for other group', async () => {
101
+ const organization = await new OrganizationFactory({}).create();
102
+ const groupName = 'test groep';
103
+ const group = await new GroupFactory({ organization, name: new TranslatedString(groupName) }).create();
104
+ const group2 = await new GroupFactory({ organization, name: new TranslatedString(groupName) }).create();
105
+
106
+ const resources = new Map();
107
+
108
+ resources.set(
109
+ PermissionsResourceType.Groups, new Map([[
110
+ group.id,
111
+ ResourcePermissions.create({
112
+ level: PermissionLevel.Write,
113
+ }),
114
+ ]]),
115
+ );
116
+
117
+ const user = await new UserFactory({
118
+ organization,
119
+ permissions: Permissions.create({
120
+ level: PermissionLevel.None,
121
+ resources,
122
+ }),
123
+ }).create();
124
+
125
+ const member = await new MemberFactory({
126
+ organization, user,
127
+ firstName: 'John',
128
+ lastName: 'Doe',
129
+ birthDay: { year: 1994, month: 6, day: 24 },
130
+ }).create();
131
+
132
+ const member2 = await new MemberFactory({
133
+ organization, user,
134
+ firstName: 'Test1',
135
+ lastName: 'Test1',
136
+ birthDay: { year: 1998, month: 3, day: 1 },
137
+ }).create();
138
+
139
+ // invitations for group
140
+ await new RegistrationInvitationFactory({ group, member, organization }).create();
141
+ await new RegistrationInvitationFactory({ group, member: member2, organization }).create();
142
+
143
+ // invitations for other group
144
+ await new RegistrationInvitationFactory({ group: group2, member, organization }).create();
145
+
146
+ // assert
147
+ await expect(getInvitations({
148
+ filter: {
149
+ groupId: group2.id,
150
+ },
151
+ organization,
152
+ user,
153
+ })).rejects.toThrow('You do not have access to this group');
154
+ });
155
+ });
156
+
157
+ describe('read access for specific organization', () => {
158
+ test('can read invitations for any group of organization', async () => {
159
+ const organization = await new OrganizationFactory({}).create();
160
+ const groupName = 'test groep';
161
+ const group = await new GroupFactory({ organization, name: new TranslatedString(groupName) }).create();
162
+ const group2 = await new GroupFactory({ organization, name: new TranslatedString(groupName) }).create();
163
+
164
+ const user = await new UserFactory({
165
+ organization,
166
+ permissions: Permissions.create({ level: PermissionLevel.Read }),
167
+ }).create();
168
+
169
+ const member = await new MemberFactory({
170
+ organization, user,
171
+ firstName: 'John',
172
+ lastName: 'Doe',
173
+ birthDay: { year: 1994, month: 6, day: 24 },
174
+ }).create();
175
+
176
+ const member2 = await new MemberFactory({
177
+ organization, user,
178
+ firstName: 'Test1',
179
+ lastName: 'Test1',
180
+ birthDay: { year: 1998, month: 3, day: 1 },
181
+ }).create();
182
+
183
+ const organization2 = await new OrganizationFactory({}).create();
184
+ const groupOfOtherOrganization = await new GroupFactory({ organization: organization2 }).create();
185
+
186
+ // invitations for group
187
+ await new RegistrationInvitationFactory({ group, member, organization }).create();
188
+ await new RegistrationInvitationFactory({ group, member: member2, organization }).create();
189
+
190
+ // invitations for other group
191
+ await new RegistrationInvitationFactory({ group: group2, member, organization }).create();
192
+
193
+ // invitations for other organization
194
+ const invitationForOtherOrganization = await new RegistrationInvitationFactory({
195
+ group: groupOfOtherOrganization,
196
+ member,
197
+ organization: organization2,
198
+ }).create();
199
+
200
+ const response = await getInvitations({
201
+ filter: null,
202
+ organization,
203
+ user,
204
+ });
205
+
206
+ // assert
207
+ expect(response.status).toBe(200);
208
+ // should only include registrations for organization of user
209
+ expect(response.body.results).toHaveLength(3);
210
+ expect(response.body.results.map(r => r.id)).not.toContain(invitationForOtherOrganization.id);
211
+ });
212
+
213
+ test('cannot read invitations for other organization', async () => {
214
+ const organization = await new OrganizationFactory({}).create();
215
+ const groupName = 'test groep';
216
+ const group = await new GroupFactory({ organization, name: new TranslatedString(groupName) }).create();
217
+ const group2 = await new GroupFactory({ organization, name: new TranslatedString(groupName) }).create();
218
+
219
+ const user = await new UserFactory({
220
+ organization,
221
+ permissions: Permissions.create({ level: PermissionLevel.Read }),
222
+ }).create();
223
+
224
+ const member = await new MemberFactory({
225
+ organization, user,
226
+ firstName: 'John',
227
+ lastName: 'Doe',
228
+ birthDay: { year: 1994, month: 6, day: 24 },
229
+ }).create();
230
+
231
+ const member2 = await new MemberFactory({
232
+ organization, user,
233
+ firstName: 'Test1',
234
+ lastName: 'Test1',
235
+ birthDay: { year: 1998, month: 3, day: 1 },
236
+ }).create();
237
+
238
+ const organization2 = await new OrganizationFactory({}).create();
239
+ const groupOfOtherOrganization = await new GroupFactory({ organization: organization2 }).create();
240
+
241
+ // invitations for group
242
+ await new RegistrationInvitationFactory({ group, member, organization }).create();
243
+ await new RegistrationInvitationFactory({ group, member: member2, organization }).create();
244
+
245
+ // invitations for other group
246
+ await new RegistrationInvitationFactory({ group: group2, member, organization }).create();
247
+
248
+ // invitations for other organization
249
+ await new RegistrationInvitationFactory({
250
+ group: groupOfOtherOrganization,
251
+ member,
252
+ organization: organization2,
253
+ }).create();
254
+
255
+ const response = await getInvitations({
256
+ filter: {
257
+ organizationId: organization2.id,
258
+ },
259
+ organization,
260
+ user,
261
+ });
262
+
263
+ // assert
264
+ expect(response.status).toBe(200);
265
+ expect(response.body.results).toHaveLength(0);
266
+ });
267
+ });
268
+
269
+ describe('platform permissions', () => {
270
+ beforeEach(async () => {
271
+ TestUtils.setEnvironment('userMode', 'platform');
272
+ });
273
+
274
+ test('can read all invitations for read access for platform', async () => {
275
+ const organization = await new OrganizationFactory({}).create();
276
+ const groupName = 'test groep';
277
+ const group = await new GroupFactory({ organization, name: new TranslatedString(groupName) }).create();
278
+ const group2 = await new GroupFactory({ organization, name: new TranslatedString(groupName) }).create();
279
+
280
+ const user = await new UserFactory({
281
+ globalPermissions: Permissions.create({ level: PermissionLevel.Read }),
282
+ }).create();
283
+
284
+ const member = await new MemberFactory({
285
+ organization, user,
286
+ firstName: 'John',
287
+ lastName: 'Doe',
288
+ birthDay: { year: 1994, month: 6, day: 24 },
289
+ }).create();
290
+
291
+ const member2 = await new MemberFactory({
292
+ organization, user,
293
+ firstName: 'Test1',
294
+ lastName: 'Test1',
295
+ birthDay: { year: 1998, month: 3, day: 1 },
296
+ }).create();
297
+
298
+ const organization2 = await new OrganizationFactory({}).create();
299
+ const groupOfOtherOrganization = await new GroupFactory({ organization: organization2 }).create();
300
+
301
+ // invitations for group
302
+ await new RegistrationInvitationFactory({ group, member, organization }).create();
303
+ await new RegistrationInvitationFactory({ group, member: member2, organization }).create();
304
+
305
+ // invitations for other group
306
+ await new RegistrationInvitationFactory({ group: group2, member, organization }).create();
307
+
308
+ // invitations for other organization
309
+ const invitationForOtherOrganization = await new RegistrationInvitationFactory({
310
+ group: groupOfOtherOrganization,
311
+ member,
312
+ organization: organization2,
313
+ }).create();
314
+
315
+ const response = await getInvitations({
316
+ filter: null,
317
+ organization,
318
+ user,
319
+ });
320
+
321
+ // assert
322
+ expect(response.status).toBe(200);
323
+ // should only include registrations for organization of user
324
+ expect(response.body.results).toHaveLength(4);
325
+ expect(response.body.results.map(r => r.id)).toContain(invitationForOtherOrganization.id);
326
+ });
327
+
328
+ test('can only read invitations for group with tag if only access to groups with tags', async () => {
329
+ const organization1 = await new OrganizationFactory({}).create();
330
+ const period = await new RegistrationPeriodFactory({
331
+ organization: organization1,
332
+ startDate: new Date(2023, 0, 1),
333
+ endDate: new Date(2023, 11, 31),
334
+ }).create();
335
+
336
+ organization1.periodId = period.id;
337
+ await organization1.save();
338
+
339
+ const groupName = 'test groep';
340
+ const group = await new GroupFactory({ organization: organization1, name: new TranslatedString(groupName), period }).create();
341
+ const group2 = await new GroupFactory({ organization: organization1, name: new TranslatedString(groupName), period }).create();
342
+
343
+ const resources = new Map();
344
+
345
+ const tag = 'tagtest';
346
+
347
+ resources.set(
348
+ PermissionsResourceType.OrganizationTags, new Map([[
349
+ tag,
350
+ ResourcePermissions.create({
351
+ level: PermissionLevel.Full,
352
+ accessRights: [],
353
+ }),
354
+ ]]),
355
+ );
356
+
357
+ const user = await new UserFactory({
358
+ globalPermissions: Permissions.create({
359
+ level: PermissionLevel.None,
360
+ roles: [],
361
+ resources,
362
+ }),
363
+ }).create();
364
+
365
+ const member = await new MemberFactory({
366
+ organization: organization1, user,
367
+ firstName: 'John',
368
+ lastName: 'Doe',
369
+ birthDay: { year: 1994, month: 6, day: 24 },
370
+ }).create();
371
+
372
+ const member2 = await new MemberFactory({
373
+ organization: organization1, user,
374
+ firstName: 'Test1',
375
+ lastName: 'Test1',
376
+ birthDay: { year: 1998, month: 3, day: 1 },
377
+ }).create();
378
+
379
+ const organization2 = await new OrganizationFactory({ tags: [tag], period }).create();
380
+ const groupOfOtherOrganization = await new GroupFactory({ organization: organization2, period }).create();
381
+
382
+ // invitations for group
383
+ await new RegistrationInvitationFactory({ group, member, organization: organization1 }).create();
384
+ await new RegistrationInvitationFactory({ group, member: member2, organization: organization1 }).create();
385
+
386
+ // invitations for other group
387
+ await new RegistrationInvitationFactory({ group: group2, member, organization: organization1 }).create();
388
+
389
+ // invitations for other organization
390
+ const invitationForOtherOrganization = await new RegistrationInvitationFactory({
391
+ group: groupOfOtherOrganization,
392
+ member,
393
+ organization: organization2,
394
+ }).create();
395
+
396
+ const response = await getInvitations({
397
+ filter: null,
398
+ // organization scope is required
399
+ organization: organization2,
400
+ user,
401
+ });
402
+
403
+ // assert
404
+ expect(response.status).toBe(200);
405
+ // should only include registrations for organization of user
406
+ expect(response.body.results).toHaveLength(1);
407
+ expect(response.body.results.map(r => r.id)).toContain(invitationForOtherOrganization.id);
408
+
409
+ // should not have access to all invitations of organization1
410
+ await expect(getInvitations({
411
+ filter: null,
412
+ // organization scope is required
413
+ organization: organization1,
414
+ user,
415
+ })).rejects.toThrow('You must filter on a group of the organization you are trying to access');
416
+ });
417
+
418
+ test('cannot get invitations if platform scope and no access to all organization tags', async () => {
419
+ const organization = await new OrganizationFactory({}).create();
420
+ const period = await new RegistrationPeriodFactory({
421
+ organization,
422
+ startDate: new Date(2023, 0, 1),
423
+ endDate: new Date(2023, 11, 31),
424
+ }).create();
425
+
426
+ organization.periodId = period.id;
427
+ await organization.save();
428
+
429
+ const groupName = 'test groep';
430
+ const group = await new GroupFactory({ organization, name: new TranslatedString(groupName), period }).create();
431
+ const group2 = await new GroupFactory({ organization, name: new TranslatedString(groupName), period }).create();
432
+
433
+ const resources = new Map();
434
+
435
+ const tag = 'tagtest';
436
+
437
+ resources.set(
438
+ PermissionsResourceType.OrganizationTags, new Map([[
439
+ tag,
440
+ ResourcePermissions.create({
441
+ level: PermissionLevel.Full,
442
+ accessRights: [],
443
+ }),
444
+ ]]),
445
+ );
446
+
447
+ const user = await new UserFactory({
448
+ globalPermissions: Permissions.create({
449
+ level: PermissionLevel.None,
450
+ roles: [],
451
+ resources,
452
+ }),
453
+ }).create();
454
+
455
+ const member = await new MemberFactory({
456
+ organization, user,
457
+ firstName: 'John',
458
+ lastName: 'Doe',
459
+ birthDay: { year: 1994, month: 6, day: 24 },
460
+ }).create();
461
+
462
+ const member2 = await new MemberFactory({
463
+ organization, user,
464
+ firstName: 'Test1',
465
+ lastName: 'Test1',
466
+ birthDay: { year: 1998, month: 3, day: 1 },
467
+ }).create();
468
+
469
+ const organization2 = await new OrganizationFactory({ tags: [tag], period }).create();
470
+ const groupOfOtherOrganization = await new GroupFactory({ organization: organization2, period }).create();
471
+
472
+ // invitations for group
473
+ await new RegistrationInvitationFactory({ group, member, organization }).create();
474
+ await new RegistrationInvitationFactory({ group, member: member2, organization }).create();
475
+
476
+ // invitations for other group
477
+ await new RegistrationInvitationFactory({ group: group2, member, organization }).create();
478
+
479
+ // invitations for other organization
480
+ await new RegistrationInvitationFactory({
481
+ group: groupOfOtherOrganization,
482
+ member,
483
+ organization: organization2,
484
+ }).create();
485
+
486
+ await expect(getInvitations({
487
+ filter: null,
488
+ organization: null,
489
+ user,
490
+ })).rejects.toThrow('You do not have permissions for this action');
491
+ });
492
+ });
493
+ });
494
+ });