Add option to restrict ordering when not enough apples.
This commit is contained in:
parent
d3abc03e56
commit
ff4ab44bcc
11 changed files with 104 additions and 28 deletions
|
@ -5,6 +5,7 @@ class GroupOrdersController < ApplicationController
|
||||||
before_filter :ensure_ordergroup_member
|
before_filter :ensure_ordergroup_member
|
||||||
before_filter :ensure_open_order, :only => [:new, :create, :edit, :update, :order, :stock_order, :saveOrder]
|
before_filter :ensure_open_order, :only => [:new, :create, :edit, :update, :order, :stock_order, :saveOrder]
|
||||||
before_filter :ensure_my_group_order, only: [:show, :edit, :update]
|
before_filter :ensure_my_group_order, only: [:show, :edit, :update]
|
||||||
|
before_filter :enough_apples?, only: [:new, :create]
|
||||||
|
|
||||||
# Index page.
|
# Index page.
|
||||||
def index
|
def index
|
||||||
|
@ -88,4 +89,12 @@ class GroupOrdersController < ApplicationController
|
||||||
redirect_to group_orders_url, alert: 'Fehlerhafte URL, das ist nicht Deine Bestellung.'
|
redirect_to group_orders_url, alert: 'Fehlerhafte URL, das ist nicht Deine Bestellung.'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def enough_apples?
|
||||||
|
if @ordergroup.not_enough_apples?
|
||||||
|
redirect_to group_orders_url,
|
||||||
|
alert: t('not_enough_apples', scope: 'group_orders.messages', apples: @ordergroup.apples,
|
||||||
|
stop_ordering_under: FoodsoftConfig[:stop_ordering_under])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -72,6 +72,15 @@ class Ordergroup < Group
|
||||||
((avg_jobs_per_euro / Ordergroup.avg_jobs_per_euro) * 100).to_i rescue 0
|
((avg_jobs_per_euro / Ordergroup.avg_jobs_per_euro) * 100).to_i rescue 0
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# If the the option stop_ordering_under is set, the ordergroup is only allowed to participate in an order,
|
||||||
|
# when the apples value is above the configured amount.
|
||||||
|
# Only ordergroups, which have participated in more than 5 order are affected
|
||||||
|
def not_enough_apples?
|
||||||
|
FoodsoftConfig[:stop_ordering_under].present? and
|
||||||
|
apples < FoodsoftConfig[:stop_ordering_under] and
|
||||||
|
group_orders.count > 5
|
||||||
|
end
|
||||||
|
|
||||||
# Global average
|
# Global average
|
||||||
def self.avg_jobs_per_euro
|
def self.avg_jobs_per_euro
|
||||||
stats = Ordergroup.all.collect(&:stats)
|
stats = Ordergroup.all.collect(&:stats)
|
||||||
|
|
14
app/views/home/_apple_bar.html.haml
Normal file
14
app/views/home/_apple_bar.html.haml
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
Engagement Deiner Bestellgruppe
|
||||||
|
.stats-bar{style: "width:#{apple_bar.length_of_group_bar}px; background-color:#{apple_bar.group_bar_color}"}
|
||||||
|
= apple_bar.apples
|
||||||
|
= " Äpfel" if apple_bar.length_of_group_bar > 50
|
||||||
|
|
||||||
|
Durchschnittsengagement
|
||||||
|
.stats-bar{style: "width:#{apple_bar.length_of_global_bar}px"}
|
||||||
|
100 Birnen
|
||||||
|
|
||||||
|
%span.description
|
||||||
|
Abgebildet ist das Verhältnis von erledigten Aufgaben zu dem Bestellvolumen Deiner Bestellgruppe im Vergleich zum Durchschnitt in der Foodcoop.
|
||||||
|
Konkret: Pro #{number_to_currency(apple_bar.mean_order_amount_per_job, :precision => 0 )} Bestellsumme solltest Du eine Aufgabe machen!
|
||||||
|
- if FoodsoftConfig[:stop_ordering_under].present?
|
||||||
|
Achtung, hast Du weniger als #{FoodsoftConfig[:stop_ordering_under]} Äpfel, darfst Du nicht mehr bestellen!
|
|
@ -1,27 +0,0 @@
|
||||||
<%
|
|
||||||
max_width = 600
|
|
||||||
|
|
||||||
global_avg = Ordergroup.avg_jobs_per_euro
|
|
||||||
group_avg = ordergroup.avg_jobs_per_euro.to_f
|
|
||||||
|
|
||||||
unless global_avg == 0 or global_avg.nan?
|
|
||||||
length_of_global_bar = max_width / 2.0
|
|
||||||
length_of_group_bar = (group_avg / global_avg) * length_of_global_bar
|
|
||||||
|
|
||||||
length_of_group_bar = max_width if length_of_group_bar > max_width
|
|
||||||
|
|
||||||
color = group_avg >= global_avg ? "#78b74e" : "red"
|
|
||||||
%>
|
|
||||||
Engagement Deiner Bestellgruppe
|
|
||||||
<div class="stats-bar" style="width:<%= length_of_group_bar -%>px; background-color:<%= color -%>">
|
|
||||||
<%= ordergroup.apples -%><%= " Äpfel" if length_of_group_bar > 50 -%>
|
|
||||||
</div>
|
|
||||||
Durchschnittsengagement
|
|
||||||
<div class="stats-bar" style="width:<%= length_of_global_bar -%>px">
|
|
||||||
100 Birnen
|
|
||||||
</div>
|
|
||||||
<span class="description">
|
|
||||||
Abgebildet ist das Verhältnis von erledigten Aufgaben zu dem Bestellvolumen Deiner Bestellgruppe im Vergleich zum Durchschnitt in der Foodcoop.
|
|
||||||
Konkret: Pro <%= number_to_currency( (1/global_avg).round, :precision => 0 ) %> Bestellsumme solltest Du eine Aufgabe machen!
|
|
||||||
</span>
|
|
||||||
<%- end -%>
|
|
|
@ -36,7 +36,7 @@
|
||||||
.box_title
|
.box_title
|
||||||
%h2 Engagement Deiner Bestellgruppe
|
%h2 Engagement Deiner Bestellgruppe
|
||||||
.column_content
|
.column_content
|
||||||
= render :partial => "stats", :locals => {:ordergroup => current_user.ordergroup}
|
= render :partial => "apple_bar", :locals => {:apple_bar => AppleBar.new(current_user.ordergroup)}
|
||||||
|
|
||||||
- unless Message.public.empty?
|
- unless Message.public.empty?
|
||||||
.box_title
|
.box_title
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
.box_title
|
.box_title
|
||||||
%h2 Laufende Bestellungen
|
%h2 Laufende Bestellungen
|
||||||
.column_content
|
.column_content
|
||||||
|
- if ordergroup.not_enough_apples?
|
||||||
|
.warning
|
||||||
|
%p Achtung, Deine Bestellgruppe hat zu wenig Äpfel um Bestellen zu können!
|
||||||
- unless Order.open.empty?
|
- unless Order.open.empty?
|
||||||
%table.list
|
%table.list
|
||||||
%thead
|
%thead
|
||||||
|
|
|
@ -38,6 +38,10 @@ default: &defaults
|
||||||
# for total article price as long as the order is not finished.
|
# for total article price as long as the order is not finished.
|
||||||
tolerance_is_costly: false
|
tolerance_is_costly: false
|
||||||
|
|
||||||
|
# Ordergroups, which have less than 75 apples should not be allowed to make new orders
|
||||||
|
# Comment out this option to activate this restriction
|
||||||
|
# stop_ordering_under: 75
|
||||||
|
|
||||||
# email address to be used as sender
|
# email address to be used as sender
|
||||||
email_sender: foodsoft@myfoodcoop.org
|
email_sender: foodsoft@myfoodcoop.org
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,12 @@ de:
|
||||||
home:
|
home:
|
||||||
index:
|
index:
|
||||||
title: Startseite
|
title: Startseite
|
||||||
|
|
||||||
|
group_orders:
|
||||||
|
messages:
|
||||||
|
not_enough_apples:
|
||||||
|
Um zu Bestellen brauchst Du mindestends %{stop_ordering_under} Äpfel.
|
||||||
|
Momentan hat Deine Bestellgruppe aber nur %{apples} Äpfel.
|
||||||
date:
|
date:
|
||||||
abbr_day_names:
|
abbr_day_names:
|
||||||
- So
|
- So
|
||||||
|
|
48
lib/apple_bar.rb
Normal file
48
lib/apple_bar.rb
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
class AppleBar
|
||||||
|
|
||||||
|
BAR_MAX_WITH = 600
|
||||||
|
|
||||||
|
def initialize(ordergroup)
|
||||||
|
@ordergroup = ordergroup
|
||||||
|
@group_avg = ordergroup.avg_jobs_per_euro.to_f
|
||||||
|
@global_avg = Ordergroup.avg_jobs_per_euro
|
||||||
|
end
|
||||||
|
|
||||||
|
def length_of_global_bar
|
||||||
|
BAR_MAX_WITH / 2.0
|
||||||
|
end
|
||||||
|
|
||||||
|
def length_of_group_bar
|
||||||
|
length = (@group_avg / @global_avg) * length_of_global_bar
|
||||||
|
length > BAR_MAX_WITH ? BAR_MAX_WITH : length
|
||||||
|
end
|
||||||
|
|
||||||
|
# Show group bar in following colors:
|
||||||
|
# Green if higher than 100
|
||||||
|
# Yellow if lower than 100 an higher than stop_ordering_under option value
|
||||||
|
# Red if below stop_ordering_under, the ordergroup isn't allowed to participate in an order anymore
|
||||||
|
def group_bar_color
|
||||||
|
if apples >= 100
|
||||||
|
"#78b74e"
|
||||||
|
else
|
||||||
|
if FoodsoftConfig[:stop_ordering_under].present? and
|
||||||
|
apples >= FoodsoftConfig[:stop_ordering_under]
|
||||||
|
'yellow'
|
||||||
|
else
|
||||||
|
'red'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def mean_order_amount_per_job
|
||||||
|
(1/@global_avg).round
|
||||||
|
end
|
||||||
|
|
||||||
|
def apples
|
||||||
|
@apples ||= @ordergroup.apples
|
||||||
|
end
|
||||||
|
|
||||||
|
def with_restriction?
|
||||||
|
FoodsoftConfig[:stop_ordering_under].present?
|
||||||
|
end
|
||||||
|
end
|
|
@ -96,6 +96,11 @@ option {
|
||||||
.hidden {
|
.hidden {
|
||||||
display: none; }
|
display: none; }
|
||||||
|
|
||||||
|
.warning {
|
||||||
|
background: yellow;
|
||||||
|
font-weight: bold;
|
||||||
|
padding: 1px 10px; }
|
||||||
|
|
||||||
#login {
|
#login {
|
||||||
margin: auto;
|
margin: auto;
|
||||||
width: 35em;
|
width: 35em;
|
||||||
|
|
|
@ -104,6 +104,11 @@ option
|
||||||
.hidden
|
.hidden
|
||||||
display: none
|
display: none
|
||||||
|
|
||||||
|
.warning
|
||||||
|
background: yellow
|
||||||
|
font-weight: bold
|
||||||
|
padding: 1px 10px
|
||||||
|
|
||||||
// ********************************* loginpage
|
// ********************************* loginpage
|
||||||
#login
|
#login
|
||||||
:margin auto
|
:margin auto
|
||||||
|
|
Loading…
Reference in a new issue