Commit Graph

  • 5b9560531e fix(ui): remove PN brand mark from mobile topbar; balance title with spacer main Matt 2026-06-19 10:55:18 +02:00
  • f55be14813 test(berths): CM-2 — drop unused var in price-reconcile test Matt 2026-06-19 10:53:24 +02:00
  • 6bc81270b9 feat(interests): CM-2 Part B — deal-price override route + UI on linked berths Matt 2026-06-19 10:48:38 +02:00
  • 38e392e38b feat(interests): CM-2 Part B — EOI/doc generation honours berth price override Matt 2026-06-19 10:41:42 +02:00
  • 039ef25fe5 feat(interests): CM-2 Part B — interest_berths price override (data + resolver) Matt 2026-06-19 10:40:17 +02:00
  • b3753b96a1 feat(berths): CM-2 — bulk price-reconcile admin page Matt 2026-06-19 10:38:08 +02:00
  • 9147f2857e feat(berths): CM-2 — price-reconcile API (list + bulk apply) Matt 2026-06-19 10:35:09 +02:00
  • 47778796ad feat(berths): CM-2 — bulk price-reconcile service (parse + apply) Matt 2026-06-19 10:33:40 +02:00
  • f7425d1231 fix(berths): CM-2 — robust purchase-price extraction (clean-token + magnitude floor) Matt 2026-06-19 10:30:12 +02:00
  • df8c26d1b3 feat(proxies): CM-9 UI — ProxyCard on client, interest, and yacht detail pages Matt 2026-06-19 00:01:08 +02:00
  • 91703bdb00 feat(proxies): CM-9 backend — polymorphic point-of-contact + resolver Matt 2026-06-18 23:54:47 +02:00
  • 3165ec651f feat(client-groups): CM-1 API routes + UI (list, member viewer, copy-emails) Matt 2026-06-18 22:49:29 +02:00
  • 661187cc79 feat(client-groups): CM-1 data layer — groups entity, membership, service, Mailchimp scaffold Matt 2026-06-18 22:28:20 +02:00
  • 4dc0bdd8c4 feat(crm): client-meeting batch — contact-pill cleanup, assignment toggle, receipt manual mode Matt 2026-06-18 21:42:36 +02:00
  • 7f04c765f4 fix(crm): inquiry detail polish, EOI preview mime, EOI next-step, documenso v1 banner Matt 2026-06-18 17:36:35 +02:00
  • 4d018be800 feat(inquiries): one-off NocoDB historical contact-form import (idempotent, dry-run default) Matt 2026-06-17 18:28:01 +02:00
  • 95d7776bb6 test(inquiries): drop unused import Matt 2026-06-17 18:25:13 +02:00
  • 0cc05f302f feat(inquiries): top-level Inquiries page (list + detail + convert), nav entries; retire admin inbox Matt 2026-06-17 18:23:13 +02:00
  • 54554a0928 feat(inquiries): list/get/triage/convert service + API routes (find-or-create client) Matt 2026-06-17 18:09:59 +02:00
  • 9879b82e5f feat(inquiries): website_submissions tracking + display columns; capture populates contact name/email Matt 2026-06-17 18:03:47 +02:00
  • 08adb4aeea feat(permissions): add inquiries resource (view/manage) + idempotent role backfill Matt 2026-06-17 17:59:32 +02:00
  • 6c4490f653 feat(alerts): always-visible dismiss/ack actions + Dismiss all (service, endpoint, UI) Matt 2026-06-17 17:53:12 +02:00
  • 13efe177a5 feat(alerts): split interest.stale into worked-then-quiet + new-untouched (interest.no_activity) Matt 2026-06-17 17:49:22 +02:00
  • 7591231c47 test(e2e): add Initiative 4 end-to-end + integration specs Matt 2026-06-04 14:10:35 +02:00
  • 2e8c4b43bf fix(backup): install pg_dump (postgresql16-client) in app + worker images Matt 2026-06-04 11:58:14 +02:00
  • fe863a588e feat(backup): full DR bundle export + admin-configurable offsite destinations Matt 2026-06-04 11:23:42 +02:00
  • 05950ae0b6 feat(uat): file preview/download fix, clients-by-country page, residential column picker Matt 2026-06-03 22:34:47 +02:00
  • eff57af571 fix(storage): make S3 server-side-encryption optional (default off) Matt 2026-06-03 22:08:41 +02:00
  • 1750e265e7 feat(berths): inline spec-PDF preview, manual-pin badge, maintenance module toggle, under-offer popover Matt 2026-06-03 19:15:04 +02:00
  • 2a7f922a01 fix(uat): dashboard snapshots current-state, pulse-chip gate, phone display, chip width Matt 2026-06-03 18:27:56 +02:00
  • 39c19b2340 feat(berths): click-to-change status from the list (chip → reason modal) Matt 2026-06-03 16:01:40 +02:00
  • d1f6d6a427 feat(eoi): signed-EOI hero + send-signed-copy; fix search dropdown z-order Matt 2026-06-03 15:55:28 +02:00
  • 3b227fe9b2 feat(files): in-app .docx preview + allow office/text mimes Matt 2026-06-03 15:45:11 +02:00
  • 95724c8e3a fix(uat): prod UAT batch — reports, sidebar, search, berths, breakpoint Matt 2026-06-03 15:41:31 +02:00
  • 93c6554c95 fix(ui+alerts+email): prod walkthrough batch Matt 2026-06-03 14:09:16 +02:00
  • 72028a7f32 fix(proxy): trust forwarded Host header for CSRF origin check Matt 2026-06-03 04:10:57 +02:00
  • d485695357 fix: CSRF host-compare behind proxy + default port = creation order Matt 2026-06-03 03:38:12 +02:00
  • 23a5811342 fix(proxy): accept the __Secure- prefixed session cookie in production Matt 2026-06-03 03:13:22 +02:00
  • 102ee493f8 fix(ports): list ports in creation order so the primary port leads Matt 2026-06-03 00:51:12 +02:00
  • c70eb1f945 fix(docker): merge prod deps into standalone node_modules (not replace) Matt 2026-06-03 00:31:33 +02:00
  • 42baaf7bfc fix(docker): complete prod node_modules for the custom server Matt 2026-06-03 00:03:11 +02:00
  • 319fd7fd1a fix(server): resolve socket.io deps via NODE_PATH + polyfill AsyncLocalStorage Matt 2026-06-02 23:34:28 +02:00
  • 2315b58764 fix(docker): bundle socket.io transitive deps into crm-app runner Matt 2026-06-02 23:03:57 +02:00
  • 15a139e86f feat(berths): website auto-promote toggle + manual-override soft-pin priority Matt 2026-06-02 20:10:04 +02:00
  • 04ddd59662 chore(repo): untrack internal docs + CLAUDE.md (keep local-only) Matt 2026-06-02 18:02:45 +02:00
  • 2a4dadd5a7 docs(launch): execute-ready initial-deployment runbook Matt 2026-06-02 17:50:42 +02:00
  • 44b004fa8f feat(intake): recipient picker UI (users/roles/everyone/emails) Matt 2026-06-02 17:36:24 +02:00
  • 5ea0c75fff feat(intake): structured notification-recipient resolver (emails/users/roles/everyone) Matt 2026-06-02 17:28:48 +02:00
  • 0416dc8d39 docs(launch): website-integration env vars + cutover sequence Matt 2026-06-02 17:22:12 +02:00
  • 990b566eff feat(intake): CRM-owned website inquiry emails + in-app notifications Matt 2026-06-02 17:22:08 +02:00
  • f699533224 Merge feat/residential-toggle-and-reports-comparison into main Matt 2026-06-02 15:08:31 +02:00
  • 79b6ab2ae0 fix(build): split custom-report registry into client-safe metadata + server query module Matt 2026-06-02 14:28:51 +02:00
  • cd82958307 docs(launch): Initiative 2 (codebase + security audit) COMPLETE — 85 findings remediated feat/residential-toggle-and-reports-comparison Matt 2026-06-02 13:32:04 +02:00
  • 478aba1866 docs(audit): remediation complete — 84/85 fixed, L21 false-positive; M23/M25 DB migrations deferred Matt 2026-06-02 13:31:34 +02:00
  • 8c4c9b967e fix(audit): UI — L18 (decorative emoji -> Lucide icons), L19 (gated NotesList timer + create-from-url ref-in-effect) Matt 2026-06-02 13:30:25 +02:00
  • e7fdf75a6c fix(audit): residential/tenancies — M28 (unified stage validation), M29 (explicit-disable wins), L31 (active-tenancy warning), L32 (socket event + saveStages tx) Matt 2026-06-02 13:18:28 +02:00
  • 7b74e2314b fix(audit): M24 — reserve 'branding'/'avatar' file categories from the upload/update API Matt 2026-06-02 13:18:24 +02:00
  • fd69a75980 fix(audit): bounce/email — M8 (Message-ID port-safe bounce match), L16 (recipient validation, CRLF, header trust note) Matt 2026-06-02 13:18:20 +02:00
  • cc5c053a79 fix(audit): reports workers — M9 (no duplicate scheduled emails), L5 (idempotent render artefacts), L6 (atomic schedule claim), L7 (per-port notification From) Matt 2026-06-02 13:07:30 +02:00
  • 64c73a5d77 fix(audit): rate-limit/DoS — M13 (bulk limiter on 6 routes), M14 (api limiter default in withAuth, fail-open), M15 (export-pdf payload bounds); L21 verified not-a-bug Matt 2026-06-02 13:07:25 +02:00
  • ebe5fe6ed8 fix(audit): GDPR/merge — M6 (drop false merge-reversibility claims), M7 (GDPR export adds 4 PII tables), L14 (docstring), L15 (hard-delete breadcrumb note) Matt 2026-06-02 13:07:21 +02:00
  • aedbcfd58d fix(audit): AI — L8 (single recordAiUsage), L9 (budget-off warning), L10 (sanitize notes/subjects into prompt) Matt 2026-06-02 12:59:16 +02:00
  • 70bf26aea1 fix(audit): berth rules/recommender — M4 (bundle-wide status), M5 (berth_unlinked target), M20/L27 (interest_berths invariant + cross-port guard), L3 (recommender stage-scale), L4 (dead branch) Matt 2026-06-02 12:59:12 +02:00
  • 4084029962 fix(audit): documenso — M2 (reservation EOI-milestone pollution), L11 (v2 numericId GET fallback), L12 (API URL normalize/validate), L13 (event dedup) Matt 2026-06-02 12:59:07 +02:00
  • 37ffb2c3b4 fix(audit): financial — M19 (group-by-currency accumulation, full-precision rates), M23 (invoice money rounding + 0% discount), L25 (no silent unconverted/stale FX), L26 (companyNotes updatedAt) Matt 2026-06-02 12:52:28 +02:00
  • 49f5c3165b fix(audit): interests/pipeline — M1 (outcome terminal guard), M3 (single-UPDATE + milestone gating), L1 (dead 'completed'), L2 (nurturing edge), L24 (deposit re-lock on refund) Matt 2026-06-02 12:52:24 +02:00
  • 0ed4323826 fix(audit): socket cluster — M10 (isActive gate), M11 (permission-scoped entity rooms), L20 (join:entity validation) Matt 2026-06-02 12:52:20 +02:00
  • 25988dbfad fix(audit): import cluster — M27 (commit idempotency), M25 (in-file dedup preview), M26 (undo destructive-update reporting), L33 (mapping/mooring), L35 (port-auth doc) Matt 2026-06-02 12:41:00 +02:00
  • 9305c030de fix(audit): storage cluster — M16 (presign doc/contract), M17 (per-port byte cap), M18 (replay-after-stat), L17 (mime allow-list, fingerprint hash), L22 (brochure portSlug) Matt 2026-06-02 12:40:56 +02:00
  • 65ed90b603 fix(audit): webhook cluster — M21 (test-send isActive), M22 (cross-tenant dead-letter), L28 (ipv6 SSRF), L29 (rebind doc), L30 (replay event-time) Matt 2026-06-02 12:40:41 +02:00
  • 29fb882478 fix(audit): H15 (saved-view sort) + H14 (back/forward URL resync) in usePaginatedQuery Matt 2026-06-02 12:26:10 +02:00
  • 808e80744b fix(audit): H12 — consistent refund sign so refunds never inflate revenue Matt 2026-06-02 12:24:51 +02:00
  • 77829485a7 fix(audit): H5 — keep yacht ownership-history ledger consistent on archive/restore Matt 2026-06-02 12:24:46 +02:00
  • 1882bcb2e4 fix(audit): H11 — gate cross-port coverBrandPortId in report runs Matt 2026-06-02 12:18:11 +02:00
  • a335dbc117 fix(audit): H10 — neutralize CSV formula injection in expense + audit exports Matt 2026-06-02 12:18:07 +02:00
  • 4489ad2431 fix(audit): H9 — rate-limit AI routes + budget-gate email-draft token spend Matt 2026-06-02 12:18:03 +02:00
  • b51d6d3030 fix(audit): H4 (reservation signing berth rule) + H13 (manual EOI-sign stage parity) Matt 2026-06-02 12:12:02 +02:00
  • 865ae5c072 fix(audit): H2/H3 — client merge re-points payments, memberships, yacht & invoice ownership Matt 2026-06-02 12:09:49 +02:00
  • 7a7fd76081 fix(audit): H8 (residentialAccess caller-superset) + M12 (self-target guard) in updateUser Matt 2026-06-02 12:06:06 +02:00
  • f4fb7aae84 fix(audit): H1 (webhook redirect SSRF), H6 (berth-status case), H7 (residential notes URL) Matt 2026-06-02 12:03:35 +02:00
  • 3c9310f81c fix(audit): critical C3 — enforce residential module gate on all v1 API routes Matt 2026-06-02 11:59:52 +02:00
  • 7aa639f195 fix(audit): criticals C1 (currency-scoped deposit gate), C2 (outcome-aware berth rule), C4 (/q/ allowlist) Matt 2026-06-02 11:54:36 +02:00
  • 30f6723fef docs(audit): complete unified master — all 17 lanes, 85 findings (4 CRIT/17 HIGH/29 MED/35 LOW) Matt 2026-06-02 11:38:44 +02:00
  • 3337a20091 docs(audit): consolidated master findings — passes 1+2 (6/17 lanes, 3 CRIT/6 HIGH); 11 lanes pending re-run Matt 2026-06-02 11:07:35 +02:00
  • 366b0d79fd docs(launch): reports polish shipped — empty states + Operational Area filter Matt 2026-06-02 10:25:07 +02:00
  • 0ee3cd6073 feat(reports): operational Area filter (FilterBar + query + template scope) Matt 2026-06-02 10:21:57 +02:00
  • 91d8ee226b feat(reports): financial report-level empty state Matt 2026-06-02 10:19:57 +02:00
  • 24e88ae32e feat(reports): sales report-level empty state Matt 2026-06-02 10:17:56 +02:00
  • 7cf364e03a feat(reports): shared ReportEmptyState component Matt 2026-06-02 10:17:05 +02:00
  • 58203ca8ea feat(reports): financial hasData existence flag (service + route) Matt 2026-06-02 10:13:42 +02:00
  • 8b7099c4c1 feat(reports): sales hasData existence flag (service + route) Matt 2026-06-02 10:12:54 +02:00
  • 68da165b37 feat(reports): operational route — Area filter + areaOptions + hasData Matt 2026-06-02 10:11:26 +02:00
  • 10b3b68851 feat(reports): thread Area filter + add area-options/hasData helpers (operational service) Matt 2026-06-02 10:10:33 +02:00
  • 3d9084c94b feat(reports): parseOperationalFilters pure parser (Area scope) Matt 2026-06-02 10:08:16 +02:00
  • 93e96da43b docs(reports): implementation plan for beta-finish polish Matt 2026-06-02 10:05:13 +02:00
  • 244fb14ce5 docs(reports): design spec for beta-finish polish (empty states + Operational area filter) Matt 2026-06-02 09:57:12 +02:00
  • 41c64dc126 feat(reports): gate unbuilt Marketing report to 404 for beta Matt 2026-06-02 09:34:55 +02:00
  • 0f7da79a64 docs(launch): Financial report SHIPPED (Phase 4) — payments-model reframe Matt 2026-06-02 00:44:27 +02:00
  • b690fb8d56 feat(reports): Financial report (Initiative 1 Phase 4) Matt 2026-06-02 00:43:36 +02:00
  • 75fdb9fab4 docs(launch): reconcile tracker — mark shipped rep/source filters + 3 stale-deferred items Matt 2026-06-02 00:25:34 +02:00