Skip to content

Commit

Permalink
Allow synchronising units when uploading
Browse files Browse the repository at this point in the history
  • Loading branch information
wvengen committed Apr 11, 2015
1 parent 4d1e102 commit c30ec67
Show file tree
Hide file tree
Showing 6 changed files with 37 additions and 11 deletions.
5 changes: 3 additions & 2 deletions app/controllers/articles_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -138,8 +138,9 @@ def upload
# Update articles from a spreadsheet
def parse_upload
uploaded_file = params[:articles]['file']
outlist_absent = (params[:articles]['outlist_absent'] == '1')
options = {filename: uploaded_file.original_filename, outlist_absent: outlist_absent}
options = {filename: uploaded_file.original_filename}
options[:outlist_absent] = (params[:articles]['outlist_absent'] == '1')
options[:convert_units] = (params[:articles]['convert_units'] == '1')
@updated_article_pairs, @outlisted_articles, @new_articles = @supplier.sync_from_file uploaded_file.tempfile, options
if @updated_article_pairs.empty? && @outlisted_articles.empty? && @new_articles.empty?
redirect_to supplier_articles_path(@supplier), :notice => I18n.t('articles.controller.parse_upload.notice')
Expand Down
13 changes: 9 additions & 4 deletions app/models/article.rb
Original file line number Diff line number Diff line change
Expand Up @@ -116,11 +116,16 @@ def shared_article_changed?(supplier = self.supplier)
end

# Return article attributes that were changed (incl. unit conversion)
# @param [Article] New article to update self
# @param new_article [Article] New article to update self
# @option options [Boolean] :convert_units Omit or set to +true+ to keep current unit and recompute unit quantity and price.
# @return [Hash<Symbol, Object>] Attributes with new values
def unequal_attributes(new_article)
# try to convert different units
new_price, new_unit_quantity = convert_units(new_article)
def unequal_attributes(new_article, options={})
# try to convert different units when desired
if options[:convert_units] == false
new_price, new_unit_quantity = nil, nil
else
new_price, new_unit_quantity = convert_units(new_article)
end
if new_price && new_unit_quantity
new_unit = self.unit
else
Expand Down
3 changes: 2 additions & 1 deletion app/models/supplier.rb
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ def sync_all
# @param file [File] Spreadsheet file to parse
# @param options [Hash] Options passed to {FoodsoftFile#parse} except when listed here.
# @option options [Boolean] :outlist_absent Set to +true+ to remove articles not in spreadsheet.
# @option options [Boolean] :convert_units Omit or set to +true+ to keep current units, recomputing unit quantity and price.
def sync_from_file(file, options={})
all_order_numbers = []
updated_article_pairs, outlisted_articles, new_articles = [], [], []
Expand All @@ -73,7 +74,7 @@ def sync_from_file(file, options={})
if article.nil?
new_articles << new_article
else
unequal_attributes = article.unequal_attributes(new_article)
unequal_attributes = article.unequal_attributes(new_article, options.slice(:convert_units))
unless unequal_attributes.empty?
article.attributes = unequal_attributes
updated_article_pairs << [article, unequal_attributes]
Expand Down
5 changes: 4 additions & 1 deletion app/views/articles/upload.html.haml
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,10 @@
.control-group
%label(for="articles_outlist_absent")
= f.check_box "outlist_absent"
= t '.outlist_absent'
= t '.options.outlist_absent'
%label(for="articles_convert_units")
= f.check_box "convert_units"
= t '.options.convert_units'

.form-actions
= submit_tag t('.submit'), class: 'btn btn-primary'
Expand Down
4 changes: 3 additions & 1 deletion config/locales/en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -438,7 +438,9 @@ en:
reserved: "(Reserved)"
status: Status (x=skip)
file_label: Please choose a compatible file
outlist_absent: Delete articles not in uploaded file
options:
convert_units: Keep current units, recompute unit quantity and price (like synchronize)
outlist_absent: Delete articles not in uploaded file
sample:
juices: Juices
nuts: Nuts
Expand Down
18 changes: 16 additions & 2 deletions spec/integration/articles_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -63,12 +63,14 @@
end

describe "can update existing article" do
let!(:article) { create :article, supplier: supplier, name: 'Foobar', order_number: 1 }
let!(:article) { create :article, supplier: supplier, name: 'Foobar', order_number: 1, unit: '250 g' }
it do
find('input[type="submit"]').click
expect(find("#articles_#{article.id}_name").value).to eq 'Tomatoes'
find('input[type="submit"]').click
expect(article.reload.name).to eq 'Tomatoes'
article.reload
expect(article.name).to eq 'Tomatoes'
expect([article.unit, article.unit_quantity, article.price]).to eq ['500 g', 20, 1.2]
end
end

Expand Down Expand Up @@ -97,5 +99,17 @@
expect(article.reload.deleted?).to be true
end
end

describe "can convert units when updating" do
let!(:article) { create :article, supplier: supplier, order_number: 1, unit: '250 g' }
it do
check('articles_convert_units')
find('input[type="submit"]').click
expect(find("#articles_#{article.id}_name").value).to eq 'Tomatoes'
find('input[type="submit"]').click
article.reload
expect([article.unit, article.unit_quantity, article.price]).to eq ['250 g', 40, 0.6]
end
end
end
end

0 comments on commit c30ec67

Please sign in to comment.