summaryrefslogtreecommitdiff
path: root/lib/vendor-investigation
diff options
context:
space:
mode:
Diffstat (limited to 'lib/vendor-investigation')
-rw-r--r--lib/vendor-investigation/service.ts9
-rw-r--r--lib/vendor-investigation/table/investigation-table-columns.tsx13
-rw-r--r--lib/vendor-investigation/table/investigation-table.tsx11
-rw-r--r--lib/vendor-investigation/table/update-investigation-sheet.tsx90
-rw-r--r--lib/vendor-investigation/validations.ts1
5 files changed, 51 insertions, 73 deletions
diff --git a/lib/vendor-investigation/service.ts b/lib/vendor-investigation/service.ts
index 7c486fc9..81eabc37 100644
--- a/lib/vendor-investigation/service.ts
+++ b/lib/vendor-investigation/service.ts
@@ -45,7 +45,6 @@ export async function getVendorsInvestigation(input: GetVendorsInvestigationSche
// 실사 정보
ilike(vendorInvestigationsView.investigationNotes, s),
ilike(vendorInvestigationsView.investigationStatus, s),
- ilike(vendorInvestigationsView.evaluationType, s),
ilike(vendorInvestigationsView.investigationAddress, s),
ilike(vendorInvestigationsView.investigationMethod, s),
@@ -215,8 +214,8 @@ export async function updateVendorInvestigationAction(formData: FormData) {
}
// 선택적 enum 필드
- if (textEntries.evaluationType) {
- processedEntries.evaluationType = textEntries.evaluationType
+ if (textEntries.investigationMethod) {
+ processedEntries.investigationMethod = textEntries.investigationMethod
}
// 선택적 문자열 필드
@@ -264,8 +263,8 @@ export async function updateVendorInvestigationAction(formData: FormData) {
}
// 선택적 필드들은 존재할 때만 추가
- if (parsed.evaluationType !== undefined) {
- updateData.evaluationType = parsed.evaluationType
+ if (parsed.investigationMethod !== undefined) {
+ updateData.investigationMethod = parsed.investigationMethod
}
if (parsed.investigationAddress !== undefined) {
updateData.investigationAddress = parsed.investigationAddress
diff --git a/lib/vendor-investigation/table/investigation-table-columns.tsx b/lib/vendor-investigation/table/investigation-table-columns.tsx
index 88b6644f..3d765179 100644
--- a/lib/vendor-investigation/table/investigation-table-columns.tsx
+++ b/lib/vendor-investigation/table/investigation-table-columns.tsx
@@ -168,17 +168,6 @@ export function getColumns({
)
}
- // Handle evaluation type
- if (column.id === "evaluationType") {
- if (!value) return ""
-
- return (
- <span>
- {formatEnumValue(value as string)}
- </span>
- )
- }
-
// Handle evaluation result
if (column.id === "evaluationResult") {
if (!value) return ""
@@ -287,6 +276,8 @@ function formatStatus(status: string): string {
return "완료됨"
case "CANCELED":
return "취소됨"
+ case "RESULT_SENT":
+ return "실사결과발송"
default:
return status
}
diff --git a/lib/vendor-investigation/table/investigation-table.tsx b/lib/vendor-investigation/table/investigation-table.tsx
index 660a8507..fcd2d0be 100644
--- a/lib/vendor-investigation/table/investigation-table.tsx
+++ b/lib/vendor-investigation/table/investigation-table.tsx
@@ -98,17 +98,6 @@ export function VendorsInvestigationTable({ promises }: VendorsTableProps) {
]
},
{
- id: "evaluationType",
- label: "평가 유형",
- type: "select",
- options: [
- { label: "구매자체평가", value: "PURCHASE_SELF_EVAL" },
- { label: "서류평가", value: "DOCUMENT_EVAL" },
- { label: "제품검사평가", value: "PRODUCT_INSPECTION" },
- { label: "방문실사평가", value: "SITE_VISIT_EVAL" },
- ]
- },
- {
id: "evaluationResult",
label: "평가 결과",
type: "select",
diff --git a/lib/vendor-investigation/table/update-investigation-sheet.tsx b/lib/vendor-investigation/table/update-investigation-sheet.tsx
index c04aad64..14350815 100644
--- a/lib/vendor-investigation/table/update-investigation-sheet.tsx
+++ b/lib/vendor-investigation/table/update-investigation-sheet.tsx
@@ -3,7 +3,7 @@
import * as React from "react"
import { zodResolver } from "@hookform/resolvers/zod"
import { useForm } from "react-hook-form"
-import { CalendarIcon, Loader, X } from "lucide-react"
+import { CalendarIcon, Loader, X, Download } from "lucide-react"
import { format } from "date-fns"
import { toast } from "sonner"
@@ -67,6 +67,7 @@ import {
import { updateVendorInvestigationAction, getInvestigationAttachments, deleteInvestigationAttachment } from "../service"
import { VendorInvestigationsViewWithContacts } from "@/config/vendorInvestigationsColumnsConfig"
import prettyBytes from "pretty-bytes"
+import { downloadFile } from "@/lib/file-download"
interface UpdateVendorInvestigationSheetProps
extends React.ComponentPropsWithoutRef<typeof Sheet> {
@@ -123,7 +124,6 @@ export function UpdateVendorInvestigationSheet({
defaultValues: {
investigationId: investigation?.investigationId ?? 0,
investigationStatus: investigation?.investigationStatus ?? "PLANNED",
- evaluationType: investigation?.evaluationType ?? undefined,
investigationAddress: investigation?.investigationAddress ?? "",
investigationMethod: investigation?.investigationMethod ?? undefined,
forecastedAt: investigation?.forecastedAt ?? undefined,
@@ -143,7 +143,6 @@ export function UpdateVendorInvestigationSheet({
form.reset({
investigationId: investigation.investigationId,
investigationStatus: investigation.investigationStatus || "PLANNED",
- evaluationType: investigation.evaluationType ?? undefined,
investigationAddress: investigation.investigationAddress ?? "",
investigationMethod: investigation.investigationMethod ?? undefined,
forecastedAt: investigation.forecastedAt ?? undefined,
@@ -203,10 +202,28 @@ export function UpdateVendorInvestigationSheet({
}
}
+ // 첨부파일 다운로드 함수
+ const handleDownloadAttachment = async (attachment: any) => {
+ if (!attachment.filePath || !attachment.fileName) {
+ toast.error("첨부파일 정보가 올바르지 않습니다.")
+ return
+ }
+
+ try {
+ await downloadFile(attachment.filePath, attachment.fileName, {
+ showToast: true,
+ action: 'download'
+ })
+ } catch (error) {
+ console.error("첨부파일 다운로드 오류:", error)
+ toast.error("첨부파일 다운로드 중 오류가 발생했습니다.")
+ }
+ }
+
// 선택된 파일에서 특정 파일 제거
const handleRemoveSelectedFile = (indexToRemove: number) => {
const currentFiles = form.getValues("attachments") || []
- const updatedFiles = currentFiles.filter((_, index) => index !== indexToRemove)
+ const updatedFiles = currentFiles.filter((_: File, index: number) => index !== indexToRemove)
form.setValue("attachments", updatedFiles.length > 0 ? updatedFiles : undefined)
if (updatedFiles.length === 0) {
@@ -250,16 +267,30 @@ export function UpdateVendorInvestigationSheet({
({Math.round(attachment.fileSize / 1024)}KB)
</span>
</div>
- <Button
- type="button"
- variant="ghost"
- size="sm"
- onClick={() => handleDeleteAttachment(attachment.id)}
- className="text-destructive hover:text-destructive"
- disabled={isPending}
- >
- 삭제
- </Button>
+ <div className="flex items-center gap-1">
+ <Button
+ type="button"
+ variant="ghost"
+ size="sm"
+ onClick={() => handleDownloadAttachment(attachment)}
+ className="text-blue-600 hover:text-blue-700"
+ disabled={isPending}
+ title="파일 다운로드"
+ >
+ <Download className="h-4 w-4" />
+ </Button>
+ <Button
+ type="button"
+ variant="ghost"
+ size="sm"
+ onClick={() => handleDeleteAttachment(attachment.id)}
+ className="text-destructive hover:text-destructive"
+ disabled={isPending}
+ title="파일 삭제"
+ >
+ <X className="h-4 w-4" />
+ </Button>
+ </div>
</div>
))
) : (
@@ -417,10 +448,6 @@ export function UpdateVendorInvestigationSheet({
formData.append("investigationId", String(values.investigationId))
formData.append("investigationStatus", values.investigationStatus)
- // 선택적 필드들
- if (values.evaluationType) {
- formData.append("evaluationType", values.evaluationType)
- }
if (values.investigationAddress) {
formData.append("investigationAddress", values.investigationAddress)
@@ -559,33 +586,6 @@ export function UpdateVendorInvestigationSheet({
)}
/>
- {/* 평가 유형 */}
- <FormField
- control={form.control}
- name="evaluationType"
- render={({ field }) => (
- <FormItem>
- <FormLabel>평가 유형</FormLabel>
- <FormControl>
- <Select value={field.value || ""} onValueChange={field.onChange}>
- <SelectTrigger>
- <SelectValue placeholder="평가 유형을 선택하세요" />
- </SelectTrigger>
- <SelectContent>
- <SelectGroup>
- <SelectItem value="PURCHASE_SELF_EVAL">구매자체평가</SelectItem>
- <SelectItem value="DOCUMENT_EVAL">서류평가</SelectItem>
- <SelectItem value="PRODUCT_INSPECTION">제품검사평가</SelectItem>
- <SelectItem value="SITE_VISIT_EVAL">방문실사평가</SelectItem>
- </SelectGroup>
- </SelectContent>
- </Select>
- </FormControl>
- <FormMessage />
- </FormItem>
- )}
- />
-
{/* 실사 주소 */}
<FormField
control={form.control}
diff --git a/lib/vendor-investigation/validations.ts b/lib/vendor-investigation/validations.ts
index e4ec2b52..0e84f13a 100644
--- a/lib/vendor-investigation/validations.ts
+++ b/lib/vendor-investigation/validations.ts
@@ -67,7 +67,6 @@ export const updateVendorInvestigationSchema = z.object({
investigationStatus: z.enum(["PLANNED", "IN_PROGRESS", "COMPLETED", "CANCELED", "RESULT_SENT"], {
required_error: "실사 상태를 선택해주세요.",
}),
- evaluationType: z.enum(["PURCHASE_SELF_EVAL", "DOCUMENT_EVAL", "PRODUCT_INSPECTION", "SITE_VISIT_EVAL"]).optional(),
investigationAddress: z.string().optional(),
investigationMethod: z.enum(["PURCHASE_SELF_EVAL", "DOCUMENT_EVAL", "PRODUCT_INSPECTION", "SITE_VISIT_EVAL"]).optional(),