<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\AdminBaseController;
use App\Models\Attendance;
use App\Models\EmailTemplate;
use App\Models\Employee;
use App\Models\LeaveApplication;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Facades\Response;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\View;
use Illuminate\Support\Str;
use Yajra\DataTables\Facades\DataTables;
class LeaveApplicationsController extends AdminBaseController
{
public function __construct()
{
parent::__construct();
$this->leaveApplicationOpen = 'active open';
$this->pageTitle = trans('core.leaveApplication');
}
public function index()
{
return View::make('admin.leave_applications.index', $this->data);
}
// Datatable ajax request
public function ajaxApplications()
{
$result = LeaveApplication::join('employees', 'leave_applications.employee_id', '=', 'employees.id')
->select('leave_applications.id as id', 'employees.full_name', 'leave_applications.start_date', 'leave_applications.end_date', 'leave_applications.days', 'leave_applications.leaveType', 'leave_applications.reason', 'leave_applications.applied_on', 'leave_applications.application_status', 'leave_applications.halfDayType', 'leave_applications.created_at','employee_id')
->whereNotNull('leave_applications.application_status')
->get();
return DataTables::of($result)->editColumn('start_date', function ($row) {
$start = Carbon::createFromFormat("Y-m-d", $row->start_date);
if ($row->end_date == null) {
$end = clone $start;
} else {
$end = Carbon::createFromFormat("Y-m-d", $row->end_date);
}
$dates = $start->format("d-M-Y") . ' ' . (isset($row->end_date) ? ' to ' . $end->format("d-M-Y") : '');
return $dates;
})->editColumn('applied_on', function ($row) {
return date('d-M-Y', strtotime($row->applied_on));
})->editColumn('leaveType', function ($row) {
$leave = $row->leaveType;
if ($row->halfDayType == "yes") {
$leave .= '<br/><span class="label label-info label-sm">Half Day</span>';
}
return $leave;
})->editColumn('reason', function ($row) {
return strip_tags(Str::limit($row->reason, 50));
})->editColumn('application_status', function ($row) {
$color = ['pending' => 'warning', 'approved' => 'success', 'rejected' => 'danger'];
return "<span class='label label-{$color[$row->application_status]}'>" . trans('core.' . $row->application_status) . "</span>";
})->removeColumn('halfDayType')->removeColumn('end_date')->addColumn('edit', function ($row) {
if ($row->application_status == 'pending') {
$string = '
<div class="btn-group"><button class="btn green btn-sm margin-bottom-5" data-toggle="modal" href="#static_approve" onclick="show_approve(' . $row->id . ');return false;">' . trans('core.btnApprove') . '</button>
<button class="btn btn-danger btn-sm margin-bottom-5" data-toggle="modal" href="#static_reject" onclick="show_reject(' . $row->id . ');return false;" >' . trans('core.btnReject') . '</button>
<button class="btn purple btn-sm margin-bottom-5" data-toggle="modal" href="#static" onclick="show_application(' . $row->id . ');return false;" ><i class="fa fa-edit"></i> ' . trans('core.btnView') . '</button>
<a href="javascript:;" onclick="del(' . $row->id . ');return false;" class="btn red btn-sm margin-bottom-5">
<i class="fa fa-trash"></i> ' . trans('core.btnDelete') . '</a></div>';
} else {
$string = '
<button class="btn purple btn-sm margin-bottom-5" data-toggle="modal" href="#static" onclick="show_application(' . $row->id . ');return false;" ><i class="fa fa-eye"></i> ' . trans('core.btnView') . '</button>
<a href="javascript:;" onclick="del(' . $row->id . ');return false;" class="btn red btn-sm margin-bottom-5">
<i class="fa fa-trash"></i> ' . trans('core.btnDelete') . '</a>';
}
return $string;
})->editColumn('full_name', function ($row) {
$employee = Employee::find($row->employee_id);
return $employee->decryptToCollection()->full_name;
})
->removeColumn('created_at')
->rawColumns(['edit', 'application_status', 'reason', 'leaveType', 'applied_on', 'start_date'])
->make();
}
public function show($id)
{
$this->leave_application = LeaveApplication::find($id);
return View::make('admin.leave_applications.show', $this->data);
}
public function update(Request $request, $id)
{
$check = LeaveApplication::find($id);
if ($check == null) {
return \View::make('admin.errors.noaccess', $this->data);
}
$inputs = \request()->all();
$this->data["data"] = $inputs;
$leave_application = LeaveApplication::findOrFail($id);
$inputs['application_status'] = ($inputs['application_status'] == 'Approve') ? 'approved' : 'rejected';
$leave_application->update($inputs);
$start = Carbon::createFromFormat("Y-m-d", $leave_application->start_date);
if ($leave_application->end_date == null) {
$end = clone $start;
} else {
$end = Carbon::createFromFormat("Y-m-d", $leave_application->end_date);
}
$diffDays = $end->diffInDays($start);
$startDate = $start;
if ($leave_application->application_status == 'approved') {
for ($i = 0; $i <= $diffDays; $i++) {
$date = $startDate;
$attendance = Attendance::firstOrCreate(['date' => $date->format("Y-m-d"),
'employee_id' => $leave_application->employee_id]);
$attendance->leaveType = $leave_application->leaveType;
$attendance->halfDayType = $leave_application->halfDayType;
$attendance->reason = $leave_application->reason;
$attendance->status = 'absent';
$attendance->applied_on = $leave_application->applied_on;
$attendance->last_updated_by = admin()->id;
$attendance->application_status = 'approved';
$attendance->save();
$startDate->addDays(1);
}
}
$employee = Employee::where('id', '=', $leave_application->employee_id)->first();
$this->email = $employee->email;
//---- EXPENSE EMAIL TEMPLATE-----
$this->date = ($start->format("d-M-Y")) . ' ' . (isset($leave_application->end_date) ? ' to ' . $end->format("d-M-Y") : '');
$company = admin()->company;
if ($company->leave_notification == 1) {
if ($request->application_status != 'pending') {
$emailInfo = ['from_email' => $this->setting->email,
'from_name' => $this->setting->name,
'to' => $employee->email,
'active_company' => $company
];
$fieldValues = [
'NAME' => $employee->full_name,
'DATE' => $this->date,
'STATUS' => $request->application_status
];
EmailTemplate::prepareAndSendEmail('LEAVE_APPROVAL', $emailInfo, $fieldValues);
//---- EXPENSE EMAIL TEMPLATE SENT-----
}
}
Session::flash('success', trans("messages.leaveApplicationUpdateMessage"));
return Redirect::route('admin.leave_applications.index');
}
public function destroy($id)
{
$leave_application = LeaveApplication::findOrFail($id);
$start = Carbon::createFromFormat("Y-m-d", $leave_application->start_date);
if ($leave_application->end_date == null) {
$end = clone $start;
} else {
$end = Carbon::createFromFormat("Y-m-d", $leave_application->end_date);
}
$diffDays = $end->diffInDays($start);
for ($i = 0; $i < $diffDays; $i++) {
$date = $start->addDays(1);
Attendance::where('date', '=', $date->format('Y-m-d'))
->where('employee_id', $leave_application->employee_id)
->delete();
}
LeaveApplication::destroy($id);
$output['success'] = 'deleted';
return Response::json($output, 200);
}
}