From 18c80b075b9d5efd034040512557dca55424274f Mon Sep 17 00:00:00 2001 From: ncoronel Date: Thu, 16 Jul 2026 09:07:05 -0300 Subject: [PATCH] feat: Update product seeder to include inventory policy and improve code readability --- .../FiestaFutbolInfantilProductSeeder.php | 47 ++++++++----------- .../ProductCatalogFromImagesSeeder.php | 17 ++++--- 2 files changed, 30 insertions(+), 34 deletions(-) diff --git a/database/seeders/FiestaFutbolInfantilProductSeeder.php b/database/seeders/FiestaFutbolInfantilProductSeeder.php index 12e4ed0..cb380e6 100644 --- a/database/seeders/FiestaFutbolInfantilProductSeeder.php +++ b/database/seeders/FiestaFutbolInfantilProductSeeder.php @@ -2,28 +2,30 @@ namespace Database\Seeders; +use App\Domains\Catalog\Enums\InventoryPolicy; +use App\Domains\Catalog\Models\Attribute; use App\Domains\Catalog\Models\Category; +use App\Domains\Catalog\Models\Product; use App\Domains\Catalog\Services\ProductService; use App\Domains\Tenant\Models\Tenant; use Illuminate\Database\Seeder; +use Illuminate\Support\Facades\DB; use RuntimeException; class FiestaFutbolInfantilProductSeeder extends Seeder { - public function __construct(private readonly ProductService $productService) - { - } + public function __construct(private readonly ProductService $productService) {} public function run(): void { $tenant = Tenant::query()->where('codigo', 'fiesta_futbol_infantil')->first(); - if (!$tenant) { + if (! $tenant) { throw new RuntimeException("Tenant 'fiesta_futbol_infantil' no encontrado."); } // Delete existing products for this tenant - $existingProducts = \App\Domains\Catalog\Models\Product::query() + $existingProducts = Product::query() ->where('tenant_codigo', $tenant->codigo) ->get(); @@ -43,30 +45,32 @@ class FiestaFutbolInfantilProductSeeder extends Seeder 'nombre' => 'Entrada General', 'descripcion' => 'Acceso total al predio. No incluye acceso a estacionamiento. Niños menores de 5 años ingresan gratis.', 'precio' => 10000, - 'stock' => null, - 'attribute_ids' => [\App\Domains\Catalog\Models\Attribute::where('codigo', 'fecha')->where('tenant_codigo', $tenant->codigo)->first()?->id], + 'stock' => 0, + 'inventory_policy' => InventoryPolicy::Unlimited->value, + 'attribute_ids' => [Attribute::where('codigo', 'fecha')->where('tenant_codigo', $tenant->codigo)->first()?->id], ]); foreach ($dates as $date) { $this->productService->createVariant($entrada, [ - 'stock' => null, + 'stock' => 0, + 'inventory_policy' => InventoryPolicy::Unlimited->value, 'has_tickets' => true, - 'minimum_use_date' => $date . ' 00:00:00', - 'maximum_use_date' => $date . ' 23:59:59', + 'minimum_use_date' => $date.' 00:00:00', + 'maximum_use_date' => $date.' 23:59:59', 'definitions' => [ [ - 'products_attribute_id' => \Illuminate\Support\Facades\DB::table('products_attributes') + 'products_attribute_id' => DB::table('products_attributes') ->where('product_id', $entrada->id) ->first()?->id, 'value' => $date, - ] + ], ], ]); } // Other products without variants $gastronomiaCategory = Category::firstOrCreate(['nombre' => 'Gastronomía', 'tenant_code' => null]); - + $simpleProducts = [ ['slug' => 'hamburguesa-papa-frita', 'nombre' => 'Hamburguesa con papa frita', 'precio' => 8000, 'cat' => $gastronomiaCategory->id], ['slug' => 'pancho', 'nombre' => 'Pancho', 'precio' => 4000, 'cat' => $gastronomiaCategory->id], @@ -77,26 +81,15 @@ class FiestaFutbolInfantilProductSeeder extends Seeder ]; foreach ($simpleProducts as $p) { - $prod = $this->productService->create($tenant, [ + $this->productService->create($tenant, [ 'categoria_id' => $p['cat'], 'slug' => $p['slug'], 'nombre' => $p['nombre'], 'descripcion' => $p['nombre'], 'precio' => $p['precio'], - 'stock' => null, + 'stock' => 0, + 'inventory_policy' => InventoryPolicy::Unlimited->value, ]); - - // To ensure the variant gets stock null and has_tickets if needed. - // The default placeholder variant is created by ProductService::create with the given stock. - // But if we want stock=null, we should update the variant. - $variant = $prod->variants()->first(); - if ($variant) { - $variant->stock = null; - $variant->save(); - } } - - // Also update the stock to null for the placeholder variant of Entrada General (or delete it, since we created specific variants) - // Actually ProductService deletes placeholder variants if we add a variant with definitions! } } diff --git a/database/seeders/ProductCatalogFromImagesSeeder.php b/database/seeders/ProductCatalogFromImagesSeeder.php index 8f144d0..3d9d97b 100644 --- a/database/seeders/ProductCatalogFromImagesSeeder.php +++ b/database/seeders/ProductCatalogFromImagesSeeder.php @@ -2,6 +2,7 @@ namespace Database\Seeders; +use App\Domains\Catalog\Enums\InventoryPolicy; use App\Domains\Catalog\Models\Attribute; use App\Domains\Catalog\Models\Brand; use App\Domains\Catalog\Models\Category; @@ -64,9 +65,7 @@ class ProductCatalogFromImagesSeeder extends Seeder 'istockphoto-1675347112-2048x2048.jpg', ]; - public function __construct(private readonly ProductService $productService) - { - } + public function __construct(private readonly ProductService $productService) {} /** * Run the database seeds. @@ -162,9 +161,9 @@ class ProductCatalogFromImagesSeeder extends Seeder } /** - * @param array{attribute_codes: array, brand_name: string|null, category_name: string, color: string|null, description: string, product_name: string, product_slug: string, type: string} $metadata - * @param array{price: int} $pricing - * @param array, group_key: string, metadata: array{attribute_codes: array, brand_name: string|null, category_name: string, color: string|null, description: string, product_name: string, product_slug: string, type: string}, stock: int}> $variantGroups + * @param array{attribute_codes: array, brand_name: string|null, category_name: string, color: string|null, description: string, product_name: string, product_slug: string, type: string} $metadata + * @param array{price: int} $pricing + * @param array, group_key: string, metadata: array{attribute_codes: array, brand_name: string|null, category_name: string, color: string|null, description: string, product_name: string, product_slug: string, type: string}, stock: int}> $variantGroups */ private function seedProduct(Tenant $tenant, array $metadata, array $pricing, array $variantGroups): void { @@ -206,6 +205,7 @@ class ProductCatalogFromImagesSeeder extends Seeder 'nombre' => $metadata['product_name'], 'descripcion' => $metadata['description'], 'precio' => $pricing['price'], + 'inventory_policy' => InventoryPolicy::Tracked->value, 'attribute_ids' => array_values($attributeIds->all()), ]); @@ -226,9 +226,11 @@ class ProductCatalogFromImagesSeeder extends Seeder if ($attributeIds->isEmpty()) { $this->productService->createVariant($product, [ 'stock' => $variantGroup['stock'], + 'inventory_policy' => InventoryPolicy::Tracked->value, 'definitions' => [], 'images' => $images, ]); + continue; } @@ -280,6 +282,7 @@ class ProductCatalogFromImagesSeeder extends Seeder $this->productService->createVariant($product, [ 'stock' => $stock, + 'inventory_policy' => InventoryPolicy::Tracked->value, 'definitions' => $definitions, 'images' => $images, ]); @@ -288,7 +291,7 @@ class ProductCatalogFromImagesSeeder extends Seeder } /** - * @param array, group_key: string, metadata: array{attribute_codes: array, brand_name: string|null, category_name: string, color: string|null, description: string, product_name: string, product_slug: string, type: string}, stock: int}> $variantGroups + * @param array, group_key: string, metadata: array{attribute_codes: array, brand_name: string|null, category_name: string, color: string|null, description: string, product_name: string, product_slug: string, type: string}, stock: int}> $variantGroups * @return array{attribute_codes: array, brand_name: string|null, category_name: string, color: string|null, description: string, product_name: string, product_slug: string, type: string} */ private function buildProductMetadata(string $productKey, array $variantGroups): array