summaryrefslogtreecommitdiff
path: root/plugins/TimeMachine/Template/analytic
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/TimeMachine/Template/analytic')
-rw-r--r--plugins/TimeMachine/Template/analytic/sidebar.php46
-rw-r--r--plugins/TimeMachine/Template/analytic/spent_time_by_dates.php100
-rw-r--r--plugins/TimeMachine/Template/analytic/time_comparison_by_categories.php84
-rw-r--r--plugins/TimeMachine/Template/analytic/time_comparison_by_swimlane.php84
4 files changed, 314 insertions, 0 deletions
diff --git a/plugins/TimeMachine/Template/analytic/sidebar.php b/plugins/TimeMachine/Template/analytic/sidebar.php
new file mode 100644
index 00000000..cc04bc1d
--- /dev/null
+++ b/plugins/TimeMachine/Template/analytic/sidebar.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ * Created by yvalentin.
+ * https://yohannvalentin.com
+ *
+ * Date: 12/11/18
+ */
+?>
+
+<li <?= $this->app->checkMenuSelection('AnalyticsTimesController', 'timeComparisonBySwimlane') ?>>
+ <?= $this->modal->replaceLink(
+ t('Estimated vs actual time / Swimlanes'),
+ 'AnalyticsTimesController',
+ 'timeComparisonBySwimlane',
+ array(
+ 'plugin' => 'TimeMachine',
+ 'project_id' => $project['id']
+ )
+ )
+ ?>
+</li>
+<li <?= $this->app->checkMenuSelection('AnalyticsTimesController', 'timeComparisonByCategories') ?>>
+ <?= $this->modal->replaceLink(
+ t('Estimated vs actual time / Categories'),
+ 'AnalyticsTimesController',
+ 'timeComparisonByCategories',
+ array(
+ 'plugin' => 'TimeMachine',
+ 'project_id' => $project['id']
+ )
+ )
+ ?>
+</li>
+<!--TODO check if project has automatic action: task.move.column - \Kanboard\Action\SubtaskTimerMoveTaskColumn -->
+<li <?= $this->app->checkMenuSelection('AnalyticsTimesController', 'timeComparisonByDates') ?>>
+ <?= $this->modal->replaceLink(
+ t('Spent time / Dates'),
+ 'AnalyticsTimesController',
+ 'timeComparisonByDates',
+ array(
+ 'plugin' => 'TimeMachine',
+ 'project_id' => $project['id']
+ )
+ )
+ ?>
+</li> \ No newline at end of file
diff --git a/plugins/TimeMachine/Template/analytic/spent_time_by_dates.php b/plugins/TimeMachine/Template/analytic/spent_time_by_dates.php
new file mode 100644
index 00000000..47fa657c
--- /dev/null
+++ b/plugins/TimeMachine/Template/analytic/spent_time_by_dates.php
@@ -0,0 +1,100 @@
+<?php if (! $is_ajax): ?>
+ <div class="page-header">
+ <h2><?= t('Spent time / Dates') ?></h2>
+ </div>
+<?php endif ?>
+
+<div class="panel">
+ <?php $spentTime['total'] = 0; $spentTime['open'] = 0; $spentTime['closed'] = 0; ?>
+ <?php foreach ($metrics as $taskId => $metric) : ?>
+ <?php $spentTime['total'] += $metric['open']['stt_time_spent'] + $metric['closed']['stt_time_spent']?>
+ <?php $spentTime['open'] += $metric['open']['stt_time_spent']?>
+ <?php $spentTime['closed'] += $metric['closed']['stt_time_spent']?>
+ <?php endforeach; ?>
+ <?= t('Total spent time / Dates')?> : <?= $from->format($userFormat) ?> -> <?= $to->format($userFormat) ?>
+ <ul>
+ <li>
+ <strong>
+ <?= $this->text->e($spentTime['total']) ?>
+ </strong>
+ <i>(<?=t('Open').' : '.$this->text->e($spentTime['open']) ?>
+ - <?= t('Closed').' : '.$spentTime['closed'] ?>)</i>
+ </li>
+ </ul>
+</div>
+
+<form method="post"
+ class="form-inline"
+ style="text-align: center"
+ action="<?= $this->url->href(
+ 'AnalyticsTimesController',
+ 'timeComparisonByDates',
+ array('plugin' => 'TimeMachine', 'project_id' => $project['id']))
+ ?>"
+ autocomplete="off">
+ <?= $this->form->csrf() ?>
+ <?php $values['from'] = $from->getTimestamp() ?>
+ <?php $values['to'] = $to->getTimestamp() ?>
+ <?= $this->form->date(t('Start date'), 'from', $values) ?>
+ <?= $this->form->date(t('End date'), 'to', $values) ?>
+ <?= $this->modal->submitButtons(array('submitLabel' => t('Execute'))) ?>
+</form>
+<?php if (empty($metrics)): ?>
+ <p class="alert"><?= t('Not enough data to show the graph.') ?></p>
+<?php else: ?>
+ <?php if ($paginator->isEmpty()): ?>
+ <p class="alert"><?= t('No tasks found.') ?></p>
+ <?php elseif (! $paginator->isEmpty()): ?>
+ <?= $this->app->component('chart-project-analytics-spent-time-by-dates', array(
+ 'metrics' => $spentTime,
+ 'labelSpent' => t('Hours Spent'),
+ 'labelClosed' => t('Closed'),
+ 'labelOpen' => t('Open'),
+ )) ?>
+ <table class="table-fixed table-small table-scrolling margin-top">
+ <tr>
+ <th class="column-5"><?= $paginator->order(t('Id'), 'tasks.id') ?></th>
+ <th class="column-8"><?= $paginator->order(t('Categories'), 'tasks.category_id') ?></th>
+ <th class="column-8"><?= $paginator->order(t('Swimlane'), 'tasks.swimlane_id') ?></th>
+ <th><?= $paginator->order(t('Title'), 'tasks.title') ?></th>
+ <th class="column-5"><?= $paginator->order(t('Status'), 'tasks.is_active') ?></th>
+ <th class="column-13"><?= t('Spent time / Dates')?></th>
+ <th class="column-9"><?= $paginator->order(t('Hours Spent'), 'tasks.time_spent') ?></th>
+ </tr>
+ <?php foreach ($paginator->getCollection() as $task): ?>
+ <?php if (array_key_exists($task['id'], $metrics)) : ?>
+ <tr>
+ <td class="task-table color-<?= $task['color_id'] ?>">
+ <?= $this->url->link('#'.$this->text->e($task['id']), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, '', t('View this task')) ?>
+ </td>
+ <td class="task-table category-<?= $task['category_id'] ?>">
+ <?= $this->text->e($categories[$task['category_id']]) ?>
+ </td>
+ <td class="task-table swimlane-<?= $task['swimlane_id'] ?>">
+ <?= $this->text->e($swimlanes[$task['swimlane_id']]) ?>
+ </td>
+ <td>
+ <?= $this->url->link($this->text->e($task['title']), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, '', t('View this task')) ?>
+ </td>
+ <td>
+ <?php if ($task['is_active'] == \Kanboard\Model\TaskModel::STATUS_OPEN): ?>
+ <?php $isActive = "open" ?>
+ <?= t('Open') ?>
+ <?php else: ?>
+ <?php $isActive = "closed" ?>
+ <?= t('Closed') ?>
+ <?php endif ?>
+ </td>
+ <td>
+ <?= $this->text->e($metrics[$task['id']][$isActive]['stt_time_spent']) ?>
+ </td>
+ <td>
+ <?= $this->text->e($metrics[$task['id']][$isActive]['time_spent']) ?>
+ </td>
+ </tr>
+ <?php endif; ?>
+ <?php endforeach ?>
+ </table>
+ <?= $paginator ?>
+ <?php endif ?>
+<?php endif ?>
diff --git a/plugins/TimeMachine/Template/analytic/time_comparison_by_categories.php b/plugins/TimeMachine/Template/analytic/time_comparison_by_categories.php
new file mode 100644
index 00000000..fc838374
--- /dev/null
+++ b/plugins/TimeMachine/Template/analytic/time_comparison_by_categories.php
@@ -0,0 +1,84 @@
+<?php if (! $is_ajax): ?>
+ <div class="page-header">
+ <h2><?= t('Estimated vs actual time / Categories') ?></h2>
+ </div>
+<?php endif ?>
+
+<div class="panel">
+ <?php foreach ($metrics as $categorieName => $metricByCategories) : ?>
+ <p><strong><?= $categorieName ?></strong></p>
+ <ul>
+ <li>
+ <?= t('Estimated hours: ') ?>
+ <strong>
+ <?= $this->text->e($metricByCategories['open']['time_estimated'] + $metricByCategories['closed']['time_estimated']) ?>
+ </strong>
+ <i>(<?=t('Open').' : '.$this->text->e($metricByCategories['open']['time_estimated']) ?>
+ - <?= t('Closed').' : '.$metricByCategories['closed']['time_estimated'] ?>)</i>
+ </li>
+ <li>
+ <?= t('Actual hours: ')?>
+ <strong>
+ <?= $this->text->e($metricByCategories['open']['time_spent'] + $metricByCategories['closed']['time_spent']) ?>
+ </strong>
+ <i>(<?=t('Open').' : '.$this->text->e($metricByCategories['open']['time_spent']) ?>
+ - <?= t('Closed').' : '.$metricByCategories['closed']['time_spent'] ?>)</i>
+ </li>
+ </ul>
+ <?php endforeach; ?>
+</div>
+
+<?php if (empty($metrics)): ?>
+ <p class="alert"><?= t('Not enough data to show the graph.') ?></p>
+<?php else: ?>
+ <?php if ($paginator->isEmpty()): ?>
+ <p class="alert"><?= t('No tasks found.') ?></p>
+ <?php elseif (! $paginator->isEmpty()): ?>
+ <?= $this->app->component('chart-project-analytics-time-comparison', array(
+ 'metrics' => $metrics,
+ 'labelSpent' => t('Hours Spent'),
+ 'labelEstimated' => t('Hours Estimated'),
+ 'labelClosed' => t('Closed'),
+ 'labelOpen' => t('Open'),
+ )) ?>
+
+ <table class="table-fixed table-small table-scrolling">
+ <tr>
+ <th class="column-5"><?= $paginator->order(t('Id'), 'tasks.id') ?></th>
+ <th class="column-8"><?= $paginator->order(t('Categories'), 'tasks.category_id') ?></th>
+ <th><?= $paginator->order(t('Title'), 'tasks.title') ?></th>
+ <th class="column-10"><?= $paginator->order(t('Status'), 'tasks.is_active') ?></th>
+ <th class="column-12"><?= $paginator->order(t('Estimated Time'), 'tasks.time_estimated') ?></th>
+ <th class="column-12"><?= $paginator->order(t('Actual Time'), 'tasks.time_spent') ?></th>
+ </tr>
+ <?php foreach ($paginator->getCollection() as $task): ?>
+ <tr>
+ <td class="task-table color-<?= $task['color_id'] ?>">
+ <?= $this->url->link('#'.$this->text->e($task['id']), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, '', t('View this task')) ?>
+ </td>
+ <td class="task-table swimlane-<?= $task['category_id'] ?>">
+ <?= $this->text->e($categories[$task['category_id']]) ?>
+ </td>
+ <td>
+ <?= $this->url->link($this->text->e($task['title']), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, '', t('View this task')) ?>
+ </td>
+ <td>
+ <?php if ($task['is_active'] == \Kanboard\Model\TaskModel::STATUS_OPEN): ?>
+ <?= t('Open') ?>
+ <?php else: ?>
+ <?= t('Closed') ?>
+ <?php endif ?>
+ </td>
+ <td>
+ <?= $this->text->e($task['time_estimated']) ?>
+ </td>
+ <td>
+ <?= $this->text->e($task['time_spent']) ?>
+ </td>
+ </tr>
+ <?php endforeach ?>
+ </table>
+
+ <?= $paginator ?>
+ <?php endif ?>
+<?php endif ?>
diff --git a/plugins/TimeMachine/Template/analytic/time_comparison_by_swimlane.php b/plugins/TimeMachine/Template/analytic/time_comparison_by_swimlane.php
new file mode 100644
index 00000000..95fd7a41
--- /dev/null
+++ b/plugins/TimeMachine/Template/analytic/time_comparison_by_swimlane.php
@@ -0,0 +1,84 @@
+<?php if (! $is_ajax): ?>
+ <div class="page-header">
+ <h2><?= t('Estimated vs actual time / Swimlanes') ?></h2>
+ </div>
+<?php endif ?>
+
+<div class="panel">
+ <?php foreach ($metrics as $swimlaneName => $metricBySwimlane) : ?>
+ <p><strong><?= $swimlaneName ?></strong></p>
+ <ul>
+ <li>
+ <?= t('Estimated hours: ') ?>
+ <strong>
+ <?= $this->text->e($metricBySwimlane['open']['time_estimated'] + $metricBySwimlane['closed']['time_estimated']) ?>
+ </strong>
+ <i>(<?=t('Open').' : '.$this->text->e($metricBySwimlane['open']['time_estimated']) ?>
+ - <?= t('Closed').' : '.$metricBySwimlane['closed']['time_estimated'] ?>)</i>
+ </li>
+ <li>
+ <?= t('Actual hours: ')?>
+ <strong>
+ <?= $this->text->e($metricBySwimlane['open']['time_spent'] + $metricBySwimlane['closed']['time_spent']) ?>
+ </strong>
+ <i>(<?=t('Open').' : '.$this->text->e($metricBySwimlane['open']['time_spent']) ?>
+ - <?= t('Closed').' : '.$metricBySwimlane['closed']['time_spent'] ?>)</i>
+ </li>
+ </ul>
+ <?php endforeach; ?>
+</div>
+
+<?php if (empty($metrics)): ?>
+ <p class="alert"><?= t('Not enough data to show the graph.') ?></p>
+<?php else: ?>
+ <?php if ($paginator->isEmpty()): ?>
+ <p class="alert"><?= t('No tasks found.') ?></p>
+ <?php elseif (! $paginator->isEmpty()): ?>
+ <?= $this->app->component('chart-project-analytics-time-comparison', array(
+ 'metrics' => $metrics,
+ 'labelSpent' => t('Hours Spent'),
+ 'labelEstimated' => t('Hours Estimated'),
+ 'labelClosed' => t('Closed'),
+ 'labelOpen' => t('Open'),
+ )) ?>
+
+ <table class="table-fixed table-small table-scrolling">
+ <tr>
+ <th class="column-5"><?= $paginator->order(t('Id'), 'tasks.id') ?></th>
+ <th class="column-8"><?= $paginator->order(t('Swimlane'), 'tasks.swimlane_id') ?></th>
+ <th><?= $paginator->order(t('Title'), 'tasks.title') ?></th>
+ <th class="column-10"><?= $paginator->order(t('Status'), 'tasks.is_active') ?></th>
+ <th class="column-12"><?= $paginator->order(t('Estimated Time'), 'tasks.time_estimated') ?></th>
+ <th class="column-12"><?= $paginator->order(t('Actual Time'), 'tasks.time_spent') ?></th>
+ </tr>
+ <?php foreach ($paginator->getCollection() as $task): ?>
+ <tr>
+ <td class="task-table color-<?= $task['color_id'] ?>">
+ <?= $this->url->link('#'.$this->text->e($task['id']), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, '', t('View this task')) ?>
+ </td>
+ <td class="task-table swimlane-<?= $task['swimlane_id'] ?>">
+ <?= $this->text->e($swimlanes[$task['swimlane_id']]) ?>
+ </td>
+ <td>
+ <?= $this->url->link($this->text->e($task['title']), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, '', t('View this task')) ?>
+ </td>
+ <td>
+ <?php if ($task['is_active'] == \Kanboard\Model\TaskModel::STATUS_OPEN): ?>
+ <?= t('Open') ?>
+ <?php else: ?>
+ <?= t('Closed') ?>
+ <?php endif ?>
+ </td>
+ <td>
+ <?= $this->text->e($task['time_estimated']) ?>
+ </td>
+ <td>
+ <?= $this->text->e($task['time_spent']) ?>
+ </td>
+ </tr>
+ <?php endforeach ?>
+ </table>
+
+ <?= $paginator ?>
+ <?php endif ?>
+<?php endif ?>