fix(uat): prod UAT batch — reports, sidebar, search, berths, breakpoint
- financial report: drop Expenses KPI, Net Contribution, cash-flow chart, expense donut + ledger (expenses are business-trip costs, not net contribution) - dashboard report PDF: pagination-safe tables (TableSection + per-row wrap) so long doc lists no longer overlap/crush - clients PDF report: rename "Nationality" -> "Country" - sidebar: hide a section header when all its items gate off (FINANCIAL orphan) - topbar: move global search into the 1fr grid track so it can't overlap "New" - clients card: show all linked berths (not just latest interest's primary) - berths list: hide table-only toggles (ft/m, density, columns) in card mode - lists: lower table/card breakpoint lg -> md so narrow desktops get tables - alert-rules: stale floor created_at -> updated_at (survives created_at backfill) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -99,12 +99,19 @@ async function interestStale(portId: string): Promise<AlertCandidate[]> {
|
||||
eq(interests.portId, portId),
|
||||
inArray(interests.pipelineStage, STALE_STAGES),
|
||||
isNull(interests.archivedAt),
|
||||
// An interest can't be "stale for 14+ days" if it has only existed for
|
||||
// less than 14 days. Without this floor, a bulk import (which backdates
|
||||
// dateLastContact to the legacy value) instantly flags every migrated
|
||||
// interest as stale and floods the alert rail. The 14-day clock starts
|
||||
// no earlier than when the interest entered THIS system.
|
||||
lt(interests.createdAt, daysAgo(14)),
|
||||
// An interest can't be "stale for 14+ days" if it has only existed in
|
||||
// THIS system for less than 14 days. Without this floor, a bulk import
|
||||
// (which backdates dateLastContact to the legacy value) instantly flags
|
||||
// every migrated interest as stale and floods the alert rail.
|
||||
//
|
||||
// We floor on updatedAt, NOT createdAt: the legacy→CRM migration
|
||||
// backfilled created_at to each interest's real origination date (so
|
||||
// analytics date-ranges work), which would make every migrated row look
|
||||
// 14+ days old and re-open the flood. updated_at is left at the
|
||||
// migration timestamp, so it's the reliable "entered/last-touched this
|
||||
// system" clock — migrated rows stay suppressed for 14 days, then the
|
||||
// contact-based OR below governs.
|
||||
lt(interests.updatedAt, daysAgo(14)),
|
||||
or(
|
||||
lt(interests.dateLastContact, daysAgo(14)),
|
||||
and(isNull(interests.dateLastContact), lt(interests.updatedAt, daysAgo(14))),
|
||||
|
||||
Reference in New Issue
Block a user