@stamhoofd/models 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/assets/Metropolis-Black.woff2 +0 -0
- package/dist/src/assets/Metropolis-BlackItalic.woff2 +0 -0
- package/dist/src/assets/Metropolis-Bold.woff2 +0 -0
- package/dist/src/assets/Metropolis-BoldItalic.woff2 +0 -0
- package/dist/src/assets/Metropolis-ExtraBold.woff2 +0 -0
- package/dist/src/assets/Metropolis-ExtraBoldItalic.woff2 +0 -0
- package/dist/src/assets/Metropolis-ExtraLight.woff2 +0 -0
- package/dist/src/assets/Metropolis-ExtraLightItalic.woff2 +0 -0
- package/dist/src/assets/Metropolis-Light.woff2 +0 -0
- package/dist/src/assets/Metropolis-LightItalic.woff2 +0 -0
- package/dist/src/assets/Metropolis-Medium.woff2 +0 -0
- package/dist/src/assets/Metropolis-MediumItalic.woff2 +0 -0
- package/dist/src/assets/Metropolis-Regular.woff2 +0 -0
- package/dist/src/assets/Metropolis-RegularItalic.woff2 +0 -0
- package/dist/src/assets/Metropolis-SemiBold.woff2 +0 -0
- package/dist/src/assets/Metropolis-SemiBoldItalic.woff2 +0 -0
- package/dist/src/assets/Metropolis-Thin.woff2 +0 -0
- package/dist/src/assets/Metropolis-ThinItalic.woff2 +0 -0
- package/dist/src/assets/assets/Metropolis-Black.woff2 +0 -0
- package/dist/src/assets/assets/Metropolis-BlackItalic.woff2 +0 -0
- package/dist/src/assets/assets/Metropolis-Bold.woff2 +0 -0
- package/dist/src/assets/assets/Metropolis-BoldItalic.woff2 +0 -0
- package/dist/src/assets/assets/Metropolis-ExtraBold.woff2 +0 -0
- package/dist/src/assets/assets/Metropolis-ExtraBoldItalic.woff2 +0 -0
- package/dist/src/assets/assets/Metropolis-ExtraLight.woff2 +0 -0
- package/dist/src/assets/assets/Metropolis-ExtraLightItalic.woff2 +0 -0
- package/dist/src/assets/assets/Metropolis-Light.woff2 +0 -0
- package/dist/src/assets/assets/Metropolis-LightItalic.woff2 +0 -0
- package/dist/src/assets/assets/Metropolis-Medium.woff2 +0 -0
- package/dist/src/assets/assets/Metropolis-MediumItalic.woff2 +0 -0
- package/dist/src/assets/assets/Metropolis-Regular.woff2 +0 -0
- package/dist/src/assets/assets/Metropolis-RegularItalic.woff2 +0 -0
- package/dist/src/assets/assets/Metropolis-SemiBold.woff2 +0 -0
- package/dist/src/assets/assets/Metropolis-SemiBoldItalic.woff2 +0 -0
- package/dist/src/assets/assets/Metropolis-Thin.woff2 +0 -0
- package/dist/src/assets/assets/Metropolis-ThinItalic.woff2 +0 -0
- package/dist/src/assets/assets/logo.png +0 -0
- package/dist/src/assets/logo.png +0 -0
- package/dist/src/factories/AddressFactory.d.ts +10 -0
- package/dist/src/factories/AddressFactory.d.ts.map +1 -0
- package/dist/src/factories/AddressFactory.js +42 -0
- package/dist/src/factories/AddressFactory.js.map +1 -0
- package/dist/src/factories/EmergencyContactFactory.d.ts +9 -0
- package/dist/src/factories/EmergencyContactFactory.d.ts.map +1 -0
- package/dist/src/factories/EmergencyContactFactory.js +42 -0
- package/dist/src/factories/EmergencyContactFactory.js.map +1 -0
- package/dist/src/factories/GroupFactory.d.ts +19 -0
- package/dist/src/factories/GroupFactory.d.ts.map +1 -0
- package/dist/src/factories/GroupFactory.js +52 -0
- package/dist/src/factories/GroupFactory.js.map +1 -0
- package/dist/src/factories/MemberFactory.d.ts +16 -0
- package/dist/src/factories/MemberFactory.d.ts.map +1 -0
- package/dist/src/factories/MemberFactory.js +98 -0
- package/dist/src/factories/MemberFactory.js.map +1 -0
- package/dist/src/factories/OrganizationFactory.d.ts +16 -0
- package/dist/src/factories/OrganizationFactory.d.ts.map +1 -0
- package/dist/src/factories/OrganizationFactory.js +40 -0
- package/dist/src/factories/OrganizationFactory.js.map +1 -0
- package/dist/src/factories/ParentFactory.d.ts +10 -0
- package/dist/src/factories/ParentFactory.d.ts.map +1 -0
- package/dist/src/factories/ParentFactory.js +44 -0
- package/dist/src/factories/ParentFactory.js.map +1 -0
- package/dist/src/factories/RecordFactory.d.ts +10 -0
- package/dist/src/factories/RecordFactory.d.ts.map +1 -0
- package/dist/src/factories/RecordFactory.js +14 -0
- package/dist/src/factories/RecordFactory.js.map +1 -0
- package/dist/src/factories/RegisterCodeFactory.d.ts +18 -0
- package/dist/src/factories/RegisterCodeFactory.d.ts.map +1 -0
- package/dist/src/factories/RegisterCodeFactory.js +19 -0
- package/dist/src/factories/RegisterCodeFactory.js.map +1 -0
- package/dist/src/factories/RegistrationFactory.d.ts +14 -0
- package/dist/src/factories/RegistrationFactory.d.ts.map +1 -0
- package/dist/src/factories/RegistrationFactory.js +26 -0
- package/dist/src/factories/RegistrationFactory.js.map +1 -0
- package/dist/src/factories/UserFactory.d.ts +21 -0
- package/dist/src/factories/UserFactory.d.ts.map +1 -0
- package/dist/src/factories/UserFactory.js +41 -0
- package/dist/src/factories/UserFactory.js.map +1 -0
- package/dist/src/factories/WebshopFactory.d.ts +16 -0
- package/dist/src/factories/WebshopFactory.d.ts.map +1 -0
- package/dist/src/factories/WebshopFactory.js +35 -0
- package/dist/src/factories/WebshopFactory.js.map +1 -0
- package/dist/src/helpers/DNSValidator.d.ts +6 -0
- package/dist/src/helpers/DNSValidator.d.ts.map +1 -0
- package/dist/src/helpers/DNSValidator.js +144 -0
- package/dist/src/helpers/DNSValidator.js.map +1 -0
- package/dist/src/helpers/EmailBuilder.d.ts +22 -0
- package/dist/src/helpers/EmailBuilder.d.ts.map +1 -0
- package/dist/src/helpers/EmailBuilder.js +100 -0
- package/dist/src/helpers/EmailBuilder.js.map +1 -0
- package/dist/src/helpers/GroupBuilder.d.ts +9 -0
- package/dist/src/helpers/GroupBuilder.d.ts.map +1 -0
- package/dist/src/helpers/GroupBuilder.js +382 -0
- package/dist/src/helpers/GroupBuilder.js.map +1 -0
- package/dist/src/helpers/Handlebars.d.ts +2 -0
- package/dist/src/helpers/Handlebars.d.ts.map +1 -0
- package/dist/src/helpers/Handlebars.js +192 -0
- package/dist/src/helpers/Handlebars.js.map +1 -0
- package/dist/src/helpers/InvoiceBuilder.d.ts +29 -0
- package/dist/src/helpers/InvoiceBuilder.d.ts.map +1 -0
- package/dist/src/helpers/InvoiceBuilder.js +406 -0
- package/dist/src/helpers/InvoiceBuilder.js.map +1 -0
- package/dist/src/helpers/InvoiceBuilder.test.d.ts +2 -0
- package/dist/src/helpers/InvoiceBuilder.test.d.ts.map +1 -0
- package/dist/src/helpers/InvoiceBuilder.test.js +52 -0
- package/dist/src/helpers/InvoiceBuilder.test.js.map +1 -0
- package/dist/src/helpers/RateLimiter.d.ts +27 -0
- package/dist/src/helpers/RateLimiter.d.ts.map +1 -0
- package/dist/src/helpers/RateLimiter.js +57 -0
- package/dist/src/helpers/RateLimiter.js.map +1 -0
- package/dist/src/helpers/WebshopCounter.d.ts +6 -0
- package/dist/src/helpers/WebshopCounter.d.ts.map +1 -0
- package/dist/src/helpers/WebshopCounter.js +36 -0
- package/dist/src/helpers/WebshopCounter.js.map +1 -0
- package/dist/src/helpers/WebshopCounter.test.d.ts +2 -0
- package/dist/src/helpers/WebshopCounter.test.d.ts.map +1 -0
- package/dist/src/helpers/WebshopCounter.test.js +17 -0
- package/dist/src/helpers/WebshopCounter.test.js.map +1 -0
- package/dist/src/index.d.ts +18 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +23 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/migrations/1593773929-create-initial-tables.sql +634 -0
- package/dist/src/migrations/1605261999-gemeenten-tmp.sql +2820 -0
- package/dist/src/migrations/1605262045-import-postcodes.d.ts +16 -0
- package/dist/src/migrations/1605262045-import-postcodes.d.ts.map +1 -0
- package/dist/src/migrations/1605262045-import-postcodes.js +116 -0
- package/dist/src/migrations/1605262045-import-postcodes.js.map +1 -0
- package/dist/src/migrations/1605262046-import-postcodes-nl.d.ts +4 -0
- package/dist/src/migrations/1605262046-import-postcodes-nl.d.ts.map +1 -0
- package/dist/src/migrations/1605262046-import-postcodes-nl.js +83 -0
- package/dist/src/migrations/1605262046-import-postcodes-nl.js.map +1 -0
- package/dist/src/migrations/1605279038-drop-gemeenten-tmp.sql +1 -0
- package/dist/src/migrations/1648392491-default-templates.sql +9 -0
- package/dist/src/migrations/1651245707-default-templates-reminders.sql +6 -0
- package/dist/src/migrations/1708607340-tickets-deleted-at.sql +1 -0
- package/dist/src/migrations/1710459176-register-code-invoices.sql +3 -0
- package/dist/src/migrations/1712158247-discount-codes.sql +17 -0
- package/dist/src/migrations/1713178665-drop-invites.sql +1 -0
- package/dist/src/migrations/1713178666-drop-keychain.sql +1 -0
- package/dist/src/migrations/1713178667-drop-challenges.sql +1 -0
- package/dist/src/migrations/1713178668-drop-user-keys.sql +7 -0
- package/dist/src/migrations/1713178669-drop-organization-key.sql +2 -0
- package/dist/src/migrations/data/postcodes/nl/Drenthe +291 -0
- package/dist/src/migrations/data/postcodes/nl/Flevoland +107 -0
- package/dist/src/migrations/data/postcodes/nl/Friesland +518 -0
- package/dist/src/migrations/data/postcodes/nl/Gelderland +601 -0
- package/dist/src/migrations/data/postcodes/nl/Groningen +279 -0
- package/dist/src/migrations/data/postcodes/nl/Limburg +324 -0
- package/dist/src/migrations/data/postcodes/nl/Noord-Brabant +620 -0
- package/dist/src/migrations/data/postcodes/nl/Noord-Holland +566 -0
- package/dist/src/migrations/data/postcodes/nl/Overrijsel +344 -0
- package/dist/src/migrations/data/postcodes/nl/Utrecht +278 -0
- package/dist/src/migrations/data/postcodes/nl/Zeeland +179 -0
- package/dist/src/migrations/data/postcodes/nl/Zuid-Holland +662 -0
- package/dist/src/models/BalanceItem.d.ts +57 -0
- package/dist/src/models/BalanceItem.d.ts.map +1 -0
- package/dist/src/models/BalanceItem.js +346 -0
- package/dist/src/models/BalanceItem.js.map +1 -0
- package/dist/src/models/BalanceItemPayment.d.ts +31 -0
- package/dist/src/models/BalanceItemPayment.d.ts.map +1 -0
- package/dist/src/models/BalanceItemPayment.js +101 -0
- package/dist/src/models/BalanceItemPayment.js.map +1 -0
- package/dist/src/models/BuckarooPayment.d.ts +8 -0
- package/dist/src/models/BuckarooPayment.d.ts.map +1 -0
- package/dist/src/models/BuckarooPayment.js +24 -0
- package/dist/src/models/BuckarooPayment.js.map +1 -0
- package/dist/src/models/Document.d.ts +44 -0
- package/dist/src/models/Document.d.ts.map +1 -0
- package/dist/src/models/Document.js +194 -0
- package/dist/src/models/Document.js.map +1 -0
- package/dist/src/models/DocumentTemplate.d.ts +45 -0
- package/dist/src/models/DocumentTemplate.d.ts.map +1 -0
- package/dist/src/models/DocumentTemplate.js +533 -0
- package/dist/src/models/DocumentTemplate.js.map +1 -0
- package/dist/src/models/EmailTemplate.d.ts +22 -0
- package/dist/src/models/EmailTemplate.d.ts.map +1 -0
- package/dist/src/models/EmailTemplate.js +70 -0
- package/dist/src/models/EmailTemplate.js.map +1 -0
- package/dist/src/models/EmailVerificationCode.d.ts +60 -0
- package/dist/src/models/EmailVerificationCode.d.ts.map +1 -0
- package/dist/src/models/EmailVerificationCode.js +307 -0
- package/dist/src/models/EmailVerificationCode.js.map +1 -0
- package/dist/src/models/Group.d.ts +36 -0
- package/dist/src/models/Group.d.ts.map +1 -0
- package/dist/src/models/Group.js +231 -0
- package/dist/src/models/Group.js.map +1 -0
- package/dist/src/models/Image.d.ts +12 -0
- package/dist/src/models/Image.d.ts.map +1 -0
- package/dist/src/models/Image.js +137 -0
- package/dist/src/models/Image.js.map +1 -0
- package/dist/src/models/Member.d.ts +66 -0
- package/dist/src/models/Member.d.ts.map +1 -0
- package/dist/src/models/Member.js +309 -0
- package/dist/src/models/Member.js.map +1 -0
- package/dist/src/models/MemberResponsibilityRecord.d.ts +11 -0
- package/dist/src/models/MemberResponsibilityRecord.d.ts.map +1 -0
- package/dist/src/models/MemberResponsibilityRecord.js +47 -0
- package/dist/src/models/MemberResponsibilityRecord.js.map +1 -0
- package/dist/src/models/MolliePayment.d.ts +8 -0
- package/dist/src/models/MolliePayment.d.ts.map +1 -0
- package/dist/src/models/MolliePayment.js +24 -0
- package/dist/src/models/MolliePayment.js.map +1 -0
- package/dist/src/models/MollieToken.d.ts +45 -0
- package/dist/src/models/MollieToken.d.ts.map +1 -0
- package/dist/src/models/MollieToken.js +333 -0
- package/dist/src/models/MollieToken.js.map +1 -0
- package/dist/src/models/OneTimeToken.d.ts +38 -0
- package/dist/src/models/OneTimeToken.d.ts.map +1 -0
- package/dist/src/models/OneTimeToken.js +126 -0
- package/dist/src/models/OneTimeToken.js.map +1 -0
- package/dist/src/models/Order.d.ts +99 -0
- package/dist/src/models/Order.d.ts.map +1 -0
- package/dist/src/models/Order.js +912 -0
- package/dist/src/models/Order.js.map +1 -0
- package/dist/src/models/Organization.d.ts +119 -0
- package/dist/src/models/Organization.d.ts.map +1 -0
- package/dist/src/models/Organization.js +900 -0
- package/dist/src/models/Organization.js.map +1 -0
- package/dist/src/models/OrganizationRegistrationPeriod.d.ts +14 -0
- package/dist/src/models/OrganizationRegistrationPeriod.d.ts.map +1 -0
- package/dist/src/models/OrganizationRegistrationPeriod.js +62 -0
- package/dist/src/models/OrganizationRegistrationPeriod.js.map +1 -0
- package/dist/src/models/PasswordToken.d.ts +29 -0
- package/dist/src/models/PasswordToken.d.ts.map +1 -0
- package/dist/src/models/PasswordToken.js +118 -0
- package/dist/src/models/PasswordToken.js.map +1 -0
- package/dist/src/models/PayconiqPayment.d.ts +18 -0
- package/dist/src/models/PayconiqPayment.d.ts.map +1 -0
- package/dist/src/models/PayconiqPayment.js +216 -0
- package/dist/src/models/PayconiqPayment.js.map +1 -0
- package/dist/src/models/Payment.d.ts +62 -0
- package/dist/src/models/Payment.d.ts.map +1 -0
- package/dist/src/models/Payment.js +199 -0
- package/dist/src/models/Payment.js.map +1 -0
- package/dist/src/models/Platform.d.ts +15 -0
- package/dist/src/models/Platform.d.ts.map +1 -0
- package/dist/src/models/Platform.js +77 -0
- package/dist/src/models/Platform.js.map +1 -0
- package/dist/src/models/RegisterCode.d.ts +27 -0
- package/dist/src/models/RegisterCode.d.ts.map +1 -0
- package/dist/src/models/RegisterCode.js +162 -0
- package/dist/src/models/RegisterCode.js.map +1 -0
- package/dist/src/models/Registration.d.ts +47 -0
- package/dist/src/models/Registration.d.ts.map +1 -0
- package/dist/src/models/Registration.js +369 -0
- package/dist/src/models/Registration.js.map +1 -0
- package/dist/src/models/RegistrationPeriod.d.ts +15 -0
- package/dist/src/models/RegistrationPeriod.d.ts.map +1 -0
- package/dist/src/models/RegistrationPeriod.js +64 -0
- package/dist/src/models/RegistrationPeriod.js.map +1 -0
- package/dist/src/models/STCredit.d.ts +20 -0
- package/dist/src/models/STCredit.d.ts.map +1 -0
- package/dist/src/models/STCredit.js +129 -0
- package/dist/src/models/STCredit.js.map +1 -0
- package/dist/src/models/STInvoice.d.ts +51 -0
- package/dist/src/models/STInvoice.d.ts.map +1 -0
- package/dist/src/models/STInvoice.js +453 -0
- package/dist/src/models/STInvoice.js.map +1 -0
- package/dist/src/models/STPackage.d.ts +36 -0
- package/dist/src/models/STPackage.d.ts.map +1 -0
- package/dist/src/models/STPackage.js +300 -0
- package/dist/src/models/STPackage.js.map +1 -0
- package/dist/src/models/STPendingInvoice.d.ts +45 -0
- package/dist/src/models/STPendingInvoice.d.ts.map +1 -0
- package/dist/src/models/STPendingInvoice.js +284 -0
- package/dist/src/models/STPendingInvoice.js.map +1 -0
- package/dist/src/models/StripeAccount.d.ts +17 -0
- package/dist/src/models/StripeAccount.d.ts.map +1 -0
- package/dist/src/models/StripeAccount.js +81 -0
- package/dist/src/models/StripeAccount.js.map +1 -0
- package/dist/src/models/StripeCheckoutSession.d.ts +9 -0
- package/dist/src/models/StripeCheckoutSession.d.ts.map +1 -0
- package/dist/src/models/StripeCheckoutSession.js +31 -0
- package/dist/src/models/StripeCheckoutSession.js.map +1 -0
- package/dist/src/models/StripePaymentIntent.d.ts +9 -0
- package/dist/src/models/StripePaymentIntent.d.ts.map +1 -0
- package/dist/src/models/StripePaymentIntent.js +31 -0
- package/dist/src/models/StripePaymentIntent.js.map +1 -0
- package/dist/src/models/Ticket.d.ts +61 -0
- package/dist/src/models/Ticket.d.ts.map +1 -0
- package/dist/src/models/Ticket.js +143 -0
- package/dist/src/models/Ticket.js.map +1 -0
- package/dist/src/models/Token.d.ts +49 -0
- package/dist/src/models/Token.d.ts.map +1 -0
- package/dist/src/models/Token.js +218 -0
- package/dist/src/models/Token.js.map +1 -0
- package/dist/src/models/Token.test.d.ts +2 -0
- package/dist/src/models/Token.test.d.ts.map +1 -0
- package/dist/src/models/Token.test.js +60 -0
- package/dist/src/models/Token.test.js.map +1 -0
- package/dist/src/models/UsedRegisterCode.d.ts +22 -0
- package/dist/src/models/UsedRegisterCode.d.ts.map +1 -0
- package/dist/src/models/UsedRegisterCode.js +158 -0
- package/dist/src/models/UsedRegisterCode.js.map +1 -0
- package/dist/src/models/User.d.ts +55 -0
- package/dist/src/models/User.d.ts.map +1 -0
- package/dist/src/models/User.js +314 -0
- package/dist/src/models/User.js.map +1 -0
- package/dist/src/models/UserPermissions.d.ts +15 -0
- package/dist/src/models/UserPermissions.d.ts.map +1 -0
- package/dist/src/models/UserPermissions.js +57 -0
- package/dist/src/models/UserPermissions.js.map +1 -0
- package/dist/src/models/Webshop.d.ts +44 -0
- package/dist/src/models/Webshop.d.ts.map +1 -0
- package/dist/src/models/Webshop.js +184 -0
- package/dist/src/models/Webshop.js.map +1 -0
- package/dist/src/models/WebshopDiscountCode.d.ts +18 -0
- package/dist/src/models/WebshopDiscountCode.d.ts.map +1 -0
- package/dist/src/models/WebshopDiscountCode.js +88 -0
- package/dist/src/models/WebshopDiscountCode.js.map +1 -0
- package/dist/src/models/addresses/City.d.ts +14 -0
- package/dist/src/models/addresses/City.d.ts.map +1 -0
- package/dist/src/models/addresses/City.js +37 -0
- package/dist/src/models/addresses/City.js.map +1 -0
- package/dist/src/models/addresses/PostalCode.d.ts +20 -0
- package/dist/src/models/addresses/PostalCode.d.ts.map +1 -0
- package/dist/src/models/addresses/PostalCode.js +138 -0
- package/dist/src/models/addresses/PostalCode.js.map +1 -0
- package/dist/src/models/addresses/PostalCode.test.d.ts +2 -0
- package/dist/src/models/addresses/PostalCode.test.d.ts.map +1 -0
- package/dist/src/models/addresses/PostalCode.test.js +98 -0
- package/dist/src/models/addresses/PostalCode.test.js.map +1 -0
- package/dist/src/models/addresses/Province.d.ts +9 -0
- package/dist/src/models/addresses/Province.d.ts.map +1 -0
- package/dist/src/models/addresses/Province.js +24 -0
- package/dist/src/models/addresses/Province.js.map +1 -0
- package/dist/src/models/addresses/Street.d.ts +10 -0
- package/dist/src/models/addresses/Street.d.ts.map +1 -0
- package/dist/src/models/addresses/Street.js +26 -0
- package/dist/src/models/addresses/Street.js.map +1 -0
- package/dist/src/models/index.d.ts +37 -0
- package/dist/src/models/index.d.ts.map +1 -0
- package/dist/src/models/index.js +53 -0
- package/dist/src/models/index.js.map +1 -0
- package/dist/src/structures/OrganizationServerMetaData.d.ts +43 -0
- package/dist/src/structures/OrganizationServerMetaData.d.ts.map +1 -0
- package/dist/src/structures/OrganizationServerMetaData.js +128 -0
- package/dist/src/structures/OrganizationServerMetaData.js.map +1 -0
- package/dist/tests/jest.global.setup.d.ts +3 -0
- package/dist/tests/jest.global.setup.d.ts.map +1 -0
- package/dist/tests/jest.global.setup.js +20 -0
- package/dist/tests/jest.global.setup.js.map +1 -0
- package/dist/tests/jest.setup.d.ts +2 -0
- package/dist/tests/jest.setup.d.ts.map +1 -0
- package/dist/tests/jest.setup.js +15 -0
- package/dist/tests/jest.setup.js.map +1 -0
- package/package.json +30 -0
- package/src/assets/Metropolis-Black.woff2 +0 -0
- package/src/assets/Metropolis-BlackItalic.woff2 +0 -0
- package/src/assets/Metropolis-Bold.woff2 +0 -0
- package/src/assets/Metropolis-BoldItalic.woff2 +0 -0
- package/src/assets/Metropolis-ExtraBold.woff2 +0 -0
- package/src/assets/Metropolis-ExtraBoldItalic.woff2 +0 -0
- package/src/assets/Metropolis-ExtraLight.woff2 +0 -0
- package/src/assets/Metropolis-ExtraLightItalic.woff2 +0 -0
- package/src/assets/Metropolis-Light.woff2 +0 -0
- package/src/assets/Metropolis-LightItalic.woff2 +0 -0
- package/src/assets/Metropolis-Medium.woff2 +0 -0
- package/src/assets/Metropolis-MediumItalic.woff2 +0 -0
- package/src/assets/Metropolis-Regular.woff2 +0 -0
- package/src/assets/Metropolis-RegularItalic.woff2 +0 -0
- package/src/assets/Metropolis-SemiBold.woff2 +0 -0
- package/src/assets/Metropolis-SemiBoldItalic.woff2 +0 -0
- package/src/assets/Metropolis-Thin.woff2 +0 -0
- package/src/assets/Metropolis-ThinItalic.woff2 +0 -0
- package/src/assets/logo.png +0 -0
- package/src/factories/AddressFactory.ts +42 -0
- package/src/factories/EmergencyContactFactory.ts +43 -0
- package/src/factories/GroupFactory.ts +66 -0
- package/src/factories/MemberFactory.ts +122 -0
- package/src/factories/OrganizationFactory.ts +45 -0
- package/src/factories/ParentFactory.ts +49 -0
- package/src/factories/RecordFactory.ts +12 -0
- package/src/factories/RegisterCodeFactory.ts +25 -0
- package/src/factories/RegistrationFactory.ts +32 -0
- package/src/factories/UserFactory.ts +66 -0
- package/src/factories/WebshopFactory.ts +43 -0
- package/src/helpers/DNSValidator.ts +153 -0
- package/src/helpers/EmailBuilder.ts +127 -0
- package/src/helpers/GroupBuilder.ts +438 -0
- package/src/helpers/Handlebars.ts +203 -0
- package/src/helpers/InvoiceBuilder.test.ts +57 -0
- package/src/helpers/InvoiceBuilder.ts +501 -0
- package/src/helpers/RateLimiter.ts +75 -0
- package/src/helpers/WebshopCounter.test.ts +16 -0
- package/src/helpers/WebshopCounter.ts +36 -0
- package/src/index.ts +21 -0
- package/src/migrations/1593773929-create-initial-tables.sql +634 -0
- package/src/migrations/1605261999-gemeenten-tmp.sql +2820 -0
- package/src/migrations/1605262045-import-postcodes.ts +132 -0
- package/src/migrations/1605262046-import-postcodes-nl.ts +97 -0
- package/src/migrations/1605279038-drop-gemeenten-tmp.sql +1 -0
- package/src/migrations/1648392491-default-templates.sql +9 -0
- package/src/migrations/1651245707-default-templates-reminders.sql +6 -0
- package/src/migrations/1708607340-tickets-deleted-at.sql +1 -0
- package/src/migrations/1710459176-register-code-invoices.sql +3 -0
- package/src/migrations/1712158247-discount-codes.sql +17 -0
- package/src/migrations/1713178665-drop-invites.sql +1 -0
- package/src/migrations/1713178666-drop-keychain.sql +1 -0
- package/src/migrations/1713178667-drop-challenges.sql +1 -0
- package/src/migrations/1713178668-drop-user-keys.sql +7 -0
- package/src/migrations/1713178669-drop-organization-key.sql +2 -0
- package/src/migrations/1714985451-user-nullable-organization-id.sql +2 -0
- package/src/migrations/1714985452-email-verification-code-nullable-organization-id.sql +2 -0
- package/src/migrations/1714985453-user-organization-permissions.sql +2 -0
- package/src/migrations/1714985454-user-organization-permissions.sql +2 -0
- package/src/migrations/1715079362-platform.sql +6 -0
- package/src/migrations/1715181649-registrations-organization-id.sql +2 -0
- package/src/migrations/1715181650-registrations-organization-id-fill.sql +1 -0
- package/src/migrations/1715181651-registrations-organization-id-drop-null.sql +2 -0
- package/src/migrations/1716117067-members-nullable-organization-id.sql +2 -0
- package/src/migrations/1719567581-registration-periods.sql +13 -0
- package/src/migrations/1719567582-organization-registration-periods.sql +13 -0
- package/src/migrations/1719567881-organization-periodId.sql +2 -0
- package/src/migrations/1719567882-groups-periodId.sql +2 -0
- package/src/migrations/1719567883-platform-periodId.sql +2 -0
- package/src/migrations/1719568079-default-period.sql +2 -0
- package/src/migrations/1719568080-set-default-period-platform.sql +1 -0
- package/src/migrations/1719568081-set-default-period-organizations.sql +1 -0
- package/src/migrations/1719568082-set-default-period-groups.sql +1 -0
- package/src/migrations/1719580828-registrations-periodId.sql +2 -0
- package/src/migrations/1719580829-set-default-period-registrations.sql +1 -0
- package/src/migrations/data/postcodes/nl/Drenthe +291 -0
- package/src/migrations/data/postcodes/nl/Flevoland +107 -0
- package/src/migrations/data/postcodes/nl/Friesland +518 -0
- package/src/migrations/data/postcodes/nl/Gelderland +601 -0
- package/src/migrations/data/postcodes/nl/Groningen +279 -0
- package/src/migrations/data/postcodes/nl/Limburg +324 -0
- package/src/migrations/data/postcodes/nl/Noord-Brabant +620 -0
- package/src/migrations/data/postcodes/nl/Noord-Holland +566 -0
- package/src/migrations/data/postcodes/nl/Overrijsel +344 -0
- package/src/migrations/data/postcodes/nl/Utrecht +278 -0
- package/src/migrations/data/postcodes/nl/Zeeland +179 -0
- package/src/migrations/data/postcodes/nl/Zuid-Holland +662 -0
- package/src/models/BalanceItem.ts +392 -0
- package/src/models/BalanceItemPayment.ts +106 -0
- package/src/models/BuckarooPayment.ts +19 -0
- package/src/models/Document.ts +203 -0
- package/src/models/DocumentTemplate.ts +583 -0
- package/src/models/EmailTemplate.ts +64 -0
- package/src/models/EmailVerificationCode.ts +352 -0
- package/src/models/Group.ts +293 -0
- package/src/models/Image.ts +147 -0
- package/src/models/Member.ts +386 -0
- package/src/models/MemberResponsibilityRecord.ts +39 -0
- package/src/models/MolliePayment.ts +19 -0
- package/src/models/MollieToken.ts +369 -0
- package/src/models/OneTimeToken.ts +131 -0
- package/src/models/Order.ts +1030 -0
- package/src/models/Organization.ts +1085 -0
- package/src/models/OrganizationRegistrationPeriod.ts +54 -0
- package/src/models/PasswordToken.ts +139 -0
- package/src/models/PayconiqPayment.ts +241 -0
- package/src/models/Payment.ts +216 -0
- package/src/models/Platform.ts +76 -0
- package/src/models/RegisterCode.ts +164 -0
- package/src/models/Registration.ts +405 -0
- package/src/models/RegistrationPeriod.ts +55 -0
- package/src/models/STCredit.ts +134 -0
- package/src/models/STInvoice.ts +507 -0
- package/src/models/STPackage.ts +324 -0
- package/src/models/STPendingInvoice.ts +308 -0
- package/src/models/StripeAccount.ts +71 -0
- package/src/models/StripeCheckoutSession.ts +22 -0
- package/src/models/StripePaymentIntent.ts +22 -0
- package/src/models/Ticket.ts +145 -0
- package/src/models/Token.test.ts +69 -0
- package/src/models/Token.ts +269 -0
- package/src/models/UsedRegisterCode.ts +166 -0
- package/src/models/User.ts +445 -0
- package/src/models/UserPermissions.ts +54 -0
- package/src/models/Webshop.ts +206 -0
- package/src/models/WebshopDiscountCode.ts +81 -0
- package/src/models/addresses/City.ts +31 -0
- package/src/models/addresses/PostalCode.test.ts +117 -0
- package/src/models/addresses/PostalCode.ts +164 -0
- package/src/models/addresses/Province.ts +20 -0
- package/src/models/addresses/Street.ts +25 -0
- package/src/models/index.ts +49 -0
- package/src/structures/OrganizationServerMetaData.ts +117 -0
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
import { column, Database, Model } from '@simonbackx/simple-database';
|
|
2
|
+
import { BalanceItemStatus, MemberBalanceItem, MemberBalanceItemPayment, OrderStatus, Payment as PaymentStruct, PaymentMethod, PaymentStatus } from '@stamhoofd/structures';
|
|
3
|
+
import { Formatter } from '@stamhoofd/utility';
|
|
4
|
+
import { v4 as uuidv4 } from "uuid";
|
|
5
|
+
|
|
6
|
+
import { Organization, Payment, Webshop } from './';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Keeps track of how much a member/user owes or needs to be reimbursed.
|
|
10
|
+
*/
|
|
11
|
+
export class BalanceItem extends Model {
|
|
12
|
+
static table = "balance_items"
|
|
13
|
+
|
|
14
|
+
@column({
|
|
15
|
+
primary: true, type: "string", beforeSave(value) {
|
|
16
|
+
return value ?? uuidv4();
|
|
17
|
+
}
|
|
18
|
+
})
|
|
19
|
+
id!: string;
|
|
20
|
+
|
|
21
|
+
@column({ type: "string" })
|
|
22
|
+
organizationId: string
|
|
23
|
+
|
|
24
|
+
@column({ type: "string", nullable: true })
|
|
25
|
+
memberId: string | null = null;
|
|
26
|
+
|
|
27
|
+
@column({ type: "string", nullable: true })
|
|
28
|
+
userId: string | null = null;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* The registration ID that is linked to this balance item
|
|
32
|
+
*/
|
|
33
|
+
@column({ type: "string", nullable: true })
|
|
34
|
+
registrationId: string | null = null;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* The order ID that is linked to this balance item
|
|
38
|
+
*/
|
|
39
|
+
@column({ type: "string", nullable: true })
|
|
40
|
+
orderId: string | null = null;
|
|
41
|
+
|
|
42
|
+
@column({ type: "string" })
|
|
43
|
+
description = "";
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Total prices
|
|
47
|
+
*/
|
|
48
|
+
@column({ type: "integer" })
|
|
49
|
+
price: number;
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Cached value, for optimizations
|
|
53
|
+
*/
|
|
54
|
+
@column({ type: "integer" })
|
|
55
|
+
pricePaid = 0
|
|
56
|
+
|
|
57
|
+
@column({ type: "string" })
|
|
58
|
+
status = BalanceItemStatus.Pending
|
|
59
|
+
|
|
60
|
+
@column({
|
|
61
|
+
type: "datetime", beforeSave(old?: any) {
|
|
62
|
+
if (old !== undefined) {
|
|
63
|
+
return old;
|
|
64
|
+
}
|
|
65
|
+
const date = new Date()
|
|
66
|
+
date.setMilliseconds(0)
|
|
67
|
+
return date
|
|
68
|
+
}
|
|
69
|
+
})
|
|
70
|
+
createdAt: Date
|
|
71
|
+
|
|
72
|
+
@column({
|
|
73
|
+
type: "datetime", beforeSave() {
|
|
74
|
+
const date = new Date()
|
|
75
|
+
date.setMilliseconds(0)
|
|
76
|
+
return date
|
|
77
|
+
},
|
|
78
|
+
skipUpdate: true
|
|
79
|
+
})
|
|
80
|
+
updatedAt: Date
|
|
81
|
+
|
|
82
|
+
async markUpdated(payment: Payment, organization: Organization) {
|
|
83
|
+
// For orders: mark order as changed (so they are refetched in front ends)
|
|
84
|
+
if (this.orderId) {
|
|
85
|
+
const {Order} = await import("./Order");
|
|
86
|
+
const order = await Order.getByID(this.orderId);
|
|
87
|
+
if (order) {
|
|
88
|
+
await order.paymentChanged(payment, organization)
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
async markPaid(payment: Payment, organization: Organization) {
|
|
94
|
+
// status and pricePaid changes are handled inside balanceitempayment
|
|
95
|
+
|
|
96
|
+
// If registration
|
|
97
|
+
if (this.registrationId) {
|
|
98
|
+
const {Registration} = await import("./Registration");
|
|
99
|
+
const registration = await Registration.getByID(this.registrationId);
|
|
100
|
+
|
|
101
|
+
if (registration) {
|
|
102
|
+
// 1. Mark registration as being valid
|
|
103
|
+
if (registration.registeredAt === null) {
|
|
104
|
+
await registration.markValid()
|
|
105
|
+
|
|
106
|
+
const {Group} = await import("./Group");
|
|
107
|
+
|
|
108
|
+
// Update group occupancy
|
|
109
|
+
// TODO: maybe we should schedule this, to prevent doing many updates at once
|
|
110
|
+
const group = await Group.getByID(registration.groupId)
|
|
111
|
+
if (group) {
|
|
112
|
+
await group.updateOccupancy()
|
|
113
|
+
await group.save()
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// 2. Update registration cached prices
|
|
118
|
+
// TODO
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// If order
|
|
123
|
+
if (this.orderId) {
|
|
124
|
+
const {Order} = await import("./Order");
|
|
125
|
+
const order = await Order.getByID(this.orderId);
|
|
126
|
+
if (order) {
|
|
127
|
+
await order.markPaid(payment, organization)
|
|
128
|
+
|
|
129
|
+
// Save number in balacance description
|
|
130
|
+
if (order.number !== null) {
|
|
131
|
+
const webshop = await Webshop.getByID(order.webshopId)
|
|
132
|
+
|
|
133
|
+
if (webshop) {
|
|
134
|
+
this.description = order.generateBalanceDescription(webshop)
|
|
135
|
+
await this.save()
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
async undoPaid(payment: Payment, organization: Organization) {
|
|
143
|
+
// If order
|
|
144
|
+
if (this.orderId) {
|
|
145
|
+
const {Order} = await import("./Order");
|
|
146
|
+
const order = await Order.getByID(this.orderId);
|
|
147
|
+
if (order) {
|
|
148
|
+
await order.undoPaid(payment, organization)
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
async markFailed(payment: Payment, organization: Organization) {
|
|
154
|
+
// If order
|
|
155
|
+
if (this.orderId) {
|
|
156
|
+
const {Order} = await import("./Order");
|
|
157
|
+
const order = await Order.getByID(this.orderId);
|
|
158
|
+
if (order) {
|
|
159
|
+
await order.onPaymentFailed(payment, organization)
|
|
160
|
+
|
|
161
|
+
if (order.status === OrderStatus.Deleted) {
|
|
162
|
+
this.status = BalanceItemStatus.Hidden
|
|
163
|
+
await this.save()
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
async undoFailed(payment: Payment, organization: Organization) {
|
|
170
|
+
// If order
|
|
171
|
+
if (this.orderId) {
|
|
172
|
+
const {Order} = await import("./Order");
|
|
173
|
+
const order = await Order.getByID(this.orderId);
|
|
174
|
+
if (order) {
|
|
175
|
+
await order.undoPaymentFailed(payment, organization)
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
updateStatus() {
|
|
181
|
+
this.status = this.pricePaid >= this.price ? BalanceItemStatus.Paid : BalanceItemStatus.Pending;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
static async deleteItems(items: BalanceItem[]) {
|
|
185
|
+
const {payments} = await BalanceItem.loadPayments(items)
|
|
186
|
+
|
|
187
|
+
// Load all balance items
|
|
188
|
+
const {balanceItems, balanceItemPayments: allBalanceItemPayments} = await Payment.loadBalanceItems(payments)
|
|
189
|
+
for (const payment of payments) {
|
|
190
|
+
if (payment.status === PaymentStatus.Succeeded) {
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
if (!(payment.method === PaymentMethod.PointOfSale || payment.method === PaymentMethod.Transfer || payment.method === PaymentMethod.Unknown)) {
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
const bip = allBalanceItemPayments.filter(p => p.paymentId == payment.id)
|
|
197
|
+
const bis = balanceItems.filter(b => b.status !== BalanceItemStatus.Hidden && bip.find(p => p.balanceItemId == b.id))
|
|
198
|
+
|
|
199
|
+
const remainingAfterDelete = bis.filter(b => !items.find(i => i.id == b.id))
|
|
200
|
+
if (remainingAfterDelete.length == 0) {
|
|
201
|
+
// Delete payment
|
|
202
|
+
payment.status = PaymentStatus.Failed
|
|
203
|
+
payment._forceUpdatedAt = new Date(1900, 0, 1)
|
|
204
|
+
await payment.save()
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// Set other items to zero (the balance item payments keep the real price)
|
|
209
|
+
for (const item of items) {
|
|
210
|
+
// Don't change status of items that are already paid or are partially paid
|
|
211
|
+
// Not using item.paidPrice, since this is cached
|
|
212
|
+
const bip = allBalanceItemPayments.filter(p => p.balanceItemId == item.id)
|
|
213
|
+
const relatedPayments = payments.filter(p => bip.find(b => b.paymentId == p.id))
|
|
214
|
+
|
|
215
|
+
if (relatedPayments.length === 0 || !relatedPayments.find(p => p.status === PaymentStatus.Succeeded)) {
|
|
216
|
+
// No paid payments associated with this item
|
|
217
|
+
item.status = BalanceItemStatus.Hidden
|
|
218
|
+
await item.save()
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
static async reactivateItems(items: BalanceItem[]) {
|
|
224
|
+
// Set other items to zero (the balance item payments keep the real price)
|
|
225
|
+
for (const item of items) {
|
|
226
|
+
if (item.status === BalanceItemStatus.Hidden) {
|
|
227
|
+
item.status = BalanceItemStatus.Pending
|
|
228
|
+
await item.save()
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
const {payments} = await BalanceItem.loadPayments(items)
|
|
233
|
+
|
|
234
|
+
// Load all balance items
|
|
235
|
+
const {balanceItems, balanceItemPayments: allBalanceItemPayments} = await Payment.loadBalanceItems(payments)
|
|
236
|
+
for (const payment of payments) {
|
|
237
|
+
if (payment.status !== PaymentStatus.Failed) {
|
|
238
|
+
continue;
|
|
239
|
+
}
|
|
240
|
+
if (!(payment.method === PaymentMethod.PointOfSale || payment.method === PaymentMethod.Transfer || payment.method === PaymentMethod.Unknown)) {
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
const bip = allBalanceItemPayments.filter(p => p.paymentId == payment.id)
|
|
244
|
+
const bis = balanceItems.filter(b => b.status !== BalanceItemStatus.Hidden && bip.find(p => p.balanceItemId == b.id))
|
|
245
|
+
|
|
246
|
+
if (bis.length > 0) {
|
|
247
|
+
// Undo failed
|
|
248
|
+
payment.status = PaymentStatus.Created
|
|
249
|
+
await payment.save()
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
static async undoForDeletedOrders(orderIds: string[]) {
|
|
255
|
+
if (orderIds.length === 0) {
|
|
256
|
+
return
|
|
257
|
+
}
|
|
258
|
+
const items = await BalanceItem.where({ orderId: { sign: 'IN', value: orderIds } })
|
|
259
|
+
await this.reactivateItems(items)
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
static async deleteForDeletedOrders(orderIds: string[]) {
|
|
263
|
+
if (orderIds.length === 0) {
|
|
264
|
+
return
|
|
265
|
+
}
|
|
266
|
+
const items = await BalanceItem.where({ orderId: { sign: 'IN', value: orderIds } })
|
|
267
|
+
await this.deleteItems(items)
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
static async deleteForDeletedMember(memberId: string) {
|
|
271
|
+
const items = await BalanceItem.where({ memberId })
|
|
272
|
+
await this.deleteItems(items)
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
static async deleteForDeletedRegistration(registrationId: string) {
|
|
276
|
+
const items = await BalanceItem.where({ registrationId })
|
|
277
|
+
await this.deleteItems(items)
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
static async getForRegistration(registrationId: string) {
|
|
281
|
+
const items = await BalanceItem.where({ registrationId })
|
|
282
|
+
return {
|
|
283
|
+
items,
|
|
284
|
+
...(await this.loadPayments(items))
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
static async loadPayments(items: BalanceItem[]) {
|
|
289
|
+
if (items.length == 0) {
|
|
290
|
+
return {balanceItemPayments: [], payments: []}
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
// Load balance payment items
|
|
294
|
+
const {BalanceItemPayment} = await import('./BalanceItemPayment');
|
|
295
|
+
const balanceItemPayments = await BalanceItemPayment.where({ balanceItemId: {sign: 'IN', value: items.map(i => i.id)} })
|
|
296
|
+
|
|
297
|
+
const payments = await Payment.getByIDs(...balanceItemPayments.map(p => p.paymentId))
|
|
298
|
+
|
|
299
|
+
return {payments, balanceItemPayments}
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
static async getMemberStructure(items: BalanceItem[]): Promise<MemberBalanceItem[]> {
|
|
303
|
+
if (items.length == 0) {
|
|
304
|
+
return []
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
const {Registration} = await import("./Registration");
|
|
308
|
+
const {Order} = await import("./Order");
|
|
309
|
+
const {Group} = await import("./Group");
|
|
310
|
+
|
|
311
|
+
const {payments, balanceItemPayments} = await BalanceItem.loadPayments(items)
|
|
312
|
+
|
|
313
|
+
// Load members and orders
|
|
314
|
+
const registrationIds = Formatter.uniqueArray(items.flatMap(b => b.registrationId ? [b.registrationId] : []))
|
|
315
|
+
const orderIds = Formatter.uniqueArray(items.flatMap(b => b.orderId ? [b.orderId] : []))
|
|
316
|
+
|
|
317
|
+
const registrations = await Registration.getByIDs(...registrationIds)
|
|
318
|
+
const orders = await Order.getByIDs(...orderIds)
|
|
319
|
+
|
|
320
|
+
const groupIds = Formatter.uniqueArray(registrations.map(r => r.groupId))
|
|
321
|
+
const groups = await Group.getByIDs(...groupIds)
|
|
322
|
+
|
|
323
|
+
return items.map(item => {
|
|
324
|
+
const thisBalanceItemPayments = balanceItemPayments.filter(p => p.balanceItemId === item.id)
|
|
325
|
+
const registration = registrations.find(r => r.id === item.registrationId)
|
|
326
|
+
const group = registration ? groups.find(g => g.id === registration.groupId) : null
|
|
327
|
+
|
|
328
|
+
return MemberBalanceItem.create({
|
|
329
|
+
...item,
|
|
330
|
+
registration: registration && group ? registration.setRelation(Registration.group, group).getStructure() : null,
|
|
331
|
+
order: orders.find(o => o.id === item.orderId)?.getStructureWithoutPayment() ?? null,
|
|
332
|
+
payments: thisBalanceItemPayments.map(p => {
|
|
333
|
+
const payment = payments.find(pp => pp.id === p.paymentId)!
|
|
334
|
+
return MemberBalanceItemPayment.create({
|
|
335
|
+
...p,
|
|
336
|
+
payment: PaymentStruct.create(payment)
|
|
337
|
+
})
|
|
338
|
+
})
|
|
339
|
+
})
|
|
340
|
+
})
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
static async balanceItemsForUsersAndMembers(organizationId: string|null, userIds: string[], memberIds: string[]): Promise<BalanceItem[]> {
|
|
344
|
+
if (memberIds.length == 0 && userIds.length == 0) {
|
|
345
|
+
return []
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
const params: any[] = [];
|
|
349
|
+
const where: string[] = [];
|
|
350
|
+
|
|
351
|
+
if (memberIds.length) {
|
|
352
|
+
if (memberIds.length == 1) {
|
|
353
|
+
where.push(`memberId = ?`)
|
|
354
|
+
params.push(memberIds[0]);
|
|
355
|
+
} else {
|
|
356
|
+
where.push(`memberId IN (?)`)
|
|
357
|
+
params.push(memberIds);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
// Note here, we don't search for memberId IS NULL restriction in MySQL because it slows down the query too much (500ms)
|
|
362
|
+
// Better if we do it in code here
|
|
363
|
+
if (userIds.length) {
|
|
364
|
+
if (userIds.length == 1) {
|
|
365
|
+
where.push('userId = ?')
|
|
366
|
+
params.push(userIds[0]);
|
|
367
|
+
} else {
|
|
368
|
+
where.push('userId IN (?)')
|
|
369
|
+
params.push(userIds);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
const requiredWhere: string[] = [];
|
|
374
|
+
|
|
375
|
+
if (organizationId) {
|
|
376
|
+
requiredWhere.push('organizationId = ?')
|
|
377
|
+
params.push(organizationId);
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
const query = `SELECT ${BalanceItem.getDefaultSelect()} FROM ${BalanceItem.table} WHERE (${where.join(" OR ")}) ${requiredWhere.length ? (' AND ' + requiredWhere.join(' AND ')) : ''} AND ${BalanceItem.table}.status != ?`;
|
|
381
|
+
params.push(BalanceItemStatus.Hidden);
|
|
382
|
+
|
|
383
|
+
const [rows] = await Database.select(query, params);
|
|
384
|
+
const balanceItems = BalanceItem.fromRows(rows, BalanceItem.table);
|
|
385
|
+
|
|
386
|
+
// Filter out items of other members
|
|
387
|
+
if (memberIds.length) {
|
|
388
|
+
return balanceItems.filter(b => !b.memberId || memberIds.includes(b.memberId))
|
|
389
|
+
}
|
|
390
|
+
return balanceItems;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { column, ManyToOneRelation, Model } from '@simonbackx/simple-database';
|
|
2
|
+
import { BalanceItemStatus } from '@stamhoofd/structures';
|
|
3
|
+
import { v4 as uuidv4 } from "uuid";
|
|
4
|
+
|
|
5
|
+
import { BalanceItem, Organization, Payment } from './';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Keeps track of all the created payments of a balance item, which contains the (tries) to pay a balance item.
|
|
9
|
+
* It also keeps track of how much a given payment is split between multiple balance items, which makes it possible to pay a balance item partially.
|
|
10
|
+
*/
|
|
11
|
+
export class BalanceItemPayment extends Model {
|
|
12
|
+
static table = "balance_item_payments"
|
|
13
|
+
|
|
14
|
+
@column({
|
|
15
|
+
primary: true, type: "string", beforeSave(value) {
|
|
16
|
+
return value ?? uuidv4();
|
|
17
|
+
}
|
|
18
|
+
})
|
|
19
|
+
id!: string;
|
|
20
|
+
|
|
21
|
+
@column({ type: "string" })
|
|
22
|
+
organizationId: string
|
|
23
|
+
|
|
24
|
+
@column({ type: "string", foreignKey: BalanceItemPayment.payment })
|
|
25
|
+
paymentId: string;
|
|
26
|
+
|
|
27
|
+
@column({ type: "string", foreignKey: BalanceItemPayment.balanceItem })
|
|
28
|
+
balanceItemId: string;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Part of price of the payment that is used to 'pay' the balance item
|
|
32
|
+
*/
|
|
33
|
+
@column({ type: "integer" })
|
|
34
|
+
price = 0
|
|
35
|
+
|
|
36
|
+
@column({
|
|
37
|
+
type: "datetime", beforeSave(old?: any) {
|
|
38
|
+
if (old !== undefined) {
|
|
39
|
+
return old;
|
|
40
|
+
}
|
|
41
|
+
const date = new Date()
|
|
42
|
+
date.setMilliseconds(0)
|
|
43
|
+
return date
|
|
44
|
+
}
|
|
45
|
+
})
|
|
46
|
+
createdAt: Date
|
|
47
|
+
|
|
48
|
+
@column({
|
|
49
|
+
type: "datetime", beforeSave() {
|
|
50
|
+
const date = new Date()
|
|
51
|
+
date.setMilliseconds(0)
|
|
52
|
+
return date
|
|
53
|
+
},
|
|
54
|
+
skipUpdate: true
|
|
55
|
+
})
|
|
56
|
+
updatedAt: Date
|
|
57
|
+
|
|
58
|
+
static balanceItem = new ManyToOneRelation(BalanceItem, "balanceItem")
|
|
59
|
+
static payment = new ManyToOneRelation(Payment, "payment")
|
|
60
|
+
|
|
61
|
+
async markPaid(this: BalanceItemPayment & Loaded<typeof BalanceItemPayment.balanceItem> & Loaded<typeof BalanceItemPayment.payment>, organization: Organization) {
|
|
62
|
+
// Update cached amountPaid of the balance item
|
|
63
|
+
this.balanceItem.pricePaid += this.price
|
|
64
|
+
|
|
65
|
+
// Update status
|
|
66
|
+
const old = this.balanceItem.status;
|
|
67
|
+
this.balanceItem.updateStatus();
|
|
68
|
+
await this.balanceItem.save();
|
|
69
|
+
|
|
70
|
+
// Do logic of balance item
|
|
71
|
+
if (this.balanceItem.status === BalanceItemStatus.Paid && old !== BalanceItemStatus.Paid) {
|
|
72
|
+
await this.balanceItem.markPaid(this.payment, organization)
|
|
73
|
+
} else {
|
|
74
|
+
await this.balanceItem.markUpdated(this.payment, organization)
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Call this once a earlier succeeded payment is no longer succeeded
|
|
80
|
+
*/
|
|
81
|
+
async undoPaid(this: BalanceItemPayment & Loaded<typeof BalanceItemPayment.balanceItem> & Loaded<typeof BalanceItemPayment.payment>, organization: Organization) {
|
|
82
|
+
// Update cached amountPaid of the balance item
|
|
83
|
+
this.balanceItem.pricePaid -= this.price
|
|
84
|
+
|
|
85
|
+
// Update status
|
|
86
|
+
this.balanceItem.status = this.balanceItem.pricePaid >= this.balanceItem.price ? BalanceItemStatus.Paid : BalanceItemStatus.Pending;
|
|
87
|
+
|
|
88
|
+
await this.balanceItem.save();
|
|
89
|
+
|
|
90
|
+
await this.balanceItem.undoPaid(this.payment, organization)
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
async markFailed(this: BalanceItemPayment & Loaded<typeof BalanceItemPayment.balanceItem> & Loaded<typeof BalanceItemPayment.payment>, organization: Organization) {
|
|
94
|
+
// Do logic of balance item
|
|
95
|
+
await this.balanceItem.markFailed(this.payment, organization)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
async undoFailed(this: BalanceItemPayment & Loaded<typeof BalanceItemPayment.balanceItem> & Loaded<typeof BalanceItemPayment.payment>, organization: Organization) {
|
|
99
|
+
// Reactivate deleted items
|
|
100
|
+
await this.balanceItem.undoFailed(this.payment, organization)
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
type Loaded<T> = (T) extends ManyToOneRelation<infer Key, infer Model> ? Record<Key, Model> : never;
|
|
106
|
+
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { column,Model } from "@simonbackx/simple-database";
|
|
2
|
+
import { v4 as uuidv4 } from "uuid";
|
|
3
|
+
|
|
4
|
+
export class BuckarooPayment extends Model {
|
|
5
|
+
static table = "buckaroo_payments";
|
|
6
|
+
|
|
7
|
+
@column({
|
|
8
|
+
primary: true, type: "string", beforeSave(value) {
|
|
9
|
+
return value ?? uuidv4();
|
|
10
|
+
}
|
|
11
|
+
})
|
|
12
|
+
id!: string;
|
|
13
|
+
|
|
14
|
+
@column({ type: "string" })
|
|
15
|
+
paymentId: string;
|
|
16
|
+
|
|
17
|
+
@column({ type: "string" })
|
|
18
|
+
transactionKey: string;
|
|
19
|
+
}
|