budget-go/frontend/js/chart/debitAverage.js
2025-03-26 12:34:05 +01:00

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 }