diff --git a/app/controllers/deliverables_controller.rb b/app/controllers/deliverables_controller.rb
index bab0483..94c2d25 100644
--- a/app/controllers/deliverables_controller.rb
+++ b/app/controllers/deliverables_controller.rb
@@ -12,13 +12,16 @@ class DeliverablesController < InheritedResources::Base
def create
@deliverable = begin_of_association_chain.deliverables.build(params[:deliverable])
- @deliverable.type = 'FixedDeliverable'
+ if params[:deliverable] && params[:deliverable][:type] && ['FixedDeliverable','HourlyDeliverable'].include?(params[:deliverable][:type])
+ @deliverable.type = params[:deliverable][:type]
+ end
create! { contract_url(@project, @contract) }
end
def update
@deliverable = begin_of_association_chain.deliverables.find_by_id(params[:id])
- @deliverable.attributes = params[:fixed_deliverable] # TODO: hardcoded
+ params[:deliverable] = params[:fixed_deliverable] || params[:hourly_deliverable]
+ @deliverable.attributes = params[:deliverable]
update! { contract_url(@project, @contract) }
end
diff --git a/app/models/hourly_deliverable.rb b/app/models/hourly_deliverable.rb
new file mode 100644
index 0000000..f74b9fe
--- /dev/null
+++ b/app/models/hourly_deliverable.rb
@@ -0,0 +1,13 @@
+class HourlyDeliverable < Deliverable
+ unloadable
+
+ # Associations
+
+ # Validations
+
+ # Accessors
+
+ def short_type
+ 'H'
+ end
+end
diff --git a/app/views/deliverables/_form.html.erb b/app/views/deliverables/_form.html.erb
index 8be58ab..c20ca00 100644
--- a/app/views/deliverables/_form.html.erb
+++ b/app/views/deliverables/_form.html.erb
@@ -1,6 +1,6 @@
<% form.inputs do %>
<%= form.input :title, :required => true %>
- <%= form.input :type, :required => true, :as => :select, :collection => [["Fixed", "FixedDeliverable"]] %>
+ <%= form.input :type, :required => true, :as => :select, :collection => [["Fixed", "FixedDeliverable"],["Hourly", "HourlyDeliverable"]] %>
<%= form.input :manager, :required => true, :collection => @project.users %>
<%= form.input :start_date, :as => :string, :input_html => {:size => 10}, :hint => calendar_for('deliverable_start_date') %>
<%= form.input :end_date, :as => :string, :input_html => {:size => 10}, :hint => calendar_for('deliverable_end_date') %>
@@ -8,12 +8,12 @@
<% unless resource.new_record? %>
- <%= label('deliverable', 'feature_sign_off') %>
- <%= check_box 'deliverable', 'feature_sign_off' %>
+ <%= label(resource.class.to_s.underscore, 'feature_sign_off') %>
+ <%= check_box resource.class.to_s.underscore, 'feature_sign_off' %>
- <%= label('deliverable', 'warranty_sign_off') %>
- <%= check_box 'deliverable', 'warranty_sign_off' %>
+ <%= label(resource.class.to_s.underscore, 'warranty_sign_off') %>
+ <%= check_box resource.class.to_s.underscore, 'warranty_sign_off' %>
<% end %>
diff --git a/test/integration/contracts_show_test.rb b/test/integration/contracts_show_test.rb
index 8880c31..39c3f91 100644
--- a/test/integration/contracts_show_test.rb
+++ b/test/integration/contracts_show_test.rb
@@ -37,6 +37,7 @@ class ContractsShowTest < ActionController::IntegrationTest
@deliverable1 = FixedDeliverable.generate!(:contract => @contract, :manager => @manager)
@deliverable2 = FixedDeliverable.generate!(:contract => @contract, :manager => @manager)
+ @deliverable3 = HourlyDeliverable.generate!(:contract => @contract, :manager => @manager)
visit_contract_page(@contract)
assert_select "table#deliverables" do
@@ -46,6 +47,12 @@ class ContractsShowTest < ActionController::IntegrationTest
assert_select "td.title", :text => /#{deliverable.title}/
assert_select "td.manager", :text => /#{deliverable.manager.name}/
end
+ [@deliverable3].each do |deliverable|
+ assert_select "td.end-date", :text => /#{format_date(deliverable.end_date)}/
+ assert_select "td.type", :text => "H"
+ assert_select "td.title", :text => /#{deliverable.title}/
+ assert_select "td.manager", :text => /#{deliverable.manager.name}/
+ end
end
end
diff --git a/test/integration/deliverables_edit_test.rb b/test/integration/deliverables_edit_test.rb
index 52fa32f..f1ed674 100644
--- a/test/integration/deliverables_edit_test.rb
+++ b/test/integration/deliverables_edit_test.rb
@@ -9,17 +9,19 @@ class DeliverablesEditTest < ActionController::IntegrationTest
@manager = User.generate!
@role = Role.generate!
User.add_to_project(@manager, @project, @role)
- @deliverable = FixedDeliverable.generate!(:contract => @contract, :manager => @manager, :title => 'The Title')
+ @fixed_deliverable = FixedDeliverable.generate!(:contract => @contract, :manager => @manager, :title => 'The Title')
+ @hourly_deliverable = HourlyDeliverable.generate!(:contract => @contract, :manager => @manager, :title => 'An Hourly')
+
end
- should "allow any user to edit the deliverable" do
+ should "allow any user to edit the Fixed deliverable" do
visit_contract_page(@contract)
- click_link_within "#fixed_deliverable_#{@deliverable.id}", 'Edit'
+ click_link_within "#fixed_deliverable_#{@fixed_deliverable.id}", 'Edit'
assert_response :success
assert_template 'deliverables/edit'
- assert_select "form#edit_fixed_deliverable_#{@deliverable.id}" do
- assert_select "input#fixed_deliverable_title[value=?]", /#{@deliverable.title}/
+ assert_select "form#edit_fixed_deliverable_#{@fixed_deliverable.id}" do
+ assert_select "input#fixed_deliverable_title[value=?]", /#{@fixed_deliverable.title}/
assert_select "select#fixed_deliverable_type" do
assert_select "option[selected=selected][value=FixedDeliverable]"
end
@@ -33,9 +35,38 @@ class DeliverablesEditTest < ActionController::IntegrationTest
assert_response :success
assert_template 'contracts/show'
- assert_equal "An updated title", @deliverable.reload.title
- assert @deliverable.reload.warranty_sign_off?
- assert @deliverable.reload.feature_sign_off?
+ assert_equal "An updated title", @fixed_deliverable.reload.title
+ assert_equal "FixedDeliverable", @fixed_deliverable.reload.type
+ assert @fixed_deliverable.reload.warranty_sign_off?
+ assert @fixed_deliverable.reload.feature_sign_off?
+
+ end
+
+ should "allow any user to edit the Hourly deliverable" do
+ visit_contract_page(@contract)
+ click_link_within "#hourly_deliverable_#{@hourly_deliverable.id}", 'Edit'
+ assert_response :success
+ assert_template 'deliverables/edit'
+
+ assert_select "form#edit_hourly_deliverable_#{@hourly_deliverable.id}" do
+ assert_select "input#hourly_deliverable_title[value=?]", /#{@hourly_deliverable.title}/
+ assert_select "select#hourly_deliverable_type" do
+ assert_select "option[selected=selected][value=HourlyDeliverable]"
+ end
+ end
+
+ fill_in "Title", :with => 'An updated title'
+ check "Feature Sign Off"
+ check "Warranty Sign Off"
+ click_button "Save"
+
+ assert_response :success
+ assert_template 'contracts/show'
+
+ assert_equal "An updated title", @hourly_deliverable.reload.title
+ assert_equal "HourlyDeliverable", @hourly_deliverable.reload.type
+ assert @hourly_deliverable.reload.warranty_sign_off?
+ assert @hourly_deliverable.reload.feature_sign_off?
end
end
diff --git a/test/integration/deliverables_new_test.rb b/test/integration/deliverables_new_test.rb
index c8e5f7d..62bc59e 100644
--- a/test/integration/deliverables_new_test.rb
+++ b/test/integration/deliverables_new_test.rb
@@ -72,4 +72,35 @@ class DeliverablesNewTest < ActionController::IntegrationTest
assert_equal @manager, @deliverable.manager
assert_equal 1000.0, @deliverable.total.to_f
end
+
+ should "create a new Hourly deliverable" do
+ @manager = User.generate!
+ @role = Role.generate!
+ User.add_to_project(@manager, @project, @role)
+
+ visit_contract_page(@contract)
+ click_link 'Add New'
+ assert_response :success
+
+ fill_in "Title", :with => 'A New Deliverable'
+ select "Hourly", :from => "Type"
+ select @manager.name, :from => "Manager"
+ fill_in "Start", :with => '2010-01-01'
+ fill_in "End Date", :with => '2010-12-31'
+ fill_in "Notes", :with => 'Some notes on the deliverable'
+
+ click_button "Save"
+
+ assert_response :success
+ assert_template 'contracts/show'
+
+ @deliverable = Deliverable.last
+ assert_equal "A New Deliverable", @deliverable.title
+ assert_equal @contract, @deliverable.contract
+ assert_equal "HourlyDeliverable", @deliverable.type
+ assert_equal '2010-01-01', @deliverable.start_date.to_s
+ assert_equal '2010-12-31', @deliverable.end_date.to_s
+ assert_equal @manager, @deliverable.manager
+ end
+
end