From c30ec6754881e00ff785a356f757ca38dec7d103 Mon Sep 17 00:00:00 2001 From: wvengen Date: Fri, 10 Apr 2015 20:05:42 +0200 Subject: [PATCH] Allow synchronising units when uploading --- app/controllers/articles_controller.rb | 5 +++-- app/models/article.rb | 13 +++++++++---- app/models/supplier.rb | 3 ++- app/views/articles/upload.html.haml | 5 ++++- config/locales/en.yml | 4 +++- spec/integration/articles_spec.rb | 18 ++++++++++++++++-- 6 files changed, 37 insertions(+), 11 deletions(-) diff --git a/app/controllers/articles_controller.rb b/app/controllers/articles_controller.rb index a70cf420..c7a28c6e 100644 --- a/app/controllers/articles_controller.rb +++ b/app/controllers/articles_controller.rb @@ -138,8 +138,9 @@ class ArticlesController < ApplicationController # 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') diff --git a/app/models/article.rb b/app/models/article.rb index af14b31d..76078e89 100644 --- a/app/models/article.rb +++ b/app/models/article.rb @@ -116,11 +116,16 @@ class Article < ActiveRecord::Base 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] 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 diff --git a/app/models/supplier.rb b/app/models/supplier.rb index 7cedf930..f9940a8a 100644 --- a/app/models/supplier.rb +++ b/app/models/supplier.rb @@ -60,6 +60,7 @@ class Supplier < ActiveRecord::Base # @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 = [], [], [] @@ -73,7 +74,7 @@ class Supplier < ActiveRecord::Base 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] diff --git a/app/views/articles/upload.html.haml b/app/views/articles/upload.html.haml index 711996dc..8f91d790 100644 --- a/app/views/articles/upload.html.haml +++ b/app/views/articles/upload.html.haml @@ -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' diff --git a/config/locales/en.yml b/config/locales/en.yml index 91934338..560eddbd 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -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 diff --git a/spec/integration/articles_spec.rb b/spec/integration/articles_spec.rb index ee7ea796..9b6a9258 100644 --- a/spec/integration/articles_spec.rb +++ b/spec/integration/articles_spec.rb @@ -63,12 +63,14 @@ describe ArticlesController, :type => :feature do 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 @@ -97,5 +99,17 @@ describe ArticlesController, :type => :feature do 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