Skip to content

Commit 2f32e39

Browse files
committed
feat: maximumx order quantity for order article
1 parent e127dc2 commit 2f32e39

14 files changed

Lines changed: 113 additions & 8 deletions

app/assets/javascripts/article-form.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ class ArticleForm {
1313
this.supplierUnitSelect$ = $(`#${this.unitFieldsIdPrefix}_supplier_order_unit`, this.articleForm$);
1414
this.unitRatiosTable$ = $('#fc_base_price', this.articleForm$);
1515
this.minimumOrderQuantity$ = $(`#${this.unitFieldsIdPrefix}_minimum_order_quantity`, this.articleForm$);
16+
this.maximumOrderQuantity$ = $(`#${this.unitFieldsIdPrefix}_maximum_order_quantity`, this.articleForm$);
1617
this.billingUnit$ = $(`#${this.unitFieldsIdPrefix}_billing_unit`, this.articleForm$);
1718
this.groupOrderGranularity$ = $(`#${this.unitFieldsIdPrefix}_group_order_granularity`, this.articleForm$);
1819
this.groupOrderUnit$ = $(`#${this.unitFieldsIdPrefix}_group_order_unit`, this.articleForm$);

app/controllers/order_articles_controller.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def create
2626
end
2727

2828
def update
29-
version_params = params.require(:article_version).permit(:id, :unit, :supplier_order_unit, :minimum_order_quantity,
29+
version_params = params.require(:article_version).permit(:id, :unit, :supplier_order_unit, :minimum_order_quantity, :maximum_order_quantity,
3030
:billing_unit, :group_order_granularity, :group_order_unit, :price, :price_unit, :tax, :deposit, article_unit_ratios_attributes: %i[id sort quantity unit _destroy])
3131
@order_article.update_handling_versioning!(params[:order_article], version_params)
3232
rescue StandardError

app/models/article.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ def unequal_attributes(new_article, options = {})
158158
unit: [latest_article_version.unit, new_unit],
159159
supplier_order_unit: [latest_article_version.supplier_order_unit, new_article.supplier_order_unit],
160160
minimum_order_quantity: [latest_article_version.minimum_order_quantity, new_article.minimum_order_quantity],
161+
maximum_order_quantity: [latest_article_version.maximum_order_quantity, new_article.maximum_order_quantity],
161162
billing_unit: [latest_article_version.billing_unit || latest_article_version.supplier_order_unit,
162163
new_article.billing_unit || new_article.supplier_order_unit],
163164
group_order_granularity: [latest_article_version.group_order_granularity, new_article.group_order_granularity],

app/models/article_version.rb

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ class ArticleVersion < ApplicationRecord
4141
validates :group_order_granularity, numericality: { greater_than_or_equal_to: 0 }
4242
validates :deposit, :tax, numericality: true
4343
validates :minimum_order_quantity, numericality: { allow_nil: true }
44-
44+
validates :maximum_order_quantity, numericality: { allow_nil: true }
4545
# validates_uniqueness_of :name, :scope => [:supplier_id, :deleted_at, :type], if: Proc.new {|a| a.supplier.shared_sync_method.blank? or a.supplier.shared_sync_method == 'import' }
4646
# validates_uniqueness_of :name, :scope => [:supplier_id, :deleted_at, :type, :unit, :unit_quantity]
4747
validate :uniqueness_of_name
@@ -122,6 +122,20 @@ def minimum_order_quantity=(value)
122122
end
123123
end
124124

125+
def maximum_order_quantity=(value)
126+
if value.blank?
127+
self[:maximum_order_quantity] = nil
128+
else
129+
value = value.gsub(I18n.t('number.format.separator'), '.') if value.is_a?(String)
130+
begin
131+
value = value.to_i if Float(value) % 1 == 0
132+
rescue ArgumentError
133+
# not any number -> let validation handle this
134+
end
135+
super(value)
136+
end
137+
end
138+
125139
def self_or_ratios_changed?
126140
changed? || @article_unit_ratios_changed || article_unit_ratios.any?(&:changed?)
127141
end

app/models/group_order.rb

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,14 +54,19 @@ def load_data
5454
used_tolerance: (goa ? goa.result(:tolerance) : 0),
5555
total_price: (goa ? goa.total_price : 0),
5656
missing_units: order_article.missing_units,
57-
ratio_group_order_unit_supplier_unit: order_article.article_version.convert_quantity(1,
58-
order_article.article_version.supplier_order_unit, order_article.article_version.group_order_unit),
59-
quantity_available: (order.stockit? ? order_article.article_version.article.quantity_available : 0),
57+
ratio_group_order_unit_supplier_unit: order_article.article_version.convert_quantity(1, order_article.article_version.supplier_order_unit, order_article.article_version.group_order_unit),
6058
minimum_order_quantity: if order_article.article_version.minimum_order_quantity
6159
order_article.article_version.convert_quantity(
6260
order_article.article_version.minimum_order_quantity, order_article.article_version.supplier_order_unit, order_article.article_version.group_order_unit
6361
)
64-
end
62+
end,
63+
quantity_available: (if order.stockit?
64+
order_article.article_version.article.quantity_available
65+
elsif order_article.article_version.maximum_order_quantity
66+
order_article.article_version.convert_quantity(
67+
[order_article.article_version.maximum_order_quantity - order_article.quantity + goa.quantity, 0].max, order_article.article_version.supplier_order_unit, order_article.article_version.group_order_unit
68+
)
69+
end)
6570
}
6671
end
6772
end

app/models/order_article.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ def update_results!
8181
# 4 | 5 | 4 | 2
8282
#
8383
def calculate_units_to_order(quantity, tolerance = 0)
84+
quantity = [price.maximum_order_quantity || quantity, quantity].min
8485
return 0 if !price.minimum_order_quantity.nil? && quantity + tolerance < price.minimum_order_quantity
8586
return price.minimum_order_quantity if quantity > 0 && !price.minimum_order_quantity.nil? && quantity < price.minimum_order_quantity && quantity + tolerance >= price.minimum_order_quantity
8687

app/views/articles/_edit_all_table.html.haml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,10 @@
5656
= form.input :minimum_order_quantity, label: "Mininum order quantity" do
5757
.input-append
5858
= form.input_field :minimum_order_quantity, class: 'input-mini', title: "total minimum order quantity for this article"
59+
.fold-line
60+
= form.input :maximum_order_quantity, label: "Mininum order quantity" do
61+
.input-append
62+
= form.input_field :maximum_order_quantity, class: 'input-mini', title: "total minimum order quantity for this article"
5963
.fold-line
6064
= form.input :billing_unit, as: :select, collection: [], input_html: {'data-initial-value': article.billing_unit, class: 'input-medium'}, include_blank: false
6165
.fold-line

app/views/articles/_sync_table.html.haml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,13 @@
7676
%span.add-on
7777
- unless changed_article.new_record?
7878
%p.help-block{style: 'color: grey;'}=article.minimum_order_quantity.to_s
79+
.fold-line
80+
= form.input :maximum_order_quantity, label: "Maximum order quantity" do
81+
.input-append
82+
= form.input_field :maximum_order_quantity, class: 'input-mini', style: highlight_new(attrs, :maximum_order_quantity), title: "total maximum order quantity for this article"
83+
%span.add-on
84+
- unless changed_article.new_record?
85+
%p.help-block{style: 'color: grey;'}=article.maximum_order_quantity.to_s
7986
.fold-line
8087
= form.input :billing_unit, hint: changed_article.new_record? ? nil : ArticleUnitsLib.get_translated_name_for_code(article.billing_unit || article.supplier_order_unit), hint_html: {style: 'color: grey;'}, as: :select, collection: [], input_html: {'data-initial-value': changed_article.billing_unit, class: 'input-medium', style: highlight_new(attrs, :billing_unit)}, include_blank: false
8188
.fold-line

app/views/articles/upload.html.haml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
%th= Article.human_attribute_name(:custom_unit)
1313
%th= Article.human_attribute_name(:ratios_to_supplier_order_unit)
1414
%th= Article.human_attribute_name(:minimum_order_quantity)
15+
%th= Article.human_attribute_name(:maximum_order_quantity)
1516
%th= Article.human_attribute_name(:billing_unit)
1617
%th= Article.human_attribute_name(:group_order_granularity)
1718
%th= Article.human_attribute_name(:group_order_unit)

app/views/group_orders/_form.html.haml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@
126126
%i.icon-minus
127127
%a.btn.btn-ordering.increase
128128
%i.icon-plus
129-
%input.goa-quantity{type: "number", name: "group_order[group_order_articles_attributes][#{order_article.id}][quantity]", value: @ordering_data[:order_articles][order_article.id][:quantity], data: quantity_data, autocomplete: 'off', class: 'input-mini numeric', style: ('display:none' if @order.stockit?), min: 0, max: (@ordering_data[:order_articles][order_article.id][:quantity_available] if @order.stockit?), step: order_article.article_version.group_order_granularity}
129+
%input.goa-quantity{type: "number", name: "group_order[group_order_articles_attributes][#{order_article.id}][quantity]", value: @ordering_data[:order_articles][order_article.id][:quantity], data: quantity_data, autocomplete: 'off', class: 'input-mini numeric', style: ('display:none' if @order.stockit?), min: 0, max: (@ordering_data[:order_articles][order_article.id][:quantity_available]), step: order_article.article_version.group_order_granularity}
130130
%span.numeric-step-error
131131
= t('errors.step_error', granularity: order_article.article_version.group_order_granularity, min: 0)
132132

0 commit comments

Comments
 (0)