diff --git a/app/models/deliverable.rb b/app/models/deliverable.rb
index 1a7ddef..78a395d 100644
--- a/app/models/deliverable.rb
+++ b/app/models/deliverable.rb
@@ -33,6 +33,9 @@ class Deliverable < ActiveRecord::Base
delegate "locked?", :to => :contract, :prefix => true, :allow_nil => true
# Callbacks
+ before_destroy :block_on_locked_contracts
+ before_destroy :block_on_closed_contracts
+
def after_initialize
self.status = "open" unless self.status.present?
end
@@ -139,6 +142,14 @@ class Deliverable < ActiveRecord::Base
def noop(message="")
end
+ def block_on_locked_contracts
+ !contract_locked?
+ end
+
+ def block_on_closed_contracts
+ !contract_closed?
+ end
+
def to_s
title
end
diff --git a/app/views/deliverables/_details_row.html.erb b/app/views/deliverables/_details_row.html.erb
index 10bcc4c..c301f60 100644
--- a/app/views/deliverables/_details_row.html.erb
+++ b/app/views/deliverables/_details_row.html.erb
@@ -7,7 +7,7 @@
<%= link_to(l(:button_edit), edit_contract_deliverable_path(@project, contract, deliverable), :class => 'icon icon-edit') %>
- <%= link_to(l(:button_delete), contract_deliverable_path(@project, contract, deliverable), :method => :delete, :confirm => l(:text_are_you_sure), :class => 'icon icon-del') %>
+ <%= link_to(l(:button_delete), contract_deliverable_path(@project, contract, deliverable), :method => :delete, :confirm => l(:text_are_you_sure), :class => 'icon icon-del') if contract.open? %>
<%= textilizable(deliverable, :notes) %>
diff --git a/test/unit/deliverable_test.rb b/test/unit/deliverable_test.rb
index 08b2d75..fa32573 100644
--- a/test/unit/deliverable_test.rb
+++ b/test/unit/deliverable_test.rb
@@ -50,6 +50,17 @@ class DeliverableTest < ActiveSupport::TestCase
assert !deliverable.valid?
assert deliverable.errors.on_base.include?("Can't create a deliverable on a locked contract")
end
+
+ should "block deleting a deliverable" do
+ contract = Contract.generate!
+ deliverable = FixedDeliverable.generate!(:contract => contract).reload
+ assert contract.lock!
+
+ assert_no_difference("Deliverable.count") do
+ deliverable.destroy
+ end
+
+ end
end
context "with a closed contract" do
@@ -60,5 +71,16 @@ class DeliverableTest < ActiveSupport::TestCase
assert !deliverable.valid?
assert deliverable.errors.on_base.include?("Can't create a deliverable on a closed contract")
end
+
+ should "block deleting a deliverable" do
+ contract = Contract.generate!
+ deliverable = FixedDeliverable.generate!(:contract => contract).reload
+ assert contract.close!
+
+ assert_no_difference("Deliverable.count") do
+ deliverable.destroy
+ end
+
+ end
end
end