Files
Shoppy/src/services/shoppingListWarningsService.js
T

69 lines
1.7 KiB
JavaScript

const dailyLimitRules = [
{
key: 'caffeine',
label: 'Koffein',
limit: 200,
unit: 'mg',
nutritionKey: 'caffeineMgPer100g',
severity: 'critical',
message: 'Mehr Koffein als der Tagesrichtwert in Shoppinguin. Auf mehrere Tage aufteilen.'
},
{
key: 'sugar',
label: 'Zucker',
limit: 50,
unit: 'g',
nutritionKey: 'sugarPer100g',
severity: 'warning',
message: 'Mehr Zucker als der Tagesrichtwert in Shoppinguin. Auf mehrere Tage aufteilen.'
},
{
key: 'salt',
label: 'Salz',
limit: 5,
unit: 'g',
nutritionKey: 'saltPer100g',
severity: 'warning',
message: 'Mehr Salz als der Tagesrichtwert in Shoppinguin. Auf mehrere Tage aufteilen.'
}
];
export function calculateShoppingListWarnings(shoppingList) {
return dailyLimitRules
.map((rule) => {
const total = totalNutrientAmount(shoppingList.items || [], rule);
return {
...rule,
total,
percentage: Math.round((total / rule.limit) * 100)
};
})
.filter((warning) => warning.total > warning.limit);
}
function totalNutrientAmount(items, rule) {
return items.reduce((sum, item) => {
const per100g = item.nutrition?.[rule.nutritionKey];
const quantityGrams = itemQuantityGrams(item);
if (typeof per100g !== 'number' || typeof quantityGrams !== 'number') {
return sum;
}
return sum + (per100g * quantityGrams * item.quantity) / 100;
}, 0);
}
function itemQuantityGrams(item) {
if (typeof item.packageQuantityGrams === 'number' && item.packageQuantityGrams > 0) {
return item.packageQuantityGrams;
}
if (typeof item.servingQuantityGrams === 'number' && item.servingQuantityGrams > 0) {
return item.servingQuantityGrams;
}
return 100;
}