done_fixed_for_several_levels_of_subtasks.diff

C-O L, 2016-10-30 22:31

Download (2.17 KB)

View differences:

app/models/issue.rb
1549 1549
        unless Issue.use_status_for_done_ratio? && p.status && p.status.default_done_ratio
1550 1550
          child_count = p.children.count
1551 1551
          if child_count > 0
1552
            average = p.children.where("estimated_hours > 0").average(:estimated_hours).to_f
1553
            if average == 0
1554
              average = 1
1552
            # Calculate the average hours for all child tasks using the childrens total_estimated_hours.
1553
            sum = 0
1554
            p.children.each do |child|
1555
              sum += child.total_estimated_hours
1555 1556
            end
1556
            done = p.children.joins(:status).
1557
              sum("COALESCE(CASE WHEN estimated_hours > 0 THEN estimated_hours ELSE NULL END, #{average}) " +
1558
                  "* (CASE WHEN is_closed = #{self.class.connection.quoted_true} THEN 100 ELSE COALESCE(done_ratio, 0) END)").to_f
1559
            progress = done / (average * child_count)
1557
            if sum == 0
1558
              average_hours = 1
1559
            else
1560
              average_hours = sum / child_count
1561
            end
1562

  
1563
            # Calculate the total work done for the children
1564
            # Each child contribute to the total work with its total_estimate_hours multiplied
1565
            # by its done_ratio or 100 if the child is closed.
1566
            # If the childs total_estiamted_hours is zero then use the average_hours for
1567
            # that child.
1568
            done = 0
1569
            p.children.each do |child|
1570
              child_hours = child.total_estimated_hours
1571
              if child_hours == 0 then
1572
                child_hours = average_hours
1573
              end
1574
              # calculate the contribution to done for the child
1575
              if child.closed? then
1576
                done += child_hours * 100
1577
              else
1578
                done += child_hours * child.done_ratio
1579
              end
1580
            end
1581

  
1582
            # Calculate the progress
1583
            progress = done / (average_hours * child_count)
1560 1584
            p.done_ratio = progress.round
1561 1585
          end
1562 1586
        end