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 { 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 checkoutPoApi from '../api/checkoutPoApi'; import cancelTransactionApi from '../api/cancelTransactionApi'; import MobileView from '@/core/components/views/MobileView'; import DesktopView from '@/core/components/views/DesktopView'; import Menu from '@/lib/auth/components/Menu'; import Image from '@/core/components/elements/Image/Image'; import { createSlug } from '@/core/utils/slug'; import toTitleCase from '@/core/utils/toTitleCase'; import useAirwayBill from '../hooks/useAirwayBill'; import Manifest from '@/lib/treckingAwb/component/Manifest'; import useAuth from '@/core/hooks/useAuth'; import StepApproval from './stepper'; import aprpoveApi from '../api/approveApi'; import rejectApi from '../api/rejectApi'; const Transaction = ({ id }) => { const auth = useAuth(); const { transaction } = useTransaction({ id }); const statusApprovalWeb = transaction.data?.approvalStep const { queryAirwayBill } = useAirwayBill({ orderId: id }); const [airwayBillPopup, setAirwayBillPopup] = useState(null); const poNumber = useRef(null); const poFile = useRef(null); const [uploadPo, setUploadPo] = useState(false); const [idAWB, setIdAWB] = useState(null); 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'); return; } if (file.size > 5000000) { toast.error('Maksimal ukuran file adalah 5MB'); 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 [rejectTransaction, setRejectTransaction] = useState(false); const openRejectTransaction = () => setRejectTransaction(true); const closeRejectTransaction = () => setRejectTransaction(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 handleApproval = async () => { await aprpoveApi({ id }); toast.success('Berhasil melanjutkan approval'); transaction.refetch(); } const handleReject = async () => { await rejectApi({ id }); closeRejectTransaction() transaction.refetch(); } const memoizeVariantGroupCard = useMemo( () => (
Subtotal
{currencyFormat(transaction.data?.amountUntaxed)}
PPN 11%
{currencyFormat(transaction.data?.amountTax)}
Biaya Pengiriman
{currencyFormat(transaction.data?.deliveryAmount)}
Grand Total
{currencyFormat(transaction.data?.amountTotal)}
Dokumen PO
Invoice
{invoice?.name}
{currencyFormat(invoice.amountTotal)}
| Nama Produk | Diskon | Jumlah | Harga | Subtotal |
|---|---|---|---|---|
|
{product?.parent?.name}
{product?.code}{' '}
{product?.attributes.length > 0
? `| ${product?.attributes.join(', ')}`
: ''}
|
{product.price.discountPercentage > 0 ? `${product.price.discountPercentage}%` : ''} | {product.quantity} |
{product.price.discountPercentage > 0 && (
{currencyFormat(product.price.price)}
)}
{currencyFormat(product.price.priceDiscount)}
|
{currencyFormat(product.price.subtotal)} |
{invoice?.name}
{currencyFormat(invoice.amountTotal)}
{manifest.description}