- Updated CustomerService to simplify getAll method. - Refactored ProductService to utilize HasRoleChecks trait and improved role verification logic. - Enhanced ProductVariantService with new methods for fetching data for restocking and transactions. - Cleaned up RawMaterialService by removing unused methods and improving data retrieval. - Adjusted SupplierService to streamline getAll method. - Refactored RoleService to use Spatie's Role model and improved role filtering logic. - Updated NotificationService to handle role labels more effectively. - Improved StockMutationService by removing redundant paginated method. - Cleaned up various frontend components to directly accept necessary props instead of nested data objects. - Updated tests to reflect changes in service method names and ensure proper notification handling.
134 lines
4.8 KiB
PHP
134 lines
4.8 KiB
PHP
<?php
|
|
|
|
namespace App\Services\Admin\HR;
|
|
|
|
use App\Concerns\HasRoleChecks;
|
|
use App\Enums\LeaveRequestStatus;
|
|
use App\Enums\Role;
|
|
use App\Models\LeaveRequest;
|
|
use App\Services\NotificationService;
|
|
use Carbon\Carbon;
|
|
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Validation\ValidationException;
|
|
|
|
class LeaveRequestService
|
|
{
|
|
use HasRoleChecks;
|
|
|
|
public function paginated(int $perPage = 25, string $search = '', string $sort = 'created_at', string $direction = 'desc', array $filters = []): LengthAwarePaginator
|
|
{
|
|
return LeaveRequest::query()
|
|
->select(['id', 'employee_id', 'start_date', 'end_date', 'total_days', 'status', 'created_at'])
|
|
->with(['employee.user.userProfile'])
|
|
->when(! self::hasAnyRole([Role::DEVELOPER, Role::OWNER, Role::DIREKTUR, Role::ADMIN_TOKO]), fn ($q) => $q->whereHas('employee', fn ($eq) => $eq->where('user_id', auth()->id())))
|
|
->when($search, fn ($q) => $q->whereHas('employee.user.userProfile', fn ($uq) => $uq->where('full_name', 'like', "%{$search}%")))
|
|
->when($filters['status'] ?? null, function ($query, $status) {
|
|
$query->where('status', $status);
|
|
})
|
|
->orderBy($sort, $direction)
|
|
->paginate($perPage);
|
|
}
|
|
|
|
public function store(array $data): LeaveRequest
|
|
{
|
|
$leaveRequest = DB::transaction(function () use ($data) {
|
|
$employee = auth()->user()->employee;
|
|
|
|
if (! $employee) {
|
|
throw ValidationException::withMessages([
|
|
'employee' => 'Anda tidak terdaftar sebagai karyawan.',
|
|
]);
|
|
}
|
|
|
|
$startDate = new Carbon($data['start_date']);
|
|
$endDate = new Carbon($data['end_date']);
|
|
$totalDays = $startDate->diffInDays($endDate) + 1;
|
|
|
|
return LeaveRequest::create([
|
|
'employee_id' => $employee->id,
|
|
'start_date' => $data['start_date'],
|
|
'end_date' => $data['end_date'],
|
|
'total_days' => $totalDays,
|
|
'status' => LeaveRequestStatus::PENDING,
|
|
]);
|
|
});
|
|
|
|
$leaveRequest->load('employee.user');
|
|
|
|
NotificationService::notify(
|
|
roles: [Role::OWNER, Role::DEVELOPER, Role::DIREKTUR, Role::ADMIN_TOKO],
|
|
title: 'Pengajuan Cuti Baru',
|
|
body: "Pengajuan cuti {$leaveRequest->total_days} hari oleh ".auth()->user()->full_name.'.',
|
|
url: route('admin.hr.leave-requests.index'),
|
|
additionalUser: $leaveRequest->employee->user ?? null,
|
|
);
|
|
|
|
return $leaveRequest;
|
|
}
|
|
|
|
public function update(LeaveRequest $leaveRequest, array $data): LeaveRequest
|
|
{
|
|
return DB::transaction(function () use ($leaveRequest, $data) {
|
|
$startDate = new Carbon($data['start_date']);
|
|
$endDate = new Carbon($data['end_date']);
|
|
$totalDays = $startDate->diffInDays($endDate) + 1;
|
|
|
|
$leaveRequest->update([
|
|
'start_date' => $data['start_date'],
|
|
'end_date' => $data['end_date'],
|
|
'total_days' => $totalDays,
|
|
]);
|
|
|
|
return $leaveRequest;
|
|
});
|
|
}
|
|
|
|
public function destroy(LeaveRequest $leaveRequest): bool
|
|
{
|
|
return $leaveRequest->delete();
|
|
}
|
|
|
|
public function approve(LeaveRequest $leaveRequest): LeaveRequest
|
|
{
|
|
$leaveRequest->update([
|
|
'status' => LeaveRequestStatus::APPROVED,
|
|
'verified_by_id' => auth()->id(),
|
|
'verified_at' => now(),
|
|
]);
|
|
|
|
$employeeUser = $leaveRequest->employee->user ?? null;
|
|
|
|
NotificationService::notify(
|
|
roles: [Role::OWNER, Role::DEVELOPER, Role::DIREKTUR, Role::ADMIN_TOKO],
|
|
title: 'Cuti Disetujui',
|
|
body: "Cuti {$leaveRequest->employee->name} telah disetujui oleh ".auth()->user()->full_name.'.',
|
|
url: route('admin.hr.leave-requests.index'),
|
|
additionalUser: $employeeUser,
|
|
);
|
|
|
|
return $leaveRequest;
|
|
}
|
|
|
|
public function reject(LeaveRequest $leaveRequest): LeaveRequest
|
|
{
|
|
$leaveRequest->update([
|
|
'status' => LeaveRequestStatus::REJECTED,
|
|
'verified_by_id' => auth()->id(),
|
|
'verified_at' => now(),
|
|
]);
|
|
|
|
$employeeUser = $leaveRequest->employee->user ?? null;
|
|
|
|
NotificationService::notify(
|
|
roles: [Role::OWNER, Role::DEVELOPER, Role::DIREKTUR, Role::ADMIN_TOKO],
|
|
title: 'Cuti Ditolak',
|
|
body: "Cuti {$leaveRequest->employee->name} telah ditolak oleh ".auth()->user()->full_name.'.',
|
|
url: route('admin.hr.leave-requests.index'),
|
|
additionalUser: $employeeUser,
|
|
);
|
|
|
|
return $leaveRequest;
|
|
}
|
|
}
|