<?php namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Library\Tool; use App\Models\Reports; use Box\Spout\Common\Exception\InvalidArgumentException; use Box\Spout\Common\Exception\IOException; use Box\Spout\Common\Exception\UnsupportedTypeException; use Box\Spout\Writer\Exception\WriterNotOpenedException; use Exception; use Generator; use Illuminate\Auth\Access\AuthorizationException; use Illuminate\Contracts\Foundation\Application; use Illuminate\Contracts\View\Factory; use Illuminate\Contracts\View\View; use Illuminate\Http\JsonResponse; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use JetBrains\PhpStorm\NoReturn; use Rap2hpoutre\FastExcel\FastExcel; use Symfony\Component\HttpFoundation\BinaryFileResponse; class ReportsController extends Controller { /** * sms reports * * @return Application|Factory|View * @throws AuthorizationException */ public function reports(): Factory|View|Application { $this->authorize('view sms_history'); $breadcrumbs = [ ['link' => url(config('app.admin_path')."/dashboard"), 'name' => __('locale.menu.Dashboard')], ['link' => url(config('app.admin_path')."/dashboard"), 'name' => __('locale.menu.Reports')], ['name' => __('locale.menu.SMS History')], ]; return view('admin.Reports.all_messages', compact('breadcrumbs')); } /** * get all message reports * * @param Request $request * * @throws AuthorizationException */ #[NoReturn] public function searchAllMessages(Request $request) { $this->authorize('view sms_history'); $columns = [ 0 => 'responsive_id', 1 => 'uid', 2 => 'uid', 3 => 'created_at', 4 => 'send_by', 5 => 'sms_type', 6 => 'from', 7 => 'to', 8 => 'cost', 9 => 'status', 10 => 'sending_server_id', 11 => 'user_id', ]; $totalData = Reports::count(); $totalFiltered = $totalData; $limit = $request->input('length'); $start = $request->input('start'); $order = $columns[$request->input('order.0.column')]; $dir = $request->input('order.0.dir'); if (empty($request->input('search.value'))) { $sms_reports = Reports::offset($start) ->limit($limit) ->orderBy($order, $dir) ->get(); } else { $search = $request->input('search.value'); $sms_reports = Reports::whereLike(['uid', 'send_by', 'from', 'to', 'cost', 'status', 'created_at', 'user.first_name', 'user.last_name'], $search) ->offset($start) ->limit($limit) ->orderBy($order, $dir) ->get(); $totalFiltered = Reports::whereLike(['uid', 'send_by', 'from', 'to', 'cost', 'status', 'created_at', 'user.first_name', 'user.last_name'], $search)->count(); } $data = []; if ( ! empty($sms_reports)) { foreach ($sms_reports as $report) { if ($report->created_at == null) { $created_at = null; } else { $created_at = Tool::customerDateTime($report->created_at); } $customer_profile = route('admin.customers.show', $report->user->uid); $customer_name = $report->user->displayName(); $user_id = "<a href='$customer_profile' class='text-primary mr-1'>$customer_name</a>"; $sending_server_url = route('admin.sending-servers.show', $report->sendingServer->uid); $sending_server_name = $report->sendingServer->name; $sending_server = "<a href='$sending_server_url' class='text-primary mr-1'>$sending_server_name</a>"; $nestedData['responsive_id'] = ''; $nestedData['uid'] = $report->uid; $nestedData['avatar'] = route('admin.customers.avatar', $report->user->uid); $nestedData['email'] = $report->user->email; $nestedData['created_at'] = $created_at; $nestedData['user_id'] = $user_id; $nestedData['send_by'] = $report->getSendBy(); $nestedData['sms_type'] = $report->getSMSType(); $nestedData['from'] = $report->from; $nestedData['to'] = $report->to; $nestedData['cost'] = $report->cost; $nestedData['status'] = str_limit($report->status, 20); $nestedData['sending_server_id'] = $sending_server; $data[] = $nestedData; } } $json_data = [ "draw" => intval($request->input('draw')), "recordsTotal" => intval($totalData), "recordsFiltered" => intval($totalFiltered), "data" => $data, ]; echo json_encode($json_data); exit(); } /** * view single reports * * @param Reports $uid * * @return JsonResponse */ public function viewReports(Reports $uid): JsonResponse { return response()->json([ 'status' => 'success', 'data' => $uid, ]); } /** * @param Reports $uid * * @return JsonResponse * @throws Exception|Exception */ public function destroy(Reports $uid): JsonResponse { if (config('app.stage') == 'demo') { return response()->json([ 'status' => 'error', 'message' => 'Sorry! This option is not available in demo mode', ]); } if ( ! $uid->delete()) { return response()->json([ 'status' => 'error', 'message' => __('locale.exceptions.something_went_wrong'), ]); } return response()->json([ 'status' => 'success', 'message' => __('locale.campaigns.sms_was_successfully_deleted'), ]); } /** * bulk sms delete * * @param Request $request * * @return JsonResponse */ public function batchAction(Request $request): JsonResponse { if (config('app.stage') == 'demo') { return response()->json([ 'status' => 'error', 'message' => 'Sorry! This option is not available in demo mode', ]); } $ids = $request->get('ids'); if (Reports::whereIn('uid', $ids)->delete()) { return response()->json([ 'status' => 'success', 'message' => __('locale.campaigns.sms_was_successfully_deleted'), ]); } return response()->json([ 'status' => 'error', 'message' => __('locale.exceptions.something_went_wrong'), ]); } /** * @return Generator */ public function reportsGenerator(): Generator { foreach (Reports::cursor() as $report) { yield $report; } } /** * @param $request * * @return Generator */ public function exportData($request): Generator { $start_date = null; $end_date = null; if ($request->start_date && $request->end_date) { $start_time = $request->start_date.' '.$request->start_time; $start_date = Tool::systemTimeFromString($start_time, config('app.timezone')); $end_time = $request->end_date.' '.$request->end_time; $end_date = Tool::systemTimeFromString($end_time, config('app.timezone')); } $status = $request->status; $direction = $request->direction; $type = $request->type; $to = $request->to; $from = $request->from; if ($status == 'delivered') { $status = 'Delivered'; } $get_data = Reports::query()->when($status, function ($query) use ($status) { $query->whereLike(['status'], $status); })->when($from, function ($query) use ($from) { $query->whereLike(['from'], $from); })->when($to, function ($query) use ($to) { $query->whereLike(['to'], $to); })->when($direction, function ($query) use ($direction) { $query->where('send_by', $direction); })->when($start_date, function ($query) use ($start_date, $end_date) { $query->whereBetween('created_at', [$start_date, $end_date]); })->where('sms_type', $type)->cursor(); foreach ($get_data as $report) { yield $report; } } /** * @param Request $request * * @return RedirectResponse|BinaryFileResponse * @throws AuthorizationException * @throws IOException * @throws InvalidArgumentException * @throws UnsupportedTypeException * @throws WriterNotOpenedException */ public function export(Request $request): BinaryFileResponse|RedirectResponse { if (config('app.stage') == 'demo') { return redirect()->route('admin.reports.index')->with([ 'status' => 'error', 'message' => 'Sorry! This option is not available in demo mode', ]); } $this->authorize('view sms_history'); Tool::resetMaxExecutionTime(); $file_name = (new FastExcel($this->exportData($request)))->export(storage_path('Reports_'.time().'.xlsx')); return response()->download($file_name); } }