refactor: enhance attendance penalty application by utilizing query scopes for employee status and payroll period checks

This commit is contained in:
Yoga Pangestu 2026-06-22 13:58:07 +07:00
parent 0fabc7b280
commit a89922fea6
3 changed files with 27 additions and 4 deletions

View File

@ -2,7 +2,6 @@
namespace App\Console\Commands; namespace App\Console\Commands;
use App\Enums\EmployeeStatus;
use App\Enums\PayrollAdjustmentType; use App\Enums\PayrollAdjustmentType;
use App\Enums\PayrollPeriodStatus; use App\Enums\PayrollPeriodStatus;
use App\Models\Attendance; use App\Models\Attendance;
@ -40,7 +39,9 @@ public function handle(): int
$scheduledCheckIn = Carbon::createFromFormat('Y-m-d H:i', $date->format('Y-m-d').' '.$scheduledTime); $scheduledCheckIn = Carbon::createFromFormat('Y-m-d H:i', $date->format('Y-m-d').' '.$scheduledTime);
$employees = Employee::query() $employees = Employee::query()
->where('status', EmployeeStatus::ACTIVE) ->whereHas('user', function ($query) {
$query->active();
})
->get(); ->get();
$lateCount = 0; $lateCount = 0;
@ -80,7 +81,7 @@ public function handle(): int
$alreadyExists = $payroll->adjustments() $alreadyExists = $payroll->adjustments()
->where('attendance_id', null) ->where('attendance_id', null)
->where('type', PayrollAdjustmentType::DEDUCTION) ->deduction()
->where('description', 'like', "%Bolos {$date->format('d/m/Y')}%") ->where('description', 'like', "%Bolos {$date->format('d/m/Y')}%")
->exists(); ->exists();
@ -162,7 +163,7 @@ public function handle(): int
private function findOpenPayroll(int $employeeId): ?Payroll private function findOpenPayroll(int $employeeId): ?Payroll
{ {
$period = PayrollPeriod::query() $period = PayrollPeriod::query()
->where('status', PayrollPeriodStatus::OPEN) ->open()
->first(); ->first();
if ($period === null) { if ($period === null) {

View File

@ -6,10 +6,12 @@
use App\Models\Concerns\InteractsWithActivityLog; use App\Models\Concerns\InteractsWithActivityLog;
use Illuminate\Database\Eloquent\Attributes\Appends; use Illuminate\Database\Eloquent\Attributes\Appends;
use Illuminate\Database\Eloquent\Attributes\Guarded; use Illuminate\Database\Eloquent\Attributes\Guarded;
use Illuminate\Database\Eloquent\Attributes\Scope;
use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Query\Builder;
#[Guarded(['id'])] #[Guarded(['id'])]
#[Appends(['amount_formatted', 'type_label', 'created_at_formatted', 'created_by_name'])] #[Appends(['amount_formatted', 'type_label', 'created_at_formatted', 'created_by_name'])]
@ -70,4 +72,16 @@ public function typeLabel(): Attribute
get: fn () => $this->type?->label(), get: fn () => $this->type?->label(),
); );
} }
#[Scope]
public function deduction(Builder $query): void
{
$query->where('type', PayrollAdjustmentType::DEDUCTION);
}
#[Scope]
public function bonus(Builder $query): void
{
$query->where('type', PayrollAdjustmentType::BONUS);
}
} }

View File

@ -7,12 +7,14 @@
use Carbon\Carbon; use Carbon\Carbon;
use Illuminate\Database\Eloquent\Attributes\Appends; use Illuminate\Database\Eloquent\Attributes\Appends;
use Illuminate\Database\Eloquent\Attributes\Guarded; use Illuminate\Database\Eloquent\Attributes\Guarded;
use Illuminate\Database\Eloquent\Attributes\Scope;
use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Database\Query\Builder;
#[Guarded(['id'])] #[Guarded(['id'])]
#[Appends(['period_label', 'status_label', 'closed_at_formatted'])] #[Appends(['period_label', 'status_label', 'closed_at_formatted'])]
@ -63,4 +65,10 @@ public function isOpen(): bool
{ {
return $this->status === PayrollPeriodStatus::OPEN; return $this->status === PayrollPeriodStatus::OPEN;
} }
#[Scope]
public function open(Builder $query): void
{
$query->where('status', PayrollPeriodStatus::OPEN);
}
} }