Membership Fee Type Resource & Settings closes #278 #291
3 changed files with 56 additions and 0 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue