diff --git a/src/components/business/construction/estimates/EstimateDetailForm.tsx b/src/components/business/construction/estimates/EstimateDetailForm.tsx index 2284a569..d70a718b 100644 --- a/src/components/business/construction/estimates/EstimateDetailForm.tsx +++ b/src/components/business/construction/estimates/EstimateDetailForm.tsx @@ -113,11 +113,11 @@ export default function EstimateDetailForm({ console.log('πŸ” [handleConfirmSave] formData.priceAdjustmentData:', formData.priceAdjustmentData); console.log('πŸ” [handleConfirmSave] formData 전체:', formData); - // ν˜„μž¬ μ‚¬μš©μž 이름을 견적자둜 μ„€μ •ν•˜κ³ , μƒνƒœλ₯Ό κ²¬μ μ™„λ£Œλ‘œ λ³€κ²½ν•˜μ—¬ μ €μž₯ + // ν˜„μž¬ μ‚¬μš©μž 이름을 견적자둜 μ„€μ •ν•˜κ³  μ €μž₯ (μƒνƒœλŠ” μ‚¬μš©μž 선택값 μœ μ§€) const result = await updateEstimate(estimateId, { ...formData, estimatorName: currentUser!.name, - status: 'completed', // μ €μž₯ μ‹œ κ²¬μ μ™„λ£Œ μƒνƒœλ‘œ λ³€κ²½ (μž…μ°°μ—μ„œ 쑰회 κ°€λŠ₯) + // statusλŠ” formData에 ν¬ν•¨λ˜μ–΄ μžˆμœΌλ―€λ‘œ μ‚¬μš©μžκ°€ μ„ νƒν•œ κ°’ κ·ΈλŒ€λ‘œ 전솑 }); if (result.success) { diff --git a/src/components/business/construction/estimates/actions.ts b/src/components/business/construction/estimates/actions.ts index 718e1725..9c93703d 100644 --- a/src/components/business/construction/estimates/actions.ts +++ b/src/components/business/construction/estimates/actions.ts @@ -247,6 +247,14 @@ interface ApiBidDocument { * κΈ°μ‘΄ ν”„λ‘ νŠΈμ—”λ“œ νƒ€μž…κ³Ό ν˜Έν™˜μ„± μœ μ§€ */ function transformQuoteToEstimate(apiData: ApiQuote): Estimate { + const status = mapQuoteStatusToEstimateStatus(apiData.status); + + // μ™„λ£Œ μƒνƒœμΈ 경우 updated_at을 μ™„λ£ŒμΌλ‘œ μ‚¬μš© + // (μƒνƒœκ°€ μ™„λ£Œλ‘œ 변경될 λ•Œ updated_at이 κ°±μ‹ λ˜λ―€λ‘œ) + const completedDate = status === 'completed' && apiData.updated_at + ? apiData.updated_at.split('T')[0] // ISO ν˜•μ‹μ—μ„œ λ‚ μ§œλ§Œ μΆ”μΆœ + : null; + return { id: String(apiData.id), estimateCode: apiData.quote_number || '', @@ -259,9 +267,9 @@ function transformQuoteToEstimate(apiData: ApiQuote): Estimate { estimateCompanyManagerContact: '', // APIμ—μ„œ 제곡 μ‹œ λ§€ν•‘ ν•„μš” itemCount: apiData.items?.length || 0, estimateAmount: Number(apiData.total_amount) || 0, - completedDate: null, + completedDate, bidDate: apiData.registration_date || null, - status: mapQuoteStatusToEstimateStatus(apiData.status), + status, createdAt: apiData.created_at || '', updatedAt: apiData.updated_at || '', createdBy: apiData.created_by ? String(apiData.created_by) : '', diff --git a/src/components/business/construction/estimates/sections/EstimateInfoSection.tsx b/src/components/business/construction/estimates/sections/EstimateInfoSection.tsx index 0b5a556b..edb16fb5 100644 --- a/src/components/business/construction/estimates/sections/EstimateInfoSection.tsx +++ b/src/components/business/construction/estimates/sections/EstimateInfoSection.tsx @@ -15,8 +15,8 @@ import { } from '@/components/ui/select'; import { FileDropzone } from '@/components/ui/file-dropzone'; import { FileList, type ExistingFile } from '@/components/ui/file-list'; -import type { EstimateDetailFormData } from '../types'; -import { STATUS_STYLES, STATUS_LABELS, VAT_TYPE_OPTIONS } from '../types'; +import type { EstimateDetailFormData, EstimateStatus } from '../types'; +import { STATUS_STYLES, STATUS_LABELS, VAT_TYPE_OPTIONS, ESTIMATE_STATUS_OPTIONS } from '../types'; import { formatAmount } from '../utils'; interface EstimateInfoSectionProps { @@ -66,8 +66,8 @@ export function EstimateInfoSection({ - {/* 3ν–‰: κ²¬μ κΈˆμ•‘, μƒνƒœ */} -
+ {/* 3ν–‰: κ²¬μ κΈˆμ•‘, μƒνƒœ, μ™„λ£ŒμΌμž */} +
-
- - {STATUS_LABELS[formData.status]} - -
+ {isViewMode ? ( +
+ + {STATUS_LABELS[formData.status]} + +
+ ) : ( + + )}
+ {/* μ™„λ£ŒμΌμž: κ²¬μ μ™„λ£Œ μƒνƒœμΌ λ•Œλ§Œ ν‘œμ‹œ */} + {formData.status === 'completed' && formData.completedDate && ( +
+ + +
+ )}
diff --git a/src/components/business/construction/estimates/types.ts b/src/components/business/construction/estimates/types.ts index f008ab8a..d95bc6e8 100644 --- a/src/components/business/construction/estimates/types.ts +++ b/src/components/business/construction/estimates/types.ts @@ -192,6 +192,7 @@ export interface EstimateDetailFormData { estimateCompanyManagerContact: string; // 견적 νšŒμ‚¬ λ‹΄λ‹Ήμž μ—°λ½μ²˜ estimateAmount: number; status: EstimateStatus; + completedDate: string | null; // κ²¬μ μ™„λ£ŒμΌ // ν˜„μž₯μ„€λͺ…νšŒ 정보 siteBriefing: SiteBriefingInfo; @@ -273,6 +274,7 @@ export function getEmptyEstimateDetailFormData(): EstimateDetailFormData { estimateCompanyManagerContact: '', estimateAmount: 0, status: 'pending', + completedDate: null, siteBriefing: { briefingCode: '', partnerName: '', @@ -314,6 +316,7 @@ export function estimateDetailToFormData(detail: EstimateDetail): EstimateDetail estimateCompanyManagerContact: detail.estimateCompanyManagerContact || '', estimateAmount: detail.estimateAmount, status: detail.status, + completedDate: detail.completedDate || null, siteBriefing: { ...detail.siteBriefing, briefingDate: normalizeDateValue(detail.siteBriefing?.briefingDate), diff --git a/src/components/ui/quantity-input.tsx b/src/components/ui/quantity-input.tsx index af7884b1..f1039613 100644 --- a/src/components/ui/quantity-input.tsx +++ b/src/components/ui/quantity-input.tsx @@ -63,6 +63,8 @@ const QuantityInput = React.forwardRef( disabled, onFocus, onBlur, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + defaultValue: _defaultValue, // controlled componentμ΄λ―€λ‘œ defaultValue λ¬΄μ‹œ ...props }, ref