Source

services/helpers.js

import moment from 'moment'

/**
 * Legacy helper by akka
 * @namespace Services
 * @category Services
 * @module helpers
 * @todo This is not a service. Refactor/Remove or move into utils
 * */
export default () => {
  return {
    /**
     * Used by Ecoconduite
     * @todo Move into utils/dates.js
     * @param {*} date
     * @returns
     */
    reformatDateString: function (date) {
      if (!date) return ''
      var d = date.replace(/\s/g, '')
      return d.split('/').reverse().join('-')
    },
    /**
     * Used by Ecoconduite
     * @todo Move into utils/dates.js
     * @param {*} date
     * @returns
     */
    getDatesBetweenDates: function (startDate, endDate) {
      let dates = []
      const theDate = new Date(startDate)
      const end = new Date(endDate)
      end.setDate(end.getDate() + 1)
      while (theDate < end) {
        let current_datetime = new Date(theDate)
        let formatted_date = moment(String(current_datetime)).format(
          'YYYY-MM-DD'
        )
        dates = [...dates, formatted_date]

        theDate.setDate(theDate.getDate() + 1)
      }

      return dates
    },
    /**
     * Used by Ecoconduite
     * @todo Move into utils/dates.js
     * @param {*} date
     * @returns
     */
    isTodayOrYesterday: function (range) {
      let todayIndex = range.indexOf(moment().format('YYYY-MM-DD'))
      let yesterdayIndex = range.indexOf(
        moment().subtract(1, 'days').format('YYYY-MM-DD')
      )
      let rangeNow = []
      if (todayIndex != -1) {
        range.splice(todayIndex, 1)
        rangeNow.push(moment().format('YYYY-MM-DD'))
      }
      if (yesterdayIndex != -1) {
        range.splice(yesterdayIndex, 1)
        rangeNow.push(moment().subtract(1, 'days').format('YYYY-MM-DD'))
      }

      return {
        isTodayOrYesterday: rangeNow.length > 0,
        range: range,
        rangeNow: rangeNow,
      }
    },
    /**
     * @todo Move into ecoconduite store (do not extract custom logic) (single reference)
     * @param {*} dataResponseA
     * @param {*} dataResponseB
     * @returns
     */
    combineDataResponses: function (dataResponseA, dataResponseB) {
      let res = {}

      let sumRegEx = new RegExp('^distance|^duration|^phase|^consumption|co2')
      let avgRegEx = new RegExp('verage$|^ratio|^ratin')

      for (let property in dataResponseA) {
        res[property] = dataResponseA[property]
        if (
          Object.getOwnPropertyDescriptor(dataResponseB, property) !=
            'undefined ' &&
          dataResponseB[property] != null
        ) {
          if (sumRegEx.test(property)) {
            res[property] =
              parseInt(dataResponseA[property]) +
              parseInt(dataResponseB[property])
            res[property] = res[property].toString()
          }
          // Oui j'assume, je veux qu'on évalue avg après sum.
          if (
            avgRegEx.test(property) &&
            (Number(dataResponseA.distanceTotal) !== 0 ||
              parseInt(dataResponseB.distanceTotal) !== 0)
          ) {
            // moyennes pondérées par le nombre de km parcouru
            res[property] =
              (Number(dataResponseA[property]) *
                parseInt(dataResponseA.distanceTotal) +
                Number(dataResponseB[property]) *
                  parseInt(dataResponseB.distanceTotal)) /
              (Number(dataResponseA.distanceTotal) +
                parseInt(dataResponseB.distanceTotal))
            res[property] = res[property].toString()
          }
        }
      }

      return res
    },
    /**
     * @todo Do not extract if single reference
     * @param {*} data
     * @returns
     */
    eachPropertyToString: function (data) {
      for (let property in data) {
        if (data[property] != null && typeof data[property] == 'number') {
          data[property] = data[property].toString()
        }
      }
      return data
    },
    exportXlsdata: function (columns, data, name) {
      var tableToExcel = (function () {
        const uri = 'data:application/vnd.ms-excel;base64,',
          base64 = function (s) {
            return window.btoa(unescape(encodeURIComponent(s)))
          }
        return function (tableHTML, name = 'Worksheet') {
          let template = `<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><?xml version="1.0" encoding="UTF-8" standalone="yes"?><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>${name}</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--><meta http-equiv="content-type" content="text/plain; charset=UTF-8"/></head><body>${tableHTML}</body></html>`
          var link = document.createElement('a')
          link.download = name
          link.href = uri + base64(template)
          link.click()
        }
      })()

      let html = '<tr>' + columns.map((c) => `<th>${c}</th>`).join('') + '</tr>'
      data.forEach((row) => {
        html += `<tr>${row.map((v) => `<td>${v}</td>`).join('')}</tr>`
      })
      html = `<table>${html}</table>`
      html = html.split('null').join('')
      tableToExcel(html, name)
    },
  }
}