"use client" import * as React from "react" import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } 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" 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 { PlaceOfShippingSelectorDialogSingle } from "@/components/common/selectors/place-of-shipping/place-of-shipping-selector" import { VendorTierSelector } from "@/components/common/selectors/vendor-tier" import { DatePicker } from "@/components/ui/date-picker" import { NationSelector, type NationCode } from "@/components/common/selectors/nation" interface AvlVendorAddAndModifyDialogProps { open: boolean onOpenChange: (open: boolean) => void onAddItem: (item: Omit) => Promise editingItem?: AvlDetailItem // 수정할 항목 (없으면 추가 모드) onUpdateItem?: (id: number, item: Omit) => Promise // 모드 설정 isTemplate?: boolean // false: 프로젝트 AVL, true: 표준 AVL // 표준 AVL용 초기값들 (선택적) initialConstructionSector?: string initialShipType?: string initialAvlKind?: string initialHtDivision?: string // 프로젝트 AVL용 초기값들 (선택적) initialProjectCode?: string } export function AvlVendorAddAndModifyDialog({ open, onOpenChange, onAddItem, editingItem, onUpdateItem, isTemplate = false, // 기본값: 프로젝트 AVL initialConstructionSector, initialShipType, initialAvlKind, initialHtDivision, initialProjectCode }: AvlVendorAddAndModifyDialogProps) { // 설계공종 선택 상태 const [selectedDiscipline, setSelectedDiscipline] = React.useState(undefined) // 자재그룹 선택 상태 const [selectedMaterialGroup, setSelectedMaterialGroup] = React.useState(null) // 벤더 선택 상태 const [selectedVendor, setSelectedVendor] = React.useState(null) // 본사 위치 국가 선택 상태 const [selectedHeadquarterNation, setSelectedHeadquarterNation] = React.useState(undefined) // 날짜 상태 (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, // 프로젝트 AVL용 필드들 projectCode: initialProjectCode || "", // 표준 AVL용 필드들 constructionSector: initialConstructionSector || "", shipType: initialShipType || "", avlKind: initialAvlKind || "", htDivision: initialHtDivision || "", // 설계 정보 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) { // 설계공종 선택 상태 초기화 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, taxId: null, // 사업자번호 정보 없음 status: "UNKNOWN", // 상태 정보 없음 displayText: editingItem.vendorCode ? `${editingItem.vendorName} (${editingItem.vendorCode})` : editingItem.vendorName || "" }) } else { setSelectedVendor(null) } // 본사 위치 국가 선택 상태 초기화 (현재는 국가명만 저장되어 있으므로 undefined로 설정) // 실제로는 저장된 국가명으로부터 국가코드를 찾아서 설정해야 하지만, 단순화를 위해 undefined로 설정 setSelectedHeadquarterNation(undefined) // 날짜 상태 초기화 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, // 프로젝트 AVL용 필드들 projectCode: editingItem.projectCode || initialProjectCode || "", // 표준 AVL용 필드들 constructionSector: editingItem.constructionSector || initialConstructionSector || "", shipType: editingItem.shipType || initialShipType || "", avlKind: editingItem.avlKind || initialAvlKind || "", htDivision: editingItem.htDivision || initialHtDivision || "", // 설계 정보 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, isTemplate, initialProjectCode, initialConstructionSector, initialShipType, initialAvlKind, initialHtDivision]) // 다이얼로그가 열릴 때 초기값 재설정 (수정 모드가 아닐 때만) React.useEffect(() => { if (open && !editingItem) { // 설계공종 선택 상태 초기화 setSelectedDiscipline(undefined) // 자재그룹 선택 상태 초기화 setSelectedMaterialGroup(null) // 벤더 선택 상태 초기화 setSelectedVendor(null) // 본사 위치 국가 선택 상태 초기화 setSelectedHeadquarterNation(undefined) // 날짜 상태 초기화 setQuoteReceivedDate(undefined) setRecentQuoteDate(undefined) setRecentOrderDate(undefined) setFormData(prev => ({ ...prev, isTemplate: isTemplate, projectCode: initialProjectCode || "", constructionSector: initialConstructionSector || "", shipType: initialShipType || "", avlKind: initialAvlKind || "", htDivision: initialHtDivision || "", })) } }, [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 handleHeadquarterNationSelect = React.useCallback((nation: NationCode) => { setSelectedHeadquarterNation(nation) setFormData(prev => ({ ...prev, headquarterLocation: nation.CDNM // 한국어 국가명 저장 })) }, []) const handleSubmit = async () => { // 공통 필수 필드 검증 if (!formData.disciplineName || !formData.materialNameCustomerSide) { toast.error("설계공종과 고객사 AVL 자재명은 필수 입력 항목입니다.") return } // 모드별 필수 필드 검증 if (isTemplate) { // 표준 AVL 모드 if (!formData.constructionSector || !formData.shipType || !formData.avlKind || !formData.htDivision) { toast.error("공사부문, 선종, AVL종류, H/T 구분은 필수 입력 항목입니다.") return } } else { // 프로젝트 AVL 모드 if (!formData.projectCode) { toast.error("프로젝트 코드는 필수 입력 항목입니다.") return } } 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, submissionData) } else { // 추가 모드 await onAddItem(submissionData) } // 폼 및 선택 상태 초기화 setSelectedDiscipline(undefined) setSelectedMaterialGroup(null) setSelectedVendor(null) setSelectedHeadquarterNation(undefined) setQuoteReceivedDate(undefined) setRecentQuoteDate(undefined) setRecentOrderDate(undefined) setFormData({ isTemplate: isTemplate, projectCode: initialProjectCode || "", constructionSector: initialConstructionSector || "", shipType: initialShipType || "", avlKind: initialAvlKind || "", htDivision: initialHtDivision || "", equipBulkDivision: "EQUIP", disciplineCode: "", disciplineName: "", materialNameCustomerSide: "", packageCode: "", packageName: "", materialGroupCode: "", materialGroupName: "", vendorName: "", vendorCode: "", avlVendorName: "", tier: "", ownerSuggestion: false, shiSuggestion: false, headquarterLocation: "", manufacturingLocation: "", faTarget: false, faStatus: "", isAgent: false, contractSignerName: "", contractSignerCode: "", shiAvl: false, shiBlacklist: false, shiBcc: false, salesQuoteNumber: "", quoteCode: "", salesVendorInfo: "", salesCountry: "", totalAmount: "", quoteReceivedDate: "", recentQuoteDate: "", recentQuoteNumber: "", recentOrderDate: "", recentOrderNumber: "", remarks: "" } as Omit) onOpenChange(false) } catch { // 에러 처리는 호출하는 쪽에서 담당 } } const handleCancel = () => { setSelectedDiscipline(undefined) setSelectedMaterialGroup(null) setSelectedVendor(null) setSelectedHeadquarterNation(undefined) setQuoteReceivedDate(undefined) setRecentQuoteDate(undefined) setRecentOrderDate(undefined) setFormData({ isTemplate: isTemplate, projectCode: initialProjectCode || "", constructionSector: initialConstructionSector || "", shipType: initialShipType || "", avlKind: initialAvlKind || "", htDivision: initialHtDivision || "", equipBulkDivision: "EQUIP", disciplineCode: "", disciplineName: "", materialNameCustomerSide: "", packageCode: "", packageName: "", materialGroupCode: "", materialGroupName: "", vendorName: "", vendorCode: "", avlVendorName: "", tier: "", ownerSuggestion: false, shiSuggestion: false, headquarterLocation: "", manufacturingLocation: "", faTarget: false, faStatus: "", isAgent: false, contractSignerName: "", contractSignerCode: "", shiAvl: false, shiBlacklist: false, shiBcc: false, salesQuoteNumber: "", quoteCode: "", salesVendorInfo: "", salesCountry: "", totalAmount: "", quoteReceivedDate: "", recentQuoteDate: "", recentQuoteNumber: "", recentOrderDate: "", recentOrderNumber: "", remarks: "" } as Omit) onOpenChange(false) } return ( {isTemplate ? "표준 AVL" : "프로젝트 AVL"} {editingItem ? "항목 수정" : "항목 추가"} {editingItem ? `${isTemplate ? "표준 AVL" : "프로젝트 AVL"} 항목을 수정합니다. 필수 항목을 입력해주세요.` : `새로운 ${isTemplate ? "표준 AVL" : "프로젝트 AVL"} 항목을 추가합니다. 필수 항목을 입력해주세요.` } * 표시된 항목은 필수 입력사항입니다.
{/* 모드별 필수 정보 */} {!isTemplate ? ( // 프로젝트 AVL 모드

프로젝트 정보 *

setFormData(prev => ({ ...prev, projectCode: e.target.value }))} placeholder="프로젝트 코드를 입력하세요" readOnly className="bg-muted" />
) : ( // 표준 AVL 모드

표준 AVL 기본 정보 *

)} {/* 공통 정보들 (나머지 폼 필드들은 동일하게 유지) */} {/* 기본 정보 */}

기본 정보

{selectedDiscipline && ( 선택됨: [{selectedDiscipline.CD}] {selectedDiscipline.USR_DF_CHAR_18} )}
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="패키지 명을 입력하세요" />
{/* 자재그룹 정보 */}

자재그룹 정보

{/* */}
{selectedMaterialGroup && ( <> 자재그룹코드: {selectedMaterialGroup.materialGroupCode}
자재그룹명: {selectedMaterialGroup.materialGroupDescription} )}
{/* 협력업체 정보 */}

협력업체 정보

{selectedVendor && (
선택된 협력업체: [{selectedVendor.vendorCode || '-'}] {selectedVendor.vendorName} ({selectedVendor.status})
)}
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: value }))} placeholder="등급을 선택하세요" className="h-9" />
{/* 제안방향 */}

제안방향

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

위치 정보

{selectedHeadquarterNation && ( 선택됨: [{selectedHeadquarterNation.CD}] {selectedHeadquarterNation.CDNM} )}
setFormData(prev => ({ ...prev, manufacturingLocation: place?.code || "" }))} placeholder="제작/선적지를 검색하세요..." title="제작/선적지 선택" description="원하는 제작/선적지를 검색하고 선택해주세요." triggerVariant="outline" /> {formData.manufacturingLocation && (
선택됨: {formData.manufacturingLocation}
)}
{/* 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, recentQuoteNumber: e.target.value }))} placeholder="최근견적번호를 입력하세요" />
setFormData(prev => ({ ...prev, recentOrderNumber: e.target.value }))} placeholder="최근발주번호를 입력하세요" />
{/* 기타 */}

기타