diff options
| author | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-08-21 06:57:36 +0000 |
|---|---|---|
| committer | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-08-21 06:57:36 +0000 |
| commit | 02b1cf005cf3e1df64183d20ba42930eb2767a9f (patch) | |
| tree | e932c54d5260b0e6fda2b46be2a6ba1c3ee30434 /lib/vendors | |
| parent | d78378ecd7ceede1429359f8058c7a99ac34b1b7 (diff) | |
(대표님, 최겸) 설계메뉴추가, 작업사항 업데이트
설계메뉴 - 문서관리
설계메뉴 - 벤더 데이터
gtc 메뉴 업데이트
정보시스템 - 메뉴리스트 및 정보 업데이트
파일 라우트 업데이트
엑셀임포트 개선
기본계약 개선
벤더 가입과정 변경 및 개선
벤더 기본정보 - pq
돌체 오류 수정 및 개선
벤더 로그인 과정 이메일 오류 수정
Diffstat (limited to 'lib/vendors')
| -rw-r--r-- | lib/vendors/service.ts | 5 | ||||
| -rw-r--r-- | lib/vendors/table/request-pq-dialog.tsx | 6 | ||||
| -rw-r--r-- | lib/vendors/validations.ts | 18 |
3 files changed, 23 insertions, 6 deletions
diff --git a/lib/vendors/service.ts b/lib/vendors/service.ts index 9af81021..9cb653ea 100644 --- a/lib/vendors/service.ts +++ b/lib/vendors/service.ts @@ -65,6 +65,7 @@ import { deleteFile, saveFile, saveBuffer } from "../file-stroage"; import { basicContractTemplates } from "@/db/schema/basicContractDocumnet"; import { basicContract } from "@/db/schema/basicContractDocumnet"; import { headers } from 'next/headers'; +import { Router } from "lucide-react"; /* ----------------------------------------------------- 1) 조회 관련 ----------------------------------------------------- */ @@ -2990,6 +2991,8 @@ export async function requestBasicContractInfo({ revalidatePath("/partners/basic-contract"); revalidatePath("/ko/partners/basic-contract"); revalidatePath("/en/partners/basic-contract"); + revalidateTag("basicContractView-vendor"); + revalidateTag("basicContractView"); return { success: true }; } catch (error) { @@ -3027,7 +3030,7 @@ export async function saveNdaAttachments(input: { const saveResult = await saveDRMFile( file, decryptWithServerAction, - `vendor-attachments/nda/${vendorId}`, + `vendors/nda/${vendorId}`, input.userId ); diff --git a/lib/vendors/table/request-pq-dialog.tsx b/lib/vendors/table/request-pq-dialog.tsx index 9fd7b1d8..20388f71 100644 --- a/lib/vendors/table/request-pq-dialog.tsx +++ b/lib/vendors/table/request-pq-dialog.tsx @@ -2,7 +2,7 @@ import * as React from "react"
import { type Row } from "@tanstack/react-table"
-import { Loader, SendHorizonal, Search, X, Plus } from "lucide-react"
+import { Loader, SendHorizonal, Search, X, Plus, Router } from "lucide-react"
import { toast } from "sonner"
import { useMediaQuery } from "@/hooks/use-media-query"
import { Button } from "@/components/ui/button"
@@ -47,6 +47,7 @@ import { getALLBasicContractTemplates } from "@/lib/basic-contract/service" import type { BasicContractTemplate } from "@/db/schema"
import { searchItemsForPQ } from "@/lib/items/service"
import { saveNdaAttachments } from "../service"
+import { useRouter } from "next/navigation"
// import { PQContractViewer } from "../pq-contract-viewer" // 더 이상 사용하지 않음
interface RequestPQDialogProps extends React.ComponentPropsWithoutRef<typeof Dialog> {
@@ -76,7 +77,7 @@ export function RequestPQDialog({ vendors, showTrigger = true, onSuccess, ...pro const [isApprovePending, startApproveTransition] = React.useTransition()
const isDesktop = useMediaQuery("(min-width: 640px)")
const { data: session } = useSession()
-
+ const router = useRouter()
const [type, setType] = React.useState<"GENERAL" | "PROJECT" | "NON_INSPECTION" | null>(null)
const [dueDate, setDueDate] = React.useState<string | null>(null)
const [projects, setProjects] = React.useState<Project[]>([])
@@ -337,6 +338,7 @@ export function RequestPQDialog({ vendors, showTrigger = true, onSuccess, ...pro }
toast.success(`총 ${totalContracts}개 기본계약이 모두 생성되었습니다`)
+ router.refresh();
} catch (error) {
console.error('기본계약 처리 중 오류:', error)
diff --git a/lib/vendors/validations.ts b/lib/vendors/validations.ts index ecadd67a..2538e1c8 100644 --- a/lib/vendors/validations.ts +++ b/lib/vendors/validations.ts @@ -121,7 +121,9 @@ export type CreditAgencyType = z.infer<typeof creditAgencyEnum>; export const updateVendorSchema = z.object({ vendorName: z.string().min(1, "업체명은 필수 입력사항입니다"), vendorCode: z.string().optional(), - address: z.string().optional(), + address: z.string().min(1, "주소는 필수 입력사항입니다."), + addressDetail: z.string().optional(), + postalCode: z.string().optional(), country: z.string().optional(), phone: z.string().optional(), email: z.string().email("유효한 이메일 주소를 입력해주세요").optional(), @@ -220,7 +222,15 @@ export const createVendorSchema = z // Other fields remain the same vendorCode: z.string().max(100, "Max length 100").optional(), - address: z.string().optional(), + address: z.string() + .min(1, "주소는 필수입니다.") + .max(500, "주소는 최대 500자까지 입력 가능합니다."), + addressDetail: z.string() + .min(1, "상세주소는 필수입니다.") + .max(500, "상세주소는 최대 500자까지 입력 가능합니다."), + postalCode: z.string() + .min(1, "우편번호는 필수입니다.") + .max(20, "우편번호는 최대 20자까지 입력 가능합니다."), country: z.string() .min(1, "국가 선택은 필수입니다.") .max(100, "Max length 100"), @@ -399,7 +409,9 @@ export type GetRfqHistorySchema = Awaited<ReturnType<typeof searchParamsRfqHisto export const updateVendorInfoSchema = z.object({ vendorName: z.string().min(1, "업체명은 필수 입력사항입니다."), taxId: z.string(), - address: z.string().optional(), + address: z.string().min(1, "주소는 필수 입력사항입니다."), + addressDetail: z.string().optional(), + postalCode: z.string().optional(), country: z.string().min(1, "국가를 선택해 주세요."), phone: z.string().optional(), email: z.string().email("유효한 이메일을 입력해 주세요."), |
