I'm trying to implement a very simple call queue for a small, low volume
helpdesk. We have 2-5 agents, and rarely does the queue get more than 1 or 2
callers deep. I'm using the ringall strategy and I want calls answered in
FIFO order.
Say caller A calls the queue, and there is one member logged in. Asterisk rings
the member.
Now, caller B calls. Asterisk rings the member. Now the member's handset is
showing two incoming calls.
This particular member is a bit lazy or busy, so he waits 30 seconds, and the
first call times out. Asterisk says, "Nobody picked up in 30000 ms",
the caller hears the periodic announcement, and Asterisk stops ringing the
member.
Now, the member is unbusy, so he answers a call. But, he's connected to
caller B, even though caller A called first. That's not what I'd expect
- I want callers to be answered in FIFO order.
I suspect there's some interaction with the "ringinuse" and
"timeout" settings here. I had thought, maybe I'll make the
timeout very long. Since I'm using ringall, I don't have to worry about
a lazy/dead member not answering and thus preventing the caller from being
presented to the next member. However, if I do this, I can't seem to make it
longer than 60 seconds, and also the caller seems to only be presented with
announcements when the timeout expires. I'd like to tell the caller every 30
seconds that they can press 0 to leave a voicemail, regardless of any other
queue activity.
ringinuse=no might be nice, also so if there are more than three callers in the
queue I don't eat up all the call appearance buttons on my member's
handsets. However, I read that only SIP channels can report "in use",
and my members are on OOH323 channels. So, that's out. Coincidentally, I
could make my "members" be just one, which is a hunt group implemented
in another PBX. I'd then want Asterisk to present one caller to this one
member, and keep presenting that caller to the one member until it's
answered, or the caller has been waiting over five minutes, when he's sent
to voicemail. Only then is the next caller presented. Even though I'd think
it would be easy for app_queue to know that the member is busy (after all,
it's calling them), there doesn't seem to be any way to direct app_queue
to not throw every caller in the queue at the one member.
Any ideas on how I might approach a better solution?