Feature: scheduled date

- Supports 'scheduled' date for tasks, which represent the earliest opportunity
  to work on a task.
- Added unit tests for urgency.
- Implemented color rule.
- Added scheduled to 'info' report.
- Updated assorted documentation.
- Removed comments in default rc because they are never seen.
- Added (broken) 'ready' report, which is like 'next' but only for ready tasks.
This commit is contained in:
Paul Beckingham 2012-05-13 17:19:22 -04:00
parent d08f189769
commit 98f215b1b5
17 changed files with 308 additions and 91 deletions

View file

@ -53,6 +53,7 @@ static std::map <std::string, float> coefficients;
float urgencyPriorityCoefficient = 0.0;
float urgencyProjectCoefficient = 0.0;
float urgencyActiveCoefficient = 0.0;
float urgencyScheduledCoefficient = 0.0;
float urgencyWaitingCoefficient = 0.0;
float urgencyBlockedCoefficient = 0.0;
float urgencyAnnotationsCoefficient = 0.0;
@ -74,6 +75,7 @@ void initializeUrgencyCoefficients ()
urgencyPriorityCoefficient = context.config.getReal ("urgency.priority.coefficient");
urgencyProjectCoefficient = context.config.getReal ("urgency.project.coefficient");
urgencyActiveCoefficient = context.config.getReal ("urgency.active.coefficient");
urgencyScheduledCoefficient = context.config.getReal ("urgency.scheduled.coefficient");
urgencyWaitingCoefficient = context.config.getReal ("urgency.waiting.coefficient");
urgencyBlockedCoefficient = context.config.getReal ("urgency.blocked.coefficient");
urgencyAnnotationsCoefficient = context.config.getReal ("urgency.annotations.coefficient");
@ -1131,35 +1133,14 @@ void Task::validate ()
// 2) To provide suitable warnings about odd states
// When a task has a due date, other dates should conform.
if (has ("due"))
{
Date due (get_date ("due"));
// Verify wait < due
if (has ("wait"))
{
Date wait (get_date ("wait"));
if (wait > due)
context.footnote (STRING_TASK_VALID_WAIT);
}
Date entry (get_date ("entry"));
if (has ("start"))
{
Date start (get_date ("start"));
if (entry > start)
context.footnote (STRING_TASK_VALID_START);
}
if (has ("end"))
{
Date end (get_date ("end"));
if (entry > end)
context.footnote (STRING_TASK_VALID_END);
}
}
// Date relationships.
validate_before ("wait", "due");
validate_before ("entry", "start");
validate_before ("entry", "end");
validate_before ("wait", "scheduled");
validate_before ("scheduled", "start");
validate_before ("scheduled", "due");
validate_before ("scheduled", "end");
// 3) To generate errors when the inconsistencies are not fixable
@ -1196,6 +1177,19 @@ void Task::validate ()
}
}
void Task::validate_before (const std::string& left, const std::string& right)
{
if (has (left) &&
has (right))
{
Date date_left (get_date (left));
Date date_right (get_date (right));
if (date_left > date_right)
context.footnote (format (STRING_TASK_VALID_BEFORE, left, right));
}
}
////////////////////////////////////////////////////////////////////////////////
int Task::determineVersion (const std::string& line)
{
@ -1290,6 +1284,7 @@ float Task::urgency_c () const
value += fabsf (urgencyPriorityCoefficient) > epsilon ? (urgency_priority () * urgencyPriorityCoefficient) : 0.0;
value += fabsf (urgencyProjectCoefficient) > epsilon ? (urgency_project () * urgencyProjectCoefficient) : 0.0;
value += fabsf (urgencyActiveCoefficient) > epsilon ? (urgency_active () * urgencyActiveCoefficient) : 0.0;
value += fabsf (urgencyScheduledCoefficient) > epsilon ? (urgency_scheduled () * urgencyScheduledCoefficient) : 0.0;
value += fabsf (urgencyWaitingCoefficient) > epsilon ? (urgency_waiting () * urgencyWaitingCoefficient) : 0.0;
value += fabsf (urgencyBlockedCoefficient) > epsilon ? (urgency_blocked () * urgencyBlockedCoefficient) : 0.0;
value += fabsf (urgencyAnnotationsCoefficient) > epsilon ? (urgency_annotations () * urgencyAnnotationsCoefficient) : 0.0;
@ -1305,6 +1300,7 @@ float Task::urgency_c () const
<< "# pri " << (urgency_priority () * urgencyPriorityCoefficient)
<< "# pro " << (urgency_project () * urgencyProjectCoefficient)
<< "# act " << (urgency_active () * urgencyActiveCoefficient)
<< "# sch " << (urgency_scheduled () * urgencyScheduledCoefficient)
<< "# wai " << (urgency_waiting () * urgencyWaitingCoefficient)
<< "# blk " << (urgency_blocked () * urgencyBlockedCoefficient)
<< "# ann " << (urgency_annotations () * urgencyAnnotationsCoefficient)
@ -1394,6 +1390,16 @@ float Task::urgency_active () const
return 0.0;
}
////////////////////////////////////////////////////////////////////////////////
float Task::urgency_scheduled () const
{
if (has ("scheduled") &&
get_date ("scheduled") < time (NULL))
return 1.0;
return 0.0;
}
////////////////////////////////////////////////////////////////////////////////
float Task::urgency_waiting () const
{