From a92a51d88af11237bc66b69fe202bfa643c6d504 Mon Sep 17 00:00:00 2001 From: viehlieb Date: Tue, 31 Jan 2023 15:25:36 +0100 Subject: [PATCH 01/12] include foodsoft-article-import --- Gemfile | 2 ++ Gemfile.lock | 12 +++++++++++- app/models/supplier.rb | 7 +++++-- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index 42ac26db..1fda1f10 100644 --- a/Gemfile +++ b/Gemfile @@ -50,6 +50,8 @@ gem 'attribute_normalizer' gem 'ice_cube' # At time of development 01-06-2022 mmddyyyy necessary fix for config_helper.rb form builder was not in rubygems so we pull from github, see: https://github.com/gregschmit/recurring_select/pull/152 gem 'recurring_select', git: 'https://github.com/gregschmit/recurring_select' +# TODO: publish gem on github +gem 'foodsoft_article_import', git: 'https://git.local-it.org/Foodsoft/foodsoft_article_import', tag: 'v0.1' gem 'roo' gem 'roo-xls' gem 'spreadsheet' diff --git a/Gemfile.lock b/Gemfile.lock index f55e3397..0c9eaf3d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,3 +1,12 @@ +GIT + remote: https://git.local-it.org/Foodsoft/foodsoft_article_import + revision: c7e432c247ca6aa327ae889d22f78227efed2479 + tag: v0.1 + specs: + foodsoft_article_import (1.0.0) + roo (~> 2.9.0) + simplecov + GIT remote: https://github.com/gregschmit/recurring_select revision: 29febc4c4abdd6c30636c33a7d2daecb09973ecf @@ -615,6 +624,7 @@ DEPENDENCIES exception_notification factory_bot_rails faker + foodsoft_article_import! foodsoft_discourse! foodsoft_documents! foodsoft_links! @@ -686,4 +696,4 @@ DEPENDENCIES whenever BUNDLED WITH - 2.4.3 + 2.4.2 diff --git a/app/models/supplier.rb b/app/models/supplier.rb index 862f5c24..4d9253bf 100644 --- a/app/models/supplier.rb +++ b/app/models/supplier.rb @@ -1,3 +1,4 @@ +require 'foodsoft_article_import' class Supplier < ApplicationRecord include MarkAsDeletedWithName include CustomFields @@ -76,10 +77,12 @@ class Supplier < ApplicationRecord # @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 = {}) + def sync_from_file(file, type, options = {}) all_order_numbers = [] updated_article_pairs, outlisted_articles, new_articles = [], [], [] - FoodsoftFile::parse file, options do |status, new_attrs, line| + custom_codes_path = File.join(Rails.root, "config", "custom_codes.yml") + custom_codes_file_path = custom_codes_path if File.exist?(custom_codes_path) + FoodsoftArticleImport.parse(file, custom_file_path: custom_codes_file_path, type: type, options: options) do |new_attrs, status, line| article = articles.undeleted.where(order_number: new_attrs[:order_number]).first new_attrs[:article_category] = ArticleCategory.find_match(new_attrs[:article_category]) new_attrs[:tax] ||= FoodsoftConfig[:tax_default] From db149a72684c8792324b7db081fe15c99746595b Mon Sep 17 00:00:00 2001 From: viehlieb Date: Tue, 31 Jan 2023 15:26:28 +0100 Subject: [PATCH 02/12] use filetypes for manual uploading bnn, odin, foodsoft file --- app/controllers/articles_controller.rb | 3 ++- app/views/articles/upload.html.haml | 7 ++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/app/controllers/articles_controller.rb b/app/controllers/articles_controller.rb index 4161e66a..a33d378a 100644 --- a/app/controllers/articles_controller.rb +++ b/app/controllers/articles_controller.rb @@ -148,10 +148,11 @@ class ArticlesController < ApplicationController # Update articles from a spreadsheet def parse_upload uploaded_file = params[:articles]['file'] or raise I18n.t('articles.controller.parse_upload.no_file') + type = params[:articles]['type'] 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 + @updated_article_pairs, @outlisted_articles, @new_articles = @supplier.sync_from_file uploaded_file.tempfile, type, 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') end diff --git a/app/views/articles/upload.html.haml b/app/views/articles/upload.html.haml index 8f91d790..1b67ca1d 100644 --- a/app/views/articles/upload.html.haml +++ b/app/views/articles/upload.html.haml @@ -71,9 +71,14 @@ = form_for :articles, :url => parse_upload_supplier_articles_path(@supplier), :html => { multipart: true, class: "form-horizontal" } do |f| + .control-group - %label(for="articles_file")= t '.file_label' + %label(for="articles_file") + %strong= t '.file_label' = f.file_field "file" + %label(for="articles_file") + %strong="select the file type you are about to upload" + =f.collection_select :type, ["bnn","foodsoft","odin"], :to_s, :to_s .control-group %label(for="articles_outlist_absent") From ca440ee72098a8b42936e4b4bfb293704d04a66e Mon Sep 17 00:00:00 2001 From: viehlieb Date: Thu, 2 Feb 2023 22:39:20 +0100 Subject: [PATCH 03/12] use opts in .parse --- app/models/supplier.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/models/supplier.rb b/app/models/supplier.rb index 4d9253bf..9d6cd8a5 100644 --- a/app/models/supplier.rb +++ b/app/models/supplier.rb @@ -74,15 +74,16 @@ class Supplier < ApplicationRecord # Synchronise articles with spreadsheet. # # @param file [File] Spreadsheet file to parse - # @param options [Hash] Options passed to {FoodsoftFile#parse} except when listed here. + # @param options [Hash] Options passed to {FoodsoftArticleImport#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, type, options = {}) all_order_numbers = [] updated_article_pairs, outlisted_articles, new_articles = [], [], [] custom_codes_path = File.join(Rails.root, "config", "custom_codes.yml") + opts = options.except(:convert_units, :outlist_absent) custom_codes_file_path = custom_codes_path if File.exist?(custom_codes_path) - FoodsoftArticleImport.parse(file, custom_file_path: custom_codes_file_path, type: type, options: options) do |new_attrs, status, line| + FoodsoftArticleImport.parse(file, custom_file_path: custom_codes_file_path, type: type, **opts) do |new_attrs, status, line| article = articles.undeleted.where(order_number: new_attrs[:order_number]).first new_attrs[:article_category] = ArticleCategory.find_match(new_attrs[:article_category]) new_attrs[:tax] ||= FoodsoftConfig[:tax_default] From 8f95ff45a9872008c68cc9619cfffd9978040872 Mon Sep 17 00:00:00 2001 From: viehlieb Date: Thu, 2 Feb 2023 22:39:39 +0100 Subject: [PATCH 04/12] adapt specs to include file format --- spec/controllers/articles_controller_spec.rb | 4 ++-- spec/integration/articles_spec.rb | 2 +- spec/models/supplier_spec.rb | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/spec/controllers/articles_controller_spec.rb b/spec/controllers/articles_controller_spec.rb index b8772054..e2940f48 100644 --- a/spec/controllers/articles_controller_spec.rb +++ b/spec/controllers/articles_controller_spec.rb @@ -187,8 +187,8 @@ describe ArticlesController, type: :controller do describe '#parse_upload' do let(:file) { Rack::Test::UploadedFile.new(Rails.root.join('spec/fixtures/files/upload_test.csv'), original_filename: 'upload_test.csv') } - it 'updates particles from spreadsheet' do - post_with_supplier :parse_upload, params: { articles: { file: file, outlist_absent: '1', convert_units: '1' } } + it 'updates articles from spreadsheet' do + post_with_supplier :parse_upload, params: { articles: { file: file, outlist_absent: '1', convert_units: '1', type: 'foodsoft' } } expect(response).to have_http_status(:success) end diff --git a/spec/integration/articles_spec.rb b/spec/integration/articles_spec.rb index bbd5e375..ec6095e2 100644 --- a/spec/integration/articles_spec.rb +++ b/spec/integration/articles_spec.rb @@ -42,12 +42,12 @@ feature ArticlesController do before do visit upload_supplier_articles_path(supplier_id: supplier.id) attach_file 'articles_file', file + find("#articles_type option[value='foodsoft']").select_option end Dir.glob('spec/fixtures/foodsoft_file_01.*') do |test_file| describe "can import articles from #{test_file}" do let(:file) { Rails.root.join(test_file) } - it do find('input[type="submit"]').click expect(find("tr:nth-child(1) #new_articles__note").value).to eq "bio ◎" diff --git a/spec/models/supplier_spec.rb b/spec/models/supplier_spec.rb index 6bcc6e7b..42b4a304 100644 --- a/spec/models/supplier_spec.rb +++ b/spec/models/supplier_spec.rb @@ -11,7 +11,7 @@ describe Supplier do options = { filename: 'foodsoft_file_01.csv' } options[:outlist_absent] = true options[:convert_units] = true - updated_article_pairs, outlisted_articles, new_articles = supplier.sync_from_file(Rails.root.join('spec/fixtures/foodsoft_file_01.csv'), options) + updated_article_pairs, outlisted_articles, new_articles = supplier.sync_from_file(Rails.root.join('spec/fixtures/foodsoft_file_01.csv'), "foodsoft", options) expect(new_articles.length).to be > 0 expect(updated_article_pairs.first[1][:name]).to eq 'Tomaten' expect(outlisted_articles.first).to eq article2 From c8354c76ff0da892fcd63e0be83d52be21091681 Mon Sep 17 00:00:00 2001 From: viehlieb Date: Tue, 7 Feb 2023 17:04:07 +0100 Subject: [PATCH 05/12] add specs for odin, bnn, foodsoft files --- spec/fixtures/bnn_file_01.bnn | 5 + spec/fixtures/bnn_file_02.bnn | 2 + spec/fixtures/odin_file_01.xml | 273 ++++++++++++++++++++++++++++++ spec/fixtures/odin_file_02.xml | 75 ++++++++ spec/integration/articles_spec.rb | 130 +++++++++----- 5 files changed, 442 insertions(+), 43 deletions(-) create mode 100644 spec/fixtures/bnn_file_01.bnn create mode 100644 spec/fixtures/bnn_file_02.bnn create mode 100644 spec/fixtures/odin_file_01.xml create mode 100644 spec/fixtures/odin_file_02.xml diff --git a/spec/fixtures/bnn_file_01.bnn b/spec/fixtures/bnn_file_01.bnn new file mode 100644 index 00000000..177da7be --- /dev/null +++ b/spec/fixtures/bnn_file_01.bnn @@ -0,0 +1,5 @@ +BNN;3;0;Naturkost Nord, Hamburg;T;Angebot Nr. 0922;EUR;20220905;20221001;20220825;837;1 +29932;;;;4280001958081;4280001958203;Walnoten (ongeroosterd);bio;;;med;;GR;C%;DE-?KO-001;120;1302;10;55;;1;;1;1 kg;1;N;930190;99260;;1,41;;;;1;;;4,49;2,34;J;;2;3;;;;;;;;;;;;;;;;;;;A;;;;;Kg;28,571;; +28391;;;;4280001958081;4280001958203;Pijnboompitten;dem;;;med;;GR;C%;DE-?KO-001;120;1302;10;55;;1;;1;100 g;10;N;930190;99260;;1,41;;;;1;;;5,56;2.89;J;;2;3;;;;;;;;;;;;;;;;;;;A;;;;;Kg;28,571;; +1829;;;;4280001958081;4280001958203;Appelsap (verpakt);;;;med;;GR;C%;DE-?KO-001;120;1302;10;55;;1;4x250 ml;10;4x250 ml;10;N;930190;99260;;3,21;;;;1;;;4,49;2.89;J;;2;3;;;;;;;;;;;;;;;;;;;A;;;;;ml;28,571;; +177813;;;;4280001958081;4280001958203;Tomaten;bio;;;med;;GR;C%;DE-?KO-001;120;1302;10;55;;1;;1;500 g;20;N;930190;99260;;1,20;;;;1;;;4,49;2.89;J;;2;3;;;;;;;;;;;;;;;;;;;A;;;;;g;28,571;; diff --git a/spec/fixtures/bnn_file_02.bnn b/spec/fixtures/bnn_file_02.bnn new file mode 100644 index 00000000..e3dba5bb --- /dev/null +++ b/spec/fixtures/bnn_file_02.bnn @@ -0,0 +1,2 @@ +BNN;3;0;Naturkost Nord, Hamburg;T;Angebot Nr. 0922;EUR;20220905;20221001;20220825;837;1 +1;;;;4280001958081;4280001958203;Tomatoes;organic;;;med;;GR;C%;DE-?KO-001;120;1302;10;55;;1;;20;500 g;1;N;930190;99260;;1,41;;;;1;;;4,49;1,20;J;;2;3;;;;;;;;;;;;;;;;;;;A;;;;;g;28,571;; \ No newline at end of file diff --git a/spec/fixtures/odin_file_01.xml b/spec/fixtures/odin_file_01.xml new file mode 100644 index 00000000..3b60e83e --- /dev/null +++ b/spec/fixtures/odin_file_01.xml @@ -0,0 +1,273 @@ + + + +1039 +1.08 +Estafette Associatie C.V. +Geldermalsen + + +8719325207668 +Walnoten (ongeroosterd) +Nucli rose + +0 +0 +0 +1 +kg +Stuk +0 +Het warme woud +bio + + +NL + +6 +1017515 +29932 +10 +Actief +druiven* +0 +0 +2 +2 +0 +0 +0 +2 +2 +0 +2 +0 +2 +0 +2 +2 +2 +2 +1 +0 +2 +0 +2 +2 + + + +0 +0 +0 +0 +1 + +2 +0 + +adviesprijs +2022-08-18 +2.34 +7.95 + + + +8719325207668 +Pijnboompitten +Nucli rose + +0 +0 +0 +100 +g +Stuk +0 +NELEMAN +dem + + +TR + +6 +1017515 +28391 +10 +Actief +druiven* +0 +0 +2 +2 +0 +0 +0 +2 +2 +0 +2 +0 +2 +0 +2 +2 +2 +2 +1 +0 +2 +0 +2 +2 + + + +0 +0 +0 +0 +1 + +2 +0 + +adviesprijs +2022-08-18 +5.56 +7.95 + + + +8719325207668 +Appelsap (verpakt) +Nucli rose + +0 +0 +0 +4x250 +ml +Stuk +0.4 +Appelgaarde + + + +DE + +6 +1017515 +1829 +10 +Actief +druiven* +0 +0 +2 +2 +0 +0 +0 +2 +2 +0 +2 +0 +2 +0 +2 +2 +2 +2 +1 +0 +2 +0 +2 +2 + + + +0 +0 +0 +0 +1 + +2 +0 + +adviesprijs +2022-08-18 +3.21 +7.95 + + + +8719325207668 +Tomaten +Nucli rose + +0 +0 +0 +500 +g +Stuk +0 +De röde hof +bio + + +DE + +6 +1017515 +177813 +20 +Actief +druiven* +0 +0 +2 +2 +0 +0 +0 +2 +2 +0 +2 +0 +2 +0 +2 +2 +2 +2 +1 +0 +2 +0 +2 +2 + + + +0 +0 +0 +0 +1 + +2 +0 + +adviesprijs +2022-08-18 +1.2 +7.95 + + + \ No newline at end of file diff --git a/spec/fixtures/odin_file_02.xml b/spec/fixtures/odin_file_02.xml new file mode 100644 index 00000000..c732b4d5 --- /dev/null +++ b/spec/fixtures/odin_file_02.xml @@ -0,0 +1,75 @@ + + + +1039 +1.08 +Estafette Associatie C.V. +Geldermalsen + + +8719325207668 +Tomatoes +Nucli rose + +0 +0 +0 +500 +g +Stuk +0 +De röde hof +organic + + +Somewhere, UK + +6 +1017515 +1 +20 +Actief +druiven* +0 +0 +2 +2 +0 +0 +0 +2 +2 +0 +2 +0 +2 +0 +2 +2 +2 +2 +1 +0 +2 +0 +2 +2 + + + +0 +0 +0 +0 +1 + +2 +0 + +adviesprijs +2022-08-18 +1.2 +7.95 + + + \ No newline at end of file diff --git a/spec/integration/articles_spec.rb b/spec/integration/articles_spec.rb index ec6095e2..15608311 100644 --- a/spec/integration/articles_spec.rb +++ b/spec/integration/articles_spec.rb @@ -1,9 +1,9 @@ require_relative '../spec_helper' feature ArticlesController do - let(:user) { create :user, groups: [create(:workgroup, role_article_meta: true)] } - let(:supplier) { create :supplier } - let!(:article_category) { create :article_category } + let(:user) { create(:user, groups: [create(:workgroup, role_article_meta: true)]) } + let(:supplier) { create(:supplier) } + let!(:article_category) { create(:article_category) } before { login user } @@ -18,7 +18,7 @@ feature ArticlesController do it 'can create a new article' do click_on I18n.t('articles.index.new') expect(page).to have_selector('form#new_article') - article = build :article, supplier: supplier, article_category: article_category + article = build(:article, supplier: supplier, article_category: article_category) within('#new_article') do fill_in 'article_name', :with => article.name fill_in 'article_unit', :with => article.unit @@ -42,13 +42,14 @@ feature ArticlesController do before do visit upload_supplier_articles_path(supplier_id: supplier.id) attach_file 'articles_file', file - find("#articles_type option[value='foodsoft']").select_option end Dir.glob('spec/fixtures/foodsoft_file_01.*') do |test_file| describe "can import articles from #{test_file}" do let(:file) { Rails.root.join(test_file) } + it do + find("#articles_type option[value='foodsoft']").select_option find('input[type="submit"]').click expect(find("tr:nth-child(1) #new_articles__note").value).to eq "bio ◎" expect(find("tr:nth-child(2) #new_articles__name").value).to eq "Pijnboompitten" @@ -64,56 +65,99 @@ feature ArticlesController do end end - describe "can update existing article" do - let!(:article) { create :article, supplier: supplier, name: 'Foobar', order_number: 1, unit: '250 g' } + Dir.glob('spec/fixtures/bnn_file_01.*') do |test_file| + describe "can import articles from #{test_file}" do + let(:file) { Rails.root.join(test_file) } - it do - find('input[type="submit"]').click - expect(find("#articles_#{article.id}_name").value).to eq 'Tomatoes' - find('input[type="submit"]').click - article.reload - expect(article.name).to eq 'Tomatoes' - expect([article.unit, article.unit_quantity, article.price]).to eq ['500 g', 20, 1.2] + it do + find("#articles_type option[value='bnn']").select_option + find('input[type="submit"]').click + expect(find("tr:nth-child(1) #new_articles__note").value).to eq "bio" + expect(find("tr:nth-child(1) #new_articles__name").value).to eq "Walnoten (ongeroosterd)" + # set article category + 4.times do |i| + all("tr:nth-child(#{i + 1}) select > option")[1].select_option + end + find('input[type="submit"]').click + + expect(page).to have_content("Pijnboompitten") + + expect(supplier.articles.count).to eq 4 + end end end + end - describe "handles missing data" do - it do - find('input[type="submit"]').click # to overview - find('input[type="submit"]').click # missing category, re-show form - expect(find('tr.alert')).to be_present - expect(supplier.articles.count).to eq 0 + describe "updates" do + file_paths = ['spec/fixtures/foodsoft_file_02.csv', 'spec/fixtures/bnn_file_02.bnn', 'spec/fixtures/odin_file_02.xml'] + let(:filename) { 'foodsoft_file_02.csv' } + let(:file) { Rails.root.join("spec/fixtures/#{filename}") } + let(:val) { 'foodsoft' } + let(:type) { %w[foodsoft bnn odin] } - all("tr select > option")[1].select_option - find('input[type="submit"]').click # now it should succeed - expect(supplier.articles.count).to eq 1 - end + before do + visit upload_supplier_articles_path(supplier_id: supplier.id) + attach_file 'articles_file', file + find("#articles_type option[value='#{val}']").select_option end - describe "can remove an existing article" do - let!(:article) { create :article, supplier: supplier, name: 'Foobar', order_number: 99999 } + file_paths.each_with_index do |test_file, index| + describe "updates article for #{test_file}" do + let(:article) { create(:article, supplier: supplier, name: 'Foobar', order_number: 1, unit: '250 g') } + let(:file) { Rails.root.join(test_file) } + let(:val) { type[index] } - it do - check('articles_outlist_absent') - find('input[type="submit"]').click - expect(find("#outlisted_articles_#{article.id}", visible: :all)).to be_present + it do + article.reload + find('input[type="submit"]').click + expect(find("#articles_#{article.id}_name").value).to eq 'Tomatoes' + find('input[type="submit"]').click + article.reload + expect(article.name).to eq 'Tomatoes' + if type[index] == "odin" + expect([article.unit, article.unit_quantity, article.price]).to eq ['500gr', 20, 1.20] + else + expect([article.unit, article.unit_quantity, article.price]).to eq ['500 g', 20, 1.20] + end + end - all("tr select > option")[1].select_option - find('input[type="submit"]').click - expect(article.reload.deleted?).to be true + it "handles missing data" do + find('input[type="submit"]').click # to overview + find('input[type="submit"]').click # missing category, re-show form + expect(find('tr.alert')).to be_present + expect(supplier.articles.count).to eq 0 + + all("tr select > option")[1].select_option + find('input[type="submit"]').click # now it should succeed + expect(supplier.articles.count).to eq 1 + end end - end - describe "can convert units when updating" do - let!(:article) { create :article, supplier: supplier, order_number: 1, unit: '250 g' } + describe "can remove an existing article" do + let!(:article) { create(:article, supplier: supplier, name: 'Foobar', order_number: 99999) } - 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] + it do + check('articles_outlist_absent') + find('input[type="submit"]').click + expect(find("#outlisted_articles_#{article.id}", visible: :all)).to be_present + + all("tr select > option")[1].select_option + find('input[type="submit"]').click + 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 From 068e5cb776a4997ae9df32f1d548d9565afdd47a Mon Sep 17 00:00:00 2001 From: viehlieb Date: Tue, 7 Feb 2023 17:05:16 +0100 Subject: [PATCH 06/12] adapt localize input to remove ',' separator and replace with '.' --- app/models/concerns/localize_input.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/concerns/localize_input.rb b/app/models/concerns/localize_input.rb index cfb44a44..b6330fcc 100644 --- a/app/models/concerns/localize_input.rb +++ b/app/models/concerns/localize_input.rb @@ -8,7 +8,7 @@ module LocalizeInput separator = I18n.t("separator", scope: "number.format") delimiter = I18n.t("delimiter", scope: "number.format") input.gsub!(delimiter, "") if input.match(/\d+#{Regexp.escape(delimiter)}+\d+#{Regexp.escape(separator)}+\d+/) # Remove delimiter - input.gsub!(separator, ".") # Replace separator with db compatible character + input.gsub!(separator, ".") or input.gsub!(",", ".") # Replace separator with db compatible character input rescue Rails.logger.warn "Can't localize input: #{input}" From c28731a1eac6951b3595648773e85ef70127e228 Mon Sep 17 00:00:00 2001 From: viehlieb Date: Mon, 20 Feb 2023 14:36:44 +0100 Subject: [PATCH 07/12] remove depr foodsoftfile.rb and spreadsheet.rb --- app/lib/foodsoft_file.rb | 25 ------------------------- app/lib/spreadsheet_file.rb | 22 ---------------------- 2 files changed, 47 deletions(-) delete mode 100644 app/lib/foodsoft_file.rb delete mode 100644 app/lib/spreadsheet_file.rb diff --git a/app/lib/foodsoft_file.rb b/app/lib/foodsoft_file.rb deleted file mode 100644 index 95d06c60..00000000 --- a/app/lib/foodsoft_file.rb +++ /dev/null @@ -1,25 +0,0 @@ -# Foodsoft-file import -class FoodsoftFile - # parses a string from a foodsoft-file - # returns two arrays with articles and outlisted_articles - # the parsed article is a simple hash - def self.parse(file, options = {}) - SpreadsheetFile.parse file, options do |row, row_index| - next if row[2].blank? - - article = { :order_number => row[1], - :name => row[2], - :note => row[3], - :manufacturer => row[4], - :origin => row[5], - :unit => row[6], - :price => row[7], - :tax => row[8], - :deposit => (row[9].nil? ? "0" : row[9]), - :unit_quantity => row[10], - :article_category => row[13] } - status = row[0] && row[0].strip.downcase == 'x' ? :outlisted : nil - yield status, article, row_index - end - end -end diff --git a/app/lib/spreadsheet_file.rb b/app/lib/spreadsheet_file.rb deleted file mode 100644 index dbca9c90..00000000 --- a/app/lib/spreadsheet_file.rb +++ /dev/null @@ -1,22 +0,0 @@ -require 'roo' - -class SpreadsheetFile - def self.parse(file, options = {}) - filepath = file.is_a?(String) ? file : file.to_path - filename = options.delete(:filename) || filepath - fileext = File.extname(filename) - options[:csv_options] = { col_sep: ';', encoding: 'utf-8' }.merge(options[:csv_options] || {}) - s = Roo::Spreadsheet.open(filepath, options.merge({ extension: fileext })) - - row_index = 1 - s.each do |row| - if row_index == 1 - # @todo try to detect headers; for now using the index is ok - else - yield row, row_index - end - row_index += 1 - end - row_index - end -end From ace65518804219e6e47410d3486b9d8dd05f3f8c Mon Sep 17 00:00:00 2001 From: viehlieb Date: Tue, 21 Feb 2023 15:17:19 +0100 Subject: [PATCH 08/12] add migration and adapt fixture and factories --- .../20230220214408_add_price_per_to_articles.rb | 6 ++++++ db/schema.rb | 15 +++++++++++++-- spec/factories/article.rb | 1 + spec/fixtures/bnn_file_01.bnn | 8 ++++---- 4 files changed, 24 insertions(+), 6 deletions(-) create mode 100644 db/migrate/20230220214408_add_price_per_to_articles.rb diff --git a/db/migrate/20230220214408_add_price_per_to_articles.rb b/db/migrate/20230220214408_add_price_per_to_articles.rb new file mode 100644 index 00000000..b4fad488 --- /dev/null +++ b/db/migrate/20230220214408_add_price_per_to_articles.rb @@ -0,0 +1,6 @@ +class AddPricePerToArticles < ActiveRecord::Migration[7.0] + def change + add_column :articles, :price_per, :float, default: 0.0 + add_column :articles, :unit_symbol, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index 50c24c41..54a67861 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,17 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.0].define(version: 2023_01_06_144440) do +ActiveRecord::Schema[7.0].define(version: 2023_02_20_214408) do + create_table "action_text_rich_texts", charset: "utf8mb4", collation: "utf8mb4_general_ci", force: :cascade do |t| + t.string "name", null: false + t.text "body", size: :long + t.string "record_type", null: false + t.bigint "record_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["record_type", "record_id", "name"], name: "index_action_text_rich_texts_uniqueness", unique: true + end + create_table "active_storage_attachments", id: :integer, charset: "utf8mb4", collation: "utf8mb4_general_ci", force: :cascade do |t| t.string "name", null: false t.string "record_type", null: false @@ -75,6 +85,8 @@ ActiveRecord::Schema[7.0].define(version: 2023_01_06_144440) do t.datetime "deleted_at", precision: nil t.string "type" t.integer "quantity", default: 0 + t.float "price_per", default: 0.0 + t.string "unit_symbol" t.index ["article_category_id"], name: "index_articles_on_article_category_id" t.index ["name", "supplier_id"], name: "index_articles_on_name_and_supplier_id" t.index ["supplier_id"], name: "index_articles_on_supplier_id" @@ -282,7 +294,6 @@ ActiveRecord::Schema[7.0].define(version: 2023_01_06_144440) do create_table "messages", id: :integer, charset: "utf8mb4", collation: "utf8mb4_general_ci", force: :cascade do |t| t.integer "sender_id" t.string "subject", null: false - t.text "body" t.boolean "private", default: false t.datetime "created_at", precision: nil t.integer "reply_to" diff --git a/spec/factories/article.rb b/spec/factories/article.rb index 69e23d88..87535b67 100644 --- a/spec/factories/article.rb +++ b/spec/factories/article.rb @@ -7,6 +7,7 @@ FactoryBot.define do tax { [6, 21].sample } deposit { rand(10) < 8 ? 0 : [0.0, 0.80, 1.20, 12.00].sample } unit_quantity { rand(5) < 3 ? 1 : rand(1..20) } + price_per { rand(0.1..26.0).round(2) } factory :article do sequence(:name) { |n| Faker::Lorem.words(number: rand(2..4)).join(' ') + " ##{n}" } diff --git a/spec/fixtures/bnn_file_01.bnn b/spec/fixtures/bnn_file_01.bnn index 177da7be..11772352 100644 --- a/spec/fixtures/bnn_file_01.bnn +++ b/spec/fixtures/bnn_file_01.bnn @@ -1,5 +1,5 @@ BNN;3;0;Naturkost Nord, Hamburg;T;Angebot Nr. 0922;EUR;20220905;20221001;20220825;837;1 -29932;;;;4280001958081;4280001958203;Walnoten (ongeroosterd);bio;;;med;;GR;C%;DE-?KO-001;120;1302;10;55;;1;;1;1 kg;1;N;930190;99260;;1,41;;;;1;;;4,49;2,34;J;;2;3;;;;;;;;;;;;;;;;;;;A;;;;;Kg;28,571;; -28391;;;;4280001958081;4280001958203;Pijnboompitten;dem;;;med;;GR;C%;DE-?KO-001;120;1302;10;55;;1;;1;100 g;10;N;930190;99260;;1,41;;;;1;;;5,56;2.89;J;;2;3;;;;;;;;;;;;;;;;;;;A;;;;;Kg;28,571;; -1829;;;;4280001958081;4280001958203;Appelsap (verpakt);;;;med;;GR;C%;DE-?KO-001;120;1302;10;55;;1;4x250 ml;10;4x250 ml;10;N;930190;99260;;3,21;;;;1;;;4,49;2.89;J;;2;3;;;;;;;;;;;;;;;;;;;A;;;;;ml;28,571;; -177813;;;;4280001958081;4280001958203;Tomaten;bio;;;med;;GR;C%;DE-?KO-001;120;1302;10;55;;1;;1;500 g;20;N;930190;99260;;1,20;;;;1;;;4,49;2.89;J;;2;3;;;;;;;;;;;;;;;;;;;A;;;;;g;28,571;; +29932;;;;4280001958081;4280001958203;Walnoten (ongeroosterd);bio;;;med;;GR;C%;DE-?KO-001;120;1302;10;55;;1;;1;1 kg;1;N;930190;99260;;1,41;;;;1;;;4,49;2,34;J;;2;3;;;;;;;;;;;;;;;;;;;A;;;;;Kg;1;; +28391;;;;4280001958081;4280001958203;Pijnboompitten;dem;;;med;;GR;C%;DE-?KO-001;120;1302;10;55;;1;;1;100 g;10;N;930190;99260;;1,41;;;;1;;;5,56;2.89;J;;2;3;;;;;;;;;;;;;;;;;;;A;;;;;Kg;10;; +1829;;;;4280001958081;4280001958203;Appelsap (verpakt);;;;med;;GR;C%;DE-?KO-001;120;1302;10;55;;1;4x250 ml;10;4x250 ml;10;N;930190;99260;;3,21;;;;1;;;4,49;2.89;J;;2;3;;;;;;;;;;;;;;;;;;;A;;;;;l;4;; +177813;;;;4280001958081;4280001958203;Tomaten;bio;;;med;;GR;C%;DE-?KO-001;120;1302;10;55;;1;;1;500 g;20;N;930190;99260;;1,20;;;;1;;;4,49;2.89;J;;2;3;;;;;;;;;;;;;;;;;;;A;;;;;Kg;2;; From 25985a262901794032496a84c5dc9d0a957badd8 Mon Sep 17 00:00:00 2001 From: viehlieb Date: Tue, 21 Feb 2023 15:18:11 +0100 Subject: [PATCH 09/12] add price_per to localiced input --- app/models/article.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/models/article.rb b/app/models/article.rb index 76a68605..a9449e87 100644 --- a/app/models/article.rb +++ b/app/models/article.rb @@ -51,7 +51,7 @@ class Article < ApplicationRecord has_many :orders, through: :order_articles # Replace numeric seperator with database format - localize_input_of :price, :tax, :deposit + localize_input_of :price, :tax, :deposit, :price_per # Get rid of unwanted whitespace. {Unit#new} may even bork on whitespace. normalize_attributes :name, :unit, :note, :manufacturer, :origin, :order_number @@ -152,6 +152,7 @@ class Article < ApplicationRecord :price => [self.price.to_f.round(2), new_price.to_f.round(2)], :tax => [self.tax, new_article.tax], :deposit => [self.deposit.to_f.round(2), new_article.deposit.to_f.round(2)], + :price_per => [self.price_per.to_f.round(2), new_article.price_per.to_f.round(2)], # take care of different num-objects. :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] From 7ddb6ec0ef5607b154becf8f1143de52b258c227 Mon Sep 17 00:00:00 2001 From: viehlieb Date: Tue, 21 Feb 2023 15:19:56 +0100 Subject: [PATCH 10/12] build shared_article with price_per attribute, rubocop supplier --- app/models/shared_article.rb | 4 +++- app/models/supplier.rb | 1 - 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/models/shared_article.rb b/app/models/shared_article.rb index 238b48f0..c09a9ec0 100644 --- a/app/models/shared_article.rb +++ b/app/models/shared_article.rb @@ -19,8 +19,10 @@ class SharedArticle < ApplicationRecord :unit_quantity => unit_quantity, :order_number => number, :article_category => ArticleCategory.find_match(category), + :price_per => price_per, + :unit_symbol => unit_symbol, # convert to db-compatible-string - :shared_updated_on => updated_on.to_formatted_s(:db) + :shared_updated_on => updated_on.to_fs(:db) ) end end diff --git a/app/models/supplier.rb b/app/models/supplier.rb index 9d6cd8a5..245e2620 100644 --- a/app/models/supplier.rb +++ b/app/models/supplier.rb @@ -88,7 +88,6 @@ class Supplier < ApplicationRecord new_attrs[:article_category] = ArticleCategory.find_match(new_attrs[:article_category]) new_attrs[:tax] ||= FoodsoftConfig[:tax_default] new_article = articles.build(new_attrs) - if status.nil? if article.nil? new_articles << new_article From 1106178e38c132192830599dc06fc7d9e14b703d Mon Sep 17 00:00:00 2001 From: viehlieb Date: Tue, 21 Feb 2023 16:50:53 +0100 Subject: [PATCH 11/12] add price_per quantity unit to group order new --- Gemfile | 2 +- Gemfile.lock | 5 ++--- app/models/article.rb | 10 +++++++++- app/models/concerns/price_calculation.rb | 8 ++++++++ app/models/group_order.rb | 2 ++ app/models/supplier.rb | 1 + app/views/articles/_form.html.haml | 1 + app/views/articles/_sync.html.haml | 4 ++-- app/views/articles/_sync_table.html.haml | 6 ++++++ app/views/group_orders/_form.html.haml | 2 ++ config/locales/de.yml | 1 + config/locales/en.yml | 1 + config/locales/es.yml | 1 + config/locales/fr.yml | 1 + config/locales/nl.yml | 1 + spec/fixtures/bnn_file_02.bnn | 2 +- 16 files changed, 40 insertions(+), 8 deletions(-) diff --git a/Gemfile b/Gemfile index 1fda1f10..512ea260 100644 --- a/Gemfile +++ b/Gemfile @@ -51,7 +51,7 @@ gem 'ice_cube' # At time of development 01-06-2022 mmddyyyy necessary fix for config_helper.rb form builder was not in rubygems so we pull from github, see: https://github.com/gregschmit/recurring_select/pull/152 gem 'recurring_select', git: 'https://github.com/gregschmit/recurring_select' # TODO: publish gem on github -gem 'foodsoft_article_import', git: 'https://git.local-it.org/Foodsoft/foodsoft_article_import', tag: 'v0.1' +gem 'foodsoft_article_import', git: 'https://git.local-it.org/Foodsoft/foodsoft_article_import', tag: 'v1.9' gem 'roo' gem 'roo-xls' gem 'spreadsheet' diff --git a/Gemfile.lock b/Gemfile.lock index 0c9eaf3d..3387fb74 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,11 +1,10 @@ GIT remote: https://git.local-it.org/Foodsoft/foodsoft_article_import - revision: c7e432c247ca6aa327ae889d22f78227efed2479 - tag: v0.1 + revision: 573851e5497758e1d27d2199f03b939e6bda9e35 + tag: v1.9 specs: foodsoft_article_import (1.0.0) roo (~> 2.9.0) - simplecov GIT remote: https://github.com/gregschmit/recurring_select diff --git a/app/models/article.rb b/app/models/article.rb index a9449e87..7e7d7fa5 100644 --- a/app/models/article.rb +++ b/app/models/article.rb @@ -142,7 +142,14 @@ class Article < ApplicationRecord new_unit_quantity = new_article.unit_quantity new_unit = new_article.unit end - + puts " + " + "______________" + " + " + "______________" + " + " + "_____oha_________" + " + " + "#{new_article.unit_symbol}" + " + " + "______________"+ " + " + "______________"+ " + " + "______________" return Article.compare_attributes( { :name => [self.name, new_article.name], @@ -153,6 +160,7 @@ class Article < ApplicationRecord :tax => [self.tax, new_article.tax], :deposit => [self.deposit.to_f.round(2), new_article.deposit.to_f.round(2)], :price_per => [self.price_per.to_f.round(2), new_article.price_per.to_f.round(2)], + :unit_symbol => [self.unit_symbol, new_article.unit_symbol], # take care of different num-objects. :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] diff --git a/app/models/concerns/price_calculation.rb b/app/models/concerns/price_calculation.rb index 03b9a7ad..b7a18415 100644 --- a/app/models/concerns/price_calculation.rb +++ b/app/models/concerns/price_calculation.rb @@ -12,6 +12,14 @@ module PriceCalculation add_percent(gross_price, FoodsoftConfig[:price_markup]) end + def fc_price_per + if price_per > 0 + add_percent(add_percent(price_per, tax), FoodsoftConfig[:price_markup]) + else + fc_price + end + end + private def add_percent(value, percent) diff --git a/app/models/group_order.rb b/app/models/group_order.rb index c789ef4e..73c0e5d1 100644 --- a/app/models/group_order.rb +++ b/app/models/group_order.rb @@ -45,6 +45,8 @@ class GroupOrder < ApplicationRecord # Build hash with relevant data data[:order_articles][order_article.id] = { :price => order_article.article.fc_price, + :price_per => order_article.article.fc_price_per, + :unit_symbol => order_article.article.unit_symbol, :unit => order_article.article.unit_quantity, :quantity => (goa ? goa.quantity : 0), :others_quantity => order_article.quantity - (goa ? goa.quantity : 0), diff --git a/app/models/supplier.rb b/app/models/supplier.rb index 245e2620..8ae5ef42 100644 --- a/app/models/supplier.rb +++ b/app/models/supplier.rb @@ -112,6 +112,7 @@ class Supplier < ApplicationRecord if options[:outlist_absent] outlisted_articles += articles.undeleted.where.not(order_number: all_order_numbers + [nil]) end + # TODO: change price_per to scale factor return [updated_article_pairs, outlisted_articles, new_articles] end diff --git a/app/views/articles/_form.html.haml b/app/views/articles/_form.html.haml index 7cbd64cd..fbab5d48 100644 --- a/app/views/articles/_form.html.haml +++ b/app/views/articles/_form.html.haml @@ -1,5 +1,6 @@ = simple_form_for [@supplier, @article], :validate => true, :remote => true do |f| = f.hidden_field :shared_updated_on + = f.hidden_field :unit_symbol = f.hidden_field :supplier_id .modal-header = close_button :modal diff --git a/app/views/articles/_sync.html.haml b/app/views/articles/_sync.html.haml index 05945112..37584369 100644 --- a/app/views/articles/_sync.html.haml +++ b/app/views/articles/_sync.html.haml @@ -17,14 +17,14 @@ %i = t '.update.update_msg', count: @updated_article_pairs.size = t '.update.body' - = render 'sync_table', articles: @updated_article_pairs, field: 'articles', hidden_fields: %w(shared_updated_on) + = render 'sync_table', articles: @updated_article_pairs, field: 'articles', hidden_fields: %w(shared_updated_on unit_symbol) %hr/ - if @new_articles.any? %h2= t '.upnew.title' %p %i= t '.upnew.body_count', count: @new_articles.length - = render 'sync_table', articles: @new_articles, field: 'new_articles', hidden_fields: %w(shared_updated_on order_number availability) + = render 'sync_table', articles: @new_articles, field: 'new_articles', hidden_fields: %w(shared_updated_on order_number availability unit_symbol) %hr/ - if ignored_article_count > 0 diff --git a/app/views/articles/_sync_table.html.haml b/app/views/articles/_sync_table.html.haml index ac17adfa..4704ee79 100644 --- a/app/views/articles/_sync_table.html.haml +++ b/app/views/articles/_sync_table.html.haml @@ -8,6 +8,7 @@ %th= heading_helper Article, :unit %th= heading_helper Article, :unit_quantity, short: true %th= heading_helper Article, :price + %th= heading_helper Article, :price_per %th= heading_helper Article, :tax %th= heading_helper Article, :deposit %th= heading_helper Article, :article_category @@ -23,6 +24,7 @@ %td= article.unit %td= article.unit_quantity %td= number_to_currency article.price + %td= number_to_currency article.price_per.round(2) %td= number_to_percentage article.tax %td= number_to_currency article.deposit %td= article.article_category.name if article.article_category @@ -41,6 +43,10 @@ .input-prepend %span.add-on= t 'number.currency.format.unit' = form.text_field 'price', class: 'input-mini', style: 'width: 45px' + %td{:style => highlight_new(attrs, :price_per)} + .input-prepend + %span.add-on= t 'number.currency.format.unit' + = form.text_field 'price_per', class: 'input-mini', style: 'width: 45px' %td{:style => highlight_new(attrs, :tax)} .input-append = form.text_field 'tax', class: 'input-mini', style: 'width: 45px' diff --git a/app/views/group_orders/_form.html.haml b/app/views/group_orders/_form.html.haml index 3ffd583e..72e90584 100644 --- a/app/views/group_orders/_form.html.haml +++ b/app/views/group_orders/_form.html.haml @@ -77,6 +77,7 @@ %th{style: 'width:120px'}= heading_helper StockArticle, :supplier %th{style: "width:13px;"} %th{style: "width:4.5em;"}= t '.price' + %th{style: "width:4.5em;"}= t '.price_per' %th{style: "width:4.5em;"}= heading_helper Article, :unit - unless @order.stockit? %th{style: "width:70px;"}= heading_helper OrderArticle, :missing_units, short: true @@ -100,6 +101,7 @@ %td= truncate order_article.article.supplier.name, length: 15 %td= h order_article.article.origin %td= number_to_currency(@ordering_data[:order_articles][order_article.id][:price]) + %td= "#{number_to_currency(@ordering_data[:order_articles][order_article.id][:price_per])}/#{@ordering_data[:order_articles][order_article.id][:unit_symbol]||@ordering_data[:order_articles][order_article.id][:unit]}" %td= order_article.article.unit %td - if @order.stockit? diff --git a/config/locales/de.yml b/config/locales/de.yml index 5a1a5b35..ee96c7e9 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -1052,6 +1052,7 @@ de: action_save: Bestellung speichern new_funds: Neuer Kontostand price: Preis + price_per: Preis je Mengeneinheit (ohne Pfand) reset_article_search: Suche zurücksetzen search_article: Artikel suchen... sum_amount: Gesamtbestellmenge bisher diff --git a/config/locales/en.yml b/config/locales/en.yml index 59e94385..8a87ed2c 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1054,6 +1054,7 @@ en: action_save: Save order new_funds: New account balance price: Price + price_per: Price per quantity unit (without deposit) reset_article_search: Reset search search_article: Search for articles... sum_amount: Current amount diff --git a/config/locales/es.yml b/config/locales/es.yml index 620ec3bb..31372e7d 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -929,6 +929,7 @@ es: action_save: Guardar pedido new_funds: Nuevo balance de cuenta price: Precio + price_per: Precio por unidad de cantidad (sin depósito) reset_article_search: Reinicia la búsqueda search_article: Busca artículos... sum_amount: Cantidad actual diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 4dbdb864..07d9ab5f 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -678,6 +678,7 @@ fr: action_save: Enregistrer ta commande new_funds: Nouveau solde price: Prix + price_per: Prix par unité de quantité (sans consigne) reset_article_search: Réinitialiser la recherche search_article: Rechercher des produits... sum_amount: Quantité déjà commandée diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 4c97dda4..8da6126f 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -1024,6 +1024,7 @@ nl: action_save: Bestelling opslaan new_funds: Nieuw tegoed price: Prijs + price_per: Prijs per hoeveelheidseenheid (zonder statiegeld) reset_article_search: Alles tonen search_article: Artikelen zoeken... sum_amount: Huidig totaalbedrag diff --git a/spec/fixtures/bnn_file_02.bnn b/spec/fixtures/bnn_file_02.bnn index e3dba5bb..dfcdd7a2 100644 --- a/spec/fixtures/bnn_file_02.bnn +++ b/spec/fixtures/bnn_file_02.bnn @@ -1,2 +1,2 @@ BNN;3;0;Naturkost Nord, Hamburg;T;Angebot Nr. 0922;EUR;20220905;20221001;20220825;837;1 -1;;;;4280001958081;4280001958203;Tomatoes;organic;;;med;;GR;C%;DE-?KO-001;120;1302;10;55;;1;;20;500 g;1;N;930190;99260;;1,41;;;;1;;;4,49;1,20;J;;2;3;;;;;;;;;;;;;;;;;;;A;;;;;g;28,571;; \ No newline at end of file +1;;;;4280001958081;4280001958203;Tomatoes;organic;;;med;;GR;C%;DE-?KO-001;120;1302;10;55;;1;;20;500 g;1;N;930190;99260;;1,41;;;;1;;;4,49;1,20;J;;2;3;;;;;;;;;;;;;;;;;;;A;;;;;Kg;2;; \ No newline at end of file From 7d2d74ee64bc3d4dd5bd9ae811742108abeb8351 Mon Sep 17 00:00:00 2001 From: viehlieb Date: Fri, 24 Feb 2023 16:23:53 +0100 Subject: [PATCH 12/12] removedev notes --- app/models/article.rb | 8 -------- app/models/supplier.rb | 1 - 2 files changed, 9 deletions(-) diff --git a/app/models/article.rb b/app/models/article.rb index 7e7d7fa5..56067367 100644 --- a/app/models/article.rb +++ b/app/models/article.rb @@ -142,14 +142,6 @@ class Article < ApplicationRecord new_unit_quantity = new_article.unit_quantity new_unit = new_article.unit end - puts " - " + "______________" + " - " + "______________" + " - " + "_____oha_________" + " - " + "#{new_article.unit_symbol}" + " - " + "______________"+ " - " + "______________"+ " - " + "______________" return Article.compare_attributes( { :name => [self.name, new_article.name], diff --git a/app/models/supplier.rb b/app/models/supplier.rb index 8ae5ef42..245e2620 100644 --- a/app/models/supplier.rb +++ b/app/models/supplier.rb @@ -112,7 +112,6 @@ class Supplier < ApplicationRecord if options[:outlist_absent] outlisted_articles += articles.undeleted.where.not(order_number: all_order_numbers + [nil]) end - # TODO: change price_per to scale factor return [updated_article_pairs, outlisted_articles, new_articles] end