{{ monthName }}
{{ year }}
{{ monthStatsLabel }}
‹
›
Syncing…
{{ diffError }}
{{ doubleBookings.length }}
double booking{{ doubleBookings.length !== 1 ? 's' : '' }}
{{ totalDaysWithIssues }}
{{ totalDaysWithIssues === 1 ? 'day' : 'days' }} with sync issues
0 days with sync issues
Prices
↑
↓
Fill
Closed
↑
↓
Reservations
↓
User Cal
↑
↓
iCal Feeds
↓
Rules
↓
Remote Sync
↑
Loading calendar…
Could not load calendar data
{{ fetchError }}
!bulkEnabled && b.cls === 'res' && selectReservation(b)" >
${{ priceFor(day) }}
{{ discountFor(day).type === 'percent' ? `-${discountFor(day).value}%` : `-$${discountFor(day).value}` }}
—
◈
Click days to select
Bulk: {{ bulkSortedKeys.length }} {{ bulkSortedKeys.length === 1 ? 'day' : 'days' }}
{{ fmtBulkDates(bulkSortedKeys) }}
Status
{{ bulkStatusSummary }}
Failed
Net
$
Failed
Discount
%
·
$
%
$
Failed
Double Bookings
{{ db.overlap_start }} – {{ db.overlap_end }}
{{ db.a.service }}: {{ db.a.checkin_date }} → {{ db.a.checkout_date }} {{ db.a.guest_name }}
{{ db.b.service }}: {{ db.b.checkin_date }} → {{ db.b.checkout_date }} {{ db.b.guest_name }}
{{ CAT.reservations.label }}
↑
↓
Changed
{{ rc.reservation_id }}
{{ ch.field }}: {{ fmtField(ch.field, ch.local) }} → {{ fmtField(ch.field, ch.remote) }}
◈
Select a day or reservation
{{ selection.label }}
{{ selection.weekday }}
Status
{{ activeStatus }}
Failed
Net
$
/ ${{ priceDataFor(selection.date).net }}
Failed
Discount
%
·
$
%
/ ${{ Number(priceDataFor(selection.date).discount).toFixed(2) }}
$
Failed
{{ serviceName(key) }}
${{ priceDataFor(selection.date)[key] }}
/ ${{ priceDataFor(selection.date)[key + '_retail'] }}
Price
—
Sync Error
{{ CAT.prices.label }}
↑
↓
Fill
Local → Service
{{ serviceName(svcKey) }}
${{ svcs.local }}
—
→
${{ svcs.remote }}
—
{{ CAT.closed.label }}
↑
↓
Local
{{ selMismatches.closed.local?.length ? selMismatches.closed.local.map(serviceName).join(', ') : '—' }}
Services
{{ selMismatches.closed.remote?.length ? selMismatches.closed.remote.map(serviceName).join(', ') : '—' }}
{{ CAT.reservations.label }}
↑
↓
{{ res.status }}
{{ res.guest_name || res.reservation_id }}
Service
{{ serviceName(res.service) }}
Dates
{{ fmtShort(res.checkin_date) }} – {{ fmtShort(res.checkout_date) }}
{{ CAT.discounts.label }}
↑
↓
Local
{{ fmtDiscount(selMismatches.discounts.local) }}
User Cal
{{ fmtDiscount(selMismatches.discounts.user_cal) }}
{{ CAT.user_cal_closed.label }}
↑
↓
Local
{{ selMismatches.user_cal_closed.in_room ? 'Yes' : 'No' }}
user_cal
{{ selMismatches.user_cal_closed.in_user_cal ? 'Yes' : 'No' }}
ical_feeds: {{ feedName }}
↑
↓
Local
{{ feedItem.in_room ? 'Yes' : 'No' }}
ical_feeds
{{ feedItem.in_ical_feeds ? 'Yes' : 'No' }}
Rule: {{ pipelineName }}
↓
Local
{{ fmtDiscount(ruleItem.local) }}
Rule
{{ fmtDiscount(ruleItem.rule) }}
Rule: {{ pipelineName }}
↓
Local
{{ ruleItem.in_room ? 'Closed' : 'Open' }}
Rule
{{ ruleItem.in_rule ? 'Closed' : 'Open' }}
Rule: {{ pipelineName }}
↓
Local base
{{ ruleItem.local_base !== null ? '$' + ruleItem.local_base : '—' }}
Rule min
${{ ruleItem.rule_min }}
{{ CAT.orphans.label }}
{{ orp.event_type }}
{{ orp.title }}
{{ CAT.remote_sync.label }}: {{ serviceName(svc) }}
↑
rooms_to_sell
{{ item.actual_rts }} (expected {{ item.expected_rts }})
{{ selection.guest_name || 'Guest' }}
{{ selection.nights }} night{{ selection.nights !== 1 ? 's' : '' }}
Check-in
{{ fmtDateNoYear(selection.checkin_date) }} @
{{ opt.label }}
Failed
Check-out
{{ fmtDateNoYear(selection.checkout_date) }} @
{{ opt.label }}
Failed
Service
{{ serviceName(selection.service) }}{{ selection.reservation_id ? ': ' + selection.reservation_id : '' }}
Door
Failed
WiFi key
Failed
WiFi SSID
Failed
Messages
{{ visibleChatMessages.length }} message{{ visibleChatMessages.length !== 1 ? 's' : '' }}
Loading…
{{ chatError }}
No messages yet.
{{ chatSenderLabel(msg.sender) }} · {{ fmtChatTime(msg.created_at) }}
{{ msg.body }}
{{ msg.body_translated ?? msg.body }}
{ applyTemplate(e.target.value); e.target.value = ''; }" >
Insert template…
{{ name.replace(/_/g, ' ') }}