diff --git a/app/Enums/CashTransactionType.php b/app/Enums/CashTransactionType.php index 010495a..4d9bec2 100644 --- a/app/Enums/CashTransactionType.php +++ b/app/Enums/CashTransactionType.php @@ -12,6 +12,7 @@ enum CashTransactionType: string case EXPENSE = 'expense'; case WITHDRAWAL = 'withdrawal'; case EMPLOYEE_ADVANCE = 'employee_advance'; + case SALARY = 'salary'; public function label(): string { @@ -20,6 +21,7 @@ public function label(): string self::EXPENSE => 'Pengeluaran', self::WITHDRAWAL => 'Withdrawal', self::EMPLOYEE_ADVANCE => 'Kasbon', + self::SALARY => 'Gaji', }; } } diff --git a/app/Http/Controllers/Admin/Manage/TransactionController.php b/app/Http/Controllers/Admin/Manage/TransactionController.php index 4232edf..4ba8bcd 100644 --- a/app/Http/Controllers/Admin/Manage/TransactionController.php +++ b/app/Http/Controllers/Admin/Manage/TransactionController.php @@ -51,7 +51,7 @@ public function create(): Response 'employees' => $this->getEmployees(), 'channelOptions' => OrderChannel::toSelect(), 'paymentTypeOptions' => PaymentType::toSelect(), - 'priceTypeOptions' => PriceType::toSelect()->filter(fn ($p) => $p['value'] !== PriceType::CAPITAL->value)->values(), + 'priceTypeOptions' => PriceType::toSelect()->filter(fn ($p) => ! in_array($p['value'], [PriceType::CAPITAL->value, PriceType::REJECT_CAPITAL->value]))->values(), ]); } @@ -74,7 +74,7 @@ public function edit(Order $transaction): Response 'employees' => $this->getEmployees(), 'channelOptions' => OrderChannel::toSelect(), 'paymentTypeOptions' => PaymentType::toSelect(), - 'priceTypeOptions' => PriceType::toSelect()->filter(fn ($p) => $p['value'] !== PriceType::CAPITAL->value)->values(), + 'priceTypeOptions' => PriceType::toSelect()->filter(fn ($p) => ! in_array($p['value'], [PriceType::CAPITAL->value, PriceType::REJECT_CAPITAL->value]))->values(), ]); } diff --git a/app/Services/Admin/Finance/Payroll/PayrollPeriodService.php b/app/Services/Admin/Finance/Payroll/PayrollPeriodService.php index 4086584..d33412d 100644 --- a/app/Services/Admin/Finance/Payroll/PayrollPeriodService.php +++ b/app/Services/Admin/Finance/Payroll/PayrollPeriodService.php @@ -3,18 +3,21 @@ namespace App\Services\Admin\Finance\Payroll; use App\Concerns\HasRoleChecks; +use App\Enums\CashTransactionType; use App\Enums\PayrollPeriodStatus; use App\Enums\PayrollStatus; use App\Enums\Role; use App\Models\Payroll; use App\Models\PayrollPeriod; +use App\Services\Concerns\HandlesCashTransactions; use App\Services\NotificationService; use Illuminate\Contracts\Pagination\LengthAwarePaginator; +use Illuminate\Support\Facades\DB; use Illuminate\Validation\ValidationException; class PayrollPeriodService { - use HasRoleChecks; + use HandlesCashTransactions, HasRoleChecks; public function paginated(int $perPage = 25, string $search = '', string $sort = 'created_at', string $direction = 'desc', array $filters = [], ?int $highlight = null): LengthAwarePaginator { @@ -123,11 +126,22 @@ public function pay(Payroll $payroll): Payroll ]); } - $payroll->update([ - 'status' => PayrollStatus::PAID, - 'paid_by_id' => auth()->id(), - 'paid_at' => now(), - ]); + $payroll = DB::transaction(function () use ($payroll) { + $cashTransaction = $this->debitCash( + amount: $payroll->total_amount, + description: 'Pembayaran gaji karyawan', + type: CashTransactionType::SALARY, + ); + + $payroll->update([ + 'status' => PayrollStatus::PAID, + 'cash_transaction_id' => $cashTransaction->id, + 'paid_by_id' => auth()->id(), + 'paid_at' => now(), + ]); + + return $payroll; + }); $employeeUser = $payroll->employee->user ?? null; diff --git a/database/migrations/2026_08_16_134930_add_salary_to_cash_transactions_type_enum.php b/database/migrations/2026_08_16_134930_add_salary_to_cash_transactions_type_enum.php new file mode 100644 index 0000000..c0da4d0 --- /dev/null +++ b/database/migrations/2026_08_16_134930_add_salary_to_cash_transactions_type_enum.php @@ -0,0 +1,19 @@ +