Skip to content

Instantly share code, notes, and snippets.

@c80609a
Last active October 4, 2019 16:24
Show Gist options
  • Save c80609a/c1907260058b3bc89c9c8bf80deaa4d4 to your computer and use it in GitHub Desktop.
Save c80609a/c1907260058b3bc89c9c8bf80deaa4d4 to your computer and use it in GitHub Desktop.
module Lease
class InquiryRepository
# вернёт false:
# - если этот юзер уже сделал предложения (bids) всеми своими лодками на эту заявку (inquiry)
# - если у юзера нет approved лодок
# - если аккаунт ЦА -- неактивный
#
def self.can_make_bid(inquiry, central_agent_account)
# проверяем является ли аккаунт активным
return false unless central_agent_account.account.active
# находим лодки, которыми юзер еще не делал предложение на эту заявку И лодки подходят под заявку
sql = sql_allowable_boats(inquiry.id, central_agent_account.account.user.id)
rows = ActiveRecord::Base.connection.select_all(sql).rows
# если таких лодок нет (т.е. сделал всеми или их нет) -- значит не может
rows.any?
end
# @return boats - все доступные центральному агенту лодки,
# предложения по которым не были посланы по этому inquiry И
# лодки упомянуты в Suits (т.е. подходят под заявку)
#
def self.available_boats(inquiry, central_agent_account, personal_boat_id = nil)
Boat.find_by_sql sql_allowable_boats(inquiry.id, central_agent_account.account.user.id, personal_boat_id)
end
# Возвращает Hash с inquiries на которые central_agent_account может делать завявки
# Формат:
# {
# a: true,
# b: true
# }
# где a и b это id inquiries которые доступны central_agent_account для заявок
#
# @param inquiries [ActiveRecord::Relation]
#
def self.can_make_bid_all(inquiries, central_agent_account)
return {} if inquiries.length.zero?
sql = '
SELECT DISTINCT lease_inquiries.id
FROM boats
LEFT JOIN boat_users ON boats.id = boat_users.boat_id
INNER JOIN lease_suits ls ON boats.id = ls.boat_id
JOIN lease_inquiries ON ls.inquiry_id = lease_inquiries.id
WHERE boat_users.user_id = %s
AND boats.state = \'approved\'
AND lease_inquiries.state = \'active\'
AND lease_inquiries.id IN (%s)
AND lease_inquiries.id NOT IN (
SELECT lease_inquiries.id
FROM lease_inquiries
INNER JOIN lease_bids ON lease_bids.inquiry_id = lease_inquiries.id
WHERE lease_bids.boat_id = boats.id
)
' % [central_agent_account.account.user.id, inquiries.ids.join(',')]
# Находим все запросы на которые ЦА не отправил запросы с approved лодок
allowed_inquiries_ids = ActiveRecord::Base.connection.select_all(sql).rows&.map { |x| x&.first }
# Превращаем массив в Хэш
Hash[allowed_inquiries_ids.map { |x| [x, true] }]
end
# ищем лодки, которыми данный агент может сделать Предлжение на данную Заявку
#
def self.sql_allowable_boats(inquiry_id, user_id, personal_boat_id = nil)
' SELECT boats.*
FROM boats
INNER JOIN boat_users ON boats.id = boat_users.boat_id
WHERE
boats.id IN (
SELECT lease_suits.boat_id -- вычитаем из общего множества допустимых предложений те, которые уже были сделаны
FROM lease_suits
INNER JOIN boats ON lease_suits.boat_id = boats.id
INNER JOIN users ON users.id = lease_suits.user_id
LEFT OUTER JOIN (
SELECT boat_id, -- этими лодками эти юзеры сделали предложения на эту заявку
users.id
FROM lease_bids
INNER JOIN boats ON boats.id = lease_bids.boat_id
INNER JOIN accounts ON accounts.id = lease_bids.account_id INNER JOIN users ON users.id = accounts.user_id
WHERE inquiry_id = %{inquiry_id} AND
users.id = %{user_id}
) AS made_bids ON made_bids.boat_id = lease_suits.boat_id AND made_bids.id = users.id
WHERE
inquiry_id = %{inquiry_id} AND
users.id = %{user_id} AND
made_bids.boat_id IS NULL AND made_bids.id IS NULL
) AND
boat_users.user_id = %{user_id}%{personal}
' % { inquiry_id: inquiry_id, user_id: user_id, personal: personal_boat_id.present? ? (' AND boats.id = %s' % personal_boat_id) : '' }
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment