feat(overview): add point-in-time, suspended, OR-group and count-range filters

This commit is contained in:
Simon 2026-07-10 16:27:15 +02:00
parent c547ca19af
commit c0d1550401
23 changed files with 1116 additions and 117 deletions

View file

@ -35,6 +35,7 @@ defmodule MvWeb.Components.AddFilterBuilderComponent do
alias Mv.Constants
alias MvWeb.MemberLive.Index.DateFilter
alias MvWeb.MemberLive.Index.DatePresets
alias MvWeb.MemberLive.Index.FilterDescriptor
alias MvWeb.MemberLive.Index.FilterParams
alias MvWeb.MemberLive.Index.PaymentAging
@ -968,32 +969,30 @@ defmodule MvWeb.Components.AddFilterBuilderComponent do
# --- date presets ---------------------------------------------------------
defp date_presets do
[
{"this_year", gettext("This year")},
{"last_year", gettext("Last year")},
{"this_month", gettext("This month")},
{"last_30_days", gettext("Last 30 days")}
]
Enum.map(DatePresets.all(), fn preset -> {Atom.to_string(preset), preset_label(preset)} end)
end
defp preset_range("this_year") do
y = Date.utc_today().year
{Date.new!(y, 1, 1), Date.new!(y, 12, 31)}
end
defp preset_label(:last_7_days), do: gettext("Last 7 days")
defp preset_label(:last_30_days), do: gettext("Last 30 days")
defp preset_label(:last_3_months), do: gettext("Last 3 months")
defp preset_label(:last_12_months), do: gettext("Last 12 months")
defp preset_label(:this_month), do: gettext("This month")
defp preset_label(:this_quarter), do: gettext("This quarter")
defp preset_label(:this_year), do: gettext("This year")
defp preset_range("last_year") do
y = Date.utc_today().year - 1
{Date.new!(y, 1, 1), Date.new!(y, 12, 31)}
end
# Resolves a preset string (from `phx-value-preset`) to a concrete `{from, to}`
# tuple via the shared, clock-free `DatePresets` resolver, or nil for an
# unknown preset. The resolver defines "this year" as period-to-date
# ([Jan 1, today]) per §2.8, superseding the prior full-year range.
defp preset_range(preset) when is_binary(preset) do
case Enum.find(DatePresets.all(), &(Atom.to_string(&1) == preset)) do
nil ->
nil
defp preset_range("this_month") do
today = Date.utc_today()
{Date.beginning_of_month(today), Date.end_of_month(today)}
end
defp preset_range("last_30_days") do
today = Date.utc_today()
{Date.add(today, -30), today}
key ->
%{from: from, to: to} = DatePresets.resolve(key)
{from, to}
end
end
defp preset_range(_), do: nil