From ba35e67845f935c8ce0151c9ef1fefa0b0510faf Mon Sep 17 00:00:00 2001 From: joonhoekim <26rote@gmail.com> Date: Mon, 22 Sep 2025 18:59:13 +0900 Subject: (김준회) AVL 피드백 반영 (이진용 프로 건) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/avl/table/avl-registration-area.tsx | 9 +- lib/avl/table/avl-table-columns.tsx | 4 +- lib/avl/table/avl-vendor-add-and-modify-dialog.tsx | 386 +++++---- lib/avl/table/project-avl-add-dialog.tsx | 779 ----------------- lib/avl/table/project-avl-table.tsx | 65 +- lib/avl/table/standard-avl-add-dialog.tsx | 960 --------------------- lib/avl/table/standard-avl-table.tsx | 146 ++-- 7 files changed, 362 insertions(+), 1987 deletions(-) delete mode 100644 lib/avl/table/project-avl-add-dialog.tsx delete mode 100644 lib/avl/table/standard-avl-add-dialog.tsx (limited to 'lib/avl/table') diff --git a/lib/avl/table/avl-registration-area.tsx b/lib/avl/table/avl-registration-area.tsx index 52912a2c..ba1c76d4 100644 --- a/lib/avl/table/avl-registration-area.tsx +++ b/lib/avl/table/avl-registration-area.tsx @@ -1,7 +1,6 @@ "use client" import * as React from "react" -import { Card } from "@/components/ui/card" import { Button } from "@/components/ui/button" import { ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight } from "lucide-react" import { useAtom } from "jotai" @@ -430,9 +429,9 @@ export function AvlRegistrationArea({ disabled = false }: AvlRegistrationAreaPro }, [selectedTable, selectedRowCount, getSelectedIds, session]) return ( - +
{/* 고정 헤더 영역 */} -
+

AVL 등록 {disabled ? "(비활성화)" : ""}

@@ -444,7 +443,7 @@ export function AvlRegistrationArea({ disabled = false }: AvlRegistrationAreaPro
{/* 스크롤되는 콘텐츠 영역 */} -
+
{/* 프로젝트 AVL 테이블 - 9개 컬럼 */}
@@ -563,6 +562,6 @@ export function AvlRegistrationArea({ disabled = false }: AvlRegistrationAreaPro
- +
) } diff --git a/lib/avl/table/avl-table-columns.tsx b/lib/avl/table/avl-table-columns.tsx index 72c59aa9..d95a29b0 100644 --- a/lib/avl/table/avl-table-columns.tsx +++ b/lib/avl/table/avl-table-columns.tsx @@ -226,7 +226,7 @@ export function getColumns({ selectedRows = [], onRowSelect }: GetColumnsProps): { accessorKey: "createdAt", header: ({ column }) => ( - + ), cell: ({ getValue }) => { const date = getValue() as string @@ -237,7 +237,7 @@ export function getColumns({ selectedRows = [], onRowSelect }: GetColumnsProps): { accessorKey: "createdBy", header: ({ column }) => ( - + ), cell: ({ getValue }) => { const date = getValue() as string diff --git a/lib/avl/table/avl-vendor-add-and-modify-dialog.tsx b/lib/avl/table/avl-vendor-add-and-modify-dialog.tsx index 174982e4..4f0eb404 100644 --- a/lib/avl/table/avl-vendor-add-and-modify-dialog.tsx +++ b/lib/avl/table/avl-vendor-add-and-modify-dialog.tsx @@ -8,7 +8,6 @@ import { DialogFooter, DialogHeader, DialogTitle, - DialogTrigger, } from "@/components/ui/dialog" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" @@ -24,6 +23,14 @@ import { } from "@/components/ui/select" import { toast } from "sonner" import type { AvlVendorInfoInput, AvlDetailItem } from "../types" +import { EngineeringDisciplineSelector, type DisciplineCode } from "@/components/common/discipline" +import { MaterialGroupSelectorDialogSingle } from "@/components/common/material/material-group-selector-dialog-single" +import type { MaterialSearchItem } from "@/lib/material/material-group-service" +import { VendorSelectorDialogSingle } from "@/components/common/vendor" +import type { VendorSearchItem } from "@/components/common/vendor" +import { PlaceOfShippingSelector } from "@/components/common/selectors/place-of-shipping" +import { VendorTierSelector } from "@/components/common/selectors/vendor-tier" +import { DatePicker } from "@/components/ui/date-picker" interface AvlVendorAddAndModifyDialogProps { open: boolean @@ -58,6 +65,16 @@ export function AvlVendorAddAndModifyDialog({ initialHtDivision, initialProjectCode }: AvlVendorAddAndModifyDialogProps) { + // 설계공종 선택 상태 + const [selectedDiscipline, setSelectedDiscipline] = React.useState(undefined) + // 자재그룹 선택 상태 + const [selectedMaterialGroup, setSelectedMaterialGroup] = React.useState(null) + // 벤더 선택 상태 + const [selectedVendor, setSelectedVendor] = React.useState(null) + // 날짜 상태 (Date 객체로 관리) + const [quoteReceivedDate, setQuoteReceivedDate] = React.useState(undefined) + const [recentQuoteDate, setRecentQuoteDate] = React.useState(undefined) + const [recentOrderDate, setRecentOrderDate] = React.useState(undefined) const [formData, setFormData] = React.useState>({ // 공통 기본 설정 isTemplate: isTemplate, @@ -137,9 +154,50 @@ export function AvlVendorAddAndModifyDialog({ remarks: "" }) - // 수정 모드일 때 폼 데이터 초기화 + // 수정 모드일 때 설계공종 선택 상태 및 폼 데이터 초기화 React.useEffect(() => { if (editingItem) { + // 설계공종 선택 상태 초기화 + if (editingItem.disciplineCode && editingItem.disciplineName) { + setSelectedDiscipline({ + CD: editingItem.disciplineCode, + USR_DF_CHAR_18: editingItem.disciplineName + }) + } else { + setSelectedDiscipline(undefined) + } + + // 자재그룹 선택 상태 초기화 + if (editingItem.materialGroupCode && editingItem.materialGroupName) { + setSelectedMaterialGroup({ + materialGroupCode: editingItem.materialGroupCode, + materialGroupDescription: editingItem.materialGroupName, + displayText: `${editingItem.materialGroupCode} - ${editingItem.materialGroupName}` + }) + } else { + setSelectedMaterialGroup(null) + } + + // 벤더 선택 상태 초기화 (기존 데이터가 있으면 가상의 벤더 객체 생성) + if (editingItem.vendorCode || editingItem.vendorName) { + setSelectedVendor({ + id: -1, // 임시 ID (실제 벤더 ID는 알 수 없음) + vendorName: editingItem.vendorName || "", + vendorCode: editingItem.vendorCode || null, + status: "UNKNOWN", // 상태 정보 없음 + displayText: editingItem.vendorCode + ? `${editingItem.vendorName} (${editingItem.vendorCode})` + : editingItem.vendorName || "" + }) + } else { + setSelectedVendor(null) + } + + // 날짜 상태 초기화 + setQuoteReceivedDate(editingItem.quoteReceivedDate ? new Date(editingItem.quoteReceivedDate) : undefined) + setRecentQuoteDate(editingItem.recentQuoteDate ? new Date(editingItem.recentQuoteDate) : undefined) + setRecentOrderDate(editingItem.recentOrderDate ? new Date(editingItem.recentOrderDate) : undefined) + setFormData({ // 공통 기본 설정 isTemplate: editingItem.isTemplate ?? isTemplate, @@ -224,6 +282,17 @@ export function AvlVendorAddAndModifyDialog({ // 다이얼로그가 열릴 때 초기값 재설정 (수정 모드가 아닐 때만) React.useEffect(() => { if (open && !editingItem) { + // 설계공종 선택 상태 초기화 + setSelectedDiscipline(undefined) + // 자재그룹 선택 상태 초기화 + setSelectedMaterialGroup(null) + // 벤더 선택 상태 초기화 + setSelectedVendor(null) + // 날짜 상태 초기화 + setQuoteReceivedDate(undefined) + setRecentQuoteDate(undefined) + setRecentOrderDate(undefined) + setFormData(prev => ({ ...prev, isTemplate: isTemplate, @@ -236,6 +305,40 @@ export function AvlVendorAddAndModifyDialog({ } }, [open, editingItem, isTemplate, initialProjectCode, initialConstructionSector, initialShipType, initialAvlKind, initialHtDivision]) + // 설계공종 선택 핸들러 + const handleDisciplineSelect = React.useCallback((discipline: DisciplineCode) => { + setSelectedDiscipline(discipline) + setFormData(prev => ({ + ...prev, + disciplineCode: discipline.CD, + disciplineName: discipline.USR_DF_CHAR_18 + })) + }, []) + + // 자재그룹 선택 핸들러 + const handleMaterialGroupSelect = React.useCallback((materialGroup: MaterialSearchItem | null) => { + setSelectedMaterialGroup(materialGroup) + setFormData(prev => ({ + ...prev, + materialGroupCode: materialGroup?.materialGroupCode || "", + materialGroupName: materialGroup?.materialGroupDescription || "" + })) + }, []) + + // 벤더 선택 핸들러 (선택기에서 벤더를 선택했을 때 Input 필드에 자동 입력) + const handleVendorSelect = React.useCallback((vendor: VendorSearchItem | null) => { + setSelectedVendor(vendor) + if (vendor) { + setFormData(prev => ({ + ...prev, + vendorCode: vendor.vendorCode || "", + vendorName: vendor.vendorName || "", + // AVL 등재업체명도 기본적으로 벤더명으로 설정 (사용자가 수정 가능) + avlVendorName: vendor.vendorName || "" + })) + } + }, []) + const handleSubmit = async () => { // 공통 필수 필드 검증 if (!formData.disciplineName || !formData.materialNameCustomerSide) { @@ -259,15 +362,34 @@ export function AvlVendorAddAndModifyDialog({ } try { + // 날짜 필드들을 문자열로 변환 + const formatDate = (date: Date | undefined): string => { + if (!date) return "" + return date.toISOString().split('T')[0] // YYYY-MM-DD 형식 + } + + const submissionData = { + ...formData, + quoteReceivedDate: formatDate(quoteReceivedDate), + recentQuoteDate: formatDate(recentQuoteDate), + recentOrderDate: formatDate(recentOrderDate), + } + if (editingItem && onUpdateItem) { // 수정 모드 - await onUpdateItem(editingItem.id, formData) + await onUpdateItem(editingItem.id, submissionData) } else { // 추가 모드 - await onAddItem(formData) + await onAddItem(submissionData) } - // 폼 초기화 + // 폼 및 선택 상태 초기화 + setSelectedDiscipline(undefined) + setSelectedMaterialGroup(null) + setSelectedVendor(null) + setQuoteReceivedDate(undefined) + setRecentQuoteDate(undefined) + setRecentOrderDate(undefined) setFormData({ isTemplate: isTemplate, projectCode: initialProjectCode || "", @@ -313,12 +435,18 @@ export function AvlVendorAddAndModifyDialog({ } as Omit) onOpenChange(false) - } catch (error) { + } catch { // 에러 처리는 호출하는 쪽에서 담당 } } const handleCancel = () => { + setSelectedDiscipline(undefined) + setSelectedMaterialGroup(null) + setSelectedVendor(null) + setQuoteReceivedDate(undefined) + setRecentQuoteDate(undefined) + setRecentOrderDate(undefined) setFormData({ isTemplate: isTemplate, projectCode: initialProjectCode || "", @@ -365,31 +493,6 @@ export function AvlVendorAddAndModifyDialog({ onOpenChange(false) } - // 선종 옵션들 (공사부문에 따라 다름) - const getShipTypeOptions = (constructionSector: string) => { - if (constructionSector === "조선") { - return [ - { value: "A-max", label: "A-max" }, - { value: "S-max", label: "S-max" }, - { value: "VLCC", label: "VLCC" }, - { value: "LNGC", label: "LNGC" }, - { value: "CONT", label: "CONT" }, - ] - } else if (constructionSector === "해양") { - return [ - { value: "FPSO", label: "FPSO" }, - { value: "FLNG", label: "FLNG" }, - { value: "FPU", label: "FPU" }, - { value: "Platform", label: "Platform" }, - { value: "WTIV", label: "WTIV" }, - { value: "GOM", label: "GOM" }, - ] - } else { - return [] - } - } - - const shipTypeOptions = getShipTypeOptions(formData.constructionSector) return ( @@ -419,6 +522,8 @@ export function AvlVendorAddAndModifyDialog({ value={formData.projectCode} onChange={(e) => setFormData(prev => ({ ...prev, projectCode: e.target.value }))} placeholder="프로젝트 코드를 입력하세요" + readOnly + className="bg-muted" />
@@ -430,82 +535,39 @@ export function AvlVendorAddAndModifyDialog({
- + readOnly + className="bg-muted" + placeholder="공사부문이 설정되지 않았습니다" + />
- + readOnly + className="bg-muted" + placeholder="선종이 설정되지 않았습니다" + />
- + readOnly + className="bg-muted" + placeholder="AVL종류가 설정되지 않았습니다" + />
- + readOnly + className="bg-muted" + placeholder="H/T 구분이 설정되지 않았습니다" + />
@@ -533,23 +595,19 @@ export function AvlVendorAddAndModifyDialog({
-
- - setFormData(prev => ({ ...prev, disciplineCode: e.target.value }))} - placeholder="설계공종코드를 입력하세요" - /> -
- - setFormData(prev => ({ ...prev, disciplineName: e.target.value }))} - placeholder="설계공종명을 입력하세요" - /> + + +
+ {selectedDiscipline && ( + 선택됨: [{selectedDiscipline.CD}] {selectedDiscipline.USR_DF_CHAR_18} + )} +
@@ -591,31 +649,51 @@ export function AvlVendorAddAndModifyDialog({ {/* 자재그룹 정보 */}

자재그룹 정보

-
-
- - setFormData(prev => ({ ...prev, materialGroupCode: e.target.value }))} - placeholder="자재그룹 코드를 입력하세요" - /> -
+
- - setFormData(prev => ({ ...prev, materialGroupName: e.target.value }))} - placeholder="자재그룹 명을 입력하세요" - /> + {/* */} + +
+ {selectedMaterialGroup && ( + <> + 자재그룹코드: {selectedMaterialGroup.materialGroupCode} +
+ 자재그룹명: {selectedMaterialGroup.materialGroupDescription} + + )} +
{/* 협력업체 정보 */}
-

협력업체 정보

+
+

협력업체 정보

+ +
+ {selectedVendor && ( +
+ 선택된 협력업체: [{selectedVendor.vendorCode || '-'}] {selectedVendor.vendorName} + ({selectedVendor.status}) +
+ )}
@@ -646,11 +724,11 @@ export function AvlVendorAddAndModifyDialog({
- setFormData(prev => ({ ...prev, tier: e.target.value }))} - placeholder="등급을 입력하세요" + onValueChange={(value) => setFormData(prev => ({ ...prev, tier: value }))} + placeholder="등급을 선택하세요" + className="h-9" />
@@ -698,11 +776,11 @@ export function AvlVendorAddAndModifyDialog({
- setFormData(prev => ({ ...prev, manufacturingLocation: e.target.value }))} - placeholder="제작/선적지를 입력하세요" + onValueChange={(value) => setFormData(prev => ({ ...prev, manufacturingLocation: value }))} + placeholder="제작/선적지를 선택하세요" + className="h-9" />
@@ -862,12 +940,12 @@ export function AvlVendorAddAndModifyDialog({ />
- - setFormData(prev => ({ ...prev, quoteReceivedDate: e.target.value }))} - placeholder="YYYY-MM-DD" + +
@@ -887,12 +965,12 @@ export function AvlVendorAddAndModifyDialog({ />
- - setFormData(prev => ({ ...prev, recentQuoteDate: e.target.value }))} - placeholder="YYYY-MM-DD" + +
@@ -905,12 +983,12 @@ export function AvlVendorAddAndModifyDialog({ />
- - setFormData(prev => ({ ...prev, recentOrderDate: e.target.value }))} - placeholder="YYYY-MM-DD" + +
diff --git a/lib/avl/table/project-avl-add-dialog.tsx b/lib/avl/table/project-avl-add-dialog.tsx deleted file mode 100644 index 509e4258..00000000 --- a/lib/avl/table/project-avl-add-dialog.tsx +++ /dev/null @@ -1,779 +0,0 @@ -"use client" - -import * as React from "react" -import { - Dialog, - DialogContent, - DialogDescription, - DialogFooter, - DialogHeader, - DialogTitle, - DialogTrigger, -} from "@/components/ui/dialog" -import { Button } from "@/components/ui/button" -import { Input } from "@/components/ui/input" -import { Label } from "@/components/ui/label" -import { Checkbox } from "@/components/ui/checkbox" -import { Textarea } from "@/components/ui/textarea" -import { - Select, - SelectContent, - SelectItem, - SelectTrigger, - SelectValue, -} from "@/components/ui/select" -import { toast } from "sonner" -import type { AvlVendorInfoInput, AvlDetailItem } from "../types" - -interface ProjectAvlAddDialogProps { - open: boolean - onOpenChange: (open: boolean) => void - onAddItem: (item: Omit) => Promise - editingItem?: AvlDetailItem // 수정할 항목 (없으면 추가 모드) - onUpdateItem?: (id: number, item: Omit) => Promise // 수정 핸들러 -} - -export function ProjectAvlAddDialog({ open, onOpenChange, onAddItem, editingItem, onUpdateItem }: ProjectAvlAddDialogProps) { - const [formData, setFormData] = React.useState>({ - // 설계 정보 - equipBulkDivision: "EQUIP", - disciplineCode: "", - disciplineName: "", - - // 자재 정보 - materialNameCustomerSide: "", - - // 패키지 정보 - packageCode: "", - packageName: "", - - // 자재그룹 정보 - materialGroupCode: "", - materialGroupName: "", - - // 협력업체 정보 - vendorName: "", - vendorCode: "", - - // AVL 정보 - avlVendorName: "", - tier: "", - - // 제안방향 - ownerSuggestion: false, - shiSuggestion: false, - - // 위치 정보 - headquarterLocation: "", - manufacturingLocation: "", - - // FA 정보 - faTarget: false, - faStatus: "", - - // Agent 정보 - isAgent: false, - - // 계약 서명주체 - contractSignerName: "", - contractSignerCode: "", - - // SHI Qualification - shiAvl: false, - shiBlacklist: false, - shiBcc: false, - - // 기술영업 견적결과 - salesQuoteNumber: "", - quoteCode: "", - salesVendorInfo: "", - salesCountry: "", - totalAmount: "", - quoteReceivedDate: "", - - // 업체 실적 현황 - recentQuoteDate: "", - recentQuoteNumber: "", - recentOrderDate: "", - recentOrderNumber: "", - - // 기타 - remarks: "" - }) - - // 수정 모드일 때 폼 데이터 초기화 - React.useEffect(() => { - if (editingItem) { - setFormData({ - // 설계 정보 - equipBulkDivision: editingItem.equipBulkDivision === "EQUIP" ? "EQUIP" : "BULK", - disciplineCode: editingItem.disciplineCode || "", - disciplineName: editingItem.disciplineName || "", - - // 자재 정보 - materialNameCustomerSide: editingItem.materialNameCustomerSide || "", - - // 패키지 정보 - packageCode: editingItem.packageCode || "", - packageName: editingItem.packageName || "", - - // 자재그룹 정보 - materialGroupCode: editingItem.materialGroupCode || "", - materialGroupName: editingItem.materialGroupName || "", - - // 협력업체 정보 - vendorName: editingItem.vendorName || "", - vendorCode: editingItem.vendorCode || "", - - // AVL 정보 - avlVendorName: editingItem.avlVendorName || "", - tier: editingItem.tier || "", - - // 제안방향 - ownerSuggestion: editingItem.ownerSuggestion || false, - shiSuggestion: editingItem.shiSuggestion || false, - - // 위치 정보 - headquarterLocation: editingItem.headquarterLocation || "", - manufacturingLocation: editingItem.manufacturingLocation || "", - - // FA 정보 - faTarget: editingItem.faTarget || false, - faStatus: editingItem.faStatus || "", - - // Agent 정보 - isAgent: editingItem.isAgent || false, - - // 계약 서명주체 - contractSignerName: editingItem.contractSignerName || "", - contractSignerCode: editingItem.contractSignerCode || "", - - // SHI Qualification - shiAvl: editingItem.shiAvl || false, - shiBlacklist: editingItem.shiBlacklist || false, - shiBcc: editingItem.shiBcc || false, - - // 기술영업 견적결과 - salesQuoteNumber: editingItem.salesQuoteNumber || "", - quoteCode: editingItem.quoteCode || "", - salesVendorInfo: editingItem.salesVendorInfo || "", - salesCountry: editingItem.salesCountry || "", - totalAmount: editingItem.totalAmount || "", - quoteReceivedDate: editingItem.quoteReceivedDate || "", - - // 업체 실적 현황 - recentQuoteDate: editingItem.recentQuoteDate || "", - recentQuoteNumber: editingItem.recentQuoteNumber || "", - recentOrderDate: editingItem.recentOrderDate || "", - recentOrderNumber: editingItem.recentOrderNumber || "", - - // 기타 - remarks: editingItem.remarks || "" - }) - } - }, [editingItem]) - - const handleSubmit = async () => { - // 필수 필드 검증 - if (!formData.disciplineName || !formData.materialNameCustomerSide) { - toast.error("설계공종과 고객사 AVL 자재명은 필수 입력 항목입니다.") - return - } - - try { - if (editingItem && onUpdateItem) { - // 수정 모드 - await onUpdateItem(editingItem.id, formData) - } else { - // 추가 모드 - await onAddItem(formData) - } - - // 폼 초기화 (onAddItem에서 성공적으로 처리된 경우에만) - setFormData({ - // 설계 정보 - equipBulkDivision: "EQUIP", - disciplineCode: "", - disciplineName: "", - - // 자재 정보 - materialNameCustomerSide: "", - - // 패키지 정보 - packageCode: "", - packageName: "", - - // 자재그룹 정보 - materialGroupCode: "", - materialGroupName: "", - - // 협력업체 정보 - vendorName: "", - vendorCode: "", - - // AVL 정보 - avlVendorName: "", - tier: "", - - // 제안방향 - ownerSuggestion: false, - shiSuggestion: false, - - // 위치 정보 - headquarterLocation: "", - manufacturingLocation: "", - - // FA 정보 - faTarget: false, - faStatus: "", - - // Agent 정보 - isAgent: false, - - // 계약 서명주체 - contractSignerName: "", - contractSignerCode: "", - - // SHI Qualification - shiAvl: false, - shiBlacklist: false, - shiBcc: false, - - // 기술영업 견적결과 - salesQuoteNumber: "", - quoteCode: "", - salesVendorInfo: "", - salesCountry: "", - totalAmount: "", - quoteReceivedDate: "", - - // 업체 실적 현황 - recentQuoteDate: "", - recentQuoteNumber: "", - recentOrderDate: "", - recentOrderNumber: "", - - // 기타 - remarks: "" - } as Omit) - - onOpenChange(false) - } catch (error) { - // 에러 처리는 onAddItem에서 담당하므로 여기서는 아무것도 하지 않음 - } - } - - const handleCancel = () => { - setFormData({ - // 설계 정보 - equipBulkDivision: "EQUIP", - disciplineCode: "", - disciplineName: "", - - // 자재 정보 - materialNameCustomerSide: "", - - // 패키지 정보 - packageCode: "", - packageName: "", - - // 자재그룹 정보 - materialGroupCode: "", - materialGroupName: "", - - // 협력업체 정보 - vendorName: "", - vendorCode: "", - - // AVL 정보 - avlVendorName: "", - tier: "", - - // 제안방향 - ownerSuggestion: false, - shiSuggestion: false, - - // 위치 정보 - headquarterLocation: "", - manufacturingLocation: "", - - // FA 정보 - faTarget: false, - faStatus: "", - - // Agent 정보 - isAgent: false, - - // 계약 서명주체 - contractSignerName: "", - contractSignerCode: "", - - // SHI Qualification - shiAvl: false, - shiBlacklist: false, - shiBcc: false, - - // 기술영업 견적결과 - salesQuoteNumber: "", - quoteCode: "", - salesVendorInfo: "", - salesCountry: "", - totalAmount: "", - quoteReceivedDate: "", - - // 업체 실적 현황 - recentQuoteDate: "", - recentQuoteNumber: "", - recentOrderDate: "", - recentOrderNumber: "", - - // 기타 - remarks: "" - } as Omit) - onOpenChange(false) - } - - return ( - - - - {editingItem ? "프로젝트 AVL 항목 수정" : "프로젝트 AVL 항목 추가"} - - {editingItem - ? "AVL 항목을 수정합니다. 필수 항목을 입력해주세요." - : "새로운 AVL 항목을 추가합니다. 필수 항목을 입력해주세요." - } * 표시된 항목은 필수 입력사항입니다. - - -
- {/* 기본 정보 */} -
-

기본 정보

-
-
- - -
-
- - setFormData(prev => ({ ...prev, disciplineCode: e.target.value }))} - placeholder="설계공종코드를 입력하세요" - /> -
-
- - setFormData(prev => ({ ...prev, disciplineName: e.target.value }))} - placeholder="설계공종명을 입력하세요" - /> -
-
- - setFormData(prev => ({ ...prev, materialNameCustomerSide: e.target.value }))} - placeholder="고객사 AVL 자재명을 입력하세요" - /> -
-
-
- - {/* 패키지 정보 */} -
-

패키지 정보

-
-
- - setFormData(prev => ({ ...prev, packageCode: e.target.value }))} - placeholder="패키지 코드를 입력하세요" - /> -
-
- - setFormData(prev => ({ ...prev, packageName: e.target.value }))} - placeholder="패키지 명을 입력하세요" - /> -
-
-
- - {/* 자재그룹 정보 */} -
-

자재그룹 정보

-
-
- - setFormData(prev => ({ ...prev, materialGroupCode: e.target.value }))} - placeholder="자재그룹 코드를 입력하세요" - /> -
-
- - setFormData(prev => ({ ...prev, materialGroupName: e.target.value }))} - placeholder="자재그룹 명을 입력하세요" - /> -
-
-
- - {/* 협력업체 정보 */} -
-

협력업체 정보

-
-
- - setFormData(prev => ({ ...prev, vendorCode: e.target.value }))} - placeholder="협력업체 코드를 입력하세요" - /> -
-
- - setFormData(prev => ({ ...prev, vendorName: e.target.value }))} - placeholder="협력업체 명을 입력하세요" - /> -
-
- - setFormData(prev => ({ ...prev, avlVendorName: e.target.value }))} - placeholder="AVL 등재업체명을 입력하세요" - /> -
-
- - setFormData(prev => ({ ...prev, tier: e.target.value }))} - placeholder="등급을 입력하세요" - /> -
-
-
- - {/* 제안방향 */} -
-

제안방향

-
-
- - setFormData(prev => ({ ...prev, ownerSuggestion: !!checked })) - } - /> - -
-
- - setFormData(prev => ({ ...prev, shiSuggestion: !!checked })) - } - /> - -
-
-
- - {/* 위치 정보 */} -
-

위치 정보

-
-
- - setFormData(prev => ({ ...prev, headquarterLocation: e.target.value }))} - placeholder="본사 위치를 입력하세요" - /> -
-
- - setFormData(prev => ({ ...prev, manufacturingLocation: e.target.value }))} - placeholder="제작/선적지를 입력하세요" - /> -
-
-
- - {/* FA 정보 */} -
-

FA 정보

-
-
- - setFormData(prev => ({ ...prev, faTarget: !!checked })) - } - /> - -
-
- - setFormData(prev => ({ ...prev, faStatus: e.target.value }))} - placeholder="FA 현황을 입력하세요" - /> -
-
-
- - {/* Agent 정보 */} -
-

Agent 정보

-
- - setFormData(prev => ({ ...prev, isAgent: !!checked })) - } - /> - -
-
- - {/* 계약 서명주체 */} -
-

계약 서명주체

-
-
- - setFormData(prev => ({ ...prev, contractSignerCode: e.target.value }))} - placeholder="계약서명주체 코드를 입력하세요" - /> -
-
- - setFormData(prev => ({ ...prev, contractSignerName: e.target.value }))} - placeholder="계약서명주체 명을 입력하세요" - /> -
-
-
- - {/* SHI Qualification */} -
-

SHI Qualification

-
-
- - setFormData(prev => ({ ...prev, shiAvl: !!checked })) - } - /> - -
-
- - setFormData(prev => ({ ...prev, shiBlacklist: !!checked })) - } - /> - -
-
- - setFormData(prev => ({ ...prev, shiBcc: !!checked })) - } - /> - -
-
-
- - {/* 기술영업 견적결과 */} -
-

기술영업 견적결과

-
-
- - setFormData(prev => ({ ...prev, salesQuoteNumber: e.target.value }))} - placeholder="기술영업 견적번호를 입력하세요" - /> -
-
- - setFormData(prev => ({ ...prev, quoteCode: e.target.value }))} - placeholder="견적서 Code를 입력하세요" - /> -
-
- - setFormData(prev => ({ ...prev, salesVendorInfo: e.target.value }))} - placeholder="견적 협력업체 명을 입력하세요" - /> -
-
- - setFormData(prev => ({ ...prev, salesCountry: e.target.value }))} - placeholder="국가를 입력하세요" - /> -
-
- - setFormData(prev => ({ ...prev, totalAmount: e.target.value }))} - placeholder="총 금액을 입력하세요" - /> -
-
- - setFormData(prev => ({ ...prev, quoteReceivedDate: e.target.value }))} - placeholder="YYYY-MM-DD" - /> -
-
-
- - {/* 업체 실적 현황 */} -
-

업체 실적 현황

-
-
- - setFormData(prev => ({ ...prev, recentQuoteNumber: e.target.value }))} - placeholder="최근견적번호를 입력하세요" - /> -
-
- - setFormData(prev => ({ ...prev, recentQuoteDate: e.target.value }))} - placeholder="YYYY-MM-DD" - /> -
-
- - setFormData(prev => ({ ...prev, recentOrderNumber: e.target.value }))} - placeholder="최근발주번호를 입력하세요" - /> -
-
- - setFormData(prev => ({ ...prev, recentOrderDate: e.target.value }))} - placeholder="YYYY-MM-DD" - /> -
-
-
- - {/* 기타 */} -
-

기타

-
- -