Skip to content

Commit b420b47

Browse files
authored
Merging pull request #175 from fga-gpp-mds/US21_manter_nota
2 parents edd1d32 + 88ef72c commit b420b47

24 files changed

+1057
-78
lines changed

app/controllers/grades_controller.rb

+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
class GradesController < ApplicationController
2+
include MetricHelper
3+
4+
before_action :set_grade, only: [:show, :update, :destroy]
5+
6+
before_action only: [:index, :create] do
7+
validate_project(0, :project_id)
8+
end
9+
10+
before_action only: [:show, :update] do
11+
validate_grade(:id, 0)
12+
end
13+
14+
def index
15+
grade = @project.grade
16+
render json: grade
17+
end
18+
19+
def create
20+
if @project.grade.blank?
21+
grade = Grade.new(grade_params)
22+
grade.project = @project
23+
24+
if grade.save
25+
render json: grade, status: :created
26+
else
27+
render json: grade.errors, status: :unprocessable_entity
28+
end
29+
else
30+
render json: @project.grade
31+
end
32+
end
33+
34+
def update
35+
if @grade.update(grade_params)
36+
render json: @grade
37+
else
38+
render json: @grade.errors, status: :unprocessable_entity
39+
end
40+
end
41+
42+
def show
43+
final_metric = get_metrics(@grade)
44+
render json: final_metric
45+
end
46+
47+
def destroy
48+
@grade.destroy
49+
end
50+
51+
private
52+
def grade_params
53+
params.require(:grade).permit(:weight_debts, :weight_velocity, :weight_burndown)
54+
end
55+
56+
def set_grade
57+
@grade = Grade.find(params[:id])
58+
end
59+
end

app/controllers/sprints_controller.rb

+9-31
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
class SprintsController < ApplicationController
22
include ValidationsHelper
33
include VelocityHelper
4+
include BurndownHelper
5+
include MetricHelper
46

57
before_action :set_sprint, only: [:show, :update, :destroy, :get_burndown]
68

79
before_action only: [:index, :create] do
810
validate_release(0, :release_id)
911
end
1012

11-
before_action only: [:show, :update, :destroy, :get_velocity] do
13+
before_action only: [:show, :update, :destroy, :get_velocity, :get_metrics] do
1214
validate_sprint(:id, 0)
1315
end
1416

@@ -68,45 +70,21 @@ def get_velocity
6870

6971
def get_burndown
7072
project = @sprint.release.project
71-
if project.is_scoring != false
72-
total_points = 0
73+
if project.is_scoring == true
7374
burned_stories = {}
7475
coordenates = []
7576
date_axis = []
7677
points_axis = []
7778
ideal_line = []
7879

79-
for story in @sprint.stories
80-
total_points += story.story_points
80+
total_points = get_total_points(@sprint)
81+
burned_stories = get_burned_points(@sprint, burned_stories)
8182

82-
if story.pipeline == "Done"
83-
if burned_stories[story.final_date] == nil
84-
burned_stories[story.final_date] = story.story_points
85-
else
86-
burned_stories[story.final_date] += story.story_points
87-
end
88-
end
89-
end
90-
planned_points = total_points
91-
92-
range = (@sprint.initial_date .. @sprint.final_date)
93-
range.each do |date|
94-
95-
if burned_stories[date] == nil
96-
burned_stories[date] = total_points
97-
else
98-
total_points -= burned_stories[date]
99-
burned_stories[date] = total_points
100-
end
101-
date_axis.push(date)
102-
points_axis.push(burned_stories[date])
103-
end
83+
range_dates = (@sprint.initial_date .. @sprint.final_date)
10484

85+
set_dates_and_points(burned_stories, date_axis, points_axis, range_dates, total_points)
10586
days_of_sprint = date_axis.length - 1
106-
107-
for day in (days_of_sprint).downto(0)
108-
ideal_line.push(planned_points * (day / (Float days_of_sprint)))
109-
end
87+
set_ideal_line(days_of_sprint, ideal_line, total_points)
11088

11189
coordenates = { x: date_axis, y: points_axis, ideal_line: ideal_line }
11290

app/controllers/stories_controller.rb

+9-9
Original file line numberDiff line numberDiff line change
@@ -19,27 +19,27 @@ def index
1919
end
2020

2121
def to_do_list
22-
sprint = Sprint.find(params[:id])
22+
@sprint = Sprint.find(params[:id])
2323

24-
stories = sprint.stories.select { |story| story.pipeline == "To Do" }
24+
@stories = @sprint.stories.select { |story| story.pipeline == "To Do" }
2525

26-
render json: format_json_output(stories)
26+
render json: format_json_output(@stories)
2727
end
2828

2929
def doing_list
30-
sprint = Sprint.find(params[:id])
30+
@sprint = Sprint.find(params[:id])
3131

32-
stories = sprint.stories.select { |story| story.pipeline == "Doing" }
32+
@stories = @sprint.stories.select { |story| story.pipeline == "Doing" }
3333

34-
render json: format_json_output(stories)
34+
render json: format_json_output(@stories)
3535
end
3636

3737
def done_list
38-
sprint = Sprint.find(params[:id])
38+
@sprint = Sprint.find(params[:id])
3939

40-
stories = sprint.stories.select { |story| story.pipeline == "Done" }
40+
@stories = @sprint.stories.select { |story| story.pipeline == "Done" }
4141

42-
render json: format_json_output(stories)
42+
render json: format_json_output(@stories)
4343
end
4444

4545
def show

app/helpers/burndown_helper.rb

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
module BurndownHelper
2+
def check_pipeline(story, burned_stories)
3+
if story.pipeline == "Done"
4+
if burned_stories[story.final_date] == nil
5+
burned_stories[story.final_date] = story.story_points
6+
else
7+
burned_stories[story.final_date] += story.story_points
8+
end
9+
end
10+
end
11+
12+
def get_burned_points(sprint, burned_stories)
13+
for story in sprint.stories
14+
check_pipeline(story, burned_stories)
15+
end
16+
17+
return burned_stories
18+
end
19+
20+
def get_total_points(sprint)
21+
total_points = 0
22+
23+
for story in sprint.stories
24+
total_points += story.story_points
25+
end
26+
27+
return total_points
28+
end
29+
30+
def set_dates_and_points(burned_stories, date_axis, points_axis, range_dates, total_points)
31+
range_dates.each do |date|
32+
if burned_stories[date] == nil
33+
burned_stories[date] = total_points
34+
else
35+
total_points -= burned_stories[date]
36+
burned_stories[date] = total_points
37+
end
38+
date_axis.push(date)
39+
points_axis.push(burned_stories[date])
40+
end
41+
end
42+
43+
def set_ideal_line(days_of_sprint, ideal_line, planned_points)
44+
for day in (days_of_sprint).downto(0)
45+
ideal_line.push(planned_points * (day / (Float days_of_sprint)))
46+
end
47+
end
48+
end

app/helpers/metric_helper.rb

+124
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
module MetricHelper
2+
include BurndownHelper
3+
include VelocityHelper
4+
5+
def get_metrics(grade)
6+
last_release = grade.project.releases.last
7+
if last_release.blank?
8+
return nil
9+
else
10+
metrics = calculate_metrics(last_release)
11+
12+
if metrics.blank?
13+
final_metric = 0
14+
else
15+
sum_of_weights = grade.weight_debts + grade.weight_velocity + grade.weight_burndown
16+
17+
final_metric = (Float (grade.weight_debts * metrics[:metric_debts_value]) +
18+
(grade.weight_velocity * metrics[:metric_velocity_value]) +
19+
(grade.weight_burndown * metrics[:metric_burndown_value])) /
20+
sum_of_weights
21+
end
22+
23+
return final_metric.round(1)
24+
end
25+
end
26+
27+
def calculate_metrics(release)
28+
sprint = release.sprints.last
29+
if sprint.blank? || sprint.stories.blank?
30+
return nil
31+
else
32+
if release.project.is_scoring == true
33+
burned_stories = {}
34+
date_axis = []
35+
points_axis = []
36+
ideal_line = []
37+
metric_burndown_array = []
38+
amount_of_sprints = release.sprints.count
39+
metric_velocity_value = 0
40+
planned_points = 0
41+
burned_points = 0
42+
43+
velocity = get_sprints_informations(release.sprints, sprint)
44+
total_points = get_total_points(sprint)
45+
burned_stories = get_burned_points(sprint, burned_stories)
46+
total_sprints_points = velocity[:total_points]
47+
velocities = velocity[:velocities]
48+
49+
range_dates = (sprint.initial_date .. sprint.final_date)
50+
51+
set_dates_and_points(burned_stories, date_axis, points_axis, range_dates, total_points)
52+
days_of_sprint = date_axis.length - 1
53+
set_ideal_line(days_of_sprint, ideal_line, total_points)
54+
ideal_burned_points = ideal_line[0] - ideal_line[1]
55+
56+
for i in 0..(date_axis.length - 2)
57+
real_burned_points = points_axis[i] - points_axis[i + 1]
58+
burned_percentage = Float((real_burned_points).abs * 100) / ideal_burned_points
59+
metric_burndown_array.push(burned_percentage)
60+
end
61+
62+
for i in 0..(amount_of_sprints - 1)
63+
metric_velocity_value += (total_sprints_points[i] - velocities[i])
64+
end
65+
66+
for i in 0..(release.sprints.length - 1)
67+
planned_points += velocity[:total_points][i]
68+
burned_points += velocity[:completed_points][i]
69+
end
70+
71+
metric_burndown_value = calculate_burndown(metric_burndown_array)
72+
73+
metric_debts_value = Float(planned_points - burned_points) / planned_points
74+
metric_debts_value = calculate_velocity_and_debt(metric_debts_value)
75+
76+
total_points = get_total_points_release(release)
77+
metric_velocity_value = Float metric_velocity_value / total_points
78+
metric_velocity_value = calculate_velocity_and_debt(metric_velocity_value)
79+
80+
return metrics = { metric_debts_value: metric_debts_value,
81+
metric_velocity_value: metric_velocity_value,
82+
metric_burndown_value: metric_burndown_value }
83+
end
84+
end
85+
end
86+
87+
def calculate_velocity_and_debt(metric)
88+
values = 0
89+
90+
if metric <= 0.2
91+
values += 4
92+
elsif metric <= 0.4
93+
values += 3
94+
elsif metric <= 0.6
95+
values += 2
96+
elsif metric <= 0.9
97+
values += 1
98+
elsif metric <= 1
99+
values += 0
100+
end
101+
102+
return values
103+
end
104+
105+
def calculate_burndown(metric)
106+
values = 0
107+
108+
for i in 0..(metric.length - 1)
109+
if metric[i] <= 10 || metric[i] >= 200
110+
values += 0
111+
elsif metric[i] <= 40
112+
values += 1
113+
elsif metric[i] <= 60
114+
values += 2
115+
elsif metric[i] <= 80
116+
values += 3
117+
elsif metric[i] <= 100
118+
values += 4
119+
end
120+
end
121+
122+
return Float values / metric.length
123+
end
124+
end

app/helpers/validations_helper.rb

+24
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ def project
1111
@project = Project.find(@release.project_id)
1212
end
1313

14+
def project_grade
15+
@project = Project.find(@grade.project.id)
16+
end
17+
1418
def release
1519
@release = Release.find(@sprint.release_id)
1620
end
@@ -44,6 +48,12 @@ def verifies_id(current_id, previous_id, component_type)
4448
elsif component_type == "release" && previous_id != 0
4549
release_id = previous_id
4650
@release = Release.find(params[:release_id].to_i)
51+
elsif component_type == "grade" && current_id != 0
52+
id = current_id
53+
@grade = Grade.find(params[:id].to_i)
54+
elsif component_type == "grade" && previous_id != 0
55+
grade_id = previous_id
56+
@grade = Grade.find(params[:grade_id].to_i)
4757
elsif component_type == "sprint" && current_id != 0
4858
id = current_id
4959
@sprint = Sprint.find(params[:id].to_i)
@@ -76,6 +86,20 @@ def validate_project(id, project_id)
7686
end
7787
end
7888

89+
90+
def validate_grade(id, grade_id)
91+
current_user
92+
verifies_id(id, grade_id, "grade")
93+
project_grade
94+
user
95+
96+
if @current_user.id == @user.id
97+
return true
98+
else
99+
render json: { error: "Not Authorized" }, status: 401
100+
end
101+
end
102+
79103
def validate_release(id, release_id)
80104
current_user
81105
verifies_id(id, release_id, "release")

0 commit comments

Comments
 (0)