QA point 5 of #7143 — call transcriptions on transfers.
Symptoms
- Blind transfer 203→202→201: 202 sees a duplicate transcription; 203 sees a ghost call
91201 → 201.
- Consultative transfer: consultative leg shows duration
00:00:00; transcription duplicated and only the 00:00:00 row carries the correct text; ghost 91201 → 201.
Root cause
Persisted transcripts (read by History) are written by ns8-nethvoice freepbx/.../satellite/bin/satellite_transcript, invoked per recording (-u <uniqueid> -l <linkedid>). In its segment loop (~L131) every bridge segment is posted under the same invocation uniqueid:
$segmentUniqueid = $uniqueid; // all segments → one uniqueid
A transfer recording holds several bridge segments (consultation + post-transfer) to different peers, so all text lands on one CDR row (often the 00:00:00/Local leg) while the other legs stay empty/duplicated.
Fix
- ns8-nethvoice
satellite_transcript: map each segment to the uniqueid of its own leg (from CEL/CDR), instead of the invocation uniqueid. (Primary)
- nethcti-middleware: align the content-filter lookup key to per-leg uniqueid (
fetchParticipatedConversationsFromDB is already per-leg).
- nethcti-server
dbconn_history.js: 00:00:00 billsec on transfer/consultation legs and the ghost 91201 row.
Canonical transcript identity = one per leg (uniqueid); live transcription stays call-level (linkedid).
QA point 5 of #7143 — call transcriptions on transfers.
Symptoms
91201 → 201.00:00:00; transcription duplicated and only the00:00:00row carries the correct text; ghost91201 → 201.Root cause
Persisted transcripts (read by History) are written by
ns8-nethvoicefreepbx/.../satellite/bin/satellite_transcript, invoked per recording (-u <uniqueid> -l <linkedid>). In its segment loop (~L131) every bridge segment is posted under the same invocation uniqueid:A transfer recording holds several bridge segments (consultation + post-transfer) to different peers, so all text lands on one CDR row (often the
00:00:00/Local leg) while the other legs stay empty/duplicated.Fix
satellite_transcript: map each segment to the uniqueid of its own leg (from CEL/CDR), instead of the invocation uniqueid. (Primary)fetchParticipatedConversationsFromDBis already per-leg).dbconn_history.js:00:00:00billsec on transfer/consultation legs and the ghost91201row.Canonical transcript identity = one per leg (uniqueid); live transcription stays call-level (linkedid).