Allow synchronising units when uploading

This commit is contained in:
wvengen 2015-04-10 20:05:42 +02:00
parent 4d1e102f47
commit c30ec67548
6 changed files with 37 additions and 11 deletions

View file

@ -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')

View file

@ -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<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

View file

@ -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]

View file

@ -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'