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') 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 From faf6403595602d78b502acfacc721923addbf4a8 Mon Sep 17 00:00:00 2001 From: it-fixcomart Date: Mon, 3 Mar 2025 16:38:10 +0700 Subject: update code --- src/lib/transaction/components/Transactions.jsx | 487 ++++++++++++++++-------- 1 file changed, 337 insertions(+), 150 deletions(-) (limited to 'src') diff --git a/src/lib/transaction/components/Transactions.jsx b/src/lib/transaction/components/Transactions.jsx index a8685105..64ae9393 100644 --- a/src/lib/transaction/components/Transactions.jsx +++ b/src/lib/transaction/components/Transactions.jsx @@ -31,11 +31,30 @@ import getSite from '../api/listSiteApi'; import transactionsApi from '../api/transactionsApi'; import { motion } from 'framer-motion'; import Image from '@/core/components/elements/Image/Image'; +import { upsertUserCart } from '~/services/cart'; +import { useProductCartContext } from '@/contexts/ProductCartContext'; +import { Swiper, SwiperSlide } from 'swiper/react'; +import 'swiper/css'; const Transactions = ({ context = '' }) => { const auth = useAuth(); const router = useRouter(); - const { q = '', page = 1, site = null, limit = 15 } = router.query; - + const { + q = '', + page = 1, + site = null, + limit = 15, + status = 'all', + } = router.query; + const { + productCart, + setRefreshCart, + setProductCart, + refreshCart, + isLoading, + setIsloading, + } = useProductCartContext(); + console.log('context', context); + console.log('router.query', router.query); const [inputQuery, setInputQuery] = useState(q); const [toOthers, setToOthers] = useState(null); const [toCancel, setToCancel] = useState(null); @@ -44,16 +63,32 @@ const Transactions = ({ context = '' }) => { const [siteFilter, setSiteFilter] = useState(site); const [pageNew, setPageNew] = useState(page); const [limitNew, setLimitNew] = useState(limit); + // const [status, setStatus] = useState('idle'); + const [statusNew, setStatusNew] = useState(status); + const [contextNew, setcontextNew] = useState(router.query.context || context); const query = { name: q, offset: (pageNew - 1) * limitNew, - context, + context: contextNew, limit: limitNew, + status: statusNew, site: siteFilter || (auth?.webRole === null && auth?.site ? auth.site : null), }; + + const statuses = [ + { id: 'all', label: 'Semua' }, + { id: 'quotation', label: 'Pending Quotation' }, + { id: 'diterima', label: 'Pesanan Diterima' }, + { id: 'diproses', label: 'Pesanan Diproses' }, + { id: 'dikirim', label: 'Pesanan Dikirim' }, + { id: 'selesai', label: 'Pesanan Selesai' }, + { id: 'cancel', label: 'Pesanan Dibatalkan' }, + ]; + + console.log('query', query); const { transactions } = useTransactions({ query }); - console.log('transactions', transactions); + // console.log('transactions', transactions); const fetchSite = async () => { const site = await getSite(); setListSites(site.sites); @@ -229,6 +264,67 @@ const Transactions = ({ context = '' }) => { useEffect(() => { fetchSite(); }, []); + + const handleBuyBack = async (products) => { + // if (status === 'success') return; + + try { + // setStatus('loading'); + + const results = await Promise.all( + products.map((product) => + upsertUserCart({ + userId: auth.id, + type: 'product', + id: product.id, + qty: product.quantity, + selected: true, + source: 'buy', // Tetap gunakan 'buy' agar bisa masuk ke halaman pembelian + qtyAppend: false, + }) + ) + ); + + // console.log(`Produk berhasil dimasukkan ke dalam cart`, results); + + // ✅ Panggil setRefreshCart(true) setiap kali satu produk berhasil ditambahkan + + setRefreshCart(true); + + // setStatus('idle'); + toast.success('Semua produk berhasil ditambahkan ke keranjang belanja'); + // Tampilkan notifikasi + // toast({ + // title: 'Tambah ke keranjang', + // description: 'Semua produk berhasil ditambahkan ke keranjang belanja', + // status: 'success', + // duration: 3000, + // isClosable: true, + // position: 'top', + // }); + + // Redirect ke halaman checkout + router.push('/shop/checkout?source=buy'); + } catch (error) { + console.error('Gagal menambahkan produk ke keranjang:', error); + // setStatus('error'); + } + }; + + const handleStatusChange = (status) => { + setStatusNew(status); + + if (['quotation', 'cancel', 'diterima', ''].includes(status)) { + setcontextNew('quotation'); + } else { + setcontextNew(''); + } + + if (status === 'all') { + router.push('/my/transactions'); + } + }; + return ( <> @@ -445,66 +541,126 @@ const Transactions = ({ context = '' }) => { )} -
-
- {listSites?.length > 0 ? ( - - ) : ( -
- )} + +
+
+
+
+ {listSites?.length > 0 ? ( + + ) : ( +
+ )} -
- setInputQuery(e.target.value)} - /> - + +
+
+

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

+ { - setLimitNew(Number(e.target.value)); - setPageNew(1); - }} - className='border p-2' - > - - - - + + + + +
-
+
{!transactions.isLoading && - (!transactions?.data?.saleOrders || - transactions?.data?.saleOrders?.length == 0) && ( + transactions?.data?.saleOrders?.length == 0 && (

Tidak Ada Transaksi @@ -512,107 +668,138 @@ const Transactions = ({ context = '' }) => {

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

{saleOrder.name}

-

- Salesperson:{' '} - { + {transactions.isLoading && ( +

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

{saleOrder.name}

+

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

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

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

- 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) => ( - - ))} - - Lihat semua produk - +
+
+
+
+
+
+ +
+
+

+ + 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, 6) + .map((product, index) => ( + + ))} + + Lihat semua produk + +
+ )}
- )} +
+
+
+ + Pesanan dibuat oleh: + +

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

+
+
+
+
+
+

Total Harga

+

+ {currencyFormat(saleOrder.amountTotal)} +

+
+
+
-
- - pesanan dibuat oleh: - -

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

-
-
-
-
Total harga
+
- {/* */} -
- ))} -
- )} + ))} +
+ )}
-
No. PO Tanggal Created BySiteSiteSalesperson Total Status
+ {/*
@@ -670,7 +857,7 @@ const Transactions = ({ context = '' }) => { ))} -
No. Transaksi
+ */} Date: Tue, 4 Mar 2025 13:37:16 +0700 Subject: add mobile --- src/lib/transaction/components/Transactions.jsx | 213 ++++++++++++++++++++---- 1 file changed, 177 insertions(+), 36 deletions(-) (limited to 'src') diff --git a/src/lib/transaction/components/Transactions.jsx b/src/lib/transaction/components/Transactions.jsx index 64ae9393..2ef50dcb 100644 --- a/src/lib/transaction/components/Transactions.jsx +++ b/src/lib/transaction/components/Transactions.jsx @@ -53,8 +53,6 @@ const Transactions = ({ context = '' }) => { isLoading, setIsloading, } = useProductCartContext(); - console.log('context', context); - console.log('router.query', router.query); const [inputQuery, setInputQuery] = useState(q); const [toOthers, setToOthers] = useState(null); const [toCancel, setToCancel] = useState(null); @@ -86,9 +84,7 @@ const Transactions = ({ context = '' }) => { { id: 'cancel', label: 'Pesanan Dibatalkan' }, ]; - console.log('query', query); const { transactions } = useTransactions({ query }); - // console.log('transactions', transactions); const fetchSite = async () => { const site = await getSite(); setListSites(site.sites); @@ -285,8 +281,6 @@ const Transactions = ({ context = '' }) => { ) ); - // console.log(`Produk berhasil dimasukkan ke dalam cart`, results); - // ✅ Panggil setRefreshCart(true) setiap kali satu produk berhasil ditambahkan setRefreshCart(true); @@ -322,6 +316,8 @@ const Transactions = ({ context = '' }) => { if (status === 'all') { router.push('/my/transactions'); + } else { + setPageNew(1); } }; @@ -329,18 +325,85 @@ const Transactions = ({ context = '' }) => { <>
-
- setInputQuery(e.target.value)} - /> - -
+
+ + + +
+
+
+ + setInputQuery(e.target.value)} + /> +
+
+

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

+ +
+
{transactions.isLoading && (
@@ -357,15 +420,15 @@ const Transactions = ({ context = '' }) => { {transactions.data?.saleOrders?.map((saleOrder, index) => (
-
+
- - No. Transaksi +

{saleOrder.name}

+ + {saleOrder.dateOrder.split(' ')[0] || '-'} -

{saleOrder.name}

@@ -375,8 +438,85 @@ const Transactions = ({ context = '' }) => { />
- -
+
+ +
+
+ {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, 6) + .map((product, index) => ( + {product?.name} + ))} + + Lihat semua produk + +
+ )} +
+
+ Pesanan dibuat oleh: +

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

+
+
+
+
+
+
+

Total Harga

+

+ {currencyFormat(saleOrder.amountTotal)} +

+
+
+ +
+
+ + {/*
No. Purchase Order @@ -393,8 +533,8 @@ const Transactions = ({ context = '' }) => { {saleOrder.invoiceCount} Invoice

-
-
+
*/} + {/*
Sales

@@ -409,15 +549,16 @@ const Transactions = ({ context = '' }) => { {currencyFormat(saleOrder.amountTotal)}

-
+
*/}
))} @@ -568,7 +709,7 @@ const Transactions = ({ context = '' }) => {
- + Status { ? endItem : transactions?.data?.saleOrderTotal ? transactions?.data?.saleOrderTotal - : limitNew}{' '} + : limitNew * pageNew}{' '} dari{' '} {transactions?.data?.saleOrderTotal ? transactions?.data?.saleOrderTotal - : limitNew} + : limitNew * pageNew}

handleStatusChange(e.target.value)} - className='border border-gray-300 rounded-lg px-3 py-1 text-sm bg-white shadow-sm focus:outline-none focus:ring-2 focus:ring-red-500' + className='border border-gray-300 rounded-lg px-2 py-1 text-xs bg-white shadow-sm focus:outline-none focus:ring-2 focus:ring-red-500' > {statuses.map((status) => (
@@ -379,14 +538,14 @@ const Transactions = ({ context = '' }) => { setInputQuery(e.target.value)} />
-

+

Menampilkan {startItem}- {endItem ? endItem @@ -405,7 +564,7 @@ const Transactions = ({ context = '' }) => { setLimitNew(Number(e.target.value)); setPageNew(1); }} - className='border p-2' + className='border p-2 text-xs' > @@ -436,7 +595,7 @@ const Transactions = ({ context = '' }) => {

{saleOrder.name}

- {saleOrder.dateOrder.split(' ')[0] || '-'} + {formatDate(saleOrder.dateOrder.split(' ')[0]) || '-'}
@@ -493,7 +652,11 @@ const Transactions = ({ context = '' }) => { href={`/my/quotations/${saleOrder?.id}`} className=' text-red-500 text-nowrap' > - Lihat semua produk + {saleOrder.products?.length > 6 + ? 'Lihat ' + + (saleOrder.products?.length - 6) + + ' produk lainnya' + : 'Lihat semua produk'}
)} @@ -508,9 +671,9 @@ const Transactions = ({ context = '' }) => {
-
-

Total Harga

-

+

+

Total Harga

+

{currencyFormat(saleOrder.amountTotal)}

@@ -715,7 +878,7 @@ const Transactions = ({ context = '' }) => {
-
+
@@ -723,7 +886,7 @@ const Transactions = ({ context = '' }) => { {statuses.map((status) => ( @@ -831,7 +994,7 @@ const Transactions = ({ context = '' }) => { {transactions.data.saleOrders.map((saleOrder, index) => (
{
Tanggal Pesanan:{' '} - {saleOrder.dateOrder.split(' ')[0] || '-'} + {formatDate( + saleOrder.dateOrder.split(' ')[0] + ) || '-'}
@@ -906,7 +1071,11 @@ const Transactions = ({ context = '' }) => { href={`/my/quotations/${saleOrder?.id}`} className='text-sm text-red-500 text-nowrap' > - Lihat semua produk + {saleOrder.products?.length > 6 + ? 'Lihat ' + + (saleOrder.products?.length - 6) + + ' produk lainnya' + : 'Lihat semua produk'}
)} diff --git a/src/styles/globals.css b/src/styles/globals.css index 6447284e..d9b82447 100644 --- a/src/styles/globals.css +++ b/src/styles/globals.css @@ -46,8 +46,8 @@ button { @apply text-[11px] leading-none font-medium - px-1 - py-1 + px-2 + py-2 rounded w-fit; } -- cgit v1.2.3 From f4adb008ae55e4b340c58c32d45af6d0eaf6eb57 Mon Sep 17 00:00:00 2001 From: it-fixcomart Date: Wed, 12 Mar 2025 14:29:42 +0700 Subject: update detail transaction --- src/lib/transaction/components/Transaction.jsx | 278 +++++++++++++++++++++++-- 1 file changed, 260 insertions(+), 18 deletions(-) (limited to 'src') diff --git a/src/lib/transaction/components/Transaction.jsx b/src/lib/transaction/components/Transaction.jsx index b2fb2c17..32416bc0 100644 --- a/src/lib/transaction/components/Transaction.jsx +++ b/src/lib/transaction/components/Transaction.jsx @@ -49,18 +49,19 @@ const Transaction = ({ id }) => { 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 submitUploadPo = async () => { const file = poFile.current.files[0]; const name = poNumber.current.value; @@ -208,7 +209,9 @@ const Transaction = ({ id }) => {

{currencyFormat(transaction.data?.amountUntaxed)}

-

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

+

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

{currencyFormat(transaction.data?.amountTax)}

@@ -279,6 +282,35 @@ const Transaction = ({ id }) => { } }; + const handleCopyClick = (waybillNumber) => { + const textToCopy = waybillNumber; + console.log('textToCopy', textToCopy); + 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 && ( <> @@ -615,13 +647,50 @@ const Transaction = ({ id }) => { )}
-
- - {transaction?.data?.name} - - +
+
-
+
+
+ + {transaction?.data?.name} + + +
+
+
+ +
+
+
+ {/*
)} -
+
*/}
-
+
Nama Sales
: {transaction?.data?.sales}
Tanggal Transaksi
: {transaction?.data?.dateOrder}
-
-
-
Ketentuan Pembayaran
-
: {transaction?.data?.paymentTerm}
{!auth?.feature?.soApproval ? ( <> @@ -729,9 +794,184 @@ const Transaction = ({ id }) => { )}
+
+
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}
+ +
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
+
:
+
BELUM TAU AMBIL DARI MANA
+ +
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
@@ -807,7 +1047,7 @@ const Transaction = ({ id }) => { ))}
-
+
*/}
Rincian Pembelian @@ -976,7 +1216,9 @@ const Transaction = ({ id }) => { {currencyFormat(transaction.data?.amountUntaxed)}
-
PPN {((PPN - 1) * 100).toFixed(0)}%
+
+ PPN {((PPN - 1) * 100).toFixed(0)}% +
{currencyFormat(transaction.data?.amountTax)}
-- cgit v1.2.3 From b4a595eaa8600e7bd1bafcef38abe4c01a5b664c Mon Sep 17 00:00:00 2001 From: it-fixcomart Date: Wed, 12 Mar 2025 16:59:18 +0700 Subject: fix transaction --- src/lib/transaction/components/Transaction.jsx | 58 +++++++++++++++---------- src/lib/transaction/components/Transactions.jsx | 28 +++--------- 2 files changed, 42 insertions(+), 44 deletions(-) (limited to 'src') diff --git a/src/lib/transaction/components/Transaction.jsx b/src/lib/transaction/components/Transaction.jsx index 07f9573d..8369c425 100644 --- a/src/lib/transaction/components/Transaction.jsx +++ b/src/lib/transaction/components/Transaction.jsx @@ -49,7 +49,6 @@ const Transaction = ({ id }) => { 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 }); @@ -284,7 +283,6 @@ const Transaction = ({ id }) => { const handleCopyClick = (waybillNumber) => { const textToCopy = waybillNumber; - console.log('textToCopy', textToCopy); navigator.clipboard.writeText(textToCopy); setCopied(true); toast.success('No Resi Berhasil di Copy'); @@ -755,7 +753,7 @@ const Transaction = ({ id }) => { )}
*/} -
+
Nama Sales
: {transaction?.data?.sales}
@@ -853,11 +851,19 @@ const Transaction = ({ id }) => {
No. Telepon
:
-
{transaction?.data?.address?.customer?.phone}
+
+ {transaction?.data?.address?.customer?.phone + ? transaction?.data?.address?.customer?.phone + : '-'} +
Email
:
-
{transaction?.data?.address?.customer?.email}
+
+ {transaction?.data?.address?.customer?.email + ? transaction?.data?.address?.customer?.email + : '-'} +
Alamat Pengiriman
:
@@ -906,27 +912,33 @@ const Transaction = ({ id }) => {
Kurir
:
-
- {transaction?.data?.pickings[0]?.carrierName ? ( - <> -

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

- - setIdAWB(transaction?.data?.pickings[0]?.id) - } - > - Lacak Pengiriman - - - ) : ( - '-' - )} -
+ {transaction?.data?.pickings[0]?.carrierName ? ( +
+

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

+ + setIdAWB(transaction?.data?.pickings[0]?.id) + } + > + Lacak Pengiriman + +
+ ) : ( + '-' + )}
Jenis Service
:
-
BELUM TAU AMBIL DARI MANA
+
+ {' '} + {transaction?.data?.pickings[0]?.serviceType && + transaction?.data?.pickings[0]?.carrierName + ? transaction?.data?.pickings[0]?.serviceType + : '-'} +
Tanggal Kirim
:
diff --git a/src/lib/transaction/components/Transactions.jsx b/src/lib/transaction/components/Transactions.jsx index d93c9aef..ece97734 100644 --- a/src/lib/transaction/components/Transactions.jsx +++ b/src/lib/transaction/components/Transactions.jsx @@ -80,7 +80,6 @@ const Transactions = ({ context = '' }) => { const [isOpenCalender, setIsOpenCalender] = useState(false); const parseDate = (date) => { - console.log('masuk sini', date); if (null || 'null') return null; if (!date) return null; if (date instanceof Date) return date; // Jika sudah Date, langsung return @@ -95,19 +94,6 @@ const Transactions = ({ context = '' }) => { key: 'selection', }, ]); - console.log('startDate', startDate); - console.log('state', state); - // useEffect(() => { - // if (state[0].startDate != null) { - // setState([ - // { - // startDate: parseDate(startDate), - // endDate: parseDate(endDate), - // key: 'selection', - // }, - // ]); - // } - // }, [startDate, endDate]); const query = { name: q, @@ -369,7 +355,7 @@ const Transactions = ({ context = '' }) => { } if (status === 'all') { - router.push('/my/transactions'); + router.push(`${router.pathname}`); } else { setPageNew(1); } @@ -384,7 +370,7 @@ const Transactions = ({ context = '' }) => { }, ]); setIsOpenCalender(false); - router.push('/my/transactions'); + router.push(`${router.pathname}`); }; const formatDate = (dateString) => { @@ -649,7 +635,7 @@ const Transactions = ({ context = '' }) => { /> ))} {saleOrder.products?.length > 6 @@ -730,7 +716,7 @@ const Transactions = ({ context = '' }) => { pageCount={pageCount} currentPage={parseInt(pageNew)} // url={router.pathname + pageQuery} - url={`/my/transactions?${toQuery(_.omit(query, ['page']))}`} + url={`${router.pathname}?${toQuery(_.omit(query, ['page']))}`} className='mt-2 mb-2' /> @@ -997,7 +983,7 @@ const Transactions = ({ context = '' }) => { className='border py-2 px-4 hover:border-red-500 w-full rounded-lg' >
@@ -1068,7 +1054,7 @@ const Transactions = ({ context = '' }) => { /> ))} {saleOrder.products?.length > 6 @@ -1182,7 +1168,7 @@ const Transactions = ({ context = '' }) => { pageCount={pageCount} currentPage={parseInt(pageNew)} // url={router.pathname + (pageQuery ? `?${pageQuery}` : '')} - url={`/my/transactions?${toQuery(_.omit(query, ['page']))}`} + url={`${router.pathname}?${toQuery(_.omit(query, ['page']))}`} className='mt-2 mb-2' />
-- cgit v1.2.3 From 1e2c20a9871bf0a6117ae63d1e8d9d20119460ed Mon Sep 17 00:00:00 2001 From: it-fixcomart Date: Thu, 13 Mar 2025 10:07:38 +0700 Subject: update code --- src/lib/transaction/components/Transactions.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/lib/transaction/components/Transactions.jsx b/src/lib/transaction/components/Transactions.jsx index ece97734..45821901 100644 --- a/src/lib/transaction/components/Transactions.jsx +++ b/src/lib/transaction/components/Transactions.jsx @@ -1021,7 +1021,7 @@ const Transactions = ({ context = '' }) => { className='object-contain object-center border border-gray_r-6 h-32 w-full rounded-md' />
-
+

Nomor PO: @@ -1030,7 +1030,7 @@ const Transactions = ({ context = '' }) => { {saleOrder.purchaseOrderName || '-'}

-

+

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

-- cgit v1.2.3 From 1904419f7aa7d2c6ee8644166e270703e969d4b2 Mon Sep 17 00:00:00 2001 From: it-fixcomart Date: Thu, 13 Mar 2025 15:10:18 +0700 Subject: update mobile --- src/lib/transaction/components/Transaction.jsx | 84 +++++++++++++++++++++++++- 1 file changed, 81 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/lib/transaction/components/Transaction.jsx b/src/lib/transaction/components/Transaction.jsx index 8369c425..2e328a7e 100644 --- a/src/lib/transaction/components/Transaction.jsx +++ b/src/lib/transaction/components/Transaction.jsx @@ -17,6 +17,7 @@ import getFileBase64 from '@/core/utils/getFileBase64'; import currencyFormat from '@/core/utils/currencyFormat'; import VariantGroupCard from '@/lib/variant/components/VariantGroupCard'; import { + EllipsisVerticalIcon, ChevronDownIcon, ChevronRightIcon, ChevronUpIcon, @@ -61,6 +62,7 @@ const Transaction = ({ id }) => { const openUploadPo = () => setUploadPo(true); const closeUploadPo = () => setUploadPo(false); const [copied, setCopied] = useState(false); + const [toOthers, setToOthers] = useState(null); const submitUploadPo = async () => { const file = poFile.current.files[0]; const name = poNumber.current.value; @@ -418,9 +420,74 @@ const Transaction = ({ id }) => {

+ + setToOthers(null)} + > +
+ + + +
+
+ +
+
+ + setIdAWB(transaction?.data?.pickings[0]?.id)} + > + Lihat Detail + +
+
{auth?.feature?.soApproval && ( { /> )}
+ +
+
+
Pengiriman
+ +
+
+ setToOthers(transaction?.data)} + /> +
+
-
- -
+
{transaction.data?.name} -- cgit v1.2.3 From af311a10854f092efa57716ffd5329cce0c7d8db Mon Sep 17 00:00:00 2001 From: it-fixcomart Date: Thu, 13 Mar 2025 16:33:00 +0700 Subject: update mobile --- src/lib/transaction/components/Transaction.jsx | 39 ++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/lib/transaction/components/Transaction.jsx b/src/lib/transaction/components/Transaction.jsx index 2e328a7e..299f7a07 100644 --- a/src/lib/transaction/components/Transaction.jsx +++ b/src/lib/transaction/components/Transaction.jsx @@ -41,6 +41,10 @@ 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; @@ -50,6 +54,7 @@ const Transaction = ({ id }) => { 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 }); @@ -463,7 +468,7 @@ const Transaction = ({ id }) => { -
+
-
- {auth?.feature?.soApproval && ( + {auth?.feature?.soApproval && ( +
- )} -
+
+ )}
-
Pengiriman
+
Status Transaksi
@@ -510,6 +515,28 @@ const Transaction = ({ id }) => { />
+ + {transaction.data?.invoices?.length === 0 ? ( +
-
+ ) : ( + transaction.data?.invoices?.map((invoice, index) => ( +
+
{invoice?.name}
+ downloadInvoice(invoice)} + > + Download + +
+ )) + )} + + +
-- cgit v1.2.3 From 45a4a67274dcd8172eba3a9ed171a631c6d1c3b3 Mon Sep 17 00:00:00 2001 From: it-fixcomart Date: Fri, 14 Mar 2025 16:16:47 +0700 Subject: fix code --- src/lib/transaction/components/Transaction.jsx | 348 +++++++++++++++++++++---- src/lib/treckingAwb/component/Manifest.jsx | 4 +- 2 files changed, 297 insertions(+), 55 deletions(-) (limited to 'src') diff --git a/src/lib/transaction/components/Transaction.jsx b/src/lib/transaction/components/Transaction.jsx index 299f7a07..5f17b623 100644 --- a/src/lib/transaction/components/Transaction.jsx +++ b/src/lib/transaction/components/Transaction.jsx @@ -68,6 +68,25 @@ const Transaction = ({ id }) => { 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; @@ -206,32 +225,70 @@ const Transaction = ({ id }) => { transaction.refetch(); }; - const memoizeVariantGroupCard = useMemo( - () => ( -
- -
-

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] - ); + 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( () => ( @@ -538,28 +595,121 @@ const Transaction = ({ id }) => {
- -
-
- {transaction.data?.name} +

{transaction.data?.name}

+
+ + {transaction.data?.dateOrder + ? formatDate(transaction.data?.dateOrder) + : '-'} + + + {transaction.data?.purchaseOrderName || '-'} - {transaction.data?.paymentTerm} + {transaction.data?.paymentTerm || '-'} {transaction.data?.sales} - - {transaction.data?.dateOrder} -
-
Pengiriman
-
+
+
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

@@ -615,11 +765,11 @@ const Transaction = ({ id }) => {
Belum ada invoice
)}
-
+
*/} - {!auth?.feature.soApproval && ( + {/* {!auth?.feature.soApproval && (
{transaction.data?.purchaseOrderName || '-'} @@ -647,11 +797,59 @@ const Transaction = ({ id }) => {
)} - + */}
Detail Produk
{transaction?.data?.products.length > 0 ? ( -
{memoizeVariantGroupCard}
+
+ +
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 @@ -665,13 +863,13 @@ const Transaction = ({ id }) => {
)} - + {/* */} - + {/* */} - + {/* */} -
+ {/*
{transaction.data?.status == 'draft' && auth?.feature.soApproval && (
@@ -728,7 +926,7 @@ const Transaction = ({ id }) => { Batalkan Transaksi )} -
+
*/} @@ -1018,7 +1216,7 @@ const Transaction = ({ id }) => {
Kurir
:
{transaction?.data?.pickings[0]?.carrierName ? ( -
+

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

@@ -1326,7 +1524,49 @@ const Transaction = ({ id }) => { )} {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
@@ -1340,15 +1580,17 @@ const Transaction = ({ id }) => { {currencyFormat(transaction.data?.amountTax)}
-
- Biaya Pengiriman -
+
Biaya Pengiriman
{currencyFormat(transaction.data?.deliveryAmount)}
+
+
+ +
Grand Total
-
+
{currencyFormat(transaction.data?.amountTotal)}
diff --git a/src/lib/treckingAwb/component/Manifest.jsx b/src/lib/treckingAwb/component/Manifest.jsx index 87e01e38..109bc832 100644 --- a/src/lib/treckingAwb/component/Manifest.jsx +++ b/src/lib/treckingAwb/component/Manifest.jsx @@ -120,9 +120,9 @@ const Manifest = ({ idAWB, closePopup }) => { {manifests?.waybillNumber && (
-

No. Resi

+

No. Resi

-

{manifests?.waybillNumber}

+

{manifests?.waybillNumber}

{transaction.data?.invoices?.length === 0 ? ( -
-
+

) : ( transaction.data?.invoices?.map((invoice, index) => (
Date: Sat, 31 May 2025 08:55:43 +0700 Subject: fix repeat-order --- .../components/elements/Navbar/NavbarDesktop.jsx | 2 +- .../elements/Navbar/NavbarUserDropdown.jsx | 1 - src/core/components/layouts/BasicLayout.jsx | 2 + src/lib/auth/components/Menu.jsx | 14 --- src/lib/quotation/components/Quotationheader.jsx | 23 ++-- src/lib/transaction/components/Transactions.jsx | 124 ++++++++++++++++++--- src/pages/my/transactions/index.jsx | 4 +- 7 files changed, 127 insertions(+), 43 deletions(-) (limited to 'src') diff --git a/src/core/components/elements/Navbar/NavbarDesktop.jsx b/src/core/components/elements/Navbar/NavbarDesktop.jsx index 03d7fa0c..db4fcbb8 100644 --- a/src/core/components/elements/Navbar/NavbarDesktop.jsx +++ b/src/core/components/elements/Navbar/NavbarDesktop.jsx @@ -51,7 +51,7 @@ const NavbarDesktop = () => { const { transactions } = useTransactions({ query }); const data = transactions?.data?.saleOrders.filter( - (transaction) => transaction.status === 'draft' + (transaction) => transaction.status === 'waiting' ); const [showPopup, setShowPopup] = useState(false); diff --git a/src/core/components/elements/Navbar/NavbarUserDropdown.jsx b/src/core/components/elements/Navbar/NavbarUserDropdown.jsx index b2ad6309..5fe0cfa7 100644 --- a/src/core/components/elements/Navbar/NavbarUserDropdown.jsx +++ b/src/core/components/elements/Navbar/NavbarUserDropdown.jsx @@ -16,7 +16,6 @@ const NavbarUserDropdown = () => {
Profil Saya - Daftar Quotation Daftar Transaksi Daftar Pengiriman Invoice & Faktur Pajak diff --git a/src/core/components/layouts/BasicLayout.jsx b/src/core/components/layouts/BasicLayout.jsx index 2998fa63..81f8b41f 100644 --- a/src/core/components/layouts/BasicLayout.jsx +++ b/src/core/components/layouts/BasicLayout.jsx @@ -54,6 +54,8 @@ const BasicLayout = ({ children }) => { useEffect(() => { const handleMouseOut = (event) => { + + if (!buttonRef.current) return; const rect = buttonRef.current.getBoundingClientRect(); if (event.clientY <= 0) { setButtonPosition(rect); diff --git a/src/lib/auth/components/Menu.jsx b/src/lib/auth/components/Menu.jsx index df33314c..20bc54fd 100644 --- a/src/lib/auth/components/Menu.jsx +++ b/src/lib/auth/components/Menu.jsx @@ -84,20 +84,6 @@ const Menu = () => {
Menu
- -
- -

Daftar Quotation

-
-
{ }; const getCart = () => { - if (!productQuotation && auth) { + if ((productQuotation?.length === 0) && auth) { refreshCartf(); } }; @@ -62,7 +62,7 @@ const Quotationheader = (quotationCount) => { const refreshCartf = useCallback(async () => { setIsloading(true); let pendingTransactions = transactions?.data?.saleOrders.filter( - (transaction) => transaction.status === 'draft' + (transaction) => transaction.status === 'waiting' ); setProductQuotation(pendingTransactions); setCountQuotation( @@ -107,20 +107,21 @@ const Quotationheader = (quotationCount) => { }; }, []); + const handleCheckout = async () => { SetButtonTerapkan(true); let checkoutAll = await odooApi( 'POST', `/api/v1/user/${auth.id}/cart/select-all` ); - router.push('/my/quotations'); + router.push('/my/transactions'); }; return (
{ List
- Quotation + Transactions
@@ -168,7 +169,7 @@ const Quotationheader = (quotationCount) => { >
- Daftar Quotation + Daftar Transaksi

@@ -183,7 +184,7 @@ const Quotationheader = (quotationCount) => { > Login {' '} - Untuk Melihat Daftar Quotation Anda + Untuk Melihat Daftar Transaksi Anda

)} @@ -209,7 +210,7 @@ const Quotationheader = (quotationCount) => { {auth && qotation.length === 0 && !isLoading && (

- Tidak Ada Quotation + Tidak Ada Transaksi

)} @@ -225,7 +226,7 @@ const Quotationheader = (quotationCount) => {
  • @@ -241,8 +242,8 @@ const Quotationheader = (quotationCount) => {

    Status :

    -

    - Pending Quotation +

    + Pesanan Diterima

    diff --git a/src/lib/transaction/components/Transactions.jsx b/src/lib/transaction/components/Transactions.jsx index 45821901..c4651119 100644 --- a/src/lib/transaction/components/Transactions.jsx +++ b/src/lib/transaction/components/Transactions.jsx @@ -78,6 +78,8 @@ const Transactions = ({ context = '' }) => { const [dateRange, setDateRange] = useState([null, null]); // const [startDate, endDate] = dateRange; const [isOpenCalender, setIsOpenCalender] = useState(false); + const [cachedAllData, setCachedAllData] = useState(null); // Simpan data "All" + const [currentData, setCurrentData] = useState([]); // Data yang ditampilkan const parseDate = (date) => { if (null || 'null') return null; @@ -263,7 +265,16 @@ const Transactions = ({ context = '' }) => { const getAllData = async () => { const query = { name: q, - context, + offset: (pageNew - 1) * limitNew, + limit: limitNew, + context: contextMap[statusNew], // gunakan contextMap + sort: sortNew, + startDate: state[0]?.startDate + ? state[0].startDate.toLocaleDateString('id-ID') + : null, + endDate: state[0]?.endDate + ? state[0].endDate.toLocaleDateString('id-ID') + : null, site: siteFilter || (auth?.webRole === null && auth?.site ? auth.site : null), }; @@ -345,22 +356,29 @@ const Transactions = ({ context = '' }) => { } }; - const handleStatusChange = (status) => { + + const handleStatusChange = async (status) => { setStatusNew(status); + setPageNew(1); - if (['quotation', 'cancel', 'diterima', ''].includes(status)) { - setcontextNew('quotation'); - } else { - setcontextNew(''); + if (status === 'all' && cachedAllData) { + setCurrentData(cachedAllData); + return; } - + const data = await fetchSite(status, 1); + if (status === 'all') { - router.push(`${router.pathname}`); - } else { - setPageNew(1); + setCachedAllData(data); } + + setCurrentData(data); }; + useEffect(() => { + setCachedAllData([]); + }, []); + + const handleReset = () => { setState([ { @@ -857,9 +875,7 @@ const Transactions = ({ context = '' }) => {

    Info Transaksi

    - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed - do eiusmod tempor incididunt ut labore et dolore magna - aliqua. + Gunakan filter status untuk mempermudah pencarian transaksi anda di Daftar Transaksi
  • @@ -928,6 +944,86 @@ const Transactions = ({ context = '' }) => {
    +
    + + {isOpenCalender && ( +
    + {/* Tombol silang di sudut kanan atas */} + + setState([item.selection])} + showSelectionPreview={true} + maxDate={new Date()} + moveRangeOnFirstSelection={false} + months={1} + ranges={state} + className='w-full' + /> + +
    + + +
    +
    + )} +

    Menampilkan {startItem}- @@ -980,7 +1076,7 @@ const Transactions = ({ context = '' }) => { {transactions.data.saleOrders.map((saleOrder, index) => (

    - + - + -- cgit v1.2.3 From 04961a55929017f77ee6801d2b7ada4c05689821 Mon Sep 17 00:00:00 2001 From: it-fixcomart Date: Thu, 31 Jul 2025 15:55:05 +0700 Subject: fix repeat order --- src/lib/quotation/components/Quotationheader.jsx | 2 +- .../components/TransactionStatusBadge.jsx | 4 +- src/lib/transaction/components/Transactions.jsx | 461 ++++++++++++--------- src/lib/treckingAwb/component/Manifest.jsx | 76 ---- src/styles/globals.css | 8 + 5 files changed, 269 insertions(+), 282 deletions(-) (limited to 'src') diff --git a/src/lib/quotation/components/Quotationheader.jsx b/src/lib/quotation/components/Quotationheader.jsx index 6551296a..a035edc7 100644 --- a/src/lib/quotation/components/Quotationheader.jsx +++ b/src/lib/quotation/components/Quotationheader.jsx @@ -243,7 +243,7 @@ const Quotationheader = (quotationCount) => { Status :

    - Pesanan Diterima + Pesanan Diproses

    diff --git a/src/lib/transaction/components/TransactionStatusBadge.jsx b/src/lib/transaction/components/TransactionStatusBadge.jsx index e061587c..cb8cbcd9 100644 --- a/src/lib/transaction/components/TransactionStatusBadge.jsx +++ b/src/lib/transaction/components/TransactionStatusBadge.jsx @@ -14,11 +14,11 @@ const TransactionStatusBadge = ({ status }) => { break case 'waiting': badgeProps.className.push('badge-yellow') - badgeProps.text = 'Pesanan Diterima' + badgeProps.text = 'Pesanan Diproses' break case 'sale': badgeProps.className.push('badge-yellow') - badgeProps.text = 'Pesanan Diproses' + badgeProps.text = 'Pesanan Dikemas' break case 'shipping': badgeProps.className.push('badge-green') diff --git a/src/lib/transaction/components/Transactions.jsx b/src/lib/transaction/components/Transactions.jsx index c4651119..acb925da 100644 --- a/src/lib/transaction/components/Transactions.jsx +++ b/src/lib/transaction/components/Transactions.jsx @@ -1,5 +1,5 @@ import { useRouter } from 'next/router'; -import { useEffect, useState } from 'react'; +import { useEffect, useState, useRef } from 'react'; import { toast } from 'react-hot-toast'; import { EllipsisVerticalIcon, @@ -34,7 +34,10 @@ import Image from '@/core/components/elements/Image/Image'; import { upsertUserCart } from '~/services/cart'; import { useProductCartContext } from '@/contexts/ProductCartContext'; import { Swiper, SwiperSlide } from 'swiper/react'; +import { Navigation } from 'swiper'; import 'swiper/css'; +import 'swiper/css/navigation'; +import { Calendar } from 'lucide-react'; import DatePicker from 'react-datepicker'; import 'react-datepicker/dist/react-datepicker.css'; import { DateRangePicker } from 'react-date-range'; @@ -45,6 +48,7 @@ import { Popover } from '@headlessui/react'; const Transactions = ({ context = '' }) => { const auth = useAuth(); const router = useRouter(); + const swiperRef = useRef(null); const { q = '', page = 1, @@ -80,11 +84,12 @@ const Transactions = ({ context = '' }) => { const [isOpenCalender, setIsOpenCalender] = useState(false); const [cachedAllData, setCachedAllData] = useState(null); // Simpan data "All" const [currentData, setCurrentData] = useState([]); // Data yang ditampilkan + const calendarRef = useRef(null); + const [isDateSelected, setIsDateSelected] = useState(false); const parseDate = (date) => { - if (null || 'null') return null; - if (!date) return null; - if (date instanceof Date) return date; // Jika sudah Date, langsung return + if (!date || date === 'null') return null; + if (date instanceof Date) return date; const [day, month, year] = date.split('/').map(Number); return new Date(year, month - 1, day); }; @@ -106,7 +111,7 @@ const Transactions = ({ context = '' }) => { sort: sortNew, startDate: state[0].startDate ? state[0].startDate.toLocaleDateString('id-ID') - : state[0].startDate, + : null, endDate: state[0]?.endDate?.toLocaleDateString('id-ID'), site: siteFilter || (auth?.webRole === null && auth?.site ? auth.site : null), @@ -114,8 +119,9 @@ const Transactions = ({ context = '' }) => { const statuses = [ { id: 'all', label: 'Semua' }, { id: 'quotation', label: 'Pending Quotation' }, - { id: 'diterima', label: 'Pesanan Diterima' }, { id: 'diproses', label: 'Pesanan Diproses' }, + { id: 'dikemas', label: 'Pesanan Dikemas' }, + { id: 'partial', label: 'Dikirim Sebagian' }, { id: 'dikirim', label: 'Pesanan Dikirim' }, { id: 'selesai', label: 'Pesanan Selesai' }, { id: 'cancel', label: 'Pesanan Dibatalkan' }, @@ -302,6 +308,22 @@ const Transactions = ({ context = '' }) => { } }; + useEffect(() => { + const handleClickOutside = (event) => { + if ( + calendarRef.current && + !calendarRef.current.contains(event.target) + ) { + setIsOpenCalender(false); + } + }; + + document.addEventListener("mousedown", handleClickOutside); + return () => { + document.removeEventListener("mousedown", handleClickOutside); + }; + }, []); + const startItem = 1 + (pageNew - 1) * limitNew; const endItem = Math.min( limitNew * pageNew, @@ -438,82 +460,82 @@ const Transactions = ({ context = '' }) => { ))} -
    -
    setIsOpenCalender(true)} - > - - {state[0]?.startDate - ? `${state[0].startDate.toLocaleDateString()} - ${state[0].endDate.toLocaleDateString()}` - : 'Semua Tanggal'} - -
    - - {isOpenCalender && ( -
    -
    - setState([item.selection])} - showSelectionPreview={true} - maxDate={new Date()} - moveRangeOnFirstSelection={false} - months={1} - ranges={state} - direction='horizontal' - className='w-full' - /> - -
    - - -
    +
    + + {isOpenCalender && ( +
    + {/* Tombol silang di sudut kanan atas */} + + setState([item.selection])} + showSelectionPreview={false} + maxDate={new Date()} + moveRangeOnFirstSelection={false} + months={1} + ranges={state} + className='w-full' + /> + +
    +
    - )} -
    + )} +
    {/*
    e.target === document} @@ -643,7 +665,7 @@ const Transactions = ({ context = '' }) => { {saleOrder.products?.length > 1 && (
    {saleOrder.products - .slice(1, 6) + .slice(1, 4) .map((product, index) => ( { className='object-contain object-center border border-gray_r-6 h-8 w-8 rounded-md' /> ))} - - {saleOrder.products?.length > 6 - ? 'Lihat ' + - (saleOrder.products?.length - 6) + - ' produk lainnya' - : 'Lihat semua produk'} - + {saleOrder.products.length > 4 ? ( + + +{saleOrder.products.length - 4} lihat semua produk + + ) : ( + + Lihat semua produk + + )}
    )}
    @@ -880,33 +907,60 @@ const Transactions = ({ context = '' }) => {
    -
    +
    Status - - {statuses.map((status) => ( - - + + {/* Swiper container scrollable */} +
    + - {status.label} - - - ))} - + {statuses.map((status) => ( + + + + ))} + +
    + + {/* Next */} + +
    +
    @@ -944,86 +998,6 @@ const Transactions = ({ context = '' }) => {
    -
    - - {isOpenCalender && ( -
    - {/* Tombol silang di sudut kanan atas */} - - setState([item.selection])} - showSelectionPreview={true} - maxDate={new Date()} - moveRangeOnFirstSelection={false} - months={1} - ranges={state} - className='w-full' - /> - -
    - - -
    -
    - )} -

    Menampilkan {startItem}- @@ -1050,6 +1024,82 @@ const Transactions = ({ context = '' }) => { +

    + + {isOpenCalender && ( +
    + {/* Tombol silang di sudut kanan atas */} + + setState([item.selection])} + showSelectionPreview={false} + maxDate={new Date()} + moveRangeOnFirstSelection={false} + months={1} + ranges={state} + className='w-full' + /> + +
    + +
    +
    + )} +
    @@ -1140,7 +1190,7 @@ const Transactions = ({ context = '' }) => { {saleOrder.products?.length > 1 && (
    {saleOrder.products - .slice(1, 6) + .slice(1, 4) .map((product, index) => ( { className='object-contain object-center border border-gray_r-6 h-16 w-16 rounded-md' /> ))} - - {saleOrder.products?.length > 6 - ? 'Lihat ' + - (saleOrder.products?.length - 6) + - ' produk lainnya' - : 'Lihat semua produk'} - + {saleOrder.products.length > 4 ? ( + + +{saleOrder.products.length - 4} lihat semua produk + + ) : ( + + Lihat semua produk + + )}
    )}
    diff --git a/src/lib/treckingAwb/component/Manifest.jsx b/src/lib/treckingAwb/component/Manifest.jsx index 5b456ccf..acb86f57 100644 --- a/src/lib/treckingAwb/component/Manifest.jsx +++ b/src/lib/treckingAwb/component/Manifest.jsx @@ -135,82 +135,6 @@ const Manifest = ({ idAWB, closePopup }) => {
    )}
    -<<<<<<< HEAD -
    -

    - Estimasi tiba pada{' '} - ({manifests?.eta}) -

    -

    - Dikirim Menggunakan{' '} - - {manifests?.deliveryOrder.carrier} - -

    - {manifests?.waybillNumber && ( -
    -

    No. Resi

    -
    -

    {manifests?.waybillNumber}

    - -
    -
    - )} -
    -
    -
    -
      - {manifests?.manifests?.map((manifest, index) => ( - <> -
    1. - {manifests.delivered == true && index == 0 ? ( -
      - -
      - ) : ( -
      - )} - {manifests.delivered != true && ( -
      - )} -======= ->>>>>>> new-release diff --git a/src/styles/globals.css b/src/styles/globals.css index d9b82447..1860fc2b 100644 --- a/src/styles/globals.css +++ b/src/styles/globals.css @@ -696,3 +696,11 @@ button { ::-webkit-scrollbar-thumb:hover { background-color: #555; } +.status-swiper { + width: 100%; + height: 100%; +} + +.status-swiper .swiper-slide { + width: auto !important; +} -- cgit v1.2.3