85 lines
1.6 KiB
JavaScript
85 lines
1.6 KiB
JavaScript
import { isInRange } from '../lib/dateFilter'
|
|
|
|
const getDate = (value) => {
|
|
const d = new Date(value)
|
|
|
|
let month = d.getUTCMonth() + 1
|
|
const year = d.getUTCFullYear()
|
|
|
|
if (month < 10) {
|
|
month = `0${month}`
|
|
}
|
|
|
|
return `${month}/${year}`
|
|
}
|
|
|
|
const compute = (transactions, dateFrom, dateTo, order) => {
|
|
const emptyCategory = {
|
|
id: -1,
|
|
label: 'Sans catégorie',
|
|
color: '#cccccc',
|
|
}
|
|
let data = {}
|
|
|
|
if (!order) {
|
|
order = 'sum'
|
|
}
|
|
|
|
transactions.forEach((transaction) => {
|
|
if (transaction.debit === 0) {
|
|
return
|
|
}
|
|
|
|
if (!isInRange(transaction.date, dateFrom, dateTo)) {
|
|
return
|
|
}
|
|
|
|
let category = transaction.category ?? emptyCategory
|
|
|
|
if (!Object.hasOwn(data, category.label)) {
|
|
data[category.label] = {
|
|
category: category,
|
|
average: 0,
|
|
monthAverage: 0,
|
|
months: {},
|
|
count: 0,
|
|
sum: 0,
|
|
}
|
|
}
|
|
|
|
++data[category.label].count
|
|
data[category.label].sum += transaction.debit
|
|
|
|
const date = getDate(transaction.date)
|
|
|
|
if (!Object.hasOwn(data[category.label].months, date)) {
|
|
data[category.label].months[date] = 0
|
|
}
|
|
|
|
data[category.label].months[date] += transaction.debit
|
|
})
|
|
|
|
for (let i in data) {
|
|
data[i].average = data[i].sum / data[i].count
|
|
|
|
const monthsValues = Object.values(data[i].months)
|
|
|
|
data[i].monthAverage = monthsValues.reduce((a, b) => a + b, 0) / monthsValues.length
|
|
}
|
|
|
|
data = Object.values(data).sort((a, b) => {
|
|
if (a[order] < b[order]) {
|
|
return 1
|
|
}
|
|
|
|
if (a[order] > b[order]) {
|
|
return -1
|
|
}
|
|
|
|
return 0
|
|
})
|
|
|
|
return data
|
|
}
|
|
|
|
export { compute }
|