Files
HRM-System/app/Services/LeaveService.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,
]);
}
}