xref: /plugin/bez/ctl/start.php (revision 5b88664dd9ec005af8cd559699bb8f20766e1ba0)
1eb2e6be9SSzymon Olewniczak<?php
2eb2e6be9SSzymon Olewniczak/** @var action_plugin_bez $this */
3eb2e6be9SSzymon Olewniczak
4eb2e6be9SSzymon Olewniczakuse \dokuwiki\plugin\bez;
5eb2e6be9SSzymon Olewniczak
6eb2e6be9SSzymon Olewniczakif ($this->model->get_level() < BEZ_AUTH_USER) {
7eb2e6be9SSzymon Olewniczak    throw new bez\meta\PermissionDeniedException();
8eb2e6be9SSzymon Olewniczak}
9*5b88664dSSzymon Olewniczak
10*5b88664dSSzymon Olewniczak//activity
11*5b88664dSSzymon Olewniczak
12*5b88664dSSzymon Olewniczakclass Timeline {
13*5b88664dSSzymon Olewniczak    protected $timeline = array();
14*5b88664dSSzymon Olewniczak
15*5b88664dSSzymon Olewniczak    protected function datetime($iso8601) {
16*5b88664dSSzymon Olewniczak        $timestamp = strtotime($iso8601);
17*5b88664dSSzymon Olewniczak        $date = date('Y-m-d', $timestamp);
18*5b88664dSSzymon Olewniczak        $time = date('H:m', $timestamp);
19*5b88664dSSzymon Olewniczak
20*5b88664dSSzymon Olewniczak        return array($date, $time);
21*5b88664dSSzymon Olewniczak    }
22*5b88664dSSzymon Olewniczak
23*5b88664dSSzymon Olewniczak    public function push($datetime, $type, $author, $entity) {
24*5b88664dSSzymon Olewniczak        list($date, $time) = $this->datetime($datetime);
25*5b88664dSSzymon Olewniczak
26*5b88664dSSzymon Olewniczak        if (!isset($this->timeline[$date])) $timeline[$date] = array();
27*5b88664dSSzymon Olewniczak        $this->timeline[$date][] = array('time' => $time,
28*5b88664dSSzymon Olewniczak                                   'type' => $type,
29*5b88664dSSzymon Olewniczak                                   'author' => $author,
30*5b88664dSSzymon Olewniczak                                   'entity' => $entity);
31*5b88664dSSzymon Olewniczak    }
32*5b88664dSSzymon Olewniczak
33*5b88664dSSzymon Olewniczak    public function get_assoc() {
34*5b88664dSSzymon Olewniczak        //sort dates, iso8601 can be compared as strings
35*5b88664dSSzymon Olewniczak        krsort($this->timeline);
36*5b88664dSSzymon Olewniczak
37*5b88664dSSzymon Olewniczak        //sort times
38*5b88664dSSzymon Olewniczak        foreach ($this->timeline as &$elm) {
39*5b88664dSSzymon Olewniczak            usort($elm, function ($a, $b) {
40*5b88664dSSzymon Olewniczak                return -1 * strcmp($a['time'], $b['time']);
41*5b88664dSSzymon Olewniczak            });
42*5b88664dSSzymon Olewniczak        }
43*5b88664dSSzymon Olewniczak        return $this->timeline;
44*5b88664dSSzymon Olewniczak    }
45*5b88664dSSzymon Olewniczak}
46*5b88664dSSzymon Olewniczak
47*5b88664dSSzymon Olewniczak$month_earlier = date('c', strtotime('-1 month'));
48*5b88664dSSzymon Olewniczak$filter = array();
49*5b88664dSSzymon Olewniczak$filter['create_date'] = array('>=', $month_earlier, array('date'));
50*5b88664dSSzymon Olewniczak$threads = $this->model->threadFactory->get_all($filter, 'create_date DESC');
51*5b88664dSSzymon Olewniczak$thread_comments = $this->model->thread_commentFactory->get_all($filter, 'create_date DESC');
52*5b88664dSSzymon Olewniczak$tasks = $this->model->taskFactory->get_all($filter, 'create_date DESC');
53*5b88664dSSzymon Olewniczak$task_comments = $this->model->task_commentFactory->get_all($filter, 'create_date DESC');
54*5b88664dSSzymon Olewniczak
55*5b88664dSSzymon Olewniczak$timeline = new Timeline();
56*5b88664dSSzymon Olewniczakforeach ($threads as $thread) {
57*5b88664dSSzymon Olewniczak    if ($thread->acl_of('id') < BEZ_PERMISSION_VIEW) continue;
58*5b88664dSSzymon Olewniczak
59*5b88664dSSzymon Olewniczak    $project = '';
60*5b88664dSSzymon Olewniczak    if ($thread->type == 'project') {
61*5b88664dSSzymon Olewniczak        $project = '_project';
62*5b88664dSSzymon Olewniczak    }
63*5b88664dSSzymon Olewniczak
64*5b88664dSSzymon Olewniczak    if ($thread->state == 'proposal') {
65*5b88664dSSzymon Olewniczak        $timeline->push($thread->create_date, 'thread_proposal' . $project, $thread->original_poster, $thread);
66*5b88664dSSzymon Olewniczak    } else {
67*5b88664dSSzymon Olewniczak        $timeline->push($thread->create_date, 'thread_opened' . $project, $thread->coordinator, $thread);
68*5b88664dSSzymon Olewniczak    }
69*5b88664dSSzymon Olewniczak
70*5b88664dSSzymon Olewniczak    if ($thread->state == 'done') {
71*5b88664dSSzymon Olewniczak        $timeline->push($thread->last_activity_date, 'thread_done' . $project, $thread->coordinator, $thread);
72*5b88664dSSzymon Olewniczak    } elseif ($thread->state == 'closed') {
73*5b88664dSSzymon Olewniczak        $timeline->push($thread->last_activity_date, 'thread_closed' . $project, $thread->coordinator, $thread);
74*5b88664dSSzymon Olewniczak    } elseif ($thread->state == 'rejected') {
75*5b88664dSSzymon Olewniczak        $timeline->push($thread->last_activity_date, 'thread_rejected' . $project, $thread->coordinator, $thread);
76*5b88664dSSzymon Olewniczak    }
77*5b88664dSSzymon Olewniczak}
78*5b88664dSSzymon Olewniczak
79*5b88664dSSzymon Olewniczakforeach ($thread_comments as $thread_comment) {
80*5b88664dSSzymon Olewniczak    if ($thread_comment->thread->acl_of('id') < BEZ_PERMISSION_VIEW) continue;
81*5b88664dSSzymon Olewniczak
82*5b88664dSSzymon Olewniczak    if ($thread_comment->type == 'comment') {
83*5b88664dSSzymon Olewniczak        $timeline->push($thread_comment->create_date, 'thread_comment_added', $thread_comment->author, $thread_comment);
84*5b88664dSSzymon Olewniczak    } else {
85*5b88664dSSzymon Olewniczak        $timeline->push($thread_comment->create_date, 'thread_comment_cause_added', $thread_comment->author, $thread_comment);
86*5b88664dSSzymon Olewniczak    }
87*5b88664dSSzymon Olewniczak}
88*5b88664dSSzymon Olewniczak
89*5b88664dSSzymon Olewniczakforeach ($tasks as $task) {
90*5b88664dSSzymon Olewniczak    if ($task->acl_of('id') < BEZ_PERMISSION_VIEW) continue;
91*5b88664dSSzymon Olewniczak
92*5b88664dSSzymon Olewniczak    $timeline->push($task->create_date, 'task_opened', $task->assignee, $task);
93*5b88664dSSzymon Olewniczak
94*5b88664dSSzymon Olewniczak    if ($task->state == 'done') {
95*5b88664dSSzymon Olewniczak        $timeline->push($task->last_activity_date, 'task_done', $task->assignee, $task);
96*5b88664dSSzymon Olewniczak    }
97*5b88664dSSzymon Olewniczak}
98*5b88664dSSzymon Olewniczak
99*5b88664dSSzymon Olewniczakforeach ($task_comments as $task_comment) {
100*5b88664dSSzymon Olewniczak    if ($task_comment->task->acl_of('id') < BEZ_PERMISSION_VIEW) continue;
101*5b88664dSSzymon Olewniczak
102*5b88664dSSzymon Olewniczak    $timeline->push($task_comment->create_date, 'task_comment_added', $task_comment->author, $task_comment);
103*5b88664dSSzymon Olewniczak}
104*5b88664dSSzymon Olewniczak
105*5b88664dSSzymon Olewniczak$this->tpl->set('timeline', $timeline->get_assoc());
106*5b88664dSSzymon Olewniczak
107a5de966aSSzymon Olewniczak$orderby = array('sort', 'priority DESC', 'create_date DESC');
108eb2e6be9SSzymon Olewniczak$filter = array('state' => 'proposal');
109a5de966aSSzymon Olewniczak$proposals = $this->model->threadFactory->get_all($filter, $orderby);
110eb2e6be9SSzymon Olewniczak$this->tpl->set('proposals', $proposals);
111eb2e6be9SSzymon Olewniczak$this->tpl->set('proposals_count', $this->model->threadFactory->count($filter));
112eb2e6be9SSzymon Olewniczak
113a5de966aSSzymon Olewniczak$orderby = array('sort', 'priority DESC', 'create_date DESC');
114eb2e6be9SSzymon Olewniczak$filter = array('state' => 'opened', 'coordinator' => $this->model->user_nick);
115a5de966aSSzymon Olewniczak$my_threads = $this->model->threadFactory->get_all($filter, $orderby);
116eb2e6be9SSzymon Olewniczak$this->tpl->set('my_threads', $my_threads);
117eb2e6be9SSzymon Olewniczak$this->tpl->set('my_threads_count', $this->model->threadFactory->count($filter));
118eb2e6be9SSzymon Olewniczak
119a5de966aSSzymon Olewniczak$orderby = array('priority DESC', 'plan_date');
120eb2e6be9SSzymon Olewniczak$filter = array('state' => 'opened', 'assignee' => $this->model->user_nick);
121a5de966aSSzymon Olewniczak$my_tasks = $this->model->taskFactory->get_all($filter, $orderby);
122eb2e6be9SSzymon Olewniczak$this->tpl->set('my_tasks', $my_tasks);
123eb2e6be9SSzymon Olewniczak$this->tpl->set('my_tasks_count', $this->model->taskFactory->count($filter));
124eb2e6be9SSzymon Olewniczak
125a5de966aSSzymon Olewniczak$orderby = array('sort', 'priority DESC', 'create_date DESC');
126eb2e6be9SSzymon Olewniczak$filter = array('state' => 'opened', 'original_poster' => $this->model->user_nick);
127a5de966aSSzymon Olewniczak$reported_threads = $this->model->threadFactory->get_all($filter, $orderby);
128eb2e6be9SSzymon Olewniczak$this->tpl->set('reported_threads', $reported_threads);
129eb2e6be9SSzymon Olewniczak$this->tpl->set('reported_threads_count', $this->model->threadFactory->count($filter));
130eb2e6be9SSzymon Olewniczak
131a5de966aSSzymon Olewniczak$orderby = array('priority DESC', 'plan_date');
132eb2e6be9SSzymon Olewniczak$filter = array('state' => 'opened', 'original_poster' => $this->model->user_nick);
133a5de966aSSzymon Olewniczak$reported_tasks = $this->model->taskFactory->get_all($filter, $orderby);
134eb2e6be9SSzymon Olewniczak$this->tpl->set('reported_tasks', $reported_tasks);
135eb2e6be9SSzymon Olewniczak$this->tpl->set('reported_tasks_count', $this->model->taskFactory->count($filter));
136eb2e6be9SSzymon Olewniczak
137