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 %>