feat(entries): search and sort bookings with explicit result totals (U15)

This commit is contained in:
2026-11-02 19:37:09 +01:00
parent be3eb6b674
commit f284b85771
6 changed files with 104 additions and 2 deletions
@@ -0,0 +1,28 @@
using System.Globalization;
using Duempelkas.App.Services.Models;
using Duempelkas.Domain.Enums;
namespace Duempelkas.App.Services;
public static class EntryListQuery
{
public static decimal SignedAmount(EntryDto entry) => entry.Type == EntryType.Income ? entry.Amount : -entry.Amount;
public static List<EntryDto> Apply(IEnumerable<EntryDto> entries, string search, bool showDeleted, string sort)
{
var terms = search.Split(' ', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
var de = CultureInfo.GetCultureInfo("de-DE");
var matches = entries.Where(e => !e.IsDeleted || showDeleted).Where(e =>
{
var text = $"{e.Title} {e.DisplayId} {e.Date:dd.MM.yyyy} {e.Amount.ToString("N2", de)} {SignedAmount(e).ToString("0.00", de)} {e.LinkedAccountName}";
return terms.All(term => text.Contains(term, StringComparison.OrdinalIgnoreCase));
});
return (sort switch
{
"date-desc" => matches.OrderByDescending(e => e.Date).ThenByDescending(e => e.Id),
"amount-asc" => matches.OrderBy(SignedAmount).ThenBy(e => e.Id),
"amount-desc" => matches.OrderByDescending(SignedAmount).ThenBy(e => e.Id),
"title" => matches.OrderBy(e => e.Title, StringComparer.Create(de, true)).ThenBy(e => e.Id),
_ => matches.OrderBy(e => e.Date).ThenBy(e => e.Id)
}).ToList();
}
}