@stamhoofd/models 2.39.0 → 2.40.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/dist/src/factories/AddressFactory.d.ts +3 -4
- package/dist/src/factories/AddressFactory.d.ts.map +1 -1
- package/dist/src/factories/AddressFactory.js +13 -13
- package/dist/src/factories/EmergencyContactFactory.d.ts +3 -4
- package/dist/src/factories/EmergencyContactFactory.d.ts.map +1 -1
- package/dist/src/factories/EmergencyContactFactory.js +27 -27
- package/dist/src/factories/EmergencyContactFactory.js.map +1 -1
- package/dist/src/factories/GroupFactory.d.ts +4 -4
- package/dist/src/factories/GroupFactory.d.ts.map +1 -1
- package/dist/src/factories/GroupFactory.js +8 -8
- package/dist/src/factories/GroupFactory.js.map +1 -1
- package/dist/src/factories/MemberFactory.d.ts +4 -4
- package/dist/src/factories/MemberFactory.d.ts.map +1 -1
- package/dist/src/factories/MemberFactory.js +17 -17
- package/dist/src/factories/MemberFactory.js.map +1 -1
- package/dist/src/factories/OrganizationFactory.d.ts +4 -4
- package/dist/src/factories/OrganizationFactory.js +8 -8
- package/dist/src/factories/OrganizationFactory.js.map +1 -1
- package/dist/src/factories/ParentFactory.d.ts +1 -1
- package/dist/src/factories/ParentFactory.js +19 -19
- package/dist/src/factories/ParentFactory.js.map +1 -1
- package/dist/src/factories/RecordFactory.d.ts +2 -3
- package/dist/src/factories/RecordFactory.d.ts.map +1 -1
- package/dist/src/factories/RecordFactory.js +1 -1
- package/dist/src/factories/RecordFactory.js.map +1 -1
- package/dist/src/factories/RegisterCodeFactory.d.ts +2 -2
- package/dist/src/factories/RegisterCodeFactory.d.ts.map +1 -1
- package/dist/src/factories/RegisterCodeFactory.js +2 -2
- package/dist/src/factories/RegistrationFactory.d.ts +3 -3
- package/dist/src/factories/RegistrationFactory.d.ts.map +1 -1
- package/dist/src/factories/RegistrationFactory.js.map +1 -1
- package/dist/src/factories/RegistrationPeriodFactory.d.ts +2 -2
- package/dist/src/factories/RegistrationPeriodFactory.js.map +1 -1
- package/dist/src/factories/UserFactory.d.ts +3 -3
- package/dist/src/factories/UserFactory.d.ts.map +1 -1
- package/dist/src/factories/UserFactory.js +3 -3
- package/dist/src/factories/UserFactory.js.map +1 -1
- package/dist/src/factories/WebshopFactory.d.ts +4 -4
- package/dist/src/factories/WebshopFactory.d.ts.map +1 -1
- package/dist/src/factories/WebshopFactory.js +1 -1
- package/dist/src/factories/WebshopFactory.js.map +1 -1
- package/dist/src/helpers/DNSValidator.d.ts +1 -1
- package/dist/src/helpers/DNSValidator.d.ts.map +1 -1
- package/dist/src/helpers/DNSValidator.js +33 -33
- package/dist/src/helpers/DNSValidator.js.map +1 -1
- package/dist/src/helpers/EmailBuilder.d.ts +10 -10
- package/dist/src/helpers/EmailBuilder.d.ts.map +1 -1
- package/dist/src/helpers/EmailBuilder.js +34 -34
- package/dist/src/helpers/EmailBuilder.js.map +1 -1
- package/dist/src/helpers/GroupBuilder.d.ts.map +1 -1
- package/dist/src/helpers/GroupBuilder.js +57 -57
- package/dist/src/helpers/GroupBuilder.js.map +1 -1
- package/dist/src/helpers/Handlebars.d.ts.map +1 -1
- package/dist/src/helpers/Handlebars.js +29 -29
- package/dist/src/helpers/Handlebars.js.map +1 -1
- package/dist/src/helpers/MemberMerger.d.ts +1 -1
- package/dist/src/helpers/MemberMerger.d.ts.map +1 -1
- package/dist/src/helpers/MemberMerger.js +33 -33
- package/dist/src/helpers/MemberMerger.js.map +1 -1
- package/dist/src/helpers/MemberMerger.test.js +194 -194
- package/dist/src/helpers/MemberMerger.test.js.map +1 -1
- package/dist/src/helpers/RateLimiter.d.ts.map +1 -1
- package/dist/src/helpers/RateLimiter.js +2 -2
- package/dist/src/helpers/RateLimiter.js.map +1 -1
- package/dist/src/helpers/SetupStepsUpdater.d.ts +22 -0
- package/dist/src/helpers/SetupStepsUpdater.d.ts.map +1 -0
- package/dist/src/helpers/SetupStepsUpdater.js +255 -0
- package/dist/src/helpers/SetupStepsUpdater.js.map +1 -0
- package/dist/src/helpers/WebshopCounter.d.ts +1 -1
- package/dist/src/helpers/WebshopCounter.d.ts.map +1 -1
- package/dist/src/helpers/WebshopCounter.js +1 -1
- package/dist/src/helpers/WebshopCounter.js.map +1 -1
- package/dist/src/helpers/WebshopCounter.test.js +6 -6
- package/dist/src/helpers/WebshopCounter.test.js.map +1 -1
- package/dist/src/index.d.ts +20 -19
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/migrations/1605262045-import-postcodes.js +12 -12
- package/dist/src/migrations/1605262046-import-postcodes-nl.js +10 -10
- package/dist/src/models/BalanceItem.d.ts.map +1 -1
- package/dist/src/models/BalanceItem.js +37 -37
- package/dist/src/models/BalanceItem.js.map +1 -1
- package/dist/src/models/BalanceItemPayment.d.ts.map +1 -1
- package/dist/src/models/BalanceItemPayment.js +13 -13
- package/dist/src/models/BalanceItemPayment.js.map +1 -1
- package/dist/src/models/BuckarooPayment.d.ts +1 -1
- package/dist/src/models/BuckarooPayment.d.ts.map +1 -1
- package/dist/src/models/BuckarooPayment.js +5 -5
- package/dist/src/models/BuckarooPayment.js.map +1 -1
- package/dist/src/models/CachedOutstandingBalance.d.ts.map +1 -1
- package/dist/src/models/CachedOutstandingBalance.js +37 -37
- package/dist/src/models/CachedOutstandingBalance.js.map +1 -1
- package/dist/src/models/Document.d.ts +4 -4
- package/dist/src/models/Document.d.ts.map +1 -1
- package/dist/src/models/Document.js +27 -27
- package/dist/src/models/Document.js.map +1 -1
- package/dist/src/models/DocumentTemplate.d.ts +4 -4
- package/dist/src/models/DocumentTemplate.d.ts.map +1 -1
- package/dist/src/models/DocumentTemplate.js +72 -72
- package/dist/src/models/DocumentTemplate.js.map +1 -1
- package/dist/src/models/Email.d.ts.map +1 -1
- package/dist/src/models/Email.js +63 -64
- package/dist/src/models/Email.js.map +1 -1
- package/dist/src/models/EmailRecipient.d.ts.map +1 -1
- package/dist/src/models/EmailRecipient.js +20 -20
- package/dist/src/models/EmailRecipient.js.map +1 -1
- package/dist/src/models/EmailTemplate.d.ts +3 -3
- package/dist/src/models/EmailTemplate.d.ts.map +1 -1
- package/dist/src/models/EmailTemplate.js +16 -16
- package/dist/src/models/EmailTemplate.js.map +1 -1
- package/dist/src/models/EmailVerificationCode.d.ts +2 -2
- package/dist/src/models/EmailVerificationCode.d.ts.map +1 -1
- package/dist/src/models/EmailVerificationCode.js +57 -55
- package/dist/src/models/EmailVerificationCode.js.map +1 -1
- package/dist/src/models/Event.d.ts +2 -2
- package/dist/src/models/Event.d.ts.map +1 -1
- package/dist/src/models/Event.js +15 -15
- package/dist/src/models/Event.js.map +1 -1
- package/dist/src/models/Group.d.ts +3 -1
- package/dist/src/models/Group.d.ts.map +1 -1
- package/dist/src/models/Group.js +46 -35
- package/dist/src/models/Group.js.map +1 -1
- package/dist/src/models/Image.d.ts +1 -1
- package/dist/src/models/Image.d.ts.map +1 -1
- package/dist/src/models/Image.js +26 -26
- package/dist/src/models/Image.js.map +1 -1
- package/dist/src/models/Member.d.ts +8 -8
- package/dist/src/models/Member.d.ts.map +1 -1
- package/dist/src/models/Member.js +60 -60
- package/dist/src/models/Member.js.map +1 -1
- package/dist/src/models/MemberPlatformMembership.d.ts +3 -3
- package/dist/src/models/MemberPlatformMembership.d.ts.map +1 -1
- package/dist/src/models/MemberPlatformMembership.js +26 -26
- package/dist/src/models/MemberPlatformMembership.js.map +1 -1
- package/dist/src/models/MemberResponsibilityRecord.d.ts.map +1 -1
- package/dist/src/models/MemberResponsibilityRecord.js +13 -13
- package/dist/src/models/MemberResponsibilityRecord.js.map +1 -1
- package/dist/src/models/MergedMember.d.ts +3 -3
- package/dist/src/models/MergedMember.d.ts.map +1 -1
- package/dist/src/models/MergedMember.js +19 -19
- package/dist/src/models/MergedMember.js.map +1 -1
- package/dist/src/models/MolliePayment.d.ts +1 -1
- package/dist/src/models/MolliePayment.d.ts.map +1 -1
- package/dist/src/models/MolliePayment.js +5 -5
- package/dist/src/models/MolliePayment.js.map +1 -1
- package/dist/src/models/MollieToken.d.ts.map +1 -1
- package/dist/src/models/MollieToken.js +60 -60
- package/dist/src/models/MollieToken.js.map +1 -1
- package/dist/src/models/OneTimeToken.d.ts +2 -2
- package/dist/src/models/OneTimeToken.d.ts.map +1 -1
- package/dist/src/models/OneTimeToken.js +13 -13
- package/dist/src/models/OneTimeToken.js.map +1 -1
- package/dist/src/models/Order.d.ts +1 -1
- package/dist/src/models/Order.d.ts.map +1 -1
- package/dist/src/models/Order.js +70 -70
- package/dist/src/models/Order.js.map +1 -1
- package/dist/src/models/Organization.d.ts +5 -5
- package/dist/src/models/Organization.d.ts.map +1 -1
- package/dist/src/models/Organization.js +127 -127
- package/dist/src/models/Organization.js.map +1 -1
- package/dist/src/models/OrganizationRegistrationPeriod.d.ts.map +1 -1
- package/dist/src/models/OrganizationRegistrationPeriod.js +15 -15
- package/dist/src/models/OrganizationRegistrationPeriod.js.map +1 -1
- package/dist/src/models/PasswordToken.d.ts +3 -3
- package/dist/src/models/PasswordToken.d.ts.map +1 -1
- package/dist/src/models/PasswordToken.js +17 -17
- package/dist/src/models/PasswordToken.js.map +1 -1
- package/dist/src/models/PayconiqPayment.d.ts +1 -1
- package/dist/src/models/PayconiqPayment.d.ts.map +1 -1
- package/dist/src/models/PayconiqPayment.js +49 -49
- package/dist/src/models/PayconiqPayment.js.map +1 -1
- package/dist/src/models/Payment.d.ts +3 -3
- package/dist/src/models/Payment.d.ts.map +1 -1
- package/dist/src/models/Payment.js +36 -36
- package/dist/src/models/Payment.js.map +1 -1
- package/dist/src/models/Platform.d.ts +2 -2
- package/dist/src/models/Platform.d.ts.map +1 -1
- package/dist/src/models/Platform.js +8 -8
- package/dist/src/models/Platform.js.map +1 -1
- package/dist/src/models/RegisterCode.d.ts +1 -1
- package/dist/src/models/RegisterCode.d.ts.map +1 -1
- package/dist/src/models/RegisterCode.js +11 -11
- package/dist/src/models/RegisterCode.js.map +1 -1
- package/dist/src/models/Registration.d.ts +1 -1
- package/dist/src/models/Registration.d.ts.map +1 -1
- package/dist/src/models/Registration.js +88 -88
- package/dist/src/models/Registration.js.map +1 -1
- package/dist/src/models/RegistrationPeriod.d.ts.map +1 -1
- package/dist/src/models/RegistrationPeriod.js +12 -12
- package/dist/src/models/RegistrationPeriod.js.map +1 -1
- package/dist/src/models/STCredit.d.ts +1 -1
- package/dist/src/models/STCredit.d.ts.map +1 -1
- package/dist/src/models/STCredit.js +12 -12
- package/dist/src/models/STCredit.js.map +1 -1
- package/dist/src/models/STInvoice.d.ts +1 -1
- package/dist/src/models/STInvoice.d.ts.map +1 -1
- package/dist/src/models/STInvoice.js +16 -16
- package/dist/src/models/STInvoice.js.map +1 -1
- package/dist/src/models/STPackage.d.ts +1 -1
- package/dist/src/models/STPackage.d.ts.map +1 -1
- package/dist/src/models/STPackage.js +39 -39
- package/dist/src/models/STPackage.js.map +1 -1
- package/dist/src/models/STPendingInvoice.d.ts +1 -1
- package/dist/src/models/STPendingInvoice.d.ts.map +1 -1
- package/dist/src/models/STPendingInvoice.js +11 -11
- package/dist/src/models/STPendingInvoice.js.map +1 -1
- package/dist/src/models/StripeAccount.d.ts.map +1 -1
- package/dist/src/models/StripeAccount.js +13 -13
- package/dist/src/models/StripeAccount.js.map +1 -1
- package/dist/src/models/StripeCheckoutSession.d.ts +1 -1
- package/dist/src/models/StripeCheckoutSession.d.ts.map +1 -1
- package/dist/src/models/StripeCheckoutSession.js +7 -7
- package/dist/src/models/StripeCheckoutSession.js.map +1 -1
- package/dist/src/models/StripePaymentIntent.d.ts +1 -1
- package/dist/src/models/StripePaymentIntent.d.ts.map +1 -1
- package/dist/src/models/StripePaymentIntent.js +7 -7
- package/dist/src/models/StripePaymentIntent.js.map +1 -1
- package/dist/src/models/Ticket.d.ts +2 -2
- package/dist/src/models/Ticket.d.ts.map +1 -1
- package/dist/src/models/Ticket.js +23 -23
- package/dist/src/models/Ticket.js.map +1 -1
- package/dist/src/models/Token.d.ts +3 -3
- package/dist/src/models/Token.d.ts.map +1 -1
- package/dist/src/models/Token.js +27 -27
- package/dist/src/models/Token.js.map +1 -1
- package/dist/src/models/Token.test.js +11 -11
- package/dist/src/models/UsedRegisterCode.d.ts +1 -1
- package/dist/src/models/UsedRegisterCode.d.ts.map +1 -1
- package/dist/src/models/UsedRegisterCode.js +10 -10
- package/dist/src/models/UsedRegisterCode.js.map +1 -1
- package/dist/src/models/User.d.ts +4 -4
- package/dist/src/models/User.d.ts.map +1 -1
- package/dist/src/models/User.js +53 -51
- package/dist/src/models/User.js.map +1 -1
- package/dist/src/models/UserPermissions.d.ts +3 -3
- package/dist/src/models/UserPermissions.d.ts.map +1 -1
- package/dist/src/models/UserPermissions.js +12 -12
- package/dist/src/models/UserPermissions.js.map +1 -1
- package/dist/src/models/Webshop.d.ts +1 -1
- package/dist/src/models/Webshop.d.ts.map +1 -1
- package/dist/src/models/Webshop.js +23 -23
- package/dist/src/models/Webshop.js.map +1 -1
- package/dist/src/models/WebshopDiscountCode.d.ts +1 -1
- package/dist/src/models/WebshopDiscountCode.d.ts.map +1 -1
- package/dist/src/models/WebshopDiscountCode.js +16 -16
- package/dist/src/models/WebshopDiscountCode.js.map +1 -1
- package/dist/src/models/addresses/City.d.ts.map +1 -1
- package/dist/src/models/addresses/City.js +9 -9
- package/dist/src/models/addresses/City.js.map +1 -1
- package/dist/src/models/addresses/PostalCode.d.ts.map +1 -1
- package/dist/src/models/addresses/PostalCode.js +11 -11
- package/dist/src/models/addresses/PostalCode.js.map +1 -1
- package/dist/src/models/addresses/PostalCode.test.js +22 -22
- package/dist/src/models/addresses/PostalCode.test.js.map +1 -1
- package/dist/src/models/addresses/Province.d.ts.map +1 -1
- package/dist/src/models/addresses/Province.js +5 -5
- package/dist/src/models/addresses/Province.js.map +1 -1
- package/dist/src/models/addresses/Street.d.ts.map +1 -1
- package/dist/src/models/addresses/Street.js +6 -6
- package/dist/src/models/addresses/Street.js.map +1 -1
- package/dist/src/models/index.d.ts +46 -46
- package/dist/src/models/index.d.ts.map +1 -1
- package/dist/src/models/index.js +0 -1
- package/dist/src/models/index.js.map +1 -1
- package/dist/src/structures/OrganizationServerMetaData.d.ts.map +1 -1
- package/dist/src/structures/OrganizationServerMetaData.js +4 -4
- package/dist/src/structures/OrganizationServerMetaData.js.map +1 -1
- package/dist/tests/jest.global.setup.d.ts.map +1 -1
- package/dist/tests/jest.global.setup.js +15 -13
- package/dist/tests/jest.global.setup.js.map +1 -1
- package/dist/tests/jest.setup.js +3 -1
- package/dist/tests/jest.setup.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +3 -3
- package/src/factories/AddressFactory.ts +17 -17
- package/src/factories/EmergencyContactFactory.ts +30 -31
- package/src/factories/GroupFactory.ts +30 -30
- package/src/factories/MemberFactory.ts +41 -38
- package/src/factories/OrganizationFactory.ts +15 -15
- package/src/factories/ParentFactory.ts +24 -24
- package/src/factories/RecordFactory.ts +5 -4
- package/src/factories/RegisterCodeFactory.ts +7 -7
- package/src/factories/RegistrationFactory.ts +16 -16
- package/src/factories/RegistrationPeriodFactory.ts +5 -5
- package/src/factories/UserFactory.ts +20 -19
- package/src/factories/WebshopFactory.ts +14 -14
- package/src/helpers/DNSValidator.ts +89 -84
- package/src/helpers/EmailBuilder.ts +141 -135
- package/src/helpers/GroupBuilder.ts +181 -181
- package/src/helpers/Handlebars.ts +57 -54
- package/src/helpers/MemberMerger.test.ts +702 -702
- package/src/helpers/MemberMerger.ts +83 -77
- package/src/helpers/RateLimiter.ts +25 -27
- package/src/helpers/SetupStepsUpdater.ts +402 -0
- package/src/helpers/WebshopCounter.test.ts +12 -12
- package/src/helpers/WebshopCounter.ts +20 -19
- package/src/index.ts +20 -19
- package/src/migrations/1605262045-import-postcodes.ts +59 -63
- package/src/migrations/1605262046-import-postcodes-nl.ts +41 -43
- package/src/models/BalanceItem.ts +173 -172
- package/src/models/BalanceItemPayment.ts +32 -33
- package/src/models/BuckarooPayment.ts +7 -7
- package/src/models/CachedOutstandingBalance.ts +98 -99
- package/src/models/Document.ts +90 -87
- package/src/models/DocumentTemplate.ts +207 -198
- package/src/models/Email.ts +198 -200
- package/src/models/EmailRecipient.ts +38 -39
- package/src/models/EmailTemplate.ts +36 -37
- package/src/models/EmailVerificationCode.ts +146 -142
- package/src/models/Event.ts +53 -53
- package/src/models/Group.ts +136 -123
- package/src/models/Image.ts +48 -48
- package/src/models/Member.ts +277 -275
- package/src/models/MemberPlatformMembership.ts +71 -71
- package/src/models/MemberResponsibilityRecord.ts +32 -32
- package/src/models/MergedMember.ts +77 -77
- package/src/models/MolliePayment.ts +7 -7
- package/src/models/MollieToken.ts +131 -126
- package/src/models/OneTimeToken.ts +40 -39
- package/src/models/Order.ts +379 -372
- package/src/models/Organization.ts +332 -325
- package/src/models/OrganizationRegistrationPeriod.ts +50 -50
- package/src/models/PasswordToken.ts +42 -42
- package/src/models/PayconiqPayment.ts +80 -76
- package/src/models/Payment.ts +86 -86
- package/src/models/Platform.ts +21 -22
- package/src/models/RegisterCode.ts +26 -26
- package/src/models/Registration.ts +167 -168
- package/src/models/RegistrationPeriod.ts +29 -29
- package/src/models/STCredit.ts +24 -25
- package/src/models/STInvoice.ts +34 -34
- package/src/models/STPackage.ts +143 -136
- package/src/models/STPendingInvoice.ts +26 -26
- package/src/models/StripeAccount.ts +27 -27
- package/src/models/StripeCheckoutSession.ts +10 -10
- package/src/models/StripePaymentIntent.ts +10 -10
- package/src/models/Ticket.ts +51 -52
- package/src/models/Token.test.ts +13 -13
- package/src/models/Token.ts +64 -63
- package/src/models/UsedRegisterCode.ts +20 -21
- package/src/models/User.ts +148 -144
- package/src/models/UserPermissions.ts +25 -28
- package/src/models/Webshop.ts +53 -53
- package/src/models/WebshopDiscountCode.ts +33 -33
- package/src/models/addresses/City.ts +12 -12
- package/src/models/addresses/PostalCode.test.ts +68 -69
- package/src/models/addresses/PostalCode.ts +57 -57
- package/src/models/addresses/Province.ts +8 -8
- package/src/models/addresses/Street.ts +10 -12
- package/src/models/index.ts +54 -55
- package/src/structures/OrganizationServerMetaData.ts +36 -36
package/src/models/Member.ts
CHANGED
|
@@ -1,108 +1,108 @@
|
|
|
1
1
|
import { column, Database, ManyToManyRelation, ManyToOneRelation, Model, OneToManyRelation } from '@simonbackx/simple-database';
|
|
2
|
-
import { scalarToSQLExpression, SQL, SQLWhereLike } from
|
|
2
|
+
import { scalarToSQLExpression, SQL, SQLWhereLike } from '@stamhoofd/sql';
|
|
3
3
|
import { MemberDetails, MemberWithRegistrationsBlob, RegistrationWithMember as RegistrationWithMemberStruct, TinyMember } from '@stamhoofd/structures';
|
|
4
4
|
import { Formatter, Sorter } from '@stamhoofd/utility';
|
|
5
|
-
import { v4 as uuidv4 } from
|
|
5
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
6
6
|
|
|
7
7
|
import { isSimpleError, isSimpleErrors, SimpleError } from '@simonbackx/simple-errors';
|
|
8
8
|
import { QueueHandler } from '@stamhoofd/queues';
|
|
9
9
|
import { Group, MemberPlatformMembership, MemberResponsibilityRecord, Organization, Payment, Platform, Registration, User } from './';
|
|
10
|
-
export type MemberWithRegistrations = Member & {
|
|
11
|
-
users: User[]
|
|
12
|
-
registrations: (Registration & {group: Group})[]
|
|
13
|
-
}
|
|
10
|
+
export type MemberWithRegistrations = Member & {
|
|
11
|
+
users: User[];
|
|
12
|
+
registrations: (Registration & { group: Group })[];
|
|
13
|
+
};
|
|
14
14
|
|
|
15
15
|
// Defined here to prevent cycles
|
|
16
|
-
export type RegistrationWithMember = Registration & { member: Member }
|
|
16
|
+
export type RegistrationWithMember = Registration & { member: Member };
|
|
17
17
|
|
|
18
18
|
export class Member extends Model {
|
|
19
|
-
static table =
|
|
19
|
+
static table = 'members';
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
// #region Columns
|
|
22
22
|
@column({
|
|
23
|
-
primary: true, type:
|
|
23
|
+
primary: true, type: 'string', beforeSave(value) {
|
|
24
24
|
return value ?? uuidv4();
|
|
25
|
-
}
|
|
25
|
+
},
|
|
26
26
|
})
|
|
27
27
|
id!: string;
|
|
28
28
|
|
|
29
|
-
@column({ type:
|
|
30
|
-
organizationId: string|null = null;
|
|
29
|
+
@column({ type: 'string', nullable: true })
|
|
30
|
+
organizationId: string | null = null;
|
|
31
31
|
|
|
32
32
|
@column({
|
|
33
|
-
type:
|
|
34
|
-
beforeSave: function() {
|
|
35
|
-
return this.details?.firstName ?? ''
|
|
36
|
-
}
|
|
33
|
+
type: 'string',
|
|
34
|
+
beforeSave: function () {
|
|
35
|
+
return this.details?.firstName ?? '';
|
|
36
|
+
},
|
|
37
37
|
})
|
|
38
|
-
firstName: string
|
|
38
|
+
firstName: string;
|
|
39
39
|
|
|
40
|
-
@column({ type:
|
|
41
|
-
beforeSave: function() {
|
|
42
|
-
return this.details?.lastName ?? ''
|
|
40
|
+
@column({ type: 'string',
|
|
41
|
+
beforeSave: function () {
|
|
42
|
+
return this.details?.lastName ?? '';
|
|
43
43
|
} })
|
|
44
|
-
lastName: string
|
|
44
|
+
lastName: string;
|
|
45
45
|
|
|
46
|
-
@column({
|
|
47
|
-
type:
|
|
48
|
-
nullable: true,
|
|
49
|
-
beforeSave: function(this: Member) {
|
|
50
|
-
return this.details?.birthDay ? Formatter.dateIso(this.details.birthDay) : null
|
|
51
|
-
}
|
|
46
|
+
@column({
|
|
47
|
+
type: 'string',
|
|
48
|
+
nullable: true,
|
|
49
|
+
beforeSave: function (this: Member) {
|
|
50
|
+
return this.details?.birthDay ? Formatter.dateIso(this.details.birthDay) : null;
|
|
51
|
+
},
|
|
52
52
|
})
|
|
53
|
-
birthDay: string | null
|
|
53
|
+
birthDay: string | null;
|
|
54
54
|
|
|
55
55
|
@column({
|
|
56
|
-
type:
|
|
56
|
+
type: 'string',
|
|
57
57
|
nullable: true,
|
|
58
|
-
beforeSave: function() {
|
|
59
|
-
return this.details?.memberNumber ?? null
|
|
60
|
-
}
|
|
58
|
+
beforeSave: function () {
|
|
59
|
+
return this.details?.memberNumber ?? null;
|
|
60
|
+
},
|
|
61
61
|
})
|
|
62
|
-
memberNumber: string | null
|
|
62
|
+
memberNumber: string | null;
|
|
63
63
|
|
|
64
|
-
@column({ type:
|
|
65
|
-
details: MemberDetails
|
|
64
|
+
@column({ type: 'json', decoder: MemberDetails })
|
|
65
|
+
details: MemberDetails;
|
|
66
66
|
|
|
67
67
|
/**
|
|
68
68
|
* Not yet paid balance
|
|
69
69
|
*/
|
|
70
|
-
@column({ type:
|
|
71
|
-
outstandingBalance = 0
|
|
70
|
+
@column({ type: 'integer' })
|
|
71
|
+
outstandingBalance = 0;
|
|
72
72
|
|
|
73
73
|
@column({
|
|
74
|
-
type:
|
|
74
|
+
type: 'datetime', beforeSave(old?: any) {
|
|
75
75
|
if (old !== undefined) {
|
|
76
76
|
return old;
|
|
77
77
|
}
|
|
78
|
-
const date = new Date()
|
|
79
|
-
date.setMilliseconds(0)
|
|
80
|
-
return date
|
|
81
|
-
}
|
|
78
|
+
const date = new Date();
|
|
79
|
+
date.setMilliseconds(0);
|
|
80
|
+
return date;
|
|
81
|
+
},
|
|
82
82
|
})
|
|
83
|
-
createdAt: Date
|
|
83
|
+
createdAt: Date;
|
|
84
84
|
|
|
85
85
|
@column({
|
|
86
|
-
type:
|
|
87
|
-
const date = new Date()
|
|
88
|
-
date.setMilliseconds(0)
|
|
89
|
-
return date
|
|
86
|
+
type: 'datetime', beforeSave() {
|
|
87
|
+
const date = new Date();
|
|
88
|
+
date.setMilliseconds(0);
|
|
89
|
+
return date;
|
|
90
90
|
},
|
|
91
|
-
skipUpdate: true
|
|
91
|
+
skipUpdate: true,
|
|
92
92
|
})
|
|
93
|
-
updatedAt: Date
|
|
94
|
-
|
|
93
|
+
updatedAt: Date;
|
|
94
|
+
// #endregion
|
|
95
95
|
|
|
96
|
-
static registrations = new OneToManyRelation(Member, Registration,
|
|
96
|
+
static registrations = new OneToManyRelation(Member, Registration, 'registrations', 'memberId');
|
|
97
97
|
|
|
98
98
|
// Note: all relations should point to their parents, not the other way around to avoid reference cycles
|
|
99
|
-
static users = new ManyToManyRelation(Member, User,
|
|
99
|
+
static users = new ManyToManyRelation(Member, User, 'users');
|
|
100
100
|
|
|
101
101
|
/**
|
|
102
102
|
* Fetch all members with their corresponding (valid) registration
|
|
103
103
|
*/
|
|
104
104
|
static async getWithRegistrations(id: string): Promise<MemberWithRegistrations | null> {
|
|
105
|
-
return (await this.getBlobByIds(id))[0] ?? null
|
|
105
|
+
return (await this.getBlobByIds(id))[0] ?? null;
|
|
106
106
|
}
|
|
107
107
|
|
|
108
108
|
/**
|
|
@@ -110,21 +110,21 @@ export class Member extends Model {
|
|
|
110
110
|
*/
|
|
111
111
|
static async updateOutstandingBalance(memberIds: string[] | 'all') {
|
|
112
112
|
if (memberIds !== 'all' && memberIds.length == 0) {
|
|
113
|
-
return
|
|
113
|
+
return;
|
|
114
114
|
}
|
|
115
115
|
|
|
116
|
-
const params: any[] = []
|
|
117
|
-
let firstWhere = ''
|
|
118
|
-
let secondWhere = ''
|
|
116
|
+
const params: any[] = [];
|
|
117
|
+
let firstWhere = '';
|
|
118
|
+
let secondWhere = '';
|
|
119
119
|
|
|
120
120
|
if (memberIds !== 'all') {
|
|
121
|
-
firstWhere = ` AND memberId IN (?)
|
|
122
|
-
params.push(memberIds)
|
|
121
|
+
firstWhere = ` AND memberId IN (?)`;
|
|
122
|
+
params.push(memberIds);
|
|
123
123
|
|
|
124
|
-
secondWhere = `WHERE members.id IN (?)
|
|
125
|
-
params.push(memberIds)
|
|
124
|
+
secondWhere = `WHERE members.id IN (?)`;
|
|
125
|
+
params.push(memberIds);
|
|
126
126
|
}
|
|
127
|
-
|
|
127
|
+
|
|
128
128
|
const query = `UPDATE
|
|
129
129
|
members
|
|
130
130
|
LEFT JOIN (
|
|
@@ -138,9 +138,9 @@ export class Member extends Model {
|
|
|
138
138
|
memberId
|
|
139
139
|
) i ON i.memberId = members.id
|
|
140
140
|
SET members.outstandingBalance = COALESCE(i.outstandingBalance, 0)
|
|
141
|
-
${secondWhere}
|
|
142
|
-
|
|
143
|
-
await Database.update(query, params)
|
|
141
|
+
${secondWhere}`;
|
|
142
|
+
|
|
143
|
+
await Database.update(query, params);
|
|
144
144
|
}
|
|
145
145
|
|
|
146
146
|
/**
|
|
@@ -148,38 +148,38 @@ export class Member extends Model {
|
|
|
148
148
|
*/
|
|
149
149
|
static async getRegistrationWithMembersByIDs(ids: string[]): Promise<RegistrationWithMember[]> {
|
|
150
150
|
if (ids.length === 0) {
|
|
151
|
-
return []
|
|
151
|
+
return [];
|
|
152
152
|
}
|
|
153
153
|
let query = `SELECT ${Member.getDefaultSelect()}, ${Registration.getDefaultSelect()} from \`${Member.table}\`\n`;
|
|
154
|
-
|
|
155
|
-
query += `JOIN \`${Registration.table}\` ON \`${Registration.table}\`.\`${Member.registrations.foreignKey}\` = \`${Member.table}\`.\`${Member.primary.name}\` AND (\`${Registration.table}\`.\`registeredAt\` is not null OR \`${Registration.table}\`.\`canRegister\` = 1)\n
|
|
154
|
+
|
|
155
|
+
query += `JOIN \`${Registration.table}\` ON \`${Registration.table}\`.\`${Member.registrations.foreignKey}\` = \`${Member.table}\`.\`${Member.primary.name}\` AND (\`${Registration.table}\`.\`registeredAt\` is not null OR \`${Registration.table}\`.\`canRegister\` = 1)\n`;
|
|
156
156
|
|
|
157
157
|
// We do an extra join because we also need to get the other registrations of each member (only one regitration has to match the query)
|
|
158
|
-
query += `where \`${Registration.table}\`.\`${Registration.primary.name}\` IN (?)
|
|
158
|
+
query += `where \`${Registration.table}\`.\`${Registration.primary.name}\` IN (?)`;
|
|
159
159
|
|
|
160
|
-
const [results] = await Database.select(query, [ids])
|
|
161
|
-
const registrations: RegistrationWithMember[] = []
|
|
160
|
+
const [results] = await Database.select(query, [ids]);
|
|
161
|
+
const registrations: RegistrationWithMember[] = [];
|
|
162
162
|
|
|
163
|
-
|
|
164
|
-
const registrationMemberRelation = new ManyToOneRelation(Member,
|
|
165
|
-
registrationMemberRelation.foreignKey = Member.registrations.foreignKey
|
|
163
|
+
// In the future we might add a 'reverse' method on manytoone relation, instead of defining the new relation. But then we need to store 2 model types in the many to one relation.
|
|
164
|
+
const registrationMemberRelation = new ManyToOneRelation(Member, 'member');
|
|
165
|
+
registrationMemberRelation.foreignKey = Member.registrations.foreignKey;
|
|
166
166
|
|
|
167
167
|
for (const row of results) {
|
|
168
|
-
const registration = Registration.fromRow(row[Registration.table])
|
|
168
|
+
const registration = Registration.fromRow(row[Registration.table]);
|
|
169
169
|
if (!registration) {
|
|
170
|
-
throw new Error(
|
|
170
|
+
throw new Error('Expected registration in every row');
|
|
171
171
|
}
|
|
172
172
|
|
|
173
|
-
const foundMember = Member.fromRow(row[Member.table])
|
|
173
|
+
const foundMember = Member.fromRow(row[Member.table]);
|
|
174
174
|
if (!foundMember) {
|
|
175
|
-
throw new Error(
|
|
175
|
+
throw new Error('Expected member in every row');
|
|
176
176
|
}
|
|
177
|
-
|
|
178
|
-
const _f = registration.setRelation(registrationMemberRelation, foundMember)
|
|
179
|
-
registrations.push(_f)
|
|
177
|
+
|
|
178
|
+
const _f = registration.setRelation(registrationMemberRelation, foundMember);
|
|
179
|
+
registrations.push(_f);
|
|
180
180
|
}
|
|
181
181
|
|
|
182
|
-
return registrations
|
|
182
|
+
return registrations;
|
|
183
183
|
}
|
|
184
184
|
|
|
185
185
|
/**
|
|
@@ -187,145 +187,144 @@ export class Member extends Model {
|
|
|
187
187
|
*/
|
|
188
188
|
static async getRegistrationWithMembersForGroup(groupId: string): Promise<RegistrationWithMember[]> {
|
|
189
189
|
let query = `SELECT ${Member.getDefaultSelect()}, ${Registration.getDefaultSelect()} from \`${Member.table}\`\n`;
|
|
190
|
-
|
|
191
|
-
query += `JOIN \`${Registration.table}\` ON \`${Registration.table}\`.\`${Member.registrations.foreignKey}\` = \`${Member.table}\`.\`${Member.primary.name}\` AND (\`${Registration.table}\`.\`registeredAt\` is not null OR \`${Registration.table}\`.\`canRegister\` = 1)\n
|
|
190
|
+
|
|
191
|
+
query += `JOIN \`${Registration.table}\` ON \`${Registration.table}\`.\`${Member.registrations.foreignKey}\` = \`${Member.table}\`.\`${Member.primary.name}\` AND (\`${Registration.table}\`.\`registeredAt\` is not null OR \`${Registration.table}\`.\`canRegister\` = 1)\n`;
|
|
192
192
|
|
|
193
193
|
// We do an extra join because we also need to get the other registrations of each member (only one regitration has to match the query)
|
|
194
|
-
query += `where \`${Registration.table}\`.\`groupId\` =
|
|
194
|
+
query += `where \`${Registration.table}\`.\`groupId\` = ?`;
|
|
195
195
|
|
|
196
|
-
const [results] = await Database.select(query, [groupId])
|
|
197
|
-
const registrations: RegistrationWithMember[] = []
|
|
196
|
+
const [results] = await Database.select(query, [groupId]);
|
|
197
|
+
const registrations: RegistrationWithMember[] = [];
|
|
198
198
|
|
|
199
|
-
|
|
200
|
-
const registrationMemberRelation = new ManyToOneRelation(Member,
|
|
201
|
-
registrationMemberRelation.foreignKey = Member.registrations.foreignKey
|
|
199
|
+
// In the future we might add a 'reverse' method on manytoone relation, instead of defining the new relation. But then we need to store 2 model types in the many to one relation.
|
|
200
|
+
const registrationMemberRelation = new ManyToOneRelation(Member, 'member');
|
|
201
|
+
registrationMemberRelation.foreignKey = Member.registrations.foreignKey;
|
|
202
202
|
|
|
203
203
|
for (const row of results) {
|
|
204
|
-
const registration = Registration.fromRow(row[Registration.table])
|
|
204
|
+
const registration = Registration.fromRow(row[Registration.table]);
|
|
205
205
|
if (!registration) {
|
|
206
|
-
throw new Error(
|
|
206
|
+
throw new Error('Expected registration in every row');
|
|
207
207
|
}
|
|
208
208
|
|
|
209
|
-
const foundMember = Member.fromRow(row[Member.table])
|
|
209
|
+
const foundMember = Member.fromRow(row[Member.table]);
|
|
210
210
|
if (!foundMember) {
|
|
211
|
-
throw new Error(
|
|
211
|
+
throw new Error('Expected member in every row');
|
|
212
212
|
}
|
|
213
|
-
|
|
214
|
-
const _f = registration.setRelation(registrationMemberRelation, foundMember)
|
|
215
|
-
registrations.push(_f)
|
|
213
|
+
|
|
214
|
+
const _f = registration.setRelation(registrationMemberRelation, foundMember);
|
|
215
|
+
registrations.push(_f);
|
|
216
216
|
}
|
|
217
217
|
|
|
218
|
-
return registrations
|
|
218
|
+
return registrations;
|
|
219
219
|
}
|
|
220
220
|
|
|
221
|
-
|
|
221
|
+
/**
|
|
222
222
|
* Fetch all registrations with members with their corresponding (valid) registrations and payment
|
|
223
223
|
*/
|
|
224
224
|
static async getRegistrationWithMembersForPayment(paymentId: string): Promise<RegistrationWithMember[]> {
|
|
225
|
-
const { BalanceItem, BalanceItemPayment} = await import('./');
|
|
225
|
+
const { BalanceItem, BalanceItemPayment } = await import('./');
|
|
226
226
|
|
|
227
227
|
let query = `SELECT ${Member.getDefaultSelect()}, ${Registration.getDefaultSelect()} from \`${Member.table}\`\n`;
|
|
228
|
-
|
|
229
|
-
query += `JOIN \`${Registration.table}\` ON \`${Registration.table}\`.\`${Member.registrations.foreignKey}\` = \`${Member.table}\`.\`${Member.primary.name}\`\n
|
|
230
|
-
|
|
231
|
-
query += `LEFT JOIN \`${BalanceItem.table}\` ON \`${BalanceItem.table}\`.\`registrationId\` = \`${Registration.table}\`.\`${Registration.primary.name}\`\n
|
|
232
|
-
query += `LEFT JOIN \`${BalanceItemPayment.table}\` ON \`${BalanceItemPayment.table}\`.\`${BalanceItemPayment.balanceItem.foreignKey}\` = \`${BalanceItem.table}\`.\`${BalanceItem.primary.name}\`\n
|
|
233
|
-
query += `JOIN \`${Payment.table}\` ON \`${Payment.table}\`.\`${Payment.primary.name}\` = \`${BalanceItemPayment.table}\`.\`${BalanceItemPayment.payment.foreignKey}\`\n
|
|
228
|
+
|
|
229
|
+
query += `JOIN \`${Registration.table}\` ON \`${Registration.table}\`.\`${Member.registrations.foreignKey}\` = \`${Member.table}\`.\`${Member.primary.name}\`\n`;
|
|
230
|
+
|
|
231
|
+
query += `LEFT JOIN \`${BalanceItem.table}\` ON \`${BalanceItem.table}\`.\`registrationId\` = \`${Registration.table}\`.\`${Registration.primary.name}\`\n`;
|
|
232
|
+
query += `LEFT JOIN \`${BalanceItemPayment.table}\` ON \`${BalanceItemPayment.table}\`.\`${BalanceItemPayment.balanceItem.foreignKey}\` = \`${BalanceItem.table}\`.\`${BalanceItem.primary.name}\`\n`;
|
|
233
|
+
query += `JOIN \`${Payment.table}\` ON \`${Payment.table}\`.\`${Payment.primary.name}\` = \`${BalanceItemPayment.table}\`.\`${BalanceItemPayment.payment.foreignKey}\`\n`;
|
|
234
234
|
|
|
235
235
|
// We do an extra join because we also need to get the other registrations of each member (only one regitration has to match the query)
|
|
236
|
-
query += `WHERE \`${Payment.table}\`.\`${Payment.primary.name}\` = ?\n
|
|
237
|
-
query += `GROUP BY \`${Registration.table}\`.\`${Registration.primary.name}\`, \`${Member.table}\`.\`${Member.primary.name}
|
|
236
|
+
query += `WHERE \`${Payment.table}\`.\`${Payment.primary.name}\` = ?\n`;
|
|
237
|
+
query += `GROUP BY \`${Registration.table}\`.\`${Registration.primary.name}\`, \`${Member.table}\`.\`${Member.primary.name}\``;
|
|
238
238
|
|
|
239
|
-
const [results] = await Database.select(query, [paymentId])
|
|
240
|
-
const registrations: RegistrationWithMember[] = []
|
|
239
|
+
const [results] = await Database.select(query, [paymentId]);
|
|
240
|
+
const registrations: RegistrationWithMember[] = [];
|
|
241
241
|
|
|
242
|
-
|
|
243
|
-
const registrationMemberRelation = new ManyToOneRelation(Member,
|
|
244
|
-
registrationMemberRelation.foreignKey = Member.registrations.foreignKey
|
|
242
|
+
// In the future we might add a 'reverse' method on manytoone relation, instead of defining the new relation. But then we need to store 2 model types in the many to one relation.
|
|
243
|
+
const registrationMemberRelation = new ManyToOneRelation(Member, 'member');
|
|
244
|
+
registrationMemberRelation.foreignKey = Member.registrations.foreignKey;
|
|
245
245
|
|
|
246
246
|
for (const row of results) {
|
|
247
|
-
const registration = Registration.fromRow(row[Registration.table])
|
|
247
|
+
const registration = Registration.fromRow(row[Registration.table]);
|
|
248
248
|
if (!registration) {
|
|
249
|
-
throw new Error(
|
|
249
|
+
throw new Error('Expected registration in every row');
|
|
250
250
|
}
|
|
251
251
|
|
|
252
|
-
const foundMember = Member.fromRow(row[Member.table])
|
|
252
|
+
const foundMember = Member.fromRow(row[Member.table]);
|
|
253
253
|
if (!foundMember) {
|
|
254
|
-
throw new Error(
|
|
254
|
+
throw new Error('Expected member in every row');
|
|
255
255
|
}
|
|
256
|
-
|
|
257
|
-
const _f = registration.setRelation(registrationMemberRelation, foundMember)
|
|
258
|
-
registrations.push(_f)
|
|
256
|
+
|
|
257
|
+
const _f = registration.setRelation(registrationMemberRelation, foundMember);
|
|
258
|
+
registrations.push(_f);
|
|
259
259
|
}
|
|
260
260
|
|
|
261
|
-
return registrations
|
|
261
|
+
return registrations;
|
|
262
262
|
}
|
|
263
263
|
|
|
264
|
-
|
|
264
|
+
/**
|
|
265
265
|
* Fetch all members with their corresponding (valid) registrations, users
|
|
266
266
|
*/
|
|
267
267
|
static async getBlobByIds(...ids: string[]): Promise<MemberWithRegistrations[]> {
|
|
268
268
|
if (ids.length == 0) {
|
|
269
|
-
return []
|
|
269
|
+
return [];
|
|
270
270
|
}
|
|
271
271
|
let query = `SELECT ${Member.getDefaultSelect()}, ${Registration.getDefaultSelect()}, ${User.getDefaultSelect()} from \`${Member.table}\`\n`;
|
|
272
|
-
query += `LEFT JOIN \`${Registration.table}\` ON \`${Registration.table}\`.\`${Member.registrations.foreignKey}\` = \`${Member.table}\`.\`${Member.primary.name}\` AND (\`${Registration.table}\`.\`registeredAt\` is not null OR \`${Registration.table}\`.\`canRegister\` = 1)\n
|
|
273
|
-
query += Member.users.joinQuery(Member.table, User.table)+
|
|
272
|
+
query += `LEFT JOIN \`${Registration.table}\` ON \`${Registration.table}\`.\`${Member.registrations.foreignKey}\` = \`${Member.table}\`.\`${Member.primary.name}\` AND (\`${Registration.table}\`.\`registeredAt\` is not null OR \`${Registration.table}\`.\`canRegister\` = 1)\n`;
|
|
273
|
+
query += Member.users.joinQuery(Member.table, User.table) + '\n';
|
|
274
274
|
|
|
275
275
|
// We do an extra join because we also need to get the other registrations of each member (only one regitration has to match the query)
|
|
276
|
-
query += `where \`${Member.table}\`.\`${Member.primary.name}\` IN (?)
|
|
276
|
+
query += `where \`${Member.table}\`.\`${Member.primary.name}\` IN (?)`;
|
|
277
277
|
|
|
278
|
-
const [results] = await Database.select(query, [ids])
|
|
279
|
-
const members: MemberWithRegistrations[] = []
|
|
278
|
+
const [results] = await Database.select(query, [ids]);
|
|
279
|
+
const members: MemberWithRegistrations[] = [];
|
|
280
280
|
|
|
281
281
|
// Load groups
|
|
282
|
-
const groupIds = results.map(r => r[Registration.table]?.groupId).filter(id => id) as string[]
|
|
283
|
-
const groups = await Group.getByIDs(...Formatter.uniqueArray(groupIds))
|
|
282
|
+
const groupIds = results.map(r => r[Registration.table]?.groupId).filter(id => id) as string[];
|
|
283
|
+
const groups = await Group.getByIDs(...Formatter.uniqueArray(groupIds));
|
|
284
284
|
|
|
285
285
|
for (const row of results) {
|
|
286
|
-
const foundMember = Member.fromRow(row[Member.table])
|
|
286
|
+
const foundMember = Member.fromRow(row[Member.table]);
|
|
287
287
|
if (!foundMember) {
|
|
288
|
-
throw new Error(
|
|
288
|
+
throw new Error('Expected member in every row');
|
|
289
289
|
}
|
|
290
290
|
const _f = foundMember
|
|
291
|
-
.setManyRelation(Member.registrations as unknown as OneToManyRelation<
|
|
292
|
-
.setManyRelation(Member.users, [])
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
const existingMember = members.find(m => m.id == _f.id)
|
|
291
|
+
.setManyRelation(Member.registrations as unknown as OneToManyRelation<'registrations', Member, Registration & { group: Group }>, [])
|
|
292
|
+
.setManyRelation(Member.users, []);
|
|
293
|
+
|
|
294
|
+
// Seach if we already got this member?
|
|
295
|
+
const existingMember = members.find(m => m.id == _f.id);
|
|
296
296
|
|
|
297
|
-
const member: MemberWithRegistrations = (existingMember ?? _f)
|
|
297
|
+
const member: MemberWithRegistrations = (existingMember ?? _f);
|
|
298
298
|
if (!existingMember) {
|
|
299
|
-
members.push(member)
|
|
299
|
+
members.push(member);
|
|
300
300
|
}
|
|
301
301
|
|
|
302
|
-
|
|
303
|
-
const registration = Registration.fromRow(row[Registration.table])
|
|
302
|
+
// Check if we have a registration with a payment
|
|
303
|
+
const registration = Registration.fromRow(row[Registration.table]);
|
|
304
304
|
if (registration) {
|
|
305
305
|
// Check if we already have this registration
|
|
306
306
|
if (!member.registrations.find(r => r.id == registration.id)) {
|
|
307
|
-
const g = groups.find(g => g.id == registration.groupId)
|
|
307
|
+
const g = groups.find(g => g.id == registration.groupId);
|
|
308
308
|
if (!g) {
|
|
309
|
-
throw new Error(
|
|
309
|
+
throw new Error('Group not found');
|
|
310
310
|
}
|
|
311
311
|
if (g.deletedAt === null) {
|
|
312
|
-
member.registrations.push(registration.setRelation(Registration.group, g))
|
|
312
|
+
member.registrations.push(registration.setRelation(Registration.group, g));
|
|
313
313
|
}
|
|
314
314
|
}
|
|
315
315
|
}
|
|
316
316
|
|
|
317
317
|
// Check if we have a user
|
|
318
|
-
const user = User.fromRow(row[User.table])
|
|
318
|
+
const user = User.fromRow(row[User.table]);
|
|
319
319
|
if (user) {
|
|
320
320
|
// Check if we already have this registration
|
|
321
321
|
if (!member.users.find(r => r.id == user.id)) {
|
|
322
|
-
member.users.push(user)
|
|
322
|
+
member.users.push(user);
|
|
323
323
|
}
|
|
324
324
|
}
|
|
325
325
|
}
|
|
326
326
|
|
|
327
|
-
return members
|
|
328
|
-
|
|
327
|
+
return members;
|
|
329
328
|
}
|
|
330
329
|
|
|
331
330
|
/**
|
|
@@ -333,27 +332,27 @@ export class Member extends Model {
|
|
|
333
332
|
*/
|
|
334
333
|
static async getFamilyWithRegistrations(id: string): Promise<MemberWithRegistrations[]> {
|
|
335
334
|
let query = `SELECT l2.membersId as id from _members_users l1\n`;
|
|
336
|
-
query += `JOIN _members_users l2 on l2.usersId = l1.usersId \n
|
|
337
|
-
query += `where l1.membersId = ? group by l2.membersId
|
|
335
|
+
query += `JOIN _members_users l2 on l2.usersId = l1.usersId \n`;
|
|
336
|
+
query += `where l1.membersId = ? group by l2.membersId`;
|
|
338
337
|
|
|
339
|
-
const [results] = await Database.select(query, [id])
|
|
340
|
-
const ids: string[] = []
|
|
338
|
+
const [results] = await Database.select(query, [id]);
|
|
339
|
+
const ids: string[] = [];
|
|
341
340
|
for (const row of results) {
|
|
342
|
-
ids.push(row[
|
|
341
|
+
ids.push(row['l2']['id'] as string);
|
|
343
342
|
}
|
|
344
343
|
|
|
345
344
|
if (!ids.includes(id)) {
|
|
346
345
|
// Member has no users
|
|
347
|
-
ids.push(id)
|
|
346
|
+
ids.push(id);
|
|
348
347
|
}
|
|
349
|
-
|
|
350
|
-
return await this.getBlobByIds(...ids)
|
|
348
|
+
|
|
349
|
+
return await this.getBlobByIds(...ids);
|
|
351
350
|
}
|
|
352
351
|
|
|
353
|
-
|
|
352
|
+
/**
|
|
354
353
|
* Fetch all members with their corresponding (valid) registrations or waiting lists and payments
|
|
355
354
|
*/
|
|
356
|
-
|
|
355
|
+
static async getMemberIdsWithRegistrationForUser(user: User): Promise<string[]> {
|
|
357
356
|
const query = SQL
|
|
358
357
|
.select('id')
|
|
359
358
|
.from(Member.table)
|
|
@@ -363,17 +362,17 @@ export class Member extends Model {
|
|
|
363
362
|
.where(
|
|
364
363
|
SQL.column('_members_users', 'membersId'),
|
|
365
364
|
SQL.column(Member.table, 'id'),
|
|
366
|
-
)
|
|
365
|
+
),
|
|
367
366
|
).where(
|
|
368
367
|
SQL.column('_members_users', 'usersId'),
|
|
369
368
|
user.id,
|
|
370
|
-
)
|
|
369
|
+
);
|
|
371
370
|
|
|
372
|
-
const data = await query.fetch()
|
|
373
|
-
return data.map(
|
|
371
|
+
const data = await query.fetch();
|
|
372
|
+
return data.map(r => r.members.id as string);
|
|
374
373
|
}
|
|
375
374
|
|
|
376
|
-
|
|
375
|
+
/**
|
|
377
376
|
* Fetch all members with their corresponding (valid) registrations or waiting lists and payments
|
|
378
377
|
*/
|
|
379
378
|
static async getMembersWithRegistrationForUser(user: User): Promise<MemberWithRegistrations[]> {
|
|
@@ -386,10 +385,10 @@ export class Member extends Model {
|
|
|
386
385
|
registrations: this.registrations.map(r => r.getStructure()),
|
|
387
386
|
details: this.details,
|
|
388
387
|
users: this.users.map(u => u.getStructure()),
|
|
389
|
-
})
|
|
388
|
+
});
|
|
390
389
|
}
|
|
391
390
|
|
|
392
|
-
static getRegistrationWithMemberStructure(registration: RegistrationWithMember & {group: import('./Group').Group}): RegistrationWithMemberStruct {
|
|
391
|
+
static getRegistrationWithMemberStructure(registration: RegistrationWithMember & { group: import('./Group').Group }): RegistrationWithMemberStruct {
|
|
393
392
|
return RegistrationWithMemberStruct.create({
|
|
394
393
|
...registration.getStructure(),
|
|
395
394
|
cycle: registration.cycle,
|
|
@@ -398,35 +397,35 @@ export class Member extends Model {
|
|
|
398
397
|
firstName: registration.member.firstName,
|
|
399
398
|
lastName: registration.member.lastName,
|
|
400
399
|
}),
|
|
401
|
-
})
|
|
400
|
+
});
|
|
402
401
|
}
|
|
403
402
|
|
|
404
403
|
static updateMembershipsForGroupId(id: string) {
|
|
405
404
|
QueueHandler.schedule('bulk-update-memberships', async () => {
|
|
406
|
-
console.log('Bulk updating memberships for group id ', id)
|
|
405
|
+
console.log('Bulk updating memberships for group id ', id);
|
|
407
406
|
|
|
408
407
|
// Get all members that are registered in this group
|
|
409
408
|
const memberIds = (await SQL.select(
|
|
410
|
-
|
|
411
|
-
|
|
409
|
+
SQL.column('members', 'id'),
|
|
410
|
+
)
|
|
412
411
|
.from(SQL.table(Member.table))
|
|
413
412
|
.join(
|
|
414
413
|
SQL.leftJoin(
|
|
415
|
-
SQL.table(Registration.table)
|
|
414
|
+
SQL.table(Registration.table),
|
|
416
415
|
).where(
|
|
417
416
|
SQL.column(Registration.table, 'memberId'),
|
|
418
|
-
SQL.column(Member.table, 'id')
|
|
419
|
-
)
|
|
417
|
+
SQL.column(Member.table, 'id'),
|
|
418
|
+
),
|
|
420
419
|
).where(
|
|
421
420
|
SQL.column(Registration.table, 'groupId'),
|
|
422
|
-
id
|
|
423
|
-
).fetch()).flatMap(r => (r.members && (typeof r.members.id) === 'string') ? [r.members.id as string] : [])
|
|
424
|
-
|
|
421
|
+
id,
|
|
422
|
+
).fetch()).flatMap(r => (r.members && (typeof r.members.id) === 'string') ? [r.members.id as string] : []);
|
|
423
|
+
|
|
425
424
|
for (const id of memberIds) {
|
|
426
|
-
await Member.updateMembershipsForId(id)
|
|
425
|
+
await Member.updateMembershipsForId(id);
|
|
427
426
|
}
|
|
428
427
|
}).catch((e) => {
|
|
429
|
-
console.error('Failed to update memberships for group id ', id
|
|
428
|
+
console.error('Failed to update memberships for group id ', id, e);
|
|
430
429
|
});
|
|
431
430
|
}
|
|
432
431
|
|
|
@@ -435,152 +434,152 @@ export class Member extends Model {
|
|
|
435
434
|
if (!silent) {
|
|
436
435
|
console.log('update memberships for id ', id);
|
|
437
436
|
}
|
|
438
|
-
|
|
439
|
-
const me = await Member.getWithRegistrations(id)
|
|
437
|
+
|
|
438
|
+
const me = await Member.getWithRegistrations(id);
|
|
440
439
|
if (!me) {
|
|
441
440
|
if (!silent) {
|
|
442
|
-
console.log('Skipping automatic membership for: ' + id, ' - member not found')
|
|
441
|
+
console.log('Skipping automatic membership for: ' + id, ' - member not found');
|
|
443
442
|
}
|
|
444
|
-
return
|
|
443
|
+
return;
|
|
445
444
|
}
|
|
446
|
-
const platform = await Platform.getShared()
|
|
447
|
-
const registrations = me.registrations.filter(r => r.group.periodId == platform.periodId && r.registeredAt && !r.deactivatedAt)
|
|
445
|
+
const platform = await Platform.getShared();
|
|
446
|
+
const registrations = me.registrations.filter(r => r.group.periodId == platform.periodId && r.registeredAt && !r.deactivatedAt);
|
|
448
447
|
|
|
449
|
-
const defaultMemberships = registrations.flatMap(r => {
|
|
448
|
+
const defaultMemberships = registrations.flatMap((r) => {
|
|
450
449
|
if (!r.group.defaultAgeGroupId) {
|
|
451
|
-
return []
|
|
450
|
+
return [];
|
|
452
451
|
}
|
|
453
|
-
const defaultAgeGroup = platform.config.defaultAgeGroups.find(g => g.id == r.group.defaultAgeGroupId)
|
|
452
|
+
const defaultAgeGroup = platform.config.defaultAgeGroups.find(g => g.id == r.group.defaultAgeGroupId);
|
|
454
453
|
if (!defaultAgeGroup || !defaultAgeGroup.defaultMembershipTypeId) {
|
|
455
|
-
return []
|
|
454
|
+
return [];
|
|
456
455
|
}
|
|
457
456
|
|
|
458
|
-
const defaultMembership
|
|
457
|
+
const defaultMembership = platform.config.membershipTypes.find(m => m.id == defaultAgeGroup.defaultMembershipTypeId);
|
|
459
458
|
if (!defaultMembership) {
|
|
460
|
-
return []
|
|
459
|
+
return [];
|
|
461
460
|
}
|
|
462
461
|
|
|
463
462
|
if (defaultMembership.periods.get(platform.periodId) === undefined) {
|
|
464
|
-
console.warn('Found default membership without period configuration', defaultMembership.id, platform.periodId)
|
|
465
|
-
return []
|
|
463
|
+
console.warn('Found default membership without period configuration', defaultMembership.id, platform.periodId);
|
|
464
|
+
return [];
|
|
466
465
|
}
|
|
467
466
|
|
|
468
467
|
return [{
|
|
469
468
|
registration: r,
|
|
470
469
|
membership: defaultMembership,
|
|
471
|
-
}]
|
|
470
|
+
}];
|
|
472
471
|
});
|
|
473
472
|
|
|
474
473
|
// Get active memberships for this member that
|
|
475
|
-
const memberships = await MemberPlatformMembership.where({memberId: me.id, periodId: platform.periodId })
|
|
476
|
-
const now = new Date()
|
|
477
|
-
const activeMemberships = memberships.filter(m => m.startDate <= now && m.endDate >= now && m.deletedAt === null)
|
|
478
|
-
const activeMembershipsUndeletable = activeMemberships.filter(m => !m.canDelete() || !m.generated)
|
|
474
|
+
const memberships = await MemberPlatformMembership.where({ memberId: me.id, periodId: platform.periodId });
|
|
475
|
+
const now = new Date();
|
|
476
|
+
const activeMemberships = memberships.filter(m => m.startDate <= now && m.endDate >= now && m.deletedAt === null);
|
|
477
|
+
const activeMembershipsUndeletable = activeMemberships.filter(m => !m.canDelete() || !m.generated);
|
|
479
478
|
|
|
480
479
|
if (defaultMemberships.length == 0) {
|
|
481
480
|
// Stop all active memberships that were added automatically
|
|
482
481
|
for (const membership of activeMemberships) {
|
|
483
482
|
if (membership.canDelete() && membership.generated) {
|
|
484
483
|
if (!silent) {
|
|
485
|
-
console.log('Removing membership because no longer registered member and not yet invoiced for: ' + me.id + ' - membership ' + membership.id)
|
|
484
|
+
console.log('Removing membership because no longer registered member and not yet invoiced for: ' + me.id + ' - membership ' + membership.id);
|
|
486
485
|
}
|
|
487
|
-
membership.deletedAt = new Date()
|
|
488
|
-
await membership.save()
|
|
486
|
+
membership.deletedAt = new Date();
|
|
487
|
+
await membership.save();
|
|
489
488
|
}
|
|
490
489
|
}
|
|
491
490
|
|
|
492
491
|
if (!silent) {
|
|
493
|
-
console.log('Skipping automatic membership for: ' + me.id, ' - no default memberships found')
|
|
492
|
+
console.log('Skipping automatic membership for: ' + me.id, ' - no default memberships found');
|
|
494
493
|
}
|
|
495
|
-
return
|
|
494
|
+
return;
|
|
496
495
|
}
|
|
497
496
|
|
|
498
|
-
|
|
499
497
|
if (activeMembershipsUndeletable.length) {
|
|
500
498
|
// Skip automatic additions
|
|
501
|
-
for (const m of activeMembershipsUndeletable) {
|
|
502
|
-
await m.calculatePrice(me)
|
|
503
|
-
await m.save()
|
|
499
|
+
for (const m of activeMembershipsUndeletable) {
|
|
500
|
+
await m.calculatePrice(me);
|
|
501
|
+
await m.save();
|
|
504
502
|
}
|
|
505
|
-
return
|
|
503
|
+
return;
|
|
506
504
|
}
|
|
507
505
|
|
|
508
506
|
// Add the cheapest available membership
|
|
509
507
|
const organizations = await Organization.getByIDs(...Formatter.uniqueArray(defaultMemberships.map(m => m.registration.organizationId)));
|
|
510
508
|
|
|
511
|
-
const defaultMembershipsWithOrganization = defaultMemberships.map(({membership, registration}) => {
|
|
509
|
+
const defaultMembershipsWithOrganization = defaultMemberships.map(({ membership, registration }) => {
|
|
512
510
|
const organizationId = registration.organizationId;
|
|
513
511
|
const organization = organizations.find(o => o.id === organizationId);
|
|
514
|
-
return {membership, registration, organization}
|
|
512
|
+
return { membership, registration, organization };
|
|
515
513
|
});
|
|
516
514
|
|
|
517
515
|
const shouldApplyReducedPrice = me.details.shouldApplyReducedPrice;
|
|
518
516
|
|
|
519
|
-
const cheapestMembership = defaultMembershipsWithOrganization.sort(({membership: a, registration: ar, organization: ao}, {membership: b, registration: br, organization: bo}) => {
|
|
517
|
+
const cheapestMembership = defaultMembershipsWithOrganization.sort(({ membership: a, registration: ar, organization: ao }, { membership: b, registration: br, organization: bo }) => {
|
|
520
518
|
const tagIdsA = ao?.meta.tags ?? [];
|
|
521
519
|
const tagIdsB = bo?.meta.tags ?? [];
|
|
522
|
-
const diff = a.getPrice(platform.periodId, now, tagIdsA, shouldApplyReducedPrice)! - b.getPrice(platform.periodId, now, tagIdsB, shouldApplyReducedPrice)
|
|
520
|
+
const diff = a.getPrice(platform.periodId, now, tagIdsA, shouldApplyReducedPrice)! - b.getPrice(platform.periodId, now, tagIdsB, shouldApplyReducedPrice)!;
|
|
523
521
|
if (diff == 0) {
|
|
524
|
-
return Sorter.byDateValue(br.createdAt, ar.createdAt)
|
|
522
|
+
return Sorter.byDateValue(br.createdAt, ar.createdAt);
|
|
525
523
|
}
|
|
526
|
-
return diff
|
|
527
|
-
})[0]
|
|
524
|
+
return diff;
|
|
525
|
+
})[0];
|
|
528
526
|
if (!cheapestMembership) {
|
|
529
|
-
throw new Error(
|
|
527
|
+
throw new Error('No membership found');
|
|
530
528
|
}
|
|
531
529
|
|
|
532
530
|
// Check if already have the same membership
|
|
533
531
|
for (const m of activeMemberships) {
|
|
534
532
|
if (m.membershipTypeId === cheapestMembership.membership.id) {
|
|
535
|
-
// Update the price of this active membership (could have changed)
|
|
536
|
-
await m.calculatePrice(me)
|
|
537
|
-
await m.save()
|
|
538
|
-
return
|
|
533
|
+
// Update the price of this active membership (could have changed)
|
|
534
|
+
await m.calculatePrice(me);
|
|
535
|
+
await m.save();
|
|
536
|
+
return;
|
|
539
537
|
}
|
|
540
538
|
}
|
|
541
539
|
|
|
542
|
-
const periodConfig = cheapestMembership.membership.periods.get(platform.periodId)
|
|
540
|
+
const periodConfig = cheapestMembership.membership.periods.get(platform.periodId);
|
|
543
541
|
if (!periodConfig) {
|
|
544
|
-
console.error(
|
|
542
|
+
console.error('Missing membership prices for membership type ' + cheapestMembership.membership.id + ' and period ' + platform.periodId);
|
|
545
543
|
return;
|
|
546
544
|
}
|
|
547
545
|
|
|
548
546
|
// Can we revive an earlier deleted membership?
|
|
549
547
|
if (!silent) {
|
|
550
|
-
console.log('Creating automatic membership for: ' + me.id + ' - membership type ' + cheapestMembership.membership.id)
|
|
548
|
+
console.log('Creating automatic membership for: ' + me.id + ' - membership type ' + cheapestMembership.membership.id);
|
|
551
549
|
}
|
|
552
550
|
const membership = new MemberPlatformMembership();
|
|
553
|
-
membership.memberId = me.id
|
|
554
|
-
membership.membershipTypeId = cheapestMembership.membership.id
|
|
555
|
-
membership.organizationId = cheapestMembership.registration.organizationId
|
|
556
|
-
membership.periodId = platform.periodId
|
|
557
|
-
|
|
558
|
-
membership.startDate = periodConfig.startDate
|
|
559
|
-
membership.endDate = periodConfig.endDate
|
|
560
|
-
membership.expireDate = periodConfig.expireDate
|
|
551
|
+
membership.memberId = me.id;
|
|
552
|
+
membership.membershipTypeId = cheapestMembership.membership.id;
|
|
553
|
+
membership.organizationId = cheapestMembership.registration.organizationId;
|
|
554
|
+
membership.periodId = platform.periodId;
|
|
555
|
+
|
|
556
|
+
membership.startDate = periodConfig.startDate;
|
|
557
|
+
membership.endDate = periodConfig.endDate;
|
|
558
|
+
membership.expireDate = periodConfig.expireDate;
|
|
561
559
|
membership.generated = true;
|
|
562
560
|
|
|
563
|
-
if(me.details.memberNumber === null) {
|
|
561
|
+
if (me.details.memberNumber === null) {
|
|
564
562
|
try {
|
|
565
563
|
await me.assignMemberNumber(membership);
|
|
566
|
-
}
|
|
564
|
+
}
|
|
565
|
+
catch (error) {
|
|
567
566
|
console.error(`Failed to assign member number for id ${me.id}: ${error.message}`);
|
|
568
567
|
// If the assignment of the member number fails the membership is not created but the member is registered
|
|
569
568
|
return;
|
|
570
569
|
}
|
|
571
570
|
}
|
|
572
571
|
|
|
573
|
-
await membership.calculatePrice(me)
|
|
574
|
-
await membership.save()
|
|
572
|
+
await membership.calculatePrice(me);
|
|
573
|
+
await membership.save();
|
|
575
574
|
|
|
576
575
|
// This reasoning allows us to replace an existing membership with a cheaper one (not date based ones, but type based ones)
|
|
577
576
|
for (const toDelete of activeMemberships) {
|
|
578
577
|
if (toDelete.canDelete() && toDelete.generated) {
|
|
579
578
|
if (!silent) {
|
|
580
|
-
console.log('Removing membership because cheaper membership found for: ' + me.id + ' - membership ' + toDelete.id)
|
|
579
|
+
console.log('Removing membership because cheaper membership found for: ' + me.id + ' - membership ' + toDelete.id);
|
|
581
580
|
}
|
|
582
|
-
toDelete.deletedAt = new Date()
|
|
583
|
-
await toDelete.save()
|
|
581
|
+
toDelete.deletedAt = new Date();
|
|
582
|
+
await toDelete.save();
|
|
584
583
|
}
|
|
585
584
|
}
|
|
586
585
|
});
|
|
@@ -591,24 +590,26 @@ export class Member extends Model {
|
|
|
591
590
|
|
|
592
591
|
if (member.details?.memberNumber) {
|
|
593
592
|
console.log('Member already has member number, should not happen');
|
|
594
|
-
return
|
|
593
|
+
return;
|
|
595
594
|
}
|
|
596
|
-
|
|
595
|
+
|
|
597
596
|
return await QueueHandler.schedule('assignMemberNumber', async function (this: undefined) {
|
|
598
597
|
try {
|
|
599
598
|
const memberNumber = await member.createMemberNumber(membership);
|
|
600
599
|
member.details.memberNumber = memberNumber;
|
|
601
600
|
await member.save();
|
|
602
|
-
}
|
|
603
|
-
|
|
601
|
+
}
|
|
602
|
+
catch (error) {
|
|
603
|
+
if (isSimpleError(error) || isSimpleErrors(error)) {
|
|
604
604
|
throw error;
|
|
605
|
-
}
|
|
605
|
+
}
|
|
606
|
+
else {
|
|
606
607
|
console.error(error);
|
|
607
608
|
throw new SimpleError({
|
|
608
609
|
code: 'assign_member_number',
|
|
609
610
|
message: error.message,
|
|
610
|
-
human:
|
|
611
|
-
})
|
|
611
|
+
human: 'Er is iets misgegaan bij het aanmaken van het lidnummer.',
|
|
612
|
+
});
|
|
612
613
|
}
|
|
613
614
|
}
|
|
614
615
|
});
|
|
@@ -617,13 +618,13 @@ export class Member extends Model {
|
|
|
617
618
|
async createMemberNumber(membership: MemberPlatformMembership): Promise<string> {
|
|
618
619
|
// example: 5301-101012-1
|
|
619
620
|
|
|
620
|
-
|
|
621
|
+
// #region get birth date part (ddmmjj)
|
|
621
622
|
const birthDay = this.details?.birthDay;
|
|
622
|
-
if(!birthDay) {
|
|
623
|
+
if (!birthDay) {
|
|
623
624
|
throw new SimpleError({
|
|
624
625
|
code: 'assign_member_number',
|
|
625
|
-
message:
|
|
626
|
-
human:
|
|
626
|
+
message: 'Missing birthDay',
|
|
627
|
+
human: 'Er kon geen lidnummer aangemaakt worden omdat er geen geboortedatum is ingesteld.',
|
|
627
628
|
});
|
|
628
629
|
}
|
|
629
630
|
|
|
@@ -631,68 +632,69 @@ export class Member extends Model {
|
|
|
631
632
|
const monthPart = (birthDay.getMonth() + 1).toString().padStart(2, '0');
|
|
632
633
|
const yearPart = birthDay.getFullYear().toString().slice(2, 4);
|
|
633
634
|
const birthDatePart = `${dayPart}${monthPart}${yearPart}`;
|
|
634
|
-
|
|
635
|
+
// #endregion
|
|
635
636
|
|
|
636
|
-
|
|
637
|
+
// #region get group number
|
|
637
638
|
const organizationId = membership.organizationId;
|
|
638
639
|
const organization = await Organization.getByID(organizationId);
|
|
639
|
-
if(!organization) {
|
|
640
|
+
if (!organization) {
|
|
640
641
|
throw new Error(`Organization with id ${organizationId} not found`);
|
|
641
642
|
}
|
|
642
643
|
const groupNumber = organization.uri;
|
|
643
|
-
|
|
644
|
+
// #endregion
|
|
644
645
|
|
|
645
|
-
|
|
646
|
+
// #region get follow up number
|
|
646
647
|
const firstPart = `${groupNumber}-${birthDatePart}-`;
|
|
647
648
|
|
|
648
649
|
const query = SQL.select()
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
650
|
+
.from(SQL.table('members'))
|
|
651
|
+
.where(
|
|
652
|
+
new SQLWhereLike(
|
|
653
|
+
SQL.column('members', 'memberNumber'),
|
|
654
|
+
scalarToSQLExpression(`${SQLWhereLike.escape(firstPart)}%`),
|
|
655
|
+
),
|
|
656
|
+
);
|
|
656
657
|
|
|
657
658
|
const count = await query.count();
|
|
658
659
|
console.log(`Found ${count} members with a memberNumber starting with ${firstPart}`);
|
|
659
660
|
|
|
660
661
|
let followUpNumber = count;
|
|
661
|
-
|
|
662
|
+
// #endregion
|
|
662
663
|
|
|
663
|
-
|
|
664
|
+
// #region check if memberNumber is unique
|
|
664
665
|
let doesExist = true;
|
|
665
666
|
let memberNumber: string = '';
|
|
666
667
|
let tries = 0;
|
|
667
668
|
|
|
668
|
-
while(doesExist) {
|
|
669
|
+
while (doesExist) {
|
|
669
670
|
followUpNumber++;
|
|
670
671
|
memberNumber = firstPart + followUpNumber;
|
|
671
672
|
|
|
672
673
|
const result = await SQL.select()
|
|
673
|
-
|
|
674
|
-
|
|
674
|
+
.from(SQL.table('members'))
|
|
675
|
+
.where(
|
|
675
676
|
SQL.column('members', 'memberNumber'),
|
|
676
|
-
scalarToSQLExpression(memberNumber)
|
|
677
|
-
|
|
678
|
-
|
|
677
|
+
scalarToSQLExpression(memberNumber),
|
|
678
|
+
)
|
|
679
|
+
.first(false);
|
|
679
680
|
|
|
680
681
|
console.log(`Is ${memberNumber} unique? ${result === null}`);
|
|
681
682
|
|
|
682
|
-
if(result !== null) {
|
|
683
|
+
if (result !== null) {
|
|
683
684
|
tries++;
|
|
684
|
-
if(tries > 9) {
|
|
685
|
+
if (tries > 9) {
|
|
685
686
|
throw new SimpleError({
|
|
686
687
|
code: 'assign_member_number',
|
|
687
688
|
message: `Duplicate member numbers (last try: ${memberNumber}, tries: ${tries})`,
|
|
688
|
-
human:
|
|
689
|
+
human: 'Er kon geen uniek lidnummer aangemaakt worden. Mogelijks zijn er teveel leden met dezelfde geboortedatum. Neem contact op met de vereniging.',
|
|
689
690
|
});
|
|
690
691
|
}
|
|
691
|
-
}
|
|
692
|
+
}
|
|
693
|
+
else {
|
|
692
694
|
doesExist = false;
|
|
693
695
|
}
|
|
694
696
|
}
|
|
695
|
-
|
|
697
|
+
// #endregion
|
|
696
698
|
|
|
697
699
|
console.log(`Created member number: ${memberNumber}`);
|
|
698
700
|
|
|
@@ -700,12 +702,12 @@ export class Member extends Model {
|
|
|
700
702
|
}
|
|
701
703
|
|
|
702
704
|
async updateMemberships() {
|
|
703
|
-
return await Member.updateMembershipsForId(this.id)
|
|
705
|
+
return await Member.updateMembershipsForId(this.id);
|
|
704
706
|
}
|
|
705
707
|
|
|
706
708
|
async isSafeToMergeDuplicateWithoutSecurityCode() {
|
|
707
709
|
// If responsibilities: not safe
|
|
708
|
-
const responsibilities = await MemberResponsibilityRecord.where({ memberId: this.id }, {limit: 1});
|
|
710
|
+
const responsibilities = await MemberResponsibilityRecord.where({ memberId: this.id }, { limit: 1 });
|
|
709
711
|
if (responsibilities.length > 0) {
|
|
710
712
|
return false;
|
|
711
713
|
}
|