36 lines
1.1 KiB
JavaScript
36 lines
1.1 KiB
JavaScript
import { defaultMenu, defaultSettings } from "./defaults.js";
|
|
import { MenuItem } from "./models/MenuItem.js";
|
|
import { Order } from "./models/Order.js";
|
|
|
|
export function getSettings() {
|
|
return defaultSettings;
|
|
}
|
|
|
|
export async function ensureSeedMenu() {
|
|
const count = await MenuItem.countDocuments();
|
|
if (count === 0) {
|
|
await MenuItem.insertMany(defaultMenu);
|
|
}
|
|
}
|
|
|
|
export async function resetMenuToDefaults() {
|
|
await MenuItem.deleteMany({});
|
|
await MenuItem.insertMany(defaultMenu);
|
|
return MenuItem.find().sort({ category: 1, name: 1 });
|
|
}
|
|
|
|
export async function nextOrderNumber() {
|
|
const latest = await Order.findOne().sort({ number: -1 }).lean();
|
|
return (latest?.number ?? 1000) + 1;
|
|
}
|
|
|
|
export function computeOrderTotal(lines, settings = defaultSettings) {
|
|
return lines.reduce((sum, line) => {
|
|
const sizeDelta = settings.sizeOptions.find((option) => option.name === line.size)?.delta ?? 0;
|
|
const toppings = line.toppings.reduce((toppingSum, toppingName) => {
|
|
return toppingSum + (settings.toppings.find((item) => item.name === toppingName)?.price ?? 0);
|
|
}, 0);
|
|
return sum + line.basePrice + sizeDelta + toppings;
|
|
}, 0);
|
|
}
|