summaryrefslogtreecommitdiff
path: root/lib/compliance/red-flag-notifier.ts
diff options
context:
space:
mode:
author0-Zz-ang <s1998319@gmail.com>2025-11-20 17:39:10 +0900
committer0-Zz-ang <s1998319@gmail.com>2025-11-20 17:39:10 +0900
commitf95fbb0719c5754360472d066b0bbed4bda6a40a (patch)
treed58b69d97c1dc300ccba8174d27c3a2023d34af6 /lib/compliance/red-flag-notifier.ts
parent088431a6572d87f7ee287252a4357e6c332d04f7 (diff)
(박서영)준법설문조사 redFlag관련사항수정
Diffstat (limited to 'lib/compliance/red-flag-notifier.ts')
-rw-r--r--lib/compliance/red-flag-notifier.ts55
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,
+ });
}