From dafe9ee4ff72e1199a647e0c54cb885b6559f46d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B3=B4=EA=B3=A4?= Date: Sun, 22 Mar 2026 22:49:01 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20[interview]=20=EB=A7=88=EC=8A=A4?= =?UTF-8?q?=ED=84=B0=20=EC=A7=88=EB=AC=B8=20=EC=8B=9C=EB=8D=94=20v2=20?= =?UTF-8?q?=E2=80=94=2012=EA=B0=9C=20=EB=8F=84=EB=A9=94=EC=9D=B8=20225?= =?UTF-8?q?=EA=B0=9C=20=EC=A7=88=EB=AC=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 기존 8개 도메인 질문 대폭 강화 (80개 → 152개) - 신규 4개 도메인 추가: 생산공정, 품질관리, 물류재고, 영업고객 (73개) - 기존 마스터 삭제 후 재생성 방식으로 변경 (프로젝트 데이터 보존) - 도메인별 private 메서드 분리 --- .../seeders/InterviewQuestionMasterSeeder.php | 194 +++++++++--------- 1 file changed, 97 insertions(+), 97 deletions(-) diff --git a/database/seeders/InterviewQuestionMasterSeeder.php b/database/seeders/InterviewQuestionMasterSeeder.php index dca7d870..7bcd4fdb 100644 --- a/database/seeders/InterviewQuestionMasterSeeder.php +++ b/database/seeders/InterviewQuestionMasterSeeder.php @@ -48,44 +48,44 @@ public function run(): void $categorySortOrder = InterviewCategory::max('sort_order') ?? 0; $category = InterviewCategory::create([ - 'tenant_id' => $tenantId, + 'tenant_id' => $tenantId, 'interview_project_id' => null, - 'name' => $domain['name'], - 'description' => $domain['description'], - 'domain' => $domainKey, - 'sort_order' => $categorySortOrder + 1, - 'is_active' => true, - 'created_by' => $userId, - 'updated_by' => $userId, + 'name' => $domain['name'], + 'description' => $domain['description'], + 'domain' => $domainKey, + 'sort_order' => $categorySortOrder + 1, + 'is_active' => true, + 'created_by' => $userId, + 'updated_by' => $userId, ]); foreach ($domain['templates'] as $tplIndex => $tpl) { $template = InterviewTemplate::create([ - 'tenant_id' => $tenantId, + 'tenant_id' => $tenantId, 'interview_category_id' => $category->id, - 'name' => $tpl['name'], - 'sort_order' => $tplIndex + 1, - 'is_active' => true, - 'created_by' => $userId, - 'updated_by' => $userId, + 'name' => $tpl['name'], + 'sort_order' => $tplIndex + 1, + 'is_active' => true, + 'created_by' => $userId, + 'updated_by' => $userId, ]); foreach ($tpl['questions'] as $qIndex => $q) { InterviewQuestion::create([ - 'tenant_id' => $tenantId, + 'tenant_id' => $tenantId, 'interview_template_id' => $template->id, - 'question_text' => $q['text'], - 'question_type' => $q['type'], - 'options' => $q['options'] ?? null, - 'ai_hint' => $q['ai_hint'] ?? null, - 'expected_format' => $q['expected_format'] ?? null, - 'depends_on' => $q['depends_on'] ?? null, - 'domain' => $domainKey, - 'is_required' => $q['is_required'] ?? false, - 'sort_order' => $qIndex + 1, - 'is_active' => true, - 'created_by' => $userId, - 'updated_by' => $userId, + 'question_text' => $q['text'], + 'question_type' => $q['type'], + 'options' => $q['options'] ?? null, + 'ai_hint' => $q['ai_hint'] ?? null, + 'expected_format' => $q['expected_format'] ?? null, + 'depends_on' => $q['depends_on'] ?? null, + 'domain' => $domainKey, + 'is_required' => $q['is_required'] ?? false, + 'sort_order' => $qIndex + 1, + 'is_active' => true, + 'created_by' => $userId, + 'updated_by' => $userId, ]); } } @@ -118,11 +118,11 @@ private function domainProductClassification(): array { return [ 'product_classification' => [ - 'name' => '제품 분류 체계', + 'name' => '제품 분류 체계', 'description' => '제품 카테고리, 모델 코드, 분류 기준 파악', - 'templates' => [ + 'templates' => [ [ - 'name' => '제품 카테고리 구조', + 'name' => '제품 카테고리 구조', 'questions' => [ ['text' => '귀사의 주요 제품군을 모두 나열해주세요', 'type' => 'text', 'ai_hint' => '쉼표 구분으로 제품군 나열', 'is_required' => true], ['text' => '각 제품군의 하위 모델명과 코드 체계를 알려주세요', 'type' => 'table_input', 'options' => ['columns' => ['모델코드', '모델명', '비고']], 'ai_hint' => '코드-이름 매핑 테이블'], @@ -135,7 +135,7 @@ private function domainProductClassification(): array ], ], [ - 'name' => '설치 유형별 분류', + 'name' => '설치 유형별 분류', 'questions' => [ ['text' => '설치 유형(벽면형, 측면형, 혼합형 등)에 따라 견적이 달라지나요?', 'type' => 'select', 'options' => ['choices' => ['예, 크게 달라짐', '약간 달라짐', '달라지지 않음']]], ['text' => '각 설치 유형별로 어떤 부품이 달라지나요?', 'type' => 'table_input', 'options' => ['columns' => ['설치유형', '추가부품', '제외부품', '비고']]], @@ -143,7 +143,7 @@ private function domainProductClassification(): array ], ], [ - 'name' => '인증/규격 관리', + 'name' => '인증/규격 관리', 'questions' => [ ['text' => '보유 중인 인증 종류를 모두 선택해주세요', 'type' => 'multi_select', 'options' => ['choices' => ['KC인증', '방화인증', '방연시험성적서', 'KS규격', 'ISO 인증', '기타']], 'is_required' => true], ['text' => '인증별 적용 제품 범위 및 인증번호를 입력해주세요', 'type' => 'table_input', 'options' => ['columns' => ['인증종류', '인증번호', '적용제품', '유효기간']]], @@ -152,7 +152,7 @@ private function domainProductClassification(): array ], ], [ - 'name' => '커스텀 옵션 및 파생 모델', + 'name' => '커스텀 옵션 및 파생 모델', 'questions' => [ ['text' => '고객 요청으로 변경 가능한 옵션 항목을 모두 선택해주세요', 'type' => 'multi_select', 'options' => ['choices' => ['색상/도장', '마감재', '특수사양', '크기 커스텀', '전압 옵션', '제어 방식']]], ['text' => '색상/마감재 옵션이 있는 경우 선택 목록을 정리해주세요', 'type' => 'table_input', 'options' => ['columns' => ['옵션구분', '선택항목', '추가비용', '납기영향']]], @@ -161,7 +161,7 @@ private function domainProductClassification(): array ], ], [ - 'name' => '제품 라이프사이클', + 'name' => '제품 라이프사이클', 'questions' => [ ['text' => '신제품 등록 절차는 어떻게 되나요? (R&D → 테스트 → 양산)', 'type' => 'text', 'ai_hint' => '신제품 출시 프로세스 흐름'], ['text' => '단종/단계 축소 제품 관리 방식은?', 'type' => 'select', 'options' => ['choices' => ['즉시 단종', '재고 소진 후 단종', '특정 고객 유지', '기타']]], @@ -180,11 +180,11 @@ private function domainBomStructure(): array { return [ 'bom_structure' => [ - 'name' => 'BOM 구조', + 'name' => 'BOM 구조', 'description' => '완제품-부품 관계, 다단계 BOM, 변경 관리', - 'templates' => [ + 'templates' => [ [ - 'name' => '완제품-부품 관계', + 'name' => '완제품-부품 관계', 'questions' => [ ['text' => '대표 제품 1개의 완제품→부품 구성을 트리로 그려주세요', 'type' => 'bom_tree', 'ai_hint' => '최상위 제품부터 하위 부품까지 트리 구조', 'is_required' => true], ['text' => '모든 제품에 공통으로 들어가는 부품은 무엇인가요?', 'type' => 'multi_select', 'options' => ['choices' => ['가이드레일', '케이스', '모터', '제어기', '브라켓', '볼트/너트']], 'ai_hint' => '직접 입력 가능'], @@ -195,7 +195,7 @@ private function domainBomStructure(): array ], ], [ - 'name' => '다단계 BOM 및 반제품', + 'name' => '다단계 BOM 및 반제품', 'questions' => [ ['text' => '반제품(서브어셈블리)이 존재하나요? 예를 들어 "조립체"를 먼저 만들고 완제품에 투입', 'type' => 'select', 'options' => ['choices' => ['있음', '없음']]], ['text' => '반제품 목록과 구성 부품을 정리해주세요', 'type' => 'table_input', 'options' => ['columns' => ['반제품명', '구성부품', '수량', '비고']], 'depends_on' => ['question_index' => 0, 'value' => '있음']], @@ -204,7 +204,7 @@ private function domainBomStructure(): array ], ], [ - 'name' => '대체품 및 호환품', + 'name' => '대체품 및 호환품', 'questions' => [ ['text' => '특정 부품에 대한 대체품(호환품)이 있나요?', 'type' => 'select', 'options' => ['choices' => ['있음', '없음']]], ['text' => '대체품 사용 기준은? (공급 부족 시만? 원가 절감?)', 'type' => 'multi_select', 'options' => ['choices' => ['공급 부족 시', '원가 절감 목적', '고객 요청', '품질 동등 판단']], 'depends_on' => ['question_index' => 0, 'value' => '있음']], @@ -212,7 +212,7 @@ private function domainBomStructure(): array ], ], [ - 'name' => 'BOM 변경 관리', + 'name' => 'BOM 변경 관리', 'questions' => [ ['text' => 'BOM 변경(ECN/ECO) 발생 빈도는?', 'type' => 'select', 'options' => ['choices' => ['월 1회 미만', '월 1~3회', '월 3회 이상', '비정기적']]], ['text' => 'BOM 변경 승인 프로세스가 있나요?', 'type' => 'select', 'options' => ['choices' => ['있음 (공식 절차)', '비공식 구두 승인', '없음 (담당자 판단']]], @@ -222,7 +222,7 @@ private function domainBomStructure(): array ], ], [ - 'name' => '부품 카테고리', + 'name' => '부품 카테고리', 'questions' => [ ['text' => '부품을 카테고리로 분류하면 어떻게 나눠지나요? (본체, 절곡품, 전동부, 부자재 등)', 'type' => 'text', 'ai_hint' => '부품 분류 체계'], ['text' => '각 카테고리에 속하는 부품 목록을 정리해주세요', 'type' => 'table_input', 'options' => ['columns' => ['카테고리', '부품명', '규격']]], @@ -242,11 +242,11 @@ private function domainDimensionFormula(): array { return [ 'dimension_formula' => [ - 'name' => '치수/변수 계산', + 'name' => '치수/변수 계산', 'description' => '오픈 사이즈→제작 사이즈 변환, 파생 변수 계산, 복합 공식', - 'templates' => [ + 'templates' => [ [ - 'name' => '오픈 사이즈 → 제작 사이즈', + 'name' => '오픈 사이즈 → 제작 사이즈', 'questions' => [ ['text' => '고객이 입력하는 기본 치수 항목은 무엇인가요? (폭, 높이, 깊이 등)', 'type' => 'multi_select', 'options' => ['choices' => ['폭(W)', '높이(H)', '깊이(D)', '두께(T)', '지름(Ø)']], 'is_required' => true], ['text' => '오픈 사이즈에서 제작 사이즈로 변환할 때 더하는 마진값은?', 'type' => 'formula_input', 'ai_hint' => '예: W1 = W0 + 120, H1 = H0 + 50', 'expected_format' => 'mm'], @@ -259,7 +259,7 @@ private function domainDimensionFormula(): array ], ], [ - 'name' => '복합 공식 및 조건 분기', + 'name' => '복합 공식 및 조건 분기', 'questions' => [ ['text' => 'IF/CASE 조건 분기가 있는 계산식이 있나요? (예: 폭이 X 이상이면 다른 공식 사용)', 'type' => 'select', 'options' => ['choices' => ['있음', '없음']]], ['text' => '조건 분기 공식을 모두 정리해주세요', 'type' => 'table_input', 'options' => ['columns' => ['변수명', '조건', '조건 참 공식', '조건 거짓 공식']], 'depends_on' => ['question_index' => 0, 'value' => '있음']], @@ -268,7 +268,7 @@ private function domainDimensionFormula(): array ], ], [ - 'name' => '허용 오차 및 변수 의존 관계', + 'name' => '허용 오차 및 변수 의존 관계', 'questions' => [ ['text' => '치수별 허용 오차 범위가 있나요?', 'type' => 'table_input', 'options' => ['columns' => ['치수항목', '허용오차(+/-)', '단위', '비고']]], ['text' => '최소/최대 입력 가능 치수 범위는?', 'type' => 'table_input', 'options' => ['columns' => ['치수항목', '최솟값', '최댓값', '단위']]], @@ -292,11 +292,11 @@ private function domainComponentConfig(): array { return [ 'component_config' => [ - 'name' => '부품 구성 상세', + 'name' => '부품 구성 상세', 'description' => '주요 부품별 규격, 선택 기준, 공급업체, 재고 관리', - 'templates' => [ + 'templates' => [ [ - 'name' => '주요 부품별 상세', + 'name' => '주요 부품별 상세', 'questions' => [ ['text' => '가이드레일의 표준 길이 규격은? (예: 1219, 2438, 3305mm)', 'type' => 'table_input', 'options' => ['columns' => ['규격코드', '길이(mm)', '비고']]], ['text' => '가이드레일 길이 조합 규칙은? (어떤 길이를 몇 개 사용?)', 'type' => 'text', 'ai_hint' => '높이에 따른 가이드레일 조합 로직'], @@ -309,7 +309,7 @@ private function domainComponentConfig(): array ], ], [ - 'name' => '공급업체 및 리드타임', + 'name' => '공급업체 및 리드타임', 'questions' => [ ['text' => '주요 부품별 공급업체를 정리해주세요', 'type' => 'table_input', 'options' => ['columns' => ['부품명', '주공급업체', '대체공급업체', '원산지']]], ['text' => '부품별 발주 리드타임(납기일)은?', 'type' => 'table_input', 'options' => ['columns' => ['부품명', '리드타임(일)', '비고']]], @@ -318,7 +318,7 @@ private function domainComponentConfig(): array ], ], [ - 'name' => '안전재고 및 수입검사', + 'name' => '안전재고 및 수입검사', 'questions' => [ ['text' => '부품별 안전재고 기준이 있나요?', 'type' => 'select', 'options' => ['choices' => ['있음 (부품별)', '있음 (카테고리별)', '없음']]], ['text' => '안전재고 기준 수량 및 계산 방식은?', 'type' => 'table_input', 'options' => ['columns' => ['부품명', '안전재고량', '단위', '계산기준']]], @@ -327,7 +327,7 @@ private function domainComponentConfig(): array ], ], [ - 'name' => '특수 구성', + 'name' => '특수 구성', 'questions' => [ ['text' => '연기차단재 등 특수 부품이 있나요? 적용 조건은?', 'type' => 'text'], ['text' => '보강재(샤프트, 파이프, 앵글 등) 사용 조건은?', 'type' => 'table_input', 'options' => ['columns' => ['보강재명', '규격', '적용조건', '수량']]], @@ -346,11 +346,11 @@ private function domainPricingStructure(): array { return [ 'pricing_structure' => [ - 'name' => '단가 체계', + 'name' => '단가 체계', 'description' => '단가 관리 방식, 원가 구성, 할인 정책, 이력 관리', - 'templates' => [ + 'templates' => [ [ - 'name' => '단가 관리 방식', + 'name' => '단가 관리 방식', 'questions' => [ ['text' => '부품별 단가를 어디서 관리하나요?', 'type' => 'select', 'options' => ['choices' => ['엑셀', 'ERP 시스템', '구두/경험', '기타']]], ['text' => '단가표 파일을 업로드해주세요', 'type' => 'file_upload'], @@ -360,7 +360,7 @@ private function domainPricingStructure(): array ], ], [ - 'name' => '원가 구성요소', + 'name' => '원가 구성요소', 'questions' => [ ['text' => '원가를 구성하는 항목을 모두 선택해주세요', 'type' => 'multi_select', 'options' => ['choices' => ['재료비', '가공비', '노무비', '외주비', '경비', '관리비', '이윤']], 'is_required' => true], ['text' => '각 원가 항목의 비율(%) 또는 금액 기준을 알려주세요', 'type' => 'table_input', 'options' => ['columns' => ['원가항목', '산정방식', '비율(%) 또는 금액', '비고']]], @@ -369,7 +369,7 @@ private function domainPricingStructure(): array ], ], [ - 'name' => '할인 정책', + 'name' => '할인 정책', 'questions' => [ ['text' => '고객별/거래처별 차등 단가가 있나요?', 'type' => 'select', 'options' => ['choices' => ['있음 (등급별)', '있음 (거래처별)', '없음 (일괄 동일)']]], ['text' => '수량 할인(볼륨 디스카운트)이 있나요?', 'type' => 'select', 'options' => ['choices' => ['있음', '없음']]], @@ -379,7 +379,7 @@ private function domainPricingStructure(): array ], ], [ - 'name' => '단가 계산 방식', + 'name' => '단가 계산 방식', 'questions' => [ ['text' => '면적 기반 단가 품목은? (원/㎡)', 'type' => 'table_input', 'options' => ['columns' => ['품목명', '단가(원/㎡)', '비고']], 'expected_format' => '원/㎡'], ['text' => '중량 기반 단가 품목은? (원/kg)', 'type' => 'table_input', 'options' => ['columns' => ['품목명', '단가(원/kg)', '비고']], 'expected_format' => '원/kg'], @@ -401,11 +401,11 @@ private function domainQuantityFormula(): array { return [ 'quantity_formula' => [ - 'name' => '수량 수식', + 'name' => '수량 수식', 'description' => '부품별 수량 결정 규칙, LOSS율, 발주 단위', - 'templates' => [ + 'templates' => [ [ - 'name' => '수량 결정 규칙', + 'name' => '수량 결정 규칙', 'questions' => [ ['text' => '고정 수량 부품 목록 (항상 1개, 2개 등)', 'type' => 'table_input', 'options' => ['columns' => ['부품명', '고정수량', '비고']]], ['text' => '치수 기반 수량 계산 부품과 수식', 'type' => 'formula_input', 'ai_hint' => '예: 슬랫수량 = CEIL(H1 / 슬랫피치)'], @@ -415,7 +415,7 @@ private function domainQuantityFormula(): array ], ], [ - 'name' => 'LOSS율 및 여유 수량', + 'name' => 'LOSS율 및 여유 수량', 'questions' => [ ['text' => '여유 수량(LOSS) 적용 품목과 비율은?', 'type' => 'table_input', 'options' => ['columns' => ['품목명', 'LOSS율(%)', '비고']]], ['text' => 'LOSS 유형을 구분하나요?', 'type' => 'multi_select', 'options' => ['choices' => ['절단LOSS', '가공LOSS', '불량LOSS', '취급LOSS', '운반LOSS']]], @@ -425,7 +425,7 @@ private function domainQuantityFormula(): array ], ], [ - 'name' => '발주 단위 및 최소 수량', + 'name' => '발주 단위 및 최소 수량', 'questions' => [ ['text' => '부품별 최소 발주 수량(MOQ)이 있나요?', 'type' => 'select', 'options' => ['choices' => ['있음', '없음']]], ['text' => '최소 발주 수량이 있는 부품 목록과 단위는?', 'type' => 'table_input', 'options' => ['columns' => ['부품명', '최소발주수량', '단위', '비고']], 'depends_on' => ['question_index' => 0, 'value' => '있음']], @@ -434,7 +434,7 @@ private function domainQuantityFormula(): array ], ], [ - 'name' => '수식 검증', + 'name' => '수식 검증', 'questions' => [ ['text' => '실제 견적서에서 수량 계산 예시를 보여주세요 (W=3000, H=2500일 때)', 'type' => 'table_input', 'options' => ['columns' => ['부품명', '수식', '계산결과', '단위']], 'is_required' => true], ['text' => '수식에 사용하는 함수가 있나요?', 'type' => 'multi_select', 'options' => ['choices' => ['CEIL (올림)', 'FLOOR (내림)', 'ROUND (반올림)', 'MAX', 'MIN', 'IF 조건문', 'SUM']]], @@ -453,11 +453,11 @@ private function domainConditionalLogic(): array { return [ 'conditional_logic' => [ - 'name' => '조건부 로직', + 'name' => '조건부 로직', 'description' => '범위/매핑 기반 부품 자동 선택, 예외 규칙, 우선순위', - 'templates' => [ + 'templates' => [ [ - 'name' => '범위 기반 선택', + 'name' => '범위 기반 선택', 'questions' => [ ['text' => '무게 범위별 모터 용량 선택표를 작성해주세요', 'type' => 'price_table', 'options' => ['columns' => ['범위 시작(kg)', '범위 끝(kg)', '모터용량', '비고']], 'is_required' => true], ['text' => '크기 범위별 부품 자동 선택 규칙이 있나요?', 'type' => 'table_input', 'options' => ['columns' => ['조건(변수)', '범위', '선택부품', '비고']]], @@ -465,7 +465,7 @@ private function domainConditionalLogic(): array ], ], [ - 'name' => '매핑 기반 선택', + 'name' => '매핑 기반 선택', 'questions' => [ ['text' => '제품 모델 → 기본 부품 세트 매핑표', 'type' => 'table_input', 'options' => ['columns' => ['제품모델', '기본부품1', '기본부품2', '기본부품3']]], ['text' => '설치 유형 → 추가 부품 매핑표', 'type' => 'table_input', 'options' => ['columns' => ['설치유형', '추가부품', '수량', '비고']]], @@ -474,7 +474,7 @@ private function domainConditionalLogic(): array ], ], [ - 'name' => '다중 조건 및 예외 규칙', + 'name' => '다중 조건 및 예외 규칙', 'questions' => [ ['text' => 'AND 조건이 필요한 규칙이 있나요? (예: 폭 AND 높이 동시 조건)', 'type' => 'select', 'options' => ['choices' => ['있음', '없음']]], ['text' => 'AND 조건 규칙을 정리해주세요', 'type' => 'table_input', 'options' => ['columns' => ['조건1', '조건2', '결과', '비고']], 'depends_on' => ['question_index' => 0, 'value' => '있음']], @@ -484,7 +484,7 @@ private function domainConditionalLogic(): array ], ], [ - 'name' => '우선순위 및 시즌/프로젝트 조건', + 'name' => '우선순위 및 시즌/프로젝트 조건', 'questions' => [ ['text' => '조건 규칙 간 충돌 시 우선순위 처리 방식은?', 'type' => 'select', 'options' => ['choices' => ['가장 구체적인 조건 우선', '가장 최근 등록 우선', '수동 지정', '담당자 판단']]], ['text' => '시즌별로 단가/구성이 달라지는 경우가 있나요?', 'type' => 'select', 'options' => ['choices' => ['있음', '없음']]], @@ -505,11 +505,11 @@ private function domainQuoteFormat(): array { return [ 'quote_format' => [ - 'name' => '견적서 양식', + 'name' => '견적서 양식', 'description' => '출력 양식, 다중 양식, 특수 요구사항', - 'templates' => [ + 'templates' => [ [ - 'name' => '기본 출력 양식', + 'name' => '기본 출력 양식', 'questions' => [ ['text' => '현재 사용 중인 견적서 양식을 업로드해주세요', 'type' => 'file_upload', 'is_required' => true], ['text' => '견적서에 표시되는 항목 그룹은?', 'type' => 'multi_select', 'options' => ['choices' => ['재료비', '노무비', '경비', '설치비', '운반비', '이윤', '부가세']]], @@ -521,7 +521,7 @@ private function domainQuoteFormat(): array ], ], [ - 'name' => '다중 양식 및 고객 맞춤', + 'name' => '다중 양식 및 고객 맞춤', 'questions' => [ ['text' => '용도별로 다른 견적서 양식을 사용하나요?', 'type' => 'multi_select', 'options' => ['choices' => ['관급용 별도 양식', '민간공사용 별도 양식', '수출용 별도 양식', '없음 (단일 양식)']]], ['text' => '고객사 요청으로 양식이 달라지는 경우가 있나요?', 'type' => 'select', 'options' => ['choices' => ['있음 (고객사 지정 양식)', '없음']]], @@ -531,7 +531,7 @@ private function domainQuoteFormat(): array ], ], [ - 'name' => '첨부 서류 및 전자 견적', + 'name' => '첨부 서류 및 전자 견적', 'questions' => [ ['text' => '견적서에 함께 제출하는 첨부 서류는?', 'type' => 'multi_select', 'options' => ['choices' => ['시방서', '인증서 사본', '시험성적서', '카탈로그', '도면', '회사 소개서']]], ['text' => '전자 견적(이메일, 전자계약 등) vs 종이 견적 비율은?', 'type' => 'select', 'options' => ['choices' => ['전자 견적 100%', '주로 전자, 일부 종이', '혼용 50:50', '주로 종이', '종이 견적 100%']]], @@ -540,7 +540,7 @@ private function domainQuoteFormat(): array ], ], [ - 'name' => '특수 요구사항', + 'name' => '특수 요구사항', 'questions' => [ ['text' => '산출내역서(세부 내역)를 별도로 제공하나요?', 'type' => 'checkbox'], ['text' => '위치별(층/부호) 개별 산출이 필요한가요?', 'type' => 'checkbox'], @@ -561,11 +561,11 @@ private function domainProductionProcess(): array { return [ 'production_process' => [ - 'name' => '생산 공정', + 'name' => '생산 공정', 'description' => '공정 흐름, 설비, 납기, 작업지시, 외주 관리', - 'templates' => [ + 'templates' => [ [ - 'name' => '공정 흐름 및 작업장 구성', + 'name' => '공정 흐름 및 작업장 구성', 'questions' => [ ['text' => '생산 공정 흐름을 순서대로 나열해주세요', 'type' => 'text', 'ai_hint' => '예: 원자재 입고 → 절단 → 가공 → 조립 → 검사 → 포장 → 출하', 'is_required' => true], ['text' => '작업장(공장) 구성을 정리해주세요', 'type' => 'table_input', 'options' => ['columns' => ['작업장명', '담당 공정', '작업인원', '비고']]], @@ -574,7 +574,7 @@ private function domainProductionProcess(): array ], ], [ - 'name' => '설비 목록 및 표준시간', + 'name' => '설비 목록 및 표준시간', 'questions' => [ ['text' => '주요 생산 설비 목록을 정리해주세요', 'type' => 'table_input', 'options' => ['columns' => ['설비명', '모델/사양', '처리 가능 규격', '일일 생산 용량']]], ['text' => '설비별 병목 공정이 있나요?', 'type' => 'select', 'options' => ['choices' => ['있음', '없음']]], @@ -584,7 +584,7 @@ private function domainProductionProcess(): array ], ], [ - 'name' => '납기 기준 및 생산 계획', + 'name' => '납기 기준 및 생산 계획', 'questions' => [ ['text' => '제품별 평균 생산 납기일은?', 'type' => 'table_input', 'options' => ['columns' => ['제품군', '평균 납기(영업일)', '비고']], 'is_required' => true], ['text' => '납기 계산 기준일은?', 'type' => 'select', 'options' => ['choices' => ['수주 확정일', '선금 수령일', '도면 승인일', '기타']]], @@ -593,7 +593,7 @@ private function domainProductionProcess(): array ], ], [ - 'name' => '외주 및 작업지시', + 'name' => '외주 및 작업지시', 'questions' => [ ['text' => '외주 가공 공정이 있나요?', 'type' => 'select', 'options' => ['choices' => ['있음', '없음']]], ['text' => '외주 가공 품목과 외주업체 목록을 정리해주세요', 'type' => 'table_input', 'options' => ['columns' => ['외주품목', '가공내용', '외주업체', '단가기준']], 'depends_on' => ['question_index' => 0, 'value' => '있음']], @@ -615,11 +615,11 @@ private function domainQualityControl(): array { return [ 'quality_control' => [ - 'name' => '품질 관리', + 'name' => '품질 관리', 'description' => '검사 기준, 불량 분류, 인증 관리, 클레임 처리', - 'templates' => [ + 'templates' => [ [ - 'name' => '검사 체계', + 'name' => '검사 체계', 'questions' => [ ['text' => '수입검사(자재 입고 검사)를 실시하나요?', 'type' => 'select', 'options' => ['choices' => ['예, 전수검사', '예, 샘플링검사', '아니오']], 'is_required' => true], ['text' => '수입검사 대상 품목과 검사 항목을 정리해주세요', 'type' => 'table_input', 'options' => ['columns' => ['품목', '검사항목', '검사방법', '합격기준']]], @@ -630,7 +630,7 @@ private function domainQualityControl(): array ], ], [ - 'name' => '불량 관리 및 시정조치', + 'name' => '불량 관리 및 시정조치', 'questions' => [ ['text' => '불량 유형을 어떻게 분류하나요?', 'type' => 'multi_select', 'options' => ['choices' => ['치수불량', '외관불량', '기능불량', '재료불량', '조립불량', '기타']]], ['text' => '불량 발생 시 시정/예방 조치 프로세스를 설명해주세요', 'type' => 'text', 'ai_hint' => '불량 발생 → 원인분석 → 시정조치 → 효과확인 흐름'], @@ -638,7 +638,7 @@ private function domainQualityControl(): array ], ], [ - 'name' => '인증 및 고객 클레임', + 'name' => '인증 및 고객 클레임', 'questions' => [ ['text' => '품질 관련 인증 보유 현황은? (ISO, KC 등)', 'type' => 'multi_select', 'options' => ['choices' => ['ISO 9001', 'ISO 14001', 'KC 안전인증', '기타 인증']]], ['text' => '인증 유지를 위한 정기 감사 주기는?', 'type' => 'select', 'options' => ['choices' => ['반기 1회', '연 1회', '2년 1회', '해당 없음']]], @@ -660,11 +660,11 @@ private function domainLogisticsInventory(): array { return [ 'logistics_inventory' => [ - 'name' => '물류/재고', + 'name' => '물류/재고', 'description' => '입출고, 창고 관리, 재고 실사, 운송/배송', - 'templates' => [ + 'templates' => [ [ - 'name' => '입출고 및 창고 관리', + 'name' => '입출고 및 창고 관리', 'questions' => [ ['text' => '자재 입고 프로세스를 설명해주세요', 'type' => 'text', 'ai_hint' => '발주 → 납품 → 수입검사 → 입고 처리 흐름', 'is_required' => true], ['text' => '완제품 출고 프로세스를 설명해주세요', 'type' => 'text', 'ai_hint' => '출하 지시 → 피킹 → 포장 → 검수 → 출고 처리'], @@ -674,7 +674,7 @@ private function domainLogisticsInventory(): array ], ], [ - 'name' => '재고 정책', + 'name' => '재고 정책', 'questions' => [ ['text' => '재고 적재 방식(FIFO/LIFO/지정위치)은?', 'type' => 'select', 'options' => ['choices' => ['FIFO (선입선출)', 'LIFO (후입선출)', '지정 위치 고정', '혼용']]], ['text' => '재고 실사 주기는?', 'type' => 'select', 'options' => ['choices' => ['월 1회', '분기 1회', '반기 1회', '연 1회', '비정기']]], @@ -684,7 +684,7 @@ private function domainLogisticsInventory(): array ], ], [ - 'name' => '운송/배송 및 반품', + 'name' => '운송/배송 및 반품', 'questions' => [ ['text' => '주요 운송/배송 방식은?', 'type' => 'multi_select', 'options' => ['choices' => ['자사 차량', '택배', '화물 운송', '고객 자체 수령', '설치팀 직배송']]], ['text' => '배송 지역별 운임 기준이 있나요?', 'type' => 'select', 'options' => ['choices' => ['있음 (지역별 차등)', '있음 (중량별)', '없음 (포함가)', '별도 협의']]], @@ -706,11 +706,11 @@ private function domainSalesCustomer(): array { return [ 'sales_customer' => [ - 'name' => '영업/고객', + 'name' => '영업/고객', 'description' => '거래처 분류, 계약, 결제, 영업 파이프라인, A/S', - 'templates' => [ + 'templates' => [ [ - 'name' => '거래처 및 계약 유형', + 'name' => '거래처 및 계약 유형', 'questions' => [ ['text' => '거래처 유형을 선택해주세요', 'type' => 'multi_select', 'options' => ['choices' => ['건설사', '시공사(하도급)', '직거래(건물주)', '관공서', '유통업체', '수출']], 'is_required' => true], ['text' => '거래처별 판매 비중(%)을 대략 입력해주세요', 'type' => 'table_input', 'options' => ['columns' => ['거래처유형', '판매비중(%)', '비고']]], @@ -719,7 +719,7 @@ private function domainSalesCustomer(): array ], ], [ - 'name' => '결제 조건 및 영업 파이프라인', + 'name' => '결제 조건 및 영업 파이프라인', 'questions' => [ ['text' => '주로 사용하는 결제 조건은?', 'type' => 'multi_select', 'options' => ['choices' => ['선금 100%', '선금+잔금', '선금+중도금+잔금', '후불(납품 후)', '어음 결제']]], ['text' => '선금/중도금/잔금 비율 기준을 알려주세요', 'type' => 'table_input', 'options' => ['columns' => ['결제단계', '비율(%)', '지급 시점', '비고']]], @@ -729,7 +729,7 @@ private function domainSalesCustomer(): array ], ], [ - 'name' => 'A/S 및 고객 관리', + 'name' => 'A/S 및 고객 관리', 'questions' => [ ['text' => '하자보증 기간 및 기준은?', 'type' => 'table_input', 'options' => ['columns' => ['제품군', '하자보증기간', '보증 범위', '제외 사항']], 'is_required' => true], ['text' => 'A/S 접수 채널은?', 'type' => 'multi_select', 'options' => ['choices' => ['전화', '이메일', '온라인 신청', '담당자 직접 접수']]],