@stamhoofd/backend 2.39.1 → 2.40.1
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/eslint.config.mjs +5 -0
- package/index.ts +81 -74
- package/jest.config.cjs +10 -0
- package/migrations.ts +16 -14
- package/package.json +11 -11
- package/src/crons/clear-excel-cache.test.ts +48 -50
- package/src/crons/clear-excel-cache.ts +18 -18
- package/src/crons/setup-steps.ts +2 -2
- package/src/crons.ts +325 -306
- package/src/decoders/StringArrayDecoder.ts +7 -7
- package/src/decoders/StringNullableDecoder.ts +1 -2
- package/src/email-recipient-loaders/members.ts +22 -22
- package/src/endpoints/admin/memberships/ChargeMembershipsEndpoint.ts +8 -9
- package/src/endpoints/admin/memberships/GetChargeMembershipsSummaryEndpoint.ts +39 -40
- package/src/endpoints/admin/organizations/GetOrganizationsCountEndpoint.ts +8 -8
- package/src/endpoints/admin/organizations/GetOrganizationsEndpoint.ts +44 -45
- package/src/endpoints/admin/organizations/PatchOrganizationsEndpoint.ts +58 -57
- package/src/endpoints/auth/CreateAdminEndpoint.ts +48 -45
- package/src/endpoints/auth/CreateTokenEndpoint.test.ts +31 -31
- package/src/endpoints/auth/CreateTokenEndpoint.ts +146 -147
- package/src/endpoints/auth/DeleteTokenEndpoint.ts +7 -7
- package/src/endpoints/auth/DeleteUserEndpoint.ts +15 -15
- package/src/endpoints/auth/ForgotPasswordEndpoint.ts +17 -18
- package/src/endpoints/auth/GetOtherUserEndpoint.ts +9 -10
- package/src/endpoints/auth/GetUserEndpoint.test.ts +32 -35
- package/src/endpoints/auth/GetUserEndpoint.ts +5 -6
- package/src/endpoints/auth/PatchApiUserEndpoint.ts +35 -33
- package/src/endpoints/auth/PatchUserEndpoint.ts +55 -52
- package/src/endpoints/auth/PollEmailVerificationEndpoint.ts +9 -9
- package/src/endpoints/auth/RetryEmailVerificationEndpoint.ts +8 -8
- package/src/endpoints/auth/SignupEndpoint.ts +37 -36
- package/src/endpoints/auth/VerifyEmailEndpoint.ts +29 -28
- package/src/endpoints/global/addresses/SearchRegionsEndpoint.ts +33 -33
- package/src/endpoints/global/addresses/ValidateAddressEndpoint.ts +7 -7
- package/src/endpoints/global/caddy/CheckDomainCertEndpoint.ts +37 -37
- package/src/endpoints/global/email/CreateEmailEndpoint.ts +30 -30
- package/src/endpoints/global/email/GetEmailAddressEndpoint.ts +13 -13
- package/src/endpoints/global/email/GetEmailEndpoint.ts +13 -13
- package/src/endpoints/global/email/ManageEmailAddressEndpoint.ts +16 -16
- package/src/endpoints/global/email/PatchEmailEndpoint.ts +25 -25
- package/src/endpoints/global/events/GetEventsEndpoint.ts +43 -44
- package/src/endpoints/global/events/PatchEventsEndpoint.ts +127 -172
- package/src/endpoints/global/files/ExportToExcelEndpoint.ts +49 -50
- package/src/endpoints/global/files/GetFileCache.ts +13 -13
- package/src/endpoints/global/files/UploadFile.ts +51 -54
- package/src/endpoints/global/files/UploadImage.ts +53 -53
- package/src/endpoints/global/groups/GetGroupsEndpoint.ts +25 -25
- package/src/endpoints/global/members/GetMemberFamilyEndpoint.ts +24 -23
- package/src/endpoints/global/members/GetMembersCountEndpoint.ts +8 -8
- package/src/endpoints/global/members/GetMembersEndpoint.ts +105 -102
- package/src/endpoints/global/members/PatchOrganizationMembersEndpoint.ts +240 -239
- package/src/endpoints/global/organizations/CheckRegisterCodeEndpoint.ts +12 -14
- package/src/endpoints/global/organizations/CreateOrganizationEndpoint.test.ts +32 -33
- package/src/endpoints/global/organizations/CreateOrganizationEndpoint.ts +48 -57
- package/src/endpoints/global/organizations/GetOrganizationFromDomainEndpoint.test.ts +21 -22
- package/src/endpoints/global/organizations/GetOrganizationFromDomainEndpoint.ts +28 -28
- package/src/endpoints/global/organizations/GetOrganizationFromUriEndpoint.ts +18 -18
- package/src/endpoints/global/organizations/SearchOrganizationEndpoint.test.ts +20 -20
- package/src/endpoints/global/organizations/SearchOrganizationEndpoint.ts +17 -17
- package/src/endpoints/global/payments/StripeWebhookEndpoint.ts +81 -75
- package/src/endpoints/global/platform/GetPlatformAdminsEndpoint.ts +14 -14
- package/src/endpoints/global/platform/GetPlatformEnpoint.ts +11 -11
- package/src/endpoints/global/platform/PatchPlatformEnpoint.ts +71 -68
- package/src/endpoints/global/registration/GetPaymentRegistrations.ts +27 -27
- package/src/endpoints/global/registration/GetUserBillingStatusEndpoint.ts +30 -30
- package/src/endpoints/global/registration/GetUserDetailedBillingStatusEndpoint.ts +34 -34
- package/src/endpoints/global/registration/GetUserDocumentsEndpoint.ts +26 -26
- package/src/endpoints/global/registration/GetUserMembersEndpoint.ts +12 -12
- package/src/endpoints/global/registration/PatchUserMembersEndpoint.ts +90 -90
- package/src/endpoints/global/registration/RegisterMembersEndpoint.test.ts +118 -121
- package/src/endpoints/global/registration/RegisterMembersEndpoint.ts +362 -350
- package/src/endpoints/global/registration-periods/GetRegistrationPeriodsEndpoint.ts +8 -9
- package/src/endpoints/global/registration-periods/PatchRegistrationPeriodsEndpoint.ts +21 -21
- package/src/endpoints/global/webshops/GetWebshopFromDomainEndpoint.ts +65 -65
- package/src/endpoints/organization/dashboard/billing/GetOrganizationBillingStatusEndpoint.ts +9 -9
- package/src/endpoints/organization/dashboard/billing/GetOrganizationDetailedBillingStatusEndpoint.ts +14 -14
- package/src/endpoints/organization/dashboard/documents/GetDocumentTemplateXML.ts +17 -17
- package/src/endpoints/organization/dashboard/documents/GetDocumentTemplatesEndpoint.ts +21 -21
- package/src/endpoints/organization/dashboard/documents/GetDocumentsEndpoint.ts +15 -15
- package/src/endpoints/organization/dashboard/documents/PatchDocumentEndpoint.ts +52 -52
- package/src/endpoints/organization/dashboard/documents/PatchDocumentTemplateEndpoint.ts +37 -37
- package/src/endpoints/organization/dashboard/email/CheckEmailBouncesEndpoint.ts +14 -14
- package/src/endpoints/organization/dashboard/email/EmailEndpoint.ts +113 -112
- package/src/endpoints/organization/dashboard/email-templates/GetEmailTemplatesEndpoint.ts +29 -29
- package/src/endpoints/organization/dashboard/email-templates/PatchEmailTemplatesEndpoint.ts +48 -47
- package/src/endpoints/organization/dashboard/mollie/CheckMollieEndpoint.ts +22 -21
- package/src/endpoints/organization/dashboard/mollie/ConnectMollieEndpoint.ts +13 -14
- package/src/endpoints/organization/dashboard/mollie/DisconnectMollieEndpoint.ts +12 -13
- package/src/endpoints/organization/dashboard/mollie/GetMollieDashboardEndpoint.ts +24 -24
- package/src/endpoints/organization/dashboard/nolt/CreateNoltTokenEndpoint.ts +10 -12
- package/src/endpoints/organization/dashboard/organization/GetOrganizationArchivedGroups.ts +14 -14
- package/src/endpoints/organization/dashboard/organization/GetOrganizationDeletedGroups.ts +13 -13
- package/src/endpoints/organization/dashboard/organization/GetOrganizationSSOEndpoint.ts +12 -12
- package/src/endpoints/organization/dashboard/organization/PatchOrganizationEndpoint.test.ts +120 -124
- package/src/endpoints/organization/dashboard/organization/PatchOrganizationEndpoint.ts +172 -173
- package/src/endpoints/organization/dashboard/organization/SetOrganizationDomainEndpoint.ts +88 -89
- package/src/endpoints/organization/dashboard/organization/SetOrganizationSSOEndpoint.ts +12 -12
- package/src/endpoints/organization/dashboard/payments/GetMemberBalanceEndpoint.ts +17 -17
- package/src/endpoints/organization/dashboard/payments/GetPaymentsCountEndpoint.ts +8 -8
- package/src/endpoints/organization/dashboard/payments/GetPaymentsEndpoint.ts +66 -67
- package/src/endpoints/organization/dashboard/payments/PatchBalanceItemsEndpoint.ts +47 -47
- package/src/endpoints/organization/dashboard/payments/PatchPaymentsEndpoint.ts +93 -91
- package/src/endpoints/organization/dashboard/registration-periods/GetOrganizationRegistrationPeriodsEndpoint.ts +16 -17
- package/src/endpoints/organization/dashboard/registration-periods/PatchOrganizationRegistrationPeriodsEndpoint.ts +170 -167
- package/src/endpoints/organization/dashboard/registration-periods/SetupStepReviewEndpoint.ts +25 -24
- package/src/endpoints/organization/dashboard/stripe/ConnectStripeEndpoint.ts +22 -23
- package/src/endpoints/organization/dashboard/stripe/DeleteStripeAccountEndpoint.ts +22 -22
- package/src/endpoints/organization/dashboard/stripe/GetStripeAccountLinkEndpoint.ts +17 -18
- package/src/endpoints/organization/dashboard/stripe/GetStripeAccountsEndpoint.ts +8 -9
- package/src/endpoints/organization/dashboard/stripe/GetStripeLoginLinkEndpoint.ts +17 -18
- package/src/endpoints/organization/dashboard/stripe/UpdateStripeAccountEndpoint.ts +14 -15
- package/src/endpoints/organization/dashboard/users/CreateApiUserEndpoint.ts +19 -19
- package/src/endpoints/organization/dashboard/users/DeleteUserEndpoint.ts +19 -19
- package/src/endpoints/organization/dashboard/users/GetApiUsersEndpoint.ts +14 -14
- package/src/endpoints/organization/dashboard/users/GetOrganizationAdminsEndpoint.ts +12 -12
- package/src/endpoints/organization/dashboard/webshops/CreateWebshopEndpoint.ts +103 -100
- package/src/endpoints/organization/dashboard/webshops/DeleteWebshopEndpoint.ts +11 -12
- package/src/endpoints/organization/dashboard/webshops/GetDiscountCodesEndpoint.ts +15 -15
- package/src/endpoints/organization/dashboard/webshops/GetWebshopOrdersEndpoint.ts +14 -14
- package/src/endpoints/organization/dashboard/webshops/GetWebshopTicketsEndpoint.ts +14 -14
- package/src/endpoints/organization/dashboard/webshops/GetWebshopUriAvailabilityEndpoint.ts +23 -23
- package/src/endpoints/organization/dashboard/webshops/PatchDiscountCodesEndpoint.ts +54 -52
- package/src/endpoints/organization/dashboard/webshops/PatchWebshopEndpoint.ts +84 -81
- package/src/endpoints/organization/dashboard/webshops/PatchWebshopOrdersEndpoint.ts +120 -111
- package/src/endpoints/organization/dashboard/webshops/PatchWebshopTicketsEndpoint.ts +24 -24
- package/src/endpoints/organization/dashboard/webshops/VerifyWebshopDomainEndpoint.ts +18 -18
- package/src/endpoints/organization/shared/ExchangePaymentEndpoint.ts +141 -130
- package/src/endpoints/organization/shared/GetDocumentHtml.ts +25 -25
- package/src/endpoints/organization/shared/GetPaymentEndpoint.ts +18 -18
- package/src/endpoints/organization/shared/auth/GetOrganizationEndpoint.test.ts +36 -37
- package/src/endpoints/organization/shared/auth/GetOrganizationEndpoint.ts +9 -9
- package/src/endpoints/organization/shared/auth/OpenIDConnectCallbackEndpoint.ts +11 -11
- package/src/endpoints/organization/shared/auth/OpenIDConnectStartEndpoint.ts +28 -27
- package/src/endpoints/organization/webshops/CheckWebshopDiscountCodesEndpoint.ts +20 -20
- package/src/endpoints/organization/webshops/GetOrderByPaymentEndpoint.ts +22 -22
- package/src/endpoints/organization/webshops/GetOrderEndpoint.ts +14 -14
- package/src/endpoints/organization/webshops/GetTicketsEndpoint.ts +57 -56
- package/src/endpoints/organization/webshops/GetWebshopEndpoint.test.ts +65 -66
- package/src/endpoints/organization/webshops/GetWebshopEndpoint.ts +18 -17
- package/src/endpoints/organization/webshops/PlaceOrderEndpoint.test.ts +124 -128
- package/src/endpoints/organization/webshops/PlaceOrderEndpoint.ts +154 -145
- package/src/excel-loaders/members.ts +275 -273
- package/src/excel-loaders/payments.ts +155 -156
- package/src/helpers/AddressValidator.test.ts +32 -32
- package/src/helpers/AddressValidator.ts +128 -122
- package/src/helpers/AdminPermissionChecker.ts +339 -236
- package/src/helpers/AuthenticatedStructures.ts +233 -134
- package/src/helpers/BuckarooHelper.ts +134 -134
- package/src/helpers/CheckSettlements.ts +94 -88
- package/src/helpers/Context.ts +87 -86
- package/src/helpers/CookieHelper.ts +23 -22
- package/src/helpers/EmailResumer.ts +10 -10
- package/src/helpers/FileCache.ts +62 -62
- package/src/helpers/ForwardHandler.test.ts +122 -124
- package/src/helpers/ForwardHandler.ts +76 -70
- package/src/helpers/MemberUserSyncer.ts +101 -96
- package/src/helpers/MembershipCharger.ts +69 -69
- package/src/helpers/MembershipHelper.ts +11 -12
- package/src/helpers/OpenIDConnectHelper.ts +85 -82
- package/src/helpers/PeriodHelper.ts +65 -70
- package/src/helpers/StripeHelper.ts +146 -137
- package/src/helpers/StripePayoutChecker.ts +51 -52
- package/src/helpers/ViesHelper.ts +46 -44
- package/src/helpers/fetchToAsyncIterator.ts +14 -14
- package/src/helpers/xlsxAddressTransformerColumnFactory.ts +58 -60
- package/src/middleware/ContextMiddleware.ts +5 -5
- package/src/migrations/1646578856-validate-addresses.ts +6 -9
- package/src/seeds/0000000000-example.ts +3 -5
- package/src/seeds/1715028563-user-permissions.ts +16 -18
- package/src/seeds/1722256498-group-update-occupancy.ts +12 -12
- package/src/seeds/1722344162-sync-member-users.ts +14 -15
- package/src/seeds/1722344162-update-membership.ts +6 -6
- package/src/seeds/1726055544-balance-item-paid.ts +4 -4
- package/src/seeds/1726055545-balance-item-pending.ts +4 -4
- package/src/seeds/1726494419-update-cached-outstanding-balance.ts +16 -16
- package/src/seeds/1726494420-update-cached-outstanding-balance-from-items.ts +12 -12
- package/src/seeds/1726572303-schedule-stock-updates.ts +12 -12
- package/src/seeds/1726847064-setup-steps.ts +16 -0
- package/src/sql-filters/balance-item-payments.ts +7 -7
- package/src/sql-filters/events.ts +14 -14
- package/src/sql-filters/members.ts +96 -96
- package/src/sql-filters/organizations.ts +139 -75
- package/src/sql-filters/payments.ts +28 -28
- package/src/sql-filters/registrations.ts +14 -14
- package/src/sql-sorters/events.ts +25 -25
- package/src/sql-sorters/members.ts +26 -26
- package/src/sql-sorters/organizations.ts +36 -36
- package/src/sql-sorters/payments.ts +26 -26
- package/tests/e2e/stock.test.ts +616 -621
- package/tests/e2e/tickets.test.ts +255 -260
- package/tests/helpers/StripeMocker.ts +177 -179
- package/tests/helpers/TestServer.ts +9 -9
- package/tests/jest.global.setup.ts +14 -13
- package/tests/jest.setup.ts +33 -32
- package/.eslintrc.js +0 -61
- package/jest.config.js +0 -11
- package/src/helpers/SetupStepsUpdater.ts +0 -359
- package/src/seeds/1724076679-setup-steps.ts +0 -16
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { AutoEncoderPatchType, Decoder, PatchableArrayAutoEncoder, PatchableArrayDecoder, StringDecoder } from '@simonbackx/simple-encoding';
|
|
2
|
-
import { DecodedRequest, Endpoint, Request, Response } from
|
|
3
|
-
import { SimpleError } from
|
|
2
|
+
import { DecodedRequest, Endpoint, Request, Response } from '@simonbackx/simple-endpoints';
|
|
3
|
+
import { SimpleError } from '@simonbackx/simple-errors';
|
|
4
4
|
import { BalanceItem, BalanceItemPayment, Payment, Token } from '@stamhoofd/models';
|
|
5
5
|
import { QueueHandler } from '@stamhoofd/queues';
|
|
6
|
-
import { Payment as PaymentStruct, PaymentGeneral, PaymentMethod, PaymentStatus, PermissionLevel } from
|
|
6
|
+
import { Payment as PaymentStruct, PaymentGeneral, PaymentMethod, PaymentStatus, PermissionLevel } from '@stamhoofd/structures';
|
|
7
7
|
|
|
8
8
|
import { AuthenticatedStructures } from '../../../../helpers/AuthenticatedStructures';
|
|
9
9
|
import { Context } from '../../../../helpers/Context';
|
|
@@ -11,22 +11,22 @@ import { ExchangePaymentEndpoint } from '../../shared/ExchangePaymentEndpoint';
|
|
|
11
11
|
|
|
12
12
|
type Params = Record<string, never>;
|
|
13
13
|
type Query = undefined;
|
|
14
|
-
type Body = PatchableArrayAutoEncoder<PaymentGeneral
|
|
15
|
-
type ResponseBody = PaymentGeneral[]
|
|
14
|
+
type Body = PatchableArrayAutoEncoder<PaymentGeneral>;
|
|
15
|
+
type ResponseBody = PaymentGeneral[];
|
|
16
16
|
|
|
17
17
|
/**
|
|
18
18
|
* One endpoint to create, patch and delete groups. Usefull because on organization setup, we need to create multiple groups at once. Also, sometimes we need to link values and update multiple groups at once
|
|
19
19
|
*/
|
|
20
20
|
|
|
21
21
|
export class PatchPaymentsEndpoint extends Endpoint<Params, Query, Body, ResponseBody> {
|
|
22
|
-
bodyDecoder = new PatchableArrayDecoder(PaymentGeneral as Decoder<PaymentGeneral>, PaymentStruct.patchType() as Decoder<AutoEncoderPatchType<PaymentGeneral>>, StringDecoder)
|
|
22
|
+
bodyDecoder = new PatchableArrayDecoder(PaymentGeneral as Decoder<PaymentGeneral>, PaymentStruct.patchType() as Decoder<AutoEncoderPatchType<PaymentGeneral>>, StringDecoder);
|
|
23
23
|
|
|
24
24
|
protected doesMatch(request: Request): [true, Params] | [false] {
|
|
25
|
-
if (request.method
|
|
25
|
+
if (request.method !== 'PATCH') {
|
|
26
26
|
return [false];
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
-
const params = Endpoint.parseParameters(request.url,
|
|
29
|
+
const params = Endpoint.parseParameters(request.url, '/organization/payments', {});
|
|
30
30
|
|
|
31
31
|
if (params) {
|
|
32
32
|
return [true, params as Params];
|
|
@@ -36,201 +36,203 @@ export class PatchPaymentsEndpoint extends Endpoint<Params, Query, Body, Respons
|
|
|
36
36
|
|
|
37
37
|
async handle(request: DecodedRequest<Params, Query, Body>) {
|
|
38
38
|
const organization = await Context.setOrganizationScope();
|
|
39
|
-
await Context.authenticate()
|
|
39
|
+
await Context.authenticate();
|
|
40
40
|
|
|
41
41
|
if (!await Context.auth.hasSomeAccess(organization.id)) {
|
|
42
|
-
throw Context.auth.error()
|
|
42
|
+
throw Context.auth.error();
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
-
const changedPayments: Payment[] = []
|
|
45
|
+
const changedPayments: Payment[] = [];
|
|
46
46
|
|
|
47
47
|
// Modify payments
|
|
48
|
-
for (const {put} of request.body.getPuts()) {
|
|
48
|
+
for (const { put } of request.body.getPuts()) {
|
|
49
49
|
// Create a new payment
|
|
50
50
|
if (put.balanceItemPayments.length == 0) {
|
|
51
51
|
throw new SimpleError({
|
|
52
|
-
code:
|
|
53
|
-
message:
|
|
54
|
-
human:
|
|
55
|
-
field:
|
|
56
|
-
})
|
|
52
|
+
code: 'invalid_field',
|
|
53
|
+
message: 'You need to add at least one balance item payment',
|
|
54
|
+
human: 'Een betaling moet ten minste één afrekening bevatten voor een openstaande rekening.',
|
|
55
|
+
field: 'balanceItemPayments',
|
|
56
|
+
});
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
if (![PaymentMethod.Unknown, PaymentMethod.Transfer, PaymentMethod.PointOfSale].includes(put.method)) {
|
|
60
60
|
throw new SimpleError({
|
|
61
|
-
code:
|
|
62
|
-
message:
|
|
63
|
-
human:
|
|
64
|
-
field:
|
|
65
|
-
})
|
|
61
|
+
code: 'invalid_field',
|
|
62
|
+
message: 'Invalid payment method',
|
|
63
|
+
human: 'Je kan zelf geen online betalingen aanmaken',
|
|
64
|
+
field: 'method',
|
|
65
|
+
});
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
-
const payment = new Payment()
|
|
69
|
-
payment.organizationId = organization.id
|
|
70
|
-
payment.status = PaymentStatus.Created
|
|
71
|
-
payment.method = put.method
|
|
72
|
-
payment.customer = put.customer
|
|
68
|
+
const payment = new Payment();
|
|
69
|
+
payment.organizationId = organization.id;
|
|
70
|
+
payment.status = PaymentStatus.Created;
|
|
71
|
+
payment.method = put.method;
|
|
72
|
+
payment.customer = put.customer;
|
|
73
73
|
|
|
74
74
|
if (payment.method == PaymentMethod.Transfer) {
|
|
75
75
|
if (!put.transferSettings) {
|
|
76
76
|
throw new SimpleError({
|
|
77
|
-
code:
|
|
78
|
-
message:
|
|
79
|
-
human:
|
|
80
|
-
field:
|
|
81
|
-
})
|
|
77
|
+
code: 'invalid_field',
|
|
78
|
+
message: 'Transfer settings are required',
|
|
79
|
+
human: 'Je moet de overschrijvingsdetails invullen',
|
|
80
|
+
field: 'transferSettings',
|
|
81
|
+
});
|
|
82
82
|
}
|
|
83
83
|
|
|
84
|
-
payment.transferSettings = put.transferSettings
|
|
84
|
+
payment.transferSettings = put.transferSettings;
|
|
85
85
|
|
|
86
86
|
if (!put.transferDescription) {
|
|
87
87
|
throw new SimpleError({
|
|
88
|
-
code:
|
|
89
|
-
message:
|
|
90
|
-
human:
|
|
91
|
-
field:
|
|
92
|
-
})
|
|
88
|
+
code: 'invalid_field',
|
|
89
|
+
message: 'Transfer description is required',
|
|
90
|
+
human: 'Je moet een mededeling invullen voor de overschrijving',
|
|
91
|
+
field: 'transferDescription',
|
|
92
|
+
});
|
|
93
93
|
}
|
|
94
94
|
|
|
95
|
-
payment.transferDescription = put.transferDescription
|
|
95
|
+
payment.transferDescription = put.transferDescription;
|
|
96
96
|
}
|
|
97
97
|
|
|
98
|
-
const balanceItems: BalanceItem[] = []
|
|
98
|
+
const balanceItems: BalanceItem[] = [];
|
|
99
99
|
const balanceItemPayments: BalanceItemPayment[] = [];
|
|
100
100
|
|
|
101
101
|
for (const item of put.balanceItemPayments) {
|
|
102
|
-
const balanceItem = await BalanceItem.getByID(item.balanceItem.id)
|
|
102
|
+
const balanceItem = await BalanceItem.getByID(item.balanceItem.id);
|
|
103
103
|
if (!balanceItem || balanceItem.organizationId !== organization.id) {
|
|
104
|
-
throw Context.auth.notFoundOrNoAccess(
|
|
104
|
+
throw Context.auth.notFoundOrNoAccess('Eén van de afrekeningen die je wilde markeren als betaald bestaat niet (meer).');
|
|
105
105
|
}
|
|
106
|
-
balanceItems.push(balanceItem)
|
|
106
|
+
balanceItems.push(balanceItem);
|
|
107
107
|
|
|
108
108
|
// Create payment
|
|
109
|
-
const balanceItemPayment = new BalanceItemPayment()
|
|
110
|
-
balanceItemPayment.organizationId = organization.id
|
|
111
|
-
balanceItemPayment.balanceItemId = balanceItem.id
|
|
112
|
-
balanceItemPayment.price = item.price
|
|
113
|
-
balanceItemPayments.push(balanceItemPayment)
|
|
109
|
+
const balanceItemPayment = new BalanceItemPayment();
|
|
110
|
+
balanceItemPayment.organizationId = organization.id;
|
|
111
|
+
balanceItemPayment.balanceItemId = balanceItem.id;
|
|
112
|
+
balanceItemPayment.price = item.price;
|
|
113
|
+
balanceItemPayments.push(balanceItemPayment);
|
|
114
114
|
}
|
|
115
115
|
|
|
116
116
|
// Check permissions
|
|
117
117
|
if (!(await Context.auth.canAccessBalanceItems(balanceItems, PermissionLevel.Write))) {
|
|
118
|
-
throw Context.auth.error('Je hebt geen toegangsrechten tot één van de gekozen afrekeningen voor de betaling die je wilt aanmaken')
|
|
118
|
+
throw Context.auth.error('Je hebt geen toegangsrechten tot één van de gekozen afrekeningen voor de betaling die je wilt aanmaken');
|
|
119
119
|
}
|
|
120
120
|
|
|
121
121
|
// Check total price
|
|
122
|
-
const totalPrice = balanceItemPayments.reduce((total, item) => total + item.price, 0)
|
|
122
|
+
const totalPrice = balanceItemPayments.reduce((total, item) => total + item.price, 0);
|
|
123
123
|
|
|
124
124
|
if (totalPrice !== put.price) {
|
|
125
125
|
throw new SimpleError({
|
|
126
|
-
code:
|
|
126
|
+
code: 'invalid_field',
|
|
127
127
|
message: "Total price doesn't match",
|
|
128
|
-
human:
|
|
129
|
-
field:
|
|
130
|
-
})
|
|
128
|
+
human: 'De totale prijs komt niet overeen met de som van de afrekeningen',
|
|
129
|
+
field: 'price',
|
|
130
|
+
});
|
|
131
131
|
}
|
|
132
132
|
|
|
133
|
-
payment.price = totalPrice
|
|
133
|
+
payment.price = totalPrice;
|
|
134
134
|
|
|
135
135
|
// Save payment
|
|
136
136
|
await payment.save();
|
|
137
137
|
|
|
138
138
|
// Save balance item payments
|
|
139
139
|
for (const balanceItemPayment of balanceItemPayments) {
|
|
140
|
-
balanceItemPayment.paymentId = payment.id
|
|
141
|
-
await balanceItemPayment.save()
|
|
140
|
+
balanceItemPayment.paymentId = payment.id;
|
|
141
|
+
await balanceItemPayment.save();
|
|
142
142
|
}
|
|
143
143
|
|
|
144
144
|
// Mark paid or failed
|
|
145
145
|
if (put.status !== PaymentStatus.Created && put.status !== PaymentStatus.Pending) {
|
|
146
|
-
await ExchangePaymentEndpoint.handlePaymentStatusUpdate(payment, organization, put.status)
|
|
146
|
+
await ExchangePaymentEndpoint.handlePaymentStatusUpdate(payment, organization, put.status);
|
|
147
147
|
|
|
148
148
|
if (put.status === PaymentStatus.Succeeded) {
|
|
149
|
-
payment.paidAt = put.paidAt
|
|
150
|
-
await payment.save()
|
|
149
|
+
payment.paidAt = put.paidAt;
|
|
150
|
+
await payment.save();
|
|
151
151
|
}
|
|
152
|
-
}
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
153
154
|
for (const balanceItem of balanceItems) {
|
|
154
|
-
await balanceItem.markUpdated(payment, organization)
|
|
155
|
+
await balanceItem.markUpdated(payment, organization);
|
|
155
156
|
}
|
|
156
157
|
|
|
157
|
-
await BalanceItem.updateOutstanding(balanceItems)
|
|
158
|
+
await BalanceItem.updateOutstanding(balanceItems);
|
|
158
159
|
}
|
|
159
160
|
|
|
160
|
-
changedPayments.push(payment)
|
|
161
|
+
changedPayments.push(payment);
|
|
161
162
|
}
|
|
162
163
|
|
|
163
164
|
// Modify payments
|
|
164
165
|
for (const patch of request.body.getPatches()) {
|
|
165
|
-
await QueueHandler.schedule(
|
|
166
|
+
await QueueHandler.schedule('payments/' + patch.id, async () => {
|
|
166
167
|
const payment = await Payment.getByID(patch.id);
|
|
167
168
|
if (!payment || !(await Context.auth.canAccessPayment(payment, PermissionLevel.Write))) {
|
|
168
169
|
throw new SimpleError({
|
|
169
|
-
code:
|
|
170
|
-
message:
|
|
171
|
-
human:
|
|
172
|
-
})
|
|
170
|
+
code: 'not_found',
|
|
171
|
+
message: 'Payment not found',
|
|
172
|
+
human: 'Deze betaling werd niet gevonden.',
|
|
173
|
+
});
|
|
173
174
|
}
|
|
174
175
|
|
|
175
176
|
if (patch.method || patch.paidAt !== undefined || patch.status !== undefined) {
|
|
176
177
|
if (payment.method && ![PaymentMethod.Unknown, PaymentMethod.Transfer, PaymentMethod.PointOfSale].includes(payment.method)) {
|
|
177
178
|
throw new SimpleError({
|
|
178
|
-
code:
|
|
179
|
-
message:
|
|
180
|
-
human:
|
|
181
|
-
})
|
|
179
|
+
code: 'invalid_field',
|
|
180
|
+
message: 'Invalid payment method',
|
|
181
|
+
human: 'Je kan online betalingen niet wijzigen',
|
|
182
|
+
});
|
|
182
183
|
}
|
|
183
184
|
}
|
|
184
185
|
|
|
185
186
|
if (patch.transferSettings && payment.method == PaymentMethod.Transfer) {
|
|
186
187
|
if (patch.transferSettings.isPut()) {
|
|
187
|
-
payment.transferSettings = patch.transferSettings
|
|
188
|
-
}
|
|
189
|
-
|
|
188
|
+
payment.transferSettings = patch.transferSettings;
|
|
189
|
+
}
|
|
190
|
+
else if (payment.transferSettings !== null) {
|
|
191
|
+
payment.transferSettings = payment.transferSettings.patch(patch.transferSettings);
|
|
190
192
|
}
|
|
191
193
|
}
|
|
192
194
|
|
|
193
195
|
if (patch.method) {
|
|
194
196
|
if (![PaymentMethod.Unknown, PaymentMethod.Transfer, PaymentMethod.PointOfSale].includes(patch.method)) {
|
|
195
197
|
throw new SimpleError({
|
|
196
|
-
code:
|
|
197
|
-
message:
|
|
198
|
-
human:
|
|
199
|
-
field:
|
|
200
|
-
})
|
|
198
|
+
code: 'invalid_field',
|
|
199
|
+
message: 'Invalid payment method',
|
|
200
|
+
human: 'De betaalmethode die je wilt gebruiken is niet toegestaan',
|
|
201
|
+
field: 'method',
|
|
202
|
+
});
|
|
201
203
|
}
|
|
202
|
-
payment.method = patch.method
|
|
204
|
+
payment.method = patch.method;
|
|
203
205
|
|
|
204
206
|
if (payment.method === PaymentMethod.Transfer && patch.transferDescription === undefined && !payment.transferDescription) {
|
|
205
|
-
payment.transferSettings = payment.transferSettings ?? organization.meta.transferSettings
|
|
207
|
+
payment.transferSettings = payment.transferSettings ?? organization.meta.transferSettings;
|
|
206
208
|
// TODO: fill in description!
|
|
207
|
-
payment.generateDescription(organization,
|
|
209
|
+
payment.generateDescription(organization, '');
|
|
208
210
|
}
|
|
209
211
|
}
|
|
210
212
|
|
|
211
213
|
if (patch.transferDescription && payment.method == PaymentMethod.Transfer) {
|
|
212
|
-
payment.transferDescription = patch.transferDescription
|
|
214
|
+
payment.transferDescription = patch.transferDescription;
|
|
213
215
|
}
|
|
214
216
|
|
|
215
217
|
if (patch.paidAt && payment.paidAt !== null) {
|
|
216
218
|
// Only allow to set the date if it is already set
|
|
217
|
-
payment.paidAt = patch.paidAt
|
|
219
|
+
payment.paidAt = patch.paidAt;
|
|
218
220
|
}
|
|
219
221
|
|
|
220
|
-
await payment.save()
|
|
222
|
+
await payment.save();
|
|
221
223
|
|
|
222
224
|
if (patch.status) {
|
|
223
|
-
await ExchangePaymentEndpoint.handlePaymentStatusUpdate(payment, organization, patch.status)
|
|
225
|
+
await ExchangePaymentEndpoint.handlePaymentStatusUpdate(payment, organization, patch.status);
|
|
224
226
|
}
|
|
225
227
|
|
|
226
228
|
changedPayments.push(
|
|
227
|
-
payment
|
|
228
|
-
)
|
|
229
|
+
payment,
|
|
230
|
+
);
|
|
229
231
|
});
|
|
230
232
|
}
|
|
231
233
|
|
|
232
234
|
return new Response(
|
|
233
|
-
await AuthenticatedStructures.paymentsGeneral(changedPayments, true)
|
|
235
|
+
await AuthenticatedStructures.paymentsGeneral(changedPayments, true),
|
|
234
236
|
);
|
|
235
237
|
}
|
|
236
238
|
}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { DecodedRequest, Endpoint, Request, Response } from
|
|
2
|
-
import { RegistrationPeriodList, OrganizationRegistrationPeriod as OrganizationRegistrationPeriodStruct } from
|
|
1
|
+
import { DecodedRequest, Endpoint, Request, Response } from '@simonbackx/simple-endpoints';
|
|
2
|
+
import { RegistrationPeriodList, OrganizationRegistrationPeriod as OrganizationRegistrationPeriodStruct } from '@stamhoofd/structures';
|
|
3
3
|
|
|
4
4
|
import { Group, OrganizationRegistrationPeriod, RegistrationPeriod } from '@stamhoofd/models';
|
|
5
|
-
import { Context } from
|
|
6
|
-
import { Sorter } from
|
|
5
|
+
import { Context } from '../../../../helpers/Context';
|
|
6
|
+
import { Sorter } from '@stamhoofd/utility';
|
|
7
7
|
|
|
8
8
|
type Params = Record<string, never>;
|
|
9
9
|
type Query = undefined;
|
|
10
|
-
type Body = undefined
|
|
11
|
-
type ResponseBody = RegistrationPeriodList
|
|
10
|
+
type Body = undefined;
|
|
11
|
+
type ResponseBody = RegistrationPeriodList;
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
14
|
* One endpoint to create, patch and delete members and their registrations and payments
|
|
@@ -16,11 +16,11 @@ type ResponseBody = RegistrationPeriodList
|
|
|
16
16
|
|
|
17
17
|
export class PatchRegistrationPeriodsEndpoint extends Endpoint<Params, Query, Body, ResponseBody> {
|
|
18
18
|
protected doesMatch(request: Request): [true, Params] | [false] {
|
|
19
|
-
if (request.method
|
|
19
|
+
if (request.method !== 'GET') {
|
|
20
20
|
return [false];
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
const params = Endpoint.parseParameters(request.url,
|
|
23
|
+
const params = Endpoint.parseParameters(request.url, '/organization/registration-periods', {});
|
|
24
24
|
|
|
25
25
|
if (params) {
|
|
26
26
|
return [true, params as Params];
|
|
@@ -30,15 +30,15 @@ export class PatchRegistrationPeriodsEndpoint extends Endpoint<Params, Query, Bo
|
|
|
30
30
|
|
|
31
31
|
async handle(request: DecodedRequest<Params, Query, Body>) {
|
|
32
32
|
const organization = await Context.setOrganizationScope();
|
|
33
|
-
await Context.authenticate()
|
|
33
|
+
await Context.authenticate();
|
|
34
34
|
|
|
35
35
|
if (!await Context.auth.hasSomeAccess(organization.id)) {
|
|
36
|
-
throw Context.auth.error()
|
|
37
|
-
}
|
|
38
|
-
|
|
36
|
+
throw Context.auth.error();
|
|
37
|
+
}
|
|
38
|
+
|
|
39
39
|
const organizationPeriods = await OrganizationRegistrationPeriod.where({ organizationId: organization.id });
|
|
40
40
|
const periods = await RegistrationPeriod.all();
|
|
41
|
-
const groups = await Group.getAll(organization.id, null)
|
|
41
|
+
const groups = await Group.getAll(organization.id, null);
|
|
42
42
|
|
|
43
43
|
const structs: OrganizationRegistrationPeriodStruct[] = [];
|
|
44
44
|
|
|
@@ -53,14 +53,13 @@ export class PatchRegistrationPeriodsEndpoint extends Endpoint<Params, Query, Bo
|
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
// Sort
|
|
56
|
-
periods.sort((a, b) => Sorter.byDateValue(a.startDate, b.startDate))
|
|
56
|
+
periods.sort((a, b) => Sorter.byDateValue(a.startDate, b.startDate));
|
|
57
57
|
|
|
58
58
|
return new Response(
|
|
59
59
|
RegistrationPeriodList.create({
|
|
60
60
|
organizationPeriods: structs,
|
|
61
|
-
periods: periods.map(p => p.getStructure())
|
|
62
|
-
})
|
|
61
|
+
periods: periods.map(p => p.getStructure()),
|
|
62
|
+
}),
|
|
63
63
|
);
|
|
64
64
|
}
|
|
65
|
-
|
|
66
65
|
}
|