initial booking
This commit is contained in:
33
src/lib/money.ts
Normal file
33
src/lib/money.ts
Normal file
@@ -0,0 +1,33 @@
|
||||
// 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 };
|
||||
}
|
||||
Reference in New Issue
Block a user