Cycle Management & Member Integration closes #279 #294

Open
moritz wants to merge 48 commits from feature/279_cycle_management into main
3 changed files with 56 additions and 0 deletions
Showing only changes of commit c445b78157 - Show all commits

View file

@ -120,6 +120,28 @@ defmodule Mv.MembershipFees.MembershipFeeType do
end end
end, end,
on: [:destroy] on: [:destroy]
# Prevent deletion if used as default in settings
validate fn changeset, _context ->
if changeset.action_type == :destroy do
require Ash.Query
setting_count =
Mv.Membership.Setting
|> Ash.Query.filter(default_membership_fee_type_id == ^changeset.data.id)
|> Ash.count!()
if setting_count > 0 do
{:error,
message: "Cannot delete membership fee type: it's used as default in settings"}
else
:ok
end
else
:ok
end
end,
on: [:destroy]
end end
attributes do attributes do

View file

@ -123,6 +123,24 @@ defmodule Mv.MembershipFees.MembershipFeeTypeIntegrationTest do
error_message = extract_error_message(error) error_message = extract_error_message(error)
assert error_message =~ "cycle(s) reference" assert error_message =~ "cycle(s) reference"
end end
test "cannot delete when used as default in settings" do
fee_type = create_fee_type(%{interval: :yearly})
# Set as default in settings
{:ok, settings} = Mv.Membership.get_settings()
settings
|> Ash.Changeset.for_update(:update_membership_fee_settings, %{
default_membership_fee_type_id: fee_type.id
})
|> Ash.update!()
# Try to delete
assert {:error, error} = Ash.destroy(fee_type)
error_message = extract_error_message(error)
assert error_message =~ "used as default in settings"
end
end end
describe "settings integration" do describe "settings integration" do

View file

@ -228,6 +228,22 @@ defmodule Mv.MembershipFees.MembershipFeeTypeTest do
error_message = extract_error_message(error) error_message = extract_error_message(error)
assert error_message =~ "cycle" or error_message =~ "referenced" assert error_message =~ "cycle" or error_message =~ "referenced"
end end
test "cannot delete when used as default in settings", %{fee_type: fee_type} do
# Set as default in settings
{:ok, settings} = Mv.Membership.get_settings()
settings
|> Ash.Changeset.for_update(:update_membership_fee_settings, %{
default_membership_fee_type_id: fee_type.id
})
|> Ash.update!()
# Try to delete
assert {:error, error} = Ash.destroy(fee_type)
error_message = extract_error_message(error)
assert error_message =~ "used as default in settings"
end
end end
# Helper to check if an error occurred on a specific field # Helper to check if an error occurred on a specific field