loadPayrolls(); $this->users = User::whereHas('employee') ->latest() ->get() ->mapWithKeys(fn ($user) => [ $user->id => $user->employee->full_name, ]) ->toArray(); } private function loadPayrolls(): void { $this->payrolls = PayrollModel::with(['user', 'user.employee']) ->notPaid() ->forCurrentUser() ->where('period_month', now()->format('Y-m')) ->whereHas('user', function ($query) { $query->active() ->withoutDeveloper(); }) ->get(); } #[On('modal:open')] public function openModal(string $method, string $modalTitle, ?string $id = null): void { $this->resetValidation(); $this->resetErrorBag(); $this->method = $method; $this->modalTitle = $modalTitle; } public function create(): void { $this->canOrAbort('manage adjustment'); $result = $this->form->store(); StorePushNotification::dispatch( PushNotification::where('user_id', $result['userIds'])->get(), [ 'title' => 'Order', 'body' => $result['message'], 'url' => route('studio.finance.payroll.index'), ], ); $this->loadPayrolls(); $this->dispatch('refreshDatatable'); $this->toast('Penyesuaian berhasil ditambahkan.'); Flux::modals()->close(); } public function delete(PayrollAdjustment $adjustment): void { $this->canOrAbort('manage adjustment'); DB::transaction(function () use ($adjustment) { $payroll = PayrollModel::find($adjustment->payroll_id); if ($adjustment->type->value == SalaryAdjustmentType::BONUS->value) { $payroll->bonus -= $adjustment->amount; } elseif ($adjustment->type->value == SalaryAdjustmentType::DEDUCTION->value) { $payroll->deduction -= $adjustment->amount; } $payroll->total_salary = $payroll->base_salary + $payroll->bonus - $payroll->deduction; $payroll->save(); $adjustment->delete(); }); $this->loadPayrolls(); $this->dispatch('refreshDatatable'); $this->toast('Penggajian berhasil dihapus.'); Flux::modals()->close(); } #[On('fn:exportPdf')] public function exportPdf(PayrollModel $payroll) { $this->canOrAbort('view payroll'); // Only owner and developer can export payroll $user = auth()->user(); if (! $user->hasRole(['Owner', 'Developer']) && $payroll->user_id !== $user->id) { abort(403, 'Anda tidak memiliki akses untuk melihat payroll ini.'); } $payroll->load(['user.employee', 'adjustments']); $pdf = Pdf::loadView('pdf.payroll-slip', [ 'payroll' => $payroll, ]); $period = $period = $payroll->period_month.'-01'; $fileName = 'Gaji ' .$payroll->user->employee->full_name .' Bulan ' .formatDateLocalized($period, 'F Y') .'.pdf'; return response()->streamDownload(function () use ($pdf) { echo $pdf->download(); }, $fileName); } public function render(): View { return view('livewire.studio.finance.payrolls', [ 'pageTitle' => 'Penggajian', ]); } }