Limit coupons to X needs to persist across lines during calc

Fixes #6745
Split is_valid() into separate methods