AgentTrackerController.php 16.1 KB
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;
use Auth;
use DateTime;
use Input;
use Response;
use App\Jobs\KHRMSLib;
use App\Models\Sipid;
use App\Models\Dialline;
use App\Models\UserLog;
use App\Models\User;
use DB;
use Log;
use Session;
use Config;
use App\Models\CRMCall;
use App\Models\CRMCallArchive;
use App\Models\Kqueue;

class AgentTrackerController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        if($id=="asmt"){

            date_default_timezone_set('Asia/Kolkata');
            $dashboarduser  =   Auth::user();
            $nowts          =   time();
            $ringarray      =   array();
            $talkarray      =   array();
            $trackarray     =   array();
            $reportarray    =   array();
            $sipidsfound    =   array();
            $userarr        =   array();
            $i              =   1;
            $currenttime = strtotime(date('Y-m-d H:i:s', time()-(330*60)));

            $allusers = User::select('id', 'presence','username','fullname')->where("status","=","Active")->where("usertype","!=","Admin")->where("updated_at", ">", date("Y-m-d"))->orderBy('presence','desc')->get();

            foreach ($allusers as $users) {
                $reportarray[$users->id]["id"] = $users->id;
                $reportarray[$users->id]["username"] = $users->username;
                $reportarray[$users->id]["fullname"] = $users->fullname;
                $reportarray[$users->id]["login_status"]="Logout";
            }

            foreach($allusers as $alluser){
                if($alluser->presence == 1){
                    $trackarray[] = $alluser->id;
                }
            }

            $sipids=Sipid::whereIn("user",$trackarray)->where("status","=","1")->get();
            foreach($sipids as $sipid)$reportarray[$sipid->user]["login_status"]="Login";

            $allDialedChannels=Dialline::where('call_id','!=',0)->where('status','!=','Free')->orderBy('updated_at')->get();

            foreach($allDialedChannels as $allDialedChannel)
            {
                $tcall=CRMCall::find($allDialedChannel->call_id);

                $un="";$uid="";$us="";

                if($tcall->user_id>0)
                {
                    $tuser=User::find($tcall->user_id);
                    $un=$tuser->username;
                    $uname=$tuser->fullname;
                    $uid=$this->userchatbox($tuser).$tuser->id;

                    $userlog=UserLog::where('user_id','=',$tuser->id)->orderBy("id","DESC")->first();
                    $stend=$userlog->getLastStatus();
                    $us="$stend[0]-$stend[1]";

                  $reportarray[$tcall->user_id]["ID"]=$uid;
                    $reportarray[$tcall->user_id]["User"]=$un;
                    $reportarray[$tcall->user_id]["Name"]=$uname;
                }

                if($allDialedChannel->conf == "" && !in_array($allDialedChannel->status, ['Auto', 'AutoCall'])){
                $updatedate = $allDialedChannel->updated_at->toDateTimeString();
                $ringstarttime = strtotime($updatedate);
                $reportarray[$allDialedChannel->user_id]["tsduration"]=$this->secToDuration($currenttime - $ringstarttime);
                $reportarray[$allDialedChannel->user_id]["status"]="Ringing";
                $reportarray[$allDialedChannel->user_id]["exact_status"]="Ringing";
                $reportarray[$allDialedChannel->user_id]["img"]="talk";
                $ringarray[] = $allDialedChannel->user_id;
                }

                if($tcall->state == 'DialEnd' || $tcall->state == 'Auto')
                {
                    $us = "Talk";

                    $updatedate = $tcall->updated_at->toDateTimeString();
                    $ringstarttime = strtotime($updatedate);
                    $reportarray[$tcall->user_id]["tsduration"]=$this->secToDuration($currenttime - $ringstarttime);
                    $reportarray[$tcall->user_id]["status"]=$us;
                    $reportarray[$tcall->user_id]["exact_status"]=$us;
                    $reportarray[$tcall->user_id]["img"]="talk";
                    $talkarray[] = $allDialedChannel->user_id;
                }    

                $reportarray[$tcall->user_id]["Campaign"]=$tcall->client;
                $reportarray[$tcall->user_id]["Station"]=$tcall->sipid_id.$this->userSpyStr($tcall->sipid_id);
                $reportarray[$tcall->user_id]["Status"]=$us;
                $reportarray[$tcall->user_id]["CRMId"]=$tcall->crm_id;
                $reportarray[$tcall->user_id]["Number"]=$tcall->number;
                $reportarray[$tcall->user_id]["Type"]=$tcall->type;
                $reportarray[$tcall->user_id]["State"]=$tcall->state;
                $reportarray[$tcall->user_id]["Duration"]=$nowts-strtotime($tcall->created_at);

                //$reportarray[$newcall->id]=$obj;
                if(!empty($tcall->sipid_id))$sipidsfound[]=$tcall->sipid_id;
            }

            foreach($sipids as $sipid)
            {
                $clidata=json_decode($sipid->clients,true);
                $tuser=User::find($sipid->user);
                $userlog=UserLog::where('user_id','=',$tuser->id)->orderBy("id","DESC")->first();
                $stend=$userlog->getLastStatus();
                $reportarray[$sipid->user]["id"]=$tuser->id;
                $reportarray[$sipid->user]["fullname"]=$tuser->fullname;
                $reportarray[$sipid->user]["ID"]=$this->userchatbox($tuser).$sipid->user;
                $reportarray[$sipid->user]["User"]=$tuser->username;
                $reportarray[$sipid->user]["Name"]=$tuser->fullname;
                $reportarray[$sipid->user]["Station"]=$sipid->id.$this->userSpyStr($sipid->id);
                $reportarray[$sipid->user]["Status"]="$stend[0]-$stend[1]";
                $reportarray[$sipid->user]["CRMId"]="";
                $reportarray[$sipid->user]["Number"]="";
                $reportarray[$sipid->user]["Type"]="";
                $reportarray[$sipid->user]["State"]="";
                $reportarray[$sipid->user]["Duration"]="";

                if(!in_array($sipid->user,$talkarray) && !in_array($sipid->user,$ringarray)){
                    $userlogs = DB::table('userlogs')->where('user_id','=',$sipid->user)->orderBy('updated_at','DESC')->first();
                    $data=json_decode($userlogs->data,true);
                    $lastsip = end($data);
                    if(empty($lastsip['states']))$lastsip['states'][$lastsip['ts']]=array('Not-ready','Not-ready');
                    $currenttime = strtotime(date('Y-m-d H:i:s', time()));
                    $reportarray[$sipid->user]["tsduration"]=$this->secToDuration($currenttime - round((key(array_slice($lastsip['states'], -1, 1,true))/1000)));
                    $alllaststatus[$sipid->user] = end($lastsip['states']);
                    $reportarray[$sipid->user]["status"]=$alllaststatus[$sipid->user][0];
                    $reportarray[$sipid->user]["exact_status"]=$alllaststatus[$sipid->user][1];
                    $reportarray[$sipid->user]["img"]="idle";

                    if($reportarray[$sipid->user]["status"] == "Paused")
                    $reportarray[$sipid->user]["img"]="break";

                    if($reportarray[$sipid->user]["exact_status"] == "WRAPUP")
                    $reportarray[$sipid->user]["img"]="wrap";
                }
            }

            $cntArr = array();
            $loginCnt = 0;
            $logoutCnt = 0;

            foreach ($reportarray as $value) {
                if(!empty($value['status']))
                {
                    if(stristr($value['Status'], "Paused") || stristr($value['Status'], "Incoming") || stristr($value['Status'], "Predictive"))
                    $$value['exact_status'] = 0;
                else
                    $$value['status'] = 0;
                }
            }

            foreach ($reportarray as $key => $value) {
        if(array_key_exists('fullname', $value)){
                if(!empty($value['Status']))
                {
                    if(stristr($value['Status'], "Paused") || stristr($value['Status'], "Incoming") || stristr($value['Status'], "Predictive"))
                    $cntArr[$value['exact_status']][$value['exact_status']] = ++$$value['exact_status'];
                else
                    $cntArr[$value['status']][$value['status']] = ++$$value['status'];
                }

                if($value['login_status'] == "Login")
                {
                    $loginCnt++;
                }

                if($value['login_status'] == "Logout")
                {
                    $logoutCnt++;
                }
        }
            }

            ksort($cntArr);

            $newreportarray = array();

            foreach ($reportarray as $key => $value) {
        if(array_key_exists('fullname', $value)){
                if($value['login_status'] == "Logout")continue;

                if(empty($newreportarray))
                {
                    $newreportarray[$key] = $value;
                }
                else
                {
                    array_push($newreportarray, $value);
                }
          }
            }

            foreach ($reportarray as $key => $value) {
        if(array_key_exists('fullname', $value)){
                if($value['login_status'] == "Logout")
                {
                    array_push($newreportarray, $value);
                }
          }
            }

            $outstr="";
            $divColor = "";

            $outstr.='<div>
            <span class="panel panel-info" style="padding:4px;">Total Logged In:<b style="padding:3px;">'.$loginCnt.'</b></span><span class="panel panel-info" style="padding:5px;background-color:#ff000087;color:#fff">Total Logged Out:<b style="padding:3px;">'.$logoutCnt.'</b></span>';

            foreach ($cntArr as $key => $value) {
                if($key=="Manual" || $key=="Progressive" || $key=="Incoming" || $key=="Predictive" || $key=="Not-ready" || $key=="DialNext")
                    $divColor="#5d9cec";//Blue Color
                elseif($key=="Talk" || $key=="Ringing")$divColor="#80e580";//Green 
                elseif($key=="WRAPUP")$divColor="#efba5b";//Orange
                else $divColor="#dd9ca7";//Pink

            $outstr.='<span class="panel panel-info" style="margin-left:1px;padding:4px;background-color:'.$divColor.';color:#fff">'.$key.':<b style="padding:3px;">'.$value[$key].'</b></span>';
            }

            $outstr.='</div><div class="l-wrap" style="text-align:center">
            <div class="three-col-grid" style="padding:5px;margin" >';

            foreach ($newreportarray
             as $reportarr => $value) {
        if(array_key_exists('fullname', $value)){
                $outstr.='<div class="grid-item" style="width: 110px;float: left;padding:5px;margin: auto;">
                <div style="padding:5px;border:1px solid grey;height:155px;">';
                $outstr.="<p style='font-weight:bold;color:#59cec'>".(!empty($value['img']) ? "<img src='custom/asmt/".$value['img'].".jpg' style='max-width: 100%;max-height: 100%;height:50px;width:50px'>": "<img src='custom/asmt/default.jpg' style='max-width: 100%;max-height: 100%;height:50px;width:50px'>");
        if($value['login_status']=="Login" ){
                    $outstr.="<button class='btn btn-xs btn-denim_outline' onclick='mylogout(\"".$value['id']."\");return false;'><span class='fa fa-sign-out'></span></button>";
                }
                $outstr.="</p><p style='font-size:11px;color:#5d9cec;cursor:pointer'onclick='tchatbox(\"chatpop_".$value['id']."\",\"".$value['fullname']."\");return false;'><b>".$value['fullname']."</b>&nbsp;<i style='color:#4b89dc;cursor:pointer' class='fa fa-comments-o' aria-hidden='true' onclick='tchatbox(\"chatpop_".$value['id']."\",\"".$value['fullname']."\");return false;'></i></p>";
                $outstr.=!empty($value['exact_status']) ? "<p><span style='font-size:10px;'>".$value['exact_status']."</span>": (!empty($value['status']) ? "<p><span style='font-size:10px;'>".$value['status']."</span>": "");
        $outstr.=!empty($value['tsduration']) ? "(<span style='font-size:10px;'>".$value['tsduration']."</span>)</p>": '';
                $outstr.=!empty($value['Station']) ? "<p style='font-weight:bold;color:#59cec'>".$value['Station']."</p>": '';
                $outstr.='</div>
                </div>';
        }
            }

            $outstr.='</div></div>';

            return $outstr;
        }

        if($id=="mylogout"){

            $user_id=Input::get('userid');
            $sipids=Sipid::where("user","=",$user_id)->where("status","=","1")->get();
            foreach($sipids as $tsip)
            {
                $newqueue=new Kqueue();
                $newqueue->sipNotify($tsip,"adminCommand","user","logout","");
            }

            Dialline::where('user_id','=',$user_id)->where('status','!=','Free')->update(['status'=>'Free','conf'=>'','channel'=>'','updated_at'=>'0000-00-00 00:00:00']);
            Sipid::where('user','=',$user_id)->where('status','!=','0')->update(['status'=>0,'user'=>0,'ready'=>0,'patched'=>0,'prepare_call'=>0,'confup'=>0,'clients'=>'','updated_at'=>'0000-00-00 00:00:00']);

            $serverarray=explode(",",Config::get("app.asterisk_slaves"));
            foreach($serverarray as $server)
            {
                $sparts=explode(":",$server);

                Sipid::where("user","=",$user_id)->where("id",">=",$sparts[1])->where("id","<=",$sparts[2])->update(['server' => $sparts[0],'updated_at'=>'0000-00-00 00:00:00']);
                Dialline::where("user_id","=",$user_id)->where("id",">=",$sparts[3])->where("id","<=",$sparts[4])->update(['server' => $sparts[0],'updated_at'=>'0000-00-00 00:00:00']);
            }

            User::where("id","=",$user_id)->where('presence','>','0')->update(['presence'=>0]);
            DB::table('sessions')->where('user_id', $user_id)->delete();
            return Response::make("<script>simpleNotification('success','topRight','Agent Logout successfully!');</script>");
        }
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
    }

    private function secToDuration($sec) {
        return sprintf("%02d%s%02d%s%02d", floor($sec/3600), ':', ($sec/60)%60, ':', $sec%60);
    }

    private function userchatbox($tuser){
        return "<a data-toggle='image-preview' data-title='".$tuser->dispname()."'  data-content='<small></small>' data-image-preview='".$tuser->fetchphotothumb()."' width='100' href='#' class='innerAll half border-none' onclick='tchatbox(\"chatpop_".$tuser->id."\",\"".$tuser->dispname()."\");return false;' style='padding:0 !important'><img src='".$tuser->fetchphotothumb()."' alt='photo' width='22'></a> ";
        // return $tuser;
    }

    private function userSpyStr($sipid){
        if(!empty($sipid))return "&nbsp;&nbsp;&nbsp;<a href=# onclick='kDialerSpy(\"$sipid\",\"L\");return false;'>L</a> <a href=# onclick='kDialerSpy(\"$sipid\",\"B\");return false;'>B</a> <a href=# onclick='kDialerSpy(\"$sipid\",\"W\");return false;'>W</a>";
    }
}