@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,22 +1,21 @@
1
-
2
- import { column, Model } from "@simonbackx/simple-database";
3
- import { isSimpleError, isSimpleErrors, SimpleError } from "@simonbackx/simple-errors";
4
- import { QueueHandler } from "@stamhoofd/queues";
1
+ import { column, Model } from '@simonbackx/simple-database';
2
+ import { isSimpleError, isSimpleErrors, SimpleError } from '@simonbackx/simple-errors';
3
+ import { QueueHandler } from '@stamhoofd/queues';
5
4
  import { DocumentData, DocumentPrivateSettings, DocumentSettings, DocumentStatus, DocumentTemplatePrivate, RecordAddressAnswer, RecordAnswer, RecordAnswerDecoder, RecordDateAnswer, RecordPriceAnswer, RecordSettings, RecordTextAnswer, RecordType } from '@stamhoofd/structures';
6
- import { Sorter } from "@stamhoofd/utility";
7
- import { v4 as uuidv4 } from "uuid";
5
+ import { Sorter } from '@stamhoofd/utility';
6
+ import { v4 as uuidv4 } from 'uuid';
8
7
 
9
- import { render } from "../helpers/Handlebars";
10
- import { BalanceItem } from "./BalanceItem";
11
- import { Document } from "./Document";
12
- import { Group } from "./Group";
13
- import { Member, RegistrationWithMember } from "./Member";
14
- import { Organization } from "./Organization";
8
+ import { render } from '../helpers/Handlebars';
9
+ import { BalanceItem } from './BalanceItem';
10
+ import { Document } from './Document';
11
+ import { Group } from './Group';
12
+ import { Member, RegistrationWithMember } from './Member';
13
+ import { Organization } from './Organization';
15
14
 
16
15
  export class DocumentTemplate extends Model {
17
- static table = "document_templates";
16
+ static table = 'document_templates';
18
17
 
19
- @column({ primary: true, type: "string", beforeSave(value) {
18
+ @column({ primary: true, type: 'string', beforeSave(value) {
20
19
  return value ?? uuidv4();
21
20
  } })
22
21
  id!: string;
@@ -24,158 +23,158 @@ export class DocumentTemplate extends Model {
24
23
  /**
25
24
  * The HTML that is used to generate the PDF
26
25
  */
27
- @column({ type: "string" })
28
- html: string
26
+ @column({ type: 'string' })
27
+ html: string;
29
28
 
30
- @column({ type: "string"})
31
- organizationId: string
29
+ @column({ type: 'string' })
30
+ organizationId: string;
32
31
 
33
- @column({ type: "string" })
34
- status = DocumentStatus.Draft
32
+ @column({ type: 'string' })
33
+ status = DocumentStatus.Draft;
35
34
 
36
- @column({ type: "boolean" })
37
- updatesEnabled = true
35
+ @column({ type: 'boolean' })
36
+ updatesEnabled = true;
38
37
 
39
38
  /**
40
39
  * Settings of the smart document. This information is public
41
40
  */
42
- @column({ type: "json", decoder: DocumentSettings })
43
- settings: DocumentSettings
41
+ @column({ type: 'json', decoder: DocumentSettings })
42
+ settings: DocumentSettings;
44
43
 
45
44
  /**
46
- *
45
+ *
47
46
  */
48
- @column({ type: "json", decoder: DocumentPrivateSettings })
49
- privateSettings: DocumentPrivateSettings
47
+ @column({ type: 'json', decoder: DocumentPrivateSettings })
48
+ privateSettings: DocumentPrivateSettings;
50
49
 
51
- @column({ type: "datetime" })
52
- createdAt: Date = new Date()
50
+ @column({ type: 'datetime' })
51
+ createdAt: Date = new Date();
53
52
 
54
53
  @column({
55
- type: "datetime", beforeSave() {
56
- const date = new Date()
57
- date.setMilliseconds(0)
58
- return date
54
+ type: 'datetime', beforeSave() {
55
+ const date = new Date();
56
+ date.setMilliseconds(0);
57
+ return date;
59
58
  },
60
- skipUpdate: true
59
+ skipUpdate: true,
61
60
  })
62
- updatedAt: Date
61
+ updatedAt: Date;
63
62
 
64
63
  getPrivateStructure() {
65
- return DocumentTemplatePrivate.create(this)
64
+ return DocumentTemplatePrivate.create(this);
66
65
  }
67
66
 
68
67
  /**
69
68
  * Returns the default answers for a given registration
70
69
  */
71
- async buildAnswers(registration: RegistrationWithMember): Promise<{fieldAnswers: Map<string, RecordAnswer>, missingData: boolean}> {
72
- const fieldAnswers = new Map<string, RecordAnswer>()
73
- let missingData = false
70
+ async buildAnswers(registration: RegistrationWithMember): Promise<{ fieldAnswers: Map<string, RecordAnswer>; missingData: boolean }> {
71
+ const fieldAnswers = new Map<string, RecordAnswer>();
72
+ let missingData = false;
73
+
74
+ const group = await Group.getByID(registration.groupId);
75
+ const { payments } = await BalanceItem.getForRegistration(registration.id);
74
76
 
75
- const group = await Group.getByID(registration.groupId)
76
- const {payments} = await BalanceItem.getForRegistration(registration.id)
77
+ const paidAtDates = payments.flatMap(p => p.paidAt ? [p.paidAt?.getTime()] : []);
77
78
 
78
- const paidAtDates = payments.flatMap(p => p.paidAt ? [p.paidAt?.getTime()] : [])
79
-
80
79
  // We take the minimum date here, because there is a highter change of later paymetns to be for other things than the registration itself
81
- const paidAt = paidAtDates.length ? new Date(Math.min(...paidAtDates)) : null
80
+ const paidAt = paidAtDates.length ? new Date(Math.min(...paidAtDates)) : null;
82
81
 
83
82
  // Some fields are supported by default in linked fields
84
83
  const defaultData: Record<string, RecordAnswer> = {
85
- //"registration.startDate": registration.group.settings.startDate,
86
- //"registration.endDate": registration.group.settings.endDate,
87
- "group.name": RecordTextAnswer.create({
84
+ // "registration.startDate": registration.group.settings.startDate,
85
+ // "registration.endDate": registration.group.settings.endDate,
86
+ 'group.name': RecordTextAnswer.create({
88
87
  settings: RecordSettings.create({
89
- id: "group.name",
88
+ id: 'group.name',
90
89
  type: RecordType.Text,
91
90
  }), // settings will be overwritten
92
- value: group?.settings?.name ?? ""
93
- }),
94
- "registration.startDate": RecordDateAnswer.create({
91
+ value: group?.settings?.name ?? '',
92
+ }),
93
+ 'registration.startDate': RecordDateAnswer.create({
95
94
  settings: RecordSettings.create({
96
- id: "registration.startDate",
95
+ id: 'registration.startDate',
97
96
  type: RecordType.Date,
98
97
  }), // settings will be overwritten
99
- dateValue: group?.settings?.startDate
98
+ dateValue: group?.settings?.startDate,
100
99
  }),
101
- "registration.endDate": RecordDateAnswer.create({
100
+ 'registration.endDate': RecordDateAnswer.create({
102
101
  settings: RecordSettings.create({
103
- id: "registration.endDate",
102
+ id: 'registration.endDate',
104
103
  type: RecordType.Date,
105
104
  }), // settings will be overwritten
106
- dateValue: group?.settings?.endDate
105
+ dateValue: group?.settings?.endDate,
107
106
  }),
108
- "registration.price":
107
+ 'registration.price':
109
108
  RecordPriceAnswer.create({
110
109
  settings: RecordSettings.create({}), // settings will be overwritten
111
- value: registration.price
110
+ value: registration.price,
112
111
  }),
113
- "registration.pricePaid":
112
+ 'registration.pricePaid':
114
113
  RecordPriceAnswer.create({
115
114
  settings: RecordSettings.create({}), // settings will be overwritten
116
- value: registration.pricePaid
115
+ value: registration.pricePaid,
117
116
  }),
118
- "registration.paidAt":
117
+ 'registration.paidAt':
119
118
  RecordDateAnswer.create({
120
119
  settings: RecordSettings.create({
121
- id: "registration.paidAt",
120
+ id: 'registration.paidAt',
122
121
  type: RecordType.Date,
123
122
  }), // settings will be overwritten
124
- dateValue: paidAt
123
+ dateValue: paidAt,
125
124
  }),
126
- "member.firstName": RecordTextAnswer.create({
125
+ 'member.firstName': RecordTextAnswer.create({
127
126
  settings: RecordSettings.create({}), // settings will be overwritten
128
- value: registration.member.details.firstName
127
+ value: registration.member.details.firstName,
129
128
  }),
130
- "member.lastName": RecordTextAnswer.create({
129
+ 'member.lastName': RecordTextAnswer.create({
131
130
  settings: RecordSettings.create({}), // settings will be overwritten
132
- value: registration.member.details.lastName
131
+ value: registration.member.details.lastName,
133
132
  }),
134
- "member.address": RecordAddressAnswer.create({
133
+ 'member.address': RecordAddressAnswer.create({
135
134
  settings: RecordSettings.create({}), // settings will be overwritten
136
- address: registration.member.details.address ?? null
135
+ address: registration.member.details.address ?? null,
137
136
  }),
138
- "member.email": RecordTextAnswer.create({
137
+ 'member.email': RecordTextAnswer.create({
139
138
  settings: RecordSettings.create({}), // settings will be overwritten
140
- value: registration.member.details.email ?? null
139
+ value: registration.member.details.email ?? null,
141
140
  }),
142
- "member.birthDay": RecordDateAnswer.create({
141
+ 'member.birthDay': RecordDateAnswer.create({
143
142
  settings: RecordSettings.create({}), // settings will be overwritten
144
- dateValue: registration.member.details.birthDay
143
+ dateValue: registration.member.details.birthDay,
145
144
  }),
146
- "parents[0].firstName": RecordTextAnswer.create({
145
+ 'parents[0].firstName': RecordTextAnswer.create({
147
146
  settings: RecordSettings.create({}), // settings will be overwritten
148
- value: registration.member.details.parents[0]?.firstName
147
+ value: registration.member.details.parents[0]?.firstName,
149
148
  }),
150
- "parents[0].lastName": RecordTextAnswer.create({
149
+ 'parents[0].lastName': RecordTextAnswer.create({
151
150
  settings: RecordSettings.create({}), // settings will be overwritten
152
- value: registration.member.details.parents[0]?.lastName
151
+ value: registration.member.details.parents[0]?.lastName,
153
152
  }),
154
- "parents[0].address": RecordAddressAnswer.create({
153
+ 'parents[0].address': RecordAddressAnswer.create({
155
154
  settings: RecordSettings.create({}), // settings will be overwritten
156
- address: registration.member.details.parents[0]?.address ?? null
155
+ address: registration.member.details.parents[0]?.address ?? null,
157
156
  }),
158
- "parents[0].email": RecordTextAnswer.create({
157
+ 'parents[0].email': RecordTextAnswer.create({
159
158
  settings: RecordSettings.create({}), // settings will be overwritten
160
- value: registration.member.details.parents[0]?.email ?? null
159
+ value: registration.member.details.parents[0]?.email ?? null,
161
160
  }),
162
- "parents[1].firstName": RecordTextAnswer.create({
161
+ 'parents[1].firstName': RecordTextAnswer.create({
163
162
  settings: RecordSettings.create({}), // settings will be overwritten
164
- value: registration.member.details.parents[1]?.firstName
163
+ value: registration.member.details.parents[1]?.firstName,
165
164
  }),
166
- "parents[1].lastName": RecordTextAnswer.create({
165
+ 'parents[1].lastName': RecordTextAnswer.create({
167
166
  settings: RecordSettings.create({}), // settings will be overwritten
168
- value: registration.member.details.parents[1]?.lastName
167
+ value: registration.member.details.parents[1]?.lastName,
169
168
  }),
170
- "parents[1].address": RecordAddressAnswer.create({
169
+ 'parents[1].address': RecordAddressAnswer.create({
171
170
  settings: RecordSettings.create({}), // settings will be overwritten
172
- address: registration.member.details.parents[1]?.address ?? null
171
+ address: registration.member.details.parents[1]?.address ?? null,
173
172
  }),
174
- "parents[1].email": RecordTextAnswer.create({
173
+ 'parents[1].email': RecordTextAnswer.create({
175
174
  settings: RecordSettings.create({}), // settings will be overwritten
176
- value: registration.member.details.parents[1]?.email ?? null
177
- })
178
- }
175
+ value: registration.member.details.parents[1]?.email ?? null,
176
+ }),
177
+ };
179
178
 
180
179
  // Add data that is different for each member
181
180
  for (const field of this.privateSettings.templateDefinition.documentFieldCategories.flatMap(c => c.getAllRecords())) {
@@ -183,7 +182,7 @@ export class DocumentTemplate extends Model {
183
182
  // - Could either return an id of a recordSetting connected to member
184
183
  // - or an idea of defaultData that is supported by default
185
184
  // The result is always a recordAnswer whose type should match the type of the linkedField
186
- const linkedToMemberAnswerSettingsIds = this.settings.linkedFields.get(field.id)
185
+ const linkedToMemberAnswerSettingsIds = this.settings.linkedFields.get(field.id);
187
186
 
188
187
  let found = false;
189
188
 
@@ -191,14 +190,14 @@ export class DocumentTemplate extends Model {
191
190
  for (const linkedToMemberAnswerSettingsId of linkedToMemberAnswerSettingsIds) {
192
191
  if (linkedToMemberAnswerSettingsId) {
193
192
  const answer = registration.member.details.recordAnswers.get(linkedToMemberAnswerSettingsId);
194
- if (answer && !answer.isEmpty && answer.settings.type === field.type) {
193
+ if (answer && !answer.isEmpty && answer.settings.type === field.type) {
195
194
  // We need to link it with the settings in the template
196
- const clone = answer.clone()
197
- clone.settings = field
198
- clone.reviewedAt = null // All linked fields are not reviewed. Unless they are manually changed by an admin later
199
-
200
- found = true
201
- fieldAnswers.set(field.id, clone)
195
+ const clone = answer.clone();
196
+ clone.settings = field;
197
+ clone.reviewedAt = null; // All linked fields are not reviewed. Unless they are manually changed by an admin later
198
+
199
+ found = true;
200
+ fieldAnswers.set(field.id, clone);
202
201
  break;
203
202
  }
204
203
 
@@ -206,14 +205,15 @@ export class DocumentTemplate extends Model {
206
205
  if (defaultData[linkedToMemberAnswerSettingsId] && !defaultData[linkedToMemberAnswerSettingsId].isEmpty) {
207
206
  if (defaultData[linkedToMemberAnswerSettingsId] instanceof RecordAnswerDecoder.getClassForType(field.type)) {
208
207
  // We need to clone here, because the same default data can be used in multiple places
209
- const clone = defaultData[linkedToMemberAnswerSettingsId].clone()
210
- clone.settings = field
208
+ const clone = defaultData[linkedToMemberAnswerSettingsId].clone();
209
+ clone.settings = field;
211
210
 
212
- found = true
213
- fieldAnswers.set(field.id, clone)
211
+ found = true;
212
+ fieldAnswers.set(field.id, clone);
214
213
  break;
215
- } else {
216
- console.warn("Found type mismatch for default data: " + linkedToMemberAnswerSettingsId + " - " + field.id)
214
+ }
215
+ else {
216
+ console.warn('Found type mismatch for default data: ' + linkedToMemberAnswerSettingsId + ' - ' + field.id);
217
217
  }
218
218
  }
219
219
  }
@@ -228,29 +228,29 @@ export class DocumentTemplate extends Model {
228
228
  // Add placeholder (so we have proper warnings)
229
229
  const clone = RecordAnswerDecoder.getClassForType(field.type).create({
230
230
  settings: field,
231
- })
232
- fieldAnswers.set(field.id, clone)
231
+ });
232
+ fieldAnswers.set(field.id, clone);
233
233
  }
234
234
  }
235
235
 
236
236
  // Add global answers (same for each document)
237
237
  for (const answer of this.settings.fieldAnswers.values()) {
238
238
  // todo: check duplicate
239
- answer.reviewedAt = null
240
- fieldAnswers.set(answer.settings.id, answer)
239
+ answer.reviewedAt = null;
240
+ fieldAnswers.set(answer.settings.id, answer);
241
241
  }
242
242
 
243
243
  // Add group based answers (same for each group)
244
- for (const answer of this.privateSettings.groups.find(g => g.groupId === registration.groupId && g.cycle === registration.cycle)?.fieldAnswers?.values() ?? []){
244
+ for (const answer of this.privateSettings.groups.find(g => g.groupId === registration.groupId && g.cycle === registration.cycle)?.fieldAnswers?.values() ?? []) {
245
245
  // todo: check duplicate
246
- answer.reviewedAt = null
247
- fieldAnswers.set(answer.settings.id, answer)
246
+ answer.reviewedAt = null;
247
+ fieldAnswers.set(answer.settings.id, answer);
248
248
  }
249
249
 
250
250
  // Add other default data
251
251
  for (const key in defaultData) {
252
252
  if (defaultData[key] && defaultData[key].settings.id === key && !fieldAnswers.get(key)) {
253
- fieldAnswers.set(key, defaultData[key])
253
+ fieldAnswers.set(key, defaultData[key]);
254
254
  }
255
255
  }
256
256
 
@@ -258,9 +258,10 @@ export class DocumentTemplate extends Model {
258
258
  if (!missingData) {
259
259
  for (const answer of fieldAnswers.values()) {
260
260
  try {
261
- answer.validate()
262
- } catch (e) {
263
- missingData = true
261
+ answer.validate();
262
+ }
263
+ catch (e) {
264
+ missingData = true;
264
265
  break;
265
266
  }
266
267
  }
@@ -268,33 +269,33 @@ export class DocumentTemplate extends Model {
268
269
 
269
270
  return {
270
271
  fieldAnswers,
271
- missingData
272
- }
272
+ missingData,
273
+ };
273
274
  }
274
275
 
275
276
  async createForRegistrationIfNeeded(registration: RegistrationWithMember) {
276
277
  // Check group and cycle
277
278
  for (const groupDefinition of this.privateSettings.groups) {
278
279
  if (groupDefinition.groupId === registration.groupId && groupDefinition.cycle === registration.cycle) {
279
- const document = await this.generateForRegistration(registration)
280
+ const document = await this.generateForRegistration(registration);
280
281
  if (document) {
281
- await document.save()
282
+ await document.save();
282
283
  }
283
284
  }
284
285
  }
285
286
  }
286
287
 
287
288
  private async generateForRegistration(registration: RegistrationWithMember) {
288
- const {fieldAnswers, missingData} = await this.buildAnswers(registration)
289
- const existingDocuments = await Document.where({ templateId: this.id, registrationId: registration.id }, {limit: 1})
289
+ const { fieldAnswers, missingData } = await this.buildAnswers(registration);
290
+ const existingDocuments = await Document.where({ templateId: this.id, registrationId: registration.id }, { limit: 1 });
290
291
 
291
292
  if (!this.checkIncluded(registration, fieldAnswers)) {
292
293
  if (existingDocuments.length > 0) {
293
294
  for (const document of existingDocuments) {
294
- await document.delete()
295
+ await document.delete();
295
296
  }
296
297
  }
297
- return null
298
+ return null;
298
299
  }
299
300
 
300
301
  const fieldId = 'registration.startDate';
@@ -309,33 +310,34 @@ export class DocumentTemplate extends Model {
309
310
  }
310
311
  }
311
312
 
312
- const group = await Group.getByID(registration.groupId)
313
+ const group = await Group.getByID(registration.groupId);
313
314
  const description = `${registration.member.details.name}, ${group ? group.settings.name : ''}`;
314
315
 
315
316
  if (existingDocuments.length > 0) {
316
317
  for (const document of existingDocuments) {
317
- await this.updateDocumentFor(document, registration)
318
- document.data.name = this.settings.name
319
- document.data.description = description
318
+ await this.updateDocumentFor(document, registration);
319
+ document.data.name = this.settings.name;
320
+ document.data.description = description;
320
321
  if (document.status === DocumentStatus.Draft || document.status === DocumentStatus.Published) {
321
322
  document.status = this.status;
322
323
  }
323
- await document.save()
324
+ await document.save();
324
325
  return document;
325
326
  }
326
- } else {
327
- const document = new Document()
328
- document.organizationId = this.organizationId
329
- document.templateId = this.id
327
+ }
328
+ else {
329
+ const document = new Document();
330
+ document.organizationId = this.organizationId;
331
+ document.templateId = this.id;
330
332
  document.status = missingData ? DocumentStatus.MissingData : this.status;
331
333
  document.data = DocumentData.create({
332
334
  name: this.settings.name,
333
335
  description,
334
- fieldAnswers
335
- })
336
- document.memberId = registration.member.id
337
- document.registrationId = registration.id
338
- await document.save()
336
+ fieldAnswers,
337
+ });
338
+ document.memberId = registration.member.id;
339
+ document.registrationId = registration.id;
340
+ await document.save();
339
341
  return document;
340
342
  }
341
343
  }
@@ -355,18 +357,19 @@ export class DocumentTemplate extends Model {
355
357
  }
356
358
 
357
359
  if (startDate) {
358
- const age = registration.member.details.ageOnDate(startDate)
360
+ const age = registration.member.details.ageOnDate(startDate);
359
361
 
360
362
  if (age === null) {
361
- console.warn("Missing member age checking maxAge")
363
+ console.warn('Missing member age checking maxAge');
362
364
  return false;
363
365
  }
364
366
 
365
367
  if (age > this.settings.maxAge) {
366
368
  return false;
367
369
  }
368
- } else {
369
- console.warn("Missing registration.startDate in fieldAnswers when checking maxAge")
370
+ }
371
+ else {
372
+ console.warn('Missing registration.startDate in fieldAnswers when checking maxAge');
370
373
  }
371
374
  }
372
375
 
@@ -387,19 +390,20 @@ export class DocumentTemplate extends Model {
387
390
  if (price < this.settings.minPrice) {
388
391
  return false;
389
392
  }
390
- } else {
391
- console.warn("Missing registration.price in fieldAnswers when checking minPrice")
393
+ }
394
+ else {
395
+ console.warn('Missing registration.price in fieldAnswers when checking minPrice');
392
396
  }
393
397
  }
394
-
398
+
395
399
  return true;
396
400
  }
397
401
 
398
- async buildAll({generateNumbers = false} = {}) {
399
- return await QueueHandler.schedule("documents-build-all/"+this.id, async () => {
402
+ async buildAll({ generateNumbers = false } = {}) {
403
+ return await QueueHandler.schedule('documents-build-all/' + this.id, async () => {
400
404
  if (!this.updatesEnabled) {
401
405
  // Check status
402
- const documents = await Document.where({ templateId: this.id })
406
+ const documents = await Document.where({ templateId: this.id });
403
407
  for (const document of documents) {
404
408
  if (document.status === DocumentStatus.Draft || document.status === DocumentStatus.Published) {
405
409
  document.status = this.status;
@@ -409,7 +413,7 @@ export class DocumentTemplate extends Model {
409
413
 
410
414
  // Generate numbers for all documents
411
415
  if (generateNumbers) {
412
- let nextNumber = Math.max(0, ...documents.map(d => d.number).filter(n => n !== null) as number[]) + 1
416
+ let nextNumber = Math.max(0, ...documents.map(d => d.number).filter(n => n !== null) as number[]) + 1;
413
417
  for (const document of documents) {
414
418
  if (document.number === null && document.status === DocumentStatus.Published) {
415
419
  document.number = nextNumber;
@@ -418,42 +422,43 @@ export class DocumentTemplate extends Model {
418
422
  }
419
423
  }
420
424
  }
421
- return documents
425
+ return documents;
422
426
  }
423
-
424
- console.log('Building all documents for template', this.id)
425
- const documentSet: Map<string, Document> = new Map()
427
+
428
+ console.log('Building all documents for template', this.id);
429
+ const documentSet: Map<string, Document> = new Map();
426
430
 
427
431
  for (const groupDefinition of this.privateSettings.groups) {
428
432
  // Get the registrations for this group with this cycle
429
- const registrations = await Member.getRegistrationWithMembersForGroup(groupDefinition.groupId)
433
+ const registrations = await Member.getRegistrationWithMembersForGroup(groupDefinition.groupId);
430
434
 
431
435
  for (const registration of registrations) {
432
- const document = await this.generateForRegistration(registration)
436
+ const document = await this.generateForRegistration(registration);
433
437
  if (document) {
434
- documentSet.set(document.id, document)
438
+ documentSet.set(document.id, document);
435
439
  }
436
440
  }
437
441
  }
438
442
 
439
443
  // Delete documents that no longer match and don't have a number yet
440
- const documents = await Document.where({ templateId: this.id })
444
+ const documents = await Document.where({ templateId: this.id });
441
445
  for (const document of documents) {
442
446
  if (!documentSet.has(document.id)) {
443
447
  if (document.number === null) {
444
- await document.delete()
445
- } else {
448
+ await document.delete();
449
+ }
450
+ else {
446
451
  document.status = DocumentStatus.Deleted;
447
452
  await document.save();
448
453
  }
449
454
  }
450
455
  }
451
456
 
452
- const allDocuments = [...documentSet.values()]
457
+ const allDocuments = [...documentSet.values()];
453
458
 
454
459
  // Generate numbers for all documents
455
460
  if (generateNumbers) {
456
- let nextNumber = Math.max(0, ...allDocuments.map(d => d.number).filter(n => n !== null) as number[]) + 1
461
+ let nextNumber = Math.max(0, ...allDocuments.map(d => d.number).filter(n => n !== null) as number[]) + 1;
457
462
  for (const document of allDocuments) {
458
463
  if (document.number === null && document.status === DocumentStatus.Published) {
459
464
  document.number = nextNumber;
@@ -463,51 +468,51 @@ export class DocumentTemplate extends Model {
463
468
  }
464
469
  }
465
470
 
466
- return allDocuments
471
+ return allDocuments;
467
472
  });
468
473
  }
469
474
 
470
475
  private async buildContext(organization: Organization) {
471
476
  // Convert the field answers in a simplified javascript object
472
- const documents = (await this.buildAll({generateNumbers: true})).filter(d => d.status === DocumentStatus.Published && !!d.number).sort((a, b) => Sorter.byNumberValue(b.number ?? 0, a.number ?? 0))
477
+ const documents = (await this.buildAll({ generateNumbers: true })).filter(d => d.status === DocumentStatus.Published && !!d.number).sort((a, b) => Sorter.byNumberValue(b.number ?? 0, a.number ?? 0));
473
478
 
474
479
  // Check numbers are strictly increasing
475
480
  let lastNumber = 0;
476
481
  for (const document of documents) {
477
482
  if (document.number !== lastNumber + 1) {
478
483
  throw new SimpleError({
479
- code: "invalid_document_number",
484
+ code: 'invalid_document_number',
480
485
  message: 'Expected document number to be ' + (lastNumber + 1) + ' but got ' + document.number,
481
- human: "Er ging iets mis bij het nummeren van de documenten (ben je zeker dat je geen documenten hebt verwijderd of toegevoegd sinds de vorige export?). Als je de export nog niet hebt gebruikt in Belcotax kan je de nummering resetten en de export opnieuw proberen.",
482
- })
486
+ human: 'Er ging iets mis bij het nummeren van de documenten (ben je zeker dat je geen documenten hebt verwijderd of toegevoegd sinds de vorige export?). Als je de export nog niet hebt gebruikt in Belcotax kan je de nummering resetten en de export opnieuw proberen.',
487
+ });
483
488
  }
484
489
  lastNumber = document.number;
485
490
  }
486
491
 
487
492
  const data = {
488
- "id": this.id,
489
- "created_at": this.createdAt,
490
- "documents": documents.map(d => d.buildContext(organization)),
493
+ id: this.id,
494
+ created_at: this.createdAt,
495
+ documents: documents.map(d => d.buildContext(organization)),
491
496
  };
492
497
 
493
498
  for (const field of this.settings.fieldAnswers.values()) {
494
- const keys = field.settings.id.split('.')
495
- let current = data
496
- const lastKey = keys.pop()!
499
+ const keys = field.settings.id.split('.');
500
+ let current = data;
501
+ const lastKey = keys.pop()!;
497
502
  if (!lastKey) {
498
- throw new Error("Invalid field id")
503
+ throw new Error('Invalid field id');
499
504
  }
500
505
  for (const key of keys) {
501
506
  if (!current[key]) {
502
- current[key] = {}
507
+ current[key] = {};
503
508
  }
504
- current = current[key]
509
+ current = current[key];
505
510
 
506
- if (typeof current !== "object") {
507
- throw new Error("Invalid field type")
511
+ if (typeof current !== 'object') {
512
+ throw new Error('Invalid field type');
508
513
  }
509
514
  }
510
- current[lastKey] = field.objectValue
515
+ current[lastKey] = field.objectValue;
511
516
  }
512
517
 
513
518
  return data;
@@ -517,31 +522,33 @@ export class DocumentTemplate extends Model {
517
522
  if (!this.privateSettings.templateDefinition.xmlExport) {
518
523
  return null;
519
524
  }
520
-
525
+
521
526
  try {
522
- const context = await this.buildContext(organization)
527
+ const context = await this.buildContext(organization);
523
528
  const renderedHtml = render(this.privateSettings.templateDefinition.xmlExport, context);
524
529
  return renderedHtml;
525
- } catch (e) {
530
+ }
531
+ catch (e) {
526
532
  if (isSimpleError(e) || isSimpleErrors(e)) {
527
533
  throw e;
528
534
  }
529
- console.error('Failed to render document html', e)
535
+ console.error('Failed to render document html', e);
530
536
  return null;
531
537
  }
532
538
  }
533
539
 
534
540
  areAnswersComplete(answers: Map<string, RecordAnswer>) {
535
541
  for (const field of this.privateSettings.templateDefinition.documentFieldCategories.flatMap(c => c.getAllRecords())) {
536
- const answer = answers.get(field.id)
542
+ const answer = answers.get(field.id);
537
543
  if (!answer) {
538
544
  return false;
539
545
  }
540
546
  // Update settings
541
- answer.settings = field
547
+ answer.settings = field;
542
548
  try {
543
- answer.validate()
544
- } catch (e) {
549
+ answer.validate();
550
+ }
551
+ catch (e) {
545
552
  // Invalid
546
553
  return false;
547
554
  }
@@ -550,32 +557,34 @@ export class DocumentTemplate extends Model {
550
557
  }
551
558
 
552
559
  async updateDocumentFor(document: Document, registration: RegistrationWithMember) {
553
- const {fieldAnswers} = await this.buildAnswers(registration)
554
- const existingAnswers = document.data.fieldAnswers
560
+ const { fieldAnswers } = await this.buildAnswers(registration);
561
+ const existingAnswers = document.data.fieldAnswers;
555
562
 
556
- const newAnswers = new Map(existingAnswers)
563
+ const newAnswers = new Map(existingAnswers);
557
564
 
558
565
  for (const addAnswer of fieldAnswers.values()) {
559
- const existing = newAnswers.get(addAnswer.settings.id) //newAnswers.findIndex(a => a.settings.id === addAnswer.settings.id)
566
+ const existing = newAnswers.get(addAnswer.settings.id); // newAnswers.findIndex(a => a.settings.id === addAnswer.settings.id)
560
567
  if (existing) {
561
568
  // We already have an answer for this field, we'll only update it if addAnswer is reviewed later
562
569
  if (!existing.isReviewedAfter(addAnswer)) {
563
- newAnswers.set(addAnswer.settings.id, addAnswer)
570
+ newAnswers.set(addAnswer.settings.id, addAnswer);
564
571
  }
565
- } else {
566
- newAnswers.set(addAnswer.settings.id, addAnswer)
572
+ }
573
+ else {
574
+ newAnswers.set(addAnswer.settings.id, addAnswer);
567
575
  }
568
576
  }
569
577
 
570
- document.data.fieldAnswers = newAnswers
571
- const complete = this.areAnswersComplete(newAnswers)
578
+ document.data.fieldAnswers = newAnswers;
579
+ const complete = this.areAnswersComplete(newAnswers);
572
580
 
573
581
  if (document.status !== DocumentStatus.Deleted) {
574
582
  if (!complete) {
575
- document.status = DocumentStatus.MissingData
576
- } else {
583
+ document.status = DocumentStatus.MissingData;
584
+ }
585
+ else {
577
586
  if (document.status === DocumentStatus.MissingData) {
578
- document.status = this.status
587
+ document.status = this.status;
579
588
  }
580
589
  }
581
590
  }