Commit e2854d1b648972bfdb0280bb07d4d5f6e9a63954

Authored by Caio Almeida
Committed by Daniela Feitosa
1 parent 87ef45c5

Fixing some things when a cost is added or removed

(ActionItem1413)
app/helpers/manage_products_helper.rb
@@ -277,9 +277,9 @@ module ManageProductsHelper @@ -277,9 +277,9 @@ module ManageProductsHelper
277 prompt_msg = _('Insert the name of the new cost:') 277 prompt_msg = _('Insert the name of the new cost:')
278 error_msg = _('Something went wrong. Please, try again') 278 error_msg = _('Something went wrong. Please, try again')
279 select_tag('price_details[][production_cost_id]', 279 select_tag('price_details[][production_cost_id]',
  280 + '<option value="" disabled="disabled">' + _('Select...') + '</option>' +
280 options_for_select(product.available_production_costs.map {|item| [truncate(item.name, 10, '...'), item.id]} + [[_('Other cost'), '']], selected), 281 options_for_select(product.available_production_costs.map {|item| [truncate(item.name, 10, '...'), item.id]} + [[_('Other cost'), '']], selected),
281 - {:include_blank => _('Select the cost'),  
282 - :class => 'production-cost-selection', 282 + {:class => 'production-cost-selection',
283 :onchange => "productionCostTypeChange(this, '#{url}', '#{prompt_msg}', '#{error_msg}')"}) 283 :onchange => "productionCostTypeChange(this, '#{url}', '#{prompt_msg}', '#{error_msg}')"})
284 end 284 end
285 285
@@ -288,6 +288,6 @@ module ManageProductsHelper @@ -288,6 +288,6 @@ module ManageProductsHelper
288 production_cost = args[:production_cost_value] || product.formatted_value(:total_production_cost) 288 production_cost = args[:production_cost_value] || product.formatted_value(:total_production_cost)
289 product_price = args[:product_price] || product.formatted_value(:price) 289 product_price = args[:product_price] || product.formatted_value(:price)
290 290
291 - _("%{currency} %{production_cost} of %{currency} %{product_price}") % {:currency => currency, :production_cost => content_tag('span', production_cost, :class => '.production_cost'), :product_price => content_tag('span', product_price, :class => 'product_price')} 291 + _("%{currency} %{production_cost} of %{currency} %{product_price}") % {:currency => currency, :production_cost => content_tag('span', production_cost, :class => 'production_cost'), :product_price => content_tag('span', product_price, :class => 'product_price')}
292 end 292 end
293 end 293 end
app/models/input.rb
@@ -59,4 +59,9 @@ class Input &lt; ActiveRecord::Base @@ -59,4 +59,9 @@ class Input &lt; ActiveRecord::Base
59 return 0 if self.amount_used.blank? || self.price_per_unit.blank? 59 return 0 if self.amount_used.blank? || self.price_per_unit.blank?
60 self.amount_used * self.price_per_unit 60 self.amount_used * self.price_per_unit
61 end 61 end
  62 +
  63 + def cost
  64 + return 0 if self.amount_used.blank? || self.price_per_unit.blank?
  65 + self.amount_used * self.price_per_unit
  66 + end
62 end 67 end
app/views/manage_products/_edit_price_details.rhtml
@@ -5,7 +5,7 @@ @@ -5,7 +5,7 @@
5 <td> 5 <td>
6 <%= link_to_remote(_('Remove'), 6 <%= link_to_remote(_('Remove'),
7 :update => "price-detail-#{price_detail.id}", 7 :update => "price-detail-#{price_detail.id}",
8 - :success => "jQuery('#manage-product-details-form input.submit').removeAttr('disabled').removeClass('disabled');", 8 + :complete => "calculateValuesForBar();",
9 :confirm => _('Are you sure that you want to remove this cost?'), 9 :confirm => _('Are you sure that you want to remove this cost?'),
10 :url => { :action => 'remove_price_detail', :id => price_detail, :product => @product }) %> 10 :url => { :action => 'remove_price_detail', :id => price_detail, :product => @product }) %>
11 </tr> 11 </tr>
app/views/manage_products/_inputs_cost.rhtml
1 -<%= float_to_currency(@product.inputs_cost) %> 1 +<span><%= float_to_currency(@product.inputs_cost) %></span>
2 2
3 <div id='price-described-notice' style='display:none;'> 3 <div id='price-described-notice' style='display:none;'>
4 <%= _("Congratulations! Now the product's price is open to the public") %> 4 <%= _("Congratulations! Now the product's price is open to the public") %>
app/views/manage_products/_manage_product_details.rhtml
@@ -30,8 +30,10 @@ @@ -30,8 +30,10 @@
30 <table id='new-cost-fields'> 30 <table id='new-cost-fields'>
31 <tr> 31 <tr>
32 <td><%= select_production_cost(@product) %></td> 32 <td><%= select_production_cost(@product) %></td>
33 - <td><%= labelled_form_field(environment.currency_unit, text_field_tag('price_details[][price]', nil, :class => 'price-details-price')) %></td> 33 + <td><%= labelled_form_field(environment.currency_unit, text_field_tag('price_details[][price]', nil, :class => 'numbers-only price-details-price')) %></td>
34 <td><%= link_to(_('Cancel'), '#', {:class => 'cancel-new-cost'}) %></td> 34 <td><%= link_to(_('Cancel'), '#', {:class => 'cancel-new-cost'}) %></td>
35 </tr> 35 </tr>
36 </table> 36 </table>
37 </div> 37 </div>
  38 +
  39 +<%= render :partial => 'shared/numbers_only_javascript' %>
app/views/manage_products/_price_composition_bar.rhtml
1 <% javascript_tag do %> 1 <% javascript_tag do %>
2 - var value = <%= @product.price_description_percentage %>  
3 - var total_cost = <%= @product.total_production_cost %>  
4 - var price = <%= @product.price %> 2 + var value = <%= @product.price_description_percentage %>;
  3 + var total_cost = <%= @product.total_production_cost %>;
  4 + var price = '<%= @product.formatted_value(:price) %>';
5 var described = false; 5 var described = false;
  6 + var currency_format = { separator : '<%= environment.currency_separator %>', delimiter : '<%= environment.currency_delimiter %>', unit : '<%= environment.currency_unit %>' };
6 if (<%= @product.price_described? %>) { 7 if (<%= @product.price_described? %>) {
7 var described = true; 8 var described = true;
8 } 9 }
public/javascripts/manage-products.js
@@ -44,6 +44,7 @@ @@ -44,6 +44,7 @@
44 44
45 $(".cancel-new-cost").live('click', function() { 45 $(".cancel-new-cost").live('click', function() {
46 $(this).parents('tr').remove(); 46 $(this).parents('tr').remove();
  47 + calculateValuesForBar();
47 return false; 48 return false;
48 }); 49 });
49 50
@@ -57,25 +58,12 @@ @@ -57,25 +58,12 @@
57 updatePriceCompositionBar(form); 58 updatePriceCompositionBar(form);
58 inputs_cost_update_url = $(form).find('#inputs-cost-update-url').val(); 59 inputs_cost_update_url = $(form).find('#inputs-cost-update-url').val();
59 $.get(inputs_cost_update_url, function(data){ 60 $.get(inputs_cost_update_url, function(data){
60 - $(".inputs-cost").html(data); 61 + $(".inputs-cost span").html(data);
61 }); 62 });
62 return false; 63 return false;
63 }); 64 });
64 65
65 - $("#manage-product-details-form .price-details-price").live('keydown', function(data) {  
66 - $('.cancel-price-details').addClass('form-changed');  
67 - var product_price = parseFloat($('form #product_price').val());  
68 - var total_cost = parseFloat($('#product_inputs_cost').val());  
69 -  
70 - $('form .price-details-price').each(function() {  
71 - total_cost = total_cost + parseFloat($(this).val());  
72 - });  
73 - enablePriceDetailSubmit();  
74 -  
75 - var described = (product_price - total_cost) == 0;  
76 - var percentage = total_cost * 100 / product_price;  
77 - priceCompositionBar(percentage, described, total_cost, product_price);  
78 - }); 66 + $("#manage-product-details-form .price-details-price").live('blur', function(data) { calculateValuesForBar(); });
79 67
80 function cancelPriceDetailsEdition() { 68 function cancelPriceDetailsEdition() {
81 $("#manage-product-details-button").show(); 69 $("#manage-product-details-button").show();
@@ -87,35 +75,84 @@ @@ -87,35 +75,84 @@
87 bar_url = $(form).find('.bar-update-url').val(); 75 bar_url = $(form).find('.bar-update-url').val();
88 $.get(bar_url, function(data){ 76 $.get(bar_url, function(data){
89 $("#price-composition-bar").html(data); 77 $("#price-composition-bar").html(data);
  78 + $('form #product_price').val(currencyToFloat($('#progressbar-text .product_price').html(), currency_format.separator, currency_format.delimiter));
  79 + $('form #product_inputs_cost').val(currencyToFloat($('#display-product-price-details .inputs-cost span').html(), currency_format.separator, currency_format.delimiter, currency_format.unit));
  80 + calculateValuesForBar();
90 }); 81 });
91 }; 82 };
92 83
93 - function enablePriceDetailSubmit() {  
94 - $('#manage-product-details-form input.submit').removeAttr("disabled").removeClass('disabled');  
95 - };  
96 -  
97 })(jQuery); 84 })(jQuery);
98 85
  86 +function enablePriceDetailSubmit() {
  87 + jQuery('#manage-product-details-form input.submit').removeAttr("disabled").removeClass('disabled');
  88 +}
  89 +
  90 +function calculateValuesForBar() {
  91 + jQuery('.cancel-price-details').addClass('form-changed');
  92 + var product_price = parseFloat(jQuery('form #product_price').val());
  93 + var total_cost = parseFloat(jQuery('form #product_inputs_cost').val());
  94 +
  95 + jQuery('form .price-details-price').each(function() {
  96 + var this_val = parseFloat(jQuery(this).val()) || 0;
  97 + total_cost = total_cost + this_val;
  98 + });
  99 + enablePriceDetailSubmit();
  100 +
  101 + var described = (product_price - total_cost) == 0;
  102 + var percentage = total_cost * 100 / product_price;
  103 + priceCompositionBar(percentage, described, total_cost, product_price);
  104 +}
  105 +
  106 +function addCommas(nStr) {
  107 + nStr += '';
  108 + var x = nStr.split('.');
  109 + var x1 = x[0];
  110 + var x2 = x.length > 1 ? '.' + x[1] : '';
  111 + var rgx = /(\d+)(\d{3})/;
  112 + while (rgx.test(x1)) {
  113 + x1 = x1.replace(rgx, '$1' + ',' + '$2');
  114 + }
  115 + return x1 + x2;
  116 +}
  117 +
  118 +function floatToCurrency(value, sep, del, cur) {
  119 + var ret = '';
  120 + if (cur) ret = cur + ' ';
  121 + if (!sep) sep = '.';
  122 + if (!del) del = ',';
  123 + return ret + addCommas(parseFloat(value).toFixed(2).toString()).replace('.', '%sep%').replace(',', del).replace('%sep%', sep);
  124 +}
  125 +
  126 +function currencyToFloat(value, sep, del, cur) {
  127 + var val = value;
  128 + if (cur) val.replace(cur + ' ', '');
  129 + if (!sep) sep = '.';
  130 + if (!del) del = ',';
  131 + return parseFloat(val.replace(del, '').replace(sep, '.'));
  132 +}
  133 +
99 function productionCostTypeChange(select, url, question, error_msg) { 134 function productionCostTypeChange(select, url, question, error_msg) {
100 if (select.value == '') { 135 if (select.value == '') {
101 var newType = prompt(question); 136 var newType = prompt(question);
102 - jQuery.ajax({  
103 - url: url + "/" + newType,  
104 - dataType: 'json',  
105 - success: function(data, status, ajax){  
106 - if (data.ok) {  
107 - var opt = jQuery('<option value="' + data.id + '">' + newType + '</option>');  
108 - opt.insertBefore(jQuery("option:last", select));  
109 - select.selectedIndex = select.options.length - 2;  
110 - opt.clone().insertBefore('#new-cost-fields .production-cost-selection option:last');  
111 - } else {  
112 - alert(data.error_msg); 137 + if (newType) {
  138 + jQuery.ajax({
  139 + url: url + "/" + newType,
  140 + dataType: 'json',
  141 + success: function(data, status, ajax){
  142 + if (data.ok) {
  143 + var opt = jQuery('<option value="' + data.id + '">' + newType + '</option>');
  144 + opt.insertBefore(jQuery("option:last", select));
  145 + select.selectedIndex = select.options.length - 2;
  146 + opt.clone().insertBefore('#new-cost-fields .production-cost-selection option:last');
  147 + } else {
  148 + alert(data.error_msg);
  149 + }
  150 + },
  151 + error: function(ajax, status, error){
  152 + alert(error_msg);
113 } 153 }
114 - },  
115 - error: function(ajax, status, error){  
116 - alert(error_msg);  
117 - }  
118 - }); 154 + });
  155 + }
119 } 156 }
120 } 157 }
121 158
@@ -125,8 +162,8 @@ function priceCompositionBar(value, described, total_cost, price) { @@ -125,8 +162,8 @@ function priceCompositionBar(value, described, total_cost, price) {
125 $(bar_area).find('#progressbar').progressbar({ 162 $(bar_area).find('#progressbar').progressbar({
126 value: value 163 value: value
127 }); 164 });
128 - $(bar_area).find('.production-cost').html(total_cost.toFixed(2));  
129 - $(bar_area).find('.product_price').html(price.toFixed(2)); 165 + $(bar_area).find('.production_cost').html(floatToCurrency(total_cost, currency_format.separator, currency_format.delimiter));
  166 + $(bar_area).find('.product_price').html(floatToCurrency(price, currency_format.separator, currency_format.delimiter));
130 if (described) { 167 if (described) {
131 $(bar_area).find('#progressbar-icon').addClass('ui-icon-check'); 168 $(bar_area).find('#progressbar-icon').addClass('ui-icon-check');
132 $(bar_area).find('#progressbar-icon').attr('title', $('#price-described-message').html()); 169 $(bar_area).find('#progressbar-icon').attr('title', $('#price-described-message').html());