import { useEffect, useState } from 'react' import { Link, useSearchParams } from 'react-router-dom' import { ApiHttpError } from '../../api/http' import { fetchDiscountApplyContext, reverseDiscountApplication } from '../../api/session' import type { DiscountApplyParentRow, DiscountVoucherRow } from '../../api/types' import { AcademicFilterBar } from './AcademicFilterBar' /** * Parity for a legacy `reverse_discount` admin view (not present in the CI tree we inspected). * Uses the same parent/voucher context as “apply voucher”; backend should filter rows as needed. */ export function ReverseDiscountPage() { const [searchParams] = useSearchParams() const schoolYear = searchParams.get('school_year') ?? undefined const semester = searchParams.get('semester') ?? undefined const [vouchers, setVouchers] = useState([]) const [parents, setParents] = useState([]) const [voucherId, setVoucherId] = useState('') const [reason, setReason] = useState('') const [selected, setSelected] = useState>({}) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const [msg, setMsg] = useState(null) const [busy, setBusy] = useState(false) useEffect(() => { let cancelled = false setLoading(true) fetchDiscountApplyContext({ school_year: schoolYear, semester }) .then((d) => { if (cancelled) return setVouchers(d.vouchers ?? []) setParents(d.parents ?? []) }) .catch((e: unknown) => { if (!cancelled) setError(e instanceof ApiHttpError ? e.message : 'Could not load data.') }) .finally(() => { if (!cancelled) setLoading(false) }) return () => { cancelled = true } }, [schoolYear, semester]) function toggle(id: string) { setSelected((s) => ({ ...s, [id]: !s[id] })) } async function onSubmit(e: React.FormEvent) { e.preventDefault() const ids = Object.entries(selected) .filter(([, on]) => on) .map(([id]) => id) if (ids.length === 0) { setMsg('Select at least one parent.') return } setBusy(true) setMsg(null) try { await reverseDiscountApplication({ voucher_id: voucherId || undefined, parent_ids: ids, reason: reason.trim() || undefined, school_year: schoolYear, semester, }) setMsg('Reverse request submitted.') } catch (err: unknown) { setMsg(err instanceof ApiHttpError ? err.message : 'Request failed.') } finally { setBusy(false) } } return (

Reverse Discount

Remove or roll back a voucher application for selected parents. The API route is{' '} /api/v1/discounts/reverse.

{loading ?

Loading…

: null} {error ?
{error}
: null} {msg ? (
{msg}
) : null}