createTheGroup($group); } public function createTheGroup(Group $entity){ Log::debug('Group Created - '.date('Y-m-d H:i:s')); $asterisk_queue_obejct = self::asteriskQueueObject($entity->id,$entity->name,"",60,'rrmemory'); DB::table('groups')->where('id',$entity->id)->update([ 'company_id' => \Auth::user()->company_id ?? 1 ]); DB::table('asterisk.queues_config')->insertOrIgnore($asterisk_queue_obejct['queues_config']); // Insert queue details WITHOUT members (members will be added as static entries below) $full_insertion = $asterisk_queue_obejct['queues_details']; if(!empty($full_insertion)){ DB::table('asterisk.queues_details')->where('id','=',$entity->id)->delete(); DB::table('asterisk.queues_details')->insert($full_insertion); } $asterisk_indound_obejct = self::asteriskInboundObject($entity->id,$entity->name,); DB::table('asterisk.incoming')->insertOrIgnore($asterisk_indound_obejct['incoming']); DB::table('asterisk.superfecta_to_incoming')->insertOrIgnore($asterisk_indound_obejct['superfecta_to_incoming']); if(config('pbx.queue_member_mode') === 'dynamic'){ $this->syncMembersDynamic($entity); } else { $this->syncMembersStatic($entity); } $this->applyFreePBXConfig(); } /** * Handle the Group "updated" event. * * @param \Modules\Platform\User\Entities\Group $group * @return void */ public function updated(Group $entity) { // Update queue basic details first DB::table('asterisk.queues_config')->where('extension','=',$entity->id)->update(['descr' => $entity->name]); DB::table('asterisk.queues_details')->where('id','=',$entity->id)->where('keyword','=','servicelevel')->update(['data' => 60]); DB::table('asterisk.queues_details')->where('id','=',$entity->id)->where('keyword','=','strategy')->update(['data' => 'rrmemory']); if(config('pbx.queue_member_mode') === 'dynamic'){ $this->syncMembersDynamic($entity); } else { $this->syncMembersStatic($entity); } $this->applyFreePBXConfig(); } /** * Handle the Group "deleted" event. * * @param \App\Group $group * @return void */ public function deleted(Group $group) { // } /** * Handle the Group "restored" event. * * @param \App\Group $group * @return void */ public function restored(Group $group) { // } /** * Handle the Group "force deleted" event. * * @param \App\Group $group * @return void */ public function forceDeleted(Group $group) { // } private function applyFreePBXConfig() { $process = new Process(['fwconsole', 'reload']); $process->run(); } private function syncMembersStatic(Group $entity) { $extensions = DB::table('group_user') ->join('asterisk.devices', 'asterisk.devices.id', '=', 'group_user.user_id') ->where('group_user.group_id', $entity->id) ->pluck('group_user.user_id'); // Only replace extension members ("Local/{ext}@from-queue/n,0"). // External phone-number members are managed separately and must not // be removed when the user list is synced. DB::table('asterisk.queues_details') ->where('id', $entity->id) ->where('keyword', 'member') ->whereRaw("data LIKE 'Local/%@from-queue/n,%'") ->delete(); if($extensions->isNotEmpty()){ $members = $extensions->map(function($userId) use ($entity) { return ['id' => $entity->id, 'keyword' => 'member', 'data' => "Local/{$userId}@from-queue/n,0", 'flags' => '0']; })->toArray(); DB::table('asterisk.queues_details')->insert($members); } Log::info("GroupObserver: Synced queue {$entity->id} with " . count($extensions) . " static members"); } private function syncMembersDynamic(Group $entity) { $userIds = DB::table('group_user') ->where('group_id', $entity->id) ->pluck('user_id') ->toArray(); $asteriskGroup = new UserAsteriskGroup(); $asteriskGroup->SyncQueueUsers($entity, $userIds); Log::info("GroupObserver: Synced queue {$entity->id} with " . count($userIds) . " dynamic members"); } private function asteriskQueueObject($extension,$descr,$grppre,$servicelevel,$strategy){ return [ 'queues_config' => [ 'extension' => $extension, 'descr' => $descr, 'grppre' => $grppre, 'ringing' => '0', 'maxwait' => '180', 'password' => '', 'ivr_id' => 'none', 'dest' => 'app-blackhole,hangup,1', 'cwignore' => '1', 'queuewait' => '1', 'use_queue_context' => '2', 'togglehint' => '0', 'qnoanswer' => '0', 'callconfirm' => '0', 'monitor_heard' => '0', 'monitor_spoken' => '0', 'callback_id' => '0' ], 'queues_details' => [ ["id" => $extension, "keyword" => "announce-frequency","data" => "0", "flags" => "0"], ["id" => $extension, "keyword" => "announce-holdtime","data" => "no", "flags" => "0"], ["id" => $extension, "keyword" => "announce-position","data" => "no", "flags" => "0"], ["id" => $extension, "keyword" => "answered_elsewhere","data" => "0", "flags" => "0"], ["id" => $extension, "keyword" => "autofill","data" => "yes", "flags" => "0"], ["id" => $extension, "keyword" => "autopause","data" => "no", "flags" => "0"], ["id" => $extension, "keyword" => "autopausebusy","data" => "no", "flags" => "0"], ["id" => $extension, "keyword" => "autopausedelay","data" => "0", "flags" => "0"], ["id" => $extension, "keyword" => "autopauseunavail","data" => "no", "flags" => "0"], ["id" => $extension, "keyword" => "cron_dom","data" => "*", "flags" => "0"], ["id" => $extension, "keyword" => "cron_dow","data" => "*", "flags" => "0"], ["id" => $extension, "keyword" => "cron_hour","data" => "23", "flags" => "0"], ["id" => $extension, "keyword" => "cron_minute","data" => "59", "flags" => "0"], ["id" => $extension, "keyword" => "cron_month","data" => "*", "flags" => "0"], ["id" => $extension, "keyword" => "cron_random","data" => "false", "flags" => "0"], ["id" => $extension, "keyword" => "cron_schedule","data" => "daily", "flags" => "0"], ["id" => $extension, "keyword" => "eventmemberstatus","data" => "1", "flags" => "0"], ["id" => $extension, "keyword" => "eventwhencalled","data" => "1", "flags" => "0"], ["id" => $extension, "keyword" => "joinempty","data" => "yes", "flags" => "0"], ["id" => $extension, "keyword" => "leavewhenempty","data" => "no", "flags" => "0"], ["id" => $extension, "keyword" => "maxlen","data" => "0", "flags" => "0"], ["id" => $extension, "keyword" => "memberdelay","data" => "0", "flags" => "0"], ["id" => $extension, "keyword" => "min-announce-frequency","data" => "15", "flags" => "0"], ["id" => $extension, "keyword" => "monitor-join","data" => "yes", "flags" => "0"], ["id" => $extension, "keyword" => "penaltymemberslimit","data" => "0", "flags" => "0"], ["id" => $extension, "keyword" => "periodic-announce-frequency","data" => "0", "flags" => "0"], ["id" => $extension, "keyword" => "queue-callswaiting","data" => "silence/1", "flags" => "0"], ["id" => $extension, "keyword" => "queue-thankyou","data" => "", "flags" => "0"], ["id" => $extension, "keyword" => "queue-thereare","data" => "silence/1", "flags" => "0"], ["id" => $extension, "keyword" => "queue-youarenext","data" => "silence/1", "flags" => "0"], ["id" => $extension, "keyword" => "recording","data" => "force", "flags" => "0"], ["id" => $extension, "keyword" => "reportholdtime","data" => "no", "flags" => "0"], ["id" => $extension, "keyword" => "retry","data" => "5", "flags" => "0"], ["id" => $extension, "keyword" => "ringinuse","data" => "yes", "flags" => "0"], ["id" => $extension, "keyword" => "rvol_mode","data" => "dontcare", "flags" => "0"], ["id" => $extension, "keyword" => "rvolume","data" => "0", "flags" => "0"], ["id" => $extension, "keyword" => "servicelevel","data" => $servicelevel, "flags" => "0"], ["id" => $extension, "keyword" => "skip_joinannounce","data" => "", "flags" => "0"], ["id" => $extension, "keyword" => "strategy","data" => $strategy, "flags" => "0"], ["id" => $extension, "keyword" => "timeout","data" => "35", "flags" => "0"], ["id" => $extension, "keyword" => "timeoutpriority","data" => "app", "flags" => "0"], ["id" => $extension, "keyword" => "timeoutrestart","data" => "no", "flags" => "0"], ["id" => $extension, "keyword" => "weight","data" => "0", "flags" => "0"], ["id" => $extension, "keyword" => "wrapuptime","data" => "0", "flags" => "0"] ] ]; } private function asteriskInboundObject($extension,$descr){ return [ 'incoming'=> [ 'cidnum' => '', 'extension' => $extension, 'destination' => "ext-queues,$extension,1", 'privacyman' => '0', 'alertinfo' => '', 'ringing' => '', 'fanswer' => '', 'description' => $descr, 'grppre' => '', 'delay_answer' => '0', 'pricid' => '', 'pmmaxretries' => '3', 'pmminlength' => '10', 'reversal' => '', 'rvolume' => '0', ], 'superfecta_to_incoming' => [ // 'superfecta_to_incoming_id' => '0', 'extension' => $extension, 'cidnum' => '', 'scheme' => 'ALL|ALL' ] ]; } }