diff --git a/src/components/05_quotation/ProductItem.vue b/src/components/05_quotation/ProductItem.vue index a705631d..20990594 100644 --- a/src/components/05_quotation/ProductItem.vue +++ b/src/components/05_quotation/ProductItem.vue @@ -57,11 +57,18 @@ const currentBtnOpen = ref<{ title: string; opened: boolean[] }[]>([ ]); function calcPrice(c: (typeof rows.value)[number]) { - const price = c.pricePerUnit * c.amount; + const originalPrice = c.pricePerUnit; + const finalPriceWithVat = precisionRound( + originalPrice + + (c.product.vatIncluded || c.vat !== 0 + ? 0 + : originalPrice * (config.value?.vat || 0.07)), + ); + const finalPriceNoVat = finalPriceWithVat / (1 + (config.value?.vat || 0.07)); + + const price = finalPriceNoVat * c.amount; const vat = c.product.calcVat - ? (c.pricePerUnit * (c.discount ? c.amount : 1) - c.discount) * - (config.value?.vat || 0.07) * - (!c.discount ? c.amount : 1) + ? (finalPriceNoVat * c.amount - c.discount) * (config.value?.vat || 0.07) : 0; return precisionRound(price + vat); } diff --git a/src/pages/05_quotation/QuotationForm.vue b/src/pages/05_quotation/QuotationForm.vue index 5e11b252..26329fff 100644 --- a/src/pages/05_quotation/QuotationForm.vue +++ b/src/pages/05_quotation/QuotationForm.vue @@ -242,11 +242,19 @@ function getPrice( return a; } - const price = c.pricePerUnit * c.amount; + const originalPrice = c.pricePerUnit; + const finalPriceWithVat = precisionRound( + originalPrice + + (c.product.vatIncluded + ? 0 + : originalPrice * (config.value?.vat || 0.07)), + ); + const finalPriceNoVat = + finalPriceWithVat / (1 + (config.value?.vat || 0.07)); + + const price = finalPriceNoVat * c.amount; const vat = - (c.pricePerUnit * (c.discount ? c.amount : 1) - c.discount) * - (config.value?.vat || 0.07) * - (!c.discount ? c.amount : 1); + (finalPriceNoVat * c.amount - c.discount) * (config.value?.vat || 0.07); a.totalPrice = precisionRound(a.totalPrice + price); a.totalDiscount = precisionRound(a.totalDiscount + Number(c.discount)); @@ -704,12 +712,12 @@ function handleUpdateProductTable( const pricePerUnit = c.pricePerUnit || 0; const discount = c.discount || 0; - return precisionRound( + return ( pricePerUnit * c.amount - - discount + - (c.product.calcVat - ? (pricePerUnit * c.amount - discount) * (config.value?.vat || 0.07) - : 0), + discount + + (c.product.calcVat + ? (pricePerUnit * c.amount - discount) * (config.value?.vat || 0.07) + : 0) ); }; @@ -767,17 +775,15 @@ function toggleDeleteProduct(index: number) { ? currProduct.product.agentPrice : currProduct.product.price; const pricePerUnit = currProduct.product.vatIncluded - ? precisionRound(price / (1 + (config.value?.vat || 0.07))) + ? price / (1 + (config.value?.vat || 0.07)) : price; - const vat = precisionRound( + const vat = (pricePerUnit * currProduct.amount - currProduct.discount) * - (config.value?.vat || 0.07), - ); - const finalPrice = precisionRound( + (config.value?.vat || 0.07); + const finalPrice = pricePerUnit * currProduct.amount + - vat - - Number(currProduct.discount || 0), - ); + vat - + Number(currProduct.discount || 0); currTempPaySplit.amount = currPaySplit.amount - finalPrice; currPaySplit.amount = currTempPaySplit.amount; diff --git a/src/pages/05_quotation/preview/ViewForm.vue b/src/pages/05_quotation/preview/ViewForm.vue index 636d32d9..c1fab7b7 100644 --- a/src/pages/05_quotation/preview/ViewForm.vue +++ b/src/pages/05_quotation/preview/ViewForm.vue @@ -228,23 +228,33 @@ onMounted(async () => { productList.value = (data?.value?.productServiceList ?? data.value?.productServiceList).map( - (v) => ({ - id: v.product.id, - code: v.product.code, - detail: v.product.name, - amount: v.amount || 0, - priceUnit: v.pricePerUnit || 0, - discount: v.discount || 0, - vat: v.vat || 0, - value: precisionRound( - (v.pricePerUnit || 0) * v.amount - - (v.discount || 0) + - (v.product.calcVat - ? ((v.pricePerUnit || 0) * v.amount - (v.discount || 0)) * - (config.value?.vat || 0.07) - : 0), - ), - }), + (v) => { + const originalPrice = v.pricePerUnit; + const finalPriceWithVat = precisionRound( + originalPrice + + (v.product.vatIncluded || v.vat !== 0 + ? 0 + : originalPrice * (config.value?.vat || 0.07)), + ); + const finalPriceNoVat = + finalPriceWithVat / (1 + (config.value?.vat || 0.07)); + + const price = finalPriceNoVat * v.amount; + const vat = + (finalPriceNoVat * v.amount - v.discount) * + (config.value?.vat || 0.07); + + return { + id: v.product.id, + code: v.product.code, + detail: v.product.name, + amount: v.amount || 0, + priceUnit: v.pricePerUnit || 0, + discount: v.discount || 0, + vat: v.vat || 0, + value: precisionRound(price + (v.product.calcVat ? vat : 0)), + }; + }, ) || []; } @@ -253,11 +263,19 @@ onMounted(async () => { [] ).reduce( (a, c) => { - const price = precisionRound((c.pricePerUnit || 0) * c.amount); - const vat = precisionRound( - ((c.pricePerUnit || 0) * c.amount - (c.discount || 0)) * - (config.value?.vat || 0.07), + const originalPrice = c.pricePerUnit; + const finalPriceWithVat = precisionRound( + originalPrice + + (c.product.vatIncluded || c.vat !== 0 + ? 0 + : originalPrice * (config.value?.vat || 0.07)), ); + const finalPriceNoVat = + finalPriceWithVat / (1 + (config.value?.vat || 0.07)); + + const price = finalPriceNoVat * c.amount; + const vat = + (finalPriceNoVat * c.amount - c.discount) * (config.value?.vat || 0.07); a.totalPrice = precisionRound(a.totalPrice + price); a.totalDiscount = precisionRound(a.totalDiscount + Number(c.discount));