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.ts99
1 files changed, 69 insertions, 30 deletions
diff --git a/lib/evaluation/vendor-submission-service.ts b/lib/evaluation/vendor-submission-service.ts
index c06a9d2a..e7d236ad 100644
--- a/lib/evaluation/vendor-submission-service.ts
+++ b/lib/evaluation/vendor-submission-service.ts
@@ -107,36 +107,44 @@ export interface VendorSubmissionDetail {
export async function getVendorSubmissionDetails(periodicEvaluationId: number): Promise<VendorSubmissionDetail | null> {
try {
// 1. 제출 정보 조회
- const submissionResult = await db
- .select({
- // 제출 기본 정보
- id: evaluationSubmissions.id,
- submissionId: evaluationSubmissions.submissionId,
- evaluationYear: evaluationSubmissions.evaluationYear,
- evaluationRound: evaluationSubmissions.evaluationRound,
- submissionStatus: evaluationSubmissions.submissionStatus,
- submittedAt: evaluationSubmissions.submittedAt,
- reviewedAt: evaluationSubmissions.reviewedAt,
- reviewedBy: evaluationSubmissions.reviewedBy,
- reviewComments: evaluationSubmissions.reviewComments,
- averageEsgScore: evaluationSubmissions.averageEsgScore,
-
- // 진행률 통계
- totalGeneralItems: evaluationSubmissions.totalGeneralItems,
- completedGeneralItems: evaluationSubmissions.completedGeneralItems,
- totalEsgItems: evaluationSubmissions.totalEsgItems,
- completedEsgItems: evaluationSubmissions.completedEsgItems,
-
- // 협력업체 정보
- vendorId: vendors.id,
- companyId: evaluationSubmissions.companyId,
- vendorCode: vendors.vendorCode,
- vendorName: vendors.vendorName,
- vendorEmail: vendors.email,
- vendorCountry: vendors.country,
- })
- .from(evaluationSubmissions)
- .innerJoin(vendors, eq(evaluationSubmissions.companyId, vendors.id))
+ // - 우선 현재 periodicEvaluationId 로 검색
+ // - 없으면 같은 업체/년도/라운드의 다른 division 제출 건을 검색해 표시(조선/해양 동시 제출 지원)
+ const submissionSelect = {
+ // 제출 기본 정보
+ id: evaluationSubmissions.id,
+ submissionId: evaluationSubmissions.submissionId,
+ evaluationYear: evaluationSubmissions.evaluationYear,
+ evaluationRound: evaluationSubmissions.evaluationRound,
+ submissionStatus: evaluationSubmissions.submissionStatus,
+ submittedAt: evaluationSubmissions.submittedAt,
+ reviewedAt: evaluationSubmissions.reviewedAt,
+ reviewedBy: evaluationSubmissions.reviewedBy,
+ reviewComments: evaluationSubmissions.reviewComments,
+ averageEsgScore: evaluationSubmissions.averageEsgScore,
+
+ // 진행률 통계
+ totalGeneralItems: evaluationSubmissions.totalGeneralItems,
+ completedGeneralItems: evaluationSubmissions.completedGeneralItems,
+ totalEsgItems: evaluationSubmissions.totalEsgItems,
+ completedEsgItems: evaluationSubmissions.completedEsgItems,
+
+ // 협력업체 정보
+ vendorId: vendors.id,
+ companyId: evaluationSubmissions.companyId,
+ vendorCode: vendors.vendorCode,
+ vendorName: vendors.vendorName,
+ vendorEmail: vendors.email,
+ vendorCountry: vendors.country,
+ }
+
+ const buildSubmissionQuery = () =>
+ db
+ .select(submissionSelect)
+ .from(evaluationSubmissions)
+ .innerJoin(vendors, eq(evaluationSubmissions.companyId, vendors.id))
+
+ // 1-1. 현재 periodicEvaluationId 로 우선 조회
+ let submissionResult = await buildSubmissionQuery()
.where(
and(
eq(evaluationSubmissions.periodicEvaluationId, periodicEvaluationId),
@@ -145,6 +153,37 @@ export async function getVendorSubmissionDetails(periodicEvaluationId: number):
)
.limit(1)
+ // 1-2. 없으면 같은 업체/년도의 다른 division 제출을 fallback
+ if (submissionResult.length === 0) {
+ const evaluationContext = await db
+ .select({
+ vendorId: evaluationTargets.vendorId,
+ evaluationYear: evaluationTargets.evaluationYear,
+ })
+ .from(periodicEvaluations)
+ .innerJoin(evaluationTargets, eq(periodicEvaluations.evaluationTargetId, evaluationTargets.id))
+ .where(eq(periodicEvaluations.id, periodicEvaluationId))
+ .limit(1)
+
+ const context = evaluationContext[0]
+
+ if (!context || !context.vendorId || !context.evaluationYear) {
+ return null
+ }
+
+ // 같은 업체/년도의 다른 division 제출 찾기 (가장 최근 제출 우선)
+ submissionResult = await buildSubmissionQuery()
+ .where(
+ and(
+ eq(evaluationSubmissions.companyId, context.vendorId),
+ eq(evaluationSubmissions.evaluationYear, context.evaluationYear),
+ eq(evaluationSubmissions.isActive, true)
+ )
+ )
+ .orderBy(desc(evaluationSubmissions.submittedAt), desc(evaluationSubmissions.createdAt))
+ .limit(1)
+ }
+
if (submissionResult.length === 0) {
return null // 제출 내용이 없음
}