@stamhoofd/backend 2.121.0 → 2.122.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/output-2.txt +1 -0
- package/output.txt +1 -0
- package/package.json +69 -52
- 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 +24 -24
- package/src/audit-logs/init.ts +8 -2
- 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 +5 -0
- package/src/crons/invoices.ts +32 -38
- package/src/crons/members-fees.ts +50 -0
- package/src/crons/mollie-chargebacks.ts +14 -15
- 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 +7 -64
- 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 +4 -6
- 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 +1 -1
- 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 +11 -11
- 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 +35 -34
- package/src/endpoints/global/registration-invitations/GetRegistrationInvitationsCountEndpoint.ts +1 -1
- package/src/endpoints/global/registration-invitations/GetRegistrationInvitationsEndpoint.test.ts +62 -63
- package/src/endpoints/global/registration-invitations/GetRegistrationInvitationsEndpoint.ts +6 -9
- package/src/endpoints/global/registration-invitations/PatchRegistrationInvitationsEndpoint.test.ts +51 -52
- package/src/endpoints/global/registration-invitations/PatchRegistrationInvitationsEndpoint.ts +6 -7
- 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 +7 -9
- package/src/endpoints/organization/dashboard/billing/ApplyRegisterCodeEndpoint.test.ts +73 -0
- package/src/endpoints/organization/dashboard/billing/ApplyRegisterCodeEndpoint.ts +89 -0
- package/src/endpoints/organization/dashboard/billing/DeactivatePackageEndpoint.ts +1 -5
- package/src/endpoints/organization/dashboard/billing/DeleteOrganizationMandateEndpoint.ts +11 -11
- package/src/endpoints/organization/dashboard/billing/GetOrganizationDetailedPayableBalanceCollectionEndpoint.ts +2 -2
- package/src/endpoints/organization/dashboard/billing/GetOrganizationDetailedPayableBalanceEndpoint.ts +8 -8
- package/src/endpoints/organization/dashboard/billing/GetOrganizationMandatesEndpoint.ts +9 -9
- 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 +4 -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 +60 -57
- package/src/endpoints/organization/dashboard/billing/PatchOrganizationMandatesEndpoint.ts +20 -20
- 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 +10 -6
- package/src/endpoints/organization/dashboard/invoices/PatchInvoicesEndpoint.ts +11 -2
- package/src/endpoints/organization/dashboard/mollie/CheckMollieEndpoint.ts +4 -5
- package/src/endpoints/organization/dashboard/mollie/ConnectMollieEndpoint.ts +5 -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 +50 -12
- 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 +21 -14
- package/src/endpoints/organization/dashboard/receivable-balances/ChargeReceivableBalancesEndpoint.ts +35 -28
- 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 +19 -18
- 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 +22 -7
- package/src/endpoints/organization/dashboard/webshops/PatchWebshopOrdersEndpoint.ts +20 -27
- 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 +2 -2
- 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 +16 -33
- 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 +50 -63
- package/src/helpers/AuthenticatedStructures.ts +69 -55
- 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 +2 -2
- 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 +105 -110
- package/src/helpers/RecordAnswerHelper.ts +7 -7
- 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 +14 -36
- 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 +7 -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/{seeds → migrations}/1750090030-records-configuration.ts +33 -32
- 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 +70 -26
- 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/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 +141 -44
- 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 +204 -251
- 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 +114 -121
- package/src/services/PaymentMandateService.ts +45 -45
- package/src/services/PaymentReallocationService.test.ts +1 -1
- package/src/services/PaymentReallocationService.ts +7 -9
- package/src/services/PaymentService.ts +444 -308
- package/src/services/PlatformMembershipService.ts +4 -8
- package/src/services/ReferralService.ts +223 -0
- package/src/services/RegistrationService.ts +63 -53
- package/src/services/SSOService.test.ts +119 -0
- package/src/services/SSOService.ts +56 -49
- package/src/services/STPackageService.ts +97 -61
- package/src/services/UniqueMemberNumberService.ts +69 -0
- package/src/services/UniqueUserService.ts +3 -6
- package/src/services/VATService.ts +85 -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 +5 -0
- 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/platform-memberships.ts +3 -3
- package/src/sql-filters/receivable-balances.ts +1 -1
- 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 +2 -2
- 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 +6 -0
- package/.nvmrc +0 -1
- 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/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}/1779121239-default-invoice-email-template.sql +0 -0
- /package/src/{seeds → migrations}/data/default-email-templates.sql +0 -0
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import type { Organization } from '@stamhoofd/models';
|
|
2
|
+
import { BalanceItem } from '@stamhoofd/models';
|
|
3
|
+
import type { Company, Organization as OrganizationStruct } from '@stamhoofd/structures';
|
|
4
|
+
import { BalanceItemStatus, getBalanceItemTypeVATType, VATExcemptReason } from '@stamhoofd/structures';
|
|
5
|
+
|
|
6
|
+
export class VATService {
|
|
7
|
+
static getDefaultCompanyForOrganization(sellingOrganization: Organization | OrganizationStruct): Company {
|
|
8
|
+
return sellingOrganization.defaultCompanies[0];
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
static async updateVATExcempt({ organization, sellingOrganization }: { organization: Organization; sellingOrganization: Organization | OrganizationStruct }) {
|
|
12
|
+
const company = organization.defaultCompanies[0];
|
|
13
|
+
const exempt = this.isVATExcempt({ company, sellingOrganization });
|
|
14
|
+
console.log('updating VAT excempt', exempt);
|
|
15
|
+
|
|
16
|
+
if (exempt) {
|
|
17
|
+
const items = await BalanceItem.select()
|
|
18
|
+
.where('organizationId', sellingOrganization.id)
|
|
19
|
+
.where('payingOrganizationId', organization.id)
|
|
20
|
+
.whereNot('status', BalanceItemStatus.Hidden)
|
|
21
|
+
.whereNot('priceOpen', 0)
|
|
22
|
+
.where('priceInvoiced', 0)
|
|
23
|
+
.where('VATExcempt', null)
|
|
24
|
+
.fetch();
|
|
25
|
+
|
|
26
|
+
for (const item of items) {
|
|
27
|
+
if (!item.VATExcempt) {
|
|
28
|
+
const type = getBalanceItemTypeVATType(item.type);
|
|
29
|
+
if (type) {
|
|
30
|
+
item.VATExcempt = this.getVATExcemptType({ type });
|
|
31
|
+
await item.save();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
} else {
|
|
36
|
+
const items = await BalanceItem.select()
|
|
37
|
+
.where('organizationId', sellingOrganization.id)
|
|
38
|
+
.where('payingOrganizationId', organization.id)
|
|
39
|
+
.whereNot('status', BalanceItemStatus.Hidden)
|
|
40
|
+
.whereNot('priceOpen', 0)
|
|
41
|
+
.where('priceInvoiced', 0)
|
|
42
|
+
.whereNot('VATExcempt', null)
|
|
43
|
+
.fetch();
|
|
44
|
+
|
|
45
|
+
for (const item of items) {
|
|
46
|
+
if (item.VATExcempt) {
|
|
47
|
+
item.VATExcempt = null;
|
|
48
|
+
await item.save();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
static isVATExcempt({ company, sellingOrganization }: { company: Company | null | undefined; sellingOrganization: Organization | OrganizationStruct }) {
|
|
55
|
+
// Validate VAT rates for this customer
|
|
56
|
+
const seller = this.getDefaultCompanyForOrganization(sellingOrganization);
|
|
57
|
+
|
|
58
|
+
if (seller.VATNumber && seller.address && company) {
|
|
59
|
+
// B2B validation
|
|
60
|
+
// No address -> we guess the same country as the seller (least risk of not applying VAT when it is required)
|
|
61
|
+
// Reverse charged vat applicable?
|
|
62
|
+
if ((company.address && company.address.country !== seller.address.country) && company.VATNumber && !company.VATNumber.trim().startsWith(seller.address.country)) {
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
static getVATExcemptType({ type }: { type: 'services' | 'goods' }) {
|
|
71
|
+
if (type === 'services') {
|
|
72
|
+
return VATExcemptReason.IntraCommunityServices;
|
|
73
|
+
}
|
|
74
|
+
return VATExcemptReason.IntraCommunityGoods;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
static getVATExcempt({ company, sellingOrganization, type }: { company: Company | null | undefined; sellingOrganization: Organization | OrganizationStruct; type: 'services' | 'goods' }) {
|
|
78
|
+
// Reverse charged vat applicable?
|
|
79
|
+
if (this.isVATExcempt({ company, sellingOrganization })) {
|
|
80
|
+
return this.getVATExcemptType({ type });
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
@@ -35,8 +35,7 @@ export class PassholderEndpoints {
|
|
|
35
35
|
headers: this.getHeaders(),
|
|
36
36
|
signal: AbortSignal.timeout(10000),
|
|
37
37
|
});
|
|
38
|
-
}
|
|
39
|
-
catch (error) {
|
|
38
|
+
} catch (error) {
|
|
40
39
|
if (isTimeout(error)) {
|
|
41
40
|
throw new SimpleError({
|
|
42
41
|
statusCode: 408,
|
|
@@ -60,8 +59,7 @@ export class PassholderEndpoints {
|
|
|
60
59
|
try {
|
|
61
60
|
const json = await handleUitpasResponse(response);
|
|
62
61
|
return jsonToGetPassResponse(json);
|
|
63
|
-
}
|
|
64
|
-
catch (e) {
|
|
62
|
+
} catch (e) {
|
|
65
63
|
if (isSimpleError(e) || isSimpleErrors(e)) {
|
|
66
64
|
if (e.hasCode('https://api.publiq.be/probs/uitpas/pass-not-found')) {
|
|
67
65
|
throw new SimpleError({
|
|
@@ -168,8 +166,7 @@ function assertValidGetPassResponse(json: unknown): asserts json is GetPassRespo
|
|
|
168
166
|
}
|
|
169
167
|
});
|
|
170
168
|
}
|
|
171
|
-
}
|
|
172
|
-
catch (error) {
|
|
169
|
+
} catch (error) {
|
|
173
170
|
console.error('Invalid response when retrieving pass by UiTPAS number:', json);
|
|
174
171
|
throw new SimpleError({
|
|
175
172
|
code: 'invalid_response_retrieving_pass_by_uitpas_number',
|
|
@@ -12,9 +12,9 @@ import { checkPermissionsFor } from './checkPermissionsFor.js';
|
|
|
12
12
|
import { checkUitpasNumbers } from './checkUitpasNumbers.js';
|
|
13
13
|
import { getSocialTariffForEvent } from './getSocialTariffForEvent.js';
|
|
14
14
|
import { getSocialTariffForUitpasNumbers } from './getSocialTariffForUitpasNumbers.js';
|
|
15
|
-
import type { GetPassResponse} from './PassholderEndpoints.js';
|
|
15
|
+
import type { GetPassResponse } from './PassholderEndpoints.js';
|
|
16
16
|
import { PassholderEndpoints } from './PassholderEndpoints.js';
|
|
17
|
-
import type { RegisterTicketSaleRequest, RegisterTicketSaleResponse} from './registerTicketSales.js';
|
|
17
|
+
import type { RegisterTicketSaleRequest, RegisterTicketSaleResponse } from './registerTicketSales.js';
|
|
18
18
|
import { registerTicketSales } from './registerTicketSales.js';
|
|
19
19
|
import { searchUitpasEvents } from './searchUitpasEvents.js';
|
|
20
20
|
import { searchUitpasOrganizers } from './searchUitpasOrganizers.js';
|
|
@@ -202,8 +202,7 @@ export class UitpasService {
|
|
|
202
202
|
}
|
|
203
203
|
try {
|
|
204
204
|
newlyRegistered = await registerTicketSales(access_token, toBeRegisteredUitpasRequests);
|
|
205
|
-
}
|
|
206
|
-
catch (e) {
|
|
205
|
+
} catch (e) {
|
|
207
206
|
console.error('Failed to register UiTPAS ticket sales', e);
|
|
208
207
|
}
|
|
209
208
|
}
|
|
@@ -269,8 +268,7 @@ export class UitpasService {
|
|
|
269
268
|
}
|
|
270
269
|
}
|
|
271
270
|
}
|
|
272
|
-
}
|
|
273
|
-
catch (e) {
|
|
271
|
+
} catch (e) {
|
|
274
272
|
console.error('Failed to update UiTPAS-numbers after order update', e);
|
|
275
273
|
}
|
|
276
274
|
});
|
|
@@ -353,8 +351,7 @@ export class UitpasService {
|
|
|
353
351
|
let access_token!: string;
|
|
354
352
|
try {
|
|
355
353
|
access_token = await UitpasTokenRepository.getAccessTokenFor(); // use platform credentials
|
|
356
|
-
}
|
|
357
|
-
catch (e) {
|
|
354
|
+
} catch (e) {
|
|
358
355
|
if (isSimpleError(e) && e.hasCode('uitpas_api_not_configured_for_platform')) {
|
|
359
356
|
console.error('UiTPAS API has not been configured for this platform, so defaulting to an unknown status for number ', uitpasNumber);
|
|
360
357
|
// Ignore and return status of unknown
|
|
@@ -444,8 +441,7 @@ export class UitpasService {
|
|
|
444
441
|
});
|
|
445
442
|
}
|
|
446
443
|
}
|
|
447
|
-
}
|
|
448
|
-
else {
|
|
444
|
+
} else {
|
|
449
445
|
// non-official flow
|
|
450
446
|
access_token_platform = access_token_platform ?? await UitpasTokenRepository.getAccessTokenFor();
|
|
451
447
|
await checkUitpasNumbers(access_token_platform, item.uitpasNumbers.map(p => p.uitpasNumber));
|
|
@@ -39,14 +39,12 @@ export async function checkUitpasNumbers(access_token: string, uitpasNumbers: st
|
|
|
39
39
|
),
|
|
40
40
|
});
|
|
41
41
|
}
|
|
42
|
-
}
|
|
43
|
-
catch (e) {
|
|
42
|
+
} catch (e) {
|
|
44
43
|
if (isSimpleError(e) || isSimpleErrors(e)) {
|
|
45
44
|
e.addNamespace(i.toString());
|
|
46
45
|
e.addNamespace('uitpasNumbers');
|
|
47
46
|
simpleErrors.addError(e);
|
|
48
|
-
}
|
|
49
|
-
else {
|
|
47
|
+
} else {
|
|
50
48
|
throw e;
|
|
51
49
|
}
|
|
52
50
|
}
|
|
@@ -90,8 +90,7 @@ async function getSocialTariffForUitpasNumber(access_token: string, uitpasNumber
|
|
|
90
90
|
|
|
91
91
|
if (json) {
|
|
92
92
|
console.error(`UiTPAS API returned an error for UiTPAS number ${uitpasNumber} with event id ${eventId}:`, json);
|
|
93
|
-
}
|
|
94
|
-
else {
|
|
93
|
+
} else {
|
|
95
94
|
console.error(`UiTPAS API returned an error for UiTPAS number ${uitpasNumber} with event id ${eventId}:`, response.statusText);
|
|
96
95
|
}
|
|
97
96
|
|
|
@@ -168,14 +167,12 @@ export async function getSocialTariffForUitpasNumbers(access_token: string, uitp
|
|
|
168
167
|
const uitpasNumber = uitpasNumbers[i];
|
|
169
168
|
try {
|
|
170
169
|
reducedPrices[i] = await getSocialTariffForUitpasNumber(access_token, uitpasNumber, basePrice, uitpasEventUrl);
|
|
171
|
-
}
|
|
172
|
-
catch (e) {
|
|
170
|
+
} catch (e) {
|
|
173
171
|
if (isSimpleError(e) || isSimpleErrors(e)) {
|
|
174
172
|
e.addNamespace(i.toString());
|
|
175
173
|
e.addNamespace('uitpasNumbers');
|
|
176
174
|
simpleErrors.addError(e);
|
|
177
|
-
}
|
|
178
|
-
else {
|
|
175
|
+
} else {
|
|
179
176
|
throw e;
|
|
180
177
|
}
|
|
181
178
|
}
|
|
@@ -124,8 +124,7 @@ export async function searchUitpasEvents(clientId: string, uitpasOrganizerId: st
|
|
|
124
124
|
const hasNl = entrs.find(([key]) => key === 'nl');
|
|
125
125
|
if (hasNl) {
|
|
126
126
|
event.location = locationName.nl;
|
|
127
|
-
}
|
|
128
|
-
else {
|
|
127
|
+
} else {
|
|
129
128
|
const lang = entrs[0];
|
|
130
129
|
event.location = lang ? lang[1] : '';
|
|
131
130
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { SQLFilterDefinitions} from '@stamhoofd/sql';
|
|
1
|
+
import type { SQLFilterDefinitions } from '@stamhoofd/sql';
|
|
2
2
|
import { baseSQLFilterCompilers, createColumnFilter, SQL, SQLValueType } from '@stamhoofd/sql';
|
|
3
3
|
|
|
4
4
|
export const auditLogFilterCompilers: SQLFilterDefinitions = {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { SQLFilterDefinitions} from '@stamhoofd/sql';
|
|
1
|
+
import type { SQLFilterDefinitions } from '@stamhoofd/sql';
|
|
2
2
|
import { baseSQLFilterCompilers, createColumnFilter, SQL, SQLValueType } from '@stamhoofd/sql';
|
|
3
3
|
|
|
4
4
|
export const balanceItemPaymentsCompilers: SQLFilterDefinitions = {
|
|
@@ -1,43 +1,15 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import type { SQLFilterDefinitions} from '@stamhoofd/sql';
|
|
1
|
+
import type { SQLFilterDefinitions } from '@stamhoofd/sql';
|
|
3
2
|
import { baseSQLFilterCompilers, createColumnFilter, createExistsFilter, createJoinedRelationFilter, SQL, SQLIfNull, SQLValueType } from '@stamhoofd/sql';
|
|
4
|
-
import type { StamhoofdFilter} from '@stamhoofd/structures';
|
|
5
|
-
import {
|
|
3
|
+
import type { StamhoofdFilter } from '@stamhoofd/structures';
|
|
4
|
+
import { PermissionLevel } from '@stamhoofd/structures';
|
|
6
5
|
import { Context } from '../helpers/Context.js';
|
|
7
6
|
import { memberCachedBalanceForOrganizationJoin, registrationCachedBalanceJoin } from '../helpers/outstandingBalanceJoin.js';
|
|
8
7
|
import { SQLTranslatedString } from '../helpers/SQLTranslatedString.js';
|
|
8
|
+
import { StamhoofdFilterAccessHelper } from '../helpers/StamhoofdFilterAccessHelper.js';
|
|
9
9
|
import { organizationFilterCompilers } from './organizations.js';
|
|
10
10
|
|
|
11
11
|
async function checkGroupIdFilterAccess(filter: StamhoofdFilter, permissionLevel: PermissionLevel) {
|
|
12
|
-
const groupIds =
|
|
13
|
-
? [filter]
|
|
14
|
-
: unwrapFilter(filter as StamhoofdFilter, {
|
|
15
|
-
$in: FilterWrapperMarker,
|
|
16
|
-
})?.markerValue;
|
|
17
|
-
|
|
18
|
-
if (!Array.isArray(groupIds)) {
|
|
19
|
-
throw new SimpleError({
|
|
20
|
-
code: 'invalid_field',
|
|
21
|
-
field: 'filter',
|
|
22
|
-
message: 'You must filter on a group of the organization you are trying to access',
|
|
23
|
-
human: $t(`%1HG`),
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
if (groupIds.length === 0) {
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
for (const groupId of groupIds) {
|
|
32
|
-
if (typeof groupId !== 'string') {
|
|
33
|
-
throw new SimpleError({
|
|
34
|
-
code: 'invalid_field',
|
|
35
|
-
field: 'filter',
|
|
36
|
-
message: 'Invalid group ID in filter',
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
12
|
+
const groupIds = StamhoofdFilterAccessHelper.getGroupIdsFromFilter(filter);
|
|
41
13
|
const groups = await Context.auth.getGroups(groupIds as string[]);
|
|
42
14
|
|
|
43
15
|
console.log('Filtering registrations on groups', groups.map(g => g.settings.name.toString()));
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { SQLFilterDefinitions} from '@stamhoofd/sql';
|
|
1
|
+
import type { SQLFilterDefinitions } from '@stamhoofd/sql';
|
|
2
2
|
import { baseSQLFilterCompilers, createColumnFilter, SQL, SQLValueType } from '@stamhoofd/sql';
|
|
3
3
|
|
|
4
4
|
export const documentTemplateFilterCompilers: SQLFilterDefinitions = {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { SQLFilterDefinitions} from '@stamhoofd/sql';
|
|
1
|
+
import type { SQLFilterDefinitions } from '@stamhoofd/sql';
|
|
2
2
|
import { baseSQLFilterCompilers, createColumnFilter, SQL, SQLValueType } from '@stamhoofd/sql';
|
|
3
3
|
|
|
4
4
|
export const documentFilterCompilers: SQLFilterDefinitions = {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { SQLFilterDefinitions} from '@stamhoofd/sql';
|
|
1
|
+
import type { SQLFilterDefinitions } from '@stamhoofd/sql';
|
|
2
2
|
import { baseSQLFilterCompilers, createColumnFilter, SQL, SQLConcat, SQLScalar, SQLValueType } from '@stamhoofd/sql';
|
|
3
3
|
|
|
4
4
|
export const emailRecipientsFilterCompilers: SQLFilterDefinitions = {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { SQLFilterDefinitions} from '@stamhoofd/sql';
|
|
1
|
+
import type { SQLFilterDefinitions } from '@stamhoofd/sql';
|
|
2
2
|
import { baseSQLFilterCompilers, createColumnFilter, createExistsFilter, SQL, SQLValueType } from '@stamhoofd/sql';
|
|
3
3
|
import { emailRecipientsFilterCompilers } from './email-recipients.js';
|
|
4
4
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { SQLFilterDefinitions} from '@stamhoofd/sql';
|
|
1
|
+
import type { SQLFilterDefinitions } from '@stamhoofd/sql';
|
|
2
2
|
import { baseSQLFilterCompilers, createColumnFilter, createJoinedRelationFilter, createExistsFilter, SQL, SQLValueType } from '@stamhoofd/sql';
|
|
3
3
|
import { eventFilterCompilers } from './events.js';
|
|
4
4
|
import { organizationFilterCompilers } from './organizations.js';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { SQLFilterDefinitions} from '@stamhoofd/sql';
|
|
1
|
+
import type { SQLFilterDefinitions } from '@stamhoofd/sql';
|
|
2
2
|
import { baseSQLFilterCompilers, createColumnFilter, createExistsFilter, SQL, SQLValueType } from '@stamhoofd/sql';
|
|
3
3
|
|
|
4
4
|
export const eventFilterCompilers: SQLFilterDefinitions = {
|
|
@@ -107,6 +107,11 @@ export const eventFilterCompilers: SQLFilterDefinitions = {
|
|
|
107
107
|
type: SQLValueType.JSONNumber,
|
|
108
108
|
nullable: true,
|
|
109
109
|
}),
|
|
110
|
+
periodId: createColumnFilter({
|
|
111
|
+
expression: SQL.column('periodId'),
|
|
112
|
+
type: SQLValueType.String,
|
|
113
|
+
nullable: false,
|
|
114
|
+
}),
|
|
110
115
|
},
|
|
111
116
|
),
|
|
112
117
|
'webshop': createExistsFilter(
|
|
@@ -44,6 +44,11 @@ export const groupFilterCompilers: SQLFilterDefinitions = {
|
|
|
44
44
|
type: SQLValueType.String,
|
|
45
45
|
nullable: true,
|
|
46
46
|
}),
|
|
47
|
+
deletedAt: createColumnFilter({
|
|
48
|
+
expression: SQL.column('deletedAt'),
|
|
49
|
+
type: SQLValueType.Datetime,
|
|
50
|
+
nullable: true,
|
|
51
|
+
}),
|
|
47
52
|
bundleDiscounts: createWildcardColumnFilter(
|
|
48
53
|
(key: string) => ({
|
|
49
54
|
expression: SQL.jsonExtract(SQL.column('settings'), `$.value.prices[*].bundleDiscounts.${SQLJsonExtract.escapePathComponent(key)}`, true),
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { SQLFilterDefinitions} from '@stamhoofd/sql';
|
|
1
|
+
import type { SQLFilterDefinitions } from '@stamhoofd/sql';
|
|
2
2
|
import { baseSQLFilterCompilers, createColumnFilter, SQL, SQLValueType } from '@stamhoofd/sql';
|
|
3
3
|
|
|
4
4
|
export const invoicedBalanceItemCompilers: SQLFilterDefinitions = {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { SQLFilterDefinitions} from '@stamhoofd/sql';
|
|
1
|
+
import type { SQLFilterDefinitions } from '@stamhoofd/sql';
|
|
2
2
|
import { baseSQLFilterCompilers, createColumnFilter, createExistsFilter, SQL, SQLCast, SQLConcat, SQLJsonUnquote, SQLScalar, SQLValueType } from '@stamhoofd/sql';
|
|
3
3
|
import { invoicedBalanceItemCompilers } from './invoiced-balance-items.js';
|
|
4
4
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { MemberResponsibilityRecord } from '@stamhoofd/models';
|
|
2
|
-
import type { SQLFilterDefinitions} from '@stamhoofd/sql';
|
|
2
|
+
import type { SQLFilterDefinitions } from '@stamhoofd/sql';
|
|
3
3
|
import { baseSQLFilterCompilers, createColumnFilter, SQL, SQLValueType } from '@stamhoofd/sql';
|
|
4
4
|
|
|
5
5
|
const baseTable = SQL.table(MemberResponsibilityRecord.table);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { SimpleError } from '@simonbackx/simple-errors';
|
|
2
2
|
import { Email, Member, MemberUser } from '@stamhoofd/models';
|
|
3
|
-
import type { SQLFilterDefinitions} from '@stamhoofd/sql';
|
|
3
|
+
import type { SQLFilterDefinitions } from '@stamhoofd/sql';
|
|
4
4
|
import { baseSQLFilterCompilers, createColumnFilter, createExistsFilter, createWildcardColumnFilter, SQL, SQLAge, SQLCast, SQLConcat, SQLJsonExtract, SQLScalar, SQLValueType } from '@stamhoofd/sql';
|
|
5
5
|
import { AccessRight } from '@stamhoofd/structures';
|
|
6
6
|
import { Context } from '../helpers/Context.js';
|
|
@@ -121,7 +121,7 @@ export const orderFilterCompilers: SQLFilterDefinitions = {
|
|
|
121
121
|
expression: SQL.jsonExtract(SQL.column('data'), '$.value.discountCodes[*].code'),
|
|
122
122
|
type: SQLValueType.JSONArray,
|
|
123
123
|
nullable: true,
|
|
124
|
-
})
|
|
124
|
+
}),
|
|
125
125
|
},
|
|
126
126
|
items: createExistsFilter(
|
|
127
127
|
/**
|
|
@@ -230,14 +230,14 @@ export const orderFilterCompilers: SQLFilterDefinitions = {
|
|
|
230
230
|
).where(
|
|
231
231
|
SQL.column('balance_items', 'id'),
|
|
232
232
|
SQL.column('balance_item_payments', 'balanceItemId'),
|
|
233
|
-
)
|
|
233
|
+
),
|
|
234
234
|
)
|
|
235
235
|
.join(
|
|
236
236
|
SQL.join(
|
|
237
237
|
SQL.table('payments'),
|
|
238
238
|
).where(
|
|
239
239
|
SQL.column('payments', 'id'),
|
|
240
|
-
SQL.column('balance_item_payments', 'paymentId')
|
|
240
|
+
SQL.column('balance_item_payments', 'paymentId'),
|
|
241
241
|
),
|
|
242
242
|
)
|
|
243
243
|
.where(
|
|
@@ -247,7 +247,7 @@ export const orderFilterCompilers: SQLFilterDefinitions = {
|
|
|
247
247
|
// payments on structure filter away failed payments -> also filter out failed payments in backend
|
|
248
248
|
.whereNot(
|
|
249
249
|
SQL.column('payments', 'status'),
|
|
250
|
-
PaymentStatus.Failed
|
|
250
|
+
PaymentStatus.Failed,
|
|
251
251
|
),
|
|
252
252
|
{
|
|
253
253
|
...baseSQLFilterCompilers,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { SQLFilterDefinitions} from '@stamhoofd/sql';
|
|
1
|
+
import type { SQLFilterDefinitions } from '@stamhoofd/sql';
|
|
2
2
|
import { baseSQLFilterCompilers, createColumnFilter, SQL, SQLValueType } from '@stamhoofd/sql';
|
|
3
3
|
|
|
4
4
|
export const organizationRegistrationPeriodFilterCompilers: SQLFilterDefinitions = {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { SQLFilterDefinitions} from '@stamhoofd/sql';
|
|
1
|
+
import type { SQLFilterDefinitions } from '@stamhoofd/sql';
|
|
2
2
|
import { baseSQLFilterCompilers, createColumnFilter, createExistsFilter, SQL, SQLConcat, SQLNow, SQLNull, SQLScalar, SQLValueType, SQLWhereEqual, SQLWhereOr, SQLWhereSign } from '@stamhoofd/sql';
|
|
3
3
|
import { SetupStepType } from '@stamhoofd/structures';
|
|
4
4
|
|
|
@@ -58,7 +58,7 @@ export const platformMembershipFilterCompilers: SQLFilterDefinitions = {
|
|
|
58
58
|
SQL.column('organizations', 'id'),
|
|
59
59
|
SQL.column(MemberPlatformMembership.table, 'organizationId'),
|
|
60
60
|
),
|
|
61
|
-
organizationFilterCompilers
|
|
61
|
+
organizationFilterCompilers,
|
|
62
62
|
),
|
|
63
63
|
member: createExistsFilter(
|
|
64
64
|
SQL.select()
|
|
@@ -67,6 +67,6 @@ export const platformMembershipFilterCompilers: SQLFilterDefinitions = {
|
|
|
67
67
|
SQL.column('members', 'id'),
|
|
68
68
|
SQL.column(MemberPlatformMembership.table, 'memberId'),
|
|
69
69
|
),
|
|
70
|
-
memberFilterCompilers
|
|
71
|
-
)
|
|
70
|
+
memberFilterCompilers,
|
|
71
|
+
),
|
|
72
72
|
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { SQLFilterDefinitions} from '@stamhoofd/sql';
|
|
1
|
+
import type { SQLFilterDefinitions } from '@stamhoofd/sql';
|
|
2
2
|
import { baseSQLFilterCompilers, createColumnFilter, createExistsFilter, SQL, SQLConcat, SQLValueType, SQLScalar } from '@stamhoofd/sql';
|
|
3
3
|
import { memberFilterCompilers } from './members.js';
|
|
4
4
|
import { organizationFilterCompilers } from './organizations.js';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { SQLFilterDefinitions} from '@stamhoofd/sql';
|
|
1
|
+
import type { SQLFilterDefinitions } from '@stamhoofd/sql';
|
|
2
2
|
import { baseSQLFilterCompilers, createColumnFilter, SQL, SQLValueType } from '@stamhoofd/sql';
|
|
3
3
|
|
|
4
4
|
export const registrationPeriodFilterCompilers: SQLFilterDefinitions = {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Group, Member, Organization, Registration } from '@stamhoofd/models';
|
|
2
|
-
import type { SQLFilterDefinitions} from '@stamhoofd/sql';
|
|
2
|
+
import type { SQLFilterDefinitions } from '@stamhoofd/sql';
|
|
3
3
|
import { baseSQLFilterCompilers, createColumnFilter, createJoinedRelationFilter, SQL, SQLValueType } from '@stamhoofd/sql';
|
|
4
4
|
import { SQLTranslatedString } from '../helpers/SQLTranslatedString.js';
|
|
5
5
|
import { baseRegistrationFilterCompilers } from './base-registration-filter-compilers.js';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { SQLFilterDefinitions} from '@stamhoofd/sql';
|
|
1
|
+
import type { SQLFilterDefinitions } from '@stamhoofd/sql';
|
|
2
2
|
import { baseSQLFilterCompilers, createColumnFilter, SQL, SQLValueType } from '@stamhoofd/sql';
|
|
3
3
|
|
|
4
4
|
export const ticketFilterCompilers: SQLFilterDefinitions = {
|
package/src/sql-filters/users.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { SQLFilterDefinitions} from '@stamhoofd/sql';
|
|
1
|
+
import type { SQLFilterDefinitions } from '@stamhoofd/sql';
|
|
2
2
|
import { baseSQLFilterCompilers, createColumnFilter, SQL, SQLValueType } from '@stamhoofd/sql';
|
|
3
3
|
|
|
4
4
|
export const userFilterCompilers: SQLFilterDefinitions = {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Group } from '@stamhoofd/models';
|
|
2
2
|
import type { SQLOrderByDirection, SQLSortDefinitions } from '@stamhoofd/sql';
|
|
3
3
|
import { SQL, SQLOrderBy } from '@stamhoofd/sql';
|
|
4
|
+
import { SQLTranslatedString } from '../helpers/SQLTranslatedString.js';
|
|
4
5
|
|
|
5
6
|
export const groupSorters: SQLSortDefinitions<Group> = {
|
|
6
7
|
// WARNING! TEST NEW SORTERS THOROUGHLY!
|
|
@@ -22,4 +23,26 @@ export const groupSorters: SQLSortDefinitions<Group> = {
|
|
|
22
23
|
});
|
|
23
24
|
},
|
|
24
25
|
},
|
|
26
|
+
periodId: {
|
|
27
|
+
getValue(a) {
|
|
28
|
+
return a.periodId;
|
|
29
|
+
},
|
|
30
|
+
toSQL: (direction: SQLOrderByDirection): SQLOrderBy => {
|
|
31
|
+
return new SQLOrderBy({
|
|
32
|
+
column: SQL.column('periodId'),
|
|
33
|
+
direction,
|
|
34
|
+
});
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
name: {
|
|
38
|
+
getValue(a) {
|
|
39
|
+
return a.settings.name.toString();
|
|
40
|
+
},
|
|
41
|
+
toSQL: (direction: SQLOrderByDirection): SQLOrderBy => {
|
|
42
|
+
return new SQLOrderBy({
|
|
43
|
+
column: new SQLTranslatedString(SQL.column('settings'), '$.value.name'),
|
|
44
|
+
direction,
|
|
45
|
+
});
|
|
46
|
+
},
|
|
47
|
+
},
|
|
25
48
|
};
|
|
@@ -4,10 +4,10 @@ import { SQL, SQLOrderBy } from '@stamhoofd/sql';
|
|
|
4
4
|
import type { PlatformMembership } from '@stamhoofd/structures';
|
|
5
5
|
|
|
6
6
|
type KeysOfType<T, V> = {
|
|
7
|
-
|
|
7
|
+
[K in keyof T]: T[K] extends V ? K : never
|
|
8
8
|
}[keyof T];
|
|
9
9
|
|
|
10
|
-
const columnsToFilterOn: (KeysOfType<PlatformMembership, PlainObject | Date>)[] = ['id','startDate','endDate','membershipTypeId', 'price', 'createdAt', 'trialUntil', 'freeAmount'];
|
|
10
|
+
const columnsToFilterOn: (KeysOfType<PlatformMembership, PlainObject | Date>)[] = ['id', 'startDate', 'endDate', 'membershipTypeId', 'price', 'createdAt', 'trialUntil', 'freeAmount'];
|
|
11
11
|
|
|
12
12
|
export const platformMembershipSorters: SQLSortDefinitions<PlatformMembership> = {
|
|
13
13
|
// WARNING! TEST NEW SORTERS THOROUGHLY!
|
|
@@ -17,24 +17,24 @@ export const platformMembershipSorters: SQLSortDefinitions<PlatformMembership> =
|
|
|
17
17
|
// Why? Because ORDER BY firstName, lastName produces a different order dan ORDER BY CONCAT(firstName, ' ', lastName) if there are multiple people with spaces in the first name
|
|
18
18
|
// And that again causes issues with pagination because the next query will append a filter of name > 'John Doe' - causing duplicate and/or skipped results
|
|
19
19
|
// What if you need mapping? simply map the sorters in the frontend: name -> firstname, lastname, age -> birthDay, etc.
|
|
20
|
-
...Object.fromEntries(columnsToFilterOn.map((column: KeysOfType<PlatformMembership, PlainObject | Date>) => [column, createColumnSortDefinition(column)]))
|
|
20
|
+
...Object.fromEntries(columnsToFilterOn.map((column: KeysOfType<PlatformMembership, PlainObject | Date>) => [column, createColumnSortDefinition(column)])),
|
|
21
21
|
};
|
|
22
22
|
|
|
23
23
|
/**
|
|
24
24
|
* Create a basic sort definition from a column
|
|
25
|
-
* @param column
|
|
26
|
-
* @returns
|
|
25
|
+
* @param column
|
|
26
|
+
* @returns
|
|
27
27
|
*/
|
|
28
|
-
function createColumnSortDefinition<K extends KeysOfType<PlatformMembership, PlainObject | Date>>(column: K): SQLSortDefinition<PlatformMembership, PlatformMembership[K]>{
|
|
28
|
+
function createColumnSortDefinition<K extends KeysOfType<PlatformMembership, PlainObject | Date>>(column: K): SQLSortDefinition<PlatformMembership, PlatformMembership[K]> {
|
|
29
29
|
return {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
}
|
|
30
|
+
getValue(a: PlatformMembership) {
|
|
31
|
+
return a[column];
|
|
32
|
+
},
|
|
33
|
+
toSQL: (direction: SQLOrderByDirection): SQLOrderBy => {
|
|
34
|
+
return new SQLOrderBy({
|
|
35
|
+
column: SQL.column(column),
|
|
36
|
+
direction,
|
|
37
|
+
});
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
40
|
}
|
|
@@ -11,7 +11,7 @@ export const registrationInvitationSorters: SQLSortDefinitions<RegistrationInvit
|
|
|
11
11
|
// And that again causes issues with pagination because the next query will append a filter of name > 'John Doe' - causing duplicate and/or skipped results
|
|
12
12
|
// What if you need mapping? simply map the sorters in the frontend: name -> firstname, lastname, age -> birthDay, etc.
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
id: {
|
|
15
15
|
getValue(invitation) {
|
|
16
16
|
return invitation.id;
|
|
17
17
|
},
|
|
@@ -22,7 +22,7 @@ export const registrationInvitationSorters: SQLSortDefinitions<RegistrationInvit
|
|
|
22
22
|
});
|
|
23
23
|
},
|
|
24
24
|
},
|
|
25
|
-
|
|
25
|
+
createdAt: {
|
|
26
26
|
getValue(invitation) {
|
|
27
27
|
return invitation.createdAt;
|
|
28
28
|
},
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AutoEncoderPatchType} from '@simonbackx/simple-encoding';
|
|
1
|
+
import type { AutoEncoderPatchType } from '@simonbackx/simple-encoding';
|
|
2
2
|
import { PatchableArray } from '@simonbackx/simple-encoding';
|
|
3
3
|
import { Request } from '@simonbackx/simple-endpoints';
|
|
4
4
|
import type { Organization } from '@stamhoofd/models';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AutoEncoderPatchType} from '@simonbackx/simple-encoding';
|
|
1
|
+
import type { AutoEncoderPatchType } from '@simonbackx/simple-encoding';
|
|
2
2
|
import { PatchableArray } from '@simonbackx/simple-encoding';
|
|
3
3
|
import { Request } from '@simonbackx/simple-endpoints';
|
|
4
4
|
import type { Organization, User } from '@stamhoofd/models';
|