feat: KitchenStock light UI, Gemma 31B AI, supermarket store filters & 130+ vegan products

This commit is contained in:
KitchenStock
2026-07-26 20:08:16 +02:00
commit 83fcf6909c
81 changed files with 17001 additions and 0 deletions
+73
View File
@@ -0,0 +1,73 @@
/**
* Formats an integer amount in cents to German Euro representation.
* Example: 249 -> "2,49 €"
*/
export function formatCurrency(cents: number | null | undefined): string {
if (cents === null || cents === undefined || isNaN(cents)) {
return '0,00 €';
}
return new Intl.NumberFormat('de-DE', {
style: 'currency',
currency: 'EUR',
}).format(cents / 100);
}
/**
* Calculates stock value in cents.
* For integer/package units: quantity * packagePriceCents
* For partial packages: (quantity / packageSize) * packagePriceCents
*/
export function calculateStockValueCents(
quantity: number,
packageSize: number,
packagePriceCents: number | null | undefined
): number {
if (!packagePriceCents || packagePriceCents <= 0 || quantity <= 0) {
return 0;
}
if (packageSize <= 0) {
return Math.round(quantity * packagePriceCents);
}
const fraction = quantity / packageSize;
return Math.round(fraction * packagePriceCents);
}
/**
* Calculates base price (Grundpreis) per 1kg, 1l, 100g, or 1 Stück.
*/
export function calculateBasePrice(
priceCents: number,
packageSize: number,
packageUnit: string
): { basePriceCents: number; basePriceUnit: string } {
if (packageSize <= 0) {
return { basePriceCents: priceCents, basePriceUnit: packageUnit };
}
const unitLower = packageUnit.toLowerCase().trim();
if (unitLower === 'g' || unitLower === 'gramm') {
// Standard base price per 1 kg (1000 g)
const basePriceCents = Math.round((priceCents / packageSize) * 1000);
return { basePriceCents, basePriceUnit: '1 kg' };
}
if (unitLower === 'ml' || unitLower === 'milliliter') {
// Standard base price per 1 l (1000 ml)
const basePriceCents = Math.round((priceCents / packageSize) * 1000);
return { basePriceCents, basePriceUnit: '1 l' };
}
if (unitLower === 'kg' || unitLower === 'kilogramm') {
const basePriceCents = Math.round(priceCents / packageSize);
return { basePriceCents, basePriceUnit: '1 kg' };
}
if (unitLower === 'l' || unitLower === 'liter') {
const basePriceCents = Math.round(priceCents / packageSize);
return { basePriceCents, basePriceUnit: '1 l' };
}
const basePriceCents = Math.round(priceCents / packageSize);
return { basePriceCents, basePriceUnit: `1 ${packageUnit}` };
}