diff --git a/src/Command/InstallLunarCommand.php b/src/Command/InstallLunarCommand.php new file mode 100644 index 0000000..ba98084 --- /dev/null +++ b/src/Command/InstallLunarCommand.php @@ -0,0 +1,244 @@ +components->info('Seeding default Lunar store data...'); + + DB::transaction(function () { + if (! Channel::whereDefault(true)->exists()) { + $this->components->info('Setting up default channel'); + + Channel::create([ + 'name' => 'Webstore', + 'handle' => 'webstore', + 'default' => true, + 'url' => 'http://localhost', + ]); + } + + if (! Language::count()) { + $this->components->info('Adding default language'); + + Language::create([ + 'code' => 'en', + 'name' => 'English', + 'default' => true, + ]); + } + + if (! Currency::whereDefault(true)->exists()) { + $this->components->info('Adding a default currency (USD)'); + + Currency::create([ + 'code' => 'USD', + 'name' => 'US Dollar', + 'exchange_rate' => 1, + 'decimal_places' => 2, + 'default' => true, + 'enabled' => true, + ]); + } + + if (! CustomerGroup::whereDefault(true)->exists()) { + $this->components->info('Adding a default customer group.'); + + CustomerGroup::create([ + 'name' => 'Retail', + 'handle' => 'retail', + 'default' => true, + ]); + } + + if (! CollectionGroup::count()) { + $this->components->info('Adding an initial collection group'); + + CollectionGroup::create([ + 'name' => 'Main', + 'handle' => 'main', + ]); + } + + if (! TaxClass::count()) { + $this->components->info('Adding a default tax class.'); + + TaxClass::create([ + 'name' => 'Default Tax Class', + 'default' => true, + ]); + } + + if (! TaxZone::count()) { + $this->components->info('Adding a default tax zone.'); + + $taxZone = TaxZone::create([ + 'name' => 'Default Tax Zone', + 'zone_type' => 'country', + 'price_display' => 'tax_exclusive', + 'default' => true, + 'active' => true, + ]); + $taxZone->countries()->createMany( + Country::get()->map(fn ($country) => [ + 'country_id' => $country->id, + ]) + ); + } + + if (! Attribute::count()) { + $this->components->info('Setting up initial attributes'); + + $group = AttributeGroup::create([ + 'attributable_type' => Product::morphName(), + 'name' => collect([ + 'en' => 'Details', + ]), + 'handle' => 'details', + 'position' => 1, + ]); + + $collectionGroup = AttributeGroup::create([ + 'attributable_type' => Collection::morphName(), + 'name' => collect([ + 'en' => 'Details', + ]), + 'handle' => 'collection_details', + 'position' => 1, + ]); + + Attribute::create([ + 'attribute_type' => 'product', + 'attribute_group_id' => $group->id, + 'position' => 1, + 'name' => [ + 'en' => 'Name', + ], + 'handle' => 'name', + 'section' => 'main', + 'type' => TranslatedText::class, + 'required' => true, + 'default_value' => null, + 'configuration' => [ + 'richtext' => false, + ], + 'system' => true, + 'description' => [ + 'en' => '', + ], + ]); + + Attribute::create([ + 'attribute_type' => 'collection', + 'attribute_group_id' => $collectionGroup->id, + 'position' => 1, + 'name' => [ + 'en' => 'Name', + ], + 'handle' => 'name', + 'section' => 'main', + 'type' => TranslatedText::class, + 'required' => true, + 'default_value' => null, + 'configuration' => [ + 'richtext' => false, + ], + 'system' => true, + 'description' => [ + 'en' => '', + ], + ]); + + Attribute::create([ + 'attribute_type' => 'product', + 'attribute_group_id' => $group->id, + 'position' => 2, + 'name' => [ + 'en' => 'Description', + ], + 'handle' => 'description', + 'section' => 'main', + 'type' => TranslatedText::class, + 'required' => false, + 'default_value' => null, + 'configuration' => [ + 'richtext' => true, + ], + 'system' => false, + 'description' => [ + 'en' => '', + ], + ]); + + Attribute::create([ + 'attribute_type' => 'collection', + 'attribute_group_id' => $collectionGroup->id, + 'position' => 2, + 'name' => [ + 'en' => 'Description', + ], + 'handle' => 'description', + 'section' => 'main', + 'type' => TranslatedText::class, + 'required' => false, + 'default_value' => null, + 'configuration' => [ + 'richtext' => true, + ], + 'system' => false, + 'description' => [ + 'en' => '', + ], + ]); + } + + if (! ProductType::count()) { + $this->components->info('Adding a product type.'); + + $type = ProductType::create([ + 'name' => 'Stock', + ]); + + $type->mappedAttributes()->attach( + Attribute::whereAttributeType( + Product::morphName() + )->get()->pluck('id') + ); + } + }); + + $this->components->info('Publishing Filament assets'); + $this->call('filament:assets'); + + $this->components->info('Lunar default data seeded.'); + } +} diff --git a/src/Providers/CoreServiceProvider.php b/src/Providers/CoreServiceProvider.php index a9462f4..f1f69d9 100644 --- a/src/Providers/CoreServiceProvider.php +++ b/src/Providers/CoreServiceProvider.php @@ -8,6 +8,7 @@ use Modules\Core\Command\AnonymizeCommand; use Modules\Core\Command\ExportCleanupCommand; use Modules\Core\Command\ExportCommand; use Modules\Core\Command\ImportCommand; +use Modules\Core\Command\InstallLunarCommand; use Modules\Core\Command\MigrateImportCommand; class CoreServiceProvider extends ServiceProvider @@ -34,6 +35,9 @@ class CoreServiceProvider extends ServiceProvider if ($this->app->runningInConsole()) { $this->commands([AnonymizeCommand::class, ExportCommand::class, ExportCleanupCommand::class, ImportCommand::class, MigrateImportCommand::class]); + + //Overriding lunar:install + $this->app->booted(fn () => $this->commands([InstallLunarCommand::class])); } } }