package api // JuniorsMonthData is the reconciled ledger for one junior member in one month. // expected and original_expected may be the "?" sentinel (single-attendance month // requiring manual review); they are carried via the Expected type. type JuniorsMonthData struct { Expected Expected `json:"expected"` OriginalExpected Expected `json:"original_expected"` AttendanceCount int `json:"attendance_count"` Exception *ExceptionData `json:"exception"` Paid float64 `json:"paid"` Transactions []MemberTxEntry `json:"transactions"` } // JuniorsMemberData is the reconciled ledger for one junior member. type JuniorsMemberData struct { Tier string `json:"tier"` Months map[string]JuniorsMonthData `json:"months"` OtherTransactions []MemberOtherEntry `json:"other_transactions"` TotalBalance int `json:"total_balance"` } // JuniorsResponse is the JSON contract for GET /api/juniors. // Same outer shape as AdultsResponse; differs in that member_data carries // Expected (int or "?") for expected/original_expected fields. type JuniorsResponse struct { Months []string `json:"months"` RawMonths []string `json:"raw_months"` Results []MemberRow `json:"results"` Totals []TotalCell `json:"totals"` MemberData map[string]JuniorsMemberData `json:"member_data"` MonthLabels map[string]string `json:"month_labels"` RawPayments map[string][]RawTransaction `json:"raw_payments"` Credits []Credit `json:"credits"` Debts []Credit `json:"debts"` Unmatched []RawTransaction `json:"unmatched"` AttendanceURL string `json:"attendance_url"` PaymentsURL string `json:"payments_url"` BankAccount string `json:"bank_account"` CurrentMonth string `json:"current_month"` }