diff --git a/src/handlers/handler_events.erl b/src/handlers/handler_events.erl index eaca7b3..4cb583e 100644 --- a/src/handlers/handler_events.erl +++ b/src/handlers/handler_events.erl @@ -339,10 +339,14 @@ parse_datetime_binary(Str) -> Dt. occurrence_to_json(Master, Occurrence) -> + %% Virtual row: occupancy by master event id (materialized instances use event_to_json). #{ master_id => Master#event.id, start_time => handler_utils:datetime_to_iso8601(Occurrence), duration => Master#event.duration, title => Master#event.title, - is_virtual => true - }. \ No newline at end of file + is_virtual => true, + specialist_id => Master#event.specialist_id, + calendar_id => Master#event.calendar_id, + booking_occupancy => handler_utils:booking_occupancy(Master) + }. diff --git a/src/handlers/handler_utils.erl b/src/handlers/handler_utils.erl index 3d9ba93..f8778b4 100755 --- a/src/handlers/handler_utils.erl +++ b/src/handlers/handler_utils.erl @@ -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) ->