diff --git a/app/controllers/deliverables_controller.rb b/app/controllers/deliverables_controller.rb index 9358b9a..e0a74de 100644 --- a/app/controllers/deliverables_controller.rb +++ b/app/controllers/deliverables_controller.rb @@ -28,7 +28,7 @@ class DeliverablesController < InheritedResources::Base def show if show_partial? - @period = params[:period] + @period = extract_period(params[:period]) render :partial => 'deliverables/details_row', :locals => {:contract => @contract, :deliverable => @contract.deliverables.find(params[:id]), :period => @period} else redirect_to contract_url(@project, @contract) @@ -57,4 +57,13 @@ class DeliverablesController < InheritedResources::Base @project = @contract.project end + def extract_period(param) + period = nil + if param.present? && param.match(/\A\d{4}-\d{2}\z/) # "YYYY-MM" + year, month = param.split('-') + period = Date.new(year.to_i, month.to_i, 1) + end + period + end + end diff --git a/app/helpers/contracts_helper.rb b/app/helpers/contracts_helper.rb index ebe224e..0266bd0 100644 --- a/app/helpers/contracts_helper.rb +++ b/app/helpers/contracts_helper.rb @@ -86,12 +86,18 @@ module ContractsHelper number_with_precision(value, :precision => Contract::ViewPrecision, :delimiter => ',') end - def retainer_period_options(deliverable) + def retainer_period_options(deliverable, method_options={}) + selected = method_options[:selected] + if selected && selected.is_a?(Date) + selected = selected.strftime("%Y-%m") + end + options = [] options << content_tag(:option, l(:label_all).capitalize, :value => '') deliverable.months.collect do |month| - options << content_tag(:option, month.strftime("%B %Y"), :value => month.strftime("%Y-%m")) + value = month.strftime("%Y-%m") + options << content_tag(:option, month.strftime("%B %Y"), :value => value, :selected => (selected == value) ? 'selected' : nil) end options diff --git a/app/models/deliverable.rb b/app/models/deliverable.rb index b668ff1..3517409 100644 --- a/app/models/deliverable.rb +++ b/app/models/deliverable.rb @@ -38,6 +38,11 @@ class Deliverable < ActiveRecord::Base '' end + # Deliverable's aren't dated. Subclasses may override this for period behavior. + def current_date + nil + end + def to_s title end diff --git a/app/models/fixed_deliverable.rb b/app/models/fixed_deliverable.rb index 0c2fd03..52e6a11 100644 --- a/app/models/fixed_deliverable.rb +++ b/app/models/fixed_deliverable.rb @@ -29,8 +29,8 @@ class FixedDeliverable < Deliverable # The amount of money remaining after expenses have been taken out # Profit left = Total - Labor spent - Overhead spent - def profit_left - total_spent - labor_budget_spent - overhead_spent + def profit_left(date=nil) + total_spent(date) - labor_budget_spent(date) - overhead_spent(date) end # Hardcoded value used as a wrapper for the old Budget plugin API. diff --git a/app/models/retainer_deliverable.rb b/app/models/retainer_deliverable.rb index b06f094..033676f 100644 --- a/app/models/retainer_deliverable.rb +++ b/app/models/retainer_deliverable.rb @@ -19,8 +19,12 @@ class RetainerDeliverable < HourlyDeliverable 'R' end + def current_date + Date.today + end + def current_period - Date.today.strftime("%B %Y") + current_date.strftime("%B %Y") end def beginning_date @@ -32,7 +36,11 @@ class RetainerDeliverable < HourlyDeliverable end def date_range - (beginning_date..ending_date) + if beginning_date && ending_date && beginning_date <= ending_date + (beginning_date..ending_date) + else + [] + end end def within_date_range?(date) diff --git a/app/views/contracts/show.html.erb b/app/views/contracts/show.html.erb index 48fe286..55a4254 100644 --- a/app/views/contracts/show.html.erb +++ b/app/views/contracts/show.html.erb @@ -108,7 +108,7 @@ <% end %> - <%= render :partial => 'deliverables/details_row', :locals => {:deliverable => deliverable, :contract => resource} %> + <%= render :partial => 'deliverables/details_row', :locals => {:deliverable => deliverable, :contract => resource, :period => deliverable.current_date} %> <% end %> diff --git a/app/views/deliverables/_details_row.html.erb b/app/views/deliverables/_details_row.html.erb index 4cdc03a..c4d6aea 100644 --- a/app/views/deliverables/_details_row.html.erb +++ b/app/views/deliverables/_details_row.html.erb @@ -1,4 +1,4 @@ -<% period ||= '' %> +<% period ||= nil %> @@ -16,7 +16,7 @@
@@ -52,28 +52,28 @@ Labor - <%= h(format_value_field_for_contracts(deliverable.labor_budget_spent)) %> - <%= h(format_value_field_for_contracts(deliverable.labor_budget_total)) %> + <%= h(format_value_field_for_contracts(deliverable.labor_budget_spent(period))) %> + <%= h(format_value_field_for_contracts(deliverable.labor_budget_total(period))) %> TODO: Release 2 / TODO hrs Overhead - <%= h(format_value_field_for_contracts(deliverable.overhead_spent)) %> - <%= h(format_value_field_for_contracts(deliverable.overhead_budget_total)) %> + <%= h(format_value_field_for_contracts(deliverable.overhead_spent(period))) %> + <%= h(format_value_field_for_contracts(deliverable.overhead_budget_total(period))) %> TODO: Release 2 / TODO hrs <%# TODO: Release 2, Fixed %> <%# TODO: Release 2, Markup %> Profit - <%= h(format_value_field_for_contracts(deliverable.profit_left)) %> - <%= h(format_value_field_for_contracts(deliverable.profit_budget)) %> + <%= h(format_value_field_for_contracts(deliverable.profit_left(period))) %> + <%= h(format_value_field_for_contracts(deliverable.profit_budget(period))) %> Total: - <%= h(format_value_field_for_contracts(deliverable.total_spent)) %> - <%= h(format_value_field_for_contracts(deliverable.total)) %> + <%= h(format_value_field_for_contracts(deliverable.total_spent(period))) %> + <%= h(format_value_field_for_contracts(deliverable.total(period))) %> TODO: Release 2 diff --git a/test/integration/deliverable_details_test.rb b/test/integration/deliverable_details_test.rb index 295c4e0..acb5a3d 100644 --- a/test/integration/deliverable_details_test.rb +++ b/test/integration/deliverable_details_test.rb @@ -32,7 +32,6 @@ class DeliverableDetailsShowTest < ActionController::IntegrationTest visit "/projects/#{@project.id}/contracts/#{@contract.id}/deliverables/#{@deliverable1.id}", :get, {:format => 'js', :as => 'deliverable_details_row', :period => '2010-02'} - puts response.body assert_response :success assert_select ".deliverable_details_outer_wrapper_#{@deliverable1.id}" do assert_select "td.labor_budget_total", '100' @@ -40,7 +39,7 @@ class DeliverableDetailsShowTest < ActionController::IntegrationTest assert_select "td.total", '100' assert_select "select.retainer_period_change" do - assert_select "option[selected=selected]", "Feburary 2010" + assert_select "option[selected=selected]", "February 2010" end end