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 { 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 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 [ section, setSection ] = useState({ customer: false, invoice: false, shipping: false }) const toggleSection = (name) => { setSection({ ...section, [name]: !section[name] }) } 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() } if (transaction.isLoading) { return (
) } return transaction.data?.name && ( <>
{ transaction.data?.name } { transaction.data?.paymentTerm } { transaction.data?.sales } { transaction.data?.dateOrder }
{ transaction.data?.purchaseOrderName || '-' }

Dokumen PO

Detail Produk

Total Belanja

{ currencyFormat(transaction.data?.amountTotal) }

toggleSection('customer')} /> { section.customer && } toggleSection('shipping')} /> { section.shipping && } toggleSection('invoice')} /> { section.invoice && }

Invoice

{ transaction.data?.invoices?.map((invoice, index) => (

{ invoice?.name }

{ invoice.amountResidual > 0 ? (
Belum Lunas
) : (
Lunas
) }

{ currencyFormat(invoice.amountTotal) }

)) } { transaction.data?.invoices?.length === 0 && ( Belum ada Invoice ) }
{ transaction.data?.status == 'draft' && ( ) } { transaction.data?.status != 'draft' && ( ) }
Apakah anda yakin membatalkan transaksi {transaction.data?.name}?
) } const SectionButton = ({ label, active, toggle }) => ( ) const SectionContent = ({ address }) => { let fullAddress = [] if (address?.street) fullAddress.push(address.street) if (address?.subDistrict?.name) fullAddress.push(address.sub_district.name) if (address?.district?.name) fullAddress.push(address.district.name) if (address?.city?.name) fullAddress.push(address.city.name) fullAddress = fullAddress.join(', ') return (
{ address.name } { address.email || '-' } { address.mobile || '-' } { fullAddress }
) } const DescriptionRow = ({ children, label }) => (
{ label } { children }
) export default Transaction