Files
backend/app/Http/Controllers/UserActivityController.php
2024-02-01 09:53:53 +00:00

770 lines
29 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Models\User;
use App\Models\Role;
use App\Models\LogList;
use DB;
use Carbon\Carbon;
class UserActivityController extends Controller
{
public $organization_group_ids_list_array = [
62,
98,
99,
100,
101,
102,
];
public $country_group_ids_list_array = [
63,
64,
65,
66,
67,
68,
69,
70,
71,
72,
73,
74,
75,
76,
77,
78,
79,
80,
81,
82,
83,
84,
85,
86,
87,
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
];
public function index()
{
return view('rmto-preview.pages.userActivityReport');
}
public function printGroup(Role $role, Request $request)
{
$request->fromDate = $request->fromDate ? $request->fromDate . " 00:00:00" : Carbon::now()->format('Y-m-d 00:00:00') ;
$request->toDate = $request->toDate ? $request->toDate . " 23:59:59" : Carbon::now()->format('Y-m-d 23:59:59');
$data = [];
$ids_list = '';
$users = $role->users()->select("*")->get()->toArray();
foreach ($users as $index => $item) {
$user_activity_quantity_temp[$item['id']] = [
"majmoe" => 0,
"name" => $item['first_name'] ? $item['first_name']." ".$item['last_name']." (".$item['username'].")" : $item['name']." (".$item['username'].")",
];
$user_activity_time_temp[$item['id']] = [
"majmoe" => 0,
"name" => $item['first_name'] ? $item['first_name']." ".$item['last_name']." (".$item['username'].")" : $item['name']."(".$item['username'].")",
];
$user_activity_top_5_temp[$item['id']] = [
"activity_list" => [],
"name" => $item['first_name'] ? $item['first_name']." ".$item['last_name']." (".$item['username'].")" : $item['name']."(".$item['username'].")",
];
if (!$index) {
$ids_list = $item['id'];
} else {
$ids_list .= ",".$item['id'];
}
}
$total_activity_time_sql = "
SELECT sum(majmoe) AS activity FROM (SELECT *,
COUNT(quantity) AS majmoe
FROM (
SELECT user_id,
COUNT(*) AS quantity
FROM user_activity_logs
WHERE created_at between '{$request->fromDate}' and '{$request->toDate}' and user_id IN(".$ids_list.")
GROUP BY yy,
mm,
dd,
hh,
user_id
) user_activity_by_hour_and_
GROUP BY user_id) AS calculated_table;";
$quantitative_activity_chart_sql = "
SELECT created_at,
COUNT(*) AS quantity
FROM user_activity_logs
WHERE created_at between '{$request->fromDate}' and '{$request->toDate}' and user_id IN(".$ids_list.")
GROUP BY
yy,
mm,
dd ;";
$hourly_activity_chart_sql = "
SELECT
COUNT(quantity) AS majmoe
FROM (
SELECT yy,
mm,
dd,
hh,
COUNT(*) AS quantity
FROM user_activity_logs
WHERE created_at between '{$request->fromDate}' and '{$request->toDate}' and user_id IN(".$ids_list.")
GROUP BY yy,
mm,
dd,
hh,
user_id
) user_activity_by_hour_and_
GROUP BY
yy,
mm,
dd;";
$total_activity_quantity_sql = "
SELECT COUNT(*) AS total_activity_quantity
FROM user_activity_logs
WHERE created_at between '{$request->fromDate}' and '{$request->toDate}' and user_id IN(".$ids_list.")
";
$top_10_activity_list_sql = "
SELECT *,
COUNT(*) AS quantity
FROM (
SELECT
description,
log_unique_code
FROM user_activity_logs
WHERE created_at between '{$request->fromDate}' and '{$request->toDate}' and user_id IN(".$ids_list.")
) user_activity_distinct
GROUP BY
log_unique_code
ORDER BY quantity desc
LIMIT 10";
$user_activity_quantity_sql = "
SELECT *,
COUNT(*) AS quantity
FROM (
SELECT
user_id,
user_first_name,
user_last_name,
user_name,
username
FROM user_activity_logs
WHERE created_at between '{$request->fromDate}' and '{$request->toDate}' and user_id IN(".$ids_list.")
) user_activity_distinct
GROUP BY user_id
ORDER BY quantity desc";
$active_user_count_sql = "
SELECT COUNT(*) AS active_user_count
FROM(
SELECT
user_id
FROM user_activity_logs
WHERE created_at between '{$request->fromDate}' and '{$request->toDate}' and user_id IN(".$ids_list.")
GROUP BY user_id
) grpuped_by_user_id";
$user_activity_time_sql = "
select
*,
COUNT(quantity) AS majmoe
FROM (
SELECT
user_first_name,
user_last_name,
user_name,
username,
user_id,
COUNT(*) AS quantity
FROM user_activity_logs
WHERE created_at between '{$request->fromDate}' and '{$request->toDate}' and user_id IN(".$ids_list.")
GROUP BY yy,
mm,
dd,
hh,
user_id
) user_activity_by_hour_and_
GROUP BY user_id
ORDER BY majmoe desc;";
foreach (DB::select(DB::raw($user_activity_quantity_sql)) as $key => $value) {
$user_activity_quantity_temp[$value->user_id] = [
"majmoe" => $value->quantity ?? 0,
"name" => $value->user_first_name ? $value->user_first_name." ".$value->user_last_name." (".$value->username.")" : $value->user_name." (".$value->username.")",
];
}
foreach (DB::select(DB::raw($user_activity_time_sql)) as $key => $value) {
$user_activity_time_temp[$value->user_id] = [
"majmoe" => $value->majmoe ?? 0,
"name" => $value->user_first_name ? $value->user_first_name." ".$value->user_last_name." (".$value->username.")" : $value->user_name." (".$value->username.")",
];
}
foreach ($user_activity_top_5_temp as $key => $value) {
$user_activity_top_5_temp_sql = "
SELECT
description,
COUNT(*) AS quantity
FROM user_activity_logs
WHERE user_id = {$key} AND created_at between '{$request->fromDate}' and '{$request->toDate}'
GROUP BY log_unique_code
ORDER BY quantity DESC
LIMIT 5
";
$activity_list = DB::select(DB::raw($user_activity_top_5_temp_sql));
$sum = 0;
foreach ($activity_list as $index => $item) {
$sum += (int) $item->quantity;
}
$user_activity_top_5_temp[$key] = [
"sum" => $sum,
"name" => $value['name'],
"activity_list" => $activity_list,
];
}
arsort($user_activity_top_5_temp);
arsort($user_activity_time_temp);
arsort($user_activity_quantity_temp);
$data = [
'fromDate' => $request->fromDate ? $request->fromDate : null,
'toDate' => $request->toDate ? $request->toDate : null,
'user_activity_time' => $ids_list ? $user_activity_time_temp : null,
'hourly_activity_chart' => $ids_list ? DB::select(DB::raw($hourly_activity_chart_sql)): null,
'quantitative_activity_chart' => $ids_list ? DB::select(DB::raw($quantitative_activity_chart_sql)): null,
'total_activity_quantity' => $ids_list ? DB::select(DB::raw($total_activity_quantity_sql))[0]->total_activity_quantity : null,
'total_activity_time' => $ids_list ? DB::select(DB::raw($total_activity_time_sql))[0]->activity : null,
'top_10_activity_list' => $ids_list ? DB::select(DB::raw($top_10_activity_list_sql)) : null,
'user_activity_quantity' => $ids_list ? $user_activity_quantity_temp : null,
'group_name' => $role->name_fa,
'average' => round(($ids_list ? DB::select(DB::raw($total_activity_time_sql))[0]->activity : 0) / count($users), 2) ,
'user_activity_top_5_temp' => $user_activity_top_5_temp,
'total_user_count' => count($users),
'active_user_count' => $ids_list ? DB::select(DB::raw($active_user_count_sql))[0]->active_user_count : null,
'group_id' => $role->id
];
return View('word.user-activity', compact('data'));
}
public function showUsers(Role $role)
{
return response()->json([
'status' => 'succeed',
'message' => '',
'data' => $role->users()->get(),
], 200);
}
public function addGroup(Request $request)
{
if (Role::where("name_fa", $request->group_name)->first()) {
return response()->json([
'status' => 'error',
'message' => 'این گروه وجود دارد.',
], 400);
}
$temp_name = "for_report_".time();
Role::create(['name_fa' => $request->group_name, "for_report" => 1,'name' => $temp_name]);
foreach (explode(',', $request->users) as $key => $value) {
if ($user = User::find($value)) {
$user->assignRole($temp_name);
}
}
return response()->json([
'status' => 'succeed',
'message' => '',
'data' => [],
], 200);
}
public function editGroup(Role $role, Request $request)
{
$role->name_fa = $request->group_name;
$role->save();
foreach ($role->users()->get() as $user) {
$user->removeRole($role);
}
foreach (explode(',', $request->users) as $key => $value) {
if ($user = User::find($value)) {
$user->assignRole($role);
}
}
return response()->json([
'status' => 'succeed',
'message' => '',
'data' => [],
], 200);
}
public function logList()
{
return response()->json([
'status' => 'succeed',
'message' => '',
'data' => LogList::where("is_done", 1)->get(),
], 200);
}
public function indexShow(Request $request)
{
$request->fromDate = $request->fromDate ? $request->fromDate . " 00:00:00" : Carbon::now()->format('Y-m-d 00:00:00') ;
$request->toDate = $request->toDate ? $request->toDate . " 23:59:59" : Carbon::now()->format('Y-m-d 23:59:59');
$roles_must_show_report = Role::where("for_report", 1)->get();
$data = [];
$users_activity = [];
foreach ($roles_must_show_report as $key => $value) {
$ids_list = '';
$users = $value->users()->select("id")->get()->toArray();
foreach ($users as $index => $item) {
if (!$index) {
$ids_list = $item['id'];
} else {
$ids_list .= ",".$item['id'];
}
}
$temp_sql = "
SELECT sum(majmoe) AS activity FROM (SELECT *,
COUNT(quantity) AS majmoe
FROM (
SELECT *,
COUNT(*) AS quantity
FROM user_activity_logs
WHERE (created_at between '{$request->fromDate}' and '{$request->toDate}') and user_id IN(".$ids_list.")
GROUP BY yy,
mm,
dd,
hh,
user_id
) user_activity_by_hour_and_
GROUP BY user_id) AS calculated_table;";
$activity = DB::select(DB::raw($temp_sql))[0]->activity;
$users_activity[] = [
'activity_time' => $ids_list ? $activity : null,
'average' => round(($ids_list ? $activity : 0) / count($users), 2) ,
'group_name' => $value->name_fa,
'user_count' => count($users),
'is_static' => 0,
'group_id' => $value->id
];
}
$country_group_ids_list = "";
$country_group_user_quantity = 0;
foreach (Role::whereIn('id', $this->country_group_ids_list_array)->get() as $key => $value) {
$users = $value->users()->select("id")->get();
$country_group_user_quantity += count($users);
foreach ($users as $index => $item) {
if (!$key) {
$country_group_ids_list = $item->id;
} else {
$country_group_ids_list .= ",".$item->id;
}
}
}
$country_temp_sql = "
SELECT sum(majmoe) AS activity FROM (SELECT *,
COUNT(quantity) AS majmoe
FROM (
SELECT *,
COUNT(*) AS quantity
FROM user_activity_logs
WHERE (created_at between '{$request->fromDate}' and '{$request->toDate}') and user_id IN(".$country_group_ids_list.")
GROUP BY yy,
mm,
dd,
hh,
user_id
) user_activity_by_hour_and_
GROUP BY user_id) AS calculated_table;";
$users_activity[] = [
'activity_time' => $country_group_ids_list ? DB::select(DB::raw($country_temp_sql))[0]->activity : null,
'average' => round(($country_group_ids_list ? DB::select(DB::raw($country_temp_sql))[0]->activity : 0) / $country_group_user_quantity, 2) ,
'group_name' => 'کشوری',
'user_count' => $country_group_user_quantity,
'is_static' => 1,
'group_id' => 3,
];
$organization_group_ids_list = "";
$organization_group_user_quantity = 0;
foreach (Role::whereIn('id', $this->organization_group_ids_list_array)->get() as $key => $value) {
$users = $value->users()->select("id")->get();
$organization_group_user_quantity += count($users);
foreach ($users as $index => $item) {
if (!$key) {
$organization_group_ids_list = $item->id;
} else {
$organization_group_ids_list .= ",".$item->id;
}
}
}
$organization_temp_sql = "
SELECT sum(majmoe) AS activity FROM (SELECT *,
COUNT(quantity) AS majmoe
FROM (
SELECT *,
COUNT(*) AS quantity
FROM user_activity_logs
WHERE (created_at between '{$request->fromDate}' and '{$request->toDate}') and user_id IN(".$organization_group_ids_list.")
GROUP BY yy,
mm,
dd,
hh,
user_id
) user_activity_by_hour_and_
GROUP BY user_id) AS calculated_table;";
$users_activity[] = [
'activity_time' => $organization_group_ids_list ? DB::select(DB::raw($organization_temp_sql))[0]->activity : null,
'average' => round(($organization_group_ids_list ? DB::select(DB::raw($organization_temp_sql))[0]->activity : 0) / $organization_group_user_quantity, 2) ,
'group_name' => 'سازمانی',
'user_count' => $organization_group_user_quantity,
'is_static' => 2,
'group_id' => 3,
];
return response()->json([
'status' => 'succeed',
'message' => '',
'data' => $users_activity,
], 200);
}
public function deleteGroup(Role $role)
{
$users = User::whereHas("roles", function ($query) use ($role) {
$query->where("id", $role->id);
})->get();
foreach ($users as $key => $value) {
$value->roles()->detach($role);
$value->load('roles');
$value->forgetCachedPermissions();
}
$role->delete();
}
public function roadItemProjectReport(Request $request)
{
Auth::User()->addActivity("این کاربر وارد قسمت گزارش فعالیت در صفحه فعالیت های جاری روزانه شده است.");
}
public function userActivityLogs(User $user)
{
return response()->json([
'status' => 'succeed',
'message' => '',
'data' => $user->activityLogs,
], 200);
}
public function staticPrintCountryChart(Request $request)
{
$request->fromDate = $request->fromDate ? $request->fromDate . " 00:00:00" : Carbon::now()->format('Y-m-d 00:00:00') ;
$request->toDate = $request->toDate ? $request->toDate . " 23:59:59" : Carbon::now()->format('Y-m-d 23:59:59');
$data = [];
$total_ids_list = ''; // یوزرهای کل این سوپر گروه
foreach ($this->country_group_ids_list_array as $key => $value) {
$role = Role::find($value);
$ids_list = ''; // یوزر های این گروه
$users = $role->users()->select("id")->get()->toArray();
foreach ($users as $index => $item) {
if (!$index) {
$ids_list = $item['id'];
} else {
$ids_list .= ",".$item['id'];
}
}
if (!$key) {
$total_ids_list = $ids_list;
} else {
$total_ids_list .= ",".$ids_list;
}
// تعداد کل فعالیت ها برای هر گروه این سوپر گروه
$quantitative_activity_chart_sql = "
SELECT
COUNT(*) AS quantity
FROM user_activity_logs
WHERE created_at between '{$request->fromDate}' and '{$request->toDate}' and user_id IN(".$ids_list.")
GROUP BY
yy,
mm,
dd ;";
// تعدا کل ساعت های برای هر گروه این سوپر گروه
$hourly_activity_chart_sql = "
SELECT
COUNT(quantity) AS majmoe
FROM (
SELECT *,
COUNT(*) AS quantity
FROM user_activity_logs
WHERE created_at between '{$request->fromDate}' and '{$request->toDate}' and user_id IN(".$ids_list.")
GROUP BY yy,
mm,
dd,
hh,
user_id
) user_activity_by_hour_and_
GROUP BY
yy,
mm,
dd;";
$data['labels'][] = $role->name_fa;
$data['hourly_activity_chart'][] = isset(DB::select(DB::raw($hourly_activity_chart_sql))[0]->majmoe) ? DB::select(DB::raw($hourly_activity_chart_sql))[0]->majmoe: 0;
$data['quantitative_activity_chart'][] = isset(DB::select(DB::raw($quantitative_activity_chart_sql))[0]->quantity) ? DB::select(DB::raw($quantitative_activity_chart_sql))[0]->quantity: 0;
}
$total_activity_quantity_sql = "
SELECT COUNT(*) AS total_activity_quantity
FROM user_activity_logs
WHERE created_at between '{$request->fromDate}' and '{$request->toDate}' and user_id IN(".$total_ids_list.")
";
$data['total_activity_quantity'] = $total_ids_list ? DB::select(DB::raw($total_activity_quantity_sql))[0]->total_activity_quantity : null;
$data['total_user_count'] = count(explode(',', $total_ids_list));
$active_user_count_sql = "
SELECT COUNT(*) AS active_user_count
FROM(
SELECT
user_id
FROM user_activity_logs
WHERE created_at between '{$request->fromDate}' and '{$request->toDate}' and user_id IN(".$total_ids_list.")
GROUP BY user_id
) grpuped_by_user_id";
$data['active_user_count'] = $total_ids_list ? DB::select(DB::raw($active_user_count_sql))[0]->active_user_count : null;
$total_activity_time_sql = "
SELECT sum(majmoe) AS activity FROM (SELECT *,
COUNT(quantity) AS majmoe
FROM (
SELECT *,
COUNT(*) AS quantity
FROM user_activity_logs
WHERE created_at between '{$request->fromDate}' and '{$request->toDate}' and user_id IN(".$total_ids_list.")
GROUP BY yy,
mm,
dd,
hh,
user_id
) user_activity_by_hour_and_
GROUP BY user_id) AS calculated_table;";
$data['total_activity_time'] = $total_ids_list ? DB::select(DB::raw($total_activity_time_sql))[0]->activity : null;
$data['average'] = round(($total_ids_list ? DB::select(DB::raw($total_activity_time_sql))[0]->activity : 0) / count(explode(',', $total_ids_list)), 2);
$top_10_activity_list_sql = "
SELECT *,
COUNT(*) AS quantity
FROM (
SELECT
description,
log_unique_code
FROM user_activity_logs
WHERE created_at between '{$request->fromDate}' and '{$request->toDate}' and user_id IN(".$total_ids_list.")
) user_activity_distinct
GROUP BY
log_unique_code
ORDER BY quantity desc
LIMIT 10";
$data['top_10_activity_list'] = $total_ids_list ? DB::select(DB::raw($top_10_activity_list_sql)) : null;
$data['fromDate'] = $request->fromDate ? $request->fromDate : null;
$data['toDate'] = $request->toDate ? $request->toDate : null;
$data['group_name'] = 'کشوری';
return View('word.static-print-country-chart', compact('data'));
}
public function staticPrintOrganizationChart(Request $request)
{
$request->fromDate = $request->fromDate ? $request->fromDate . " 00:00:00" : Carbon::now()->format('Y-m-d 00:00:00') ;
$request->toDate = $request->toDate ? $request->toDate . " 23:59:59" : Carbon::now()->format('Y-m-d 23:59:59');
$data = [];
$total_ids_list = ''; // یوزرهای کل این سوپر گروه
foreach ($this->organization_group_ids_list_array as $key => $value) {
$role = Role::find($value);
$ids_list = ''; // یوزر های این گروه
$users = $role->users()->select("id")->get()->toArray();
foreach ($users as $index => $item) {
if (!$index) {
$ids_list = $item['id'];
} else {
$ids_list .= ",".$item['id'];
}
}
if (!$key) {
$total_ids_list = $ids_list;
} else {
$total_ids_list .= ",".$ids_list;
}
// تعداد کل فعالیت ها برای هر گروه این سوپر گروه
$quantitative_activity_chart_sql = "
SELECT
COUNT(*) AS quantity
FROM user_activity_logs
WHERE created_at between '{$request->fromDate}' and '{$request->toDate}' and user_id IN(".$ids_list.")
GROUP BY
yy,
mm,
dd ;";
// تعدا کل ساعت های برای هر گروه این سوپر گروه
$hourly_activity_chart_sql = "
SELECT
COUNT(quantity) AS majmoe
FROM (
SELECT *,
COUNT(*) AS quantity
FROM user_activity_logs
WHERE created_at between '{$request->fromDate}' and '{$request->toDate}' and user_id IN(".$ids_list.")
GROUP BY yy,
mm,
dd,
hh,
user_id
) user_activity_by_hour_and_
GROUP BY
yy,
mm,
dd;";
$data['labels'][] = $role->name_fa;
$data['hourly_activity_chart'][] = isset(DB::select(DB::raw($hourly_activity_chart_sql))[0]->majmoe) ? DB::select(DB::raw($hourly_activity_chart_sql))[0]->majmoe: 0;
$data['quantitative_activity_chart'][] = isset(DB::select(DB::raw($quantitative_activity_chart_sql))[0]->quantity) ? DB::select(DB::raw($quantitative_activity_chart_sql))[0]->quantity: 0;
}
$total_activity_quantity_sql = "
SELECT COUNT(*) AS total_activity_quantity
FROM user_activity_logs
WHERE created_at between '{$request->fromDate}' and '{$request->toDate}' and user_id IN(".$total_ids_list.")
";
$data['total_activity_quantity'] = $total_ids_list ? DB::select(DB::raw($total_activity_quantity_sql))[0]->total_activity_quantity : null;
$data['total_user_count'] = count(explode(',', $total_ids_list));
$active_user_count_sql = "
SELECT COUNT(*) AS active_user_count
FROM(
SELECT
user_id
FROM user_activity_logs
WHERE created_at between '{$request->fromDate}' and '{$request->toDate}' and user_id IN(".$total_ids_list.")
GROUP BY user_id
) grpuped_by_user_id";
$data['active_user_count'] = $total_ids_list ? DB::select(DB::raw($active_user_count_sql))[0]->active_user_count : null;
$total_activity_time_sql = "
SELECT sum(majmoe) AS activity FROM (SELECT *,
COUNT(quantity) AS majmoe
FROM (
SELECT *,
COUNT(*) AS quantity
FROM user_activity_logs
WHERE created_at between '{$request->fromDate}' and '{$request->toDate}' and user_id IN(".$total_ids_list.")
GROUP BY yy,
mm,
dd,
hh,
user_id
) user_activity_by_hour_and_
GROUP BY user_id) AS calculated_table;";
$data['total_activity_time'] = $total_ids_list ? DB::select(DB::raw($total_activity_time_sql))[0]->activity : null;
$data['average'] = round(($total_ids_list ? DB::select(DB::raw($total_activity_time_sql))[0]->activity : 0) / count(explode(',', $total_ids_list)), 2);
$top_10_activity_list_sql = "
SELECT *,
COUNT(*) AS quantity
FROM (
SELECT
description,
log_unique_code
FROM user_activity_logs
WHERE created_at between '{$request->fromDate}' and '{$request->toDate}' and user_id IN(".$total_ids_list.")
) user_activity_distinct
GROUP BY
log_unique_code
ORDER BY quantity desc
LIMIT 10";
$data['top_10_activity_list'] = $total_ids_list ? DB::select(DB::raw($top_10_activity_list_sql)) : null;
$data['fromDate'] = $request->fromDate ? $request->fromDate : null;
$data['toDate'] = $request->toDate ? $request->toDate : null;
$data['group_name'] = 'سازمان';
return View('word.static-print-organization-chart', compact('data'));
}
}