Last active
October 4, 2019 16:24
-
-
Save c80609a/c1907260058b3bc89c9c8bf80deaa4d4 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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