Vereinfacht accounting software API closes #431 #432

Merged
moritz merged 31 commits from feature/vereinfacht_api into main 2026-02-23 21:18:46 +01:00
Showing only changes of commit 124857cc9c - Show all commits

View file

@ -36,21 +36,49 @@ defmodule Mv.Vereinfacht do
defp do_sync_member(member) do defp do_sync_member(member) do
if present_contact_id?(member.vereinfacht_contact_id) do if present_contact_id?(member.vereinfacht_contact_id) do
case Client.update_contact(member.vereinfacht_contact_id, member) do sync_existing_contact(member)
{:ok, _} -> :ok
{:error, reason} -> {:error, reason}
end
else else
case Client.create_contact(member) do ensure_contact_then_save(member)
{:ok, contact_id} -> end
save_contact_id(member, contact_id) end
{:error, reason} -> defp sync_existing_contact(member) do
{:error, reason} 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 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 defp save_contact_id(member, contact_id) do
system_actor = SystemActor.get_system_actor() system_actor = SystemActor.get_system_actor()
opts = Helpers.ash_actor_opts(system_actor) opts = Helpers.ash_actor_opts(system_actor)