Make time dependent product categories work
This commit is contained in:
@@ -96,7 +96,7 @@ class UserController < ApplicationController
|
|||||||
handle_message_params
|
handle_message_params
|
||||||
end
|
end
|
||||||
format.json do
|
format.json do
|
||||||
h = ProductCategory.for_user(current_user, table: list.table, list: list) # list is performance parameter
|
h = ProductCategory.for_user(current_user, table: list.table, list: list, supplier: @supplier) # list is performance parameter
|
||||||
render json: h
|
render json: h
|
||||||
#products = list.supplier.products
|
#products = list.supplier.products
|
||||||
#product_categories = list.supplier.product_categories
|
#product_categories = list.supplier.product_categories
|
||||||
|
|||||||
@@ -4,6 +4,9 @@ class ProductCategory
|
|||||||
property :name
|
property :name
|
||||||
property :position, type: Fixnum, default: 0
|
property :position, type: Fixnum, default: 0
|
||||||
property :week_days, type: Array, default: Array.new(7, 1)
|
property :week_days, type: Array, default: Array.new(7, 1)
|
||||||
|
property :full_day, type: :boolean, default: true
|
||||||
|
property :start_from, type: Fixnum, default: 0
|
||||||
|
property :end_on, type: Fixnum, default: 2880 # Two days in minutes
|
||||||
|
|
||||||
belongs_to :supplier
|
belongs_to :supplier
|
||||||
has_and_belongs_to_many :products, storing_keys: true
|
has_and_belongs_to_many :products, storing_keys: true
|
||||||
@@ -13,7 +16,24 @@ class ProductCategory
|
|||||||
validates :name, presence: true
|
validates :name, presence: true
|
||||||
validates :position, numericality: true
|
validates :position, numericality: true
|
||||||
validates :supplier_id, presence: true
|
validates :supplier_id, presence: true
|
||||||
|
validates :end_on, numericality: {less_than: 2880}, presence: {unless: :full_day?}
|
||||||
|
|
||||||
view :by_supplier_id_and_id, key: [:supplier_id, :_id]
|
view :by_supplier_id_and_id, key: [:supplier_id, :_id]
|
||||||
|
view :by_supplier_id_and_week_time, type: :custom, map_function: "function(doc){
|
||||||
|
if(doc.ruby_class == 'ProductCategory'){
|
||||||
|
for(var i=0;i<7;i++){
|
||||||
|
if(doc.full_day || !doc.end_on){
|
||||||
|
if(doc.week_days[i]) emit([doc.supplier_id, i], 1);
|
||||||
|
}else{
|
||||||
|
for(var j=(doc.start_from || 0);j < doc.end_on;j++){
|
||||||
|
if(doc.week_days[i]) emit([doc.supplier_id, i, j], 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}", reduce_function: :_sum
|
||||||
|
|
||||||
|
#start_key: [supplier_id, wday, minute], end_key: [supplier_id, wday, 2880, minute]
|
||||||
|
|
||||||
#alias orignal_week_days= week_days=
|
#alias orignal_week_days= week_days=
|
||||||
def week_days=(ary)
|
def week_days=(ary)
|
||||||
@@ -27,12 +47,14 @@ class ProductCategory
|
|||||||
def self.for_user(user, options = {})
|
def self.for_user(user, options = {})
|
||||||
table = options[:table]
|
table = options[:table]
|
||||||
raise "ProductCategory.for_user requires a table" unless table.present?
|
raise "ProductCategory.for_user requires a table" unless table.present?
|
||||||
list = options[:list] || table.active_list
|
list = options[:list] || table.active_list # Performance option to specify it in stead of loading it
|
||||||
|
supplier = options[:supplier] || table.supplier # same as list
|
||||||
|
|
||||||
# Get supplier objects
|
# Get supplier objects
|
||||||
products = table.supplier.products
|
product_categories = for_supplier_in_time(supplier, options[:time])
|
||||||
product_categories = table.supplier.product_categories || []
|
|
||||||
|
|
||||||
|
# The following part is creating the products hash. This should not be performed here!!!!!! #TODO fix this!!!@@!!@@!!@
|
||||||
|
products = supplier.products
|
||||||
# sort categories
|
# sort categories
|
||||||
product_categories.sort_by!{|pc| (pc.position || 90000).to_i }
|
product_categories.sort_by!{|pc| (pc.position || 90000).to_i }
|
||||||
|
|
||||||
@@ -40,7 +62,7 @@ class ProductCategory
|
|||||||
other = product_categories.find(&:other?) || (product_categories << self.other).last # Container for non categorized products
|
other = product_categories.find(&:other?) || (product_categories << self.other).last # Container for non categorized products
|
||||||
|
|
||||||
# Initialize base return object
|
# Initialize base return object
|
||||||
h = {table_number: table.number, table_occupied: table.occupied?, supplier_name: table.supplier.name, my_list: list.try(:user_ids).to_a.include?(user.id)}
|
h = {table_number: table.number, table_occupied: table.occupied?, supplier_name: supplier.name, my_list: list.try(:user_ids).to_a.include?(user.id)}
|
||||||
|
|
||||||
(products - product_categories.map(&:products).flatten).each{ |p| other.add_product(p) }
|
(products - product_categories.map(&:products).flatten).each{ |p| other.add_product(p) }
|
||||||
|
|
||||||
@@ -48,6 +70,20 @@ class ProductCategory
|
|||||||
h
|
h
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# time is not by default Time.now.utc since it can be specified as nil
|
||||||
|
def self.for_supplier_in_time(supplier, time = nil)
|
||||||
|
time ||= Time.now.utc
|
||||||
|
minute = (time.seconds_since_midnight/60).round
|
||||||
|
week_day = time.wday
|
||||||
|
if minute < supplier.night_offset
|
||||||
|
minute += 1440 # 1440 is 1 day in minutes 1.day/1.minute
|
||||||
|
week_day -= 1
|
||||||
|
week_day = 6 if week_day < 0 # Saturday
|
||||||
|
end
|
||||||
|
view_options = {reduce: false, include_docs: true}
|
||||||
|
database.view(by_supplier_id_and_week_time(view_options.merge(keys: [[supplier.id, week_day], [supplier.id, week_day, minute]])))
|
||||||
|
end
|
||||||
|
|
||||||
def other?
|
def other?
|
||||||
%w[other overig].include?(name.to_s.downcase)
|
%w[other overig].include?(name.to_s.downcase)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ class Supplier
|
|||||||
property :name
|
property :name
|
||||||
property :open, type: :boolean, default: false
|
property :open, type: :boolean, default: false
|
||||||
property :time_zone, default: 'UTC'
|
property :time_zone, default: 'UTC'
|
||||||
property :night_offset, type: Fixnum, default: 0 # Hours
|
property :night_offset, type: Fixnum, default: 0 # Minutes
|
||||||
|
|
||||||
#LOCATION
|
#LOCATION
|
||||||
property :lat, type: Float, default: 52.08062426379751
|
property :lat, type: Float, default: 52.08062426379751
|
||||||
|
|||||||
Reference in New Issue
Block a user