diff --git a/app/helpers/deliverables_helper.rb b/app/helpers/deliverables_helper.rb index d93e901..bae4336 100644 --- a/app/helpers/deliverables_helper.rb +++ b/app/helpers/deliverables_helper.rb @@ -9,4 +9,10 @@ module DeliverablesHelper ) ) + observe_field('deliverable_' + field.to_s, :function => "new Budget.updateAmounts();") end + + def paragraph_with_data(label, data) + content_tag(:p, + content_tag(:span, label) + + h(data)) + end end diff --git a/app/models/deliverable.rb b/app/models/deliverable.rb index 67e24dd..a01fa9a 100644 --- a/app/models/deliverable.rb +++ b/app/models/deliverable.rb @@ -75,4 +75,25 @@ class Deliverable < ActiveRecord::Base write_attribute(:profit, v.gsub(/[$, ]/,'')) end end + + def budget_remaining + return self.budget - self.spent + end + + def hours_used + 0 + end + + def left + return self.budget - self.spent + end + + def overruns + if self.left >= 0 + return 0 + else + return self.left * -1 + end + end + end diff --git a/app/models/hourly_deliverable.rb b/app/models/hourly_deliverable.rb index 8918e11..451dbb3 100644 --- a/app/models/hourly_deliverable.rb +++ b/app/models/hourly_deliverable.rb @@ -16,5 +16,11 @@ class HourlyDeliverable < Deliverable return total end + + def hours_used + return 0 unless self.issues.size > 0 + return self.issues.collect(&:time_entries).flatten.collect(&:hours).sum + + end end diff --git a/app/views/deliverables/_deliverable.html.erb b/app/views/deliverables/_deliverable.html.erb index 9e7242e..9c6d9fd 100644 --- a/app/views/deliverables/_deliverable.html.erb +++ b/app/views/deliverables/_deliverable.html.erb @@ -1,4 +1,5 @@ - +<% css = cycle('odd','even') %> + <%= content_tag(:td, deliverable.id) %> <%= content_tag(:td, deliverable.score) %> <%= content_tag(:td, deliverable.subject) %> @@ -6,4 +7,27 @@ <%= content_tag(:td, number_to_currency(deliverable.spent)) %> <%= content_tag(:td, format_date(deliverable.due_date)) %> <%= content_tag(:td, progress_bar(deliverable.progress, :width => '100%')) %> + <%= content_tag(:td, link_to_function("Details", "$('deliverable-details-#{deliverable.id}').toggle();")) %> + + + <%# TODO: link to issues %> + <%# TODO: link to edit %> + <%= content_tag( + :td, + "
" + + paragraph_with_data("Deliverable Budget: ", number_to_currency(deliverable.budget)) + + paragraph_with_data("Budget Spent: ", number_to_currency(deliverable.spent)) + + paragraph_with_data("Budget Remaining: ", number_to_currency(deliverable.budget_remaining)) + + paragraph_with_data("Hours Used: ", deliverable.hours_used) + + paragraph_with_data("Hours Estimated: ", deliverable.total_hours) + + paragraph_with_data("Progress: ", deliverable.progress) + + paragraph_with_data("Score ", deliverable.score) + + paragraph_with_data("Overruns ", number_to_currency(deliverable.overruns)) + + paragraph_with_data("TODO: Overall project %", nil) + + paragraph_with_data("Profit: ", number_to_currency(deliverable.profit)) + + "
", + :colspan => 4) %> + + <%= content_tag( + :td, "TODO", :colspan => 4) %> diff --git a/app/views/deliverables/_list.html.erb b/app/views/deliverables/_list.html.erb index 5efef96..df37540 100644 --- a/app/views/deliverables/_list.html.erb +++ b/app/views/deliverables/_list.html.erb @@ -9,6 +9,7 @@ <%= content_tag('th', "Spent") %> <%= sort_header_tag("#{Deliverable.table_name}.due_date", :caption => 'Due') %> <%= content_tag('th', "Progress") %> + <%= content_tag('th', "Actions") %> <% deliverables.each do |deliverable| -%> diff --git a/assets/stylesheets/budget.css b/assets/stylesheets/budget.css index a80b0a8..b2dfe9c 100644 --- a/assets/stylesheets/budget.css +++ b/assets/stylesheets/budget.css @@ -7,6 +7,9 @@ tr.deliverable td.subject, tr.deliverable td.category { white-space: normal; } tr.deliverable td.subject { text-align: left; } tr.deliverable td.done_ratio table.progress { margin-left:auto; margin-right: auto;} +tr.deliverable-details p { text-align:left; } +tr.deliverable-details span { font-weight:bold; } + #deliverable-form .splitcontentleft { width: 62% } #deliverable-form .splitcontentright { width: 37% } #deliverable-form .splitcontentright p { padding-right: 30px; }