Class: ArticlesController

Inherits:
ApplicationController show all
Defined in:
app/controllers/articles_controller.rb

Instance Method Summary collapse

Methods inherited from ApplicationController

current

Methods included from PathHelper

#finance_group_transactions_path

Instance Method Details

#copyObject



44
45
46
47
# File 'app/controllers/articles_controller.rb', line 44

def copy
  @article = @supplier.articles.find(params[:article_id]).dup
  render layout: false
end

#createObject



54
55
56
57
58
59
60
61
# File 'app/controllers/articles_controller.rb', line 54

def create
  @article = Article.new(params[:article])
  if @article.valid? && @article.save
    render layout: false
  else
    render action: 'new', layout: false
  end
end

#destroyObject

Deletes article from database. send error msg, if article is used in a current order



75
76
77
78
79
# File 'app/controllers/articles_controller.rb', line 75

def destroy
  @article = Article.find(params[:id])
  @article.mark_as_deleted unless @order = @article.in_open_order # If article is in an active Order, the Order will be returned
  render layout: false
end

#editObject



49
50
51
52
# File 'app/controllers/articles_controller.rb', line 49

def edit
  @article = Article.find(params[:id])
  render action: 'new', layout: false
end

#edit_allObject

Renders a form for editing all articles from a supplier



82
83
84
# File 'app/controllers/articles_controller.rb', line 82

def edit_all
  @articles = @supplier.articles.undeleted
end

#importObject

fills a form whith values of the selected shared_article when the direct parameter is set and the article is valid, it is imported directly



226
227
228
229
230
231
232
233
234
# File 'app/controllers/articles_controller.rb', line 226

def import
  @article = SharedArticle.find(params[:shared_article_id]).build_new_article(@supplier)
  @article. = params[:article_category_id] if params[:article_category_id].present?
  if params[:direct] && params[:article_category_id].present? && @article.valid? && @article.save
    render action: 'create', layout: false
  else
    render action: 'new', layout: false
  end
end

#indexObject



4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'app/controllers/articles_controller.rb', line 4

def index
  sort = if params['sort']
           case params['sort']
           when 'name' then 'articles.name'
           when 'unit' then 'articles.unit'
           when 'article_category' then 'article_categories.name'
           when 'note' then 'articles.note'
           when 'availability' then 'articles.availability'
           when 'name_reverse' then 'articles.name DESC'
           when 'unit_reverse' then 'articles.unit DESC'
           when 'article_category_reverse' then 'article_categories.name DESC'
           when 'note_reverse' then 'articles.note DESC'
           when 'availability_reverse' then 'articles.availability DESC'
           end
         else
           'article_categories.name, articles.name'
         end

  @articles = Article.undeleted.where(supplier_id: @supplier, type: nil).includes(:article_category).order(sort)

  if request.format.csv?
    send_data ArticlesCsv.new(@articles, encoding: 'utf-8').to_csv, filename: 'articles.csv', type: 'text/csv'
    return
  end

  @articles = @articles.where('articles.name LIKE ?', "%#{params[:query]}%") unless params[:query].nil?

  @articles = @articles.page(params[:page]).per(@per_page)

  respond_to do |format|
    format.html
    format.js { render layout: false }
  end
end

#newObject



39
40
41
42
# File 'app/controllers/articles_controller.rb', line 39

def new
  @article = @supplier.articles.build(tax: FoodsoftConfig[:tax_default])
  render layout: false
end

#parse_uploadObject

Update articles from a spreadsheet



146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
# File 'app/controllers/articles_controller.rb', line 146

def parse_upload
  uploaded_file = params[:articles]['file'] or raise I18n.t('articles.controller.parse_upload.no_file')
  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')
  end
  @ignored_article_count = 0
rescue StandardError => e
  redirect_to upload_supplier_articles_path(@supplier), alert: I18n.t('errors.general_msg', msg: e.message)
end

#sharedObject

renders a view to import articles in local database



215
216
217
218
219
220
221
222
# File 'app/controllers/articles_controller.rb', line 215

def shared
  # build array of keywords, required for ransack _all suffix
  q = params.fetch(:q, {})
  q[:name_cont_all] = params.fetch(:name_cont_all_joined, '').split(' ')
  search = @supplier.shared_supplier.shared_articles.ransack(q)
  @articles = search.result.page(params[:page]).per(10)
  render layout: false
end

#syncObject

sync all articles with the external database renders a form with articles, which should be updated



164
165
166
167
168
169
170
171
172
173
174
175
# File 'app/controllers/articles_controller.rb', line 164

def sync
  # check if there is an shared_supplier
  unless @supplier.shared_supplier
    redirect_to supplier_articles_url(@supplier),
                alert: I18n.t('articles.controller.sync.shared_alert', supplier: @supplier.name)
  end
  # sync articles against external database
  @updated_article_pairs, @outlisted_articles, @new_articles = @supplier.sync_all
  return unless @updated_article_pairs.empty? && @outlisted_articles.empty? && @new_articles.empty?

  redirect_to supplier_articles_path(@supplier), notice: I18n.t('articles.controller.sync.notice')
end

#updateObject

Updates one Article and highlights the line if succeded



64
65
66
67
68
69
70
71
72
# File 'app/controllers/articles_controller.rb', line 64

def update
  @article = Article.find(params[:id])

  if @article.update(params[:article])
    render layout: false
  else
    render action: 'new', layout: false
  end
end

#update_allObject

Updates all article of specific supplier



87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'app/controllers/articles_controller.rb', line 87

def update_all
  invalid_articles = false

  Article.transaction do
    if params[:articles].present?
      # Update other article attributes...
      @articles = Article.find(params[:articles].keys)
      @articles.each do |article|
        unless article.update(params[:articles][article.id.to_s])
          invalid_articles ||= true # Remember that there are validation errors
        end
      end

      raise ActiveRecord::Rollback if invalid_articles # Rollback all changes
    end
  end

  if invalid_articles
    # An error has occurred, transaction has been rolled back.
    flash.now.alert = I18n.t('articles.controller.error_invalid')
    render :edit_all
  else
    # Successfully done.
    redirect_to supplier_articles_path(@supplier), notice: I18n.t('articles.controller.update_all.notice')
  end
end

#update_selectedObject

makes different actions on selected articles



115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# File 'app/controllers/articles_controller.rb', line 115

def update_selected
  raise I18n.t('articles.controller.error_nosel') if params[:selected_articles].nil?

  articles = Article.find(params[:selected_articles])
  Article.transaction do
    case params[:selected_action]
    when 'destroy'
      articles.each(&:mark_as_deleted)
      flash[:notice] = I18n.t('articles.controller.update_sel.notice_destroy')
    when 'setNotAvailable'
      articles.each { |a| a.update_attribute(:availability, false) }
      flash[:notice] = I18n.t('articles.controller.update_sel.notice_unavail')
    when 'setAvailable'
      articles.each { |a| a.update_attribute(:availability, true) }
      flash[:notice] = I18n.t('articles.controller.update_sel.notice_avail')
    else
      flash[:alert] = I18n.t('articles.controller.update_sel.notice_noaction')
    end
  end
  # action succeded
  redirect_to supplier_articles_url(@supplier, per_page: params[:per_page])
rescue StandardError => e
  redirect_to supplier_articles_url(@supplier, per_page: params[:per_page]),
              alert: I18n.t('errors.general_msg', msg: e)
end

#update_synchronizedObject

Updates, deletes articles when upload or sync form is submitted



178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
# File 'app/controllers/articles_controller.rb', line 178

def update_synchronized
  @outlisted_articles = Article.find(params[:outlisted_articles].try(:keys) || [])
  @updated_articles = Article.find(params[:articles].try(:keys) || [])
  @updated_articles.map { |a| a.assign_attributes(params[:articles][a.id.to_s]) }
  @new_articles = (params[:new_articles] || []).map { |a| @supplier.articles.build(a) }

  has_error = false
  Article.transaction do
    # delete articles
    begin
      @outlisted_articles.each(&:mark_as_deleted)
    rescue StandardError
      # raises an exception when used in current order
      has_error = true
    end
    # Update articles
    @updated_articles.each { |a| a.save or has_error = true }
    # Add new articles
    @new_articles.each { |a| a.save or has_error = true }

    raise ActiveRecord::Rollback if has_error
  end

  if has_error
    @updated_article_pairs = @updated_articles.map do |article|
      orig_article = Article.find(article.id)
      [article, orig_article.unequal_attributes(article)]
    end
    flash.now.alert = I18n.t('articles.controller.error_invalid')
    render params[:from_action] == 'sync' ? :sync : :parse_upload
  else
    redirect_to supplier_articles_path(@supplier), notice: I18n.t('articles.controller.update_sync.notice')
  end
end

#uploadObject

lets start with parsing articles from uploaded file, yeah Renders the upload form



143
# File 'app/controllers/articles_controller.rb', line 143

def upload; end