Refinex CSV import and PDf export closes #299 and #433 #446

Merged
carla merged 16 commits from feat/299_plz into main 2026-02-24 16:32:32 +01:00
6 changed files with 49 additions and 14 deletions
Showing only changes of commit 9fc8c3b74a - Show all commits

View file

@ -207,9 +207,15 @@ defmodule Mv.Membership.Import.HeaderMapperTest do
"Email", "Email",
"First Name", "First Name",
"Last Name", "Last Name",
"Join Date",
"Exit Date",
"Notes",
"Country",
"City",
"Street", "Street",
"House Number",
"Postal Code", "Postal Code",
"City" "Membership Fee Start Date"
] ]
assert {:ok, %{member: member_map, custom: custom_map, unknown: unknown}} = assert {:ok, %{member: member_map, custom: custom_map, unknown: unknown}} =
@ -218,15 +224,34 @@ defmodule Mv.Membership.Import.HeaderMapperTest do
assert member_map[:email] == 0 assert member_map[:email] == 0
assert member_map[:first_name] == 1 assert member_map[:first_name] == 1
assert member_map[:last_name] == 2 assert member_map[:last_name] == 2
assert member_map[:street] == 3 assert member_map[:join_date] == 3
assert member_map[:postal_code] == 4 assert member_map[:exit_date] == 4
assert member_map[:city] == 5 assert member_map[:notes] == 5
assert member_map[:country] == 6
assert member_map[:city] == 7
assert member_map[:street] == 8
assert member_map[:house_number] == 9
assert member_map[:postal_code] == 10
assert member_map[:membership_fee_start_date] == 11
assert custom_map == %{} assert custom_map == %{}
assert unknown == [] assert unknown == []
end end
test "maps German member field variants" do test "maps German member field variants" do
headers = ["E-Mail", "Vorname", "Nachname", "Straße", "PLZ", "Stadt"] headers = [
"E-Mail",
"Vorname",
"Nachname",
"Beitrittsdatum",
"Austrittsdatum",
"Notizen",
"Land",
"Stadt",
"Straße",
"Hausnummer",
"PLZ",
"Beitragsbeginn"
]
assert {:ok, %{member: member_map, custom: custom_map, unknown: unknown}} = assert {:ok, %{member: member_map, custom: custom_map, unknown: unknown}} =
HeaderMapper.build_maps(headers, []) HeaderMapper.build_maps(headers, [])
@ -234,9 +259,15 @@ defmodule Mv.Membership.Import.HeaderMapperTest do
assert member_map[:email] == 0 assert member_map[:email] == 0
assert member_map[:first_name] == 1 assert member_map[:first_name] == 1
assert member_map[:last_name] == 2 assert member_map[:last_name] == 2
assert member_map[:street] == 3 assert member_map[:join_date] == 3
assert member_map[:postal_code] == 4 assert member_map[:exit_date] == 4
assert member_map[:city] == 5 assert member_map[:notes] == 5
assert member_map[:country] == 6
assert member_map[:city] == 7
assert member_map[:street] == 8
assert member_map[:house_number] == 9
assert member_map[:postal_code] == 10
assert member_map[:membership_fee_start_date] == 11
assert custom_map == %{} assert custom_map == %{}
assert unknown == [] assert unknown == []
end end

View file

@ -24,6 +24,7 @@ defmodule MvWeb.Components.SortHeaderComponentTest do
:house_number, :house_number,
:postal_code, :postal_code,
:city, :city,
:country,
:join_date :join_date
] ]
@ -100,6 +101,7 @@ defmodule MvWeb.Components.SortHeaderComponentTest do
assert has_element?(view, "[data-testid='street'] .opacity-40") assert has_element?(view, "[data-testid='street'] .opacity-40")
assert has_element?(view, "[data-testid='house_number'] .opacity-40") assert has_element?(view, "[data-testid='house_number'] .opacity-40")
assert has_element?(view, "[data-testid='postal_code'] .opacity-40") assert has_element?(view, "[data-testid='postal_code'] .opacity-40")
assert has_element?(view, "[data-testid='country'] .opacity-40")
assert has_element?(view, "[data-testid='join_date'] .opacity-40") assert has_element?(view, "[data-testid='join_date'] .opacity-40")
end end

View file

@ -45,11 +45,11 @@ defmodule MvWeb.GlobalSettingsLiveConfigTest do
{:ok, view, _html} = live(conn, ~p"/admin/import") {:ok, view, _html} = live(conn, ~p"/admin/import")
# Generate CSV with 501 rows (exceeding custom limit of 500) # Generate CSV with 501 rows (exceeding custom limit of 500)
header = "first_name;last_name;email;street;postal_code;city\n" header = "first_name;last_name;email;country;city;street;postal_code\n"
rows = rows =
for i <- 1..501 do for i <- 1..501 do
"Row#{i};Last#{i};email#{i}@example.com;Street#{i};12345;City#{i}\n" "Row#{i};Last#{i};email#{i}@example.com;Country#{i};City#{i};Street#{i};12345\n"
end end
large_csv = header <> Enum.join(rows) large_csv = header <> Enum.join(rows)

View file

@ -136,10 +136,10 @@ defmodule MvWeb.ImportLiveTest do
test "error list is capped and truncation message is shown", %{conn: conn} do test "error list is capped and truncation message is shown", %{conn: conn} do
{:ok, view, _html} = live(conn, ~p"/admin/import") {:ok, view, _html} = live(conn, ~p"/admin/import")
header = "first_name;last_name;email;street;postal_code;city\n" header = "first_name;last_name;email;country;city;street;postal_code\n"
invalid_rows = invalid_rows =
for i <- 1..100, do: "Row#{i};Last#{i};;Street#{i};12345;City#{i}\n" for i <- 1..100, do: "Row#{i};Last#{i};;Country#{i};City#{i};Street#{i};12345\n"
upload_csv_file(view, header <> Enum.join(invalid_rows), "large_invalid.csv") upload_csv_file(view, header <> Enum.join(invalid_rows), "large_invalid.csv")
submit_import(view) submit_import(view)
@ -154,11 +154,11 @@ defmodule MvWeb.ImportLiveTest do
test "row limit is enforced (1001 rows rejected)", %{conn: conn} do test "row limit is enforced (1001 rows rejected)", %{conn: conn} do
{:ok, view, _html} = live(conn, ~p"/admin/import") {:ok, view, _html} = live(conn, ~p"/admin/import")
header = "first_name;last_name;email;street;postal_code;city\n" header = "first_name;last_name;email;country;city;street;postal_code\n"
rows = rows =
for i <- 1..1001 do for i <- 1..1001 do
"Row#{i};Last#{i};email#{i}@example.com;Street#{i};12345;City#{i}\n" "Row#{i};Last#{i};email#{i}@example.com;Country#{i};City#{i};Street#{i};12345\n"
end end
upload_csv_file(view, header <> Enum.join(rows), "too_many_rows.csv") upload_csv_file(view, header <> Enum.join(rows), "too_many_rows.csv")

View file

@ -16,6 +16,7 @@ defmodule MvWeb.MemberLive.IndexMemberFieldsDisplayTest do
house_number: "123", house_number: "123",
postal_code: "12345", postal_code: "12345",
city: "Berlin", city: "Berlin",
country: "Germany",
join_date: ~D[2020-01-15] join_date: ~D[2020-01-15]
}, },
actor: system_actor actor: system_actor

View file

@ -162,6 +162,7 @@ defmodule MvWeb.MemberLive.IndexTest do
:house_number, :house_number,
:postal_code, :postal_code,
:city, :city,
:country,
:join_date :join_date
] ]