import Spinner from '@/core/components/elements/Spinner/Spinner' import useTransaction from '../hooks/useTransaction' import TransactionStatusBadge from './TransactionStatusBadge' import Divider from '@/core/components/elements/Divider/Divider' import { useEffect, useMemo, useRef, useState } from 'react' import { downloadPurchaseOrder, downloadQuotation } from '../utils/transactions' import BottomPopup from '@/core/components/elements/Popup/BottomPopup' import uploadPoApi from '../api/uploadPoApi' import { toast } from 'react-hot-toast' import getFileBase64 from '@/core/utils/getFileBase64' import currencyFormat from '@/core/utils/currencyFormat' import VariantGroupCard from '@/lib/variant/components/VariantGroupCard' import { ChevronDownIcon, ChevronRightIcon, ChevronUpIcon } from '@heroicons/react/24/outline' import Link from '@/core/components/elements/Link/Link' import Alert from '@/core/components/elements/Alert/Alert' import checkoutPoApi from '../api/checkoutPoApi' import cancelTransactionApi from '../api/cancelTransactionApi' const Transaction = ({ id }) => { const { transaction } = useTransaction({ id }) const [totalAmount, setTotalAmount] = useState(0) const [totalDiscountAmount, setTotalDiscountAmount] = useState(0) useEffect(() => { if (transaction?.data?.products) { let calculateTotalAmount = 0 let calculateTotalDiscountAmount = 0 transaction.data.products.forEach((product) => { calculateTotalAmount += product.price.price * product.quantity calculateTotalDiscountAmount += (product.price.price - product.price.priceDiscount) * product.quantity }) setTotalAmount(calculateTotalAmount) setTotalDiscountAmount(calculateTotalDiscountAmount) } }, [transaction]) const poNumber = useRef('') const poFile = useRef('') const [uploadPo, setUploadPo] = useState(false) const openUploadPo = () => setUploadPo(true) const closeUploadPo = () => setUploadPo(false) const submitUploadPo = async () => { const file = poFile.current.files[0] const name = poNumber.current.value if (typeof file === 'undefined' || !name) { toast.error('Nomor dan Dokumen PO harus diisi', { position: 'bottom-center' }) return } if (file.size > 5000000) { toast.error('Maksimal ukuran file adalah 5MB', { position: 'bottom-center' }) return } const data = { name, file: await getFileBase64(file) } const isUploaded = await uploadPoApi({ id, data }) if (isUploaded) { toast.success('Berhasil upload PO') transaction.refetch() closeUploadPo() return } toast.error('Terjadi kesalahan internal, coba lagi nanti atau hubungi kami') } const [cancelTransaction, setCancelTransaction] = useState(false) const openCancelTransaction = () => setCancelTransaction(true) const closeCancelTransaction = () => setCancelTransaction(false) const submitCancelTransaction = async () => { const isCancelled = await cancelTransactionApi({ transaction: transaction.data }) if (isCancelled) { toast.success('Berhasil batalkan transaksi') transaction.refetch() } closeCancelTransaction() } const checkout = async () => { if (!transaction.data?.purchaseOrderFile) { toast.error('Mohon upload dokumen PO anda sebelum melanjutkan pesanan') return } await checkoutPoApi({ id }) toast.success('Berhasil melanjutkan pesanan') transaction.refetch() } const memoizeVariantGroupCard = useMemo( () => (
Subtotal
{currencyFormat(totalAmount)}
Total Diskon
{currencyFormat(-totalDiscountAmount)}
PPN 11% (Incl.)
{currencyFormat(totalAmount * 0.11)}
Total Belanja
{currencyFormat(transaction.data?.amountTotal)}
Dokumen PO
Invoice
{invoice?.name}
{currencyFormat(invoice.amountTotal)}