Parity: best-available comparison as default, term-matching optional

parity_match_mode config ('best_available' default | 'match_terms').
Best available = cheapest bookable non-dinner direct tariff vs the BC
lead-in (already BC's best available) — simplest like-for-like. Term
matching kept as an option for days where BC's cheapest basis differs
from direct's. Settings gains a comparison-basis select.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
jtricerolph 2026-07-06 08:04:15 +00:00
parent 3b501f95c5
commit ad0e82465c
2 changed files with 42 additions and 11 deletions

View file

@ -167,6 +167,26 @@ function ParityTab({ config, isLoading, onSave, saving }: {
Run daily parity check
</label>
<div>
<label style={{ fontSize: 12, fontWeight: 600, color: 'var(--text-mid)', display: 'block', marginBottom: 4 }}>
Comparison basis
</label>
<select
style={{ width: 330 }}
value={(config?.['parity_match_mode'] ?? 'best_available')}
onChange={e => onSave('parity_match_mode', e.target.value)}
>
<option value="best_available">Best available (cheapest bookable tariff on both sides)</option>
<option value="match_terms">Match terms (flex vs flex, prepaid vs prepaid)</option>
</select>
<div style={{ fontSize: 11, color: 'var(--text-mid)', marginTop: 4, maxWidth: 480 }}>
Best available compares our cheapest bookable direct tariff against the Booking.com
lead-in rate (Booking.com's best available). Match terms instead picks the direct tariff
with the same conditions as the scraped Booking.com rate only differs on days where
Booking.com's cheapest is flexible while a cheaper prepaid exists direct.
</div>
</div>
<div style={{ display: 'flex', gap: 16, flexWrap: 'wrap' }}>
<div>
<label style={{ fontSize: 12, fontWeight: 600, color: 'var(--text-mid)', display: 'block', marginBottom: 4 }}>