feat: Add factories for various models including Announcement, Category, Cooperation, and more for testing and seeding purposes.

This commit is contained in:
Yoga Pangestu 2026-03-17 22:25:31 +07:00
parent 9ac837f354
commit 93f5404d30
33 changed files with 1033 additions and 0 deletions

View File

@ -0,0 +1,27 @@
<?php
namespace Database\Factories;
use App\Enums\AnnouncementType;
use App\Models\Announcement;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<Announcement>
*/
class AnnouncementFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'title' => fake()->sentence(),
'content' => fake()->paragraphs(3, true),
'type' => AnnouncementType::PUBLIC,
];
}
}

View File

@ -0,0 +1,27 @@
<?php
namespace Database\Factories;
use App\Models\Announcement;
use App\Models\AnnouncementMedia;
use App\Models\PartnerMedia;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<AnnouncementMedia>
*/
class AnnouncementMediaFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'announcement_id' => Announcement::factory(),
'partner_media_id' => PartnerMedia::factory(),
];
}
}

View File

@ -0,0 +1,26 @@
<?php
namespace Database\Factories;
use App\Enums\IsActive;
use App\Models\Category;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<Category>
*/
class CategoryFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'name' => fake()->unique()->word(),
'is_active' => IsActive::ACTIVE,
];
}
}

View File

@ -0,0 +1,27 @@
<?php
namespace Database\Factories;
use App\Models\Category;
use App\Models\CategoryNews;
use App\Models\News;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<CategoryNews>
*/
class CategoryNewsFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'category_id' => Category::factory(),
'news_id' => News::factory(),
];
}
}

View File

@ -0,0 +1,41 @@
<?php
namespace Database\Factories;
use App\Enums\IsActive;
use App\Models\Classification;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<Classification>
*/
class ClassificationFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'name' => $this->faker->unique()->sentence(2),
'description' => $this->faker->paragraph(),
'is_active' => IsActive::ACTIVE,
];
}
public function active(): static
{
return $this->state(fn (array $attributes) => [
'is_active' => IsActive::ACTIVE,
]);
}
public function inactive(): static
{
return $this->state(fn (array $attributes) => [
'is_active' => IsActive::INACTIVE,
]);
}
}

View File

@ -0,0 +1,38 @@
<?php
namespace Database\Factories;
use App\Models\Company;
use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<Company>
*/
class CompanyFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'user_id' => User::factory(),
'name' => fake()->company(),
'email' => fake()->unique()->companyEmail(),
'phone_number' => fake()->phoneNumber(),
'address' => fake()->address(),
'director_name' => fake()->name(),
'director_nik' => fake()->numerify('################'),
'deed_incorporation' => fake()->numerify('DEED-####'),
'trade_license' => fake()->numerify('NIB-####'),
'tax_id_number' => fake()->numerify('NPWP-####'),
'taxable_enterprise' => fake()->numerify('PKP-####'),
'annual_tax_return' => fake()->numerify('SPT-####'),
'domicile_certificate' => fake()->numerify('DOM-####'),
'profile' => fake()->sentence(),
];
}
}

View File

@ -0,0 +1,27 @@
<?php
namespace Database\Factories;
use App\Models\Contact;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<Contact>
*/
class ContactFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'name' => fake()->name(),
'email' => fake()->safeEmail(),
'subject' => fake()->sentence(),
'message' => fake()->paragraph(),
];
}
}

View File

@ -0,0 +1,34 @@
<?php
namespace Database\Factories;
use App\Enums\Channel;
use App\Enums\ContentType;
use App\Enums\SocialMedia;
use App\Models\Classification;
use App\Models\ContentRecap;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<ContentRecap>
*/
class ContentRecapFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'classification_id' => Classification::factory(),
'title' => fake()->sentence(),
'link' => fake()->url(),
'posting_date' => fake()->date(),
'type' => ContentType::FOTO,
'channel' => Channel::WEBSITE,
'social_media' => SocialMedia::DISKOMINFO_PURWAKARTA,
];
}
}

View File

@ -0,0 +1,29 @@
<?php
namespace Database\Factories;
use App\Enums\CooperationStatus;
use App\Models\Cooperation;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<Cooperation>
*/
class CooperationFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'title' => fake()->sentence(),
'initial_submission_date' => fake()->date(),
'final_submission_date' => fake()->date(),
'description' => fake()->paragraph(),
'status' => CooperationStatus::PENDING,
];
}
}

View File

@ -0,0 +1,29 @@
<?php
namespace Database\Factories;
use App\Enums\ApprovalStatus;
use App\Models\Cooperation;
use App\Models\CooperationMedia;
use App\Models\PartnerMedia;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<CooperationMedia>
*/
class CooperationMediaFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'cooperation_id' => Cooperation::factory(),
'partner_media_id' => PartnerMedia::factory(),
'status' => ApprovalStatus::PENDING,
];
}
}

View File

@ -0,0 +1,27 @@
<?php
namespace Database\Factories;
use App\Models\CooperationMedia;
use App\Models\CooperationPayment;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<CooperationPayment>
*/
class CooperationPaymentFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'cooperation_media_id' => CooperationMedia::factory(),
'amount' => fake()->numberBetween(100000, 10000000),
'payment_date' => fake()->date(),
];
}
}

View File

@ -0,0 +1,30 @@
<?php
namespace Database\Factories;
use App\Enums\ApprovalStatus;
use App\Models\Cooperation;
use App\Models\CooperationProposal;
use App\Models\PartnerMedia;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<CooperationProposal>
*/
class CooperationProposalFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'cooperation_id' => Cooperation::factory(),
'partner_media_id' => PartnerMedia::factory(),
'description' => fake()->paragraph(),
'status' => ApprovalStatus::PENDING,
];
}
}

View File

@ -0,0 +1,33 @@
<?php
namespace Database\Factories;
use App\Enums\DataChangeStatus;
use App\Models\Company;
use App\Models\DataChangeRequest;
use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<DataChangeRequest>
*/
class DataChangeRequestFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'user_id' => User::factory(),
'entity_type' => Company::class,
'entity_id' => Company::factory(),
'status' => DataChangeStatus::PENDING,
'old_data' => [],
'new_data' => ['name' => 'New Company Name'],
'change_reason' => fake()->sentence(),
];
}
}

View File

@ -0,0 +1,30 @@
<?php
namespace Database\Factories;
use App\Enums\DataChangeDecision;
use App\Models\DataChangeRequest;
use App\Models\DataChangeReview;
use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<DataChangeReview>
*/
class DataChangeReviewFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'data_change_request_id' => DataChangeRequest::factory(),
'reviewer_id' => User::factory(),
'decision' => DataChangeDecision::APPROVED,
'note' => fake()->sentence(),
];
}
}

View File

@ -0,0 +1,27 @@
<?php
namespace Database\Factories;
use App\Enums\IsActive;
use App\Models\Department;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<Department>
*/
class DepartmentFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'name' => fake()->unique()->words(2, true),
'alias' => strtoupper(fake()->unique()->lexify('???')),
'is_active' => IsActive::ACTIVE,
];
}
}

View File

@ -0,0 +1,33 @@
<?php
namespace Database\Factories;
use App\Enums\IssueSentiment;
use App\Models\Classification;
use App\Models\IssueManagement;
use App\Models\Location;
use App\Models\MediaMonitoring;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<IssueManagement>
*/
class IssueManagementFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'location_id' => Location::factory(),
'classification_id' => Classification::factory(),
'media_monitoring_id' => MediaMonitoring::factory(),
'issue' => IssueSentiment::NEUTRAL,
'response' => IssueSentiment::NEUTRAL,
'description' => fake()->paragraph(),
];
}
}

View File

@ -0,0 +1,28 @@
<?php
namespace Database\Factories;
use App\Models\Journalist;
use App\Models\PartnerMedia;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<Journalist>
*/
class JournalistFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'partner_media_id' => PartnerMedia::factory(),
'name' => fake()->name(),
'email' => fake()->unique()->safeEmail(),
'phone_number' => fake()->phoneNumber(),
];
}
}

View File

@ -0,0 +1,27 @@
<?php
namespace Database\Factories;
use App\Enums\IsActive;
use App\Models\Location;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<Location>
*/
class LocationFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'name' => fake()->unique()->city(),
'description' => fake()->sentence(),
'is_active' => IsActive::ACTIVE,
];
}
}

View File

@ -0,0 +1,32 @@
<?php
namespace Database\Factories;
use App\Enums\Channel;
use App\Models\MediaMonitoring;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<MediaMonitoring>
*/
class MediaMonitoringFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'code' => fake()->lexify('??????'),
'media_name' => fake()->company(),
'title' => fake()->sentence(),
'channel' => Channel::WEBSITE,
'writter' => fake()->name(),
'content' => fake()->paragraph(),
'keyword' => fake()->word(),
'release_date' => fake()->date(),
];
}
}

View File

@ -0,0 +1,27 @@
<?php
namespace Database\Factories;
use App\Models\MediaMonitoring;
use App\Models\MediaMonitoringTheme;
use App\Models\Theme;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<MediaMonitoringTheme>
*/
class MediaMonitoringThemeFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'media_monitoring_id' => MediaMonitoring::factory(),
'theme_id' => Theme::factory(),
];
}
}

View File

@ -0,0 +1,29 @@
<?php
namespace Database\Factories;
use App\Enums\ApprovalStatus;
use App\Models\MediaTaskAssignment;
use App\Models\PartnerMedia;
use App\Models\TaskAssignment;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<MediaTaskAssignment>
*/
class MediaTaskAssignmentFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'task_assignment_id' => TaskAssignment::factory(),
'partner_media_id' => PartnerMedia::factory(),
'status' => ApprovalStatus::PENDING,
];
}
}

View File

@ -0,0 +1,35 @@
<?php
namespace Database\Factories;
use App\Enums\NewsStatus;
use App\Models\News;
use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;
/**
* @extends Factory<News>
*/
class NewsFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
$title = fake()->sentence();
return [
'author_id' => User::factory(),
'title' => $title,
'slug' => Str::slug($title),
'content' => fake()->paragraphs(5, true),
'excerpt' => fake()->sentence(),
'status' => NewsStatus::DRAFT,
'views' => 0,
];
}
}

View File

@ -0,0 +1,32 @@
<?php
namespace Database\Factories;
use App\Enums\MediaClassification;
use App\Enums\MediaType;
use App\Models\Company;
use App\Models\PartnerMedia;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<PartnerMedia>
*/
class PartnerMediaFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'company_id' => Company::factory(),
'name' => fake()->company(),
'address' => fake()->address(),
'link' => fake()->url(),
'type' => MediaType::ONLINE,
'classification' => MediaClassification::LOCAL,
];
}
}

View File

@ -0,0 +1,27 @@
<?php
namespace Database\Factories;
use App\Models\Cooperation;
use App\Models\RejectionReason;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<RejectionReason>
*/
class RejectionReasonFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'rejectable_type' => Cooperation::class,
'rejectable_id' => Cooperation::factory(),
'reason' => fake()->sentence(),
];
}
}

View File

@ -0,0 +1,31 @@
<?php
namespace Database\Factories;
use App\Enums\ApprovalStatus;
use App\Models\MediaTaskAssignment;
use App\Models\Report;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<Report>
*/
class ReportFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'media_task_assignment_id' => MediaTaskAssignment::factory(),
'title' => fake()->sentence(),
'publication_date' => fake()->date(),
'link' => fake()->url(),
'description' => fake()->paragraph(),
'status' => ApprovalStatus::PENDING,
];
}
}

View File

@ -0,0 +1,29 @@
<?php
namespace Database\Factories;
use App\Enums\IsActive;
use App\Models\Classification;
use App\Models\SubClassification;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<SubClassification>
*/
class SubClassificationFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'classification_id' => Classification::factory(),
'name' => fake()->unique()->word(),
'description' => fake()->sentence(),
'is_active' => IsActive::ACTIVE,
];
}
}

View File

@ -0,0 +1,29 @@
<?php
namespace Database\Factories;
use App\Enums\IsActive;
use App\Models\Location;
use App\Models\SubLocation;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<SubLocation>
*/
class SubLocationFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'location_id' => Location::factory(),
'name' => fake()->unique()->word(),
'description' => fake()->sentence(),
'is_active' => IsActive::ACTIVE,
];
}
}

View File

@ -0,0 +1,29 @@
<?php
namespace Database\Factories;
use App\Models\Cooperation;
use App\Models\TaskAssignment;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<TaskAssignment>
*/
class TaskAssignmentFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'cooperation_id' => Cooperation::factory(),
'start_date' => fake()->date(),
'end_date' => fake()->date(),
'task_description' => fake()->paragraph(),
'report_amount' => fake()->numberBetween(1, 10),
];
}
}

View File

@ -0,0 +1,26 @@
<?php
namespace Database\Factories;
use App\Enums\IsActive;
use App\Models\Theme;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<Theme>
*/
class ThemeFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'name' => fake()->unique()->word(),
'is_active' => IsActive::ACTIVE,
];
}
}

View File

@ -0,0 +1,48 @@
<?php
namespace Database\Factories;
use App\Enums\IsActive;
use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
/**
* @extends Factory<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(),
'username' => Str::random(10),
'email_verified_at' => now(),
'password' => static::$password ??= Hash::make('password'),
'remember_token' => Str::random(10),
'is_active' => IsActive::ACTIVE,
];
}
/**
* Indicate that the model's email address should be unverified.
*/
public function unverified(): static
{
return $this->state(fn (array $attributes) => [
'email_verified_at' => null,
]);
}
}

View File

@ -0,0 +1,57 @@
<?php
namespace Database\Factories;
use App\Enums\VerificationStatus;
use App\Models\Company;
use App\Models\User;
use App\Models\VerificationRequest;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<VerificationRequest>
*/
class VerificationRequestFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'company_id' => Company::factory(),
'submitted_by' => User::factory(),
'status' => VerificationStatus::PENDING,
];
}
public function pending(): static
{
return $this->state(fn (array $attributes) => [
'status' => VerificationStatus::PENDING,
]);
}
public function approved(): static
{
return $this->state(fn (array $attributes) => [
'status' => VerificationStatus::APPROVED,
]);
}
public function rejected(): static
{
return $this->state(fn (array $attributes) => [
'status' => VerificationStatus::REJECTED,
]);
}
public function needRevision(): static
{
return $this->state(fn (array $attributes) => [
'status' => VerificationStatus::NEED_REVISION,
]);
}
}

View File

@ -0,0 +1,30 @@
<?php
namespace Database\Factories;
use App\Enums\DecisionAdmin;
use App\Models\User;
use App\Models\VerificationRequest;
use App\Models\VerificationReview;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<VerificationReview>
*/
class VerificationReviewFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'verification_request_id' => VerificationRequest::factory(),
'reviewer_id' => User::factory(),
'decision' => DecisionAdmin::APPROVED,
'note' => fake()->sentence(),
];
}
}

View File

@ -0,0 +1,32 @@
<?php
namespace Database\Factories;
use App\Models\User;
use App\Models\Visitor;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<Visitor>
*/
class VisitorFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'user_id' => User::factory(),
'method' => 'GET',
'route' => 'home',
'parameters' => [],
'status' => 200,
'ip' => fake()->ipv4(),
'date' => now(),
'counter' => 1,
];
}
}