feat(seeder): 시뮬레이터용 단가 시더 추가

- DesignPriceSeeder 생성
- items.attributes.salesPrice → prices 테이블 마이그레이션
- 85개 품목 단가 데이터 추가 완료
- 대상: SF-SCR-%, SF-STL-%, SF-BND-%, SM-%, RM-%

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2025-12-29 21:43:28 +09:00
parent dcae003e32
commit 595d57ce31

View File

@@ -0,0 +1,111 @@
<?php
namespace Database\Seeders;
use App\Models\Price;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
/**
* 시뮬레이터용 단가 시더
*
* Design 시뮬레이터와 동일한 단가를 prices 테이블에 추가합니다.
* items.attributes.salesPrice의 값을 prices 테이블로 이전합니다.
*
* 사용법:
* php artisan db:seed --class=DesignPriceSeeder
*/
class DesignPriceSeeder extends Seeder
{
protected int $tenantId = 287;
public function run(): void
{
$this->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}");
}
}