From 097b66c761d069cd5cb4ce62ff18064e7708e141 Mon Sep 17 00:00:00 2001 From: juddydev Date: Fri, 28 Mar 2025 16:28:52 +0900 Subject: [PATCH 1/7] export csv for coin ledger --- pages/admin/pro/history.js | 124 +++++++++++++++++++++++++++---------- 1 file changed, 92 insertions(+), 32 deletions(-) diff --git a/pages/admin/pro/history.js b/pages/admin/pro/history.js index 3e0604e5..40e0f0c7 100644 --- a/pages/admin/pro/history.js +++ b/pages/admin/pro/history.js @@ -1,5 +1,5 @@ import { serverSideTranslations } from 'next-i18next/serverSideTranslations' -import { useEffect, useState } from 'react' +import { useEffect, useMemo, useState } from 'react' import { useRouter } from 'next/router' import { useTranslation } from 'next-i18next' @@ -29,7 +29,9 @@ import Image from 'next/image' import { CSVLink } from 'react-csv' import DownloadIcon from '../../../public/images/download.svg' import { koinly } from '../../../utils/koinly' - +import { format } from 'date-fns' +import { TbArrowsSort } from 'react-icons/tb' +import SimpleSelect from '../../../components/UI/SimpleSelect' export const getServerSideProps = async (context) => { const { locale, query } = context const { address } = query @@ -56,6 +58,26 @@ const showFiat = (fiat, selectedCurrency) => { ) } +const dateFormatters = { + koinly: (timestamp) => { + // ISO format: YYYY-MM-DDTHH:MM:SS.000Z + return new Date(timestamp * 1000).toISOString() + }, + coinLedger: (timestamp) => { + // Format: MM/DD/YYYY HH:MM:SS in UTC + const date = new Date(timestamp * 1000) + return format(new Date(date.getTime() + date.getTimezoneOffset() * 60000), 'MM/dd/yyyy HH:mm:ss') + } +} + +const processDataForExport = (activities, platform) => { + return activities.map(activity => { + const processedActivity = { ...activity } + processedActivity.timestampExport = dateFormatters[platform](activity.timestamp) + return processedActivity + }) +} + export default function History({ queryAddress, selectedCurrency, setSelectedCurrency }) { const router = useRouter() const width = useWidth() @@ -77,6 +99,42 @@ export default function History({ queryAddress, selectedCurrency, setSelectedCur const [rendered, setRendered] = useState(false) const [removeDust, setRemoveDust] = useState(false) const [filteredActivities, setFilteredActivities] = useState([]) + const [platformCSVExport, setPlatformCSVExport] = useState('koinly') + + const platformCSVHeaders = useMemo(() => [ + { + platform: 'koinly', + headers: [ + { label: 'Date', key: 'timestampExport' }, + { label: 'Sent Amount', key: 'sentAmount' }, + { label: 'Sent Currency', key: 'sentCurrency' }, + { label: 'Received Amount', key: 'receivedAmount' }, + { label: 'Received Currency', key: 'receivedCurrency' }, + { label: 'Fee Amount', key: 'txFeeNumber' }, + { label: 'Fee Currency', key: 'txFeeCurrencyCode' }, + { label: 'Net Worth Amount', key: 'amountInFiats.' + selectedCurrency }, + { label: 'Net Worth Currency', key: 'netWorthCurrency' }, + { label: 'Label', key: '' }, + { label: 'Description', key: 'memo' }, + { label: 'TxHash', key: 'hash' } + ] + }, { + platform: 'coinLedger', + headers: [ + { label: 'Date (UTC)', key: 'timestampExport' }, + { label: 'Platform (Optional)', key: 'platform' }, + { label: 'Asset Sent', key: 'sentCurrency' }, + { label: 'Amount Sent', key: 'sentAmount' }, + { label: 'Asset Received', key: 'receivedCurrency' }, + { label: 'Amount Received', key: 'receivedAmount' }, + { label: 'Fee Currency (Optional)', key: 'txFeeCurrencyCode' }, + { label: 'Fee Amount (Optional)', key: 'txFeeNumber' }, + { label: 'Type', key: 'txType' }, + { label: 'Description (Optional)', key: 'memo' }, + { label: 'TxHash (Optional)', key: 'hash' } + ] + } + ], [selectedCurrency]) useEffect(() => { setRendered(true) @@ -171,16 +229,16 @@ export default function History({ queryAddress, selectedCurrency, setSelectedCur const response = await axiosAdmin .get( 'user/addresses/activities?convertCurrency=' + - selectedCurrency + - '&addresses=' + - addressesToCheck + - '&period=' + - period + - '&order=' + - orderPart + - '&limit=1000' + - (options?.marker ? '&marker=' + options.marker : '') + - (sortCurrency ? '&sortCurrency=' + sortCurrency : '') + selectedCurrency + + '&addresses=' + + addressesToCheck + + '&period=' + + period + + '&order=' + + orderPart + + '&limit=1000' + + (options?.marker ? '&marker=' + options.marker : '') + + (sortCurrency ? '&sortCurrency=' + sortCurrency : '') ) .catch((error) => { setLoading(false) @@ -232,7 +290,7 @@ export default function History({ queryAddress, selectedCurrency, setSelectedCur if (res.activities[i].amount?.issuer) { let koinlyId = koinly[xahauNetwork ? 'xahau' : 'xrpl'][ - res.activities[i].amount?.issuer + ':' + res.activities[i].amount?.currency + res.activities[i].amount?.issuer + ':' + res.activities[i].amount?.currency ] if (koinlyId) { scvCurrency = koinlyId @@ -440,32 +498,34 @@ export default function History({ queryAddress, selectedCurrency, setSelectedCur
+
+ + +
{rendered && ( header.platform.toLowerCase() === platformCSVExport.toLocaleLowerCase())?.headers || []} filename={'export ' + new Date().toISOString() + '.csv'} className={'button-action' + (!(activities?.length > 0) ? ' disabled' : '')} > - CSV for Koinly + CSV for {platformCSVExport} )} + {/*

-
- Let us know if we miss koinlyIDs for your tokens. We will add them to the system. + Let us know if we miss koinlyIDs for your tokens. We will add them to the system. */}
<> @@ -592,4 +652,4 @@ export default function History({ queryAddress, selectedCurrency, setSelectedCur ) -} +} \ No newline at end of file From 7d300c3cd7a2fc113e7d55677d64601b3d817160 Mon Sep 17 00:00:00 2001 From: juddydev Date: Sat, 29 Mar 2025 23:28:29 +0900 Subject: [PATCH 2/7] update null for empty vaule instead of 0 --- pages/admin/pro/history.js | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/pages/admin/pro/history.js b/pages/admin/pro/history.js index 40e0f0c7..43a73b23 100644 --- a/pages/admin/pro/history.js +++ b/pages/admin/pro/history.js @@ -59,24 +59,24 @@ const showFiat = (fiat, selectedCurrency) => { } const dateFormatters = { - koinly: (timestamp) => { + Koinly: (timestamp) => { // ISO format: YYYY-MM-DDTHH:MM:SS.000Z - return new Date(timestamp * 1000).toISOString() + return new Date(timestamp * 1000).toISOString(); }, - coinLedger: (timestamp) => { + CoinLedger: (timestamp) => { // Format: MM/DD/YYYY HH:MM:SS in UTC - const date = new Date(timestamp * 1000) - return format(new Date(date.getTime() + date.getTimezoneOffset() * 60000), 'MM/dd/yyyy HH:mm:ss') + const date = new Date(timestamp * 1000); + return format(new Date(date.getTime() + date.getTimezoneOffset() * 60000), 'MM/dd/yyyy HH:mm:ss'); } -} +}; const processDataForExport = (activities, platform) => { return activities.map(activity => { - const processedActivity = { ...activity } - processedActivity.timestampExport = dateFormatters[platform](activity.timestamp) - return processedActivity - }) -} + const processedActivity = { ...activity }; + processedActivity.timestampExport = dateFormatters[platform](activity.timestamp); + return processedActivity; + }); +}; export default function History({ queryAddress, selectedCurrency, setSelectedCurrency }) { const router = useRouter() @@ -99,11 +99,11 @@ export default function History({ queryAddress, selectedCurrency, setSelectedCur const [rendered, setRendered] = useState(false) const [removeDust, setRemoveDust] = useState(false) const [filteredActivities, setFilteredActivities] = useState([]) - const [platformCSVExport, setPlatformCSVExport] = useState('koinly') + const [platformCSVExport, setPlatformCSVExport] = useState('Koinly') const platformCSVHeaders = useMemo(() => [ { - platform: 'koinly', + platform: 'Koinly', headers: [ { label: 'Date', key: 'timestampExport' }, { label: 'Sent Amount', key: 'sentAmount' }, @@ -119,7 +119,7 @@ export default function History({ queryAddress, selectedCurrency, setSelectedCur { label: 'TxHash', key: 'hash' } ] }, { - platform: 'coinLedger', + platform: 'CoinLedger', headers: [ { label: 'Date (UTC)', key: 'timestampExport' }, { label: 'Platform (Optional)', key: 'platform' }, @@ -310,10 +310,10 @@ export default function History({ queryAddress, selectedCurrency, setSelectedCur res.activities[i].timestampExport = new Date(res.activities[i].timestamp * 1000).toISOString() - res.activities[i].sentAmount = sending ? res.activities[i].amountNumber : 0 + res.activities[i].sentAmount = sending ? res.activities[i].amountNumber : "" res.activities[i].sentCurrency = sending ? scvCurrency : '' - res.activities[i].receivedAmount = !sending ? res.activities[i].amountNumber : 0 + res.activities[i].receivedAmount = !sending ? res.activities[i].amountNumber : "" res.activities[i].receivedCurrency = !sending ? scvCurrency : '' res.activities[i].netWorthCurrency = selectedCurrency.toUpperCase() @@ -505,8 +505,8 @@ export default function History({ queryAddress, selectedCurrency, setSelectedCur value={platformCSVExport} setValue={setPlatformCSVExport} optionsList={[ - { value: 'koinly', label: 'Koinly' }, - { value: 'coinLedger', label: 'CoinLedger' } + { value: 'Koinly', label: 'Koinly' }, + { value: 'CoinLedger', label: 'CoinLedger' } ]} />