mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-26 20:56:48 +00:00
153 lines
4.3 KiB
Ruby
153 lines
4.3 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
# Represents the properties of an Enterprise when viewing the details of listed shopfronts
|
|
module Api
|
|
class EnterpriseShopfrontSerializer < ActiveModel::Serializer
|
|
include SerializerHelper
|
|
|
|
attributes :name, :id, :description, :latitude, :longitude, :long_description, :website,
|
|
:instagram, :linkedin, :twitter, :facebook, :is_primary_producer, :is_distributor,
|
|
:phone, :whatsapp_phone, :whatsapp_url, :visible, :email_address, :hash, :logo,
|
|
:promo_image, :path, :category, :active, :producers, :orders_close_at, :hubs,
|
|
:taxons, :supplied_taxons, :pickup, :delivery, :preferred_product_low_stock_display,
|
|
:hide_ofn_navigation, :white_label_logo, :white_label_logo_link
|
|
|
|
has_one :address, serializer: Api::AddressSerializer
|
|
has_many :supplied_properties, serializer: Api::PropertySerializer
|
|
has_many :distributed_properties, serializer: Api::PropertySerializer
|
|
|
|
def orders_close_at
|
|
OrderCycle.with_distributor(enterprise).soonest_closing.first&.orders_close_at
|
|
end
|
|
|
|
def active
|
|
@active ||=
|
|
enterprise.ready_for_checkout? && OrderCycle.active.with_distributor(enterprise).exists?
|
|
end
|
|
|
|
def pickup
|
|
shipping_types? :pickup
|
|
end
|
|
|
|
def delivery
|
|
shipping_types? :delivery
|
|
end
|
|
|
|
def email_address
|
|
enterprise.email_address.to_s.reverse
|
|
end
|
|
|
|
def hash
|
|
enterprise.to_param
|
|
end
|
|
|
|
def logo
|
|
enterprise.logo_url(:medium)
|
|
end
|
|
|
|
def promo_image
|
|
enterprise.promo_image_url(:large)
|
|
end
|
|
|
|
def white_label_logo
|
|
enterprise.white_label_logo_url
|
|
end
|
|
|
|
def path
|
|
enterprise_shop_path(enterprise)
|
|
end
|
|
|
|
def producers
|
|
ActiveModel::ArraySerializer.new(
|
|
enterprise.plus_parents_and_order_cycle_producers(
|
|
OrderCycle.not_closed.with_distributor(enterprise)
|
|
),
|
|
each_serializer: Api::EnterpriseThinSerializer
|
|
)
|
|
end
|
|
|
|
def hubs
|
|
ActiveModel::ArraySerializer.new(
|
|
enterprise.distributors.not_hidden, each_serializer: Api::EnterpriseThinSerializer
|
|
)
|
|
end
|
|
|
|
def taxons
|
|
taxons = active ? enterprise.current_distributed_taxons : enterprise.distributed_taxons
|
|
|
|
ActiveModel::ArraySerializer.new(
|
|
taxons, each_serializer: Api::TaxonSerializer
|
|
)
|
|
end
|
|
|
|
def supplied_taxons
|
|
return [] unless enterprise.is_primary_producer
|
|
|
|
ActiveModel::ArraySerializer.new(
|
|
enterprise.supplied_taxons, each_serializer: Api::TaxonSerializer
|
|
)
|
|
end
|
|
|
|
def supplied_properties
|
|
return [] unless enterprise.is_primary_producer
|
|
|
|
(product_properties + producer_properties).uniq do |property_object|
|
|
property_object.property.presentation
|
|
end
|
|
end
|
|
|
|
def distributed_properties
|
|
(distributed_product_properties + distributed_producer_properties).uniq do |property_object|
|
|
property_object.property.presentation
|
|
end
|
|
end
|
|
|
|
def distributed_product_properties
|
|
properties = Spree::Property.joins(products: { variants: { exchanges: :order_cycle } })
|
|
.merge(Exchange.outgoing)
|
|
.merge(Exchange.to_enterprise(enterprise))
|
|
.select('DISTINCT spree_properties.*')
|
|
|
|
return properties.merge(OrderCycle.active) if active
|
|
|
|
properties
|
|
end
|
|
|
|
def distributed_producer_properties
|
|
properties = Spree::Property.joins(
|
|
producer_properties: {
|
|
producer: { supplied_products: { variants: { exchanges: :order_cycle } } }
|
|
}
|
|
)
|
|
.merge(Exchange.outgoing).merge(Exchange.to_enterprise(enterprise))
|
|
.select('DISTINCT spree_properties.*')
|
|
|
|
return properties.merge(OrderCycle.active) if active
|
|
|
|
properties
|
|
end
|
|
|
|
private
|
|
|
|
def product_properties
|
|
enterprise.supplied_products.includes(:properties).flat_map(&:properties)
|
|
end
|
|
|
|
def producer_properties
|
|
enterprise.properties
|
|
end
|
|
|
|
def enterprise
|
|
object
|
|
end
|
|
|
|
def shipping_types?(type)
|
|
require_shipping = type == :delivery ? 't' : 'f'
|
|
Spree::ShippingMethod.
|
|
joins(:distributor_shipping_methods).
|
|
where(distributors_shipping_methods: { distributor_id: enterprise.id }).
|
|
where("spree_shipping_methods.require_ship_address = '#{require_shipping}'").exists?
|
|
end
|
|
end
|
|
end
|