Remove Vereinfacht-required logic from settings and member validation

- Member field settings: required only from email + settings (no API override)
- Member resource validation: required fields from settings only
- Gettext: remove obsolete 'Required for Vereinfacht integration' string
This commit is contained in:
Moritz 2026-03-04 19:22:41 +01:00
parent dc2cff8ec4
commit e899cc738f
Signed by: moritz
GPG key ID: 1020A035E5DD0824
7 changed files with 27 additions and 86 deletions

View file

@ -550,11 +550,9 @@ defmodule Mv.Membership.Member do
end, end,
where: [action_is([:create_member, :update_member])] where: [action_is([:create_member, :update_member])]
# Validate member fields that are marked as required in settings or by Vereinfacht. # Validate member fields that are marked as required in settings.
# When settings cannot be loaded, we still enforce email + Vereinfacht-required fields. # When settings cannot be loaded, enforce only email.
validate fn changeset, _context -> validate fn changeset, _context ->
vereinfacht_required? = Mv.Config.vereinfacht_configured?()
required_fields = required_fields =
case Mv.Membership.get_settings() do case Mv.Membership.get_settings() do
{:ok, settings} -> {:ok, settings} ->
@ -562,20 +560,17 @@ defmodule Mv.Membership.Member do
normalized = VisibilityConfig.normalize(required_config) normalized = VisibilityConfig.normalize(required_config)
Enum.filter(Mv.Constants.member_fields(), fn field -> Enum.filter(Mv.Constants.member_fields(), fn field ->
field == :email || field == :email || Map.get(normalized, field, false)
(vereinfacht_required? && Mv.Constants.vereinfacht_required_field?(field)) ||
Map.get(normalized, field, false)
end) end)
{:error, reason} -> {:error, reason} ->
Logger.warning( Logger.warning(
"Member required-fields validation: could not load settings (#{inspect(reason)}). " <> "Member required-fields validation: could not load settings (#{inspect(reason)}). " <>
"Enforcing only email and Vereinfacht-required fields." "Enforcing only email."
) )
Enum.filter(Mv.Constants.member_fields(), fn field -> Enum.filter(Mv.Constants.member_fields(), fn field ->
field == :email || field == :email
(vereinfacht_required? && Mv.Constants.vereinfacht_required_field?(field))
end) end)
end end

View file

@ -33,7 +33,6 @@ defmodule MvWeb.MemberFieldLive.FormComponent do
assigns assigns
|> assign(:field_attributes, get_field_attributes(assigns.member_field)) |> assign(:field_attributes, get_field_attributes(assigns.member_field))
|> assign(:is_email_field?, assigns.member_field == :email) |> assign(:is_email_field?, assigns.member_field == :email)
|> assign(:vereinfacht_required_field?, vereinfacht_required_field?(assigns))
|> assign(:field_label, MemberFields.label(assigns.member_field)) |> assign(:field_label, MemberFields.label(assigns.member_field))
~H""" ~H"""
@ -120,22 +119,12 @@ defmodule MvWeb.MemberFieldLive.FormComponent do
<%!-- Line break before Required / Show in overview block --%> <%!-- Line break before Required / Show in overview block --%>
<div class="mt-4"> <div class="mt-4">
<%!-- Required: disabled for email (always required) or Vereinfacht-required fields when integration is active --%> <%!-- Required: disabled for email (always required); else configurable in settings --%>
<div <div
:if={@is_email_field? or @vereinfacht_required_field?} :if={@is_email_field?}
class="tooltip tooltip-right" class="tooltip tooltip-right"
data-tip={ data-tip={gettext("This is a technical field and cannot be changed")}
if(@is_email_field?, aria-label={gettext("This is a technical field and cannot be changed")}
do: gettext("This is a technical field and cannot be changed"),
else: gettext("Required for Vereinfacht integration and cannot be disabled.")
)
}
aria-label={
if(@is_email_field?,
do: gettext("This is a technical field and cannot be changed"),
else: gettext("Required for Vereinfacht integration and cannot be disabled.")
)
}
> >
<fieldset class="mb-2 fieldset"> <fieldset class="mb-2 fieldset">
<label> <label>
@ -164,7 +153,7 @@ defmodule MvWeb.MemberFieldLive.FormComponent do
</fieldset> </fieldset>
</div> </div>
<.input <.input
:if={not @is_email_field? and not @vereinfacht_required_field?} :if={not @is_email_field?}
field={@form[:required]} field={@form[:required]}
type="checkbox" type="checkbox"
label={gettext("Required")} label={gettext("Required")}
@ -211,7 +200,6 @@ defmodule MvWeb.MemberFieldLive.FormComponent do
end end
required = required =
socket.assigns.vereinfacht_required_field? ||
if Map.has_key?(member_field_params, "required") do if Map.has_key?(member_field_params, "required") do
TypeParsers.parse_boolean(member_field_params["required"]) TypeParsers.parse_boolean(member_field_params["required"])
else else
@ -247,7 +235,6 @@ defmodule MvWeb.MemberFieldLive.FormComponent do
end end
required = required =
socket.assigns.vereinfacht_required_field? ||
if Map.has_key?(member_field_params, "required") do if Map.has_key?(member_field_params, "required") do
TypeParsers.parse_boolean(member_field_params["required"]) TypeParsers.parse_boolean(member_field_params["required"])
else else
@ -292,20 +279,10 @@ defmodule MvWeb.MemberFieldLive.FormComponent do
normalized_visibility = VisibilityConfig.normalize(visibility_config) normalized_visibility = VisibilityConfig.normalize(visibility_config)
normalized_required = VisibilityConfig.normalize(required_config) normalized_required = VisibilityConfig.normalize(required_config)
show_in_overview = Map.get(normalized_visibility, member_field, true) show_in_overview = Map.get(normalized_visibility, member_field, true)
vereinfacht_required? = Mv.Config.vereinfacht_configured?()
# Persist in socket so validate/save can enforce server-side without relying on render assigns
socket =
assign(
socket,
:vereinfacht_required_field?,
vereinfacht_required_field?(%{member_field: member_field})
)
# Email always required; Vereinfacht-required fields when integration active; else from settings # Email always required; else from settings
required = required =
member_field == :email || member_field == :email || Map.get(normalized_required, member_field, false)
(vereinfacht_required? && Mv.Constants.vereinfacht_required_field?(member_field)) ||
Map.get(normalized_required, member_field, false)
form_data = %{ form_data = %{
"name" => MemberFields.label(member_field), "name" => MemberFields.label(member_field),
@ -338,9 +315,4 @@ defmodule MvWeb.MemberFieldLive.FormComponent do
defp format_error(error) do defp format_error(error) do
inspect(error) inspect(error)
end end
defp vereinfacht_required_field?(assigns) do
Mv.Config.vereinfacht_configured?() &&
Mv.Constants.vereinfacht_required_field?(assigns.member_field)
end
end end

View file

@ -172,19 +172,15 @@ defmodule MvWeb.MemberFieldLive.IndexComponent do
member_fields = Mv.Constants.member_fields() member_fields = Mv.Constants.member_fields()
visibility_config = settings.member_field_visibility || %{} visibility_config = settings.member_field_visibility || %{}
required_config = settings.member_field_required || %{} required_config = settings.member_field_required || %{}
vereinfacht_required? = Mv.Config.vereinfacht_configured?()
normalized_visibility = VisibilityConfig.normalize(visibility_config) normalized_visibility = VisibilityConfig.normalize(visibility_config)
normalized_required = VisibilityConfig.normalize(required_config) normalized_required = VisibilityConfig.normalize(required_config)
Enum.map(member_fields, fn field -> Enum.map(member_fields, fn field ->
show_in_overview = Map.get(normalized_visibility, field, true) show_in_overview = Map.get(normalized_visibility, field, true)
# Email always required; Vereinfacht-required fields when integration active; else from settings # Email always required; else from settings
required = required =
field == :email || field == :email || Map.get(normalized_required, field, false)
(vereinfacht_required? && Mv.Constants.vereinfacht_required_field?(field)) ||
Map.get(normalized_required, field, false)
attribute = Info.attribute(Mv.Membership.Member, field) attribute = Info.attribute(Mv.Membership.Member, field)

View file

@ -398,8 +398,6 @@ defmodule MvWeb.MemberLive.Form do
end end
defp get_member_field_required_map do defp get_member_field_required_map do
vereinfacht_required? = Mv.Config.vereinfacht_configured?()
case Membership.get_settings() do case Membership.get_settings() do
{:ok, settings} -> {:ok, settings} ->
required_config = settings.member_field_required || %{} required_config = settings.member_field_required || %{}
@ -407,20 +405,15 @@ defmodule MvWeb.MemberLive.Form do
Mv.Constants.member_fields() Mv.Constants.member_fields()
|> Enum.map(fn field -> |> Enum.map(fn field ->
required = required = field == :email || Map.get(normalized, field, false)
field == :email ||
(vereinfacht_required? && Mv.Constants.vereinfacht_required_field?(field)) ||
Map.get(normalized, field, false)
{field, required} {field, required}
end) end)
|> Map.new() |> Map.new()
{:error, _} -> {:error, _} ->
# Email always required; Vereinfacht fields when integration active # When settings cannot be loaded, only email is required
Map.new(Mv.Constants.member_fields(), fn f -> Map.new(Mv.Constants.member_fields(), fn f ->
{f, {f, f == :email}
f == :email || (vereinfacht_required? && Mv.Constants.vereinfacht_required_field?(f))}
end) end)
end end
end end

View file

@ -2820,11 +2820,6 @@ msgstr "Okt."
msgid "Sep." msgid "Sep."
msgstr "Sep." msgstr "Sep."
#: lib/mv_web/live/member_field_live/form_component.ex
#, elixir-autogen, elixir-format
msgid "Required for Vereinfacht integration and cannot be disabled."
msgstr "Für die Vereinfacht-Integration erforderlich und kann nicht deaktiviert werden."
#: lib/mv_web/live/member_live/index.html.heex #: lib/mv_web/live/member_live/index.html.heex
#: lib/mv_web/translations/member_fields.ex #: lib/mv_web/translations/member_fields.ex
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format

View file

@ -2820,11 +2820,6 @@ msgstr ""
msgid "Sep." msgid "Sep."
msgstr "" msgstr ""
#: lib/mv_web/live/member_field_live/form_component.ex
#, elixir-autogen, elixir-format
msgid "Required for Vereinfacht integration and cannot be disabled."
msgstr ""
#: lib/mv_web/live/member_live/index.html.heex #: lib/mv_web/live/member_live/index.html.heex
#: lib/mv_web/translations/member_fields.ex #: lib/mv_web/translations/member_fields.ex
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format

View file

@ -2820,11 +2820,6 @@ msgstr ""
msgid "Sep." msgid "Sep."
msgstr "" msgstr ""
#: lib/mv_web/live/member_field_live/form_component.ex
#, elixir-autogen, elixir-format
msgid "Required for Vereinfacht integration and cannot be disabled."
msgstr "Required for Vereinfacht integration and cannot be disabled."
#: lib/mv_web/live/member_live/index.html.heex #: lib/mv_web/live/member_live/index.html.heex
#: lib/mv_web/translations/member_fields.ex #: lib/mv_web/translations/member_fields.ex
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format