summaryrefslogtreecommitdiffstats
path: root/app/views/projects/gantt.rfpdf
blob: 780b2d90025c4519be5f5dc76a55676bbdd07c66 (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
<%
pdf=IfpdfHelper::IFPDF.new
pdf.SetTitle("#{@project.name} - #{l(:label_gantt)}")
pdf.AliasNbPages
pdf.footer_date = format_date(Date.today)
pdf.AddPage("L")
pdf.SetFont('Arial','B',12)
pdf.SetX(15)
pdf.Cell(70, 20, @project.name)
pdf.Ln
pdf.SetFont('Arial','B',9)

subject_width = 70
header_heigth = 5

headers_heigth = header_heigth
show_weeks = false
show_days = false

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

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

y_start = pdf.GetY


#
# Months headers
#
month_f = @date_from
left = subject_width
height = header_heigth
@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 @date_from.cwday == 1
	    # @date_from is monday
        week_f = @date_from
	else
	    # find next monday after @date_from
		week_f = @date_from + (7 - @date_from.cwday + 1)
		width = (7 - @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 <= @date_to
		width = (week_f + 6 <= @date_to) ? 7 * zoom : (@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 = @date_from.cwday
	pdf.SetFont('Arial','B',7)
	(@date_to - @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)[0,1], "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.SetFont('Arial','B',7)
@issues.each do |i|
	pdf.SetY(top)
	pdf.SetX(15)
	pdf.Cell(subject_width-15, 5, "#{i.tracker.name} #{i.id}: #{i.subject}".sub(/^(.{30}[^\s]*\s).*$/, '\1 (...)'), "LR")

	pdf.SetY(top)
	pdf.SetX(subject_width)
	pdf.Cell(g_width, 5, "", "LR")
	
	i_start_date = (i.start_date >= @date_from ? i.start_date : @date_from )
	i_end_date = (i.due_date <= @date_to ? i.due_date : @date_to )
	
	i_done_date = i.start_date + ((i.due_date - i.start_date+1)*i.done_ratio/100).floor
	i_done_date = (i_done_date <= @date_from ? @date_from : i_done_date )
	i_done_date = (i_done_date >= @date_to ? @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 - @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.SetY(top+1.5)
	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}%")
	
	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 %>