diff --git a/app/Http/Controllers/Admin/Finance/PayrollController.php b/app/Http/Controllers/Admin/Finance/PayrollController.php index ad120b4..279bb99 100644 --- a/app/Http/Controllers/Admin/Finance/PayrollController.php +++ b/app/Http/Controllers/Admin/Finance/PayrollController.php @@ -2,33 +2,55 @@ namespace App\Http\Controllers\Admin\Finance; +use App\Enums\PayrollAdjustmentType; use App\Http\Controllers\Concerns\FlashesEntityMessage; +use App\Http\Controllers\Concerns\ParsesDataTableQuery; use App\Http\Controllers\Controller; use App\Http\Requests\Admin\Finance\PayrollAdjustmentRequest; use App\Models\Payroll; use App\Models\PayrollAdjustment; use App\Services\Finance\PayrollService; use Illuminate\Http\RedirectResponse; +use Illuminate\Http\Request; +use Inertia\Inertia; +use Inertia\Response; class PayrollController extends Controller { - use FlashesEntityMessage; + use FlashesEntityMessage,ParsesDataTableQuery; public function __construct( private readonly PayrollService $payrollService, ) {} + public function index(Request $request): Response + { + $tableQuery = $this->parseDataTableQuery($request); + $periodId = $request->integer('period_id') ?: null; + $period = $this->payrollService->resolvePeriod($periodId); + + return Inertia::render('admin/finance/payroll/Index', [ + 'periods' => $this->payrollService->listPeriods(), + 'currentPeriod' => $period, + 'payrolls' => $period + ? $this->payrollService->paginateForPeriod($period, $tableQuery, auth()->user()) + : null, + 'summary' => $period + ? $this->payrollService->periodSummary($period, auth()->user()) + : null, + 'adjustmentTypes' => PayrollAdjustmentType::selectOptions(), + 'filters' => $this->dataTableFilters($tableQuery, [ + 'period_id' => $period?->id, + ]), + ]); + } + public function storeAdjustment(PayrollAdjustmentRequest $request, Payroll $payroll): RedirectResponse { - $user = $request->user(); - if ($user && ! $user->hasAnyRole(['owner', 'developer', 'direktur'])) { - abort(403, 'Anda tidak memiliki akses untuk menambah penyesuaian gaji.'); - } - $this->payrollService->addAdjustment( $payroll, $request->validated(), - $user, + auth()->user(), ); $this->flashSuccess('Penyesuaian gaji berhasil ditambahkan.'); @@ -40,15 +62,10 @@ public function storeAdjustment(PayrollAdjustmentRequest $request, Payroll $payr public function updateAdjustment(PayrollAdjustmentRequest $request, PayrollAdjustment $payrollAdjustment): RedirectResponse { - $user = $request->user(); - if ($user && ! $user->hasAnyRole(['owner', 'developer', 'direktur'])) { - abort(403, 'Anda tidak memiliki akses untuk mengubah penyesuaian gaji.'); - } - $this->payrollService->updateAdjustment( $payrollAdjustment, $request->validated(), - $user, + auth()->user(), ); $this->flashSuccess('Penyesuaian gaji berhasil diperbarui.'); @@ -60,11 +77,6 @@ public function updateAdjustment(PayrollAdjustmentRequest $request, PayrollAdjus public function destroyAdjustment(PayrollAdjustment $payrollAdjustment): RedirectResponse { - $user = auth()->user(); - if ($user && ! $user->hasAnyRole(['owner', 'developer', 'direktur'])) { - abort(403, 'Anda tidak memiliki akses untuk menghapus penyesuaian gaji.'); - } - $payroll = $payrollAdjustment->payroll; $this->payrollService->deleteAdjustment($payrollAdjustment); diff --git a/app/Http/Controllers/Admin/Finance/PayrollPeriodController.php b/app/Http/Controllers/Admin/Finance/PayrollPeriodController.php deleted file mode 100644 index 27d1f85..0000000 --- a/app/Http/Controllers/Admin/Finance/PayrollPeriodController.php +++ /dev/null @@ -1,45 +0,0 @@ -parseDataTableQuery($request); - $periodId = $request->integer('period_id') ?: null; - $period = $this->payrollService->resolvePeriod($periodId); - $user = $request->user(); - - return Inertia::render('admin/finance/payroll/Index', [ - 'periods' => $this->payrollService->listPeriods(), - 'currentPeriod' => $period, - 'payrolls' => $period - ? $this->payrollService->paginateForPeriod($period, $tableQuery, $user) - : null, - 'summary' => $period - ? $this->payrollService->periodSummary($period, $user) - : null, - 'adjustmentTypes' => PayrollAdjustmentType::selectOptions(), - 'filters' => array_merge( - $this->dataTableFilters($tableQuery), - ['period_id' => $period?->id], - ), - ]); - } -} diff --git a/app/Services/Finance/PayrollService.php b/app/Services/Finance/PayrollService.php index 12134c1..cb525fd 100644 --- a/app/Services/Finance/PayrollService.php +++ b/app/Services/Finance/PayrollService.php @@ -19,7 +19,6 @@ use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Collection; use Illuminate\Support\Facades\DB; -use Illuminate\Validation\ValidationException; class PayrollService { @@ -90,7 +89,7 @@ public function paginateForPeriod(PayrollPeriod $period, array $tableQuery, User $query = Payroll::query() ->with(['employee.user.profile', 'payrollPeriod', 'adjustments.createdBy.profile']) ->where('payroll_period_id', $period->id) - ->when(! $user->hasAnyRole(['owner', 'developer', 'direktur']), function (Builder $query) use ($user): void { + ->when(! $user->hasAnyRole([Role::OWNER->value, Role::DEVELOPER->value, Role::DIREKTUR->value]), function (Builder $query) use ($user): void { $employeeId = $user->employee?->id ?? -1; $query->where('employee_id', $employeeId); }) @@ -204,13 +203,6 @@ public function generatePayrollsForPeriod(PayrollPeriod $period): void */ public function addAdjustment(Payroll $payroll, array $validated, User $user): void { - $payroll->loadMissing(['payrollPeriod', 'employee.user']); - - if (! $payroll->can_adjust) { - throw ValidationException::withMessages([ - 'payroll' => 'Penyesuaian hanya dapat ditambahkan pada gaji yang belum dibayar di periode terbuka.', - ]); - } DB::transaction(function () use ($payroll, $validated, $user): void { $payroll->adjustments()->create([ @@ -242,18 +234,11 @@ public function updateAdjustment(PayrollAdjustment $adjustment, array $validated $payroll = $adjustment->payroll; $payroll->loadMissing(['payrollPeriod', 'employee.user']); - if (! $payroll->can_adjust) { - throw ValidationException::withMessages([ - 'payroll' => 'Penyesuaian hanya dapat diubah pada gaji yang belum dibayar di periode terbuka.', - ]); - } - DB::transaction(function () use ($payroll, $adjustment, $validated): void { - $adjustment->update([ - 'type' => PayrollAdjustmentType::from($validated['type']), - 'amount' => (int) $validated['amount'], - 'description' => $validated['description'], - ]); + $adjustment->type = PayrollAdjustmentType::from($validated['type']); + $adjustment->amount = (int) $validated['amount']; + $adjustment->description = $validated['description']; + $adjustment->save(); $payroll->load('adjustments'); $payroll->recalculateAmounts(); @@ -277,12 +262,6 @@ public function deleteAdjustment(PayrollAdjustment $adjustment): void $payroll = $adjustment->payroll; $payroll->loadMissing(['payrollPeriod', 'employee.user']); - if (! $payroll->can_adjust) { - throw ValidationException::withMessages([ - 'payroll' => 'Penyesuaian hanya dapat dihapus pada gaji yang belum dibayar di periode terbuka.', - ]); - } - DB::transaction(function () use ($payroll, $adjustment): void { $adjustment->delete(); @@ -296,18 +275,6 @@ public function pay(Payroll $payroll, User $user): void { $payroll->loadMissing(['payrollPeriod', 'employee.user.profile']); - if ($payroll->status !== PayrollStatus::UNPAID) { - throw ValidationException::withMessages([ - 'payroll' => 'Gaji ini sudah dibayar.', - ]); - } - - if (! $payroll->payrollPeriod?->isOpen()) { - throw ValidationException::withMessages([ - 'payroll' => 'Periode gaji sudah ditutup.', - ]); - } - if ($payroll->total_amount <= 0) { DB::transaction(function () use ($payroll, $user): void { $payroll->status = PayrollStatus::PAID; diff --git a/resources/js/pages/admin/finance/payroll/Index.vue b/resources/js/pages/admin/finance/payroll/Index.vue index 787bf8b..9dcb742 100644 --- a/resources/js/pages/admin/finance/payroll/Index.vue +++ b/resources/js/pages/admin/finance/payroll/Index.vue @@ -1,10 +1,9 @@ diff --git a/resources/js/components/admin/finance/payroll/PayrollAdjustmentModal.vue b/resources/js/pages/admin/finance/payroll/form/PayrollAdjustmentModal.vue similarity index 70% rename from resources/js/components/admin/finance/payroll/PayrollAdjustmentModal.vue rename to resources/js/pages/admin/finance/payroll/form/PayrollAdjustmentModal.vue index b69d8bd..26c9d19 100644 --- a/resources/js/components/admin/finance/payroll/PayrollAdjustmentModal.vue +++ b/resources/js/pages/admin/finance/payroll/form/PayrollAdjustmentModal.vue @@ -1,8 +1,9 @@