Membership Fee 6 - UI Components & LiveViews closes #280 #304
4 changed files with 106 additions and 86 deletions
|
|
@ -1459,7 +1459,6 @@ msgstr "Die Änderung des Betrags betrifft %{count} Mitglied(er)."
|
|||
msgid "Confirm Change"
|
||||
msgstr "Änderung bestätigen"
|
||||
|
||||
#: lib/mv_web/live/member_live/index.html.heex
|
||||
#: lib/mv_web/live/member_live/show.ex
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Current Cycle"
|
||||
|
|
@ -1535,7 +1534,6 @@ msgstr "Das Intervall kann nach der Erstellung nicht geändert werden."
|
|||
msgid "Invalid amount format"
|
||||
msgstr "Ungültiges Betragsformat"
|
||||
|
||||
#: lib/mv_web/live/member_live/index.html.heex
|
||||
#: lib/mv_web/live/member_live/show.ex
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Last Cycle"
|
||||
|
|
@ -1682,16 +1680,6 @@ msgstr "Wählen Sie eine Mitgliedsbeitragsart für dieses Mitglied. Mitglieder k
|
|||
msgid "Select interval"
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Switch to current cycle"
|
||||
|
|
@ -1818,6 +1806,11 @@ msgstr ""
|
|||
msgid "You are about to delete all %{count} cycles for this member."
|
||||
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
|
||||
#~ #, elixir-autogen, elixir-format
|
||||
#~ msgid "All payment statuses"
|
||||
|
|
@ -1901,6 +1894,16 @@ msgstr ""
|
|||
#~ msgid "Quarterly Interval - Joining Period Excluded"
|
||||
#~ 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/show.ex
|
||||
#~ #, elixir-autogen, elixir-format
|
||||
|
|
|
|||
|
|
@ -1460,7 +1460,6 @@ msgstr ""
|
|||
msgid "Confirm Change"
|
||||
msgstr ""
|
||||
|
||||
#: lib/mv_web/live/member_live/index.html.heex
|
||||
#: lib/mv_web/live/member_live/show.ex
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Current Cycle"
|
||||
|
|
@ -1536,7 +1535,6 @@ msgstr ""
|
|||
msgid "Invalid amount format"
|
||||
msgstr ""
|
||||
|
||||
#: lib/mv_web/live/member_live/index.html.heex
|
||||
#: lib/mv_web/live/member_live/show.ex
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Last Cycle"
|
||||
|
|
@ -1683,16 +1681,6 @@ msgstr ""
|
|||
msgid "Select interval"
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Switch to current cycle"
|
||||
|
|
@ -1818,3 +1806,8 @@ msgstr ""
|
|||
#, elixir-autogen, elixir-format
|
||||
msgid "You are about to delete all %{count} cycles for this member."
|
||||
msgstr ""
|
||||
|
||||
#: lib/mv_web/live/member_live/index.html.heex
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Show Last/Current Cycle Payment Status"
|
||||
msgstr ""
|
||||
|
|
|
|||
|
|
@ -1460,7 +1460,6 @@ msgstr ""
|
|||
msgid "Confirm Change"
|
||||
msgstr ""
|
||||
|
||||
#: lib/mv_web/live/member_live/index.html.heex
|
||||
#: lib/mv_web/live/member_live/show.ex
|
||||
#, elixir-autogen, elixir-format, fuzzy
|
||||
msgid "Current Cycle"
|
||||
|
|
@ -1536,7 +1535,6 @@ msgstr ""
|
|||
msgid "Invalid amount format"
|
||||
msgstr ""
|
||||
|
||||
#: lib/mv_web/live/member_live/index.html.heex
|
||||
#: lib/mv_web/live/member_live/show.ex
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Last Cycle"
|
||||
|
|
@ -1683,16 +1681,6 @@ msgstr ""
|
|||
msgid "Select interval"
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Switch to current cycle"
|
||||
|
|
@ -1819,6 +1807,11 @@ msgstr ""
|
|||
msgid "You are about to delete all %{count} cycles for this member."
|
||||
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
|
||||
#~ #, elixir-autogen, elixir-format
|
||||
#~ msgid "All payment statuses"
|
||||
|
|
@ -1923,6 +1916,16 @@ msgstr ""
|
|||
#~ msgid "Quarterly Interval - Joining Period Excluded"
|
||||
#~ 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/show.ex
|
||||
#~ #, elixir-autogen, elixir-format
|
||||
|
|
|
|||
|
|
@ -127,55 +127,67 @@ Accounts.create_user!(%{email: "admin@mv.local"}, upsert?: true, upsert_identity
|
|||
|> Ash.Changeset.for_update(:admin_set_password, %{password: "testpassword"})
|
||||
|> 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
|
||||
for member_attrs <- [
|
||||
%{
|
||||
first_name: "Hans",
|
||||
last_name: "Müller",
|
||||
email: "hans.mueller@example.de",
|
||||
join_date: ~D[2023-01-15],
|
||||
phone_number: "+49301234567",
|
||||
city: "München",
|
||||
street: "Hauptstraße",
|
||||
house_number: "42",
|
||||
postal_code: "80331"
|
||||
},
|
||||
%{
|
||||
first_name: "Greta",
|
||||
last_name: "Schmidt",
|
||||
email: "greta.schmidt@example.de",
|
||||
join_date: ~D[2023-02-01],
|
||||
phone_number: "+49309876543",
|
||||
city: "Hamburg",
|
||||
street: "Lindenstraße",
|
||||
house_number: "17",
|
||||
postal_code: "20095",
|
||||
notes: "Interessiert an Fortgeschrittenen-Kursen"
|
||||
},
|
||||
%{
|
||||
first_name: "Friedrich",
|
||||
last_name: "Wagner",
|
||||
email: "friedrich.wagner@example.de",
|
||||
join_date: ~D[2022-11-10],
|
||||
phone_number: "+49301122334",
|
||||
city: "Berlin",
|
||||
street: "Kastanienallee",
|
||||
house_number: "8"
|
||||
},
|
||||
%{
|
||||
first_name: "Marianne",
|
||||
last_name: "Wagner",
|
||||
email: "marianne.wagner@example.de",
|
||||
join_date: ~D[2022-11-10],
|
||||
phone_number: "+49301122334",
|
||||
city: "Berlin",
|
||||
street: "Kastanienallee",
|
||||
house_number: "8"
|
||||
}
|
||||
] do
|
||||
# Assign each member to a fee type using round-robin distribution
|
||||
member_attrs_list = [
|
||||
%{
|
||||
first_name: "Hans",
|
||||
last_name: "Müller",
|
||||
email: "hans.mueller@example.de",
|
||||
join_date: ~D[2023-01-15],
|
||||
phone_number: "+49301234567",
|
||||
city: "München",
|
||||
street: "Hauptstraße",
|
||||
house_number: "42",
|
||||
postal_code: "80331"
|
||||
},
|
||||
%{
|
||||
first_name: "Greta",
|
||||
last_name: "Schmidt",
|
||||
email: "greta.schmidt@example.de",
|
||||
join_date: ~D[2023-02-01],
|
||||
phone_number: "+49309876543",
|
||||
city: "Hamburg",
|
||||
street: "Lindenstraße",
|
||||
house_number: "17",
|
||||
postal_code: "20095",
|
||||
notes: "Interessiert an Fortgeschrittenen-Kursen"
|
||||
},
|
||||
%{
|
||||
first_name: "Friedrich",
|
||||
last_name: "Wagner",
|
||||
email: "friedrich.wagner@example.de",
|
||||
join_date: ~D[2022-11-10],
|
||||
phone_number: "+49301122334",
|
||||
city: "Berlin",
|
||||
street: "Kastanienallee",
|
||||
house_number: "8"
|
||||
},
|
||||
%{
|
||||
first_name: "Marianne",
|
||||
last_name: "Wagner",
|
||||
email: "marianne.wagner@example.de",
|
||||
join_date: ~D[2022-11-10],
|
||||
phone_number: "+49301122334",
|
||||
city: "Berlin",
|
||||
street: "Kastanienallee",
|
||||
house_number: "8"
|
||||
}
|
||||
]
|
||||
|
||||
# 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
|
||||
Membership.create_member!(member_attrs, upsert?: true, upsert_identity: :unique_email)
|
||||
end
|
||||
Membership.create_member!(member_attrs_with_fee_type, upsert?: true, upsert_identity: :unique_email)
|
||||
end)
|
||||
|
||||
# Create additional users for user-member linking examples
|
||||
additional_users = [
|
||||
|
|
@ -226,21 +238,30 @@ linked_members = [
|
|||
]
|
||||
|
||||
# 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
|
||||
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
|
||||
if user.member_id == nil do
|
||||
# User is free, create member and link - use upsert to prevent duplicates
|
||||
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_identity: :unique_email
|
||||
)
|
||||
else
|
||||
# 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_identity: :unique_email
|
||||
)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue