Exemplo n.º 1
0
 /**
  * Returns an array containing the open, started and closed ticket count queries.
  *
  * @return array
  */
 protected function getTicketCountQueries()
 {
     // Open ticket count
     $openQuery = Ticket::select('COUNT(t.id)')->where('t.milestone_id = m.id')->andWhere('t.is_closed = :open_count_is_closed');
     // Started ticket count
     $startedQuery = Ticket::select('COUNT(t.id)')->where('t.milestone_id = m.id')->andWhere('s.status = 2')->leftJoin('t', Status::tableName(), 's', 's.id = t.status_id');
     // Closed query count
     $closedQuery = Ticket::select('COUNT(t.id)')->where('t.milestone_id = m.id')->andWhere('t.is_closed = :closed_count_is_closed');
     return [$openQuery, $startedQuery, $closedQuery];
 }
Exemplo n.º 2
0
 /**
  * Project changelog.
  */
 public function changelogAction()
 {
     $this->addCrumb($this->translate('changelog'), $this->generateUrl('changelog'));
     $types = [];
     $milestones = [];
     // Get milestones
     $milestonesQuery = $this->currentProject->milestones()->select('id', 'name', 'slug')->where('status = 2')->orderBy('display_order', 'DESC')->fetchAll();
     foreach ($milestonesQuery as $milestone) {
         $milestones[$milestone['id']] = ['name' => $milestone['name'], 'slug' => $milestone['slug'], 'tickets' => []];
     }
     // Get tickets
     if (count($milestones)) {
         $tickets = $this->currentProject->tickets()->select('t.ticket_id', 't.summary', 't.milestone_id', 'status.id AS status_id', 'status.name AS status_name', 'status.show_on_changelog AS status_show_on_changelog', 'type.id AS type_id', 'type.name AS type_name', 'type.bullet AS type_bullet', 'type.show_on_changelog AS type_show_on_changelog');
         // Left join the status and types values
         $tickets->leftJoin('t', Status::tableName(), 'status', 'status.id = t.status_id');
         $tickets->leftJoin('t', Type::tableName(), 'type', 'type.id = t.type_id');
         // Filter by closed and milestones
         $tickets->where('is_closed = :is_closed')->andWhere($tickets->expr()->in('milestone_id', array_keys($milestones)))->orderBy('type_bullet', 'ASC');
         $tickets->setParameter('is_closed', true, 'boolean');
         foreach ($tickets->fetchAll() as $ticket) {
             $ticketInfo = ['ticket_id' => $ticket['ticket_id'], 'summary' => $ticket['summary'], 'type_id' => $ticket['type_id'], 'type_name' => $ticket['type_name'], 'status_id' => $ticket['status_id'], 'status_name' => $ticket['status_name']];
             // Add types
             if (!isset($types[$ticket['type_id']])) {
                 $types[$ticket['type_id']] = ['id' => $ticket['type_id'], 'name' => $ticket['type_name'], 'bullet' => $ticket['type_bullet']];
             }
             if ($ticket['status_show_on_changelog'] && $ticket['type_show_on_changelog']) {
                 $milestones[$ticket['milestone_id']]['tickets'][] = $ticketInfo;
             }
         }
     }
     // And now we get an array without the milestone ID's as the index.
     $milestones = array_values($milestones);
     return $this->respondTo(function ($format) use($types, $milestones) {
         if ($format == 'html') {
             return $this->render('projects/changelog.phtml', ['types' => $types, 'milestones' => $milestones]);
         } elseif ($format == 'json') {
             return $this->jsonResponse($milestones);
         } elseif ($format == 'txt') {
             return $this->render('projects/changelog.txt.php', ['types' => $types, 'milestones' => $milestones]);
         }
     });
 }