summaryrefslogtreecommitdiff
path: root/lib/site-visit/service.ts
diff options
context:
space:
mode:
Diffstat (limited to 'lib/site-visit/service.ts')
-rw-r--r--lib/site-visit/service.ts131
1 files changed, 131 insertions, 0 deletions
diff --git a/lib/site-visit/service.ts b/lib/site-visit/service.ts
index d5e4a59b..1dc07c77 100644
--- a/lib/site-visit/service.ts
+++ b/lib/site-visit/service.ts
@@ -18,6 +18,137 @@ import { users } from "@/db/schema"
+// 실사 ID로 모든 siteVisitRequests 조회 (복수 확정정보 지원)
+export async function getAllSiteVisitRequestsForInvestigationAction(investigationId: number) {
+ try {
+ const confirmations = await db
+ .select({
+ id: siteVisitRequests.id,
+ status: siteVisitRequests.status,
+ inspectionDuration: siteVisitRequests.inspectionDuration,
+ requestedStartDate: siteVisitRequests.requestedStartDate,
+ requestedEndDate: siteVisitRequests.requestedEndDate,
+ additionalRequests: siteVisitRequests.additionalRequests,
+ createdAt: siteVisitRequests.createdAt,
+ updatedAt: siteVisitRequests.updatedAt,
+ })
+ .from(siteVisitRequests)
+ .where(eq(siteVisitRequests.investigationId, investigationId))
+ .orderBy(desc(siteVisitRequests.createdAt))
+
+ return { success: true, confirmations }
+ } catch (error) {
+ console.error("실사 확정정보 조회 오류:", error)
+ return { success: false, error: "실사 확정정보 조회에 실패했습니다." }
+ }
+}
+
+// 재방문 실사 요청을 위한 방문실사 생성 (동일 investigationId에 대해 여러 개 허용)
+export async function createReinspectionSiteVisitAction(input: {
+ investigationId: number;
+ inspectionDuration: number;
+ requestedStartDate: Date;
+ requestedEndDate: Date;
+ shiAttendees: Record<string, string>; // {userId: name}
+ vendorRequests: Record<string, boolean>;
+ additionalRequests?: string;
+ investigationAddress: string;
+}) {
+ try {
+ const session = await getServerSession(authOptions);
+ if (!session?.user?.id) {
+ throw new Error("Unauthorized");
+ }
+
+ // 실사 정보 확인
+ const investigation = await db
+ .select()
+ .from(vendorInvestigations)
+ .where(eq(vendorInvestigations.id, input.investigationId))
+ .limit(1);
+
+ if (!investigation.length) {
+ return {
+ success: false,
+ error: "실사 정보를 찾을 수 없습니다."
+ };
+ }
+
+ // PQ 정보 확인
+ const pqSubmission = await db
+ .select()
+ .from(vendorPQSubmissions)
+ .where(eq(vendorPQSubmissions.id, investigation[0].pqSubmissionId!))
+ .limit(1);
+
+ if (!pqSubmission.length) {
+ return {
+ success: false,
+ error: "PQ 정보를 찾을 수 없습니다."
+ };
+ }
+
+ // 방문실사 요청 생성 (재실사이므로 기존 확인 로직 생략)
+ const [newRequest] = await db
+ .insert(siteVisitRequests)
+ .values({
+ investigationId: input.investigationId,
+ inspectionDuration: input.inspectionDuration,
+ requestedStartDate: input.requestedStartDate,
+ requestedEndDate: input.requestedEndDate,
+ shiAttendees: input.shiAttendees,
+ vendorRequests: input.vendorRequests,
+ additionalRequests: input.additionalRequests,
+ status: "REQUESTED",
+ createdAt: new Date(),
+ updatedAt: new Date(),
+ })
+ .returning();
+
+ // 벤더에게 이메일 발송
+ const vendor = await db
+ .select({ email: vendors.email, vendorName: vendors.vendorName })
+ .from(vendors)
+ .where(eq(vendors.id, investigation[0].vendorId))
+ .limit(1);
+
+ if (vendor.length && vendor[0].email) {
+ const headersList = await import("next/headers").then(m => m.headers());
+ const host = headersList.get('host') || 'localhost:3000';
+ const portalUrl = process.env.NEXTAUTH_URL || `http://${host}`;
+
+ await sendEmail({
+ to: vendor[0].email,
+ subject: `[eVCP] 재실사 방문요청 - ${vendor[0].vendorName}`,
+ template: "site-visit-request",
+ context: {
+ vendorName: vendor[0].vendorName,
+ inspectionDuration: input.inspectionDuration,
+ requestedStartDate: format(input.requestedStartDate, "yyyy년 MM월 dd일"),
+ requestedEndDate: format(input.requestedEndDate, "yyyy년 MM월 dd일"),
+ investigationAddress: input.investigationAddress,
+ additionalRequests: input.additionalRequests || "",
+ reviewUrl: `${portalUrl}/evcp/vendor-investigation`,
+ year: new Date().getFullYear(),
+ }
+ });
+ }
+
+ revalidatePath("/evcp/vendor-investigation");
+
+ return {
+ success: true,
+ siteVisitRequestId: newRequest.id
+ };
+ } catch (error) {
+ console.error("재실사 방문요청 생성 실패:", error);
+ return {
+ success: false,
+ error: error instanceof Error ? error.message : "알 수 없는 오류"
+ };
+ }
+}
+
// 방문실사 요청 서버 액션
export async function createSiteVisitRequestAction(input: {
investigationId: number;