feat(packages): implement package-based business model
This commit is contained in:
93
app/Console/Commands/MigrateToPackages.php
Normal file
93
app/Console/Commands/MigrateToPackages.php
Normal file
@@ -0,0 +1,93 @@
|
||||
<?php
|
||||
|
||||
namespace App\Console\Commands;
|
||||
|
||||
use Illuminate\Console\Command;
|
||||
use App\Models\Tenant;
|
||||
use App\Models\Event;
|
||||
use App\Models\Package;
|
||||
use App\Models\TenantPackage;
|
||||
use App\Models\EventPackage;
|
||||
use App\Models\PackagePurchase;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class MigrateToPackages extends Command
|
||||
{
|
||||
protected $signature = 'packages:migrate';
|
||||
protected $description = 'Migrate existing credits data to packages';
|
||||
|
||||
public function handle()
|
||||
{
|
||||
DB::transaction(function () {
|
||||
// Find Free package for endcustomer
|
||||
$freePackage = Package::where('name', 'Free / Test')->where('type', 'endcustomer')->first();
|
||||
if (!$freePackage) {
|
||||
$this->error('Free package not found. Run seeder first.');
|
||||
return 1;
|
||||
}
|
||||
|
||||
$resellerPackage = Package::where('name', 'Reseller S')->where('type', 'reseller')->first();
|
||||
if (!$resellerPackage) {
|
||||
$this->error('Reseller package not found. Run seeder first.');
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Migrate tenants with credits to tenant_packages (reseller free)
|
||||
$tenants = Tenant::where('event_credits_balance', '>', 0)->get();
|
||||
foreach ($tenants as $tenant) {
|
||||
$initialEvents = floor($tenant->event_credits_balance / 100); // Arbitrary conversion
|
||||
TenantPackage::create([
|
||||
'tenant_id' => $tenant->id,
|
||||
'package_id' => $resellerPackage->id,
|
||||
'price' => 0,
|
||||
'purchased_at' => now(),
|
||||
'expires_at' => now()->addYear(),
|
||||
'used_events' => 0,
|
||||
'active' => true,
|
||||
]);
|
||||
|
||||
PackagePurchase::create([
|
||||
'tenant_id' => $tenant->id,
|
||||
'package_id' => $resellerPackage->id,
|
||||
'type' => 'reseller_subscription',
|
||||
'provider_id' => 'migration',
|
||||
'purchased_price' => 0,
|
||||
'metadata' => ['migrated_credits' => $tenant->event_credits_balance],
|
||||
]);
|
||||
|
||||
$this->info("Migrated tenant {$tenant->name} with {$tenant->event_credits_balance} credits to Reseller S package.");
|
||||
}
|
||||
|
||||
// Migrate events to event_packages (free)
|
||||
$events = Event::all();
|
||||
foreach ($events as $event) {
|
||||
EventPackage::create([
|
||||
'event_id' => $event->id,
|
||||
'package_id' => $freePackage->id,
|
||||
'purchased_price' => 0,
|
||||
'purchased_at' => $event->created_at,
|
||||
'used_photos' => 0,
|
||||
]);
|
||||
|
||||
PackagePurchase::create([
|
||||
'tenant_id' => $event->tenant_id,
|
||||
'event_id' => $event->id,
|
||||
'package_id' => $freePackage->id,
|
||||
'type' => 'endcustomer_event',
|
||||
'provider_id' => 'migration',
|
||||
'purchased_price' => 0,
|
||||
'metadata' => ['migrated_from_credits' => true],
|
||||
]);
|
||||
|
||||
$this->info("Migrated event {$event->name} to Free package.");
|
||||
}
|
||||
|
||||
// Clear old credits data (assume drop migration already run)
|
||||
Tenant::where('event_credits_balance', '>', 0)->update(['event_credits_balance' => 0]);
|
||||
|
||||
$this->info('Migration completed successfully.');
|
||||
});
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user