import { useRouter } from 'next/router'; import { useEffect, useState } from 'react'; import { toast } from 'react-hot-toast'; import { EllipsisVerticalIcon, MagnifyingGlassIcon, } from '@heroicons/react/24/outline'; import useAuth from '@/core/hooks/useAuth'; import { downloadPurchaseOrder, downloadQuotation, } from '../utils/transactions'; import useTransactions from '../hooks/useTransactions'; import currencyFormat from '@/core/utils/currencyFormat'; import cancelTransactionApi from '../api/cancelTransactionApi'; import TransactionStatusBadge from './TransactionStatusBadge'; import Spinner from '@/core/components/elements/Spinner/Spinner'; import Link from '@/core/components/elements/Link/Link'; import BottomPopup from '@/core/components/elements/Popup/BottomPopup'; import Pagination from '@/core/components/elements/Pagination/Pagination'; import { toQuery } from 'lodash-contrib'; import _ from 'lodash'; import Alert from '@/core/components/elements/Alert/Alert'; import MobileView from '@/core/components/views/MobileView'; import DesktopView from '@/core/components/views/DesktopView'; import Menu from '@/lib/auth/components/Menu'; import * as XLSX from 'xlsx'; const Transactions = ({ context = '' }) => { const auth = useAuth(); const router = useRouter(); const { q = '', page = 1, site = null } = router.query; const limit = 15; const [inputQuery, setInputQuery] = useState(q); const [toOthers, setToOthers] = useState(null); const [toCancel, setToCancel] = useState(null); const [siteFilter, setSiteFilter] = useState(site); const query = { name: q, offset: (page - 1) * limit, context, limit, site: siteFilter || (auth?.webRole === null && auth?.site ? auth.site : null), }; const { transactions } = useTransactions({ query }); const submitCancelTransaction = async () => { const isCancelled = await cancelTransactionApi({ transaction: toCancel, }); if (isCancelled) { toast.success('Berhasil batalkan transaksi'); transactions.refetch(); } setToCancel(null); }; const pageCount = Math.ceil(transactions?.data?.saleOrderTotal / limit); let pageQuery = _.omit(query, ['limit', 'offset', 'context']); pageQuery = _.pickBy( pageQuery, (value, key) => value !== '' && !(key === 'page' && value === '1') ); pageQuery = toQuery(pageQuery); const handleSubmit = (e) => { e.preventDefault(); const queryParams = {}; if (inputQuery) queryParams.q = inputQuery; if (siteFilter) queryParams.site = siteFilter; router.push({ pathname: router.pathname, query: queryParams, }); }; const handleSiteFilterChange = (e) => { setSiteFilter(e.target.value); const queryParams = {}; if (inputQuery) queryParams.q = inputQuery; if (e.target.value) queryParams.site = e.target.value; router.push({ pathname: router.pathname, query: queryParams, }); }; const exportToExcel = (data, siteFilter) => { const fieldsToExport = [ 'No. Transaksi', 'No. PO', 'Tanggal', 'Created By', 'Salesperson', 'Total', 'Status', ]; const rowsToExport = []; data.forEach((saleOrder) => { const row = { 'No. Transaksi': saleOrder.name, 'No. PO': saleOrder.purchaseOrderName || '-', 'Tanggal': saleOrder.dateOrder || '-', 'Created By': saleOrder.address.customer?.name || '-', 'Salesperson': saleOrder.sales, 'Total': currencyFormat(saleOrder.amountTotal), 'Status': saleOrder.status, }; if(siteFilter){ row['Site'] = siteFilter; } rowsToExport.push(row); }); const worksheet = XLSX.utils.json_to_sheet(rowsToExport, { header: fieldsToExport, }); const workbook = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1'); XLSX.writeFile(workbook, 'transactions.xlsx'); }; const handleExportExcel = () => { const dataToExport = transactions.data.saleOrders; exportToExcel(dataToExport, siteFilter); }; return ( <>
setInputQuery(e.target.value)} />
{transactions.isLoading && (
)} {!transactions.isLoading && transactions.data?.saleOrders?.length === 0 && ( Tidak ada transaksi )} {transactions.data?.saleOrders?.map((saleOrder, index) => (
No. Transaksi

{saleOrder.name}

setToOthers(saleOrder)} />
No. Purchase Order

{saleOrder.purchaseOrderName || '-'}

Total Invoice

{saleOrder.invoiceCount} Invoice

Sales

{saleOrder.sales}

Total Harga

{currencyFormat(saleOrder.amountTotal)}

))} setToOthers(null)} >
setToCancel(null)} title='Batalkan Transaksi' >
Apakah anda yakin membatalkan transaksi{' '} {toCancel?.name}?

Daftar Transaksi{' '} {transactions?.data?.saleOrders ? `(${transactions?.data?.saleOrders.length})` : ''}

setInputQuery(e.target.value)} />
{transactions.isLoading && ( )} {!transactions.isLoading && (!transactions?.data?.saleOrders || transactions?.data?.saleOrders?.length == 0) && ( )} {transactions.data?.saleOrders?.map((saleOrder) => ( ))}
No. Transaksi No. PO Tanggal Created By Salesperson Total Status
Tidak ada transaksi
{saleOrder.name} {saleOrder.purchaseOrderName || '-'} {saleOrder.dateOrder || '-'} {saleOrder.address.customer?.name || '-'} {saleOrder.sales} {currencyFormat(saleOrder.amountTotal)}
); }; export default Transactions;