Fix worksheet past-date display: pickup, dry/wet, and room cap
Past dates: zero out pickup (override ignored), use actuals for dry/wet (fall back to override/forecast only if no actual exists), lock dry/wet inputs read-only. Pickup + OTB total is now capped at available rooms so occupancy can't exceed 100%. Totals row also excludes past pickup. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
53a631fe93
commit
e9899ce7d5
1 changed files with 16 additions and 11 deletions
|
|
@ -124,14 +124,19 @@ function WorksheetTab({ year, month }: { year: number; month: number }) {
|
||||||
|
|
||||||
function computedDay(day: WorksheetDay) {
|
function computedDay(day: WorksheetDay) {
|
||||||
const ovr = overrides[day.date] || {}
|
const ovr = overrides[day.date] || {}
|
||||||
const pickup = parseInt(ovr.pickup_rooms || '0') || 0
|
const pickup = day.is_past ? 0 : (parseInt(ovr.pickup_rooms || '0') || 0)
|
||||||
const rate = parseFloat(ovr.pickup_avg_rate || '') || parseFloat(sessionRate) || 135
|
const rate = parseFloat(ovr.pickup_avg_rate || '') || parseFloat(sessionRate) || 135
|
||||||
const total = day.otb_rooms + pickup
|
const rawTotal = day.otb_rooms + pickup
|
||||||
|
const total = day.available > 0 ? Math.min(rawTotal, day.available) : rawTotal
|
||||||
const occ = day.available > 0 ? (total / day.available) * 100 : null
|
const occ = day.available > 0 ? (total / day.available) * 100 : null
|
||||||
let accomm = day.otb_net_rev + pickup * rate
|
let accomm = day.otb_net_rev + pickup * rate
|
||||||
if (day.is_past && day.actual_accomm != null) accomm = day.actual_accomm
|
if (day.is_past && day.actual_accomm != null) accomm = day.actual_accomm
|
||||||
const dry = ovr.dry_override !== '' ? parseFloat(ovr.dry_override) : day.forecast_dry
|
const dry = day.is_past && day.actual_dry != null
|
||||||
const wet = ovr.wet_override !== '' ? parseFloat(ovr.wet_override) : day.forecast_wet
|
? day.actual_dry
|
||||||
|
: (ovr.dry_override !== '' ? parseFloat(ovr.dry_override) : day.forecast_dry)
|
||||||
|
const wet = day.is_past && day.actual_wet != null
|
||||||
|
? day.actual_wet
|
||||||
|
: (ovr.wet_override !== '' ? parseFloat(ovr.wet_override) : day.forecast_wet)
|
||||||
return { total, occ, accomm, dry: dry || 0, wet: wet || 0 }
|
return { total, occ, accomm, dry: dry || 0, wet: wet || 0 }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -140,7 +145,7 @@ function WorksheetTab({ year, month }: { year: number; month: number }) {
|
||||||
|
|
||||||
const totals = data.days.reduce((acc, day) => {
|
const totals = data.days.reduce((acc, day) => {
|
||||||
const c = computedDay(day)
|
const c = computedDay(day)
|
||||||
const p = parseInt(overrides[day.date]?.pickup_rooms || '0') || 0
|
const p = day.is_past ? 0 : (parseInt(overrides[day.date]?.pickup_rooms || '0') || 0)
|
||||||
return {
|
return {
|
||||||
available: acc.available + day.available,
|
available: acc.available + day.available,
|
||||||
otb: acc.otb + day.otb_rooms,
|
otb: acc.otb + day.otb_rooms,
|
||||||
|
|
@ -233,7 +238,7 @@ function WorksheetTab({ year, month }: { year: number; month: number }) {
|
||||||
<td className="num">{c.occ != null ? `${c.occ.toFixed(1)}%` : '—'}</td>
|
<td className="num">{c.occ != null ? `${c.occ.toFixed(1)}%` : '—'}</td>
|
||||||
<td className="num df-forecast">{fmtCcy(c.accomm)}</td>
|
<td className="num df-forecast">{fmtCcy(c.accomm)}</td>
|
||||||
<td className="df-input-cell">
|
<td className="df-input-cell">
|
||||||
{canEdit ? (
|
{canEdit && !day.is_past ? (
|
||||||
<input type="number" value={ovr.dry_override} step="0.01"
|
<input type="number" value={ovr.dry_override} step="0.01"
|
||||||
tabIndex={tabDry}
|
tabIndex={tabDry}
|
||||||
placeholder={fmtNum(day.forecast_dry, 0)}
|
placeholder={fmtNum(day.forecast_dry, 0)}
|
||||||
|
|
@ -242,7 +247,7 @@ function WorksheetTab({ year, month }: { year: number; month: number }) {
|
||||||
) : <span className="num">{fmtCcy(c.dry)}</span>}
|
) : <span className="num">{fmtCcy(c.dry)}</span>}
|
||||||
</td>
|
</td>
|
||||||
<td className="df-input-cell">
|
<td className="df-input-cell">
|
||||||
{canEdit ? (
|
{canEdit && !day.is_past ? (
|
||||||
<input type="number" value={ovr.wet_override} step="0.01"
|
<input type="number" value={ovr.wet_override} step="0.01"
|
||||||
tabIndex={tabWet}
|
tabIndex={tabWet}
|
||||||
placeholder={fmtNum(day.forecast_wet, 0)}
|
placeholder={fmtNum(day.forecast_wet, 0)}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue