Vereinfacht: update existing contact when found by email

Before saving contact_id to member, sync current data to the
existing contact so Vereinfacht stays up to date.
This commit is contained in:
Moritz 2026-02-19 00:14:15 +01:00
parent 62000562f0
commit 361e33adaf
Signed by: moritz
GPG key ID: 1020A035E5DD0824

View file

@ -36,21 +36,49 @@ defmodule Mv.Vereinfacht do
defp do_sync_member(member) do
if present_contact_id?(member.vereinfacht_contact_id) do
case Client.update_contact(member.vereinfacht_contact_id, member) do
{:ok, _} -> :ok
{:error, reason} -> {:error, reason}
end
sync_existing_contact(member)
else
case Client.create_contact(member) do
{:ok, contact_id} ->
save_contact_id(member, contact_id)
ensure_contact_then_save(member)
end
end
{:error, reason} ->
{:error, reason}
defp sync_existing_contact(member) do
case Client.update_contact(member.vereinfacht_contact_id, member) do
{:ok, _} -> :ok
{:error, reason} -> {:error, reason}
end
end
defp ensure_contact_then_save(member) do
case get_or_create_contact_id(member) do
{:ok, contact_id} -> save_contact_id(member, contact_id)
{:error, _} = err -> err
end
end
# Before create: find by email to avoid duplicate contacts (idempotency).
# When an existing contact is found, update it with current member data.
defp get_or_create_contact_id(member) do
email = member |> Map.get(:email) |> to_string() |> String.trim()
if email == "" do
Client.create_contact(member)
else
case Client.find_contact_by_email(email) do
{:ok, existing_id} -> update_existing_contact_and_return_id(existing_id, member)
{:error, :not_found} -> Client.create_contact(member)
{:error, _} = err -> err
end
end
end
defp update_existing_contact_and_return_id(contact_id, member) do
case Client.update_contact(contact_id, member) do
{:ok, _} -> {:ok, contact_id}
{:error, _} = err -> err
end
end
defp save_contact_id(member, contact_id) do
system_actor = SystemActor.get_system_actor()
opts = Helpers.ash_actor_opts(system_actor)