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 277 prompt_msg = _('Insert the name of the new cost:')
278 278 error_msg = _('Something went wrong. Please, try again')
279 279 select_tag('price_details[][production_cost_id]',
  280 + '<option value="" disabled="disabled">' + _('Select...') + '</option>' +
280 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 283 :onchange => "productionCostTypeChange(this, '#{url}', '#{prompt_msg}', '#{error_msg}')"})
284 284 end
285 285  
... ... @@ -288,6 +288,6 @@ module ManageProductsHelper
288 288 production_cost = args[:production_cost_value] || product.formatted_value(:total_production_cost)
289 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 292 end
293 293 end
... ...
app/models/input.rb
... ... @@ -59,4 +59,9 @@ class Input &lt; ActiveRecord::Base
59 59 return 0 if self.amount_used.blank? || self.price_per_unit.blank?
60 60 self.amount_used * self.price_per_unit
61 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 67 end
... ...
app/views/manage_products/_edit_price_details.rhtml
... ... @@ -5,7 +5,7 @@
5 5 <td>
6 6 <%= link_to_remote(_('Remove'),
7 7 :update => "price-detail-#{price_detail.id}",
8   - :success => "jQuery('#manage-product-details-form input.submit').removeAttr('disabled').removeClass('disabled');",
  8 + :complete => "calculateValuesForBar();",
9 9 :confirm => _('Are you sure that you want to remove this cost?'),
10 10 :url => { :action => 'remove_price_detail', :id => price_detail, :product => @product }) %>
11 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 3 <div id='price-described-notice' style='display:none;'>
4 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 30 <table id='new-cost-fields'>
31 31 <tr>
32 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 34 <td><%= link_to(_('Cancel'), '#', {:class => 'cancel-new-cost'}) %></td>
35 35 </tr>
36 36 </table>
37 37 </div>
  38 +
  39 +<%= render :partial => 'shared/numbers_only_javascript' %>
... ...
app/views/manage_products/_price_composition_bar.rhtml
1 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 5 var described = false;
  6 + var currency_format = { separator : '<%= environment.currency_separator %>', delimiter : '<%= environment.currency_delimiter %>', unit : '<%= environment.currency_unit %>' };
6 7 if (<%= @product.price_described? %>) {
7 8 var described = true;
8 9 }
... ...
public/javascripts/manage-products.js
... ... @@ -44,6 +44,7 @@
44 44  
45 45 $(".cancel-new-cost").live('click', function() {
46 46 $(this).parents('tr').remove();
  47 + calculateValuesForBar();
47 48 return false;
48 49 });
49 50  
... ... @@ -57,25 +58,12 @@
57 58 updatePriceCompositionBar(form);
58 59 inputs_cost_update_url = $(form).find('#inputs-cost-update-url').val();
59 60 $.get(inputs_cost_update_url, function(data){
60   - $(".inputs-cost").html(data);
  61 + $(".inputs-cost span").html(data);
61 62 });
62 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 68 function cancelPriceDetailsEdition() {
81 69 $("#manage-product-details-button").show();
... ... @@ -87,35 +75,84 @@
87 75 bar_url = $(form).find('.bar-update-url').val();
88 76 $.get(bar_url, function(data){
89 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 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 134 function productionCostTypeChange(select, url, question, error_msg) {
100 135 if (select.value == '') {
101 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 162 $(bar_area).find('#progressbar').progressbar({
126 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 167 if (described) {
131 168 $(bar_area).find('#progressbar-icon').addClass('ui-icon-check');
132 169 $(bar_area).find('#progressbar-icon').attr('title', $('#price-described-message').html());
... ...