% Task management for Unified Process Methodology
%
% Copyright (c) 2006-2022 Stephane GALLAND <galland@arakhne.org>
% 
% This program is free library; you can redistribute it and/or modify
% it under the terms of the GNU Lesser General Public License as
% published by the Free Software Foundation; either version 3 of the
% License, or any later version.
%
% This library is distributed in the hope that it will be useful, but
% WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
% Lesser General Public License for more details.
%
% You should have received a copy of the GNU Lesser General Public
% License along with this library; see the file COPYING.  If not,
% write to the Free Software Foundation, Inc., 59 Temple Place - Suite
% 330, Boston, MA 02111-1307, USA.
%
% Creation date: 2006-04-20
% Modifications:
%   2009-10-30   Clean code.
%   2007-03-19   Add localization.
%

\global\edef\upm@package@task@ver{2022/02/10}

\NeedsTeXFormat{LaTeX2e}[1995/12/01]
\ProvidesPackage{upmethodology-task}[\upm@package@task@ver]

\RequirePackage{upmethodology-p-common}

%----- LOCALIZATION
\def\upm@task@lang@english{
  \gdef\upm@lang@@{\message{**** upmethodology-task is using English language ****}}%
  \gdef\upm@task@lang@task{Task}
  \gdef\upm@task@lang@description{Description}
  \gdef\upm@task@lang@startat{Start at}
  \gdef\upm@task@lang@endat{End at}
  \gdef\upm@task@lang@archieved{Archieved}
  \gdef\upm@task@lang@managers{Managers}
  \gdef\upm@task@lang@members{Members}
  \gdef\upm@task@lang@milestones{Milestones}
  \gdef\upm@task@lang@subtask{Sub-task of}
}
\def\upm@task@lang@french{
  \gdef\upm@lang@@{\message{**** upmethodology-task is using French language ****}}%
  \gdef\upm@task@lang@task{T\^ache}
  \gdef\upm@task@lang@description{Description}
  \gdef\upm@task@lang@startat{D\'ebut le}
  \gdef\upm@task@lang@endat{Fin le}
  \gdef\upm@task@lang@archieved{Termin\'ee}
  \gdef\upm@task@lang@managers{R\'ef\'erent}
  \gdef\upm@task@lang@members{Membres}
  \gdef\upm@task@lang@milestones{\'Etapes}
  \gdef\upm@task@lang@subtask{Sous-t\^ache de}
}

%----- OPTIONS
\DeclareOption{french}{%
  \upm@task@lang@french
}
\DeclareOption{francais}{%
  \upm@task@lang@french
}
\DeclareOption{english}{%
  \upm@task@lang@english
}
\ExecuteOptions{english}
\ProcessOptions
\upm@lang@@

\RequirePackage{upmethodology-version}

%----- 
\newif\if@upm@task@displaydescription
\newif\if@upm@task@rebuild
\@upm@task@rebuildfalse

\def\upm@task@define#1#2#3{%
	\protected@write\@auxout{}{\string\global\string\@namedef{upm@task@#1@#2}{#3}}%
	\ifthenelse{\equal{\csname upm@task@#1@#2\endcsname}{#3}}{}{\@upm@task@rebuildtrue}%
	\global\@namedef{upm@task@#1@#2}{#3}%
}

\def\upm@task@define@list#1#2#3{%
	\ifthenelse{\equal{\csname upm@task@#1@#2\endcsname}{\@empty}}{%
		\expandafter\xdef\csname upm@task@#1@#2\endcsname{#3}%
	}{%
		\expandafter\xdef\csname upm@task@#1@#2\endcsname{%
			\csname upm@task@#1@#2\endcsname, #3%
		}%
	}%
	\AtEndDocument{\protected@write\@auxout{}{\string\global\string\@namedef{upm@task@#1@#2}{\csname upm@task@#1@#2\endcsname}}}
}

\newenvironment{upm@taskdescription}[1]{%
	\global\@namedef{upm@task@#1@managers}{}%
	\global\@namedef{upm@task@#1@members}{}%
	\global\@namedef{upm@task@#1@milestones}{}%

	\newcommand{\taskname}[1]{\upm@task@define{#1}{name}{##1}}
	\newcommand{\tasksuper}[1]{\upm@task@define{#1}{super}{##1}}
	\newcommand{\taskcomment}[1]{\upm@task@define{#1}{comment}{##1}}%
	\newcommand{\taskprogress}[1]{\upm@task@define{#1}{progress}{##1}}%
	\newcommand{\taskstart}[1]{\upm@task@define{#1}{startat}{##1}}%
	\newcommand{\taskend}[1]{\upm@task@define{#1}{endat}{##1}}%
	\newcommand{\taskmanager}[1]{\upm@task@define@list{#1}{managers}{##1}}
	\newcommand{\taskmember}[1]{%
		\upm@task@define@list{#1}{members}{##1}%
	}
	\newcommand{\taskmilestone}[2]{%
		\upm@task@define@list{#1}{milestones}{##1}%
		\upm@task@define{#1}{ml@##1}{##2}%
		%\global\@namedef{upm@task@#1@description@milestones}{\upm@task@lang@milestones: & \multicolumn{2}{X|}{\parbox[t]{1.9\linewidth}{\thetaskmembers{#1}}} \\}
	}


	\def\upm@task@currenttask{#1}
}{%
	\if@upm@task@displaydescription\thetaskdescription{\upm@task@currenttask}\fi%
	\let\upm@task@currenttask\relax%
}

%-----
%\begin{taskdescription}{id}...\end{taskdescription}
\newenvironment{taskdescription}[1]{%
	\@upm@task@displaydescriptiontrue%
	\upm@taskdescription{#1}%
}{%
	\endupm@taskdescription%
}

%-----
%\begin{taskdescription*}{id}...\end{taskdescription*}
\newenvironment{taskdescription*}[1]{%
	\@upm@task@displaydescriptionfalse%
	\upm@taskdescription{#1}%
}{%
	\endupm@taskdescription%
}

%-----
%\thetasksuper{id}
\newcommand{\thetasksuper}[1]{%
	\expandafter\providecommand\csname upm@task@#1@super\endcsname{??\@latex@warning{The task identified by '#1' was not found.}\@upm@task@rebuildtrue}%
	\expandafter\csname upm@task@#1@super\endcsname%
}

%-----
%\thetaskname{id}
\newcommand{\thetaskname}[1]{%
	\expandafter\providecommand\csname upm@task@#1@name\endcsname{??\@latex@warning{The task identified by '#1' was not found.}\@upm@task@rebuildtrue}%
	\expandafter\csname upm@task@#1@name\endcsname%
}

%-----
%\thetaskcomment{id}
\newcommand{\thetaskcomment}[1]{%
	\expandafter\providecommand\csname upm@task@#1@comment\endcsname{??\@latex@warning{The task identified by '#1' was not found.}\@upm@task@rebuildtrue}%
	\expandafter\csname upm@task@#1@comment\endcsname%
}

%-----
%\thetaskprogress{id}
\newcommand{\thetaskprogress}[1]{%
	\expandafter\providecommand\csname upm@task@#1@progress\endcsname{??\@latex@warning{The task identified by '#1' was not found.}\@upm@task@rebuildtrue}%
	\expandafter\csname upm@task@#1@progress\endcsname%
}

%-----
%\thetaskstart{id}
\newcommand{\thetaskstart}[1]{%
	\expandafter\providecommand\csname upm@task@#1@startat\endcsname{??\@latex@warning{The task identified by '#1' was not found.}\@upm@task@rebuildtrue}%
	\expandafter\csname upm@task@#1@startat\endcsname%
}

%-----
%\thetaskend{id}
\newcommand{\thetaskend}[1]{%
	\expandafter\providecommand\csname upm@task@#1@endat\endcsname{??\@latex@warning{The task identified by '#1' was not found.}\@upm@task@rebuildtrue}%
	\expandafter\csname upm@task@#1@endat\endcsname%
}

%-----
%\thetaskmanagers{id}
\newcommand{\thetaskmanagers}[1]{%
	\expandafter\providecommand\csname upm@task@#1@managers\endcsname{??\@latex@warning{The task identified by '#1' was not found.}\@upm@task@rebuildtrue}%
	\expandafter\csname upm@task@#1@managers\endcsname%
}

%-----
%\thetaskmembers{id}
\newcommand{\thetaskmembers}[1]{%
	\expandafter\providecommand\csname upm@task@#1@members\endcsname{??\@latex@warning{The task identified by '#1' was not found.}\@upm@task@rebuildtrue}%
	\expandafter\csname upm@task@#1@members\endcsname%
}

%-----
%\thetaskmilestones{id}
\newcommand{\thetaskmilestones}[1]{%
	\expandafter\providecommand\csname upm@task@#1@milestones\endcsname{??\@latex@warning{The task identified by '#1' was not found.}\@upm@task@rebuildtrue}%
	\expandafter\csname upm@task@#1@milestones\endcsname%
}

%-----
%\thetaskmilestonecomment{id}{date}
\newcommand{\thetaskmilestonecomment}[2]{%
	\expandafter\providecommand\csname upm@task@#1@ml@#2\endcsname{??\@latex@warning{The task milestone identified by '#1' and '#2' was not found.}\@upm@task@rebuildtrue}%
	\expandafter\csname upm@task@#1@ml@#2\endcsname%
}

\def\@upm@trim#1{#1}

%-----
%\thetaskdescription{id}
\newcommand{\thetaskdescription}[2][\linewidth]{%
	\ifthenelse{\equal{\csname upm@task@#2@members\endcsname}{\@empty}}{
		\gdef\upm@task@tmp@a{}%
	}{%
		\gdef\upm@task@tmp@a{\upm@task@lang@members: & \multicolumn{2}{X|}{\parbox[t]{1.9\linewidth}{\thetaskmembers{#2}}} \\}%
	}%
	\ifthenelse{\equal{\csname upm@task@#2@milestones\endcsname}{\@empty}}{
		\gdef\upm@task@tmp@b{}%
	}{%
		\gdef\upm@task@tmp@b{\hline \upm@task@lang@milestones: &%
		\multicolumn{2}{X|}{\parbox[t]{1.95\linewidth}{%
		\edef\upm@task@tmp@c{\csname upm@task@#2@milestones\endcsname}%
		\def\upm@task@tmp@e{}%
		\@for\reserved@a:=\upm@task@tmp@c\do{%
			\edef\upm@task@tmp@d{\expandafter\@upm@trim\reserved@a}%
			\protected@edef\upm@task@tmp@e{\upm@task@tmp@e \protect\item[\upm@task@tmp@d~:] \protect\thetaskmilestonecomment{#2}{\upm@task@tmp@d}}%
		}%
		\begin{description}\upm@task@tmp@e\end{description}%
		}} \\}%
	}%
	\vspace{.25cm}\noindent\begin{mtabular}[#1]{3}{|X|X|X|}
		\tabulartitle{{\upm@task@lang@task}~\textit{#2}: \thetaskname{#2}}
		\hline
		%description
		\upm@task@lang@description: & \multicolumn{2}{X|}{\parbox[t]{1.9\linewidth}{\thetaskcomment{#2}}} \\
		%sub-task
		\expandafter\ifx\csname upm@task@#2@super\endcsname\relax\else%
		\upm@task@lang@subtask: & \multicolumn{2}{X|}{\parbox[t]{1.9\linewidth}{{\upm@task@lang@task}~\textit{\csname upm@task@#2@super\endcsname}}} \\
		\fi
		\hline
		%dates
		\upm@task@lang@startat: & \upm@task@lang@endat: & \upm@task@lang@archieved: \\
		\thetaskstart{#2} & \thetaskend{#2} & \thetaskprogress{#2}\% \\
		\hline
		%manager
		\upm@task@lang@managers: & \multicolumn{2}{X|}{\parbox[t]{1.9\linewidth}{\thetaskmanagers{#2}}} \\
		%members
		\upm@task@tmp@a
		%milestones
		\upm@task@tmp@b
		%\@nameuse{upm@task@#1@description@milestones}
		\hline
	\end{mtabular}\par\vspace{.5cm}%
}

\AtEndDocument{%
	\if@upm@task@rebuild%
	\@latex@warning@no@line{Project Task(s) may have changed.\MessageBreak%
	Rerun to get cross-references right}\fi%

}
\endinput