200ok-ch/organice

View on GitHub
src/lib/clocking.js

Summary

Maintainability
B
5 hrs
Test Coverage
import { subheadersOfHeaderWithIndex } from './org_utils';
import { dateForTimestamp } from './timestamps';

export const hasActiveClock = (header) => {
  const logBookEntries = header.get('logBookEntries', []);
  const activeEntries = logBookEntries.filter((entry) => entry.get('start') && !entry.get('end'));
  return activeEntries.size !== 0;
};

const totalTimeLogged = (header) => {
  const logBookEntries = header.get('logBookEntries', []);

  const times = logBookEntries.map((entry) =>
    entry.get('start') && entry.get('end')
      ? dateForTimestamp(entry.get('end')) - dateForTimestamp(entry.get('start'))
      : 0
  );

  const addedTimes = times.reduce((acc, val) => acc + val, 0);
  return addedTimes;
};

export const totalFilteredTimeLogged = (filters, header) => {
  const clocks = header
    .get('logBookEntries', [])
    .map((l) => [l.get('start'), l.get('end')])
    .filter(([start, end]) => start && end)
    .filter((ts) => ts.some((t) => filters.every((f) => f(t))));

  const times = clocks.map(([start, end]) => dateForTimestamp(end) - dateForTimestamp(start));

  const addedTimes = times.reduce((acc, val) => acc + val, 0);
  return addedTimes;
};

export const updateHeadersTotalTimeLoggedRecursive = (headers) => {
  if (!headers) {
    return headers;
  }
  const headersWithtotalTimeLogged = headers.map((header) =>
    header.set('totalTimeLogged', totalTimeLogged(header))
  );
  const headersWithtotalTimeLoggedRecursive = headersWithtotalTimeLogged.map((header, index) => {
    const subheaders = subheadersOfHeaderWithIndex(headersWithtotalTimeLogged, index);
    const totalTimeLoggedRecursive = subheaders.reduce(
      (acc, val) => acc + val.get('totalTimeLogged'),
      header.get('totalTimeLogged')
    );
    return header.set('totalTimeLoggedRecursive', totalTimeLoggedRecursive);
  });
  return headersWithtotalTimeLoggedRecursive;
};

export const updateHeadersTotalFilteredTimeLoggedRecursive = (filters, headers) => {
  if (!headers) {
    return headers;
  }
  const headersWithtotalTimeLogged = headers.map((header) =>
    header.set('totalFilteredTimeLogged', totalFilteredTimeLogged(filters, header))
  );
  const headersWithtotalTimeLoggedRecursive = headersWithtotalTimeLogged.map((header, index) => {
    const subheaders = subheadersOfHeaderWithIndex(headersWithtotalTimeLogged, index);
    const totalTimeLoggedRecursive = subheaders.reduce(
      (acc, val) => acc + val.get('totalFilteredTimeLogged'),
      header.get('totalFilteredTimeLogged')
    );
    return header.set('totalFilteredTimeLoggedRecursive', totalTimeLoggedRecursive);
  });
  return headersWithtotalTimeLoggedRecursive;
};