@stamhoofd/backend 2.121.0 → 2.122.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (429) hide show
  1. package/output-2.txt +1 -0
  2. package/output.txt +1 -0
  3. package/package.json +69 -52
  4. package/src/audit-logs/EventNotificationLogger.ts +40 -0
  5. package/src/audit-logs/ModelLogger.ts +19 -15
  6. package/src/audit-logs/OrganizationLogger.ts +1 -1
  7. package/src/audit-logs/RegistrationInvitationLogger.ts +24 -24
  8. package/src/audit-logs/init.ts +8 -2
  9. package/src/boot.ts +19 -18
  10. package/src/crons/amazon-ses.ts +13 -26
  11. package/src/crons/balance-emails.ts +3 -5
  12. package/src/crons/clearExcelCache.test.ts +1 -1
  13. package/src/crons/clearExcelCache.ts +1 -2
  14. package/src/crons/drip-emails.ts +42 -0
  15. package/src/crons/endFunctionsOfUsersWithoutRegistration.ts +4 -0
  16. package/src/crons/helpers/isOutside.ts +11 -0
  17. package/src/crons/helpers/useSavedIterator.ts +32 -0
  18. package/src/crons/index.ts +5 -0
  19. package/src/crons/invoices.ts +32 -38
  20. package/src/crons/members-fees.ts +50 -0
  21. package/src/crons/mollie-chargebacks.ts +14 -15
  22. package/src/crons/service-fees.ts +152 -0
  23. package/src/crons/stripe-invoices.ts +48 -0
  24. package/src/crons/transfer-fees.ts +176 -0
  25. package/src/crons/update-cached-balances.ts +4 -4
  26. package/src/crons.ts +7 -64
  27. package/src/debug.ts +4 -2
  28. package/src/email-recipient-loaders/documents.ts +1 -1
  29. package/src/email-recipient-loaders/members.ts +1 -1
  30. package/src/email-recipient-loaders/payments.ts +4 -6
  31. package/src/email-recipient-loaders/registrations.ts +1 -1
  32. package/src/email-replacements/getEmailReplacementsForPayment.ts +5 -9
  33. package/src/endpoints/admin/members/ChargeMembersEndpoint.ts +1 -1
  34. package/src/endpoints/admin/memberships/ChargeMembershipsEndpoint.ts +1 -1
  35. package/src/endpoints/admin/memberships/GetChargeMembershipsSummaryEndpoint.ts +3 -5
  36. package/src/endpoints/admin/organizations/ChargeOrganizationsEndpoint.ts +1 -1
  37. package/src/endpoints/admin/organizations/GetOrganizationsCountEndpoint.ts +1 -1
  38. package/src/endpoints/admin/organizations/GetOrganizationsEndpoint.ts +13 -7
  39. package/src/endpoints/admin/organizations/PatchOrganizationsEndpoint.ts +4 -6
  40. package/src/endpoints/admin/organizations/PatchPackagesEndpoint.test.ts +10 -6
  41. package/src/endpoints/admin/organizations/PatchPackagesEndpoint.ts +39 -21
  42. package/src/endpoints/admin/registrations/ChargeRegistrationsEndpoint.ts +1 -1
  43. package/src/endpoints/auth/CreateAdminEndpoint.ts +23 -5
  44. package/src/endpoints/auth/CreateTokenEndpoint.ts +2 -2
  45. package/src/endpoints/auth/DeleteTokenEndpoint.ts +1 -1
  46. package/src/endpoints/auth/DeleteUserEndpoint.ts +3 -3
  47. package/src/endpoints/auth/ForgotPasswordEndpoint.ts +1 -1
  48. package/src/endpoints/auth/GetOtherUserEndpoint.ts +1 -1
  49. package/src/endpoints/auth/GetUserEndpoint.ts +1 -1
  50. package/src/endpoints/auth/OpenIDConnectAuthTokenEndpoint.ts +1 -1
  51. package/src/endpoints/auth/OpenIDConnectStartEndpoint.ts +1 -1
  52. package/src/endpoints/auth/PatchUserEndpoint.ts +5 -8
  53. package/src/endpoints/auth/PollEmailVerificationEndpoint.ts +1 -1
  54. package/src/endpoints/auth/RetryEmailVerificationEndpoint.ts +1 -1
  55. package/src/endpoints/auth/SignupEndpoint.ts +2 -3
  56. package/src/endpoints/auth/VerifyEmailEndpoint.ts +20 -3
  57. package/src/endpoints/frontend/FrontendEnvironmentEndpoint.ts +2 -1
  58. package/src/endpoints/global/addresses/SearchRegionsEndpoint.ts +2 -4
  59. package/src/endpoints/global/addresses/ValidateAddressEndpoint.ts +1 -1
  60. package/src/endpoints/global/audit-logs/GetAuditLogsEndpoint.ts +5 -7
  61. package/src/endpoints/global/caddy/CheckDomainCertEndpoint.ts +2 -2
  62. package/src/endpoints/global/email/CreateEmailEndpoint.ts +3 -4
  63. package/src/endpoints/global/email/GetAdminEmailsEndpoint.test.ts +1 -1
  64. package/src/endpoints/global/email/GetAdminEmailsEndpoint.ts +1 -2
  65. package/src/endpoints/global/email/GetEmailAddressEndpoint.ts +4 -6
  66. package/src/endpoints/global/email/GetEmailEndpoint.ts +1 -1
  67. package/src/endpoints/global/email/GetUserEmailsEndpoint.test.ts +1 -1
  68. package/src/endpoints/global/email/GetUserEmailsEndpoint.ts +1 -1
  69. package/src/endpoints/global/email/ManageEmailAddressEndpoint.ts +6 -10
  70. package/src/endpoints/global/email/PatchEmailEndpoint.test.ts +4 -7
  71. package/src/endpoints/global/email/PatchEmailEndpoint.ts +6 -9
  72. package/src/endpoints/global/email-recipients/GetEmailRecipientsCountEndpoint.ts +1 -1
  73. package/src/endpoints/global/email-recipients/GetEmailRecipientsEndpoint.test.ts +1 -1
  74. package/src/endpoints/global/email-recipients/GetEmailRecipientsEndpoint.ts +1 -1
  75. package/src/endpoints/global/email-recipients/RetryEmailRecipientEndpoint.ts +2 -2
  76. package/src/endpoints/global/events/GetEventNotificationsCountEndpoint.ts +1 -1
  77. package/src/endpoints/global/events/GetEventNotificationsEndpoint.ts +3 -3
  78. package/src/endpoints/global/events/GetEventsEndpoint.ts +3 -3
  79. package/src/endpoints/global/events/PatchEventNotificationsEndpoint.test.ts +49 -4
  80. package/src/endpoints/global/events/PatchEventNotificationsEndpoint.ts +5 -8
  81. package/src/endpoints/global/events/PatchEventsEndpoint.test.ts +12 -44
  82. package/src/endpoints/global/events/PatchEventsEndpoint.ts +128 -127
  83. package/src/endpoints/global/files/ExportToExcelEndpoint.ts +9 -9
  84. package/src/endpoints/global/files/GetFileCache.ts +3 -4
  85. package/src/endpoints/global/files/UploadFile.ts +3 -4
  86. package/src/endpoints/global/files/UploadImage.ts +3 -4
  87. package/src/endpoints/global/groups/GetGroupsCountEndpoint.ts +1 -1
  88. package/src/endpoints/global/groups/GetGroupsEndpoint.test.ts +1 -1
  89. package/src/endpoints/global/groups/GetGroupsEndpoint.ts +4 -2
  90. package/src/endpoints/global/members/GetMemberFamilyEndpoint.ts +2 -3
  91. package/src/endpoints/global/members/GetMembersCountEndpoint.ts +1 -1
  92. package/src/endpoints/global/members/GetMembersEndpoint.test.ts +2 -2
  93. package/src/endpoints/global/members/GetMembersEndpoint.ts +10 -12
  94. package/src/endpoints/global/members/PatchOrganizationMembersEndpoint.test.ts +195 -12
  95. package/src/endpoints/global/members/PatchOrganizationMembersEndpoint.ts +16 -22
  96. package/src/endpoints/global/members/helpers/validateGroupFilter.ts +6 -30
  97. package/src/endpoints/global/members/shouldCheckIfMemberIsDuplicate.ts +1 -1
  98. package/src/endpoints/global/organizations/CheckRegisterCodeEndpoint.ts +1 -1
  99. package/src/endpoints/global/organizations/CreateOrganizationEndpoint.ts +40 -8
  100. package/src/endpoints/global/organizations/GetOrganizationFromDomainEndpoint.ts +2 -2
  101. package/src/endpoints/global/organizations/GetOrganizationFromUriEndpoint.ts +2 -2
  102. package/src/endpoints/global/organizations/SearchOrganizationEndpoint.test.ts +4 -1
  103. package/src/endpoints/global/organizations/SearchOrganizationEndpoint.ts +4 -5
  104. package/src/endpoints/global/payments/StripeWebhookEndpoint.ts +9 -16
  105. package/src/endpoints/global/platform/GetPlatformAdminsEndpoint.ts +1 -1
  106. package/src/endpoints/global/platform/GetPlatformEndpoint.ts +1 -1
  107. package/src/endpoints/global/platform/PatchPlatformEnpoint.test.ts +1 -1
  108. package/src/endpoints/global/platform/PatchPlatformEnpoint.ts +11 -11
  109. package/src/endpoints/global/platform-memberships/GetPlatformMembershipsCountEndpoint.ts +31 -31
  110. package/src/endpoints/global/platform-memberships/GetPlatformMembershipsEndpoint.ts +18 -20
  111. package/src/endpoints/global/registration/GetRegistrationsCountEndpoint.ts +1 -1
  112. package/src/endpoints/global/registration/GetRegistrationsEndpoint.test.ts +1 -1
  113. package/src/endpoints/global/registration/GetRegistrationsEndpoint.ts +6 -10
  114. package/src/endpoints/global/registration/GetUserDetailedPayableBalanceEndpoint.ts +35 -6
  115. package/src/endpoints/global/registration/GetUserDocumentsEndpoint.ts +2 -2
  116. package/src/endpoints/global/registration/GetUserMembersEndpoint.ts +1 -1
  117. package/src/endpoints/global/registration/GetUserPayableBalanceEndpoint.ts +1 -1
  118. package/src/endpoints/global/registration/PatchUserMembersEndpoint.test.ts +2 -2
  119. package/src/endpoints/global/registration/PatchUserMembersEndpoint.ts +3 -3
  120. package/src/endpoints/global/registration/RegisterMembersEndpoint.test.ts +90 -6
  121. package/src/endpoints/global/registration/RegisterMembersEndpoint.ts +35 -34
  122. package/src/endpoints/global/registration-invitations/GetRegistrationInvitationsCountEndpoint.ts +1 -1
  123. package/src/endpoints/global/registration-invitations/GetRegistrationInvitationsEndpoint.test.ts +62 -63
  124. package/src/endpoints/global/registration-invitations/GetRegistrationInvitationsEndpoint.ts +6 -9
  125. package/src/endpoints/global/registration-invitations/PatchRegistrationInvitationsEndpoint.test.ts +51 -52
  126. package/src/endpoints/global/registration-invitations/PatchRegistrationInvitationsEndpoint.ts +6 -7
  127. package/src/endpoints/global/registration-periods/GetRegistrationPeriodsCountEndpoint.ts +43 -0
  128. package/src/endpoints/global/registration-periods/GetRegistrationPeriodsEndpoint.ts +1 -1
  129. package/src/endpoints/global/registration-periods/PatchRegistrationPeriodsEndpoint.ts +13 -5
  130. package/src/endpoints/global/sso/GetSSOEndpoint.ts +2 -3
  131. package/src/endpoints/global/sso/SetSSOEndpoint.ts +1 -1
  132. package/src/endpoints/global/webshops/GetWebshopFromDomainEndpoint.ts +2 -2
  133. package/src/endpoints/global/webshops/GetWebshopsEndpoint.test.ts +1 -2
  134. package/src/endpoints/global/webshops/GetWebshopsEndpoint.ts +2 -4
  135. package/src/endpoints/organization/dashboard/balance-items/GetBalanceItemEndpoint.ts +2 -2
  136. package/src/endpoints/organization/dashboard/balance-items/GetBalanceItemsCountEndpoint.ts +1 -1
  137. package/src/endpoints/organization/dashboard/balance-items/GetBalanceItemsEndpoint.ts +3 -4
  138. package/src/endpoints/organization/dashboard/balance-items/PatchBalanceItemsEndpoint.ts +7 -9
  139. package/src/endpoints/organization/dashboard/billing/ApplyRegisterCodeEndpoint.test.ts +73 -0
  140. package/src/endpoints/organization/dashboard/billing/ApplyRegisterCodeEndpoint.ts +89 -0
  141. package/src/endpoints/organization/dashboard/billing/DeactivatePackageEndpoint.ts +1 -5
  142. package/src/endpoints/organization/dashboard/billing/DeleteOrganizationMandateEndpoint.ts +11 -11
  143. package/src/endpoints/organization/dashboard/billing/GetOrganizationDetailedPayableBalanceCollectionEndpoint.ts +2 -2
  144. package/src/endpoints/organization/dashboard/billing/GetOrganizationDetailedPayableBalanceEndpoint.ts +8 -8
  145. package/src/endpoints/organization/dashboard/billing/GetOrganizationMandatesEndpoint.ts +9 -9
  146. package/src/endpoints/organization/dashboard/billing/GetOrganizationPayableBalanceEndpoint.ts +2 -2
  147. package/src/endpoints/organization/dashboard/billing/GetOrganizationPayableInvoicesEndpoint.ts +68 -0
  148. package/src/endpoints/organization/dashboard/billing/GetPackagesEndpoint.ts +4 -4
  149. package/src/endpoints/organization/dashboard/billing/GetRegisterCodeEndpoint.ts +66 -0
  150. package/src/endpoints/organization/dashboard/billing/OrganizationCheckoutEndpoint.test.ts +949 -0
  151. package/src/endpoints/organization/dashboard/billing/OrganizationCheckoutEndpoint.ts +60 -57
  152. package/src/endpoints/organization/dashboard/billing/PatchOrganizationMandatesEndpoint.ts +20 -20
  153. package/src/endpoints/organization/dashboard/documents/GetDocumentTemplateXML.ts +1 -1
  154. package/src/endpoints/organization/dashboard/documents/GetDocumentTemplatesCountEndpoint.ts +1 -1
  155. package/src/endpoints/organization/dashboard/documents/GetDocumentTemplatesEndpoint.ts +1 -1
  156. package/src/endpoints/organization/dashboard/documents/GetDocumentsCountEndpoint.ts +1 -1
  157. package/src/endpoints/organization/dashboard/documents/GetDocumentsEndpoint.ts +1 -1
  158. package/src/endpoints/organization/dashboard/documents/PatchDocumentEndpoint.ts +10 -2
  159. package/src/endpoints/organization/dashboard/documents/PatchDocumentTemplatesEndpoint.test.ts +2 -2
  160. package/src/endpoints/organization/dashboard/documents/PatchDocumentTemplatesEndpoint.ts +2 -2
  161. package/src/endpoints/organization/dashboard/email/CheckEmailBouncesEndpoint.ts +1 -1
  162. package/src/endpoints/organization/dashboard/email-templates/GetEmailTemplatesEndpoint.test.ts +1 -1
  163. package/src/endpoints/organization/dashboard/email-templates/GetEmailTemplatesEndpoint.ts +10 -8
  164. package/src/endpoints/organization/dashboard/email-templates/PatchEmailTemplatesEndpoint.test.ts +1 -1
  165. package/src/endpoints/organization/dashboard/email-templates/PatchEmailTemplatesEndpoint.ts +5 -6
  166. package/src/endpoints/organization/dashboard/invoices/GetInvoicesCountEndpoint.ts +1 -1
  167. package/src/endpoints/organization/dashboard/invoices/GetInvoicesEndpoint.ts +10 -6
  168. package/src/endpoints/organization/dashboard/invoices/PatchInvoicesEndpoint.ts +11 -2
  169. package/src/endpoints/organization/dashboard/mollie/CheckMollieEndpoint.ts +4 -5
  170. package/src/endpoints/organization/dashboard/mollie/ConnectMollieEndpoint.ts +5 -5
  171. package/src/endpoints/organization/dashboard/mollie/DisconnectMollieEndpoint.ts +2 -2
  172. package/src/endpoints/organization/dashboard/mollie/GetMollieDashboardEndpoint.ts +7 -7
  173. package/src/endpoints/organization/dashboard/nolt/CreateNoltTokenEndpoint.ts +1 -1
  174. package/src/endpoints/organization/dashboard/organization/GetOrganizationArchivedGroups.ts +2 -2
  175. package/src/endpoints/organization/dashboard/organization/GetOrganizationDeletedGroups.ts +1 -1
  176. package/src/endpoints/organization/dashboard/organization/GetUitpasClientIdEndpoint.ts +1 -1
  177. package/src/endpoints/organization/dashboard/organization/PatchOrganizationEndpoint.test.ts +2 -2
  178. package/src/endpoints/organization/dashboard/organization/PatchOrganizationEndpoint.ts +50 -12
  179. package/src/endpoints/organization/dashboard/organization/SearchUitpasOrganizersEndpoint.ts +2 -2
  180. package/src/endpoints/organization/dashboard/organization/SetOrganizationDomainEndpoint.ts +5 -10
  181. package/src/endpoints/organization/dashboard/organization/SetUitpasClientCredentialsEndpoint.ts +1 -1
  182. package/src/endpoints/organization/dashboard/payments/GetPaymentsCountEndpoint.ts +1 -1
  183. package/src/endpoints/organization/dashboard/payments/GetPaymentsEndpoint.ts +3 -4
  184. package/src/endpoints/organization/dashboard/payments/PatchPaymentsEndpoint.ts +21 -14
  185. package/src/endpoints/organization/dashboard/receivable-balances/ChargeReceivableBalancesEndpoint.ts +35 -28
  186. package/src/endpoints/organization/dashboard/receivable-balances/GetReceivableBalanceEndpoint.ts +2 -3
  187. package/src/endpoints/organization/dashboard/receivable-balances/GetReceivableBalancesCountEndpoint.ts +1 -1
  188. package/src/endpoints/organization/dashboard/receivable-balances/GetReceivableBalancesEndpoint.ts +1 -1
  189. package/src/endpoints/organization/dashboard/registration-periods/GetOrganizationRegistrationPeriodsEndpoint.test.ts +1 -1
  190. package/src/endpoints/organization/dashboard/registration-periods/GetOrganizationRegistrationPeriodsEndpoint.ts +2 -3
  191. package/src/endpoints/organization/dashboard/registration-periods/MoveRegistrationPeriods.test.ts +1 -1
  192. package/src/endpoints/organization/dashboard/registration-periods/PatchOrganizationRegistrationPeriodsEndpoint.test.ts +1 -1
  193. package/src/endpoints/organization/dashboard/registration-periods/PatchOrganizationRegistrationPeriodsEndpoint.ts +19 -18
  194. package/src/endpoints/organization/dashboard/registration-periods/SetupStepReviewEndpoint.ts +4 -5
  195. package/src/endpoints/organization/dashboard/stripe/ConnectStripeEndpoint.ts +1 -1
  196. package/src/endpoints/organization/dashboard/stripe/DeleteStripeAccountEndpoint.ts +2 -3
  197. package/src/endpoints/organization/dashboard/stripe/GetStripeAccountLinkEndpoint.ts +2 -2
  198. package/src/endpoints/organization/dashboard/stripe/GetStripeAccountsEndpoint.ts +1 -1
  199. package/src/endpoints/organization/dashboard/stripe/GetStripeLoginLinkEndpoint.ts +2 -2
  200. package/src/endpoints/organization/dashboard/stripe/UpdateStripeAccountEndpoint.ts +1 -1
  201. package/src/endpoints/organization/dashboard/users/CreateApiUserEndpoint.ts +1 -1
  202. package/src/endpoints/organization/dashboard/users/DeleteUserEndpoint.ts +1 -1
  203. package/src/endpoints/organization/dashboard/users/GetApiUsersEndpoint.ts +1 -1
  204. package/src/endpoints/organization/dashboard/users/GetOrganizationAdminsEndpoint.ts +1 -1
  205. package/src/endpoints/organization/dashboard/users/PatchApiUserEndpoint.ts +4 -6
  206. package/src/endpoints/organization/dashboard/webshops/CreateWebshopEndpoint.ts +10 -15
  207. package/src/endpoints/organization/dashboard/webshops/DeleteWebshopEndpoint.ts +1 -1
  208. package/src/endpoints/organization/dashboard/webshops/GetDiscountCodesEndpoint.ts +2 -2
  209. package/src/endpoints/organization/dashboard/webshops/GetWebshopOrdersCountEndpoint.ts +1 -1
  210. package/src/endpoints/organization/dashboard/webshops/GetWebshopOrdersEndpoint.ts +1 -1
  211. package/src/endpoints/organization/dashboard/webshops/GetWebshopTicketsEndpoint.ts +1 -1
  212. package/src/endpoints/organization/dashboard/webshops/GetWebshopUriAvailabilityEndpoint.ts +11 -2
  213. package/src/endpoints/organization/dashboard/webshops/PatchDiscountCodesEndpoint.ts +4 -6
  214. package/src/endpoints/organization/dashboard/webshops/PatchWebshopEndpoint.ts +22 -7
  215. package/src/endpoints/organization/dashboard/webshops/PatchWebshopOrdersEndpoint.ts +20 -27
  216. package/src/endpoints/organization/dashboard/webshops/PatchWebshopTicketsEndpoint.ts +1 -1
  217. package/src/endpoints/organization/dashboard/webshops/SearchUitpasEventsEndpoint.ts +2 -2
  218. package/src/endpoints/organization/dashboard/webshops/VerifyWebshopDomainEndpoint.ts +2 -3
  219. package/src/endpoints/organization/dashboard/webshops/WebshopReservedPathSegments.test.ts +95 -0
  220. package/src/endpoints/organization/shared/ExchangePaymentEndpoint.ts +2 -2
  221. package/src/endpoints/organization/shared/GetDocumentHtml.ts +1 -1
  222. package/src/endpoints/organization/shared/GetPaymentEndpoint.ts +1 -1
  223. package/src/endpoints/organization/shared/GetUitpasNumberDetailsEndpoint.ts +3 -5
  224. package/src/endpoints/organization/shared/auth/GetOrganizationEndpoint.ts +1 -1
  225. package/src/endpoints/organization/webshops/CheckWebshopDiscountCodesEndpoint.ts +4 -1
  226. package/src/endpoints/organization/webshops/GetOrderByPaymentEndpoint.ts +14 -3
  227. package/src/endpoints/organization/webshops/GetOrderEndpoint.ts +14 -2
  228. package/src/endpoints/organization/webshops/GetTicketsEndpoint.ts +37 -16
  229. package/src/endpoints/organization/webshops/GetWebshopEndpoint.test.ts +34 -2
  230. package/src/endpoints/organization/webshops/GetWebshopEndpoint.ts +4 -2
  231. package/src/endpoints/organization/webshops/PlaceOrderEndpoint.test.ts +74 -3
  232. package/src/endpoints/organization/webshops/PlaceOrderEndpoint.ts +16 -33
  233. package/src/endpoints/organization/webshops/RetrieveUitpasSocialTariffPriceEndpoint.ts +3 -5
  234. package/src/endpoints/organization/webshops/WebshopAuthHelper.ts +36 -0
  235. package/src/endpoints/system/HealthEndpoint.ts +1 -1
  236. package/src/excel-loaders/balance-items.ts +1 -1
  237. package/src/excel-loaders/event-notifications.ts +1 -1
  238. package/src/excel-loaders/members.ts +1 -1
  239. package/src/excel-loaders/organizations.ts +3 -3
  240. package/src/excel-loaders/payments.ts +31 -1
  241. package/src/excel-loaders/platform-memberships.ts +13 -14
  242. package/src/excel-loaders/receivable-balances.ts +2 -2
  243. package/src/excel-loaders/registrations.ts +2 -3
  244. package/src/helpers/AddressValidator.ts +7 -14
  245. package/src/helpers/AdminPermissionChecker.ts +50 -63
  246. package/src/helpers/AuthenticatedStructures.ts +69 -55
  247. package/src/helpers/BalanceItemRelationsBackfiller.test.ts +174 -0
  248. package/src/helpers/BalanceItemRelationsBackfiller.ts +163 -0
  249. package/src/helpers/BuckarooHelper.ts +2 -4
  250. package/src/helpers/CheckSettlements.ts +12 -24
  251. package/src/helpers/Context.ts +15 -10
  252. package/src/helpers/CookieHelper.ts +1 -2
  253. package/src/helpers/EmailResumer.ts +1 -2
  254. package/src/helpers/FileCache.ts +2 -3
  255. package/src/helpers/FinancialSupportHelper.ts +2 -2
  256. package/src/helpers/FlagMomentCleanup.ts +1 -2
  257. package/src/helpers/ForwardHandler.ts +5 -10
  258. package/src/helpers/GlobalHelper.ts +3 -3
  259. package/src/helpers/LegacyBillingConverter.ts +787 -0
  260. package/src/helpers/MemberMerger.test.ts +782 -0
  261. package/src/helpers/MemberMerger.ts +600 -0
  262. package/src/helpers/MemberUserSyncer.ts +6 -12
  263. package/src/helpers/MembershipCharger.ts +2 -4
  264. package/src/helpers/PaymentCustomerResolver.test.ts +203 -0
  265. package/src/helpers/PaymentCustomerResolver.ts +144 -0
  266. package/src/helpers/PeriodHelper.ts +2 -3
  267. package/src/helpers/RecordAnswerHelper.test.ts +105 -110
  268. package/src/helpers/RecordAnswerHelper.ts +7 -7
  269. package/src/helpers/SeedTools.ts +106 -0
  270. package/src/helpers/ServiceFeeHelper.ts +125 -15
  271. package/src/helpers/SetupStepUpdater.ts +38 -32
  272. package/src/helpers/StamhoofdFilterAccessHelper.ts +52 -0
  273. package/src/helpers/StripeHelper.ts +14 -36
  274. package/src/helpers/StripeInvoicer.ts +419 -0
  275. package/src/helpers/StripePayoutChecker.ts +5 -10
  276. package/src/helpers/TagHelper.ts +7 -8
  277. package/src/helpers/TemporaryMemberAccess.ts +1 -2
  278. package/src/helpers/ThrottledQueue.ts +1 -2
  279. package/src/helpers/UitpasTokenRepository.ts +1 -2
  280. package/src/helpers/ViesHelper.ts +7 -11
  281. package/src/helpers/XlsxTransformerColumnHelper.ts +1 -1
  282. package/src/helpers/outstandingBalanceJoin.ts +2 -2
  283. package/src/helpers/updateMemberDetailsUitpasNumber.ts +3 -5
  284. package/src/migrate.ts +12 -5
  285. package/src/{seeds → migrations}/0000000004-single-organization.ts +10 -1
  286. package/src/migrations/0000000006-default-organization.ts +139 -0
  287. package/src/{seeds → migrations}/1715028563-user-permissions.ts +17 -27
  288. package/src/{seeds/1765896674-document-update-year.test.ts → migrations/1750090029-document-update-year.test.ts} +27 -26
  289. package/src/migrations/1750090029-document-update-year.ts +103 -0
  290. package/src/{seeds → migrations}/1750090030-records-configuration.ts +33 -32
  291. package/src/migrations/1750090031-records-configuration-webshops.ts +36 -0
  292. package/src/migrations/1752848540-national-numbers.ts +585 -0
  293. package/src/migrations/1752848550-records-configuration-group-filter.ts +1064 -0
  294. package/src/{seeds → migrations}/1752848561-groups-registration-periods.ts +70 -26
  295. package/src/{seeds → migrations}/1754560914-groups-prices.test.ts +1 -1
  296. package/src/{seeds → migrations}/1754560914-groups-prices.ts +9 -15
  297. package/src/{seeds → migrations}/1756293699-fill-previous-next-period-id.ts +1 -2
  298. package/src/migrations/1761665607-sync-member-users.ts +40 -0
  299. package/src/migrations/1779121240-invoice-email-template.sql +6 -0
  300. package/src/migrations/1779986893-default-payment-failed-email-templates.sql +4 -0
  301. package/src/migrations/1780578166-convert-legacy-billing.ts +13 -0
  302. package/src/{seeds/1755876819-remove-duplicate-members.ts → migrations/1780665426-remove-duplicate-members.ts} +23 -4
  303. package/src/migrations/1780933598-document-groups.ts +88 -0
  304. package/src/migrations/1781692342-balance-item-relations.ts +13 -0
  305. package/src/migrations/1781857866-platform-admins.ts +103 -0
  306. package/src/migrations/1781857867-rm-old-platform-admins.ts +25 -0
  307. package/src/seeds/0000000001-throw.ts +5 -0
  308. package/src/seeds/1760702452-update-balance-price-paid.ts +19 -0
  309. package/src/seeds/1760702453-update-balance-invoiced.ts +19 -0
  310. package/src/seeds/1760702454-update-cached-outstanding-balance-from-items.ts +51 -14
  311. package/src/seeds/1773754928-force-save-members.ts +41 -8
  312. package/src/seeds/1780665427-schedule-stock-updates.ts +45 -0
  313. package/src/seeds/1780665428-group-update-occupancy.ts +31 -0
  314. package/src/seeds/1780915001-fill-payment-customer.ts +70 -0
  315. package/src/seeds/1780915002-update-orders.ts +39 -0
  316. package/src/seeds/1782047708-organization-company-address.ts +44 -0
  317. package/src/seeds-temporary/1769088653-uitpas-status.ts +1 -2
  318. package/src/seeds-temporary/1780416000-migrate-audit-log-legacy-enums.test.ts +69 -0
  319. package/src/seeds-temporary/1780416000-migrate-audit-log-legacy-enums.ts +85 -0
  320. package/src/services/AuditLogService.test.ts +51 -0
  321. package/src/services/AuditLogService.ts +45 -0
  322. package/src/services/BalanceItemService.ts +141 -44
  323. package/src/services/CpuService.ts +3 -6
  324. package/src/services/DatabaseCollationService.test.ts +1 -2
  325. package/src/services/DocumentService.ts +1 -2
  326. package/src/services/EventNotificationService.ts +1 -1
  327. package/src/services/FileSignService.ts +2 -4
  328. package/src/services/InvoicePdfService.ts +286 -0
  329. package/src/services/InvoiceService.ts +204 -251
  330. package/src/services/InvoiceXMLService.ts +424 -0
  331. package/src/services/MemberNumberService.ts +6 -11
  332. package/src/services/MemberRecordStore.ts +8 -10
  333. package/src/services/MollieService.ts +114 -121
  334. package/src/services/PaymentMandateService.ts +45 -45
  335. package/src/services/PaymentReallocationService.test.ts +1 -1
  336. package/src/services/PaymentReallocationService.ts +7 -9
  337. package/src/services/PaymentService.ts +444 -308
  338. package/src/services/PlatformMembershipService.ts +4 -8
  339. package/src/services/ReferralService.ts +223 -0
  340. package/src/services/RegistrationService.ts +63 -53
  341. package/src/services/SSOService.test.ts +119 -0
  342. package/src/services/SSOService.ts +56 -49
  343. package/src/services/STPackageService.ts +97 -61
  344. package/src/services/UniqueMemberNumberService.ts +69 -0
  345. package/src/services/UniqueUserService.ts +3 -6
  346. package/src/services/VATService.ts +85 -0
  347. package/src/services/uitpas/PassholderEndpoints.ts +3 -6
  348. package/src/services/uitpas/UitpasService.ts +6 -10
  349. package/src/services/uitpas/checkUitpasNumbers.ts +2 -4
  350. package/src/services/uitpas/getSocialTariffForUitpasNumbers.ts +3 -6
  351. package/src/services/uitpas/searchUitpasEvents.ts +1 -2
  352. package/src/sql-filters/audit-logs.ts +1 -1
  353. package/src/sql-filters/balance-item-payments.ts +1 -1
  354. package/src/sql-filters/balance-items.ts +1 -1
  355. package/src/sql-filters/base-registration-filter-compilers.ts +5 -33
  356. package/src/sql-filters/document-templates.ts +1 -1
  357. package/src/sql-filters/documents.ts +1 -1
  358. package/src/sql-filters/email-recipients.ts +1 -1
  359. package/src/sql-filters/emails.ts +1 -1
  360. package/src/sql-filters/event-notifications.ts +1 -1
  361. package/src/sql-filters/events.ts +6 -1
  362. package/src/sql-filters/groups.ts +5 -0
  363. package/src/sql-filters/invoiced-balance-items.ts +1 -1
  364. package/src/sql-filters/invoices.ts +1 -1
  365. package/src/sql-filters/member-responsibility-records.ts +1 -1
  366. package/src/sql-filters/members.ts +1 -1
  367. package/src/sql-filters/orders.ts +4 -4
  368. package/src/sql-filters/organization-registration-periods.ts +1 -1
  369. package/src/sql-filters/organizations.ts +1 -1
  370. package/src/sql-filters/platform-memberships.ts +3 -3
  371. package/src/sql-filters/receivable-balances.ts +1 -1
  372. package/src/sql-filters/registration-periods.ts +1 -1
  373. package/src/sql-filters/registrations.ts +1 -1
  374. package/src/sql-filters/tickets.ts +1 -1
  375. package/src/sql-filters/users.ts +1 -1
  376. package/src/sql-sorters/groups.ts +23 -0
  377. package/src/sql-sorters/platform-memberships.ts +16 -16
  378. package/src/sql-sorters/registration-invitations.ts +2 -2
  379. package/tests/actions/patchOrganizationMember.ts +1 -1
  380. package/tests/actions/patchUserMember.ts +1 -1
  381. package/tests/assertions/assertBalances.ts +6 -12
  382. package/tests/e2e/api-rate-limits.test.ts +12 -24
  383. package/tests/e2e/bundle-discounts.test.ts +4 -1
  384. package/tests/e2e/charge-members.test.ts +13 -11
  385. package/tests/e2e/documents.test.ts +4 -1
  386. package/tests/e2e/register.test.ts +7 -9
  387. package/tests/e2e/stock.test.ts +4 -3
  388. package/tests/e2e/tickets.test.ts +1 -1
  389. package/tests/helpers/MollieMocker.ts +462 -0
  390. package/tests/helpers/PayconiqMocker.ts +138 -45
  391. package/tests/helpers/StripeMocker.ts +9 -6
  392. package/tests/helpers/index.ts +4 -0
  393. package/tests/init/initAdmin.ts +2 -2
  394. package/tests/init/initBundleDiscount.ts +1 -1
  395. package/tests/init/initMembershipOrganization.ts +13 -0
  396. package/tests/init/initPermissionRole.ts +3 -4
  397. package/tests/vitest.global.setup.ts +1 -1
  398. package/vitest.config.js +6 -0
  399. package/.nvmrc +0 -1
  400. package/src/helpers/GroupBuilder.ts +0 -418
  401. package/src/seeds/0000000000-example.ts +0 -11
  402. package/src/seeds/1722256498-group-update-occupancy.ts +0 -52
  403. package/src/seeds/1726572303-schedule-stock-updates.ts +0 -52
  404. package/src/seeds/1726847064-setup-steps.ts +0 -16
  405. package/src/seeds/1728928974-update-cached-outstanding-balance-from-items.ts +0 -31
  406. package/src/seeds/1729253172-update-orders.ts +0 -21
  407. package/src/seeds/1733319079-fill-paying-organization-ids.ts +0 -68
  408. package/src/seeds/1733748412-update-deleted-order-numbers.ts +0 -109
  409. package/src/seeds/1733994455-balance-item-status-open.ts +0 -30
  410. package/src/seeds/1740046783-update-membership.ts +0 -17
  411. package/src/seeds/1741008870-fix-auditlog-description.ts +0 -50
  412. package/src/seeds/1741011468-fix-auditlog-description-uft16.ts +0 -88
  413. package/src/seeds/1741268179-fix-group-dates-of-events.ts +0 -32
  414. package/src/seeds/1751445358-upload-email-attachments.ts +0 -106
  415. package/src/seeds/1755532883-update-email-sender-ids.ts +0 -47
  416. package/src/seeds/1755790070-fill-email-recipient-errors.ts +0 -96
  417. package/src/seeds/1756115432-remove-old-drafts.ts +0 -16
  418. package/src/seeds/1756115433-fill-email-recipient-organization-id.ts +0 -30
  419. package/src/seeds/1756303697-update-email-counts.ts +0 -76
  420. package/src/seeds/1761665607-sync-member-users.ts +0 -59
  421. package/src/seeds/1765896674-document-update-year.ts +0 -66
  422. /package/src/{seeds → migrations}/0000000001-development-user.ts +0 -0
  423. /package/src/{seeds → migrations}/0000000002-clear-stamhoofd-email-templates.ts +0 -0
  424. /package/src/{seeds → migrations}/0000000003-default-email-templates.ts +0 -0
  425. /package/src/{seeds → migrations}/1752848561-groups-registration-periods.test.ts +0 -0
  426. /package/src/{seeds → migrations}/1766150402-document-published-at.test.ts +0 -0
  427. /package/src/{seeds → migrations}/1766150402-document-published-at.ts +0 -0
  428. /package/src/{seeds → migrations}/1779121239-default-invoice-email-template.sql +0 -0
  429. /package/src/{seeds → migrations}/data/default-email-templates.sql +0 -0
@@ -0,0 +1,85 @@
1
+ import type { Organization } from '@stamhoofd/models';
2
+ import { BalanceItem } from '@stamhoofd/models';
3
+ import type { Company, Organization as OrganizationStruct } from '@stamhoofd/structures';
4
+ import { BalanceItemStatus, getBalanceItemTypeVATType, VATExcemptReason } from '@stamhoofd/structures';
5
+
6
+ export class VATService {
7
+ static getDefaultCompanyForOrganization(sellingOrganization: Organization | OrganizationStruct): Company {
8
+ return sellingOrganization.defaultCompanies[0];
9
+ }
10
+
11
+ static async updateVATExcempt({ organization, sellingOrganization }: { organization: Organization; sellingOrganization: Organization | OrganizationStruct }) {
12
+ const company = organization.defaultCompanies[0];
13
+ const exempt = this.isVATExcempt({ company, sellingOrganization });
14
+ console.log('updating VAT excempt', exempt);
15
+
16
+ if (exempt) {
17
+ const items = await BalanceItem.select()
18
+ .where('organizationId', sellingOrganization.id)
19
+ .where('payingOrganizationId', organization.id)
20
+ .whereNot('status', BalanceItemStatus.Hidden)
21
+ .whereNot('priceOpen', 0)
22
+ .where('priceInvoiced', 0)
23
+ .where('VATExcempt', null)
24
+ .fetch();
25
+
26
+ for (const item of items) {
27
+ if (!item.VATExcempt) {
28
+ const type = getBalanceItemTypeVATType(item.type);
29
+ if (type) {
30
+ item.VATExcempt = this.getVATExcemptType({ type });
31
+ await item.save();
32
+ }
33
+ }
34
+ }
35
+ } else {
36
+ const items = await BalanceItem.select()
37
+ .where('organizationId', sellingOrganization.id)
38
+ .where('payingOrganizationId', organization.id)
39
+ .whereNot('status', BalanceItemStatus.Hidden)
40
+ .whereNot('priceOpen', 0)
41
+ .where('priceInvoiced', 0)
42
+ .whereNot('VATExcempt', null)
43
+ .fetch();
44
+
45
+ for (const item of items) {
46
+ if (item.VATExcempt) {
47
+ item.VATExcempt = null;
48
+ await item.save();
49
+ }
50
+ }
51
+ }
52
+ }
53
+
54
+ static isVATExcempt({ company, sellingOrganization }: { company: Company | null | undefined; sellingOrganization: Organization | OrganizationStruct }) {
55
+ // Validate VAT rates for this customer
56
+ const seller = this.getDefaultCompanyForOrganization(sellingOrganization);
57
+
58
+ if (seller.VATNumber && seller.address && company) {
59
+ // B2B validation
60
+ // No address -> we guess the same country as the seller (least risk of not applying VAT when it is required)
61
+ // Reverse charged vat applicable?
62
+ if ((company.address && company.address.country !== seller.address.country) && company.VATNumber && !company.VATNumber.trim().startsWith(seller.address.country)) {
63
+ return true;
64
+ }
65
+ }
66
+
67
+ return false;
68
+ }
69
+
70
+ static getVATExcemptType({ type }: { type: 'services' | 'goods' }) {
71
+ if (type === 'services') {
72
+ return VATExcemptReason.IntraCommunityServices;
73
+ }
74
+ return VATExcemptReason.IntraCommunityGoods;
75
+ }
76
+
77
+ static getVATExcempt({ company, sellingOrganization, type }: { company: Company | null | undefined; sellingOrganization: Organization | OrganizationStruct; type: 'services' | 'goods' }) {
78
+ // Reverse charged vat applicable?
79
+ if (this.isVATExcempt({ company, sellingOrganization })) {
80
+ return this.getVATExcemptType({ type });
81
+ }
82
+
83
+ return null;
84
+ }
85
+ }
@@ -35,8 +35,7 @@ export class PassholderEndpoints {
35
35
  headers: this.getHeaders(),
36
36
  signal: AbortSignal.timeout(10000),
37
37
  });
38
- }
39
- catch (error) {
38
+ } catch (error) {
40
39
  if (isTimeout(error)) {
41
40
  throw new SimpleError({
42
41
  statusCode: 408,
@@ -60,8 +59,7 @@ export class PassholderEndpoints {
60
59
  try {
61
60
  const json = await handleUitpasResponse(response);
62
61
  return jsonToGetPassResponse(json);
63
- }
64
- catch (e) {
62
+ } catch (e) {
65
63
  if (isSimpleError(e) || isSimpleErrors(e)) {
66
64
  if (e.hasCode('https://api.publiq.be/probs/uitpas/pass-not-found')) {
67
65
  throw new SimpleError({
@@ -168,8 +166,7 @@ function assertValidGetPassResponse(json: unknown): asserts json is GetPassRespo
168
166
  }
169
167
  });
170
168
  }
171
- }
172
- catch (error) {
169
+ } catch (error) {
173
170
  console.error('Invalid response when retrieving pass by UiTPAS number:', json);
174
171
  throw new SimpleError({
175
172
  code: 'invalid_response_retrieving_pass_by_uitpas_number',
@@ -12,9 +12,9 @@ import { checkPermissionsFor } from './checkPermissionsFor.js';
12
12
  import { checkUitpasNumbers } from './checkUitpasNumbers.js';
13
13
  import { getSocialTariffForEvent } from './getSocialTariffForEvent.js';
14
14
  import { getSocialTariffForUitpasNumbers } from './getSocialTariffForUitpasNumbers.js';
15
- import type { GetPassResponse} from './PassholderEndpoints.js';
15
+ import type { GetPassResponse } from './PassholderEndpoints.js';
16
16
  import { PassholderEndpoints } from './PassholderEndpoints.js';
17
- import type { RegisterTicketSaleRequest, RegisterTicketSaleResponse} from './registerTicketSales.js';
17
+ import type { RegisterTicketSaleRequest, RegisterTicketSaleResponse } from './registerTicketSales.js';
18
18
  import { registerTicketSales } from './registerTicketSales.js';
19
19
  import { searchUitpasEvents } from './searchUitpasEvents.js';
20
20
  import { searchUitpasOrganizers } from './searchUitpasOrganizers.js';
@@ -202,8 +202,7 @@ export class UitpasService {
202
202
  }
203
203
  try {
204
204
  newlyRegistered = await registerTicketSales(access_token, toBeRegisteredUitpasRequests);
205
- }
206
- catch (e) {
205
+ } catch (e) {
207
206
  console.error('Failed to register UiTPAS ticket sales', e);
208
207
  }
209
208
  }
@@ -269,8 +268,7 @@ export class UitpasService {
269
268
  }
270
269
  }
271
270
  }
272
- }
273
- catch (e) {
271
+ } catch (e) {
274
272
  console.error('Failed to update UiTPAS-numbers after order update', e);
275
273
  }
276
274
  });
@@ -353,8 +351,7 @@ export class UitpasService {
353
351
  let access_token!: string;
354
352
  try {
355
353
  access_token = await UitpasTokenRepository.getAccessTokenFor(); // use platform credentials
356
- }
357
- catch (e) {
354
+ } catch (e) {
358
355
  if (isSimpleError(e) && e.hasCode('uitpas_api_not_configured_for_platform')) {
359
356
  console.error('UiTPAS API has not been configured for this platform, so defaulting to an unknown status for number ', uitpasNumber);
360
357
  // Ignore and return status of unknown
@@ -444,8 +441,7 @@ export class UitpasService {
444
441
  });
445
442
  }
446
443
  }
447
- }
448
- else {
444
+ } else {
449
445
  // non-official flow
450
446
  access_token_platform = access_token_platform ?? await UitpasTokenRepository.getAccessTokenFor();
451
447
  await checkUitpasNumbers(access_token_platform, item.uitpasNumbers.map(p => p.uitpasNumber));
@@ -39,14 +39,12 @@ export async function checkUitpasNumbers(access_token: string, uitpasNumbers: st
39
39
  ),
40
40
  });
41
41
  }
42
- }
43
- catch (e) {
42
+ } catch (e) {
44
43
  if (isSimpleError(e) || isSimpleErrors(e)) {
45
44
  e.addNamespace(i.toString());
46
45
  e.addNamespace('uitpasNumbers');
47
46
  simpleErrors.addError(e);
48
- }
49
- else {
47
+ } else {
50
48
  throw e;
51
49
  }
52
50
  }
@@ -90,8 +90,7 @@ async function getSocialTariffForUitpasNumber(access_token: string, uitpasNumber
90
90
 
91
91
  if (json) {
92
92
  console.error(`UiTPAS API returned an error for UiTPAS number ${uitpasNumber} with event id ${eventId}:`, json);
93
- }
94
- else {
93
+ } else {
95
94
  console.error(`UiTPAS API returned an error for UiTPAS number ${uitpasNumber} with event id ${eventId}:`, response.statusText);
96
95
  }
97
96
 
@@ -168,14 +167,12 @@ export async function getSocialTariffForUitpasNumbers(access_token: string, uitp
168
167
  const uitpasNumber = uitpasNumbers[i];
169
168
  try {
170
169
  reducedPrices[i] = await getSocialTariffForUitpasNumber(access_token, uitpasNumber, basePrice, uitpasEventUrl);
171
- }
172
- catch (e) {
170
+ } catch (e) {
173
171
  if (isSimpleError(e) || isSimpleErrors(e)) {
174
172
  e.addNamespace(i.toString());
175
173
  e.addNamespace('uitpasNumbers');
176
174
  simpleErrors.addError(e);
177
- }
178
- else {
175
+ } else {
179
176
  throw e;
180
177
  }
181
178
  }
@@ -124,8 +124,7 @@ export async function searchUitpasEvents(clientId: string, uitpasOrganizerId: st
124
124
  const hasNl = entrs.find(([key]) => key === 'nl');
125
125
  if (hasNl) {
126
126
  event.location = locationName.nl;
127
- }
128
- else {
127
+ } else {
129
128
  const lang = entrs[0];
130
129
  event.location = lang ? lang[1] : '';
131
130
  }
@@ -1,4 +1,4 @@
1
- import type { SQLFilterDefinitions} from '@stamhoofd/sql';
1
+ import type { SQLFilterDefinitions } from '@stamhoofd/sql';
2
2
  import { baseSQLFilterCompilers, createColumnFilter, SQL, SQLValueType } from '@stamhoofd/sql';
3
3
 
4
4
  export const auditLogFilterCompilers: SQLFilterDefinitions = {
@@ -1,4 +1,4 @@
1
- import type { SQLFilterDefinitions} from '@stamhoofd/sql';
1
+ import type { SQLFilterDefinitions } from '@stamhoofd/sql';
2
2
  import { baseSQLFilterCompilers, createColumnFilter, SQL, SQLValueType } from '@stamhoofd/sql';
3
3
 
4
4
  export const balanceItemPaymentsCompilers: SQLFilterDefinitions = {
@@ -1,4 +1,4 @@
1
- import type { SQLFilterDefinitions} from '@stamhoofd/sql';
1
+ import type { SQLFilterDefinitions } from '@stamhoofd/sql';
2
2
  import { baseSQLFilterCompilers, createColumnFilter, SQL, SQLValueType } from '@stamhoofd/sql';
3
3
 
4
4
  /**
@@ -1,43 +1,15 @@
1
- import { SimpleError } from '@simonbackx/simple-errors';
2
- import type { SQLFilterDefinitions} from '@stamhoofd/sql';
1
+ import type { SQLFilterDefinitions } from '@stamhoofd/sql';
3
2
  import { baseSQLFilterCompilers, createColumnFilter, createExistsFilter, createJoinedRelationFilter, SQL, SQLIfNull, SQLValueType } from '@stamhoofd/sql';
4
- import type { StamhoofdFilter} from '@stamhoofd/structures';
5
- import { FilterWrapperMarker, PermissionLevel, unwrapFilter } from '@stamhoofd/structures';
3
+ import type { StamhoofdFilter } from '@stamhoofd/structures';
4
+ import { PermissionLevel } from '@stamhoofd/structures';
6
5
  import { Context } from '../helpers/Context.js';
7
6
  import { memberCachedBalanceForOrganizationJoin, registrationCachedBalanceJoin } from '../helpers/outstandingBalanceJoin.js';
8
7
  import { SQLTranslatedString } from '../helpers/SQLTranslatedString.js';
8
+ import { StamhoofdFilterAccessHelper } from '../helpers/StamhoofdFilterAccessHelper.js';
9
9
  import { organizationFilterCompilers } from './organizations.js';
10
10
 
11
11
  async function checkGroupIdFilterAccess(filter: StamhoofdFilter, permissionLevel: PermissionLevel) {
12
- const groupIds = typeof filter === 'string'
13
- ? [filter]
14
- : unwrapFilter(filter as StamhoofdFilter, {
15
- $in: FilterWrapperMarker,
16
- })?.markerValue;
17
-
18
- if (!Array.isArray(groupIds)) {
19
- throw new SimpleError({
20
- code: 'invalid_field',
21
- field: 'filter',
22
- message: 'You must filter on a group of the organization you are trying to access',
23
- human: $t(`%1HG`),
24
- });
25
- }
26
-
27
- if (groupIds.length === 0) {
28
- return;
29
- }
30
-
31
- for (const groupId of groupIds) {
32
- if (typeof groupId !== 'string') {
33
- throw new SimpleError({
34
- code: 'invalid_field',
35
- field: 'filter',
36
- message: 'Invalid group ID in filter',
37
- });
38
- }
39
- }
40
-
12
+ const groupIds = StamhoofdFilterAccessHelper.getGroupIdsFromFilter(filter);
41
13
  const groups = await Context.auth.getGroups(groupIds as string[]);
42
14
 
43
15
  console.log('Filtering registrations on groups', groups.map(g => g.settings.name.toString()));
@@ -1,4 +1,4 @@
1
- import type { SQLFilterDefinitions} from '@stamhoofd/sql';
1
+ import type { SQLFilterDefinitions } from '@stamhoofd/sql';
2
2
  import { baseSQLFilterCompilers, createColumnFilter, SQL, SQLValueType } from '@stamhoofd/sql';
3
3
 
4
4
  export const documentTemplateFilterCompilers: SQLFilterDefinitions = {
@@ -1,4 +1,4 @@
1
- import type { SQLFilterDefinitions} from '@stamhoofd/sql';
1
+ import type { SQLFilterDefinitions } from '@stamhoofd/sql';
2
2
  import { baseSQLFilterCompilers, createColumnFilter, SQL, SQLValueType } from '@stamhoofd/sql';
3
3
 
4
4
  export const documentFilterCompilers: SQLFilterDefinitions = {
@@ -1,4 +1,4 @@
1
- import type { SQLFilterDefinitions} from '@stamhoofd/sql';
1
+ import type { SQLFilterDefinitions } from '@stamhoofd/sql';
2
2
  import { baseSQLFilterCompilers, createColumnFilter, SQL, SQLConcat, SQLScalar, SQLValueType } from '@stamhoofd/sql';
3
3
 
4
4
  export const emailRecipientsFilterCompilers: SQLFilterDefinitions = {
@@ -1,4 +1,4 @@
1
- import type { SQLFilterDefinitions} from '@stamhoofd/sql';
1
+ import type { SQLFilterDefinitions } from '@stamhoofd/sql';
2
2
  import { baseSQLFilterCompilers, createColumnFilter, createExistsFilter, SQL, SQLValueType } from '@stamhoofd/sql';
3
3
  import { emailRecipientsFilterCompilers } from './email-recipients.js';
4
4
 
@@ -1,4 +1,4 @@
1
- import type { SQLFilterDefinitions} from '@stamhoofd/sql';
1
+ import type { SQLFilterDefinitions } from '@stamhoofd/sql';
2
2
  import { baseSQLFilterCompilers, createColumnFilter, createJoinedRelationFilter, createExistsFilter, SQL, SQLValueType } from '@stamhoofd/sql';
3
3
  import { eventFilterCompilers } from './events.js';
4
4
  import { organizationFilterCompilers } from './organizations.js';
@@ -1,4 +1,4 @@
1
- import type { SQLFilterDefinitions} from '@stamhoofd/sql';
1
+ import type { SQLFilterDefinitions } from '@stamhoofd/sql';
2
2
  import { baseSQLFilterCompilers, createColumnFilter, createExistsFilter, SQL, SQLValueType } from '@stamhoofd/sql';
3
3
 
4
4
  export const eventFilterCompilers: SQLFilterDefinitions = {
@@ -107,6 +107,11 @@ export const eventFilterCompilers: SQLFilterDefinitions = {
107
107
  type: SQLValueType.JSONNumber,
108
108
  nullable: true,
109
109
  }),
110
+ periodId: createColumnFilter({
111
+ expression: SQL.column('periodId'),
112
+ type: SQLValueType.String,
113
+ nullable: false,
114
+ }),
110
115
  },
111
116
  ),
112
117
  'webshop': createExistsFilter(
@@ -44,6 +44,11 @@ export const groupFilterCompilers: SQLFilterDefinitions = {
44
44
  type: SQLValueType.String,
45
45
  nullable: true,
46
46
  }),
47
+ deletedAt: createColumnFilter({
48
+ expression: SQL.column('deletedAt'),
49
+ type: SQLValueType.Datetime,
50
+ nullable: true,
51
+ }),
47
52
  bundleDiscounts: createWildcardColumnFilter(
48
53
  (key: string) => ({
49
54
  expression: SQL.jsonExtract(SQL.column('settings'), `$.value.prices[*].bundleDiscounts.${SQLJsonExtract.escapePathComponent(key)}`, true),
@@ -1,4 +1,4 @@
1
- import type { SQLFilterDefinitions} from '@stamhoofd/sql';
1
+ import type { SQLFilterDefinitions } from '@stamhoofd/sql';
2
2
  import { baseSQLFilterCompilers, createColumnFilter, SQL, SQLValueType } from '@stamhoofd/sql';
3
3
 
4
4
  export const invoicedBalanceItemCompilers: SQLFilterDefinitions = {
@@ -1,4 +1,4 @@
1
- import type { SQLFilterDefinitions} from '@stamhoofd/sql';
1
+ import type { SQLFilterDefinitions } from '@stamhoofd/sql';
2
2
  import { baseSQLFilterCompilers, createColumnFilter, createExistsFilter, SQL, SQLCast, SQLConcat, SQLJsonUnquote, SQLScalar, SQLValueType } from '@stamhoofd/sql';
3
3
  import { invoicedBalanceItemCompilers } from './invoiced-balance-items.js';
4
4
 
@@ -1,5 +1,5 @@
1
1
  import { MemberResponsibilityRecord } from '@stamhoofd/models';
2
- import type { SQLFilterDefinitions} from '@stamhoofd/sql';
2
+ import type { SQLFilterDefinitions } from '@stamhoofd/sql';
3
3
  import { baseSQLFilterCompilers, createColumnFilter, SQL, SQLValueType } from '@stamhoofd/sql';
4
4
 
5
5
  const baseTable = SQL.table(MemberResponsibilityRecord.table);
@@ -1,6 +1,6 @@
1
1
  import { SimpleError } from '@simonbackx/simple-errors';
2
2
  import { Email, Member, MemberUser } from '@stamhoofd/models';
3
- import type { SQLFilterDefinitions} from '@stamhoofd/sql';
3
+ import type { SQLFilterDefinitions } from '@stamhoofd/sql';
4
4
  import { baseSQLFilterCompilers, createColumnFilter, createExistsFilter, createWildcardColumnFilter, SQL, SQLAge, SQLCast, SQLConcat, SQLJsonExtract, SQLScalar, SQLValueType } from '@stamhoofd/sql';
5
5
  import { AccessRight } from '@stamhoofd/structures';
6
6
  import { Context } from '../helpers/Context.js';
@@ -121,7 +121,7 @@ export const orderFilterCompilers: SQLFilterDefinitions = {
121
121
  expression: SQL.jsonExtract(SQL.column('data'), '$.value.discountCodes[*].code'),
122
122
  type: SQLValueType.JSONArray,
123
123
  nullable: true,
124
- })
124
+ }),
125
125
  },
126
126
  items: createExistsFilter(
127
127
  /**
@@ -230,14 +230,14 @@ export const orderFilterCompilers: SQLFilterDefinitions = {
230
230
  ).where(
231
231
  SQL.column('balance_items', 'id'),
232
232
  SQL.column('balance_item_payments', 'balanceItemId'),
233
- )
233
+ ),
234
234
  )
235
235
  .join(
236
236
  SQL.join(
237
237
  SQL.table('payments'),
238
238
  ).where(
239
239
  SQL.column('payments', 'id'),
240
- SQL.column('balance_item_payments', 'paymentId')
240
+ SQL.column('balance_item_payments', 'paymentId'),
241
241
  ),
242
242
  )
243
243
  .where(
@@ -247,7 +247,7 @@ export const orderFilterCompilers: SQLFilterDefinitions = {
247
247
  // payments on structure filter away failed payments -> also filter out failed payments in backend
248
248
  .whereNot(
249
249
  SQL.column('payments', 'status'),
250
- PaymentStatus.Failed
250
+ PaymentStatus.Failed,
251
251
  ),
252
252
  {
253
253
  ...baseSQLFilterCompilers,
@@ -1,4 +1,4 @@
1
- import type { SQLFilterDefinitions} from '@stamhoofd/sql';
1
+ import type { SQLFilterDefinitions } from '@stamhoofd/sql';
2
2
  import { baseSQLFilterCompilers, createColumnFilter, SQL, SQLValueType } from '@stamhoofd/sql';
3
3
 
4
4
  export const organizationRegistrationPeriodFilterCompilers: SQLFilterDefinitions = {
@@ -1,4 +1,4 @@
1
- import type { SQLFilterDefinitions} from '@stamhoofd/sql';
1
+ import type { SQLFilterDefinitions } from '@stamhoofd/sql';
2
2
  import { baseSQLFilterCompilers, createColumnFilter, createExistsFilter, SQL, SQLConcat, SQLNow, SQLNull, SQLScalar, SQLValueType, SQLWhereEqual, SQLWhereOr, SQLWhereSign } from '@stamhoofd/sql';
3
3
  import { SetupStepType } from '@stamhoofd/structures';
4
4
 
@@ -58,7 +58,7 @@ export const platformMembershipFilterCompilers: SQLFilterDefinitions = {
58
58
  SQL.column('organizations', 'id'),
59
59
  SQL.column(MemberPlatformMembership.table, 'organizationId'),
60
60
  ),
61
- organizationFilterCompilers
61
+ organizationFilterCompilers,
62
62
  ),
63
63
  member: createExistsFilter(
64
64
  SQL.select()
@@ -67,6 +67,6 @@ export const platformMembershipFilterCompilers: SQLFilterDefinitions = {
67
67
  SQL.column('members', 'id'),
68
68
  SQL.column(MemberPlatformMembership.table, 'memberId'),
69
69
  ),
70
- memberFilterCompilers
71
- )
70
+ memberFilterCompilers,
71
+ ),
72
72
  };
@@ -1,4 +1,4 @@
1
- import type { SQLFilterDefinitions} from '@stamhoofd/sql';
1
+ import type { SQLFilterDefinitions } from '@stamhoofd/sql';
2
2
  import { baseSQLFilterCompilers, createColumnFilter, createExistsFilter, SQL, SQLConcat, SQLValueType, SQLScalar } from '@stamhoofd/sql';
3
3
  import { memberFilterCompilers } from './members.js';
4
4
  import { organizationFilterCompilers } from './organizations.js';
@@ -1,4 +1,4 @@
1
- import type { SQLFilterDefinitions} from '@stamhoofd/sql';
1
+ import type { SQLFilterDefinitions } from '@stamhoofd/sql';
2
2
  import { baseSQLFilterCompilers, createColumnFilter, SQL, SQLValueType } from '@stamhoofd/sql';
3
3
 
4
4
  export const registrationPeriodFilterCompilers: SQLFilterDefinitions = {
@@ -1,5 +1,5 @@
1
1
  import { Group, Member, Organization, Registration } from '@stamhoofd/models';
2
- import type { SQLFilterDefinitions} from '@stamhoofd/sql';
2
+ import type { SQLFilterDefinitions } from '@stamhoofd/sql';
3
3
  import { baseSQLFilterCompilers, createColumnFilter, createJoinedRelationFilter, SQL, SQLValueType } from '@stamhoofd/sql';
4
4
  import { SQLTranslatedString } from '../helpers/SQLTranslatedString.js';
5
5
  import { baseRegistrationFilterCompilers } from './base-registration-filter-compilers.js';
@@ -1,4 +1,4 @@
1
- import type { SQLFilterDefinitions} from '@stamhoofd/sql';
1
+ import type { SQLFilterDefinitions } from '@stamhoofd/sql';
2
2
  import { baseSQLFilterCompilers, createColumnFilter, SQL, SQLValueType } from '@stamhoofd/sql';
3
3
 
4
4
  export const ticketFilterCompilers: SQLFilterDefinitions = {
@@ -1,4 +1,4 @@
1
- import type { SQLFilterDefinitions} from '@stamhoofd/sql';
1
+ import type { SQLFilterDefinitions } from '@stamhoofd/sql';
2
2
  import { baseSQLFilterCompilers, createColumnFilter, SQL, SQLValueType } from '@stamhoofd/sql';
3
3
 
4
4
  export const userFilterCompilers: SQLFilterDefinitions = {
@@ -1,6 +1,7 @@
1
1
  import type { Group } from '@stamhoofd/models';
2
2
  import type { SQLOrderByDirection, SQLSortDefinitions } from '@stamhoofd/sql';
3
3
  import { SQL, SQLOrderBy } from '@stamhoofd/sql';
4
+ import { SQLTranslatedString } from '../helpers/SQLTranslatedString.js';
4
5
 
5
6
  export const groupSorters: SQLSortDefinitions<Group> = {
6
7
  // WARNING! TEST NEW SORTERS THOROUGHLY!
@@ -22,4 +23,26 @@ export const groupSorters: SQLSortDefinitions<Group> = {
22
23
  });
23
24
  },
24
25
  },
26
+ periodId: {
27
+ getValue(a) {
28
+ return a.periodId;
29
+ },
30
+ toSQL: (direction: SQLOrderByDirection): SQLOrderBy => {
31
+ return new SQLOrderBy({
32
+ column: SQL.column('periodId'),
33
+ direction,
34
+ });
35
+ },
36
+ },
37
+ name: {
38
+ getValue(a) {
39
+ return a.settings.name.toString();
40
+ },
41
+ toSQL: (direction: SQLOrderByDirection): SQLOrderBy => {
42
+ return new SQLOrderBy({
43
+ column: new SQLTranslatedString(SQL.column('settings'), '$.value.name'),
44
+ direction,
45
+ });
46
+ },
47
+ },
25
48
  };
@@ -4,10 +4,10 @@ import { SQL, SQLOrderBy } from '@stamhoofd/sql';
4
4
  import type { PlatformMembership } from '@stamhoofd/structures';
5
5
 
6
6
  type KeysOfType<T, V> = {
7
- [K in keyof T]: T[K] extends V ? K : never
7
+ [K in keyof T]: T[K] extends V ? K : never
8
8
  }[keyof T];
9
9
 
10
- const columnsToFilterOn: (KeysOfType<PlatformMembership, PlainObject | Date>)[] = ['id','startDate','endDate','membershipTypeId', 'price', 'createdAt', 'trialUntil', 'freeAmount'];
10
+ const columnsToFilterOn: (KeysOfType<PlatformMembership, PlainObject | Date>)[] = ['id', 'startDate', 'endDate', 'membershipTypeId', 'price', 'createdAt', 'trialUntil', 'freeAmount'];
11
11
 
12
12
  export const platformMembershipSorters: SQLSortDefinitions<PlatformMembership> = {
13
13
  // WARNING! TEST NEW SORTERS THOROUGHLY!
@@ -17,24 +17,24 @@ export const platformMembershipSorters: SQLSortDefinitions<PlatformMembership> =
17
17
  // Why? Because ORDER BY firstName, lastName produces a different order dan ORDER BY CONCAT(firstName, ' ', lastName) if there are multiple people with spaces in the first name
18
18
  // And that again causes issues with pagination because the next query will append a filter of name > 'John Doe' - causing duplicate and/or skipped results
19
19
  // What if you need mapping? simply map the sorters in the frontend: name -> firstname, lastname, age -> birthDay, etc.
20
- ...Object.fromEntries(columnsToFilterOn.map((column: KeysOfType<PlatformMembership, PlainObject | Date>) => [column, createColumnSortDefinition(column)]))
20
+ ...Object.fromEntries(columnsToFilterOn.map((column: KeysOfType<PlatformMembership, PlainObject | Date>) => [column, createColumnSortDefinition(column)])),
21
21
  };
22
22
 
23
23
  /**
24
24
  * Create a basic sort definition from a column
25
- * @param column
26
- * @returns
25
+ * @param column
26
+ * @returns
27
27
  */
28
- function createColumnSortDefinition<K extends KeysOfType<PlatformMembership, PlainObject | Date>>(column: K): SQLSortDefinition<PlatformMembership, PlatformMembership[K]>{
28
+ function createColumnSortDefinition<K extends KeysOfType<PlatformMembership, PlainObject | Date>>(column: K): SQLSortDefinition<PlatformMembership, PlatformMembership[K]> {
29
29
  return {
30
- getValue(a: PlatformMembership) {
31
- return a[column];
32
- },
33
- toSQL: (direction: SQLOrderByDirection): SQLOrderBy => {
34
- return new SQLOrderBy({
35
- column: SQL.column(column),
36
- direction,
37
- });
38
- },
39
- }
30
+ getValue(a: PlatformMembership) {
31
+ return a[column];
32
+ },
33
+ toSQL: (direction: SQLOrderByDirection): SQLOrderBy => {
34
+ return new SQLOrderBy({
35
+ column: SQL.column(column),
36
+ direction,
37
+ });
38
+ },
39
+ };
40
40
  }
@@ -11,7 +11,7 @@ export const registrationInvitationSorters: SQLSortDefinitions<RegistrationInvit
11
11
  // And that again causes issues with pagination because the next query will append a filter of name > 'John Doe' - causing duplicate and/or skipped results
12
12
  // What if you need mapping? simply map the sorters in the frontend: name -> firstname, lastname, age -> birthDay, etc.
13
13
 
14
- 'id': {
14
+ id: {
15
15
  getValue(invitation) {
16
16
  return invitation.id;
17
17
  },
@@ -22,7 +22,7 @@ export const registrationInvitationSorters: SQLSortDefinitions<RegistrationInvit
22
22
  });
23
23
  },
24
24
  },
25
- 'createdAt': {
25
+ createdAt: {
26
26
  getValue(invitation) {
27
27
  return invitation.createdAt;
28
28
  },
@@ -1,4 +1,4 @@
1
- import type { AutoEncoderPatchType} from '@simonbackx/simple-encoding';
1
+ import type { AutoEncoderPatchType } from '@simonbackx/simple-encoding';
2
2
  import { PatchableArray } from '@simonbackx/simple-encoding';
3
3
  import { Request } from '@simonbackx/simple-endpoints';
4
4
  import type { Organization } from '@stamhoofd/models';
@@ -1,4 +1,4 @@
1
- import type { AutoEncoderPatchType} from '@simonbackx/simple-encoding';
1
+ import type { AutoEncoderPatchType } from '@simonbackx/simple-encoding';
2
2
  import { PatchableArray } from '@simonbackx/simple-encoding';
3
3
  import { Request } from '@simonbackx/simple-endpoints';
4
4
  import type { Organization, User } from '@stamhoofd/models';