- Shipped
- August 5, 2026 at 6:02 PM UTC
- Author
- Kamo
- Commit
- d4ba503
Calls were never recorded anywhere — VoipCallEventService published a NATS event for the browser and kept nothing, and RECORDINGS only exists when audio was captured. The per-instance sync now pulls call history through the PhoneProvider abstraction and upserts PHONE_CALL_LOG, keyed on (instance, provider call id). That is the only route that works for FreePBX and Microsoft Teams, neither of which offers a usable per-call webhook. The sweep is the single writer. Persisting from the RingCentral webhook as well was tried and removed: its notification carries telephonySessionId while the call-history API returns a different record id, so the two writers produced two rows and two timeline entries for one call. Calls are attributed to an extension only when that extension is actually on the call. RingCentral's endpoint is extension/~ and ignores the argument, so looping per extension would otherwise file every member's calls under whichever one the loop visited last. Recording ids are resolved per page via RecordingLookupService, the same enrichment the softphone history gets — without it the tab knows a recording exists but cannot play it. Texts link at send/receive; voicemails link at sync.