die tenant admin oauth authentifizierung wurde implementiert und funktioniert jetzt. Zudem wurde das marketing frontend dashboard implementiert.
This commit is contained in:
@@ -7,79 +7,216 @@ use App\Models\EventPackage;
|
||||
use App\Models\EventType;
|
||||
use App\Models\Package;
|
||||
use App\Models\PackagePurchase;
|
||||
use App\Models\Task;
|
||||
use App\Models\TaskCollection;
|
||||
use App\Models\Tenant;
|
||||
use App\Services\EventJoinTokenService;
|
||||
use Illuminate\Database\Seeder;
|
||||
use Illuminate\Support\Carbon;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
class DemoEventSeeder extends Seeder
|
||||
{
|
||||
public function run(): void
|
||||
{
|
||||
$type = EventType::where('slug', 'wedding')->first();
|
||||
if (! $type) {
|
||||
return;
|
||||
}
|
||||
$demoTenant = Tenant::where('slug', 'demo-tenant')->first();
|
||||
if (! $demoTenant) {
|
||||
return;
|
||||
}
|
||||
$event = Event::updateOrCreate(['slug' => 'demo-wedding-2025'], [
|
||||
'tenant_id' => $demoTenant->id,
|
||||
'name' => ['de' => 'Demo Hochzeit 2025', 'en' => 'Demo Wedding 2025'],
|
||||
'description' => ['de' => 'Demo-Event', 'en' => 'Demo event'],
|
||||
'date' => now()->addMonths(3)->toDateString(),
|
||||
'event_type_id' => $type->id,
|
||||
'status' => 'published',
|
||||
'is_active' => true,
|
||||
'settings' => json_encode([]),
|
||||
'default_locale' => 'de',
|
||||
]);
|
||||
|
||||
if ($event->joinTokens()->count() === 0) {
|
||||
/** @var EventJoinTokenService $service */
|
||||
$service = app(EventJoinTokenService::class);
|
||||
$service->createToken($event, [
|
||||
'label' => 'Demo QR',
|
||||
]);
|
||||
}
|
||||
$weddingType = EventType::where('slug', 'wedding')->first();
|
||||
$corporateType = EventType::where('slug', 'corporate')->first();
|
||||
|
||||
$package = Package::where('slug', 'standard')->first();
|
||||
if (! $package) {
|
||||
$package = Package::where('type', 'endcustomer')->orderBy('price')->first();
|
||||
}
|
||||
$standardPackage = Package::where('slug', 'standard')->first()
|
||||
?? Package::where('type', 'endcustomer')->orderBy('price')->first();
|
||||
$premiumPackage = Package::where('slug', 'premium')->first()
|
||||
?? Package::where('type', 'endcustomer')->orderByDesc('price')->first();
|
||||
|
||||
if ($package) {
|
||||
$eventPackageData = [
|
||||
'purchased_price' => $package->price,
|
||||
'purchased_at' => now()->subDays(7),
|
||||
];
|
||||
|
||||
if (Schema::hasColumn('event_packages', 'used_photos')) {
|
||||
$eventPackageData['used_photos'] = 0;
|
||||
}
|
||||
if (Schema::hasColumn('event_packages', 'used_guests')) {
|
||||
$eventPackageData['used_guests'] = 0;
|
||||
}
|
||||
if (Schema::hasColumn('event_packages', 'gallery_expires_at')) {
|
||||
$eventPackageData['gallery_expires_at'] = now()->addDays($package->gallery_days ?? 30);
|
||||
}
|
||||
|
||||
EventPackage::updateOrCreate(
|
||||
[
|
||||
'event_id' => $event->id,
|
||||
'package_id' => $package->id,
|
||||
$events = [
|
||||
[
|
||||
'slug' => 'demo-wedding-2025',
|
||||
'name' => ['de' => 'Demo Hochzeit 2025', 'en' => 'Demo Wedding 2025'],
|
||||
'description' => ['de' => 'Demo-Event', 'en' => 'Demo event'],
|
||||
'date' => Carbon::now()->addMonths(3),
|
||||
'event_type' => $weddingType,
|
||||
'package' => $standardPackage,
|
||||
'token_label' => 'Demo QR',
|
||||
'collection_slugs' => ['wedding-classics-2025'],
|
||||
'task_slug_prefix' => 'wedding-',
|
||||
'branding' => [
|
||||
'primary_color' => '#f43f5e',
|
||||
'secondary_color' => '#fb7185',
|
||||
'background_color' => '#fff7f4',
|
||||
'font_family' => 'Playfair Display, serif',
|
||||
],
|
||||
$eventPackageData
|
||||
],
|
||||
[
|
||||
'slug' => 'demo-corporate-2025',
|
||||
'name' => ['de' => 'Demo Firmen-Event 2025', 'en' => 'Demo Corporate Summit 2025'],
|
||||
'description' => ['de' => 'Launch-Event mit Networking', 'en' => 'Launch event with networking sessions'],
|
||||
'date' => Carbon::now()->addMonths(2),
|
||||
'event_type' => $corporateType,
|
||||
'package' => $premiumPackage,
|
||||
'token_label' => 'Corporate QR',
|
||||
'collection_slugs' => ['corporate-classics-2025'],
|
||||
'task_slug_prefix' => 'corporate-',
|
||||
'branding' => [
|
||||
'primary_color' => '#0ea5e9',
|
||||
'secondary_color' => '#2563eb',
|
||||
'background_color' => '#0f172a',
|
||||
'font_family' => 'Inter, sans-serif',
|
||||
],
|
||||
],
|
||||
];
|
||||
|
||||
foreach ($events as $config) {
|
||||
if (! $config['event_type'] || ! $config['package']) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$event = Event::updateOrCreate(
|
||||
['slug' => $config['slug']],
|
||||
[
|
||||
'tenant_id' => $demoTenant->id,
|
||||
'name' => $config['name'],
|
||||
'description' => $config['description'],
|
||||
'date' => $config['date']->toDateString(),
|
||||
'event_type_id' => $config['event_type']->id,
|
||||
'status' => 'published',
|
||||
'is_active' => true,
|
||||
'settings' => [
|
||||
'branding' => $config['branding'],
|
||||
],
|
||||
'default_locale' => 'de',
|
||||
]
|
||||
);
|
||||
|
||||
PackagePurchase::query()
|
||||
->where('tenant_id', $demoTenant->id)
|
||||
->where('package_id', $package->id)
|
||||
->where('provider_id', 'demo-seed')
|
||||
->update([
|
||||
'event_id' => $event->id,
|
||||
]);
|
||||
$this->ensureJoinToken($event, $config['token_label']);
|
||||
|
||||
$this->attachEventPackage(
|
||||
event: $event,
|
||||
package: $config['package'],
|
||||
tenant: $demoTenant,
|
||||
providerId: 'demo-seed-'.$config['slug'],
|
||||
purchasedAt: Carbon::now()->subDays(7)
|
||||
);
|
||||
|
||||
$this->attachTaskCollections($event, $config['collection_slugs']);
|
||||
$this->attachEventTasks($event, $config['task_slug_prefix']);
|
||||
}
|
||||
}
|
||||
|
||||
private function ensureJoinToken(Event $event, string $label): void
|
||||
{
|
||||
if ($event->joinTokens()->exists()) {
|
||||
return;
|
||||
}
|
||||
|
||||
app(EventJoinTokenService::class)->createToken($event, ['label' => $label]);
|
||||
}
|
||||
|
||||
private function attachEventPackage(Event $event, Package $package, Tenant $tenant, string $providerId, Carbon $purchasedAt): void
|
||||
{
|
||||
$eventPackageData = [
|
||||
'purchased_price' => $package->price,
|
||||
'purchased_at' => $purchasedAt,
|
||||
];
|
||||
|
||||
if (Schema::hasColumn('event_packages', 'used_photos')) {
|
||||
$eventPackageData['used_photos'] = 0;
|
||||
}
|
||||
|
||||
if (Schema::hasColumn('event_packages', 'used_guests')) {
|
||||
$eventPackageData['used_guests'] = 0;
|
||||
}
|
||||
|
||||
if (Schema::hasColumn('event_packages', 'gallery_expires_at')) {
|
||||
$eventPackageData['gallery_expires_at'] = $purchasedAt->copy()->addDays($package->gallery_days ?? 30);
|
||||
}
|
||||
|
||||
EventPackage::updateOrCreate(
|
||||
[
|
||||
'event_id' => $event->id,
|
||||
'package_id' => $package->id,
|
||||
],
|
||||
$eventPackageData
|
||||
);
|
||||
|
||||
PackagePurchase::updateOrCreate(
|
||||
[
|
||||
'tenant_id' => $tenant->id,
|
||||
'package_id' => $package->id,
|
||||
'provider_id' => $providerId,
|
||||
],
|
||||
[
|
||||
'event_id' => $event->id,
|
||||
'price' => $package->price,
|
||||
'type' => $package->type === 'reseller' ? 'reseller_subscription' : 'endcustomer_event',
|
||||
'purchased_at' => $purchasedAt,
|
||||
'metadata' => ['demo' => true, 'event_slug' => $event->slug],
|
||||
'ip_address' => null,
|
||||
'user_agent' => null,
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
private function attachTaskCollections(Event $event, array $collectionSlugs): void
|
||||
{
|
||||
if ($collectionSlugs === []) {
|
||||
return;
|
||||
}
|
||||
|
||||
$collections = TaskCollection::whereIn('slug', $collectionSlugs)->get();
|
||||
|
||||
$pivot = [];
|
||||
foreach ($collections as $index => $collection) {
|
||||
$pivot[$collection->id] = ['sort_order' => ($index + 1) * 10];
|
||||
}
|
||||
|
||||
if ($pivot !== []) {
|
||||
$event->taskCollections()->syncWithoutDetaching($pivot);
|
||||
}
|
||||
}
|
||||
|
||||
private function attachEventTasks(Event $event, string $slugPrefix): void
|
||||
{
|
||||
$tasks = [];
|
||||
|
||||
if ($event->event_type_id) {
|
||||
$tasks = Task::where('event_type_id', $event->event_type_id)
|
||||
->orderBy('sort_order')
|
||||
->limit(25)
|
||||
->pluck('id')
|
||||
->all();
|
||||
}
|
||||
|
||||
if ($tasks === [] && $slugPrefix !== '') {
|
||||
$tasks = Task::where('slug', 'like', $slugPrefix.'%')
|
||||
->orderBy('sort_order')
|
||||
->limit(25)
|
||||
->pluck('id')
|
||||
->all();
|
||||
}
|
||||
|
||||
if ($tasks === []) {
|
||||
$tasks = Task::where('tenant_id', $event->tenant_id)
|
||||
->orderBy('sort_order')
|
||||
->limit(20)
|
||||
->pluck('id')
|
||||
->all();
|
||||
}
|
||||
|
||||
if ($tasks === []) {
|
||||
return;
|
||||
}
|
||||
|
||||
$tasks = array_slice(array_unique($tasks), 0, 20);
|
||||
|
||||
$pivot = [];
|
||||
foreach ($tasks as $index => $taskId) {
|
||||
$pivot[$taskId] = ['sort_order' => ($index + 1) * 10];
|
||||
}
|
||||
|
||||
$event->tasks()->syncWithoutDetaching($pivot);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user