Shared behaviour
Settle, retry, wrap, pause, decline, redial.
These rules are the same in Progressive and Predictive. Hangup writes hold_dialer_call_attempts. Only Not Connected increments call_count and uses [2,2,2,2]. Abandoned is a fixed 5-minute retry. Final Disposal is archived to hold_dialer_disposed.
Hangup map
| AMI / condition | Stored status |
|---|---|
DialStatus = ANSWER (talked) | Received |
| Customer left on hold / connecting | Abandoned |
Cancel, DONTCALL, INVALIDARGS, causes 1, 21, 22, 27–29 | Rejected |
NOANSWER, BUSY, CONGESTION, CHANUNAVAIL, causes 16–20 | Not Connected |
Settle only updates rows still Calling. Agent, duration, and hold seconds are on the attempt row, not master.
Retry
| Not Connected | Abandoned | |
|---|---|---|
| Wait | 1st of a round: retry_seconds same day, else next work_start. 2nd of a round: 1 / 7 / 14 days | Always 5 minutes |
| Pattern | [2,2,2,2] — four rounds of two tries | Ignored |
max_tries | 8th NC copies the row to hold_dialer_disposed and deletes it from master | Ignored |
call_count | Increments on this settle | Unchanged |
After the first completed NC pair, priority_id becomes 2 (Hold + Not Connected). Claim order puts Abandoned first, then priority_no, then Pending / Callback / Not Connected, then oldest attempt. Any idle ready agent may claim any eligible lead.
Wrap and working hours
buffer_time is per-agent wrap after a connected call. A miss with no lead retries claim every 10 seconds. Originate is refused outside work_start–work_end on work_days except a due callback, or when isMaintainance = 1.
Maintenance
hold_dialer_config.isMaintainance (column spelling as stored) is the floor switch. 0 / null is fail-open (calls run). 1 stops new predictive/progressive originates and socket redial. Live talks are not hung. Dashboard and agent show a MAINTENANCE banner. Reloaded with the rest of config every 30 seconds.
Pause and decline
Panel pause writes hold_dialer_employee.panel_status = pause, queue-pauses the extension, and opens a row on hold_dialer_agent_pauses. Agent pause requires { reason } from public GET /api/pause-reasons. Use ondemand for an on-demand OLI call. other requires a short note (12 words). Invalid reason emits invalid_pause_reason and does not pause. Ready closes that row. Status includes pause_reason, pause_reason_note, and paused_at. Every day at 09:30 IST, overnight open pauses are closed and those employees are marked yet_to_login until they tap Active.
SIP deny on a live predictive hold records hold_dialer_agent_declines and blocks that extension for the same caller for decline_cooldown_seconds (default 30). The customer stays on hold. The next offer is any idle agent.
Redial
Socket redial with oli_id from a joined agent. Skips wrap and queue. No skill check. Blocked in maintenance (error: maintenance). ondemand: true allows redial from pause if SIP is idle. Reopens Received / Not Connected / Abandoned rows still on master. Finally disposed leads are gone from master until CRM pushes the oli_id again. Payload is in the Socket guide.
Config that actually moves the needle
| Setting | Used? | Meaning |
|---|---|---|
dialer_type | Yes | Progressive or Predictive |
buffer_time | Yes | Wrap seconds |
predictive_ratio | Yes | Customer legs per idle agent |
decline_cooldown_seconds | Yes | Decline block on the same hold |
max_lines | Yes | Cap ringing + hold + connecting |
max_tries / retry_* / hours | Yes | Not Connected only |
isMaintainance | Yes | 1 pauses new floor calls; live calls stay up |
hold_timeout_seconds | No | Unused leftover |
max_abandon_rate | No | Unused leftover |