34 lines
1022 B
TypeScript
34 lines
1022 B
TypeScript
// Price math in öre (1 SEK = 100 öre) to avoid float drift.
|
|
|
|
export function formatOre(ore: number, locale: 'sv' | 'en' = 'sv'): string {
|
|
const sek = ore / 100;
|
|
return new Intl.NumberFormat(locale === 'sv' ? 'sv-SE' : 'en-SE', {
|
|
style: 'currency',
|
|
currency: 'SEK',
|
|
minimumFractionDigits: 2,
|
|
maximumFractionDigits: 2,
|
|
}).format(sek);
|
|
}
|
|
|
|
export function vatAmountOre(netOre: number, vatBp: number): number {
|
|
return Math.round((netOre * vatBp) / 10000);
|
|
}
|
|
|
|
/** Net price + VAT, rounded the same way as billing. */
|
|
export function priceInclVatOre(netOre: number, vatBp: number): number {
|
|
return netOre + vatAmountOre(netOre, vatBp);
|
|
}
|
|
|
|
export function computeTotals(
|
|
items: Array<{ unitPriceOre: number; quantity: number; vatBp: number }>,
|
|
) {
|
|
let subtotal = 0;
|
|
let vat = 0;
|
|
for (const i of items) {
|
|
const line = i.unitPriceOre * i.quantity;
|
|
subtotal += line;
|
|
vat += vatAmountOre(line, i.vatBp);
|
|
}
|
|
return { subtotalOre: subtotal, vatOre: vat, totalOre: subtotal + vat };
|
|
}
|