summaryrefslogtreecommitdiff
path: root/lib/evaluation/vendor-submission-service.ts
diff options
context:
space:
mode:
Diffstat (limited to 'lib/evaluation/vendor-submission-service.ts')
-rw-r--r--lib/evaluation/vendor-submission-service.ts66
1 files changed, 62 insertions, 4 deletions
diff --git a/lib/evaluation/vendor-submission-service.ts b/lib/evaluation/vendor-submission-service.ts
index 388f382a..c06a9d2a 100644
--- a/lib/evaluation/vendor-submission-service.ts
+++ b/lib/evaluation/vendor-submission-service.ts
@@ -129,6 +129,7 @@ export async function getVendorSubmissionDetails(periodicEvaluationId: number):
// 협력업체 정보
vendorId: vendors.id,
+ companyId: evaluationSubmissions.companyId,
vendorCode: vendors.vendorCode,
vendorName: vendors.vendorName,
vendorEmail: vendors.email,
@@ -149,7 +150,7 @@ export async function getVendorSubmissionDetails(periodicEvaluationId: number):
}
const submission = submissionResult[0]
- const submissionId = submission.id // evaluationSubmissions.id (integer)
+ let submissionId = submission.id // evaluationSubmissions.id (integer)
const submissionUuid = submission.submissionId // evaluationSubmissions.submissionId (UUID)
console.log("=== 협력업체 제출 상세 조회 시작 ===")
@@ -157,6 +158,58 @@ export async function getVendorSubmissionDetails(periodicEvaluationId: number):
console.log("submissionUuid:", submissionUuid)
console.log("submission:", submission)
+ // 🔍 조선/해양 동시 제출 케이스 처리: 현재 submission에 응답이 없으면 같은 그룹에서 응답이 있는 submission을 찾아서 사용
+ const hasResponses = await db
+ .select({ count: sql<number>`COUNT(*)::int` })
+ .from(generalEvaluationResponses)
+ .where(
+ and(
+ eq(generalEvaluationResponses.submissionId, submissionId),
+ eq(generalEvaluationResponses.isActive, true)
+ )
+ )
+ .then(result => (result[0]?.count || 0) > 0)
+
+ if (!hasResponses) {
+ console.log("현재 submission에 응답 없음. 같은 그룹에서 응답이 있는 submission 찾기...")
+
+ // 같은 companyId, evaluationYear, evaluationRound를 가진 다른 submission 중 응답이 있는 것을 찾음
+ const siblingSubmissions = await db
+ .select({
+ id: evaluationSubmissions.id,
+ submissionId: evaluationSubmissions.submissionId,
+ })
+ .from(evaluationSubmissions)
+ .where(
+ and(
+ eq(evaluationSubmissions.companyId, submission.companyId),
+ eq(evaluationSubmissions.evaluationYear, submission.evaluationYear),
+ eq(evaluationSubmissions.evaluationRound, submission.evaluationRound || ""),
+ eq(evaluationSubmissions.isActive, true)
+ )
+ )
+
+ // 각 sibling submission에 응답이 있는지 확인
+ for (const sibling of siblingSubmissions) {
+ const siblingHasResponses = await db
+ .select({ count: sql<number>`COUNT(*)::int` })
+ .from(generalEvaluationResponses)
+ .where(
+ and(
+ eq(generalEvaluationResponses.submissionId, sibling.id),
+ eq(generalEvaluationResponses.isActive, true)
+ )
+ )
+ .then(result => (result[0]?.count || 0) > 0)
+
+ if (siblingHasResponses) {
+ console.log(`응답이 있는 submission 발견: ${sibling.id}`)
+ submissionId = sibling.id
+ break
+ }
+ }
+ }
+
// 2. 일반평가 항목과 응답 조회
const generalEvaluationsResult = await db
.select({
@@ -281,7 +334,7 @@ export async function getVendorSubmissionDetails(periodicEvaluationId: number):
fileSize: row.fileSize,
mimeType: row.mimeType,
uploadedBy: row.uploadedBy,
- createdAt: new Date(row.attachmentCreatedAt)
+ createdAt: row.attachmentCreatedAt ? new Date(row.attachmentCreatedAt) : new Date()
})
}
})
@@ -324,10 +377,10 @@ export async function getVendorSubmissionDetails(periodicEvaluationId: number):
// 5. 첨부파일 통계 계산
const allAttachments = generalEvaluationsResult
- .filter(row => row.attachmentId)
+ .filter(row => row.attachmentId && row.fileSize !== null)
.map(row => ({
id: row.attachmentId,
- fileSize: row.fileSize
+ fileSize: row.fileSize || 0
}))
const attachmentStats = {
@@ -348,6 +401,11 @@ export async function getVendorSubmissionDetails(periodicEvaluationId: number):
reviewComments: submission.reviewComments,
averageEsgScore: submission.averageEsgScore ? Number(submission.averageEsgScore) : null,
+ // 진행률 통계
+ totalGeneralItems: submission.totalGeneralItems,
+ completedGeneralItems: submission.completedGeneralItems,
+ totalEsgItems: submission.totalEsgItems,
+ completedEsgItems: submission.completedEsgItems,
vendor: {
id: submission.vendorId,