Projects/3BIT/winter-semester/IIS/xnecasr00/database/factories/HarvestFactory.php
2026-04-14 19:28:46 +02:00

120 lines
3.6 KiB
PHP

<?php
namespace Database\Factories;
use App\Models\Harvest;
use App\Models\VineyardRow;
use App\Models\VarietyVariation;
use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Harvest>
*/
class HarvestFactory extends Factory
{
protected $model = Harvest::class;
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
$qualities = ['excellent', 'good', 'fair', 'poor'];
$conditions = ['healthy', 'slightly damaged', 'botrytis', 'overripe'];
$weatherConditions = [
'Sunny, 20°C',
'Sunny, 22°C',
'Partly cloudy, 18°C',
'Overcast, 16°C',
'Clear sky, 24°C',
'Light rain, 14°C'
];
return [
'vineyard_row_id' => VineyardRow::factory(),
'variety_variation_id' => VarietyVariation::factory(),
'user_id' => User::factory(),
'weight' => fake()->randomFloat(2, 300.0, 1200.0),
'sugar_content' => fake()->randomFloat(2, 16.0, 26.0),
'date' => fake()->dateTimeBetween('-1 year', 'now'),
'quality' => fake()->randomElement($qualities),
'grape_condition' => fake()->randomElement($conditions),
'notes' => fake()->optional()->sentence(12),
'weather_conditions' => fake()->randomElement($weatherConditions),
'harvest_time' => fake()->time('H:i:s'),
];
}
/**
* Indicate that the harvest is of excellent quality.
*/
public function excellent(): static
{
return $this->state(fn (array $attributes) => [
'quality' => 'excellent',
'grape_condition' => 'healthy',
]);
}
/**
* Indicate that the harvest is recent.
*/
public function recent(): static
{
return $this->state(fn (array $attributes) => [
'date' => fake()->dateTimeBetween('-3 months', 'now'),
]);
}
/**
* Keep the harvest aligned with its vineyard row's variation.
*/
public function configure(): static
{
return $this->afterMaking(function (Harvest $harvest) {
$row = $harvest->relationLoaded('vineyardRow') ? $harvest->vineyardRow : null;
if (! $row && $harvest->vineyard_row_id) {
$row = VineyardRow::find($harvest->vineyard_row_id);
if ($row) {
$harvest->setRelation('vineyardRow', $row);
}
}
if ($row) {
$harvest->variety_variation_id = $row->variety_variation_id;
return;
}
$variationId = $this->normalizeVarietyVariationId($harvest->variety_variation_id);
if (! $variationId) {
$variation = VarietyVariation::factory()->create();
$variationId = $variation->getKey();
$harvest->variety_variation_id = $variationId;
} else {
$harvest->variety_variation_id = $variationId;
}
$row = VineyardRow::factory()->create([
'variety_variation_id' => $harvest->variety_variation_id,
]);
$harvest->vineyard_row_id = $row->getKey();
$harvest->setRelation('vineyardRow', $row);
});
}
private function normalizeVarietyVariationId(mixed $value): ?int
{
if ($value instanceof VarietyVariation) {
return $value->getKey();
}
return $value !== null ? (int) $value : null;
}
}