@stamhoofd/structures 2.4.0 → 2.6.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 (275) hide show
  1. package/dist/index.d.ts +1 -7
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +1 -7
  4. package/dist/index.js.map +1 -1
  5. package/dist/src/BalanceItemDetailed.d.ts +11 -3
  6. package/dist/src/BalanceItemDetailed.d.ts.map +1 -1
  7. package/dist/src/BalanceItemDetailed.js +15 -7
  8. package/dist/src/BalanceItemDetailed.js.map +1 -1
  9. package/dist/src/DefaultAgeGroup.d.ts +2 -0
  10. package/dist/src/DefaultAgeGroup.d.ts.map +1 -1
  11. package/dist/src/DefaultAgeGroup.js +8 -0
  12. package/dist/src/DefaultAgeGroup.js.map +1 -1
  13. package/dist/src/Event.d.ts +13 -2
  14. package/dist/src/Event.d.ts.map +1 -1
  15. package/dist/src/Event.js +36 -3
  16. package/dist/src/Event.js.map +1 -1
  17. package/dist/src/Group.d.ts +10 -0
  18. package/dist/src/Group.d.ts.map +1 -1
  19. package/dist/src/Group.js +17 -2
  20. package/dist/src/Group.js.map +1 -1
  21. package/dist/src/GroupSettings.d.ts +59 -6
  22. package/dist/src/GroupSettings.d.ts.map +1 -1
  23. package/dist/src/GroupSettings.js +201 -16
  24. package/dist/src/GroupSettings.js.map +1 -1
  25. package/dist/src/Organization.js +2 -2
  26. package/dist/src/Organization.js.map +1 -1
  27. package/dist/src/RegistrationPeriod.d.ts +1 -0
  28. package/dist/src/RegistrationPeriod.d.ts.map +1 -1
  29. package/dist/src/RegistrationPeriod.js +3 -0
  30. package/dist/src/RegistrationPeriod.js.map +1 -1
  31. package/dist/src/StockReservation.d.ts +20 -0
  32. package/dist/src/StockReservation.d.ts.map +1 -0
  33. package/dist/src/StockReservation.js +91 -0
  34. package/dist/src/StockReservation.js.map +1 -0
  35. package/dist/src/Version.d.ts +1 -1
  36. package/dist/src/Version.js +1 -1
  37. package/dist/src/addresses/Address.d.ts +4 -0
  38. package/dist/src/addresses/Address.d.ts.map +1 -1
  39. package/dist/src/addresses/Address.js +6 -0
  40. package/dist/src/addresses/Address.js.map +1 -1
  41. package/dist/src/billing/STPackageBundle.js +6 -6
  42. package/dist/src/billing/STPackageBundle.js.map +1 -1
  43. package/dist/src/email/EditorSmartVariable.d.ts.map +1 -1
  44. package/dist/src/email/EditorSmartVariable.js +6 -11
  45. package/dist/src/email/EditorSmartVariable.js.map +1 -1
  46. package/dist/src/members/Member.d.ts +7 -0
  47. package/dist/src/members/Member.d.ts.map +1 -1
  48. package/dist/src/members/Member.js +34 -1
  49. package/dist/src/members/Member.js.map +1 -1
  50. package/dist/src/members/MemberDetails.d.ts +8 -8
  51. package/dist/src/members/MemberDetails.d.ts.map +1 -1
  52. package/dist/src/members/MemberDetails.js +85 -42
  53. package/dist/src/members/MemberDetails.js.map +1 -1
  54. package/dist/src/members/MemberPlatformMembership.d.ts +1 -0
  55. package/dist/src/members/MemberPlatformMembership.d.ts.map +1 -1
  56. package/dist/src/members/MemberPlatformMembership.js +3 -0
  57. package/dist/src/members/MemberPlatformMembership.js.map +1 -1
  58. package/dist/src/members/OrganizationRecordsConfiguration.d.ts +13 -0
  59. package/dist/src/members/OrganizationRecordsConfiguration.d.ts.map +1 -1
  60. package/dist/src/members/OrganizationRecordsConfiguration.js +49 -0
  61. package/dist/src/members/OrganizationRecordsConfiguration.js.map +1 -1
  62. package/dist/src/members/PaymentDetailed.d.ts +3 -0
  63. package/dist/src/members/PaymentDetailed.d.ts.map +1 -1
  64. package/dist/src/members/PaymentDetailed.js +7 -8
  65. package/dist/src/members/PaymentDetailed.js.map +1 -1
  66. package/dist/src/members/PaymentGeneral.d.ts +5 -2
  67. package/dist/src/members/PaymentGeneral.d.ts.map +1 -1
  68. package/dist/src/members/PaymentGeneral.js +3 -5
  69. package/dist/src/members/PaymentGeneral.js.map +1 -1
  70. package/dist/src/members/PlatformMember.d.ts +9 -6
  71. package/dist/src/members/PlatformMember.d.ts.map +1 -1
  72. package/dist/src/members/PlatformMember.js +50 -35
  73. package/dist/src/members/PlatformMember.js.map +1 -1
  74. package/dist/src/members/Registration.d.ts +12 -0
  75. package/dist/src/members/Registration.d.ts.map +1 -1
  76. package/dist/src/members/Registration.js +17 -3
  77. package/dist/src/members/Registration.js.map +1 -1
  78. package/dist/src/members/RegistrationWithMember.d.ts +3 -2
  79. package/dist/src/members/RegistrationWithMember.d.ts.map +1 -1
  80. package/dist/src/members/RegistrationWithMember.js +7 -1
  81. package/dist/src/members/RegistrationWithMember.js.map +1 -1
  82. package/dist/src/members/checkout/BalanceItemCartItem.d.ts +3 -1
  83. package/dist/src/members/checkout/BalanceItemCartItem.d.ts.map +1 -1
  84. package/dist/src/members/checkout/BalanceItemCartItem.js +11 -9
  85. package/dist/src/members/checkout/BalanceItemCartItem.js.map +1 -1
  86. package/dist/src/members/checkout/RegisterCart.d.ts +17 -1
  87. package/dist/src/members/checkout/RegisterCart.d.ts.map +1 -1
  88. package/dist/src/members/checkout/RegisterCart.js +121 -12
  89. package/dist/src/members/checkout/RegisterCart.js.map +1 -1
  90. package/dist/src/members/checkout/RegisterCheckout.d.ts +46 -3
  91. package/dist/src/members/checkout/RegisterCheckout.d.ts.map +1 -1
  92. package/dist/src/members/checkout/RegisterCheckout.js +85 -4
  93. package/dist/src/members/checkout/RegisterCheckout.js.map +1 -1
  94. package/dist/src/members/checkout/RegisterItem.d.ts +57 -16
  95. package/dist/src/members/checkout/RegisterItem.d.ts.map +1 -1
  96. package/dist/src/members/checkout/RegisterItem.js +394 -126
  97. package/dist/src/members/checkout/RegisterItem.js.map +1 -1
  98. package/dist/src/members/records/RecordCategory.d.ts +1 -0
  99. package/dist/src/members/records/RecordCategory.d.ts.map +1 -1
  100. package/dist/src/members/records/RecordCategory.js +3 -0
  101. package/dist/src/members/records/RecordCategory.js.map +1 -1
  102. package/esm/dist/index.d.ts +1 -7
  103. package/esm/dist/index.d.ts.map +1 -1
  104. package/esm/dist/index.js +1 -7
  105. package/esm/dist/index.js.map +1 -1
  106. package/esm/dist/src/BalanceItemDetailed.d.ts +11 -3
  107. package/esm/dist/src/BalanceItemDetailed.d.ts.map +1 -1
  108. package/esm/dist/src/BalanceItemDetailed.js +15 -7
  109. package/esm/dist/src/BalanceItemDetailed.js.map +1 -1
  110. package/esm/dist/src/DefaultAgeGroup.d.ts +2 -0
  111. package/esm/dist/src/DefaultAgeGroup.d.ts.map +1 -1
  112. package/esm/dist/src/DefaultAgeGroup.js +8 -0
  113. package/esm/dist/src/DefaultAgeGroup.js.map +1 -1
  114. package/esm/dist/src/Event.d.ts +13 -2
  115. package/esm/dist/src/Event.d.ts.map +1 -1
  116. package/esm/dist/src/Event.js +34 -2
  117. package/esm/dist/src/Event.js.map +1 -1
  118. package/esm/dist/src/Group.d.ts +10 -0
  119. package/esm/dist/src/Group.d.ts.map +1 -1
  120. package/esm/dist/src/Group.js +18 -3
  121. package/esm/dist/src/Group.js.map +1 -1
  122. package/esm/dist/src/GroupSettings.d.ts +59 -6
  123. package/esm/dist/src/GroupSettings.d.ts.map +1 -1
  124. package/esm/dist/src/GroupSettings.js +201 -16
  125. package/esm/dist/src/GroupSettings.js.map +1 -1
  126. package/esm/dist/src/Organization.js +2 -2
  127. package/esm/dist/src/Organization.js.map +1 -1
  128. package/esm/dist/src/RegistrationPeriod.d.ts +1 -0
  129. package/esm/dist/src/RegistrationPeriod.d.ts.map +1 -1
  130. package/esm/dist/src/RegistrationPeriod.js +3 -0
  131. package/esm/dist/src/RegistrationPeriod.js.map +1 -1
  132. package/esm/dist/src/StockReservation.d.ts +20 -0
  133. package/esm/dist/src/StockReservation.d.ts.map +1 -0
  134. package/esm/dist/src/StockReservation.js +87 -0
  135. package/esm/dist/src/StockReservation.js.map +1 -0
  136. package/esm/dist/src/Version.d.ts +1 -1
  137. package/esm/dist/src/Version.js +1 -1
  138. package/esm/dist/src/addresses/Address.d.ts +4 -0
  139. package/esm/dist/src/addresses/Address.d.ts.map +1 -1
  140. package/esm/dist/src/addresses/Address.js +6 -0
  141. package/esm/dist/src/addresses/Address.js.map +1 -1
  142. package/esm/dist/src/billing/STPackageBundle.js +6 -6
  143. package/esm/dist/src/billing/STPackageBundle.js.map +1 -1
  144. package/esm/dist/src/email/EditorSmartVariable.d.ts.map +1 -1
  145. package/esm/dist/src/email/EditorSmartVariable.js +7 -12
  146. package/esm/dist/src/email/EditorSmartVariable.js.map +1 -1
  147. package/esm/dist/src/members/Member.d.ts +7 -0
  148. package/esm/dist/src/members/Member.d.ts.map +1 -1
  149. package/esm/dist/src/members/Member.js +32 -0
  150. package/esm/dist/src/members/Member.js.map +1 -1
  151. package/esm/dist/src/members/MemberDetails.d.ts +8 -8
  152. package/esm/dist/src/members/MemberDetails.d.ts.map +1 -1
  153. package/esm/dist/src/members/MemberDetails.js +85 -42
  154. package/esm/dist/src/members/MemberDetails.js.map +1 -1
  155. package/esm/dist/src/members/MemberPlatformMembership.d.ts +1 -0
  156. package/esm/dist/src/members/MemberPlatformMembership.d.ts.map +1 -1
  157. package/esm/dist/src/members/MemberPlatformMembership.js +3 -0
  158. package/esm/dist/src/members/MemberPlatformMembership.js.map +1 -1
  159. package/esm/dist/src/members/OrganizationRecordsConfiguration.d.ts +13 -0
  160. package/esm/dist/src/members/OrganizationRecordsConfiguration.d.ts.map +1 -1
  161. package/esm/dist/src/members/OrganizationRecordsConfiguration.js +49 -0
  162. package/esm/dist/src/members/OrganizationRecordsConfiguration.js.map +1 -1
  163. package/esm/dist/src/members/PaymentDetailed.d.ts +3 -0
  164. package/esm/dist/src/members/PaymentDetailed.d.ts.map +1 -1
  165. package/esm/dist/src/members/PaymentDetailed.js +7 -8
  166. package/esm/dist/src/members/PaymentDetailed.js.map +1 -1
  167. package/esm/dist/src/members/PaymentGeneral.d.ts +5 -2
  168. package/esm/dist/src/members/PaymentGeneral.d.ts.map +1 -1
  169. package/esm/dist/src/members/PaymentGeneral.js +3 -5
  170. package/esm/dist/src/members/PaymentGeneral.js.map +1 -1
  171. package/esm/dist/src/members/PlatformMember.d.ts +9 -6
  172. package/esm/dist/src/members/PlatformMember.d.ts.map +1 -1
  173. package/esm/dist/src/members/PlatformMember.js +50 -35
  174. package/esm/dist/src/members/PlatformMember.js.map +1 -1
  175. package/esm/dist/src/members/Registration.d.ts +12 -0
  176. package/esm/dist/src/members/Registration.d.ts.map +1 -1
  177. package/esm/dist/src/members/Registration.js +18 -4
  178. package/esm/dist/src/members/Registration.js.map +1 -1
  179. package/esm/dist/src/members/RegistrationWithMember.d.ts +3 -2
  180. package/esm/dist/src/members/RegistrationWithMember.d.ts.map +1 -1
  181. package/esm/dist/src/members/RegistrationWithMember.js +8 -2
  182. package/esm/dist/src/members/RegistrationWithMember.js.map +1 -1
  183. package/esm/dist/src/members/checkout/BalanceItemCartItem.d.ts +3 -1
  184. package/esm/dist/src/members/checkout/BalanceItemCartItem.d.ts.map +1 -1
  185. package/esm/dist/src/members/checkout/BalanceItemCartItem.js +11 -9
  186. package/esm/dist/src/members/checkout/BalanceItemCartItem.js.map +1 -1
  187. package/esm/dist/src/members/checkout/RegisterCart.d.ts +17 -1
  188. package/esm/dist/src/members/checkout/RegisterCart.d.ts.map +1 -1
  189. package/esm/dist/src/members/checkout/RegisterCart.js +122 -13
  190. package/esm/dist/src/members/checkout/RegisterCart.js.map +1 -1
  191. package/esm/dist/src/members/checkout/RegisterCheckout.d.ts +46 -3
  192. package/esm/dist/src/members/checkout/RegisterCheckout.d.ts.map +1 -1
  193. package/esm/dist/src/members/checkout/RegisterCheckout.js +86 -5
  194. package/esm/dist/src/members/checkout/RegisterCheckout.js.map +1 -1
  195. package/esm/dist/src/members/checkout/RegisterItem.d.ts +57 -16
  196. package/esm/dist/src/members/checkout/RegisterItem.d.ts.map +1 -1
  197. package/esm/dist/src/members/checkout/RegisterItem.js +396 -128
  198. package/esm/dist/src/members/checkout/RegisterItem.js.map +1 -1
  199. package/esm/dist/src/members/records/RecordCategory.d.ts +1 -0
  200. package/esm/dist/src/members/records/RecordCategory.d.ts.map +1 -1
  201. package/esm/dist/src/members/records/RecordCategory.js +3 -0
  202. package/esm/dist/src/members/records/RecordCategory.js.map +1 -1
  203. package/package.json +2 -2
  204. package/dist/src/GroupPrices.d.ts +0 -44
  205. package/dist/src/GroupPrices.d.ts.map +0 -1
  206. package/dist/src/GroupPrices.js +0 -119
  207. package/dist/src/GroupPrices.js.map +0 -1
  208. package/dist/src/members/MemberWithRegistrations.d.ts +0 -52
  209. package/dist/src/members/MemberWithRegistrations.d.ts.map +0 -1
  210. package/dist/src/members/MemberWithRegistrations.js +0 -156
  211. package/dist/src/members/MemberWithRegistrations.js.map +0 -1
  212. package/dist/src/members/checkout/OldRegisterCart.d.ts +0 -50
  213. package/dist/src/members/checkout/OldRegisterCart.d.ts.map +0 -1
  214. package/dist/src/members/checkout/OldRegisterCart.js +0 -207
  215. package/dist/src/members/checkout/OldRegisterCart.js.map +0 -1
  216. package/dist/src/members/checkout/OldRegisterCartPriceCalculator.d.ts +0 -36
  217. package/dist/src/members/checkout/OldRegisterCartPriceCalculator.d.ts.map +0 -1
  218. package/dist/src/members/checkout/OldRegisterCartPriceCalculator.js +0 -339
  219. package/dist/src/members/checkout/OldRegisterCartPriceCalculator.js.map +0 -1
  220. package/dist/src/members/checkout/OldRegisterCartValidator.d.ts +0 -35
  221. package/dist/src/members/checkout/OldRegisterCartValidator.d.ts.map +0 -1
  222. package/dist/src/members/checkout/OldRegisterCartValidator.js +0 -309
  223. package/dist/src/members/checkout/OldRegisterCartValidator.js.map +0 -1
  224. package/dist/src/members/checkout/OldRegisterCheckout.d.ts +0 -22
  225. package/dist/src/members/checkout/OldRegisterCheckout.d.ts.map +0 -1
  226. package/dist/src/members/checkout/OldRegisterCheckout.js +0 -46
  227. package/dist/src/members/checkout/OldRegisterCheckout.js.map +0 -1
  228. package/dist/src/members/checkout/OldRegisterItem.d.ts +0 -46
  229. package/dist/src/members/checkout/OldRegisterItem.d.ts.map +0 -1
  230. package/dist/src/members/checkout/OldRegisterItem.js +0 -89
  231. package/dist/src/members/checkout/OldRegisterItem.js.map +0 -1
  232. package/dist/src/members/checkout/RegisterCartPriceCalculator.test.d.ts +0 -2
  233. package/dist/src/members/checkout/RegisterCartPriceCalculator.test.d.ts.map +0 -1
  234. package/dist/src/members/checkout/RegisterCartPriceCalculator.test.js +0 -1076
  235. package/dist/src/members/checkout/RegisterCartPriceCalculator.test.js.map +0 -1
  236. package/dist/src/members/checkout/UnknownMemberWithRegistrations.d.ts +0 -23
  237. package/dist/src/members/checkout/UnknownMemberWithRegistrations.d.ts.map +0 -1
  238. package/dist/src/members/checkout/UnknownMemberWithRegistrations.js +0 -3
  239. package/dist/src/members/checkout/UnknownMemberWithRegistrations.js.map +0 -1
  240. package/esm/dist/src/GroupPrices.d.ts +0 -44
  241. package/esm/dist/src/GroupPrices.d.ts.map +0 -1
  242. package/esm/dist/src/GroupPrices.js +0 -114
  243. package/esm/dist/src/GroupPrices.js.map +0 -1
  244. package/esm/dist/src/members/MemberWithRegistrations.d.ts +0 -52
  245. package/esm/dist/src/members/MemberWithRegistrations.d.ts.map +0 -1
  246. package/esm/dist/src/members/MemberWithRegistrations.js +0 -152
  247. package/esm/dist/src/members/MemberWithRegistrations.js.map +0 -1
  248. package/esm/dist/src/members/checkout/OldRegisterCart.d.ts +0 -50
  249. package/esm/dist/src/members/checkout/OldRegisterCart.d.ts.map +0 -1
  250. package/esm/dist/src/members/checkout/OldRegisterCart.js +0 -202
  251. package/esm/dist/src/members/checkout/OldRegisterCart.js.map +0 -1
  252. package/esm/dist/src/members/checkout/OldRegisterCartPriceCalculator.d.ts +0 -36
  253. package/esm/dist/src/members/checkout/OldRegisterCartPriceCalculator.d.ts.map +0 -1
  254. package/esm/dist/src/members/checkout/OldRegisterCartPriceCalculator.js +0 -334
  255. package/esm/dist/src/members/checkout/OldRegisterCartPriceCalculator.js.map +0 -1
  256. package/esm/dist/src/members/checkout/OldRegisterCartValidator.d.ts +0 -35
  257. package/esm/dist/src/members/checkout/OldRegisterCartValidator.d.ts.map +0 -1
  258. package/esm/dist/src/members/checkout/OldRegisterCartValidator.js +0 -305
  259. package/esm/dist/src/members/checkout/OldRegisterCartValidator.js.map +0 -1
  260. package/esm/dist/src/members/checkout/OldRegisterCheckout.d.ts +0 -22
  261. package/esm/dist/src/members/checkout/OldRegisterCheckout.d.ts.map +0 -1
  262. package/esm/dist/src/members/checkout/OldRegisterCheckout.js +0 -41
  263. package/esm/dist/src/members/checkout/OldRegisterCheckout.js.map +0 -1
  264. package/esm/dist/src/members/checkout/OldRegisterItem.d.ts +0 -46
  265. package/esm/dist/src/members/checkout/OldRegisterItem.d.ts.map +0 -1
  266. package/esm/dist/src/members/checkout/OldRegisterItem.js +0 -84
  267. package/esm/dist/src/members/checkout/OldRegisterItem.js.map +0 -1
  268. package/esm/dist/src/members/checkout/RegisterCartPriceCalculator.test.d.ts +0 -2
  269. package/esm/dist/src/members/checkout/RegisterCartPriceCalculator.test.d.ts.map +0 -1
  270. package/esm/dist/src/members/checkout/RegisterCartPriceCalculator.test.js +0 -1074
  271. package/esm/dist/src/members/checkout/RegisterCartPriceCalculator.test.js.map +0 -1
  272. package/esm/dist/src/members/checkout/UnknownMemberWithRegistrations.d.ts +0 -23
  273. package/esm/dist/src/members/checkout/UnknownMemberWithRegistrations.d.ts.map +0 -1
  274. package/esm/dist/src/members/checkout/UnknownMemberWithRegistrations.js +0 -2
  275. package/esm/dist/src/members/checkout/UnknownMemberWithRegistrations.js.map +0 -1
@@ -1,9 +1,10 @@
1
1
  import { __decorate } from "tslib";
2
- import { AutoEncoder, BooleanDecoder, field, IntegerDecoder, StringDecoder } from "@simonbackx/simple-encoding";
3
- import { isSimpleError, isSimpleErrors, SimpleError } from "@simonbackx/simple-errors";
4
- import { Formatter } from "@stamhoofd/utility";
5
- import { GroupOption, GroupOptionMenu, GroupPrice, WaitingListType } from "../../GroupSettings";
2
+ import { ArrayDecoder, AutoEncoder, field, IntegerDecoder, StringDecoder } from "@simonbackx/simple-encoding";
3
+ import { isSimpleError, isSimpleErrors, SimpleError, SimpleErrors } from "@simonbackx/simple-errors";
6
4
  import { v4 as uuidv4 } from "uuid";
5
+ import { GroupType } from "../../Group";
6
+ import { GroupOption, GroupOptionMenu, GroupPrice, WaitingListType } from "../../GroupSettings";
7
+ import { StockReservation } from "../../StockReservation";
7
8
  export class RegisterItemOption extends AutoEncoder {
8
9
  constructor() {
9
10
  super(...arguments);
@@ -20,8 +21,12 @@ __decorate([
20
21
  field({ decoder: IntegerDecoder })
21
22
  ], RegisterItemOption.prototype, "amount", void 0);
22
23
  export class IDRegisterItem extends AutoEncoder {
24
+ constructor() {
25
+ super(...arguments);
26
+ this.options = [];
27
+ }
23
28
  hydrate(context) {
24
- return RegisterItem.fromId(this, context.family);
29
+ return RegisterItem.fromId(this, context);
25
30
  }
26
31
  }
27
32
  __decorate([
@@ -37,35 +42,118 @@ __decorate([
37
42
  field({ decoder: StringDecoder })
38
43
  ], IDRegisterItem.prototype, "organizationId", void 0);
39
44
  __decorate([
40
- field({ decoder: BooleanDecoder })
41
- ], IDRegisterItem.prototype, "waitingList", void 0);
45
+ field({ decoder: GroupPrice })
46
+ ], IDRegisterItem.prototype, "groupPrice", void 0);
47
+ __decorate([
48
+ field({ decoder: new ArrayDecoder(RegisterItemOption) })
49
+ ], IDRegisterItem.prototype, "options", void 0);
42
50
  export class RegisterItem {
43
- static fromRegistration(registration, member) {
51
+ /**
52
+ * @deprecated
53
+ */
54
+ get waitingList() {
55
+ return false;
56
+ }
57
+ static fromRegistration(registration, member, organization) {
44
58
  return new RegisterItem({
45
59
  id: registration.id,
46
60
  member,
47
61
  group: registration.group,
48
- waitingList: registration.waitingList
62
+ organization
49
63
  });
50
64
  }
51
65
  constructor(data) {
52
- var _a, _b;
66
+ var _a, _b, _c, _d, _e;
53
67
  this.options = [];
54
- this.waitingList = false;
55
68
  this.calculatedPrice = 0;
69
+ /**
70
+ * These registrations will be replaced as part of this new registration (moving or updating a registration is possible this way)
71
+ */
72
+ this.replaceRegistrations = [];
73
+ /**
74
+ * Show an error in the cart for recovery
75
+ */
76
+ this.cartError = null;
56
77
  this.id = (_a = data.id) !== null && _a !== void 0 ? _a : uuidv4();
57
78
  this.member = data.member;
58
79
  this.group = data.group;
59
- this.groupPrice = (_b = this.group.settings.prices[0]) !== null && _b !== void 0 ? _b : GroupPrice.create({});
60
- this.waitingList = data.waitingList;
80
+ this.groupPrice = (_c = (_b = data.groupPrice) !== null && _b !== void 0 ? _b : this.group.settings.prices[0]) !== null && _c !== void 0 ? _c : GroupPrice.create({ name: 'Ongeldig tarief', id: '' });
81
+ this.organization = data.organization;
82
+ this.options = (_d = data.options) !== null && _d !== void 0 ? _d : [];
83
+ this.replaceRegistrations = (_e = data.replaceRegistrations) !== null && _e !== void 0 ? _e : [];
84
+ // Select all defaults
85
+ for (const optionMenu of this.group.settings.optionMenus) {
86
+ if (!optionMenu.multipleChoice) {
87
+ if (this.options.find(o => o.optionMenu.id === optionMenu.id)) {
88
+ continue;
89
+ }
90
+ this.options.push(RegisterItemOption.create({
91
+ option: optionMenu.options[0],
92
+ optionMenu: optionMenu,
93
+ amount: 1
94
+ }));
95
+ }
96
+ }
97
+ }
98
+ get isInCart() {
99
+ return this.member.family.checkout.cart.contains(this);
100
+ }
101
+ get showItemView() {
102
+ return this.shouldUseWaitingList() || this.group.settings.prices.length > 1 || this.group.settings.optionMenus.length > 0 || (!this.isInCart && !this.isValid);
103
+ }
104
+ calculatePrice() {
105
+ this.calculatedPrice = this.groupPrice.price.forMember(this.member);
106
+ for (const option of this.options) {
107
+ this.calculatedPrice += option.option.price.forMember(this.member) * option.amount;
108
+ }
109
+ for (const registration of this.replaceRegistrations) {
110
+ this.calculatedPrice -= registration.price;
111
+ }
112
+ }
113
+ clone() {
114
+ return new RegisterItem({
115
+ id: this.id,
116
+ member: this.member,
117
+ group: this.group,
118
+ organization: this.organization,
119
+ groupPrice: this.groupPrice.clone(),
120
+ options: this.options.map(o => o.clone())
121
+ });
122
+ }
123
+ copyFrom(item) {
124
+ this.groupPrice = item.groupPrice.clone();
125
+ this.options = item.options.map(o => o.clone());
126
+ this.calculatedPrice = item.calculatedPrice;
127
+ }
128
+ getFilteredPrices() {
129
+ return this.group.settings.prices.filter(p => {
130
+ if (p.hidden && !this.checkout.isAdminFromSameOrganization) {
131
+ return false;
132
+ }
133
+ return true;
134
+ });
135
+ }
136
+ getFilteredOptionMenus() {
137
+ return this.group.settings.optionMenus.filter(p => {
138
+ return this.getFilteredOptions(p).length > 0;
139
+ });
140
+ }
141
+ getFilteredOptions(menu) {
142
+ return menu.options.filter(p => {
143
+ if (p.hidden && !this.checkout.isAdminFromSameOrganization) {
144
+ return false;
145
+ }
146
+ return true;
147
+ });
61
148
  }
62
149
  convert() {
63
150
  return IDRegisterItem.create({
64
151
  id: this.id,
65
152
  memberId: this.member.member.id,
66
153
  groupId: this.group.id,
67
- organizationId: this.group.organizationId,
68
- waitingList: this.waitingList
154
+ organizationId: this.organization.id,
155
+ groupPrice: this.groupPrice,
156
+ options: this.options
69
157
  });
70
158
  }
71
159
  get memberId() {
@@ -84,36 +172,101 @@ export class RegisterItem {
84
172
  get checkout() {
85
173
  return this.family.checkout;
86
174
  }
87
- static defaultFor(member, group) {
88
- const item = new RegisterItem({
175
+ static defaultFor(member, group, organization) {
176
+ if (group.organizationId !== organization.id) {
177
+ throw new Error("Group and organization do not match in RegisterItem.defaultFor");
178
+ }
179
+ let item = new RegisterItem({
89
180
  member,
90
181
  group,
91
- waitingList: false
182
+ organization
92
183
  });
93
- item.waitingList = item.shouldUseWaitingList();
184
+ if (item.shouldUseWaitingList() && group.waitingList) {
185
+ group = group.waitingList;
186
+ item = RegisterItem.defaultFor(member, group, organization);
187
+ }
94
188
  return item;
95
189
  }
96
- get organization() {
97
- return this.member.organizations.find(o => o.id === this.group.organizationId);
98
- }
99
190
  /**
100
191
  * Update self to the newest available data, and throw error if something failed (only after refreshing other ones)
101
192
  */
102
- refresh() {
103
- // todo
193
+ refresh(group) {
194
+ this.group = group;
195
+ const errors = new SimpleErrors();
196
+ if (this.group.settings.prices.length === 0) {
197
+ errors.addError(new SimpleError({
198
+ code: "product_unavailable",
199
+ message: "Product unavailable",
200
+ human: "Er is iets fout met de tariefinstellingen van " + this.group.settings.name + ", waardoor je nu niet kan inschrijven. Neem contact op met een beheerder en vraag de tariefinstellingen na te kijken."
201
+ }));
202
+ }
203
+ else {
204
+ const groupPrice = this.group.settings.prices.find(p => p.id === this.groupPrice.id);
205
+ if (!groupPrice) {
206
+ errors.addError(new SimpleError({
207
+ code: "product_unavailable",
208
+ message: "Product unavailable",
209
+ human: "Eén of meerdere tarieven van " + this.group.settings.name + " zijn niet meer beschikbaar"
210
+ }));
211
+ }
212
+ else {
213
+ this.groupPrice = groupPrice;
214
+ }
215
+ }
216
+ // Check all options
217
+ const remainingMenus = this.group.settings.optionMenus.slice();
218
+ for (const o of this.options) {
219
+ let index = remainingMenus.findIndex(m => m.id === o.optionMenu.id);
220
+ if (index == -1) {
221
+ // Check if it has a multiple choice one
222
+ index = this.group.settings.optionMenus.findIndex(m => m.id === o.optionMenu.id);
223
+ errors.addError(new SimpleError({
224
+ code: "option_menu_unavailable",
225
+ message: "Option menu unavailable",
226
+ human: "Eén of meerdere keuzemogelijkheden van " + this.group.settings.name + " zijn niet meer beschikbaar"
227
+ }));
228
+ continue;
229
+ }
230
+ const menu = remainingMenus[index];
231
+ if (!menu.multipleChoice) {
232
+ // Already used: not possible to add another
233
+ remainingMenus.splice(index, 1)[0];
234
+ }
235
+ const option = menu.options.find(m => m.id === o.option.id);
236
+ if (!option) {
237
+ errors.addError(new SimpleError({
238
+ code: "option_unavailable",
239
+ message: "Option unavailable",
240
+ human: "Eén of meerdere keuzemogelijkheden van " + this.group.settings.name + " zijn niet meer beschikbaar"
241
+ }));
242
+ continue;
243
+ }
244
+ // Update to latest data
245
+ o.optionMenu = menu;
246
+ o.option = option;
247
+ }
248
+ if (remainingMenus.filter(m => !m.multipleChoice).length > 0) {
249
+ errors.addError(new SimpleError({
250
+ code: "missing_menu",
251
+ message: "Missing menu's " + remainingMenus.filter(m => !m.multipleChoice).map(m => m.name).join(", "),
252
+ human: "Er zijn nieuwe keuzemogelijkheden voor " + this.group.settings.name + " waaruit je moet kiezen"
253
+ }));
254
+ }
255
+ errors.throwIfNotEmpty();
104
256
  }
105
257
  isAlreadyRegistered() {
106
- return !!this.member.member.registrations.find(r => r.groupId === this.group.id && (this.waitingList || r.registeredAt !== null) && r.deactivatedAt === null && r.waitingList === this.waitingList && r.cycle === this.group.cycle);
258
+ return !!this.member.member.registrations.find(r => r.groupId === this.group.id && r.registeredAt !== null && r.deactivatedAt === null);
107
259
  }
108
260
  hasReachedCategoryMaximum() {
261
+ if (this.group.type !== GroupType.Membership) {
262
+ return false;
263
+ }
109
264
  const parents = this.group.getParentCategories(this.organization.period.settings.categories, false);
110
265
  for (const parent of parents) {
111
266
  if (parent.settings.maximumRegistrations !== null) {
112
- const count = this.member.member.registrations.filter(r => {
113
- if (r.registeredAt !== null && !r.waitingList && r.deactivatedAt === null && parent.groupIds.includes(r.groupId)) {
114
- // Check cycle (only count current periods, not previous periods)
115
- const g = this.organization.groups.find(gg => gg.id === r.groupId);
116
- return g && g.cycle === r.cycle;
267
+ const count = this.member.patchedMember.registrations.filter(r => {
268
+ if (r.registeredAt !== null && r.deactivatedAt === null && parent.groupIds.includes(r.groupId)) {
269
+ return true;
117
270
  }
118
271
  return false;
119
272
  }).length;
@@ -128,51 +281,73 @@ export class RegisterItem {
128
281
  return false;
129
282
  }
130
283
  isInvited() {
131
- return !!this.member.member.registrations.find(r => r.groupId === this.group.id && r.waitingList && r.canRegister && r.cycle === this.group.cycle);
284
+ return !!this.member.member.registrations.find(r => r.groupId === this.group.id && r.registeredAt === null && r.canRegister);
132
285
  }
133
286
  doesMeetRequireGroupIds() {
134
287
  if (this.group.settings.requireGroupIds.length > 0) {
135
288
  const hasGroup = this.member.member.registrations.find(r => {
136
- const registrationGroup = this.organization.groups.find(g => g.id === r.groupId);
137
- if (!registrationGroup) {
138
- return false;
139
- }
140
- return this.group.settings.requireGroupIds.includes(r.groupId) && r.registeredAt !== null && r.deactivatedAt === null && !r.waitingList && r.cycle === registrationGroup.cycle;
289
+ return r.registeredAt !== null && r.deactivatedAt === null && this.group.settings.requireGroupIds.includes(r.groupId);
290
+ });
291
+ if (!hasGroup && !this.checkout.cart.items.find(item => item.member.id === this.member.id && this.group.settings.requireGroupIds.includes(item.group.id))) {
292
+ return false;
293
+ }
294
+ }
295
+ if (this.group.settings.requireDefaultAgeGroupIds.length > 0) {
296
+ const hasGroup = this.member.member.registrations.find(r => {
297
+ return r.registeredAt !== null && r.deactivatedAt === null && r.group.defaultAgeGroupId && this.group.settings.requireDefaultAgeGroupIds.includes(r.group.defaultAgeGroupId);
141
298
  });
142
- if (!hasGroup && !this.checkout.cart.items.find(item => this.group.settings.requireGroupIds.includes(item.group.id) && item.member.member.id === this.member.member.id && !item.waitingList)) {
299
+ if (!hasGroup && !this.checkout.cart.items.find(item => item.member.id === this.member.id && item.group.defaultAgeGroupId && this.group.settings.requireDefaultAgeGroupIds.includes(item.group.defaultAgeGroupId))) {
143
300
  return false;
144
301
  }
145
302
  }
146
303
  return true;
147
304
  }
148
- isExistingMemberOrFamily() {
149
- return this.member.isExistingMember(this.group.organizationId) || (this.group.settings.priorityForFamily && !!this.family.members.find(f => f.isExistingMember(this.group.organizationId)));
305
+ doesMeetRequireOrganizationIds() {
306
+ if (this.group.settings.requireOrganizationIds.length > 0) {
307
+ const hasGroup = this.member.member.registrations.find(r => {
308
+ return r.group.type === GroupType.Membership && this.group.settings.requireOrganizationIds.includes(r.organizationId) && r.registeredAt !== null && r.deactivatedAt === null;
309
+ });
310
+ if (!hasGroup && !this.checkout.cart.items.find(item => item.member.id === this.member.id && this.group.settings.requireOrganizationIds.includes(item.organization.id))) {
311
+ return false;
312
+ }
313
+ }
314
+ return true;
150
315
  }
151
- get rowLabel() {
152
- if (this.isInvited()) {
153
- return 'Uitnodiging';
316
+ doesMeetRequireOrganizationTags() {
317
+ if (this.group.settings.requireOrganizationTags.length > 0) {
318
+ const hasOrganization = this.member.filterOrganizations({ currentPeriod: true, types: [GroupType.Membership] }).find(organization => {
319
+ return organization.meta.matchTags(this.group.settings.requireOrganizationTags);
320
+ });
321
+ if (!hasOrganization && !this.checkout.cart.items.find(item => item.member.id === this.member.id && item.organization.meta.matchTags(this.group.settings.requireOrganizationTags))) {
322
+ return false;
323
+ }
154
324
  }
155
- return null;
325
+ return true;
156
326
  }
157
- get infoDescription() {
158
- if (this.isInvited()) {
159
- return 'Je bent uitgenodigd om in te schrijven voor deze groep';
327
+ doesMeetRequirePlatformMembershipOn() {
328
+ if (this.group.settings.requirePlatformMembershipOn !== null) {
329
+ const requirePlatformMembershipOn = this.group.settings.requirePlatformMembershipOn;
330
+ return !!this.member.patchedMember.platformMemberships.find(m => m.isActive(requirePlatformMembershipOn));
160
331
  }
161
- if (this.waitingList) {
162
- if (this.group.settings.waitingListType === WaitingListType.All) {
163
- return 'Je kan enkel inschrijven voor de wachtlijst';
164
- }
165
- const existingMember = this.isExistingMemberOrFamily();
166
- if (this.group.settings.waitingListType === WaitingListType.ExistingMembersFirst && !existingMember) {
167
- return 'Nieuwe leden kunnen enkel inschrijven voor de wachtlijst';
168
- }
169
- if (this.group.settings.waitingListIfFull) {
170
- if (this.hasReachedGroupMaximum()) {
171
- return 'De inschrijvingen zijn volzet, je kan enkel inschrijven voor de wachtlijst';
172
- }
332
+ return true;
333
+ }
334
+ isExistingMemberOrFamily() {
335
+ return this.member.isExistingMember(this.group.organizationId) || (this.group.settings.priorityForFamily && !!this.family.members.find(f => f.isExistingMember(this.group.organizationId)));
336
+ }
337
+ get description() {
338
+ const descriptions = [];
339
+ if (this.replaceRegistrations.length > 0) {
340
+ for (const registration of this.replaceRegistrations) {
341
+ descriptions.push("Verplaatsen vanaf " + registration.group.settings.name);
173
342
  }
174
343
  }
175
- return null;
344
+ if (this.getFilteredPrices().length > 1) {
345
+ descriptions.push(this.groupPrice.name);
346
+ }
347
+ for (const option of this.options) {
348
+ descriptions.push(option.optionMenu.name + ': ' + option.option.name + (option.option.allowAmount ? ` x ${option.amount}` : ""));
349
+ }
350
+ return descriptions.filter(d => !!d).join("\n");
176
351
  }
177
352
  shouldUseWaitingList() {
178
353
  if (this.group.settings.waitingListType === WaitingListType.All) {
@@ -182,7 +357,7 @@ export class RegisterItem {
182
357
  if (this.group.settings.waitingListType === WaitingListType.ExistingMembersFirst && !existingMember) {
183
358
  return true;
184
359
  }
185
- if (this.group.settings.waitingListIfFull) {
360
+ if (this.group.waitingList) {
186
361
  if (this.hasReachedGroupMaximum()) {
187
362
  return true;
188
363
  }
@@ -216,14 +391,53 @@ export class RegisterItem {
216
391
  }
217
392
  return null;
218
393
  }
219
- validate() {
394
+ get validationWarning() {
395
+ if (this.validationError) {
396
+ return null;
397
+ }
398
+ if (!this.member.family.checkout.isAdminFromSameOrganization) {
399
+ // Warnings are only for admins
400
+ return null;
401
+ }
402
+ try {
403
+ this.validate({ warnings: true });
404
+ }
405
+ catch (e) {
406
+ if (isSimpleError(e) || isSimpleErrors(e)) {
407
+ return e.getHuman();
408
+ }
409
+ throw e;
410
+ }
411
+ return null;
412
+ }
413
+ get isValid() {
414
+ return this.validationError === null;
415
+ }
416
+ validate(options) {
220
417
  var _a;
221
- if (!this.checkout.cart.contains(this)) {
222
- if (!this.checkout.cart.canAdd(this)) {
418
+ this.cartError = null;
419
+ this.refresh(this.group);
420
+ const checkout = this.member.family.checkout;
421
+ const admin = checkout.isAdminFromSameOrganization && !(options === null || options === void 0 ? void 0 : options.warnings);
422
+ if (this.group.organizationId !== this.organization.id) {
423
+ throw new Error("Group and organization do not match in RegisterItem.validate");
424
+ }
425
+ for (const registration of this.replaceRegistrations) {
426
+ // todo: check if you are allowed to move
427
+ if (registration.member.id !== this.member.id) {
223
428
  throw new SimpleError({
224
- code: "already_registered",
225
- message: "Already registered",
226
- human: `Reken jouw winkelmandje eerst af. Het is niet mogelijk om deze inschrijving samen af te rekenen omdat het inschrijvingsgeld aan een andere partij betaald moet worden.`
429
+ code: "invalid_move",
430
+ message: "Invalid member in replaceRegistration",
431
+ human: "Je wilt een inschrijving verplaatsen van een ander lid in ruil voor een ander lid. Dit is niet toegestaan.",
432
+ field: "replaceRegistrations"
433
+ });
434
+ }
435
+ if (registration.group.organizationId !== this.organization.id) {
436
+ throw new SimpleError({
437
+ code: "invalid_move",
438
+ message: "Invalid organization in replaceRegistration",
439
+ human: "Je wilt een inschrijving verplaatsen van een andere organisatie. Dit is niet toegestaan.",
440
+ field: "replaceRegistrations"
227
441
  });
228
442
  }
229
443
  }
@@ -240,95 +454,107 @@ export class RegisterItem {
240
454
  throw new SimpleError({
241
455
  code: "maximum_reached",
242
456
  message: "Maximum reached",
243
- human: `Je kan niet meer inschrijven voor ${this.group.settings.name} omdat je al ingeschreven bent of aan het inschrijven bent voor een groep die je niet kan combineren.`
457
+ human: `Je kan niet meer inschrijven voor ${this.group.settings.name} omdat ${this.member.patchedMember.name} al ingeschreven is voor een groep die je niet kan combineren.`
244
458
  });
245
459
  }
246
460
  // Check if we have an invite (doesn't matter if registrations are closed)
247
461
  if (this.isInvited()) {
248
462
  return;
249
463
  }
250
- if (this.group.notYetOpen) {
251
- throw new SimpleError({
252
- code: "not_yet_open",
253
- message: "Not yet open",
254
- human: `De inschrijvingen voor ${this.group.settings.name} zijn nog niet geopend.`
255
- });
256
- }
257
- if (this.group.closed) {
258
- throw new SimpleError({
259
- code: "closed",
260
- message: "Closed",
261
- human: `De inschrijvingen voor ${this.group.settings.name} zijn gesloten.`
262
- });
263
- }
264
- // Check if it fits
265
- if (this.member.member.details) {
266
- if (!this.member.member.details.doesMatchGroup(this.group)) {
267
- const error = this.member.member.details.getMatchingError(this.group);
464
+ if (!admin) {
465
+ if (this.group.notYetOpen) {
268
466
  throw new SimpleError({
269
- code: "not_matching",
270
- message: "Not matching",
271
- human: (_a = error === null || error === void 0 ? void 0 : error.description) !== null && _a !== void 0 ? _a : "Je voldoet niet aan de voorwaarden om in te schrijven voor deze groep."
467
+ code: "not_yet_open",
468
+ message: "Not yet open",
469
+ human: `De inschrijvingen voor ${this.group.settings.name} zijn nog niet geopend.`
272
470
  });
273
471
  }
274
- }
275
- // Check if registrations are limited
276
- if (!this.doesMeetRequireGroupIds()) {
277
- throw new SimpleError({
278
- code: "not_matching",
279
- message: "Not matching",
280
- human: "Inschrijving bij " + Formatter.joinLast(this.group.settings.requireGroupIds.map(id => { var _a, _b; return (_b = (_a = this.organization.groups.find(g => g.id === id)) === null || _a === void 0 ? void 0 : _a.settings.name) !== null && _b !== void 0 ? _b : "Onbekend"; }), ", ", " of ") + " is verplicht voor je kan inschrijven voor " + this.group.settings.name,
281
- });
282
- }
283
- const existingMember = this.isExistingMemberOrFamily();
284
- // Pre registrations?
285
- if (this.group.activePreRegistrationDate) {
286
- if (!existingMember) {
472
+ if (this.group.closed) {
287
473
  throw new SimpleError({
288
- code: "pre_registrations",
289
- message: "Pre registrations",
290
- human: "Momenteel zijn de voorinschrijvingen nog bezig voor " + this.group.settings.name + ". Dit is enkel voor bestaande leden" + (this.group.settings.priorityForFamily ? " en hun broers/zussen" : "") + "."
474
+ code: "closed",
475
+ message: "Closed",
476
+ human: `De inschrijvingen voor ${this.group.settings.name} zijn gesloten.`
291
477
  });
292
478
  }
293
- }
294
- if (!this.waitingList && this.shouldUseWaitingList()) {
295
- throw new SimpleError({
296
- code: "waiting_list_required",
297
- message: "Waiting list required",
298
- human: `${this.member.member.firstName} kan momenteel enkel voor de wachtlijst van ${this.group.settings.name} inschrijven.`
299
- });
300
- }
301
- if (!this.waitingList) {
302
- if (!this.group.settings.waitingListIfFull) {
303
- if (this.hasReachedGroupMaximum()) {
479
+ // Check if it fits
480
+ if (this.member.member.details) {
481
+ if (!this.member.member.details.doesMatchGroup(this.group)) {
482
+ const error = this.member.member.details.getMatchingError(this.group);
304
483
  throw new SimpleError({
305
- code: "maximum_reached",
306
- message: "Maximum reached",
307
- human: `De inschrijvingen voor ${this.group.settings.name} zijn volzet. Je kan wel nog inschrijven voor de wachtlijst.`
484
+ code: "not_matching",
485
+ message: "Not matching: memberDetails",
486
+ human: (_a = error === null || error === void 0 ? void 0 : error.description) !== null && _a !== void 0 ? _a : `${this.member.patchedMember.name} voldoet niet aan de voorwaarden om in te schrijven voor deze groep.`
308
487
  });
309
488
  }
310
489
  }
311
- else {
312
- if (this.hasReachedGroupMaximum()) {
490
+ // Check if registrations are limited
491
+ if (!this.doesMeetRequireGroupIds()) {
492
+ throw new SimpleError({
493
+ code: "not_matching",
494
+ message: "Not matching: requireGroupIds",
495
+ human: `${this.member.patchedMember.name} voldoet niet aan de voorwaarden om in te schrijven voor deze groep.`
496
+ });
497
+ }
498
+ if (!this.doesMeetRequireOrganizationIds()) {
499
+ throw new SimpleError({
500
+ code: "not_matching",
501
+ message: "Not matching: requireOrganizationIds",
502
+ human: `${this.member.patchedMember.name} kan pas inschrijven met een geldige actieve inschrijving.`
503
+ });
504
+ }
505
+ if (!this.doesMeetRequireOrganizationTags()) {
506
+ throw new SimpleError({
507
+ code: "not_matching",
508
+ message: "Not matching: requireOrganizationIds",
509
+ human: `${this.member.patchedMember.name} kan pas inschrijven met een geldige actieve inschrijving.`
510
+ });
511
+ }
512
+ if (!this.doesMeetRequirePlatformMembershipOn()) {
513
+ throw new SimpleError({
514
+ code: "not_matching",
515
+ message: "Not matching: requirePlatformMembershipOn",
516
+ human: `${this.member.patchedMember.name} kan pas inschrijven met een geldige aansluiting (en dus verzekering) bij de koepel`
517
+ });
518
+ }
519
+ const existingMember = this.isExistingMemberOrFamily();
520
+ // Pre registrations?
521
+ if (this.group.activePreRegistrationDate) {
522
+ if (!existingMember) {
313
523
  throw new SimpleError({
314
- code: "maximum_reached",
315
- message: "Maximum reached",
316
- human: `De inschrijvingen voor ${this.group.settings.name} zijn volzet.`
524
+ code: "pre_registrations",
525
+ message: "Pre registrations",
526
+ human: "Momenteel zijn de voorinschrijvingen nog bezig voor " + this.group.settings.name + ". Dit is enkel voor bestaande leden" + (this.group.settings.priorityForFamily ? " en hun broers/zussen" : "") + "."
317
527
  });
318
528
  }
319
529
  }
530
+ if (this.shouldUseWaitingList()) {
531
+ throw new SimpleError({
532
+ code: "waiting_list_required",
533
+ message: "Waiting list required",
534
+ human: `${this.member.member.firstName} kan momenteel enkel voor de wachtlijst van ${this.group.settings.name} inschrijven.`,
535
+ meta: { recoverable: true }
536
+ });
537
+ }
538
+ if (this.hasReachedGroupMaximum()) {
539
+ throw new SimpleError({
540
+ code: "maximum_reached",
541
+ message: "Maximum reached",
542
+ human: this.group.waitingList ? `De inschrijvingen voor ${this.group.settings.name} zijn volzet. Je kan wel nog inschrijven voor de wachtlijst.` : `De inschrijvingen voor ${this.group.settings.name} zijn volzet. `,
543
+ meta: { recoverable: true }
544
+ });
545
+ }
320
546
  }
321
547
  }
322
- static fromId(idRegisterItem, family) {
323
- const member = family.members.find(m => m.member.id === idRegisterItem.memberId);
548
+ static fromId(idRegisterItem, context) {
549
+ const member = context.members.find(m => m.member.id === idRegisterItem.memberId);
324
550
  if (!member) {
325
551
  throw new Error("Member not found: " + idRegisterItem.memberId);
326
552
  }
327
- const organization = member.organizations.find(o => o.id === idRegisterItem.organizationId);
553
+ const organization = context.organizations.find(o => o.id === idRegisterItem.organizationId);
328
554
  if (!organization) {
329
555
  throw new Error("Organization not found: " + idRegisterItem.organizationId);
330
556
  }
331
- const group = organization.groups.find(g => g.id === idRegisterItem.groupId);
557
+ const group = context.groups.find(g => g.id === idRegisterItem.groupId);
332
558
  if (!group) {
333
559
  throw new Error("Group not found: " + idRegisterItem.groupId);
334
560
  }
@@ -336,7 +562,9 @@ export class RegisterItem {
336
562
  id: idRegisterItem.id,
337
563
  member,
338
564
  group,
339
- waitingList: idRegisterItem.waitingList
565
+ organization,
566
+ groupPrice: idRegisterItem.groupPrice,
567
+ options: idRegisterItem.options
340
568
  });
341
569
  }
342
570
  get paymentConfiguration() {
@@ -345,5 +573,45 @@ export class RegisterItem {
345
573
  }
346
574
  return this.organization.meta.registrationPaymentConfiguration;
347
575
  }
576
+ /**
577
+ * Returns the stock that will be taken (or freed if negative) by all the register items before this item
578
+ * and with the removed registrations freed up, so this can be negative
579
+ */
580
+ getCartPendingStockReservations() {
581
+ const deleteRegistrations = this.checkout.cart.deleteRegistrations.filter(r => r.groupId === this.group.id);
582
+ const cartIndex = this.checkout.cart.items.findIndex(i => i.id === this.id);
583
+ const itemsBefore = this.checkout.cart.items.slice(0, cartIndex === -1 ? undefined : cartIndex);
584
+ return StockReservation.removed(itemsBefore.flatMap(i => i.getPendingStockReservations()), // these will be removed
585
+ deleteRegistrations.flatMap(r => r.stockReservations) // these will be freed up
586
+ );
587
+ }
588
+ /**
589
+ * Stock that will be taken by this item
590
+ */
591
+ getPendingStockReservations() {
592
+ return [
593
+ // Global level stock reservations (stored in each group)
594
+ StockReservation.create({
595
+ objectId: this.group.id,
596
+ objectType: 'Group',
597
+ amount: 1,
598
+ children: [
599
+ // Group level stock reservatiosn (stored in the group)
600
+ StockReservation.create({
601
+ objectId: this.groupPrice.id,
602
+ objectType: 'GroupPrice',
603
+ amount: 1
604
+ }),
605
+ ...this.options.map(o => {
606
+ return StockReservation.create({
607
+ objectId: o.option.id,
608
+ objectType: 'GroupOption',
609
+ amount: o.amount
610
+ });
611
+ })
612
+ ]
613
+ })
614
+ ];
615
+ }
348
616
  }
349
617
  //# sourceMappingURL=RegisterItem.js.map