Skip to content

Instantly share code, notes, and snippets.

@gkatsanos
Created October 1, 2022 06:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gkatsanos/9a04f23b77939ae2b2b4374830c06eff to your computer and use it in GitHub Desktop.
Save gkatsanos/9a04f23b77939ae2b2b4374830c06eff to your computer and use it in GitHub Desktop.
import groupby from 'https://esm.sh/lodash.groupby'
import moment from 'https://esm.sh/moment'
import { Transaction } from '../types.ts'
export function calculateTransactionTotals(content: Transaction[]) {
groupTransactionsByUserAndCurrency(content)
return prepareData(groupTransactionsByUserAndCurrency(content), content)
}
const calculateTotalAmountsPerCurrency = (transactions) => {
const result = {}
Object.keys(transactions).forEach((currency) => {
result[currency] = transactions[currency].reduce(
(previous, current) =>
previous.amount
? (parseFloat(previous.amount) * 100 + parseFloat(current.amount) * 100) / 100
: (parseFloat(previous) * 100 + parseFloat(current.amount) * 100) / 100,
0,
)
})
return result
}
const groupTransactionsByUser = (content: Transaction) => {
return groupby(content, 'user_id')
}
const getLastTransactions = (transactionsGroupedByUser) => {
const lastTransactions = {}
for (const [userId, transactions] of Object.entries(transactionsGroupedByUser)) {
lastTransactions[userId] = transactions.reduce((previous, current, index, transaction) => {
if (moment(previous.timestamp).isBefore(current.timestamp) || moment(previous).isBefore(current.timestamp)) {
return current.timestamp
}
return previous
}, transactions[0].timestamp)
}
return lastTransactions
}
const groupTransactionsByUserAndCurrency = (content) => {
const transactionsGroupedByUserIdAndCurrency = {}
for (const [userId, transactions] of Object.entries(groupTransactionsByUser(content))) {
transactionsGroupedByUserIdAndCurrency[userId] = groupby(transactions, 'currency')
}
return transactionsGroupedByUserIdAndCurrency
}
const prepareData = (transactionsGroupedByUserIdAndCurrency, content) => {
const result = {}
for (const [userId, transactions] of Object.entries(transactionsGroupedByUserIdAndCurrency)) {
result[userId] = calculateTotalAmountsPerCurrency(transactions)
result[userId]['last-activity'] = moment(getLastTransactions(groupTransactionsByUser(content))[userId]).format('YYYY-MM-DD')
}
printTable(result)
return result
}
const printTable = (result) => {
console.table(result, ['GBP', 'EUR', 'USD', 'last-activity'])
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment