package api import ( "fuj-management/go/internal/config" "sort" "strings" domreconcile "fuj-management/go/internal/domain/reconcile" ) // buildPaymentsResponse constructs the PaymentsResponse wire type. // Mirrors scripts/views.py:build_payments_view_model. func buildPaymentsResponse( txns []domreconcile.Transaction, memberNames []string, ) PaymentsResponse { grouped := groupRawPaymentsByPerson(txns, memberNames) // Add unmatched/unknown bucket for transactions with no person set. const unknownKey = "Unmatched / Unknown" for _, tx := range txns { if strings.TrimSpace(tx.Person) == "" { grouped[unknownKey] = append(grouped[unknownKey], rawTxFromDomain(tx)) } } // Sort the unknown bucket newest-first (others are sorted in groupRawPaymentsByPerson). if rows, ok := grouped[unknownKey]; ok { sort.Slice(rows, func(i, j int) bool { return rows[i].Date > rows[j].Date }) grouped[unknownKey] = rows } sortedPeople := make([]string, 0, len(grouped)) for p := range grouped { sortedPeople = append(sortedPeople, p) } sort.Strings(sortedPeople) return PaymentsResponse{ GroupedPayments: grouped, SortedPeople: sortedPeople, AttendanceURL: "https://docs.google.com/spreadsheets/d/" + config.AttendanceSheetID + "/edit", PaymentsURL: "https://docs.google.com/spreadsheets/d/" + config.PaymentsSheetID + "/edit", } }