@@ -403,9 +403,10 @@ defmodule Safira.Contest do
403403 } )
404404 end )
405405 |> Multi . merge ( fn % { badge_redeem: badge_redeem } ->
406- change_attendee_tokens_transaction (
406+ remove_attendee_tokens_by_day_transaction (
407407 badge_redeem . attendee ,
408- max ( badge_redeem . attendee . tokens - badge_redeem . badge . tokens , 0 )
408+ badge_redeem . badge . tokens ,
409+ badge_redeem . inserted_at
409410 )
410411 end )
411412 |> Repo . transaction ( )
@@ -846,6 +847,43 @@ defmodule Safira.Contest do
846847 end )
847848 end
848849
850+ @ doc """
851+ Transaction for removing tokens from the attendee and the daily tokens by day.
852+ """
853+ def remove_attendee_tokens_by_day_transaction (
854+ attendee ,
855+ tokens ,
856+ date ,
857+ attendee_update_tokens_operation_name \\ :attendee_update_tokens ,
858+ daily_tokens_fetch_operation_name \\ :daily_tokens_fetch ,
859+ daily_tokens_update_operation_name \\ :daily_tokens_update
860+ ) do
861+ date =
862+ case date do
863+ % DateTime { } -> DateTime . to_date ( date )
864+ % Date { } -> DateTime . to_date ( date )
865+ end
866+
867+ Multi . new ( )
868+ |> Multi . update (
869+ attendee_update_tokens_operation_name ,
870+ Attendee . changeset ( attendee , % { tokens: max ( attendee . tokens - tokens , 0 ) } )
871+ )
872+ |> Multi . run ( daily_tokens_fetch_operation_name , fn repo , _changes ->
873+ { :ok ,
874+ repo . one (
875+ from dt in DailyTokens , where: dt . attendee_id == ^ attendee . id and dt . date == ^ date
876+ ) || % DailyTokens { date: date , attendee_id: attendee . id } }
877+ end )
878+ |> Multi . insert_or_update ( daily_tokens_update_operation_name , fn changes ->
879+ daily_tokens = Map . get ( changes , daily_tokens_fetch_operation_name )
880+
881+ DailyTokens . changeset ( daily_tokens , % {
882+ tokens: if ( daily_tokens . tokens , do: max ( daily_tokens . tokens - tokens , 0 ) , else: 0 )
883+ } )
884+ end )
885+ end
886+
849887 @ doc """
850888 Returns the list of badge_redeems.
851889
0 commit comments