@stamhoofd/models 2.39.0 → 2.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (352) hide show
  1. package/dist/src/factories/AddressFactory.d.ts +3 -4
  2. package/dist/src/factories/AddressFactory.d.ts.map +1 -1
  3. package/dist/src/factories/AddressFactory.js +13 -13
  4. package/dist/src/factories/EmergencyContactFactory.d.ts +3 -4
  5. package/dist/src/factories/EmergencyContactFactory.d.ts.map +1 -1
  6. package/dist/src/factories/EmergencyContactFactory.js +27 -27
  7. package/dist/src/factories/EmergencyContactFactory.js.map +1 -1
  8. package/dist/src/factories/GroupFactory.d.ts +4 -4
  9. package/dist/src/factories/GroupFactory.d.ts.map +1 -1
  10. package/dist/src/factories/GroupFactory.js +8 -8
  11. package/dist/src/factories/GroupFactory.js.map +1 -1
  12. package/dist/src/factories/MemberFactory.d.ts +4 -4
  13. package/dist/src/factories/MemberFactory.d.ts.map +1 -1
  14. package/dist/src/factories/MemberFactory.js +17 -17
  15. package/dist/src/factories/MemberFactory.js.map +1 -1
  16. package/dist/src/factories/OrganizationFactory.d.ts +4 -4
  17. package/dist/src/factories/OrganizationFactory.js +8 -8
  18. package/dist/src/factories/OrganizationFactory.js.map +1 -1
  19. package/dist/src/factories/ParentFactory.d.ts +1 -1
  20. package/dist/src/factories/ParentFactory.js +19 -19
  21. package/dist/src/factories/ParentFactory.js.map +1 -1
  22. package/dist/src/factories/RecordFactory.d.ts +2 -3
  23. package/dist/src/factories/RecordFactory.d.ts.map +1 -1
  24. package/dist/src/factories/RecordFactory.js +1 -1
  25. package/dist/src/factories/RecordFactory.js.map +1 -1
  26. package/dist/src/factories/RegisterCodeFactory.d.ts +2 -2
  27. package/dist/src/factories/RegisterCodeFactory.d.ts.map +1 -1
  28. package/dist/src/factories/RegisterCodeFactory.js +2 -2
  29. package/dist/src/factories/RegistrationFactory.d.ts +3 -3
  30. package/dist/src/factories/RegistrationFactory.d.ts.map +1 -1
  31. package/dist/src/factories/RegistrationFactory.js.map +1 -1
  32. package/dist/src/factories/RegistrationPeriodFactory.d.ts +2 -2
  33. package/dist/src/factories/RegistrationPeriodFactory.js.map +1 -1
  34. package/dist/src/factories/UserFactory.d.ts +3 -3
  35. package/dist/src/factories/UserFactory.d.ts.map +1 -1
  36. package/dist/src/factories/UserFactory.js +3 -3
  37. package/dist/src/factories/UserFactory.js.map +1 -1
  38. package/dist/src/factories/WebshopFactory.d.ts +4 -4
  39. package/dist/src/factories/WebshopFactory.d.ts.map +1 -1
  40. package/dist/src/factories/WebshopFactory.js +1 -1
  41. package/dist/src/factories/WebshopFactory.js.map +1 -1
  42. package/dist/src/helpers/DNSValidator.d.ts +1 -1
  43. package/dist/src/helpers/DNSValidator.d.ts.map +1 -1
  44. package/dist/src/helpers/DNSValidator.js +33 -33
  45. package/dist/src/helpers/DNSValidator.js.map +1 -1
  46. package/dist/src/helpers/EmailBuilder.d.ts +10 -10
  47. package/dist/src/helpers/EmailBuilder.d.ts.map +1 -1
  48. package/dist/src/helpers/EmailBuilder.js +34 -34
  49. package/dist/src/helpers/EmailBuilder.js.map +1 -1
  50. package/dist/src/helpers/GroupBuilder.d.ts.map +1 -1
  51. package/dist/src/helpers/GroupBuilder.js +57 -57
  52. package/dist/src/helpers/GroupBuilder.js.map +1 -1
  53. package/dist/src/helpers/Handlebars.d.ts.map +1 -1
  54. package/dist/src/helpers/Handlebars.js +29 -29
  55. package/dist/src/helpers/Handlebars.js.map +1 -1
  56. package/dist/src/helpers/MemberMerger.d.ts +1 -1
  57. package/dist/src/helpers/MemberMerger.d.ts.map +1 -1
  58. package/dist/src/helpers/MemberMerger.js +33 -33
  59. package/dist/src/helpers/MemberMerger.js.map +1 -1
  60. package/dist/src/helpers/MemberMerger.test.js +194 -194
  61. package/dist/src/helpers/MemberMerger.test.js.map +1 -1
  62. package/dist/src/helpers/RateLimiter.d.ts.map +1 -1
  63. package/dist/src/helpers/RateLimiter.js +2 -2
  64. package/dist/src/helpers/RateLimiter.js.map +1 -1
  65. package/dist/src/helpers/SetupStepsUpdater.d.ts +22 -0
  66. package/dist/src/helpers/SetupStepsUpdater.d.ts.map +1 -0
  67. package/dist/src/helpers/SetupStepsUpdater.js +255 -0
  68. package/dist/src/helpers/SetupStepsUpdater.js.map +1 -0
  69. package/dist/src/helpers/WebshopCounter.d.ts +1 -1
  70. package/dist/src/helpers/WebshopCounter.d.ts.map +1 -1
  71. package/dist/src/helpers/WebshopCounter.js +1 -1
  72. package/dist/src/helpers/WebshopCounter.js.map +1 -1
  73. package/dist/src/helpers/WebshopCounter.test.js +6 -6
  74. package/dist/src/helpers/WebshopCounter.test.js.map +1 -1
  75. package/dist/src/index.d.ts +20 -19
  76. package/dist/src/index.d.ts.map +1 -1
  77. package/dist/src/index.js +1 -0
  78. package/dist/src/index.js.map +1 -1
  79. package/dist/src/migrations/1605262045-import-postcodes.js +12 -12
  80. package/dist/src/migrations/1605262046-import-postcodes-nl.js +10 -10
  81. package/dist/src/models/BalanceItem.d.ts.map +1 -1
  82. package/dist/src/models/BalanceItem.js +37 -37
  83. package/dist/src/models/BalanceItem.js.map +1 -1
  84. package/dist/src/models/BalanceItemPayment.d.ts.map +1 -1
  85. package/dist/src/models/BalanceItemPayment.js +13 -13
  86. package/dist/src/models/BalanceItemPayment.js.map +1 -1
  87. package/dist/src/models/BuckarooPayment.d.ts +1 -1
  88. package/dist/src/models/BuckarooPayment.d.ts.map +1 -1
  89. package/dist/src/models/BuckarooPayment.js +5 -5
  90. package/dist/src/models/BuckarooPayment.js.map +1 -1
  91. package/dist/src/models/CachedOutstandingBalance.d.ts.map +1 -1
  92. package/dist/src/models/CachedOutstandingBalance.js +37 -37
  93. package/dist/src/models/CachedOutstandingBalance.js.map +1 -1
  94. package/dist/src/models/Document.d.ts +4 -4
  95. package/dist/src/models/Document.d.ts.map +1 -1
  96. package/dist/src/models/Document.js +27 -27
  97. package/dist/src/models/Document.js.map +1 -1
  98. package/dist/src/models/DocumentTemplate.d.ts +4 -4
  99. package/dist/src/models/DocumentTemplate.d.ts.map +1 -1
  100. package/dist/src/models/DocumentTemplate.js +72 -72
  101. package/dist/src/models/DocumentTemplate.js.map +1 -1
  102. package/dist/src/models/Email.d.ts.map +1 -1
  103. package/dist/src/models/Email.js +63 -64
  104. package/dist/src/models/Email.js.map +1 -1
  105. package/dist/src/models/EmailRecipient.d.ts.map +1 -1
  106. package/dist/src/models/EmailRecipient.js +20 -20
  107. package/dist/src/models/EmailRecipient.js.map +1 -1
  108. package/dist/src/models/EmailTemplate.d.ts +3 -3
  109. package/dist/src/models/EmailTemplate.d.ts.map +1 -1
  110. package/dist/src/models/EmailTemplate.js +16 -16
  111. package/dist/src/models/EmailTemplate.js.map +1 -1
  112. package/dist/src/models/EmailVerificationCode.d.ts +2 -2
  113. package/dist/src/models/EmailVerificationCode.d.ts.map +1 -1
  114. package/dist/src/models/EmailVerificationCode.js +57 -55
  115. package/dist/src/models/EmailVerificationCode.js.map +1 -1
  116. package/dist/src/models/Event.d.ts +2 -2
  117. package/dist/src/models/Event.d.ts.map +1 -1
  118. package/dist/src/models/Event.js +15 -15
  119. package/dist/src/models/Event.js.map +1 -1
  120. package/dist/src/models/Group.d.ts +3 -1
  121. package/dist/src/models/Group.d.ts.map +1 -1
  122. package/dist/src/models/Group.js +46 -35
  123. package/dist/src/models/Group.js.map +1 -1
  124. package/dist/src/models/Image.d.ts +1 -1
  125. package/dist/src/models/Image.d.ts.map +1 -1
  126. package/dist/src/models/Image.js +26 -26
  127. package/dist/src/models/Image.js.map +1 -1
  128. package/dist/src/models/Member.d.ts +8 -8
  129. package/dist/src/models/Member.d.ts.map +1 -1
  130. package/dist/src/models/Member.js +60 -60
  131. package/dist/src/models/Member.js.map +1 -1
  132. package/dist/src/models/MemberPlatformMembership.d.ts +3 -3
  133. package/dist/src/models/MemberPlatformMembership.d.ts.map +1 -1
  134. package/dist/src/models/MemberPlatformMembership.js +26 -26
  135. package/dist/src/models/MemberPlatformMembership.js.map +1 -1
  136. package/dist/src/models/MemberResponsibilityRecord.d.ts.map +1 -1
  137. package/dist/src/models/MemberResponsibilityRecord.js +13 -13
  138. package/dist/src/models/MemberResponsibilityRecord.js.map +1 -1
  139. package/dist/src/models/MergedMember.d.ts +3 -3
  140. package/dist/src/models/MergedMember.d.ts.map +1 -1
  141. package/dist/src/models/MergedMember.js +19 -19
  142. package/dist/src/models/MergedMember.js.map +1 -1
  143. package/dist/src/models/MolliePayment.d.ts +1 -1
  144. package/dist/src/models/MolliePayment.d.ts.map +1 -1
  145. package/dist/src/models/MolliePayment.js +5 -5
  146. package/dist/src/models/MolliePayment.js.map +1 -1
  147. package/dist/src/models/MollieToken.d.ts.map +1 -1
  148. package/dist/src/models/MollieToken.js +60 -60
  149. package/dist/src/models/MollieToken.js.map +1 -1
  150. package/dist/src/models/OneTimeToken.d.ts +2 -2
  151. package/dist/src/models/OneTimeToken.d.ts.map +1 -1
  152. package/dist/src/models/OneTimeToken.js +13 -13
  153. package/dist/src/models/OneTimeToken.js.map +1 -1
  154. package/dist/src/models/Order.d.ts +1 -1
  155. package/dist/src/models/Order.d.ts.map +1 -1
  156. package/dist/src/models/Order.js +70 -70
  157. package/dist/src/models/Order.js.map +1 -1
  158. package/dist/src/models/Organization.d.ts +5 -5
  159. package/dist/src/models/Organization.d.ts.map +1 -1
  160. package/dist/src/models/Organization.js +127 -127
  161. package/dist/src/models/Organization.js.map +1 -1
  162. package/dist/src/models/OrganizationRegistrationPeriod.d.ts.map +1 -1
  163. package/dist/src/models/OrganizationRegistrationPeriod.js +15 -15
  164. package/dist/src/models/OrganizationRegistrationPeriod.js.map +1 -1
  165. package/dist/src/models/PasswordToken.d.ts +3 -3
  166. package/dist/src/models/PasswordToken.d.ts.map +1 -1
  167. package/dist/src/models/PasswordToken.js +17 -17
  168. package/dist/src/models/PasswordToken.js.map +1 -1
  169. package/dist/src/models/PayconiqPayment.d.ts +1 -1
  170. package/dist/src/models/PayconiqPayment.d.ts.map +1 -1
  171. package/dist/src/models/PayconiqPayment.js +49 -49
  172. package/dist/src/models/PayconiqPayment.js.map +1 -1
  173. package/dist/src/models/Payment.d.ts +3 -3
  174. package/dist/src/models/Payment.d.ts.map +1 -1
  175. package/dist/src/models/Payment.js +36 -36
  176. package/dist/src/models/Payment.js.map +1 -1
  177. package/dist/src/models/Platform.d.ts +2 -2
  178. package/dist/src/models/Platform.d.ts.map +1 -1
  179. package/dist/src/models/Platform.js +8 -8
  180. package/dist/src/models/Platform.js.map +1 -1
  181. package/dist/src/models/RegisterCode.d.ts +1 -1
  182. package/dist/src/models/RegisterCode.d.ts.map +1 -1
  183. package/dist/src/models/RegisterCode.js +11 -11
  184. package/dist/src/models/RegisterCode.js.map +1 -1
  185. package/dist/src/models/Registration.d.ts +1 -1
  186. package/dist/src/models/Registration.d.ts.map +1 -1
  187. package/dist/src/models/Registration.js +88 -88
  188. package/dist/src/models/Registration.js.map +1 -1
  189. package/dist/src/models/RegistrationPeriod.d.ts.map +1 -1
  190. package/dist/src/models/RegistrationPeriod.js +12 -12
  191. package/dist/src/models/RegistrationPeriod.js.map +1 -1
  192. package/dist/src/models/STCredit.d.ts +1 -1
  193. package/dist/src/models/STCredit.d.ts.map +1 -1
  194. package/dist/src/models/STCredit.js +12 -12
  195. package/dist/src/models/STCredit.js.map +1 -1
  196. package/dist/src/models/STInvoice.d.ts +1 -1
  197. package/dist/src/models/STInvoice.d.ts.map +1 -1
  198. package/dist/src/models/STInvoice.js +16 -16
  199. package/dist/src/models/STInvoice.js.map +1 -1
  200. package/dist/src/models/STPackage.d.ts +1 -1
  201. package/dist/src/models/STPackage.d.ts.map +1 -1
  202. package/dist/src/models/STPackage.js +39 -39
  203. package/dist/src/models/STPackage.js.map +1 -1
  204. package/dist/src/models/STPendingInvoice.d.ts +1 -1
  205. package/dist/src/models/STPendingInvoice.d.ts.map +1 -1
  206. package/dist/src/models/STPendingInvoice.js +11 -11
  207. package/dist/src/models/STPendingInvoice.js.map +1 -1
  208. package/dist/src/models/StripeAccount.d.ts.map +1 -1
  209. package/dist/src/models/StripeAccount.js +13 -13
  210. package/dist/src/models/StripeAccount.js.map +1 -1
  211. package/dist/src/models/StripeCheckoutSession.d.ts +1 -1
  212. package/dist/src/models/StripeCheckoutSession.d.ts.map +1 -1
  213. package/dist/src/models/StripeCheckoutSession.js +7 -7
  214. package/dist/src/models/StripeCheckoutSession.js.map +1 -1
  215. package/dist/src/models/StripePaymentIntent.d.ts +1 -1
  216. package/dist/src/models/StripePaymentIntent.d.ts.map +1 -1
  217. package/dist/src/models/StripePaymentIntent.js +7 -7
  218. package/dist/src/models/StripePaymentIntent.js.map +1 -1
  219. package/dist/src/models/Ticket.d.ts +2 -2
  220. package/dist/src/models/Ticket.d.ts.map +1 -1
  221. package/dist/src/models/Ticket.js +23 -23
  222. package/dist/src/models/Ticket.js.map +1 -1
  223. package/dist/src/models/Token.d.ts +3 -3
  224. package/dist/src/models/Token.d.ts.map +1 -1
  225. package/dist/src/models/Token.js +27 -27
  226. package/dist/src/models/Token.js.map +1 -1
  227. package/dist/src/models/Token.test.js +11 -11
  228. package/dist/src/models/UsedRegisterCode.d.ts +1 -1
  229. package/dist/src/models/UsedRegisterCode.d.ts.map +1 -1
  230. package/dist/src/models/UsedRegisterCode.js +10 -10
  231. package/dist/src/models/UsedRegisterCode.js.map +1 -1
  232. package/dist/src/models/User.d.ts +4 -4
  233. package/dist/src/models/User.d.ts.map +1 -1
  234. package/dist/src/models/User.js +53 -51
  235. package/dist/src/models/User.js.map +1 -1
  236. package/dist/src/models/UserPermissions.d.ts +3 -3
  237. package/dist/src/models/UserPermissions.d.ts.map +1 -1
  238. package/dist/src/models/UserPermissions.js +12 -12
  239. package/dist/src/models/UserPermissions.js.map +1 -1
  240. package/dist/src/models/Webshop.d.ts +1 -1
  241. package/dist/src/models/Webshop.d.ts.map +1 -1
  242. package/dist/src/models/Webshop.js +23 -23
  243. package/dist/src/models/Webshop.js.map +1 -1
  244. package/dist/src/models/WebshopDiscountCode.d.ts +1 -1
  245. package/dist/src/models/WebshopDiscountCode.d.ts.map +1 -1
  246. package/dist/src/models/WebshopDiscountCode.js +16 -16
  247. package/dist/src/models/WebshopDiscountCode.js.map +1 -1
  248. package/dist/src/models/addresses/City.d.ts.map +1 -1
  249. package/dist/src/models/addresses/City.js +9 -9
  250. package/dist/src/models/addresses/City.js.map +1 -1
  251. package/dist/src/models/addresses/PostalCode.d.ts.map +1 -1
  252. package/dist/src/models/addresses/PostalCode.js +11 -11
  253. package/dist/src/models/addresses/PostalCode.js.map +1 -1
  254. package/dist/src/models/addresses/PostalCode.test.js +22 -22
  255. package/dist/src/models/addresses/PostalCode.test.js.map +1 -1
  256. package/dist/src/models/addresses/Province.d.ts.map +1 -1
  257. package/dist/src/models/addresses/Province.js +5 -5
  258. package/dist/src/models/addresses/Province.js.map +1 -1
  259. package/dist/src/models/addresses/Street.d.ts.map +1 -1
  260. package/dist/src/models/addresses/Street.js +6 -6
  261. package/dist/src/models/addresses/Street.js.map +1 -1
  262. package/dist/src/models/index.d.ts +46 -46
  263. package/dist/src/models/index.d.ts.map +1 -1
  264. package/dist/src/models/index.js +0 -1
  265. package/dist/src/models/index.js.map +1 -1
  266. package/dist/src/structures/OrganizationServerMetaData.d.ts.map +1 -1
  267. package/dist/src/structures/OrganizationServerMetaData.js +4 -4
  268. package/dist/src/structures/OrganizationServerMetaData.js.map +1 -1
  269. package/dist/tests/jest.global.setup.d.ts.map +1 -1
  270. package/dist/tests/jest.global.setup.js +15 -13
  271. package/dist/tests/jest.global.setup.js.map +1 -1
  272. package/dist/tests/jest.setup.js +3 -1
  273. package/dist/tests/jest.setup.js.map +1 -1
  274. package/dist/tsconfig.tsbuildinfo +1 -0
  275. package/package.json +3 -3
  276. package/src/factories/AddressFactory.ts +17 -17
  277. package/src/factories/EmergencyContactFactory.ts +30 -31
  278. package/src/factories/GroupFactory.ts +30 -30
  279. package/src/factories/MemberFactory.ts +41 -38
  280. package/src/factories/OrganizationFactory.ts +15 -15
  281. package/src/factories/ParentFactory.ts +24 -24
  282. package/src/factories/RecordFactory.ts +5 -4
  283. package/src/factories/RegisterCodeFactory.ts +7 -7
  284. package/src/factories/RegistrationFactory.ts +16 -16
  285. package/src/factories/RegistrationPeriodFactory.ts +5 -5
  286. package/src/factories/UserFactory.ts +20 -19
  287. package/src/factories/WebshopFactory.ts +14 -14
  288. package/src/helpers/DNSValidator.ts +89 -84
  289. package/src/helpers/EmailBuilder.ts +141 -135
  290. package/src/helpers/GroupBuilder.ts +181 -181
  291. package/src/helpers/Handlebars.ts +57 -54
  292. package/src/helpers/MemberMerger.test.ts +702 -702
  293. package/src/helpers/MemberMerger.ts +83 -77
  294. package/src/helpers/RateLimiter.ts +25 -27
  295. package/src/helpers/SetupStepsUpdater.ts +402 -0
  296. package/src/helpers/WebshopCounter.test.ts +12 -12
  297. package/src/helpers/WebshopCounter.ts +20 -19
  298. package/src/index.ts +20 -19
  299. package/src/migrations/1605262045-import-postcodes.ts +59 -63
  300. package/src/migrations/1605262046-import-postcodes-nl.ts +41 -43
  301. package/src/models/BalanceItem.ts +173 -172
  302. package/src/models/BalanceItemPayment.ts +32 -33
  303. package/src/models/BuckarooPayment.ts +7 -7
  304. package/src/models/CachedOutstandingBalance.ts +98 -99
  305. package/src/models/Document.ts +90 -87
  306. package/src/models/DocumentTemplate.ts +207 -198
  307. package/src/models/Email.ts +198 -200
  308. package/src/models/EmailRecipient.ts +38 -39
  309. package/src/models/EmailTemplate.ts +36 -37
  310. package/src/models/EmailVerificationCode.ts +146 -142
  311. package/src/models/Event.ts +53 -53
  312. package/src/models/Group.ts +136 -123
  313. package/src/models/Image.ts +48 -48
  314. package/src/models/Member.ts +277 -275
  315. package/src/models/MemberPlatformMembership.ts +71 -71
  316. package/src/models/MemberResponsibilityRecord.ts +32 -32
  317. package/src/models/MergedMember.ts +77 -77
  318. package/src/models/MolliePayment.ts +7 -7
  319. package/src/models/MollieToken.ts +131 -126
  320. package/src/models/OneTimeToken.ts +40 -39
  321. package/src/models/Order.ts +379 -372
  322. package/src/models/Organization.ts +332 -325
  323. package/src/models/OrganizationRegistrationPeriod.ts +50 -50
  324. package/src/models/PasswordToken.ts +42 -42
  325. package/src/models/PayconiqPayment.ts +80 -76
  326. package/src/models/Payment.ts +86 -86
  327. package/src/models/Platform.ts +21 -22
  328. package/src/models/RegisterCode.ts +26 -26
  329. package/src/models/Registration.ts +167 -168
  330. package/src/models/RegistrationPeriod.ts +29 -29
  331. package/src/models/STCredit.ts +24 -25
  332. package/src/models/STInvoice.ts +34 -34
  333. package/src/models/STPackage.ts +143 -136
  334. package/src/models/STPendingInvoice.ts +26 -26
  335. package/src/models/StripeAccount.ts +27 -27
  336. package/src/models/StripeCheckoutSession.ts +10 -10
  337. package/src/models/StripePaymentIntent.ts +10 -10
  338. package/src/models/Ticket.ts +51 -52
  339. package/src/models/Token.test.ts +13 -13
  340. package/src/models/Token.ts +64 -63
  341. package/src/models/UsedRegisterCode.ts +20 -21
  342. package/src/models/User.ts +148 -144
  343. package/src/models/UserPermissions.ts +25 -28
  344. package/src/models/Webshop.ts +53 -53
  345. package/src/models/WebshopDiscountCode.ts +33 -33
  346. package/src/models/addresses/City.ts +12 -12
  347. package/src/models/addresses/PostalCode.test.ts +68 -69
  348. package/src/models/addresses/PostalCode.ts +57 -57
  349. package/src/models/addresses/Province.ts +8 -8
  350. package/src/models/addresses/Street.ts +10 -12
  351. package/src/models/index.ts +54 -55
  352. package/src/structures/OrganizationServerMetaData.ts +36 -36
@@ -10,710 +10,710 @@ import {
10
10
  RecordSettings,
11
11
  ReviewTime,
12
12
  ReviewTimes,
13
- } from "@stamhoofd/structures";
14
- import { v4 as uuidv4 } from "uuid";
15
- import { Member } from "../models";
16
- import { mergeMemberDetails, selectBaseMember } from "./MemberMerger";
17
-
18
- describe("member merge", () => {
19
- describe("mergeMemberDetails", () => {
20
- describe("empty base details", () => {
21
- //#region arrange
22
- const m1 = new Member();
23
- const m2 = new Member();
24
- const d1Old = MemberDetails.create({
25
- firstName: " ",
26
- lastName: "",
27
- birthDay: undefined,
28
- memberNumber: undefined,
29
- uitpasNumber: undefined,
30
- email: " ",
31
- phone: undefined,
32
- gender: Gender.Other,
33
- requiresFinancialSupport: undefined,
34
- dataPermissions: undefined,
35
- address: undefined,
36
- parents: [],
37
- emergencyContacts: [],
38
- reviewTimes: undefined,
39
- recordAnswers: undefined,
40
- unverifiedEmails: [],
41
- unverifiedPhones: [],
42
- unverifiedAddresses: [],
43
- notes: undefined,
44
- });
45
-
46
- const recordAnswer = RecordAnswer.create({
47
- settings: RecordSettings.create({
48
- name: "answer1",
49
- required: true,
50
- choices: [],
51
- }),
52
- });
53
-
54
- const d2Old = MemberDetails.create({
55
- firstName: "John",
56
- lastName: "Doe",
57
- birthDay: new Date(1990, 1, 1),
58
- memberNumber: "123",
59
- uitpasNumber: "56",
60
- email: "b7v2X@example.com",
61
- phone: "04863544",
62
- gender: Gender.Male,
63
- requiresFinancialSupport: BooleanStatus.create({ value: true }),
64
- dataPermissions: BooleanStatus.create({ value: true }),
65
- address: Address.create({
66
- city: "Amsterdam",
67
- street: "Mozartstraat",
68
- number: "1",
69
- postalCode: "1011AB",
70
- country: Country.Netherlands,
71
- }),
72
- parents: [Parent.create({ firstName: "John", lastName: "Doe" })],
73
- emergencyContacts: [
74
- EmergencyContact.create({
75
- name: "blabla",
76
- title: "title",
77
- phone: "04863544654",
78
- }),
79
- ],
80
- reviewTimes: ReviewTimes.create({
81
- times: [
82
- ReviewTime.create({
83
- name: "parents",
84
- reviewedAt: new Date(2020, 1, 1),
85
- }),
86
- ReviewTime.create({
87
- name: "details",
88
- reviewedAt: new Date(2021, 1, 1),
89
- }),
90
- ],
91
- }),
92
- recordAnswers: new Map([[recordAnswer.id, recordAnswer]]),
93
- unverifiedEmails: ["email1@test.be", "email2@test.be"],
94
- unverifiedPhones: ["04863545", "04863546"],
95
- unverifiedAddresses: [
96
- Address.create({
97
- city: "Amsterdam",
98
- street: "Mozartstraat",
99
- number: "2",
100
- postalCode: "1011AB",
101
- country: Country.Netherlands,
102
- }),
103
- ],
104
- notes: "note1",
105
- });
106
-
107
- m1.details = d1Old.clone();
108
- m2.details = d2Old.clone();
109
- //#endregion
110
-
111
- // act
112
- let d1: MemberDetails;
113
-
114
- beforeAll(() => {
115
- mergeMemberDetails(m1, m2);
116
- d1 = m1.details;
117
- });
118
-
119
- // assert
120
- test("firstName", () => {
121
- expect(d1.firstName).toBe(d2Old.firstName);
122
- });
123
-
124
- test("lastName", () => {
125
- expect(d1.lastName).toBe(d2Old.lastName);
126
- });
127
-
128
- test("memberNumber", () => {
129
- expect(d1.memberNumber).toBe(d2Old.memberNumber);
130
- });
131
-
132
- test("uitpasNumber", () => {
133
- expect(d1.uitpasNumber).toBe(d2Old.uitpasNumber);
134
- });
135
-
136
- test("email", () => {
137
- expect(d1.email).toBe(d2Old.email);
138
- expect(d1.unverifiedEmails).not.toContain(d2Old.email);
139
- });
140
-
141
- test("phone", () => {
142
- expect(d1.phone).toBe(d2Old.phone);
143
- expect(d1.unverifiedPhones).not.toContain(d2Old.phone);
144
- });
145
-
146
- test("gender", () => {
147
- expect(d1.gender).toBe(d2Old.gender);
148
- });
149
-
150
- test("birthDay", () => {
151
- expect(d1.birthDay?.getTime() ?? -1).toBe(
152
- d2Old.birthDay?.getTime() ?? -1
153
- );
154
- });
155
-
156
- test("requires financial support", () => {
157
- expect(d1.requiresFinancialSupport?.date.getTime() ?? -1).toBe(
158
- d2Old.requiresFinancialSupport?.date.getTime() ?? -1
159
- );
160
- });
161
-
162
- test("data permissions", () => {
163
- expect(d1.dataPermissions?.date.getTime() ?? -1).toBe(
164
- d2Old.dataPermissions?.date.getTime() ?? -1
165
- );
166
- });
167
-
168
- test("address", () => {
169
- expect(d1.address?.id).toBe(d2Old.address?.id);
170
- });
171
-
172
- test("parents", () => {
173
- expect(d1.parents.length).toBe(d2Old.parents.length);
174
- });
175
-
176
- test("emergency contacts", () => {
177
- expect(d1.emergencyContacts.length).toBe(
178
- d2Old.emergencyContacts.length
179
- );
180
- });
181
-
182
- test("review times", () => {
183
- expect(d1.reviewTimes.times.length).toBe(
184
- d2Old.reviewTimes.times.length
185
- );
186
- });
187
-
188
- test("answers", () => {
189
- expect(d1.recordAnswers.size).toBe(d2Old.recordAnswers.size);
190
- });
191
-
192
- test("unverifiedEmails", () => {
193
- expect(d1.unverifiedEmails.length).toBe(d2Old.unverifiedEmails.length);
194
- });
195
-
196
- test("unverifiedPhones", () => {
197
- expect(d1.unverifiedPhones.length).toBe(d2Old.unverifiedPhones.length);
198
- });
199
-
200
- test("unverifiedAddresses", () => {
201
- expect(d1.unverifiedAddresses.length).toBe(
202
- d2Old.unverifiedAddresses.length
203
- );
204
- });
205
-
206
- test("notes", () => {
207
- expect(d1.notes).toEqual("note1");
208
- });
13
+ } from '@stamhoofd/structures';
14
+ import { v4 as uuidv4 } from 'uuid';
15
+ import { Member } from '../models';
16
+ import { mergeMemberDetails, selectBaseMember } from './MemberMerger';
17
+
18
+ describe('member merge', () => {
19
+ describe('mergeMemberDetails', () => {
20
+ describe('empty base details', () => {
21
+ // #region arrange
22
+ const m1 = new Member();
23
+ const m2 = new Member();
24
+ const d1Old = MemberDetails.create({
25
+ firstName: ' ',
26
+ lastName: '',
27
+ birthDay: undefined,
28
+ memberNumber: undefined,
29
+ uitpasNumber: undefined,
30
+ email: ' ',
31
+ phone: undefined,
32
+ gender: Gender.Other,
33
+ requiresFinancialSupport: undefined,
34
+ dataPermissions: undefined,
35
+ address: undefined,
36
+ parents: [],
37
+ emergencyContacts: [],
38
+ reviewTimes: undefined,
39
+ recordAnswers: undefined,
40
+ unverifiedEmails: [],
41
+ unverifiedPhones: [],
42
+ unverifiedAddresses: [],
43
+ notes: undefined,
44
+ });
45
+
46
+ const recordAnswer = RecordAnswer.create({
47
+ settings: RecordSettings.create({
48
+ name: 'answer1',
49
+ required: true,
50
+ choices: [],
51
+ }),
52
+ });
53
+
54
+ const d2Old = MemberDetails.create({
55
+ firstName: 'John',
56
+ lastName: 'Doe',
57
+ birthDay: new Date(1990, 1, 1),
58
+ memberNumber: '123',
59
+ uitpasNumber: '56',
60
+ email: 'b7v2X@example.com',
61
+ phone: '04863544',
62
+ gender: Gender.Male,
63
+ requiresFinancialSupport: BooleanStatus.create({ value: true }),
64
+ dataPermissions: BooleanStatus.create({ value: true }),
65
+ address: Address.create({
66
+ city: 'Amsterdam',
67
+ street: 'Mozartstraat',
68
+ number: '1',
69
+ postalCode: '1011AB',
70
+ country: Country.Netherlands,
71
+ }),
72
+ parents: [Parent.create({ firstName: 'John', lastName: 'Doe' })],
73
+ emergencyContacts: [
74
+ EmergencyContact.create({
75
+ name: 'blabla',
76
+ title: 'title',
77
+ phone: '04863544654',
78
+ }),
79
+ ],
80
+ reviewTimes: ReviewTimes.create({
81
+ times: [
82
+ ReviewTime.create({
83
+ name: 'parents',
84
+ reviewedAt: new Date(2020, 1, 1),
85
+ }),
86
+ ReviewTime.create({
87
+ name: 'details',
88
+ reviewedAt: new Date(2021, 1, 1),
89
+ }),
90
+ ],
91
+ }),
92
+ recordAnswers: new Map([[recordAnswer.id, recordAnswer]]),
93
+ unverifiedEmails: ['email1@test.be', 'email2@test.be'],
94
+ unverifiedPhones: ['04863545', '04863546'],
95
+ unverifiedAddresses: [
96
+ Address.create({
97
+ city: 'Amsterdam',
98
+ street: 'Mozartstraat',
99
+ number: '2',
100
+ postalCode: '1011AB',
101
+ country: Country.Netherlands,
102
+ }),
103
+ ],
104
+ notes: 'note1',
105
+ });
106
+
107
+ m1.details = d1Old.clone();
108
+ m2.details = d2Old.clone();
109
+ // #endregion
110
+
111
+ // act
112
+ let d1: MemberDetails;
113
+
114
+ beforeAll(() => {
115
+ mergeMemberDetails(m1, m2);
116
+ d1 = m1.details;
117
+ });
118
+
119
+ // assert
120
+ test('firstName', () => {
121
+ expect(d1.firstName).toBe(d2Old.firstName);
122
+ });
123
+
124
+ test('lastName', () => {
125
+ expect(d1.lastName).toBe(d2Old.lastName);
126
+ });
127
+
128
+ test('memberNumber', () => {
129
+ expect(d1.memberNumber).toBe(d2Old.memberNumber);
130
+ });
131
+
132
+ test('uitpasNumber', () => {
133
+ expect(d1.uitpasNumber).toBe(d2Old.uitpasNumber);
134
+ });
135
+
136
+ test('email', () => {
137
+ expect(d1.email).toBe(d2Old.email);
138
+ expect(d1.unverifiedEmails).not.toContain(d2Old.email);
139
+ });
140
+
141
+ test('phone', () => {
142
+ expect(d1.phone).toBe(d2Old.phone);
143
+ expect(d1.unverifiedPhones).not.toContain(d2Old.phone);
144
+ });
145
+
146
+ test('gender', () => {
147
+ expect(d1.gender).toBe(d2Old.gender);
148
+ });
149
+
150
+ test('birthDay', () => {
151
+ expect(d1.birthDay?.getTime() ?? -1).toBe(
152
+ d2Old.birthDay?.getTime() ?? -1,
153
+ );
154
+ });
155
+
156
+ test('requires financial support', () => {
157
+ expect(d1.requiresFinancialSupport?.date.getTime() ?? -1).toBe(
158
+ d2Old.requiresFinancialSupport?.date.getTime() ?? -1,
159
+ );
160
+ });
161
+
162
+ test('data permissions', () => {
163
+ expect(d1.dataPermissions?.date.getTime() ?? -1).toBe(
164
+ d2Old.dataPermissions?.date.getTime() ?? -1,
165
+ );
166
+ });
167
+
168
+ test('address', () => {
169
+ expect(d1.address?.id).toBe(d2Old.address?.id);
170
+ });
171
+
172
+ test('parents', () => {
173
+ expect(d1.parents.length).toBe(d2Old.parents.length);
174
+ });
175
+
176
+ test('emergency contacts', () => {
177
+ expect(d1.emergencyContacts.length).toBe(
178
+ d2Old.emergencyContacts.length,
179
+ );
180
+ });
181
+
182
+ test('review times', () => {
183
+ expect(d1.reviewTimes.times.length).toBe(
184
+ d2Old.reviewTimes.times.length,
185
+ );
186
+ });
187
+
188
+ test('answers', () => {
189
+ expect(d1.recordAnswers.size).toBe(d2Old.recordAnswers.size);
190
+ });
191
+
192
+ test('unverifiedEmails', () => {
193
+ expect(d1.unverifiedEmails.length).toBe(d2Old.unverifiedEmails.length);
194
+ });
195
+
196
+ test('unverifiedPhones', () => {
197
+ expect(d1.unverifiedPhones.length).toBe(d2Old.unverifiedPhones.length);
198
+ });
199
+
200
+ test('unverifiedAddresses', () => {
201
+ expect(d1.unverifiedAddresses.length).toBe(
202
+ d2Old.unverifiedAddresses.length,
203
+ );
204
+ });
205
+
206
+ test('notes', () => {
207
+ expect(d1.notes).toEqual('note1');
208
+ });
209
+ });
210
+
211
+ describe('empty other details', () => {
212
+ // #region arrange
213
+ const m1 = new Member();
214
+ const m2 = new Member();
215
+
216
+ const recordAnswer = RecordAnswer.create({
217
+ settings: RecordSettings.create({
218
+ name: 'answer1',
219
+ required: true,
220
+ choices: [],
221
+ }),
222
+ });
223
+
224
+ const d1Old = MemberDetails.create({
225
+ firstName: 'John',
226
+ lastName: 'Doe',
227
+ birthDay: new Date(1990, 1, 1),
228
+ memberNumber: '123',
229
+ uitpasNumber: '56',
230
+ email: 'b7v2X@example.com',
231
+ phone: '04863544',
232
+ gender: Gender.Male,
233
+ requiresFinancialSupport: BooleanStatus.create({ value: true }),
234
+ dataPermissions: BooleanStatus.create({ value: true }),
235
+ address: Address.create({
236
+ city: 'Amsterdam',
237
+ street: 'Mozartstraat',
238
+ number: '1',
239
+ postalCode: '1011AB',
240
+ country: Country.Netherlands,
241
+ }),
242
+ parents: [Parent.create({ firstName: 'John', lastName: 'Doe' })],
243
+ emergencyContacts: [
244
+ EmergencyContact.create({
245
+ name: 'blabla',
246
+ title: 'title',
247
+ phone: '04863544654',
248
+ }),
249
+ ],
250
+ reviewTimes: ReviewTimes.create({
251
+ times: [
252
+ ReviewTime.create({
253
+ name: 'parents',
254
+ reviewedAt: new Date(2020, 1, 1),
255
+ }),
256
+ ReviewTime.create({
257
+ name: 'details',
258
+ reviewedAt: new Date(2021, 1, 1),
259
+ }),
260
+ ],
261
+ }),
262
+ recordAnswers: new Map([[recordAnswer.id, recordAnswer]]),
263
+ unverifiedEmails: ['email1@test.be', 'email2@test.be'],
264
+ unverifiedPhones: ['04863545', '04863546'],
265
+ unverifiedAddresses: [
266
+ Address.create({
267
+ city: 'Amsterdam',
268
+ street: 'Mozartstraat',
269
+ number: '2',
270
+ postalCode: '1011AB',
271
+ country: Country.Netherlands,
272
+ }),
273
+ ],
274
+ notes: 'note1',
275
+ });
276
+
277
+ const d2Old = MemberDetails.create({
278
+ firstName: ' ',
279
+ lastName: '',
280
+ birthDay: undefined,
281
+ memberNumber: undefined,
282
+ uitpasNumber: undefined,
283
+ email: ' ',
284
+ phone: undefined,
285
+ gender: Gender.Other,
286
+ requiresFinancialSupport: undefined,
287
+ dataPermissions: undefined,
288
+ address: undefined,
289
+ parents: [],
290
+ emergencyContacts: [],
291
+ reviewTimes: undefined,
292
+ recordAnswers: undefined,
293
+ unverifiedEmails: [],
294
+ unverifiedPhones: [],
295
+ unverifiedAddresses: [],
296
+ notes: undefined,
297
+ });
298
+
299
+ m1.details = d1Old.clone();
300
+ m2.details = d2Old.clone();
301
+ // #endregion
302
+
303
+ // act
304
+ let d1: MemberDetails;
305
+
306
+ beforeAll(() => {
307
+ mergeMemberDetails(m1, m2);
308
+ d1 = m1.details;
309
+ });
310
+
311
+ // assert
312
+ test('firstName', () => {
313
+ expect(d1.firstName).toBe(d1Old.firstName);
314
+ });
315
+
316
+ test('lastName', () => {
317
+ expect(d1.lastName).toBe(d1Old.lastName);
318
+ });
319
+
320
+ test('memberNumber', () => {
321
+ expect(d1.memberNumber).toBe(d1Old.memberNumber);
322
+ });
323
+
324
+ test('uitpasNumber', () => {
325
+ expect(d1.uitpasNumber).toBe(d1Old.uitpasNumber);
326
+ });
327
+
328
+ test('email', () => {
329
+ expect(d1.email).toBe(d1Old.email);
330
+ expect(d1.unverifiedEmails).not.toContain(d2Old.email);
331
+ });
332
+
333
+ test('phone', () => {
334
+ expect(d1.phone).toBe(d1Old.phone);
335
+ expect(d1.unverifiedPhones).not.toContain(d2Old.phone);
336
+ });
337
+
338
+ test('gender', () => {
339
+ expect(d1.gender).toBe(d1Old.gender);
340
+ });
341
+
342
+ test('birthDay', () => {
343
+ expect(d1.birthDay?.getTime() ?? -1).toBe(
344
+ d1Old.birthDay?.getTime() ?? -1,
345
+ );
346
+ });
347
+
348
+ test('requires financial support', () => {
349
+ expect(d1.requiresFinancialSupport?.date.getTime() ?? -1).toBe(
350
+ d1Old.requiresFinancialSupport?.date.getTime() ?? -1,
351
+ );
352
+ });
353
+
354
+ test('data permissions', () => {
355
+ expect(d1.dataPermissions?.date.getTime() ?? -1).toBe(
356
+ d1Old.dataPermissions?.date.getTime() ?? -1,
357
+ );
358
+ });
359
+
360
+ test('address', () => {
361
+ expect(d1.address?.id).toBe(d1Old.address?.id);
362
+ });
363
+
364
+ test('parents', () => {
365
+ expect(d1.parents.length).toBe(d1Old.parents.length);
366
+ });
367
+
368
+ test('emergency contacts', () => {
369
+ expect(d1.emergencyContacts.length).toBe(
370
+ d1Old.emergencyContacts.length,
371
+ );
372
+ });
373
+
374
+ test('review times', () => {
375
+ expect(d1.reviewTimes.times.length).toBe(
376
+ d1Old.reviewTimes.times.length,
377
+ );
378
+ });
379
+
380
+ test('answers', () => {
381
+ expect(d1.recordAnswers.size).toBe(d1Old.recordAnswers.size);
382
+ });
383
+
384
+ test('unverifiedEmails', () => {
385
+ expect(d1.unverifiedEmails.length).toBe(d1Old.unverifiedEmails.length);
386
+ });
387
+
388
+ test('unverifiedPhones', () => {
389
+ expect(d1.unverifiedPhones.length).toBe(d1Old.unverifiedPhones.length);
390
+ });
391
+
392
+ test('unverifiedAddresses', () => {
393
+ expect(d1.unverifiedAddresses.length).toBe(
394
+ d1Old.unverifiedAddresses.length,
395
+ );
396
+ });
397
+
398
+ test('notes', () => {
399
+ expect(d1.notes).toEqual('note1');
400
+ });
401
+ });
402
+
403
+ describe('complete base and other details', () => {
404
+ // #region arrange
405
+ const m1 = new Member();
406
+ const m2 = new Member();
407
+
408
+ const recordAnswer1 = RecordAnswer.create({
409
+ settings: RecordSettings.create({
410
+ name: 'answer1',
411
+ required: true,
412
+ choices: [],
413
+ }),
414
+ });
415
+
416
+ const recordAnswer1b = recordAnswer1.clone();
417
+ recordAnswer1b.date = new Date(1990, 1, 1);
418
+
419
+ const recordAnswer2 = RecordAnswer.create({
420
+ settings: RecordSettings.create({
421
+ name: 'answer2',
422
+ required: true,
423
+ choices: [],
424
+ }),
425
+ });
426
+
427
+ // will not changed because cloned
428
+ const oldParent1 = Parent.create({
429
+ firstName: 'John',
430
+ lastName: 'Doe',
431
+ email: 'john@test.be',
432
+ phone: '04111111',
433
+ });
434
+
435
+ const parent1Alt = Parent.create({
436
+ firstName: 'John',
437
+ lastName: 'Doe',
438
+ email: 'oldJohn@test.be',
439
+ phone: '0499999',
440
+ address: Address.create({
441
+ street: 'john street',
442
+ number: '5',
443
+ city: 'Amsterdam',
444
+ postalCode: '1011AB',
445
+ country: Country.Belgium,
446
+ }),
447
+ });
448
+
449
+ const d1Old = MemberDetails.create({
450
+ firstName: 'John',
451
+ lastName: 'Doe',
452
+ birthDay: new Date(1990, 1, 1),
453
+ memberNumber: '123',
454
+ uitpasNumber: '56',
455
+ email: 'b7v2X@example.com',
456
+ phone: '04863544',
457
+ gender: Gender.Male,
458
+ requiresFinancialSupport: BooleanStatus.create({
459
+ value: true,
460
+ date: new Date(2021, 1, 1),
461
+ }),
462
+ dataPermissions: BooleanStatus.create({
463
+ value: true,
464
+ date: new Date(2020, 1, 1),
465
+ }),
466
+ address: Address.create({
467
+ city: 'Amsterdam',
468
+ street: 'Mozartstraat',
469
+ number: '1',
470
+ postalCode: '1011AB',
471
+ country: Country.Netherlands,
472
+ }),
473
+ parents: [oldParent1],
474
+ emergencyContacts: [
475
+ EmergencyContact.create({
476
+ name: 'blabla',
477
+ title: 'title',
478
+ phone: '04863544654',
479
+ }),
480
+ EmergencyContact.create({
481
+ name: 'blabla2',
482
+ title: 'title2',
483
+ phone: '04863544654',
484
+ }),
485
+ ],
486
+ reviewTimes: ReviewTimes.create({
487
+ times: [
488
+ ReviewTime.create({
489
+ name: 'parents',
490
+ reviewedAt: new Date(2020, 1, 1),
491
+ }),
492
+ ReviewTime.create({
493
+ name: 'details',
494
+ reviewedAt: new Date(2021, 1, 1),
495
+ }),
496
+ ],
497
+ }),
498
+ recordAnswers: new Map([[recordAnswer1.id, recordAnswer1]]),
499
+ unverifiedEmails: ['email1@test.be', 'email2@test.be'],
500
+ unverifiedPhones: ['04863545', '04863546'],
501
+ unverifiedAddresses: [
502
+ Address.create({
503
+ city: 'Amsterdam',
504
+ street: 'Mozartstraat',
505
+ number: '2',
506
+ postalCode: '1011AB',
507
+ country: Country.Netherlands,
508
+ }),
509
+ ],
510
+ notes: 'note1',
511
+ });
512
+
513
+ const d2Old = MemberDetails.create({
514
+ firstName: 'John',
515
+ lastName: 'Doe',
516
+ birthDay: new Date(2000, 1, 1),
517
+ memberNumber: '123456',
518
+ uitpasNumber: '567',
519
+ email: 'other@example.com',
520
+ phone: '048635449',
521
+ gender: Gender.Female,
522
+ // earlier date
523
+ requiresFinancialSupport: BooleanStatus.create({
524
+ value: false,
525
+ date: new Date(2020, 1, 1),
526
+ }),
527
+ // older date
528
+ dataPermissions: BooleanStatus.create({
529
+ value: false,
530
+ date: new Date(2021, 1, 1),
531
+ }),
532
+ address: Address.create({
533
+ city: 'Amsterdam',
534
+ street: 'Mozartstraat',
535
+ number: '5',
536
+ postalCode: '1011AB',
537
+ country: Country.Netherlands,
538
+ }),
539
+ parents: [
540
+ parent1Alt,
541
+ Parent.create({ firstName: 'John', lastName: 'Other' }),
542
+ ],
543
+ emergencyContacts: [
544
+ EmergencyContact.create({
545
+ name: 'other emergency contact',
546
+ title: 'title',
547
+ phone: '04863544654',
548
+ }),
549
+ EmergencyContact.create({
550
+ name: 'blabla',
551
+ title: 'title',
552
+ phone: '04863544654',
553
+ }),
554
+ ],
555
+ reviewTimes: ReviewTimes.create({
556
+ times: [
557
+ ReviewTime.create({
558
+ name: 'parents',
559
+ reviewedAt: new Date(2019, 1, 1),
560
+ }),
561
+ ReviewTime.create({
562
+ name: 'details',
563
+ reviewedAt: new Date(2023, 1, 1),
564
+ }),
565
+ ],
566
+ }),
567
+ recordAnswers: new Map([
568
+ [recordAnswer2.id, recordAnswer2],
569
+ [recordAnswer1.id, recordAnswer1],
570
+ [recordAnswer1b.id, recordAnswer1b],
571
+ ]),
572
+ unverifiedEmails: ['otherUnverivied@test.be'],
573
+ unverifiedPhones: ['0486354599', '0486354699'],
574
+ unverifiedAddresses: [
575
+ Address.create({
576
+ city: 'Amsterdam',
577
+ street: 'AndereStraat',
578
+ number: '100',
579
+ postalCode: '1011AB',
580
+ country: Country.Netherlands,
581
+ }),
582
+ ],
583
+ notes: 'note2',
584
+ });
585
+
586
+ m1.details = d1Old.clone();
587
+ m2.details = d2Old.clone();
588
+ // #endregion
589
+
590
+ // act
591
+ let d1: MemberDetails;
592
+ let parent1: Parent;
593
+
594
+ beforeAll(() => {
595
+ mergeMemberDetails(m1, m2);
596
+ d1 = m1.details;
597
+ parent1 = d1.parents.find(p => p.id === oldParent1.id)!;
598
+ });
599
+
600
+ // assert
601
+ test('firstName', () => {
602
+ expect(d1.firstName).toBe(d1Old.firstName);
603
+ });
604
+
605
+ test('lastName', () => {
606
+ expect(d1.lastName).toBe(d1Old.lastName);
607
+ });
608
+
609
+ test('memberNumber', () => {
610
+ expect(d1.memberNumber).toBe(d1Old.memberNumber);
611
+ });
612
+
613
+ test('uitpasNumber', () => {
614
+ expect(d1.uitpasNumber).toBe(d1Old.uitpasNumber);
615
+ });
616
+
617
+ test('email', () => {
618
+ expect(d1.email).toBe(d1Old.email);
619
+ expect(d1.unverifiedEmails).toContain(d2Old.email);
620
+ });
621
+
622
+ test('phone', () => {
623
+ expect(d1.phone).toBe(d1Old.phone);
624
+ expect(d1.unverifiedPhones).toContain(d2Old.phone);
625
+ });
626
+
627
+ test('gender', () => {
628
+ expect(d1.gender).toBe(d1Old.gender);
629
+ });
630
+
631
+ test('birthDay', () => {
632
+ expect(d1.birthDay?.getTime() ?? -1).toBe(
633
+ d1Old.birthDay?.getTime() ?? -1,
634
+ );
635
+ });
636
+
637
+ test('requires financial support', () => {
638
+ expect(d1.requiresFinancialSupport?.date.getTime() ?? -1).toBe(
639
+ d1Old.requiresFinancialSupport?.date.getTime() ?? -1,
640
+ );
641
+ });
642
+
643
+ test('data permissions', () => {
644
+ expect(d1.dataPermissions?.date.getTime() ?? -1).toBe(
645
+ d2Old.dataPermissions?.date.getTime() ?? -1,
646
+ );
647
+ });
648
+
649
+ test('address', () => {
650
+ expect(d1.address?.id).toBe(d1Old.address?.id);
651
+ expect(d1.unverifiedAddresses.map(a => a.id)).toContain(
652
+ d2Old.address?.id,
653
+ );
654
+ });
655
+
656
+ test('parents', () => {
657
+ expect(d1.parents.length).toBe(2);
658
+ expect(parent1.firstName).toBe(parent1Alt.firstName);
659
+ expect(parent1.lastName).toBe(parent1Alt.lastName);
660
+ expect(parent1.email).toBe(oldParent1.email);
661
+ expect(parent1.phone).toBe(oldParent1.phone);
662
+ expect(parent1.address?.id).toBe(parent1Alt.address?.id);
663
+ expect(d1.unverifiedPhones).toContain(parent1Alt.phone);
664
+ expect(parent1.alternativeEmails).toContain(parent1Alt.email);
665
+ });
666
+
667
+ test('emergency contacts', () => {
668
+ expect(d1.emergencyContacts.length).toBe(3);
669
+ });
670
+
671
+ test('review times', () => {
672
+ expect(d1.reviewTimes.times.length).toBe(2);
673
+ });
674
+
675
+ test('answers', () => {
676
+ expect(d1.recordAnswers.size).toBe(3);
677
+ });
678
+
679
+ test('unverifiedEmails', () => {
680
+ expect(d1.unverifiedEmails.length).toBe(4);
681
+ });
682
+
683
+ test('unverifiedPhones', () => {
684
+ expect(d1.unverifiedPhones.length).toBe(6);
685
+ });
686
+
687
+ test('unverifiedAddresses', () => {
688
+ expect(d1.unverifiedAddresses.length).toBe(3);
689
+ });
690
+
691
+ test('notes', () => {
692
+ expect(d1.notes).toEqual('note1\nnote2');
693
+ });
694
+ });
209
695
  });
210
696
 
211
- describe("empty other details", () => {
212
- //#region arrange
213
- const m1 = new Member();
214
- const m2 = new Member();
215
-
216
- const recordAnswer = RecordAnswer.create({
217
- settings: RecordSettings.create({
218
- name: "answer1",
219
- required: true,
220
- choices: [],
221
- }),
222
- });
223
-
224
- const d1Old = MemberDetails.create({
225
- firstName: "John",
226
- lastName: "Doe",
227
- birthDay: new Date(1990, 1, 1),
228
- memberNumber: "123",
229
- uitpasNumber: "56",
230
- email: "b7v2X@example.com",
231
- phone: "04863544",
232
- gender: Gender.Male,
233
- requiresFinancialSupport: BooleanStatus.create({ value: true }),
234
- dataPermissions: BooleanStatus.create({ value: true }),
235
- address: Address.create({
236
- city: "Amsterdam",
237
- street: "Mozartstraat",
238
- number: "1",
239
- postalCode: "1011AB",
240
- country: Country.Netherlands,
241
- }),
242
- parents: [Parent.create({ firstName: "John", lastName: "Doe" })],
243
- emergencyContacts: [
244
- EmergencyContact.create({
245
- name: "blabla",
246
- title: "title",
247
- phone: "04863544654",
248
- }),
249
- ],
250
- reviewTimes: ReviewTimes.create({
251
- times: [
252
- ReviewTime.create({
253
- name: "parents",
254
- reviewedAt: new Date(2020, 1, 1),
255
- }),
256
- ReviewTime.create({
257
- name: "details",
258
- reviewedAt: new Date(2021, 1, 1),
259
- }),
260
- ],
261
- }),
262
- recordAnswers: new Map([[recordAnswer.id, recordAnswer]]),
263
- unverifiedEmails: ["email1@test.be", "email2@test.be"],
264
- unverifiedPhones: ["04863545", "04863546"],
265
- unverifiedAddresses: [
266
- Address.create({
267
- city: "Amsterdam",
268
- street: "Mozartstraat",
269
- number: "2",
270
- postalCode: "1011AB",
271
- country: Country.Netherlands,
272
- }),
273
- ],
274
- notes: "note1",
275
- });
276
-
277
- const d2Old = MemberDetails.create({
278
- firstName: " ",
279
- lastName: "",
280
- birthDay: undefined,
281
- memberNumber: undefined,
282
- uitpasNumber: undefined,
283
- email: " ",
284
- phone: undefined,
285
- gender: Gender.Other,
286
- requiresFinancialSupport: undefined,
287
- dataPermissions: undefined,
288
- address: undefined,
289
- parents: [],
290
- emergencyContacts: [],
291
- reviewTimes: undefined,
292
- recordAnswers: undefined,
293
- unverifiedEmails: [],
294
- unverifiedPhones: [],
295
- unverifiedAddresses: [],
296
- notes: undefined,
297
- });
298
-
299
- m1.details = d1Old.clone();
300
- m2.details = d2Old.clone();
301
- //#endregion
302
-
303
- // act
304
- let d1: MemberDetails;
305
-
306
- beforeAll(() => {
307
- mergeMemberDetails(m1, m2);
308
- d1 = m1.details;
309
- });
310
-
311
- // assert
312
- test("firstName", () => {
313
- expect(d1.firstName).toBe(d1Old.firstName);
314
- });
315
-
316
- test("lastName", () => {
317
- expect(d1.lastName).toBe(d1Old.lastName);
318
- });
319
-
320
- test("memberNumber", () => {
321
- expect(d1.memberNumber).toBe(d1Old.memberNumber);
322
- });
323
-
324
- test("uitpasNumber", () => {
325
- expect(d1.uitpasNumber).toBe(d1Old.uitpasNumber);
326
- });
327
-
328
- test("email", () => {
329
- expect(d1.email).toBe(d1Old.email);
330
- expect(d1.unverifiedEmails).not.toContain(d2Old.email);
331
- });
332
-
333
- test("phone", () => {
334
- expect(d1.phone).toBe(d1Old.phone);
335
- expect(d1.unverifiedPhones).not.toContain(d2Old.phone);
336
- });
337
-
338
- test("gender", () => {
339
- expect(d1.gender).toBe(d1Old.gender);
340
- });
341
-
342
- test("birthDay", () => {
343
- expect(d1.birthDay?.getTime() ?? -1).toBe(
344
- d1Old.birthDay?.getTime() ?? -1
345
- );
346
- });
347
-
348
- test("requires financial support", () => {
349
- expect(d1.requiresFinancialSupport?.date.getTime() ?? -1).toBe(
350
- d1Old.requiresFinancialSupport?.date.getTime() ?? -1
351
- );
352
- });
353
-
354
- test("data permissions", () => {
355
- expect(d1.dataPermissions?.date.getTime() ?? -1).toBe(
356
- d1Old.dataPermissions?.date.getTime() ?? -1
357
- );
358
- });
359
-
360
- test("address", () => {
361
- expect(d1.address?.id).toBe(d1Old.address?.id);
362
- });
363
-
364
- test("parents", () => {
365
- expect(d1.parents.length).toBe(d1Old.parents.length);
366
- });
367
-
368
- test("emergency contacts", () => {
369
- expect(d1.emergencyContacts.length).toBe(
370
- d1Old.emergencyContacts.length
371
- );
372
- });
373
-
374
- test("review times", () => {
375
- expect(d1.reviewTimes.times.length).toBe(
376
- d1Old.reviewTimes.times.length
377
- );
378
- });
379
-
380
- test("answers", () => {
381
- expect(d1.recordAnswers.size).toBe(d1Old.recordAnswers.size);
382
- });
383
-
384
- test("unverifiedEmails", () => {
385
- expect(d1.unverifiedEmails.length).toBe(d1Old.unverifiedEmails.length);
386
- });
387
-
388
- test("unverifiedPhones", () => {
389
- expect(d1.unverifiedPhones.length).toBe(d1Old.unverifiedPhones.length);
390
- });
391
-
392
- test("unverifiedAddresses", () => {
393
- expect(d1.unverifiedAddresses.length).toBe(
394
- d1Old.unverifiedAddresses.length
395
- );
396
- });
397
-
398
- test("notes", () => {
399
- expect(d1.notes).toEqual("note1");
400
- });
401
- });
697
+ test('select base member should return last created member', () => {
698
+ const m1 = new Member();
699
+ m1.createdAt = new Date(2020, 0, 1);
700
+ m1.id = uuidv4();
701
+ const m2 = new Member();
702
+ m2.createdAt = new Date(2021, 0, 1);
703
+ m2.id = uuidv4();
704
+ const m3 = new Member();
705
+ m3.createdAt = new Date(2022, 0, 1);
706
+ m3.id = uuidv4();
707
+
708
+ const members = [m1, m3, m2];
709
+
710
+ const { base, others } = selectBaseMember(members);
711
+
712
+ expect(base.id).toBe(m3.id);
402
713
 
403
- describe("complete base and other details", () => {
404
- //#region arrange
405
- const m1 = new Member();
406
- const m2 = new Member();
407
-
408
- const recordAnswer1 = RecordAnswer.create({
409
- settings: RecordSettings.create({
410
- name: "answer1",
411
- required: true,
412
- choices: [],
413
- }),
414
- });
415
-
416
- const recordAnswer1b = recordAnswer1.clone();
417
- recordAnswer1b.date = new Date(1990, 1, 1);
418
-
419
- const recordAnswer2 = RecordAnswer.create({
420
- settings: RecordSettings.create({
421
- name: "answer2",
422
- required: true,
423
- choices: [],
424
- }),
425
- });
426
-
427
- // will not changed because cloned
428
- const oldParent1 = Parent.create({
429
- firstName: "John",
430
- lastName: "Doe",
431
- email: "john@test.be",
432
- phone: "04111111",
433
- });
434
-
435
- const parent1Alt = Parent.create({
436
- firstName: "John",
437
- lastName: "Doe",
438
- email: "oldJohn@test.be",
439
- phone: "0499999",
440
- address: Address.create({
441
- street: "john street",
442
- number: "5",
443
- city: "Amsterdam",
444
- postalCode: "1011AB",
445
- country: Country.Belgium,
446
- }),
447
- });
448
-
449
- const d1Old = MemberDetails.create({
450
- firstName: "John",
451
- lastName: "Doe",
452
- birthDay: new Date(1990, 1, 1),
453
- memberNumber: "123",
454
- uitpasNumber: "56",
455
- email: "b7v2X@example.com",
456
- phone: "04863544",
457
- gender: Gender.Male,
458
- requiresFinancialSupport: BooleanStatus.create({
459
- value: true,
460
- date: new Date(2021, 1, 1),
461
- }),
462
- dataPermissions: BooleanStatus.create({
463
- value: true,
464
- date: new Date(2020, 1, 1),
465
- }),
466
- address: Address.create({
467
- city: "Amsterdam",
468
- street: "Mozartstraat",
469
- number: "1",
470
- postalCode: "1011AB",
471
- country: Country.Netherlands,
472
- }),
473
- parents: [oldParent1],
474
- emergencyContacts: [
475
- EmergencyContact.create({
476
- name: "blabla",
477
- title: "title",
478
- phone: "04863544654",
479
- }),
480
- EmergencyContact.create({
481
- name: "blabla2",
482
- title: "title2",
483
- phone: "04863544654",
484
- }),
485
- ],
486
- reviewTimes: ReviewTimes.create({
487
- times: [
488
- ReviewTime.create({
489
- name: "parents",
490
- reviewedAt: new Date(2020, 1, 1),
491
- }),
492
- ReviewTime.create({
493
- name: "details",
494
- reviewedAt: new Date(2021, 1, 1),
495
- }),
496
- ],
497
- }),
498
- recordAnswers: new Map([[recordAnswer1.id, recordAnswer1]]),
499
- unverifiedEmails: ["email1@test.be", "email2@test.be"],
500
- unverifiedPhones: ["04863545", "04863546"],
501
- unverifiedAddresses: [
502
- Address.create({
503
- city: "Amsterdam",
504
- street: "Mozartstraat",
505
- number: "2",
506
- postalCode: "1011AB",
507
- country: Country.Netherlands,
508
- }),
509
- ],
510
- notes: "note1",
511
- });
512
-
513
- const d2Old = MemberDetails.create({
514
- firstName: "John",
515
- lastName: "Doe",
516
- birthDay: new Date(2000, 1, 1),
517
- memberNumber: "123456",
518
- uitpasNumber: "567",
519
- email: "other@example.com",
520
- phone: "048635449",
521
- gender: Gender.Female,
522
- // earlier date
523
- requiresFinancialSupport: BooleanStatus.create({
524
- value: false,
525
- date: new Date(2020, 1, 1),
526
- }),
527
- // older date
528
- dataPermissions: BooleanStatus.create({
529
- value: false,
530
- date: new Date(2021, 1, 1),
531
- }),
532
- address: Address.create({
533
- city: "Amsterdam",
534
- street: "Mozartstraat",
535
- number: "5",
536
- postalCode: "1011AB",
537
- country: Country.Netherlands,
538
- }),
539
- parents: [
540
- parent1Alt,
541
- Parent.create({ firstName: "John", lastName: "Other" }),
542
- ],
543
- emergencyContacts: [
544
- EmergencyContact.create({
545
- name: "other emergency contact",
546
- title: "title",
547
- phone: "04863544654",
548
- }),
549
- EmergencyContact.create({
550
- name: "blabla",
551
- title: "title",
552
- phone: "04863544654",
553
- }),
554
- ],
555
- reviewTimes: ReviewTimes.create({
556
- times: [
557
- ReviewTime.create({
558
- name: "parents",
559
- reviewedAt: new Date(2019, 1, 1),
560
- }),
561
- ReviewTime.create({
562
- name: "details",
563
- reviewedAt: new Date(2023, 1, 1),
564
- }),
565
- ],
566
- }),
567
- recordAnswers: new Map([
568
- [recordAnswer2.id, recordAnswer2],
569
- [recordAnswer1.id, recordAnswer1],
570
- [recordAnswer1b.id, recordAnswer1b],
571
- ]),
572
- unverifiedEmails: ["otherUnverivied@test.be"],
573
- unverifiedPhones: ["0486354599", "0486354699"],
574
- unverifiedAddresses: [
575
- Address.create({
576
- city: "Amsterdam",
577
- street: "AndereStraat",
578
- number: "100",
579
- postalCode: "1011AB",
580
- country: Country.Netherlands,
581
- }),
582
- ],
583
- notes: "note2",
584
- });
585
-
586
- m1.details = d1Old.clone();
587
- m2.details = d2Old.clone();
588
- //#endregion
589
-
590
- // act
591
- let d1: MemberDetails;
592
- let parent1: Parent;
593
-
594
- beforeAll(() => {
595
- mergeMemberDetails(m1, m2);
596
- d1 = m1.details;
597
- parent1 = d1.parents.find((p) => p.id === oldParent1.id)!;
598
- });
599
-
600
- // assert
601
- test("firstName", () => {
602
- expect(d1.firstName).toBe(d1Old.firstName);
603
- });
604
-
605
- test("lastName", () => {
606
- expect(d1.lastName).toBe(d1Old.lastName);
607
- });
608
-
609
- test("memberNumber", () => {
610
- expect(d1.memberNumber).toBe(d1Old.memberNumber);
611
- });
612
-
613
- test("uitpasNumber", () => {
614
- expect(d1.uitpasNumber).toBe(d1Old.uitpasNumber);
615
- });
616
-
617
- test("email", () => {
618
- expect(d1.email).toBe(d1Old.email);
619
- expect(d1.unverifiedEmails).toContain(d2Old.email);
620
- });
621
-
622
- test("phone", () => {
623
- expect(d1.phone).toBe(d1Old.phone);
624
- expect(d1.unverifiedPhones).toContain(d2Old.phone);
625
- });
626
-
627
- test("gender", () => {
628
- expect(d1.gender).toBe(d1Old.gender);
629
- });
630
-
631
- test("birthDay", () => {
632
- expect(d1.birthDay?.getTime() ?? -1).toBe(
633
- d1Old.birthDay?.getTime() ?? -1
634
- );
635
- });
636
-
637
- test("requires financial support", () => {
638
- expect(d1.requiresFinancialSupport?.date.getTime() ?? -1).toBe(
639
- d1Old.requiresFinancialSupport?.date.getTime() ?? -1
640
- );
641
- });
642
-
643
- test("data permissions", () => {
644
- expect(d1.dataPermissions?.date.getTime() ?? -1).toBe(
645
- d2Old.dataPermissions?.date.getTime() ?? -1
646
- );
647
- });
648
-
649
- test("address", () => {
650
- expect(d1.address?.id).toBe(d1Old.address?.id);
651
- expect(d1.unverifiedAddresses.map((a) => a.id)).toContain(
652
- d2Old.address?.id
653
- );
654
- });
655
-
656
- test("parents", () => {
657
- expect(d1.parents.length).toBe(2);
658
- expect(parent1.firstName).toBe(parent1Alt.firstName);
659
- expect(parent1.lastName).toBe(parent1Alt.lastName);
660
- expect(parent1.email).toBe(oldParent1.email);
661
- expect(parent1.phone).toBe(oldParent1.phone);
662
- expect(parent1.address?.id).toBe(parent1Alt.address?.id);
663
- expect(d1.unverifiedPhones).toContain(parent1Alt.phone);
664
- expect(parent1.alternativeEmails).toContain(parent1Alt.email);
665
- });
666
-
667
- test("emergency contacts", () => {
668
- expect(d1.emergencyContacts.length).toBe(3);
669
- });
670
-
671
- test("review times", () => {
672
- expect(d1.reviewTimes.times.length).toBe(2);
673
- });
674
-
675
- test("answers", () => {
676
- expect(d1.recordAnswers.size).toBe(3);
677
- });
678
-
679
- test("unverifiedEmails", () => {
680
- expect(d1.unverifiedEmails.length).toBe(4);
681
- });
682
-
683
- test("unverifiedPhones", () => {
684
- expect(d1.unverifiedPhones.length).toBe(6);
685
- });
686
-
687
- test("unverifiedAddresses", () => {
688
- expect(d1.unverifiedAddresses.length).toBe(3);
689
- });
690
-
691
- test("notes", () => {
692
- expect(d1.notes).toEqual("note1\nnote2");
693
- });
714
+ expect(others).toHaveLength(2);
715
+ const otherIds = others.map(m => m.id);
716
+ expect(otherIds).toContain(m1.id);
717
+ expect(otherIds).toContain(m2.id);
694
718
  });
695
- });
696
-
697
- test("select base member should return last created member", () => {
698
- const m1 = new Member();
699
- m1.createdAt = new Date(2020, 0, 1);
700
- m1.id = uuidv4();
701
- const m2 = new Member();
702
- m2.createdAt = new Date(2021, 0, 1);
703
- m2.id = uuidv4();
704
- const m3 = new Member();
705
- m3.createdAt = new Date(2022, 0, 1);
706
- m3.id = uuidv4();
707
-
708
- const members = [m1, m3, m2];
709
-
710
- const { base, others } = selectBaseMember(members);
711
-
712
- expect(base.id).toBe(m3.id);
713
-
714
- expect(others).toHaveLength(2);
715
- const otherIds = others.map((m) => m.id);
716
- expect(otherIds).toContain(m1.id);
717
- expect(otherIds).toContain(m2.id);
718
- });
719
719
  });