import Spinner from '@/core/components/elements/Spinner/Spinner'; import NextImage from 'next/image'; import rejectImage from '../../../../public/images/reject.png'; 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 ImageNext from 'next/image'; 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 { EllipsisVerticalIcon, 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'; import rejectProductApi from '../api/rejectProductApi'; import { useRouter } from 'next/router'; import { gtagPurchase } from '@/core/utils/googleTag'; import { deleteItemCart } from '@/core/utils/cart'; import { downloadInvoice, downloadTaxInvoice, } from '@/lib/invoice/utils/invoices'; import axios from 'axios'; const Transaction = ({ id }) => { const PPN = process.env.NEXT_PUBLIC_PPN; const router = useRouter(); const [isModalOpen, setIsModalOpen] = useState(false); const [selectedProduct, setSelectedProduct] = useState(null); const [reason, setReason] = useState(''); const auth = useAuth(); const { transaction } = useTransaction({ id }); console.log('transaction', transaction); const statusApprovalWeb = transaction.data?.approvalStep; const [isLoading, setIsLoading] = useState(false); const { queryAirwayBill } = useAirwayBill({ orderId: id }); const [airwayBillPopup, setAirwayBillPopup] = useState(null); const [isOpen, setIsOpen] = useState(false); 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 [copied, setCopied] = useState(false); const [toOthers, setToOthers] = useState(null); 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.data, transaction.isLoading]); console.log('totalAmount', totalAmount); console.log('totalDiscountAmount', totalDiscountAmount); 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 [continueNoPo, setContinueNoPo] = useState(false); const [continueTransaction, setContinueTransaction] = useState(false); const openCancelTransaction = () => setCancelTransaction(true); const openContinueTransaction = () => { if (auth.partnerTempo) { checkout(); } else { if (!transaction.data?.purchaseOrderFile) { setContinueTransaction(true); } else { checkoutNoPO(); } } }; // const ContinueTransaction = () => { // setContinueNoPo(true); // checkoutNoPO(); // }; const closeCancelTransaction = () => setCancelTransaction(false); const closeContinueTransaction = () => setContinueTransaction(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, status: true }); toast.success('Berhasil melanjutkan pesanan'); transaction.refetch(); }; const checkoutNoPO = async () => { setIsLoading(true); gtagPurchase( transaction.data.products, transaction.data.deliveryAmount, transaction.data.name ); gtag('event', 'conversion', { send_to: 'AW-954540379/nDymCL3BhaQYENvClMcD', value: transaction.data?.amountTotal + Math.round(parseInt(transaction.data.deliveryAmount * 1.1) / 1000) * 1000, currency: 'IDR', transaction_id: transaction.data.id, }); for (const product of transaction.data.products) deleteItemCart({ productId: product.id }); if (transaction.data?.amountTotal > 0) { const payment = await axios.post( `${process.env.NEXT_PUBLIC_SELF_HOST}/api/shop/midtrans-payment?transactionId=${transaction.data.id}` ); setIsLoading(false); window.location.href = payment.data.redirectUrl; } else { window.location.href = `${ process.env.NEXT_PUBLIC_SELF_HOST }/shop/checkout/success?order_id=${transaction.data.name.replace( /\//g, '-' )}`; } toast.success('Berhasil melanjutkan pesanan'); transaction.refetch(); /* const midtrans = async () => { for (const product of products) deleteItemCart({ productId: product.id }); if (grandTotal > 0) { const payment = await axios.post( `${process.env.NEXT_PUBLIC_SELF_HOST}/api/shop/midtrans-payment?transactionId=${isCheckouted.id}` ); setIsLoading(false); window.location.href = payment.data.redirectUrl; } else { window.location.href = `${ process.env.NEXT_PUBLIC_SELF_HOST }/shop/checkout/success?order_id=${isCheckouted.name.replace( /\//g, '-' )}`; } };*/ }; const handleApproval = async () => { await aprpoveApi({ id }); toast.success('Berhasil melanjutkan approval'); transaction.refetch(); }; const handleReject = async () => { await rejectApi({ id }); closeRejectTransaction(); transaction.refetch(); }; const countWeight = (products) => { if (!products || !Array.isArray(products)) return 0.0; const weight = products.reduce( (total, product) => total + (product.weight * product.quantity || 0), 0 ); return weight + ' Kg'; }; // const memoizeVariantGroupCard = useMemo( // () => ( //
// //
Info Pengiriman
//
//

Metode Pembayaran

//

// {transaction.data?.paymentType // ? transaction.data?.paymentType // ?.replace(/_/g, ' ') // .replace(/\b\w/g, (char) => char.toUpperCase()) // : '-'} //

//
//
//

Berat Barang

//

{transaction.data?.pickings[0]?.weightTotal}

//
//
//
//

Total Belanja

//

{currencyFormat(totalAmount)}

//
//
//

Diskon Belanja

//

{'- ' + currencyFormat(totalDiscountAmount)}

//
//
//

Subtotal

//

{currencyFormat(transaction.data?.amountUntaxed)}

//
//
//

// PPN {((PPN - 1) * 100).toFixed(0)}% //

//

{currencyFormat(transaction.data?.amountTax)}

//
//
//

Biaya Pengiriman

//

{currencyFormat(transaction.data?.deliveryAmount)}

//
//
//

Asuransi Pengiriman

//

{currencyFormat(transaction.data?.amountTotal)}

//
//
//

Grand Total

//

{currencyFormat(transaction.data?.amountTotal)}

//
//
// ), // [transaction.data] // ); const memoizeVariantGroupCardReject = useMemo( () => (
), [transaction.data] ); if (transaction.isLoading) { return (
); } const closePopup = () => { setIdAWB(null); }; const openModal = (product) => { setSelectedProduct(product); setIsModalOpen(true); }; const closeModal = () => { setIsModalOpen(false); setSelectedProduct(null); setReason(''); }; const handleRejectProduct = async () => { try { if (!reason.trim()) { toast.error('Masukkan alasan terlebih dahulu'); return; } else { let idSo = transaction?.data.id; let idProduct = selectedProduct?.id; await rejectProductApi({ idSo, idProduct, reason }); closeModal(); toast.success('Produk berhasil di reject'); setTimeout(() => { window.location.reload(); }, 1500); } } catch (error) { toast.error('Gagal reject produk. Silakan coba lagi.'); } }; const handleCopyClick = (waybillNumber) => { const textToCopy = waybillNumber; navigator.clipboard.writeText(textToCopy); setCopied(true); toast.success('No Resi Berhasil di Copy'); setTimeout(() => setCopied(false), 2000); // Reset copied state after 2 seconds }; const formatDate = (dateString) => { const months = [ 'Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni', 'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember', ]; const [day, month, year] = dateString.split('/'); return `${day} ${months[parseInt(month, 10) - 1]} ${year}`; }; return ( transaction.data?.name && ( <>
Apakah anda yakin melanjutkan tanpa upload PO?{' '} {transaction.data?.name}?
Apakah anda yakin membatalkan transaksi{' '} {transaction.data?.name}?
Apakah anda yakin Membatalkan transaksi{' '} {transaction.data?.name}?
setToOthers(null)} >
setIdAWB(transaction?.data?.pickings[0]?.id)} > Lihat Detail
{auth?.feature?.soApproval && (
)}
Status Transaksi
setToOthers(transaction?.data)} />
{transaction.data?.invoices?.length === 0 ? (

) : ( transaction.data?.invoices?.map((invoice, index) => (
{invoice?.name}
downloadInvoice(invoice)} > Download
)) )}

{transaction.data?.name}

{transaction.data?.dateOrder ? formatDate(transaction.data?.dateOrder) : '-'} {transaction.data?.purchaseOrderName || '-'} {transaction.data?.paymentTerm || '-'} {transaction.data?.sales}
Info Pengiriman
setIdAWB(transaction?.data?.pickings[0]?.id)} > Lihat Detail

{transaction.data?.pickings?.length == 0 ? 'Belum ada pengiriman' : transaction?.data?.pickings[0].name}

{transaction?.data?.pickings[0]?.carrierName ? (

{transaction?.data?.pickings[0]?.carrierName}

) : ( '-' )}

{transaction?.data?.pickings[0]?.serviceType && transaction?.data?.pickings[0]?.carrierName ? transaction?.data?.pickings[0]?.serviceType : '-'}

{transaction?.data?.pickings[0]?.trackingNumber || '-'} {transaction?.data?.pickings[0]?.trackingNumber && ( )}

{transaction?.data?.pickings[0]?.eta ? transaction?.data?.pickings[0]?.eta : '-'}

{transaction?.data?.address?.customer?.name}
{transaction?.data?.address?.customer?.phone ? transaction?.data?.address?.customer?.phone : '-'}
{transaction?.data?.address?.customer?.alamatBisnis}
{/*
{transaction?.data?.pickings?.map((airway) => ( ))}
{transaction?.data?.pickings == 0 && (
Belum ada pengiriman
)} */}
{/*

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
)}
*/} {/* {!auth?.feature.soApproval && (
{transaction.data?.purchaseOrderName || '-'}

Dokumen PO

)} */}
Detail Produk
{transaction?.data?.products.length > 0 ? (
Rincian Pembayaran

Metode Pembayaran

{transaction.data?.paymentType ? transaction.data?.paymentType ?.replace(/_/g, ' ') .replace(/\b\w/g, (char) => char.toUpperCase()) : '-'}

Berat Barang

{transaction.data?.pickings[0]?.weightTotal + ' Kg'}


Total Belanja

{currencyFormat(totalAmount)}

Diskon Belanja

{'- ' + currencyFormat(totalDiscountAmount)}

Subtotal

{currencyFormat(transaction.data?.amountUntaxed)}

PPN {((PPN - 1) * 100).toFixed(0)}%

{currencyFormat(transaction.data?.amountTax)}

Biaya Pengiriman

{currencyFormat(transaction.data?.deliveryAmount)}

Asuransi Pengiriman

-

Grand Total

{currencyFormat(transaction.data?.amountTotal)}

) : (
Semua produk telah di reject
)} {transaction?.data?.productsRejectLine.length > 0 && (
Detail Produk Reject
{memoizeVariantGroupCardReject}
)} {/* */} {/* */} {/* */} {/*
{transaction.data?.status == 'draft' && auth?.feature.soApproval && (
)} {transaction.data?.status == 'draft' && !auth?.feature?.soApproval && ( )} {transaction.data?.status != 'draft' && ( )}
*/}

Detail Transaksi

{auth?.feature?.soApproval && ( )}
{transaction?.data?.name}
{/*
{transaction.data?.status == 'draft' && auth?.feature?.soApproval && auth?.webRole && (
)} {transaction.data?.status == 'draft' && !auth?.feature.soApproval && ( )} {transaction.data?.status != 'draft' && !auth?.feature.soApproval && ( )}
*/}
Nama Sales
: {transaction?.data?.sales}
Tanggal Transaksi
: {transaction?.data?.dateOrder}
{!auth?.feature?.soApproval ? ( <>
Purchase Order
: {transaction?.data?.purchaseOrderName}{' '}
) : ( <>
Site
: {transaction?.data?.sitePartner}
)}
Payment Term
: {transaction?.data?.paymentTerm}
Dokumen Pengiriman
:{' '} {transaction.data?.pickings?.length === 0 ? 'Belum ada pengiriman' : transaction?.data?.pickings[0].name}
Invoice Pembelian
:{' '} {transaction.data?.invoices?.length === 0 ? 'Belum ada invoice' : transaction.data?.invoices?.map((invoice, index) => ( {invoice?.name} {/*

{invoice?.name}

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

{currencyFormat(invoice.amountTotal)}

*/} ))}

{/*
*/}
Alamat Pengiriman
Nama Penerima
:
{transaction?.data?.address?.customer?.name}
No. Telepon
:
{transaction?.data?.address?.customer?.phone ? transaction?.data?.address?.customer?.phone : '-'}
Email
:
{transaction?.data?.address?.customer?.email ? transaction?.data?.address?.customer?.email : '-'}
Alamat Pengiriman
:
{transaction?.data?.address?.customer?.alamatBisnis}
Info Pengiriman
Nomor Resi
:
{transaction?.data?.pickings[0]?.trackingNumber || '-'} {transaction?.data?.pickings[0]?.trackingNumber && ( )}
Kurir
:
{transaction?.data?.pickings[0]?.carrierName ? (

{transaction?.data?.pickings[0]?.carrierName}

setIdAWB(transaction?.data?.pickings[0]?.id) } > Lacak Pengiriman
) : ( '-' )}
Jenis Service
:
{' '} {transaction?.data?.pickings[0]?.serviceType && transaction?.data?.pickings[0]?.carrierName ? transaction?.data?.pickings[0]?.serviceType : '-'}
Tanggal Kirim
:
{transaction?.data?.pickings[0]?.date ? formatDate(transaction?.data?.pickings[0]?.date) : '-'}
Estimasi Tiba
:
{transaction?.data?.pickings[0]?.eta ? transaction?.data?.pickings[0]?.eta : '-'}
{transaction?.data?.pickings[0] && (
)}

{/*
Informasi Pelanggan
Detail Pelanggan
Pengiriman
{transaction?.data?.pickings.length == 0 && (
Belum ada pengiriman
)}
{transaction?.data?.pickings?.map((airway) => ( ))}
Invoice
{transaction.data?.invoices?.length === 0 && (
Belum ada invoice
)}
{transaction.data?.invoices?.map((invoice, index) => (

{invoice?.name}

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

{currencyFormat(invoice.amountTotal)}

))}
*/}
Rincian Pembelian
{transaction?.data?.products?.length > 0 ? ( {/* */} {transaction?.data?.products?.map((product) => ( {/* */} {/* {auth?.feature.soApproval && (auth.webRole == 2 || auth.webRole == 3) && (transaction.data.isReaject == false) && ( */} {auth?.feature.soApproval && (auth.webRole == 2 || auth.webRole == 3) && router.asPath.includes('/my/quotations/') && transaction.data?.status == 'draft' && ( )} ))}
Nama ProdukDiskonJumlah Harga Subtotal
{product?.name}
{product.isSni && ( )}
{product.isTkdn && ( )}
{product?.parent?.name}
{product?.code}{' '} {product?.attributes.length > 0 ? `| ${product?.attributes.join(', ')}` : ''}
{product.soQty && (
{product.soQty !== product.reservedStockQty ? 'Barang sedang disiapkan' : `${product.reservedStockQty} barang bisa di kirim/pickup`}
)}
{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)}
) : (
Semua produk telah di reject
)} {isModalOpen && (

Berikan Alasan

)} {transaction?.data?.products?.length > 0 && ( //
//
//
Subtotal
//
// {currencyFormat(transaction.data?.amountUntaxed)} //
//
// PPN {((PPN - 1) * 100).toFixed(0)}% //
//
// {currencyFormat(transaction.data?.amountTax)} //
//
// Biaya Pengiriman //
//
// {currencyFormat(transaction.data?.deliveryAmount)} //
//
Grand Total
//
// {currencyFormat(transaction.data?.amountTotal)} //
//
//
Total Belanja
{currencyFormat(totalAmount)}
Total Diskon
{'- ' + currencyFormat(totalDiscountAmount)}

Subtotal
{currencyFormat(transaction.data?.amountUntaxed)}
PPN {((PPN - 1) * 100).toFixed(0)}%
{currencyFormat(transaction.data?.amountTax)}
Biaya Pengiriman
{currencyFormat(transaction.data?.deliveryAmount)}

Grand Total
{currencyFormat(transaction.data?.amountTotal)}
)} {transaction?.data?.productsRejectLine.length > 0 && (
Rincian Produk Reject
)} {transaction?.data?.productsRejectLine.length > 0 && ( {/* */} {transaction?.data?.productsRejectLine?.map((product) => ( {/* */} ))}
Nama ProdukDiskonJumlah Harga Subtotal
{product?.name}
{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)}
)}
{/* {queryAirwayBill.data?.airways?.map((airway) => ( setAirwayBillPopup(null)} >
No Pengiriman
{airway?.deliveryOrder?.name}
Kurir
{airway?.deliveryOrder?.carrier}
No Resi
{airway?.waybillNumber}
Status Pengiriman
    {airway?.manifests?.map((manifest, index) => (
  1. {manifest.description}

  2. ))} {(!airway?.manifests || airway?.manifests?.length == 0) && (
    Belum ada pengiriman
    )}
))} */} ) ); }; const SectionAddress = ({ address }) => { const [section, setSection] = useState({ customer: false, invoice: false, shipping: false, }); const toggleSection = (name) => { setSection({ ...section, [name]: !section[name] }); }; return ( <> toggleSection('customer')} /> {section.customer && } {/* toggleSection('shipping')} /> {section.shipping && } toggleSection('invoice')} /> {section.invoice && } */} ); }; const SectionButton = ({ label, active, toggle }) => ( ); const SectionContent = ({ address }) => { let fullAddress = []; if (address?.street) fullAddress.push(address.street); if (address?.subDistrict?.name) fullAddress.push(toTitleCase(address.subDistrict.name)); if (address?.district?.name) fullAddress.push(toTitleCase(address.district.name)); if (address?.city?.name) fullAddress.push(toTitleCase(address.city.name)); fullAddress = fullAddress.join(', '); return (
{address.name} {address.email || '-'} {address.mobile || '-'} {fullAddress}
); }; const DescriptionRow = ({ children, label }) => (
{label} {children}
); export default Transaction;