@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
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Mandate
|
|
1
|
+
import type { Mandate, Payment as MolliePaymentType } from '@mollie/api-client';
|
|
2
2
|
import { ApiMode, createMollieClient, MandateMethod, MandateStatus, PaymentMethod as molliePaymentMethod, PaymentStatus as molliePaymentStatus, OnboardingStatus, ProfileStatus, SequenceType } from '@mollie/api-client';
|
|
3
3
|
import { SimpleError } from '@simonbackx/simple-errors';
|
|
4
4
|
import type { Payment, User } from '@stamhoofd/models';
|
|
@@ -14,24 +14,24 @@ import { Context } from '../helpers/Context.js';
|
|
|
14
14
|
export class MollieService {
|
|
15
15
|
client: ReturnType<typeof createMollieClient>;
|
|
16
16
|
sellingOrganization: Organization;
|
|
17
|
-
createdAt: Date
|
|
17
|
+
createdAt: Date;
|
|
18
18
|
|
|
19
|
-
private constructor({sellingOrganization, accessToken}: {sellingOrganization: Organization
|
|
20
|
-
this.sellingOrganization = sellingOrganization
|
|
19
|
+
private constructor({ sellingOrganization, accessToken }: { sellingOrganization: Organization; accessToken: string }) {
|
|
20
|
+
this.sellingOrganization = sellingOrganization;
|
|
21
21
|
this.client = createMollieClient({ accessToken });
|
|
22
|
-
this.createdAt = new Date()
|
|
22
|
+
this.createdAt = new Date();
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
static #cachedServices: Map<string, MollieService> = new Map()
|
|
25
|
+
static #cachedServices: Map<string, MollieService> = new Map();
|
|
26
26
|
|
|
27
27
|
/**
|
|
28
28
|
* Cached instances can be used for maximum 30 seconds
|
|
29
29
|
*/
|
|
30
30
|
isOutdated() {
|
|
31
|
-
return this.createdAt.getTime() < Date.now() - 30_000
|
|
31
|
+
return this.createdAt.getTime() < Date.now() - 30_000;
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
static async create({sellingOrganization}: {sellingOrganization: Organization}) {
|
|
34
|
+
static async create({ sellingOrganization }: { sellingOrganization: Organization }) {
|
|
35
35
|
const cached = this.#cachedServices.get(sellingOrganization.id);
|
|
36
36
|
if (cached && !cached.isOutdated()) {
|
|
37
37
|
return cached;
|
|
@@ -39,7 +39,7 @@ export class MollieService {
|
|
|
39
39
|
const token = await MollieToken.getTokenFor(sellingOrganization.id);
|
|
40
40
|
if (!token) {
|
|
41
41
|
if (cached) {
|
|
42
|
-
this.#cachedServices.delete(sellingOrganization.id)
|
|
42
|
+
this.#cachedServices.delete(sellingOrganization.id);
|
|
43
43
|
}
|
|
44
44
|
return null;
|
|
45
45
|
}
|
|
@@ -47,7 +47,7 @@ export class MollieService {
|
|
|
47
47
|
this.#cachedServices.set(sellingOrganization.id, service);
|
|
48
48
|
return service;
|
|
49
49
|
}
|
|
50
|
-
|
|
50
|
+
|
|
51
51
|
/**
|
|
52
52
|
* Set initial onboarding values + enable bancontact
|
|
53
53
|
*/
|
|
@@ -74,27 +74,27 @@ export class MollieService {
|
|
|
74
74
|
description: $t(`%x1`),
|
|
75
75
|
categoryCode: 8398,
|
|
76
76
|
},
|
|
77
|
-
})
|
|
77
|
+
});
|
|
78
78
|
} catch (e) {
|
|
79
79
|
console.error('Failed to submit onboarding data', e);
|
|
80
80
|
}
|
|
81
81
|
}
|
|
82
82
|
}
|
|
83
83
|
|
|
84
|
-
#verifiedCustomerIds: Set<string> = new Set()
|
|
84
|
+
#verifiedCustomerIds: Set<string> = new Set();
|
|
85
85
|
|
|
86
86
|
/**
|
|
87
87
|
* Gets the customer id for a given payingOrganization or user.
|
|
88
88
|
* If no customer exists, it will create a new mollie customer if customer (payment customer) is set as parameter
|
|
89
89
|
*/
|
|
90
|
-
async getCustomerId({ payingOrganization, user, customer }: {
|
|
91
|
-
payingOrganization: Organization | null
|
|
92
|
-
user: User | null
|
|
90
|
+
async getCustomerId({ payingOrganization, user, customer }: {
|
|
91
|
+
payingOrganization: Organization | null;
|
|
92
|
+
user: User | null;
|
|
93
93
|
|
|
94
94
|
/**
|
|
95
95
|
* Required to be able to create a new customer
|
|
96
96
|
*/
|
|
97
|
-
customer?: PaymentCustomer
|
|
97
|
+
customer?: PaymentCustomer;
|
|
98
98
|
}): Promise<string | null> {
|
|
99
99
|
if (!payingOrganization) {
|
|
100
100
|
// Not yet supported for users
|
|
@@ -106,23 +106,22 @@ export class MollieService {
|
|
|
106
106
|
return null;
|
|
107
107
|
}
|
|
108
108
|
|
|
109
|
-
|
|
110
109
|
if (payingOrganization.serverMeta.mollieCustomerId) {
|
|
111
|
-
const customerId = payingOrganization.serverMeta.mollieCustomerId
|
|
110
|
+
const customerId = payingOrganization.serverMeta.mollieCustomerId;
|
|
112
111
|
if (this.#verifiedCustomerIds.has(customerId)) {
|
|
113
112
|
return customerId;
|
|
114
113
|
}
|
|
115
114
|
|
|
116
115
|
// check still valid
|
|
117
116
|
try {
|
|
118
|
-
const c = await this.client.customers.get(customerId, {testmode: this.testMode});
|
|
117
|
+
const c = await this.client.customers.get(customerId, { testmode: this.testMode });
|
|
119
118
|
|
|
120
119
|
if ((c.mode === ApiMode.test) === this.testMode) {
|
|
121
120
|
this.#verifiedCustomerIds.add(customerId);
|
|
122
121
|
return customerId;
|
|
123
122
|
}
|
|
124
123
|
} catch (e) {
|
|
125
|
-
console.error('Error getting customer', e)
|
|
124
|
+
console.error('Error getting customer', e);
|
|
126
125
|
// Customer is not valid anymore, we need to create a new one
|
|
127
126
|
}
|
|
128
127
|
}
|
|
@@ -140,93 +139,93 @@ export class MollieService {
|
|
|
140
139
|
organizationId: payingOrganization.id,
|
|
141
140
|
userId: user?.id,
|
|
142
141
|
},
|
|
143
|
-
testmode: this.testMode
|
|
144
|
-
})
|
|
142
|
+
testmode: this.testMode,
|
|
143
|
+
});
|
|
145
144
|
|
|
146
|
-
const customerId = mollieCustomer.id
|
|
145
|
+
const customerId = mollieCustomer.id;
|
|
147
146
|
this.#verifiedCustomerIds.add(customerId);
|
|
148
147
|
|
|
149
|
-
payingOrganization.serverMeta.mollieCustomerId = mollieCustomer.id
|
|
150
|
-
console.log('Saving new mollie customer', mollieCustomer, 'for organization', payingOrganization.id)
|
|
151
|
-
await payingOrganization.save()
|
|
152
|
-
|
|
153
|
-
return customerId
|
|
148
|
+
payingOrganization.serverMeta.mollieCustomerId = mollieCustomer.id;
|
|
149
|
+
console.log('Saving new mollie customer', mollieCustomer, 'for organization', payingOrganization.id);
|
|
150
|
+
await payingOrganization.save();
|
|
151
|
+
|
|
152
|
+
return customerId;
|
|
154
153
|
}
|
|
155
154
|
|
|
156
|
-
#cachedMandates: Map<string, PaymentMandate[]> = new Map()
|
|
155
|
+
#cachedMandates: Map<string, PaymentMandate[]> = new Map();
|
|
157
156
|
|
|
158
|
-
async getMandates({ payingOrganization, user }: {
|
|
159
|
-
payingOrganization: Organization | null
|
|
160
|
-
user: User | null
|
|
157
|
+
async getMandates({ payingOrganization, user }: {
|
|
158
|
+
payingOrganization: Organization | null;
|
|
159
|
+
user: User | null;
|
|
161
160
|
}): Promise<PaymentMandate[]> {
|
|
162
|
-
const customerId = await this.getCustomerId({payingOrganization, user});
|
|
161
|
+
const customerId = await this.getCustomerId({ payingOrganization, user });
|
|
163
162
|
if (!customerId) {
|
|
164
163
|
return [];
|
|
165
164
|
}
|
|
166
165
|
|
|
167
166
|
const cached = this.#cachedMandates.get(customerId);
|
|
168
167
|
if (cached) {
|
|
169
|
-
//return cached;
|
|
168
|
+
// return cached;
|
|
170
169
|
}
|
|
171
170
|
|
|
172
171
|
// Poll mollie status
|
|
173
172
|
// Mollie payment is required
|
|
174
|
-
const mandates: PaymentMandate[] = []
|
|
173
|
+
const mandates: PaymentMandate[] = [];
|
|
175
174
|
|
|
176
175
|
try {
|
|
177
|
-
const m = await this.client.customerMandates.page({
|
|
178
|
-
customerId,
|
|
176
|
+
const m = await this.client.customerMandates.page({
|
|
177
|
+
customerId,
|
|
179
178
|
limit: 250,
|
|
180
|
-
testmode: this.testMode
|
|
181
|
-
})
|
|
179
|
+
testmode: this.testMode,
|
|
180
|
+
});
|
|
182
181
|
|
|
183
182
|
for (const mandate of m) {
|
|
184
|
-
const paymentMandate = MollieService.mollieManateToStamhoofd({mandate, payingOrganization, user});
|
|
183
|
+
const paymentMandate = MollieService.mollieManateToStamhoofd({ mandate, payingOrganization, user });
|
|
185
184
|
if (paymentMandate) {
|
|
186
|
-
mandates.push(paymentMandate)
|
|
185
|
+
mandates.push(paymentMandate);
|
|
187
186
|
}
|
|
188
187
|
}
|
|
189
188
|
} catch (e) {
|
|
190
|
-
console.error(e)
|
|
189
|
+
console.error(e);
|
|
191
190
|
}
|
|
192
191
|
|
|
193
192
|
// todo: remove duplicate mandates?
|
|
194
193
|
return mandates;
|
|
195
194
|
}
|
|
196
195
|
|
|
197
|
-
async deleteMandate({ mandateId, payingOrganization, user }: {
|
|
198
|
-
mandateId: string
|
|
199
|
-
payingOrganization: Organization | null
|
|
200
|
-
user: User | null
|
|
196
|
+
async deleteMandate({ mandateId, payingOrganization, user }: {
|
|
197
|
+
mandateId: string;
|
|
198
|
+
payingOrganization: Organization | null;
|
|
199
|
+
user: User | null;
|
|
201
200
|
}) {
|
|
202
|
-
const customerId = await this.getCustomerId({payingOrganization, user});
|
|
201
|
+
const customerId = await this.getCustomerId({ payingOrganization, user });
|
|
203
202
|
if (!customerId) {
|
|
204
|
-
return
|
|
203
|
+
return;
|
|
205
204
|
}
|
|
206
205
|
|
|
207
206
|
await this.client.customerMandates.revoke(
|
|
208
207
|
mandateId,
|
|
209
208
|
{
|
|
210
209
|
customerId,
|
|
211
|
-
testmode: this.testMode
|
|
212
|
-
}
|
|
213
|
-
)
|
|
210
|
+
testmode: this.testMode,
|
|
211
|
+
},
|
|
212
|
+
);
|
|
214
213
|
}
|
|
215
214
|
|
|
216
|
-
private static mollieManateToStamhoofd({ mandate, payingOrganization, user }: {
|
|
217
|
-
mandate: Mandate
|
|
218
|
-
payingOrganization: Organization | null
|
|
219
|
-
user: User | null
|
|
215
|
+
private static mollieManateToStamhoofd({ mandate, payingOrganization, user }: {
|
|
216
|
+
mandate: Mandate;
|
|
217
|
+
payingOrganization: Organization | null;
|
|
218
|
+
user: User | null;
|
|
220
219
|
}): PaymentMandate | null {
|
|
221
220
|
let type: PaymentMandateType;
|
|
222
221
|
switch (mandate.method) {
|
|
223
222
|
case MandateMethod.creditcard: {
|
|
224
|
-
type = PaymentMandateType.CreditCard
|
|
223
|
+
type = PaymentMandateType.CreditCard;
|
|
225
224
|
break;
|
|
226
225
|
}
|
|
227
226
|
|
|
228
227
|
case MandateMethod.directdebit: {
|
|
229
|
-
type = PaymentMandateType.DirectDebit
|
|
228
|
+
type = PaymentMandateType.DirectDebit;
|
|
230
229
|
break;
|
|
231
230
|
}
|
|
232
231
|
|
|
@@ -254,22 +253,22 @@ export class MollieService {
|
|
|
254
253
|
cardNumber: 'cardNumber' in details ? details.cardNumber : null,
|
|
255
254
|
iban: 'consumerAccount' in details ? details.consumerAccount : null,
|
|
256
255
|
bic: ('consumerBic' in details ? details.consumerBic : undefined),
|
|
257
|
-
expiryDate: ('cardExpiryDate' in details ? DateTime.fromISO(details.cardExpiryDate, {zone: Formatter.timezone}).toJSDate() : null), // todo: parse date correctly in Brussels timezone!
|
|
256
|
+
expiryDate: ('cardExpiryDate' in details ? DateTime.fromISO(details.cardExpiryDate, { zone: Formatter.timezone }).toJSDate() : null), // todo: parse date correctly in Brussels timezone!
|
|
258
257
|
brand: ('cardLabel' in details ? details.cardLabel : null),
|
|
259
|
-
})
|
|
260
|
-
})
|
|
258
|
+
}),
|
|
259
|
+
});
|
|
261
260
|
}
|
|
262
261
|
|
|
263
262
|
private static mollieMandateStatusToStamhoofd(mandate: Mandate): PaymentMandateStatus {
|
|
264
263
|
switch (mandate.status) {
|
|
265
264
|
case MandateStatus.valid: {
|
|
266
|
-
return PaymentMandateStatus.Valid
|
|
265
|
+
return PaymentMandateStatus.Valid;
|
|
267
266
|
}
|
|
268
267
|
case MandateStatus.invalid: {
|
|
269
|
-
return PaymentMandateStatus.Invalid
|
|
268
|
+
return PaymentMandateStatus.Invalid;
|
|
270
269
|
}
|
|
271
270
|
case MandateStatus.pending: {
|
|
272
|
-
return PaymentMandateStatus.Pending
|
|
271
|
+
return PaymentMandateStatus.Pending;
|
|
273
272
|
}
|
|
274
273
|
}
|
|
275
274
|
}
|
|
@@ -277,15 +276,15 @@ export class MollieService {
|
|
|
277
276
|
private static paymentMethodToMollie(method: PaymentMethod) {
|
|
278
277
|
switch (method) {
|
|
279
278
|
case PaymentMethod.Bancontact:
|
|
280
|
-
return molliePaymentMethod.bancontact
|
|
279
|
+
return molliePaymentMethod.bancontact;
|
|
281
280
|
case PaymentMethod.CreditCard:
|
|
282
|
-
return molliePaymentMethod.creditcard
|
|
281
|
+
return molliePaymentMethod.creditcard;
|
|
283
282
|
case PaymentMethod.DirectDebit:
|
|
284
|
-
return molliePaymentMethod.directdebit
|
|
283
|
+
return molliePaymentMethod.directdebit;
|
|
285
284
|
case PaymentMethod.iDEAL:
|
|
286
|
-
return molliePaymentMethod.ideal
|
|
285
|
+
return molliePaymentMethod.ideal;
|
|
287
286
|
case PaymentMethod.Transfer:
|
|
288
|
-
return molliePaymentMethod.banktransfer
|
|
287
|
+
return molliePaymentMethod.banktransfer;
|
|
289
288
|
}
|
|
290
289
|
|
|
291
290
|
return null;
|
|
@@ -294,15 +293,14 @@ export class MollieService {
|
|
|
294
293
|
async getProfiles(): Promise<MollieProfile[]> {
|
|
295
294
|
try {
|
|
296
295
|
const response = await this.client.profiles.page({
|
|
297
|
-
limit: 250
|
|
298
|
-
})
|
|
296
|
+
limit: 250,
|
|
297
|
+
});
|
|
299
298
|
return response.map(p => MollieProfile.create({
|
|
300
299
|
...p,
|
|
301
300
|
mode: p.mode === ApiMode.live ? MollieProfileMode.Live : MollieProfileMode.Test,
|
|
302
|
-
status: p.status === ProfileStatus.unverified ? MollieProfileStatus.Unverified : (p.status === ProfileStatus.blocked ? MollieProfileStatus.Blocked : MollieProfileStatus.Verified)
|
|
301
|
+
status: p.status === ProfileStatus.unverified ? MollieProfileStatus.Unverified : (p.status === ProfileStatus.blocked ? MollieProfileStatus.Blocked : MollieProfileStatus.Verified),
|
|
303
302
|
}));
|
|
304
|
-
}
|
|
305
|
-
catch (e) {
|
|
303
|
+
} catch (e) {
|
|
306
304
|
console.error('Failed to parse mollie profiles', e);
|
|
307
305
|
return [];
|
|
308
306
|
}
|
|
@@ -316,8 +314,7 @@ export class MollieService {
|
|
|
316
314
|
canReceiveSettlements: !!response.canReceiveSettlements,
|
|
317
315
|
status: response.status === OnboardingStatus.needsData ? MollieStatus.NeedsData : (response.status === OnboardingStatus.inReview ? MollieStatus.InReview : (MollieStatus.Completed)),
|
|
318
316
|
});
|
|
319
|
-
}
|
|
320
|
-
catch (e) {
|
|
317
|
+
} catch (e) {
|
|
321
318
|
console.error('Error when requesting Mollie onboarding status:');
|
|
322
319
|
console.error(e);
|
|
323
320
|
return null;
|
|
@@ -326,13 +323,13 @@ export class MollieService {
|
|
|
326
323
|
|
|
327
324
|
async getProfileId(website?: string): Promise<string | undefined> {
|
|
328
325
|
if (this.sellingOrganization.privateMeta.mollieProfile?.id) {
|
|
329
|
-
return this.sellingOrganization.privateMeta.mollieProfile.id
|
|
326
|
+
return this.sellingOrganization.privateMeta.mollieProfile.id;
|
|
330
327
|
}
|
|
331
328
|
|
|
332
329
|
try {
|
|
333
330
|
const profiles = await this.client.profiles.page({
|
|
334
331
|
limit: 250,
|
|
335
|
-
})
|
|
332
|
+
});
|
|
336
333
|
|
|
337
334
|
// Search profile with Stamhoofd as name
|
|
338
335
|
if (website) {
|
|
@@ -351,8 +348,7 @@ export class MollieService {
|
|
|
351
348
|
}
|
|
352
349
|
|
|
353
350
|
return profiles[0]?.id ?? undefined;
|
|
354
|
-
}
|
|
355
|
-
catch (e) {
|
|
351
|
+
} catch (e) {
|
|
356
352
|
console.error('Error when requesting Mollie profile id:');
|
|
357
353
|
console.error(e);
|
|
358
354
|
return undefined;
|
|
@@ -369,7 +365,7 @@ export class MollieService {
|
|
|
369
365
|
}
|
|
370
366
|
|
|
371
367
|
static async createPayment(
|
|
372
|
-
{ sellingOrganization, payment, mandate, redirectUrl, webhookUrl, cancelUrl, description, metadata, payingOrganization, user, customer}: {
|
|
368
|
+
{ sellingOrganization, payment, mandate, redirectUrl, webhookUrl, cancelUrl, description, metadata, payingOrganization, user, customer }: {
|
|
373
369
|
payment: Payment;
|
|
374
370
|
mandate: PaymentMandate | null;
|
|
375
371
|
redirectUrl: string;
|
|
@@ -377,14 +373,14 @@ export class MollieService {
|
|
|
377
373
|
webhookUrl: string;
|
|
378
374
|
description: string;
|
|
379
375
|
metadata: { [key: string]: string | undefined };
|
|
380
|
-
sellingOrganization: Organization
|
|
381
|
-
payingOrganization: Organization | null
|
|
382
|
-
user: User | null
|
|
383
|
-
customer: PaymentCustomer
|
|
376
|
+
sellingOrganization: Organization;
|
|
377
|
+
payingOrganization: Organization | null;
|
|
378
|
+
user: User | null;
|
|
379
|
+
customer: PaymentCustomer;
|
|
384
380
|
},
|
|
385
381
|
): Promise<{ paymentUrl: string | null }> {
|
|
386
|
-
const mollieService = await MollieService.create({sellingOrganization});
|
|
387
|
-
const profileId = await mollieService?.getProfileId();
|
|
382
|
+
const mollieService = await MollieService.create({ sellingOrganization });
|
|
383
|
+
const profileId = await mollieService?.getProfileId();
|
|
388
384
|
const method = MollieService.paymentMethodToMollie(payment.method);
|
|
389
385
|
|
|
390
386
|
if (!mollieService || !profileId || !method) {
|
|
@@ -398,8 +394,7 @@ export class MollieService {
|
|
|
398
394
|
payingOrganization: payingOrganization ?? null,
|
|
399
395
|
user,
|
|
400
396
|
customer,
|
|
401
|
-
}) ?? undefined
|
|
402
|
-
|
|
397
|
+
}) ?? undefined;
|
|
403
398
|
|
|
404
399
|
const data: Parameters<typeof mollieService.client.payments.create>[0] = {
|
|
405
400
|
amount: {
|
|
@@ -418,13 +413,13 @@ export class MollieService {
|
|
|
418
413
|
webhookUrl,
|
|
419
414
|
metadata: {
|
|
420
415
|
paymentId: payment.id,
|
|
421
|
-
...metadata
|
|
416
|
+
...metadata,
|
|
422
417
|
},
|
|
423
418
|
locale: mollieService.locale,
|
|
424
419
|
};
|
|
425
|
-
console.log('Creating payment', data)
|
|
420
|
+
console.log('Creating payment', data);
|
|
426
421
|
const molliePayment = await mollieService.client.payments.create(data);
|
|
427
|
-
console.log('Payment response', molliePayment)
|
|
422
|
+
console.log('Payment response', molliePayment);
|
|
428
423
|
|
|
429
424
|
const paymentUrl = molliePayment.getCheckoutUrl();
|
|
430
425
|
|
|
@@ -434,12 +429,12 @@ export class MollieService {
|
|
|
434
429
|
dbPayment.mollieId = molliePayment.id;
|
|
435
430
|
await dbPayment.save();
|
|
436
431
|
|
|
437
|
-
const {status} = await mollieService.getStatusFor(molliePayment, payment, false)
|
|
432
|
+
const { status } = await mollieService.getStatusFor(molliePayment, payment, false);
|
|
438
433
|
payment.status = status;
|
|
439
|
-
|
|
434
|
+
|
|
440
435
|
return {
|
|
441
436
|
paymentUrl: paymentUrl,
|
|
442
|
-
}
|
|
437
|
+
};
|
|
443
438
|
}
|
|
444
439
|
|
|
445
440
|
static async saveChargeInfo(mollieData: MolliePaymentType, payment: Payment) {
|
|
@@ -459,34 +454,33 @@ export class MollieService {
|
|
|
459
454
|
payment.iban = '•••• ' + details.cardNumber;
|
|
460
455
|
}
|
|
461
456
|
|
|
462
|
-
payment.mandateId = mollieData.mandateId ?? null
|
|
457
|
+
payment.mandateId = mollieData.mandateId ?? null;
|
|
463
458
|
await payment.save();
|
|
464
459
|
}
|
|
465
|
-
}
|
|
466
|
-
catch (e) {
|
|
460
|
+
} catch (e) {
|
|
467
461
|
console.error('Failed processing charge', e);
|
|
468
462
|
}
|
|
469
463
|
}
|
|
470
464
|
|
|
471
|
-
async getStatusFor(mollieData: MolliePaymentType, payment: Payment, cancel = false): Promise<{status: PaymentStatus}> {
|
|
472
|
-
await MollieService.saveChargeInfo(mollieData, payment)
|
|
465
|
+
async getStatusFor(mollieData: MolliePaymentType, payment: Payment, cancel = false): Promise<{ status: PaymentStatus }> {
|
|
466
|
+
await MollieService.saveChargeInfo(mollieData, payment);
|
|
473
467
|
|
|
474
468
|
if (mollieData.status === molliePaymentStatus.paid) {
|
|
475
469
|
return {
|
|
476
|
-
status: PaymentStatus.Succeeded,
|
|
477
|
-
}
|
|
470
|
+
status: PaymentStatus.Succeeded,
|
|
471
|
+
};
|
|
478
472
|
} else if (mollieData.status === molliePaymentStatus.failed) {
|
|
479
473
|
return {
|
|
480
|
-
status: PaymentStatus.Failed,
|
|
481
|
-
}
|
|
474
|
+
status: PaymentStatus.Failed,
|
|
475
|
+
};
|
|
482
476
|
} else if (mollieData.status === molliePaymentStatus.expired) {
|
|
483
477
|
return {
|
|
484
|
-
status: PaymentStatus.Failed,
|
|
485
|
-
}
|
|
478
|
+
status: PaymentStatus.Failed,
|
|
479
|
+
};
|
|
486
480
|
} else if (mollieData.status === molliePaymentStatus.canceled) {
|
|
487
481
|
return {
|
|
488
|
-
status: PaymentStatus.Failed,
|
|
489
|
-
}
|
|
482
|
+
status: PaymentStatus.Failed,
|
|
483
|
+
};
|
|
490
484
|
}
|
|
491
485
|
|
|
492
486
|
// Pending payments should be cancellable
|
|
@@ -496,42 +490,41 @@ export class MollieService {
|
|
|
496
490
|
// Try to cancel
|
|
497
491
|
try {
|
|
498
492
|
const newData = await this.client.payments.cancel(mollieData.id, {
|
|
499
|
-
testmode: this.testMode
|
|
493
|
+
testmode: this.testMode,
|
|
500
494
|
});
|
|
501
495
|
console.log('Cancelled Mollie Payment ' + payment.id);
|
|
502
|
-
return await this.getStatusFor(newData, payment, false)
|
|
496
|
+
return await this.getStatusFor(newData, payment, false);
|
|
503
497
|
} catch (e) {
|
|
504
|
-
console.error('Failed to cancel Mollie Payment ' + payment.id, {cause: e})
|
|
498
|
+
console.error('Failed to cancel Mollie Payment ' + payment.id, { cause: e });
|
|
505
499
|
}
|
|
506
|
-
|
|
507
500
|
} else if (cancel) {
|
|
508
|
-
console.log('Cannot cancel Mollie Payment ' + payment.id);
|
|
501
|
+
console.log('Cannot cancel Mollie Payment ' + payment.id);
|
|
509
502
|
}
|
|
510
503
|
|
|
511
|
-
if (mollieData.status === molliePaymentStatus.open
|
|
504
|
+
if (mollieData.status === molliePaymentStatus.open) {
|
|
512
505
|
// Nothink happend yet
|
|
513
506
|
return {
|
|
514
|
-
status: PaymentStatus.Created,
|
|
515
|
-
}
|
|
507
|
+
status: PaymentStatus.Created,
|
|
508
|
+
};
|
|
516
509
|
}
|
|
517
510
|
|
|
518
511
|
return {
|
|
519
|
-
status: PaymentStatus.Pending,
|
|
520
|
-
}
|
|
512
|
+
status: PaymentStatus.Pending,
|
|
513
|
+
};
|
|
521
514
|
}
|
|
522
515
|
|
|
523
516
|
async getStatus(payment: Payment, cancel = false) {
|
|
524
517
|
const molliePayment = await MolliePayment.select().where('paymentId', payment.id).first(false);
|
|
525
518
|
if (!molliePayment) {
|
|
526
|
-
throw new Error('Mollie Payment not found for payment ' + payment.id)
|
|
519
|
+
throw new Error('Mollie Payment not found for payment ' + payment.id);
|
|
527
520
|
}
|
|
528
521
|
|
|
529
522
|
const mollieData = await this.client.payments.get(molliePayment.mollieId, {
|
|
530
|
-
testmode: this.testMode
|
|
523
|
+
testmode: this.testMode,
|
|
531
524
|
});
|
|
532
525
|
|
|
533
|
-
console.log(mollieData)
|
|
526
|
+
console.log(mollieData);
|
|
534
527
|
|
|
535
|
-
return this.getStatusFor(mollieData, payment, cancel)
|
|
528
|
+
return this.getStatusFor(mollieData, payment, cancel);
|
|
536
529
|
}
|
|
537
530
|
}
|