Files
fotospiel-app/database/seeders/CouponSeeder.php
2025-12-07 13:01:29 +01:00

181 lines
7.1 KiB
PHP

<?php
namespace Database\Seeders;
use App\Enums\CouponStatus;
use App\Enums\CouponType;
use App\Models\Coupon;
use App\Models\Package;
use Carbon\Carbon;
use Illuminate\Database\Seeder;
use Illuminate\Support\Collection;
class CouponSeeder extends Seeder
{
/**
* Seed a curated set of coupons and attach them to the relevant packages.
*/
public function run(): void
{
$startsAt = Carbon::create(2026, 1, 1, 0, 0, 0);
/** @var Collection<string, int> $packageIds */
$packageIds = Package::query()
->whereNotNull('paddle_price_id')
->pluck('id', 'slug');
$coupons = [
[
'code' => 'LAUNCH10',
'name' => 'Launch 10% Evergreen',
'description' => 'Dauerhafter 10%-Rabatt auf alle Endkunden-Pakete für Kampagnen und Empfehlungen.',
'type' => CouponType::PERCENTAGE,
'amount' => 10,
'status' => CouponStatus::ACTIVE,
'enabled_for_checkout' => true,
'is_stackable' => false,
'auto_apply' => false,
'usage_limit' => null,
'per_customer_limit' => null,
'starts_at' => $startsAt,
'ends_at' => null,
'packages' => ['starter', 'standard', 'pro', 'premium'],
],
[
'code' => 'WELCOME20',
'name' => 'Willkommen 20%',
'description' => 'Einmaliger 20%-Rabatt für neue Kund:innen auf Endkunden-Pakete.',
'type' => CouponType::PERCENTAGE,
'amount' => 20,
'status' => CouponStatus::ACTIVE,
'enabled_for_checkout' => true,
'is_stackable' => false,
'auto_apply' => false,
'usage_limit' => 500,
'per_customer_limit' => 1,
'starts_at' => $startsAt,
'ends_at' => Carbon::create(2026, 12, 31, 23, 59, 59),
'packages' => ['starter', 'standard', 'pro', 'premium'],
],
[
'code' => 'UPGRADE30',
'name' => 'Upgrade 30 €',
'description' => '30 € Nachlass als Upgrade-Anreiz von Starter auf Standard/Premium.',
'type' => CouponType::FLAT,
'amount' => 30.00,
'currency' => 'EUR',
'status' => CouponStatus::ACTIVE,
'enabled_for_checkout' => true,
'is_stackable' => false,
'auto_apply' => false,
'usage_limit' => 200,
'per_customer_limit' => 1,
'starts_at' => $startsAt,
'ends_at' => Carbon::create(2026, 9, 30, 23, 59, 59),
'packages' => ['standard', 'pro', 'premium'],
],
[
'code' => 'SEASON50',
'name' => 'Hochzeits-Saison 50 €',
'description' => 'Saisonaler 50 € Rabatt für die Hochzeitssaison auf Standard/Premium.',
'type' => CouponType::FLAT,
'amount' => 50.00,
'currency' => 'EUR',
'status' => CouponStatus::ACTIVE,
'enabled_for_checkout' => true,
'is_stackable' => false,
'auto_apply' => false,
'usage_limit' => 300,
'per_customer_limit' => 1,
'starts_at' => $startsAt,
'ends_at' => Carbon::create(2026, 8, 31, 23, 59, 59),
'packages' => ['standard', 'pro', 'premium'],
],
[
'code' => 'B2B15',
'name' => 'Partner 15 %',
'description' => '15 %-Rabatt für Reseller-Pakete als Partner-Pitch.',
'type' => CouponType::PERCENTAGE,
'amount' => 15,
'status' => CouponStatus::ACTIVE,
'enabled_for_checkout' => true,
'is_stackable' => false,
'auto_apply' => false,
'usage_limit' => null,
'per_customer_limit' => 1,
'starts_at' => $startsAt,
'ends_at' => Carbon::create(2027, 12, 31, 23, 59, 59),
'packages' => ['s-small-reseller', 'm-medium-reseller', 'l-large-reseller', 'studio-annual', 'enterprise-unlimited'],
],
[
'code' => 'B2B100',
'name' => 'Partner 100 €',
'description' => '100 € Closing-Rabatt für mittlere/große Reseller-Pakete.',
'type' => CouponType::FLAT,
'amount' => 100.00,
'currency' => 'EUR',
'status' => CouponStatus::ACTIVE,
'enabled_for_checkout' => true,
'is_stackable' => false,
'auto_apply' => false,
'usage_limit' => 100,
'per_customer_limit' => 1,
'starts_at' => $startsAt,
'ends_at' => Carbon::create(2026, 12, 31, 23, 59, 59),
'packages' => ['m-medium-reseller', 'l-large-reseller', 'studio-annual'],
],
[
'code' => 'ENTERPRISE500',
'name' => 'Enterprise 500 €',
'description' => '500 € Einmalrabatt für Enterprise/Unlimited-Deals.',
'type' => CouponType::FLAT,
'amount' => 500.00,
'currency' => 'EUR',
'status' => CouponStatus::ACTIVE,
'enabled_for_checkout' => true,
'is_stackable' => false,
'auto_apply' => false,
'usage_limit' => 30,
'per_customer_limit' => 1,
'starts_at' => $startsAt,
'ends_at' => Carbon::create(2027, 3, 31, 23, 59, 59),
'packages' => ['enterprise-unlimited'],
],
[
'code' => 'RECOVER10',
'name' => 'Recover 10 %',
'description' => '10 %-Warenkorbrabatt für Rückgewinnung via Remarketing-Link (auto-apply).',
'type' => CouponType::PERCENTAGE,
'amount' => 10,
'status' => CouponStatus::ACTIVE,
'enabled_for_checkout' => true,
'is_stackable' => false,
'auto_apply' => true,
'usage_limit' => 1000,
'per_customer_limit' => 1,
'starts_at' => $startsAt,
'ends_at' => Carbon::create(2026, 12, 31, 23, 59, 59),
'packages' => ['starter', 'standard', 'pro', 'premium'],
],
];
foreach ($coupons as $data) {
$packageSlugs = $data['packages'] ?? [];
unset($data['packages']);
$coupon = Coupon::updateOrCreate(
['code' => $data['code']],
$data,
);
$ids = collect($packageSlugs)
->map(fn (string $slug) => $packageIds->get($slug))
->filter()
->values()
->all();
$coupon->packages()->sync($ids);
}
}
}