diff --git a/lib/mv_web/live/member_live/show.ex b/lib/mv_web/live/member_live/show.ex index faa4ffc..f283a2c 100644 --- a/lib/mv_web/live/member_live/show.ex +++ b/lib/mv_web/live/member_live/show.ex @@ -21,6 +21,8 @@ defmodule MvWeb.MemberLive.Show do use MvWeb, :live_view import Ash.Query + alias MvWeb.Helpers.MembershipFeeHelpers + @impl true def render(assigns) do ~H""" @@ -162,25 +164,37 @@ defmodule MvWeb.MemberLive.Show do <% end %> - <%!-- Payment Data Section (Mockup) --%> + <%!-- Payment Data Section --%>
<.section_box title={gettext("Payment Data")}> - - -
- <.data_field label={gettext("Contribution")} value="72 €" class="w-24" /> - <.data_field label={gettext("Payment Cycle")} value={gettext("monthly")} class="w-28" /> - <.data_field label={gettext("Paid")} class="w-24"> - <%= if @member.paid do %> - {gettext("Paid")} - <% else %> - {gettext("Pending")} - <% end %> - -
+ <%= if @member.membership_fee_type do %> +
+ <.data_field + label={gettext("Membership Fee")} + value={MembershipFeeHelpers.format_currency(@member.membership_fee_type.amount)} + class="w-24" + /> + <.data_field + label={gettext("Payment Cycle")} + value={MembershipFeeHelpers.format_interval(@member.membership_fee_type.interval)} + class="w-28" + /> + <.data_field label={gettext("Status")} class="w-24"> + <%= if @member.last_cycle_status do %> + <% status = @member.last_cycle_status %> + + {format_status_label(status)} + + <% else %> + {gettext("No cycles")} + <% end %> + +
+ <% else %> +
+ {gettext("No membership fee type assigned")} +
+ <% end %>
<% end %> @@ -216,6 +230,10 @@ defmodule MvWeb.MemberLive.Show do member = Ash.read_one!(query) + # Calculate last cycle status from loaded cycles + last_cycle_status = get_last_cycle_status(member) + member = Map.put(member, :last_cycle_status, last_cycle_status) + {:noreply, socket |> assign(:page_title, page_title(socket.assigns.live_action)) @@ -282,6 +300,18 @@ defmodule MvWeb.MemberLive.Show do defp display_value(""), do: "" defp display_value(value), do: value + defp format_status_label(:paid), do: gettext("Paid") + defp format_status_label(:unpaid), do: gettext("Unpaid") + defp format_status_label(:suspended), do: gettext("Suspended") + defp format_status_label(nil), do: gettext("No status") + + defp get_last_cycle_status(member) do + case MembershipFeeHelpers.get_last_completed_cycle(member) do + nil -> nil + cycle -> cycle.status + end + end + defp format_address(member) do street_part = [member.street, member.house_number]