227 lines
6.2 KiB
Ruby
227 lines
6.2 KiB
Ruby
class Supplier
|
|
include SimplyStored::Couch
|
|
include ActiveModel::SerializerSupport
|
|
include Supplier::Counters
|
|
PRELOAD_INCLUDES = %w[
|
|
sections
|
|
sections.tables
|
|
sections.section_areas
|
|
sections.section_elements
|
|
product_categories
|
|
product_categories.products
|
|
product_categories.products.product_variants
|
|
]
|
|
#devise :database_authenticatable, :recoverable, :rememberable, :trackable, :registerable, :confirmable
|
|
|
|
property :name
|
|
property :email
|
|
property :open, type: :boolean, default: false
|
|
property :time_zone, default: 'UTC'
|
|
property :night_offset, type: Integer, default: 0 # Minutes
|
|
property :address
|
|
property :house_number
|
|
property :house_number_addition
|
|
property :postal_code
|
|
property :city
|
|
property :country, default: 'Netherlands'
|
|
property :facebook_promotion_url
|
|
property :week_starts_on_monday, type: :boolean, default: true
|
|
property :employee_settings_storage
|
|
property :user_message
|
|
property :table_qr_template, default: '{{#if label}}{{number}} - {{label}}{{else}}{{number}}{{/if}}'
|
|
|
|
# PAYMENT
|
|
property :accept_bitpay, type: :boolean, default: false
|
|
property :bitpay_number
|
|
|
|
#LOCATION
|
|
property :lat, type: Float #, default: 52.08062426379751
|
|
property :lng, type: Float #, default: 4.312562942504883
|
|
|
|
def suggested_tips
|
|
[0, 5, 10, 15, 20]
|
|
end
|
|
|
|
#WIFI
|
|
property :offer_wifi
|
|
property :wifi_ssid
|
|
property :wifi_type
|
|
property :wifi_password
|
|
|
|
#REVIEWS
|
|
property :iens_profile
|
|
|
|
#has_many :orders, through: :lists
|
|
has_many :products, dependent: :destroy
|
|
has_many :product_variants
|
|
has_many :product_categories, dependent: :destroy
|
|
has_many :tables, dependent: :destroy
|
|
has_many :lists, dependent: :destroy
|
|
#has_many :lists, through: :tables
|
|
has_many :orders, dependent: :destroy
|
|
has_many :sections, dependent: :destroy
|
|
has_and_belongs_to_many :employees, storing_keys: true
|
|
has_many :employee_shifts
|
|
|
|
view :by_name, key: :name
|
|
|
|
alias_method :non_enriced_employees, :employees
|
|
def employees
|
|
@cached_enriched_employees ||= non_enriced_employees.tap { |es| es.each{ |e| e.enrich_with_settings(settings_for(e) ) }}
|
|
end
|
|
|
|
after_create :add_section_on_create
|
|
|
|
validates :name, presence: true
|
|
validates :iens_profile, numericality: {allow_blank: true}
|
|
#validates :password, confirmation: true, presence: {if: ->(r){ r.new_record? }}
|
|
|
|
def location=(val)
|
|
lat, lng = val.is_a?(Array) ? val : val.strip.split(/[ ,]+/).map(&:to_f)
|
|
self.lat = lat
|
|
self.lng = lng
|
|
end
|
|
|
|
def location
|
|
[lat, lng].join(',')
|
|
end
|
|
|
|
def suggested_tips
|
|
[0, 5, 10, 15, 20]
|
|
end
|
|
|
|
def add_manager(employee)
|
|
add_employee employee unless employee_ids.include? employee.id
|
|
settings = settings_for(employee)
|
|
settings.is_manager!
|
|
save and employee
|
|
end
|
|
|
|
after_method :add_employee do |result, employee|
|
|
@employee_settings = nil
|
|
employee.settings = settings_for(employee)
|
|
result
|
|
end
|
|
|
|
def employee_settings
|
|
@employee_settings ||= SupplierEmployeesSettings.new(self)
|
|
end
|
|
|
|
def settings_for(employee)
|
|
employee_settings.for_employee(employee)
|
|
end
|
|
|
|
#TODO: depricate
|
|
def active_orders(options = {})
|
|
return @active_orders if @active_orders && @active_orders_options == options
|
|
@active_orders_options = options
|
|
@active_orders = options[:section_id] ? Order.active_for_supplier_and_section(self, options[:section_id]) : Order.active_for_supplier(id)
|
|
@active_orders.include_relation(list: {table: :section}, product_orders: :order)
|
|
@active_orders
|
|
end
|
|
|
|
# Tody, simplify to List.active_for_supplier(self)
|
|
#TODO: depricate
|
|
def active_lists(options = {})
|
|
return @active_lists if @active_lists
|
|
@active_lists = options[:section_id].present? ? List.active_for_supplier_and_section(self, options[:section_id]) : List.active_for_supplier(self)
|
|
@active_lists.include_relations(table: :section, orders: {product_orders: :product})
|
|
@active_lists
|
|
end
|
|
|
|
before_method :reload do
|
|
@employees = nil
|
|
@cached_enriched_employees = nil
|
|
@employee_settings = nil
|
|
@active_lists = nil
|
|
@active_orders = nil
|
|
end
|
|
|
|
|
|
# Return the currently active tables for the supplier
|
|
def active_tables(options = {})
|
|
options[:section_id].present? ? tables.select{|t| t.section_id == options[:section_id]} : tables
|
|
end
|
|
|
|
def non_placed_tables
|
|
tables.reject{|t| t.section_id.present? }
|
|
end
|
|
|
|
def open?
|
|
open
|
|
end
|
|
def closed?
|
|
!open?
|
|
end
|
|
|
|
def get_employee(id)
|
|
return nil unless employee_ids.include?(id)
|
|
employee = Employee.find id
|
|
employee.settings = settings_for(employee)
|
|
employee
|
|
end
|
|
|
|
def mark_as_open!
|
|
self.open = true
|
|
save
|
|
end
|
|
|
|
def mark_as_closed!
|
|
self.open = false
|
|
save
|
|
end
|
|
|
|
def serializable_hash(*)
|
|
{
|
|
id: id,
|
|
name: name
|
|
}
|
|
end
|
|
|
|
def as_json(*)
|
|
serializable_hash
|
|
end
|
|
|
|
|
|
# Find a user by its confirmation token and try to confirm it.
|
|
# If no user is found, returns a new user with an error.
|
|
# If the user is already confirmed, create an error for the user
|
|
# Options must have the confirmation_token
|
|
#
|
|
# Overwrite devise method for mail sending
|
|
#def self.confirm_by_token(confirmation_token)
|
|
#confirmable = find_or_initialize_with_error_by(:confirmation_token, confirmation_token)
|
|
#send_creation_mail = confirmable.errors.empty? && !confirmable.confirmed?
|
|
#confirmable.confirm! if confirmable.persisted?
|
|
#confirmable.send_creation_notifications if send_creation_mail
|
|
#confirmable
|
|
#end
|
|
|
|
# Send confirmation instructions by email
|
|
#def send_confirmation_instructions(*args)
|
|
#self.confirmation_token = nil if reconfirmation_required?
|
|
#@reconfirmation_required = false
|
|
|
|
#@bypass_postpone = true and generate_confirmation_token! if self.confirmation_token.blank?
|
|
#self.devise_mailer.confirmation_instructions(self, confirmation_token).deliver_now
|
|
#end
|
|
|
|
def find_order(id)
|
|
order = Order.find(id)
|
|
raise SimplyStored::RecordNotFound unless order.supplier_id == self.id
|
|
order
|
|
end
|
|
|
|
def send_creation_notifications
|
|
SupplierMailer.creation(self).deliver_later
|
|
end
|
|
|
|
private
|
|
|
|
def add_section_on_create
|
|
@section = Section.create supplier: self, title: I18n.t('supplier.section.first_section_title', default: nil) || 'Room'
|
|
end
|
|
|
|
|
|
end
|