summaryrefslogtreecommitdiff
path: root/lib/rfq-last
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rfq-last')
-rw-r--r--lib/rfq-last/service.ts6
-rw-r--r--lib/rfq-last/vendor-response/editor/quotation-items-table.tsx2
-rw-r--r--lib/rfq-last/vendor-response/editor/vendor-response-editor.tsx36
-rw-r--r--lib/rfq-last/vendor/rfq-vendor-table.tsx2
-rw-r--r--lib/rfq-last/vendor/vendor-detail-dialog.tsx10
5 files changed, 35 insertions, 21 deletions
diff --git a/lib/rfq-last/service.ts b/lib/rfq-last/service.ts
index 82f8837a..be8e13e6 100644
--- a/lib/rfq-last/service.ts
+++ b/lib/rfq-last/service.ts
@@ -357,6 +357,8 @@ export async function createGeneralRfqAction(input: CreateGeneralRfqInput) {
// 5. 마감일 기본값 설정 (입력값 없으면 생성일 + 7일)
const dueDate = input.dueDate || getDefaultDueDate();
+ console.log(dueDate,"dueDate")
+
// 6. rfqsLast 테이블에 기본 정보 삽입
const [newRfq] = await tx
.insert(rfqsLast)
@@ -3798,8 +3800,8 @@ export async function updateRfqDueDate(
}
// 6. 각 vendor별로 이메일 발송
- const emailPromises = []
-
+ const emailPromises: Promise<any>[] = []
+
for (const detail of rfqDetailsData) {
if (!detail.emailSentTo) continue
diff --git a/lib/rfq-last/vendor-response/editor/quotation-items-table.tsx b/lib/rfq-last/vendor-response/editor/quotation-items-table.tsx
index c9790880..4a8960ff 100644
--- a/lib/rfq-last/vendor-response/editor/quotation-items-table.tsx
+++ b/lib/rfq-last/vendor-response/editor/quotation-items-table.tsx
@@ -53,6 +53,8 @@ export default function QuotationItemsTable({ prItems }: QuotationItemsTableProp
const currency = watch("vendorCurrency") || "USD"
const quotationItems = watch("quotationItems")
+
+ console.log(prItems,"prItems")
// PR 아이템 정보를 quotationItems에 초기화
useEffect(() => {
diff --git a/lib/rfq-last/vendor-response/editor/vendor-response-editor.tsx b/lib/rfq-last/vendor-response/editor/vendor-response-editor.tsx
index 6da704cd..569546dd 100644
--- a/lib/rfq-last/vendor-response/editor/vendor-response-editor.tsx
+++ b/lib/rfq-last/vendor-response/editor/vendor-response-editor.tsx
@@ -19,6 +19,22 @@ import { Shield, FileText, CheckCircle, XCircle, Clock, Download, Eye, Save, Sen
import { Progress } from "@/components/ui/progress"
import { Alert, AlertDescription } from "@/components/ui/alert"
+
+const quotationItemSchema = z.object({
+ rfqPrItemId: z.number(),
+ unitPrice: z.number().min(0),
+ totalPrice: z.number().min(0),
+ vendorDeliveryDate: z.date().optional().nullable(),
+ leadTime: z.number().optional(),
+ manufacturer: z.string().optional(),
+ manufacturerCountry: z.string().optional(),
+ modelNo: z.string().optional(),
+ technicalCompliance: z.boolean(),
+ alternativeProposal: z.string().optional(),
+ discountRate: z.number().optional(),
+ itemRemark: z.string().optional(),
+ deviationReason: z.string().optional(),
+}).passthrough(); // ⬅️ 여기가 핵심: 정의 안 된 키도 유지
// 폼 스키마 정의
const vendorResponseSchema = z.object({
// 상업 조건
@@ -59,21 +75,7 @@ const vendorResponseSchema = z.object({
technicalProposal: z.string().optional(),
// 견적 아이템
- quotationItems: z.array(z.object({
- rfqPrItemId: z.number(),
- unitPrice: z.number().min(0),
- totalPrice: z.number().min(0),
- vendorDeliveryDate: z.date().optional().nullable(),
- leadTime: z.number().optional(),
- manufacturer: z.string().optional(),
- manufacturerCountry: z.string().optional(),
- modelNo: z.string().optional(),
- technicalCompliance: z.boolean(),
- alternativeProposal: z.string().optional(),
- discountRate: z.number().optional(),
- itemRemark: z.string().optional(),
- deviationReason: z.string().optional(),
- }))
+quotationItems: z.array(quotationItemSchema),
})
type VendorResponseFormData = z.infer<typeof vendorResponseSchema>
@@ -104,6 +106,8 @@ export default function VendorResponseEditor({
const [attachments, setAttachments] = useState<File[]>([])
const [uploadProgress, setUploadProgress] = useState(0) // 추가
+ console.log(existingResponse,"existingResponse")
+
// Form 초기값 설정
const defaultValues: VendorResponseFormData = {
@@ -175,6 +179,8 @@ export default function VendorResponseEditor({
}
}, [errors])
+ console.log(methods.getValues())
+
const handleFormSubmit = (isSubmit: boolean = false) => {
diff --git a/lib/rfq-last/vendor/rfq-vendor-table.tsx b/lib/rfq-last/vendor/rfq-vendor-table.tsx
index 98d53f5d..ef906ed6 100644
--- a/lib/rfq-last/vendor/rfq-vendor-table.tsx
+++ b/lib/rfq-last/vendor/rfq-vendor-table.tsx
@@ -1206,7 +1206,7 @@ export function RfqVendorTable({
<Button
variant="ghost"
size="sm"
- onClick={() => handleAction("response-detail", row.original)}
+ onClick={() => handleAction("view", row.original)}
className="h-7 px-2"
>
<Eye className="h-3 w-3 mr-1" />
diff --git a/lib/rfq-last/vendor/vendor-detail-dialog.tsx b/lib/rfq-last/vendor/vendor-detail-dialog.tsx
index 54aada1d..17eed54c 100644
--- a/lib/rfq-last/vendor/vendor-detail-dialog.tsx
+++ b/lib/rfq-last/vendor/vendor-detail-dialog.tsx
@@ -148,8 +148,8 @@ export function VendorResponseDetailDialog({
return (
<Dialog open={open} onOpenChange={onOpenChange}>
- <DialogContent className="max-w-5xl max-h-[90vh] overflow-y-auto">
- <DialogHeader>
+ <DialogContent className="max-w-5xl max-h-[90vh] p-0 flex flex-col">
+ <DialogHeader className="flex-shrink-0 sticky top-0 z-20 bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60 border-b px-6 py-4">
<div className="flex items-center justify-between">
<div>
<DialogTitle className="text-xl font-bold">
@@ -170,7 +170,9 @@ export function VendorResponseDetailDialog({
</div>
</DialogHeader>
- <Tabs defaultValue="overview" className="mt-4">
+ <div className="flex-1 overflow-y-auto px-6 ">
+
+ <Tabs defaultValue="overview" className="mb-2">
<TabsList className="grid w-full grid-cols-4">
<TabsTrigger value="overview">개요</TabsTrigger>
<TabsTrigger value="quotation">견적정보</TabsTrigger>
@@ -689,6 +691,8 @@ export function VendorResponseDetailDialog({
)}
</TabsContent>
</Tabs>
+ </div>
+
</DialogContent>
</Dialog>
);