Il y a un astérisque, un groupe d'opérateurs (3-5 personnes) avec une grande charge (temps d'attente moyen> 2 minutes)
La tâche consiste pour les abonnés ayant une certaine géographie à donner la possibilité de ne pas attendre que l'opérateur soit libre, et en appuyant sur 0 entendre «Merci pour l'appel. Nous vous rappellerons à coup sûr », déconnectez-vous et attendez calmement un appel de l'opérateur, enfin ou 
des gens ordinaires par Smart Callback
Créer des tableaux
CREATE TABLE asterisk.callback (
id int (11) NOT NULL AUTO_INCREMENT,
horodatage dt DEFAULT CURRENT_TIMESTAMP,
cid varchar (32) DEFAULT NULL,
dst varchar (32) DEFAULT NULL,
status smallint (6) NOT NULL DEFAULT 0,
tot_calls int (11) NOT NULL DEFAULT 0,
last_call timestamp DEFAULT '0000-00-00 00:00:00',
horodatage compl_dt DEFAULT '0000-00-00 00:00:00',
uniqueid varchar (32) DEFAULT NULL,
file d'attente varchar (255) DEFAULT NULL,
CLÉ PRIMAIRE (ID)
)
MOTEUR = INNODB
CREATE TABLE asterisk.callback_log (
id int (11) NOT NULL AUTO_INCREMENT,
callback_id int (11) NOT NULL,
dt timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
varchar d'état (32) DEFAULT NULL,
params varchar (2048) DEFAULT NULL,
CLÉ PRIMAIRE (id),
CONSTRAINT callback_log_fk1 FOREIGN KEY (callback_id)
RÉFÉRENCES asterisk.callback (id) ON DELETE CASCADE ON UPDATE CASCADE
)
MOTEUR = INNODB
Modification d'extensions.conf
 exten => 88142590067, s, 1
     idem => n, GotoIf ($ ["$ {CALLERID (num): 0: 4}" = "8814"]? extra);  si le numéro est local, autorisez CALLBACK
 .... vous pouvez insérer plus de chèques ici ...
     idem => n, Goto (appel)
     idem => n (extra), NoOp (Autoriser le rappel pour $ {CALLERID (num)})
     idem => n, Set (ALLOW_CALLBACK = 1)
     idem => n, Set (opérateurs CALLBACK_QUEUE =)
     idem => n, Arrière-plan (vse / press0-to-callback)
     idem => n (appel), NoOp (Demander des opérateurs. GROUP_COUNT = $ {GROUP_COUNT (operators)})
     idem => n, file d'attente (opérateurs, tThH)
     idem => n, raccrocher
 include => main_menu_press
 [main_menu_press]
 exten => 0.1, NoOp ('-------------------- $ {CALLERID (num)} APPUYEZ SUR LE BOUTON $ {EXTEN}. ALLOW_CALLBACK = $ {ALLOW_CALLBACK} ')
     idem => n, GotoIf ($ [$ {ALLOW_CALLBACK} = 1]? callback, s, 1: i, 1)
 [rappel]
 exten => s, 1, NoOp (RAPPEL)
     idem => n, Lecture (merci d'avoir appelé & vse / my-vam-perezvonim)
     idem => n, raccrocher
 exten => h, 1, agi (callback.php, gen, 0, $ {CALLBACK_QUEUE})
 [rappel]
 exten => _X., 1, NoOp (Essayez de composer pour mettre en file d'attente ($ {CALLBACK_QUEUE}) et rappel à $ {CALLBACK_NUM})
     idem => n, Set (__ DST = "?")
     idem => n, ensemble (CALLERID (num) = $ {CALLBACK_NUM})
     idem => n (appel), file d'attente ($ {CALLBACK_QUEUE}, tT)
     idem => n, NoOp (CALLBACK QUEUESTATUS = $ {QUEUESTATUS})
 [macro-file d'attente-réponse];  Nous arrivons ici lorsque l'opérateur a répondu. 
 exten => s, 1, NoOp (le membre de la file d'attente a répondu uniq = $ {UNIQUEID} cid = $ {CALLERID (num)} chan = $ {CHANNEL} callback_id = $ {CALLBACK_ID} callback_num = $ {CALLBACK_NU
     idem => n, GotoIf ($ ["$ {CALLBACK_ID} x" = "x"]? ignorer)
     idem => n, Set (DST = $ {CHANNEL})
     idem => n, Set (CALLERID (num) = 067)
     idem => n, lecture (essai privé);  Jouer à l'opérateur "Attendre la connexion"
     idem => n, agi (callback.php, réponse à la file d'attente, $ {CALLBACK_ID}, $ {CHANNEL}, $ {UNIQUEID})
     idem => n, Composez (Local / $ {CALLBACK_NUM} @from_office_new)
     idem => n, NoOp (délai d'attente de numérotation [macro-queue-respond])
     idem => n (sauter), NoOp ()
 exten => h, 1, NoOp (raccrochage [macro-queue-responding])
     idem => n, GotoIf ($ ["$ {CALLBACK_ID} x" = "x"]? end)
     idem => n, NoOp (dialstatus = $ {DIALSTATUS} hangupcause = $ {HANGUPCAUSE} queueestatus = $ {QUEUESTATUS})
     idem => n, NoOp (my_dialstatus = $ {MY_DIALSTATUS} my_hangupcause = $ {MY_HANGUPCAUSE})
     idem => n, agi (callback.php, hangup-queue-responding, $ {CALLBACK_ID}, $ {CHANNEL}, $ {UNIQUEID})
     idem => n (fin), NoOp
 [rappel terminé]
 exten => s, 1, NoOp (Rappel terminé. CALLBACK_ID = $ {CALLBACK_ID}, uniq = $ {UNIQUEID}, dst = $ {DST} chan = $ {CHANNEL})
     idem => n, NoOp (dialstatus = $ {DIALSTATUS} hangupcause = $ {HANGUPCAUSE} queueestatus = $ {QUEUESTATUS})
     idem => n, NoOp (my_dialstatus = $ {MY_DIALSTATUS} my_hangupcause = $ {MY_HANGUPCAUSE})
Fichier Queues.conf
 [opérateurs]
     ringinuse = non
     stratégie = rrmemory
     musique = par défaut
     membre => SIP / 321
     membre => SIP / 322
     membre => SIP / 323
     membre => SIP / 324
     membre => SIP / 325
     membre => Agent / 1
     membre => Agent / 2
     membre => Agent / 3
     membre => Agent / 4
     membre => Agent / 5
     context = main_menu_press
     timeout = 0
     annonce-position = oui
     annonce-fréquence = 60
     fréquence d'annonce périodique = 30
     queue-youarenext = queue-youarenext
     membermacro = file d'attente-réponse
Eh bien, en fait, les scripts (PHP détecté)
config.php
<?php ob_implicit_flush(true); set_time_limit(6); date_default_timezone_set('Europe/Moscow'); mysql_connect("localhost","asterisk","***") or die('Mysql connect error'); mysql_select_db("asterisk");  
callback.php
  
Et nous avons mis un fichier callback-regen.php de plus pour la régénération des fichiers d'appel en couronnes toutes les 5 minutes entre 8 h et 20 h.
À chaque tentative, la durée de l'appel répété est augmentée de 5 minutes. Après 10 tentatives de se moquer de l'opérateur, arrêtez