250 lines
14 KiB
PHP
Executable File
250 lines
14 KiB
PHP
Executable File
<?php
|
||
|
||
use Morilog\Jalali\Jalalian;
|
||
use Carbon\Carbon;
|
||
|
||
$usersChunked = $users->chunk(3);
|
||
?>
|
||
|
||
|
||
@extends('app')
|
||
@section('content')
|
||
<div class="container w-full flex flex-col items-center">
|
||
|
||
@if(isset($leaveRequests) && $leaveRequests->isNotEmpty())
|
||
<div class="ui-requests-card flex flex-col items-center w-full max-w-[350px] mb-4">
|
||
<p>درخواستهای مرخصی</p>
|
||
<div class="ui-table-wrap w-full pt-2">
|
||
<table class="w-full table-auto text-sm">
|
||
<thead>
|
||
<tr>
|
||
<th class="px-2 py-2">کارمند</th>
|
||
<th class="px-2 py-2">نوع</th>
|
||
<th class="px-2 py-2">بازه</th>
|
||
<th class="px-2 py-2">وضعیت</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
@foreach($leaveRequests as $leave)
|
||
@php
|
||
$ownerName = $leave->user->name ?? $leave->user_identity;
|
||
$fromJ = \App\Support\JalaliHelper::format($leave->date_from, 'Y/m/d');
|
||
$toJ = \App\Support\JalaliHelper::format($leave->date_to, 'Y/m/d');
|
||
if ($leave->type === 'daily') {
|
||
$range = $fromJ === $toJ ? $fromJ : "{$fromJ} تا {$toJ}";
|
||
} else {
|
||
$tf = substr((string) $leave->time_from, 0, 5);
|
||
$tt = substr((string) $leave->time_to, 0, 5);
|
||
$range = "{$fromJ}<br>{$tf}–{$tt}";
|
||
}
|
||
@endphp
|
||
<tr>
|
||
<td class="px-2 py-2 border">{{ $ownerName }}</td>
|
||
<td class="px-2 py-2 border">{{ $leave->type === 'daily' ? 'روزانه' : 'ساعتی' }}</td>
|
||
<td class="px-2 py-2 border">{!! $range !!}</td>
|
||
<td class="px-2 py-2 border">
|
||
@if($leave->reason)
|
||
<p class="text-xs mb-1 opacity-80">{{ $leave->reason }}</p>
|
||
@endif
|
||
<form method="post" action="{{ route('admin.leave.decide') }}" class="inline">
|
||
@csrf
|
||
<input type="hidden" name="leave_id" value="{{ $leave->id }}">
|
||
<input type="hidden" name="update" value="approve">
|
||
<button type="submit" class="ui-btn-approve">تایید</button>
|
||
</form>
|
||
<form method="post" action="{{ route('admin.leave.decide') }}" class="inline">
|
||
@csrf
|
||
<input type="hidden" name="leave_id" value="{{ $leave->id }}">
|
||
<input type="hidden" name="update" value="reject">
|
||
<button type="submit" class="ui-btn-reject">رد</button>
|
||
</form>
|
||
</td>
|
||
</tr>
|
||
@endforeach
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
@endif
|
||
|
||
@if(!collect($reqs)->pluck('attendances')->flatten()->isEmpty())
|
||
<div class="ui-requests-card flex flex-col items-center w-full max-w-[350px]">
|
||
<p>درخواست ها</p>
|
||
|
||
@foreach ($reqs as $u)
|
||
@if(!empty($u['attendances']))
|
||
<button type="button"
|
||
class="ui-chip-btn"
|
||
onclick="togglerequests('attendance-{{ $loop->index }}')">
|
||
{{ $u['name'] }}
|
||
<span class="mr-1 text-xs opacity-90">({{ count($u['attendances']) }})</span>
|
||
</button>
|
||
|
||
<div id="attendance-{{ $loop->index }}" class="hidden-content pt-4 w-full">
|
||
<div class="ui-table-wrap">
|
||
<table class="w-full table-auto">
|
||
|
||
<thead>
|
||
<tr>
|
||
<th class="px-2 py-2 w-1/6">درخواست</th>
|
||
<th class="px-2 py-2 w-1/6">تاریخ</th>
|
||
<th class="px-2 py-2 w-1/6">ورود</th>
|
||
<th class="px-2 py-2 w-1/6">خروج</th>
|
||
<th class="px-2 py-2 w-1/6">تعیین وضعیت</th>
|
||
</tr>
|
||
</thead>
|
||
|
||
<tbody>
|
||
{{-- {{dd($u['attendances'])}}--}}
|
||
@forelse($u['attendances'] as $rec)
|
||
<tr class="{{ $rec->id=='new' ? 'is-new' : '' }}">
|
||
{{--{{dd($rec)}}--}}
|
||
<td class="px-4 py-2 border">{{ match ($rec->function) {
|
||
'edit' => "تغییر ساعت",
|
||
'delete' => "حذف",
|
||
'new' => "جدید",
|
||
default => "نامشخص",
|
||
} }}</td>
|
||
<td class="px-4 py-2 border">{{ $rec->display_date ?? '-' }}</td>
|
||
@php
|
||
$parseTime = function ($value) {
|
||
if (!$value) {
|
||
return null;
|
||
}
|
||
try {
|
||
return Carbon::parse($value)->format('H:i');
|
||
} catch (\Throwable) {
|
||
return is_string($value) && preg_match('/^\d{1,2}:\d{2}/', $value)
|
||
? substr($value, 0, 5)
|
||
: null;
|
||
}
|
||
};
|
||
$oldEnter = $parseTime($rec->oldenter ?? null);
|
||
$newEnter = $parseTime($rec->newenter ?? null);
|
||
$oldExit = $parseTime($rec->oldexit ?? null);
|
||
$newExit = $parseTime($rec->newexit ?? null);
|
||
@endphp
|
||
|
||
@if( $oldEnter == $newEnter || $newEnter == null)
|
||
<td class="px-4 py-2 border">{{ $oldEnter ?? '-' }}</td>
|
||
@else
|
||
<td class="px-4 py-2 border">{{ $oldEnter || $newEnter ? ($rec->id=='new' || $oldEnter==($newEnter ?? '') ? $oldEnter : $oldEnter.'👇🏻'.$newEnter) : '-' }}</td>
|
||
@endif
|
||
|
||
@if($oldExit == $newExit || $newExit == null)
|
||
<td class="px-4 py-2 border">{{$oldExit ? ($oldExit ?? $newExit) : '-'}}</td>
|
||
@else
|
||
<td class="px-4 py-2 border">{{ $oldExit || $newExit ? ($rec->id=='new' || $oldExit==($newExit ?? '') ? $oldExit : $oldExit.'👇🏻'.$newExit) : '-' }}</td>
|
||
@endif
|
||
|
||
{{-- @if($userType == 'admin')--}}
|
||
<td class="px-4 py-2 border">
|
||
<form method="post" action="{{route('admin.update')}}">
|
||
@csrf
|
||
<input type="hidden" name="update" id="update" value="approve">
|
||
<input type="hidden" name="data"
|
||
value='{{ json_encode($rec, JSON_UNESCAPED_UNICODE) }}'>
|
||
<button type="submit" class="ui-btn-approve">
|
||
تایید
|
||
</button>
|
||
</form>
|
||
<form method="post" action="{{route('admin.update')}}">
|
||
@csrf
|
||
<input type="hidden" name="update" id="update" value="reject">
|
||
<input type="hidden" name="data"
|
||
value='{{ json_encode($rec, JSON_UNESCAPED_UNICODE) }}'>
|
||
<button type="submit" class="ui-btn-reject">
|
||
رد
|
||
</button>
|
||
</form>
|
||
</td>
|
||
{{-- @endif--}}
|
||
</tr>
|
||
@empty
|
||
<tr>
|
||
<td class="px-4 py-2 border text-center" colspan="6">هیچ رکوردی ثبت نشده</td>
|
||
</tr>
|
||
@endforelse
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
@endif
|
||
@endforeach
|
||
</div>
|
||
@endif
|
||
|
||
|
||
<div class="container" style="padding-top: 20px">
|
||
<div class="grid grid-cols-2 grid-rows-none ">
|
||
@foreach ($usersChunked as $chunk)
|
||
@foreach ($chunk as $u)
|
||
@php
|
||
$cardClass = 'ui-user-card m-3';
|
||
if ($u->active_task) {
|
||
$cardClass .= ' is-active';
|
||
} elseif ($u->working == 1) {
|
||
$cardClass .= ' is-working';
|
||
} elseif ($u->working == 2) {
|
||
$cardClass .= ' is-break';
|
||
}
|
||
@endphp
|
||
<div class="{{ $cardClass }}">
|
||
<a href="/admin/{{ $u->user_name }}">
|
||
<p class="ui-user-name">{{ $u->name ?? $u->user_name }}</p>
|
||
@if($u->active_task)
|
||
<p>وظیفه: {{ $u->active_task }}</p>
|
||
@endif
|
||
<p>کارکرد ماه جاری: {{ $u->totaltime }}</p>
|
||
<p>جریمه تأخیر ماه: {{ number_format($u->monthly_late_fine ?? 0) }} تومان</p>
|
||
<p>تعداد درخواست ها: {{ $u->req_counts }}</p>
|
||
</a>
|
||
@if($userType == 'admin')
|
||
<button type="button"
|
||
class="ui-chip-btn mt-2 !min-w-0 !w-auto !text-sm"
|
||
onclick="window.location.href='{{ url('attendance/profile').'?username='.$u->user_name }}'">
|
||
ویرایش
|
||
</button>
|
||
@endif
|
||
</div>
|
||
|
||
@endforeach
|
||
@endforeach
|
||
<a class="ui-user-card m-3 flex items-center justify-center min-h-[140px]" href="{{route('admin.new')}}">
|
||
<i class="fa-regular fa-plus text-5xl text-gray-400"></i>
|
||
</a>
|
||
</div>
|
||
|
||
|
||
</div>
|
||
{{-- {{dd($reqs)}}--}}
|
||
|
||
|
||
|
||
{{--MODAL--}}
|
||
|
||
@endsection
|
||
|
||
@section('script')
|
||
<script>
|
||
// این تابع اکنون یک DIV را باز و بسته میکند
|
||
function togglerequests(elementId) {
|
||
var contentDiv = document.getElementById(elementId);
|
||
|
||
// بررسی میکند اگر عنصر دارای کلاس 'hidden-content' هست، آن را حذف و نمایش دهد، وگرنه اضافه و پنهان کند.
|
||
if (contentDiv.classList.contains('hidden-content')) {
|
||
contentDiv.classList.remove('hidden-content');
|
||
// اگر از Tailwind استفاده میکنید، ممکن است بخواهید: contentDiv.classList.remove('hidden');
|
||
} else {
|
||
contentDiv.classList.add('hidden-content');
|
||
// contentDiv.classList.add('hidden');
|
||
}
|
||
}
|
||
</script>
|
||
<style>
|
||
/* نیاز به این کلاس برای پنهان کردن اولیه محتوا */
|
||
.hidden-content {
|
||
display: none;
|
||
}
|
||
</style>
|
||
@endsection
|