update article category implemented

adapt tests

add translations

adapt test

fix bug
This commit is contained in:
viehlieb 2023-02-20 19:56:45 +01:00 committed by Philipp Rothmann
parent 78da4feafe
commit 5c04a43f61
10 changed files with 66 additions and 22 deletions

View file

@ -46,6 +46,11 @@ class ArticlesController < ApplicationController
render :layout => false render :layout => false
end end
def edit
@article = Article.find(params[:id])
render :action => 'new', :layout => false
end
def create def create
@article = Article.new(params[:article]) @article = Article.new(params[:article])
if @article.valid? && @article.save if @article.valid? && @article.save
@ -55,11 +60,6 @@ class ArticlesController < ApplicationController
end end
end end
def edit
@article = Article.find(params[:id])
render :action => 'new', :layout => false
end
# Updates one Article and highlights the line if succeded # Updates one Article and highlights the line if succeded
def update def update
@article = Article.find(params[:id]) @article = Article.find(params[:id])
@ -151,6 +151,7 @@ class ArticlesController < ApplicationController
options = { filename: uploaded_file.original_filename } options = { filename: uploaded_file.original_filename }
options[:outlist_absent] = (params[:articles]['outlist_absent'] == '1') options[:outlist_absent] = (params[:articles]['outlist_absent'] == '1')
options[:convert_units] = (params[:articles]['convert_units'] == '1') options[:convert_units] = (params[:articles]['convert_units'] == '1')
options[:update_category] = (params[:articles]['update_category'] == '1')
@updated_article_pairs, @outlisted_articles, @new_articles = @supplier.sync_from_file uploaded_file.tempfile, options @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? 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') redirect_to supplier_articles_path(@supplier), :notice => I18n.t('articles.controller.parse_upload.notice')

View file

@ -143,20 +143,24 @@ class Article < ApplicationRecord
new_unit = new_article.unit new_unit = new_article.unit
end end
return Article.compare_attributes( attribute_hash = {
{ :name => [self.name, new_article.name],
:name => [self.name, new_article.name], :manufacturer => [self.manufacturer, new_article.manufacturer.to_s],
:manufacturer => [self.manufacturer, new_article.manufacturer.to_s], :origin => [self.origin, new_article.origin],
:origin => [self.origin, new_article.origin], :unit => [self.unit, new_unit],
:unit => [self.unit, new_unit], :price => [self.price.to_f.round(2), new_price.to_f.round(2)],
:price => [self.price.to_f.round(2), new_price.to_f.round(2)], :tax => [self.tax, new_article.tax],
:tax => [self.tax, new_article.tax], :deposit => [self.deposit.to_f.round(2), new_article.deposit.to_f.round(2)],
:deposit => [self.deposit.to_f.round(2), new_article.deposit.to_f.round(2)], # take care of different num-objects.
# take care of different num-objects. :unit_quantity => [self.unit_quantity.to_s.to_f, new_unit_quantity.to_s.to_f],
:unit_quantity => [self.unit_quantity.to_s.to_f, new_unit_quantity.to_s.to_f], :note => [self.note.to_s, new_article.note.to_s]
:note => [self.note.to_s, new_article.note.to_s] }
} if options[:update_category] == true
) new_article_category = new_article.article_category
attribute_hash[:article_category] = [self.article_category, new_article_category] unless new_article_category.blank?
end
Article.compare_attributes(attribute_hash)
end end
# Compare attributes from two different articles. # Compare attributes from two different articles.

View file

@ -81,7 +81,13 @@ class Supplier < ApplicationRecord
updated_article_pairs, outlisted_articles, new_articles = [], [], [] updated_article_pairs, outlisted_articles, new_articles = [], [], []
FoodsoftFile::parse file, options do |status, new_attrs, line| FoodsoftFile::parse file, options do |status, new_attrs, line|
article = articles.undeleted.where(order_number: new_attrs[:order_number]).first article = articles.undeleted.where(order_number: new_attrs[:order_number]).first
new_attrs[:article_category] = ArticleCategory.find_match(new_attrs[:article_category])
if new_attrs[:article_category].present? && options[:update_category]
new_attrs[:article_category] = ArticleCategory.find_match(new_attrs[:article_category]) || ArticleCategory.create_or_find_by!(name: new_attrs[:article_category])
else
new_attrs[:article_category] = nil
end
new_attrs[:tax] ||= FoodsoftConfig[:tax_default] new_attrs[:tax] ||= FoodsoftConfig[:tax_default]
new_article = articles.build(new_attrs) new_article = articles.build(new_attrs)
@ -89,7 +95,7 @@ class Supplier < ApplicationRecord
if article.nil? if article.nil?
new_articles << new_article new_articles << new_article
else else
unequal_attributes = article.unequal_attributes(new_article, options.slice(:convert_units)) unequal_attributes = article.unequal_attributes(new_article, options.slice(:convert_units, :update_category))
unless unequal_attributes.empty? unless unequal_attributes.empty?
article.attributes = unequal_attributes article.attributes = unequal_attributes
updated_article_pairs << [article, unequal_attributes] updated_article_pairs << [article, unequal_attributes]

View file

@ -49,7 +49,8 @@
.input-prepend .input-prepend
%span.add-on= t 'number.currency.format.unit' %span.add-on= t 'number.currency.format.unit'
= form.text_field 'deposit', class: 'input-mini', style: 'width: 45px' = form.text_field 'deposit', class: 'input-mini', style: 'width: 45px'
%td= form.select :article_category_id, ArticleCategory.all.map {|a| [ a.name, a.id ] }, %td{:style => highlight_new(attrs, :article_category)}
= form.select :article_category_id, ArticleCategory.all.map {|a| [ a.name, a.id ] },
{include_blank: true}, class: 'input-small' {include_blank: true}, class: 'input-small'
- unless changed_article.errors.empty? - unless changed_article.errors.empty?
%tr.alert %tr.alert

View file

@ -76,6 +76,9 @@
= f.file_field "file" = f.file_field "file"
.control-group .control-group
%label(for="articles_update_category")
= f.check_box "update_category"
= t '.options.update_category'
%label(for="articles_outlist_absent") %label(for="articles_outlist_absent")
= f.check_box "outlist_absent" = f.check_box "outlist_absent"
= t '.options.outlist_absent' = t '.options.outlist_absent'

View file

@ -568,6 +568,7 @@ de:
options: options:
convert_units: Derzeitige Einheiten beibehalten, berechne Mengeneinheit und Preis (wie Synchronisieren). convert_units: Derzeitige Einheiten beibehalten, berechne Mengeneinheit und Preis (wie Synchronisieren).
outlist_absent: Artikel löschen, die nicht in der hochgeladenen Datei sind. outlist_absent: Artikel löschen, die nicht in der hochgeladenen Datei sind.
update_category: Kategorien aus der Datei übernehmen und erstellen.
sample: sample:
juices: Säfte juices: Säfte
nuts: Nüsse nuts: Nüsse

View file

@ -569,6 +569,7 @@ en:
options: options:
convert_units: Keep current units, recompute unit quantity and price (like synchronize). convert_units: Keep current units, recompute unit quantity and price (like synchronize).
outlist_absent: Delete articles not in uploaded file. outlist_absent: Delete articles not in uploaded file.
update_category: Create and replace categories from uploaded file.
sample: sample:
juices: Juices juices: Juices
nuts: Nuts nuts: Nuts

View file

@ -515,6 +515,7 @@ es:
options: options:
convert_units: Mantener unidades actuales, recomputar la cantidad y precio de unidades (como sincronizar). convert_units: Mantener unidades actuales, recomputar la cantidad y precio de unidades (como sincronizar).
outlist_absent: Borrar artículos que no están en el archivo subido. outlist_absent: Borrar artículos que no están en el archivo subido.
update_category: Toma las categorías del archivo subido.
sample: sample:
juices: Jugos juices: Jugos
nuts: Nueces nuts: Nueces

View file

@ -539,6 +539,7 @@ nl:
options: options:
convert_units: Bestaande eenheden behouden, herbereken groothandelseenheid en prijs (net als synchronizeren). convert_units: Bestaande eenheden behouden, herbereken groothandelseenheid en prijs (net als synchronizeren).
outlist_absent: Artikelen die niet in het bestand voorkomen, verwijderen. outlist_absent: Artikelen die niet in het bestand voorkomen, verwijderen.
upload_category: Categorieën overnemen uit bestand.
sample: sample:
juices: Sappen juices: Sappen
nuts: Noten nuts: Noten

View file

@ -90,6 +90,31 @@ feature ArticlesController do
end end
end end
describe "takes over category from file" do
it do
find(:css, '#articles_update_category[value="1"]').set(true) # check take over category from file
expect(ArticleCategory.count).to eq 1 # new Category vegetables should be created from file
find('input[type="submit"]').click # upload file
find('input[type="submit"]').click # submit changes
expect(ArticleCategory.count).to eq 2 # it is
expect(supplier.articles.count).to eq 1
expect(supplier.articles.first.article_category.name).to eq "Vegetables"
end
end
describe "overwrites article_category from file" do
let!(:article_category) { create(:article_category, name: "Fruit") }
let(:article) { create(:article, supplier: supplier, name: 'Tomatoes', order_number: 1, unit: '250 g', article_category: article_category) }
it do
find(:css, '#articles_update_category[value="1"]').set(true) # check take over category from file
find('input[type="submit"]').click #upload file
find('input[type="submit"]').click #submit changes
expect(supplier.articles.count).to eq 1
expect(supplier.articles.first.article_category.name).to eq "Vegetables"
end
end
describe "can remove an existing article" do describe "can remove an existing article" do
let!(:article) { create :article, supplier: supplier, name: 'Foobar', order_number: 99999 } let!(:article) { create :article, supplier: supplier, name: 'Foobar', order_number: 99999 }