[#6441] Add a manual Contract#status

This commit is contained in:
Eric Davis
2011-08-08 11:48:35 -07:00
parent fbd38b3678
commit 9453b52c10
10 changed files with 136 additions and 19 deletions

View File

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

View File

@@ -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?

View File

@@ -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') %>

View File

@@ -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>
<% if group_contracts_by_status(collection)["locked"].empty? %>
<p class="nodata"><%= l(:label_no_data) %></p>
<p><%= release(5, "Contract Status. Split contracts by active and inactive") %></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>

View File

@@ -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'}) %>

View 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

View File

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

View File

@@ -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}/
@@ -57,6 +59,22 @@ class ContractsListTest < ActionController::IntegrationTest
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

View File

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

View File

@@ -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!