Fix extension transfer system and browser phone compatibility

Major Fixes:
- Fixed extension transfers going directly to voicemail for available agents
- Resolved browser phone call disconnections during transfers
- Fixed voicemail transcription placeholder text issue
- Added Firefox compatibility with automatic media permissions

Extension Transfer Improvements:
- Changed from active client dialing to proper queue-based system
- Fixed client name generation consistency (user_login vs display_name)
- Added 2-minute timeout with automatic voicemail fallback
- Enhanced agent availability detection for browser phone users

Browser Phone Enhancements:
- Added automatic microphone/speaker permission requests
- Improved Firefox compatibility with explicit getUserMedia calls
- Fixed client naming consistency across capability tokens and call acceptance
- Added comprehensive error handling for permission denials

Database & System Updates:
- Added auto_busy_at column for automatic agent status reversion
- Implemented 1-minute auto-revert system for busy agents with cron job
- Updated database version to 1.6.2 for automatic migration
- Fixed voicemail user_id association for extension voicemails

Call Statistics & Logging:
- Fixed browser phone calls not appearing in agent statistics
- Enhanced call logging with proper agent_id association in JSON format
- Improved customer number detection for complex call topologies
- Added comprehensive debugging for call leg detection

Voicemail & Transcription:
- Replaced placeholder transcription with real Twilio API integration
- Added manual transcription request capability for existing voicemails
- Enhanced voicemail callback handling with user_id support
- Fixed transcription webhook processing for extension voicemails

Technical Improvements:
- Standardized client name generation across all components
- Added ElevenLabs TTS integration to agent connection messages
- Enhanced error handling and logging throughout transfer system
- Fixed TwiML generation syntax errors in dial() methods

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-09-02 11:03:33 -07:00
parent ae92ea2c81
commit 7cd7f036ff
14 changed files with 1312 additions and 194 deletions

View File

@@ -209,6 +209,19 @@ class TWP_Twilio_API {
}
}
/**
* Get call status only
*/
public function get_call_status($call_sid) {
$call_result = $this->get_call($call_sid);
if ($call_result['success']) {
return $call_result['data']['status'];
}
throw new Exception('Could not retrieve call status: ' . ($call_result['error'] ?? 'Unknown error'));
}
/**
* Create TwiML for queue
*/
@@ -220,12 +233,14 @@ class TWP_Twilio_API {
$response->say($wait_message, ['voice' => 'alice']);
}
$enqueue = $response->enqueue($queue_name);
// Pass waitUrl as an option to enqueue if provided
$enqueue_options = [];
if ($wait_url) {
$enqueue->waitUrl($wait_url);
$enqueue_options['waitUrl'] = $wait_url;
}
$response->enqueue($queue_name, $enqueue_options);
return $response->asXML();
} catch (Exception $e) {
error_log('TWP Plugin: Failed to create queue TwiML: ' . $e->getMessage());
@@ -682,7 +697,8 @@ class TWP_Twilio_API {
if (!$client_name) {
$current_user = wp_get_current_user();
// Twilio requires alphanumeric characters only - remove all non-alphanumeric
$clean_name = preg_replace('/[^a-zA-Z0-9]/', '', $current_user->display_name);
// Use user_login for consistency across all client name generation
$clean_name = preg_replace('/[^a-zA-Z0-9]/', '', $current_user->user_login);
if (empty($clean_name)) {
$clean_name = 'user';
}