feat(go): M5.2 — HTTP handlers for /api/adults, /api/juniors, /api/payments, /api/version
All checks were successful
Deploy to K8s / deploy (push) Successful in 10s
All checks were successful
Deploy to K8s / deploy (push) Successful in 10s
- Add web/api/handler.go: Handler struct wiring Sources+Config into ServeAdults, ServeJuniors, ServePayments, ServeVersion - Add web/api/build_common.go: getMonthLabels, groupRawPaymentsByPerson, settledBalance, domain-to-wire converters, ensureSlice generic helper - Add web/api/build_adults.go: buildAdultsResponse + buildAdultMemberRow mirroring scripts/views.py:build_adults_view_model - Add web/api/build_juniors.go: buildJuniorsResponse + buildJuniorMemberRow mirroring scripts/views.py:build_juniors_view_model, including "?" sentinel and :NJ,MA breakdown - Add web/api/build_payments.go: buildPaymentsResponse with Unmatched/Unknown bucket - Extend reconcile.FeeData/MonthData with IsUnknown, JuniorAttendance, AdultAttendance - Extend reconcile.Transaction with ManualFix, VS, BankID, SyncID for raw_payments wire field - Export membership.AdultMergedMonths and JuniorMergedMonths - Update sources.go to propagate new FeeData fields and parse extra transaction columns - Wire sources+cfg into web.Run; register /api/* routes via Go 1.22 method+path patterns - Fix pre-existing gofumpt formatting in fio_test.go and fio_table.go Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
44
go/internal/web/api/build_payments.go
Normal file
44
go/internal/web/api/build_payments.go
Normal file
@@ -0,0 +1,44 @@
|
||||
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",
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user