%PDF- %GIF98; %PNG;
Server : ApacheSystem : Linux host.digitalbabaji.in 4.18.0-513.11.1.el8_9.x86_64 #1 SMP Wed Jan 17 02:00:40 EST 2024 x86_64 User : addictionfreeind ( 1003) PHP Version : 7.2.34 Disable Function : exec,passthru,shell_exec,system Directory : /home/addictionfreeind/www/admin1/app/DataTables/ |
Upload File : |
<?php
namespace App\DataTables;
use App\DataTables\BaseDataTable;
use App\Models\Attendance;
use App\Models\AttendanceSetting;
use App\Models\Holiday;
use App\Models\Leave;
use App\Models\User;
use Carbon\Carbon;
use Carbon\CarbonInterval;
use Carbon\CarbonPeriod;
use Illuminate\Support\Facades\DB;
use Yajra\DataTables\Html\Button;
class AttendanceReportDataTable extends BaseDataTable
{
private $attendanceSettings;
private $totalWorkingDays;
private $daysPresent;
private $holidaysCount;
private $extraDays;
private $startTime;
private $endTime;
private $notClockedOut;
public function __construct()
{
parent::__construct();
$this->attendanceSettings = AttendanceSetting::first();
}
/**
* @param mixed $query
* @return \Yajra\DataTables\CollectionDataTable|\Yajra\DataTables\DataTableAbstract
*/
public function dataTable($query)
{
$request = $this->request();
$startDate = now($this->company->timezone)->startOfMonth();
$endDate = $endDate = now($this->company->timezone);
$diff = 0;
if ($request->startDate != '') {
// if this month filter's end date is not equal to now
$diff = ($endDate->lt(Carbon::createFromFormat($this->company->date_format, $request->endDate))) ? $endDate->diffInDays(Carbon::createFromFormat($this->company->date_format, $request->endDate)) : 0;
$startDate = Carbon::createFromFormat($this->company->date_format, $request->startDate)->startOfDay();
$endDate = $endDate = Carbon::createFromFormat($this->company->date_format, $request->endDate)->endOfDay();
}
$period = CarbonPeriod::create($startDate, $endDate);
$this->totalWorkingDays = ($diff < 1) ? $startDate->diffInDays($endDate) + 1 : $startDate->diffInDays($endDate) - $diff;
// if this month filter's end date is not equal to now
if ($endDate->gt(now($this->company->timezone))) {
$holidayDate = Holiday::whereBetween(DB::raw('DATE(holidays.`date`)'), [$startDate->toDateString(), now($this->company->timezone)])->get('date');
}
else {
$holidayDate = Holiday::whereBetween(DB::raw('DATE(holidays.`date`)'), [$startDate->toDateString(), $endDate->toDateString()])->get('date');
}
$this->holidaysCount = $holidayDate->count();
$holidays = [];
foreach ($holidayDate as $item) {
array_push($holidays, $item->date);
}
$this->totalWorkingDays = $this->totalWorkingDays;
$this->daysPresent = 0;
$this->extraDays = 0;
return datatables()
->eloquent($query)
->addIndexColumn()
->addColumn('employee_name', function ($row) {
return $row->name;
})
->addColumn('name', function ($row) {
return view('components.employee', [
'user' => $row
]);
})
->addColumn('present_days', function ($row) use ($startDate, $endDate) {
$this->daysPresent = Attendance::countDaysPresentByUser($startDate, $endDate, $row->id);
if ($this->daysPresent == 0) {
return '0';
}
return $this->daysPresent;
})
->addColumn('extra_days', function ($row) use ($startDate, $endDate, $holidays) {
return $this->extraDays($startDate, $endDate, $row->id, $holidays);
})
->addColumn('absent_days', function ($row) {
$this->holidaysCount = $this->holidaysCount - $this->extraDays;
if ($this->holidaysCount > 0) {
return (($this->totalWorkingDays - ($this->daysPresent + $this->extraDays + $this->holidaysCount)) <= 0) ? '0' : ($this->totalWorkingDays - ($this->daysPresent + $this->extraDays + $this->holidaysCount));
}
else {
return (($this->totalWorkingDays - ($this->daysPresent + $this->extraDays)) <= 0) ? '0' : ($this->totalWorkingDays - ($this->daysPresent + $this->extraDays));
}
})
->addColumn('hours_clocked', function ($row) use ($period) {
return $this->calculateHours($period, $row);
})
->addColumn('late_day_count', function ($row) use ($startDate, $endDate) {
$lateDayCount = Attendance::countDaysLateByUser($startDate, $endDate, $row->id);
if ($lateDayCount == 0) {
return '0';
}
return $lateDayCount;
})
->addColumn('half_day_count', function ($row) use ($startDate, $endDate) {
$halfDayCount = Attendance::countHalfDaysByUser($startDate, $endDate, $row->id);
if ($halfDayCount == 0) {
return '0';
}
return $halfDayCount;
})
->orderColumn('present_days', 'user_id $1')
->orderColumn('absent_days', 'user_id $1')
->orderColumn('extra_days', 'user_id $1')
->orderColumn('hours_clocked', 'user_id $1')
->orderColumn('late_day_count', 'user_id $1')
->orderColumn('half_day_count', 'user_id $1');
}
/**
* @return \Illuminate\Support\Collection
*/
public function query()
{
$request = $this->request();
$model = User::with('role', 'roles', 'employeeDetail', 'session')
->join('role_user', 'role_user.user_id', '=', 'users.id')
->join('roles', 'roles.id', '=', 'role_user.role_id')
->where('roles.name', 'employee')
->select('users.*');
if ($request->employee != 'all') {
$model = $model->where('users.id', $request->employee);
}
return $model;
}
/**
* Optional method if you want to use html builder.
*
* @return \Yajra\DataTables\Html\Builder
*/
public function html()
{
return $this->setBuilder('attendance-report-table')
->parameters([
'initComplete' => 'function () {
window.LaravelDataTables["attendance-report-table"].buttons().container()
.appendTo( "#table-actions")
}',
'fnDrawCallback' => 'function( oSettings ) {
$("body").tooltip({
selector: \'[data-toggle="tooltip"]\'
})
}',
])
->buttons(Button::make(['extend' => 'excel', 'text' => '<i class="fa fa-file-export"></i> ' . trans('app.exportExcel')]));
}
/**
* Get columns.
*
* @return array
*/
protected function getColumns()
{
return [
'#' => ['data' => 'DT_RowIndex', 'orderable' => false, 'searchable' => false, 'visible' => false, 'title' => '#'],
__('app.employee') => ['data' => 'name', 'name' => 'users.name', 'exportable' => false, 'title' => __('app.employee')],
__('app.name') => ['data' => 'employee_name', 'name' => 'users.name', 'visible' => false, 'title' => __('app.name')],
__('modules.attendance.present') => ['data' => 'present_days', 'name' => 'present_days', 'title' => __('modules.attendance.present')],
__('modules.attendance.absent') => ['data' => 'absent_days', 'name' => 'absent_days', 'title' => __('modules.attendance.absent')],
__('modules.attendance.extraDays') => ['data' => 'extra_days', 'name' => 'extra_days', 'title' => __('modules.attendance.extraDays')],
__('modules.attendance.hoursClocked') => ['data' => 'hours_clocked', 'name' => 'hours_clocked', 'title' => __('modules.attendance.hoursClocked')],
__('app.days') . ' ' . __('modules.attendance.late') => ['data' => 'late_day_count', 'name' => 'late_day_count', 'title' => __('app.days') . ' ' . __('modules.attendance.late')],
__('modules.attendance.halfDay') => ['data' => 'half_day_count', 'name' => 'half_day_count', 'title' => __('modules.attendance.halfDay')],
];
}
public function calculateHours($period, $user)
{
$timeLogInMinutes = 0;
foreach ($period as $date) {
$attendanceDate = $date->toDateString();
$clockins = Attendance::select('clock_in_time', 'clock_out_time')
->where(DB::raw('DATE(attendances.clock_in_time)'), $attendanceDate)
->where('user_id', $user->id)
->orderBy('id', 'asc')->get();
foreach ($clockins as $value) {
if (!is_null($value)) {
$this->startTime = Carbon::parse($value->clock_in_time)
->timezone($this->company->timezone);
if (!is_null($value->clock_out_time)) {
$this->endTime = Carbon::parse($value->clock_out_time)
->timezone($this->company->timezone);
}
elseif (($value->clock_in_time->timezone($this->company->timezone)->translatedFormat('Y-m-d') != now()->timezone($this->company->timezone)->translatedFormat('Y-m-d')) && is_null($value->clock_out_time)) {
$this->endTime = Carbon::parse($this->startTime->translatedFormat('Y-m-d') . ' ' . $this->attendanceSettings->office_end_time, $this->company->timezone);
$this->notClockedOut = true;
}
else {
$this->notClockedOut = true;
$this->endTime = now()->timezone($this->company->timezone);
}
$timeLogInMinutes = $timeLogInMinutes + $this->endTime->diffInMinutes($this->startTime, true);
}
}
}
return sprintf('%d'.__('app.hrs').' %d'.__('app.mins'), floor($timeLogInMinutes / 60), floor($timeLogInMinutes / 60) % 60);
}
public function extraDays($startDate, $endDate, $userId, $holidays)
{
$extraDays = Attendance::whereBetween(DB::raw('DATE(attendances.`clock_in_time`)'), [$startDate->toDateString(), $endDate->toDateString()])->where('user_id', $userId)->whereIn(DB::raw('DATE(`clock_in_time`)'), $holidays)
->select(DB::raw('count(DISTINCT DATE(attendances.clock_in_time) ) as attendance'))->first();
return $extraDays->attendance;
}
}