From d1a018ce300e1b59374db77459cdd6296f9b822e Mon Sep 17 00:00:00 2001 From: Miqdad Date: Wed, 28 May 2025 15:11:12 +0700 Subject: make detail invoice similar to detail transaction --- src/lib/invoice/components/Invoice.jsx | 158 +++++++++++++++++++++------------ 1 file changed, 99 insertions(+), 59 deletions(-) (limited to 'src/lib/invoice/components') diff --git a/src/lib/invoice/components/Invoice.jsx b/src/lib/invoice/components/Invoice.jsx index 15bfa746..a26b231f 100644 --- a/src/lib/invoice/components/Invoice.jsx +++ b/src/lib/invoice/components/Invoice.jsx @@ -1,60 +1,66 @@ -import Spinner from '@/core/components/elements/Spinner/Spinner' -import useInvoice from '../hooks/useInvoice' -import { downloadInvoice, downloadTaxInvoice } from '../utils/invoices' -import Divider from '@/core/components/elements/Divider/Divider' -import VariantGroupCard from '@/lib/variant/components/VariantGroupCard' -import currencyFormat from '@/core/utils/currencyFormat' -import MobileView from '@/core/components/views/MobileView' -import DesktopView from '@/core/components/views/DesktopView' -import Menu from '@/lib/auth/components/Menu' -import Link from '@/core/components/elements/Link/Link' -import Image from '@/core/components/elements/Image/Image' -import { createSlug } from '@/core/utils/slug' -import { useEffect, useState } from 'react' +import Spinner from '@/core/components/elements/Spinner/Spinner'; +import useInvoice from '../hooks/useInvoice'; +import { downloadInvoice, downloadTaxInvoice } from '../utils/invoices'; +import Divider from '@/core/components/elements/Divider/Divider'; +import VariantGroupCard from '@/lib/variant/components/VariantGroupCard'; +import currencyFormat from '@/core/utils/currencyFormat'; +import MobileView from '@/core/components/views/MobileView'; +import DesktopView from '@/core/components/views/DesktopView'; +import Menu from '@/lib/auth/components/Menu'; +import Link from '@/core/components/elements/Link/Link'; +import Image from '@/core/components/elements/Image/Image'; +import { createSlug } from '@/core/utils/slug'; +import { useEffect, useState } from 'react'; const Invoice = ({ id }) => { - const PPN = process.env.NEXT_PUBLIC_PPN - const { invoice } = useInvoice({ id }) + const PPN = process.env.NEXT_PUBLIC_PPN; + const { invoice } = useInvoice({ id }); - const [totalAmount, setTotalAmount] = useState(0) - const [totalDiscountAmount, setTotalDiscountAmount] = useState(0) + const [totalAmount, setTotalAmount] = useState(0); + const [totalDiscountAmount, setTotalDiscountAmount] = useState(0); + + const amountBeforePPN = invoice.data?.amountTotal / PPN; + const taxAmount = invoice.data?.amountTotal - amountBeforePPN; useEffect(() => { if (invoice?.data?.products) { - let calculateTotalAmount = 0 - let calculateTotalDiscountAmount = 0 + let calculateTotalAmount = 0; + let calculateTotalDiscountAmount = 0; invoice.data.products.forEach((product) => { - calculateTotalAmount += product.price.price * product.quantity + calculateTotalAmount += product.price.price * product.quantity; calculateTotalDiscountAmount += - (product.price.price - product.price.priceDiscount) * product.quantity - }) - setTotalAmount(calculateTotalAmount) - setTotalDiscountAmount(calculateTotalDiscountAmount) + (product.price.price - product.price.priceDiscount) * + product.quantity; + }); + setTotalAmount(calculateTotalAmount); + setTotalDiscountAmount(calculateTotalDiscountAmount); } - }, [invoice]) + }, [invoice]); if (invoice.isLoading) { return (
- ) + ); } - const address = invoice.data?.customer - let fullAddress = [] - if (address?.street) fullAddress.push(address.street) - if (address?.subDistrict?.name) fullAddress.push(address.subDistrict.name) - if (address?.district?.name) fullAddress.push(address.district.name) - if (address?.city?.name) fullAddress.push(address.city.name) - fullAddress = fullAddress.join(', ') + const address = invoice.data?.customer; + let fullAddress = []; + if (address?.street) fullAddress.push(address.street); + if (address?.subDistrict?.name) fullAddress.push(address.subDistrict.name); + if (address?.district?.name) fullAddress.push(address.district.name); + if (address?.city?.name) fullAddress.push(address.city.name); + fullAddress = fullAddress.join(', '); return ( invoice.data?.name && ( <>
- {invoice.data?.name} + + {invoice.data?.name} + {invoice.data?.amountResidual > 0 ? ( Belum Lunas @@ -68,13 +74,18 @@ const Invoice = ({ id }) => { {invoice.data?.paymentTerm} - {invoice.data?.amountResidual > 0 && invoice.invoiceDate != invoice.invoiceDateDue && ( - - {invoice.data?.invoiceDateDue} - - )} - {invoice.data?.sales} - {invoice.data?.invoiceDate} + {invoice.data?.amountResidual > 0 && + invoice.invoiceDate != invoice.invoiceDateDue && ( + + {invoice.data?.invoiceDateDue} + + )} + + {invoice.data?.sales} + + + {invoice.data?.invoiceDate} +

Invoice

-

Invoice & Faktur Pajak

+

+ Invoice & Faktur Pajak +

- {invoice?.data?.name} + + {invoice?.data?.name} + {invoice?.data?.amountResidual > 0 ? (
Belum Lunas
) : ( @@ -180,14 +199,16 @@ const Invoice = ({ id }) => {
-
Rincian Pembelian
+
+ Rincian Pembelian +
- + {/* */} @@ -229,13 +250,22 @@ const Invoice = ({ id }) => { - + {/* */} + - ))} @@ -244,20 +274,30 @@ const Invoice = ({ id }) => {
Subtotal
-
{currencyFormat(totalAmount)}
+
+ {currencyFormat( + totalAmount - totalDiscountAmount - taxAmount + )} +
-
Total Diskon
+ {/*
Total Diskon
- {currencyFormat(-totalDiscountAmount)} + {currencyFormat(totalDiscountAmount)} +
*/} +
+ PPN {((PPN - 1) * 100).toFixed(0)}% +
+
+ {currencyFormat( + invoice.data?.amountTotal - + invoice.data?.amountTotal / PPN + )}
Grand Total
{currencyFormat(invoice.data?.amountTotal)}
- -
PPN {((PPN - 1) * 100).toFixed(0)}% (Incl.)
-
{currencyFormat(invoice.data?.amountTotal - totalAmount)}
@@ -265,14 +305,14 @@ const Invoice = ({ id }) => { ) - ) -} + ); +}; const DescriptionRow = ({ children, label }) => (
{label} {children}
-) +); -export default Invoice +export default Invoice; -- cgit v1.2.3
Nama Produk Jumlah HargaDiskonDiskonSubtotal
{product.quantity}{currencyFormat(product.price.price)} + {currencyFormat( + product.price.priceDiscount - taxAmount + )} + {product.price.discountPercentage > 0 ? `${product.price.discountPercentage}%` : ''} + + {currencyFormat( + product.price.priceDiscount * product.quantity - + taxAmount + )} {currencyFormat(product.price.priceDiscount * product.quantity)}