@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.
- package/output-2.txt +1 -0
- package/output.txt +1 -0
- package/package.json +70 -53
- package/src/audit-logs/EventNotificationLogger.ts +40 -0
- package/src/audit-logs/ModelLogger.ts +19 -15
- package/src/audit-logs/OrganizationLogger.ts +1 -1
- package/src/audit-logs/RegistrationInvitationLogger.ts +46 -0
- package/src/audit-logs/init.ts +9 -1
- package/src/boot.ts +19 -18
- package/src/crons/amazon-ses.ts +13 -26
- package/src/crons/balance-emails.ts +3 -5
- package/src/crons/clearExcelCache.test.ts +1 -1
- package/src/crons/clearExcelCache.ts +1 -2
- package/src/crons/drip-emails.ts +42 -0
- package/src/crons/endFunctionsOfUsersWithoutRegistration.ts +4 -0
- package/src/crons/helpers/isOutside.ts +11 -0
- package/src/crons/helpers/useSavedIterator.ts +32 -0
- package/src/crons/index.ts +7 -0
- package/src/crons/invoices.ts +160 -0
- package/src/crons/members-fees.ts +50 -0
- package/src/crons/mollie-chargebacks.ts +86 -0
- package/src/crons/service-fees.ts +152 -0
- package/src/crons/stripe-invoices.ts +48 -0
- package/src/crons/transfer-fees.ts +176 -0
- package/src/crons/update-cached-balances.ts +4 -4
- package/src/crons.ts +54 -74
- package/src/debug.ts +4 -2
- package/src/email-recipient-loaders/documents.ts +1 -1
- package/src/email-recipient-loaders/members.ts +1 -1
- package/src/email-recipient-loaders/payments.ts +87 -46
- package/src/email-recipient-loaders/registrations.ts +1 -1
- package/src/email-replacements/getEmailReplacementsForPayment.ts +5 -9
- package/src/endpoints/admin/members/ChargeMembersEndpoint.ts +1 -1
- package/src/endpoints/admin/memberships/ChargeMembershipsEndpoint.ts +1 -1
- package/src/endpoints/admin/memberships/GetChargeMembershipsSummaryEndpoint.ts +3 -5
- package/src/endpoints/admin/organizations/ChargeOrganizationsEndpoint.ts +1 -1
- package/src/endpoints/admin/organizations/GetOrganizationsCountEndpoint.ts +1 -1
- package/src/endpoints/admin/organizations/GetOrganizationsEndpoint.ts +13 -7
- package/src/endpoints/admin/organizations/PatchOrganizationsEndpoint.ts +4 -6
- package/src/endpoints/admin/organizations/PatchPackagesEndpoint.test.ts +10 -6
- package/src/endpoints/admin/organizations/PatchPackagesEndpoint.ts +39 -21
- package/src/endpoints/admin/registrations/ChargeRegistrationsEndpoint.ts +1 -1
- package/src/endpoints/auth/CreateAdminEndpoint.ts +23 -5
- package/src/endpoints/auth/CreateTokenEndpoint.ts +2 -2
- package/src/endpoints/auth/DeleteTokenEndpoint.ts +1 -1
- package/src/endpoints/auth/DeleteUserEndpoint.ts +3 -3
- package/src/endpoints/auth/ForgotPasswordEndpoint.ts +1 -1
- package/src/endpoints/auth/GetOtherUserEndpoint.ts +1 -1
- package/src/endpoints/auth/GetUserEndpoint.ts +1 -1
- package/src/endpoints/auth/OpenIDConnectAuthTokenEndpoint.ts +1 -1
- package/src/endpoints/auth/OpenIDConnectStartEndpoint.ts +1 -1
- package/src/endpoints/auth/PatchUserEndpoint.ts +5 -8
- package/src/endpoints/auth/PollEmailVerificationEndpoint.ts +1 -1
- package/src/endpoints/auth/RetryEmailVerificationEndpoint.ts +1 -1
- package/src/endpoints/auth/SignupEndpoint.ts +2 -3
- package/src/endpoints/auth/VerifyEmailEndpoint.ts +20 -3
- package/src/endpoints/frontend/FrontendEnvironmentEndpoint.ts +2 -1
- package/src/endpoints/global/addresses/SearchRegionsEndpoint.ts +2 -4
- package/src/endpoints/global/addresses/ValidateAddressEndpoint.ts +1 -1
- package/src/endpoints/global/audit-logs/GetAuditLogsEndpoint.ts +5 -7
- package/src/endpoints/global/caddy/CheckDomainCertEndpoint.ts +2 -2
- package/src/endpoints/global/email/CreateEmailEndpoint.ts +3 -4
- package/src/endpoints/global/email/GetAdminEmailsEndpoint.test.ts +1 -1
- package/src/endpoints/global/email/GetAdminEmailsEndpoint.ts +1 -2
- package/src/endpoints/global/email/GetEmailAddressEndpoint.ts +4 -6
- package/src/endpoints/global/email/GetEmailEndpoint.ts +1 -1
- package/src/endpoints/global/email/GetUserEmailsEndpoint.test.ts +1 -1
- package/src/endpoints/global/email/GetUserEmailsEndpoint.ts +1 -1
- package/src/endpoints/global/email/ManageEmailAddressEndpoint.ts +6 -10
- package/src/endpoints/global/email/PatchEmailEndpoint.test.ts +4 -7
- package/src/endpoints/global/email/PatchEmailEndpoint.ts +6 -9
- package/src/endpoints/global/email-recipients/GetEmailRecipientsCountEndpoint.ts +1 -1
- package/src/endpoints/global/email-recipients/GetEmailRecipientsEndpoint.test.ts +1 -1
- package/src/endpoints/global/email-recipients/GetEmailRecipientsEndpoint.ts +1 -1
- package/src/endpoints/global/email-recipients/RetryEmailRecipientEndpoint.ts +2 -2
- package/src/endpoints/global/events/GetEventNotificationsCountEndpoint.ts +1 -1
- package/src/endpoints/global/events/GetEventNotificationsEndpoint.ts +3 -3
- package/src/endpoints/global/events/GetEventsEndpoint.ts +3 -3
- package/src/endpoints/global/events/PatchEventNotificationsEndpoint.test.ts +49 -4
- package/src/endpoints/global/events/PatchEventNotificationsEndpoint.ts +5 -8
- package/src/endpoints/global/events/PatchEventsEndpoint.test.ts +12 -44
- package/src/endpoints/global/events/PatchEventsEndpoint.ts +128 -127
- package/src/endpoints/global/files/ExportToExcelEndpoint.ts +9 -9
- package/src/endpoints/global/files/GetFileCache.ts +3 -4
- package/src/endpoints/global/files/UploadFile.ts +3 -4
- package/src/endpoints/global/files/UploadImage.ts +3 -4
- package/src/endpoints/global/groups/GetGroupsCountEndpoint.ts +51 -0
- package/src/endpoints/global/groups/GetGroupsEndpoint.test.ts +1 -1
- package/src/endpoints/global/groups/GetGroupsEndpoint.ts +4 -2
- package/src/endpoints/global/members/GetMemberFamilyEndpoint.ts +2 -3
- package/src/endpoints/global/members/GetMembersCountEndpoint.ts +1 -1
- package/src/endpoints/global/members/GetMembersEndpoint.test.ts +2 -2
- package/src/endpoints/global/members/GetMembersEndpoint.ts +10 -12
- package/src/endpoints/global/members/PatchOrganizationMembersEndpoint.test.ts +195 -12
- package/src/endpoints/global/members/PatchOrganizationMembersEndpoint.ts +16 -22
- package/src/endpoints/global/members/helpers/validateGroupFilter.ts +6 -30
- package/src/endpoints/global/members/shouldCheckIfMemberIsDuplicate.ts +1 -1
- package/src/endpoints/global/organizations/CheckRegisterCodeEndpoint.ts +1 -1
- package/src/endpoints/global/organizations/CreateOrganizationEndpoint.ts +40 -8
- package/src/endpoints/global/organizations/GetOrganizationFromDomainEndpoint.ts +2 -2
- package/src/endpoints/global/organizations/GetOrganizationFromUriEndpoint.ts +2 -2
- package/src/endpoints/global/organizations/SearchOrganizationEndpoint.test.ts +4 -1
- package/src/endpoints/global/organizations/SearchOrganizationEndpoint.ts +4 -5
- package/src/endpoints/global/payments/StripeWebhookEndpoint.ts +9 -16
- package/src/endpoints/global/platform/GetPlatformAdminsEndpoint.ts +1 -1
- package/src/endpoints/global/platform/GetPlatformEndpoint.ts +1 -1
- package/src/endpoints/global/platform/PatchPlatformEnpoint.test.ts +1 -1
- package/src/endpoints/global/platform/PatchPlatformEnpoint.ts +32 -13
- package/src/endpoints/global/platform-memberships/GetPlatformMembershipsCountEndpoint.ts +31 -31
- package/src/endpoints/global/platform-memberships/GetPlatformMembershipsEndpoint.ts +18 -20
- package/src/endpoints/global/registration/GetRegistrationsCountEndpoint.ts +1 -1
- package/src/endpoints/global/registration/GetRegistrationsEndpoint.test.ts +1 -1
- package/src/endpoints/global/registration/GetRegistrationsEndpoint.ts +6 -10
- package/src/endpoints/global/registration/GetUserDetailedPayableBalanceEndpoint.ts +35 -6
- package/src/endpoints/global/registration/GetUserDocumentsEndpoint.ts +2 -2
- package/src/endpoints/global/registration/GetUserMembersEndpoint.ts +1 -1
- package/src/endpoints/global/registration/GetUserPayableBalanceEndpoint.ts +1 -1
- package/src/endpoints/global/registration/PatchUserMembersEndpoint.test.ts +2 -2
- package/src/endpoints/global/registration/PatchUserMembersEndpoint.ts +3 -3
- package/src/endpoints/global/registration/RegisterMembersEndpoint.test.ts +90 -6
- package/src/endpoints/global/registration/RegisterMembersEndpoint.ts +38 -33
- package/src/endpoints/global/registration-invitations/GetRegistrationInvitationsCountEndpoint.ts +45 -0
- package/src/endpoints/global/registration-invitations/GetRegistrationInvitationsEndpoint.test.ts +494 -0
- package/src/endpoints/global/registration-invitations/GetRegistrationInvitationsEndpoint.ts +213 -0
- package/src/endpoints/global/registration-invitations/PatchRegistrationInvitationsEndpoint.test.ts +404 -0
- package/src/endpoints/global/registration-invitations/PatchRegistrationInvitationsEndpoint.ts +167 -0
- package/src/endpoints/global/registration-periods/GetRegistrationPeriodsCountEndpoint.ts +43 -0
- package/src/endpoints/global/registration-periods/GetRegistrationPeriodsEndpoint.ts +1 -1
- package/src/endpoints/global/registration-periods/PatchRegistrationPeriodsEndpoint.ts +13 -5
- package/src/endpoints/global/sso/GetSSOEndpoint.ts +2 -3
- package/src/endpoints/global/sso/SetSSOEndpoint.ts +1 -1
- package/src/endpoints/global/webshops/GetWebshopFromDomainEndpoint.ts +2 -2
- package/src/endpoints/global/webshops/GetWebshopsEndpoint.test.ts +1 -2
- package/src/endpoints/global/webshops/GetWebshopsEndpoint.ts +2 -4
- package/src/endpoints/organization/dashboard/balance-items/GetBalanceItemEndpoint.ts +2 -2
- package/src/endpoints/organization/dashboard/balance-items/GetBalanceItemsCountEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/balance-items/GetBalanceItemsEndpoint.ts +3 -4
- package/src/endpoints/organization/dashboard/balance-items/PatchBalanceItemsEndpoint.ts +19 -6
- package/src/endpoints/organization/dashboard/billing/ApplyRegisterCodeEndpoint.test.ts +73 -0
- package/src/endpoints/organization/dashboard/billing/ApplyRegisterCodeEndpoint.ts +89 -0
- package/src/endpoints/{global → organization/dashboard}/billing/DeactivatePackageEndpoint.ts +4 -9
- package/src/endpoints/organization/dashboard/billing/DeleteOrganizationMandateEndpoint.ts +62 -0
- package/src/endpoints/organization/dashboard/billing/GetOrganizationDetailedPayableBalanceCollectionEndpoint.ts +56 -0
- package/src/endpoints/organization/dashboard/billing/GetOrganizationDetailedPayableBalanceEndpoint.ts +41 -18
- package/src/endpoints/organization/dashboard/billing/GetOrganizationMandatesEndpoint.ts +64 -0
- package/src/endpoints/organization/dashboard/billing/GetOrganizationPayableBalanceEndpoint.ts +2 -2
- package/src/endpoints/organization/dashboard/billing/GetOrganizationPayableInvoicesEndpoint.ts +68 -0
- package/src/endpoints/organization/dashboard/billing/GetPackagesEndpoint.ts +12 -4
- package/src/endpoints/organization/dashboard/billing/GetRegisterCodeEndpoint.ts +66 -0
- package/src/endpoints/organization/dashboard/billing/OrganizationCheckoutEndpoint.test.ts +949 -0
- package/src/endpoints/organization/dashboard/billing/OrganizationCheckoutEndpoint.ts +311 -0
- package/src/endpoints/organization/dashboard/billing/PatchOrganizationMandatesEndpoint.ts +94 -0
- package/src/endpoints/organization/dashboard/documents/GetDocumentTemplateXML.ts +1 -1
- package/src/endpoints/organization/dashboard/documents/GetDocumentTemplatesCountEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/documents/GetDocumentTemplatesEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/documents/GetDocumentsCountEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/documents/GetDocumentsEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/documents/PatchDocumentEndpoint.ts +10 -2
- package/src/endpoints/organization/dashboard/documents/PatchDocumentTemplatesEndpoint.test.ts +2 -2
- package/src/endpoints/organization/dashboard/documents/PatchDocumentTemplatesEndpoint.ts +2 -2
- package/src/endpoints/organization/dashboard/email/CheckEmailBouncesEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/email-templates/GetEmailTemplatesEndpoint.test.ts +1 -1
- package/src/endpoints/organization/dashboard/email-templates/GetEmailTemplatesEndpoint.ts +10 -8
- package/src/endpoints/organization/dashboard/email-templates/PatchEmailTemplatesEndpoint.test.ts +1 -1
- package/src/endpoints/organization/dashboard/email-templates/PatchEmailTemplatesEndpoint.ts +5 -6
- package/src/endpoints/organization/dashboard/invoices/GetInvoicesCountEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/invoices/GetInvoicesEndpoint.ts +15 -4
- package/src/endpoints/organization/dashboard/invoices/PatchInvoicesEndpoint.ts +11 -2
- package/src/endpoints/organization/dashboard/mollie/CheckMollieEndpoint.ts +8 -8
- package/src/endpoints/organization/dashboard/mollie/ConnectMollieEndpoint.ts +10 -5
- package/src/endpoints/organization/dashboard/mollie/DisconnectMollieEndpoint.ts +2 -2
- package/src/endpoints/organization/dashboard/mollie/GetMollieDashboardEndpoint.ts +7 -7
- package/src/endpoints/organization/dashboard/nolt/CreateNoltTokenEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/organization/GetOrganizationArchivedGroups.ts +2 -2
- package/src/endpoints/organization/dashboard/organization/GetOrganizationDeletedGroups.ts +1 -1
- package/src/endpoints/organization/dashboard/organization/GetUitpasClientIdEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/organization/PatchOrganizationEndpoint.test.ts +2 -2
- package/src/endpoints/organization/dashboard/organization/PatchOrganizationEndpoint.ts +67 -20
- package/src/endpoints/organization/dashboard/organization/SearchUitpasOrganizersEndpoint.ts +2 -2
- package/src/endpoints/organization/dashboard/organization/SetOrganizationDomainEndpoint.ts +5 -10
- package/src/endpoints/organization/dashboard/organization/SetUitpasClientCredentialsEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/payments/GetPaymentsCountEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/payments/GetPaymentsEndpoint.ts +3 -4
- package/src/endpoints/organization/dashboard/payments/PatchPaymentsEndpoint.ts +24 -17
- package/src/endpoints/organization/dashboard/receivable-balances/ChargeReceivableBalancesEndpoint.ts +134 -0
- package/src/endpoints/organization/dashboard/receivable-balances/GetReceivableBalanceEndpoint.ts +2 -3
- package/src/endpoints/organization/dashboard/receivable-balances/GetReceivableBalancesCountEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/receivable-balances/GetReceivableBalancesEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/registration-periods/GetOrganizationRegistrationPeriodsEndpoint.test.ts +1 -1
- package/src/endpoints/organization/dashboard/registration-periods/GetOrganizationRegistrationPeriodsEndpoint.ts +2 -3
- package/src/endpoints/organization/dashboard/registration-periods/MoveRegistrationPeriods.test.ts +1 -1
- package/src/endpoints/organization/dashboard/registration-periods/PatchOrganizationRegistrationPeriodsEndpoint.test.ts +1 -1
- package/src/endpoints/organization/dashboard/registration-periods/PatchOrganizationRegistrationPeriodsEndpoint.ts +32 -22
- package/src/endpoints/organization/dashboard/registration-periods/SetupStepReviewEndpoint.ts +4 -5
- package/src/endpoints/organization/dashboard/stripe/ConnectStripeEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/stripe/DeleteStripeAccountEndpoint.ts +2 -3
- package/src/endpoints/organization/dashboard/stripe/GetStripeAccountLinkEndpoint.ts +2 -2
- package/src/endpoints/organization/dashboard/stripe/GetStripeAccountsEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/stripe/GetStripeLoginLinkEndpoint.ts +2 -2
- package/src/endpoints/organization/dashboard/stripe/UpdateStripeAccountEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/users/CreateApiUserEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/users/DeleteUserEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/users/GetApiUsersEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/users/GetOrganizationAdminsEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/users/PatchApiUserEndpoint.ts +4 -6
- package/src/endpoints/organization/dashboard/webshops/CreateWebshopEndpoint.ts +10 -15
- package/src/endpoints/organization/dashboard/webshops/DeleteWebshopEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/webshops/GetDiscountCodesEndpoint.ts +2 -2
- package/src/endpoints/organization/dashboard/webshops/GetWebshopOrdersCountEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/webshops/GetWebshopOrdersEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/webshops/GetWebshopTicketsEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/webshops/GetWebshopUriAvailabilityEndpoint.ts +11 -2
- package/src/endpoints/organization/dashboard/webshops/PatchDiscountCodesEndpoint.ts +4 -6
- package/src/endpoints/organization/dashboard/webshops/PatchWebshopEndpoint.ts +29 -8
- package/src/endpoints/organization/dashboard/webshops/PatchWebshopOrdersEndpoint.ts +21 -28
- package/src/endpoints/organization/dashboard/webshops/PatchWebshopTicketsEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/webshops/SearchUitpasEventsEndpoint.ts +2 -2
- package/src/endpoints/organization/dashboard/webshops/VerifyWebshopDomainEndpoint.ts +2 -3
- package/src/endpoints/organization/dashboard/webshops/WebshopReservedPathSegments.test.ts +95 -0
- package/src/endpoints/organization/shared/ExchangePaymentEndpoint.ts +15 -13
- package/src/endpoints/organization/shared/GetDocumentHtml.ts +1 -1
- package/src/endpoints/organization/shared/GetPaymentEndpoint.ts +1 -1
- package/src/endpoints/organization/shared/GetUitpasNumberDetailsEndpoint.ts +3 -5
- package/src/endpoints/organization/shared/auth/GetOrganizationEndpoint.ts +1 -1
- package/src/endpoints/organization/webshops/CheckWebshopDiscountCodesEndpoint.ts +4 -1
- package/src/endpoints/organization/webshops/GetOrderByPaymentEndpoint.ts +14 -3
- package/src/endpoints/organization/webshops/GetOrderEndpoint.ts +14 -2
- package/src/endpoints/organization/webshops/GetTicketsEndpoint.ts +37 -16
- package/src/endpoints/organization/webshops/GetWebshopEndpoint.test.ts +34 -2
- package/src/endpoints/organization/webshops/GetWebshopEndpoint.ts +4 -2
- package/src/endpoints/organization/webshops/PlaceOrderEndpoint.test.ts +74 -3
- package/src/endpoints/organization/webshops/PlaceOrderEndpoint.ts +28 -50
- package/src/endpoints/organization/webshops/RetrieveUitpasSocialTariffPriceEndpoint.ts +3 -5
- package/src/endpoints/organization/webshops/WebshopAuthHelper.ts +36 -0
- package/src/endpoints/system/HealthEndpoint.ts +1 -1
- package/src/excel-loaders/balance-items.ts +1 -1
- package/src/excel-loaders/event-notifications.ts +1 -1
- package/src/excel-loaders/members.ts +1 -1
- package/src/excel-loaders/organizations.ts +3 -3
- package/src/excel-loaders/payments.ts +31 -1
- package/src/excel-loaders/platform-memberships.ts +13 -14
- package/src/excel-loaders/receivable-balances.ts +2 -2
- package/src/excel-loaders/registrations.ts +2 -3
- package/src/helpers/AddressValidator.ts +7 -14
- package/src/helpers/AdminPermissionChecker.ts +60 -65
- package/src/helpers/AuthenticatedStructures.ts +153 -51
- package/src/helpers/BalanceItemRelationsBackfiller.test.ts +174 -0
- package/src/helpers/BalanceItemRelationsBackfiller.ts +163 -0
- package/src/helpers/BuckarooHelper.ts +2 -4
- package/src/helpers/CheckSettlements.ts +12 -24
- package/src/helpers/Context.ts +15 -10
- package/src/helpers/CookieHelper.ts +1 -2
- package/src/helpers/EmailResumer.ts +1 -2
- package/src/helpers/FileCache.ts +2 -3
- package/src/helpers/FinancialSupportHelper.ts +21 -0
- package/src/helpers/FlagMomentCleanup.ts +1 -2
- package/src/helpers/ForwardHandler.ts +5 -10
- package/src/helpers/GlobalHelper.ts +3 -3
- package/src/helpers/LegacyBillingConverter.ts +787 -0
- package/src/helpers/MemberMerger.test.ts +782 -0
- package/src/helpers/MemberMerger.ts +600 -0
- package/src/helpers/MemberUserSyncer.ts +6 -12
- package/src/helpers/MembershipCharger.ts +2 -4
- package/src/helpers/PaymentCustomerResolver.test.ts +203 -0
- package/src/helpers/PaymentCustomerResolver.ts +144 -0
- package/src/helpers/PeriodHelper.ts +2 -3
- package/src/helpers/RecordAnswerHelper.test.ts +741 -0
- package/src/helpers/RecordAnswerHelper.ts +116 -0
- package/src/helpers/SeedTools.ts +106 -0
- package/src/helpers/ServiceFeeHelper.ts +125 -15
- package/src/helpers/SetupStepUpdater.ts +38 -32
- package/src/helpers/StamhoofdFilterAccessHelper.ts +52 -0
- package/src/helpers/StripeHelper.ts +15 -38
- package/src/helpers/StripeInvoicer.ts +419 -0
- package/src/helpers/StripePayoutChecker.ts +5 -10
- package/src/helpers/TagHelper.ts +7 -8
- package/src/helpers/TemporaryMemberAccess.ts +1 -2
- package/src/helpers/ThrottledQueue.ts +1 -2
- package/src/helpers/UitpasTokenRepository.ts +1 -2
- package/src/helpers/ViesHelper.ts +11 -11
- package/src/helpers/XlsxTransformerColumnHelper.ts +1 -1
- package/src/helpers/outstandingBalanceJoin.ts +2 -2
- package/src/helpers/updateMemberDetailsUitpasNumber.ts +3 -5
- package/src/migrate.ts +12 -5
- package/src/{seeds → migrations}/0000000004-single-organization.ts +10 -1
- package/src/migrations/0000000006-default-organization.ts +139 -0
- package/src/{seeds → migrations}/1715028563-user-permissions.ts +17 -27
- package/src/{seeds/1765896674-document-update-year.test.ts → migrations/1750090029-document-update-year.test.ts} +27 -26
- package/src/migrations/1750090029-document-update-year.ts +103 -0
- package/src/migrations/1750090030-records-configuration.ts +92 -0
- package/src/migrations/1750090031-records-configuration-webshops.ts +36 -0
- package/src/migrations/1752848540-national-numbers.ts +585 -0
- package/src/migrations/1752848550-records-configuration-group-filter.ts +1064 -0
- package/src/{seeds → migrations}/1752848561-groups-registration-periods.ts +95 -27
- package/src/{seeds → migrations}/1754560914-groups-prices.test.ts +1 -1
- package/src/{seeds → migrations}/1754560914-groups-prices.ts +9 -15
- package/src/{seeds → migrations}/1756293699-fill-previous-next-period-id.ts +1 -2
- package/src/migrations/1761665607-sync-member-users.ts +40 -0
- package/src/migrations/1779121239-default-invoice-email-template.sql +3 -0
- package/src/migrations/1779121240-invoice-email-template.sql +6 -0
- package/src/migrations/1779986893-default-payment-failed-email-templates.sql +4 -0
- package/src/migrations/1780578166-convert-legacy-billing.ts +13 -0
- package/src/{seeds/1755876819-remove-duplicate-members.ts → migrations/1780665426-remove-duplicate-members.ts} +23 -4
- package/src/migrations/1780933598-document-groups.ts +88 -0
- package/src/migrations/1781692342-balance-item-relations.ts +13 -0
- package/src/migrations/1781857866-platform-admins.ts +103 -0
- package/src/migrations/1781857867-rm-old-platform-admins.ts +25 -0
- package/src/seeds/0000000001-throw.ts +5 -0
- package/src/seeds/1760702452-update-balance-price-paid.ts +19 -0
- package/src/seeds/1760702453-update-balance-invoiced.ts +19 -0
- package/src/seeds/1760702454-update-cached-outstanding-balance-from-items.ts +51 -14
- package/src/seeds/1773754928-force-save-members.ts +41 -8
- package/src/seeds/1780665427-schedule-stock-updates.ts +45 -0
- package/src/seeds/1780665428-group-update-occupancy.ts +31 -0
- package/src/seeds/1780915001-fill-payment-customer.ts +70 -0
- package/src/seeds/1780915002-update-orders.ts +39 -0
- package/src/seeds/1782047708-organization-company-address.ts +44 -0
- package/src/seeds-temporary/1769088653-uitpas-status.ts +1 -2
- package/src/seeds-temporary/1780416000-migrate-audit-log-legacy-enums.test.ts +69 -0
- package/src/seeds-temporary/1780416000-migrate-audit-log-legacy-enums.ts +85 -0
- package/src/services/AuditLogService.test.ts +51 -0
- package/src/services/AuditLogService.ts +45 -0
- package/src/services/BalanceItemService.ts +148 -55
- package/src/services/CpuService.ts +3 -6
- package/src/services/DatabaseCollationService.test.ts +1 -2
- package/src/services/DocumentService.ts +1 -2
- package/src/services/EventNotificationService.ts +1 -1
- package/src/services/FileSignService.ts +2 -4
- package/src/services/InvoicePdfService.ts +286 -0
- package/src/services/InvoiceService.ts +330 -77
- package/src/services/InvoiceXMLService.ts +424 -0
- package/src/services/MemberNumberService.ts +6 -11
- package/src/services/MemberRecordStore.ts +8 -10
- package/src/services/MollieService.ts +530 -0
- package/src/services/PaymentMandateService.ts +214 -0
- package/src/services/PaymentReallocationService.test.ts +1 -1
- package/src/services/PaymentReallocationService.ts +7 -9
- package/src/services/PaymentService.ts +820 -328
- package/src/services/PlatformMembershipService.ts +5 -9
- package/src/services/ReferralService.ts +223 -0
- package/src/services/RegistrationService.ts +125 -54
- package/src/services/SSOService.test.ts +119 -0
- package/src/services/SSOService.ts +56 -49
- package/src/services/STPackageService.ts +97 -68
- package/src/services/UniqueMemberNumberService.ts +69 -0
- package/src/services/UniqueUserService.ts +3 -6
- package/src/services/VATService.ts +85 -0
- package/src/services/data/invoice.hbs.html +686 -0
- package/src/services/uitpas/PassholderEndpoints.ts +3 -6
- package/src/services/uitpas/UitpasService.ts +6 -10
- package/src/services/uitpas/checkUitpasNumbers.ts +2 -4
- package/src/services/uitpas/getSocialTariffForUitpasNumbers.ts +3 -6
- package/src/services/uitpas/searchUitpasEvents.ts +1 -2
- package/src/sql-filters/audit-logs.ts +1 -1
- package/src/sql-filters/balance-item-payments.ts +1 -1
- package/src/sql-filters/balance-items.ts +1 -1
- package/src/sql-filters/base-registration-filter-compilers.ts +5 -33
- package/src/sql-filters/document-templates.ts +1 -1
- package/src/sql-filters/documents.ts +1 -1
- package/src/sql-filters/email-recipients.ts +1 -1
- package/src/sql-filters/emails.ts +1 -1
- package/src/sql-filters/event-notifications.ts +1 -1
- package/src/sql-filters/events.ts +6 -1
- package/src/sql-filters/groups.ts +16 -1
- package/src/sql-filters/invoiced-balance-items.ts +1 -1
- package/src/sql-filters/invoices.ts +1 -1
- package/src/sql-filters/member-responsibility-records.ts +1 -1
- package/src/sql-filters/members.ts +1 -1
- package/src/sql-filters/orders.ts +4 -4
- package/src/sql-filters/organization-registration-periods.ts +1 -1
- package/src/sql-filters/organizations.ts +1 -1
- package/src/sql-filters/payments.ts +5 -0
- package/src/sql-filters/platform-memberships.ts +3 -3
- package/src/sql-filters/receivable-balances.ts +1 -1
- package/src/sql-filters/registration-invitations.ts +90 -0
- package/src/sql-filters/registration-periods.ts +1 -1
- package/src/sql-filters/registrations.ts +1 -1
- package/src/sql-filters/tickets.ts +1 -1
- package/src/sql-filters/users.ts +1 -1
- package/src/sql-sorters/groups.ts +23 -0
- package/src/sql-sorters/platform-memberships.ts +16 -16
- package/src/sql-sorters/registration-invitations.ts +36 -0
- package/tests/actions/patchOrganizationMember.ts +1 -1
- package/tests/actions/patchUserMember.ts +1 -1
- package/tests/assertions/assertBalances.ts +6 -12
- package/tests/e2e/api-rate-limits.test.ts +12 -24
- package/tests/e2e/bundle-discounts.test.ts +4 -1
- package/tests/e2e/charge-members.test.ts +13 -11
- package/tests/e2e/documents.test.ts +4 -1
- package/tests/e2e/register.test.ts +7 -9
- package/tests/e2e/stock.test.ts +4 -3
- package/tests/e2e/tickets.test.ts +1 -1
- package/tests/helpers/MollieMocker.ts +462 -0
- package/tests/helpers/PayconiqMocker.ts +138 -45
- package/tests/helpers/StripeMocker.ts +9 -6
- package/tests/helpers/index.ts +4 -0
- package/tests/init/initAdmin.ts +2 -2
- package/tests/init/initBundleDiscount.ts +1 -1
- package/tests/init/initMembershipOrganization.ts +13 -0
- package/tests/init/initPermissionRole.ts +3 -4
- package/tests/vitest.global.setup.ts +1 -1
- package/vitest.config.js +7 -0
- package/.nvmrc +0 -1
- package/src/endpoints/global/billing/ActivatePackagesEndpoint.ts +0 -216
- package/src/helpers/GroupBuilder.ts +0 -418
- package/src/seeds/0000000000-example.ts +0 -11
- package/src/seeds/1722256498-group-update-occupancy.ts +0 -52
- package/src/seeds/1726572303-schedule-stock-updates.ts +0 -52
- package/src/seeds/1726847064-setup-steps.ts +0 -16
- package/src/seeds/1728928974-update-cached-outstanding-balance-from-items.ts +0 -31
- package/src/seeds/1729253172-update-orders.ts +0 -21
- package/src/seeds/1733319079-fill-paying-organization-ids.ts +0 -68
- package/src/seeds/1733748412-update-deleted-order-numbers.ts +0 -109
- package/src/seeds/1733994455-balance-item-status-open.ts +0 -30
- package/src/seeds/1740046783-update-membership.ts +0 -17
- package/src/seeds/1741008870-fix-auditlog-description.ts +0 -50
- package/src/seeds/1741011468-fix-auditlog-description-uft16.ts +0 -88
- package/src/seeds/1741268179-fix-group-dates-of-events.ts +0 -32
- package/src/seeds/1750090030-records-configuration.ts +0 -26
- package/src/seeds/1751445358-upload-email-attachments.ts +0 -106
- package/src/seeds/1755532883-update-email-sender-ids.ts +0 -47
- package/src/seeds/1755790070-fill-email-recipient-errors.ts +0 -96
- package/src/seeds/1756115432-remove-old-drafts.ts +0 -16
- package/src/seeds/1756115433-fill-email-recipient-organization-id.ts +0 -30
- package/src/seeds/1756303697-update-email-counts.ts +0 -76
- package/src/seeds/1761665607-sync-member-users.ts +0 -59
- package/src/seeds/1765896674-document-update-year.ts +0 -66
- /package/src/{seeds → migrations}/0000000001-development-user.ts +0 -0
- /package/src/{seeds → migrations}/0000000002-clear-stamhoofd-email-templates.ts +0 -0
- /package/src/{seeds → migrations}/0000000003-default-email-templates.ts +0 -0
- /package/src/{seeds → migrations}/1752848561-groups-registration-periods.test.ts +0 -0
- /package/src/{seeds → migrations}/1766150402-document-published-at.test.ts +0 -0
- /package/src/{seeds → migrations}/1766150402-document-published-at.ts +0 -0
- /package/src/{seeds → migrations}/data/default-email-templates.sql +0 -0
|
@@ -2,7 +2,7 @@ import { field } from '@simonbackx/simple-encoding';
|
|
|
2
2
|
import type { XlsxTransformerColumn, XlsxTransformerConcreteColumn } from '@stamhoofd/excel-writer';
|
|
3
3
|
import { XlsxBuiltInNumberFormat } from '@stamhoofd/excel-writer';
|
|
4
4
|
import { StripeAccount } from '@stamhoofd/models';
|
|
5
|
-
import type { BalanceItemPaymentDetailed} from '@stamhoofd/structures';
|
|
5
|
+
import type { BalanceItemPaymentDetailed } from '@stamhoofd/structures';
|
|
6
6
|
import { BalanceItemRelationType, ExcelExportType, getBalanceItemRelationTypeName, getBalanceItemTypeName, PaginatedResponse, PaymentGeneral, PaymentMethodHelper, PaymentStatusHelper, StripeAccount as StripeAccountStruct } from '@stamhoofd/structures';
|
|
7
7
|
import { Formatter } from '@stamhoofd/utility';
|
|
8
8
|
import { ExportToExcelEndpoint } from '../endpoints/global/files/ExportToExcelEndpoint.js';
|
|
@@ -400,6 +400,36 @@ function getStripeColumns(): XlsxTransformerColumn<PaymentGeneral>[] {
|
|
|
400
400
|
};
|
|
401
401
|
},
|
|
402
402
|
},
|
|
403
|
+
{
|
|
404
|
+
id: 'serviceFeeManual',
|
|
405
|
+
name: $t(`%1dO`),
|
|
406
|
+
width: 42,
|
|
407
|
+
getValue: (object: PaymentGeneralWithStripeAccount) => {
|
|
408
|
+
return {
|
|
409
|
+
value: object.serviceFeeManual / 1_0000,
|
|
410
|
+
style: {
|
|
411
|
+
numberFormat: {
|
|
412
|
+
id: XlsxBuiltInNumberFormat.Currency2DecimalWithRed,
|
|
413
|
+
},
|
|
414
|
+
},
|
|
415
|
+
};
|
|
416
|
+
},
|
|
417
|
+
},
|
|
418
|
+
{
|
|
419
|
+
id: 'serviceFeePayout',
|
|
420
|
+
name: $t(`%1VD`),
|
|
421
|
+
width: 50,
|
|
422
|
+
getValue: (object: PaymentGeneralWithStripeAccount) => {
|
|
423
|
+
return {
|
|
424
|
+
value: object.serviceFeePayout / 1_0000,
|
|
425
|
+
style: {
|
|
426
|
+
numberFormat: {
|
|
427
|
+
id: XlsxBuiltInNumberFormat.Currency2DecimalWithRed,
|
|
428
|
+
},
|
|
429
|
+
},
|
|
430
|
+
};
|
|
431
|
+
},
|
|
432
|
+
},
|
|
403
433
|
{
|
|
404
434
|
id: 'stripeAccountId',
|
|
405
435
|
name: $t(`%1m`),
|
|
@@ -25,7 +25,7 @@ const sheet: XlsxTransformerSheet<PlatformMembership> = {
|
|
|
25
25
|
getValue: (membership: PlatformMembership) => {
|
|
26
26
|
const membershipType = Platform.shared.config.membershipTypes.find(m => m.id === membership.membershipTypeId);
|
|
27
27
|
const value = membershipType ? membershipType.name : '';
|
|
28
|
-
return {value};
|
|
28
|
+
return { value };
|
|
29
29
|
},
|
|
30
30
|
},
|
|
31
31
|
{
|
|
@@ -66,25 +66,25 @@ const sheet: XlsxTransformerSheet<PlatformMembership> = {
|
|
|
66
66
|
return {
|
|
67
67
|
value: membership.price / 1_0000,
|
|
68
68
|
style: {
|
|
69
|
-
|
|
70
|
-
|
|
69
|
+
numberFormat: {
|
|
70
|
+
id: XlsxBuiltInNumberFormat.Currency2DecimalWithRed,
|
|
71
|
+
},
|
|
71
72
|
},
|
|
72
|
-
},
|
|
73
73
|
};
|
|
74
74
|
},
|
|
75
75
|
},
|
|
76
76
|
{
|
|
77
77
|
id: 'priceWithoutDiscount',
|
|
78
|
-
name:
|
|
78
|
+
name: $t(`%1Nm`),
|
|
79
79
|
width: 10,
|
|
80
80
|
getValue: (membership: PlatformMembership) => {
|
|
81
81
|
return {
|
|
82
82
|
value: membership.priceWithoutDiscount / 1_0000,
|
|
83
83
|
style: {
|
|
84
|
-
|
|
85
|
-
|
|
84
|
+
numberFormat: {
|
|
85
|
+
id: XlsxBuiltInNumberFormat.Currency2DecimalWithRed,
|
|
86
|
+
},
|
|
86
87
|
},
|
|
87
|
-
},
|
|
88
88
|
};
|
|
89
89
|
},
|
|
90
90
|
},
|
|
@@ -214,7 +214,7 @@ const sheet: XlsxTransformerSheet<PlatformMembership> = {
|
|
|
214
214
|
id: 'member.firstName',
|
|
215
215
|
name: $t(`%1O8`),
|
|
216
216
|
width: 20,
|
|
217
|
-
getValue:(membership: PlatformMembership) => ({
|
|
217
|
+
getValue: (membership: PlatformMembership) => ({
|
|
218
218
|
value: membership.member.firstName,
|
|
219
219
|
}),
|
|
220
220
|
},
|
|
@@ -222,7 +222,7 @@ const sheet: XlsxTransformerSheet<PlatformMembership> = {
|
|
|
222
222
|
id: 'member.lastName',
|
|
223
223
|
name: $t(`%1Or`),
|
|
224
224
|
width: 20,
|
|
225
|
-
getValue:(membership: PlatformMembership) => ({
|
|
225
|
+
getValue: (membership: PlatformMembership) => ({
|
|
226
226
|
value: membership.member.lastName,
|
|
227
227
|
}),
|
|
228
228
|
},
|
|
@@ -231,7 +231,7 @@ const sheet: XlsxTransformerSheet<PlatformMembership> = {
|
|
|
231
231
|
id: 'organization.name',
|
|
232
232
|
name: $t(`%1PW`),
|
|
233
233
|
width: 20,
|
|
234
|
-
getValue:(membership: PlatformMembership) => ({
|
|
234
|
+
getValue: (membership: PlatformMembership) => ({
|
|
235
235
|
value: membership.organization.name,
|
|
236
236
|
}),
|
|
237
237
|
},
|
|
@@ -239,14 +239,13 @@ const sheet: XlsxTransformerSheet<PlatformMembership> = {
|
|
|
239
239
|
id: 'organization.uri',
|
|
240
240
|
name: $t(`%1PZ`),
|
|
241
241
|
width: 20,
|
|
242
|
-
getValue:(membership: PlatformMembership) => ({
|
|
242
|
+
getValue: (membership: PlatformMembership) => ({
|
|
243
243
|
value: membership.organization.uri,
|
|
244
244
|
}),
|
|
245
|
-
}
|
|
245
|
+
},
|
|
246
246
|
],
|
|
247
247
|
};
|
|
248
248
|
|
|
249
|
-
|
|
250
249
|
ExportToExcelEndpoint.loaders.set(ExcelExportType.PlatformMemberships, {
|
|
251
250
|
fetch: async (query: LimitedFilteredRequest) => {
|
|
252
251
|
const data = await GetPlatformMembershipsEndpoint.buildData(query);
|
|
@@ -146,7 +146,7 @@ function getBalanceItemColumns(): XlsxTransformerColumn<ReceivableBalanceWithIte
|
|
|
146
146
|
},
|
|
147
147
|
{
|
|
148
148
|
id: 'pricePending',
|
|
149
|
-
name: $t(`%
|
|
149
|
+
name: $t(`%1OL`),
|
|
150
150
|
width: 20,
|
|
151
151
|
getValue: (object: ReceivableBalanceWithItem) => ({
|
|
152
152
|
value: object.balanceItem.pricePending / 1_0000,
|
|
@@ -273,7 +273,7 @@ function getGeneralColumns(): XlsxTransformerConcreteColumn<ReceivableBalance>[]
|
|
|
273
273
|
},
|
|
274
274
|
{
|
|
275
275
|
id: 'amountPending',
|
|
276
|
-
name: $t(`%
|
|
276
|
+
name: $t(`%1OL`),
|
|
277
277
|
width: 18,
|
|
278
278
|
getValue: (object: ReceivableBalance) => ({
|
|
279
279
|
value: object.amountPending / 1_0000,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { XlsxTransformerSheet } from '@stamhoofd/excel-writer';
|
|
2
2
|
import { XlsxBuiltInNumberFormat } from '@stamhoofd/excel-writer';
|
|
3
3
|
import { Platform } from '@stamhoofd/models';
|
|
4
|
-
import type { LimitedFilteredRequest, PlatformMember} from '@stamhoofd/structures';
|
|
4
|
+
import type { LimitedFilteredRequest, PlatformMember } from '@stamhoofd/structures';
|
|
5
5
|
import { ExcelExportType, getGroupTypeName, PlatformRegistration, Platform as PlatformStruct, UnencodeablePaginatedResponse } from '@stamhoofd/structures';
|
|
6
6
|
import { ExportToExcelEndpoint } from '../endpoints/global/files/ExportToExcelEndpoint.js';
|
|
7
7
|
import { GetRegistrationsEndpoint } from '../endpoints/global/registration/GetRegistrationsEndpoint.js';
|
|
@@ -164,8 +164,7 @@ const sheet: XlsxTransformerSheet<PlatformMember, PlatformRegistration> = {
|
|
|
164
164
|
if (registration.payingOrganizationId) {
|
|
165
165
|
const organization = registration.member.organizations.find(o => o.id === registration.payingOrganizationId);
|
|
166
166
|
value = organization ? organization.name : $t(`%Gr`);
|
|
167
|
-
}
|
|
168
|
-
else {
|
|
167
|
+
} else {
|
|
169
168
|
value = $t(`%18s`);
|
|
170
169
|
}
|
|
171
170
|
|
|
@@ -40,8 +40,7 @@ export class AddressValidatorStatic {
|
|
|
40
40
|
|
|
41
41
|
// Don't do validation on last letters
|
|
42
42
|
postalCode = numbers;
|
|
43
|
-
}
|
|
44
|
-
else {
|
|
43
|
+
} else {
|
|
45
44
|
postalCode = postalCode.trim();
|
|
46
45
|
}
|
|
47
46
|
|
|
@@ -50,8 +49,7 @@ export class AddressValidatorStatic {
|
|
|
50
49
|
if (!/\d{4}/.test(numbers)) {
|
|
51
50
|
postalCode = numbers;
|
|
52
51
|
address.city = address.city.substring(4).trim();
|
|
53
|
-
}
|
|
54
|
-
else {
|
|
52
|
+
} else {
|
|
55
53
|
throw new SimpleError({
|
|
56
54
|
code: 'invalid_field',
|
|
57
55
|
message: 'Postal code is required',
|
|
@@ -93,8 +91,7 @@ export class AddressValidatorStatic {
|
|
|
93
91
|
const c = await City.getByID(city.parentCityId ?? city.id);
|
|
94
92
|
try {
|
|
95
93
|
await this.syncCity(c!);
|
|
96
|
-
}
|
|
97
|
-
catch (e) {
|
|
94
|
+
} catch (e) {
|
|
98
95
|
console.error('Ignored error while syncing city');
|
|
99
96
|
console.error(e);
|
|
100
97
|
}
|
|
@@ -115,8 +112,7 @@ export class AddressValidatorStatic {
|
|
|
115
112
|
|
|
116
113
|
if (bestStreet && bestScore < 3) {
|
|
117
114
|
address.street = bestStreet.name;
|
|
118
|
-
}
|
|
119
|
-
else {
|
|
115
|
+
} else {
|
|
120
116
|
// Search for the street
|
|
121
117
|
bestScore = 0;
|
|
122
118
|
bestStreet = undefined;
|
|
@@ -144,8 +140,7 @@ export class AddressValidatorStatic {
|
|
|
144
140
|
field: 'street',
|
|
145
141
|
});
|
|
146
142
|
}
|
|
147
|
-
}
|
|
148
|
-
else {
|
|
143
|
+
} else {
|
|
149
144
|
// Skip validation for some regions that don't support validation
|
|
150
145
|
}
|
|
151
146
|
}
|
|
@@ -180,8 +175,7 @@ export class AddressValidatorStatic {
|
|
|
180
175
|
streetNames.push(...streets);
|
|
181
176
|
url = result.volgende;
|
|
182
177
|
}
|
|
183
|
-
}
|
|
184
|
-
catch (e) {
|
|
178
|
+
} catch (e) {
|
|
185
179
|
console.error(e.response.data);
|
|
186
180
|
throw new Error('Failed to fetch streets');
|
|
187
181
|
}
|
|
@@ -238,8 +232,7 @@ export class AddressValidatorStatic {
|
|
|
238
232
|
for (const city of cities) {
|
|
239
233
|
try {
|
|
240
234
|
await this.syncCity(city);
|
|
241
|
-
}
|
|
242
|
-
catch (e) {
|
|
235
|
+
} catch (e) {
|
|
243
236
|
console.error('Failed city sync for ' + city.name, e);
|
|
244
237
|
}
|
|
245
238
|
}
|
|
@@ -8,6 +8,8 @@ import { AccessRight, EmailTemplate as EmailTemplateStruct, EventPermissionCheck
|
|
|
8
8
|
import { Formatter } from '@stamhoofd/utility';
|
|
9
9
|
import type { RecordCacheEntry } from '../services/MemberRecordStore.js';
|
|
10
10
|
import { MemberRecordStore } from '../services/MemberRecordStore.js';
|
|
11
|
+
import { getFinancialSupportSettingsAsync } from './FinancialSupportHelper.js';
|
|
12
|
+
import { RecordAnswerHelper } from './RecordAnswerHelper.js';
|
|
11
13
|
import { addTemporaryMemberAccess, hasTemporaryMemberAccess } from './TemporaryMemberAccess.js';
|
|
12
14
|
|
|
13
15
|
/**
|
|
@@ -99,12 +101,10 @@ export class AdminPermissionChecker {
|
|
|
99
101
|
const resolved = await cache;
|
|
100
102
|
if (resolved) {
|
|
101
103
|
cached.push(resolved);
|
|
102
|
-
}
|
|
103
|
-
else {
|
|
104
|
+
} else {
|
|
104
105
|
// Not found, no need to readd
|
|
105
106
|
}
|
|
106
|
-
}
|
|
107
|
-
else {
|
|
107
|
+
} else {
|
|
108
108
|
remainingIds.push(groupId);
|
|
109
109
|
}
|
|
110
110
|
}
|
|
@@ -223,15 +223,13 @@ export class AdminPermissionChecker {
|
|
|
223
223
|
if (this.user.organizationId && organizationId !== this.user.organizationId) {
|
|
224
224
|
return false;
|
|
225
225
|
}
|
|
226
|
-
}
|
|
227
|
-
else {
|
|
226
|
+
} else {
|
|
228
227
|
if (STAMHOOFD.userMode === 'organization') {
|
|
229
228
|
// User is limited to a scope: can't access platform resources
|
|
230
229
|
if (this.user.organizationId) {
|
|
231
230
|
return false;
|
|
232
231
|
}
|
|
233
|
-
}
|
|
234
|
-
else {
|
|
232
|
+
} else {
|
|
235
233
|
// User can access platform resources (e.g. API keys)
|
|
236
234
|
}
|
|
237
235
|
}
|
|
@@ -321,8 +319,7 @@ export class AdminPermissionChecker {
|
|
|
321
319
|
if (group.settings.allowRegistrationsByOrganization && !group.getStructure().closed) {
|
|
322
320
|
if (group.organizationId !== asOrganizationId) {
|
|
323
321
|
return await this.hasFullAccess(asOrganizationId);
|
|
324
|
-
}
|
|
325
|
-
else {
|
|
322
|
+
} else {
|
|
326
323
|
return await this.hasSomeAccess(asOrganizationId);
|
|
327
324
|
}
|
|
328
325
|
}
|
|
@@ -348,8 +345,7 @@ export class AdminPermissionChecker {
|
|
|
348
345
|
try {
|
|
349
346
|
await this.checkEventAccess(event);
|
|
350
347
|
return true;
|
|
351
|
-
}
|
|
352
|
-
catch (e) {
|
|
348
|
+
} catch (e) {
|
|
353
349
|
if (isSimpleError(e) || isSimpleErrors(e)) {
|
|
354
350
|
return false;
|
|
355
351
|
}
|
|
@@ -628,7 +624,7 @@ export class AdminPermissionChecker {
|
|
|
628
624
|
): Promise<boolean> {
|
|
629
625
|
// These balance items are out of scope - but we do have access to them
|
|
630
626
|
for (const balanceItem of balanceItems) {
|
|
631
|
-
if (balanceItem.payingOrganizationId && this.checkScope(balanceItem.payingOrganizationId)) {
|
|
627
|
+
if (balanceItem.payingOrganizationId && (this.checkScope(balanceItem.payingOrganizationId) || this.checkScope(balanceItem.organizationId))) {
|
|
632
628
|
if (await this.canManagePayments(balanceItem.payingOrganizationId)) {
|
|
633
629
|
return true;
|
|
634
630
|
}
|
|
@@ -800,7 +796,12 @@ export class AdminPermissionChecker {
|
|
|
800
796
|
return false;
|
|
801
797
|
}
|
|
802
798
|
|
|
803
|
-
|
|
799
|
+
if (!this.organization) {
|
|
800
|
+
const org = await this.getOrganization(template.organizationId);
|
|
801
|
+
return EmailTemplateStruct.allowOrganizationLevel(template.type, org, this.platform);
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
return EmailTemplateStruct.allowOrganizationLevel(template.type, this.organization, this.platform);
|
|
804
805
|
}
|
|
805
806
|
|
|
806
807
|
// Note: if the template has an organizationId of null, everyone can access it, but only for reading
|
|
@@ -868,8 +869,7 @@ export class AdminPermissionChecker {
|
|
|
868
869
|
if (await this.canManagePayments(member.organizationId)) {
|
|
869
870
|
return true;
|
|
870
871
|
}
|
|
871
|
-
}
|
|
872
|
-
else {
|
|
872
|
+
} else {
|
|
873
873
|
const organizationIds = Formatter.uniqueArray(member.registrations.map(r => r.organizationId));
|
|
874
874
|
for (const organizationId of organizationIds) {
|
|
875
875
|
if (await this.canManagePayments(organizationId)) {
|
|
@@ -1117,7 +1117,7 @@ export class AdminPermissionChecker {
|
|
|
1117
1117
|
return false;
|
|
1118
1118
|
}
|
|
1119
1119
|
|
|
1120
|
-
async hasFullAccess(organizationId: string, level = PermissionLevel.Full): Promise<boolean> {
|
|
1120
|
+
async hasFullAccess(organizationId: string | Organization, level = PermissionLevel.Full): Promise<boolean> {
|
|
1121
1121
|
const organizationPermissions = await this.getOrganizationPermissions(organizationId);
|
|
1122
1122
|
|
|
1123
1123
|
if (!organizationPermissions) {
|
|
@@ -1157,14 +1157,12 @@ export class AdminPermissionChecker {
|
|
|
1157
1157
|
if (this.checkScope(member.organizationId)) {
|
|
1158
1158
|
organizations.push(await this.getOrganization(member.organizationId));
|
|
1159
1159
|
}
|
|
1160
|
-
}
|
|
1161
|
-
else {
|
|
1160
|
+
} else {
|
|
1162
1161
|
if (organizationId) {
|
|
1163
1162
|
if (this.checkScope(organizationId)) {
|
|
1164
1163
|
organizations.push(await this.getOrganization(organizationId));
|
|
1165
1164
|
}
|
|
1166
|
-
}
|
|
1167
|
-
else {
|
|
1165
|
+
} else {
|
|
1168
1166
|
for (const registration of member.registrations) {
|
|
1169
1167
|
if (this.checkScope(registration.organizationId)) {
|
|
1170
1168
|
if (!organizations.find(o => o.id === registration.organizationId)) {
|
|
@@ -1205,8 +1203,7 @@ export class AdminPermissionChecker {
|
|
|
1205
1203
|
if (platformPermissions.hasAccessRight(AccessRight.OrganizationManagePayments)) {
|
|
1206
1204
|
return true;
|
|
1207
1205
|
}
|
|
1208
|
-
}
|
|
1209
|
-
else {
|
|
1206
|
+
} else {
|
|
1210
1207
|
if (platformPermissions.hasAccessRight(level === PermissionLevel.Read ? AccessRight.MemberReadFinancialData : AccessRight.MemberWriteFinancialData)) {
|
|
1211
1208
|
return true;
|
|
1212
1209
|
}
|
|
@@ -1284,8 +1281,8 @@ export class AdminPermissionChecker {
|
|
|
1284
1281
|
return {
|
|
1285
1282
|
record,
|
|
1286
1283
|
rootCategoryId: recordCategory.id,
|
|
1287
|
-
organizationId: this.organization.id
|
|
1288
|
-
}
|
|
1284
|
+
organizationId: this.organization.id,
|
|
1285
|
+
};
|
|
1289
1286
|
}
|
|
1290
1287
|
}
|
|
1291
1288
|
}
|
|
@@ -1330,8 +1327,7 @@ export class AdminPermissionChecker {
|
|
|
1330
1327
|
record: record.record,
|
|
1331
1328
|
};
|
|
1332
1329
|
}
|
|
1333
|
-
}
|
|
1334
|
-
else {
|
|
1330
|
+
} else {
|
|
1335
1331
|
// ONLY check current scoped organization
|
|
1336
1332
|
if (this.organization) {
|
|
1337
1333
|
const organizationPermissions = await this.getOrganizationPermissions(this.organization.id);
|
|
@@ -1366,14 +1362,13 @@ export class AdminPermissionChecker {
|
|
|
1366
1362
|
};
|
|
1367
1363
|
}
|
|
1368
1364
|
|
|
1369
|
-
private async loopRecordAnswerSettingsAccess<T extends RecordAnswer | AutoEncoderPatchType<RecordAnswer>>({member, level, recordAnswers, callback }:
|
|
1365
|
+
private async loopRecordAnswerSettingsAccess<T extends RecordAnswer | AutoEncoderPatchType<RecordAnswer>>({ member, level, recordAnswers, callback }:
|
|
1370
1366
|
{
|
|
1371
|
-
member: MemberWithUsersRegistrationsAndGroups
|
|
1372
|
-
level: PermissionLevel
|
|
1373
|
-
recordAnswers: PatchMap<string, T | null | undefined> |
|
|
1374
|
-
callback: (result: { canAccess: false; record: RecordSettings | null } | { canAccess: true; record: RecordSettings }, entry: [keys: string, value: T | null | undefined]) => void
|
|
1375
|
-
}): Promise<void>
|
|
1376
|
-
{
|
|
1367
|
+
member: MemberWithUsersRegistrationsAndGroups;
|
|
1368
|
+
level: PermissionLevel;
|
|
1369
|
+
recordAnswers: PatchMap<string, T | null | undefined> | Map<string, T>;
|
|
1370
|
+
callback: (result: { canAccess: false; record: RecordSettings | null } | { canAccess: true; record: RecordSettings }, entry: [keys: string, value: T | null | undefined]) => void;
|
|
1371
|
+
}): Promise<void> {
|
|
1377
1372
|
if (STAMHOOFD.userMode !== 'platform') {
|
|
1378
1373
|
let organization = this.organization;
|
|
1379
1374
|
|
|
@@ -1386,11 +1381,11 @@ export class AdminPermissionChecker {
|
|
|
1386
1381
|
if (member.registrations.length === 0) {
|
|
1387
1382
|
// no access to any records (theoretically a global admin should have access, but normally this case should not happen)
|
|
1388
1383
|
for (const entry of recordAnswers.entries()) {
|
|
1389
|
-
callback({canAccess: false, record: null}, entry);
|
|
1384
|
+
callback({ canAccess: false, record: null }, entry);
|
|
1390
1385
|
}
|
|
1391
1386
|
return;
|
|
1392
1387
|
}
|
|
1393
|
-
|
|
1388
|
+
|
|
1394
1389
|
// in userMode organization a member can only be linked to 1 organization
|
|
1395
1390
|
organizationId = member.registrations[0].organizationId;
|
|
1396
1391
|
}
|
|
@@ -1399,7 +1394,7 @@ export class AdminPermissionChecker {
|
|
|
1399
1394
|
}
|
|
1400
1395
|
|
|
1401
1396
|
const organizationId = organization.id;
|
|
1402
|
-
const map = new Map<string, RecordCacheEntry>()
|
|
1397
|
+
const map = new Map<string, RecordCacheEntry>();
|
|
1403
1398
|
|
|
1404
1399
|
// create map
|
|
1405
1400
|
for (const category of organization.meta.recordsConfiguration.recordCategories) {
|
|
@@ -1413,7 +1408,7 @@ export class AdminPermissionChecker {
|
|
|
1413
1408
|
});
|
|
1414
1409
|
}
|
|
1415
1410
|
}
|
|
1416
|
-
|
|
1411
|
+
|
|
1417
1412
|
for (const entry of recordAnswers.entries()) {
|
|
1418
1413
|
const key = entry[0];
|
|
1419
1414
|
const cachedRecordEntry = map.get(key);
|
|
@@ -1423,11 +1418,11 @@ export class AdminPermissionChecker {
|
|
|
1423
1418
|
record: cachedRecordEntry.record,
|
|
1424
1419
|
organizationId: cachedRecordEntry.organizationId,
|
|
1425
1420
|
rootCategoryId: cachedRecordEntry.rootCategoryId,
|
|
1426
|
-
level
|
|
1421
|
+
level,
|
|
1427
1422
|
});
|
|
1428
|
-
callback({canAccess, record: cachedRecordEntry.record}, entry);
|
|
1423
|
+
callback({ canAccess, record: cachedRecordEntry.record }, entry);
|
|
1429
1424
|
} else {
|
|
1430
|
-
callback({canAccess: false, record: null}, entry);
|
|
1425
|
+
callback({ canAccess: false, record: null }, entry);
|
|
1431
1426
|
}
|
|
1432
1427
|
}
|
|
1433
1428
|
|
|
@@ -1435,7 +1430,7 @@ export class AdminPermissionChecker {
|
|
|
1435
1430
|
}
|
|
1436
1431
|
|
|
1437
1432
|
// userMode platform
|
|
1438
|
-
|
|
1433
|
+
for (const entry of recordAnswers.entries()) {
|
|
1439
1434
|
const key = entry[0];
|
|
1440
1435
|
const cachedRecordEntry = await MemberRecordStore.getRecord(key);
|
|
1441
1436
|
if (cachedRecordEntry) {
|
|
@@ -1444,18 +1439,18 @@ export class AdminPermissionChecker {
|
|
|
1444
1439
|
record: cachedRecordEntry.record,
|
|
1445
1440
|
organizationId: cachedRecordEntry.organizationId,
|
|
1446
1441
|
rootCategoryId: cachedRecordEntry.rootCategoryId,
|
|
1447
|
-
level
|
|
1442
|
+
level,
|
|
1448
1443
|
});
|
|
1449
|
-
callback({canAccess, record: cachedRecordEntry.record}, entry);
|
|
1444
|
+
callback({ canAccess, record: cachedRecordEntry.record }, entry);
|
|
1450
1445
|
} else {
|
|
1451
|
-
callback({canAccess: false, record: null}, entry);
|
|
1446
|
+
callback({ canAccess: false, record: null }, entry);
|
|
1452
1447
|
}
|
|
1453
1448
|
}
|
|
1454
1449
|
}
|
|
1455
1450
|
|
|
1456
|
-
private async checkRecordAccess({member, level, record, organizationId, rootCategoryId}: {member: MemberWithUsersRegistrationsAndGroups
|
|
1451
|
+
private async checkRecordAccess({ member, level, record, organizationId, rootCategoryId }: { member: MemberWithUsersRegistrationsAndGroups; record: RecordSettings; organizationId: string | null; rootCategoryId: string; level: PermissionLevel }): Promise<boolean> {
|
|
1457
1452
|
if (!this.checkScope(organizationId)) {
|
|
1458
|
-
return false
|
|
1453
|
+
return false;
|
|
1459
1454
|
}
|
|
1460
1455
|
|
|
1461
1456
|
const isUserManager = this.isUserManager(member);
|
|
@@ -1474,8 +1469,7 @@ export class AdminPermissionChecker {
|
|
|
1474
1469
|
if (organizationPermissions && organizationPermissions.hasResourceAccess(PermissionsResourceType.RecordCategories, rootCategoryId, level)) {
|
|
1475
1470
|
return true;
|
|
1476
1471
|
}
|
|
1477
|
-
}
|
|
1478
|
-
else {
|
|
1472
|
+
} else {
|
|
1479
1473
|
// Also check current scoped organization
|
|
1480
1474
|
if (this.organization) {
|
|
1481
1475
|
const organizationPermissions = await this.getOrganizationPermissions(this.organization.id);
|
|
@@ -1520,8 +1514,7 @@ export class AdminPermissionChecker {
|
|
|
1520
1514
|
if (await this.canAccessRegistration(registration, level)) {
|
|
1521
1515
|
return true;
|
|
1522
1516
|
}
|
|
1523
|
-
}
|
|
1524
|
-
else {
|
|
1517
|
+
} else {
|
|
1525
1518
|
checkedOrganizations.set(registration.organizationId, false);
|
|
1526
1519
|
}
|
|
1527
1520
|
}
|
|
@@ -1555,14 +1548,13 @@ export class AdminPermissionChecker {
|
|
|
1555
1548
|
callback: ({ canAccess, record }, [key, value]) => {
|
|
1556
1549
|
if (!canAccess) {
|
|
1557
1550
|
cloned.details.recordAnswers.delete(key);
|
|
1558
|
-
}
|
|
1559
|
-
|
|
1560
|
-
if (value) {
|
|
1551
|
+
} else {
|
|
1552
|
+
if (value && RecordAnswerHelper.haveTypesSameClass(value.settings.type, record.type)) {
|
|
1561
1553
|
// Force update
|
|
1562
1554
|
value.settings = record;
|
|
1563
1555
|
}
|
|
1564
1556
|
}
|
|
1565
|
-
}
|
|
1557
|
+
},
|
|
1566
1558
|
});
|
|
1567
1559
|
|
|
1568
1560
|
const isUserManager = this.isUserManager(member);
|
|
@@ -1669,14 +1661,12 @@ export class AdminPermissionChecker {
|
|
|
1669
1661
|
if (data.details.uitpasNumberDetails && data.details.uitpasNumberDetails.socialTariff !== undefined) {
|
|
1670
1662
|
if (data.details.uitpasNumberDetails.uitpasNumber === undefined) {
|
|
1671
1663
|
data.details.uitpasNumberDetails = undefined;
|
|
1672
|
-
}
|
|
1673
|
-
else if (data.details.uitpasNumberDetails.uitpasNumber !== member.details.uitpasNumberDetails?.uitpasNumber) {
|
|
1664
|
+
} else if (data.details.uitpasNumberDetails.uitpasNumber !== member.details.uitpasNumberDetails?.uitpasNumber) {
|
|
1674
1665
|
// if uitpas number did change -> status should be reset
|
|
1675
1666
|
data.details.uitpasNumberDetails = UitpasNumberDetails.create({
|
|
1676
1667
|
uitpasNumber: data.details.uitpasNumberDetails.uitpasNumber,
|
|
1677
1668
|
});
|
|
1678
|
-
}
|
|
1679
|
-
else {
|
|
1669
|
+
} else {
|
|
1680
1670
|
// if uitpas number did not change
|
|
1681
1671
|
data.details.uitpasNumberDetails.socialTariff = member.details.uitpasNumberDetails?.socialTariff;
|
|
1682
1672
|
}
|
|
@@ -1695,7 +1685,7 @@ export class AdminPermissionChecker {
|
|
|
1695
1685
|
member,
|
|
1696
1686
|
level: PermissionLevel.Write,
|
|
1697
1687
|
recordAnswers: data.details.recordAnswers,
|
|
1698
|
-
callback: ({canAccess, record}, [_key, value]) => {
|
|
1688
|
+
callback: ({ canAccess, record }, [_key, value]) => {
|
|
1699
1689
|
if (!canAccess) {
|
|
1700
1690
|
throw new SimpleError({
|
|
1701
1691
|
code: 'permission_denied',
|
|
@@ -1708,8 +1698,8 @@ export class AdminPermissionChecker {
|
|
|
1708
1698
|
if (value) {
|
|
1709
1699
|
value.settings = record;
|
|
1710
1700
|
}
|
|
1711
|
-
}
|
|
1712
|
-
})
|
|
1701
|
+
},
|
|
1702
|
+
});
|
|
1713
1703
|
}
|
|
1714
1704
|
|
|
1715
1705
|
const isUserManager = this.isUserManager(member);
|
|
@@ -1731,7 +1721,13 @@ export class AdminPermissionChecker {
|
|
|
1731
1721
|
// Has financial write access?
|
|
1732
1722
|
if (!await this.hasFinancialMemberAccess(member, PermissionLevel.Write)) {
|
|
1733
1723
|
if (isUserManager && isSetFinancialSupportTrue) {
|
|
1734
|
-
const financialSupportSettings = this.platform
|
|
1724
|
+
const financialSupportSettings = await getFinancialSupportSettingsAsync(this.platform, async () => {
|
|
1725
|
+
if (member.organizationId) {
|
|
1726
|
+
return await this.getOrganization(member.organizationId);
|
|
1727
|
+
}
|
|
1728
|
+
return null;
|
|
1729
|
+
});
|
|
1730
|
+
|
|
1735
1731
|
const preventSelfAssignment = financialSupportSettings?.preventSelfAssignment === true;
|
|
1736
1732
|
|
|
1737
1733
|
if (preventSelfAssignment) {
|
|
@@ -1747,8 +1743,7 @@ export class AdminPermissionChecker {
|
|
|
1747
1743
|
if (data.details.requiresFinancialSupport) {
|
|
1748
1744
|
if (isUserManager) {
|
|
1749
1745
|
// Already handled
|
|
1750
|
-
}
|
|
1751
|
-
else {
|
|
1746
|
+
} else {
|
|
1752
1747
|
throw new SimpleError({
|
|
1753
1748
|
code: 'permission_denied',
|
|
1754
1749
|
message: 'Je hebt geen toegangsrechten om de financiële status van dit lid aan te passen',
|