89 lines
2.9 KiB
PHP
89 lines
2.9 KiB
PHP
<?php
|
|
|
|
namespace App\Services;
|
|
|
|
use App\Models\Employee;
|
|
use App\Models\LeaveApplication;
|
|
use App\Models\LeaveBalance;
|
|
use App\Models\LeavePolicy;
|
|
use App\Models\LeaveType;
|
|
use App\Models\User;
|
|
use Illuminate\Support\Collection;
|
|
use Exception;
|
|
|
|
class LeaveService
|
|
{
|
|
/**
|
|
* Get leave balances for an employee based on configured policies/balances.
|
|
*/
|
|
public function getBalances(Employee $employee): Collection
|
|
{
|
|
$userId = $employee->user_id ?? $employee->id;
|
|
$leaveTypes = LeaveType::all();
|
|
|
|
if ($leaveTypes->isEmpty()) {
|
|
return collect([]);
|
|
}
|
|
|
|
return $leaveTypes->map(function ($type) use ($employee, $userId) {
|
|
$dbBalance = LeaveBalance::where('employee_id', $userId)
|
|
->where('leave_type_id', $type->id)
|
|
->first();
|
|
|
|
$policy = LeavePolicy::where('leave_type_id', $type->id)->first();
|
|
$allocated = $dbBalance ? (int)$dbBalance->allocated_days : ($policy ? (int)($policy->days ?? 0) : 0);
|
|
|
|
$used = LeaveApplication::where('employee_id', $userId)
|
|
->where('leave_type_id', $type->id)
|
|
->where('status', 'approved')
|
|
->sum('total_days');
|
|
|
|
return [
|
|
'leave_type_id' => $type->id,
|
|
'leave_type_name' => $type->title ?? $type->name ?? 'Leave',
|
|
'allocated_days' => $allocated,
|
|
'used_days' => (int)$used,
|
|
'remaining_days' => max(0, $allocated - (int)$used),
|
|
];
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Submit a leave application.
|
|
*/
|
|
public function submitApplication(User $user, Employee $employee, array $data): LeaveApplication
|
|
{
|
|
$startDate = strtotime($data['start_date']);
|
|
$endDate = strtotime($data['end_date']);
|
|
$days = ceil(abs($endDate - $startDate) / 86400) + 1;
|
|
|
|
$leaveTypeId = 1;
|
|
if (!empty($data['leave_type_id'])) {
|
|
$leaveTypeId = (int)$data['leave_type_id'];
|
|
} elseif (!empty($data['leave_type'])) {
|
|
$lt = LeaveType::where('title', 'LIKE', '%' . $data['leave_type'] . '%')
|
|
->orWhere('name', 'LIKE', '%' . $data['leave_type'] . '%')
|
|
->first();
|
|
if ($lt) {
|
|
$leaveTypeId = $lt->id;
|
|
}
|
|
}
|
|
|
|
$policy = LeavePolicy::where('leave_type_id', $leaveTypeId)->first();
|
|
$leavePolicyId = $policy ? $policy->id : 1;
|
|
|
|
return LeaveApplication::create([
|
|
'employee_id' => $user->id,
|
|
'leave_policy_id' => $leavePolicyId,
|
|
'leave_type_id' => $leaveTypeId,
|
|
'start_date' => $data['start_date'],
|
|
'end_date' => $data['end_date'],
|
|
'total_days' => $days,
|
|
'applied_on' => date('Y-m-d'),
|
|
'reason' => $data['reason'] ?? '',
|
|
'status' => 'pending',
|
|
'created_by' => $user->id,
|
|
]);
|
|
}
|
|
}
|