@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,73 @@
|
|
|
1
|
+
import { Request } from '@simonbackx/simple-endpoints';
|
|
2
|
+
import { BalanceItem, OrganizationFactory, RegisterCodeFactory, Token, UserFactory } from '@stamhoofd/models';
|
|
3
|
+
import { PermissionLevel, Permissions } from '@stamhoofd/structures';
|
|
4
|
+
|
|
5
|
+
import { testServer } from '../../../../../tests/helpers/TestServer.js';
|
|
6
|
+
import { ApplyRegisterCodeEndpoint } from './ApplyRegisterCodeEndpoint.js';
|
|
7
|
+
import { initMembershipOrganization } from '../../../../../tests/init/initMembershipOrganization.js';
|
|
8
|
+
|
|
9
|
+
describe('Endpoint.ApplyRegisterCodeEndpoint', () => {
|
|
10
|
+
// Test endpoint
|
|
11
|
+
const endpoint = new ApplyRegisterCodeEndpoint();
|
|
12
|
+
|
|
13
|
+
beforeAll(async () => {
|
|
14
|
+
await initMembershipOrganization();
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
test('Cannot apply a register code if not platform admin', async () => {
|
|
18
|
+
const otherOrganization = await new OrganizationFactory({}).create();
|
|
19
|
+
const code = await new RegisterCodeFactory({ organization: otherOrganization }).create();
|
|
20
|
+
|
|
21
|
+
const organization = await new OrganizationFactory({}).create();
|
|
22
|
+
const user = await new UserFactory({ organization, permissions: Permissions.create({ level: PermissionLevel.Full }) }).create();
|
|
23
|
+
const token = await Token.createToken(user);
|
|
24
|
+
|
|
25
|
+
const r = Request.buildJson(
|
|
26
|
+
'POST',
|
|
27
|
+
'/billing/register-code',
|
|
28
|
+
organization.getApiHost(),
|
|
29
|
+
{
|
|
30
|
+
registerCode: code.code,
|
|
31
|
+
},
|
|
32
|
+
);
|
|
33
|
+
r.headers.authorization = 'Bearer ' + token.accessToken;
|
|
34
|
+
|
|
35
|
+
await expect(testServer.test(endpoint, r)).rejects.toThrow('You do not have permissions for this action');
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
test('Can apply a register code and apply the discount', async () => {
|
|
39
|
+
const otherOrganization = await new OrganizationFactory({}).create();
|
|
40
|
+
const code = await new RegisterCodeFactory({ organization: otherOrganization }).create();
|
|
41
|
+
|
|
42
|
+
const organization = await new OrganizationFactory({}).create();
|
|
43
|
+
const user = await new UserFactory({
|
|
44
|
+
organization,
|
|
45
|
+
globalPermissions: Permissions.create({ level: PermissionLevel.Full }),
|
|
46
|
+
email: 'admin@stamhoofd.be',
|
|
47
|
+
}).create();
|
|
48
|
+
const token = await Token.createToken(user);
|
|
49
|
+
|
|
50
|
+
const r = Request.buildJson(
|
|
51
|
+
'POST',
|
|
52
|
+
'/billing/register-code',
|
|
53
|
+
organization.getApiHost(),
|
|
54
|
+
{
|
|
55
|
+
registerCode: code.code,
|
|
56
|
+
},
|
|
57
|
+
);
|
|
58
|
+
r.headers.authorization = 'Bearer ' + token.accessToken;
|
|
59
|
+
|
|
60
|
+
const response = await testServer.test(endpoint, r);
|
|
61
|
+
expect(response.body).toBeUndefined();
|
|
62
|
+
|
|
63
|
+
// Check if this organization has an open register code
|
|
64
|
+
const credits = await BalanceItem.select().where('payingOrganizationId', organization.id).fetch();
|
|
65
|
+
expect(credits.length).toBe(1);
|
|
66
|
+
expect(credits[0].unitPrice).toBe(-code.value);
|
|
67
|
+
|
|
68
|
+
// Other not yet applied because no package bought yet
|
|
69
|
+
// Check if other organization has an open register code
|
|
70
|
+
const otherCredits = await BalanceItem.select().where('payingOrganizationId', otherOrganization.id).fetch();
|
|
71
|
+
expect(otherCredits.length).toBe(0);
|
|
72
|
+
});
|
|
73
|
+
});
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import type { Decoder } from '@simonbackx/simple-encoding';
|
|
2
|
+
import { AutoEncoder, field, StringDecoder } from '@simonbackx/simple-encoding';
|
|
3
|
+
import type { DecodedRequest, Request } from '@simonbackx/simple-endpoints';
|
|
4
|
+
import { Endpoint, Response } from '@simonbackx/simple-endpoints';
|
|
5
|
+
import { Email } from '@stamhoofd/email';
|
|
6
|
+
import { RegisterCode, UsedRegisterCode } from '@stamhoofd/models';
|
|
7
|
+
|
|
8
|
+
import { Context } from '../../../../helpers/Context.js';
|
|
9
|
+
import { ReferralService } from '../../../../services/ReferralService.js';
|
|
10
|
+
|
|
11
|
+
type Params = Record<string, never>;
|
|
12
|
+
type Query = undefined;
|
|
13
|
+
type ResponseBody = undefined;
|
|
14
|
+
|
|
15
|
+
class Body extends AutoEncoder {
|
|
16
|
+
@field({ decoder: StringDecoder })
|
|
17
|
+
registerCode: string;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* One endpoint to create, patch and delete groups. Usefull because on organization setup, we need to create multiple groups at once. Also, sometimes we need to link values and update multiple groups at once
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
export class ApplyRegisterCodeEndpoint extends Endpoint<Params, Query, Body, ResponseBody> {
|
|
25
|
+
bodyDecoder = Body as Decoder<Body>;
|
|
26
|
+
|
|
27
|
+
protected doesMatch(request: Request): [true, Params] | [false] {
|
|
28
|
+
if (request.method !== 'POST') {
|
|
29
|
+
return [false];
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const params = Endpoint.parseParameters(request.url, '/billing/register-code', {});
|
|
33
|
+
|
|
34
|
+
if (params) {
|
|
35
|
+
return [true, params as Params];
|
|
36
|
+
}
|
|
37
|
+
return [false];
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
async handle(request: DecodedRequest<Params, Query, Body>) {
|
|
41
|
+
const organization = await Context.setOrganizationScope();
|
|
42
|
+
await Context.authenticate();
|
|
43
|
+
|
|
44
|
+
if (!Context.auth.hasPlatformFullAccess()) {
|
|
45
|
+
throw Context.auth.error();
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
let code = request.body.registerCode;
|
|
49
|
+
|
|
50
|
+
if (code.startsWith('https:')) {
|
|
51
|
+
try {
|
|
52
|
+
const url = new URL(code);
|
|
53
|
+
const codeParam = url.searchParams.get('code');
|
|
54
|
+
if (codeParam) {
|
|
55
|
+
console.log('Parsed code from URL', codeParam);
|
|
56
|
+
code = codeParam;
|
|
57
|
+
}
|
|
58
|
+
} catch (e) {
|
|
59
|
+
console.error('Tried parsing code as URL but failed', code);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const { models, emails } = await ReferralService.markUsed(organization, code);
|
|
64
|
+
|
|
65
|
+
for (const model of models) {
|
|
66
|
+
await model.save();
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
for (const email of emails) {
|
|
70
|
+
Email.send({
|
|
71
|
+
...email,
|
|
72
|
+
from: Email.getQuickFromEmail(organization.address.country),
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (organization.meta.packages.isPaid) {
|
|
77
|
+
// Already bought something: apply credit to other organization immediately
|
|
78
|
+
const code = await UsedRegisterCode.getFor(organization.id);
|
|
79
|
+
if (code && !code.balanceItemId) {
|
|
80
|
+
console.log('Rewarding code ' + code.id + ' for payment');
|
|
81
|
+
|
|
82
|
+
// Deze code werd nog niet beloond
|
|
83
|
+
await ReferralService.reward(code);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return new Response(undefined);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
@@ -52,11 +52,7 @@ export class DeactivatePackageEndpoint extends Endpoint<Params, Query, Body, Res
|
|
|
52
52
|
});
|
|
53
53
|
}
|
|
54
54
|
|
|
55
|
-
|
|
56
|
-
pack.removeAt = new Date();
|
|
57
|
-
pack.removeAt.setTime(pack.removeAt.getTime() - 5_000);
|
|
58
|
-
await pack.save();
|
|
59
|
-
|
|
55
|
+
await STPackageService.deactivatePackage(pack);
|
|
60
56
|
await STPackageService.updateOrganizationPackages(organization.id);
|
|
61
57
|
|
|
62
58
|
return new Response(undefined);
|
|
@@ -5,10 +5,10 @@ import { Organization } from '@stamhoofd/models';
|
|
|
5
5
|
import { Context } from '../../../../helpers/Context.js';
|
|
6
6
|
import { PaymentMandateService } from '../../../../services/PaymentMandateService.js';
|
|
7
7
|
|
|
8
|
-
type Params = { id: string
|
|
8
|
+
type Params = { id: string; sellingOrganizationId: string };
|
|
9
9
|
type Query = undefined;
|
|
10
10
|
type Body = undefined;
|
|
11
|
-
type ResponseBody = undefined
|
|
11
|
+
type ResponseBody = undefined;
|
|
12
12
|
|
|
13
13
|
export class DeleteOrganizationMandateEndpoint extends Endpoint<Params, Query, Body, ResponseBody> {
|
|
14
14
|
protected doesMatch(request: Request): [true, Params] | [false] {
|
|
@@ -16,7 +16,7 @@ export class DeleteOrganizationMandateEndpoint extends Endpoint<Params, Query, B
|
|
|
16
16
|
return [false];
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
const params = Endpoint.parseParameters(request.url, '/billing/@sellingOrganizationId/mandates/@id', {sellingOrganizationId: String, id: String});
|
|
19
|
+
const params = Endpoint.parseParameters(request.url, '/billing/@sellingOrganizationId/mandates/@id', { sellingOrganizationId: String, id: String });
|
|
20
20
|
|
|
21
21
|
if (params) {
|
|
22
22
|
return [true, params as Params];
|
|
@@ -28,15 +28,15 @@ export class DeleteOrganizationMandateEndpoint extends Endpoint<Params, Query, B
|
|
|
28
28
|
const payingOrganization = await Context.setOrganizationScope();
|
|
29
29
|
const { user } = await Context.authenticate();
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
const id = request.params.sellingOrganizationId;
|
|
32
32
|
if (!id) {
|
|
33
33
|
throw new SimpleError({
|
|
34
34
|
code: 'unavailable',
|
|
35
35
|
message: 'This is temporarily unavailable',
|
|
36
|
-
human: $t('%1Rz')
|
|
37
|
-
})
|
|
36
|
+
human: $t('%1Rz'),
|
|
37
|
+
});
|
|
38
38
|
}
|
|
39
|
-
|
|
39
|
+
|
|
40
40
|
const sellingOrganization = await Organization.getByID(id);
|
|
41
41
|
if (!sellingOrganization || !sellingOrganization.active) {
|
|
42
42
|
throw new SimpleError({
|
|
@@ -44,16 +44,16 @@ export class DeleteOrganizationMandateEndpoint extends Endpoint<Params, Query, B
|
|
|
44
44
|
code: 'not_found',
|
|
45
45
|
message: 'Selling organization not found',
|
|
46
46
|
human: $t('%1R5'),
|
|
47
|
-
field: 'sellingOrganization'
|
|
48
|
-
})
|
|
47
|
+
field: 'sellingOrganization',
|
|
48
|
+
});
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
await PaymentMandateService.deleteMandate({
|
|
52
52
|
mandateId: request.params.id,
|
|
53
53
|
sellingOrganization,
|
|
54
54
|
user,
|
|
55
|
-
payingOrganization
|
|
56
|
-
})
|
|
55
|
+
payingOrganization,
|
|
56
|
+
});
|
|
57
57
|
|
|
58
58
|
const r = new Response(undefined);
|
|
59
59
|
r.status = 201;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { DecodedRequest, Request} from '@simonbackx/simple-endpoints';
|
|
1
|
+
import type { DecodedRequest, Request } from '@simonbackx/simple-endpoints';
|
|
2
2
|
import { Endpoint, Response } from '@simonbackx/simple-endpoints';
|
|
3
|
-
import type { DetailedPayableBalanceCollection} from '@stamhoofd/structures';
|
|
3
|
+
import type { DetailedPayableBalanceCollection } from '@stamhoofd/structures';
|
|
4
4
|
import { PaymentStatus } from '@stamhoofd/structures';
|
|
5
5
|
|
|
6
6
|
import { BalanceItem, Payment } from '@stamhoofd/models';
|
|
@@ -13,12 +13,12 @@ type Query = undefined;
|
|
|
13
13
|
type ResponseBody = DetailedPayableBalance;
|
|
14
14
|
type Body = undefined;
|
|
15
15
|
|
|
16
|
-
export class
|
|
16
|
+
export class GetOrganizationDetailedPayableBalanceEndpoint extends Endpoint<Params, Query, Body, ResponseBody> {
|
|
17
17
|
protected doesMatch(request: Request): [true, Params] | [false] {
|
|
18
18
|
if (request.method !== 'GET') {
|
|
19
19
|
return [false];
|
|
20
20
|
}
|
|
21
|
-
const params = Endpoint.parseParameters(request.url, '/billing/@sellingOrganizationId/payable-balance', {sellingOrganizationId: String});
|
|
21
|
+
const params = Endpoint.parseParameters(request.url, '/billing/@sellingOrganizationId/payable-balance', { sellingOrganizationId: String });
|
|
22
22
|
|
|
23
23
|
if (params) {
|
|
24
24
|
return [true, params as Params];
|
|
@@ -40,10 +40,10 @@ export class GetOrganizationDetailedPayableBalancendpoint extends Endpoint<Param
|
|
|
40
40
|
throw new SimpleError({
|
|
41
41
|
code: 'unavailable',
|
|
42
42
|
message: 'This is temporarily unavailable',
|
|
43
|
-
human: $t('%1Rz')
|
|
44
|
-
})
|
|
43
|
+
human: $t('%1Rz'),
|
|
44
|
+
});
|
|
45
45
|
}
|
|
46
|
-
|
|
46
|
+
|
|
47
47
|
const sellingOrganization = await Organization.getByID(id);
|
|
48
48
|
if (!sellingOrganization || !sellingOrganization.active) {
|
|
49
49
|
throw new SimpleError({
|
|
@@ -51,8 +51,8 @@ export class GetOrganizationDetailedPayableBalancendpoint extends Endpoint<Param
|
|
|
51
51
|
code: 'not_found',
|
|
52
52
|
message: 'Selling organization not found',
|
|
53
53
|
human: $t('%1R5'),
|
|
54
|
-
field: 'sellingOrganization'
|
|
55
|
-
})
|
|
54
|
+
field: 'sellingOrganization',
|
|
55
|
+
});
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
const balanceItemModels = await BalanceItem.balanceItemsForOrganization(organization.id, request.params.sellingOrganizationId);
|
|
@@ -66,7 +66,7 @@ export class GetOrganizationDetailedPayableBalancendpoint extends Endpoint<Param
|
|
|
66
66
|
.fetch();
|
|
67
67
|
|
|
68
68
|
const balanceItems = await BalanceItem.getStructureWithPayments(balanceItemModels);
|
|
69
|
-
const payments = await AuthenticatedStructures.
|
|
69
|
+
const payments = await AuthenticatedStructures.payments(paymentModels);
|
|
70
70
|
|
|
71
71
|
const balance = DetailedPayableBalance.create({
|
|
72
72
|
organization: await AuthenticatedStructures.organization(sellingOrganization),
|
|
@@ -21,7 +21,7 @@ export class GetOrganizationMandatesEndpoint extends Endpoint<Params, Query, Bod
|
|
|
21
21
|
return [false];
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
const params = Endpoint.parseParameters(request.url, '/billing/@sellingOrganizationId/mandates', {sellingOrganizationId: String});
|
|
24
|
+
const params = Endpoint.parseParameters(request.url, '/billing/@sellingOrganizationId/mandates', { sellingOrganizationId: String });
|
|
25
25
|
|
|
26
26
|
if (params) {
|
|
27
27
|
return [true, params as Params];
|
|
@@ -38,10 +38,10 @@ export class GetOrganizationMandatesEndpoint extends Endpoint<Params, Query, Bod
|
|
|
38
38
|
throw new SimpleError({
|
|
39
39
|
code: 'unavailable',
|
|
40
40
|
message: 'This is temporarily unavailable',
|
|
41
|
-
human: $t('%1Rz')
|
|
42
|
-
})
|
|
41
|
+
human: $t('%1Rz'),
|
|
42
|
+
});
|
|
43
43
|
}
|
|
44
|
-
|
|
44
|
+
|
|
45
45
|
const sellingOrganization = await Organization.getByID(id);
|
|
46
46
|
if (!sellingOrganization || !sellingOrganization.active) {
|
|
47
47
|
throw new SimpleError({
|
|
@@ -49,16 +49,16 @@ export class GetOrganizationMandatesEndpoint extends Endpoint<Params, Query, Bod
|
|
|
49
49
|
code: 'not_found',
|
|
50
50
|
message: 'Selling organization not found',
|
|
51
51
|
human: $t('%1R5'),
|
|
52
|
-
field: 'sellingOrganization'
|
|
53
|
-
})
|
|
52
|
+
field: 'sellingOrganization',
|
|
53
|
+
});
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
const mandates = await PaymentMandateService.getMandates({
|
|
57
57
|
sellingOrganization,
|
|
58
58
|
user,
|
|
59
|
-
payingOrganization
|
|
60
|
-
})
|
|
59
|
+
payingOrganization,
|
|
60
|
+
});
|
|
61
61
|
|
|
62
|
-
|
|
62
|
+
return new Response(PaymentMandateService.groupByMandate(mandates).mandates);
|
|
63
63
|
}
|
|
64
64
|
}
|
package/src/endpoints/organization/dashboard/billing/GetOrganizationPayableBalanceEndpoint.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { DecodedRequest, Request} from '@simonbackx/simple-endpoints';
|
|
1
|
+
import type { DecodedRequest, Request } from '@simonbackx/simple-endpoints';
|
|
2
2
|
import { Endpoint, Response } from '@simonbackx/simple-endpoints';
|
|
3
|
-
import type { PayableBalanceCollection} from '@stamhoofd/structures';
|
|
3
|
+
import type { PayableBalanceCollection } from '@stamhoofd/structures';
|
|
4
4
|
import { ReceivableBalanceType } from '@stamhoofd/structures';
|
|
5
5
|
|
|
6
6
|
import { Context } from '../../../../helpers/Context.js';
|
package/src/endpoints/organization/dashboard/billing/GetOrganizationPayableInvoicesEndpoint.ts
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { DecodedRequest, Request } from '@simonbackx/simple-endpoints';
|
|
2
|
+
import { Endpoint, Response } from '@simonbackx/simple-endpoints';
|
|
3
|
+
import type { Invoice as InvoiceStruct } from '@stamhoofd/structures';
|
|
4
|
+
import { DetailedPayableBalance, PaymentStatus } from '@stamhoofd/structures';
|
|
5
|
+
|
|
6
|
+
import { SimpleError } from '@simonbackx/simple-errors';
|
|
7
|
+
import { BalanceItem, Invoice, Organization, Payment } from '@stamhoofd/models';
|
|
8
|
+
import { SQL } from '@stamhoofd/sql';
|
|
9
|
+
import { AuthenticatedStructures } from '../../../../helpers/AuthenticatedStructures.js';
|
|
10
|
+
import { Context } from '../../../../helpers/Context.js';
|
|
11
|
+
|
|
12
|
+
type Params = { sellingOrganizationId: string };
|
|
13
|
+
type Query = undefined;
|
|
14
|
+
type ResponseBody = InvoiceStruct[];
|
|
15
|
+
type Body = undefined;
|
|
16
|
+
|
|
17
|
+
export class GetOrganizationPayableInvoicesEndpoint extends Endpoint<Params, Query, Body, ResponseBody> {
|
|
18
|
+
protected doesMatch(request: Request): [true, Params] | [false] {
|
|
19
|
+
if (request.method !== 'GET') {
|
|
20
|
+
return [false];
|
|
21
|
+
}
|
|
22
|
+
const params = Endpoint.parseParameters(request.url, '/billing/@sellingOrganizationId/invoices', { sellingOrganizationId: String });
|
|
23
|
+
|
|
24
|
+
if (params) {
|
|
25
|
+
return [true, params as Params];
|
|
26
|
+
}
|
|
27
|
+
return [false];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
async handle(request: DecodedRequest<Params, Query, Body>) {
|
|
31
|
+
const organization = await Context.setOrganizationScope();
|
|
32
|
+
await Context.authenticate();
|
|
33
|
+
|
|
34
|
+
// If the user has permission, we'll also search if he has access to the organization's key
|
|
35
|
+
if (!await Context.auth.canManageFinances(organization.id)) {
|
|
36
|
+
throw Context.auth.error();
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const id = request.params.sellingOrganizationId;
|
|
40
|
+
if (!id) {
|
|
41
|
+
throw new SimpleError({
|
|
42
|
+
code: 'unavailable',
|
|
43
|
+
message: 'This is temporarily unavailable',
|
|
44
|
+
human: $t('%1Rz'),
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const sellingOrganization = await Organization.getByID(id);
|
|
49
|
+
if (!sellingOrganization || !sellingOrganization.active) {
|
|
50
|
+
throw new SimpleError({
|
|
51
|
+
statusCode: 404,
|
|
52
|
+
code: 'not_found',
|
|
53
|
+
message: 'Selling organization not found',
|
|
54
|
+
human: $t('%1R5'),
|
|
55
|
+
field: 'sellingOrganization',
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const invoices = await Invoice.select()
|
|
60
|
+
.where('payingOrganizationId', organization.id)
|
|
61
|
+
.where('organizationId', sellingOrganization.id)
|
|
62
|
+
.where('number', '!=', null)
|
|
63
|
+
.orderBy('invoicedAt', 'DESC')
|
|
64
|
+
.fetch();
|
|
65
|
+
|
|
66
|
+
return new Response(await AuthenticatedStructures.invoices(invoices));
|
|
67
|
+
}
|
|
68
|
+
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import type { DecodedRequest, Request} from '@simonbackx/simple-endpoints';
|
|
1
|
+
import type { DecodedRequest, Request } from '@simonbackx/simple-endpoints';
|
|
2
2
|
import { Endpoint, Response } from '@simonbackx/simple-endpoints';
|
|
3
3
|
import { OrganizationPackagesStatus, STPackage as STPackageStruct } from '@stamhoofd/structures';
|
|
4
4
|
import { Context } from '../../../../helpers/Context.js';
|
|
5
5
|
import { STPackageService } from '../../../../services/STPackageService.js';
|
|
6
|
-
import type { Decoder} from '@simonbackx/simple-encoding';
|
|
6
|
+
import type { Decoder } from '@simonbackx/simple-encoding';
|
|
7
7
|
import { AutoEncoder, BooleanDecoder, field } from '@simonbackx/simple-encoding';
|
|
8
8
|
|
|
9
9
|
type Params = Record<string, never>;
|
|
@@ -17,7 +17,7 @@ type Body = undefined;
|
|
|
17
17
|
|
|
18
18
|
export class GetPackagesEndpoint extends Endpoint<Params, Query, Body, ResponseBody> {
|
|
19
19
|
queryDecoder = Query as Decoder<Query>;
|
|
20
|
-
|
|
20
|
+
|
|
21
21
|
protected doesMatch(request: Request): [true, Params] | [false] {
|
|
22
22
|
if (request.method !== 'GET') {
|
|
23
23
|
return [false];
|
|
@@ -31,7 +31,7 @@ export class GetPackagesEndpoint extends Endpoint<Params, Query, Body, ResponseB
|
|
|
31
31
|
return [false];
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
async handle({query}: DecodedRequest<Params, Query, Body>) {
|
|
34
|
+
async handle({ query }: DecodedRequest<Params, Query, Body>) {
|
|
35
35
|
const organization = await Context.setOrganizationScope();
|
|
36
36
|
await Context.authenticate();
|
|
37
37
|
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { DecodedRequest, Request } from '@simonbackx/simple-endpoints';
|
|
2
|
+
import { Endpoint, Response } from '@simonbackx/simple-endpoints';
|
|
3
|
+
import { BalanceItem, Organization, RegisterCode, UsedRegisterCode } from '@stamhoofd/models';
|
|
4
|
+
import { RegisterCodeStatus, UsedRegisterCode as UsedRegisterCodeStruct } from '@stamhoofd/structures';
|
|
5
|
+
|
|
6
|
+
import { Context } from '../../../../helpers/Context.js';
|
|
7
|
+
|
|
8
|
+
type Params = Record<string, never>;
|
|
9
|
+
type Query = undefined;
|
|
10
|
+
type Body = undefined;
|
|
11
|
+
type ResponseBody = RegisterCodeStatus;
|
|
12
|
+
|
|
13
|
+
export class GetRegisterCodeEndpoint extends Endpoint<Params, Query, Body, ResponseBody> {
|
|
14
|
+
protected doesMatch(request: Request): [true, Params] | [false] {
|
|
15
|
+
if (request.method !== 'GET') {
|
|
16
|
+
return [false];
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const params = Endpoint.parseParameters(request.url, '/billing/register-code', {});
|
|
20
|
+
|
|
21
|
+
if (params) {
|
|
22
|
+
return [true, params as Params];
|
|
23
|
+
}
|
|
24
|
+
return [false];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
async handle(_: DecodedRequest<Params, Query, Body>) {
|
|
28
|
+
const organization = await Context.setOrganizationScope();
|
|
29
|
+
await Context.authenticate();
|
|
30
|
+
|
|
31
|
+
if (!await Context.auth.hasSomeAccess(organization.id)) {
|
|
32
|
+
throw Context.auth.error();
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const codes = await RegisterCode.where({ organizationId: organization.id });
|
|
36
|
+
let code = codes[0];
|
|
37
|
+
|
|
38
|
+
if (codes.length === 0) {
|
|
39
|
+
code = new RegisterCode();
|
|
40
|
+
code.organizationId = organization.id;
|
|
41
|
+
code.description = 'Doorverwezen door ' + organization.name;
|
|
42
|
+
code.value = 25_00_00;
|
|
43
|
+
await code.generateCode();
|
|
44
|
+
await code.save();
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const usedCodes = await UsedRegisterCode.getAll(code.code);
|
|
48
|
+
const allOrganizations = await Organization.getByIDs(...usedCodes.flatMap(u => u.organizationId ? [u.organizationId] : []));
|
|
49
|
+
const allBalances = await BalanceItem.getByIDs(...usedCodes.flatMap(u => u.balanceItemId ? [u.balanceItemId] : []));
|
|
50
|
+
|
|
51
|
+
return new Response(RegisterCodeStatus.create({
|
|
52
|
+
code: code.code,
|
|
53
|
+
value: code.value,
|
|
54
|
+
invoiceValue: code.invoiceValue,
|
|
55
|
+
usedCodes: usedCodes.map((c) => {
|
|
56
|
+
const creditValue = (c.balanceItemId ? (allBalances.find(credit => credit.id === c.balanceItemId)?.priceWithoutVAT) : null) ?? null;
|
|
57
|
+
return UsedRegisterCodeStruct.create({
|
|
58
|
+
id: c.id,
|
|
59
|
+
organizationName: allOrganizations.find(o => o.id === c.organizationId)?.name ?? 'Onbekend',
|
|
60
|
+
createdAt: c.createdAt,
|
|
61
|
+
creditValue: creditValue !== null ? -creditValue : null,
|
|
62
|
+
});
|
|
63
|
+
}),
|
|
64
|
+
}));
|
|
65
|
+
}
|
|
66
|
+
}
|