00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
#include <qdatetime.h>
00026
#include <qpaintdevicemetrics.h>
00027
#include <qpainter.h>
00028
#include <qmap.h>
00029
00030
#include <kglobal.h>
00031
#include <kdebug.h>
00032
#include <klocale.h>
00033
#include <event.h>
00034
00035
#include "karmutility.h"
00036
#include "timekard.h"
00037
#include "task.h"
00038
#include "taskview.h"
00039
00040
const int taskWidth = 40;
00041
const int timeWidth = 6;
00042
const int totalTimeWidth = 7;
00043
const int reportWidth = taskWidth + timeWidth;
00044
const int weekReportWidth = taskWidth + (7 * timeWidth) + totalTimeWidth;
00045
00046
const QString cr = QString::fromLatin1(
"\n");
00047
00048 QString
TimeKard::totalsAsText(
TaskView* taskview,
bool justThisTask)
00049 {
00050 QString retval;
00051 QString taskhdr, totalhdr;
00052 QString line;
00053 QString buf;
00054
long sum;
00055
00056 line.fill(
'-', reportWidth);
00057 line += cr;
00058
00059
00060 retval += i18n(
"Task Totals") + cr;
00061 retval += KGlobal::locale()->formatDateTime(QDateTime::currentDateTime());
00062 retval += cr + cr;
00063 retval += QString(QString::fromLatin1(
"%1 %2"))
00064 .arg(i18n(
"Time"), timeWidth)
00065 .arg(i18n(
"Task"));
00066 retval += cr;
00067 retval += line;
00068
00069
00070
if (taskview->
current_item())
00071 {
00072
if (justThisTask)
00073 {
00074
00075 sum = taskview->
current_item()->
totalTime();
00076 printTask(taskview->
current_item(), retval, 0);
00077 }
00078
else
00079 {
00080 sum = 0;
00081
for (
Task* task= taskview->
current_item(); task;
00082 task= task->
nextSibling())
00083 {
00084 sum += task->
totalTime();
00085 printTask(task, retval, 0);
00086 }
00087 }
00088
00089
00090 buf.fill(
'-', reportWidth);
00091 retval += QString(QString::fromLatin1(
"%1")).arg(buf, timeWidth) + cr;
00092 retval += QString(QString::fromLatin1(
"%1 %2"))
00093 .arg(formatTime(sum),timeWidth)
00094 .arg(i18n(
"Total"));
00095 }
00096
else
00097 retval += i18n(
"No tasks!");
00098
00099
return retval;
00100 }
00101
00102
void TimeKard::printTask(
Task *task, QString &s,
int level)
00103 {
00104 QString buf;
00105
00106 s += buf.fill(
' ', level);
00107 s += QString(QString::fromLatin1(
"%1 %2"))
00108 .arg(formatTime(task->
totalTime()), timeWidth)
00109 .arg(task->
name());
00110 s += cr;
00111
00112
for (
Task* subTask = task->
firstChild();
00113 subTask;
00114 subTask = subTask->
nextSibling())
00115 {
00116 printTask(subTask, s, level+1);
00117 }
00118 }
00119
00120
void TimeKard::printWeekTask(
const Task *task,
00121
const QMap<QString,long>& taskdaytotals,
00122 QMap<QString,long>& daytotals,
00123
const Week& week,
const int level, QString& s)
00124 {
00125 QString buf;
00126 QString daytaskkey, daykey;
00127 QDate day;
00128
long weeksum;
00129
00130 day = week.
start();
00131 weeksum = 0;
00132
for (
int i = 0; i < 7; i++)
00133 {
00134 daykey = day.toString(QString::fromLatin1(
"yyyyMMdd"));
00135 daytaskkey = QString::fromLatin1(
"%1_%2")
00136 .arg(daykey)
00137 .arg(task->
uid());
00138
00139
if (taskdaytotals.contains(daytaskkey))
00140 {
00141 s += QString::fromLatin1(
"%1")
00142 .arg(formatTime(taskdaytotals[daytaskkey]/60), timeWidth);
00143 weeksum += taskdaytotals[daytaskkey];
00144
00145
if (daytotals.contains(daykey))
00146 daytotals.replace(daykey, daytotals[daykey] + taskdaytotals[daytaskkey]);
00147
else
00148 daytotals.insert(daykey, taskdaytotals[daytaskkey]);
00149 }
00150
else
00151 {
00152 buf.fill(
' ', timeWidth);
00153 s += buf;
00154 }
00155
00156 day = day.addDays(1);
00157 }
00158
00159
00160 s += QString::fromLatin1(
"%1").arg(formatTime(weeksum/60), totalTimeWidth);
00161
00162
00163 s += buf.fill(
' ', level + 1);
00164 s += QString::fromLatin1(
"%1").arg(task->
name());
00165 s += cr;
00166
00167
for (
Task* subTask = task->
firstChild();
00168 subTask;
00169 subTask = subTask->
nextSibling())
00170 {
00171 printWeekTask(subTask, taskdaytotals, daytotals, week, level+1, s);
00172 }
00173 }
00174
00175 QString
TimeKard::historyAsText(
TaskView* taskview,
const QDate& from,
00176
const QDate& to,
bool justThisTask)
00177 {
00178 QString retval;
00179 QString taskhdr, totalhdr;
00180 QString line, buf;
00181
long sum;
00182
00183 QValueList<Week>::iterator week;
00184 QValueList<HistoryEvent> events;
00185 QValueList<HistoryEvent>::iterator event;
00186 QMap<QString, long> taskdaytotals;
00187 QMap<QString, long> daytotals;
00188 QString daytaskkey, daykey;
00189 QDate day;
00190
00191 line.fill(
'-', weekReportWidth);
00192 line += cr;
00193
00194
00195 retval += i18n(
"Task History") + cr;
00196 retval += i18n(
"From %1 to %2")
00197 .arg(KGlobal::locale()->formatDate(from))
00198 .arg(KGlobal::locale()->formatDate(to));
00199 retval += cr;
00200 retval += i18n(
"Printed on: %1")
00201 .arg(KGlobal::locale()->formatDateTime(QDateTime::currentDateTime()));
00202
00203
00204 QValueList<Week> weeks = Week::weeksFromDateRange(from, to);
00205
for (week = weeks.begin(); week != weeks.end(); ++week)
00206 {
00207
if ( (*week).start() < from && (*week).end() > to)
00208 {
00209 events = taskview->
getHistory(from, to);
00210 }
00211
else if ( (*week).start() < from )
00212 {
00213 events = taskview->
getHistory(from, (*week).end());
00214 }
00215
else if ( (*week).end() > to)
00216 {
00217 events = taskview->
getHistory((*week).start(), to);
00218 }
00219
else
00220 {
00221 events = taskview->
getHistory((*week).start(), (*week).end());
00222 }
00223
00224 taskdaytotals.clear();
00225 daytotals.clear();
00226
00227
00228
00229
00230
00231
00232
for (event = events.begin(); event != events.end(); ++event)
00233 {
00234 daykey = (*event).start().date().toString(QString::fromLatin1(
"yyyyMMdd"));
00235 daytaskkey = QString(QString::fromLatin1(
"%1_%2"))
00236 .arg(daykey)
00237 .arg((*event).todoUid());
00238
00239
if (taskdaytotals.contains(daytaskkey))
00240 taskdaytotals.replace(daytaskkey,
00241 taskdaytotals[daytaskkey] + (*event).duration());
00242
else
00243 taskdaytotals.insert(daytaskkey, (*event).duration());
00244 }
00245
00246
00247 retval += cr + cr;
00248 buf.fill(
' ',
int((weekReportWidth - (*week).name().length()) / 2));
00249 retval += buf + (*week).name() + cr;
00250
00251
00252
for (
int i = 0; i < 7; i++)
00253 {
00254 retval += QString::fromLatin1(
"%1")
00255 .arg((*week).start().addDays(i).day(), timeWidth);
00256 }
00257 retval += cr;
00258 retval += line;
00259
00260
00261
if (events.empty())
00262 {
00263 retval += i18n(
" No hours logged.");
00264 }
00265
else
00266 {
00267 sum = 0;
00268
if (justThisTask)
00269 {
00270 printWeekTask(taskview->
current_item(), taskdaytotals, daytotals,
00271 (*week), 0, retval);
00272 }
00273
else
00274 {
00275
for (
Task* task= taskview->
current_item(); task;
00276 task= task->
nextSibling())
00277 {
00278 printWeekTask(task, taskdaytotals, daytotals, (*week), 0, retval);
00279 }
00280 }
00281 retval += line;
00282
00283
00284 sum = 0;
00285 day = (*week).start();
00286
for (
int i = 0; i < 7; i++)
00287 {
00288 daykey = day.toString(QString::fromLatin1(
"yyyyMMdd"));
00289
00290
if (daytotals.contains(daykey))
00291 {
00292 retval += QString::fromLatin1(
"%1")
00293 .arg(formatTime(daytotals[daykey]/60), timeWidth);
00294 sum += daytotals[daykey];
00295 }
00296
else
00297 {
00298 buf.fill(
' ', timeWidth);
00299 retval += buf;
00300 }
00301
00302 day = day.addDays(1);
00303 }
00304
00305 retval += QString::fromLatin1(
"%1 %2")
00306 .arg(formatTime(sum/60), totalTimeWidth)
00307 .arg(i18n(
"Total"));
00308 }
00309 }
00310
return retval;
00311 }
00312
00313 Week::Week() {}
00314
00315
Week::Week(QDate from)
00316 {
00317 _start = from;
00318 }
00319
00320 QDate Week::start()
const
00321
{
00322
return _start;
00323 }
00324
00325 QDate Week::end()
const
00326
{
00327
return _start.addDays(7);
00328 }
00329
00330 QString
Week::name()
const
00331
{
00332
return QString(i18n(
"Week of %1"))
00333 .arg(KGlobal::locale()->formatDate(start()));
00334 }
00335
00336 QValueList<Week>
Week::weeksFromDateRange(
const QDate& from,
const QDate& to)
00337 {
00338 QDate start;
00339 QValueList<Week> weeks;
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351 start = from.addDays(
00352 -((7 - KGlobal::locale()->weekStartDay() + from.dayOfWeek()) % 7));
00353
00354
for (QDate d = start; d <= to; d = d.addDays(7))
00355 weeks.append(
Week(d));
00356
00357
return weeks;
00358 }
00359