command->info('시뮬레이터 단가 시딩 시작...'); DB::transaction(function () { $this->seedPricesFromItems(); }); $count = Price::where('tenant_id', $this->tenantId) ->where('status', Price::STATUS_ACTIVE) ->count(); $this->command->info("단가 시딩 완료! (총 {$count}개 active)"); } protected function seedPricesFromItems(): void { // 시뮬레이터용 품목 코드 패턴 $patterns = [ 'SF-SCR-%', // 스크린 반제품 'SF-STL-%', // 철재 반제품 'SF-BND-%', // 절곡 반제품 'SM-%', // 부자재 'RM-%', // 원자재 ]; $query = DB::table('items') ->where('tenant_id', $this->tenantId) ->whereNull('deleted_at') ->where(function ($q) use ($patterns) { foreach ($patterns as $pattern) { $q->orWhere('code', 'like', $pattern); } }); $items = $query->get(); $created = 0; $skipped = 0; foreach ($items as $item) { $attributes = json_decode($item->attributes, true) ?? []; $salesPrice = $attributes['salesPrice'] ?? 0; if ($salesPrice <= 0) { $skipped++; continue; } // 기존 active 단가 확인 $existingPrice = Price::where('tenant_id', $this->tenantId) ->where('item_id', $item->id) ->where('item_type_code', $item->item_type) ->where('status', Price::STATUS_ACTIVE) ->first(); if ($existingPrice) { // 기존 단가 업데이트 $existingPrice->update([ 'sales_price' => $salesPrice, 'updated_by' => 1, ]); $this->command->line(" 업데이트: {$item->code} => " . number_format($salesPrice)); } else { // 새 단가 생성 Price::create([ 'tenant_id' => $this->tenantId, 'item_type_code' => $item->item_type, 'item_id' => $item->id, 'client_group_id' => null, 'purchase_price' => $salesPrice * 0.7, // 매입가 추정 (70%) 'processing_cost' => 0, 'loss_rate' => 0, 'margin_rate' => 30, // 마진율 30% 'sales_price' => $salesPrice, 'rounding_rule' => Price::ROUNDING_ROUND, 'rounding_unit' => 100, 'effective_from' => now()->toDateString(), 'effective_to' => null, 'note' => 'Design 시뮬레이터 연동 데이터', 'status' => Price::STATUS_ACTIVE, 'is_final' => false, 'created_by' => 1, ]); $created++; $this->command->line(" 생성: {$item->code} => " . number_format($salesPrice)); } } $this->command->info(" 생성: {$created}개, 스킵(단가없음): {$skipped}개"); } }