@wallfar/ocd-studio-core-sdk
Version:
Helper SDK for our OneClick Studio modules
81 lines (78 loc) • 1.96 kB
JavaScript
import { c as clampMoney } from './shared/ocd-studio-core-sdk.D3EQiCxo.mjs';
function createDraftOrder(input) {
const order = {
...input,
reservations: input.reservations.map((r) => {
const line = {
...r,
adjustments: [...r.adjustments || []],
metadata: { ...r.metadata || {} }
};
return enhanceTarget(line);
}),
adjustments: [...input.adjustments || []],
metadata: { ...input.metadata || {} }
};
return enhanceTarget(order);
}
function addFixed(target, amount, label) {
target.adjustments.push({
type: "fixed",
value: amount,
label
});
}
function addPercent(target, percent, label) {
target.adjustments.push({
type: "percent",
value: percent,
label
});
}
function enhanceTarget(target) {
Object.defineProperties(target, {
addFixed: {
enumerable: false,
value(amount, label) {
addFixed(target, amount, label);
}
},
addPercent: {
enumerable: false,
value(percent, label) {
addPercent(target, percent, label);
}
}
});
return target;
}
function calculateTotals(order) {
const calculatedReservations = order.reservations.map((res) => {
let total = res.basePrice + (res.addOnsPrice || 0);
for (const adj of res.adjustments) {
if (adj.type === "fixed") {
total += adj.value;
} else {
total += total * (adj.value / 100);
}
}
return {
...res,
finalPrice: clampMoney(total)
};
});
let orderTotal = calculatedReservations.reduce((sum, r) => sum + r.finalPrice, 0);
for (const adj of order.adjustments) {
if (adj.type === "fixed") {
orderTotal += adj.value;
} else {
orderTotal += orderTotal * (adj.value / 100);
}
}
return {
...order,
reservations: calculatedReservations,
total: clampMoney(orderTotal)
};
}
export { addFixed, addPercent, calculateTotals, createDraftOrder };