@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
|
@@ -1,22 +1,21 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { QueueHandler } from "@stamhoofd/queues";
|
|
1
|
+
import { column, Model } from '@simonbackx/simple-database';
|
|
2
|
+
import { isSimpleError, isSimpleErrors, SimpleError } from '@simonbackx/simple-errors';
|
|
3
|
+
import { QueueHandler } from '@stamhoofd/queues';
|
|
5
4
|
import { DocumentData, DocumentPrivateSettings, DocumentSettings, DocumentStatus, DocumentTemplatePrivate, RecordAddressAnswer, RecordAnswer, RecordAnswerDecoder, RecordDateAnswer, RecordPriceAnswer, RecordSettings, RecordTextAnswer, RecordType } from '@stamhoofd/structures';
|
|
6
|
-
import { Sorter } from
|
|
7
|
-
import { v4 as uuidv4 } from
|
|
5
|
+
import { Sorter } from '@stamhoofd/utility';
|
|
6
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
8
7
|
|
|
9
|
-
import { render } from
|
|
10
|
-
import { BalanceItem } from
|
|
11
|
-
import { Document } from
|
|
12
|
-
import { Group } from
|
|
13
|
-
import { Member, RegistrationWithMember } from
|
|
14
|
-
import { Organization } from
|
|
8
|
+
import { render } from '../helpers/Handlebars';
|
|
9
|
+
import { BalanceItem } from './BalanceItem';
|
|
10
|
+
import { Document } from './Document';
|
|
11
|
+
import { Group } from './Group';
|
|
12
|
+
import { Member, RegistrationWithMember } from './Member';
|
|
13
|
+
import { Organization } from './Organization';
|
|
15
14
|
|
|
16
15
|
export class DocumentTemplate extends Model {
|
|
17
|
-
static table =
|
|
16
|
+
static table = 'document_templates';
|
|
18
17
|
|
|
19
|
-
@column({ primary: true, type:
|
|
18
|
+
@column({ primary: true, type: 'string', beforeSave(value) {
|
|
20
19
|
return value ?? uuidv4();
|
|
21
20
|
} })
|
|
22
21
|
id!: string;
|
|
@@ -24,158 +23,158 @@ export class DocumentTemplate extends Model {
|
|
|
24
23
|
/**
|
|
25
24
|
* The HTML that is used to generate the PDF
|
|
26
25
|
*/
|
|
27
|
-
@column({ type:
|
|
28
|
-
html: string
|
|
26
|
+
@column({ type: 'string' })
|
|
27
|
+
html: string;
|
|
29
28
|
|
|
30
|
-
@column({ type:
|
|
31
|
-
organizationId: string
|
|
29
|
+
@column({ type: 'string' })
|
|
30
|
+
organizationId: string;
|
|
32
31
|
|
|
33
|
-
@column({ type:
|
|
34
|
-
status = DocumentStatus.Draft
|
|
32
|
+
@column({ type: 'string' })
|
|
33
|
+
status = DocumentStatus.Draft;
|
|
35
34
|
|
|
36
|
-
@column({ type:
|
|
37
|
-
updatesEnabled = true
|
|
35
|
+
@column({ type: 'boolean' })
|
|
36
|
+
updatesEnabled = true;
|
|
38
37
|
|
|
39
38
|
/**
|
|
40
39
|
* Settings of the smart document. This information is public
|
|
41
40
|
*/
|
|
42
|
-
@column({ type:
|
|
43
|
-
settings: DocumentSettings
|
|
41
|
+
@column({ type: 'json', decoder: DocumentSettings })
|
|
42
|
+
settings: DocumentSettings;
|
|
44
43
|
|
|
45
44
|
/**
|
|
46
|
-
*
|
|
45
|
+
*
|
|
47
46
|
*/
|
|
48
|
-
@column({ type:
|
|
49
|
-
privateSettings: DocumentPrivateSettings
|
|
47
|
+
@column({ type: 'json', decoder: DocumentPrivateSettings })
|
|
48
|
+
privateSettings: DocumentPrivateSettings;
|
|
50
49
|
|
|
51
|
-
@column({ type:
|
|
52
|
-
createdAt: Date = new Date()
|
|
50
|
+
@column({ type: 'datetime' })
|
|
51
|
+
createdAt: Date = new Date();
|
|
53
52
|
|
|
54
53
|
@column({
|
|
55
|
-
type:
|
|
56
|
-
const date = new Date()
|
|
57
|
-
date.setMilliseconds(0)
|
|
58
|
-
return date
|
|
54
|
+
type: 'datetime', beforeSave() {
|
|
55
|
+
const date = new Date();
|
|
56
|
+
date.setMilliseconds(0);
|
|
57
|
+
return date;
|
|
59
58
|
},
|
|
60
|
-
skipUpdate: true
|
|
59
|
+
skipUpdate: true,
|
|
61
60
|
})
|
|
62
|
-
updatedAt: Date
|
|
61
|
+
updatedAt: Date;
|
|
63
62
|
|
|
64
63
|
getPrivateStructure() {
|
|
65
|
-
return DocumentTemplatePrivate.create(this)
|
|
64
|
+
return DocumentTemplatePrivate.create(this);
|
|
66
65
|
}
|
|
67
66
|
|
|
68
67
|
/**
|
|
69
68
|
* Returns the default answers for a given registration
|
|
70
69
|
*/
|
|
71
|
-
async buildAnswers(registration: RegistrationWithMember): Promise<{fieldAnswers: Map<string, RecordAnswer
|
|
72
|
-
const fieldAnswers = new Map<string, RecordAnswer>()
|
|
73
|
-
let missingData = false
|
|
70
|
+
async buildAnswers(registration: RegistrationWithMember): Promise<{ fieldAnswers: Map<string, RecordAnswer>; missingData: boolean }> {
|
|
71
|
+
const fieldAnswers = new Map<string, RecordAnswer>();
|
|
72
|
+
let missingData = false;
|
|
73
|
+
|
|
74
|
+
const group = await Group.getByID(registration.groupId);
|
|
75
|
+
const { payments } = await BalanceItem.getForRegistration(registration.id);
|
|
74
76
|
|
|
75
|
-
const
|
|
76
|
-
const {payments} = await BalanceItem.getForRegistration(registration.id)
|
|
77
|
+
const paidAtDates = payments.flatMap(p => p.paidAt ? [p.paidAt?.getTime()] : []);
|
|
77
78
|
|
|
78
|
-
const paidAtDates = payments.flatMap(p => p.paidAt ? [p.paidAt?.getTime()] : [])
|
|
79
|
-
|
|
80
79
|
// We take the minimum date here, because there is a highter change of later paymetns to be for other things than the registration itself
|
|
81
|
-
const paidAt = paidAtDates.length ? new Date(Math.min(...paidAtDates)) : null
|
|
80
|
+
const paidAt = paidAtDates.length ? new Date(Math.min(...paidAtDates)) : null;
|
|
82
81
|
|
|
83
82
|
// Some fields are supported by default in linked fields
|
|
84
83
|
const defaultData: Record<string, RecordAnswer> = {
|
|
85
|
-
//"registration.startDate": registration.group.settings.startDate,
|
|
86
|
-
//"registration.endDate": registration.group.settings.endDate,
|
|
87
|
-
|
|
84
|
+
// "registration.startDate": registration.group.settings.startDate,
|
|
85
|
+
// "registration.endDate": registration.group.settings.endDate,
|
|
86
|
+
'group.name': RecordTextAnswer.create({
|
|
88
87
|
settings: RecordSettings.create({
|
|
89
|
-
id:
|
|
88
|
+
id: 'group.name',
|
|
90
89
|
type: RecordType.Text,
|
|
91
90
|
}), // settings will be overwritten
|
|
92
|
-
value: group?.settings?.name ??
|
|
93
|
-
}),
|
|
94
|
-
|
|
91
|
+
value: group?.settings?.name ?? '',
|
|
92
|
+
}),
|
|
93
|
+
'registration.startDate': RecordDateAnswer.create({
|
|
95
94
|
settings: RecordSettings.create({
|
|
96
|
-
id:
|
|
95
|
+
id: 'registration.startDate',
|
|
97
96
|
type: RecordType.Date,
|
|
98
97
|
}), // settings will be overwritten
|
|
99
|
-
dateValue: group?.settings?.startDate
|
|
98
|
+
dateValue: group?.settings?.startDate,
|
|
100
99
|
}),
|
|
101
|
-
|
|
100
|
+
'registration.endDate': RecordDateAnswer.create({
|
|
102
101
|
settings: RecordSettings.create({
|
|
103
|
-
id:
|
|
102
|
+
id: 'registration.endDate',
|
|
104
103
|
type: RecordType.Date,
|
|
105
104
|
}), // settings will be overwritten
|
|
106
|
-
dateValue: group?.settings?.endDate
|
|
105
|
+
dateValue: group?.settings?.endDate,
|
|
107
106
|
}),
|
|
108
|
-
|
|
107
|
+
'registration.price':
|
|
109
108
|
RecordPriceAnswer.create({
|
|
110
109
|
settings: RecordSettings.create({}), // settings will be overwritten
|
|
111
|
-
value: registration.price
|
|
110
|
+
value: registration.price,
|
|
112
111
|
}),
|
|
113
|
-
|
|
112
|
+
'registration.pricePaid':
|
|
114
113
|
RecordPriceAnswer.create({
|
|
115
114
|
settings: RecordSettings.create({}), // settings will be overwritten
|
|
116
|
-
value: registration.pricePaid
|
|
115
|
+
value: registration.pricePaid,
|
|
117
116
|
}),
|
|
118
|
-
|
|
117
|
+
'registration.paidAt':
|
|
119
118
|
RecordDateAnswer.create({
|
|
120
119
|
settings: RecordSettings.create({
|
|
121
|
-
id:
|
|
120
|
+
id: 'registration.paidAt',
|
|
122
121
|
type: RecordType.Date,
|
|
123
122
|
}), // settings will be overwritten
|
|
124
|
-
dateValue: paidAt
|
|
123
|
+
dateValue: paidAt,
|
|
125
124
|
}),
|
|
126
|
-
|
|
125
|
+
'member.firstName': RecordTextAnswer.create({
|
|
127
126
|
settings: RecordSettings.create({}), // settings will be overwritten
|
|
128
|
-
value: registration.member.details.firstName
|
|
127
|
+
value: registration.member.details.firstName,
|
|
129
128
|
}),
|
|
130
|
-
|
|
129
|
+
'member.lastName': RecordTextAnswer.create({
|
|
131
130
|
settings: RecordSettings.create({}), // settings will be overwritten
|
|
132
|
-
value: registration.member.details.lastName
|
|
131
|
+
value: registration.member.details.lastName,
|
|
133
132
|
}),
|
|
134
|
-
|
|
133
|
+
'member.address': RecordAddressAnswer.create({
|
|
135
134
|
settings: RecordSettings.create({}), // settings will be overwritten
|
|
136
|
-
address: registration.member.details.address ?? null
|
|
135
|
+
address: registration.member.details.address ?? null,
|
|
137
136
|
}),
|
|
138
|
-
|
|
137
|
+
'member.email': RecordTextAnswer.create({
|
|
139
138
|
settings: RecordSettings.create({}), // settings will be overwritten
|
|
140
|
-
value: registration.member.details.email ?? null
|
|
139
|
+
value: registration.member.details.email ?? null,
|
|
141
140
|
}),
|
|
142
|
-
|
|
141
|
+
'member.birthDay': RecordDateAnswer.create({
|
|
143
142
|
settings: RecordSettings.create({}), // settings will be overwritten
|
|
144
|
-
dateValue: registration.member.details.birthDay
|
|
143
|
+
dateValue: registration.member.details.birthDay,
|
|
145
144
|
}),
|
|
146
|
-
|
|
145
|
+
'parents[0].firstName': RecordTextAnswer.create({
|
|
147
146
|
settings: RecordSettings.create({}), // settings will be overwritten
|
|
148
|
-
value: registration.member.details.parents[0]?.firstName
|
|
147
|
+
value: registration.member.details.parents[0]?.firstName,
|
|
149
148
|
}),
|
|
150
|
-
|
|
149
|
+
'parents[0].lastName': RecordTextAnswer.create({
|
|
151
150
|
settings: RecordSettings.create({}), // settings will be overwritten
|
|
152
|
-
value: registration.member.details.parents[0]?.lastName
|
|
151
|
+
value: registration.member.details.parents[0]?.lastName,
|
|
153
152
|
}),
|
|
154
|
-
|
|
153
|
+
'parents[0].address': RecordAddressAnswer.create({
|
|
155
154
|
settings: RecordSettings.create({}), // settings will be overwritten
|
|
156
|
-
address: registration.member.details.parents[0]?.address ?? null
|
|
155
|
+
address: registration.member.details.parents[0]?.address ?? null,
|
|
157
156
|
}),
|
|
158
|
-
|
|
157
|
+
'parents[0].email': RecordTextAnswer.create({
|
|
159
158
|
settings: RecordSettings.create({}), // settings will be overwritten
|
|
160
|
-
value: registration.member.details.parents[0]?.email ?? null
|
|
159
|
+
value: registration.member.details.parents[0]?.email ?? null,
|
|
161
160
|
}),
|
|
162
|
-
|
|
161
|
+
'parents[1].firstName': RecordTextAnswer.create({
|
|
163
162
|
settings: RecordSettings.create({}), // settings will be overwritten
|
|
164
|
-
value: registration.member.details.parents[1]?.firstName
|
|
163
|
+
value: registration.member.details.parents[1]?.firstName,
|
|
165
164
|
}),
|
|
166
|
-
|
|
165
|
+
'parents[1].lastName': RecordTextAnswer.create({
|
|
167
166
|
settings: RecordSettings.create({}), // settings will be overwritten
|
|
168
|
-
value: registration.member.details.parents[1]?.lastName
|
|
167
|
+
value: registration.member.details.parents[1]?.lastName,
|
|
169
168
|
}),
|
|
170
|
-
|
|
169
|
+
'parents[1].address': RecordAddressAnswer.create({
|
|
171
170
|
settings: RecordSettings.create({}), // settings will be overwritten
|
|
172
|
-
address: registration.member.details.parents[1]?.address ?? null
|
|
171
|
+
address: registration.member.details.parents[1]?.address ?? null,
|
|
173
172
|
}),
|
|
174
|
-
|
|
173
|
+
'parents[1].email': RecordTextAnswer.create({
|
|
175
174
|
settings: RecordSettings.create({}), // settings will be overwritten
|
|
176
|
-
value: registration.member.details.parents[1]?.email ?? null
|
|
177
|
-
})
|
|
178
|
-
}
|
|
175
|
+
value: registration.member.details.parents[1]?.email ?? null,
|
|
176
|
+
}),
|
|
177
|
+
};
|
|
179
178
|
|
|
180
179
|
// Add data that is different for each member
|
|
181
180
|
for (const field of this.privateSettings.templateDefinition.documentFieldCategories.flatMap(c => c.getAllRecords())) {
|
|
@@ -183,7 +182,7 @@ export class DocumentTemplate extends Model {
|
|
|
183
182
|
// - Could either return an id of a recordSetting connected to member
|
|
184
183
|
// - or an idea of defaultData that is supported by default
|
|
185
184
|
// The result is always a recordAnswer whose type should match the type of the linkedField
|
|
186
|
-
const linkedToMemberAnswerSettingsIds = this.settings.linkedFields.get(field.id)
|
|
185
|
+
const linkedToMemberAnswerSettingsIds = this.settings.linkedFields.get(field.id);
|
|
187
186
|
|
|
188
187
|
let found = false;
|
|
189
188
|
|
|
@@ -191,14 +190,14 @@ export class DocumentTemplate extends Model {
|
|
|
191
190
|
for (const linkedToMemberAnswerSettingsId of linkedToMemberAnswerSettingsIds) {
|
|
192
191
|
if (linkedToMemberAnswerSettingsId) {
|
|
193
192
|
const answer = registration.member.details.recordAnswers.get(linkedToMemberAnswerSettingsId);
|
|
194
|
-
if (answer && !answer.isEmpty && answer.settings.type === field.type) {
|
|
193
|
+
if (answer && !answer.isEmpty && answer.settings.type === field.type) {
|
|
195
194
|
// We need to link it with the settings in the template
|
|
196
|
-
const clone = answer.clone()
|
|
197
|
-
clone.settings = field
|
|
198
|
-
clone.reviewedAt = null // All linked fields are not reviewed. Unless they are manually changed by an admin later
|
|
199
|
-
|
|
200
|
-
found = true
|
|
201
|
-
fieldAnswers.set(field.id, clone)
|
|
195
|
+
const clone = answer.clone();
|
|
196
|
+
clone.settings = field;
|
|
197
|
+
clone.reviewedAt = null; // All linked fields are not reviewed. Unless they are manually changed by an admin later
|
|
198
|
+
|
|
199
|
+
found = true;
|
|
200
|
+
fieldAnswers.set(field.id, clone);
|
|
202
201
|
break;
|
|
203
202
|
}
|
|
204
203
|
|
|
@@ -206,14 +205,15 @@ export class DocumentTemplate extends Model {
|
|
|
206
205
|
if (defaultData[linkedToMemberAnswerSettingsId] && !defaultData[linkedToMemberAnswerSettingsId].isEmpty) {
|
|
207
206
|
if (defaultData[linkedToMemberAnswerSettingsId] instanceof RecordAnswerDecoder.getClassForType(field.type)) {
|
|
208
207
|
// We need to clone here, because the same default data can be used in multiple places
|
|
209
|
-
const clone = defaultData[linkedToMemberAnswerSettingsId].clone()
|
|
210
|
-
clone.settings = field
|
|
208
|
+
const clone = defaultData[linkedToMemberAnswerSettingsId].clone();
|
|
209
|
+
clone.settings = field;
|
|
211
210
|
|
|
212
|
-
found = true
|
|
213
|
-
fieldAnswers.set(field.id, clone)
|
|
211
|
+
found = true;
|
|
212
|
+
fieldAnswers.set(field.id, clone);
|
|
214
213
|
break;
|
|
215
|
-
}
|
|
216
|
-
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
console.warn('Found type mismatch for default data: ' + linkedToMemberAnswerSettingsId + ' - ' + field.id);
|
|
217
217
|
}
|
|
218
218
|
}
|
|
219
219
|
}
|
|
@@ -228,29 +228,29 @@ export class DocumentTemplate extends Model {
|
|
|
228
228
|
// Add placeholder (so we have proper warnings)
|
|
229
229
|
const clone = RecordAnswerDecoder.getClassForType(field.type).create({
|
|
230
230
|
settings: field,
|
|
231
|
-
})
|
|
232
|
-
fieldAnswers.set(field.id, clone)
|
|
231
|
+
});
|
|
232
|
+
fieldAnswers.set(field.id, clone);
|
|
233
233
|
}
|
|
234
234
|
}
|
|
235
235
|
|
|
236
236
|
// Add global answers (same for each document)
|
|
237
237
|
for (const answer of this.settings.fieldAnswers.values()) {
|
|
238
238
|
// todo: check duplicate
|
|
239
|
-
answer.reviewedAt = null
|
|
240
|
-
fieldAnswers.set(answer.settings.id, answer)
|
|
239
|
+
answer.reviewedAt = null;
|
|
240
|
+
fieldAnswers.set(answer.settings.id, answer);
|
|
241
241
|
}
|
|
242
242
|
|
|
243
243
|
// Add group based answers (same for each group)
|
|
244
|
-
for (const answer of this.privateSettings.groups.find(g => g.groupId === registration.groupId && g.cycle === registration.cycle)?.fieldAnswers?.values() ?? []){
|
|
244
|
+
for (const answer of this.privateSettings.groups.find(g => g.groupId === registration.groupId && g.cycle === registration.cycle)?.fieldAnswers?.values() ?? []) {
|
|
245
245
|
// todo: check duplicate
|
|
246
|
-
answer.reviewedAt = null
|
|
247
|
-
fieldAnswers.set(answer.settings.id, answer)
|
|
246
|
+
answer.reviewedAt = null;
|
|
247
|
+
fieldAnswers.set(answer.settings.id, answer);
|
|
248
248
|
}
|
|
249
249
|
|
|
250
250
|
// Add other default data
|
|
251
251
|
for (const key in defaultData) {
|
|
252
252
|
if (defaultData[key] && defaultData[key].settings.id === key && !fieldAnswers.get(key)) {
|
|
253
|
-
fieldAnswers.set(key, defaultData[key])
|
|
253
|
+
fieldAnswers.set(key, defaultData[key]);
|
|
254
254
|
}
|
|
255
255
|
}
|
|
256
256
|
|
|
@@ -258,9 +258,10 @@ export class DocumentTemplate extends Model {
|
|
|
258
258
|
if (!missingData) {
|
|
259
259
|
for (const answer of fieldAnswers.values()) {
|
|
260
260
|
try {
|
|
261
|
-
answer.validate()
|
|
262
|
-
}
|
|
263
|
-
|
|
261
|
+
answer.validate();
|
|
262
|
+
}
|
|
263
|
+
catch (e) {
|
|
264
|
+
missingData = true;
|
|
264
265
|
break;
|
|
265
266
|
}
|
|
266
267
|
}
|
|
@@ -268,33 +269,33 @@ export class DocumentTemplate extends Model {
|
|
|
268
269
|
|
|
269
270
|
return {
|
|
270
271
|
fieldAnswers,
|
|
271
|
-
missingData
|
|
272
|
-
}
|
|
272
|
+
missingData,
|
|
273
|
+
};
|
|
273
274
|
}
|
|
274
275
|
|
|
275
276
|
async createForRegistrationIfNeeded(registration: RegistrationWithMember) {
|
|
276
277
|
// Check group and cycle
|
|
277
278
|
for (const groupDefinition of this.privateSettings.groups) {
|
|
278
279
|
if (groupDefinition.groupId === registration.groupId && groupDefinition.cycle === registration.cycle) {
|
|
279
|
-
const document = await this.generateForRegistration(registration)
|
|
280
|
+
const document = await this.generateForRegistration(registration);
|
|
280
281
|
if (document) {
|
|
281
|
-
await document.save()
|
|
282
|
+
await document.save();
|
|
282
283
|
}
|
|
283
284
|
}
|
|
284
285
|
}
|
|
285
286
|
}
|
|
286
287
|
|
|
287
288
|
private async generateForRegistration(registration: RegistrationWithMember) {
|
|
288
|
-
const {fieldAnswers, missingData} = await this.buildAnswers(registration)
|
|
289
|
-
const existingDocuments = await Document.where({ templateId: this.id, registrationId: registration.id }, {limit: 1})
|
|
289
|
+
const { fieldAnswers, missingData } = await this.buildAnswers(registration);
|
|
290
|
+
const existingDocuments = await Document.where({ templateId: this.id, registrationId: registration.id }, { limit: 1 });
|
|
290
291
|
|
|
291
292
|
if (!this.checkIncluded(registration, fieldAnswers)) {
|
|
292
293
|
if (existingDocuments.length > 0) {
|
|
293
294
|
for (const document of existingDocuments) {
|
|
294
|
-
await document.delete()
|
|
295
|
+
await document.delete();
|
|
295
296
|
}
|
|
296
297
|
}
|
|
297
|
-
return null
|
|
298
|
+
return null;
|
|
298
299
|
}
|
|
299
300
|
|
|
300
301
|
const fieldId = 'registration.startDate';
|
|
@@ -309,33 +310,34 @@ export class DocumentTemplate extends Model {
|
|
|
309
310
|
}
|
|
310
311
|
}
|
|
311
312
|
|
|
312
|
-
const group = await Group.getByID(registration.groupId)
|
|
313
|
+
const group = await Group.getByID(registration.groupId);
|
|
313
314
|
const description = `${registration.member.details.name}, ${group ? group.settings.name : ''}`;
|
|
314
315
|
|
|
315
316
|
if (existingDocuments.length > 0) {
|
|
316
317
|
for (const document of existingDocuments) {
|
|
317
|
-
await this.updateDocumentFor(document, registration)
|
|
318
|
-
document.data.name = this.settings.name
|
|
319
|
-
document.data.description = description
|
|
318
|
+
await this.updateDocumentFor(document, registration);
|
|
319
|
+
document.data.name = this.settings.name;
|
|
320
|
+
document.data.description = description;
|
|
320
321
|
if (document.status === DocumentStatus.Draft || document.status === DocumentStatus.Published) {
|
|
321
322
|
document.status = this.status;
|
|
322
323
|
}
|
|
323
|
-
await document.save()
|
|
324
|
+
await document.save();
|
|
324
325
|
return document;
|
|
325
326
|
}
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
document
|
|
329
|
-
document.
|
|
327
|
+
}
|
|
328
|
+
else {
|
|
329
|
+
const document = new Document();
|
|
330
|
+
document.organizationId = this.organizationId;
|
|
331
|
+
document.templateId = this.id;
|
|
330
332
|
document.status = missingData ? DocumentStatus.MissingData : this.status;
|
|
331
333
|
document.data = DocumentData.create({
|
|
332
334
|
name: this.settings.name,
|
|
333
335
|
description,
|
|
334
|
-
fieldAnswers
|
|
335
|
-
})
|
|
336
|
-
document.memberId = registration.member.id
|
|
337
|
-
document.registrationId = registration.id
|
|
338
|
-
await document.save()
|
|
336
|
+
fieldAnswers,
|
|
337
|
+
});
|
|
338
|
+
document.memberId = registration.member.id;
|
|
339
|
+
document.registrationId = registration.id;
|
|
340
|
+
await document.save();
|
|
339
341
|
return document;
|
|
340
342
|
}
|
|
341
343
|
}
|
|
@@ -355,18 +357,19 @@ export class DocumentTemplate extends Model {
|
|
|
355
357
|
}
|
|
356
358
|
|
|
357
359
|
if (startDate) {
|
|
358
|
-
const age = registration.member.details.ageOnDate(startDate)
|
|
360
|
+
const age = registration.member.details.ageOnDate(startDate);
|
|
359
361
|
|
|
360
362
|
if (age === null) {
|
|
361
|
-
console.warn(
|
|
363
|
+
console.warn('Missing member age checking maxAge');
|
|
362
364
|
return false;
|
|
363
365
|
}
|
|
364
366
|
|
|
365
367
|
if (age > this.settings.maxAge) {
|
|
366
368
|
return false;
|
|
367
369
|
}
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
+
}
|
|
371
|
+
else {
|
|
372
|
+
console.warn('Missing registration.startDate in fieldAnswers when checking maxAge');
|
|
370
373
|
}
|
|
371
374
|
}
|
|
372
375
|
|
|
@@ -387,19 +390,20 @@ export class DocumentTemplate extends Model {
|
|
|
387
390
|
if (price < this.settings.minPrice) {
|
|
388
391
|
return false;
|
|
389
392
|
}
|
|
390
|
-
}
|
|
391
|
-
|
|
393
|
+
}
|
|
394
|
+
else {
|
|
395
|
+
console.warn('Missing registration.price in fieldAnswers when checking minPrice');
|
|
392
396
|
}
|
|
393
397
|
}
|
|
394
|
-
|
|
398
|
+
|
|
395
399
|
return true;
|
|
396
400
|
}
|
|
397
401
|
|
|
398
|
-
async buildAll({generateNumbers = false} = {}) {
|
|
399
|
-
return await QueueHandler.schedule(
|
|
402
|
+
async buildAll({ generateNumbers = false } = {}) {
|
|
403
|
+
return await QueueHandler.schedule('documents-build-all/' + this.id, async () => {
|
|
400
404
|
if (!this.updatesEnabled) {
|
|
401
405
|
// Check status
|
|
402
|
-
const documents = await Document.where({ templateId: this.id })
|
|
406
|
+
const documents = await Document.where({ templateId: this.id });
|
|
403
407
|
for (const document of documents) {
|
|
404
408
|
if (document.status === DocumentStatus.Draft || document.status === DocumentStatus.Published) {
|
|
405
409
|
document.status = this.status;
|
|
@@ -409,7 +413,7 @@ export class DocumentTemplate extends Model {
|
|
|
409
413
|
|
|
410
414
|
// Generate numbers for all documents
|
|
411
415
|
if (generateNumbers) {
|
|
412
|
-
let nextNumber = Math.max(0, ...documents.map(d => d.number).filter(n => n !== null) as number[]) + 1
|
|
416
|
+
let nextNumber = Math.max(0, ...documents.map(d => d.number).filter(n => n !== null) as number[]) + 1;
|
|
413
417
|
for (const document of documents) {
|
|
414
418
|
if (document.number === null && document.status === DocumentStatus.Published) {
|
|
415
419
|
document.number = nextNumber;
|
|
@@ -418,42 +422,43 @@ export class DocumentTemplate extends Model {
|
|
|
418
422
|
}
|
|
419
423
|
}
|
|
420
424
|
}
|
|
421
|
-
return documents
|
|
425
|
+
return documents;
|
|
422
426
|
}
|
|
423
|
-
|
|
424
|
-
console.log('Building all documents for template', this.id)
|
|
425
|
-
const documentSet: Map<string, Document> = new Map()
|
|
427
|
+
|
|
428
|
+
console.log('Building all documents for template', this.id);
|
|
429
|
+
const documentSet: Map<string, Document> = new Map();
|
|
426
430
|
|
|
427
431
|
for (const groupDefinition of this.privateSettings.groups) {
|
|
428
432
|
// Get the registrations for this group with this cycle
|
|
429
|
-
const registrations = await Member.getRegistrationWithMembersForGroup(groupDefinition.groupId)
|
|
433
|
+
const registrations = await Member.getRegistrationWithMembersForGroup(groupDefinition.groupId);
|
|
430
434
|
|
|
431
435
|
for (const registration of registrations) {
|
|
432
|
-
const document = await this.generateForRegistration(registration)
|
|
436
|
+
const document = await this.generateForRegistration(registration);
|
|
433
437
|
if (document) {
|
|
434
|
-
documentSet.set(document.id, document)
|
|
438
|
+
documentSet.set(document.id, document);
|
|
435
439
|
}
|
|
436
440
|
}
|
|
437
441
|
}
|
|
438
442
|
|
|
439
443
|
// Delete documents that no longer match and don't have a number yet
|
|
440
|
-
const documents = await Document.where({ templateId: this.id })
|
|
444
|
+
const documents = await Document.where({ templateId: this.id });
|
|
441
445
|
for (const document of documents) {
|
|
442
446
|
if (!documentSet.has(document.id)) {
|
|
443
447
|
if (document.number === null) {
|
|
444
|
-
await document.delete()
|
|
445
|
-
}
|
|
448
|
+
await document.delete();
|
|
449
|
+
}
|
|
450
|
+
else {
|
|
446
451
|
document.status = DocumentStatus.Deleted;
|
|
447
452
|
await document.save();
|
|
448
453
|
}
|
|
449
454
|
}
|
|
450
455
|
}
|
|
451
456
|
|
|
452
|
-
const allDocuments = [...documentSet.values()]
|
|
457
|
+
const allDocuments = [...documentSet.values()];
|
|
453
458
|
|
|
454
459
|
// Generate numbers for all documents
|
|
455
460
|
if (generateNumbers) {
|
|
456
|
-
let nextNumber = Math.max(0, ...allDocuments.map(d => d.number).filter(n => n !== null) as number[]) + 1
|
|
461
|
+
let nextNumber = Math.max(0, ...allDocuments.map(d => d.number).filter(n => n !== null) as number[]) + 1;
|
|
457
462
|
for (const document of allDocuments) {
|
|
458
463
|
if (document.number === null && document.status === DocumentStatus.Published) {
|
|
459
464
|
document.number = nextNumber;
|
|
@@ -463,51 +468,51 @@ export class DocumentTemplate extends Model {
|
|
|
463
468
|
}
|
|
464
469
|
}
|
|
465
470
|
|
|
466
|
-
return allDocuments
|
|
471
|
+
return allDocuments;
|
|
467
472
|
});
|
|
468
473
|
}
|
|
469
474
|
|
|
470
475
|
private async buildContext(organization: Organization) {
|
|
471
476
|
// Convert the field answers in a simplified javascript object
|
|
472
|
-
const documents = (await this.buildAll({generateNumbers: true})).filter(d => d.status === DocumentStatus.Published && !!d.number).sort((a, b) => Sorter.byNumberValue(b.number ?? 0, a.number ?? 0))
|
|
477
|
+
const documents = (await this.buildAll({ generateNumbers: true })).filter(d => d.status === DocumentStatus.Published && !!d.number).sort((a, b) => Sorter.byNumberValue(b.number ?? 0, a.number ?? 0));
|
|
473
478
|
|
|
474
479
|
// Check numbers are strictly increasing
|
|
475
480
|
let lastNumber = 0;
|
|
476
481
|
for (const document of documents) {
|
|
477
482
|
if (document.number !== lastNumber + 1) {
|
|
478
483
|
throw new SimpleError({
|
|
479
|
-
code:
|
|
484
|
+
code: 'invalid_document_number',
|
|
480
485
|
message: 'Expected document number to be ' + (lastNumber + 1) + ' but got ' + document.number,
|
|
481
|
-
human:
|
|
482
|
-
})
|
|
486
|
+
human: 'Er ging iets mis bij het nummeren van de documenten (ben je zeker dat je geen documenten hebt verwijderd of toegevoegd sinds de vorige export?). Als je de export nog niet hebt gebruikt in Belcotax kan je de nummering resetten en de export opnieuw proberen.',
|
|
487
|
+
});
|
|
483
488
|
}
|
|
484
489
|
lastNumber = document.number;
|
|
485
490
|
}
|
|
486
491
|
|
|
487
492
|
const data = {
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
493
|
+
id: this.id,
|
|
494
|
+
created_at: this.createdAt,
|
|
495
|
+
documents: documents.map(d => d.buildContext(organization)),
|
|
491
496
|
};
|
|
492
497
|
|
|
493
498
|
for (const field of this.settings.fieldAnswers.values()) {
|
|
494
|
-
const keys = field.settings.id.split('.')
|
|
495
|
-
let current = data
|
|
496
|
-
const lastKey = keys.pop()
|
|
499
|
+
const keys = field.settings.id.split('.');
|
|
500
|
+
let current = data;
|
|
501
|
+
const lastKey = keys.pop()!;
|
|
497
502
|
if (!lastKey) {
|
|
498
|
-
throw new Error(
|
|
503
|
+
throw new Error('Invalid field id');
|
|
499
504
|
}
|
|
500
505
|
for (const key of keys) {
|
|
501
506
|
if (!current[key]) {
|
|
502
|
-
current[key] = {}
|
|
507
|
+
current[key] = {};
|
|
503
508
|
}
|
|
504
|
-
current = current[key]
|
|
509
|
+
current = current[key];
|
|
505
510
|
|
|
506
|
-
if (typeof current !==
|
|
507
|
-
throw new Error(
|
|
511
|
+
if (typeof current !== 'object') {
|
|
512
|
+
throw new Error('Invalid field type');
|
|
508
513
|
}
|
|
509
514
|
}
|
|
510
|
-
current[lastKey] = field.objectValue
|
|
515
|
+
current[lastKey] = field.objectValue;
|
|
511
516
|
}
|
|
512
517
|
|
|
513
518
|
return data;
|
|
@@ -517,31 +522,33 @@ export class DocumentTemplate extends Model {
|
|
|
517
522
|
if (!this.privateSettings.templateDefinition.xmlExport) {
|
|
518
523
|
return null;
|
|
519
524
|
}
|
|
520
|
-
|
|
525
|
+
|
|
521
526
|
try {
|
|
522
|
-
const context = await this.buildContext(organization)
|
|
527
|
+
const context = await this.buildContext(organization);
|
|
523
528
|
const renderedHtml = render(this.privateSettings.templateDefinition.xmlExport, context);
|
|
524
529
|
return renderedHtml;
|
|
525
|
-
}
|
|
530
|
+
}
|
|
531
|
+
catch (e) {
|
|
526
532
|
if (isSimpleError(e) || isSimpleErrors(e)) {
|
|
527
533
|
throw e;
|
|
528
534
|
}
|
|
529
|
-
console.error('Failed to render document html', e)
|
|
535
|
+
console.error('Failed to render document html', e);
|
|
530
536
|
return null;
|
|
531
537
|
}
|
|
532
538
|
}
|
|
533
539
|
|
|
534
540
|
areAnswersComplete(answers: Map<string, RecordAnswer>) {
|
|
535
541
|
for (const field of this.privateSettings.templateDefinition.documentFieldCategories.flatMap(c => c.getAllRecords())) {
|
|
536
|
-
const answer = answers.get(field.id)
|
|
542
|
+
const answer = answers.get(field.id);
|
|
537
543
|
if (!answer) {
|
|
538
544
|
return false;
|
|
539
545
|
}
|
|
540
546
|
// Update settings
|
|
541
|
-
answer.settings = field
|
|
547
|
+
answer.settings = field;
|
|
542
548
|
try {
|
|
543
|
-
answer.validate()
|
|
544
|
-
}
|
|
549
|
+
answer.validate();
|
|
550
|
+
}
|
|
551
|
+
catch (e) {
|
|
545
552
|
// Invalid
|
|
546
553
|
return false;
|
|
547
554
|
}
|
|
@@ -550,32 +557,34 @@ export class DocumentTemplate extends Model {
|
|
|
550
557
|
}
|
|
551
558
|
|
|
552
559
|
async updateDocumentFor(document: Document, registration: RegistrationWithMember) {
|
|
553
|
-
const {fieldAnswers} = await this.buildAnswers(registration)
|
|
554
|
-
const existingAnswers = document.data.fieldAnswers
|
|
560
|
+
const { fieldAnswers } = await this.buildAnswers(registration);
|
|
561
|
+
const existingAnswers = document.data.fieldAnswers;
|
|
555
562
|
|
|
556
|
-
const newAnswers = new Map(existingAnswers)
|
|
563
|
+
const newAnswers = new Map(existingAnswers);
|
|
557
564
|
|
|
558
565
|
for (const addAnswer of fieldAnswers.values()) {
|
|
559
|
-
const existing = newAnswers.get(addAnswer.settings.id) //newAnswers.findIndex(a => a.settings.id === addAnswer.settings.id)
|
|
566
|
+
const existing = newAnswers.get(addAnswer.settings.id); // newAnswers.findIndex(a => a.settings.id === addAnswer.settings.id)
|
|
560
567
|
if (existing) {
|
|
561
568
|
// We already have an answer for this field, we'll only update it if addAnswer is reviewed later
|
|
562
569
|
if (!existing.isReviewedAfter(addAnswer)) {
|
|
563
|
-
newAnswers.set(addAnswer.settings.id, addAnswer)
|
|
570
|
+
newAnswers.set(addAnswer.settings.id, addAnswer);
|
|
564
571
|
}
|
|
565
|
-
}
|
|
566
|
-
|
|
572
|
+
}
|
|
573
|
+
else {
|
|
574
|
+
newAnswers.set(addAnswer.settings.id, addAnswer);
|
|
567
575
|
}
|
|
568
576
|
}
|
|
569
577
|
|
|
570
|
-
document.data.fieldAnswers = newAnswers
|
|
571
|
-
const complete = this.areAnswersComplete(newAnswers)
|
|
578
|
+
document.data.fieldAnswers = newAnswers;
|
|
579
|
+
const complete = this.areAnswersComplete(newAnswers);
|
|
572
580
|
|
|
573
581
|
if (document.status !== DocumentStatus.Deleted) {
|
|
574
582
|
if (!complete) {
|
|
575
|
-
document.status = DocumentStatus.MissingData
|
|
576
|
-
}
|
|
583
|
+
document.status = DocumentStatus.MissingData;
|
|
584
|
+
}
|
|
585
|
+
else {
|
|
577
586
|
if (document.status === DocumentStatus.MissingData) {
|
|
578
|
-
document.status = this.status
|
|
587
|
+
document.status = this.status;
|
|
579
588
|
}
|
|
580
589
|
}
|
|
581
590
|
}
|