diff --git a/database/factories/PayrollAdjustmentFactory.php b/database/factories/PayrollAdjustmentFactory.php new file mode 100644 index 0000000..79e7db3 --- /dev/null +++ b/database/factories/PayrollAdjustmentFactory.php @@ -0,0 +1,33 @@ + + */ +class PayrollAdjustmentFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + $type = fake()->randomElement(SalaryAdjustmentType::cases()); + + return [ + 'payroll_id' => Payroll::factory(), + 'type' => $type, + 'description' => $type === SalaryAdjustmentType::BONUS + ? fake()->randomElement(['Lembur', 'Bonus Target', 'Bonus Tahunan', 'Tunjangan Transport']) + : fake()->randomElement(['Keterlambatan', 'Kasbon', 'BPJS', 'Pajak']), + 'amount' => fake()->numberBetween(10000, 200000), + ]; + } +} diff --git a/database/factories/PayrollFactory.php b/database/factories/PayrollFactory.php new file mode 100644 index 0000000..02ac764 --- /dev/null +++ b/database/factories/PayrollFactory.php @@ -0,0 +1,38 @@ + + */ +class PayrollFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + $baseSalary = fake()->numberBetween(2500000, 5000000); + $bonus = fake()->optional(0.7, 0)->passthrough(fake()->numberBetween(100000, 500000)); + $deduction = fake()->optional(0.3, 0)->passthrough(fake()->numberBetween(50000, 200000)); + $totalSalary = $baseSalary + $bonus - $deduction; + $isPaid = fake()->boolean(80); + + return [ + 'user_id' => User::factory(), + 'period_month' => fake()->dateTimeBetween('-1 year', 'now')->format('Y-m'), + 'base_salary' => $baseSalary, + 'bonus' => $bonus, + 'deduction' => $deduction, + 'total_salary' => $totalSalary, + 'is_paid' => $isPaid, + 'paid_at' => $isPaid ? fake()->dateTimeBetween('-1 month', 'now') : null, + ]; + } +} diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 839189e..0d22859 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -20,6 +20,7 @@ public function run(): void ExpenseSeeder::class, PurchaseSeeder::class, OrderSeeder::class, + PayrollSeeder::class, GeneralSettingSeeder::class, ]); } diff --git a/database/seeders/PayrollSeeder.php b/database/seeders/PayrollSeeder.php new file mode 100644 index 0000000..4bcf866 --- /dev/null +++ b/database/seeders/PayrollSeeder.php @@ -0,0 +1,56 @@ +isEmpty()) { + $users = User::factory(5)->create(); + } + + // Generate payroll for the last 6 months + $months = collect(range(0, 5))->map(function ($i) { + return Carbon::now()->subMonths($i)->format('Y-m'); + }); + + foreach ($users as $user) { + foreach ($months as $month) { + if (Payroll::where('user_id', $user->id)->where('period_month', $month)->exists()) { + continue; + } + + $payroll = Payroll::factory()->create([ + 'user_id' => $user->id, + 'period_month' => $month, + ]); + + PayrollAdjustment::factory(rand(1, 3))->create([ + 'payroll_id' => $payroll->id, + ]); + + $bonus = $payroll->adjustments()->where('type', SalaryAdjustmentType::BONUS)->sum('amount'); + $deduction = $payroll->adjustments()->where('type', SalaryAdjustmentType::DEDUCTION)->sum('amount'); + + $payroll->update([ + 'bonus' => $bonus, + 'deduction' => $deduction, + 'total_salary' => $payroll->base_salary + $bonus - $deduction, + ]); + } + } + } +}