preklad
This commit is contained in:
@@ -13,8 +13,8 @@ class DeliverablesController < ApplicationController
|
|||||||
|
|
||||||
@deliverable_count = Deliverable.count(:conditions => { :project_id => @project.id})
|
@deliverable_count = Deliverable.count(:conditions => { :project_id => @project.id})
|
||||||
@deliverable_pages = Paginator.new self, @deliverable_count, per_page_option, params['page']
|
@deliverable_pages = Paginator.new self, @deliverable_count, per_page_option, params['page']
|
||||||
@deliverables = Deliverable.find(:all,
|
@deliverables = Deliverable.find(:all,
|
||||||
{
|
{
|
||||||
:conditions => { :project_id => @project.id},
|
:conditions => { :project_id => @project.id},
|
||||||
:limit => per_page_option,
|
:limit => per_page_option,
|
||||||
:offset => @deliverable_pages.current.offset
|
:offset => @deliverable_pages.current.offset
|
||||||
@@ -22,7 +22,7 @@ class DeliverablesController < ApplicationController
|
|||||||
)
|
)
|
||||||
|
|
||||||
@deliverables = sort_if_needed @deliverables
|
@deliverables = sort_if_needed @deliverables
|
||||||
|
|
||||||
@deliverable = Deliverable.new
|
@deliverable = Deliverable.new
|
||||||
|
|
||||||
@budget = Budget.new(@project.id)
|
@budget = Budget.new(@project.id)
|
||||||
@@ -32,14 +32,15 @@ class DeliverablesController < ApplicationController
|
|||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.html { render :action => 'index', :layout => !request.xhr? }
|
format.html { render :action => 'index', :layout => !request.xhr? }
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# Action to preview the Deliverable description
|
# Action to preview the Deliverable description
|
||||||
def preview
|
def preview
|
||||||
@text = params[:deliverable][:description]
|
@text = params[:deliverable][:description]
|
||||||
render :partial => 'common/preview'
|
render :partial => 'common/preview'
|
||||||
end
|
end
|
||||||
|
|
||||||
# Saves a new Deliverable
|
# Saves a new Deliverable
|
||||||
def create
|
def create
|
||||||
if params[:deliverable][:type] == FixedDeliverable.name
|
if params[:deliverable][:type] == FixedDeliverable.name
|
||||||
@@ -49,7 +50,7 @@ class DeliverablesController < ApplicationController
|
|||||||
else
|
else
|
||||||
@deliverable = Deliverable.new(params[:deliverable])
|
@deliverable = Deliverable.new(params[:deliverable])
|
||||||
end
|
end
|
||||||
|
|
||||||
@deliverable.project = @project
|
@deliverable.project = @project
|
||||||
@budget = Budget.new(@project.id)
|
@budget = Budget.new(@project.id)
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
@@ -72,11 +73,11 @@ class DeliverablesController < ApplicationController
|
|||||||
# Updates an existing Deliverable, optionally changing it's type
|
# Updates an existing Deliverable, optionally changing it's type
|
||||||
def update
|
def update
|
||||||
@deliverable = Deliverable.find(params[:deliverable_id])
|
@deliverable = Deliverable.find(params[:deliverable_id])
|
||||||
|
|
||||||
if params[:deliverable][:type] != @deliverable.class
|
if params[:deliverable][:type] != @deliverable.class
|
||||||
@deliverable = @deliverable.change_type(params[:deliverable][:type])
|
@deliverable = @deliverable.change_type(params[:deliverable][:type])
|
||||||
end
|
end
|
||||||
|
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
if @deliverable.update_attributes(params[:deliverable])
|
if @deliverable.update_attributes(params[:deliverable])
|
||||||
@flash = l(:notice_successful_create)
|
@flash = l(:notice_successful_create)
|
||||||
@@ -86,20 +87,20 @@ class DeliverablesController < ApplicationController
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# Removes the Deliverable
|
# Removes the Deliverable
|
||||||
def destroy
|
def destroy
|
||||||
@deliverable = Deliverable.find_by_id_and_project_id(params[:deliverable_id], @project.id)
|
@deliverable = Deliverable.find_by_id_and_project_id(params[:deliverable_id], @project.id)
|
||||||
|
|
||||||
render_404 and return unless @deliverable
|
render_404 and return unless @deliverable
|
||||||
render_403 and return unless @deliverable.editable_by?(User.current)
|
render_403 and return unless @deliverable.editable_by?(User.current)
|
||||||
@deliverable.destroy
|
@deliverable.destroy
|
||||||
flash[:notice] = l(:notice_successful_delete)
|
flash[:notice] = l(:notice_successful_delete)
|
||||||
redirect_to :action => 'index', :id => @project.id
|
redirect_to :action => 'index', :id => @project.id
|
||||||
end
|
end
|
||||||
|
|
||||||
# Create a query in the session and redirects to the issue list with that query
|
# Create a query in the session and redirects to the issue list with that query
|
||||||
def issues
|
def issues
|
||||||
@query = Query.new(:name => "_")
|
@query = Query.new(:name => "_")
|
||||||
@@ -115,25 +116,25 @@ class DeliverablesController < ApplicationController
|
|||||||
|
|
||||||
redirect_to :controller => 'issues', :action => 'index', :project_id => @project.id
|
redirect_to :controller => 'issues', :action => 'index', :project_id => @project.id
|
||||||
end
|
end
|
||||||
|
|
||||||
# Assigns issues to the Deliverable based on their Version
|
# Assigns issues to the Deliverable based on their Version
|
||||||
def bulk_assign_issues
|
def bulk_assign_issues
|
||||||
@deliverable = Deliverable.find_by_id_and_project_id(params[:deliverable_id], @project.id)
|
@deliverable = Deliverable.find_by_id_and_project_id(params[:deliverable_id], @project.id)
|
||||||
|
|
||||||
render_404 and return unless @deliverable
|
render_404 and return unless @deliverable
|
||||||
render_403 and return unless @deliverable.editable_by?(User.current)
|
render_403 and return unless @deliverable.editable_by?(User.current)
|
||||||
|
|
||||||
number_updated = @deliverable.assign_issues_by_version(params[:version][:id])
|
number_updated = @deliverable.assign_issues_by_version(params[:version][:id])
|
||||||
|
|
||||||
flash[:notice] = l(:message_updated_issues, number_updated)
|
flash[:notice] = l(:message_updated_issues, number_updated)
|
||||||
redirect_to :action => 'index', :id => @project.id
|
redirect_to :action => 'index', :id => @project.id
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
def find_project
|
def find_project
|
||||||
@project = Project.find(params[:id])
|
@project = Project.find(params[:id])
|
||||||
end
|
end
|
||||||
|
|
||||||
def get_settings
|
def get_settings
|
||||||
@settings = Setting.plugin_budget_plugin
|
@settings = Setting.plugin_budget_plugin
|
||||||
end
|
end
|
||||||
@@ -146,7 +147,7 @@ class DeliverablesController < ApplicationController
|
|||||||
return { :order => sort_clause }
|
return { :order => sort_clause }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Sort +deliverables+ manually using the virtual fields
|
# Sort +deliverables+ manually using the virtual fields
|
||||||
def sort_if_needed(deliverables)
|
def sort_if_needed(deliverables)
|
||||||
if session[@sort_name] && %w(score spent progress labor_budget).include?(session[@sort_name][:key])
|
if session[@sort_name] && %w(score spent progress labor_budget).include?(session[@sort_name][:key])
|
||||||
@@ -167,5 +168,4 @@ class DeliverablesController < ApplicationController
|
|||||||
return deliverables
|
return deliverables
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
<div id="new-deliverable" style="<%= @display_form ? '' : 'display:none;' -%>">
|
<div id="new-deliverable" style="<%= @display_form ? '' : 'display:none;' -%>">
|
||||||
<h2><%= l(:label_new_deliverable) %></h2>
|
<h2><%= l(:label_new_deliverable) %></h2>
|
||||||
<% remote_form_for :deliverable, @deliverable, :url => {:controller => 'deliverables', :action => 'create', :id => @project },
|
<% remote_form_for :deliverable, @deliverable, :url => {:controller => 'deliverables', :action => 'create', :id => @project },
|
||||||
:method => :post, :builder => TabularFormBuilder, :lang => 'cs',
|
:method => :post, :builder => TabularFormBuilder, :lang => current_language,
|
||||||
:html => {:multipart => true, :id => 'deliverable-form', :class => 'tabular'} do |f| %>
|
:html => {:multipart => true, :id => 'deliverable-form', :class => 'tabular'} do |f| %>
|
||||||
<%= render :partial => 'form', :locals => { :mode => :create, :f => f } %>
|
<%= render :partial => 'form', :locals => { :mode => :create, :f => f } %>
|
||||||
<% end %>
|
<% end %>
|
||||||
@@ -28,5 +28,147 @@
|
|||||||
|
|
||||||
<% content_for :header_tags do %>
|
<% content_for :header_tags do %>
|
||||||
<%= stylesheet_link_tag "budget.css", :plugin => "budget_plugin", :media => "screen" %>
|
<%= stylesheet_link_tag "budget.css", :plugin => "budget_plugin", :media => "screen" %>
|
||||||
<%= javascript_include_tag('budget.js', :plugin => 'budget_plugin') %>
|
|
||||||
|
<% javascript_tag do %>
|
||||||
|
/* Used to calculate the Budget */
|
||||||
|
var BudgetModule = Class.create();
|
||||||
|
Object.extend(BudgetModule.prototype, {
|
||||||
|
initialize: function () {},
|
||||||
|
|
||||||
|
toAmount: function(value) {
|
||||||
|
var amount = value.replace(/[^1234567890.]/ig,'');
|
||||||
|
if (amount) {
|
||||||
|
return parseFloat(amount);
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
updateAmounts: function() {
|
||||||
|
if ($('deliverable_type').checked) {
|
||||||
|
// Fixed cost
|
||||||
|
var cost = Budget.toAmount($('deliverable_fixed_cost').value);
|
||||||
|
Budget.updateAmount($('fixedCost'), cost);
|
||||||
|
} else {
|
||||||
|
// Variable cost
|
||||||
|
var perHour = Budget.toAmount($('deliverable_cost_per_hour').value);
|
||||||
|
var hours = Budget.toAmount($('deliverable_total_hours').value);
|
||||||
|
|
||||||
|
var cost = perHour * hours;
|
||||||
|
Budget.updateAmount($('variableCost'), cost);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if ($('deliverable_overhead').value.match('%')) {
|
||||||
|
var overhead_subtotal = (Budget.toAmount($('deliverable_overhead').value) / 100) * cost;
|
||||||
|
} else {
|
||||||
|
var overhead_subtotal = Budget.toAmount($('deliverable_overhead').value);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($('deliverable_materials').value.match('%')) {
|
||||||
|
var materials_subtotal = (Budget.toAmount($('deliverable_materials').value) / 100) * cost;
|
||||||
|
} else {
|
||||||
|
var materials_subtotal = Budget.toAmount($('deliverable_materials').value);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Profit uses labor cost and overhead
|
||||||
|
if ($('deliverable_profit').value.match('%')) {
|
||||||
|
var profit_subtotal = (Budget.toAmount($('deliverable_profit').value) / 100) * (cost + overhead_subtotal);
|
||||||
|
} else {
|
||||||
|
var profit_subtotal = Budget.toAmount($('deliverable_profit').value);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Amounts
|
||||||
|
Budget.updateAmount($('overhead_subtotal'), overhead_subtotal);
|
||||||
|
Budget.updateAmount($('materials_subtotal'), materials_subtotal);
|
||||||
|
Budget.updateAmount($('profit_subtotal'), profit_subtotal);
|
||||||
|
|
||||||
|
var total = cost + overhead_subtotal + materials_subtotal + profit_subtotal;
|
||||||
|
$('deliverable_budget').value = total;
|
||||||
|
$('total-budget-calculation').innerHTML = Budget.number_to_currency(total);
|
||||||
|
},
|
||||||
|
|
||||||
|
updateAmount: function(element, value) {
|
||||||
|
if (element) {
|
||||||
|
element.innerHTML = Budget.number_to_currency(value);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
changeType: function() {
|
||||||
|
if ($('deliverable_type').checked) {
|
||||||
|
// Fixed
|
||||||
|
$$('.budget-hourly').each(function(ele) { ele.hide(); });
|
||||||
|
$$('.budget-fixed').each(function(ele) { ele.show(); });
|
||||||
|
} else {
|
||||||
|
// Variable
|
||||||
|
$$('.budget-hourly').each(function(ele) { ele.show(); });
|
||||||
|
$$('.budget-fixed').each(function(ele) { ele.hide(); });
|
||||||
|
}
|
||||||
|
|
||||||
|
Budget.updateAmounts();
|
||||||
|
},
|
||||||
|
// Rails-like number_to_currency currency formatting
|
||||||
|
// http://snippets.dzone.com/posts/show/4646
|
||||||
|
number_to_currency: function (number, options) {
|
||||||
|
try {
|
||||||
|
var options = options || {};
|
||||||
|
var precision = options["precision"] || 2;
|
||||||
|
var unit = options["unit"] || "<%= number_to_currency(0, :precision => 0).gsub('0', '') %>";
|
||||||
|
var separator = precision > 0 ? options["separator"] || "." : "";
|
||||||
|
var delimiter = options["delimiter"] || " ";
|
||||||
|
|
||||||
|
var parts = parseFloat(number).toFixed(precision).split('.');
|
||||||
|
|
||||||
|
<% if I18n.locale != :en %>
|
||||||
|
<%= "return Budget.number_with_delimiter(parts[0], delimiter) + separator + parts[1].toString() + unit;" %>
|
||||||
|
<% else %>
|
||||||
|
<%= "return unit + Budget.number_with_delimiter(parts[0], delimiter) + separator + parts[1].toString();" %>
|
||||||
|
<% end %>
|
||||||
|
} catch(e) {
|
||||||
|
return number;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
number_with_delimiter: function (number, delimiter, separator) {
|
||||||
|
try {
|
||||||
|
var delimiter = delimiter || ",";
|
||||||
|
var separator = separator || ".";
|
||||||
|
|
||||||
|
var parts = number.toString().split('.');
|
||||||
|
parts[0] = parts[0].replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1" + delimiter);
|
||||||
|
return parts.join(separator);
|
||||||
|
} catch(e) {
|
||||||
|
return number
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Budget = new BudgetModule();
|
||||||
|
|
||||||
|
function toggleAll() {
|
||||||
|
$$('.deliverable-details').each(function(ele) {
|
||||||
|
ele.toggle();
|
||||||
|
});
|
||||||
|
$$('.toggle').each(function(e) {
|
||||||
|
e.toggle();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function expandRow(deliverable_id) {
|
||||||
|
$('deliverable-details-'+ deliverable_id).show();
|
||||||
|
$('deliverable-description-'+ deliverable_id).show();
|
||||||
|
$$('.toggle_' + deliverable_id).each(function(e) {
|
||||||
|
e.toggle();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function collapseRow(deliverable_id) {
|
||||||
|
$('deliverable-details-'+ deliverable_id).hide();
|
||||||
|
$('deliverable-description-'+ deliverable_id).hide();
|
||||||
|
$$('.toggle_' + deliverable_id).each(function(e) {
|
||||||
|
e.toggle();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
<% end %>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|||||||
@@ -3,10 +3,6 @@ var BudgetModule = Class.create();
|
|||||||
Object.extend(BudgetModule.prototype, {
|
Object.extend(BudgetModule.prototype, {
|
||||||
initialize: function () {},
|
initialize: function () {},
|
||||||
|
|
||||||
// number to currency options
|
|
||||||
// var options = new Hash();
|
|
||||||
// options.set('delimiter', ' ');
|
|
||||||
//// options.set('unit', ' ');
|
|
||||||
toAmount: function(value) {
|
toAmount: function(value) {
|
||||||
var amount = value.replace(/[^1234567890.]/ig,'');
|
var amount = value.replace(/[^1234567890.]/ig,'');
|
||||||
if (amount) {
|
if (amount) {
|
||||||
|
|||||||
Reference in New Issue
Block a user