initial
All checks were successful
linter / quality (push) Successful in 1m37s
tests / ci (8.4) (push) Successful in 2m13s
tests / ci (8.5) (push) Successful in 1m25s

This commit is contained in:
Tim Basten
2026-03-05 11:41:39 +08:00
commit 564f78dcda
182 changed files with 21145 additions and 0 deletions

View File

@@ -0,0 +1,22 @@
<?php
namespace Database\Factories;
use App\Models\ApprovalWorkflow;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\ApprovalStep>
*/
class ApprovalStepFactory extends Factory
{
public function definition(): array
{
return [
'workflow_id' => ApprovalWorkflow::factory(),
'order' => fake()->numberBetween(1, 5),
'name' => fake()->words(2, true),
'role' => fake()->randomElement(['travel_approver', 'administrator']),
];
}
}

View File

@@ -0,0 +1,25 @@
<?php
namespace Database\Factories;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\ApprovalWorkflow>
*/
class ApprovalWorkflowFactory extends Factory
{
public function definition(): array
{
return [
'name' => fake()->words(3, true),
'description' => fake()->sentence(),
'is_active' => true,
];
}
public function inactive(): static
{
return $this->state(['is_active' => false]);
}
}

View File

@@ -0,0 +1,22 @@
<?php
namespace Database\Factories;
use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\EmergencyContact>
*/
class EmergencyContactFactory extends Factory
{
public function definition(): array
{
return [
'user_id' => User::factory(),
'full_name' => fake()->name(),
'phone_number' => fake()->phoneNumber(),
'relationship' => fake()->randomElement(['Spouse', 'Parent', 'Sibling', 'Friend']),
];
}
}

View File

@@ -0,0 +1,23 @@
<?php
namespace Database\Factories;
use App\Models\TravelRequest;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\TravelCostCode>
*/
class TravelCostCodeFactory extends Factory
{
public function definition(): array
{
return [
'travel_request_id' => TravelRequest::factory(),
'business_unit' => strtoupper(fake()->lexify('BU???')),
'project_grant' => fake()->optional()->numerify('PG-#####'),
'account_code' => strtoupper(fake()->lexify('AC????')),
'class_code' => fake()->optional()->numerify('CC###'),
];
}
}

View File

@@ -0,0 +1,25 @@
<?php
namespace Database\Factories;
use App\Enums\JourneyMethod;
use App\Models\TravelRequest;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\TravelJourney>
*/
class TravelJourneyFactory extends Factory
{
public function definition(): array
{
return [
'travel_request_id' => TravelRequest::factory(),
'origin' => fake()->city(),
'destination' => fake()->city(),
'date' => fake()->dateTimeBetween('+1 week', '+3 months')->format('Y-m-d'),
'time' => fake()->time('H:i'),
'method' => fake()->randomElement(JourneyMethod::cases()),
];
}
}

View File

@@ -0,0 +1,46 @@
<?php
namespace Database\Factories;
use App\Enums\ApprovalStatus;
use App\Models\ApprovalStep;
use App\Models\TravelRequest;
use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\TravelRequestApproval>
*/
class TravelRequestApprovalFactory extends Factory
{
public function definition(): array
{
return [
'travel_request_id' => TravelRequest::factory(),
'approval_step_id' => ApprovalStep::factory(),
'approver_id' => null,
'status' => ApprovalStatus::Pending,
'comments' => null,
'acted_at' => null,
];
}
public function approved(): static
{
return $this->state([
'status' => ApprovalStatus::Approved,
'approver_id' => User::factory(),
'acted_at' => now(),
]);
}
public function rejected(): static
{
return $this->state([
'status' => ApprovalStatus::Rejected,
'approver_id' => User::factory(),
'comments' => fake()->sentence(),
'acted_at' => now(),
]);
}
}

View File

@@ -0,0 +1,59 @@
<?php
namespace Database\Factories;
use App\Enums\EventType;
use App\Enums\GeneralType;
use App\Enums\TravelStatus;
use App\Models\ApprovalWorkflow;
use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\TravelRequest>
*/
class TravelRequestFactory extends Factory
{
public function definition(): array
{
return [
'user_id' => User::factory(),
'workflow_id' => null,
'status' => TravelStatus::Draft,
'reason_summary' => fake()->paragraph(),
'event_type' => fake()->randomElement([null, EventType::Conference, EventType::AnnualInPersonMeeting]),
'general_type' => null,
'needs_accommodation' => fake()->boolean(),
'needs_car_hire' => fake()->boolean(),
'vehicle_policy_acknowledged' => false,
'business_days' => fake()->numberBetween(1, 5),
'private_days' => fake()->numberBetween(0, 3),
'additional_notes' => fake()->optional()->sentence(),
'submitted_at' => null,
];
}
public function pending(): static
{
return $this->state([
'status' => TravelStatus::Pending,
'submitted_at' => now(),
]);
}
public function approved(): static
{
return $this->state([
'status' => TravelStatus::Approved,
'submitted_at' => now(),
]);
}
public function rejected(): static
{
return $this->state([
'status' => TravelStatus::Rejected,
'submitted_at' => now(),
]);
}
}

View File

@@ -0,0 +1,48 @@
<?php
namespace Database\Factories;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
/**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\User>
*/
class UserFactory extends Factory
{
/**
* The current password being used by the factory.
*/
protected static ?string $password;
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'name' => fake()->name(),
'email' => fake()->unique()->safeEmail(),
'email_verified_at' => now(),
'password' => static::$password ??= Hash::make('password'),
'remember_token' => Str::random(10),
'username' => fake()->unique()->userName(),
'phone' => fake()->phoneNumber(),
'department' => fake()->randomElement(['Medicine', 'Nursing', 'Allied Health', 'Administration']),
'title' => fake()->jobTitle(),
];
}
/**
* Indicate that the model's email address should be unverified.
*/
public function unverified(): static
{
return $this->state(fn (array $attributes) => [
'email_verified_at' => null,
]);
}
}