@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
@@ -1,108 +1,108 @@
1
1
  import { column, Database, ManyToManyRelation, ManyToOneRelation, Model, OneToManyRelation } from '@simonbackx/simple-database';
2
- import { scalarToSQLExpression, SQL, SQLWhereLike } from "@stamhoofd/sql";
2
+ import { scalarToSQLExpression, SQL, SQLWhereLike } from '@stamhoofd/sql';
3
3
  import { MemberDetails, MemberWithRegistrationsBlob, RegistrationWithMember as RegistrationWithMemberStruct, TinyMember } from '@stamhoofd/structures';
4
4
  import { Formatter, Sorter } from '@stamhoofd/utility';
5
- import { v4 as uuidv4 } from "uuid";
5
+ import { v4 as uuidv4 } from 'uuid';
6
6
 
7
7
  import { isSimpleError, isSimpleErrors, SimpleError } from '@simonbackx/simple-errors';
8
8
  import { QueueHandler } from '@stamhoofd/queues';
9
9
  import { Group, MemberPlatformMembership, MemberResponsibilityRecord, Organization, Payment, Platform, Registration, User } from './';
10
- export type MemberWithRegistrations = Member & {
11
- users: User[],
12
- registrations: (Registration & {group: Group})[]
13
- }
10
+ export type MemberWithRegistrations = Member & {
11
+ users: User[];
12
+ registrations: (Registration & { group: Group })[];
13
+ };
14
14
 
15
15
  // Defined here to prevent cycles
16
- export type RegistrationWithMember = Registration & { member: Member }
16
+ export type RegistrationWithMember = Registration & { member: Member };
17
17
 
18
18
  export class Member extends Model {
19
- static table = "members"
19
+ static table = 'members';
20
20
 
21
- //#region Columns
21
+ // #region Columns
22
22
  @column({
23
- primary: true, type: "string", beforeSave(value) {
23
+ primary: true, type: 'string', beforeSave(value) {
24
24
  return value ?? uuidv4();
25
- }
25
+ },
26
26
  })
27
27
  id!: string;
28
28
 
29
- @column({ type: "string", nullable: true })
30
- organizationId: string|null = null;
29
+ @column({ type: 'string', nullable: true })
30
+ organizationId: string | null = null;
31
31
 
32
32
  @column({
33
- type: "string",
34
- beforeSave: function() {
35
- return this.details?.firstName ?? ''
36
- }
33
+ type: 'string',
34
+ beforeSave: function () {
35
+ return this.details?.firstName ?? '';
36
+ },
37
37
  })
38
- firstName: string
38
+ firstName: string;
39
39
 
40
- @column({ type: "string",
41
- beforeSave: function() {
42
- return this.details?.lastName ?? ''
40
+ @column({ type: 'string',
41
+ beforeSave: function () {
42
+ return this.details?.lastName ?? '';
43
43
  } })
44
- lastName: string
44
+ lastName: string;
45
45
 
46
- @column({
47
- type: "string",
48
- nullable: true,
49
- beforeSave: function(this: Member) {
50
- return this.details?.birthDay ? Formatter.dateIso(this.details.birthDay) : null
51
- }
46
+ @column({
47
+ type: 'string',
48
+ nullable: true,
49
+ beforeSave: function (this: Member) {
50
+ return this.details?.birthDay ? Formatter.dateIso(this.details.birthDay) : null;
51
+ },
52
52
  })
53
- birthDay: string | null
53
+ birthDay: string | null;
54
54
 
55
55
  @column({
56
- type: "string",
56
+ type: 'string',
57
57
  nullable: true,
58
- beforeSave: function() {
59
- return this.details?.memberNumber ?? null
60
- }
58
+ beforeSave: function () {
59
+ return this.details?.memberNumber ?? null;
60
+ },
61
61
  })
62
- memberNumber: string | null
62
+ memberNumber: string | null;
63
63
 
64
- @column({ type: "json", decoder: MemberDetails })
65
- details: MemberDetails
64
+ @column({ type: 'json', decoder: MemberDetails })
65
+ details: MemberDetails;
66
66
 
67
67
  /**
68
68
  * Not yet paid balance
69
69
  */
70
- @column({ type: "integer" })
71
- outstandingBalance = 0
70
+ @column({ type: 'integer' })
71
+ outstandingBalance = 0;
72
72
 
73
73
  @column({
74
- type: "datetime", beforeSave(old?: any) {
74
+ type: 'datetime', beforeSave(old?: any) {
75
75
  if (old !== undefined) {
76
76
  return old;
77
77
  }
78
- const date = new Date()
79
- date.setMilliseconds(0)
80
- return date
81
- }
78
+ const date = new Date();
79
+ date.setMilliseconds(0);
80
+ return date;
81
+ },
82
82
  })
83
- createdAt: Date
83
+ createdAt: Date;
84
84
 
85
85
  @column({
86
- type: "datetime", beforeSave() {
87
- const date = new Date()
88
- date.setMilliseconds(0)
89
- return date
86
+ type: 'datetime', beforeSave() {
87
+ const date = new Date();
88
+ date.setMilliseconds(0);
89
+ return date;
90
90
  },
91
- skipUpdate: true
91
+ skipUpdate: true,
92
92
  })
93
- updatedAt: Date
94
- //#endregion
93
+ updatedAt: Date;
94
+ // #endregion
95
95
 
96
- static registrations = new OneToManyRelation(Member, Registration, "registrations", "memberId")
96
+ static registrations = new OneToManyRelation(Member, Registration, 'registrations', 'memberId');
97
97
 
98
98
  // Note: all relations should point to their parents, not the other way around to avoid reference cycles
99
- static users = new ManyToManyRelation(Member, User, "users");
99
+ static users = new ManyToManyRelation(Member, User, 'users');
100
100
 
101
101
  /**
102
102
  * Fetch all members with their corresponding (valid) registration
103
103
  */
104
104
  static async getWithRegistrations(id: string): Promise<MemberWithRegistrations | null> {
105
- return (await this.getBlobByIds(id))[0] ?? null
105
+ return (await this.getBlobByIds(id))[0] ?? null;
106
106
  }
107
107
 
108
108
  /**
@@ -110,21 +110,21 @@ export class Member extends Model {
110
110
  */
111
111
  static async updateOutstandingBalance(memberIds: string[] | 'all') {
112
112
  if (memberIds !== 'all' && memberIds.length == 0) {
113
- return
113
+ return;
114
114
  }
115
115
 
116
- const params: any[] = []
117
- let firstWhere = ''
118
- let secondWhere = ''
116
+ const params: any[] = [];
117
+ let firstWhere = '';
118
+ let secondWhere = '';
119
119
 
120
120
  if (memberIds !== 'all') {
121
- firstWhere = ` AND memberId IN (?)`
122
- params.push(memberIds)
121
+ firstWhere = ` AND memberId IN (?)`;
122
+ params.push(memberIds);
123
123
 
124
- secondWhere = `WHERE members.id IN (?)`
125
- params.push(memberIds)
124
+ secondWhere = `WHERE members.id IN (?)`;
125
+ params.push(memberIds);
126
126
  }
127
-
127
+
128
128
  const query = `UPDATE
129
129
  members
130
130
  LEFT JOIN (
@@ -138,9 +138,9 @@ export class Member extends Model {
138
138
  memberId
139
139
  ) i ON i.memberId = members.id
140
140
  SET members.outstandingBalance = COALESCE(i.outstandingBalance, 0)
141
- ${secondWhere}`
142
-
143
- await Database.update(query, params)
141
+ ${secondWhere}`;
142
+
143
+ await Database.update(query, params);
144
144
  }
145
145
 
146
146
  /**
@@ -148,38 +148,38 @@ export class Member extends Model {
148
148
  */
149
149
  static async getRegistrationWithMembersByIDs(ids: string[]): Promise<RegistrationWithMember[]> {
150
150
  if (ids.length === 0) {
151
- return []
151
+ return [];
152
152
  }
153
153
  let query = `SELECT ${Member.getDefaultSelect()}, ${Registration.getDefaultSelect()} from \`${Member.table}\`\n`;
154
-
155
- query += `JOIN \`${Registration.table}\` ON \`${Registration.table}\`.\`${Member.registrations.foreignKey}\` = \`${Member.table}\`.\`${Member.primary.name}\` AND (\`${Registration.table}\`.\`registeredAt\` is not null OR \`${Registration.table}\`.\`canRegister\` = 1)\n`
154
+
155
+ query += `JOIN \`${Registration.table}\` ON \`${Registration.table}\`.\`${Member.registrations.foreignKey}\` = \`${Member.table}\`.\`${Member.primary.name}\` AND (\`${Registration.table}\`.\`registeredAt\` is not null OR \`${Registration.table}\`.\`canRegister\` = 1)\n`;
156
156
 
157
157
  // We do an extra join because we also need to get the other registrations of each member (only one regitration has to match the query)
158
- query += `where \`${Registration.table}\`.\`${Registration.primary.name}\` IN (?)`
158
+ query += `where \`${Registration.table}\`.\`${Registration.primary.name}\` IN (?)`;
159
159
 
160
- const [results] = await Database.select(query, [ids])
161
- const registrations: RegistrationWithMember[] = []
160
+ const [results] = await Database.select(query, [ids]);
161
+ const registrations: RegistrationWithMember[] = [];
162
162
 
163
- // In the future we might add a 'reverse' method on manytoone relation, instead of defining the new relation. But then we need to store 2 model types in the many to one relation.
164
- const registrationMemberRelation = new ManyToOneRelation(Member, "member")
165
- registrationMemberRelation.foreignKey = Member.registrations.foreignKey
163
+ // In the future we might add a 'reverse' method on manytoone relation, instead of defining the new relation. But then we need to store 2 model types in the many to one relation.
164
+ const registrationMemberRelation = new ManyToOneRelation(Member, 'member');
165
+ registrationMemberRelation.foreignKey = Member.registrations.foreignKey;
166
166
 
167
167
  for (const row of results) {
168
- const registration = Registration.fromRow(row[Registration.table])
168
+ const registration = Registration.fromRow(row[Registration.table]);
169
169
  if (!registration) {
170
- throw new Error("Expected registration in every row")
170
+ throw new Error('Expected registration in every row');
171
171
  }
172
172
 
173
- const foundMember = Member.fromRow(row[Member.table])
173
+ const foundMember = Member.fromRow(row[Member.table]);
174
174
  if (!foundMember) {
175
- throw new Error("Expected member in every row")
175
+ throw new Error('Expected member in every row');
176
176
  }
177
-
178
- const _f = registration.setRelation(registrationMemberRelation, foundMember)
179
- registrations.push(_f)
177
+
178
+ const _f = registration.setRelation(registrationMemberRelation, foundMember);
179
+ registrations.push(_f);
180
180
  }
181
181
 
182
- return registrations
182
+ return registrations;
183
183
  }
184
184
 
185
185
  /**
@@ -187,145 +187,144 @@ export class Member extends Model {
187
187
  */
188
188
  static async getRegistrationWithMembersForGroup(groupId: string): Promise<RegistrationWithMember[]> {
189
189
  let query = `SELECT ${Member.getDefaultSelect()}, ${Registration.getDefaultSelect()} from \`${Member.table}\`\n`;
190
-
191
- query += `JOIN \`${Registration.table}\` ON \`${Registration.table}\`.\`${Member.registrations.foreignKey}\` = \`${Member.table}\`.\`${Member.primary.name}\` AND (\`${Registration.table}\`.\`registeredAt\` is not null OR \`${Registration.table}\`.\`canRegister\` = 1)\n`
190
+
191
+ query += `JOIN \`${Registration.table}\` ON \`${Registration.table}\`.\`${Member.registrations.foreignKey}\` = \`${Member.table}\`.\`${Member.primary.name}\` AND (\`${Registration.table}\`.\`registeredAt\` is not null OR \`${Registration.table}\`.\`canRegister\` = 1)\n`;
192
192
 
193
193
  // We do an extra join because we also need to get the other registrations of each member (only one regitration has to match the query)
194
- query += `where \`${Registration.table}\`.\`groupId\` = ?`
194
+ query += `where \`${Registration.table}\`.\`groupId\` = ?`;
195
195
 
196
- const [results] = await Database.select(query, [groupId])
197
- const registrations: RegistrationWithMember[] = []
196
+ const [results] = await Database.select(query, [groupId]);
197
+ const registrations: RegistrationWithMember[] = [];
198
198
 
199
- // In the future we might add a 'reverse' method on manytoone relation, instead of defining the new relation. But then we need to store 2 model types in the many to one relation.
200
- const registrationMemberRelation = new ManyToOneRelation(Member, "member")
201
- registrationMemberRelation.foreignKey = Member.registrations.foreignKey
199
+ // In the future we might add a 'reverse' method on manytoone relation, instead of defining the new relation. But then we need to store 2 model types in the many to one relation.
200
+ const registrationMemberRelation = new ManyToOneRelation(Member, 'member');
201
+ registrationMemberRelation.foreignKey = Member.registrations.foreignKey;
202
202
 
203
203
  for (const row of results) {
204
- const registration = Registration.fromRow(row[Registration.table])
204
+ const registration = Registration.fromRow(row[Registration.table]);
205
205
  if (!registration) {
206
- throw new Error("Expected registration in every row")
206
+ throw new Error('Expected registration in every row');
207
207
  }
208
208
 
209
- const foundMember = Member.fromRow(row[Member.table])
209
+ const foundMember = Member.fromRow(row[Member.table]);
210
210
  if (!foundMember) {
211
- throw new Error("Expected member in every row")
211
+ throw new Error('Expected member in every row');
212
212
  }
213
-
214
- const _f = registration.setRelation(registrationMemberRelation, foundMember)
215
- registrations.push(_f)
213
+
214
+ const _f = registration.setRelation(registrationMemberRelation, foundMember);
215
+ registrations.push(_f);
216
216
  }
217
217
 
218
- return registrations
218
+ return registrations;
219
219
  }
220
220
 
221
- /**
221
+ /**
222
222
  * Fetch all registrations with members with their corresponding (valid) registrations and payment
223
223
  */
224
224
  static async getRegistrationWithMembersForPayment(paymentId: string): Promise<RegistrationWithMember[]> {
225
- const { BalanceItem, BalanceItemPayment} = await import('./');
225
+ const { BalanceItem, BalanceItemPayment } = await import('./');
226
226
 
227
227
  let query = `SELECT ${Member.getDefaultSelect()}, ${Registration.getDefaultSelect()} from \`${Member.table}\`\n`;
228
-
229
- query += `JOIN \`${Registration.table}\` ON \`${Registration.table}\`.\`${Member.registrations.foreignKey}\` = \`${Member.table}\`.\`${Member.primary.name}\`\n`
230
-
231
- query += `LEFT JOIN \`${BalanceItem.table}\` ON \`${BalanceItem.table}\`.\`registrationId\` = \`${Registration.table}\`.\`${Registration.primary.name}\`\n`
232
- query += `LEFT JOIN \`${BalanceItemPayment.table}\` ON \`${BalanceItemPayment.table}\`.\`${BalanceItemPayment.balanceItem.foreignKey}\` = \`${BalanceItem.table}\`.\`${BalanceItem.primary.name}\`\n`
233
- query += `JOIN \`${Payment.table}\` ON \`${Payment.table}\`.\`${Payment.primary.name}\` = \`${BalanceItemPayment.table}\`.\`${BalanceItemPayment.payment.foreignKey}\`\n`
228
+
229
+ query += `JOIN \`${Registration.table}\` ON \`${Registration.table}\`.\`${Member.registrations.foreignKey}\` = \`${Member.table}\`.\`${Member.primary.name}\`\n`;
230
+
231
+ query += `LEFT JOIN \`${BalanceItem.table}\` ON \`${BalanceItem.table}\`.\`registrationId\` = \`${Registration.table}\`.\`${Registration.primary.name}\`\n`;
232
+ query += `LEFT JOIN \`${BalanceItemPayment.table}\` ON \`${BalanceItemPayment.table}\`.\`${BalanceItemPayment.balanceItem.foreignKey}\` = \`${BalanceItem.table}\`.\`${BalanceItem.primary.name}\`\n`;
233
+ query += `JOIN \`${Payment.table}\` ON \`${Payment.table}\`.\`${Payment.primary.name}\` = \`${BalanceItemPayment.table}\`.\`${BalanceItemPayment.payment.foreignKey}\`\n`;
234
234
 
235
235
  // We do an extra join because we also need to get the other registrations of each member (only one regitration has to match the query)
236
- query += `WHERE \`${Payment.table}\`.\`${Payment.primary.name}\` = ?\n`
237
- query += `GROUP BY \`${Registration.table}\`.\`${Registration.primary.name}\`, \`${Member.table}\`.\`${Member.primary.name}\``
236
+ query += `WHERE \`${Payment.table}\`.\`${Payment.primary.name}\` = ?\n`;
237
+ query += `GROUP BY \`${Registration.table}\`.\`${Registration.primary.name}\`, \`${Member.table}\`.\`${Member.primary.name}\``;
238
238
 
239
- const [results] = await Database.select(query, [paymentId])
240
- const registrations: RegistrationWithMember[] = []
239
+ const [results] = await Database.select(query, [paymentId]);
240
+ const registrations: RegistrationWithMember[] = [];
241
241
 
242
- // In the future we might add a 'reverse' method on manytoone relation, instead of defining the new relation. But then we need to store 2 model types in the many to one relation.
243
- const registrationMemberRelation = new ManyToOneRelation(Member, "member")
244
- registrationMemberRelation.foreignKey = Member.registrations.foreignKey
242
+ // In the future we might add a 'reverse' method on manytoone relation, instead of defining the new relation. But then we need to store 2 model types in the many to one relation.
243
+ const registrationMemberRelation = new ManyToOneRelation(Member, 'member');
244
+ registrationMemberRelation.foreignKey = Member.registrations.foreignKey;
245
245
 
246
246
  for (const row of results) {
247
- const registration = Registration.fromRow(row[Registration.table])
247
+ const registration = Registration.fromRow(row[Registration.table]);
248
248
  if (!registration) {
249
- throw new Error("Expected registration in every row")
249
+ throw new Error('Expected registration in every row');
250
250
  }
251
251
 
252
- const foundMember = Member.fromRow(row[Member.table])
252
+ const foundMember = Member.fromRow(row[Member.table]);
253
253
  if (!foundMember) {
254
- throw new Error("Expected member in every row")
254
+ throw new Error('Expected member in every row');
255
255
  }
256
-
257
- const _f = registration.setRelation(registrationMemberRelation, foundMember)
258
- registrations.push(_f)
256
+
257
+ const _f = registration.setRelation(registrationMemberRelation, foundMember);
258
+ registrations.push(_f);
259
259
  }
260
260
 
261
- return registrations
261
+ return registrations;
262
262
  }
263
263
 
264
- /**
264
+ /**
265
265
  * Fetch all members with their corresponding (valid) registrations, users
266
266
  */
267
267
  static async getBlobByIds(...ids: string[]): Promise<MemberWithRegistrations[]> {
268
268
  if (ids.length == 0) {
269
- return []
269
+ return [];
270
270
  }
271
271
  let query = `SELECT ${Member.getDefaultSelect()}, ${Registration.getDefaultSelect()}, ${User.getDefaultSelect()} from \`${Member.table}\`\n`;
272
- query += `LEFT JOIN \`${Registration.table}\` ON \`${Registration.table}\`.\`${Member.registrations.foreignKey}\` = \`${Member.table}\`.\`${Member.primary.name}\` AND (\`${Registration.table}\`.\`registeredAt\` is not null OR \`${Registration.table}\`.\`canRegister\` = 1)\n`
273
- query += Member.users.joinQuery(Member.table, User.table)+"\n"
272
+ query += `LEFT JOIN \`${Registration.table}\` ON \`${Registration.table}\`.\`${Member.registrations.foreignKey}\` = \`${Member.table}\`.\`${Member.primary.name}\` AND (\`${Registration.table}\`.\`registeredAt\` is not null OR \`${Registration.table}\`.\`canRegister\` = 1)\n`;
273
+ query += Member.users.joinQuery(Member.table, User.table) + '\n';
274
274
 
275
275
  // We do an extra join because we also need to get the other registrations of each member (only one regitration has to match the query)
276
- query += `where \`${Member.table}\`.\`${Member.primary.name}\` IN (?)`
276
+ query += `where \`${Member.table}\`.\`${Member.primary.name}\` IN (?)`;
277
277
 
278
- const [results] = await Database.select(query, [ids])
279
- const members: MemberWithRegistrations[] = []
278
+ const [results] = await Database.select(query, [ids]);
279
+ const members: MemberWithRegistrations[] = [];
280
280
 
281
281
  // Load groups
282
- const groupIds = results.map(r => r[Registration.table]?.groupId).filter(id => id) as string[]
283
- const groups = await Group.getByIDs(...Formatter.uniqueArray(groupIds))
282
+ const groupIds = results.map(r => r[Registration.table]?.groupId).filter(id => id) as string[];
283
+ const groups = await Group.getByIDs(...Formatter.uniqueArray(groupIds));
284
284
 
285
285
  for (const row of results) {
286
- const foundMember = Member.fromRow(row[Member.table])
286
+ const foundMember = Member.fromRow(row[Member.table]);
287
287
  if (!foundMember) {
288
- throw new Error("Expected member in every row")
288
+ throw new Error('Expected member in every row');
289
289
  }
290
290
  const _f = foundMember
291
- .setManyRelation(Member.registrations as unknown as OneToManyRelation<"registrations", Member, Registration & {group: Group}>, [])
292
- .setManyRelation(Member.users, [])
293
-
294
- // Seach if we already got this member?
295
- const existingMember = members.find(m => m.id == _f.id)
291
+ .setManyRelation(Member.registrations as unknown as OneToManyRelation<'registrations', Member, Registration & { group: Group }>, [])
292
+ .setManyRelation(Member.users, []);
293
+
294
+ // Seach if we already got this member?
295
+ const existingMember = members.find(m => m.id == _f.id);
296
296
 
297
- const member: MemberWithRegistrations = (existingMember ?? _f)
297
+ const member: MemberWithRegistrations = (existingMember ?? _f);
298
298
  if (!existingMember) {
299
- members.push(member)
299
+ members.push(member);
300
300
  }
301
301
 
302
- // Check if we have a registration with a payment
303
- const registration = Registration.fromRow(row[Registration.table])
302
+ // Check if we have a registration with a payment
303
+ const registration = Registration.fromRow(row[Registration.table]);
304
304
  if (registration) {
305
305
  // Check if we already have this registration
306
306
  if (!member.registrations.find(r => r.id == registration.id)) {
307
- const g = groups.find(g => g.id == registration.groupId)
307
+ const g = groups.find(g => g.id == registration.groupId);
308
308
  if (!g) {
309
- throw new Error("Group not found")
309
+ throw new Error('Group not found');
310
310
  }
311
311
  if (g.deletedAt === null) {
312
- member.registrations.push(registration.setRelation(Registration.group, g))
312
+ member.registrations.push(registration.setRelation(Registration.group, g));
313
313
  }
314
314
  }
315
315
  }
316
316
 
317
317
  // Check if we have a user
318
- const user = User.fromRow(row[User.table])
318
+ const user = User.fromRow(row[User.table]);
319
319
  if (user) {
320
320
  // Check if we already have this registration
321
321
  if (!member.users.find(r => r.id == user.id)) {
322
- member.users.push(user)
322
+ member.users.push(user);
323
323
  }
324
324
  }
325
325
  }
326
326
 
327
- return members
328
-
327
+ return members;
329
328
  }
330
329
 
331
330
  /**
@@ -333,27 +332,27 @@ export class Member extends Model {
333
332
  */
334
333
  static async getFamilyWithRegistrations(id: string): Promise<MemberWithRegistrations[]> {
335
334
  let query = `SELECT l2.membersId as id from _members_users l1\n`;
336
- query += `JOIN _members_users l2 on l2.usersId = l1.usersId \n`
337
- query += `where l1.membersId = ? group by l2.membersId`
335
+ query += `JOIN _members_users l2 on l2.usersId = l1.usersId \n`;
336
+ query += `where l1.membersId = ? group by l2.membersId`;
338
337
 
339
- const [results] = await Database.select(query, [id])
340
- const ids: string[] = []
338
+ const [results] = await Database.select(query, [id]);
339
+ const ids: string[] = [];
341
340
  for (const row of results) {
342
- ids.push(row["l2"]["id"] as string)
341
+ ids.push(row['l2']['id'] as string);
343
342
  }
344
343
 
345
344
  if (!ids.includes(id)) {
346
345
  // Member has no users
347
- ids.push(id)
346
+ ids.push(id);
348
347
  }
349
-
350
- return await this.getBlobByIds(...ids)
348
+
349
+ return await this.getBlobByIds(...ids);
351
350
  }
352
351
 
353
- /**
352
+ /**
354
353
  * Fetch all members with their corresponding (valid) registrations or waiting lists and payments
355
354
  */
356
- static async getMemberIdsWithRegistrationForUser(user: User): Promise<string[]> {
355
+ static async getMemberIdsWithRegistrationForUser(user: User): Promise<string[]> {
357
356
  const query = SQL
358
357
  .select('id')
359
358
  .from(Member.table)
@@ -363,17 +362,17 @@ export class Member extends Model {
363
362
  .where(
364
363
  SQL.column('_members_users', 'membersId'),
365
364
  SQL.column(Member.table, 'id'),
366
- )
365
+ ),
367
366
  ).where(
368
367
  SQL.column('_members_users', 'usersId'),
369
368
  user.id,
370
- )
369
+ );
371
370
 
372
- const data = await query.fetch()
373
- return data.map((r) => r.members.id as string)
371
+ const data = await query.fetch();
372
+ return data.map(r => r.members.id as string);
374
373
  }
375
374
 
376
- /**
375
+ /**
377
376
  * Fetch all members with their corresponding (valid) registrations or waiting lists and payments
378
377
  */
379
378
  static async getMembersWithRegistrationForUser(user: User): Promise<MemberWithRegistrations[]> {
@@ -386,10 +385,10 @@ export class Member extends Model {
386
385
  registrations: this.registrations.map(r => r.getStructure()),
387
386
  details: this.details,
388
387
  users: this.users.map(u => u.getStructure()),
389
- })
388
+ });
390
389
  }
391
390
 
392
- static getRegistrationWithMemberStructure(registration: RegistrationWithMember & {group: import('./Group').Group}): RegistrationWithMemberStruct {
391
+ static getRegistrationWithMemberStructure(registration: RegistrationWithMember & { group: import('./Group').Group }): RegistrationWithMemberStruct {
393
392
  return RegistrationWithMemberStruct.create({
394
393
  ...registration.getStructure(),
395
394
  cycle: registration.cycle,
@@ -398,35 +397,35 @@ export class Member extends Model {
398
397
  firstName: registration.member.firstName,
399
398
  lastName: registration.member.lastName,
400
399
  }),
401
- })
400
+ });
402
401
  }
403
402
 
404
403
  static updateMembershipsForGroupId(id: string) {
405
404
  QueueHandler.schedule('bulk-update-memberships', async () => {
406
- console.log('Bulk updating memberships for group id ', id)
405
+ console.log('Bulk updating memberships for group id ', id);
407
406
 
408
407
  // Get all members that are registered in this group
409
408
  const memberIds = (await SQL.select(
410
- SQL.column('members', 'id')
411
- )
409
+ SQL.column('members', 'id'),
410
+ )
412
411
  .from(SQL.table(Member.table))
413
412
  .join(
414
413
  SQL.leftJoin(
415
- SQL.table(Registration.table)
414
+ SQL.table(Registration.table),
416
415
  ).where(
417
416
  SQL.column(Registration.table, 'memberId'),
418
- SQL.column(Member.table, 'id')
419
- )
417
+ SQL.column(Member.table, 'id'),
418
+ ),
420
419
  ).where(
421
420
  SQL.column(Registration.table, 'groupId'),
422
- id
423
- ).fetch()).flatMap(r => (r.members && (typeof r.members.id) === 'string') ? [r.members.id as string] : [])
424
-
421
+ id,
422
+ ).fetch()).flatMap(r => (r.members && (typeof r.members.id) === 'string') ? [r.members.id as string] : []);
423
+
425
424
  for (const id of memberIds) {
426
- await Member.updateMembershipsForId(id)
425
+ await Member.updateMembershipsForId(id);
427
426
  }
428
427
  }).catch((e) => {
429
- console.error('Failed to update memberships for group id ', id), e
428
+ console.error('Failed to update memberships for group id ', id, e);
430
429
  });
431
430
  }
432
431
 
@@ -435,152 +434,152 @@ export class Member extends Model {
435
434
  if (!silent) {
436
435
  console.log('update memberships for id ', id);
437
436
  }
438
-
439
- const me = await Member.getWithRegistrations(id)
437
+
438
+ const me = await Member.getWithRegistrations(id);
440
439
  if (!me) {
441
440
  if (!silent) {
442
- console.log('Skipping automatic membership for: ' + id, ' - member not found')
441
+ console.log('Skipping automatic membership for: ' + id, ' - member not found');
443
442
  }
444
- return
443
+ return;
445
444
  }
446
- const platform = await Platform.getShared()
447
- const registrations = me.registrations.filter(r => r.group.periodId == platform.periodId && r.registeredAt && !r.deactivatedAt)
445
+ const platform = await Platform.getShared();
446
+ const registrations = me.registrations.filter(r => r.group.periodId == platform.periodId && r.registeredAt && !r.deactivatedAt);
448
447
 
449
- const defaultMemberships = registrations.flatMap(r => {
448
+ const defaultMemberships = registrations.flatMap((r) => {
450
449
  if (!r.group.defaultAgeGroupId) {
451
- return []
450
+ return [];
452
451
  }
453
- const defaultAgeGroup = platform.config.defaultAgeGroups.find(g => g.id == r.group.defaultAgeGroupId)
452
+ const defaultAgeGroup = platform.config.defaultAgeGroups.find(g => g.id == r.group.defaultAgeGroupId);
454
453
  if (!defaultAgeGroup || !defaultAgeGroup.defaultMembershipTypeId) {
455
- return []
454
+ return [];
456
455
  }
457
456
 
458
- const defaultMembership = platform.config.membershipTypes.find(m => m.id == defaultAgeGroup.defaultMembershipTypeId)
457
+ const defaultMembership = platform.config.membershipTypes.find(m => m.id == defaultAgeGroup.defaultMembershipTypeId);
459
458
  if (!defaultMembership) {
460
- return []
459
+ return [];
461
460
  }
462
461
 
463
462
  if (defaultMembership.periods.get(platform.periodId) === undefined) {
464
- console.warn('Found default membership without period configuration', defaultMembership.id, platform.periodId)
465
- return []
463
+ console.warn('Found default membership without period configuration', defaultMembership.id, platform.periodId);
464
+ return [];
466
465
  }
467
466
 
468
467
  return [{
469
468
  registration: r,
470
469
  membership: defaultMembership,
471
- }]
470
+ }];
472
471
  });
473
472
 
474
473
  // Get active memberships for this member that
475
- const memberships = await MemberPlatformMembership.where({memberId: me.id, periodId: platform.periodId })
476
- const now = new Date()
477
- const activeMemberships = memberships.filter(m => m.startDate <= now && m.endDate >= now && m.deletedAt === null)
478
- const activeMembershipsUndeletable = activeMemberships.filter(m => !m.canDelete() || !m.generated)
474
+ const memberships = await MemberPlatformMembership.where({ memberId: me.id, periodId: platform.periodId });
475
+ const now = new Date();
476
+ const activeMemberships = memberships.filter(m => m.startDate <= now && m.endDate >= now && m.deletedAt === null);
477
+ const activeMembershipsUndeletable = activeMemberships.filter(m => !m.canDelete() || !m.generated);
479
478
 
480
479
  if (defaultMemberships.length == 0) {
481
480
  // Stop all active memberships that were added automatically
482
481
  for (const membership of activeMemberships) {
483
482
  if (membership.canDelete() && membership.generated) {
484
483
  if (!silent) {
485
- console.log('Removing membership because no longer registered member and not yet invoiced for: ' + me.id + ' - membership ' + membership.id)
484
+ console.log('Removing membership because no longer registered member and not yet invoiced for: ' + me.id + ' - membership ' + membership.id);
486
485
  }
487
- membership.deletedAt = new Date()
488
- await membership.save()
486
+ membership.deletedAt = new Date();
487
+ await membership.save();
489
488
  }
490
489
  }
491
490
 
492
491
  if (!silent) {
493
- console.log('Skipping automatic membership for: ' + me.id, ' - no default memberships found')
492
+ console.log('Skipping automatic membership for: ' + me.id, ' - no default memberships found');
494
493
  }
495
- return
494
+ return;
496
495
  }
497
496
 
498
-
499
497
  if (activeMembershipsUndeletable.length) {
500
498
  // Skip automatic additions
501
- for (const m of activeMembershipsUndeletable) {
502
- await m.calculatePrice(me)
503
- await m.save()
499
+ for (const m of activeMembershipsUndeletable) {
500
+ await m.calculatePrice(me);
501
+ await m.save();
504
502
  }
505
- return
503
+ return;
506
504
  }
507
505
 
508
506
  // Add the cheapest available membership
509
507
  const organizations = await Organization.getByIDs(...Formatter.uniqueArray(defaultMemberships.map(m => m.registration.organizationId)));
510
508
 
511
- const defaultMembershipsWithOrganization = defaultMemberships.map(({membership, registration}) => {
509
+ const defaultMembershipsWithOrganization = defaultMemberships.map(({ membership, registration }) => {
512
510
  const organizationId = registration.organizationId;
513
511
  const organization = organizations.find(o => o.id === organizationId);
514
- return {membership, registration, organization}
512
+ return { membership, registration, organization };
515
513
  });
516
514
 
517
515
  const shouldApplyReducedPrice = me.details.shouldApplyReducedPrice;
518
516
 
519
- const cheapestMembership = defaultMembershipsWithOrganization.sort(({membership: a, registration: ar, organization: ao}, {membership: b, registration: br, organization: bo}) => {
517
+ const cheapestMembership = defaultMembershipsWithOrganization.sort(({ membership: a, registration: ar, organization: ao }, { membership: b, registration: br, organization: bo }) => {
520
518
  const tagIdsA = ao?.meta.tags ?? [];
521
519
  const tagIdsB = bo?.meta.tags ?? [];
522
- const diff = a.getPrice(platform.periodId, now, tagIdsA, shouldApplyReducedPrice)! - b.getPrice(platform.periodId, now, tagIdsB, shouldApplyReducedPrice)!
520
+ const diff = a.getPrice(platform.periodId, now, tagIdsA, shouldApplyReducedPrice)! - b.getPrice(platform.periodId, now, tagIdsB, shouldApplyReducedPrice)!;
523
521
  if (diff == 0) {
524
- return Sorter.byDateValue(br.createdAt, ar.createdAt)
522
+ return Sorter.byDateValue(br.createdAt, ar.createdAt);
525
523
  }
526
- return diff
527
- })[0]
524
+ return diff;
525
+ })[0];
528
526
  if (!cheapestMembership) {
529
- throw new Error("No membership found")
527
+ throw new Error('No membership found');
530
528
  }
531
529
 
532
530
  // Check if already have the same membership
533
531
  for (const m of activeMemberships) {
534
532
  if (m.membershipTypeId === cheapestMembership.membership.id) {
535
- // Update the price of this active membership (could have changed)
536
- await m.calculatePrice(me)
537
- await m.save()
538
- return
533
+ // Update the price of this active membership (could have changed)
534
+ await m.calculatePrice(me);
535
+ await m.save();
536
+ return;
539
537
  }
540
538
  }
541
539
 
542
- const periodConfig = cheapestMembership.membership.periods.get(platform.periodId)
540
+ const periodConfig = cheapestMembership.membership.periods.get(platform.periodId);
543
541
  if (!periodConfig) {
544
- console.error("Missing membership prices for membership type "+cheapestMembership.membership.id+" and period " + platform.periodId)
542
+ console.error('Missing membership prices for membership type ' + cheapestMembership.membership.id + ' and period ' + platform.periodId);
545
543
  return;
546
544
  }
547
545
 
548
546
  // Can we revive an earlier deleted membership?
549
547
  if (!silent) {
550
- console.log('Creating automatic membership for: ' + me.id + ' - membership type ' + cheapestMembership.membership.id)
548
+ console.log('Creating automatic membership for: ' + me.id + ' - membership type ' + cheapestMembership.membership.id);
551
549
  }
552
550
  const membership = new MemberPlatformMembership();
553
- membership.memberId = me.id
554
- membership.membershipTypeId = cheapestMembership.membership.id
555
- membership.organizationId = cheapestMembership.registration.organizationId
556
- membership.periodId = platform.periodId
557
-
558
- membership.startDate = periodConfig.startDate
559
- membership.endDate = periodConfig.endDate
560
- membership.expireDate = periodConfig.expireDate
551
+ membership.memberId = me.id;
552
+ membership.membershipTypeId = cheapestMembership.membership.id;
553
+ membership.organizationId = cheapestMembership.registration.organizationId;
554
+ membership.periodId = platform.periodId;
555
+
556
+ membership.startDate = periodConfig.startDate;
557
+ membership.endDate = periodConfig.endDate;
558
+ membership.expireDate = periodConfig.expireDate;
561
559
  membership.generated = true;
562
560
 
563
- if(me.details.memberNumber === null) {
561
+ if (me.details.memberNumber === null) {
564
562
  try {
565
563
  await me.assignMemberNumber(membership);
566
- } catch(error) {
564
+ }
565
+ catch (error) {
567
566
  console.error(`Failed to assign member number for id ${me.id}: ${error.message}`);
568
567
  // If the assignment of the member number fails the membership is not created but the member is registered
569
568
  return;
570
569
  }
571
570
  }
572
571
 
573
- await membership.calculatePrice(me)
574
- await membership.save()
572
+ await membership.calculatePrice(me);
573
+ await membership.save();
575
574
 
576
575
  // This reasoning allows us to replace an existing membership with a cheaper one (not date based ones, but type based ones)
577
576
  for (const toDelete of activeMemberships) {
578
577
  if (toDelete.canDelete() && toDelete.generated) {
579
578
  if (!silent) {
580
- console.log('Removing membership because cheaper membership found for: ' + me.id + ' - membership ' + toDelete.id)
579
+ console.log('Removing membership because cheaper membership found for: ' + me.id + ' - membership ' + toDelete.id);
581
580
  }
582
- toDelete.deletedAt = new Date()
583
- await toDelete.save()
581
+ toDelete.deletedAt = new Date();
582
+ await toDelete.save();
584
583
  }
585
584
  }
586
585
  });
@@ -591,24 +590,26 @@ export class Member extends Model {
591
590
 
592
591
  if (member.details?.memberNumber) {
593
592
  console.log('Member already has member number, should not happen');
594
- return
593
+ return;
595
594
  }
596
-
595
+
597
596
  return await QueueHandler.schedule('assignMemberNumber', async function (this: undefined) {
598
597
  try {
599
598
  const memberNumber = await member.createMemberNumber(membership);
600
599
  member.details.memberNumber = memberNumber;
601
600
  await member.save();
602
- } catch(error) {
603
- if(isSimpleError(error) || isSimpleErrors(error)) {
601
+ }
602
+ catch (error) {
603
+ if (isSimpleError(error) || isSimpleErrors(error)) {
604
604
  throw error;
605
- } else {
605
+ }
606
+ else {
606
607
  console.error(error);
607
608
  throw new SimpleError({
608
609
  code: 'assign_member_number',
609
610
  message: error.message,
610
- human: "Er is iets misgegaan bij het aanmaken van het lidnummer.",
611
- })
611
+ human: 'Er is iets misgegaan bij het aanmaken van het lidnummer.',
612
+ });
612
613
  }
613
614
  }
614
615
  });
@@ -617,13 +618,13 @@ export class Member extends Model {
617
618
  async createMemberNumber(membership: MemberPlatformMembership): Promise<string> {
618
619
  // example: 5301-101012-1
619
620
 
620
- //#region get birth date part (ddmmjj)
621
+ // #region get birth date part (ddmmjj)
621
622
  const birthDay = this.details?.birthDay;
622
- if(!birthDay) {
623
+ if (!birthDay) {
623
624
  throw new SimpleError({
624
625
  code: 'assign_member_number',
625
- message: "Missing birthDay",
626
- human: "Er kon geen lidnummer aangemaakt worden omdat er geen geboortedatum is ingesteld.",
626
+ message: 'Missing birthDay',
627
+ human: 'Er kon geen lidnummer aangemaakt worden omdat er geen geboortedatum is ingesteld.',
627
628
  });
628
629
  }
629
630
 
@@ -631,68 +632,69 @@ export class Member extends Model {
631
632
  const monthPart = (birthDay.getMonth() + 1).toString().padStart(2, '0');
632
633
  const yearPart = birthDay.getFullYear().toString().slice(2, 4);
633
634
  const birthDatePart = `${dayPart}${monthPart}${yearPart}`;
634
- //#endregion
635
+ // #endregion
635
636
 
636
- //#region get group number
637
+ // #region get group number
637
638
  const organizationId = membership.organizationId;
638
639
  const organization = await Organization.getByID(organizationId);
639
- if(!organization) {
640
+ if (!organization) {
640
641
  throw new Error(`Organization with id ${organizationId} not found`);
641
642
  }
642
643
  const groupNumber = organization.uri;
643
- //#endregion
644
+ // #endregion
644
645
 
645
- //#region get follow up number
646
+ // #region get follow up number
646
647
  const firstPart = `${groupNumber}-${birthDatePart}-`;
647
648
 
648
649
  const query = SQL.select()
649
- .from(SQL.table('members'))
650
- .where(
651
- new SQLWhereLike(
652
- SQL.column('members', 'memberNumber'),
653
- scalarToSQLExpression(`${SQLWhereLike.escape(firstPart)}%`)
654
- )
655
- );
650
+ .from(SQL.table('members'))
651
+ .where(
652
+ new SQLWhereLike(
653
+ SQL.column('members', 'memberNumber'),
654
+ scalarToSQLExpression(`${SQLWhereLike.escape(firstPart)}%`),
655
+ ),
656
+ );
656
657
 
657
658
  const count = await query.count();
658
659
  console.log(`Found ${count} members with a memberNumber starting with ${firstPart}`);
659
660
 
660
661
  let followUpNumber = count;
661
- //#endregion
662
+ // #endregion
662
663
 
663
- //#region check if memberNumber is unique
664
+ // #region check if memberNumber is unique
664
665
  let doesExist = true;
665
666
  let memberNumber: string = '';
666
667
  let tries = 0;
667
668
 
668
- while(doesExist) {
669
+ while (doesExist) {
669
670
  followUpNumber++;
670
671
  memberNumber = firstPart + followUpNumber;
671
672
 
672
673
  const result = await SQL.select()
673
- .from(SQL.table('members'))
674
- .where(
674
+ .from(SQL.table('members'))
675
+ .where(
675
676
  SQL.column('members', 'memberNumber'),
676
- scalarToSQLExpression(memberNumber)
677
- )
678
- .first(false);
677
+ scalarToSQLExpression(memberNumber),
678
+ )
679
+ .first(false);
679
680
 
680
681
  console.log(`Is ${memberNumber} unique? ${result === null}`);
681
682
 
682
- if(result !== null) {
683
+ if (result !== null) {
683
684
  tries++;
684
- if(tries > 9) {
685
+ if (tries > 9) {
685
686
  throw new SimpleError({
686
687
  code: 'assign_member_number',
687
688
  message: `Duplicate member numbers (last try: ${memberNumber}, tries: ${tries})`,
688
- human: "Er kon geen uniek lidnummer aangemaakt worden. Mogelijks zijn er teveel leden met dezelfde geboortedatum. Neem contact op met de vereniging.",
689
+ human: 'Er kon geen uniek lidnummer aangemaakt worden. Mogelijks zijn er teveel leden met dezelfde geboortedatum. Neem contact op met de vereniging.',
689
690
  });
690
691
  }
691
- } else {
692
+ }
693
+ else {
692
694
  doesExist = false;
693
695
  }
694
696
  }
695
- //#endregion
697
+ // #endregion
696
698
 
697
699
  console.log(`Created member number: ${memberNumber}`);
698
700
 
@@ -700,12 +702,12 @@ export class Member extends Model {
700
702
  }
701
703
 
702
704
  async updateMemberships() {
703
- return await Member.updateMembershipsForId(this.id)
705
+ return await Member.updateMembershipsForId(this.id);
704
706
  }
705
707
 
706
708
  async isSafeToMergeDuplicateWithoutSecurityCode() {
707
709
  // If responsibilities: not safe
708
- const responsibilities = await MemberResponsibilityRecord.where({ memberId: this.id }, {limit: 1});
710
+ const responsibilities = await MemberResponsibilityRecord.where({ memberId: this.id }, { limit: 1 });
709
711
  if (responsibilities.length > 0) {
710
712
  return false;
711
713
  }