namespace BigRegister.Domain.Registrations; /// /// SERVER-OWNED business rule (ported from the frontend reference impl /// registration.policy.ts:isHerregistratieEligible). A registration may apply for /// herregistratie only while active and within the window before its deadline. /// The endpoint ships the result as a decision flag + reason; the frontend renders it. /// public static class HerregistratieRule { public const int WindowMonths = 12; public static DateOnly? Deadline(Registration reg) => reg.Status.Tag == StatusTag.Geregistreerd ? reg.Status.HerregistratieDatum : null; public static (bool Eligible, string? Reason) Evaluate( Registration reg, DateOnly today, int windowMonths = WindowMonths) { var deadline = Deadline(reg); if (deadline is null) return (false, "Geen actieve registratie."); var windowStart = deadline.Value.AddMonths(-windowMonths); return today >= windowStart ? (true, $"Registratie verloopt binnen {windowMonths} maanden ({deadline:yyyy-MM-dd}).") : (false, $"Herregistratie kan vanaf {windowStart:yyyy-MM-dd}."); } /// Invariant: a non-active status must not carry a herregistratie date. public static bool IsStatusConsistent(RegistrationStatus s) => s.Tag != StatusTag.Geregistreerd || s.HerregistratieDatum is not null; }