refactor: improve SetMembershipFeeStartDate change module

- Add warning logging for unexpected errors (not missing prerequisites)
- Use CalendarCycles.interval() type instead of generic atom()
- Update moduledoc to reflect actual usage (no where clause needed)
This commit is contained in:
Moritz 2025-12-12 16:16:11 +01:00 committed by moritz
parent e899004b3c
commit 78747d7da0

View file

@ -18,14 +18,16 @@ defmodule Mv.MembershipFees.Changes.SetMembershipFeeStartDate do
create :create_member do create :create_member do
# ... # ...
change Mv.MembershipFees.Changes.SetMembershipFeeStartDate do change Mv.MembershipFees.Changes.SetMembershipFeeStartDate
where [present(:membership_fee_type_id), present(:join_date)]
end
end end
The change module handles all prerequisite checks internally (join_date, membership_fee_type_id).
If any required data is missing, the changeset is returned unchanged with a warning logged.
""" """
use Ash.Resource.Change use Ash.Resource.Change
require Logger
alias Mv.MembershipFees.CalendarCycles alias Mv.MembershipFees.CalendarCycles
@impl true @impl true
@ -62,8 +64,13 @@ defmodule Mv.MembershipFees.Changes.SetMembershipFeeStartDate do
start_date = calculate_start_date(join_date, interval, include_joining_cycle) start_date = calculate_start_date(join_date, interval, include_joining_cycle)
Ash.Changeset.force_change_attribute(changeset, :membership_fee_start_date, start_date) Ash.Changeset.force_change_attribute(changeset, :membership_fee_start_date, start_date)
else else
{:error, _reason} -> {:error, reason} ->
# If we can't calculate the start date (missing required fields), just return unchanged # Log warning for debugging purposes, but don't fail the action
# Missing join_date or membership_fee_type_id is expected for partial creates
unless reason in [:join_date_not_set, :membership_fee_type_not_set] do
Logger.warning("Could not auto-set membership_fee_start_date: #{inspect(reason)}")
end
changeset changeset
end end
end end
@ -140,7 +147,7 @@ defmodule Mv.MembershipFees.Changes.SetMembershipFeeStartDate do
~D[2024-04-01] ~D[2024-04-01]
""" """
@spec calculate_start_date(Date.t(), atom(), boolean()) :: Date.t() @spec calculate_start_date(Date.t(), CalendarCycles.interval(), boolean()) :: Date.t()
def calculate_start_date(join_date, interval, include_joining_cycle) do def calculate_start_date(join_date, interval, include_joining_cycle) do
if include_joining_cycle do if include_joining_cycle do
# Start date is the first day of the joining cycle # Start date is the first day of the joining cycle