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'; import getSite from '../api/listSiteApi'; import transactionsApi from '../api/transactionsApi'; 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 [listSites, setListSites] = useState([]); 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 fetchSite = async () => { const site = await getSite(); setListSites(site.sites); }; 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 getAllData = async () => { const query = { name: q, context, site: siteFilter || (auth?.webRole === null && auth?.site ? auth.site : null), }; const queryString = toQuery(query) const data = await transactionsApi({ query: queryString }); return data; }; const handleExportExcel = async () => { const dataToExport = await getAllData(); exportToExcel(dataToExport?.saleOrders, siteFilter); }; useEffect(() => { fetchSite(); }, []); 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})` : ''}

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