summaryrefslogtreecommitdiff
path: root/app/api/basic-contract/status/route.ts
blob: f543accd2006ebe2175bd202a9512f452cc5964d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
// /app/api/basic-contract/status/route.ts

import { NextRequest, NextResponse } from "next/server";
import db from "@/db/db";
import { basicContract, vendors, basicContractTemplates } from "@/db/schema";
import { eq, and, inArray, desc } from "drizzle-orm";
import { differenceInDays } from "date-fns";

/**
 * 계약 요청 상태 확인 API
 */
export async function POST(request: NextRequest) {
  try {
    // 요청 본문 파싱
    const body = await request.json();
    const { vendorIds, templateIds } = body;
    
    // 필수 파라미터 확인
    if (!vendorIds || !templateIds || !Array.isArray(vendorIds) || !Array.isArray(templateIds)) {
      return NextResponse.json(
        { success: false, error: "유효하지 않은 요청 형식입니다." },
        { status: 400 }
      );
    }
    
    // 각 협력업체-템플릿 조합에 대한 최신 계약 요청 상태 확인
    const requests = await db
      .select({
        vendorId: basicContract.vendorId,
        templateId: basicContract.templateId,
        status: basicContract.status,
        createdAt: basicContract.createdAt,
        updatedAt: basicContract.updatedAt,
      })
      .from(basicContract)
      .where(
        and(
          inArray(basicContract.vendorId, vendorIds),
          inArray(basicContract.templateId, templateIds)
        )
      )
      .orderBy(desc(basicContract.createdAt));

    // 협력업체 정보 가져오기
    const vendorData = await db
      .select({
        id: vendors.id,
        vendorName: vendors.vendorName,
      })
      .from(vendors)
      .where(inArray(vendors.id, vendorIds));

    // 템플릿 정보 가져오기
    const templateData = await db
      .select({
        id: basicContractTemplates.id,
        templateName: basicContractTemplates.templateName,
        updatedAt: basicContractTemplates.updatedAt,
      })
      .from(basicContractTemplates)
      .where(inArray(basicContractTemplates.id, templateIds));

    // 데이터 가공 - 협력업체별, 템플릿별로 상태 매핑
    const vendorMap = new Map(vendorData.map(v => [v.id, v]));
    const templateMap = new Map(templateData.map(t => [t.id, t]));
    
    const uniqueRequests = new Map();
    
    // 각 협력업체-템플릿 조합에 대해 가장 최근 요청만 사용
    requests.forEach(req => {
      const key = `${req.vendorId}-${req.templateId}`;
      if (!uniqueRequests.has(key)) {
        uniqueRequests.set(key, req);
      }
    });
    
    // 상태 정보 생성
    const statusData = [];
    
    // 요청 만료 기준 - 30일
    const EXPIRATION_DAYS = 30;
    
    // 모든 협력업체-템플릿 조합에 대해 상태 확인
    vendorIds.forEach(vendorId => {
      templateIds.forEach(templateId => {
        const key = `${vendorId}-${templateId}`;
        const request = uniqueRequests.get(key);
        const vendor = vendorMap.get(vendorId);
        const template = templateMap.get(templateId);
        
        if (!vendor || !template) return;
        
        let status = "NONE"; // 기본 상태: 요청 없음
        let createdAt = new Date();
        let isExpired = false;
        let isUpdated = false;
        
        if (request) {
          status = request.status;
          createdAt = request.createdAt;
          
          // 요청이 오래되었는지 확인 (PENDING 상태일 때만 적용)
          if (status === "PENDING") {
            isExpired = differenceInDays(new Date(), createdAt) > EXPIRATION_DAYS;
          }
          
          // 요청 이후 템플릿이 업데이트되었는지 확인
          if (template.updatedAt && request.createdAt) {
            isUpdated = template.updatedAt > request.createdAt;
          }
        }
        
        statusData.push({
          vendorId,
          vendorName: vendor.vendorName,
          templateId,
          templateName: template.templateName,
          status,
          createdAt,
          isExpired,
          isUpdated,
        });
      });
    });
    
    // 성공 응답 반환
    return NextResponse.json({ success: true, data: statusData });
    
  } catch (error) {
    console.error("계약 상태 확인 중 오류:", error);
    
    // 오류 응답 반환
    return NextResponse.json(
      { 
        success: false, 
        error: "계약 상태 확인 중 오류가 발생했습니다." 
      }, 
      { status: 500 }
    );
  }
}