[#6441] Add a manual Contract#status
This commit is contained in:
@@ -6,6 +6,18 @@ module ContractsHelper
|
||||
deliverable
|
||||
end
|
||||
|
||||
def group_contracts_by_status(contracts)
|
||||
grouped_contracts = contracts.inject({}) do |grouped, contract|
|
||||
grouped[contract.status] ||= []
|
||||
grouped[contract.status] << contract
|
||||
grouped
|
||||
end
|
||||
grouped_contracts["open"] ||= []
|
||||
grouped_contracts["locked"] ||= []
|
||||
grouped_contracts["closed"] ||= []
|
||||
grouped_contracts
|
||||
end
|
||||
|
||||
# Simple helper to show the values of a field on an object in a standard format
|
||||
#
|
||||
# <p>
|
||||
|
||||
@@ -17,6 +17,7 @@ class Contract < ActiveRecord::Base
|
||||
validates_presence_of :start_date
|
||||
validates_presence_of :end_date
|
||||
validates_inclusion_of :discount_type, :in => %w($ %), :allow_blank => true, :allow_nil => true
|
||||
validates_inclusion_of :status, :in => ["open","locked","closed"], :allow_blank => true, :allow_nil => true
|
||||
validate :start_and_end_date_are_valid
|
||||
|
||||
# Accessors
|
||||
@@ -33,15 +34,20 @@ class Contract < ActiveRecord::Base
|
||||
attr_accessible :po_number
|
||||
attr_accessible :client_point_of_contact
|
||||
attr_accessible :details
|
||||
attr_accessible :status
|
||||
|
||||
named_scope :by_name, {:order => "#{Contract.table_name}.name ASC"}
|
||||
|
||||
[:status, :contract_type,
|
||||
[:contract_type,
|
||||
:discount_spent, :discount_budget
|
||||
].each do |mthd|
|
||||
define_method(mthd) { "TODO in later release" }
|
||||
end
|
||||
|
||||
def status
|
||||
read_attribute(:status) || "open"
|
||||
end
|
||||
|
||||
# ------------------------------------------------------------
|
||||
# Labor Methods
|
||||
# ------------------------------------------------------------
|
||||
@@ -229,6 +235,7 @@ class Contract < ActiveRecord::Base
|
||||
|
||||
def after_initialize
|
||||
self.executed = false unless self.executed.present?
|
||||
self.status = "open" unless self.status.present?
|
||||
end
|
||||
|
||||
# Are the start_date and end_date valid?
|
||||
@@ -270,5 +277,5 @@ class Contract < ActiveRecord::Base
|
||||
def summarize_associated_values(records, value_method)
|
||||
records.inject(0) {|total, record| total += record.send(value_method)}
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<div class="box tabular">
|
||||
<% form.inputs :name => l(:text_general_legend) do %>
|
||||
<%= form.input :name, :required => true %>
|
||||
<%= form.input :status, :required => true, :collection => [["Open","open"],["Locked","locked"],["Closed","closed"]] %>
|
||||
<%= form.input :account_executive, :required => true, :collection => @project.users.sort %>
|
||||
<li class="boolean optional">
|
||||
<%= label('contract', 'executed') %>
|
||||
|
||||
@@ -12,10 +12,10 @@
|
||||
|
||||
</div>
|
||||
|
||||
<% if collection.empty? %>
|
||||
<% if group_contracts_by_status(collection)["open"].empty? %>
|
||||
<p class="nodata"><%= l(:label_no_data) %></p>
|
||||
<% else %>
|
||||
<table class="list" cellspacing="0" border="0" cellpadding="0" id="contracts">
|
||||
<table class="list open" cellspacing="0" border="0" cellpadding="0" id="contracts">
|
||||
<thead>
|
||||
<th><%= l(:field_id) %></th>
|
||||
<th><%= l(:field_name) %></th>
|
||||
@@ -26,11 +26,11 @@
|
||||
<th><%= l(:field_end_date) %></th>
|
||||
</thead>
|
||||
<tbody>
|
||||
<% collection.each do |contract| %>
|
||||
<% group_contracts_by_status(collection)["open"].each do |contract| %>
|
||||
<% content_tag_for(:tr, contract, :class => cycle('','odd')) do %>
|
||||
<td class="id"><%= link_to(h(contract.id), contract_path(@project, contract)) %></td>
|
||||
<td class="name"><%= link_to(h(contract.name), contract_path(@project, contract)) %></td>
|
||||
<td><%= release(5, "Contract Status") %></td>
|
||||
<td class="status"><%= h(contract.status) %></td>
|
||||
<td><%= release(5, "Contract Type") %></td>
|
||||
<td class="account-executive"><%= h contract.account_executive.name %></td>
|
||||
<td class="total-budget"><%= h(format_value_field_for_contracts(contract.total_budget)) %></td>
|
||||
@@ -42,11 +42,71 @@
|
||||
<% end %>
|
||||
|
||||
<div class="title-bar">
|
||||
<h2>Inactive Contracts</h2>
|
||||
<h2>Locked Contracts</h2>
|
||||
</div>
|
||||
|
||||
<p class="nodata"><%= l(:label_no_data) %></p>
|
||||
<p><%= release(5, "Contract Status. Split contracts by active and inactive") %></p>
|
||||
<% if group_contracts_by_status(collection)["locked"].empty? %>
|
||||
<p class="nodata"><%= l(:label_no_data) %></p>
|
||||
<% else %>
|
||||
<table class="list locked" cellspacing="0" border="0" cellpadding="0" id="contracts">
|
||||
<thead>
|
||||
<th><%= l(:field_id) %></th>
|
||||
<th><%= l(:field_name) %></th>
|
||||
<th><%= l(:field_status) %></th>
|
||||
<th><%= l(:field_type) %></th>
|
||||
<th><%= l(:field_account_executive_short) %></th>
|
||||
<th><%= l(:field_total_budget) %></th>
|
||||
<th><%= l(:field_end_date) %></th>
|
||||
</thead>
|
||||
<tbody>
|
||||
<% group_contracts_by_status(collection)["locked"].each do |contract| %>
|
||||
<% content_tag_for(:tr, contract, :class => cycle('','odd')) do %>
|
||||
<td class="id"><%= link_to(h(contract.id), contract_path(@project, contract)) %></td>
|
||||
<td class="name"><%= link_to(h(contract.name), contract_path(@project, contract)) %></td>
|
||||
<td class="status"><%= h(contract.status) %></td>
|
||||
<td><%= release(5, "Contract Type") %></td>
|
||||
<td class="account-executive"><%= h contract.account_executive.name %></td>
|
||||
<td class="total-budget"><%= h(format_value_field_for_contracts(contract.total_budget)) %></td>
|
||||
<td class="end-date"><%= h format_date(contract.end_date) %></td>
|
||||
<% end %>
|
||||
<% end %>
|
||||
</tbody>
|
||||
</table>
|
||||
<% end %>
|
||||
|
||||
<div class="title-bar">
|
||||
<h2>Closed Contracts</h2>
|
||||
</div>
|
||||
|
||||
<% if group_contracts_by_status(collection)["closed"].empty? %>
|
||||
<p class="nodata"><%= l(:label_no_data) %></p>
|
||||
<% else %>
|
||||
<table class="list closed" cellspacing="0" border="0" cellpadding="0" id="contracts">
|
||||
<thead>
|
||||
<th><%= l(:field_id) %></th>
|
||||
<th><%= l(:field_name) %></th>
|
||||
<th><%= l(:field_status) %></th>
|
||||
<th><%= l(:field_type) %></th>
|
||||
<th><%= l(:field_account_executive_short) %></th>
|
||||
<th><%= l(:field_total_budget) %></th>
|
||||
<th><%= l(:field_end_date) %></th>
|
||||
</thead>
|
||||
<tbody>
|
||||
<% group_contracts_by_status(collection)["closed"].each do |contract| %>
|
||||
<% content_tag_for(:tr, contract, :class => cycle('','odd')) do %>
|
||||
<td class="id"><%= link_to(h(contract.id), contract_path(@project, contract)) %></td>
|
||||
<td class="name"><%= link_to(h(contract.name), contract_path(@project, contract)) %></td>
|
||||
<td class="status"><%= h(contract.status) %></td>
|
||||
<td><%= release(5, "Contract Type") %></td>
|
||||
<td class="account-executive"><%= h contract.account_executive.name %></td>
|
||||
<td class="total-budget"><%= h(format_value_field_for_contracts(contract.total_budget)) %></td>
|
||||
<td class="end-date"><%= h format_date(contract.end_date) %></td>
|
||||
<% end %>
|
||||
<% end %>
|
||||
</tbody>
|
||||
</table>
|
||||
<% end %>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
@@ -15,10 +15,7 @@
|
||||
|
||||
<div class="c_overview">
|
||||
<table class="left">
|
||||
<tr class="contract-status">
|
||||
<%# show_field(resource, :status, :html_options => {:class => 'contract-status'}) %>
|
||||
<td colspan="2"><%= release(5, "Contract status") %></td>
|
||||
</tr>
|
||||
<%= show_field(resource, :status, :html_options => {:class => 'contract-status'}) %>
|
||||
<%= show_field(resource, :account_executive, :html_options => {:class => 'contract-account-manager'}) %>
|
||||
<tr class="contract-type">
|
||||
<%# show_field(resource, :contract_type, :html_options => {:class => 'contract-type'}) %>
|
||||
|
||||
10
db/migrate/018_add_status_to_contracts.rb
Normal file
10
db/migrate/018_add_status_to_contracts.rb
Normal file
@@ -0,0 +1,10 @@
|
||||
class AddStatusToContracts < ActiveRecord::Migration
|
||||
def self.up
|
||||
add_column :contracts, :status, :string
|
||||
add_index :contracts, :status
|
||||
end
|
||||
|
||||
def self.down
|
||||
remove_column :contracts, :status
|
||||
end
|
||||
end
|
||||
@@ -48,12 +48,13 @@ class ContractsEditTest < ActionController::IntegrationTest
|
||||
end
|
||||
|
||||
fill_in "Name", :with => 'An updated name'
|
||||
select "Locked", :from => "Status"
|
||||
click_button "Save Contract"
|
||||
|
||||
assert_response :success
|
||||
assert_template 'contracts/show'
|
||||
|
||||
assert_equal "An updated name", @contract.reload.name
|
||||
|
||||
assert_equal "locked", @contract.reload.status
|
||||
end
|
||||
end
|
||||
|
||||
@@ -5,8 +5,10 @@ class ContractsListTest < ActionController::IntegrationTest
|
||||
|
||||
def setup
|
||||
@project = Project.generate!(:identifier => 'main')
|
||||
@contract = Contract.generate!(:project => @project)
|
||||
@contract2 = Contract.generate!(:project => @project)
|
||||
@contract = Contract.generate!(:project => @project, :name => 'Contract1').reload
|
||||
@contract2 = Contract.generate!(:project => @project, :name => 'Contract2').reload
|
||||
@contract_locked = Contract.generate!(:project => @project, :status => 'locked', :name => 'LockedContract').reload
|
||||
@contract_closed = Contract.generate!(:project => @project, :status => 'closed', :name => 'ClosedContract').reload
|
||||
|
||||
@other_project = Project.generate!(:identifier => 'other')
|
||||
@other_contract = Contract.generate!(:project => @other_project)
|
||||
@@ -44,10 +46,10 @@ class ContractsListTest < ActionController::IntegrationTest
|
||||
visit_contracts_for_project(@project)
|
||||
end
|
||||
|
||||
should "list all contracts for the project" do
|
||||
should "list all contracts for the project grouped by status" do
|
||||
visit_contracts_for_project(@project)
|
||||
|
||||
assert_select "table#contracts" do
|
||||
assert_select "table#contracts.open" do
|
||||
[@contract, @contract2].each do |contract|
|
||||
assert_select "td.id", :text => /#{contract.id}/
|
||||
assert_select "td.name", :text => /#{contract.name}/
|
||||
@@ -56,7 +58,23 @@ class ContractsListTest < ActionController::IntegrationTest
|
||||
assert_select "td.total-budget"
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
assert_select "table#contracts.locked" do
|
||||
assert_select "td.id", :text => /#{@contract_locked.id}/
|
||||
assert_select "td.name", :text => /#{@contract_locked.name}/
|
||||
assert_select "td.account-executive", :text => /#{@contract_locked.account_executive.name}/
|
||||
assert_select "td.end-date", :text => /#{format_date(@contract_locked.end_date)}/
|
||||
assert_select "td.total-budget"
|
||||
end
|
||||
|
||||
assert_select "table#contracts.closed" do
|
||||
assert_select "td.id", :text => /#{@contract_closed.id}/
|
||||
assert_select "td.name", :text => /#{@contract_closed.name}/
|
||||
assert_select "td.account-executive", :text => /#{@contract_closed.account_executive.name}/
|
||||
assert_select "td.end-date", :text => /#{format_date(@contract_closed.end_date)}/
|
||||
assert_select "td.total-budget"
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
should "not list contracts from other projects" do
|
||||
|
||||
@@ -52,6 +52,7 @@ class ContractsNewTest < ActionController::IntegrationTest
|
||||
fill_in "Start", :with => '2010-01-01'
|
||||
fill_in "End Date", :with => '2010-12-31'
|
||||
select "Net 30", :from => "Payment Terms"
|
||||
select "Locked", :from => "Status"
|
||||
|
||||
click_button "Save Contract"
|
||||
|
||||
@@ -64,6 +65,7 @@ class ContractsNewTest < ActionController::IntegrationTest
|
||||
assert_equal '2010-01-01', @contract.start_date.to_s
|
||||
assert_equal '2010-12-31', @contract.end_date.to_s
|
||||
assert_equal 'Net 30', @contract.payment_term.name
|
||||
assert_equal "locked", @contract.status
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
@@ -17,6 +17,9 @@ class ContractTest < ActiveSupport::TestCase
|
||||
should_allow_values_for :discount_type, "$", "%", nil, ''
|
||||
should_not_allow_values_for :discount_type, ["amount", "percent", "bar"]
|
||||
|
||||
should_allow_values_for :status, "", nil, 'open', 'locked', 'closed'
|
||||
should_not_allow_values_for :status, "other", "things", "1"
|
||||
|
||||
context "end_date" do
|
||||
should "be after start_date" do
|
||||
@contract = Contract.new(:start_date => Date.today, :end_date => Date.yesterday)
|
||||
@@ -32,6 +35,12 @@ class ContractTest < ActiveSupport::TestCase
|
||||
assert_equal false, @contract.executed
|
||||
end
|
||||
|
||||
should "default status to open" do
|
||||
@contract = Contract.new
|
||||
|
||||
assert_equal "open", @contract.status
|
||||
end
|
||||
|
||||
context "#labor_budget" do
|
||||
should "sum all of the labor budgets of the Deliverables" do
|
||||
contract = Contract.generate!
|
||||
|
||||
Reference in New Issue
Block a user