@stamhoofd/models 2.12.0 → 2.16.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.
Files changed (183) hide show
  1. package/dist/src/factories/GroupFactory.js +13 -6
  2. package/dist/src/factories/GroupFactory.js.map +1 -1
  3. package/dist/src/factories/MemberFactory.js +10 -4
  4. package/dist/src/factories/MemberFactory.js.map +1 -1
  5. package/dist/src/factories/OrganizationFactory.js +11 -6
  6. package/dist/src/factories/OrganizationFactory.js.map +1 -1
  7. package/dist/src/factories/ParentFactory.js +2 -3
  8. package/dist/src/factories/ParentFactory.js.map +1 -1
  9. package/dist/src/factories/RecordFactory.js +1 -0
  10. package/dist/src/factories/RecordFactory.js.map +1 -1
  11. package/dist/src/factories/RegisterCodeFactory.js +2 -3
  12. package/dist/src/factories/RegisterCodeFactory.js.map +1 -1
  13. package/dist/src/factories/RegistrationFactory.js +2 -0
  14. package/dist/src/factories/RegistrationFactory.js.map +1 -1
  15. package/dist/src/factories/UserFactory.js +15 -5
  16. package/dist/src/factories/UserFactory.js.map +1 -1
  17. package/dist/src/factories/WebshopFactory.js +7 -3
  18. package/dist/src/factories/WebshopFactory.js.map +1 -1
  19. package/dist/src/helpers/DNSValidator.js +1 -2
  20. package/dist/src/helpers/DNSValidator.js.map +1 -1
  21. package/dist/src/helpers/EmailBuilder.d.ts +23 -5
  22. package/dist/src/helpers/EmailBuilder.d.ts.map +1 -1
  23. package/dist/src/helpers/EmailBuilder.js +73 -21
  24. package/dist/src/helpers/EmailBuilder.js.map +1 -1
  25. package/dist/src/helpers/GroupBuilder.js +2 -2
  26. package/dist/src/helpers/GroupBuilder.js.map +1 -1
  27. package/dist/src/helpers/Handlebars.js +3 -5
  28. package/dist/src/helpers/Handlebars.js.map +1 -1
  29. package/dist/src/helpers/InvoiceBuilder.js +11 -10
  30. package/dist/src/helpers/InvoiceBuilder.js.map +1 -1
  31. package/dist/src/helpers/MemberMerger.d.ts +13 -0
  32. package/dist/src/helpers/MemberMerger.d.ts.map +1 -0
  33. package/dist/src/helpers/MemberMerger.js +328 -0
  34. package/dist/src/helpers/MemberMerger.js.map +1 -0
  35. package/dist/src/helpers/MemberMerger.test.d.ts +2 -0
  36. package/dist/src/helpers/MemberMerger.test.d.ts.map +1 -0
  37. package/dist/src/helpers/MemberMerger.test.js +592 -0
  38. package/dist/src/helpers/MemberMerger.test.js.map +1 -0
  39. package/dist/src/helpers/RateLimiter.d.ts.map +1 -1
  40. package/dist/src/helpers/RateLimiter.js +10 -5
  41. package/dist/src/helpers/RateLimiter.js.map +1 -1
  42. package/dist/src/helpers/WebshopCounter.js +2 -2
  43. package/dist/src/helpers/WebshopCounter.js.map +1 -1
  44. package/dist/src/index.d.ts +1 -0
  45. package/dist/src/index.d.ts.map +1 -1
  46. package/dist/src/index.js +1 -0
  47. package/dist/src/index.js.map +1 -1
  48. package/dist/src/migrations/1605262045-import-postcodes.js +10 -2
  49. package/dist/src/migrations/1723736282-merged-members.sql +19 -0
  50. package/dist/src/models/BalanceItem.js +41 -35
  51. package/dist/src/models/BalanceItem.js.map +1 -1
  52. package/dist/src/models/BalanceItemPayment.js +14 -11
  53. package/dist/src/models/BalanceItemPayment.js.map +1 -1
  54. package/dist/src/models/BuckarooPayment.js +5 -2
  55. package/dist/src/models/BuckarooPayment.js.map +1 -1
  56. package/dist/src/models/Document.js +24 -23
  57. package/dist/src/models/Document.js.map +1 -1
  58. package/dist/src/models/DocumentTemplate.js +36 -25
  59. package/dist/src/models/DocumentTemplate.js.map +1 -1
  60. package/dist/src/models/Email.d.ts.map +1 -1
  61. package/dist/src/models/Email.js +36 -38
  62. package/dist/src/models/Email.js.map +1 -1
  63. package/dist/src/models/EmailRecipient.js +15 -13
  64. package/dist/src/models/EmailRecipient.js.map +1 -1
  65. package/dist/src/models/EmailTemplate.d.ts +5 -0
  66. package/dist/src/models/EmailTemplate.d.ts.map +1 -1
  67. package/dist/src/models/EmailTemplate.js +30 -7
  68. package/dist/src/models/EmailTemplate.js.map +1 -1
  69. package/dist/src/models/EmailVerificationCode.js +32 -25
  70. package/dist/src/models/EmailVerificationCode.js.map +1 -1
  71. package/dist/src/models/Event.js +15 -12
  72. package/dist/src/models/Event.js.map +1 -1
  73. package/dist/src/models/Group.js +24 -21
  74. package/dist/src/models/Group.js.map +1 -1
  75. package/dist/src/models/Image.d.ts +0 -1
  76. package/dist/src/models/Image.d.ts.map +1 -1
  77. package/dist/src/models/Image.js +12 -14
  78. package/dist/src/models/Image.js.map +1 -1
  79. package/dist/src/models/Member.d.ts.map +1 -1
  80. package/dist/src/models/Member.js +34 -32
  81. package/dist/src/models/Member.js.map +1 -1
  82. package/dist/src/models/MemberPlatformMembership.js +22 -16
  83. package/dist/src/models/MemberPlatformMembership.js.map +1 -1
  84. package/dist/src/models/MemberResponsibilityRecord.js +10 -8
  85. package/dist/src/models/MemberResponsibilityRecord.js.map +1 -1
  86. package/dist/src/models/MergedMember.d.ts +23 -0
  87. package/dist/src/models/MergedMember.d.ts.map +1 -0
  88. package/dist/src/models/MergedMember.js +126 -0
  89. package/dist/src/models/MergedMember.js.map +1 -0
  90. package/dist/src/models/MolliePayment.js +5 -2
  91. package/dist/src/models/MolliePayment.js.map +1 -1
  92. package/dist/src/models/MollieToken.js +14 -14
  93. package/dist/src/models/MollieToken.js.map +1 -1
  94. package/dist/src/models/OneTimeToken.js +15 -13
  95. package/dist/src/models/OneTimeToken.js.map +1 -1
  96. package/dist/src/models/Order.d.ts +1 -1
  97. package/dist/src/models/Order.d.ts.map +1 -1
  98. package/dist/src/models/Order.js +42 -52
  99. package/dist/src/models/Order.js.map +1 -1
  100. package/dist/src/models/Organization.d.ts.map +1 -1
  101. package/dist/src/models/Organization.js +64 -66
  102. package/dist/src/models/Organization.js.map +1 -1
  103. package/dist/src/models/OrganizationRegistrationPeriod.js +8 -7
  104. package/dist/src/models/OrganizationRegistrationPeriod.js.map +1 -1
  105. package/dist/src/models/PasswordToken.js +9 -5
  106. package/dist/src/models/PasswordToken.js.map +1 -1
  107. package/dist/src/models/PayconiqPayment.js +12 -14
  108. package/dist/src/models/PayconiqPayment.js.map +1 -1
  109. package/dist/src/models/Payment.d.ts.map +1 -1
  110. package/dist/src/models/Payment.js +41 -35
  111. package/dist/src/models/Payment.js.map +1 -1
  112. package/dist/src/models/Platform.js +8 -10
  113. package/dist/src/models/Platform.js.map +1 -1
  114. package/dist/src/models/RegisterCode.js +12 -9
  115. package/dist/src/models/RegisterCode.js.map +1 -1
  116. package/dist/src/models/Registration.d.ts.map +1 -1
  117. package/dist/src/models/Registration.js +65 -80
  118. package/dist/src/models/Registration.js.map +1 -1
  119. package/dist/src/models/RegistrationPeriod.js +11 -9
  120. package/dist/src/models/RegistrationPeriod.js.map +1 -1
  121. package/dist/src/models/STCredit.js +11 -7
  122. package/dist/src/models/STCredit.js.map +1 -1
  123. package/dist/src/models/STInvoice.js +45 -45
  124. package/dist/src/models/STInvoice.js.map +1 -1
  125. package/dist/src/models/STPackage.d.ts.map +1 -1
  126. package/dist/src/models/STPackage.js +58 -62
  127. package/dist/src/models/STPackage.js.map +1 -1
  128. package/dist/src/models/STPendingInvoice.js +17 -16
  129. package/dist/src/models/STPendingInvoice.js.map +1 -1
  130. package/dist/src/models/StripeAccount.js +15 -14
  131. package/dist/src/models/StripeAccount.js.map +1 -1
  132. package/dist/src/models/StripeCheckoutSession.js +10 -10
  133. package/dist/src/models/StripeCheckoutSession.js.map +1 -1
  134. package/dist/src/models/StripePaymentIntent.js +10 -10
  135. package/dist/src/models/StripePaymentIntent.js.map +1 -1
  136. package/dist/src/models/Ticket.js +46 -32
  137. package/dist/src/models/Ticket.js.map +1 -1
  138. package/dist/src/models/Token.js +12 -5
  139. package/dist/src/models/Token.js.map +1 -1
  140. package/dist/src/models/UsedRegisterCode.js +15 -11
  141. package/dist/src/models/UsedRegisterCode.js.map +1 -1
  142. package/dist/src/models/User.d.ts +2 -1
  143. package/dist/src/models/User.d.ts.map +1 -1
  144. package/dist/src/models/User.js +51 -29
  145. package/dist/src/models/User.js.map +1 -1
  146. package/dist/src/models/UserPermissions.js +11 -8
  147. package/dist/src/models/UserPermissions.js.map +1 -1
  148. package/dist/src/models/Webshop.js +41 -37
  149. package/dist/src/models/Webshop.js.map +1 -1
  150. package/dist/src/models/WebshopDiscountCode.js +13 -9
  151. package/dist/src/models/WebshopDiscountCode.js.map +1 -1
  152. package/dist/src/models/addresses/City.js +9 -8
  153. package/dist/src/models/addresses/City.js.map +1 -1
  154. package/dist/src/models/addresses/PostalCode.js +7 -3
  155. package/dist/src/models/addresses/PostalCode.js.map +1 -1
  156. package/dist/src/models/addresses/Province.js +5 -2
  157. package/dist/src/models/addresses/Province.js.map +1 -1
  158. package/dist/src/models/addresses/Street.js +6 -3
  159. package/dist/src/models/addresses/Street.js.map +1 -1
  160. package/dist/src/models/index.d.ts +1 -0
  161. package/dist/src/models/index.d.ts.map +1 -1
  162. package/dist/src/models/index.js +3 -1
  163. package/dist/src/models/index.js.map +1 -1
  164. package/dist/src/structures/OrganizationServerMetaData.js +30 -27
  165. package/dist/src/structures/OrganizationServerMetaData.js.map +1 -1
  166. package/package.json +3 -3
  167. package/src/helpers/EmailBuilder.ts +95 -17
  168. package/src/helpers/MemberMerger.test.ts +719 -0
  169. package/src/helpers/MemberMerger.ts +497 -0
  170. package/src/helpers/RateLimiter.ts +1 -0
  171. package/src/index.ts +2 -1
  172. package/src/migrations/1723736282-merged-members.sql +19 -0
  173. package/src/models/Email.ts +9 -11
  174. package/src/models/EmailTemplate.ts +20 -1
  175. package/src/models/Member.ts +7 -8
  176. package/src/models/MergedMember.ts +112 -0
  177. package/src/models/Order.ts +11 -21
  178. package/src/models/Organization.ts +17 -26
  179. package/src/models/Payment.ts +1 -0
  180. package/src/models/Registration.ts +17 -45
  181. package/src/models/STPackage.ts +8 -16
  182. package/src/models/User.ts +24 -1
  183. package/src/models/index.ts +1 -0
@@ -0,0 +1,112 @@
1
+ import { Model, column } from "@simonbackx/simple-database";
2
+ import { MemberDetails } from "@stamhoofd/structures";
3
+ import { Member } from "./";
4
+
5
+ export class MergedMember extends Model {
6
+ static override table = "merged_members";
7
+
8
+ //#region Member columns
9
+ @column({
10
+ primary: true,
11
+ type: "string",
12
+ })
13
+ id: string = "";
14
+
15
+ @column({ type: "string", nullable: true })
16
+ organizationId: string | null = null;
17
+
18
+ @column({
19
+ type: "string",
20
+ })
21
+ firstName: string;
22
+
23
+ @column({
24
+ type: "string",
25
+ })
26
+ lastName: string;
27
+
28
+ @column({
29
+ type: "string",
30
+ nullable: true,
31
+ })
32
+ birthDay: string | null;
33
+
34
+ @column({
35
+ type: "string",
36
+ nullable: true,
37
+ })
38
+ memberNumber: string | null;
39
+
40
+ @column({ type: "json", decoder: MemberDetails })
41
+ details: MemberDetails;
42
+
43
+ /**
44
+ * Not yet paid balance
45
+ */
46
+ @column({ type: "integer" })
47
+ outstandingBalance = 0;
48
+
49
+ @column({
50
+ type: "datetime",
51
+ beforeSave(old?: any) {
52
+ if (old !== undefined) {
53
+ return old;
54
+ }
55
+ const date = new Date();
56
+ date.setMilliseconds(0);
57
+ return date;
58
+ },
59
+ })
60
+ createdAt: Date;
61
+
62
+ @column({
63
+ type: "datetime",
64
+ beforeSave() {
65
+ const date = new Date();
66
+ date.setMilliseconds(0);
67
+ return date;
68
+ },
69
+ skipUpdate: true,
70
+ })
71
+ updatedAt: Date;
72
+ //#endregion
73
+
74
+ //#region extra columns
75
+ @column({
76
+ type: "string",
77
+ nullable: false,
78
+ })
79
+ mergedToId: string = "";
80
+
81
+ @column({
82
+ type: "datetime",
83
+ beforeSave(old?: any) {
84
+ if (old !== undefined) {
85
+ return old;
86
+ }
87
+ const date = new Date();
88
+ date.setMilliseconds(0);
89
+ return date;
90
+ },
91
+ })
92
+ mergedAt: Date;
93
+ //#endregion
94
+
95
+ static fromMember(member: Member, mergedToId: string): MergedMember {
96
+ const mergedMember = new MergedMember();
97
+ mergedMember.mergedToId = mergedToId;
98
+ mergedMember.mergedAt = new Date();
99
+
100
+ mergedMember.id = member.id;
101
+ mergedMember.organizationId = member.organizationId;
102
+ mergedMember.firstName = member.firstName;
103
+ mergedMember.lastName = member.lastName;
104
+ mergedMember.birthDay = member.birthDay;
105
+ mergedMember.memberNumber = member.memberNumber;
106
+ mergedMember.outstandingBalance = member.outstandingBalance;
107
+ mergedMember.createdAt = new Date(member.createdAt);
108
+ mergedMember.updatedAt = new Date(member.updatedAt);
109
+ mergedMember.details = member.details.clone();
110
+ return mergedMember;
111
+ }
112
+ }
@@ -2,13 +2,13 @@ import { column, ManyToOneRelation, Model } from "@simonbackx/simple-database";
2
2
  import { SimpleError } from "@simonbackx/simple-errors";
3
3
  import { Email } from '@stamhoofd/email';
4
4
  import { QueueHandler } from "@stamhoofd/queues";
5
- import { BalanceItemPaymentWithPrivatePayment,BalanceItemWithPayments, BalanceItemWithPrivatePayments, EmailTemplateType, BalanceItemPaymentWithPayment, Order as OrderStruct, OrderData, OrderStatus, Payment as PaymentStruct, PaymentMethod, PrivateOrder, PrivatePayment, ProductType, Recipient, Replacement, WebshopPreview, WebshopStatus, WebshopTicketType, WebshopTimeSlot } from '@stamhoofd/structures';
5
+ import { BalanceItemPaymentWithPayment, BalanceItemPaymentWithPrivatePayment, BalanceItemWithPayments, BalanceItemWithPrivatePayments, EmailTemplateType, OrderData, OrderStatus, Order as OrderStruct, PaymentMethod, Payment as PaymentStruct, PrivateOrder, PrivatePayment, ProductType, Recipient, Replacement, WebshopPreview, WebshopStatus, WebshopTicketType, WebshopTimeSlot } from '@stamhoofd/structures';
6
6
  import { Formatter } from "@stamhoofd/utility";
7
7
  import { v4 as uuidv4 } from "uuid";
8
8
 
9
- import { getEmailBuilder } from "../helpers/EmailBuilder";
9
+ import { getEmailBuilderForTemplate } from "../helpers/EmailBuilder";
10
10
  import { WebshopCounter } from '../helpers/WebshopCounter';
11
- import { BalanceItem, EmailTemplate, Organization, Payment, Ticket, Webshop, WebshopDiscountCode } from './';
11
+ import { BalanceItem, Organization, Payment, Ticket, Webshop, WebshopDiscountCode } from './';
12
12
 
13
13
  export class Order extends Model {
14
14
  static table = "webshop_orders";
@@ -860,20 +860,6 @@ export class Order extends Model {
860
860
  return
861
861
  }
862
862
 
863
- // First fetch template
864
- let templates = (await EmailTemplate.where({ type: data.type, webshopId: this.webshop.id }))
865
-
866
- if (templates.length == 0) {
867
- templates = (await EmailTemplate.where({ type: data.type, organizationId: null }))
868
- }
869
-
870
- if (templates.length == 0) {
871
- console.error("Could not find email template for type "+data.type)
872
- return
873
- }
874
-
875
- const template = templates[0]
876
-
877
863
  let recipient = (await this.getStructure()).getRecipient(
878
864
  this.webshop.organization.getBaseStructure(),
879
865
  WebshopPreview.create(this.webshop)
@@ -889,10 +875,12 @@ export class Order extends Model {
889
875
  }
890
876
 
891
877
  // Create e-mail builder
892
- const builder = await getEmailBuilder(this.webshop.organization, {
878
+ const builder = await getEmailBuilderForTemplate(this.webshop.organization, {
893
879
  recipients: [recipient],
894
- subject: template.subject,
895
- html: template.html,
880
+ template: {
881
+ type: data.type,
882
+ webshopId: this.id
883
+ },
896
884
  // text: template.text,
897
885
  from: data.from,
898
886
  replyTo: data.replyTo,
@@ -900,7 +888,9 @@ export class Order extends Model {
900
888
  defaultReplacements: this.webshop.meta.getEmailReplacements()
901
889
  })
902
890
 
903
- Email.schedule(builder)
891
+ if (builder) {
892
+ Email.schedule(builder)
893
+ }
904
894
  }
905
895
 
906
896
  /**
@@ -3,17 +3,17 @@ import { DecodedRequest } from '@simonbackx/simple-endpoints';
3
3
  import { SimpleError } from '@simonbackx/simple-errors';
4
4
  import { I18n } from "@stamhoofd/backend-i18n";
5
5
  import { Email, EmailInterfaceRecipient } from "@stamhoofd/email";
6
- import { AccessRight, Address, Company, Country, DNSRecordStatus, EmailTemplateType, OrganizationEmail, OrganizationMetaData, OrganizationPrivateMetaData, OrganizationRecordsConfiguration, OrganizationRegistrationPeriod as OrganizationRegistrationPeriodStruct, Organization as OrganizationStruct, PaymentMethod, PaymentProvider, PrivatePaymentConfiguration, Recipient, Replacement, STPackageType, TransferSettings } from "@stamhoofd/structures";
6
+ import { AccessRight, Address, Country, DNSRecordStatus, EmailTemplateType, OrganizationEmail, OrganizationMetaData, OrganizationPrivateMetaData, Organization as OrganizationStruct, PaymentMethod, PaymentProvider, PrivatePaymentConfiguration, Recipient, Replacement, STPackageType, TransferSettings } from "@stamhoofd/structures";
7
7
  import { AWSError } from 'aws-sdk';
8
8
  import SES from 'aws-sdk/clients/sesv2';
9
9
  import { PromiseResult } from 'aws-sdk/lib/request';
10
10
  import { v4 as uuidv4 } from "uuid";
11
11
 
12
+ import { QueueHandler } from "@stamhoofd/queues";
12
13
  import { validateDNSRecords } from "../helpers/DNSValidator";
13
- import { getEmailBuilder } from "../helpers/EmailBuilder";
14
+ import { getEmailBuilderForTemplate } from "../helpers/EmailBuilder";
14
15
  import { OrganizationServerMetaData } from '../structures/OrganizationServerMetaData';
15
- import { EmailTemplate, Group, OrganizationRegistrationPeriod, RegistrationPeriod, StripeAccount } from "./";
16
- import { QueueHandler } from "@stamhoofd/queues";
16
+ import { Group, OrganizationRegistrationPeriod, StripeAccount } from "./";
17
17
 
18
18
  export class Organization extends Model {
19
19
  static table = "organizations";
@@ -426,22 +426,11 @@ export class Organization extends Model {
426
426
  replyTo?: string,
427
427
  bcc?: boolean
428
428
  }) {
429
- // First fetch template
430
- const templates = (await EmailTemplate.where({ type: data.type, organizationId: null }))
431
-
432
- if (templates.length == 0) {
433
- console.error("Could not find email template for type "+data.type)
434
- return
435
- }
436
-
437
- const template = templates[0]
438
-
439
429
  const recipients = await this.getAdminRecipients();
440
-
441
430
  const defaultI18n = new I18n("nl", Country.Belgium)
442
431
  const i18n = this.i18n;
443
432
 
444
- const replacementStrings = [
433
+ const replaceAll = [
445
434
  {
446
435
  from: defaultI18n.$t("shared.domains.marketing"),
447
436
  to: i18n.$t("shared.domains.marketing")
@@ -456,17 +445,13 @@ export class Organization extends Model {
456
445
  }
457
446
  ];
458
447
 
459
- let html = template.html;
460
-
461
- for (const s of replacementStrings) {
462
- html = html.replaceAll(s.from, s.to)
463
- }
464
-
465
448
  // Create e-mail builder
466
- const builder = await getEmailBuilder(this, {
449
+ const builder = await getEmailBuilderForTemplate(this, {
450
+ replaceAll,
467
451
  recipients,
468
- subject: template.subject,
469
- html,
452
+ template: {
453
+ type: data.type
454
+ },
470
455
  from: data.personal ? Email.getPersonalEmailFor(this.i18n) : Email.getInternalEmailFor(this.i18n),
471
456
  singleBcc: data.bcc ? 'simon@stamhoofd.be' : undefined,
472
457
  replyTo: data.replyTo,
@@ -481,7 +466,9 @@ export class Organization extends Model {
481
466
  fromStamhoofd: true
482
467
  })
483
468
 
484
- Email.schedule(builder)
469
+ if (builder) {
470
+ Email.schedule(builder)
471
+ }
485
472
  }
486
473
 
487
474
  async deleteAWSMailIdenitity(mailDomain: string) {
@@ -1002,6 +989,10 @@ export class Organization extends Model {
1002
989
  human: 'Deze betaalmethode werd helaas niet volledig geconfigureerd. Probeer later even opnieuw, neem contact met ons op of kies een andere betaalmethode.'
1003
990
  })
1004
991
  }
992
+
993
+ if (provider !== PaymentProvider.Stripe && stripeAccount) {
994
+ stripeAccount = null
995
+ }
1005
996
  return {
1006
997
  provider,
1007
998
  stripeAccount
@@ -164,6 +164,7 @@ export class Payment extends Model {
164
164
  })
165
165
  })
166
166
  }),
167
+ ...(payment.provider !== PaymentProvider.Stripe ? {stripeAccountId: null} : {}),
167
168
  ...(!includeSettlements) ? {settlement: null, transferFee: 0, stripeAccountId: null} : {}
168
169
  })
169
170
  })
@@ -4,10 +4,10 @@ import { EmailTemplateType, GroupPrice, PaymentMethod, PaymentMethodHelper, Reci
4
4
  import { Formatter } from '@stamhoofd/utility';
5
5
  import { v4 as uuidv4 } from "uuid";
6
6
 
7
- import { getEmailBuilder } from '../helpers/EmailBuilder';
8
- import { Document, EmailTemplate, Group, Organization, User } from './';
9
7
  import { ArrayDecoder } from '@simonbackx/simple-encoding';
10
8
  import { QueueHandler } from '@stamhoofd/queues';
9
+ import { getEmailBuilderForTemplate } from '../helpers/EmailBuilder';
10
+ import { Document, Group, Organization, User } from './';
11
11
 
12
12
  export class Registration extends Model {
13
13
  static table = "registrations"
@@ -286,26 +286,6 @@ export class Registration extends Model {
286
286
  return
287
287
  }
288
288
 
289
- // Most specific template: for specific group
290
- let templates = (await EmailTemplate.where({ type: data.type, groupId: this.groupId, organizationId: group.organizationId }))
291
-
292
- // Then for organization
293
- if (templates.length == 0) {
294
- templates = (await EmailTemplate.where({ type: data.type, organizationId: group.organizationId, groupId: null }))
295
- }
296
-
297
- // Then default
298
- if (templates.length == 0) {
299
- templates = (await EmailTemplate.where({ type: data.type, organizationId: null, groupId: null }))
300
- }
301
-
302
- if (templates.length == 0) {
303
- console.error("Could not find email template for type "+data.type)
304
- return
305
- }
306
-
307
- const template = templates[0]
308
-
309
289
  const organization = await Organization.getByID(group.organizationId);
310
290
  if (!organization) {
311
291
  return
@@ -316,37 +296,26 @@ export class Registration extends Model {
316
296
  const {from, replyTo} = organization.getGroupEmail(group)
317
297
 
318
298
  // Create e-mail builder
319
- const builder = await getEmailBuilder(organization, {
299
+ const builder = await getEmailBuilderForTemplate(organization, {
300
+ template: {
301
+ type: data.type,
302
+ groupId: this.groupId
303
+ },
320
304
  recipients,
321
- subject: template.subject,
322
- html: template.html,
323
305
  from,
324
306
  type: "transactional",
325
307
  replyTo
326
308
  })
327
309
 
328
- Email.schedule(builder)
310
+ if (builder) {
311
+ Email.schedule(builder)
312
+ }
329
313
  }
330
314
 
331
315
  static async sendTransferEmail(user: User, organization: Organization, payment: import('./').Payment) {
332
316
  const data = {
333
317
  type: EmailTemplateType.RegistrationTransferDetails
334
318
  };
335
-
336
- // First fetch template
337
- let templates = (await EmailTemplate.where({ type: data.type, organizationId: organization.id, groupId: null }))
338
-
339
- if (templates.length == 0) {
340
- templates = (await EmailTemplate.where({ type: data.type, organizationId: null, groupId: null }))
341
- }
342
-
343
- if (templates.length == 0) {
344
- console.error("Could not find email template for type "+data.type)
345
- return
346
- }
347
-
348
- const template = templates[0]
349
-
350
319
  const paymentGeneral = await payment.getGeneralStructure();
351
320
  const groupIds = paymentGeneral.groupIds;
352
321
 
@@ -430,15 +399,18 @@ export class Registration extends Model {
430
399
  }
431
400
 
432
401
  // Create e-mail builder
433
- const builder = await getEmailBuilder(organization, {
402
+ const builder = await getEmailBuilderForTemplate(organization, {
403
+ template: {
404
+ type: EmailTemplateType.RegistrationTransferDetails
405
+ },
434
406
  recipients,
435
- subject: template.subject,
436
- html: template.html,
437
407
  from,
438
408
  replyTo
439
409
  })
440
410
 
441
- Email.schedule(builder)
411
+ if (builder) {
412
+ Email.schedule(builder)
413
+ }
442
414
  }
443
415
 
444
416
  shouldIncludeStock() {
@@ -5,9 +5,8 @@ import { EmailTemplateType, Recipient, Replacement, STPackageMeta, STPackageStat
5
5
  import { Formatter } from "@stamhoofd/utility";
6
6
  import { v4 as uuidv4 } from "uuid";
7
7
 
8
- import { getEmailBuilder } from "../helpers/EmailBuilder";
8
+ import { getEmailBuilderForTemplate } from "../helpers/EmailBuilder";
9
9
  import { GroupBuilder } from "../helpers/GroupBuilder";
10
- import { EmailTemplate } from "./";
11
10
  import { Organization } from "./";
12
11
 
13
12
  export class STPackage extends Model {
@@ -257,14 +256,6 @@ export class STPackage extends Model {
257
256
  type: EmailTemplateType,
258
257
  replyTo?: string
259
258
  }) {
260
- // First fetch template
261
- const templates = await EmailTemplate.where({ type: data.type, organizationId: null })
262
-
263
- if (!templates || templates.length == 0) {
264
- console.error("Could not find email template for type "+data.type)
265
- return
266
- }
267
-
268
259
  const organization = await Organization.getByID(this.organizationId)
269
260
 
270
261
  if (!organization) {
@@ -272,7 +263,6 @@ export class STPackage extends Model {
272
263
  return
273
264
  }
274
265
 
275
- const template = templates[0]
276
266
  const admins = await organization.getFullAdmins()
277
267
 
278
268
  const recipients = admins.map(admin =>
@@ -308,17 +298,19 @@ export class STPackage extends Model {
308
298
  ]
309
299
  })
310
300
  );
311
-
312
301
 
313
302
  // Create e-mail builder
314
- const builder = await getEmailBuilder(organization, {
303
+ const builder = await getEmailBuilderForTemplate(organization, {
304
+ template: {
305
+ type: data.type
306
+ },
315
307
  recipients,
316
- subject: template.subject,
317
- html: template.html,
318
308
  from: Email.getInternalEmailFor(organization.i18n),
319
309
  replyTo: data.replyTo
320
310
  })
321
311
 
322
- Email.schedule(builder)
312
+ if (builder) {
313
+ Email.schedule(builder)
314
+ }
323
315
  }
324
316
  }
@@ -1,7 +1,7 @@
1
1
 
2
2
  import { column, Database, ManyToOneRelation, Model } from "@simonbackx/simple-database";
3
3
  import { EmailInterfaceRecipient } from "@stamhoofd/email";
4
- import { LoginProviderType, NewUser, Permissions, UserMeta, UserPermissions, User as UserStruct } from "@stamhoofd/structures";
4
+ import { LoginProviderType, NewUser, Permissions, Recipient, Replacement, UserMeta, UserPermissions, User as UserStruct } from "@stamhoofd/structures";
5
5
  import argon2 from "argon2";
6
6
  import { v4 as uuidv4 } from "uuid";
7
7
 
@@ -92,6 +92,29 @@ export class User extends Model {
92
92
  return null;
93
93
  }
94
94
 
95
+ createRecipient(...replacements: Replacement[]) {
96
+ return Recipient.create({
97
+ firstName: this.firstName,
98
+ lastName: this.lastName,
99
+ email: this.email,
100
+ replacements: [
101
+ ...replacements,
102
+ Replacement.create({
103
+ token: 'firstName',
104
+ value: this.firstName ?? ''
105
+ }),
106
+ Replacement.create({
107
+ token: 'lastName',
108
+ value: this.lastName ?? ''
109
+ }),
110
+ Replacement.create({
111
+ token: 'email',
112
+ value: this.email
113
+ })
114
+ ]
115
+ })
116
+ }
117
+
95
118
  static async getAdmins(organizationIds: string[], options?: {verified?: boolean}) {
96
119
  if (organizationIds.length == 0) {
97
120
  return []
@@ -4,6 +4,7 @@ export {User} from "./User"
4
4
  export {Payment} from "./Payment"
5
5
  export {Registration} from "./Registration"
6
6
  export {Member, RegistrationWithMember, MemberWithRegistrations} from "./Member"
7
+ export {MergedMember} from "./MergedMember"
7
8
 
8
9
  export * from "./EmailVerificationCode"
9
10