summaryrefslogtreecommitdiff
path: root/lib/site-visit
diff options
context:
space:
mode:
authordujinkim <dujin.kim@dtsolution.co.kr>2025-08-13 11:05:09 +0000
committerdujinkim <dujin.kim@dtsolution.co.kr>2025-08-13 11:05:09 +0000
commit33be47506f0aa62b969d82521580a29e95080268 (patch)
tree6b7e232f2d78ef8775944ea085a36b3ccbce7d95 /lib/site-visit
parent2ac95090157c355ea1bd0b8eb1e1e5e2bd56faf4 (diff)
(대표님) 입찰, 법무검토, EDP 변경사항 대응, dolce 개선, form-data 개선, 정규업체 등록관리 추가
(최겸) pq 미사용 컴포넌트 및 페이지 제거, 파일 라우트에 pq 적용
Diffstat (limited to 'lib/site-visit')
-rw-r--r--lib/site-visit/service.ts42
-rw-r--r--lib/site-visit/site-visit-detail-dialog.tsx2
-rw-r--r--lib/site-visit/vendor-info-sheet.tsx143
-rw-r--r--lib/site-visit/vendor-info-view-dialog.tsx2
4 files changed, 93 insertions, 96 deletions
diff --git a/lib/site-visit/service.ts b/lib/site-visit/service.ts
index b525fabe..8db05ce4 100644
--- a/lib/site-visit/service.ts
+++ b/lib/site-visit/service.ts
@@ -148,7 +148,7 @@ export async function createSiteVisitRequestAction(input: {
const senderResult = await db
.select()
.from(users)
- .where(eq(users.id, siteVisitRequest.requesterId))
+ .where(eq(users.id, siteVisitRequest.requesterId!))
.limit(1);
const sender = senderResult[0];
@@ -160,7 +160,7 @@ export async function createSiteVisitRequestAction(input: {
const deadlineDate = format(new Date(), 'yyyy.MM.dd');
// SHI 참석자 정보 파싱 (새로운 구조에 맞게)
- const shiAttendees = input.shiAttendees as Record<string, { checked: boolean; count: number; details?: string }>;
+ const shiAttendees = input.shiAttendees as any;
// 메일 제목
const subject = `[SHI Audit] 방문실사 시행 안내 및 실사 관련 추가정보 요청 _ ${vendor.vendorName} (${vendor.vendorCode}, 사업자번호: ${vendor.taxId})`;
@@ -176,7 +176,7 @@ export async function createSiteVisitRequestAction(input: {
// 실사 정보
investigationMethod: investigation.investigationMethod,
- investigationMethodDescription: investigation.investigationMethodDescription,
+ // investigationMethodDescription: investigation.investigationMethodDescription,
requestedStartDate: format(siteVisitRequest.requestedStartDate!, 'yyyy.MM.dd'),
requestedEndDate: format(siteVisitRequest.requestedEndDate!, 'yyyy.MM.dd'),
inspectionDuration: siteVisitRequest.inspectionDuration,
@@ -203,22 +203,17 @@ export async function createSiteVisitRequestAction(input: {
}),
shiAttendeeDetails: input.shiAttendeeDetails || null,
- // 협력업체 요청 정보
- vendorRequests: Object.keys(siteVisitRequest.vendorRequests as Record<string, boolean>)
- .filter(key => (siteVisitRequest.vendorRequests as Record<string, boolean>)[key])
- .map(key => {
- const requestLabels = {
- 'factoryName': '○ 실사공장명',
- 'factoryLocation': '○ 실사공장 주소',
- 'factoryDirections': '○ 실사공장 가는 방법',
- 'factoryPicName': '○ 실사공장 Contact Point',
- 'factoryPicPhone': '○ 실사공장 연락처',
- 'factoryPicEmail': '○ 실사공장 이메일',
- 'attendees': '○ 실사 참석 예정인력',
- 'accessProcedure': '○ 공장 출입절차 및 준비물'
- };
- return requestLabels[key as keyof typeof requestLabels] || key;
- }),
+ // 협력업체 요청 정보 (default 값으로 고정)
+ vendorRequests: [
+ ' 실사공장명',
+ ' 실사공장 주소',
+ ' 실사공장 가는 방법',
+ ' 실사공장 Contact Point',
+ ' 실사공장 연락처',
+ ' 실사공장 이메일',
+ ' 실사 참석 예정인력',
+ ' 공장 출입절차 및 준비물'
+ ],
otherVendorRequests: input.otherVendorRequests,
// 추가 요청사항
@@ -233,11 +228,12 @@ export async function createSiteVisitRequestAction(input: {
// 메일 발송 (벤더 이메일로 직접 발송)
await sendEmail({
- to: vendor.email,
+ to: vendor.email || '',
+ cc: sender.email,
subject,
template: 'site-visit-request' as string,
context,
- cc: vendor.email !== sender.email ? sender.email : undefined
+ // cc: vendor.email !== sender.email ? sender.email : undefined
});
console.log('방문실사 요청 메일 발송 완료:', {
@@ -260,6 +256,7 @@ export async function createSiteVisitRequestAction(input: {
}
revalidatePath("/evcp/pq_new");
+ revalidatePath("/partners/site-visit");
return {
success: true,
@@ -513,7 +510,7 @@ export async function getSiteVisitRequestAction(investigationId: number) {
hasAttachments: input.hasAttachments,
otherInfo: input.otherInfo,
- submittedBy: session.user.id,
+ submittedBy: Number(session.user.id),
});
}
@@ -585,6 +582,7 @@ export async function getSiteVisitRequestAction(investigationId: number) {
})
.where(eq(siteVisitRequests.id, input.siteVisitRequestId));
+ revalidatePath("/evcp/pq_new");
revalidatePath("/partners/site-visit");
return {
diff --git a/lib/site-visit/site-visit-detail-dialog.tsx b/lib/site-visit/site-visit-detail-dialog.tsx
index 3043f358..18ab6bb5 100644
--- a/lib/site-visit/site-visit-detail-dialog.tsx
+++ b/lib/site-visit/site-visit-detail-dialog.tsx
@@ -139,7 +139,7 @@ export function SiteVisitDetailDialog({
</div>
<div>
- <h4 className="font-semibold mb-2">공장 PIC 정보</h4>
+ <h4 className="font-semibold mb-2">공장 담당자 정보</h4>
<div className="space-y-2 text-sm">
<div><span className="font-medium">이름:</span> {selectedRequest.vendorInfo.factoryPicName}</div>
<div><span className="font-medium">전화번호:</span> {selectedRequest.vendorInfo.factoryPicPhone}</div>
diff --git a/lib/site-visit/vendor-info-sheet.tsx b/lib/site-visit/vendor-info-sheet.tsx
index c0b1ab7e..f72766fe 100644
--- a/lib/site-visit/vendor-info-sheet.tsx
+++ b/lib/site-visit/vendor-info-sheet.tsx
@@ -36,8 +36,8 @@ const vendorInfoSchema = z.object({
factoryAddress: z.string().min(1, "공장주소를 입력해주세요."),
// 공장 PIC 정보
- factoryPicName: z.string().min(1, "공장 PIC 이름을 입력해주세요."),
- factoryPicPhone: z.string().min(1, "공장 PIC 전화번호를 입력해주세요."),
+ factoryPicName: z.string().min(1, "공장 담당자 이름을 입력해주세요."),
+ factoryPicPhone: z.string().min(1, "공장 담당자 전화번호를 입력해주세요."),
factoryPicEmail: z.string().email("올바른 이메일 주소를 입력해주세요."),
// 공장 가는 법
@@ -166,7 +166,7 @@ export function VendorInfoSheet({
return (
<Sheet open={isOpen} onOpenChange={(open) => !open && onClose()}>
- <SheetContent className="w-[600px] sm:w-[700px] overflow-y-auto">
+ <SheetContent className="w-[800px] sm:max-w-xl max-w-[95vw] overflow-y-auto space-y-2">
<SheetHeader>
<SheetTitle>협력업체 정보 입력</SheetTitle>
<SheetDescription>
@@ -178,9 +178,9 @@ export function VendorInfoSheet({
<form onSubmit={form.handleSubmit(handleSubmit)} className="space-y-6">
{/* 공장 정보 */}
<div className="space-y-4">
- <h3 className="text-lg font-semibold">공장 정보</h3>
+ <h3 className="text-lg font-semibold border-b pb-2">공장 정보</h3>
- <div className="space-y-4">
+ <div className="grid grid-cols-1 md:grid-cols-2 gap-4">
<FormField
control={form.control}
name="factoryName"
@@ -209,32 +209,34 @@ export function VendorInfoSheet({
)}
/>
- <FormField
- control={form.control}
- name="factoryAddress"
- render={({ field }) => (
- <FormItem>
- <FormLabel>공장주소 *</FormLabel>
- <FormControl>
- <Textarea
- placeholder="상세 주소를 입력하세요"
- {...field}
- disabled={isPending}
- className="min-h-[80px]"
- />
- </FormControl>
- <FormMessage />
- </FormItem>
- )}
- />
+ <div className="md:col-span-2">
+ <FormField
+ control={form.control}
+ name="factoryAddress"
+ render={({ field }) => (
+ <FormItem>
+ <FormLabel>공장주소 *</FormLabel>
+ <FormControl>
+ <Textarea
+ placeholder="상세 주소를 입력하세요"
+ {...field}
+ disabled={isPending}
+ className="min-h-[80px]"
+ />
+ </FormControl>
+ <FormMessage />
+ </FormItem>
+ )}
+ />
+ </div>
</div>
</div>
{/* 공장 PIC 정보 */}
<div className="space-y-4">
- <h3 className="text-lg font-semibold">공장 PIC 정보</h3>
+ <h3 className="text-lg font-semibold border-b pb-2">공장 담당자 정보</h3>
- <div className="space-y-4">
+ <div className="grid grid-cols-1 md:grid-cols-3 gap-4">
<FormField
control={form.control}
name="factoryPicName"
@@ -279,59 +281,56 @@ export function VendorInfoSheet({
</div>
</div>
- {/* 공장 가는 법 */}
+ {/* 공장 정보 상세 */}
<div className="space-y-4">
- <h3 className="text-lg font-semibold">공장 가는 법</h3>
+ <h3 className="text-lg font-semibold border-b pb-2">공장 정보 상세</h3>
- <FormField
- control={form.control}
- name="factoryDirections"
- render={({ field }) => (
- <FormItem>
- <FormLabel>공장 가는 법 *</FormLabel>
- <FormControl>
- <Textarea
- placeholder="공항에서 공장까지 가는 방법, 대중교통 정보 등을 상세히 입력하세요"
- {...field}
- disabled={isPending}
- className="min-h-[100px]"
- />
- </FormControl>
- <FormMessage />
- </FormItem>
- )}
- />
- </div>
-
- {/* 공장 출입절차 */}
- <div className="space-y-4">
- <h3 className="text-lg font-semibold">공장 출입절차</h3>
-
- <FormField
- control={form.control}
- name="accessProcedure"
- render={({ field }) => (
- <FormItem>
- <FormLabel>공장 출입절차 *</FormLabel>
- <FormControl>
- <Textarea
- placeholder="신분증 제출, 출입증 교환, 준비물 등 출입 절차를 상세히 입력하세요"
- {...field}
- disabled={isPending}
- className="min-h-[100px]"
- />
- </FormControl>
- <FormMessage />
- </FormItem>
- )}
- />
+ <div className="grid grid-cols-1 md:grid-cols-2 gap-6">
+ <FormField
+ control={form.control}
+ name="factoryDirections"
+ render={({ field }) => (
+ <FormItem>
+ <FormLabel>공장 가는 법 *</FormLabel>
+ <FormControl>
+ <Textarea
+ placeholder="공항에서 공장까지 가는 방법, 대중교통 정보 등을 상세히 입력하세요"
+ {...field}
+ disabled={isPending}
+ className="min-h-[120px]"
+ />
+ </FormControl>
+ <FormMessage />
+ </FormItem>
+ )}
+ />
+
+ <FormField
+ control={form.control}
+ name="accessProcedure"
+ render={({ field }) => (
+ <FormItem>
+ <FormLabel>공장 출입절차 *</FormLabel>
+ <FormControl>
+ <Textarea
+ placeholder="신분증 제출, 출입증 교환, 준비물 등 출입 절차를 상세히 입력하세요"
+ {...field}
+ disabled={isPending}
+ className="min-h-[120px]"
+ />
+ </FormControl>
+ <FormMessage />
+ </FormItem>
+ )}
+ />
+ </div>
</div>
{/* 첨부파일 */}
<div className="space-y-4">
- <h3 className="text-lg font-semibold">첨부파일</h3>
+ <h3 className="text-lg font-semibold border-b pb-2">첨부파일</h3>
{/* 파일 업로드 */}
<div className="space-y-2">
@@ -399,7 +398,7 @@ export function VendorInfoSheet({
{/* 기타 정보 */}
<div className="space-y-4">
- <h3 className="text-lg font-semibold">기타 정보</h3>
+ <h3 className="text-lg font-semibold border-b pb-2">기타 정보</h3>
<FormField
control={form.control}
@@ -412,7 +411,7 @@ export function VendorInfoSheet({
placeholder="추가로 전달하고 싶은 정보가 있다면 입력하세요"
{...field}
disabled={isPending}
- className="min-h-[80px]"
+ className="min-h-[100px]"
/>
</FormControl>
<FormMessage />
diff --git a/lib/site-visit/vendor-info-view-dialog.tsx b/lib/site-visit/vendor-info-view-dialog.tsx
index b9daf83e..b6e8111d 100644
--- a/lib/site-visit/vendor-info-view-dialog.tsx
+++ b/lib/site-visit/vendor-info-view-dialog.tsx
@@ -137,7 +137,7 @@ export function VendorInfoViewDialog({
</div>
<div>
- <h4 className="font-semibold mb-2">공장 PIC 정보</h4>
+ <h4 className="font-semibold mb-2">공장 담당자 정보</h4>
<div className="space-y-2 text-sm">
<div className="flex items-center gap-2">
<User className="h-4 w-4" />