From 3b1e84b6d8180990455dee6da0d555aa9c3ce564 Mon Sep 17 00:00:00 2001 From: Methapon Metanipat Date: Fri, 4 Oct 2024 13:01:30 +0700 Subject: [PATCH] refactor: calculate utility --- src/controllers/05-quotation-controller.ts | 15 ++++++++------- src/utils/arithmetic.ts | 4 ++++ 2 files changed, 12 insertions(+), 7 deletions(-) create mode 100644 src/utils/arithmetic.ts diff --git a/src/controllers/05-quotation-controller.ts b/src/controllers/05-quotation-controller.ts index 213cb81..a5ced86 100644 --- a/src/controllers/05-quotation-controller.ts +++ b/src/controllers/05-quotation-controller.ts @@ -22,6 +22,7 @@ import { } from "../services/permission"; import { isSystem } from "../utils/keycloak"; import { isUsedError, notFoundError, relationError } from "../utils/error"; +import { precisionRound } from "../utils/arithmetic"; type QuotationCreate = { status?: Status; @@ -332,14 +333,14 @@ export class QuotationController extends Controller { const price = list.reduce( (a, c) => { - const price = c.pricePerUnit * c.amount; - const discount = Math.round(price * (c.discount || 0) * 100) / 100; - const vat = Math.round((price - discount) * c.vat * 100) / 100; + const price = precisionRound(c.pricePerUnit * c.amount); + const discount = precisionRound(price - (c.discount || 0)); + const vat = precisionRound((price - discount) * c.vat); - a.totalPrice += price; - a.totalDiscount += discount; - a.vat += vat; - a.finalPrice += price - discount + vat; + a.totalPrice = precisionRound(a.totalPrice + price); + a.totalDiscount = precisionRound(a.totalDiscount + discount); + a.vat = precisionRound(a.vat + vat); + a.finalPrice = precisionRound(a.totalPrice - a.totalDiscount + a.vat); return a; }, diff --git a/src/utils/arithmetic.ts b/src/utils/arithmetic.ts new file mode 100644 index 0000000..4f48f2d --- /dev/null +++ b/src/utils/arithmetic.ts @@ -0,0 +1,4 @@ +export function precisionRound(number: number, precision = 2) { + var factor = Math.pow(10, precision); + return Math.round(number * factor) / factor; +}