From 22eec2b12a2f8a079018070efa28757401de308e Mon Sep 17 00:00:00 2001 From: Miqdad Date: Wed, 27 Aug 2025 10:35:35 +0700 Subject: Button --- src/lib/transaction/components/Transactions.jsx | 260 ++++++++++++++---------- 1 file changed, 158 insertions(+), 102 deletions(-) (limited to 'src/lib') diff --git a/src/lib/transaction/components/Transactions.jsx b/src/lib/transaction/components/Transactions.jsx index 7efa773a..fab9eb5c 100644 --- a/src/lib/transaction/components/Transactions.jsx +++ b/src/lib/transaction/components/Transactions.jsx @@ -475,21 +475,21 @@ const Transactions = ({ context = '' }) => { ))} -
- - {isOpenCalender && ( +
+ + {isOpenCalender && (
{/* Tombol silang di sudut kanan atas */}
- )} -
+ )} + {/*
e.target === document} @@ -634,7 +634,9 @@ const Transactions = ({ context = '' }) => { >
-

{saleOrder.name}

+

+ {saleOrder.name} +

{formatDate(saleOrder.dateOrder.split(' ')[0]) || '-'} @@ -690,20 +692,21 @@ const Transactions = ({ context = '' }) => { /> ))} {saleOrder.products.length > 4 ? ( - - +{saleOrder.products.length - 4} lihat semua produk - - ) : ( - - Lihat semua produk - - )} + + +{saleOrder.products.length - 4} lihat semua + produk + + ) : ( + + Lihat semua produk + + )}
)}
@@ -716,21 +719,38 @@ const Transactions = ({ context = '' }) => {
-
-
-

Total Harga

+
+
+

Total Harga

{currencyFormat(saleOrder.amountTotal)}

-
+ + {/* Tombol aksi: vertikal & full width, responsif */} +
+ +
@@ -917,7 +937,8 @@ const Transactions = ({ context = '' }) => {

Info Transaksi

- Gunakan filter status untuk mempermudah pencarian transaksi anda di Daftar Transaksi + Gunakan filter status untuk mempermudah pencarian transaksi + anda di Daftar Transaksi
@@ -928,23 +949,32 @@ const Transactions = ({ context = '' }) => { Status -
+
{/* Container flex: tombol prev - swiper - tombol next */} -
- +
{/* Prev */} -
{/* Next */} -
@@ -1038,41 +1079,43 @@ 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' - /> - -
- +
+ +
-
)}
@@ -1220,7 +1263,8 @@ const Transactions = ({ context = '' }) => { href={`${router.pathname}/${saleOrder?.id}`} className='text-red-500 text-nowrap' > - +{saleOrder.products.length - 4} lihat semua produk + +{saleOrder.products.length - 4}{' '} + lihat semua produk ) : ( {
-
-
+
+

Total Harga

{currencyFormat(saleOrder.amountTotal)}

-
- -
+ + + +
-- cgit v1.2.3 From 3a9a0995dad8d3deb602534814a6bb79b26afb54 Mon Sep 17 00:00:00 2001 From: Miqdad Date: Wed, 27 Aug 2025 13:16:59 +0700 Subject: Push Sementara --- src/lib/transaction/components/Transactions.jsx | 615 ++++++++---------------- 1 file changed, 196 insertions(+), 419 deletions(-) (limited to 'src/lib') diff --git a/src/lib/transaction/components/Transactions.jsx b/src/lib/transaction/components/Transactions.jsx index fab9eb5c..0d7e3f2c 100644 --- a/src/lib/transaction/components/Transactions.jsx +++ b/src/lib/transaction/components/Transactions.jsx @@ -1,11 +1,10 @@ import { useRouter } from 'next/router'; -import { useEffect, useState, useRef } from 'react'; +import { useEffect, useState, useRef } from 'react'; import { toast } from 'react-hot-toast'; import { EllipsisVerticalIcon, MagnifyingGlassIcon, ChevronDownIcon, - ChevronUpIcon, } from '@heroicons/react/24/outline'; import useAuth from '@/core/hooks/useAuth'; import { @@ -38,13 +37,11 @@ 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'; -import { addDays } from 'date-fns'; -import 'react-date-range/dist/styles.css'; // main style file -import 'react-date-range/dist/theme/default.css'; // theme css file -import { Popover } from '@headlessui/react'; +import 'react-date-range/dist/styles.css'; +import 'react-date-range/dist/theme/default.css'; +import { fetchPaymentSummary } from '../api/regenerate'; + const Transactions = ({ context = '' }) => { const auth = useAuth(); const router = useRouter(); @@ -59,14 +56,8 @@ const Transactions = ({ context = '' }) => { startDate = null, endDate = new Date(), } = router.query; - const { - productCart, - setRefreshCart, - setProductCart, - refreshCart, - isLoading, - setIsloading, - } = useProductCartContext(); + const { setRefreshCart } = useProductCartContext(); + const [inputQuery, setInputQuery] = useState(q); const [toOthers, setToOthers] = useState(null); const [toCancel, setToCancel] = useState(null); @@ -75,17 +66,16 @@ 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 [sortNew, setSortNew] = useState(sort); const [contextNew, setcontextNew] = useState(router.query.context || 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 [cachedAllData, setCachedAllData] = useState(null); + const [currentData, setCurrentData] = useState([]); const calendarRef = useRef(null); - const [isDateSelected, setIsDateSelected] = useState(false); + + // loading id utk tombol lanjutkan transaksi + const [contLoadingId, setContLoadingId] = useState(null); const parseDate = (date) => { if (!date || date === 'null') return null; @@ -96,7 +86,7 @@ const Transactions = ({ context = '' }) => { const [state, setState] = useState([ { - startDate: startDate != null || 'null' ? parseDate(startDate) : null, // Gunakan `parseDate` + startDate: startDate != null || 'null' ? parseDate(startDate) : null, endDate: startDate == null ? endDate : parseDate(endDate), key: 'selection', }, @@ -116,6 +106,7 @@ const Transactions = ({ context = '' }) => { site: siteFilter || (auth?.webRole === null && auth?.site ? auth.site : null), }; + const statuses = [ { id: 'all', label: 'Semua' }, { id: 'quotation', label: 'Pending Quotation' }, @@ -142,16 +133,16 @@ const Transactions = ({ context = '' }) => { { id: 'asc', label: 'dari yang terkecil' }, { id: 'desc', label: 'dari yang terbesar' }, ]; + const { transactions } = useTransactions({ query }); + const fetchSite = async () => { const site = await getSite(); setListSites(site.sites); }; const submitCancelTransaction = async () => { - const isCancelled = await cancelTransactionApi({ - transaction: toCancel, - }); + const isCancelled = await cancelTransactionApi({ transaction: toCancel }); if (isCancelled) { toast.success('Berhasil batalkan transaksi'); transactions.refetch(); @@ -172,10 +163,7 @@ const Transactions = ({ context = '' }) => { const queryParams = {}; if (inputQuery) queryParams.q = inputQuery; if (siteFilter) queryParams.site = siteFilter; - router.push({ - pathname: router.pathname, - query: queryParams, - }); + router.push({ pathname: router.pathname, query: queryParams }); }; const handleSiteFilterChange = (e) => { @@ -183,10 +171,7 @@ const Transactions = ({ context = '' }) => { const queryParams = {}; if (inputQuery) queryParams.q = inputQuery; if (e.target.value) queryParams.site = e.target.value; - router.push({ - pathname: router.pathname, - query: queryParams, - }); + router.push({ pathname: router.pathname, query: queryParams }); }; const exportToExcel = (data, siteFilter) => { @@ -211,9 +196,7 @@ const Transactions = ({ context = '' }) => { Total: currencyFormat(saleOrder.amountTotal), Status: contextLabelMap[saleOrder.status] || saleOrder.status, }; - if (siteFilter) { - row['Site'] = siteFilter; - } + if (siteFilter) row['Site'] = siteFilter; rowsToExport.push(row); }); @@ -226,13 +209,30 @@ const Transactions = ({ context = '' }) => { XLSX.writeFile(workbook, 'transactions.xlsx'); }; + const getAllData = async () => { + const query = { + name: q, + offset: (pageNew - 1) * limitNew, + limit: limitNew, + context: contextNew[statusNew] || 'all', + 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), + }; + const queryString = toQuery(query); + const data = await transactionsApi({ query: queryString }); + return data; + }; + const handleExportCSV = async () => { const dataToExport = await getAllData(); - exportToCSV(dataToExport?.saleOrders, siteFilter); - }; - - const exportToCSV = (data, siteFilter) => { const fieldsToExport = [ 'No. Transaksi', 'No. PO', @@ -242,28 +242,20 @@ const Transactions = ({ context = '' }) => { '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), - contextLabelMap[saleOrder.status] || saleOrder.status, - ]; - - if (siteFilter) { - row.push(siteFilter); - } - - return row.join(','); - }); + const rowsToExport = + dataToExport?.saleOrders?.map((saleOrder) => { + const row = [ + saleOrder.name, + saleOrder.purchaseOrderName || '-', + saleOrder.dateOrder || '-', + saleOrder.address.customer?.name || '-', + saleOrder.sales, + currencyFormat(saleOrder.amountTotal), + contextLabelMap[saleOrder.status] || saleOrder.status, + ]; + if (siteFilter) row.push(siteFilter); + return row.join(','); + }) || []; const csvContent = 'data:text/csv;charset=utf-8,' + @@ -278,60 +270,25 @@ const Transactions = ({ context = '' }) => { document.body.removeChild(link); }; - const getAllData = async () => { - const query = { - name: q, - offset: (pageNew - 1) * limitNew, - limit: limitNew, - context: contextNew[statusNew] || 'all', - 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), - }; - const queryString = toQuery(query); - const data = await transactionsApi({ query: queryString }); - return data; - }; - const handleExportExcel = async () => { const dataToExport = await getAllData(); - exportToExcel(dataToExport?.saleOrders, siteFilter); }; const handleDownload = (format) => { - handleExport(format); + if (format === 'csv') handleExportCSV(); + else if (format === 'xlsx') handleExportExcel(); setIsOpen(false); }; - const handleExport = (format) => { - if (format === 'csv') { - handleExportCSV(); - } else if (format === 'xlsx') { - handleExportExcel(); - } - }; - useEffect(() => { const handleClickOutside = (event) => { - if ( - calendarRef.current && - !calendarRef.current.contains(event.target) - ) { + if (calendarRef.current && !calendarRef.current.contains(event.target)) { setIsOpenCalender(false); } }; - - document.addEventListener("mousedown", handleClickOutside); - return () => { - document.removeEventListener("mousedown", handleClickOutside); - }; + document.addEventListener('mousedown', handleClickOutside); + return () => document.removeEventListener('mousedown', handleClickOutside); }, []); const startItem = 1 + (pageNew - 1) * limitNew; @@ -346,9 +303,6 @@ const Transactions = ({ context = '' }) => { const handleBuyBack = async (products) => { try { - // setStatus('loading'); - console.log("Products to add:", products); - const results = await Promise.all( products.map((product) => upsertUserCart({ @@ -359,55 +313,44 @@ const Transactions = ({ context = '' }) => { selected: true, source: 'add_to_cart', qtyAppend: true, - }).catch(error => { - return { error, product }; - }) + }).catch((error) => ({ error, product })) ) ); - const failedOperations = results.filter(result => result && result.error); - // console.log(results); - + const failedOperations = results.filter((r) => r && r.error); if (failedOperations.length > 0) { - console.error('Some products failed to add to cart:', failedOperations); - toast.error(`${failedOperations.length} produk gagal ditambahkan ke keranjang`); - - // You might want to proceed with the successful ones or handle differently + toast.error( + `${failedOperations.length} produk gagal ditambahkan ke keranjang` + ); if (failedOperations.length < products.length) { - toast.success(`${products.length - failedOperations.length} produk berhasil ditambahkan ke keranjang`); + toast.success( + `${ + products.length - failedOperations.length + } produk berhasil ditambahkan` + ); setRefreshCart(true); router.push('/shop/cart'); } return; } - - // All operations succeeded setRefreshCart(true); - toast.success('Semua produk berhasil ditambahkan ke keranjang belanja'); + toast.success('Semua produk berhasil ditambahkan ke keranjang'); router.push('/shop/cart'); - } catch (error) { - console.error('Gagal menambahkan produk ke keranjang:', error); toast.error('Terjadi kesalahan saat menambahkan produk ke keranjang'); - // setStatus('error'); } }; - const handleStatusChange = async (status) => { setStatusNew(status); setPageNew(1); if (status === 'all' && cachedAllData) { - setCurrentData(cachedAllData); - return; + setCurrentData(cachedAllData); + return; } const data = await fetchSite(status, 1); - - if (status === 'all') { - setCachedAllData(data); - } - + if (status === 'all') setCachedAllData(data); setCurrentData(data); }; @@ -415,15 +358,8 @@ const Transactions = ({ context = '' }) => { setCachedAllData([]); }, []); - const handleReset = () => { - setState([ - { - startDate: null, - endDate: new Date(), - key: 'selection', - }, - ]); + setState([{ startDate: null, endDate: new Date(), key: 'selection' }]); setIsOpenCalender(false); router.push(`${router.pathname}`); }; @@ -443,13 +379,68 @@ const Transactions = ({ context = '' }) => { 'November', 'Desember', ]; - const [day, month, year] = dateString.split('/'); return `${day} ${months[parseInt(month, 10) - 1]} ${year}`; }; + // ==== Lanjutkan Transaksi ==== + const handleContinuePayment = async (saleOrder) => { + try { + const partnerId = + auth?.partnerId || auth?.partner_id || auth?.partner?.id || auth?.id; + + setContLoadingId(saleOrder.id); + + // 1) coba pakai URL yang sudah dikirim dari list + const existingUrl = + saleOrder?.paymentSummary?.redirectUrl || + saleOrder?.paymentLinkMidtrans; + + if (existingUrl) { + window.open(existingUrl, '_blank', 'noopener,noreferrer'); + toast.success('Membuka halaman pembayaran…'); + return; + } + + // 2) fallback: generate baru via API + const res = await fetchPaymentSummary({ + partnerId, + saleOrderId: saleOrder.id, + autogen: true, + }); + + const eligible = + res?.eligible_continue ?? + res?.eligibleContinue ?? + res?.eligible ?? + false; + + if (!eligible) { + toast.error('Transaksi belum memenuhi syarat untuk dilanjutkan.'); + return; + } + + const redirectUrl = res?.redirect_url || res?.redirectUrl; + if (redirectUrl) { + window.open(redirectUrl, '_blank', 'noopener,noreferrer'); + toast.success('Membuka halaman pembayaran…'); + } else { + toast.error('Link pembayaran belum tersedia.'); + } + } catch (e) { + const msg = + e?.response?.data?.description || + e?.message || + 'Gagal melanjutkan transaksi'; + toast.error(msg); + } finally { + setContLoadingId(null); + } + }; + return ( <> + {/* ===== MOBILE ===== */}
@@ -491,7 +482,6 @@ const Transactions = ({ context = '' }) => { {isOpenCalender && (
- {/* Tombol silang di sudut kanan atas */}
)}
- {/*
- e.target === document} - selectsRange={true} - startDate={startDate} - endDate={endDate} - dateFormat='dd/MM' - className='w-full' - maxDate={new Date()} - placeholderText='Semua Tanggal' - onChange={(update) => { - setDateRange(update); - }} - withPortal - isClearable={true} - /> -
*/} -
-
-
- - 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 && ( @@ -683,9 +588,9 @@ const Transactions = ({ context = '' }) => {
{saleOrder.products .slice(1, 4) - .map((product, index) => ( + .map((product, idx) => ( {product?.name} {
+

Total Harga

@@ -727,7 +633,6 @@ const Transactions = ({ context = '' }) => {

- {/* Tombol aksi: vertikal & full width, responsif */}
- + {saleOrder?.eligibleContinue && ( + + )}
- - {/*
-
- - No. Purchase Order - -

- {saleOrder.purchaseOrderName || '-'} -

-
-
- - Total Invoice - -

- {saleOrder.invoiceCount} Invoice -

-
-
*/} - {/*
-
- Sales -

- {saleOrder.sales} -

-
-
- - Total Harga - -

- {currencyFormat(saleOrder.amountTotal)} -

-
-
*/}
))} @@ -795,7 +671,6 @@ const Transactions = ({ context = '' }) => { @@ -868,6 +743,7 @@ const Transactions = ({ context = '' }) => {
+ {/* ===== DESKTOP ===== */}
@@ -920,29 +796,7 @@ const Transactions = ({ context = '' }) => { )}
-
- -
+
@@ -950,9 +804,7 @@ const Transactions = ({ context = '' }) => { Status
- {/* Container flex: tombol prev - swiper - tombol next */}
- {/* Prev */} - {/* Swiper container scrollable */}
{
- {/* Next */}
+
{listSites?.length > 0 ? ( @@ -1054,6 +905,7 @@ const Transactions = ({ context = '' }) => {
+

Menampilkan {startItem}- @@ -1083,6 +935,7 @@ const Transactions = ({ context = '' }) => { Semua +

{isOpenCalender && (
- {/* Tombol silang di sudut kanan atas */}
+
{!transactions.isLoading && transactions?.data?.saleOrders?.length == 0 && ( @@ -1199,11 +1028,9 @@ const Transactions = ({ context = '' }) => {

{saleOrder.name}

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

@@ -1215,7 +1042,9 @@ const Transactions = ({ context = '' }) => {
+
+
@@ -1250,9 +1079,9 @@ const Transactions = ({ context = '' }) => {
{saleOrder.products .slice(1, 4) - .map((product, index) => ( + .map((product, idx) => ( {product?.name} {

+
+

Total Harga

@@ -1309,16 +1140,22 @@ const Transactions = ({ context = '' }) => { Beli Lagi - + {saleOrder?.eligibleContinue && ( + + )}
@@ -1327,70 +1164,10 @@ const Transactions = ({ context = '' }) => {
)}
- {/* - - - - - - - {auth?.feature?.soApproval && } - - - - - - - {transactions.isLoading && ( - - - - )} - {!transactions.isLoading && - (!transactions?.data?.saleOrders || - transactions?.data?.saleOrders?.length == 0) && ( - - - - )} - {transactions.data?.saleOrders?.map((saleOrder) => ( - - - - - - {auth?.feature?.soApproval && ( - - )} - - - - - ))} - -
No. TransaksiNo. POTanggalCreated BySiteSalespersonTotalStatus
-
- -
-
Tidak ada transaksi
- - {saleOrder.name} - - {saleOrder.purchaseOrderName || '-'}{saleOrder.dateOrder || '-'}{saleOrder.address.customer?.name || '-'}{saleOrder.sitePartner || '-'}{saleOrder.sales} - {currencyFormat(saleOrder.amountTotal)} - -
- -
-
*/} -- cgit v1.2.3 From a0e32b6a8af5a57ef9d0222f8ecefc69a4f92294 Mon Sep 17 00:00:00 2001 From: Miqdad Date: Thu, 28 Aug 2025 08:11:07 +0700 Subject: Change String --- src/lib/transaction/components/Transactions.jsx | 145 +++++++++++++++--------- 1 file changed, 90 insertions(+), 55 deletions(-) (limited to 'src/lib') diff --git a/src/lib/transaction/components/Transactions.jsx b/src/lib/transaction/components/Transactions.jsx index 0d7e3f2c..826d88ac 100644 --- a/src/lib/transaction/components/Transactions.jsx +++ b/src/lib/transaction/components/Transactions.jsx @@ -40,7 +40,7 @@ import { Calendar } from 'lucide-react'; import { DateRangePicker } from 'react-date-range'; import 'react-date-range/dist/styles.css'; import 'react-date-range/dist/theme/default.css'; -import { fetchPaymentSummary } from '../api/regenerate'; +// import { fetchPaymentSummary } from '../api/regenerate'; const Transactions = ({ context = '' }) => { const auth = useAuth(); @@ -73,8 +73,49 @@ const Transactions = ({ context = '' }) => { const [cachedAllData, setCachedAllData] = useState(null); const [currentData, setCurrentData] = useState([]); const calendarRef = useRef(null); + // --- helpers aturan regenerate --- + const getApproval = (so) => + (so?.approvalStatus || so?.approval_status || '').toLowerCase(); + + const isApprovalPending = (so) => + ['pengajuan1', 'pengajuan2'].includes(getApproval(so)); + + const isWebSource = (so) => { + const code = (so?.source || so?.sourceCode || '').toLowerCase(); + const id = so?.sourceId ?? so?.source_id; + return code === 'website' || code === 'web' || id === 59; // sesuaikan id sumber web kamu + }; + + const getPaymentStatus = (so) => + ( + so?.paymentSummary?.paymentStatus || + so?.paymentSummary?.status || + so?.paymentStatus || + '' + ).toLowerCase(); + + // kosong | expire | belum settlement → boleh regenerate + const isPaymentUnsettled = (so) => { + const ps = getPaymentStatus(so); + if (!ps) return true; // kosong + if (['expire', 'expired'].includes(ps)) return true; + // dianggap “belum settlement” jika bukan status paid/settled + return !['settlement', 'paid', 'capture', 'success', 'settled'].includes( + ps + ); + }; + + // WAJIB semua true + const canRegeneratePayment = (so) => + isApprovalPending(so) && isWebSource(so) && isPaymentUnsettled(so); + + // Jika backend sudah kirim flag eligibleContinue, tetap wajib lolos aturan front-end + const eligibleToShow = (so) => { + const backend = + typeof so?.eligibleContinue === 'boolean' ? so.eligibleContinue : true; + return backend && canRegeneratePayment(so); + }; - // loading id utk tombol lanjutkan transaksi const [contLoadingId, setContLoadingId] = useState(null); const parseDate = (date) => { @@ -364,6 +405,7 @@ const Transactions = ({ context = '' }) => { router.push(`${router.pathname}`); }; + const formatDate = (dateString) => { const months = [ 'Januari', @@ -383,60 +425,53 @@ const Transactions = ({ context = '' }) => { return `${day} ${months[parseInt(month, 10) - 1]} ${year}`; }; - // ==== Lanjutkan Transaksi ==== - const handleContinuePayment = async (saleOrder) => { - try { - const partnerId = - auth?.partnerId || auth?.partner_id || auth?.partner?.id || auth?.id; +const handleContinuePayment = async (saleOrder) => { + try { + if (!canRegeneratePayment(saleOrder)) { + toast.error( + 'Tidak memenuhi syarat: approval belum pengajuan1/2, sumber bukan web, atau pembayaran sudah settle.' + ); + return; + } + const partnerId = + auth?.partnerId || auth?.partner_id || auth?.partner?.id || auth?.id; + setContLoadingId(saleOrder.id); - setContLoadingId(saleOrder.id); + // pakai URL yang sudah ada dulu + const existingUrl = + saleOrder?.paymentSummary?.redirectUrl || saleOrder?.paymentLinkMidtrans; - // 1) coba pakai URL yang sudah dikirim dari list - const existingUrl = - saleOrder?.paymentSummary?.redirectUrl || - saleOrder?.paymentLinkMidtrans; + if (existingUrl) { + window.open(existingUrl, '_blank', 'noopener,noreferrer'); + toast.success('Membuka halaman pembayaran…'); + return; + } - if (existingUrl) { - window.open(existingUrl, '_blank', 'noopener,noreferrer'); - toast.success('Membuka halaman pembayaran…'); - return; - } + // fallback autogen + const res = await fetchPaymentSummary({ + partnerId, + saleOrderId: saleOrder.id, + autogen: true, + }); + const redirectUrl = res?.redirect_url || res?.redirectUrl; + if (redirectUrl) { + window.open(redirectUrl, '_blank', 'noopener,noreferrer'); + toast.success('Membuka halaman pembayaran…'); + } else { + toast.error('Link pembayaran belum tersedia.'); + } + } catch (e) { + const msg = + e?.response?.data?.description || + e?.message || + 'Gagal melanjutkan transaksi'; + toast.error(msg); + } finally { + setContLoadingId(null); + } +}; - // 2) fallback: generate baru via API - const res = await fetchPaymentSummary({ - partnerId, - saleOrderId: saleOrder.id, - autogen: true, - }); - - const eligible = - res?.eligible_continue ?? - res?.eligibleContinue ?? - res?.eligible ?? - false; - - if (!eligible) { - toast.error('Transaksi belum memenuhi syarat untuk dilanjutkan.'); - return; - } - const redirectUrl = res?.redirect_url || res?.redirectUrl; - if (redirectUrl) { - window.open(redirectUrl, '_blank', 'noopener,noreferrer'); - toast.success('Membuka halaman pembayaran…'); - } else { - toast.error('Link pembayaran belum tersedia.'); - } - } catch (e) { - const msg = - e?.response?.data?.description || - e?.message || - 'Gagal melanjutkan transaksi'; - toast.error(msg); - } finally { - setContLoadingId(null); - } - }; return ( <> @@ -646,7 +681,7 @@ const Transactions = ({ context = '' }) => { Beli Lagi - {saleOrder?.eligibleContinue && ( + {eligibleToShow(saleOrder) && ( )}
@@ -1140,7 +1175,7 @@ const Transactions = ({ context = '' }) => { Beli Lagi - {saleOrder?.eligibleContinue && ( + {eligibleToShow(saleOrder) && ( )}
-- cgit v1.2.3 From 1269c53959f81babc9ba14b57429cb49c1c0aba2 Mon Sep 17 00:00:00 2001 From: Miqdad Date: Thu, 28 Aug 2025 09:58:51 +0700 Subject: push --- src/lib/transaction/components/Transactions.jsx | 204 +++++++++--------------- 1 file changed, 75 insertions(+), 129 deletions(-) (limited to 'src/lib') diff --git a/src/lib/transaction/components/Transactions.jsx b/src/lib/transaction/components/Transactions.jsx index 826d88ac..7df1f0ff 100644 --- a/src/lib/transaction/components/Transactions.jsx +++ b/src/lib/transaction/components/Transactions.jsx @@ -40,12 +40,10 @@ import { Calendar } from 'lucide-react'; import { DateRangePicker } from 'react-date-range'; import 'react-date-range/dist/styles.css'; import 'react-date-range/dist/theme/default.css'; -// import { fetchPaymentSummary } from '../api/regenerate'; const Transactions = ({ context = '' }) => { const auth = useAuth(); const router = useRouter(); - const swiperRef = useRef(null); const { q = '', page = 1, @@ -70,52 +68,9 @@ const Transactions = ({ context = '' }) => { const [sortNew, setSortNew] = useState(sort); const [contextNew, setcontextNew] = useState(router.query.context || context); const [isOpenCalender, setIsOpenCalender] = useState(false); - const [cachedAllData, setCachedAllData] = useState(null); - const [currentData, setCurrentData] = useState([]); const calendarRef = useRef(null); - // --- helpers aturan regenerate --- - const getApproval = (so) => - (so?.approvalStatus || so?.approval_status || '').toLowerCase(); - - const isApprovalPending = (so) => - ['pengajuan1', 'pengajuan2'].includes(getApproval(so)); - - const isWebSource = (so) => { - const code = (so?.source || so?.sourceCode || '').toLowerCase(); - const id = so?.sourceId ?? so?.source_id; - return code === 'website' || code === 'web' || id === 59; // sesuaikan id sumber web kamu - }; - - const getPaymentStatus = (so) => - ( - so?.paymentSummary?.paymentStatus || - so?.paymentSummary?.status || - so?.paymentStatus || - '' - ).toLowerCase(); - - // kosong | expire | belum settlement → boleh regenerate - const isPaymentUnsettled = (so) => { - const ps = getPaymentStatus(so); - if (!ps) return true; // kosong - if (['expire', 'expired'].includes(ps)) return true; - // dianggap “belum settlement” jika bukan status paid/settled - return !['settlement', 'paid', 'capture', 'success', 'settled'].includes( - ps - ); - }; - - // WAJIB semua true - const canRegeneratePayment = (so) => - isApprovalPending(so) && isWebSource(so) && isPaymentUnsettled(so); - - // Jika backend sudah kirim flag eligibleContinue, tetap wajib lolos aturan front-end - const eligibleToShow = (so) => { - const backend = - typeof so?.eligibleContinue === 'boolean' ? so.eligibleContinue : true; - return backend && canRegeneratePayment(so); - }; + // loading id utk tombol lanjutkan transaksi const [contLoadingId, setContLoadingId] = useState(null); const parseDate = (date) => { @@ -191,13 +146,9 @@ const Transactions = ({ context = '' }) => { setToCancel(null); }; - const pageCount = Math.ceil(transactions?.data?.saleOrderTotal / limitNew); - let pageQuery = _.omit(query, ['limit', 'offset', 'context']); - pageQuery = _.pickBy( - pageQuery, - (value, key) => value !== '' && !(key === 'page' && value === '1') + const pageCount = Math.ceil( + (transactions?.data?.saleOrderTotal || 0) / (limitNew || 1) ); - pageQuery = toQuery(pageQuery); const handleSubmit = (e) => { e.preventDefault(); @@ -227,12 +178,12 @@ const Transactions = ({ context = '' }) => { ]; const rowsToExport = []; - data.forEach((saleOrder) => { + (data || []).forEach((saleOrder) => { const row = { 'No. Transaksi': saleOrder.name, 'No. PO': saleOrder.purchaseOrderName || '-', Tanggal: saleOrder.dateOrder || '-', - 'Created By': saleOrder.address.customer?.name || '-', + 'Created By': saleOrder.address?.customer?.name || '-', Salesperson: saleOrder.sales, Total: currencyFormat(saleOrder.amountTotal), Status: contextLabelMap[saleOrder.status] || saleOrder.status, @@ -251,7 +202,7 @@ const Transactions = ({ context = '' }) => { }; const getAllData = async () => { - const query = { + const qobj = { name: q, offset: (pageNew - 1) * limitNew, limit: limitNew, @@ -266,7 +217,7 @@ const Transactions = ({ context = '' }) => { site: siteFilter || (auth?.webRole === null && auth?.site ? auth.site : null), }; - const queryString = toQuery(query); + const queryString = toQuery(qobj); const data = await transactionsApi({ query: queryString }); return data; }; @@ -289,12 +240,15 @@ const Transactions = ({ context = '' }) => { saleOrder.name, saleOrder.purchaseOrderName || '-', saleOrder.dateOrder || '-', - saleOrder.address.customer?.name || '-', + saleOrder.address?.customer?.name || '-', saleOrder.sales, currencyFormat(saleOrder.amountTotal), - contextLabelMap[saleOrder.status] || saleOrder.status, + (contextLabelMap[saleOrder.status] || saleOrder.status || '').replace( + /,/g, + ' ' + ), ]; - if (siteFilter) row.push(siteFilter); + if (siteFilter) row.push((siteFilter || '').replace(/,/g, ' ')); return row.join(','); }) || []; @@ -335,7 +289,7 @@ const Transactions = ({ context = '' }) => { const startItem = 1 + (pageNew - 1) * limitNew; const endItem = Math.min( limitNew * pageNew, - transactions?.data?.saleOrderTotal + transactions?.data?.saleOrderTotal || 0 ); useEffect(() => { @@ -345,7 +299,7 @@ const Transactions = ({ context = '' }) => { const handleBuyBack = async (products) => { try { const results = await Promise.all( - products.map((product) => + (products || []).map((product) => upsertUserCart({ userId: auth.id, type: 'product', @@ -358,15 +312,13 @@ const Transactions = ({ context = '' }) => { ) ); - const failedOperations = results.filter((r) => r && r.error); - if (failedOperations.length > 0) { - toast.error( - `${failedOperations.length} produk gagal ditambahkan ke keranjang` - ); - if (failedOperations.length < products.length) { + const failed = results.filter((r) => r && r.error); + if (failed.length > 0) { + toast.error(`${failed.length} produk gagal ditambahkan ke keranjang`); + if (failed.length < (products || []).length) { toast.success( `${ - products.length - failedOperations.length + (products || []).length - failed.length } produk berhasil ditambahkan` ); setRefreshCart(true); @@ -377,26 +329,24 @@ const Transactions = ({ context = '' }) => { setRefreshCart(true); toast.success('Semua produk berhasil ditambahkan ke keranjang'); router.push('/shop/cart'); - } catch (error) { + } catch { toast.error('Terjadi kesalahan saat menambahkan produk ke keranjang'); } }; - const handleStatusChange = async (status) => { + const handleStatusChange = (status) => { setStatusNew(status); setPageNew(1); - - if (status === 'all' && cachedAllData) { - setCurrentData(cachedAllData); - return; - } - const data = await fetchSite(status, 1); - if (status === 'all') setCachedAllData(data); - setCurrentData(data); + // opsional: sinkronkan ke URL + router.push({ + pathname: router.pathname, + query: { ...router.query, status }, + }); }; useEffect(() => { - setCachedAllData([]); + // bersihkan cache lama jika perlu (saat first mount) + // (sengaja kosong; tidak pakai cached data di versi ini) }, []); const handleReset = () => { @@ -405,7 +355,6 @@ const Transactions = ({ context = '' }) => { router.push(`${router.pathname}`); }; - const formatDate = (dateString) => { const months = [ 'Januari', @@ -421,57 +370,54 @@ const Transactions = ({ context = '' }) => { 'November', 'Desember', ]; - const [day, month, year] = dateString.split('/'); + const [day, month, year] = (dateString || '').split('/'); + if (!day || !month || !year) return dateString || '-'; return `${day} ${months[parseInt(month, 10) - 1]} ${year}`; }; -const handleContinuePayment = async (saleOrder) => { - try { - if (!canRegeneratePayment(saleOrder)) { - toast.error( - 'Tidak memenuhi syarat: approval belum pengajuan1/2, sumber bukan web, atau pembayaran sudah settle.' - ); - return; - } - const partnerId = - auth?.partnerId || auth?.partner_id || auth?.partner?.id || auth?.id; - setContLoadingId(saleOrder.id); - - // pakai URL yang sudah ada dulu - const existingUrl = - saleOrder?.paymentSummary?.redirectUrl || saleOrder?.paymentLinkMidtrans; - - if (existingUrl) { - window.open(existingUrl, '_blank', 'noopener,noreferrer'); - toast.success('Membuka halaman pembayaran…'); - return; - } + // ==== Lanjutkan Transaksi (tanpa endpoint baru) ==== + const handleContinuePayment = async (saleOrder) => { + try { + setContLoadingId(saleOrder.id); - // fallback autogen - const res = await fetchPaymentSummary({ - partnerId, - saleOrderId: saleOrder.id, - autogen: true, - }); - const redirectUrl = res?.redirect_url || res?.redirectUrl; - if (redirectUrl) { - window.open(redirectUrl, '_blank', 'noopener,noreferrer'); - toast.success('Membuka halaman pembayaran…'); - } else { - toast.error('Link pembayaran belum tersedia.'); - } - } catch (e) { - const msg = - e?.response?.data?.description || - e?.message || - 'Gagal melanjutkan transaksi'; - toast.error(msg); - } finally { - setContLoadingId(null); - } -}; + // 1) pakai URL yang dikirim server di list + const existingUrl = + saleOrder?.paymentSummary?.redirectUrl || + saleOrder?.paymentLinkMidtrans || + ''; + if (existingUrl) { + window.open(existingUrl, '_blank', 'noopener,noreferrer'); + toast.success('Membuka halaman pembayaran…'); + return; + } + // 2) kalau masih kosong, refetch list (server bisa auto-generate saat list) + await transactions.refetch(); + const updated = + transactions?.data?.saleOrders?.find((s) => s.id === saleOrder.id) || + null; + const updatedUrl = + updated?.paymentSummary?.redirectUrl || + updated?.paymentLinkMidtrans || + ''; + + if (updatedUrl) { + window.open(updatedUrl, '_blank', 'noopener,noreferrer'); + toast.success('Membuka halaman pembayaran…'); + } else { + toast.error('Link pembayaran belum tersedia.'); + } + } catch (e) { + const msg = + e?.response?.data?.description || + e?.message || + 'Gagal melanjutkan transaksi'; + toast.error(msg); + } finally { + setContLoadingId(null); + } + }; return ( <> @@ -681,7 +627,7 @@ const handleContinuePayment = async (saleOrder) => { Beli Lagi - {eligibleToShow(saleOrder) && ( + {saleOrder?.eligibleContinue && ( )} @@ -1175,7 +1121,7 @@ const handleContinuePayment = async (saleOrder) => { Beli Lagi - {eligibleToShow(saleOrder) && ( + {saleOrder?.eligibleContinue && ( )} -- cgit v1.2.3 From 2ac24291d27c3093f813391265ae4fe75d291e84 Mon Sep 17 00:00:00 2001 From: Miqdad Date: Thu, 28 Aug 2025 11:19:36 +0700 Subject: posisi harag --- src/lib/transaction/components/Transactions.jsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'src/lib') diff --git a/src/lib/transaction/components/Transactions.jsx b/src/lib/transaction/components/Transactions.jsx index 7df1f0ff..e06d1927 100644 --- a/src/lib/transaction/components/Transactions.jsx +++ b/src/lib/transaction/components/Transactions.jsx @@ -640,7 +640,7 @@ const Transactions = ({ context = '' }) => { > {contLoadingId === saleOrder.id ? 'Memproses…' - : 'Lanjutkan Transaksi'} + : 'Bayar Sekarang'} )} @@ -1101,10 +1101,10 @@ const Transactions = ({ context = '' }) => {
-
-
-

Total Harga

-

+

+
+

Total Harga

+

{currencyFormat(saleOrder.amountTotal)}

@@ -1134,7 +1134,7 @@ const Transactions = ({ context = '' }) => { > {contLoadingId === saleOrder.id ? 'Memproses…' - : 'Lanjutkan Transaksi'} + : 'Bayar Sekarang'} )}
-- cgit v1.2.3 From 1b7d4dd7e26e8b249adf49b86dea85968eeb6653 Mon Sep 17 00:00:00 2001 From: Miqdad Date: Thu, 28 Aug 2025 13:40:22 +0700 Subject: Add new badge --- src/lib/transaction/components/TransactionStatusBadge.jsx | 4 ++++ src/lib/transaction/components/Transactions.jsx | 2 ++ 2 files changed, 6 insertions(+) (limited to 'src/lib') diff --git a/src/lib/transaction/components/TransactionStatusBadge.jsx b/src/lib/transaction/components/TransactionStatusBadge.jsx index cb8cbcd9..d23b17cd 100644 --- a/src/lib/transaction/components/TransactionStatusBadge.jsx +++ b/src/lib/transaction/components/TransactionStatusBadge.jsx @@ -4,6 +4,10 @@ const TransactionStatusBadge = ({ status }) => { text: '' } switch (status) { + case 'belum_bayar': + badgeProps.className.push('badge-solid-red') + badgeProps.text = 'Belum Bayar' + break case 'cancel': badgeProps.className.push('badge-solid-red') badgeProps.text = 'Pesanan Batal' diff --git a/src/lib/transaction/components/Transactions.jsx b/src/lib/transaction/components/Transactions.jsx index e06d1927..dd927dfa 100644 --- a/src/lib/transaction/components/Transactions.jsx +++ b/src/lib/transaction/components/Transactions.jsx @@ -106,6 +106,7 @@ const Transactions = ({ context = '' }) => { const statuses = [ { id: 'all', label: 'Semua' }, { id: 'quotation', label: 'Pending Quotation' }, + { id: 'belum_bayar', label: 'Belum Bayar' }, { id: 'diproses', label: 'Pesanan Diproses' }, { id: 'dikemas', label: 'Pesanan Dikemas' }, { id: 'partial', label: 'Dikirim Sebagian' }, @@ -122,6 +123,7 @@ const Transactions = ({ context = '' }) => { shipping: 'Pesanan Dikirim', done: 'Pesanan Selesai', cancel: 'Pesanan Dibatalkan', + belum_bayar: 'Belum Bayar', }; const sortes = [ -- cgit v1.2.3 From ff73ed876e8516ed1a3cfef1d5f8381a2d9ca70e Mon Sep 17 00:00:00 2001 From: Miqdad Date: Thu, 28 Aug 2025 14:25:45 +0700 Subject: Show bayar sekarang in detail transaction --- src/lib/transaction/components/Transaction.jsx | 515 ++++++++----------------- 1 file changed, 165 insertions(+), 350 deletions(-) (limited to 'src/lib') diff --git a/src/lib/transaction/components/Transaction.jsx b/src/lib/transaction/components/Transaction.jsx index 77e60dc1..cc5f862c 100644 --- a/src/lib/transaction/components/Transaction.jsx +++ b/src/lib/transaction/components/Transaction.jsx @@ -43,13 +43,14 @@ import { gtagPurchase } from '@/core/utils/googleTag'; import { deleteItemCart } from '@/core/utils/cart'; import { downloadInvoice, - downloadTaxInvoice, + // downloadTaxInvoice, // (unused) } from '@/lib/invoice/utils/invoices'; import { Download } from 'lucide-react'; import axios from 'axios'; import InformationSection from '../../treckingAwb/component/InformationSection'; -import { Button } from '@chakra-ui/react'; -import { div } from 'lodash-contrib'; +// import { Button } from '@chakra-ui/react'; // (unused) +// import { div } from 'lodash-contrib'; // (unused) + const Transaction = ({ id }) => { const PPN = process.env.NEXT_PUBLIC_PPN; const router = useRouter(); @@ -73,6 +74,7 @@ const Transaction = ({ id }) => { const [toOthers, setToOthers] = useState(null); const [totalAmount, setTotalAmount] = useState(0); const [totalDiscountAmount, setTotalDiscountAmount] = useState(0); + const [contLoading, setContLoading] = useState(false); useEffect(() => { if (transaction?.data?.products) { @@ -88,6 +90,7 @@ const Transaction = ({ id }) => { setTotalDiscountAmount(calculateTotalDiscountAmount); } }, [transaction.data, transaction.isLoading]); + const submitUploadPo = async () => { const file = poFile.current.files[0]; const name = poNumber.current.value; @@ -127,10 +130,6 @@ const Transaction = ({ id }) => { } } }; - // const ContinueTransaction = () => { - // setContinueNoPo(true); - // checkoutNoPO(); - // }; const closeCancelTransaction = () => setCancelTransaction(false); const closeContinueTransaction = () => setContinueTransaction(false); @@ -138,6 +137,7 @@ const Transaction = ({ id }) => { const openRejectTransaction = () => setRejectTransaction(true); const closeRejectTransaction = () => setRejectTransaction(false); + const submitCancelTransaction = async () => { const isCancelled = await cancelTransactionApi({ transaction: transaction.data, @@ -148,6 +148,7 @@ const Transaction = ({ id }) => { } closeCancelTransaction(); }; + const checkout = async () => { if (!transaction.data?.purchaseOrderFile) { toast.error('Mohon upload dokumen PO anda sebelum melanjutkan pesanan'); @@ -194,25 +195,6 @@ const Transaction = ({ id }) => { } toast.success('Berhasil melanjutkan pesanan'); transaction.refetch(); - // console.log(transaction); - - /* 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 () => { @@ -227,6 +209,36 @@ const Transaction = ({ id }) => { transaction.refetch(); }; + // ===== Bayar Sekarang (pakai link dari backend; fallback generate via Next API) ===== + const handlePayNow = async () => { + try { + setContLoading(true); + // 1) gunakan URL yang sudah dikirim backend (jika ada) + const existingUrl = + transaction?.data?.paymentSummary?.redirectUrl || + transaction?.data?.paymentLinkMidtrans || + ''; + if (existingUrl) { + window.open(existingUrl, '_blank', 'noopener,noreferrer'); + toast.success('Membuka halaman pembayaran…'); + return; + } + // 2) fallback: panggil Next API untuk generate + const res = await axios.post( + `${process.env.NEXT_PUBLIC_SELF_HOST}/api/shop/midtrans-payment?transactionId=${transaction.data.id}` + ); + window.location.href = res.data.redirectUrl; + } catch (e) { + toast.error( + e?.response?.data?.description || + e?.message || + 'Gagal membuka pembayaran' + ); + } finally { + setContLoading(false); + } + }; + const memoizeVariantGroupCard = useMemo( () => (
@@ -314,7 +326,7 @@ const Transaction = ({ id }) => { navigator.clipboard.writeText(textToCopy); setCopied(true); toast.success('No Resi Berhasil di Copy'); - setTimeout(() => setCopied(false), 2000); // Reset copied state after 2 seconds + setTimeout(() => setCopied(false), 2000); }; const formatDate = (dateString) => { @@ -336,7 +348,7 @@ const Transaction = ({ id }) => { const [day, month, year] = dateString.split('/'); return `${day} ${months[parseInt(month, 10) - 1]} ${year}`; }; - // console.log(transaction); + return ( transaction.data?.name && ( <> @@ -366,6 +378,7 @@ const Transaction = ({ id }) => {
+ { + {/* ============ MOBILE ============ */}
- + {auth?.feature?.soApproval && (
{
-

Detail Order

+

Detail Order

{transaction.data?.name}

@@ -579,9 +594,11 @@ const Transaction = ({ id }) => {
-

Alamat Pengiriman

+

Alamat Pengiriman

-

{transaction?.data?.address?.customer?.name}

+

+ {transaction?.data?.address?.customer?.name} +

{transaction?.data?.address?.customer?.phone @@ -602,9 +619,7 @@ const Transaction = ({ id }) => {
Info Pengiriman
{transaction?.data?.pickings.length == 0 && ( -
- Belum ada pengiriman -
+
Belum ada pengiriman
)} {transaction?.data?.pickings?.map((airway) => (
{
- // ))} -
@@ -717,17 +711,20 @@ const Transaction = ({ id }) => {
Detail Produk
{transaction?.data?.products.length > 0 ? (
- +
Rincian Pembayaran

Metode Pembayaran

-

- {transaction.data?.paymentTerm || '-'} -

+

{transaction.data?.paymentTerm || '-'}

Berat Barang

-

{(transaction.data?.products?.reduce((total, item) => total + (item.weight || 0), 0)) + ' Kg'}

+

+ {transaction.data?.products?.reduce( + (total, item) => total + (item.weight || 0), + 0 + ) + ' Kg'} +


@@ -774,12 +771,7 @@ const Transaction = ({ id }) => {
)} - {/* */} - - {/* */} - - {/* */} - + {/* Tombol aksi (Mobile) */} {transaction.data?.status === 'draft' && (
{transaction.data?.status == 'draft' && - transaction?.data?.purchaseOrderFile && ( - - )} + transaction?.data?.purchaseOrderFile && ( + + )} +
+ )} + + {/* Bayar Sekarang (Mobile) — tampil jika eligible */} + {transaction.data?.eligibleContinue && ( +
+
)} + {/* ============ DESKTOP ============ */}
@@ -827,44 +834,36 @@ const Transaction = ({ id }) => { )}
- {/*new-release*/} - {/*
*/} - {/*
*/} - {/* */} - {/* {transaction?.data?.name}*/} - {/* */} - {/* */} - {/*
*/} - {/*
*/} - {/* Estimasi Barang Siap:{' '}*/} - {/* */} - {/* {transaction?.data?.expectedReadyToShip}*/} - {/* */} - {/*
*/} -
- - {transaction?.data?.name} - - - {transaction.data?.status === 'draft' && ( -
- + {/* HEADER (Desktop) — sejajarkan kiri & kanan */} +
+ {/* Kiri: SO + badge */} +
+ + {transaction?.data?.name} + + +
+ + {/* Kanan: aksi */} +
+ {transaction.data?.status === 'draft' && ( + <> + -
- {transaction.data?.status == 'draft' && - transaction?.data?.purchaseOrderFile && ( + + {transaction?.data?.purchaseOrderFile && ( )} -
-
- )} -
- {/* {transaction.data?.status === 'draft' && ( -
- - - - {transaction.data?.status == 'draft' && - transaction?.data?.purchaseOrderFile && ( - - )} + + )} + + {transaction.data?.eligibleContinue && ( + + )}
- )} */} +
@@ -967,29 +949,13 @@ const Transaction = ({ id }) => { key={index} > {invoice?.name} - {/*
-
-

{invoice?.name}

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

- {currencyFormat(invoice.amountTotal)} -

-
-
- -
*/} ))}

- {/*
*/} +
@@ -1039,17 +1005,17 @@ const Transaction = ({ id }) => { ) : ( '-' )} - {transaction?.data?.carrierId !== 32 &&( - <> -
Jenis Service
-
:
-
- {' '} - {transaction?.data?.serviceType - ? transaction?.data?.serviceType - : '-'} -
- + {transaction?.data?.carrierId !== 32 && ( + <> +
Jenis Service
+
:
+
+ {' '} + {transaction?.data?.serviceType + ? transaction?.data?.serviceType + : '-'} +
+ )}
Estimasi Tanggal Kirim
@@ -1059,41 +1025,42 @@ const Transaction = ({ id }) => { ? transaction?.data?.expectedReadyToShip : '-'}
- {transaction?.data?.carrierId !== 32 &&( - <> -
Estimasi Tiba
-
:
-
- {transaction?.data?.etaDateStart && transaction?.data?.etaDateEnd ? ( - `${transaction.data.etaDateStart} - ${transaction.data.etaDateEnd}` - ) : ( - '-' - )} -
- + {transaction?.data?.carrierId !== 32 && ( + <> +
Estimasi Tiba
+
:
+
+ {transaction?.data?.etaDateStart && + transaction?.data?.etaDateEnd + ? `${transaction.data.etaDateStart} - ${transaction.data.etaDateEnd}` + : '-'} +
+ )} - {transaction?.data?.pickings[0] && transaction?.data?.carrierId !== 32 && ( -
- - )} + )}
@@ -1103,9 +1070,7 @@ const Transaction = ({ id }) => {
{transaction?.data?.pickings.length == 0 && ( -
- Belum ada pengiriman -
+
Belum ada pengiriman
)} {transaction?.data?.pickings?.map((airway) => (
{
))} - {/*
*/} -
- {/*New release*/} - {/*
*/} - {/* {transaction?.data?.pickings?.map((airway) => (*/} - {/* setIdAWB(airway?.id)}*/} - {/* >*/} - {/*
*/} - {/*

*/} - {/* {airway?.name}*/} - {/*

*/} - {/* */} - {/* No Resi : {airway?.trackingNumber || '-'}{' '}*/} - {/* */} - {/*
*/} - {/*
*/} - {/*
*/} - {/* {airway?.delivered*/} - {/* ? 'Pesanan Tiba'*/} - {/* : 'Sedang Dikirim'}*/} - {/*
*/} - {/* */} - {/*
*/} - {/* */} - {/* ))}*/} - {/*
*/} - {/*
*/}
Invoice @@ -1202,7 +1137,6 @@ const Transaction = ({ id }) => { Nama Produk - {/* Diskon */} Jumlah Harga Subtotal @@ -1280,24 +1214,13 @@ const Transaction = ({ id }) => { )}
- {/* - {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)} - {/* {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/') && @@ -1354,34 +1277,6 @@ 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
@@ -1437,7 +1332,6 @@ const Transaction = ({ id }) => { Nama Produk - {/* Diskon */} Jumlah Harga Subtotal @@ -1480,18 +1374,8 @@ const Transaction = ({ id }) => {
- {/* - {product.price.discountPercentage > 0 - ? `${product.price.discountPercentage}%` - : ''} - */} {product.quantity} - {/* {product.price.discountPercentage > 0 && ( -
- {currencyFormat(product.price.price)} -
- )} */}
{currencyFormat(product.price.priceDiscount)}
@@ -1512,58 +1396,6 @@ const Transaction = ({ id }) => {
- - {/* {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
    - )} -
-
-
- ))} */} ) ); @@ -1589,24 +1421,7 @@ const SectionAddress = ({ address }) => { {section.customer && } - {/* - - toggleSection('shipping')} - /> - - {section.shipping && } - - - - toggleSection('invoice')} - /> - {section.invoice && } */} + {/* Bagian shipping/invoice disembunyikan */} ); }; -- cgit v1.2.3 From b7833ad1d13772ea1dd7a6af6716a2c4b575132a Mon Sep 17 00:00:00 2001 From: Miqdad Date: Thu, 28 Aug 2025 17:08:20 +0700 Subject: Hide Beli lagi --- src/lib/transaction/components/Transactions.jsx | 55 +++++++++++++++---------- 1 file changed, 33 insertions(+), 22 deletions(-) (limited to 'src/lib') diff --git a/src/lib/transaction/components/Transactions.jsx b/src/lib/transaction/components/Transactions.jsx index dd927dfa..bb24f717 100644 --- a/src/lib/transaction/components/Transactions.jsx +++ b/src/lib/transaction/components/Transactions.jsx @@ -69,6 +69,10 @@ const Transactions = ({ context = '' }) => { const [contextNew, setcontextNew] = useState(router.query.context || context); const [isOpenCalender, setIsOpenCalender] = useState(false); const calendarRef = useRef(null); + const isUnpaid = (s) => + ['belum_bayar'].includes( + String(s || '').toLowerCase() + ); // loading id utk tombol lanjutkan transaksi const [contLoadingId, setContLoadingId] = useState(null); @@ -617,18 +621,22 @@ const Transactions = ({ context = '' }) => {
- + {/* Beli Lagi hanya muncul jika status bukan unpaid */} + {!isUnpaid(saleOrder.status) && ( + + )} + {/* Bayar Sekarang hanya kalau eligible */} {saleOrder?.eligibleContinue && (
- + {!isUnpaid(saleOrder.status) && ( + + )} + {/* Bayar Sekarang: hanya kalau eligible */} {saleOrder?.eligibleContinue && ( + + )} +
diff --git a/src/lib/transaction/components/Transactions.jsx b/src/lib/transaction/components/Transactions.jsx index 2e3eaaa2..600518fa 100644 --- a/src/lib/transaction/components/Transactions.jsx +++ b/src/lib/transaction/components/Transactions.jsx @@ -704,6 +704,30 @@ const Transactions = ({ context = '' }) => { active={toOthers} close={() => setToOthers(null)} > + {transactions.data?.status === 'draft' && ( + <> + + + + )}
- -
-- cgit v1.2.3