0xc14m1z/git-timesheet

View on GitHub
lib/timesheet/addContinuity.js

Summary

Maintainability
A
35 mins
Test Coverage
const R = require("ramda")
const update = require("immutability-helper")
const pipe = require("popipe")
const { times, getNumericHours } = require("./helpers")

const CONTINUITY_HOUR = { type: "CONTINUITY" }

const firstHour = couple =>
  Math.min(...couple)

const delta = ([firstHour, secondHour]) =>
  Math.abs(firstHour - secondHour)

const mergeAdditionalHours = (result, additionalHour) =>
  ({ ...result, ...additionalHour })

const addContinuityHour = from => (hours, shift) =>
  ({ ...hours, [from + shift]: CONTINUITY_HOUR })

const getContinuityHours = hours =>
  R.range(0, delta(hours) - 1).reduce(
    addContinuityHour(firstHour(hours) + 1),
    {}
  )

const shouldAddContinuityHours = continuityHours => hours =>
  R.range(1, continuityHours + 1).includes(delta(hours) - 1)

const getAdditionalHours = (continuityHours, day) =>
  pipe(
    getNumericHours(day),
    R.aperture(2),
    R.filter(shouldAddContinuityHours(continuityHours)),
    R.map(getContinuityHours),
    R.reduce(mergeAdditionalHours, {})
  )

const addContinuityToDay = (continuityHours, days) => (result, date) => ({
  ...result,
  [date]: {
    ...days[date],
    ...getAdditionalHours(continuityHours, days[date])
  }
})

const addContinuity = continuityHours => days =>
  pipe(
    Object.keys(days),
    R.reduce(addContinuityToDay(continuityHours, days), {})
  )

module.exports = addContinuity