@stamhoofd/models 2.121.0 → 2.122.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 (241) hide show
  1. package/dist/factories/GroupFactory.d.ts.map +1 -1
  2. package/dist/factories/GroupFactory.js +1 -1
  3. package/dist/factories/GroupFactory.js.map +1 -1
  4. package/dist/factories/OrganizationFactory.d.ts +2 -1
  5. package/dist/factories/OrganizationFactory.d.ts.map +1 -1
  6. package/dist/factories/OrganizationFactory.js +9 -1
  7. package/dist/factories/OrganizationFactory.js.map +1 -1
  8. package/dist/factories/STPackageFactory.js.map +1 -1
  9. package/dist/factories/UserFactory.d.ts.map +1 -1
  10. package/dist/factories/UserFactory.js +2 -2
  11. package/dist/factories/UserFactory.js.map +1 -1
  12. package/dist/helpers/EmailBuilder.d.ts.map +1 -1
  13. package/dist/helpers/EmailBuilder.js +8 -8
  14. package/dist/helpers/EmailBuilder.js.map +1 -1
  15. package/dist/helpers/Handlebars.d.ts.map +1 -1
  16. package/dist/helpers/Handlebars.js +7 -1
  17. package/dist/helpers/Handlebars.js.map +1 -1
  18. package/dist/index.d.ts +0 -1
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +0 -1
  21. package/dist/index.js.map +1 -1
  22. package/dist/migrations/1605262045-import-postcodes.d.ts.map +1 -1
  23. package/dist/migrations/1605262045-import-postcodes.js +58 -24
  24. package/dist/migrations/1605262045-import-postcodes.js.map +1 -1
  25. package/dist/migrations/1605262046-import-postcodes-nl.d.ts.map +1 -1
  26. package/dist/migrations/1605262046-import-postcodes-nl.js +54 -17
  27. package/dist/migrations/1605262046-import-postcodes-nl.js.map +1 -1
  28. package/dist/migrations/1719567881-organization-periodId.sql +2 -0
  29. package/dist/migrations/1719567882-groups-periodId.sql +2 -0
  30. package/dist/migrations/1720080975-convert-charset.d.ts +4 -0
  31. package/dist/migrations/1720080975-convert-charset.d.ts.map +1 -0
  32. package/dist/migrations/1720080975-convert-charset.js +26 -0
  33. package/dist/migrations/1720080975-convert-charset.js.map +1 -0
  34. package/dist/migrations/1720080976-convert-charset-leads.d.ts.map +1 -1
  35. package/dist/migrations/1720080976-convert-charset-leads.js +11 -10
  36. package/dist/migrations/1720080976-convert-charset-leads.js.map +1 -1
  37. package/dist/migrations/1721400546-users-memberId.sql +2 -0
  38. package/dist/migrations/1722269236-group-waitinglist-id.sql +2 -1
  39. package/dist/migrations/1722525785-balance-item-paying-organization-id.sql +2 -0
  40. package/dist/migrations/1722525787-depending-balance-item.sql +2 -0
  41. package/dist/migrations/1722963554-registration-group-price-and-options.sql +1 -1
  42. package/dist/migrations/1723652797-payments-paying-organization-id-fk.sql +2 -0
  43. package/dist/migrations/1733317908-added-missing-organization-fk-on-registrations.sql +2 -0
  44. package/dist/migrations/1733317910-paying-organization-id-fk.sql +2 -0
  45. package/dist/migrations/1733504881-negative-invoice-id.sql +6 -0
  46. package/dist/migrations/1733994455-balance-item-status-open.d.ts +4 -0
  47. package/dist/migrations/1733994455-balance-item-status-open.d.ts.map +1 -0
  48. package/dist/migrations/1733994455-balance-item-status-open.js +28 -0
  49. package/dist/migrations/1733994455-balance-item-status-open.js.map +1 -0
  50. package/dist/migrations/1769087808-corrected-invoice-user-agent.sql +2 -0
  51. package/dist/migrations/1769087809-payments-invoice-id.sql +2 -0
  52. package/dist/migrations/1772033555-balance-item-package-id.sql +2 -0
  53. package/dist/migrations/1778796615-payments-reversing-payment-id.sql +2 -0
  54. package/dist/migrations/1779443446-transfer-fees.sql +3 -0
  55. package/dist/migrations/1779709174-used-register-code-balance-item-id.sql +5 -0
  56. package/dist/migrations/1779968328-payments-admin-user-id.sql +5 -0
  57. package/dist/migrations/1779970611-payments-refunded-amount.sql +2 -0
  58. package/dist/migrations/1779972640-balance-items-failed-at.sql +2 -0
  59. package/dist/migrations/1780328285-document-template-locked.sql +2 -0
  60. package/dist/migrations/1780328286-document-locked.sql +2 -0
  61. package/dist/migrations/1780412083-documents-set-locked.d.ts +4 -0
  62. package/dist/migrations/1780412083-documents-set-locked.d.ts.map +1 -0
  63. package/dist/migrations/1780412083-documents-set-locked.js +14 -0
  64. package/dist/migrations/1780412083-documents-set-locked.js.map +1 -0
  65. package/dist/migrations/1780928401-v1-groups-migration-data.d.ts +4 -0
  66. package/dist/migrations/1780928401-v1-groups-migration-data.d.ts.map +1 -0
  67. package/dist/migrations/1780928401-v1-groups-migration-data.js +44 -0
  68. package/dist/migrations/1780928401-v1-groups-migration-data.js.map +1 -0
  69. package/dist/models/BalanceItem.d.ts +7 -2
  70. package/dist/models/BalanceItem.d.ts.map +1 -1
  71. package/dist/models/BalanceItem.js +41 -38
  72. package/dist/models/BalanceItem.js.map +1 -1
  73. package/dist/models/CachedBalance.d.ts +6 -1
  74. package/dist/models/CachedBalance.d.ts.map +1 -1
  75. package/dist/models/CachedBalance.js +3 -2
  76. package/dist/models/CachedBalance.js.map +1 -1
  77. package/dist/models/Document.d.ts +4 -0
  78. package/dist/models/Document.d.ts.map +1 -1
  79. package/dist/models/Document.js +26 -3
  80. package/dist/models/Document.js.map +1 -1
  81. package/dist/models/DocumentTemplate.d.ts +4 -0
  82. package/dist/models/DocumentTemplate.d.ts.map +1 -1
  83. package/dist/models/DocumentTemplate.js +37 -1
  84. package/dist/models/DocumentTemplate.js.map +1 -1
  85. package/dist/models/Email.d.ts.map +1 -1
  86. package/dist/models/Email.js +1 -1
  87. package/dist/models/Email.js.map +1 -1
  88. package/dist/models/EmailVerificationCode.d.ts.map +1 -1
  89. package/dist/models/EmailVerificationCode.js +3 -13
  90. package/dist/models/EmailVerificationCode.js.map +1 -1
  91. package/dist/models/Event.d.ts +2 -1
  92. package/dist/models/Event.d.ts.map +1 -1
  93. package/dist/models/Event.js +3 -0
  94. package/dist/models/Event.js.map +1 -1
  95. package/dist/models/EventNotification.d.ts.map +1 -1
  96. package/dist/models/EventNotification.js +5 -5
  97. package/dist/models/EventNotification.js.map +1 -1
  98. package/dist/models/Invoice.d.ts +1 -0
  99. package/dist/models/Invoice.d.ts.map +1 -1
  100. package/dist/models/Invoice.js +8 -0
  101. package/dist/models/Invoice.js.map +1 -1
  102. package/dist/models/MemberPlatformMembership.d.ts.map +1 -1
  103. package/dist/models/MemberPlatformMembership.js +9 -0
  104. package/dist/models/MemberPlatformMembership.js.map +1 -1
  105. package/dist/models/Order.d.ts.map +1 -1
  106. package/dist/models/Order.js +1 -0
  107. package/dist/models/Order.js.map +1 -1
  108. package/dist/models/Organization.d.ts +23 -25
  109. package/dist/models/Organization.d.ts.map +1 -1
  110. package/dist/models/Organization.js +92 -64
  111. package/dist/models/Organization.js.map +1 -1
  112. package/dist/models/PasswordToken.d.ts +5 -1
  113. package/dist/models/PasswordToken.d.ts.map +1 -1
  114. package/dist/models/PasswordToken.js +18 -17
  115. package/dist/models/PasswordToken.js.map +1 -1
  116. package/dist/models/Payment.d.ts +21 -2
  117. package/dist/models/Payment.d.ts.map +1 -1
  118. package/dist/models/Payment.js +43 -2
  119. package/dist/models/Payment.js.map +1 -1
  120. package/dist/models/Registration.d.ts.map +1 -1
  121. package/dist/models/Registration.js +3 -3
  122. package/dist/models/Registration.js.map +1 -1
  123. package/dist/models/STCredit.d.ts +4 -0
  124. package/dist/models/STCredit.d.ts.map +1 -1
  125. package/dist/models/STCredit.js +28 -0
  126. package/dist/models/STCredit.js.map +1 -1
  127. package/dist/models/STInvoice.d.ts +7 -1
  128. package/dist/models/STInvoice.d.ts.map +1 -1
  129. package/dist/models/STInvoice.js +9 -0
  130. package/dist/models/STInvoice.js.map +1 -1
  131. package/dist/models/STPackage.d.ts +4 -0
  132. package/dist/models/STPackage.d.ts.map +1 -1
  133. package/dist/models/STPackage.js +12 -1
  134. package/dist/models/STPackage.js.map +1 -1
  135. package/dist/models/UsedRegisterCode.d.ts +9 -0
  136. package/dist/models/UsedRegisterCode.d.ts.map +1 -1
  137. package/dist/models/UsedRegisterCode.js +31 -0
  138. package/dist/models/UsedRegisterCode.js.map +1 -1
  139. package/dist/models/_relations.js +25 -0
  140. package/dist/models/_relations.js.map +1 -1
  141. package/dist/models/addresses/City.d.ts +4 -4
  142. package/dist/models/addresses/City.d.ts.map +1 -1
  143. package/dist/models/addresses/City.js +6 -6
  144. package/dist/models/addresses/City.js.map +1 -1
  145. package/dist/models/addresses/PostalCode.d.ts +2 -2
  146. package/dist/models/addresses/PostalCode.d.ts.map +1 -1
  147. package/dist/models/addresses/PostalCode.js +4 -3
  148. package/dist/models/addresses/PostalCode.js.map +1 -1
  149. package/dist/models/addresses/Street.d.ts +3 -3
  150. package/dist/models/addresses/Street.d.ts.map +1 -1
  151. package/dist/models/addresses/Street.js +4 -4
  152. package/dist/models/addresses/Street.js.map +1 -1
  153. package/dist/models/index.d.ts +1 -0
  154. package/dist/models/index.d.ts.map +1 -1
  155. package/dist/models/index.js +1 -0
  156. package/dist/models/index.js.map +1 -1
  157. package/dist/models/v1GroupMigrationData.d.ts +22 -0
  158. package/dist/models/v1GroupMigrationData.d.ts.map +1 -0
  159. package/dist/models/v1GroupMigrationData.js +48 -0
  160. package/dist/models/v1GroupMigrationData.js.map +1 -0
  161. package/package.json +32 -13
  162. package/src/factories/GroupFactory.ts +4 -6
  163. package/src/factories/OrganizationFactory.ts +12 -4
  164. package/src/factories/STPackageFactory.ts +2 -2
  165. package/src/factories/UserFactory.ts +4 -5
  166. package/src/helpers/EmailBuilder.ts +19 -28
  167. package/src/helpers/Handlebars.ts +6 -1
  168. package/src/index.ts +0 -1
  169. package/src/migrations/1605262045-import-postcodes.ts +62 -25
  170. package/src/migrations/1605262046-import-postcodes-nl.ts +58 -17
  171. package/src/migrations/1719567881-organization-periodId.sql +2 -0
  172. package/src/migrations/1719567882-groups-periodId.sql +2 -0
  173. package/src/migrations/1720080975-convert-charset.ts +34 -0
  174. package/src/migrations/1720080976-convert-charset-leads.ts +16 -13
  175. package/src/migrations/1721400546-users-memberId.sql +2 -0
  176. package/src/migrations/1722269236-group-waitinglist-id.sql +2 -1
  177. package/src/migrations/1722525785-balance-item-paying-organization-id.sql +2 -0
  178. package/src/migrations/1722525787-depending-balance-item.sql +2 -0
  179. package/src/migrations/1722963554-registration-group-price-and-options.sql +1 -1
  180. package/src/migrations/1723652797-payments-paying-organization-id-fk.sql +2 -0
  181. package/src/migrations/1733317908-added-missing-organization-fk-on-registrations.sql +2 -0
  182. package/src/migrations/1733317910-paying-organization-id-fk.sql +2 -0
  183. package/src/migrations/1733504881-negative-invoice-id.sql +6 -0
  184. package/src/migrations/1733994455-balance-item-status-open.ts +30 -0
  185. package/src/migrations/1769087808-corrected-invoice-user-agent.sql +2 -0
  186. package/src/migrations/1769087809-payments-invoice-id.sql +2 -0
  187. package/src/migrations/1772033555-balance-item-package-id.sql +2 -0
  188. package/src/migrations/1778796615-payments-reversing-payment-id.sql +2 -0
  189. package/src/migrations/1779443446-transfer-fees.sql +3 -0
  190. package/src/migrations/1779709174-used-register-code-balance-item-id.sql +5 -0
  191. package/src/migrations/1779968328-payments-admin-user-id.sql +5 -0
  192. package/src/migrations/1779970611-payments-refunded-amount.sql +2 -0
  193. package/src/migrations/1779972640-balance-items-failed-at.sql +2 -0
  194. package/src/migrations/1780328285-document-template-locked.sql +2 -0
  195. package/src/migrations/1780328286-document-locked.sql +2 -0
  196. package/src/migrations/1780412083-documents-set-locked.ts +18 -0
  197. package/src/migrations/1780928401-v1-groups-migration-data.ts +50 -0
  198. package/src/models/BalanceItem.ts +44 -43
  199. package/src/models/CachedBalance.test.ts +46 -46
  200. package/src/models/CachedBalance.ts +7 -7
  201. package/src/models/Document.ts +34 -13
  202. package/src/models/DocumentTemplate.ts +56 -17
  203. package/src/models/Email.test.ts +3 -3
  204. package/src/models/Email.ts +28 -49
  205. package/src/models/EmailVerificationCode.ts +8 -22
  206. package/src/models/Event.ts +6 -4
  207. package/src/models/EventNotification.ts +6 -6
  208. package/src/models/Invoice.ts +9 -0
  209. package/src/models/MemberPlatformMembership.test.ts +70 -0
  210. package/src/models/MemberPlatformMembership.ts +16 -12
  211. package/src/models/Order.ts +14 -26
  212. package/src/models/Organization.ts +122 -93
  213. package/src/models/PasswordToken.ts +21 -21
  214. package/src/models/Payment.ts +42 -4
  215. package/src/models/Registration.ts +3 -3
  216. package/src/models/STCredit.ts +32 -0
  217. package/src/models/STInvoice.ts +11 -5
  218. package/src/models/STPackage.ts +19 -14
  219. package/src/models/UsedRegisterCode.ts +34 -0
  220. package/src/models/_relations.ts +29 -0
  221. package/src/models/addresses/City.ts +8 -6
  222. package/src/models/addresses/PostalCode.test.ts +1 -0
  223. package/src/models/addresses/PostalCode.ts +5 -3
  224. package/src/models/addresses/Street.ts +6 -4
  225. package/src/models/index.ts +2 -0
  226. package/src/models/v1GroupMigrationData.ts +43 -0
  227. package/dist/helpers/MemberMerger.d.ts +0 -14
  228. package/dist/helpers/MemberMerger.d.ts.map +0 -1
  229. package/dist/helpers/MemberMerger.js +0 -364
  230. package/dist/helpers/MemberMerger.js.map +0 -1
  231. package/dist/migrations/1720080975-convert-charset.sql +0 -85
  232. package/dist/migrations/1723202126-member-number-index.sql +0 -2
  233. package/dist/models/OneTimeToken.d.ts +0 -38
  234. package/dist/models/OneTimeToken.d.ts.map +0 -1
  235. package/dist/models/OneTimeToken.js +0 -125
  236. package/dist/models/OneTimeToken.js.map +0 -1
  237. package/src/helpers/MemberMerger.test.ts +0 -782
  238. package/src/helpers/MemberMerger.ts +0 -577
  239. package/src/migrations/1720080975-convert-charset.sql +0 -85
  240. package/src/migrations/1723202126-member-number-index.sql +0 -2
  241. package/src/models/OneTimeToken.ts +0 -133
@@ -1,782 +0,0 @@
1
- import {
2
- Address,
3
- BooleanStatus,
4
- EmergencyContact,
5
- Gender,
6
- MemberDetails,
7
- Parent,
8
- RecordAnswer,
9
- RecordSettings,
10
- ReviewTime,
11
- ReviewTimes,
12
- TranslatedString,
13
- UitpasNumberDetails,
14
- UitpasSocialTariff,
15
- UitpasSocialTariffStatus,
16
- } from '@stamhoofd/structures';
17
- import { Country } from '@stamhoofd/types/Country';
18
- import { v4 as uuidv4 } from 'uuid';
19
- import { Member } from '../models/index.js';
20
- import { mergeMemberDetails, selectBaseMember } from './MemberMerger.js';
21
-
22
- describe('member merge', () => {
23
- describe('mergeMemberDetails', () => {
24
- describe('empty base details', () => {
25
- // #region arrange
26
- const m1 = new Member();
27
- const m2 = new Member();
28
- const d1Old = MemberDetails.create({
29
- firstName: ' ',
30
- lastName: '',
31
- birthDay: undefined,
32
- memberNumber: undefined,
33
- uitpasNumberDetails: undefined,
34
- email: ' ',
35
- phone: undefined,
36
- gender: Gender.Other,
37
- requiresFinancialSupport: undefined,
38
- dataPermissions: undefined,
39
- address: undefined,
40
- parents: [],
41
- emergencyContacts: [],
42
- reviewTimes: undefined,
43
- recordAnswers: undefined,
44
- unverifiedEmails: [],
45
- unverifiedPhones: [],
46
- unverifiedAddresses: [],
47
- notes: undefined,
48
- });
49
-
50
- const recordAnswer = RecordAnswer.create({
51
- settings: RecordSettings.create({
52
- name: TranslatedString.create('answer1'),
53
- required: true,
54
- choices: [],
55
- }),
56
- });
57
-
58
- const d2Old = MemberDetails.create({
59
- firstName: 'John',
60
- lastName: 'Doe',
61
- birthDay: new Date(1990, 1, 1),
62
- memberNumber: '123',
63
- uitpasNumberDetails: UitpasNumberDetails.create({
64
- uitpasNumber: '56',
65
- }),
66
- email: 'b7v2x@example.com',
67
- phone: '04863544',
68
- gender: Gender.Male,
69
- requiresFinancialSupport: BooleanStatus.create({ value: true }),
70
- dataPermissions: BooleanStatus.create({ value: true }),
71
- address: Address.create({
72
- city: 'Amsterdam',
73
- street: 'Mozartstraat',
74
- number: '1',
75
- postalCode: '1011AB',
76
- country: Country.Netherlands,
77
- }),
78
- parents: [Parent.create({ firstName: 'John', lastName: 'Doe' })],
79
- emergencyContacts: [
80
- EmergencyContact.create({
81
- name: 'blabla',
82
- title: 'title',
83
- phone: '04863544654',
84
- }),
85
- ],
86
- reviewTimes: ReviewTimes.create({
87
- times: [
88
- ReviewTime.create({
89
- name: 'parents',
90
- reviewedAt: new Date(2020, 1, 1),
91
- }),
92
- ReviewTime.create({
93
- name: 'details',
94
- reviewedAt: new Date(2021, 1, 1),
95
- }),
96
- ],
97
- }),
98
- recordAnswers: new Map([[recordAnswer.id, recordAnswer]]),
99
- unverifiedEmails: ['email1@test.be', 'email2@test.be'],
100
- unverifiedPhones: ['04863545', '04863546'],
101
- unverifiedAddresses: [
102
- Address.create({
103
- city: 'Amsterdam',
104
- street: 'Mozartstraat',
105
- number: '2',
106
- postalCode: '1011AB',
107
- country: Country.Netherlands,
108
- }),
109
- ],
110
- notes: 'note1',
111
- });
112
-
113
- m1.details = d1Old.clone();
114
- m2.details = d2Old.clone();
115
- // #endregion
116
-
117
- // act
118
- let d1: MemberDetails;
119
-
120
- beforeAll(() => {
121
- mergeMemberDetails(m1, m2);
122
- d1 = m1.details;
123
- });
124
-
125
- // assert
126
- test('firstName', () => {
127
- expect(d1.firstName).toBe(d2Old.firstName);
128
- });
129
-
130
- test('lastName', () => {
131
- expect(d1.lastName).toBe(d2Old.lastName);
132
- });
133
-
134
- test('memberNumber', () => {
135
- expect(d1.memberNumber).toBe(d2Old.memberNumber);
136
- });
137
-
138
- test('uitpasNumber', () => {
139
- expect(d1.uitpasNumberDetails?.uitpasNumber).toBe(d2Old.uitpasNumberDetails?.uitpasNumber);
140
- });
141
-
142
- test('email', () => {
143
- expect(d1.email).toBe(d2Old.email);
144
- expect(d1.unverifiedEmails).not.toContain(d2Old.email);
145
- });
146
-
147
- test('phone', () => {
148
- expect(d1.phone).toBe(d2Old.phone);
149
- expect(d1.unverifiedPhones).not.toContain(d2Old.phone);
150
- });
151
-
152
- test('gender', () => {
153
- expect(d1.gender).toBe(d2Old.gender);
154
- });
155
-
156
- test('birthDay', () => {
157
- expect(d1.birthDay?.getTime() ?? -1).toBe(
158
- d2Old.birthDay?.getTime() ?? -1,
159
- );
160
- });
161
-
162
- test('requires financial support', () => {
163
- expect(d1.requiresFinancialSupport?.date.getTime() ?? -1).toBe(
164
- d2Old.requiresFinancialSupport?.date.getTime() ?? -1,
165
- );
166
- });
167
-
168
- test('data permissions', () => {
169
- expect(d1.dataPermissions?.date.getTime() ?? -1).toBe(
170
- d2Old.dataPermissions?.date.getTime() ?? -1,
171
- );
172
- });
173
-
174
- test('address', () => {
175
- expect(d1.address?.id).toBe(d2Old.address?.id);
176
- });
177
-
178
- test('parents', () => {
179
- expect(d1.parents.length).toBe(d2Old.parents.length);
180
- });
181
-
182
- test('emergency contacts', () => {
183
- expect(d1.emergencyContacts.length).toBe(
184
- d2Old.emergencyContacts.length,
185
- );
186
- });
187
-
188
- test('review times', () => {
189
- expect(d1.reviewTimes.times.length).toBe(
190
- d2Old.reviewTimes.times.length,
191
- );
192
- });
193
-
194
- test('answers', () => {
195
- expect(d1.recordAnswers.size).toBe(d2Old.recordAnswers.size);
196
- });
197
-
198
- test('unverifiedEmails', () => {
199
- expect(d1.unverifiedEmails.length).toBe(d2Old.unverifiedEmails.length);
200
- });
201
-
202
- test('unverifiedPhones', () => {
203
- expect(d1.unverifiedPhones.length).toBe(d2Old.unverifiedPhones.length);
204
- });
205
-
206
- test('unverifiedAddresses', () => {
207
- expect(d1.unverifiedAddresses.length).toBe(
208
- d2Old.unverifiedAddresses.length,
209
- );
210
- });
211
-
212
- test('notes', () => {
213
- expect(d1.notes).toEqual('note1');
214
- });
215
- });
216
-
217
- describe('empty other details', () => {
218
- // #region arrange
219
- const m1 = new Member();
220
- const m2 = new Member();
221
-
222
- const recordAnswer = RecordAnswer.create({
223
- settings: RecordSettings.create({
224
- name: TranslatedString.create('answer1'),
225
- required: true,
226
- choices: [],
227
- }),
228
- });
229
-
230
- const d1Old = MemberDetails.create({
231
- firstName: 'John',
232
- lastName: 'Doe',
233
- birthDay: new Date(1990, 1, 1),
234
- memberNumber: '123',
235
- uitpasNumberDetails: UitpasNumberDetails.create({
236
- uitpasNumber: '56',
237
- }),
238
- email: 'b7v2x@example.com',
239
- phone: '04863544',
240
- gender: Gender.Male,
241
- requiresFinancialSupport: BooleanStatus.create({ value: true }),
242
- dataPermissions: BooleanStatus.create({ value: true }),
243
- address: Address.create({
244
- city: 'Amsterdam',
245
- street: 'Mozartstraat',
246
- number: '1',
247
- postalCode: '1011AB',
248
- country: Country.Netherlands,
249
- }),
250
- parents: [Parent.create({ firstName: 'John', lastName: 'Doe' })],
251
- emergencyContacts: [
252
- EmergencyContact.create({
253
- name: 'blabla',
254
- title: 'title',
255
- phone: '04863544654',
256
- }),
257
- ],
258
- reviewTimes: ReviewTimes.create({
259
- times: [
260
- ReviewTime.create({
261
- name: 'parents',
262
- reviewedAt: new Date(2020, 1, 1),
263
- }),
264
- ReviewTime.create({
265
- name: 'details',
266
- reviewedAt: new Date(2021, 1, 1),
267
- }),
268
- ],
269
- }),
270
- recordAnswers: new Map([[recordAnswer.id, recordAnswer]]),
271
- unverifiedEmails: ['email1@test.be', 'email2@test.be'],
272
- unverifiedPhones: ['04863545', '04863546'],
273
- unverifiedAddresses: [
274
- Address.create({
275
- city: 'Amsterdam',
276
- street: 'Mozartstraat',
277
- number: '2',
278
- postalCode: '1011AB',
279
- country: Country.Netherlands,
280
- }),
281
- ],
282
- notes: 'note1',
283
- });
284
-
285
- const d2Old = MemberDetails.create({
286
- firstName: ' ',
287
- lastName: '',
288
- birthDay: undefined,
289
- memberNumber: undefined,
290
- uitpasNumberDetails: undefined,
291
- email: ' ',
292
- phone: undefined,
293
- gender: Gender.Other,
294
- requiresFinancialSupport: undefined,
295
- dataPermissions: undefined,
296
- address: undefined,
297
- parents: [],
298
- emergencyContacts: [],
299
- reviewTimes: undefined,
300
- recordAnswers: undefined,
301
- unverifiedEmails: [],
302
- unverifiedPhones: [],
303
- unverifiedAddresses: [],
304
- notes: undefined,
305
- });
306
-
307
- m1.details = d1Old.clone();
308
- m2.details = d2Old.clone();
309
- // #endregion
310
-
311
- // act
312
- let d1: MemberDetails;
313
-
314
- beforeAll(() => {
315
- mergeMemberDetails(m1, m2);
316
- d1 = m1.details;
317
- });
318
-
319
- // assert
320
- test('firstName', () => {
321
- expect(d1.firstName).toBe(d1Old.firstName);
322
- });
323
-
324
- test('lastName', () => {
325
- expect(d1.lastName).toBe(d1Old.lastName);
326
- });
327
-
328
- test('memberNumber', () => {
329
- expect(d1.memberNumber).toBe(d1Old.memberNumber);
330
- });
331
-
332
- test('uitpasNumber', () => {
333
- expect(d1.uitpasNumberDetails?.uitpasNumber).toBe(d1Old.uitpasNumberDetails?.uitpasNumber);
334
- });
335
-
336
- test('email', () => {
337
- expect(d1.email).toBe(d1Old.email);
338
- expect(d1.unverifiedEmails).not.toContain(d2Old.email);
339
- });
340
-
341
- test('phone', () => {
342
- expect(d1.phone).toBe(d1Old.phone);
343
- expect(d1.unverifiedPhones).not.toContain(d2Old.phone);
344
- });
345
-
346
- test('gender', () => {
347
- expect(d1.gender).toBe(d1Old.gender);
348
- });
349
-
350
- test('birthDay', () => {
351
- expect(d1.birthDay?.getTime() ?? -1).toBe(
352
- d1Old.birthDay?.getTime() ?? -1,
353
- );
354
- });
355
-
356
- test('requires financial support', () => {
357
- expect(d1.requiresFinancialSupport?.date.getTime() ?? -1).toBe(
358
- d1Old.requiresFinancialSupport?.date.getTime() ?? -1,
359
- );
360
- });
361
-
362
- test('data permissions', () => {
363
- expect(d1.dataPermissions?.date.getTime() ?? -1).toBe(
364
- d1Old.dataPermissions?.date.getTime() ?? -1,
365
- );
366
- });
367
-
368
- test('address', () => {
369
- expect(d1.address?.id).toBe(d1Old.address?.id);
370
- });
371
-
372
- test('parents', () => {
373
- expect(d1.parents.length).toBe(d1Old.parents.length);
374
- });
375
-
376
- test('emergency contacts', () => {
377
- expect(d1.emergencyContacts.length).toBe(
378
- d1Old.emergencyContacts.length,
379
- );
380
- });
381
-
382
- test('review times', () => {
383
- expect(d1.reviewTimes.times.length).toBe(
384
- d1Old.reviewTimes.times.length,
385
- );
386
- });
387
-
388
- test('answers', () => {
389
- expect(d1.recordAnswers.size).toBe(d1Old.recordAnswers.size);
390
- });
391
-
392
- test('unverifiedEmails', () => {
393
- expect(d1.unverifiedEmails.length).toBe(d1Old.unverifiedEmails.length);
394
- });
395
-
396
- test('unverifiedPhones', () => {
397
- expect(d1.unverifiedPhones.length).toBe(d1Old.unverifiedPhones.length);
398
- });
399
-
400
- test('unverifiedAddresses', () => {
401
- expect(d1.unverifiedAddresses.length).toBe(
402
- d1Old.unverifiedAddresses.length,
403
- );
404
- });
405
-
406
- test('notes', () => {
407
- expect(d1.notes).toEqual('note1');
408
- });
409
- });
410
-
411
- describe('complete base and other details', () => {
412
- // #region arrange
413
- const m1 = new Member();
414
- const m2 = new Member();
415
-
416
- const recordAnswer1 = RecordAnswer.create({
417
- settings: RecordSettings.create({
418
- name: TranslatedString.create('answer1'),
419
- required: true,
420
- choices: [],
421
- }),
422
- });
423
-
424
- const recordAnswer1b = recordAnswer1.clone();
425
- recordAnswer1b.date = new Date(1990, 1, 1);
426
-
427
- const recordAnswer2 = RecordAnswer.create({
428
- settings: RecordSettings.create({
429
- name: TranslatedString.create('answer2'),
430
- required: true,
431
- choices: [],
432
- }),
433
- });
434
-
435
- // will not changed because cloned
436
- const oldParent1 = Parent.create({
437
- firstName: 'John',
438
- lastName: 'Doe',
439
- email: 'john@test.be',
440
- phone: '04111111',
441
- });
442
-
443
- const parent1Alt = Parent.create({
444
- firstName: 'John',
445
- lastName: 'Doe',
446
- email: 'oldJohn@test.be',
447
- phone: '0499999',
448
- address: Address.create({
449
- street: 'John street',
450
- number: '5',
451
- city: 'Amsterdam',
452
- postalCode: '1011AB',
453
- country: Country.Belgium,
454
- }),
455
- });
456
-
457
- const d1Old = MemberDetails.create({
458
- firstName: 'Jöhn',
459
- lastName: 'Dôe',
460
- birthDay: new Date(1990, 1, 1),
461
- memberNumber: '123',
462
- uitpasNumberDetails: UitpasNumberDetails.create({
463
- uitpasNumber: '56',
464
- socialTariff: UitpasSocialTariff.create({
465
- status: UitpasSocialTariffStatus.Unknown,
466
- updatedAt: new Date(2000, 0, 1),
467
- }),
468
- }),
469
- email: 'b7v2x@example.com',
470
- phone: '04863544',
471
- gender: Gender.Male,
472
- requiresFinancialSupport: BooleanStatus.create({
473
- value: true,
474
- date: new Date(2021, 1, 1),
475
- }),
476
- dataPermissions: BooleanStatus.create({
477
- value: true,
478
- date: new Date(2020, 1, 1),
479
- }),
480
- address: Address.create({
481
- city: 'Amsterdam',
482
- street: 'Mozartstraat',
483
- number: '1',
484
- postalCode: '1011AB',
485
- country: Country.Netherlands,
486
- }),
487
- parents: [oldParent1],
488
- emergencyContacts: [
489
- EmergencyContact.create({
490
- name: 'blabla',
491
- title: 'title',
492
- phone: '04863544654',
493
- }),
494
- EmergencyContact.create({
495
- name: 'blabla2',
496
- title: 'title2',
497
- phone: '04863544654',
498
- }),
499
- ],
500
- reviewTimes: ReviewTimes.create({
501
- times: [
502
- ReviewTime.create({
503
- name: 'parents',
504
- reviewedAt: new Date(2020, 1, 1),
505
- }),
506
- ReviewTime.create({
507
- name: 'details',
508
- reviewedAt: new Date(2021, 1, 1),
509
- }),
510
- ],
511
- }),
512
- recordAnswers: new Map([[recordAnswer1.id, recordAnswer1]]),
513
- unverifiedEmails: ['email1@test.be', 'email2@test.be'],
514
- unverifiedPhones: ['04863545', '04863546'],
515
- unverifiedAddresses: [
516
- Address.create({
517
- city: 'Amsterdam',
518
- street: 'Mozartstraat',
519
- number: '2',
520
- postalCode: '1011AB',
521
- country: Country.Netherlands,
522
- }),
523
- ],
524
- notes: 'note1',
525
- });
526
-
527
- const d2Old = MemberDetails.create({
528
- firstName: 'John',
529
- lastName: 'Doe',
530
- birthDay: new Date(2000, 1, 1),
531
- memberNumber: '123456',
532
- uitpasNumberDetails: UitpasNumberDetails.create({
533
- uitpasNumber: '567',
534
- socialTariff: UitpasSocialTariff.create({
535
- status: UitpasSocialTariffStatus.Active,
536
- updatedAt: new Date(2000, 0, 2),
537
- }),
538
- }),
539
- email: 'other@example.com',
540
- phone: '048635449',
541
- gender: Gender.Female,
542
- // earlier date
543
- requiresFinancialSupport: BooleanStatus.create({
544
- value: false,
545
- date: new Date(2020, 1, 1),
546
- }),
547
- // older date
548
- dataPermissions: BooleanStatus.create({
549
- value: false,
550
- date: new Date(2021, 1, 1),
551
- }),
552
- address: Address.create({
553
- city: 'Amsterdam',
554
- street: 'Mozartstraat',
555
- number: '5',
556
- postalCode: '1011AB',
557
- country: Country.Netherlands,
558
- }),
559
- parents: [
560
- parent1Alt,
561
- Parent.create({ firstName: 'John', lastName: 'Other' }),
562
- ],
563
- emergencyContacts: [
564
- EmergencyContact.create({
565
- name: 'other emergency contact',
566
- title: 'title',
567
- phone: '04863544654',
568
- }),
569
- EmergencyContact.create({
570
- name: 'blabla',
571
- title: 'title',
572
- phone: '04863544654',
573
- }),
574
- ],
575
- reviewTimes: ReviewTimes.create({
576
- times: [
577
- ReviewTime.create({
578
- name: 'parents',
579
- reviewedAt: new Date(2019, 1, 1),
580
- }),
581
- ReviewTime.create({
582
- name: 'details',
583
- reviewedAt: new Date(2023, 1, 1),
584
- }),
585
- ],
586
- }),
587
- recordAnswers: new Map([
588
- [recordAnswer2.id, recordAnswer2],
589
- [recordAnswer1.id, recordAnswer1],
590
- [recordAnswer1b.id, recordAnswer1b],
591
- ]),
592
- unverifiedEmails: ['otherUnverivied@test.be'],
593
- unverifiedPhones: ['0486354599', '0486354699'],
594
- unverifiedAddresses: [
595
- Address.create({
596
- city: 'Amsterdam',
597
- street: 'AndereStraat',
598
- number: '100',
599
- postalCode: '1011AB',
600
- country: Country.Netherlands,
601
- }),
602
- ],
603
- notes: 'note2',
604
- });
605
-
606
- m1.details = d1Old.clone();
607
- m2.details = d2Old.clone();
608
- // #endregion
609
-
610
- // act
611
- let d1: MemberDetails;
612
- let parent1: Parent;
613
-
614
- beforeAll(() => {
615
- mergeMemberDetails(m1, m2);
616
- d1 = m1.details;
617
- parent1 = d1.parents.find(p => p.id === oldParent1.id)!;
618
- });
619
-
620
- // assert
621
- test('firstName', () => {
622
- expect(d1.firstName).toBe(d1Old.firstName);
623
- });
624
-
625
- test('lastName', () => {
626
- expect(d1.lastName).toBe(d1Old.lastName);
627
- });
628
-
629
- test('memberNumber', () => {
630
- expect(d1.memberNumber).toBe(d1Old.memberNumber);
631
- });
632
-
633
- test('uitpasNumber', () => {
634
- expect(d1.uitpasNumberDetails?.uitpasNumber).toBe(d2Old.uitpasNumberDetails?.uitpasNumber);
635
- });
636
-
637
- test('email', () => {
638
- expect(d1.email).toBe(d2Old.email);
639
- expect(d1.alternativeEmails).toContain(d1Old.email);
640
- expect(d1.unverifiedEmails).not.toContain(d1Old.email);
641
- });
642
-
643
- test('phone', () => {
644
- expect(d1.phone).toBe(d2Old.phone);
645
- expect(d1.unverifiedPhones).toContain(d1Old.phone);
646
- });
647
-
648
- test('gender', () => {
649
- expect(d1.gender).toBe(d2Old.gender);
650
- });
651
-
652
- test('birthDay', () => {
653
- expect(d1.birthDay?.getTime() ?? -1).toBe(
654
- d2Old.birthDay?.getTime() ?? -1,
655
- );
656
- });
657
-
658
- test('requires financial support', () => {
659
- expect(d1.requiresFinancialSupport?.date.getTime() ?? -1).toBe(
660
- d1Old.requiresFinancialSupport?.date.getTime() ?? -1,
661
- );
662
- });
663
-
664
- test('data permissions', () => {
665
- expect(d1.dataPermissions?.date.getTime() ?? -1).toBe(
666
- d2Old.dataPermissions?.date.getTime() ?? -1,
667
- );
668
- });
669
-
670
- test('address', () => {
671
- expect(d1.address?.id).toBe(d2Old.address?.id);
672
- expect(d1.unverifiedAddresses.map(a => a.id)).toContain(
673
- d1Old.address?.id,
674
- );
675
- });
676
-
677
- test('parents', () => {
678
- expect(d1.parents.length).toBe(2);
679
- expect(parent1.firstName).toBe(parent1Alt.firstName);
680
- expect(parent1.lastName).toBe(parent1Alt.lastName);
681
- expect(parent1.email).toBe(parent1Alt.email?.toLowerCase());
682
- expect(parent1.phone).toBe(parent1Alt.phone);
683
- expect(parent1.address?.id).toBe(parent1Alt.address?.id);
684
- expect(d1.unverifiedPhones).toContain(oldParent1.phone);
685
- expect(parent1.alternativeEmails).toContain(oldParent1.email!.toLocaleLowerCase());
686
- });
687
-
688
- test('emergency contacts', () => {
689
- expect(d1.emergencyContacts.length).toBe(3);
690
- });
691
-
692
- test('review times', () => {
693
- expect(d1.reviewTimes.times.length).toBe(2);
694
- });
695
-
696
- test('answers', () => {
697
- expect(d1.recordAnswers.size).toBe(3);
698
- });
699
-
700
- test('unverifiedEmails', () => {
701
- expect(d1.unverifiedEmails.sort()).toEqual([
702
- 'email1@test.be',
703
- 'email2@test.be',
704
- 'otherunverivied@test.be',
705
- ].sort());
706
- });
707
-
708
- test('unverifiedPhones', () => {
709
- expect(d1.unverifiedPhones.length).toBe(6);
710
- });
711
-
712
- test('unverifiedAddresses', () => {
713
- // expect(d1.unverifiedAddresses.length).toBe(3);
714
-
715
- // Should be combination of unverified addresses + address of the second member (which coulnd't be merged)
716
- const addressIds = d1.unverifiedAddresses.map(a => a.id);
717
- expect(addressIds.sort()).toEqual([
718
- d1Old.address!.id,
719
- d1Old.unverifiedAddresses[0].id,
720
- d2Old.unverifiedAddresses[0].id,
721
- ].sort());
722
- });
723
-
724
- test('notes', () => {
725
- expect(d1.notes).toEqual('note1\nnote2');
726
- });
727
- });
728
- });
729
-
730
- test('select base member should return last created member', () => {
731
- const m1 = new Member();
732
- m1.createdAt = new Date(2020, 0, 1);
733
- m1.id = uuidv4();
734
- const m2 = new Member();
735
- m2.createdAt = new Date(2021, 0, 1);
736
- m2.id = uuidv4();
737
- const m3 = new Member();
738
- m3.createdAt = new Date(2022, 0, 1);
739
- m3.id = uuidv4();
740
-
741
- const members = [m1, m3, m2];
742
-
743
- const { base, others } = selectBaseMember(members);
744
-
745
- expect(base.id).toBe(m3.id);
746
-
747
- expect(others).toHaveLength(2);
748
- const otherIds = others.map(m => m.id);
749
- expect(otherIds).toContain(m1.id);
750
- expect(otherIds).toContain(m2.id);
751
- });
752
-
753
- describe('Regressions', () => {
754
- /**
755
- * tests STA-460
756
- */
757
- test('Members with same email addreses do not get the email added as alternative email', () => {
758
- const m1 = new Member();
759
- const m2 = new Member();
760
-
761
- const base = MemberDetails.create({
762
- email: 'example@example.com',
763
- firstName: 'John',
764
- lastName: 'Doe',
765
- });
766
-
767
- const other = MemberDetails.create({
768
- email: 'example@example.com',
769
- firstName: 'John',
770
- lastName: 'Doe',
771
- });
772
-
773
- m1.details = base.clone();
774
- m2.details = other.clone();
775
-
776
- mergeMemberDetails(m1, m2);
777
-
778
- expect(m1.details.email).toBe('example@example.com');
779
- expect(m1.details.alternativeEmails).toEqual([]);
780
- });
781
- });
782
- });