% Task environment

\RequirePackage[usenames,dvipsnames]{xcolor}
\RequirePackage{etex}

\newif\ifshowtasktime

\newcommand\taskname{Requisite}

% Tango Icon Theme Aluminum
\definecolor{taskrulecolor}{HTML}{2e3436}

\newcounter{taskc}
\setcounter{taskc}{0}
\renewcommand\thetaskc{\Roman{taskc}}

% stores the total low and high until reset
\newcounter{tasktmin}
\newcounter{tasktmax}

% added to after reset; all-encompassing time interval
\newcounter{taskamin}
\newcounter{taskamax}

% all-encompassing overlap interval
\newcounter{taskaomin}
\newcounter{taskaomax}

\newcounter{subtaskc}[taskc]
\setcounter{subtaskc}{0}
\renewcommand\thesubtaskc{%
  \thetaskc\thesubtaskc@part
}
\def\thesubtaskc@part{%
  \expandafter\ifnum\value{subtaskc}>0
    -\alph{subtaskc}%
  \fi
}

\newlength\taskspace
\newenvironment{task}[1][]%
  {%
    \goodbreak
    \setlength\taskspace{2ex}%
    \refstepcounter{taskc}%
    \vspace{-0.5\parskip}%
    \textcolor{taskrulecolor}{%
      \leavevmode\llap{\rule{\marginparwidth}{1pt}}%
      \rule{\textwidth}{1pt}%
    }%
    \vspace{-0.5\baselineskip}%
    \begin{@task}[#1]%
  }%
  {%
    \end{@task}%
    \vspace{-0.85\baselineskip}%
    \textcolor{taskrulecolor}{%
      \leavevmode\llap{\rule{\marginparwidth}{2pt}}%
      \rule{\textwidth}{2pt}%
    }%
    \ignorespaces
  }


\newenvironment{subtask}[1][]%
  {%
    \goodbreak
    \list{}{%
      \leftmargin4ex
      \item\relax
    }%
    \setlength\taskspace{6ex}%
    \refstepcounter{subtaskc}%
    \begin{@task}[#1]%
  }%
  {%
    \end{@task}%
    \endlist
    \ignorespaces
  }



\newlength\@@subtaskcl
\newcount\@@hmin \newcount\@@hmax \newcount\@@hdiff
\newcount\@@hconf \newcount\@@hvari
\newenvironment{@task}[1][]%
  {%
    \def\@@h{#1}%
    \goodbreak\leavevmode\@margin@sig
    % enable overlap command
    \let\overlap\@task@overlap
    \let\complete\@task@complete
    % typeset
    \llap{%
      \raisebox{-1.8\baselineskip}[0em][0em]{%
        \shortstack{%
          {\sc\taskname}\space\thesubtaskc
          \\
          \vphantom{M}%
          \ifx\@@h\empty\else
            \ifshowtasktime
              {\small\@task@h#1||\,h}%
            \fi
          \fi%
          \\
          \vphantom{M}%
          \ifx\@@h\empty\else
            \@task@setregs#1||%
            \ifshowtasktime
              {\scriptsize \the\@@hconf\% Confidence}%
            \fi
            % advance the total counters
            \addtocounter{tasktmin}{\@@hmin}%
            \addtocounter{tasktmax}{\@@hmax}%
          \fi%
        }%
        \hspace{\the\taskspace}%
        % adjust width of the subtask text so that the task number lines up
        \settowidth\@@subtaskcl{\thesubtaskc@part}%
        \hspace{-\the\@@subtaskcl}%
      }%
    }%
    \ignorespaces
  }%
  {\goodbreak\ignorespaces}


\def\@task@h#1-#2||{%
  #1%
  \ifnum#1=#2\else
    --#2%
  \fi
}


\def\@task@overlap#1{%
  \def\@@hoverlap{#1}%
  \@task@setregs#1||%
  \addtocounter{taskaomin}{\@@hmin}%
  \addtocounter{taskaomax}{\@@hmax}%
}


\def\@task@complete#1{%
  \ifx\@@h\empty\else
    \expandafter\@task@setregs\@@h||%
    % undo previous operation
    \addtocounter{tasktmin}{-\@@hmin}%
    \addtocounter{tasktmax}{-\@@hmax}%
    % add exact time
    \addtocounter{tasktmin}{#1}%
    \addtocounter{tasktmax}{#1}%
  \fi
}


\def\@task@setregs#1-#2||{%
  \@@hmin#1\relax
  \@@hmax#2\relax
  % perform calculation (be sure to multiply by 100 before dividing, otherwise
  % we lose everything through integer truncation); the calculation is:
  % 100 - ((|N-M|/M)*100)
  \@@hdiff#2\relax \advance\@@hdiff-#1\relax
  \@@hconf\@@hdiff
  \multiply\@@hconf by 100\relax
  \divide\@@hconf by-\@@hmax
  \advance\@@hconf by 100\relax
}

% for variability
\def\@task@setregs@vari#1-#2||{%
  \@@hmin#1\relax
  \@@hmax#2\relax
  % ((|N-M|/N)*100)
  \@@hdiff#2\relax \advance\@@hdiff-#1\relax
  \@@hvari\@@hdiff
  \multiply\@@hvari by 100\relax
  \divide\@@hvari by \@@hmin
}


\newcommand\tasksummary[1][]{{%
  \edef\@@range{\arabic{tasktmin}-\arabic{tasktmax}}%
  % determine confidence
  \expandafter\@task@setregs\@@range||%
  \expandafter\@task@setregs@vari\@@range||%
  \ifshowtasktime
    \vfill
    \subsection{Summary}
    \pnumoff
    \par {\sc Time Interval:} \expandafter\@task@h\@@range|| Hours%
    \par {\sc Confidence:} \the\@@hconf\%%
    \par {\sc Variability:} \the\@@hvari\%%
    % output any comments, if available
    \def\@@comments{#1}%
    \ifx\@@comments\empty\else
      \par\@@comments
    \fi
    \pnumrest
  \fi
  % reset counters
  \addtocounter{taskamin}{\value{tasktmin}}%
  \addtocounter{taskamax}{\value{tasktmax}}%
  \setcounter{tasktmin}{0}%
  \setcounter{tasktmax}{0}%
}}


\newwrite\@taskstats
\newcommand\projectsummary{{%
  \edef\@@range{\arabic{taskamin}-\arabic{taskamax}}%
  % determine confidence
  \expandafter\@task@setregs\@@range||%
  \expandafter\@task@setregs@vari\@@range||%
  % only output if requested
  \ifshowtasktime
    \section{Project Summary}
    \pnumoff
    \par {\sc Non-Overlapping Time Interval:}%
    \space\expandafter\@task@h\@@range|| Man Hours%
    \par {\sc Confidence:} \the\@@hconf\%%
    \par {\sc Variability:} \the\@@hvari\%%
    \pnumrest
  \fi
  % calculate median
  \newcount\@@med
  \advance\@@med \value{taskamin}%
  \advance\@@med \value{taskamax}%
  \divide\@@med by 2\relax
  % calculate non-overlap
  \newcount\@@nomin \newcount\@@nomax
  \advance\@@nomin \value{taskamin}%
  \advance\@@nomax \value{taskamax}%
  \advance\@@nomin -\value{taskaomin}%
  \advance\@@nomax -\value{taskaomax}%
  % calculate overlap median
  \newcount\@@omed
  \advance\@@omed\@@nomin
  \advance\@@omed\@@nomax
  \divide\@@omed by 2\relax
  % write task stats to file (can be used for reporting by building consecutive
  % versions, concatenating the data, taking the last row for each date and
  % plotting, for example)
  \immediate\openout\@taskstats=taskstats.dat
  \immediate\write\@taskstats{min max med omin omax omed cp vp}%
  \immediate\write\@taskstats{%
    \arabic{taskamin} \arabic{taskamax} \the\@@med
    \space\the\@@nomin \space \the\@@nomax \space\the\@@omed
    \space\the\@@hconf \space\the\@@hvari
  }%
  \immediate\closeout\@taskstats
  % reset counters
  \setcounter{taskamin}{0}\setcounter{taskamax}{0}%
  \setcounter{taskaomin}{0}\setcounter{taskaomax}{0}%
}}
