feat(timetable): factories + ArtistTimetableDevSeeder

Eight factories with named states (Genre, Artist, ArtistContact, Stage,
ArtistEngagement, Performance, AdvanceSection, AdvanceSubmission).

ArtistTimetableDevSeeder hooked into DevSeeder::seedEchtFeesten after
the form-builder showcase. Produces:
- 4 stages (Mainstage, Havana, Stairway, Socialite) with prototype-style
  hex colours
- 4 stages × 3 sub-events = 12 stage_days rows
- 4 genres (Hardstyle, Techno, Indie, Live band)
- 6 master artists, each with one tour-manager ArtistContact
- 12 engagements with status mix (1 Draft, 2 Requested, 3 Option,
  2 Confirmed, 3 Contracted, 1 Cancelled). Two artists have two
  engagements each (different sub-events) — exercises D17 multi-
  engagement-per-artist.
- 13 performances, including one parked (stage_id=null = wachtrij)
  and one B2B pair within 3 minutes on Mainstage Saturday to seed
  the Session 4 frontend B2B detector.

Also fix LogOptions method name across 8 models: dontSubmitEmptyLogs()
→ dontLogEmptyChanges() (Spatie's actual API; surfaced when DevSeeder
ran).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-08 18:08:16 +02:00
parent 85ad45c7e9
commit 3e3636dc53
18 changed files with 588 additions and 11 deletions

View File

@@ -756,7 +756,7 @@ class DevSeeder extends Seeder
foreach ($approvedPersons->shuffle() as $person) {
$existing = $usedPersonSlots[$person->id] ?? [];
$available = $openShifts->filter(fn (Shift $shift) => !in_array($shift->time_slot_id, $existing));
$available = $openShifts->filter(fn (Shift $shift) => ! in_array($shift->time_slot_id, $existing));
if ($available->isEmpty()) {
continue;
@@ -956,6 +956,15 @@ class DevSeeder extends Seeder
FormBuilderDevSeeder::seedEventRegistrationShowcase($this->org, $festival, $this->command);
}
// RFC-TIMETABLE v0.2 — artist + timetable fixture for the
// festival (4 stages, 6 artists, 12 engagements, 13 perfs).
ArtistTimetableDevSeeder::seedForFestival(
$this->org,
$festival,
[$vrijdag, $zaterdag, $zondag],
);
$this->command->info(' Artist timetable: 4 stages, 12 stage_days, 6 artists, 12 engagements, 13 performances');
$this->command->info(' Echt Feesten 2026 complete');
});
}
@@ -1063,7 +1072,7 @@ class DevSeeder extends Seeder
'organisation_id' => $this->org->id,
'parent_event_id' => $ijsbaan->id,
'name' => $wd['name'],
'slug' => 'ijsbaan-week-' . ($i + 1),
'slug' => 'ijsbaan-week-'.($i + 1),
'start_date' => $wd['start'],
'end_date' => $wd['end'],
'timezone' => 'Europe/Amsterdam',
@@ -1192,7 +1201,7 @@ class DevSeeder extends Seeder
$this->createCrowdList($ijsbaan, 'IJsbaan Vaste Crew', CrowdListType::INTERNAL, $this->crowdTypes['CREW'], null, false, null, $approvedCrew, $bert);
$personCount = Person::where('event_id', $ijsbaan->id)->count();
$this->command->info(" {$personCount} persons, " . count($allShifts) . ' shifts created');
$this->command->info(" {$personCount} persons, ".count($allShifts).' shifts created');
$formSchema = FormBuilderDevSeeder::seedEventSchema($ijsbaan);
$submissions = FormBuilderDevSeeder::seedSubmissionsForEvent($ijsbaan, $formSchema);