I example products command

This commit is contained in:
Fabian @ Blax Software 2025-12-17 08:16:13 +01:00
parent edbf116c48
commit b3cea22071
1 changed files with 92 additions and 4 deletions

View File

@ -8,6 +8,7 @@ use Blax\Shop\Models\Product;
use Blax\Shop\Models\ProductAction;
use Blax\Shop\Models\ProductAttribute;
use Blax\Shop\Models\ProductCategory;
use Blax\Shop\Enums\ProductRelationType;
use Illuminate\Console\Command;
use Faker\Factory as Faker;
@ -23,22 +24,30 @@ class ShopAddExampleProducts extends Command
* Available product types in the shop system
*/
const PRODUCT_TYPES = [
'simple' => [
ProductType::SIMPLE->value => [
'name' => 'Simple Product',
'description' => 'A standalone product with no variations (e.g., a book, a service)',
],
'variable' => [
ProductType::VARIABLE->value => [
'name' => 'Variable Product',
'description' => 'A product with variations/options (e.g., a t-shirt with different sizes and colors)',
],
'grouped' => [
ProductType::GROUPED->value => [
'name' => 'Grouped Product',
'description' => 'A collection of related products sold together (e.g., a product bundle)',
],
'external' => [
ProductType::EXTERNAL->value => [
'name' => 'External Product',
'description' => 'A product that links to an external site for purchase',
],
ProductType::BOOKING->value => [
'name' => 'Booking Product',
'description' => 'A product that represents a bookable service or appointment',
],
ProductType::POOL->value => [
'name' => 'Pool Product',
'description' => 'A product that offers dynamic pricing based on availability (e.g., event tickets)',
],
];
protected $faker;
@ -203,6 +212,85 @@ class ShopAddExampleProducts extends Command
$this->addGroupedProducts($product);
}
// Special example: Booking product that includes a parking pool
// Create a demonstrative Hotel Room booking with 3 parking plots
if ($type === ProductType::BOOKING->value) {
try {
// Ensure this booking example is clearly named
$product->update(["name" => "Hotel Room"]);
// Ensure booking has stock (required for bookings)
$product->update(['manage_stock' => true]);
$product->increaseStock(1);
// Create a parking pool
$parkingPool = Product::create([
'slug' => 'example-parkings-pool-' . $this->faker->unique()->numberBetween(1000, 9999),
'name' => 'Parkings',
'sku' => 'EX-PARK-' . strtoupper($this->faker->bothify('??-###')),
'type' => ProductType::POOL,
'status' => ProductStatus::PUBLISHED,
'is_visible' => true,
'manage_stock' => true,
'published_at' => now(),
'meta' => ['example' => true],
]);
// Add a default pool price (optional)
$parkingPool->prices()->create([
'name' => 'Default',
'type' => 'one_time',
'currency' => 'EUR',
'unit_amount' => 3000, // €30 per booking/day for example
'is_default' => true,
'active' => true,
'billing_scheme' => 'per_unit',
'meta' => ['example' => true],
]);
// Create 3 parking plots as booking single items and attach to pool
$parkingIds = [];
for ($p = 1; $p <= 3; $p++) {
$parking = Product::create([
'slug' => 'example-parking-plot-' . $p . '-' . $this->faker->unique()->numberBetween(1000, 9999),
'name' => 'Parking Plot ' . $p,
'sku' => 'EX-PP-' . strtoupper($this->faker->bothify('??-###')),
'type' => ProductType::BOOKING,
'status' => ProductStatus::PUBLISHED,
'is_visible' => false,
'manage_stock' => true,
'published_at' => now(),
'meta' => ['example' => true, 'parking_plot' => true],
]);
// Give each parking one unit of stock so it can be claimed
$parking->increaseStock(1);
// Give each parking a price
$parking->prices()->create([
'name' => 'Default',
'type' => 'one_time',
'currency' => 'EUR',
'unit_amount' => 1000 + ($p - 1) * 200, // €10, €12, €14
'is_default' => true,
'active' => true,
'billing_scheme' => 'per_unit',
'meta' => ['example' => true],
]);
$parkingIds[] = $parking->id;
}
// Attach parking plots as single items to the parking pool (also creates reverse POOL relation)
$parkingPool->attachSingleItems($parkingIds);
// Link the parking pool to the booking as an add-on
$product->productRelations()->attach($parkingPool->id, ['type' => ProductRelationType::ADD_ON->value]);
} catch (\Throwable $e) {
$this->warn('Failed to create booking+parking example: ' . $e->getMessage());
}
}
return $product;
}