summaryrefslogtreecommitdiffstats
path: root/app/views/issues/gantt.rfpdf
blob: be7f31a392752fe6bfff16ac622fd6d382910bac (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
<%
pdf=IfpdfHelper::IFPDF.new(current_language)
pdf.SetTitle("#{l(:label_gantt)} #{@project}")
pdf.AliasNbPages
pdf.footer_date = format_date(Date.today)
pdf.AddPage("L")
pdf.SetFontStyle('B',12)
pdf.SetX(15)
pdf.Cell(70, 20, @project.to_s)
pdf.Ln
pdf.SetFontStyle('B',9)

subject_width = 70
header_heigth = 5

headers_heigth = header_heigth
show_weeks = false
show_days = false

if @gantt.months < 7
    show_weeks = true
    headers_heigth = 2*header_heigth
    if @gantt.months < 3
        show_days = true
        headers_heigth = 3*header_heigth
    end
end

g_width = 210
zoom = (g_width) / (@gantt.date_to - @gantt.date_from + 1)
g_height = 120
t_height = g_height + headers_heigth

y_start = pdf.GetY


#
# Months headers
#
month_f = @gantt.date_from
left = subject_width
height = header_heigth
@gantt.months.times do 
	width = ((month_f >> 1) - month_f) * zoom 
	pdf.SetY(y_start)
	pdf.SetX(left)
	pdf.Cell(width, height, "#{month_f.year}-#{month_f.month}", "LTR", 0, "C")
	left = left + width
	month_f = month_f >> 1
end  

#
# Weeks headers
#
if show_weeks
	left = subject_width
	height = header_heigth
	if @gantt.date_from.cwday == 1
	    # @gantt.date_from is monday
        week_f = @gantt.date_from
	else
	    # find next monday after @gantt.date_from
		week_f = @gantt.date_from + (7 - @gantt.date_from.cwday + 1)
		width = (7 - @gantt.date_from.cwday + 1) * zoom-1
		pdf.SetY(y_start + header_heigth)
		pdf.SetX(left)
		pdf.Cell(width + 1, height, "", "LTR")
		left = left + width+1
	end
	while week_f <= @gantt.date_to
		width = (week_f + 6 <= @gantt.date_to) ? 7 * zoom : (@gantt.date_to - week_f + 1) * zoom
		pdf.SetY(y_start + header_heigth)
		pdf.SetX(left)
		pdf.Cell(width, height, (width >= 5 ? week_f.cweek.to_s : ""), "LTR", 0, "C")
		left = left + width
		week_f = week_f+7
	end
end

#
# Days headers
#
if show_days
	left = subject_width
	height = header_heigth
	wday = @gantt.date_from.cwday
	pdf.SetFontStyle('B',7)
	(@gantt.date_to - @gantt.date_from + 1).to_i.times do 
		width = zoom
		pdf.SetY(y_start + 2 * header_heigth)
		pdf.SetX(left)
		pdf.Cell(width, height, day_name(wday).first, "LTR", 0, "C")
		left = left + width
		wday = wday + 1
		wday = 1 if wday > 7
	end
end

pdf.SetY(y_start)
pdf.SetX(15)
pdf.Cell(subject_width+g_width-15, headers_heigth, "", 1)


#
# Tasks
#
top = headers_heigth + y_start
pdf.SetFontStyle('B',7)
@gantt.events.each do |i|
	pdf.SetY(top)
	pdf.SetX(15)
	
	if i.is_a? Issue
		pdf.Cell(subject_width-15, 5, "#{i.tracker.name} #{i.id}: #{i.subject}".sub(/^(.{30}[^\s]*\s).*$/, '\1 (...)'), "LR")
	else
		pdf.Cell(subject_width-15, 5, "#{l(:label_version)}: #{i.name}", "LR")
	end

	pdf.SetY(top)
	pdf.SetX(subject_width)
	pdf.Cell(g_width, 5, "", "LR")

	pdf.SetY(top+1.5)
	
	if i.is_a? Issue
		i_start_date = (i.start_date >= @gantt.date_from ? i.start_date : @gantt.date_from )
		i_end_date = (i.due_before <= @gantt.date_to ? i.due_before : @gantt.date_to )
		
		i_done_date = i.start_date + ((i.due_before - i.start_date+1)*i.done_ratio/100).floor
		i_done_date = (i_done_date <= @gantt.date_from ? @gantt.date_from : i_done_date )
		i_done_date = (i_done_date >= @gantt.date_to ? @gantt.date_to : i_done_date )
		
		i_late_date = [i_end_date, Date.today].min if i_start_date < Date.today
		
		i_left = ((i_start_date - @gantt.date_from)*zoom) 
		i_width = ((i_end_date - i_start_date + 1)*zoom)
		d_width = ((i_done_date - i_start_date)*zoom)
		l_width = ((i_late_date - i_start_date+1)*zoom) if i_late_date
		l_width ||= 0
	
		pdf.SetX(subject_width + i_left)
		pdf.SetFillColor(200,200,200)
		pdf.Cell(i_width, 2, "", 0, 0, "", 1)
	
		if l_width > 0
			pdf.SetY(top+1.5)
			pdf.SetX(subject_width + i_left)
			pdf.SetFillColor(255,100,100)
			pdf.Cell(l_width, 2, "", 0, 0, "", 1)
		end 
		if d_width > 0
			pdf.SetY(top+1.5)
			pdf.SetX(subject_width + i_left)
			pdf.SetFillColor(100,100,255)
			pdf.Cell(d_width, 2, "", 0, 0, "", 1)
		end
		
		pdf.SetY(top+1.5)
		pdf.SetX(subject_width + i_left + i_width)
		pdf.Cell(30, 2, "#{i.status.name} #{i.done_ratio}%")
	else
		i_left = ((i.start_date - @gantt.date_from)*zoom) 
		
		pdf.SetX(subject_width + i_left)
		pdf.SetFillColor(50,200,50)
		pdf.Cell(2, 2, "", 0, 0, "", 1)	

		pdf.SetY(top+1.5)
		pdf.SetX(subject_width + i_left + 3)
		pdf.Cell(30, 2, "#{i.name}")
	end
	
	
	top = top + 5
	pdf.SetDrawColor(200, 200, 200)
	pdf.Line(15, top, subject_width+g_width, top)
	if pdf.GetY() > 180
		pdf.AddPage("L")
		top = 20
		pdf.Line(15, top, subject_width+g_width, top)
	end
	pdf.SetDrawColor(0, 0, 0)
end

pdf.Line(15, top, subject_width+g_width, top)

%>
<%= pdf.Output %>