@stamhoofd/backend 2.120.6 → 2.122.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/output-2.txt +1 -0
- package/output.txt +1 -0
- package/package.json +70 -53
- package/src/audit-logs/EventNotificationLogger.ts +40 -0
- package/src/audit-logs/ModelLogger.ts +19 -15
- package/src/audit-logs/OrganizationLogger.ts +1 -1
- package/src/audit-logs/RegistrationInvitationLogger.ts +46 -0
- package/src/audit-logs/init.ts +9 -1
- package/src/boot.ts +19 -18
- package/src/crons/amazon-ses.ts +13 -26
- package/src/crons/balance-emails.ts +3 -5
- package/src/crons/clearExcelCache.test.ts +1 -1
- package/src/crons/clearExcelCache.ts +1 -2
- package/src/crons/drip-emails.ts +42 -0
- package/src/crons/endFunctionsOfUsersWithoutRegistration.ts +4 -0
- package/src/crons/helpers/isOutside.ts +11 -0
- package/src/crons/helpers/useSavedIterator.ts +32 -0
- package/src/crons/index.ts +7 -0
- package/src/crons/invoices.ts +160 -0
- package/src/crons/members-fees.ts +50 -0
- package/src/crons/mollie-chargebacks.ts +86 -0
- package/src/crons/service-fees.ts +152 -0
- package/src/crons/stripe-invoices.ts +48 -0
- package/src/crons/transfer-fees.ts +176 -0
- package/src/crons/update-cached-balances.ts +4 -4
- package/src/crons.ts +54 -74
- package/src/debug.ts +4 -2
- package/src/email-recipient-loaders/documents.ts +1 -1
- package/src/email-recipient-loaders/members.ts +1 -1
- package/src/email-recipient-loaders/payments.ts +87 -46
- package/src/email-recipient-loaders/registrations.ts +1 -1
- package/src/email-replacements/getEmailReplacementsForPayment.ts +5 -9
- package/src/endpoints/admin/members/ChargeMembersEndpoint.ts +1 -1
- package/src/endpoints/admin/memberships/ChargeMembershipsEndpoint.ts +1 -1
- package/src/endpoints/admin/memberships/GetChargeMembershipsSummaryEndpoint.ts +3 -5
- package/src/endpoints/admin/organizations/ChargeOrganizationsEndpoint.ts +1 -1
- package/src/endpoints/admin/organizations/GetOrganizationsCountEndpoint.ts +1 -1
- package/src/endpoints/admin/organizations/GetOrganizationsEndpoint.ts +13 -7
- package/src/endpoints/admin/organizations/PatchOrganizationsEndpoint.ts +4 -6
- package/src/endpoints/admin/organizations/PatchPackagesEndpoint.test.ts +10 -6
- package/src/endpoints/admin/organizations/PatchPackagesEndpoint.ts +39 -21
- package/src/endpoints/admin/registrations/ChargeRegistrationsEndpoint.ts +1 -1
- package/src/endpoints/auth/CreateAdminEndpoint.ts +23 -5
- package/src/endpoints/auth/CreateTokenEndpoint.ts +2 -2
- package/src/endpoints/auth/DeleteTokenEndpoint.ts +1 -1
- package/src/endpoints/auth/DeleteUserEndpoint.ts +3 -3
- package/src/endpoints/auth/ForgotPasswordEndpoint.ts +1 -1
- package/src/endpoints/auth/GetOtherUserEndpoint.ts +1 -1
- package/src/endpoints/auth/GetUserEndpoint.ts +1 -1
- package/src/endpoints/auth/OpenIDConnectAuthTokenEndpoint.ts +1 -1
- package/src/endpoints/auth/OpenIDConnectStartEndpoint.ts +1 -1
- package/src/endpoints/auth/PatchUserEndpoint.ts +5 -8
- package/src/endpoints/auth/PollEmailVerificationEndpoint.ts +1 -1
- package/src/endpoints/auth/RetryEmailVerificationEndpoint.ts +1 -1
- package/src/endpoints/auth/SignupEndpoint.ts +2 -3
- package/src/endpoints/auth/VerifyEmailEndpoint.ts +20 -3
- package/src/endpoints/frontend/FrontendEnvironmentEndpoint.ts +2 -1
- package/src/endpoints/global/addresses/SearchRegionsEndpoint.ts +2 -4
- package/src/endpoints/global/addresses/ValidateAddressEndpoint.ts +1 -1
- package/src/endpoints/global/audit-logs/GetAuditLogsEndpoint.ts +5 -7
- package/src/endpoints/global/caddy/CheckDomainCertEndpoint.ts +2 -2
- package/src/endpoints/global/email/CreateEmailEndpoint.ts +3 -4
- package/src/endpoints/global/email/GetAdminEmailsEndpoint.test.ts +1 -1
- package/src/endpoints/global/email/GetAdminEmailsEndpoint.ts +1 -2
- package/src/endpoints/global/email/GetEmailAddressEndpoint.ts +4 -6
- package/src/endpoints/global/email/GetEmailEndpoint.ts +1 -1
- package/src/endpoints/global/email/GetUserEmailsEndpoint.test.ts +1 -1
- package/src/endpoints/global/email/GetUserEmailsEndpoint.ts +1 -1
- package/src/endpoints/global/email/ManageEmailAddressEndpoint.ts +6 -10
- package/src/endpoints/global/email/PatchEmailEndpoint.test.ts +4 -7
- package/src/endpoints/global/email/PatchEmailEndpoint.ts +6 -9
- package/src/endpoints/global/email-recipients/GetEmailRecipientsCountEndpoint.ts +1 -1
- package/src/endpoints/global/email-recipients/GetEmailRecipientsEndpoint.test.ts +1 -1
- package/src/endpoints/global/email-recipients/GetEmailRecipientsEndpoint.ts +1 -1
- package/src/endpoints/global/email-recipients/RetryEmailRecipientEndpoint.ts +2 -2
- package/src/endpoints/global/events/GetEventNotificationsCountEndpoint.ts +1 -1
- package/src/endpoints/global/events/GetEventNotificationsEndpoint.ts +3 -3
- package/src/endpoints/global/events/GetEventsEndpoint.ts +3 -3
- package/src/endpoints/global/events/PatchEventNotificationsEndpoint.test.ts +49 -4
- package/src/endpoints/global/events/PatchEventNotificationsEndpoint.ts +5 -8
- package/src/endpoints/global/events/PatchEventsEndpoint.test.ts +12 -44
- package/src/endpoints/global/events/PatchEventsEndpoint.ts +128 -127
- package/src/endpoints/global/files/ExportToExcelEndpoint.ts +9 -9
- package/src/endpoints/global/files/GetFileCache.ts +3 -4
- package/src/endpoints/global/files/UploadFile.ts +3 -4
- package/src/endpoints/global/files/UploadImage.ts +3 -4
- package/src/endpoints/global/groups/GetGroupsCountEndpoint.ts +51 -0
- package/src/endpoints/global/groups/GetGroupsEndpoint.test.ts +1 -1
- package/src/endpoints/global/groups/GetGroupsEndpoint.ts +4 -2
- package/src/endpoints/global/members/GetMemberFamilyEndpoint.ts +2 -3
- package/src/endpoints/global/members/GetMembersCountEndpoint.ts +1 -1
- package/src/endpoints/global/members/GetMembersEndpoint.test.ts +2 -2
- package/src/endpoints/global/members/GetMembersEndpoint.ts +10 -12
- package/src/endpoints/global/members/PatchOrganizationMembersEndpoint.test.ts +195 -12
- package/src/endpoints/global/members/PatchOrganizationMembersEndpoint.ts +16 -22
- package/src/endpoints/global/members/helpers/validateGroupFilter.ts +6 -30
- package/src/endpoints/global/members/shouldCheckIfMemberIsDuplicate.ts +1 -1
- package/src/endpoints/global/organizations/CheckRegisterCodeEndpoint.ts +1 -1
- package/src/endpoints/global/organizations/CreateOrganizationEndpoint.ts +40 -8
- package/src/endpoints/global/organizations/GetOrganizationFromDomainEndpoint.ts +2 -2
- package/src/endpoints/global/organizations/GetOrganizationFromUriEndpoint.ts +2 -2
- package/src/endpoints/global/organizations/SearchOrganizationEndpoint.test.ts +4 -1
- package/src/endpoints/global/organizations/SearchOrganizationEndpoint.ts +4 -5
- package/src/endpoints/global/payments/StripeWebhookEndpoint.ts +9 -16
- package/src/endpoints/global/platform/GetPlatformAdminsEndpoint.ts +1 -1
- package/src/endpoints/global/platform/GetPlatformEndpoint.ts +1 -1
- package/src/endpoints/global/platform/PatchPlatformEnpoint.test.ts +1 -1
- package/src/endpoints/global/platform/PatchPlatformEnpoint.ts +32 -13
- package/src/endpoints/global/platform-memberships/GetPlatformMembershipsCountEndpoint.ts +31 -31
- package/src/endpoints/global/platform-memberships/GetPlatformMembershipsEndpoint.ts +18 -20
- package/src/endpoints/global/registration/GetRegistrationsCountEndpoint.ts +1 -1
- package/src/endpoints/global/registration/GetRegistrationsEndpoint.test.ts +1 -1
- package/src/endpoints/global/registration/GetRegistrationsEndpoint.ts +6 -10
- package/src/endpoints/global/registration/GetUserDetailedPayableBalanceEndpoint.ts +35 -6
- package/src/endpoints/global/registration/GetUserDocumentsEndpoint.ts +2 -2
- package/src/endpoints/global/registration/GetUserMembersEndpoint.ts +1 -1
- package/src/endpoints/global/registration/GetUserPayableBalanceEndpoint.ts +1 -1
- package/src/endpoints/global/registration/PatchUserMembersEndpoint.test.ts +2 -2
- package/src/endpoints/global/registration/PatchUserMembersEndpoint.ts +3 -3
- package/src/endpoints/global/registration/RegisterMembersEndpoint.test.ts +90 -6
- package/src/endpoints/global/registration/RegisterMembersEndpoint.ts +38 -33
- package/src/endpoints/global/registration-invitations/GetRegistrationInvitationsCountEndpoint.ts +45 -0
- package/src/endpoints/global/registration-invitations/GetRegistrationInvitationsEndpoint.test.ts +494 -0
- package/src/endpoints/global/registration-invitations/GetRegistrationInvitationsEndpoint.ts +213 -0
- package/src/endpoints/global/registration-invitations/PatchRegistrationInvitationsEndpoint.test.ts +404 -0
- package/src/endpoints/global/registration-invitations/PatchRegistrationInvitationsEndpoint.ts +167 -0
- package/src/endpoints/global/registration-periods/GetRegistrationPeriodsCountEndpoint.ts +43 -0
- package/src/endpoints/global/registration-periods/GetRegistrationPeriodsEndpoint.ts +1 -1
- package/src/endpoints/global/registration-periods/PatchRegistrationPeriodsEndpoint.ts +13 -5
- package/src/endpoints/global/sso/GetSSOEndpoint.ts +2 -3
- package/src/endpoints/global/sso/SetSSOEndpoint.ts +1 -1
- package/src/endpoints/global/webshops/GetWebshopFromDomainEndpoint.ts +2 -2
- package/src/endpoints/global/webshops/GetWebshopsEndpoint.test.ts +1 -2
- package/src/endpoints/global/webshops/GetWebshopsEndpoint.ts +2 -4
- package/src/endpoints/organization/dashboard/balance-items/GetBalanceItemEndpoint.ts +2 -2
- package/src/endpoints/organization/dashboard/balance-items/GetBalanceItemsCountEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/balance-items/GetBalanceItemsEndpoint.ts +3 -4
- package/src/endpoints/organization/dashboard/balance-items/PatchBalanceItemsEndpoint.ts +19 -6
- package/src/endpoints/organization/dashboard/billing/ApplyRegisterCodeEndpoint.test.ts +73 -0
- package/src/endpoints/organization/dashboard/billing/ApplyRegisterCodeEndpoint.ts +89 -0
- package/src/endpoints/{global → organization/dashboard}/billing/DeactivatePackageEndpoint.ts +4 -9
- package/src/endpoints/organization/dashboard/billing/DeleteOrganizationMandateEndpoint.ts +62 -0
- package/src/endpoints/organization/dashboard/billing/GetOrganizationDetailedPayableBalanceCollectionEndpoint.ts +56 -0
- package/src/endpoints/organization/dashboard/billing/GetOrganizationDetailedPayableBalanceEndpoint.ts +41 -18
- package/src/endpoints/organization/dashboard/billing/GetOrganizationMandatesEndpoint.ts +64 -0
- package/src/endpoints/organization/dashboard/billing/GetOrganizationPayableBalanceEndpoint.ts +2 -2
- package/src/endpoints/organization/dashboard/billing/GetOrganizationPayableInvoicesEndpoint.ts +68 -0
- package/src/endpoints/organization/dashboard/billing/GetPackagesEndpoint.ts +12 -4
- package/src/endpoints/organization/dashboard/billing/GetRegisterCodeEndpoint.ts +66 -0
- package/src/endpoints/organization/dashboard/billing/OrganizationCheckoutEndpoint.test.ts +949 -0
- package/src/endpoints/organization/dashboard/billing/OrganizationCheckoutEndpoint.ts +311 -0
- package/src/endpoints/organization/dashboard/billing/PatchOrganizationMandatesEndpoint.ts +94 -0
- package/src/endpoints/organization/dashboard/documents/GetDocumentTemplateXML.ts +1 -1
- package/src/endpoints/organization/dashboard/documents/GetDocumentTemplatesCountEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/documents/GetDocumentTemplatesEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/documents/GetDocumentsCountEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/documents/GetDocumentsEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/documents/PatchDocumentEndpoint.ts +10 -2
- package/src/endpoints/organization/dashboard/documents/PatchDocumentTemplatesEndpoint.test.ts +2 -2
- package/src/endpoints/organization/dashboard/documents/PatchDocumentTemplatesEndpoint.ts +2 -2
- package/src/endpoints/organization/dashboard/email/CheckEmailBouncesEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/email-templates/GetEmailTemplatesEndpoint.test.ts +1 -1
- package/src/endpoints/organization/dashboard/email-templates/GetEmailTemplatesEndpoint.ts +10 -8
- package/src/endpoints/organization/dashboard/email-templates/PatchEmailTemplatesEndpoint.test.ts +1 -1
- package/src/endpoints/organization/dashboard/email-templates/PatchEmailTemplatesEndpoint.ts +5 -6
- package/src/endpoints/organization/dashboard/invoices/GetInvoicesCountEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/invoices/GetInvoicesEndpoint.ts +15 -4
- package/src/endpoints/organization/dashboard/invoices/PatchInvoicesEndpoint.ts +11 -2
- package/src/endpoints/organization/dashboard/mollie/CheckMollieEndpoint.ts +8 -8
- package/src/endpoints/organization/dashboard/mollie/ConnectMollieEndpoint.ts +10 -5
- package/src/endpoints/organization/dashboard/mollie/DisconnectMollieEndpoint.ts +2 -2
- package/src/endpoints/organization/dashboard/mollie/GetMollieDashboardEndpoint.ts +7 -7
- package/src/endpoints/organization/dashboard/nolt/CreateNoltTokenEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/organization/GetOrganizationArchivedGroups.ts +2 -2
- package/src/endpoints/organization/dashboard/organization/GetOrganizationDeletedGroups.ts +1 -1
- package/src/endpoints/organization/dashboard/organization/GetUitpasClientIdEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/organization/PatchOrganizationEndpoint.test.ts +2 -2
- package/src/endpoints/organization/dashboard/organization/PatchOrganizationEndpoint.ts +67 -20
- package/src/endpoints/organization/dashboard/organization/SearchUitpasOrganizersEndpoint.ts +2 -2
- package/src/endpoints/organization/dashboard/organization/SetOrganizationDomainEndpoint.ts +5 -10
- package/src/endpoints/organization/dashboard/organization/SetUitpasClientCredentialsEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/payments/GetPaymentsCountEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/payments/GetPaymentsEndpoint.ts +3 -4
- package/src/endpoints/organization/dashboard/payments/PatchPaymentsEndpoint.ts +24 -17
- package/src/endpoints/organization/dashboard/receivable-balances/ChargeReceivableBalancesEndpoint.ts +134 -0
- package/src/endpoints/organization/dashboard/receivable-balances/GetReceivableBalanceEndpoint.ts +2 -3
- package/src/endpoints/organization/dashboard/receivable-balances/GetReceivableBalancesCountEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/receivable-balances/GetReceivableBalancesEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/registration-periods/GetOrganizationRegistrationPeriodsEndpoint.test.ts +1 -1
- package/src/endpoints/organization/dashboard/registration-periods/GetOrganizationRegistrationPeriodsEndpoint.ts +2 -3
- package/src/endpoints/organization/dashboard/registration-periods/MoveRegistrationPeriods.test.ts +1 -1
- package/src/endpoints/organization/dashboard/registration-periods/PatchOrganizationRegistrationPeriodsEndpoint.test.ts +1 -1
- package/src/endpoints/organization/dashboard/registration-periods/PatchOrganizationRegistrationPeriodsEndpoint.ts +32 -22
- package/src/endpoints/organization/dashboard/registration-periods/SetupStepReviewEndpoint.ts +4 -5
- package/src/endpoints/organization/dashboard/stripe/ConnectStripeEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/stripe/DeleteStripeAccountEndpoint.ts +2 -3
- package/src/endpoints/organization/dashboard/stripe/GetStripeAccountLinkEndpoint.ts +2 -2
- package/src/endpoints/organization/dashboard/stripe/GetStripeAccountsEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/stripe/GetStripeLoginLinkEndpoint.ts +2 -2
- package/src/endpoints/organization/dashboard/stripe/UpdateStripeAccountEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/users/CreateApiUserEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/users/DeleteUserEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/users/GetApiUsersEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/users/GetOrganizationAdminsEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/users/PatchApiUserEndpoint.ts +4 -6
- package/src/endpoints/organization/dashboard/webshops/CreateWebshopEndpoint.ts +10 -15
- package/src/endpoints/organization/dashboard/webshops/DeleteWebshopEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/webshops/GetDiscountCodesEndpoint.ts +2 -2
- package/src/endpoints/organization/dashboard/webshops/GetWebshopOrdersCountEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/webshops/GetWebshopOrdersEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/webshops/GetWebshopTicketsEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/webshops/GetWebshopUriAvailabilityEndpoint.ts +11 -2
- package/src/endpoints/organization/dashboard/webshops/PatchDiscountCodesEndpoint.ts +4 -6
- package/src/endpoints/organization/dashboard/webshops/PatchWebshopEndpoint.ts +29 -8
- package/src/endpoints/organization/dashboard/webshops/PatchWebshopOrdersEndpoint.ts +21 -28
- package/src/endpoints/organization/dashboard/webshops/PatchWebshopTicketsEndpoint.ts +1 -1
- package/src/endpoints/organization/dashboard/webshops/SearchUitpasEventsEndpoint.ts +2 -2
- package/src/endpoints/organization/dashboard/webshops/VerifyWebshopDomainEndpoint.ts +2 -3
- package/src/endpoints/organization/dashboard/webshops/WebshopReservedPathSegments.test.ts +95 -0
- package/src/endpoints/organization/shared/ExchangePaymentEndpoint.ts +15 -13
- package/src/endpoints/organization/shared/GetDocumentHtml.ts +1 -1
- package/src/endpoints/organization/shared/GetPaymentEndpoint.ts +1 -1
- package/src/endpoints/organization/shared/GetUitpasNumberDetailsEndpoint.ts +3 -5
- package/src/endpoints/organization/shared/auth/GetOrganizationEndpoint.ts +1 -1
- package/src/endpoints/organization/webshops/CheckWebshopDiscountCodesEndpoint.ts +4 -1
- package/src/endpoints/organization/webshops/GetOrderByPaymentEndpoint.ts +14 -3
- package/src/endpoints/organization/webshops/GetOrderEndpoint.ts +14 -2
- package/src/endpoints/organization/webshops/GetTicketsEndpoint.ts +37 -16
- package/src/endpoints/organization/webshops/GetWebshopEndpoint.test.ts +34 -2
- package/src/endpoints/organization/webshops/GetWebshopEndpoint.ts +4 -2
- package/src/endpoints/organization/webshops/PlaceOrderEndpoint.test.ts +74 -3
- package/src/endpoints/organization/webshops/PlaceOrderEndpoint.ts +28 -50
- package/src/endpoints/organization/webshops/RetrieveUitpasSocialTariffPriceEndpoint.ts +3 -5
- package/src/endpoints/organization/webshops/WebshopAuthHelper.ts +36 -0
- package/src/endpoints/system/HealthEndpoint.ts +1 -1
- package/src/excel-loaders/balance-items.ts +1 -1
- package/src/excel-loaders/event-notifications.ts +1 -1
- package/src/excel-loaders/members.ts +1 -1
- package/src/excel-loaders/organizations.ts +3 -3
- package/src/excel-loaders/payments.ts +31 -1
- package/src/excel-loaders/platform-memberships.ts +13 -14
- package/src/excel-loaders/receivable-balances.ts +2 -2
- package/src/excel-loaders/registrations.ts +2 -3
- package/src/helpers/AddressValidator.ts +7 -14
- package/src/helpers/AdminPermissionChecker.ts +60 -65
- package/src/helpers/AuthenticatedStructures.ts +153 -51
- package/src/helpers/BalanceItemRelationsBackfiller.test.ts +174 -0
- package/src/helpers/BalanceItemRelationsBackfiller.ts +163 -0
- package/src/helpers/BuckarooHelper.ts +2 -4
- package/src/helpers/CheckSettlements.ts +12 -24
- package/src/helpers/Context.ts +15 -10
- package/src/helpers/CookieHelper.ts +1 -2
- package/src/helpers/EmailResumer.ts +1 -2
- package/src/helpers/FileCache.ts +2 -3
- package/src/helpers/FinancialSupportHelper.ts +21 -0
- package/src/helpers/FlagMomentCleanup.ts +1 -2
- package/src/helpers/ForwardHandler.ts +5 -10
- package/src/helpers/GlobalHelper.ts +3 -3
- package/src/helpers/LegacyBillingConverter.ts +787 -0
- package/src/helpers/MemberMerger.test.ts +782 -0
- package/src/helpers/MemberMerger.ts +600 -0
- package/src/helpers/MemberUserSyncer.ts +6 -12
- package/src/helpers/MembershipCharger.ts +2 -4
- package/src/helpers/PaymentCustomerResolver.test.ts +203 -0
- package/src/helpers/PaymentCustomerResolver.ts +144 -0
- package/src/helpers/PeriodHelper.ts +2 -3
- package/src/helpers/RecordAnswerHelper.test.ts +741 -0
- package/src/helpers/RecordAnswerHelper.ts +116 -0
- package/src/helpers/SeedTools.ts +106 -0
- package/src/helpers/ServiceFeeHelper.ts +125 -15
- package/src/helpers/SetupStepUpdater.ts +38 -32
- package/src/helpers/StamhoofdFilterAccessHelper.ts +52 -0
- package/src/helpers/StripeHelper.ts +15 -38
- package/src/helpers/StripeInvoicer.ts +419 -0
- package/src/helpers/StripePayoutChecker.ts +5 -10
- package/src/helpers/TagHelper.ts +7 -8
- package/src/helpers/TemporaryMemberAccess.ts +1 -2
- package/src/helpers/ThrottledQueue.ts +1 -2
- package/src/helpers/UitpasTokenRepository.ts +1 -2
- package/src/helpers/ViesHelper.ts +11 -11
- package/src/helpers/XlsxTransformerColumnHelper.ts +1 -1
- package/src/helpers/outstandingBalanceJoin.ts +2 -2
- package/src/helpers/updateMemberDetailsUitpasNumber.ts +3 -5
- package/src/migrate.ts +12 -5
- package/src/{seeds → migrations}/0000000004-single-organization.ts +10 -1
- package/src/migrations/0000000006-default-organization.ts +139 -0
- package/src/{seeds → migrations}/1715028563-user-permissions.ts +17 -27
- package/src/{seeds/1765896674-document-update-year.test.ts → migrations/1750090029-document-update-year.test.ts} +27 -26
- package/src/migrations/1750090029-document-update-year.ts +103 -0
- package/src/migrations/1750090030-records-configuration.ts +92 -0
- package/src/migrations/1750090031-records-configuration-webshops.ts +36 -0
- package/src/migrations/1752848540-national-numbers.ts +585 -0
- package/src/migrations/1752848550-records-configuration-group-filter.ts +1064 -0
- package/src/{seeds → migrations}/1752848561-groups-registration-periods.ts +95 -27
- package/src/{seeds → migrations}/1754560914-groups-prices.test.ts +1 -1
- package/src/{seeds → migrations}/1754560914-groups-prices.ts +9 -15
- package/src/{seeds → migrations}/1756293699-fill-previous-next-period-id.ts +1 -2
- package/src/migrations/1761665607-sync-member-users.ts +40 -0
- package/src/migrations/1779121239-default-invoice-email-template.sql +3 -0
- package/src/migrations/1779121240-invoice-email-template.sql +6 -0
- package/src/migrations/1779986893-default-payment-failed-email-templates.sql +4 -0
- package/src/migrations/1780578166-convert-legacy-billing.ts +13 -0
- package/src/{seeds/1755876819-remove-duplicate-members.ts → migrations/1780665426-remove-duplicate-members.ts} +23 -4
- package/src/migrations/1780933598-document-groups.ts +88 -0
- package/src/migrations/1781692342-balance-item-relations.ts +13 -0
- package/src/migrations/1781857866-platform-admins.ts +103 -0
- package/src/migrations/1781857867-rm-old-platform-admins.ts +25 -0
- package/src/seeds/0000000001-throw.ts +5 -0
- package/src/seeds/1760702452-update-balance-price-paid.ts +19 -0
- package/src/seeds/1760702453-update-balance-invoiced.ts +19 -0
- package/src/seeds/1760702454-update-cached-outstanding-balance-from-items.ts +51 -14
- package/src/seeds/1773754928-force-save-members.ts +41 -8
- package/src/seeds/1780665427-schedule-stock-updates.ts +45 -0
- package/src/seeds/1780665428-group-update-occupancy.ts +31 -0
- package/src/seeds/1780915001-fill-payment-customer.ts +70 -0
- package/src/seeds/1780915002-update-orders.ts +39 -0
- package/src/seeds/1782047708-organization-company-address.ts +44 -0
- package/src/seeds-temporary/1769088653-uitpas-status.ts +1 -2
- package/src/seeds-temporary/1780416000-migrate-audit-log-legacy-enums.test.ts +69 -0
- package/src/seeds-temporary/1780416000-migrate-audit-log-legacy-enums.ts +85 -0
- package/src/services/AuditLogService.test.ts +51 -0
- package/src/services/AuditLogService.ts +45 -0
- package/src/services/BalanceItemService.ts +148 -55
- package/src/services/CpuService.ts +3 -6
- package/src/services/DatabaseCollationService.test.ts +1 -2
- package/src/services/DocumentService.ts +1 -2
- package/src/services/EventNotificationService.ts +1 -1
- package/src/services/FileSignService.ts +2 -4
- package/src/services/InvoicePdfService.ts +286 -0
- package/src/services/InvoiceService.ts +330 -77
- package/src/services/InvoiceXMLService.ts +424 -0
- package/src/services/MemberNumberService.ts +6 -11
- package/src/services/MemberRecordStore.ts +8 -10
- package/src/services/MollieService.ts +530 -0
- package/src/services/PaymentMandateService.ts +214 -0
- package/src/services/PaymentReallocationService.test.ts +1 -1
- package/src/services/PaymentReallocationService.ts +7 -9
- package/src/services/PaymentService.ts +820 -328
- package/src/services/PlatformMembershipService.ts +5 -9
- package/src/services/ReferralService.ts +223 -0
- package/src/services/RegistrationService.ts +125 -54
- package/src/services/SSOService.test.ts +119 -0
- package/src/services/SSOService.ts +56 -49
- package/src/services/STPackageService.ts +97 -68
- package/src/services/UniqueMemberNumberService.ts +69 -0
- package/src/services/UniqueUserService.ts +3 -6
- package/src/services/VATService.ts +85 -0
- package/src/services/data/invoice.hbs.html +686 -0
- package/src/services/uitpas/PassholderEndpoints.ts +3 -6
- package/src/services/uitpas/UitpasService.ts +6 -10
- package/src/services/uitpas/checkUitpasNumbers.ts +2 -4
- package/src/services/uitpas/getSocialTariffForUitpasNumbers.ts +3 -6
- package/src/services/uitpas/searchUitpasEvents.ts +1 -2
- package/src/sql-filters/audit-logs.ts +1 -1
- package/src/sql-filters/balance-item-payments.ts +1 -1
- package/src/sql-filters/balance-items.ts +1 -1
- package/src/sql-filters/base-registration-filter-compilers.ts +5 -33
- package/src/sql-filters/document-templates.ts +1 -1
- package/src/sql-filters/documents.ts +1 -1
- package/src/sql-filters/email-recipients.ts +1 -1
- package/src/sql-filters/emails.ts +1 -1
- package/src/sql-filters/event-notifications.ts +1 -1
- package/src/sql-filters/events.ts +6 -1
- package/src/sql-filters/groups.ts +16 -1
- package/src/sql-filters/invoiced-balance-items.ts +1 -1
- package/src/sql-filters/invoices.ts +1 -1
- package/src/sql-filters/member-responsibility-records.ts +1 -1
- package/src/sql-filters/members.ts +1 -1
- package/src/sql-filters/orders.ts +4 -4
- package/src/sql-filters/organization-registration-periods.ts +1 -1
- package/src/sql-filters/organizations.ts +1 -1
- package/src/sql-filters/payments.ts +5 -0
- package/src/sql-filters/platform-memberships.ts +3 -3
- package/src/sql-filters/receivable-balances.ts +1 -1
- package/src/sql-filters/registration-invitations.ts +90 -0
- package/src/sql-filters/registration-periods.ts +1 -1
- package/src/sql-filters/registrations.ts +1 -1
- package/src/sql-filters/tickets.ts +1 -1
- package/src/sql-filters/users.ts +1 -1
- package/src/sql-sorters/groups.ts +23 -0
- package/src/sql-sorters/platform-memberships.ts +16 -16
- package/src/sql-sorters/registration-invitations.ts +36 -0
- package/tests/actions/patchOrganizationMember.ts +1 -1
- package/tests/actions/patchUserMember.ts +1 -1
- package/tests/assertions/assertBalances.ts +6 -12
- package/tests/e2e/api-rate-limits.test.ts +12 -24
- package/tests/e2e/bundle-discounts.test.ts +4 -1
- package/tests/e2e/charge-members.test.ts +13 -11
- package/tests/e2e/documents.test.ts +4 -1
- package/tests/e2e/register.test.ts +7 -9
- package/tests/e2e/stock.test.ts +4 -3
- package/tests/e2e/tickets.test.ts +1 -1
- package/tests/helpers/MollieMocker.ts +462 -0
- package/tests/helpers/PayconiqMocker.ts +138 -45
- package/tests/helpers/StripeMocker.ts +9 -6
- package/tests/helpers/index.ts +4 -0
- package/tests/init/initAdmin.ts +2 -2
- package/tests/init/initBundleDiscount.ts +1 -1
- package/tests/init/initMembershipOrganization.ts +13 -0
- package/tests/init/initPermissionRole.ts +3 -4
- package/tests/vitest.global.setup.ts +1 -1
- package/vitest.config.js +7 -0
- package/.nvmrc +0 -1
- package/src/endpoints/global/billing/ActivatePackagesEndpoint.ts +0 -216
- package/src/helpers/GroupBuilder.ts +0 -418
- package/src/seeds/0000000000-example.ts +0 -11
- package/src/seeds/1722256498-group-update-occupancy.ts +0 -52
- package/src/seeds/1726572303-schedule-stock-updates.ts +0 -52
- package/src/seeds/1726847064-setup-steps.ts +0 -16
- package/src/seeds/1728928974-update-cached-outstanding-balance-from-items.ts +0 -31
- package/src/seeds/1729253172-update-orders.ts +0 -21
- package/src/seeds/1733319079-fill-paying-organization-ids.ts +0 -68
- package/src/seeds/1733748412-update-deleted-order-numbers.ts +0 -109
- package/src/seeds/1733994455-balance-item-status-open.ts +0 -30
- package/src/seeds/1740046783-update-membership.ts +0 -17
- package/src/seeds/1741008870-fix-auditlog-description.ts +0 -50
- package/src/seeds/1741011468-fix-auditlog-description-uft16.ts +0 -88
- package/src/seeds/1741268179-fix-group-dates-of-events.ts +0 -32
- package/src/seeds/1750090030-records-configuration.ts +0 -26
- package/src/seeds/1751445358-upload-email-attachments.ts +0 -106
- package/src/seeds/1755532883-update-email-sender-ids.ts +0 -47
- package/src/seeds/1755790070-fill-email-recipient-errors.ts +0 -96
- package/src/seeds/1756115432-remove-old-drafts.ts +0 -16
- package/src/seeds/1756115433-fill-email-recipient-organization-id.ts +0 -30
- package/src/seeds/1756303697-update-email-counts.ts +0 -76
- package/src/seeds/1761665607-sync-member-users.ts +0 -59
- package/src/seeds/1765896674-document-update-year.ts +0 -66
- /package/src/{seeds → migrations}/0000000001-development-user.ts +0 -0
- /package/src/{seeds → migrations}/0000000002-clear-stamhoofd-email-templates.ts +0 -0
- /package/src/{seeds → migrations}/0000000003-default-email-templates.ts +0 -0
- /package/src/{seeds → migrations}/1752848561-groups-registration-periods.test.ts +0 -0
- /package/src/{seeds → migrations}/1766150402-document-published-at.test.ts +0 -0
- /package/src/{seeds → migrations}/1766150402-document-published-at.ts +0 -0
- /package/src/{seeds → migrations}/data/default-email-templates.sql +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { AutoEncoderPatchType, Decoder, PatchableArrayAutoEncoder} from '@simonbackx/simple-encoding';
|
|
1
|
+
import type { AutoEncoderPatchType, Decoder, PatchableArrayAutoEncoder } from '@simonbackx/simple-encoding';
|
|
2
2
|
import { PatchableArrayDecoder, StringDecoder } from '@simonbackx/simple-encoding';
|
|
3
|
-
import type { DecodedRequest, Request} from '@simonbackx/simple-endpoints';
|
|
3
|
+
import type { DecodedRequest, Request } from '@simonbackx/simple-endpoints';
|
|
4
4
|
import { Endpoint, Response } from '@simonbackx/simple-endpoints';
|
|
5
5
|
import { Invoice as InvoiceStruct } from '@stamhoofd/structures';
|
|
6
6
|
|
|
@@ -44,6 +44,15 @@ export class PatchInvoicesEndpoint extends Endpoint<Params, Query, Body, Respons
|
|
|
44
44
|
const invoices: Invoice[] = [];
|
|
45
45
|
|
|
46
46
|
for (const { put } of request.body.getPuts()) {
|
|
47
|
+
if (put.payingOrganizationId) {
|
|
48
|
+
if (!await Context.auth.hasFullAccess(put.payingOrganizationId)) {
|
|
49
|
+
Context.auth.error($t('%1Xw'));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
put.stripeAccountId = null;
|
|
54
|
+
put.reference = null;
|
|
55
|
+
|
|
47
56
|
const model = await InvoiceService.createFrom(organization, put);
|
|
48
57
|
invoices.push(model);
|
|
49
58
|
}
|
|
@@ -1,11 +1,12 @@
|
|
|
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 { MollieToken } from '@stamhoofd/models';
|
|
4
|
-
import type { Organization as OrganizationStruct} from '@stamhoofd/structures';
|
|
4
|
+
import type { Organization as OrganizationStruct } from '@stamhoofd/structures';
|
|
5
5
|
import { CheckMollieResponse, PermissionLevel } from '@stamhoofd/structures';
|
|
6
6
|
|
|
7
7
|
import { AuthenticatedStructures } from '../../../../helpers/AuthenticatedStructures.js';
|
|
8
8
|
import { Context } from '../../../../helpers/Context.js';
|
|
9
|
+
import { MollieService } from '../../../../services/MollieService.js';
|
|
9
10
|
|
|
10
11
|
type Params = Record<string, never>;
|
|
11
12
|
type Body = undefined;
|
|
@@ -36,9 +37,9 @@ export class CheckMollieEndpoint extends Endpoint<Params, Query, Body, ResponseB
|
|
|
36
37
|
throw Context.auth.error();
|
|
37
38
|
}
|
|
38
39
|
|
|
39
|
-
const
|
|
40
|
+
const service = await MollieService.create({ sellingOrganization: organization });
|
|
40
41
|
|
|
41
|
-
if (!
|
|
42
|
+
if (!service) {
|
|
42
43
|
organization.privateMeta.mollieOnboarding = null;
|
|
43
44
|
organization.privateMeta.mollieProfile = null;
|
|
44
45
|
await organization.save();
|
|
@@ -52,9 +53,9 @@ export class CheckMollieEndpoint extends Endpoint<Params, Query, Body, ResponseB
|
|
|
52
53
|
profiles: [],
|
|
53
54
|
}));
|
|
54
55
|
}
|
|
55
|
-
const profiles = await
|
|
56
|
+
const profiles = await service.getProfiles();
|
|
56
57
|
|
|
57
|
-
const status = await
|
|
58
|
+
const status = await service.getOnboardingStatus();
|
|
58
59
|
organization.privateMeta.mollieOnboarding = status;
|
|
59
60
|
|
|
60
61
|
// Check profile is still valid
|
|
@@ -63,8 +64,7 @@ export class CheckMollieEndpoint extends Endpoint<Params, Query, Body, ResponseB
|
|
|
63
64
|
const profile = profiles.find(p => p.id === s);
|
|
64
65
|
if (!profile) {
|
|
65
66
|
organization.privateMeta.mollieProfile = null;
|
|
66
|
-
}
|
|
67
|
-
else {
|
|
67
|
+
} else {
|
|
68
68
|
organization.privateMeta.mollieProfile = profile;
|
|
69
69
|
}
|
|
70
70
|
}
|
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
import type { Decoder} from '@simonbackx/simple-encoding';
|
|
1
|
+
import type { Decoder } from '@simonbackx/simple-encoding';
|
|
2
2
|
import { AutoEncoder, field, StringDecoder } from '@simonbackx/simple-encoding';
|
|
3
|
-
import type { DecodedRequest, Request} from '@simonbackx/simple-endpoints';
|
|
3
|
+
import type { DecodedRequest, Request } from '@simonbackx/simple-endpoints';
|
|
4
4
|
import { Endpoint, Response } from '@simonbackx/simple-endpoints';
|
|
5
5
|
import { MollieToken } from '@stamhoofd/models';
|
|
6
|
-
import type { Organization as OrganizationStruct} from '@stamhoofd/structures';
|
|
6
|
+
import type { Organization as OrganizationStruct } from '@stamhoofd/structures';
|
|
7
7
|
import { PermissionLevel } from '@stamhoofd/structures';
|
|
8
8
|
|
|
9
9
|
import { AuthenticatedStructures } from '../../../../helpers/AuthenticatedStructures.js';
|
|
10
10
|
import { checkMollieSettlementsFor } from '../../../../helpers/CheckSettlements.js';
|
|
11
11
|
import { Context } from '../../../../helpers/Context.js';
|
|
12
|
+
import { MollieService } from '../../../../services/MollieService.js';
|
|
12
13
|
|
|
13
14
|
type Params = Record<string, never>;
|
|
14
15
|
|
|
@@ -47,9 +48,13 @@ export class ConnectMollieEndpoint extends Endpoint<Params, Query, Body, Respons
|
|
|
47
48
|
}
|
|
48
49
|
|
|
49
50
|
const mollieToken = await MollieToken.create(organization, request.body.code);
|
|
51
|
+
const service = await MollieService.create({ sellingOrganization: organization });
|
|
52
|
+
if (service) {
|
|
53
|
+
await service.setupOnboarding();
|
|
50
54
|
|
|
51
|
-
|
|
52
|
-
|
|
55
|
+
// Check settlements after linking (shouldn't block)
|
|
56
|
+
checkMollieSettlementsFor(mollieToken.accessToken, true).catch(console.error);
|
|
57
|
+
}
|
|
53
58
|
|
|
54
59
|
return new Response(await AuthenticatedStructures.organization(organization));
|
|
55
60
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
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 { MollieToken } from '@stamhoofd/models';
|
|
4
|
-
import type { Organization as OrganizationStruct} from '@stamhoofd/structures';
|
|
4
|
+
import type { Organization as OrganizationStruct } from '@stamhoofd/structures';
|
|
5
5
|
import { PermissionLevel } from '@stamhoofd/structures';
|
|
6
6
|
|
|
7
7
|
import { AuthenticatedStructures } from '../../../../helpers/AuthenticatedStructures.js';
|
|
@@ -1,15 +1,15 @@
|
|
|
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 { isSimpleError, isSimpleErrors, SimpleError } from '@simonbackx/simple-errors';
|
|
4
4
|
import { MollieToken } from '@stamhoofd/models';
|
|
5
5
|
import { PermissionLevel } from '@stamhoofd/structures';
|
|
6
|
-
|
|
6
|
+
import { GetMollieDashboardResponse } from '@stamhoofd/structures/endpoints/GetMollieDashboardResponse.js';
|
|
7
7
|
import { Context } from '../../../../helpers/Context.js';
|
|
8
8
|
|
|
9
9
|
type Params = Record<string, never>;
|
|
10
10
|
type Body = undefined;
|
|
11
11
|
type Query = undefined;
|
|
12
|
-
type ResponseBody =
|
|
12
|
+
type ResponseBody = GetMollieDashboardResponse;
|
|
13
13
|
|
|
14
14
|
export class GetMollieDashboardEndpoint extends Endpoint<Params, Query, Body, ResponseBody> {
|
|
15
15
|
protected doesMatch(request: Request): [true, Params] | [false] {
|
|
@@ -46,11 +46,11 @@ export class GetMollieDashboardEndpoint extends Endpoint<Params, Query, Body, Re
|
|
|
46
46
|
try {
|
|
47
47
|
const url = await mollie.getOnboardingLink() as string;
|
|
48
48
|
|
|
49
|
-
const response = new Response(
|
|
50
|
-
|
|
49
|
+
const response = new Response(GetMollieDashboardResponse.create({
|
|
50
|
+
url,
|
|
51
|
+
}));
|
|
51
52
|
return response;
|
|
52
|
-
}
|
|
53
|
-
catch (e) {
|
|
53
|
+
} catch (e) {
|
|
54
54
|
if (isSimpleErrors(e) || isSimpleError(e)) {
|
|
55
55
|
throw e;
|
|
56
56
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AutoEncoder, field, StringDecoder } from '@simonbackx/simple-encoding';
|
|
2
|
-
import type { DecodedRequest, Request} from '@simonbackx/simple-endpoints';
|
|
2
|
+
import type { DecodedRequest, Request } from '@simonbackx/simple-endpoints';
|
|
3
3
|
import { Endpoint, Response } from '@simonbackx/simple-endpoints';
|
|
4
4
|
import jwt from 'jsonwebtoken';
|
|
5
5
|
|
|
@@ -1,8 +1,8 @@
|
|
|
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 { SimpleError } from '@simonbackx/simple-errors';
|
|
4
4
|
import { Group, Token } from '@stamhoofd/models';
|
|
5
|
-
import type { Group as GroupStruct} from '@stamhoofd/structures';
|
|
5
|
+
import type { Group as GroupStruct } from '@stamhoofd/structures';
|
|
6
6
|
import { GroupStatus } from '@stamhoofd/structures';
|
|
7
7
|
|
|
8
8
|
import { AuthenticatedStructures } from '../../../../helpers/AuthenticatedStructures.js';
|
|
@@ -1,4 +1,4 @@
|
|
|
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 { Group } from '@stamhoofd/models';
|
|
4
4
|
import type { Group as GroupStruct } from '@stamhoofd/structures';
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { Request } from '@simonbackx/simple-endpoints';
|
|
2
|
-
import type { Organization, User, Webshop} from '@stamhoofd/models';
|
|
2
|
+
import type { Organization, User, Webshop } from '@stamhoofd/models';
|
|
3
3
|
import { GroupFactory, OrganizationFactory, OrganizationRegistrationPeriod, RegistrationPeriodFactory, Token, UserFactory, WebshopFactory } from '@stamhoofd/models';
|
|
4
4
|
import { AccessRight, MemberResponsibility, OrganizationPrivateMetaData, OrganizationRegistrationPeriod as OrganizationRegistrationPeriodStruct, Organization as OrganizationStruct, PermissionLevel, PermissionRoleDetailed, PermissionRoleForResponsibility, Permissions, PermissionsResourceType, ResourcePermissions, Version } from '@stamhoofd/structures';
|
|
5
5
|
|
|
6
|
-
import type { AutoEncoderPatchType, PatchableArrayAutoEncoder} from '@simonbackx/simple-encoding';
|
|
6
|
+
import type { AutoEncoderPatchType, PatchableArrayAutoEncoder } from '@simonbackx/simple-encoding';
|
|
7
7
|
import { PatchableArray, PatchMap } from '@simonbackx/simple-encoding';
|
|
8
8
|
import { STExpect, TestUtils } from '@stamhoofd/test-utils';
|
|
9
9
|
import { testServer } from '../../../../../tests/helpers/TestServer.js';
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import type { AutoEncoderPatchType, Decoder, PatchableArrayAutoEncoder} from '@simonbackx/simple-encoding';
|
|
1
|
+
import type { AutoEncoderPatchType, Decoder, PatchableArrayAutoEncoder } from '@simonbackx/simple-encoding';
|
|
2
2
|
import { cloneObject, isPatchableArray, isPatchMap, ObjectData, PatchableArray, PatchMap, patchObject } from '@simonbackx/simple-encoding';
|
|
3
|
-
import type { DecodedRequest, Request} from '@simonbackx/simple-endpoints';
|
|
3
|
+
import type { DecodedRequest, Request } from '@simonbackx/simple-endpoints';
|
|
4
4
|
import { Endpoint, Response } from '@simonbackx/simple-endpoints';
|
|
5
5
|
import { SimpleError, SimpleErrors } from '@simonbackx/simple-errors';
|
|
6
6
|
import { Organization, OrganizationRegistrationPeriod, PayconiqPayment, Platform, RegistrationPeriod, StripeAccount, Webshop } from '@stamhoofd/models';
|
|
7
|
-
import type { Company, PermissionsResourceType, ResourcePermissions} from '@stamhoofd/structures';
|
|
7
|
+
import type { Company, PermissionsResourceType, ResourcePermissions } from '@stamhoofd/structures';
|
|
8
8
|
import { BuckarooSettings, MemberResponsibility, OrganizationMetaData, Organization as OrganizationStruct, PayconiqAccount, PaymentMethod, PaymentMethodHelper, PermissionLevel, PermissionRoleDetailed, PermissionRoleForResponsibility, UitpasClientCredentialsStatus } from '@stamhoofd/structures';
|
|
9
9
|
import { Formatter } from '@stamhoofd/utility';
|
|
10
10
|
|
|
@@ -12,10 +12,13 @@ import { AuthenticatedStructures } from '../../../../helpers/AuthenticatedStruct
|
|
|
12
12
|
import { BuckarooHelper } from '../../../../helpers/BuckarooHelper.js';
|
|
13
13
|
import { Context } from '../../../../helpers/Context.js';
|
|
14
14
|
import { MemberUserSyncer } from '../../../../helpers/MemberUserSyncer.js';
|
|
15
|
+
import { RecordAnswerHelper } from '../../../../helpers/RecordAnswerHelper.js';
|
|
15
16
|
import { SetupStepUpdater } from '../../../../helpers/SetupStepUpdater.js';
|
|
16
17
|
import { TagHelper } from '../../../../helpers/TagHelper.js';
|
|
17
18
|
import { ViesHelper } from '../../../../helpers/ViesHelper.js';
|
|
18
19
|
import { UitpasService } from '../../../../services/uitpas/UitpasService.js';
|
|
20
|
+
import { VATService } from '../../../../services/VATService.js';
|
|
21
|
+
import { isAbortedError, isCanceledError } from '@stamhoofd/queues';
|
|
19
22
|
|
|
20
23
|
type Params = Record<string, never>;
|
|
21
24
|
type Query = undefined;
|
|
@@ -70,6 +73,7 @@ export class PatchOrganizationEndpoint extends Endpoint<Params, Query, Body, Res
|
|
|
70
73
|
|
|
71
74
|
const errors = new SimpleErrors();
|
|
72
75
|
let shouldUpdateSetupSteps = false;
|
|
76
|
+
let shouldUpdateVATExcempt = false;
|
|
73
77
|
let shouldUpdateUserPermissions = false;
|
|
74
78
|
let updateTags = false;
|
|
75
79
|
|
|
@@ -158,6 +162,7 @@ export class PatchOrganizationEndpoint extends Endpoint<Params, Query, Body, Res
|
|
|
158
162
|
organization.privateMeta.privateKey = request.body.privateMeta.privateKey ?? organization.privateMeta.privateKey;
|
|
159
163
|
organization.privateMeta.featureFlags = patchObject(organization.privateMeta.featureFlags, request.body.privateMeta.featureFlags);
|
|
160
164
|
organization.privateMeta.balanceNotificationSettings = patchObject(organization.privateMeta.balanceNotificationSettings, request.body.privateMeta.balanceNotificationSettings);
|
|
165
|
+
organization.privateMeta.invoiceSettings = patchObject(organization.privateMeta.invoiceSettings, request.body.privateMeta.invoiceSettings);
|
|
161
166
|
organization.privateMeta.recordAnswers = request.body.privateMeta.recordAnswers.applyTo(organization.privateMeta.recordAnswers);
|
|
162
167
|
|
|
163
168
|
if (request.body.privateMeta.responsibilities || request.body.privateMeta.roles) {
|
|
@@ -218,8 +223,7 @@ export class PatchOrganizationEndpoint extends Endpoint<Params, Query, Body, Res
|
|
|
218
223
|
if (request.body.privateMeta.buckarooSettings !== undefined) {
|
|
219
224
|
if (request.body.privateMeta.buckarooSettings === null) {
|
|
220
225
|
organization.privateMeta.buckarooSettings = null;
|
|
221
|
-
}
|
|
222
|
-
else {
|
|
226
|
+
} else {
|
|
223
227
|
organization.privateMeta.buckarooSettings = organization.privateMeta.buckarooSettings ?? BuckarooSettings.create({});
|
|
224
228
|
organization.privateMeta.buckarooSettings.patchOrPut(request.body.privateMeta.buckarooSettings);
|
|
225
229
|
|
|
@@ -251,16 +255,24 @@ export class PatchOrganizationEndpoint extends Endpoint<Params, Query, Body, Res
|
|
|
251
255
|
}
|
|
252
256
|
}
|
|
253
257
|
|
|
254
|
-
// Allow admin patches (permissions only atm). No put atm
|
|
255
|
-
if (request.body.admins) {
|
|
256
|
-
throw new Error('Temporary removed to keep code cleaner. Please use different endpoints.');
|
|
257
|
-
}
|
|
258
|
-
|
|
259
258
|
if (request.body.meta) {
|
|
260
259
|
if (request.body.meta.companies) {
|
|
261
260
|
await this.validateCompanies(organization, request.body.meta.companies);
|
|
262
261
|
shouldUpdateSetupSteps = true;
|
|
262
|
+
shouldUpdateVATExcempt = true;
|
|
263
263
|
}
|
|
264
|
+
|
|
265
|
+
if (request.body.meta.recordsConfiguration?.recordCategories) {
|
|
266
|
+
RecordAnswerHelper.throwIfPatchOrPutIsInvalid(organization.meta.recordsConfiguration.recordCategories, request.body.meta.recordsConfiguration.recordCategories);
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
if (request.body.meta.financialSupport) {
|
|
270
|
+
if (STAMHOOFD.userMode === 'platform') {
|
|
271
|
+
// can only set financial support settings on platform if userMode platform
|
|
272
|
+
request.body.meta.financialSupport = null;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
264
276
|
const savedPackages = organization.meta.packages;
|
|
265
277
|
organization.meta.patchOrPut(request.body.meta);
|
|
266
278
|
organization.meta.packages = savedPackages;
|
|
@@ -420,21 +432,37 @@ export class PatchOrganizationEndpoint extends Endpoint<Params, Query, Body, Res
|
|
|
420
432
|
throw new SimpleError({
|
|
421
433
|
code: 'invalid_field',
|
|
422
434
|
message: 'The period you want to set is already closed',
|
|
423
|
-
human: $t('%
|
|
435
|
+
human: $t('%1X8'),
|
|
424
436
|
field: 'period',
|
|
425
437
|
});
|
|
426
438
|
}
|
|
427
439
|
|
|
428
|
-
const
|
|
429
|
-
if (
|
|
440
|
+
const struct = period.getBaseStructure();
|
|
441
|
+
if (struct.switchDate && struct.switchDate > new Date()) {
|
|
430
442
|
throw new SimpleError({
|
|
431
443
|
code: 'invalid_field',
|
|
432
444
|
message: 'The period you want to set has not started yet',
|
|
433
|
-
human: $t('%
|
|
445
|
+
human: $t('%1ca', { date: Formatter.date(struct.switchDate) }),
|
|
434
446
|
field: 'period',
|
|
435
447
|
});
|
|
436
448
|
}
|
|
437
449
|
|
|
450
|
+
if (period.organizationId === null) {
|
|
451
|
+
// Not allowed to return to a period lower than the currently active platform period
|
|
452
|
+
const platform = await Platform.getShared();
|
|
453
|
+
const platformPeriod = await RegistrationPeriod.getByID(platform.periodId);
|
|
454
|
+
if (platformPeriod) {
|
|
455
|
+
if (period.startDate < platformPeriod.startDate) {
|
|
456
|
+
throw new SimpleError({
|
|
457
|
+
code: 'invalid_field',
|
|
458
|
+
message: 'Cannot return to period with a start date before the currently active platform period',
|
|
459
|
+
human: $t('%1Wt', {}),
|
|
460
|
+
field: 'period',
|
|
461
|
+
});
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
|
|
438
466
|
organization.periodId = period.id;
|
|
439
467
|
shouldUpdateSetupSteps = true;
|
|
440
468
|
}
|
|
@@ -442,8 +470,7 @@ export class PatchOrganizationEndpoint extends Endpoint<Params, Query, Body, Res
|
|
|
442
470
|
|
|
443
471
|
// Save the organization
|
|
444
472
|
await organization.save();
|
|
445
|
-
}
|
|
446
|
-
else {
|
|
473
|
+
} else {
|
|
447
474
|
if (request.body.name || request.body.address || request.body.website || request.body.meta?.companies || request.body.meta?.recordsConfiguration || request.body.meta?.registrationPaymentConfiguration) {
|
|
448
475
|
throw new SimpleError({
|
|
449
476
|
code: 'permission_denied',
|
|
@@ -605,12 +632,29 @@ export class PatchOrganizationEndpoint extends Endpoint<Params, Query, Body, Res
|
|
|
605
632
|
await SetupStepUpdater.updateForOrganization(organization);
|
|
606
633
|
}
|
|
607
634
|
|
|
635
|
+
if (shouldUpdateVATExcempt) {
|
|
636
|
+
const platform = await Platform.getShared();
|
|
637
|
+
const sellingOrganizationId = platform.membershipOrganizationId;
|
|
638
|
+
if (sellingOrganizationId) {
|
|
639
|
+
const sellingOrganization = await Organization.getByID(sellingOrganizationId, true);
|
|
640
|
+
|
|
641
|
+
await VATService.updateVATExcempt({
|
|
642
|
+
organization,
|
|
643
|
+
sellingOrganization,
|
|
644
|
+
});
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
|
|
608
648
|
if (shouldUpdateUserPermissions) {
|
|
609
649
|
await MemberUserSyncer.updatePermissionsForOrganization(organization.id);
|
|
610
650
|
}
|
|
611
651
|
|
|
612
652
|
if (updateTags) {
|
|
613
|
-
|
|
653
|
+
try {
|
|
654
|
+
await TagHelper.updateOrganizations();
|
|
655
|
+
} catch (e) {
|
|
656
|
+
if (!isAbortedError(e) && !isCanceledError(e)) throw e;
|
|
657
|
+
}
|
|
614
658
|
}
|
|
615
659
|
const struct = await AuthenticatedStructures.organization(organization);
|
|
616
660
|
return new Response(struct);
|
|
@@ -623,7 +667,11 @@ export class PatchOrganizationEndpoint extends Endpoint<Params, Query, Body, Res
|
|
|
623
667
|
const original = organization.meta.companies.find(c => c.id === patch.id);
|
|
624
668
|
|
|
625
669
|
if (!original) {
|
|
626
|
-
throw new
|
|
670
|
+
throw new SimpleError({
|
|
671
|
+
code: 'not_found',
|
|
672
|
+
message: 'Company not found',
|
|
673
|
+
human: $t('%1cw'),
|
|
674
|
+
});
|
|
627
675
|
}
|
|
628
676
|
|
|
629
677
|
// Changed VAT number
|
|
@@ -646,8 +694,7 @@ export class PatchOrganizationEndpoint extends Endpoint<Params, Query, Body, Res
|
|
|
646
694
|
|
|
647
695
|
await ViesHelper.checkCompany(put, put);
|
|
648
696
|
}
|
|
649
|
-
}
|
|
650
|
-
else {
|
|
697
|
+
} else {
|
|
651
698
|
if (companies.length > 5) {
|
|
652
699
|
throw new SimpleError({
|
|
653
700
|
code: 'invalid_field',
|
|
@@ -1,8 +1,8 @@
|
|
|
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 { UitpasService } from '../../../../services/uitpas/UitpasService.js';
|
|
4
4
|
import type { UitpasOrganizersResponse } from '@stamhoofd/structures';
|
|
5
|
-
import type { Decoder} from '@simonbackx/simple-encoding';
|
|
5
|
+
import type { Decoder } from '@simonbackx/simple-encoding';
|
|
6
6
|
import { AutoEncoder, field, StringDecoder } from '@simonbackx/simple-encoding';
|
|
7
7
|
import { Context } from '../../../../helpers/Context.js';
|
|
8
8
|
|
|
@@ -104,8 +104,7 @@ export class SetOrganizationDomainEndpoint extends Endpoint<Params, Query, Body,
|
|
|
104
104
|
// We set a custom domainname for webshops already
|
|
105
105
|
// This is not used at this moment
|
|
106
106
|
organization.privateMeta.mailFromDomain = defaultFromDomain;
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
107
|
+
} else {
|
|
109
108
|
// CNAME domain: for SPF + MX + A record
|
|
110
109
|
organization.privateMeta.mailFromDomain = organization.privateMeta.pendingRegisterDomain;
|
|
111
110
|
}
|
|
@@ -126,8 +125,7 @@ export class SetOrganizationDomainEndpoint extends Endpoint<Params, Query, Body,
|
|
|
126
125
|
value: (STAMHOOFD.domains.registrationCname[organization.address.country] ?? STAMHOOFD.domains.registrationCname['']) + '.',
|
|
127
126
|
}));
|
|
128
127
|
}
|
|
129
|
-
}
|
|
130
|
-
else {
|
|
128
|
+
} else {
|
|
131
129
|
organization.privateMeta.dnsRecords.push(DNSRecord.create({
|
|
132
130
|
type: DNSRecordType.CNAME,
|
|
133
131
|
name: organization.privateMeta.mailFromDomain + '.',
|
|
@@ -149,8 +147,7 @@ export class SetOrganizationDomainEndpoint extends Endpoint<Params, Query, Body,
|
|
|
149
147
|
|
|
150
148
|
organization.serverMeta.privateDKIMKey = priv;
|
|
151
149
|
organization.serverMeta.publicDKIMKey = pub;
|
|
152
|
-
}
|
|
153
|
-
else {
|
|
150
|
+
} else {
|
|
154
151
|
priv = organization.serverMeta.privateDKIMKey;
|
|
155
152
|
pub = organization.serverMeta.publicDKIMKey;
|
|
156
153
|
}
|
|
@@ -170,8 +167,7 @@ export class SetOrganizationDomainEndpoint extends Endpoint<Params, Query, Body,
|
|
|
170
167
|
description: $t(`%Ee`),
|
|
171
168
|
optional: true,
|
|
172
169
|
}));
|
|
173
|
-
}
|
|
174
|
-
else {
|
|
170
|
+
} else {
|
|
175
171
|
if (oldMailDomain) {
|
|
176
172
|
organization.deleteAWSMailIdenitity(oldMailDomain).catch(console.error);
|
|
177
173
|
}
|
|
@@ -189,8 +185,7 @@ export class SetOrganizationDomainEndpoint extends Endpoint<Params, Query, Body,
|
|
|
189
185
|
}
|
|
190
186
|
|
|
191
187
|
await organization.save();
|
|
192
|
-
}
|
|
193
|
-
else {
|
|
188
|
+
} else {
|
|
194
189
|
// Validate DNS-records if not empty
|
|
195
190
|
console.log('Validating domains');
|
|
196
191
|
await organization.updateDNSRecords();
|
package/src/endpoints/organization/dashboard/organization/SetUitpasClientCredentialsEndpoint.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { AutoEncoderPatchType, Decoder } from '@simonbackx/simple-encoding';
|
|
2
|
-
import type { DecodedRequest, Request} from '@simonbackx/simple-endpoints';
|
|
2
|
+
import type { DecodedRequest, Request } from '@simonbackx/simple-endpoints';
|
|
3
3
|
import { Endpoint, Response } from '@simonbackx/simple-endpoints';
|
|
4
4
|
import { SimpleError } from '@simonbackx/simple-errors';
|
|
5
5
|
import { UitpasClientCredentialsStatus, UitpasClientIdAndSecret, UitpasSetClientCredentialsResponse } from '@stamhoofd/structures';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Decoder } from '@simonbackx/simple-encoding';
|
|
2
|
-
import type { DecodedRequest, Request} from '@simonbackx/simple-endpoints';
|
|
2
|
+
import type { DecodedRequest, Request } from '@simonbackx/simple-endpoints';
|
|
3
3
|
import { Endpoint, Response } from '@simonbackx/simple-endpoints';
|
|
4
4
|
import { CountFilteredRequest, CountResponse } from '@stamhoofd/structures';
|
|
5
5
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { Decoder } from '@simonbackx/simple-encoding';
|
|
2
|
-
import type { DecodedRequest, Request} from '@simonbackx/simple-endpoints';
|
|
2
|
+
import type { DecodedRequest, Request } from '@simonbackx/simple-endpoints';
|
|
3
3
|
import { Endpoint, Response } from '@simonbackx/simple-endpoints';
|
|
4
4
|
import { SimpleError } from '@simonbackx/simple-errors';
|
|
5
5
|
import { Payment } from '@stamhoofd/models';
|
|
6
6
|
import { SQL, applySQLSorter, compileToSQLFilter } from '@stamhoofd/sql';
|
|
7
|
-
import type { CountFilteredRequest, PaymentGeneral, StamhoofdFilter} from '@stamhoofd/structures';
|
|
7
|
+
import type { CountFilteredRequest, PaymentGeneral, StamhoofdFilter } from '@stamhoofd/structures';
|
|
8
8
|
import { LimitedFilteredRequest, PaginatedResponse, TransferSettings, assertSort, getSortFilter } from '@stamhoofd/structures';
|
|
9
9
|
|
|
10
10
|
import type { SQLResultNamespacedRow } from '@simonbackx/simple-database';
|
|
@@ -167,8 +167,7 @@ export class GetPaymentsEndpoint extends Endpoint<Params, Query, Body, ResponseB
|
|
|
167
167
|
|
|
168
168
|
try {
|
|
169
169
|
data = await query.fetch();
|
|
170
|
-
}
|
|
171
|
-
catch (error) {
|
|
170
|
+
} catch (error) {
|
|
172
171
|
if (error.message.includes('ER_QUERY_TIMEOUT')) {
|
|
173
172
|
throw new SimpleError({
|
|
174
173
|
code: 'timeout',
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { AutoEncoderPatchType, Decoder, PatchableArrayAutoEncoder} from '@simonbackx/simple-encoding';
|
|
1
|
+
import type { AutoEncoderPatchType, Decoder, PatchableArrayAutoEncoder } from '@simonbackx/simple-encoding';
|
|
2
2
|
import { PatchableArrayDecoder, patchObject, StringDecoder } from '@simonbackx/simple-encoding';
|
|
3
|
-
import type { DecodedRequest, Request} from '@simonbackx/simple-endpoints';
|
|
3
|
+
import type { DecodedRequest, Request } from '@simonbackx/simple-endpoints';
|
|
4
4
|
import { Endpoint, Response } from '@simonbackx/simple-endpoints';
|
|
5
5
|
import { SimpleError } from '@simonbackx/simple-errors';
|
|
6
6
|
import { BalanceItem, BalanceItemPayment, Payment, User } from '@stamhoofd/models';
|
|
@@ -40,7 +40,7 @@ export class PatchPaymentsEndpoint extends Endpoint<Params, Query, Body, Respons
|
|
|
40
40
|
|
|
41
41
|
async handle(request: DecodedRequest<Params, Query, Body>) {
|
|
42
42
|
const organization = await Context.setOrganizationScope();
|
|
43
|
-
await Context.authenticate();
|
|
43
|
+
const { user } = await Context.authenticate();
|
|
44
44
|
|
|
45
45
|
if (!await Context.auth.hasSomeAccess(organization.id)) {
|
|
46
46
|
throw Context.auth.error();
|
|
@@ -74,6 +74,7 @@ export class PatchPaymentsEndpoint extends Endpoint<Params, Query, Body, Respons
|
|
|
74
74
|
payment.status = PaymentStatus.Created;
|
|
75
75
|
payment.method = put.method;
|
|
76
76
|
payment.customer = put.customer;
|
|
77
|
+
payment.adminUserId = user.id;
|
|
77
78
|
|
|
78
79
|
const payingOrganizationId = put.payingOrganizationId ?? put.payingOrganization?.id ?? null;
|
|
79
80
|
|
|
@@ -81,8 +82,7 @@ export class PatchPaymentsEndpoint extends Endpoint<Params, Query, Body, Respons
|
|
|
81
82
|
if (Context.auth.hasSomePlatformAccess()) {
|
|
82
83
|
if (await Context.auth.hasFullAccess(payingOrganizationId, PermissionLevel.Full)) {
|
|
83
84
|
payment.payingOrganizationId = payingOrganizationId;
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
85
|
+
} else {
|
|
86
86
|
// silently ignore
|
|
87
87
|
}
|
|
88
88
|
}
|
|
@@ -166,7 +166,7 @@ export class PatchPaymentsEndpoint extends Endpoint<Params, Query, Body, Respons
|
|
|
166
166
|
// Check total price
|
|
167
167
|
const totalPrice = balanceItemPayments.reduce((total, item) => total + item.price, 0);
|
|
168
168
|
payment.price = totalPrice;
|
|
169
|
-
PaymentService.
|
|
169
|
+
PaymentService.roundPayment(payment);
|
|
170
170
|
|
|
171
171
|
switch (payment.type) {
|
|
172
172
|
case PaymentType.Payment: {
|
|
@@ -233,8 +233,7 @@ export class PatchPaymentsEndpoint extends Endpoint<Params, Query, Body, Respons
|
|
|
233
233
|
payment.paidAt = put.paidAt;
|
|
234
234
|
await payment.save();
|
|
235
235
|
}
|
|
236
|
-
}
|
|
237
|
-
else {
|
|
236
|
+
} else {
|
|
238
237
|
for (const balanceItem of balanceItems) {
|
|
239
238
|
await BalanceItemService.markUpdated(balanceItem, payment, organization);
|
|
240
239
|
}
|
|
@@ -255,8 +254,18 @@ export class PatchPaymentsEndpoint extends Endpoint<Params, Query, Body, Respons
|
|
|
255
254
|
});
|
|
256
255
|
}
|
|
257
256
|
|
|
258
|
-
if (patch.method || patch.paidAt !== undefined
|
|
259
|
-
if (
|
|
257
|
+
if (patch.method || patch.paidAt !== undefined) {
|
|
258
|
+
if (![PaymentMethod.Unknown, PaymentMethod.Transfer, PaymentMethod.PointOfSale].includes(payment.method)) {
|
|
259
|
+
throw new SimpleError({
|
|
260
|
+
code: 'invalid_field',
|
|
261
|
+
message: 'Invalid payment method',
|
|
262
|
+
human: $t(`%Ex`),
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
if (patch.status !== undefined && patch.status !== payment.status) {
|
|
268
|
+
if (!payment.canChangeStatus) {
|
|
260
269
|
throw new SimpleError({
|
|
261
270
|
code: 'invalid_field',
|
|
262
271
|
message: 'Invalid payment method',
|
|
@@ -268,8 +277,7 @@ export class PatchPaymentsEndpoint extends Endpoint<Params, Query, Body, Respons
|
|
|
268
277
|
if (patch.transferSettings && payment.method == PaymentMethod.Transfer) {
|
|
269
278
|
if (patch.transferSettings.isPut()) {
|
|
270
279
|
payment.transferSettings = patch.transferSettings;
|
|
271
|
-
}
|
|
272
|
-
else if (payment.transferSettings !== null) {
|
|
280
|
+
} else if (payment.transferSettings !== null) {
|
|
273
281
|
payment.transferSettings = payment.transferSettings.patch(patch.transferSettings);
|
|
274
282
|
}
|
|
275
283
|
}
|
|
@@ -301,8 +309,8 @@ export class PatchPaymentsEndpoint extends Endpoint<Params, Query, Body, Respons
|
|
|
301
309
|
payment.paidAt = patch.paidAt;
|
|
302
310
|
}
|
|
303
311
|
|
|
304
|
-
if (patch.customer) {
|
|
305
|
-
|
|
312
|
+
if (patch.customer !== undefined) {
|
|
313
|
+
payment.customer = patchObject(payment.customer, patch.customer, { getDefaultValue: () => PaymentCustomer.create({}) });
|
|
306
314
|
}
|
|
307
315
|
|
|
308
316
|
const payingOrganizationId = patch.payingOrganizationId ?? patch.payingOrganization?.id ?? null;
|
|
@@ -311,8 +319,7 @@ export class PatchPaymentsEndpoint extends Endpoint<Params, Query, Body, Respons
|
|
|
311
319
|
if (Context.auth.hasSomePlatformAccess()) {
|
|
312
320
|
if (await Context.auth.hasFullAccess(payingOrganizationId, PermissionLevel.Full)) {
|
|
313
321
|
payment.payingOrganizationId = payingOrganizationId;
|
|
314
|
-
}
|
|
315
|
-
else {
|
|
322
|
+
} else {
|
|
316
323
|
// silently ignore
|
|
317
324
|
}
|
|
318
325
|
}
|
|
@@ -335,7 +342,7 @@ export class PatchPaymentsEndpoint extends Endpoint<Params, Query, Body, Respons
|
|
|
335
342
|
|
|
336
343
|
await payment.save();
|
|
337
344
|
|
|
338
|
-
if (patch.status) {
|
|
345
|
+
if (patch.status && patch.status !== payment.status) {
|
|
339
346
|
await PaymentService.handlePaymentStatusUpdate(payment, organization, patch.status);
|
|
340
347
|
}
|
|
341
348
|
|