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