From 039ffa6f2e55bb6c6a9f9aacc2a2a43a49516ba3 Mon Sep 17 00:00:00 2001 From: Daniel Stock Date: Wed, 29 Oct 2025 10:24:39 +0100 Subject: [PATCH] Fixed an error where toFixed() wouldn't round correctly. Added a util function that does a better job (at least for 2 digits precision) --- resources/js/components/documents/DocumentTable.vue | 4 ++-- resources/js/components/documents/InvoiceDialog.vue | 5 ++--- resources/js/lib/utils.ts | 7 ++++++- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/resources/js/components/documents/DocumentTable.vue b/resources/js/components/documents/DocumentTable.vue index 0b9cc22..145bb4a 100644 --- a/resources/js/components/documents/DocumentTable.vue +++ b/resources/js/components/documents/DocumentTable.vue @@ -2,7 +2,7 @@ import { computed } from 'vue' import { type Invoice } from '@/types' -import { toLocalDate, toCurrency } from '@/lib/utils' +import { toLocalDate, toCurrency, toFixedRounded } from '@/lib/utils' import { StatusBadge, statusBadgeLabels, statusBadgeTextColor, castToStatusVariant } from '@/components/ui/status-badge' import { Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow } from '@/components/ui/table' @@ -97,7 +97,7 @@ const totalGross = computed(() => { }) const calcTaxes = (amount: number) => { - return Number((0.19 * amount).toFixed(2)) + return toFixedRounded(Number(0.19 * amount), 2) } diff --git a/resources/js/components/documents/InvoiceDialog.vue b/resources/js/components/documents/InvoiceDialog.vue index ed3087e..ee1bad8 100644 --- a/resources/js/components/documents/InvoiceDialog.vue +++ b/resources/js/components/documents/InvoiceDialog.vue @@ -12,7 +12,7 @@ import { ref, computed, watch, onMounted, onUpdated, useTemplateRef } from "vue" import { Customer, Invoice, Contact, PaymentTerms, Address } from "@/types" import { newCustomer, newContact, newBillingData } from '@/types/index.d' -import { toCurrency, toLocalDate, toShortISOString, cn, calcDueDate } from '@/lib/utils'; +import { toCurrency, toLocalDate, toShortISOString, cn, calcDueDate, toFixedRounded } from '@/lib/utils'; import axios from 'axios' import { type DateValue, DateFormatter, getLocalTimeZone, parseDate, fromDate } from "@internationalized/date" import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog" @@ -383,8 +383,7 @@ const updateTotalAmount = () => {
{{ toCurrency(invoice.totalAmount) }} - {{ toCurrency(Number((invoice.totalAmount * - 1.19).toFixed(2))) }} + {{ toCurrency(toFixedRounded(Number(invoice.totalAmount * 1.19), 2)) }}
diff --git a/resources/js/lib/utils.ts b/resources/js/lib/utils.ts index dc643c9..b10f67b 100644 --- a/resources/js/lib/utils.ts +++ b/resources/js/lib/utils.ts @@ -7,13 +7,14 @@ export function cn(...inputs: ClassValue[]) { } export function urlIsActive(urlToCheck: NonNullable, currentUrl: string) { - return toUrl(urlToCheck) === currentUrl; + return currentUrl.indexOf(toUrl(urlToCheck)) >= 0 } export function toUrl(href: NonNullable) { return typeof href === 'string' ? href : href?.url; } + const currencyFormatter = new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR', @@ -25,6 +26,10 @@ export function toCurrency(value: number | undefined) { return currencyFormatter.format(value); } +export function toFixedRounded(num: number, precision: number): number { + return Number((Math.round(num * Math.pow(10, precision)) / Math.pow(10, precision)).toFixed(precision)) +} + export function toLocalDate(value: string) { const date = new Date(value); return date.toLocaleDateString('de-DE', { day: '2-digit', month: 'short', year: 'numeric' });