From ce460ed4fd2af1c3e2743b8f999f063936d13093 Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Wed, 10 Jun 2026 19:22:06 +0700 Subject: [PATCH] Add seeders for categories, customers, products, raw materials, and suppliers. Update DatabaseSeeder to include new seeders for comprehensive data initialization. --- database/seeders/CategorySeeder.php | 22 +++++ database/seeders/CustomerSeeder.php | 23 +++++ database/seeders/DatabaseSeeder.php | 5 + database/seeders/ProductSeeder.php | 122 +++++++++++++++++++++++++ database/seeders/RawMaterialSeeder.php | 67 ++++++++++++++ database/seeders/SupplierSeeder.php | 23 +++++ 6 files changed, 262 insertions(+) create mode 100644 database/seeders/CategorySeeder.php create mode 100644 database/seeders/CustomerSeeder.php create mode 100644 database/seeders/ProductSeeder.php create mode 100644 database/seeders/RawMaterialSeeder.php create mode 100644 database/seeders/SupplierSeeder.php diff --git a/database/seeders/CategorySeeder.php b/database/seeders/CategorySeeder.php new file mode 100644 index 0000000..06b0498 --- /dev/null +++ b/database/seeders/CategorySeeder.php @@ -0,0 +1,22 @@ + $category, + 'slug' => str()->slug($category), + ]); + } + } +} diff --git a/database/seeders/CustomerSeeder.php b/database/seeders/CustomerSeeder.php new file mode 100644 index 0000000..c675858 --- /dev/null +++ b/database/seeders/CustomerSeeder.php @@ -0,0 +1,23 @@ + $name, + 'phone_number' => fake()->phoneNumber(), + 'address' => fake()->address(), + ]); + } + } +} diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 68d7198..e6bb69a 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -17,6 +17,11 @@ public function run(): void $this->call([ RolePermissionSeeder::class, UserSeeder::class, + CategorySeeder::class, + ProductSeeder::class, + RawMaterialSeeder::class, + SupplierSeeder::class, + CustomerSeeder::class, ]); } } diff --git a/database/seeders/ProductSeeder.php b/database/seeders/ProductSeeder.php new file mode 100644 index 0000000..2a39b8f --- /dev/null +++ b/database/seeders/ProductSeeder.php @@ -0,0 +1,122 @@ +pluck('id', 'slug'); + + $products = [ + [ + 'name' => 'Daster Batik Parang', + 'description' => 'Daster batik motif parang dengan bahan katun nyaman untuk pemakaian sehari-hari.', + 'category_slugs' => ['daster'], + 'variants' => [ + ['name' => 'S', 'stock' => 25, 'base_price' => 65000], + ['name' => 'M', 'stock' => 40, 'base_price' => 65000], + ['name' => 'L', 'stock' => 35, 'base_price' => 65000], + ['name' => 'XL', 'stock' => 20, 'base_price' => 70000], + ], + ], + [ + 'name' => 'Setelan Celana Batik Modern', + 'description' => 'Setelan atasan dan celana batik dengan potongan modern untuk acara formal maupun kasual.', + 'category_slugs' => ['setelan-celana'], + 'variants' => [ + ['name' => 'S', 'stock' => 15, 'base_price' => 185000], + ['name' => 'M', 'stock' => 20, 'base_price' => 185000], + ['name' => 'L', 'stock' => 18, 'base_price' => 185000], + ['name' => 'XL', 'stock' => 12, 'base_price' => 195000], + ], + ], + [ + 'name' => 'Blouse Batik Lengan Panjang', + 'description' => 'Blouse batik lengan panjang dengan detail kerah mandarin.', + 'category_slugs' => ['atasan'], + 'variants' => [ + ['name' => 'S', 'stock' => 30, 'base_price' => 95000], + ['name' => 'M', 'stock' => 35, 'base_price' => 95000], + ['name' => 'L', 'stock' => 28, 'base_price' => 95000], + ], + ], + [ + 'name' => 'Rok Lilit Batik', + 'description' => 'Rok lilit batik dengan motif klasik, mudah disesuaikan dengan berbagai ukuran.', + 'category_slugs' => ['bawahan'], + 'variants' => [ + ['name' => 'All Size', 'stock' => 50, 'base_price' => 85000], + ], + ], + [ + 'name' => 'Daster Busui Nursing', + 'description' => 'Daster busui dengan akses bukaan menyusui praktis dan bahan adem.', + 'category_slugs' => ['busui', 'daster'], + 'variants' => [ + ['name' => 'M', 'stock' => 22, 'base_price' => 78000], + ['name' => 'L', 'stock' => 26, 'base_price' => 78000], + ['name' => 'XL', 'stock' => 18, 'base_price' => 82000], + ], + ], + ]; + + DB::transaction(function () use ($products, $categories): void { + foreach ($products as $productData) { + $product = Product::create([ + 'name' => $productData['name'], + 'slug' => str()->slug($productData['name']), + 'description' => $productData['description'], + 'is_active' => true, + ]); + + $product->categories()->sync( + collect($productData['category_slugs']) + ->map(fn (string $slug) => $categories[$slug]) + ->all() + ); + + foreach ($productData['variants'] as $variantData) { + $variant = $product->variants()->create([ + 'name' => $variantData['name'], + 'stock' => $variantData['stock'], + ]); + + $this->seedVariantPrices($variant, $variantData['base_price']); + } + } + }); + } + + private function seedVariantPrices(ProductVariant $variant, int $basePrice): void + { + $multipliers = [ + PriceType::DISTRIBUTOR->value => 1.00, + PriceType::AGENT->value => 1.05, + PriceType::SUB_AGENT->value => 1.10, + PriceType::GROSIR->value => 1.15, + PriceType::ECER->value => 1.35, + PriceType::TIKTOK->value => 1.40, + PriceType::SHOPEE->value => 1.40, + ]; + + foreach ($multipliers as $type => $multiplier) { + ProductPrice::create([ + 'variant_id' => $variant->id, + 'type' => $type, + 'price' => (int) round($basePrice * $multiplier), + ]); + } + } +} diff --git a/database/seeders/RawMaterialSeeder.php b/database/seeders/RawMaterialSeeder.php new file mode 100644 index 0000000..a21335d --- /dev/null +++ b/database/seeders/RawMaterialSeeder.php @@ -0,0 +1,67 @@ + 'Kain Katun Premium', + 'unit' => RawMaterialUnit::METER, + 'prices' => [ + ['variant' => 'Putih', 'price' => 35000, 'stock' => 120.5], + ['variant' => 'Merah Maroon', 'price' => 38000, 'stock' => 85.25], + ['variant' => 'Navy', 'price' => 38000, 'stock' => 64.0], + ], + ], + [ + 'name' => 'Kain Rayon Motif', + 'unit' => RawMaterialUnit::YARD, + 'prices' => [ + ['variant' => 'Batik Parang', 'price' => 42000, 'stock' => 200.0], + ['variant' => 'Batik Kawung', 'price' => 45000, 'stock' => 175.5], + ['variant' => 'Polos Hitam', 'price' => 32000, 'stock' => 90.0], + ], + ], + [ + 'name' => 'Kain Knit', + 'unit' => RawMaterialUnit::METER, + 'prices' => [ + ['variant' => 'Putih', 'price' => 85000, 'stock' => 12.5], + ['variant' => 'Merah', 'price' => 85000, 'stock' => 10.0], + ['variant' => 'Navy', 'price' => 90000, 'stock' => 8.25], + ], + ], + ]; + + DB::transaction(function () use ($rawMaterials): void { + foreach ($rawMaterials as $rawMaterialData) { + $rawMaterial = RawMaterial::create([ + 'name' => $rawMaterialData['name'], + 'unit' => $rawMaterialData['unit'], + 'is_active' => true, + ]); + + foreach ($rawMaterialData['prices'] as $priceData) { + RawMaterialPrice::create([ + 'raw_material_id' => $rawMaterial->id, + 'variant' => $priceData['variant'], + 'price' => $priceData['price'], + 'stock' => $priceData['stock'], + ]); + } + } + }); + } +} diff --git a/database/seeders/SupplierSeeder.php b/database/seeders/SupplierSeeder.php new file mode 100644 index 0000000..a663afc --- /dev/null +++ b/database/seeders/SupplierSeeder.php @@ -0,0 +1,23 @@ + $name, + 'phone_number' => fake()->phoneNumber(), + 'address' => fake()->address(), + ]); + } + } +}