@stamhoofd/structures 2.5.0 → 2.7.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 (251) 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/Event.d.ts +2 -1
  10. package/dist/src/Event.d.ts.map +1 -1
  11. package/dist/src/Event.js +7 -3
  12. package/dist/src/Event.js.map +1 -1
  13. package/dist/src/Group.d.ts +5 -0
  14. package/dist/src/Group.d.ts.map +1 -1
  15. package/dist/src/Group.js +8 -1
  16. package/dist/src/Group.js.map +1 -1
  17. package/dist/src/GroupSettings.d.ts +58 -19
  18. package/dist/src/GroupSettings.d.ts.map +1 -1
  19. package/dist/src/GroupSettings.js +188 -34
  20. package/dist/src/GroupSettings.js.map +1 -1
  21. package/dist/src/RegistrationPeriod.d.ts +1 -0
  22. package/dist/src/RegistrationPeriod.d.ts.map +1 -1
  23. package/dist/src/RegistrationPeriod.js +3 -0
  24. package/dist/src/RegistrationPeriod.js.map +1 -1
  25. package/dist/src/StockReservation.d.ts +20 -0
  26. package/dist/src/StockReservation.d.ts.map +1 -0
  27. package/dist/src/StockReservation.js +91 -0
  28. package/dist/src/StockReservation.js.map +1 -0
  29. package/dist/src/Version.d.ts +1 -1
  30. package/dist/src/Version.js +1 -1
  31. package/dist/src/addresses/Address.d.ts +4 -0
  32. package/dist/src/addresses/Address.d.ts.map +1 -1
  33. package/dist/src/addresses/Address.js +6 -0
  34. package/dist/src/addresses/Address.js.map +1 -1
  35. package/dist/src/email/EditorSmartVariable.d.ts.map +1 -1
  36. package/dist/src/email/EditorSmartVariable.js +7 -11
  37. package/dist/src/email/EditorSmartVariable.js.map +1 -1
  38. package/dist/src/email/Email.d.ts +4 -3
  39. package/dist/src/email/Email.d.ts.map +1 -1
  40. package/dist/src/email/Email.js +5 -4
  41. package/dist/src/email/Email.js.map +1 -1
  42. package/dist/src/members/Member.d.ts +7 -0
  43. package/dist/src/members/Member.d.ts.map +1 -1
  44. package/dist/src/members/Member.js +34 -1
  45. package/dist/src/members/Member.js.map +1 -1
  46. package/dist/src/members/MemberDetails.d.ts +8 -11
  47. package/dist/src/members/MemberDetails.d.ts.map +1 -1
  48. package/dist/src/members/MemberDetails.js +92 -51
  49. package/dist/src/members/MemberDetails.js.map +1 -1
  50. package/dist/src/members/MemberPlatformMembership.d.ts +1 -0
  51. package/dist/src/members/MemberPlatformMembership.d.ts.map +1 -1
  52. package/dist/src/members/MemberPlatformMembership.js +3 -0
  53. package/dist/src/members/MemberPlatformMembership.js.map +1 -1
  54. package/dist/src/members/MemberWithRegistrationsBlob.d.ts +1 -1
  55. package/dist/src/members/MemberWithRegistrationsBlob.d.ts.map +1 -1
  56. package/dist/src/members/MemberWithRegistrationsBlob.js +35 -12
  57. package/dist/src/members/MemberWithRegistrationsBlob.js.map +1 -1
  58. package/dist/src/members/PaymentDetailed.d.ts +3 -0
  59. package/dist/src/members/PaymentDetailed.d.ts.map +1 -1
  60. package/dist/src/members/PaymentDetailed.js +7 -8
  61. package/dist/src/members/PaymentDetailed.js.map +1 -1
  62. package/dist/src/members/PaymentGeneral.d.ts +5 -2
  63. package/dist/src/members/PaymentGeneral.d.ts.map +1 -1
  64. package/dist/src/members/PaymentGeneral.js +3 -5
  65. package/dist/src/members/PaymentGeneral.js.map +1 -1
  66. package/dist/src/members/PlatformMember.d.ts +6 -2
  67. package/dist/src/members/PlatformMember.d.ts.map +1 -1
  68. package/dist/src/members/PlatformMember.js +68 -18
  69. package/dist/src/members/PlatformMember.js.map +1 -1
  70. package/dist/src/members/Registration.d.ts +12 -0
  71. package/dist/src/members/Registration.d.ts.map +1 -1
  72. package/dist/src/members/Registration.js +18 -3
  73. package/dist/src/members/Registration.js.map +1 -1
  74. package/dist/src/members/RegistrationWithMember.d.ts +3 -2
  75. package/dist/src/members/RegistrationWithMember.d.ts.map +1 -1
  76. package/dist/src/members/RegistrationWithMember.js +7 -1
  77. package/dist/src/members/RegistrationWithMember.js.map +1 -1
  78. package/dist/src/members/checkout/BalanceItemCartItem.d.ts +3 -1
  79. package/dist/src/members/checkout/BalanceItemCartItem.d.ts.map +1 -1
  80. package/dist/src/members/checkout/BalanceItemCartItem.js +11 -9
  81. package/dist/src/members/checkout/BalanceItemCartItem.js.map +1 -1
  82. package/dist/src/members/checkout/RegisterCart.d.ts +16 -2
  83. package/dist/src/members/checkout/RegisterCart.d.ts.map +1 -1
  84. package/dist/src/members/checkout/RegisterCart.js +95 -17
  85. package/dist/src/members/checkout/RegisterCart.js.map +1 -1
  86. package/dist/src/members/checkout/RegisterCheckout.d.ts +19 -0
  87. package/dist/src/members/checkout/RegisterCheckout.d.ts.map +1 -1
  88. package/dist/src/members/checkout/RegisterCheckout.js +38 -1
  89. package/dist/src/members/checkout/RegisterCheckout.js.map +1 -1
  90. package/dist/src/members/checkout/RegisterItem.d.ts +37 -19
  91. package/dist/src/members/checkout/RegisterItem.d.ts.map +1 -1
  92. package/dist/src/members/checkout/RegisterItem.js +283 -118
  93. package/dist/src/members/checkout/RegisterItem.js.map +1 -1
  94. package/esm/dist/index.d.ts +1 -7
  95. package/esm/dist/index.d.ts.map +1 -1
  96. package/esm/dist/index.js +1 -7
  97. package/esm/dist/index.js.map +1 -1
  98. package/esm/dist/src/BalanceItemDetailed.d.ts +11 -3
  99. package/esm/dist/src/BalanceItemDetailed.d.ts.map +1 -1
  100. package/esm/dist/src/BalanceItemDetailed.js +15 -7
  101. package/esm/dist/src/BalanceItemDetailed.js.map +1 -1
  102. package/esm/dist/src/Event.d.ts +2 -1
  103. package/esm/dist/src/Event.d.ts.map +1 -1
  104. package/esm/dist/src/Event.js +7 -3
  105. package/esm/dist/src/Event.js.map +1 -1
  106. package/esm/dist/src/Group.d.ts +5 -0
  107. package/esm/dist/src/Group.d.ts.map +1 -1
  108. package/esm/dist/src/Group.js +9 -2
  109. package/esm/dist/src/Group.js.map +1 -1
  110. package/esm/dist/src/GroupSettings.d.ts +58 -19
  111. package/esm/dist/src/GroupSettings.d.ts.map +1 -1
  112. package/esm/dist/src/GroupSettings.js +188 -34
  113. package/esm/dist/src/GroupSettings.js.map +1 -1
  114. package/esm/dist/src/RegistrationPeriod.d.ts +1 -0
  115. package/esm/dist/src/RegistrationPeriod.d.ts.map +1 -1
  116. package/esm/dist/src/RegistrationPeriod.js +3 -0
  117. package/esm/dist/src/RegistrationPeriod.js.map +1 -1
  118. package/esm/dist/src/StockReservation.d.ts +20 -0
  119. package/esm/dist/src/StockReservation.d.ts.map +1 -0
  120. package/esm/dist/src/StockReservation.js +87 -0
  121. package/esm/dist/src/StockReservation.js.map +1 -0
  122. package/esm/dist/src/Version.d.ts +1 -1
  123. package/esm/dist/src/Version.js +1 -1
  124. package/esm/dist/src/addresses/Address.d.ts +4 -0
  125. package/esm/dist/src/addresses/Address.d.ts.map +1 -1
  126. package/esm/dist/src/addresses/Address.js +6 -0
  127. package/esm/dist/src/addresses/Address.js.map +1 -1
  128. package/esm/dist/src/email/EditorSmartVariable.d.ts.map +1 -1
  129. package/esm/dist/src/email/EditorSmartVariable.js +8 -12
  130. package/esm/dist/src/email/EditorSmartVariable.js.map +1 -1
  131. package/esm/dist/src/email/Email.d.ts +4 -3
  132. package/esm/dist/src/email/Email.d.ts.map +1 -1
  133. package/esm/dist/src/email/Email.js +5 -4
  134. package/esm/dist/src/email/Email.js.map +1 -1
  135. package/esm/dist/src/members/Member.d.ts +7 -0
  136. package/esm/dist/src/members/Member.d.ts.map +1 -1
  137. package/esm/dist/src/members/Member.js +32 -0
  138. package/esm/dist/src/members/Member.js.map +1 -1
  139. package/esm/dist/src/members/MemberDetails.d.ts +8 -11
  140. package/esm/dist/src/members/MemberDetails.d.ts.map +1 -1
  141. package/esm/dist/src/members/MemberDetails.js +92 -51
  142. package/esm/dist/src/members/MemberDetails.js.map +1 -1
  143. package/esm/dist/src/members/MemberPlatformMembership.d.ts +1 -0
  144. package/esm/dist/src/members/MemberPlatformMembership.d.ts.map +1 -1
  145. package/esm/dist/src/members/MemberPlatformMembership.js +3 -0
  146. package/esm/dist/src/members/MemberPlatformMembership.js.map +1 -1
  147. package/esm/dist/src/members/MemberWithRegistrationsBlob.d.ts +1 -1
  148. package/esm/dist/src/members/MemberWithRegistrationsBlob.d.ts.map +1 -1
  149. package/esm/dist/src/members/MemberWithRegistrationsBlob.js +35 -12
  150. package/esm/dist/src/members/MemberWithRegistrationsBlob.js.map +1 -1
  151. package/esm/dist/src/members/PaymentDetailed.d.ts +3 -0
  152. package/esm/dist/src/members/PaymentDetailed.d.ts.map +1 -1
  153. package/esm/dist/src/members/PaymentDetailed.js +7 -8
  154. package/esm/dist/src/members/PaymentDetailed.js.map +1 -1
  155. package/esm/dist/src/members/PaymentGeneral.d.ts +5 -2
  156. package/esm/dist/src/members/PaymentGeneral.d.ts.map +1 -1
  157. package/esm/dist/src/members/PaymentGeneral.js +3 -5
  158. package/esm/dist/src/members/PaymentGeneral.js.map +1 -1
  159. package/esm/dist/src/members/PlatformMember.d.ts +6 -2
  160. package/esm/dist/src/members/PlatformMember.d.ts.map +1 -1
  161. package/esm/dist/src/members/PlatformMember.js +68 -18
  162. package/esm/dist/src/members/PlatformMember.js.map +1 -1
  163. package/esm/dist/src/members/Registration.d.ts +12 -0
  164. package/esm/dist/src/members/Registration.d.ts.map +1 -1
  165. package/esm/dist/src/members/Registration.js +19 -4
  166. package/esm/dist/src/members/Registration.js.map +1 -1
  167. package/esm/dist/src/members/RegistrationWithMember.d.ts +3 -2
  168. package/esm/dist/src/members/RegistrationWithMember.d.ts.map +1 -1
  169. package/esm/dist/src/members/RegistrationWithMember.js +8 -2
  170. package/esm/dist/src/members/RegistrationWithMember.js.map +1 -1
  171. package/esm/dist/src/members/checkout/BalanceItemCartItem.d.ts +3 -1
  172. package/esm/dist/src/members/checkout/BalanceItemCartItem.d.ts.map +1 -1
  173. package/esm/dist/src/members/checkout/BalanceItemCartItem.js +11 -9
  174. package/esm/dist/src/members/checkout/BalanceItemCartItem.js.map +1 -1
  175. package/esm/dist/src/members/checkout/RegisterCart.d.ts +16 -2
  176. package/esm/dist/src/members/checkout/RegisterCart.d.ts.map +1 -1
  177. package/esm/dist/src/members/checkout/RegisterCart.js +96 -18
  178. package/esm/dist/src/members/checkout/RegisterCart.js.map +1 -1
  179. package/esm/dist/src/members/checkout/RegisterCheckout.d.ts +19 -0
  180. package/esm/dist/src/members/checkout/RegisterCheckout.d.ts.map +1 -1
  181. package/esm/dist/src/members/checkout/RegisterCheckout.js +38 -1
  182. package/esm/dist/src/members/checkout/RegisterCheckout.js.map +1 -1
  183. package/esm/dist/src/members/checkout/RegisterItem.d.ts +37 -19
  184. package/esm/dist/src/members/checkout/RegisterItem.d.ts.map +1 -1
  185. package/esm/dist/src/members/checkout/RegisterItem.js +283 -118
  186. package/esm/dist/src/members/checkout/RegisterItem.js.map +1 -1
  187. package/package.json +2 -2
  188. package/dist/src/members/MemberWithRegistrations.d.ts +0 -52
  189. package/dist/src/members/MemberWithRegistrations.d.ts.map +0 -1
  190. package/dist/src/members/MemberWithRegistrations.js +0 -156
  191. package/dist/src/members/MemberWithRegistrations.js.map +0 -1
  192. package/dist/src/members/checkout/OldRegisterCart.d.ts +0 -50
  193. package/dist/src/members/checkout/OldRegisterCart.d.ts.map +0 -1
  194. package/dist/src/members/checkout/OldRegisterCart.js +0 -207
  195. package/dist/src/members/checkout/OldRegisterCart.js.map +0 -1
  196. package/dist/src/members/checkout/OldRegisterCartPriceCalculator.d.ts +0 -36
  197. package/dist/src/members/checkout/OldRegisterCartPriceCalculator.d.ts.map +0 -1
  198. package/dist/src/members/checkout/OldRegisterCartPriceCalculator.js +0 -339
  199. package/dist/src/members/checkout/OldRegisterCartPriceCalculator.js.map +0 -1
  200. package/dist/src/members/checkout/OldRegisterCartValidator.d.ts +0 -35
  201. package/dist/src/members/checkout/OldRegisterCartValidator.d.ts.map +0 -1
  202. package/dist/src/members/checkout/OldRegisterCartValidator.js +0 -309
  203. package/dist/src/members/checkout/OldRegisterCartValidator.js.map +0 -1
  204. package/dist/src/members/checkout/OldRegisterCheckout.d.ts +0 -22
  205. package/dist/src/members/checkout/OldRegisterCheckout.d.ts.map +0 -1
  206. package/dist/src/members/checkout/OldRegisterCheckout.js +0 -46
  207. package/dist/src/members/checkout/OldRegisterCheckout.js.map +0 -1
  208. package/dist/src/members/checkout/OldRegisterItem.d.ts +0 -46
  209. package/dist/src/members/checkout/OldRegisterItem.d.ts.map +0 -1
  210. package/dist/src/members/checkout/OldRegisterItem.js +0 -89
  211. package/dist/src/members/checkout/OldRegisterItem.js.map +0 -1
  212. package/dist/src/members/checkout/RegisterCartPriceCalculator.test.d.ts +0 -2
  213. package/dist/src/members/checkout/RegisterCartPriceCalculator.test.d.ts.map +0 -1
  214. package/dist/src/members/checkout/RegisterCartPriceCalculator.test.js +0 -1076
  215. package/dist/src/members/checkout/RegisterCartPriceCalculator.test.js.map +0 -1
  216. package/dist/src/members/checkout/UnknownMemberWithRegistrations.d.ts +0 -23
  217. package/dist/src/members/checkout/UnknownMemberWithRegistrations.d.ts.map +0 -1
  218. package/dist/src/members/checkout/UnknownMemberWithRegistrations.js +0 -3
  219. package/dist/src/members/checkout/UnknownMemberWithRegistrations.js.map +0 -1
  220. package/esm/dist/src/members/MemberWithRegistrations.d.ts +0 -52
  221. package/esm/dist/src/members/MemberWithRegistrations.d.ts.map +0 -1
  222. package/esm/dist/src/members/MemberWithRegistrations.js +0 -152
  223. package/esm/dist/src/members/MemberWithRegistrations.js.map +0 -1
  224. package/esm/dist/src/members/checkout/OldRegisterCart.d.ts +0 -50
  225. package/esm/dist/src/members/checkout/OldRegisterCart.d.ts.map +0 -1
  226. package/esm/dist/src/members/checkout/OldRegisterCart.js +0 -202
  227. package/esm/dist/src/members/checkout/OldRegisterCart.js.map +0 -1
  228. package/esm/dist/src/members/checkout/OldRegisterCartPriceCalculator.d.ts +0 -36
  229. package/esm/dist/src/members/checkout/OldRegisterCartPriceCalculator.d.ts.map +0 -1
  230. package/esm/dist/src/members/checkout/OldRegisterCartPriceCalculator.js +0 -334
  231. package/esm/dist/src/members/checkout/OldRegisterCartPriceCalculator.js.map +0 -1
  232. package/esm/dist/src/members/checkout/OldRegisterCartValidator.d.ts +0 -35
  233. package/esm/dist/src/members/checkout/OldRegisterCartValidator.d.ts.map +0 -1
  234. package/esm/dist/src/members/checkout/OldRegisterCartValidator.js +0 -305
  235. package/esm/dist/src/members/checkout/OldRegisterCartValidator.js.map +0 -1
  236. package/esm/dist/src/members/checkout/OldRegisterCheckout.d.ts +0 -22
  237. package/esm/dist/src/members/checkout/OldRegisterCheckout.d.ts.map +0 -1
  238. package/esm/dist/src/members/checkout/OldRegisterCheckout.js +0 -41
  239. package/esm/dist/src/members/checkout/OldRegisterCheckout.js.map +0 -1
  240. package/esm/dist/src/members/checkout/OldRegisterItem.d.ts +0 -46
  241. package/esm/dist/src/members/checkout/OldRegisterItem.d.ts.map +0 -1
  242. package/esm/dist/src/members/checkout/OldRegisterItem.js +0 -84
  243. package/esm/dist/src/members/checkout/OldRegisterItem.js.map +0 -1
  244. package/esm/dist/src/members/checkout/RegisterCartPriceCalculator.test.d.ts +0 -2
  245. package/esm/dist/src/members/checkout/RegisterCartPriceCalculator.test.d.ts.map +0 -1
  246. package/esm/dist/src/members/checkout/RegisterCartPriceCalculator.test.js +0 -1074
  247. package/esm/dist/src/members/checkout/RegisterCartPriceCalculator.test.js.map +0 -1
  248. package/esm/dist/src/members/checkout/UnknownMemberWithRegistrations.d.ts +0 -23
  249. package/esm/dist/src/members/checkout/UnknownMemberWithRegistrations.d.ts.map +0 -1
  250. package/esm/dist/src/members/checkout/UnknownMemberWithRegistrations.js +0 -2
  251. 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);
@@ -67,9 +68,13 @@ class RegisterItem {
67
68
  });
68
69
  }
69
70
  constructor(data) {
70
- var _a, _b, _c;
71
+ var _a, _b, _c, _d, _e;
71
72
  this.options = [];
72
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 = [];
73
78
  /**
74
79
  * Show an error in the cart for recovery
75
80
  */
@@ -77,12 +82,10 @@ class RegisterItem {
77
82
  this.id = (_a = data.id) !== null && _a !== void 0 ? _a : (0, uuid_1.v4)();
78
83
  this.member = data.member;
79
84
  this.group = data.group;
80
- if (this.group.settings.prices.length === 0) {
81
- throw new Error("Group has no prices");
82
- }
83
- this.groupPrice = (_b = data.groupPrice) !== null && _b !== void 0 ? _b : this.group.settings.prices[0];
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: '' });
84
86
  this.organization = data.organization;
85
- this.options = (_c = data.options) !== null && _c !== void 0 ? _c : [];
87
+ this.options = (_d = data.options) !== null && _d !== void 0 ? _d : [];
88
+ this.replaceRegistrations = (_e = data.replaceRegistrations) !== null && _e !== void 0 ? _e : [];
86
89
  // Select all defaults
87
90
  for (const optionMenu of this.group.settings.optionMenus) {
88
91
  if (!optionMenu.multipleChoice) {
@@ -97,14 +100,46 @@ class RegisterItem {
97
100
  }
98
101
  }
99
102
  }
103
+ get isInCart() {
104
+ return this.member.family.checkout.cart.contains(this);
105
+ }
100
106
  get showItemView() {
101
- return this.shouldUseWaitingList() || this.group.settings.prices.length > 1 || this.group.settings.optionMenus.length > 0;
107
+ return this.shouldUseWaitingList() || this.replaceRegistrations.length || this.group.settings.prices.length > 1 || this.group.settings.optionMenus.length > 0 || (!this.isInCart && !this.isValid);
102
108
  }
103
109
  calculatePrice() {
104
110
  this.calculatedPrice = this.groupPrice.price.forMember(this.member);
105
111
  for (const option of this.options) {
106
112
  this.calculatedPrice += option.option.price.forMember(this.member) * option.amount;
107
113
  }
114
+ for (const registration of this.replaceRegistrations) {
115
+ this.calculatedPrice -= registration.price;
116
+ }
117
+ }
118
+ get priceBreakown() {
119
+ let all = [];
120
+ let replacePrice = 0;
121
+ for (const registration of this.replaceRegistrations) {
122
+ replacePrice += registration.price;
123
+ all.push({
124
+ name: 'Terugbetaling ' + registration.group.settings.name,
125
+ price: -registration.price
126
+ });
127
+ }
128
+ const subtotal = this.calculatedPrice + replacePrice;
129
+ all = all.filter(a => a.price !== 0);
130
+ if (all.length > 0) {
131
+ all.unshift({
132
+ name: 'Subtotaal',
133
+ price: subtotal
134
+ });
135
+ }
136
+ return [
137
+ ...all,
138
+ {
139
+ name: 'Totaal',
140
+ price: this.calculatedPrice
141
+ }
142
+ ];
108
143
  }
109
144
  clone() {
110
145
  return new RegisterItem({
@@ -113,7 +148,8 @@ class RegisterItem {
113
148
  group: this.group,
114
149
  organization: this.organization,
115
150
  groupPrice: this.groupPrice.clone(),
116
- options: this.options.map(o => o.clone())
151
+ options: this.options.map(o => o.clone()),
152
+ replaceRegistrations: this.replaceRegistrations.map(r => r.clone())
117
153
  });
118
154
  }
119
155
  copyFrom(item) {
@@ -121,22 +157,22 @@ class RegisterItem {
121
157
  this.options = item.options.map(o => o.clone());
122
158
  this.calculatedPrice = item.calculatedPrice;
123
159
  }
124
- getFilteredPrices(options) {
160
+ getFilteredPrices() {
125
161
  return this.group.settings.prices.filter(p => {
126
- if (p.hidden && !options.admin) {
162
+ if (p.hidden && !this.checkout.isAdminFromSameOrganization) {
127
163
  return false;
128
164
  }
129
165
  return true;
130
166
  });
131
167
  }
132
- getFilteredOptionMenus(options) {
168
+ getFilteredOptionMenus() {
133
169
  return this.group.settings.optionMenus.filter(p => {
134
- return this.getFilteredOptions(p, options).length > 0;
170
+ return this.getFilteredOptions(p).length > 0;
135
171
  });
136
172
  }
137
- getFilteredOptions(menu, options) {
173
+ getFilteredOptions(menu) {
138
174
  return menu.options.filter(p => {
139
- if (p.hidden && !options.admin) {
175
+ if (p.hidden && !this.checkout.isAdminFromSameOrganization) {
140
176
  return false;
141
177
  }
142
178
  return true;
@@ -177,6 +213,10 @@ class RegisterItem {
177
213
  group,
178
214
  organization
179
215
  });
216
+ //if (item.shouldUseWaitingList() && group.waitingList) {
217
+ // group = group.waitingList
218
+ // item = RegisterItem.defaultFor(member, group, organization);
219
+ //}
180
220
  return item;
181
221
  }
182
222
  /**
@@ -185,16 +225,25 @@ class RegisterItem {
185
225
  refresh(group) {
186
226
  this.group = group;
187
227
  const errors = new simple_errors_1.SimpleErrors();
188
- const groupPrice = this.group.settings.prices.find(p => p.id === this.groupPrice.id);
189
- if (!groupPrice) {
228
+ if (this.group.settings.prices.length === 0) {
190
229
  errors.addError(new simple_errors_1.SimpleError({
191
230
  code: "product_unavailable",
192
231
  message: "Product unavailable",
193
- human: "Eén of meerdere tarieven van " + this.group.settings.name + " zijn niet meer beschikbaar"
232
+ 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."
194
233
  }));
195
234
  }
196
235
  else {
197
- this.groupPrice = groupPrice;
236
+ const groupPrice = this.group.settings.prices.find(p => p.id === this.groupPrice.id);
237
+ if (!groupPrice) {
238
+ errors.addError(new simple_errors_1.SimpleError({
239
+ code: "product_unavailable",
240
+ message: "Product unavailable",
241
+ human: "Eén of meerdere tarieven van " + this.group.settings.name + " zijn niet meer beschikbaar"
242
+ }));
243
+ }
244
+ else {
245
+ this.groupPrice = groupPrice;
246
+ }
198
247
  }
199
248
  // Check all options
200
249
  const remainingMenus = this.group.settings.optionMenus.slice();
@@ -238,17 +287,18 @@ class RegisterItem {
238
287
  errors.throwIfNotEmpty();
239
288
  }
240
289
  isAlreadyRegistered() {
241
- 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);
290
+ return !!this.member.member.registrations.find(r => r.groupId === this.group.id && r.registeredAt !== null && r.deactivatedAt === null);
242
291
  }
243
292
  hasReachedCategoryMaximum() {
293
+ if (this.group.type !== Group_1.GroupType.Membership) {
294
+ return false;
295
+ }
244
296
  const parents = this.group.getParentCategories(this.organization.period.settings.categories, false);
245
297
  for (const parent of parents) {
246
298
  if (parent.settings.maximumRegistrations !== null) {
247
- const count = this.member.member.registrations.filter(r => {
248
- if (r.registeredAt !== null && !r.waitingList && r.deactivatedAt === null && parent.groupIds.includes(r.groupId)) {
249
- // Check cycle (only count current periods, not previous periods)
250
- const g = this.organization.groups.find(gg => gg.id === r.groupId);
251
- return g && g.cycle === r.cycle;
299
+ const count = this.member.patchedMember.registrations.filter(r => {
300
+ if (r.registeredAt !== null && r.deactivatedAt === null && parent.groupIds.includes(r.groupId)) {
301
+ return true;
252
302
  }
253
303
  return false;
254
304
  }).length;
@@ -263,51 +313,73 @@ class RegisterItem {
263
313
  return false;
264
314
  }
265
315
  isInvited() {
266
- return !!this.member.member.registrations.find(r => r.groupId === this.group.id && r.waitingList && r.canRegister && r.cycle === this.group.cycle);
316
+ return !!this.member.member.registrations.find(r => r.groupId === this.group.id && r.registeredAt === null && r.canRegister);
267
317
  }
268
318
  doesMeetRequireGroupIds() {
269
319
  if (this.group.settings.requireGroupIds.length > 0) {
270
320
  const hasGroup = this.member.member.registrations.find(r => {
271
- const registrationGroup = this.organization.groups.find(g => g.id === r.groupId);
272
- if (!registrationGroup) {
273
- return false;
274
- }
275
- return this.group.settings.requireGroupIds.includes(r.groupId) && r.registeredAt !== null && r.deactivatedAt === null && !r.waitingList && r.cycle === registrationGroup.cycle;
321
+ return r.registeredAt !== null && r.deactivatedAt === null && this.group.settings.requireGroupIds.includes(r.groupId);
276
322
  });
277
- 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)) {
323
+ if (!hasGroup && !this.checkout.cart.items.find(item => item.member.id === this.member.id && this.group.settings.requireGroupIds.includes(item.group.id))) {
324
+ return false;
325
+ }
326
+ }
327
+ if (this.group.settings.requireDefaultAgeGroupIds.length > 0) {
328
+ const hasGroup = this.member.member.registrations.find(r => {
329
+ return r.registeredAt !== null && r.deactivatedAt === null && r.group.defaultAgeGroupId && this.group.settings.requireDefaultAgeGroupIds.includes(r.group.defaultAgeGroupId);
330
+ });
331
+ 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))) {
278
332
  return false;
279
333
  }
280
334
  }
281
335
  return true;
282
336
  }
283
- isExistingMemberOrFamily() {
284
- return this.member.isExistingMember(this.group.organizationId) || (this.group.settings.priorityForFamily && !!this.family.members.find(f => f.isExistingMember(this.group.organizationId)));
337
+ doesMeetRequireOrganizationIds() {
338
+ if (this.group.settings.requireOrganizationIds.length > 0) {
339
+ const hasGroup = this.member.member.registrations.find(r => {
340
+ return r.group.type === Group_1.GroupType.Membership && this.group.settings.requireOrganizationIds.includes(r.organizationId) && r.registeredAt !== null && r.deactivatedAt === null;
341
+ });
342
+ if (!hasGroup && !this.checkout.cart.items.find(item => item.member.id === this.member.id && this.group.settings.requireOrganizationIds.includes(item.organization.id))) {
343
+ return false;
344
+ }
345
+ }
346
+ return true;
285
347
  }
286
- get rowLabel() {
287
- if (this.isInvited()) {
288
- return 'Uitnodiging';
348
+ doesMeetRequireOrganizationTags() {
349
+ if (this.group.settings.requireOrganizationTags.length > 0) {
350
+ const hasOrganization = this.member.filterOrganizations({ currentPeriod: true, types: [Group_1.GroupType.Membership] }).find(organization => {
351
+ return organization.meta.matchTags(this.group.settings.requireOrganizationTags);
352
+ });
353
+ if (!hasOrganization && !this.checkout.cart.items.find(item => item.member.id === this.member.id && item.organization.meta.matchTags(this.group.settings.requireOrganizationTags))) {
354
+ return false;
355
+ }
289
356
  }
290
- return null;
357
+ return true;
291
358
  }
292
- get infoDescription() {
293
- if (this.isInvited()) {
294
- return 'Je bent uitgenodigd om in te schrijven voor deze groep';
359
+ doesMeetRequirePlatformMembershipOn() {
360
+ if (this.group.settings.requirePlatformMembershipOn !== null) {
361
+ const requirePlatformMembershipOn = this.group.settings.requirePlatformMembershipOn;
362
+ return !!this.member.patchedMember.platformMemberships.find(m => m.isActive(requirePlatformMembershipOn));
295
363
  }
296
- if (this.waitingList) {
297
- if (this.group.settings.waitingListType === GroupSettings_1.WaitingListType.All) {
298
- return 'Je kan enkel inschrijven voor de wachtlijst';
299
- }
300
- const existingMember = this.isExistingMemberOrFamily();
301
- if (this.group.settings.waitingListType === GroupSettings_1.WaitingListType.ExistingMembersFirst && !existingMember) {
302
- return 'Nieuwe leden kunnen enkel inschrijven voor de wachtlijst';
303
- }
304
- if (this.group.waitingList) {
305
- if (this.hasReachedGroupMaximum()) {
306
- return 'De inschrijvingen zijn volzet, je kan enkel inschrijven voor de wachtlijst';
307
- }
364
+ return true;
365
+ }
366
+ isExistingMemberOrFamily() {
367
+ return this.member.isExistingMember(this.group.organizationId) || (this.group.settings.priorityForFamily && !!this.family.members.find(f => f.isExistingMember(this.group.organizationId)));
368
+ }
369
+ get description() {
370
+ const descriptions = [];
371
+ if (this.replaceRegistrations.length > 0) {
372
+ for (const registration of this.replaceRegistrations) {
373
+ descriptions.push("Verplaatsen vanaf " + registration.group.settings.name);
308
374
  }
309
375
  }
310
- return null;
376
+ if (this.getFilteredPrices().length > 1) {
377
+ descriptions.push(this.groupPrice.name);
378
+ }
379
+ for (const option of this.options) {
380
+ descriptions.push(option.optionMenu.name + ': ' + option.option.name + (option.option.allowAmount ? ` x ${option.amount}` : ""));
381
+ }
382
+ return descriptions.filter(d => !!d).join("\n");
311
383
  }
312
384
  shouldUseWaitingList() {
313
385
  if (this.group.settings.waitingListType === GroupSettings_1.WaitingListType.All) {
@@ -351,19 +423,60 @@ class RegisterItem {
351
423
  }
352
424
  return null;
353
425
  }
354
- validate() {
426
+ get validationWarning() {
427
+ if (this.validationError) {
428
+ return null;
429
+ }
430
+ if (!this.member.family.checkout.isAdminFromSameOrganization) {
431
+ // Warnings are only for admins
432
+ return null;
433
+ }
434
+ try {
435
+ this.validate({ warnings: true });
436
+ }
437
+ catch (e) {
438
+ if ((0, simple_errors_1.isSimpleError)(e) || (0, simple_errors_1.isSimpleErrors)(e)) {
439
+ return e.getHuman();
440
+ }
441
+ throw e;
442
+ }
443
+ return null;
444
+ }
445
+ get isValid() {
446
+ return this.validationError === null;
447
+ }
448
+ validate(options) {
355
449
  var _a;
356
450
  this.cartError = null;
357
451
  this.refresh(this.group);
452
+ const checkout = this.member.family.checkout;
453
+ const admin = checkout.isAdminFromSameOrganization && !(options === null || options === void 0 ? void 0 : options.warnings);
358
454
  if (this.group.organizationId !== this.organization.id) {
359
455
  throw new Error("Group and organization do not match in RegisterItem.validate");
360
456
  }
361
- if (!this.checkout.cart.contains(this)) {
362
- if (!this.checkout.cart.canAdd(this)) {
457
+ if (checkout.asOrganizationId && !admin && !this.group.settings.allowRegistrationsByOrganization) {
458
+ throw new simple_errors_1.SimpleError({
459
+ code: "as_organization_disabled",
460
+ message: "allowRegistrationsByOrganization disabled",
461
+ human: "Inschrijvingen door organisaties zijn niet toegestaan voor " + this.group.settings.name,
462
+ });
463
+ }
464
+ for (const registration of this.replaceRegistrations) {
465
+ // todo: check if you are allowed to move
466
+ if (registration.member.id !== this.member.id) {
363
467
  throw new simple_errors_1.SimpleError({
364
- code: "already_registered",
365
- message: "Already registered",
366
- 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.`
468
+ code: "invalid_move",
469
+ message: "Invalid member in replaceRegistration",
470
+ human: "Je wilt een inschrijving verplaatsen van een ander lid in ruil voor een ander lid. Dit is niet toegestaan.",
471
+ field: "replaceRegistrations"
472
+ });
473
+ }
474
+ if (registration.group.organizationId !== this.organization.id) {
475
+ throw new simple_errors_1.SimpleError({
476
+ code: "invalid_move",
477
+ message: "Invalid organization in replaceRegistration",
478
+ human: "Je wilt een inschrijving verplaatsen van een andere organisatie. Dit is niet toegestaan.",
479
+ field: "replaceRegistrations"
367
480
  });
368
481
  }
369
482
  }
@@ -380,83 +493,95 @@ class RegisterItem {
380
493
  throw new simple_errors_1.SimpleError({
381
494
  code: "maximum_reached",
382
495
  message: "Maximum reached",
383
- 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.`
496
+ 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.`
384
497
  });
385
498
  }
386
499
  // Check if we have an invite (doesn't matter if registrations are closed)
387
500
  if (this.isInvited()) {
388
501
  return;
389
502
  }
390
- if (this.group.notYetOpen) {
391
- throw new simple_errors_1.SimpleError({
392
- code: "not_yet_open",
393
- message: "Not yet open",
394
- human: `De inschrijvingen voor ${this.group.settings.name} zijn nog niet geopend.`
395
- });
396
- }
397
- if (this.group.closed) {
398
- throw new simple_errors_1.SimpleError({
399
- code: "closed",
400
- message: "Closed",
401
- human: `De inschrijvingen voor ${this.group.settings.name} zijn gesloten.`
402
- });
403
- }
404
- // Check if it fits
405
- if (this.member.member.details) {
406
- if (!this.member.member.details.doesMatchGroup(this.group)) {
407
- const error = this.member.member.details.getMatchingError(this.group);
503
+ if (!admin) {
504
+ if (this.group.notYetOpen) {
408
505
  throw new simple_errors_1.SimpleError({
409
- code: "not_matching",
410
- message: "Not matching",
411
- 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."
506
+ code: "not_yet_open",
507
+ message: "Not yet open",
508
+ human: `De inschrijvingen voor ${this.group.settings.name} zijn nog niet geopend.`
412
509
  });
413
510
  }
414
- }
415
- // Check if registrations are limited
416
- if (!this.doesMeetRequireGroupIds()) {
417
- throw new simple_errors_1.SimpleError({
418
- code: "not_matching",
419
- message: "Not matching",
420
- 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,
421
- });
422
- }
423
- const existingMember = this.isExistingMemberOrFamily();
424
- // Pre registrations?
425
- if (this.group.activePreRegistrationDate) {
426
- if (!existingMember) {
511
+ if (this.group.closed) {
427
512
  throw new simple_errors_1.SimpleError({
428
- code: "pre_registrations",
429
- message: "Pre registrations",
430
- 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" : "") + "."
513
+ code: "closed",
514
+ message: "Closed",
515
+ human: `De inschrijvingen voor ${this.group.settings.name} zijn gesloten.`
431
516
  });
432
517
  }
433
- }
434
- if (!this.waitingList && this.shouldUseWaitingList()) {
435
- throw new simple_errors_1.SimpleError({
436
- code: "waiting_list_required",
437
- message: "Waiting list required",
438
- human: `${this.member.member.firstName} kan momenteel enkel voor de wachtlijst van ${this.group.settings.name} inschrijven.`
439
- });
440
- }
441
- if (!this.waitingList) {
442
- if (!this.group.waitingList) {
443
- if (this.hasReachedGroupMaximum()) {
518
+ // Check if it fits
519
+ if (this.member.member.details) {
520
+ if (!this.member.member.details.doesMatchGroup(this.group)) {
521
+ const error = this.member.member.details.getMatchingError(this.group);
444
522
  throw new simple_errors_1.SimpleError({
445
- code: "maximum_reached",
446
- message: "Maximum reached",
447
- human: `De inschrijvingen voor ${this.group.settings.name} zijn volzet. Je kan wel nog inschrijven voor de wachtlijst.`
523
+ code: "not_matching",
524
+ message: "Not matching: memberDetails",
525
+ 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.`
448
526
  });
449
527
  }
450
528
  }
451
- else {
452
- if (this.hasReachedGroupMaximum()) {
529
+ // Check if registrations are limited
530
+ if (!this.doesMeetRequireGroupIds()) {
531
+ throw new simple_errors_1.SimpleError({
532
+ code: "not_matching",
533
+ message: "Not matching: requireGroupIds",
534
+ human: `${this.member.patchedMember.name} voldoet niet aan de voorwaarden om in te schrijven voor deze groep (verplichte inschrijving bij leeftijdsgroep).`
535
+ });
536
+ }
537
+ if (!this.doesMeetRequireOrganizationIds()) {
538
+ throw new simple_errors_1.SimpleError({
539
+ code: "not_matching",
540
+ message: "Not matching: requireOrganizationIds",
541
+ human: `${this.member.patchedMember.name} kan pas inschrijven met een geldige actieve inschrijving (verplichte inschrijving bij lokale groep).`
542
+ });
543
+ }
544
+ if (!this.doesMeetRequireOrganizationTags()) {
545
+ throw new simple_errors_1.SimpleError({
546
+ code: "not_matching",
547
+ message: "Not matching: requireOrganizationIds",
548
+ human: `${this.member.patchedMember.name} kan pas inschrijven met een geldige actieve inschrijving (verplichte inschrijving in regio).`
549
+ });
550
+ }
551
+ if (!this.doesMeetRequirePlatformMembershipOn()) {
552
+ throw new simple_errors_1.SimpleError({
553
+ code: "not_matching",
554
+ message: "Not matching: requirePlatformMembershipOn",
555
+ human: `${this.member.patchedMember.name} kan pas inschrijven met een geldige aansluiting (en dus verzekering) bij de koepel`
556
+ });
557
+ }
558
+ const existingMember = this.isExistingMemberOrFamily();
559
+ // Pre registrations?
560
+ if (this.group.activePreRegistrationDate) {
561
+ if (!existingMember) {
453
562
  throw new simple_errors_1.SimpleError({
454
- code: "maximum_reached",
455
- message: "Maximum reached",
456
- human: `De inschrijvingen voor ${this.group.settings.name} zijn volzet.`
563
+ code: "pre_registrations",
564
+ message: "Pre registrations",
565
+ 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" : "") + "."
457
566
  });
458
567
  }
459
568
  }
569
+ if (this.shouldUseWaitingList()) {
570
+ throw new simple_errors_1.SimpleError({
571
+ code: "waiting_list_required",
572
+ message: "Waiting list required",
573
+ human: `${this.member.member.firstName} kan momenteel enkel voor de wachtlijst van ${this.group.settings.name} inschrijven.`,
574
+ meta: { recoverable: true }
575
+ });
576
+ }
577
+ if (this.hasReachedGroupMaximum()) {
578
+ throw new simple_errors_1.SimpleError({
579
+ code: "maximum_reached",
580
+ message: "Maximum reached",
581
+ 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. `,
582
+ meta: { recoverable: true }
583
+ });
584
+ }
460
585
  }
461
586
  }
462
587
  static fromId(idRegisterItem, context) {
@@ -487,6 +612,46 @@ class RegisterItem {
487
612
  }
488
613
  return this.organization.meta.registrationPaymentConfiguration;
489
614
  }
615
+ /**
616
+ * Returns the stock that will be taken (or freed if negative) by all the register items before this item
617
+ * and with the removed registrations freed up, so this can be negative
618
+ */
619
+ getCartPendingStockReservations() {
620
+ const deleteRegistrations = this.checkout.cart.deleteRegistrations.filter(r => r.groupId === this.group.id);
621
+ const cartIndex = this.checkout.cart.items.findIndex(i => i.id === this.id);
622
+ const itemsBefore = this.checkout.cart.items.slice(0, cartIndex === -1 ? undefined : cartIndex);
623
+ return StockReservation_1.StockReservation.removed(itemsBefore.flatMap(i => i.getPendingStockReservations()), // these will be removed
624
+ deleteRegistrations.flatMap(r => r.stockReservations) // these will be freed up
625
+ );
626
+ }
627
+ /**
628
+ * Stock that will be taken by this item
629
+ */
630
+ getPendingStockReservations() {
631
+ return [
632
+ // Global level stock reservations (stored in each group)
633
+ StockReservation_1.StockReservation.create({
634
+ objectId: this.group.id,
635
+ objectType: 'Group',
636
+ amount: 1,
637
+ children: [
638
+ // Group level stock reservatiosn (stored in the group)
639
+ StockReservation_1.StockReservation.create({
640
+ objectId: this.groupPrice.id,
641
+ objectType: 'GroupPrice',
642
+ amount: 1
643
+ }),
644
+ ...this.options.map(o => {
645
+ return StockReservation_1.StockReservation.create({
646
+ objectId: o.option.id,
647
+ objectType: 'GroupOption',
648
+ amount: o.amount
649
+ });
650
+ })
651
+ ]
652
+ })
653
+ ];
654
+ }
490
655
  }
491
656
  exports.RegisterItem = RegisterItem;
492
657
  //# sourceMappingURL=RegisterItem.js.map