diff options
| author | 0-Zz-ang <s1998319@gmail.com> | 2025-11-20 17:39:10 +0900 |
|---|---|---|
| committer | 0-Zz-ang <s1998319@gmail.com> | 2025-11-20 17:39:10 +0900 |
| commit | f95fbb0719c5754360472d066b0bbed4bda6a40a (patch) | |
| tree | d58b69d97c1dc300ccba8174d27c3a2023d34af6 /lib/compliance/red-flag-notifier.ts | |
| parent | 088431a6572d87f7ee287252a4357e6c332d04f7 (diff) | |
(박서영)준법설문조사 redFlag관련사항수정
Diffstat (limited to 'lib/compliance/red-flag-notifier.ts')
| -rw-r--r-- | lib/compliance/red-flag-notifier.ts | 55 |
1 files changed, 31 insertions, 24 deletions
diff --git a/lib/compliance/red-flag-notifier.ts b/lib/compliance/red-flag-notifier.ts index ad55de54..27ca2a03 100644 --- a/lib/compliance/red-flag-notifier.ts +++ b/lib/compliance/red-flag-notifier.ts @@ -9,6 +9,7 @@ import { } from '@/db/schema'; import { and, desc, eq } from 'drizzle-orm'; import { sendEmail } from '@/lib/mail/sendEmail'; +import { getComplianceResponseByBasicContractId } from '@/lib/compliance/services'; export type TriggeredRedFlagInfo = { questionId: number; @@ -65,8 +66,6 @@ export async function notifyComplianceRedFlagManagers(params: { return; } - const recipientEmails = new Set<string>(); - const managerRow = await db .select({ purchasingManagerId: redFlagManagers.purchasingManagerId, @@ -95,14 +94,6 @@ export async function notifyComplianceRedFlagManagers(params: { fetchUserEmail(managerIds?.complianceManagerId), ]); - if (purchasingEmail) { - recipientEmails.add(purchasingEmail); - } - - if (complianceEmail) { - recipientEmails.add(complianceEmail); - } - const contractOwner = await db .select({ requestedBy: basicContract.requestedBy, @@ -114,29 +105,45 @@ export async function notifyComplianceRedFlagManagers(params: { .limit(1); const ownerRecord = contractOwner[0]; - if (ownerRecord?.requestedByEmail) { - recipientEmails.add(ownerRecord.requestedByEmail); - } + const contractRequestorEmail = ownerRecord?.requestedByEmail; - if (recipientEmails.size === 0) { + // 구매 담당자가 없으면 발송하지 않음 + if (!purchasingEmail) { return; } + // 준법설문 응답 정보 조회하여 링크 생성 + const complianceResponse = await getComplianceResponseByBasicContractId(params.contractId); + let responseLink: string | null = null; + + if (complianceResponse && complianceResponse.templateId && complianceResponse.id) { + const baseUrl = process.env.NEXT_PUBLIC_APP_URL || process.env.NEXT_PUBLIC_BASE_URL || ''; + responseLink = `${baseUrl}/ko/evcp/compliance/${complianceResponse.templateId}/responses/${complianceResponse.id}`; + } + const context = { contractId: params.contractId, templateId: params.templateId ?? null, vendorName: params.vendorName ?? '협력업체', triggeredCount: params.triggeredQuestions.length, + responseLink: responseLink, }; - await Promise.all( - Array.from(recipientEmails).map((email) => - sendEmail({ - to: email, - subject: '[eVCP] 컴플라이언스 레드플래그 알림', - template: 'compliance-red-flag-alert', - context, - }), - ), - ); + // CC 이메일 배열 구성 + const ccEmails: string[] = []; + if (complianceEmail) { + ccEmails.push(complianceEmail); + } + if (contractRequestorEmail) { + ccEmails.push(contractRequestorEmail); + } + + // 구매 담당자에게 To로, 준법 담당자와 계약 요청자는 CC로 발송 + await sendEmail({ + to: purchasingEmail, + cc: ccEmails.length > 0 ? ccEmails : undefined, + subject: '[eVCP] 컴플라이언스 레드플래그 알림', + template: 'compliance-red-flag-alert', + context, + }); } |
