@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.
- package/dist/src/factories/GroupFactory.js +13 -6
- package/dist/src/factories/GroupFactory.js.map +1 -1
- package/dist/src/factories/MemberFactory.js +10 -4
- package/dist/src/factories/MemberFactory.js.map +1 -1
- package/dist/src/factories/OrganizationFactory.js +11 -6
- package/dist/src/factories/OrganizationFactory.js.map +1 -1
- package/dist/src/factories/ParentFactory.js +2 -3
- package/dist/src/factories/ParentFactory.js.map +1 -1
- package/dist/src/factories/RecordFactory.js +1 -0
- package/dist/src/factories/RecordFactory.js.map +1 -1
- package/dist/src/factories/RegisterCodeFactory.js +2 -3
- package/dist/src/factories/RegisterCodeFactory.js.map +1 -1
- package/dist/src/factories/RegistrationFactory.js +2 -0
- package/dist/src/factories/RegistrationFactory.js.map +1 -1
- package/dist/src/factories/UserFactory.js +15 -5
- package/dist/src/factories/UserFactory.js.map +1 -1
- package/dist/src/factories/WebshopFactory.js +7 -3
- package/dist/src/factories/WebshopFactory.js.map +1 -1
- package/dist/src/helpers/DNSValidator.js +1 -2
- package/dist/src/helpers/DNSValidator.js.map +1 -1
- package/dist/src/helpers/EmailBuilder.d.ts +23 -5
- package/dist/src/helpers/EmailBuilder.d.ts.map +1 -1
- package/dist/src/helpers/EmailBuilder.js +73 -21
- package/dist/src/helpers/EmailBuilder.js.map +1 -1
- package/dist/src/helpers/GroupBuilder.js +2 -2
- package/dist/src/helpers/GroupBuilder.js.map +1 -1
- package/dist/src/helpers/Handlebars.js +3 -5
- package/dist/src/helpers/Handlebars.js.map +1 -1
- package/dist/src/helpers/InvoiceBuilder.js +11 -10
- package/dist/src/helpers/InvoiceBuilder.js.map +1 -1
- package/dist/src/helpers/MemberMerger.d.ts +13 -0
- package/dist/src/helpers/MemberMerger.d.ts.map +1 -0
- package/dist/src/helpers/MemberMerger.js +328 -0
- package/dist/src/helpers/MemberMerger.js.map +1 -0
- package/dist/src/helpers/MemberMerger.test.d.ts +2 -0
- package/dist/src/helpers/MemberMerger.test.d.ts.map +1 -0
- package/dist/src/helpers/MemberMerger.test.js +592 -0
- package/dist/src/helpers/MemberMerger.test.js.map +1 -0
- package/dist/src/helpers/RateLimiter.d.ts.map +1 -1
- package/dist/src/helpers/RateLimiter.js +10 -5
- package/dist/src/helpers/RateLimiter.js.map +1 -1
- package/dist/src/helpers/WebshopCounter.js +2 -2
- package/dist/src/helpers/WebshopCounter.js.map +1 -1
- package/dist/src/index.d.ts +1 -0
- 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 +10 -2
- package/dist/src/migrations/1723736282-merged-members.sql +19 -0
- package/dist/src/models/BalanceItem.js +41 -35
- package/dist/src/models/BalanceItem.js.map +1 -1
- package/dist/src/models/BalanceItemPayment.js +14 -11
- package/dist/src/models/BalanceItemPayment.js.map +1 -1
- package/dist/src/models/BuckarooPayment.js +5 -2
- package/dist/src/models/BuckarooPayment.js.map +1 -1
- package/dist/src/models/Document.js +24 -23
- package/dist/src/models/Document.js.map +1 -1
- package/dist/src/models/DocumentTemplate.js +36 -25
- 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 +36 -38
- package/dist/src/models/Email.js.map +1 -1
- package/dist/src/models/EmailRecipient.js +15 -13
- package/dist/src/models/EmailRecipient.js.map +1 -1
- package/dist/src/models/EmailTemplate.d.ts +5 -0
- package/dist/src/models/EmailTemplate.d.ts.map +1 -1
- package/dist/src/models/EmailTemplate.js +30 -7
- package/dist/src/models/EmailTemplate.js.map +1 -1
- package/dist/src/models/EmailVerificationCode.js +32 -25
- package/dist/src/models/EmailVerificationCode.js.map +1 -1
- package/dist/src/models/Event.js +15 -12
- package/dist/src/models/Event.js.map +1 -1
- package/dist/src/models/Group.js +24 -21
- package/dist/src/models/Group.js.map +1 -1
- package/dist/src/models/Image.d.ts +0 -1
- package/dist/src/models/Image.d.ts.map +1 -1
- package/dist/src/models/Image.js +12 -14
- package/dist/src/models/Image.js.map +1 -1
- package/dist/src/models/Member.d.ts.map +1 -1
- package/dist/src/models/Member.js +34 -32
- package/dist/src/models/Member.js.map +1 -1
- package/dist/src/models/MemberPlatformMembership.js +22 -16
- package/dist/src/models/MemberPlatformMembership.js.map +1 -1
- package/dist/src/models/MemberResponsibilityRecord.js +10 -8
- package/dist/src/models/MemberResponsibilityRecord.js.map +1 -1
- package/dist/src/models/MergedMember.d.ts +23 -0
- package/dist/src/models/MergedMember.d.ts.map +1 -0
- package/dist/src/models/MergedMember.js +126 -0
- package/dist/src/models/MergedMember.js.map +1 -0
- package/dist/src/models/MolliePayment.js +5 -2
- package/dist/src/models/MolliePayment.js.map +1 -1
- package/dist/src/models/MollieToken.js +14 -14
- package/dist/src/models/MollieToken.js.map +1 -1
- package/dist/src/models/OneTimeToken.js +15 -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 +42 -52
- package/dist/src/models/Order.js.map +1 -1
- package/dist/src/models/Organization.d.ts.map +1 -1
- package/dist/src/models/Organization.js +64 -66
- package/dist/src/models/Organization.js.map +1 -1
- package/dist/src/models/OrganizationRegistrationPeriod.js +8 -7
- package/dist/src/models/OrganizationRegistrationPeriod.js.map +1 -1
- package/dist/src/models/PasswordToken.js +9 -5
- package/dist/src/models/PasswordToken.js.map +1 -1
- package/dist/src/models/PayconiqPayment.js +12 -14
- package/dist/src/models/PayconiqPayment.js.map +1 -1
- package/dist/src/models/Payment.d.ts.map +1 -1
- package/dist/src/models/Payment.js +41 -35
- package/dist/src/models/Payment.js.map +1 -1
- package/dist/src/models/Platform.js +8 -10
- package/dist/src/models/Platform.js.map +1 -1
- package/dist/src/models/RegisterCode.js +12 -9
- package/dist/src/models/RegisterCode.js.map +1 -1
- package/dist/src/models/Registration.d.ts.map +1 -1
- package/dist/src/models/Registration.js +65 -80
- package/dist/src/models/Registration.js.map +1 -1
- package/dist/src/models/RegistrationPeriod.js +11 -9
- package/dist/src/models/RegistrationPeriod.js.map +1 -1
- package/dist/src/models/STCredit.js +11 -7
- package/dist/src/models/STCredit.js.map +1 -1
- package/dist/src/models/STInvoice.js +45 -45
- package/dist/src/models/STInvoice.js.map +1 -1
- package/dist/src/models/STPackage.d.ts.map +1 -1
- package/dist/src/models/STPackage.js +58 -62
- package/dist/src/models/STPackage.js.map +1 -1
- package/dist/src/models/STPendingInvoice.js +17 -16
- package/dist/src/models/STPendingInvoice.js.map +1 -1
- package/dist/src/models/StripeAccount.js +15 -14
- package/dist/src/models/StripeAccount.js.map +1 -1
- package/dist/src/models/StripeCheckoutSession.js +10 -10
- package/dist/src/models/StripeCheckoutSession.js.map +1 -1
- package/dist/src/models/StripePaymentIntent.js +10 -10
- package/dist/src/models/StripePaymentIntent.js.map +1 -1
- package/dist/src/models/Ticket.js +46 -32
- package/dist/src/models/Ticket.js.map +1 -1
- package/dist/src/models/Token.js +12 -5
- package/dist/src/models/Token.js.map +1 -1
- package/dist/src/models/UsedRegisterCode.js +15 -11
- package/dist/src/models/UsedRegisterCode.js.map +1 -1
- package/dist/src/models/User.d.ts +2 -1
- package/dist/src/models/User.d.ts.map +1 -1
- package/dist/src/models/User.js +51 -29
- package/dist/src/models/User.js.map +1 -1
- package/dist/src/models/UserPermissions.js +11 -8
- package/dist/src/models/UserPermissions.js.map +1 -1
- package/dist/src/models/Webshop.js +41 -37
- package/dist/src/models/Webshop.js.map +1 -1
- package/dist/src/models/WebshopDiscountCode.js +13 -9
- package/dist/src/models/WebshopDiscountCode.js.map +1 -1
- package/dist/src/models/addresses/City.js +9 -8
- package/dist/src/models/addresses/City.js.map +1 -1
- package/dist/src/models/addresses/PostalCode.js +7 -3
- package/dist/src/models/addresses/PostalCode.js.map +1 -1
- package/dist/src/models/addresses/Province.js +5 -2
- package/dist/src/models/addresses/Province.js.map +1 -1
- package/dist/src/models/addresses/Street.js +6 -3
- package/dist/src/models/addresses/Street.js.map +1 -1
- package/dist/src/models/index.d.ts +1 -0
- package/dist/src/models/index.d.ts.map +1 -1
- package/dist/src/models/index.js +3 -1
- package/dist/src/models/index.js.map +1 -1
- package/dist/src/structures/OrganizationServerMetaData.js +30 -27
- package/dist/src/structures/OrganizationServerMetaData.js.map +1 -1
- package/package.json +3 -3
- package/src/helpers/EmailBuilder.ts +95 -17
- package/src/helpers/MemberMerger.test.ts +719 -0
- package/src/helpers/MemberMerger.ts +497 -0
- package/src/helpers/RateLimiter.ts +1 -0
- package/src/index.ts +2 -1
- package/src/migrations/1723736282-merged-members.sql +19 -0
- package/src/models/Email.ts +9 -11
- package/src/models/EmailTemplate.ts +20 -1
- package/src/models/Member.ts +7 -8
- package/src/models/MergedMember.ts +112 -0
- package/src/models/Order.ts +11 -21
- package/src/models/Organization.ts +17 -26
- package/src/models/Payment.ts +1 -0
- package/src/models/Registration.ts +17 -45
- package/src/models/STPackage.ts +8 -16
- package/src/models/User.ts +24 -1
- 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
|
+
}
|
package/src/models/Order.ts
CHANGED
|
@@ -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,
|
|
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 {
|
|
9
|
+
import { getEmailBuilderForTemplate } from "../helpers/EmailBuilder";
|
|
10
10
|
import { WebshopCounter } from '../helpers/WebshopCounter';
|
|
11
|
-
import { BalanceItem,
|
|
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
|
|
878
|
+
const builder = await getEmailBuilderForTemplate(this.webshop.organization, {
|
|
893
879
|
recipients: [recipient],
|
|
894
|
-
|
|
895
|
-
|
|
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
|
-
|
|
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,
|
|
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 {
|
|
14
|
+
import { getEmailBuilderForTemplate } from "../helpers/EmailBuilder";
|
|
14
15
|
import { OrganizationServerMetaData } from '../structures/OrganizationServerMetaData';
|
|
15
|
-
import {
|
|
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
|
|
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
|
|
449
|
+
const builder = await getEmailBuilderForTemplate(this, {
|
|
450
|
+
replaceAll,
|
|
467
451
|
recipients,
|
|
468
|
-
|
|
469
|
-
|
|
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
|
-
|
|
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
|
package/src/models/Payment.ts
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
411
|
+
if (builder) {
|
|
412
|
+
Email.schedule(builder)
|
|
413
|
+
}
|
|
442
414
|
}
|
|
443
415
|
|
|
444
416
|
shouldIncludeStock() {
|
package/src/models/STPackage.ts
CHANGED
|
@@ -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 {
|
|
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
|
|
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
|
-
|
|
312
|
+
if (builder) {
|
|
313
|
+
Email.schedule(builder)
|
|
314
|
+
}
|
|
323
315
|
}
|
|
324
316
|
}
|
package/src/models/User.ts
CHANGED
|
@@ -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 []
|
package/src/models/index.ts
CHANGED
|
@@ -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
|
|