feat(events): add booking_occupancy on event JSON for studio grid
Expose free|pending|confirmed so commercial calendar can aggregate slots by occupancy without N GET /bookings calls.
This commit is contained in:
@@ -19,6 +19,7 @@
|
||||
parse_datetime/1,
|
||||
datetime_to_iso8601/1,
|
||||
event_to_json/1,
|
||||
booking_occupancy/1,
|
||||
user_to_json/1,
|
||||
review_to_json/1,
|
||||
review_to_json/2,
|
||||
@@ -300,6 +301,8 @@ audit_reason(#{<<"reason">> := R}) when is_binary(R) -> R;
|
||||
audit_reason(_) -> <<>>.
|
||||
|
||||
%% @doc Преобразует #event{} в JSON-карту.
|
||||
%% Добавляет booking_occupancy: free | pending | confirmed
|
||||
%% (confirmed > pending > free; cancelled/expired и past-pending → не занятость).
|
||||
-spec event_to_json(#event{}) -> map().
|
||||
event_to_json(Event) ->
|
||||
LocationJson = case Event#event.location of
|
||||
@@ -337,9 +340,29 @@ event_to_json(Event) ->
|
||||
attachments => Event#event.attachments,
|
||||
edit_history => Event#event.edit_history,
|
||||
created_at => datetime_to_iso8601(Event#event.created_at),
|
||||
updated_at => datetime_to_iso8601(Event#event.updated_at)
|
||||
updated_at => datetime_to_iso8601(Event#event.updated_at),
|
||||
booking_occupancy => booking_occupancy(Event)
|
||||
}.
|
||||
|
||||
%% @doc Активная занятость слота для сетки commercial (Studio aggregate).
|
||||
-spec booking_occupancy(#event{}) -> free | pending | confirmed.
|
||||
booking_occupancy(#event{id = EventId, start_time = Start}) ->
|
||||
{ok, Bookings} = core_booking:list_by_event(EventId),
|
||||
Now = calendar:universal_time(),
|
||||
lists:foldl(
|
||||
fun(#booking{status = confirmed}, _Acc) ->
|
||||
confirmed;
|
||||
(#booking{status = pending}, Acc) ->
|
||||
case Start > Now of
|
||||
true when Acc =/= confirmed -> pending;
|
||||
_ -> Acc
|
||||
end;
|
||||
(_, Acc) ->
|
||||
Acc
|
||||
end,
|
||||
free,
|
||||
Bookings).
|
||||
|
||||
%% @doc Преобразует #user{} в JSON-карту.
|
||||
-spec user_to_json(#user{}) -> map().
|
||||
user_to_json(User) ->
|
||||
|
||||
Reference in New Issue
Block a user