550 lines
20 KiB
PHP
Executable File
550 lines
20 KiB
PHP
Executable File
<?php
|
|
|
|
use Illuminate\Console\View\Components\Task;
|
|
use Illuminate\Support\Facades\Route;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Response;
|
|
use App\Models\Attendance;
|
|
use App\Models\ai;
|
|
use Illuminate\Support\Facades\Http;
|
|
use Illuminate\Support\Facades\Cookie;
|
|
use Illuminate\Support\Facades\Redis;
|
|
use Illuminate\Support\Carbon;
|
|
use Morilog\Jalali\Jalalian;
|
|
use App\Models\User;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Morilog\Jalali\CalendarUtils;
|
|
use App\Models\AttendanceBreak;
|
|
use GuzzleHttp\Client;
|
|
use App\Models\Tasks;
|
|
|
|
function send_tel($user, $data, $status)
|
|
{
|
|
if ($status == 'attendance') {
|
|
// dd('hi');
|
|
$enter = Carbon::parse($data->entered_at)->format('H:i');
|
|
$date = Jalalian::fromCarbon(Carbon::parse($data->entered_at))->format('Y/m/d');
|
|
$exit = $data->exited_at ? Carbon::parse($data->exited_at)->format('H:i') : null;
|
|
// $user = json_decode($user);
|
|
$message = "تاریخ: {$date}\n {$user} در ساعت ";
|
|
if (!$exit) {
|
|
$message .= "{$enter} وارد شد.";
|
|
} else {
|
|
$message .= "{$exit} خارج شد.";
|
|
}
|
|
}
|
|
|
|
if ($status == 'break') {
|
|
$date = Jalalian::fromCarbon(Carbon::parse($data->break_start))->format('Y/m/d');
|
|
$start = Carbon::parse($data->break_start)->format('H:i');
|
|
$end = Carbon::parse($data->break_end)->format('H:i');
|
|
if (!$data->break_end)
|
|
$message = "تاریخ: {$date}\n {$user} در ساعت {$start} شروع به استراحت کرد.";
|
|
else
|
|
$message = "تاریخ: {$date}\n {$user} در ساعت {$end} به استراحت پایان داد.";
|
|
}
|
|
|
|
if ($status == 'request') {
|
|
$message = "{$user} درخواست {$data} ثبت کرد.";
|
|
}
|
|
$admins = User::where('is_admin', '1')->whereNotNull('chatid')->select('chatid', 'user_name')->get();
|
|
foreach ($admins as $admin) {
|
|
if (!$admin->chatid) continue;
|
|
// dd($admin->chatid);
|
|
Http::get("https://api.wwwapp.ir/telegran_send.php", [
|
|
'botToken' => "7467099619:AAF2V6yYcbAb8oSIRSCyH5i2GKfdWVO3a7k",
|
|
'chatId' => $admin->chatid,
|
|
'message' => $message,
|
|
]);
|
|
|
|
}
|
|
}
|
|
|
|
Route::prefix('admin')->middleware('admin')->group(function () {
|
|
|
|
|
|
require __DIR__ . '/admin.php';
|
|
});
|
|
|
|
|
|
Route::get('/', function () {
|
|
// dd($_SERVER);
|
|
// dd($_COOKIE);
|
|
|
|
if (isset($_COOKIE['user_identity'])) {
|
|
return view('attendance.index');
|
|
} else {
|
|
foreach (request()->cookies as $name => $value) {
|
|
Cookie::queue(Cookie::forget($name));
|
|
}
|
|
|
|
// در صورت نیاز session رو هم خالی کن
|
|
session()->flush();
|
|
}
|
|
return view('attendance.login');
|
|
});
|
|
|
|
Route::post('/back', function () {
|
|
if (isset($_COOKIE['token-0'])) {
|
|
setcookie("user_identity", $_COOKIE['token-0'], time() + (60 * 60 * 24 * 365), '/');
|
|
Cookie::queue(Cookie::forget('token-0'));
|
|
}
|
|
// if (request()->path() == '/')
|
|
return redirect(route('admin.dashboard'));
|
|
// return redirect()->back();
|
|
});
|
|
|
|
Route::get('/ai', function () {
|
|
|
|
$response = Http::withHeaders([
|
|
'Authorization' => 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjA2OWZlZGJiLTk2ZDctNGU4MC1iMDA0LWFmZDZjMmU4YmZkZiIsImxhc3RfcGFzc3dvcmRfY2hhbmdlIjoxNzUwNjYwODczLCJleHAiOjE3NTQ3NTcxMDR9.qAQF8XDOU8NRz5vSiFlQfnrj8dhGhJ5uvJqjblQWmr8',
|
|
'Cookie' => 'x-ap=eu-central-1; acw_tc=0a03e56c17521661095906021e3cacb270c127c80eb3a20489a465ab4beae1',
|
|
])->post('https://chat.qwen.ai/api/v2/chat/completions?chat_id=7ce2a60a-2b40-4ae8-8536-0cd346642de3', [
|
|
'stream' => false,
|
|
'incremental_output' => true,
|
|
'chat_id' => '7ce2a60a-2b40-4ae8-8536-0cd346642de3',
|
|
'chat_mode' => 'normal',
|
|
'model' => 'qwen3-235b-a22b',
|
|
'messages' => [
|
|
[
|
|
'role' => 'user',
|
|
'content' => 'یه جمله انگیزشی بده که خاص، کوبنده و غیرکلیشهای باشه. نه مثل بقیه.',
|
|
'user_action' => 'chat',
|
|
'files' => [],
|
|
'timestamp' => 1752165316,
|
|
'models' => ['qwen3-235b-a22b'],
|
|
'chat_type' => 't2t',
|
|
'feature_config' => [
|
|
'thinking_enabled' => false,
|
|
'output_schema' => 'phase'
|
|
],
|
|
'extra' => [
|
|
'meta' => [
|
|
'subChatType' => 't2t'
|
|
]
|
|
],
|
|
'sub_chat_type' => 't2t',
|
|
'parent_id' => 'df0a0c91-53d5-4a04-b5da-b8ac53d6d821'
|
|
]
|
|
],
|
|
'timestamp' => 1752165316
|
|
]);
|
|
// Get the response
|
|
$responseData = $response->json();
|
|
$content = $responseData['data']['choices'][0]['message']['content'];
|
|
$ai = new ai(); // Or use your correct namespace
|
|
$ai->key = 'angizeh'; // Assuming you fixed 'kay' to 'key' in migration
|
|
$ai->prompt = 'فقط یک جمله کوتاه انگیزشی بگو';
|
|
$ai->response = $content;
|
|
$ai->save();
|
|
|
|
dd($ai);
|
|
});
|
|
|
|
Route::get('/tasks', function () {
|
|
|
|
// $client = new Client();
|
|
//
|
|
// $response = $client->get('https://api.plane.so/api/v1/workspaces/montzar/projects/c1df4085-582f-4b57-b3c6-95b7d4d19007/issues/', [
|
|
// 'headers' => [
|
|
// 'X-API-Key' => 'plane_api_ec378e977ceb4bd1bbd2332855370645',
|
|
// 'Accept' => 'application/json'
|
|
// ],
|
|
// 'query' => [
|
|
// "filters" => "%7B%22assignee_id__in%22:%227730f957-3448-4b8c-bc16-a87fc2f2e4ae%22%7D"
|
|
// 'expand' => 'assignees'
|
|
// 'assignees' => 'c6a7f605-3088-4400-86dc-7b0702f896a7'
|
|
// ]
|
|
// ]);
|
|
|
|
// $data = json_decode($response->getBody(), true);
|
|
//end of api
|
|
|
|
//get users
|
|
// $users = User::all();
|
|
//save in tasks table
|
|
// foreach ($data['results'] as $a)
|
|
// dd(gettype($a['assignees']));
|
|
|
|
// foreach ($data['results'] as $d) {
|
|
// try {
|
|
// $task = new Tasks();
|
|
// $task->task_id = $d['id'];
|
|
// $task->name = $d['name'];
|
|
// $task->description = $d['description'] ?? null;
|
|
// $task->workspace_slug = "montzar";
|
|
// $task->assignees = json_encode($d['assignees']) ?? null;
|
|
// $task->start_date = $d['start_date'] ?? null;
|
|
// $task->target_date = $d['target_date'] ?? null;
|
|
// $task->priority = $d['priority'];
|
|
// $task->description_html = $d['description_html'] ?? null;
|
|
// $task->completed_at = $d['completed_at'] ?? null;
|
|
// $task->project = $d['project'];
|
|
// $task->workspace = $d['workspace'];
|
|
// $task->state = $d['state'] ?? null;
|
|
// $task->json = json_encode($d);
|
|
// $task->created_at = $d['created_at'];
|
|
// $task->updated_at = $d['updated_at'];
|
|
// $task->deleted_at = $d['deleted_at'] ?? null;
|
|
// $task->created_by = $d['created_by'];
|
|
// $task->updated_by = $d['updated_by'];
|
|
// $task->deleted_by = $d['deleted_by'] ?? null;
|
|
// $task->save();
|
|
|
|
// // فرض کردیم جدول واسط task_user باشه و ستونهاش task_id و user_id
|
|
// $assigns = $d['assignees'];
|
|
// foreach ($users as $user) {
|
|
// if (in_array($user->plain_id, $assigns))
|
|
// DB::table('pivot_tasks')->insertOrIgnore([
|
|
// 'task_id' => $d['id'], // یا $task->task_id اگر این همون PK هست
|
|
// 'user_id' => $user->plain_id
|
|
// ]);
|
|
// }
|
|
|
|
|
|
// }catch (\Exception $e){
|
|
// dd($e);
|
|
// }
|
|
// }
|
|
$user = User::where('user_name', $_COOKIE['user_identity'])->first();
|
|
$tasks = $user->tasks;
|
|
|
|
return view('tasks.tasks')->with('tasks', $tasks);
|
|
});
|
|
|
|
Route::any('/pplain', function (Request $request) {
|
|
$d = $request->all();
|
|
|
|
// فقط وقتی تغییر state هست
|
|
$msg = "Event: {$d['event']}\nAction: {$d['action']}\nName: {$d['data']['name']}\nNew Status: {$d['data']['state']['name']}";
|
|
|
|
// ارسال به تلگرام
|
|
Http::get("https://api.wwwapp.ir/telegran_send.php", [
|
|
'botToken' => "7467099619:AAF2V6yYcbAb8oSIRSCyH5i2GKfdWVO3a7k",
|
|
'chatId' => "-4742642674",
|
|
'message' => $msg,
|
|
]);
|
|
|
|
// // ثبت در دیتابیس
|
|
// DB::table('tst')->insert([
|
|
// 'data' => json_encode($d, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE),
|
|
// ]);
|
|
|
|
|
|
return response()->json(['status' => 'ok'], 200);
|
|
});
|
|
|
|
Route::get('attendance/login', function () {
|
|
|
|
if (!empty($_COOKIE['user_identity'])) {
|
|
$user = User::select('name', 'is_admin')
|
|
->where('user_name', $_COOKIE['user_identity'])
|
|
->first();
|
|
} else {
|
|
$user = User::where('number', $_GET['phone'])
|
|
->where('password', $_GET['password'])
|
|
->orwhere('number', $_GET['phone'])
|
|
->where('email', $_GET['password'])
|
|
->first();
|
|
// dd($user);
|
|
}
|
|
|
|
if (!empty($user)) {
|
|
setcookie('user_identity', $user->user_name ?? $user->id, time() + (60 * 60 * 24 * 365 * 5), "/");
|
|
|
|
$admin = $user->is_admin == 1 ? true : false;
|
|
if ($admin)
|
|
setcookie('ad', '1', time() + (60 * 60 * 24 * 365 * 5), "/");
|
|
return redirect(url(''))->with(['message', [
|
|
'color' => '#00c300ff',
|
|
"text" => 'ورود موفق'],
|
|
'admin' => $admin,
|
|
|
|
]);
|
|
}
|
|
|
|
return redirect(url(''))->with('message', [
|
|
'color' => '#e60000ff',
|
|
"text" => 'کاربر وجود ندارد،
|
|
با پشتیبانی تماس بگیرید.'
|
|
]);
|
|
});
|
|
|
|
Route::get('attendance/logMeOut', function () {
|
|
foreach (request()->cookies as $name => $value) {
|
|
Cookie::queue(Cookie::forget($name));
|
|
}
|
|
session()->flush();
|
|
|
|
// setcookie('user_identity', "", time() - (86400 * 30000), "/");
|
|
// setcookie('ad', "", time() - (86400 * 30000), "/");
|
|
// setcookie('token-0', "", time() - (86400 * 30000), "/");
|
|
return redirect(url(''))->with('message', [
|
|
'color' => '#00bfffff',
|
|
"text" => 'با موفقیت خارج شدید.👋🏻'
|
|
]);;
|
|
});
|
|
|
|
Route::post('attendance/enter', function (Request $request) {
|
|
|
|
|
|
$user_identity = $_COOKIE['user_identity'];
|
|
setcookie('user_identity', $user_identity, time() + (60 * 60 * 24 * 365 * 5), "/");
|
|
$userLat = $request->input('latitude');
|
|
$userLng = $request->input('longitude');
|
|
$officeLat = 32.6504751;
|
|
$officeLng = 51.6936045;
|
|
|
|
if (!$userLat || !$userLng) {
|
|
return response()->json(['error' => 'مختصات دریافت نشد.'], 422);
|
|
}
|
|
$user = User::where('user_name', $user_identity)->select('name')->first();
|
|
$attendance = Attendance::where('user_identity', $user_identity)
|
|
->whereNull('exited_at')
|
|
->latest('entered_at')
|
|
->where('requested', null)
|
|
->first();
|
|
if ($attendance) {
|
|
$break = AttendanceBreak::where('attendance_id', $attendance->id)->sum('duration');
|
|
$duration = $attendance->duration($attendance->created_at, $attendance->exited_at);
|
|
if ($break) {
|
|
$breakSec = strtotime("1970-01-01 " . $break) - strtotime("1970-01-01 00:00:00");
|
|
$durationSec = strtotime("1970-01-01 " . $duration) - strtotime("1970-01-01 00:00:00");
|
|
$durationSec -= $breakSec;
|
|
$duration = gmdate("H:i:s", $durationSec);
|
|
}
|
|
|
|
// $hours = floor($durationSec / 3600);
|
|
// $minutes = floor(($durationSec % 3600) / 60);
|
|
// $seconds = $durationSec % 60;
|
|
// $duration = sprintf("%02d:%02d:%02d", $hours, $minutes, $seconds);
|
|
|
|
$attendance->exited_at = Carbon::now()->format('Y-m-d H:i:s');
|
|
$attendance->exit_location = ['lat' => $userLat, 'lng' => $userLng];
|
|
$attendance->ip_exit = $userLng;
|
|
$attendance->distance_exit = $request->input('distance');
|
|
$attendance->duration = $duration;
|
|
// $attendance->duration = Carbon::parse($attendance->entered_at)->diff(Carbon::parse($attendance->exited_at))->format('%H:%I:%S');
|
|
// dd($attendance);
|
|
$attendance->save();
|
|
$status = 'attendance';
|
|
send_tel($user->name, $attendance, $status);
|
|
|
|
return redirect()->back()->with('message', [
|
|
'color' => '#3b82f6',
|
|
'text' => 'خروج با موفقیت ثبت شد.',
|
|
]);
|
|
} else {
|
|
$attendance = new Attendance();
|
|
$attendance->user_id = 0;
|
|
$attendance->user_identity = $user_identity ?? '';
|
|
$attendance->distance = $request->input('distance');
|
|
$attendance->ip_address = $request->ip();
|
|
$attendance->entered_at = now();
|
|
$attendance->entry_location = ['lat' => $userLat, 'lng' => $userLng];
|
|
$attendance->office_location = ['lat' => $officeLat, 'lng' => $officeLng];
|
|
$attendance->save();
|
|
$status = 'attendance';
|
|
send_tel($user->name, $attendance, $status);
|
|
|
|
return redirect()->back()->with('message', [
|
|
'color' => '#22c55e',
|
|
'text' => 'ورود با موفقیت ثبت شد.',
|
|
]);
|
|
}
|
|
});
|
|
|
|
Route::post('attendance/break', function (Request $request) {
|
|
// dd($request);
|
|
$start_time = $request->start_time;
|
|
$end_time = $request->end_time;
|
|
|
|
$hours = floor($request->duration_seconds / 3600);
|
|
$minutes = floor(($request->duration_seconds % 3600) / 60);
|
|
$seconds = $request->duration_seconds % 60;
|
|
$duration = sprintf("%02d:%02d:%02d", $hours, $minutes, $seconds);
|
|
// dd($duration);
|
|
$user = User::where('user_name', $_COOKIE['user_identity'])->select('name')->first();
|
|
$attendance = Attendance::where('user_identity', $_COOKIE['user_identity'])
|
|
->whereNull('exited_at')->latest('entered_at')->first();
|
|
$break = AttendanceBreak::where('attendance_id', $attendance->id)->wherenull('break_end')->first();
|
|
if (!$break) {
|
|
$break = new AttendanceBreak();
|
|
}
|
|
$break->attendance_id = $attendance->id;
|
|
$break->break_start = $start_time;
|
|
$break->break_end = $end_time ?? null;
|
|
$break->duration = $duration ?? null;
|
|
$break->save();
|
|
$status = 'break';
|
|
send_tel($user->name, $break, $status);
|
|
return redirect()->back()->with('message', [
|
|
'color' => '#00c300ff',
|
|
'text' => 'خسته نباشید ☺️'
|
|
]);
|
|
|
|
|
|
// dd($start_time, $end_time, $duration, Carbon::now());
|
|
|
|
|
|
})->name('attendance.break');
|
|
|
|
Route::post('attendance/edit', function (Request $request) {
|
|
// dd($request->all());
|
|
$userid = $request->input('uname');
|
|
// dd($userid);
|
|
$id = $request->id;
|
|
$newenter = $request->starttime;
|
|
$newexit = $request->endtime;
|
|
$date = $request->date;
|
|
$user = User::where('user_name', $userid)->select('name')->first();
|
|
if ($id == "new") {
|
|
$date = \Morilog\Jalali\CalendarUtils::convertNumbers($date, true);
|
|
$date = \Morilog\Jalali\CalendarUtils::createCarbonFromFormat('Y-m-d', $date)->format('Y-m-d');
|
|
// dd($date);
|
|
$req = [
|
|
'function' => 'new',
|
|
'userid' => $userid,
|
|
'id' => $id,
|
|
'oldenter' => $newenter ? $date . ' ' . $newenter : '',
|
|
'newenter' => '',
|
|
'oldexit' => $newexit ? $date . ' ' . $newexit : '',
|
|
'newexit' => '',
|
|
];
|
|
// dd($req);
|
|
Redis::connection()->set("att-tempreq:{$userid}:{$id}", json_encode($req));
|
|
$status = 'request';
|
|
$d = "ایجاد روز کاری";
|
|
send_tel($user->name, $d, $status);
|
|
return redirect('/')->with('message', [
|
|
'color' => '#00c300ff',
|
|
"text" => 'درخواست شما به ادمین ارسال شد.'
|
|
]);
|
|
} elseif (isset($id)) {
|
|
$att = Attendance::find($id);
|
|
// select('entered_at', 'exited_at','requested')
|
|
$oldenter = $att->entered_at;
|
|
$oldexit = $att->exited_at;
|
|
$now = Carbon::now()->format('H:i');
|
|
// dd($oldenter,$newenter,$oldexit,$newexit,$now,$id);
|
|
// $date = Jalalian::fromCarbon(Carbon::parse($request->entered_at))->format('Y/m/d');
|
|
if (($oldenter != $newenter || $oldexit != $newexit) && (!$newexit || $newexit > $newenter)) {
|
|
$request = [
|
|
'function' => 'edit',
|
|
'userid' => $userid,
|
|
'id' => $id,
|
|
'oldenter' => Carbon::parse($oldenter)->format('H:i'),
|
|
'newenter' => Carbon::parse($newenter)->format('H:i'),
|
|
'oldexit' => $oldexit,
|
|
'newexit' => $newexit,
|
|
];
|
|
Redis::connection()->set("att-tempreq:{$userid}:{$id}", json_encode($request));
|
|
$att->requested = 'true';
|
|
$att->save();
|
|
$status = 'request';
|
|
$d = "تغییر ساعت کاری";
|
|
send_tel($user->name, $d, $status);
|
|
return redirect('/')->with('message', [
|
|
'color' => '#00c300ff',
|
|
"text" => 'درخواست شما به ادمین ارسال شد.'
|
|
]);
|
|
} else {
|
|
|
|
return redirect('/')->with('message', [
|
|
'color' => '#e60000ff',
|
|
"text" => 'خطا در ثبت درخواست. لطفا زمان را بررسی کنید.'
|
|
]);
|
|
}
|
|
}
|
|
return redirect('/')->with('message', [
|
|
'color' => '#e60000ff',
|
|
"text" => 'لطفا اطلاعات ورودی را بررسی کنید.'
|
|
]);
|
|
})->name('edit');
|
|
|
|
Route::post('attendance/delete', function (Request $request) {
|
|
// dd($request);
|
|
$id = $request->id;
|
|
$attendance = Attendance::find($id);
|
|
$user = User::where('user_name', $_COOKIE['user_identity'])->select('name')->first();
|
|
if ($attendance) {
|
|
$request = [
|
|
'function' => 'delete',
|
|
'userid' => $attendance->user_identity,
|
|
'id' => $id,
|
|
'oldenter' => Carbon::parse($attendance->entered_at)->format('H:i'),
|
|
'oldexit' => Carbon::parse($attendance->exited_at)->format('H:i'),
|
|
'newenter' => '',
|
|
"newexit" => ''
|
|
];
|
|
Redis::connection()->set("att-tempreq:{$attendance->user_identity}:{$id}", json_encode($request));
|
|
$attendance->requested = 'true';
|
|
$attendance->save();
|
|
$status = 'request';
|
|
$d = "حذف روز کاری";
|
|
send_tel($user->name, $d, $status);
|
|
return redirect()->back()->with('message', [
|
|
'color' => '#6aff00ff',
|
|
"text" => 'درخواست حذف با موفقیت ارسال شد.✔️'
|
|
]);
|
|
} else {
|
|
return redirect()->back()->with('message', [
|
|
'color' => '#ff4400ff',
|
|
"text" => 'خطا در ارسال درخواست✖️'
|
|
]);
|
|
}
|
|
})->name('user.delete');
|
|
|
|
Route::get('attendance/show', function (Request $request) {
|
|
$username = $_COOKIE['user_identity'];
|
|
$data = User::where('user_name', $username)->with('attendances')->first();
|
|
$data = $data->everymonth($data);
|
|
// dd($data);
|
|
|
|
return view('attendance.show', ['data' => $data]);
|
|
})->name('attendance.show');
|
|
|
|
Route::get('/attendance/profile', function (Request $request) {
|
|
if (!empty($_GET['username'])) {
|
|
$username = $_GET['username'];
|
|
} else {
|
|
$username = $_COOKIE['user_identity'];
|
|
}
|
|
$data = User::where('user_name', $username)->first();
|
|
return view('attendance.profile', ['user' => $data]);
|
|
})->name('user.profile');
|
|
|
|
Route::post('/attendance/profile', function (Request $request) {
|
|
|
|
|
|
$username = $_COOKIE['user_identity'];
|
|
$data = User::where('user_name', $username)->first();
|
|
if ($data->password != $request->password) {
|
|
$request->validate([
|
|
'password' => 'required|min:6|confirmed',
|
|
], [
|
|
'password.required' => 'رمز عبور الزامی است.',
|
|
'password.min' => 'رمز عبور باید حداقل ۶ کاراکتر باشد.',
|
|
'password.confirmed' => 'تکرار رمز عبور مطابقت ندارد.',
|
|
]);
|
|
}
|
|
|
|
|
|
$data->name = $request->name;
|
|
$data->email = $request->email;
|
|
$data->number = $request->number;
|
|
$data->password = $data->password != $request->password ? $request->password : $data->password;
|
|
$data->chatid = $request->chatid;
|
|
if (!empty($_COOKIE['ad'])) {
|
|
$data->is_admin = $request->role == 1 ? 1 : null;
|
|
}
|
|
|
|
// dd($data);
|
|
$data->save();
|
|
return redirect()->back()->with('message', [
|
|
'color' => '#00c300ff',
|
|
"text" => 'اطلاعات با موفقیت ویرایش شد.'
|
|
]);
|
|
})->name('edit.profile');
|
|
|