@stamhoofd/backend 2.120.6 → 2.122.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (434) hide show
  1. package/output-2.txt +1 -0
  2. package/output.txt +1 -0
  3. package/package.json +70 -53
  4. package/src/audit-logs/EventNotificationLogger.ts +40 -0
  5. package/src/audit-logs/ModelLogger.ts +19 -15
  6. package/src/audit-logs/OrganizationLogger.ts +1 -1
  7. package/src/audit-logs/RegistrationInvitationLogger.ts +46 -0
  8. package/src/audit-logs/init.ts +9 -1
  9. package/src/boot.ts +19 -18
  10. package/src/crons/amazon-ses.ts +13 -26
  11. package/src/crons/balance-emails.ts +3 -5
  12. package/src/crons/clearExcelCache.test.ts +1 -1
  13. package/src/crons/clearExcelCache.ts +1 -2
  14. package/src/crons/drip-emails.ts +42 -0
  15. package/src/crons/endFunctionsOfUsersWithoutRegistration.ts +4 -0
  16. package/src/crons/helpers/isOutside.ts +11 -0
  17. package/src/crons/helpers/useSavedIterator.ts +32 -0
  18. package/src/crons/index.ts +7 -0
  19. package/src/crons/invoices.ts +160 -0
  20. package/src/crons/members-fees.ts +50 -0
  21. package/src/crons/mollie-chargebacks.ts +86 -0
  22. package/src/crons/service-fees.ts +152 -0
  23. package/src/crons/stripe-invoices.ts +48 -0
  24. package/src/crons/transfer-fees.ts +176 -0
  25. package/src/crons/update-cached-balances.ts +4 -4
  26. package/src/crons.ts +54 -74
  27. package/src/debug.ts +4 -2
  28. package/src/email-recipient-loaders/documents.ts +1 -1
  29. package/src/email-recipient-loaders/members.ts +1 -1
  30. package/src/email-recipient-loaders/payments.ts +87 -46
  31. package/src/email-recipient-loaders/registrations.ts +1 -1
  32. package/src/email-replacements/getEmailReplacementsForPayment.ts +5 -9
  33. package/src/endpoints/admin/members/ChargeMembersEndpoint.ts +1 -1
  34. package/src/endpoints/admin/memberships/ChargeMembershipsEndpoint.ts +1 -1
  35. package/src/endpoints/admin/memberships/GetChargeMembershipsSummaryEndpoint.ts +3 -5
  36. package/src/endpoints/admin/organizations/ChargeOrganizationsEndpoint.ts +1 -1
  37. package/src/endpoints/admin/organizations/GetOrganizationsCountEndpoint.ts +1 -1
  38. package/src/endpoints/admin/organizations/GetOrganizationsEndpoint.ts +13 -7
  39. package/src/endpoints/admin/organizations/PatchOrganizationsEndpoint.ts +4 -6
  40. package/src/endpoints/admin/organizations/PatchPackagesEndpoint.test.ts +10 -6
  41. package/src/endpoints/admin/organizations/PatchPackagesEndpoint.ts +39 -21
  42. package/src/endpoints/admin/registrations/ChargeRegistrationsEndpoint.ts +1 -1
  43. package/src/endpoints/auth/CreateAdminEndpoint.ts +23 -5
  44. package/src/endpoints/auth/CreateTokenEndpoint.ts +2 -2
  45. package/src/endpoints/auth/DeleteTokenEndpoint.ts +1 -1
  46. package/src/endpoints/auth/DeleteUserEndpoint.ts +3 -3
  47. package/src/endpoints/auth/ForgotPasswordEndpoint.ts +1 -1
  48. package/src/endpoints/auth/GetOtherUserEndpoint.ts +1 -1
  49. package/src/endpoints/auth/GetUserEndpoint.ts +1 -1
  50. package/src/endpoints/auth/OpenIDConnectAuthTokenEndpoint.ts +1 -1
  51. package/src/endpoints/auth/OpenIDConnectStartEndpoint.ts +1 -1
  52. package/src/endpoints/auth/PatchUserEndpoint.ts +5 -8
  53. package/src/endpoints/auth/PollEmailVerificationEndpoint.ts +1 -1
  54. package/src/endpoints/auth/RetryEmailVerificationEndpoint.ts +1 -1
  55. package/src/endpoints/auth/SignupEndpoint.ts +2 -3
  56. package/src/endpoints/auth/VerifyEmailEndpoint.ts +20 -3
  57. package/src/endpoints/frontend/FrontendEnvironmentEndpoint.ts +2 -1
  58. package/src/endpoints/global/addresses/SearchRegionsEndpoint.ts +2 -4
  59. package/src/endpoints/global/addresses/ValidateAddressEndpoint.ts +1 -1
  60. package/src/endpoints/global/audit-logs/GetAuditLogsEndpoint.ts +5 -7
  61. package/src/endpoints/global/caddy/CheckDomainCertEndpoint.ts +2 -2
  62. package/src/endpoints/global/email/CreateEmailEndpoint.ts +3 -4
  63. package/src/endpoints/global/email/GetAdminEmailsEndpoint.test.ts +1 -1
  64. package/src/endpoints/global/email/GetAdminEmailsEndpoint.ts +1 -2
  65. package/src/endpoints/global/email/GetEmailAddressEndpoint.ts +4 -6
  66. package/src/endpoints/global/email/GetEmailEndpoint.ts +1 -1
  67. package/src/endpoints/global/email/GetUserEmailsEndpoint.test.ts +1 -1
  68. package/src/endpoints/global/email/GetUserEmailsEndpoint.ts +1 -1
  69. package/src/endpoints/global/email/ManageEmailAddressEndpoint.ts +6 -10
  70. package/src/endpoints/global/email/PatchEmailEndpoint.test.ts +4 -7
  71. package/src/endpoints/global/email/PatchEmailEndpoint.ts +6 -9
  72. package/src/endpoints/global/email-recipients/GetEmailRecipientsCountEndpoint.ts +1 -1
  73. package/src/endpoints/global/email-recipients/GetEmailRecipientsEndpoint.test.ts +1 -1
  74. package/src/endpoints/global/email-recipients/GetEmailRecipientsEndpoint.ts +1 -1
  75. package/src/endpoints/global/email-recipients/RetryEmailRecipientEndpoint.ts +2 -2
  76. package/src/endpoints/global/events/GetEventNotificationsCountEndpoint.ts +1 -1
  77. package/src/endpoints/global/events/GetEventNotificationsEndpoint.ts +3 -3
  78. package/src/endpoints/global/events/GetEventsEndpoint.ts +3 -3
  79. package/src/endpoints/global/events/PatchEventNotificationsEndpoint.test.ts +49 -4
  80. package/src/endpoints/global/events/PatchEventNotificationsEndpoint.ts +5 -8
  81. package/src/endpoints/global/events/PatchEventsEndpoint.test.ts +12 -44
  82. package/src/endpoints/global/events/PatchEventsEndpoint.ts +128 -127
  83. package/src/endpoints/global/files/ExportToExcelEndpoint.ts +9 -9
  84. package/src/endpoints/global/files/GetFileCache.ts +3 -4
  85. package/src/endpoints/global/files/UploadFile.ts +3 -4
  86. package/src/endpoints/global/files/UploadImage.ts +3 -4
  87. package/src/endpoints/global/groups/GetGroupsCountEndpoint.ts +51 -0
  88. package/src/endpoints/global/groups/GetGroupsEndpoint.test.ts +1 -1
  89. package/src/endpoints/global/groups/GetGroupsEndpoint.ts +4 -2
  90. package/src/endpoints/global/members/GetMemberFamilyEndpoint.ts +2 -3
  91. package/src/endpoints/global/members/GetMembersCountEndpoint.ts +1 -1
  92. package/src/endpoints/global/members/GetMembersEndpoint.test.ts +2 -2
  93. package/src/endpoints/global/members/GetMembersEndpoint.ts +10 -12
  94. package/src/endpoints/global/members/PatchOrganizationMembersEndpoint.test.ts +195 -12
  95. package/src/endpoints/global/members/PatchOrganizationMembersEndpoint.ts +16 -22
  96. package/src/endpoints/global/members/helpers/validateGroupFilter.ts +6 -30
  97. package/src/endpoints/global/members/shouldCheckIfMemberIsDuplicate.ts +1 -1
  98. package/src/endpoints/global/organizations/CheckRegisterCodeEndpoint.ts +1 -1
  99. package/src/endpoints/global/organizations/CreateOrganizationEndpoint.ts +40 -8
  100. package/src/endpoints/global/organizations/GetOrganizationFromDomainEndpoint.ts +2 -2
  101. package/src/endpoints/global/organizations/GetOrganizationFromUriEndpoint.ts +2 -2
  102. package/src/endpoints/global/organizations/SearchOrganizationEndpoint.test.ts +4 -1
  103. package/src/endpoints/global/organizations/SearchOrganizationEndpoint.ts +4 -5
  104. package/src/endpoints/global/payments/StripeWebhookEndpoint.ts +9 -16
  105. package/src/endpoints/global/platform/GetPlatformAdminsEndpoint.ts +1 -1
  106. package/src/endpoints/global/platform/GetPlatformEndpoint.ts +1 -1
  107. package/src/endpoints/global/platform/PatchPlatformEnpoint.test.ts +1 -1
  108. package/src/endpoints/global/platform/PatchPlatformEnpoint.ts +32 -13
  109. package/src/endpoints/global/platform-memberships/GetPlatformMembershipsCountEndpoint.ts +31 -31
  110. package/src/endpoints/global/platform-memberships/GetPlatformMembershipsEndpoint.ts +18 -20
  111. package/src/endpoints/global/registration/GetRegistrationsCountEndpoint.ts +1 -1
  112. package/src/endpoints/global/registration/GetRegistrationsEndpoint.test.ts +1 -1
  113. package/src/endpoints/global/registration/GetRegistrationsEndpoint.ts +6 -10
  114. package/src/endpoints/global/registration/GetUserDetailedPayableBalanceEndpoint.ts +35 -6
  115. package/src/endpoints/global/registration/GetUserDocumentsEndpoint.ts +2 -2
  116. package/src/endpoints/global/registration/GetUserMembersEndpoint.ts +1 -1
  117. package/src/endpoints/global/registration/GetUserPayableBalanceEndpoint.ts +1 -1
  118. package/src/endpoints/global/registration/PatchUserMembersEndpoint.test.ts +2 -2
  119. package/src/endpoints/global/registration/PatchUserMembersEndpoint.ts +3 -3
  120. package/src/endpoints/global/registration/RegisterMembersEndpoint.test.ts +90 -6
  121. package/src/endpoints/global/registration/RegisterMembersEndpoint.ts +38 -33
  122. package/src/endpoints/global/registration-invitations/GetRegistrationInvitationsCountEndpoint.ts +45 -0
  123. package/src/endpoints/global/registration-invitations/GetRegistrationInvitationsEndpoint.test.ts +494 -0
  124. package/src/endpoints/global/registration-invitations/GetRegistrationInvitationsEndpoint.ts +213 -0
  125. package/src/endpoints/global/registration-invitations/PatchRegistrationInvitationsEndpoint.test.ts +404 -0
  126. package/src/endpoints/global/registration-invitations/PatchRegistrationInvitationsEndpoint.ts +167 -0
  127. package/src/endpoints/global/registration-periods/GetRegistrationPeriodsCountEndpoint.ts +43 -0
  128. package/src/endpoints/global/registration-periods/GetRegistrationPeriodsEndpoint.ts +1 -1
  129. package/src/endpoints/global/registration-periods/PatchRegistrationPeriodsEndpoint.ts +13 -5
  130. package/src/endpoints/global/sso/GetSSOEndpoint.ts +2 -3
  131. package/src/endpoints/global/sso/SetSSOEndpoint.ts +1 -1
  132. package/src/endpoints/global/webshops/GetWebshopFromDomainEndpoint.ts +2 -2
  133. package/src/endpoints/global/webshops/GetWebshopsEndpoint.test.ts +1 -2
  134. package/src/endpoints/global/webshops/GetWebshopsEndpoint.ts +2 -4
  135. package/src/endpoints/organization/dashboard/balance-items/GetBalanceItemEndpoint.ts +2 -2
  136. package/src/endpoints/organization/dashboard/balance-items/GetBalanceItemsCountEndpoint.ts +1 -1
  137. package/src/endpoints/organization/dashboard/balance-items/GetBalanceItemsEndpoint.ts +3 -4
  138. package/src/endpoints/organization/dashboard/balance-items/PatchBalanceItemsEndpoint.ts +19 -6
  139. package/src/endpoints/organization/dashboard/billing/ApplyRegisterCodeEndpoint.test.ts +73 -0
  140. package/src/endpoints/organization/dashboard/billing/ApplyRegisterCodeEndpoint.ts +89 -0
  141. package/src/endpoints/{global → organization/dashboard}/billing/DeactivatePackageEndpoint.ts +4 -9
  142. package/src/endpoints/organization/dashboard/billing/DeleteOrganizationMandateEndpoint.ts +62 -0
  143. package/src/endpoints/organization/dashboard/billing/GetOrganizationDetailedPayableBalanceCollectionEndpoint.ts +56 -0
  144. package/src/endpoints/organization/dashboard/billing/GetOrganizationDetailedPayableBalanceEndpoint.ts +41 -18
  145. package/src/endpoints/organization/dashboard/billing/GetOrganizationMandatesEndpoint.ts +64 -0
  146. package/src/endpoints/organization/dashboard/billing/GetOrganizationPayableBalanceEndpoint.ts +2 -2
  147. package/src/endpoints/organization/dashboard/billing/GetOrganizationPayableInvoicesEndpoint.ts +68 -0
  148. package/src/endpoints/organization/dashboard/billing/GetPackagesEndpoint.ts +12 -4
  149. package/src/endpoints/organization/dashboard/billing/GetRegisterCodeEndpoint.ts +66 -0
  150. package/src/endpoints/organization/dashboard/billing/OrganizationCheckoutEndpoint.test.ts +949 -0
  151. package/src/endpoints/organization/dashboard/billing/OrganizationCheckoutEndpoint.ts +311 -0
  152. package/src/endpoints/organization/dashboard/billing/PatchOrganizationMandatesEndpoint.ts +94 -0
  153. package/src/endpoints/organization/dashboard/documents/GetDocumentTemplateXML.ts +1 -1
  154. package/src/endpoints/organization/dashboard/documents/GetDocumentTemplatesCountEndpoint.ts +1 -1
  155. package/src/endpoints/organization/dashboard/documents/GetDocumentTemplatesEndpoint.ts +1 -1
  156. package/src/endpoints/organization/dashboard/documents/GetDocumentsCountEndpoint.ts +1 -1
  157. package/src/endpoints/organization/dashboard/documents/GetDocumentsEndpoint.ts +1 -1
  158. package/src/endpoints/organization/dashboard/documents/PatchDocumentEndpoint.ts +10 -2
  159. package/src/endpoints/organization/dashboard/documents/PatchDocumentTemplatesEndpoint.test.ts +2 -2
  160. package/src/endpoints/organization/dashboard/documents/PatchDocumentTemplatesEndpoint.ts +2 -2
  161. package/src/endpoints/organization/dashboard/email/CheckEmailBouncesEndpoint.ts +1 -1
  162. package/src/endpoints/organization/dashboard/email-templates/GetEmailTemplatesEndpoint.test.ts +1 -1
  163. package/src/endpoints/organization/dashboard/email-templates/GetEmailTemplatesEndpoint.ts +10 -8
  164. package/src/endpoints/organization/dashboard/email-templates/PatchEmailTemplatesEndpoint.test.ts +1 -1
  165. package/src/endpoints/organization/dashboard/email-templates/PatchEmailTemplatesEndpoint.ts +5 -6
  166. package/src/endpoints/organization/dashboard/invoices/GetInvoicesCountEndpoint.ts +1 -1
  167. package/src/endpoints/organization/dashboard/invoices/GetInvoicesEndpoint.ts +15 -4
  168. package/src/endpoints/organization/dashboard/invoices/PatchInvoicesEndpoint.ts +11 -2
  169. package/src/endpoints/organization/dashboard/mollie/CheckMollieEndpoint.ts +8 -8
  170. package/src/endpoints/organization/dashboard/mollie/ConnectMollieEndpoint.ts +10 -5
  171. package/src/endpoints/organization/dashboard/mollie/DisconnectMollieEndpoint.ts +2 -2
  172. package/src/endpoints/organization/dashboard/mollie/GetMollieDashboardEndpoint.ts +7 -7
  173. package/src/endpoints/organization/dashboard/nolt/CreateNoltTokenEndpoint.ts +1 -1
  174. package/src/endpoints/organization/dashboard/organization/GetOrganizationArchivedGroups.ts +2 -2
  175. package/src/endpoints/organization/dashboard/organization/GetOrganizationDeletedGroups.ts +1 -1
  176. package/src/endpoints/organization/dashboard/organization/GetUitpasClientIdEndpoint.ts +1 -1
  177. package/src/endpoints/organization/dashboard/organization/PatchOrganizationEndpoint.test.ts +2 -2
  178. package/src/endpoints/organization/dashboard/organization/PatchOrganizationEndpoint.ts +67 -20
  179. package/src/endpoints/organization/dashboard/organization/SearchUitpasOrganizersEndpoint.ts +2 -2
  180. package/src/endpoints/organization/dashboard/organization/SetOrganizationDomainEndpoint.ts +5 -10
  181. package/src/endpoints/organization/dashboard/organization/SetUitpasClientCredentialsEndpoint.ts +1 -1
  182. package/src/endpoints/organization/dashboard/payments/GetPaymentsCountEndpoint.ts +1 -1
  183. package/src/endpoints/organization/dashboard/payments/GetPaymentsEndpoint.ts +3 -4
  184. package/src/endpoints/organization/dashboard/payments/PatchPaymentsEndpoint.ts +24 -17
  185. package/src/endpoints/organization/dashboard/receivable-balances/ChargeReceivableBalancesEndpoint.ts +134 -0
  186. package/src/endpoints/organization/dashboard/receivable-balances/GetReceivableBalanceEndpoint.ts +2 -3
  187. package/src/endpoints/organization/dashboard/receivable-balances/GetReceivableBalancesCountEndpoint.ts +1 -1
  188. package/src/endpoints/organization/dashboard/receivable-balances/GetReceivableBalancesEndpoint.ts +1 -1
  189. package/src/endpoints/organization/dashboard/registration-periods/GetOrganizationRegistrationPeriodsEndpoint.test.ts +1 -1
  190. package/src/endpoints/organization/dashboard/registration-periods/GetOrganizationRegistrationPeriodsEndpoint.ts +2 -3
  191. package/src/endpoints/organization/dashboard/registration-periods/MoveRegistrationPeriods.test.ts +1 -1
  192. package/src/endpoints/organization/dashboard/registration-periods/PatchOrganizationRegistrationPeriodsEndpoint.test.ts +1 -1
  193. package/src/endpoints/organization/dashboard/registration-periods/PatchOrganizationRegistrationPeriodsEndpoint.ts +32 -22
  194. package/src/endpoints/organization/dashboard/registration-periods/SetupStepReviewEndpoint.ts +4 -5
  195. package/src/endpoints/organization/dashboard/stripe/ConnectStripeEndpoint.ts +1 -1
  196. package/src/endpoints/organization/dashboard/stripe/DeleteStripeAccountEndpoint.ts +2 -3
  197. package/src/endpoints/organization/dashboard/stripe/GetStripeAccountLinkEndpoint.ts +2 -2
  198. package/src/endpoints/organization/dashboard/stripe/GetStripeAccountsEndpoint.ts +1 -1
  199. package/src/endpoints/organization/dashboard/stripe/GetStripeLoginLinkEndpoint.ts +2 -2
  200. package/src/endpoints/organization/dashboard/stripe/UpdateStripeAccountEndpoint.ts +1 -1
  201. package/src/endpoints/organization/dashboard/users/CreateApiUserEndpoint.ts +1 -1
  202. package/src/endpoints/organization/dashboard/users/DeleteUserEndpoint.ts +1 -1
  203. package/src/endpoints/organization/dashboard/users/GetApiUsersEndpoint.ts +1 -1
  204. package/src/endpoints/organization/dashboard/users/GetOrganizationAdminsEndpoint.ts +1 -1
  205. package/src/endpoints/organization/dashboard/users/PatchApiUserEndpoint.ts +4 -6
  206. package/src/endpoints/organization/dashboard/webshops/CreateWebshopEndpoint.ts +10 -15
  207. package/src/endpoints/organization/dashboard/webshops/DeleteWebshopEndpoint.ts +1 -1
  208. package/src/endpoints/organization/dashboard/webshops/GetDiscountCodesEndpoint.ts +2 -2
  209. package/src/endpoints/organization/dashboard/webshops/GetWebshopOrdersCountEndpoint.ts +1 -1
  210. package/src/endpoints/organization/dashboard/webshops/GetWebshopOrdersEndpoint.ts +1 -1
  211. package/src/endpoints/organization/dashboard/webshops/GetWebshopTicketsEndpoint.ts +1 -1
  212. package/src/endpoints/organization/dashboard/webshops/GetWebshopUriAvailabilityEndpoint.ts +11 -2
  213. package/src/endpoints/organization/dashboard/webshops/PatchDiscountCodesEndpoint.ts +4 -6
  214. package/src/endpoints/organization/dashboard/webshops/PatchWebshopEndpoint.ts +29 -8
  215. package/src/endpoints/organization/dashboard/webshops/PatchWebshopOrdersEndpoint.ts +21 -28
  216. package/src/endpoints/organization/dashboard/webshops/PatchWebshopTicketsEndpoint.ts +1 -1
  217. package/src/endpoints/organization/dashboard/webshops/SearchUitpasEventsEndpoint.ts +2 -2
  218. package/src/endpoints/organization/dashboard/webshops/VerifyWebshopDomainEndpoint.ts +2 -3
  219. package/src/endpoints/organization/dashboard/webshops/WebshopReservedPathSegments.test.ts +95 -0
  220. package/src/endpoints/organization/shared/ExchangePaymentEndpoint.ts +15 -13
  221. package/src/endpoints/organization/shared/GetDocumentHtml.ts +1 -1
  222. package/src/endpoints/organization/shared/GetPaymentEndpoint.ts +1 -1
  223. package/src/endpoints/organization/shared/GetUitpasNumberDetailsEndpoint.ts +3 -5
  224. package/src/endpoints/organization/shared/auth/GetOrganizationEndpoint.ts +1 -1
  225. package/src/endpoints/organization/webshops/CheckWebshopDiscountCodesEndpoint.ts +4 -1
  226. package/src/endpoints/organization/webshops/GetOrderByPaymentEndpoint.ts +14 -3
  227. package/src/endpoints/organization/webshops/GetOrderEndpoint.ts +14 -2
  228. package/src/endpoints/organization/webshops/GetTicketsEndpoint.ts +37 -16
  229. package/src/endpoints/organization/webshops/GetWebshopEndpoint.test.ts +34 -2
  230. package/src/endpoints/organization/webshops/GetWebshopEndpoint.ts +4 -2
  231. package/src/endpoints/organization/webshops/PlaceOrderEndpoint.test.ts +74 -3
  232. package/src/endpoints/organization/webshops/PlaceOrderEndpoint.ts +28 -50
  233. package/src/endpoints/organization/webshops/RetrieveUitpasSocialTariffPriceEndpoint.ts +3 -5
  234. package/src/endpoints/organization/webshops/WebshopAuthHelper.ts +36 -0
  235. package/src/endpoints/system/HealthEndpoint.ts +1 -1
  236. package/src/excel-loaders/balance-items.ts +1 -1
  237. package/src/excel-loaders/event-notifications.ts +1 -1
  238. package/src/excel-loaders/members.ts +1 -1
  239. package/src/excel-loaders/organizations.ts +3 -3
  240. package/src/excel-loaders/payments.ts +31 -1
  241. package/src/excel-loaders/platform-memberships.ts +13 -14
  242. package/src/excel-loaders/receivable-balances.ts +2 -2
  243. package/src/excel-loaders/registrations.ts +2 -3
  244. package/src/helpers/AddressValidator.ts +7 -14
  245. package/src/helpers/AdminPermissionChecker.ts +60 -65
  246. package/src/helpers/AuthenticatedStructures.ts +153 -51
  247. package/src/helpers/BalanceItemRelationsBackfiller.test.ts +174 -0
  248. package/src/helpers/BalanceItemRelationsBackfiller.ts +163 -0
  249. package/src/helpers/BuckarooHelper.ts +2 -4
  250. package/src/helpers/CheckSettlements.ts +12 -24
  251. package/src/helpers/Context.ts +15 -10
  252. package/src/helpers/CookieHelper.ts +1 -2
  253. package/src/helpers/EmailResumer.ts +1 -2
  254. package/src/helpers/FileCache.ts +2 -3
  255. package/src/helpers/FinancialSupportHelper.ts +21 -0
  256. package/src/helpers/FlagMomentCleanup.ts +1 -2
  257. package/src/helpers/ForwardHandler.ts +5 -10
  258. package/src/helpers/GlobalHelper.ts +3 -3
  259. package/src/helpers/LegacyBillingConverter.ts +787 -0
  260. package/src/helpers/MemberMerger.test.ts +782 -0
  261. package/src/helpers/MemberMerger.ts +600 -0
  262. package/src/helpers/MemberUserSyncer.ts +6 -12
  263. package/src/helpers/MembershipCharger.ts +2 -4
  264. package/src/helpers/PaymentCustomerResolver.test.ts +203 -0
  265. package/src/helpers/PaymentCustomerResolver.ts +144 -0
  266. package/src/helpers/PeriodHelper.ts +2 -3
  267. package/src/helpers/RecordAnswerHelper.test.ts +741 -0
  268. package/src/helpers/RecordAnswerHelper.ts +116 -0
  269. package/src/helpers/SeedTools.ts +106 -0
  270. package/src/helpers/ServiceFeeHelper.ts +125 -15
  271. package/src/helpers/SetupStepUpdater.ts +38 -32
  272. package/src/helpers/StamhoofdFilterAccessHelper.ts +52 -0
  273. package/src/helpers/StripeHelper.ts +15 -38
  274. package/src/helpers/StripeInvoicer.ts +419 -0
  275. package/src/helpers/StripePayoutChecker.ts +5 -10
  276. package/src/helpers/TagHelper.ts +7 -8
  277. package/src/helpers/TemporaryMemberAccess.ts +1 -2
  278. package/src/helpers/ThrottledQueue.ts +1 -2
  279. package/src/helpers/UitpasTokenRepository.ts +1 -2
  280. package/src/helpers/ViesHelper.ts +11 -11
  281. package/src/helpers/XlsxTransformerColumnHelper.ts +1 -1
  282. package/src/helpers/outstandingBalanceJoin.ts +2 -2
  283. package/src/helpers/updateMemberDetailsUitpasNumber.ts +3 -5
  284. package/src/migrate.ts +12 -5
  285. package/src/{seeds → migrations}/0000000004-single-organization.ts +10 -1
  286. package/src/migrations/0000000006-default-organization.ts +139 -0
  287. package/src/{seeds → migrations}/1715028563-user-permissions.ts +17 -27
  288. package/src/{seeds/1765896674-document-update-year.test.ts → migrations/1750090029-document-update-year.test.ts} +27 -26
  289. package/src/migrations/1750090029-document-update-year.ts +103 -0
  290. package/src/migrations/1750090030-records-configuration.ts +92 -0
  291. package/src/migrations/1750090031-records-configuration-webshops.ts +36 -0
  292. package/src/migrations/1752848540-national-numbers.ts +585 -0
  293. package/src/migrations/1752848550-records-configuration-group-filter.ts +1064 -0
  294. package/src/{seeds → migrations}/1752848561-groups-registration-periods.ts +95 -27
  295. package/src/{seeds → migrations}/1754560914-groups-prices.test.ts +1 -1
  296. package/src/{seeds → migrations}/1754560914-groups-prices.ts +9 -15
  297. package/src/{seeds → migrations}/1756293699-fill-previous-next-period-id.ts +1 -2
  298. package/src/migrations/1761665607-sync-member-users.ts +40 -0
  299. package/src/migrations/1779121239-default-invoice-email-template.sql +3 -0
  300. package/src/migrations/1779121240-invoice-email-template.sql +6 -0
  301. package/src/migrations/1779986893-default-payment-failed-email-templates.sql +4 -0
  302. package/src/migrations/1780578166-convert-legacy-billing.ts +13 -0
  303. package/src/{seeds/1755876819-remove-duplicate-members.ts → migrations/1780665426-remove-duplicate-members.ts} +23 -4
  304. package/src/migrations/1780933598-document-groups.ts +88 -0
  305. package/src/migrations/1781692342-balance-item-relations.ts +13 -0
  306. package/src/migrations/1781857866-platform-admins.ts +103 -0
  307. package/src/migrations/1781857867-rm-old-platform-admins.ts +25 -0
  308. package/src/seeds/0000000001-throw.ts +5 -0
  309. package/src/seeds/1760702452-update-balance-price-paid.ts +19 -0
  310. package/src/seeds/1760702453-update-balance-invoiced.ts +19 -0
  311. package/src/seeds/1760702454-update-cached-outstanding-balance-from-items.ts +51 -14
  312. package/src/seeds/1773754928-force-save-members.ts +41 -8
  313. package/src/seeds/1780665427-schedule-stock-updates.ts +45 -0
  314. package/src/seeds/1780665428-group-update-occupancy.ts +31 -0
  315. package/src/seeds/1780915001-fill-payment-customer.ts +70 -0
  316. package/src/seeds/1780915002-update-orders.ts +39 -0
  317. package/src/seeds/1782047708-organization-company-address.ts +44 -0
  318. package/src/seeds-temporary/1769088653-uitpas-status.ts +1 -2
  319. package/src/seeds-temporary/1780416000-migrate-audit-log-legacy-enums.test.ts +69 -0
  320. package/src/seeds-temporary/1780416000-migrate-audit-log-legacy-enums.ts +85 -0
  321. package/src/services/AuditLogService.test.ts +51 -0
  322. package/src/services/AuditLogService.ts +45 -0
  323. package/src/services/BalanceItemService.ts +148 -55
  324. package/src/services/CpuService.ts +3 -6
  325. package/src/services/DatabaseCollationService.test.ts +1 -2
  326. package/src/services/DocumentService.ts +1 -2
  327. package/src/services/EventNotificationService.ts +1 -1
  328. package/src/services/FileSignService.ts +2 -4
  329. package/src/services/InvoicePdfService.ts +286 -0
  330. package/src/services/InvoiceService.ts +330 -77
  331. package/src/services/InvoiceXMLService.ts +424 -0
  332. package/src/services/MemberNumberService.ts +6 -11
  333. package/src/services/MemberRecordStore.ts +8 -10
  334. package/src/services/MollieService.ts +530 -0
  335. package/src/services/PaymentMandateService.ts +214 -0
  336. package/src/services/PaymentReallocationService.test.ts +1 -1
  337. package/src/services/PaymentReallocationService.ts +7 -9
  338. package/src/services/PaymentService.ts +820 -328
  339. package/src/services/PlatformMembershipService.ts +5 -9
  340. package/src/services/ReferralService.ts +223 -0
  341. package/src/services/RegistrationService.ts +125 -54
  342. package/src/services/SSOService.test.ts +119 -0
  343. package/src/services/SSOService.ts +56 -49
  344. package/src/services/STPackageService.ts +97 -68
  345. package/src/services/UniqueMemberNumberService.ts +69 -0
  346. package/src/services/UniqueUserService.ts +3 -6
  347. package/src/services/VATService.ts +85 -0
  348. package/src/services/data/invoice.hbs.html +686 -0
  349. package/src/services/uitpas/PassholderEndpoints.ts +3 -6
  350. package/src/services/uitpas/UitpasService.ts +6 -10
  351. package/src/services/uitpas/checkUitpasNumbers.ts +2 -4
  352. package/src/services/uitpas/getSocialTariffForUitpasNumbers.ts +3 -6
  353. package/src/services/uitpas/searchUitpasEvents.ts +1 -2
  354. package/src/sql-filters/audit-logs.ts +1 -1
  355. package/src/sql-filters/balance-item-payments.ts +1 -1
  356. package/src/sql-filters/balance-items.ts +1 -1
  357. package/src/sql-filters/base-registration-filter-compilers.ts +5 -33
  358. package/src/sql-filters/document-templates.ts +1 -1
  359. package/src/sql-filters/documents.ts +1 -1
  360. package/src/sql-filters/email-recipients.ts +1 -1
  361. package/src/sql-filters/emails.ts +1 -1
  362. package/src/sql-filters/event-notifications.ts +1 -1
  363. package/src/sql-filters/events.ts +6 -1
  364. package/src/sql-filters/groups.ts +16 -1
  365. package/src/sql-filters/invoiced-balance-items.ts +1 -1
  366. package/src/sql-filters/invoices.ts +1 -1
  367. package/src/sql-filters/member-responsibility-records.ts +1 -1
  368. package/src/sql-filters/members.ts +1 -1
  369. package/src/sql-filters/orders.ts +4 -4
  370. package/src/sql-filters/organization-registration-periods.ts +1 -1
  371. package/src/sql-filters/organizations.ts +1 -1
  372. package/src/sql-filters/payments.ts +5 -0
  373. package/src/sql-filters/platform-memberships.ts +3 -3
  374. package/src/sql-filters/receivable-balances.ts +1 -1
  375. package/src/sql-filters/registration-invitations.ts +90 -0
  376. package/src/sql-filters/registration-periods.ts +1 -1
  377. package/src/sql-filters/registrations.ts +1 -1
  378. package/src/sql-filters/tickets.ts +1 -1
  379. package/src/sql-filters/users.ts +1 -1
  380. package/src/sql-sorters/groups.ts +23 -0
  381. package/src/sql-sorters/platform-memberships.ts +16 -16
  382. package/src/sql-sorters/registration-invitations.ts +36 -0
  383. package/tests/actions/patchOrganizationMember.ts +1 -1
  384. package/tests/actions/patchUserMember.ts +1 -1
  385. package/tests/assertions/assertBalances.ts +6 -12
  386. package/tests/e2e/api-rate-limits.test.ts +12 -24
  387. package/tests/e2e/bundle-discounts.test.ts +4 -1
  388. package/tests/e2e/charge-members.test.ts +13 -11
  389. package/tests/e2e/documents.test.ts +4 -1
  390. package/tests/e2e/register.test.ts +7 -9
  391. package/tests/e2e/stock.test.ts +4 -3
  392. package/tests/e2e/tickets.test.ts +1 -1
  393. package/tests/helpers/MollieMocker.ts +462 -0
  394. package/tests/helpers/PayconiqMocker.ts +138 -45
  395. package/tests/helpers/StripeMocker.ts +9 -6
  396. package/tests/helpers/index.ts +4 -0
  397. package/tests/init/initAdmin.ts +2 -2
  398. package/tests/init/initBundleDiscount.ts +1 -1
  399. package/tests/init/initMembershipOrganization.ts +13 -0
  400. package/tests/init/initPermissionRole.ts +3 -4
  401. package/tests/vitest.global.setup.ts +1 -1
  402. package/vitest.config.js +7 -0
  403. package/.nvmrc +0 -1
  404. package/src/endpoints/global/billing/ActivatePackagesEndpoint.ts +0 -216
  405. package/src/helpers/GroupBuilder.ts +0 -418
  406. package/src/seeds/0000000000-example.ts +0 -11
  407. package/src/seeds/1722256498-group-update-occupancy.ts +0 -52
  408. package/src/seeds/1726572303-schedule-stock-updates.ts +0 -52
  409. package/src/seeds/1726847064-setup-steps.ts +0 -16
  410. package/src/seeds/1728928974-update-cached-outstanding-balance-from-items.ts +0 -31
  411. package/src/seeds/1729253172-update-orders.ts +0 -21
  412. package/src/seeds/1733319079-fill-paying-organization-ids.ts +0 -68
  413. package/src/seeds/1733748412-update-deleted-order-numbers.ts +0 -109
  414. package/src/seeds/1733994455-balance-item-status-open.ts +0 -30
  415. package/src/seeds/1740046783-update-membership.ts +0 -17
  416. package/src/seeds/1741008870-fix-auditlog-description.ts +0 -50
  417. package/src/seeds/1741011468-fix-auditlog-description-uft16.ts +0 -88
  418. package/src/seeds/1741268179-fix-group-dates-of-events.ts +0 -32
  419. package/src/seeds/1750090030-records-configuration.ts +0 -26
  420. package/src/seeds/1751445358-upload-email-attachments.ts +0 -106
  421. package/src/seeds/1755532883-update-email-sender-ids.ts +0 -47
  422. package/src/seeds/1755790070-fill-email-recipient-errors.ts +0 -96
  423. package/src/seeds/1756115432-remove-old-drafts.ts +0 -16
  424. package/src/seeds/1756115433-fill-email-recipient-organization-id.ts +0 -30
  425. package/src/seeds/1756303697-update-email-counts.ts +0 -76
  426. package/src/seeds/1761665607-sync-member-users.ts +0 -59
  427. package/src/seeds/1765896674-document-update-year.ts +0 -66
  428. /package/src/{seeds → migrations}/0000000001-development-user.ts +0 -0
  429. /package/src/{seeds → migrations}/0000000002-clear-stamhoofd-email-templates.ts +0 -0
  430. /package/src/{seeds → migrations}/0000000003-default-email-templates.ts +0 -0
  431. /package/src/{seeds → migrations}/1752848561-groups-registration-periods.test.ts +0 -0
  432. /package/src/{seeds → migrations}/1766150402-document-published-at.test.ts +0 -0
  433. /package/src/{seeds → migrations}/1766150402-document-published-at.ts +0 -0
  434. /package/src/{seeds → migrations}/data/default-email-templates.sql +0 -0
@@ -0,0 +1,741 @@
1
+ import type { AutoEncoderPatchType } from '@simonbackx/simple-encoding';
2
+ import { PatchableArray } from '@simonbackx/simple-encoding';
3
+ import { FileType, RecordCategory, RecordChoice, RecordSettings, RecordType, TranslatedString } from '@stamhoofd/structures';
4
+ import { RecordAnswerHelper } from './RecordAnswerHelper.js';
5
+
6
+ describe('RecordAnswerHelper', () => {
7
+ const record1 = RecordSettings.create({
8
+ name: TranslatedString.create('vraag 1'),
9
+ type: RecordType.Text,
10
+ });
11
+
12
+ const record2 = RecordSettings.create({
13
+ name: TranslatedString.create('vraag 2'),
14
+ type: RecordType.Integer,
15
+ });
16
+
17
+ const record3 = RecordSettings.create({
18
+ name: TranslatedString.create('vraag 3'),
19
+ type: RecordType.Text,
20
+ });
21
+
22
+ const record4 = RecordSettings.create({
23
+ name: TranslatedString.create('vraag 4'),
24
+ type: RecordType.Date,
25
+ });
26
+
27
+ const record5 = RecordSettings.create({
28
+ name: TranslatedString.create('vraag 5'),
29
+ type: RecordType.MultipleChoice,
30
+ choices: [
31
+ RecordChoice.create({ name: TranslatedString.create('keuze 1') }),
32
+ RecordChoice.create({ name: TranslatedString.create('keuze 2') }),
33
+ ],
34
+ });
35
+
36
+ const record6 = RecordSettings.create({
37
+ name: TranslatedString.create('vraag 6'),
38
+ type: RecordType.Email,
39
+ });
40
+
41
+ const record7 = RecordSettings.create({
42
+ name: TranslatedString.create('vraag 7'),
43
+ type: RecordType.Price,
44
+ });
45
+
46
+ const record8 = RecordSettings.create({
47
+ name: TranslatedString.create('vraag 8'),
48
+ type: RecordType.File,
49
+ fileType: FileType.PDF,
50
+ });
51
+
52
+ const childCategory1 = RecordCategory.create({
53
+ name: TranslatedString.create('subcategorie 1'),
54
+ records: [record3, record4],
55
+ });
56
+
57
+ const childCategory2 = RecordCategory.create({
58
+ name: TranslatedString.create('subcategorie 2'),
59
+ records: [record5],
60
+ });
61
+
62
+ const recordCategory1 = RecordCategory.create({
63
+ name: TranslatedString.create('categorie 1'),
64
+ records: [record1, record2],
65
+ childCategories: [childCategory1, childCategory2],
66
+ });
67
+
68
+ const recordCategory2 = RecordCategory.create({
69
+ name: TranslatedString.create('categorie 2'),
70
+ records: [record6, record7, record8],
71
+ });
72
+
73
+ const originalRecordCategories = [recordCategory1, recordCategory2];
74
+
75
+ describe('throwIfPatchOrPutIsInvalid', () => {
76
+ test('patch - happy path should not throw', () => {
77
+ const patches = new PatchableArray<string, RecordCategory, AutoEncoderPatchType<RecordCategory>>();
78
+ const recordPatches1 = new PatchableArray<string, RecordSettings, AutoEncoderPatchType<RecordSettings>>();
79
+
80
+ const recordPatch1 = RecordSettings.patch({
81
+ id: record1.id,
82
+ name: TranslatedString.create('vraag 1 - updated'),
83
+ type: RecordType.Textarea,
84
+ });
85
+
86
+ const recordPatch2 = RecordSettings.patch({
87
+ id: record2.id,
88
+ name: TranslatedString.create('vraag 2 - updated'),
89
+ type: RecordType.Integer,
90
+ });
91
+
92
+ recordPatches1.addPatch(recordPatch1);
93
+ recordPatches1.addPatch(recordPatch2);
94
+
95
+ const recordPatches2 = new PatchableArray<string, RecordSettings, AutoEncoderPatchType<RecordSettings>>();
96
+
97
+ const recordPatch3 = RecordSettings.patch({
98
+ id: record3.id,
99
+ name: TranslatedString.create('vraag 3 - updated'),
100
+ type: RecordType.Email,
101
+ });
102
+
103
+ const recordPatch4 = RecordSettings.patch({
104
+ id: record4.id,
105
+ name: TranslatedString.create('vraag 4 - updated'),
106
+ });
107
+
108
+ recordPatches2.addPatch(recordPatch3);
109
+ recordPatches2.addPatch(recordPatch4);
110
+
111
+ const recordPatches3 = new PatchableArray<string, RecordSettings, AutoEncoderPatchType<RecordSettings>>();
112
+
113
+ const recordPatch5 = RecordSettings.patch({
114
+ id: record5.id,
115
+ name: TranslatedString.create('vraag 5 - updated'),
116
+ });
117
+
118
+ recordPatches3.addPatch(recordPatch5);
119
+
120
+ const recordPatches4 = new PatchableArray<string, RecordSettings, AutoEncoderPatchType<RecordSettings>>();
121
+
122
+ const recordPatch7 = RecordSettings.patch({
123
+ id: record7.id,
124
+ name: TranslatedString.create('vraag 7 - updated'),
125
+ });
126
+
127
+ recordPatches4.addPatch(recordPatch7);
128
+
129
+ const childCategoriesPatch1 = new PatchableArray<string, RecordCategory, AutoEncoderPatchType<RecordCategory>>();
130
+
131
+ childCategoriesPatch1.addPatch(RecordCategory.patch({
132
+ id: childCategory1.id,
133
+ records: recordPatches2,
134
+ }));
135
+
136
+ childCategoriesPatch1.addPatch(RecordCategory.patch({
137
+ id: childCategory2.id,
138
+ records: recordPatches3,
139
+ }));
140
+
141
+ const patch1 = RecordCategory.patch({
142
+ id: recordCategory1.id,
143
+ records: recordPatches1,
144
+ childCategories: childCategoriesPatch1,
145
+ });
146
+
147
+ const patch2 = RecordCategory.patch({
148
+ id: recordCategory2.id,
149
+ records: recordPatches4,
150
+ });
151
+
152
+ patches.addPatch(patch1);
153
+ patches.addPatch(patch2);
154
+
155
+ // should not throw
156
+ expect(() => RecordAnswerHelper.throwIfPatchOrPutIsInvalid(originalRecordCategories, patches)).not.toThrow();
157
+ });
158
+
159
+ describe('patch - should throw if type changes', () => {
160
+ test('case 1 - error in root category', () => {
161
+ const patches = new PatchableArray<string, RecordCategory, AutoEncoderPatchType<RecordCategory>>();
162
+ const recordPatches1 = new PatchableArray<string, RecordSettings, AutoEncoderPatchType<RecordSettings>>();
163
+
164
+ const recordPatch1 = RecordSettings.patch({
165
+ id: record1.id,
166
+ name: TranslatedString.create('vraag 1 - updated'),
167
+ type: RecordType.Textarea,
168
+ });
169
+
170
+ const recordPatch2 = RecordSettings.patch({
171
+ id: record2.id,
172
+ name: TranslatedString.create('vraag 2 - updated'),
173
+ // type changed -> should throw
174
+ type: RecordType.Email,
175
+ });
176
+
177
+ recordPatches1.addPatch(recordPatch1);
178
+ recordPatches1.addPatch(recordPatch2);
179
+
180
+ const patch1 = RecordCategory.patch({
181
+ id: recordCategory1.id,
182
+ records: recordPatches1,
183
+ });
184
+
185
+ patches.addPatch(patch1);
186
+
187
+ // should throw
188
+ expect(() => RecordAnswerHelper.throwIfPatchOrPutIsInvalid(originalRecordCategories, patches)).toThrow('Cannot change record type from Integer to Email');
189
+ });
190
+
191
+ test('case 2 - error in child category', () => {
192
+ const patches = new PatchableArray<string, RecordCategory, AutoEncoderPatchType<RecordCategory>>();
193
+ const recordPatches1 = new PatchableArray<string, RecordSettings, AutoEncoderPatchType<RecordSettings>>();
194
+
195
+ const recordPatch1 = RecordSettings.patch({
196
+ id: record1.id,
197
+ name: TranslatedString.create('vraag 1 - updated'),
198
+ type: RecordType.Textarea,
199
+ });
200
+
201
+ const recordPatch2 = RecordSettings.patch({
202
+ id: record2.id,
203
+ name: TranslatedString.create('vraag 2 - updated'),
204
+ type: RecordType.Integer,
205
+ });
206
+
207
+ recordPatches1.addPatch(recordPatch1);
208
+ recordPatches1.addPatch(recordPatch2);
209
+
210
+ const recordPatches2 = new PatchableArray<string, RecordSettings, AutoEncoderPatchType<RecordSettings>>();
211
+
212
+ const recordPatch3 = RecordSettings.patch({
213
+ id: record3.id,
214
+ name: TranslatedString.create('vraag 3 - updated'),
215
+ type: RecordType.Email,
216
+ });
217
+
218
+ const recordPatch4 = RecordSettings.patch({
219
+ id: record4.id,
220
+ name: TranslatedString.create('vraag 4 - updated'),
221
+ // changes from date to text -> should throw
222
+ type: RecordType.Text,
223
+ });
224
+
225
+ recordPatches2.addPatch(recordPatch3);
226
+ recordPatches2.addPatch(recordPatch4);
227
+
228
+ const recordPatches3 = new PatchableArray<string, RecordSettings, AutoEncoderPatchType<RecordSettings>>();
229
+
230
+ const recordPatch5 = RecordSettings.patch({
231
+ id: record5.id,
232
+ name: TranslatedString.create('vraag 5 - updated'),
233
+ });
234
+
235
+ recordPatches3.addPatch(recordPatch5);
236
+
237
+ const childCategoriesPatch1 = new PatchableArray<string, RecordCategory, AutoEncoderPatchType<RecordCategory>>();
238
+
239
+ childCategoriesPatch1.addPatch(RecordCategory.patch({
240
+ id: childCategory1.id,
241
+ records: recordPatches2,
242
+ }));
243
+
244
+ childCategoriesPatch1.addPatch(RecordCategory.patch({
245
+ id: childCategory2.id,
246
+ records: recordPatches3,
247
+ }));
248
+
249
+ const patch1 = RecordCategory.patch({
250
+ id: recordCategory1.id,
251
+ records: recordPatches1,
252
+ childCategories: childCategoriesPatch1,
253
+ });
254
+
255
+ patches.addPatch(patch1);
256
+
257
+ // should throw
258
+ expect(() => RecordAnswerHelper.throwIfPatchOrPutIsInvalid(originalRecordCategories, patches)).toThrow('Cannot change record type from Date to Text');
259
+ });
260
+ });
261
+
262
+ test('patch - should throw if file type changes', () => {
263
+ const patches = new PatchableArray<string, RecordCategory, AutoEncoderPatchType<RecordCategory>>();
264
+ const recordPatches1 = new PatchableArray<string, RecordSettings, AutoEncoderPatchType<RecordSettings>>();
265
+
266
+ recordPatches1.addPatch(RecordSettings.patch({
267
+ id: record8.id,
268
+ name: TranslatedString.create('vraag 8 - updated'),
269
+ type: RecordType.File,
270
+ fileType: FileType.Word,
271
+ }));
272
+
273
+ patches.addPatch(RecordCategory.patch({
274
+ id: recordCategory2.id,
275
+ records: recordPatches1,
276
+ }));
277
+
278
+ // should throw
279
+ expect(() => RecordAnswerHelper.throwIfPatchOrPutIsInvalid(originalRecordCategories, patches)).toThrow('Cannot change record file type from PDF to Word');
280
+ });
281
+
282
+ test('put - happy path should not throw', () => {
283
+ const newRecord1 = RecordSettings.create({
284
+ id: record1.id,
285
+ name: TranslatedString.create('vraag 1'),
286
+ // type changed but same class -> should not throw
287
+ type: RecordType.Text,
288
+ });
289
+
290
+ const newRecord2 = RecordSettings.create({
291
+ id: record2.id,
292
+ name: TranslatedString.create('vraag 2'),
293
+ type: RecordType.Integer,
294
+ });
295
+
296
+ const newRecord3 = RecordSettings.create({
297
+ id: record3.id,
298
+ name: TranslatedString.create('vraag 3'),
299
+ type: RecordType.Text,
300
+ });
301
+
302
+ const newRecord4 = RecordSettings.create({
303
+ id: record4.id,
304
+ name: TranslatedString.create('vraag 4'),
305
+ type: RecordType.Date,
306
+ });
307
+
308
+ const newRecord5 = RecordSettings.create({
309
+ id: record5.id,
310
+ name: TranslatedString.create('vraag 5'),
311
+ type: RecordType.MultipleChoice,
312
+ choices: [
313
+ RecordChoice.create({ name: TranslatedString.create('keuze 1') }),
314
+ RecordChoice.create({ name: TranslatedString.create('keuze 2') }),
315
+ ],
316
+ });
317
+
318
+ const newRecord6 = RecordSettings.create({
319
+ id: record6.id,
320
+ name: TranslatedString.create('vraag 6'),
321
+ type: RecordType.Email,
322
+ });
323
+
324
+ const newRecord7 = RecordSettings.create({
325
+ id: record7.id,
326
+ name: TranslatedString.create('vraag 7'),
327
+ type: RecordType.Price,
328
+ });
329
+
330
+ const newRecord8 = RecordSettings.create({
331
+ id: record8.id,
332
+ name: TranslatedString.create('vraag 8'),
333
+ type: RecordType.File,
334
+ fileType: FileType.PDF,
335
+ });
336
+
337
+ const newChildCategory1 = RecordCategory.create({
338
+ id: childCategory1.id,
339
+ name: TranslatedString.create('subcategorie 1'),
340
+ records: [newRecord3, newRecord4],
341
+ });
342
+
343
+ const newChildCategory2 = RecordCategory.create({
344
+ id: childCategory2.id,
345
+ name: TranslatedString.create('subcategorie 2'),
346
+ records: [newRecord5],
347
+ });
348
+
349
+ const newRecordCategory1 = RecordCategory.create({
350
+ id: recordCategory1.id,
351
+ name: TranslatedString.create('categorie 1'),
352
+ records: [newRecord1, newRecord2],
353
+ childCategories: [newChildCategory1, newChildCategory2],
354
+ });
355
+
356
+ const newRecordCategory2 = RecordCategory.create({
357
+ id: recordCategory2.id,
358
+ name: TranslatedString.create('categorie 2'),
359
+ records: [newRecord6, newRecord7, newRecord8],
360
+ });
361
+
362
+ const newRecordCategories = [newRecordCategory1, newRecordCategory2];
363
+
364
+ // should not throw
365
+ expect(() => RecordAnswerHelper.throwIfPatchOrPutIsInvalid(originalRecordCategories, newRecordCategories)).not.toThrow();
366
+ });
367
+
368
+ describe('put - should throw if type changes', () => {
369
+ test('case 1 - error in root category', () => {
370
+ const newRecord1 = RecordSettings.create({
371
+ id: record1.id,
372
+ name: TranslatedString.create('vraag 1'),
373
+ // type changed but same class -> should not throw
374
+ type: RecordType.Text,
375
+ });
376
+
377
+ const newRecord2 = RecordSettings.create({
378
+ id: record2.id,
379
+ name: TranslatedString.create('vraag 2'),
380
+ // type changed from Integer to Email -> should throw
381
+ type: RecordType.Email,
382
+ });
383
+
384
+ const newRecord3 = RecordSettings.create({
385
+ id: record3.id,
386
+ name: TranslatedString.create('vraag 3'),
387
+ type: RecordType.Text,
388
+ });
389
+
390
+ const newRecord4 = RecordSettings.create({
391
+ id: record4.id,
392
+ name: TranslatedString.create('vraag 4'),
393
+ type: RecordType.Date,
394
+ });
395
+
396
+ const newRecord5 = RecordSettings.create({
397
+ id: record5.id,
398
+ name: TranslatedString.create('vraag 5'),
399
+ type: RecordType.MultipleChoice,
400
+ choices: [
401
+ RecordChoice.create({ name: TranslatedString.create('keuze 1') }),
402
+ RecordChoice.create({ name: TranslatedString.create('keuze 2') }),
403
+ ],
404
+ });
405
+
406
+ const newRecord6 = RecordSettings.create({
407
+ id: record6.id,
408
+ name: TranslatedString.create('vraag 6'),
409
+ type: RecordType.Email,
410
+ });
411
+
412
+ const newRecord7 = RecordSettings.create({
413
+ id: record7.id,
414
+ name: TranslatedString.create('vraag 7'),
415
+ type: RecordType.Price,
416
+ });
417
+
418
+ const newRecord8 = RecordSettings.create({
419
+ id: record8.id,
420
+ name: TranslatedString.create('vraag 8'),
421
+ type: RecordType.File,
422
+ fileType: FileType.PDF,
423
+ });
424
+
425
+ const newChildCategory1 = RecordCategory.create({
426
+ id: childCategory1.id,
427
+ name: TranslatedString.create('subcategorie 1'),
428
+ records: [newRecord3, newRecord4],
429
+ });
430
+
431
+ const newChildCategory2 = RecordCategory.create({
432
+ id: childCategory2.id,
433
+ name: TranslatedString.create('subcategorie 2'),
434
+ records: [newRecord5],
435
+ });
436
+
437
+ const newRecordCategory1 = RecordCategory.create({
438
+ id: recordCategory1.id,
439
+ name: TranslatedString.create('categorie 1'),
440
+ records: [newRecord1, newRecord2],
441
+ childCategories: [newChildCategory1, newChildCategory2],
442
+ });
443
+
444
+ const newRecordCategory2 = RecordCategory.create({
445
+ id: recordCategory2.id,
446
+ name: TranslatedString.create('categorie 2'),
447
+ records: [newRecord6, newRecord7, newRecord8],
448
+ });
449
+
450
+ const newRecordCategories = [newRecordCategory1, newRecordCategory2];
451
+
452
+ // should throw
453
+ expect(() => RecordAnswerHelper.throwIfPatchOrPutIsInvalid(originalRecordCategories, newRecordCategories)).toThrow('Cannot change record type from Integer to Email');
454
+ });
455
+
456
+ test('case 2 - error in child category', () => {
457
+ const newRecord1 = RecordSettings.create({
458
+ id: record1.id,
459
+ name: TranslatedString.create('vraag 1'),
460
+ // type changed but same class -> should not throw
461
+ type: RecordType.Text,
462
+ });
463
+
464
+ const newRecord2 = RecordSettings.create({
465
+ id: record2.id,
466
+ name: TranslatedString.create('vraag 2'),
467
+ type: RecordType.Integer,
468
+ });
469
+
470
+ const newRecord3 = RecordSettings.create({
471
+ id: record3.id,
472
+ name: TranslatedString.create('vraag 3'),
473
+ type: RecordType.Text,
474
+ });
475
+
476
+ const newRecord4 = RecordSettings.create({
477
+ id: record4.id,
478
+ name: TranslatedString.create('vraag 4'),
479
+ // type changed from date to text -> should throw
480
+ type: RecordType.Text,
481
+ });
482
+
483
+ const newRecord5 = RecordSettings.create({
484
+ id: record5.id,
485
+ name: TranslatedString.create('vraag 5'),
486
+ type: RecordType.MultipleChoice,
487
+ choices: [
488
+ RecordChoice.create({ name: TranslatedString.create('keuze 1') }),
489
+ RecordChoice.create({ name: TranslatedString.create('keuze 2') }),
490
+ ],
491
+ });
492
+
493
+ const newRecord6 = RecordSettings.create({
494
+ id: record6.id,
495
+ name: TranslatedString.create('vraag 6'),
496
+ type: RecordType.Email,
497
+ });
498
+
499
+ const newRecord7 = RecordSettings.create({
500
+ id: record7.id,
501
+ name: TranslatedString.create('vraag 7'),
502
+ type: RecordType.Price,
503
+ });
504
+
505
+ const newRecord8 = RecordSettings.create({
506
+ id: record8.id,
507
+ name: TranslatedString.create('vraag 8'),
508
+ type: RecordType.File,
509
+ fileType: FileType.PDF,
510
+ });
511
+
512
+ const newChildCategory1 = RecordCategory.create({
513
+ id: childCategory1.id,
514
+ name: TranslatedString.create('subcategorie 1'),
515
+ records: [newRecord3, newRecord4],
516
+ });
517
+
518
+ const newChildCategory2 = RecordCategory.create({
519
+ id: childCategory2.id,
520
+ name: TranslatedString.create('subcategorie 2'),
521
+ records: [newRecord5],
522
+ });
523
+
524
+ const newRecordCategory1 = RecordCategory.create({
525
+ id: recordCategory1.id,
526
+ name: TranslatedString.create('categorie 1'),
527
+ records: [newRecord1, newRecord2],
528
+ childCategories: [newChildCategory1, newChildCategory2],
529
+ });
530
+
531
+ const newRecordCategory2 = RecordCategory.create({
532
+ id: recordCategory2.id,
533
+ name: TranslatedString.create('categorie 2'),
534
+ records: [newRecord6, newRecord7, newRecord8],
535
+ });
536
+
537
+ const newRecordCategories = [newRecordCategory1, newRecordCategory2];
538
+
539
+ // should throw
540
+ expect(() => RecordAnswerHelper.throwIfPatchOrPutIsInvalid(originalRecordCategories, newRecordCategories)).toThrow('Cannot change record type from Date to Text');
541
+ });
542
+ });
543
+
544
+ test('combination of patch and put - happy path should not throw', () => {
545
+ const patches = new PatchableArray<string, RecordCategory, AutoEncoderPatchType<RecordCategory>>();
546
+ const recordPatches1 = new PatchableArray<string, RecordSettings, AutoEncoderPatchType<RecordSettings>>();
547
+
548
+ const recordPatch1 = RecordSettings.patch({
549
+ id: record1.id,
550
+ name: TranslatedString.create('vraag 1 - updated'),
551
+ type: RecordType.Textarea,
552
+ });
553
+
554
+ const recordPatch2 = RecordSettings.patch({
555
+ id: record2.id,
556
+ name: TranslatedString.create('vraag 2 - updated'),
557
+ type: RecordType.Integer,
558
+ });
559
+
560
+ recordPatches1.addPatch(recordPatch1);
561
+ recordPatches1.addPatch(recordPatch2);
562
+
563
+ const recordPatches2 = new PatchableArray<string, RecordSettings, AutoEncoderPatchType<RecordSettings>>();
564
+
565
+ const recordPatch3 = RecordSettings.patch({
566
+ id: record3.id,
567
+ name: TranslatedString.create('vraag 3 - updated'),
568
+ type: RecordType.Email,
569
+ });
570
+
571
+ const recordPatch4 = RecordSettings.patch({
572
+ id: record4.id,
573
+ name: TranslatedString.create('vraag 4 - updated'),
574
+ });
575
+
576
+ recordPatches2.addPatch(recordPatch3);
577
+ recordPatches2.addPatch(recordPatch4);
578
+
579
+ const recordPatches3 = new PatchableArray<string, RecordSettings, AutoEncoderPatchType<RecordSettings>>();
580
+
581
+ const recordPatch5 = RecordSettings.patch({
582
+ id: record5.id,
583
+ name: TranslatedString.create('vraag 5 - updated'),
584
+ });
585
+
586
+ recordPatches3.addPatch(recordPatch5);
587
+
588
+ const recordPatches4 = new PatchableArray<string, RecordSettings, AutoEncoderPatchType<RecordSettings>>();
589
+
590
+ const recordPatch7 = RecordSettings.patch({
591
+ id: record7.id,
592
+ name: TranslatedString.create('vraag 7 - updated'),
593
+ });
594
+
595
+ recordPatches4.addPatch(recordPatch7);
596
+
597
+ const childCategoriesPatch1 = new PatchableArray<string, RecordCategory, AutoEncoderPatchType<RecordCategory>>();
598
+
599
+ const newRecord3 = RecordSettings.create({
600
+ id: record3.id,
601
+ name: TranslatedString.create('vraag 3'),
602
+ type: RecordType.Text,
603
+ });
604
+
605
+ const newRecord4 = RecordSettings.create({
606
+ id: record4.id,
607
+ name: TranslatedString.create('vraag 4'),
608
+ type: RecordType.Date,
609
+ });
610
+
611
+ const newChildCategory1 = RecordCategory.create({
612
+ id: childCategory1.id,
613
+ name: TranslatedString.create('subcategorie 1'),
614
+ records: [newRecord3, newRecord4],
615
+ });
616
+
617
+ childCategoriesPatch1.addPut(newChildCategory1);
618
+
619
+ childCategoriesPatch1.addPatch(RecordCategory.patch({
620
+ id: childCategory2.id,
621
+ records: recordPatches3,
622
+ }));
623
+
624
+ const patch1 = RecordCategory.patch({
625
+ id: recordCategory1.id,
626
+ records: recordPatches1,
627
+ childCategories: childCategoriesPatch1,
628
+ });
629
+
630
+ const patch2 = RecordCategory.patch({
631
+ id: recordCategory2.id,
632
+ records: recordPatches4,
633
+ });
634
+
635
+ patches.addPatch(patch1);
636
+ patches.addPatch(patch2);
637
+
638
+ // should not throw
639
+ expect(() => RecordAnswerHelper.throwIfPatchOrPutIsInvalid(originalRecordCategories, patches)).not.toThrow();
640
+ });
641
+
642
+ test('combination of patch and put - should throw if type changes', () => {
643
+ const patches = new PatchableArray<string, RecordCategory, AutoEncoderPatchType<RecordCategory>>();
644
+ const recordPatches1 = new PatchableArray<string, RecordSettings, AutoEncoderPatchType<RecordSettings>>();
645
+
646
+ const recordPatch1 = RecordSettings.patch({
647
+ id: record1.id,
648
+ name: TranslatedString.create('vraag 1 - updated'),
649
+ type: RecordType.Textarea,
650
+ });
651
+
652
+ const recordPatch2 = RecordSettings.patch({
653
+ id: record2.id,
654
+ name: TranslatedString.create('vraag 2 - updated'),
655
+ type: RecordType.Integer,
656
+ });
657
+
658
+ recordPatches1.addPatch(recordPatch1);
659
+ recordPatches1.addPatch(recordPatch2);
660
+
661
+ const recordPatches2 = new PatchableArray<string, RecordSettings, AutoEncoderPatchType<RecordSettings>>();
662
+
663
+ const recordPatch3 = RecordSettings.patch({
664
+ id: record3.id,
665
+ name: TranslatedString.create('vraag 3 - updated'),
666
+ type: RecordType.Email,
667
+ });
668
+
669
+ const recordPatch4 = RecordSettings.patch({
670
+ id: record4.id,
671
+ name: TranslatedString.create('vraag 4 - updated'),
672
+ });
673
+
674
+ recordPatches2.addPatch(recordPatch3);
675
+ recordPatches2.addPatch(recordPatch4);
676
+
677
+ const recordPatches3 = new PatchableArray<string, RecordSettings, AutoEncoderPatchType<RecordSettings>>();
678
+
679
+ const recordPatch5 = RecordSettings.patch({
680
+ id: record5.id,
681
+ name: TranslatedString.create('vraag 5 - updated'),
682
+ });
683
+
684
+ recordPatches3.addPatch(recordPatch5);
685
+
686
+ const recordPatches4 = new PatchableArray<string, RecordSettings, AutoEncoderPatchType<RecordSettings>>();
687
+
688
+ const recordPatch7 = RecordSettings.patch({
689
+ id: record7.id,
690
+ name: TranslatedString.create('vraag 7 - updated'),
691
+ });
692
+
693
+ recordPatches4.addPatch(recordPatch7);
694
+
695
+ const childCategoriesPatch1 = new PatchableArray<string, RecordCategory, AutoEncoderPatchType<RecordCategory>>();
696
+
697
+ const newRecord3 = RecordSettings.create({
698
+ id: record3.id,
699
+ name: TranslatedString.create('vraag 3'),
700
+ type: RecordType.Text,
701
+ });
702
+
703
+ const newRecord4 = RecordSettings.create({
704
+ id: record4.id,
705
+ name: TranslatedString.create('vraag 4'),
706
+ // type changes from date to text -> should throw
707
+ type: RecordType.Text,
708
+ });
709
+
710
+ const newChildCategory1 = RecordCategory.create({
711
+ id: childCategory1.id,
712
+ name: TranslatedString.create('subcategorie 1'),
713
+ records: [newRecord3, newRecord4],
714
+ });
715
+
716
+ childCategoriesPatch1.addPut(newChildCategory1);
717
+
718
+ childCategoriesPatch1.addPatch(RecordCategory.patch({
719
+ id: childCategory2.id,
720
+ records: recordPatches3,
721
+ }));
722
+
723
+ const patch1 = RecordCategory.patch({
724
+ id: recordCategory1.id,
725
+ records: recordPatches1,
726
+ childCategories: childCategoriesPatch1,
727
+ });
728
+
729
+ const patch2 = RecordCategory.patch({
730
+ id: recordCategory2.id,
731
+ records: recordPatches4,
732
+ });
733
+
734
+ patches.addPatch(patch1);
735
+ patches.addPatch(patch2);
736
+
737
+ // should not throw
738
+ expect(() => RecordAnswerHelper.throwIfPatchOrPutIsInvalid(originalRecordCategories, patches)).toThrow('Cannot change record type from Date to Text');
739
+ });
740
+ });
741
+ });