Commit fe61ff4dba71505555c48eae9d81ef70d2dc19c8

Authored by Daniela Feitosa
1 parent 40b3903a

Revert "Added feature to describe the costs of a product"

This reverts commit 1ebe4f84dc0910b6ded065b60ed0e58612a93659.

Conflicts:

	features/step_definitions/noosfero_steps.rb
	test/functional/manage_products_controller_test.rb
app/controllers/my_profile/manage_products_controller.rb
@@ -103,26 +103,6 @@ class ManageProductsController < ApplicationController @@ -103,26 +103,6 @@ class ManageProductsController < ApplicationController
103 end 103 end
104 end 104 end
105 105
106 - def manage_product_details  
107 - @product = @profile.products.find(params[:id])  
108 - if request.post?  
109 - @product.update_price_details(params[:price_details]) if params[:price_details]  
110 - render :partial => 'display_price_details'  
111 - else  
112 - render :partial => 'manage_product_details'  
113 - end  
114 - end  
115 -  
116 - def remove_price_detail  
117 - @product = @profile.products.find(params[:product])  
118 - @price_detail = @product.price_details.find(params[:id])  
119 - @product = @price_detail.product  
120 - if request.post?  
121 - @price_detail.destroy  
122 - render :nothing => true  
123 - end  
124 - end  
125 -  
126 def destroy 106 def destroy
127 @product = @profile.products.find(params[:id]) 107 @product = @profile.products.find(params[:id])
128 if @product.destroy 108 if @product.destroy
@@ -179,18 +159,4 @@ class ManageProductsController < ApplicationController @@ -179,18 +159,4 @@ class ManageProductsController < ApplicationController
179 end 159 end
180 end 160 end
181 161
182 - def create_production_cost  
183 - cost = @profile.production_costs.create(:name => params[:id])  
184 - if cost.valid?  
185 - cost.save  
186 - render :text => {:name => cost.name,  
187 - :id => cost.id,  
188 - :ok => true  
189 - }.to_json  
190 - else  
191 - render :text => {:ok => false,  
192 - :error_msg => _(cost.errors['name']) % {:fn => _('Name')}  
193 - }.to_json  
194 - end  
195 - end  
196 end 162 end
app/helpers/manage_products_helper.rb
@@ -271,15 +271,4 @@ module ManageProductsHelper @@ -271,15 +271,4 @@ module ManageProductsHelper
271 return input_amount_used if input.unit.blank? 271 return input_amount_used if input.unit.blank?
272 n_('1 %{singular_unit}', '%{num} %{plural_unit}', input.amount_used.to_f) % { :num => input_amount_used, :singular_unit => content_tag('span', input.unit.singular, :class => 'input-unit'), :plural_unit => content_tag('span', input.unit.plural, :class => 'input-unit') } 272 n_('1 %{singular_unit}', '%{num} %{plural_unit}', input.amount_used.to_f) % { :num => input_amount_used, :singular_unit => content_tag('span', input.unit.singular, :class => 'input-unit'), :plural_unit => content_tag('span', input.unit.plural, :class => 'input-unit') }
273 end 273 end
274 -  
275 - def select_production_cost(product,selected=nil)  
276 - url = url_for( :controller => 'manage_products', :action => 'create_production_cost' )  
277 - prompt_msg = _('Insert the name of the new cost:')  
278 - error_msg = _('Something went wrong. Please, try again')  
279 - select_tag('price_details[][production_cost_id]',  
280 - 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',  
283 - :onchange => "productionCostTypeChange(this, '#{url}', '#{prompt_msg}', '#{error_msg}')"})  
284 - end  
285 end 274 end
app/models/enterprise.rb
@@ -6,7 +6,6 @@ class Enterprise < Organization @@ -6,7 +6,6 @@ class Enterprise < Organization
6 6
7 has_many :products, :dependent => :destroy, :order => 'name ASC' 7 has_many :products, :dependent => :destroy, :order => 'name ASC'
8 has_many :inputs, :through => :products 8 has_many :inputs, :through => :products
9 - has_many :production_costs, :as => :owner  
10 9
11 has_and_belongs_to_many :fans, :class_name => 'Person', :join_table => 'favorite_enteprises_people' 10 has_and_belongs_to_many :fans, :class_name => 'Person', :join_table => 'favorite_enteprises_people'
12 11
@@ -167,4 +166,5 @@ class Enterprise < Organization @@ -167,4 +166,5 @@ class Enterprise < Organization
167 def enable_contact? 166 def enable_contact?
168 enable_contact_us 167 enable_contact_us
169 end 168 end
  169 +
170 end 170 end
app/models/environment.rb
@@ -162,7 +162,6 @@ class Environment < ActiveRecord::Base @@ -162,7 +162,6 @@ class Environment < ActiveRecord::Base
162 acts_as_accessible 162 acts_as_accessible
163 163
164 has_many :units, :order => 'position' 164 has_many :units, :order => 'position'
165 - has_many :production_costs, :as => :owner  
166 165
167 def superior_intances 166 def superior_intances
168 [self, nil] 167 [self, nil]
app/models/input.rb
@@ -47,9 +47,4 @@ class Input < ActiveRecord::Base @@ -47,9 +47,4 @@ class Input < ActiveRecord::Base
47 end 47 end
48 return false 48 return false
49 end 49 end
50 -  
51 - def cost  
52 - return 0 if self.amount_used.blank? || self.price_per_unit.blank?  
53 - self.amount_used * self.price_per_unit  
54 - end  
55 end 50 end
app/models/price_detail.rb
@@ -1,27 +0,0 @@ @@ -1,27 +0,0 @@
1 -class PriceDetail < ActiveRecord::Base  
2 -  
3 - belongs_to :product  
4 - validates_presence_of :product_id  
5 -  
6 - belongs_to :production_cost  
7 - validates_presence_of :production_cost_id  
8 - validates_uniqueness_of :production_cost_id, :scope => :product_id  
9 -  
10 - def price  
11 - self[:price] || 0  
12 - end  
13 -  
14 - include FloatHelper  
15 - def price=(value)  
16 - if value.is_a?(String)  
17 - super(decimal_to_float(value))  
18 - else  
19 - super(value)  
20 - end  
21 - end  
22 -  
23 - def formatted_value(value)  
24 - ("%.2f" % self[value]).to_s.gsub('.', product.enterprise.environment.currency_separator) if self[value]  
25 - end  
26 -  
27 -end  
app/models/product.rb
@@ -5,8 +5,6 @@ class Product &lt; ActiveRecord::Base @@ -5,8 +5,6 @@ class Product &lt; ActiveRecord::Base
5 has_many :product_qualifiers 5 has_many :product_qualifiers
6 has_many :qualifiers, :through => :product_qualifiers 6 has_many :qualifiers, :through => :product_qualifiers
7 has_many :inputs, :dependent => :destroy, :order => 'position' 7 has_many :inputs, :dependent => :destroy, :order => 'position'
8 - has_many :price_details, :dependent => :destroy  
9 - has_many :production_costs, :through => :price_details  
10 8
11 validates_uniqueness_of :name, :scope => :enterprise_id, :allow_nil => true 9 validates_uniqueness_of :name, :scope => :enterprise_id, :allow_nil => true
12 validates_presence_of :product_category_id 10 validates_presence_of :product_category_id
@@ -103,9 +101,8 @@ class Product &lt; ActiveRecord::Base @@ -103,9 +101,8 @@ class Product &lt; ActiveRecord::Base
103 enterprise.public_profile 101 enterprise.public_profile
104 end 102 end
105 103
106 - def formatted_value(method)  
107 - value = self[method] || self.send(method)  
108 - ("%.2f" % value).to_s.gsub('.', enterprise.environment.currency_separator) if value 104 + def formatted_value(value)
  105 + ("%.2f" % self[value]).to_s.gsub('.', enterprise.environment.currency_separator) if self[value]
109 end 106 end
110 107
111 def price_with_discount 108 def price_with_discount
@@ -152,30 +149,4 @@ class Product &lt; ActiveRecord::Base @@ -152,30 +149,4 @@ class Product &lt; ActiveRecord::Base
152 unit.blank? ? name : "#{name} - #{unit.name.downcase}" 149 unit.blank? ? name : "#{name} - #{unit.name.downcase}"
153 end 150 end
154 151
155 - def inputs_cost  
156 - return 0 if inputs.empty?  
157 - inputs.map(&:cost).inject { |sum,price| sum + price }  
158 - end  
159 -  
160 - def total_production_cost  
161 - return inputs_cost if price_details.empty?  
162 - inputs_cost + price_details.map(&:price).inject { |sum,price| sum + price }  
163 - end  
164 -  
165 - def price_described?  
166 - return false if price.nil?  
167 - (price - total_production_cost).zero?  
168 - end  
169 -  
170 - def update_price_details(price_details)  
171 - self.price_details.destroy_all  
172 - price_details.each do |price_detail|  
173 - self.price_details.create(price_detail)  
174 - end  
175 - end  
176 -  
177 - def available_production_costs  
178 - self.enterprise.environment.production_costs + self.enterprise.production_costs  
179 - end  
180 -  
181 end 152 end
app/models/production_cost.rb
@@ -1,8 +0,0 @@ @@ -1,8 +0,0 @@
1 -class ProductionCost < ActiveRecord::Base  
2 -  
3 - belongs_to :owner, :polymorphic => true  
4 - validates_presence_of :owner  
5 - validates_presence_of :name  
6 - validates_length_of :name, :maximum => 30, :allow_blank => true  
7 - validates_uniqueness_of :name, :scope => [:owner_id, :owner_type]  
8 -end  
app/views/layouts/_javascript.rhtml
1 -<%= javascript_include_tag :defaults, 'jquery-latest.js', 'jquery.noconflict.js', 'jquery.cycle.all.min.js', 'thickbox.js', 'lightbox', 'jquery-ui-1.8.2.custom.min', 'jquery.scrollTo', 'jquery.form.js', 'jquery.cookie', 'reflection', 'add-and-join', 'manage-products', :cache => 'cache-general' %> 1 +<%= javascript_include_tag :defaults, 'jquery-latest.js', 'jquery.noconflict.js', 'jquery.cycle.all.min.js', 'thickbox.js', 'lightbox', 'jquery-ui-1.8.2.custom.min', 'jquery.scrollTo', 'jquery.form.js', 'jquery.cookie', 'reflection', 'add-and-join', :cache => 'cache-general' %>
app/views/layouts/application.rhtml
@@ -27,8 +27,11 @@ @@ -27,8 +27,11 @@
27 <%# Add custom tags/styles/etc via content_for %> 27 <%# Add custom tags/styles/etc via content_for %>
28 <%= yield :head %> 28 <%= yield :head %>
29 <%= javascript_tag('render_all_jquery_ui_widgets()') %> 29 <%= javascript_tag('render_all_jquery_ui_widgets()') %>
30 -  
31 - <%= render :partial => 'shared/numbers_only_javascript' %> 30 + <script type="text/javascript">
  31 + jQuery(".numbers-only").keypress(function(event) {
  32 + return numbersonly(event, '<%= environment.currency_separator %>')
  33 + });
  34 + </script>
32 </head> 35 </head>
33 36
34 <body class='noosfero category<%= category_color %><%= 37 <body class='noosfero category<%= category_color %><%=
app/views/manage_products/_display_price_details.rhtml
@@ -1,19 +0,0 @@ @@ -1,19 +0,0 @@
1 -<div id='display-manage-price-details'></div>  
2 -  
3 -<% if @product.price_described? %>  
4 - <div id='display-price-details'>  
5 - <div id='price-details-title'><%= _('Price composition') %></div>  
6 - <ul class='price-details-list'>  
7 - <li>  
8 - <div class='price-detail-name'><%= _('Inputs:') %></div>  
9 - <div class='price-detail-price'><%= float_to_currency(@product.inputs_cost) %></div>  
10 - </li>  
11 - <% @product.price_details.each do |price_detail| %>  
12 - <li>  
13 - <div class='price-detail-name'><%= "%s:" % price_detail.production_cost.name %></div>  
14 - <div class='price-detail-price'><%= float_to_currency(price_detail.price) %></div>  
15 - </li>  
16 - <% end %>  
17 - </ul>  
18 - </div>  
19 -<% end %>  
app/views/manage_products/_edit_info.rhtml
@@ -55,4 +55,9 @@ @@ -55,4 +55,9 @@
55 <% end %> 55 <% end %>
56 <% end %> 56 <% end %>
57 57
58 -<%= render :partial => 'shared/numbers_only_javascript' %> 58 +<% javascript_tag do %>
  59 + jQuery(".numbers-only").keypress(function(event) {
  60 + var separator = "<%= environment.currency_separator %>"
  61 + return numbersonly(event, separator)
  62 + });
  63 +<% end %>
app/views/manage_products/_edit_price_details.rhtml
@@ -1,13 +0,0 @@ @@ -1,13 +0,0 @@
1 -<% price_details.each do |price_detail| %>  
2 - <tr id='<%= "price-detail-#{price_detail.id}" %>'>  
3 - <td><%= select_production_cost(@product, price_detail.production_cost_id) %></td>  
4 - <td><%= labelled_form_field(environment.currency_unit, text_field_tag('price_details[][price]', price_detail.formatted_value(:price), :class => 'price-details-price numbers-only')) %></td>  
5 - <td>  
6 - <%= button_to_remote(:remove, _('Remove'),  
7 - :update => "price-detail-#{price_detail.id}",  
8 - :confirm => _('Are you sure that you want to remove this cost?'),  
9 - :url => { :action => 'remove_price_detail', :id => price_detail, :product => @product }) %>  
10 - </tr>  
11 -<% end %>  
12 -  
13 -<%= render :partial => 'shared/numbers_only_javascript' %>  
app/views/manage_products/_manage_product_details.rhtml
@@ -1,53 +0,0 @@ @@ -1,53 +0,0 @@
1 -<%= button(:add, _('New cost'), '#', :id => 'add-new-cost') %>  
2 -  
3 -<% javascript_tag do %>  
4 - jQuery(function($) {  
5 - $('#progressbar').progressbar({  
6 - value: <%= @product.total_production_cost %>  
7 - });  
8 - if (<%= @product.price_described? %>) {  
9 - $('#progressbar-icon').addClass('ui-icon-check');  
10 - $('#progressbar-icon').attr('title', $('#price-described-message').html());  
11 - $('div.ui-progressbar-value').addClass('price-described');  
12 - }  
13 - });  
14 -<% end %>  
15 -  
16 -<div id="price-details-info">  
17 - <div id="details-progressbar">  
18 - <div id='progressbar'></div>  
19 - <div id='progressbar-text'><%= "%{currency}%{product_price}" % {:currency => environment.currency_unit, :production_cost_value => @product.total_production_cost, :product_price => @product.formatted_value(:price)} %></div>  
20 - </div>  
21 - <div id='progressbar-icon' class='ui-icon ui-icon-info' title='<%= _("The production cost of your product is not described yet. If you want to display the price composition, please add all the costs") %>'></div>  
22 - <div id='price-described-message' style='display:none'><%= _("The production cost of your product is fully described and will be displayed on your product's page") %></div>  
23 -</div>  
24 -  
25 -<% form_tag({:action => 'manage_product_details'}, :method => 'post', :id => 'manage-product-details-form') do %>  
26 - <div>  
27 - <table id='display-product-price-details'>  
28 - <tr>  
29 - <td><%= _('Inputs') %></td>  
30 - <td colspan='2' class='inputs-cost'><%= float_to_currency(@product.inputs_cost) %></td>  
31 - </tr>  
32 - <%= render :partial => 'edit_price_details', :locals => {:price_details => @product.price_details} %>  
33 - </table>  
34 - </div>  
35 -  
36 - <% button_bar do %>  
37 - <%= submit_button :save, _('Save') %>  
38 - <%= button(:cancel, _('Cancel'), '#', :class => 'cancel-price-details') %>  
39 - <span class='loading-area'></span>  
40 - <% end %>  
41 -  
42 -<% end %>  
43 -  
44 -<div style='display:none'>  
45 - <table id='new-cost-fields'>  
46 - <tr>  
47 - <td><%= select_production_cost(@product) %></td>  
48 - <td><%= labelled_form_field(environment.currency_unit, text_field_tag('price_details[][price]', nil, :class => 'price-details-price')) %></td>  
49 - <td><%= link_to(_('Cancel'), '#', {:class => 'cancel-new-cost'}) %></td>  
50 - </tr>  
51 - </table>  
52 -</div>  
53 -  
app/views/manage_products/_price_details_button.rhtml
@@ -1,10 +0,0 @@ @@ -1,10 +0,0 @@
1 -<%= edit_ui_button(  
2 - _('Describe here the cost of production'),  
3 - {:action => 'manage_product_details', :id => @product.id},  
4 - :id => 'manage-product-details-button',  
5 - 'data-primary-icon' => 'ui-icon-pencil',  
6 - 'data-secondary-icon' => 'ui-icon-triangle-1-s',  
7 - :title => _('Describe details about how the price was defined')  
8 -) %>  
9 -<%= javascript_tag("render_jquery_ui_buttons('manage-product-details-button')") %>  
10 -<span class='loading-area'></span>  
app/views/manage_products/show.rhtml
@@ -42,11 +42,6 @@ @@ -42,11 +42,6 @@
42 </div> 42 </div>
43 <% end %> 43 <% end %>
44 44
45 - <div id='product-price-details'>  
46 - <%= render :partial => 'manage_products/display_price_details' %>  
47 - <%= render :partial => 'manage_products/price_details_button' %>  
48 - </div>  
49 -  
50 </div> 45 </div>
51 46
52 <% button_bar do %> 47 <% button_bar do %>
app/views/shared/_numbers_only_javascript.rhtml
@@ -1,6 +0,0 @@ @@ -1,6 +0,0 @@
1 -<% javascript_tag do %>  
2 - jQuery(".numbers-only").keypress(function(event) {  
3 - var separator = "<%= environment.currency_separator %>"  
4 - return numbersonly(event, separator)  
5 - });  
6 -<% end %>  
db/migrate/20110403184315_create_production_cost.rb
@@ -1,13 +0,0 @@ @@ -1,13 +0,0 @@
1 -class CreateProductionCost < ActiveRecord::Migration  
2 - def self.up  
3 - create_table :production_costs do |t|  
4 - t.string :name  
5 - t.references :owner, :polymorphic => true  
6 - t.timestamps  
7 - end  
8 - end  
9 -  
10 - def self.down  
11 - drop_table :production_costs  
12 - end  
13 -end  
db/migrate/20110403193953_create_price_details.rb
@@ -1,14 +0,0 @@ @@ -1,14 +0,0 @@
1 -class CreatePriceDetails < ActiveRecord::Migration  
2 - def self.up  
3 - create_table :price_details do |t|  
4 - t.decimal :price, :default => 0  
5 - t.references :product  
6 - t.references :production_cost  
7 - t.timestamps  
8 - end  
9 - end  
10 -  
11 - def self.down  
12 - drop_table :price_details  
13 - end  
14 -end  
@@ -9,7 +9,7 @@ @@ -9,7 +9,7 @@
9 # 9 #
10 # It's strongly recommended to check this file into your version control system. 10 # It's strongly recommended to check this file into your version control system.
11 11
12 -ActiveRecord::Schema.define(:version => 20110403193953) do 12 +ActiveRecord::Schema.define(:version => 20110316171323) do
13 13
14 create_table "action_tracker", :force => true do |t| 14 create_table "action_tracker", :force => true do |t|
15 t.integer "user_id" 15 t.integer "user_id"
@@ -315,14 +315,6 @@ ActiveRecord::Schema.define(:version =&gt; 20110403193953) do @@ -315,14 +315,6 @@ ActiveRecord::Schema.define(:version =&gt; 20110403193953) do
315 t.datetime "updated_at" 315 t.datetime "updated_at"
316 end 316 end
317 317
318 - create_table "price_details", :force => true do |t|  
319 - t.decimal "price", :default => 0.0  
320 - t.integer "product_id"  
321 - t.integer "production_cost_id"  
322 - t.datetime "created_at"  
323 - t.datetime "updated_at"  
324 - end  
325 -  
326 create_table "product_categorizations", :force => true do |t| 318 create_table "product_categorizations", :force => true do |t|
327 t.integer "category_id" 319 t.integer "category_id"
328 t.integer "product_id" 320 t.integer "product_id"
@@ -342,14 +334,6 @@ ActiveRecord::Schema.define(:version =&gt; 20110403193953) do @@ -342,14 +334,6 @@ ActiveRecord::Schema.define(:version =&gt; 20110403193953) do
342 t.datetime "updated_at" 334 t.datetime "updated_at"
343 end 335 end
344 336
345 - create_table "production_costs", :force => true do |t|  
346 - t.string "name"  
347 - t.integer "owner_id"  
348 - t.string "owner_type"  
349 - t.datetime "created_at"  
350 - t.datetime "updated_at"  
351 - end  
352 -  
353 create_table "products", :force => true do |t| 337 create_table "products", :force => true do |t|
354 t.integer "enterprise_id" 338 t.integer "enterprise_id"
355 t.integer "product_category_id" 339 t.integer "product_category_id"
features/manage_product_price_details.feature
@@ -1,148 +0,0 @@ @@ -1,148 +0,0 @@
1 -  
2 -Feature: manage product price details  
3 - As an enterprise owner  
4 - I want to manage the details of product's price  
5 -  
6 - Background:  
7 - Given the following users  
8 - | login | name |  
9 - | joaosilva | Joao Silva |  
10 - And the following enterprises  
11 - | identifier | owner | name | enabled |  
12 - | redemoinho | joaosilva | Rede Moinho | true |  
13 - Given the following product_category  
14 - | name |  
15 - | Music |  
16 - And the following product_categories  
17 - | name | parent |  
18 - | Rock | music |  
19 - | CD Player | music |  
20 - And the following product  
21 - | owner | category | name | price |  
22 - | redemoinho | rock | Abbey Road | 80.0 |  
23 - And feature "disable_products_for_enterprises" is disabled on environment  
24 - And the following inputs  
25 - | product | category | price_per_unit | amount_used |  
26 - | Abbey Road | Rock | 10.0 | 2 |  
27 - | Abbey Road | CD Player | 20.0 | 2 |  
28 - And the following production cost  
29 - | name | owner |  
30 - | Taxes | environment |  
31 -  
32 - @selenium  
33 - Scenario: list total value of inputs as price details  
34 - Given I am logged in as "joaosilva"  
35 - When I go to Rede Moinho's page of product Abbey Road  
36 - And I follow "Describe here the cost of production"  
37 - Then I should see "Inputs"  
38 - And I should see "60.0" within ".inputs-cost"  
39 -  
40 - @selenium  
41 - Scenario: cancel management of price details  
42 - Given I am logged in as "joaosilva"  
43 - When I go to Rede Moinho's page of product Abbey Road  
44 - And I follow "Describe here the cost of production"  
45 - When I follow "Cancel"  
46 - Then I should see "Describe here the cost of production"  
47 -  
48 - @selenium  
49 - Scenario: return to product after save  
50 - Given I am logged in as "joaosilva"  
51 - When I go to Rede Moinho's page of product Abbey Road  
52 - And I follow "Describe here the cost of production"  
53 - And I press "Save"  
54 - Then I should be on Rede Moinho's page of product Abbey Road  
55 -  
56 - @selenium  
57 - Scenario: add first item on price details  
58 - Given I am logged in as "joaosilva"  
59 - When I go to Rede Moinho's page of product Abbey Road  
60 - And I follow "Describe here the cost of production"  
61 - And I follow "New cost"  
62 - And I select "Taxes"  
63 - And I fill in "$" with "5.00"  
64 - And I press "Save"  
65 - Then I should not see "Save"  
66 - And I should see "Describe here the cost of production"  
67 -  
68 - @selenium  
69 - Scenario: edit a production cost  
70 - Given the following production cost  
71 - | name | owner |  
72 - | Energy | environment |  
73 - Given I am logged in as "joaosilva"  
74 - When I go to Rede Moinho's page of product Abbey Road  
75 - And I follow "Describe here the cost of production"  
76 - And I follow "New cost"  
77 - And I select "Taxes"  
78 - And I fill in "$" with "20.00"  
79 - And I press "Save"  
80 - Then I should not see "Save"  
81 - And I should see "Taxes" within "#display-price-details"  
82 - When I follow "Describe here the cost of production"  
83 - And I select "Energy"  
84 - And I press "Save"  
85 - And I should not see "Taxes" within "#display-price-details"  
86 - And I should see "Energy" within "#display-price-details"  
87 -  
88 - Scenario: not display product detail button if product does not have input  
89 - Given the following product  
90 - | owner | category | name |  
91 - | redemoinho | rock | Yellow Submarine |  
92 - And the following user  
93 - | login | name |  
94 - | mariasouza | Maria Souza |  
95 - And I am logged in as "mariasouza"  
96 - When I go to Rede Moinho's page of product Yellow Submarine  
97 - Then I should not see "Describe here the cost of production"  
98 -  
99 - Scenario: not display price details if price is not fully described  
100 - Given I go to Rede Moinho's page of product Abbey Road  
101 - Then I should not see "60.0"  
102 -  
103 - @selenium  
104 - Scenario: display price details if price is fully described  
105 - Given I am logged in as "joaosilva"  
106 - And I go to Rede Moinho's page of product Abbey Road  
107 - And I follow "Describe here the cost of production"  
108 - And I follow "New cost"  
109 - And I select "Taxes"  
110 - And I fill in "$" with "20.00"  
111 - And I press "Save"  
112 - Then I should see "Inputs" within ".price-detail-name"  
113 - And I should see "60.0" within ".price-detail-price"  
114 -  
115 - @selenium  
116 - Scenario: create a new cost clicking on select  
117 - Given I am logged in as "joaosilva"  
118 - And I go to Rede Moinho's page of product Abbey Road  
119 - And I follow "Describe here the cost of production"  
120 - And I want to add "Energy" as cost  
121 - And I select "Other cost"  
122 - And I press "Save"  
123 - When I follow "Describe here the cost of production"  
124 - Then I should see "Energy" within ".production-cost-selection"  
125 -  
126 - @selenium  
127 - Scenario: add created cost on new-cost-fields  
128 - Given I am logged in as "joaosilva"  
129 - And I go to Rede Moinho's page of product Abbey Road  
130 - And I follow "Describe here the cost of production"  
131 - And I want to add "Energy" as cost  
132 - And I select "Other cost"  
133 - Then I should see "Energy" within "#new-cost-fields"  
134 -  
135 - @selenium  
136 - Scenario: remove price detail  
137 - Given the following price detail  
138 - | product | production_cost | price |  
139 - | Abbey Road | Taxes | 20.0 |  
140 - And I am logged in as "joaosilva"  
141 - And I go to Rede Moinho's page of product Abbey Road  
142 - And I follow "Describe here the cost of production"  
143 - And I should see "Taxes" within "#manage-product-details-form"  
144 - When I follow "Remove" within "#manage-product-details-form"  
145 - And I confirm  
146 - And I press "Save"  
147 - And I follow "Describe here the cost of production"  
148 - Then I should not see "Taxes" within "#manage-product-details-form"  
features/step_definitions/noosfero_steps.rb
@@ -180,22 +180,6 @@ Given /^the following certifiers$/ do |table| @@ -180,22 +180,6 @@ Given /^the following certifiers$/ do |table|
180 end 180 end
181 end 181 end
182 182
183 -Given /^the following production costs?$/ do |table|  
184 - table.hashes.map{|item| item.dup}.each do |item|  
185 - owner_type = item.delete('owner')  
186 - owner = owner_type == 'environment' ? Environment.default : Profile[owner_type]  
187 - ProductionCost.create!(item.merge(:owner => owner))  
188 - end  
189 -end  
190 -  
191 -Given /^the following price details?$/ do |table|  
192 - table.hashes.map{|item| item.dup}.each do |item|  
193 - product = Product.find_by_name item.delete('product')  
194 - production_cost = ProductionCost.find_by_name item.delete('production_cost')  
195 - product.price_details.create!(item.merge(:production_cost => production_cost))  
196 - end  
197 -end  
198 -  
199 Given /^I am logged in as "(.+)"$/ do |username| 183 Given /^I am logged in as "(.+)"$/ do |username|
200 visit('/account/logout') 184 visit('/account/logout')
201 visit('/account/login') 185 visit('/account/login')
@@ -412,22 +396,3 @@ Given /^&quot;([^\&quot;]*)&quot; asked to join &quot;([^\&quot;]*)&quot;$/ do |person, organization| @@ -412,22 +396,3 @@ Given /^&quot;([^\&quot;]*)&quot; asked to join &quot;([^\&quot;]*)&quot;$/ do |person, organization|
412 organization = Organization.find_by_name(organization) 396 organization = Organization.find_by_name(organization)
413 AddMember.create!(:person => person, :organization => organization) 397 AddMember.create!(:person => person, :organization => organization)
414 end 398 end
415 -  
416 -And /^I want to add "([^\"]*)" as cost$/ do |string|  
417 - selenium.answer_on_next_prompt(string)  
418 -end  
419 -  
420 -Given /^that the default environment have (.+) templates?$/ do |option|  
421 - env = Environment.default  
422 - case option  
423 - when 'all profile'  
424 - env.create_templates  
425 - when 'no Inactive Enterprise'  
426 - env.inactive_enterprise_template && env.inactive_enterprise_template.destroy  
427 - end  
428 -end  
429 -  
430 -Given /^the environment domain is "([^\"]*)"$/ do |domain|  
431 - d = Domain.new :name => domain, :owner => Environment.default  
432 - d.save(false)  
433 -end  
public/javascripts/manage-products.js
@@ -1,66 +0,0 @@ @@ -1,66 +0,0 @@
1 -(function($) {  
2 -  
3 - $("#manage-product-details-button").live('click', function() {  
4 - $("#product-price-details").find('.loading-area').addClass('small-loading');  
5 - url = $(this).attr('href');  
6 - $.get(url, function(data){  
7 - $("#manage-product-details-button").hide();  
8 - $("#display-price-details").hide();  
9 - $("#display-manage-price-details").html(data);  
10 - $("#product-price-details").find('.loading-area').removeClass('small-loading');  
11 - });  
12 - return false;  
13 - });  
14 -  
15 - $(".cancel-price-details").live('click', function() {  
16 - $("#manage-product-details-button").show();  
17 - $("#display-price-details").show();  
18 - $("#display-manage-price-details").html('');  
19 - return false;  
20 - });  
21 -  
22 - $("#manage-product-details-form").live('submit', function(data) {  
23 - var form = this;  
24 - $(form).find('.loading-area').addClass('small-loading');  
25 - $(form).css('cursor', 'progress');  
26 - $.post(form.action, $(form).serialize(), function(data) {  
27 - $("#display-manage-price-details").html(data);  
28 - $("#manage-product-details-button").show();  
29 - });  
30 - return false;  
31 - });  
32 -  
33 - $("#add-new-cost").live('click', function() {  
34 - $('#display-product-price-details tbody').append($('#new-cost-fields tbody').html());  
35 - return false;  
36 - });  
37 -  
38 - $(".cancel-new-cost").live('click', function() {  
39 - $(this).parents('tr').remove();  
40 - return false;  
41 - });  
42 -  
43 -})(jQuery);  
44 -  
45 -function productionCostTypeChange(select, url, question, error_msg) {  
46 - if (select.value == '') {  
47 - var newType = prompt(question);  
48 - jQuery.ajax({  
49 - url: url + "/" + newType,  
50 - dataType: 'json',  
51 - success: function(data, status, ajax){  
52 - if (data.ok) {  
53 - var opt = jQuery('<option value="' + data.id + '">' + newType + '</option>');  
54 - opt.insertBefore(jQuery("option:last", select));  
55 - select.selectedIndex = select.options.length - 2;  
56 - opt.clone().insertBefore('#new-cost-fields .production-cost-selection option:last');  
57 - } else {  
58 - alert(data.error_msg);  
59 - }  
60 - },  
61 - error: function(ajax, status, error){  
62 - alert(error_msg);  
63 - }  
64 - });  
65 - }  
66 -}  
public/stylesheets/application.css
@@ -3217,85 +3217,6 @@ div#activation_enterprise div { @@ -3217,85 +3217,6 @@ div#activation_enterprise div {
3217 font-weight: bold; 3217 font-weight: bold;
3218 } 3218 }
3219 3219
3220 -/* * * * * * Price details * * * * * */  
3221 -  
3222 -#product-price-details {  
3223 - border: 1px solid #AAA;  
3224 - margin-top: 20px;  
3225 - padding: 15px 20px;  
3226 -}  
3227 -  
3228 -#display-price-details .price-details-list {  
3229 - padding-left: 0px;  
3230 -}  
3231 -  
3232 -#display-price-details .price-details-list li {  
3233 - list-style: none;  
3234 -}  
3235 -  
3236 -#display-price-details .price-details-list li .price-detail-name {  
3237 - width: 200px;  
3238 -}  
3239 -  
3240 -#display-price-details .price-details-list li .price-detail-name,  
3241 -#display-price-details .price-details-list li .price-detail-price {  
3242 - display: inline-block;  
3243 -}  
3244 -  
3245 -#manage-product-details-form .formlabel,  
3246 -#manage-product-details-form .formfield {  
3247 - display: inline-block;  
3248 -}  
3249 -  
3250 -/* * * Progress bar on price details edition * * */  
3251 -  
3252 -#display-manage-price-details .ui-widget-content {  
3253 - border: 1px solid #DDD;  
3254 -}  
3255 -  
3256 -#display-manage-price-details .ui-progressbar {  
3257 - height: 20px;  
3258 -}  
3259 -  
3260 -#display-manage-price-details .ui-progressbar .ui-progressbar-value {  
3261 - margin: 0px;  
3262 - background-color: #A40000;  
3263 -}  
3264 -  
3265 -#display-manage-price-details .ui-progressbar .ui-progressbar-value.price-described {  
3266 - background-color: #4E9A06;  
3267 -}  
3268 -  
3269 -#display-manage-price-details #price-details-info {  
3270 - margin: 10px 0px;  
3271 -}  
3272 -  
3273 -#display-manage-price-details #details-progressbar {  
3274 - position: relative;  
3275 - width: 410px;  
3276 - display: inline-block;  
3277 -}  
3278 -  
3279 -#display-manage-price-details #progressbar-text {  
3280 - position: absolute;  
3281 - top: 5px;  
3282 - right: 7px;  
3283 - font-size: 11px;  
3284 -}  
3285 -  
3286 -#display-manage-price-details #progressbar-icon {  
3287 - display: inline-block;  
3288 - cursor: pointer;  
3289 -}  
3290 -  
3291 -#display-manage-price-details #details-progressbar .ui-corner-left,  
3292 -#display-manage-price-details #details-progressbar .ui-corner-right {  
3293 - -moz-border-radius-bottomleft: 0px;  
3294 - -moz-border-radius-bottomright: 0px;  
3295 - -moz-border-radius-topleft: 0px;  
3296 - -moz-border-radius-topright: 0px;  
3297 -}  
3298 -  
3299 /* ==> public/stylesheets/controller_cms.css <== */ 3220 /* ==> public/stylesheets/controller_cms.css <== */
3300 3221
3301 3222
test/factories.rb
@@ -448,12 +448,4 @@ module Noosfero::Factory @@ -448,12 +448,4 @@ module Noosfero::Factory
448 { :singular => 'Litre', :plural => 'Litres', :environment_id => 1 } 448 { :singular => 'Litre', :plural => 'Litres', :environment_id => 1 }
449 end 449 end
450 450
451 - ###############################################  
452 - # Production Cost  
453 - ###############################################  
454 -  
455 - def defaults_for_production_cost  
456 - { :name => 'Production cost ' + factory_num_seq.to_s }  
457 - end  
458 -  
459 end 451 end
test/functional/manage_products_controller_test.rb
@@ -440,48 +440,4 @@ class ManageProductsControllerTest &lt; Test::Unit::TestCase @@ -440,48 +440,4 @@ class ManageProductsControllerTest &lt; Test::Unit::TestCase
440 assert_tag :tag => 'span', :content => 'This is ' + plugin1_local_variable + ' speaking!', :attributes => {:id => 'plugin1'} 440 assert_tag :tag => 'span', :content => 'This is ' + plugin1_local_variable + ' speaking!', :attributes => {:id => 'plugin1'}
441 assert_tag :tag => 'span', :content => 'This is ' + plugin2_local_variable + ' speaking!', :attributes => {:id => 'plugin2'} 441 assert_tag :tag => 'span', :content => 'This is ' + plugin2_local_variable + ' speaking!', :attributes => {:id => 'plugin2'}
442 end 442 end
443 -  
444 - should 'remove price detail of a product' do  
445 - product = fast_create(Product, :enterprise_id => @enterprise.id, :product_category_id => @product_category.id)  
446 - cost = fast_create(ProductionCost, :owner_id => Environment.default.id, :owner_type => 'Environment')  
447 - detail = product.price_details.create(:production_cost_id => cost.id, :price => 10)  
448 -  
449 - assert_equal [detail], product.price_details  
450 -  
451 - post :remove_price_detail, :id => detail.id, :product => product, :profile => @enterprise.identifier  
452 - product.reload  
453 - assert_equal [], product.price_details  
454 - end  
455 -  
456 - should 'create a production cost for enterprise' do  
457 - get :create_production_cost, :profile => @enterprise.identifier, :id => 'Taxes'  
458 -  
459 - assert_equal ['Taxes'], Enterprise.find(@enterprise.id).production_costs.map(&:name)  
460 - resp = ActiveSupport::JSON.decode(@response.body)  
461 - assert_equal 'Taxes', resp['name']  
462 - assert resp['id'].kind_of?(Integer)  
463 - assert resp['ok']  
464 - assert_nil resp['error_msg']  
465 - end  
466 -  
467 - should 'display error if production cost has no name' do  
468 - get :create_production_cost, :profile => @enterprise.identifier  
469 -  
470 - resp = ActiveSupport::JSON.decode(@response.body)  
471 - assert_nil resp['name']  
472 - assert_nil resp['id']  
473 - assert !resp['ok']  
474 - assert_match /blank/, resp['error_msg']  
475 - end  
476 -  
477 - should 'display error if name of production cost is too long' do  
478 - get :create_production_cost, :profile => @enterprise.identifier, :id => 'a'*60  
479 -  
480 - resp = ActiveSupport::JSON.decode(@response.body)  
481 - assert_nil resp['name']  
482 - assert_nil resp['id']  
483 - assert !resp['ok']  
484 - assert_match /too long/, resp['error_msg']  
485 - end  
486 -  
487 end 443 end
test/unit/enterprise_test.rb
@@ -432,8 +432,4 @@ class EnterpriseTest &lt; Test::Unit::TestCase @@ -432,8 +432,4 @@ class EnterpriseTest &lt; Test::Unit::TestCase
432 assert_equal false, enterprise.receives_scrap_notification? 432 assert_equal false, enterprise.receives_scrap_notification?
433 end 433 end
434 434
435 - should 'have production cost' do  
436 - e = fast_create(Enterprise)  
437 - assert_respond_to e, :production_costs  
438 - end  
439 end 435 end
test/unit/environment_test.rb
@@ -1119,7 +1119,4 @@ class EnvironmentTest &lt; Test::Unit::TestCase @@ -1119,7 +1119,4 @@ class EnvironmentTest &lt; Test::Unit::TestCase
1119 assert_equal ["Meter", "Kilo", "Litre"], Environment.default.units.map(&:singular) 1119 assert_equal ["Meter", "Kilo", "Litre"], Environment.default.units.map(&:singular)
1120 end 1120 end
1121 1121
1122 - should 'have production costs' do  
1123 - assert_respond_to Environment.default, :production_costs  
1124 - end  
1125 end 1122 end
test/unit/input_test.rb
@@ -162,19 +162,4 @@ class InputTest &lt; Test::Unit::TestCase @@ -162,19 +162,4 @@ class InputTest &lt; Test::Unit::TestCase
162 assert_kind_of Unit, input.build_unit 162 assert_kind_of Unit, input.build_unit
163 end 163 end
164 164
165 - should 'calculate cost of input' do  
166 - input = Input.new(:amount_used => 10, :price_per_unit => 2.00)  
167 - assert_equal 20.00, input.cost  
168 - end  
169 -  
170 - should 'cost 0 if amount not defined' do  
171 - input = Input.new(:price_per_unit => 2.00)  
172 - assert_equal 0.00, input.cost  
173 - end  
174 -  
175 - should 'cost 0 if price_per_unit is not defined' do  
176 - input = Input.new(:amount_used => 10)  
177 - assert_equal 0.00, input.cost  
178 - end  
179 -  
180 end 165 end
test/unit/price_detail_test.rb
@@ -1,81 +0,0 @@ @@ -1,81 +0,0 @@
1 -require File.dirname(__FILE__) + '/../test_helper'  
2 -  
3 -class PriceDetailTest < ActiveSupport::TestCase  
4 -  
5 - should 'have price 0 by default' do  
6 - p = PriceDetail.new  
7 -  
8 - assert p.price.zero?  
9 - end  
10 -  
11 - should 'return zero on price if it is blank' do  
12 - p = PriceDetail.new(:price => '')  
13 -  
14 - assert p.price.zero?  
15 - end  
16 -  
17 - should 'accept price in american\'s or brazilian\'s currency format' do  
18 - [  
19 - [12.34, 12.34],  
20 - ["12.34", 12.34],  
21 - ["12,34", 12.34],  
22 - ["12.345.678,90", 12345678.90],  
23 - ["12,345,678.90", 12345678.90],  
24 - ["12.345.678", 12345678.00],  
25 - ["12,345,678", 12345678.00]  
26 - ].each do |input, output|  
27 - new_price_detail = PriceDetail.new(:price => input)  
28 - assert_equal output, new_price_detail.price  
29 - end  
30 - end  
31 -  
32 - should 'belongs to a product' do  
33 - p = PriceDetail.new  
34 -  
35 - assert_respond_to p, :product  
36 - end  
37 -  
38 - should 'product be mandatory' do  
39 - p = PriceDetail.new  
40 - p.valid?  
41 -  
42 - assert p.errors.invalid?(:product_id)  
43 - end  
44 -  
45 - should 'have production cost' do  
46 - product = fast_create(Product)  
47 - cost = fast_create(ProductionCost, :owner_id => Environment.default.id, :owner_type => 'Environment')  
48 - detail = product.price_details.create(:production_cost_id => cost.id, :price => 10)  
49 -  
50 - assert_equal cost, PriceDetail.find(detail.id).production_cost  
51 - end  
52 -  
53 - should 'production cost be mandatory' do  
54 - p = PriceDetail.new  
55 - p.valid?  
56 -  
57 - assert p.errors.invalid?(:production_cost_id)  
58 - end  
59 -  
60 - should 'th production cost be unique on scope of product' do  
61 - product = fast_create(Product)  
62 - cost = fast_create(ProductionCost, :owner_id => Environment.default.id, :owner_type => 'environment')  
63 -  
64 - detail1 = product.price_details.create(:production_cost_id => cost.id, :price => 10)  
65 - detail2 = product.price_details.build(:production_cost_id => cost.id, :price => 10)  
66 -  
67 - detail2.valid?  
68 - assert detail2.errors.invalid?(:production_cost_id)  
69 - end  
70 -  
71 - should 'format values to float with 2 decimals' do  
72 - enterprise = fast_create(Enterprise)  
73 - product = fast_create(Product, :enterprise_id => enterprise.id)  
74 - cost = fast_create(ProductionCost, :owner_id => Environment.default.id, :owner_type => 'environment')  
75 -  
76 - price_detail = product.price_details.create(:production_cost_id => cost.id, :price => 10)  
77 -  
78 - assert_equal "10.00", price_detail.formatted_value(:price)  
79 - end  
80 -  
81 -end  
test/unit/product_test.rb
@@ -375,132 +375,4 @@ class ProductTest &lt; Test::Unit::TestCase @@ -375,132 +375,4 @@ class ProductTest &lt; Test::Unit::TestCase
375 assert_includes Product.find_by_contents('thing'), p2 375 assert_includes Product.find_by_contents('thing'), p2
376 end 376 end
377 377
378 - should 'respond to price details' do  
379 - product = Product.new  
380 - assert_respond_to product, :price_details  
381 - end  
382 -  
383 - should 'return total value of inputs' do  
384 - product = fast_create(Product)  
385 - first = fast_create(Input, :product_id => product.id, :product_category_id => fast_create(ProductCategory).id, :price_per_unit => 20.0, :amount_used => 2)  
386 - second = fast_create(Input, :product_id => product.id, :product_category_id => fast_create(ProductCategory).id, :price_per_unit => 10.0, :amount_used => 1)  
387 -  
388 - assert_equal 50.0, product.inputs_cost  
389 - end  
390 -  
391 - should 'return 0 on total value of inputs if has no input' do  
392 - product = fast_create(Product)  
393 -  
394 - assert product.inputs_cost.zero?  
395 - end  
396 -  
397 - should 'know if price is described' do  
398 - product = fast_create(Product, :price => 30.0)  
399 -  
400 - first = fast_create(Input, :product_id => product.id, :product_category_id => fast_create(ProductCategory).id, :price_per_unit => 20.0, :amount_used => 1)  
401 - assert !Product.find(product.id).price_described?  
402 -  
403 - second = fast_create(Input, :product_id => product.id, :product_category_id => fast_create(ProductCategory).id, :price_per_unit => 10.0, :amount_used => 1)  
404 - assert Product.find(product.id).price_described?  
405 - end  
406 -  
407 - should 'return false on price_described if price of product is not defined' do  
408 - product = fast_create(Product)  
409 -  
410 - assert_equal false, product.price_described?  
411 - end  
412 -  
413 - should 'create price details' do  
414 - product = fast_create(Product)  
415 - cost = fast_create(ProductionCost, :owner_id => Environment.default.id, :owner_type => 'Environment')  
416 - assert product.price_details.empty?  
417 -  
418 - product.update_price_details([{:production_cost_id => cost.id, :price => 10}])  
419 - assert_equal 1, Product.find(product.id).price_details.size  
420 - end  
421 -  
422 - should 'update price of a cost on price details' do  
423 - product = fast_create(Product)  
424 - cost = fast_create(ProductionCost, :owner_id => Environment.default.id, :owner_type => 'Environment')  
425 - cost2 = fast_create(ProductionCost, :owner_id => Environment.default.id, :owner_type => 'Environment')  
426 - price_detail = product.price_details.create(:production_cost_id => cost.id, :price => 10)  
427 - assert !product.price_details.empty?  
428 -  
429 - product.update_price_details([{:production_cost_id => cost.id, :price => 20}, {:production_cost_id => cost2.id, :price => 30}])  
430 - assert_equal 20, product.price_details.find_by_production_cost_id(cost.id).price  
431 - assert_equal 2, Product.find(product.id).price_details.size  
432 - end  
433 -  
434 - should 'destroy price details if product is removed' do  
435 - product = fast_create(Product)  
436 - cost = fast_create(ProductionCost, :owner_id => Environment.default.id, :owner_type => 'Environment')  
437 - price_detail = product.price_details.create(:production_cost_id => cost.id, :price => 10)  
438 -  
439 - assert_difference PriceDetail, :count, -1 do  
440 - product.destroy  
441 - end  
442 - end  
443 -  
444 - should 'have production costs' do  
445 - product = fast_create(Product)  
446 - cost = fast_create(ProductionCost, :owner_id => Environment.default.id, :owner_type => 'Environment')  
447 - product.price_details.create(:production_cost_id => cost.id, :price => 10)  
448 - assert_equal [cost], Product.find(product.id).production_costs  
449 - end  
450 -  
451 - should 'return production costs from enterprise and environment' do  
452 - ent = fast_create(Enterprise)  
453 - product = fast_create(Product, :enterprise_id => ent.id)  
454 - ent_production_cost = fast_create(ProductionCost, :owner_id => ent.id, :owner_type => 'Profile')  
455 - env_production_cost = fast_create(ProductionCost, :owner_id => ent.environment.id, :owner_type => 'Environment')  
456 -  
457 - assert_equal [env_production_cost, ent_production_cost], product.available_production_costs  
458 - end  
459 -  
460 - should 'return all production costs' do  
461 - ent = fast_create(Enterprise)  
462 - product = fast_create(Product, :enterprise_id => ent.id)  
463 -  
464 - env_production_cost = fast_create(ProductionCost, :owner_id => ent.environment.id, :owner_type => 'Environment')  
465 - ent_production_cost = fast_create(ProductionCost, :owner_id => ent.id, :owner_type => 'Profile')  
466 - product.price_details.create(:production_cost => env_production_cost, :product => product)  
467 - assert_equal [env_production_cost, ent_production_cost], product.available_production_costs  
468 - end  
469 -  
470 - should 'return total value of production costs' do  
471 - ent = fast_create(Enterprise)  
472 - product = fast_create(Product, :enterprise_id => ent.id)  
473 -  
474 - env_production_cost = fast_create(ProductionCost, :owner_id => ent.environment.id, :owner_type => 'Environment')  
475 - price_detail = product.price_details.create(:production_cost => env_production_cost, :price => 10)  
476 -  
477 - input = fast_create(Input, :product_id => product.id, :product_category_id => fast_create(ProductCategory).id, :price_per_unit => 20.0, :amount_used => 2)  
478 -  
479 - assert_equal price_detail.price + input.cost, product.total_production_cost  
480 - end  
481 -  
482 - should 'return inputs cost as total value of production costs if has no price details' do  
483 - ent = fast_create(Enterprise)  
484 - product = fast_create(Product, :enterprise_id => ent.id)  
485 -  
486 - input = fast_create(Input, :product_id => product.id, :product_category_id => fast_create(ProductCategory).id, :price_per_unit => 20.0, :amount_used => 2)  
487 -  
488 - assert_equal input.cost, product.total_production_cost  
489 - end  
490 -  
491 - should 'return 0 on total production cost if has no input and price details' do  
492 - product = fast_create(Product)  
493 -  
494 - assert product.total_production_cost.zero?  
495 - end  
496 -  
497 - should 'format inputs cost values to float with 2 decimals' do  
498 - ent = fast_create(Enterprise)  
499 - product = fast_create(Product, :enterprise_id => ent.id)  
500 - first = fast_create(Input, :product_id => product.id, :product_category_id => fast_create(ProductCategory).id, :price_per_unit => 20.0, :amount_used => 2)  
501 - second = fast_create(Input, :product_id => product.id, :product_category_id => fast_create(ProductCategory).id, :price_per_unit => 10.0, :amount_used => 1)  
502 -  
503 - assert_equal "50.00", product.formatted_value(:inputs_cost)  
504 - end  
505 -  
506 end 378 end
test/unit/production_cost_test.rb
@@ -1,102 +0,0 @@ @@ -1,102 +0,0 @@
1 -require File.dirname(__FILE__) + '/../test_helper'  
2 -  
3 -class ProductionCostTest < ActiveSupport::TestCase  
4 -  
5 - should 'have name' do  
6 - p = ProductionCost.new  
7 - p.valid?  
8 - assert p.errors.invalid?(:name)  
9 -  
10 - p.name = 'Taxes'  
11 - p.valid?  
12 - assert !p.errors.invalid?(:name)  
13 - end  
14 -  
15 - should 'not validates name if it is blank' do  
16 - p = ProductionCost.new  
17 -  
18 - p.valid?  
19 - assert_equal 1, p.errors['name'].to_a.count  
20 - end  
21 -  
22 - should 'not have a too long name' do  
23 - p = ProductionCost.new  
24 -  
25 - p.name = 'a'*40  
26 - p.valid?  
27 - assert p.errors.invalid?(:name)  
28 -  
29 - p.name = 'a'*30  
30 - p.valid?  
31 - assert !p.errors.invalid?(:name)  
32 - end  
33 -  
34 - should 'not have duplicated name on same environment' do  
35 - cost = ProductionCost.create(:name => 'Taxes', :owner => Environment.default)  
36 -  
37 - invalid_cost = ProductionCost.new(:name => 'Taxes', :owner => Environment.default)  
38 - invalid_cost.valid?  
39 -  
40 - assert invalid_cost.errors.invalid?(:name)  
41 - end  
42 -  
43 - should 'not have duplicated name on same enterprise' do  
44 - enterprise = fast_create(Enterprise)  
45 - cost = ProductionCost.create(:name => 'Taxes', :owner => enterprise)  
46 -  
47 - invalid_cost = ProductionCost.new(:name => 'Taxes', :owner => enterprise)  
48 - invalid_cost.valid?  
49 -  
50 - assert invalid_cost.errors.invalid?(:name)  
51 - end  
52 -  
53 - should 'not allow same name on enterprise if already has on environment' do  
54 - enterprise = fast_create(Enterprise)  
55 -  
56 - cost1 = ProductionCost.create(:name => 'Taxes', :owner => Environment.default)  
57 - cost2 = ProductionCost.new(:name => 'Taxes', :owner => enterprise)  
58 -  
59 - cost2.valid?  
60 -  
61 - assert !cost2.errors.invalid?(:name)  
62 - end  
63 -  
64 - should 'allow duplicated name on different enterprises' do  
65 - enterprise = fast_create(Enterprise)  
66 - enterprise2 = fast_create(Enterprise)  
67 -  
68 - cost1 = ProductionCost.create(:name => 'Taxes', :owner => enterprise)  
69 - cost2 = ProductionCost.new(:name => 'Taxes', :owner => enterprise2)  
70 -  
71 - cost2.valid?  
72 -  
73 - assert !cost2.errors.invalid?(:name)  
74 - end  
75 -  
76 - should 'be associated to an environment as owner' do  
77 - p = ProductionCost.new  
78 - p.valid?  
79 - assert p.errors.invalid?(:owner)  
80 -  
81 - p.owner = Environment.default  
82 - p.valid?  
83 - assert !p.errors.invalid?(:owner)  
84 - end  
85 -  
86 - should 'be associated to an enterprise as owner' do  
87 - enterprise = fast_create(Enterprise)  
88 - p = ProductionCost.new  
89 - p.valid?  
90 - assert p.errors.invalid?(:owner)  
91 -  
92 - p.owner = enterprise  
93 - p.valid?  
94 - assert !p.errors.invalid?(:owner)  
95 - end  
96 -  
97 - should 'create a production cost on an enterprise' do  
98 - enterprise = fast_create(Enterprise)  
99 - enterprise.production_costs.create(:name => 'Energy')  
100 - assert_equal ['Energy'], enterprise.production_costs.map(&:name)  
101 - end  
102 -end