*/ class CouponFactory extends Factory { /** * Define the model's default state. * * @return array */ public function definition(): array { $type = fake()->randomElement(['percentage', 'fixed']); $value = $type === 'percentage' ? fake()->numberBetween(5, 50) : fake()->randomFloat(2, 5, 100); return [ 'code' => strtoupper(fake()->lexify('??????')), 'name' => fake()->words(3, true), 'description' => fake()->sentence(), 'type' => $type, 'value' => $value, 'minimum_amount' => fake()->optional(0.7)->randomFloat(2, 10, 500), 'max_uses' => fake()->optional(0.6)->numberBetween(10, 1000), 'uses_count' => 0, 'max_uses_per_user' => fake()->optional(0.5)->numberBetween(1, 5), 'starts_at' => fake()->optional(0.3)->dateTimeBetween('-1 week', 'now'), 'expires_at' => fake()->optional(0.8)->dateTimeBetween('now', '+6 months'), 'is_active' => true, 'metadata' => fake()->optional(0.2)->randomElements([ 'created_by_admin' => fake()->boolean(), 'campaign' => fake()->word(), 'region' => fake()->countryCode(), ]), ]; } /** * Create a percentage-based coupon */ public function percentage(): static { return $this->state(fn (array $attributes) => [ 'type' => 'percentage', 'value' => fake()->numberBetween(5, 50), ]); } /** * Create a fixed amount coupon */ public function fixed(): static { return $this->state(fn (array $attributes) => [ 'type' => 'fixed', 'value' => fake()->randomFloat(2, 5, 100), ]); } /** * Create an expired coupon */ public function expired(): static { return $this->state(fn (array $attributes) => [ 'expires_at' => fake()->dateTimeBetween('-1 month', '-1 day'), ]); } /** * Create an inactive coupon */ public function inactive(): static { return $this->state(fn (array $attributes) => [ 'is_active' => false, ]); } /** * Create a coupon with usage limits */ public function withUsageLimit(): static { return $this->state(fn (array $attributes) => [ 'max_uses' => fake()->numberBetween(10, 100), 'max_uses_per_user' => fake()->numberBetween(1, 3), ]); } /** * Create a coupon with minimum amount requirement */ public function withMinimumAmount(): static { return $this->state(fn (array $attributes) => [ 'minimum_amount' => fake()->randomFloat(2, 25, 200), ]); } }