From cd072c875c334b1140e4f797a37a9e991d53e2b5 Mon Sep 17 00:00:00 2001 From: it-fixcomart Date: Wed, 26 Feb 2025 16:29:27 +0700 Subject: CR repear order --- src/lib/transaction/components/Transactions.jsx | 294 +++++++++++++++++++++--- 1 file changed, 265 insertions(+), 29 deletions(-) (limited to 'src/lib') diff --git a/src/lib/transaction/components/Transactions.jsx b/src/lib/transaction/components/Transactions.jsx index 92bdd276..a8685105 100644 --- a/src/lib/transaction/components/Transactions.jsx +++ b/src/lib/transaction/components/Transactions.jsx @@ -4,9 +4,10 @@ import { toast } from 'react-hot-toast'; import { EllipsisVerticalIcon, MagnifyingGlassIcon, + ChevronDownIcon, + ChevronUpIcon, } from '@heroicons/react/24/outline'; import useAuth from '@/core/hooks/useAuth'; - import { downloadPurchaseOrder, downloadQuotation, @@ -28,32 +29,31 @@ import Menu from '@/lib/auth/components/Menu'; import * as XLSX from 'xlsx'; import getSite from '../api/listSiteApi'; import transactionsApi from '../api/transactionsApi'; - +import { motion } from 'framer-motion'; +import Image from '@/core/components/elements/Image/Image'; const Transactions = ({ context = '' }) => { const auth = useAuth(); const router = useRouter(); - const { q = '', page = 1, site = null } = router.query; - - const limit = 15; + const { q = '', page = 1, site = null, limit = 15 } = router.query; const [inputQuery, setInputQuery] = useState(q); const [toOthers, setToOthers] = useState(null); const [toCancel, setToCancel] = useState(null); const [listSites, setListSites] = useState([]); - + const [isOpen, setIsOpen] = useState(false); const [siteFilter, setSiteFilter] = useState(site); - + const [pageNew, setPageNew] = useState(page); + const [limitNew, setLimitNew] = useState(limit); const query = { name: q, - offset: (page - 1) * limit, + offset: (pageNew - 1) * limitNew, context, - limit, + limit: limitNew, site: siteFilter || (auth?.webRole === null && auth?.site ? auth.site : null), }; - const { transactions } = useTransactions({ query }); - + console.log('transactions', transactions); const fetchSite = async () => { const site = await getSite(); setListSites(site.sites); @@ -70,7 +70,7 @@ const Transactions = ({ context = '' }) => { setToCancel(null); }; - const pageCount = Math.ceil(transactions?.data?.saleOrderTotal / limit); + const pageCount = Math.ceil(transactions?.data?.saleOrderTotal / limitNew); let pageQuery = _.omit(query, ['limit', 'offset', 'context']); pageQuery = _.pickBy( pageQuery, @@ -137,6 +137,58 @@ const Transactions = ({ context = '' }) => { XLSX.writeFile(workbook, 'transactions.xlsx'); }; + const handleExportCSV = async () => { + const dataToExport = await getAllData(); + + exportToCSV(dataToExport?.saleOrders, siteFilter); + }; + + const exportToCSV = (data, siteFilter) => { + const fieldsToExport = [ + 'No. Transaksi', + 'No. PO', + 'Tanggal', + 'Created By', + 'Salesperson', + 'Total', + 'Status', + ]; + + if (siteFilter) { + fieldsToExport.push('Site'); + } + + const rowsToExport = data.map((saleOrder) => { + const row = [ + saleOrder.name, + saleOrder.purchaseOrderName || '-', + saleOrder.dateOrder || '-', + saleOrder.address.customer?.name || '-', + saleOrder.sales, + currencyFormat(saleOrder.amountTotal), + saleOrder.status, + ]; + + if (siteFilter) { + row.push(siteFilter); + } + + return row.join(','); + }); + + const csvContent = + 'data:text/csv;charset=utf-8,' + + [fieldsToExport.join(','), ...rowsToExport].join('\n'); + + const encodedUri = encodeURI(csvContent); + const link = document.createElement('a'); + link.setAttribute('href', encodedUri); + link.setAttribute('download', 'transactions.csv'); + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + }; + const getAllData = async () => { const query = { name: q, @@ -144,7 +196,7 @@ const Transactions = ({ context = '' }) => { site: siteFilter || (auth?.webRole === null && auth?.site ? auth.site : null), }; - const queryString = toQuery(query) + const queryString = toQuery(query); const data = await transactionsApi({ query: queryString }); return data; }; @@ -155,6 +207,25 @@ const Transactions = ({ context = '' }) => { exportToExcel(dataToExport?.saleOrders, siteFilter); }; + const handleDownload = (format) => { + handleExport(format); + setIsOpen(false); + }; + + const handleExport = (format) => { + if (format === 'csv') { + handleExportCSV(); + } else if (format === 'xlsx') { + handleExportExcel(); + } + }; + + const startItem = 1 + (pageNew - 1) * limitNew; + const endItem = Math.min( + limitNew * pageNew, + transactions?.data?.saleOrderTotal + ); + useEffect(() => { fetchSite(); }, []); @@ -328,14 +399,54 @@ const Transactions = ({ context = '' }) => {
-
+

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

-
+
+ + + {isOpen && ( + + + + + )} +
+
+
+
{listSites?.length > 0 ? ( - ) : (
)} + ) : ( +
+ )}
{
+
+

+ Menampilkan {startItem}- + {endItem ? endItem : transactions?.data?.saleOrderTotal} dari{' '} + {transactions?.data?.saleOrderTotal} +

+ +
+
+
+ {!transactions.isLoading && + (!transactions?.data?.saleOrders || + transactions?.data?.saleOrders?.length == 0) && ( +
+

+ Tidak Ada Transaksi +

+
+ )} + + {transactions && transactions.data?.saleOrders?.length > 0 && ( +
+ {transactions.data.saleOrders.map((saleOrder, index) => ( +
+ {/* */} +
+
+ +

{saleOrder.name}

+

+ Salesperson:{' '} + { + + {saleOrder.sales} + + } +

+
+
+ Tanggal Pesanan:{' '} + + {saleOrder.dateOrder.split(' ')[0] || '-'} + +
+
+
+
+
+
+
+ {saleOrder.products[0]?.name} +
+
+

+ Nomor PO: + + {saleOrder.purchaseOrderName || '-'} + +

+

+ {saleOrder.products[0]?.parent?.name} +

+

+ {saleOrder.products[0]?.quantity} x{' '} + {currencyFormat( + saleOrder.products[0]?.price?.priceDiscount + )} +

+
+ {saleOrder.products?.length > 1 && ( +
+ {saleOrder.products + .slice(1) + .map((product, index) => ( + {product?.name} + ))} + + Lihat semua produk + +
+ )} +
+
+
+
+ + pesanan dibuat oleh: + +

+ {saleOrder.address.customer?.name || '-'} +

+
+
+
+
Total harga
+
+ {/* */} +
+ ))} +
+ )}
- @@ -382,9 +619,7 @@ const Transactions = ({ context = '' }) => { - {auth?.feature?.soApproval && ( - - )} + {auth?.feature?.soApproval && } @@ -439,8 +674,9 @@ const Transactions = ({ context = '' }) => { -- cgit v1.2.3
No. PO Tanggal Created BySiteSiteSalesperson Total Status