Cycle Management & Member Integration closes #279 #294
1 changed files with 16 additions and 7 deletions
|
|
@ -142,7 +142,15 @@ defmodule Mv.MembershipFees.CycleGenerator do
|
||||||
|> Task.async_stream(fn member ->
|
|> Task.async_stream(fn member ->
|
||||||
{member.id, generate_cycles_for_member(member, today: today)}
|
{member.id, generate_cycles_for_member(member, today: today)}
|
||||||
end)
|
end)
|
||||||
|> Enum.map(fn {:ok, result} -> result end)
|
|> Enum.map(fn
|
||||||
|
{:ok, result} ->
|
||||||
|
result
|
||||||
|
|
||||||
|
{:exit, reason} ->
|
||||||
|
# Task crashed - log and return error tuple
|
||||||
|
Logger.error("Task crashed during cycle generation: #{inspect(reason)}")
|
||||||
|
{nil, {:error, {:task_exit, reason}}}
|
||||||
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
defp build_results_summary(results) do
|
defp build_results_summary(results) do
|
||||||
|
|
@ -298,7 +306,7 @@ defmodule Mv.MembershipFees.CycleGenerator do
|
||||||
end
|
end
|
||||||
|
|
||||||
defp create_cycles(cycle_starts, member_id, fee_type_id, amount) do
|
defp create_cycles(cycle_starts, member_id, fee_type_id, amount) do
|
||||||
cycles =
|
results =
|
||||||
Enum.map(cycle_starts, fn cycle_start ->
|
Enum.map(cycle_starts, fn cycle_start ->
|
||||||
attrs = %{
|
attrs = %{
|
||||||
cycle_start: cycle_start,
|
cycle_start: cycle_start,
|
||||||
|
|
@ -314,15 +322,16 @@ defmodule Mv.MembershipFees.CycleGenerator do
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
errors = Enum.filter(cycles, &match?({:error, _}, &1))
|
{successes, errors} = Enum.split_with(results, &match?({:ok, _}, &1))
|
||||||
|
successful_cycles = Enum.map(successes, fn {:ok, cycle} -> cycle end)
|
||||||
|
|
||||||
if Enum.empty?(errors) do
|
if Enum.empty?(errors) do
|
||||||
{:ok, Enum.map(cycles, fn {:ok, cycle} -> cycle end)}
|
{:ok, successful_cycles}
|
||||||
else
|
else
|
||||||
Logger.warning("Some cycles failed to create: #{inspect(errors)}")
|
Logger.warning("Some cycles failed to create: #{inspect(errors)}")
|
||||||
# Return successfully created cycles anyway
|
# Return partial failure with both successful and failed cycles
|
||||||
successful = Enum.filter(cycles, &match?({:ok, _}, &1)) |> Enum.map(fn {:ok, c} -> c end)
|
# This allows callers to decide how to handle partial failures
|
||||||
{:ok, successful}
|
{:error, {:partial_failure, successful_cycles, errors}}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue