networksSetup = Networks::pluck('setup','prefix'); $this->networksMinute = Networks::pluck('minute','prefix'); $this->networksNames = Networks::pluck('name','prefix'); $this->networksTax = Networks::pluck('tax','prefix'); $this->SettingsHelper = new SettingsHelper(); $this->UserHelper = new UserHelper(); } public function billing(Request $request){ $conds = $this->SettingsHelper->defaultConds(); $agent_names = $this->UserHelper->getCompanyUsers(); $agents_options = [ 'Agents' => $agent_names->pluck('name','id')->toArray() ]; if($request->has('daterange')){ $range = explode(' - ', $request->daterange); $conds['from'] = Carbon::parse($range[0])->startOfDay()->toDateTimeString(); $conds['to'] = Carbon::parse($range[1])->endOfDay()->toDateTimeString(); } $dataTable = $this->billingDatatable($request,$conds); $overall = [ 'total_billable_mins' => $this->totalMinutes, 'calls_counter' => $this->totalCalls, 'total_cost_before' => round($this->totalCostBefore,2), 'total_cost_after' => $this->totalCostAfter, ]; if ($request->ajax() && empty($request->action)) { return $dataTable; } $view = view('reporting::billing')->with('user_ext',$request->user_ext); $filter_area = view('reporting::widgets.filter_area') ->with('conds', $conds) ->with('agents_options',$agents_options) ->with('user_ext',$request->user_ext) ->with('submit_route', route('reporting.billing')); return $view->with(compact('overall', 'filter_area', 'conds')); } public function convertSeconds($seconds = NULL){ $hours = floor($seconds / 3600); $mins = floor($seconds / 60 % 60); $secs = floor($seconds % 60); return sprintf('%02d:%02d:%02d', $hours, $mins, $secs); } public function billingDatatable(Request $request,$conds){ $user = \Auth::user(); $admins = User::where('company_id', $user->company_id) ->whereHas('roles', function ($q) { $q->where('name', 'company_manager'); }) ->pluck('id') ->toArray(); $users = User::where('company_id', $user->company_id) ->visibleInReports() ->pluck('id') ->toArray(); $data = CDR::select( 'cdr.calldate', 'cdr.uniqueid', 'cdr.linkedid', 'cdr.duration', 'cdr.billsec', 'cdr.dcontext', 'cdr.src', 'cdr.dst', 'cdr.cnum', 'cdr.cnam', ) ->where('cdr.disposition','ANSWERED') ->whereNotIn('cdr.dst', ['*98', '100']) ->whereNotIn('cdr.src', ['100']) ->where('lastapp','=','Dial') ->where('dcontext','=','from-internal') ->whereBetween('calldate',[$conds['from'],$conds['to']]); $data->whereNotIn('cdr.cnum',$admins); if(CompanySettings::get('S_COMPANY_MULTI_COMPANY')== true){ $data->whereIn('cdr.cnum', $users); } if(isset($request->user_ext)){ $data->where('cdr.cnum', $request->user_ext); } // return $data->get(); return Datatables::of($data->get()) ->addIndexColumn() ->addColumn('network', function($row) { return $this->getNetworkName($row->dst); }) ->addColumn('setup', function($row) { return $this->getNetworkSetup($row->dst) . ' LE'; }) ->addColumn('minutes', function($row) { $minutes = ceil($row->billsec / 60); $this->totalMinutes += $minutes; $this->totalCalls++; return $minutes; }) ->addColumn('fees', function($row) { return $this->calculateFees($row->dst, $row->billsec) . ' LE'; }) // ->addColumn('taxfees', function($row) { // return $this->calculateFees($row->dst, $row->billsec)[1] . ' LE'; // }) ->addColumn('ring', function($row) { return $row->duration - $row->billsec; }) ->make(true); return $dataTable; } protected function getPrefix($num){ // Strip international format prefix (+2 for Egypt) $num = preg_replace('/^\+2/', '', $num); $num_size = strlen($num); $dst_prefix = '0'; for ($i=0; $i < $num_size-3; $i++) { if(in_array(substr($num,$i,3), ['010', '011', '012', '015'])){ $dst_prefix = substr($num,$i,3); break; }elseif(in_array(substr($num,$i,2), ['02', '03', '04', '05', '06', '07', '08', '09', '15', '16', '19', '17'])){ $dst_prefix = substr($num,$i,2); break; } } $this->prefix = $dst_prefix; return $dst_prefix; } protected function getNetworkName($dst) { $prefix = $this->getPrefix($dst); return $prefix == '0' ? "Not Found" : $this->networksNames[$prefix]; } protected function getNetworkSetup($dst) { $prefix = $this->getPrefix($dst); return $prefix == '0' ? "Not Found" : $this->networksSetup[$prefix]; } protected function calculateFees($dst, $billsec) { $prefix = $this->getPrefix($dst); if ($prefix == '0') { return "Not Found"; } $setup = $this->networksSetup[$prefix]; $minutesExhausted = ceil($billsec / 60); $minfees = $minutesExhausted * $this->networksMinute[$prefix]; $fees = $minfees + $setup; $this->totalCostBefore = $this->totalCostBefore + $fees; $feesWithTax = $fees * (1 + ($this->networksTax[$prefix] / 100)); $this->totalCostAfter = $this->totalCostAfter + $feesWithTax; return round($fees, 2); } }