@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
@@ -2,7 +2,7 @@ import { field } from '@simonbackx/simple-encoding';
2
2
  import type { XlsxTransformerColumn, XlsxTransformerConcreteColumn } from '@stamhoofd/excel-writer';
3
3
  import { XlsxBuiltInNumberFormat } from '@stamhoofd/excel-writer';
4
4
  import { StripeAccount } from '@stamhoofd/models';
5
- import type { BalanceItemPaymentDetailed} from '@stamhoofd/structures';
5
+ import type { BalanceItemPaymentDetailed } from '@stamhoofd/structures';
6
6
  import { BalanceItemRelationType, ExcelExportType, getBalanceItemRelationTypeName, getBalanceItemTypeName, PaginatedResponse, PaymentGeneral, PaymentMethodHelper, PaymentStatusHelper, StripeAccount as StripeAccountStruct } from '@stamhoofd/structures';
7
7
  import { Formatter } from '@stamhoofd/utility';
8
8
  import { ExportToExcelEndpoint } from '../endpoints/global/files/ExportToExcelEndpoint.js';
@@ -400,6 +400,36 @@ function getStripeColumns(): XlsxTransformerColumn<PaymentGeneral>[] {
400
400
  };
401
401
  },
402
402
  },
403
+ {
404
+ id: 'serviceFeeManual',
405
+ name: $t(`%1dO`),
406
+ width: 42,
407
+ getValue: (object: PaymentGeneralWithStripeAccount) => {
408
+ return {
409
+ value: object.serviceFeeManual / 1_0000,
410
+ style: {
411
+ numberFormat: {
412
+ id: XlsxBuiltInNumberFormat.Currency2DecimalWithRed,
413
+ },
414
+ },
415
+ };
416
+ },
417
+ },
418
+ {
419
+ id: 'serviceFeePayout',
420
+ name: $t(`%1VD`),
421
+ width: 50,
422
+ getValue: (object: PaymentGeneralWithStripeAccount) => {
423
+ return {
424
+ value: object.serviceFeePayout / 1_0000,
425
+ style: {
426
+ numberFormat: {
427
+ id: XlsxBuiltInNumberFormat.Currency2DecimalWithRed,
428
+ },
429
+ },
430
+ };
431
+ },
432
+ },
403
433
  {
404
434
  id: 'stripeAccountId',
405
435
  name: $t(`%1m`),
@@ -25,7 +25,7 @@ const sheet: XlsxTransformerSheet<PlatformMembership> = {
25
25
  getValue: (membership: PlatformMembership) => {
26
26
  const membershipType = Platform.shared.config.membershipTypes.find(m => m.id === membership.membershipTypeId);
27
27
  const value = membershipType ? membershipType.name : '';
28
- return {value};
28
+ return { value };
29
29
  },
30
30
  },
31
31
  {
@@ -66,25 +66,25 @@ const sheet: XlsxTransformerSheet<PlatformMembership> = {
66
66
  return {
67
67
  value: membership.price / 1_0000,
68
68
  style: {
69
- numberFormat: {
70
- id: XlsxBuiltInNumberFormat.Currency2DecimalWithRed,
69
+ numberFormat: {
70
+ id: XlsxBuiltInNumberFormat.Currency2DecimalWithRed,
71
+ },
71
72
  },
72
- },
73
73
  };
74
74
  },
75
75
  },
76
76
  {
77
77
  id: 'priceWithoutDiscount',
78
- name: $t(`%1Nm`),
78
+ name: $t(`%1Nm`),
79
79
  width: 10,
80
80
  getValue: (membership: PlatformMembership) => {
81
81
  return {
82
82
  value: membership.priceWithoutDiscount / 1_0000,
83
83
  style: {
84
- numberFormat: {
85
- id: XlsxBuiltInNumberFormat.Currency2DecimalWithRed,
84
+ numberFormat: {
85
+ id: XlsxBuiltInNumberFormat.Currency2DecimalWithRed,
86
+ },
86
87
  },
87
- },
88
88
  };
89
89
  },
90
90
  },
@@ -214,7 +214,7 @@ const sheet: XlsxTransformerSheet<PlatformMembership> = {
214
214
  id: 'member.firstName',
215
215
  name: $t(`%1O8`),
216
216
  width: 20,
217
- getValue:(membership: PlatformMembership) => ({
217
+ getValue: (membership: PlatformMembership) => ({
218
218
  value: membership.member.firstName,
219
219
  }),
220
220
  },
@@ -222,7 +222,7 @@ const sheet: XlsxTransformerSheet<PlatformMembership> = {
222
222
  id: 'member.lastName',
223
223
  name: $t(`%1Or`),
224
224
  width: 20,
225
- getValue:(membership: PlatformMembership) => ({
225
+ getValue: (membership: PlatformMembership) => ({
226
226
  value: membership.member.lastName,
227
227
  }),
228
228
  },
@@ -231,7 +231,7 @@ const sheet: XlsxTransformerSheet<PlatformMembership> = {
231
231
  id: 'organization.name',
232
232
  name: $t(`%1PW`),
233
233
  width: 20,
234
- getValue:(membership: PlatformMembership) => ({
234
+ getValue: (membership: PlatformMembership) => ({
235
235
  value: membership.organization.name,
236
236
  }),
237
237
  },
@@ -239,14 +239,13 @@ const sheet: XlsxTransformerSheet<PlatformMembership> = {
239
239
  id: 'organization.uri',
240
240
  name: $t(`%1PZ`),
241
241
  width: 20,
242
- getValue:(membership: PlatformMembership) => ({
242
+ getValue: (membership: PlatformMembership) => ({
243
243
  value: membership.organization.uri,
244
244
  }),
245
- }
245
+ },
246
246
  ],
247
247
  };
248
248
 
249
-
250
249
  ExportToExcelEndpoint.loaders.set(ExcelExportType.PlatformMemberships, {
251
250
  fetch: async (query: LimitedFilteredRequest) => {
252
251
  const data = await GetPlatformMembershipsEndpoint.buildData(query);
@@ -146,7 +146,7 @@ function getBalanceItemColumns(): XlsxTransformerColumn<ReceivableBalanceWithIte
146
146
  },
147
147
  {
148
148
  id: 'pricePending',
149
- name: $t(`%1PL`),
149
+ name: $t(`%1OL`),
150
150
  width: 20,
151
151
  getValue: (object: ReceivableBalanceWithItem) => ({
152
152
  value: object.balanceItem.pricePending / 1_0000,
@@ -273,7 +273,7 @@ function getGeneralColumns(): XlsxTransformerConcreteColumn<ReceivableBalance>[]
273
273
  },
274
274
  {
275
275
  id: 'amountPending',
276
- name: $t(`%1PL`),
276
+ name: $t(`%1OL`),
277
277
  width: 18,
278
278
  getValue: (object: ReceivableBalance) => ({
279
279
  value: object.amountPending / 1_0000,
@@ -1,7 +1,7 @@
1
1
  import type { XlsxTransformerSheet } from '@stamhoofd/excel-writer';
2
2
  import { XlsxBuiltInNumberFormat } from '@stamhoofd/excel-writer';
3
3
  import { Platform } from '@stamhoofd/models';
4
- import type { LimitedFilteredRequest, PlatformMember} from '@stamhoofd/structures';
4
+ import type { LimitedFilteredRequest, PlatformMember } from '@stamhoofd/structures';
5
5
  import { ExcelExportType, getGroupTypeName, PlatformRegistration, Platform as PlatformStruct, UnencodeablePaginatedResponse } from '@stamhoofd/structures';
6
6
  import { ExportToExcelEndpoint } from '../endpoints/global/files/ExportToExcelEndpoint.js';
7
7
  import { GetRegistrationsEndpoint } from '../endpoints/global/registration/GetRegistrationsEndpoint.js';
@@ -164,8 +164,7 @@ const sheet: XlsxTransformerSheet<PlatformMember, PlatformRegistration> = {
164
164
  if (registration.payingOrganizationId) {
165
165
  const organization = registration.member.organizations.find(o => o.id === registration.payingOrganizationId);
166
166
  value = organization ? organization.name : $t(`%Gr`);
167
- }
168
- else {
167
+ } else {
169
168
  value = $t(`%18s`);
170
169
  }
171
170
 
@@ -40,8 +40,7 @@ export class AddressValidatorStatic {
40
40
 
41
41
  // Don't do validation on last letters
42
42
  postalCode = numbers;
43
- }
44
- else {
43
+ } else {
45
44
  postalCode = postalCode.trim();
46
45
  }
47
46
 
@@ -50,8 +49,7 @@ export class AddressValidatorStatic {
50
49
  if (!/\d{4}/.test(numbers)) {
51
50
  postalCode = numbers;
52
51
  address.city = address.city.substring(4).trim();
53
- }
54
- else {
52
+ } else {
55
53
  throw new SimpleError({
56
54
  code: 'invalid_field',
57
55
  message: 'Postal code is required',
@@ -93,8 +91,7 @@ export class AddressValidatorStatic {
93
91
  const c = await City.getByID(city.parentCityId ?? city.id);
94
92
  try {
95
93
  await this.syncCity(c!);
96
- }
97
- catch (e) {
94
+ } catch (e) {
98
95
  console.error('Ignored error while syncing city');
99
96
  console.error(e);
100
97
  }
@@ -115,8 +112,7 @@ export class AddressValidatorStatic {
115
112
 
116
113
  if (bestStreet && bestScore < 3) {
117
114
  address.street = bestStreet.name;
118
- }
119
- else {
115
+ } else {
120
116
  // Search for the street
121
117
  bestScore = 0;
122
118
  bestStreet = undefined;
@@ -144,8 +140,7 @@ export class AddressValidatorStatic {
144
140
  field: 'street',
145
141
  });
146
142
  }
147
- }
148
- else {
143
+ } else {
149
144
  // Skip validation for some regions that don't support validation
150
145
  }
151
146
  }
@@ -180,8 +175,7 @@ export class AddressValidatorStatic {
180
175
  streetNames.push(...streets);
181
176
  url = result.volgende;
182
177
  }
183
- }
184
- catch (e) {
178
+ } catch (e) {
185
179
  console.error(e.response.data);
186
180
  throw new Error('Failed to fetch streets');
187
181
  }
@@ -238,8 +232,7 @@ export class AddressValidatorStatic {
238
232
  for (const city of cities) {
239
233
  try {
240
234
  await this.syncCity(city);
241
- }
242
- catch (e) {
235
+ } catch (e) {
243
236
  console.error('Failed city sync for ' + city.name, e);
244
237
  }
245
238
  }
@@ -8,6 +8,8 @@ import { AccessRight, EmailTemplate as EmailTemplateStruct, EventPermissionCheck
8
8
  import { Formatter } from '@stamhoofd/utility';
9
9
  import type { RecordCacheEntry } from '../services/MemberRecordStore.js';
10
10
  import { MemberRecordStore } from '../services/MemberRecordStore.js';
11
+ import { getFinancialSupportSettingsAsync } from './FinancialSupportHelper.js';
12
+ import { RecordAnswerHelper } from './RecordAnswerHelper.js';
11
13
  import { addTemporaryMemberAccess, hasTemporaryMemberAccess } from './TemporaryMemberAccess.js';
12
14
 
13
15
  /**
@@ -99,12 +101,10 @@ export class AdminPermissionChecker {
99
101
  const resolved = await cache;
100
102
  if (resolved) {
101
103
  cached.push(resolved);
102
- }
103
- else {
104
+ } else {
104
105
  // Not found, no need to readd
105
106
  }
106
- }
107
- else {
107
+ } else {
108
108
  remainingIds.push(groupId);
109
109
  }
110
110
  }
@@ -223,15 +223,13 @@ export class AdminPermissionChecker {
223
223
  if (this.user.organizationId && organizationId !== this.user.organizationId) {
224
224
  return false;
225
225
  }
226
- }
227
- else {
226
+ } else {
228
227
  if (STAMHOOFD.userMode === 'organization') {
229
228
  // User is limited to a scope: can't access platform resources
230
229
  if (this.user.organizationId) {
231
230
  return false;
232
231
  }
233
- }
234
- else {
232
+ } else {
235
233
  // User can access platform resources (e.g. API keys)
236
234
  }
237
235
  }
@@ -321,8 +319,7 @@ export class AdminPermissionChecker {
321
319
  if (group.settings.allowRegistrationsByOrganization && !group.getStructure().closed) {
322
320
  if (group.organizationId !== asOrganizationId) {
323
321
  return await this.hasFullAccess(asOrganizationId);
324
- }
325
- else {
322
+ } else {
326
323
  return await this.hasSomeAccess(asOrganizationId);
327
324
  }
328
325
  }
@@ -348,8 +345,7 @@ export class AdminPermissionChecker {
348
345
  try {
349
346
  await this.checkEventAccess(event);
350
347
  return true;
351
- }
352
- catch (e) {
348
+ } catch (e) {
353
349
  if (isSimpleError(e) || isSimpleErrors(e)) {
354
350
  return false;
355
351
  }
@@ -628,7 +624,7 @@ export class AdminPermissionChecker {
628
624
  ): Promise<boolean> {
629
625
  // These balance items are out of scope - but we do have access to them
630
626
  for (const balanceItem of balanceItems) {
631
- if (balanceItem.payingOrganizationId && this.checkScope(balanceItem.payingOrganizationId)) {
627
+ if (balanceItem.payingOrganizationId && (this.checkScope(balanceItem.payingOrganizationId) || this.checkScope(balanceItem.organizationId))) {
632
628
  if (await this.canManagePayments(balanceItem.payingOrganizationId)) {
633
629
  return true;
634
630
  }
@@ -800,7 +796,12 @@ export class AdminPermissionChecker {
800
796
  return false;
801
797
  }
802
798
 
803
- return EmailTemplateStruct.allowOrganizationLevel(template.type);
799
+ if (!this.organization) {
800
+ const org = await this.getOrganization(template.organizationId);
801
+ return EmailTemplateStruct.allowOrganizationLevel(template.type, org, this.platform);
802
+ }
803
+
804
+ return EmailTemplateStruct.allowOrganizationLevel(template.type, this.organization, this.platform);
804
805
  }
805
806
 
806
807
  // Note: if the template has an organizationId of null, everyone can access it, but only for reading
@@ -868,8 +869,7 @@ export class AdminPermissionChecker {
868
869
  if (await this.canManagePayments(member.organizationId)) {
869
870
  return true;
870
871
  }
871
- }
872
- else {
872
+ } else {
873
873
  const organizationIds = Formatter.uniqueArray(member.registrations.map(r => r.organizationId));
874
874
  for (const organizationId of organizationIds) {
875
875
  if (await this.canManagePayments(organizationId)) {
@@ -1117,7 +1117,7 @@ export class AdminPermissionChecker {
1117
1117
  return false;
1118
1118
  }
1119
1119
 
1120
- async hasFullAccess(organizationId: string, level = PermissionLevel.Full): Promise<boolean> {
1120
+ async hasFullAccess(organizationId: string | Organization, level = PermissionLevel.Full): Promise<boolean> {
1121
1121
  const organizationPermissions = await this.getOrganizationPermissions(organizationId);
1122
1122
 
1123
1123
  if (!organizationPermissions) {
@@ -1157,14 +1157,12 @@ export class AdminPermissionChecker {
1157
1157
  if (this.checkScope(member.organizationId)) {
1158
1158
  organizations.push(await this.getOrganization(member.organizationId));
1159
1159
  }
1160
- }
1161
- else {
1160
+ } else {
1162
1161
  if (organizationId) {
1163
1162
  if (this.checkScope(organizationId)) {
1164
1163
  organizations.push(await this.getOrganization(organizationId));
1165
1164
  }
1166
- }
1167
- else {
1165
+ } else {
1168
1166
  for (const registration of member.registrations) {
1169
1167
  if (this.checkScope(registration.organizationId)) {
1170
1168
  if (!organizations.find(o => o.id === registration.organizationId)) {
@@ -1205,8 +1203,7 @@ export class AdminPermissionChecker {
1205
1203
  if (platformPermissions.hasAccessRight(AccessRight.OrganizationManagePayments)) {
1206
1204
  return true;
1207
1205
  }
1208
- }
1209
- else {
1206
+ } else {
1210
1207
  if (platformPermissions.hasAccessRight(level === PermissionLevel.Read ? AccessRight.MemberReadFinancialData : AccessRight.MemberWriteFinancialData)) {
1211
1208
  return true;
1212
1209
  }
@@ -1284,8 +1281,8 @@ export class AdminPermissionChecker {
1284
1281
  return {
1285
1282
  record,
1286
1283
  rootCategoryId: recordCategory.id,
1287
- organizationId: this.organization.id
1288
- }
1284
+ organizationId: this.organization.id,
1285
+ };
1289
1286
  }
1290
1287
  }
1291
1288
  }
@@ -1330,8 +1327,7 @@ export class AdminPermissionChecker {
1330
1327
  record: record.record,
1331
1328
  };
1332
1329
  }
1333
- }
1334
- else {
1330
+ } else {
1335
1331
  // ONLY check current scoped organization
1336
1332
  if (this.organization) {
1337
1333
  const organizationPermissions = await this.getOrganizationPermissions(this.organization.id);
@@ -1366,14 +1362,13 @@ export class AdminPermissionChecker {
1366
1362
  };
1367
1363
  }
1368
1364
 
1369
- private async loopRecordAnswerSettingsAccess<T extends RecordAnswer | AutoEncoderPatchType<RecordAnswer>>({member, level, recordAnswers, callback }:
1365
+ private async loopRecordAnswerSettingsAccess<T extends RecordAnswer | AutoEncoderPatchType<RecordAnswer>>({ member, level, recordAnswers, callback }:
1370
1366
  {
1371
- member: MemberWithUsersRegistrationsAndGroups,
1372
- level: PermissionLevel,
1373
- recordAnswers: PatchMap<string, T | null | undefined> | Map<string, T>
1374
- callback: (result: { canAccess: false; record: RecordSettings | null } | { canAccess: true; record: RecordSettings }, entry: [keys: string, value: T | null | undefined]) => void
1375
- }): Promise<void>
1376
- {
1367
+ member: MemberWithUsersRegistrationsAndGroups;
1368
+ level: PermissionLevel;
1369
+ recordAnswers: PatchMap<string, T | null | undefined> | Map<string, T>;
1370
+ callback: (result: { canAccess: false; record: RecordSettings | null } | { canAccess: true; record: RecordSettings }, entry: [keys: string, value: T | null | undefined]) => void;
1371
+ }): Promise<void> {
1377
1372
  if (STAMHOOFD.userMode !== 'platform') {
1378
1373
  let organization = this.organization;
1379
1374
 
@@ -1386,11 +1381,11 @@ export class AdminPermissionChecker {
1386
1381
  if (member.registrations.length === 0) {
1387
1382
  // no access to any records (theoretically a global admin should have access, but normally this case should not happen)
1388
1383
  for (const entry of recordAnswers.entries()) {
1389
- callback({canAccess: false, record: null}, entry);
1384
+ callback({ canAccess: false, record: null }, entry);
1390
1385
  }
1391
1386
  return;
1392
1387
  }
1393
-
1388
+
1394
1389
  // in userMode organization a member can only be linked to 1 organization
1395
1390
  organizationId = member.registrations[0].organizationId;
1396
1391
  }
@@ -1399,7 +1394,7 @@ export class AdminPermissionChecker {
1399
1394
  }
1400
1395
 
1401
1396
  const organizationId = organization.id;
1402
- const map = new Map<string, RecordCacheEntry>()
1397
+ const map = new Map<string, RecordCacheEntry>();
1403
1398
 
1404
1399
  // create map
1405
1400
  for (const category of organization.meta.recordsConfiguration.recordCategories) {
@@ -1413,7 +1408,7 @@ export class AdminPermissionChecker {
1413
1408
  });
1414
1409
  }
1415
1410
  }
1416
-
1411
+
1417
1412
  for (const entry of recordAnswers.entries()) {
1418
1413
  const key = entry[0];
1419
1414
  const cachedRecordEntry = map.get(key);
@@ -1423,11 +1418,11 @@ export class AdminPermissionChecker {
1423
1418
  record: cachedRecordEntry.record,
1424
1419
  organizationId: cachedRecordEntry.organizationId,
1425
1420
  rootCategoryId: cachedRecordEntry.rootCategoryId,
1426
- level
1421
+ level,
1427
1422
  });
1428
- callback({canAccess, record: cachedRecordEntry.record}, entry);
1423
+ callback({ canAccess, record: cachedRecordEntry.record }, entry);
1429
1424
  } else {
1430
- callback({canAccess: false, record: null}, entry);
1425
+ callback({ canAccess: false, record: null }, entry);
1431
1426
  }
1432
1427
  }
1433
1428
 
@@ -1435,7 +1430,7 @@ export class AdminPermissionChecker {
1435
1430
  }
1436
1431
 
1437
1432
  // userMode platform
1438
- for (const entry of recordAnswers.entries()) {
1433
+ for (const entry of recordAnswers.entries()) {
1439
1434
  const key = entry[0];
1440
1435
  const cachedRecordEntry = await MemberRecordStore.getRecord(key);
1441
1436
  if (cachedRecordEntry) {
@@ -1444,18 +1439,18 @@ export class AdminPermissionChecker {
1444
1439
  record: cachedRecordEntry.record,
1445
1440
  organizationId: cachedRecordEntry.organizationId,
1446
1441
  rootCategoryId: cachedRecordEntry.rootCategoryId,
1447
- level
1442
+ level,
1448
1443
  });
1449
- callback({canAccess, record: cachedRecordEntry.record}, entry);
1444
+ callback({ canAccess, record: cachedRecordEntry.record }, entry);
1450
1445
  } else {
1451
- callback({canAccess: false, record: null}, entry);
1446
+ callback({ canAccess: false, record: null }, entry);
1452
1447
  }
1453
1448
  }
1454
1449
  }
1455
1450
 
1456
- private async checkRecordAccess({member, level, record, organizationId, rootCategoryId}: {member: MemberWithUsersRegistrationsAndGroups, record: RecordSettings, organizationId: string | null, rootCategoryId: string, level: PermissionLevel}): Promise<boolean> {
1451
+ private async checkRecordAccess({ member, level, record, organizationId, rootCategoryId }: { member: MemberWithUsersRegistrationsAndGroups; record: RecordSettings; organizationId: string | null; rootCategoryId: string; level: PermissionLevel }): Promise<boolean> {
1457
1452
  if (!this.checkScope(organizationId)) {
1458
- return false
1453
+ return false;
1459
1454
  }
1460
1455
 
1461
1456
  const isUserManager = this.isUserManager(member);
@@ -1474,8 +1469,7 @@ export class AdminPermissionChecker {
1474
1469
  if (organizationPermissions && organizationPermissions.hasResourceAccess(PermissionsResourceType.RecordCategories, rootCategoryId, level)) {
1475
1470
  return true;
1476
1471
  }
1477
- }
1478
- else {
1472
+ } else {
1479
1473
  // Also check current scoped organization
1480
1474
  if (this.organization) {
1481
1475
  const organizationPermissions = await this.getOrganizationPermissions(this.organization.id);
@@ -1520,8 +1514,7 @@ export class AdminPermissionChecker {
1520
1514
  if (await this.canAccessRegistration(registration, level)) {
1521
1515
  return true;
1522
1516
  }
1523
- }
1524
- else {
1517
+ } else {
1525
1518
  checkedOrganizations.set(registration.organizationId, false);
1526
1519
  }
1527
1520
  }
@@ -1555,14 +1548,13 @@ export class AdminPermissionChecker {
1555
1548
  callback: ({ canAccess, record }, [key, value]) => {
1556
1549
  if (!canAccess) {
1557
1550
  cloned.details.recordAnswers.delete(key);
1558
- }
1559
- else {
1560
- if (value) {
1551
+ } else {
1552
+ if (value && RecordAnswerHelper.haveTypesSameClass(value.settings.type, record.type)) {
1561
1553
  // Force update
1562
1554
  value.settings = record;
1563
1555
  }
1564
1556
  }
1565
- }
1557
+ },
1566
1558
  });
1567
1559
 
1568
1560
  const isUserManager = this.isUserManager(member);
@@ -1669,14 +1661,12 @@ export class AdminPermissionChecker {
1669
1661
  if (data.details.uitpasNumberDetails && data.details.uitpasNumberDetails.socialTariff !== undefined) {
1670
1662
  if (data.details.uitpasNumberDetails.uitpasNumber === undefined) {
1671
1663
  data.details.uitpasNumberDetails = undefined;
1672
- }
1673
- else if (data.details.uitpasNumberDetails.uitpasNumber !== member.details.uitpasNumberDetails?.uitpasNumber) {
1664
+ } else if (data.details.uitpasNumberDetails.uitpasNumber !== member.details.uitpasNumberDetails?.uitpasNumber) {
1674
1665
  // if uitpas number did change -> status should be reset
1675
1666
  data.details.uitpasNumberDetails = UitpasNumberDetails.create({
1676
1667
  uitpasNumber: data.details.uitpasNumberDetails.uitpasNumber,
1677
1668
  });
1678
- }
1679
- else {
1669
+ } else {
1680
1670
  // if uitpas number did not change
1681
1671
  data.details.uitpasNumberDetails.socialTariff = member.details.uitpasNumberDetails?.socialTariff;
1682
1672
  }
@@ -1695,7 +1685,7 @@ export class AdminPermissionChecker {
1695
1685
  member,
1696
1686
  level: PermissionLevel.Write,
1697
1687
  recordAnswers: data.details.recordAnswers,
1698
- callback: ({canAccess, record}, [_key, value]) => {
1688
+ callback: ({ canAccess, record }, [_key, value]) => {
1699
1689
  if (!canAccess) {
1700
1690
  throw new SimpleError({
1701
1691
  code: 'permission_denied',
@@ -1708,8 +1698,8 @@ export class AdminPermissionChecker {
1708
1698
  if (value) {
1709
1699
  value.settings = record;
1710
1700
  }
1711
- }
1712
- })
1701
+ },
1702
+ });
1713
1703
  }
1714
1704
 
1715
1705
  const isUserManager = this.isUserManager(member);
@@ -1731,7 +1721,13 @@ export class AdminPermissionChecker {
1731
1721
  // Has financial write access?
1732
1722
  if (!await this.hasFinancialMemberAccess(member, PermissionLevel.Write)) {
1733
1723
  if (isUserManager && isSetFinancialSupportTrue) {
1734
- const financialSupportSettings = this.platform.config.financialSupport;
1724
+ const financialSupportSettings = await getFinancialSupportSettingsAsync(this.platform, async () => {
1725
+ if (member.organizationId) {
1726
+ return await this.getOrganization(member.organizationId);
1727
+ }
1728
+ return null;
1729
+ });
1730
+
1735
1731
  const preventSelfAssignment = financialSupportSettings?.preventSelfAssignment === true;
1736
1732
 
1737
1733
  if (preventSelfAssignment) {
@@ -1747,8 +1743,7 @@ export class AdminPermissionChecker {
1747
1743
  if (data.details.requiresFinancialSupport) {
1748
1744
  if (isUserManager) {
1749
1745
  // Already handled
1750
- }
1751
- else {
1746
+ } else {
1752
1747
  throw new SimpleError({
1753
1748
  code: 'permission_denied',
1754
1749
  message: 'Je hebt geen toegangsrechten om de financiële status van dit lid aan te passen',