Skip to content
Snippets Groups Projects
utils.js 3.36 KiB
Newer Older
  • Learn to ignore specific revisions
  • const { cozyClient } = require('cozy-konnector-libs')
    const { rangeDate } = require('./../constants')
    
    /**
     * Aggregates the load data by month, summing the load of each day for each month.
     *
     * @param {import('../types').FormattedData[]} data - The data to aggregate.
     *
     * @returns {import('../types').FormattedData[]} - An array of aggregated data by month.
     */
    function aggregateMonthlyLoad(data) {
      const monthlyLoad = {}
    
      for (const entry of data) {
        const { year, month, load } = entry
        const monthKey = `${year}-${month}`
    
        if (!monthlyLoad[monthKey]) {
          monthlyLoad[monthKey] = {
            load: load,
            year: year,
            month: month,
            day: 0,
            hour: 0,
            minute: 0
          }
        } else {
          monthlyLoad[monthKey].load += load
        }
      }
    
      return Object.values(monthlyLoad)
    }
    
    /**
     * Aggregates the load data by year, summing the load of each month for each year.
     *
     * @param {import('../types').FormattedData[]} data - The data to aggregate.
     *
     * @returns {import('../types').FormattedData[]} - An array of aggregated data by year.
     */
    function aggregateYearlyLoad(data) {
      const yearlyLoad = {}
    
      for (const entry of data) {
        const { year, load } = entry
    
        if (!yearlyLoad[year]) {
          yearlyLoad[year] = {
            load: load,
            year: year,
            month: 0,
            day: 0,
            hour: 0,
            minute: 0
          }
        } else {
          yearlyLoad[year].load += load
        }
      }
    
      return Object.values(yearlyLoad)
    }
    
    /**
    
    Rémi PAILHAREY's avatar
    Rémi PAILHAREY committed
     * Removes aggregates matching the same year and month as the first data retrieved from GRDF if it is already in database.
    
     *
     * This step is needed to avoid updating the 3 years old month aggregate with incomplete data
     *
     * @param {number} firstMonth
     * @param {number} firstYear
     * @param {import('../types').FormattedData[]} yearlyLoads
     * @returns {Promise<import('../types').FormattedData[]>}
     */
    async function filterFirstMonthlyLoad(firstMonth, firstYear, monthlyLoads) {
      const monthlyLoadRef = await cozyClient.data.defineIndex(
        rangeDate.month.doctype,
        rangeDate.month.keys
      )
      const startDateMonthlyLoad = await cozyClient.data.query(monthlyLoadRef, {
        selector: { year: firstYear, month: firstMonth },
        limit: 1
      })
    
      if (!startDateMonthlyLoad.length) {
        return monthlyLoads
      }
      return monthlyLoads.filter(
        monthlyLoad =>
          monthlyLoad.year !== startDateMonthlyLoad[0].year ||
          monthlyLoad.month !== startDateMonthlyLoad[0].month
      )
    }
    
    /**
    
    Rémi PAILHAREY's avatar
    Rémi PAILHAREY committed
     * Removes aggregates matching the same year as the first data retrieved from GRDF if it is already in database.
    
     *
     * This step is needed to avoid updating the 3 years old year aggregate with incomplete data
     *
     * @param {number} firstYear
     * @param {import('../types').FormattedData[]} yearlyLoads
     * @returns {Promise<import('../types').FormattedData[]>}
     */
    async function filterFirstYearlyLoad(firstYear, yearlyLoads) {
      const yearlyLoadRef = await cozyClient.data.defineIndex(
        rangeDate.year.doctype,
        rangeDate.year.keys
      )
      const startDateYearlyLoad = await cozyClient.data.query(yearlyLoadRef, {
        selector: { year: firstYear },
        limit: 1
      })
      if (!startDateYearlyLoad.length) {
        return yearlyLoads
      }
      return yearlyLoads.filter(
        yearlyLoad => yearlyLoad.year !== startDateYearlyLoad[0].year
      )
    }
    
    module.exports = {
      aggregateMonthlyLoad,
      aggregateYearlyLoad,
      filterFirstMonthlyLoad,
      filterFirstYearlyLoad
    }