tripstorekrabi-shared 1.13.32 → 1.13.33
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.
- package/package.json +1 -1
- package/price.js +61 -52
package/package.json
CHANGED
package/price.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { getBookingType } from "./utils.js";
|
|
2
2
|
|
|
3
|
+
export const SELLING_PAYMENT_MODE = 0;
|
|
4
|
+
export const PARTNER_PAYMENT_MODE = 1;
|
|
5
|
+
export const OPERATOR_PAYMENT_MODE = 2;
|
|
3
6
|
export const MAX_PAX = 30;
|
|
4
7
|
export const PAY_ON_TOUR = 'Pay on tour';
|
|
5
8
|
export const ALREADY_PAID = "Already paid";
|
|
@@ -17,7 +20,14 @@ export const EXTRA_PAYMENT_CATEGORIES = [STARTING_POINT_EXTRA_PAYMENT,
|
|
|
17
20
|
ADD_ON_EXTRA_PAYMENT,
|
|
18
21
|
OTHER_EXTRA_PAYMENT];
|
|
19
22
|
|
|
20
|
-
export function calculateProductPrice(booking, pricing,
|
|
23
|
+
export function calculateProductPrice(booking, pricing, options = { paymentMode: SELLING_PAYMENT_MODE }) {
|
|
24
|
+
function calculateRetailPrice(commissionRate, price) {
|
|
25
|
+
return Math.floor(
|
|
26
|
+
(price * 100) /
|
|
27
|
+
(100 -
|
|
28
|
+
commissionRate)
|
|
29
|
+
);
|
|
30
|
+
}
|
|
21
31
|
let type = pricing.type;
|
|
22
32
|
let total = 0;
|
|
23
33
|
|
|
@@ -33,24 +43,24 @@ export function calculateProductPrice(booking, pricing, mode = "retail") {
|
|
|
33
43
|
if (volume[bookingType]) {
|
|
34
44
|
let customPricing = volume[bookingType];
|
|
35
45
|
|
|
36
|
-
if (
|
|
46
|
+
if (options.paymentMode === SELLING_PAYMENT_MODE) {
|
|
37
47
|
let commissionRate = pricing.commissionRates?.[bookingType];
|
|
38
48
|
|
|
39
49
|
if (commissionRate && commissionRate > 0) {
|
|
40
50
|
total = booking.adults * calculateRetailPrice(commissionRate, customPricing.adult.partnerNetPrice) + (pricing.ageBands.child.active && volume.child && booking.children ? (booking.children * calculateRetailPrice(commissionRate, customPricing.child.partnerNetPrice)) : 0);
|
|
41
51
|
} else {
|
|
42
|
-
total = booking.adults * customPricing.adult.retailPrice + (pricing.ageBands.child.active && volume.child && booking.children ? booking.children *
|
|
52
|
+
total = booking.adults * customPricing.adult.retailPrice + (pricing.ageBands.child.active && volume.child && booking.children ? booking.children * customPricing.child.retailPrice : 0);
|
|
43
53
|
}
|
|
44
|
-
} else if (
|
|
45
|
-
total = booking.adults *
|
|
46
|
-
} else if (
|
|
54
|
+
} else if (options.paymentMode === PARTNER_PAYMENT_MODE) {
|
|
55
|
+
total = booking.adults * customPricing.adult.partnerNetPrice + (pricing.ageBands.child.active && volume.child && booking.children ? booking.children * customPricing.child.partnerNetPrice : 0);
|
|
56
|
+
} else if (options.paymentMode === OPERATOR_PAYMENT_MODE) {
|
|
47
57
|
total = booking.adults * (customPricing.adult.operatorNetPrice ?? volume.adult.operatorNetPrice) + (pricing.ageBands.child.active && volume.child && booking.children ? (booking.children * (customPricing.child.operatorNetPrice ?? volume.child.operatorNetPrice)) : 0);
|
|
48
58
|
}
|
|
49
59
|
} else {
|
|
50
|
-
if (
|
|
51
|
-
total = booking.adults *
|
|
52
|
-
} else if (
|
|
53
|
-
total = booking.adults *
|
|
60
|
+
if (options.paymentMode === SELLING_PAYMENT_MODE || options.paymentMode === PARTNER_PAYMENT_MODE) {
|
|
61
|
+
total = booking.adults * volume.adult.sellingPrice + (pricing.ageBands.child.active && volume.child && booking.children ? booking.children * volume.child.sellingPrice : 0);
|
|
62
|
+
} else if (options.paymentMode === OPERATOR_PAYMENT_MODE) {
|
|
63
|
+
total = booking.adults * volume.adult.operatorNetPrice + (pricing.ageBands.child.active && volume.child && booking.children ? booking.children * volume.child.operatorNetPrice : 0);
|
|
54
64
|
}
|
|
55
65
|
}
|
|
56
66
|
break;
|
|
@@ -68,7 +78,7 @@ export function calculateProductPrice(booking, pricing, mode = "retail") {
|
|
|
68
78
|
if (volume[bookingType]) {
|
|
69
79
|
let customPricing = volume[bookingType];
|
|
70
80
|
|
|
71
|
-
if (
|
|
81
|
+
if (options.paymentMode === SELLING_PAYMENT_MODE) {
|
|
72
82
|
let commissionRate = pricing.commissionRates?.[bookingType];
|
|
73
83
|
|
|
74
84
|
if (commissionRate && commissionRate > 0) {
|
|
@@ -76,15 +86,15 @@ export function calculateProductPrice(booking, pricing, mode = "retail") {
|
|
|
76
86
|
} else {
|
|
77
87
|
total = customPricing.retailPrice;
|
|
78
88
|
}
|
|
79
|
-
} else if (
|
|
89
|
+
} else if (options.paymentMode === PARTNER_PAYMENT_MODE) {
|
|
80
90
|
total = customPricing.partnerNetPrice
|
|
81
|
-
} else if (
|
|
91
|
+
} else if (options.paymentMode === OPERATOR_PAYMENT_MODE) {
|
|
82
92
|
total = customPricing.operatorNetPrice ?? volume.operatorNetPrice;
|
|
83
93
|
}
|
|
84
94
|
} else {
|
|
85
|
-
if (
|
|
95
|
+
if (options.paymentMode === SELLING_PAYMENT_MODE || options.paymentMode === PARTNER_PAYMENT_MODE) {
|
|
86
96
|
total = volume.sellingPrice;
|
|
87
|
-
} else if (
|
|
97
|
+
} else if (options.paymentMode === OPERATOR_PAYMENT_MODE) {
|
|
88
98
|
total = volume.operatorNetPrice;
|
|
89
99
|
}
|
|
90
100
|
}
|
|
@@ -99,14 +109,6 @@ export function calculateProductPrice(booking, pricing, mode = "retail") {
|
|
|
99
109
|
return total;
|
|
100
110
|
}
|
|
101
111
|
|
|
102
|
-
function calculateRetailPrice(commissionRate, price) {
|
|
103
|
-
return Math.floor(
|
|
104
|
-
(price * 100) /
|
|
105
|
-
(100 -
|
|
106
|
-
commissionRate)
|
|
107
|
-
);
|
|
108
|
-
}
|
|
109
|
-
|
|
110
112
|
export function findVolume(people, pricing) {
|
|
111
113
|
let total = people.adults + people.children ?? 0;
|
|
112
114
|
return pricing.volumes.sort((v1, v2) => v1.max - v2.max).find((item) => total <= item.max);
|
|
@@ -128,7 +130,7 @@ export function getTotalAmountToBeReceived(booking) {
|
|
|
128
130
|
if (booking.customerPaymentStatus === "Refunded") {
|
|
129
131
|
total = 0;
|
|
130
132
|
} else {
|
|
131
|
-
total = booking.partnerNetPrice + calculateExtraPayments(booking
|
|
133
|
+
total = booking.partnerNetPrice + calculateExtraPayments(booking);
|
|
132
134
|
}
|
|
133
135
|
|
|
134
136
|
return total;
|
|
@@ -143,18 +145,20 @@ export function calculatePartnerNetPrice(booking, product) {
|
|
|
143
145
|
calculateProductPrice(
|
|
144
146
|
booking,
|
|
145
147
|
product.pricing,
|
|
146
|
-
|
|
148
|
+
{
|
|
149
|
+
paymentMode: PARTNER_PAYMENT_MODE,
|
|
150
|
+
}
|
|
147
151
|
)
|
|
148
152
|
);
|
|
149
153
|
}
|
|
150
154
|
|
|
151
|
-
export function calculateTotalPrice(booking, product,
|
|
152
|
-
let total = calculateProductPrice(booking, product.pricing,
|
|
153
|
-
total += calculateStartEndPointPrice(booking, findStartingPoint(product, booking.startingPointId, false),
|
|
154
|
-
total += calculateStartEndPointPrice(booking, findEndPoint(product, booking.endPointId, false),
|
|
155
|
+
export function calculateTotalPrice(booking, product, options = { paymentMode: SELLING_PAYMENT_MODE }) {
|
|
156
|
+
let total = calculateProductPrice(booking, product.pricing, options);
|
|
157
|
+
total += calculateStartEndPointPrice(booking, findStartingPoint(product, booking.startingPointId, false), options);
|
|
158
|
+
total += calculateStartEndPointPrice(booking, findEndPoint(product, booking.endPointId, false), options);
|
|
155
159
|
total += calculateNationalParkFee(booking, product);
|
|
156
|
-
total += calculateExtraPayments(booking,
|
|
157
|
-
total += calculateAddOnsPrice(booking, product,
|
|
160
|
+
total += calculateExtraPayments(booking, { ...options, calculationMode: true });
|
|
161
|
+
total += calculateAddOnsPrice(booking, product, options);
|
|
158
162
|
return total;
|
|
159
163
|
}
|
|
160
164
|
|
|
@@ -162,32 +166,35 @@ export function calculateNationalParkFee(booking, product) {
|
|
|
162
166
|
return booking.nationalParkFee === ALREADY_PAID && product.nationalPark ? product.nationalPark.pricing.adult * booking.adults + product.nationalPark.pricing.child * booking.children : 0;
|
|
163
167
|
}
|
|
164
168
|
|
|
165
|
-
export function calculateExtraPayments(booking,
|
|
169
|
+
export function calculateExtraPayments(booking, options = { paymentMode: SELLING_PAYMENT_MODE, calculationMode: false }) {
|
|
170
|
+
function getPrice(item) {
|
|
171
|
+
switch (options.paymentMode) {
|
|
172
|
+
case SELLING_PAYMENT_MODE:
|
|
173
|
+
case PARTNER_PAYMENT_MODE:
|
|
174
|
+
return item.receivedAmount ? item.receivedAmount : item.price;
|
|
175
|
+
case OPERATOR_PAYMENT_MODE:
|
|
176
|
+
return item.operatoPrice;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
166
180
|
let total = 0;
|
|
167
181
|
for (const item of Object.values(booking.extraPayments).filter((item) => !item.disabled)) {
|
|
168
|
-
if (
|
|
169
|
-
if (item.
|
|
170
|
-
|
|
171
|
-
total -= item.price;
|
|
172
|
-
}
|
|
173
|
-
} else if (!calculationMode || item.category === OTHER_EXTRA_PAYMENT) {
|
|
174
|
-
total += item.receivedAmount ? item.receivedAmount : item.price;
|
|
182
|
+
if (item.paymentMethod === PAY_ON_TOUR) {
|
|
183
|
+
if (options.calculationMode && item.category !== OTHER_EXTRA_PAYMENT) {
|
|
184
|
+
total -= getPrice(item, options);
|
|
175
185
|
}
|
|
176
|
-
} else {
|
|
177
|
-
if (item.paymentMethod === PAY_ON_TOUR) {
|
|
178
|
-
if (calculationMode && item.category !== OTHER_EXTRA_PAYMENT) {
|
|
179
|
-
total -= item.operatorPrice;
|
|
180
|
-
}
|
|
181
186
|
|
|
187
|
+
if (options.paymentMode === OPERATOR_PAYMENT_MODE) {
|
|
182
188
|
let ourCommission = item.price - item.operatorPrice;
|
|
183
189
|
if (ourCommission > 0) {
|
|
184
190
|
total -= ourCommission;
|
|
185
191
|
}
|
|
186
|
-
} else if (!calculationMode || item.category === OTHER_EXTRA_PAYMENT) {
|
|
187
|
-
total += item.operatorPrice;
|
|
188
192
|
}
|
|
193
|
+
} else if (!options.calculationMode || item.category === OTHER_EXTRA_PAYMENT) {
|
|
194
|
+
total += getPrice(item, options);
|
|
189
195
|
}
|
|
190
196
|
}
|
|
197
|
+
|
|
191
198
|
return total;
|
|
192
199
|
}
|
|
193
200
|
|
|
@@ -241,14 +248,15 @@ export function getExtraPaymentsPaidWithPartner(booking, product) {
|
|
|
241
248
|
);
|
|
242
249
|
}
|
|
243
250
|
|
|
244
|
-
export function calculateAddOnsPrice(booking, product,
|
|
251
|
+
export function calculateAddOnsPrice(booking, product, options = { paymentMode: SELLING_PAYMENT_MODE }) {
|
|
245
252
|
let total = 0;
|
|
253
|
+
let isSelling = options.paymentMode in [SELLING_PAYMENT_MODE, PARTNER_PAYMENT_MODE];
|
|
246
254
|
for (const [id, addOn] of Object.entries(booking.addOns ?? {})) {
|
|
247
255
|
let addOnDef = findAddOn(id, product.addOns ?? []);
|
|
248
256
|
if (addOnDef) {
|
|
249
|
-
total += addOn.adults * (
|
|
257
|
+
total += addOn.adults * (isSelling ? addOnDef.pricing.adult
|
|
250
258
|
.sellingPrice : addOnDef.pricing.adult
|
|
251
|
-
.operatorNetPrice) + (addOn.children > 0 ? addOn.children * (
|
|
259
|
+
.operatorNetPrice) + (addOn.children > 0 ? addOn.children * (isSelling ? addOnDef.pricing.child
|
|
252
260
|
.sellingPrice : addOnDef.pricing.child
|
|
253
261
|
.operatorNetPrice) : 0);
|
|
254
262
|
}
|
|
@@ -256,13 +264,14 @@ export function calculateAddOnsPrice(booking, product, selling = true) {
|
|
|
256
264
|
return total;
|
|
257
265
|
}
|
|
258
266
|
|
|
259
|
-
export function calculateStartEndPointPrice(people, startEndPoint,
|
|
267
|
+
export function calculateStartEndPointPrice(people, startEndPoint, options = { paymentMode: SELLING_PAYMENT_MODE }) {
|
|
260
268
|
let pricing = startEndPoint?.pricing;
|
|
269
|
+
let isSelling = options.paymentMode in [SELLING_PAYMENT_MODE, PARTNER_PAYMENT_MODE];
|
|
261
270
|
if (pricing) {
|
|
262
271
|
if (pricing.type === "group") {
|
|
263
|
-
return (
|
|
272
|
+
return (isSelling ? pricing.sellingPrice : pricing.operatorNetPrice) * Math.ceil((people.adults + people.children) / pricing.max);
|
|
264
273
|
} else if (pricing.type === "person") {
|
|
265
|
-
return (
|
|
274
|
+
return (isSelling ? pricing.sellingPrice : pricing.operatorNetPrice) * (people.adults + people.children);
|
|
266
275
|
}
|
|
267
276
|
} else {
|
|
268
277
|
return 0;
|