Membership Fee 6 - UI Components & LiveViews closes #280 #304

Open
moritz wants to merge 65 commits from feature/280_membership_fee_ui into main
4 changed files with 106 additions and 86 deletions
Showing only changes of commit effb710741 - Show all commits

View file

@ -1459,7 +1459,6 @@ msgstr "Die Änderung des Betrags betrifft %{count} Mitglied(er)."
msgid "Confirm Change" msgid "Confirm Change"
msgstr "Änderung bestätigen" msgstr "Änderung bestätigen"
#: lib/mv_web/live/member_live/index.html.heex
#: lib/mv_web/live/member_live/show.ex #: lib/mv_web/live/member_live/show.ex
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Current Cycle" msgid "Current Cycle"
@ -1535,7 +1534,6 @@ msgstr "Das Intervall kann nach der Erstellung nicht geändert werden."
msgid "Invalid amount format" msgid "Invalid amount format"
msgstr "Ungültiges Betragsformat" msgstr "Ungültiges Betragsformat"
#: lib/mv_web/live/member_live/index.html.heex
#: lib/mv_web/live/member_live/show.ex #: lib/mv_web/live/member_live/show.ex
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Last Cycle" msgid "Last Cycle"
@ -1682,16 +1680,6 @@ msgstr "Wählen Sie eine Mitgliedsbeitragsart für dieses Mitglied. Mitglieder k
msgid "Select interval" msgid "Select interval"
msgstr "Intervall auswählen" msgstr "Intervall auswählen"
#: lib/mv_web/live/member_live/index.html.heex
#, elixir-autogen, elixir-format
msgid "Show current cycle"
msgstr "Aktuellen Zyklus anzeigen"
#: lib/mv_web/live/member_live/index.html.heex
#, elixir-autogen, elixir-format
msgid "Show last completed cycle"
msgstr "Letzten abgeschlossenen Zyklus anzeigen"
#: lib/mv_web/live/member_live/index.html.heex #: lib/mv_web/live/member_live/index.html.heex
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Switch to current cycle" msgid "Switch to current cycle"
@ -1818,6 +1806,11 @@ msgstr ""
msgid "You are about to delete all %{count} cycles for this member." msgid "You are about to delete all %{count} cycles for this member."
msgstr "" msgstr ""
#: lib/mv_web/live/member_live/index.html.heex
#, elixir-autogen, elixir-format
msgid "Show Last/Current Cycle Payment Status"
msgstr ""
#~ #: lib/mv_web/live/components/payment_filter_component.ex #~ #: lib/mv_web/live/components/payment_filter_component.ex
#~ #, elixir-autogen, elixir-format #~ #, elixir-autogen, elixir-format
#~ msgid "All payment statuses" #~ msgid "All payment statuses"
@ -1901,6 +1894,16 @@ msgstr ""
#~ msgid "Quarterly Interval - Joining Period Excluded" #~ msgid "Quarterly Interval - Joining Period Excluded"
#~ msgstr "Vierteljährliches Intervall Beitrittszeitraum nicht einbezogen" #~ msgstr "Vierteljährliches Intervall Beitrittszeitraum nicht einbezogen"
#~ #: lib/mv_web/live/member_live/index.html.heex
#~ #, elixir-autogen, elixir-format
#~ msgid "Show current cycle"
#~ msgstr "Aktuellen Zyklus anzeigen"
#~ #: lib/mv_web/live/member_live/index.html.heex
#~ #, elixir-autogen, elixir-format
#~ msgid "Show last completed cycle"
#~ msgstr "Letzten abgeschlossenen Zyklus anzeigen"
#~ #: lib/mv_web/live/member_live/form.ex #~ #: lib/mv_web/live/member_live/form.ex
#~ #: lib/mv_web/live/member_live/show.ex #~ #: lib/mv_web/live/member_live/show.ex
#~ #, elixir-autogen, elixir-format #~ #, elixir-autogen, elixir-format

View file

@ -1460,7 +1460,6 @@ msgstr ""
msgid "Confirm Change" msgid "Confirm Change"
msgstr "" msgstr ""
#: lib/mv_web/live/member_live/index.html.heex
#: lib/mv_web/live/member_live/show.ex #: lib/mv_web/live/member_live/show.ex
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Current Cycle" msgid "Current Cycle"
@ -1536,7 +1535,6 @@ msgstr ""
msgid "Invalid amount format" msgid "Invalid amount format"
msgstr "" msgstr ""
#: lib/mv_web/live/member_live/index.html.heex
#: lib/mv_web/live/member_live/show.ex #: lib/mv_web/live/member_live/show.ex
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Last Cycle" msgid "Last Cycle"
@ -1683,16 +1681,6 @@ msgstr ""
msgid "Select interval" msgid "Select interval"
msgstr "" msgstr ""
#: lib/mv_web/live/member_live/index.html.heex
#, elixir-autogen, elixir-format
msgid "Show current cycle"
msgstr ""
#: lib/mv_web/live/member_live/index.html.heex
#, elixir-autogen, elixir-format
msgid "Show last completed cycle"
msgstr ""
#: lib/mv_web/live/member_live/index.html.heex #: lib/mv_web/live/member_live/index.html.heex
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Switch to current cycle" msgid "Switch to current cycle"
@ -1818,3 +1806,8 @@ msgstr ""
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "You are about to delete all %{count} cycles for this member." msgid "You are about to delete all %{count} cycles for this member."
msgstr "" msgstr ""
#: lib/mv_web/live/member_live/index.html.heex
#, elixir-autogen, elixir-format
msgid "Show Last/Current Cycle Payment Status"
msgstr ""

View file

@ -1460,7 +1460,6 @@ msgstr ""
msgid "Confirm Change" msgid "Confirm Change"
msgstr "" msgstr ""
#: lib/mv_web/live/member_live/index.html.heex
#: lib/mv_web/live/member_live/show.ex #: lib/mv_web/live/member_live/show.ex
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Current Cycle" msgid "Current Cycle"
@ -1536,7 +1535,6 @@ msgstr ""
msgid "Invalid amount format" msgid "Invalid amount format"
msgstr "" msgstr ""
#: lib/mv_web/live/member_live/index.html.heex
#: lib/mv_web/live/member_live/show.ex #: lib/mv_web/live/member_live/show.ex
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Last Cycle" msgid "Last Cycle"
@ -1683,16 +1681,6 @@ msgstr ""
msgid "Select interval" msgid "Select interval"
msgstr "" msgstr ""
#: lib/mv_web/live/member_live/index.html.heex
#, elixir-autogen, elixir-format
msgid "Show current cycle"
msgstr ""
#: lib/mv_web/live/member_live/index.html.heex
#, elixir-autogen, elixir-format
msgid "Show last completed cycle"
msgstr ""
#: lib/mv_web/live/member_live/index.html.heex #: lib/mv_web/live/member_live/index.html.heex
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Switch to current cycle" msgid "Switch to current cycle"
@ -1819,6 +1807,11 @@ msgstr ""
msgid "You are about to delete all %{count} cycles for this member." msgid "You are about to delete all %{count} cycles for this member."
msgstr "" msgstr ""
#: lib/mv_web/live/member_live/index.html.heex
#, elixir-autogen, elixir-format
msgid "Show Last/Current Cycle Payment Status"
msgstr ""
#~ #: lib/mv_web/live/components/payment_filter_component.ex #~ #: lib/mv_web/live/components/payment_filter_component.ex
#~ #, elixir-autogen, elixir-format #~ #, elixir-autogen, elixir-format
#~ msgid "All payment statuses" #~ msgid "All payment statuses"
@ -1923,6 +1916,16 @@ msgstr ""
#~ msgid "Quarterly Interval - Joining Period Excluded" #~ msgid "Quarterly Interval - Joining Period Excluded"
#~ msgstr "" #~ msgstr ""
#~ #: lib/mv_web/live/member_live/index.html.heex
#~ #, elixir-autogen, elixir-format
#~ msgid "Show current cycle"
#~ msgstr ""
#~ #: lib/mv_web/live/member_live/index.html.heex
#~ #, elixir-autogen, elixir-format
#~ msgid "Show last completed cycle"
#~ msgstr ""
#~ #: lib/mv_web/live/member_live/form.ex #~ #: lib/mv_web/live/member_live/form.ex
#~ #: lib/mv_web/live/member_live/show.ex #~ #: lib/mv_web/live/member_live/show.ex
#~ #, elixir-autogen, elixir-format #~ #, elixir-autogen, elixir-format

View file

@ -127,8 +127,12 @@ Accounts.create_user!(%{email: "admin@mv.local"}, upsert?: true, upsert_identity
|> Ash.Changeset.for_update(:admin_set_password, %{password: "testpassword"}) |> Ash.Changeset.for_update(:admin_set_password, %{password: "testpassword"})
|> Ash.update!() |> Ash.update!()
# Load all membership fee types for assignment
all_fee_types = MembershipFeeType |> Ash.read!() |> Enum.to_list()
# Create sample members for testing - use upsert to prevent duplicates # Create sample members for testing - use upsert to prevent duplicates
for member_attrs <- [ # Assign each member to a fee type using round-robin distribution
member_attrs_list = [
%{ %{
first_name: "Hans", first_name: "Hans",
last_name: "Müller", last_name: "Müller",
@ -172,10 +176,18 @@ for member_attrs <- [
street: "Kastanienallee", street: "Kastanienallee",
house_number: "8" house_number: "8"
} }
] do ]
# Assign fee types to members using round-robin
Enum.with_index(member_attrs_list)
|> Enum.each(fn {member_attrs, index} ->
# Round-robin assignment: cycle through fee types
fee_type = Enum.at(all_fee_types, rem(index, length(all_fee_types)))
member_attrs_with_fee_type = Map.put(member_attrs, :membership_fee_type_id, fee_type.id)
# Use upsert to prevent duplicates based on email # Use upsert to prevent duplicates based on email
Membership.create_member!(member_attrs, upsert?: true, upsert_identity: :unique_email) Membership.create_member!(member_attrs_with_fee_type, upsert?: true, upsert_identity: :unique_email)
end end)
# Create additional users for user-member linking examples # Create additional users for user-member linking examples
additional_users = [ additional_users = [
@ -226,21 +238,30 @@ linked_members = [
] ]
# Create the linked members - use upsert to prevent duplicates # Create the linked members - use upsert to prevent duplicates
Enum.each(linked_members, fn member_attrs -> # Assign fee types to linked members using round-robin
# Continue from where we left off with the previous members
Enum.with_index(linked_members)
|> Enum.each(fn {member_attrs, index} ->
user = member_attrs.user user = member_attrs.user
member_attrs_without_user = Map.delete(member_attrs, :user) member_attrs_without_user = Map.delete(member_attrs, :user)
# Round-robin assignment: continue cycling through fee types
# Start from where previous members ended
fee_type_index = rem(length(member_attrs_list) + index, length(all_fee_types))
fee_type = Enum.at(all_fee_types, fee_type_index)
member_attrs_with_fee_type = Map.put(member_attrs_without_user, :membership_fee_type_id, fee_type.id)
# Check if user already has a member # Check if user already has a member
if user.member_id == nil do if user.member_id == nil do
# User is free, create member and link - use upsert to prevent duplicates # User is free, create member and link - use upsert to prevent duplicates
Membership.create_member!( Membership.create_member!(
Map.put(member_attrs_without_user, :user, %{id: user.id}), Map.put(member_attrs_with_fee_type, :user, %{id: user.id}),
upsert?: true, upsert?: true,
upsert_identity: :unique_email upsert_identity: :unique_email
) )
else else
# User already has a member, just create the member without linking - use upsert to prevent duplicates # User already has a member, just create the member without linking - use upsert to prevent duplicates
Membership.create_member!(member_attrs_without_user, Membership.create_member!(member_attrs_with_fee_type,
upsert?: true, upsert?: true,
upsert_identity: :unique_email upsert_identity: :unique_email
) )